From dd3484bb44163c2ad5324b3dab7020a97088ae9e Mon Sep 17 00:00:00 2001 From: archive Date: Thu, 27 Sep 2007 00:00:00 +0000 Subject: [PATCH] as released 2007-09-27 --- Readme Painkeep Arena Source Info.txt | 107 + quake3/Readme PainKeep Arena 3_1.txt | 62 + quake3/Readme Painkeep Arena Source Info.txt | 107 + quake3/bin_nt/lcc.exe | Bin 0 -> 135223 bytes quake3/bin_nt/q3asm.exe | Bin 0 -> 69632 bytes quake3/bin_nt/q3cpp.exe | Bin 0 -> 159801 bytes quake3/bin_nt/q3rcc.exe | Bin 0 -> 847929 bytes quake3/source/QIIIA Game Source License.doc | Bin 0 -> 34304 bytes quake3/source/code/Debug_TA/qagamex86.dll | Bin 0 -> 553984 bytes quake3/source/code/cgame/Debug_TA/bg_lib.obj | Bin 0 -> 3424 bytes quake3/source/code/cgame/Debug_TA/bg_lib.sbr | Bin 0 -> 31318 bytes quake3/source/code/cgame/Debug_TA/bg_misc.obj | Bin 0 -> 32248 bytes quake3/source/code/cgame/Debug_TA/bg_misc.sbr | Bin 0 -> 49550 bytes .../source/code/cgame/Debug_TA/bg_pmove.obj | Bin 0 -> 29270 bytes .../source/code/cgame/Debug_TA/bg_pmove.sbr | Bin 0 -> 57091 bytes .../code/cgame/Debug_TA/bg_slidemove.obj | Bin 0 -> 6176 bytes .../code/cgame/Debug_TA/bg_slidemove.sbr | Bin 0 -> 47459 bytes .../code/cgame/Debug_TA/cg_consolecmds.obj | Bin 0 -> 10768 bytes .../code/cgame/Debug_TA/cg_consolecmds.sbr | Bin 0 -> 86436 bytes quake3/source/code/cgame/Debug_TA/cg_draw.obj | Bin 0 -> 26184 bytes quake3/source/code/cgame/Debug_TA/cg_draw.sbr | Bin 0 -> 102210 bytes .../code/cgame/Debug_TA/cg_drawtools.obj | Bin 0 -> 10297 bytes .../code/cgame/Debug_TA/cg_drawtools.sbr | Bin 0 -> 74239 bytes .../source/code/cgame/Debug_TA/cg_effects.obj | Bin 0 -> 28232 bytes .../source/code/cgame/Debug_TA/cg_effects.sbr | Bin 0 -> 79548 bytes quake3/source/code/cgame/Debug_TA/cg_ents.obj | Bin 0 -> 44115 bytes .../source/code/cgame/Debug_TA/cg_event.obj | Bin 0 -> 52862 bytes .../source/code/cgame/Debug_TA/cg_event.sbr | Bin 0 -> 80037 bytes quake3/source/code/cgame/Debug_TA/cg_info.obj | Bin 0 -> 6756 bytes quake3/source/code/cgame/Debug_TA/cg_info.sbr | Bin 0 -> 70359 bytes .../code/cgame/Debug_TA/cg_localents.obj | Bin 0 -> 10323 bytes .../code/cgame/Debug_TA/cg_localents.sbr | Bin 0 -> 72909 bytes quake3/source/code/cgame/Debug_TA/cg_main.obj | Bin 0 -> 77768 bytes quake3/source/code/cgame/Debug_TA/cg_main.sbr | Bin 0 -> 101107 bytes .../source/code/cgame/Debug_TA/cg_marks.obj | Bin 0 -> 40397 bytes .../source/code/cgame/Debug_TA/cg_marks.sbr | Bin 0 -> 89233 bytes .../source/code/cgame/Debug_TA/cg_newDraw.obj | Bin 0 -> 42249 bytes .../source/code/cgame/Debug_TA/cg_newDraw.sbr | Bin 0 -> 104318 bytes .../source/code/cgame/Debug_TA/cg_players.obj | Bin 0 -> 34570 bytes .../source/code/cgame/Debug_TA/cg_players.sbr | Bin 0 -> 84193 bytes .../code/cgame/Debug_TA/cg_playerstate.obj | Bin 0 -> 7337 bytes .../code/cgame/Debug_TA/cg_playerstate.sbr | Bin 0 -> 71703 bytes .../source/code/cgame/Debug_TA/cg_predict.obj | Bin 0 -> 9198 bytes .../source/code/cgame/Debug_TA/cg_predict.sbr | Bin 0 -> 72205 bytes .../code/cgame/Debug_TA/cg_scoreboard.obj | Bin 0 -> 8194 bytes .../code/cgame/Debug_TA/cg_scoreboard.sbr | Bin 0 -> 72499 bytes .../code/cgame/Debug_TA/cg_servercmds.obj | Bin 0 -> 21065 bytes .../code/cgame/Debug_TA/cg_servercmds.sbr | Bin 0 -> 84289 bytes .../code/cgame/Debug_TA/cg_snapshot.obj | Bin 0 -> 4804 bytes .../code/cgame/Debug_TA/cg_snapshot.sbr | Bin 0 -> 70024 bytes .../code/cgame/Debug_TA/cg_syscalls.obj | Bin 0 -> 7669 bytes .../code/cgame/Debug_TA/cg_syscalls.sbr | Bin 0 -> 76294 bytes quake3/source/code/cgame/Debug_TA/cg_view.obj | Bin 0 -> 15732 bytes quake3/source/code/cgame/Debug_TA/cg_view.sbr | Bin 0 -> 73571 bytes .../source/code/cgame/Debug_TA/cg_weapons.obj | Bin 0 -> 45848 bytes .../source/code/cgame/Debug_TA/cg_weapons.sbr | Bin 0 -> 88904 bytes quake3/source/code/cgame/Debug_TA/cgame.pch | Bin 0 -> 518320 bytes quake3/source/code/cgame/Debug_TA/q_math.obj | Bin 0 -> 14848 bytes quake3/source/code/cgame/Debug_TA/q_math.sbr | Bin 0 -> 36336 bytes .../source/code/cgame/Debug_TA/q_shared.obj | Bin 0 -> 11830 bytes .../source/code/cgame/Debug_TA/q_shared.sbr | Bin 0 -> 35897 bytes .../source/code/cgame/Debug_TA/ui_shared.obj | Bin 0 -> 88598 bytes .../source/code/cgame/Debug_TA/ui_shared.sbr | Bin 0 -> 97423 bytes quake3/source/code/cgame/Debug_TA/vc50.idb | Bin 0 -> 66560 bytes quake3/source/code/cgame/cg_consolecmds.c | 611 + quake3/source/code/cgame/cg_draw.c | 2872 +++ quake3/source/code/cgame/cg_drawtools.c | 944 + quake3/source/code/cgame/cg_effects.c | 1401 + quake3/source/code/cgame/cg_ents.c | 3508 +++ quake3/source/code/cgame/cg_event.c | 2723 ++ quake3/source/code/cgame/cg_info.c | 315 + quake3/source/code/cgame/cg_local.h | 2194 ++ quake3/source/code/cgame/cg_localents.c | 932 + quake3/source/code/cgame/cg_main.c | 2545 ++ quake3/source/code/cgame/cg_marks.c | 2381 ++ quake3/source/code/cgame/cg_newdraw.c | 2236 ++ quake3/source/code/cgame/cg_particles.c | 1997 ++ quake3/source/code/cgame/cg_players.c | 2772 ++ quake3/source/code/cgame/cg_playerstate.c | 556 + quake3/source/code/cgame/cg_predict.c | 643 + quake3/source/code/cgame/cg_public.h | 218 + quake3/source/code/cgame/cg_scoreboard.c | 531 + quake3/source/code/cgame/cg_servercmds.c | 1200 + quake3/source/code/cgame/cg_snapshot.c | 402 + quake3/source/code/cgame/cg_syscalls.asm | 106 + quake3/source/code/cgame/cg_syscalls.c | 426 + quake3/source/code/cgame/cg_view.c | 863 + quake3/source/code/cgame/cg_weapons.c | 3472 +++ quake3/source/code/cgame/cgame.bat | 68 + quake3/source/code/cgame/cgame.def | 3 + quake3/source/code/cgame/cgame.dsp | 344 + quake3/source/code/cgame/cgame.plg | 16 + quake3/source/code/cgame/cgame.q3asm | 28 + quake3/source/code/cgame/cgame_ta.bat | 65 + quake3/source/code/cgame/cgame_ta.q3asm | 28 + quake3/source/code/cgame/tr_types.h | 209 + quake3/source/code/game/Debug_TA/ai_chat.obj | Bin 0 -> 31585 bytes quake3/source/code/game/Debug_TA/ai_chat.sbr | Bin 0 -> 113503 bytes quake3/source/code/game/Debug_TA/ai_cmd.obj | Bin 0 -> 31694 bytes quake3/source/code/game/Debug_TA/ai_cmd.sbr | Bin 0 -> 125520 bytes quake3/source/code/game/Debug_TA/ai_dmnet.obj | Bin 0 -> 45172 bytes quake3/source/code/game/Debug_TA/ai_dmnet.sbr | Bin 0 -> 128760 bytes quake3/source/code/game/Debug_TA/ai_dmq3.obj | Bin 0 -> 71479 bytes quake3/source/code/game/Debug_TA/ai_dmq3.sbr | Bin 0 -> 146994 bytes quake3/source/code/game/Debug_TA/ai_main.obj | Bin 0 -> 34770 bytes quake3/source/code/game/Debug_TA/ai_main.sbr | Bin 0 -> 114278 bytes quake3/source/code/game/Debug_TA/ai_team.obj | Bin 0 -> 21355 bytes quake3/source/code/game/Debug_TA/ai_team.sbr | Bin 0 -> 113752 bytes quake3/source/code/game/Debug_TA/ai_vcmd.obj | Bin 0 -> 8056 bytes quake3/source/code/game/Debug_TA/ai_vcmd.sbr | Bin 0 -> 115842 bytes quake3/source/code/game/Debug_TA/bg_misc.obj | Bin 0 -> 32248 bytes quake3/source/code/game/Debug_TA/bg_misc.sbr | Bin 0 -> 49549 bytes quake3/source/code/game/Debug_TA/bg_pmove.obj | Bin 0 -> 28818 bytes quake3/source/code/game/Debug_TA/bg_pmove.sbr | Bin 0 -> 57048 bytes .../code/game/Debug_TA/bg_slidemove.obj | Bin 0 -> 6176 bytes .../code/game/Debug_TA/bg_slidemove.sbr | Bin 0 -> 47458 bytes quake3/source/code/game/Debug_TA/g_active.obj | Bin 0 -> 13035 bytes quake3/source/code/game/Debug_TA/g_active.sbr | Bin 0 -> 74704 bytes quake3/source/code/game/Debug_TA/g_arenas.obj | Bin 0 -> 7604 bytes quake3/source/code/game/Debug_TA/g_arenas.sbr | Bin 0 -> 72218 bytes quake3/source/code/game/Debug_TA/g_bot.obj | Bin 0 -> 24235 bytes quake3/source/code/game/Debug_TA/g_bot.sbr | Bin 0 -> 77260 bytes quake3/source/code/game/Debug_TA/g_client.obj | Bin 0 -> 24651 bytes quake3/source/code/game/Debug_TA/g_client.sbr | Bin 0 -> 80563 bytes quake3/source/code/game/Debug_TA/g_cmds.obj | Bin 0 -> 35597 bytes quake3/source/code/game/Debug_TA/g_cmds.sbr | Bin 0 -> 88683 bytes quake3/source/code/game/Debug_TA/g_combat.obj | Bin 0 -> 17253 bytes quake3/source/code/game/Debug_TA/g_combat.sbr | Bin 0 -> 76479 bytes quake3/source/code/game/Debug_TA/g_items.obj | Bin 0 -> 25259 bytes quake3/source/code/game/Debug_TA/g_items.sbr | Bin 0 -> 79294 bytes quake3/source/code/game/Debug_TA/g_main.obj | Bin 0 -> 34739 bytes quake3/source/code/game/Debug_TA/g_main.sbr | Bin 0 -> 80454 bytes quake3/source/code/game/Debug_TA/g_mem.obj | Bin 0 -> 1165 bytes quake3/source/code/game/Debug_TA/g_mem.sbr | Bin 0 -> 69152 bytes quake3/source/code/game/Debug_TA/g_misc.obj | Bin 0 -> 7166 bytes quake3/source/code/game/Debug_TA/g_misc.sbr | Bin 0 -> 71808 bytes .../source/code/game/Debug_TA/g_missile.obj | Bin 0 -> 45106 bytes .../source/code/game/Debug_TA/g_missile.sbr | Bin 0 -> 92788 bytes quake3/source/code/game/Debug_TA/g_mover.obj | Bin 0 -> 25815 bytes quake3/source/code/game/Debug_TA/g_mover.sbr | Bin 0 -> 81907 bytes .../source/code/game/Debug_TA/g_session.obj | Bin 0 -> 2579 bytes .../source/code/game/Debug_TA/g_session.sbr | Bin 0 -> 69924 bytes quake3/source/code/game/Debug_TA/g_spawn.obj | Bin 0 -> 15272 bytes quake3/source/code/game/Debug_TA/g_spawn.sbr | Bin 0 -> 74515 bytes quake3/source/code/game/Debug_TA/g_svcmds.obj | Bin 0 -> 8770 bytes quake3/source/code/game/Debug_TA/g_svcmds.sbr | Bin 0 -> 71556 bytes .../source/code/game/Debug_TA/g_syscalls.obj | Bin 0 -> 15066 bytes .../source/code/game/Debug_TA/g_syscalls.sbr | Bin 0 -> 84809 bytes quake3/source/code/game/Debug_TA/g_target.obj | Bin 0 -> 8541 bytes quake3/source/code/game/Debug_TA/g_target.sbr | Bin 0 -> 72804 bytes quake3/source/code/game/Debug_TA/g_team.obj | Bin 0 -> 15086 bytes quake3/source/code/game/Debug_TA/g_team.sbr | Bin 0 -> 76841 bytes .../source/code/game/Debug_TA/g_trigger.obj | Bin 0 -> 18438 bytes .../source/code/game/Debug_TA/g_trigger.sbr | Bin 0 -> 75883 bytes quake3/source/code/game/Debug_TA/g_utils.obj | Bin 0 -> 9199 bytes quake3/source/code/game/Debug_TA/g_utils.sbr | Bin 0 -> 73369 bytes quake3/source/code/game/Debug_TA/g_weapon.obj | Bin 0 -> 25321 bytes quake3/source/code/game/Debug_TA/g_weapon.sbr | Bin 0 -> 82380 bytes quake3/source/code/game/Debug_TA/game.bsc | Bin 0 -> 1680384 bytes quake3/source/code/game/Debug_TA/game.pch | Bin 0 -> 466244 bytes quake3/source/code/game/Debug_TA/q_math.obj | Bin 0 -> 14848 bytes quake3/source/code/game/Debug_TA/q_math.sbr | 0 quake3/source/code/game/Debug_TA/q_shared.obj | Bin 0 -> 11830 bytes quake3/source/code/game/Debug_TA/q_shared.sbr | 0 .../source/code/game/Debug_TA/qagamex86.exp | Bin 0 -> 410 bytes .../source/code/game/Debug_TA/qagamex86.lib | Bin 0 -> 2612 bytes .../source/code/game/Debug_TA/qagamex86.map | 2862 +++ .../source/code/game/Debug_TA/qagamex86.pdb | Bin 0 -> 680960 bytes quake3/source/code/game/Debug_TA/vc50.idb | Bin 0 -> 82944 bytes quake3/source/code/game/ai_chat.c | 1391 + quake3/source/code/game/ai_chat.h | 41 + quake3/source/code/game/ai_cmd.c | 2085 ++ quake3/source/code/game/ai_cmd.h | 17 + quake3/source/code/game/ai_dmnet.c | 2586 ++ quake3/source/code/game/ai_dmnet.h | 41 + quake3/source/code/game/ai_dmq3.c | 5799 +++++ quake3/source/code/game/ai_dmq3.h | 197 + quake3/source/code/game/ai_main.c | 1703 ++ quake3/source/code/game/ai_main.h | 310 + quake3/source/code/game/ai_team.c | 2071 ++ quake3/source/code/game/ai_team.h | 19 + quake3/source/code/game/ai_vcmd.c | 530 + quake3/source/code/game/ai_vcmd.h | 16 + quake3/source/code/game/be_aas.h | 201 + quake3/source/code/game/be_ai_char.h | 28 + quake3/source/code/game/be_ai_chat.h | 93 + quake3/source/code/game/be_ai_gen.h | 13 + quake3/source/code/game/be_ai_goal.h | 98 + quake3/source/code/game/be_ai_move.h | 122 + quake3/source/code/game/be_ai_weap.h | 84 + quake3/source/code/game/be_ea.h | 46 + quake3/source/code/game/bg_lib.c | 1327 + quake3/source/code/game/bg_lib.h | 70 + quake3/source/code/game/bg_local.h | 63 + quake3/source/code/game/bg_misc.c | 2052 ++ quake3/source/code/game/bg_pmove.c | 2354 ++ quake3/source/code/game/bg_public.h | 1102 + quake3/source/code/game/bg_slidemove.c | 305 + quake3/source/code/game/botlib.h | 496 + quake3/source/code/game/chars.h | 135 + quake3/source/code/game/g_active.c | 1272 + quake3/source/code/game/g_arenas.c | 380 + quake3/source/code/game/g_bot.c | 1329 + quake3/source/code/game/g_client.c | 2008 ++ quake3/source/code/game/g_cmds.c | 1953 ++ quake3/source/code/game/g_combat.c | 1663 ++ quake3/source/code/game/g_items.c | 2037 ++ quake3/source/code/game/g_local.h | 1151 + quake3/source/code/game/g_main.c | 2050 ++ quake3/source/code/game/g_mem.c | 41 + quake3/source/code/game/g_misc.c | 640 + quake3/source/code/game/g_missile.c | 5034 ++++ quake3/source/code/game/g_mover.c | 1988 ++ quake3/source/code/game/g_public.h | 407 + quake3/source/code/game/g_rankings.c | 1114 + quake3/source/code/game/g_rankings.h | 375 + quake3/source/code/game/g_session.c | 217 + quake3/source/code/game/g_spawn.c | 697 + quake3/source/code/game/g_svcmds.c | 519 + quake3/source/code/game/g_syscalls.asm | 225 + quake3/source/code/game/g_syscalls.c | 771 + quake3/source/code/game/g_target.c | 534 + quake3/source/code/game/g_team.c | 1474 ++ quake3/source/code/game/g_team.h | 69 + quake3/source/code/game/g_trigger.c | 1275 + quake3/source/code/game/g_utils.c | 654 + quake3/source/code/game/g_weapon.c | 2622 ++ quake3/source/code/game/game.bat | 88 + quake3/source/code/game/game.def | 3 + quake3/source/code/game/game.dsp | 1210 + quake3/source/code/game/game.plg | 16 + quake3/source/code/game/game.q3asm | 35 + quake3/source/code/game/game_ta.bat | 86 + quake3/source/code/game/game_ta.q3asm | 35 + quake3/source/code/game/inv.h | 233 + quake3/source/code/game/match.h | 122 + quake3/source/code/game/q_math.c | 1308 + quake3/source/code/game/q_shared.c | 1238 + quake3/source/code/game/q_shared.h | 1428 ++ quake3/source/code/game/surfaceflags.h | 60 + quake3/source/code/game/syn.h | 22 + quake3/source/code/q3_ui/keycodes.h | 143 + quake3/source/code/q3_ui/q3_ui.bat | 100 + quake3/source/code/q3_ui/q3_ui.dsp | 1055 + quake3/source/code/q3_ui/q3_ui.q3asm | 43 + quake3/source/code/q3_ui/ui.def | 3 + quake3/source/code/q3_ui/ui.q3asm | 45 + quake3/source/code/q3_ui/ui_addbots.c | 392 + quake3/source/code/q3_ui/ui_atoms.c | 1247 + quake3/source/code/q3_ui/ui_cdkey.c | 271 + quake3/source/code/q3_ui/ui_cinematics.c | 330 + quake3/source/code/q3_ui/ui_confirm.c | 273 + quake3/source/code/q3_ui/ui_connect.c | 262 + quake3/source/code/q3_ui/ui_controls2.c | 1647 ++ quake3/source/code/q3_ui/ui_credits.c | 109 + quake3/source/code/q3_ui/ui_demo2.c | 271 + quake3/source/code/q3_ui/ui_display.c | 245 + quake3/source/code/q3_ui/ui_gameinfo.c | 800 + quake3/source/code/q3_ui/ui_ingame.c | 329 + quake3/source/code/q3_ui/ui_loadconfig.c | 254 + quake3/source/code/q3_ui/ui_local.h | 780 + quake3/source/code/q3_ui/ui_login.c | 188 + quake3/source/code/q3_ui/ui_main.c | 229 + quake3/source/code/q3_ui/ui_menu.c | 399 + quake3/source/code/q3_ui/ui_mfield.c | 419 + quake3/source/code/q3_ui/ui_mods.c | 263 + quake3/source/code/q3_ui/ui_network.c | 261 + quake3/source/code/q3_ui/ui_options.c | 208 + quake3/source/code/q3_ui/ui_playermodel.c | 711 + quake3/source/code/q3_ui/ui_players.c | 1228 + quake3/source/code/q3_ui/ui_playersettings.c | 493 + quake3/source/code/q3_ui/ui_preferences.c | 399 + quake3/source/code/q3_ui/ui_qmenu.c | 1726 ++ quake3/source/code/q3_ui/ui_rankings.c | 400 + quake3/source/code/q3_ui/ui_rankstatus.c | 189 + quake3/source/code/q3_ui/ui_removebots.c | 322 + quake3/source/code/q3_ui/ui_saveconfig.c | 192 + quake3/source/code/q3_ui/ui_serverinfo.c | 252 + quake3/source/code/q3_ui/ui_servers2.c | 1620 ++ quake3/source/code/q3_ui/ui_setup.c | 307 + quake3/source/code/q3_ui/ui_signup.c | 266 + quake3/source/code/q3_ui/ui_sound.c | 296 + quake3/source/code/q3_ui/ui_sparena.c | 30 + quake3/source/code/q3_ui/ui_specifyleague.c | 313 + quake3/source/code/q3_ui/ui_specifyserver.c | 193 + quake3/source/code/q3_ui/ui_splevel.c | 988 + quake3/source/code/q3_ui/ui_sppostgame.c | 624 + quake3/source/code/q3_ui/ui_spreset.c | 173 + quake3/source/code/q3_ui/ui_spskill.c | 309 + quake3/source/code/q3_ui/ui_startserver.c | 1948 ++ quake3/source/code/q3_ui/ui_team.c | 190 + quake3/source/code/q3_ui/ui_teamorders.c | 429 + quake3/source/code/q3_ui/ui_video.c | 1050 + quake3/source/code/quake3sdk.dsw | 77 + quake3/source/code/quake3sdk.ncb | Bin 0 -> 820224 bytes quake3/source/code/quake3sdk.opt | Bin 0 -> 67072 bytes quake3/source/code/ui/Debug_TA/bg_misc.obj | Bin 0 -> 32290 bytes quake3/source/code/ui/Debug_TA/bg_misc.sbr | 0 quake3/source/code/ui/Debug_TA/q_math.obj | Bin 0 -> 14848 bytes quake3/source/code/ui/Debug_TA/q_math.sbr | 0 quake3/source/code/ui/Debug_TA/q_shared.obj | Bin 0 -> 11830 bytes quake3/source/code/ui/Debug_TA/q_shared.sbr | 0 quake3/source/code/ui/Debug_TA/ui.bsc | Bin 0 -> 975872 bytes quake3/source/code/ui/Debug_TA/ui.pch | Bin 0 -> 199088 bytes quake3/source/code/ui/Debug_TA/ui_atoms.obj | Bin 0 -> 14580 bytes quake3/source/code/ui/Debug_TA/ui_atoms.sbr | Bin 0 -> 85613 bytes .../source/code/ui/Debug_TA/ui_gameinfo.obj | Bin 0 -> 8630 bytes .../source/code/ui/Debug_TA/ui_gameinfo.sbr | Bin 0 -> 83654 bytes quake3/source/code/ui/Debug_TA/ui_main.obj | Bin 0 -> 173152 bytes quake3/source/code/ui/Debug_TA/ui_main.sbr | Bin 0 -> 140628 bytes quake3/source/code/ui/Debug_TA/ui_players.obj | Bin 0 -> 21248 bytes quake3/source/code/ui/Debug_TA/ui_players.sbr | Bin 0 -> 91320 bytes quake3/source/code/ui/Debug_TA/ui_shared.obj | Bin 0 -> 88758 bytes quake3/source/code/ui/Debug_TA/ui_shared.sbr | Bin 0 -> 97637 bytes .../source/code/ui/Debug_TA/ui_syscalls.obj | Bin 0 -> 7205 bytes .../source/code/ui/Debug_TA/ui_syscalls.sbr | 0 quake3/source/code/ui/Debug_TA/ui_util.obj | Bin 0 -> 195 bytes quake3/source/code/ui/Debug_TA/ui_util.sbr | 0 quake3/source/code/ui/Debug_TA/vc50.idb | Bin 0 -> 41984 bytes quake3/source/code/ui/keycodes.h | 143 + quake3/source/code/ui/ui.bat | 37 + quake3/source/code/ui/ui.def | 3 + quake3/source/code/ui/ui.dsp | 640 + quake3/source/code/ui/ui.plg | 17 + quake3/source/code/ui/ui.q3asm | 12 + quake3/source/code/ui/ui_atoms.c | 605 + quake3/source/code/ui/ui_gameinfo.c | 376 + quake3/source/code/ui/ui_local.h | 1188 + quake3/source/code/ui/ui_main.c | 7282 ++++++ quake3/source/code/ui/ui_players.c | 1402 + quake3/source/code/ui/ui_public.h | 174 + quake3/source/code/ui/ui_shared.c | 5774 +++++ quake3/source/code/ui/ui_shared.h | 429 + quake3/source/code/ui/ui_syscalls.asm | 101 + quake3/source/code/ui/ui_syscalls.c | 381 + quake3/source/code/ui/ui_util.c | 10 + quake3/source/lcc/COPYRIGHT | 61 + quake3/source/lcc/LOG | 91 + quake3/source/lcc/README | 21 + quake3/source/lcc/README.Id | 3 + quake3/source/lcc/alpha/osf/tst/8q.1bk | 92 + quake3/source/lcc/alpha/osf/tst/8q.2bk | 2 + quake3/source/lcc/alpha/osf/tst/8q.sbk | 193 + quake3/source/lcc/alpha/osf/tst/array.1bk | 4 + quake3/source/lcc/alpha/osf/tst/array.2bk | 2 + quake3/source/lcc/alpha/osf/tst/array.sbk | 260 + quake3/source/lcc/alpha/osf/tst/cf.1bk | 51 + quake3/source/lcc/alpha/osf/tst/cf.2bk | 0 quake3/source/lcc/alpha/osf/tst/cf.sbk | 170 + quake3/source/lcc/alpha/osf/tst/cq.1bk | 45 + quake3/source/lcc/alpha/osf/tst/cq.2bk | 4 + quake3/source/lcc/alpha/osf/tst/cq.sbk | 16904 +++++++++++++ quake3/source/lcc/alpha/osf/tst/cvt.1bk | 11 + quake3/source/lcc/alpha/osf/tst/cvt.2bk | 2 + quake3/source/lcc/alpha/osf/tst/cvt.sbk | 744 + quake3/source/lcc/alpha/osf/tst/fields.1bk | 5 + quake3/source/lcc/alpha/osf/tst/fields.2bk | 4 + quake3/source/lcc/alpha/osf/tst/fields.sbk | 325 + quake3/source/lcc/alpha/osf/tst/front.2bk | 29 + quake3/source/lcc/alpha/osf/tst/front.sbk | 380 + quake3/source/lcc/alpha/osf/tst/incr.1bk | 0 quake3/source/lcc/alpha/osf/tst/incr.2bk | 9 + quake3/source/lcc/alpha/osf/tst/incr.sbk | 151 + quake3/source/lcc/alpha/osf/tst/init.1bk | 16 + quake3/source/lcc/alpha/osf/tst/init.2bk | 3 + quake3/source/lcc/alpha/osf/tst/init.sbk | 333 + quake3/source/lcc/alpha/osf/tst/limits.1bk | 14 + quake3/source/lcc/alpha/osf/tst/limits.2bk | 0 quake3/source/lcc/alpha/osf/tst/limits.sbk | 405 + quake3/source/lcc/alpha/osf/tst/paranoia.1bk | 195 + quake3/source/lcc/alpha/osf/tst/paranoia.2bk | 16 + quake3/source/lcc/alpha/osf/tst/paranoia.sbk | 19291 ++++++++++++++ quake3/source/lcc/alpha/osf/tst/sort.1bk | 20 + quake3/source/lcc/alpha/osf/tst/sort.2bk | 5 + quake3/source/lcc/alpha/osf/tst/sort.sbk | 323 + quake3/source/lcc/alpha/osf/tst/spill.1bk | 0 quake3/source/lcc/alpha/osf/tst/spill.2bk | 6 + quake3/source/lcc/alpha/osf/tst/spill.sbk | 272 + quake3/source/lcc/alpha/osf/tst/stdarg.1bk | 6 + quake3/source/lcc/alpha/osf/tst/stdarg.2bk | 1 + quake3/source/lcc/alpha/osf/tst/stdarg.sbk | 430 + quake3/source/lcc/alpha/osf/tst/struct.1bk | 5 + quake3/source/lcc/alpha/osf/tst/struct.2bk | 2 + quake3/source/lcc/alpha/osf/tst/struct.sbk | 443 + quake3/source/lcc/alpha/osf/tst/switch.1bk | 76 + quake3/source/lcc/alpha/osf/tst/switch.2bk | 7 + quake3/source/lcc/alpha/osf/tst/switch.sbk | 903 + quake3/source/lcc/alpha/osf/tst/wf1.1bk | 74 + quake3/source/lcc/alpha/osf/tst/wf1.2bk | 2 + quake3/source/lcc/alpha/osf/tst/wf1.sbk | 400 + quake3/source/lcc/alpha/osf/tst/yacc.1bk | 10 + quake3/source/lcc/alpha/osf/tst/yacc.2bk | 3 + quake3/source/lcc/alpha/osf/tst/yacc.sbk | 2402 ++ quake3/source/lcc/buildnt.bat | 3 + quake3/source/lcc/buildnt.sh | 4 + quake3/source/lcc/cpp/cpp.c | 322 + quake3/source/lcc/cpp/cpp.h | 163 + quake3/source/lcc/cpp/eval.c | 520 + quake3/source/lcc/cpp/getopt.c | 52 + quake3/source/lcc/cpp/hideset.c | 112 + quake3/source/lcc/cpp/include.c | 122 + quake3/source/lcc/cpp/lex.c | 581 + quake3/source/lcc/cpp/macro.c | 515 + quake3/source/lcc/cpp/nlist.c | 104 + quake3/source/lcc/cpp/tokens.c | 370 + quake3/source/lcc/cpp/unix.c | 116 + quake3/source/lcc/custom.mk | 1 + quake3/source/lcc/doc/4.html | 754 + quake3/source/lcc/doc/bprint.1 | 83 + quake3/source/lcc/doc/bprint.pdf | Bin 0 -> 4963 bytes quake3/source/lcc/doc/install.html | 796 + quake3/source/lcc/doc/lcc.1 | 605 + quake3/source/lcc/doc/lcc.pdf | Bin 0 -> 16421 bytes quake3/source/lcc/etc/bprint.c | 475 + quake3/source/lcc/etc/gcc-solaris.c | 50 + quake3/source/lcc/etc/irix.c | 64 + quake3/source/lcc/etc/lcc.c | 793 + quake3/source/lcc/etc/linux.c | 74 + quake3/source/lcc/etc/ops.c | 190 + quake3/source/lcc/etc/osf.c | 53 + quake3/source/lcc/etc/solaris.c | 50 + quake3/source/lcc/etc/win32.c | 43 + quake3/source/lcc/include/alpha/osf/assert.h | 14 + quake3/source/lcc/include/alpha/osf/ctype.h | 25 + quake3/source/lcc/include/alpha/osf/errno.h | 8 + quake3/source/lcc/include/alpha/osf/float.h | 37 + quake3/source/lcc/include/alpha/osf/limits.h | 24 + quake3/source/lcc/include/alpha/osf/locale.h | 36 + quake3/source/lcc/include/alpha/osf/math.h | 29 + quake3/source/lcc/include/alpha/osf/setjmp.h | 10 + quake3/source/lcc/include/alpha/osf/signal.h | 20 + quake3/source/lcc/include/alpha/osf/stdarg.h | 28 + quake3/source/lcc/include/alpha/osf/stddef.h | 22 + quake3/source/lcc/include/alpha/osf/stdio.h | 113 + quake3/source/lcc/include/alpha/osf/stdlib.h | 54 + quake3/source/lcc/include/alpha/osf/string.h | 35 + quake3/source/lcc/include/alpha/osf/time.h | 50 + quake3/source/lcc/include/mips/irix/assert.h | 14 + quake3/source/lcc/include/mips/irix/ctype.h | 40 + quake3/source/lcc/include/mips/irix/errno.h | 8 + quake3/source/lcc/include/mips/irix/float.h | 37 + quake3/source/lcc/include/mips/irix/limits.h | 24 + quake3/source/lcc/include/mips/irix/locale.h | 36 + quake3/source/lcc/include/mips/irix/math.h | 29 + quake3/source/lcc/include/mips/irix/setjmp.h | 10 + quake3/source/lcc/include/mips/irix/signal.h | 20 + quake3/source/lcc/include/mips/irix/stdarg.h | 22 + quake3/source/lcc/include/mips/irix/stddef.h | 22 + quake3/source/lcc/include/mips/irix/stdio.h | 103 + quake3/source/lcc/include/mips/irix/stdlib.h | 54 + quake3/source/lcc/include/mips/irix/string.h | 35 + quake3/source/lcc/include/mips/irix/time.h | 48 + .../source/lcc/include/sparc/solaris/assert.h | 14 + .../source/lcc/include/sparc/solaris/ctype.h | 46 + .../source/lcc/include/sparc/solaris/errno.h | 8 + .../source/lcc/include/sparc/solaris/float.h | 37 + .../source/lcc/include/sparc/solaris/limits.h | 24 + .../source/lcc/include/sparc/solaris/locale.h | 36 + .../source/lcc/include/sparc/solaris/math.h | 30 + .../source/lcc/include/sparc/solaris/setjmp.h | 10 + .../source/lcc/include/sparc/solaris/signal.h | 20 + .../source/lcc/include/sparc/solaris/stdarg.h | 22 + .../source/lcc/include/sparc/solaris/stddef.h | 22 + .../source/lcc/include/sparc/solaris/stdio.h | 104 + .../source/lcc/include/sparc/solaris/stdlib.h | 54 + .../source/lcc/include/sparc/solaris/string.h | 35 + .../source/lcc/include/sparc/solaris/time.h | 48 + quake3/source/lcc/include/x86/linux/assert.h | 14 + quake3/source/lcc/include/x86/linux/float.h | 37 + quake3/source/lcc/include/x86/linux/stdarg.h | 21 + quake3/source/lcc/lburg/gram.c | 680 + quake3/source/lcc/lburg/gram.y | 202 + quake3/source/lcc/lburg/lburg.1 | 179 + quake3/source/lcc/lburg/lburg.c | 671 + quake3/source/lcc/lburg/lburg.h | 65 + quake3/source/lcc/lib/assert.c | 15 + quake3/source/lcc/lib/bbexit.c | 123 + quake3/source/lcc/lib/yynull.c | 12 + quake3/source/lcc/makefile | 310 + quake3/source/lcc/makefile.nt | 383 + quake3/source/lcc/mips/irix/tst/8q.1bk | 92 + quake3/source/lcc/mips/irix/tst/8q.2bk | 2 + quake3/source/lcc/mips/irix/tst/8q.sbk | 169 + quake3/source/lcc/mips/irix/tst/array.1bk | 4 + quake3/source/lcc/mips/irix/tst/array.2bk | 2 + quake3/source/lcc/mips/irix/tst/array.sbk | 235 + quake3/source/lcc/mips/irix/tst/cf.1bk | 51 + quake3/source/lcc/mips/irix/tst/cf.2bk | 0 quake3/source/lcc/mips/irix/tst/cf.sbk | 153 + quake3/source/lcc/mips/irix/tst/cq.1bk | 48 + quake3/source/lcc/mips/irix/tst/cq.2bk | 25 + quake3/source/lcc/mips/irix/tst/cq.sbk | 13620 ++++++++++ quake3/source/lcc/mips/irix/tst/cvt.1bk | 11 + quake3/source/lcc/mips/irix/tst/cvt.2bk | 2 + quake3/source/lcc/mips/irix/tst/cvt.sbk | 557 + quake3/source/lcc/mips/irix/tst/fields.1bk | 5 + quake3/source/lcc/mips/irix/tst/fields.2bk | 4 + quake3/source/lcc/mips/irix/tst/fields.sbk | 304 + quake3/source/lcc/mips/irix/tst/front.2bk | 29 + quake3/source/lcc/mips/irix/tst/front.sbk | 416 + quake3/source/lcc/mips/irix/tst/incr.2bk | 9 + quake3/source/lcc/mips/irix/tst/incr.sbk | 149 + quake3/source/lcc/mips/irix/tst/init.1bk | 16 + quake3/source/lcc/mips/irix/tst/init.2bk | 3 + quake3/source/lcc/mips/irix/tst/init.sbk | 325 + quake3/source/lcc/mips/irix/tst/limits.1bk | 14 + quake3/source/lcc/mips/irix/tst/limits.2bk | 0 quake3/source/lcc/mips/irix/tst/limits.sbk | 396 + quake3/source/lcc/mips/irix/tst/paranoia.1bk | 178 + quake3/source/lcc/mips/irix/tst/paranoia.2bk | 16 + quake3/source/lcc/mips/irix/tst/paranoia.sbk | 18657 ++++++++++++++ quake3/source/lcc/mips/irix/tst/sort.1bk | 20 + quake3/source/lcc/mips/irix/tst/sort.2bk | 5 + quake3/source/lcc/mips/irix/tst/sort.sbk | 308 + quake3/source/lcc/mips/irix/tst/spill.2bk | 6 + quake3/source/lcc/mips/irix/tst/spill.sbk | 271 + quake3/source/lcc/mips/irix/tst/stdarg.1bk | 6 + quake3/source/lcc/mips/irix/tst/stdarg.2bk | 1 + quake3/source/lcc/mips/irix/tst/stdarg.sbk | 395 + quake3/source/lcc/mips/irix/tst/struct.1bk | 5 + quake3/source/lcc/mips/irix/tst/struct.2bk | 2 + quake3/source/lcc/mips/irix/tst/struct.sbk | 485 + quake3/source/lcc/mips/irix/tst/switch.1bk | 76 + quake3/source/lcc/mips/irix/tst/switch.2bk | 5 + quake3/source/lcc/mips/irix/tst/switch.sbk | 836 + quake3/source/lcc/mips/irix/tst/wf1.1bk | 74 + quake3/source/lcc/mips/irix/tst/wf1.2bk | 2 + quake3/source/lcc/mips/irix/tst/wf1.sbk | 378 + quake3/source/lcc/mips/irix/tst/yacc.1bk | 10 + quake3/source/lcc/mips/irix/tst/yacc.2bk | 3 + quake3/source/lcc/mips/irix/tst/yacc.sbk | 2236 ++ quake3/source/lcc/msdev/rcc.dsp | 240 + quake3/source/lcc/msdev/rcc.dsw | 29 + quake3/source/lcc/packing.lst | 432 + quake3/source/lcc/sparc/solaris/tst/8q.1bk | 92 + quake3/source/lcc/sparc/solaris/tst/8q.2bk | 2 + quake3/source/lcc/sparc/solaris/tst/8q.sbk | 144 + quake3/source/lcc/sparc/solaris/tst/array.1bk | 4 + quake3/source/lcc/sparc/solaris/tst/array.2bk | 2 + quake3/source/lcc/sparc/solaris/tst/array.sbk | 172 + quake3/source/lcc/sparc/solaris/tst/cf.1bk | 51 + quake3/source/lcc/sparc/solaris/tst/cf.2bk | 0 quake3/source/lcc/sparc/solaris/tst/cf.sbk | 143 + quake3/source/lcc/sparc/solaris/tst/cq.1bk | 48 + quake3/source/lcc/sparc/solaris/tst/cq.2bk | 25 + quake3/source/lcc/sparc/solaris/tst/cq.sbk | 13322 ++++++++++ quake3/source/lcc/sparc/solaris/tst/cvt.1bk | 11 + quake3/source/lcc/sparc/solaris/tst/cvt.2bk | 2 + quake3/source/lcc/sparc/solaris/tst/cvt.sbk | 715 + .../source/lcc/sparc/solaris/tst/fields.1bk | 5 + .../source/lcc/sparc/solaris/tst/fields.2bk | 4 + .../source/lcc/sparc/solaris/tst/fields.sbk | 309 + quake3/source/lcc/sparc/solaris/tst/front.2bk | 29 + quake3/source/lcc/sparc/solaris/tst/front.sbk | 260 + quake3/source/lcc/sparc/solaris/tst/incr.1bk | 0 quake3/source/lcc/sparc/solaris/tst/incr.2bk | 9 + quake3/source/lcc/sparc/solaris/tst/incr.sbk | 107 + quake3/source/lcc/sparc/solaris/tst/init.1bk | 16 + quake3/source/lcc/sparc/solaris/tst/init.2bk | 3 + quake3/source/lcc/sparc/solaris/tst/init.sbk | 277 + .../source/lcc/sparc/solaris/tst/limits.1bk | 14 + .../source/lcc/sparc/solaris/tst/limits.2bk | 0 .../source/lcc/sparc/solaris/tst/limits.sbk | 384 + .../source/lcc/sparc/solaris/tst/paranoia.1bk | 178 + .../source/lcc/sparc/solaris/tst/paranoia.2bk | 16 + .../source/lcc/sparc/solaris/tst/paranoia.sbk | 21068 ++++++++++++++++ quake3/source/lcc/sparc/solaris/tst/sort.1bk | 20 + quake3/source/lcc/sparc/solaris/tst/sort.2bk | 5 + quake3/source/lcc/sparc/solaris/tst/sort.sbk | 202 + quake3/source/lcc/sparc/solaris/tst/spill.1bk | 0 quake3/source/lcc/sparc/solaris/tst/spill.2bk | 6 + quake3/source/lcc/sparc/solaris/tst/spill.sbk | 207 + .../source/lcc/sparc/solaris/tst/stdarg.1bk | 6 + .../source/lcc/sparc/solaris/tst/stdarg.2bk | 1 + .../source/lcc/sparc/solaris/tst/stdarg.sbk | 376 + .../source/lcc/sparc/solaris/tst/struct.1bk | 5 + .../source/lcc/sparc/solaris/tst/struct.2bk | 2 + .../source/lcc/sparc/solaris/tst/struct.sbk | 377 + .../source/lcc/sparc/solaris/tst/switch.1bk | 76 + .../source/lcc/sparc/solaris/tst/switch.2bk | 5 + .../source/lcc/sparc/solaris/tst/switch.sbk | 713 + quake3/source/lcc/sparc/solaris/tst/wf1.1bk | 74 + quake3/source/lcc/sparc/solaris/tst/wf1.2bk | 2 + quake3/source/lcc/sparc/solaris/tst/wf1.sbk | 311 + quake3/source/lcc/sparc/solaris/tst/yacc.1bk | 10 + quake3/source/lcc/sparc/solaris/tst/yacc.2bk | 3 + quake3/source/lcc/sparc/solaris/tst/yacc.sbk | 2247 ++ quake3/source/lcc/src/2html.c | 555 + quake3/source/lcc/src/alloc.c | 94 + quake3/source/lcc/src/alpha.md | 1192 + quake3/source/lcc/src/asdl.c | 399 + quake3/source/lcc/src/bind.c | 23 + quake3/source/lcc/src/bytecode.c | 365 + quake3/source/lcc/src/c.h | 723 + quake3/source/lcc/src/config.h | 102 + quake3/source/lcc/src/dag.c | 735 + quake3/source/lcc/src/dagcheck.md | 210 + quake3/source/lcc/src/decl.c | 1160 + quake3/source/lcc/src/enode.c | 543 + quake3/source/lcc/src/error.c | 137 + quake3/source/lcc/src/event.c | 28 + quake3/source/lcc/src/expr.c | 709 + quake3/source/lcc/src/gen.c | 830 + quake3/source/lcc/src/init.c | 318 + quake3/source/lcc/src/inits.c | 8 + quake3/source/lcc/src/input.c | 134 + quake3/source/lcc/src/lex.c | 922 + quake3/source/lcc/src/list.c | 56 + quake3/source/lcc/src/main.c | 225 + quake3/source/lcc/src/mips.md | 1120 + quake3/source/lcc/src/null.c | 74 + quake3/source/lcc/src/output.c | 134 + quake3/source/lcc/src/pass2.c | 665 + quake3/source/lcc/src/prof.c | 227 + quake3/source/lcc/src/profio.c | 276 + quake3/source/lcc/src/rcc.asdl | 70 + quake3/source/lcc/src/run.sh | 51 + quake3/source/lcc/src/simp.c | 587 + quake3/source/lcc/src/sparc.md | 1163 + quake3/source/lcc/src/stab.c | 330 + quake3/source/lcc/src/stab.h | 113 + quake3/source/lcc/src/stmt.c | 697 + quake3/source/lcc/src/string.c | 122 + quake3/source/lcc/src/sym.c | 315 + quake3/source/lcc/src/symbolic.c | 494 + quake3/source/lcc/src/token.h | 133 + quake3/source/lcc/src/trace.c | 180 + quake3/source/lcc/src/tree.c | 223 + quake3/source/lcc/src/types.c | 748 + quake3/source/lcc/src/x86.md | 998 + quake3/source/lcc/src/x86linux.md | 1081 + quake3/source/lcc/tst/8q.0 | 0 quake3/source/lcc/tst/8q.c | 39 + quake3/source/lcc/tst/array.0 | 0 quake3/source/lcc/tst/array.c | 48 + quake3/source/lcc/tst/cf.0 | 32 + quake3/source/lcc/tst/cf.c | 32 + quake3/source/lcc/tst/cq.0 | 0 quake3/source/lcc/tst/cq.c | 5316 ++++ quake3/source/lcc/tst/cvt.0 | 0 quake3/source/lcc/tst/cvt.c | 35 + quake3/source/lcc/tst/fields.0 | 0 quake3/source/lcc/tst/fields.c | 34 + quake3/source/lcc/tst/front.0 | 0 quake3/source/lcc/tst/front.c | 120 + quake3/source/lcc/tst/incr.0 | 0 quake3/source/lcc/tst/incr.c | 39 + quake3/source/lcc/tst/init.0 | 0 quake3/source/lcc/tst/init.c | 59 + quake3/source/lcc/tst/limits.0 | 0 quake3/source/lcc/tst/limits.c | 19 + quake3/source/lcc/tst/paranoia.0 | 0 quake3/source/lcc/tst/paranoia.c | 2203 ++ quake3/source/lcc/tst/sort.0 | 0 quake3/source/lcc/tst/sort.c | 65 + quake3/source/lcc/tst/spill.0 | 0 quake3/source/lcc/tst/spill.c | 17 + quake3/source/lcc/tst/stdarg.0 | 0 quake3/source/lcc/tst/stdarg.c | 51 + quake3/source/lcc/tst/struct.0 | 0 quake3/source/lcc/tst/struct.c | 69 + quake3/source/lcc/tst/switch.0 | 0 quake3/source/lcc/tst/switch.c | 137 + quake3/source/lcc/tst/wf1.0 | 115 + quake3/source/lcc/tst/wf1.c | 101 + quake3/source/lcc/tst/yacc.0 | 1 + quake3/source/lcc/tst/yacc.c | 591 + quake3/source/lcc/x86/linux/tst/8q.1bk | 92 + quake3/source/lcc/x86/linux/tst/8q.2bk | 2 + quake3/source/lcc/x86/linux/tst/8q.sbk | 180 + quake3/source/lcc/x86/linux/tst/array.1bk | 4 + quake3/source/lcc/x86/linux/tst/array.2bk | 2 + quake3/source/lcc/x86/linux/tst/array.sbk | 235 + quake3/source/lcc/x86/linux/tst/cf.1bk | 51 + quake3/source/lcc/x86/linux/tst/cf.2bk | 0 quake3/source/lcc/x86/linux/tst/cf.sbk | 161 + quake3/source/lcc/x86/linux/tst/cq.1bk | 48 + quake3/source/lcc/x86/linux/tst/cq.2bk | 25 + quake3/source/lcc/x86/linux/tst/cq.sbk | 15756 ++++++++++++ quake3/source/lcc/x86/linux/tst/cvt.1bk | 11 + quake3/source/lcc/x86/linux/tst/cvt.2bk | 2 + quake3/source/lcc/x86/linux/tst/cvt.sbk | 792 + quake3/source/lcc/x86/linux/tst/fields.1bk | 5 + quake3/source/lcc/x86/linux/tst/fields.2bk | 4 + quake3/source/lcc/x86/linux/tst/fields.sbk | 321 + quake3/source/lcc/x86/linux/tst/front.2bk | 29 + quake3/source/lcc/x86/linux/tst/front.sbk | 530 + quake3/source/lcc/x86/linux/tst/incr.1bk | 0 quake3/source/lcc/x86/linux/tst/incr.2bk | 9 + quake3/source/lcc/x86/linux/tst/incr.sbk | 181 + quake3/source/lcc/x86/linux/tst/init.1bk | 16 + quake3/source/lcc/x86/linux/tst/init.2bk | 3 + quake3/source/lcc/x86/linux/tst/init.sbk | 336 + quake3/source/lcc/x86/linux/tst/limits.1bk | 14 + quake3/source/lcc/x86/linux/tst/limits.2bk | 0 quake3/source/lcc/x86/linux/tst/limits.sbk | 396 + quake3/source/lcc/x86/linux/tst/paranoia.1bk | 183 + quake3/source/lcc/x86/linux/tst/paranoia.2bk | 16 + quake3/source/lcc/x86/linux/tst/paranoia.sbk | 20248 +++++++++++++++ quake3/source/lcc/x86/linux/tst/sort.1bk | 20 + quake3/source/lcc/x86/linux/tst/sort.2bk | 5 + quake3/source/lcc/x86/linux/tst/sort.sbk | 330 + quake3/source/lcc/x86/linux/tst/spill.1bk | 0 quake3/source/lcc/x86/linux/tst/spill.2bk | 6 + quake3/source/lcc/x86/linux/tst/spill.sbk | 282 + quake3/source/lcc/x86/linux/tst/stdarg.1bk | 6 + quake3/source/lcc/x86/linux/tst/stdarg.2bk | 1 + quake3/source/lcc/x86/linux/tst/stdarg.sbk | 395 + quake3/source/lcc/x86/linux/tst/struct.1bk | 5 + quake3/source/lcc/x86/linux/tst/struct.2bk | 2 + quake3/source/lcc/x86/linux/tst/struct.sbk | 477 + quake3/source/lcc/x86/linux/tst/switch.1bk | 76 + quake3/source/lcc/x86/linux/tst/switch.2bk | 5 + quake3/source/lcc/x86/linux/tst/switch.sbk | 899 + quake3/source/lcc/x86/linux/tst/wf1.1bk | 74 + quake3/source/lcc/x86/linux/tst/wf1.2bk | 2 + quake3/source/lcc/x86/linux/tst/wf1.sbk | 437 + quake3/source/lcc/x86/linux/tst/yacc.1bk | 10 + quake3/source/lcc/x86/linux/tst/yacc.2bk | 3 + quake3/source/lcc/x86/linux/tst/yacc.sbk | 2526 ++ quake3/source/lcc/x86/win32/tst/8q.1bk | 92 + quake3/source/lcc/x86/win32/tst/8q.2bk | 2 + quake3/source/lcc/x86/win32/tst/8q.sbk | 176 + quake3/source/lcc/x86/win32/tst/array.1bk | 4 + quake3/source/lcc/x86/win32/tst/array.2bk | 2 + quake3/source/lcc/x86/win32/tst/array.sbk | 240 + quake3/source/lcc/x86/win32/tst/cf.1bk | 51 + quake3/source/lcc/x86/win32/tst/cf.2bk | 0 quake3/source/lcc/x86/win32/tst/cf.sbk | 185 + quake3/source/lcc/x86/win32/tst/cq.1bk | 48 + quake3/source/lcc/x86/win32/tst/cq.2bk | 25 + quake3/source/lcc/x86/win32/tst/cq.sbk | 16642 ++++++++++++ quake3/source/lcc/x86/win32/tst/cvt.1bk | 11 + quake3/source/lcc/x86/win32/tst/cvt.2bk | 2 + quake3/source/lcc/x86/win32/tst/cvt.sbk | 742 + quake3/source/lcc/x86/win32/tst/fields.1bk | 5 + quake3/source/lcc/x86/win32/tst/fields.2bk | 4 + quake3/source/lcc/x86/win32/tst/fields.sbk | 323 + quake3/source/lcc/x86/win32/tst/front.2bk | 29 + quake3/source/lcc/x86/win32/tst/front.sbk | 436 + quake3/source/lcc/x86/win32/tst/incr.1bk | 0 quake3/source/lcc/x86/win32/tst/incr.2bk | 9 + quake3/source/lcc/x86/win32/tst/incr.sbk | 166 + quake3/source/lcc/x86/win32/tst/init.1bk | 16 + quake3/source/lcc/x86/win32/tst/init.2bk | 3 + quake3/source/lcc/x86/win32/tst/init.sbk | 336 + quake3/source/lcc/x86/win32/tst/limits.1bk | 14 + quake3/source/lcc/x86/win32/tst/limits.2bk | 0 quake3/source/lcc/x86/win32/tst/limits.sbk | 414 + quake3/source/lcc/x86/win32/tst/paranoia.1bk | 179 + quake3/source/lcc/x86/win32/tst/paranoia.2bk | 16 + quake3/source/lcc/x86/win32/tst/paranoia.sbk | 20480 +++++++++++++++ quake3/source/lcc/x86/win32/tst/sort.1bk | 20 + quake3/source/lcc/x86/win32/tst/sort.2bk | 5 + quake3/source/lcc/x86/win32/tst/sort.sbk | 324 + quake3/source/lcc/x86/win32/tst/spill.1bk | 0 quake3/source/lcc/x86/win32/tst/spill.2bk | 6 + quake3/source/lcc/x86/win32/tst/spill.sbk | 259 + quake3/source/lcc/x86/win32/tst/stdarg.1bk | 6 + quake3/source/lcc/x86/win32/tst/stdarg.2bk | 1 + quake3/source/lcc/x86/win32/tst/stdarg.sbk | 415 + quake3/source/lcc/x86/win32/tst/struct.1bk | 5 + quake3/source/lcc/x86/win32/tst/struct.2bk | 2 + quake3/source/lcc/x86/win32/tst/struct.sbk | 453 + quake3/source/lcc/x86/win32/tst/switch.1bk | 76 + quake3/source/lcc/x86/win32/tst/switch.2bk | 5 + quake3/source/lcc/x86/win32/tst/switch.sbk | 960 + quake3/source/lcc/x86/win32/tst/wf1.1bk | 74 + quake3/source/lcc/x86/win32/tst/wf1.2bk | 2 + quake3/source/lcc/x86/win32/tst/wf1.sbk | 451 + quake3/source/lcc/x86/win32/tst/yacc.1bk | 10 + quake3/source/lcc/x86/win32/tst/yacc.2bk | 3 + quake3/source/lcc/x86/win32/tst/yacc.sbk | 2489 ++ quake3/source/q3asm/Makefile | 13 + quake3/source/q3asm/README.Id | 10 + quake3/source/q3asm/cmdlib.c | 1185 + quake3/source/q3asm/cmdlib.h | 139 + quake3/source/q3asm/lib.txt | 31 + quake3/source/q3asm/mathlib.h | 73 + quake3/source/q3asm/notes.txt | 16 + quake3/source/q3asm/ops.txt | 132 + quake3/source/q3asm/opstrings.h | 154 + quake3/source/q3asm/q3asm.c | 1026 + quake3/source/q3asm/q3asm.dsp | 109 + quake3/source/q3asm/q3asm.dsw | 37 + quake3/source/q3asm/qfiles.h | 464 + quake3/source/ui/addfilter.menu | 323 + quake3/source/ui/botselection.menu | 306 + quake3/source/ui/cdkey.menu | 312 + quake3/source/ui/chip.menu | 39 + quake3/source/ui/cinematic.menu | 16 + quake3/source/ui/cinematicmenu.menu | 308 + quake3/source/ui/connect.menu | 15 + quake3/source/ui/controls.menu | 1417 ++ quake3/source/ui/controls2.menu | 911 + quake3/source/ui/createfavorite.menu | 199 + quake3/source/ui/createserver.menu | 1331 + quake3/source/ui/credit.menu | 459 + quake3/source/ui/default.menu | 255 + quake3/source/ui/demo.menu | 266 + quake3/source/ui/demo_quit.menu | 252 + quake3/source/ui/endofgame.menu | 1331 + quake3/source/ui/endofgame2.menu | 1034 + quake3/source/ui/error.menu | 318 + quake3/source/ui/fight.menu | 770 + quake3/source/ui/filter.menu | 119 + quake3/source/ui/findplayer.menu | 514 + quake3/source/ui/help.menu | 660 + quake3/source/ui/help2.menu | 721 + quake3/source/ui/hud.menu | 803 + quake3/source/ui/hud.txt | 7 + quake3/source/ui/hud2.txt | 7 + quake3/source/ui/hud_old.menu | 1091 + quake3/source/ui/ingame.menu | 382 + quake3/source/ui/ingame.txt | 16 + quake3/source/ui/ingame_about.menu | 400 + quake3/source/ui/ingame_addbot.menu | 162 + quake3/source/ui/ingame_callvote.menu | 491 + quake3/source/ui/ingame_callvote2.menu | 192 + quake3/source/ui/ingame_controls.menu | 1412 ++ quake3/source/ui/ingame_join.menu | 144 + quake3/source/ui/ingame_leave.menu | 344 + quake3/source/ui/ingame_options.menu | 469 + quake3/source/ui/ingame_orders.menu | 481 + quake3/source/ui/ingame_orders2.menu | 199 + quake3/source/ui/ingame_player.menu | 259 + quake3/source/ui/ingame_scoreffa.menu | 452 + quake3/source/ui/ingame_serverinfo.menu | 63 + quake3/source/ui/ingame_system.menu | 619 + quake3/source/ui/ingame_vote.menu | 141 + quake3/source/ui/ingame_vote2.menu | 71 + quake3/source/ui/joinserver.menu | 1375 + quake3/source/ui/main.menu | 559 + quake3/source/ui/main2.menu | 686 + quake3/source/ui/menudef.h | 343 + quake3/source/ui/menus.txt | 39 + quake3/source/ui/min_hud.menu | 674 + quake3/source/ui/mod.menu | 303 + quake3/source/ui/newleague.menu | 67 + quake3/source/ui/options.menu | 351 + quake3/source/ui/ordershelp.menu | 1020 + quake3/source/ui/password.menu | 147 + quake3/source/ui/player.menu | 612 + quake3/source/ui/powerup.menu | 768 + quake3/source/ui/powerup2.menu | 694 + quake3/source/ui/punkbuster.menu | 410 + quake3/source/ui/quake3.menu | 222 + quake3/source/ui/quit.menu | 163 + quake3/source/ui/quitcredit.menu | 258 + quake3/source/ui/rankings.menu | 93 + quake3/source/ui/resetscore.menu | 223 + quake3/source/ui/score.menu | 452 + quake3/source/ui/score_results.menu | 417 + quake3/source/ui/serverinfo.menu | 396 + quake3/source/ui/serverinfo_old.menu | 340 + quake3/source/ui/setup.menu | 513 + quake3/source/ui/skirmish.menu | 1655 ++ quake3/source/ui/small.menu | 796 + quake3/source/ui/system.menu | 676 + quake3/source/ui/team.menu | 306 + quake3/source/ui/teamscore.menu | 512 + quake3/source/ui/testhud.menu | 1052 + quake3/source/ui/vid_restart.menu | 194 + 863 files changed, 446846 insertions(+) create mode 100644 Readme Painkeep Arena Source Info.txt create mode 100644 quake3/Readme PainKeep Arena 3_1.txt create mode 100644 quake3/Readme Painkeep Arena Source Info.txt create mode 100644 quake3/bin_nt/lcc.exe create mode 100644 quake3/bin_nt/q3asm.exe create mode 100644 quake3/bin_nt/q3cpp.exe create mode 100644 quake3/bin_nt/q3rcc.exe create mode 100644 quake3/source/QIIIA Game Source License.doc create mode 100644 quake3/source/code/Debug_TA/qagamex86.dll create mode 100644 quake3/source/code/cgame/Debug_TA/bg_lib.obj create mode 100644 quake3/source/code/cgame/Debug_TA/bg_lib.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/bg_misc.obj create mode 100644 quake3/source/code/cgame/Debug_TA/bg_misc.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/bg_pmove.obj create mode 100644 quake3/source/code/cgame/Debug_TA/bg_pmove.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/bg_slidemove.obj create mode 100644 quake3/source/code/cgame/Debug_TA/bg_slidemove.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_consolecmds.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_consolecmds.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_draw.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_draw.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_drawtools.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_drawtools.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_effects.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_effects.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_ents.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_event.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_event.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_info.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_info.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_localents.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_localents.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_main.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_main.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_marks.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_marks.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_newDraw.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_newDraw.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_players.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_players.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_playerstate.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_playerstate.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_predict.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_predict.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_scoreboard.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_scoreboard.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_servercmds.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_servercmds.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_snapshot.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_snapshot.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_syscalls.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_syscalls.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_view.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_view.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cg_weapons.obj create mode 100644 quake3/source/code/cgame/Debug_TA/cg_weapons.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/cgame.pch create mode 100644 quake3/source/code/cgame/Debug_TA/q_math.obj create mode 100644 quake3/source/code/cgame/Debug_TA/q_math.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/q_shared.obj create mode 100644 quake3/source/code/cgame/Debug_TA/q_shared.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/ui_shared.obj create mode 100644 quake3/source/code/cgame/Debug_TA/ui_shared.sbr create mode 100644 quake3/source/code/cgame/Debug_TA/vc50.idb create mode 100644 quake3/source/code/cgame/cg_consolecmds.c create mode 100644 quake3/source/code/cgame/cg_draw.c create mode 100644 quake3/source/code/cgame/cg_drawtools.c create mode 100644 quake3/source/code/cgame/cg_effects.c create mode 100644 quake3/source/code/cgame/cg_ents.c create mode 100644 quake3/source/code/cgame/cg_event.c create mode 100644 quake3/source/code/cgame/cg_info.c create mode 100644 quake3/source/code/cgame/cg_local.h create mode 100644 quake3/source/code/cgame/cg_localents.c create mode 100644 quake3/source/code/cgame/cg_main.c create mode 100644 quake3/source/code/cgame/cg_marks.c create mode 100644 quake3/source/code/cgame/cg_newdraw.c create mode 100644 quake3/source/code/cgame/cg_particles.c create mode 100644 quake3/source/code/cgame/cg_players.c create mode 100644 quake3/source/code/cgame/cg_playerstate.c create mode 100644 quake3/source/code/cgame/cg_predict.c create mode 100644 quake3/source/code/cgame/cg_public.h create mode 100644 quake3/source/code/cgame/cg_scoreboard.c create mode 100644 quake3/source/code/cgame/cg_servercmds.c create mode 100644 quake3/source/code/cgame/cg_snapshot.c create mode 100644 quake3/source/code/cgame/cg_syscalls.asm create mode 100644 quake3/source/code/cgame/cg_syscalls.c create mode 100644 quake3/source/code/cgame/cg_view.c create mode 100644 quake3/source/code/cgame/cg_weapons.c create mode 100644 quake3/source/code/cgame/cgame.bat create mode 100644 quake3/source/code/cgame/cgame.def create mode 100644 quake3/source/code/cgame/cgame.dsp create mode 100644 quake3/source/code/cgame/cgame.plg create mode 100644 quake3/source/code/cgame/cgame.q3asm create mode 100644 quake3/source/code/cgame/cgame_ta.bat create mode 100644 quake3/source/code/cgame/cgame_ta.q3asm create mode 100644 quake3/source/code/cgame/tr_types.h create mode 100644 quake3/source/code/game/Debug_TA/ai_chat.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_chat.sbr create mode 100644 quake3/source/code/game/Debug_TA/ai_cmd.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_cmd.sbr create mode 100644 quake3/source/code/game/Debug_TA/ai_dmnet.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_dmnet.sbr create mode 100644 quake3/source/code/game/Debug_TA/ai_dmq3.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_dmq3.sbr create mode 100644 quake3/source/code/game/Debug_TA/ai_main.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_main.sbr create mode 100644 quake3/source/code/game/Debug_TA/ai_team.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_team.sbr create mode 100644 quake3/source/code/game/Debug_TA/ai_vcmd.obj create mode 100644 quake3/source/code/game/Debug_TA/ai_vcmd.sbr create mode 100644 quake3/source/code/game/Debug_TA/bg_misc.obj create mode 100644 quake3/source/code/game/Debug_TA/bg_misc.sbr create mode 100644 quake3/source/code/game/Debug_TA/bg_pmove.obj create mode 100644 quake3/source/code/game/Debug_TA/bg_pmove.sbr create mode 100644 quake3/source/code/game/Debug_TA/bg_slidemove.obj create mode 100644 quake3/source/code/game/Debug_TA/bg_slidemove.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_active.obj create mode 100644 quake3/source/code/game/Debug_TA/g_active.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_arenas.obj create mode 100644 quake3/source/code/game/Debug_TA/g_arenas.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_bot.obj create mode 100644 quake3/source/code/game/Debug_TA/g_bot.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_client.obj create mode 100644 quake3/source/code/game/Debug_TA/g_client.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_cmds.obj create mode 100644 quake3/source/code/game/Debug_TA/g_cmds.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_combat.obj create mode 100644 quake3/source/code/game/Debug_TA/g_combat.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_items.obj create mode 100644 quake3/source/code/game/Debug_TA/g_items.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_main.obj create mode 100644 quake3/source/code/game/Debug_TA/g_main.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_mem.obj create mode 100644 quake3/source/code/game/Debug_TA/g_mem.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_misc.obj create mode 100644 quake3/source/code/game/Debug_TA/g_misc.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_missile.obj create mode 100644 quake3/source/code/game/Debug_TA/g_missile.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_mover.obj create mode 100644 quake3/source/code/game/Debug_TA/g_mover.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_session.obj create mode 100644 quake3/source/code/game/Debug_TA/g_session.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_spawn.obj create mode 100644 quake3/source/code/game/Debug_TA/g_spawn.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_svcmds.obj create mode 100644 quake3/source/code/game/Debug_TA/g_svcmds.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_syscalls.obj create mode 100644 quake3/source/code/game/Debug_TA/g_syscalls.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_target.obj create mode 100644 quake3/source/code/game/Debug_TA/g_target.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_team.obj create mode 100644 quake3/source/code/game/Debug_TA/g_team.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_trigger.obj create mode 100644 quake3/source/code/game/Debug_TA/g_trigger.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_utils.obj create mode 100644 quake3/source/code/game/Debug_TA/g_utils.sbr create mode 100644 quake3/source/code/game/Debug_TA/g_weapon.obj create mode 100644 quake3/source/code/game/Debug_TA/g_weapon.sbr create mode 100644 quake3/source/code/game/Debug_TA/game.bsc create mode 100644 quake3/source/code/game/Debug_TA/game.pch create mode 100644 quake3/source/code/game/Debug_TA/q_math.obj create mode 100644 quake3/source/code/game/Debug_TA/q_math.sbr create mode 100644 quake3/source/code/game/Debug_TA/q_shared.obj create mode 100644 quake3/source/code/game/Debug_TA/q_shared.sbr create mode 100644 quake3/source/code/game/Debug_TA/qagamex86.exp create mode 100644 quake3/source/code/game/Debug_TA/qagamex86.lib create mode 100644 quake3/source/code/game/Debug_TA/qagamex86.map create mode 100644 quake3/source/code/game/Debug_TA/qagamex86.pdb create mode 100644 quake3/source/code/game/Debug_TA/vc50.idb create mode 100644 quake3/source/code/game/ai_chat.c create mode 100644 quake3/source/code/game/ai_chat.h create mode 100644 quake3/source/code/game/ai_cmd.c create mode 100644 quake3/source/code/game/ai_cmd.h create mode 100644 quake3/source/code/game/ai_dmnet.c create mode 100644 quake3/source/code/game/ai_dmnet.h create mode 100644 quake3/source/code/game/ai_dmq3.c create mode 100644 quake3/source/code/game/ai_dmq3.h create mode 100644 quake3/source/code/game/ai_main.c create mode 100644 quake3/source/code/game/ai_main.h create mode 100644 quake3/source/code/game/ai_team.c create mode 100644 quake3/source/code/game/ai_team.h create mode 100644 quake3/source/code/game/ai_vcmd.c create mode 100644 quake3/source/code/game/ai_vcmd.h create mode 100644 quake3/source/code/game/be_aas.h create mode 100644 quake3/source/code/game/be_ai_char.h create mode 100644 quake3/source/code/game/be_ai_chat.h create mode 100644 quake3/source/code/game/be_ai_gen.h create mode 100644 quake3/source/code/game/be_ai_goal.h create mode 100644 quake3/source/code/game/be_ai_move.h create mode 100644 quake3/source/code/game/be_ai_weap.h create mode 100644 quake3/source/code/game/be_ea.h create mode 100644 quake3/source/code/game/bg_lib.c create mode 100644 quake3/source/code/game/bg_lib.h create mode 100644 quake3/source/code/game/bg_local.h create mode 100644 quake3/source/code/game/bg_misc.c create mode 100644 quake3/source/code/game/bg_pmove.c create mode 100644 quake3/source/code/game/bg_public.h create mode 100644 quake3/source/code/game/bg_slidemove.c create mode 100644 quake3/source/code/game/botlib.h create mode 100644 quake3/source/code/game/chars.h create mode 100644 quake3/source/code/game/g_active.c create mode 100644 quake3/source/code/game/g_arenas.c create mode 100644 quake3/source/code/game/g_bot.c create mode 100644 quake3/source/code/game/g_client.c create mode 100644 quake3/source/code/game/g_cmds.c create mode 100644 quake3/source/code/game/g_combat.c create mode 100644 quake3/source/code/game/g_items.c create mode 100644 quake3/source/code/game/g_local.h create mode 100644 quake3/source/code/game/g_main.c create mode 100644 quake3/source/code/game/g_mem.c create mode 100644 quake3/source/code/game/g_misc.c create mode 100644 quake3/source/code/game/g_missile.c create mode 100644 quake3/source/code/game/g_mover.c create mode 100644 quake3/source/code/game/g_public.h create mode 100644 quake3/source/code/game/g_rankings.c create mode 100644 quake3/source/code/game/g_rankings.h create mode 100644 quake3/source/code/game/g_session.c create mode 100644 quake3/source/code/game/g_spawn.c create mode 100644 quake3/source/code/game/g_svcmds.c create mode 100644 quake3/source/code/game/g_syscalls.asm create mode 100644 quake3/source/code/game/g_syscalls.c create mode 100644 quake3/source/code/game/g_target.c create mode 100644 quake3/source/code/game/g_team.c create mode 100644 quake3/source/code/game/g_team.h create mode 100644 quake3/source/code/game/g_trigger.c create mode 100644 quake3/source/code/game/g_utils.c create mode 100644 quake3/source/code/game/g_weapon.c create mode 100644 quake3/source/code/game/game.bat create mode 100644 quake3/source/code/game/game.def create mode 100644 quake3/source/code/game/game.dsp create mode 100644 quake3/source/code/game/game.plg create mode 100644 quake3/source/code/game/game.q3asm create mode 100644 quake3/source/code/game/game_ta.bat create mode 100644 quake3/source/code/game/game_ta.q3asm create mode 100644 quake3/source/code/game/inv.h create mode 100644 quake3/source/code/game/match.h create mode 100644 quake3/source/code/game/q_math.c create mode 100644 quake3/source/code/game/q_shared.c create mode 100644 quake3/source/code/game/q_shared.h create mode 100644 quake3/source/code/game/surfaceflags.h create mode 100644 quake3/source/code/game/syn.h create mode 100644 quake3/source/code/q3_ui/keycodes.h create mode 100644 quake3/source/code/q3_ui/q3_ui.bat create mode 100644 quake3/source/code/q3_ui/q3_ui.dsp create mode 100644 quake3/source/code/q3_ui/q3_ui.q3asm create mode 100644 quake3/source/code/q3_ui/ui.def create mode 100644 quake3/source/code/q3_ui/ui.q3asm create mode 100644 quake3/source/code/q3_ui/ui_addbots.c create mode 100644 quake3/source/code/q3_ui/ui_atoms.c create mode 100644 quake3/source/code/q3_ui/ui_cdkey.c create mode 100644 quake3/source/code/q3_ui/ui_cinematics.c create mode 100644 quake3/source/code/q3_ui/ui_confirm.c create mode 100644 quake3/source/code/q3_ui/ui_connect.c create mode 100644 quake3/source/code/q3_ui/ui_controls2.c create mode 100644 quake3/source/code/q3_ui/ui_credits.c create mode 100644 quake3/source/code/q3_ui/ui_demo2.c create mode 100644 quake3/source/code/q3_ui/ui_display.c create mode 100644 quake3/source/code/q3_ui/ui_gameinfo.c create mode 100644 quake3/source/code/q3_ui/ui_ingame.c create mode 100644 quake3/source/code/q3_ui/ui_loadconfig.c create mode 100644 quake3/source/code/q3_ui/ui_local.h create mode 100644 quake3/source/code/q3_ui/ui_login.c create mode 100644 quake3/source/code/q3_ui/ui_main.c create mode 100644 quake3/source/code/q3_ui/ui_menu.c create mode 100644 quake3/source/code/q3_ui/ui_mfield.c create mode 100644 quake3/source/code/q3_ui/ui_mods.c create mode 100644 quake3/source/code/q3_ui/ui_network.c create mode 100644 quake3/source/code/q3_ui/ui_options.c create mode 100644 quake3/source/code/q3_ui/ui_playermodel.c create mode 100644 quake3/source/code/q3_ui/ui_players.c create mode 100644 quake3/source/code/q3_ui/ui_playersettings.c create mode 100644 quake3/source/code/q3_ui/ui_preferences.c create mode 100644 quake3/source/code/q3_ui/ui_qmenu.c create mode 100644 quake3/source/code/q3_ui/ui_rankings.c create mode 100644 quake3/source/code/q3_ui/ui_rankstatus.c create mode 100644 quake3/source/code/q3_ui/ui_removebots.c create mode 100644 quake3/source/code/q3_ui/ui_saveconfig.c create mode 100644 quake3/source/code/q3_ui/ui_serverinfo.c create mode 100644 quake3/source/code/q3_ui/ui_servers2.c create mode 100644 quake3/source/code/q3_ui/ui_setup.c create mode 100644 quake3/source/code/q3_ui/ui_signup.c create mode 100644 quake3/source/code/q3_ui/ui_sound.c create mode 100644 quake3/source/code/q3_ui/ui_sparena.c create mode 100644 quake3/source/code/q3_ui/ui_specifyleague.c create mode 100644 quake3/source/code/q3_ui/ui_specifyserver.c create mode 100644 quake3/source/code/q3_ui/ui_splevel.c create mode 100644 quake3/source/code/q3_ui/ui_sppostgame.c create mode 100644 quake3/source/code/q3_ui/ui_spreset.c create mode 100644 quake3/source/code/q3_ui/ui_spskill.c create mode 100644 quake3/source/code/q3_ui/ui_startserver.c create mode 100644 quake3/source/code/q3_ui/ui_team.c create mode 100644 quake3/source/code/q3_ui/ui_teamorders.c create mode 100644 quake3/source/code/q3_ui/ui_video.c create mode 100644 quake3/source/code/quake3sdk.dsw create mode 100644 quake3/source/code/quake3sdk.ncb create mode 100644 quake3/source/code/quake3sdk.opt create mode 100644 quake3/source/code/ui/Debug_TA/bg_misc.obj create mode 100644 quake3/source/code/ui/Debug_TA/bg_misc.sbr create mode 100644 quake3/source/code/ui/Debug_TA/q_math.obj create mode 100644 quake3/source/code/ui/Debug_TA/q_math.sbr create mode 100644 quake3/source/code/ui/Debug_TA/q_shared.obj create mode 100644 quake3/source/code/ui/Debug_TA/q_shared.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui.bsc create mode 100644 quake3/source/code/ui/Debug_TA/ui.pch create mode 100644 quake3/source/code/ui/Debug_TA/ui_atoms.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_atoms.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui_gameinfo.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_gameinfo.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui_main.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_main.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui_players.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_players.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui_shared.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_shared.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui_syscalls.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_syscalls.sbr create mode 100644 quake3/source/code/ui/Debug_TA/ui_util.obj create mode 100644 quake3/source/code/ui/Debug_TA/ui_util.sbr create mode 100644 quake3/source/code/ui/Debug_TA/vc50.idb create mode 100644 quake3/source/code/ui/keycodes.h create mode 100644 quake3/source/code/ui/ui.bat create mode 100644 quake3/source/code/ui/ui.def create mode 100644 quake3/source/code/ui/ui.dsp create mode 100644 quake3/source/code/ui/ui.plg create mode 100644 quake3/source/code/ui/ui.q3asm create mode 100644 quake3/source/code/ui/ui_atoms.c create mode 100644 quake3/source/code/ui/ui_gameinfo.c create mode 100644 quake3/source/code/ui/ui_local.h create mode 100644 quake3/source/code/ui/ui_main.c create mode 100644 quake3/source/code/ui/ui_players.c create mode 100644 quake3/source/code/ui/ui_public.h create mode 100644 quake3/source/code/ui/ui_shared.c create mode 100644 quake3/source/code/ui/ui_shared.h create mode 100644 quake3/source/code/ui/ui_syscalls.asm create mode 100644 quake3/source/code/ui/ui_syscalls.c create mode 100644 quake3/source/code/ui/ui_util.c create mode 100644 quake3/source/lcc/COPYRIGHT create mode 100644 quake3/source/lcc/LOG create mode 100644 quake3/source/lcc/README create mode 100644 quake3/source/lcc/README.Id create mode 100644 quake3/source/lcc/alpha/osf/tst/8q.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/8q.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/8q.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/array.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/array.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/array.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/cf.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/cf.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/cf.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/cq.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/cq.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/cq.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/cvt.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/cvt.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/cvt.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/fields.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/fields.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/fields.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/front.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/front.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/incr.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/incr.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/incr.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/init.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/init.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/init.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/limits.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/limits.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/limits.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/paranoia.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/paranoia.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/paranoia.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/sort.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/sort.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/sort.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/spill.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/spill.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/spill.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/stdarg.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/stdarg.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/stdarg.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/struct.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/struct.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/struct.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/switch.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/switch.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/switch.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/wf1.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/wf1.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/wf1.sbk create mode 100644 quake3/source/lcc/alpha/osf/tst/yacc.1bk create mode 100644 quake3/source/lcc/alpha/osf/tst/yacc.2bk create mode 100644 quake3/source/lcc/alpha/osf/tst/yacc.sbk create mode 100644 quake3/source/lcc/buildnt.bat create mode 100644 quake3/source/lcc/buildnt.sh create mode 100644 quake3/source/lcc/cpp/cpp.c create mode 100644 quake3/source/lcc/cpp/cpp.h create mode 100644 quake3/source/lcc/cpp/eval.c create mode 100644 quake3/source/lcc/cpp/getopt.c create mode 100644 quake3/source/lcc/cpp/hideset.c create mode 100644 quake3/source/lcc/cpp/include.c create mode 100644 quake3/source/lcc/cpp/lex.c create mode 100644 quake3/source/lcc/cpp/macro.c create mode 100644 quake3/source/lcc/cpp/nlist.c create mode 100644 quake3/source/lcc/cpp/tokens.c create mode 100644 quake3/source/lcc/cpp/unix.c create mode 100644 quake3/source/lcc/custom.mk create mode 100644 quake3/source/lcc/doc/4.html create mode 100644 quake3/source/lcc/doc/bprint.1 create mode 100644 quake3/source/lcc/doc/bprint.pdf create mode 100644 quake3/source/lcc/doc/install.html create mode 100644 quake3/source/lcc/doc/lcc.1 create mode 100644 quake3/source/lcc/doc/lcc.pdf create mode 100644 quake3/source/lcc/etc/bprint.c create mode 100644 quake3/source/lcc/etc/gcc-solaris.c create mode 100644 quake3/source/lcc/etc/irix.c create mode 100644 quake3/source/lcc/etc/lcc.c create mode 100644 quake3/source/lcc/etc/linux.c create mode 100644 quake3/source/lcc/etc/ops.c create mode 100644 quake3/source/lcc/etc/osf.c create mode 100644 quake3/source/lcc/etc/solaris.c create mode 100644 quake3/source/lcc/etc/win32.c create mode 100644 quake3/source/lcc/include/alpha/osf/assert.h create mode 100644 quake3/source/lcc/include/alpha/osf/ctype.h create mode 100644 quake3/source/lcc/include/alpha/osf/errno.h create mode 100644 quake3/source/lcc/include/alpha/osf/float.h create mode 100644 quake3/source/lcc/include/alpha/osf/limits.h create mode 100644 quake3/source/lcc/include/alpha/osf/locale.h create mode 100644 quake3/source/lcc/include/alpha/osf/math.h create mode 100644 quake3/source/lcc/include/alpha/osf/setjmp.h create mode 100644 quake3/source/lcc/include/alpha/osf/signal.h create mode 100644 quake3/source/lcc/include/alpha/osf/stdarg.h create mode 100644 quake3/source/lcc/include/alpha/osf/stddef.h create mode 100644 quake3/source/lcc/include/alpha/osf/stdio.h create mode 100644 quake3/source/lcc/include/alpha/osf/stdlib.h create mode 100644 quake3/source/lcc/include/alpha/osf/string.h create mode 100644 quake3/source/lcc/include/alpha/osf/time.h create mode 100644 quake3/source/lcc/include/mips/irix/assert.h create mode 100644 quake3/source/lcc/include/mips/irix/ctype.h create mode 100644 quake3/source/lcc/include/mips/irix/errno.h create mode 100644 quake3/source/lcc/include/mips/irix/float.h create mode 100644 quake3/source/lcc/include/mips/irix/limits.h create mode 100644 quake3/source/lcc/include/mips/irix/locale.h create mode 100644 quake3/source/lcc/include/mips/irix/math.h create mode 100644 quake3/source/lcc/include/mips/irix/setjmp.h create mode 100644 quake3/source/lcc/include/mips/irix/signal.h create mode 100644 quake3/source/lcc/include/mips/irix/stdarg.h create mode 100644 quake3/source/lcc/include/mips/irix/stddef.h create mode 100644 quake3/source/lcc/include/mips/irix/stdio.h create mode 100644 quake3/source/lcc/include/mips/irix/stdlib.h create mode 100644 quake3/source/lcc/include/mips/irix/string.h create mode 100644 quake3/source/lcc/include/mips/irix/time.h create mode 100644 quake3/source/lcc/include/sparc/solaris/assert.h create mode 100644 quake3/source/lcc/include/sparc/solaris/ctype.h create mode 100644 quake3/source/lcc/include/sparc/solaris/errno.h create mode 100644 quake3/source/lcc/include/sparc/solaris/float.h create mode 100644 quake3/source/lcc/include/sparc/solaris/limits.h create mode 100644 quake3/source/lcc/include/sparc/solaris/locale.h create mode 100644 quake3/source/lcc/include/sparc/solaris/math.h create mode 100644 quake3/source/lcc/include/sparc/solaris/setjmp.h create mode 100644 quake3/source/lcc/include/sparc/solaris/signal.h create mode 100644 quake3/source/lcc/include/sparc/solaris/stdarg.h create mode 100644 quake3/source/lcc/include/sparc/solaris/stddef.h create mode 100644 quake3/source/lcc/include/sparc/solaris/stdio.h create mode 100644 quake3/source/lcc/include/sparc/solaris/stdlib.h create mode 100644 quake3/source/lcc/include/sparc/solaris/string.h create mode 100644 quake3/source/lcc/include/sparc/solaris/time.h create mode 100644 quake3/source/lcc/include/x86/linux/assert.h create mode 100644 quake3/source/lcc/include/x86/linux/float.h create mode 100644 quake3/source/lcc/include/x86/linux/stdarg.h create mode 100644 quake3/source/lcc/lburg/gram.c create mode 100644 quake3/source/lcc/lburg/gram.y create mode 100644 quake3/source/lcc/lburg/lburg.1 create mode 100644 quake3/source/lcc/lburg/lburg.c create mode 100644 quake3/source/lcc/lburg/lburg.h create mode 100644 quake3/source/lcc/lib/assert.c create mode 100644 quake3/source/lcc/lib/bbexit.c create mode 100644 quake3/source/lcc/lib/yynull.c create mode 100644 quake3/source/lcc/makefile create mode 100644 quake3/source/lcc/makefile.nt create mode 100644 quake3/source/lcc/mips/irix/tst/8q.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/8q.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/8q.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/array.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/array.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/array.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/cf.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/cf.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/cf.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/cq.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/cq.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/cq.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/cvt.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/cvt.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/cvt.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/fields.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/fields.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/fields.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/front.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/front.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/incr.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/incr.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/init.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/init.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/init.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/limits.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/limits.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/limits.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/paranoia.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/paranoia.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/paranoia.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/sort.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/sort.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/sort.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/spill.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/spill.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/stdarg.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/stdarg.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/stdarg.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/struct.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/struct.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/struct.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/switch.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/switch.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/switch.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/wf1.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/wf1.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/wf1.sbk create mode 100644 quake3/source/lcc/mips/irix/tst/yacc.1bk create mode 100644 quake3/source/lcc/mips/irix/tst/yacc.2bk create mode 100644 quake3/source/lcc/mips/irix/tst/yacc.sbk create mode 100644 quake3/source/lcc/msdev/rcc.dsp create mode 100644 quake3/source/lcc/msdev/rcc.dsw create mode 100644 quake3/source/lcc/packing.lst create mode 100644 quake3/source/lcc/sparc/solaris/tst/8q.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/8q.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/8q.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/array.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/array.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/array.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cf.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cf.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cf.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cq.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cq.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cq.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cvt.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cvt.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/cvt.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/fields.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/fields.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/fields.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/front.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/front.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/incr.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/incr.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/incr.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/init.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/init.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/init.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/limits.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/limits.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/limits.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/paranoia.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/paranoia.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/paranoia.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/sort.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/sort.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/sort.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/spill.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/spill.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/spill.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/stdarg.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/stdarg.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/stdarg.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/struct.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/struct.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/struct.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/switch.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/switch.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/switch.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/wf1.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/wf1.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/wf1.sbk create mode 100644 quake3/source/lcc/sparc/solaris/tst/yacc.1bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/yacc.2bk create mode 100644 quake3/source/lcc/sparc/solaris/tst/yacc.sbk create mode 100644 quake3/source/lcc/src/2html.c create mode 100644 quake3/source/lcc/src/alloc.c create mode 100644 quake3/source/lcc/src/alpha.md create mode 100644 quake3/source/lcc/src/asdl.c create mode 100644 quake3/source/lcc/src/bind.c create mode 100644 quake3/source/lcc/src/bytecode.c create mode 100644 quake3/source/lcc/src/c.h create mode 100644 quake3/source/lcc/src/config.h create mode 100644 quake3/source/lcc/src/dag.c create mode 100644 quake3/source/lcc/src/dagcheck.md create mode 100644 quake3/source/lcc/src/decl.c create mode 100644 quake3/source/lcc/src/enode.c create mode 100644 quake3/source/lcc/src/error.c create mode 100644 quake3/source/lcc/src/event.c create mode 100644 quake3/source/lcc/src/expr.c create mode 100644 quake3/source/lcc/src/gen.c create mode 100644 quake3/source/lcc/src/init.c create mode 100644 quake3/source/lcc/src/inits.c create mode 100644 quake3/source/lcc/src/input.c create mode 100644 quake3/source/lcc/src/lex.c create mode 100644 quake3/source/lcc/src/list.c create mode 100644 quake3/source/lcc/src/main.c create mode 100644 quake3/source/lcc/src/mips.md create mode 100644 quake3/source/lcc/src/null.c create mode 100644 quake3/source/lcc/src/output.c create mode 100644 quake3/source/lcc/src/pass2.c create mode 100644 quake3/source/lcc/src/prof.c create mode 100644 quake3/source/lcc/src/profio.c create mode 100644 quake3/source/lcc/src/rcc.asdl create mode 100644 quake3/source/lcc/src/run.sh create mode 100644 quake3/source/lcc/src/simp.c create mode 100644 quake3/source/lcc/src/sparc.md create mode 100644 quake3/source/lcc/src/stab.c create mode 100644 quake3/source/lcc/src/stab.h create mode 100644 quake3/source/lcc/src/stmt.c create mode 100644 quake3/source/lcc/src/string.c create mode 100644 quake3/source/lcc/src/sym.c create mode 100644 quake3/source/lcc/src/symbolic.c create mode 100644 quake3/source/lcc/src/token.h create mode 100644 quake3/source/lcc/src/trace.c create mode 100644 quake3/source/lcc/src/tree.c create mode 100644 quake3/source/lcc/src/types.c create mode 100644 quake3/source/lcc/src/x86.md create mode 100644 quake3/source/lcc/src/x86linux.md create mode 100644 quake3/source/lcc/tst/8q.0 create mode 100644 quake3/source/lcc/tst/8q.c create mode 100644 quake3/source/lcc/tst/array.0 create mode 100644 quake3/source/lcc/tst/array.c create mode 100644 quake3/source/lcc/tst/cf.0 create mode 100644 quake3/source/lcc/tst/cf.c create mode 100644 quake3/source/lcc/tst/cq.0 create mode 100644 quake3/source/lcc/tst/cq.c create mode 100644 quake3/source/lcc/tst/cvt.0 create mode 100644 quake3/source/lcc/tst/cvt.c create mode 100644 quake3/source/lcc/tst/fields.0 create mode 100644 quake3/source/lcc/tst/fields.c create mode 100644 quake3/source/lcc/tst/front.0 create mode 100644 quake3/source/lcc/tst/front.c create mode 100644 quake3/source/lcc/tst/incr.0 create mode 100644 quake3/source/lcc/tst/incr.c create mode 100644 quake3/source/lcc/tst/init.0 create mode 100644 quake3/source/lcc/tst/init.c create mode 100644 quake3/source/lcc/tst/limits.0 create mode 100644 quake3/source/lcc/tst/limits.c create mode 100644 quake3/source/lcc/tst/paranoia.0 create mode 100644 quake3/source/lcc/tst/paranoia.c create mode 100644 quake3/source/lcc/tst/sort.0 create mode 100644 quake3/source/lcc/tst/sort.c create mode 100644 quake3/source/lcc/tst/spill.0 create mode 100644 quake3/source/lcc/tst/spill.c create mode 100644 quake3/source/lcc/tst/stdarg.0 create mode 100644 quake3/source/lcc/tst/stdarg.c create mode 100644 quake3/source/lcc/tst/struct.0 create mode 100644 quake3/source/lcc/tst/struct.c create mode 100644 quake3/source/lcc/tst/switch.0 create mode 100644 quake3/source/lcc/tst/switch.c create mode 100644 quake3/source/lcc/tst/wf1.0 create mode 100644 quake3/source/lcc/tst/wf1.c create mode 100644 quake3/source/lcc/tst/yacc.0 create mode 100644 quake3/source/lcc/tst/yacc.c create mode 100644 quake3/source/lcc/x86/linux/tst/8q.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/8q.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/8q.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/array.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/array.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/array.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/cf.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/cf.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/cf.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/cq.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/cq.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/cq.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/cvt.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/cvt.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/cvt.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/fields.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/fields.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/fields.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/front.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/front.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/incr.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/incr.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/incr.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/init.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/init.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/init.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/limits.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/limits.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/limits.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/paranoia.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/paranoia.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/paranoia.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/sort.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/sort.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/sort.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/spill.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/spill.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/spill.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/stdarg.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/stdarg.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/stdarg.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/struct.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/struct.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/struct.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/switch.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/switch.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/switch.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/wf1.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/wf1.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/wf1.sbk create mode 100644 quake3/source/lcc/x86/linux/tst/yacc.1bk create mode 100644 quake3/source/lcc/x86/linux/tst/yacc.2bk create mode 100644 quake3/source/lcc/x86/linux/tst/yacc.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/8q.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/8q.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/8q.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/array.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/array.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/array.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/cf.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/cf.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/cf.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/cq.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/cq.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/cq.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/cvt.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/cvt.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/cvt.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/fields.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/fields.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/fields.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/front.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/front.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/incr.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/incr.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/incr.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/init.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/init.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/init.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/limits.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/limits.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/limits.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/paranoia.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/paranoia.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/paranoia.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/sort.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/sort.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/sort.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/spill.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/spill.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/spill.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/stdarg.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/stdarg.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/stdarg.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/struct.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/struct.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/struct.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/switch.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/switch.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/switch.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/wf1.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/wf1.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/wf1.sbk create mode 100644 quake3/source/lcc/x86/win32/tst/yacc.1bk create mode 100644 quake3/source/lcc/x86/win32/tst/yacc.2bk create mode 100644 quake3/source/lcc/x86/win32/tst/yacc.sbk create mode 100644 quake3/source/q3asm/Makefile create mode 100644 quake3/source/q3asm/README.Id create mode 100644 quake3/source/q3asm/cmdlib.c create mode 100644 quake3/source/q3asm/cmdlib.h create mode 100644 quake3/source/q3asm/lib.txt create mode 100644 quake3/source/q3asm/mathlib.h create mode 100644 quake3/source/q3asm/notes.txt create mode 100644 quake3/source/q3asm/ops.txt create mode 100644 quake3/source/q3asm/opstrings.h create mode 100644 quake3/source/q3asm/q3asm.c create mode 100644 quake3/source/q3asm/q3asm.dsp create mode 100644 quake3/source/q3asm/q3asm.dsw create mode 100644 quake3/source/q3asm/qfiles.h create mode 100644 quake3/source/ui/addfilter.menu create mode 100644 quake3/source/ui/botselection.menu create mode 100644 quake3/source/ui/cdkey.menu create mode 100644 quake3/source/ui/chip.menu create mode 100644 quake3/source/ui/cinematic.menu create mode 100644 quake3/source/ui/cinematicmenu.menu create mode 100644 quake3/source/ui/connect.menu create mode 100644 quake3/source/ui/controls.menu create mode 100644 quake3/source/ui/controls2.menu create mode 100644 quake3/source/ui/createfavorite.menu create mode 100644 quake3/source/ui/createserver.menu create mode 100644 quake3/source/ui/credit.menu create mode 100644 quake3/source/ui/default.menu create mode 100644 quake3/source/ui/demo.menu create mode 100644 quake3/source/ui/demo_quit.menu create mode 100644 quake3/source/ui/endofgame.menu create mode 100644 quake3/source/ui/endofgame2.menu create mode 100644 quake3/source/ui/error.menu create mode 100644 quake3/source/ui/fight.menu create mode 100644 quake3/source/ui/filter.menu create mode 100644 quake3/source/ui/findplayer.menu create mode 100644 quake3/source/ui/help.menu create mode 100644 quake3/source/ui/help2.menu create mode 100644 quake3/source/ui/hud.menu create mode 100644 quake3/source/ui/hud.txt create mode 100644 quake3/source/ui/hud2.txt create mode 100644 quake3/source/ui/hud_old.menu create mode 100644 quake3/source/ui/ingame.menu create mode 100644 quake3/source/ui/ingame.txt create mode 100644 quake3/source/ui/ingame_about.menu create mode 100644 quake3/source/ui/ingame_addbot.menu create mode 100644 quake3/source/ui/ingame_callvote.menu create mode 100644 quake3/source/ui/ingame_callvote2.menu create mode 100644 quake3/source/ui/ingame_controls.menu create mode 100644 quake3/source/ui/ingame_join.menu create mode 100644 quake3/source/ui/ingame_leave.menu create mode 100644 quake3/source/ui/ingame_options.menu create mode 100644 quake3/source/ui/ingame_orders.menu create mode 100644 quake3/source/ui/ingame_orders2.menu create mode 100644 quake3/source/ui/ingame_player.menu create mode 100644 quake3/source/ui/ingame_scoreffa.menu create mode 100644 quake3/source/ui/ingame_serverinfo.menu create mode 100644 quake3/source/ui/ingame_system.menu create mode 100644 quake3/source/ui/ingame_vote.menu create mode 100644 quake3/source/ui/ingame_vote2.menu create mode 100644 quake3/source/ui/joinserver.menu create mode 100644 quake3/source/ui/main.menu create mode 100644 quake3/source/ui/main2.menu create mode 100644 quake3/source/ui/menudef.h create mode 100644 quake3/source/ui/menus.txt create mode 100644 quake3/source/ui/min_hud.menu create mode 100644 quake3/source/ui/mod.menu create mode 100644 quake3/source/ui/newleague.menu create mode 100644 quake3/source/ui/options.menu create mode 100644 quake3/source/ui/ordershelp.menu create mode 100644 quake3/source/ui/password.menu create mode 100644 quake3/source/ui/player.menu create mode 100644 quake3/source/ui/powerup.menu create mode 100644 quake3/source/ui/powerup2.menu create mode 100644 quake3/source/ui/punkbuster.menu create mode 100644 quake3/source/ui/quake3.menu create mode 100644 quake3/source/ui/quit.menu create mode 100644 quake3/source/ui/quitcredit.menu create mode 100644 quake3/source/ui/rankings.menu create mode 100644 quake3/source/ui/resetscore.menu create mode 100644 quake3/source/ui/score.menu create mode 100644 quake3/source/ui/score_results.menu create mode 100644 quake3/source/ui/serverinfo.menu create mode 100644 quake3/source/ui/serverinfo_old.menu create mode 100644 quake3/source/ui/setup.menu create mode 100644 quake3/source/ui/skirmish.menu create mode 100644 quake3/source/ui/small.menu create mode 100644 quake3/source/ui/system.menu create mode 100644 quake3/source/ui/team.menu create mode 100644 quake3/source/ui/teamscore.menu create mode 100644 quake3/source/ui/testhud.menu create mode 100644 quake3/source/ui/vid_restart.menu diff --git a/Readme Painkeep Arena Source Info.txt b/Readme Painkeep Arena Source Info.txt new file mode 100644 index 0000000..6b351b1 --- /dev/null +++ b/Readme Painkeep Arena Source Info.txt @@ -0,0 +1,107 @@ +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- +PainKeep Arena 3.0n Source Release +Release Date: September 27,2007 + +Materials in this release are based on the +PainKeep Arena 3.0n Full Release - March 19, 2004 +Copyright (c)2007-2008 Team Evolve. +All rights reserved. +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- + +Team Evolve: +Team Evolve Web Site - http://www.teamevolve.com + +Community Information: +http://www.groundplan.com/gplan_forum + +--------------------------------------------------------------------------- + +Team Evolve welcomes you to the source files of PainKeep Arena! We release this information in the hopes that it will contribute to the gaming community with a jumpstart into the next generation of online games. Should you use any information within the source files toward your game then please give credit to Team Evolve in the form of a textual reference in the public readme file. + +Team Evolve releases the source in an AS-IS form and will not support nor answer any questions into its workings. Team Evolve will not support nor be responsible in any way to extensions made to Painkeep Arena from third party modifications to source or content. + +--------------------------------------------------------------------------- + +PainKeep Arena is based on the 1.32 version of Quake III Arena. IMPORTANT: In order to use any modification to the PainKeep Arena source code will require: 1) Quake III Arena 1.32 installed and 2) the Full Install of PainKeep Arena 3.0n. + +This help document is based on Windows XP SP2. If you use another OS then you will need to adjust search PATH information accordingly. + +The PainKeep Arena source code is based on the GAME Source released by id Software. PainKeep Arena source must be installed into the same place as the id software GAME Source, C:\QUAKE3, in order for the lcc and q3cpp compilation paths to be correct. + +You must place the compilation executables in your system’s path. The lcc executable is located in c:\quake3\bin_nt directory. Add to your systems path using the Control Panel’s System tool, select the Advanced Tab and then click on the “Environment Variables” Button. Under the “Systems Variables”, select “Path” and Click the “Edit” button to add to the end of the existing path line - “;c:\quake3\bin_nt” - {without the quotes, of course}. Click OK a few time to save the new Path setting. You may need to reboot Windows for new Path setting to be recognized by the system. + +The PainKeep Arena source code contains the procedures and logic that govern the User Interface, Game Logic, Client Presentation. Each section is primarily controlled by a specific directory within the source code… +User Interface - c:\quake3\source\code\ui\ +Game Logic - c:\quake3\source\code\game\ +Client Presentation - c:\quake3\source\code\cgame\ + +Please note that some modifications to the User Interface will require changes in Client Presentation area. + +PainKeep Arena uses QVM files to hold the compiled game code. Each section (User Interface, Game Logic, Client Presentation) has an associated and separate QVM file. To create, (or compile), a new QVM, each section have a .BAT file that can be used to generate a new QVM. + +To compile a new… +User Interface: + execute c:\quake3\source\code\ui\ui.bat +Game Logic: + execute c:\quake3\source\code\game\game.bat +Client Presentation: + execute c:\quake3\source\code\cgame\cgame.bat + +The GAME and CLIENT QVM files will be generated in directory: + c:\quake3\baseq3\vm\ + gagame.qvm + cgame.qvm + +The USER INTERFACE QVM file will be generated in directory: + c:\quake3\missionpack\vm\ + ui.qvm + +After you make your QVM files you will need to make a .PK3 file that holds your newly generated QVMs and any other Modification materials. Please note that .PK3 files can be managed by ZIP tools. + +Create a .PK3 file with the new QVM files in a \vm subdirectory. + +Place the newly generated .PK3 file into your mod (or \PKARENA) directory under the Quake III Arena Execution directory. Reminder, Quake III Arena will use the .PK3 File’s material that comes last alphabetically. For example if you make a simple MOD for PainKeep Arena, place your materials in… + ..\Quake III Arena\pkarena\zpktext.pk3 + (in this example zpktest.pk3 will be loaded last and your updates will act as the effective .QVM files) + +Good Luck! +Yours, Team Evolve and Ergodic + +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- + +THE LEGAL CRAP +------------------- + + +A. Copyright Notice +This production in its entirety and all derivative works are copyright (c)2007-2008 Team Evolve. All rights reserved. + + + + +Ownership of all new components, including, but not limited to; source code, compiled code, graphics, textures, sounds, models and maps, remain with Team Evolve and the individual authors respectively. Some components are the exclusive property of their authors and owners and are used with kind permission. +All original components are copyright (c)2001, iD Software. +Quake III Arena and the stylized 'Q' are trademarks of iD Software. + + + +All other trademarks are property of their respective owners and are hereby acknowledged. + + +B. Distribution and Usage Permissions +Team Evolve grants to the final end user an exclusive right to use this production for the purposes of personal entertainment only. Team Evolve grants to the final end user an exclusive right to freely distribute this production in its undisturbed and unaltered entirety provided no exchange, monetary or otherwise, is requested. All other media entities are expressly excluded from this right prior to acknowledge and consent from Team Evolve or one of Team Evolve's duly appointed representatives, agents or subsidiaries. + +By using this product you agree to exempt, without reservation, the authors and +owners of this production or components thereof from any responsibility for liability, damage caused, or loss, directly or indirectly, by this software, including but not limited to, any interruptions of service, loss of business, or any other consequential damages resulting from the use of or operation of this product or components thereof. + +No warranties are made, expressed or implied, regarding the usage, functionality, or implied operability of this product. All elements are available solely on an +"as-is" basis. Usage is subject to the user's own risk. + +New or altered source code components are included with kind permission of the respective authors and owners and are provided with the only intention of facilitating in the integration of this production, or components thereof, with other such freely available and non-commercial productions. Authors are expressly forbidden to use these components, or any other component of this production, as a basis for other commercially available works or demonstration systems without prior acknowledge and consent from Team Evolve or one of Team Evolve's duly appointed representatives, agents or subsidiaries. +------------------------------------------------------------------------------------- + +PainKeep Arena is RATED M: Mature Audiences Only + diff --git a/quake3/Readme PainKeep Arena 3_1.txt b/quake3/Readme PainKeep Arena 3_1.txt new file mode 100644 index 0000000..81a7715 --- /dev/null +++ b/quake3/Readme PainKeep Arena 3_1.txt @@ -0,0 +1,62 @@ +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- +PainKeep Arena 3.0 Full Release is RATED M: Mature Audiences Only +--------------------------------------------------------------------------- + + +PainKeep Arena 3.0 Full Release - March 19, 2004 +Copyright (c)2004-2005 Team Evolve. +All rights reserved. + + +Team Evolve: +Team Evolve Web Site - http://www.team-evolve.com + +Find help & Post Bug Comments at: +http://www.groundplan.com/gplan_forum +--------------------------------------------------------------------------- + +For information regarding PainKeep Arena please view the PKA Manual by opening the +file index.html in the /pkamanual directory. A typical installation will locate the +help manual in the following location: + +/quake III arena/pkarena/pkamanual/index.html + + + + + +VIII. THE LEGAL CRAP +------------------- + + +A. Copyright Notice +This production in its entirety and all derivative works are copyright (c)2004-2005 Team Evolve. All rights reserved. + + + + +Ownership of all new components, including, but not limited to; source code, compiled code, graphics, textures, sounds, models and maps, remain with Team Evolve and the individual authors respectively. Some components are the exclusive property of their authors and owners and are used with kind permission. +All original components are copyright (c)2001, iD Software. +Quake III Arena and the stylized 'Q' are trademarks of iD Software. + + + +All other trademarks are property of their respective owners and are hereby acknowledged. + + +B. Distribution and Usage Permissions +Team Evolve grants to the final end user an exclusive right to use this production for the purposes of personal entertainment only. Team Evolve grants to the final end user an exclusive right to freely distribute this production in its undisturbed and unaltered entirety provided no exchange, monetary or otherwise, is requested. All other media entities are expressly excluded from this right prior to acknowledge and consent from Team Evolve or one of Team Evolve's duly appointed representatives, agents or subsidiaries. + +By using this product you agree to exempt, without reservation, the authors and +owners of this production or components thereof from any responsibility for liability, damage caused, or loss, directly or indirectly, by this software, including but not limited to, any interruptions of service, loss of business, or any other consequential damages resulting from the use of or operation of this product or components thereof. + +No warranties are made, expressed or implied, regarding the usage, functionality, or implied operability of this product. All elements are available solely on an +"as-is" basis. Usage is subject to the user's own risk. + +New or altered source code components are included with kind permission of the respective authors and owners and are provided with the only intention of facilitating in the integration of this production, or components thereof, with other such freely available and non-commercial productions. Authors are expressly forbidden to use these components, or any other component of this production, as a basis for other commercially available works or demonstration systems without prior acknowledge and consent from Team Evolve or one of Team Evolve's duly appointed representatives, agents or subsidiaries. +------------------------------------------------------------------------------------- + +PainKeep Arena is RATED M: Mature Audiences Only + +Now Bring on the killing! diff --git a/quake3/Readme Painkeep Arena Source Info.txt b/quake3/Readme Painkeep Arena Source Info.txt new file mode 100644 index 0000000..6b351b1 --- /dev/null +++ b/quake3/Readme Painkeep Arena Source Info.txt @@ -0,0 +1,107 @@ +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- +PainKeep Arena 3.0n Source Release +Release Date: September 27,2007 + +Materials in this release are based on the +PainKeep Arena 3.0n Full Release - March 19, 2004 +Copyright (c)2007-2008 Team Evolve. +All rights reserved. +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- + +Team Evolve: +Team Evolve Web Site - http://www.teamevolve.com + +Community Information: +http://www.groundplan.com/gplan_forum + +--------------------------------------------------------------------------- + +Team Evolve welcomes you to the source files of PainKeep Arena! We release this information in the hopes that it will contribute to the gaming community with a jumpstart into the next generation of online games. Should you use any information within the source files toward your game then please give credit to Team Evolve in the form of a textual reference in the public readme file. + +Team Evolve releases the source in an AS-IS form and will not support nor answer any questions into its workings. Team Evolve will not support nor be responsible in any way to extensions made to Painkeep Arena from third party modifications to source or content. + +--------------------------------------------------------------------------- + +PainKeep Arena is based on the 1.32 version of Quake III Arena. IMPORTANT: In order to use any modification to the PainKeep Arena source code will require: 1) Quake III Arena 1.32 installed and 2) the Full Install of PainKeep Arena 3.0n. + +This help document is based on Windows XP SP2. If you use another OS then you will need to adjust search PATH information accordingly. + +The PainKeep Arena source code is based on the GAME Source released by id Software. PainKeep Arena source must be installed into the same place as the id software GAME Source, C:\QUAKE3, in order for the lcc and q3cpp compilation paths to be correct. + +You must place the compilation executables in your system’s path. The lcc executable is located in c:\quake3\bin_nt directory. Add to your systems path using the Control Panel’s System tool, select the Advanced Tab and then click on the “Environment Variables” Button. Under the “Systems Variables”, select “Path” and Click the “Edit” button to add to the end of the existing path line - “;c:\quake3\bin_nt” - {without the quotes, of course}. Click OK a few time to save the new Path setting. You may need to reboot Windows for new Path setting to be recognized by the system. + +The PainKeep Arena source code contains the procedures and logic that govern the User Interface, Game Logic, Client Presentation. Each section is primarily controlled by a specific directory within the source code… +User Interface - c:\quake3\source\code\ui\ +Game Logic - c:\quake3\source\code\game\ +Client Presentation - c:\quake3\source\code\cgame\ + +Please note that some modifications to the User Interface will require changes in Client Presentation area. + +PainKeep Arena uses QVM files to hold the compiled game code. Each section (User Interface, Game Logic, Client Presentation) has an associated and separate QVM file. To create, (or compile), a new QVM, each section have a .BAT file that can be used to generate a new QVM. + +To compile a new… +User Interface: + execute c:\quake3\source\code\ui\ui.bat +Game Logic: + execute c:\quake3\source\code\game\game.bat +Client Presentation: + execute c:\quake3\source\code\cgame\cgame.bat + +The GAME and CLIENT QVM files will be generated in directory: + c:\quake3\baseq3\vm\ + gagame.qvm + cgame.qvm + +The USER INTERFACE QVM file will be generated in directory: + c:\quake3\missionpack\vm\ + ui.qvm + +After you make your QVM files you will need to make a .PK3 file that holds your newly generated QVMs and any other Modification materials. Please note that .PK3 files can be managed by ZIP tools. + +Create a .PK3 file with the new QVM files in a \vm subdirectory. + +Place the newly generated .PK3 file into your mod (or \PKARENA) directory under the Quake III Arena Execution directory. Reminder, Quake III Arena will use the .PK3 File’s material that comes last alphabetically. For example if you make a simple MOD for PainKeep Arena, place your materials in… + ..\Quake III Arena\pkarena\zpktext.pk3 + (in this example zpktest.pk3 will be loaded last and your updates will act as the effective .QVM files) + +Good Luck! +Yours, Team Evolve and Ergodic + +--------------------------------------------------------------------------- +--------------------------------------------------------------------------- + +THE LEGAL CRAP +------------------- + + +A. Copyright Notice +This production in its entirety and all derivative works are copyright (c)2007-2008 Team Evolve. All rights reserved. + + + + +Ownership of all new components, including, but not limited to; source code, compiled code, graphics, textures, sounds, models and maps, remain with Team Evolve and the individual authors respectively. Some components are the exclusive property of their authors and owners and are used with kind permission. +All original components are copyright (c)2001, iD Software. +Quake III Arena and the stylized 'Q' are trademarks of iD Software. + + + +All other trademarks are property of their respective owners and are hereby acknowledged. + + +B. Distribution and Usage Permissions +Team Evolve grants to the final end user an exclusive right to use this production for the purposes of personal entertainment only. Team Evolve grants to the final end user an exclusive right to freely distribute this production in its undisturbed and unaltered entirety provided no exchange, monetary or otherwise, is requested. All other media entities are expressly excluded from this right prior to acknowledge and consent from Team Evolve or one of Team Evolve's duly appointed representatives, agents or subsidiaries. + +By using this product you agree to exempt, without reservation, the authors and +owners of this production or components thereof from any responsibility for liability, damage caused, or loss, directly or indirectly, by this software, including but not limited to, any interruptions of service, loss of business, or any other consequential damages resulting from the use of or operation of this product or components thereof. + +No warranties are made, expressed or implied, regarding the usage, functionality, or implied operability of this product. All elements are available solely on an +"as-is" basis. Usage is subject to the user's own risk. + +New or altered source code components are included with kind permission of the respective authors and owners and are provided with the only intention of facilitating in the integration of this production, or components thereof, with other such freely available and non-commercial productions. Authors are expressly forbidden to use these components, or any other component of this production, as a basis for other commercially available works or demonstration systems without prior acknowledge and consent from Team Evolve or one of Team Evolve's duly appointed representatives, agents or subsidiaries. +------------------------------------------------------------------------------------- + +PainKeep Arena is RATED M: Mature Audiences Only + diff --git a/quake3/bin_nt/lcc.exe b/quake3/bin_nt/lcc.exe new file mode 100644 index 0000000000000000000000000000000000000000..ff0b286410028ec453a826ea8f4a0fb38a313170 GIT binary patch literal 135223 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 literal 0 HcmV?d00001 diff --git a/quake3/bin_nt/q3asm.exe b/quake3/bin_nt/q3asm.exe new file mode 100644 index 0000000000000000000000000000000000000000..ba9fd3d67375fefdcfbc81ec8dbb1d112fa6a181 GIT binary patch literal 69632 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%0D6rI= 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 NSg5vca$Ha4e*krB7{vep literal 0 HcmV?d00001 diff --git a/quake3/bin_nt/q3rcc.exe b/quake3/bin_nt/q3rcc.exe new file mode 100644 index 0000000000000000000000000000000000000000..8f09cab7309b0d43715f10a08e9ad22738290fd4 GIT binary patch literal 847929 zcmeFadwg6~xi`L(OxkHO=}aM^1p*B;K%u1s%cX4^NJB?MX>cYGtlTdJc0+|)X0Slh z3psiljJ!|cTD>qpMmSqL-85yyxPWjrKpXzIGyYNc6zx%>l@O$z#i3^wD_q=QGl;2-pbJv9pa=-Gz znfSf##+4V|gWtwwH`%PigE$toti^eS)}F>EYP_^wYhqq;-Z;zJGr_XD*lWw`y&v}x zULcLV<~2UV2micZ>&X)R3~9O~GBGc|H6Zx-;ok4a2Fn--SQ*nIAZF$ zyb^0k-Vq;3;;h8Ys}i`neFyqOxY$<%pI55FvaX-Ca_J3;8!YS4F-T?Kk*INiU-MTB zgv`>}tja_ANG-CgnECZG;TQS3W-ZehyMlaRa1{&j#{a8jzLhsGzvCv$D!d=bz=5?1 zztv zo`eeJHutN^?RWai-DuEJd8z1dW`f%=?4uST zmT{J|Gt}0V%+KU!_Ap!cGY_He=BsmZl}fH)Dmv)23|fhCZqwi^`Db-UhuAB$5*>27 z(BP2UFyzdCz3RM0mX%oOHsR(M=g7_Z$l``x=99Qzud_WESI6E=0D=Hu5(>BhDX@9p zC5tV<^EK04!{94AlWRq}+zjz~YJqT9?6*ywZx zW47&QQjbd}dxf9!OGycKM~6*UfU5087@!37x+_!N=&%R9y}>X0MO|CwC(U_kQkthfYmvFM5+W%`IV~bN4DMalBW9 zTT*dgF)&po`5RZEV=6KkmDUWSHY;&dv(;>M@H(bGf2Z`RxuV&!dy%3(a=i?xX&_nR z)U0Al;nvsD#qMYyJKEmR7q?d)Uu!iNxMjP~SY$P-XRc*Ek@jd`%zIL@6Hnsmv-*i! zMxatnsyo`xIy$EFHaegi%3nLdG=z~iU0Pu!<`7c59y!&Mw+U8axIc&Yo6No2)YsS^ zRWV&^B)-DgS(>TTeRu9b9aC5b|HtN1-)RCR7$jZaY^l4-*hFAfIm~{iu7viZf5BwbIi8y8RRZ&$5$CFb(u< zE_KUDc0`$6qz@J%`_s&h$XOV>B5azFb~9SP>{%G=D}^loN;ZZuN>|JMo#dIRG zI66peR~5}t^P4AJef}aVJ%h!A_P)`@ zpYw``+rEOKv3qkLi@1AXnbeYsDyKzR$?V|rsS#>@KCp8%u#hiDT?P5lpyKM8TUkLs zI%5Zlb7r5^f2Ee^Uj38p&k>Fw^4X>MQZESi2&HcW_d)lkumW#58&$txkJ`XlNiz z&*JTxucQ`Kr1z2HkFsa7sw~+z`Bhc+3QIS2CII3PUAt*>z2{zvg^y5`iP ziuC=gti+x_x{pD>va|jEgAbw{@!2xNQu=iHt` z_pzFb?d79;dZJ(3tlXX!dp#}8>FHb9o@N?zdJ=RFo|!z}UNsudrJzR5=1--DmYnDh zOR8ZobClCEWFO`-WM2+3M?GnpgC-4u()We?qOHOke z2EBRFipP2qSAeR)fH5x)eGHJGxkRJ=I7>GS#nmfU8t7231>MkoQd%5pRP%G{jSfN1 zhulex_EUbnyP)~%dcTT#jp_i6z?owukAqg=++A)Zpr;0%d&)0MUzs^h_M>x%?I*B@@( zf*U~KmatTHeekYh-7;3wsJ^aN~KghcxSbS(`JX-+pT|&jKtL} z;dSID$9r{Vg#DmS=^dJelK-sN*Xg-%B#&!g9rldzk zi%FEAaBQTE8Vu0uX?-q+y0zQF<97W)rzK=1OPkNN6>AtI zh`W}EhT=JEiq!XSGB|T;h{(0!)~^CLK32o6R2hMEn7VZB42x?A8vk(krAcjj6H^4s z;g>d)qjtcB9#!v3EjI|WrkhOM|lEG&~1oN+i28;@dL>p!svePqvI^kk0AYrQR6oBJL!rP zzFYch!}tHMi1Pl~dpB-+?bKRpr1FvH@#B_k1&-tPIX+-Zb*1UwF@M>Uc(V>oo2P77% zj)xMZ&9~YyR&X`G)Vd~_N7>vuYhCEEckh;tZt&Y$FKziwMW}xR&W=E;X~3UN($UK? zr>Yxz^I#8tgO#<`y|{h^AFD7gzo4)%Q277zF96XI*ZkJ0p;O07 z&UQLdkVNYKQKFdn$f(5V% zyqvh5fm_W=-Dm`=bTIsF__WneG~3jyu_Z{fEwL*AhCP$8EN;|u252a4X9K3!D1Y0l zA@{*4#DVE>@V2f{_d2EsSdwG?cHRR8sgU4ytVT{Efa~^*MH1!bF_x^*@+F)wDWOv% zpPWMliJ7^Q%sCiO9Ix|NB#zP-XC&a$ri`4PJlB5rL$zQ6fQ|A#UlnV~ul=e8Ek_&Y zcd`i5;?G*NW#;PA)yZS+B}7O4KV)dsxp08VxKy_^r6clCpE??HO52t15xiM@e2 zN_0_Q($8;?!cOjl7Yg8z0tC*A#8eORV+`a8`2X33tHNzx$ABCEzgyCUGzbK@Y$q?8 z`a5>C9Ua=M!8m4;_7mpr-g2WvCq#{}7)KDZ@iI5g9VsRfg zI(s~6>+F{$u7h*oGE9NTiL7(}Cg_C2e-Qy9AQAX>pm-IkS3eA3`$O(-NWRo0H`6^Aw73&I|P{AWLb-9uB^&+_!8z#DrCP=E$CK`%07CeuacBju(LGYe8`=)%rh zeS$b6TJ|wL03*1>?j&#*{at_~!l3HxW>V|_N>cjUg2=(k!fl@=++|#T0VsVj^^1De z0w?Q!r)9sDzyjBPNb2e`jujTpxMtJKn&wGO!P&3sVJr+ku^nm!b2ZwmO)7heC?Kf& zSxwVW3VK9zKOC)>$?)xmBk?fgWR8)=mmKtrzzec7qVYcy`rk*?wI4TR{V$13Foz{5 zu$o47da;MO^ma^~^d7+i)*)MeKzKmg&}E9jjL_p$(>{<>bT}2==Qiwf=9Yw8JD3To z1GJW6JQ1~K4>Ez}HSKYudz?8F5+|XwAxiKz%$MCH%HdQ4s9?79~oM^7B|h+s#tD4R_gT6 zH$1C5I)HAVvjch+HPz4uGE6lMf)KT;iMdMYlN{e2RTnX98E18>X}?T~RJ6x!=#iz~ z9;c1b)oyUVEH)pP?YKlDHiT1Jr;1m7oUOF)x~W)q@{1 zgPER>nlSjOXs=rBC!WT{hQU-rue#MwJc@};{Vd+-C;kI`1dEC+UgIY!BtoB`n4DeV^AK|@B9oYKZE*C4Mb;jIDHqB z8U|3i#$2O%`DoG|nP>XrcsQE16eP|toJi}|h8u-j$riI5Dcm*@_groZw*}-1Y_RPR zdV=2Jila(yv(qqKxZ#A~#-M2m!>vaO`COxV2)qgt%2T|}67;-q_<_eb+(OwPKDRDZ zy&x2BZDryZs^;7vRqu0~_5mSYRiOODL{CMpbmmM2$7mRiH-}aDM{E;pWjNJmGvwn;j7O!k4$@Z!nu@b9A8VIx(uvr=Jf~*r};HhAq&RlVy?r*d! zNpTMh2*rW%f)S;H>FE@5AaZzCo4}40)FWUv2{U&9D|WDNHj(5R%rF#4j>EIUWEHN< z&2^K%macCFgKvjX+y1 zO%-)qEv0tB$S#TT5}c-K7p)*8Km_sj62d!C^Yu)Pbn#>ZYsmvrY$s|cYn3L*g)o|# zGRYBU$CIdjq2vSJ2Ez=q7;ePa9}PFK9(&lY5r342w|U7VIjDTaXVqGNn^kLd;&UOc zXX5iZu0Mm%W_+&3{Q~^njnB8LYSDMBqvsb}1qH>$fx>a)i%0(jN8cXlZh}rM!q0@_ z{G#F_QOiq({Y~hO2Fd<1GjY2pf#ru_JW-)tx-{K`jdp?vJNr*0El`f+?x5_0aEHd~ zF7WzCr8(R>jLOK%fXoqRXr#96j|fM z42op1K!Dg0uHr!{kJ*nCjA#FwU_ft(81WMk@iWMY8o^o#tXb$piP@+gYqjxHZt*VGzpLDj<|3$!e>bu2JLovIQTjl|VvVIp+%PeHPV zHU!TF8@WO^0%nIQp^30&bS4y2f4@NRN!G(P!(b|2o;e$OfnIQzEW=>k7{lBw=w(c= zt&GIE1}t!w#}j9DJPkvED--f76DWW6vFmGi%QXpTU#khw%YWg31n7Jqf)-(RV7Q{e zR9(5i5fNpmluw}rMW7+Z0;zbwtqsCx@vzScrp<=-ERc3q%Vk@I!H!A3jr0ha6Apz@Z7*P6H1op1czwhY9HWB z!D%K7f{T(xNP!wH>X~OOBTFb%k9BLbfFarYjvgUdON?WlW~0Iua^%n#J-#E2G2Ro@ z3g^`d*+Ua6((4_fkw;1h)---!vD@Tq+dm#!cAUh?E5&!OS_* z5n+Vt+3&FcSY$AB!t7VuUQJH6&j-kMFX+hbCo!E;CvJlD1vGli+{KbzaQ&*#$Xd%< z19b(=Z-7|~g|7nvqC;OZr`Eb1pH28Yi_dm^tUw@;mmdfe6o}X;HyXB4lNEv}#B0m= zi|X+Ge*`4ZG>D4N&KFeNiyyE#GDQr&IK)zuGDmmNGZwQWlK{lNKkAA63GfzCdeTp$ z8g;FAtEn#Rc@HAV6+o0$wN(K0tHmzR3!jdf{+^`}PJ=aSQ*Jkyn3NmJz-Y;?Vya`r z5fNf-b)c6a(!pfUkF7^c+z})YjAOicyjthgHJqlzQ~z;^>4(!2!Nheqcf@IMX=1L{ zmcuXIN3Xs!RFF7LKN@ABi#`YrbD7uW(~}DTP-AnkD)rk^r=QPyX^aNe6sqHKN8Y8* zlpF!NjE&S-w`|aLoqi|oWNeOs?+rX zo$6!f<@V@e+_Bf{D#?K!4UiLJ`Cms66fxcau7*jO5ZDPK_Q1i=4bd0XNnR@^x>Aq3 z@2#ppL{47wHEQ4wEQ86!RR?P=NTfez&m>V^_O$e)m{C}S^1HTDwL_3#CHLcRg4llg<0+29aY%&WDYz;AVRtyO~$ryBqA0+?_A zXMdcW@#g6msQl*Xs#TrnM-F=Sp5Y~ERC@y5Gm-09`U%!6PyOn z^O*W*nl)g`LAxt$&TA)W9q-|M$c!~*yoAY$&c=1h`J1c+ba|+72uI&YArOZ?IN;V+ zrUDx?Z2D#;8?SrKMIvnPVxPYBw)81;lSYu(vyk_) z=+bPdVvM~gyuCDu8PE2X+tdrW55fl;;d}g{sKlHoY9Q({Z67Nk^&2lS(}oU{7oFkZ z8(I~VlhPcJU(3@VYamaDUVpm!UavrCFQmWfUiCEr*eJfIW5N9%uK{4n)BNa`nr#1y zETj*;vokv}YrY>cwve`Oprl8e4+a7E4gRICDcu5HCvn@S9!<%8q2nn2PDQIDRd` zOB40NyrFUqR2;QPRL+6vxX`xd0K&|cvw|RWYD!})B%gz)s`D)(&@(*K4+@3A`imqM zAtRO8y0P%}8~FOUqCA)0N@f&yX2dMp!krmGq*!nH}^grU`{HEnw=-uz)H; z6_~xL1r?eUYm%qPBK$tKc&oG+R2I}~neffv4aet^@vsul`k12LsxuinWNjm=&`t4s z^t)x^YlBH9Q>7wVD%u<b({Y6HF(1;K1D1YaPdB1rlQ_5wZABQX{k>2tiPobu!i)(qmU=tv#}MFkm0tU;vvW;r9}$* zV3aI~4fv+}(L;odc8IS6B zt(w1UT+R!(oduqV?gO93S1^dVC0uL|Z8hGd8uqwNd#cOm+DtU)H2R7#{A@&W>_%p} z!@>o8jMd`LgV#%gVJ~FUwZ9QEU~5troEGYJ2s<-n(EI&P^LTt}@)JhZJ zz{Dy0-Dp3+(w7RGXCzI_EWue!1s|0QWaB#a;4R&CaHVJNW(CQxy^W=oOPhhr(j%jV zo>PMsF4H&=2FK`xn7xPPXKI+SnMjWTt#;9vJ=g}AYn+LlRa3lYvbi2<>80uLv%rt zBH=0WCN3x`n0wb?a$voWJzfQ~7mgu?fphCH*LRXD?gSBoig(Jo0+tNwCc+5{!l6@{ zVYp5E&;Z5KQ3fbF^Ba27KNpBtfL_z-vT%7aDkrI6y|I09WW+6#O6o$}dkd;}g+KEo zi)aeFID$M**SN==1LF&JY#%Cc<8x;0ncLK}CX59J0V&#(igv-)9h0x2r(jpAq04RR zN;UNukUE6Qu{_tb&v_@$T`*_Hj=9mCsv3Gy4cjtsgQ71zgbcUY8(r$%z0+RfGB&+F z`w%I;2Gj>Rwl7tO1clXYSwlwm>LoWS*_bIuzI@y^fEMD3+fiPY5y&$_{27VTs1MC;$mtT` zY3j^`Ww7BV?J0;OqOa49c5qG6APZ~)zZIv5{3g&5F97MDVuDIXz-96I`oU&Fw-$zhB)_# zAS|eTr4Fr<{7jltcFie5Z>8?Sjaam{!1UISANO6_FdNRsP<=BMc_G&h@ z-LUc|@HHJ55pI2qz6c}Vbk?Vt^-(WtDO^=BB%yL)WMNzVkBA#eMKs=C+D>OI(9As* zP&pP}Ey}+-{}k3L9-qWy`zbIQdk?C$_p|P^W=W>e#%>(KLsqtPJWjrzRO#tS$LHut zVf#pidYA^ zM{A?oRiVt&2fi$*T)1JWtmcgs?a9S z(cT3%<)KTKPr$r;jRgcd7&_86%ph38P21e)HfK%=y%W9CVkf6oZz|ded!(TYYj2&6 z>L{71T#zbE)1*cQGaYrAt)|RYw_z(oNZQ`Uh~)ysreU|BBSYv2FfA}_0hH`5HnJ1) zRMQqWx`h>Am<#-od-&Yg9zN$bJtxfL>CC);UHqxB#h-GUo=P=6?M9ylHWJWp46$)t z!yl5k-OqWpSF^nIadhU%aFLl{f0jScSYN@CoLyOl+(Ub`l0hf1_NtH%#Z|s2ADHm_ zvuuKa(pR(49nu5>UcDKXLrm2Ts%3H(aRgw$dvRqdv?+s-Fy0w{#Sz>O=;2t}^c7A3 zG!{u$%K(;w(Fpqyt{7K|UkMw}YVsg`+5W0mu&CdW0>$D9w_?qOL=RpWZv7qmmDg;m zh=y5X0iGSsVLjyY*L!oAw&`Kh?8)pjd(w?Q>C7oioT2BPQS$Zd!h+!A$SHFz)$q96 z^tdx`9CkuULR_uT;)EC=l|6|4u0F+e*XcDRWDUZea}J%o`V^MaH*@LrnGZTNyScYG2~2yJU|9k;q{DHPizGy@3z{wGL?h~C2jyLeaNI6D0YOoKH( zOkfi~C$Pbs2!qp4lINbieYrvJm^IgjvsCo38-3WBQ=HUPRI&Y?LhNeAP7AKP@&F4x zCU*HTXzt^$3vSwFKbzjG0F@~H+3qvtA;8i>l#$UZXR-3Q`ug*NC8s8|6e}OAk9C`-H0pNYY_OlAeyxi>Fl_n7ci zlkhM=?=I|WL><<;3%d)q!h^%V?!qP5rd@@PTgI#Ix*(Ii{j=NC`9gZh>#2%qU)z9i z`Aw8G1F5D>Zgi6g9UQIgJ%9|<_8xGX9$@I;iByWPnp6FGf*6Q3U!=x~!V%hhHKCP% zwL{i=pm!1&SP|q`JwlQ_4BVSr*pi?5ZzMVMf{6=IpZ3TnPPZ3x)WdIZ)C0}NIEt$) zTLeKdwf$~s70W#^@b$Ha>-jM?p+%lLHT^)79He2;@0Ky8QC)c!GlUF~uVarh?$mz} zxxU(VbOEOEQh;HvAS|mYMQv-g>}}W90w8L4@L@}=s#*%=2je~#&EYokg0ZOHU{Jlm zjcy>Sq1KK@b*n*jtJ~BHREOKXiduXv6lY$1Lhu4Pu@5GhTSj~{rdPFx+Nh91n9v)w z&*_4*W(ziGQS)!uhqxQ51Y2KtfWdUX5|Il-!b)l5!7p(xtE3?~&l3r`l@IxqUzSt( zkY2!tS97~65Ir*7RskvY9;{dv9Kx-1^kw<#dudAR#wr5q+@^K3IikMsFcJ$(z*(Ju zs?sB?p=BcOB}c7EwK2_Y=Qr(=Rar5OuqU=X~7gMFm()C74 zX5Q2s31KFQqkZz`ru&gbhE$l7PZG0)D4ouAK(v*p0F(UitGa)hBbl&^hxnXxEl-`Q zpBrviYp97!^1{NrIE{K?bUb#&N>u7baHuc$`0;=oObzDtj{Zr2tzqhXXF2Q>oHRi8 zg^kjaW!9)Or+~a$)Q7rdws#luDgWFuUZu*&{kjWDlKkr~WX1fu?pogs9)xND$>Z(z zgF!GPw$2cZ5r`9-k#NG`cGxU#O{$K-*UaS<*f7CV>H17r=2e=-2)S6t3IB&z2u?O; zx$+9bF1~!OunTaWrB@5ippL19?2GV@!j{SQBJz%>$UC;Ms`(W%2hH>3NluMo7kR>u zk5r~Ks_kd6MldGzzq)QLMja=BVEf*4hRJvEV)GVp+LH|x>LXLM>kEGP?eFA^Bn`I) zG5^dsBJk&@h|nZuKqMdMaZ3ha>0}WDy_vF{Cr{`nV$2|jbwc9OoQLajYZKCt$+67T zRtpcoe$q0{q(iWDN26A=b{`@OyHQBq4UI4A8dKRO0n|oa>0p+6}LniGU*IG&-^DvGW;qa)Zbo+D{Xt>l8Nday^s{dI!t8gjs!?o(xqp#m`l z6pKAC6~sbNx{}%5oM*F7>LT3$C_A+PYDce6R(egrEn!MrH3K&k0;63F4d5!Hkx~Jt z3iLm%^I`etwyUIE<`qNwo3TtUsFk>p?y{yn_PtNeZ0m#ZT-`9dW{zGAp(%a&1{x-B)=lqOGX1UIzwOM!Ibo(M zt}&scn?$bXhdFn@&zX$GraqK`XCkxCsp%7BOvW6OVvQY4h^cE&)3`vQ><~%OEjy%p zk*bH4J|v4ssk$lPh4(FCX1FbeQuQH(5dB8qLouf25&yV6HS>B+Slt91fRoufgp+02 z6Rc_k1O@`DKPs+0sOXWzxnwpJcvE3V(VOR4TvX~sMPgtZo$s)@feP4h#aP2-0z^zc zN<+B#<_8pZ^pnp#Jv!W)Vp=r#X6^Kz6Q=iGY!QpKiMxZggHH5~>Bpl)b86x%Y4zYdo+{_!l<_w)cUj){X zh*Du{gUBg&;ZBuJIFqEWRN5h zR)d6j3kAD4c_u&_JpgcnjzUruk#u(#DJJAKd?nh$5?(yXamWoHSfD#%TwokHp%jT^ zg5JvU<+A>dNZrwK27ORI88yHe=}vOqDSr3Y$M1Cx z9CUUpN;L)3zZaSsU8L6(>4kTSt5Gvh^CGCVV%^HFNto0G;d4J?FBv32yCwY?QH_uT zv+s+m|B=LP0?^dNO;{)AKw?!&2aoTkRvbxj>(+j%euu>qaK{}X*Oo=m;qe6AC&GAw zebkK+)e73?`Gk>1dk>-O*ePRhcgwL`M+KvcH7%S)2?=7!7fi{$1`UI#f;U^ALtI|tOBi3W0Ld7{c;3dG=18uHFh zqaKKG*7vaZkrDDslxB&m#~^WR8R0KmAk<5rW&QN2jv0@|#P=P-=OI3TD+q|HbRlpJ z0qAMH4ArOjL4ej9Vr^johhZN+A6cy1;iAZzQ=u3$RO`jP9Ap?`gutzX$IAd{qc)HQ zY9P}V`0NJ=#{6wU76iitO=H`0Mdn^lhd}f9K*jd72LxV0b&&Htcrmuv!Van~Y$2{L zGR2spLH8n75JI^Z3*VFNUyuZ!CJAmOEb%g<>TZFstqHfSf#Y3ff?i$eWS$3pC_PlC zRQT)kYFr}$3`irMAk+weu5_4(e|-2e*vKwKaQJ=%?h7I+AQ*PKO*@@=C5dZvf)Nb# zZi-;&qF~@17F6Lzr-lnrd?e@RHslnPd%pOhB;N4LK#J)#G< zMP2a%yBx@rG+V04e~_*sy_k9jpa<%82*dXJg|*Yu-_W0G=!B2onHRzm01QE{4fJE1 zfH-jwVa0_vMp%t;B+%nepUqacX)DV@X~HgtFl;nNTutTvf&uP{8j({0Fr5dmjQ~!a z=D3I3jwsWYM!lRtG}Ki*>(by|0GaA5@*YLFQ*;LU7d`-c&^b zUxZC2a+X9)V;+5rtLNH?J2*WN+>P0+V(QUJ)I328gH%OfT!UdE%O z&tuA(E-ESpyt`Ig1cKkOKI-SPMDiTgB)A*t96b}Zd%KZf)C(!VK@8Wkhzj0g%Q1<# zyVIX^kf^ucTx)gRRBN4&-)}C(Sr7O%VZwQc5N2FHB7d7Ld-^h1zy*4%kvcQTZbpz? zBgvjB&7)a$I(d*?F=Dp>LmYCaVs|4(PY!i zMMf7akB8e3^sRM4k0baB4^=wRTlHRHN^|(|r8P#o%+S4po+zxf95lnAPjnPXjjF-X zEC_7xSOw5%2Ah0x`J-XE9WkeCX#*VVpMpgYK z_B89nfVKfcgbPAV-uTRM?y0h{Ono9;hxU|X!N@D|r8b0xk;BVNh~_k^Q+5m2*0qnN z7b>8JUf`wza|uC?O9JL|wHz6fY?g#7(K6UcbLfnJk_<&JlmQ;$J=C^$&0I2&N#5x( zw3zj*A8725!)jz$ot)j*5x;dcN?D2`CCfv~k3ELy*6SwYGjY?LOr2#Wl z&rv1E8Y%LB64BWMQ7y4k64AMh5?(?Z5z%=8WUwDNg@{;&QS}O_V57|?>i$+C61uS- z@@mnAD-c|NIU#=YyM!3DPqAJRZfhg;=uJX6Nx=9<&NMr(y)fDn^zLeIjWpYcRAA^<`#wp?qL*ebsey7-F_N zZa>GCrb$bf$9;0nQXdb<)(*2Lxy@l0HX!V0u(nuqwGEj)a;Q!O_~mcsz0($_#y91|xktyvO$CIvnO_kzJjDa1z6>wz_z zA$JjW;z5?uXklV3h=?r)fcC~zfreJ{>KH$9qZq2>HDY-)cbUV|v5*#13knUj=(yUM zM$XSGK@6=?yZoqHY&$2wUlQN~5<%N&$C$Liz>69|fra;Z6i7(CKu$D=<0lYQHp5$m zJDIC*FyB-PjJjXW_8E{kH0Y`q7s>Fk!`j4U#L8!06jXtEXwp5yJL6`$w`J?9WHr`5 zs8dk+eps9pw1m9nejI0l%D*LcfIiM-IpI$T8wYwN6no6^fZXI`hd@r0J942Oll&kH zdU9geq@|5iv*x7grqCMbieN&}6@!`Ivk>B)gl55ss-vNB8yAzkX*l3b!$C6*VNM0z z2L%Lw`)a8dF$B97x=;YMB+sIL02^ykN~|n*L0~f%R^5w(ID(xQP252_927qfQ+hVjQan`vG5^FLm23qra&+g7L-PNTlK%{zg0k;3zHDOzE2yPUn z9>B@2Ki2vh@UxkEn{n#2lr}fmQ)W=U;!8~rY6=i=5fYe^3x7caMkP-07S~pA{ecm5 z8=8*n{KJ-a3{9juhzgtRb68<5EBw`XLjnf(xTvAC1 znFtLJ^6BD@@Eq9mTocsc)Z$H8pULi7pfY-jbV-5=0ZjWslt73*;+x>@aCX@G)GtJ? zBqEZ864m+G8J(Z`Es;N$^uNqr%FeG~=YKs;W0T#ME!IQWc0*ogb73@8DBwm1*}xzh zKnxgw8)O3^NvdudMx5c>NF&~caR}Z@JHhJLvHE+x>Jjz_tF$zQE?~mK$rtfEI{*ZE zofT}E`Mao;xo~!m;4BvpK#GS4c$T2HPPU<#TJ|Qk`#9SzFzr$^3b{Zd`bJF)bI&G^ z;vohQCS)Sjlahs~Jacpgf+r-i9{bu*>5kdn%OE=Tff{kZ*=GLA&5UT!n@u^e5OK2T zhDb|tEUHcDH3mhu2m=6}4_4P#B{{C?X909(KWPb^bcOnsX6+s&eS6qY60Ef1TlHK8 zO@Ic6yXyi_O@z6XaFNf(L zP<5R_^d(HZ0iFA8G_?QYRob5~LvS{q;Kb2U*~^*uA;AR>b~JU2XW|L7yWrBAY$F&2 z$ApvIo+G(ETp+V3JrydV45x+ReCyl7H@xBOJ!FP6XPM|bqB&tA`NN7vbdSIYXh&nw zI_@Rua{(f$m>AroHNmXMG={~h%}yTu)So|oesAF6p^sQ}_G07^TUGH!S{p=&S{&tw zBOZ)iGt6aqO$ie}RckfoeEROHwGQG_lat2h)A3=NNMKG}uq)IEoo}d7G_IKXx-eKT zh&tYEH(O9RTOv4(tSg4dyGOs}Ba$k`=kaC`a9Aud-7qXl3c{{#($fPRmA*jPDHf1H z1^J7HRNaw19Sk|3w*B#FW@f4ccZ$- zfWu)ma<~N!FJ| zF9aPzWRdi8dbfnqo-@tgK9{Ws1LLkEvlq73!58kt=(Y1G z1pG!zOa?xZ!cZTZL+b74azGFjjsEc%Leo%&@m`#%<$_JK2&MXLeqbwGWD^GPoXFl99Egni2^#e?-2+Hz$$f@EmC#Y{DJg zS_+h9ewq2MR{6cQzvRmSD$yihRty3jY^3rF&Hm*o0wbG<-4YwBTUFwCpSn-~ThV+q4s``~DWPZXl>i1E;tD zG=$c_ZLJ#_f$f3`)76Ecrdim1A>tShEk&K8nPcd#<=0OsAKiksv~D1EPF!1#Ot^a`g8)Y;|4KJ%)ddClo zB~>AGPDU;II%tK4gJ^HiosdGb7^aGOcNR31!Rlc0mmENB2!~CEyu1`d2=g4&xIo?A z1Oqfdc)J4|YBQ;(O(6MLDidG_Ed@B!qhKH&w=LIeD=)pcQ#D zH|i)YVfhT#awTJ`EP`vi?}DXhf$>+@ixoWtWLMzD988=2>P8$(Jpl?i!Ve{(YaghfzDH*~J_W2d7$df2FyU?*5ttw8F65Z=ue*@P_47~Bo0Nl-m2l7r2?_R83JhM$ zRCfK}p^Ztp?JV~8N>^scnAY%cvX(-15Y;x1vm?NSrkA+7?tg{lKtDzJv^2J3oTg)S zCkmxc!B-9uR)rt94mi+RXA2q54S#kqlCr(bCB>@Mb8|}1T|2`qBQkE=TjVFVUtY8) zC8?6+bvDy!CJj&8&Q2QLW(Cf)5=`ldG9eirUH0d>PfrfFeGModl|w&I$?Frcok4)W ztWhNsQ++UXDuk<@KQaBX3_2K4B; zX-e!`f;sY40W))omtLNWn<6-?uV%I$oz1Tv^An+cBqi3aiwNfv>H-!J4M|c5sm_&b z$?@tj=sWN>H&*cke|6#{T&tNwx0Z`=X3wCjz@fR!StTOnTTc5F84RDoUYFr&^~qqK*(MPNYSy! zuO2NYY(~-z!jX-{ro0w`{9hfyPqYFK4r3faA(6ciy<;Y(P8gD0G*|LGHpO>xz?FHP z2w+HYS;~Rj^sGk8Vd%|6Ba`T5q86)Hc<^R`U~*4Z)Coj@$LU`p<4I5&hB?VFmiMg& z`XxvVThcwIoq0=-<_rkmLlrFuXdD*WRP8wWM~@0UL}i=|#$_2Do>3UVt#(|>-1dBz zBEV%hP!GjkipQ1uVtrRCs&&Jn6g0$^or&=MzsKT*8{Nqen1`Q~5SS2t4A9P@Gs0~@ z#AtecM<_(xe&}_|Idm3}vK%@iVVm|)&x6v<1Nqn+gO&7QEgkPHGF55|%wtlj7fN-u zmrcXfLfW9B$=Fxyb%9Pht(jy#ovkqkhd5K|Ow6PMkI95XZq0$yt1u}$&jS4E71B*X ziF2?f%d7Kr&dzg~>5|+`^AFE7mzhpQrq21iD$mV+ggVb>rgyPCVmjg+yx{OU=P=V= zWa_+tSG)d2cBsTwdUI~3GY_v5O0tz+!#dC8RU$Wg4bQ^Ta?11_ivGFCCK`VYF5GBW zdcnUcvh6%mWZOwnWLui+Kz>J8AEA}b*``S6YAMp0{>?EtMNU0Jk*yyxMYdwEEo$GI zemb|vj3X4;a+)c!Wrh^ll1}POt|>05BCmVu9GG#G*_?Jj&0MhgEr*WxREA+n|C zz}4aR=@vvsHVtDQ*X3bmZ4fGd8)tCvIE(DO>ug}@JikpSp0_9Ky@JkAB3Z3xLOegq z5*V>XI}oq1Oo>?b_uy|PRGoBTq`z4P6lk5YVR-#PQAti?)AYu3MAen(l@V~c%CPVc zW}w%2vi&Y9vo~SB*pGA4T#8eh$<)v~HHEEcPeYqOs+T-P!<&R}0VgvGnG-UbKXJ9P zQOj&8uH!$9py`tHy@JvaG@|?0S-~Ftrj(pz5SI`H6lpV{8y}L6O-B=0Ti2}czCn*k z_;OGW9&~BxZ*`O%qp#3@njPE9jwS!BJ7zFM$OI%gBfcu!b{evqo;pLT=(!h0?HpPX zZsUez6Y)+!a(Q0c-f-*VgjjQ@EW-2j5<9$M-eOS5t*6{mZT@p$!H|K{3sc4Jz1LJ73HaSI0vB#VenpexqTI9 z_Q-r1jkG=@ZQbVtY3bKdpBI(jsR zY`y!JxzWM9FsQxKdvs|KT7E&(epH%y#;f2UJMMLs9ruVTiuhnpb(jk7lhg0SB=p-u zN^=pm=<8v=2Key$-8qdITBLIVc#QO{F6{ZZh=4$Q*Tj^ImuF{7t; zmPZ&JLdHT(1*gpIKVa~2c3N_o-2rP(IPA-1bbW)-+Oeg7E#p}nyZJ$9~;gaYW zStL((jr_d#UCjKa!!MPv)oBe+ry8C^0Hnrw2CwlDXk=Y%^O1&O)kF}Ej}(mupZYZ6 z>5+H{G$Ux)&5_u>KFvZH213)QUeh~^HfM){kH-!}F>HYBKp@O>}j6l=_Sh!wiY% zJBRK_&NLINAUkJxE*DoSovs2AdYu<>V1H18ukkQg{CU1Id6_AUS$VVH21ShDMuBta zHouL)k=oGqZ|6d`(Zn`3QxEre$qmVmWZSrty8=Y*K^r$i2h#m0$Z~jUFF4%>+Dn0v z?ornJk5JCEvy)AxV4id61}H?rGwSo5gDasB>G}&sDIDDI4?bC-xs9QhNJwNPQ!tDMZudKY2C^L};6QjC2pp*c0n-7@Co4UFbp7|{)_;4p1Bv7fUI(0^ zWj+{zTrdiqgGnEc<8tvh{zzbqH(-32VEkt>z6$<^@$vb7^7bq&x1f0+nKz($gG^^A z2`p%o0G8!wUS|U=#DdN?ZZyudDr+2AogZQI=b?FB5~}PS$vaFz5Op$nqp2T6eIo`~ z*N+Lk+}C&m?5n5o7LM+#)_4nbU$Iq_9HB0v88;+_mHr{*qHY1=C_8KNjzrN~RqU*1 zIS1v^Z%}FUD0;b15STStg826-`eN2QgYbBRKpOK2j)UtD!Y6#}j-hCcT|?2Gn08jW zXF?8kSNW7AEW;ycVE1MpeqeW{Pf5V;?LI+|!LFW>2D_b$*w}4oEd7K3$)Tj>{t#l; z+~E%)W)0`4Pf1y$Wz4M6Luh6VT$8y&NQsahLTtD{3U~Ne!YHitu{7GyFy@q}Wn98q zo<}Wdi+~G~g%JPmxGPP)^i{0(85}5?17Qy5yWPh#=;T%(&+p6mAOSF0S#O;6dc<-w z;){J^xfRpbCzfUYn1egrnae#A{+MIN-t5By?m^V)+TNFYTuN9zH9m)CZ^lU)J{SpK zl3=*A(h6X#^d*TfF;7|*9%lf-%lon;h1q$J zKT>07Cy8879L!Go3^c;ucXlpdW3R)?_X#GEJ5o3JSj0#rd@N$5mgSDrO+FUiZ=~XE z>jt(ZfPu48fcaQlnTy4&1OXOr%Ee+c`dv?Uo_~ z@iYU}pPe13KRY`_Xn0^0=Js`5?(7(UBrwJsFfcFR{{$H6X1wRfhlLWvhh-Tgh^BqO zvJ^^yrm-+fJ1h8Zq2^P= z9=D%xByK-JbNeO&djf#Xe9S6L|3wZGi^12acsA6@*x0d50&Y`udj}wOkVI7Ivn`kB9vz}IR5HD5Emc&b! z`RF?RDE&{o=Yz{aUrp6o-5c=kn+I#H&*Az^eD2*;Yh91uTBN`9nOf_|pGLY{YklGV zTI*q?_2c)djkx}7t##3tYps8v?Bx&DTAlbTdAQcv_(-kw)kl%%^R?DbQP1=EE&4*O zmH$|+_31CwT7{3-T7SXkcTdz>hfv?6U#SHeEbFAh|MK!rI;kK~SWr+fu3&s{LXrQ6 z_rirr3Qn4s{R?L=c~x*yK|$oCNk<)BT6WCjiBl#{JXW3`cYOH?Cr;(_3VF3p+(RBX zVG{094`CpPrsUKtrlEc=Pb~H_)8n)lt4BGxmycetUYxuzH**s1TQ4*1?WSaftKYk4 zd>CY&I7dpeuQX5m_KF_~u!|%Vd6IW}GNKiO*sF6F-njSxG+gccf!kHiMNXB`DIm3Z zt6J%w0o#7xAYqq}3Pf3)tTpw^`v4gS%J5{?UnccSjhUj3Rx~Cq2jjP3#3MVBS^4jj zZ}897MYwf*&RwBweVMZng;|96J(zRCb2_+iR0qWkq&p}MFRUjrB&v|_-WeX3xHA1L zdg=iqIsDGd)&nxyiMo?>u z;0M6V?O~L%gJ+@W;$Mk3(GKwjHb4A8flhkz%<8bFVXk@#_I>vePWcj=^J7MQk{ZoA zbAym(fxUTzia8J+P1QFiXL)sS3Y45M{g++A`bP52oI*F_Ag|o6gxj9*$$rc_4Olcf zd*%~mbsyWjuGaFdBNC;)f3jY1V?~bo?(qc$rKCxV=X&^ z6`bLX(clJbaq%M6{0K;dQcILBg9mkJq|+s#6@CtJHx+xfLG8i9e3Sm5WV(*U;8j&R_hGawBiInts3*KgesCK)e z3In-el?)^X`sCz9B}{+ld02J-CS2gC!bbaX zmin}m!UEr6tjG(A%3D0mzdRt&;sGH^t8>NITDE24Yt=kH)@g93(7-;riM7v+zI4T1IXEJW=KBUn@#hW_3#y#4J!w!O-? z+85`&3LPiC4Asj~NhNmW+33}55g^DaTlnQw7_b$%ZUt*i)~#e+(7jmJt+>$j?p`_F zYIs_-KmErX;Oa*lt^%6?UM(4`R(~=Jopb2?wKw`SgFfojZ%_O1re_vvXQ*oR*`v#! z{BM*80vi2Fj%@nipg?y1JZKr1g_$W{t+a$z@kzNnLBO7HVT8tr(ewDTwbn7u;Z212 zy&j)td=mJq!DjU%ja1$%g^u8nK~ zqCrR>Y>)^7JQ&@wT)dvRgJyV2xb3&}6=F9u1quuWrl;Dk=k$Ao-_AP=Q~KgX-kuY_ z|11`e9H8#?t^Y|D)>exj4~y81Df>OSCtPUHyeu5Td@imnG1PdGN@{JnQ21-%D zjboed=4`$w^O;d)Ohc)&1N&i0QN*psMw|)YmU22mD1E%Zug4oX$F}{J)QJ%YrT+rt zdTld4WK8S-na$bFoL=h)oEg))o6Y$Ia~f(xh|Sp6Z^-7nQ(BK~oV20r8O$wd9-^9^ zchbS%<~jYr-lD1Q8wjcL^Nqj+C22tAhI$C#KQnQDw}VZ&cx9jNa?eN zUtEpx#Idg)`1W(NG39@SdUX>%sv@o&Q5;jBlWGN*|AA_$7xGAUo+&d1Lp>v+b!QNq zN zt64A8&=%F$q6}hjV2DWpOe!4GEW3(>sWxUskOOuH<<#c&_7XfyFNc6WtamHeLOZ{m zx7RxJ+n)mwa8vnmyYF0>v4i+hZM#fRjHUW7#8yRRxZd9Mcf)My*`pb~Z zV=!_g9)xMNKJi>1VQ0j{pd26k{L#P4k+1$$pbDv|1gTHtd5vbubQpu!O@+%~W zQE$m^yPUN#9c&UAQ;`hjE#5*?p>CILJs5gs0Z}%EP&7;7cQf@~X%MUFMy7w)9rvHZ zeFSAD;ePhkTFZ*yFOOgHmmevJL;~JjBvLqT{P^*>4dOGQC=!9QGcqyEz&D;)h#E*hn6jMg*m4Pq<(Z#aI^ta^(TGv|E8C<0Fh@~y2YoNX?p}ee zfce$JH_*R}*P_W8p>V0~$Jsl66ri)Cim$@qxl+AuL+=LIZrO)Co`-KN`>E6eV(KOF zHua*!EASzkZJD@>sk4A{Od2EZo&Jg=!UITV?|l~*PEL~>A1cS}V#E3w-U%;5^m9yP z5*E05Z=?DdH@xWjbCoTvZ^5jG4s$gbE8ok3jXTTF$AtawJ6Hz0$M81k^T3|KA++Yh z8HV^ ze()4HeGK1Mw+o`3nn8eJC89VNn#R8jOyYbKf88!`5QTe&<(RQi_3dURdE0a%g8en% zJzt0#p&71ESfL~JQT-p-s@#P7gjXTkd7b=vCwR(OMa=# zTk4ZMuTQqQwLaQ<@zwryN%L3Z!#(+`9vfkZ1vzdl z8g6?8lS}>WHLoX@diGYyz&-rfeVl*F05y@JNVshg)dTp{fGfP-1ur;RoVnw|ZGRP&E(BHZ51i*^m7r*{Xt|&e zgrKd|QP3~FOxQ422R%Sgej`g6V7w4lVHrQ~m0VM%?SW(AXoX2RmfpJUo>@$Y}lST2jw5vXsf|p9tF%(0bLjr=g(`k z?e7`@S>e~OKH^IiemPr;gL$gw{Tgr@_aSLb6InI1M!s{3%4c$#eKq0hyGb%MTk7v$ zks5GSf0SHhj>h%xb!tq_Hi;)=!$Wl$tH4&wRji@`ZXciynZr7dc^k$2xcb;+U1znL ztJ_JBkan{?i0YnN|G4hbf8iNwd5hZ3&VYIc=d{VJmKA<8mkal@#t^b~nruJzviZ9< zzbDlDFhDeC5~@#rk5z(Pp{n#-$;)^eoXrg0ddBjt%m5p#9}ZD-WD#cZH>4a)n*P*+ zDm=k4hx)um?&(KyD7gA0HN2)12X5?spF^noW6Blo7(s13j#AAtBcAVd0JOM?2#tw* zB>+xaps&)eqDN{O*5mOaisXqZp9Y@4%@PikuL~|ha?Au!^Td!~aP+$`DiX)qPqX^J z+#pZY##an}GdH13>dP`zJPa6vfa7}`)$iXBTst*EbQOnat(S{kfMtz{Hk7(+k7UVA z_FhFZ(TvkI`T@A)i?CBj9@Xkx-SB9z8WOc*URhC*z?(RD24zbEn}B(-Hc@VO5%lwP z4faybQcL}p+`_Mf4N?@Sl&>fKsMZ?)QmystAK-9`7Z3x0&v&;$=f(Z^@u|SGTKt~# zVy*QIp52P;46ZLmIZIaKkNB16rRHPhf84~0Sofb;G;w0_#E|#k{eMfKCaWngdvklb znhw8@o;82|n_N+f0C}g&K@WHmQ^#UO9JKzXyaR0ixmDQutCbd5x?p0ODX4EC2pzdJ zrY=q{(@J(+{pM&HP_=odX%vcBquM)3QnN}a&RkihYY-ue_n+?huD~pSk z=i?FSfC~NCqlI~@TuKCd^>Dh`MQ1ik`RBU!VCq3Z+2NI(t`1xyV}-f!%%EJ2o?Lj> z3s_yXU2^RLOI0@*O}H1YRI65B_lk11!!-HEZUPoE=g|%t2FIhgb^*EAG-&9sWR6dV zM{cZZd#$B@iqjcT8_hK~HcvNZ_+wL_elH(R4A*0rjahvM!!w~R!WXgy;YD$iWcqj zn-gV>+OgM7#SuV_+32+N;G9A-H@wp>uGaiSkR{EZYuaMrf=0E%D-6BAR2OC;y7Tro zs;DlQnL^t^4IuWnl;q#8JE78*^sNVnpXOqKd!SC%Y(a+TBzvUo_h z0E`{~1?d!3Hqp_>YJ~f;8sR?ds)9Y3xJ;{v=8R=3oT4!9K~7OWQ%!rY9m<(AE^)d} zXtZlN13oLw2lbh0c!C2z;9NBNqG+8lb;;QR4lD;ezT=0vk3ChlR&Sn?s^LmJWdvfc zhWk|$7;!-3r*Tti0_H<*+GM098%-LtK|G9AR>uQLyn+x~AXM2YI91D;6G^}WAO(?0 zzpAHPx(&5#3iL@1Iq=vH5e$0HEYwG$X;m^1Z@yFw%29}*bf}&^jq2?IgL(|Qn1`U2 zApnTp$J9r3EzJ{DiOvT506HMvdhSp4KF;xOyeb=>ILzIE%?ov%NIEpqpG~{OOB?Vc zM0RFUJ7@=?3Xe`9xSSHArPoTr9Dq^$-`^A<#aV)b(_R!^7&P8TOU338uDVWg063Wu z+jN1$sgeG$m|CqX@LmClumt)MHftxuQ1=3OziCkL-Z&`O)|yazv?r!|Fj6uJ0LiH( z`kLk8Fc9|ygoW{6;H+X}{2Pyk=gtUSftik3CaVkGYmGI&Yq9|aBi!4z-lm4|cEF5)>*luFh0p_ZA_ z3TP00A9j;?NAIJl(hUN`6sADTC5PO=r}^HhE@>8{&QmubKj^g*iM8g#@&xNK!|vky za7;#M^*LU>09|TN4!aAt4D+SF><#wwl1`=iVeds*-^hXmZ5+o$Nl-U*Z~T!vJ38=*42V*%znL6;&M%wO}8}0H-WY zg(_W7-n$0x#Wg82E?+;473AMU`}Y^t@~9O30I70h7X|_E23$WQ@Te@6sNY1@?+(6M zcs1zqcW+975f2#|pwS2@Hm8#?I$`gSV*uM113#N^3-6&hP7kSZ6$G(CsmS(sCi)vG zh?YJ!W5*jqG%2!_*k9cgS%c{9{_1FHOF2}Ji=QX-ivL!D7LdR{T>%8#O3x=elW|*O!*)i}L$?&Y636Hw5+f zzVG`*liWLZ=FFKhXU?2CbLPwgdCG(6=}B@6b>h7t!LN)$pJv|S#tqLyFg)RK@iMWl zQ>x-R^p(l#GKg`QspJ+rQVOaN4`iFixJpL2{+-g|(9(0IRfWxG=&5iYn&`~z) zBxI?q>%sZx9{|PJUa)NJW%BJkPui^@1X6wsoeG&`h5wpg@-5(u2OMc0uLv=XlOzv> zXyXvh@RoKk1ulWYRBwJ$BBglK%6=J7GDkq-xi=X|+(Kd~^G*;x)b>S`KKLw|qAPc))f6tlw|pZX?c9u%KJg zncOYX$cWkZ6d!OkbQP#}q-grJu$_v22jvU+cC193ld}=rHh^$E;*pDP?L@S7EeAzV ziK)68Cd$p{Bw3>v1d&U?_!MlD{% zfDz%oW>VpoF$J`|A376mTd?ktfo5Vqj}sYLF|>3J5rB?T)5qApqhq|IE0#A6+!n$w z6WF5M2D6lzA-lsYh;az&(|T=PExs$}o{$|kbF2V>6$gQtaWNBNmJ#N3!rcB{%fYy_ z*%5Y!2!n@ED_!5|As}^9t5utzCg5H z(I2{>(5^8*`aU1XF%X11p_`#kB4&$rj;EZ`P0bg_V!j7Vf_q3B^}<>w} zfO9@@MholB=&cqLkPpDq_ly2b#uV1ZMF=*6iruB&r1TA_`)n2=RbC`EpOpC^qBT4( zBbYuTsO3GW1u$?mgWNnDZ2dE(4%e{TKNJkGQS~{!do*eeZ+07PIahCGt~YPm55hO> za}j8`<0wW)NOQaFK!B7K-au#r8TlGbMBQ+XX=U=|Z7j~U~PTxPImIdBbgKxAfV2bO;#gW0b zhupqBeV9Ok)Q|K5$d46}>{f_Ljq(_{+VdvNa`%+O{PxQW|SW<4H~xV0*_ zf&4XVE@|XXT_h0808wrVM2SQDY>7h$SOT(|H@h9e)gUZ4Qp&-cnWiqW7U>IKF<(DR zP|fcF?y~-gm5*{%z$kBdpX<0_+Y4T9-XF_-p#ESRP{MSIn@wOGN3?JB zXc^rhN5>|xB_(XhWVYnFZ>zYg>t|@Z(%oJBo1X{GgqwS}&#Puw3D@#0NO90n< z^7x$-Wo$9OxAOa4E=2cQ6}#S$)d(@tD7CiH(&TI^IRC(gL55&Of3$3H`vbBx9m7u$ zm0pLzOa2y6ZHSu3&(tobuXV&cDl6kqBv#9g`Le!wg4K5Usa_Q#Xh+8?*sL{d)}w6J zhHqtd`7=LNzM%;GG!$G;S?uY14j!|ou`@iNr}Kktd%eD6x4uu#3ASOj$FM+{a@&94 z;X5d7c1zI2b<(pGzseA}2ChiIl9u;KmsJz@4a9v5aX+-lb~5kYWS3pa@7wu(H^1+; z-vvK`i!~gi0y>LxFWGZ8j6J9i8ZnlDM{RUFld0rq?{-f?6S&q@oqNT-tWH3IK!EcN}?#MBA#=d3CL2jO6{YhGoBG|Y?6aa@tBF;pv#i=ZQlguZcWrx#Qo8y{^;rp*sn_4`w-`cd!+LK=tAD^2I%fqHvWDIU0R zYC0JYWlR}`2Ol4BQly`e%i;?}UBeoy+xvSAn0PUipG6UX=mSOLv9$UKe+Tzu*r(m$0Fy;$aQj7sUfLqo&c$ zw@?Dry~Kj(oa$mnMGXc6I26VVQn}v1c0k$XK+_Sl=)X4Grpa87HsPW`_}){_=QV+h`=#_F2^$0jPQ%YO{P=RS|K()A<_`Qm;Pe0USG^u1G>AN?fSp3! zFeaK=H9{k+Wn2ljX{ai8Z=uKCTfng(-CKa!qVcSlY#gkcYL#6qx8U>vcBGWyR)zGj0m$|7F5+_M5;Dd+3l9=+mF=XA^aM%kUmQ#`Jto5ayM_S84s(NC9g@s~W z1V;s3@?o^V{K;K9hzv13R@UaltED#B%ldi46AT+L|MbP-_}8EGIe$kBundN0Fw}0i z)8n@q@wjZJZK}KSg{FO}e~0L!M{&^{R5z)p7QZWhy#!aZ2l9Eu3MMQpp`d@8R4u#S zzmYj`TL^v+X*kp_#lW=z^BesRj1@t>{G@{!c{3eukm^HBc_|3K5GO}@p=H=j6}^ARdE};=fAO1#r^7#fa zip3l+xMqO;9H!UwGm&c`>`v0U45$dY99-Rq4rvU=TG8EN&iSmtwfqA$y(_C>g(2P#H1w>D<~n;Jn6tob$p-hYX>b!gaJ9HO zS6~ocUIx5;XYoLIyR+dPHz>TJ8SsW>!1Fs32f{m$4euu}ddAiUCSc+b5sSbIlh zz&jxWUZG>alUePZo(=ErLE#l;z&kMm-e_n2KzQ@A;hmL+cY2y%aQMz^?@1Z(#-u)# zh1{*#z&iJPjh&DNc5((V1gaOnWad+x7C4GUC1Y~m!enS+`^X2Xa#x0PW37ZMImPHO z6eH~L>nFc>`1Qmy`Ss>9I80(P+Ze-IP)a9uj*1R|unG`h=cgYivq}g!0hrhoj3!@R zn9Nz&p8LS8+?BI)V{0`pqWVhSi2$o8C!QG^P3~Tp9KNvK|3H22%1CbPQRdAzzqEPR zq){juh{6U1yWVD;@5)}_?K66 zsuS4>GU*29q#w=r<6U{O$AoZQQ=?&(jXpz2I}ZMg#4Q(cCE z?$d1m^F87Eyp1%LKx+ghL_ccEG4EkCps_Z?BDTs#BE83^EkIgg#!CG5#mhRRC&cO^ z`^JIzDOpK~|KX1hm!yp>;uf50Bb>-KPcn?F`vM3{P{6*@t)FBVflvI{tC6(!g3Q7f z=-x;N(bw$~1ay(@5}SmWCM;@Wnq(F&>tG)zvk}frvIsLN3t?D?rMhUSUMs;$$zqB{ zA-a30c?2^#SwZVt4hX(D+Q~uXw#jX0W}4ehrnMKaSYn12Mmt4*NX4=(#CB#Rx$R_9 zdr@Z5G6}gdpq(N$Y}0K!nY1ypAP|lqZ6Ly#X)eM{%SQNImm)CKTXNw_Ye65kkb_A1 z=1$E2BogaP7F|yeaIe=ZY2UO zVpti`EQ>J)<9OS|eWSYkwJzj+V_sQm%#`O4iKVddlGqN?aWCokm#+V#$-}%w=>*<)k3+uNUe{dBI%X{+q%75u0 z=Pt!z9$StN!PO7oH?Uvrk^w6!Tn7x-2rcvqp<{dvH-*$x>yMjpKbsFGH?6U^9vlSK&OnQ-?%`~NsV#+ znlv8I9DchEqZvXQH`~|ww*$jv5PX4(n!wUiVtixo#TGN;dI5qf1_O|q5M*E%tmvV3 zx!ansdGw&g;>`k+YasYN*fEI&%nc`Dy#PsTDGiHmcK2lWKK;0a#u4+)4_Gb_H_~kY z4zaC7B&e+czEQJGzk59hi~{yHOm0HZ2@QmWYYL@0340MR#1vD_O?~7bf-o-2mSny8 ziS&>l91~+criOs?L+P(sW- zULa8s;=x0F9Tz_ZsUaBBt@A?c5TTrVKA{9~+D1U&Vlm)Y=N|%IV>uZX*i@AUaK{=A z0GGKw6;H|z0Ws$nSJvodR#$xt;pGxy?ly~aj_!S`)vnJ<7Ui6NqPe1sXv(fViHcD^ z!kq6`j%H(<3Ku08@;uDjJOB;hlQ{Sx6lflurU3Y4+%O`JMpG7~M#qY0f(a($ml>{= zYdkx*k!W!?Uu6%g5%Kwel(?tR*K}1{#HO_xSh?vzlbC)VZzuc{>~}d!8LB{&#b;4Z z7s0~W%R#`c@?QJ})AwfVD&Wpo?7)nU(Zwt_oha85<-V0VmDB}bxq^YUB zjnp80jfG~13T!r!cJ!Yw&D8V2e;KoX2(y1;#$p`L^)+2%QN4Srk5}-qSKw%1ezAn` z$^Q&oTRl|>W*aqCCPeevQf5J%m5-teuyKhp5v)yxX1MHJI$NQvlQSU=aw>D1xPQek zP)vd{z)8)sXP+8eaU(x9^kA*}K*?clQmyvm56awv54iN5sHMF!R@r%qp%n0ujmV=M zXC8yo+Q2&?v2S@@yxnfY7{QKjy?(@w?*+_{lJr>ikp6Fs2aZtgb8%xfaW{qudOPGC z#229RI{q95^aD{Gi6o5EBQx8j4L(EYXhqcK6- z13_kM( z27O}Q4MLfSndRavJBz#=Db=Et#l`t|n$Jb|&p^$2S}?_K0boH1I7Gz)+Y^UyG`il5 z*KK7GmA(99n>CJU4c@ozb`88#R1NVp!GRd~*jCWSPBGraR^UYg2^<>cZQ z{tc0MRA^m3$AjOwA7lndoLh!>#8T38E9tp|^!)yPRyIL$P_eXQ%*CEH7SMR$rSm0q zv80Q!K*!{;4!(G|X1B7E{j8*umCVsftan7Bn+i3>k6`yC%qeWJ6+WY5?JV5I!rd$! zv>0O62E);*I^hfhJL6PDad1VHrE3ncPaf%)K1txu05P+|YGURwUDG?$SSnlE;LI(h zY@{({e6o{?$DsMgKP1&TPO8ZgY|tB}0C7hEp5NG7 z5K|AP+8_kZC>R=~VCblVA#-y^!ETVuM9ud_kpZl3=fBYvbSc4f06v04D4n66;9&CA zU@!&n%RHm12>W_9rWbR9YJ^}a(DSrjnT;`uX=523+rqLFS#~PR-mhg<^q%%!m9O#r zD&GeDy%Rq*__-bEOHc8)*XHuWFhR1MVSJ&{w&S4OX#SFf3W-jc zxZ<<2B=7zHMouD<~sg?xKTgfN<8q6&K5x>c`Yk>G?y)Ub%~uR zMITb@K7w4tN9#>jZmlswc^XBNMcnPdFr$rrcn4pc$C<8{ZMRmMubrQQMgDm_#^w?E1w?*~hkU8PB$kP3LkC4ZS8~uo>>O*fa!%AjY%MAZ{ zkFASLyBEy)k0a@yDIZq(dhqidq^Z&a1A(V3KFEd*IwC)dd4N7>e*=#qvf^9#)>k(A{Zn29_RV0qwE}8`9P%bb4jsc2e`w6a-;0hGn$K7Dg*>mnuN*gym8+uvg(Fw4VbRp+~K9lj6lsIM^~GQSrGTkV0~s`(MJYUz{*(tU!kzT zfs>J)c`^Ju_?TgjrJ%=D3=c;LdhS_Z<@h;jQ3xsx*1CGAu-3oek7X?~6wkt;#e(sr zatY^5hfzbC-Dgu>`v9sfc8YzOG2-b z1BfB&BMfsOX^SPzj|0)1#zJzcK^i;VE%j+Fh3}%Z!Pp{b1Ac5K^RPu1NS=UG&Z)p6 z4NU~zoy7{@Ih9|CK91AOWifvI?PI_rgRPs$@eH8)zS7rpx%Y~LkFFg#*5pFDL7@0ko>8nX8MrSR zTjJtYt+k{&V$0nk=h-5s3!xxt#%dMp-;uFaW+SEin$0;L;|Lk(*&6&ZJ#3|&d1%;1 zx1D+VQLI=(IRU6Da%`1b?~ga@IAHhW`I;6=raVd*Y-w=mE;^)Zy7o@w1me@Z&s58o z;`lss!>?JpDYLTmZe_EzvebjAk+DbJCS53rWM`hn;N8U9&0Cp)-CSr(onj}FPm$TT z<7;d;ewpW*bf7>g{-+h}HN*0OzW**=zy8FT}Ne$=#o zOYrn6!)z>iznm`PbkLn>?mqP{NXTwZ1z!ya$J~oQLQpsraFp1Sf!vEA8^yW>Jb3AB z0blIg#)%;<2ffv@?i0}x-OnN%9EYK$Bz70;x}PJ59?mEr)S+k#U5=a--@lcd5MdHE zDB~z7hHbrpr5A8Qv9WIU$0WPoIY{A3tX<)L6#6AB!lCea#YO5Li=*wqRw|?{+)&sa z9V`5WebsXAHqj|nCS0qYsIi@~KHdM$i;4#xbA*YZyXIKX52fBuUi9*a8>BSLGaFVQPD9k&D4@N%A{9 z)iNkQHZdnV^y^yKo&v_`5s@eTi(&Y_>{W&Uf-)o6`fYZ$26c-qcPsmhfWU5O55CeD z8P*C;sB|e$R)ZURWI}DAL1Zb!4mcpUKDN>=UaZAE4#*X?L$Jo!>*2I&ZdW{Ft5}E~ z_)dq6($rVcdqg_6#%<7Z@+A;k>t@}qSvjDG9~bt`z|Yt4vuH%v_p{+)-)nxzSgi5w znm8vfKPM-9^-mo=(Oph{=ClR#Di_QZtIm;5>{7y4!(NmGaB|rjiP{9 z_s@|K5Hf$#)~qL0^aLv>UJDo$>%j?D-c|1n?)7Mg8K;fnme^$X8^^~DGNhr$0RTkC z2Il=QIU^Ww?gtLeHAIBduIQh?;H9W*s1+exAPsK^j!5NU;2hWhV%^Fpm<>kz(mW zfR{Z$`WtDZJuw8)c8EDolNv+LHp)zr${m7eat|~3Y?Hq#Le(M;2M!g#)gjWRj~QS6 zChNpf${^-~mA*WGP=gpLu0W5@WDOu` z7s4#ie*GyV)SDlCegLIwfG}=oqB_Vuc-e;Z)dJhITx>hNEsIW^7;(0^^4g8FMz$2q z>_8g51Bj52m==H_5#}0*o&Q zR7K-}W(>wKg>1$RQW`|x=P}H_WX(S3k1A2Q>W<^Ckw7#ymf5GIE9(+*Lm?ujP#jjq z8Q)!)+}SsU;7Id15e!_&pm-^Z_sXF`)CPg13;9e91(d=rJVfk+zNXI#W%!!Rd$2N} zDh@Ad2cXFW^j!f2Whan2FSdZST5$${rj_;P&$1WAp@%R#Q(531ujbTh0W+Pc3({av zRRDprn0kem>fn$rxjJGVzGVPK-H~C%0as+PIV>G=YuXEnl408G_9kog+U;yrvfX}% z9epW|qxzFP91Bvq26SLOm#}s}%34V;#$-q1=QH(5NtMRC*TVgo!eaqG#uhQhg|~?C zaQ+N82dmV+%N$M2v79+h&>U)Vz3%w1?-BfbsUYloCK&b=LLR;krRn?l`!Ra^(ebk> zf19`uV;!xIM9Uz%(7e~GCmzU`_*XB)3ot`XcLeE8EUd5jbFVA7>mVBgsDl{Uy z@SkrdWLE(mu*KFz0|+R>(X3l+cGr-jFZ)baqI}p=S>q{2jb zYot8>FlMOpTCA|{YZPOI9YLVL}m=#68 z!^I0eGuNwCTG7~Sri>6&Q}fw|rP$t*h;VEQYLxS^C0-fXM2*Bkv(Ur`wA@EE@y|F8 zsU#cNAvTDoNYZ6WjJ=!*=mp$mX_f0L0-fg&Uk<*Jf z>*fU8*2rAbZ_TRWkJGS~CHmWIwkGSgG6>@7%&iVz8me>)aYK}`EyxRtP_ z!M6L@S5%BaEF56ifPqYZBZR|{D={i&2jZtSs=fj}#GX&s@QMtoWC63&Qz)YxO^)`p z41!GnMoVR#C+?(2qUGQuv*Qc4KOLHQ-F{wRHo55*!#F~Bc|B;x=yU~Fp|ljy@F z4*Zr*^71%;wR1m=P;jpRcfqW*+4kV(WZh=z!RL_4BlkfW8vT{xh#zc|eGnm$#7HAs z!BDpJ@(xV{Vd+W_cZNxbM^fjn2nTR;flT3g6PY^?O166A|NTeyi`^c^5pM-s(>i~fuLj4(!_-2&@{Tsb}Sd5bCl5R*oh>xn_c?10$rUUzRjICtp*-|<$Me&bSFC+h*sP#?azPhDX40B-WYT}m3Gn*{WY)aN`qEBm?@T2%9 zEG0gv-F=$vKe z*@s~34dhJ3bZGiKelH5PejV?wUwZ3myg2l|LJIA+!Pa~Ag}Xo!=YjDFg01}Kd;w`3 zR=6#e*cA`dXgKLq1)Sx`MhaGpMp#p6#z6Zmk8az6qzryuwtvqWz>g&o0}xUg}2Yy)~RwuN0;a-FUy zbu_}om${&;;l>4izCNFXN8}KZn!FhX6>{RUxI-794FnzI(DI}088{UjwO$^&>{LZk zn?iLA7p$_ro;>MjsfHuODFxJ6>1=%Zy?jC>R8Rvpd`jpw7+Vy8J#Z|80F0QP4_I8I z+oBUJdqh3`khVUIiKoSr18f8y>KC~HgO}g8l&fQ$!Dv2Chwx-L(w<;GjM?$7iOuot zRN!64L*!AOo#o+KkuHG#I9^G!hVBQdig`(Fw-{Gojx=I4GS>B}#*oM1bvAA_TugL- zo4(L?_;Bh_s4i{@6P<Zt zpQX}*oKvbS|G_%U6G&JBhb8P3dPFRPP)Ie7P}D?j6w*W2O_ehzEnw`;ne4LhL)_lf z=Hcj)nTa`2`s&Zux+Rak4k8_=rRm(*5`ua)*JZ?ve((FCh4n}p7V5Ws!@cJdY){6A zn~QEvYgG}*(0}F#uef`No-;JJ9MvAme&(5*UM|NV9sQFSHQ3JVlx|)sj7dZG$_Aus z*t`O)B(q8nEjh3hz%B;30HY@mF^BfhzqX+#^#}b1Lc@9Y6=5DQq6@HxhFM(9LDp3h zYmU0*2zEfBcSsZ)#2AG*0fm|n*9O@DxZh@AI0uRv?xkWeqi1a@MZz}s;gDFFeMHYq zdS*cLAeVYq&k2E}`e30w{NjXPqmh;!F(cFrV8@qk${s4gwx3Waz}V&v7hHWzp@c09 zaXlBNN2EF#wvcFu>f8q|f^nEC0CbGxY~DXwxhuGO1xkrnfCD+lJ?B(poE5OgQ(t%& z$F$$gsc7h1G9AK&mSpb>5|^E+5~orQe&T2qYndI83r-I2KfE8DK4C9RIt8&u$!>*1 zmEE#(Ngfx&*~e3Btm)(ZDE%YQ`M3a;dP1_gL_F4Uy9@D?X$r_3zk2TQBb5!kOEGi= zIc?_gG;@QdsriF6TaxMnlX&PL_;fvu0`aeuJme!-=L3faV4&wgGsKBXtoR$DjVH)Yzi{z+r_3v`Pc>O7auls-<~4Pd6dtsn9u)eJb$qmRb5t-^AiTNYWHm-+tMgxT zd2z^o4bi6?y6rVl4M)V%A*5RD^z#ho*azb!!sNm)h%CU^l7= zuGosrwPej2+PibF5_|VE^|W`dX>l$_S!7K#uemO`Vr4qtu(^_N53)` zXwm`bD7dErn{w}|3{SYh6*?X8h!)qI-DPBwLhMuxg7~MNlxa=$MQWl~x$jjW861y_BO(lrZidGIR_Fp;p2x-p8xksG7bPZr;Qi$QWk z1g_#S0&-_niklJ`?z_5%*vq9?G8=AA1k~&k!Yj4dgu0a|muy%C{J|Q|7NzjTli~aZ zFVSGzKOvZ$5MHHEPYkxb4kTUDK(=L)ruhfy`0$wYxHur(aYQGT9XZ}+UQ$_*GBVw=(W~w7jD_#Xb^u_-Hf?J5-V zuE{!nvm;S1F;;%RZL>D(XJ@*-CCyrkSK)W`78>r!o|$OtAF458I0`%ewTxF5tOm{lHkiKJ+pb69J#ElGEik?-KXhJgD@Ny1^tP{_Cwb?4dHL=lsTE`I zRCuC&T}1NE_44vPgG6h-tt5K$beBX9Czc=MRp>M_*oN@w9-V4|!W&hbO)$~^p}Ney zk%9s;BfVVHbLcO}opG>dUVUtG9ozq2R{P7c3wi)A%uaU!#$ml-Mdk@abO2yj8GiRI zw!rU@!xrW?UAKwC|y zD(<}6b|0J_*qv{L%b5qev7tAri}9#{gKZ$5M;bVpA|p8(BhsyfyRw<79$REg$G4I! zTl%udLLNIBSXp+e?dmbFA-JGiAusg!#U}0100^M;xSI6%;{;0&s-RE~p^C!Q4a!m> zENK(m8z)<&u-|!Jb7!cW3=E8YYd35xdKR8QjDLs~b|I`N?KL6UOGS$4x0ea&GUVwT zV8MS7JV(h>egixTv2}co`$1u6wjd$;Y^AHuUO-DYCgB4crPm|K7cu1r`NDv)*aW79 z()@cDQ$o%#fNSCPLYi<)2zk&c&J^RuY;ZqGpzd6E8OgDiH`* zbHU%KV}_g-!9tcl6|8#W_lq3Vd+J@+${+ zQ5p(6XfJ%vhO(TFQA;JASLJ zZ-HXvlZ6zxj6GI7LId*z5``q;4LEhR((>Y3S(q z#g@Y7(a)9xy>Ya8rISrVue^**-jX?4^Kv^cm3rBkz~Wq7v$%4X76%`q_(N{-{n{^J z^dS*Qul?=3nQFgt=u{MEF&0;HYjKP<6rbl7$4)+1!~imcQhr}Mb)0?9w^*D)MUWRB z&qV$txASwwHWLKM840%=Gd-)zKK{T+#%8b{$k-PQ$iZ!3U5NX0Kc%gxvX&IgTw}B$oVnB=8je+L zi^=WesJRTRI6Xfh}oTCI0g(6LC&MA}8tYD&<| zCdYBVGRYuR7NSefOPKbZ!y;yBw_xE8UJ>Sk-c9^E4rPc53ydA92)rlSfuLn8tl`MWfV9|_;W8EB0HJ7uNy!N)4 zRHm?#6Vk_|BsgPG-uVD_UjSK7Ae*O0OxzD zOYDbNQ!~t5rRZ6rR%DnKBk@ib1v~wxL;~OKS5T=99MXu1~kSLVK1e_aKc?~P4dgS$xUG&W42h~tu zfDj!HPB6+aXIe~z`739a(aa_wV7TC-@d$$Lcb~xWA_)wKqCYh11Ge4uSTS_Op}%EZMHsKEu;ez+wfe;lM6C@3%mqb*}h$```EY$TybINP^Z8|)L7wHjj;v+%%dH5wQ9T}e^HIIzbe1V*xJ?Io2h<14 zj8|(xVMg=Q-w^?rVAK|(R+!TyG34AYP{oikNqFo;9%3ht!R!WG#mO&LyS9pai_KLm zqSGL=%A#!yC=0eP#Fczx`}bww1)PaQd<658Z9amSVG?s}1~K`p#N?BUyJ=aY#C$#o zz(2q*0eoy?eltzX%WToLEP5AskeJWBqr^ne4{=*F1zHfq#Io^S%S3a}^oxMsdo75M(Ij{~`yIN`dcEGl(hz2CA4Kpfrr`%?2JkX3Gnq{nv zq<^nVO!iI^#hv>JgVJN53qu<}s8Fx58D@}#Sk>_2bm$9oV1;%M5>(7CZZ0A6qIe}| zXt_asng$KQX5BiRqOV(}N>`X(xUOGf`X+7G>{%SuckSj*~LptjA|z@YQ_s z=Ae3u*9HPkxPXssn0?fZ7H6@wfipNsl|bDEa6mC@ppcOE|AjnsAp>%2PL>#YeS67BAA zJ_@1R3+q){ER{hWaJC?;^A+aTZns+$Ibx@$c66bODz_-s306Rrs*5cAkL*!A7f6+& zmtjRK><|4;6*j2$+)a|f!2Mn5cUl=XugF5w?*cB$MPlk82hJU^)c**-9)rolRq&KJ zRifb4i-LFi1N`cDb{>beZp1IC{zS3qU{#Cg7f?>o1F#HW1C8SY7H=6M=3*@>Q>5wx zVcI?)C0rVE*d-H z3sHMZIn8d^3VPF0fEuyDiU8^lEIfH9o^qm?1vS?6KahalKa~Qd%nP3PbC=iPWN4B@=_7WX}vAW$h3wIR>mS z3~b+!L=-3K6~_L5XCgXUHqZWO2j>Yu*ZF6jM|o~F!e!vKu8e{Fuz(9Vf7Wa*({_R4 zo;B(Pq&nO9N%`fo)?bjpVY20ML2MgmslOhOS;}=Q9N>ah*2F10R~(3q38G0rVo zMN7rAT04p1cdlaX7vUGon2XZ3P}-%Yyhyzvh;2VHWWLm@EO8o3qR0rfVE4Io2bnKZjt zY>mmfwRHSmn`~ICh)uJIt;E)Zt@0CURtHGVZ@#LU)%hsyOeT!15oT>Rllb9(tXaLQ zn661E3EvcZu~6?5Vw!g)F#X3Xis=dzckXjL>wjf7qT+beY;=9*Z1nPd!v4;9R?dKw zLXH2Cd+$G>Ea~(h?!6)pCb@>cTcsYqLk)XS4(q@NrD7V0$_<27&adp+(bgC^I>RhG$(^-cZqdFQFS)5fHG$#9Zh|n0(wD->)y0Pow6_Hy zOjFdGWFWS$<9kw4J%N`{fDu$J+@aIetuLsJ>1PMzHj5_Ab!4H9rpbfe$Kr#>@)ZY z&kXyP;O9BCZT#h7-+cUBI4A6DKR@hy7JqLaPchu|?UKm9%w zkHh@w_v7$5d_?*^fX9O4)9*n%hDN5}N8#~=!t{F)9#0&delN!3Nn_IQpXBM}0hz`Q zct1sh$w?FrM0LV;?Uj6P9?9os?nX_j!M!>D=5k4vTiBOPmV;jMyre{)CHqnwT`Qba z7pSQ7FJTC=^BcWTMK;q;XgPX?3B$~N{8LQ$T-MwEl1)TnZV1NX4PuNg5squH7 zQrk7lCwAvx8-}g#jhawa+7ptNkuRsIBr8u&Q|OJF;?A2wo!9u)$M)_lxbi&%X1M8J zv%ZJpD4+2?Ctfk&dv<-2za(8>jzpmamKmgwD-K*zOe855kQ6_8{#c|KD@U_%2Cg3m zqY!s-2xHvhRNvSrZ=AqwDPw0NKtYT?LX9!=D}jUaQhn6g&7LtL220E1jVR zp+ml{8E~q9(J2(NI9C1Nt@42VhIU;4(8q2;sKwc1-RHb^hM>WGBzNjS1LZ+^hFHKJ zTThZPzlSy9UI8pFD9BBLW&mJ??74O$Z_0=M*?HNZ@2NPeO;MNAFg4+R)z~i)FJ%Z%z~6U+a3~ z8vM;1O-v6lJ$sZ@#m|y_Rd)2tC@tx%b4Rg+j1;*d0*1qj9Sq7^0VAX8WukcFzGI^J zX~?c4OVMP1&eCQ!oX>%rrC*{idevXDW+D~$DmXI%Ew;D6y=IlpPIe<#y4VdvNnF@&>a`49!Eywm}W!KHz;lmi-l2Hr+cX(40# z-Ltz_nd{*A;Rc?%N54nR?c;4m$n-v-jliwjpf!uo&wWZCM8d%%O{}uF{D6rt-Sww7 zDMqo~^|PV(gCf6uh6KbC!=1Fzwur%LdYwdmAVu@+IeNdL>hEDVqiJ@>R_tB`f3dO( zosoEN=n`B)t||9PN}nI6>kBmHK}mUkL~zw|v?RM=!Ll!EL7Zkcjc0mi`4JheZ6`pN z#m@wV7Q0wI3oO`Nw!N{;e7A+K2wc&hn%FqQTqaG*LxIa}0myB1F{a5j_#%X4a9>tHC^W2i1_U<#pE3o-{ZT>zp z3Dm;@UN>u3Vn#0@`I;uLuIr4h#syFvdNZfP| z9%wgfD#b&H4=3ZHgb$7-?g4+|y&1t) z+RWU6&}%*iZwwjz9Xq8940+tv5dd zK=KSFUEFo2p&AVav2k}8JVV9~18G9VW&kU=*1rrT)^5g1qAdW4YzxTH+n)+3Fnvol z>`zP^!APAPrvOD28Rk#>Ce`di5f=s`X(sFTG29U-XU8*m9z*vaoHxN%z&&+lV#X2- zfBHUC9lZ7|x67neop8w19(4MTgC+jv@ow9n1|8Y9Huc zH|$1EX+V43?qtJmv@edpVf-95zh9}sUQj+ajk038(L;@pkFpaX+NJ9~@7jqFn^ry4 z#ZFWz2o*zbzCxmxV*`hQGkYn_-r6C;EH#IycyNYsl*&pV)6*Tt$}_4L&Va9AGv zI#-|Dqb1Hy{h;9Kr@0hthR{b2?b#D}sH5L*1AQR=E&=Bv;?M!_9_8To`V|Lu{Zrz8CO8b*RXfsMwIkWE z12@$Kzp{mL!FJaJ4+pJCA3^%_G*w%2Uu(hGV&Tqn2l&YRh>$yb5! zqhz+D^ABgm>u;0BAb<~O49@MVkF7x;n9G08nlKF_lbQ`L)D%>d8k3QGC(tt|rN5CR zz)Nj>?}{r-z?p!ZG4thdE=m4`2zY`psJTIyPDnB+pKnX^Is7lT;WD~o@%h#?@wO%# zwzA1MYo>f2U1JH?%O301Dd{%p4M={(Hq%x|cSx(*Mz?E)8slv{K8w97^Q%+ccARS4 z!G1W9HCB!ugpz~4Ort!U8{b#jd$ZlDTa^QZn?`9XB8_L7-hUD_SwfcVhetrqNCEX3Vhx zs9f(4X*xwSmBc3|W-zcIt_7C>gIJ4S6)!XkhOt>ajc1ulw^Oj>!CrEfd8Ajm9f~}v zS0O7R2{S}bYNWXq>OJ{Tx&aoD1j3@@ewTe<>DU~MmDoHEm{&%MWdnB&G(at@=|Ko< z*VSu$qtK50f*T!SHjx;LJu(GJJiH#+GeheaQ%$O^+NqDOe@5_QqS>>YZKKJTjBv`zAui)5L{(eM6eg zw$ux@eGwTg1ra5I4H>1_ah;tMAsHe(IJ^7H_&u*sJ&rB zvStHst*bLu?ii6fk5cZK_PR%t4Uh8L^Q&>1R?2lMAZ}_LO5pNoOvRm1++%k@tW^+U znt}IFXJ!bQA7^Cf6qAtxH0II6)Klk+UsPI#xN*M4c-19HttV1l?RD#u4eN;%ro=8m zsw>&hW$j>^u$HasYHwJZtXYdtqnHE+v~P`V-ECwr}5oMjR^>GdtQ<20UKu&bP>Lx%-uH$bC=r5q2tlAgh zgRPy9NeN&;BF?mHs3m8BI>bP(w`?x9v_fA-W1BftF8C>#7FwO9;R+c~qKHifK`P|} z6^u13V(jb?>twkrwrM#LjKXB1m&i$o_o_I2jSOEHbNgkwJY*f8hHm62lqEJIM+(%4 zd0YHbq}CHLl1BAdLG&F^Tm=#2&kr%3L<|mNxUva?2mzxmygBS!dt=z=;P3OdgnjF8 z2>V`H5cXYt6E4|_VSfWZw=E3&mO)ka4adKn+#$pB@`n!{K71HoGynNBU+nW>X@g`N zKKwW_P}EwveMqiMJyWktof=%R9x@dJmAZRglj!c|4!K#u6_1!1&RfW~VTxtwVlf6p z%_Bk!E~4pLgP3LLxec7je%>L3r})H z<4F}PD6ex@G5%DAPDTS2_D&Y1W`I!USU=NjuKIYXTU6IWH;JzsOd$;9IM2R_vUa3s z>a}92u*+6Y$sl0`u$Ub9=9(Oa!LeEBj?WysG-zpNY0k@7^hk5`O_o<&^k^_Y^p;qZ zx&zV+s1@;fiPaI=hesuT=L?)`NPs70XfSPX%I!~6ZojO@hQ-5P-F7`@$t?KGdQ4&p zvNgIM8-b%4F8*AWU#4%7m~SqI`i)y<+Ldc%?R`qOE#m-%wxgRaKfhPUs~~)$*DBXy z((PJIdaT8y*KCC&sqhT1*V~6Jl6G`=PkR`1He%XhMx(h7Mz_6lNg_DH`JMS>`o&&3 ziP~2ZY%9v4XeaTlWc1o5Yd*fUH|&))-*G%sG8p&CnvXvkk6j)S$pWwk*D z&i1TBDC(S0=6(UUJuC|Q5?>1Yevao|w}*Xad@<~M9rD_jBX`c`4jq!0 zarx{=Kk{nYM0c^PwvUd{$tAWG7{qoEjZL_Zhf}Z!d>btF-4f{BP_QowuJ{&&Dndc> z&aQ=bbK+>L#~+E1;KpFbWFgVRqows`xY{TZJ40exfba1mmS_5Hi1D&yWGW;kLJ+h^ z#yU3>yjz^32$#qN+cvOkGgG0f<4nJ;1=(by4NNK9O!4rEYT-@Vrp^a zt$K?yjE}ko3%30cJr7et!Tz&n`)~~eep?PUt0lA-)FN(GBzB^mJBcMYTnw3!ykvnG zGHd;2$P}R0H!;}O&rT}Z2`Kd)90w6INg~HVD)p+g<`EmjdA?iP19L??`U!W2SB;&G zqOOXF7}sROi6Z6^SQ;0FUj!r(f)@P54cFSzsHtog7!r+>w|-F>>E-oAoh;k^J<=HW zlj6?sYr&dBV#Ep+a!d9H64VP#!`3agadFu|J1!8Y>&1RB@qow&Jhj~BTEp$^Je?}4 zG3)huyTsE$Q{a!J_S&)(W?;gPl{Nr_Upyhb46Fh5Qi0kh>wY#Frk=a=hR`t*e!a5c z93d!*Cs=-8xP(p1Gh>f;=cE~n#Q=F0C#RQ>jTp*aEj$n+U~@M*7jPWfy6tVYP3L~x z^|8Wr^=6d9ao6YtaClRDfy;3i0VC%Vz9`94mFc()#i0P@Tu`Ell-RaeDIshbHSe&e zWwR``EHQ(Om$wx1bPkN^z9s~{;6t){W&-z?pOh?+x9CiETZZmEq4CqP>j`_F!sZZD z*1Ga)52w>&i<#v@$$~v4chx`H%VK^CuRC3FtLi@O&aiJal;PL$^UUI~uLOe4mzR^1 zoA>|s-w=_p6CubGi%S_Mp7TzrRTVKqm5LhBV<)jvm9n`1E9IBlp(SQ{x9+8g#|bAp zdYr&JyQa^F4s}ZL3sAvGdBL{dgQ)lrVj5?&(zNb@doQ3@8Pp^wU|UHRZO0u8r$cF+ z4#|ptczm(&C>%9*IYVSSG`>*8z0?#jSK^Kx^eC?Dvk!VHd(;H)lMi4VvZke^XeTv)Qxb7f4gfXy17fA7ZP}wXyZ=-+vy-LqSz< z%Md=<(nmZKN{|)wcrAZt{cPWXYIX-MGlJS~Egotw=6ytr3f?6vSl_J&T}G?pkI!GkzpLg|Eh zx$Qe*{<{2VsCRl$Q`0i3>|jAn0=dNffi0U!+-Y7}@k_D9a3_MT0Y98kfr6j>!ltMgKqD=OALVb?eqC}@zV zaYPNb1<1M}UZ`o2*mi<@)fLHp1YF3hxi+t|E)W;3Yo?T7To#O1&MEphvfjKYCkbgM z;OdT_L+z1}U{joo(5#>e48K~s(S-mY{4M2NAjdBk9)`P*cU^-&b-tt_pQcfN_pY|( zZggxv8NHL}7knU$p4!X}aEt?Po5s5MxtpK=+V747&)>lpA2wyD^Ei1kP2ZOH_9LMQ zhjnaN^cRc)omHG4aJK^&Y-}%S+ zEx!|fM86Y0AMu@kod4i=!e6D|37?Pn&Oa&%h<_^+75|ycN|IGdpmjQ-0jgveZ{t#F z1om)%x48_HC{L-&1YqhCsg0S*BdATv**xQgR02O;ReYF)cuVDrzTrB6NDsKX6~`Jk z+zN$lji2GVhI^1i;&6?#ANyc3+51zoG(&od(e)H}&)M-<-ipo$kvC2g>doX^EhsLG z+B{IiNyiE$K*a2kFL|ygz_7-S|MeI<|7)HDGRQAL1L_S<(X)9Nak?MVh)B#=Q7Umu z35q1W5snmHua+2hNO#W@L_d7fEvqeL41WqqXN(*o!*MZA1dPi8YS32_u7NeQzZqb1;YI@93dE&6=xvpz*mCf+DePdAAm98BO#+y-g)G)kdn!tR zXiBNrRu*_?gIfSM7y-Ww7M2QVE0DB$&Ht2_-}x2FD=1RhG-08uyv4xcs3?0P<$Zsg zNOh*lmyMRJ37q%iaRPri+3+&W(l|s0>h)`55q8}QaT+IjC@O!qQC0_*2voT@>jo2U zzh%pg^Dvc*#`So^d0>aw*iS>;PQ)*>?68Vk>9e$6r`E#(HZU0wm<6k~7MY^lz74iM z2*9KtdUIc*d0$SjwF30VQ-0G3{2tm=>O_&n#TFZc%ZcQIZ@T1nt|Wv3M3ejZK(xJL zX~GKnSyGm5{o@@h2)^%)A*l**izr#^%?VeM`@yI^jXn($2@~+-NP0+cRiTGx|NNL# z4#RM7M0@x5HU;3kjl~`T2tEVnpi3eeB;~tqS?=2kCq3+@z^z5jO&%#K(_yEZ*O~TE z*}W$3a;H>Ee^yJAaW50b&E}rnmV0)~t$(Zdh8G3^3Htv zW?EN5OPanqAx*^eVb54twcG6v6Kz~%Uj2rphbTM*l*Ao#@Wc@r9x>acJS5z9EidTn z9!IxG8zF5K&^N0rD6`sTHLdm`+cpf^XB6#W(WqN=-L0V3jZ$*W^kTtcc;u zkgVH|qu6j}NHlLB8eFkQ`e{3EbN+*sP8hAB%8`u7lODNEbX0J=dO3Q{EP7PP%&zVb z5SVEClfx_hv=_^>Y%57Y;W>CR2#;KxE*N9Mv}lD^oEEK3q!#5Cx)IdMNte2Sr4%>d z*)%Q#vo*x*l}9|x4Ec*z1y}2a-9l$bafaYqdxJVdjDUG*P*0MhoFPWwbTz8?Xio5A z;i6-LRMuXzC0VzHTh%z!HJE=D9TTK7To9P7*_^=qT+H+T+GUa0baww!kBMl^B8vEn zC{a{CI$w7i3tbff^P!B!$wiCEMN0_gbAMMZay@bXt(PTavcD-2_MLrS*mn(n4&dh( z__-NrygD2^VRB=5-n12AUmIA%{n>ke*q4K}MfkzWTGtDhOR@2u-*h~F4{d^*cmJ@a zsn9+f>_ua`#W+kRn$+p35`LhnWT!N%B?VH$I#wbz#fy5pXvUPqg%ON_bMF$uz|59t?!#4fH&T>? zBRvlk_PKBjSMb6C66PAGF#^H1uangzQL^+y97C_b20U(qsu)L2jqza5j~>C@fkALrVDV9x#x3kA0%ch z7lYaDRH?EZ->zdXdk$-|`7wthAj9#k39&O^pu=H;3#`pZS^`C7+$=j8QWatqBF9Z1 zI?e8aoHwAvUux4ONX*#95F}>vL&TK27HYy}RLA3Prt?*#n51lbaz~Dw1KkP0&F5O( z8i+pJ!fK1j=z|Fv+Ha(jWE1=lu7YLIRv@qYsnmB*b%g$#>9@g;ne)hFTb2jP&) z-@Xa2cD>@>HiDSAfNS?#g01)CMT#Fa`H1r_7cMke)0Yk#Li3m#ePynA$wfZ46?Jsb zp%cbp^Ms+C^7GD*4>*?8+S7Q2`9q2%p=~oUqfAVb7k2QkUNC=FvWPGB=Gnh68!ncF zjeU5xlFh98yRED@RftY4pam&vepn-%K&vwcN~c6%g`btLVpN;u zk_I1O8#V7;LI8*qrAUGb5p&Cb3F(v#cV90xM9daN067T&DjQko)cg3AE`cDvyJvr# zCXy%41FGs(W`?^s$QnUvXSZ@qSO6+n&h@w;(M@S-mppa>NO1@1X-@>;ur1TEhPl%7 zR>1x;%V_4uViiDKnnu~5#~nNDI0h+j-C=piO=Mgz#h@N}10j3uEL%2sX0fl@^Ks&Q zi^){e-#-A_!0Mam}M;3Z3NJe1@tji@xgo54y-IZ89` zeAkH+9H5gvd}=wec=6DZT{OO5)xp0QnVj{C_`IhY4ux2%iKU3<-+VRy!aD#gJbogJ zbIxlVX1<7H3>*nO3>VmwFAz~wtoFF*{N0Cipy+BJr?7y921*e=&R4cl%T;47?4CJ| zwdUThxr30R(=0h?Rnz{3V5f!Lp@$(Z&|VwjSuh;RYzQn&R_89v&jIfQ7Pg0TNk#;| zsV+=3;|fNsqC*Rl(cFbl%#pmXJ%UR>F*y~sqx%8MTJ2`|F=%{CM>b+<6l(<)%n+@3 zPriHss)A=r_ewlkZ%ASgKZDi8aV8hfaOFppg^jnwc0%C9_EFG%%8>?${f?Ho$FOIQ zK1_YnxY@I}V1eNa)ly9U`8xF4MKarJer|(bV3Gw~88Gn$k#pyu?&AME&zL3s3=R1;h zD*gac353eBa{CZ$y?nS-)Z)_G=PH&;J5fAbOxi_qdg5>88%8e3Y->>C z4z|4qI!Rvz1ggI>>{oxJtl{w#sd+1@xtP?v~ZW!b9Fd>Lvy6!ic>cB=)|A0+BK~9QC9o+x20N3W(*hZU72|bBx2qa`e_B^K8&X6 z9txS&o?)x4w^VI{QfOri(Dv(B4r{Bz$(GK4%E?^mN*sICP&JBnz4^WO&G{DQr!3O# zW*hdh4KK3|=V}|IW{j25v1j?co8SBR{doIbJ0EOMBXZ0?58n&%%luU*=}d$_>v2wF#hpX}OTn(RmX)Vxj$zp8 zY8QkAecN;Q3GyI!Pewg?x`l@e(gp3NF=_m@>0P)KNee20U}!x6oXi*Hj0bl$Q`cwK zGS;g_^DA2pbyK->uT72*=kS1yZ!1)Oo>$sRhT##N9;kR*v7_wO;6=dLxJvXoXlL!P zVqp|;Yx%KPGlx#57b~cxy8jmIj0Y-0L*J6D*@BI0aLSu#No*#2CBj}g^j0<`op5-z;vf99*^nYZn8^w+Ql9f?Q0H4-Nz=7PjQ9JPmwNZ|;R$!WcF`!xi=& z;siw#)^w(=$=#jZWo+N#bdbkErWw_U z=C0j6zJq_U2{f?VJENvvvwGc#fqaQ3k%b`2E6(!zkcVE_hnqBa4|;J^#QcB6y$yVn z#kD`aBmq`f*i{2WMTr>S5u+laK}{m@BAU91q`uVKVzqXS-qvbjt@0AwL`>II+N$+d zT0v~pTiR+%6pWO6YjFDBY7%|HF5; z^WEKi_s?&-L!yl9wa#2EL)JGyO6i3#i`ct+Y`$0??16%DbR0SWENSuQU_s*VvgZMb zVjG+?+gnh#0~ou=K&s^`I~B-)iUizJN<{cXlFTsvVeHA1`88I zj7%V8^Uq105Sgu2E7OZsCcip2Q@4_b8{CZQ+6OxH}O$F+F$bzpyEn@tdc5GG2*{oK1Ee zaclNzaG(&QYHQNjBnA=Ge3M-mc2?TNRjBA(2HDI#YB7&=B@*Ss$lgh6M$K`4pF`{( z;7{s`bL2G*J?G9Q(?2OMqAwbC({E}&d(Vnm=P|LHq3i!u{r+`u6H$jz`m@^MU`X_g(m0_9 zQWX%&{ZC`QZV0Py5M$p~hUfM*d#Awh{ zxx-E69A=$l*5_%~W^|>TKqtkiG7V1sR|)ZsR?R^OeeyIXE-kT((yjgr-r zhJO)92=PzaAl$|MtW_IYtM1BF-^C3vST@{17K3M>mMJ?^QD(F3OdZpRV_E!V%Fa}j z*@T^`nMxSkOD%7o1>R1dbwT4ewn(&9cB6t@F^0)bRqec(DaeBwr!&iuRi+~lWWJQQ zVvWG0k_S@E}ecMF|_ppI?PGo@)s8#E82KiU*y}I^VJ#+S#^Y|8o)QxC! zXN_Lbonmn=XV@vh=S3OpHItJU%3fV`mB0s(xv{jKhHfR=mu(4TdAv|L9^tHV<=5D! zEMH1I%a-57@~6vcB>1-7$B);M9}7PNek{h9^T=zSp4DFCB&1Q0sxR9q8fDI~G%0lh zlg?t&IZS$;Ce<3jJc%ABt5q0>J37ZmFVBZaeG0w9G#0IYJ}_Tqj#o0r6my(pa+Lad zx1-6JL1FUnc#+0oWme|O%;~5%v#2H(bvKJzgFxG8E7BfI^I%CK<`;Z_WF^3V^)Uos z#pmsZD$Y5SLIheDQW?2UtvH6c3q4JxejjA z2wvw0(uZCX$j=_Ah`jf$ipXjARz$w>?TX07_}hDbMP%}$24vL#Z-oD{-&J1VPJZCJ zAaFf0a6Kw;J$k|SDBx$m z6IJ}9%7lGw@SLURO(Nd*3*1DGZ6-&q9Kz`YbLa2K14J;QO+co9z2%KC%;FAY9jaub zD2>K&(oo8}<-q|^%m#WG?y-CTn>r#ApsvhDjsX^BIbkz`bSG^lYkK6KoYQ*XDyfGv zVm1GE!J`<3rk^KGv;PdSmz{+#yKc$d2Ha^a#~IABQ|7}t=$bW=qE-aamq`G|I0Pak z4QK;zB#2L5|}h@ZLB0-deub&iA&zq+`0)x~52c7h!NLDw8{0cEyr9=J$PF?~%G*N`aj; znOPXd<~vI2$vCN&M-oyw#fEUH4uvCfO5cWUnTKForar`;%mX%)2#_fdD6{l-&})(& z4b)bkyJ6A@$ETRtDkL|PPVu=y6>NS-)trA3?_Kl&x>gAIS!h)r8;gE4tJZ1WEN}BU z{#)eOV7DG?czYWUv6By7%m3hyhi$HC9mi+bxCtJEU)!n;{0l6)!4n3pv)AD{dcwc4 zCrp@i241Flq%Sj$zgx#$hVPA4yYZCWs%|$s9wP(8;XRfqTq;Y7SoQm~+==3#I_85AY$1<_y*b0_j z)EQ~0lRHtlL;w0n!+9{tn;o0Wn~)mZim)h%@{p;RTvo{{n5&Yq%8~~7KJ9=#LpFGR z%e>yT9P7_-+$c3#CFIKul~Hjs5!+_`o~3APh82o8e-*!E?10rLy=dzJ@nz@nPTf|x z&o=!W>*HvMxeT%oM&?inK8V>}r3_=7J%z9HcA}M$^$_3`AydZ*s+!|C4M&@8OFv&A zPq$&rYdAjxU-|?8Sb3Z$+BYZg+a!3Bq^!M+DGxJ5W<>0M4<8rvkHCwiJJ4-RY~^W4 znOyC!ksbHs)`8~6ehVa(> zBE8dE!7$GHqOG$ap8_pV9iaaJ@}#zN#MsRdNUWq(W;4K_r9P;6Dbf{i_E z+RqT^9-rgU2&3`01D{>^l;fIz`8fx_>30Jfb4-A14I(~s?eaC&zb{#`-c~TcW zv$6md%(q!{hc(~Bny>kd)VvF!!?D0yz@_DP_(su{c%uYg&e!z~o8Px{`JtHXVMZ2R z4vZh5+Q;MXH}Hw%`~Q8?*CYJd=jW-P6R14{lq7S5O=f_=>`t~ zqP=0y<2Zv3eWT1+JJF#RuS4LV#e7vquZ9^qa@~4Eq~UnK8`@Ue7uWKI3;wol!F zj*fw4sqVAN&i3SRi<`ss+K(_G*GE#{dx2vIoGa)8-kqt$ahE@r;7bYn5aAPKxf1Wd zVc~v#DDQHd;luR%BWvpyNdbG42E*U4m%%N|&44H`-4Vmq77;F(;;yD}$y|Ug&mL|n zxfphR4l3!}7Q(Ktqe5!j9j_`$Cg9*DUHexS-?IIu|xkbaO6l)s=|3mymaq~g$c&JfQv{aZIn=<&zGDk z^AL__l59{+tzp&Hv1)&5m#QHJoih`fVwIA;4}m+-X`U}?oxmH}+acWK(MA#gwRMNL z1R4w4H({vw|+Z~FA|M@4B_WnsKUc0CFZq@ek?x(A_UJKi6uOAnY? z!o+Aa9!h^KoT3?H#gy+A#fmo9XxM<>_<6nOpT<$rHk^vKg1Y6M#~sW2I8zN=gu|4) zGr~!D!b8wW4cQY`kVY`wc(a-znU9a>>-y&{WzHBVZ&Rwx+cVviQlW43@SqDE5+}fN zG>#AxHhT0RSjTzT0aVwsv2q6PfeH4=e0WbbE~-y2aMQ=OHxo^FKym5Ke!xKi5vI?g zd(I8)SewXw+sJ)i{oU0&kGTh8T8&Tf=e?D9)L)V7zX7V?NK%r?xI zHjFoq(VQ$9XF!Mgz_2cN+rb~9RQ6M#EO(if!w3`sl;ht8qKgdP+d@vB!{L8hXnCei zMfeB>)w);67JHjzZviBtR1>a)dQG2t#$@vo9x@0@MJ^A}rN-%cjYBe~blm!{I_Vq| zcQ=XKL*gFvtP;06dhN!Fyb+PEQVD{u3vF0U4ms9A9RUgDP zz#0E5%L76F`O#L(Kgj>ujg?@KtaLF2|KSCVmkY~Ew}RrvYSuc9ZmKGzDn}}}Mz4vI z(XU3o^4u=W{t2WtwFM78H!d;%*5CJ55NAH*%ir>#B_Gq&HQ%*`E|7w|Hgol%a zyXOD|xr+pef)=Sl66EiQ?nu)LyKHP@1vVq#;2+iz9tJRJ!4PKxRAO0~BAvRNNWa!R zm5MT~jiWr21qcm!I9A?dM?l7EgwhgpR>n!u{lqbiIA#$?V-Cl)nYq|pkc9xo?u2=H z!aU?w@vqug3D+j;4Z#qkAf4G7^xj$0eMc69MUu{rSEM=N$pEoYl5{rfQ^Zb5I_>(5 z=iOrl;E2(jAu$h-8ovUr;O8pY5*3Q(Y#EJ)pPw~}b zD)AZ^WA0=B1%jzm#dLJ(#_Tqx#{)&4y-*L`D#i~;5omk$5$B{!Wt@>M5ND|M&P<7+ zIkEAe6-LR2vM;sPSs=~9MlO>*C5>+&2hA46Y;xxd=1FQcS_cv} z>Fj-9jBs5Cc`}9}LAb}x>SS7u9B86EN^?*fTaEKIw}iZ|&q4s!I@jv0jS;k%-2%cX ze(vy?zC0YAuCD3oD~suUG&6rGMvFEm;xt^n>a%PI@nFje%>+-P087#yOVS=CX%9#$ zw79uWXaSoYbh0sv5Lu-gup(XKa6s##J=es)_k1O$e3g zOgrfB7^An)*P*AidJEj+(r1lnggv>(>_fx^04Ny+17TdNHqq&<{yeAPXKYc-Z!k~S zaPClW5zhUt&tV`RdxbpIxR}Ssn-9Sh3PaZV`voQfdajcnaMk7}mUuHAW?%+MpNZeI z`5S#K&mMboqCAA#_3IDVRJ0w_;DXVs6&pPShnkhKlVS%Rbtat$p5fa7*vX(O-7q^a zST+_K$N*03289Bf0aSIwHX!Wzmzyrj@a4ueh)IM15=oX<@Ieu`j**D`Bsm(k?36hc z9=Fp{#w&4}-~k#9&@Xwz>_uVr@_0SotkziR>*4*7o;42rRBm`8#=zPliIdK~(+y~x zC*-UX8nS+%me`!Tv(J)WV0gzqKAyD&mlmE-h_mj{84xb?-!*xvo0a|IWzt3{4&(B7 zS3l#HQlbO8$c=u#Gz=z`MDRJG3LlPvww zRDTinm8!_p(mPve!5&1^iTMZV%$+=j&TBK(Yw2(^ePB8>2!x^Y6Pc=Sz8*^=ubKV%}7JsIkDGtm0ElY0%8lG?-~L3h^~QJ2;8lKL6*E z2$eXMmLLwqJaekg?0nX|zF_lujJ>_HwHn5*$7CIkF`4;3OW;pwqwk&~d8XToO{lq} zZF-FV>^80VmIJ-=czo*aV(=Liijz7_1!lA9fAks8STL<2uPg4f!TzaX#ozm1n9`1S z9;o9x2vFJ`X*gMVma+~V+(fCzb{KTpZS5xGYnbs5B@wg@RCfyG3UK4#7PC>CJK~(i zIfiz?>)-G!X!Oqz6Z9oFcpoYWA&j!% zt7Oil1i6&92iUTpPx=GC>>;t?XuL;aFmUXx@<+8|91KRa>XAWtOydpdMTL>Z!utBu z-Kb~k0ao^kpBNP#v!SjvN(P?o=e%VuobD-xjX){NlN7hnI5(XqBmiC;+sW&{dG7mRTZFhh}*5SVfUS^&%$;_Ajg8|GY7IM{Oa zGCgYqLnpwo@73c4I~2ltjPe@HNFJPYvOE~c*{5N*rz%bJL7e$ZXPilv-U;64#ubL+ z;FyY`PePR}#`yz!5~=e|=@=MWU`)oF}zgV-so{Hc~5PJ3yyy3cE@K zG@;5FX}FC#rPHD#1-kQTO9yj-6 zqo$6zZhx+`>3XwYf+}s43+Yg>bukbB_;GaZeKejtCy{%wEl#ZD2{U`5wx)p^<1ODO zi&49x3XXH3*yvnwh&MO$g6gN;{&Wi-Val1FbwMLmS3orAJwfMbPDSw!y`OVtD384f zI#DiWhFAdL(`hp@KGbRiFowhpXGgMW*6$34`Dw2OC@tRyxvW@+>L2VKfvq144n37%0559eET7 zc}^)4=Cm&yKFV=2%jJ)OsnF?`)(P1n@kBa6eDqNe%9KcI;0imh@U{u}w?pE+j)YW~ z8^QW+ck2t0yB*Hj@fJE@DhlMs1kg&w#BFlt@eOX2ifve($E+dVtb1G8Zb1TUB^)IH zm1kiJjx`1hEYHdmTL^|%szZZGF~(uOgn?WKr`ptdjtxE7YLE6-2C8v7N_6buc;&of zc>#O7dq*rjj>EY0vk6TQNwv;;@F~(JC9<3I`y+UTVi0yhgY-ZjO$2ruRIpjSN63}3 zHo3mTPQqCr%fVjM3Csr^hnfDDennsjM2XF9Qbo+2QoQfXNa~|$?jvZIqea&tb-^4u z_@eXGIHUA!Gd85VVbQ|qAtDq{XR17KW7>Djwu62fM|jROxx6bKjmJrHltkRK2c*mH zLCE~CZR0{dCa9o1gb;>#$e+H}c|}<>+@LAooSg10z6qVa2jkq{E(xV`L9AnEzHthc zAXIQ-1OJIPP)*-aSlECgOtPqpQ`~e1Fo=kIKl&!jQGIV-R@60Pz+!WjXSP;qJB7k- zHv9uW6rqq4JTlxI0q~#leA-_}$ZUMhz&)8%LjUkf=02k=(8+-gP6rC-oPVgW5qP2N z@?Z+a6Q+8>im|89LJD#(oYKu8W~AvJ$O|0w1pD9%gzgaf9zuT;2Nh5iGMa@m!&qsp z#fKo>(T|;4`av(cgmiIR_NXP-4?N0nL^YkvfLKzYH^7X{y2d&Aan?}ANf{I|VSY;F zHg19GAQ8ERezm=o==!2|d@>^dC7nC9^FXA+-R>^*Cz&Q|@FwSao6gPZGJ7l0HCZ-6 zN!Pc`4Thh1r1U?_@HPr3j2Bm#2rhL|H(K}Ji=@-!y1`^HHpd!xB0@r8c$J2g`mtdV za;X!5McmmjiSNk}Ny3^`=pVi5Ss1~7#*n}g>JNgQ|r7wnG}ej0niV3V;~XXyBmKo9PG{!W{zb` zbT^%h+_P+Kz5S=;?t(0_C0&37wc)mC4j3-u#GE7_BCa z&(LoOK8qY_*xdm?H);Hxd?`?@KYA;glOxQ)MQ?M9-lkMD%_x!PNJEipTKHD3{%?Z> zz{bGo@IBH-`g~@B^b#nKqI1G(RrQ$ZgBS{^U4rPR+FOZWKY$i{`B8iyYs8*@@WBPV zm&o=B72p>vR3P~fw3SqVCcH(Cl4ZM6D*hgCA{Vyn_XbELhAAYXVM<6R&LXt<+kPWc z1J;=)9BC<>1&bXy=r;}51ldHwbAnCU^(dUi^9E)UT5b$Cu1A1Q6D1uB)RcT!!IXKh zEZD?wo{t;Lp~iXfBcX7P-@&{Cbs`x&wG(mRmchzKElR`7y5$aSe2nPWx=N)QTUS#c zA4YK8pvsLKIC0O-FWW6{KMhEur529vMz!r)250Yv9ycZ4lD-p4CXUd z8r(3jGzg3^S|QV|NC5OqVuR}@hLvtzmodHGj3szX<0cG_h}kG77iv08j$}?jn{OXi zVkKDn{RQkCQC}A9xXfa=9LK;T4M{H#2XbOb4(t>?b=2Z{%vxoomc@=rjH;T7A=O_5 zJ1L9UE*j~W#sp|qR@H|Y92SK02EZgCmyrPd6d{*K^L${)ww=N|G)hUr&0I+iRE9QP zmbBHJ4fd&l8HtK1Cr#jg_AA4wM+O;#-H42_NunH&Zun}jxDBQ_HGX3B5s4F^AA1k! z*DePKTZuDZXB69~_WSj)eX6y$aRG|OSOA*SPNE%S3M0Oo{tTZaGuBRNm|gt8;1BPO2ss%D1ioD$9khd*NI&dh#9W}Ss1=yv8`2WS$8;{tbr=eA?DB# z3$YAA%@R|!$W>6FA3fjL5~E#tr?uxs%4s4(AALxqqzUt7)zv3OOi&*bdkp=yRmE*z z$=C59fddUh)Wm9V#PD4cRT~wZ$#kZPCcL4j#+R?K>5xh)LbIC2Xo7K$gU;FW&>tF8N@+J4&qXZ%$m@hZx>B_sW6DY1;r$Yaywo{K=AshP**h=Bln~yv zOLuwPN6ryJhW)MZoibbRPxRa>P?tE4*W7f9^W0~#t>fp)1RtmLE#PHDE(`FI4UJLB zE$cy2A1^S?w%=dqmGl+=5G`^SL$u0W;Ud3ir<|o|QkxIB=*&2+$Epp&F;=KDh-diyA0F8ffE&q-lWo*1J_H(!eOfHhVAVb`9k{;2w%>c5rd#yAV%BJ>&9E3N}HL;S){zJnuq?dFs z#LCtVHfqV4!L?oKU_G{jjapKq%Ou@6A@g6QjWB`Fz6{|>A6jnv@2+)5#`%P^xf1kr zqeOMfpdm^WG`LPEQLvh1zb#@H_DEtfqk`yB-Bynp&21M6`0q&sA!S( zohlZgZ;+?}ki)cDpbVfQfw3iu1xTH_#w=H@b?q5!LdR6*%3!;%M|O;nzCKg8o| zk*Qi?x!{4WsloE7N3gtmGu8JBr%?G2Q<=Z}F2{Rp#^o6vvp%}z3ct~+Uzd#-d%`JA@5CTxC#7b@*-;?Fa_TM3pQt}n?VG+Z~M8v2``ZAn=(~R zN`Quw%sYnb-Ov<08k!>0vJggBd6{S3!|Mx?^Sejdk;PO8+$}9EN2s&UbhpYm>KQp+ z-C&VH1m&>L>JjR~ysdJMdPa^{mvW#*$}VKCg0SP51UJ(7%bwkOAAe?A-%So1GmiRN_E`K|=?I zVvX<@7W_>j6F5{%5g3GHtu6C4QFWrVjX&A;8M%q`Uqn_$vxTA#Mc=F_@@|n-ph-#w7opFnX_QybbkugObZD zNCGKB8``6?dk$w~zBpQOjlGrNS!;VxG)56v!IqcsReDaqN|v@4sH_V4 zzZ_-6KD}@*zgHR(@AjHe>J@!VLnmgAReM@1p;OB8KvP#mXAKDGA}NY5w34zMG*>wa06=}cDG?|RNmN1kZpw=kA_*GsUTVaE+EGUtr+o+b4sH` zwM`ZJb{&#>j3C=iqXu3e?>}^t$YGRFG_0a&vYi}V=TaAsTa${9@+JY-J`_NgD<=E z;FZt=W-Ty!$-u7)JL#)rr}SAoW0j_cezo9g1nmhZwi^Nj)5FG;-jFROItj$~b4iRX z2H4wD@((REGcVDKqoSq4=$H4kYV|Oe{#*}#VlY6@huxthQ;Ak9O>c&=M#z^;w9YH- zg2_Tco8zcpH))BR6z^ibfhr;!Ya1;b+OvRdBE&a~jc0M~TW$mymdqvm$q|d84zTvk z-T68RFieYCure*_Y1Y?zMB;P3e?X=sJ&kz)6ADPrQH>RP1O1O31d-L@c5PPT#3lg~ z{j}xgR*Z8U4wud$_EsWb|Niqx@|5th5|Hy9u-9ASZRWCVY#&L*#l-=8myk+(mmw7v z7iF%*@fswmbzYMZNCq0gk5T;cdvaB>P8jFgTdY!UnH#JVGgZpnBMs1P#|EnOf7<%G z+Rb`?qOE_n@?VWJN%Rp6QIt{~BM|fc8#x-;@dseu*?~1kS)EY}tjs%eOK96UlBm^wyEv>ux?49FF?%Odn<#@1n5J$nGRV|AZ;W6Q zQ*48p|Hv4&!D%CKbK$`Q7y@v9JH1?z&hOup$HvR02OgqorW$y_l9f)arq1a{HBORK z$aEO`R<5iroTe^rG=kx_+Yo3woP1fiv;R_m2(le$E!o$)byPn;WSQs=WOt<#7%K}kjeHw%Fq zcPN4Nz+8^&wNAZBt*@kBVB(83F>F)0fenKl+)QQs&fPPE-4Xh>5q0zdJeu24v5;q+ zDTQ-n9|=d0^z7e7K95*9x=4d#fMYN4x-qXSuj>!`ynxT4gBC$UO&xbNbkG_2axP9A z?@IXM9;ZxU+Xv|~1;1muWU8F+-f=uhCw}KL(o=1Wy}%c0QVo3JDtSQ!bZ$4tmMyAV zr_bKhLC@fEtN0fk8&Rd;YD!_n2^RQyH6NJQ;>}d3&8rD?AUi>rAgSTl$iro^mb<46 zCzajvFxjVSPkvSJzn=K~t1tsl(YgLL3ee0&2^5uBa#ZjRH?-S#VhNnIy%^J^9t2pV z=>t0~d#-PX#?qIWKcb+lF0t^a;2jmTTdWp&X;s#TftMAyi!H(hu*WHhxB4GOkP zIzL`U4vDVb18=tU+5C<)T<0+Qn8|K&URO_M93Rv;Pqgr5_@4Jg7D){%G83e#pec&N zo^3P2HB3oe@=-;ko?R(}V5peD$)43I2+~R(d!1oABAx{vDxDYyk_BZo1&wG}xr&@P zqKn&KDF@~ioCw*`Ashadc9*lyeG$9Yz$F+MBa3*jQ9WhmqTX@@v*1iO^$6;iT1(EI z+a%p!V@nUbvG6E@7Hs2hb}{*pxsR7+b-nSn=kVM)2D1o#rM0=O7mxIX^!odF0ViXS zGy5SrTSoHC+}*%4-@eZ0G|GDct-d2wSo ziYEYhQjw4g^ID-?Xnx~__)*QFRhl9TKa#!9MWaBPmOaQf{VcyDiv%#wq3{twppdB* zlaQjUjVa=7bPRHiAdOqLNk;sRG$ft>gbLT%f|GBMIlm)|XFGqAdx*=Ad;E?pJkHrD z_qNMDen%D-IzN|tyX79g4X~f0tjvA90h)a-l^39P!M0shCMQ&?g||Ugra;}88LGi@z|nj3 zCOby0!^H)VJX;O+lFpl(r(stKb^#XFpOV_b4!46H?hgy4!)2-`%g#HFP#B0XI_L<6 ztw&DswbyAFkW)3!mxz#Qr$cw4YExW;S=fq zPfafAjQT1ofFl~0%;wmIn2S*iVo>HF(B8krJ}Z_nPtqjHDiTW)`YyoCO_a?`VCcMG z0C8X(!!j|+mDAs93iIn|xN1!n=IDq~5A%d)<+vM89aw9S^~%(4l64Qs+H|{;l^_cN z9~B`uh%^p@4G4FP8b!gej~r{L#zkffu&pqt&`medihTe~SBN9@ z@MvSD4mSwKV#$VRN+8=Fl5G#krc=WR91(b(ZYOEz_KRIxx)R^gj;g;Vmrgy|*=qrg38h;sUjQt`~eRhx?h@H>7%5`{*^O{T(=fL1x3sJJI;vh#r9DVc6eb zh(jo&=q6NlAqX9P6{i;T(C*m7Tf!YZ;0_Q%gf@>u`i0Pge1h-^T{lT0X%T(PwDmpu z7V7No@P){c2%f@yy*$|-ODVlZpFs7X$m-Re{7oR&2+m#*X1NxO8tv*3Fne%(ps)=L zCt@Wtn}(HJa4ys$*c^I|icy)!@5qeX3gM4Z?YgWZaaU>jdnc`=tdbrreOX8 zn8l;Hv^;5WeiS_$r2&+7_>s${ODHnfqlkh^cn^??T@Qr zt-(cQQ*o6pB$hK5--(jD^1TXGvaPC}al5sim|(tdGGs%s#*A#Y5CO-8ba^<>72#V+ z8@NfCd*CU3wRHrDBR6ZE|NOZDu~v>>TZe$9?CQnmg!>@9q;>_xgI(v<<45TGZW-$3X}D?EYq zM-E9j4PW&8X!`65=i#K?v5 zGSeM-9Lv$kdkdKl&ErS>O~wz5KVvqIWDfk7Z9r+MV!k6{0--=_ouj|PvM|6yRW0#9 z8e<>DTh2nt^x2W;S*4bf2s$5QNW>iU@hyi$!;x_{&UbE>pR4(5%GrtjF^)fLQa_DW zMx0qq@-)@M2NU?9Hg)p>cre90=*ELpyq`?<@&0IYzt5A?r15z0A4@c+*F#&ro2eaoUg}J8#<#po=5kXQV(3_o>Bl!g5;*PJ%kJWsd87JQd zZbV~(gxu`8ib<2H8KVH^Dg$N@?t^#npeFU)SUi}k53&VRB&*ScRDu00R;zcH}Ec217^WZgU#;{oVd-e94pPQM`1x6 ztuU`9XCXwbc}D(3gcm*R>mnh?NfQC$vjy`tgDZ>d-XtK!qs0Ii1VZRQ5tz+Z_Nx$kJ4v5pe5tA>7mQc z)$d4^lc{NF_WF6wbg5TtHD6oBFR9R}|5ETqbf7rmwtN1K&l6e`qAR zKuDk-Hf5ffnt{wy<@j=nZkCS7*Cb9O=5V6^)Hn}*MJNnw3X7_Be)BG`@sO|5@6asc zasGswnEOzxm<1IqUF92XAM-xf0-?p!I{$^q1`<&(8=wNmn+kBzg&UZ`Dw>u*z!yJv zQ{x#HFAp@VCwy11O8M@s-6W;-*|)zeKUepnCh4>L@Ew7Vw?@aYPF6ENf_N_O?&AN^%I?8L9|HFj9! zIa=Py1vS)I9Sg(;I72-OJ9a^f>0`I+8~eNr3NS~_!ZY?mJdkdfdr(^IFou`Nt{z%w zI?wIsWLP|QE_a3C1phVt3E4DIus;QL^l`C zb|T_aUwT*j*jH7giAJp3h($86)1XJ2z{Bj(La@~&Q*Joa&_DH%UJxshRXuoSlzwdM zr}l|eQ_4&B*;3kaU~uW}nvJiV_E|QLsTyC+OyFO13vk`z!qk|-6bdUuSMw25dYx$t zW$YJg4LZuwv#2C5L})P;1-Bh0%_`lncOxEw?ji`-jS*p8nlmZ_!bW40(KO!t1HOtb z4Mm?OM7KTBzvnE)Fe_~;y&YezbH0g%XZv>4w6J+qTiO4r4FAtTrbts@7Q%@c_TiZ( z@6F8rCd*{AZ$*_sIZQg{-zD=L>Ug|NWFI0(P0Hm3jicYO6TUpiU^y}n&Um$72GlyR z0h{t6(ykF9kkSft=ff`R#Q7u=A0GZ)>3vo_nuzNnSQNOjR25O{b6 z<|y229iv{Kh?`onk(I^pYSxSHjEtGqcfX`B)Su{_Tf?82iGbbU&dSh999+RqvOcN9td83kixmKJG65|W zH3AhlqqQQwWR>8n+5t-<*e=pIRzhx#%pS~idaq$NW1264+}=UP$6zVp%2ib<|1()H zrpiQXMM-@gG-2|#bD9{RqcWC{Sar=#jz0(K+tj}%)k{K{hM_ya@6yRP?<1BW(mRhz zx8T|p7jK}An%>3g!kt-8RhX4@K9?_4>Dqxo>=OOW61@<=_m-5zLLa`)6xvCJr8DV# zLoE}sD8yjL)SjGawrB^-DhL9B&e44$Od;Len?oEgJ`;ts}F$Z=o(fbGzG>p=0GaX?Pks1e?-)xRi=Jy1Sfwj&Dy2fP~r=}i)Y1NGo zVafVp=YJ=Xs@9Xm>AOmG5e|k?nh-cBTa!=1ntTdr@&N-|PK-)+9Kyh=?F=k9ae}fOF(bzn_45hP#}b#g{$FyVbp? zwSRr-rzciM;GkBCKX`BH`<#90t4;Fio$jj#Pm)(h;}3EwMb}$0%lyFJS6oU4D+3u+ zxf!g`4DQ7rd9@sAP!H!3+qovtpWK{>+t0~ zmokc_ddtnkdoQJnVIW_crLB=8=?| zCt_J@p5l)#;hl4NVi-rBM|l#*OrE$M^WH|D8_U)C%2=5W zd9QV@*Q8l#NY)u(;9{WBuFKBNS$M4^P-KiEQ1Csk7bY7R1(bkl|Gd!@*;@yYkSSiZ1|rs zauaGktd|n)1jIB1f>lC11?gFf5deeSp6q5YYGxd166k3N+BGiKLlWJ5kdlZ^f;OD% zEfqS^EPKsL*cnQ*ES3ujB@|E)4#)`7 zQzc*vAs~|~4S(2NL8UC{pS2)iD% zz~F;2uoY!c`rpb-{+bZ_pVrWGyJUF06{S>C0WQjU)L6M&rn7 z?V=df!^s)5EeI!WG_i(YJkMDzy5Y8@k$LynFtU3zjO-rK6;MPmDp2Dbqxn!_;~aCL zUQ#O_ndM;@&^;u?Y!BKj(iJQ+($0qgV!RO8fE&<*MZl!tGV zcF=-F1fev}%{o<3CR5w_8jX!fc`X5TtH$}eDgidoZZFEDRt^=2R%|Ll3^q&U5}{p} zq7p~r8Az46XgTVFfS#mDGS$hv(W=g#ZxI56%`(~-`3^f%C~Tmw;BY4Z<3_~sauBt> zqS7GuljGaw9Ee3)%9SD*x>Am<+4m&d!mb5;HBY!4;SRXT7OzgO%~TX=DtK)^2we#X zlBqqmz6%T{@~Z%0+&~n_ShT$sc$vNg*y&s0Lc}E_`f;TCY%YiD3#n+zQ2PM60Y9bz ziB`-RCSr)fJ|H$hOR}xf9E?s3`H)+BkRMoos38+^?IkvOF&2qYi+dl3Xn6u(&gxN8 zF;URz1oCGP7rDdg1ImlL4_A~9i!Woy6Erk*=sTxCUu8vRr*|!hKUYw9(bv$~e<;r( zPiJ>zN2ho4LG^LBaTMSKl4f>?Gaj}EJg8dB2Mtmb^XYiM5CP+vRrGc|_>3p3BA7;) zRWTn_da^ns-I>p^VKwXj#Ht_+qh4PN<$n;J=sJ@I3#PdS(>2O9HNDKJjeos~hq<2YHDLz=_ z$!aWu)HACa`QREpFj>V-R(JEkg`TVsSzofcmk%VAm_c>0LA8Pp4)J6)!DRIaA8`1w z6`W+UTEhqLp^MrI9%8au%LlLUfkAbc$!a|x{DKb*tqxD`A`$C0@WBe3)f|)0R^GkS z<};_m$ul(Hjt5;gN+xsU+z-iQH}75{VCHmWalndDyN7q@2omHl#vtkCUG1>QA!cAi z7UFJ^aQZrO`ZjXM{14$(4~E`1}o@@rPGNj>V@OpUd&N37-r;tMK_HKCk1` zjnBv)efS)NK5`sB=ioCRA6W&w^3&4I3hUwJ zL0Ar9O;uR+BkJcm<)aBvJ%pj$_qE~(BhKPxmo)LJVm7XDRKTpgSi8lK@|pNijUN>= z@IxM*Y9E!_N7L=2Y4*_x_R(?n(J}T>iG4KHJ}S14juDR@OO z9`pOhBdQPX(hD=b>=(acN7z6s!{#?-M*lee;PFJ{yW~vsBi?)p7Fck>(=+4E&mb#Y zaAh#w{5!pvKpf34<05+%^2FoQ<<1$JaHd@B#6`AJA5TD)Xq(u;AMxhDPZD@b-xtRv zLAX*79_%7~<}E?^ulR$SEPa0>Qlc{HMH{}1y?lr@Vrp{BpXI$P@CW(N6skU>6q1YP z&(0KtlkjB8?RbSh;?4JC*ElZTB{0^UKjO`ckCVH>ksE6Xas0UQCpWzoY50WyH%`9Ep2ci^BM_qupBMbxJMXMJ?pLGji`OjxYN= z>SJnqvA#D6e^B@uGR}IV^nLUeX^qp_ZJKMF_zjhkO?l1#1o+`f8cmwy?Y7^B%kv~y!l}Bu3UWcDM@&=T>PhA93vO+ z;Uc?4-#uOKRO-b{xi~{F4wQnX;UaqpzJy|@;GR|l1P3L~;sYga?YmNunfL=duT~gJ z@JGD4z-I7jE`uJ);6p$$8T?H%_#^&ESv!$ZTQM15_Nx0{o+Aal`ySte0)++6Bh=|m z1UZgpg2(3tjqv-Uu8Zeb;*CFNHZkJFw7Gd_R`)JCobn1&fNNVT#U@Q$Iy=neM=?=FrFy7o3aIoOD}hWHIbs z?Vzf}8f@RY1Zk+7VN(ZCRL;z&i&H3!tF53XWwkytb=CyXA;i1J5btcj&CcT2Y5bb* zLErF!T7td6((U=f0CuLKPv=_F2T*vP-Qq)V7y3t@+!IA5Hp{&DG+xa9EcZ5Cg%)FT zI^V`%uVlx9W_&MV!z4gmsyFqdJXT0MI0cSo8<|*Y9fbh_!P=3yl8I@*p3RlS_}-

GXatWlF(f;)imVSRV8VNCYYoG@qAKZ~P3g_YXeF{se$E<_acZ0w z)E`STL=;kUDV0J$JKLbG3MvZgm?tCr{abMH%yvJl%QYb|?k%h87a1oJrj@7Q%n z4(#5&ANs+Lcflg8krK2cdl)9y_}{UU%Q6af?+1Rc2^TE1A4}QEn84wGM<=)@2lgI6 z*nF4z(m>;wx|7aj?A??VBw$GBjRaluZqU?=6kF8PNa>~StwOb;wr8i%C$ zDW71?5wDgH{ggey1$%-E7S04fPeS=7@{*=a7=X)f5qVP3-jj-6C(zyYA_-YI^t z(*gDv<<;p1>>NcZFz4W4FN1N8a%m|rPSZYAYB0jgfdFyrMjg9Ue9TGjeA@t=qdnDr^KRzRfU7-43|S^Sacmu)RK}0iA>F$rgsAvXSx_?x){e; zI*t)K&S`q*uYQcPfYEfLSuVzy#R&5)h&ZQd_dSM$bBsw8_c`EGkWytcf)xHEI!<$h zZ`$01w?w|t#{(wiH=xu(qfim0;(ao8LQyV`pgvlP6hEPm33ZbomIH;R~kY>Q7 z(5vpj=ne}j{%hr+B^VMyaQ9HwyL?Eg2UET^zCuuT>>Mp5oPD$iy_~p2!pc!@rxAcX zA}(p1#s7{@ghw)iI)z?NTq0#n)a^7>!~~;SZ(+dg*i~qofvTAwEY^UmxTMrGU}@eJ z2~=djiqP|cMcg+l+bQ%I0|~M{(8D3yk<#{XsAB{>-UUmcXTZ`vjQ<_Gw1EV=m1ZXVNA}h6rmzO-`jz2_Kt(2X;EZ8fBhRk67kZLDH#Tt75P75#m6y#1gt24R=}dy6YO{wEOkx;76Mj{J1SsRTm8TfHsOM$&S@w+*@^~mP7bV< z4hHN&u7IV|NwClusj3Q1%S(D)C4d+UUD-vQlNd3t)R5=aUNfsF! zY>!G=wLOZt#ADhc159(lQsp#Y57+rrMJwX^|0)&??*r!uKgvH)0PPbxsjdx+F0-?<2PqH6F@~F4|4r4C`tK4tWHGzIz|BJ7$>0Km zgYkW^1qQs|Z-K!PBShE&15)-|U~oiWhAl7T`o#{gc5o~aQLBWPBFc55TfkDBBEie#laDf3}2VYF*oz(9223k-xATwqX`LoP57XK;Z*aSpk_K%Bt^2E`e+z(AbA1qQ_#vcN#3!373I z8n(bdu)zfe1sk@&K(N6D1_c|kz(BCU1qKBhFhBNNU?AAw0)v7LTVNpA-~xk!4Ow6y z*x&*Kzz)8^K#ai!24D7>8V7AjaSVgJS$- z78qX6Eub4Y^|kM-*b@;ITwo}s+2%AzHnYG`>?$r0doN=14y3tnjbSNfE#1_S&@6TDcd8} z3uJSI@iiEFIp$?-67em^TxiO^*HgqB+dNX;_%ie>!lOI*R(zIjZjz~?uatLIXbq=( zN@*BQDTA&ny-Xd;yRLMHDdHtWM9%&OUw95iAIgN1G#ZmJq5M`ECl~c%*}qeHVOT3L z37G#-n$T!mHD)^9*2(4NrY*FD!bAtxVQhQH%G8B!TCpe;1{|$)rp$?5`b8?4SkdU^mfoV%grb7?gFq8d2oWUpKfN(*_0wskGger0W4S1a2Itx2!L0!1Gh zD4Jm~Ahj{WY~D`8x?NpEJTGAOk|Ytn1An^r0@k@WI7 zrD2;pr*9<>#mWt_NNFOz&P^%ADk5SwhZ$MacLdUivuSG(F3(Q8XL$6w(NC|_40r$K z8)WRLDBq{O+OM0A%IWuc0U~(ao3Q(mT_?MenVBK&-L3tGv{LVoHk3*1Bx#V@*(CEb zCb9cXev-Y~=}Nu!=)p~O0+V=j|tu4aS zWX+{yZ>KSELF4s4IdgHbZz#*?C^&PC&J8Go(}07kHCGmjQ`}czh-$3XrZ+-ODpQ#A ztsK>MQQqibwf_v;{&%|+dG{3`MgCwe_nRW4JQP7qV8A^c{@6H3$7PJ0U{8Zwg*7*! z!e(mze@R8*{bx+Ph50?w)wlfH2n@*u`8}+ zy{q=4>}`+lOTDoNJy7rS_oM8~_Ni2*x-a$S8neIbAM8ijseLM&N|3+oU+hQO-9OxydedC#FZ({0eR=rU zQtRB|Eh%)-2cafZW2Zo%fOvt!@ue#4WYD@1?w2Yp5;{Cj&Hr!UNIHjj3lbe;@L~VR ze#3qpD|DS_*#8O~ULgK4G@4c3snS(MPT?j!hNqj7ANqlZm?0%k?N{=r_oL*a_n~BL z+6{=h#{DSyM~@7@&L#ayzGXj3K4l+DKH5{VVHYa{_i;7yxFBOTk})szFsADRuhKOM z9pu2nhoOUV4$< z62te8K0JIL;3|t>(GpSlF-tyaA4=x@z+dv6AA|dBoqxV+_;toe6)5?K`%&_l`%p5M ziTrhbYClSTZsqXnOh;0G$@jD5%fm-j1iAE;`| zo80bKAz>_Y-S1R$xxd|y&W3*CobfT5rOy9A=scp zh=L7s2qD;@Lx_S6a|j{WphF124(bp>j6sJGU<`8zA;6$R2mppTgb-cOA%y5c9YP2* z=n$eXhja)b%%DSv!W_~egfN2+Aqq3ZA%rl44j~FN%prtGgAO5zG|VA{V1o`J3O2+c zgkXaXAqqCkA%tLq4j~FQuvXm9A%tLq4j~FQ#36)WgAO4IHq0S}V1o`J06Vxt2r&j7 zLVz*EA%p;f4j}*-<`6=3L5C2c3vmb`#-KxpVjR*Tgdl?sAqsN14k4pxtoC@o($JD-$&Bd}OSa-vo3ZX{Fmz`76o6BXI4Igc@z&1Oh8F^N} z+#Ni#0*3opkh35md|H}bDHcgNCwttjuB80ZF9(*CvR#Ms=UW~hLQ-}jAS}ojl$4!A zNlGN>Cn-CJB`J}zpQP*@j-({Uprj+ut7-)u!BlUVhl=3U<{L#1Q?W*02n4Ii7qH9i7r%95@t|RD$F4zC1D07 zrNSIiQW9oRQYy?4NlBPNNvSZyBqfmsC8Z(_lavG-l#~iKL{buLP*N(`FiA*S6h zTqp5*S7MxlR&e&~=g+LtQ5cHt0I3V8dJ|2{!0DsbB-0yr1hN z!3JF?6>Ny>B*6wmbe&YBVXl(|8+4si zuwkx~1RHdnRInkglLQ-dom8-4u9E~Cbe&YNVXl(|8+4siupzFK1RHdn1lYk{Cy6oW zIth$nu9E~9be#mi5Z6hf3%X7cU5M)>F$P^H72}Yulf)Qwom7nb zK&Zh84GJ|RLIc4DBQz-3um}wV8;sDPV8bFb5Nt3)gMtlML1fdL-9QS97r_Q2G$`1x z2n_@qjL@K9!y+^gY%oFtzz!Orff$1k8h{bfh*6#KzoV0W$uev7L}(zuV1xz$gv7)K zQVo7EP=p4e3r1)lx{wGB1R0Fbpdg2g&_IyE2n`DI6N=El?T20`{K_w>;1eOG4y$g2 zhN-l)O7tgp;LP^42waEzHc{_bX#c;{U$6FCW++4_T^k+TB(QxQ1d6lVM$ z-Q9VEn`3Q2CD$DLGQ78 z{>>vEp{;&KC}m2n6xs6NQ4O$24aPI^FqXd9G=*9D2>$8~TFRlGQWkhi5!IlI{w$Z+ zWqP}yo^BtL^I#DxxF>ps*9tx^(u55i{<-~UO+(AXJGZ+5VfKwj>8QZ;ev~Q{*!xR* zZH}}fN59S#(;TzOt58YfDRcko!1SKMtQ+gBV~$;NPCuVNY!V*QkA&a2-ovx%WC}&2 zkx@d#Kg{w~x+6bVy^#GOIe$K*51wd>@EH5C)n)jg59}sfYV< zSN~Exalw4t)$|ISr+ln+iz(u{&$&g6>{rBB5HSRf{HgDVwy8eF;t3eW%d&UgSKvrf z;HOYv_5x3-_pBO5#fIoMllzhHyVoiC-u|pxx8uE~NVj3w@qxOH8(wy3lbA%7QU?h$ zu1(c)m4RumI$v4MbfZBTdhk}`HVf|v+@A7qb1sBU0I_Ge%OCJ1=UZg(-lVx@fA!Cx zlYp#sMy%A3>bctBhwg*<~6##n~pJz@$QX$t$4r?7h;3Kmv5YM6so zxe58>F5W$ETKz9qy0tm2e*p;jlb0)F=oUVR8Tl$v{zc`iR!vO@jTF7k zR%4x1!!y*)%&%LQ8=r^T0`mpS%kbkdqplC~P#$C0fzK&;_Q21$J^Iq`*>Phaz=;2( zbYD9F;I%oxA=?m(EoKv=s{9N6`rl0NmYt#b>BxTk)N_sU)0tPeJiBDYQ2g|St=AI+ z@Y54Hei|A`aX%nmR3KLN7DJKsHBN{~q_QV&=0+qInR;DyIZ86({?P}uUOa$E7>xG| z(zhyut+Dl5BlYs~b$<1l;fm%X12~pL!{ma#mtVbGw!*|11D*Is;Bz#`?6S)s#_qtE zmCu{LYuOPy&qVt(!t=!Co`KU9o`Vni3{U7C^k0JZM{S_cQ`!}SmGFb}<7+A*%UI`wqgpG;N_K zinp@!>*O|G#Zr)su8+BkWT)XtFL-F)88gBvGg9;(rk2nCZ-dPE>zva zg~iAMr8JULYiTgax6j9`h98djjy58j0nzp2=F-y)n9uN8Ms^y^$j8C&!<_guK`Zf( zga;e$zLWqA7k%%3my57P;2Y-B%b$YPgtw37KTmem$_Hku2@p%>kPPlBZC#8Pz1{03 z?aaz_sxtEEQ|^WlXY28v+$S@4o}_Cw=+X@y_CtjEZhD2`$Gm}sf6_l+<8{4n`IZLq z{dE6)eRvCoiFa-w-+yRBckii|i zv#3WfrA6^Nl&NKg$0_IX9`DI}GV|ufa}(GA+v1Qn;}%&_xOuQ--T)d_I^Y!7K<~ztFM0;iQcCYq&1+-SS@#;^ZjitL{|NC;^ znEi&i^o-ds8oHzE49_SPW?hW*vo5}c=>P#tB>=-@DN~|hvdcYq%xvo86JT6`0GC74 zWcd$Qy999V@e$yU=F&reu;Fx2QvoBmdzt(VXo4*MC>C#o_H~}}AhfSAm(n_FYu%4- zj-D3i=9d}>D=%_e;N5Tdy7?c>-{^LFlu!_1dvac{n-gydTk z%=ZM)#HeBx?~6R^#hd94?W===oesTbxCXC-+24F!@nWd0Y=s9d;3HaYYMr+-+6p8) zy5eumT$FA`;ay+%jRCKl%fZHged+-`gUKs~UWYD8+D~TrruLur6o{$ACFXLl9C?yMJk}Z9zr<7ZVQwr5X z*hYCc8^oVZ5#&snmvaG5j79EFQ^aqp+=@)_6ai)$WiAI}rU7P1gNk$>df^r6qfPNi z7H?ST{$)N^T4pXk8CFW596u{HU#vuac@7_`=6b5 z2*GgE@;hB_LL)3Sm!Cu<a}rAN^FR|cN>X5RB_Amd#7&9B10INY@Yvoh zSk3IsJ7XEzN-&XB_Vt1hruca*-Za4SW?wH@YA!#C259Qn04;_CHdg?EX@IyXk$Av> z5f7e$1S&^?@j3IUP+-tefTziLM}ZO0ra^wKy3Sq^qtKnb9s`AOoL^xaqJK?b9en+3 z6?8>5@B8I$^-9w|{yNfJ4#r={pnBtmS-pvY>P!n$LEw2b9oTX5^jWCqRBsKJ1a!me2m!{ z1;bl+nP&>icnW)Uv9GY_&84TXkJZ0FYx;LFi!%NDT2J2S-_5Y6)C*0cK6RGML46B- zjrtdJxxbByfsW!Tdm)Q5jrvVb-e}Z2%;o+!DjZ`}Hty%3eZFbb`_FV6b;s?#Mt#{_ z?r)=3d}56Xw^0tP*`2f8Mm^Sp5}Iz2x!m7IU0@pZ78Ye1b^UEhALfll{js^+|3*Fg z6Kd3dGL71ChTEv4Jt(0E_I}On14ih7te#r=i8X4qY19}&3oUD%S`SJz>UrjJe;f5G z)2OSsl5HCGy<2^ay4_svf1{rB2{r0m)2Q92yN!CP2PGQyD08{LJ@vd#tWiH@8ubi< zHjTRIt1j!IQNLs^_qS0$ZyI&W47X7a^5l)4nr|-mzfsTqgc|h%FQvtARdic*~b_0`&AJX$l{$tpF%TOy~%2etZP zBD`d{2t{T7e}S-05oW(|s>^0SYVeI6E6k;b&3ubIG+7SMujpb^SnnxtNBb+j(4FAB zhaKhCM+P$o+%wJtaXGiB$;_LLkIYBs=&X4ylgp~~&~fUQGebyMBi| zQ&*Zx;U60q;o}5jHz!17pE=nrYwuTlW%ZcL{VvO_vS+J3WqsRUR`VxS7LRJCroD5z zTd!k1W$Cn^=VW^J)SkRRTqj%F$P@_S6z=a8Ip*4ck*ou)#gG3N~y{Ex`u&)GFAJ zJ+%ZI+*1p%gYT&&#^9b>U<}(+OMt;WwE!5hr5~Pc3l<_tYxRusyZJ8QfE=IK%eT5^8WytwIgiQ%kTV?%9kb=(cqVHf&EV!3Ou# zD%h|+wFDd7Q>$P@_S6z=a8Ip*4ck*ou)#gG3N~y{Ex`u&)B^0FduoX>xTh8v!}in? zU~o?@0EX?UCA#3ATA~ZtQ%jJ+J+%sQ$UU_L8QfE=AcwoBR=mAD-tTY=GakAOIrvJG z>L|JB4}ZmEgi9ix8JWAM_SAse5LE+uUQdY?ixxE}=fC$7OiF>36?d!bEc$zL^OspF zhD8zzAvma_dl%5()ZA%B{nZ zlt|c5Qf?iVq$I|mq$I|0NlCClNvU8%BqhNHC8dH5lavG-l#~iKOi~hTP*N(`5J^d} zK}iX)gG)+c3`$C143m@u7?hL%7$PZ&E+{F9E?iO)W>8Wp%poNuVFo3o!W>dk5@%3S zD$X!TNt{7RsW`(VC7}i-r9usnlmr`;lnORXQW9)XQYzRmNlCClNvU8%BqhNHC8dH5 zlavG-l#~iKOi~hTP*MWyppudpgOU;$!z3jE1|=l`hDl1I3rb3&3z3ur8I+U?a!5%@ zkU>eQAcrd{L)`J`(ByT;+i;?Yxa_ziT}gGx)ghAVGqpoVsx6u7EvQ9MQf(PZQXxS< zNwsA-k_rj?NvbWwl2pVPlvKnRE~yAMD5(@|h@>Leprlf;VUmhqgOWLe zprlf;VUmhqgOWs!f^dO{hgs zQf(SaQXxSk_rj?Nvci5l2pVPlvKnRE~yAMD5(@|h@>Leprlf;VUmhqgOWbb=5E1nW|_RuNQGYHjP~y9gPXA1$a0bm(#Oa@@6waWTictMCm4X^DQxU9xrcz*oW-5a9 z&r}L*&`d?J{+UXF4VbA2)<07zut75w!TM(^1vY4=B3S=S1+X2?RK)0?semzPrXoQ9 zOa*{JGZoSKXDXr#n5hWTKT|1?oz7GQ>7S_-$i14WI#G#-LZ)w7b?w1wvU-7szw~xv zYmI-h8dm^K&IvxHgRTfFr}zYwhYc2Tw&no$Nu4ip2i{tQld@VtL7ymi4wvRp?kU<3 zvVki|q5Kwht4BCUM^L2d`a=B(B~q>5vABMNI&3{Y^>iQX8b6MQN+oXXoTSPlvj-|y z?zMAMU0!CdIPlOfuE_JQZ&Ruw+>&72RTar7Lk3(C)#ehv`*p>B&>Okg%*P-3c#Ds9 ze5~fJk2mqKJ9^)0S4UUs4&TY(3T(nCU~dy1T&%{DsiboS zA5-|a&_!`+RU3+3Q|`D{(Mt7Viaq!U@v(O70I)uj%G z8(J}eY2BgWuG9Gevj8SY?~$v!1~_9LDldBs>kf^Gv{*^fuw**B+@3Q%?YMxICifr} zyN)IWRZo34fA#d#IGl-E1FM&NDS-IRc~#i)V4J=%lbvWWYSGIAh$MbwV z%g57vJkG~bJXGPvt$$2VomMhfZEe=p_J%cPbZ>5e8HwaicbPXQRtQA^)@T%wBKH{YC@Owj&6If z5MY-r&qWtIg^!VVs2Zxa=A7i9^ZRY`?CodIcPm!K@~UkKkDO3 z@2j##S9tiVqqS9rF*OZh+3)aI-CRRt$43s&Q>{3)h}0JFkswKFmvL*|c+c$c8*O#X z4!9akcrM|{-QBpe_1|RGOi}|#uP-0HNK|rCZB24ffi`=Ewz|5?J{>+iUoRY&Wq}?( z7;mKR$HOk%zn6OoccZrMU*TS$3%88aj^bl5N$SF#=Awa9Oc!hG{ub_qx^RCBwkq`k zAHT%IF5J&!o^i<1*8MHqi&WvJ&q$x1u1J@s$E8nAk4cY8k4&GGJ|TU4`ndG5>7&y} zrH@P>ksg#jJbh^Tkn}<61Jehf{L$m8%w11TFwD?X6AbH~im&%1R!1&LesuBc8wSUW zp-04w6)~f3 zTFkiq2QlN)TVh7(tufogFhSgprKp+kaVj$<7Jc*1+Ffgy`l9 z)gABQ9xeyI=JoVBc&(At9KflM885;dI5%e8^`n?^O(JHLH^hvC=EaP|V3xpS-G(f| ztb*x2AK8If3KL%tGZw*YfSK4BGlnM-ZxO;TMs{Jcm&A;@FrhnR#%({28IiknwhyxZ zvhb2^Tkx9$6UyzDap{h?aF4uk5{<3pC z*5XjE*WRtW*Bxf_Vq#&oJ-9s6y#w|7GJPCzNYj1An_AM0Z!HFy4FQxg7Y~GvagbTJt{wj!$6D z+<>+Zv-ZuH@g~f>Fn@tL`K_37D$ID8Ghpt8c@X9in8#pRVY1$i8Qow`eFx!S&VV@^ z=9x_~Di6F^xmkL~RLJmN_xynd9 zx`(~~t}-iDh35FP_@b^dV)6802ho3p_$^||=)eB>9pEaXfv_L={SRWs6);!9Tn%## z%(XC*mrU1CFYGXT^XHrUx;ZnGI~At`x?P?3+#3Mr2QYOoH^JNtb1O_&Ao?LV$#(6{ z4><^I*HYd0P`PuE@wqSwn0YYsVH#oDD-4ox*O|XCf-;v|liXP)Yl)IZoQ$c7Bwpj^ z39ynsanw7r4#_xN*%&_&ivn!S)PMY0{afne1iV2CvbAGI){!MaX9n`q3yZocUqiak)D4p4irsSeNCadq0+x8M?T7-cx98ub$7`k*N!&3C%_i2_*Gyx%;%fvfFPu{H#B`rh8Y_s$BP~jNMowfvxf&NFV#Dob z(pvwP`qG7NCRodRnhC25dTgcj5&OpJ_K`$c_$KtrR<@lXh)pihcN3s@U6>n^U2~P@#j| z6*|nRjy;D+I{{R*6I2JvsA>pXto|GTYOivLv{?1wRa{bTusz7V-Vt0KhtHcFuDjlT zVwmE_Fw}>Emrz3sa1aMgVkq!o_yU5O_S=tlXvcL3+QBunzs0_V4R@9OGGB+~F-nf> zA4XKhF|O}b*_OETHQ1N0!I^x``G)z*^5tuKr){vzH%63!lxVGem{_M;vmUL6u|pmX zTDZuY9kOi;sMjbvt3-|rCuDN(9~tW3g5H51Z8Gii?v~*8893ljJGo8DCwDRB&H$@x z%%L+K$pHTF^Ns*>_!#ah@ZqY!>pyC(e^X6pDDX(4iC5pFCv_Y3+AIXo4p%mg4Ml^$ot%+0?n47t?T8~BNh|XV5S!PA+@$cTgWb9`#V^8TlVf>^hUrkQLC`wUu zV^->}jJ>gU>Nbgk&PLUfM$E$MwGfj+YO2>Sb%EC|+!byU$Hsj@V+>tKSjoZM05cor0hp&?Hp6@l zllN)N7y&a4CJFNt%mx_uUzY37anH`i7@lop=j31>=2Kpjf3~*6DLbV85ZwEx-6fuW z0uMe35kqV#}5&Pj?eJj=?n7R=QElu@z3JG_;MlwdVkypg`nSMo#x&KWt_{M9&{p6P^__i){C9<_x;usohQ6y}MaY_nWo*G~3-U7tsAu zI~|}EJXz)vx}Txlr`Yb<=6!TOPP<=jyXTmX(ER}IZrbkM%oTLc((bjkdw26$x~KZ8 za+qPe8|F)Ne@DAN_f7^+6Ww3d?l0Ny+2&fhFV*g=Z1)^N&^Zr3Npv&cV=-u#QBb!R0Na8J(Yl zK@mlE{JPt3KkO?`+>7$?gK$S*ffxvhQoSKMe+w)+SZ=EX`;P>(6(+au;u`DAf?BOj zCNPxS*t&5tv1uL3K?FBu4an9VX-|R?ej~MZV8)uPEORALP1VKjI#qF`Z+3kst3asF|11CNEJ4j&%jj(%r)&{ zDzJxsFP*?z6rgIODgo;t;tG2c*d~qXsC90&McE1zUOheU-z?pJ+K zxu++4eG1~%T%sViWMZ-HuXJvWq`)kX#nHxKy z9Eyi@Up|q2c?kRR2=?V`W~=6%zXRi|YQ{wvdeO3$(FN^A2j4S6Vapj zQacMT@1SAL8K_@sXQ2xpSsTZ5WbK619q@zCpYRi1I9FLV<7c)B*KJH;RQg(U^|_y9 zp^st|LAhqacH^g*0`$2?0bKTrNsL}%)b=+Q5WGe3 zEu{3_n*{ut+y#Kfzhn{L8jBRv0^o{NS>IjxjcgT&A0%Ii?X8VPn-MNChEHR5-=+MG zo8g}$%{@;_{aaW6@|!*80J{8BTtenBTDEG-2wMKAE#ql@* zor#AUD|RI(?y52`r|%u&Yqw;&OGiSZo<{HM#k)Xv4Dz`AU3rbscLmc$r7v+APe-Av=56;cZ6 zlazZl+#jNQgLXeexdVcF3DxDB%NgMNDu7x*?JNMZlv`Jvm=(#Y>xU*EH&-&yDH150 zx)5V*CPX$uOf0A}Ut)-29b%+AL`R0q23Qf>$uzcrA@5WnL8K6w$aMY zbh4_l+FU{Z6SaS#U5GEywM1O)jZfVHYbmCVn@tR`XSpV=N5CYLt6 zpg#|vIRTSufAhox(Ka?9p1FmQU%NrIjr@ggPr%g0P>C_74to;A?qXQu7YKW=3cIuk zL6SGJ zRKx%jIU<^?ShYQs1+tGKrcjOf^v<=yFvJPkT6irjq4?AztS_qhirUO)s#Vs??JAtL zPSOaQO-%4ND0@V3q_$4YMzC4RiXMHZQF}fX(MD~)xtejf07D$&lMut8AcD4TY{n;!{MQ z>ZN?5*|%0%|9V>Y9mgBPf6i;mn5H{9l+2>ggk=ndh>b!bJrq*zxV8QOp|XsrCWS&{ z5u*#4L{nTv%9j*t!nbEH08Uz>uk@D8Ky0qaVNB)j2<~f&&MRX3lVrf+s`N6=ahMF6 zp~Ohe2Ami|$x3{jVy6t$GBNB-PTZ-cmL$G3Z6zmKvj1r%W?4O>^J{tMNR0)t^RT|< zX#K6Da@omhdm?9}@@w%5re`bbA^8n=U_*o#)>xK#!`DaWnJiCa~P)KaMk zZh8tP5ecycfrVsa&6Z@vmQlHq+nI?m23m?y*T*a&!n>|v6A3M&qrJgiG#)uplGyuD zniw48)nNf!C`!~@6qh2^Y+#Jr>8$|~x zWJXA`rnTCtYn5giw_eabBN*&SWl7xvafmsVE6WAUbIc?Rrv@aU72?z7hkG?cD6g;8r&RB%`re`J2#Ez4bq8>Gpxr9|%k{AQ@F z?T#+`E5fMhgHx2X@imn_X4)i)Jw?MW!Sv4B14FzEZC1C)U3QDy%oa&oW5wp=#LbD3 z-RsU)4mvQVPaRmA`zCOhl8~|`D>fxYM7UJirJ60;%&scyv#A0ERMSz!$LFTS0Yr9j zIgawaoSB{frF1q7+!&}-%pXer!>JGkDbr-2%T%EBKy!fI-g3XxrGA?ByY~1dT>4)) z^-6OZqL?!n?-)~!zignFswn|88|r?Z6nPj$p3HB>U@2`xjeC4WS;Vc!QqrpuO(n8P z6SvB~W{wJ$F#<=+&w7;`zwP6gD%c-|IV7swE-WZFihHZ~8vF{c6qZ5x4OG1h@>SN* zbwVa?y?K?qU^>BeIBBG@#B51s+jj!BBt{yw+37TAL9~DoxTfd|X*hA~Iz164^DjrQ zuflxY&?;DwKw~zf%lNmHNwPbGp|7@%{y+8s&($E;_tIVzYvfiK!3_(tVc zB15%@QUwQ__6r%ZCX*o6tkxMiktOs}ib|B0#jQKk5bxqu$+Myks+JBxBO;^OFqhfj zN}VprB0iN=DPd))&AyzQ_&r4I1Kw0r4*vOqOZdgw#jD41<{fLzv97Eb8t@&>ADm}}|3A`?xp zBehL*zEekAB6M|vTj_I?j&L(m^Q`!H(tEOahtsDl;wryosjT85g@cNR*}?!PsQ@ow z^fQjib$f??1@8em{y;rq3^xnlY?jck_4}DRxuajX@lTiOf%ma6H^H!ePylEnGC|vF zCmk&EOPTVc_p(e$+iwK@F7x<7K`#73tc(H{%+2O#h8XJ! zVK?Nn%(3t^;|#IpGAXq54WOR586vtPkxb$ii0DeNr1ku zam%hPKw01#6#5=ec`(kEU~2Rz@rhy^f>0N=P&wHju> zkh+2wm^0|PfSylkPpNErUTEG;&*k)7s6APg*uS2RDUYiWwgnt~zEoS80kE27AW-h=e;FKN4;V5>`p> zk|Y;7L074uDq_pQY!S8LZNPj@4W}8xWQdWt{M#JW_4FDGUJ+tzxVq zjp!!S7;;Aj80prTtC{X5hWP9frwpWkerRr`=Pr8wS$mQS=HTCGrdv18%WP7u4Exlb zssWLMb~1mfX*`G23h=NNWKv`ALFQ+g#q=CT&ug@&q@CCnO?=SV5CswcIA9?3f(Jy%G`!hSFx??^5}0ipjnwF3C&=j ztrxqC1kz#dOq&h#znlI|+FzH-a>d3=0$HNdG{J0LKQ4 z^pi|~In#fRfu`v6RhxzXLi#t+ehZ@5f86 zA?aOEOBunIb?PGNMQRVmvx^O#Uhe(i&yh{Kw1v6)#4c;Jp$Q= zAIrE!oXnSv;`}DQYewE0iscfx)1*g9P}{0L47{^m>u`pIN_lz|kH!Urs82dMQH`7=sRBZz?kIsG9q zs0EF1Z#dEkOc>_Vnl<8Bgew)dWEiI^3#Ydj*XHaP52Mg?#86KRONgOw27^ntvZRiA zmRYvHN$nc*Zbn$n2;0xIM}J5MuuT=3<=Swwr(0wqna`5Wp%j-d>C@C8sT5Gi+SCnK zK}Jbg&+eI&`oTgb9bU>}1#1QNrcr#?Fl$R8nqTZJtWN~jSqPy}mcQCEvR9b6t zOBo%1i7_RT&;iMOzJQCqj%kF}HTTa}n5zQ-Z6+~|u`W0DGRcuH z1uu)AhD{&(-~zfu7SJupB0|ZjX^Fm)jf(A?%oqDa*n20w%!BZ2(^7G%fD1Rbu}aIU zi)5m`k!^@ScBx3I$}D8*9yy=&6XBjyUGGfTMxmAN3;2r6qDfiU31RXAliMatB!%nf zWUEf?c&aJKX}bRhZx9^VqM??BFDcPbOB_&@u%<;sLs&X5fuEJQjhPq85L!sMS}W#{ zMhi9XV}KJfZOnX#_OIqK0#~3_))UH)Ez3Gqy^F}?_jU!3ISXVBy@kGl(N{@yuBN4A zs-Wxd3i2$2+^>Qp#_Vi9)5x0LPxRPP!`0RvX;$bVt?2&8CPNdT zzGKf3`Q}SZ=^TyKZf@h*&ur~BW)YM9Dg?Aa9Ah>y+T=T>akH~iqhJHwLJE|*k(SRJ zqzueWv=pkDMMh;&9NI$HO%jBg2XQ-uaJzqy!pc^0SXj|{H^E|VWu$dVBni=5VoaqJ z%Pom9Ya!q?>Y(nknlH7cxr0G}W(VD+!9x$oqQ`|A+fG`}Ru)uNqB%^t-lk+$V|H>} zh{x^DfM!zIT8DMJbX!Q^uThCg9o}c|W(p_Tbapy)TIlgvLX|-)Egvfj=umiUhF*r- zyW)lt*crF_=!D7dKVgRH4f!(L5w-`Ngd_BLKqp*4%OagHtD-n=4xro3I^l^{mG!bp zMTDnMpmwngZ=AR)S+k1UmUzxu6^hRPoh;f`K@t1*V<4n0W+Io^_nR{uy9*H~I!)RszGo>G=%#n!m> ziCUXVOL->sd*C+X4D+mVZ>-qjBs+;7*Xooe(=tU{rqJ?ToovmPYU?hYEH^-&NnOWe zO@=w&PIj}C>@<4x(@Irdyp&YHi$lUZo=C^@O>F-t~6EtDS_m(qoKHcn2+II^mk|d$A#yH9jaVHFwgZ zzj#2bwK{H{=Suxi84{r?nWI!Cc_(b*<}xU3n7bIShfTK0A-kI%Z_H7xzlD~Ul||Bm zbUO4KxIHFr;pD`oD(fTJu?g9IdUxFVqjtgY5uNuAh;V*+ZD_f1z)|JKbeJ_T2M@Ei zMIglG1-6(TpxSc{#`rKuXhgL~nGq7KP1<98wK;$ehbshTF)jTxMDm>_bjY>wVd+uf z!uP0IO7D+ntJWauOi-m9LdSQ+F{0-}YzJWVGyG&JRd5 zv?A<%|5XK%s$Fjo{wE9u10{*#FRA^z3>^X*O&=gkFvQz~mpP(pEDRu*WF3wP( zM(;*CP0$o-c2`@sYYLnQo=g3lLo2kv%}oq&QtipxZfD>tr#*$4xc9D|!VfC*h?BWg8^X+K(! zgv=qdOt3v$%re>wlqahh?XAihA+0`a4yWg5qN^8@b<^>#JUl0z;!y3vPBBlnIBqmi ziJ=kl95i3dY2;BbMn&)7Vhf%au@YYlt~=1~Bz?>gB(*@1O8trTRfAC3iI&msP-7YD zG9Bs{s#ax5bc#DvB}0wYp&A)VQ#=f+S322?s0$7X(0`9Jc)kP=r!Tg{mdrfV4m)R7 zChR1J-FCB7efl^Zc3XF@G=R3b1@lFBlpzyt{<2$Qdk&;QjPi^`DM)>YYLxYWOpp*f zm*Q9|MkFr#(x@L`z-rgfapnSg4xXomF=0SO z&G>FQzdb{BhWluFO)NP7Ld)Mj)nIu>U- z?yXWqg0exRG&;FKM9Y=3H#h9ZW4Fl-5~G@SOoJGd3}S zYc!BI6cGF1mI%^t4ICLqqn0RThpyD9JwO-_=-QzewlIYwbqd$D3nFLMxfu{h=?rrR zhMf%!JuO`y>sJf~9K|Nl9jb zlZec7OrGtuBRgg|QKVpq+@~mnzYyY#}!Ug^WW%A%9a>awV-~2+?`}0UFa-h3wbV zsruotou#sztSPKEBlH|0p00aAM0iF%Owd!ZUt4YtV9=BPt@~+@tVbK1roxj-}-W+jFNmp7u*^yJc3=euO5<()y$F1D8{6U8vrL-0#h^ z7<8~5b%z&r?YX6cVw4tGd!jjwp%>esH)onkl@+$Lvbow?q5?=(Hl&|VPTW#u&D3t3 zq;Hq?_f+j7yv2DOU#BzmB>wKYvAO78F-d|-@T2BKj4;SfpvioM_Vf*^ELPAGwmnywD`|gA zc_u4X#jRdCEkH)K_77yQ${t`Ro6ix;G?hwY#Y^T(w0}nfUroz7w&!!!Lg@b{Yo5bb1vFX0 zdoMZhr7G)8?ZV=CDxGUxilF9N#*f5)F zE*py&E@3z3?*ZToxh)lKxRp~nXKkDa+XeNI#)-S<&f2{Tu5-@UFVO}{%VFW1H)oiB zsl5zZdnM5Zbv$l&S+s%L2yh!4ZFm@ODc*X(6!24fEnc=F&DzUTJfZUe(vXL>Ln{ms7Y>6=jyrp3}| z9xWVHdWJg;&zqRx-yzHZJglGUFq1O3J2iijtC*RdQVcwV!~Hq1jQAQrEpU_uh`{W z%ju7Bv6#}X(8KtZ<0|+O8B$*gfk!mvGeh9emH6G9#`3{V7ds-Ehv~HUzfR9`U>;sq ze!@JQsotdx+e`f_a|WaIa*~)y`zAT3q%>{QdIp;a;YqliB$TG3X!qsFp+jut$wr&m zz@)ZHQs_lt+ym#`qJSIs)?-?-f-M?#EV48?E)2cM&o>^vu~B3z3@9(MKaQ%$Z9>9F zR7F$(a{)-dB!?VscACV+AlT&5gHk@4ro0r^>;!Xe?fxM)Ln9CW~VL&d(gw0>dy%cUt z@i%?H%@;LXNj706qFH0)09eShXerZ{U9?R6SZBQjdve>k(=ZYHgLuK34ZV4+*}_mq z*r9eWr5`p^_)}#SO_c=@_B#F}4H6?rwN~+79y}+ShB( z3w1ICB_(I$JiXVW~tPKTYWgmeS&MW3$hlScQa}v^*uar2&u}7YcH9Z%jjCMBW|7S zBoUnll}39}LV3$7();{Fo!?foiT2-Jtw$CJa=uo6LjN6mvL0)$Ww?7(xJBHR{^Ay? z)`-r*fx&B0z)RmsAnP!=W?Qpa2_@eqo56!7?~IhrY7EGc8XjTKa( zoQl0p6CO|RQxxI!18$fZ!3&frAgmO@Y9&J#=uFDm8L}Mg!9gB=7QOx}XHnE7BJu5G z6cDySsV9;(vm2g8vvFP@GE!?dX5!F)5%04tttdC_wL|5m`|(Yw<1sQ}TEkX7YC+^- z+_Nu?&gbou$SL>iDyhzkaei20`<&>jp_<`uPB2nmVkDI@dRTL+dtw_sCbrOncQOgo zVa?dS+Zu&O#frD!v6dc^PV*;yAcA62P4xJME2+Z7w(d-7Ej{jaCDk7iEGD&?9V(X-wQjk276K9h}%okBSz0e8*0zEU}#gYK*txT5P9N)||qWD3Bub zpz?_1uB_SWrqd~=$0uY^n7gv(Pr@2fDLu&MNkJj0JPm0WJzk;*>l8^vbW+3VLGI8_ zs+Ue`G(B!}B~^flnzRbb9M_D(Q+(cqu%6bs}-Pat|IC)-|V!G?>YBrKCoX zpq!;}rqFc&nnslwLBlbJu=PCuS7|-!!oeS&R&FeWc?{+in7_d6g6VNO)cs*b!Aydg z3X_0&2}GwpW4e)ywvZ*j{*_}qpMS4J1}o@2xjOT)aw#8LrOgXrRwXhrZ5 zOT&5uhNTke@I-*TL>tcS#um6bkvg(*B4NCZDAD% zXQY0?ML&oQi^y~v&Q}&*pcrkaQm?s3cR_g(-2Z2d_)k=L2!-mt*wIa8T=q8b5s2g6G0QRR$m{Tf1VRAxlO`d zj~}FeqLeCCp=?XTKq%J0(jPu^Zq+Z*hG$B}^THuXe&+uEGt&4?thpTNf)|q77Rw(Ntbku@T}KDb^uQ0vCQLgg!(9LZ}Wg zRShhapkMzugK72-37Ur=q;v)H99=v%OEN8%hDV{>4xblF=<}5-bFnnM0mXXwoFG2B zHpJ5K{tv{bAAF=X_!4b6=|&YEy+vx{1a_N-SEq~XAhCRKomd8oW#08-IZiA`BUq~9 z$KrCLxQtR=thc0nzp@mGBM zodh2Iha_+Wevm-(Sj1aQk(F&}I09i|ITSupvV4g)cpqkJCdH?p2m# zQkY?3j4{ucUAEtq7m2ZJxKwAf!>X~}$fWte<m3W=s9b2dInuPDbuuJ0wc{|QrY zaP^7x(3Hie35KPnk~Uccb=u@b@F8Xt95i5>azwL$UkhmetFM^gBe(^VQ+#SAQ&Z(UuW9xHYJ$%e zH{k>#C+UC*(w?0O-3_6SQlT;3AO(cRHwaqs4T7;M22^G#sQTFhB8f_sGpgjd+q`wN zHE+SFU_UB{;hreQeY0LwDB^O*=Q16)JLBpiE>UU;QrnOb_10F_w)$?jTrxaTS1P|) z&#NoCP~7UnHpARa1K%28BTC8##|JDr3!1ZCX_fdginPi&4kp>H@@l1Npc0H*7igiBp=-tKEN9 zA~wkAyggtS;8tb*`L`m2#45XC1>IO!xZS1EN*DPr&&{@xOVyy2wN~w4Uo#6#)-0LU*AKoI5dsu}~PBQ+>eLP-Lq%$9xvF412*D-?T^J1{x@&Ofppy~ z_RMMZg6-vi?d5+Y6AMAkLbE+3?p;P;X8f+QXf%q>l%Su}`MhxVv{eHlR9?077r!it#N3{znP<{gi zOT)zWH5y=!{h%UgYAD{tZ{YV830mzTYpjp;$v(c5QdLIaMdLSBTqiaru?V`ly zA4avZ`W>xaki`y2+yXDP4v=|vL8^~smEr4dUXTYnAP;sxMr@FfuL#JG-quB^L6$fm zOB|5BY>+tStw5gY1$mfL+u#yxkOkP@!2jm01*#-*Y5bmV?53#;v(%|=aOYCnD9qkA zPTV6$oc!3_7kj)=2Rlu3umiQP4YjX=ihlGDyC3OlAL4)=;(#r(OO!X+qS^`eVISC` z4%nd%So9-R^Qs>S*g4w>-d<+^r_XW9AdI z;vG)c`}>kK4{LoXtG#*Oa2#Z$t6s!9)nEtOVDa?= zdx*z)>j7KffaQ3r!9t};HBIc**~hRg80$a! z%!~10VAO*j68|0n6c5gGDz|oRaEBWdMuO zR)e)iTUld-xRwJ7e!Y`xIqW$)!;AgBGc-uOi~S0iQI594++&yn_QDJ=-;X1={zxT9 zZfJ2b!(a{)>r0SsV;qF^uw9SU6B0_jGMA{iSgNxAqIMMAiHBs9TCWv4pBdgdL`XO@ zLm!1Tbsh%R*A+2) zr&Jc{s72{Mu846_lB|eNA#C0M&TAK^US5*dy6NX$euwcQ=;1)pSg{j|R;Y1k=z!l5 z&Y%3w#GR;d#k;^!mYVf?1jDF;2$dmc1QWh$r!WFok#I@ctk)&O1_`^9nOhMt27!mo zwUFJZ*(qELx90G_d8?WjbZgVYEqW3$;wDmiVM=~SFsi*fjJVC)`zWNG8?e62FaiXd z=YY*)!6~rZ+{6FoZKw>*2w-{X0UL3^MjWu*{F8N5e;FzXmi$hJYa!TP4p{O#8Z37Q z1?)fvEchJ{*a8PE`5g_G+lTnyysbC`7VM4(Y##?K*&SW7++M{0=B>E=TKD5U;CDP= z3!U00zeBJX|H-=uOfW7j&ius!?FWpSaUs7$jCyNQ3N%MBf?>BOFMvVS4*)>aC7Ein zI|QirEd^jV0a#YQ-A0FbhebIM=rnUhen-%$T}>%U9*yFv^dozL4~Bpki-A!yF64JK zM(%k^Ip!&h^*ik4J=g()JlFwAen*4kj;Mf)XpkSksen{c6M#I` zTabr2l}&y}gXC^1{x@$cP$0nwfZfrIfPz`-R5sZi4U-$L0<*V*$(9LzC&RU{I0ri| zll+cG%1v283hi{8YXQHL;aXUtLmaT=cQjaT+)9b!nm;bn02b_y2kcM>>`(_R_jU!W z>PEt1f#1!I%{eW;P0g!s&LD11J8|n{j4)L8m&Dr<=XGC^8E@N) z^DLlfz%ESg{Y;yhyXi}Qdn zNSsH2esLZE28r{C&M(d*x&Uz=LHfmc3S_6^Jc9I#^AyNV#d!qj7w0LEor?1a(l5?a zAcMqt#OW93DV#y#JVN!0^AywoaUQ|?#d!*BkT{QE{o*_Y_FEI@y_Jn2)4lw-82soy zi1XBD2_{}WY#)l19+zX^!?wE3mCx9sMqA-_^-@7jO=@9b=TpNWZKj4_%~CYJx)Dpu z|MBr3JZx%t`$bJ=e$PZSUQ=7-qVf3qUC5Cvzm)jXJ=xW7P$Ez;HoDBV&s6z2%0*#( zS15Eio%U!`X0tVoH8-HRUc&>^Em~Qp%S7l_s79ifiGNci0gWlq+P0=Gj6)Gk3!a@Ft39XYBmP*$W=uTQ zd(ugvOT|~OiZ4}vJ&HhRa`#&}u{GmlF{qYdkTc{PO(+0i>U3HE>{ivz%NbcOeJ|SF zR*2H2<^Kt)EK>iwj+GG>or9=O%r(%IxCfe!bpW`gp$@6{olu({C){LauqRE zs+#qdLebm*A#DG5&+y`%6~lK_F-Qp%%0|u&SP<7uR7K+3qc0HqgwUc%;qF~(0>|q@ z`D~ig1R{TSMrIVs*MD*~ul*{NZmvQ>RK0q##KnuZEXWvu+=Z;Qx8>NP}$Q{E6 zq~O2jAbh@>=VT(f!4_uQs&oBvb^%6}b*Y<9;H;;)3)gU8qYBfRkZ(i-=X{kBqxX|; zl7wm*9l4Egn5O-aNPu+f4Wx}rOgQ7ZXrH?uw6ESP+K08FUAG^!|M??V-3I2H{I)mW zKim)6H|!N{99+%NR z7)?$(gG{DZ2X_XU#L-H*^*TUi_P7<3)vj)$0o{KBmtBuob^(^ zjZI`9DWAO;l<|cqALYmQgYqV9Pi6-8fIL%&&zt8L_Ji^TdqEku{Q4;0OUhjuZa)^$$^mNymZz%Zn;r#K6q1J^kVo`TH47@e1ui!hXsj9Q%8%XotOyd0l1 zx^g>ks|%)FzpmVl&UEDvp^dKG4%w0j(v?HZHo9^&hvxLAr7T>(`Z2U;}jJ2-dGF2e2LM$`PYq zR}L71bma)puPX)u7FxsB3 z+}w5b)OXRGsJ-b6PLjJBE?JwSE>}t!uS@-_6e*(xtDSbrsY6O|3%vlXG&gRlB$sNu zKn7J&ntSy1_C!m#G=YOGMa!=>dIw(4of)N_t+;~$W$IVj+1i=X4kENs+S%F_r5!|U zqqMWNOG-P$=vUey#$cr#g7quyD6j!aI|S=j+EHMGly(T#ue77U1}W_jtY2wIfeldF zAy~iCjshE`v_r6dr5%9nSZRkC{YpE)7@)L6fPSSN01Q&vAv(X(4$%cD?GU41X-8q~ zRB4AG{YpCuWT#3y1nF1WQ6M{2+9624(vAWdptM7nex)4+Ge~KNNc~DX3Tcqi4#E1B zb`;nEr5%FxEA1$-d#kk5;XYDFRCWl~ud<`S2B_>1tY2kEfeljGAy~i4 zjshE`vO}=2}1Wk-SRRAq-C z{VF>OWTz@S1nF1VQ6M{2*&#^3%8mjVq_RVtew7`CGe~8JQ2i=93TlAL4#E0Wb`;nk zl^ufhtL!MS-=4}&MhRVWrB8ty-3OH&u(gm!I4V2WU93jimFHlz)jR3Gez67humMs9g7r%k0JdYP0x|lf3cwg7 zRUkmWQ~>}3qzXjmmnsllfK-7P{Za*mu~Vr6G5Vzn3S*~I1%mWT6%@!$r3wV;mntZb zK~e?c^h*^K&H$+bk@}?y3Tcp3fnfbo1qC)psz9)Qse%Ig?MW4K$b72(EiF|T34XLg zse&BB8;TfO`^`Rtw|<03Z5?64H|MGGcJu@g5P^D?Rr70?FhT7x;RIeJqXrXj0`CZW zCt1%7OC~82@15b0_!M`@V)w)?5&?-ryd+#w5zp~&9Ev-FNvZv6O=YO2@&gx@h3!)D zWuy}-aw@??W%YMeUh-X32D_=qE*>u*t5Y``LdI@yM!GM65iQdW*D{%%D!rCDTTxZ> zA(tB!VGyXX*EY5sKk-^lmkaQ~HU*ffR_#d|K}IpwxwEEo$eE2M4f#QpT58AXAf)H< zub*|z;~i1xP>u8;CZzT*G>wxqjd~Z2``ggC5u6Hk9tvj(kD#=iWWTQS4DkfHY?NqX z>#J1F_XV+3FBiol+EB#zS)00AZW(DpGvl2Mt@*h>L-^iYb9Ps2nmWhsn$FfF&UBHuye)|# zT}_|I_T1?|dbX=2smY^j*J@p;_Y;3r?zH?rtaP<}HDV0OTAnawm2~?w2>UORmEb4w6q%IZ6F*EU4&#D5{fk1|rwE(3zg{#i~c8o@8R0C422j zRSd2zq^{kbc8Ts)7cntC57+6$+%tWqS9Pqq_dT7--jc~yFxptJ&OQXLIDpHhW1o8d z4C?mWw$ioBkdO!3iutSvJLF=9EYKmfV*YH^3V<7IHKfh6sZ56(O@^>ETCtwu0gQ+D z@Bl^$Q-Z8EHTzWYLe;Hm+MKthZlCpH#KgefY5eN#bS-QZ4Tbm<>hN6$VIv2bIR zYA{&za}#d5W;gZWlfUYw(~S{zeIK$yRS^prI${Od>Mmrd0IiNTIOjE%c^57_dh2k6 z64gx2>YfVble5r*Qbg4Y#kC~XE2*2aeEXMp8S|9G?o%hG#sU^?qNytSeTRxG{QOWa77~A zRvwR2xwtKLL6EC+j@6wrb6C1o)tc&Hij|1CQ_pjyUg$f7t?rzHNWCSoj@JjccXXa@ zn=aP~)cF;0(@ z3P`=r-lT41u1eL5pf#%QI>de$x@UHm1s#3Z20h)=056NmQ9ZMriVtDT^ex{zRRsY|ImGxVx`g(uyEl_Q*!{XbksyEcwiIWVva)t(^-lpnZ z7h~AXcAa6=`_p|_S4u}^(oUsg)5sQYdc=eEZ}H9%H^bBm9BWXG#T6pQD zd%XP>SU}eISHqq9F8rCNzH_y;qr8P&-6cpSaR8`zyZUh&z%2wIB;wXxKUDyP!>G0z zw6&w5F681qf~GsUSkP0t&w>qQ34C!p0O;wikETdG818dic-oup4g+)NlW24@-1lu$ z21hFh9kzKKleuzj?I?5YOxGP}jyI6HGdEq+ zfB87pD;f;$#Ci7tPXm5kTRUpN?ab934%tyq@pj>Vk5UCNf&lbvUDXc7L{nD>30{}v z9wZiN3V$whDE#|=l|^@++EC~)7roo$;z&*7Mi-5wiw4;BncCXXK(u#^UoSxLwxq|w zbFwA<`&fD@#y9MuiEi@6eNM%;HxlesOVal*WG1Jwb5z=? z`;Kz5_shFgVe0HXs;wPmZy>Ul-{tJ}XB~R7x8Vd;y+wo|&8Nyb#zhm=dx*BW`V}_d z9kE!*wWRM@$T~??ZEEFE5Ynyq_jfrB2d(%8ZFRL`Z0|co%}-0@W{SFFQX}kE#3@&A z^Gn`bVvw#0nPaN7QlB5`R8WBnB|3hVwsurO9Qe9MtWp!Z-9>EKk3Fs7Zf$iD8|u!P zdz9%+5?`Z+nA9O8rE7hJD{a*Jk=p92bzCp+)H=UTlAGB}>x>vajiSag&YSHlOUdJO z;k2N)mUt@lRc+nhNI9O~ zmHK^G+Njh?+PeRhdh)kaspEB}-ZR*#)MplZD)nJ)-QP+*^;@gd3A$3Z4st5>i#t4( z`iZvgZ>8c(*6ci~I+D_rdWS1*RO%dU-Tz7*^(|Fug|5`5Qm0biTjZ(K_1e0>l{)rY ztJE`frS>FfDa&fB)P)jbeUY~AZ>3JwmHNoxPNlxQP?ZnUMx{Qbt@~f8qras}Jxy0? z`Y@+bLoSq^x4~IIH zy5n|FrT$4<_rFrdd`p#jx~|lI1T7^Hw~lq8M5UH!tE;EB*@^4Q^gU6Ndb$K!9*^UJ zEMNn@lbh{~Y}6UW4SEB8HC6#!hF#6bvcJr``}L-HH*r&&;=F%!)-rB|8l6GSUi5c~CmOCB%g>Nl>V7`%=3_C_ z)}#E21)jEZzqU%-u}@~zjnw?{UVOr^N86_3xlV?=1l_y9Wgn;O^ZkRJ^4LA!DGxNA zkF-^Cl({uw@2`{5`ZTHOE>ewNQn!3dr1V~KD%VBoU@xiYw?wL^F2Dz<0ID0*uWxe- z&~^SUI~PHy>$mAF(L`$h3wWE76`PSLR3T)8%JA(C}zf)iX&fgKN|NNZ-8+87TVEyOs z6xg8icLeJ{e+RG~p1&hT|M@#$3_5>Dfd2D$02p-sj_Ca7?}#qo{2f91&)+GKou0oV zNdNge1+vrgcLeD_f2Tlpdj5_e{par#$e{Cg#OXhOr*H2N-@8o4MWT83u<|39s&YS zEp&Sy%VTm8hjYVE^ZBFas$thVQAM3k;azlkX54Li5N~6$W+RH!e-LkDX9w{Rq0K?O zja@p3hnQ^+;%$`SGvIn3V)P%xBgWu^cm(S|h^N2?9mFG8|3N$jHsBy0!TJy4DX>8Y z@d(y`5Kn;(I*3QG{)2c5Y`{T0g7qK71K5ra;t`|&ARaIV9mFF*|3N$e3^<5KbpC^Q zL>F)nj~M+2@f5~R58@G{{~(^i*y%w$g7hE6Qy@D%h)0nAgLn#L&_O)n^dH1iI0Fvi z5vl(mo>pzI6!0zQiypDIBa_wb-)`$5uxKa+2t<*Ep+-cFw zcDd8c_nA+`Czo;ft$prvL$YE6vf<}WH*~_CB77U}bVHZ8Q^ah;oo?t7cS?+Y?vxk< zxl@AmbEgVy5O+$je(qF(4dPA-*3X?PumRjD!TPyV1vZE~C0IXqs=x+urv&TgP64(< z?vxn)+$k^yai;|6=S~4Ih&v@ZKX*!W0o*A;`ngjDvQzGqApP8_0@*2dN|1i;RDtZ2 zJ0(azcd9@Jai_%T=S~&QAnue<{oJX78o-?rte-noV1u|*g7tH!3hdr;ryXyPXD+DM z+v5wtMRJ(@6IFG!N#0r3YfNUG6mF97B50z}u4=4Uo1C~7 z8S&p)wicsThaVb5gf@4Ut(8G5;6sCm*yhf%wKBqD+U@j1gT&~+vy2#n?<^x&|D9zD zY`~pm1na-EOo0u$vy5Qhmk@$nuWwj}A(>s)PGE4yUsyqTiP(B9nQNqW8eDvd^Hy;r^?8+RZGr{o)JH`E6SuAKruWayM9CzT(zqh5v zpmxkMPUZl`ZG6nd!>;ZJra9dL)t%Hvxz(;~4^`P+3HJ;or(pFdQacKcNLUIC% zqROrA+S&KM&e45*0O|GRqZf&4q3{tdDyaPd+A5G#?eCNBU0l_BYFQTO{fv+M@vsZ` zS5rORXqmRUy3sxqZj~R3 z_hFuec^>9BFpvDb+%UR(|FXQ+?%6*3|FJbE)8l95#tfL(VG15DH!g-*0W<26 za^n`5U&9=?6bb<;FY9%Z;-i!!OLF$I%gC-da&^yz-RJ_CfYv7GAP#3x0E8 zLb=^CF5U4K?vaK90RFUJHvHdq2GPAK=&z!0W&R7r%;1g*mXP z+$ez=1Tz#y&}X_w7T(aVGxppwn#+ynU=De$+_-m5x$(OV<;IS8%8kfh%8d;$@4(!< zx!iaV<`J03V4mXp-%fBgPHt3 z`W4J&Fjv7$gONOE%AGADJ7X&@W{W^y$+)lups!@?J@JOVlCi57SG|h^E8qRsJ7Zys zKwrt&RWo4aJAVTY{2_4O3R4d=59W55#V~in+z<0Jm}M|4V15pB%$9QFc$g6|FT=b7 z^E%A14={$noCvcN=5d&(Vfy_IO$??4rV++lCW0i(T`F+N2{{1y<|-rc=pOd^yUMIs z6`JGE;)}Y2r! zJIvnv`R2ZE&dlUa#p!@<*Z;@dyMV`4Rqw--WRgzXNhgK$LK|p+6w0MgC@qw>kd_3( zC6GjdAXf#;Sm7r~BDbbVoRpFd&?*-ZQK%qREsBbOS|Gt{FBU9VwP2OB6qsSELKYghDdyw(_aNUpV0bCE_`W~+S3WH>vb>=M$zs%*=$9L7rSfaEY zwp&?Yd*rOju=Tm`@PhVQj9SEMhSR2+KXDwg0oz#^`*bl@zz}N6>=zKndaoAtpJj7)+8hj~aGW|MeZ&ZojrSRCzw1P{NOFsnLjef}GW=JQBO+L_<# zYk4V0h7Fvj28!{s>cdU^9@m0+H3C-g69zP6pBgSl06AVejBy4Q_wI+GD(yTHEzD@f zpulK2#R<`P@KbXiu(v37d>YCGAumdrinISo?!vX zWi4UrBo&M%`l+MwEI@Oj1nY>qFk#tj*?wxvh8C;n!ZjE@)g}(d7?lL2k;01v7r5|Qd2u`p4#$adAfG+4RmF{ zgV1&+N!#HIw4H+x25j51^G_|CittJpmnoNcO25QP_`Q}FVJ_1aV@iLMDKmjIff0E$ zEsj|rzwjfsOJ(1dSFdwu4M{Uo4pedEeU9*9$I* zEEP*jW#9BymaVw-Kc@xul-)ZQKglQH8Luu9!%uO0PV(WjyM1)>ZaON#p0J}8wHH~B z#b|h`TPznmQr9{h($(NlkD~azqV}{25~-Y3++Gz*&8LqTlG-6gX&EN@nxgjFUjq5R7&*R#J>jPZ-BV*3L9LJyiJ{Rji zbMx}hN$8zEaMF<*)W2NEpLqq}^k2T`4?)mZ)0-Yl%=!z8b;TqRG;bMv7<@pnfL^&I zEq`#pBaoXLbS7f?;@1w!myDeLgFuh%3azVTtq1;4*_$)HBi7WL6S=1&UbyA#a{`!v zi0#OkzG3zYk$XGa3wL(mmDTATP{KtBp@o5kIbga+S>#ubsCz|)WtoM1*C-{DndEaBbFNi+L_ruKlz+X)I!=lgd{kvn8ZqRxkh_2!L zznS;l*87}j2j4$$-uGDVbE9kd{)gs$uk}7Jx}NWsoA-Uz`-12uzQ57D5B)WbXEWbl zZr+Ej_krjZzCXjfKi|q%PIN2ZA8X!UXuZ#kZsYrL=KUqs`@Cou-|rct`Mm<~*H!kh z@>0XuiaXhgV@-Xbrh{24kQsH+os99K#-KC}-gynOk=h(3ibSoD2tKj}jws71ajJQ< zlW$m)iK*sI6y8xrPE0g!w!(W|{u5w}KLNwK{LOgc-@5!K@w7*twwQO(1c99JYl@^` zw408@jU(_sI3^g!csdHzu`YiX$nnpx+0pb2nCy3fdVGxB=U)=93dJ@A(@sba!-3Nn z<;7wxv2Bb}DEHb+;`2k{oV2TbzO&cI>J_JCWSQQ08p;!*@TK=LCS+NpPJjsN>>Uy7 z&1oFAk|mfr1mdrA_lVf;T)bfkriwJ^@Rcm9RPOW+_N$#pV!h+K56`@on|J(0+eGrS zr34!DlkF&k*jyGzPQ!402sTEdCop%fKP`otnxyaZtN^)K6(xPE^_$QN^dkSdKiw3iZ;ME+QJ|+r|tFZc0NGvnrGnQeLO_&Je|`Em3^_q5vT;b{Tbgbt&mBFzUdp5ExW3hz0#dE z_(8a-UxW`rqL!|YEIrT;R<>J$72{_m`9wR;w@S$jq4*ebcb(bY_qx0cCtnAtcp(F; zLilS9tkKO@zF(TKzhu}k1^Y3ih&OPs7Z{Mm!Z@V@j~WDQRkVL#Vh&FqWIAyW;{#|?D^odz#njp zLJ1y<>l|ExbibevIUe^=oK~+mlsH2P%dYI(z<({SdAJ0BmJX0%_r+gMjwh8|4u}k= zpG8h@Bd4z*r=QcRMP1l{K0xc_f8a~7-6MR1n&ZO0?a~57@!AgG=Ig=he2BCiggYEt z!8Fa&@$eTsMD9GANi_8x5ot@pji*_WHZm*%yvzV?yKzsBMJR}>)_3ahfcAxO2S=6$ z__n%lddITXx{uf_mYjtj3HP6LxbnzSk~HBKX}AUnN9{{6ccazDb{92Vts0r*U3nu! zq-beXMd=3K`XN^@HsbJT&Vu8s*0Ecr1sX8mFixoYjwFg2s9x5g_sUJYF;mJgg)=Zh zVBzQsK$dvPygUIyq?RH+vBtbPL?Q+j4om#lyrJ%hhzko6_v;&Se#?iL1woErza8)| z5ZDi)B%~*tH=?hbY-0D*kW(EwDy{Nl%nsbKMa!lH8cM12Lw`QMbqaRqasefJ7If@k zQP0DvwFqf@aMvw{Pgv-=c({%h+hK2M3WpXKM(-gH9zI#Rh1lE`ub~q~kwZad8AYEU zo0dL%b|CTc&l#i$u>wuwqF*HsuchZ^#=l*@9u`L0W-Mq}{c8-imBDs0*yl|!Bh-aG zKAhGtE_x%wB^a)U;bx`7#csxcWL)$n`iDP&|9IRI2Uz4nv73tNe>45d=s%7AyX8YA z)`{AN!<1TiBfhPp{DdV0MHKULDl-yblUvf!Fzgv{Z6KBZ%%0{zKrI=Pn*wIN;c7lN zTqw^Jl^1YvHEa)UU2sOU?bQLD{YGyNS3YqQhGpAn7}|-x+1hO502yA zXi30Ax#3pb55ohR8oMm3M0cThNzN$>mLLc|Vk31e>P4^-`|OdUDL`cOjhXtQE^+2; zHj-dGxPKZ_w2Ju{%m;Ogi;`%Kbs6ey2%&%wVxQQh)j+ zt7Q5~eKk`*)};P4ii91|4z}Xf4_n}D;F`?IbkC)=p@FB$wr&^y-CcMQS@Lzr)J=)Nqol65jTPo`OaK!A5i^oMDqo7#>WYP76 zx8i1I09tDA?CKsMsP92@@2!dU(DR1XQtnp!rQCq@g~$q0WIfK50=-Bnj9cP#lM-8G z5caj&g~3F@2&Ntq8RWUC<-II6E3yb@fg(;>oS(+%!{AO_W<)Y8r;&MBH^1aGmIWnI zS#9F34+$(-6CcBo`<`#!0Y7n5NnCuG5QQ+J@?D$wen{&G{h`)^4t6&4G;3}YqUPmau zyHP8%zGo##w9kit?uF9M=h_<7YrLwaHrl|T@BUb_jrwk%kHge(>TypToKu76o^|C~ z*wwx3=IIj{iuFSiUTk}xricZ6l5+A?8QZv`HNsV4aIIQsck$I z%Gavvl|}R0QT0PfqdYL% za0|-gWZH5UQK9HVQYk7Fi)1)Kou`j{6Q5sI6AkPJol>Dwgv3$2sp{6IA~0oh^Kd+% z=vtuf{fA5$LfB|ABi!GhO$GX1RZX7QdE3uI6MPYz}(R}3~`hRG0Pbuh!FKfbP-!Np{4te_60RL_Ti4e3O5U34o`>3LLgX93&EcU|Tkg~znq#&P0VhLL7n zw1@s3#^3O)7}0VYMk82FH25I`Jfs0G{oSVYpN{OqIg2glnP=N1u)1J#L9d z4j>GSwlL>1Y z!P$Z2RpO8ALq-Op$Q$loM|J&?ng)T8ux8wIV9I^P)|+d+@|C+YDLJ=pGnY9jW4F{!om_!T`& zQrL%5w5S|isO0|*R!}b<9Z8MAFlmSbD|~9xj-tscp)Aa%5T_6m+z);@)PBC`BM z^$|x~^(o?W8+KtumLCg-Loji)O(_)zzwjDaz8aMdA91w3GC~|xNQWlgwS0)QeSy>O z)oWwPBigG8gWY*#Y3E`x-davPz7wzD#N$T%z?&N^nrE4ZNZT(k5e&zLlGI8h1&3^s zZF^Q7V~C^eS8yb+MVj!QA#ctDayVv+WA1QxpR3+u;L&^%y!a4lyBPb;0IxO4FN!L{ zhXvsz8{unr2*TgsM}m$;OazTJt^G=5=?6{eoP6s}33n@gNLotu*IGj2Xxo83D)1Qx zpXOW5L!|9D2g}>H2#h)BL!|ALN%Hnr;&|pDaXclCC)Dw#I99=tya5;xaWpBmHE6^! z;EgP2xe$8SBGibOS_3O3=y&a)%T`FxvG_qsUqpdL zmX|A6ileRbMlB%ZFtYq3L`Sfv=xF;{gE(f0kEsoDw0-#t;xiULQX71Tv`xQ4!=trG zZOmY^Y1?y|yqzqL?_Da6!^F|2j^o7fIRs0-d8>HOlsD5a7sqHx`)+lN5l0-3Cl1EPaG;wRKc|LvnsJek9z?bhzfo(p&9t4{5k7t#D6kI26M}0c2oljUDvv zZ%UGr@B{C$hnR}vL!|AUn+>1^C}gb-os@~#3HSaDnr>hPH?jyKhDm^l6cM>4KqXULm#)iF~Xr>SGK z5IPBtu8B`(Ea?Zv`zlJ-ZZvXj!|BukU`--JrOo431g zv$8eULDXzAo8bIbaR29zm&Uet#5U;Cn^Mt248o$pWgoM_?DUgCLBgd(IOA*a0eFiK zgXR*Q>IUIMO~Ak32;6_g4L%56fY3*2Xmn&6dh(u0pX_PbRH`w|9OD7dvS2Cz#G1rX zj8kCuNpBj(V#Z!;F=KCfF=HtfGfv_{%u+C&Y9{7Vgl4lq>yirk$(pEt;z%zs7pert|9iF2>$yoWj_j^6*l&Qmz3M&5=}e-yr9;IF~jL zn-#102`7v<%okJp->!%uM@MWUOc+>oSE@n=N+}{^=@n&)exKC;Lkz?N6};(e2K4EFXx)+d^*p8(y#s`WSCv$Kv#&)m79hAvs1hahY|U-*EG z7UY>$^?b+jhJ9rkUs zOOM?sZQa2ZIdZd=b;Qg#(+UPo3?mC;J0ke++);?IpbeVYlA32-rGvcW<@wZKlqpc((2U1R{17{TsY=LYLN(@MeOOsgFHckX}@(3I?+ zJFFwCa?|(*fKqOMPQc2cJvvH zWiVxPIXp~BuuXF0IUW&c-o{`%7e)m9ckbZwX4+x4zh?kqE{0XlW3Bi#djOnZ0G6pm z7Z^LYbD?p3ep%VO23;ADfJsY$4yIzFE3wdZCi1PbVe&1E54kb&R4e($;JR`QVJwWO zaph1h-UY_i?ak=XEtqBjBfNlCzSGBj1z3KI{*H@Ewa(ZYVjIg5N`#;}fN31`SM55} z`UiS<%+DM3NzU3h4w0}rncb)6wsbO6D=f$05Xp;-GTkS2T%?yQx{h9|&OQIG$_TeS zjHr-cpFQ_Iw~$~wSaPSKjkQ;I$LqUQb+Bq%REKUbMXc*o{A&gw;%$yZgpA`syQQrc z=pj&@I|`&EO}}k(Bw}V9585qly)d>tg8$C#g%(FrNTdZ5F><#1SinJ@V-yP9($+m^ z*huq%lt>FEg7qE`s$e~5*ibN0N~8r7!FrDeRj@e2Mo%un^qpxw5E3r1-s3?P?0BoK zv!AotdaoO-_jphRJJAwM+`pkxlv2V4)_Xjtg2nNmIntDLp}(~C=iOk7?UJRCFeN() zCOG_ec42!#8f>#0EYAtWT4^?VN(r!2EhGb5yud_r@3Y!bypjd#Js}hr(cE)ke8Yd| zcHNRvR`#CV+*$P#?B-4(L4Yvt1ucNu3PJc?gAO8z_3k|(l;}F&$+tvOzJ>82H%6Wi zYGfv*M5SUxjVp%^Q;{@TgoIXlnI$AdvmRK9HCtwEb??7W^C%=l(?it)coFuMq_wUA zWlqaW%!O0tJfg`ZcYPV^{@c9m;O!s0ZN*K88nua~DU};G+3O*GF!g=K`ywy$y4xF# z-q-)vNsSKBy0M(i(GB7t1LA52!Liv0zS}cYf-tRl2tE#lk&^L$3&l(2%wp`KV#mVq zjn!&6zqy6pcW&>|})$rh$^u%l~CG8JPHAd$fU zi}TEXGj}q?vAd9r6Hn~Iq#olg%$K1NGH(+GmA4jG-Y(H{5p8j!jFyIww}-uXtJRW9 z=k3~m4J~gYGxGNS4Vt%8zC&>?wFF%qiqe~ z1g3p53#!vdb<=~vr%fB!8z??qg;wp)igKh~j5UE+p!L{OxMJ1q0`(UiO5 z)w>`%y+>2-LN|*!G5o6tfYrtBH4!1>Xv$rpk8rvS|DD?l0F)ZC40qC9JR)WsO}R_- z5l*M!zq5;bDz%HJCX?1jh|zmAB{AxJo2behPns?snoPQjCs^;%lnT~!XeqmRC^9av z-lHiMEGO(_?7@{#MjwGD;{xkFno_}XMo$Jxx*1diBE~x|u->C76)dOx@ZY(8qA6J! z?zq5ukET?xoDvj$L^u2CKSx>68FyrX&TR zZp;JWcMUp>l34FNozjewINlL-I%g?r6SuH(l=P4r<3YAwM@7b9DFttb2#`)dZ{67Gls`7c_RmdzxB z@EInNgtT-&lL%sFm_!oN()~;##OO7N5Tmb2gkZfU5e4gK5+PWxNkqZ=nM4TIYZ6hg zJ|+=@^_oN!te;7QV7(?01?y)LAy}_TM8W!)L@7 z;|zpb9ORD3MlN@VFSu7BmFila^V7wzkagKMa{+#2TmmbD@j1kSG zOO@i4>Uc`V2Qns*(Mfn#b#Ienbb=MVwqoEogP=5Bp>wrDWlX^Gya;=Y%y?%IrODBb zJ9}?HBSiKVPBLhR+v&-O45v}_TBi%ZW@b*Kpka|)G}(caCA%*{vXUQugfH7DutU2W zGYULjixvD*n|N48TtgTsb$Gk3!?ldlBc;>2(xoz(QD95vNa>FYwAzaYmA5We-Y(EG zmAtK$5tk=#=5!C1Csu2VjOR?8@zt7~5$Qm#5!+wQUL`(M;topLd~LOT9? z%`px@w+H49It?NNO+%fm=_mjFIix3}rnL8RfShMi zlf+fc2|CrBfku2dGDJo_HB8UscF(JyKDSsH%yyj&ICA?llOB`D^!~%nI9su#CXycP5n@it!*mx{WR3M%x>x7-%;23`V)%%pQp6y+9MWG?al5 zQJrV@b1t$g`-!c#oJaOo8mCm=US*#qZLzcMb@s6dai3(L=c+LKxfj~m|M}ls+5f(A z?tS*rWACHv@4t_-f1t^J-e>LX|KhK%>_1|hd!Kzh*9E=aUe`Wm#rH|=bJCBsAH2ZM z{xAPxXCD@n(Yif0vgBv9ps;g3?p0BC(iRkECv43H?Tpv&L_5YZ64zYNPPFx`b3urZ zF&DH`204CnL5P_#7qn9bIX-hi#OR$1BF4^y-&_#Edgp=^tlwM^!FuO{6s*r&5W#xq zf)uRZToA!}=YkZh-&_#Edgp=^tj}B!!FuO{6s+G|5W#xqf&e!ATo5sO=YoLIXD)~U zy>meT=r5i$&|UDDWn46TTmVQB4=#_nfmB}T8Il^FdEtpw{ev?^F1Lo3004Xp~+&(KP+ zUPG&b^)s{*tk=-0V0{d&1nV`lDp)^5E5UjVtqRu9&`PjgLo2{$HMA0=*U$=#euh>8 z^cq?L(9h6HbY4R%(G6^9B}T8IRWT0L(3;icKq28CBtHk0k3zz!jyMM)G6kJo>~v(> zTCdR*lfU93dJzmYiK|{zIU!W~v9-Rj*)1j*Eo?16+ZM0fh6454TDPIqXS1~;e1@%c zn>2PmTPtE_*jl$qWB0SQ5~J7FN{qg?R)Y1~S{1CHt(9QCwpIn}XKN)`udP+V`q)|t z)@y53uzt2yg7w;36|A4Fm0-QLRt4*0Yb98(trcLi+ggdyYik8YKU*sSdTp%$=woXo zIV7)^Q1?w~9AXx8^L&5qDISAG}o?>eSnrSnV6zW7h|xRb07jo72LXDA902GyOiYQ3AxO=KI`1@6&#mv`|WuG zIvI43_~qJ65<)&0pEoU*2!612V#nmZW<>1BbL?Uoa2amP0TgzwneK8W?bN=wbdJZc z)J%)L6Z+t_iLbQo5IQg9o<7ccvX%WON+Qr~IlMbDdaxNG62#RJ}g{5*?iJ7&= zI;&8NltYFx^iA97O!xO~L&4Gg!S0Wp$%9&bjh&R9YClucOMY`cCf@Gk?RMT`xLLj7 z@h^CLLvHcK$xH@=Wj7y+u09OO8{yhqQ@6s^@f;9Vb|28&B5ik)<)2OUeO@c&nYD7H$%#~gT`Qly(X^0;J9mFL%h70{fS|j;ib_xdroI5&kW;|yhbs>~l9Mtk+dd|SKfajorq6H*} zor(sSi<>oM{rPiR)lSA8LSt)@wOneSH>5seNIiIpP37#pq=HT7o@)44m1bzBgUXxF zX5^(Lqq4J?S$d+uWMr8k@#ndAM!r5664~ttUv=BF}48TE*UNkUd)+=ovg!)M^NBoNZ_8=4=G(hD>mH2Eigj@FEAnP&R_w*Y=yk?0k;% zt6UBC`%nle8&W6R*?ZtO-twf}9NcU*6<;n@{tnYKy6jmdJ*U(h>=FeW>@5>_XEQxB zivIA|iqG8(4rVbrzUx5UH2Lu?JGZM%YT1O~Ky&jmO>Q4&daAX?cIPZU7O$~1HkiYg zP|b8lcI$?6nKEGcEX1c#FvC~|O;yyoKIr!_!Y<|l;RWl;Cor>p9G`70k^;aU9R|T5 zX|a5h1_#!pgY0-Hwy{)0CCdnetUnSn7-sLeFh0I6!=*~;E`u}Ff{fcl`RSlsFXR8n zV3X)LSv_~Ltb18E52q#~f9OwT<#eHZMMH{pAvPpo(b{ljDG-njcXwX8Jn}r{(P5Vd zwm_jgilJ7M8!tV{WTQfcM)vv}-)scE+1Q~;0x@*(0keTG8#%Kv-{jxUhFKaFbZ5i* zzDwys%|i_|T&Yvk!V($#*zouBEXUf<)B?&sP_Dcr zS*Qh6K%hmDCnukXa+79Oli2c<-HLI#!|#pL*=VFeIZk)5o6vxRybiAUcB@(!&(n%~ zbf#3C7`r~>poqmK6~^h50wN*I?)k7|BgiNZw{pL{;nqF9pe43wP_nd5$? zmB+%uuAY!_I%Sm9vpFvyoVT7@t;mQ`o>L}9r5o#>Uh+zwr|J$(^J{vgl8#>bIg6mk zlQzpq1;L(mOuN*R_Bfxk$GTQQ`DgP4Q^v7IWN`Z`IS z(%;D$TYXX=>)L}gV4E#x;kn!F51|gS@Vbwuml~)a`i0%KqRp-_&TMVged2}R&PQr< z?hKY02-gyVVf_*ZO|X8Uab{!vA+b>TD9~}U5Y<(d!aK*&OIhgKKXz_SP&L?tC7({MBePSBCaF6g) zKl&59y&Ib_4B&&M0l=P2RT&!JaL_0p42`UI=k#`Bvxo34D2&X-u?`CV{IQ)2G?zaa z=Ri_x(1$1ROd_XxvOwu8E6M^|Vbm+N-FUPiEz+~lRfRkRv$xN3)|{K>f1&9y&$ExD zm$uJ$eq_r8w9mgA=e}v5{ZaEP}J&|Dj#!{dENW=tR>{uKnpm zEia|dV>6RscR(KnmpM3Fs(2rAHsytzv&SpV>z^gP;FL;iA-H?=;> zK@YXQ=Li0^o^nM-sJc%8~q+rJ3-1 zh6!Ig)RBKfP4bBR8>b`xX?={7j1)cg3WI_6WR+>olh-LWk28{{rbi>wPKLq7!*!nm_PFS}tafkzq zrGYuwno8zi4xr^pe2^>2aSl>{SZOm1TF}$R>1aVNyUk!p9d1aiKG@FH#copP_>c-Z zOhounH_J5LP3hqsWqRmD%S$jYLjl8Ffa#|Gi*XX$>M^8l8p=N&){L@<(NJD8&TP_( zW5&Gnm~o)Fjw#w%Bs)uOV%NEeeSV)2JHik<-$5+TO|0i3yGHj;1fb@@FSZEy4#s{g z*1t_cPNm@R?NCF_h=3c7Gh0I$ya+hbw917JVh6a1jo4?zjxxkPKFH45>hHNkz;}%^ zTh4|c0(j60HkhYHz-bs?vRs=<-H3o=3^^kLCON?DjR@dzmlOfT4pP7SuFWtI0Z$s| z-iiRuijmZh4zzQ1p_|m1KBR^q0(8fcEdt)fIEZC>6sa2#@Y;he5%5Rj+2 zP9dYq>(ar1!ViyL= z5m`6^kvR<-F_FK)$fmH$zhl>oHE0>^O!#cmcIP3zYFu_7yFB zv`Jde{tj9%-0#ZQFO74r^JR`?PySFQcy#1?frFOwc)Iki$t~Y;?{r`bN$;B660hC@ zE2nqY$hu? zV7Kuxw!3X9*RSOH+_wghJe%Xyn^Co1$+LMN$%6mzvx)+>1wte@l|Sg+(!uzr$< zV7-zDV6#ddV)RNLVDytb1n8AK0O%)qh|Vi{h;CrXLyTU@qZs#<Xp zCI)nNu3&|&+7>wuYgwHqEx#twcDK7#Q>#fI*0L#HzX>_7sbKwfP7|d$OK~aJu-n{y+dx*|^WCGFo9GO6j-Xjwf<4})G$i5zxiRLExi6YiWb z8u;gKcWB^Xbs)>!yPTa$xtJ_mD^2?LQ!3o`n$$07gye9hcbE1@%AS1lTawC+7VZpv z!;pGy7)bqvx6Qo$k+(na*2&u%-k!$I%JYJLfedtSq z`{(g$AWRR=zm2t!gtH?E5dYw9D{p`1?Iqqe@V1t>=Xv`LZ@=R03EqCf+he?~HsImv)&#fT-jh_@Sc>>`5fFb8#1^*H0qTGfsXAF{r| z@!bLE`i5|eSas~V&F2l*eFRaS{2y=skpUPg1LxB`{B>86e8V`i7KwK`fMbK1YdHWu zSYREbVNVC1V4z$_6kq0T0ig)7n#34G+ptN216fgjY~r0ocl0l=S#&IbCl%I>J&X1u z!~AaoWwML6zZ0)%hRa&DREP|9bE|O*tm*JKkJfEL#Q5UpqMeRtLI+BuP+CHViRxcaI>oCYlgO|o~w;BYbzc? z^@sp;RnG{8k~%YWMyfJ(T54YE)YRP6?9{B(iK!W>>8ayV$EK#Hj!GSoIy^Nwb!h6~ z)TGpbsfj6^f)c{KS8a6j(PsyuJ8?@ieCs3Z4hmlufAiAcZ693`cnjAR`&9%QaJ_(Q z>i!jh<8iHyR|EpX+)$Usui$%OeA?4~6`KpB!8fSb9iBAa-a)pc#8-ADvPWSbwwuUohZbPOjTKFX(m; z)s??=T1DV*xF#Q05opBqdt7Uex3T2p=B3jlt^5~Gs0ehnH7PPaLvUvAD3`pq4k%8huplN<@Ei{M~DJPs9|^x4R^fYcz_C7-JZypHSgiz@Vr??JSSP}RZuHcs|0@vgEH?E7X zF-4S9;`+F2v)gi0v-Iuy|9!Rh9agD3EH+MR#;S1SU)z;)0K;FTLuIJcre znkxbmVikcFTuX4JaCPH)AJ>Pt_TZ9ab4FQzxp>G6=37qR-vWdf<_HzS^Y9Ul7knHU z_PlUA3x~H=1V-U%z;!dO*KzH{mBjULT<0&T2wa5gGF(^U`X#Psa6OCb1zhWJZNl|3 zuJdn0SX`Ikx)RqLxDvSjh3mh#KENe;PM145A~)?SDIrIot)$e1 z!BOw>f|c+58=ZELBhXgTZe;^jzWq00V$RZvKmo3ixQcL%!8HNbBwS^f0*phK1bzjxsCJLbLr@d=W<(v3T}l12KQa_#MNNF@NLmJKj-76X2fM28H7` zT({#|hU*Socj0n36>TGIFhlwC^nC?(&*V(SZh+3W_H+I>0p}iE_u;x9*8{j7#5EX* zUI=!wgM0Eq_5(Y(R6l*F{D+b8@8fzD*JHR=;rcPI{tAO+oOR|c48P3f*T;9&ie`_G zQ1@ZrjzKcM>=U-W>=X8U*$3yLt18b0b7N;!GoY*~M!@-8@GtWheX)(YogL#K1gyou z0pTVyRzbij@4*2WmUE$Fygpn9EHw#yUy`G1jf|CA;U+nnBwo$P`fcLUvW{?}i3Ww+ zlZ`NzzF{CnGsf(foA9|8^I}1J4QXMN*Sdp~2{<%yBt{-)I330!1pPYJTc2?J6QU~b zNtp$NGbF;+i6<nX!^(PBcKLa6uLE}399 z%K+psT+?yQ#dQI$D{{pIE5<>HS&LGy=a`3nT|a3+rB%FCBO z6UIc>nCTz^rema@m0B-uV`B3Lp$bBE)uu%%{fxP}!R^ zy(8Atn-jUGBVM@W>~jK;F8GM(^bNCLh}_%RUbwRhuPn*7{;QmKMC3lgPYq|4^ZYA{ z-r4n`ruornC~H(ZWL>|`2N{}lMpY3FnpeaXPbIupX@{Ki#7FyB6mKA`1qz6_bs83_SHqp5jgSe z=swEAn#8r&5<6I{uRVBY@Neg6*!sTM3n7T@zM5zSgWqKZKgAim%o)5$gI6*5B zGkAqF_;?L|4uem#f_Gix0CN?BCy(8;XHS%{5}%i(f{%(HP#E}`*V3kg7v}Jw zEP$?Ivfp&3*7DbL0;$dJh?tIG#7Pp7n`LUE=QH9(&WI~OJheH>_=$grNAQs%V2IKq z@kjF}0LQxgC%_efQ}&#?E`Kwh0^N9e5>Lp)o^|6kByUWn{QuVS9-x3TE)MM7A>Mz`+R16w0X2S8$pF#rhR zwF4Q7EPa>u#rnSK8tVvX^AGq*f1vQ0>m(U`<>-)jA?r;$hN(C6wQi6tiEZG) zU+rg=B)`wZPzE=J0u85%s0zhyDGM}A7l{VRRTeurvS@VLg+qXm%@k3_YauPmWansa zY}UwzanbXbp(r!dzzns)B+CrZ#K@HD67gE{d@x=fu1Wl7E9D;4hEV%FeEeN9g`DSh z_TtPhmTn;{yuG>yt$7Sne z*lj1+9k1-JFFNW^e*g(O*`NgBUTZq%HJr8{0_$`6MZwO5s-z93~0j@>e?py>k1 zY#85?St+2xD{7GhHy8ZYBq8?A*6oo#Xi1%23UWdFh|G8r>qdzs3e%h5qbpF+s~*A- z6;~;)-MEg&yBBcb&t;ASzq#E1FFR<5WS`)*hgz6v7llSnozb+NtH^3kkk!_Z)eaDu z-EZ4DSliAsD4)pESEazE?eu+L+RiTgpzv!TxcU;0%kq_Q@)ryS1rv2=m@8g&3HTix ztRd1dZZ$DlGzMC3=Z7O=9|jwzX^qBio>tI|$(&Ff(qcmh$IqM=>kR#doywng)Fn>V z1Vn{^0kgDw3};HP%p;+^w!ogpRaTsAIc0 zwg)gD^BUf0&7vMvJK@MIUNxmQvF09v3f4rs3A<`IC1n_$QGPSOC#ijP_!xLiRj=fo zOpMtIBU|m2J@P!IE^&hQj4O}%1GJ)~CM zgD#_|E_wyMo=Se`gx zruK^Hk>^(-#=7#Fa%Q_av~FI>X?R+fFUjF4`4&AW3Cdz8MHcBstTO48`>6G@n>9+q zNy8Q&sV~@rV=RrjC_@{dzJlFhbjdE_-q^{7ji)Dl=JAV@E{QrJC(6ZF`K^A|_rg?FIP zsJ6>Px-@SxDx*UI&rk4Z^mX}+z`u2sJ^W$5$e_{~dN3M`%~=*`$W0|RyS0hWoGH)% zVk&q&u=t>8;8@l+a#IvPXGLFpbY0@P7Y)#c;p-|lNwUN6fW`(!+=N!OE`JU9gn#iu zKD8G1n4V?N^l{3^QYMS|Msq;S9NEBfO%$Iw8;DIG?-X_55BJdY)Kk9!w1F z)jJ`%0+5t{B10CV0HUS1CI0fVFeDlihw!t=GxZ6H8Emg!kFph4d*%9g_4?SXoQ8r} zQ+L6li;($gX>8LIFCS9ag`f?)Hm4gZcwcbF(O->Smw5B%EbG&Ik328reYF%hQ%9-6OrLdun zfo@&mCyS+y0Va0SB`k_UfB^lX+#5b_nqmUuDxl4#6%+bPiO|8XfLGX zgd{+(gE7bW;Kv+u#|zoGOmmRu_!z!f$z0uePSM%1?Y-@VTN#E-cOZIUGRePLDmSrI z+E^+-cu7hn)>IsbETLSE&6VL?!;(a;6`7@Vt-h1eT5Xrs z1^T+Za&^3VHA}0>Dy=!rL`<!i4dt=8>1d-en%@~6bd zP?*Jb^euU%abj#P4IhEV{m_%)ZJ-f_`zXtlh5IOek&#E+D|bm{RMkcAXMx-kV4gy; zrd^Oo6A{{$SuU{*E?b5W|CLmrwip@4(XB&nZF9&od`D|r?3R*qBTJ~p$1AtSZldES zbX0GR-7IbRLsri!R?m|}Qy_92qfdNb=n^hyUGfSz`y&Qg%RrkMXglP(jJfggA_SUW z5bGV^G%m{3tI=Hy)yq)7HKFS9Wh8{EDv0f#w0Kf8hES!rCGIt$EP@5`;Js@x zgpF5ki`P`O*H$Iphm|>T3Uv3>tk$_?uRTz3o5!u>;|E)7qH~zcxqGOJhF~WY4*cNN z+Gq{m&(!zAkta|fbc<~2rW9_%+O6(8!`#567z?M!yhQ5|fJL%h*lfP~(k27;L^i zUdWz-=qy=mioCt@!Fct9wb9!FIi0J-8J~z*RJxH^M-Y8Wx3kAYg%-5e-yg5Mzb5)1 zBZ>|QVU`%B5mRU-0zuUz?(`Hj=^jc*y4vgSiC5kO9j5UteG$7Q9Be!VVDp<#(%!3I znk(X!D{7)oxM)7`v4C~dik231b9}l8ZA#M1d*KllLGn&cHfRHDICf!9;^DP2_-L=( zjIE5d(Y36)DoGL6_|0|EoqTbkzDTTu2(yI9obpT|GDY7><=kNlkTouFygZsOZ!<6V zOR&#~&f&YS>N|%fcdR8rs_0)Q{vpX<6<7s&ZdFb65_+8|Ug5M>7`6?GZfh$KeTE|8 zWR}>hK*Pc4%q^P?A4MN1UV#Q3hta-@nu9A+l^(IvUlcpE*m$79Rrj`6L8CFLhF7FH z8_fqutYEMqSYd?ng7}#Qn0e!@R+>)jB{=Y|2eWG@{l+`Hf)J zqW1b-DI9lFBpt)9+USD}zgWYkAO^y@uD}Ts7$dqwZFCg_*P6h@A9MxYX#($*f!>o0 zTxJ3vIQvMB7!yQ0;1k_M?|f+0lGjTTDKBdll9NOf3+Xw7a9(|A zR(;8$ysA`nYf}+wzqxrh9zeSVozmsZ zUJt@X1IGi$VSmuEqg;62$(!bcg`)4mer3X28h_nb^ts4PVw5 zW|+b8tVk>lO=WaznUxC~=IIOXa5rNtIt;!0H7ufOz!{xGuzB)v7pURyBgAzH;=r#7*_78PFEWrkTOgi6**IzKfH!5kxFbUi)ahHqFwaw`kitS z%Vk<_PsV=Tg-U1yPZ4qAW(hXemRVY*31wW_C3O(9t^>Vh%%8F~oQc z!K4~trYZ(l&WIP)MbD@A?)QndD1{ao%Jl@eh5@#k09b(Rh}%Z5XVps^NhZ{L3FJWp zjILtnJvX-_!;1`jYtk z5PYzq5T?X)==o#uM8o2^ssyt;TGW@&?=F+9_1?rrx()RHit(;5A<0=97Y>u=a&2M zgJM34ELl4E-f1L9yS*18F?I*NSK+~Ix)Sks4XLd9k7Pn*nr6CG%8GV2aHJ}(ix_gT zhNONGYA=*>F~U|wC%V}aEE!9NrU};}Z7r#J2h%!U(kf2g$;_BkrdyI4=Mt)kS5|w$ z%BDDg2yJf_qrcZp&_yYFh`3KjVRP|Bj&?9ghlzr1Fp?(=ANrmx^nY0VEhTF(z2fF) z(JSs`+^ZyR5WQkAo%P095)IFU^K|1ZjF!@QqB_|teiJFI#PtNO=W*$@U^r(HY=q&^ zVyvbLW6*F37~&?}64SpZRRwt)XdE`ZBl#cUgs`XA9u`^JK@aJvb~Hzx z57r0E&kiKj_JCq4?o49WJw2*#r^iED9r5|aorzIcP5_U}ih1z3O-M1F&Ug01Y!j2Z z1RkmDq_~kzacuiArgIhFeohJ*iHwVNF>GZ6-$IMm6b>*cEaF>iA5$baSA}7#+xQlH z1hKfNg?WFFc|Y+g$-AydnE6~q;2d0E#I+dLJ-B|1s{_|xamnI@ITuJlaiP_tOy&tD z(|x5RgE`XiiBVBLhqz<{2(W0S3Y?EE(Zyvgbj{;OuJ9?fqCL$hOMDq^6dv#qvvu>r zco44OBU}%_qW(50SQ?!+ZpIQ%^@g1^94)080?s z06g^&0XPXi3^^9@5Hi-Z_A8O4?_Zt{)~CU`@I%5d`}%? z#qoJmT(XjQkqOSVY9@*!OQ+eHxcyMc>oxdcuoKh47Dtv2w}bsfgMAl2pu7N^nx#nj z5NVU|3?lN=8W{n8Dn+{CvUFK(Dibp2s zl^?~?cKqkGa7yX3Tg&??I@-p3R(xiNkEsc9w80p})W*U`YJv}uw%fHe%s@Mln&3mE z?ffbUJ6RloGsJP2IId8~apLHJBl-5F;yqK|+^!KvOWFx_j1fl{9Le7zEb~4Nue2s6 zM3z3rm)a~IKTI$oLh&13h7(P;}e2BFD zNZ%eudgO0DMA{BDVa4&##S(F{IQFRHFmZeUNAepQc80t;UmY{Wai%&(3!zisNPZDF z7T0ljrTJk05m{Qz_gb)9H6Ls612`|wGv&YsyBuCl$M2T-g?9W~kCbw_96zMA9r3jO zY9dSD0$xMr_M;@&HTaQkrl>aY`fkV8RV<5$?LM<{uJl*f$ZGBHmAO~*RlELA0!1$o z#yT_h6Un=TAk+$c1Fpp+FI`<-;(FthK2DZ)oY`2dP&`|SmGoIS!QSzelKzhwKxf_( z+gOfnslBE+Sw!k2hh5aUN-o)l_Go4J-@T3u>t0>g*V+f7fz@+DV>QxC{*brtGi5{V z9+NUNH?)$QWlHXRrbdMfC3m_>O%m5L20}86+Kb*6QyTrB?Fzl4CAI`G0;Mo*GW5!Z!!n;lT2Pd6A?2GP}FAUh6yH5Ef+CQf*42k9-ulyuDlcFBCKZx z6emB6fXTXaXddu;l!j(+Evm@mJ+M@_Y%15J%?i9%u7bgGZ797^a`_oDEJ{P{|I-)6 zlbbtmI?|?LnpXO&11(odYRL^3f@u1n;-gjPArKgaYKyUqlSp1_QHB5#Zd<5wAmLhw zd>e^wuJC+!FlZ%4DA*1kLh{03_PO$3P&BiNM);~WF;$mes7_gvILJ7KPd?qDxXLuT zL&3!~Tm`~K?q|u#F|P9;vR6DeGf)gHMOSAr^Ud#Tqm$(75(|w}as)BZ`k|bMe4=Er z*hqqO1!gD3Z3Uv4vdL&$))klio(wWj%Z`|q{mKQbVwE0idla-AWn{@wa#G{Ci!K2-S;!(uR;L+~E@F+2Qd6XFad6Zzi zJgQ**c$8qhJgQ)Qc$8qhJgQ**c$8qhJgQ*#8IQiiO&rjY(mYB%)|W>epX`BkRobO? zo>-u(^4Dw>2)e-G`ESsz6-l14wDXh6?F)y46N2AG7T?3Za~ z1Q4~EGi*SjzV&~MmFbCEUc>~S>YV17$rBBlmh*td=(Jz`msW&P1FkeqcL&=zWHmrP zqzwbrUaJ9^BM=4uk600CG3&FtZ0^BnWIr`dA%+1{>+Yd{%Rxsh+#4xvk?MwO`1mjZ z@-T#NIjHJ3TFX9JOxQ+EEa(?!WXV)fL%?v`W~Y0GKT~^QJnnD-5}oJ=J9|&x-UUIg znh3B%bYrw(^^{ot%`Os4&W-^ZSPEgh!aI@gw5sC2bNeud_^`WmM9esSdzZ*}T3zMb zf88N#^lrObN6d`Vw~0~BveK>Zr%1u})LzmG6Tx~<-&U~56z~q~+)j%pP)ru(C9N(Fu#W|U&SqM0BXnW*4bEmIYtwoWm38eioUyiw+r7=9nqu-A z*t#q}y)3EC%iW$LOOCYo^n_Uh@F~}r^uwo#f%p^=GWawx7(PYB3_eW^icg8rdrCYp z`tvEldihkr`tT{idihkr`td2jdihkr`td2jdihkr4v|l%p#?3#m>j1CxcJoinw`z0 zn?ExMCY?r!1ir@dD_1w#@)FjOy7Zw|O)j~S=Fs2s)**&b-k!qE;@VYjIk;9vp4US) zf>eEVjzfbPR5O{xR9ztY>a-)TbPzl-8^LJ*1hZ$k)I;qqL+x+07QcdLb^l-Q^5McBfHf+02L7h9K}#KV#@eJJ4GquB9^f^ zt%MDy$aHEfT`b@bHR;hxmM+zoy2O2N*lLnxb99b&vs-aaM#?l8UBJ|&8>mTCnbah4 z)s2FKwSLY~Zb}v~J);fv?(nu(_esbD*@jLrxy3@QbZ%Ff^dxy>uo_%$=bGF`nVQM% z=S*rwFFxCu_+FUD@|BcQ*(>wd7*hnlJk2hGA3&pm^-D?^dhvb6>F&pe_Kh>ui}lNT z&>F~Cd!-j+XA0#?vTwf43IFc0IRR&gzHXdCY;Vk`X&DAJ+VKCUGN0~m_@j!L4S$^M z0Ev@&k1|eSzP;d&wC#JZ$4xZ!aq{JEOgvcvVae+@e-x!rMwT2y#g2phi;tDAvVZgG z&UpP!XfR&$=}xFySC2(VK{_sg$rXD-oc7bgmM|I7WkJo+^pa=Iv3YdPYd$=>-;o3G=r-)J>xW0T z4aB2}kinzd2F0U@nZcvm2E(Jo=;cvj^yg86_425K_2W^3_425K_2E&1_425K_2W^3 z_425K-FG~iwkw*ClRpkk)0aoHN>M#E5VkNQMK9OXlB;If9QwfD`sdJeSAX5%190fp zc>UIXI24;QvrAD#$ly@y^@Ksiud7GQ3=YLsQhzB*j9v~UMt=?^STBbvSU(OWSTBbv zSRW20STBbvSU(OWSTBbv*r9Uh09}0^c*kw?2tnQTWzwvIv@k=EJ_Ah@=_PYcwAu8% zEeWr~i+5 zn%Nb6wc#j`a2rYfisfJ|F&QK1=uQV?!T7vs*hKNc)`=aHg-}Os-e!K=Q|urEFNeVv zF;{=`)qn1<80~LG4_u5#W)x$gp>ctOMwOF>3?8_+w^5g~V|Zna3!OFr zp9w0ie~?8{#=L#ssgClKi5z~^sPQvafm(w&=dga@tc}XZ+VO^lV<-zVMy~EbMHBUb zJjDa~4QQ@p>Z4D9sqS#z4&m)U+^nHua`RMa+P!cCf`MgS#_849&{fUL>taMw8LkI)u9!ZVn`wpk$` z;ep(wsU`n#9C)h}H)}-y%Rlwk@Nq29phU~z9x`JMnadp%YWIo)KQAN8!HlZ%vQhQhlUJ(X`;LK({aAb=mdp*()HS!i-S}y9dy>iRtxQcOYA}LWJQZ&jtec09 z0Piq@zzT!+_7nyJAtPMOjLc11@BoAY!L;gPo^`=3Sj=g9nZVmz$`dfw=j47QBoQ!a zy!cp+z@>!g2+L*d&lRS>1u2?hFEw@iXR4W^CSts@_z1*Wu&$iZbwLB>ey(FuF!h>w zs4^4r0ntxsN3KcSu|bQA)d_2LlW{tXc$kExUw`Y02UbrH(eg|WMqh!-$YwrKaBFQ9 zI_P0u;*<4?#>ouAC}xdt$nkBi5wj|Lt&{3G_l(8FRyk|26`5j7uaPLj@Pa*Ww$#IS zo{#mBaM%FdUEW((lHbynUX-DkBFzv(Cjh6~>v3 zaYBwynT_zQMZwgIwFCz>2fm$V_%>a*3zc=WT+Lw6$(CW)a`%B1|1r`+oc+(N=~{JP zryeQ=SeIz{gDpnDm|rx`Y^;N=FN0^D$=WK@x%)MgT(VBC=)tP&_Wa&%31FQ!jdKXq zJAej%0IShe!!r$p=ELn8zTQC-qTvh1nXQJ0QU?<<>fl#UELjGh9A?)+_gYsSY&Xtq zbugsnJHb;2GYtL3q;Hzh!9fFU)4{XG@%B$PiEz{h2F1-$!$s}Xb= zXSNCmW>&xejbMKkw5tw|GZ1k0dRoj~btze;pCR)M8#+j`W`sru}sD!aBX;&qz zhHl7Gc>fT3sgm+`hpQoMHO_36(2pd_S_$Jll`z$i{~F1gW)SU%UdAvqD}@6+6#fXU zj~Og>P$(D-g{)(a0}0hNqPp79ctVCFs%m}zc^50)ZJgOyX-Lv^oQIFzhKk2LP9uH8 zM~65Ff{*q$&V9p2%LDa!=jJsN&)K8B z0cBD0Px__;4ssBLG>sT%wh9=`SFEkQq1^c9RO+rWvZ`1|S4 z29T!vA)D?R*baS;C2%Amm{w5YpotnNG|qie17)5X_`IS2V+sgU0}uYz)dcP|&V5k> zm}qy^zz*n=%>Gd#pR@)JbkIWs7-gLMrUr^LYT$AMVU=`s+6Er@jjIjBjdP$Hu;%~< z+Q@yl7JqWKgVmaFAef_SQ45oc+x>_daJ_Gs{JXOC7{+b`x8;&xr9e<|H=3K`iVh z_VLqp^E7iaT&fOf9j}3@Z9XOP;EIvvBocd^gFRD>51G^@!J5R1K@b}pgW&sdLaf|D z?07e^L-!f6QbX*|?DS2}e*ctufi* z36rzbuUt9XW}E}%Y;eR5F~sh05L@gf_LV^p8(c9SWr$635F70#mOBVygUgxGM3TSY z=)x4^qffeu@m}NH`(iYmZnDxr>_j)QDT5$3xMDoc6ysJJu}sc3{?e7R-x}xM=WMbe z_GJgLOWnlI-DkuOGsHeYC!XA`J-IIau?*up&%?6tnoY5}P;1y=jA6VHnl=@V-!QuW zK9X`ocbdm%n&`JOy4e4DtckJzle)3Mf_Pz|1(8MFG4}u6&~i!p6oIaq#o?)+VaP@<4nClEgZX(ztK0+z z(Nhob5_MkIV(rS0*CYIV$k9f8B!lY!q$O<xF=H4F9KxO&XVWQI9P{J?TV#XfN(lpYqIEdKL>nwlN-$uplM)88Lbd?$okqd)pvsb= z?q|suHEP)^WhhZk`rG<;MQ@s;GEWX$AFp4JLicWcTaWB!-THFZ9uNP_{*-BOk88vtMV~(!RtoY98V6!je#i`&f689Ps{~U%hvFf z&>tOq)7yFQM|L_#dFV_vbiPJ9*YkD_Z&&m71>P>@?Lyu@gPVn-vR@RQ#WVvL&kxTi z(?_9UuuT62xtUDJ;7@h>*B;HtuS*lEtBO{m%%P~&Lbw7)o`k4*OIvpuX z2wYv?`RJHg&fmp$p5*5t~Z?nsJKG<=n3FsVcpURq2vu>#&54V2X%i zByR--W9qy2VOM=8jdP&-9-R4Xiq>@U+tB)w_wcq{^gnH8t!}bk-DhNZ#ulvwhmhid zyp4B|9pNVX(LVE2u!_;B+V&aQBMn&`Q4&bv)PO(| zJ6_XdOWb4&_Ziuv4cTV{p!f`Lzr@YT?GL`^VyXL#bMFiJcqN-UGj&F)GId&NUh34; z+|=yUtkj9A8L8>1<5I__rlyWc9g#XbH92)?>fqF*)PbpqDa_V~V7RG`KEn?@Y~lwV zBDwN`hs*eRjk&-7|CoCl_^67jfBYu9fdw|~A_+u@8YLtPjc7^fHKUWyj4pbQJ2P=#R-m5UqI8~ex0Qb3nR2aX48~;ya3vST+6~O_@tjNW5%X=Pbl2dU16O2AJiwf3qGkZw!)1% zQeoT&_c2_(5imZ1TbzYoxcY3gFRp;G6z&Mz1MYzFceuGZ0b>u`g*dBe1Dt;_VBrqI zUF``NEpX=z2`Cn26{h`VyVAUc?woZ0puy>W&ybXVC|-woQ~q4M4)>+}e!Px2F6AGI z*S!3ce-vIv7o_~h<8{o~XS@O9Fx<4PphD#DImL`WrL$kD&8SxIe=kgp0%d4eouoF1Y`| zWuFi*2E%#b8sWYH_f5DlCkBj@;ELfMfqNY82{_M50V5agIJhNn4R8^-f5D~mL@3F! za|K^q?i7K1v++m*27A)OZ9FSfOiP86eLfqH$e!a^LG)i9e)Gv0{WluF1vVayfq!hg zC}1Su{tEYZxPQRC50_q5R2^Z3IhsF5-!~}LGucx~RY3dK)O*f{Am<~vf5ZI;?g(5K z^rV51=p-SP?7-ffB=<+`z*7D1p>lGN@xgFI;D*8F!ujBOV+PUK%go7){xX-ti{C`c z#x)AOf)%zq|CE3iCqBxlpkD0E;-++MI6k6w!1y;V>)-*;E=?NGxeIV<5;1w;ArG{Dj6C3_ zZrV!!zHEtdV<@AB&~mk5bqvNgp|f}N{pPzYiC*VBb9%TwohQ+QN_Xii^^h-%}5=Cce6I)sS;}RnlXBJqPU+uIhkvaZnq{ zO5CM9kr4?Kcdja9M+D-iUh|NF#FduMAMq#3)p!xNl169vBiV`bt;GBhh!vJY;Osnq zbe11yLnW}b0oVL>lT`l~Kx$BviUKh~$O5=~;FiIC8}9pX&%@dOvTT2;@7dXg%jLq; zz`y*#%RjgJ%aK2~TYV&?^~PUAd>Rx#R#@r_-V9rS1z`O$41d}BS3Eg`P|dBYKlS{} z%Ym+}iA~}9t}Nf`rfBZI%W>Igs3?3OYvP{LoxaDKBe}fe+$)*a0ksPZD* z2g(yq$~N$RB6UkJ1ZBnBBGNrCl}Ewj7GGcEN^oOAwmBY2veM($ZSSg3>>o3^MVr&1 zT&JqO;@pl<%)CnWZf~f--Ia;i=7jWU*UEhYm=viUYfefJy2J{?o$FSLz8#^Q@S&1O zK1q(>aOB95bUJaQN_V)v`=t7laYG{yxeuAsnDvowFjLatxgTpm+(c`7L>$S$h((BK zEMVgmGRqk8&Hc8BlO^K%&G^|>R#|~?0J|0pGAjxCi~`-T9l<7X#HI>X_l61l!pO1l z`b!f$yK=Vh`uQV9)~=kbc3fqN#{$o9EqRxM4K40p7bQL)m4~-75K+C!?FBGpmSM$=K*BEw?fQZHJ!X0 za{45a(3p=OIUkt&r^miU#!_BRiRO|ws+n5#u1KG>0EOW_*=R%}vkK#LV7ywt7EnRG zi~4SX^Tu%^zY)!6NVQ&nHdlp2b6Er`(NdLYe7G}}5)GSQ#sq*g81rdZW+;C0L@|*Bd}{6*imr`U-J@0HRJi(HUKWgM9F#zhN272 zWOeLH9WXjA0A~+hr~)WM51{0~I5A*+4EGM)>+rkq`vQK?#qVWsBT#hs8)E%s;RTX1 zB-{F+e_am${}rzrgrLD5l!>0f2=I73RHL-i@1fMsqtxF3I)pa%fSAw&3zN^mU|KJQo#$69+$1XBXzjyAkL2s zA38aLXZ^tf--_GO@kOf+PHbAa>}Qi%ftNpppELoNHlX?Ap^=)yl2&CImLSNrCi#<4 zLDusDsfTV_)2$Ao^5VJ-zCn*E3&k!13N87p7UP4lrflggB7qJHe%%BSe2D*HcU_V6 z{a)M_h9o;e=AA5;Gw%^|ZTxvKUSg=KQe>}Y9o1$7VL!QB!A33E6F`W%!2=|91kE*s z+OMDzrl3AwP~(iRRL!fyp*bDMQCGAab+K{~u9RlHbvj;&#Do1^hx2|9bcr26(G{&k zjL@KJa~osaq3Lm3mU*Z)=-PIp-CxhghK+cblhJQV&fUzpG=I_11e_k8C7j|H=3;y( z)}X({#_S_o3*tXQMt9{f6*uLQECysrB$uhHg!#?Q)<{|sDT3)bnH0MhoDkdfnk1>e z5urO;UE%`0HL)ZY(GTEqZ}bFBZuA7<`cCf>+(+11S{38Sq7xkG{1(=+xOO&oWdjB` z$de5>*GaJ?US?x->4g~8UIb+g?n#Inl`zom%CZzA{hJL5hLV9LDrgEvn>m;*G~1Ax z8Do-p<%V(g zSo?=E+Y&^w)v;gyO`@W^#TW=Fyw^&w&AfWXEUBqvW`S^ z`4-9DBww5GvzrwWZdJZ+Uxo1KV@3>8<$ zTAvd_LDJdb`Zid-2||x zt~eUbT!Tav2f@oV-LT!RLJf9Vrj0Z=u*t>s2|` zv_{G+qX8`W#VWtbND%MdC~7;na6+?yKw}6pF(T!y^?VD(3|nA6@gbxw7&Bxn2ZaGD zYn!_sCwG9w-H|zssERrXi*8(X)2&DqMZyOnca;}j3jW21u<@<$2AfU;Kg0EThHrVH zG(}7!JjJ&N=l@BjE8UT*jVMp?MFJb6RU5-ohWHvFQ(!Ma!jlQj+!doei3HZM^y!P# ztcwQLg(na7H8e?~VL5KmD~B*ZS^lbT`H%TYNOq!In?koXTD3Mjh3XF~gfzKmQfupg z7&*B@QrNevOudPMwXZt1FG2D4faT$ZbB$V@$O^o3quHf_eP}H%W|`-)%!^p&f5A=E zP(`D4`@%0*M(bO{yDERdf%yARGjk}l%HqhZ;y6@y)FIn3M;ow;7Q)vEFnnNb|y-i=yL zIr4_5tu(--Sxo0Prn8XgG|Qza-d#BqL;j(Xp%e60$A0&fZdw*7K()U0Y&U2CS}H9_ zG?)Hm?_fmJ6p{C6{&s#jU>F@oBJ!>;*{#iYq>!ysAUw|i4Zq_KH)Hh5Hm9*-DB7g7 z5Z8yVjBDP&KuKq0csk$x^=Ojig(M5U>evoh_~34C$8d4KP#lc?(DvpL%uudw_9&YkP0_}^%b#J88)kzf|ox6C){-*hL6BzHTIwG$$~*GD*&p$j1rt(hQo@`1uTtrK%mm z5vgiVZ0Ok~u$A;R{toS(y>obhesm5MkHwV!j+SsEzp)nhqwbYZg8fcPce9EsxLLz~^;rbSXg5HFx!selt%5wO= zx$KFSvBJ$pp3G~Qv7lVyg%L+f_+C`(B3wwW0UsdXLIO4r@bol5-}3Qn!$D%QRc^5w zoKiUwA(!I`E$=mw_+I90(;eNPn5UuUi=6*s=(om%-D3un{iB@e7nTH8ATth)(G>UG1{&0b! zh09Zzp-|AJYvR@(dDyCw^Ug!O7j?X)z2#vm@~}N<77_4q1(>*2Qb$|w4L7-xnqwre z8K9BC78b@9QINKPKv&J?DK%T_F?`uFcu7$-u;r}4_Gs1C#=K=nc}vio#FVG$lwXb) zQ3arBpiYTvc+pBold0rev?rxURX~qInN|l~A+J)7KudAAjhZ%Hw_yQe-F7X(oIzVu zIMV1|iTp!}bBD|d;@^IYurBfYSTP#?PuWP!VTub>iqU=>i3@sbBvLJo$;3{uB?ct~ zEsoV<=BXAlWG*D!2PU)OF(0BQCLXoFyE165=C^$c;CfjFq{hlJDmVor3U^)MTLJ$Y zUx0Gn9W>Vw{AmRq|A$BhMh~+9=c%he7a6JQh}Ps`VAL4sfPsfs%F`grE9E&tB!k65 zt3BpsrdK2BdE@Is(wOqoyS#_s_vYa|hmH06VPv9mXzq*SuWVRB1 zh=S)3$eW!89MizO5HMu65xDJUVNBvI$>*uIln-j)gXlOyW{kkkC}3@dw0f+Q(C390 zy0b~M>JU2#{D4jwrhC;T8aLqUZR)FxLNIs3=>^t`ZmAXB&@Nmxo+&lmUo8Z$eLHBW zK(0fkmvKvUimjReE8zkLj!aJ&C@qB+L#$#9UNL_GOdN0(11V8X8CHvP2vo4l?qK|3 z7BjJz=Zn-^89mGq6tbAJ2xb9{;R-`_m{{*syzM|&1 zJN!--^j921;30--g#ML==6J3$E?RMoCw!kf%eVY7D{B84$f>!jlKp&QKq8yHEZ|yD#H+`XX{0dwA+#XoBtRZz@2i86>gKpRd$qq{u9QV$B(r zAo${9l7kr7VQ1Yt~78Fb0SQ)CuKQ^-d!6l;G} z%0-n#N>;)POS0vVZ$)T$dM&DD_9Aq%b`c;^EyS_&CXs;zS{%hznXnUuZy&>-(&3m4 zgKU(z>L?rFc=$fAQ9D9t0f)V%`J4t>>@yEC((Mw7lUO=Zu6dZ>Yt(lOmB+W^!A^V+ znZ_3pdXa<*^GTkU-^QtLRz>n`m`(12gAi<(j%%Tvce`sxBnr(uf_L61JW1r5h4j9w zyq17ZXXI?58a03bEdtBK_ z3P-f65To{LvzCFm79oYf1(?gt6B;3;h%ZpFe>5p9Xvy^_ltj>ckda%z$UOQjrobpv zI}QzEcI^pxx=}4gK^)Ds05vxeex2OS#YvMaS_swPh*>lDGI*IvF8&bfvl!qonYQR; zrdWq#WcB&*C&fKdGQWbFRQ5f9W}! zO{j$$%A(nx^|=JNS_5FenvE-WGH99#QZyg-=s8d{CLBN{Fx={XrCsatwfPYLaaG-D zYS9XHiEXGW@fMA+YTgVi<4}p^-N3Zl=aC;gyET$qVwv_>F((_fXR<1eD9z`0^b%-U zux5BQWBpLaVoSJz!Gxp$Ze-{~Dpcr2tkRs>2WA_P4w@MbLj-*oH z)-a~f&adZKDV%`Ki%cQLuV@W0*WbbHd!In|Z`vo>*YlXjSRveGxDedUaP@GH!uRhCHNT7BQIasj^b z#n-S#)`_%)V`oGHB;yZ=;#+aSA{KWGr)|HzSEg<6!w-T-A>AcY^oy_I30TPBxki%u zA0!12uXXn|ystd@q@y7LPyC(xCHMmQ(xD<=D4uU38}XegI3MpzEe;%*4s~q%x7`Td|2BRbjlQGVwfq2zF5tY_V^}vJ_a+ zA0)3amDl;$Rwpdwi?8AA3lxs$Rb){96JhC$RQ%Dc692nMhG^;#Pcffk5#Nf@Dafg> z2;|F%fP}tuGJ+q5tug6oIR6&KoFayNr1NwO2`EgqDw+N4PUC1kWmPclHiN4 z;S$UP0mlWXCsGo8@ip8FD>lBKDxOoz#dDf?mMhPB;&~UI`1SWn@P+c_$136oNjtYf zLh{9v15bP+V43&P_@qi=jBmw>{HRKzOJ%$bKLool3AV(y;=_eWuq$5`{*1&A!Jb!O zAearRZ^iFYke9wDkbeLqf=8XA%Zx9+hGlh%n)zU`Dv4(#eq$>B)%zs={~{U0Z!SZ$ zhkpei%hM15EIcP8M7YWqU&G1j>v_aS`R0qS;ibD3ta!cxKU=i!se$JY$tTk#UVE5?rdqvT^Set`6q8JZ7# z@ijcG2|eVMx!4r5@P|UA&gxh!Yw9TbC`vYHK03 z@22)E_l2WO<0z&GoW#c%8@AOtWkIB~Gce9oYR>JY#8cq_=Vt2E$T`2-W$F>*0QCKC zEQIOnBuJRSx$`cKu>+%o2Oh8t%Y_obgEOd(S3P|;sZ%O}m!AlDJOJZ)Nobx}g^6#T zRDteKL7#eLN!O93d$k%Nv+dQfuP^2J!;@STHE0|CFoX1WJge2JtM zkJbWdUng&Y5+3mHxWPTkMhvHn?|nW=Olntk334+ZN;Fo-x`6}A9}e6gHNS_!IBj?7 z*2RjN|9lnHXtBHJUn#M}c1KftrF1{dsZ&`!iyD)nR4jYDFe7v2<)UYn=Vhc>i{P(6 zP&DhxyH$H7N6CXK>Tn4PbzUv-$pXxbDqEql8W|ib$z{=!#tga6CG8OLzUre-*T>a& zvDjHrs$;`@rP8dsfinHDa$#zow**0qMd&-B2WLD^ zqZ1i$W8oUNxh}h#$4N}@18;OAi{+rt|i=-s=$dUJs3~RLnl_Wb4)lekoTSvq2 zei0$|$dQw5r>&4!=b;*k*nUo1A+gRwH59R9En<5;Z3VmpvCcy^6tO2*N5f!XY7u+n zyB25l7#TsJIrFIutir!pYH>zigZd9>dmIvrtoPEEXT0JAspT#mMiF3j!tfi`4G7(O zm0tYNm$k$}Qg8aFs$S{!$tI~c|Ev#5g>k*37fJ2tOHvV`hop8Kg`^^W4@vD9h@_HI z=kYJ3w0}t@$xcaCB=;w&B-SaZir9W6mBczFRT0~tq>@;tq$*;MnWX-nTOsVntbYcY zXup!$+vNb1`@Oo^Ps-^>(A|()y!>`_>(lv|%*RAN&cVZKWjFoZCc9EU^z~?io)eiJ z$X#qgzWp)K`tVvl+`M5C(~bZ97eVir#P zl$M+tjMaQ9#bK#KaoDY*ixxx0p$sDwt;M8TonDWf0X^8S0)v2~I2S^pWC1kaDnY8k z^>zd)3BooW#}T9#*$CopqGvG7)dY#wnE5mk60~P2%q5mWp>IBY54s%*Dj`8yG5FzM z(-eazv^TvWJ9@={yB4I;qz0^1^Z!yYfCXL#1NScg(ONP1;BZQ0aa`$Nv{$mkwZI?k zLRVimMe>-Z&m0-h$RoKsETyUAEKr&aQ)gzU&V%VoZy%v}A8&#EKy^K#*u}ll>03_I z7_d~wX29U3^_e%Q&#)A@))-?3H603}b{@5P7>$0$qc#t-yTsDnNuUN6Kk74q!_vxY z1F15THor4iYbB!2G+Tv-=sgZHJS=TJZK(KfZs)zHpa6Oiq&TIOAZCw)3`wanvZAkV zKEPXhv{nLrCV2)NNp>D&s7R(ER#Ye~g-|LK)tNM6od+2zVri=t6^bJrMeGrr9+y<1 zNUZZ9Lq%-gM}2{pAl7-1p(2(xU;H<}!(-vWGMuglbw(3wsWStr#}ouT2GsTVBgLrL+eN5s)nUkDc|xEOH?2KK_8+T z!(@Cfq8jT3ht9SZGpBQ08()OOsZv--Y&wa$RtVHUQP@BRZcM(RZcq(&0x zo4cUK&fTvocEsPfftjJ^P#wGKU`j(#_RoP{lzSQYLF-MFsY&x2jOFOmBynXxbPv>k zc)6lAUdr@DtqaAT{aG;%2yS|Yz{_=Gx`6#nd3Hdlrd($$S7j_Gsuuwr$I&$ zd$b0bJ~R%IjR7tW^R29kni7JV8 zimD>EA5kT-PEl3F_9v<&)+wrr*rOHI%xa>`>J+t=dle|u=WRla2)-*50G0n>T zD`=Y3iQJz{N$TQ1^&_dvp6EkTu^*+a7fEgFOHvV`horV0g`^^W4@qqsh@_HIr=*h7 z{w0+pJ0(?-+@GY9Sf`{aV*8O)66=&yMQnePN@AUos)#*ylA5%sX-T~SifB(s#ipzQ zO&8PNWS@;0sZxv2{cK83U*F%moF+T}H`eqar~9Kd`+Jeo{e8(PBJ_~c{YN3Eh~Gm_ z_YXu)NvTs#NooIbN|K#&sz~lnPD!j&P8G5J$SH|+%Bdo@KRG3_PB~S?9<7}A(fPX| zLFog-=b%xt5j=7ggQ&=dV)wqTgv+KRr;VNZF}_{mKyj5uvDSuSRIezo7q8!Q_^EXK z{!#~ujxVTOOtGQ(`5$}Bg=?TF${Z*f6$-^8QMUtForj$Xx;wIlZQ*8D@=8*fzsPKK zm|=~dv@z*SjUqK(2owRuRn}<58e_@+PJ2_5vD2Hu79*`Od3mnll&?C~m_+tD8xt-^ z?UA*#@pwO3^EmS5IkiM$$!^=3fmTkjm<$k<<@Z?erzHz1@=I`3~T zsTBN3w*ft&Qj8xA!VK_dKHlWxk9a7ugRv`LQ=CfXe7Gc7oo*J3Zkd? zAbOHYFJ6BIgli!lmbK}ht+r};)T=tC_CWO8YgEeDPj`(sLq9ea|W<@Vl_`+kP%01w<15zU@0czSJ-vjccm34+z&qix3VSInzU+lvdqQ{~l<4x_K> zPWF>gD3`23`>^-H5{WB*tJurTz)XFK_S*XfAx5un^)^=c9m7Cd?m(*Kj#G`fOQHHX zYSmCpz*Qh1eg&xz9#+S8|0b=Ff1$m{rjRECPkJFg0Ns&{`0ZyHq`LQj4JQiuLha2| z$h{OquNQJs&h{)l8F>2IN zR1CvW9~>%j=HZIIl{{G=?$`KRuqFQ|vFZ;p6<5_V&g80ZV_egZ=-3 z21xufiC;^9(@Sa6|5NSF#Qt6yq0G{+?{`m1f4#>4a(RmVWxXK8*~$a82k4uxk|@S# z6gS#Xyw#E_VQq52*w2BYkEZk-Qk%BaVJj3uGV(t(7HB!T$A$&f*wo%ka@0$=ma!Uh zqk>(IF3{)~6TPm+UB6DN#&PZKOO8_8uKKCQr#s~6S*VN5{wHO?ujOc=4I!%WE!x|c z963rLvmA|gu%GHG@h>KR&Hk>PsX_+(%B`|q{kLp5HY zy_wjLU2j7j?C)bheIePLrZZAqB?*g2f-Zr7HK*0&_q4aK5*V;vhqDgSD!|X7s}g_r z#i2ag2p&X;Ac=Gnf-s$ zlBG+a&V~M>mjI5!qInQZ*aTNk?{4KgigW42+G_G_udwkTt)MR%?Eyy_w2v z;B3^oNBm7Oswqu>PCBx{0Fb2`$-c@Ar-ut0Z?_?PZ+lwK_G@pZoDH0f7i(mO4cUF^ z$ZqWi*}&O2UL$){tW%1Ox#`G0`Bnd-KQK1x(Ng?08?tpebuIdj^n+~RY`jqC>=zs? zYtf&Wj;y#JWCLg81dVLA4cW`TOcRjjwKtQ13>+CwcoAv*GkXo4v(Kd?o7E4pfwOV4 zMs}AC+2LQLchy)3dQiBilh^pw8LkbYy27Gi1ETid{?y$l|jFV>jl_``iVGGxb$0y|Q{I z6m9hO$z5<$7t${)#ZxP*`%qv#$fr=jdp)47RLAau;>r}cSey$lWA`Le6f5R%S~2w< zT-@fT4#<}MGVj5PY50{s62G68ZCS0(g9$j`p6@)EAlF!m?8pd8uS|bmBgc&`g8Wto z^1kQLhO*Go#$!)I4W%;lw}}$eFL!g&xqFk19P*~^?j$c#+|9h^YnX$zqct`2NR8G^ z-+Z=bA7S4c)K}*^OAC-+a;LhWl{!7UYH45pn0b<5wl27x=d<8AlO2pr)2T^SILd|W zS1P?Yeizfzxjnq~zt1fWE0OAQ3e(edbFEHK_koS}6rL|hiNbj{A~A?OMSG=SlMA+w ze&Z>QnpQRTQ?Fsyiw)x0BwEYIqMxO86t`=yNcX3bk7U*U)bgPhFvKrEH&snu`e{l& z{7E`(8&7wCg$fB0`Vde7J%jbuwSy8&46v$8J8{ zS%772{cSuYrOw@aq_qFtd?eYqn@^G4&u%^v>)g$!i0yATABlDD=2OJ>x0{c|I(PFa zVvlk+Umw;`tk$vWzcxjD585EQKh>J+UETK1MXZZ`Xa@xpNjADk?O={dG5(ziDQO-3 zOz+Z~+>y%bSY=6>9Vx7{ei0w~WNvu;^6|qMtt(h&yISx_%H`K*`MK!akmFtkx%__P0 z2WO<@^vj$3k<+_w>qAcWMyvMrBBy)%l2b(JA*Xu>E~kjzLr(V&NKQ$qQ%*@~|8h!_ zopP#3?nh2ZtW!=EvHi&@iFL}UBDOy{C9zI9Rm2`MIZbX0)J^JD&_4T>(>|J1Uymj= zOQjf}b$UuvTYk{Hs3uRI*mX-EqPja;wYwKl-QAa{B0>*Q-92zoMf4t`x_dyPN=lug zN=o||Rg&x!RYh_?qDo?&qN<4PPgF^)Q&bhP{fR1xb&9GY_9#WQ4+S6x0+c=%@idgm zPa~}u&^sE|t5k~dwZ$oE9rb;iv}QWrqK`TuQ)Ovt#$PeB3%cVM+OTZ-UT;_&OW^y! zB2(*WSXO8(t>aR8ne{2LaN;vvWja}5QA6Nkv(~=cQOrBewiUCC7Xn3CSACVG_~`}d z*a+#ERm!+ti<9)}rj%7kwaI6^!j*JaUsUsI()fl!HrgCxNKrm#?g_z^ga^cfB zuCd{G^~oNb>bdVBBaR9Zn}*{@rzuW#j!os`j!%U{R%WK*_>9J}%7$a;KyYL%jn6o8 z@$RWA7w6b8Z2HasIF%8@Ob3Rr#;|uxicd3pV9*`O#v4gakBu7{kxg|V8>Nw5Z$tLR zT4#1NvWt30mQe;|S|F`_z7Oq@wWZ_uRNfY3Lbv;iN0+w?9C@3nk%eu@{_{kJynX&C zkx^f=uQU7|G*;$plnvRc9>@l|J)~Tv9^XxSpPuMr67#eS%! zJpTD@#R~fztzDbyYo2SSYPaL#nVwd5p3>=MYP&PfbLl!3f0JsCOi*G&wlzTs#S-5z za6Of$He>kX*A0uFpnOF!9t5fJ+~Sh~j*}XxwOVI-;ov|X4{8)?HhhJMBmzdO)_J0w zt4u~X=@Uk1Cu&UJ=(*45bQzzo)G>@avHjaRAC=LQhjbzOZ-7r9PmAb0bL$=*{e5aV zx=?TbmMR4D5OX-!X|J7!!rxvGFzxB*pJqwB{CA3zQEHzyC+nQ8$z+$aGYp-1- zWaOY%hIw4CaDTHD(am1*WB*Bjr1aS8~qhCmQt9)Aa6 z)T#HfT)q$Gf%;Xt@-PbuFf;flHC5qYD3)u>5$5$i`DTjU*79bd=jb;F&C_C-RFKvv z{;KMrXJ+kbAJuYj3bB0&;~mH@^Y%P-CM`SX*)qfVKkdyVJ090gZiP@{&-3MM%*C9f zb-tVu-K9?E{!%g58b`{uRJ&wyjkZIJ%Ge1NIVAIu6IJHk9Er^7)@07(X_6Vx-b|9o z)hnrmTm6gxrZ@y=gvNg@@oT}^_n5*@gbT?vsP))*BBth4)-#waYFi;FTv^P^R z^s?h6V=-U=?EM@vZENf zq1usz07=lr@Zzep+OS1?GZn+pG)fqUIEvwZO+X8DKC2im?ggWLEmhwd(YX!`$7>8< zv|(s_I91TvNP86aE12RPIG%;BNH%`rP32;t4F~GXoTh7)!AM(sTo!UVgIqZrQ71l&Uc zbe;Z3W2&f834Ks!rcw!-+b5z4m4*26xXMF7tf;MUFB! zOXII4eq9ECdnm0!|5WG*!x0;yWC}A>2Wq>52YikKW51E@e%Q-2c_6}QaUn!Kgige42+Gq z1W|G}*@oHdE{$hsWDPcCpL{JXXMfk;OgT#*QT4?}eRxBBv<=xK z>Bt`F2id^csC%~f4_zrX7N;Z2?+4ky*?6{Q<8&Lc=a;9kag+A;#m0fvvvW1F*6dWy zW~C!5?FZSw*@)YHq*C8#L-tlfTF!p2y`Mg3=V@gB%1Y(z&U9oq95ZAbYr%RJkJym8 z(vfwBRYo)AY~XAx)yN8M$R5|JvkygowxS$0W5oRN-f%rQeYPUS2S zNL-qjk+>u=JyDvNlDH^wL1JR!yu`VQvlC|}&Pbe|I5jaYadP6M#0iP9iQ_>P=AT36 zcwVeNjTfu8d{*vfzb^Xj7k=%p2^e37`zu`5XK_V4+-KoF4>uPVj2nZ~|FY7(gR>p} z|HodJ+d)81x_?k~Zors$J+7mNn+{hF_ZhgYaJ}U>J$k>stfS;d4|@B-kTYoOynqq7 zAz*wA_tP(e=r09~!KNmDP@jKU+3CS9ce?**eK~6v1dKy)Q*R9zE8!l7n|WJ`maJ@7 zGEL&jdFJ+jQFuqd*mY;X_{vuU#_@LtjJp>Gj5pw>-5W6G-xn|*xj$e$4)+AyIyfnn zT!dNXkDHufx14e=c5!`%->CUPm04@{h!8UVh3y3a_IJQvT!d zI%e#OH31|4TLI%sa6gB0eLG-W1t$fZtR7i-gIp*5IXj*R7++l*FwXo=z}WxYfU)$c zfN|E-s4CwN7?*4c7*E5!`h$Qm??(aS4{-b7-hh*2vxZxL*?4ieb1ZMazk>iV*aqdn z`;eiw4}2Zwb$m$o=Dz=vfN}LR0pk~NCv3s3@o?|LedebD;|Fk~eiks6!~GNP`kx1k zAH)3zu4*d^9M1i0z_=9d0l2K^Q1Ea&o=4cWfHC$L_=PL{Wx)6@+$q1(c~0`35|N$s z6&6w=P*;*)C;_M|N&hgsp{^wT>cv*>@_~hK{~M9?P$E!Ql71xyEd12pn6amAN8aJi zd;$4|E7^g14ma{eR1CO};p&?L#wT#gnvw6F$Uj`pufZ$0K{$3T0{1Vt8(#_-t#H#{ zM*9IbdRM?`fcppBb-M$`Z{b7^QUvfV%gz<}UGDU78;>MluqQp-#^Y7VME~XCH=mr*f1~kRVB^sk_{UCy!f_$oWVoqt)8HTrv$vXl}#@1^WyS8UaYE@Jm>`` zWlCelcPvK1C2rn&US2sr8UT3m5;v|4DX@%UJYT>&rN(P*;0GWsEVUNA9Qg=S69(st zWUUd2z`6^sweEsM^jLS%lr+A3gD~-hVn>h!3~nk97{rsPWFE3r9>VV|4e!a-)I(42 zCHG!O?s*BOmHUrmc}?>6LgwDX-0Mj%=AKt$VT}u}ImI#_u8#2}4TD~F&H=1uLTB&j z`_1<{XTCG1=fyfFRYva8SL$J;)gR_Zg3h@)F?gvx3SO+XQk1s;hl58C2Q*|L(Zi3s>t)g6w*P}RMxzWXC&|DJk~HSyJz ztFCx6U>qra?0ozrmPD&?-aSW>k*vgB$`cupFrxv#GT}xbi0U;D8Ax1d`TP-oqFjv< zqc#5M41Xj$fuodFV*W^$#Lgr1EPtfZoxsLtZ?$zG+TfCB7bh{FDLyEpDhseo1LBRw|q#|dbN_$zZpIg zkK1iH)3>10e~oNMqLw#j5DH%;Abi-PFQk1r(3Lf@DO}%`SVR~AdBO( zvTX$g-5qf^&U<6Fk!Vdttm&4udsajP5d+;p^C3n&!5%Rt5u^EY-<)miDz97xfc5kE zURJpp?100$*!DMzAZKox({#N zFqh#B6yJg@a}8q7D@z#Ar*48c^76H%(cwaCXz7dNs@r$4Pc-cfp!QK z%55E8;n)bQj9OOT^%oR^Z^arKa%#FJ?pe9=(Ay-TaR+|nKo^$TE$2%z%bV&>iRRt} zf>fLE_EafKscwbgJ!lI(ky(ZD%Pp&r`>h!zZ6{Q=UuOKd{a-C*wWmb$+rU^Q2kUiY zTB8cXzd@tyi3AJd!x=eu4sqz!j$ac%Z@d$fu4h0{FD~S9Ud&uR%TFabTO}Ib4cPQl z$`tT=maOU{iZtw6!m2coFteMdVB-%+DvV*#^6?ZwnYa~jF!|tOX>uZ3?u}NKU{)Kn zqm4xAqEL<6<0!{E$z~n#{Ae!4L8T{#vhVAVg7gr~7B{L87W|jr3K)~%u0*Lk1@|D_ z%kcjbZZq78@K1*OC7dyI=uij-p6V|fKaiE7F6)E-bvyk3SG+kO1e(m?O!RmVFl5LO zihaGOWRZJfQ{tR(y*H~4XK#4E6+ST7wX?a)6?HFPhk{GsQpvQB#sgDvb%Vfh9`;CUXg31z*uw9EitKo<@ z%XAU$DGi4M^oZ1y^cpoBqiVSO^e0H_hW3E*H@H#A_f2qybc5;L%l{Q$76?Jj*aLDE zskWZ{|A$w@kfs`E_Ob22s$sUqRr_&sSoqM%5j^Yn7x-3O3Uwh`wSQvM%4P0%DI3c> z4?;F-5GUK}I@p>we>^l&bC^Az=roXpl3?t;Zqd@@{BN|Y-%;R+TO`qK+YssZOg0>MlZsG}H+b_blI2H`;uS zHPpKnHM9Va*!kZSA&-wiMud1|v?P+h8$IxPJ~nK`!`yP?N%T`x_5v}KKs)%$wAxr83r>s`s9dnucoB`txe%V${})D7{IV*7 zSQq8q{+A886mGaF20I6b4|G*8@Wj4z8u@|#@bX7V4u%Py$PBMEo&sGQid{SU-wX-H ziawONr63!gSm;uT2z3DiCd98hRd}xT#@jx7^{$-lU=#n=^JT*}Ja*-5#`6gNqPcvF zsyV*Cz>T-bTrV)vB8{W-O=n|Y|q1*?Ajr_0_!B%!FYj~p+wi=$Z@Gb2-`Og zpArb$SAv%m2{o;vkODuG4NqHU_!|C))mcc2dRIlNcFVh0-dn=;Ee7O!6c(tM(}3Xa1fY$ zDG;=1n!Hf#%r4z{L49f+RF8ASz{&1N#bfO{C8$}Flg2q&lu;!Ml6xPrva75Ra%aTn zsRj6!hHah|-$fwWG~5C=9bH4A)Q?0^d-=P`5k$a%Hr>CA_Qh7aZij|1`6s zBw#@V5afK%NL?WxeqUF}!0uqI=@LP?ys37kXr^U|9KN^k3J6~b@hv63hluZw zk0^YB7O+z?P_;Xml@=wFky*uYKgU4$7WFka2GT3oQv1~Al@u4=^&)AJpG{e35C!?184q7zBAS-|iAqrR^vMUlXM zv}|a-?2Rib=8z>9{8BZEt*;%B5*xP@f^{Nv7W71|)n*A(YSb74`@>Bb5baNFM`GZT zBe5}QiERT~M`9IBtgN@hSX8!VpG}6Z@h_lE#8Nr{U&HJ4SG7jxG`2@zF2JbF*YEZ-q_|T^lC8L6NF0Ne>!??a`X8Xbyt0pkFFp zB+wMD-)7Y2hwHZ*wLYnBV&b@WE}QyWSWB)!p3Iw=v75iHYumQ)Le$2hXw|l`0$f1A z1_G`k;Kk{HfpGoytU9oKTQmf!$_JrhZ3&s%2|BV_$~I9Lt=Xn&M!9UMHup00gC+@$ zZv*$DfvsrYUAYv1NY!RZbKJ7}rmP}Vw=vP0&Cn{g1kET zn-zi%032530MJy$UvL z>H^U@cthV5gvpcrMs!Ay`@+~whnq@lw6!|qsUCYsTcr{<&Tb_s=->UQDx_xfi>eAC z8DU`KoaS}l7gB^0H-Qi<6+~jQSw`>u;&sQ~MeC>96X^b_8fNJZQo}CX23e%wzSbVi zWz#lp_wqfcVm14TB4`Gg;F+3&s{NuQ?oa$GRmE(njaibGn$)rM)NW#GZ98<6kW9^L zhVrZ?Vj%i0%Zo6?3tSnimu1lq*zSK2KrNj_Ax zaaG;OAG+2qwHr6_7Isi-lUew15ytshb*EsA@2)F+E8u_Q3*8*{nCpnHSfPtgK+*y? z3viyg3MgQas*Y$)UZke8G0=e#(ZoIB>9j-|zSYgZ6m_qJ=AlfJ;xRWfy?rmJ3epBj zk>23CQAjCdwlHj)gn8mk5(bOInSjWt^T5)Kp;%%NWGxan9IZNxK@s5})bJEaP?cSG zzQ9AD^K(vswzyaVhj{u=6;B`*t%`-rHb$*dQ4`llu1~k&IjHd*j8+{CnK1$vY2dRY z>!;d)+cj`I#|dU9f#2WG3|fYKt9vrOi=h1~NSQ~JwVpLX+h<|Hb=7#L)O3H9cOdw7 za0H8tg-kEwu2pdpt-9E(gbNtBBt2pDh?ZuBF%y(VG^E|Y#4#5%E14pgGOQN!NGez+ zOQ4~f#Z2scNz9uR4~{Xy3*9-3CP0#))r9KCp-T>inN4@loWwXaiU1@CwKx7JkS+8T zHOJlIcd}I7@({x`LZ7aoIo_#^|CrD{ zjKsUhRQj|jcJiQF+>OW&S~(?uL^>4USrx_%%;~s=? ziHVokvO%%t45sqD;EM|iQAN7fb6$o3E3gH6&;wBYb0pA}9c(XwW57 zFC0TKAHh&;c3jFul|)Kb!V61WppOMu;;y?|Gj5^Bvv{=mHq&om`mId=e4V})4v%lg zBM0%l+U#Ix-Y=DSYqhJJ-wgFFfk6$5k&FmWuSH9cy{JgB7p62ctRN7Ln0p;!{QehA z#hXBrYZpN>C6D1hQQ=li@oc!0>;sEr8Y8Rr1a$naS{UWK-L*xDv&>>fx>q8(6NTmk zdKYMKt~rU`&nvGb*3+3{cI^m|1*s&!Q~~fPoRIK4mI^0XUqrJm2*1PA)6qdy5`36| z`=fzE49f7mfTMazZ7zckZ)0o}YoQ7ojIcbY5q_3F-X&J-x3Y(*fQD@IPDXoHqM-%% z2N&RuIkb!m`T0qmT1{cJ9F{_a6h=dyYV#omF4KX5!r%f-iRKBB5KdqdsMwb@78xPQ zC!up4BUk9iFlVqcK~GQ%!<8qyb{w8=GTP%orEp=Fi`jw*W-DV2UoJ98aH>gGrt*TO zdp&~x{=8&9{v0Hji8){j2=iMFg8>-y|J@Lm(kjoQlZmws_Z|7cBjzA4WKJOXS_Ph% z9~DbfX^n#Q09KEC&=*ykWrV#`!=f5WVs?Nz1h`TIU}dQqGf7;NL6cNa-`p5UZY%=0 z`5@yM4Vk#Hox$%s*C#hx3G;%6QQV-}D-$;k68!55oZJxD4BY4<>=!j`Z`|-c1%MeE zAe|dU3_48(S==yc$B5)iV%Sg#gTQ$rx$T$=5FiAHCmXeA;wwhn`TUN4236k^GAkHs z-?L-}x^%Rq8yHMTit-$WKBq#hq)KyUADC@GdSuo!eD5Ne^zmTGTfLt1phtp>&JwD5^pS<&NPZVmm77bsY>Yy z$L{}d|JbH*dr?jkxl;-5UVo(*y@R8yeU!=dOAOb8fN2APB(Gd=uX47>z>kuAdEG zF!l!>m^)rzn=IHl0{c@9+aRzTEZCsH!eFP;y+&Y}Z>C!-u=iN7w+SpKbcBY71om?p zcCNr)Zo$qI*l8AQg}`DuS<@kP`PDtOB4GhHmQT{|*@6f!hYx0apt*8{9Ck0t1tIn77Z$a^<+)j+GzM zKoqkOpe_y*0^DFU6?hm>(4%%mKor%H0O|w1*B8BGAHc z#6y+maJ1$yRZ|>(qPSRXP9QmvEhI--z`)z;*d`PxC9kTR7g7s(c7!pFFcuBO!jp&8 zUhYK5p$`!r#EeIH>QJ=ejy%b52i$7s%*m8o+VR_J!5(V3ZFBGvt!aaSio_j$MibX9 z=aF*EVNLQM4?vWqxfH+VBm%#vfwdBH7z>Cz6Zg!=DYMCJ)M9xXiteOZ%1(HSzm{bc zo_bQOQDpMar8VtIt!JdvPd{v;N>c%$P6UtkDrFcSkNL3EW8kr z<@i`$M5JY`gxFYb2T_(maT)3LX?oeGxX`DlbVY1H7n1!0BoRoWp@Q&luxbV?FHn)t zBkIzQp=M*gu*2(Hv0NZKup;DL_e}5)ieLp%Z2pPnpFi9LS@6g2RY{iSvT?1OEhur- z-ehz+$T!|f@P^oxjD3g1_Wuby2zdTf=55Peh*ctOId{sl1kbmdW6QR3%G{s8X>n2; z%O_I=oF?gbnNF4GPcxF~nD%t0sC450!;N}1o>FQ4>#S8`p~=!en)8_6 z>py0$?CH&ul&+CynW8KHb4AxQD`%5K=536jZ%2_Tp)>ZHA`osf$6JmP_k;d{MC?PSTDJG>C@99Ks#W223QF5mj_UT-*- zg=JPm@V(6`DHz7G8fC8G_pi%$)N}~oP!T}Um(c{PB1DJqbD63Zf-fdw)pmr6nh)h* z?bz~H>n_uuMo1npi8SQHH^%M>zmpwq{%XkFNHnJl8n(`qF!XIRf2dlR8h>L&wut2c zSg@sypQL3+wdri*bu8bG5#f)gEM}dKR$>tK2?8Rs3gVkMbEgW3pxNQr5T$!%hnv0{ zG&f8Be160v;IRGNa!Cb0Vs&%R9f@yd-Z1XqUSLLBo z$7~sbDu>HD%)^OdqAhnr5}V&~;T^HOXYE!m!%@~}p|OTl3*Tj!3_Kw8aHIP-SSmoO z*8fnLfOM+5(APsqFad*dhR4%39JPbW(9$- zRltcL(0=2~8f}+-6ocCjtWk^=^BTr1l9=ehVE@p=fLea{X!KUMP3=ldYhKY{@t!mQ z)~V*8s5yp3HkiYO;yX<>hrO8P4yVj=O7|I7cZDQf8CrnK1llkmwDFK+AsD;6lQq(< z8ot8tq0onKj(s(Jpgp{EzG~S*<|4`e_Zgue-okb#UzX99gC3XG_7dbdTW7c1xBP8g z0Odt0wBdIuv=?Hz0!6YNsfuwO$<)DhSe&o;;HJVy6O(WSH5ZN6!Gu>@N@c60l{q|R zNbM|@Ei^Gy0Y@Z#Vy0|I6f2ELO*_`LgeMP$QDzjXr@01sGdD7W_kLB$sxU|ztIw-R zYN|2TN0{QM^&Y1Z48vhA@06`d;*;>s@hAzskjfoCV;hk4mCDhKOw>_;&=oD$iX-d4J zu1=`IJpRqXHJOcr@|5(r!(CY*xvC@F3}vxnK^c`G$(%bJcdH)llyGxU)Fc?7yNT#Z zL4^9$fzMslX5Q2II8{D+;~QDj!U9Z(5YLEevycGC3jlMz4j{4&UhLu)&;$Z?ZnW65 zlt5OqGLc0!831Mlp??1rtEgc1b}wSzh_T_US~V`IjMTJ=N?i$9OfiF@ol3cz&B%`k z3TcoqsFA3}hSKKm#rRSSPcZg{e@MkhoTtj?s=D#g2`Etr#x7RDQd-F3Tqb>?N?L}j z@>r0i4K1_+=+upfmh;tV@C=lK7t}xk;%}xq1eYaYaU``I(I%2 zgNBb0l^<`f9Z*1#5PDJ_oQGia?A?0co+9okmAFOR2AynG_pTY0t;my&AbIsf%IBrh zQ6+b2ZQg<#%{D-rF|y%rU$)AZ^DnZf#>G82Y`UUB4^}r|^$t|+9;8Z5%Vj;TtKMc2(su|zX=w@2y_f2nlG!nLduXWi;hZjxX1#dY)LPY zD@!g|rPYcd65@{JGYO_ziLQi6s4^5hE$~8BIsy;$l@D9TwPLm(#pSBvH0QQ5o=>z2ppS9!G_>+r~YR$pW07g*3t~g>kM7 z2DppuOJVf_tYl9IUXUGoUV$<>Zg0qgI*v58GM+6`hF%YAW+XvOa4dj0aJ+N3IJud$8$M} z7%soDM$#@&OqM!^Ma>UluE~%!nUCYe%meGpBJ%Ia+ex`M4Q@)6XED%VytNx8u!MGn zQduy$7^`oH1e<;yVSU0);G&HZ zbyL;;RWifM*^D9@n^G_?7`%E1V@kB&`yDB*1}2#o(J5Ilj+8W5d^QI25VX>&!g{m} zMbO?AL%Ury1;7AFQC7-FEDALYTNc1@RFs0Ta4UT!WHALD9*h*w_bJjayVqY~P6N}W zvU4S2DCUzk0Vhb;d3WWkf|>;ZHWH_rW$9qC`OF)^u-xe(3v9jB;=njGQ^I|D3s+6)+QG*gwdJ;6+xL-u=4p-Su8E)#?ed0!ss~K*RYvI zRo|6g8^m)|ZC(5&e885L(L^;IFQ@Y*N1G9`6E9d=<7Hol_BmKu_j1f$`I+z2c5$4ywo1u^5w8U^`MoClPlO1iMRVYrUin z6(+gBK+Kh(>u6zTlb7jy8jH?ZZ{QcWR*rbkFYn0} z5M0%p&rmVW@g*_Z6lh5`6f@T9GTI$?5t+4d&B8jf?s#jB%_`rw=YvXVtS z*G+gfWeKLQ@CwBpchAiZu47w*kmy6pIX54Qy{z_X#@R?)k#1OYj*1li_@?@CHu6}o z4J((TU*Pn2Z1s1A*2EY78$Pu3&4(`8TLbZJiPr+3+S7*Wu6C1-HaW>+u4b{XBO5NW zG#$16qr507N$UV8LNAj5b(LllY>vnX8j4_SyStmZh?Kv%k*O7-NMfgdn@r7{_$o|G zqs?cDs)d2AMD@0`j2Oiv)h{JxsrH8rTez#NE+FllKY2kiZ(v}pPSub>Y5<8E!j=OQ zEKvA-FXmMOFNWFO(Xx_+i>a&Xtw(2*Vcci?Yb_^c>u4<}#;!irhkc~Boz#|SYNZWr zj=2>=KLtL9;$tO48_yAKb!?L5N7dj4DcF6ArAs`LzY*#WxF|Wr_C3+wuzioSFDc!s zvamVsQfp+2qzzD`!|~Bs-e|D0G*nr~Wh9_aEhE9NP1&-NrV1FDrJ8w3I((RhUu?gS z;a;b_dtoKp6_6%2Je{4GQH#NJCz}|tC2<}TlYkv$gOq5^8YxksYBG99u#zmFoLuSo zxT@JvTOMYjKA`(54RqG=(iyfV^mSodfX0dSUfm(n|9uO~-@i#LA{v;2sr1H6brrr3 zrcs=?g61EqYcK%BY9A&Yt;86Rr~G%y+YEPUtF&=?yA~Gmgyu%eJmbpI57%BqWU*DE zl(EcsG#`6AOWIJTpfM?JwSy-%#cv{helE03rSiE-Wj5IhFZ-w!WkD(E4&MjU4x_5M zJYeuF`{)|9!s(&IEOvQItGeni;!h)m*QnS?!P>VphK)}$Y{%o8VI88hbR;mLh?w5e zny$L+L{9u_<~A7@<1Mo+8TSDd7gG<$lF{Z`5M*A%z?<-hO}UYxtxOH5FV3rmiLZ@tmA8qbt;35V-$iP|^NP8p9 z2en1Chc29Fz*@40fDaLH4FNB=08xCRj{Sz=O$^`5@UwI{cw6Hy4S8$twq$XhQMW*{ z>y~{_RFtJ8eXzLav_mL@v8V6hgeqrIp#gKb7czNSN$KoWe%LB7M8&p?@)Bg5b&Fdt zR*tuOL@Ful{>TgjaG23u9cvXS_E<$bfi_9>C^~f{%~w^2_cIq#haXu@VJXm!Vfb(m zlx%3{hz*KivWN?G5&IgNKt75YH4Hb4gK1pwZ5o@9oEMMSs2h}s5CZ$1S^CR9mU@6a z9~jwh%$C+MF;~*i5aEwY>Y!GjBIh|{p^N3`Q0!J6k>|suDriyNNFl2yNjh2quvv2=m6&boH84^>Cw?Qi8ZURU z)@m4h4c{ZBY-#WEsS={_7HZR}7_&uSnm=}j4_xBg@xUhZjA)&2M;ws|)*Nf7`4G~Q z4z?D%XPshJdlndAYl7PW3@IIq5;f=<>Tc|sRtO~kJnWdb626*bD#^N6_kz^M>~E``K{#{GGF)=2}~=^>(r<4 z!fUeYtATF*t{KJ1sBZbOgbq56moq4<$rx!3!mD)G!BIEzj@vz_Sjed^pdy~3{E113 zuk5z?4kAZba7_09WA6Rq5DyL*tGaBhZt7E_KNExU6CFPgn?61n+k2;@(*e|b45|>KHjgfN434jZ7l%_8t<;Cwm0guz21%;#tov4 z@Tw1c1B7BR5cViwOxUh{F&!un@v|Xyj>ieV0KGQM>}U`DaPp6ul_j^@R6_XQgYhF) z_0_IqPm0J0UOW?Ctc}EiE2=Pnl`5XvD&Xu8U~jz0I!qF82t~3(*+YUlhcHF~-bVc| zRN2CB=jkDMah*tj}gbL(l%*bRmt8Pa)}VdL4#EVI0rEwImvism4NrO)kN}y(-HN z5NHoh88O!-Hue^hebJI>&Mj~X_${W9R`T6+jen_K8RwIaKH6ai59p7EGFT}lzI$RR6I zHcOxMies(F^Z5yZ>2PDfoKfi6L$?}k2FzS1I}$6qwT2x=@<*JM%h^6c14Fjm2Yiw; znN!&cni)A1k7qyf=lE#O_HpUoQng>?7z^6 zFg3T3|45%7NpI;f^o{3-Jip^9Kek}pp6TcYYTnD^%c949mZv}1cX0!{sEF0QwPt7k-WKY&c(1hF?lVw+ZsV|B^=e}{6qgo#@RfTkyTROi1 zLdFu7YR(bg^ZemAjvf5GKo3z3$#jawKdN~ z{&MR?L|t{x5-3!0TR=i;_>?70=Fgyf<`Iq}%IvQ&D-^u6e}wDpC^Vsi#9699HtLoRgG9zKV~7ahmcX z%F~y}zt-<@oXrV}l1vs|Dz~rWD!S30WtT6A)qbtSHufGN3BOaM+O45*Tf38YG%;O_ zR3zIPZ@FZzRxuBg1C@(ujc1eV6c)-nQ~kjtOOcCJ(nWPvlDC>AjqInT-mU8HR&^Vc z=#9QQ^K&@YOg;M@mRZj|==QTiZp0J@u^fE+S&i*S@&_$oPr6-|C~Hx8L()dYSb87L za;rMmq;yIeayaK>8I4JLHRZKMK#+cYarW$sJ%CVc3^oeZu@WIzFxSY%!zx?ap1NPX zUTDf((p4k*oP!G9LltxEtTf}y8hkRZq_zL9Ex5`W5YK-UljR$Emr9Eyg@cu~XhjRj zb4xEJFc<%cV)|Uh@|;= z{_e7NsGl;{pdZ>UKwFM6df4}*fgy41!|-7(s_A@vT%)K$OE#9~*zJ^>tzTuU;DoA) zz1qxsn2wno;dnfKsQu1tHNom3K(FdLp2-1NW>&00V`oQ=G%W?>u<@W_8qZAR9}%E2 z3oSl1yXaK)w+*#~wf(tXpR!NhvrFfO7-BVsnQW(M(sa51y4hy3aK;!sVZBb!%VHL- z(E)nq5^1x@<)Y<4`G$qn^WJ9!Uo2Ke-;qMGm%3t$Yonk}&VWK-RoABlNJfF#BQ6t= z00{O7tb3e7guaQ_I%f}=R62xV=7|@auj#bZaRpK@*K7DLbY;%Yb8f0X^FaHSB9fg=*$08s!pZqR;p>fFD*gldImjyVZpqP zU8Gx~bhj(rol5s21`=74InBe)Phd#vjRC#yiQKYP!^b|MgEQP{&++CWuP#(bQ$~n#b|cs7SHD-3{Lrqb#mGD&Roat zEE;UnPSz*v@Wh?jv!|0oOY7Pjw$m*9UMI$7*QKkYAkyW(lb<5mZrP1xnv!gEE(-^Z zocXaO?zZLG2h`*G$sWt1)?_8|EW2yOdIyTF)*qYxVVrFR8w7jkWYzF2JB^tq-1rDP zm6`__Lw;`PcX&Bf@ZKqS?^W$Lv4U#wHdC>m5@qbvoXGCf;B?X}LAa{@?viS?F_=X* z!}wg4Jff20-=yT@e91PA$PVu)&hfy^;B?O?IDr5Ra%hBcoPSXnjbu;FR2k2m?OTVJ zAXIZ0V1b_u{EV`25b*Ov(=eVzaIZ|)aIE%LBVSiFp7jWst#(bDOIBR!N;@J2)u|n1zjQY+-I7l8FU&G8nX-aK7Tu|=^w=@Onk&HHj zY^A^qY|IO~)`?$(t%2KICXWt0^8z~nE66`-iEu}N_($-n5+50%HfEoJQw<8E8av+> z6iyHnP8Ae>ewKrRK{9i?%$EPI6!Vp0sZxBunBu^5ObT=XL^sF0f1&~2`5q<@w@fB} zZAM;+S|%&adm@c860&Zy@?fuL4oV!`n!wU@h@0`_`D|o{rJG2{45S&5s0}1sV^-M& zX;T?umYX0ItVxuS-jO)=33&j>CBiZ38pcO=tn zK%!Dwc5!ZT;@Bpw=uJz#3Cn*fC8%`@YMG^;v}LamCXsB4_VuqCk&SpPhv#45&w_p3 z4Aa7#x36D^oT2Q@XT~~>7D42jRpHEgsc<%bf+@a2CnRX;X6f{>UtG4tf~tdZOOgX; z?2{pQYztd9*}G)Jd$=_?f)+9E2R;V93@qhOVIHp&+YwVUk%{WHoR&IO)h|@_|8!E1uamq#HFN5l(bbzQ$8sv+U5&74;yp}t)+RR#l@C|td1&WVKtPxA5npq zslcmL;51*LWkUy&Y{OKX*;CuT{5`?bO(v0OFqnIYQvXP z|60CRtT?#a`8pRt9rE)TMrT?}gMH(1vsOJeDXZ;z)1AYFQ&RU9qE54@!g`!K*c$xu z1@ZHU0sH%B0Sqi@ zQh>=K_z$)<_V1b8vr#3m02!tmkq$KsjBPMIKKQVAf$RxXan!jT_--5N_~+Y>>!D=5-8reoWX6CY$LVu>#Fuy0dDtLx3GL ziT?eZIKmp!XKjt?Njv~7xaT=3=Y^HTTW$E^5x}5%Q8fO5(6p65!JH+IX#T!HCIu9; zzX2K+nb;tOPqd}#zZH_o@z<4+%KSpqVHQ;=heb^|fmaFc4az9yoI))Enx=XV)2@wP=7>|<@{6!+~GTp4#i+v^IDIV4i<_q+ut6egCQe}Q^| zm4<|4;Eezv=}w8!+MiaI()eoCGtTAU8+EV6(G9!zcQglYB2KCc*Pnjbedj+xIrEz8 z(jN*(GyINT)|+Z32+L;`WvI1)fb-HqDNM!TfRsHaWGi#&`tOT>_jcX?r?2+5++U!o z(8i;+u!_O~O|F^F)!i|b(N3cjbK1teuTb4y3&+4G_v^OQ%0k2=E~01|k*AUE9h6$m zWaY*6cW9=%UD@vBPmo&Vc!(vjX=&l4Vi{UtVAH|5Y0j_F{*80xn!uuwiGlM}(xWPA zr%F0HQWCS<;&}gVWMgXPK^41xNEL(p34XZH8q1oUlJ?EfSGZ>9%rd$TVMysmmA*d^zhsSX`SjpdgPwPq zP{TF?ZS`f2sh>H-MBwhZxMIuVx-r&9Mz7ei@NizZu42ogBrk04-LiOc7?lX4CWTS) zFsf2fP60G;*^c3!uHkpU8gIJVztpZ=eWccuhW{QY-1K(;QoHgaXa{giI}~1%TW9Sp zZ=WSWc33A_2Up0h*}Iw_5}hosLIhzlOW3WwB~eWI{f}D85As9w6RP^1{-t*1i8HK{ zlTRbq?@(zA`sj3Zr-sEGk0IQMOay@8LbK#2%#lUF@Sb_2d(AvweD?dZ3AJK`!Z z+p6qB{)cC~>?c`!$i6rU6-m+&%G4X-mP5VXJyH{kb*ngVZ2YJ__50b)BALIs{cscZ)u&0PcZ_tg&6LYn zT1MRF6Sb>*Z(sMLRjy64Tp2_@;0u3$r0`?L7e4t_70&2#MC}Xz%So=~qbC$wzKLl< z<1o^46iErY2WfeAS>bp3!oM6T{G;Ow*LK{47e1-1@b~z_6(r-drsFTh6XzV8PqrOa4=W6`BSNOP+-wyFRywkEMrKJ)y0PW>cJWdXvy? z*W7^aHV%%^An5*0U-wU#szgbWO^kv+?yFv|s;%(W;O)LHkruPkv5}T|(sEq0K6kd- zFR?BXSH})Zh&0^|@9)7AJLl#H#=}Yak^6Py4DnRka^M^LGlY93w&rz+Ylqsn`3DD+0WKf3ceY{6G9>WJHtzyzW&3{E#w$-{h;lQB`|@H~YGx zbY**Dh0RJ~(_i8wY>IBdW@gWjUDM&PDgNV8W5O>P7auMPoKvJg`P`MV;l?ts{I{pW zJu{17`Gy?>?Ycg$idVdlc__1uz3UF9~<)iO^jb-ra$3>8Lxr7A#X2`kXeP*gB;C|O{KkwIJlc2dChcSZ@=2u$JJ^X`$J zhhwomKlc;{&>6mE-#)g8&uiWB>uxA}K2fORK=@>>;+63kFXJe%9^)vQn`Vc=_8es+ zV@d?xs8)H7vir|P0{^QpiC@$!W3o;$U-dD~Yo$yab}q=LLx{U)s7AXJzvr^0>kXF+x2 zF~uIN8DBwhT0U40W|Z|{2@{(t_;93x6Ax6uL3+RqXQe#%9li&#NCjKnj(Eq6oETp0 z0XM^y3{;H59tS2(#gM;CnEEVV!Ix(gLG;n_6%;waK`Q7jui#-%+3$)}FzG-Q#LEbj zxyv{~t*y10wD0Msm%$?F{~9B6$Yj3hjX)9lDGEjhf&S!j=>HcyUlrUOso?AbRd5jC zEG!4kw|oW1L@F3Cz4;YHyH^Iz!ZO5O#h_B#Hy>RD&TZq1e)Xewc3A~WecLaORB-b6 z3W}t85a=IX4*k=aJJf@Cq=HA?uJ$PH7fJJ#=a7P6I?)`$t&1gd2#ej}9D@4891@!w zvUyp=5W-q~%a*?Z*czp^1#kB)`>SPwg1|A6Ou!w6B{Bg{C!tJ$ZnX`~OzKipHm&l5 z;<4$p&CewNJoJB@NeY7RL^8oah+U4QC9I~;Q{<^?nU@Jh&AqFH*k27kwW4L5U?P0R z%fx935E7^N)Mg&Ov<#DHGw?)XcfP)e$&_!?gqS>#tX@-A_!3|Edm@D&7AYKAef0O^ zF=JTsvU>bg%IcDPqO5TnV@CbjdQ=hCYkgf2)>s_<2hw&mAfkm|=?njOr0_Z83onlR z0~L;gYf0g?zVO2%g+KK>2c<~Mi%k7Mh1Zo8{vQljf#u&{R|L!T;|nj6;DHLq)wZPN z9lr2oR=6qRm_<&6D6mOQQiVo_((0x-O7RAf=|1D@mC-r4U=Y!A4F-|8g-H~yON-bRuf$Q07Ot=lmPGRl6_;WK_y8O>r4FE&*5h2y3B;kBg=^%<{LM$cQ$ z7%WmSYS=9Q89|kthZuiO?>#)Ch8>*oE_Brwg!dhuIQ}qAT^3Vn3%;Ls4N!X+QQz>N z#$cR^g|ebJr~OWjjHrXmNK*ufDB*w2BkF2Z?>X2RzCN`Elf$e?YrF=`(vjkFW^zbI zG+^$>En)5?44FI13(P%MxF6T630=Mcf0$ZC!1vvnlml{m@D2YNK|qNf95p<=GNWm^b9zpDZ%H2>_?pBDttXyaH_5|~4%k3*G_p0&bmcW5CJqiYx z1GRU1S-Fj_+<{Lv6iM*3ff5pYv;T~cAgWN21P_mp;K4Kw76VI2@JZ$p4f+>xmMb4Mh^193jDj$`|$GNKyIXE=LCgpHu^^iq_yXU!#rl_TbHt z_ITS@2}+}&Kd1t~kON^#EMV9B2K)|Nyragp;Ja=G(gB$*R{k@BfD#K>ln1=BM7_HV z^hY!5MX9e;YSgY~r5fvZ#$&I_8fa5&PidxV#s8d==+MsyI4Q1!Pp~KmP{fct-g+PWtMf#?Tm&(U)1k3>V2D zqqY7s0@MGyXx3LSmwVA{4;)+|K3@&6Dq4f1eT|-sY9sCOWb}U@$8Rdf@nqkCpJ@rz zlhGG<7jX;%Zu6fJ1eA>9=nQtSaV)JmDjV;Ce_Q`my;aa29PR7#jI=h=8qY{s<0uLy z(dD>A_BhnE7yOIfZP11L1zLPHae3Xbdb#~M?e-1E(k1B13Utz z`x-?MAfP7Fo{1RgUx9#ySd0$u|GE-XX9JH!5~0e%Eb z_ceM1)I{3znn%F#%ffl4Wkhw%Cf0jX~o4bVuMhdEFHzN= z>W}wzd8(flY01H;{y+v7?z$^sIeQss>h-S=DFXbPKQE#9JN)OXq4)y*m#6h(A}u)>tse;B)5-w;dxn>K{X3bIJix#EYzdYBoBw<@RDK|UHMrSPN50N&-R zUZJWzz?b;CJcYj_(vsIg;oM4FLgAIZ>IzluS<1GZB^3Sx|M^-eob4hgQQhvcMY)P;l;E(yw*Gl0t$^iZa#Wl*WtcjG4+ z0{lu}mk0OI-bXPW-Vxrt>*a+&*FDA$G*&S)Vqo2sauGLE6=1w z&9SfW%wOCbdy41E_cX_1OPXUJ=Gn+|Y*TaW3OsaU)22kCz&+E=VoFjBRr>E*c|&7&nfS3j(vycln?OB zGy9^j?*&L#@>UhEE_~|+w3hr!2)U7elMjo0@R|&f?t>4nEsci^O8!j|vi(2dykY9> zi<@Kr&NKUi&9QIt9DfN&=b8Q?I?glY(&kt%PvXPPu?)}4JlFqSb8MLBQy*!Ly})z% zWzDhOJQrOKCG*UNYK?Luh^_?25yVb4%nF_UUxMF5Cx>5Cryj;@Qt0&m4(GSFF8rE0 zRVbcPj>xG~i>P!-8{FPk6ngGzU<)G`hI3$-%t?uPPjs=V!v|cEZN-Z2&64kad93@f zzK}nL7umH3Yv51tDZfpJEw!&u?A%u@7T1mL3Iqtpd5b0EL2e~m%kb_?hTfW7F;L>I zDQ64$-umsD6EI!BbASd%WKbzoxCM3SvPNE*X%;T71>2amptb} zflHns=UmNaF;S`jySR@TO^&1Uwsy@e1YD6ld%Wjp!I4ANw!-(@g4IlWDk#K?+=Rm)d=lD{|obBYNVwaGh zUKPz8h!hu&@8;NFTsIFy2M43@?(xOm^D2uyAce;!qVRM779}s7sN~_%C@3<6^BEMj zEstx;9)*-dqYQseJ#^HigYr7I=i=+`|Mq*?wz4(TwOyO1Uj|dD8Jgf{Yl8oh*$|Sw z9XrXt-I3=HjLwr=ns$IxJ8EQyom8T_1+({^X7&sM2h zesxQ#&r_K{KYwDbW`#mrRh9WA>#r)-Q<;B9p2Mymjd2{XwqD60ZLr;Kz0%E^(^5yF zKc(giy5|VG3(ZzxmutR@zJ4z9{OXgCT^U{U}n>tO1n~} zo$#L~jM-TLIu!Z$>NH20h~XCxgE^%3mLDmiX_T|{>OPGSW)d}9i8(Q`^Ve5?IuE7|6DmoWS)DY z${A9qy9T|!KbV@?t@Z+Qn%gwL=&I(}1w2>rWO=^K^Ie`tc%I{NK;*at?P~j+%D7u)1CmWV7ztJYa-ge{RrZj*w2Ct>Cm9+jN;dBL6lnNpSl; z+v>8g>pIufY->F4u-K>ScBs0)^VPx9{(=B4=6C+~X(By}cc zJ+b;660qjKU=D2 zD~6nFTIyEUoWzGN%}Ae_Suo?JbLjI)xrXVyaA*Lul?hPxI7ec1UX5a}uGK*1ibZX1 z7^}G7IKXNi02M`B)Hpi{KIGmTfj**KVm+ zjM@@hFoy`P?cgl^`YqMgc!DL2j5Wk6TVfKl9C`#ldc_qY*ILRht?BQZ9GK)X>e zk>6cNt1LF&7R1y!UE*Rd&};t4j0M(rab=4FStX36#79!y+(x>*a(R5cf?I<}%nhOb zuKS#lMW*|zw zYEW(2_?rCAVg|5cSJv3EOiM`BzaIdMX7;?1bE_`>4Q-sieT)OBCXCR*^h7*Yy`^V} zI+zW|^52R8*TE}DL724)iQNky%8l*Y zDC~FEuc=&2Ap?uZuzTM|ag)w_uHa(OjVk*|LLXMy+bFv~(_fjt)wRU^?Oi-}(L=p= z&m>c<_p+HBQYM~oUT&v$DlZG$*?Hue$&2Sc)A_{8ZJlkt>AyQ{=LNZk`hQ(_{$V?F zlYcz+^2;~o`g8l{JW@4OwLkNRvCPoeoX6*ErsX})#VRU#($kOAPv=kdQ;|;eJWrL~ z=}nh>=ps6mTRb{pK+rCNCK0qF|Ie3v$hCO!%jA2g zcky4`&!~RXBk1*l^Us5G|N8jcGr6t=4eI;jxA#3$^+@jJTsrxue_PW$HfP%zXO3ML z?~I>y7N@QBUv$ZbwuQsP@t5e<^8nL4qpr>)kn%HwGZ-z5Y<~a;B(dg*)waOzX=}k? z|9fKdNM1Yvwt2@CQ0qt5d5` zYbsaU=1n`JKG+6Os><)xF;Y~`v?a@j6B7t5;6A65Gx*Ou;|rK{}9^4q08YzMEa z=tTOcn|Y&M_M^+7wNjt0MBX@8av@A4J=Ya8Th~C`Y7kZKLunmhpa<}v4cxaJxRg4`G%KRdGw}KO z9L#fWfy2l2l)L7}!@fNjTjERHok!kv_2g=-KrWiEU(~Zl8Mrz!)3rO+*`S`a25VZB zDV_=5$)RoB%J4xBUgHSVt1I*8=?1ljIi!iDykX8{yP9>i;dw1X>FHtDPVX4Jj#*&1 z_B$PQRUL!6%N32aK1sXB<8$E8Xn_FHNh~UR5629-YnnRU_3I%C=0DAW4w>iJu?^Uj zP!|<{kdiaIIY>bFTMYxk?&~-~gJfKslwL>>?CYj$-?^oFaMwApHxVD^6yg;*2B8*; zaKzp%WLrkfd(aQ(AE7NWQ~Ih18Q%9ymQ!aqfXeB0nyq!>ggeS1_>Q<#)rSR6E-=*#C)n~SMH--8v!D+LtC7Hg% zG9&Y^JuS@fMi-oOX_r+zo?WM0%d6I}reUovye&v9Q0`>TA`8v^J6Bz<=2p_S^{!JV z+Jkd^gI8L^T*v16lsfzJ-naUeB-E0Vm%mNIc?f~W5kgc^jjAscxqq2L6Zs>hz=R;& z>jHBPs=ZLaV=gqcA_Br6xUl7u!zP~Sn$Wwl+L|X!2A4C1s^(IR+~kY9GE&^fU07Jy zu2ZZ(xgpqEYw(!+>b-T+2I#wI|8y{a?U`ZP4KB9&KZ*OkqGoMvlhzk@e|!5x-G9k| zV%<*^y8jy&Sk_(#zeH*jkthVz4<}6dRTr9iAd>R4K5WX23Qi|cgvY7m34oJbwNpds zNBUcpK4SUQ;C%>Ju%_iz!Os|@E+(F?dNg0>-m7)dO|YL~@S#gCa&n8!X9*2Hok4eW zD!vElEw+44Y6KW_L*yMFP?7bzEw1_%Zm<#wEP zsju@Q%54kYZ}Xn15<1ZJUoUk%L^{wejW2x2K3Da1>B1}H+A}GILo;KYuh*rYI##MJ zxcf*YW4<5RvY5>#0!P?N08{L1p?|*3%N#wtBXy2z^Q{*~+uR4!i_*hfm-@6Y^(Es{ zm(jyJ!<46%r1Y?07H9f`dS<$E=Z2{#jZ6Jx@Fw5_RppLLHLRhzWBe z`R_?V1r_bV$xfwfC2MQYYM7;coOQ$G%Jv>k_!_Cw(Hcq24tyQq6wBilLeb3YNBjF6 z!|Tb4Q*r{Ug)RX*t_M_;lI!5OG7+)u+(R}vplPC4Z=k^dg!RDd@)_&~-w@&Y0sSz^2S z@>(a%Hpf|Bob#K=-^~FV=ScUA`G}&Jx~+_UdgZZ?Wg~b`Ea~Ev%Kd?Y~jj zGTxMf_-C_k1zF^?z8 z$eNDf)szSNLZ-(psCLcXM>T17jBI9^scEPyv`-p$>!5r-!D~6s?7+R zJ5;x3X}tTnzo4nD7Lb@ilReLM(>)F&WyhHnieXQMI#v!VdGaHwGFjFo`m=m2wVKAK zW{k1|FL5B&dRg{3{bn`|(bMeZ!C1rXXb^Xepop#4AMEpniM!&WrWyq~GeWi|rjQ2x z?cbBAYEXh~!)P&M-Em{6%T^Rd&X!Lb9GFBWbKcwIR%d8F3%cjV&|TK5=6kV}1y@~3 z#-$V(oc~dVSH%_lIf-45xte;_Qq#!aT!Y@**C+YgnyX3h(-thc#jNir-#JbI4(2Kk zRKm%C=+3;s4|cZ&>kUAOhjNz(oB`b)yiLhkhAyK|{PS=V{!I<6#BlbjYeccg@yB;s zH&QYLj5XYYiUD$MES9AIPMH4BypY1DmkBf+xTLr9AD36G-~CH0osNOfgmDfml;Q@?v4<(iQMZAz`EUon+E)k(E zEH7C5($*cYs8jeW^ACpH#paK&J_ItrnnGnxe~+!-AmHuR5uUSy_ti-_ zNFS40@oUNPDcxFZ0kUSh~iDCh{!Y?gS(u zs@0Ktz-WJEXML{0x@aa4jcEEL0ets$ZkC*x8QFd9NdjwX(D7eGSMZ-^)(MMOGk#9- zy8IGM+L+3W#5)&)nu<>D9F5d?5@A)H$EWVsAdfV;BKXj_GM|N*zW} zyx8{zs?h)~xx&3*z2O#7^cT9K?ncy?EsLF&W6I3~KiKuMI5!7{a|)J%>Z`&GjmkQ3 zr#>4lWYkuX$X?c8sxPj$)Nigvf9KU)#@}mEzx9=E&{t-`#r%zR)~werwPcsZ?MUKm z!!iXhaB38zdoo71EOzP@fy_j@R)mpNpIyvu)ne-aVwT<8iW(yhiP^TMMlsUUiR?Y6Zbn;hf{P`neNNw<4-yR}a;7O!H9kt^%qU~c zHo!F=!vW+6Ec=jOi5vLwgsPdW{f=zFbf}TGgomnPPKvcI-Hx_PH5%29kj*fl~wbVsR>Q!bBqao*HC zjGv|XgKF1{fv3S^rVCZ_4aSqEIX1|`__Ashj?_MIA4y8M%6^u`qg+MzhK5|F>IU%lJyY_=?9tYGkjOBQ&660i#juC&DkpS9XvjI!I%| z4=i0c@YN*om0vP&=0 zrOFAp#OdRTd)B!AAK>OpVg|}?t3UP02q-HpTgafru(pZ01T*aDw~@^C^;K#3-=O1v zgR#zcL5e*$B*i2+vKIRMOk=F`nABWX^k*VPe{HF14vQ8@Hsvofu}7ze5;s!G?J~t) zR;Z#n3XoEpvm-{uraTnp^;65JvGUYSky;j&)S?db8>yjf;dwL@yd%i1Fad^rK+P)42$Z}D@Q35P&&e)>~tZ%Lw~NyLpV@B-<7?u83h(&sbq){FnmT3mOReseX( z4dF%hqG&NaMHd-jm7?v_IO06xh}TZGly`|cqVT|POy*{+C+97$yLP6j@5x#0Q&#m{N2A@#fk-`+U5XQhD#|Xd z6U@?YwZBTn9oc|;s{{9UBjA40)}KP83f%tJYp@B4#fjl93*Cf-{%LazeVu4F zF#i76^IvAaQvPY<_p>i)CK%6u#jcUnoc}?@^`S5yA+41#)O#kCGSo`?5;D}$CFMhP zyRr1@fq#J?IT1@7%$-oPyei5*XQdWCU(OBhwem{1;Xn%|X>tudge+Uek?JFDxvHcs z;)~k=L}tK^3x8UkxJO*~Y;bc*y+kQHgf3(&oo{gwRS;PtjYB9sDpJGYB{hhKzgC1) z?W+HVdY8uw5&{d2)7yh*$&X$}Yu*Fa5d$>Ta&3(gF7T0ZoSNIL`WS`nslneArjUx@ z%kNRv8IdXEN73TZHz}%jS;Y*-^Iugm z)zolw8_PDx)`^o!YWfk~LsCIe-EaHnoVk3#Rmv70ST3p4P*Rz$k&G*jo@6M3cp(ml z5ioM8t9O2+-WB8OeT*DsEYt*YEj!k(+Ubgv8;m4WbVQXO=i=!6yK*(gVOmD1YN@O0 zy^*SpD5*-wf6P!A&sshT%G_WqMtGHZFIR~d*8;~L5V|OJwkx$GQtA&EMFCeRHR1V$ zS~md<-M&Bv!~LH$7~)(g!MvUhI-u2+z&*1OD!I`%@kMO}(iacH58Qe~km=)+17`){D^-^6W z7GsR7(Ywf~C?B`Me~m+5WiqZ*<&Xaj_}Eya<<0Mo;>d%7_DCTrotLb=(xk)o>V15B zS^ANj$8rZ^mpKg7(dyxG-FT~)kpo{+T~nQRf_gY&GQb7)*`V{k;|$BNd}#m0HP ze*Uj!N(-5wpuCydC@hv=OG8SV>+B7U#Tl#uGM#J}BMr=88VT;e#^i*#vD%fDv>CDP z<=T}p&Lb4y0K@fAnT?aUXO2aas@hw=rHG~gXV$zl1@Y6+5EYwCF9a{m!uP9o<+lG9GC9Gl5|$Dhv2}W3}lZx z6NQl75n)(O#Byc|WbMl50TRYlhh8j^e#Xk|k8`)V7Wx>7_-RCADs>l~Vyee zEXT5jY@LI3v~+nq6hB#<=rey_48yhT{9b-X{Eq#TAAu#>K8-XK} zq=qB?ag*fxB88)W*i_8Isixw=)>LFtj0H1G3Kwj{!d=f|=~io4UE7)lO>JtX3JmgE z6SwL9t>Q))0aAOTvpGm|zIWJsmx~}`WwT|v@iWcP7 zuS&XaS#%Md@7rKo>T}U7@3XqYEUKGM*-#ot$k(SZn!f%8ZmQsUKhG&V&K9Y^#t$@~ zn$0LNraS21VhV|Hg$dGUc55hBhVvn+3WR2Jq_aA5(XzxMJJ5(x`BGf&ud*bVA!Q84 zfy>8ZA)72zp!P`M1YX|YiPx|5hB?Npep4iUik*%%e9nbyom$i^8nn(w8%}xHD@}xz zu2(}syme<7X9ByutR6V*D)vQ6$t+lk1-~kNnPbsy!J6gbty(UZF|`v#DUo?WWQ=#f zV-}Yf_@20mH>=0GnM=2IdM0&;VqA{pvGsE)nugy=!v}6IR92b(i0WKy)PlhD63>b}}oC zAr*-GL%wdsv_M++V)TBe{CNF*t#=hsoUfgHWF#{yH8PI-KKo9gCLHj_%?BE&8Q_Ep zqNhW<1<$*1c8ykdX%9QJuw}^_GoGqeF7sW|!$c1C{?zB@wk_a4qWhOT$NsWRX{B;Uib^ky3#cAc8|M|fCv;wEj%W#oxI|<@(Mv&~%*=4i2w|6>!7sHZ`bz4w0N77jO zl+=u%d`|x8xLUD$j|@BtT#BF;WAR%ts%v|@4Q5y>>DVZay18X*8)q%M&8P)HsN0Zg zBsNa0)-MI7Wj!YDGhkM%ZH%RB9NxI+5q01=;{tEwZ)JLl{XNo)(vpy1K}LlGpD>_c z^We6}lV&YGNyRS0_6I>Hb7#+hEV(7-~z4(dbg%0`3*dW^ZGcBOPP#TFTM6?Yl}j*zHeX}T*TGP=32 z%I1m8b9GFo)dQO}2&6Q@y|02|P(#Sha@YxGxRA#D7At{mN^yEoAga};MmwOnc_$lW zRF};cT!`788i6PZ87{C4QB&*_*7nBs)KE0tTT2SoP~BPD$2d2=s*(P_*82Vtx7-;{ zQ>h1{#qFM>c1EY$jhO}FA9llZSd3&Gcq_r0;hakMJk%()c)h67SYkzbf%Q=CL^dO) zZjV-#wyMG&YG!|ehPDP@bOq({uC5EFZ9Afx?$wNaFKdRtaHcCFmJ`u7_qq`F0seGGS=>lcK@N->V7ylG}azuFAKTaPHIoBh^G9!r3~BdMTX{C{ z9Q(u?Hmj{^u2_9$#hT_yid}tXWoC0#W{Va6Xrb`lvx;dgRYhiVWoApIn(%LhRBK&% z&7?R}F}D_C$p2OvF`cKLC&?4%8Kn)wJcB&BCAaO(F8PPO{0966{0{Ov$nOxpL;Mc& zJIwD0za#vP@;lla@1@%@_SKApkQh^kTX`<#xr&E*N!wV~s<+X1*K;328%v-8D8jV8 zoo^fMU2*!ThyTnX{A>R5r?0ZvblvuEQp?!BXMl1yuap(yW52`4Ea77(Z6SpcuMK!l z@G_fcO>@<;Ppm$(>RbwbpCI?WNU>^{k1yir_m!C!4f?l6Qm&1pqxJO8@&8~Ls0muo9;tK+wh-z2|D zei6z30b%X7IKS~yyg2ymro4b>geQ4#1TW21^geN8ng00KZPQhdTQo}Ax3h_A=GXC|VUH0% zu`zZG{-k%&m`a`1|4{FumkV!yDZFvBv&Dw;cxG@W{jgO=R>9?IHpJDtEOHlC=)NM! zf*mdLno9DHEMls_VirU8il6W0dJS2A5NfVb+Ln6rR;U6$OuPuI! z)^)hm9uZw>@yy)Kh4#4Ca=kdZd3~;ud70(HFB(Tpl4({)VC(L*B0fuIrF!#stIs8> z+?N~`tLzT)ffocgEuHPHz4`OJ+ZLiJ)TsSPd-$9zh6+^RJc}d%DO`@^%^f1wkaf$LDrm|TrgW5@h z53n5WM)FN0YYk33R5f`8cMNH_STx(M<$E`}8r>Zm1d{`<>BD9Zq!=111Po-%)=+0E zl*z00Hp7^ozW2BLSSt1c0v!JTZ&798x`LQL{@!d#cQ#=xtwW}>BzyKqKStlBIcPS? z%ySFDI;Z<#07@ojkVp=A_{0BM__k29NOYb})Rxd2Ux_ojC71&mS4Bd1H9PP6mnj-h z=J7(XfQJE_0#xjmjf`BdoZba;pY6rMr>`e8JKzGTMN~C6q|@{%J$P-f*GPM&Mzn>9 zEuXqqdKoMjpwoX)$&z#Dt@iEe=-HDHm2+kLQ=%jReI!>mtBvhiUB{&QY?4gfNmK~c z<`c`I`mnM9mWo-68CuNQbVasWwY|>18Z$50S1aPjXzWG+q>I9VSOPj6;+~wW%9IHr z-;62CJROJ3({ZTG)6rS~oTuYp?SuG(J~sno)v;?A)X>>O%uc0_q7SU;NUT00kE^-2 zFpnZj$sR_!AFmFpWQ@#f8pZj_!90Q)DaX#4al9}9M=|6?L!LcXO|FrtE0_Oo1m8{LUpSp?xiG-t~KP%hd{3YvuF>9eb2k3!DOSx7@ z`$EH3(8|n$5F7EX^X;E)@*(VKSFhON4wKf7PI>>{52j|izO=qM+7}6d?0K<4aQdQMZdrTo;SJI(CWw$|(R|gr|S5X&39;H14Kc%MLIjd)uzo;EB*Cg%Y(3 zo@w;6i=})%wHUvGbK7?1DmTa2fa>J*Y|C~FGE2lR7SE30lcnR}DPyaEX?w0|X9*r7 z_>1~9zcsbc_4(rCqkXoX_&(2eeV!ere0xbsX_ZgWyY^tRlesl0urLN+_?!xa`!UGm zZ8+NQ*U!F!GGdNbAX^dau6P_~4#LF1n@0ETeEkFhwzdDH1LALSYN_kX+T)^qnE-$9 z2~%ECk}`t7vnIwL*1KazOtk!F-GY0ne!67y>0oZ1s;cU!%dWdhT3gd#mG*ZHYF}-yqOQY+tc-)LW9)6+ zl;94ZXLG$uJB#6FFFDJ~MfcaTJzE7w_BEkh1Q+1q=qpr#>1g{rG+ zshekAxu(8QW!4HG-~cdyIYhgerM0-hfTyI}dsU{*d_%cgtz}v3)WG4&;O(lR$Z6w) z5yTDfiEFW9$jWINe;sBiGng8(n6O6YwIr|8&UP?0TEvvy5Z5x2{~5M4Pt(Y04U7X3 zKt~b~u|pyMMPD)XwLySd^L>|e#Ev@HR<;9+Rp%*$Ysa{3vNVWST~^`NGxgmvx|$UY zoqnYPH@X5{`$G-7u)FYMsby|VKX8m1QYPQfNjJX~cH)^yG2G#okifA*L=I1qsDo#N zL>(ExB$)yORQ9|&v zt$sr*JkUn7xKN?@OGb7k`}mkPerrY)n?r=k^wnAJiS1?qctZH+tC=SY@0-KJJ^@}K4QW{2V2S($B$D13-pKWJIayl zehk6P*V%J@V~oL`ezTQ|aL4Fnxzf`0?1^DYXByNQWLp+CN-3}yH&syrQ&nVNihW2X z0>Vf5SqR-Ec>&@lnjiondr{x=+hbV7{ zJJT3%ctKm4bNbHeoIIy5dx*+UkI>-ss<4d_`Ked##i(F53wwFuwA7`J%AYzqO64}U zrX=MCEuS^w)8uL_Hqq+B*MU!)b4KhNh_?kj|EMsAUUX}$#%nmbj`4eUQzYb2D_8YJ zB~@!G{Hbw~vH^x^o-G1L^S7e2k-wFlQ`{EAsgxy({SSUc02+iy^dc`M#z#_Z`>IlD zzfZDiJEI?OR01?UTZ5w}yC_d`-Grm2AT+tLt9E41PUcSy11g}VS4FLmH5|&zTW*9t zW?R{lnP5!AaNo|QC9;xus_~=gA;b#&=p(642dpazxOKFjE?iY0w#!5xyHLQfX^Fk)e=Qyx= zE66{cXDV_{a`;G>Vfzvqr7ol)w_u>vcrBYu;kBTrcID}=&64;zm8dBIr?G*VJ{1K^ z_fm(J#;YDS^TdcLLL)^*sP@5S{qdeXuJ+oMzoGzBe68CfIt}aX)xBZ*NLg0JK5^%VTuM<*P+6= zt|p+wMu&{!j8pcxZFVFQsDWQ2TVz4J@#+zdXv@_bqpp2$$-{BC$%k|WsblXfbpw0G zUhE#8GL0V5^t6|DfwuZyhjz`{pzVXTQ&o;_N)Dh}(%eM<{)AH$+}~)ba8(<;7L%=R z8I~s2@jsiJ{*1giLc?SEBi1w}RyPfAZu%buQKJ_4(SCYOCmU(+MSfde5&VfE?RF1o z&l7^usQHM}ni3I3{D;=J2JiX0(ifKf-Q4=guUTLo+j>#H=o#EerM;*~V-5GRq~446 z%%(Ceu6MlT81bCGE7sp2Z|Ci4E#1;xyx!+ip~QDqxC_0lwQm%79#&DN~Y z%Q`g)kt49~A%Z;bS`Vr2b(IsjCye}MA##_G437GSAs_$UUZiadbk#ETK zGcq@@V~MDqjVj~xjt$o!>u=bM?>7myR2VcmHf&y8JvslA-lqG({{zB$%L}d-;w(3i zQ3kx)l~?hGq>dA5(;ajGQ>v2+t2*w;cHG(1bw?}_gT>~W?#MQMPD0V=6p(BAT(;#7 zR;TeMj0rILoPe+rWe_`ZB=#Q z8TJ}j0@bh~voVqF*pO?wJD0TK-_vj1Z&CNvUAo`2VT&DC1{^joqWjwhbe89qrh8~d zjN_C#?y+Xx!!UDNUasX%>+zjL&Fi?M>+)RFote2~nh%VhYkOVidr7Wyot}eJ$xe1B zX4tWY`++Gl2aYZG*vxTHapvfi1i67mQ5p^tOkup~7^t)31D}aBh+g>yu^w1e+xrBq z%r)J^?liD#yLHL8f%ep{`ii2|t9Xyr4#gpF|1(A9Y0o|A4*Q;c{gauE|C8;wJ=b(Q zt-DX-tLeT>*L~KR`xtU+aJK2*OxL}!&L(Tpec8%f%e_zqg|n$pecP~RaXh(@npWeg z%o^ss(7R$^s?x6Y4caig4fSIKU17hp4_H_p(Cq>Srqe+ zGPCP^JEShwd8`g79p(I2L8LYK@5ePZUj%SG?IBMN*>@bM-y#!I8ej2s9SBCElYp4}2QPKoeohH9twFWuJ90Lt_(7 zX}&T1#iZs7N~=ab%yX+RYm&$~v4u9*Vh7;hQ4UDC;omHs1TxJ7CDyx8ehw|dep$nr zo2%HcmA(PcSbt4)+Sa+8{wm0cO19*2qxKZR6lE;cgpQcj8r*%2YDI<^P9NipqM@+C z9vCY!qy6P05}o@kIW3UMr+P51TKy zXvw|hTK>oJum0x}hxLcUN$^`fIe5w(ZQ>jmrDLx^9!Exf z7z-C`*mWf;JE!uup;OM8Q#33!ptVM{xD{Og1YWBk{1vhMh zyJ-UrhleUk-OSgGHS`gD*AT}R4E&l9dSXU;ma2faMpgZFm(UY@DAyjYVrH&;X&Z~F zHQf|p7N}&lLGSsw>sKmBLnWE5(K~K%4XYKVfttKauX#M5ZdH(MSLD=t{$sQ_(Rnz3 z!Ye2WUuZu+_mNgmYzHyOlH!RU(RBd|pe!xkhONo|tZ?pCvI49Noz=As>G- z*|YINUQX{AQ zD}sUe1hUU?NLNz{7a+un5MC5+<~Hr0lq`*sJzT*VldQW58>Aa;A7k})lXFC&Z5!hS zk7KK^(eM+n)@t~XYkvK8S0f_|Kl2|o{LJJBld?4kDTI4CBcQQC2`ATIx)1h+Lcq^`%~(dF z6T<-56h+3pHX(7*f+r5@U1A6CH;u7bAZi7`$Q!m|uvCjp#!X8{k&i?(taw0@V` zXIT+vk;c_3r?&ir5pcvKPzTR1d4G}TWPMjxR9EZKPbE)vbyd8CT8v&KPlz51v}=xm znT<)**Y!rReaUJg*rrj;<2!RT7Pu|h({G_{S4aMlZBYlk7(Xu2r|`d}2K79%;C8_{ z{lV1zi1K3%kD6fRHp0IlbuVGiDiY6D4SppJGl(p&Ox>XbFg>5(b0kQuRv0#AA9jaj zQVf<)Jj!|T!xZkcK(U-qKu4)WAH)?+GzpZMQ3_YZQGSRSX>yuDk%)CQYAuPy0e_A~ zfFS@ntjkZ8eI*iZMkx-RY>FNgW{|h>q6ljiKG3Msqnj&EE=WVr_r9GRWhETLjyUYe z&ODX9#J@6abqybSEe7S`%tm%1jjpaEv2&Ky{6y&N(onViy8EbNvrg6Fv?Z<6kY^3Y z(hd;-P3%Yru@p~LYLv1=yUBS1ajnJNB+gIdr7 zUZSlI;g2T8EQ!lG28r?T*K*erG0rJv-f<_GinZ6z+1A#|1c59^M>gJRJC&$(&Xeuf z7<`@cESR}~@%z_eDH*%&^IC%gTc7>gU~6N2fm1t_d3YBOtg*g456l4+0QdIt+Lc&F zWF=3W@9f;?b=IyqRW^F$=KYh*AX6)c|R!_qoe{88Oes=B=oj_kh5~4{}eOCHU zt7}68`|4?-)!Uoew;#~dz8zEhTfC`#O3~CFmT^UP+MFl#vHF5aS^N18qYAXImkR`= z{PNzrXVOXh-{cE*fp@^Fbq-kbLItD%z5Xxx zs^076Y?buozi!PDivYuAK*Lw@`+T)^-u1j9Tx2)`Ro(e{JxBUe>G_*Wdrnnbtb-ia z?|Pcpd}d{=@bRIC47$X+@nh@Z3?Y^c5i|-`>ba>+uw%S}{vL&+Xr;FG1PxzO`jv;% z!;}}7q_j12DAKW~w&1bPs2p3&x6L%>KhAl)%N4Bk3`U7GtJWZXgMyI3hf7WB*50!H z3B?AVmfG$b{Ilw4gS{I<9XsgQr&4)!Lr+&d`o>MyF{W9CKqjnPh)l?;!=R9^Gm~G= z$`y@aFN-hw_8&~=fw!~;ht^mpXsXus{BRChP4n<&@H1YI|Y7%zaR9lel9u)3k%-bj@+gJ;pxMl z8hd7Hmjm||G-P7>@aMoT4O40_c`>E;si=?8+*x7DDJ3brPeoEw-0tqK-5>6J8-K6v zOz`)*&LbsQ3U^Eody~wDd-Jn&6bjZ3tnQg@C>eY6uOsA8CNm71nTIPejOQg%9s@?0 z+ce1mCz~EwJLM!&Hgnakyj6m!ZN|7+IXMRCL1vI$xXEN*n3d&k*RHc_Z~1`YT6VGZ zw&yobOFCZlBYrR@X7*G<51QQ6HWope26dMEpzMnxu|e9>{cyK4($5^F-F~amAbMq= z>6L}d7+40oA0zGHz#pu!gU4ACj{6SFN01!s{>ehh9e9i+b_{7DvJOmIFRAjeg;Y6! z;r5l%H0|x)`(rid?=8&`(pOjs<+#nM^kLf!>dId(XM+h6(Eo?)q!%oq-^XdS7h6D~ z9M@Rfrv~%b7Xa15D5x0ugUN+b8A8cp;DbzRDcM<_{4waJ?MKY#hcRPfXO|?)wp@*k z8yy6r7x{up-qIRab}8dDTt_3wN$}Vw3daW%Ih{^}Y|@Wpmm=DPJShJ&?$!gdKYI#i zVxB+q9LIAd&sv_dc;*lvJMylpA{f$C+D+%Em1!|7K$TmzZH614oUovjULX zk%^Pp=!H7bi znbd`(@9k9|NN-6u)%C8^H=5BdD);T!$!oAv+pL+qK28ZH1HUt8JwbqOY)kzPskwKZ zdfgt}b_Xdo;cwejpE^lZtWtPuFlnDA9$7^y({HyTSZLZwYa2ZU)weZF|9W5g0uffMa~_R;(e+5cmGnH;peW=K zxYcy)#9|_EZ%J_g zfzln|Q3E1rAx?WSvc)1$@1q#5=>##0ed2-I!e! z5UgnZmPE6}%lM;^y~OCw1EtctrD~!Oc?b}{o3PdNP4RkHypaPwWq4KYB1lpCEktQR z^F7nIP46y_QAWE&Gd`Ps3sGd-&i8bmP45=x0eHBBPPX?^pIN`r1mxdJP@T`OcSYyc z2{_QAfPizRdfCPW7cNi@Cs1u9Q0*b5swPks5U7Hnc^M-#4^3wfwx=E_GKXQM4!-oy zqV4$+=AiJlVCo-@q*8X(!so<~)+wSrc*F0EP@Fd`>>G-6S1s)2@LC2hX2<3KB>GWI zJnc987tLcff1b}+ooB1n*RU-F_XuS2L~&8n+-c0QB|Y6)i4SE6ZmE`aT>r$%wU5+B z=Q-vKY>O>gVX^CcAd;h41bUl`$_+8Tj&twxhOj@$n9<c*S27~ zu}>5g7B95GQ1qDDyre%4RdJ-k5jMbXX5~n>OxE7$Z+J#GRD-?1ft6Wa}yI|IL3Gf`nYH@$G|SkkZ^56QLD5u_ZhUHQ^N+ zR7Ec)Ic3JlGiI+G5oALV7SnBE*_+GSbO%}23OZR>6w?`#nD=e*vSj^JE5j}sOJQ=3 zY|6iDc}Hr8^>_J<;777aV<<#7v{kTd{Ig+(jMi1nV=^oknKfTMaMc)Dbad#vTy$s5 zmc>amIj5CC{0ubP6zumUcRJLO-_{OIi~}F&Z(EvnD@(W`TO`rjGT5dQEP}UuMR=Sp z0ssnjGBDSl?e6{wO44p^)#9I5`tnV^obTM*G}IcLdZ%)s$nOF&?n)sHTe~VS^`MVQ zh1qSz>Ch2HR1%>=+3~+S*D%{eyxm%5ADjhFEr9)5>n%c3IUozT;nxL31X7GN2}~q) zhi#RighH3FAMUx0b+PmIJ(t_5*nOAHtgmu!&sF{OBBBb&clb}Sl@ghOrKsRt-?Cmr zh{WI}|2)^_Zgj-4u`?H;Y6FHo2&)Lc}|Q_szQLAbL3ZA$c&$|8lIuAI2o$a%u7w0x_r%e zoXcAs|4z<-!BtP|w-lJ!KRa#JSXllA7h3yZgEiq{D2f7PKt~%Xb`-pLe{;bqw8kS4 zYP}>vp2qJf;TN%8Z&>Onf-wQzgcK24&3!J1KR7vBfkZYf`UX$K?ipNYWej%>5-d1z zVXBV7H{2S$6J1B~GF=a2!HG1$mB;Oao6sj{->JEpKHhBQb7W3m=8ThTZ|@^x)mA_= z=SfKkwO`(7GiR{dEG!AsbFo?Wj#sn>R~kh@DOw{yK&%5jq~@ZN%v_4lUV zSor?Phhw4YxWZ;%nGx-r8SOFHT!HIOp%D2~7)8vkT?w$D8bac3BP4eFSQkeO4DWl^ z%m8IA8@^1N$c8`v{maO=Z$E{unOwP*A6i)qR?e_G3Y_fo;A=cl9v2+VV+2)+8-y#j z;M8dN3;PTH&OQ+Sat&L-?Yxe06w~c@b zSY`2}u4-`{;b{b#I32`pLy*j9vGWBoi!GZ-SkGSo*`X-PI{-v6Qs}#j}#rP z0TGQ>EtMmk5zK8lz(pp>>mTu%APA5DLQe8&t3%hNFbX5TFG`AnxuW5-^;LBy)e=Ly`r z=w-%MxFd(D<2=heVgEN9GXb|{t4eE;!puB9>QZR-it-}CQ1C0{kF229yQAP3!KHac z|6O&L+u=e@+!k3lSl6%0O?P$XPbJkAX&Aqj1btkeDV0eWW#LeEzi4+F(m5?gO56*msp_mgPLDoqX2JANa}U&AA}^9JT$?MrMbpe z*Dp%qmn40I5hb#nl<{E<0fQzY$d);lKCB?B7mT1@9@nV*BZJAyus3$mSWF^tz@oeIfyfyleBDzmJM7@8u$w*=2fTb zi&j%R(PW@Qk#M0Ka2Yd`))JT6Inm>10gaklebRg%to(SQcGXJ&BlN-;GQSFwC5Cb( zUKm4Ncwr2cd10(Krw;L%;hxiPLt+zv6(;?{9Ia_k&lzhKgGZ8LdWhlv%%4XV6d?jfVb zj7IKKfHt>BY|pR&w$hP+olt|>8gmiZ8r`G^zM}pe30#v7?B4Or1nwQ0esh(0cXY~J z&M6heVQln(e_bOw5iV!JN#B(=VA|9ArNW=&Kd~4%3;j2D;Qb5a{mJ2xNL|b<&}Q?G zY@Cr2yNR|<R!mqi zq``E8PrHOXYL;su?)vcarydB$wfu+t<+Tes&s=_eSgCf*&v3P=Dvk^o&dhbST<>a8 zK}6xw9PGpY-zGE;d1vw(&fh|_8`S;w;JtTS92ZEbnL=#1h_IzP4$vU^qPL0XC)|e? z!gJSuVic3rE473Cq0MVc^-R7LvR*gyn6!-4+MrM^pd>8VEga#W*vkZJ+a@RgZ>hH6 zS}Mi7mg?p=HQj+(D;}f0^3pxQIv6gI0NF&a>T?FLupnp<1op<)NFo3VsENnAA_b?Q z;;sY@Au3yw)JwVi3IAve7gFlCR2T?s?G)?3%m+-fY}}Q6o7u=w9LtH6tnR%CJQ=8C<{jHa=^6_)Qe_%~+pP-GRCsShPm_aL)jkUO-|JoRl< ziQL(klXR~`^>Jk+ITu;gQMB`uVf!Q+K;6LAQl-b0jM84WxkA&Y6~=;)Z>E%AU%|lR z>d33A#no!)v1%Dm!_IY+ety>aXv@fNebvP|Um-Cm@1s7W^Joxf9-@qqDTN9$`wy*M zb-p?orbS;vh4L;$ICKa!hp4}c#u)d5bV}%PV+}W6-cY+{NbPbkI8@42DDnNuh1zLz zzk~`r`i1a1sWnL(PAD;)-$K`Aj;(;Xh+h2qva2gIa}edV@FGQsJs-DkwCQN*iNL!Zasi># z#377PGYu3dGIg6{7e@%H(Ko#@TakaX02k6QC^pc!IY>+;J|Cpa!F z?tG6d#&YYh#_P8BLFB0sGT?up{;34$8Ri?neB}WXEftGe1M?4Y!DC-kNw{AI^pSxX zmZMFR|D|pl3|OkX$6yc`3?hIt7$7E58zesrUvM+IxP=iwAxQoAL0CLmIGQN1-Vdda zcVc1hG*LYKkG^-#f^;}VW6~P7-r<`K05I**CF~e4{=1Sg83e3qDg~jDy?O=ukm<$| zl_2Y^W(C~zywvgmh{f>pnfWn}I6fBqFnv|E%{O-)DWYrIj*|bQdwu=t){2l0k#Fvw zJB9VCOgBtt)mH5N^oO?;T=90^dhLxKBq2pW~GmaTTB4#ntQrx=Mpw6aDX0xin2uyJ zjMmSm*)O_$cIg)PdC&Xad+xpGo_p>&=bn4+g04Mdr1n&0_ia2o0KXLQ-u$hGK}g~Z zA9$a-klo~V(h?*5fFRvYS~{(tNJ~^--~p->R%*BG7g74bm z($K;1W23QSet{e8=*GEB5x<6Yj~Eh?iD6*Gck7emUntwo>)`cb!mar zM;4Omd>uN_p0C3$H=gS5w7eaMgV5XRvBrRYVw7(cXKY*f@Ay=8M7+r#ghF@tmUa1M z9$!^)8vQrquwJcMOt|F52pTq?FH)RWn0$WMwhjPy&sZ^;s{v#7jDpV0$L@m+O`snf&oae1=FTSVc>*Lb(=K2q)>&crV$r~z?_eI}- zyPdvx?+sTjz3qmjOKp7R--w2G2Xa&7_)6GX?$;M`o5}}TR&TI$DKf!*WbSE;p@ot9`CQrC{jV{d*9>z#C}95hCPlL zhu(+bZK;aSCU1yRHbMcCQdfO8yYo5qEn90n$u1P|jWh4@{>+uX!%?O`D6Nc2By~w@ zRc&)>RZX+^2|v@U^CfoQXBjir9zuAWtoSnV?8`bXX_K|wyOh^fXj|XPQA^y(rKAM3bN?(h&WY zUd0lB3;<4xsdl_KQDQ5;mm|TJc1WIzmw_OUDScqK?j!SkF^I7yoSFsrX$5F zRs9`7T_1QuF&E_bk(s1gzxLR+pYp?J=98c=&&=Tq)oqXC6o6L=?_0d}M+7*M?$b}_ z-`4DX=Wnex*7ErDb(=2>^8TZHjntoBQ~oVh{=kVrVVwTT4sk}?CVr`X@MfT`_kMHO zfNRxGr}e7E`&aj>O^ydawx0yqrc=>xsc$Vo%AlXSs;(^5wnIe{0)xNKcLX_qB@W|v z^7F4YZraS5HEw82!MJsxNpK|AhAI#v1aId!1Ix)6cB^&kh5c)5s#~Ums*0o%TG4I67 zUpF!l3ze5=zaBI_SdUtQ)#XwEH&k8)*L~=XYPEL(%M?Ya!@8n%G=tSDl)Wop&K6i$ z@s`0%vMNPn?wudL1T{f#Z2v@1THXVk{3 zU{Si5K7!QD2o3Nt8B0i5ECnI`)^$6oGo5LqcpH`o42}BHF-<$TE@*CRv|*v)8&NPi z;AuNX!m2$;!z6ZpoeygcEzF}tj^O)|N-fo3sr)^Q32 z@`YchbbiDqmXg(oh(TQ-+q75dM5oLz5NE7{vox@t{TzhUGv8B!yP6}G_zD>H4=}tMZLUKcSlnAoetC|$W6=zq4P&{g*A^dt9zGzIynsigXNg6D(eI2(~I+hjc z_+%+QOUVSuDL|#>fiv=l*o&7}OU||*rI~Pnh63776VgvXW!WelO|_1q6X}Q=9QX%j zQ-qr-_7~0;4+Zrz*0aX5h{p0n5Sm2jL?0v5mF9{#Z zY+=BP#^9mf&&u*w+qfA&i$dV*Q@VPbi9TU2Tfx#-o_(T}UAz4;46bm7O1pE$pY$Co zZ8H59dMa9hs@#-f5B6#C2YDECkR8)2H~SVaApIiyQJ(@kZccOjQ$9y3>m9t%Fc-|M zYR4X@NrXFGzsM484A~qiUTF*_l3%2FTuqTFGG06VPVxr`^`}6%<4o`EHPXX6A@`gj zGi2Wow5`gktuINEeiEz_Pa(@OtuA)EcJb+lJI;1aeGhBO*tVY}TU-7GwutN6(jKhu zo=g!%@=1WzYF`@px_|rxI80FDXE|KhKxL*tT6iq!)ks(>$fM`Li6G2Q+{_U(m6y z3Yvn2lXYW*N?9xq0`|D3v7tf(X|1a)dtLULleKA)_gbw+fS7_o<6KDy&o5czjcNLO z+e#QvVVK0IcS(bduh6H{-Bnl8WCy3+CKuL`HdJ}Ba`11cQfjn&itr>ZSR%IsBWUtV zbfF%#ip}I+=1`_ zINuIFNMp9vbFGqqOb@&g1Bev0F0g*YqcemrSTu}XyiUNzV$db?TY;@GMPU8GLum@E z7%@(%TW|oI=?4Eg!CzOEY#OA6@YDL$5?+{c1DTk!+1z`$0)(d;2h)#NX_wd95skmX z?#_4$o*c2YPmIyI##d%Oh0aV$xN$hyxG&YT&yN2q>pIRwv-`vWAVLhq5*Gpu`{%&4 z93^l!#Fy~;&CJB3*Q=G3Yu%SxRnf3I5=#v8hUB_UANm?kbp7a&SB@Xnw4&i_y4Nh) z12$5vgUL0$oIn~3Hy%~go(!8ngW=Yr1nzM!6%m^)i<(j(kyK>S0nymp?0rDyR$IgG z5%2i0gPMB0caUlq(ISNZ!Q|uH^^>Z@O-FlMD!N|5fkJimD5|Ai#=gA(&|^;yv5 ze6?s8oLd0QeGFX+6yY{Q3+e4@%IjsanfJqCS+8lr@W89iziE`fV1}Vl!w~!L4w3IQ zM2^=h&hSRr=j1vB6unPsILAq{XQr`aih!c` z8AXrQZMxk^W>if!DjF5$*uE4+jrKsVhda*p>2>sod>T`cd5&6rE-)%CAmUHm(z|9} zK%=*8Uz0`Hff`>IH2YYiAlxc&(AQNs@KB^B`E#LUCgf`gW&%AM)_GG+dI&bTj`k3u zgn2E|oN0)!U?`UOFvyFqFisoWCTVhKEu3;-ES8$Dmsr!n!(71NTQIxC9<;+CQ>8<} zeC0p#%1+C@PKa2j$K*{B{}l?4vJ7qeoTjM$1qr<^H!x9yUp*~1xS|*;p~@TJ3e~}j zip9Tk?NPXHgO8sJ@yO((>RUK{FoA6~D2WNORMttEP4>RScstXo@E!*j^J@J-vk!Vt z^?HNW?0vgOOJy`QUrUO(sy)D%8mtkUF?Qj<%IV^WTWpf^wQ`AZSvuTsm--%vamL@T zdGCn})Cfi5d(JVNz$k&o17US5rHnfgxTFhv{@fJb;9=v1G>WX>$Sb)mqu*a4XCS{KewpNe4vBZxxG`3Ev zkk??a0HLBs7ikX+4z#GHV%{Dk0D(}1QTpy>59PDR5`AivK_pHmIdr{eNqxs$YR5ZI ztc%@JkAZas^3Y$(L+@DVy^4?$?Bz*^`Vqe=wceYoFsVkZY|(x<(naz8o_E_&7$nt6L!#4)aG)nf`UqnOo47v0*u z#{Z$5-6HUL--kW0EkA7AzQb9T#Nm7UZNYBZm)=ok3wCSHKO|5BisjqFu%1g|T~R#; z7ws_6e)<+f`0+zy#tX-6UvMn@&&J<~XE2PSG>IOaDz9(EUlT(s5oO(4rH$R|A7M40 zaBI&*L+e;@&)p>QMXI@?p(VevKzASV+1Z#|cMUx-G%dQUSo@MNH1H5^8Vfl7zHsB1 zaeTe>Ietwk5HGbrtF4!;(#kH{^%#M{ERhZmn_@_Ex2P@dVaO;?@V0!7V zV65!3pg{l?k|I1UhSm`Up2cxz*ugmzq8e7fdG*+{T4K-HK5{0sV1Sx= z4mJMbG9mVFI6U4K2utRfSIW!q*&g@Z1MNJ;qxrU>i#N*vaO7p@sm z@22HJG#QqQ*>rL>Lf&Lp79L1#6hbG9E>0PR8ZFmo@+Py%QU+f)4B~tz3EVD;*lRGs zz5`Fa;RahhWK__1Zhkv#h^K7V$z*f1}Z@#|c16B9!$2E2K z)|hW#GqqQ|LJK^LX43S6)Iuw|rz&X=C-UT6+u$lx7tYIQ(-5Bl=`Je1s*2vkKUw9J zm(3e1+Cp{y_MSF>FAK8CKpy`jW=ndRWt)m0S@YO+U ziCP3`VFVq`7G}r+)CngrQ1eT@Les2qvNH65IQck~q)l=mi%7B*Lz$v~#Djk54nvBe zg4Cf$bEr>#_v8Ih*P5ZSN#4>XS6G}y1nzZb1j{DB+FCh5E;~PU)RoA7mOgdwnWiz$ z4GDxA`nJV=G0Nd?Ca6QsgL5IskRn4-cS$VfGg3~e)g1mKLDWZxTj z*}LurlOjiY5N-}De!pbj_yJ~*ln;N>BT|S@a*zjz zDpMdLfldm4nsPcRXbgsVI6urxU_z$TzX`gF7oS|NXfoG;uw2M;C*2TcH{Q@V8vD#M zQZxx_{W6ijwW^I0oO^le_#>K5t)^5?7RxH8+Kf465po;}MC)M?AyFo;EF#SK%HnX5 zvN-INMbxZ3t4Bd{tX?l?DJwpZQe{PpfN|BlvN&9-EDq;funnxWm2*o-Wtc4 zu%^g((2Qf;rpV~o6dAoYMTV-NKAsu-Vr)A_25h6q1l@tD`dF1BW4$d=WWc3}Zk8g$ z$}hgda$itnhPCcXk@cQEqXRO)_Y^B6C~L)?9W)0FP%E+ z3cC~16=aNINBLkAM}6r^kEPPpQD>Ah>5BNiKBL86rF9f3)0eJ9=VCyTu6_?>NV~|4 zy0S_FnU;QyO0I$uVZo!wRc6)<)J3iD>^GZe6x((lw0BbF zJXfro>qP7S5z2YT-SHKYTgo1}J<#xH?*^EBQ)H;ktKanpTC5D}WwX=ITfCK@UIvH)aB;?dp@qv?g!=}yo0AyhQ>!KAlsqnH_kc6odI2y5 ziri4*1v01=Ly0d1Px)Zd_;bmrUVBG%vGgxcc8N|AbzCS*e5`hPEZVAnW%eE5{zc0`N|HORLev9n;=P=5I+)^(hIH`cR@jC=T}YY}m7h z-TI8g(hu3%H?7FM>0w@_`t;eoN3vV8Z=c>I^d|mrj+0mTC+d0mO#9sD*f5>Rtg!m5 zV0khjWLKy9 zl+9m}i;#5vBSi8Ll1!wrCvNc)y0q$8#^mFD_S-6|+VTd!0b{cIM_u*mCDpT!IFotM zs#jOS)&(}s8?62GmEAvLaVvu%BWyju(UQz5LtBF(Cidv0-WUoS40%CWMN5LgR+<>y zIBovqk{}i|^r^#SBh=7L<`=d|ddb8=Ui#kPI^M&z3y_%11S@0d%gHp9c!C@v$yA^6 zCaq4_I&tpw)4WXe>9fHy#I`N66>=h#R>=m3tJt>rdh6#KCE-D6Pv4cHF0PJ92mqeF z1P7x3YMcQk3L9Z_lIbT&P4($Bt}wdDrjwOMIEkZ5X_{!F<^&XWyR32tU*l8cRy zmw(60@F7ZNzt5WnE7CFdx!q2Nk?Ns_{Evw9v^0%~>_zgIE6*LU`98m)p3Zwx?* z&yYAP=}Ue&eLFHjY;?ob0hUUKiaz|S`ta@in4|497zvU@fTJ1PcgBksXu1W&9y0xS zsGxSFj3p9KhQtP>M1m+5UaDyg&N|&b=Q&1pCfnwi2&x-okTiyZ98f7^nQ2%#DXzK9 z3=`Mql-B!(avWpQgX&M8dc~E+K>Vd3o}EhQz3h_qkhzSq`F%XrQ`@#J+TUf(_Fa!6 z!Okl}Wh6O2zw=tO$7}i*{=ZMXNEk8&8ZiIa?4q{1y4jnY{+_v6A9Y=B!Ah`_?NFx? z`>tZKZFl(@&{*3PDg!YAp6it6*fuH5fvfJt#C)f6&dw3xod^99*Ex8l2ffO&(>pa( zu1A@$=IcGWIxmw8_3Z3g`iWpYMRgVfL<)Flr4k7Sf}txupz*^##+%9~L=oJ$xQalU z(>%*g5F9(yHNLRe&a1FERCQLtg2*|vW}s$L`EYnc>E!ot4MPNZvTMq(1GT?W>esBt zm`1dF{q36=JDpLOLakM6$`sgr)8!-*o?PveC244Ng#hz%ZqAjE=w3;(;FHd-!DC3gfmo(iog&R+hc z7Uv5m(zguPsK>go(^N?vI*fY~Cghb7d%R0n0yoQru8s$MIT1WjVBi>?LCCHOAMm@0 zRliBtH51cL5BDXO(Ovo$NBIQjjW7UU{otOB96KLa4>0QCZ5>>*MPF^>8FMNQD&<7i zxm&|+w`p5dn5J1=IHJ=k%K2o?Ovf$$PB;`3@2{iX^d*pVfF9o?he1Zps0$4)$1OBK z{;~gx@sNvQqh`GBqnl_j>bCn5Lb1<&T^yp=PIJ=QCZ!db4yGSdJJ--Ux#?bO zIp?Fde1JC?Ms%a;yTJ{9VOWHlZQL%0pqcG~dlB~ljwNlXS>bx-lj}Dvg+Yl6InhN1 zLat=4$b8b+340)#20;%n5~z{?HBIbgDf$mK@n(vslO;`*QEd#nYD1-vA4_yWnpk{{ z4ufInbHgB$aco z`_@_J@4(CQwN=TZ4ciMo(67OX6yk8n~1xL5tw7~UkZ}WcJ?Z&bK;-@ zhTr30#GZqNGcIBK{()nryIenE#pRqmMzn9O+O&**vHGAQsw!>65q|_1DYl<<%son| zmQ6BEKdjj!&zkA%ofL5`;exiN=>h^U&WaEiaC)!pcg9DzKQ%@28!_A?ROQFuQqSrS z4II;mrMFcX7S5y=v}@NjRkMe^myDKAfY>aA9pZnSi^YHDIvt?o`=ux$ECJ~Je}|Gc z&hEd?K5(Cyb^iAM&pMy2IkD$4dLD>UMzTh)!FglR%PAK+cZ8;)v3fHXuT}N7R`;;> zP1QFdhB9x%%nO^gg|*LTZkc~G)J;(`7JtRCS`}9Cc&-J~tY|n8d+dm1sS3*%3#O!W z`8^=M<|%Emq0!sK=}%6zi%6lkW6~BIJ>Q=p-z12vsv+`F8x^3bG?Z_?lRkA1sH){n z-X<=k)ca(4AS1(%v3j6YLkXVoV~_M=x)!fuErSN-T@IN=H9Mn0l=vnN|I!`S%Cp$qYHeE>dSnj zSV42*3;DCj1sU5HzhdbxxOoO|k8eS`?|6&u$z;D%o8;pXWq`DNRn(c?K4+QzO~}j# z^b46usH0=c%P;`IR%bFBEt}5g+xoCV_6KxNB$=7ayGZjzV1GgK-C+E^OKx=)dyS=k zXi!-MO$Y;ig9S^>4?&L21V&+<*h`%P%4=s7GUr$tw4kM!#hNu}x@ub;6k61kEC#3M6M91mQi) z8z(x!7%wO6C8y)(n9(Zx{_FutLB5%Djk^fFc&apjVY0}ulzp4d<`WZDMx^W|nKhDq zac@KJ81L>hN{A&UB@Uvikxho6*~^QgpE@S$e=`131*=D1V8CR9)X!Pe3jl1F=OSUx zx;$6GWW=|>Ed$nx;gtNKt?O`Ix*t|OJ6Ni&7p{!IHn;uVC#eCv_1UOtp3L-}7U{qztxrJa; zOmVw@O~GY7NtB(_A2Z9qkF}0Uh53tBk~0TFRgmbIP!|6KFg{ z@S6)LV**pzT6i8AU2vKL_cJ!0%bX*qQcYnPcyWn+Au;R7#Ky9;T{2zN@~FE;wwOw| zNUNW{2zNdCpgNsD{lT>yz&tEK|k$Mw3o#c`3o1hI&^i8MrTtBeF z3>P1QUciY2*jpi90?eexNzPMI>>COF)?l8`hLaw(HK7OO$Gzq5Oae5G!D70%PkALC zIeBq9`&k9M_joB~E}gKNhu6C%oSJFr@H2>5gq#yjsI&=3)2VWT8<~{ z6Nc+zQ&Awlws5rF>{;lKdxJii9btcxhJSbCQU_g!SgE`KY;3yvmo5W<*2r7Xe`PGwTtQU zDuoFL7l*)=EFTEjS0IrO^E2;3=?Uy(p9F_%hAZM@E1iE?_r#X~Z|D2X-*_l7!X&4{ z`~u$?g`nlqu03r34j=TqZQq~AQ0=zdvB&rG10FLPf3Gz_0}Vvl`@N>XY4m|2{@ z^_^>J;<$ln9X<8cvA3oB)J9hMNV8hl;=L^@8p9YDCBl=u8Ia471)-+aQFMbhwe8UO zhuS{PO3>EhXyMowX4ArKq{>lT=-|-1X;9h-FJAd@Q}WxeAp#qzCs{Q*Ex++<|%$U(zvwa z&1r-#?*+pc)d&Ic-TDl5LLUJ>0G-zJeft63I+|XyVA$o&+-k6dp}R>>_31PI$~%+p zVYhz1<)QmimMRSWy~EJ|3@~KM&n?ii1+jjcbOat1+w3X@M}r~=*ba&0>{2M)7kzOz zlLWHty}78FvlTS4>pQa6WCkLxd&$1L)TD$y67Va1i8=PTP^0_pr4F8B7>3< zx%sgmmCz4K!1j>c?^5fV#yF0j`6Fa6>){`Pc=a&xv>;;%FsbNFcEkC-fonhXm0ZBy zoy%doEEyR}1XPnb$8Uf;kK7HBX@%g4y^lJI->G z{iEz1FzO7Ix%OkoO8)|rvCi|YGEbcaZN?F1efhWgQQOY54rK5+fBnAo#vc{~7 znn3p1L0yQ}V{CKXVmT^;iaGxpWbN>CtZ_LQRTCaAXNz1j82-=tiWOcCn`ryZ-q=S2 zTFyjGYlVfbBo|@LXblr1lzEho!q4nx*G(|b+hHE03Ft>2-oS8pM}n3^5hbZN@ke|$7$dEE`O zi5;XR(@(gHDf(oUZeqbz0wCb3ROCTkjw@ zdtbZ+y!9_lCbkaX~5_B zyn;Nd98q5mvJ9P98ag?H9HelAq)VX|h*6yL3|FSkPjOO4ebdo;oPyKasL^0V5z%VX zCZ$S406$7v&-E}rp&tm|#c5b~(l)!AJ)M4cV!68y=OTlqvz{k|w$$71py|L?Y}?a} zp4QdaXTG3uWD_URr3N(}O{TZ#q0c@O`ZO}o1D*X?Dy@73z1)!O`+z+q^wpeBKg<`6 zS8{w$dD0%dZ{My)5(2PYuXpP+w6&ZSytu!5OSc4|*}KFw)3!>p=M~AME+h-#G3K}& zL3i6v*4;YK#V4=I%*XqQOU!`nD;JY1)`oiDu{Ly&zlQ7AhW-bCf5G1``0HM|HdMp+ zBL2?cFU;Rt_c6MtLy3st=CzcNzG3pv6sP^9^W zwV|<9YeUI3YeP5leTa9r^L!WYEBX5#&s+KXH_|ro-N)ZY*HYCPW&Bt8SFXqK85O~s z%G2h|nRCWz`WZQW?ipvyJ0p6=8S{O`s-R!BATuJJAOIjS+6G@#*C}kd2%#~>tu2wB zawPYN3(jDRO4N^O8%>r;{Px4^ANmLbY_Y9mq}PU5)liva7a|l8rq<3>5!N{$S~JjB zRXyS<@<$UfmmaAr+*^RHs7U2!r;^zl%D$D^OJQy>RAG5+*}AXOjTkm@m@-p>6|JyyQ34k2 zK2W~E7&KM|b38wZy&$lEv~!s#7ofeV?HQ;1?xflP%|A=cM)P-|LC`G23D^A57Vc_R zy&&cqIzl|VhYay9scZZfytGT4t*JsAz2r;y!;s%^WK zm;E?hi>Am*u<&-uYKFISoE59g6wZj7P@UOp979M@UbO8oEeYCi@URC=V{52RF&*#t zfRKO|IaSY@I&Cu13O40EsyEg_uCV)sMV4J`Py5SPSsSJrn#N;~9uS7q*60#zj)Uw0JJE9qd)6{~cz|r=KO{A%McC8ht3*SDwTiKabnBs~>4``;z z8oL1qM;-YF&vabiP!K;*M~h{VDyqV+-q5Dygl!MteK27r(FyIa)}FdxwvCACdU<4DxxQmMr_M`5O-uA|FozK*v8(6M7^+cB2}*QF_dXjV7DMGt0Fl zhGtPP^Fbfo6N{Na#zHu$`6mBL^)_8q-L}thk<*fDL@^gRViv(SwYe+z+C()$<{$PH zXVzuyNA|L*Dvcu`gM*Nw?+mf+ZlWOvSB9Ot5xR+LZ@9%f{4wizG7+KC>`1gmu~N*s zH!PCuQ)+y-K8ZbAB#t5WV0KDNPZ>SSM22SXEABz7gPF5@n9bhz->V!jLC)#F?6)oc z+LBn}Z=n03#(ppu+6y-vYE;xc=E{y_qDHt(>l4iGMdIyko$P6SqPOvhp2qFHP1}2# zyxvx?r}fFbgt6b-xUXy|u~@C-A4VXLovTC(SexA#xq_{j;CiyMM`|~+$K;3RZ}IjJ z{n-Sc3ZP`UQrVBTzjN%HH;0z(-;jzn$B7Y^R&so|K11zqPW7pQ(%J06_Hf73)!h(% z`j+Nl(S(=`z><9-a;6gcjC+?R-NSDEY>GW*GM(j+P3E?bm`&yyzU+>Z-o|~GmGw04 z>*f0IOj!>%YIiu)%3Accj;kF;Tgv0FUDW|E!a|C@0wam=VRn8!_>l#M8b^ep?6T}7 zy{-GY_LTLs?#o_84HZER16IRXy{+3Vb$d3_+vq9P%j^OUvc-024pzxkq?hpmg6ABy zQ>Zy>kZc{?OZ;-iV1h-jK0n&;!EEDbFaGKc9rJp*?Oc^}`9*Kzgu2IOwGl0o-Z9TV zZoeL$_>uPW`TSHnQo3$AM4W76NwJZ-nA*j&^GY*uIKM4UDzk$U4&gG@r_cB+A4$50-TGM*du#`x2UC_qR=e-oP$d46FCQ36$q9pQ+kxX?W+Jiw zk<)uypR}$$Ih3fQ`h6I4dK)Lz#mVf)Pm!s=IMYohWU@hp2TAfurUfpgRYxFg~H21g;#eAq@w%UY{y-8TZxVZ1I=pd<}$!jvVV< zQ~A`~J;iAQuZDZp%zrBT1@XL0UmlYhP38=N_hkImNS*G+zzo5I$-Y`;EvUp&Jw@j0 zy{n;YtztgCW1zyBWZY!*aqZz>swZ_pZNh;3_br6Y*(nfgR<0jAS*Z)vABP$IA81=MkVZr zwX?(E7~}M99g9mr|M%h|wEbb)o_z;PvGscg{eIZO%6(k#(KSzk#jh9$Ot@;@Qsui- z3-f;|2C~71fWv@RHmoDRfWCuOe-F=UZ7h)x`h&&3t&3ld8e6>Yac;ntkZG7ci@hPJ zXr=FdS-F#GCC7K`Gt_?h^A&f;@kIb>ebS@S&Bq@XpY==@v;}$ z^*MfnfBJ5&$!#1yt99ggu_f;azg-6kZH1~mmiCXNT6fs=+2N)~+*|s2oyFhB3Hh`3 zB#HFZI1*4Qj(9$svA9Ak>p|`8H|Jg5pvYw<=t0~ZbD;^ess}jvxaEmtu4GV|cu&Af z*ykF?0NXU;tgm3aX(aQsjdrUiUtf8#8*Sp|GW9^m!vU&m-FW-+`)7aTkN2do{YF<| z2|MZnDM{zPwp*EW*-%rzMTPAThBy{%X^8d;XfrE(P;b!?KM+(pp-N9N#7c|r)@P`l z!%YnF`N0sQXY>yo3nyFq3w5zw($vp;?($N6rhdk|$uqXX-nB5&@&5dj^?OO?HFFuW z{{QfpZJh&d16fKc!b!&L>y{^yxxX-G=otOF$+MsC+$d|c3H9;L9ijGhZn@}q2XVfP z#16)H+Z2`-IS7%7qmOXJJzL9k-iN|4mvDCUmyIG6RB`=&xISz)jX6JaB{Py%fgy5l zXXz}@ekJopUZ&GaX^)eX0`|iIm}FCa`7Bwdz>i^xJ~fvvmYdxMM5$1DI!=#wKz)jL zWe+DIfsftg)1CJ^B%rkTZheN@-)nA{E9dcV8 zuDO|ew6eP^nf;Xjm*vDi8}}%c63mUcL`vu^hUDt(wVRc(>z4|QC+YkHAM!gt{yLpk zT70)Y|BE_*fZ@**t#w|M7u$Bb7=^97_q5M<4~?-zBX8xz8mz@|y~#Hw zG*}Pu%RHF?@)lQL<^f9dHjSFHjQfv?aHppd(pJ$^l_EiGG>doVNm_0GvxAY06Plwo zFwxAfZNlW2G*eYm|ElH7d!OxZ_=6O1UB6tzuW0MZMD|CmP{h|`G;B^=DH^+A>yYab z3q(;|v0cI^1|8L?r|nZW0zgSoD!z7B#Y$iAo$e~0m8J%)_x?qbWH6GwGN0+{t^EBz{C$(Z@9`I6Yvfe_%I3@|pED;shwoGTtKfZQA?>su zzh`Zz`u%G|kKM60H1D>xp$GY{;`f_wT^l-+-#7C8fe%w_S$TQ+>EYA)S5a1Z`st^g zUUvHFb51`!;_t@z=OH2i^E-=)DT3H+W>;*&I^MuJq9VPA`z?8`AQ!F~^+1XY9W_h2K%djTH;qZ>Iz={JK<24Wv_Y6!9GAe*k@ zhNSX;!7dqeK=$j-$c&a>cYB2QqedeEe*=Yd_G@f|gzYBVK;e3Z4GgCbRW{V)tBvKF zdGBy(J(S-#(>98kv#l=2EloR_MWJT@mZtdNIA+o0Jzjjplx<(UJKZ>rlXKgM%%Wv8 z3$HV`cU=dlbZC=HdF263mSM}HbMDuaWP-Teoq?LY4sN*)jnvAqW?|h+>|M0hVpPWZ zoA)c_xfYHiKsL=?F`}Q311#QIV?~!*(HcdBckcR8ETDDAe{|mA_%V)lmBGGh@J77~ zAQuaXob!H$2`hQe2wg|CHKX|0p<~>-qAgSJ;;68Tzn4yd z%w*3oo%_YqJzoAKiX~__*c?x9fEUu1qqIQB2)OEip{l`K#kED@o?S+w1ghVoe&z_x z6^3<4BYn?4PNdwOMEwqhincmL9}`tHW!g56AjF#c_J_^zP9(sp`})Id82J7O{?Sl$ zYc@c9_jNpP!=2oJGG(E)a=qJc{na}|=2{%QxL+?gW%nY4vp0m$&7KslSNOu@_LkT2 z()3Rw?iTG_a)w{Bi?lb9Ja^L9r|>d!xaHyMt<8t*@=*(!c#AwLtRkYT;0))%GHEW}&->zYLaLeCkV z3-c8GGc!N`yu5u>$5L9)c|o0;#2hGVem-r_QeJZ_Vz6<_FS}=r{Y&M)Ce$fG+Cv-iO++ zW~->#+j*nCXV%MqxPJb_MP(BCGGrZES*NL++0UmjrH>X;*{bqx%L6)Rrz#Ft3KZ5u zj?`w1z0Mn=-9ULYHr#5tPOtFX18b+>D+9&q)`Cgz!z)!yE*ucA6iMxP!Y8z~ zU`9Vr`<}>ropojH7w|dLu_Pes+O#~V4>B_#c8D5NJFtAB2D@(Yq`z7Z|FEMa+*Lop z!2+xrA&y;TKStjQM~;e4fVjX?FdsyRhL|+~*1XczwT}GRh*=klm19w0OMAXf8WigB z7mecfvi^FfT7QoQ>u)uyTd3oGTHXBhw@vG<*4K5`4lTmUq?w$3tDjGca6aFfl6?7f z_&%QEoz#J{;XT`Tx5-QgN7U9OAYUo_q?lO$hQai+@^*ZRJa7$&n!ko~ z)R~5tnZacmOe3%BY#~o}Z@QiH%l@;J@4hJ(VBVv?7-c!xLOyI z;s^1o)F@9;zK>*ArS_#hND4QX>fNEtp&uW5<I@8+_1Ejygrd*|(YszQOh{vKuZt22OB-I~P_D%-Q{Fh`bDT@}?u z$r+hd-9D6VEE_Hm)EJ-8VsuFt-!R?zz7Iaz z236U4{1C1315(F#CPXgm)0Y96nX%Gl#$2|pqg`x{XBT#__}~~^j7;rVMfY{>@9I$u z{b<~5sPWGJQ2QBtmbEY7v%I}JdmdLE0KY5y7Wc3+yTm>8XKNixJ)7i`!(5qTVKtcU zzmRHrA)dk8=Y@FZ3riour1JtBs@q@c(B6IDxA_YEyWY-&`k`v3A$bm5@csf17@<1h_EG_ne7JC%47RxO1IxXH$GTtyTLxD%SjK-sC0HopE#F2$YyZ7@3dK-mLbstdV zuB7g($@_gFM2wmrJsBAEI%>yKF)EdYwPw_AK#RXz#l9V~$fzKMID|9m)zHJh@yH(# z$!DeG{tC^}8Z!z*^4N?N_trIK2Yq&Ti*ax%_A?#lxC6M&-dn&X(uB@j|25^|9jryq z+1cDFjN^C%X{yXD9OqR~<~4@GFSD64WGk1q#J;WrE9I&I1y6-L@R`^bjX?D(&$09M zUYt(E2kpHaIXIYO$FR9}>4KDh?zw4S50^J!nAvCNdt-_3&`X)wmvr%XBmZD184!vvr30Pz#6u( zkn^4DOnht|bu?Hvh`rE$1-VS>nuw2GkaAL&9XywB8TU|Cf+|G|C^~qKya=y~KDait zkiYZ!dozDa`J3%6Ecf8ze?_js_Bw3*ZYfe0o>Dl$r4<-t#C*HXZ@d4P4*6}oqiyjk zJd}GObI1+6zz$)&MHX1i`CNMUJu* zD{k0PuwlXZw2aC|aJ0pHbgzwvf+*#$;7(Bp{ql0Ze2*e8KdrUrXG-^%x#0>sCcl5^CLtBejv&nZ{F zm(Wc6121a$7Ozmcg`+Zh4g;X)>9_ekN1>V3bGKr*tdMJG`j*9!2dmwM0hgPXYMH&? zG*Q1VHJB(%y-YyAl@-mlK1#o^SPsZr45to)1U3S=%jKJpl~G?K4He%T#%ah-4{`JK zh>nacl)8~!o&7F&KI_3V`CR-Ea=YG&3uZ4yFVh@_@#cl|-e;j|eRD}g5Kq&Cr?_{mueWlhY1xz5! zDDoDApz!B#1bOAEF5nHkTq!^ZTn-i8&+iFRhz+W`g2lGWC_olpK8w$)#^OW&{GG=e$h_Htteh4YtU>|I$omq;nrI5nj* zGbz)%Q-&SBG=5G$jK#YRGbbE?j$b!C)6o{(D!y8@DpzJ~!m#&T8HdU`bLH*lXD?ucbDfwDR+B<^s;xWcW-o->1)VvY=b$Tdc@8>qVoZgh ziUT5u-`5j2-{7}-^ly4Qh%E#oDLKE-WfOQ5o~VzfDh5u8Fqy=SpGWr+%g98N2r?_O z=2X}Ix*kzkK`vz_o|0UO*D#W67kH&coHM4n4pjA+St2hA7^*s|0|DSwA|*HhAloU# z$#aMbR#HJ0Ye_EL;lM-y<9!g7OqMyOL&qE3K%XGH5Xx6h777A$hc*I{64VUb1DRaY zwgOHU;^olp9wNE;B<=c3Uq6o^5hg}sr5vG=xh_C%{zT=v_`b1~&+{CrXJ&Hln|Yf% za_snF+sUBskyLf}qE;zZ3I=dRo^fdA`H@H@&~z%mD6NcNw>@Mz=VV_pvv-~mx#4yA z*Ji~Z)E@J|vlivsgLAGgxiMUkR7G#ISJNQj1JPzuZIW-;6wM0)p3=O~mP-^tf^!m;4 z^~qD^*Rfi97Qe3dbx6wEU&EewF+q8=2wW>k5oJ%X9I6S0o)#^K;m#&oZ$w&)ETC5Y zC+*QS5u!Uow@*Lw(4LK!lGWYM*8#U)?Vi*~PiLQ|64SeE&9!3)Mv!j-PD7KoSwSDF&;k_7zL>w|%KCd1qbZN}b#oDKwsImVqv-Rpinm5|h2 z^Uh=&OGMIgnw{5R>xX~@q7^%5J}|}tJITqVGUWP>YkZWX(T%(|BRAPlIpQ>K4LB>U z3-m5<3A|L7GPfWCq`B)+DuVY_$C-5UY_?z%&upCq;2l9D49hA&6qh|^&(%?x4&6X%OtLA>cTZP?j2-{s zd5E-X%De&85wIQqWYtRD*o`=G)Kr8hd>~nlgv;^xPgK=GQVKYDG+B<7F_@)3Gj{S$ z+ciI9wG6r0e1zE&vfOY2MG|v@3FJspEXhbx^Ql0R z(;HW&b$59DwSaiea@&(#8z6)YU}uBdKCsi|D@6XXHcUW^QhjxDOIIF&jw$I69;(j_ zDV%WE_q<{9Y_JQvTxdj_PgTe-_Mfnz+S9F5>%E;oj1Sg|1E-s&TD(J!3zy=sq&#a% zQTY%5hs)b22 z+8Ju>acP=sWHC>_p+@N#{1RNvKpRI6hCIol5U_NZA!gS2Yjtvu;V}|__4IbO@Ob1z z!(6Pdeunut_3e*$K07zI?S0s*$gE&M_yqbp%&Ep_lZ{>R&aQc}$F5L@rY_={9Qe#y zOdGg?zjnoz^Dqkx#;2EWB}A02=_E_emib(^LwRD~sGP*nykS^JGM_bb*B!l0gFWdj zOu4Sz`mAq%qkFi#eUW=uisQ?h$u306u=lK3nnPcfNFs%wU0JrzpPj2}wUx+%n9C%w zz=2kkb#1$1%lUXd4aQ$xzLjfNT_f|krQ|4^@5I+IVC^(R-F<3*vhQJad1$2L4&v63Skvfic;HH`@Ozv^qdm<_M_y18}hbDrF72F?AY*(>*r5QztX zEjRzc6AvB8`Nq=YyOqm4ZnwW-Q(dZQyU9D-t$VL5O>xMKb><0siNAi{MJ}Uarx=Sr za$~_UGR8umHWv1J;+@+=9dDLFBBxkV zgQ9KoCvYRR6yHKz_%*USvOgAASJXkSjSl8vfJ-|J=cBB}`-iKIdnOZYv{#4W2Av6L z=d8nUN{;W=XQ=&3n(~HCgjnBhOEtJ;)_F@oV-NPCC+y`D`Nm`(q>yNy_(?nwKS`io zsV9Dt9(LS*x}T;+H5E^2(8 zt|~dcTb~?mr9RES{EW`#>9_Goq{WOPni-ctWO~w##4J7}b-cibT6EJzU;i?H)8+E~Hws)Lg^^td5R7PG;^T@qf>5#+ztHV9Gyn=pDyd3V-G3+DTYt zX%kQ6VlP5}0sDf-I`$>hSixXuvX}NY4)!E&v%cvwnD^F`Jl>j~WR)<-O~1iIjoav9 z=p>X~OtJxCuJ_89`Qv!2Fha~~#~4oVg;jEVw?0Gd7pEGx-PccKuckq~3-C4B*4??S zxf;g>7}K^E9x(8T|C5g$fDOSbM9*G*ohX{_sNfhv}xLT6mABysz22>T*-Dsa_<_gsA^S5kTYYKOS1cTeRO<`z1DtYuA$wW8 zvxm*Q63DYFx7;A}1w>B{Ogv}D-p5$Mdd~;vtUs>57)7pFZ>*DV} z0j8krIDLova{_5Ua5#}ZN9fS6OljKVj3ncVQvzzaugkVZWJ)PRnQEMfmMa7Q2lfkg zNB;DmI&&MC=FQ%ZS+B7E1-mHd2a1nD@{fLkxT6?@+K0D?_Qe=u zL+xk#H&(URWv|pDnR$FOeW2d#1wicjE;Bl(bE~^MpFAM-Z zjgJXo^WY-6uKj4v)-wE^LDpQ6W7J3pymMR;M3GU!Jz*n;Cl^%9FI|-{tr%Rcbe#y$ zMoq{q04VnXEV0fz9MkQG49DvKMFkwgzuOmQuN97kkc+Z!RclpQc8N9TyVjg+joRCF z&>Ea|ZTb$XypLnP|Hi(5_ zAG~#01q(Vq_zmop0U`Y#M%_h?b^K0b&|l{>0Hcqp_zF4FhdSQK4&$mVY)V8vu$ARk z`OGOflKFS$FMEt&G1U2vKwvuytGRf}`z{HXBGlg+DUpg05yUD(VwI7MEC}Qncun(E zAnmiLK;RVA&Yo={TTd(Zs^A{+>fXlJ5P)-#41%QY>uH+a+xV(pY1t?6cxYo-#u~DiRjGTd8^*cJ_KSwTrNsa(Cq!rqzHfim`PIW88;ik9oE{Mm8AUBIznUYQ5E znP#q#FNSQUD3n+VIeNmmZw+!8@p={tH@HccX_+7cq8i8de+ydKO38QM?|(Y5fqjfV zu$r{3gnYpLg7`!}n$;c8}G3CFkFzAKzT4!pVhq z^Ep&`Kc8#(droPEY7O^!{ImbUgbsBDY>mT97{5>JetB|hD8xl-%wuFp;@@EUKFv(u z&d?ZT?SkUCq0I&@symS;5jyowOxgTN#f!&h(8l1!H>(C>zuqbK)ImHe==e>bEWhqW zhD3KF=?z1xSv4|W<5%pPjT4n+*C9+oB(AB1qJqavY``)P%W0a3eUn=E$V%@x&Gf(+ z2C}Jn`w->^URgNrfGCXH7n>#rUgj{NALwjdg|qb{VH3_srydTCFGUb4r3 zB)hP#C{l)UOHY;=OG6-6W!Zml#%CkGQc*E-BEq5f_q{izTl1AkV6XKh*UjpcytSz8|88;%bd@Pm2a>30_L zTCTGA-tzcRxtj2o`CQu_yc@}}Rw<9?Qz(Bujkt`z#r)OsSIu9PzY6|xv?aCXGvmoM zpB?AhT5fA{m(#UJB) z=ZE&cxLv(1es(?g-_XVqY=DX&Z@T@8Tzbp$oR9y-1^mzd?XSO>qu#MUr4~YJgXQf! z0xKAgSKWBjYdk#KqHxjV*gnm34G$~%>%B3&=upqv@Vfx~Zei{pi@>T~etKbyeo-F( zrD6Z^qMX}{^3i&F=a1Dd!tq~fL}QO~v~H%T1h98d|C9VZ&EJ>#dzQZ!_#5Q!2mFEO zTJT)UcMab)d{^_0x9(@E_{NR)Gf}>AnEgzI?+D)&d{>l?i^I<(@TU2TJP8f(7vPt6 z)BB=vu;28yXbfB)_pW5z^4!YS3;dz>PW(>Xl{LiHkBfoZ?EQ*W%;b9X-$=v!`;Xn? zqRSo8d)uFyEke)d?vq!3sOoA?!*KE=9n-(l93sr2J}dVnhr z89)(84N;d(tZ7W2^2y^8P~GXaT4MbwIKLthDKIrM#8F%EaNp9)ma^roM<2qL!|$oy z?Pb(H_j3=}cGA%v`A+l{qj&lS8S6!qIw9w-hV=usANMj+Byk@>=EyKfB>g$fXzI^K1#ZE%(m8N7T${Y zO?;YD30Ib&uj!~+VUHHj*LrmCqdxi=&RuHSP^FrrfB4jw#XkKHJf)j{j)$wT#x+)8 zZ4}2cA8TuQ7hnzl#?g~uO)nkR&H-z^JwjR6e);tE^y)c#B>P1_+IkVTX{DsAP3N!) z*!wvva{&1(!0``KhS?VHyJ~8H$vmFrI3}FyUje_tWj7dOPTQn=Ts90CM}AxS z{x-com-o4j1%>=Ob%s-}`+0R%^Q(p5CY|NFGfy*t5bBvFXFkM1^&HsTUj39 z=N2%xvgbTk!P1?rdhSg9I{i7_MHO6h^^-qe8~Pc46a4*}zt{Ma(`bpKXn8n4<5hoQ zmIhLtw$6(N51icS696SeHNq!V6_ zXukeP7t!@u;vkg9Qn-dUB(3ZTmAKS(Wy>x3p(@vgz1tQV=_CEfigw|TzxE(#aCwk# z_ncNMP#r*2YM~0P_Y$s93Em7j;%@d(z*{W-Hz1ZP&4IX#m<>CcEHIt?A=}^Pqtu_r ze#hNZc1f;W?~eKEMbGxoPoePlyCg}uk2e}HIdpSu(?+cKQBCk@oh#YXtzRz1uk7(k zb*`t^V9ob&{iuG0GWfgBWWFUDEGCIlcTIr}3GV^CRS!0}hYvh-rQc|u(^R>79Yc3X z@d55MFfwwjXmLe99KiS_Fs#ym!{xJEZ(Mu4d>2pFleJnj0yV98KE_uVGi#r-Q}ay| zJ1~Bci}?~?QS%z8=&0WKTkj4`=P<;fO1%j#x-)sbzZ1<&W+a$w=dj=#h~{zJPf<{S@lmlR4|~?`G0#XZZ1AYDk}I?}QFz zI$7Z{4TrD1U+xTjp^)8w_=ta4@lxgBu;N`TsJ*Sxo(1NHmxW20&r_O151K!U%w{Sd z9{xBjxPw{q#b5JhvrKDlCoB`zuvx%i!G-gb7!!R10TF<0iw@V76uZ11kg6;ARjzLl@Xs~|swp*sOz#@gg6|6FGuVjQF5^m zRarkXFOrMbVoN8pGTa}SGB~nZ)v!=l*mBvjeu0bi^_#^sWp9xV@YUri4<98uijPm; zl6u^Nvn1!9y7WXdOu)#|~cHmE!u(ZtK!$3&gk1J~cj+sT4>NMvCE`rRcf< zd$<7XM0}X2ajO1QS@~;Tue{vai-xAS{`cwc-S zc*^t#!n2zVg`(Eifu~G=5WKTC*17R706P)ib)}%d7iLKf>3PH`v-9h~h>vac88_+T zm%gV!(Tv$ueQFBvXN>khbe=u(Avr!8yOiN>n*Km#c3j@+b4Bp;BX+~dH+EyI!r^bXx3-dyb5~m>OQz-}UkZM~=O?tbf^IcfLdn7uMO4zi;lYwsnrlKJpfI zvY5$ouE-CwK7*ezR{hnOW>DMUWLVA>q+GZ}Qo-ZYu9q`O!;by$Q@0UDxqJ?LkoLA> zpA&ejRP1l$Qe_RRBiu%aw9T0tcYkl6E8-utv8#w(jVnEm{nEY(zoIUUX0zEt zqw@PyqK_3zbMcNb={qk57(E61Swoc%!@Bhkfq^&(NFXyi^{^|# zN86JOg7@_|u>NZIPHxj|yDN-MTNlM<7Cy}>K~BiUwk_bDgJq;OU&;6Fzbih+==cFC^s zdZT|bnX^b=pIVsX&3YmYY@`s+Kx5(x4didUOHlpO)a!2F2hOt{(X&nNo=kC3|Hv*kBSQ= z=ZhkP03CH8RfyKu6VIA!LA2B0hJRJq2+GK!ym%jg`G@>tVQVZJ!Z8tv9EYnL=4;Y{ zcp1j48*Dl4MUEccDv23i}*5;GX&nIirNt&a6qBNnBevtOW2QSOI(!U?H01F&KIJKy40x3zHPUvNsAK&dV zOB@s*2pWEvAJ*_;9$dq}%ag16pb}lf_vMoh)nfJ*cL(!HPXn6BMxGbDehZG`X@j6c+|maVZxcJG-^G z@FR}Is7-Zu>KxREtWd>$hp$t{Ncez(jJR1I-gobQoyXVKbP?@@1YNHur6SacqpP;op6 zlWkSpyYb$Bi^kJ59cI6&iWPX^wQ_F4{B;m)2&)duW_{(9bLAng2qHnR9M5uh!GqvzGYvCjU zR72yW0tHRSGjjy;YPIE97-bJ5ml|(<;c^77FA^NrG zd^JS8-X5%-k|qkH@9#fX8!%;#e8ymN<1UKV_<#>V8G!Z1V=0&|b+@ zVFXAw1W97;(5gD}Fd(I#7*0uJK0mh@FCK5#z|0JSd^(Z)C1%yc1fQ7X__VUxAkqQn zO*k68PRuD8&5I&bW#knBuLyO%sqM=Wfl1pHOn8>APj0$|2OBIwlZ2>mF9UPud&qKG$=4n$ObwM+^D; zEPtQg5U7;TX1{i;@C)63PX&Y6@O;j6yeV$sFe+9$--T`I_^9;R zb*?syr9hquZaLS{Gk3Vy!U_nP8XpHTYp%*5Nk#H%PTnG5>qo@r8`K-N>*=-TG({ei zCe_dy-BdhlHG33t!l}DX-?awQiIgHLvfj0LU!-{qBco>0-%@%P-&0|yYFWoCTD)yR z1{k*Nhh#{tmg@=BX3_L4KPEKgw#15N@7+Nm)14@!4QaSy6+qQ?E1bu(HA*$0UJJfeB-@2G^Uy0k2v^A~0ZgleYmEI$i*KIF^9$m4 z;+8V`u9Yn2vV}5nxap6$26}3(GCvgN$(bP2&WW(;B!`|PpRj_>?c_;eg_|ODq8hng zhx-B5>w2Hmssr6R4uKWwJ7FZuaex!zBJ3agNsptEsQvEDo64l`!j84$@G z4`VkVv?)GQ6$7te8LP4(w4cZHGZh)gRLz5Jk^mk!LpfmYlU2CROl}}H6P`1Z*=N=M z)e--`5$=mtlNP!r;paj|^K+TZ{s2f;GP!PUehIblS_l3{P`Tw4sjmt5HR-FKHke44#V@1af z$INdvJd7vKa2{Ist2(yWS(k^}{hGZ%4jQ)nD}MV;&M+WZjkxLyWQMHKHM133)(w6q zIwoZrCHu4vyT*3E_RZ_@Y{kPA4<@!eMLCf?p)7*BrKaZZ5gN z+264Y6e~nc$EBj#YeF3tTDx2eTO&iO9c|NUH87O<-|W2)V3k*W|9?V5n?_o&Qbk33 zOSx@m69_bIkp={k0BI9QA+*%eB{#V@vI(rnoVSE)~{AWr~iC-|KVEbDsO$o0|aYI=A1s@XmRjb3W(a`}}>*bI#{U z5jF~?Zb&?Z!~{yX*l^r!(kCWtdB47 z{g=b)(RHN%GF0F!KSTnU&7u{F_wi4)Ud5N_4m{a#NS?ju91rr)^W>lp4ZLvLk$wlU>Gq){N9|fGoa#jQXa@MyUi&G~Nq=PI`Z~dj(P@?)GkFS66eBaV9H@rwvnRop3eBZ1uH^@E! zisI+C3Nl3Uu8kJ>b2jiv@?l6PpH|lVbFZTPoDy38Q$5@KsZ94?)YDSF`FO-+!nBxm zHE16*;mY1OvkUI6U(zkYju3^_TPx2XrWfrgia~pd;*35;VH%v@(sHLL%&SG+e@xi7 zMJDP4?Rvap<#n`vl+ZJ+S1>Nh_%i0N2M3V(aXY=Mex)VNQ@^_svFsX#+{d43)#DJl z&CnD+K-EJd4&MZOeEopp5Z8C;A69=w7BDYkO3awUZX2qhkj<0`twCp{8$YePai+F( z<18_~sJr|ZpRx~0W)gC_F5a?J8~uLJP6%{hr5b+34~ zVfW!@8~y_PCHN%R1O5tp3Va&u1)l+*{f}oGKKI5iH|%2mrzlrC>xM0QvH7_4PIBsI zi>^F&Kjtm6bp;ABpPh%&=;d3iW8W;TCc8#jSsyz( zCTdE3xrxutzl_-d-b<^s)5ydP->)dx+ue!UJ_+wY-_1Iule-TE zf>;;~Vzd{8sP{8TuwD*`m*$C&Kg0ZKyys=P zdIazYWaBjrd8=O*v_)xr93naX%nK9f;SW5ye7oV=%8dOa1C<;kMV8ZCx(w+8FMICE z<{j4dK+g6S`FsmX3eGHg-PMu$x`ohwd4;UB9NMN5;8fXP4|Yo?!a5xe_MJ z2eKZ)GRb)L7@9SxB=S@u+=&KqDLCexutX&hOIt}wWbtnO_-o}0FypV45^eZ~&RNxe zkruQblJIZHn6n=@J?8A!W6pjwMwYF=`l;oImJU4m?~;$wQ_nxX{-|1CiC)%U9Mi8H zo@m%C!_H}-~UZ;u)upSM0tIqEs$cpa{2ZdpF4pJw$Q`bWv_AwDt7;HBp!9B@3X zPt(291fjVp_pVXks@?87qicnBdr@Drd+eK(Fm#I(&gw# znHK7k+Gv#XEI2B7?D4a=t$RSS;vKp-4FlyJY1B^GE$Q+o!Itz>|6npDn!!ZcY2DuM991f>Xf~Ccx?eKw$1gP-&uJEq2patYa=i7Qa)I(a%8M-BQ#Tr4 z1a!+G(m^6N-NnX*iM+IDA$sDo_2sArYuJ_FMVk5jhsW!~Q7B9=)mueGrSDGRPu^Zk zdVKaooK^PK1M=B2UXF5Aw{DmAC)dUV6i&1K;|gURjs2W-c&OW$&ZK z@HjQF-#FaaaBj^TgeyYB# zMApmLp~*Ld&z|~laP3g~eDZS-1JT9lyDnHw;CLjBsQB`Od2h&A_f|%?4UF(Jh()WS z;<4zuC&#~CG|9aaJyeq)V{VsI;x$Gqaobe?T<@yc{?NF+wX<+x5!5125X?ZKRa7aKv5;@KeSKZR zlLLVIv9|AueKPSqbvdCkf73zg`Z4CiQUP?sJ%{G{u^ZooKW{}_JtS)ZPma=S`Bu%b zexB_cElKTuXmE7?%Lg^gYcwPF zdV~-dh%?m5041$Wlrg;^U-z)}fb{Y{uKK6Le81xmOHe3|etdR2>xrU2+me8Pit zoWHhPZ+#K{;UXl%J^I5-ybpL7L(4_;cRYTN@u)z5_$sk7`omF+jbd?6dHBF$ z>oC!zNED0vI|hb|SB0*XcoF zJnP(j<@+RkFMLT40250d_1+JBO5cx{d%{&Oe1!X__^Q#9&7!hewhGhuq_sa`1eHu5 zCYEHYh^9neE53hzT8dY7f0husPwJu`_@N%E?b4g5y?jP;u#^(d<8J2TJv$4~=gPAf-r|!yrOV9PrL+f5gt(IL+JfGmOsN~M)9`iE!eX@P( zlO{vYNf#oV+lZw&U-$xlpIZJ^`A{8mu><<^!v{=kvbmGfNG447AWlbLxunN)z4J>% z+%O@Rl=&rh97X2&U;ROGN;&m&2ARrV*9D7 zC~dwJ#qR%1_HwGthgIw@r+7^2j6!yHX$4Yu!q=GoN63*n$r0+ztpfIApODn;)2U;+ za|{VuVE%_+yoXoq;D66$0Sf>$a#2a_#mijQvO-OhK5G&W)$~@!kSkOYFAdYEOyA9d zNp#4!U%dWbe?Nq!IwonHe_}9}M+^Pf@N4Kx*Ztpwd-c$E-9yw2Rx)Rr4v19{d6Hq% z9;?^Q17>;nQZhm8H=e7!0*R~}&WD0$~q6X-+x#y@$jjG0RZF4IlF^rLdemjd`p zi~Tf2>&K_-?3nw?fj9HyO>5AL&y9rsf^@!obYAIU_zr29#(Uo#-LhS>dl8)<3)!Uu z2lU$WxL_0}k)!aWhkUc%;KkK9vs;4B`QPCAm(JhH=w!$jOL>`twah!Y)_Ky;X9Ksu zkPI>d@)b1Q>FJ(+?B;iiAn)mBF@8uobrv!V3sO*LP`kKv;IY4x!J$kVrT29cjn2~_m+y@xNmpM>2WW~2t0FQ6tOeTM4y(R(B!R$B2mb8<_Voj*4Ish zJhTx2{laP0*Ci7ej(;_rmG3~F?Ur%T2HJd<7fG_dLXBjD!^`plHhg{xSDD|)1FBY) zr?0gL{`B*-J}UQ(8}uUmAY(^@rXwRTipE~U(kCRd16Kxk znJ;*=KXabjjHxn1ou#t8g_bWq$at)4{s(`dA7W^#)3hzlW4}0tQ&F?|AeYPncpx78 z#qk`smZh?Dw~Us0&G%4FjXT9dOYWX8q^dF;t^8eM?ih*tj4l>@KW4svu*SJpE! zGku_YNgxzzBD2(2>a8>SwCKQ_O<)odbLz7~i@f7wf~qH_Ed%$nFA74bcAC30x!LIl zs8FVfk$ID2;oIA=-A9e~zF~Ix$8?#z@F9{fj|cJ&;0f06Sy37LS)OR67dvN{2(sOT zrXRT&hV({zbC|t0=ubu{9_^(^Vcnr#31##9^hdCRLZ^IpoUVbrg;o}M6GuRM&kQNZjs);)14 zt@gD>p)#)^*^g(nY||_KBNlYpk3So#pk-vODeXleOn!fRKwMq3Dl1pf}$Z7V$I~&G5>e){+ z_OE#ADM=RXlh3Ms;hb(-dHs!dzCf>>ow`FB!GXD(8swxs8UNMFXB+;5jGiT<{W?cF zZrQlcNqWhJ*|IJno)1f&&xeJO^I?&;<>XAqfMdWh;23ZWI0hU8jseGjW56-s7;p?Y z1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGj zW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZW zI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5 zfMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?* z3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4 z$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$ za11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#9 z0mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s z7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8 zjseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh z;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH z1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwN zG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG z90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2 zz%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y z1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGj zW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZW zI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QJli(x>ypJTu=;23ZWI0hU8 zjseGjW56-s7;p^y4>E9M=?7*@^rOHVY&r(V*elGkx#niW8$Chcf4Zjz_Yw3{v3?@#*-f3(3_%S+C4>P#2I1MY18yLby8I$9 zaMbvVcC6}-MN&G`ZFT8vU3aW=b+gVzg_KKMYC$}m$DA%c*)X+wx-6#4IzoxCcSD-VrlH*z8EbqC$+TU9)eNAL1X4#DVIg? z(vpn#W@G7!6w#;aBiV?gbDm$iwDM#q5lOF#g=o9Iu~oFOHTeaIe6ak|v8r6<&~1ih zOHo`e0=HP2hvFe?=4g0_%U zw+>x(DsBizr$`>E`@_{USLn)TWjkW@c~r@fgaZZN*0`+g-g!-p^%XX;eg(gC?*Xym!QyWow6A#=t8@beTk@a&XU#{Cat>RNSlt)UTrQy@r>VALy2VX zD$}M!)+=NqZJS;N93W!zP5+)vrb5ZCkn|!RQGVbiEF)X5+PbNYo!zT-elnr8@ocy4 zkwfWNwlCcqqBH4>T~EhSOtx)N!@QRH^Xgk#m+F8=l4)36e?ghWOX?d$XryrFH!N&i zjL`hT9+E8KGBqTUx#$cp>Tg?vGSzXr>`IC&34na z=sQh6eM!N;C7g(^4=F{Rk=hZGLG^|OGGOTuj9M{mE#>9B5L!w=>zBiD$BmnW4rd^BH(ziD+gLG-uPXNKe(A zwiFYDs@!cygz3y28X%o(TUR2}(buKNqpnn6wv#I}Bg&1_nH1x8*2tJJb8g~CkL?*| zN=Ae*;|UvPz^m$Fvb0*l&&Co7%s90yp4CySg|V!3pz}JVLvKl@`cg{l%>8{#6OwCH zGn1#ts@VKw|2zd*>04(^jV72AbOj>G#IkE_+-=@`BsXVTpyy1`X66r=_eIjZlr!VL zSMp2%uEIX&$IP>&o=97$?^v}omP)3xvqHyFT7 zLb=dP3TB0Ll?!Jona}Fkft2N1kLY<^7o7vw>j|zu12(r|s#>`}MGR+({VOlOsJSxr zp}aX6?K9I+RW6Anb@J^RGH{3V_>PgROJQ#$37?Q$(+gq|`t6uJH0bH2y1QZN;)bSMXF#`#-BMj$jhV?tW4&w4{ETZ_=o%eR zqz!AX+S(R2Etx;BN%!w<%Nm**>RKD>sT*z0%kE{O8nl;i)81o?8UB>Iih^!!TC!}J z84%@GEo)r7FmS8tmo(37T%5C6dVBSZnOBupF#yTKi#+N`!-+F#dUGr!1CitYpzo*Yr1tzg)hhMKiwiW|Hs_jjf4y24p>s zV*M%89Sbu#7M1WbUGvjNjGjzSUn0xcPDdGqAv;gW#XmeRo~I~d0^(PdM>@Q5%Ra?1 zA?u0v=JQ;w^Ha2Zs9*7PvR9rQ36Hc^>--dzrCRDo%#2Q`$j%U+x)MpEqbt(mx2^`* zL}O7eKVDtbBVDl5pbob2jAr}I%ayuZl_)h%U3R&;eAKwohK7dG^1H2CwMeB7Rm^Nz zaYdQBqq_ROmMgdqm5Fs(dv`lOCbg-4eq~6gD^yt-Mj8L)R#m88)u$5tlbJpDy?u!U zm&v{?BZ+CVo!!!~a}SnnnJzzVU5UslnL}60gO0tKu2j6&_pZa0=gHQth3ZW}escfq zo`vc-kn6*}3)MHkn!we@u219<$^V{l{FKug{w?bl`E-~j@(S!8$ zLZBzVtgp8@+1uI|yDt`P?e1HUjxUSwIIHf8^e%{XG)L0&Qt9T%BX{-n-qn|w*SBg} zEVZOFyEwU~KBnW#zL`;ss9WEpRA;w5qMCHbl^(YVYx)iMES|Sm%*MqF^nK%Ex*_hD zY5TR=B$Eo=WvNJ8XOHw~ot@ov%mlO3XV0#d2Q+&>WA<#FDSMCm^a6M38ud@O`{dUa zs?PwqZa%zFEd!+3i_Jw|LhhA>RG5ABUHqSK0t%V}*pbN-)Ei z{ao`>yo#4kRck>n@2l>=U)~()>#8;ElVE3%_^e|8UX{FT?K5dX9Jg7rkMpK%Xl**q z?iT$nHY2Z5B~j%{WHRZ_X(n&%Cy@BrWmuJnXS0bIZ+@fkNbhV_#mmBED$^z}HZ$b3 zYHg%9Yi>Iv zI~ITYzwr{}W%?(Exh{w%B)>425(-s@rcMh@pK)u=ZMWYs^9{3_YiG}SACU!ui zO}KgkPNs@Nvvt`wCn>cuoK#`n-UZ{yW*%YpjqG%?fAt$Y-XX4yM`NAck#yA@vC(li zO;RiS!_;)rOgJ`81TFC`leQC@6khG!ua^6@X77s5-~{&mP6pLL(x7)8k=ID5HpC`} zhUR4z5%zEC{ggrX-q4(oyxfcTX8O9i;+?Yd*4xLVc?`-H3+u9bLW*+LFLRqKc~^Sb zdeuyLv7S`+5#G>uvRhNX0w=V--ZZ;nR`rtQXn~U_uixV8owE{o+}p3qULV=C*Dg#( zV_mw?d*W=QmN(t$WHu=dc(8Vm%U*G|L8Z%88XtZdbSS#X7foMbe71gF$X@SdGd-HO z>AYOEhqE`ycEt#9;d`s*Ene2B_aSReZFre%GR=Ob5b0wZyHsbrQ3J0boyekTC&z4i zNcLqCmR_^xF}zlXEq-{5&F&C(U(eCj|InMO^S_J(Y-BI$JG5gjdl3*)jvBuMr%rf3O0ye3cUnn2!cea&~s<@tjC0(C#v zEkb9GLCsGvT{1$3&nH zcX-JR^gFq<fh^>hwWXn#=yruIP zlq4B+A02V#bxb{_b0h;1wrScD^hf+?jE!b8j7Z$&!1kDvMxGZKocWG9L(VD?8mxqaJ1) zw|z`OA1~3GiG-KQk-{9wEtpRVqHk*FRH}zuWMXCmqReM)sU;#E^fc0*gx9>WIL7Y& z7*k-HcyL($b+}KiiKW@%xmNmOefUIEWFyd9ZrK@|<)PG1N?^VteR(n2yslm4W~*uT z%F7I!KCvevQCiQkmsn2^iqG-&sYPE{Qe}Cu{e#~hLKfRh-On-L7;p?|1}<|vI0hU8 zjscGW*B`j5;23ZWSO#2wV3}~HW8nYa3~YGKU24ng?@~J^8SJ_7E+zegtSQL)4Xw_0WR^7}eIq3l z4D05H3+~ghKz$?Pq_#j-(jD|G@2`UQ;*QFc6%t2yIpA$}7(0ugto3Wp$!6prDF=R8 zCuJRw!_WHVc)3dPMzSZ8d+#wxXyGj$Yc}Q-y;f&bu2>q<@2&IR>9SCsO(zqcNdEiY z0ykD@CE4azGODE5I#3B)3ly+FP7-@RW246FUult_2$WvH-NybuX0pgDO17eUiOqZ0 zAZ3<__3L`unUcDZ?xaX{xfipy>%!f!ehzwf#^pt$oR9Zb0hh^wq?Ji_iawG;*WtsK zS3A6zmW>J#^qZvhN}+6BsPe5SY8(hP@LG!X&m#WxL3>esk_)exXS=SOi=lmGbvUWl zRg1WVJ8=oFix%c?B)1^f(mq7>)GFG8Y_~A)MRFBiRzf{JEggMXQ3hvOW#^HNG{Cig z6yLhB3Mz#WOwWI}j16BZcre}=x?0e_lM$UBDije_G!m2NQ#@QCY*@_lW=r1g^j3-b z6|D%vPl&v!)$bjvcxli>iwZV}g6!(|>lYyxYG*%=RIfblMhuuVs@LeH~@ipb}ilZ)QNgp6gc74x*qR zYzEuG4zLsK0=vN;uovtD`@sQl5F7%B!4Ys290SL}32+h&fYV?QoB?OSIiPO4OO=8$ zFb2qPJmy3&8B~IqU@oW!O`sL50PP?OQlKAf0Gq%Tunp`0yFuY^pJ%rp^FR^zLiykJ z{Xyb91P+5E;3%kOcbIO|L>5iV4Njr=5$u2;pI+z%(#_U92mfTAx z6z}cR*Sz_Q&|gvx@Rcy`=EWoVO{Uc^?ep(e z`!PdhcdJ9g8pe{{Xfxk)hoo*P?7gU;5U)MK<~@~XOA*J*R@ ztHzD^Esv_BXF_c5VFsi%)=DHc9Ix)%pqTHmXO8D6-6DKjc@OUIr7PSL;?FAz9qfF= zyiw=bLmCp1=Z%*>ExEmNzEz0%s8zd!KjtTFL-HQ(ASbGKMlxZ|&zjx~5!~yNd!z5~ zVbmKg^LJ0?IFVM$6i+sN_J&Mj&Wpmc$|X}zx_XmrOwYvf_PgauiSW!E%-<(Dz~62dW>`5ANo| zXGyr%%;$3}{?R-p!}O4FWut7NeX;m2=pW_POzEY2LHC;+vWQE8%j1f!-gE%TBoCCq ze97KAUBo;PP(Pw@O$Ll6=%8E_U6t%lN}z7BM+U*58(GtYOn=bZ=;Ym1%|YWTp)GA( zxTqCBfAh=>ZyELBcb2`sW#;TJerR>}v3aFc_tZVO_PtLXT=ufwPmTKffBl1bAAII} zum0Z6_w?WLd)K`tvUYv-;4>Rz$-jMm^4RG!CY@TjyXs9(_KutR@zHPk>>qXh-lEGs z-&N9hW8bJV*?BuBJQ;a>h5W; z{M@I$^Qu>T`FqPhHNO6yFF$|ftn)W)x@^pjPesme9y|UspFI_6{pjjN>f5(nx$n>0 zZ#esfpHF%EojdC0_3Uo@NNjP-1J9RT^Dn;`7k}{It{L~a*2z=vu5aso?Q1$#eDan3 zSM*fBx_ia%f2R5DYp1LT|M?%^wxj(E4KE-2&_nBf_>+kTW7pi?+Wys7-n#88HQ%Xx z@nu)^UETeww|ukr+bwIxzT(ukxB-{o{l&^`H9E`1b4#wV#iF ze#zUfOJ+xX_u(<)o4*w4dDVso+rP4L;^7bfXzacR{^{ z_W9YP??~Qt`<8g-tM`??{rR8V|LkkucKIFE56$_9y8WqNefsV@$3D2?t`qydy5h{V z>u&zxUwr-kGym_&NiWVERrT;^s_$O;`}=AJUiI2Hd}h_p+V=nId#Mk<^=R3h@91cK z`e^g|&wl;A5AFKk52j!D!Ee0!ZK?HdZvWLY>)-d*&tLtY6~|xx_TT^O={={G-}CT) zc9#78{<~g#;xm77|Ibe>f8f2x4qrdvN3WW2Wb!plTQ*O4@TR&{$DZ#WpS*GZ9aoI` z$(-7qpXgqg{`WW3Jo=}}E7XkZ*S+bgku*5!k58+}LV13wt^ z?#DlM|Kxk>u6fH7P5p;I4 z_{gs&R=i{4#^|{*?`eMba}T#ID*Km-ul(VCWmm@j>vgaE;ii`#?S8!cC;xhITu1l& zu6pEsq|3%Pp^aUw7n&cdYLn zw`6qxwH;TT8vFgf``XxN>t49|@E1Sa{_RnJw*HDUU+Mq+j9Zi4*WP>EpTGE{(A*`T zTNa&kYSiolE7Yd@KA3v*6?HFL5WesAAF91+)RNS**WU4piPK6x_RQEHyz9NMU;W4D zu6zE2N7PUMV9zz*pF3&Qr=NcH%YT_|TlvPG=Gdk?8>Vjk{(;Ay{qYz2zBBi4>VE#? zPmKNOo_CD?z{WrA{o9W>rylwA)XP5BpIWu<_=YyqXUNmPUgDBDzpAniEN${Y&)Fz3 z*eRcmcg_w+EA@Zr8>{p~&QOOcrYnWERq||7XenWc{cvvjL1n0?D)X>4#6gEOoEtiK z3q7#QULL**t@V0}XdF4syywPj~pL0x{u>`j0}8f5CH1wLf*vOMvINyo%2mQ(Vot-P#c?DMbdCIJ9qgt7HR?ttDuSnQAikZKe;~dPt z^@POEMT3VtMv^!CUu9uShZYP>CLR8EQJJv$d+76|hHj=e&bb`vko8)<$qyrTLdJLw zPguRHS|qq0o1bP*GMMR>pZCE0%udDpbpe^gYHg|);xe*o$Q)YFwq#=CA6LqsJ?GAN zm?H>!FT9ze`G*aHalCiH}TT zZcfdxxA}5~;l9-OeZ5lZ71>9o=>5oY$dGNxQ@fbY=jESQO-h$`5#I2i-!}ygXXN=6 zZnX?kR!%KRI6MsGj*bze4qKkJ3tenGWF8ro&WgSHwsNWpY%0C;mX%z~=JpEdRJbs8 zJ*?NQ==D_~ZQ2P@B@f3EXkj^rGj~d}GHK$n&|MtS@GZww`2RpS_23llX$t0kQaCdS z89iylwWg4o_o*Bl4D`3pLFU6#`TQmAYYn7aH1lv1imOC`356DT@NMGSqjXV?;Qfjb z+%EoI%!q;fH#oMlnP~&42KIL(a6i|xKY(ek+ehICi~}b`7IP3Y1zLdpg|L@7lfwL; z{Ot*(>7`7^4lmvf%& z_T?>A)$etOc&svg4sBSvA(^Y`wFPfJ>#YWuPj=+yU*>f)FFxA6EA!b(Ch_`Zhkx{6 zhi&E?(!C9xo0zWO(^V5VxqiVpA0eAhgXy`TebVPei+x;UpC2lWLV^5F4RuFk6OTPh zFQ22auf8OqfhTzzo=$&ZI8}2-4rsV=q@VOTmUmA#Roo=?&(80IPd;?hyy-=Q!f$vm zSq3#v`AKeTgRUvL_m7^g1I>lMjzP}t?Amj0_jSs6dQBuRcGwE$O}}blX(z&SR>JJa zO7nUq&beXDr!FyF+bIrS?-&{L+-v!<>k{@p1y2{MN5KI+n4ZG0>9DW<;H%ZRMzXiK><&s2GS zE+F%;tOh-7myXPvth{*bS_x^&x0m%Jo=&7z6uLBRK+|_ zY#Y0jx@qf3zn@%FAugG}i{bdUB$Grn7)<4rz0gK)9&i#HDYC+%S_*H+dzT&|AXU^=zxJrv&9k z=J_f6gP-K?pZJ-v7dw0X!+)Kp1hc+1Prc(i26El;Qv(~2*riVxIcxVnVM_k~Cw_(T z7R(a^uRf%Q(+>^0n&> zGrDHZsUb9>Z+GJdW9pc>*(qc@lF2<^bjv%+r`VFb6UBV4lG| zfO!`42c{ z{mtg$X23RZy+2$`+3y|3l)c|KV#?lV*(WV~re)8#$jct_IRdU_&$#Rhmp$XMkNkSB zWiR;~*)$$3Cv*Tm5Pxv0elO}h8tYBFyi4njtcm$=RHRMGp2L8WxpIP3fyZgH?w~#9 z-oyl3yy*CqxOuMaiknYUDt7WE2-sKbs&5&z3+1E@#=Ln^(0{5(m|`c-Q&kbxoQP{G z8^W z7Zbun+792f#s4w|H4A*;ezGE>!cDEnF{!oytPnN(G|SId^qS53)(75w2>-*~TTUf!e{cxSz^0g%cj%qGmmn0GC2ZV|brdGi}|_yo0hNvjgy zbxTaRc0cTb#)c-gt>`sfNt0aD+|)AA2sqZOzqxxa=6o=niZGqY^7I*iF>-nhxJ}kR zYOg>^%^3awFfM=fH$MFEOX=|5&iw*mb7v^D1>qqS5TH-qrfOQx9VChaI=v3CCtM3 zHeEbr2bZKq$~0}g^?;51N=QWl^B)Pfce1^r+% z*a7x}L*O_V1f`GB7C|ML3tB-pSO+$MjbIbl47Px+U>n#Dc7UB=fHFP}c5%HM>;Zeh zK5zgW0!P3xa1soHGvFL3-N5_`j0Y3JWKaPrK{coWGeIqw3+lll&;(k+N)QDJkOk|& zMz9%d1>3<6uoLV8yTKl?7wiN3!2xg(90G^I5pWb71INJ$a1soFGeEtSG=m9XGN=SK zpcd4FCeR92f-Kk!c7pxjC^!vD-$s5x4QK*UunuejTfq*n8|(uI!4YsA41hC0Jx&_H z1TYy?gIdrE5?~|P0=9!)-~c!V20__I_y!?R31)&?P!HNc3akU$z+P|=90e!9X>bmV zc{}L`m0%{Q2Q6SF=muG^0c-|az*evgYzMo*UT^>$2FJijFbK|pvfn3tpc*7V7OVps z!Dg@(>;SvLK5z`21?nC61!KTOFd0;W8c+-BK@(^ND?vBd0d|9<-~=e!MBJbj%mwve z5oiG`Kmu$4Tfr`{9~=QE!C5fo33vrHU=dgeQeY$426lr3;3yaX=fJpkl2$MiG=X-I z1)IQjuoLVCd%-?%44efMp2QDW0s6r6V!thAOSXjtzZ|}4~~Fi-~<=|XMlPSae)b7GN=Z%U=e5mD?t>b zz&fxAYzKS5L2wM52I{@^AD{x%f))@3{a`cL3HE^_U;vy0(Ihrwx}-beVL0@Q+buo3J6hruy$5}XBN-VcAE z1}p+AK?-aDTflB`2%H3JJ81(UPz~mS7SIk-U<23;wt-z>A2w|K8^Lz47aRsB!8tJgW3(603f6($ z;5aD#Q+Na`!A7tboCIV3jBr5|YzBM5aWDuKXMV^|$Jv`ldRrzOVjK{gXPO{#pG%J+DrxAF3aze^CSK1@&WfN}X2!s$Nw8rUund z)KAsV)EV{f>gVbg>a6;u`jtAb`}a{Lmz9*3j4rvnpO3GPDZ&U3mqB>NkimDi2&ReCrRa`x! zR;z^SQN1duQtDy8a+gu)rBT1H-k~-sgJ8aS4Y*vlGl~IzT~=+P|5YA*%I-;Ia-%#ID-&WsI$JEP8#*|!Da&^hrl5r(3FS(}V6(!?Kt}S_G$*W2x zl)Sp+H6^btnOqVssVJEu0~@O^uVJ-iqI#Wry}C|?)b(nTSgRYrjq0X=2AW&YK2xQp z>URjTayMPgP`9cYb(^{!**9q2DWYXY-X(~Z8F{yW;uAGfn{QNe)jZbn>R9V*Pz%&T zwTP8IsXa>Ftz^BB6ER9JcB&<;{jtcXmg@CDrCRlRpi=j$`?TB&b-y;>gg%&+S|5y3 zTh)8C-6zy;^%v?d_4OCje)Tu%i~9P@>X0`7L48+!kE{Ps=hT0y|I&6+CDf=m5LT zsWbD{?6dRLOyvKitWIq>+n|nKDXX5Wq5iT#y?XQlbsnt2PKspjFXn4E`{(D^%~z?3 z^VQ+_UFzq9^VOy-?X;J6o1w4jzDqs*pGN)@#Ig3=e9jj4$Py@f;a90H`NOXh)p*)O z`%#3~c5>Z;3J!U{X0OF$3s6k-#UR3Jt2SA2)h4U1+GHh`_j{hdo>-5T!_;z^HR7J` zgeyYsNlyneKqq#$i5U@h1F!hd%ox~#N^SfN<+4 zyQbmnrD6vmo(0kn1SHR3dPSuqi?kG)I<W(%g$>nGu*Y|c1EQH1rMRHxs?9Yzs|GQX*NPSTb{hh zqq#Bsj4Tu6fdib3K_(C>-ug6y`UMo>xC{Qm)+VHf5^5@|-nKhVO7J+Fwau740vN z#-(BE43Fg28GX1s9*`}(4>Y^Nww{sJV|oF`-sGCh+Wh-B7r4JU=zar-%(5uglf+-# zHTph!+3TbGjtgJgepI*>kUlE2^pU#HqHprAg(ho%F*3ecJ7u1q#%( zFL4L2O*&>utR%zukP$DFnj)fJI%@*%nNZNZtFt?!!}Lr^QHq>ovK7;(;7ewSU34H) z8-0^Hr|+#vW!CrBBvJa_Gj9m7J7K|0o1W0*;>jV~xwPrN%oijLY)`dhm^}M|7?*0B zt5j0tqz7U@kaX_(Wo#_1aA7pRmLHji+zfGoaAcOw=R-ZPNX*P(NrJAU55+>^h&TrA zP(P$Y5Arm*ai!$njyT7HIfgd_dsnMik6 zx%E4&yGO|I?xubW>+TUhy!!?Gd%O(m-z)54-G5io9~gkUqEcN!8E>qSJ(3cz z=@8AB$AE&qj9<@Q>Z|oT-1TsA1?7JY85so42v%*zK%0(22W$V|8HcP>WGU+lnLO9e zGH2Ktr&rv&v|(Y(6qU1EUc|0(MiIFpc8xVd}s_6t|Wvh0ehSGLVKJ4Li^<&2Zi=FIfeF?pF(@fQK7x%snC9b zm#sp3%VD8?%P{hmOCvAqbhART1GLeszxnse3+@~BT1HNOdBJ_7UgHS37u>fL+&AjA zkbr!_eT%tI_Rb24kYAP*pMPyu8)bcwGL~JZI+EbM1Y+(@Aa)HhC@*%iWcd$Sb4^$j z8#a~VR~CSLdy1{7J;heke(3_8Cg14W1_I`SSyLa!q&nR&B?tS-L3*5bX<4%8>o)r?t%(}0+ z7F&C7%1854DRSaAMX&4Xa;1!hbt9|8x_R{HLJY*`m3vV)kG`UAglXcVcEGL48|nAc zSYYp`FKDkrkTq<0);qK5%uJpGc64OE9ef+P8AI*pzT{<=39!+$Stv5j4n=X zhn(dsC^y88!%8MRFDwo%nZD7#Z^TdDfGQP6$H8GI-_08^18&O+SNpSrZc(?P{v^y? zK8T|*eFg3kPoBITw)`}D!;W{q+zw6tz2{D0MC{;duH}un9&@p$fAZ$e#?9Qz+&NIM z%=Ch4DtQgqn_LdH_xh|td5^In^4_#$sQobE*uFk5{H4;!B@cl#E?o$TL+qr_&X?mE zalVjUsS8$L>aN=6b?L(Srp&Dq?WW5(4`(7y%ba&`f^ z1dov>sj|mnR!D?=|I{Zh?n)e`Y)lwpZ{p9lr-2uh7yDxJbS6dR#lDz4V`Nczu`ecX z%1+XpOM8IN{Py70SKO(K+7F)as;hvt!i&cNod9u~PAFF|3_r%ri#8x{JFQ~!xp7bG z(L;g8?cM8w@vbSc8m}(sQf;;8t#$iCDSu$b*2t2Y$#&aI@GSI zh+I<>3kH(HQZzR z^Za;=*h!iT{OY_F+7*#oEF2Wb>HOM>SX$=RQ{)eONKD>!T1RjX`j>%mhF4$h02d6= z)}LUQ7we}W9)<+dE-oRSi}F(t4}+?S$9sa-lb)jTq^GDo=_#-` zeP5ujFV;oUCk5q-iCAKTa&ld1go{;5J>UoBM-a8ad+7*_HN_I+r+0|l1=0~1lST~J z$Q2W@2{ri|65d6{Z^A7qYJ>N92#o2)665nQM6PJyh!+c&*Zro+Qg_UB$qzR#efdG&AvIaxp=RWb)6EmSkQ0#tM`fatL{Xh#P<#Lk<}%2@lG_%;2xL|iy_=i8aO zAa)*uL|n`+7hX=Tm|eiHnZV|U=i3GRUW6UmB+LK|E4F{c&J1w*cJ{$8C`XbdT_R}W z#VddOB9Ik9hwwE zYpPZt#aAsnjyvMLD}5ChJdMhJgJO1iQxqkGN4=M**uCr@3%VEF>-}Z{_aXO%^1=JU zG@+LWJ&2;nPgL>LiZ(@S(LdGGEM=8g>U~;X%BGqRE=|8(xX{XnaG0CZ0UXYly*=K3 zG1*p(B+rO?AFbW|Wh}k0YRacJwS=Ry%BSjYN3k)$%1_n~dbe1AxqcJfqZQ;Kkqf_H z%lr44c>aCV+!u?#kdudrSG4XG+Dpu_G-{lz{!`gkJ6S$8rZ<%NdF#*{+hj)o>C-!` zsL(`juO(^rx`Sl<*Z44Rz~Qv1OQ^`zGi_0&D@`~fUyl))I#J((-WDkX_8Ai4)Q*g< zS5u>rtZaCiDj%ZtI)bTdlWF;Mjik$P>|I}sj4qQReyx2Vz(U?+LyqTc(iV)5539-k zNpbM%fsVx1B)lr4y9{@~o|(2&*aoL2*x=Kn+m6X&{w+M2IysdO|8{z$6sGlh+lU*N zPL**D{b@t$K~Tnib9AI|`logzR(Hkpx0){~m&x+2(4loN7^e=;e3Em-wDnJoCQ+ED zs(9h7^-Z$&aszx;fJ%VMGXJ|uQ?&NInC9&!K4M=zqyHwH`F?mfA$1K?3{~hR{W5N1 zsBjZ~IL`zX@)2YPs?enH)LW}F`bd<-ImHvy*L=Z9$B+GbVC?u(5I6F1BT1jw8+}$3 z7mCBA9!dH`=Hp{ANl*w#eU{&lb4dPyBy$dF95U~?w$49?^kuG3fSX=br&fW#pHQd% zB2=fI1$R%XQy;jYPMrd!lj~GB=m96j*QqpS;crtByF!^uxwqeX_L{Nsnzc&ArIj0A z>^G)Grdm`Z>aK2BUULhD>&x|bsp$fAFW}oR57_qwuC0AdD2%o7TjW~G zs4y)$?CGYn36q{MN~tW0$tPeI~W!NlQ#+t&9ikAZHI+nT6L_|xM?+3q`y!` zbhg^Shjk-x>1~E}CxT(!@LTAXOPBY}TTg#()tr8#98i~`F1BKRZE}aW`FR;J&f&QT zP%&cI#kjawzlB_QiktE7X>#T$o`lbMShS9h6pwY2x^Ss!4EilhBW_*^4Xr;pw_NE- zU6Zk_FdS*0=P;+R08)sS#fgi{!HQM*98%~Z{d-DYLfq=9c8 zrQ4XI^($e{cu@X z3I9tu3|dw)Zk&G}^ySD@+*GHkzzlE)s0H)D0&q8I0n0%Mya}{{D2RhzkOBQ*J$M^< z2iOe$5WE+>AN;m{etzr`SILjgm>E}Q644IgyL}pGSiuSKY;~Rb^o%;SvZhYGOK?Y> zdJfz*yH0)WjdkkkxpnFuaQnPEbwhof`WSctOm3)CQ^4225%4WAZb6;87W}q;etycz z6#q^6=qyooMDm9JMfnMic}e^}MLOKU@WpGg>)Mr@FDH)A6|M7TF+|!YS%+3C}#INV#+{QC{5{W27f_rmG@8=w0T>#>vpiP0Z!77k=WPj4;dA_h8F{x7Hl1r4irq#FB8;4t` z&Im1t_eK)arZp^{q>EkEN*MHw-RwyvD3y(8^*Um$d@h2Aur;%LBGFjLwErHypO8(? zil)2g_QX5W$xO0~FEAu~Y*-!1=pzK%&5p(v!jdv;BA85wQ`UTlTD~&Mr-`&q?A!;F zEvR6R1^mGb%~ubzSiKb=wB54Bd{Z zon}1NcBkjmdcDq^aHe*ey{6*VPSXjmou;`c_c-s*$^)6wi!4NwWtoOABTHg3F}@&= zVt8p^5|>?SkaS8r3a_OznH4hEnOUZfG|Lhqq7p~Yodf#8IU_kJf%TvkAY$p%pg^8%Hqw6}YbqpfC<`7rQ9tNC^6q@a?^DAlFjn3Bu5I zO3aJErIfMA+O+l)_N745H4b4r~A$!6vW;Yy&&MPOuy71^dB4a0DC&r@>iJdX%`qWKaPrK{coW zGeIqw3+lll&;(Y1C`f=TSO+$O&0s6o4)%h>;3PN)#(#^jK|NRrvS2gV3HF17;4nA} zj)RlnG&l=NzfF08iJ$`1fVrRvtN>Ba4>p4xU>Dc}_JJc{0I2VvV+~9O)u0wE0!<(V zwt{`&I5-1Jk5Mil1ZqG%Xa(&c0XBl|U@tffj)9Y45S#;L|3IEW2vmZ(pcN#*2Cx90sI=j;(?85J8Tm2e32G=pSvUruMm<(z`D~N(D*Z{VHJ>U>H1_r=cPzF+U`| zpav`gD?t<_Ko+b6o4{7E1MCL-z(H^X90!A-^hd-ED#2XP3cA4tunp`1hrkJN7L5BB z(h25*6(9vRf!*K;I0GgOkblq)HiBK?Fc<{mUw~t<5^MlF!69%Q3e5sE@%PmU>(>7_JSke1Q-PBU&$i~ zfod=pw194~0c-<%z#(t~oCRZEL>|<34|X)xyBkOeiM9<+jXkN_LN zRn3a2AXiq%MO>PzzRoZqN@lfvsQ%*b5GVW8gGUKY?>l0ct@Dh=P8w8SDi6 z!BKD;l>U@>Kn-XDQLqkd1-rpMa1a~^XTX@BQQtu=Xaxzd5o`y0!C`O`oCRafkati6 z7J-!@1vY|hU^h4bj)LL!eBN+D9hgP~sMY*AoX$(p+h{a^inhjLIxfG7PE4!k(r9ut z+CYcX1Ugut|C5f4C$K_&p7L}i8Ye~Hr0ALyJ(Hqi((0GY*Z0|{b(&gjrlP~t==U_5 zOs$qrtI<^SQs!&?+^zMS=5(7{EtO9ztL4<_FBR>j!|UgqtiSPPb#zWqH}mea5_zMc zvs&xjlvQxi(kVaD)G0rsty5MvMN_BI(wVQDQ)%s-A}bm?<#!hvI_1}-nzgwY4W06P z9EhIMPhg6^R{0&&`bm}6&nm;lh4pH_FuLA(#B8>r3mkUd;^GZyHsv z^=keD*PFo)O6t|UKdn<+eqN`3`tNmW;g$6|_Tm1>FcnAcoA^5hz7PI!5$|SrC$Ztc zUF!9Nb*kwrwBLiY$3wK`r>XP*S*Nxlx0^WL`%B(yc;5)R)XxLSUN=b>Ti;l-&DXyv z_U1IPthE-`xhYFIBF9$7fL_f`Sz41bx~xWN^Hwnl<2HS-PpQb-uhXyje_5AivAl_X zs*6EISRc#sb!yuC2g0)BfH0<;t3p%c9$+(^2nDZ2Yf-rRX5HOj>h121G{sRM zl~pjDybf!a_-*?1{)|*MjUF4Nw}pAv(clenT&!H7Ka(FxE(OU4>pCG<|(Fy_|gf2KHzMDjLqE+RIY5WVJ9oe1z1u4yF@zhB=2|`hSyf(3zOWOQkbo{a%DjAit=$ga_ikkR5LqwVd_< z%f2ZN+z0%ly0R#@TG3&VGRj1Xmqn&KV6Ox9@~8u{*W%e;iwEyo`k6qQq~@YKQ7VX+ zyv~GF-Qi?JCu3*j$TB9`Bg>d943#lzI6X3QH(py66`gP@<;rgDN+7B@hqbf%HnjkG zD!k7%TgGF*3G3@jzvMH}5eX^C82dnf<=MY^7IfFVpFRYXE1~$-J9iEbx zK+<*V7rQ_*e7j&D>U9&Ei{I3Lv2bOdG=0CWU&CEXI(3DNh(6DdP~IUPq#w}QJ0qgH zlj4t8ibBod#MQ%r%;H@I(^Kpo<(4{WS_fIsGm&e%U;x9|*)-17dOkzBP#z$u4;r1n zl7|}Oo(s`)FVyuZ<76siG=2Ve==m&~mTHq2;Ukwo&r&*I_ozaAtCuh}p2Ic5{ zBD(Gd!t=Bw=J~ZMFN1y~o|?{}omF|6XIDgyeQ-nKeJS!$EZ*XI8=Ai2c^fL{^QY@N z^&nrLWTCdqVcq@shVjpA%5XT0yPvP&+%MqY&&M$SeJ+P_|D8!cyE&-mTF<2IZ%tc& z>FuQ3HSKL^ntZnl>20*``b?lbr2Jde-^d}kA>nc8ZipQR?1tEJ5O0Vb2keH}SsjI* z-W8n>tDi7vXLS?WbLmcRqdB)IJXmf#y^W&s&{NyU8jQI{Wut$Mx<>yRRgL~NY8w4( z)b07#XeIQoQO)RIFArR!lF_6`R+iXLr-eAjo2PdXOWZ^kUO@GPcW?apZk}?5|4lj; z$(^U`(9?J6-}|}^QD~DT zJUu|O!Ih}(= zWNci9(Bk0)WG)yN;SlY};h6R=GU)2jbzo@TbLkl>Ln16cUV4U?F$F(zTwWyz2n|h- zuXAvOH0N{qm_} zNx&Xk1ZIV>^Ze)RP#rQfOsCJ#FB{SL;;GWr92yNUIsVbtIGjGiKwbOaq?b@vA}{S$ zFJZo&^y^+_%jNN<*Gs6&g9g_{ozJC%XFEM6=pqW*d;R5b_C{BpxJo1P^G|TbN6=0; zxLjK^st5l+_Ra>tsxg23r-Tqf)R{bkBbFB*(Y38883)QoO3W9E*A%^JjJ zg%Gl0Lud&tA!H3=LrZK{-dj5eA!M~={XgI5oOAEFFEbUpzyJTY|2up-=lMSG-{(2c zdAZN`c~mg|3EISM1X1e@8f8@H1V~+@-2U|B^_2xxT#@P5Gr^7VL0{enZ%a6lWrx$3 z3(5>9vg~l&3Ul%mS#~&mNkP&x%8^!)KAz~y2U`8}EfZ*l9jT|EN=w43xYAr(UIWn7 zf4(*UveyMvYo{4^aWkH|2B6$ZQ!-<1Kda1K1299DC!Dzkpf#Mi24IHFSliDkGuHsj zkmU)d>LKl!dbZX3rK(Flxn+$%{TWjaZ(R>CL*7Mr>$-r}@Yb~ft#VcGyyZ#VZ;WSo zvpikMEo%i@)3>e{sLN$hI&(2k{haJm*KK;;I;844HT6cHli>OXid6XFsdeZw!>8A+ z%aV5yKD};TX882Fb(wP3(KFVS%aW(oq05w~*R9KvcM(3lZk-vPBab9MZOt!ThnZ`1 zrP8A!>N-Z-X<2IdEMq*)T+1t+9<5?T)@46`O)ay&sr1ajhBn`t^|H1mOvV~n|3hnP z$x2%MCadxLomR_oShX$nxa&1p+)7r~DJME6U(iJ|f|*3A)9TkG0dDL1yMvQ`f^fwp90qfK`D!ZMd_6p3C` zGo>Y2T{ERpM9v>kITGMN=MI&N>X_Yl)g_&I2P}^KzV=j~xiKu;evf`wd6Uj`= zkjvT>@*^t0Pn*kk{S>$Sj%|&S!)(@TAA)!JXFT&-y|WiDf)nQJVm-w^3|qHFzJ zUyw^b*B9e5!l)k>)Q`t3oW)O?IqiKmX-I#x<}1IAWUa-e|3*T4tF-uS*IaXq^+aqL z=f+xKN^Y(broyP=GA`-;yn;+CFyuTF?1NfHP>hTrax z?vck!yg0vlNl%Wm@tivH6Sq1}wAlx>jZk&QFMS^0`g48>PQ|m9NxtXF94IciRQ^q@ zSynHrjv&*oS6a-tfUWCj+6UkB4+HY|XpuoBk7M(DlEC~W}Pp$x`B0@`5?EQDpS z3OZpE^y$O618(p`7)qfGMnDBrLKTdIf#`cY#{@J%5@y0&SO_a%9ju29un{)FX3%zJ z%!5AA4+g+MC;~gUp%f}$9K<0BGhhxZfF-aTRzoLjgkHOm9t;FGltC55p$XbyHq3{` zumsk?X0Yu}c&LL}uozauCg|OlaT$uh4fb_#g|8DTRHmO`sEboXNFxg6HOda3gO+6jsv43!XvHkbwTVJWPFb)X$UzXUss zfCC3M1O=yx#XgfbWp322A8un3mJ zYFH1w4xulC8!8|U(_s!Qf)&sS+M$F4KU6^-Oo!R90G7f^SPSc66Z9HL*R>v|h6S(`RzW9hf<8yk z{@{iYFdmv<2F!&;&;hGq9c+faN0JZtp#mmA5@y0YSPUJo8aiPk^g4<@00Y4dBVar< z!3>xSi=YEm!#daueT#_$b|`}?=+5SGm^NHl$cc5FSjJUiKbUJhm}&c$ZTYxJOWQm? zpgpLp=)^McP3;}>?#fniAnRa>y8;8n%B+wMVtbv|KAj-4ZasijfuD zk(>n0T8r{)*Dh4Y>-hH$?M`+6lJ>H;N_$0nRm-#^6;12!Yx15Ye|hW{Q|l#4*nV)@ zlC<4oPtH3YDAV@mc<4jA-QxBfAG=GpTm1OpGVMUzi95@*yKX`TCn9?R+BcO;mg;Z# zKg+d!w;!hc2=f3Iv>b3H4wTPvK;9`V0L zwly}D5{88+ncmHc`pS}vQ4N_upHj92gC@!1`nqR!*zVjaKJkd0O2HaFpTC)R-s7M_ z_M-+l*i$0+D1BGiJ(AT?oapBgZV)l>Q*rX0OL#m9lZdxWw285%QCr+~nQp5~!ef+^ z5x#W`;jN)1zUiK%l-rWzgC#{QmNdBsF zOOn1|37m*KGYa35bY}QVDyprqMHw_1>$-GVRVK)!idkV&_3b8%S%-`uS?Q$ok`XAg zJpZn|wx&EO)pS#yw0^CDw%jMT)Carwm+$t{{ml#fKkb%#&SV;XTaT%>Gsh?{SSh#k zRbw0xt0%J>TQ3v4SXKXYT(P0e66v zPu5(W8?HGwE_Gsc@yrAp`QKEpwKXW04a%@ndJ>#1}YWuLcIev`#6D-|&_-sIX=i)WUf#mBJy zOXWA&8cnzDOZh3Y!Y=Ylbdw)#lrCm=n%(55%+k8ZFVjz5Q(RGo{Z~4UZhQ6bce8Xh zT}STqgIb!7^14qC*;*S|Y1lSs;$f}^#R zTQ5J>J=!X<@qD|jWmKuRZe8j|A>=NVy5Aa6Gi0(F zyZ$sF!Q=r={*~1ju>Zu5-79eC@k4!G#>216coe_Oc=&Z04;6M955F$sG1y!Eq-K+N z@W_$HlZ`nt_G+@`sp2B5PwRxCQ}z5wX3tj_mwMPXE;XY^P9puE5-;<*%9lE=6|zmL zH;b>{fQPKzH#|{$0i2 zLjLmYp}X=Ywvd0yzl;3kqege-Px?P!DgQzC^lj)+n;2}B8Dk}riaBM>ls({; zjHg`Fmd%lC&&sUyTpL$st_)kYoN!F$%aLJakRxLvc#e#jojEcl-{r^(_O`<-^=YX3 z97SnYQzzMS(+)XX{{No6t?H9>TEpCy=L5bc>PEK1FyFPhE5xnB8y_7xSVF3>x?6=b z!b;jIC5zkeSKliQgB$rCV|B~=T2{9hzFOQ^C1<*`!YjjAOL!@I+J4wDz)}8uq)*un zb9qodWost}6e+ne`8hK@Aya88A0xc39B#>ZZDl2WP(KamVNj5fZ;sr^H&agfTX3?2pMP}wN z-{dX%q|?NTNqw-_16t(HF68d~a`cur9ojj+yo+?uTi)>KEx+7vl`EZyEtXr~W1HHk z-Xj-6j-SzcEq-HYO|`;<*<HZ8!#t^A& zZ&V!1FeUalrpz3oQZkEOwnSFp(l*)Y^epz+>2PUV?6fRphn*SMlCjD|H#_E3x6v_W zdQ)V|EK%imu$0NCIwxYf-A)>j(gP-|Dou;+XN@Vd*nV1NseH_E7TpXr%zed-TBV!T zk=4ua!(`Yfh}Bb%m)4p1NuJg;jWSrh(rM=LRB7sFz?_<8GYV_%zh;V7nSOnzSubql-*W_%ut(EX4++C$a2G_?7A%BlxmSbzA|LieC6AfMQ!R^ zR?sHeG{;?Ri@1GBIMJ8hP9nq5DO*Nk3vpab{N;T(sx#0l{PU%Mjw}N7AiOO(4|h5nf3o_TfD(dtSsL&Su3fiV6Gec`C(Vo z2nnbM{#S_Yjy^S~CS~K6avS^kI!?D5Tscl39F-kOMONP;dn}59n%c0~^kP)$HeG9S zb~AB|p$^8vZS?S?hN^K&eb9`jKkCQzkNWtfK4tQ$UrG6%N!`?UC;iLkpuF+A^Xo3n z?)=ie5f{TUHx4YrKQcsb<$lK3%gdWpyhbcgeFvH{f#b zY#8BL!=K$vK2|?^55Fu@*O8;khj&wt!O@1+sS|6P#dOliM~<%YN`=Eb&c(-*mg;l( zosVzd#qjb1cu zo2vHqG=5zx!35QINW3~(eaOzHUPBTiSfW<5wePHlNMb~H2z5}ujSi~!9p!L_=qLON z&|E7Q0bM5BoiMV{O4Ox`E$5-;?x;Jnk!1aOD5#~lWU#W)GjeMi)P|p)vz%K_Y4@~T zD^ZID+x75u)rm>`N}LrpqpjqJdp*9&&WNvHz(?UXsD=NS25D{IE!jGj7#o&KiZZrY zsVNJF)or;mM;Y2?{Y37VNPLb=!AyrUk&eU1f zb;2s&^^=vMD07ST`CEhN&eFN*mzDifb7P^xq>;0y}^tl14_}l@| z$>gNXF;SheSF|NCe(c7Y(RM$lf0jrG7_6VIxx;l7d{ zBaG|Q93RYd^-X{A%;=eVU)9@{kn~bZ$IlH(KGv`_IQ_pycG$HYQj)rOEHeFKqns9* zK3HbTnj2G6egD~=@R$Ci?>dWJ@-f($KocZkI?RBXFbm{QY=Lzf-d@Tr|8B3)_k%TU zf=ydtb8lNSkE%B+*w1h4Y4TE@ZD4EDmNb(f;oCTxv>SPu>C7;~nC|T3O#Hh-;{H_3 zG-s1WKBVkYhq>E`lwab_&q8Ed!)(HJ$JV5g9Y)Gz>RtT0OaI^DC;2TTpL|IErjF!% zYmsuv-)ydv1+WxW!dln}z00s^0y~t!I7mP{%z=fl3|2uWY=S=J*g=3BM!l!3K6Hg-VD+8_a_Fumo1XN>~M*unGE%K!;Ea zVW@!dkbriW0}EjhEQStP1#4jgXd}rVY+#2{sDug71nn>z7D5NCfeq06SmJ;mDj^PS zFbn3xN>~TIMxiq(hDu1nJXj7ZVKuCS4WLy}7O;UE%3vJS!E~4f^I^o@Az(>FPFOeov!>S?Ng0Iw=2YSO=S-?+NGz{7?ZCAPF;J9xR3xuogB! z-%4yBp%lhJ6U>D9uoPCo+prEcf_5VP75c+KutOL|Kov}YCYTBHVJR$!Rj?K|z-H(@ znzjTR6oVhipc3k!9p=JfSOIHc6ZAQWIN*j6Fdmv<2F!;I$$-dgU!%;EOmh*2ty^rp$%riJXj3NVGXPY z?PTIW5rm-<;?M@OU_LB?74SA}0Bsy~0vp(&6e?i?G(kJehWW4IJs#6`o(r{mw63f?XG1J~NZGn0m_KznRdsue0e`Spp-{L-<`7J`lmeRBey?!Y}>|NP$4(wuY zO4(gg{;IW!>Uf*7AeGZC*(dfV%xNRaQ~N}Y8&7ZF<{Cz}leb(uiF}Hj<(kc-r?aK{>`OlXTk50iEvMEu zwQQTYrTYCzbjoK#nSZ4AClI&(3mS6MmXhDoWG?o9ubpJRx)p3Em5l)Q85u`D<|((M zXy73G5!#^aBmTONgga``u%dx2P5eG!Jx^5I28xxWotJd!S3k)1P(Z%MN&c}a_HAk(b%8uQJr zB%a}J(ftjLpcCCcT_NM6R2 zbQ(tfTPfTa#rtasIZEIz6ElB;u-pZP1j=Nd!^rC91 zgV5?0rH?c|(r{FIjy&f31FiJe&2nXQ~Qu;ZI_ z1GyOex5yC=7x|CGfbWRGqQLI_YR*ZP7}qfuE?OtN$TC_2+0gA7!oV27bcV?2`K zLjIA8hDw;GE|V@)JZCRNldnA)y#0ByY9l7wtHA7OVRmVqlxY! zCEfWf^)E8>WMb{vdKF|)XX~~cH>P{4il)Dq>sbY)CEwt!BHX!QFv-gZBW8G3fuxhj zN{2OQbHZRwXN@*7%Ux4ad$!(@^lJs9#Tth!JAfjTpXzw|{1UZY$HTAdcytzN^So)& zX}a;tjyK6HXCgOV+Ap`9R=@20Qhs^#V)g4Ho{Y0+$%eZ0q^&*DK0J49*`83IK{D+Q z`PG|tI@GomN27BSwqquowFAmvnJJCN@HT5xyKv>wk|g&?d8ag zNywRUap~`o`pj$dT&B3{1~aL2N9zVN>Ut3&={7aO<+PCz){rZ`Tjsi2=aL$i13`@WrIxv_R#|Si)E-He zxT(F6beV3uP_SEI%gFz{-NIJR|IfA?=*o^JpDhfRsA^bqY*RKfd1U(7%avzb-x5wA zUo&NTr%KE6&4JE0S32Ju=zMdf)BE&f^ih2tt$uOf5wzu-1D$WKw3?TzX6~lTtYmrS z>KegR`j)x7%ALms!&I5!pKX&dOrKbsvbh+h*CFK|ndLt+%YRr_`YE?QmSo#r81@<5 z{iLFL7+psBRNcFlrS{iRLG^HHyA6r1%hGlmR+)92F~X(nEG*$tb{1(_+HS)t%S|tB zw_ypFC%v@YMmk(-&zy|9>AKhZlUZMDAJb)-lgLvt%j9)KmNAJuCCdqyImulQmpK{U zkmX4)b27XhPVH+$y{z@foV;GGKS3$u9s=rn-pDP8n|s>LZOZDF+qKm#w`HrF1`@Yk z24f!_+>#e*s-yAfV}udglk_#H$Lqo##q9K{K1?{vn3IZY8JkkFvHDP_ySHplk_wlT zCvkJqN0w6#WJ7iPNpmW{k>-EpJb&iGC28Qs=D5CqNdU~%T!AB#a_PG7~h^UW%8ZdA~C)V#pQF6%q11K zd}|<#A>mtfRvc?tiW(IJ+q8wXP4PB*W89>f_0Aj;OIFM6OtSi zwdTbf^p=`LbxVs(3})*2$djtdM`xvbaB4z)YQCcS=2cSLz}Fku(FENZ^KnZiHCIpN zGmt*fe4tCd=c)E#tuUj7_~eynexc6ja(JlcrX;Oi>f6_4$>V z&b)0xCdO=Vn`(oWZuH&QniO@_H^{%u>K}_HGxbH-d>WIf#>&fTRFL|XYH9b>H&?5S zZL0r-J(2#JRqt%K@g+GUPIlkqRe^7PnQg*1O1*8_ zD9Y>u8S~-ObK|YzZJskX)JkODuDWLQlM=h5#92~O;vzqD zuCRQ(PF-&@OIX4;8{sirs$tf=)Lm~kz0Vlg<&}w!WH$ZQhUZ(beEU^>u~;G#*Q!@F zRoa}2Z#vX$eAD69^xqQoZf9%_rX|$xh*`39|5d?S^8{+ObXYSj_4}tKDOPcn63a-g zf>^EtJ>Bd8=({yLkhH<1dcKxBiw_wjRu6gH%nQd`=|tvbm~*H()i$;;p9h#MsP%$A z&=2~<0FXa3d`~s2L!aA`Ip=x@BixS0QJ;%#&be-TlR3`YKxYkeF1LZLO>>tHkVZDk%I_@M$OKoVxcJXj3NVGXPY?Hu|j z^oBmr7y3be7yvdH2-B%|5yxV%gC9y^1XMy5jE6c%LOaZa*)SL8!$MdLOQ8c+z-m|v z>tPf0nnoF502F~6%Ag7+KmyueCd`E;&;hGpEo=a-jk>@9D26apKpnKfOqdG`VL7aZ zPS^;&&ZYiP1Ywu}Ntg-qU@h- zRgi=kFb5XEa##(Wun{)FX3(b7CSZq3m;miC8|K4eSPAQ4GxRy1azQbKp#sK30;a<( zmFkfI64~^I-|BfL`tN6=;Il&;e_q z=t9zk1SFvy=0gXp1??j03Z*as+F?F)z*^8Q#ve*y0<^xSi=YEm!#dau z{jVSosDuQ}gayz6Z^I_&cO_{;1=PU|m=B9#Ijn&V(EBRN4R$Dlagcy^m;(!88LWa% z*aX^a;=us0Lm7;N1hm5(SP08t6?DQT=yNqX1~-g=@z4Y_U@k0z4p<3mpc6JhpKFK* zZWsaMp$TTdTv!Ahuo^mHBlNzO@_`-7U>qc%9p=D7SO%-06E;DgIphOw7y;v<3EE*c z%!kF$0jppwYyj;#+8=CShf)|1Z7>HGLkFyawXhL-Ur+hK4rMS763`BFU?D7nRnQ5W zpwA8D0d5!p>9Q8dpLEq zi_)8#?C$iA_OAAx_ObSf_NlgB`%L>>`$F5GeW`t=eXVWOzR~`neXDKK{;7RO8N0H5 zDAA7A?3!u$pxa^$(S~ZrXk}WtmbQ98XY9L`wtNu#f=ug&uJ*#R?t>*eMs>9pmRLSq z@{?^pZqw4%66S7MUD<*x)!x_su61f3Xdh}HY3pRL-bVY1!77gI@+E(|y@sZ()&7Pn zWslIix5odydiCh7_Os$#?J*_x2w!}awy)^-Wx4k77v71y-4`) zk1y92V}D_bkJ3iHQLb%FaBbAl*Qe0;Yes38ykD*zKt690Z@0DOnzBczPBhh3Z^8h%?U zTX$v6E>pHUyNucH?#i5LMO<^E2WROl(AQ(wA`hgy?jp5-wYY z-AGP)$a2z?aCze9q-U`u$w`;*`8nx!Au};MSgQr0~%VAO?H1 zn3p#^^1R`>w(^EYo;SR#@h1bbDknwHcB`fREdIFD=@8!RYuE+()mB~7PNr#4hLADD z7}7JuU4%8S_Y4~%<4*8D?T3+(ez!7}M88GG5_%TJAZtnLU3IX>YZ`;@oRDrHJNy(| zrNlm4HB*h*Gqx?R$~hI+daosAxk*Zf^3Tq>Imx}*h|j}Oet)BEx_?f3nYrhtm+em; z$+K%rWjR!yT;!AFvXI>)B{xTge#|E?tIm|pGt$wY8M0$a8)Rx*#+j6T7Q0*VNT}8q zG@l)1>m9x2ym;b-r->?ER>z|YUmi*OdWZXYRff)&) zzb*M2mTFz+uUnvX>EGI20xJJ*62Lzzx)``+=zmN8+4*NAkSG6a|1AAxcuW7=l7F^- zGZIkwb5UB_C)+tEsTU40!m-FwMpzaZh85X%mqr zG1ic!uQMZDPQNz78gi5!v>E%On0xx9WQJ{1dcT#l9chLvJDkO)H5E=|dBW-DHd*_; zWQViZzNXR>S)On?>B)XD)^OWk`0 zDl%)?44cQCJP4PQhsd(y4rM&WZ5!3lk}LQ_7PJVr)Al8#NsxBC_Rc@ zZ2DHE=ci=)z?9aTgiG7=rQ>GhCvo)-n=XUM(zmK~9_d?^MV2QIbI>#IM_f<3X`w!7 zsj`U7(7C8d$;8&!xE3>H+2Q{8*dNP%n5r4|v+U`n>MQOnf4$G8!<(u!!<$WIxPPww z@<{Zp?n-nObqA78V5FV)Gwx0qe&+Kq1 zw$WCZo*!elHJs7E(z3LTvQ=gs5A-|;mnW`ujL^fSZL-tpALC7Emxh;QjRWc%X7;6|ChbF zX-hsCTWYZ<$IM*WKkC!_(tF5R-Nrl?-2#!-UuCYEF_$GvCciLchzOS}6MIWDeWr0~ zt@=bGi-jZRJE>jLGRtS$jhpeUcH*`z*o~WUy0aTM!(`Zv=dl&f_z>+=D&aRr=9?+w z@s!CuHkX+O-zAw&{4;FM)l|#zf=f)>@ldrquj>HzSO-8yVd+Z=2{})3JZG+J7e+8z!6k zo~6%A(x-$!yA{)a_C_0rJ-2nww6wjrW{r>$Ud7cH9MI$H?Yyn_-)8&$JMF*CG`D2` zZS8C1FPp9nj_P|ru~VO4+oHYqmh8t{3_I}d?ZV9g#avE6zWwINEOy~Je)+zxN8&=|($k=#p3#S z!?>9fFyB~eZ8x((+fr_Qo@-`#^f|8CvYg^%jQ^=}w+XSxB zmSpurb&<9)ugxd)nYrJu-Z z55Yk-+96U_BX7BHNBAegHgzHWf6g7DL1pqkej>Mr2DPelhn$Y#R1YIQa(*OCf@&fX zATD9`^T7@|ZyQv@+6?4VBiYG14O)<+QW=5GRVb^9Jwa7$E2~-BswvxO`5}TTHQH$ zSi)NTsFz$m8T}^66In)D8Re6HB4ky;ns?ITCtWh-cSteoY82b-^8X+fuF+TC5Z$VC z)h8eBJ4_j;U^9Y^q_UdKGMywr<8NAhB3@J7tkx$H9Zs%okglw$`;uCdheb4ojHx;S znblv7KkWZ1^{~oEj+SL>rdGF|+1j9PDYfx4Wu+a-ZZQ82W&;yz_$K3FPwiVgdfe#} z&gwsDYEoTCRvBfRQXg+Q%}!|P;2D0zFB;S~INI10Vf~eA76+O}^V@0~o10skk|i?Y zTEl0TpS0ETIc)4(+guyh_=?0GKUqtfM+9xjsVY?xAaON#oBp=y=BYNj%CAj4GUT2v z|LG8 zIwK7IueP~fZDrlqq}HC2_hG3>u8({!MGaa}O`>rk`w^?c>&=pprpmXzfjN-qh6b1G zDW_a1f5|H&Mg!H*idxyD7Trkl>Sy^PPLWF)ia5&opq3)lSBq_#=}R9I|9I=vrW)2z zYL?Dqix7(S6Tn)QW@cxxyE5t6jwZL9vgTPDN-LVwTw9weU1oYsq#uJKb~$dWsn#2~ zMOqa7Pi&MGi}ZdhTUqO^uiVx$Ng74XDuGl8tG_A}?V5GzWYmk?GTpVw40mSV$hZVE z!sV;KwJhXg?eFT@?cAxduvl{*9muZS^ml4(O=C-WY{{RYI3vA@TnT(j$|o~aCgn)2 zj&}SQ_KLTbr;d>*Q@5%kOWkxY^HLJA#Lo4xK7=_7?0&{aj@(P)Pk&t4Qz^9c*0BQonLyj zxh1Z2;v$9&*>h#ewriYw$>~AewuZAwKQF( zK2q`Yh4`#D5&dh7u|i+2hjq0%O`Gr#HvN!*CTN4{&<-;|{>=5IWKAhqNoq%swWE4L zPh)prb06QHYPVmJn`=(#YfbH_V#!{>l8PL4`3|Y09)1VIU&55#H)@NFAWQ{R8eywA zjsua8?}9n3J!3_}OFU~j6L8l-6SP4)aWEbxKpg5I0ZovEHkc0WFau`7ESL>*U@pvq`LF;M!Xj7< zOJFH1gAP~@D_|w8g4M7F-iEc%3F}}zY=Dih2{r?pv}(PeH}rwN&=2~<0I)JWPN%)IkE8APH?S9ok_A%!FAm8|J`Vm~M}VGXFVH5OP zN;)tAiogw}Pyyqi4wBFgvtTYPfW@#3R=_HF8`i-_==CUTslY&RLm5;-9Fi~t=D-42 z0?T1FbizjH^%(JCAh@9vDquV$U^>i#d9VnU!Af`=*25;~^*Hr{0Z;^PD1{0b2XSbE z=`a)Kz?H8=(aD>{+GpOlnS(xis$O;yk zwzsywHb6T-J5W1_r|E;WL$pJ+fvm3^vh4i1wflEUFWW`yqwT8grtPlv6{og`)?YhZ zJ5oDJE7m-$*;~%{sY-1$D`uRmouZw}3Ls~yT{-vE_S1?qefQCTb}YM!o~WIqR@E4% zou-Y~CTQ|rt!e$VeYC@P|95C^&BwYNqqH;F*HhE>QhR^O?`#sP62`(rzLm?Op(9}o z@Mh0?9^AVLXKZ9Mv?w+2S)b^ZYnV8V^u?{BTihzT#jT8bJCY{RZiln9}0DcBxAZ!Xt5+^x=E~9nn0sYszFr)T&IadjzZ#f?;)#qG( zC^y@R^Hd(PNV?fpoa<%M!;h7Iz>Fw@d#dbLviW3t>vvrGRYJ<6ze1IdqBiW&LIj7MvJxHIxI+^QQ%dbrc+QC^w3mx_-+ zZt+*$Q0gPILaqKX`!iJ@{AH$|)n8`hrQ(yG%$7_=AiSDAX+{u#nVBbzAbzs5hjair zXA+|sOv)`YB2)Q_n^}%2frOV?k7fk)Bs15n?IN>fO>apLcPhH*Rc5eR!^;d_Yk1u0 z@bnQT!05r%xe-*I8^Jhd!bvI&lZ*7^l-v?Vx~6m=kxSPU)vNP#7$(uA!Y~Oa6^4mE zx=ILNVM&LHJ?Svg#ijcYhRHLjbeJfW3d3d(sWAHH7y5ORn*1fdFU6}T*VNV4Ofi4Y zI9}Ga;Oj*#@6Tr@swdVa7?=3-oaV*J$~imh#I^!}y-X*Ez=bJn2hXlN(8= zp|K$+O^Hm}TN5Uuobrv4cuFScQg%ZoX-Tp+KC)3LReaM=>Y;t2KWoa7Z|CX1zUfo* zOx`%HK}@-M6n~-cSJ1%LYG6o9OKo$qzOlhJsak%z4D#`)*rpczmJ_~o=?kmRUOQ5o z1v8;_F3)RVzhsy;!NA@!O!ZCapTdv){qWA8wZ-p`)E2@5mi#zP2nQeax?$y$(6V@|C#Y^R;B!Z zdM^E@1kC;;FJ#h>WK5H9b%MCfKkd_z+NMuNYMr3}ZMb0JJH~iwNJ{4o*Yd$vypCOr zFb8lhY0KaBmh&q(m+yq~cctb0D$Dt7%lXxo^J^^U*ILfEBQ5#05Z-e5It0mn9ub2y&MaR$fpI3_u6=GesXM~)LX_U)m5uGVHh!#6irXkfO* z2Eu&_g};IZ3K}SAprC<*1_~M|XrQ2hf(8m2C}^Odfr17K8YpO>pn-x03K}SAprC<* z1_~M|XrQ2hf(8m2C}^Odfr17K8u;I@0ht@HmI)l~8%AnPVB2Z%u3}`Z46QlJ+>X7$ zoU11DA0Av*z%7RRR*q8M1t9s|1rqKNkn+6*;{Q5`e}9xB`jN>p zJvRUNqts92rSK!lZs&L*lQu-xqBk2{0Onthp1stRmj#5KaM8IJ9c*~q`JR4q>mB;> z!r!fxDI!|wuiDjdA>p68{mt8Lx_8dM7ye5Zl^Vx~wle$>BmBdJfBCk~+xF8wxNY5S zr*)nFuWnT_PNXB9_~sdJ+O#v@JnKzoZuq~fd3WtUS;y*EX36v*?KEHyPB(n{A3+Og4OUf>_MgMa6C)}Gmfm& zA$@roTn|g&FYp!gCEU?)93&v)Z+_3xlzYYY>GSV;r_M{~^+}yqKC^r3eBj1C&GYu_ z=k9Hu+m`)tU;Vt-lh5yerCZK#{cPn+`#=4c<4bKDZh5HbsD<}Fdvks1s?&cM^uc~t zp0Mwy7nh!W{p;5qv)lGp9C80GrT=_#e%WUi?s?UP7d=|~Wcal^U;c6AL2Xa}rL^(6 zwX;5Me}4F5*Df5g?2;*C4i8-MZPVK6LzlgC<-7m9`TI|Qb@z$K-1^};e_#345l7Fs z@UXI?zWdz0>At>ye|GtIWuM-)`s;5${oAqUUH5W%?aDu0z1yAl&ENO$w-4L3cAq}2 z7hc+W&hsOV8#lD`u4@A!&(a4zJL$N)J~%z{?CGJ)Z@K2wA5Xt?!>zWCsyk-+s$cox z@>4HgGwAfo{`uDAyRX~y_2Ez6w&L`6+8ZjKzv%|sZ+ecNuzXM}_0|5o^3N;vzwcvb zM|OVw_9ppfQ|#1u=)DuJxS?Usi@%9I^OxeKYY=%cYPi! zz4PJv#Qobp;k)$Hm@Beu=y@N!Hs{H|eiVE9haX<5p0UTYmG^YUj;=WEZ^teFZXWqwLdwpLP8yLIewhP157a!99_))bJf4KOn z`*)ag{vMr!-~HW7ude9z&Yf#y_$~YuG*Hk$K?4O16f{uKKtTfq4HPs`&_F>01q~E5 zP|!d@0|gBfG*Hk$K?4O16f{uKKtTfq4HPs`&_F>01q~E5P|!d@0|gBfG*Hk$K?4O1 z6f{uKKtTfq4HPs`&_F>01q~E5P|!d@0|gBfG*Hk$K?4O16f{uKKtTfq4HPs`&_F>0 z1q~E5P|!d@0|gBfG*Hk$K?4O16f{uKKtTfq4HPs`&_F>01q~E5P|!d@0|gBfG*Hk$ zK?4O16f{uKKtTfq4HPs`&_F>01q~E5P|!d@0|gBfG*Hk$K?DEaXrM^#cBNOh*N(et z?LB1otK2{L_Pc5y_S{wb4tCpaS8X78p$w`Z4oSEYZh`xt16IMiumQAQyK4R6NC?6R zsDcDs1iyuaunb;;PoNk19tdm5w}Rs&XouNw3oL@A@Ep7f@4|Z6483cS_N_L&HhD~Ib8~G&D%`*x$c}4_wq$P@tUaW=N7q)z#i`xZV?=Fr)7a`neVhWYhn>W( zs-IeWYGXs~$c9Oc%~PwBDy7rK=cIF6lC@LCU)x{Y6^%933FXwL_B^RJIf7y&YL97b zZAh|zo{Eu->q1T2OWacSs&kuawMyN$x;fd}BpD6S_ERZVwgIFN%86Q8?Zno}Lz`=>r)b)HJyrE3 zXYJk|BO8*n&56dEDYfyk+M4FtspweKzUgs7YqF^|sp6fKY_4yZOgf9Lp+`2PLhr8~ zlW1(IH7a(Plt*tFT|&&Wr0kMoWn;Z$sA>219Me#z)DtgntEp`gtr9@_J)jM1uB|O^ zIH$h3u|W!?m!M^c_Fxx2Cu^_vJh?tzdrVz*b5-MUt%+p)&~s_P9i%L|32D9a%THz} z!YrS$)y?(Q6BG2LR`D@Ko$PjVjcT1nSprQ|F^=b=Tu&9Nnq)?z`PfVeb-P;|mS}CMlVparPMX9;LFsx_9CKWCQ>u+StZw4CHN8#}X^1vm z+VP}xAAV9@Z5!aHC_hflt0hKxL;QqEdg%|=j%l3QRNY*g%JGm) z33*P`{>v`83u7Pf^JM1oZpWq(np5UJ3ZgeNz zzjR;dp6R~EeV_Xg_fzh--JR~w-8*}J;W@w)@C@}-cKMGyF~X`|$3Oy&{K1oRJeE<091&&8BIKda!4-{qOc2(Xh>NG+M53 zoal%<&T=$4&UIYunB}<3aj)Yc#~&RpI$lBBe|M~NeCFuoJkoiz^H^u4^K|E>&MTb1 zbKdFvlk+3zdS@@!POgJphq;2T5w0<=vs{H-Uqx7dmr=u(fhRbIqyC`o9_rTU+!!4 zC4HCquJq0Kt@N$-z2p19caVR)|4#os{wMrT`&aq@>VMz=m4CB;?|?H93k(ZX22Ku4 z3{0UNrU&K(ZVo&Ucr36o@Rz^`fo}o>f`fu3L0@oGuqrq{SQ~sX_!rvcgW%`EZ-YHU zJB9j%4hh{AdNTBC=!?)E;Q`^|u#fhb6TUsXIQ(e%sqnp#$0EB%_lkO>k?1ke(a~|y zrsyTn-$w6`E{}c|?HT(;?9kZo*y*u&tT8q{c3Es$Yu$bed^NO!`+kJi`i@w1gTHT}U!Z?rK)@CV2Tl*f11)ImB6N0p;P+_l ziNG6y_X6wC+W251*czN3{B>}4@W$XB!R5i>p~}$s(0QTjLu*5y(SP>|pAoJJ|1x|* z_~P)d!2{8EPH~>^yvli<^Y6|toIPBJxDI#O(brJdv96O{ z6I_#AkJ68ybG_nv)Ae^WxU2gp_v!A0`+9WP)3cMOpXXptiKpFjljrxIw>-VQdwUP} zy1iB2bG$RWOT3?WkMvdg9`~*Cz3cnT_pNWR{|a>Zp+6XSJn(v;Pw=VW;7}wqD)iUT z(cvNC3E@Qe;qWuz72(&yZ-+k$e;)p4xMyUS$lj47BKF96k#`~*Z=P=Ygx!7y^|{vG zk8!Wvd5!aC=Y!6_IlpxtM0u}t-Q@bgb%@*P4$KNzFcVFVZ-Ti?3ard+C z)$X+xMfkOjF2E2hNSI!xMa{@C1R|RgO7u+9sIIt}6JR{i`fqw>m3~V3VJ=hfd zeemJnlJS>dz8)5Dj9ujHCq5`H$kG2Dj{?TAPya%|+p$oNQ2ikq_O{i~pzwn{qso@*LFH$GHo%=-wP%|f2L1Uyfa(?7;YIbYn_mKw}MV{d*cs;U~ z>)@Nn_mSSwgQBizMfBw8>Cva6e~orVzmEQs@nq-NfLKZFVs$ON6x$Hfn)Lp%oqd@7 z1g?W~>{r_RI}UK1;h5}bbS!i%c0B5M)$tZ%{1=XI9X~jBaPH$gjJvAG8FiL9E1Xr% zxbruRAP+bnb9OjiaK7w($N8aif0xbG-+h34ntQtY3-?C%2sAT>yJV;5E5?s~7_l$) zuJxYbtMRS%ec}6;udhGkKh1xpzs5h=KgHkZZ}Cs_|I&Yf|6>2I{qy}ts?qoCz$Jkj z0=8hwm$Y%?7P^%q`$OlTA!YLF|+T^=rPbf*zUBKqQ4XEV;P4hGm>0v z|Bd|``&|1S_Qm#P_UG*{+h4b@w|`~dWdFgwtE0ce$vrjf7|OHDXvcVUUv1+F<_gDk zj+-36XViYmv4WBNZ;p=~-#NB(?&%!F*gcdx>zU5U^vUy_7oqcOoi{ocIv;la(fOQn zjdLwpU+?_NskwG@9l*VIu*;?Hx5vB2bH{CQo$I>9b-C+i*B!2V7_U|^TCH(?zjHtAUhe)2&pUs2f92l6)5o)y=RnWlp241w=NO)P z#?X@ca`zqLtx$L0xVPTh=xz00=w0f4(yRIU`VRLwdCHl{-S!gSoxb~hFLJm2&bOWa zAb*knc>l??@^r3?d;G8Y-}Uzn>=6hB$^s36Y1}LB4?Gh1kP)Id7z>sMj|-k2Oa^}y zyfio~cwKM-uHXCk^NytmKW@+>}%~G+Iu;6b_{aF9Ah1|+^41GFLGS%xZW|(afjm` z$8$WvzD3)A;P{kl?r7%_TKW#>C(a+75mzP8PiN4Ae{?x%uRqW}2l9O6^Ta&0JR2?Z zyzJTCdk9ZJS9$;D-RS+!+tcUqjqqLJ`<<_odrK47(>wkz{6hjK1?~-W1ojIK<_>&g z@ay0XXs#vnUg)b(S@>ken|H&9Mm&t5W$5a~$N^D%^u_2q(H8VDH+Dztf!NdN;cc#n zZ)4hgP4jat^s)D~_p|r653t*~B8u$AcDvne_oI*qiK0 zdmB1xx6iQ8w9m57w(rKcQ_K_nD95ReI`lG=XP7yTn|a!Nm?zD*9q;p8zrpbhqfl?> z-p-?(VXldhJl$9E#5slMnv0y5aZTLfT;zPh`Hb^L=PS;?IyX6Ya_#Qg%eBAj2$$Ox z<5~X&qK{T z|Nok6Vvc(uZvY+K9ba+3<6iIn(cRm#8*c$ed0e~+lzT>dPV-cIrh2A(F7nLeIdz_A zq303L6Q1WhD?P7z)_6YjY~;?_$GZnlP)B<0ydi|W$9gNh ztIFjM_#3#Q9`irrf62c)&teA$j^+urDsYy17P~g^yTCnx2YI&mQ($#qZQ$d;*IZ?L z1P=@z&Zs(?JJ7?yXM(TrUhzfnpWKP};@!d(3WtV5ENhU>!9xC7r9zAb!j_=)h!@LS;zxo7o=Y#-SvvTI}y?#KH^4u~8a8N}Ud zujp>Ey<*y8O>_|@>P5ijpPXGW$(nj`l`9*V4t>=TVf%c3W8 z?`-B7^7qj{L?4a*Df&|M_2`e$9b#3n(|C567MsVF@DwA#SFs;t9O%%WCwp;E=+8AU zn10`Vum9LSz;TG9h`YcUT>Gy(_U27B>O6%pel}0#^U=jO&ZBu_I>B{1J@p!%*%r9& zb}d#f8pBX>f!F~-rHT|9^e_~`IBe0=WcJ*SLQp`_Z#2czULTiJAHfk5A@sp zQv-hpJR2Cz6L(wqeA?%;@cogF$V-u(qWedOMvvoZxj8z6QSgt^52K$(gRvN6+!wKb zNWEwzX{Q6I&nfl`?DOmo*?TyAJRhCnIMdPMn9gYR7sp-B#m+~aZ#ds~e(5}u>+5#c z5$+P6kWS;t@|W&*_owddxH?YuT;bWx`wMT0*X6xly`4SIo0;Z2)K|n?*(Bc--)%fS z-sfBD^ZGjjp9UHk^*;-K8T=;rKxk>`kD(Qz4?>^Q^R^3L6h1fdE5@exBhpIeMlXoY zj4q5WjXp~&y%${<{WAJ5dRbA-%RPN6_wYsB!~e#3wJD~p)wG3-*Zmlu!n9DF@n;ry z>LrZLZ`;=~Hrp73{EjN#b*D1|EpT)=Ryx+GH>d&5BA$6BI1{`@UG2P=8b8Yj^D%D) zySw`F9UQQFA6vC zP2mamGwwItAM>2F19#Z{7|%;RBR$7^e(AZGZwhlfck@l*Nzb48rtqa_XWkwTVdMyU zPvpx&t#^vI#d|K#QnS1_dT;SA@ZRfv(EF74Pu|zOZ!vCs!uN(BxCiw0?d==j8|XXI z=i{0=maAqA*Ue<#*}h8|QLgjdw)?*HyA8Av?Nr3G z({R2&oZ@(%XQ3Y*B|HUHGsfTNT;lxH`A@#!?8-Ns%Xpso&~<=&5WVg)_iXo<-hX&| z`}$Dxe!l+H{UY_ge&(wPI!mNK9Q2h$jI@$VN7Q9XpFQ(rbT|qv&Hi~ zS^O>XdE}pw9k{-1QBO3cp2XwPM)kCDE$^lGL?4bm6J5hy^{eRS=uWYIv4dm9u>kKS zm5eWSv6fhS?7G-*>A8wA2)`H1(I35+N= z@dWV+_sZ@04t5Op!xx-y^K`g9cfzo1i0fLuc74Xzt|2_5KTIEdhqt|b7-L`aeB#-~ zdj!{L)H~EWjQi8^-qGH%-g(~Jy^ni4ydQf%_wMZ5-FFaI?cu(od=L35{A1`96a97m znS8stp8L*g{%`z6fzg2r150?r8xs5_Pi=Pw-w2N29&!m+@s8necr4$e(r@=yg}(^@ zBYbq^v`Bm8lE~w{#Se}iADtE*6uX({uJzI%`u316q3v&v@q9JcemmpPYWpXA?T9*l z*{9jM=dj7c6wrApuFyro>oJ@+G@-Cyb-#al|9|3d#& z{#*Qa`JYtxnI3^(1P%-w#hY9taBAT4z)QThJAwy??%=D>>!E*yCh^_vMxH@8hPUH> zI65+kcazz?kK92|`CH`Uh&x&yofw_MD0Vehz>Cq{W1q(~TMzYUd62z?=cv={SKD8* ze{Mg5uQ?w&);k6{M>)@RUc$GVd(>vKz8ie!`+m!v z>mL7Ifop?bgrlH${>%9%*Nd)~U4L=C&NJS7e53h@FI``_zUHgr_pTp#1Deb? z$3}MxSHds(_INSRdY8Me;=TR`_f5P7-R{22eUJNo_k%q9J??&z(fUvB7u_$T)z{r` zx!-d~`NBKRdpX}f9{0Y;xcjO1dulS$H`G7eKQ^#Aa4>JICkCs7zYErcF5~&>UcP3$ z!q<#l!uy9q;Zfl!TnCSauZ!Fk`A5XZNHL5jk8#nO=vh2_ToCWRf%gNS1-=XH7`!|*hx$Amx<9;%>$f-Gp|an!AK_|#GEx*B z8Li|gqba(CQSbk>cP7v^-R-|W$bbYv5ClPL9`-qBpR>oax00fUQe#TYG0%jWrKP1P zX{pkNriz9dqSYFU)(~1limF*!(JE;hb6TqRvv*9@`G5cS-hbblcfD(6t#`ex?BDP_ z-|6`|W|X7WndS*=KZoS8HOwo5ztasTjzVdEfisg2V(NzH@XwKcj$A&p3?=k;M)dK%*>gRyPIHFdwH2bT<3KJ}030CV*g;nQP6hW-8k6 zaU03pu#|}SJQj>bhX{pzRuY=PCo7=N)TQ2cL+ed&Ep}~niLn1sRJ%^%eAefp_!L}m z3G2`l=CQ-u!mimLz!E6Py$VBY zMHfG)r-LHBaKtvgKGd`ED6zYJ2S8-s()TJGt&QHsU{La8bG5nM+=E^XTTaMhYpzW= zr=3w;6NPA$>S6G^70$=dl7_gRcCEpiIf>G0p{i`xI8=)Sc7K7pA{s?MZs}gQ*9|&V zPn>{4-eTUmUJW(LQu7_MKRdC9efU=PQwk_;S^rVWc;z)E4J{$BS^}0+SSzk|V;|;I zn^Uw;wKVOt=7*|SLZ6|(t*=H=&D4L=i~GW;(qnuRQJGhwt)=-s_q8=*j77%VMy7Gi zaG1enG1G0zeBBGy8BWUMILwc#V95`KqjcbKrwg2Njq20g-5b57CazK&@hPgvTGX%~ z#ZJ`CEoiB=rBNWT@1zsayqNtP-%+u(_a}3Z+lu9t4vfxRaSMio*Jb# zR`8NN(k1*4`R zQDJ(~Z$=x>8ZR5?Kp-~^e=`UrtO81yi3S!6KcmR<-#UUpB8|qy`HB-zS#Bb?;C2p_N6HiAXXWRqV>9KKK_#!zuNR@eW`Rv=z=?-}ObX)N zcv(?Fo1{X-ds-9XL{4+({tKHTL z>+|#l`eQ~Ds$#hHXQt(`YzaJxUamJ?AE8`qc6UHw9*r{p4BGq);)~)-qQwy|c`D+0 z^+soJt~5|9Y2WG3`S=IZ^EjgTQA%haGzBvp6pjmx@ID8_M+SNe!vemPPN`G19oiLb z9xh;#zF1GzSKvfd@I`_}wj2DzS$Ql;*wJ5@>+I`lz-~3ChNgMWd**wW;-&5Pp7&<6 z?jzw2bEUW7Yy0WeKSWe6I z7AhV_b>I(j#B#F_&Te-+O>)9ew4mm9{lEV8z7uc zoT_YCRfO1#(=$h0F0Q8|UlIM$C@s&bu1CkOXpBnP0rg;@XEld|G*y&v`)&hEAy(jEo0($fu-xgnaqpG37 zTzlbCJ%_&VlTpijnJT}-bcE!!{Tqi648}L%+{tj$J!m9B&f?B+=hLW#i_nPAg6)G) zhTSN`?ZA6IV4Y8MPM!z3)ZyEgc;5A__k6_HeoL+YnHy9D&8hAKm_ASn0_V=5%axNW z%8$s^<=V1S_TW8*(Cd3CLzEeOUy`x`r7#u8=D2bdG$VuO=YnOD)dOlxs?ApXW`DgT z>d!R&WBm~I)8AL#C;3|X`ud*5omhj?de(Of)u#^rOIK>n%W$6^@SZD1uvv*3`h@Lm z#-S}vGiS02b74IT%|+n;<>o51#t+Pm<`xvkU3ho<&4YNK$Ia8=pRdge;N;8J8H&hj zpZfqINH_%tm`ELZ8-_U09Y^m-bRTh_vXzpX_;HmzHQ?55Vb*g!(cUib<|G*NZm%OP zucI;lD$6TcM%7<~612hhq3^`$h+Pb9b{BF2Nvk*uCH5dX77g zp4Sn}c`ijqt{_wvstPrQx`JDf1dZKnAT;7;?&oG6;clK5zCsPY0It6*T&K?57VgSJex;!p_R{>WcS5a39S81wmMI3_auG%gq zzKr7Xp&37hGTPkrq^m88QYX+rPuM{bcX4+q_+JIQtorVT_?J&`liImEpow-zx9H~{ zpfVih`Y9r%P-R8dCjiw(sl;ICF2zebVx9>#th|KPUd$YQTp<9yEiD8`jQjM2_3poRSIV0Q={ zC=8w#;f{1ybJxPD72Pt7cLqp)KTOY`->)*im&WhYn%|>8fBq!2+ShUH-lHdf>N(;$ zYu5*>I+XX;M5S#22kz+Yh1N0woS%Ybwa0q|q<@~@?I-Uq-e9R1eW;2gNGiC$ozzk4 zD~*w+pt~nhA6H06q!W0%zeoXcA-S~t>)WQtjp_Wo&{W3Lt7gk@%A3I31#v^1iVQE? zWakWiQHrTm=v1xM-s&^lzZCTo^)$MDL9MV>4F98yRvx$Gn)ajivz7;4bB6vJb-fN6 z{`0H51wj%SqPccSe$>X@&1M-T8*|J(REg zboZ~Fmz~+pKv!{2T2+_839ApUj&b#K4X5KzfLYIkPkcqv<7Ya4gsp>(qu0Mde}C6@ zOOK+gUm)d?P0FK`7>NpI&^7zwGi?fJ(%)<$WI zwbgK(UG(hp;P*+>kS{Ifqh+ z8xpPb1^%74H}t#`oGytpW)%86T(>S)BwB?Gk-6>gf0A0r}X4#=fUWl??(5ylJNtQb{O; z8PyFZ9!o3KjhWzqx#XSRH#VUR95%j$jTAMjz(N|D?eSkHg9={8bzA@zSZf~TK3p>$ zLOx55BKM>V^|=w9h5k5+Guf?E)UcxTO&R@TIB4=Ua%!LB8(w#oWsmBieGElcc%5w8 zTOfpYK$aU(j=rFF`LSDr-7nfo!zQX#Nzxtt(1b>_M@v!ZtrSB((mX}k9S_~CqbGqh zOe#B*4_wt01%5wDdo!wk7il)Q_!Q1uUARamH04S1bQs7Y&b^iTXbO6qO%^5vT$M)k z2~xvBjqTM~^<_1SlU@kyxKLZAZGxZP(t`EUdUekBOE9^W`upTt4syCH`KrOY^P(RV zVI{prTeOva#tiDoJ2=^w$aw^qYrsrt=*EDWdifmTtXFaH$ROO-`PBN&!l&q`$Ap_W z9_?)(XA+60r6@%kovBolbI$KkQVW7GRNGx0PI@xIH5WbM0B1aej6rSujy~|ZspR-- zfC;Pl<7#%XGs>0RVa-g2pfeh z!pFicT>QbT*VE3i)ZIzWDbAa?68T(#t{`|zaaS!mqzES0Ic-s{#;6)C@u#Edmt9dc zzCoq^f%<&Ib<_0=xuQV#uTfc5x@TRI8xktD>2Ba|`&w{y@@|J}WRVLq6lPd4_O6V&l2&fTfyoI+l zu2V-)a}ONr{-iyIqn?eWCQb5MUO-*Rjl-l#rqn=c#O}6`T1)LgLtRkNd*kj6mWE4D zOJk*p(j?H)bZHiQ|EkoKThbc$B`5#$JxQ(?P3~! z$ptZ+gk&gaw>k*75g4W;YnVVbb**QU=VPk&L9pa;&uPzBREY~<%AZKggwQ>!k(yC# z=l>~hH}6mqbkE}6ZKkFdfunoz=<4Ip4aRkN9XB*pItlI#fuSjKOSz34O(*Rt-_2Pr zg@0}U&on20Y9%V0;MB)~S?ZE9ZB9+LI^#?FTomRl`Z01HKkB#j%2bSJj5#=^mkl3E zcUITdGjl3D2!!p-86pB>WJ~a0e zBn#_;v!lQmUEGUssdu_RVKu+RgShGT7lXu5I7BU+h=%r>4#agiKzd@A$4Wxf@pj-u zE%)vPcW_a&p{996*(ZQZmrr|FhQZixP<;mZ+ zRQsyWqO`6B8K={;g2~<1CKny0HO7H#skH&g#gKA|)%xIX46)Z}oR$DXzs#D7{^*| zgZ7EGAJ^vydBxKpl&`gotoz6MF7np)N$|7lSV^IbP#&GQickYr$%V3~3I-jtA$REsG}(4`a;dw}i*Fo67IGv> zwh6+sWSD9>1*b??)$#qKoIN-Z{b30YR>A3L_OqR@;yPA9yQxY#r!Lxr1S&F7qZ{E@ zwQ#j|wFe`0arGd@)*oMPIC}3``pP8N6xVc4)$i54j-03-^ydC_=i%dvx0o#2|UVzV0{JWx}}{hTt$W= zl_cRY-`6Os*L@D7AgWG%bdC<}S`NNkfNFdkRCCi91g>9?7XBrfDL+Rh=f%?PMOJy0 z-Blh`1&%pSlLxU>)l8Jet8m*Zu&34HCwx~qs`yi&@zvB6e{VTzwdK~vfyQT$9@_3* zhHJ4$+J}A>&NM+sZclG{C~n0(d4>FeZ29xuVMQZhK>jFlwMnf{BptI*eOr}C`ZVFD zbbv(`M>~E*uR+2mr;0qIhk-dfu$&%z>m^@Nqa-@APP()^OlB_n$TE1$N5)lrjH%{J z=G!)V0ez(S*?N}9Noxc4m@do}Rx`s9!_3BW_K8^n&%6QBC_(S^(J?!4HlE=$ETM9T zFgH-!{W$5xrTBN>!66HQ%O;64#3b7Z2%+v;$haz*h^M@x$WYC|hg*(LnUncH0878& zEe0o%aB@e}an_S__|(?+Zj<^~Nu2gUD}D~Nu?+9yoLmh4*c^O3mFjZa#%51YO>U}n zn6T(%tGCa9faj5d%Fw>myt=8k&_~0!cj{k~K9yjAgUJ}q#?4#9=}6;r9QB>FnTLyf ze~d8##JkwoXrz&}xnx{7^5Z3h;Qoh^%Z)H2(ZhVEW1F9?XLS_1!}9VuE5q{6lLah7 z>a7KO?r0L-!&sB~Xz1IiwE0kKJ{1p&L7a9MNi-K-))C?F*iEl24H~YCvnHWon=qM1 zAmfK`XgZwb{JoPl0JT1j-Z;)y>=(G-Bs02<>6kTi$qgi0KBBtsp<90DZo`aB3_UUy z1$F?5mN;<~dEa=tEchfi0NXZ@b zp2QExK$FSzW|4i&X41wXO_rwOuO!$iXCm_+i)}q7MOw=_*h~^+hqRj+kTewRqjcGH z@>1vFPg!K@=E;e4oW-!G6*zoraX~ku%j}SMGnO1I?ztI#?a9KCRyGJn`COtvHhkwG9_{DArDbe8-8nMoRl< z5UM|Q;;Pk^1%F2y_A!wD(~Pv_Bw-;4^r{d5?lEyCnxlR7BtiT%X(h`yo$q`L&a;`c z%vF%716*1hHN7k--lW=2AX&BrCH*`2PHDFj1#pOawfif&bP2IEdF_fMXsV+MI7JWL zT7c>FM?d}!zu}taM--VnUVpC)9_;TOg8%X(dH?n#YnG5UTg{qYLoY7`%fFj-KaGzV zpj1G|Y7Xa#g>#OhZtb4=ZEv_8}>qO}B*9sHIg zjm2@I@Wcli!_l#xgXg@89=jUWxRd#guZ-{Mjd@5F)*$iqD2OK39EF}d%X}5y_zqe3 zk5Ez$!i9dY*du(%-{Hra=3`CEq0hD@tGh^8hc3GaFY;4onlp}hiS2lh4pvEacXMyT z!PA(O7=r_oN?PlRc#BG01SPQ*KIB|5-xly)S#M)+Cz71g$ysE0owy0JB@I7)l01X6 zv=Cn7`f{IoL9ME_g2jv^EwDs;9~PL2r&kj^ z_mtijPLss+Rw-(6J+c{AYVjH03!s;s=)T?+4!><{OEFIsxAQyssv|m78v%!Mz$7 z>tOm@;rgj0T@H}d%f$V@iuQF2U)2w0cE29JVZKElc?SpiJ#!tiJ6q|VspKCHn1`6* zIYAQptoaQI%pcImtTgs7)_0}(I~Ln}8;BcFL@557-um|y_mj?a+=TPwZL+vcIrr${ z+Ibh<9B>^%M>qjD{--SOw|SI65OWc7`K83NVg*#Xs;EYFQR*blpeZ&WLD-b}#MZEn zAkJWM@(yJ^703y$!t?pSvyrp-v1c7=l&zqFR5B?CywOZ!4Z}xXgxXV1t)#l}Jyq3E z>!Wx!QTuA+v^Cmx?E-p(AMSAo-f=jpLml!dkCISn%aqL^QYuSPAl`*Z>?BRU52xpn zZcQCEVV|dvoK24Y}`i;dTF2c>)(P@(54p-q`x0t%IW-b@d zH&)U!HqbBjz`72>Dw608XT7(*m6<>2PZwA~o&Q`~$@Gnde|nOJo`Ck1gdV&ag?$Iw zqcxd!1tqwsT88zhMP|n&5#5eClX#Sc*O@w42}=Bs`MwkCm!zYuxq~uV1RSG1)oQV} zPMePUwU*V%U?QumPX#A^=u?fR^!$OO{$|nh_tEXknj#(EO8Lcdidl;+e@7VSHGo=F z8GbPsCH@OEnF`L1B;a@A_Ebf2IczKIBGYC)?e#cCis^IS$2WlAj-t1p5w0r6kU|hZJOc(rrWK z_i;VHpr_@fc01u)t(o0guB>OB4wL*juVjOaEXBMAtJH`!>Pc^VR(**YzUs~jo#jjo z!Ql?zEVb1;z(NPhzPOzqX;Iv;(ayWeTr284Jq`-Uk{whuia= zcuBlQ-r{E_+5A!O3ZdVXKwWKwTi*|bbrO#Ki=3d1p50)KZ^4oa@OMT_6F>qcz5hcd zQ}QX1N_DDsFXbaV(68YRw@8y5QT>?iEQd$Xn2t4qWXyC>;X-XG%Jc`?$FRUt+D}?2 z>Rk;ma~o99UcPbMlUd-wUwoCwLyaK?y5G1!$1j?L`XHGBc8(-N_|cxhs>vA`?|c_^ zKigRoRY}Epc>*1&FG-m<(Jzaj6zTRHVmp+$pTPgNDm|*d@}lyxvO+nje5rJ{mG?1xTW!4o z6@Cg__7EyUx_*vXt7&wdB%kHvt40gF>=;z_@!a(*hGE7rJ++E@jh`J6;K*Pf3sZ>| z_OS!|Xiddj5H1PDoTbrjqWH?LcGvxpu+3pUvjC5V3PObL!h?7=-wMhXwFkN ztGmh2e5H2OdZP$TV$Sdl?(w_i%(rV6^BKdG?hY#56(*!Z;e78iV|N1eI-ilBZu*l^ z8a_9QJk~)lT7V;wZ!9X5M1?MeORwP7UPl!y1j~(MHtU?7ik}8&J;A*5I{SR4i|09? zH^mSpEX(0Q9st=UQ?qw?PlH~6#!V?scDV{#kd@dTBdx+QNkbQ_N*+sPF1b1PG8!Z? zi(7e2k;n%1rdny7$ew)963*cP*sP;#fSnm04m+9(J4#?ua~?Wu5}Ai&?+Q-)TIRJj zU}z?!pI|aC z9_@Rzu#*Yj@3~{Qg%D>bS*CC@|B*~$)Z#SOM-7ib@0!jW)~C#2ogr!Qjq`I-rDts& z@h8_@^ag7V<3m``L9(Pj=aRXQbvM;NMH& zl;`lViWt?51bbp5)t+}KMrX;i&~1Exos&)ymVsx#VB#ef(2w~*gDPYSj@3e*ZFCqHIS9qxkU!oAed z$L!g<;mobphWiYot4_iZ-6@u3=CMABk!fhVYst!9_jvH7`{GJ(AT54|j6z}VX{6Lp ziX}ZX2F-RQE?f;e2{n=xISNax4(=a88tN?m<|A;QS9l|!25yDOZg;^`o1!hpW46-b zLHZD;nJ3|69@B$xlw--Fr29%5WsLG9pgm|yJ&ibgvP`1^bBPO?K}xaG;tn2(w6nm4 z(3Bn_3;dDrh|}q8i5@5q7EF;vX9;um2i!xbMaekH?bI&n7|zrpeB$G3InALL&{J5oIHrQ;fj=jLDqdrKc9Iy% zvbglNoO)0c2Yr|@7A`$Q2(~A2pJbK3b>4E8q3gKNEL(!+FQ91;CC6|JeZ@uAxDCi+ zp}3M0kp%-9%dB1^I@39P@5bmYuP|>_1%`KmteBNW_*t$5YN$(+syJ@mYK8 z@njWW(HH6m^e^yPFY<=RPrAbwOv*-}asgbLs;Y>K{J7deokrGg6R%+8qqf!K3{0aZt%KJe)Xp;7 zUJBpdgL<|UZFMV*B16y8%loR5o!CiEHH-RIozwm}&gKv!9%u7yc;j}a*l(bJTfXoZ zb2j-e7+-o0W-3bFYAE{RQas?Vg*kYcD?!gkaOkfy0dw6INct&)ihYB69fZHrQ=En- z709hV;du(wP=W+cb*VHs*d*ay0u^u_O3rR}ECUy+031C`t*lmuIYl$evRnNc{P&Kw zjjuV$JX(ZaSMLco-^k2Fpsx&bK_c%|wB+_q@V(+&fwOQN&Ge=(*iON9AsZbBR!TND z!+Oi1;Ctv}*4q@PtO+$ZL4ac~Kde-L7!$P>QR`)#hjr+tK4(Q&C@iQXjIR#9)8kA> z4)z=ayB4HExAJzylS@SfD~K1joZQiul8VB)%TByl*gY@1RDxZqLyEYKI*f^rH()kv zc}-@Y?e~ApeihS7(~U$>?P)ZaJS6%GJF`zPCZnWPmNwJD^C zPP@YBsK-$AJCg@~4TiUn9AgkE?}|*h#glwEQ-C&&$Fa8U*zo;>m`!aAi(X)H>7`VDy7Xwcn_fondca@ zH*c(rLcN|#`tUv6;8gbG8}qvyZ!9Fx_ISX0LSb-TC3GW|JYO@R6FW12S>~zC=$sWQ z(`!4U!@Z6Mm)A9wUivyc^ix=AI=Ryyz^H}sSi`-K;H(KB!71P8!ao!K2lUk{|EVMg+rW$^c3dy0eH8tD>uV4&l?FE=X8Ko9|`z)t^ zG8ywPnY0fC88^}=)16E6enNdxs}3R1G1)q*R?1zhiPztXlQ@$Od59ia)!Q7WxEm_r zI9$ye_;$5Sy>_QFrbTEmlzD%Ldq8F}%J>BLFBZF5y zdN6%An%R;PWwzjiUj(UNPar_QtxFKs`g>lY?xV~q|dR7*5dR14jM;~PX zS=KlbyW`00PDa^Zpu7q5U&ai4PVdU(BwU5n-coq-SZ~5cz2*;X8E9+tl}UHDB$G9dY`{_`VXZlaG$xITQ(-GePe`+wgAAk2PokdR zBs+H7_Xug14E&%*i=3xp-ikP>kHYBA$T#JBOcQicD$-Zh(s#dQ zWkcvEmaa2QABA4`y1pKV@{pa{xyfyJg10&`)A6dW7^>YAqo64VVxRj*ob$@|`&q9tXR?Uj=)QViiwsCReBLUg1X_}`ZVX2l%?lr| zz{|GEzsSL`>}d9A0UFhE&O`xJm^ySvOIvuJ#A6Z;-9d7BKdX_N08Va!m)lR9sx4rq zCY5=rI_RSldEIJ@&Mz1r=!oUVRadBcDqcbtdwMa548k0cYc;tpe`dPefu6jOy4Z_} z@XMr_9#*O@pekR+q4|l~94k-r7>SYQ<_vD&9BVBS0__@oK{!u>(LgrR8o8e!#0U7TEGkv3Gk^{P`79|HX@QzPy zxdl^Us0sMW={Qg4(S-Y<#ht;C?1a)ZfIefrZIQ?fP8yx2Jl(S{{2&npI1O*%Yw%*W zQGu5&+ESYbo8!$XROf{#P{*xrNeZ-QupEM)ke}Rn2u@um*wRq@RPPbSGWn3q6!aX4>rMP~RJG~&hRbo)q9WV@H3M4iWj^(Px4dmg1nweln}UHKIn zxgW0|gi-xuW=mtyrA9CbzTW#a)u@U+18%((vYWg^3E9hB=}275UG^NV3{!fJetbcx zhGMx&U8h>J;5X^L6;LW&_>|U6X$;eJ7L%BQ7B`=FKbE7&eaP9~%j+K}VNls1rGj`0 z73pS%uOaUPMU&SYZm06sFu8jcx5468<;V!GL!}Nd3*)IbfN8eHM<2#C)?8}uMzZKf zK&+V-|46yp7lMQmB)$z2-cK@n5evec#e~xm_~r)Q{@Bl4&<&1HA>@(5Tq8x61kSg#zfIXS_ykHN{Ud51l`dlto+9fC_! z80CKj(+&Mu$7k%+>n^fZ8O*o+#Qbw{BhsjW^4|z8_&cL4JvN@6%9%?GbS&nFKYGw$ zVLLNLBYE|vKK`%uo<|2%u3n_|hS>?@$*@){dzR>0#EUo9_S&d3%CiF1>&wm>@k{BN7pZM<%_oA+w?KL`aKC;5@WJB91P2iw^F-Q24*@^(jIJ9pg% z>z#o=%aO&B!x?}E7{}_2`<>U^7PCq#I7jPUn^~tFu)e)u|HG`+Nwla3z1~~!Uq5nD zR$6}Eotdm;w}4J4Ga*@z7rq+vx=%}9D~o3Ksw+3Pk9PoFJq|T#9EfbPttmxId{oPV zyqN89grf&W@?MNcHo!`R9_bu>WSFkJ86^`mx3zbv9^R843 zFG~&J8^`fl-3$`uiA*!DVDC4(R`4RiT2z$Ho^75TD7Sl=Pdd!|Dks5M8KA685Xe*vkSiz^}CP^wP2H^Li9`l=Rbfq(XeIjY(H^i?dFdH^$^apV-o$??p~PK6&O z@N&TK`NozHe4i=bt@{t7jc^hvkt8x|sRA5IzBlWa(;K33NxPB}?SsZQgoN}cvR?7v zv#I3O6G*bmBQc$XOOdRuU^-x}x*mP=?#W97*&n^b$IsvCF4@eaIy66Aj9}hd3)RB3 za4>%)8dNR%tEkEJ*m{4Fp1R+a=AeBiYDu8PWOT;4ZZ=!oY2-^U%H54~$4!h7|9@PgDF z5KAH~b1_qMD|mZtEv#TOta%4n#=X4oa+oe`RqzaSLaT~jwd=UU>Bl5du=8OxSa=}w z)|fX)TJkDPH0p3yrk3xzm7~aA#G@BaMQcnzZJdYRn8d3w$s{KKs?J-kayF`y!{x^m zK`_oos4I**c-Q|B{xC`WcRRq^zug1!|HSr;>GgZq#4A_%s=vat2Ii4xVo!cyckXYyH3K1b@#zIsdCH zlAo0Sffs2aP>icdwU`+bC0WvWOErp@+M2;2+DOq-3@%+P8pi;eM~vbvg82W9EK@cU zAr9G(7Yu@VWjIt0lf#+SjpP-+TFm8$ygRI;;72iu*6e|VaqK_paohe@HY!*Nx%WbB zBrglpLT3}n2k9uxQA%S)2F2I=ovQy}&7XRw;wOSSQ}ka~daKS;Pf`ln9?0Lh`Jv9g zhjDTcK+e90+HVT|lO4>smn-|bd-3<{E#JGXAb*dP!!h~JJ9@cQa2{we3A~ttga5m$ zU>oM>V$jiJVG{#>m6n|P(EA3-ysDhSOV{g}gWTrc!MmG#-D&Q_aJrNDz!?v{XX3|e zZoy&*USb$;az-#IS&h`ZAc|;7IxmMsiH+eXEpZ~E@8m8A{KM2`ZhcPs!>s7Pq(0wq z;ky2=vN=OZAlEdHslFs-v64)VBZZfp)<2XefTbXLv3b`5(hY{tm*vgQ(LA z+OsNujHl@pSp^;Id9O8$sl&)WWt$mlE?3O_S8~Oeds9OXGsT2|FIRK~IU48t|A#C7 z=VF#V|9Dp9--TNK9*>%LXTD^`Urd*T-ue49evd6R!(D1)XL9=7@i@obaX9}72Uzzf z$k7$e+-tCnvM^Pd%<2 z?K4O94F3zobMixfThZ_F`lGhDm3e1c_Ll8y{Z`YY{&fv^|DAh~ z`2Usj`e(_T|2+1dPI4m0?Z4~v-}m<|XWy|c$kB}Bl!N7jU%h^Hi`NE%No9qTGOEQp zK{|=7X1qoigM%`FG?w*Rvj~URTM@;v=gJOodhxO=D KXGm;!$NvH&u#L(9 literal 0 HcmV?d00001 diff --git a/quake3/source/QIIIA Game Source License.doc b/quake3/source/QIIIA Game Source License.doc new file mode 100644 index 0000000000000000000000000000000000000000..790e7fe47cc023ae7f130f7cbabeb3b978adc6dc GIT binary patch literal 34304 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/Debug_TA/qagamex86.dll b/quake3/source/code/Debug_TA/qagamex86.dll new file mode 100644 index 0000000000000000000000000000000000000000..982b0129b8c580b8017ad09b558c136bc78a4351 GIT binary patch literal 553984 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≧ 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ෞzXKXZhQZ2k9O6*19F;qP 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

Cso?}>{t#W;1UU#47rfsi~B+E7~ z%zv2;0)h-a*`nqZw=S<(XWtQysj=4);PW!-_TI~47w`vDOV_z^_Do-QfOEI??#68l z)OuG0DZ=VMwfX`;tjf-mk*)nAF9Y!k9joO~qZepUO15BNK?^S6f}zH6<`uTCh<~;f zs5Tw|;<>#kUdh=0c(4k`3;q7qQk%rzT4M{`yF>bl3N)GjBG_+>F||ri8O9@A8pd;#;tUaV+!m0MqQ&*m@U%F$3#-T06HTSF)0f}H{`}hO zi_*cB8)y%!#gN8Gr!%rH952$K`c9X!*g5U>&Tf`h3Re+8WrbCn&d?@gTPlrRSCogP zZS&oRKT-J8W`XSKV(mfC83b;1G1?Uf3FAo9d&TS?bcR_LQzJJ?G&<=$uJFrE?vffO zx>P^k-9A{PFtuk$Vu0@@>#^%ZKKJl*&4wyXUZzVvQ9T-31EnOr+j|t@b}#JPv7t-( zs5o|qlmw=7oGN_hr-fpGj1$B(sR0X;T=N?;_+kx}zZP)icNLmbuZ820#Gr?&k|3tc zw_1=iQAN}<;$<3Vcj;;aCv68=g0`UlAh+BD5$gUDVw@UZZs%!Ku5P?_h_UT&uGAx4 zU(`7D3^xtqG#k$CzXRYe+h6`2P6J`mY&;S5J0V-AUEss{6B};Rg8PB|ED^F#Xd&wg zPJ~GXrTQpv+Ut(vx+cAn)F$i{=KpRbkM*!zPxU=FzM}5|62`A)R)(_7ACn1q=wZx4P!+i^(%2R z5rUb6+Z6>Wm1eoHF3bYAI-R~eU(nT#9Zb@*`tV8bj`Gp74j)J*AJT`y=`@RoJpklJ zYg)H?_KuX)rAetphSP(5RI_BTP}gYA1yRM+*u0prmlrekNMh$jR>Iq~t_E-(9AY4t z38JLG@UXAN#^zrTx=X;ssf4JfjCwXI?r1LpN@7 zY8l7o;ELQInA*ClIgP=I7wVuA42B+se*WT(u^7_mQ<)VxP(wk$9aCxnrZE_aumuXU zAy`3z`80gAB>t!L>b5bQ>;D`cWyaE{b04`GH_2E0)1PKe(O;0GjW&R#FAj$%`Kz8Vdp%?~7r4@@-nCN( zeJ2Vu=_JF$>I{*kMv;rCpWY{GFQnj%fpq}O;W!_PF`;KDB2{B+ovow;i_z*pN_sTF z-|g%mR@sWysvh~Igk!24dbDEKf1O?jh%24lfN=PwzWoWC?p)&0fiVx+jDfw(n?CYr z=%4}3P*DFo7;Yv?HmvjbAANxs1}Zth6@S&R=K;DLZCEhy1;!qS0PtACg}49bw0Te)wr1_8=>$Va?9_oHD181StTN{~UeyUWL1FKsZhk_W zqGXBqJY;KB2xo$T&)qI;rS9;b$F2U^A zwwU}PO$ABR*u#E+wheR-P$=9Ux$fs4Eayse2#BMy(Ify*@4?vmt zA^X9uKIWR4`&dS1nv6p)^PQ1E$H>IFT*H4{>{{xeNja=1Rv%WVBhqGIUIRgs?ovlc z;nauOqsN*ezZ>%x*wDl-Ah!`c6cSE}9g&N@sUDfXY~)k(tR#9K5Lh8u)eH9Cty?YG z`&|qurb?UzjC4+F6FJPCQL;|jQSy-}d%NQ~vY(;!UD7<$@iJL=`zhyN_=`vkpqR{Wn%z5`sIXvX+-EfI9SfeLW50T69$BqJY z&-p-;-p6}cV0AMQ?8tk95}^Qz2vbR7?Lp@<)pP`KZu$tS(K3vd6SsLJBXhB*8+)HmnoqpvYQmMX(Z8vJI<8M3Jma?UQ0; z3dMNH6vIRmit$iUF|dx@Cl)JR3@LysS6-W9U@@hOC9%!oDBeLdmP<*yDVAJM#DQJE zc*XJ;NTO2L_iuAIOVLm)ohM8$%hy__1yK(es&#H|oS!Dj@R45gi#6sGj=^#dI7dbz)DI5j8*o!3t+Y*wrbi&iGX0dBSk)ltp;H7VQpG4 zWe~Ft8`S3Jr*Tg))oo9uMVrFyaS>djjncR8iT^I8JH=Y$PjG4`iXXefr-H6g` z6s|bO(^Zt|8U$G^wHd`@vviebIy=Gn%Md}!2-`;{&JbU%OVUcL!|K*UL>B3KK(en` zT-)roz^3Hl%fx}Rb+p?%z@*@*2(VNaKV5zKryZHFv;eh;XBT9@km(X^YPio+lDQiN z3;1X95G-=hrq0H@z0-gnVx|VsAl^HFgvDbi%0_;wPeE(lvWMlxCShOqzN}-uC6sWL zn4wQ)z$O&PK(xNVm{d@kr9`E$$rK8|G9jUNt6TtOjrVz}b^T#C`!0qLyj>^RE z1u(R#fEkj|a^O5@hV*QcTE;3jQf+chXVLrJbM z;%!?BnrXU@ZtJb*HhtUA!T&-Cj$wTgy%puf>ATB7GBq@VkYzxnV7m`Th!Ebe;YGI` zcu4d$p}>YKMIxkRF#OqwDP-RulFU7V1vIb9h{)|BVhs2HtxJ>mpEag9SkyI~HpR~( zdvLl)<-?iJd#HLqS2bFn(b}S`waHkQzg68hUvwIzw~Jf2;tBrH6_MJE7`vjz?HOgD zMabB2t=l)Ivk$9ooUUY!tmq|MBzNRRwh4Q~>QD0|FVDw%ViXf&G~i2iYf?EIpvBo< zLXY*TiG*D0!$V0F-UTP2m?dyNPwzLz{Qd#V5PV~dcX!I$0pg!!z`}kTP?g3mgL>}w zDvG-+qKM$4!K)?8vwnvaHVa5IxD#_O-A9b?(bx)^#ZlrL<8E|e`#f(_C~F!Ilu3)x z>$`gXhPpLt8e9|l_)@`6UO6kN^nY*{12DrPJNdK~oQumnl*1<`PEX@+KgLcPiNAS(`Y-r5@FjcVv)>Zv*N4 zhjQpSr+jctjAQj}9IGvh^u*W1>*ke-QoI0G~Li4f4p&x!hB#nCZ zKP5Y#sQ^<=w$6x}^YfQMr5qa7=X-E&^i_1X#d8_fB4k?41Itk`oczEh|BRf@E5c2az6l^nIe5iJ1gyQ{>R1CJu`Uw#ozfZ;v9 zhf3$~(6n)Jr%oalyt#7Vfi53-@__LvIfLMu!wiDf+~b4m&-t0^r0UH}d<64!H~2^f ziHAihaXP1ot0CWMF6L1czB60ClMAUd-&{FrVhLOTAk5L^M2`(?&|yMIUp+q1x8YBuTBrsHro3tX*=7}GJEqi!xyIkl)etJ1g zfL=gLU6uC}SJ>I!2Lli_nsj;{VBwPbgY0t4(*68wRcDIwi^DUw;S)`|OkNf<1uSUu zOe!?#boXqwoUrQqxR&xQ6J=>8!d`~l6WG<0?q_`K16MF#97ez&Lrkl41XQTUBxmd@ znj(>pWAHX@73;eq`QEPg3F!?Ni`VXEXP@UBC!P(0r+gYbTQwe>=3fMfk$8BR-RF*Z zPW9bL_O@3{_5m-M_8Vw6t;(@hvDvX9sQW)hH(OXV4&rDptWoSA{44!~FW4%HXCo}9 zY1%Z*0wCQ}qJkL}Q6B~lOh3}%v=VM9A#Nc_up5-gC95)dU(CtDdU)iBYOI540G*lQ6^#L(*(S^kRUJg;ARFt}){G664m)L<6dV+_z!E`U(Mspk82klQ@q>;hJ7evGJ^)xtq! zjFS?BsD}V8`h)lj)9@gS@y>37whgqZ-@o62!c6Sb&ElN?xN=3FB&o=K8yqsJ_u7oU z;icAI&h$9Tj9!MkHwimz!n2)&HsL31!cg)ppwDcQ#SWCVz0$(D0TW(oIhdrH_wtBA z%P!dqx+~GK>-5l_zd;tM=3SRRv9b3Tzb&mhQQ!aH_(N6EY?RuIs|D8~HHXI>cG__m zpEeE}&~$NRT5j|7aVSq9|LJKEO2p06M4+ky`D>?%;Mq?Y`KHpw{PX_15^aIlYjaPs zy|E@Ma_2%Sn`$|1xm$CityF)tFeQH`Av}-JbgwM%j@R z61yu_Vfc_wPHEf~tL-NzGwzBt^0^!PqVy$fI7TF^V=r}s6lj}Vp*m*+-^<$<;z&JD zGS%sUidW*G*JOM zf$uPWSK)UHet}@HB*=fIW#tv8oC@VZZ>P#oRLka?()?;^tDGYx{#1pM>4Tkxz-Ox9 zj}201vJ%{;)S0X$+o6^@4R}!@-882eIxg<@t1UX`mRHCb2&d*;XL7#6=Df`2d_8mS z*9~Txoc~+ay{tzVo%7G2i`g=N)a#$-g5xL)xY}m3R&7st2~A$?u*P=zAK- zC}zBKg_KTnX`i5=xkMC#Cj(fPD)}7{@!KDvJ|2 zturH)wMLw%GXODiKqXF7vzT43T6l;EZS^RLy&eE|Me`_&cCINJmfWsOOWoxD9ZVFeI3F#Iaojcg zD#n@O_wUurK#JGs6!|s4YKwFcR!+;J^*~^k_G&gG)prW1j!TUMadEVzD-gpu>G8+99fjx6XHFGZ5J z;dyP@#EVRFSc+V#aWlc*l4dWY3Mjk7#?tI+o1Q4IlZ5?*F_&Z$9~lfAGOp z7G+P>4hRy@z>RTXw15jj0|x}wGDLGe|Jj~ydO6aC)q<;m@?bToz%d;33FGT_EzqEU zz^35JYI3R#-DSd+Tf7N|lj(i5^8p6y9Ug7tCDBuavk_V&ROqOwXz@6WeU)vaQ?>!} zP>`B(-w^$@V_HBYAH`W(v;h=ckdKwdz#W|b|H%%9!?rdCIGmslLxfVVpc}c{b;i=# zzWC9&H7QxeI*eD4- zrSQ9}TX0dnVfC#$rPb$ebb|d9T*Y+3#%m z$7(jrb(T+?vc{z3a*wsrF0xkI%e@w?ho3;~bw2U19u>tkUn?-&E`}I8ioO$}L^UK? z@=D`#Qo7V%7=x*4w~G{WtbO4RrFBF2?ZNNtKgv0R_^8}JlIfP3;-({0 z`-wf;46ZxuR&9yO%|Zh>iI%NQT1?9uu_uwjO_T+Ae?zsNfWG}CTY-f6?doNRK!2mO zAi&V|&{UYj-V$lR0N}dE|1T`{l~iy?&v3d~nUqgofvZjSILnMoT$n-HY?s2ZUlhyj z5m}*oAWj}kLz%^)H33$(hoVO+yJ(`u5U=j_25|T=cY1X*3#*W(4BA9V^woHt!2KyS zO>6~#`a>552Ly#TJdir^VXctBYjE{2KhHac~ zGRs-=K0ZrA-9d!v4~UU_ypOWzyLjT#E2+`M_L2+BaRnI~WcyX^H+u9~rRy*N+MDbh zEnC9WC2F9oa8Wx4582@TRIFKI{S$U>5^GZ$rW)kisv`TO;X`v;kZv9bPn+LZQGORn zezp0FriCs4oS(Lr{>9REC23pw3ba)tk$Tq@+8)~b_i1Y=$}cVXy%KGUiePUlrj5JZ zWn5DwOYIN`W0aQzs~y+cdtFg)00=;kv`K~`Jj-Ni-U;T3?O`2WQq8rMUNe#*sCag@?*{ zhI!IonbrBdKGJn{eh&l{RVQ|NLPYth^8u2~;+@UeoV1OHWEX|5oi0YpX3G-nxVT*) zu}6NAG6kZ42RV-WKB`J%3}qKV=q`qyZlof<2k@=sq7aT;!o0vz|SdF zQnkTfC0N;jR(O*7a0BLi;G=b)y|9hdTV#mvZkW2vfEt^{Obbf2QEM52^{>(|O;|U& zSu2zhMvzlKQJQ~;wm@K&u@g(txVFmb8imDtY2odnP2v0s6Qwt_{0@nMQ$`hpZBD5|n{rGC>bfL%O)AJ^>XI>Ti6lvLl- zsd8gHGPZcly?~9*bprQH2YZi!JqTEDkW37$LSHOfKi6rPHqp%{(PxVjY0Yb{vwGS@ z7n?-yMIv3bo{g#NQ&P3I!g+@T?g?9~L)#l|l{d?pB-`t31Zp?uYJm+z5jRhp@$OGc z+sZx7Hnkfd_A0QSzE$`x(utOEXONMm(d_m`mND`WBaQF&dwh}4qAxgyeP}=Bi+r4s zSs&UPe33gDIpRaxqqkis>+A$S%>QZ;+IZpEm%k9|@&?u?KW;|+g} zB_)*n3KD|NtY-Dm2ve~e(-gdq&(i2D{h~W5LV{?CqtlX?)j8!VIC1grYn!CyF}TI7 z{8!;`mCT)-<%qKlIe(391M4-t=0<=pU{sT(*WQ~j*I9}1sjcKA0vOC~B}<}( ztV#W+CF@E}R(BzeWW8ULm0xla19}QzM6po7sx^wV< zI-mXS)Cd<5`EPmBGqv35{85wl=`MFtGf56k5s~8G>oyc_530*F#m*WOv;9?SuKrBT zCfTjdZbE<8LeEg;rhF_)*co8#12*>UW3^Uyh;aK1_05}h&q;ZMxhDXt#av=h|GI5@U|%zBl1ELF`6@S;Wkt|+VC8n1E_kAJxI>?g|-Su!RSx zBC1XklJ6140pmlfdfr=LrZ!=Qqi1X&w22@xpW1Cc_;G16xwlb`X&`-OfJ?mD8yg-( z88HNq0w@=+@g$eN7F(A%M-@wRL|O-=k#L04NM3{qWtjB!^E32l_iT+XdVz)vJ-T@& zLlQ48SdT;28fcRgJMqHR*p9~g>J5^!PDT<+Qu#2WjT*gHc&Q1~X=H;CaheT6m+Kth znHWV@7dA;*r_os7CX5c|8lY_HOtrZ?@$m9N>Z~4~F!4P7mRG`a0+%&HC(eyvV9&h) zU8TL=8$phMEa=dUOpEydKO^c^VLxsbBGHDU!a3Oq#6VpFJ>?3ew*p2p@}y0@N7*ki z2imXUi$;LWVqJvGL7>CD^grOMLGtqhr8k!ZP_@u4b^hr4R|%aON+qz*yfdH)VIC!J zqkpqvzCV@c*m6x7r7H$&S|?A$%eR7UQ6U1;ENK?4YU@Wdvpz;{>#Ll^SP$n|6s=m$ zW-z702it^($>3fh3SRsxDo%0l)p;0QqV4YyeAzSr&?(~2oH+5kX}10rCi=!*o>1qQ zjd@0}Am*uZSUs0TX?5z!fRF1&23P8$_Y7kFcGtfN4^FNyGsYY^y;a?1AT)z2ljKIk zX&}D27N00ii33%wYV}FbWL3nOPw2l$eXc_YAWF^i)M4YjfZ#^HqIT<7{}6W(qT z*7_3`l$~|cCR%C|{SGuc+ouINSA!JMGNlr=4H^2*O&=!tm{!2+qS1HuSbb*?^_?ZK z5z+bpcFUU3q+6cmMq9Ivd9s+(8g0Yu_2rls> zn1#!)Gy+d0s)gW(AxX9%&vy|0NFm`=Ea-b{n`No=D?Rc^Y>Di%ICn-QWOrYw1>P zwq0N;!&@)Y>Qsdu)=JdACoqV^7^FV1RQSZrz$^}3MvAWrx_O&<`=@a(WVKwj zW$P%~0HJdW9XSv7UxKc(3Im6t2>{UGzZ$ zn(gWz_W)x zmgmN4;9Bk@VeIk(t<3&Y(9lWi4+$9dWuNf?Urky;EeTkED#5FATM53>N5H)&fnyOG zoM9_kRn(L+46n+1vI-{4- zm7JYEie7w!Ev0TA)q1Z{?nwgf@=^3tA0V0W0Ry;`fO~ye@9+V#VSL*FCJ1=Ym-QV! zKr&-_R?~>hXt0s`vVNBjkXg6>LIWZg_EKNg7yAI2^thQndu$_UA0cQkx0|37zRY*|K;iZV*}uhrie<3;KMG49pd*ZoRoznVBJ z324N^Djy(A{;WP9m%EC9)dVym;c_1!vwpzs+7Shsb@MZn< zrMBc}NK?C7c3+g|_7ZTRFY5sxAhUk|Uo}SVY;>0Svi__Gh*Pe}y6IT~%-`xP_vL$w z4~j)TikT1kQvPku^}bB6@j)@uLC$Rf^}4j#O1cWb>KnS6^+@~6f2Dl(HukEEZpQaS zX$N*n!6^?84)bp`1WEp$9||(a{QOMlQ!BhrGJ;E(6nR*x|AMrdDo>lKM7LKzyGf(1 z&|B2S=&NZ0s>c{f4T8f%L_Hwt5$xG|t%*;WO7q1`rOjHaK={WanMs=2cl5P-3Y6Hx zhK@4m2}R))>(^Knq(o00iq;*?mRj|``K<3s806pk16zD2D%HmcY*>}+84;__rg={5 z^l3RY6K*flWJH8H8)O?<6^7A9p*4D;ST?xVOI(-5&MqYL*1t>|tqf^LP^t^Pg7s99 zo6W{t%+MGk3k(fwHSljU^vB?a-a%Z=!Nz2ej z#N^D0F*|!&ja}qj$7cCblu{esekWzAkXh;`xx@O(zdoQl(9Q!u!f%n z*m9|>;le^S*qvj4U?i)70TK21RcuRUxm7Qno_vO^BKM3`13SY1xf<@*)$o;!E}L`` zvo{<~5t#LEkyomWO{|RDK5i-l>)d)~JR^1+P^Nk$&PUI=?N9|!GHE6{T9;(8p{Te?oel8a8r+gzZ2;*)MCbz< zxp}16D%{xNfzLo_Qw`dJP{@LjoQ*-NyPzna$4OY5`(ql? ztN@P4J{16tnas^{{iyUlojFSh$6t7!z`xu}D395;6xuX|4>Kv^jt=AE7qg+JPR~ac+%vrMUIQC)TndbQ@s4-hgr(@-0F)Lr| zD@{S-kU!=3OKY;t<1fP^9`d!h1t==wD;ZDqn;Wlwp<^jLa5!F{kN2tv%SG5N0}Bdv zl7qV|L7=X3Z)Z=+WutEt$1!johvpUF)_O^gaaw5y}@?RsE`hAyV zP??krd@S8Spf0^GXcxcu}cuhu7tU z8@onHDIAvB?VrXfFb2ma8;Nc1Aq`Nkz|Wr~1S-;IOGaE$qfpnIqIzUwr@gzWcOCi7DiXjx zwj;NVd-?;>kGIcM|L);ecVM2jWsd^@xc+H7eysU;WT>{@%d|viij*ZAu2!uA3@!pV z@nS>A>s3=x@{wcBBSpy%EIogjT7AVRzD?H_vAjP#$;niuO^yd(YvR8zXm*LG<45r;bQ2|%6a)H{Y+j0;W z*U83fUV(Q?=+1`#fm_^g0mSg@Xc1H}1_g3o!UONHZUn?ks&bfJnaeXuczFgkBjd=9 z0COj$K;}P=7g%Nj`F6GE@4yS#HR|r^!I-b06|h?MVS>@d!e)M;0zF4!@y%ifqHn}a zYON}Vt=zhksy9gj+ldB`H4hdsdGA}Kxma@Hvc~j$BRv$Q2YE;7VX&tP*oQCiw}8FJ zn)eoAzfoh)z58W|cjLpmdl1-QR1E~KSPGxPrWRX9#lSoY7q~dhejh*zVxwg=wYg^@ z02}2%(S{B=iqrQCTSl5rF-Ls_ngJ9aBa(jeW+|9BB=UsWXsWx5h~`z)LFn51h+z(P zyCzCm`|xzimy(W|I4+cl%R6WpYM#heDBS4)3w17xv5G_7!{?UOJ%-;C_`QH%X} zh4_W>lj|aC-X$}PtFXl$?tr2g6F6K9Evd=gT*I3?dF>Bwda2FcREwKCF?K>M4lS+A zuI7!W`S-{U>8mi9H?}Y_hIvNUWLHaKUOEI^wb`2`vA8oH!mTkkN#a^^?^{|FBa3zF zTvU|%nZqbcesQ`*MO5#1IEcbPZ{XBR7h4G0-_>n89tAcB)r^vMqc^(4aeWgCfQ5^_ zc04ZJ$^lw4P31ha50Fg!Fsm8=#Deo5xx2iOCLsNyPC1)l4R01CxznH*}W&fX+!^mxF) zn(R%&#-c!UMPVb4{hcEX?<6+brjzOuHvS1G22EpfB?PQ9h7hn3ebOj79qqpWAq(R zg&^GU(^i8u*&0lxWUZ-6PfYA2A^Kj)S(N%ST-?u0I^@e|ZgSg(ojM@%SZ%CMIJMi_ zj$2uRvd4a;)mZ=_bvrr{&%0c%t(vA&dbSdt60PARJ5`Fe;}Pe2CR(Z!wJ$oLZcdV^7S?8) zR)_DJ<@ZVpvNRha^Z|9@Rmc{I=f7f;~4lbHZ62bNjrshR7)r1!3y#N%)(0f zh(uvw2Dro@pNFIKb_dJhePJ`FTggABu|i~@OySvdOp9>7R^=)&S8MRxa1fE#_!gjB-gqm4$<)0Vta~FFOZ-_ecL3k$TFRx zdN4s@o}YMFdTMkIOy5b9z#_}UB@PKtih^vo6>5pdhEXWA=Oeb0J&08l)viu|ua}kb zE2osB66H8o=aPSuC+!mt3t`bp5M5$oYkfu16wUyJzmbz1R03L6$v4?k%P|E23H})s z&e9uCo*+Q^&Y!|JS#uU160BFU()JQ>S>LfRn`iCLuXUE47=BNCA;ZWjyD z-Xx0zb`V?$_=wtak*pm7gZ8eHy<@hox^ee}R(~-V)>Ox4b2I^HtJ)%k2*CLJ z0yO?7K2L)w*|t?TQm`|nmR}!#TELzYFmqoa<(|9zdLeZ-NlP5KS`P$kv@RyBI}9jZ z+$Y3iif(7Et|S3n#a7EpoOK+XEkpGN->|yyZPG_lGZ(#SP96Q4$qUXilSkW^>z)if zYR!dZbuXXvV_5G+Wp#m5%)b)*g1@Eq-zle*;j_HFLgs98E;UvTSB|*M!K!w!IODLk zgx&&ylX#{S&VdQ@J~22S0t<2H&9Uan;hAI5xv`${tJ->1wU8AbRNL!#lPHF1+)q2X z{uJ6$G0)`1vqVuNHg}?!$9+l@ZZF?C+*|FiPHwdAf2kz!t1M@15Tcm*m1NIDcvfU8 zCxYeKo1u(WXP1{hwcmi?&efZ-vVySSQ~R?sCuIJL8%+!8Wda(=zV4~VDaJXyEXTF+ zHaSr~^*GQ$;&Y-J%-%$uLg0eg)j`G$HCJX^Dxb<>o;cJznT2LuF^PP#EfWZ98_UiK z{8djvmV}Z&K*0bsH1ew()DR4dnoU2tK-e_gtcI@)0vOX6oP0$2sM%Cyv7T2m1SVCp zh&l-Oz9MWT=tN-92BM@044Mo^3K^_58QePZ${DPLw3wO$iaj-l>H+C&|B4I>rE7{t zB;)Lrn#=!BMHrx*$-^@5H33c#5(5-5Tpv3J`bc8&b~8Je$uFK=g|1zB@2Th|T(ZXp z4ynyyhr*nqJa#48Oyc2#!~mB_#MUI(z}bQs9>6F12!rWB?jg#zf_6V2t$7NEz3G2`wF6Pot|HE(-{SI@S(#1G2d zHcSwtm4D+!ua(!jEu-;{QTB!nD2=>`)TjZ0=VPyF0JOJP^4)0devBeb!lDq7I&hu4Vs1*f5x)I%?Uw~eYfu+~)M`Z3f97S>0C z-t17bod}c)U(S_-fhM-(=psxz-we=*TJ}|Rx}m^uR5l*VLU&;&tJLMX^0H7jR@@1QmXBJE2&9>+ zoaPm1uCF0af=p}>^+Mb(hU77Yx3ix<0V&dc8A5TW7ukA-iR0<#ybxDHQZ4mv%aK&u zk;MO;?c&*SWM=42dO=LJ9N|1>)73JMS%*Jf%9O_SIOY@vyT+A=j|Z>sF}q5riB_ZT zVnBYGk76O{2k2LxzAhjz?-bMgI5euFe56*XGwgo`LUrskJt83|vz}J1xr>&EbJm z4=7BkXD1MraUdCUH}YKqcS#`DFA>Oh3EVA#qY}t>xuCw0Q7zTH!wtHB zK)O9tTcDyu==>3Mg@W6_xEOrtBao(bW9Stxf?x<-&}fHAE%m12tI$%kHw+*=(Mw&D zULr8~K(#%DuK=_O`0Iiz)wVhnf!#ztQB!P&P%+jRjLndtKSx`@Q1ke3MT6Fdu>4@( zalf$60Q=;98DQx?-Le)$M-^6|Ebj(4ZRs+f>b; z7M0n+u;L#t-SNihN@wsC^reC8U~5-#n3vvVtn@<|nCC1s3@@RQP>mM)mQ3;xX4oi- z9HZnrml7o~v5%i+9ap5%d|`FtcJB}1Mi71utxAp+MKl*84(E64eR%1^fJD6?#(@Uh zQgW^^0nV0qWAoIL6|mwp_A@G!rg)&gyiG}BDBc(ZX*Al{R)giP??VZ&I$>%4J4Iy? znz^8+UvybQ>93%qseUOB+PyAVY;>r+H@o#N_5i(D&|pDEEl6;vyH|Qh{arc^XF9Uj z4I#W>XV5r_DxTf?xnYB92^MFj1=%hj9xJm@{)Cv!vUHZUk!ytQJ>8atr+U3rcc@Ke zZ>SdXpeG!{YT{6H)ljp_#;S)eW=DGJ@uB+;f?4QEkOx={ zKoLXf zXdO@Wa*@tBx+=|gi##2dHJ<9B8@98Q&ErE$u}Frc(;XzgZG31+U6xCyJJZeE!|JL( zuvwH3wQbAJX))MW)p2P-L(SW>Ettmc$hM4f8oV>xGWOK| z;W^7aDN~V~Km{Ag2$B+mHDSE~GtR3B(`~z2)hujQmjPj5cuv@)Y(l<|O4Gnym9ld5 z94y-7@O%xH)17wGUw3#Vji&_UuJO09TB7_3AZ?rUqDmnam4eOJE(#;E=ku z!LIb5cF5zc+e3t2eJ4KEP!?OLes_9l;QSMJaP9}A$7J@(m7sk1{MCHUbmVy(pB3xy zRR0+&4d^=~ZH9?YHk1R+wgQ@oV_0CH22H1+=^>gMiG~wSuWX5R4HZE1o&uWjW6k5! zq3IPg_Y%#kiG~ie{DnFtcBPtCKr?m>Q~PPC(S;H;M*s~s^}Z6F3LHP4=`m)M^TKIx z=n`!sDVvC+Vqg)8(RE3O+SU+RnbHTn%Eb6$`*tO|**fV(l~AnN#}v0>L6ti#bmsy_ zv`pei+mqLDI$;(hP~(ZcJxo=$;nn`oOt%gN0l9iX`p=~JldTK({z4ul)8+x}f!yFf zo#L+PQ_Pq)53Zc#-|sJ=DR%j^;FxUkLIEF_;+jh`iJp#8j9^WD4BUO-6@I^7T2}XU z{63A}8GyM4KL~Z!tlnA@5ZivLPh@c0B)u4$ewd2XNu8Qc^pa5QDz7W1dIphwf;-)d zR_Gbp`J+w`&K~!Zd6pSGmN!6v!SVE#muPmc9B4oqPkaPJr#N)FD&A_h6#@dXWj$Y>pC*iai%S_vbN6HSU^mgR(7_kKQ zj>&m?10f8nTt(JHbwTEv{2yh*O08)4*|Vw6LA;*!n1{~oVt~h8VJGIkcGS@9d>li8 zx3xjwZOKH|Vfoh+t-G1k|C#l#6@3JzmO|~$h@p>Ka%{FJi|Ljad8l^kDuk>%4FcxY zS9t>Fl|<$ak#)N$VCKz$fO)r9S13^>w*9^q#lWs%A0abs=sbUZr`yokrY>WrKCtuK zr`P2x9@u%toI1M?NN?WPBT3?ubrtYuTOhh_4R!^1^=s^fllhawXv>10;I%e%KJY~* zp)J8O*@Xo&BTVHMv*2WWSr~mr{QosiZa4+4#%eK)Y;2y0E+c5$gr4zwwdvulYFkhXM8^)X^?4EUH6D41oUtzj!=uQ zuL{f;10N>o)O%LR99^|)_}o{SFD6t=u`37WAFM23Ck`joLrd0V&mTb39l8M%Y0_1S zX)TRG*iSJCin+>E!H!6TiT$hetolb6ixS1#TB28)4AmOB9|E^^v1e6+Ah>~|-DvzG zZ6x5ng}3}W6PD+(vl(0%bNe_|NH-tSzp2(>=P_hiJl}P3SMz%1GO) zYAz96o>+xe2C3Q$5ZI^WYy#VNCD|04=?s&UZwV<}&rEeO0-eCD=}AKl=4VS(P@-U` zn2;@!Sc?kMmFI8N`zx^d^7#(<8OBNd2_ObnaoU~f*kC0c3+D5Z**xA+ntvL_^|s_S zF^{Fe`a2NlF42vFZK(cb259%=tn7utttoa^ zJN<@G-Bk%{tI8@1@G z$oZ7mCxtaa$hwALtR1L_;?og=xzB-`R`rcOL&&HQV#wR#g*r9cK}eM$q-E3y22AlTwVKHKAa)+wR#X3#@;ckD7R02( z>UNdC!h?BwxV%oSFY`7VmvOVPPL%F0Jp_wCK;1Z7Bh8#x=H;uj0y{GZItx)Msj`)b zGyOn4k5NR=f!RI%Tcz|Bn(%&&@UW`ul_s6z!C&N+>f1^rdaotS>^Mqk0~4PLmc$kd zGJ!GcLn2J+#@-|~KI=uKl7rvXeKfa$8IY1f;>5#j2!T8Pd8F+IDNo`}L8=!d{&}Rc z4N^`()bC2B8HKYm2hjnt6@031meLkJ*?s}{15BD(AGp9;kd<0ibL!t~FM1eSEp2QWg~K!76-pT5_A!J#fi=u`cjI=jQ3&6c)=i88^8bkgTN*S6 zn!S8elJE4CbP1_!mqJgk(8DHwv8Kn2u3-%8g(FNGf*_iXfT>%Q;K=Q*46qtpVqg-% z+<@;5@UoB6G-?#Tq_H#xOS;u|%`VHOJ9P!v@WjKbQN1|j@T_gW!qBIil8=XyPcV!! zg<-OY=f?RumAmS{Aj?jB9+m$@W6+oQ+a_#=ZOeaUSo$tWN zCMz!S{X1?#t+nt74OTqW?_Msk^M4*?(bL@Q%!6$ISkZ)S<@0R9{>D0P8|%1)x^kbW zWE*t*q%vSIS4S@}yudItZo|=ND0UNnQ@`;kG=}7DA(G7FF+(>TQCAd5<}npZ@*yGl zh$=aOON*c@i3mjtN(@k+DKUG}$&L3dFOz+!5VPK}&j#~4O|oqF*6!)HfxWHm4w_C_ zy6E&?llpz8GiZR4??p&JgWZ(#;!j7B_!VrxJ*nuAC` zBy!KTIFWJw)i~`?tcOw%G`Ff9uvl<6jHgBS9Yi4#KY*C=Hd!;o>!704!I|aG({Y#b zN50I%BbC^1SCRV?iZ6w)XHPl<^0^XwfgK0jQ6GVSZdtIl^R%7`FdTDI;jJWCjs@Pm zyp0i;i{sg`_temxUlxAu#Rk>Zm0*rp%2J!gDC)5pcp|q^AdGYOV=x%&@O%vP$_Syp z^k*+{wTB_~Cok~rY+D79>F zs>p361FV!zP~=4a#p545UZUuM*y1T|{T5Q98bx<1ZtFVc9Xdv~#A3h3nJhY+EZLX% z6qLCpkNudXSFC@7$6QQ%Prc(j&~0~|&>VUG2p)_1;4YWZ5938hsuiT$@QI@Hz8~C{ z^(B|ZuSD6|7Z`_dSYv1n`HqhBBJ|iXfC@D-0un!2lBz-FV0;SOe5Dj(J z3Bd)hYhe%m)eXB9T-I5kvFlj#uBir9P?har>fz?ys!?M^W0oBV?5Vn;)u15OG!>nR zH2MlGFaDq5478!(#40~d1~F3N3Q@)&%b(vR3;VZ4VOyhKCtJr-Y{2mmX#zAK%Iug@0@7r$w@ zh*PaP-3YvCxK}#tT_JfqFkIX;y~^?UlIkSrJh87!!^PHcGYn?L3`j)zSsrSde)^cC z&^&!{{~vMR10H8p zrC(DrokaR}h?^>9i`Ly1x>^;qu5}FqympZ?if)dea7U*@Z6LDPH+SQ+dEE!u3G;f{sL3bI zOnI}W1V#^rB(I}SZh#Ew>UEUSiWF^Rvt>K5hfeyHIm0aL9EO6cNhij$JmDOD>VZV; zO{)v5K7@a5_~+r@-{If4@sBIP+_p*IX@*#`mP$U(i*6*3$VT!aaZZ>jtb?J>y~x2a zLwHFj;cUr6hK4+~CSW$vqlE5&k^0n7Lhy?LSP5?FXK4nQZ9oHcl5NlhnC-9&Fx#*M zLbZ}@0PQ_;18_=k1^&@SJC!LyQ*}iV_N{eF51{p>(y>x>vkr1O^td!tANEA^B;OE* z!Vqx^98&VhDiZ$~UYg_KAq=G)X5dat#@nRZ2hb`7dV1a!aUS##BA7!u+^=0Nn|E%B zjElKNw72JX1^CeOVCO9Ht>Zsioi@i|F=5YhJY>&i%|?pTsAVKF%HM`G?lEV7g<+unpRFD?59W*W zgm~)WhQ*tPwKqRoJz#Flm+XhXfmbUzfSdN{JGsgKl`na6ZqjvG+dPorNcWk^=lzlH zJqD|flW6rP0wdjrk@mEX@%Tj%IBAS|ShasVe3O1~G1=o($!8~smN5EMaTRYMPPh|1 za!;tN$DZIb8@M7zQ%$3Kg71|R{HT9|M~d7Lm2*4uMcr9_RL|-Z>L{LyNT*@8TP)3CwLy3K_DSh z+RbD(O9IJ1sOq zP?fgjEY@2osx%6d*`PVMO(u|&Y|D|5vRJSp)HochqA9{&3VQE+NTb)`Zuq-G&^N! zhF%~h^}RydtVKF`(6Y1_W9lWI0k=m z@bNKMthld~$cnSH4o_RZ4PncnY>W?bf!@D8=pu)_=+rdw1ZV%XRr9N;kUqlv>C?HO z!|_Q5R=xJZ;eSB>FKS`iA2ET3`#aWe?gOg>LVzCV6oHded=GWg4ij;FX2O2SvpHn?Y46QQ zc(ufDP4UW`=T>!G10S(WT)IQR)Aj~9zjT@Tp_zZ!RXl~jrLbO>>_6-(XLxaL?;h6j z!>$N}cp8O8n&Y+X_^0M^K+&EZOlnzozPS@UM1+M}V!RXGB%VP4y%GiD4EMBl;ys8A zGnV!=bjHlU>HHRP5E%8u_)cVsuSIsjP;%YP=B#n4SR~xv0O^cxU^)pD(_`k}bNTeo zGQErGK7}{W2GT#y^xo<9|6?HiJtWPv(V!%*CB6$eix>ZqN0B(^L=vB<@`K9(sT>b1ruS)S_z6W+06D1(C zwQrnVdlj?3S8I>2K>#P@7V|PlD#jTE_d8r!AMxXBS@s;;GlIKfRC*8D0^|S}Zhp%; z+#FP(hg|7A(EC|B1En5)7#9nypCGJpbn~|NVqjdNI39`*Pr=q+q>^F@1VE1-WFbor zlH;%osD`UD;n^3;C-{HpVR5WTzYEv8&9#8H*D$8M@R%~vSW;U)CkiegG!Jnrz&zq( zJl$By+u`_}NWTj_PNsEoWPT~w9W^(&g@;Aokf)&S42FvD%HU!JJI6>ykwQ5(E`he_W8VeJWAn=!c`k;t?fuen-4G43@k033Mg zsV6qG#|cbSC|ysEH?x!9E*>-u@wgL;cz(Nhxsp*&*k*R}TjD|LSk|i(?JK8)zNkT#xTezRd z!+lcWzIrMXsRUecVIEnLFO3rsdcU$dAJ3L5(|{-V`JG^HGMJtMPF(crRP`qxUrejT30p_iGiW! z@NR+%t0+@jWCmd$1Pp|GPG-4L#$I1)9+qgqRpeV)s^!gn5LG@DC5 zAqx~8Mb)XsCEhkJoopw5G%h1Eny%%HX6_fvkh~e0+H@_aHgmsVhK(1@sO21I?ib8p zJgAUh2Byab1v6Gux}adj3Jf#qON-ob^?DRn|En*zzX8=I?<|VIVJh~W`XaI`tX*~0 zjirc9Zp6)eHK%&_#iR=1?9D(sv1$~gQ#k?jrv>-uiba)=EaeUcLvi$O3%|XF1Jq(b zbVjD|01YBjqMUyP^T@3Qko z$>s?`dG@o6@*fdL(jD&?NkeV}Fg0er`;xG=kf_Ij=D6qn9${h-UMUsrS?j`$l7I6` z7rs*RKe*F{u}V>U3V;KupnQeN!CiI^7=&hiSu4%t3X_M$1Lfa+vasqA{2Rulu zkaJpp9HAh``DzvIJyk^yPpc?7USU-RRz(N*aKJ%;dLrO22xd$$X@vs`K0yVU7_MUR z?IC&BX`&`lg#EFk=L3SrxGEOq+QBulA8}`TwAY3PxG~AaOBH*$x-^@(jde@@i5-#xi4F*sI4@GMT)yLdet< z(IvN&8k)9yOFqqfsdjcI1hThs{hON{mN=V(}xaVq|0Mt#iWL)}wT}UyxBpxKIur?` zWyYk+7u{V_<&{^k%b~{w^i_jrRGD|WoSX>8SOOXVGyrVfx8d3otWZc4_AooGPyl-& zU5VubB~`hnhJ=dN0#I?G9p%i|5@(h@Bx~@!!7eqMc7aWqIZz9%DElpb-u66DV=+gh z4xTqf%zC_=WHuo&ZaCb;i?X}f>1jJNUiwdned!MZCvXQB$Ez4|r*CeOZ5S~VZQ6y<@Fr|pyaer?CKJ}?po334&+ zo63{#VURvG;lj>=d4y5inei_41VC*up7bV~`?6he@xAP$dN&DM3~E~t?`Q0r&X5tu zhZ!i>z#igQ%v}AVB$*qZ;|zQk=_48g@Nj)Ko0oK$R<5P{FPsTX+sKPr+(uq4hv(TF zdAx#kUnS00@XZn-WR>|5PkVmLoZOQSXQlA%Z`#)!0+<5d6xDqk4knz>)D_`L99fPIOXr?D@AVp$Yvw(!9yuGzB^Wx$<+ z`8dhr$sA~9yjtoHzJd}n|NGQ6zVFp*TyT;a-!i?%J+E91-qC14kAzkfbKH10cmtp+ zu4Shsc$y%p>r3z)Gxow)8T85O7I_@KFU_o*2~zhn^-{OLcjI&eDQXa?h0j=%v01Ue zji~_oOgZ$iep86Cf^H7Mh-`{rQE=jVD;?aUAZLMd;_{d)MU*XQmz-Z?9NUVc+lB4R z1y%L?N{oWLe-K3@s6B_9PBRlWTbCy{aZ#P*@cO8=`7^Ny-QLy_zKFRpxzYr}ih@}&=s zaAQ(-njYc89bn=nhQd9)co~@5}3McqX0R5`?clPt(?BeZr6;`baD>$&>qtE8ka_%U# z`+3PdwC2svj+;f)Q&UVJcC4kDLU;$u2IrvgFg*CB$`>QLrhEy0(anbOp-#v!XrB>h%IYR{SPQ~qo?QBzL1m-IY`QW$+o zr#px^qysp+jl&NL@?g6MKEkak)=^FCWE&*$6XKI(0*?a8kn)TZPE6iCrR-v^0q2;` zAJu9LY*AYf{>r;I$~?&3`E>0p*a&Oo;kd;tF!KR15yojw`y$;K3fduHe$}GcxqyUY zx$5^2kg@n8?#Dm*f$-6>b*Gv0MXdpW6d~LkU(Dq1y5zZLN<{q8Ed3xRm&tN&zb5|s zG|*xRv)<#fo@SoWteSWw6F=b+=b8hyp6>ykT2DcHELA=ediRtP;LY)+EWX$kKh3lU z>#k+u>s{hpvr-dtA3k+`%UNXfF@Mw-X^~VpH`f3ck#ZeqWPxwG0&~p?oNll`o9|NI z@O91z`I`9)VcVTv1~TKeV^=6xkv3TCDJc3 z26}{B%N!U(P>S`y$8;;BB(V=(KE1|Oh~LxC&-yjs22!@kO0(4qP`a`~rmC5tVtS?>B#X+4MdCC!B&D)14P}P3cpr9k@3c;U3 z&j>?z6@k5onMeLYk(4^WOGP9U&V9ukfpjI`T{B#Y^O#V#g7$YMmo3M747JxN;|+^i z^IMSfcpP&G(}26-od}C?D8gKv=b^|$7z{q}B~M}CEBkNwiEq#nt**rEd_xfuMC3(T z(mwg}hd*r%^MKv4c={TqTPo;R0_TmV0DvLkoLE(^-+c4O+>RVTXV$xq1bqRl-! z=3?So%)_93B0rXwV$pJP*`hbhhuEd8r<*xq@q1CLxkE3kIROhE0ZJ8@VU|!2-$-pS z|M58M3CG-V_T?;b!`b!e!!fb=PS*7_aUEwX)wvYYD{_1<@#AbWKPMQaybauhK=M>Y zSHhE3(lZ+K7H&Fk5Ag%?4I)f)d>`w)Q|ffmKXRn@SxPJtI29>DH%XnQW^)MEpBco^ zWZ??2avlexpx5dP5c&=diitkj68;+dLI?b}o=9zH5G)BbJmZW8wUBF?5IU1lf-G># zvR4511cHzdb0>|(``O#4Wc8J0p^?b1y)w7{BiT5r_rIWf>TN&5!S(MU?TBo} zt;4J2iamq^cv=ev{Y68O{g%MwuA@Wf_PJ&`)<^E@k|3Ug{g7>koDoYO%i&doX*g`3KRPrLky8X-z0_a00gge#s?FiI3eoq~lC zIr`M)17KK7?j7(Oh2%vDW!pUS0+1prCvxj3{LR*cfD2@q0hVnl8Hz9fAcf4AAfn5@ z3&@7&2);=tybw~1e}x~{+E+W_-a$aHuy_H+l`3cIt}}YA4KiZKB;|) zt-T6C^M3(u)($Tms7-+#$#zRf$8b6hZfDG|!l^$O-E;ld&!C`1XChqE^B)*C(V(OY zR3cr^nY|HF*f!Y+Zb+phf;EwsVQfT$i7Ci@3h&wn4L05_U#2!otHg2 z2{<+uyUIQZJe{%1peX_M5DpT!j8z8eL0UqWFW<*9&{InddU|R6UbdA}VKOo%4v}26 z#P>4#$hU=epw8frzmk#U)@SeZ&kW&BK+1c*!x?TBq^yZBwCRHQVI9w5EfgPTWp`^E zJh72l))Y(L%6RAznU`HQZ#9DEgSJ0zC4drfa(IE}fFKy@E(~Tb3(lK4lmo=^{0XBLKLaAaZcWR2M-GQ>c zoFT8Ap?nJ#5j()A2r{+T>={P3q$#*{fa^ukABWmv)|@KmZ%e$94X@32=&NG_>+BO4 zonUm02nsjXr=(copxla=@A&m78;`MqpZ-#DZ50Awg*It0&kAKXqPlFmK#bsnj)PR) zcDbbMg9um>Z%NJO%h%1p)PLx0L_|J6wXOicmZix|v z(sDN&Z_mTZjeb2l|Iu&x)A4mXjyo8CxyXgXSqj2zPca?)5fW8fO~lTI%#9~=lW)Pz z#?n-|%))O9)CsA;wD8b_G6w?2=J+PIHoD*M#YNhST%(%x)W}qAzFJTyLikJRcqfX* zyI6MRaRq-b0s#LXpOau7{Eombi&Li6wqy_guhHG);-QGdVp#FDK&bd`*4W~DGsk>W zYfCO$%ff(woVF}2WnAJ#-Wl3-W_&N3f7!f8dy~6q4~0YbFFf?j(l20{xE(=P8k z1xOao)TB;)4{T2E2#pu8+sDi{+ty|u_%20Jpt>H2S5RGZe4J1$ z`limQoQgj}+J!3*JR8iY4Z>&XL~9i8SEe_F`&3F4iylRV-}{EGkajI+*$V#!{m66j zvyVor%;&;Z5K_4(@Qc52Pg=)2|;60O=i;8&=}`iW5nJa{%%)Co-6Z!;21T4v^;n`mcJ$l6wwK z16`0yj!- zdwJ82RwrpqW>F+?ICpVO0%;2^I94lY=T&XA70Thki>SN}s>CspeUl*G6pZFKP-u;n zOpzqo)MdD^tcUT5Kgen>i?77wU^RFCT!=}Qpu*5n;ckj@WmTi-RpFja1UKIqZ`16} zntk1An4N>i=Oqqpz#49e_j0BSzsi{|f;|XX>Vu>6B6lG%WMsDK81 z=9`+!F8Dorzi|dg2=5e(vf}Dvy3{}#kn`p3!mRj4_BeA|`33CK&o9ItRtW^Bxi0^Ar_XAB z(+HvpAC{qI92igYwVy#LehBglNQH2~p{m&luwT`<>5w4W4C5xPUpy%-TZ9aoHwx=0 z0<$*Qg`U8bKN%|#4<5DUo*EpS@W{#Up)H-kLY~EbY=?G_Gwg%-VIMBtC zcrNN0>XdKfm7G_|ti!+vnY4yT7EH#=(&BFPiq? zvkYb#w2N8q49|fQmlZCtU1F}g9Z+c zVhSqU7(V+hT!LYivQ0YD9X88GKg&6g!m`2dES74uN8vUxblw;~*LM0FurXn$>roE8 zRBeY=S9w$n5V8xkI(Q3L(OC98M3})eXMfW4%m1^nAg@~S?ag4K1(k*nQ|WnMRA2%n zH>Twg znAf}|pb>%OhvwYY5HGd$`T@vC(3_U{gsj7#a=8@co{CR#ZHB&wB~+RrP(;t2_h*lj zGl`f1ll4#I^{te0JMi(B8ad(fGviwS|a}RSAHbj>(|7I)>T!vZ9^n|2G zaiU%Tp$;-74#n^*YF%8>ctiDQs#wZ`NtaeYZWF7WaRQPS9Vq8GWLAm+y^xUPp(^luFubYT zA^r8MrcHVAA{KM4&wTnyQ(adwGhV;aR0onw-~p_m`qJGTp{qC5TqMu7+Ch5F)S)OO zQ;qRy4_!CL@mvy67_hkn%4}k)tHn)(DqybA$$|@7-3%05E#~pHTyG!`K18Fbx-w6U z(*2<`bp_t}9VgB9yMlqnD%HYT=ypUOXT|N(CD=^-e9ns?4czS{SwDg2siB)6?~GsA zo0$0m^wc0n7TX;<#?0!adHhtdX=>|MP>^PG&D$jfVm+!q+b@Xsavl8S$Ak;WIbifg zEt}=u!a+f*hPQ-5C{3;B)>3>VpDTbl6kSvdZFvZ@axVVmVASm=&q1;}CuQ=xW#arq zzSpK@`;ovuYJH&qVvt)02TLhq9`|ib{VJ~xlPRh7YrMMk?t86QcLzIa^)NSGVF#&t zm}S)ZHce0!!xzCpTd}$)GWBcHd{P|(|8X=&C&VAdE8tT-+yySU$394xd%b!hhHXMy zi@EhL1m7h~mE3F&qYKt+my#SE35TI0aW~Cnwy`z46b|^X3y?*jI9SRMssk>-Sw8Tu zI?K!jhAC8wY=nJ%_%wd;Vge^O)c$6H2kuh)aKg6_Cwvo5aC9UJHk9yo!x&zemgFHS z74>4j&tqXmTsK%kZ_NKU#xZ_W#?ga=P<#Mr7at_9;uIJ@yKIqB5-;dj^c_+uVOvksP*GMhI%k- z=Gm|Lm!SubH4LV&sO1!1)F=}f!!K%2dsTo9mR1H1Lz<@2^bC180}rD7hKrBkOv8wL zAED3A&U}pn;xTeojjhr2HowNPK#e9)*l{Yf*&!*54_ zseNa>wg2)bwryMb6~52cQ-S}iV{p112h>{3_*xmcoC0U2-5A$2Dp+Qwo%pb(fn}SO zw*PuUxF|~sIJ4aKt(vy`Bx%oFr)gc1Ho+5&-_OCgq~&fSQg-gfe3>%=THGT{c8tPJ zTB2i=o6#mn{YEjtMB?Nl%P~>m_W7ySQB3{ee0?yueeccee`)S~c>2Koqr-#-uX&>S zn0dPP!ZWff zqDX`X9KILpqJ$~ZdR~Xr*3!&P%G8lHQx6>Pdk`d13RrJ+a5O@46N?X%VjYp)@}FcT z@%m~po@>wFD^4@V2y@(}IeOp+C_ctm!`Q!b<)-LjmMsdn0WNHSq_7O~4wq`T3m~bULoF~PVSa0h3Q8!dBk`OLzq4G>*6%utNrmt9oZ~G2! zQ&3`XH8W#qax7*!}ymj|Pu-9)acU=;bj zm?;iM!Ic}L{vf9{+hRnbejSV=G~uS$MalV~c~9)!MO6n!BaxN(pX_)sBXE}}`P^Jj zzBw~M)8aUwZFYRQ08_{Nm0=r`lo(7+fsOcUM#Lw8D(kAi+_#vI+)wzyl*gTClH--H zc0u(LRC1CFs<*yhdDz!*L3KS51>&ul7gSyR%nPb6e%1w5T<=MaR`D&iryYG6z{D5x zm=7@wzl++h6qr+^VS~-c4 za-pM(`hk!%YkJ^?cx?=Jh$yl;u ztf&pjRxtADenKbd%6C2vzH14EQ2UVY~WBR4WR~? zdj>C?>(l5$C-H1J_JxC%^sT^l2torPqR(GeleJf|p6+iT#2<>u(t&F#bL0UoF5Y>@ zF#`AE%?~7kx1Dj201IorArZXiY>yH$D>n$}qA>IT>;SxRuhoe71+>-dO7ia$|fyp5?| zf~nHSa$J2RmDlqR?$BFNI+hwPa|cZ!#eTuA{L|aFlG+aQW z<%<*afvL>bq-dF=*=LxO_V}adMF@V0(MP!KJH8kK=6tn$$n{vgQ_N^b}k zw0|-_1%eCRyn80&2nZ;!0&oG@$4y1Npu^Mdwdh!;9`vS{^oG=>8ja$~ZW}}DvVifm zpi`2Ev}_T#a>U{~we1Tn*~G+b03Su|YdPLS)h*^7DltsY-{~k*`?XS?YjPTC^gFRY zI^mjhB#t~nvw2D`U`2E5XvMb?ufhLiJlxMqE0fk8hZ*|^J65!1hqrsy@FZs1@FZsX z@IIt%Wv|4MRE8%LQ_}UH94@DHj1#3#He*;pbhBo%=p?RQ3)4#A*UrfG+L03I$7Rxk zH#bG*q6`zRXWw#zEMz8_e^H5Odj38O?poe{2j4C$5@#TEx0w%jVtujejumF%89np+ zA4LjGBNWLF>ZLk>E=CB7E}%vP$A*tCNrH}=|t_;$xMQhhqMS5 zMvC`i&~O8?dIYU!I(hbUxwrwQw@?<5&owH!cq(+cC>KbJJG^|ZF@S}h4||$Mn$3?? zP?7^$6{YI&-uH;?d8J+}Dg#+4^XT{4upTQNGfn78Ht%s zYSnUS*(Zr0r~Y#WAg54_qptu48n@dhyM<~X&6E1!_GScg3X1z}4I@o`B~DCPpPtEq zwW!1Q1DD!D3Tkbtn~OSs#Qnv-qN6XQ$1ok3Zpo&v!!yV^@M5d-ne~+%mL=f56>9{^ z0+kcz2yL&99cVTO9#;YjzlUa@erJXH`l!?P(LCC;pM~khazE!T?1rRqWt$oSeDNK- zUX~Yj7Z|St6c4>skqCX^y=1RfkZ8tUW9_xG5cLunQ}v53lKYSY@Y`prEqB$z`W4l- zYPC7g?;?2)>OVf_&oIYxg>BYR`bbIl8(F#ZHr(#__AysXd;2FW7^3`Z>g|sdYt+YL z?0FnF7r?6e{zrIvdErH&3(%*JL^viqpSGV<%YpNBGKlN|{7{|pYtwlm<&$_Y8b($4 zt3?G)u16=fs6-`Y^mU7DDnp~MTVJksN1bF-i5~*Yc35gdfX#)^LdB}eL{5DoBX^GE z%cDH=u>;6qJ&uYin)h1vG{CVQ5y)YZal#kIp`@#e1%2iL)6d0mY>Ur6P{Zo84-TtA z-!P$2`hK>{@ebFBP32XndK!>tdg)438ea|?W7OYN%!CDXc8M&zJxFPRu@Nx=^g_;6&I|DgA_Lt0TPF}OK^iz@2WjbyRmIPCL_wd za|T$}{5fE$(n?YdGr*F2j|_=jYS9<&UsIo+`MyHA^{6tXi9-VB)?F47?Igt(3T-#1 zT6YOSgiK%;31Y|f`9|^L`fKr~gPC1z+nhOsWXIl6`@CewZtU2dgtwqlA+FqMvu*3O zQ^mZ5w+mQyP8)7-V!kbgjVa`b2?BXe1}8dkkdqNe>}lAI0~}<8z^|bOYDdu4(di8K zt{hqaRKr7g^;GMAPsF?E1)K`U^*i~J5CEYD#BM8P} zHdWHqjPB@|&VycDKzV*U97OHXJumraEoN~}+gV7`eKGk6V+z`D!u}9~Y0IfGuBRc5 zSpc$4iZ-C~wTvPA4fao9Jg21lGlT{ku10KH2<-ZD4(rEM456^#6+a0p)Y3U{H1PrXp}S9Vun7%dE@RCGYz$p zn0=lrNKgWnozHOq7Ey8X5JWBMc?z-GQ<1)(I2nfYw5G9?fg9g@R9D3;q!1K^+2`(1 z+co}NpexRYGH`7M3GgT6V_K)hx7UVU7NcmWfswBm;bsxezD)Fyabdc4akTjf;hQ_^ zYt^5@1)Q?L49;!8?KK19A0IgdAYKz*yq1-eY}) zE5pec|8cz*^Vb(BF72_E^^uW;fxXnn@8qL$nt+&x^$DA)9H?lRYZ{{M=lXe7fj-nZ z#X9hZgl1E!E#&IC8f0kY`k)n3LCp%`&I_E}#&9wGEy!rj=>VYM+;NJv# zRz{$z@Wa}G&tNP2O(*#x4TeVv=`n@k$>&OO1dq5UWbH$ErD(-}2v0dZb{evwo28pi zzk#4BGH>f8=U0ZL7hX&rx&%HQ%=r>UNf)EmLb11wZyUAX0U`=a@SyxDe5ys&I?4yc;gjvHuvX9PmT5WaSS{VLk#SvaYo&voiNt1c!I6E zQjkGFexrV8k7JNCib`-d;%m0WQB#|~-Au%anK#)gIP+)QD#%4xZWOvVdF4;d>#p$I zPO1YgR3-Z4#37uj*sSvvkJ_FW^+!1OK9@xhAdp3M4V6Ct_s#8*{YhHGrz%XfWyH1+ zA&SV%YJ?{d7Go& zb*PmolSTE!95m@|<2NH4SK7xGSFBX(PjxTdT!P`>BrY0Dd*mJ(WTKw!my#p`&TAT$ zSyLwVh)j=g=dDMn_Kh47Na1@TT}%;|)BM8UzXqxN7006*#QTj$P1`;GV;Kc}2N%oW ze_@Dtks?q7AFGg{*1-2FB*+?amq_;X^z0h+vulvqK{`GHP{hpV&R5d$p>qhUQ04}ZG4oIO{PlQ!;z@{}Zhu6zr z>B$5>XsjbWS&9I92EGivCAHC;D@k)1lD#?{m!?t;!(Kfvw5M8+c+Hhk>rt<s4pnO=FJpL!f#8xs7CZfL0t6S>6H+Xfm?t7D0C)}Qp5wCd(O5t`N z=U5~q-Zp+CQs3W;Y`zo)hZ3AU{++aMl7rM|`_p)@w)|9in$4{c5Cn8J^sSGZ4^bYT zbEl(C>)0|1wv7i+>U%s4r<~55Wq~5sjP`f)C)}!! zWW!7bnbsvtJ{kgpDS1*olKnM|6!M97eS^aQEOcc@vV+sJkdZ6I<&=jR4cK60F=OB$ zLa9t7doL2OW=+v&RPO*9-!z)tjMzkn%uh$741Cm6(n6#oCh`vn6rfnE6(ZW!f0l=l znTf%p=|X+|E(_)bGd*L%wGK?!-Kyonma3Oa*b?|h<%*U zch9H;WP$zvC>?r}3orO>0#oqQ(iWU723 zj(c3+xjhe9nP&&_PyI(eVIGPR;$P?rLYz-bIEcfY5K!&E2XU@6f3Kqvq`tPEe2zxA zk?fyz`h+(6x~`J$J&dNdvdz4d6dothF?BsU3@pH;)-@viAfgO0*WR<{xZ&Zdu}vU)!mHmPb3f@dZ?eE?_T}kmd2(7gX_y2Ou^WI87%XeT_VUl#?Aqm=T^jUy&Kf zU5y+qMqecigY_#v3CHqEB>z)ioksG9|MOZT+K{MD} zZZIG(LvlLfERjlKaW=Pku{QU;!HaEh-CjC%jEKVRql=gafY$&Jj2) z1>wQa!4^9PU7aSOo&<@kec6j38)oVyUe*$zueh>#)hwz5KR+Y$V_7}n}-I~s^#)!w#rAcpmO+eQL0Y{c6(8i-*_ z-nKCtvxV4L{VVjr2~#jLD`i~l;{e9IXaKV=BSzqS1~`;ag_J{q?cABXUjE92%aMYm z>J}r4gAmO1>X+zB9EnVT8AAs9$Q&oU+BI9dK)zUdk$lNkp8U;asM?E_66I90ii-lA za8h{t5Tfc%q1Xn4YIP@IZn1JFJSjrp!lRqLsR39|dQ!yZq3bNk& zom2elBm2>l{HoWr8Wgs4YC|ygSHK1A`%%Ac+C2VP9<9=}N0k(C$~kk5Bn5I^J#p}a zVv19fA_w>U>SqNhXnBwOMQs8jeN7Xz7x2P2o^#uT@1eR)GKZYuFy(N>k5e6sktbTE zc{t1d-4l`-Pbn^uk1P3gt}1^u6G!t4n9B{>1bf-yFaq;970fn@0LB$EC7Vd_FT>{x zFFLsu$e!Ra`(6az)w10I{KEj{UR8yR6>4$3B3kLbF>W*h6b+*hqLawkysf)g6MOGd z4&I{r){VYxdMS-TC%G)-U`+#N+KWmI&%q05v`m{)iQzeV5!%euRhug?3S2UT0Mix4 zIeLM)K%!4TpvinJkHh#P!-oWM2k2M>R*$Vj$0KjBxM74nxjo^65Vn$ALU1Ut3IpSx zf7HOi0?v$%!QlfMV42rYOrkyH3XoEf}AqUjOuz}1@)s3 zD7MLYzPMC626INd`ie(?G-%}YO}x0NK};zgyrJp|lEA-l#iep#WS*oIwSN>IsuNu^ z_^M9`=W-ng3#IU7VL>_Eyix-5z5sy{Q5xv8wZlLT5*QJs!Ch=!SVU>96GL0}VKAK> zJ8K!hM-c-Yrc64}d7dZi056cuWCSL#tx*l`Cs;{~W!)+>BJ8jNwO?)En=2EZ2-#qt z&(=wE=vYl!C(XH7TAv8g95f;upKJ#rOPdf`8oDzkva|`l%0O8fj+A%>39>X`PZ_2G zO^7TF(;z`yQKKvk(;z`yV52!9?yXguMs&_T2*q60yxj&_+NBar<5Q^%c!5iAi_Ccv zoj%r(W5rAANtdjGSl~BPmbQEr?ABsN3hq)J+5aizREM+en6Lb#s43J| zW?ZNn%8T5uI(Yvy`6#g&PPtHT%)G2dc{7V*dV9I(y=HKj)3|O1x9wt5;|4C1potcO ziQP=9-$e6}p4MR~Nz-IAEwZTNN>&^*yH>L2%2o&_)mPwJP(E*crAJAmE6V5D2PH@X z@94;2X7wPiHCe*ZpIP0{n@u)2kXb#DX~1e%I-;2|^%b%LH8ZAOgPIvruR+Z`>?nn1 zKH`F!`KSvrGXc}oA5c~g1eDc-s;nMrIE-oFYM3RR{K?Jk6blI=k3za;c44ruD4o=- zoCwMK>e5LqK)6Z)YFJ3e+yNdkp-7;`WoGi*tN#5fA}1Rkna*%*j?2(&26v zunWkm$FHQswWsMQ$oVKmoGLwaApS{<4`R~q!|Y-+_`qT2BtVbM0;oSu1)1JVg@RFo zr(y+_yVK0C%nJHc+1+_PH7mI8gdK1!?nm*FZ!j_TYnBWxHp4Xt{G3=z_mmS|9UxtvnnO^1Ri|UXkGQPs)?x zN`Py2MvFXQ5md^JA$zLnu-90DC{b$SsD?J7)C7?P3>IlM7~BH+VnHj5IAy`09B$HC zv0#W~T}iJ|F*x}hK?H6VlqF>KQi*+O;%VtCR7TN@I`N5>ViOK9LBs)XaPLd((Yz4H zm%1pqg3h&24S2xxtzgsZ1QCEr76i6)H%IY%Iutz2T-nFT!`emn9wF>QZH$gcv^|>iZ7K!c{_d^< zXavTP1G5IR;xS|%xuObe4>gA@&X~~VG7z?r;suBwi7b}XLHfoWWWk~C-M`bP>7ZoY z!EZi~pda67un;z#k_Q!Ly5tlq)m@2-aMf3GW>)P;pE}b)KhwV4F8j{YKGY0yvk&AZ z-D2K%FXs}k@AM+tK9xu>x&xxW8b~z_)buc^q~~`K8KhbVQe8V(!!$!+u-KrR6Vq)@ z4iGQEn@_Vj>EkSbgAdxAtnTl@JCNqgCoFGsG`)II6|0dfG|JHYkZqsNM1c%~$9J9( ztjZQ7kv*}_5UdtN{UN;RT}~W9t?uFURuTUoZ^Llfo5ZZ+Em^96kEFLvNhq^pFGiW3 zUkg~PRDIr1H=}4)nvt)O`HeQQ06K{$pg%x29osnp!zFQ%Pjz@C`*o(m@Wec&j%2YM zBH8<-$OO&RB3X|C0b`BO3`BhjQJIFpk@+#d6KB%yqpb7CDOc;BK(DZk_h-9dwyOUu+)jc-|-0yy( z9iAyLB@-z)o!@pPGP>XzZ`;y9aILqkR)a%ZSRWUcX}^_{DPCrwmD;(}Tw$Ucj^^NG zN}BV*M$#OpjYkkz+rA`z4>t&UMN#JO1$|}};Dkf3iJ@ARYatyM=bl8#2`@$@O!6M= z{vRrWeQ76v6Tg=gVHmRQ#LPGRiryaIHNB0``$^}=ACmnE@L==JW`j#=KQGhGY8A|I z_rWE4Fe6P7-+CmG9wLU_H#|ffao^m-RSUWnx9^;{jj20 zAbr4wvncx{j=6SO$l%jGM8V9L?&U85ARiV0`mF%a?<0Xpu9UVJZz-qZw)E?~KpLs7 z#e1d+R*-13If%E3wGzBh=UJ16)3uZ==++9+L_Qm4qYk1(KvZ(_g0{<6kC*yzZ^w`D zy6-{nj>&K4ra)7WStghfwQOT8UiVhX$X~ex?rMh=bLI3JyCfrj_0FY3`A?zMe??^cm6uSX59SZqqvg44tEK~@Y*V# zfq>vWCt~IUja(&F*%xv75%g#%!IeirGIFGZ)u|D0v70YD6^Cn)ck2QaWVPmSkMIky zzaaa&&};-iHhrTD1h2hG1q z@F4`F47}~);wI!5MkRLyv6>+3X5x}T< zpF=mE@Gq@;N^VS|w*7+5W2){GPn8b;#iKT=-o|r)GSG4dj~X*t+Y<+%1-NUxuh9T>01KC^_TsmXi;3*@?sbI9*Gvkm8*n3 z!ZB3VyWhWUDvEGj+{V3KdR)qZEVZ9>gIMdn5x*RB;m^H~Zj07chU@8Ta> z_cq|7y;f*`GtONg>U9spoGU&G^f5R8N;ifbjPkbhp{A51>yxF)C#q7Kw2g;NB8jxw z`9!CnF54gK9z$7n2`-)Fo5vXWz!c;y@xIS&wH+4&Ozvt5_{aWK597Uiy2tTfs*VN4dpTqzy@^gDRiXSoumpTe;3Ab!Rv46K|G9d$`(Phm%?sxWW+o;~83 z^!zSBM`&D0cUq4GI- z$ds;jy4vo;0M9Y`RgLY)MRXJ}QoI%I!>I*+;WEJd0-9G*6xx$Iwn>00tBKvKwmP$Vl+YBB52cdz3q*f8lAgcQL5gOrBcaeY z-SCtnA9eYWFfBh5kbf*ae|NC{u~6tfsUHb@gY`4vaeox4 z))5gi*+Id#n%7(%NFDQ<7i2vcM#?gkBT7#i5aKkdCbxTpK?=F#h_Yi8!JcmB!G;DE z`o#^z6`W8?y1R7#WnWvkWfDjcGiR(9Y5p?47jRcS>yh1O;dUmsnBUzd$@f3P^cP-y z6g7kv9=Yw=wcd_?G;yq(zv*r^n)%YqrXP}hRGNOBGz}tQQS$`q!7#0DXGs^J5;70m zH?#tHeX=B6yWd43OH=bW73G6g&gwnEHn-6@;Jw{ zkjn>d-mqKcB}BAfgKNBmh!$*ct(Oqd0{41W#rZYo z!RF-Dq6JujDGvw6!HE`l4w&EPqdBgx0|MM#T}Id|(r-$4}Chp4O2TQwt}!!ke*z+NyM<7Q!JT$w#Nq%@A)HTEtFmXH1LPsY?AB z^K+^2MC2>T6Twr?Y%Uw--fzE(z^clA9Z&S2;*8KNr`*MSA%>*Q-Lf0y^a-JH7WQM} z@}+l)n=cM=#M{0XZOSM|y{-HBO&H+7@({iSmI7J}OZ`?@>Nj9HaB^63DoMUr3FRVg zk^fg|f#3!!Ol~XeuI3tZWqQZ4e3 zU*sQ#qo-KPBn9X|fDkHhS|IX0${4?@^=$>KaEB2I%sh;U@!r7iDAhzC4hR{cQx)_< zvK4!Z!d)pFGKNSDmQzYLZ*&TVAIoW~wn2@H~)h;MXF zl`S|XxZ!8+<*x0DOa5N|x)>?aD@PDC5u88YCU&JeUe-c%!0rT2$ZGVNr^zZ>x`f*` zfB}&N#v*_qss5wFD`qzTZ<%wf%=aS~OdO6gT;xuk!azF}EQYNoPab0}mcVZ~uIlI| zM;Iv`NX(YYM;q&v?d2mAEJKVS~2QVSE0sBr7_(TlYV zAXYI7c~rZ|`UA$F3_0UZ$g}J{N9h6&wt_y?i}GNrh=n%%gDu*aWyLuuR>aT&Ix9~3 zgoKAyocgU+oMMtmz7Hc1A*h;UN=(yaz$8;*V0KKC%t@MLJ^*zzZLD>OPBA>Zb{vee@{DXPq{* z{!G?Db|LUC-z_1r0Xr6sAz;T+Wefc$hvtt(3#lCo%-slw7jTY1SF=wuqjRk2_eW3f zHP5sI(!AL1C#1w%SY#) z6EqC~3~poHp6cy*h>+UtEe4ng>|*K`6=b@p^4nI^fbCPkR_z4)HR~;#lUA$uZtPuC zP6#2GH#Yz~h89VCyx3B9RYohpS{G!~UTpcv#zlyDVpC;qe2+Uwi0Dok{B-dk_jTdt z%!M~lj0u6*7`s6zt>lO7@9w$|9xbpMX>0cRTU3iqsYDc|gJS%Wo)p?gs?%6sw(dO3 z_OJ=)39Oii?a(@f;zoDjcj01Tg;eI*%OQ%fHbms+vrYa`NEO^rghhco{e!McWCYM9 zwL?WuLRJjg5Y69cDrmdV?Ic3s1A@w!xvgCg7MB8K4@w?fOZZH8e)i9Q0Va>Dz#UCa#PkVTj$C|g zD~kUCS*ZFz9sY2P?G;HchLMms4sxM4aT)YIK3HNz=cU#MgeT+)mB8TT44uaO1s-$y z_4zvh$wTi(Hg^F4M~Wg(@L8vB=hd7#N{gY)Fh72`KXs(@Zt4yb3uOzl@?_2$r;mT^ zgV;AOe;J^bnMfQI4lXbmG4t3bWwJ0-Y>=*~PE5Sf5kW^%D;tN)&_G9wdsj zpvNRzo$Lz{R5JPmVEb;w*Yw8GWZM}6^b#$QYmwX>hGj?Js32J+kjI+QGb2dT9PN9q zN;AmdxTtIfJya6YESWD8k@;5_I2ObFs{mP8Jq~Uq#+&RY3$MxgA3`Y^9_%W?-0ntJ{^cr!04WunO39RXGCk53 zEu8qbuGqBx-#>EGL}@Qk&ApB-l34OjxlqSFAz@TIsXgYh!5_pzX!(E!w7g{@G@E51 zfG|7(NVd^BX+~KH1UPrqcAg!ssQ`B@8x{rW-|mapR&K z9?TRKi+}IOSF!lFg>ddy6^nmc$f;P)1%NCgDs5pLye=?DqJ@TpdrK%o|bmdNp1bYf?5 zj@aARs1q}&SM{TqkSeu zQ|v04cBpXuvxf@TMLkr^n!o6UZvL)2GJXEm2j*`Ou==mf-)R=&?hGgg?pL}1xYo@I zXHo*3JkBJwJhI+7lVO*Qi(h1W%;wMJe|;g_McK)Tv@1*Xo)Tjhl`cw&aqEe9c)FJR z6KRXeqP$(AXX!oPFVT8v{IeJ3tckqljcy`0!-qm}A+`l3^1r?i;Th?*EJT?x5@mn- zNNqWN8(4u`h(&HLIel&qown8f|5%8F_5SJ}C(-{?3-K;^wo^j-7`TAo z{B8IjnLkKz{s-sJEo<3(rRte`?|*atj?5yY5;KjEN{pj{l+J|fPC9?j*D`w6{QX3t z|NHX?Ix*v%GXQnNa{Q<|42a+M5M}sgQY~vDR0x=?A<)eOn9`ek|NB07h zMVrr{$y($na0G^JIXpCnP(RcsV&;Yt>@O89d)O5H|2dHfRUX#;k4Pis6v*NautEF2 zhw1*JDuj5?jIQ`ZQQvlMCXz;r@Y0vQLLBt%cn9%nRBW=gNsIK0g)GcpP}0rAwb)wstq(u6h_xh_+It)wpb^mIP3{>D-7w61z z+ydOX^)4uot-FI4D9t?h#1o=pyXk|8%qxt_0x$}6*}|7>q?JSkG;Ve%Vi#&>!q1lS zq-(sg;Y3(YnvxPbd9NOl+5j+gl%JC>^IFGAH6?nI%ZnhJ&HJ$n;p~)Kfp+q%V+Jmz z>~owcqX>Iy`AI;6&N`ZkYDDa0ec=w`C@g1h%r<2!Q1rsM{jV9~B9rBU2pBnm{@U)~ zTk`ga9@yHMQ>;+|G)f#7XZ+7X8BDj8cvonZ*DK0k8(ib{iZa*+*LuC83~neI>hzVt z#Wk;_3@&oyp(w8mMq^Hgf;Q!p>@|bQhi#auOp8Qi%JF+X_HlX2oYIg?<(7hOD=J-3 z=8ooMnyQ)OE~uH;yP#&i13@8WUVW((rpP1*gefX+DKEv@j&j?zAC^gQB4&|2TvFk7 z)b;;7eMjwl)g3iH<>UaQc3=d9>J2cO1BjJt<1>#YYL(~vxLJz%#AIJ9jE_BvtA@)S z#nrcrJ>cYy-rOP$+m5M}S>8>{7@^`E;1v76~5zkPYz23kFVU{3pk$dsxC91z*(^ zaFko}G?rLmrm@5l6J&}1>MDOr4zk2IN%Sn1_?;5{Uu22N^T#a^hHBT#7XVdvhkTLZ zSh0&ITNOd&&ax`3nku&lBQ!`di_!(mn0d?NL?O^at0CJu3x#HC$P|UBA*&#mXK2W9 z%&;z2up#&^R`eU^$xWiLn)0@T7u2!?_z;YvCd(HwNq=}A5{#qz$HzD}=wlqa?PDCX z`54D+KE^TIphGfd^D&Oue2gQB7VrQdGj9XtF>#uLZOOvFV*i-}NJ&cwt?i-|CpIbMRd&*d&&C4P(A z&c<(XTPc3eXv0GUQ(z~^`p8$;4nYc#UYP_e;I8c(Fl$ax=g_=s8)Jzr4)c@!TNzc* z@%~`!P?yA_(tKty83Q@`@$na)O^I8M3!!VY^X_dK2=>57tx)#iU>(W6_Ys%cYW#w# z#MJYG?S8(n-=(2WDTkuDHGa|LqbqG?+;ccYEg22A=)81cAg-@NTcjK-d%bV~`J#y9 z+VZJDmAItCrp@b88_!Z=pga_pVREzt++M0_RE+oe zJ2<=P$iA7Sqh|D&U)niId`ayU(S$%guYbr-X4Vkicwb1b^OSTw!7$#mvEJ=%0XKAX*~oiX6u#N_ung#>x4lp14vB!-0KUCm{th*aU5NjDfKS&9UJRYnGC!@^ zbRJ|IMf7H*9+w9%BZ(MWw}2`@aZ{xC8SQkc3joys$~=K0#LPuy1a6gm@0EzcKfo~H z5(@jwb@RhjPgRDiUWflL!T+uJw+a8gjDK$e%7o_fuVBvHxp*k|GH_N;tjrAz*T=47_Tpk^S1Oi;QW%#1+hg}Q7 z&bzx)a(9=+w6NnH)?gp;O_O5rJ(=v7EbOSprf}P{(1k_|LDr^jd!h&p6+XjVw|y!V z-tUFC<(|%c`(~duFe|PZ==0o={)#3L*DOJ`(P6w!i4;6Tj0+M?le|nTuNgN@;S)!^ z3P~zr9wwA(9zI)IhF4jUhsQ%`36NI7OiZcNOso?}PG;h{G3s~d4tvl09Cu~>YmkDX z9rOtYh%l}pJPYRx=rp3_RnnR>#aVt5*%HeJFFvDc^ebmneX2PA5I7n0`}Y!w!+RKy z-gvMlmQR$2Pm2}dK(La>fP89|w*sdHKl4%=UFCzd-ioq7aJgJK!Cg<{W~lAG?4Qu` zWALjir7|~F`jNI^U71%8Js7ZtrL>DHDm>^>{GF{>+K*Lw%|())9H@GbQ9VsZfW~Dl zX0JZ<+taWc=zgTx{7}QhPTQ9i`DQT>b!F)XcvQ)(9-JOu;e5^>o*rN6BnZRuj4da; zw!+CD2H8_gYJH^>J{;zF*iMySF4ZvTHT3d^Y16%_)?u%8r}nlNdy)1w)6ko~1+IW_ zVej7bE$}`8e~3HNx4@$Xg#2g#>V=9lZ~(}pr!hoSrfUhi%#C^=Lrhh=7D$1ZDimS~ z*fLQJ0VIV7?n>&oiD{e$9_!^mp_!dcbJr*)FED(_$IH@m7^ZWXxe-b*pXY$6ydqr( z@>`Vg3Pt0}kv>nWa6eHe)l?=om<**j zSB&G=Jd1PXMZ7YTdjHZwT-~r0dd*AOF1XQc_hPIyQ9K+~^dy?^eY(+o`L_yKu4$bu_i2(i3-Gx?QptvIZ^RsliJ4 z!)I$YwaT-6Cu!~3?JH#*t1x2sgvYhg7ddZf5v9$uwzsFTa5TQPd zER=;+2%%|dK>e89@%Dp8Z2J7*xK~#d0R20p6EfvW8Jfqu7|wWhc3qvQgh(HxD~;oF z;)p7hX`GOIWiE6=ZkD;wB=43{%Gm--Xms1+K|3FB8S3;gMLLkoR(bLvW8-G$b{1sL zgfgS(hP-*7;bmRM$s6~XI^5Sq8=(7kql+=ER+egFFQ#UscoGxFOY8fYuU=Md=e}tv z2Ut1agLJW`&X?(9ZJn$KjvQa4y?iuX2eW%Fy37{VV&h?sR14$#N!FBjC?AifW9o@6 z>k3d4SO%gEO{RJp_Jhv$!}HAzoKhTV214znaORMnA4WSOAD!)6BsqS4s-Y|s>D*jY zl}5G0T(FTYhW;|lEAFibZe{SpQTTV%3t}T^)PNNkj+w8`vn&D-6*Q?rXp*HjjHpaw zA0cc-$jF$gv-zb$Dr>@_lG$mQt?V>%8vF)5=cSqs|dJ_J}ghT9I;Qh9MvaW zRv(ZA*!?466te@b6-{IKe>AhYPm%^CY0xGe<^=X<8V(3CKapwZOWy)7Mj-F~>09(d zHD*vKHIbo$gCLoc`4Gy^PJ!xia2yI;Lduo_q)aC}(jmMD{bv%A7IUUd9RQZLJO@{O zvTq4yU;V;RiI8dz>$!D~dzfYwkEkwi0|Lb^P>(>l3tWM~*)FgEfpc8od<0H!=UFY; zC)~74$U8;vYb=G0$T|p%zyy^Ip+iC|GIFsyJwIwuthOyKh&%~`5{xB7ndzLG5xZ1w z%?I;AGlKmIFURLA1V<&h-+WX__qet`>%BGe+X69Z&3vg3ZViUI`|-=3!rhI0%iT;y zCcn?$!jhgZv8EmdI9-w{)n4RoRE9s3{s-2iIWntyMpHW^FA!A=F|XLIr^BC3cS~N$ z0WUd6Y<0HwqRjH{(RB4Tjnxa9QkSg}={-l%)xCaOgW2n_?`0uX#w}Ckv?G!H;<$&A zb|f9|v8@3?v_kewY=+X|`}{UXPdZlG2&KcH@moHU`vRe{4@$x9Y>4gInJ|Ff89Om<}g2762a1;kK)Q zFaYB5bT|OwTuPSa@VjN3Q-4G|1_3sZuR+jD+;tt4G#uxZqbss^p+YE_xu1lI!vqbI zE!DDi_xr2>;<=w%2Je1;Oa9W#mJ^KEYWV4*Woamfct5{gyetmo6Yu9Y;#MBXZOlNi~hsG)Fk?P?uF7)Ew95zgNUzwBpUTTLV zVJ0oBRnoPG%Rr(tGVAHpM|8*dcuMNYbaMXFtB-2zO072|_GanTX^pLSH3&Yf9%XDD zbh5SvVn=%Qn8u#%Y9OAZR~w0i&gOiwdeV^=vtAy^W2Yn8LSX?*aiG>W?6uOE`N+R> zV5M?7@E7XPD0yd5n6H3sR59nZIuNmGUMXQE?r6i1wrEl(0$IJm;^BHp%#$P~;l-VbLK&ZjZ31d}Oj zZj*epyAHd9%ULSSjmuf)#cK08D?C1EgPiVo)T(LU5~hj*)k<^U8zC*ZcBv*W2x;?sA!;0PIipJw4QJM%B#Af&coqvEO`jNAwG`%5TYLOm>fvKn-lNT6x=lv z-LP){X;e(D@E$HLxvY%fggdH%K|}CFdN)^6W;M=o2u`N=Z~>8PfvXa*(hqRmfNSY# zIEuA>Sp1ElV9eCulAd4*&_9yJb-I_e>(DT8f!cSB$5LBlV0cPL29{*1bbVoQHJh^%^AAi`u0BmWc!00yuu z^OJF1^E#cLj}h&8!08tr0JD5lWHX3+c{}59M98%Q*D)LPb~BdRDnn?JAwUd_$=Fy_ z*uI!ajim?{t|+@oy0r;dI+pC~lZs0*CeGZ;pJN!5BKK`y?6CkMK0tzN$Jv&%`<{JB zT22?+IT0S{P(Bam0uR;GTd*mIq)4xdlK0p1NbqQ+F`RiT<*|9>s3J$pWAaQyx+yLG za|}j&Ox(Yxn?}HtsS(1lPBJfG|G<~QnAilo3L#Dk~XU1)!67PGmh#z=afX+xm>D?^iW(7wYHkW>Y1$p?94re;qXnGHe^W=j$t}h!| zRtnw{2Od%b*h7=wt|lqKH+JY77myC%n_T)L9Vv)YDEn3X{JA4#B?D}zJp3{!i&FU?C<$BAWyWXSbYaS)PA+xatG=_j&xQTLQs$YMdtpurQ?0xO}Vhc?xWOsO@ZO=5^b|UE-5Y?%SyX%Dn{*cznveh~1V|-73k3@FLcu~>NJ3XD zHut|9h*oU1Xu+3QwdzI+HYJ-)G~4ZB3yl`6nnKmy&#D#cHS`utYb7mKEm*I+HbB7Y zow&Ig|3+Cb((m^>GxP4dNebNi-S2t+&!5M}eP_>BxM>|nau$4=a5)mB* z6J7j7Iu=9x06Eaxd0Vyk{H(we#VIWxGV~zpMARJyJNAB|!H$ICZ`=FtY?t1%<6Ruf znuZ`|J4?vOww$Jw4i%`=t(7{5Y5o1n0`K(K^ezxC=VK=XQC~t_aWNh>H>$&We1^Wk znMlqocRLoBXTyCh_Zf$@tHaGuN6?2sJ>Y`TB2ORq+xFoP-*o%H#tH`SM7^T&bKoV)9JM7D%3LRQa@V~qs`Z%`QIq0}+`LrhV zFq|@6jx@aB?jN##5Oz206Z`P}+|_>PB5U z5rW}Hg`E;+R50TUHUmd9M|>?f?ao1w11H0U4{_=$A#v4ZXY*w4P^|S3H=b(|@I`)5 zN7DeO2*80@>j4WOKjc+YsX?8^8V<)=4_g5FLE(LE6`SZ6fc>%7{T4uez#zZ(C9F}0 zraqet9o{=wKJ_rp+4jCv$!|EFZDz+Q4fcbCzq^iZLogKg;$x>?8vENg$ox;hwu3p_ z_(6H=$2pCjJm3<_`h>Z5?pZ<2wR6uRYObAw<3F~*4wzXN$w-|1QrCZHNyJ``3v%I- zILJD&N)#-KI_?IgC|CwdB49FYJ?KMz*IWy;IZ4A*pYH%~&1TvKq+x*I^xr^JI%SZ# z^xv@6K)08biOO_oHHHWP>BkAI&V#28G81*sL80?h`0m#)gL3BkJmxA^;7e2SVYM*j zEb_}~8=I;Nrf&(pus1#&e7!Ht7LqOUmQ*c7LVV?+9eKiuN+_cOu1c-hB-dg4_kP2yKha`twjUNR0 z(F9WxlET$eeXvK!JT%1qxku(LxYZ~Qhb`5D#|&0*-;5xyO5T@i)mjY5+9z+BUk;dYXWcBFy<6TV?Z_^X$Uq(NX6iVMv^VT%))g`)7w5b0Om0) zc6&8EN|qhsIm$#hTDJ_`)qn%gz_LTyI&q1BGq4(g(lcjpDjwN0 zl$|MIX#uu@ZKeYPh5*z{Q^%0gzp$HNHz9l^v8EkiP>eV9W0}%=4cuC48b+`q{SO43 zVK*BF*@=z~(q_j4tP}BQWfl&?+;uGb6gSh1+pqrhx1?#1@;)Wc?t)=o{D5e0`As~Q z3_74tCmgmqA$Jo#zKA^B-!_OLLmR&Ai!w57)>`rTLqyF&KzAVN)lALVJ#V zDoLz;bQ}SURzBG*JX6eeR5yDa-y6_=HN&yJY%ij2{!ihKf*iIIQJ3nRY_D-N!002L zbZi=sIC%r{)`2OlP!eek6YJ`V6u1FmaSW!y!SssG5gV))%lQEG3p}a|-$~{L=E#ta zVMqtD)Wh~VlAbAP09e{RqQ3PAdp%4-)%xYCW5ck%Wmkn2G)X^s>>+mnBT^TkS2yQj`z*|{#K!#=MkTrqSQt0jBpNt`MEqBa!no~<0cu&m-5zQk(^vM9 z(WumQB${6hZ)o@mG?(uhG z9rY<^G2t#XaIiVFQ%x7n#jx`?WU)>`v<&?C&l=$FE;o4tzB$_M0SMNpn^8lijcWYF zWsIr#59GiyCLnrQLJ4_(lrM!iD}k1?inujY2{QpYwvTeP(TOr|HS_K=d7NlCM1h0% z3XQ9L!ol0|e8RzdrTOft!VfJZ6LVQT$r9LxM5^ZU*yd(^e_xPfhLI`*=jjCwF}2vk z?fIO2HV3?i)p$ofXS>aT1d$a~*eBgXM&s5KsDl*ZF`9mq9LKGvbSWdg%IU3SJ=rb~ zz^{d2u;?Abn;G`03j0C}3*fX&_etWfN%PXhWc~7l*a&Pc;;%^q%*A^t zf-(Dz_fiBuQVZ{;5F48Hoi!ZzHV*v9Fnh87K=2je>1C>lvdn_5;6TQMV}9~KG!;?* zJSsYb-V%(9wBlYCfDYODT+4fT1nP9Lq4jKtVnP~%UzXOw27wKRgG7t(UXKr7%Sqz4 z#V6^tKYd-D-#W7G0zl18m@;{FsMpUzQFw5f01WZnbi?!AU!1)FRhR|0#eMrlp(|)i zN24%1a=Vygr5V2j`&uSjg75ybNDw0)s#Fi0U%64DKYR)B*@VtQ9_fGz^&ucke|T4N ziM`JH!)qSqXr;w9Ivtn`!OMVahLbsXY4Q2CSqdFPZl;Z6nU;57Y2P!`L03hYnx3hv z8Y!%bBGzWPh9zAUC2l$}PY}RK?}$B(h+c)-Gwm)

58$v|Q2GOE9KT)3J1bN9mYA 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

&yYV0z8aPfl3`jf^NQ&?Wg3scU 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/bg_lib.obj b/quake3/source/code/cgame/Debug_TA/bg_lib.obj new file mode 100644 index 0000000000000000000000000000000000000000..5ed2fb1d7852d579923917553c2e55559afc8515 GIT binary patch literal 3424 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

rkl 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 MK9x#DtA4`&1AI>N#Q*>R literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/bg_misc.obj b/quake3/source/code/cgame/Debug_TA/bg_misc.obj new file mode 100644 index 0000000000000000000000000000000000000000..9c2b18e4a5e401f1c659e4af9d2665f5cce5c7e1 GIT binary patch literal 32248 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 z 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/bg_pmove.obj b/quake3/source/code/cgame/Debug_TA/bg_pmove.obj new file mode 100644 index 0000000000000000000000000000000000000000..3d0a168dd3f702e28f9585a9597ef67c0c6c8185 GIT binary patch literal 29270 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 P^O_nO7uK#s2eJMem9Dz! literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/bg_pmove.sbr b/quake3/source/code/cgame/Debug_TA/bg_pmove.sbr new file mode 100644 index 0000000000000000000000000000000000000000..69f14bfec64a840fdc8536d56ed1dcf80ec66281 GIT binary patch literal 57091 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/bg_slidemove.obj b/quake3/source/code/cgame/Debug_TA/bg_slidemove.obj new file mode 100644 index 0000000000000000000000000000000000000000..1bdb8ddc68a3647e725c5ff39d3b3c7148b6d95f GIT binary patch literal 6176 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 aEE7j>qH$?|3|lU1ZLY0sYix<{X8#2$uFuE- literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/bg_slidemove.sbr b/quake3/source/code/cgame/Debug_TA/bg_slidemove.sbr new file mode 100644 index 0000000000000000000000000000000000000000..0f014baf704648895d685562fcc73111c9f651fa GIT binary patch literal 47459 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

kId2X>4wmE>3S{`Nx;w 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 MsXdK#Di1;WH@Oh3od5s; literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_consolecmds.sbr b/quake3/source/code/cgame/Debug_TA/cg_consolecmds.sbr new file mode 100644 index 0000000000000000000000000000000000000000..18aea459125165c3cb057f2cb7e42598e5ef48e4 GIT binary patch literal 86436 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

i}LU@e!^U_kLz+ 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%0D$iz1a*-Y#}7 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 O*+I%^h%aH&y#E6XQ_aHw literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_effects.sbr b/quake3/source/code/cgame/Debug_TA/cg_effects.sbr new file mode 100644 index 0000000000000000000000000000000000000000..8ed34034a6e672c5dce82df687afb5e5ed9be61d GIT binary patch literal 79548 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 B$J_t_ literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_ents.obj b/quake3/source/code/cgame/Debug_TA/cg_ents.obj new file mode 100644 index 0000000000000000000000000000000000000000..68c5a1366337f7c7b44136807813e62b5d7befee GIT binary patch literal 44115 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

PAaE(eKjK>eBOZ=K4TRQ4q3 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_event.obj b/quake3/source/code/cgame/Debug_TA/cg_event.obj new file mode 100644 index 0000000000000000000000000000000000000000..79d1228186fd1fe9ca343e42e054db1e2bb61019 GIT binary patch literal 52862 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 J?Qd!k{|{rZ;<5k$ literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_event.sbr b/quake3/source/code/cgame/Debug_TA/cg_event.sbr new file mode 100644 index 0000000000000000000000000000000000000000..04af784a22c4bd16df5299f2c1da08b4d7ee7088 GIT binary patch literal 80037 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_info.obj b/quake3/source/code/cgame/Debug_TA/cg_info.obj new file mode 100644 index 0000000000000000000000000000000000000000..27b30d6a81c7978abe141ac7089f48f6386dd246 GIT binary patch literal 6756 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 QkxA<)S25q>#7m9nKOjCiWdHyG literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_info.sbr b/quake3/source/code/cgame/Debug_TA/cg_info.sbr new file mode 100644 index 0000000000000000000000000000000000000000..84544c3bccd551f2f5dd5936b960ba5dde6c44c2 GIT binary patch literal 70359 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_localents.obj b/quake3/source/code/cgame/Debug_TA/cg_localents.obj new file mode 100644 index 0000000000000000000000000000000000000000..7dc7553787bc6ce7d46f5bbf63696196f604459e GIT binary patch literal 10323 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 Iw%%I!Uj?aOSO5S3 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_localents.sbr b/quake3/source/code/cgame/Debug_TA/cg_localents.sbr new file mode 100644 index 0000000000000000000000000000000000000000..51ef14fc79ed4882bd6c7dd41c827b75dadf6e18 GIT binary patch literal 72909 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_main.obj b/quake3/source/code/cgame/Debug_TA/cg_main.obj new file mode 100644 index 0000000000000000000000000000000000000000..6a85afbafeb42515d9d64fd42fffc3d596e9ca59 GIT binary patch literal 77768 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_main.sbr b/quake3/source/code/cgame/Debug_TA/cg_main.sbr new file mode 100644 index 0000000000000000000000000000000000000000..67ff3713acfad308b5f2abcd7ba83435c37b1607 GIT binary patch literal 101107 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 VA+%`;v;~1?30ak|ueQ0;_&@91w>kg- literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_marks.sbr b/quake3/source/code/cgame/Debug_TA/cg_marks.sbr new file mode 100644 index 0000000000000000000000000000000000000000..270f3a9f56b921fe833a85862b5a4347d4cac69f GIT binary patch literal 89233 zcmb5X1$Y~|_XRp0kCS+_%*@P%?J_uylX&aIuI(gkx4T{^aZ+!SIE|gOU1shwGcz+Y zGcz+Y<2(0Ani;42{_pp`uU~d`&Xq*E}G6pQt@$? zy%v#G3^Lxbw;-}Ak$7v$vfC_YRVx_S-CEtssiG`9YXxg8YYj`M7m}9zA8Im?ugsKs zEX`-EW#v%CTx%qYm!4q->nv++D_5A?T^OnqOM_P30!aPZmc6SLTw*6{9jh{Ls9@Q< zF}1EWDE(>Ym|D-u5BK5Sc4umRN#VWnOl@Ed7b>Iqek*MEuo4?ux!BZbER{tw=Ne;8 z@wQl_We>168(F#T(!fxEVXmr+FI~TpWe>8%jjg%-?3Am80g>?8>chkKZcScSPmmVGZ14OTB7cOO$xt9PK(W7+pJ)oAsTdw{8!)nDqf z><5`>lEk>pE&CxRo2{YJ9Ls)~i582Me1wU(B=G1*ncCT6jUQuTvLrw~&Q!uG&mOK= z_LJr-XvGVadM*1Y0i2B})P{k=Dm`tal2&)2*l*d-7$9Z!_LoY-mi??jrdYkheBg0f6-40h#S~S8av#66Eu2DI}LyGro%LL*_WEp}h%p zwrn-^A8+N_n&Jse?WhXsc>>azY#K^L&a#gsbRrre*^rC1Wz+E(){t|Fo@B+6O_qHj z*TR#nT(Q(O(yLZNH&uVKWnaYg?-VOHRKXl`F;l1FD<4E_GL_-fh4pS%f6h+Gm#YyE6=j8AaWM6kMyEnEc;3VXIr_-z)&w2{jhzt<($k$ zI>%D)c@3+7u9cId*Kb&?@cQRrWt7}KMN}3m7NGO3+#CgQ7FlvR@^7snwKB#o83~8llTD z(57W_0?Rxsc`vuJttln*0f8&5w)RBAvj384**S-w=9TOi%dQW|sJzPR9V(S&NU5p% zYBWMBnMpRGBQa~D&}$UpAElTOL0oIe=YcO0(;<@ANwPG8k}w@2eZ8c)ieR=w`UV*@ z7)5w@%y$586reMWH^&@@^i7g(YQTdr$sv8Sq!W_HEQjDFl&yq3K# zk=q2}7+jC(+nG+I{nuyu4oPDuLs{B@z?}l5p(ss|=|LI@)6!iWUK~yneem5f2+M@G z_QCf6E|-Q1Xou~5@V!=de*tQ{tfJfd@cXRZ?*5Vt?HvS_=iQGIh~@h+X-9p+4}j@W zWjFcY2d&>*&o!=f*=_|S)~-roKZQJLaC^bxDKuTbf>?41RaDm;n@353tc zvL|a%=PGiKQ5u89vJ<{S9w!WNiVu7O<>1R4EJ5QpWj_f_>cF>a_X$5`^{RL4@PSWb zJPu>#!|QeW;Aa4jNR_9WVxL8^0pA4F|-HS(%eUIJ05uvK>R$-gXcVHT!%ANY#ZTPaB2?oMz_jb62S z=L{Ds7!i42p4TkZMO}hP7rjn^Z`*CKH>@0_2J&;cPFZ%3A>I^WG(o{v;#(AkcH3*D z-nNGHnCbJ$y@PpK57C)E_+7xNeTpXkdzR^{J$!=iTdJpK8L+`%o}caKM-G zBRpZGf(i~AsgJSw8YqpTX-WqA1d!Uh4f(Qu3KZ)lx^=b@{LIP?4`4#J>|q0aZt1=( z`?7vvp&$8GSB%`3Rt}igtRq?+14(+~E6Fj+ETd!;{55h7ng*F;%KFAC8*Hw@zO~A_ zBJ&LN9Tup9UOo0?p=!8(Z^^pF#cnSn`-5OyXZH3<{%DO1sv)zF5&X%@jSTh|2QeJ? z)soIJe1)H_QTH?3kCeiHu|`d8_a}_8s+eD`+^F|@2l(>*W{tY9cm!wF->ptg!pEA2 z9zhibP4@>DPBUAcK=vpz>;B34WDY*@6Ez`i{g;}Us5x2oNhXV%>u-MSlIvuTlZ^kU z=|N{a#gM91|CP@}GM(yslocSzaeA7OcOMi8$k;@d(>+R_V=J7w&hRKbs{{k=6v=lM zNw$P0oq)`_bMO_MZ8%lEP(WrjACOv$8NvYwew2S&XIUSe{p@v}%^)XjOR zq4-dpdC`CjFjwX>BZC%GB`g*g^&Wn?_i$-~#qp;4le)soD9jS5v1YE+jKE6<40<*9 zOiTGX{~97o`#SboBFiWl%f61uWzC4-rU!kh8*sS*#<*U!Z}h6E+2w^*^XN@gq#hJ2 z2ya#*?v!-K6+xKkn)@a7M9r=wtSXkfCk?L**i50^Mgdp&`m2SGU`$!s%(| zE`HUk1#+F-`FINQeI!;75KA?STDKz*#3?zZ`JZ4cM;)ob>|syR6*$0Z&nXkH`iA zPi_7|URs)B!+=i(`%!m{5E}(dU;bodH|BS%6px>MqMHPa?(>Tg-8A5-KEE1pGk)GG z|8Kthn{#|w_U}Gy90!?Y|6wwZ59n3xPlHSdxPADS!6stf;l%&{W1|bJr?=Cc6riaU z{TdN%c`KT4w-hidyIa}jZ9{CU0QQ;XN?uG}+Y;GY5EKS|nCWdKUBKG>zt;r{psz05 znYyHD=7ixFn}O{Exwb?m+M0@`(@7}!u<`=k!Jyt4og@06^yH3#fxsv{erQDo@UbyNSY$9aePo9zBCQaRjXPlFsBBA~s9z0h_H4;BsfSf0!8j>HA^uNrWLh@ZcSs>$H1G92H-C0`kxUNOAmp<1xA~ z47@RM8UL<^O-zIePkwU84Ui!`3{-=p2oSc!OmR5j-^zn;OsNGVRf5OioT`6Fp6# zO_6w_Jsq>`5t^1y59CUNg}FtV@aIzSjDUwgxq!NIW+0brW0^jqJkDovuzgk_*HavY zU6zO1ZmRyQfE?K3K>O^#>=8NnJD90+0#NgDoD2&-jJoFrR9+j?1;bmh87hH=t3m*>SeB)m*eN!~`a@p4Iubs6WoDC&xU6p~Bv z>>r1`fUZ;e}X2(%4u&Xo{Pg^#Qdx2c7kS01n$f+-|YZMlnn#Bf#$hGK+_G~Vj zl#vr@Pk?xa#C0wKT^PEioX1KL*SmOYrnw;rL;Z8aZwTblu~agh%|W;|*@&9qWL4<{ zHwJQ0V8l4;o~z!3x9ovASi#EHe{(=5m7V_X3(KV+G?;SL2s5gE}RmSn#Z=p0A_Rt6_vccI>cqs3vkSlBc!$;S-* zZcIZiL6eZ6_h4g(!(tfi4m6LtSMBwRgS~k7gAIBg>=u0kJOet^SA+Xes=<#kvJc>M zDvuWMN=F;$LC6&ciOo0IL&OI1dx#rWxVQF+NQ)0z3wp5|nD1Vgz_x04UGOrh-M{Fz93~?ukHG8HWMgm|m3C zgrwwoG5}8?xC7zfOX}sEOZlhd`^Djxsp``KRT&yZB-=9q*a*>F7j<3Vw=NH`Y~dx_J6 zWz!fTb$A)m3=3Bl2&JmL5*W}gsO%34eKj!9McqhQ9TfOFHacC<>qy+eC%LQ58^};8 zi5=}u5^4!n`Q8Kv^#iMcKITQkOWWVgYQ7biU1m4mW8UuVz;Iqn#rNuxr0(xv#?$q@ z&&a)tFR4(GPppKAiX-}d!@UbM#K?8lDAPk8|4fLUcMu0tTu#W=x zlCg(}&xnCOMz5&0d`cj_cz%KvuTmQ5603-y{zmvzRzo4t2(X1PkIwcP2LkNsFIVHA zv%i4DUgDSkLOmSBtJTDp>KS;&*Q$xH6oHp|y_)!15%RikR5Rb;n>0iAO-)Hhd<)z( z$6G%9JK+4>-u8jt6GY+fRu}$*9_V<5_o|s6&2R_xzOSU8RPi$6KcbcBXJzfe>hJ0j z_7{>tD)|d0#O_hd4qqDNS0J1(zB0&fnDZ#}H6Npf>hAzY`um6AUt`(d7|}mq)}`pT z9I=0*UxrH+yw-P2|E1EHyJ)VmeS#yM8iJ37CB%$WF;4>Dp+#Wf%Uyb zeU*UJPwnf%BIdo-BDSpg3)!@QVoapGL9w)yASKsJ^HexnsL5g(!z^s)x(Wqs=9V?c zB9QGTw1$BewXt}V=ExGaw!szyHZlaOFAimGaim(@riPSYVhNl2QId6A(ymemQUsSG zs8oR|M3%PEE@~yun5QgbtHGQ#z_PX)x$Op6&Q{~I!vM?MYH8^-zzVjSuBO_~861oJ z%Wkrj)@#|*jPOdf>7VHaTG>{EWfudiVyg-8e^uZs#essSzOQD}e3^~I=~di1Yb|Sa zTSUas0gj#M%r)$s(0(GdQ%6aK|?;)KBZ6zIugN54NMHXtAx7koG&u%V>q z;qw#Apa2^QFo!wRhG1h#5Kw!9O#~>Gd*A~U)_$Cu;-y=?v8(j?&1}A2CI?$;E)$E2 zDl20ey4>b=4h8lX`(~ouln)`$aX`zJu3{c*jnZTRj<<8tzLPVxpZdcZ;|&V60Af3tNNAaIq%ANvc0ATNx}?w;d(CrQK8P?Nx;+dj-B5MQvsG z4JhJM?wws?Yn!guiu;Tl%2RdP#vYiZh|ftVB?5K}MQ>|keb4sH4A~u}eYhX~)jVh?TMqeT4P^WLX7C8-7ZP!8m1aVSgpav(Vc zu=2?hleWBK+RnA7@EwUcThbXj2S;p4pTcz3#@@L(p2g8K)9rRHlZr%RVyG7R4m+1> zZ;OIIgXvDpJxO@kB@<$r7Ky2Lt|1X=LmQsO^fWuy62tcM9Hyq@d2q36n3hG6$}4Xd zI~Pf$S|Z|UC$EEcn_**K(C>4J0e7{F<$V9pOzapgHP~*z^a6C5!E(U#LUp;pb_do| z?2`@C6$Z-#o2$Vq4cG;+Je2Ro_i~lNx`7Ri40a>4G7+GLJ;3t)gCkIiuQ753krUq_ z%f8lNy})ptVF-PCox%Em!Iy9t3e@!m^R1*e7|gfg-e|Cy_#VwNe3Jo-0_tYC*?@c4 zIW!_Zxgz#}w-|I5Q0##edaFVEDcfD1HvmVX+YCD3qV$VL-wvX;>CWkXI1h@ja};~6 zg!h`Gdx#c&jSmT~t4FK8#%Bwzdy1BQjSma1JLXYe`DMXPkI}@hGgO4oz4o{-!-(Lz z=ajKuRdiHv-FwQ|ukbmPS3O8;zb=2S;JO!|_LVS-xsx*E@bMfbh8M z>6#~#G5z5^b#8AcQl^Ps;1lo}tGR6-p>!+JD;^J#&l`hqUp`-b_OI%CX=*=EGO6-T z$s7Fi_Q$L@ruUSy_5qO9-KN~N4+Nn5OL=S`1VC2-u8q+14hEom2%e1q4gp}g2EL6z z4h5q71kQ~B4g;V&1I~>A4hNunVM78(h=gkXjR+hGK)3tG1dalr8+qkZ2)g2;T| z$IwRP82^`$By_C*GsqA+4n>>Mny!ufOrG1 z!jtixvXz_tc_>)VBqy@e^D$I4a1wzFAfaa! z<%)ly2L9(2vA;M_tdzZT|BKaFHneB+&DY-;Q zpq&Wa1)&M!RkjF`yEP&*4MgsdY$7C3GogDSG-;yB7AJC_Mnq;Zk^3c^2mxBiP7`~; zF7`~=Y7!i3nS2n*p&@K-)GdaG>?w`0DAW^dt1xFiVrOQ;+?JV>$9}hq&|`L@G}xz* zZX!?EP5q_37AmsTC+*fq6n;dJY#bYqS(fvVZTFLT$~<5WlTX{xR6BgQ=?jA06~@^! zcDxb$J^9dNKjl1Q*98N%^_<;M>|<@L`seIm(6XLIk#)`^w)3nV4%^shA@d7%qFAZ) z7nGp5UFhsDNp`8ZRsRxmzsTH=+0KiS8=EfVensb|98O#*=SPG+!KKgIjYEhdI2!<`|ZA=s+gR-aUv4RU();sp> z-h4ki$|doxJsSt(Y9sreJ-e$^!qkLK15% zo=hIP7158d5i1UP=#HF&K1Rn)%}v2agyBi#6C2--MjDBHYNz7aXp3dXnEcG17U{I? zCMG_&q1X_lQL`mKlJ9%DNOQ=0g9c0;@w1I$+p)-)9Jy+^PZtZP7j@K9Y0 zRxaQ_viK?L2n%Zvpq~gOu?3JTtyp1z{Y;D(Krjh53xS0O#4jW=k!iTlD<@ao91g$w zh65bHWf1&k$EL=jxi+~0+Dqhjg~Z!3F}ZIsli(i;j9|Zl3n^kF`P1%(TXSq~pnhj` zjgYW{O13kSZsX@Xhj2i{%Ck%AWe2IYr1HZ9QnCH`@L!@n1aFDh>Q>i1_ zS_`4>$yBZx&D9xil)gKPc)h~8*E7t~WENITODx{pf?B9Mdy8oCRy3o!PL_#AS|YENXKY#3PS5sL@g<5*9dP`c71mJlF{%UjYFN|RVp zptP!jQYDrWq$!!kZR^%Z2HVY3_~@kt&PctQurC!4Y8jf#2#SwHVW$yWR1C65?Mizc$-{k$9v;g4pJ)$#&;B7XF*mXGC88E zge%Uh)CJ^LHe72wnocSPM_0(TifZ1Jm#?akFQU+@o)8PD61kKjs|8!yr5j=m?QoL3 zg2Qrk|FFE0V`q)v%-l@a(BvpiK8Q7uhL(%1Et6{@*;5*!};A6Kok7oRy2HlfoNdu?fmryO9rWEOd>)=Ar3ZIf|47Rnm0>doaCf`Q_^WkR!XS<-&7z{e_01e7=jq8GC7zLT5DVT|-W6)^z zobWZ#W`mk00P z+NsdanY?@zH1JdfCn~56%<+!Fr|Hsr6pmvpRmbTHZ=9v@TAs7)5}X3VT_Tyz#V~WH zFoV_c%w`7gcsVNVl7TlRluLUdX4o~T#9`YL`)EDE-86_eAGn`MD5s%j8Bg%_BDlK- zr^ONs`>-g{yj!HGGK&%G(pYp_1i2R{)~&JDNHf+1*a?>)+@s;nmbe%bmt_45m@82C z_#lD?;F3KBdxIJMuDbHe5bkqfR)1N7GhI->z;c9(E^J<5dE$GxcmwsZ6^PDqQS}-t z676?U_eEABG2jyVRaP-wHyG?gzz)1mu9Am80xqWVB}>89$mCeM8IE5tpu>_fWB@b{ z4kduh4mQS`$76=T_w_JsT5*%nlVbsg;Id zF2!hE-{2#`{M=%>vCx~x!Ix!k$f}P92lImi`7*wrjro{4!FVRuCVjW5?L27P%{1N5 z!>Cf>FIt%13+Z7MhC-bi?j6ibNoSiPnXF~EQe@v?v_C&E6y+6)HbVO=NNyMg1YpKh$**|*kQqr0(=&RGb3G<;k@8e zi65@$x|=YQ3`rBOWg)L?Gx zOYc)Hai)>r>+h>cDft}3sJiUuqb@L1Mm5I%)n#64Xla%M*`Zgek5xLVJOK(W!RvhB zL|pmzJ>kY+TWJ{XI*4b$uN(&;KK7PiI^R{bMZeQI>a_?K~PB^A9DR>6L^RWv!mV_k;^GgE#}Je~KkM5gbx4_+)TM zUhphwl%Nx^ocdw&$XS01;^tqSnzSryN`40{XC!gta<8l z>Zuo+r@kmpy_ipZG3Y!Obe;`53;d6L3G5)meScAdD_H})s(lrPn{B^pkxpj3hy4ub^{i(0OU>Kl^%Hz*mFz4d#Dt)c=FW-(nsw z&wgD$J1$;=Fp$*0&ZoY{r`~EiuLbeXzRmp4?fQRE%w4(|-{5>F7#%K^%VvJ7e}`qg zX~yPTGB#z9z8&lqIdtRQw)1w-c{Av|rT^OZEP&iQ7Qw?`){~9Q2k(z{K)dgRb2hPA+ng0C=3q~wd`*REvbaOW$!yvxLQG$ zReaeK_<{MBSGfDNOqjH}W&cQO#WB>ltw8-mY86E_7Wzf){l#|P;{fn4N^3fN5t+O> z3*&u%t*+9#4#xH#Xm|4Z#Vz}{YN?GJHB2ZJ8J3ycERw&Aq%`iPT1L^(5KySZXS4sP zE^EBg3J*5*uBs5!>R-OmBv8C9xi)fIrSq|il1-6qC_oK_4XIqn6v`^|Vx*^#ZZ1@!Be)DTSfNa! zDBd-TQy@bD!cf_R=yQ3i4iCi>p|(?YDp9-=tO}T$?4^iK_sOcOxl0qD;o+Tm+}e^| z%5p*3gYN2xv6q%sW1C!w#BNR&7bCQdb!9?1ffCp|q{SMy3bEY$I`Dasmk-+;&_q%6YJisAgl*N& zw!&cTo|%=p;S`DZpd%xt0XlD?Cu7F{=A?#5r3>XsvR8HJc;Xd@ojI;i4SfWqAv{mP z<6U?n;r$dm!G$LUou@bi4&vB#V=}->f>VQo9iO#y+n|`C4sn_?xU3+17<{(?4i%s? z&Fvmm4j_jKq7B6Mj)V^PAjBVPi_&6sgwtEbgvfJ+2%mSP|9K6}d6eYzLLx;89_@mR ziWDO_-vuQwl30h1!2^=qGKs||&K5Y%nF0?CeW1NFp%Vz{6XeN+P9mg_nG=LgA*7Gw zlY~wOB)!dBwkbkqD`=3=6hh~FQt0S3u?rQ(t4kRo7b}E!ma;@HQ;52E*GcFq1r5UH zhA352iCw2K-d)^<$PGYJazqVd0o~$vC43WLS?LA=TXqjWkDL7sUVzeJ+r9kT$GJ>rqOT~l9Y+Up z76kt)!mlb=9VjT`JQA;IVp=8}!-<&WIG@Dpiio$#f%=7n-cV2?!eg?_h`p(>w1nZj zoXA@Wks2T(Yb=r#yU-P+-c}TzgoBPN3B9ABXbS{kdM5U+!eF8#^mQRn-}`T zvV1$rUf*h;(4nzcAsSJU9b44lJvS5dYc3J27yu{w_-V7Y}br z!g{qh(O*5ZEt!=7!ib@`1gYN^pvFVZAoaVSYDi|Ii8w~%(&YZ|I5|j^D{`V2EKBlF zk4z;Z(_(3rb2*ZKd1Px6kq8aD0@=SkHXBRu>YcpYiX{K>$er6;Qz=>NluygQ9)qCA zQmCns@^G<2ZmTyY(FACJDOUNq1U%AxOXc!ndrYeY)`SI-6$yHH631-fHly5M9FJ&7 zHco@GL-~*gN0aH49D%J(qQ)Z{V_Doewd{3B)OrN;u=Z%SoqE^0B+LG!JRe9gkhcfNyCLA$0M#S1`TyPdvFb19&v6T)fa0v%M73U45ve5dlQX_N%PFE2 zU68=wNug$2vh?LmQ5xNf=n4jH)1UCxgjZBBOGfBPjxgmJw31@zxNA;Im50#ErYPJ@ z=83U#6Iw;VjTp*s+9#+}s$&1h zzduVw>|cV;`XT!dX5KI)W@zfE0Y`Qf8~O7(j_8^jha`@B({R3T0Q)Y{H|r?6iC;AA zNYM-NZ#}bZ8iGw<4xVJml3YtV(!`sE;2IK@bzMBU(f#;XmLjvc$F$?%acP3%Jg^m) z%=v9CLuS0kM4P!^TFDX3euBSRD?6gLPYmIx4jtH@h0d`Gp)C}Ido0qYs}h@}uuhqc zF(Iu+a7zVtB;(?hzB;k36o!ofRFO3ZZLJ_RXRS$S8wK$ZSgH_37?T#6Z50z~YXcg^ zH!sb+T?hg82YYY=F*sQ0mj>I+k&(822$9AUvGJJ}ED`wN3GNVLay%(~+-#8@Lz%Wn zswoj^##wDvoGfMSz*8rX-pQjef#)!(P??)ZGUAa+bBm&Cc-+=x8$zjQPQ$(yJ`f_mJ&73Q70D>M4TPIQo;W@;G;)-9vk&h~rW1IN zMiMPPLaL<>o#E9-HqNKWO>;SiZXvcaF?Ip4$;2iT!w_tWH>-_0s3fUGC@LE>afnfB zYKm|xVW0MzCfpW+?kK|WgsCnqOFpSy8zWS_`C`T+tDWCa%0E~;9A|RK?sS}F$ezY; zXi7+a@*pF2NEr~jvB0!?8x)2b=Lls8!Idb3c*gKBfr}LJtit8SMZ3(&d7|w^)i4Lx zO|V0WW^(XKVkZ{}cZO292qkNGQyQ@GmV{v#zWQK@nJ$aPKuFS+z=E|%i z)8}q7OW(4=+~$1~j@DvTm) zrZ9V?ASW#L369edlC~O9Oc_p41{zcltS$q9Pi6t75OxWL;lX@=ObUYA6XBt1ShB$P ziPY?BN;UK8q=rNAm_#XTsxt_cb#Gv+$#g}haUvx57S1-WI}#c#7Ur1tKZmlT#AX)M zb-eS5%?b772jK9aYkL8~xf-07hkL|@gyv}|Rm7GIaR~_SsX@KLy2NqPY^%LOQXRC( zrH+#!vUdo#P|G~GLYrLXI9bB`gb=d6fJjV`z1(ry3GN%pBQ6Sx0-D*d8 z1DS)}%;XTWfbbz9l!bB1mT?C}*uIG~&7oD_F`ju3KmWr*4ei;iC_mXO9Wm}De7J$3 z?m@A=kKhpo#C|;2l1wy48f0<5pX8B-Y{oRmxG)b8Kg!^pD2Yywj}kxH;E|@LxH#Q$ zt$K{ye8aWHnl}kTs8@LI+ zxXDi0H9kw?1VcpHpfo;D>_mehbWPUx;xCasDI}9;F5M1|;x$g0Cx=E5;G}z?$4r-g zp#J2L{W|;Wln|tFP^UhiH;A1YGGD-(OrI9&8mUxDgBWgaIa-H2-Tk88rpy_kUS-Q? zY&`k&&kSLfoLOepg}()eu3cPsUE@3=W{|AdJqZ{N7XNgU&NB> z)cz%biv?&-M>?Qv;OvRmCCn^Zoy&-Fbt&{*(bZ)Y{f@nGnZN4aJIdV)ANt z%63A|<%F)mG=eS-ne??GELZ?)$zB(#aM`P4>UyTe!#WbutKbdpDp+rz8#M&6MGSV6 zJC+tT(9Ifx*y1ewmQYE4`6T8oa7z%sbqtOSOOd#3!6k7S61QXFAH*y=SV^eqdRfAE z_~*Xm3EhbW534PrSBp#43dHX6VR+Vx1n>5*CMyxTC#0vmRhYaNDmAR3Q01AtPpxmz z;+eePTkc?HAoPH5{$88NgYMU~4$}|$*70?TJnUby*C+IdH^<|wBqRgy(W)_np|nv* zHY<<$N8!dH*{nPsibnAJL}CraeiOk(q4;h><_Tdu7i}RnCGn&X*xg`<5TDLTbTi^l z2@a)H9J&c_PWWlUE$~@}KRxkr#GmnrOX1^*J}YP<3FlAwQKbpQo)Zkt>a8L+k*ZWLY9qqCQoA>ijB!hv$4fHG`UkHL<=@N^j zW%m>NQn2PkvO)IQ1BAX3s43Ec(aOscv-v4}?QiB`4xn#BO|2cdc%!HhWg_1akte{{ zjmURI7=d?$!1p>6u7zhUdz9D@22*9tA^0P~L=smpFpB39`^gA)MsOG*z4~(qy@l~Q zg86qZR`iz;cOnL@lka#8R{u-L-kSyf8sdIDl2uyAJ_LVLU>07L&cbj|LsQ#XH;uPd2Xby6-JR`psSW7g_mr_L6e0#YN)S)trtgF+Ty4V z8Wt8X+Y(PVO5l);Sdi37!y-aJiN!As8A2U3EGk4JembwEg}U`(eB@$+wk3^~Qynra zE+8L=?#LOF`7+F~gm6k6zgY(Zr#VGfQi#qp?%r_kj+auW087=R8|4wSs%U*qodPUP zrUea?)?pZ6;Kziy3|h?GvBPCnQIl4;e9g>^z6JrKJ%ANzpeji@Wy@aIa+a+TaK##E!9c<`%=38KN~&Z$ z33p-f?XB#u9L(`pLszMh%duhuq9q>4s)9iE#JmABJb={%$Y2cETR(15+-<{Yr3dhp+l>}1`l{Gf!Rgs@)oS{K-U&j9i_+#0Yh8B$PQ*5 zVdOhX$C~7qqoBlcNb()mt-*B{rFI#$6_;kwtn2w-c1z1yw+44-WdYlsy|NSkMl7-U z!kJSRHvUbqw>nw&`d-=6UDG*;HsC-{WA&7YfQ~D8vt7t-xF9Fr9k1f;%35vYuhs6X zL!N(&@?7UHxx4CYP~&V^BfkuZKHOO9&{OD@3JkFqH}MxSn=Q0yjhsWplJ4ECVZxgk zSl!{O5Zv5=>e7}xV_XfQ$l<30V7XR-j`rn)#`_<%A2Uy=$;$OW`Em{*Fj0Wagsf6p zwx~hy!^+4oynvO%kTz%^#PTNj%R89ax2$PSG^Vj~;cA@xXc&5XD-B_~Y-^0*vNWD` z6q&6x(~(RzCX;NPZEE`Z8;6Us`O|xr`Fzy2{zo0d+}j~{OJ@#NRTwLyFar_YUZE2j zo2KT*H%>q;P9VO6!Vw`fGH(1 zzcBcQaT6o`cPfWKgTHPFKK_M`5H9i;p~dkRam2r~C35#RH4>~lQX|nLp->xpi+%FAM>r-MYjS)$MmtU83V`g3Do zPT*P{j0T$fzt;$J;@s7TpAPBjFLujuvswX~Yvgdj`ypAh160s4EPGw z5m;*tPAU;DC=NrjGH$4ot~U3HI1OeB{n1RX))**=QDL^#a#1Pm>?i@#UqMAT;b0L(nG^ATHF6v!+O$l>NAlhF_r04Gct8!- zB2gl65fr(A9B7ax7y>kQkiptw?ebh%TMn*)WgK^6^_l|B?hs$u_(2OP?9iH2D`p?L zX37|0fDTiTa*;WMQiltaNnuWnWaU2inM98eRHhQf3Pa8#1!%&}!RZ*JXH(`VfvN}l zxg?HOMOIN#>-jZ91ExjJXNw%;uk{7Yd~A(6ZKHcBRL~2F9_ONwxcUv+i-;d@aPIBU z`TQAB)b|8KU^gMKJpaTRb)4neR4(U8Jqgvt=Au11S+MZ3rMK z<>GXL+?gIncP#a!o5-C-4y#Qn(#c;JznSpagypb-E0}tvTS%Ql3Z~%{ellEc$YZcT zmq4x0C8NyxmV{OZb{;X#{tZdIrwKoHK5^W+Z^!SBr}!dwGQ$NVBo=|ZBW8!Y3129S zHojqr>~Rm3qKo`P;XcbbG=zxj&e64z~Xxe4m0N@pO~?Mlcsg+`3?dg8OxrG=3~KH%7vy!~;qqfg7ed z<4+PK^Pn!5-WR^pq8hRfDK?sDmKC%q8-uFV-pbB@7~7dV%!@FK%K$)VNz9Os`1@;7 z7V&6}?B10!!`~3c#POKIaB~@hb#aP4t{~AV;mJto2?Z%5&60$k)P>2HhfOeDLY5-) zlw#DPWPApeCiS$U)RCbqD$5XlrV5V1ofx_=Y!xJ*RpjJ2jM5m5%M*M~f$)IC$De^R zZ>q2Y>E{(4n;OMEZ!DUIU6JeyiiJ9k^~g{wk$O>45tNDk(XX{Ksh1Sh9Kow5VpyWn z@TSoct5D))C4pP)a*m1iT#N843Qk23vqN429?5JjnWJB=k<;QBY#Y*Z>oHWoYc<&R ztHo#|0vfo5+L!G5Dj!Mg5849+a81! zKLJHybK>uK<(t=r4Ro1a85EjwacI$iIR>J&0oxm_@{@1(J?I z1IF(N7V}2m~4k524>oQC|M^MT3bB!_9YS)glZ0qNRfs(E~!CB-Jje-!eKd5 za|{*`oDPtv7eZY8QpUSXX1axIwF8VyboljK^uZ#vKHD*(LZMoV*0#iT9~@0!F#*in zCsmzKcyWPYeVQzfJ(kcC0_mZE;{aky3g&xvM0LVLmJ$?WF%c6REy6khTUuk-6lBEE zMQ|AnLT|trIEC1&6U0{#PFl$Ig^?Co zu~y;(Nq7xuqVw29EBTuUft-+e<=W1aZlVhbtRjFnKO-g+q*fKMHG*q7aD@>MlZy$j zCa|^!$uFsh=<0%LT}6IMMX)slYlD58c`qZjreHYnX~X_Km%uWJ`!eW|%So;!WE!eF zRz{CQpeGczws7t$0Cy*%>oA9T#8t%BRgVzm9J?4aPZBD~)uh(blyd1%@u1ch%#7=6 zDYk(?X2!sVgy4o6l!1Lck&Og_>Yhl-;Wb(WdIHEBNp38pbdRg3-b8#8!EwZl;~h-I zHxt`bFnj_CEX1a|jp$~AHZ-Yy*ygorA11weCwq0AzgH263T-sLRwhejX}+7t1S0x# zyob<4LQ4I^fV`LB76knh_Wi^s5qAf_djkIu*)7SowBztKD+{LCG;UQpG%Jsv!$CwW zsqdq#@7DhMBE%KyyG?C6M#ZB+J`IGl0=BKe{0r@qq_#7ZPfvM@%=U&c%jwgEcQCLw zu%9Kdqal3jseC;<)#8WEVSkodzrYnBQtMMep-{OAIK2D!#L^yy0I5F`%LvvayJhXd z{uAM>3(NTeHaYgs#M@mQY6fF3#;ueJat6;nxVr~H*sDkl&OA#Kdg7JQc#s%q86^s`|G%mnHRWRNV zfwut97MNYA%}v;fk{EW0lz1c}@D`-Y0;=i9)n1?t;GCUw<-chBtRA99lOGYjSueF_ zueK_wQBrcK2S-MIcLc$>@XR@6=ucw^1myxT*GI?>#jtCVohNJq3}INgF|$D>q6E&$B^*Fg~1GQyTI)w91Z`lq;XDMm-ya(TzG73N$fM0FcZ`Ir1uqC&eWmR%5A+3 zi0&t-tFa*17oNPoV5-X43KKd&AXyTy|0Qss0NfN|cx+1OAQ!^W*o@G@E`(vRIiW)Y zN@6yLM=+G#@dOVQQ0udLOE7`NVSd8DHJC{Ha6hfp|4C$y5JnFE)F{EOnDCJT)8Lp& z$jrA5(W6*QIyqIMjZYH?lNdJ5ygIlo1&;m?0qnNb4aMy!GG9bI#dUjv#|Wqm|4JRg z6u1MaV||or*d2) z@{SQcNnmm973VAHBzk~1kvv(*tk_?0j7a1Z7s>IE3qjp5JWlmcIpK;EJk0|=*X^B2 zo$gVtdpM%Op`jOQSpAa|z685i*siL-<-Dk!`%@p4m0oLxo8jVy#lAajl|O0$%! zisB}MR#4WG3?n2a)WsmZB}{1yMf>zS=Ufh$FT+BGx+u}kz3 zzG_T9S#Pn=CwH}QZcVg0AzrsQC6k-IvnX|qNJU|?LH7(0xpqvMGO#VXMD99Db5CJj z5#5WL%EjK<6uDkRRJ)p;{V<6egwTtOyYa1%x{-Mhk`+FeF`T{o4KN7rhfceR57s;! z(|i`1xfHmWrMocgov8K9D?+Zy>K6%+YMMx|;z7Cg7!(FxN z=1Z<1SD0k$aHK7I_uYQI`zRK1Pi-^e3c&p`r|rA&RwQvR39-<4%zQHUxmnUNScI`O z9Yg$nFNYzHCGmipK|6pRNBBWcUgO6Tf5?dI30z;rk$K?+3Owv)Tu|afN<3nUP0t@y6s)Rx?naRtdN%yeWeP; z!!9TMs)p5seFd@CGzQ&BE-76_@O2H+cMO&if^YailzA=DH*3Y*C3EEDXc~qQf^T^s zEF*;8RuIo@Zy@rHLiCv|p?4Lec7`_-dQU;>boLfP?<+_h^xj7315XMuV{a$+p(h6H zPGTP^OgUxWMd)J>k{7s#;3o=HU)OzvKGm=9F6H+V{>;GMI{pBO&oyBd@dt^1p;1p) zc!>Cy8n3#1_AsfhH09krdzARswQ}|tX^YEc2VRGMocK4Y?$WOELQfF<)&r%ha8Hf! zceP^XRd>anBJ#aLbk9Fc><1qJ7CiCakWMZL&~ zygw6F*Yowo-D;@*=UV$EI_myX+l%ns6?#(QcXNsTT8r~6B4r7}D4x2%)yhpqgS|@Z z_u5|Zzm$l8xBy4!kJ{p3u~N+UEAVxKf5Nf@hsUy9x_yJlU$wpXeGP;n8-nXEf-d4k z{`OTF@9`dk0{>GhuZ#7)xj7Nzx!H%DG5+<>7$32TtU69|>X_tXLIDMFM*M_`tq|pF z|0$uMf_xq&Ul4Z`E>=X&ay+OF)p7np{k~@XYLt+1F~Wk?h*J{nV)Y$GYLy5^kOWEL z?S>!u4s~@tB{04zG5dBPeArDSA;mA{_k6*~tdkl}ig!z@s!X9J3i{D5r z;t|GG;&&2@dIT1=bQ~rv31cX$?_wT>7~hOl@E3{2Jt7)`|A=(t5^SRiB00-=tYL_> zCH?PO%fM$#)xo6;m!aS;(usu?u?X>?r3t#5#W2BT2pZ!aV-!MkS)zUeIieH-UrtG@ ztv9S21ef=N@E%fjvqi|QKu%e{Vc{UQq7QS$7bCS2DJems4rvOf0lCt zTpU3d4l)}kM(ts9E$tHF0&x(LXG1dDg~zg2C%BOT)%n001UDvVbj~%2Z9>d!&n$Z_ zqMH(R4?z$f5f9popnD2}D2V_!cR^f4ATo}~f`k{Q zjt;$T4+8#>-dfSzkQvO>SFqa2aS$w&77S3brM&oyz3yHDH1uzCCeI zZ&&q`Sz?E}0R;6cCwm(U2r()%MI&d59sM(f3X!-|9kzx%rD$TI5lI`*n`S}{0;!#D z3xOyB<%JR_(kO`WAKIBvOdxF&!VfGFYoeHY!@Z4QGX>F%Dg=j@CrP?RXjvri>q-RT z0_ZatiJgef*qKFW2UmTUQrcm1ogCGey8wuxh~xc4o#-3fFdDbl4o3fJt;6q*7N9?? zprBr|zO~NoWSoq)y6*mbxvV1CA=V<6?quCiv3u6YkW#x5gFfga>V!zu%_$A{_vCmf z7e36Co>EtYL%wCtU@C3$sseW-n5n~!EZ!SNkdmM?nT2IhH+c>0?3pAMcQe^h zhj^^rdBn(rO3_28vyS@!x&2dM#GKdAJO}Jhx1dizicQ&sTN4een6v8@nGEfLM_>@_gGP{qFNvVJj zINYbuiWKS^Bh;dgd|?k@^r&uhG@S0^ICOv&XSM`qavlxAqfctlCz+%9L8)Iup?Nsp z)g?;N2)lh|9j|WjJcZNlDB+^OP4TI6Hz3&o_hh1b7-4;Gl)=uP#4HRR=npjW?nR_u zAvzq_-oyqJrfd(I*@w)aV#Iw(t@1b0W^@3Mh#M}39VimzumEd7OXha}sP;Bf8j0&J_*0^RvYz{F|udt;jGFK2x ziO4pez&ruW`TjA4_7n(epZxv>To8!uMKLUoxJ0OJug8(tTL|OD;E~6Z+($?{i^Lfg z;{>An3hFL$ClcFF6(jXJg~0v-cx%~d1P}0o=ydf)#Q#G!(k@~^^?Imk@F~F)q(?KfGYEP<~v%L>B-gxF*qXJ zCWPlx7=}Bq?zfUSMhN{rxKxtJ#$i;GD4LS%SRu!*cXyFGPN@G_)Db8X8IKp%xJN!r z=mdd`5+c+4iFL|8WhVH?gNOqG4`7)LPL;_ZCLuoI-J5lTQD7tK6FT$1g>?M$r|`o8 zoLJ5kG5OgE{8~e?n?LcwU@+MdV%Z^v6J5wH8$Yc8*WyQ+_CvmlV6>Kg4_$`HDh!{)dpiHs4d~E-kgd3y-(# zA1HBmwS;*N_#esNQ_Z`NfWS`_xK|7KUKrf(0?TI0i!;|94DxClj_94o?K(={?nQs${TvFOTl zs7rCb4HM<@=`j*g6>s#Ku#eA-k-`OOenD^-=X0J_yxNXcNz4N;jTQ4=WK{~hJVt=Jy#C@Df)a(iqGTG9 z$<|B?-gvQUp*2|0t78iC_urb7cx`Mkev!2(^7@!Us(N@mioC%o5iVs$dtIOKn=Y)b z;%>-DNpIEl%^c}sNEE#tsY2@Cs(Gq@{31|I|^Cq_o?+{hHicJjo zExljwk(GWUCg$_yotQ-OoR5-$~}uwxkS$adj_x|Wfy9B)!!8|*mma})7l zovtcw=d$u2F>4vW-fZ?#RY?6ub@rBg{Kx*vZ$;=6Da@_P)~w2>UU{gB3YPgoMpsLj7D68K4L(qFL2^^u->nj?e9BuyJcci=hccVkRN%T!!w6zhtZsiMAL+o2(>L*fFV2tnh zK-3=rjSz4H=Y(=7u2lb}cuneizv{n&2^p{w?@J-t1a?N>)!B#-jsET!0sT5&$eX#aT#T9#(*RKuZzo1Ng!&36k~-= zF$nV?m!n>F(YT=qEeQg)2C(1Ui9k>Ts2}c;qhLn>{K`d>+{i~n zXBoRBLYhz))uY5}G^T%Xqmf{(DIuD`?Fm(cx>i~z3_goSvH?|8scS`LMa_J}T-LVW23^Lrw=p^L1`Xc37$E|y@qsf_32 z>OIJ1g~YuxQHHfc5ANTCSk6Z50hACl z8P4l=p~$Kt0=E?m3KdI7e0^q+T1`>rv((+VE4kIHIYeGZU3Vk3#u$pX=wU!3xuzo7 zR2c-UN7v!LKdQQxBG5!|Dp8GqyGBYPPl>f%35kK@l3gU%aY=6fUACL-x{AdXN-p%P zLJ=4Mk6lkOm`M0rt(ILNyuO0v(io-@kS*|*WpDuG*+7wO4{>>vxvY=bHdG95s-&_J zoNmk{x{;tbHfT;@ydzXIymW|fY;atcM;Gx@4v9@P5fu{whNoU?@P+b6mJnnBwb)b( z85U+h;+q+q!Jpm90pSObY4hrmvGkcj2g#4qy!;#qNZ9%aj~5tiq+$M=27}(9$O*!w z<;D;vZxuA5E!ire_*D#?i6YU8c_lp!Vy$p}q}30h3y^(_>g+1S9pV>&nk1Bj&5CF6 zv*H+E6~bE@7){C`>@vM0wgGZ%Whm)SiO(+7D5xY^w$20}*%Bw9Gd1NNuMnIf`|uJxOh^DOnqEs>>K@dy&~eGpZ=qJK=VODIZoV z`4&`Qg&jpkrlDkNfvybpm242+eBK3Fds%s2b{9xUg~}nZcxJF2Q#hg|KU=+4)dXaiL_SVfDiH44W>z;$ftA777kJGJC)xT;-Cf!a+<{5(|24A_N4+ zL4uE!BkIVPv5a8)H@YmuF_L%9 z3Wo0yEo{O{v}-7u!k2Ltr8)${*Y+{|nWU4=h>8X;ACh@d$nVu%;2*N{+hvAjT zbmqVh66LWCja~iEZ{m0=o);sES#tl+-FOBC%T)fkNa*kS-yW z6DlHA5e<9yaJNMHhz|_O&Zh#8A*!zVu+I|#@f=W{F3G2UwFz+%0CWqGX=%@@Dd%2- zJpyVS4gb|j+9Tu&!pTt9_m;%{P&PPElI>;AbTWhS8b_2Q#%+Opl4PHda*}EM;m{_} zlbI=uOno%FTJ}psi-NW$`DUgLAQ5@6_V!lG`t=FSn^O z)+e~X?ibe5vNt4nKv=BEY#D5oac2iM3K9pBz?l-9MiC@k#TVR!)Ip>~QzndYvKjG% z(ZUF)f&GG5*2WP#Bpk;Ff;c~N*K`7*Lp>-5ClWcr*@DDjVcD(cI^&IA9I?X{W&&zq zV~JNkA}nhFV$ey+DJuHdO@cTQM5Gm^;DB6}vJLU0JlvGDJ&B{k&2jvwgptN>5T(r5 zpb_1P=rLjOg+e4R_08f98;BpvvUA$INeoY7CNd>PDRbNcGOo*%t|vBrc=GXKeV5!s zc*I@|@Chy~uV*-H#K4_c&8eHd*i(Tz$)(_O!JNu~g-sRMlU-Ka!F==-PKu}aCq=bK zIyG!=>A^iqg(*_|qtiSBmOMn}6;%pDGV|}smpsq^l4_fBepp=!;f6`3 z7>Rgiwka1>k-9Q!8**V4rQTQ8oQuLm{KR>8g+GEIPliT~V3!yBpFEera`xokeJtni zTG7yu_mXfwd<*GxC^?~GA?Kz3oCjIXC1J#2lmI(NGXJssiC{Sz{s9^_7|Gqu`x5t!0*r(KwKM!v&3kzG*adv9+d{b z*M%#E{(>x8$N|p^=m|it594U9*st>BYJaKu8yShJw-Y6W4*2*af_dT=@-%S6@8UNB9#Jfr9?NLUK%j*U$3#8 z%fdq578duA>sZw7;ez}+rOJN2^q)xFp-}bnrxIIA<990Dgg;_5Ns+%Rj84FBrLetm zfQbN;s-U~W!}&R;7zCVD=skj(LT)qYz2Po6rN`taI_@;seH?kFfV&KQKVe-$SYktA zls({%CJeBLIlvwa%kOI8ymOuzVO2=|gJB61^&ng2A$E2vI}b6_zkK`-%=kAy4i zgU3uGKg!Zg^FD3{*<)e;&TCU%e!%+)W_>)|UFt6li`M0=#E833gwa^@@EaKtg4a2a zHFz>?qVPV=7kbL8J>KX!&J<7kzdEIiJrl-KEvq2zYg6BPRsf#cs8E705`9ik6^++V zD%I_IA&tEW?#ImW0t?21f_rpODButyo@TF*dyyHiXjXBrl6y&UI21}Z!x3F6fiDZ_ zFXwg2zM^1Umr&RA-XQv_D~wGo)NJ_j`rhXQw$5u91LipYBeu=!{bJQ`l@w~Pe{H=G7GbXSWQ1A_7*Wtx;P9*G%x7fZ+qByKKdOzT0VW5$-d;H-}OKG zE9QC+x&EKVt^+=*Dtph|+)T+Z?~Q8*dj&;66s$-I1X!s_0L20!nS_xf6DA48-o>ui zd+%*m#R9I~wXAC|yP}9)uwVfZQTc!8d+*G=A>_~ge)Ie0+;h$?@Ah}^edmtGsSetq z{f?|pJk}6?!m@&_Pkk2NIEFIp&k(lMI(@Vs8UE+N@PDGuFW_@Xl^_1kWPRzeFrhln8vTyi-%whgnOGJ#zlQ8GR@&uk zHmv2}u*qOYIb{Ds*|&ZXVfUB{-}(908Zy6=@qN6tttRJpUVo6aA`T0MUU&2-89&79 z(UL~`mq~@f(iDG;H)iV7mF(QHS?pcu@e`U9LM~DF&+(e(hDO=#Dy65D@o9YQ3XFo% z7Ng{@(xw@w^A~hYb(wZ}O3=L;G2tQ?9AFOno!74(r`&7MPS}3NXI&F0H?aw3zb5;) zj=3$iz-)K+0&C-W8`L;`2YX=X#(pm<0>r#!Sccm_f;C{*Fa|o)gZh8QTWhm9nmX}} zO|9d!xE$9q%H{F?0$^VT5-JP4VeZ2~`i13sh5lh%8iS!HJR>YR367+6BBhgvhY=4a zP7d3ySfV8!NzJ2)Q;1WE(-=-|*xnE~bzysY#MFnyTy_I7Lp+AqNNgfzi8I5Peb}F) zrZsFoHFjOxwDDoXW#08xdIiL>d@NJu83qaNg09C)m@;#mBulDKNm(x4fOCv6U5&x! z_^_OD1lyKncwX^DNrEs+%WzX*9j_U0#A=nYBYt#p{W$n1D?eH`ttOXCH~Rcjlpiar zmzjmnK20l9T!YEfwPZ1037Iok<;pzup?<|XQ}q);zF+;$lI)SBcJYL4(qb0Ke}bgu z49}9Dqim;4?#miU=6T9=$@EisfpSx2n5?vB&?$LOd!fd-i3*t7JAw(y#Ez8n!eGu-wZ*BEr zf+->Jw<_a&Or}rLoMB7|%&p62X9DxFtMy^JqDIuz&GjGU8fAAY!$&!|5zOabs}*RQ zGJb`V$$5P!+U|9%p4)16%dO=oP}mhh)7>uE>TYG*xJ|Mb$A4itNSXv}1)=3{&-$lT z8zz6?cZZ-~*!F?ij%B_9DAk0)9=u2GRK_>xLt%gb%YU+51q(e0Vdr274@z#^oyrUh z@gS&O%35c%H#Rb(B)yN)$F4yik5h5CGJofOXr@)>@}dlTJBW67M(e%i{=r2o-PPFT!=pa%u8H#l@;Iqaf&D??SVI?l-V2uA)dX4b33*NCqZ-woTJV&*;K z`^3fMe@I+L{D$~FaYY!%++b4$RmS{C&d-t&=9jSTQD#bw&=F#k7$cSu6GX?@o)K8s z5Y4|B>3z2}Vsw2wWB-i99uaDR>a0m8c@o zy$oLjOW?;5&oUSx%seA~^Vtj&AJ3w|_AJ900pvYCOGVN44Cd7(5)QsN6}*giIq?eO zRm7`_*ATBIUPrv1cmwf9;!VVxiMJAOBi=#0lXw^L9^$>k`-qE(PY|CZK23a%_&o6i z;y;Nm5?>;|Onim-FXF4j*NATr-z2_Ge24fR@jt{5h>M9I5tk4@CN34U7sL$^8HKS0 z_!;pF;+Mp)h+h+z5tkExApS&LNnB0*mAHoZ8*wf1cj7u?s6^rl6LCNdG!D@Nah?QN zN{kSrL>!p`KSAt5OcEX9Cd9uGHzjUH+?==taZ6%XVmIQR#9qYS#6HBmiTe`!5&IMO zBkoT;fQatnQ(T2XJcKxqIEXk{&|V)mL+C6g4kZpFRuG31M-WF6|4OVS))CXhdSU}{ zIx#~$hKMf?kQjVl0Bj=S69LdIL>&4Dog=mp+ljM?bBJ?^#}bbt9#1@hcp~v6;>pBQ zh^G=yBc4t?lXwOVh`dT#65{Pu7|YYd>*hDu{W^~ac^Q@qMWreW?y1IVt?X( z#Qli}5Dz3CL_C-{kT`@mj95V&P8>lTNgTzem`b{aSW7&Scrx)6;_1XQh-VVdCZ0n) zmv|l#*X|ypnho@mi)3ciW=8t|#6=ypeb_ z@fPCkL|i)yP24gIyo-1*!+C)CAn_sM!^B643#qw?_yqAO@}DI>NBk%8MdB;Oe-U4! z{_DiI$a$Oi4)I;$d&KvN9}pK4KO}xk{FL|^@pIx=#IK3Vh~F@l?@6y9{y@Z~oXF3g zh(8lo5`UxqTH^1-bwo4|ScAe34d?V#0M^=c2Bzd!i`<(Qh7riR%(Z0vNbid zk9g+(Lq-;f-YvD;mRZ~>3DLeH@-KbBif5_azRZq_h@_uLWSIay-Y>PU#_efw;rAE5 zE;d8H@A5AV=q?z0X{#MZN%!rhsr)s*toR4 z9Y!8LQszNE(+^{b@(=d;UKk%Mdw{T8XUiL{clY{Il^jCJ^qRWtY^44ZWe*f~LuMLy zpDJ&V@anLFFROG|NBc|#gH=#5t}0|cSN0HPSNX?^L*@&Wm8)!@I$4cCG+(M{sET~S zS1K5$g27nBm{gN%=9S%FtGGhN<+*Gt4y{E=zT0LHbVc=86e-*LVrSL@)aJh5_3jr`vp(=-pO0A{~pZ|TYl2JtxY&ot_ z$><_URpwaiD*T|rF-5`=>6*s2=`a+k;;|x@qLK|VSq1q?CF4}m7c0d-D|ftb#gK_# zJyxoqlIrPc?G1w=#oDq8s`7$y*;ZH_kx!O?QDJpn$o(_Kzgk5TM8u7;!tU6wDx4@n z?n@2Dx5~)lH7c1TlIAS7<>d1^tShVFFi+rpB`0Y_WNTG;xCn8eeYPxRVeMJ@lZCIl zu@L;Bf+IvwQ&%So@!PEXoh!%EWi6^oL}hga z*`!RJRFkNR(go3|baR8qVk)Z_SxtLe7Trc$EhKT3G>9bA(2T`r7z0u6bm6vQuemWT zpARDU5-Q4ws6IOji|NWbMp(yYvrQGkPAYqbu-m3*a&_bI&1AN@5-a(L#8G+UdUEar zV%1&cP3y^FAVfvYBJyr6tV*}k{jUiotDdHMKKD zwyDZyGSIorwbOIiW^5OiH)hb|BJE$^t5w+B`(*RIc<<6l8tY=~=yqhxT zQq^l^elc#NvSUStizU-JueBjv+p6q1%8*GFIphFB+)gFOi$pV^b!@Y2er~VA6GYgY zotVwkrX_N9g>`F|JXpX&3Qcr)~F%05lPs>LXgs~MY{mO=cxtLXIgMEDw5daLd#KSSg)>bGJ~ zEnR_aEbeaOmQHU5aApU&-|z0B8fO)0;HFg-%qv7K3-dTFrINEn(%Mwh*jRzPvSHsu z1?PxhTBgBc_fqz`!fwu1*R+dvZ)Kn7vB%}Ivbv7-e=eKDwyP?fFAA7?RpN9*$n34` z3zVHj8$p15RdAs%K&3(Ia0p8U7m1)P*PiCJ_1 zxeC>pFFLK@HKzUkpPy#IwyA1dA{wxJkMVE_cT4Q^+UoIjhH`Hd?l3v&0b8T=dy{Z5Ey%Tv zZg0(Cf95E%Z^^SUp0`cJ*Mh!y3dOgI*t-X-d{#{k?X-sc+k~H=aOrbSqwIE(jjCyF zD|DQ-6x>Ncwx(`$x>+VCbrHOc$TQp{f|k3^sx{b4)>3Jq!Xu(koo;R8j@c9x!%XrYRX)aY;pWJFOu5t^gAUF+X9a~; zDm-4K0K)>a@(OKKSXiVWAym!CFot%@7Zu4R0F}?8{0Wgy#uz*_JDc8Sll>26PiT?U z&WYeHPcr8z;lsqikoI~E0qHt_Z|vBJMIYdm-*cieREA16L_hOSX0R`L-jBi2q>5a& zssFxxaH5}**F;j0X>6=Sw&Ijo1n-v;;X4}IIH{(mQ+KiQH0$R{+L}JFD`FP*Pta|qLG(~fT}R5qi+G1sx&H6ROj^- zE?0$QV!}w47kYa+)`r$llYhc181-fnh7_q+I9HO{Rhdd{gdZz?T2~~BJ-bCrn37LCImiVt%XfK)iOfBbc zD1Ncw5M zp#U*2xlbCDgu9>ez19>m_iH;lL?v<QBntZ&=l$ zGTM~Oh@T2sc=@L)iEW^6Q1~b)nMf=%BEG z!iIuSdMp(_LSaUPsIWMt*^Z(3QGMPS!p|poVx~2NJAQD*Bt12W5M8|tCOY+foRVh7 zh1b8zbZZM18PZ+`FQjlLh3PhyhPLWO6y-!T5_UA%5HT&qp0{REo5+wvioByh|DdOK zUoafA2=A@io3uVj=`3G*D7raZJ&q^G?K2TsNW<@7xsy^#{3OwmGTCRSU#d@wj)=|? zQK4usSw=tb48uNGMCH@dwKK-%aL4O7%)dETc$U)h7&8(j2fp+Rg7gJ+- z)&4IzchffpMl4Wx&n6iI@dp&&BjQn*^bD0ZD5!Zlc%G%2H}{DO3sRR&KB3nK7;+=x z((?OMy!e&oL6Lg-*)px`YLNY7Rf{7J#vA}BCJv{(18Ff09IXPyu%LKM9p6v^8*dbakO zMx>x5>NleQib@5}8>vql^|IRD%0~9F$VYnzwMJyxCSitxV~@U$w8GDe6|_A@qJCTZ zQsi;~9gA2J57v1!hWxzhJJA_}7cqISOGIU9KVRHGicDSw{nx}Ul5#AlOWZ3(1|xed zSQGNa$tVuwi0l`Up?b-!y83KRRQdqerSdwEwZ4j%W>s>Tb-#;DdPuq|M5-&7G8%Oxv8|bpdfzy16Zf*ZM6e33VxWM6J)^ zfv_OIC1v4anJi~}#tKb9FkD`=nT6fxsU#p94a1C>cW|+98%k|JD#b(5wiJ~HM1wQA z3U*@KQ4|S?#-LE>YkP{K0nzYWx*0RiQAiOCLZV&nK$TcPrIN4l1&tl45f5nOTNWeP ziSn|5Tq*@cJ5!Vhh(^@l6Af80-i@Lz0TIfyA=^AO-O`vv*7u-1DROy{^vew`u@?o7 z2xOp^^;$XYkBsk4i7OIRFMlDoPZZsa+1sz#X5T2@7)(Dwsf*nh48M{QeOLft7~5#* zqw+_i*#jOFwZF6RZOcd+adNt#fkYon-`n{qD2V8Juy{uEF+(IVW~3xc(y*tfS2bm4 zq{rd?DrEi|Xv4ilHl%$TCOv*LI#i_MZEt#OshQn83~y!f`c$o=eiX^8uD3`wQ3d;n zV0dPl_63tvZ~)`UG~mO`My@R#u9AZ(X-vzy*%AH|Nb--A;`?FvA#(-*|>*(AiAWj&68R)Hk|VK~W6!8ylT%&lbAxlI+TL=kPixwRTAi}*xe1rtQz zeW$|*JwXKKMB*7*veSx``~sY(LDY#<7Q5NmR0T`&T-B);o$>88b%8Wo%u3ck-??mU zy0ul`I?x6#r!XTznQ>q?s1t`PD47wE$hd=3vg9`f_};tyd|R3LA#L9!pvhdNO-@*de6;BAbaPZE)| zLS0hHt0C$IR5@8xds&K) zkf?XHr-voeT1?l;x<1dsD(VMh-IQk`%}b&d$3xF%vTySQw6@fe#ym;hK0g)(d8oVc z(n`L-FIB;PdBLPyM&1NIQON^&Nkw^Mwl(dA_^FB?%8RSgX^cl-GkFUsbNqMTHPZk2A-#~- zS?~SqH(#j`+$(uiwhrm8@Um6>R<|~qf2%XUGX(V8`0&I__FMT7kQf9a?|6R(e5_L+ zp%{FaaI6sdhk37o$P1xZQ8lH+2r(M7Jvkx%JnvKHAXsN=Xu^trvw`; zvViZez;@v()HelDwq+FV3Xxvld-ru?{u1u@1s!;2U*xN#V*Xs{2UX!xV=x>fWfLX^ zh2o`VmFl9#1vRmGTCDh6KoM=Eu~>OiQI_iRhpKrM(R;PicSFpz{Xj+4B-tI|J}K!N z<-!wgh;JoN>OVugJ%gr@^j zRcIfR#GX4F$&N99VwY68z61KTdnZ+J*H@5L`jFXK<(qVnbGX3G-bw}SLzi|+I~GH z%$xk6dTUwl8c^ZnEw9o?>rTFd*h6)xh}8tPX6!wp?J!Y2Rl)mA$d9WpAH0{!IJom; z+p2x-#(67~4Jvd$85Rf0D8s)8^$ZGu?@MpT^_`w^8l)oC0s?~gdH zV_GNW_2d8)l<=y+0493^5fF3hOCsEC}HfA;XYbOiWTXB?Dhw9ut#Kikp*Fu#bfM34F7ZGsw** zX)?s;HIdhn%$pMN_$AR$Xl8QeJ}^A$-L%)jjg?#y`^~WKifq79Cz*&&!B>aKk{lB^ z*GnAiS#hRWj$vA6@3q)vjM-Jpvf~OWRc+apfJ&RHoKR4~N_#+~ospbW5KBu6$Y)W0 zMnR738#c#ZTb)DUS)NcT=0v=~%1-sMT3Tm&GSq;&ax{P(jt?A1Pv?4qRv89Way%zqIgPX)z+Wr1^96xbVlI*C@?hNv~C&x=X0&x$|1%xP8*#;2Mg zb3q{FmxCdDY43~u)qutu9X0j|m6=osCwNQjpwL^=dhlI1Ecyo4kTy~A+aj*Vd^jNd ziwJr8cTk7Zzng|itO>o7Y(h3xV}ZIc6f>~?6dn}Xz*1Gh=@K*B!bdptelmkoQ6W1x zZ2OntXLbzPx03joos`%)WZzDTXqS+EKPkV{;=q{MH6(uECdT71&nziK77hx1D34ze zNPj5tA#U9Yg%&6A3KKJZLUu8N*gIrzEQ`Ym5?uJ1{z@D`;_W1C;!5m`lL&oiKJ=v$ z`e0fAlI#g3mLjNOUe<*}pGpj-f{*uE(mMh@LPCkbf~)yVrM>=Lk!#J^U5ykkB z{WJ+xQ^{ySR5NeD{4@!pJR(Kj9HzwK3|B4LFww1xWae^~w?DEAu?lV zsPBZ0NxipvBAoA&cps;1MY4gfUBdk#DQAnw{xM0LBBX!vXgM=L_s>b+WP$iui2+m0 z%GID7h{3?6v|LoIUy?O*q{SlvaIJ>YoO0RtsH(-mG>ieN_p6`cnnup8;G<1!MT@63 z$y(Xx1go8a{D!(J{I$trXv7la?@8>R2VPlbhwxHkzfOwUAIzMBPlu>vS|k$z9w&$}RrFq$Z$Wl6g(X!kf7X|4;|HA(w@5{3|k zSdoMUL?M1inj1;{n1tCPd7eK-UkC(9XUyCpHff}M${ehT+^QC8z(_b)E|Zth+q8Li zaiovKIf;;jbZR_i?)Is;fi&n_O>m;h?3yuO+vo)6_!tR!%d|A;3-#l(u#-s>3!9$gWPk^f6|!-`+kB z*)1LEaF_aoIJa_Q=Ccs~;4oi?Y~M2BZVK*K?8vu7u6;}Wy~|?ed*r9%>6jHl$IK7j z-;eSaH$RJN%&bJEbL5Axwt#yTL-5>P9rH`Eb9Ipuc^5Z-hV0h#y{SZJ*3r2cLJGlV zi6gSj91{*RGFXr)iVPNH7_B4-6*{t>II3bOAuX|DXS~QMNpTTlQbOcUIGfWBLLY~Q zdSC|udyC}k?F_?}TClt-g^Gm^GW$BiD~BDvUq38H&_KdIj?R$Ord1Iqv5#ZAh3!6$ zn7i25FWPNs{Gy-Z4Zqvb)!)GaqQ}@lZE)=8WOI0B*iqg4qrGF!xs$pNaB6C6g|jn* zIMCsc5Hh>ad64I%mtDy@*ztxfvm2cQJSP=)C+85Sjd#^`S92o+9o#%1Z!aOU2Q>yc z)BO|id(u7FneBbOuos;}}_BL6cDhMkVeo7AxK($f+)bG6k1?4S`8vxgcRAg%co@D}S+kK=(wr zhe+^;(m6?-qlQV%9Yw}rU`YI)fi1Z&el+=qugCXoh>f9eGKBtfz%z`A9}YwNlpFyG zlRw2Xf{0ZL@{a_6$b=!Z*EOD;qw<{KLsU_Aw1h(IVKjU-rO6^yMp)iTq|qHtRgL<92CN>-)DbH6P^pDQ2@`5?P(Qt?r~ma+J)dB@ zGY*#pjD$gZxdYF;({(x}89tjz@kp@6G#aTK6gmcV)w|my|0*Wz8IHUG;RBNV``HZf zVKem9n9p52SR>LjDAeTCHp=yo1s~8g&1^ytum8Gdml%^}PXl4I(=rQ7_OoUCP{PW> zjkz=|afz!1F8L0!Mb&3IxuAB=$rY4aot)_An5H%dpDeJ~iy0V?!f?5vcl^X982gWd zhj3_?gIBT>!tzSi=-?-2pk|ObIc$${P|D`iu$|?|uSqawPNyo|@G#4PRVR;#8(3=s z3tI356HRR#nqYqks?!*N_&%S}o*-lOg<*SwBfm7ICqN1-OLe}(Zj!W*S>NXg7^=)A zVcWncFAv+NllEf+-VH3HgG*xOMn3Ktj=ZcD)-80sHE{;6Tn>d!bucNw|7jcvggV{t z!(--VFSo;?vz!*sVAU-c8aY#(rxU|lnfkM}lfI44bMk%o?R1~(4MdW?=aIzQI!qwJ zdA`FBvO?xgIxlcC&9i*YT^jp^I_li5v0voiQbB)adXK7I?AL+5oXgCYN`PqY3)@p2 zJI)cT7Bu&V?PNNSBp!uK{yUW>gL;TmL9!rhPZPBmOeIMWm|8p*mZ>Xf3i4Al2_{X>;?uS;!#bhOx2g$+ ztZHtEHsA5V<~b5<01a$6&2tQFHvwV02?*Owz@Lb)-~?r)dzD6n0{H)v1anVb;y08G ziCy_-btg&sl~J!D{zhC&{GIrRpd@LXMzql+h0On&q%d}&OCVM3oL?=n=!l;u(7|ufSU^okyB5oomRV`*V*Qhp{s4Y}eizrxJ zL0ar`A)hW{J_XQhWxzCB6T1?-5w{_3D=7H{J6``|1>Zq6H=3j!J4w<`jCyC{F2r4l zyAgL6lqB`gh&Gx_d#L6{leA|iN$Sa{_agQp_9pfr?ky-qhebkze|t2#m;GdoOgis7 z(BrbRy%U{n$n3BDyZp&CzAVSf#ep!tRbnr6yq`G;NtS+89`s;i&y(PV9$@VGj)=~4 z%s?cTd~iJJAY;!d<_wYa#7w!dF!qDs?sCjf1GF&Th2Vx63sX06VtL{Y$KHvKZiMG! zq~;lN_fAKGMdodYHh)!3C?E_Z3B-nI)a+5J>y=qP)RsUDq{R?iu({gT1Vly#Ioav=3 z7l^GxKKZeckCe3qbUWmeuS=0oj`hq{&Ne%7gH!f!M7Sx1yFaLnyOn>&awVd$j`QlvmJ zZtiB#G84Mbr_2M!?pCiPj=9f*(EYvRXB}bO≈cS z)lA2}w82~uW0S!? z{{MUO&pLVX&*hQK7sN01Iloc@mMXoxz-R{oPyUVf` zYHp~U{r-@3A#PT6^5nnBBbn92U-da*YSVk*-;`KO0#E*j_vGs|=8Zl%<}CTr=}^P{ zG?I_n4x3K@{s>JX4wib@*CgEeVy2PJk zz2}(iO6+^uS#4h;lPoyVS-s=fccru1na}nvXAJ=~yO0kp8_fnTL>cGsyfi7M<*G)hvb~ulh~8E7qJ%+22zo)cx+fl%@=xyWcUr8eA8DoH=3k< zI!V&LjJhAOKM^)qk;wgt2M9`%4$_D=noHPQ&DX;YIpf!E^2Mm@2H!9bVblYOgNTEP zLx|;qlB8i8(MFS0p_&`brQw|GsVd4oc3?xKk}ohzvBcC`iS=Q6#|&y>NzqHoVa3kLcpja*98pquhdHvO@D6h{ zmVj7C^Y1WIO6-ziPK~c)rYTY9>zK3>4JGztM?B&X1q|Gx3{dY!!L&t*UFt{_1B>~` zXbz%OkSU602J`4+N37?9ztj-}x~ON(#4MQ@TU(SsTu=iiM}@Xdf^DZ7LYqYb;m@Z2 z9O7Iu5eN+KdZ8Vs#PL)(v6Em=q8dUwnFPW=h5DxwPa_k-p030hN?;!t4>hloV7=;& z(9WSg!bekq{&~dn$waW2D0->AP>G9#h@1J${qd+?mvs`u<@AA`^a>@e6vA9ZgoR(w z*ATBIUPrv4lhAGyDGJ=&q{PkCzlC@!@iyY^#5;(0brRa$B9+kYQQ}_e-$%Tk_yF;5 z#J>|^7ud@-tx6KeX^weVq!QW!B_5&vqr}IEj}sRX7YWAAQ_R8%$ik;}Xj-O2)^ZM6 z&nW+!q9N;9Hrj8oJTHy;J6SJ(KF|(d2(-h02HN3^LdVQY@)tM%!ow7|!Bz$cWvq$9#__j&(sxSicUVjgNh`+^J)ZqtJ`Gmrq41q!-WO-g{71*jZ!jY*vES%; z`2ojEI5A!>bL?^?=p)a^673<8$;$&%^$xW8ST)g?B8>c0y#tN0_!HGdsQH)E4bkRP z)kLTmp!1=2ps`-8^#Q7=0E*@dmhzXxuZUk0ml2l}zxAH>yFhIDCqzIUXgtG;fNuU7 zpxc3lrT zHxb0S1|}_Ty2*cVlLb30W*aNVAi&2e>~>1SSKRDuWe4*QZ@)Zd_QbbVgF+q8*CsB- zrd&_UP0Da+oorO0;fGxB^vYfcBpeF6{(*yDbQ+gieIh9#i5;Nc)}H}emxmqtP_xwa zk21iRw(Nq2LlM{81!XKzw~c1b`cgUOdZ!ll(V*h4cU-_*;e_4or*U}F+DnoK7Prw` zHgk3mKm!}x;G;TVsWN~DR=L4PVSpb%bFlTN+;P_ou=Wosv^fUH+~TgR75sr^QY+JM zIA?NEpw%&ht-r}wZf(RxH)Doc8zoU;?K(#`FoF1m+?W|@@dt-F)LIxhM+!iXwl*wG z;lMdYoG~+wzGpaQyp`Qh2r7kRs)*HsadQ}zDjEI+;v}N1S53BF_%U-NwGh-%8r0DY zWD0SrAnHg1wPZ^!llM7;Jos!>pH1}BOw0!;pE2D@A~vlpD|wutc;_ATl>@h0VRX&c#yKL)PMK4I0+=Zd-e9S_s?IW`VWcT=R&v*JB@5vd}EFb~{&yMaz9Ua!9bF!NI7i3g?D%Cu;u;p@?nMRJ z9UWx;_;L^5f$emZ@g80o3c06?kB{-4ywE*e9+QfhU$p3ZNzwmm?e4Bw!(v{`V*bP0 zUM%K6SO7pVIuEqOQi{5}CPJczYoa6&ON%VGdzbnRd4QB=pHgYXhlpaGXMY&x_WQYJpHgYY z{Ys_v?pJCDuzX=$9T6SknhGUGkjQ82UrX)&DE(379)W;eRUt9eI(^oiFn zGdurGDscz%bTpbw1ADnKuAE?%7B<$cYxgZk$INw_yW=HyZ(xqzgv%C~qqr>r?O?ns zwW#QTX45dTK}JMkewEZQ2}s{jHy z_b77?^k`Q&iso@DjB(9EB^D|11PLf3x+jG;PYEL1Ue0IRE6lb|KI%$5#XPHWYs8p* z8;%7ax2l6Z(1d&@PAp`iXiajZQ{m^>^mQ2B!*F6ZX8xsFJXx~%Rdz&2FpiLUt<+Yz z=Jis1!enp}#1XEXi~}Bl#`bop#e}NLXT{}42MS|yhr^9!ki^Ym7T8Cnb}|cW2@7np zYd$6i1-6t02F@qspulh?0-T=_zbLg65!09QXK+`+Wa(s7on zR@49(ju%Ix+va^?Sw?4*|0)F|@!q~fbH0*5Ih!A*U@~5Ox41ZsnIt*WAE{s!UL-kh z41*1LakWYU3g=E?{$03j-hd`H-DkM=>N1;g#fJL~R}8B+x)yIQpkYeA$+a)xtR@C~ zp~WovOxM5wI%t?W2Mx34pkcop^bVw9lpHiHkb@6XEOaE+*)Fr!^i+&7>IOWE0=;{E~I0TJ7(PjXOze{jU+ zlz&KoKQLn3ls{M_LW?q` zSa0Ubghf7wg@sjoEI6N2m5aO~O4|R$u9n-_W>ldu5r6J+DVn?#;${8||5z63u{ppDJ6=2MW!RbMvn}QRrk+c?8u-BEiiH~zb(fE6#R%sku(WkjZIxrZVzQKiA zX_+@Qq8?)PJz{TR_mdSTXwyOtx}TX5c`k5rX$6~eR;+sV|P#>}P@fzKrYW!Ps% z$RLgaLAh)k#Zi90*Imowb zgfQ0mQ!D~`tACpL|432( zkIgjdYeXpV2utDNqEc9()5vEuTOX5beU9z$ac`x~JWtm`U2J=S&PC{|<%0$DBArhZ z%E-JNv5zyOUWwR+Lf8ea*p6M~3V$Kq$RqY)4C^elH(6?LN9Uy*gt>$SVtm3C+p7o@IuC z^a9b(qu4(6oQquZU4Z`Hrw#0wBFvvyYS84*tR(Xn>Y(g?C4sX0O$ZsG^F=0BLk5rJ)`9nj{05b^HN^0Df%?tqodO4!2BngK`d&YXNJP$Cpw+y zT~kI5G89%mk)hzgo+osWp)k(*jB8xqDfA{P+LQ#8Hx~l-G6lCJZcP#5?Izyw!yy8) z;D0+Mc2HtRpFmCBRY=%}6zopyAs9D3<a!Y|KoF%J-!oxx)^tuAG3cONWlE!k1q)V(m&2z629)T(yDEe5NVuV^=@735S-t z^0iH^iav31k5B8A78ukO&!4(;^7LoSDHtkI;pZ+s%%ckiA4U5McMg4h>B6W*nyjzf zdhgplk$>&h>$iXPVwg*K%Uqa*5>s6bnuO&p?kH-KQ;eCY{R#ta)PC)n#;A;3%U$nh znxnG74(AfrWTUc>zC_l^?Z>WN>YABR*=_mAwV%261A6H|nAWKM!bSK&jG1=&{FFWs z7Bo7c#hm1qE>af6n3+repU~S<$~vLVv6{xuT?-vNN(aImAGLQS>@q6g;qZgbPu83i z6=qq)oE(+Uuui3O8Q$2%iAppt>W$*CMG3Q|ScTZ5G-l3YeOfI|AyAuEvo@`iw*?uH zR~7Y1zo2k1sXJer#v197E})G>6y0y|)F4MsFVv!2>sLy15exr!H`iR}U4b?~YFD}D z5;mF3*o|GuE?})|e{pR9VY$-&=Gw)=G}j1iV6SowJG>j%;jO{)IXUR?ZeoWA&dubY zS-~tNltJ7^0-`&FFn1E~BHlw0(sLj3$Mrw=d4SB{U08XP5I{Vr#6wCfAc0=&Q6?U0 zNO=Iw+mM0cG|y33OP`Qtf#<`^Y}Vi)_!~)R?iAqX&DPVc z4OK{{{EyJy)XL#%@<*d2iMXi&Pk@$PoM<-=gkc0a81M4F=KaqoK__GjZC2FalJvI4H+Iv+|Ol%El{bvCATe8y5zQ1 zD!=3=^=|7FMhN_OP0i(hw^S={wv3r>F@M&xtyGI`W0Jqy$LzMu=pDof+Q2>^ILK(& z;loS^92ndK2N}JqPuQ(eX14&{oivu?U^Wl>dk}jPVIdD3n7{+V#2pZ}=@1&qW*-vB zT-cOD=7PCJDu}QiCr&LnyLHO!U(D&6G6#~gWy&0+#KB4&LINQm(m|v(C@~`!2-yrN za@uYwGqi|fh7~zcWH2G;cMFHo{>=vMEhS!NnQfmhvmNqfwqtRb?c|r)&VHHgk}tDS zT4uXRnT=tY!9Lw?EVJ<}v)xjrk{py-70V2qYI0C!6Me$&m@<pYW|M`0K{~;s zh({Br5T_ES2}+sOkwBT%v&_KUJ|!YWGo1>W(RQa4EWU|Cp0jhx%phlnlxb9=Nr@~8 z=p!*RNvlU#Z3~7YM%seG?vgU?MI1A$$cZw86*RxhPGFgB&;nNC4VGE=e3|vgm)Rc0 zWwxhZW`WgaG{ zN6IWv;t?etBY^<%C<{qzP-aoF^NAv--796DEaI4_ikzqd&lRk<#mw`p1syH8B_3oI zIH)j`9~>OY2lzwz3oO@x`Jw!ubPw`}@)zkETs)M&BsEZK!;s)mUS1f=Usi>oI+VYn zb!nK?rGGKh3K`1(9kYW{=JlAxnalyH^?v4!m>tL=en85+8IyTDbcUqNJ24sJhoo#d zrU9Ti0RBgm&3`38@ijPQ7Blbjzzj6ts zGunL42JltP4r2rOnhjuB$}A%X4PZGN065>0g9h-O5axU03gV9xq0+8o>Q~Vj9Ozef z;H>dEW-SQ}{l6=*PKgk%!)B)7h}b|pl@+%sB}OR=W2E;991bIe{xBJrF$`Yu^Z_(3 z74kJWRqWh^PMoj9ykN6p(dNa@E$Ez%?+@ZKzd#iHnXcqxez6S+gtMIxGOgH^uO+gd zw;L{H7_SHxSpv~UoprHH4Wr_jLKIEXF_Z7nQBlaf~kF-At1bblIR$-{8 w6J-s00BH~deWn>qqB3QMC^1xtVM+`qakOJbve=Nk@hM59qB)cb@}gJve_#6WhyVZp literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_newDraw.obj b/quake3/source/code/cgame/Debug_TA/cg_newDraw.obj new file mode 100644 index 0000000000000000000000000000000000000000..891aa6233370a44aff1a5fc198fcbe07c6b4d892 GIT binary patch literal 42249 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_newDraw.sbr b/quake3/source/code/cgame/Debug_TA/cg_newDraw.sbr new file mode 100644 index 0000000000000000000000000000000000000000..1832435e4fa923bd1dfa2a920dbe6dc5d30eec56 GIT binary patch literal 104318 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_players.obj b/quake3/source/code/cgame/Debug_TA/cg_players.obj new file mode 100644 index 0000000000000000000000000000000000000000..097caf053192404361262763293fbc898ca9aa45 GIT binary patch literal 34570 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ⅆ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 ZEH=JlnM-530?pBTF*&6`&(H$J{tt$5kQD#` literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_playerstate.obj b/quake3/source/code/cgame/Debug_TA/cg_playerstate.obj new file mode 100644 index 0000000000000000000000000000000000000000..c349fd26caf7765f77b76ade1836e044565385ef GIT binary patch literal 7337 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 TN(*+ahoo}~hn#784~hQ=aO{VN literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_predict.sbr b/quake3/source/code/cgame/Debug_TA/cg_predict.sbr new file mode 100644 index 0000000000000000000000000000000000000000..b721dc87b2c5cd51861e5c56d30a507bea970b87 GIT binary patch literal 72205 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 RY0R8NC3AA{o8Otl{|CMpvF`u? literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_scoreboard.obj b/quake3/source/code/cgame/Debug_TA/cg_scoreboard.obj new file mode 100644 index 0000000000000000000000000000000000000000..4d307ec50bcb63268cf36f24725c1a576fb9e1ef GIT binary patch literal 8194 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_scoreboard.sbr b/quake3/source/code/cgame/Debug_TA/cg_scoreboard.sbr new file mode 100644 index 0000000000000000000000000000000000000000..b5d0678e0054f34e7366286adcac7ce97295de3c GIT binary patch literal 72499 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 z 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_servercmds.obj b/quake3/source/code/cgame/Debug_TA/cg_servercmds.obj new file mode 100644 index 0000000000000000000000000000000000000000..dfad8139677841af7997307bccc2e9539c4b5086 GIT binary patch literal 21065 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_snapshot.obj b/quake3/source/code/cgame/Debug_TA/cg_snapshot.obj new file mode 100644 index 0000000000000000000000000000000000000000..ab41cff178c7ae397c27f0da74a659d1cc3ae78e GIT binary patch literal 4804 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 SHV`l7qNpt1lZeFZ0r5X|5AyB+ literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_snapshot.sbr b/quake3/source/code/cgame/Debug_TA/cg_snapshot.sbr new file mode 100644 index 0000000000000000000000000000000000000000..442eeb88c317e852503c32d05f1493344acee3c2 GIT binary patch literal 70024 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 XUV}5?yBM{iLlw*~l`%`niL~}#f6F1F literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_syscalls.sbr b/quake3/source/code/cgame/Debug_TA/cg_syscalls.sbr new file mode 100644 index 0000000000000000000000000000000000000000..694a8bccd803c26db1b0d196e033269d6fdd0cd0 GIT binary patch literal 76294 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 z +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 z%0D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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_view.obj b/quake3/source/code/cgame/Debug_TA/cg_view.obj new file mode 100644 index 0000000000000000000000000000000000000000..cb8cd770bfc72bef10d41cade367e60fbf08903f GIT binary patch literal 15732 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 F{}&qjR;&O3 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cg_weapons.obj b/quake3/source/code/cgame/Debug_TA/cg_weapons.obj new file mode 100644 index 0000000000000000000000000000000000000000..d613fadd5f79a21cdf6d64ba9be5b1e94f448381 GIT binary patch literal 45848 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 B_*DP^ literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/cgame.pch b/quake3/source/code/cgame/Debug_TA/cgame.pch new file mode 100644 index 0000000000000000000000000000000000000000..77bfc24f718df5a18ba75fa080805c14e55a36a6 GIT binary patch literal 518320 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ⅆLw)@<-gD$2k}}l@umI- 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/q_shared.sbr b/quake3/source/code/cgame/Debug_TA/q_shared.sbr new file mode 100644 index 0000000000000000000000000000000000000000..e8bbd7d8435c8506e59d5b225c3edb2fd6f59f8b GIT binary patch literal 35897 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/ui_shared.sbr b/quake3/source/code/cgame/Debug_TA/ui_shared.sbr new file mode 100644 index 0000000000000000000000000000000000000000..f47cad3776c21b2d7f8f865e38c8445e4066f049 GIT binary patch literal 97423 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/Debug_TA/vc50.idb b/quake3/source/code/cgame/Debug_TA/vc50.idb new file mode 100644 index 0000000000000000000000000000000000000000..e022f5c5695edc3019f4604d5b505708c99fcddd GIT binary patch literal 66560 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 EAGT4Qr~m)} literal 0 HcmV?d00001 diff --git a/quake3/source/code/cgame/cg_consolecmds.c b/quake3/source/code/cgame/cg_consolecmds.c new file mode 100644 index 0000000..39c886c --- /dev/null +++ b/quake3/source/code/cgame/cg_consolecmds.c @@ -0,0 +1,611 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_consolecmds.c -- text commands typed in at the local console, or +// executed by a key binding + +#include "cg_local.h" +#include "../ui/ui_shared.h" +#ifdef MISSIONPACK +extern menuDef_t *menuScoreboard; +#endif + + + +//PKMOD - Ergodic 12/09/03 - add command dynamic hub voting +static void CG_HubAlternates_f (void ) { + trap_SendConsoleCommand( "hubalternates\n" ); +} + +void CG_TargetCommand_f( void ) { + int targetNum; + char test[4]; + + targetNum = CG_CrosshairPlayer(); + if (!targetNum ) { + return; + } + + trap_Argv( 1, test, 4 ); + trap_SendConsoleCommand( va( "gc %i %i", targetNum, atoi( test ) ) ); +} + + + +/* +================= +CG_SizeUp_f + +Keybinding command +================= +*/ +static void CG_SizeUp_f (void) { + trap_Cvar_Set("cg_viewsize", va("%i",(int)(cg_viewsize.integer+10))); +} + + +/* +================= +CG_SizeDown_f + +Keybinding command +================= +*/ +static void CG_SizeDown_f (void) { + trap_Cvar_Set("cg_viewsize", va("%i",(int)(cg_viewsize.integer-10))); +} + + +/* +============= +CG_Viewpos_f + +Debugging command to print the current position +============= +*/ +static void CG_Viewpos_f (void) { + CG_Printf ("(%i %i %i) : %i\n", (int)cg.refdef.vieworg[0], + (int)cg.refdef.vieworg[1], (int)cg.refdef.vieworg[2], + (int)cg.refdefViewAngles[YAW]); +} + + +static void CG_ScoresDown_f( void ) { + +#ifdef MISSIONPACK + CG_BuildSpectatorString(); +#endif + if ( cg.scoresRequestTime + 2000 < cg.time ) { + // the scores are more than two seconds out of data, + // so request new ones + cg.scoresRequestTime = cg.time; + trap_SendClientCommand( "score" ); + + // leave the current scores up if they were already + // displayed, but if this is the first hit, clear them out + if ( !cg.showScores ) { + cg.showScores = qtrue; + cg.numScores = 0; + } + } else { + // show the cached contents even if they just pressed if it + // is within two seconds + cg.showScores = qtrue; + } +} + +static void CG_ScoresUp_f( void ) { + if ( cg.showScores ) { + cg.showScores = qfalse; + cg.scoreFadeTime = cg.time; + } +} + +//PKMOD - Ergodic 02/23/04 - include HUD commands +//#ifdef MISSIONPACK +extern menuDef_t *menuScoreboard; +void Menu_Reset(); // FIXME: add to right include file + +static void CG_LoadHud_f( void) { + char buff[1024]; + const char *hudSet; + memset(buff, 0, sizeof(buff)); + + String_Init(); + Menu_Reset(); + + trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff)); + hudSet = buff; + if (hudSet[0] == '\0') { + hudSet = "ui/hud.txt"; + } + + CG_LoadMenus(hudSet); + menuScoreboard = NULL; +} + + +static void CG_scrollScoresDown_f( void) { + if (menuScoreboard && cg.scoreBoardShowing) { + Menu_ScrollFeeder(menuScoreboard, FEEDER_SCOREBOARD, qtrue); + Menu_ScrollFeeder(menuScoreboard, FEEDER_REDTEAM_LIST, qtrue); + Menu_ScrollFeeder(menuScoreboard, FEEDER_BLUETEAM_LIST, qtrue); + } +} + + +static void CG_scrollScoresUp_f( void) { + if (menuScoreboard && cg.scoreBoardShowing) { + Menu_ScrollFeeder(menuScoreboard, FEEDER_SCOREBOARD, qfalse); + Menu_ScrollFeeder(menuScoreboard, FEEDER_REDTEAM_LIST, qfalse); + Menu_ScrollFeeder(menuScoreboard, FEEDER_BLUETEAM_LIST, qfalse); + } +} + +//PKMOD - Ergodic 02/23/04 - include HUD commands: move ifdef here +#ifdef MISSIONPACK + +static void CG_spWin_f( void) { + trap_Cvar_Set("cg_cameraOrbit", "2"); + trap_Cvar_Set("cg_cameraOrbitDelay", "35"); + trap_Cvar_Set("cg_thirdPerson", "1"); + trap_Cvar_Set("cg_thirdPersonAngle", "0"); + trap_Cvar_Set("cg_thirdPersonRange", "100"); + CG_AddBufferedSound(cgs.media.winnerSound); + //trap_S_StartLocalSound(cgs.media.winnerSound, CHAN_ANNOUNCER); + CG_CenterPrint("YOU WIN!", SCREEN_HEIGHT * .30, 0); +} + +static void CG_spLose_f( void) { + trap_Cvar_Set("cg_cameraOrbit", "2"); + trap_Cvar_Set("cg_cameraOrbitDelay", "35"); + trap_Cvar_Set("cg_thirdPerson", "1"); + trap_Cvar_Set("cg_thirdPersonAngle", "0"); + trap_Cvar_Set("cg_thirdPersonRange", "100"); + CG_AddBufferedSound(cgs.media.loserSound); + //trap_S_StartLocalSound(cgs.media.loserSound, CHAN_ANNOUNCER); + CG_CenterPrint("YOU LOSE...", SCREEN_HEIGHT * .30, 0); +} + +#endif + +static void CG_TellTarget_f( void ) { + int clientNum; + char command[128]; + char message[128]; + + clientNum = CG_CrosshairPlayer(); + if ( clientNum == -1 ) { + return; + } + + trap_Args( message, 128 ); + Com_sprintf( command, 128, "tell %i %s", clientNum, message ); + trap_SendClientCommand( command ); +} + +static void CG_TellAttacker_f( void ) { + int clientNum; + char command[128]; + char message[128]; + + clientNum = CG_LastAttacker(); + if ( clientNum == -1 ) { + return; + } + + trap_Args( message, 128 ); + Com_sprintf( command, 128, "tell %i %s", clientNum, message ); + trap_SendClientCommand( command ); +} + +static void CG_VoiceTellTarget_f( void ) { + int clientNum; + char command[128]; + char message[128]; + + clientNum = CG_CrosshairPlayer(); + if ( clientNum == -1 ) { + return; + } + + trap_Args( message, 128 ); + Com_sprintf( command, 128, "vtell %i %s", clientNum, message ); + trap_SendClientCommand( command ); +} + +static void CG_VoiceTellAttacker_f( void ) { + int clientNum; + char command[128]; + char message[128]; + + clientNum = CG_LastAttacker(); + if ( clientNum == -1 ) { + return; + } + + trap_Args( message, 128 ); + Com_sprintf( command, 128, "vtell %i %s", clientNum, message ); + trap_SendClientCommand( command ); +} + +//PKMOD - Ergodic 02/23/04 - enable HUD functions +//#ifdef MISSIONPACK +static void CG_NextTeamMember_f( void ) { + CG_SelectNextPlayer(); +} + +static void CG_PrevTeamMember_f( void ) { + CG_SelectPrevPlayer(); +} + +//PKMOD - Ergodic 02/23/04 - enable HUD functions: move the ifdef statment here +#ifdef MISSIONPACK + + +// ASS U ME's enumeration order as far as task specific orders, OFFENSE is zero, CAMP is last +// +static void CG_NextOrder_f( void ) { + clientInfo_t *ci = cgs.clientinfo + cg.snap->ps.clientNum; + if (ci) { + if (!ci->teamLeader && sortedTeamPlayers[cg_currentSelectedPlayer.integer] != cg.snap->ps.clientNum) { + return; + } + } + if (cgs.currentOrder < TEAMTASK_CAMP) { + cgs.currentOrder++; + + if (cgs.currentOrder == TEAMTASK_RETRIEVE) { + if (!CG_OtherTeamHasFlag()) { + cgs.currentOrder++; + } + } + + if (cgs.currentOrder == TEAMTASK_ESCORT) { + if (!CG_YourTeamHasFlag()) { + cgs.currentOrder++; + } + } + + } else { + cgs.currentOrder = TEAMTASK_OFFENSE; + } + cgs.orderPending = qtrue; + cgs.orderTime = cg.time + 3000; +} + + +static void CG_ConfirmOrder_f (void ) { + trap_SendConsoleCommand(va("cmd vtell %d %s\n", cgs.acceptLeader, VOICECHAT_YES)); + trap_SendConsoleCommand("+button5; wait; -button5"); + if (cg.time < cgs.acceptOrderTime) { + trap_SendClientCommand(va("teamtask %d\n", cgs.acceptTask)); + cgs.acceptOrderTime = 0; + } +} + +static void CG_DenyOrder_f (void ) { + trap_SendConsoleCommand(va("cmd vtell %d %s\n", cgs.acceptLeader, VOICECHAT_NO)); + trap_SendConsoleCommand("+button6; wait; -button6"); + if (cg.time < cgs.acceptOrderTime) { + cgs.acceptOrderTime = 0; + } +} + +static void CG_TaskOffense_f (void ) { + if (cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONGETFLAG)); + } else { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONOFFENSE)); + } + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_OFFENSE)); +} + +static void CG_TaskDefense_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONDEFENSE)); + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_DEFENSE)); +} + +static void CG_TaskPatrol_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONPATROL)); + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_PATROL)); +} + +static void CG_TaskCamp_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONCAMPING)); + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_CAMP)); +} + +static void CG_TaskFollow_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONFOLLOW)); + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_FOLLOW)); +} + +static void CG_TaskRetrieve_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONRETURNFLAG)); + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_RETRIEVE)); +} + +static void CG_TaskEscort_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_ONFOLLOWCARRIER)); + trap_SendClientCommand(va("teamtask %d\n", TEAMTASK_ESCORT)); +} + +static void CG_TaskOwnFlag_f (void ) { + trap_SendConsoleCommand(va("cmd vsay_team %s\n", VOICECHAT_IHAVEFLAG)); +} + +static void CG_TauntKillInsult_f (void ) { + trap_SendConsoleCommand("cmd vsay kill_insult\n"); +} + +static void CG_TauntPraise_f (void ) { + trap_SendConsoleCommand("cmd vsay praise\n"); +} + +static void CG_TauntTaunt_f (void ) { + trap_SendConsoleCommand("cmd vtaunt\n"); +} + +static void CG_TauntDeathInsult_f (void ) { + trap_SendConsoleCommand("cmd vsay death_insult\n"); +} + +static void CG_TauntGauntlet_f (void ) { + trap_SendConsoleCommand("cmd vsay kill_guantlet\n"); +} + +static void CG_TaskSuicide_f (void ) { + int clientNum; + char command[128]; + + clientNum = CG_CrosshairPlayer(); + if ( clientNum == -1 ) { + return; + } + + Com_sprintf( command, 128, "tell %i suicide", clientNum ); + trap_SendClientCommand( command ); +} + + + + +/* +================== +CG_TeamMenu_f +================== +*/ +/* +static void CG_TeamMenu_f( void ) { + if (trap_Key_GetCatcher() & KEYCATCH_CGAME) { + CG_EventHandling(CGAME_EVENT_NONE); + trap_Key_SetCatcher(0); + } else { + CG_EventHandling(CGAME_EVENT_TEAMMENU); + //trap_Key_SetCatcher(KEYCATCH_CGAME); + } +} +*/ + +/* +================== +CG_EditHud_f +================== +*/ +/* +static void CG_EditHud_f( void ) { + //cls.keyCatchers ^= KEYCATCH_CGAME; + //VM_Call (cgvm, CG_EVENT_HANDLING, (cls.keyCatchers & KEYCATCH_CGAME) ? CGAME_EVENT_EDITHUD : CGAME_EVENT_NONE); +} +*/ + +#endif + +/* +================== +CG_StartOrbit_f +================== +*/ + +static void CG_StartOrbit_f( void ) { + char var[MAX_TOKEN_CHARS]; + + trap_Cvar_VariableStringBuffer( "developer", var, sizeof( var ) ); + if ( !atoi(var) ) { + return; + } + if (cg_cameraOrbit.value != 0) { + trap_Cvar_Set ("cg_cameraOrbit", "0"); + trap_Cvar_Set("cg_thirdPerson", "0"); + } else { + trap_Cvar_Set("cg_cameraOrbit", "5"); + trap_Cvar_Set("cg_thirdPerson", "1"); + trap_Cvar_Set("cg_thirdPersonAngle", "0"); + trap_Cvar_Set("cg_thirdPersonRange", "100"); + } +} + +/* +static void CG_Camera_f( void ) { + char name[1024]; + trap_Argv( 1, name, sizeof(name)); + if (trap_loadCamera(name)) { + cg.cameraMode = qtrue; + trap_startCamera(cg.time); + } else { + CG_Printf ("Unable to load camera %s\n",name); + } +} +*/ + + +typedef struct { + char *cmd; + void (*function)(void); +} consoleCommand_t; + +static consoleCommand_t commands[] = { + { "testgun", CG_TestGun_f }, + { "testmodel", CG_TestModel_f }, + { "nextframe", CG_TestModelNextFrame_f }, + { "prevframe", CG_TestModelPrevFrame_f }, + { "nextskin", CG_TestModelNextSkin_f }, + { "prevskin", CG_TestModelPrevSkin_f }, + { "viewpos", CG_Viewpos_f }, + { "+scores", CG_ScoresDown_f }, + { "-scores", CG_ScoresUp_f }, + { "+zoom", CG_ZoomDown_f }, + { "-zoom", CG_ZoomUp_f }, + { "sizeup", CG_SizeUp_f }, + { "sizedown", CG_SizeDown_f }, + { "weapnext", CG_NextWeapon_f }, + { "weapprev", CG_PrevWeapon_f }, + { "weapon", CG_Weapon_f }, +//PKMOD - Ergodic 07/02/00 PKA weapon commands + { "gravitywell", CG_Weapon_GravityWell }, + { "autosentry", CG_Weapon_Sentry }, + { "beartrap", CG_Weapon_BearTrap }, + { "beans", CG_Weapon_Beans }, +//PKMOD - Ergodic 07/12/00 PKA weapon commands + { "gauntlet", CG_Weapon_Gauntlet }, + { "machinegun", CG_Weapon_MachineGun }, +//PKMOD - Ergodic 03/22/01 - change shotgun name to boomstick + { "boomstick", CG_Weapon_ShotGun }, + { "airfist", CG_Weapon_AirFist }, + { "nailgun", CG_Weapon_NailGun }, + { "grenades", CG_Weapon_GrenadeLauncher }, + { "rockets", CG_Weapon_RocketLauncher }, + { "lightning", CG_Weapon_LightningGun }, +//PKMOD - Ergodic 07/12/01 - change railgun name to magnum + { "magnum", CG_Weapon_RailGun }, + { "dragon", CG_Weapon_Harpoon }, +//PKMOD - Ergodic 03/01/01 - dragon deploy pka weapon +//PKMOD - Ergodic 03/27/01 - remove dragon deploy for beta 2 launch (sniff) +//PKMOD - Ergodic 05/08/01 - re-enable dragon deploy + { "dragondeploy", CG_Weapon_DragonDeploy }, +//PKMOD - Ergodic 04/04/01 - add last weapon command + { "weaplast", CG_LastWeapon_f }, + + { "tell_target", CG_TellTarget_f }, + { "tell_attacker", CG_TellAttacker_f }, + { "vtell_target", CG_VoiceTellTarget_f }, + { "vtell_attacker", CG_VoiceTellAttacker_f }, + { "tcmd", CG_TargetCommand_f }, +//PKMOD - Ergodic 02/23/04 - include HUD commands + { "loadhud", CG_LoadHud_f }, + { "nextTeamMember", CG_NextTeamMember_f }, + { "prevTeamMember", CG_PrevTeamMember_f }, + { "scoresDown", CG_scrollScoresDown_f }, + { "scoresUp", CG_scrollScoresUp_f }, +#ifdef MISSIONPACK + { "loadhud", CG_LoadHud_f }, + { "nextTeamMember", CG_NextTeamMember_f }, + { "prevTeamMember", CG_PrevTeamMember_f }, + { "nextOrder", CG_NextOrder_f }, + { "confirmOrder", CG_ConfirmOrder_f }, + { "denyOrder", CG_DenyOrder_f }, + { "taskOffense", CG_TaskOffense_f }, + { "taskDefense", CG_TaskDefense_f }, + { "taskPatrol", CG_TaskPatrol_f }, + { "taskCamp", CG_TaskCamp_f }, + { "taskFollow", CG_TaskFollow_f }, + { "taskRetrieve", CG_TaskRetrieve_f }, + { "taskEscort", CG_TaskEscort_f }, + { "taskSuicide", CG_TaskSuicide_f }, + { "taskOwnFlag", CG_TaskOwnFlag_f }, + { "tauntKillInsult", CG_TauntKillInsult_f }, + { "tauntPraise", CG_TauntPraise_f }, + { "tauntTaunt", CG_TauntTaunt_f }, + { "tauntDeathInsult", CG_TauntDeathInsult_f }, + { "tauntGauntlet", CG_TauntGauntlet_f }, + { "spWin", CG_spWin_f }, + { "spLose", CG_spLose_f }, + { "scoresDown", CG_scrollScoresDown_f }, + { "scoresUp", CG_scrollScoresUp_f }, +#endif + { "startOrbit", CG_StartOrbit_f }, + //{ "camera", CG_Camera_f }, + { "loaddeferred", CG_LoadDeferredPlayers }, + //PKMOD - Ergodic 12/09/03 - Add dynamic hub vote command + { "cghubalternates", CG_HubAlternates_f } +}; + + +/* +================= +CG_ConsoleCommand + +The string has been tokenized and can be retrieved with +Cmd_Argc() / Cmd_Argv() +================= +*/ +qboolean CG_ConsoleCommand( void ) { + const char *cmd; + int i; + + cmd = CG_Argv(0); + + for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) { + if ( !Q_stricmp( cmd, commands[i].cmd ) ) { + commands[i].function(); + return qtrue; + } + } + + return qfalse; +} + + +/* +================= +CG_InitConsoleCommands + +Let the client system know about all of our commands +so it can perform tab completion +================= +*/ +void CG_InitConsoleCommands( void ) { + int i; + + for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) { + trap_AddCommand( commands[i].cmd ); + } + + // + // the game server will interpret these commands, which will be automatically + // forwarded to the server after they are not recognized locally + // + trap_AddCommand ("kill"); + trap_AddCommand ("say"); + trap_AddCommand ("say_team"); + trap_AddCommand ("tell"); + trap_AddCommand ("vsay"); + trap_AddCommand ("vsay_team"); + trap_AddCommand ("vtell"); + trap_AddCommand ("vtaunt"); + trap_AddCommand ("vosay"); + trap_AddCommand ("vosay_team"); + trap_AddCommand ("votell"); + trap_AddCommand ("give"); + trap_AddCommand ("god"); + trap_AddCommand ("notarget"); + trap_AddCommand ("noclip"); + trap_AddCommand ("team"); + trap_AddCommand ("follow"); + trap_AddCommand ("levelshot"); + trap_AddCommand ("addbot"); + trap_AddCommand ("setviewpos"); + trap_AddCommand ("callvote"); + trap_AddCommand ("vote"); + trap_AddCommand ("callteamvote"); + trap_AddCommand ("teamvote"); + trap_AddCommand ("stats"); + trap_AddCommand ("teamtask"); + trap_AddCommand ("loaddefered"); // spelled wrong, but not changing for demo + //PKMOD - Ergodic 03/04/01 - add dragondeploy command + //PKMOD - Ergodic 03/27/01 - remove dragon deploy for beta 2 launch (sniff) + //PKMOD - Ergodic 05/08/01 - re-enable dragon deploy + trap_AddCommand ("gdeploy"); + //PKMOD - Ergodic 12/10/03 - add command for dynamic hub messaging +// trap_AddCommand ("cghubalternates"); +} diff --git a/quake3/source/code/cgame/cg_draw.c b/quake3/source/code/cgame/cg_draw.c new file mode 100644 index 0000000..f915c5d --- /dev/null +++ b/quake3/source/code/cgame/cg_draw.c @@ -0,0 +1,2872 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_draw.c -- draw all of the graphical elements during +// active (after loading) gameplay + +#include "cg_local.h" + +//PKMOD - Ergodic 01/17/04 - Enable Hud Code +//#ifdef MISSIONPACK +#include "../ui/ui_shared.h" + +// used for scoreboard +extern displayContextDef_t cgDC; +menuDef_t *menuScoreboard = NULL; +//#else +//PKMOD - Ergodic 01/30/04 - Enable Hud Code: drawTeamOverlayModificationCount is defined in cg_newdraw +//int drawTeamOverlayModificationCount = -1; +//#endif + +int sortedTeamPlayers[TEAM_MAXOVERLAY]; +int numSortedTeamPlayers; + +char systemChat[256]; +char teamChat1[256]; +char teamChat2[256]; +//PKMOD - Ergodic 10/13/00 - define hubinfo lines +int numHubInfoLines; + +//PKMOD - Ergodic 01/17/04 - Enable Hud Code +//#ifdef MISSIONPACK + +int CG_Text_Width(const char *text, float scale, int limit) { + int count,len; + float out; + glyphInfo_t *glyph; + float useScale; +// FIXME: see ui_main.c, same problem +// const unsigned char *s = text; + const char *s = text; + fontInfo_t *font = &cgDC.Assets.textFont; + if (scale <= cg_smallFont.value) { + font = &cgDC.Assets.smallFont; + } else if (scale > cg_bigFont.value) { + font = &cgDC.Assets.bigFont; + } + useScale = scale * font->glyphScale; + out = 0; + if (text) { + len = strlen(text); + if (limit > 0 && len > limit) { + len = limit; + } + count = 0; + while (s && *s && count < len) { + if ( Q_IsColorString(s) ) { + s += 2; + continue; + } else { + glyph = &font->glyphs[(int)*s]; // TTimo: FIXME: getting nasty warnings without the cast, hopefully this doesn't break the VM build + out += glyph->xSkip; + s++; + count++; + } + } + } + return out * useScale; +} + +int CG_Text_Height(const char *text, float scale, int limit) { + int len, count; + float max; + glyphInfo_t *glyph; + float useScale; +// TTimo: FIXME +// const unsigned char *s = text; + const char *s = text; + fontInfo_t *font = &cgDC.Assets.textFont; + if (scale <= cg_smallFont.value) { + font = &cgDC.Assets.smallFont; + } else if (scale > cg_bigFont.value) { + font = &cgDC.Assets.bigFont; + } + useScale = scale * font->glyphScale; + max = 0; + if (text) { + len = strlen(text); + if (limit > 0 && len > limit) { + len = limit; + } + count = 0; + while (s && *s && count < len) { + if ( Q_IsColorString(s) ) { + s += 2; + continue; + } else { + glyph = &font->glyphs[(int)*s]; // TTimo: FIXME: getting nasty warnings without the cast, hopefully this doesn't break the VM build + if (max < glyph->height) { + max = glyph->height; + } + s++; + count++; + } + } + } + return max * useScale; +} + +void CG_Text_PaintChar(float x, float y, float width, float height, float scale, float s, float t, float s2, float t2, qhandle_t hShader) { + float w, h; + w = width * scale; + h = height * scale; + CG_AdjustFrom640( &x, &y, &w, &h ); + trap_R_DrawStretchPic( x, y, w, h, s, t, s2, t2, hShader ); +} + +void CG_Text_Paint(float x, float y, float scale, vec4_t color, const char *text, float adjust, int limit, int style) { + int len, count; + vec4_t newColor; + glyphInfo_t *glyph; + float useScale; + fontInfo_t *font = &cgDC.Assets.textFont; + if (scale <= cg_smallFont.value) { + font = &cgDC.Assets.smallFont; + } else if (scale > cg_bigFont.value) { + font = &cgDC.Assets.bigFont; + } + useScale = scale * font->glyphScale; + if (text) { +// TTimo: FIXME +// const unsigned char *s = text; + const char *s = text; + trap_R_SetColor( color ); + memcpy(&newColor[0], &color[0], sizeof(vec4_t)); + len = strlen(text); + if (limit > 0 && len > limit) { + len = limit; + } + count = 0; + while (s && *s && count < len) { + glyph = &font->glyphs[(int)*s]; // TTimo: FIXME: getting nasty warnings without the cast, hopefully this doesn't break the VM build + //int yadj = Assets.textFont.glyphs[text[i]].bottom + Assets.textFont.glyphs[text[i]].top; + //float yadj = scale * (Assets.textFont.glyphs[text[i]].imageHeight - Assets.textFont.glyphs[text[i]].height); + if ( Q_IsColorString( s ) ) { + memcpy( newColor, g_color_table[ColorIndex(*(s+1))], sizeof( newColor ) ); + newColor[3] = color[3]; + trap_R_SetColor( newColor ); + s += 2; + continue; + } else { + float yadj = useScale * glyph->top; + if (style == ITEM_TEXTSTYLE_SHADOWED || style == ITEM_TEXTSTYLE_SHADOWEDMORE) { + int ofs = style == ITEM_TEXTSTYLE_SHADOWED ? 1 : 2; + colorBlack[3] = newColor[3]; + trap_R_SetColor( colorBlack ); + CG_Text_PaintChar(x + ofs, y - yadj + ofs, + glyph->imageWidth, + glyph->imageHeight, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph); + colorBlack[3] = 1.0; + trap_R_SetColor( newColor ); + } + CG_Text_PaintChar(x, y - yadj, + glyph->imageWidth, + glyph->imageHeight, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph); + // CG_DrawPic(x, y - yadj, scale * cgDC.Assets.textFont.glyphs[text[i]].imageWidth, scale * cgDC.Assets.textFont.glyphs[text[i]].imageHeight, cgDC.Assets.textFont.glyphs[text[i]].glyph); + x += (glyph->xSkip * useScale) + adjust; + s++; + count++; + } + } + trap_R_SetColor( NULL ); + } +} + + +//PKMOD - Ergodic 01/17/04 - Enable Hud Code +//#endif + +/* +============== +CG_DrawField + +Draws large numbers for status bar and powerups +============== +*/ +#ifndef MISSIONPACK +static void CG_DrawField (int x, int y, int width, int value) { + char num[16], *ptr; + int l; + int frame; + + if ( width < 1 ) { + return; + } + + // draw number string + if ( width > 5 ) { + width = 5; + } + + switch ( width ) { + case 1: + value = value > 9 ? 9 : value; + value = value < 0 ? 0 : value; + break; + case 2: + value = value > 99 ? 99 : value; + value = value < -9 ? -9 : value; + break; + case 3: + value = value > 999 ? 999 : value; + value = value < -99 ? -99 : value; + break; + case 4: + value = value > 9999 ? 9999 : value; + value = value < -999 ? -999 : value; + break; + } + + Com_sprintf (num, sizeof(num), "%i", value); + l = strlen(num); + if (l > width) + l = width; + x += 2 + CHAR_WIDTH*(width - l); + + ptr = num; + while (*ptr && l) + { + if (*ptr == '-') + frame = STAT_MINUS; + else + frame = *ptr -'0'; + + CG_DrawPic( x,y, CHAR_WIDTH, CHAR_HEIGHT, cgs.media.numberShaders[frame] ); + x += CHAR_WIDTH; + ptr++; + l--; + } +} +#endif // MISSIONPACK + +/* +================ +CG_Draw3DModel + +================ +*/ +void CG_Draw3DModel( float x, float y, float w, float h, qhandle_t model, qhandle_t skin, vec3_t origin, vec3_t angles ) { + refdef_t refdef; + refEntity_t ent; + + if ( !cg_draw3dIcons.integer || !cg_drawIcons.integer ) { + return; + } + + CG_AdjustFrom640( &x, &y, &w, &h ); + + memset( &refdef, 0, sizeof( refdef ) ); + + memset( &ent, 0, sizeof( ent ) ); + AnglesToAxis( angles, ent.axis ); + VectorCopy( origin, ent.origin ); + ent.hModel = model; + ent.customSkin = skin; + ent.renderfx = RF_NOSHADOW; // no stencil shadows + + refdef.rdflags = RDF_NOWORLDMODEL; + + AxisClear( refdef.viewaxis ); + + refdef.fov_x = 30; + refdef.fov_y = 30; + + refdef.x = x; + refdef.y = y; + refdef.width = w; + refdef.height = h; + + refdef.time = cg.time; + + trap_R_ClearScene(); + trap_R_AddRefEntityToScene( &ent ); + trap_R_RenderScene( &refdef ); +} + +/* +================ +CG_DrawHead + +Used for both the status bar and the scoreboard +================ +*/ +void CG_DrawHead( float x, float y, float w, float h, int clientNum, vec3_t headAngles ) { + clipHandle_t cm; + clientInfo_t *ci; + float len; + vec3_t origin; + vec3_t mins, maxs; + + ci = &cgs.clientinfo[ clientNum ]; + + if ( cg_draw3dIcons.integer ) { + cm = ci->headModel; + if ( !cm ) { + return; + } + + // offset the origin y and z to center the head + trap_R_ModelBounds( cm, mins, maxs ); + + origin[2] = -0.5 * ( mins[2] + maxs[2] ); + origin[1] = 0.5 * ( mins[1] + maxs[1] ); + + // calculate distance so the head nearly fills the box + // assume heads are taller than wide + len = 0.7 * ( maxs[2] - mins[2] ); + origin[0] = len / 0.268; // len / tan( fov/2 ) + + // allow per-model tweaking + VectorAdd( origin, ci->headOffset, origin ); + + CG_Draw3DModel( x, y, w, h, ci->headModel, ci->headSkin, origin, headAngles ); + } else if ( cg_drawIcons.integer ) { + CG_DrawPic( x, y, w, h, ci->modelIcon ); + } + + // if they are deferred, draw a cross out + if ( ci->deferred ) { + CG_DrawPic( x, y, w, h, cgs.media.deferShader ); + } +} + +/* +================ +CG_DrawFlagModel + +Used for both the status bar and the scoreboard +================ +*/ +void CG_DrawFlagModel( float x, float y, float w, float h, int team, qboolean force2D ) { + qhandle_t cm; + float len; + vec3_t origin, angles; + vec3_t mins, maxs; + qhandle_t handle; + + if ( !force2D && cg_draw3dIcons.integer ) { + + VectorClear( angles ); + + cm = cgs.media.redFlagModel; + + // offset the origin y and z to center the flag + trap_R_ModelBounds( cm, mins, maxs ); + + origin[2] = -0.5 * ( mins[2] + maxs[2] ); + origin[1] = 0.5 * ( mins[1] + maxs[1] ); + + // calculate distance so the flag nearly fills the box + // assume heads are taller than wide + len = 0.5 * ( maxs[2] - mins[2] ); + origin[0] = len / 0.268; // len / tan( fov/2 ) + + angles[YAW] = 60 * sin( cg.time / 2000.0 );; + + if( team == TEAM_RED ) { + handle = cgs.media.redFlagModel; + } else if( team == TEAM_BLUE ) { + handle = cgs.media.blueFlagModel; + } else if( team == TEAM_FREE ) { + handle = cgs.media.neutralFlagModel; + } else { + return; + } + CG_Draw3DModel( x, y, w, h, handle, 0, origin, angles ); + } else if ( cg_drawIcons.integer ) { + gitem_t *item; + + if( team == TEAM_RED ) { + item = BG_FindItemForPowerup( PW_REDFLAG ); + } else if( team == TEAM_BLUE ) { + item = BG_FindItemForPowerup( PW_BLUEFLAG ); + } else if( team == TEAM_FREE ) { + item = BG_FindItemForPowerup( PW_NEUTRALFLAG ); + } else { + return; + } + if (item) { + CG_DrawPic( x, y, w, h, cg_items[ ITEM_INDEX(item) ].icon ); + } + } +} + +/* +================ +CG_DrawStatusBarHead + +================ +*/ +#ifndef MISSIONPACK + +static void CG_DrawStatusBarHead( float x ) { + vec3_t angles; + float size, stretch; + float frac; + + VectorClear( angles ); + + if ( cg.damageTime && cg.time - cg.damageTime < DAMAGE_TIME ) { + frac = (float)(cg.time - cg.damageTime ) / DAMAGE_TIME; + size = ICON_SIZE * 1.25 * ( 1.5 - frac * 0.5 ); + + stretch = size - ICON_SIZE * 1.25; + // kick in the direction of damage + x -= stretch * 0.5 + cg.damageX * stretch * 0.5; + + cg.headStartYaw = 180 + cg.damageX * 45; + + cg.headEndYaw = 180 + 20 * cos( crandom()*M_PI ); + cg.headEndPitch = 5 * cos( crandom()*M_PI ); + + cg.headStartTime = cg.time; + cg.headEndTime = cg.time + 100 + random() * 2000; + } else { + if ( cg.time >= cg.headEndTime ) { + // select a new head angle + cg.headStartYaw = cg.headEndYaw; + cg.headStartPitch = cg.headEndPitch; + cg.headStartTime = cg.headEndTime; + cg.headEndTime = cg.time + 100 + random() * 2000; + + cg.headEndYaw = 180 + 20 * cos( crandom()*M_PI ); + cg.headEndPitch = 5 * cos( crandom()*M_PI ); + } + + size = ICON_SIZE * 1.25; + } + + // if the server was frozen for a while we may have a bad head start time + if ( cg.headStartTime > cg.time ) { + cg.headStartTime = cg.time; + } + + frac = ( cg.time - cg.headStartTime ) / (float)( cg.headEndTime - cg.headStartTime ); + frac = frac * frac * ( 3 - 2 * frac ); + angles[YAW] = cg.headStartYaw + ( cg.headEndYaw - cg.headStartYaw ) * frac; + angles[PITCH] = cg.headStartPitch + ( cg.headEndPitch - cg.headStartPitch ) * frac; + + CG_DrawHead( x, 480 - size, size, size, + cg.snap->ps.clientNum, angles ); +} +#endif // MISSIONPACK + +/* +================ +CG_DrawStatusBarFlag + +================ +*/ +#ifndef MISSIONPACK +static void CG_DrawStatusBarFlag( float x, int team ) { + CG_DrawFlagModel( x, 480 - ICON_SIZE, ICON_SIZE, ICON_SIZE, team, qfalse ); +} +#endif // MISSIONPACK + +/* +================ +CG_DrawTeamBackground + +================ +*/ +void CG_DrawTeamBackground( int x, int y, int w, int h, float alpha, int team ) +{ + vec4_t hcolor; + + hcolor[3] = alpha; + if ( team == TEAM_RED ) { + hcolor[0] = 1; + hcolor[1] = 0; + hcolor[2] = 0; + } else if ( team == TEAM_BLUE ) { + hcolor[0] = 0; + hcolor[1] = 0; + hcolor[2] = 1; + } else { + return; + } + trap_R_SetColor( hcolor ); + CG_DrawPic( x, y, w, h, cgs.media.teamStatusBar ); + trap_R_SetColor( NULL ); +} + +/* +================ +CG_DrawStatusBar + +================ +*/ +#ifndef MISSIONPACK +static void CG_DrawStatusBar( void ) { + int color; + centity_t *cent; + playerState_t *ps; + int value; + vec4_t hcolor; + vec3_t angles; + vec3_t origin; +#ifdef MISSIONPACK + qhandle_t handle; +#endif + static float colors[4][4] = { +// { 0.2, 1.0, 0.2, 1.0 } , { 1.0, 0.2, 0.2, 1.0 }, {0.5, 0.5, 0.5, 1} }; + { 1.0f, 0.69f, 0.0f, 1.0f }, // normal + { 1.0f, 0.2f, 0.2f, 1.0f }, // low health + { 0.5f, 0.5f, 0.5f, 1.0f }, // weapon firing + { 1.0f, 1.0f, 1.0f, 1.0f } }; // health > 100 + + if ( cg_drawStatus.integer == 0 ) { + return; + } + + // draw the team background + CG_DrawTeamBackground( 0, 420, 640, 60, 0.33f, cg.snap->ps.persistant[PERS_TEAM] ); + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + VectorClear( angles ); + + // draw any 3D icons first, so the changes back to 2D are minimized + if ( cent->currentState.weapon && cg_weapons[ cent->currentState.weapon ].ammoModel ) { + origin[0] = 70; + origin[1] = 0; + origin[2] = 0; + angles[YAW] = 90 + 20 * sin( cg.time / 1000.0 ); + CG_Draw3DModel( CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, + cg_weapons[ cent->currentState.weapon ].ammoModel, 0, origin, angles ); + } + + CG_DrawStatusBarHead( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE ); + + if( cg.predictedPlayerState.powerups[PW_REDFLAG] ) { + CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_RED ); + } else if( cg.predictedPlayerState.powerups[PW_BLUEFLAG] ) { + CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_BLUE ); + } else if( cg.predictedPlayerState.powerups[PW_NEUTRALFLAG] ) { + CG_DrawStatusBarFlag( 185 + CHAR_WIDTH*3 + TEXT_ICON_SPACE + ICON_SIZE, TEAM_FREE ); + } + + if ( ps->stats[ STAT_ARMOR ] ) { + origin[0] = 90; + origin[1] = 0; + origin[2] = -10; + angles[YAW] = ( cg.time & 2047 ) * 360 / 2048.0; + CG_Draw3DModel( 370 + CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, + cgs.media.armorModel, 0, origin, angles ); + } +#ifdef MISSIONPACK + if( cgs.gametype == GT_HARVESTER ) { + origin[0] = 90; + origin[1] = 0; + origin[2] = -10; + angles[YAW] = ( cg.time & 2047 ) * 360 / 2048.0; + if( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) { + handle = cgs.media.redCubeModel; + } else { + handle = cgs.media.blueCubeModel; + } + CG_Draw3DModel( 640 - (TEXT_ICON_SPACE + ICON_SIZE), 416, ICON_SIZE, ICON_SIZE, handle, 0, origin, angles ); + } +#endif + // + // ammo + // + if ( cent->currentState.weapon ) { + value = ps->ammo[cent->currentState.weapon]; + if ( value > -1 ) { + if ( cg.predictedPlayerState.weaponstate == WEAPON_FIRING + && cg.predictedPlayerState.weaponTime > 100 ) { + // draw as dark grey when reloading + color = 2; // dark grey + } else { + if ( value >= 0 ) { + color = 0; // green + } else { + color = 1; // red + } + } + trap_R_SetColor( colors[color] ); + + CG_DrawField (0, 432, 3, value); + trap_R_SetColor( NULL ); + + // if we didn't draw a 3D icon, draw a 2D icon for ammo + if ( !cg_draw3dIcons.integer && cg_drawIcons.integer ) { + qhandle_t icon; + + icon = cg_weapons[ cg.predictedPlayerState.weapon ].ammoIcon; + if ( icon ) { + CG_DrawPic( CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, icon ); + } + } + } + } + + // + // health + // + value = ps->stats[STAT_HEALTH]; + if ( value > 100 ) { + trap_R_SetColor( colors[3] ); // white + } else if (value > 25) { + trap_R_SetColor( colors[0] ); // green + } else if (value > 0) { + color = (cg.time >> 8) & 1; // flash + trap_R_SetColor( colors[color] ); + } else { + trap_R_SetColor( colors[1] ); // red + } + + // stretch the health up when taking damage + CG_DrawField ( 185, 432, 3, value); + CG_ColorForHealth( hcolor ); + trap_R_SetColor( hcolor ); + + + // + // armor + // + value = ps->stats[STAT_ARMOR]; + if (value > 0 ) { + trap_R_SetColor( colors[0] ); + CG_DrawField (370, 432, 3, value); + trap_R_SetColor( NULL ); + // if we didn't draw a 3D icon, draw a 2D icon for armor + if ( !cg_draw3dIcons.integer && cg_drawIcons.integer ) { + CG_DrawPic( 370 + CHAR_WIDTH*3 + TEXT_ICON_SPACE, 432, ICON_SIZE, ICON_SIZE, cgs.media.armorIcon ); + } + + } +#ifdef MISSIONPACK + // + // cubes + // + if( cgs.gametype == GT_HARVESTER ) { + value = ps->generic1; + if( value > 99 ) { + value = 99; + } + trap_R_SetColor( colors[0] ); + CG_DrawField (640 - (CHAR_WIDTH*2 + TEXT_ICON_SPACE + ICON_SIZE), 432, 2, value); + trap_R_SetColor( NULL ); + // if we didn't draw a 3D icon, draw a 2D icon for armor + if ( !cg_draw3dIcons.integer && cg_drawIcons.integer ) { + if( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) { + handle = cgs.media.redCubeIcon; + } else { + handle = cgs.media.blueCubeIcon; + } + CG_DrawPic( 640 - (TEXT_ICON_SPACE + ICON_SIZE), 432, ICON_SIZE, ICON_SIZE, handle ); + } + } +#endif +} +#endif + +/* +=========================================================================================== + + UPPER RIGHT CORNER + +=========================================================================================== +*/ + +/* +================ +CG_DrawAttacker + +================ +*/ +static float CG_DrawAttacker( float y ) { + int t; + float size; + vec3_t angles; + const char *info; + const char *name; + int clientNum; + + if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) { + return y; + } + + if ( !cg.attackerTime ) { + return y; + } + + clientNum = cg.predictedPlayerState.persistant[PERS_ATTACKER]; + if ( clientNum < 0 || clientNum >= MAX_CLIENTS || clientNum == cg.snap->ps.clientNum ) { + return y; + } + + t = cg.time - cg.attackerTime; + if ( t > ATTACKER_HEAD_TIME ) { + cg.attackerTime = 0; + return y; + } + + size = ICON_SIZE * 1.25; + + angles[PITCH] = 0; + angles[YAW] = 180; + angles[ROLL] = 0; + CG_DrawHead( 640 - size, y, size, size, clientNum, angles ); + + info = CG_ConfigString( CS_PLAYERS + clientNum ); + name = Info_ValueForKey( info, "n" ); + y += size; + CG_DrawBigString( 640 - ( Q_PrintStrlen( name ) * BIGCHAR_WIDTH), y, name, 0.5 ); + + return y + BIGCHAR_HEIGHT + 2; +} + +/* +================== +CG_DrawSnapshot +================== +*/ +static float CG_DrawSnapshot( float y ) { + char *s; + int w; + + s = va( "time:%i snap:%i cmd:%i", cg.snap->serverTime, + cg.latestSnapshotNum, cgs.serverCommandSequence ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + + CG_DrawBigString( 635 - w, y + 2, s, 1.0F); + + return y + BIGCHAR_HEIGHT + 4; +} + +/* +================== +CG_DrawFPS +================== +*/ +#define FPS_FRAMES 4 +static float CG_DrawFPS( float y ) { + char *s; + int w; + static int previousTimes[FPS_FRAMES]; + static int index; + int i, total; + int fps; + static int previous; + int t, frameTime; + + // don't use serverTime, because that will be drifting to + // correct for internet lag changes, timescales, timedemos, etc + t = trap_Milliseconds(); + frameTime = t - previous; + previous = t; + + previousTimes[index % FPS_FRAMES] = frameTime; + index++; + if ( index > FPS_FRAMES ) { + // average multiple frames together to smooth changes out a bit + total = 0; + for ( i = 0 ; i < FPS_FRAMES ; i++ ) { + total += previousTimes[i]; + } + if ( !total ) { + total = 1; + } + fps = 1000 * FPS_FRAMES / total; + + s = va( "%ifps", fps ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + + CG_DrawBigString( 635 - w, y + 2, s, 1.0F); + } + + return y + BIGCHAR_HEIGHT + 4; +} + +/* +================= +CG_DrawTimer +================= +*/ +static float CG_DrawTimer( float y ) { + char *s; + int w; + int mins, seconds, tens; + int msec; + + msec = cg.time - cgs.levelStartTime; + + seconds = msec / 1000; + mins = seconds / 60; + seconds -= mins * 60; + tens = seconds / 10; + seconds -= tens * 10; + + s = va( "%i:%i%i", mins, tens, seconds ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + + CG_DrawBigString( 635 - w, y + 2, s, 1.0F); + + return y + BIGCHAR_HEIGHT + 4; +} + +//PKMOD - Ergodic 10/13/00 display hub voting statistics +/* +================= +CG_DrawHubOverlay +================= +*/ + +#define HUB_OVERLAY_MAXNAME_WIDTH 25 +#define HUB_OVERLAY_MAXLOCATION_WIDTH 16 + +void CG_DrawHubOverlay( void ) { + int x, h, xx; + int i, len; + vec4_t hcolor; + int pwidth; + + float y; + + y = 100; + x = 0; + + //PKMOD - Ergodic 12/16/00 - change PERS_HUB_FLAG to be first bit of PERS_PAINKILLER_COUNT + // if ( cg.snap->ps.persistant[PERS_HUB_FLAG] != 1 ) { + if ( !( cg.snap->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) ) { + return; + } + + if ( numHubInfoLines == 0 ) + return; + + // max hubinfo name width + pwidth = 0; + for (i = 0; i < numHubInfoLines; i++) { + len = CG_DrawStrlen(cgs.hubInfoDisplay[i].info); + if (len > pwidth) { + pwidth = len; + } + } + + if (pwidth > HUB_OVERLAY_MAXNAME_WIDTH) + pwidth = HUB_OVERLAY_MAXNAME_WIDTH; + +// lwidth = HUB_OVERLAY_MAXLOCATION_WIDTH; + +// w = (pwidth + lwidth + 4 + 7) * TINYCHAR_WIDTH; + + h = (3 + 2) * TINYCHAR_HEIGHT; + +// y += h; +// ret_y = y; + +// hcolor[0] = 0.2; +// hcolor[1] = 1; +// hcolor[2] = 0.2; +// hcolor[3] = 0.33; +// trap_R_SetColor( hcolor ); + +// CG_DrawPic( x, y, w, h, cgs.media.teamStatusBar ); + trap_R_SetColor( NULL ); + + xx = TINYCHAR_WIDTH; + +// hcolor[0] = hcolor[1] = hcolor[2] = hcolor[3] = 1.0; + //PKMOD - Ergodic 12/16/00 - add "(float)" to force a float declaration + hcolor[0] = (float)0.2; + hcolor[1] = (float)1; + hcolor[2] = (float)0.2; + hcolor[3] = (float)0.33; + + CG_DrawStringExt( xx, y, + "PainKeepArena Hub", hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, HUB_OVERLAY_MAXNAME_WIDTH); + + y += TINYCHAR_HEIGHT; + + CG_DrawStringExt( xx, y, + " Votes Map", hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, HUB_OVERLAY_MAXNAME_WIDTH); + + y += TINYCHAR_HEIGHT; + + //PKMOD - Ergodic 11/01/00 - update code to include the time remaining + for (i = 0; i < numHubInfoLines - 1; i++) { + + CG_DrawStringExt( xx, y, + cgs.hubInfoDisplay[i].info, hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, HUB_OVERLAY_MAXNAME_WIDTH); + + y += TINYCHAR_HEIGHT; + } + + y += TINYCHAR_HEIGHT; //add a spacer + CG_DrawStringExt( xx, y, + cgs.hubInfoDisplay[i].info, hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, HUB_OVERLAY_MAXNAME_WIDTH); + + return; +} + + + + +/* +================= +CG_DrawTeamOverlay +================= +*/ + +static float CG_DrawTeamOverlay( float y, qboolean right, qboolean upper ) { + int x, w, h, xx; + int i, j, len; + const char *p; + vec4_t hcolor; + int pwidth, lwidth; + int plyrs; + char st[16]; + clientInfo_t *ci; + gitem_t *item; + int ret_y, count; + + if ( !cg_drawTeamOverlay.integer ) { + return y; + } + + if ( cg.snap->ps.persistant[PERS_TEAM] != TEAM_RED && cg.snap->ps.persistant[PERS_TEAM] != TEAM_BLUE ) { + return y; // Not on any team + } + + plyrs = 0; + + // max player name width + pwidth = 0; + count = (numSortedTeamPlayers > 8) ? 8 : numSortedTeamPlayers; + for (i = 0; i < count; i++) { + ci = cgs.clientinfo + sortedTeamPlayers[i]; + if ( ci->infoValid && ci->team == cg.snap->ps.persistant[PERS_TEAM]) { + plyrs++; + len = CG_DrawStrlen(ci->name); + if (len > pwidth) + pwidth = len; + } + } + + if (!plyrs) + return y; + + if (pwidth > TEAM_OVERLAY_MAXNAME_WIDTH) + pwidth = TEAM_OVERLAY_MAXNAME_WIDTH; + + // max location name width + lwidth = 0; + for (i = 1; i < MAX_LOCATIONS; i++) { + p = CG_ConfigString(CS_LOCATIONS + i); + if (p && *p) { + len = CG_DrawStrlen(p); + if (len > lwidth) + lwidth = len; + } + } + + if (lwidth > TEAM_OVERLAY_MAXLOCATION_WIDTH) + lwidth = TEAM_OVERLAY_MAXLOCATION_WIDTH; + + w = (pwidth + lwidth + 4 + 7) * TINYCHAR_WIDTH; + + if ( right ) + x = 640 - w; + else + x = 0; + + h = plyrs * TINYCHAR_HEIGHT; + + if ( upper ) { + ret_y = y + h; + } else { + y -= h; + ret_y = y; + } + + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_RED ) { + hcolor[0] = 1.0f; + hcolor[1] = 0.0f; + hcolor[2] = 0.0f; + hcolor[3] = 0.33f; + } else { // if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) + hcolor[0] = 0.0f; + hcolor[1] = 0.0f; + hcolor[2] = 1.0f; + hcolor[3] = 0.33f; + } + trap_R_SetColor( hcolor ); + CG_DrawPic( x, y, w, h, cgs.media.teamStatusBar ); + trap_R_SetColor( NULL ); + + for (i = 0; i < count; i++) { + ci = cgs.clientinfo + sortedTeamPlayers[i]; + if ( ci->infoValid && ci->team == cg.snap->ps.persistant[PERS_TEAM]) { + + hcolor[0] = hcolor[1] = hcolor[2] = hcolor[3] = 1.0; + + xx = x + TINYCHAR_WIDTH; + + CG_DrawStringExt( xx, y, + ci->name, hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, TEAM_OVERLAY_MAXNAME_WIDTH); + + if (lwidth) { + p = CG_ConfigString(CS_LOCATIONS + ci->location); + if (!p || !*p) + p = "unknown"; + len = CG_DrawStrlen(p); + if (len > lwidth) + len = lwidth; + +// xx = x + TINYCHAR_WIDTH * 2 + TINYCHAR_WIDTH * pwidth + +// ((lwidth/2 - len/2) * TINYCHAR_WIDTH); + xx = x + TINYCHAR_WIDTH * 2 + TINYCHAR_WIDTH * pwidth; + CG_DrawStringExt( xx, y, + p, hcolor, qfalse, qfalse, TINYCHAR_WIDTH, TINYCHAR_HEIGHT, + TEAM_OVERLAY_MAXLOCATION_WIDTH); + } + + CG_GetColorForHealth( ci->health, ci->armor, hcolor ); + + Com_sprintf (st, sizeof(st), "%3i %3i", ci->health, ci->armor); + + xx = x + TINYCHAR_WIDTH * 3 + + TINYCHAR_WIDTH * pwidth + TINYCHAR_WIDTH * lwidth; + + CG_DrawStringExt( xx, y, + st, hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, 0 ); + + // draw weapon icon + xx += TINYCHAR_WIDTH * 3; + + if ( cg_weapons[ci->curWeapon].weaponIcon ) { + CG_DrawPic( xx, y, TINYCHAR_WIDTH, TINYCHAR_HEIGHT, + cg_weapons[ci->curWeapon].weaponIcon ); + } else { + CG_DrawPic( xx, y, TINYCHAR_WIDTH, TINYCHAR_HEIGHT, + cgs.media.deferShader ); + } + + // Draw powerup icons + if (right) { + xx = x; + } else { + xx = x + w - TINYCHAR_WIDTH; + } + for (j = 0; j <= PW_NUM_POWERUPS; j++) { + if (ci->powerups & (1 << j)) { + + item = BG_FindItemForPowerup( j ); + + if (item) { + CG_DrawPic( xx, y, TINYCHAR_WIDTH, TINYCHAR_HEIGHT, + trap_R_RegisterShader( item->icon ) ); + if (right) { + xx -= TINYCHAR_WIDTH; + } else { + xx += TINYCHAR_WIDTH; + } + } + } + } + + y += TINYCHAR_HEIGHT; + } + } + + return ret_y; +//#endif +} + + +/* +===================== +CG_DrawUpperRight + +===================== +*/ +static void CG_DrawUpperRight( void ) { + float y; + + y = 0; + + if ( cgs.gametype >= GT_TEAM && cg_drawTeamOverlay.integer == 1 ) { + y = CG_DrawTeamOverlay( y, qtrue, qtrue ); + } + if ( cg_drawSnapshot.integer ) { + y = CG_DrawSnapshot( y ); + } + if ( cg_drawFPS.integer ) { + y = CG_DrawFPS( y ); + } + if ( cg_drawTimer.integer ) { + y = CG_DrawTimer( y ); + } + if ( cg_drawAttacker.integer ) { + y = CG_DrawAttacker( y ); + } + +} + +/* +=========================================================================================== + + LOWER RIGHT CORNER + +=========================================================================================== +*/ + +/* +================= +CG_DrawScores + +Draw the small two score display +================= +*/ +#ifndef MISSIONPACK +static float CG_DrawScores( float y ) { + const char *s; + int s1, s2, score; + int x, w; + int v; + vec4_t color; + float y1; + gitem_t *item; + + s1 = cgs.scores1; + s2 = cgs.scores2; + + y -= BIGCHAR_HEIGHT + 8; + + y1 = y; + + // draw from the right side to left + if ( cgs.gametype >= GT_TEAM ) { + x = 640; + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 1.0f; + color[3] = 0.33f; + s = va( "%2i", s2 ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH + 8; + x -= w; + CG_FillRect( x, y-4, w, BIGCHAR_HEIGHT+8, color ); + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) { + CG_DrawPic( x, y-4, w, BIGCHAR_HEIGHT+8, cgs.media.selectShader ); + } + CG_DrawBigString( x + 4, y, s, 1.0F); + + if ( cgs.gametype == GT_CTF ) { + // Display flag status + item = BG_FindItemForPowerup( PW_BLUEFLAG ); + + if (item) { + y1 = y - BIGCHAR_HEIGHT - 8; + if( cgs.blueflag >= 0 && cgs.blueflag <= 2 ) { + CG_DrawPic( x, y1-4, w, BIGCHAR_HEIGHT+8, cgs.media.blueFlagShader[cgs.blueflag] ); + } + } + } + color[0] = 1.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.33f; + s = va( "%2i", s1 ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH + 8; + x -= w; + CG_FillRect( x, y-4, w, BIGCHAR_HEIGHT+8, color ); + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_RED ) { + CG_DrawPic( x, y-4, w, BIGCHAR_HEIGHT+8, cgs.media.selectShader ); + } + CG_DrawBigString( x + 4, y, s, 1.0F); + + if ( cgs.gametype == GT_CTF ) { + // Display flag status + item = BG_FindItemForPowerup( PW_REDFLAG ); + + if (item) { + y1 = y - BIGCHAR_HEIGHT - 8; + if( cgs.redflag >= 0 && cgs.redflag <= 2 ) { + CG_DrawPic( x, y1-4, w, BIGCHAR_HEIGHT+8, cgs.media.redFlagShader[cgs.redflag] ); + } + } + } + +#ifdef MISSIONPACK + if ( cgs.gametype == GT_1FCTF ) { + // Display flag status + item = BG_FindItemForPowerup( PW_NEUTRALFLAG ); + + if (item) { + y1 = y - BIGCHAR_HEIGHT - 8; + if( cgs.flagStatus >= 0 && cgs.flagStatus <= 3 ) { + CG_DrawPic( x, y1-4, w, BIGCHAR_HEIGHT+8, cgs.media.flagShader[cgs.flagStatus] ); + } + } + } +#endif + if ( cgs.gametype >= GT_CTF ) { + v = cgs.capturelimit; + } else { + v = cgs.fraglimit; + } + if ( v ) { + s = va( "%2i", v ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH + 8; + x -= w; + CG_DrawBigString( x + 4, y, s, 1.0F); + } + + } else { + qboolean spectator; + + x = 640; + score = cg.snap->ps.persistant[PERS_SCORE]; + spectator = ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR ); + + // always show your score in the second box if not in first place + if ( s1 != score ) { + s2 = score; + } + if ( s2 != SCORE_NOT_PRESENT ) { + s = va( "%2i", s2 ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH + 8; + x -= w; + if ( !spectator && score == s2 && score != s1 ) { + color[0] = 1.0f; + color[1] = 0.0f; + color[2] = 0.0f; + color[3] = 0.33f; + CG_FillRect( x, y-4, w, BIGCHAR_HEIGHT+8, color ); + CG_DrawPic( x, y-4, w, BIGCHAR_HEIGHT+8, cgs.media.selectShader ); + } else { + color[0] = 0.5f; + color[1] = 0.5f; + color[2] = 0.5f; + color[3] = 0.33f; + CG_FillRect( x, y-4, w, BIGCHAR_HEIGHT+8, color ); + } + CG_DrawBigString( x + 4, y, s, 1.0F); + } + + // first place + if ( s1 != SCORE_NOT_PRESENT ) { + s = va( "%2i", s1 ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH + 8; + x -= w; + if ( !spectator && score == s1 ) { + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 1.0f; + color[3] = 0.33f; + CG_FillRect( x, y-4, w, BIGCHAR_HEIGHT+8, color ); + CG_DrawPic( x, y-4, w, BIGCHAR_HEIGHT+8, cgs.media.selectShader ); + } else { + color[0] = 0.5f; + color[1] = 0.5f; + color[2] = 0.5f; + color[3] = 0.33f; + CG_FillRect( x, y-4, w, BIGCHAR_HEIGHT+8, color ); + } + CG_DrawBigString( x + 4, y, s, 1.0F); + } + + if ( cgs.fraglimit ) { + s = va( "%2i", cgs.fraglimit ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH + 8; + x -= w; + CG_DrawBigString( x + 4, y, s, 1.0F); + } + + } + + return y1 - 8; +} +#endif // MISSIONPACK + +/* +================ +CG_DrawPowerups +================ +*/ +#ifndef MISSIONPACK +static float CG_DrawPowerups( float y ) { + int sorted[MAX_POWERUPS]; + int sortedTime[MAX_POWERUPS]; + int i, j, k; + int active; + playerState_t *ps; + int t; + gitem_t *item; + int x; + int color; + float size; + float f; + static float colors[2][4] = { + { 0.2f, 1.0f, 0.2f, 1.0f } , + { 1.0f, 0.2f, 0.2f, 1.0f } + }; + + ps = &cg.snap->ps; + + if ( ps->stats[STAT_HEALTH] <= 0 ) { + return y; + } + + // sort the list by time remaining + active = 0; + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { + if ( !ps->powerups[ i ] ) { + continue; + } + t = ps->powerups[ i ] - cg.time; + // ZOID--don't draw if the power up has unlimited time (999 seconds) + // This is true of the CTF flags + if ( t < 0 || t > 999000) { + continue; + } + + // insert into the list + for ( j = 0 ; j < active ; j++ ) { + if ( sortedTime[j] >= t ) { + for ( k = active - 1 ; k >= j ; k-- ) { + sorted[k+1] = sorted[k]; + sortedTime[k+1] = sortedTime[k]; + } + break; + } + } + sorted[j] = i; + sortedTime[j] = t; + active++; + } + + // draw the icons and timers + x = 640 - ICON_SIZE - CHAR_WIDTH * 2; + for ( i = 0 ; i < active ; i++ ) { + + //PKMOD - Ergodic 10/24/01 - add logic for radiation holdable/powerup + if ( sorted[i] == PW_RADIATE ) { + item = BG_FindItemForHoldable( HI_RADIATE ); + } + //PKMOD - Ergodic 05/07/02 - add logic for Personal Sentry holdable/powerup + else if ( sorted[i] == PW_PERSENTRY ) { + item = BG_FindItemForHoldable( HI_PERSENTRY ); + } + else { + item = BG_FindItemForPowerup( sorted[i] ); + } + + if (item) { + + color = 1; + + y -= ICON_SIZE; + + trap_R_SetColor( colors[color] ); + CG_DrawField( x, y, 2, sortedTime[ i ] / 1000 ); + + t = ps->powerups[ sorted[i] ]; + if ( t - cg.time >= POWERUP_BLINKS * POWERUP_BLINK_TIME ) { + trap_R_SetColor( NULL ); + } else { + vec4_t modulate; + + f = (float)( t - cg.time ) / POWERUP_BLINK_TIME; + f -= (int)f; + modulate[0] = modulate[1] = modulate[2] = modulate[3] = f; + trap_R_SetColor( modulate ); + } + + if ( cg.powerupActive == sorted[i] && + cg.time - cg.powerupTime < PULSE_TIME ) { + f = 1.0 - ( ( (float)cg.time - cg.powerupTime ) / PULSE_TIME ); + size = ICON_SIZE * ( 1.0 + ( PULSE_SCALE - 1.0 ) * f ); + } else { + size = ICON_SIZE; + } + + CG_DrawPic( 640 - size, y + ICON_SIZE / 2 - size / 2, + size, size, trap_R_RegisterShader( item->icon ) ); + } + } + trap_R_SetColor( NULL ); + + return y; +} +#endif // MISSIONPACK + +/* +===================== +CG_DrawLowerRight + +===================== +*/ +#ifndef MISSIONPACK +static void CG_DrawLowerRight( void ) { + float y; + + y = 480 - ICON_SIZE; + + if ( cgs.gametype >= GT_TEAM && cg_drawTeamOverlay.integer == 2 ) { + y = CG_DrawTeamOverlay( y, qtrue, qfalse ); + } + + y = CG_DrawScores( y ); + y = CG_DrawPowerups( y ); +} +#endif // MISSIONPACK + +/* +=================== +CG_DrawPickupItem +=================== +*/ +#ifndef MISSIONPACK +static int CG_DrawPickupItem( int y ) { + int value; + float *fadeColor; + + if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) { + return y; + } + + y -= ICON_SIZE; + + value = cg.itemPickup; + if ( value ) { + fadeColor = CG_FadeColor( cg.itemPickupTime, 3000 ); + if ( fadeColor ) { + CG_RegisterItemVisuals( value ); + trap_R_SetColor( fadeColor ); + CG_DrawPic( 8, y, ICON_SIZE, ICON_SIZE, cg_items[ value ].icon ); + CG_DrawBigString( ICON_SIZE + 16, y + (ICON_SIZE/2 - BIGCHAR_HEIGHT/2), bg_itemlist[ value ].pickup_name, fadeColor[0] ); + trap_R_SetColor( NULL ); + } + } + + return y; +} +#endif // MISSIONPACK + +/* +===================== +CG_DrawLowerLeft + +===================== +*/ +#ifndef MISSIONPACK +static void CG_DrawLowerLeft( void ) { + float y; + + y = 480 - ICON_SIZE; + + if ( cgs.gametype >= GT_TEAM && cg_drawTeamOverlay.integer == 3 ) { + y = CG_DrawTeamOverlay( y, qfalse, qfalse ); + } + + + y = CG_DrawPickupItem( y ); +} +#endif // MISSIONPACK + + +//=========================================================================================== + +/* +================= +CG_DrawTeamInfo +================= +*/ +#ifndef MISSIONPACK +static void CG_DrawTeamInfo( void ) { + int w, h; + int i, len; + vec4_t hcolor; + int chatHeight; + +#define CHATLOC_Y 420 // bottom end +#define CHATLOC_X 0 + + if (cg_teamChatHeight.integer < TEAMCHAT_HEIGHT) + chatHeight = cg_teamChatHeight.integer; + else + chatHeight = TEAMCHAT_HEIGHT; + if (chatHeight <= 0) + return; // disabled + + if (cgs.teamLastChatPos != cgs.teamChatPos) { + if (cg.time - cgs.teamChatMsgTimes[cgs.teamLastChatPos % chatHeight] > cg_teamChatTime.integer) { + cgs.teamLastChatPos++; + } + + h = (cgs.teamChatPos - cgs.teamLastChatPos) * TINYCHAR_HEIGHT; + + w = 0; + + for (i = cgs.teamLastChatPos; i < cgs.teamChatPos; i++) { + len = CG_DrawStrlen(cgs.teamChatMsgs[i % chatHeight]); + if (len > w) + w = len; + } + w *= TINYCHAR_WIDTH; + w += TINYCHAR_WIDTH * 2; + + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_RED ) { + hcolor[0] = 1.0f; + hcolor[1] = 0.0f; + hcolor[2] = 0.0f; + hcolor[3] = 0.33f; + } else if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) { + hcolor[0] = 0.0f; + hcolor[1] = 0.0f; + hcolor[2] = 1.0f; + hcolor[3] = 0.33f; + } else { + hcolor[0] = 0.0f; + hcolor[1] = 1.0f; + hcolor[2] = 0.0f; + hcolor[3] = 0.33f; + } + + trap_R_SetColor( hcolor ); + CG_DrawPic( CHATLOC_X, CHATLOC_Y - h, 640, h, cgs.media.teamStatusBar ); + trap_R_SetColor( NULL ); + + hcolor[0] = hcolor[1] = hcolor[2] = 1.0f; + hcolor[3] = 1.0f; + + for (i = cgs.teamChatPos - 1; i >= cgs.teamLastChatPos; i--) { + CG_DrawStringExt( CHATLOC_X + TINYCHAR_WIDTH, + CHATLOC_Y - (cgs.teamChatPos - i)*TINYCHAR_HEIGHT, + cgs.teamChatMsgs[i % chatHeight], hcolor, qfalse, qfalse, + TINYCHAR_WIDTH, TINYCHAR_HEIGHT, 0 ); + } + } +} +#endif // MISSIONPACK + +/* +=================== +CG_DrawHoldableItem +=================== +*/ +//PKMOD - Ergodic 05/11/01 - allow holding of more than 1 type of +// holdable but only 1 of each kind +// Display holdables along the right edge of the screen +static void CG_DrawHoldableItem( void ) { + int i; + int holdable_index; + int y; + +// value = cg.snap->ps.stats[STAT_HOLDABLE_ITEM]; +// CG_RegisterItemVisuals( value ); + + if ( cg.snap->ps.stats[STAT_HOLDABLE_ITEM] ) { + //PKMOD - Ergodic 10/13/01 - move holdable icons higher up on the screen + // change start height from 1/2 to 1/4 from top of screen + // y = (SCREEN_HEIGHT-ICON_SIZE_SMALL)/2; + y = (SCREEN_HEIGHT-ICON_SIZE_SMALL)/4; + holdable_index = cg.snap->ps.stats[STAT_ACTIVE_HOLDABLE]; + for (i = 1; i < HI_NUM_HOLDABLE; i++) { + if ( cg.snap->ps.stats[STAT_HOLDABLE_ITEM] & ( 1 << holdable_index ) ) { + //PKMOD - Ergodic 12/07/01 - display Private Bot pieces as only one Icon + if ( ( holdable_index < HI_BOTLEGS ) || ( holdable_index > HI_BOTHEAD )) { + //only display valid holdables + if ( holdable_index < HI_NUM_HOLDABLE ) { + CG_RegisterItemVisuals( cg_holdable[holdable_index] ); + CG_DrawPic( 640-ICON_SIZE, y, ICON_SIZE_SMALL, ICON_SIZE_SMALL, cg_items[ cg_holdable[holdable_index] ].icon ); + } + //get next y offset + y += 1.2 * ICON_SIZE_SMALL; + } + } + //PKMOD - Ergodic 12/07/01 - now at end of Private Bot pieces list - then display + if ( holdable_index == HI_BOTHEAD ) { + //PKMOD - Ergodic 12/07/01 - hold private bot parts + int pribot_parts; + qhandle_t pribotIcon; + + pribot_parts = cg.snap->ps.stats[STAT_HOLDABLE_ITEM] & ( 7 << HI_BOTLEGS ); + if ( pribot_parts ) { + //encoding bits (LEGS TORSO HEAD) + switch ( pribot_parts >> HI_BOTLEGS ) { + case 1: + pribotIcon = cgs.media.pkapribot_100Icon; + break; + case 2: + pribotIcon = cgs.media.pkapribot_010Icon; + break; + case 3: + pribotIcon = cgs.media.pkapribot_110Icon; + break; + case 4: + pribotIcon = cgs.media.pkapribot_001Icon; + break; + case 5: + pribotIcon = cgs.media.pkapribot_101Icon; + break; + case 6: + pribotIcon = cgs.media.pkapribot_011Icon; + break; + case 7: + pribotIcon = cgs.media.pkapribot_111Icon; + break; + } + CG_DrawPic( 640-ICON_SIZE, y, ICON_SIZE_SMALL, ICON_SIZE_SMALL, pribotIcon ); + //get next y offset + y += 1.2 * ICON_SIZE_SMALL; + } + } + + //set next index, wrap around if at the end of the list + holdable_index = holdable_index + 1; + if ( holdable_index >= HI_NUM_HOLDABLE ) + holdable_index = 1; + + } + } + +} + +#ifdef MISSIONPACK +/* +=================== +CG_DrawPersistantPowerup +=================== +*/ +#if 0 // sos001208 - DEAD +static void CG_DrawPersistantPowerup( void ) { + int value; + + value = cg.snap->ps.stats[STAT_PERSISTANT_POWERUP]; + if ( value ) { + CG_RegisterItemVisuals( value ); + CG_DrawPic( 640-ICON_SIZE, (SCREEN_HEIGHT-ICON_SIZE)/2 - ICON_SIZE, ICON_SIZE, ICON_SIZE, cg_items[ value ].icon ); + } +} +#endif +#endif // MISSIONPACK + + +/* +=================== +CG_DrawReward +=================== +*/ +static void CG_DrawReward( void ) { + float *color; + int i, count; + float x, y; + char buf[32]; + + if ( !cg_drawRewards.integer ) { + return; + } + + color = CG_FadeColor( cg.rewardTime, REWARD_TIME ); + if ( !color ) { + if (cg.rewardStack > 0) { + for(i = 0; i < cg.rewardStack; i++) { + cg.rewardSound[i] = cg.rewardSound[i+1]; + cg.rewardShader[i] = cg.rewardShader[i+1]; + cg.rewardCount[i] = cg.rewardCount[i+1]; + } + cg.rewardTime = cg.time; + cg.rewardStack--; + color = CG_FadeColor( cg.rewardTime, REWARD_TIME ); + trap_S_StartLocalSound(cg.rewardSound[0], CHAN_ANNOUNCER); + } else { + return; + } + } + + trap_R_SetColor( color ); + + /* + count = cg.rewardCount[0]/10; // number of big rewards to draw + + if (count) { + y = 4; + x = 320 - count * ICON_SIZE; + for ( i = 0 ; i < count ; i++ ) { + CG_DrawPic( x, y, (ICON_SIZE*2)-4, (ICON_SIZE*2)-4, cg.rewardShader[0] ); + x += (ICON_SIZE*2); + } + } + + count = cg.rewardCount[0] - count*10; // number of small rewards to draw + */ + + if ( cg.rewardCount[0] >= 10 ) { + y = 56; + x = 320 - ICON_SIZE/2; + CG_DrawPic( x, y, ICON_SIZE-4, ICON_SIZE-4, cg.rewardShader[0] ); + Com_sprintf(buf, sizeof(buf), "%d", cg.rewardCount[0]); + x = ( SCREEN_WIDTH - SMALLCHAR_WIDTH * CG_DrawStrlen( buf ) ) / 2; + CG_DrawStringExt( x, y+ICON_SIZE, buf, color, qfalse, qtrue, + SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); + } + else { + + count = cg.rewardCount[0]; + + y = 56; + x = 320 - count * ICON_SIZE/2; + for ( i = 0 ; i < count ; i++ ) { + CG_DrawPic( x, y, ICON_SIZE-4, ICON_SIZE-4, cg.rewardShader[0] ); + x += ICON_SIZE; + } + } + trap_R_SetColor( NULL ); +} + + +/* +=============================================================================== + +LAGOMETER + +=============================================================================== +*/ + +#define LAG_SAMPLES 128 + + +typedef struct { + int frameSamples[LAG_SAMPLES]; + int frameCount; + int snapshotFlags[LAG_SAMPLES]; + int snapshotSamples[LAG_SAMPLES]; + int snapshotCount; +} lagometer_t; + +lagometer_t lagometer; + +/* +============== +CG_AddLagometerFrameInfo + +Adds the current interpolate / extrapolate bar for this frame +============== +*/ +void CG_AddLagometerFrameInfo( void ) { + int offset; + + offset = cg.time - cg.latestSnapshotTime; + lagometer.frameSamples[ lagometer.frameCount & ( LAG_SAMPLES - 1) ] = offset; + lagometer.frameCount++; +} + +/* +============== +CG_AddLagometerSnapshotInfo + +Each time a snapshot is received, log its ping time and +the number of snapshots that were dropped before it. + +Pass NULL for a dropped packet. +============== +*/ +void CG_AddLagometerSnapshotInfo( snapshot_t *snap ) { + // dropped packet + if ( !snap ) { + lagometer.snapshotSamples[ lagometer.snapshotCount & ( LAG_SAMPLES - 1) ] = -1; + lagometer.snapshotCount++; + return; + } + + // add this snapshot's info + lagometer.snapshotSamples[ lagometer.snapshotCount & ( LAG_SAMPLES - 1) ] = snap->ping; + lagometer.snapshotFlags[ lagometer.snapshotCount & ( LAG_SAMPLES - 1) ] = snap->snapFlags; + lagometer.snapshotCount++; +} + +/* +============== +CG_DrawDisconnect + +Should we draw something differnet for long lag vs no packets? +============== +*/ +static void CG_DrawDisconnect( void ) { + float x, y; + int cmdNum; + usercmd_t cmd; + const char *s; + int w; // bk010215 - FIXME char message[1024]; + + // draw the phone jack if we are completely past our buffers + cmdNum = trap_GetCurrentCmdNumber() - CMD_BACKUP + 1; + trap_GetUserCmd( cmdNum, &cmd ); + if ( cmd.serverTime <= cg.snap->ps.commandTime + || cmd.serverTime > cg.time ) { // special check for map_restart // bk 0102165 - FIXME + return; + } + + // also add text in center of screen + s = "Connection Interrupted"; // bk 010215 - FIXME + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + CG_DrawBigString( 320 - w/2, 100, s, 1.0F); + + // blink the icon + if ( ( cg.time >> 9 ) & 1 ) { + return; + } + + //PKMOD - Ergodic 03/15/04 - Draw jack to overlay the lagometer + // which was moved higher up on the screen so it will not be in the way of the PKA HUD + //x = 640 - 48; + //y = 480 - 48; + x = 640 - 48; + y = 480 - 108; //03/15/04 - was "480 - 48" + + + CG_DrawPic( x, y, 48, 48, trap_R_RegisterShader("gfx/2d/net.tga" ) ); +} + + +#define MAX_LAGOMETER_PING 900 +#define MAX_LAGOMETER_RANGE 300 + +/* +============== +CG_DrawLagometer +============== +*/ +static void CG_DrawLagometer( void ) { + int a, x, y, i; + float v; + float ax, ay, aw, ah, mid, range; + int color; + float vscale; + + if ( !cg_lagometer.integer || cgs.localServer ) { + CG_DrawDisconnect(); + return; + } + + // + // draw the graph + // +#ifdef MISSIONPACK + x = 640 - 48; + y = 480 - 144; +#else +//PKMOD - Ergodic 02/27/04 - Draw lagometer higher up on the screen so it will not be in the way of the PKA HUD + x = 640 - 48; + y = 480 - 108; //02/27/04 - was "480 - 48" +#endif + + trap_R_SetColor( NULL ); + CG_DrawPic( x, y, 48, 48, cgs.media.lagometerShader ); + + ax = x; + ay = y; + aw = 48; + ah = 48; + CG_AdjustFrom640( &ax, &ay, &aw, &ah ); + + color = -1; + range = ah / 3; + mid = ay + range; + + vscale = range / MAX_LAGOMETER_RANGE; + + // draw the frame interpoalte / extrapolate graph + for ( a = 0 ; a < aw ; a++ ) { + i = ( lagometer.frameCount - 1 - a ) & (LAG_SAMPLES - 1); + v = lagometer.frameSamples[i]; + v *= vscale; + if ( v > 0 ) { + if ( color != 1 ) { + color = 1; + trap_R_SetColor( g_color_table[ColorIndex(COLOR_YELLOW)] ); + } + if ( v > range ) { + v = range; + } + trap_R_DrawStretchPic ( ax + aw - a, mid - v, 1, v, 0, 0, 0, 0, cgs.media.whiteShader ); + } else if ( v < 0 ) { + if ( color != 2 ) { + color = 2; + trap_R_SetColor( g_color_table[ColorIndex(COLOR_BLUE)] ); + } + v = -v; + if ( v > range ) { + v = range; + } + trap_R_DrawStretchPic( ax + aw - a, mid, 1, v, 0, 0, 0, 0, cgs.media.whiteShader ); + } + } + + // draw the snapshot latency / drop graph + range = ah / 2; + vscale = range / MAX_LAGOMETER_PING; + + for ( a = 0 ; a < aw ; a++ ) { + i = ( lagometer.snapshotCount - 1 - a ) & (LAG_SAMPLES - 1); + v = lagometer.snapshotSamples[i]; + if ( v > 0 ) { + if ( lagometer.snapshotFlags[i] & SNAPFLAG_RATE_DELAYED ) { + if ( color != 5 ) { + color = 5; // YELLOW for rate delay + trap_R_SetColor( g_color_table[ColorIndex(COLOR_YELLOW)] ); + } + } else { + if ( color != 3 ) { + color = 3; + trap_R_SetColor( g_color_table[ColorIndex(COLOR_GREEN)] ); + } + } + v = v * vscale; + if ( v > range ) { + v = range; + } + trap_R_DrawStretchPic( ax + aw - a, ay + ah - v, 1, v, 0, 0, 0, 0, cgs.media.whiteShader ); + } else if ( v < 0 ) { + if ( color != 4 ) { + color = 4; // RED for dropped snapshots + trap_R_SetColor( g_color_table[ColorIndex(COLOR_RED)] ); + } + trap_R_DrawStretchPic( ax + aw - a, ay + ah - range, 1, range, 0, 0, 0, 0, cgs.media.whiteShader ); + } + } + + trap_R_SetColor( NULL ); + + if ( cg_nopredict.integer || cg_synchronousClients.integer ) { + CG_DrawBigString( ax, ay, "snc", 1.0 ); + } + + CG_DrawDisconnect(); +} + + + +/* +=============================================================================== + +CENTER PRINTING + +=============================================================================== +*/ + + +/* +============== +CG_CenterPrint + +Called for important messages that should stay in the center of the screen +for a few moments +============== +*/ +void CG_CenterPrint( const char *str, int y, int charWidth ) { + char *s; + + Q_strncpyz( cg.centerPrint, str, sizeof(cg.centerPrint) ); + + cg.centerPrintTime = cg.time; + cg.centerPrintY = y; + cg.centerPrintCharWidth = charWidth; + + // count the number of lines for centering + cg.centerPrintLines = 1; + s = cg.centerPrint; + while( *s ) { + if (*s == '\n') + cg.centerPrintLines++; + s++; + } +} + + +/* +=================== +CG_DrawCenterString +=================== +*/ +static void CG_DrawCenterString( void ) { + char *start; + int l; + int x, y, w; +#ifdef MISSIONPACK // bk010221 - unused else + int h; +#endif + float *color; + + if ( !cg.centerPrintTime ) { + return; + } + + color = CG_FadeColor( cg.centerPrintTime, 1000 * cg_centertime.value ); + if ( !color ) { + return; + } + + trap_R_SetColor( color ); + + start = cg.centerPrint; + + y = cg.centerPrintY - cg.centerPrintLines * BIGCHAR_HEIGHT / 2; + + while ( 1 ) { + char linebuffer[1024]; + + for ( l = 0; l < 50; l++ ) { + if ( !start[l] || start[l] == '\n' ) { + break; + } + linebuffer[l] = start[l]; + } + linebuffer[l] = 0; + +#ifdef MISSIONPACK + w = CG_Text_Width(linebuffer, 0.5, 0); + h = CG_Text_Height(linebuffer, 0.5, 0); + x = (SCREEN_WIDTH - w) / 2; + CG_Text_Paint(x, y + h, 0.5, color, linebuffer, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE); + y += h + 6; +#else + w = cg.centerPrintCharWidth * CG_DrawStrlen( linebuffer ); + + x = ( SCREEN_WIDTH - w ) / 2; + + CG_DrawStringExt( x, y, linebuffer, color, qfalse, qtrue, + cg.centerPrintCharWidth, (int)(cg.centerPrintCharWidth * 1.5), 0 ); + + y += cg.centerPrintCharWidth * 1.5; +#endif + while ( *start && ( *start != '\n' ) ) { + start++; + } + if ( !*start ) { + break; + } + start++; + } + + trap_R_SetColor( NULL ); +} + + + +/* +================================================================================ + +CROSSHAIR + +================================================================================ +*/ + + +/* +================= +CG_DrawCrosshair +================= +*/ +static void CG_DrawCrosshair(void) { + float w, h; + qhandle_t hShader; + float f; + float x, y; + int ca; + + if ( !cg_drawCrosshair.integer ) { + return; + } + + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR) { + return; + } + + if ( cg.renderingThirdPerson ) { + return; + } + + // set color based on health + if ( cg_crosshairHealth.integer ) { + vec4_t hcolor; + + CG_ColorForHealth( hcolor ); + trap_R_SetColor( hcolor ); + } else { + trap_R_SetColor( NULL ); + } + + w = h = cg_crosshairSize.value; + + // pulse the size of the crosshair when picking up items + f = cg.time - cg.itemPickupBlendTime; + if ( f > 0 && f < ITEM_BLOB_TIME ) { + f /= ITEM_BLOB_TIME; + w *= ( 1 + f ); + h *= ( 1 + f ); + } + + x = cg_crosshairX.integer; + y = cg_crosshairY.integer; + CG_AdjustFrom640( &x, &y, &w, &h ); + + ca = cg_drawCrosshair.integer; + if (ca < 0) { + ca = 0; + } + hShader = cgs.media.crosshairShader[ ca % NUM_CROSSHAIRS ]; + + trap_R_DrawStretchPic( x + cg.refdef.x + 0.5 * (cg.refdef.width - w), + y + cg.refdef.y + 0.5 * (cg.refdef.height - h), + w, h, 0, 0, 1, 1, hShader ); +} + + + +/* +================= +CG_ScanForCrosshairEntity +================= +*/ +static void CG_ScanForCrosshairEntity( void ) { + trace_t trace; + vec3_t start, end; + int content; + + VectorCopy( cg.refdef.vieworg, start ); + VectorMA( start, 131072, cg.refdef.viewaxis[0], end ); + + CG_Trace( &trace, start, vec3_origin, vec3_origin, end, + cg.snap->ps.clientNum, CONTENTS_SOLID|CONTENTS_BODY ); + if ( trace.entityNum >= MAX_CLIENTS ) { + return; + } + + // if the player is in fog, don't show it + content = trap_CM_PointContents( trace.endpos, 0 ); + if ( content & CONTENTS_FOG ) { + return; + } + + // if the player is invisible, don't show it + if ( cg_entities[ trace.entityNum ].currentState.powerups & ( 1 << PW_INVIS ) ) { + return; + } + + // update the fade timer + cg.crosshairClientNum = trace.entityNum; + cg.crosshairClientTime = cg.time; +} + + +/* +===================== +CG_DrawCrosshairNames +===================== +*/ +static void CG_DrawCrosshairNames( void ) { + float *color; + char *name; + float w; + + if ( !cg_drawCrosshair.integer ) { + return; + } + if ( !cg_drawCrosshairNames.integer ) { + return; + } + if ( cg.renderingThirdPerson ) { + return; + } + + // scan the known entities to see if the crosshair is sighted on one + CG_ScanForCrosshairEntity(); + + // draw the name of the player being looked at + color = CG_FadeColor( cg.crosshairClientTime, 1000 ); + if ( !color ) { + trap_R_SetColor( NULL ); + return; + } + + name = cgs.clientinfo[ cg.crosshairClientNum ].name; +#ifdef MISSIONPACK + color[3] *= 0.5f; + w = CG_Text_Width(name, 0.3f, 0); + CG_Text_Paint( 320 - w / 2, 190, 0.3f, color, name, 0, 0, ITEM_TEXTSTYLE_SHADOWED); +#else + w = CG_DrawStrlen( name ) * BIGCHAR_WIDTH; + CG_DrawBigString( 320 - w / 2, 170, name, color[3] * 0.5f ); +#endif + trap_R_SetColor( NULL ); +} + + +//============================================================================== + +/* +================= +CG_DrawSpectator +================= +*/ +static void CG_DrawSpectator(void) { + CG_DrawBigString(320 - 9 * 8, 440, "SPECTATOR", 1.0F); + if ( cgs.gametype == GT_TOURNAMENT ) { + CG_DrawBigString(320 - 15 * 8, 460, "waiting to play", 1.0F); + } + else if ( cgs.gametype >= GT_TEAM ) { + CG_DrawBigString(320 - 39 * 8, 460, "press ESC and use the JOIN menu to play", 1.0F); + } +} + +/* +================= +CG_DrawVote +================= +*/ +static void CG_DrawVote(void) { + char *s; + int sec; + + if ( !cgs.voteTime ) { + return; + } + + // play a talk beep whenever it is modified + if ( cgs.voteModified ) { + cgs.voteModified = qfalse; + trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); + } + + sec = ( VOTE_TIME - ( cg.time - cgs.voteTime ) ) / 1000; + if ( sec < 0 ) { + sec = 0; + } +#ifdef MISSIONPACK + s = va("VOTE(%i):%s yes:%i no:%i", sec, cgs.voteString, cgs.voteYes, cgs.voteNo); + CG_DrawSmallString( 0, 58, s, 1.0F ); + s = "or press ESC then click Vote"; + CG_DrawSmallString( 0, 58 + SMALLCHAR_HEIGHT + 2, s, 1.0F ); +#else + s = va("VOTE(%i):%s yes:%i no:%i", sec, cgs.voteString, cgs.voteYes, cgs.voteNo ); + CG_DrawSmallString( 0, 58, s, 1.0F ); +#endif +} + +/* +================= +CG_DrawTeamVote +================= +*/ +static void CG_DrawTeamVote(void) { + char *s; + int sec, cs_offset; + + if ( cgs.clientinfo->team == TEAM_RED ) + cs_offset = 0; + else if ( cgs.clientinfo->team == TEAM_BLUE ) + cs_offset = 1; + else + return; + + if ( !cgs.teamVoteTime[cs_offset] ) { + return; + } + + // play a talk beep whenever it is modified + if ( cgs.teamVoteModified[cs_offset] ) { + cgs.teamVoteModified[cs_offset] = qfalse; + trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); + } + + sec = ( VOTE_TIME - ( cg.time - cgs.teamVoteTime[cs_offset] ) ) / 1000; + if ( sec < 0 ) { + sec = 0; + } + s = va("TEAMVOTE(%i):%s yes:%i no:%i", sec, cgs.teamVoteString[cs_offset], + cgs.teamVoteYes[cs_offset], cgs.teamVoteNo[cs_offset] ); + CG_DrawSmallString( 0, 90, s, 1.0F ); +} + + +static qboolean CG_DrawScoreboard() { +//PKMOD - Ergodic 02/23/04 - enable HUD based scoreboard +//#ifdef MISSIONPACK + static qboolean firstTime = qtrue; + float fade, *fadeColor; + + if (menuScoreboard) { + menuScoreboard->window.flags &= ~WINDOW_FORCED; + } + if (cg_paused.integer) { + cg.deferredPlayerLoading = 0; + firstTime = qtrue; + return qfalse; + } + + // should never happen in Team Arena + if (cgs.gametype == GT_SINGLE_PLAYER && cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { + cg.deferredPlayerLoading = 0; + firstTime = qtrue; + return qfalse; + } + + // don't draw scoreboard during death while warmup up + if ( cg.warmup && !cg.showScores ) { + return qfalse; + } + + if ( cg.showScores || cg.predictedPlayerState.pm_type == PM_DEAD || cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { + fade = 1.0; + fadeColor = colorWhite; + } else { + fadeColor = CG_FadeColor( cg.scoreFadeTime, FADE_TIME ); + if ( !fadeColor ) { + // next time scoreboard comes up, don't print killer + cg.deferredPlayerLoading = 0; + cg.killerName[0] = 0; + firstTime = qtrue; + return qfalse; + } + fade = *fadeColor; + } + + + if (menuScoreboard == NULL) { + if ( cgs.gametype >= GT_TEAM ) { + menuScoreboard = Menus_FindByName("teamscore_menu"); + } else { + menuScoreboard = Menus_FindByName("score_menu"); + } + } + + if (menuScoreboard) { + if (firstTime) { + CG_SetScoreSelection(menuScoreboard); + firstTime = qfalse; + } + Menu_Paint(menuScoreboard, qtrue); + } + + // load any models that have been deferred + if ( ++cg.deferredPlayerLoading > 10 ) { + CG_LoadDeferredPlayers(); + } + + return qtrue; +//PKMOD - Ergodic 02/23/04 - enable HUD based scoreboard +//#else +// return CG_DrawOldScoreboard(); +//#endif +} + +/* +================= +CG_DrawIntermission +================= +*/ +static void CG_DrawIntermission( void ) { +// int key; +#ifdef MISSIONPACK + //if (cg_singlePlayer.integer) { + // CG_DrawCenterString(); + // return; + //} +#else + if ( cgs.gametype == GT_SINGLE_PLAYER ) { + CG_DrawCenterString(); + return; + } +#endif + cg.scoreFadeTime = cg.time; + cg.scoreBoardShowing = CG_DrawScoreboard(); +} + +/* +================= +CG_DrawFollow +================= +*/ +static qboolean CG_DrawFollow( void ) { + float x; + vec4_t color; + const char *name; + + if ( !(cg.snap->ps.pm_flags & PMF_FOLLOW) ) { + return qfalse; + } + color[0] = 1; + color[1] = 1; + color[2] = 1; + color[3] = 1; + + + CG_DrawBigString( 320 - 9 * 8, 24, "following", 1.0F ); + + name = cgs.clientinfo[ cg.snap->ps.clientNum ].name; + + x = 0.5 * ( 640 - GIANT_WIDTH * CG_DrawStrlen( name ) ); + + CG_DrawStringExt( x, 40, name, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + + return qtrue; +} + + + +/* +================= +CG_DrawAmmoWarning +================= +*/ +static void CG_DrawAmmoWarning( void ) { + const char *s; + int w; + + if ( cg_drawAmmoWarning.integer == 0 ) { + return; + } + + if ( !cg.lowAmmoWarning ) { + return; + } + + if ( cg.lowAmmoWarning == 2 ) { + + //PKMOD - Ergodic 01/04/04 - Don't display message in the hub + const char *info; + char *mapname; + info = CG_ConfigString( CS_SERVERINFO ); + mapname = Info_ValueForKey( info, "mapname" ); + if ( !strcmp( mapname, "hub_30" ) ) { + return; + } + if ( !strcmp( mapname, "hub" ) ) { + return; + } + + s = "OUT OF AMMO"; + } else { + s = "LOW AMMO WARNING"; + } + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + CG_DrawBigString(320 - w / 2, 64, s, 1.0F); +} + + +#ifdef MISSIONPACK +/* +================= +CG_DrawProxWarning +================= +*/ +static void CG_DrawProxWarning( void ) { + char s [32]; + int w; + static int proxTime; + static int proxCounter; + static int proxTick; + + if( !(cg.snap->ps.eFlags & EF_TICKING ) ) { + proxTime = 0; + return; + } + + if (proxTime == 0) { + proxTime = cg.time + 5000; + proxCounter = 5; + proxTick = 0; + } + + if (cg.time > proxTime) { + proxTick = proxCounter--; + proxTime = cg.time + 1000; + } + + if (proxTick != 0) { + Com_sprintf(s, sizeof(s), "INTERNAL COMBUSTION IN: %i", proxTick); + } else { + Com_sprintf(s, sizeof(s), "YOU HAVE BEEN MINED"); + } + + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + CG_DrawBigStringColor( 320 - w / 2, 64 + BIGCHAR_HEIGHT, s, g_color_table[ColorIndex(COLOR_RED)] ); +} +#endif + + +/* +================= +CG_DrawWarmup +================= +*/ +static void CG_DrawWarmup( void ) { + int w; + int sec; + int i; + float scale; + clientInfo_t *ci1, *ci2; + int cw; + const char *s; + + sec = cg.warmup; + if ( !sec ) { + return; + } + + if ( sec < 0 ) { + s = "Waiting for players"; + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + CG_DrawBigString(320 - w / 2, 24, s, 1.0F); + cg.warmupCount = 0; + return; + } + + if (cgs.gametype == GT_TOURNAMENT) { + // find the two active players + ci1 = NULL; + ci2 = NULL; + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + if ( cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_FREE ) { + if ( !ci1 ) { + ci1 = &cgs.clientinfo[i]; + } else { + ci2 = &cgs.clientinfo[i]; + } + } + } + + if ( ci1 && ci2 ) { + s = va( "%s vs %s", ci1->name, ci2->name ); +#ifdef MISSIONPACK + w = CG_Text_Width(s, 0.6f, 0); + CG_Text_Paint(320 - w / 2, 60, 0.6f, colorWhite, s, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE); +#else + w = CG_DrawStrlen( s ); + if ( w > 640 / GIANT_WIDTH ) { + cw = 640 / w; + } else { + cw = GIANT_WIDTH; + } + CG_DrawStringExt( 320 - w * cw/2, 20,s, colorWhite, + qfalse, qtrue, cw, (int)(cw * 1.5f), 0 ); +#endif + } + } else { + if ( cgs.gametype == GT_FFA ) { + s = "Free For All"; + } else if ( cgs.gametype == GT_TEAM ) { + s = "Team Deathmatch"; + } else if ( cgs.gametype == GT_CTF ) { + s = "Capture the Flag"; +#ifdef MISSIONPACK + } else if ( cgs.gametype == GT_1FCTF ) { + s = "One Flag CTF"; + } else if ( cgs.gametype == GT_OBELISK ) { + s = "Overload"; + } else if ( cgs.gametype == GT_HARVESTER ) { + s = "Harvester"; +#endif + } else { + s = ""; + } +#ifdef MISSIONPACK + w = CG_Text_Width(s, 0.6f, 0); + CG_Text_Paint(320 - w / 2, 90, 0.6f, colorWhite, s, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE); +#else + w = CG_DrawStrlen( s ); + if ( w > 640 / GIANT_WIDTH ) { + cw = 640 / w; + } else { + cw = GIANT_WIDTH; + } + CG_DrawStringExt( 320 - w * cw/2, 25,s, colorWhite, + qfalse, qtrue, cw, (int)(cw * 1.1f), 0 ); +#endif + } + + sec = ( sec - cg.time ) / 1000; + if ( sec < 0 ) { + cg.warmup = 0; + sec = 0; + } + s = va( "Starts in: %i", sec + 1 ); + if ( sec != cg.warmupCount ) { + cg.warmupCount = sec; + switch ( sec ) { + case 0: + trap_S_StartLocalSound( cgs.media.count1Sound, CHAN_ANNOUNCER ); + break; + case 1: + trap_S_StartLocalSound( cgs.media.count2Sound, CHAN_ANNOUNCER ); + break; + case 2: + trap_S_StartLocalSound( cgs.media.count3Sound, CHAN_ANNOUNCER ); + break; + default: + break; + } + } + scale = 0.45f; + switch ( cg.warmupCount ) { + case 0: + cw = 28; + scale = 0.54f; + break; + case 1: + cw = 24; + scale = 0.51f; + break; + case 2: + cw = 20; + scale = 0.48f; + break; + default: + cw = 16; + scale = 0.45f; + break; + } + +#ifdef MISSIONPACK + w = CG_Text_Width(s, scale, 0); + CG_Text_Paint(320 - w / 2, 125, scale, colorWhite, s, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE); +#else + w = CG_DrawStrlen( s ); + CG_DrawStringExt( 320 - w * cw/2, 70, s, colorWhite, + qfalse, qtrue, cw, (int)(cw * 1.5), 0 ); +#endif +} + +//================================================================================== +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +//#ifdef MISSIONPACK +/* +================= +CG_DrawTimedMenus +================= +*/ +void CG_DrawTimedMenus() { + if (cg.voiceTime) { + int t = cg.time - cg.voiceTime; + if ( t > 2500 ) { + Menus_CloseByName("voiceMenu"); + trap_Cvar_Set("cl_conXOffset", "0"); + cg.voiceTime = 0; + } + } +} +//#endif //Ergodic 02/01/04 + +// +/* +================= +CG_Draw2D +================= +*/ +static void CG_Draw2D( void ) { +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +//#ifdef MISSIONPACK + if (cgs.orderPending && cg.time > cgs.orderTime) { + CG_CheckOrderPending(); + } +//#endif //PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD + + // if we are taking a levelshot for the menu, don't draw anything + if ( cg.levelShot ) { + return; + } + + if ( cg_draw2D.integer == 0 ) { + return; + } + + if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { + CG_DrawIntermission(); + return; + } + +/* + if (cg.cameraMode) { + return; + } +*/ + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR ) { + CG_DrawSpectator(); + CG_DrawCrosshair(); + CG_DrawCrosshairNames(); + } else { + // don't draw any status if dead or the scoreboard is being explicitly shown + if ( !cg.showScores && cg.snap->ps.stats[STAT_HEALTH] > 0 ) { + +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +//#ifdef MISSIONPACK + if ( cg_drawStatus.integer ) { + Menu_PaintAll(); + CG_DrawTimedMenus(); + } +//#else //Ergodic 02/01/04 +// CG_DrawStatusBar(); +//#endif //Ergodic 02/01/04 + + CG_DrawAmmoWarning(); + +#ifdef MISSIONPACK + CG_DrawProxWarning(); +#endif + CG_DrawCrosshair(); + CG_DrawCrosshairNames(); + CG_DrawWeaponSelect(); + +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +//#ifndef MISSIONPACK + CG_DrawHoldableItem(); +//#else //PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD + //CG_DrawPersistantPowerup(); +//#endif //PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD + CG_DrawReward(); + } + +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +// if ( cgs.gametype >= GT_TEAM ) { +//#ifndef MISSIONPACK +// CG_DrawTeamInfo(); +//#endif +// } + } + + CG_DrawVote(); + CG_DrawTeamVote(); + + CG_DrawLagometer(); + +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +//#ifdef MISSIONPACK + if (!cg_paused.integer) { + CG_DrawUpperRight(); + } +//#else //PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +// CG_DrawUpperRight(); +//#endif //PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD + + +//PKMOD - Ergodic 02/01/04 - Enable Dynamic HUD +//#ifndef MISSIONPACK +// CG_DrawLowerRight(); +// CG_DrawLowerLeft(); +//#endif + + //PKMOD - Ergodic 10/13/00 - Draw hub info + CG_DrawHubOverlay(); + + if ( !CG_DrawFollow() ) { + CG_DrawWarmup(); + } + + // don't draw center string if scoreboard is up + cg.scoreBoardShowing = CG_DrawScoreboard(); + if ( !cg.scoreBoardShowing) { + CG_DrawCenterString(); + } +} + + +static void CG_DrawTourneyScoreboard() { +#ifdef MISSIONPACK +#else + CG_DrawOldTourneyScoreboard(); +#endif +} + +/* +===================== +CG_DrawActive + +Perform all drawing needed to completely fill the screen +===================== +*/ +void CG_DrawActive( stereoFrame_t stereoView ) { + float separation; + vec3_t baseOrg; + + // optionally draw the info screen instead + if ( !cg.snap ) { + CG_DrawInformation(); + return; + } + + // optionally draw the tournement scoreboard instead + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR && + ( cg.snap->ps.pm_flags & PMF_SCOREBOARD ) ) { + CG_DrawTourneyScoreboard(); + return; + } + + switch ( stereoView ) { + case STEREO_CENTER: + separation = 0; + break; + case STEREO_LEFT: + separation = -cg_stereoSeparation.value / 2; + break; + case STEREO_RIGHT: + separation = cg_stereoSeparation.value / 2; + break; + default: + separation = 0; + CG_Error( "CG_DrawActive: Undefined stereoView" ); + } + + + // clear around the rendered view if sized down + CG_TileClear(); + + // offset vieworg appropriately if we're doing stereo separation + VectorCopy( cg.refdef.vieworg, baseOrg ); + if ( separation != 0 ) { + VectorMA( cg.refdef.vieworg, -separation, cg.refdef.viewaxis[1], cg.refdef.vieworg ); + } + + // draw 3D view + trap_R_RenderScene( &cg.refdef ); + + // restore original viewpoint if running stereo + if ( separation != 0 ) { + VectorCopy( baseOrg, cg.refdef.vieworg ); + } + + // draw status bar and other floating elements + CG_Draw2D(); +} + +//PKMOD - Ergodic 09/24/00 - Display Entity Voting Information +/* +================= +CG_DrawVoting +================= +*/ +static void CG_DrawVoting( void ) { + if ( cgs.gametype == GT_SINGLE_PLAYER ) { + CG_DrawCenterString(); + return; + } + + cg.scoreFadeTime = cg.time; + CG_DrawScoreboard(); +} + + diff --git a/quake3/source/code/cgame/cg_drawtools.c b/quake3/source/code/cgame/cg_drawtools.c new file mode 100644 index 0000000..b5bd26f --- /dev/null +++ b/quake3/source/code/cgame/cg_drawtools.c @@ -0,0 +1,944 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_drawtools.c -- helper functions called by cg_draw, cg_scoreboard, cg_info, etc +#include "cg_local.h" + +/* +================ +CG_AdjustFrom640 + +Adjusted for resolution and screen aspect ratio +================ +*/ +void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) { +#if 0 + // adjust for wide screens + if ( cgs.glconfig.vidWidth * 480 > cgs.glconfig.vidHeight * 640 ) { + *x += 0.5 * ( cgs.glconfig.vidWidth - ( cgs.glconfig.vidHeight * 640 / 480 ) ); + } +#endif + // scale for screen sizes + *x *= cgs.screenXScale; + *y *= cgs.screenYScale; + *w *= cgs.screenXScale; + *h *= cgs.screenYScale; +} + +/* +================ +CG_FillRect + +Coordinates are 640*480 virtual values +================= +*/ +void CG_FillRect( float x, float y, float width, float height, const float *color ) { + trap_R_SetColor( color ); + + CG_AdjustFrom640( &x, &y, &width, &height ); + trap_R_DrawStretchPic( x, y, width, height, 0, 0, 0, 0, cgs.media.whiteShader ); + + trap_R_SetColor( NULL ); +} + +/* +================ +CG_DrawSides + +Coords are virtual 640x480 +================ +*/ +void CG_DrawSides(float x, float y, float w, float h, float size) { + CG_AdjustFrom640( &x, &y, &w, &h ); + size *= cgs.screenXScale; + trap_R_DrawStretchPic( x, y, size, h, 0, 0, 0, 0, cgs.media.whiteShader ); + trap_R_DrawStretchPic( x + w - size, y, size, h, 0, 0, 0, 0, cgs.media.whiteShader ); +} + +void CG_DrawTopBottom(float x, float y, float w, float h, float size) { + CG_AdjustFrom640( &x, &y, &w, &h ); + size *= cgs.screenYScale; + trap_R_DrawStretchPic( x, y, w, size, 0, 0, 0, 0, cgs.media.whiteShader ); + trap_R_DrawStretchPic( x, y + h - size, w, size, 0, 0, 0, 0, cgs.media.whiteShader ); +} +/* +================ +UI_DrawRect + +Coordinates are 640*480 virtual values +================= +*/ +void CG_DrawRect( float x, float y, float width, float height, float size, const float *color ) { + trap_R_SetColor( color ); + + CG_DrawTopBottom(x, y, width, height, size); + CG_DrawSides(x, y, width, height, size); + + trap_R_SetColor( NULL ); +} + + + +/* +================ +CG_DrawPic + +Coordinates are 640*480 virtual values +================= +*/ +void CG_DrawPic( float x, float y, float width, float height, qhandle_t hShader ) { + + CG_AdjustFrom640( &x, &y, &width, &height ); + trap_R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, hShader ); +} + + + +/* +=============== +CG_DrawChar + +Coordinates and size in 640*480 virtual screen size +=============== +*/ +void CG_DrawChar( int x, int y, int width, int height, int ch ) { + int row, col; + float frow, fcol; + float size; + float ax, ay, aw, ah; + + ch &= 255; + + if ( ch == ' ' ) { + return; + } + + ax = x; + ay = y; + aw = width; + ah = height; + CG_AdjustFrom640( &ax, &ay, &aw, &ah ); + + row = ch>>4; + col = ch&15; + + frow = row*0.0625; + fcol = col*0.0625; + size = 0.0625; + + trap_R_DrawStretchPic( ax, ay, aw, ah, + fcol, frow, + fcol + size, frow + size, + cgs.media.charsetShader ); +} + + +/* +================== +CG_DrawStringExt + +Draws a multi-colored string with a drop shadow, optionally forcing +to a fixed color. + +Coordinates are at 640 by 480 virtual resolution +================== +*/ +void CG_DrawStringExt( int x, int y, const char *string, const float *setColor, + qboolean forceColor, qboolean shadow, int charWidth, int charHeight, int maxChars ) { + vec4_t color; + const char *s; + int xx; + int cnt; + + if (maxChars <= 0) + maxChars = 32767; // do them all! + + // draw the drop shadow + if (shadow) { + color[0] = color[1] = color[2] = 0; + color[3] = setColor[3]; + trap_R_SetColor( color ); + s = string; + xx = x; + cnt = 0; + while ( *s && cnt < maxChars) { + if ( Q_IsColorString( s ) ) { + s += 2; + continue; + } + CG_DrawChar( xx + 2, y + 2, charWidth, charHeight, *s ); + cnt++; + xx += charWidth; + s++; + } + } + + // draw the colored text + s = string; + xx = x; + cnt = 0; + trap_R_SetColor( setColor ); + while ( *s && cnt < maxChars) { + if ( Q_IsColorString( s ) ) { + if ( !forceColor ) { + memcpy( color, g_color_table[ColorIndex(*(s+1))], sizeof( color ) ); + color[3] = setColor[3]; + trap_R_SetColor( color ); + } + s += 2; + continue; + } + CG_DrawChar( xx, y, charWidth, charHeight, *s ); + xx += charWidth; + cnt++; + s++; + } + trap_R_SetColor( NULL ); +} + +void CG_DrawBigString( int x, int y, const char *s, float alpha ) { + float color[4]; + + color[0] = color[1] = color[2] = 1.0; + color[3] = alpha; + CG_DrawStringExt( x, y, s, color, qfalse, qtrue, BIGCHAR_WIDTH, BIGCHAR_HEIGHT, 0 ); +} + +void CG_DrawBigStringColor( int x, int y, const char *s, vec4_t color ) { + CG_DrawStringExt( x, y, s, color, qtrue, qtrue, BIGCHAR_WIDTH, BIGCHAR_HEIGHT, 0 ); +} + +void CG_DrawSmallString( int x, int y, const char *s, float alpha ) { + float color[4]; + + color[0] = color[1] = color[2] = 1.0; + color[3] = alpha; + CG_DrawStringExt( x, y, s, color, qfalse, qfalse, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); +} + +void CG_DrawSmallStringColor( int x, int y, const char *s, vec4_t color ) { + CG_DrawStringExt( x, y, s, color, qtrue, qfalse, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); +} + +/* +================= +CG_DrawStrlen + +Returns character count, skiping color escape codes +================= +*/ +int CG_DrawStrlen( const char *str ) { + const char *s = str; + int count = 0; + + while ( *s ) { + if ( Q_IsColorString( s ) ) { + s += 2; + } else { + count++; + s++; + } + } + + return count; +} + +/* +============= +CG_TileClearBox + +This repeats a 64*64 tile graphic to fill the screen around a sized down +refresh window. +============= +*/ +static void CG_TileClearBox( int x, int y, int w, int h, qhandle_t hShader ) { + float s1, t1, s2, t2; + + s1 = x/64.0; + t1 = y/64.0; + s2 = (x+w)/64.0; + t2 = (y+h)/64.0; + trap_R_DrawStretchPic( x, y, w, h, s1, t1, s2, t2, hShader ); +} + + + +/* +============== +CG_TileClear + +Clear around a sized down screen +============== +*/ +void CG_TileClear( void ) { + int top, bottom, left, right; + int w, h; + + w = cgs.glconfig.vidWidth; + h = cgs.glconfig.vidHeight; + + if ( cg.refdef.x == 0 && cg.refdef.y == 0 && + cg.refdef.width == w && cg.refdef.height == h ) { + return; // full screen rendering + } + + top = cg.refdef.y; + bottom = top + cg.refdef.height-1; + left = cg.refdef.x; + right = left + cg.refdef.width-1; + + // clear above view screen + CG_TileClearBox( 0, 0, w, top, cgs.media.backTileShader ); + + // clear below view screen + CG_TileClearBox( 0, bottom, w, h - bottom, cgs.media.backTileShader ); + + // clear left of view screen + CG_TileClearBox( 0, top, left, bottom - top + 1, cgs.media.backTileShader ); + + // clear right of view screen + CG_TileClearBox( right, top, w - right, bottom - top + 1, cgs.media.backTileShader ); +} + + + +/* +================ +CG_FadeColor +================ +*/ +float *CG_FadeColor( int startMsec, int totalMsec ) { + static vec4_t color; + int t; + + if ( startMsec == 0 ) { + return NULL; + } + + t = cg.time - startMsec; + + if ( t >= totalMsec ) { + return NULL; + } + + // fade out + if ( totalMsec - t < FADE_TIME ) { + color[3] = ( totalMsec - t ) * 1.0/FADE_TIME; + } else { + color[3] = 1.0; + } + color[0] = color[1] = color[2] = 1; + + return color; +} + + +/* +================ +CG_TeamColor +================ +*/ +float *CG_TeamColor( int team ) { + static vec4_t red = {1, 0.2f, 0.2f, 1}; + static vec4_t blue = {0.2f, 0.2f, 1, 1}; + static vec4_t other = {1, 1, 1, 1}; + static vec4_t spectator = {0.7f, 0.7f, 0.7f, 1}; + + switch ( team ) { + case TEAM_RED: + return red; + case TEAM_BLUE: + return blue; + case TEAM_SPECTATOR: + return spectator; + default: + return other; + } +} + + + +/* +================= +CG_GetColorForHealth +================= +*/ +void CG_GetColorForHealth( int health, int armor, vec4_t hcolor ) { + int count; + int max; + + // calculate the total points of damage that can + // be sustained at the current health / armor level + if ( health <= 0 ) { + VectorClear( hcolor ); // black + hcolor[3] = 1; + return; + } + count = armor; + max = health * ARMOR_PROTECTION / ( 1.0 - ARMOR_PROTECTION ); + if ( max < count ) { + count = max; + } + health += count; + + // set the color based on health + hcolor[0] = 1.0; + hcolor[3] = 1.0; + if ( health >= 100 ) { + hcolor[2] = 1.0; + } else if ( health < 66 ) { + hcolor[2] = 0; + } else { + hcolor[2] = ( health - 66 ) / 33.0; + } + + if ( health > 60 ) { + hcolor[1] = 1.0; + } else if ( health < 30 ) { + hcolor[1] = 0; + } else { + hcolor[1] = ( health - 30 ) / 30.0; + } +} + +/* +================= +CG_ColorForHealth +================= +*/ +void CG_ColorForHealth( vec4_t hcolor ) { + + CG_GetColorForHealth( cg.snap->ps.stats[STAT_HEALTH], + cg.snap->ps.stats[STAT_ARMOR], hcolor ); +} + + + + +// bk001205 - code below duplicated in q3_ui/ui-atoms.c +// bk001205 - FIXME: does this belong in ui_shared.c? +// bk001205 - FIXME: HARD_LINKED flags not visible here +#ifndef Q3_STATIC // bk001205 - q_shared defines not visible here +/* +================= +UI_DrawProportionalString2 +================= +*/ +static int propMap[128][3] = { +{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, +{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, + +{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, +{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1}, + +{0, 0, PROP_SPACE_WIDTH}, // SPACE +/* PKMOD - Ergodic 02/26/01 - original font locations +{11, 122, 7}, // ! +{154, 181, 14}, // " +{55, 122, 17}, // # +{79, 122, 18}, // $ +{101, 122, 23}, // % +{153, 122, 18}, // & +{9, 93, 7}, // ' +{207, 122, 8}, // ( +{230, 122, 9}, // ) +{177, 122, 18}, // * +{30, 152, 18}, // + +{85, 181, 7}, // , +{34, 93, 11}, // - +{110, 181, 6}, // . +{130, 152, 14}, // / + +{22, 64, 17}, // 0 +{41, 64, 12}, // 1 +{58, 64, 17}, // 2 +{78, 64, 18}, // 3 +{98, 64, 19}, // 4 +{120, 64, 18}, // 5 +{141, 64, 18}, // 6 +{204, 64, 16}, // 7 +{162, 64, 17}, // 8 +{182, 64, 18}, // 9 +{59, 181, 7}, // : +{35,181, 7}, // ; +{203, 152, 14}, // < +{56, 93, 14}, // = +{228, 152, 14}, // > +{177, 181, 18}, // ? + +{28, 122, 22}, // @ +{5, 4, 18}, // A +{27, 4, 18}, // B +{48, 4, 18}, // C +{69, 4, 17}, // D +{90, 4, 13}, // E +{106, 4, 13}, // F +{121, 4, 18}, // G +{143, 4, 17}, // H +{164, 4, 8}, // I +{175, 4, 16}, // J +{195, 4, 18}, // K +{216, 4, 12}, // L +{230, 4, 23}, // M +{6, 34, 18}, // N +{27, 34, 18}, // O + +{48, 34, 18}, // P +{68, 34, 18}, // Q +{90, 34, 17}, // R +{110, 34, 18}, // S +{130, 34, 14}, // T +{146, 34, 18}, // U +{166, 34, 19}, // V +{185, 34, 29}, // W +{215, 34, 18}, // X +{234, 34, 18}, // Y +{5, 64, 14}, // Z +{60, 152, 7}, // [ +{106, 151, 13}, // '\' +{83, 152, 7}, // ] +{128, 122, 17}, // ^ +{4, 152, 21}, // _ + +{134, 181, 5}, // ' +{5, 4, 18}, // A +{27, 4, 18}, // B +{48, 4, 18}, // C +{69, 4, 17}, // D +{90, 4, 13}, // E +{106, 4, 13}, // F +{121, 4, 18}, // G +{143, 4, 17}, // H +{164, 4, 8}, // I +{175, 4, 16}, // J +{195, 4, 18}, // K +{216, 4, 12}, // L +{230, 4, 23}, // M +{6, 34, 18}, // N +{27, 34, 18}, // O + +{48, 34, 18}, // P +{68, 34, 18}, // Q +{90, 34, 17}, // R +{110, 34, 18}, // S +{130, 34, 14}, // T +{146, 34, 18}, // U +{166, 34, 19}, // V +{185, 34, 29}, // W +{215, 34, 18}, // X +{234, 34, 18}, // Y +{5, 64, 14}, // Z +{153, 152, 13}, // { +{11, 181, 5}, // | +{180, 152, 13}, // } +{79, 93, 17}, // ~ +{0, 0, -1} // DEL +*/ +{35, 134, 6}, // ! (ck) +{193, 92, 10}, // " (ck) +{47, 135, 21}, // # (ck) +{27, 221, 10}, // $ (ck) +{90, 134, 29}, // % (ck) +{144, 135, 19}, // & (ck) +{80, 134, 4}, // ' (ck) +{195, 134, 8}, // ( (ck) +{182, 134, 8}, // ) (ck) +{167, 129, 11}, // * (ck) +{48, 177, 20}, // + (ck) +{156, 181, 6}, // , (ck) +{226, 93, 6}, // - (ck) +{165, 176, 6}, // . (ck) //06/11/01 was {165, 177, 6} +{117, 176, 11}, // / (ck) +{10, 92, 19}, // 0 +{34, 92, 4}, // 1 +{43, 92, 14}, // 2 +{61, 92, 13}, // 3 +{80, 92, 16}, // 4 +{97, 92, 14}, // 5 (bump up 1 unit) +{113, 92, 14}, // 6 +{132, 92, 12}, // 7 +{148, 92, 14}, // 8 +{168, 92, 14}, // 9 (bump up 1 unit) +{147, 181, 6}, // : (ck) +{138, 181, 6}, // ; (ck) +{117, 219, 18}, // < (ck) +{209, 134, 19}, // = (ck) +{140, 219, 18}, // > (ck) +{173, 177, 12}, // ? (ck) +{48, 224, 27}, // @ (ck) +{9, 8, 18}, // A +{34, 8, 12}, // B +{52, 8, 18}, // C +{75, 8, 16}, // D +{94, 8, 11}, // E +{108, 8, 11}, // F +{122, 8, 17}, // G +{143, 8, 13}, // H +{161, 8, 5}, // I +{169, 8, 13}, // J +{187, 8, 14}, // K +{206, 8, 12}, // L +{221, 8, 24}, // M +{11, 50, 15}, // N +{29, 50, 21}, // O +{57, 50, 13}, // P +{75, 50, 22}, // Q +{101, 50, 12}, // R (bump up 1 unit) +{119, 50, 13}, // S +{133, 50, 16}, // T +{151, 50, 14}, // U +{171, 50, 16}, // V +{190, 176, 21}, // W +{192, 50, 13}, // X +{209, 50, 17}, // Y +{229, 50, 11}, // Z +{82, 177, 7}, // [ (ck) +{98, 176, 10}, // '\' (ck) +{71, 177, 7}, // ] (ck) +{124, 134, 15}, // ^ (ck) +{27, 181, 19}, // _ (ck) +{80, 134, 4}, // ` (ck) + +{9, 8, 18}, // A +{34, 8, 12}, // B +{52, 8, 18}, // C +{75, 8, 16}, // D +{94, 8, 11}, // E +{108, 8, 11}, // F +{122, 8, 17}, // G +{143, 8, 13}, // H +{161, 8, 5}, // I +{169, 8, 13}, // J +{187, 8, 14}, // K +{206, 8, 12}, // L +{221, 8, 24}, // M +{11, 50, 15}, // N +{29, 50, 21}, // O +{57, 50, 13}, // P +{75, 50, 22}, // Q +{101, 50, 12}, // R (bump up 1 unit) +{119, 50, 13}, // S +{133, 50, 16}, // T +{151, 50, 14}, // U +{171, 50, 16}, // V +{190, 176, 21}, // W +{192, 50, 13}, // X +{209, 50, 17}, // Y +{229, 50, 11}, // Z +{84, 224, 8}, // { (ck) +{17, 221, 2}, // | (ck) +{102, 224, 8}, // } (ck) +{12, 134, 19}, // ~ (ck) +{0, 0, -1} // DEL +}; + +static int propMapB[26][3] = { +/* PKMOD - Ergodic 02/26/01 - original font locations +{11, 12, 33}, +{49, 12, 31}, +{85, 12, 31}, +{120, 12, 30}, +{156, 12, 21}, +{183, 12, 21}, +{207, 12, 32}, + +{13, 55, 30}, +{49, 55, 13}, +{66, 55, 29}, +{101, 55, 31}, +{135, 55, 21}, +{158, 55, 40}, +{204, 55, 32}, + +{12, 97, 31}, +{48, 97, 31}, +{82, 97, 30}, +{118, 97, 30}, +{153, 97, 30}, +{185, 97, 25}, +{213, 97, 30}, + +{11, 139, 32}, +{42, 139, 51}, +{93, 139, 32}, +{126, 139, 31}, +{158, 139, 25}, +*/ +{25, 25, 31}, //A +{64, 25, 22}, //B +{93, 25, 30}, //C +{131, 25, 27}, //D +{164, 25, 18}, //E +{187, 25, 19}, //F + +{27, 79, 28}, //G +{60, 79, 23}, //H +{91, 79, 8}, //I +{102, 79, 22}, //J +{133, 79, 23}, //K +{164, 79, 20}, //L +{197, 79, 40}, //M + +{28, 133, 26}, //N +{59, 133, 36}, //O +{105, 133, 22}, //P +{134, 133, 37}, //Q +{177, 133, 21}, //R +{206, 133, 22}, //S + +{25, 187, 28}, //T +{56, 187, 23}, //U +{87, 187, 27}, //V +{121, 187, 35}, //W +{163, 187, 22}, //X +{192, 187, 28}, //Y +{225, 187, 19}, //Z + +}; + +#define PROPB_GAP_WIDTH 4 +#define PROPB_SPACE_WIDTH 12 +#define PROPB_HEIGHT 36 + +/* +================= +UI_DrawBannerString +================= +*/ +static void UI_DrawBannerString2( int x, int y, const char* str, vec4_t color ) +{ + const char* s; + unsigned char ch; // bk001204 : array subscript + float ax; + float ay; + float aw; + float ah; + float frow; + float fcol; + float fwidth; + float fheight; + + // draw the colored text + trap_R_SetColor( color ); + + ax = x * cgs.screenXScale + cgs.screenXBias; + ay = y * cgs.screenXScale; + + s = str; + while ( *s ) + { + ch = *s & 127; + if ( ch == ' ' ) { + ax += ((float)PROPB_SPACE_WIDTH + (float)PROPB_GAP_WIDTH)* cgs.screenXScale; + } + else if ( ch >= 'A' && ch <= 'Z' ) { + ch -= 'A'; + fcol = (float)propMapB[ch][0] / 256.0f; + frow = (float)propMapB[ch][1] / 256.0f; + fwidth = (float)propMapB[ch][2] / 256.0f; + fheight = (float)PROPB_HEIGHT / 256.0f; + aw = (float)propMapB[ch][2] * cgs.screenXScale; + ah = (float)PROPB_HEIGHT * cgs.screenXScale; + trap_R_DrawStretchPic( ax, ay, aw, ah, fcol, frow, fcol+fwidth, frow+fheight, cgs.media.charsetPropB ); + ax += (aw + (float)PROPB_GAP_WIDTH * cgs.screenXScale); + } + s++; + } + + trap_R_SetColor( NULL ); +} + +void UI_DrawBannerString( int x, int y, const char* str, int style, vec4_t color ) { + const char * s; + int ch; + int width; + vec4_t drawcolor; + + // find the width of the drawn text + s = str; + width = 0; + while ( *s ) { + ch = *s; + if ( ch == ' ' ) { + width += PROPB_SPACE_WIDTH; + } + else if ( ch >= 'A' && ch <= 'Z' ) { + width += propMapB[ch - 'A'][2] + PROPB_GAP_WIDTH; + } + s++; + } + width -= PROPB_GAP_WIDTH; + + switch( style & UI_FORMATMASK ) { + case UI_CENTER: + x -= width / 2; + break; + + case UI_RIGHT: + x -= width; + break; + + case UI_LEFT: + default: + break; + } + + if ( style & UI_DROPSHADOW ) { + drawcolor[0] = drawcolor[1] = drawcolor[2] = 0; + drawcolor[3] = color[3]; + UI_DrawBannerString2( x+2, y+2, str, drawcolor ); + } + + UI_DrawBannerString2( x, y, str, color ); +} + + +int UI_ProportionalStringWidth( const char* str ) { + const char * s; + int ch; + int charWidth; + int width; + + s = str; + width = 0; + while ( *s ) { + ch = *s & 127; + charWidth = propMap[ch][2]; + if ( charWidth != -1 ) { + width += charWidth; + width += PROP_GAP_WIDTH; + } + s++; + } + + width -= PROP_GAP_WIDTH; + return width; +} + +static void UI_DrawProportionalString2( int x, int y, const char* str, vec4_t color, float sizeScale, qhandle_t charset ) +{ + const char* s; + unsigned char ch; // bk001204 - unsigned + float ax; + float ay; + float aw; + float ah; + float frow; + float fcol; + float fwidth; + float fheight; + + // draw the colored text + trap_R_SetColor( color ); + + ax = x * cgs.screenXScale + cgs.screenXBias; + ay = y * cgs.screenXScale; + + s = str; + while ( *s ) + { + ch = *s & 127; + if ( ch == ' ' ) { + aw = (float)PROP_SPACE_WIDTH * cgs.screenXScale * sizeScale; + } else if ( propMap[ch][2] != -1 ) { + fcol = (float)propMap[ch][0] / 256.0f; + frow = (float)propMap[ch][1] / 256.0f; + fwidth = (float)propMap[ch][2] / 256.0f; + fheight = (float)PROP_HEIGHT / 256.0f; + aw = (float)propMap[ch][2] * cgs.screenXScale * sizeScale; + ah = (float)PROP_HEIGHT * cgs.screenXScale * sizeScale; + trap_R_DrawStretchPic( ax, ay, aw, ah, fcol, frow, fcol+fwidth, frow+fheight, charset ); + } else { + aw = 0; + } + + ax += (aw + (float)PROP_GAP_WIDTH * cgs.screenXScale * sizeScale); + s++; + } + + trap_R_SetColor( NULL ); +} + +/* +================= +UI_ProportionalSizeScale +================= +*/ +float UI_ProportionalSizeScale( int style ) { +//PKMOD - Ergodic 11/27/01 - add new font sizes "smaller" and "micro" + if( style & UI_SMALLFONT ) { + return 0.75; + } + + if( style & UI_PKA_SMALLERFONT ) { + return (float) PROP_PKA_SMALLER_SIZE_SCALE; + } + + if( style & UI_PKA_MICROFONT ) { + return (float) PROP_PKA_MICRO_SIZE_SCALE; + } + + return 1.00; +} + + +/* +================= +UI_DrawProportionalString +================= +*/ +void UI_DrawProportionalString( int x, int y, const char* str, int style, vec4_t color ) { + vec4_t drawcolor; + int width; + float sizeScale; + + sizeScale = UI_ProportionalSizeScale( style ); + + switch( style & UI_FORMATMASK ) { + case UI_CENTER: + width = UI_ProportionalStringWidth( str ) * sizeScale; + x -= width / 2; + break; + + case UI_RIGHT: + width = UI_ProportionalStringWidth( str ) * sizeScale; + x -= width; + break; + + case UI_LEFT: + default: + break; + } + + if ( style & UI_DROPSHADOW ) { + drawcolor[0] = drawcolor[1] = drawcolor[2] = 0; + drawcolor[3] = color[3]; + UI_DrawProportionalString2( x+2, y+2, str, drawcolor, sizeScale, cgs.media.charsetProp ); + } + + if ( style & UI_INVERSE ) { + drawcolor[0] = color[0] * 0.8; + drawcolor[1] = color[1] * 0.8; + drawcolor[2] = color[2] * 0.8; + drawcolor[3] = color[3]; + UI_DrawProportionalString2( x, y, str, drawcolor, sizeScale, cgs.media.charsetProp ); + return; + } + + if ( style & UI_PULSE ) { + drawcolor[0] = color[0] * 0.8; + drawcolor[1] = color[1] * 0.8; + drawcolor[2] = color[2] * 0.8; + drawcolor[3] = color[3]; + UI_DrawProportionalString2( x, y, str, color, sizeScale, cgs.media.charsetProp ); + + drawcolor[0] = color[0]; + drawcolor[1] = color[1]; + drawcolor[2] = color[2]; + drawcolor[3] = 0.5 + 0.5 * sin( cg.time / PULSE_DIVISOR ); + UI_DrawProportionalString2( x, y, str, drawcolor, sizeScale, cgs.media.charsetPropGlow ); + return; + } + + UI_DrawProportionalString2( x, y, str, color, sizeScale, cgs.media.charsetProp ); +} +#endif // Q3STATIC diff --git a/quake3/source/code/cgame/cg_effects.c b/quake3/source/code/cgame/cg_effects.c new file mode 100644 index 0000000..9883500 --- /dev/null +++ b/quake3/source/code/cgame/cg_effects.c @@ -0,0 +1,1401 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_effects.c -- these functions generate localentities, usually as a result +// of event processing + +#include "cg_local.h" + + +/* +================== +CG_BubbleTrail + +Bullets shot underwater +================== +*/ +void CG_BubbleTrail( vec3_t start, vec3_t end, float spacing ) { + vec3_t move; + vec3_t vec; + float len; + int i; + + if ( cg_noProjectileTrail.integer ) { + return; + } + + VectorCopy (start, move); + VectorSubtract (end, start, vec); + len = VectorNormalize (vec); + + // advance a random amount first + i = rand() % (int)spacing; + VectorMA( move, i, vec, move ); + + VectorScale (vec, spacing, vec); + + for ( ; i < len; i += spacing ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + le->leFlags = LEF_PUFF_DONT_SCALE; + le->leType = LE_MOVE_SCALE_FADE; + le->startTime = cg.time; + le->endTime = cg.time + 1000 + random() * 250; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + re = &le->refEntity; + re->shaderTime = cg.time / 1000.0f; + + re->reType = RT_SPRITE; + re->rotation = 0; + re->radius = 3; + re->customShader = cgs.media.waterBubbleShader; + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + re->shaderRGBA[3] = 0xff; + + le->color[3] = 1.0; + + le->pos.trType = TR_LINEAR; + le->pos.trTime = cg.time; + VectorCopy( move, le->pos.trBase ); + le->pos.trDelta[0] = crandom()*5; + le->pos.trDelta[1] = crandom()*5; + le->pos.trDelta[2] = crandom()*5 + 6; + + VectorAdd (move, vec, move); + } +} + +/* +===================== +CG_SmokePuff + +Adds a smoke puff or blood trail localEntity. +===================== +*/ +localEntity_t *CG_SmokePuff( const vec3_t p, const vec3_t vel, + float radius, + float r, float g, float b, float a, + float duration, + int startTime, + int fadeInTime, + int leFlags, + qhandle_t hShader ) { + static int seed = 0x92; + localEntity_t *le; + refEntity_t *re; +// int fadeInTime = startTime + duration / 2; + + le = CG_AllocLocalEntity(); + le->leFlags = leFlags; + le->radius = radius; + + re = &le->refEntity; + re->rotation = Q_random( &seed ) * 360; + re->radius = radius; + re->shaderTime = startTime / 1000.0f; + + le->leType = LE_MOVE_SCALE_FADE; + le->startTime = startTime; + le->fadeInTime = fadeInTime; + le->endTime = startTime + duration; + if ( fadeInTime > startTime ) { + le->lifeRate = 1.0 / ( le->endTime - le->fadeInTime ); + } + else { + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + } + le->color[0] = r; + le->color[1] = g; + le->color[2] = b; + le->color[3] = a; + + + le->pos.trType = TR_LINEAR; + le->pos.trTime = startTime; + VectorCopy( vel, le->pos.trDelta ); + VectorCopy( p, le->pos.trBase ); + + VectorCopy( p, re->origin ); + re->customShader = hShader; + + // rage pro can't alpha fade, so use a different shader + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) { + re->customShader = cgs.media.smokePuffRageProShader; + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + re->shaderRGBA[3] = 0xff; + } else { + re->shaderRGBA[0] = le->color[0] * 0xff; + re->shaderRGBA[1] = le->color[1] * 0xff; + re->shaderRGBA[2] = le->color[2] * 0xff; + re->shaderRGBA[3] = 0xff; + } + + re->reType = RT_SPRITE; + re->radius = le->radius; + + return le; +} + +/* +================== +CG_SpawnEffect + +Player teleporting in or out +================== +*/ +void CG_SpawnEffect( vec3_t org ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_FADE_RGB; + le->startTime = cg.time; + le->endTime = cg.time + 500; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + le->color[0] = le->color[1] = le->color[2] = le->color[3] = 1.0; + + re = &le->refEntity; + + re->reType = RT_MODEL; + re->shaderTime = cg.time / 1000.0f; + +#ifndef MISSIONPACK + re->customShader = cgs.media.teleportEffectShader; +#endif + re->hModel = cgs.media.teleportEffectModel; + AxisClear( re->axis ); + + VectorCopy( org, re->origin ); +#ifdef MISSIONPACK + re->origin[2] += 16; +#else + re->origin[2] -= 24; +#endif +} + +/* +================== +CG_PersentrySpawnEffect + +PKMOD - Ergodic 06/08/02 - add personal sentry teleport model +================== +*/ +void CG_PersentrySpawnEffect( vec3_t org ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_FADE_RGB; + le->startTime = cg.time; + le->endTime = cg.time + 500; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + le->color[0] = le->color[1] = le->color[2] = le->color[3] = 1.0; + + re = &le->refEntity; + + re->reType = RT_MODEL; + re->shaderTime = cg.time / 1000.0f; + + re->hModel = cgs.media.persentry_teleportEffectModel; + AxisClear( re->axis ); + + VectorCopy( org, re->origin ); + re->origin[2] -= 24; +} + + +#ifdef MISSIONPACK +/* +=============== +CG_LightningBoltBeam +=============== +*/ +void CG_LightningBoltBeam( vec3_t start, vec3_t end ) { + localEntity_t *le; + refEntity_t *beam; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_SHOWREFENTITY; + le->startTime = cg.time; + le->endTime = cg.time + 50; + + beam = &le->refEntity; + + VectorCopy( start, beam->origin ); + // this is the end point + VectorCopy( end, beam->oldorigin ); + + beam->reType = RT_LIGHTNING; + beam->customShader = cgs.media.lightningShader; +} + +/* +================== +CG_KamikazeEffect +================== +*/ +void CG_KamikazeEffect( vec3_t org ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_KAMIKAZE; + le->startTime = cg.time; + le->endTime = cg.time + 3000;//2250; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + le->color[0] = le->color[1] = le->color[2] = le->color[3] = 1.0; + + VectorClear(le->angles.trBase); + + re = &le->refEntity; + + re->reType = RT_MODEL; + re->shaderTime = cg.time / 1000.0f; + + re->hModel = cgs.media.kamikazeEffectModel; + + VectorCopy( org, re->origin ); + +} + +/* +================== +CG_ObeliskExplode +================== +*/ +void CG_ObeliskExplode( vec3_t org, int entityNum ) { + localEntity_t *le; + vec3_t origin; + + // create an explosion + VectorCopy( org, origin ); + origin[2] += 64; + le = CG_MakeExplosion( origin, vec3_origin, + cgs.media.dishFlashModel, + cgs.media.rocketExplosionShader, + 600, qtrue ); + le->light = 300; + le->lightColor[0] = 1; + le->lightColor[1] = 0.75; + le->lightColor[2] = 0.0; +} + +/* +================== +CG_ObeliskPain +================== +*/ +void CG_ObeliskPain( vec3_t org ) { + float r; + sfxHandle_t sfx; + + // hit sound + r = rand() & 3; + if ( r < 2 ) { + sfx = cgs.media.obeliskHitSound1; + } else if ( r == 2 ) { + sfx = cgs.media.obeliskHitSound2; + } else { + sfx = cgs.media.obeliskHitSound3; + } + trap_S_StartSound ( org, ENTITYNUM_NONE, CHAN_BODY, sfx ); +} + + +/* +================== +CG_InvulnerabilityImpact +================== +*/ +void CG_InvulnerabilityImpact( vec3_t org, vec3_t angles ) { + localEntity_t *le; + refEntity_t *re; + int r; + sfxHandle_t sfx; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_INVULIMPACT; + le->startTime = cg.time; + le->endTime = cg.time + 1000; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + le->color[0] = le->color[1] = le->color[2] = le->color[3] = 1.0; + + re = &le->refEntity; + + re->reType = RT_MODEL; + re->shaderTime = cg.time / 1000.0f; + + re->hModel = cgs.media.invulnerabilityImpactModel; + + VectorCopy( org, re->origin ); + AnglesToAxis( angles, re->axis ); + + r = rand() & 3; + if ( r < 2 ) { + sfx = cgs.media.invulnerabilityImpactSound1; + } else if ( r == 2 ) { + sfx = cgs.media.invulnerabilityImpactSound2; + } else { + sfx = cgs.media.invulnerabilityImpactSound3; + } + trap_S_StartSound (org, ENTITYNUM_NONE, CHAN_BODY, sfx ); +} + +/* +================== +CG_InvulnerabilityJuiced +================== +*/ +void CG_InvulnerabilityJuiced( vec3_t org ) { + localEntity_t *le; + refEntity_t *re; + vec3_t angles; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_INVULJUICED; + le->startTime = cg.time; + le->endTime = cg.time + 10000; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + le->color[0] = le->color[1] = le->color[2] = le->color[3] = 1.0; + + re = &le->refEntity; + + re->reType = RT_MODEL; + re->shaderTime = cg.time / 1000.0f; + + re->hModel = cgs.media.invulnerabilityJuicedModel; + + VectorCopy( org, re->origin ); + VectorClear(angles); + AnglesToAxis( angles, re->axis ); + + trap_S_StartSound (org, ENTITYNUM_NONE, CHAN_BODY, cgs.media.invulnerabilityJuicedSound ); +} + +#endif + +/* +================== +CG_ScorePlum +================== +*/ +void CG_ScorePlum( int client, vec3_t org, int score ) { + localEntity_t *le; + refEntity_t *re; + vec3_t angles; + static vec3_t lastPos; + + // only visualize for the client that scored + if (client != cg.predictedPlayerState.clientNum || cg_scorePlum.integer == 0) { + return; + } + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->leType = LE_SCOREPLUM; + le->startTime = cg.time; + le->endTime = cg.time + 4000; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + + le->color[0] = le->color[1] = le->color[2] = le->color[3] = 1.0; + le->radius = score; + + VectorCopy( org, le->pos.trBase ); + if (org[2] >= lastPos[2] - 20 && org[2] <= lastPos[2] + 20) { + le->pos.trBase[2] -= 20; + } + + //CG_Printf( "Plum origin %i %i %i -- %i\n", (int)org[0], (int)org[1], (int)org[2], (int)Distance(org, lastPos)); + VectorCopy(org, lastPos); + + + re = &le->refEntity; + + re->reType = RT_SPRITE; + re->radius = 16; + + VectorClear(angles); + AnglesToAxis( angles, re->axis ); +} + + +/* +==================== +CG_MakeExplosion +==================== +*/ +localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir, + qhandle_t hModel, qhandle_t shader, + int msec, qboolean isSprite ) { + float ang; + localEntity_t *ex; + int offset; + vec3_t tmpVec, newOrigin; + + if ( msec <= 0 ) { + CG_Error( "CG_MakeExplosion: msec = %i", msec ); + } + + // skew the time a bit so they aren't all in sync + offset = rand() & 63; + + ex = CG_AllocLocalEntity(); + if ( isSprite ) { + ex->leType = LE_SPRITE_EXPLOSION; + + // randomly rotate sprite orientation + ex->refEntity.rotation = rand() % 360; + VectorScale( dir, 16, tmpVec ); + VectorAdd( tmpVec, origin, newOrigin ); + } else { + ex->leType = LE_EXPLOSION; + VectorCopy( origin, newOrigin ); + + // set axis with random rotate + if ( !dir ) { + AxisClear( ex->refEntity.axis ); + } else { + ang = rand() % 360; + VectorCopy( dir, ex->refEntity.axis[0] ); + RotateAroundDirection( ex->refEntity.axis, ang ); + } + } + + ex->startTime = cg.time - offset; + ex->endTime = ex->startTime + msec; + + // bias the time so all shader effects start correctly + ex->refEntity.shaderTime = ex->startTime / 1000.0f; + + ex->refEntity.hModel = hModel; + ex->refEntity.customShader = shader; + + // set origin + VectorCopy( newOrigin, ex->refEntity.origin ); + VectorCopy( newOrigin, ex->refEntity.oldorigin ); + + ex->color[0] = ex->color[1] = ex->color[2] = 1.0; + + return ex; +} + + +/* +================= +CG_Bleed + +This is the spurt of blood when a character gets hit +================= +*/ +void CG_Bleed( vec3_t origin, int entityNum ) { + localEntity_t *ex; + + if ( !cg_blood.integer ) { + return; + } + + ex = CG_AllocLocalEntity(); + ex->leType = LE_EXPLOSION; + + ex->startTime = cg.time; + ex->endTime = ex->startTime + 500; + + VectorCopy ( origin, ex->refEntity.origin); + ex->refEntity.reType = RT_SPRITE; + ex->refEntity.rotation = rand() % 360; + ex->refEntity.radius = 24; + + ex->refEntity.customShader = cgs.media.bloodExplosionShader; + + // don't show player's own blood in view + if ( entityNum == cg.snap->ps.clientNum ) { + ex->refEntity.renderfx |= RF_THIRD_PERSON; + } +} + + + +/* +================== +CG_LaunchGib +================== +*/ +void CG_LaunchGib( vec3_t origin, vec3_t velocity, qhandle_t hModel ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + le->leType = LE_FRAGMENT; + le->startTime = cg.time; + le->endTime = le->startTime + 5000 + random() * 3000; + + VectorCopy( origin, re->origin ); + AxisCopy( axisDefault, re->axis ); + re->hModel = hModel; + + le->pos.trType = TR_GRAVITY; + VectorCopy( origin, le->pos.trBase ); + VectorCopy( velocity, le->pos.trDelta ); + le->pos.trTime = cg.time; + + le->bounceFactor = 0.6f; + + le->leBounceSoundType = LEBS_BLOOD; + le->leMarkType = LEMT_BLOOD; +} + +/* +================== +//PKMOD - Ergodic 12/14/00 - make gib less intensive +CG_LaunchGibAlternate +================== +*/ +void CG_LaunchGibAlternate( vec3_t origin, vec3_t velocity, qhandle_t hModel ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + le->leType = LE_FRAGMENT; + le->startTime = cg.time; + le->endTime = le->startTime + 3000 + random() * 2500; + + VectorCopy( origin, re->origin ); + AxisCopy( axisDefault, re->axis ); + re->hModel = hModel; + + le->pos.trType = TR_GRAVITY; + VectorCopy( origin, le->pos.trBase ); + VectorCopy( velocity, le->pos.trDelta ); + le->pos.trTime = cg.time; + + //PKMOD - Ergodic 12/16/00 - use "f" to force float + le->bounceFactor = 0.3f; + + if ( random() > 0.4 ) { + le->leBounceSoundType = LEBS_BRASS; + le->leMarkType = LEMT_NONE; + } + else { + le->leBounceSoundType = LEBS_BLOOD; + le->leMarkType = LEMT_BLOOD; + } +} + +/* +=================== +CG_GibPlayer + +Generated a bunch of gibs launching out from the bodies location +=================== +*/ +#define GIB_VELOCITY 250 +#define GIB_JUMP 250 +void CG_GibPlayer( vec3_t playerOrigin ) { + vec3_t origin, velocity; + + if ( !cg_blood.integer ) { + return; + } + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + if ( rand() & 1 ) { + CG_LaunchGib( origin, velocity, cgs.media.gibSkull ); + } else { + CG_LaunchGib( origin, velocity, cgs.media.gibBrain ); + } + + // allow gibs to be turned off for speed + if ( !cg_gibs.integer ) { + return; + } + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibAbdomen ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibArm ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibChest ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibFist ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibFoot ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibForearm ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibIntestine ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibLeg ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.gibLeg ); +} + +/* +================== +CG_LaunchGib +================== +*/ +void CG_LaunchExplode( vec3_t origin, vec3_t velocity, qhandle_t hModel ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + le->leType = LE_FRAGMENT; + le->startTime = cg.time; + le->endTime = le->startTime + 10000 + random() * 6000; + + VectorCopy( origin, re->origin ); + AxisCopy( axisDefault, re->axis ); + re->hModel = hModel; + + le->pos.trType = TR_GRAVITY; + VectorCopy( origin, le->pos.trBase ); + VectorCopy( velocity, le->pos.trDelta ); + le->pos.trTime = cg.time; + + le->bounceFactor = 0.1f; + + le->leBounceSoundType = LEBS_BRASS; + le->leMarkType = LEMT_NONE; +} + +#define EXP_VELOCITY 100 +#define EXP_JUMP 150 +/* +=================== +CG_GibPlayer + +Generated a bunch of gibs launching out from the bodies location +=================== +*/ +void CG_BigExplode( vec3_t playerOrigin ) { + vec3_t origin, velocity; + + if ( !cg_blood.integer ) { + return; + } + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*EXP_VELOCITY; + velocity[1] = crandom()*EXP_VELOCITY; + velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY; + CG_LaunchExplode( origin, velocity, cgs.media.smoke2 ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*EXP_VELOCITY; + velocity[1] = crandom()*EXP_VELOCITY; + velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY; + CG_LaunchExplode( origin, velocity, cgs.media.smoke2 ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*EXP_VELOCITY*1.5; + velocity[1] = crandom()*EXP_VELOCITY*1.5; + velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY; + CG_LaunchExplode( origin, velocity, cgs.media.smoke2 ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*EXP_VELOCITY*2.0; + velocity[1] = crandom()*EXP_VELOCITY*2.0; + velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY; + CG_LaunchExplode( origin, velocity, cgs.media.smoke2 ); + + VectorCopy( playerOrigin, origin ); + velocity[0] = crandom()*EXP_VELOCITY*2.5; + velocity[1] = crandom()*EXP_VELOCITY*2.5; + velocity[2] = EXP_JUMP + crandom()*EXP_VELOCITY; + CG_LaunchExplode( origin, velocity, cgs.media.smoke2 ); +} + +//PKMOD - Ergodic 12/14/00 - add autosentry gib models +#define AUTOSENTRY_SHOWGIB 0.7 //show gib 70% of the time +//PKMOD - Ergodic 11/22/00 - autosentry death routine +//PKMOD - Ergodic 12/14/00 - add autosentry gib models +void CG_AutoSentryDie( vec3_t AutoSentryOrigin ) { + vec3_t origin, velocity; + + //PKMOD Ergodic debug 12/14/00 inactive +// Com_Printf("CG_AutoSentryDie\n" ); + + + VectorCopy( AutoSentryOrigin, origin ); + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib1 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib2 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib3 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib4 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib5 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib6 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib7 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib8 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib9 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib10 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib11 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib12 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.pkasentry_gib13 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib14 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib15 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib16 ); + } + + if ( random() < AUTOSENTRY_SHOWGIB ) { + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGibAlternate( origin, velocity, cgs.media.pkasentry_gib17 ); + } + +} + +//PMKOD - Ergodic - 05/26/00 - Beartrap death +/* +================== +CG_BearTrapDie +================== +*/ +void CG_BearTrapDie( vec3_t BearTrapOrigin ) { + vec3_t origin, velocity; + int number_of_gibs; + + VectorCopy( BearTrapOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.pkabeartrapgib1 ); + + VectorCopy( BearTrapOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.pkabeartrapgib2 ); + + VectorCopy( BearTrapOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.pkabeartrapgib3 ); + + number_of_gibs = random() * 5; + + while (number_of_gibs > 0) { + VectorCopy( BearTrapOrigin, origin ); + velocity[0] = crandom()*GIB_VELOCITY; + velocity[1] = crandom()*GIB_VELOCITY; + velocity[2] = GIB_JUMP + crandom()*GIB_VELOCITY; + CG_LaunchGib( origin, velocity, cgs.media.pkabeartrapgib4 ); + number_of_gibs--; + } + +} + + +//PKMOD - Ergodic debug position +char *CG_vtos_2( const vec3_t v ) { + static int index; + static char str[8][32]; + char *s; + + // use an array so that multiple vtos won't collide + s = str[index]; + index = (index + 1)&7; + + Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]); + + return s; +} + +/* +================== +CG_Lightning_FX + +Create a light flash effect +Note: effect must be turned off +================== +*/ +//PKMOD - Ergodic 09/30/01 - event parm will send intensity +//PKMOD - Ergodic 10/01/01 - add mulitple points +#define MAX_LIGHTNING_POINTS 25 +#define MEAN_LIGHTNING_DISTANCE 20 + +void CG_Lightning_FX( vec3_t position, int intensity ) { + int i, r, g, b; + int indx; + vec3_t hold_position; + + //PKMOD Ergodic debug 07/19/00 (inactive) +//Com_Printf("CG_Lightning_FX - position>%s<, intensity>%d<\n", CG_vtos_2(position), intensity ); + + + r = 255; + g = 255; + b = 255; + i = intensity; + for (indx = 1; indx < MAX_LIGHTNING_POINTS; indx++ ) { + hold_position[0] = position[0] + crandom() * MEAN_LIGHTNING_DISTANCE; + hold_position[1] = position[1] + crandom() * MEAN_LIGHTNING_DISTANCE; + hold_position[2] = position[2] + crandom() * MEAN_LIGHTNING_DISTANCE; + trap_R_AddLightToScene( hold_position, i, r, g, b ); + } + +} + + +/* +================== +CG_Lightning_Water_Discharge + +//PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water +================== +*/ +void CG_Lightning_Water_Discharge (vec3_t origin, int msec) { + + localEntity_t *le; + + if (msec <= 0) + msec = 300; + + le = CG_SmokePuff ( origin, // where + vec3_origin, // where to + ((48 + (msec * 10)) / 16), // radius + 1, 1, 1, 1, // RGBA color shift + 300 + msec, // duration + cg.time, // start when? + 0, //fade in time + 0, // flags (?) + trap_R_RegisterShader ("models/weaphits/electric.tga")); + + le->leType = LE_SCALE_FADE; +} + + +/* +================== +CG_TootBubbles +//PKMOD - Ergodic 04/13/01 - Toots underwater +================== +*/ +#define TootBubbleCount 10 +//PKMOD - Ergodic 04/14/01 - Soft code +#define TootDisplacementMax 6 // displacement from center +#define TootDisplacementOffset 13 // 1 + 2 * TootDisplacementMax +#define Toot_H_VelocityMax 7 // horizontal velocity of bubbles +#define Toot_H_VelocityOffset 15 // 1 + 2 * Toot_H_VelocityMax +#define Toot_V_VelocityMax 20 // Vertical velocity of bubbles + + +void CG_TootBubbles( vec3_t start ) { + vec3_t hold_vec; + int i; + int bubbles; + + bubbles = 10 + rand() % TootBubbleCount; //{10, 19} + VectorCopy ( start, hold_vec ); + + for ( i = 1; i < bubbles; i++ ) { + localEntity_t *le; + refEntity_t *re; + + VectorCopy ( start, hold_vec ); //random location neary the hiney + hold_vec[0] += TootDisplacementMax - rand() % TootDisplacementOffset; //{-6, 6} + hold_vec[1] += TootDisplacementMax - rand() % TootDisplacementOffset; //{-6, 6} + hold_vec[2] += TootDisplacementMax - rand() % TootDisplacementOffset; //{-6, 6} + + le = CG_AllocLocalEntity(); + le->leFlags = LEF_PUFF_DONT_SCALE; + le->leType = LE_MOVE_SCALE_FADE; + le->startTime = cg.time; + le->endTime = cg.time + 1000 + random() * 250; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + re = &le->refEntity; + re->shaderTime = cg.time / 1000.0f; + + re->reType = RT_SPRITE; + re->rotation = 0; + re->radius = 3; + re->customShader = cgs.media.waterBubbleShader; + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + re->shaderRGBA[3] = 0xff; + + le->color[3] = 1.0; + + le->pos.trType = TR_LINEAR; + le->pos.trTime = cg.time; + VectorCopy( hold_vec, le->pos.trBase ); + + le->pos.trDelta[0] = Toot_H_VelocityMax - rand() % Toot_H_VelocityOffset; //{-7, 7} + le->pos.trDelta[1] = Toot_H_VelocityMax - rand() % Toot_H_VelocityOffset; //{-7, 7} + le->pos.trDelta[2] = Toot_V_VelocityMax + rand() % Toot_V_VelocityMax; //{20, 39} + + } +} + +/* +====================== +CG_BeansToot + +//PKMOD - Ergodic 04/13/01 - Renders fecal plumes or bubbles from eating beans +====================== +*/ +void CG_BeansToot( vec3_t origin ) { + int sourceContentType; + vec3_t hiney_location; + localEntity_t *smoke; + vec3_t up = {0, 0, 5}; + + VectorCopy( origin, hiney_location); + hiney_location[2] +=16; //waist displacement height + + + sourceContentType = trap_CM_PointContents( hiney_location, 0 ); + + if ( sourceContentType & CONTENTS_WATER ) { + CG_TootBubbles( hiney_location ); + } + else { + //PKMOD - Ergodic 12/27/00 add beans shader + smoke = CG_SmokePuff( hiney_location, up, + 32, + 1, 1, 1, 0.33f, + 1500, + cg.time, 0, + LEF_PUFF_DONT_SCALE, + cgs.media.pkafartPuffShader ); + } + +} + + //PKMOD - Ergodic 01/05/04 - add quad farting logic for differing CG graphic sequence +/* +====================== +CG_BeansToot + +PKMOD - Ergodic 01/05/04 - add quad farting logic for differing CG graphic sequence + - Renders fecal plumes or bubbles from eating beans + Ergodic 01/12/04 - add in scaling function local entity +====================== +*/ +void CG_QuadBeansToot( vec3_t origin ) { + int sourceContentType; + vec3_t hiney_location; + localEntity_t *smoke; +// vec3_t up = {0, 0, 5}; + + + //PKMOD - Ergodic 01/12/04 - debug quad fart activation (inactive) + //Com_Printf( "inside cg_quadbeanstoot\n" ); + + VectorCopy( origin, hiney_location); + hiney_location[2] +=16; //waist displacement height + + + sourceContentType = trap_CM_PointContents( hiney_location, 0 ); + + if ( sourceContentType & CONTENTS_WATER ) { + CG_TootBubbles( hiney_location ); + } + + smoke = CG_AllocLocalEntity(); + + smoke->leType = LE_SCALED_SPRITE_EXPLOSION; + + smoke->startTime = cg.time; + smoke->endTime = smoke->startTime + 1100; //Keep in sync with cg_localents + + // bias the time so all shader effects start correctly + smoke->refEntity.shaderTime = smoke->startTime / 1000.0f; + + smoke->refEntity.hModel = cgs.media.pkaquadbeansModel; + smoke->refEntity.customShader = cgs.media.pkaquadbeansShader; + + // set origin + VectorCopy( hiney_location, smoke->refEntity.origin ); + VectorCopy( hiney_location, smoke->refEntity.oldorigin ); + + smoke->light = 300; + smoke->lightColor[0] = 1; + smoke->lightColor[1] = 0.75; + smoke->lightColor[2] = 0.0; + +} + +/* +================== +CG_Radiation + +//PKMOD - Ergodic 10/14/01 - add radiation sparking effect +================== +*/ + +#define CG_RADIATION_COUNT 20 +#define CG_RADIATION_MIN_RADIUS 10 +#define CG_RADIATION_DELTA_RADIUS 25 //delta radius = max radius - min radius +#define CG_RADIATION_MIN_TIME 300 +#define CG_RADIATION_DELTA_TIME 500 //delta time = max time - min time +void CG_Radiation( vec3_t start ) { + vec3_t move; + int i; + + for ( i = 1; i < CG_RADIATION_COUNT; i++ ) { + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + le->leFlags = LEF_PUFF_DONT_SCALE; + le->leType = LE_MOVE_SCALE_FADE; + le->startTime = cg.time; + le->endTime = cg.time + CG_RADIATION_MIN_TIME + random() * CG_RADIATION_DELTA_TIME; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + re = &le->refEntity; + re->shaderTime = cg.time / 1000.0f; + + re->reType = RT_SPRITE; + re->rotation = 0; + re->radius = 2; + switch ( rand() % 6 ) { //random numbers: { 0, 1, 2, 3, 4, 5 } + case 0: + re->customShader = cgs.media.radiate1Shader; + break; + case 1: + re->customShader = cgs.media.radiate2Shader; + break; + case 2: + re->customShader = cgs.media.radiate3Shader; + break; + case 3: + re->customShader = cgs.media.radiate4Shader; + break; + case 4: + re->customShader = cgs.media.radiate5Shader; + break; + default: + re->customShader = cgs.media.radiate6Shader; + break; + } + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + re->shaderRGBA[3] = 0xff; + + le->color[3] = 1.0; + + le->pos.trType = TR_LINEAR; + le->pos.trTime = cg.time; + move[0] = start[0] + crandom() * ( CG_RADIATION_MIN_RADIUS + random() * CG_RADIATION_DELTA_RADIUS ); + move[1] = start[1] + crandom() * ( CG_RADIATION_MIN_RADIUS + random() * CG_RADIATION_DELTA_RADIUS ); + move[2] = start[2] + crandom() * ( CG_RADIATION_MIN_RADIUS + random() * CG_RADIATION_DELTA_RADIUS ); + + VectorCopy( move, le->pos.trBase ); + le->pos.trDelta[0] = crandom()*10; + le->pos.trDelta[1] = crandom()*10; + le->pos.trDelta[2] = crandom()*10; + + } +} + +/* +===================== +CG_RadiationTrail + +PKMOD - Ergodic 11/30/01 - add radiation trail to infected player +===================== +*/ +void CG_RadiationTrail0( const vec3_t p ) { + + vec3_t vel; + static int seed = 0x92; + localEntity_t *le; + refEntity_t *re; + + le = CG_AllocLocalEntity(); + le->leFlags = 0; + le->radius = 3; + + re = &le->refEntity; + re->rotation = Q_random( &seed ) * 360; + re->radius = 3; + re->shaderTime = cg.time / 1000.0f; + + le->leType = LE_FALL_SCALE_FADE; + le->startTime = cg.time; + le->fadeInTime = 0; + le->endTime = cg.time + 1000 + (rand() % 1001); + if ( le->fadeInTime > le->startTime ) { + le->lifeRate = 1.0 / ( le->endTime - le->fadeInTime ); + } + else { + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + } + le->color[0] = 1; + le->color[1] = 1; + le->color[2] = 1; + le->color[3] = 1; + + + le->pos.trType = TR_LINEAR; + le->pos.trTime = le->startTime; + vel[0] = 25 - 2 * ( rand() % 25 ); + vel[1] = 25 - 2 * ( rand() % 25 ); + vel[2] = 25 - 2 * ( rand() % 25 ); + VectorCopy( vel, le->pos.trDelta ); + VectorCopy( p, le->pos.trBase ); + + VectorCopy( p, re->origin ); + re->customShader = cgs.media.radiationTrailShader; + + // rage pro can't alpha fade, so use a different shader + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) { + re->customShader = cgs.media.smokePuffRageProShader; + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + re->shaderRGBA[3] = 0xff; + } else { + re->shaderRGBA[0] = le->color[0] * 0xff; + re->shaderRGBA[1] = le->color[1] * 0xff; + re->shaderRGBA[2] = le->color[2] * 0xff; + re->shaderRGBA[3] = 0xff; + } + + re->reType = RT_SPRITE; + re->radius = le->radius; + + // drop a total of 2 units over its lifetime + le->pos.trDelta[2] = 2; + +} + + +/* +===================== +CG_RadiationTrail + +PKMOD - Ergodic 11/30/01 - add radiation trail to infected player +===================== +*/ +void CG_RadiationTrail( const vec3_t p, vec3_t vel, + float radius, + float r, float g, float b, float a, + float duration, + int startTime, + int fadeInTime, + int leFlags, + qhandle_t hShader ) { +// static int seed = 0x92; + localEntity_t *le; + refEntity_t *re; +// int fadeInTime = startTime + duration / 2; + + le = CG_AllocLocalEntity(); + le->leFlags = leFlags; + le->radius = radius; + + re = &le->refEntity; +// re->rotation = Q_random( &seed ) * 360; + re->rotation = rand() % 360; //PKMOD - Ergodic 11/30/01 + re->radius = radius; + re->shaderTime = startTime / 1000.0f; + + le->leType = LE_MOVE_SCALE_FADE; + le->startTime = startTime; + le->fadeInTime = fadeInTime; + le->endTime = startTime + duration; + if ( fadeInTime > startTime ) { + le->lifeRate = 1.0 / ( le->endTime - le->fadeInTime ); + } + else { + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + } + le->color[0] = r; + le->color[1] = g; + le->color[2] = b; + le->color[3] = a; + + + le->pos.trType = TR_LINEAR; + le->pos.trTime = startTime; + VectorCopy( vel, le->pos.trDelta ); + VectorCopy( p, le->pos.trBase ); + + VectorCopy( p, re->origin ); + re->customShader = hShader; + + // rage pro can't alpha fade, so use a different shader + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) { + re->customShader = cgs.media.smokePuffRageProShader; + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + re->shaderRGBA[3] = 0xff; + } else { + re->shaderRGBA[0] = le->color[0] * 0xff; + re->shaderRGBA[1] = le->color[1] * 0xff; + re->shaderRGBA[2] = le->color[2] * 0xff; + re->shaderRGBA[3] = 0xff; + } + + re->reType = RT_SPRITE; + re->radius = le->radius; + + // drop a total of 5 units over its lifetime + le->pos.trDelta[2] = 20; + +} + diff --git a/quake3/source/code/cgame/cg_ents.c b/quake3/source/code/cgame/cg_ents.c new file mode 100644 index 0000000..f59771a --- /dev/null +++ b/quake3/source/code/cgame/cg_ents.c @@ -0,0 +1,3508 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_ents.c -- present snapshot entities, happens every single frame + +#include "cg_local.h" + + +//PKMOD - Ergodic debug position +char *CG_vtos( const vec3_t v ) { + static int index; + static char str[8][32]; + char *s; + + // use an array so that multiple vtos won't collide + s = str[index]; + index = (index + 1)&7; + + Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]); + + return s; +} + + +/* +====================== +CG_PositionEntityOnTag + +Modifies the entities position and axis by the given +tag location +====================== +*/ +void CG_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + qhandle_t parentModel, char *tagName ) { + int i; + orientation_t lerped; + + // lerp the tag + trap_R_LerpTag( &lerped, parentModel, parent->oldframe, parent->frame, + 1.0 - parent->backlerp, tagName ); + + // FIXME: allow origin offsets along tag? + VectorCopy( parent->origin, entity->origin ); + for ( i = 0 ; i < 3 ; i++ ) { + VectorMA( entity->origin, lerped.origin[i], parent->axis[i], entity->origin ); + } + + // had to cast away the const to avoid compiler problems... + MatrixMultiply( lerped.axis, ((refEntity_t *)parent)->axis, entity->axis ); + entity->backlerp = parent->backlerp; +} + + +/* +====================== +CG_PositionRotatedEntityOnTag + +Modifies the entities position and axis by the given +tag location +====================== +*/ +void CG_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + qhandle_t parentModel, char *tagName ) { + int i; + orientation_t lerped; + vec3_t tempAxis[3]; + +//AxisClear( entity->axis ); + // lerp the tag + trap_R_LerpTag( &lerped, parentModel, parent->oldframe, parent->frame, + 1.0 - parent->backlerp, tagName ); + + // FIXME: allow origin offsets along tag? + VectorCopy( parent->origin, entity->origin ); + for ( i = 0 ; i < 3 ; i++ ) { + VectorMA( entity->origin, lerped.origin[i], parent->axis[i], entity->origin ); + } + + // had to cast away the const to avoid compiler problems... + MatrixMultiply( entity->axis, lerped.axis, tempAxis ); + MatrixMultiply( tempAxis, ((refEntity_t *)parent)->axis, entity->axis ); +} + + + +/* +========================================================================== + +FUNCTIONS CALLED EACH FRAME + +========================================================================== +*/ + +/* +====================== +CG_SetEntitySoundPosition + +Also called by event processing code +====================== +*/ +void CG_SetEntitySoundPosition( centity_t *cent ) { + if ( cent->currentState.solid == SOLID_BMODEL ) { + vec3_t origin; + float *v; + + v = cgs.inlineModelMidpoints[ cent->currentState.modelindex ]; + VectorAdd( cent->lerpOrigin, v, origin ); + trap_S_UpdateEntityPosition( cent->currentState.number, origin ); + } else { + trap_S_UpdateEntityPosition( cent->currentState.number, cent->lerpOrigin ); + } +} + +/* +================== +CG_EntityEffects + +Add continuous entity effects, like local entity emission and lighting +================== +*/ +static void CG_EntityEffects( centity_t *cent ) { + + // update sound origins + CG_SetEntitySoundPosition( cent ); + + //PKMOD - Ergodic 11/19/02 - add code to work-around loopSound Bug (does not carry over to cgame) + if ( cent->currentState.time2 && ( cent->currentState.eType == ET_MOVER ) ) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, + cgs.gameSounds[ cent->currentState.time2 ] ); + } + // add loop sound + else { + if ( cent->currentState.loopSound ) { + if (cent->currentState.eType != ET_SPEAKER) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, + cgs.gameSounds[ cent->currentState.loopSound ] ); + } else { + trap_S_AddRealLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, + cgs.gameSounds[ cent->currentState.loopSound ] ); + } + } + } + + + // constant light glow + if ( cent->currentState.constantLight ) { + int cl; + int i, r, g, b; + + cl = cent->currentState.constantLight; + r = cl & 255; + g = ( cl >> 8 ) & 255; + b = ( cl >> 16 ) & 255; + i = ( ( cl >> 24 ) & 255 ) * 4; + trap_R_AddLightToScene( cent->lerpOrigin, i, r, g, b ); + } + +} + + +/* +================== +CG_General +================== +*/ +static void CG_General( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + + s1 = ¢->currentState; + + // if set to invisible, skip + if (!s1->modelindex) { + return; + } + + memset (&ent, 0, sizeof(ent)); + + // set frame + + ent.frame = s1->frame; + ent.oldframe = ent.frame; + ent.backlerp = 0; + + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + ent.hModel = cgs.gameModels[s1->modelindex]; + + // player model + if (s1->number == cg.snap->ps.clientNum) { + ent.renderfx |= RF_THIRD_PERSON; // only draw from mirrors + } + + // convert angles to axis + AnglesToAxis( cent->lerpAngles, ent.axis ); + + // add to refresh list + trap_R_AddRefEntityToScene (&ent); +} + +/* +================== +CG_Speaker + +Speaker entities can automatically play sounds +================== +*/ +static void CG_Speaker( centity_t *cent ) { + if ( ! cent->currentState.clientNum ) { // FIXME: use something other than clientNum... + return; // not auto triggering + } + + if ( cg.time < cent->miscTime ) { + return; + } + + trap_S_StartSound (NULL, cent->currentState.number, CHAN_ITEM, cgs.gameSounds[cent->currentState.eventParm] ); + + // ent->s.frame = ent->wait * 10; + // ent->s.clientNum = ent->random * 10; + cent->miscTime = cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom(); +} + +/* +================== +CG_Item +================== +*/ +static void CG_Item( centity_t *cent ) { + refEntity_t ent; + entityState_t *es; + gitem_t *item; + int msec; + float frac; + float scale; + weaponInfo_t *wi; + + es = ¢->currentState; + if ( es->modelindex >= bg_numItems ) { + CG_Error( "Bad item index %i on entity", es->modelindex ); + } + + // if set to invisible, skip + if ( !es->modelindex || ( es->eFlags & EF_NODRAW ) ) { + return; + } + + item = &bg_itemlist[ es->modelindex ]; + if ( cg_simpleItems.integer && item->giType != IT_TEAM ) { + memset( &ent, 0, sizeof( ent ) ); + ent.reType = RT_SPRITE; + VectorCopy( cent->lerpOrigin, ent.origin ); + ent.radius = 14; + + //PKMOD - Ergodic 11/16/01 - add logic to display radiation effect for simple item + if ( es->modelindex2 & PKAEF_IRRADIATED ) { + if ( cent->PKA_RadiateTime < cg.time ) { + switch (rand() % 3) { //Generate random numbers: {0,1,2} + case 0: + cent->PKA_customShader = cgs.media.radiate1SimpleIcon; + break; + case 1: + cent->PKA_customShader = cgs.media.radiate2SimpleIcon; + break; + default: + cent->PKA_customShader = cgs.media.radiate3SimpleIcon; + break; + } + cent->PKA_RadiateTime = cg.time + 2000; //every 1 seconds + ent.customShader = cent->PKA_customShader; + } + else if ( ( cent->PKA_RadiateTime - cg.time ) > 1000 ) + ent.customShader = cent->PKA_customShader; + else + ent.customShader = cg_items[es->modelindex].icon; + } + else // item is not radiated + ent.customShader = cg_items[es->modelindex].icon; + + ent.shaderRGBA[0] = 255; + ent.shaderRGBA[1] = 255; + ent.shaderRGBA[2] = 255; + ent.shaderRGBA[3] = 255; + trap_R_AddRefEntityToScene(&ent); + return; + } + + //PKMOD - Ergodic 10/29/01 - add logic to display radiation effect + if ( es->modelindex2 & PKAEF_IRRADIATED ) { + if ( cent->PKA_RadiateTime < cg.time ) { + CG_Radiation( cent->lerpOrigin ); + cent->PKA_RadiateTime = cg.time + 1000; //every 1 seconds + } + } + + // items bob up and down continuously + scale = 0.005 + cent->currentState.number * 0.00001; + cent->lerpOrigin[2] += 4 + cos( ( cg.time + 1000 ) * scale ) * 4; + + memset (&ent, 0, sizeof(ent)); + + //PKMOD - Ergodic 12/03/01 - add custom skins for Private Bot + if ( item->giType == IT_HOLDABLE ) { + switch ( item->giTag ) { + case HI_BOTLEGS: + ent.customSkin = cgs.media.privatebot_legsSkin; + //PKMOD - Ergodic 12/01/01 - raise the bot legs by several units + cent->lerpOrigin[2] += 22; + break; + case HI_BOTTORSO: + ent.customSkin = cgs.media.privatebot_torsoSkin; + break; + case HI_BOTHEAD: + ent.customSkin = cgs.media.privatebot_headSkin; + break; + default: + break; + } + } + + //PKMOD - Ergodic 06/01/02 - set the frame for the autosentry + // autosentry frames are 0..29 + if (( item->giType == IT_WEAPON ) && ( item->giTag == WP_SENTRY )) { + ent.frame = 29; + } + + //PKMOD - Ergodic 01/27/02 - we will do the rotation function later + // autorotate at one of two speeds +// if ( item->giType == IT_HEALTH ) { +// VectorCopy( cg.autoAnglesFast, cent->lerpAngles ); +// AxisCopy( cg.autoAxisFast, ent.axis ); +// } else { +// VectorCopy( cg.autoAngles, cent->lerpAngles ); +// AxisCopy( cg.autoAxis, ent.axis ); +// } + + wi = NULL; + + //PKMOD - Ergodic 09/21/00 - add logic so that voting entity will not rotate + if ( item->giType == IT_VOTING ) { + //PKMOD - Ergodic 09/28/00 - debug set angle to 45 +// VectorSet( cent->lerpAngles, 0, 45, 0 ); +// Com_Printf("CG_Item: IT_VOTING - cent->lerpAngles>%s<\n", CG_vtos(cent->lerpAngles)); + +// AxisClear( ent.axis ); + + // convert lerpangles into axis + AnglesToAxis( cent->lerpAngles, ent.axis ); + + //PKMOD - Ergodic 09/29/00 - debug +// Com_Printf("CG_Item - cent->currentState.otherEntityNum>%d<, hubInfo[cent->currentState.otherEntityNum].map_shader_index>%d<\n", cent->currentState.otherEntityNum, hubInfo[cent->currentState.otherEntityNum].map_shader_index ); + + //PKMOD - Ergodic 09/21/00 - Set the voting image shader + //PKMOD - Ergodic 10/10/00 - use otherEntityNum2 as flag for registering shader + switch ( cent->currentState.otherEntityNum ) { + case 0: + if ( cg_voting_shader_flag[0] == '0' ) { + cgs.media.voting_levelshot_0 = trap_R_RegisterShaderNoMip( "voting_levelshot_0" ); + cg_voting_shader_flag[0] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_0; + break; + case 1: + if ( cg_voting_shader_flag[1] == '0' ) { + cgs.media.voting_levelshot_1 = trap_R_RegisterShaderNoMip( "voting_levelshot_1" ); + cg_voting_shader_flag[1] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_1; + break; + case 2: + if ( cg_voting_shader_flag[2] == '0' ) { + cgs.media.voting_levelshot_2 = trap_R_RegisterShaderNoMip( "voting_levelshot_2" ); + cg_voting_shader_flag[2] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_2; + break; + case 3: + if ( cg_voting_shader_flag[3] == '0' ) { + cgs.media.voting_levelshot_3 = trap_R_RegisterShaderNoMip( "voting_levelshot_3" ); + cg_voting_shader_flag[4] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_3; + break; + case 4: + if ( cg_voting_shader_flag[4] == '0' ) { + cgs.media.voting_levelshot_4 = trap_R_RegisterShaderNoMip( "voting_levelshot_4" ); + cg_voting_shader_flag[4] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_4; + break; + case 5: + if ( cg_voting_shader_flag[5] == '0' ) { + cgs.media.voting_levelshot_5 = trap_R_RegisterShaderNoMip( "voting_levelshot_5" ); + cg_voting_shader_flag[5] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_5; + break; + case 6: + if ( cg_voting_shader_flag[6] == '0' ) { + cgs.media.voting_levelshot_6 = trap_R_RegisterShaderNoMip( "voting_levelshot_6" ); + cg_voting_shader_flag[6] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_6; + break; + case 7: + //PKMOD - Ergodic 10/10/00 - debug +// Com_Printf("CG_Item - case 7 cg_voting_shader_flag[7]>%c<\n", cg_voting_shader_flag[7] ); + + if ( cg_voting_shader_flag[7] == '0' ) { + //PKMOD - Ergodic 10/10/00 - debug +// Com_Printf("CG_Item - setting cg_voting_shader_flag[7]\n" ); + cgs.media.voting_levelshot_7 = trap_R_RegisterShaderNoMip( "voting_levelshot_7" ); + cg_voting_shader_flag[7] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_7; + break; + case 8: + if ( cg_voting_shader_flag[8] == '0' ) { + cgs.media.voting_levelshot_8 = trap_R_RegisterShaderNoMip( "voting_levelshot_8" ); + cg_voting_shader_flag[8] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_8; + break; + case 9: + if ( cg_voting_shader_flag[9] == '0' ) { + cgs.media.voting_levelshot_9 = trap_R_RegisterShaderNoMip( "voting_levelshot_9" ); + cg_voting_shader_flag[9] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_9; + break; + case 10: + if ( cg_voting_shader_flag[10] == '0' ) { + cgs.media.voting_levelshot_10 = trap_R_RegisterShaderNoMip( "voting_levelshot_10" ); + cg_voting_shader_flag[10] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_10; + break; + case 11: + if ( cg_voting_shader_flag[11] == '0' ) { + cgs.media.voting_levelshot_11 = trap_R_RegisterShaderNoMip( "voting_levelshot_11" ); + cg_voting_shader_flag[11] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_11; + break; + case 12: + if ( cg_voting_shader_flag[12] == '0' ) { + cgs.media.voting_levelshot_12 = trap_R_RegisterShaderNoMip( "voting_levelshot_12" ); + cg_voting_shader_flag[12] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_12; + break; + case 13: + if ( cg_voting_shader_flag[13] == '0' ) { + cgs.media.voting_levelshot_13 = trap_R_RegisterShaderNoMip( "voting_levelshot_13" ); + cg_voting_shader_flag[13] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_13; + break; + case 14: + if ( cg_voting_shader_flag[14] == '0' ) { + cgs.media.voting_levelshot_14 = trap_R_RegisterShaderNoMip( "voting_levelshot_14" ); + cg_voting_shader_flag[14] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_14; + break; + case 15: + if ( cg_voting_shader_flag[15] == '0' ) { + cgs.media.voting_levelshot_15 = trap_R_RegisterShaderNoMip( "voting_levelshot_15" ); + cg_voting_shader_flag[15] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_15; + break; + case 16: + if ( cg_voting_shader_flag[16] == '0' ) { + cgs.media.voting_levelshot_16 = trap_R_RegisterShaderNoMip( "voting_levelshot_16" ); + cg_voting_shader_flag[16] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_16; + break; + case 17: + if ( cg_voting_shader_flag[17] == '0' ) { + cgs.media.voting_levelshot_17 = trap_R_RegisterShaderNoMip( "voting_levelshot_17" ); + cg_voting_shader_flag[17] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_17; + break; + case 18: + if ( cg_voting_shader_flag[18] == '0' ) { + cgs.media.voting_levelshot_18 = trap_R_RegisterShaderNoMip( "voting_levelshot_18" ); + cg_voting_shader_flag[18] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_18; + break; + case 19: + if ( cg_voting_shader_flag[19] == '0' ) { + cgs.media.voting_levelshot_19 = trap_R_RegisterShaderNoMip( "voting_levelshot_19" ); + cg_voting_shader_flag[19] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_19; + break; + case 20: + if ( cg_voting_shader_flag[20] == '0' ) { + cgs.media.voting_levelshot_20 = trap_R_RegisterShaderNoMip( "voting_levelshot_20" ); + cg_voting_shader_flag[20] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_20; + break; + case 21: + if ( cg_voting_shader_flag[21] == '0' ) { + cgs.media.voting_levelshot_21 = trap_R_RegisterShaderNoMip( "voting_levelshot_21" ); + cg_voting_shader_flag[21] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_21; + break; + case 22: + if ( cg_voting_shader_flag[22] == '0' ) { + cgs.media.voting_levelshot_22 = trap_R_RegisterShaderNoMip( "voting_levelshot_22" ); + cg_voting_shader_flag[22] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_22; + break; + case 23: + if ( cg_voting_shader_flag[23] == '0' ) { + cgs.media.voting_levelshot_23 = trap_R_RegisterShaderNoMip( "voting_levelshot_23" ); + cg_voting_shader_flag[23] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_23; + break; + case 24: + if ( cg_voting_shader_flag[24] == '0' ) { + cgs.media.voting_levelshot_24 = trap_R_RegisterShaderNoMip( "voting_levelshot_24" ); + cg_voting_shader_flag[24] = '1'; + } + ent.customShader = cgs.media.voting_levelshot_24; + break; + default: + ent.customShader = trap_R_RegisterShaderNoMip( "menu/art/unknownmap" ); + break; + } + +// ent.hModel = cg_items[es->modelindex].models[0]; + +// VectorCopy( cent->lerpOrigin, ent.origin); +// VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // add to refresh list +// trap_R_AddRefEntityToScene(&ent); +// return; + } + else { + // autorotate at one of two speeds + if ( item->giType == IT_HEALTH ) { + VectorCopy( cg.autoAnglesFast, cent->lerpAngles ); + AxisCopy( cg.autoAxisFast, ent.axis ); + //PKMOD - Ergodic 01/15/04 - change logic to "else if" for addition of code to rotate ammo slowly + } else if ( ( item->giType == IT_HOLDABLE ) && ( item->giTag == HI_RADIATE ) ) { + //PKMOD - Ergodic 01/27/02 - rotate the radiate pickup model very slowly + VectorCopy( cg.autoAnglesSlow, cent->lerpAngles ); + AxisCopy( cg.autoAxisSlow, ent.axis ); + } else if ( item->giType == IT_AMMO ) { //default rotation + //PKMOD - Ergodic 01/15/04 - add code to rotate ammo slowly + VectorCopy( cg.autoAnglesSlow, cent->lerpAngles ); + AxisCopy( cg.autoAxisSlow, ent.axis ); + } else { + VectorCopy( cg.autoAngles, cent->lerpAngles ); + AxisCopy( cg.autoAxis, ent.axis ); + } + + } + + wi = NULL; + // the weapons have their origin where they attatch to player + // models, so we need to offset them or they will rotate + // eccentricly + if ( item->giType == IT_WEAPON ) { + wi = &cg_weapons[item->giTag]; + cent->lerpOrigin[0] -= + wi->weaponMidpoint[0] * ent.axis[0][0] + + wi->weaponMidpoint[1] * ent.axis[1][0] + + wi->weaponMidpoint[2] * ent.axis[2][0]; + cent->lerpOrigin[1] -= + wi->weaponMidpoint[0] * ent.axis[0][1] + + wi->weaponMidpoint[1] * ent.axis[1][1] + + wi->weaponMidpoint[2] * ent.axis[2][1]; + cent->lerpOrigin[2] -= + wi->weaponMidpoint[0] * ent.axis[0][2] + + wi->weaponMidpoint[1] * ent.axis[1][2] + + wi->weaponMidpoint[2] * ent.axis[2][2]; + + cent->lerpOrigin[2] += 8; // an extra height boost + } + + //PKMOD - Ergodic 03/05/01 - CLG has different pickup model than handhold model (inactive) + //PKMOD - Ergodic 03/27/01 - code was inactivated due to CLG will not have a rotating barrel +// if ( ( item->giTag == WP_LIGHTNING ) && ( item->giType == IT_WEAPON ) ) +// ent.hModel = cg_items[es->modelindex].models[1]; +// else +// ent.hModel = cg_items[es->modelindex].models[0]; + + ent.hModel = cg_items[es->modelindex].models[0]; + + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + ent.nonNormalizedAxes = qfalse; + + // if just respawned, slowly scale up + msec = cg.time - cent->miscTime; + if ( msec >= 0 && msec < ITEM_SCALEUP_TIME ) { + frac = (float)msec / ITEM_SCALEUP_TIME; + VectorScale( ent.axis[0], frac, ent.axis[0] ); + VectorScale( ent.axis[1], frac, ent.axis[1] ); + VectorScale( ent.axis[2], frac, ent.axis[2] ); + ent.nonNormalizedAxes = qtrue; + } else { + frac = 1.0; + } + + // items without glow textures need to keep a minimum light value + // so they are always visible + if ( ( item->giType == IT_WEAPON ) || + ( item->giType == IT_ARMOR ) ) { + ent.renderfx |= RF_MINLIGHT; + } + + // increase the size of the weapons when they are presented as items + if ( item->giType == IT_WEAPON ) { + VectorScale( ent.axis[0], 1.5, ent.axis[0] ); + VectorScale( ent.axis[1], 1.5, ent.axis[1] ); + VectorScale( ent.axis[2], 1.5, ent.axis[2] ); + ent.nonNormalizedAxes = qtrue; +#ifdef MISSIONPACK + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, cgs.media.weaponHoverSound ); +#endif + } + +#ifdef MISSIONPACK + if ( item->giType == IT_HOLDABLE && item->giTag == HI_KAMIKAZE ) { + VectorScale( ent.axis[0], 2, ent.axis[0] ); + VectorScale( ent.axis[1], 2, ent.axis[1] ); + VectorScale( ent.axis[2], 2, ent.axis[2] ); + ent.nonNormalizedAxes = qtrue; + } +#endif + + //PKMOD - Ergodic 05/19/02 - resize the Private Bot (head) to make it larger + if ( item->giType == IT_HOLDABLE && item->giTag == HI_BOTHEAD ) { + VectorScale( ent.axis[0], 2, ent.axis[0] ); + VectorScale( ent.axis[1], 2, ent.axis[1] ); + VectorScale( ent.axis[2], 2, ent.axis[2] ); + ent.nonNormalizedAxes = qtrue; + } + + // add to refresh list + trap_R_AddRefEntityToScene(&ent); + + //PKMOD - Ergodic 05/16/03 - add blade to "pickup" lightning gun model + if ( ( item->giType == IT_WEAPON ) && ( item->giTag == WP_LIGHTNING ) ) { + refEntity_t barrel; + + memset( &barrel, 0, sizeof( barrel ) ); + + barrel.hModel = wi->barrelModel; + + VectorCopy( ent.lightingOrigin, barrel.lightingOrigin ); + barrel.shadowPlane = ent.shadowPlane; + barrel.renderfx = ent.renderfx; + + CG_PositionRotatedEntityOnTag( &barrel, &ent, wi->weaponModel, "tag_barrel" ); + + AxisCopy( ent.axis, barrel.axis ); + barrel.nonNormalizedAxes = ent.nonNormalizedAxes; + + trap_R_AddRefEntityToScene( &barrel ); + } + + +#ifdef MISSIONPACK + if ( item->giType == IT_WEAPON && wi->barrelModel ) { + refEntity_t barrel; + + memset( &barrel, 0, sizeof( barrel ) ); + + barrel.hModel = wi->barrelModel; + + VectorCopy( ent.lightingOrigin, barrel.lightingOrigin ); + barrel.shadowPlane = ent.shadowPlane; + barrel.renderfx = ent.renderfx; + + CG_PositionRotatedEntityOnTag( &barrel, &ent, wi->weaponModel, "tag_barrel" ); + + AxisCopy( ent.axis, barrel.axis ); + barrel.nonNormalizedAxes = ent.nonNormalizedAxes; + + trap_R_AddRefEntityToScene( &barrel ); + } +#endif + + // accompanying rings / spheres for powerups + if ( !cg_simpleItems.integer ) + { + vec3_t spinAngles; + + VectorClear( spinAngles ); + + if ( item->giType == IT_HEALTH || item->giType == IT_POWERUP ) + { + if ( ( ent.hModel = cg_items[es->modelindex].models[1] ) != 0 ) + { + if ( item->giType == IT_POWERUP ) + { + ent.origin[2] += 12; + spinAngles[1] = ( cg.time & 1023 ) * 360 / -1024.0f; + } + AnglesToAxis( spinAngles, ent.axis ); + + // scale up if respawning + if ( frac != 1.0 ) { + VectorScale( ent.axis[0], frac, ent.axis[0] ); + VectorScale( ent.axis[1], frac, ent.axis[1] ); + VectorScale( ent.axis[2], frac, ent.axis[2] ); + ent.nonNormalizedAxes = qtrue; + } + trap_R_AddRefEntityToScene( &ent ); + } + } + } +} + +//============================================================================ + +/* +=============== +CG_Missile +=============== +*/ +static void CG_Missile( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + const weaponInfo_t *weapon; +// int col; + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + + // add trails + if ( weapon->missileTrailFunc ) + { + weapon->missileTrailFunc( cent, weapon ); + } +/* + if ( cent->currentState.modelindex == TEAM_RED ) { + col = 1; + } + else if ( cent->currentState.modelindex == TEAM_BLUE ) { + col = 2; + } + else { + col = 0; + } + + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[col][0], weapon->missileDlightColor[col][1], weapon->missileDlightColor[col][2] ); + } +*/ + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + } + + // add missile sound + if ( weapon->missileSound ) { + vec3_t velocity; + + BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); + } + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + if ( cent->currentState.weapon == WP_PLASMAGUN ) { + ent.reType = RT_SPRITE; + ent.radius = 16; + ent.rotation = 0; + ent.customShader = cgs.media.plasmaBallShader; + trap_R_AddRefEntityToScene( &ent ); + return; + } + + //PKMOD - Ergodic 06/12/02 - add logic personalsentry missile sprite [time2 == 251] + //PKMOD - Ergodic 04/06/01 - add autosentry missile sprite + if ( cent->currentState.weapon == WP_SENTRY ) { + ent.reType = RT_SPRITE; + ent.rotation = 0; + if ( cent->currentState.time2 == 251 ) { + //personalsentry missile details + if ( ( rand() % 101 ) > 50 ) + ent.radius = 8; + else + ent.radius = 2; + ent.customShader = cgs.media.personalsentryBallShader; + } + else { + //autosentry missile details + if ( ( rand() % 101 ) > 96 ) + ent.radius = 16; + else + ent.radius = 2; + ent.customShader = cgs.media.autosentryBallShader; + } + trap_R_AddRefEntityToScene( &ent ); + return; + } + + + // flicker between two skins + ent.skinNum = cg.clientFrame & 1; + ent.hModel = weapon->missileModel; + ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + +#ifdef MISSIONPACK + if ( cent->currentState.weapon == WP_PROX_LAUNCHER ) { + if (s1->generic1 == TEAM_BLUE) { + ent.hModel = cgs.media.blueProxMine; + } + } +#endif + + // convert direction of travel into axis + if ( VectorNormalize2( s1->pos.trDelta, ent.axis[0] ) == 0 ) { + ent.axis[0][2] = 1; + } + + // spin as it moves + //PKMOD - Ergodic 04/27/01 - make launched gravity well spin + if ( ( s1->pos.trType != TR_STATIONARY ) || ( cent->currentState.weapon == WP_GRAVITY ) ) { + RotateAroundDirection( ent.axis, cg.time / 4 ); + } else { +#ifdef MISSIONPACK + if ( s1->weapon == WP_PROX_LAUNCHER ) { + AnglesToAxis( cent->lerpAngles, ent.axis ); + } + else +#endif + { + RotateAroundDirection( ent.axis, s1->time ); + } + } + + // add to refresh list, possibly with quad glow + CG_AddRefEntityWithPowerups( &ent, s1, TEAM_FREE ); +} + +/* +=============== +CG_Grapple + +This is called when the grapple is sitting up against the wall +=============== +*/ +static void CG_Grapple( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + const weaponInfo_t *weapon; + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + +#if 0 // FIXME add grapple pull sound here..? + // add missile sound + if ( weapon->missileSound ) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, weapon->missileSound ); + } +#endif + + // Will draw cable if needed + CG_GrappleTrail ( cent, weapon ); + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // flicker between two skins + ent.skinNum = cg.clientFrame & 1; + ent.hModel = weapon->missileModel; + ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + + // convert direction of travel into axis + if ( VectorNormalize2( s1->pos.trDelta, ent.axis[0] ) == 0 ) { + ent.axis[0][2] = 1; + } + + trap_R_AddRefEntityToScene( &ent ); +} + +/* +=============== +CG_Mover +=============== +*/ +static void CG_Mover( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + + //PKMOD Ergodic debug 06/29/01 (inactive) +// if ( (rand() % 101) > 97 ) +// Com_Printf("CG_mover - eType>%d, cent->lerpAngles>%s<, cent->lerpOrigin>%s<, generic1>%d<\n", cent->currentState.eType, CG_vtos(cent->lerpAngles), CG_vtos(cent->lerpOrigin), cent->currentState.generic1); + + //PKMOD - Ergodic 11/19/02 - debug mover sound (inactive) +// if ( cent->currentState.time2 ) { +// Com_Printf( "CG_Mover - mover soundindex: %d (time2: %d) at lerp>%s<, vec3>%s<\n", cent->currentState.loopSound, cent->currentState.time2, CG_vtos(cent->lerpOrigin), CG_vtos(vec3_origin) ); +// } + + //PKMOD - Ergodic 06/11/01 - if zombie mover... + if ( cent->currentState.generic1 ) { + //PKMOD - Ergodic 06/11/01 - for zombie + refEntity_t legs; + refEntity_t torso; + refEntity_t head; + int frame; + + memset( &legs, 0, sizeof(legs) ); + memset( &torso, 0, sizeof(torso) ); + memset( &head, 0, sizeof(head) ); + + frame = ( (cg.time - s1->apos.trTime) / 1000 ) % 31 + 30; + + //PKMOD Ergodic debug 06/20/01 (inactive) +// Com_Printf("CG_mover - zombie frame>%d<\n", frame); + + + VectorCopy( cent->lerpOrigin, legs.origin); + VectorCopy( cent->lerpOrigin, legs.oldorigin); + AnglesToAxis( cent->lerpAngles, legs.axis ); + + // legs + legs.customSkin = cgs.media.pkazombie_legsSkin; + legs.hModel = cgs.media.pkazombie_legsModel; + legs.frame = frame; + trap_R_AddRefEntityToScene(&legs); + + // torso + AnglesToAxis( cent->lerpAngles, torso.axis ); + torso.customSkin = cgs.media.pkazombie_torsoSkin; + torso.hModel = cgs.media.pkazombie_torsoModel; + torso.frame = frame; + + CG_PositionRotatedEntityOnTag( &torso, &legs, legs.hModel, "tag_torso"); + trap_R_AddRefEntityToScene(&torso); + + // head + AnglesToAxis( cent->lerpAngles, head.axis ); + head.customSkin = cgs.media.pkazombie_headSkin; + head.hModel = cgs.media.pkazombie_headModel; + head.frame = frame; + + CG_PositionRotatedEntityOnTag( &head, &torso, torso.hModel, "tag_head"); + trap_R_AddRefEntityToScene(&head); + + return; + } + + s1 = ¢->currentState; + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + AnglesToAxis( cent->lerpAngles, ent.axis ); + + ent.renderfx = RF_NOSHADOW; + + // flicker between two skins (FIXME?) + ent.skinNum = ( cg.time >> 6 ) & 1; + + // get the model, either as a bmodel or a modelindex + if ( s1->solid == SOLID_BMODEL ) { + ent.hModel = cgs.inlineDrawModel[s1->modelindex]; + } else { + ent.hModel = cgs.gameModels[s1->modelindex]; + } + + // add to refresh list + trap_R_AddRefEntityToScene(&ent); + + // add the secondary model + if ( s1->modelindex2 ) { + ent.skinNum = 0; + ent.hModel = cgs.gameModels[s1->modelindex2]; + trap_R_AddRefEntityToScene(&ent); + } + +} + +/* +=============== +CG_Beam + +Also called as an event +=============== +*/ +void CG_Beam( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + + s1 = ¢->currentState; + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( s1->pos.trBase, ent.origin ); + VectorCopy( s1->origin2, ent.oldorigin ); + AxisClear( ent.axis ); + ent.reType = RT_BEAM; + + ent.renderfx = RF_NOSHADOW; + + // add to refresh list + trap_R_AddRefEntityToScene(&ent); +} + + +/* +=============== +CG_Portal +=============== +*/ +static void CG_Portal( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + + s1 = ¢->currentState; + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin ); + VectorCopy( s1->origin2, ent.oldorigin ); + ByteToDir( s1->eventParm, ent.axis[0] ); + PerpendicularVector( ent.axis[1], ent.axis[0] ); + + // negating this tends to get the directions like they want + // we really should have a camera roll value + VectorSubtract( vec3_origin, ent.axis[1], ent.axis[1] ); + + CrossProduct( ent.axis[0], ent.axis[1], ent.axis[2] ); + ent.reType = RT_PORTALSURFACE; + ent.oldframe = s1->powerups; + ent.frame = s1->frame; // rotation speed + ent.skinNum = s1->clientNum/256.0 * 360; // roll offset + + // add to refresh list + trap_R_AddRefEntityToScene(&ent); +} + + +/* +================== +PKMOD - CG_BearTrap_Follow, Ergodic 05/30/00 modeled from CG_BearTrap +PKMOD - Ergodic 06/29/00 - modify code to be called by cg_player +PKMOD - Ergodic 07/01/00 - Add blood trails and random displacement +================== +*/ +#define MAX_BEARTRAPS_VIEWABLE 3 +#define MAX_BEARTRAP_DISPLACEMENT 3 +#define BEARTRAP_BLOOD_FREQUENCY 90 + + +static void CG_BeartTrap_BloodTrail( centity_t *cent ) { + localEntity_t *blood; + vec3_t origin; + + VectorCopy( cent->lerpOrigin, origin ); + origin[2] -= 8; + + //PKMOD - Ergodic 12/01/01 - debug vec3_origin (inactive) +// Com_Printf("CG_BearTraps_BloodTrail - vec3_origin>%s<\n", CG_vtos(vec3_origin)); + + blood = CG_SmokePuff( origin, vec3_origin, + 20, // radius + 1, 1, 1, 1, // color + 800, // trailTime + cg.time, // startTime + 0, //12/16/00 - add fadeInTime + 0, // flags + cgs.media.bloodTrailShader ); + + // use the optimized version + blood->leType = LE_FALL_SCALE_FADE; + // drop a total of 40 units over its lifetime + blood->pos.trDelta[2] = 10; +} + + +//PKMOD - Ergodic 07/05/00 add viewheight logic +void CG_BearTrap_Display ( centity_t *cent, int player_viewheight ) { + refEntity_t ent; + +//PKMOD Ergodic debug 06/28/00 +//Com_Printf("CG_BearTraps_Follow - cent->lerpAngles>%s<\n", CG_vtos(cent->lerpAngles)); + + memset( &ent, 0, sizeof( ent ) ); + VectorCopy( cent->lerpOrigin, ent.origin ); + //Add random displacement + ent.origin[0] += (rand() % (MAX_BEARTRAP_DISPLACEMENT * 2 + 1) ) - MAX_BEARTRAP_DISPLACEMENT; + ent.origin[1] += (rand() % (MAX_BEARTRAP_DISPLACEMENT * 2 + 1) ) - MAX_BEARTRAP_DISPLACEMENT; + //PKMOD - Ergodic 07/05/00 add viewheight logic + //PKMOD - Ergodic 07/29/00 modify view height logic for death height + if (player_viewheight == DEFAULT_VIEWHEIGHT) + ent.origin[2] += (rand() % (MAX_BEARTRAP_DISPLACEMENT * 2 + 1) ) - MAX_BEARTRAP_DISPLACEMENT - 6; //above viewheight? + else if (player_viewheight == CROUCH_VIEWHEIGHT) + ent.origin[2] += (rand() % (MAX_BEARTRAP_DISPLACEMENT + 1) ) - (MAX_BEARTRAP_DISPLACEMENT + 24); //below viewheight? + else // else DEAD_VIEWHEIGHT + ent.origin[2] += (rand() % (MAX_BEARTRAP_DISPLACEMENT + 1) ) - (MAX_BEARTRAP_DISPLACEMENT + 29); //death height + + AnglesToAxis( cent->lerpAngles, ent.axis ); +// ent.reType = RT_SPRITE; + ent.hModel = cgs.media.pkabeartrapfollow; +// ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + ent.shaderRGBA[0] = 255; + ent.shaderRGBA[1] = 255; + ent.shaderRGBA[2] = 255; + ent.shaderRGBA[3] = 255; + + trap_R_AddRefEntityToScene( &ent ); + +} + +//PKMOD Ergodic 07/01/00 added more logic - multi-beartraps and blood +//PKMOD - Ergodic 07/05/00 add viewheight logic +//PKMOD - Ergodic 07/10/00 modified to place beartrap on bots +void CG_BearTraps_Follow( centity_t *cent ) { + int i; + int beartrap_count; + int player_viewheight; + +//PKMOD - Ergodic 07/10/00 unpack the beartraps_attached variable +//PKMOD - Ergodic 12/19/00 use time2 instead of angles2 +// player_viewheight = cent->currentState.angles2[BEARTRAPS_ATTACHED] / 100; +// beartrap_count = cent->currentState.angles2[BEARTRAPS_ATTACHED] - (player_viewheight * 100); + beartrap_count = cent->currentState.time2 & 3; //mask of max three beartraps + //PKMOD - Ergodic 07/07/01 - use new packing scheme to encode beartrap viewheight + player_viewheight = ( cent->currentState.time2 >> 2 ) & 3; //mask off the encoded viewheight + + if ( player_viewheight == 0 ) + player_viewheight = DEFAULT_VIEWHEIGHT; + else if ( player_viewheight == CROUCH_VIEWHEIGHT ) + player_viewheight = CROUCH_VIEWHEIGHT; + else + player_viewheight = DEAD_VIEWHEIGHT; + +// player_viewheight -= 50; //un-normalize the viewpoint that was done in bg_misc.c; +//PKMOD Ergodic debug 12/19/00 inactive +//Com_Printf("CG_BearTraps_Follow - cent->lerpAngles>%s<\n", CG_vtos(cent->lerpAngles)); + + for (i = 1; i <= beartrap_count; i++) { + if (i > MAX_BEARTRAPS_VIEWABLE) //don't display more than MAX_BEARTRAPS_VIEWABLE beartraps + break; + CG_BearTrap_Display ( cent, player_viewheight ); + } + + if (BEARTRAP_BLOOD_FREQUENCY > ( rand() % 100 ) ) + CG_BeartTrap_BloodTrail( cent ); + +} + + +/* +================== +PKMOD - CG_BearTrap, Ergodic 05/30/00 modeled from CG_ITEM +================== +*/ + +static void CG_BearTrap( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + const weaponInfo_t *weapon; + + //PKMOD - Ergodic 12/13/03 - add timing for animation + int msec; + + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + + // add trails + if ( weapon->missileTrailFunc ) + { + weapon->missileTrailFunc( cent, weapon ); + } + + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + } + + // add missile sound + if ( weapon->missileSound ) { + vec3_t velocity; + + BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); + } + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // flicker between two skins + ent.skinNum = cg.clientFrame & 1; + + //PKMOD - Ergodic 08/07/00 - set axis so that beartrap will fly flat + AxisClear( ent.axis ); + + + // spin as it moves +// if ( s1->pos.trType != TR_STATIONARY ) { +// RotateAroundDirection( ent.axis, cg.time / 4 ); +// } else { + RotateAroundDirection( ent.axis, s1->time ); +// } + + + //PKMOD - Ergodic 03/23/01 - add team parameters + switch ( cent->currentState.modelindex ) { + case TEAM_RED: + ent.hModel = cgs.media.pkabeartrap_red; + break; + case TEAM_BLUE: + ent.hModel = cgs.media.pkabeartrap_blue; + break; + default: + ent.hModel = cgs.media.pkabeartrap; + ent.frame = 0; + //PKMOD - Ergodic 07/17/03 - set animation frame based on entity duration. + // The beartrap model has 55 frames (0..54) of animation. + // + // Want to show 55 frames in 2500 milliseconds (2.5 second). + // Thus, each frame is shown for 2500/55 = ~45 milliseconds per frame + + //PKMOD - Ergodic 10/10/03 - [UPDATE] animation frame based on generic1 + + //PKMOD - Ergodic 10/10/03 - Co-opt the centity_t variables: + // PKA_RadiateTime :: last invisibility charge state; + // PKA_RadiateInfectTime :: time for particle effect; + + if ( s1->generic1 ) { + //here if Beartrap has a charge... + + //PKMOD - Ergodic 10/10/03 - Check if particles should be displayed + // Display particles if duration for particle effect is current + + //has the invisibility charge changed? + if ( s1->generic1 != cent->PKA_RadiateTime ) { + cent->PKA_RadiateTime = s1->generic1; //Set client invisibility state + cent->PKA_RadiateInfectTime = cg.time + 750; //every 3/4 seconds + } + + //is the invisibility duration still in effect? + if ( cent->PKA_RadiateInfectTime > cg.time ) { + //PKMOD - Ergodic 07/18/03 - calculate the position of the beartrap's "particle_tag" + int i; + orientation_t lerped; + vec3_t particles; + + //particle parameters + vec3_t vel; + int duration; + float x_offset; + float y_offset; + float speed; + int indx; + vec3_t spark_origin; + + /*+++++ + // Determine the location of the particles + //----*/ + //void CG_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + // qhandle_t parentModel, char *tagName ) { + // lerp the tag (HERE: msec is the frame) + + //calculate particle frame based on generic1 with values of [0 ... MAX_INVISIBILITY_CHARGE] + // within a total of 55 frames of animation + msec = 55 * s1->generic1 / MAX_INVISIBILITY_CHARGE; + + ent.frame = msec; + + trap_R_LerpTag( &lerped, ent.hModel, msec, msec, 1.0 - ent.backlerp, "tag_particles" ); + VectorCopy( ent.origin, particles ); + for ( i = 0 ; i < 3 ; i++ ) { + VectorMA( particles, lerped.origin[i], ent.axis[i], particles ); + } + + /*+++++ + // Show the particles + //----*/ + VectorCopy(particles, spark_origin); + spark_origin[2] += 5; + + for ( indx = 1; indx < 2; indx++ ) { + vel[0] = 2 * crandom(); + vel[1] = 2 * crandom(); + //PKMOD - Ergodic 10/15/03 - force all particles up + vel[2] = 10 * random(); + + //PKMOD - Ergodic 10/15/03 - vary the duration + duration = 750 + 50 * crandom(); + + x_offset = 2 * crandom(); + y_offset = 2 * crandom(); + + speed = 5 * crandom(); + + //PKMOD - Ergodic 07/20/03 - draw midsized particles... + CG_ParticleSparks3 (spark_origin, vel, duration, x_offset, y_offset, speed); + } + } + + } + else //here if s1->generic1 + //PKMOD - Ergodic 07/17/03 - default msec to 0 + msec = 0; + + + + //PKMOD - Ergodic 07/18/03 - set custom shader for the invisibility process + // The Beartrap has 20 shaders to apply + // + // Want to show 20 shaders in 2500 milliseconds (2.5 seconds) + // Thus each shader is show for 2500/20 = ~125 milliseconds per shader + //PKMOD - Ergodic 08/18/03 - only show invisible shaders if beartrap hit the floor + + //PKMOD - Ergodic 10/10/04 - [UPDATE] shader frame based on generic1 + + //calculate particle frame based on generic1 with values of [0 ... MAX_INVISIBILITY_CHARGE] + // within a total of 20 invisibility shaders + msec = 20 * s1->generic1 / MAX_INVISIBILITY_CHARGE; + + switch ( msec ) { + case 0: + ent.customShader = cgs.media.pkainvisbeartrap1; + break; + case 1: + ent.customShader = cgs.media.pkainvisbeartrap2; + break; + case 2: + ent.customShader = cgs.media.pkainvisbeartrap3; + break; + case 3: + ent.customShader = cgs.media.pkainvisbeartrap4; + break; + case 4: + ent.customShader = cgs.media.pkainvisbeartrap5; + break; + case 5: + ent.customShader = cgs.media.pkainvisbeartrap6; + break; + case 6: + ent.customShader = cgs.media.pkainvisbeartrap7; + break; + case 7: + ent.customShader = cgs.media.pkainvisbeartrap8; + break; + case 8: + ent.customShader = cgs.media.pkainvisbeartrap9; + break; + case 9: + ent.customShader = cgs.media.pkainvisbeartrap10; + break; + case 10: + ent.customShader = cgs.media.pkainvisbeartrap11; + break; + case 11: + ent.customShader = cgs.media.pkainvisbeartrap12; + break; + case 12: + ent.customShader = cgs.media.pkainvisbeartrap13; + break; + case 13: + ent.customShader = cgs.media.pkainvisbeartrap14; + break; + case 14: + ent.customShader = cgs.media.pkainvisbeartrap15; + break; + case 15: + ent.customShader = cgs.media.pkainvisbeartrap16; + break; + case 16: + ent.customShader = cgs.media.pkainvisbeartrap17; + break; + case 17: + ent.customShader = cgs.media.pkainvisbeartrap18; + break; + case 18: + ent.customShader = cgs.media.pkainvisbeartrap19; + break; + default: + ent.customShader = cgs.media.pkainvisbeartrap20; + break; + } + break; + } + + + ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + + // add to refresh list, possibly with quad glow + CG_AddRefEntityWithPowerups( &ent, s1, TEAM_FREE ); +} + + +/* +================== +PKMOD - CG_AutoSentry, Ergodic 11/22/00 modeled from CG_BearTrap + +changes: Ergodic 05/31/02 - add new animated models +================== +*/ + +static void CG_AutoSentry( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + const weaponInfo_t *weapon; + vec3_t hold_dir; + + //PKMOD - Ergodic 11/25/00 add timing for animation + int msec; + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + //PKMOD Ergodic 11/26/00 + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + + //PKMOD Ergodic debug 11/26/00 - inactive +// if ( (rand() % 1000) > 975 ) +// Com_Printf("CG_AutoSentry - lerpAngles>%s<\n", CG_vtos( cent->lerpAngles ) ); + + + // add trails + if ( weapon->missileTrailFunc ) + { + weapon->missileTrailFunc( cent, weapon ); + } + + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + } + + // add missile sound + if ( weapon->missileSound ) { + vec3_t velocity; + + BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); + } + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // flicker between two skins + ent.skinNum = cg.clientFrame & 1; +// ent.hModel = cgs.media.pkasentry_pickup; + + //PKMOD - Ergodic 11/25/00 add timing for animation + // every 0.15 seconds (150 milliseconds) + // if miscTime has not been set, by drop event, then model + // should default to folded type + + //PKMOD - Ergodic 06/01/02 - remove the following old animation code +// if ( cent->miscTime ) +// msec = ( cg.time - cent->miscTime ) / 150; +// else +// msec = 0; + + //PKMOD - Ergodic 06/01/02 - set animation frame based on entity duration. + // The autosentry model has 30 frames (1..30) of animation that is reversed + // in time. Frame 1 is the final animation frame and frame 30 is the first + // animation frame. + // + // each animation frame is 1/30 seconds in duration. + // 1/30 seconds ~ 35 MilliSeconds + // 30 frames * 35 MS/frame = 1050 milliseconds + if ( cent->miscTime ) + msec = ( cg.time - cent->miscTime ) / 35; + else + //PKMOD - Ergodic 10/22/02 - default msec to 0 + //msec = 29; //was 29 -> produced a deployed sentry when launched + msec = 0; + + //PKMOD - Ergodic 06/01/02 - calculate the frame + if ( msec > 29 ) + ent.frame = 0; + else + ent.frame = 29 - msec; + + //PKMOD Ergodic debug 06/02/02 - debug autosentry animations (inactive) +// if ( (rand() % 1000) > 900 ) +// Com_Printf("CG_AutoSentry - msec: %d, miscTime: %d\n", msec, cent->miscTime ); + + //PKMOD Ergodic debug 11/26/00 - inactive +// if ( (rand() % 1000) > 200 ) +// Com_Printf("CG_AutoSentry 0 - msec: %d, miscTime: %d\n", msec, cent->miscTime ); + + //PKMOD - Ergodic 03/20/01 - add team parameters + switch ( cent->currentState.modelindex ) { + case TEAM_RED: + ent.hModel = cgs.media.pkasentry_red; + break; + case TEAM_BLUE: + ent.hModel = cgs.media.pkasentry_blue; + break; + default: + ent.hModel = cgs.media.pkasentry; + break; + } + + ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + + // convert direction of travel into axis +// if ( VectorNormalize2( s1->pos.trDelta, ent.axis[0] ) == 0 ) { +// ent.axis[0][1] = 1; +// ent.axis[0][1] = 1; +// ent.axis[0][0] = 1; +// } + + //PKMOD - Ergodic 08/07/00 - set axis so that autosentry will fly flat +// AxisClear( ent.axis ); + + //PKMOD Ergodic 11/26/00 - set the initial direction +// VectorCopy( cent->lerpAngles, ent.axis[0] ); +// RotateAroundDirection( ent.axis, s1->time ); + + +// hold_dir[0] = cent->lerpAngles[0]; +// hold_dir[1] = cent->lerpAngles[1]; +// hold_dir[2] = 0; + +// if ( VectorNormalize2( hold_dir, ent.axis[0] ) == 0 ) { +// ent.axis[0][2] = 1; +// } + + + //PKMOD Ergodic 11/27/00 - Finally - This works! + vectoangles( cent->lerpAngles, hold_dir); + hold_dir[0] = 0; + hold_dir[1] -= 90; //offset + hold_dir[2] = 0; + AnglesToAxis( hold_dir, ent.axis ); + + //PKMOD Ergodic 11/26/00 - remove this +// AxisCopy( cg.autoAxis, ent.axis ); + + //PKMOD Ergodic 11/26/00 - remove this +// RotateAroundDirection( ent.axis, hold_dir[YAW] ); + + //PKMOD Ergodic 11/26/00 - add entity to scene + trap_R_AddRefEntityToScene (&ent); + + + // add to refresh list, possibly with quad glow +// CG_AddRefEntityWithPowerups( &ent, s1->powerups, TEAM_FREE ); +} + +/* +================== +PKMOD - CG_AutoSentry_Base, Ergodic 12/02/00 modeled from CG_AutoSentry +changes: Ergodic 12/13/03 - install invisibility code +================== +*/ + +static void CG_AutoSentry_Base( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + const weaponInfo_t *weapon; + vec3_t hold_dir; + + //PKMOD - Ergodic 12/13/03 - add timing for animation + int msec; + + //PKMOD Ergodic debug 12/02/00 - inactive +// if ( (rand() % 1000) > 900 ) +// Com_Printf( "CG_AutoSentry_Base\n" ); + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + //PKMOD Ergodic 11/26/00 + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + + //PKMOD Ergodic debug 11/26/00 - inactive +// if ( (rand() % 1000) > 975 ) +// Com_Printf("CG_AutoSentry - lerpAngles>%s<\n", CG_vtos( cent->lerpAngles ) ); + + + // add trails + if ( weapon->missileTrailFunc ) + { + weapon->missileTrailFunc( cent, weapon ); + } + + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + } + + // add missile sound + if ( weapon->missileSound ) { + vec3_t velocity; + + BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); + } + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // flicker between two skins + ent.skinNum = cg.clientFrame & 1; + + //PKMOD - Ergodic 03/20/01 - add team parameters + switch ( cent->currentState.modelindex ) { + case TEAM_RED: + ent.hModel = cgs.media.pkasentry_base_red; + break; + case TEAM_BLUE: + ent.hModel = cgs.media.pkasentry_base_blue; + break; + default: + ent.hModel = cgs.media.pkasentry_base; + //PKMOD - Ergodic 10/10/03 - Install invisibility function + // Autosentry_Base will not show particles + + //PKMOD - Ergodic 07/18/03 - set custom shader for the invisibility process + // The Autosentry has 20 shaders to apply + // + // Want to show 20 shaders in 2500 milliseconds (2.5 seconds) + // Thus each shader is show for 2500/20 = ~125 milliseconds per shader + //PKMOD - Ergodic 08/18/03 - only show invisible shaders if beartrap hit the floor + + //PKMOD - Ergodic 10/10/04 - [UPDATE] shader frame based on generic1 + + //calculate particle frame based on generic1 with values of [0 ... MAX_INVISIBILITY_CHARGE] + // within a total of 20 invisibility shaders + msec = 20 * s1->generic1 / MAX_INVISIBILITY_CHARGE; + + switch ( msec ) { + case 0: + ent.customShader = cgs.media.pkainvisautosentry1; + break; + case 1: + ent.customShader = cgs.media.pkainvisautosentry2; + break; + case 2: + ent.customShader = cgs.media.pkainvisautosentry3; + break; + case 3: + ent.customShader = cgs.media.pkainvisautosentry4; + break; + case 4: + ent.customShader = cgs.media.pkainvisautosentry5; + break; + case 5: + ent.customShader = cgs.media.pkainvisautosentry6; + break; + case 6: + ent.customShader = cgs.media.pkainvisautosentry7; + break; + case 7: + ent.customShader = cgs.media.pkainvisautosentry8; + break; + case 8: + ent.customShader = cgs.media.pkainvisautosentry9; + break; + case 9: + ent.customShader = cgs.media.pkainvisautosentry10; + break; + case 10: + ent.customShader = cgs.media.pkainvisautosentry11; + break; + case 11: + ent.customShader = cgs.media.pkainvisautosentry12; + break; + case 12: + ent.customShader = cgs.media.pkainvisautosentry13; + break; + case 13: + ent.customShader = cgs.media.pkainvisautosentry14; + break; + case 14: + ent.customShader = cgs.media.pkainvisautosentry15; + break; + case 15: + ent.customShader = cgs.media.pkainvisautosentry16; + break; + case 16: + ent.customShader = cgs.media.pkainvisautosentry17; + break; + case 17: + ent.customShader = cgs.media.pkainvisautosentry18; + break; + case 18: + ent.customShader = cgs.media.pkainvisautosentry19; + break; + default: + ent.customShader = cgs.media.pkainvisautosentry20; + break; + } + break; + } + + ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + + //PKMOD Ergodic 11/27/00 - Finally - This works! + vectoangles( cent->lerpAngles, hold_dir); + hold_dir[0] = 0; + hold_dir[1] -= 90; //offset + hold_dir[2] = 0; + AnglesToAxis( hold_dir, ent.axis ); + + //PKMOD Ergodic 11/26/00 - add entity to scene + trap_R_AddRefEntityToScene (&ent); + + // add to refresh list, possibly with quad glow +// CG_AddRefEntityWithPowerups( &ent, s1->powerups, TEAM_FREE ); +} + + +/* +================== +PKMOD - CG_AutoSentry_Turret, Ergodic 12/02/00 modeled from CG_AutoSentry + modified 12/28/00 to add flash when firing +changes: Ergodic 12/13/03 - install invisibility code +================== +*/ + +static void CG_AutoSentry_Turret( centity_t *cent ) { + refEntity_t turret; + refEntity_t flash; + entityState_t *s1; + const weaponInfo_t *weapon; +// vec3_t hold_dir; //020522 - do not need +// vec3_t hold_autosentry_forward; //020522 - do not need +// int debug_yaw; + vec3_t angles; + //PKMOD - Ergodic 04/12/01 - add quad effects + qhandle_t quadShader; +// float hold_angle; +// vec3_t hold_angles; //020522 - debug variable (inactive) + //PKMOD - Ergodic 12/13/01 add timing for invisible shaders + int msec; + + //PKMOD Ergodic debug 12/02/00 - inactive +// if ( (rand() % 1000) > 900 ) +// Com_Printf( "CG_AutoSentry_Turret\n" ); + + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + //PKMOD Ergodic 11/26/00 + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + //PKMOD - Ergodic 05/22/02 - do not need +// AngleVectorsForward( cent->lerpAngles, hold_autosentry_forward ); + + //PKMOD Ergodic debug 05/18/02 (inactive) +// if ( (rand() % 1000) > 975 ) { +// VectorScale( s1->angles, 100, hold_angles); +// Com_Printf("CG_AutoSentry - lerpAngles>%s<, hold_angles>%s<\n", CG_vtos( cent->lerpAngles ), CG_vtos( hold_angles ) ); +// } + + // add trails + if ( weapon->missileTrailFunc ) + { + weapon->missileTrailFunc( cent, weapon ); + } + + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + } + + // add missile sound + if ( weapon->missileSound ) { + vec3_t velocity; + + BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); + } + + // create the render entity + memset (&turret, 0, sizeof(turret)); + VectorCopy( cent->lerpOrigin, turret.origin); + VectorCopy( cent->lerpOrigin, turret.oldorigin); + + // setup skins + turret.skinNum = cg.clientFrame & 1; + turret.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + + //PKMOD - Ergodic 03/20/01 - add team parameters + switch ( cent->currentState.modelindex ) { + case TEAM_RED: + quadShader = cgs.media.redQuadShader; + turret.hModel = cgs.media.pkasentry_turret_red; + break; + case TEAM_BLUE: + quadShader = cgs.media.quadShader; + turret.hModel = cgs.media.pkasentry_turret_blue; + break; + default: + quadShader = cgs.media.quadShader; + turret.hModel = cgs.media.pkasentry_turret; + //PKMOD - Ergodic 10/10/03 - Install invisibility function + // Co-opt the centity_t variables: + // PKA_RadiateTime :: last invisibility charge state; + // PKA_RadiateInfectTime :: time for particle effect; + + //PKMOD Ergodic 12/13/02 - debug invisibility (inactive) + //Com_Printf("CG_AutoSentry_Turret - invisibility charge>%d<\n", s1->generic1 ); + + if ( s1->generic1 ) { + //here if autosentry has a charge... + + //PKMOD - Ergodic 10/10/03 - Check if particles should be displayed + // Display particles if duration for particle effect is current + + //has the invisibility charge changed? + if ( s1->generic1 != cent->PKA_RadiateTime ) { + cent->PKA_RadiateTime = s1->generic1; //Set client invisibility state + cent->PKA_RadiateInfectTime = cg.time + 750; //every 3/4 seconds + } + + //is the invisibility duration still in effect? + if ( cent->PKA_RadiateInfectTime > cg.time ) { + //PKMOD - Ergodic 07/18/03 - calculate the position of the beartrap's "particle_tag" + int i; + orientation_t lerped; + vec3_t particles; + + //particle parameters + vec3_t vel; + int duration; + float x_offset; + float y_offset; + float speed; + int indx; + vec3_t spark_origin; + + /*+++++ + // Determine the location of the particles + //----*/ + if ( rand() % 2 ) + trap_R_LerpTag( &lerped, turret.hModel, msec, msec, 1.0 - turret.backlerp, "tag_flash_1" ); + else + trap_R_LerpTag( &lerped, turret.hModel, msec, msec, 1.0 - turret.backlerp, "tag_flash_2" ); + VectorCopy( turret.origin, particles ); + for ( i = 0 ; i < 3 ; i++ ) { + VectorMA( particles, lerped.origin[i], turret.axis[i], particles ); + } + + /*+++++ + // Show the particles + //----*/ + VectorCopy(particles, spark_origin); + spark_origin[2] += 5; + + //PKMOD - Ergodic 12/13/03 - add more particles from 2 to 4 + for ( indx = 1; indx < 4; indx++ ) { + vel[0] = 2 * crandom(); + vel[1] = 2 * crandom(); + //PKMOD - Ergodic 10/15/03 - force all particles up + vel[2] = 10 * random(); + + //PKMOD - Ergodic 10/15/03 - vary the duration + duration = 750 + 50 * crandom(); + + x_offset = 2 * crandom(); + y_offset = 2 * crandom(); + + speed = 5 * crandom(); + + //PKMOD - Ergodic 07/20/03 - draw midsized particles... + CG_ParticleSparks3 (spark_origin, vel, duration, x_offset, y_offset, speed); + } + } + + } + else //here if s1->generic1 + //PKMOD - Ergodic 07/17/03 - default msec to 0 + msec = 0; + + + + //PKMOD - Ergodic 07/18/03 - set custom shader for the invisibility process + // The Autosentry has 20 shaders to apply + // + // Want to show 20 shaders in 2500 milliseconds (2.5 seconds) + // Thus each shader is show for 2500/20 = ~125 milliseconds per shader + //PKMOD - Ergodic 08/18/03 - only show invisible shaders if beartrap hit the floor + + //PKMOD - Ergodic 10/10/04 - [UPDATE] shader frame based on generic1 + + //calculate particle frame based on generic1 with values of [0 ... MAX_INVISIBILITY_CHARGE] + // within a total of 20 invisibility shaders + msec = 20 * s1->generic1 / MAX_INVISIBILITY_CHARGE; + + switch ( msec ) { + case 0: + turret.customShader = cgs.media.pkainvisautosentry1; + break; + case 1: + turret.customShader = cgs.media.pkainvisautosentry2; + break; + case 2: + turret.customShader = cgs.media.pkainvisautosentry3; + break; + case 3: + turret.customShader = cgs.media.pkainvisautosentry4; + break; + case 4: + turret.customShader = cgs.media.pkainvisautosentry5; + break; + case 5: + turret.customShader = cgs.media.pkainvisautosentry6; + break; + case 6: + turret.customShader = cgs.media.pkainvisautosentry7; + break; + case 7: + turret.customShader = cgs.media.pkainvisautosentry8; + break; + case 8: + turret.customShader = cgs.media.pkainvisautosentry9; + break; + case 9: + turret.customShader = cgs.media.pkainvisautosentry10; + break; + case 10: + turret.customShader = cgs.media.pkainvisautosentry11; + break; + case 11: + turret.customShader = cgs.media.pkainvisautosentry12; + break; + case 12: + turret.customShader = cgs.media.pkainvisautosentry13; + break; + case 13: + turret.customShader = cgs.media.pkainvisautosentry14; + break; + case 14: + turret.customShader = cgs.media.pkainvisautosentry15; + break; + case 15: + turret.customShader = cgs.media.pkainvisautosentry16; + break; + case 16: + turret.customShader = cgs.media.pkainvisautosentry17; + break; + case 17: + turret.customShader = cgs.media.pkainvisautosentry18; + break; + case 18: + turret.customShader = cgs.media.pkainvisautosentry19; + break; + default: + turret.customShader = cgs.media.pkainvisautosentry20; + break; + } + break; + } + + //PKMOD Ergodic 11/27/00 - Finally - This works! + //PKMOD - Ergodic 02/09/02 - modify this +// vectoangles( cent->lerpAngles, hold_dir); + + //PKMOD Ergodic 12/02/00 - debug inactive +// if ( (rand() % 1000) > 975 ) { +// debug_yaw = hold_dir[1]; +// Com_Printf("CG_AutoSentry_Turret - debug_yaw>%d<\n", debug_yaw ); +// } + + //PKMOD - Ergodic 05/17/02 - no need to touch the angles.. +// hold_dir[0] += 30; +// hold_dir[1] -= 90; //offset +// hold_dir[2] -= 30; +// AnglesToAxis( hold_dir, turret.axis ); + //PKMOD - Ergodic 02/18/02 - add this... +// AngleVectors( hold_dir, turret.axis[0], turret.axis[1], turret.axis[2] ); + + //PKMOD - 02/08/02 - new axis code +// if ( VectorNormalize2( cent->lerpAngles, turret.axis[0] ) == 0 ) { +// turret.axis[0][2] = 1; +// } + +//>>>>> + //PKMOD - Ergodic 05/19/02 - new axis code (revisited) + // convert direction of travel into axis +// if ( VectorNormalize2( hold_dir, turret.axis[0] ) == 0 ) { +// turret.axis[0][2] = 1; +// } + +// AngleVectors (hold_angles, hold_forward, hold_right, hold_up); +// vectorCopy( cent->lerpAngles, hold_dir); + AnglesToAxis( cent->lerpAngles, turret.axis ); + +// AngleVectorsForward( cent->lerpAngles, hold_autosentry_forward ); +// AnglesToAxis( hold_autosentry_forward, turret.axis ); + trap_R_AddRefEntityToScene ( &turret ); + +// RotateAroundDirection( turret.axis, s1->time ); + + // add to refresh list, possibly with quad glow +// CG_AddRefEntityWithPowerups( &turret, s1, TEAM_FREE ); +//>>>>> + + //PKMOD Ergodic 06/29/01 - use pos.trDelta to compute angle + // convert direction of travel into axis +// if ( VectorNormalize2( s1->pos.trDelta, turret.axis[0] ) == 0 ) { +// turret.axis[0][2] = 1; +// } + +// vectoangles( s1->pos.trDelta, hold_dir ); + //PKMOD - Ergodic 02/18/02 - remove this... +// AnglesToAxis( hold_dir, turret.axis ); + + + + //PKMOD Ergodic 11/26/00 - add entity to scene +// trap_R_AddRefEntityToScene ( &turret ); + + // add to refresh list, possibly with quad glow +// CG_AddRefEntityWithPowerups( &ent, s1->powerups, TEAM_FREE ); + + //PKMOD - Ergodic 04/12/01 - add quad effects if enabled in co-opted variable:time2 + if ( s1->time2 & 2 ) { + trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.2f, 0.2f, 1 ); + turret.customShader = quadShader; + trap_R_AddRefEntityToScene( &turret ); + } + + //PKMOD - Ergodic 12/28/00 - add firing logic (co-opt the time2 variable) + //PKMOD - Ergodic 04/12/01 - modify so that time2 will be a packed variable + if ( !( s1->time2 & 1) ) //if not firing then return + return; + + memset( &flash, 0, sizeof( flash ) ); + VectorCopy( cent->lerpOrigin, flash.lightingOrigin ); +// flash.shadowPlane = RF_SHADOW_PLANE; + flash.renderfx = RF_MINLIGHT; + + flash.hModel = cgs.media.autosentryFlashModel; + cent->muzzleFlashTime = cg.time + 100; + + angles[YAW] = 0; + angles[PITCH] = 0; + angles[ROLL] = crandom() * 10; + AnglesToAxis( angles, flash.axis ); + + if ( random() > 0.5 ) //50 Percent + CG_PositionRotatedEntityOnTag( &flash, &turret, cgs.media.pkasentry_turret, "tag_flash_1"); + else + CG_PositionRotatedEntityOnTag( &flash, &turret, cgs.media.pkasentry_turret, "tag_flash_2"); + + trap_R_AddRefEntityToScene( &flash ); + + +} + + +/* +=============== +PKMOD - CG_ChainShaft, Ergodic 07/12/00 display the inter-player lightning shafts + + loosely based on CG_LightningBolt + +Origin will be the exact tag point, which is slightly +different than the muzzle point used for determining hits. +The cent should be the non-predicted cent if it is from the player, +so the endpoint will reflect the simulated strike (lagging the predicted +angle) +=============== +*/ + +//Ergodic - 07/12/00 this code is superceded by CG_ChainLightning and should be removed +void CG_ChainShaft( entityState_t *es ) { + refEntity_t beam; + vec3_t angles; + vec3_t dir; + + //PKMOD Ergodic debug 07/12/00 +//Com_Printf("CG_ChainShaft - origin>%s<, angles>%s<\n", CG_vtos(es->origin), CG_vtos(es->angles)); + + + memset( &beam, 0, sizeof( beam ) ); + + VectorCopy( es->origin, beam.origin ); + VectorCopy( es->angles, beam.oldorigin ); //PKMOD - Ergodic 07/12/00 - co-opt hack: angles = target->origin + +//PKMOD - Ergodic 08/21/00 change flash to railgun style to make a tighter beam + beam.reType = RT_RAIL_CORE; +// beam.reType = RT_LIGHTNING; + //PKMOD - Ergodic 08/21/00 set the shader to chainlightning + beam.customShader = cgs.media.chainlightningShader; + trap_R_AddRefEntityToScene( &beam ); + + // add the impact flare if it hit something + + VectorSubtract( beam.oldorigin, beam.origin, dir ); + VectorNormalize( dir ); + + memset( &beam, 0, sizeof( beam ) ); + beam.hModel = cgs.media.lightningExplosionModel; + + VectorMA( beam.oldorigin, -16, dir, beam.origin ); + + // make a random orientation + angles[0] = rand() % 360; + angles[1] = rand() % 360; + angles[2] = rand() % 360; + AnglesToAxis( angles, beam.axis ); + trap_R_AddRefEntityToScene( &beam ); + +} + +void CG_ChainLightning( centity_t *cent ) { + refEntity_t beam; + entityState_t *es; + vec3_t angles; +// vec3_t dir; //05/12/02 - don't need this variable + + es = ¢->currentState; +//PKMOD - Ergodic 07/12/00 - debug inactive +//Com_Printf("CG_ChainShaft - start\n"); +// if ( (rand() % 1000) > 950 ) +// Com_Printf("CG_ChainLightning - origin>%s<, angles>%s<\n", CG_vtos(cent->lerpOrigin), CG_vtos(es->angles)); + + //PKMOD - Ergodic 05/12/02 - debug 000 location of clg beam (inactive) +// Com_Printf("CG_ChainLightning - time>%d<, origin>%s<, angles>%s<\n", cg.time, CG_vtos(cent->lerpOrigin), CG_vtos(es->angles)); + + + memset( &beam, 0, sizeof( beam ) ); + + VectorCopy( cent->lerpOrigin, beam.origin ); + VectorCopy( es->angles, beam.oldorigin ); //PKMOD - Ergodic 07/12/00 - co-opt hack: angles = target->origin + +//PKMOD - Ergodic 08/21/00 change flash to railgun style to make a tighter beam + beam.reType = RT_RAIL_CORE; +// beam.reType = RT_LIGHTNING; + //PKMOD - Ergodic 08/21/00 set the shader to chainlightning + beam.customShader = cgs.media.chainlightningShader; + trap_R_AddRefEntityToScene( &beam ); + + // add the impact flare if it hit something + + //PKMOD - Ergodic 05/12/02 - don't need to do these next two steps +// VectorSubtract( beam.oldorigin, beam.origin, dir ); +// VectorNormalize( dir ); + + memset( &beam, 0, sizeof( beam ) ); + //PKMOD - Ergodic 05/12/02 - reinitialize the location of lightning explosion + VectorCopy( es->angles, beam.origin ); //PKMOD - Ergodic 07/12/00 - co-opt hack: angles = target->origin + + beam.hModel = cgs.media.lightningExplosionModel; + + //test comment 12/05/00 +// VectorMA( beam.oldorigin, -16, dir, beam.origin ); + + // make a random orientation + angles[0] = rand() % 360; + angles[1] = rand() % 360; + angles[2] = rand() % 360; + AnglesToAxis( angles, beam.axis ); + trap_R_AddRefEntityToScene( &beam ); + +} + +//PKMOD - Ergodic 08/20/032 - copy of CG_ChainLightning for use in shooter lightning effect +void CG_ShooterLightning( centity_t *cent ) { + refEntity_t beam; + entityState_t *es; + vec3_t angles; +// vec3_t dir; //05/12/02 - don't need this variable + + es = ¢->currentState; +//PKMOD - Ergodic 07/12/00 - debug inactive +//Com_Printf("CG_ChainShaft - start\n"); +// if ( (rand() % 1000) > 950 ) +// Com_Printf("CG_ChainLightning - origin>%s<, angles>%s<\n", CG_vtos(cent->lerpOrigin), CG_vtos(es->angles)); + + //PKMOD - Ergodic 05/12/02 - debug 000 location of clg beam (inactive) +// Com_Printf("CG_ChainLightning - time>%d<, origin>%s<, angles>%s<\n", cg.time, CG_vtos(cent->lerpOrigin), CG_vtos(es->angles)); + + + memset( &beam, 0, sizeof( beam ) ); + + VectorCopy( cent->lerpOrigin, beam.origin ); + VectorCopy( es->angles, beam.oldorigin ); //PKMOD - Ergodic 07/12/00 - co-opt hack: angles = target->origin + +//PKMOD - Ergodic 08/21/00 change flash to railgun style to make a tighter beam + beam.reType = RT_RAIL_CORE; +// beam.reType = RT_LIGHTNING; + //PKMOD - Ergodic 08/21/00 set the shader to chainlightning + beam.customShader = cgs.media.shooterlightningShader; + trap_R_AddRefEntityToScene( &beam ); + + // add the impact flare if it hit something + + //PKMOD - Ergodic 05/12/02 - don't need to do these next two steps +// VectorSubtract( beam.oldorigin, beam.origin, dir ); +// VectorNormalize( dir ); + + memset( &beam, 0, sizeof( beam ) ); + //PKMOD - Ergodic 05/12/02 - reinitialize the location of lightning explosion + VectorCopy( es->angles, beam.origin ); //PKMOD - Ergodic 07/12/00 - co-opt hack: angles = target->origin + + beam.hModel = cgs.media.lightningExplosionModel; + + //test comment 12/05/00 +// VectorMA( beam.oldorigin, -16, dir, beam.origin ); + + // make a random orientation + angles[0] = rand() % 360; + angles[1] = rand() % 360; + angles[2] = rand() % 360; + AnglesToAxis( angles, beam.axis ); + trap_R_AddRefEntityToScene( &beam ); + +} + + +/* +================== +PKMOD - CG_Nail, Ergodic 08/03/00 display the Nail +================== +*/ +static void CG_Nail( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + + s1 = ¢->currentState; + + memset (&ent, 0, sizeof(ent)); + + // set frame + + ent.frame = s1->frame; + ent.oldframe = ent.frame; + ent.backlerp = 0; + + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + ent.hModel = cgs.media.nail1; + + +// VectorSet(ent.axis[1], 0,0,0); +// VectorSet(ent.axis[2], 0,0,0); + + VectorCopy( s1->apos.trBase, ent.axis[0] ); + RotateAroundDirection( ent.axis, s1->time ); + + //Ergodic debug - 08/04/00 - inactive +// Com_Printf("CG_Nail - ent.axis[0]>%s<, [1]>%s<, [2]>%s<\n", CG_vtos(ent.axis[0]), CG_vtos(ent.axis[1]), CG_vtos(ent.axis[2]) ); + + + // add to refresh list + trap_R_AddRefEntityToScene (&ent); +} + +/* +================== +PKMOD - CG_Dragon_Deploy, Ergodic 03/14/01 - add dragon deployable model + + Will display the deployed model after it is launched form the dragon +================== +*/ + +static void CG_Dragon_Deploy( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + const weaponInfo_t *weapon; //weapon == dragon + const weaponInfo_t *weapon_deployed; //weapon2 == deployable weapon + vec3_t hold_dir; + + + s1 = ¢->currentState; + if ( s1->weapon > WP_NUM_WEAPONS ) { + s1->weapon = 0; + } + weapon = &cg_weapons[s1->weapon]; + + // calculate the axis + VectorCopy( s1->angles, cent->lerpAngles); + + // add trails + if ( weapon->missileTrailFunc ) + { + weapon->missileTrailFunc( cent, weapon ); + } + + // add dynamic light + if ( weapon->missileDlight ) { + trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, + weapon->missileDlightColor[0], weapon->missileDlightColor[1], weapon->missileDlightColor[2] ); + } + + // add missile sound + if ( weapon->missileSound ) { + vec3_t velocity; + + BG_EvaluateTrajectoryDelta( ¢->currentState.pos, cg.time, velocity ); + + //PKMOD - Ergodic 02/14/02 - add bladewhirl sound if gauntlet, else play standard sound + if ( ( s1->generic1 & 15 ) == WP_GAUNTLET ) + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->flashSound[3] ); + else + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, velocity, weapon->missileSound ); + } + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // flicker between two skins + ent.skinNum = cg.clientFrame & 1; + + //get the deployed weapon's information + weapon_deployed = &cg_weapons[ s1->generic1 & 15 ]; + + //PKMOD - Ergodic 08/07/00 - set axis so that beartrap will fly flat + AxisClear( ent.axis ); + + //add the appropriate model + switch ( s1->generic1 & 15 ) { + case WP_GRAVITY: + ent.hModel = weapon_deployed->weaponModel; + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - WP_GRAVITY\n" ); + break; + case WP_SENTRY: +// ent.hModel = weapon_deployed->weaponModel; + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - WP_SENTRY\n" ); + //PKMOD - Ergodic 07/11/01 - rotate autosentry by 90 degrees + // calculate the axis + vectoangles( cent->lerpAngles, hold_dir); + hold_dir[0] = 0; + hold_dir[1] -= 90; //offset + hold_dir[2] = 0; + AnglesToAxis( hold_dir, ent.axis ); + + //PKMOD - Ergodic 06/02/02 - set the autosentry frame + ent.frame = 29; + + //PKMOD - Ergodic 06/23/01 - add team parameters + switch ( cent->currentState.modelindex ) { + case TEAM_RED: + ent.hModel = cgs.media.pkasentry_red; + break; + case TEAM_BLUE: + ent.hModel = cgs.media.pkasentry_blue; + break; + default: + ent.hModel = cgs.media.pkasentry; + break; + } + break; + case WP_BEARTRAP: + ent.hModel = cgs.media.pkabeartrap; + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - WP_BEARTRAP\n" ); + //PKMOD - Ergodic 06/23/01 - add team parameters + switch ( cent->currentState.modelindex ) { + case TEAM_RED: + ent.hModel = cgs.media.pkabeartrap_red; + break; + case TEAM_BLUE: + ent.hModel = cgs.media.pkabeartrap_blue; + break; + default: + ent.hModel = cgs.media.pkabeartrap; + break; + } + break; + case WP_BEANS: + ent.hModel = weapon_deployed->weaponModel; + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - WP_BEANS\n" ); + break; + + //PKMOD - Ergodic 08/29/01 - add case for deploying flag + case PW_REDFLAG: + //PKMOD - Ergodic 03/04/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - PW_REDFLAG\n" ); + ent.hModel = cgs.media.redFlagModel; + break; + + //PKMOD - Ergodic 08/29/01 - add case for deploying flag + case PW_BLUEFLAG: + //PKMOD - Ergodic 03/04/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - PW_BLUEFLAG\n" ); + ent.hModel = cgs.media.blueFlagModel; + break; + + //PKMOD - Ergodic 12/15/01 - add case for deploying gauntlet + case WP_GAUNTLET: + //PKMOD - Ergodic 12/15/01 - debug (inactive) +// Com_Printf( "CG_Dragon_Deploy - WP_GAUNTLET\n" ); + //PKMOD - Ergodic 12/16/01 - add new model for repositioned deployed gauntlet blade + //PKMOD - Ergodic 12/17/01 - use the barrel model + weapon = &cg_weapons[ WP_GAUNTLET ]; + vectoangles( cent->lerpAngles, hold_dir); + //PKMOD - Ergodic 12/20/01 - rotate the blade to the proper angle + hold_dir[PITCH] += 90; + AnglesToAxis( hold_dir, ent.axis ); + + //PKMOD - Ergodic 12/17/01 - use the barrel model + ent.hModel = weapon->barrelModel; + break; + + default: //exit since current weapon can not be deployed (default to tongue) + ent.hModel = weapon->weaponModel; + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "CG_Weapon_DragonDeploy - invalid weapon for dragon deploy\n" ); + break; + } + + + ent.renderfx = weapon->missileRenderfx | RF_NOSHADOW; + + // convert direction of travel into axis +// if ( VectorNormalize2( s1->pos.trDelta, ent.axis[0] ) == 0 ) { +// ent.axis[0][1] = 1; +// ent.axis[0][1] = 1; +// ent.axis[0][0] = 1; +// } + + + // spin as it moves (removed 07/11/01) +// RotateAroundDirection( ent.axis, s1->time ); + + // add to refresh list, possibly with quad glow + CG_AddRefEntityWithPowerups( &ent, s1, TEAM_FREE ); +} + +/* +==================== +PKMOD - Ergodic 11/02/02 - Code was moved from cg_localents to fix Invisible Gravity Well Bug + Timing logic was copied from cg_autosentry +==================== +*/ +void CG_GravityWell_Activate( centity_t *cent ) { + refEntity_t orb; + entityState_t *s1; + + float c; + vec3_t axis[3]; + vec3_t hold_dir; + int t; + float dynamic_lumens; + vec3_t dynamic_color; + int frame; + float size; + float wsize; + //particle parameters + vec3_t vel; + int duration; + float x_offset; + float y_offset; + float speed; + int indx; + vec3_t spark_origin; + + //get entity state information + s1 = ¢->currentState; + + // create the render entity + memset (&orb, 0, sizeof(orb)); + VectorCopy( cent->lerpOrigin, orb.origin); + VectorCopy( cent->lerpOrigin, orb.oldorigin); +// orb.reType = RT_MODEL; + orb.hModel = cgs.media.pkagravitywelluniverse; + //03/18/01 - add a shader +// orb.customShader = cgs.media.quadShader; + orb.skinNum = cg.clientFrame & 1; + orb.renderfx = RF_MINLIGHT | RF_NOSHADOW; + + // calculate the axis + VectorClear( hold_dir ); + AnglesToAxis( hold_dir, axis ); + + //PKMOD - Ergodic 11/02/02 - debug invisible GW (inactive) +// Com_Printf( "CG_GravityWell_Activate - cg.time>%d<, time2>%d<, cent->miscTime>%d<\n", cg.time, s1->time2, cent->miscTime ); + + //PKMOD - Ergodic 11/03/02 - Use the server's level.time to drive the Gravity Well animations + // this will address the invisible Gravity Well bug + t = cg.time - s1->time2; + //calculate the time + //if ( cent->miscTime ) + // t = cg.time - cent->miscTime; + //else + //PKMOD - Ergodic 10/22/02 - default msec to 0 + //msec = 29; //was 29 -> produced a deployed sentry when launched + //PKMOD - Ergodic 11/02/02 - debug invisible GW + // t = 0; + // t = 1000; + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + MAKERGB( dynamic_color, 0.5f, 0.5f, 1.f ); + + //++++++++++++++++++++++ + // First Expansion + //++++++++++++++++++++++ + if (t >= GWELL_EXPAND_STARTTIME_1 && t < GWELL_EXPAND_ENDTIME_1) { + +// if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); +//pkmod trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); +// le->leFlags |= LEF_SOUND1; +// } + + //PKMOD - Ergodic 03/26/01 set model + orb.hModel = cgs.media.pkagravitywelluniverse; + + size = (float)(t - GWELL_EXPAND_STARTTIME_1) / (float)(GWELL_EXPAND_ENDTIME_1 - GWELL_EXPAND_STARTTIME_1); + //PKMOD - Ergodic 02/27/01 - Debug force to One (inactive) +// c = 0.25f; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model (resize) + size = size / 3.0; + + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + dynamic_lumens = 50 + 100 * size; + trap_R_AddLightToScene(orb.origin, dynamic_lumens, dynamic_color[0], dynamic_color[1], dynamic_color[2] ); + + VectorScale( axis[0], size * GWELL_ORB_RADIUS_1, orb.axis[0] ); + VectorScale( axis[1], size * GWELL_ORB_RADIUS_1, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_1, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_EXPAND_FADETIME_1) { + c = (float)(t - GWELL_EXPAND_FADETIME_1) / (float)(GWELL_EXPAND_ENDTIME_1 - GWELL_EXPAND_FADETIME_1); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + return;// 03/25/01 - exit + } + + //++++++++++++++++++++++ + // First Contraction + //++++++++++++++++++++++ + if (t >= GWELL_CONTRACTION_STARTTIME_1 && t < GWELL_CONTRACTION_ENDTIME_1) { + +// if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); +//pkmod trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); +// le->leFlags |= LEF_SOUND1; +// } + + //PKMOD - Ergodic 03/26/01 set model +// orb.hModel = cgs.media.pkagravitywell_contraction; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model + orb.hModel = cgs.media.pkagravitywelluniverse; + + + size = 0.75 + 0.25 * (float)(GWELL_CONTRACTION_ENDTIME_1 - t) / (float)(GWELL_CONTRACTION_ENDTIME_1 - GWELL_CONTRACTION_STARTTIME_1); + //PKMOD - Ergodic 02/27/01 - Debug force to One (inactive) +// c = 0.25f; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model (resize) + size = size / 3.0; + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + dynamic_lumens = 50 + 50 * size; + trap_R_AddLightToScene(orb.origin, dynamic_lumens, dynamic_color[0], dynamic_color[1], dynamic_color[2] ); + + VectorScale( axis[0], size * GWELL_ORB_RADIUS_1, orb.axis[0] ); + VectorScale( axis[1], size * GWELL_ORB_RADIUS_1, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_1, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_CONTRACTION_FADETIME_1) { + c = (float)(t - GWELL_CONTRACTION_FADETIME_1) / (float)(GWELL_CONTRACTION_ENDTIME_1 - GWELL_CONTRACTION_FADETIME_1); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + + return;// 03/25/01 - exit + } + + //++++++++++++++++++++++ + // Second Expansion + //++++++++++++++++++++++ + if (t >= GWELL_EXPAND_STARTTIME_2 && t < GWELL_EXPAND_ENDTIME_2) { + + //PKMOD - Ergodic 10/13/02 - frame animations... + //PKMOD - Ergodic 10/17/02 - frame animations... + // Start frame animation for sphere crimping + // 20 frames / second = 1 new frame every 50 ms + frame = (t - GWELL_EXPAND_STARTTIME_2) / 50; + if ( frame > 29 ) + orb.frame = 29; + else + orb.frame = frame; + +// if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); +//pkmod trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); +// le->leFlags |= LEF_SOUND1; +// } + + //PKMOD - Ergodic 03/26/01 set model + orb.hModel = cgs.media.pkagravitywelluniverse; + + size = 0.75 + (float)(t - GWELL_EXPAND_STARTTIME_2) / (float)(GWELL_EXPAND_ENDTIME_2 - GWELL_EXPAND_STARTTIME_2); + //PKMOD - Ergodic 02/27/01 - Debug force to One (inactive) +// c = 0.25f; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model (resize) + size = size / 3.0; + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + dynamic_lumens = 50 + 150 * size; + if ( dynamic_lumens > 255 ) + dynamic_lumens = 255; + + trap_R_AddLightToScene(orb.origin, dynamic_lumens, dynamic_color[0], dynamic_color[1], dynamic_color[2] ); + + + VectorScale( axis[0], size * GWELL_ORB_RADIUS_2, orb.axis[0] ); + VectorScale( axis[1], size * GWELL_ORB_RADIUS_2, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_2, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_EXPAND_FADETIME_2) { + c = (float)(t - GWELL_EXPAND_FADETIME_2) / (float)(GWELL_EXPAND_ENDTIME_2 - GWELL_EXPAND_FADETIME_2); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + return;// 03/25/01 - exit + } + + //++++++++++++++++++++++ + // Second Contraction + //++++++++++++++++++++++ + if (t >= GWELL_CONTRACTION_STARTTIME_2 && t < GWELL_CONTRACTION_ENDTIME_2) { + + //PKMOD - Ergodic 10/17/02 - frame animations... + // Start frame animation for sphere crimping + // 20 frames / second = 1 new frame every 50 ms + frame = (t - GWELL_EXPAND_STARTTIME_2) / 50; + if ( frame > 79 ) + orb.frame = 40 + frame % 40; + else + orb.frame = frame; + +// if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); +//pkmod trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); +// le->leFlags |= LEF_SOUND1; +// } + + //PKMOD - Ergodic 03/26/01 set model +// orb.hModel = cgs.media.pkagravitywell_contraction; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model + orb.hModel = cgs.media.pkagravitywelluniverse; + + size = 1.5 + 0.25 * (float)(GWELL_CONTRACTION_ENDTIME_2 - t) / (float)(GWELL_CONTRACTION_ENDTIME_2 - GWELL_CONTRACTION_STARTTIME_2); + //PKMOD - Ergodic 02/27/01 - Debug force to One (inactive) +// c = 0.25f; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model (resize) + size = size / 3.0; + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + dynamic_lumens = 50 + 100 * size; + if ( dynamic_lumens > 255 ) + dynamic_lumens = 255; + + trap_R_AddLightToScene(orb.origin, dynamic_lumens, dynamic_color[0], dynamic_color[1], dynamic_color[2] ); + + + VectorScale( axis[0], size * GWELL_ORB_RADIUS_2, orb.axis[0] ); + VectorScale( axis[1], size * GWELL_ORB_RADIUS_2, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_2, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_CONTRACTION_FADETIME_2) { + c = (float)(t - GWELL_CONTRACTION_FADETIME_2) / (float)(GWELL_CONTRACTION_ENDTIME_2 - GWELL_CONTRACTION_FADETIME_2); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + + //+++ + //PKMOD - Ergodic 10/15/02 - Add the gravity well expanding wave + //+++ + wsize = 0.5 * (float)(t - GWELL_CONTRACTION_STARTTIME_2) / (float)(GWELL_EXPAND_ENDTIME_3 - GWELL_CONTRACTION_STARTTIME_2); + orb.hModel = cgs.media.pkagravitywellwave; + + VectorScale( axis[0], wsize * GWELL_ORB_RADIUS_2, orb.axis[0] ); + VectorScale( axis[1], wsize * GWELL_ORB_RADIUS_2, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_2, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_EXPAND_FADETIME_3) { + c = (float)(t - GWELL_EXPAND_FADETIME_3) / (float)(GWELL_EXPAND_ENDTIME_3 - GWELL_EXPAND_FADETIME_3); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + + return;// 03/25/01 - exit + } + + //++++++++++++++++++++++ + // Third Expansion + //++++++++++++++++++++++ + if (t >= GWELL_EXPAND_STARTTIME_3 && t < GWELL_EXPAND_ENDTIME_3) { + //PKMOD - Ergodic 10/17/02 - frame animations... + // Start frame animation for sphere crimping + // 20 frames / second = 1 new frame every 50 ms + frame = (t - GWELL_EXPAND_STARTTIME_2) / 50; + if ( frame > 79 ) + orb.frame = 40 + frame % 40; + else + orb.frame = frame; + +// if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); +//pkmod trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); +// le->leFlags |= LEF_SOUND1; +// } + + //PKMOD - Ergodic 03/26/01 set model + orb.hModel = cgs.media.pkagravitywelluniverse; + + size = 1.5 + (float)(t - GWELL_EXPAND_STARTTIME_3) / (float)(GWELL_EXPAND_ENDTIME_3 - GWELL_EXPAND_STARTTIME_3); + //PKMOD - Ergodic 02/27/01 - Debug force to One (inactive) +// c = 0.25f; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model (resize) + size = size / 3.0; + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + dynamic_lumens = 50 + 175 * size; + if ( dynamic_lumens > 255 ) + dynamic_lumens = 255; + + trap_R_AddLightToScene(orb.origin, dynamic_lumens, dynamic_color[0], dynamic_color[1], dynamic_color[2] ); + + + VectorScale( axis[0], size * GWELL_ORB_RADIUS_3, orb.axis[0] ); + VectorScale( axis[1], size * GWELL_ORB_RADIUS_3, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_3, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_EXPAND_FADETIME_3) { + c = (float)(t - GWELL_EXPAND_FADETIME_3) / (float)(GWELL_EXPAND_ENDTIME_3 - GWELL_EXPAND_FADETIME_3); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + + //+++ + //PKMOD - Ergodic 10/15/02 - Add the gravity well expanding wave + //+++ + wsize = 0.75 * (float)(t - GWELL_CONTRACTION_STARTTIME_2) / (float)(GWELL_EXPAND_ENDTIME_3 - GWELL_CONTRACTION_STARTTIME_2); + orb.hModel = cgs.media.pkagravitywellwave; + + VectorScale( axis[0], wsize * GWELL_ORB_RADIUS_2, orb.axis[0] ); + VectorScale( axis[1], wsize * GWELL_ORB_RADIUS_2, orb.axis[1] ); + VectorScale( axis[2], size * GWELL_ORB_RADIUS_2, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_EXPAND_FADETIME_3) { + c = (float)(t - GWELL_EXPAND_FADETIME_3) / (float)(GWELL_EXPAND_ENDTIME_3 - GWELL_EXPAND_FADETIME_3); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + + return;// 03/25/01 - exit + } + + //++++++++++++++++++++++ + // Third Contraction + //++++++++++++++++++++++ + if (t >= GWELL_CONTRACTION_STARTTIME_3 && t < GWELL_CONTRACTION_ENDTIME_3) { + //PKMOD - Ergodic 10/17/02 - frame animations... + // Start frame animation for sphere crimping + // 20 frames / second = 1 new frame every 50 ms + frame = (t - GWELL_EXPAND_STARTTIME_2) / 50; + if ( frame > 79 ) + orb.frame = 40 + frame % 40; + else + orb.frame = frame; + + //PKMOD - Ergodic 10/16/01 - debug last area (inactive) +// if ( (t > ( GWELL_CONTRACTION_STARTTIME_3 + 300 )) && (t < ( GWELL_CONTRACTION_STARTTIME_3 + 700 ) ) ) { +// Com_Printf("CG_GravityWell_Expand - t>%d<, frame>%d<, orb.frame>%d<\n", t, frame, orb.frame ); +// } + + +// if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); +//pkmod trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); +// le->leFlags |= LEF_SOUND1; +// } + + //PKMOD - Ergodic 03/26/01 set model +// orb.hModel = cgs.media.pkagravitywell_contraction; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model + orb.hModel = cgs.media.pkagravitywelluniverse; + + size = (float)(GWELL_CONTRACTION_ENDTIME_3 - t) / (float)(GWELL_CONTRACTION_ENDTIME_3 - GWELL_CONTRACTION_STARTTIME_3); + //PKMOD - Ergodic 02/27/01 - Debug force to One (inactive) +// c = 0.25f; + //PKMOD - Ergodic 10/13/02 - Add new animated gravity well model (resize) + size = size / 3.0; + + //PKMOD - Ergodic 03/26/01 - add dynamic lighting + dynamic_lumens = 50 + 125 * size; + if ( dynamic_lumens > 255 ) + dynamic_lumens = 255; + + trap_R_AddLightToScene(orb.origin, dynamic_lumens, dynamic_color[0], dynamic_color[1], dynamic_color[2] ); + + + VectorScale( axis[0], 2.5 * size * GWELL_ORB_RADIUS_3, orb.axis[0] ); + VectorScale( axis[1], 2.5 * size * GWELL_ORB_RADIUS_3, orb.axis[1] ); + VectorScale( axis[2], 2.5 * size * GWELL_ORB_RADIUS_3, orb.axis[2] ); + orb.nonNormalizedAxes = qtrue; + + if (t > GWELL_CONTRACTION_FADETIME_3) { + c = (float)(t - GWELL_CONTRACTION_FADETIME_3) / (float)(GWELL_CONTRACTION_ENDTIME_3 - GWELL_CONTRACTION_FADETIME_3); + } + else { + c = 0; + } + c *= 0xff; + orb.shaderRGBA[0] = 0xff - c; + orb.shaderRGBA[1] = 0xff - c; + orb.shaderRGBA[2] = 0xff - c; + orb.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &orb ); + + //PKMOD - Ergodic 10/17/02 - draw some particles... + VectorCopy(orb.origin, spark_origin); + spark_origin[2] += 200; + + //PKMOD - Ergodic 03/18/04 - reduce index max from 10 to 4 + for ( indx = 1; indx < 4; indx++ ) { + vel[0] = 10 * crandom(); + vel[1] = 10 * crandom(); + vel[2] = 10 * crandom(); + + duration = 3000; + + x_offset = (t - GWELL_CONTRACTION_STARTTIME_3) * crandom() / 5; + y_offset = (t - GWELL_CONTRACTION_STARTTIME_3) * crandom() / 5; + + speed = 10 * crandom(); + + //PKMOD - Ergodic 10/18/02 - draw super-sized particles... + CG_ParticleSparks2 (spark_origin, vel, duration, x_offset, y_offset, speed); + } + + //PKMOD - Ergodic 10/18/02 - debug, count the number particle calls (inactive) + //Com_Printf("CG_GravityWell_Expand\n"); + + return;// 03/25/01 - exit + } + + //PKMOD - Ergodic 01/04/02 - (inactive) debug, here is not part of gwell effect +// Com_Printf("CG_GravityWell_Expand - delta time>%d<\n", t); + +} + + +/* +================== +PKMOD - CG_Coord, Ergodic 01/21/01 display the Coord model +================== +*/ + +//PKMOD - Ergodic 01/21/01 - add event to display coordinate model for exploding shells debug +void CG_Coord( entityState_t *es ) { + localEntity_t *le; + float light; + vec3_t lightColor; + + + light = 100; + lightColor[0] = 1; + lightColor[1] = 1; + lightColor[2] = 0; + //PKMOD - Ergodic 01/22/01 - debug location + Com_Printf("CG_Coord: es->pos.trBase>%s<\n", CG_vtos(es->pos.trBase)); + + + le = CG_MakeExplosion( es->pos.trBase, 0, cgs.media.coordFlashModel, cgs.media.plasmaExplosionShader, 3000, qfalse ); +// le = CG_MakeExplosion( es->pos.trBase, es->angles, cgs.media.bulletFlashModel, cgs.media.plasmaExplosionShader, 3000, qfalse ); + le->light = light; + VectorCopy( lightColor, le->lightColor ); + +} + + +//============================================================================ + +/* +========================= +CG_AdjustPositionForMover + +Also called by client movement prediction code +========================= +*/ +void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out ) { + centity_t *cent; + vec3_t oldOrigin, origin, deltaOrigin; + vec3_t oldAngles, angles, deltaAngles; + + if ( moverNum <= 0 || moverNum >= ENTITYNUM_MAX_NORMAL ) { + VectorCopy( in, out ); + return; + } + + cent = &cg_entities[ moverNum ]; + //PKMOD - Ergodic 06/21/01 - mover is similar to zombie + if ( ( cent->currentState.eType != ET_MOVER ) && ( cent->currentState.eType != ET_ZOMBIE ) ) { + VectorCopy( in, out ); + return; + } + + BG_EvaluateTrajectory( ¢->currentState.pos, fromTime, oldOrigin ); + BG_EvaluateTrajectory( ¢->currentState.apos, fromTime, oldAngles ); + + BG_EvaluateTrajectory( ¢->currentState.pos, toTime, origin ); + BG_EvaluateTrajectory( ¢->currentState.apos, toTime, angles ); + + VectorSubtract( origin, oldOrigin, deltaOrigin ); + VectorSubtract( angles, oldAngles, deltaAngles ); + + VectorAdd( in, deltaOrigin, out ); + + // FIXME: origin change when on a rotating object +} + + +/* +============================= +CG_InterpolateEntityPosition +============================= +*/ +static void CG_InterpolateEntityPosition( centity_t *cent ) { + vec3_t current, next; + float f; + + // it would be an internal error to find an entity that interpolates without + // a snapshot ahead of the current one + if ( cg.nextSnap == NULL ) { + CG_Error( "CG_InterpoateEntityPosition: cg.nextSnap == NULL" ); + } + + f = cg.frameInterpolation; + + // this will linearize a sine or parabolic curve, but it is important + // to not extrapolate player positions if more recent data is available + BG_EvaluateTrajectory( ¢->currentState.pos, cg.snap->serverTime, current ); + BG_EvaluateTrajectory( ¢->nextState.pos, cg.nextSnap->serverTime, next ); + + cent->lerpOrigin[0] = current[0] + f * ( next[0] - current[0] ); + cent->lerpOrigin[1] = current[1] + f * ( next[1] - current[1] ); + cent->lerpOrigin[2] = current[2] + f * ( next[2] - current[2] ); + + BG_EvaluateTrajectory( ¢->currentState.apos, cg.snap->serverTime, current ); + BG_EvaluateTrajectory( ¢->nextState.apos, cg.nextSnap->serverTime, next ); + + cent->lerpAngles[0] = LerpAngle( current[0], next[0], f ); + cent->lerpAngles[1] = LerpAngle( current[1], next[1], f ); + cent->lerpAngles[2] = LerpAngle( current[2], next[2], f ); + +} + +/* +=============== +CG_CalcEntityLerpPositions + +=============== +*/ +static void CG_CalcEntityLerpPositions( centity_t *cent ) { + + // if this player does not want to see extrapolated players + if ( !cg_smoothClients.integer ) { + // make sure the clients use TR_INTERPOLATE + if ( cent->currentState.number < MAX_CLIENTS ) { + cent->currentState.pos.trType = TR_INTERPOLATE; + cent->nextState.pos.trType = TR_INTERPOLATE; + } + } + + if ( cent->interpolate && cent->currentState.pos.trType == TR_INTERPOLATE ) { + CG_InterpolateEntityPosition( cent ); + return; + } + + // first see if we can interpolate between two snaps for + // linear extrapolated clients + if ( cent->interpolate && cent->currentState.pos.trType == TR_LINEAR_STOP && + cent->currentState.number < MAX_CLIENTS) { + CG_InterpolateEntityPosition( cent ); + return; + } + + //PKMOD - Ergodic 06/11/01 - if zombie mover... + if ( cent->currentState.generic1 && ( cent->currentState.eType == ET_MOVER ) ) { + //PKMOD - Ergodic 06/11/01 - for zombie + vec3_t hold_vec; + float hold_angle; + + BG_EvaluateTrajectory( ¢->currentState.apos, cg.time, cent->lerpAngles ); + + //PKMOD - Ergodic 06/21/01 - rotate model 90 degrees "forward" +// cent->lerpAngles[0] += 90; + + hold_angle = (cent->lerpAngles[2] + 90.0) * M_PI / 180.0; + hold_vec[1] = (float) (cent->currentState.generic1 - 256) * cos( hold_angle ); + hold_vec[2] = (float) (cent->currentState.generic1 - 256) * sin( hold_angle ); + hold_vec[0] = 0; + + //PKMOD - Ergodic 06/11/01 - debug call +// Com_Printf("CG_CalcEntityLerpPositions - deltaTime>%f<, trDelta>%s<\n", 100 * deltaTime, CG_vtos(cent->currentState.pos.trDelta) ); + + VectorAdd( hold_vec, cent->currentState.pos.trBase, cent->lerpOrigin ); + + //PKMOD - Ergodic 06/11/01 - debug call +// Com_Printf("CG_CalcEntityLerpPositions - generic1>%d<, angle>%s<, location>%s<, hold>%s<\n", cent->currentState.generic1, CG_vtos(cent->lerpAngles), CG_vtos(cent->lerpOrigin), CG_vtos(hold_vec) ); + } + else { + // just use the current frame and evaluate as best we can + BG_EvaluateTrajectory( ¢->currentState.pos, cg.time, cent->lerpOrigin ); + BG_EvaluateTrajectory( ¢->currentState.apos, cg.time, cent->lerpAngles ); + } + + // adjust for riding a mover if it wasn't rolled into the predicted + // player state + if ( cent != &cg.predictedPlayerEntity ) { + CG_AdjustPositionForMover( cent->lerpOrigin, cent->currentState.groundEntityNum, + cg.snap->serverTime, cg.time, cent->lerpOrigin ); + } +} + +/* +=============== +CG_TeamBase +=============== +*/ +static void CG_TeamBase( centity_t *cent ) { + refEntity_t model; +#ifdef MISSIONPACK + vec3_t angles; + int t, h; + float c; + + if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF ) { +#else + if ( cgs.gametype == GT_CTF) { +#endif + // show the flag base + memset(&model, 0, sizeof(model)); + model.reType = RT_MODEL; + VectorCopy( cent->lerpOrigin, model.lightingOrigin ); + VectorCopy( cent->lerpOrigin, model.origin ); + AnglesToAxis( cent->currentState.angles, model.axis ); + if ( cent->currentState.modelindex == TEAM_RED ) { + model.hModel = cgs.media.redFlagBaseModel; + } + else if ( cent->currentState.modelindex == TEAM_BLUE ) { + model.hModel = cgs.media.blueFlagBaseModel; + } + else { + model.hModel = cgs.media.neutralFlagBaseModel; + } + trap_R_AddRefEntityToScene( &model ); + } +#ifdef MISSIONPACK + else if ( cgs.gametype == GT_OBELISK ) { + // show the obelisk + memset(&model, 0, sizeof(model)); + model.reType = RT_MODEL; + VectorCopy( cent->lerpOrigin, model.lightingOrigin ); + VectorCopy( cent->lerpOrigin, model.origin ); + AnglesToAxis( cent->currentState.angles, model.axis ); + + model.hModel = cgs.media.overloadBaseModel; + trap_R_AddRefEntityToScene( &model ); + // if hit + if ( cent->currentState.frame == 1) { + // show hit model + // modelindex2 is the health value of the obelisk + c = cent->currentState.modelindex2; + model.shaderRGBA[0] = 0xff; + model.shaderRGBA[1] = c; + model.shaderRGBA[2] = c; + model.shaderRGBA[3] = 0xff; + // + model.hModel = cgs.media.overloadEnergyModel; + trap_R_AddRefEntityToScene( &model ); + } + // if respawning + if ( cent->currentState.frame == 2) { + if ( !cent->miscTime ) { + cent->miscTime = cg.time; + } + t = cg.time - cent->miscTime; + h = (cg_obeliskRespawnDelay.integer - 5) * 1000; + // + if (t > h) { + c = (float) (t - h) / h; + if (c > 1) + c = 1; + } + else { + c = 0; + } + // show the lights + AnglesToAxis( cent->currentState.angles, model.axis ); + // + model.shaderRGBA[0] = c * 0xff; + model.shaderRGBA[1] = c * 0xff; + model.shaderRGBA[2] = c * 0xff; + model.shaderRGBA[3] = c * 0xff; + + model.hModel = cgs.media.overloadLightsModel; + trap_R_AddRefEntityToScene( &model ); + // show the target + if (t > h) { + if ( !cent->muzzleFlashTime ) { + trap_S_StartSound (cent->lerpOrigin, ENTITYNUM_NONE, CHAN_BODY, cgs.media.obeliskRespawnSound); + cent->muzzleFlashTime = 1; + } + VectorCopy(cent->currentState.angles, angles); + angles[YAW] += (float) 16 * acos(1-c) * 180 / M_PI; + AnglesToAxis( angles, model.axis ); + + VectorScale( model.axis[0], c, model.axis[0]); + VectorScale( model.axis[1], c, model.axis[1]); + VectorScale( model.axis[2], c, model.axis[2]); + + model.shaderRGBA[0] = 0xff; + model.shaderRGBA[1] = 0xff; + model.shaderRGBA[2] = 0xff; + model.shaderRGBA[3] = 0xff; + // + model.origin[2] += 56; + model.hModel = cgs.media.overloadTargetModel; + trap_R_AddRefEntityToScene( &model ); + } + else { + //FIXME: show animated smoke + } + } + else { + cent->miscTime = 0; + cent->muzzleFlashTime = 0; + // modelindex2 is the health value of the obelisk + c = cent->currentState.modelindex2; + model.shaderRGBA[0] = 0xff; + model.shaderRGBA[1] = c; + model.shaderRGBA[2] = c; + model.shaderRGBA[3] = 0xff; + // show the lights + model.hModel = cgs.media.overloadLightsModel; + trap_R_AddRefEntityToScene( &model ); + // show the target + model.origin[2] += 56; + model.hModel = cgs.media.overloadTargetModel; + trap_R_AddRefEntityToScene( &model ); + } + } + else if ( cgs.gametype == GT_HARVESTER ) { + // show harvester model + memset(&model, 0, sizeof(model)); + model.reType = RT_MODEL; + VectorCopy( cent->lerpOrigin, model.lightingOrigin ); + VectorCopy( cent->lerpOrigin, model.origin ); + AnglesToAxis( cent->currentState.angles, model.axis ); + + if ( cent->currentState.modelindex == TEAM_RED ) { + model.hModel = cgs.media.harvesterModel; + model.customSkin = cgs.media.harvesterRedSkin; + } + else if ( cent->currentState.modelindex == TEAM_BLUE ) { + model.hModel = cgs.media.harvesterModel; + model.customSkin = cgs.media.harvesterBlueSkin; + } + else { + model.hModel = cgs.media.harvesterNeutralModel; + model.customSkin = 0; + } + trap_R_AddRefEntityToScene( &model ); + } +#endif +} + +/* +=============== +CG_AddCEntity + +=============== +*/ +static void CG_AddCEntity( centity_t *cent ) { + // event-only entities will have been dealt with already + if ( cent->currentState.eType >= ET_EVENTS ) { + return; + } + + // calculate the current origin + CG_CalcEntityLerpPositions( cent ); + +//PKMOD Ergodic debug 07/18/00 inactive +// if ( cent->currentState.constantLight ) { +// Com_Printf( "CG_AddCEntity constant light found\n" ); +// } + + // add automatic effects + CG_EntityEffects( cent ); + + switch ( cent->currentState.eType ) { + default: + CG_Error( "Bad entity type: %i\n", cent->currentState.eType ); + break; +//PKMOD - Ergodic 07/17/00 special spawn functions - do nothing + case ET_LIGHTNING_FX: + //PKMOD Ergodic debug 07/18/00 (inactive) +// Com_Printf( "ET_LIGHTNING_FX found\n" ); + break; + case ET_INVISIBLE: + case ET_PUSH_TRIGGER: + //PKMOD - Ergodic 11/15/00 add functionality to make trigger_push silent + case ET_QUIET_TRIGGER: + case ET_TELEPORT_TRIGGER: + break; + case ET_GENERAL: + CG_General( cent ); + break; + //PKMOD - Ergodic 08/02/01 - create a new entity type for door_trigger + // fixes the bug of dragon deploy hitting doors + case ET_DOOR_TRIGGER: + CG_General( cent ); + break; + //PKMOD - Ergodic 08/02/01 - create a new entity type for trigger_multiple + // fixes the bug of dragon deploy hitting doors + case ET_TRIGGER_MULTIPLE: + CG_General( cent ); + break; + case ET_PLAYER: + CG_Player( cent ); + break; + case ET_ITEM: + CG_Item( cent ); + break; + case ET_MISSILE: + CG_Missile( cent ); + break; + case ET_MOVER: + CG_Mover( cent ); + break; + case ET_BEAM: + CG_Beam( cent ); + break; + case ET_PORTAL: + CG_Portal( cent ); + break; + case ET_SPEAKER: + CG_Speaker( cent ); + break; + case ET_GRAPPLE: + CG_Grapple( cent ); + break; + case ET_BEARTRAP: + CG_BearTrap( cent ); + break; + case ET_GRAVITY_WELL: + //PKMOD - Ergodic 11/01/02 - This function call was moved from cg_event + // to fix the Invisible Gravity Well bug + //CG_GravityWellActivate( cent->lerpOrigin ); + //PKMOD - Ergodic 11/02/02 - Pass in the whole centity + //PKMOD - Ergodic 11/02/02 - Move function to cg_ents + CG_GravityWell_Activate( cent ); + break; + //PKMOD Ergodic - 07/12/2000, add chain lightning event type + case ET_CHAIN_LIGHTNING: + CG_ChainLightning( cent ); + break; + case ET_BEARTRAP_FOLLOW: + //PKMOD - Ergodic 06/30/00 do nothing since tracking is dealt with in cg_player +// CG_BearTrap_Follow( cent ); + break; + //PKMOD Ergodic - 08/03/2000, add nail event type + case ET_NAIL: + CG_Nail( cent ); + break; + //PKMOD Ergodic - 11/26/2000, add deploy autosentry entity type + case ET_AUTOSENTRY_DEPLOY: + CG_AutoSentry( cent ); + break; + //PKMOD Ergodic - 11/22/2000, add launch autosentry entity type + //PKMOD Ergodic - 11/26/2000, separate the autosentry launch/deploy entity types + case ET_AUTOSENTRY_LAUNCH: + cent->miscTime = 0; //force the time to zero -> deploy0 model + CG_AutoSentry( cent ); + break; + //PKMOD Ergodic - 12/02/2000, add base autosentry entity type + case ET_AUTOSENTRY_BASE: + CG_AutoSentry_Base( cent ); + break; + //PKMOD Ergodic - 12/02/2000, add turret autosentry entity type + case ET_AUTOSENTRY_TURRET: + CG_AutoSentry_Turret( cent ); + break; + //PKMOD - Ergodic 03/14/01 - add dragon deployable weapon fire + case ET_DRAGON_DEPLOY: + CG_Dragon_Deploy( cent ); + break; + //PKMOD - Ergodic 06/21/01 - zombie is similar to mover + case ET_ZOMBIE: + CG_Mover( cent ); + break; + case ET_TEAM: + CG_TeamBase( cent ); + break; + //PKMOD - Ergodic 06/13/02 - the Personal Sentry driver entity should be ignored + case ET_PERSONALSENTRY: + break; + + //PKMOD Ergodic - 08/20/03, add Shooter_lightning entity type to differentiate between + // shooter_Lightning(green) and CLG lightning(red) + case ET_SHOOTER_LIGHTNING: + CG_ShooterLightning( cent ); + break; + + } +} + +/* +=============== +CG_AddPacketEntities + +=============== +*/ +void CG_AddPacketEntities( void ) { + int num; + centity_t *cent; + playerState_t *ps; + + // set cg.frameInterpolation + if ( cg.nextSnap ) { + int delta; + + delta = (cg.nextSnap->serverTime - cg.snap->serverTime); + if ( delta == 0 ) { + cg.frameInterpolation = 0; + } else { + cg.frameInterpolation = (float)( cg.time - cg.snap->serverTime ) / delta; + } + } else { + cg.frameInterpolation = 0; // actually, it should never be used, because + // no entities should be marked as interpolating + } + + // the auto-rotating items will all have the same axis + cg.autoAngles[0] = 0; + cg.autoAngles[1] = ( cg.time & 2047 ) * 360 / 2048.0; + cg.autoAngles[2] = 0; + + cg.autoAnglesFast[0] = 0; + cg.autoAnglesFast[1] = ( cg.time & 1023 ) * 360 / 1024.0f; + cg.autoAnglesFast[2] = 0; + + //PKMOD - Ergodic 01/27/02 - add slower rotating items + cg.autoAnglesSlow[0] = 0; + cg.autoAnglesSlow[1] = ( cg.time & 4095 ) * 360 / 4096.0f; + cg.autoAnglesSlow[2] = 0; + + AnglesToAxis( cg.autoAngles, cg.autoAxis ); + AnglesToAxis( cg.autoAnglesFast, cg.autoAxisFast ); + //PKMOD - Ergodic 01/27/02 - add slower rotating items + AnglesToAxis( cg.autoAnglesSlow, cg.autoAxisSlow ); + + // generate and add the entity from the playerstate + ps = &cg.predictedPlayerState; + BG_PlayerStateToEntityState( ps, &cg.predictedPlayerEntity.currentState, qfalse ); + CG_AddCEntity( &cg.predictedPlayerEntity ); + + // lerp the non-predicted value for lightning gun origins + CG_CalcEntityLerpPositions( &cg_entities[ cg.snap->ps.clientNum ] ); + + // add each entity sent over by the server + for ( num = 0 ; num < cg.snap->numEntities ; num++ ) { + cent = &cg_entities[ cg.snap->entities[ num ].number ]; + CG_AddCEntity( cent ); + } +} + + + diff --git a/quake3/source/code/cgame/cg_event.c b/quake3/source/code/cgame/cg_event.c new file mode 100644 index 0000000..c6cfdd9 --- /dev/null +++ b/quake3/source/code/cgame/cg_event.c @@ -0,0 +1,2723 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_event.c -- handle entity events at snapshot or playerstate transitions + +#include "cg_local.h" + +// for the voice chats +#ifdef MISSIONPACK // bk001205 +#include "../../ui/menudef.h" +#endif +//========================================================================== + +/* +=================== +CG_PlaceString + +Also called by scoreboard drawing +=================== +*/ +const char *CG_PlaceString( int rank ) { + static char str[64]; + char *s, *t; + + if ( rank & RANK_TIED_FLAG ) { + rank &= ~RANK_TIED_FLAG; + t = "Tied for "; + } else { + t = ""; + } + + if ( rank == 1 ) { + s = S_COLOR_BLUE "1st" S_COLOR_WHITE; // draw in blue + } else if ( rank == 2 ) { + s = S_COLOR_RED "2nd" S_COLOR_WHITE; // draw in red + } else if ( rank == 3 ) { + s = S_COLOR_YELLOW "3rd" S_COLOR_WHITE; // draw in yellow + } else if ( rank == 11 ) { + s = "11th"; + } else if ( rank == 12 ) { + s = "12th"; + } else if ( rank == 13 ) { + s = "13th"; + } else if ( rank % 10 == 1 ) { + s = va("%ist", rank); + } else if ( rank % 10 == 2 ) { + s = va("%ind", rank); + } else if ( rank % 10 == 3 ) { + s = va("%ird", rank); + } else { + s = va("%ith", rank); + } + + Com_sprintf( str, sizeof( str ), "%s%s", t, s ); + return str; +} + +/* +============= +CG_Obituary +============= +*/ +static void CG_Obituary( entityState_t *ent ) { + int mod; + int target, attacker; + char *message; + char *message2; + const char *targetInfo; + const char *attackerInfo; + //PKMOD - Ergodic 12/18/02 - expand target's name from 32 TO 64, To include "Private Bot" + //char targetName[32]; + char targetName[64]; + char attackerName[32]; + gender_t gender; + clientInfo_t *ci; + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + int rndmsg; + + target = ent->otherEntityNum; + attacker = ent->otherEntityNum2; + mod = ent->eventParm; + + if ( target < 0 || target >= MAX_CLIENTS ) { + CG_Error( "CG_Obituary: target out of range" ); + } + ci = &cgs.clientinfo[target]; + + if ( attacker < 0 || attacker >= MAX_CLIENTS ) { + attacker = ENTITYNUM_WORLD; + attackerInfo = NULL; + } else { + attackerInfo = CG_ConfigString( CS_PLAYERS + attacker ); + } + + targetInfo = CG_ConfigString( CS_PLAYERS + target ); + if ( !targetInfo ) { + return; + } + Q_strncpyz( targetName, Info_ValueForKey( targetInfo, "n" ), sizeof(targetName) - 2); + //pkmod - Ergodic 12/18/02 - add Private Bot Info if needed + if ( ent->time2 == 1 ) + strcat( targetName, "'s Private Bot" ); + + strcat( targetName, S_COLOR_WHITE ); + + message2 = ""; + + // check for single client messages + + switch( mod ) { + case MOD_SUICIDE: + message = "suicides"; + break; + case MOD_FALLING: + message = "cratered"; + break; + case MOD_CRUSH: + message = "was squished"; + break; + case MOD_WATER: + message = "sank like a rock"; + break; + case MOD_SLIME: + message = "melted"; + break; + case MOD_LAVA: + message = "does a back flip into the lava"; + break; + case MOD_TARGET_LASER: + message = "saw the light"; + break; + case MOD_TRIGGER_HURT: + message = "was in the wrong place"; + break; + //PKMOD - Ergodic 12/05/00 - add new types of PKA shooters + case MOD_SHOOTER_LIGHTNING: + rndmsg = rand() % 4; //Generate random numbers: {0,1,2,3} + switch (rndmsg) { + case 0: + message = "was zapped extra crispy"; + break; + case 1: + message = "was short-circuited"; + break; + case 2: + message = "was not properly grounded"; + break; + default: + message = "had a shocking experience"; + break; + } + default: + message = NULL; + break; + } + + //pkmod - Ergodic 12/18/02 - if suicide and not a Private Bot + if ( ( attacker == target ) && ( ent->time2 != 1 ) ) { + gender = ci->gender; + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + rndmsg = rand() % 3; //Generate random numbers: {0,1,2} + + switch (mod) { +#ifdef MISSIONPACK + case MOD_KAMIKAZE: + message = "goes out with a bang"; + break; +#endif + case MOD_GRENADE_SPLASH: + if ( gender == GENDER_FEMALE ) + message = "tripped on her own grenade"; + else if ( gender == GENDER_NEUTER ) + message = "tripped on its own grenade"; + else + message = "tripped on his own grenade"; + break; + case MOD_ROCKET_SPLASH: + if ( gender == GENDER_FEMALE ) + message = "blew herself up"; + else if ( gender == GENDER_NEUTER ) + message = "blew itself up"; + else + message = "blew himself up"; + break; + case MOD_PLASMA_SPLASH: + if ( gender == GENDER_FEMALE ) + message = "melted herself"; + else if ( gender == GENDER_NEUTER ) + message = "melted itself"; + else + message = "melted himself"; + break; + case MOD_BFG_SPLASH: + message = "should have used a smaller gun"; + break; + case MOD_GRAVITY: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "was sucked into her own well"; + break; + case 1: + message = "left this dimension through her own door"; + break; + default: + message = "now knows the fate of the universe"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "was sucked into its own well"; + break; + case 1: + message = "left this dimension through its own door"; + break; + default: + message = "now knows the fate of the universe"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "was sucked into his own well"; + break; + case 1: + message = "left this dimension through his own door"; + break; + default: + message = "now knows the fate of the universe"; + break; + } + } + break; + + case MOD_BEARTRAP: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "lost some limbs in her own beartrap"; + break; + case 1: + message = "was snared by her own beartrap"; + break; + default: + message = "should have jumped over her own beartrap"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "lost some limbs in its own beartrap"; + break; + case 1: + message = "was snared by its own beartrap"; + break; + default: + message = "should have jumped over its her own beartrap"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "lost some limbs in his own beartrap"; + break; + case 1: + message = "was snared by his own beartrap"; + break; + default: + message = "should have jumped over his own beartrap"; + break; + } + } + break; + + case MOD_SENTRY: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "forgot about her own sentry"; + break; + case 1: + message = "mistook her own sentry for an ATM"; + break; + default: + message = "was shot up by her own sentry"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "forgot about its own sentry"; + break; + case 1: + message = "mistook its own sentry for an ATM"; + break; + default: + message = "was shot up by its own sentry"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "forgot about his own sentry"; + break; + case 1: + message = "mistook his own sentry for an ATM"; + break; + default: + message = "was shot up by his own sentry"; + break; + } + } + break; + + //PKMOD - Ergodic 01/13/01 - exploding autosentry will produce splash damage + case MOD_SENTRY_SPLASH: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "was caught in her own sentry's detonation"; + break; + case 1: + message = "was shredded by her own sentry's shrapnel"; + break; + default: + message = "got to close to her little R2D2 buddy"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "was caught its her own sentry's detonation"; + break; + case 1: + message = "was shredded by its own sentry's shrapnel"; + break; + default: + message = "got to close to its little R2D2 buddy"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "was caught in his own sentry's detonation"; + break; + case 1: + message = "was shredded by his own sentry's shrapnel"; + break; + default: + message = "got to close to his little R2D2 buddy"; + break; + } + } + break; + + //PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water + case MOD_LIGHTNING_WATER_DISCHARGE: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "dishonored herself by committing electrical suicide"; + break; + case 1: + message = "probably wet her bed many times in her youth"; + break; + default: + message = "was fried by her own juice"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "dishonored itself by committing electrical suicide"; + break; + case 1: + message = "probably wet its bed many times in its youth"; + break; + default: + message = "was fried by its own juice"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "dishonored himself by committing electrical suicide"; + break; + case 1: + message = "probably wet his bed many times in his youth"; + break; + default: + message = "was fried by his own juice"; + break; + } + } + break; + + //PKMOD - Ergodic 07/02/01 - add reverse damage on lightning from autosentry + case MOD_REVERSE_LIGHTNING: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "Shafted her own ignorant self"; + break; + case 1: + message = "had her own lightning reflected"; + break; + default: + message = "was juiced by her own hand"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "Shafted its own ignorant self"; + break; + case 1: + message = "had its own lightning reflected"; + break; + default: + message = "was juiced by its own hand"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "Shafted his own ignorant self"; + break; + case 1: + message = "had his own lightning reflected"; + break; + default: + message = "was juiced by his own hand"; + break; + } + } + break; + + //PKMOD - Ergodic 10/29/01 - add holdable radiation death + case MOD_RADIATION: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "was burned by her own radiation"; + break; + case 1: + message = "made her own internal organs glow"; + break; + default: + message = "stumbled into her own nuclear trap"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "was burned by its own radiation"; + break; + case 1: + message = "made its own internal parts glow"; + break; + default: + message = "stumbled into its own nuclear trap"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "was burned by his own radiation"; + break; + case 1: + message = "made his own internal organs glow"; + break; + default: + message = "stumbled into his own nuclear trap"; + break; + } + } + break; + + case MOD_EXPLODING_SHELLS: + //PKMOD Ergodic 06/16/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "was ignited by her own shells"; + break; + case 1: + message = "was toasted by her own lava pellets"; + break; + default: + message = "was evaporated by her own exploding shells"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "was ignited by its own shells"; + break; + case 1: + message = "was toasted by its own lava pellets"; + break; + default: + message = "was evaporated by its own exploding shells"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "was ignited by his own shells"; + break; + case 1: + message = "was toasted by his own lava pellets"; + break; + default: + message = "was evaporated by his own exploding shells"; + break; + } + } + break; + + case MOD_NAIL: + //PKMOD Ergodic 08/01/00 Enable Multi-MOD messages + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "was burned by her own blue spike"; + break; + case 1: + message = "should not have touched her own blue stump"; + break; + default: + message = "got impaled on her own hot nail"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "was burned by its own blue spike"; + break; + case 1: + message = "should not have touched its own blue stump"; + break; + default: + message = "got impaled on its own hot nail"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "was burned by his own blue spike"; + break; + case 1: + message = "should not have touched his own blue stump"; + break; + default: + message = "got impaled on his own hot nail"; + break; + } + } + break; + +#ifdef MISSIONPACK + case MOD_PROXIMITY_MINE: + if( gender == GENDER_FEMALE ) { + message = "found her prox mine"; + } else if ( gender == GENDER_NEUTER ) { + message = "found it's prox mine"; + } else { + message = "found his prox mine"; + } + break; +#endif + + case MOD_CRUSH_CREDIT: + //PKMOD Ergodic 01/11/01 - Enable Multi-MOD messages for Activator of trap + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "squished her own dumb self"; + break; + case 1: + message = "is now 2D thanks to herself"; + break; + default: + message = "was flattened by her own trap"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "squished its own dumb self"; + break; + case 1: + message = "is now 2D thanks to itself"; + break; + default: + message = "was flattened by its own trap"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "squished his own dumb self"; + break; + case 1: + message = "is now 2D thanks to himself"; + break; + default: + message = "was flattened by his own trap"; + break; + } + } + break; + + //PKMOD - Ergodic 01/05/04 - add QUAD FART beans toot damage (self damage) + case MOD_QUADBEANS_BLAST: + if ( gender == GENDER_FEMALE ) { + switch (rndmsg) { + case 0: + message = "melted her lungs by using Quad Beans"; + break; + case 1: + message = "suffocated in her own enhanced fecal frenzy"; + break; + default: + message = "was kramered in her own caustic bio-gas"; + break; + } + } + else if ( gender == GENDER_NEUTER ) { + switch (rndmsg) { + case 0: + message = "melted its lungs by using Quad Beans"; + break; + case 1: + message = "suffocated in its own enhanced fecal frenzy"; + break; + default: + message = "was kramered in its own caustic bio-gas"; + break; + } + } + else { + switch (rndmsg) { + case 0: + message = "melted his lungs by using Quad Beans"; + break; + case 1: + message = "suffocated in his own enhanced fecal frenzy"; + break; + default: + message = "was kramered in his own caustic bio-gas"; + break; + } + } + break; + + default: + if ( gender == GENDER_FEMALE ) + message = "killed herself"; + else if ( gender == GENDER_NEUTER ) + message = "killed itself"; + else + message = "killed himself"; + break; + } + } + + if (message) { + CG_Printf( "%s %s.\n", targetName, message); + return; + } + + // check for kill messages from the current clientNum + //pkmod - Ergodic 12/18/02 - if suicide and not a Private Bot + //if ( attacker == cg.snap->ps.clientNum ) { + if ( ( attacker == cg.snap->ps.clientNum ) && ( ent->time2 != 1 ) ) { + char *s; + + if ( cgs.gametype < GT_TEAM ) { + s = va("You fragged %s\n%s place with %i", targetName, + CG_PlaceString( cg.snap->ps.persistant[PERS_RANK] + 1 ), + cg.snap->ps.persistant[PERS_SCORE] ); + } else { + s = va("You fragged %s", targetName ); + } +#ifdef MISSIONPACK + if (!(cg_singlePlayerActive.integer && cg_cameraOrbit.integer)) { + CG_CenterPrint( s, SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + } +#else + CG_CenterPrint( s, SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); +#endif + + // print the text message as well + } + + // check for double client messages + if ( !attackerInfo ) { + attacker = ENTITYNUM_WORLD; + strcpy( attackerName, "noname" ); + } else { + Q_strncpyz( attackerName, Info_ValueForKey( attackerInfo, "n" ), sizeof(attackerName) - 2); + strcat( attackerName, S_COLOR_WHITE ); + // check for kill messages about the current clientNum + if ( target == cg.snap->ps.clientNum ) { + Q_strncpyz( cg.killerName, attackerName, sizeof( cg.killerName ) ); + } + } + + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + rndmsg = rand() % 3; //Generate random numbers: {0,1,2} + + if ( attacker != ENTITYNUM_WORLD ) { + switch (mod) { + case MOD_GRAPPLE: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was caught by"; + break; + case 1: + message = "got"; + message2 = "'s point"; + break; + default: + message = "merged with"; + message2 = "'s spear"; + break; + } + break; + case MOD_GAUNTLET: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was touched by"; + break; + case 1: + message = "got too close to"; + message2 = "'s reach"; + break; + default: + message = "was ripped to pieces by"; + break; + } + break; + case MOD_MACHINEGUN: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was actually killed by"; + message2 = "'s wimpy default weapon"; + break; + case 1: + message = "received excessive rat-a-tap-tap from"; + break; + default: + message = "was slower on the draw than"; + break; + } + break; + case MOD_SHOTGUN: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "ate a whole lot of"; + message2 = "'s pellets"; + break; + case 1: + message = "was double-barreled by"; + break; + default: + message = "was blasted by"; + message2 = "'s shotgun"; + break; + } + break; + case MOD_GRENADE: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "caught"; + message2 = "'s pineapple toss"; + break; + case 1: + message = "triggered"; + message2 = "'s hot potato"; + break; + default: + message = "'s parts were scattered by"; + message2 = "'s lucky throw"; + break; + } + break; + case MOD_GRENADE_SPLASH: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "didn't run away quick enough from"; + message2 = "'s grenade"; + break; + case 1: + message = "was spammed by"; + break; + default: + message = "was perforated by"; + message2 = "'s shrapnel"; + break; + } + break; + case MOD_ROCKET: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was personally detonated"; + message2 = "'s rocket"; + break; + case 1: + message = "caught a strong-one from"; + break; + default: + message = "reached Valhalla on"; + message2 = "'s missile"; + break; + } + break; + case MOD_ROCKET_SPLASH: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "should have zagged from"; + message2 = "'s rocket"; + break; + case 1: + message = "almost got away from"; + message2 = "'s wrath missile"; + break; + default: + message = "was splashed down by"; + break; + } + break; + case MOD_PLASMA: + message = "was melted by"; + message2 = "'s plasmagun"; + break; + case MOD_PLASMA_SPLASH: + message = "was melted by"; + message2 = "'s plasmagun"; + break; + case MOD_RAILGUN: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was 'Dirty Harry`d' by"; + break; + case 1: + message = "was bored through by"; + message2 = "'s magnum slug"; + break; + default: + message = "got another hole from"; + message2 = "'s magnum"; + break; + } + break; + case MOD_LIGHTNING: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was shafted by"; + break; + case 1: + message = "was plugged into the wall socket by"; + break; + default: + message = "was turned extra-crispy by"; + message2 = "'s juice"; + break; + } + break; + case MOD_BFG: + case MOD_BFG_SPLASH: + message = "was blasted by"; + message2 = "'s BFG"; + break; + +#ifdef MISSIONPACK + case MOD_NAIL: + message = "was nailed by"; + break; + case MOD_CHAINGUN: + message = "got lead poisoning from"; + message2 = "'s Chaingun"; + break; + case MOD_PROXIMITY_MINE: + message = "was too close to"; + message2 = "'s Prox Mine"; + break; + case MOD_KAMIKAZE: + message = "falls to"; + message2 = "'s Kamikaze blast"; + break; + case MOD_JUICED: + message = "was juiced by"; + break; +#endif + + //PKMOD + /*PKMOD -Add Weapons. + WP_HARPOON, + WP_GRAVITY, + WP_SENTRY, + WP_BEARTRAP, + WP_CHAINLG, + WP_A2K, + WP_EMPNUKE, + WP_AIRFIST, + WP_NAILGUN, + PKMOD -Add Weapons. */ + +/*PKMOD - Ergodic 06/05/03 - remove dead code for CLG... + case MOD_HARPOON: + message = "penetrated by"; + break; +end 06/05/03 remove section*/ + + case MOD_GRAVITY: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was sucked into"; + message2 = "'s well"; + break; + case 1: + message = "left this dimension through"; + message2 = "'s door"; + break; + default: + message = "knows the fate of the universe thanks to"; + break; + } + break; + case MOD_SENTRY: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "mistook"; + message2 = "'s sentry for an ATM"; + break; + case 1: + message = "was shot up by"; + message2 = "'s sentry"; + break; + default: + message = "was mowed down by"; + message2 = "'s sentry"; + break; + } + break; + //PKMOD - Ergodic 01/13/01 - exploding autosentry will produce splash damage + case MOD_SENTRY_SPLASH: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was caught in"; + message2 = "'s detonating sentry"; + break; + case 1: + message = "was shredded by the shrapnel from"; + message2 = "'s sentry"; + break; + default: + message = "tried to play with"; + message2 = "'s little R2D2 buddy"; + break; + } + break; + case MOD_BEARTRAP: + //PKMOD Ergodic 06/12/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "lost some limbs in"; + message2 = "'s beartrap"; + break; + case 1: + message = "was snared by"; + message2 = "'s beartrap"; + break; + default: + message = "should have jumped over"; + message2 = "'s beartrap"; + break; + } + break; +/*PKMOD - Ergodic 06/05/03 - remove dead code for CLG... + case MOD_CHAINLG: + message = "was fried by"; + break; + case MOD_A2K: + message = "was obliterated by"; + break; + case MOD_EMPNUKE: + message = "was nuked by"; + break; +end 06/05/03 remove section*/ + + case MOD_AIRFIST: + switch (rndmsg) { + case 0: + message = "was blown by"; + message2 = "'s airfist"; + break; + case 1: + message = "was flattened by"; + message2 = "'s draft"; + break; + default: + message = "was punched out by"; + message2 = "'s wind"; + break; + } + break; + case MOD_EXPLODING_SHELLS: + //PKMOD Ergodic 06/16/00 Enable Multi-MOD messages + //PKMOD Ergodic 07/14/00 fixed grammar + switch (rndmsg) { + case 0: + message = "was ignited by"; + message2 = "'s shells"; + break; + case 1: + message = "was toasted by"; + message2 = "'s lava pellets"; + break; + default: + message = "was incinerated by"; + message2 = "'s exploding shells"; + break; + } + break; + case MOD_EXPLODING_SHELLS_SPLASH: + //PKMOD Ergodic 06/16/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "could not out run"; + message2 = "'s exploding shells"; + break; + case 1: + message = "was hot-waxed by"; + break; + default: + message = "felt"; + message2 = "'s napalm"; + break; + } + break; + case MOD_NAILGUN: + //PKMOD Ergodic 08/01/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was nailed by"; + break; + case 1: + message = "was pinned in place by"; + message2 = "'s spike"; + break; + default: + message = "got a new hole added by"; + message2 = "'s nailgun"; + break; + } + break; + case MOD_NAIL: + //PKMOD Ergodic 08/01/00 Enable Multi-MOD messages + switch (rndmsg) { + case 0: + message = "was burned by"; + message2 = "'s blue spike"; + break; + case 1: + message = "should not have touched"; + message2 = "'s blue stump"; + break; + default: + message = "got impaled on"; + message2 = "'s hot nail"; + break; + } + break; + case MOD_CRUSH_CREDIT: + //PKMOD Ergodic 01/11/01 - Enable Multi-MOD messages for Activator of trap + switch (rndmsg) { + case 0: + message = "was squished by"; + break; + case 1: + message = "is now '2D' thanks to"; + break; + default: + message = "was flattened by"; + message2 = "'s trap"; + break; + } + break; + + //PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water + case MOD_LIGHTNING_WATER_DISCHARGE: + switch (rndmsg) { + case 0: + message = "was caught by"; + message2 = "'s electrical discharge"; + break; + case 1: + message = "needs to stay away from"; + message2 = "'s lame water trap"; + break; + default: + message = "was fried by"; + message2 = "'s suicide shaft"; + break; + } + break; + + //PKMOD - Ergodic 02/01/01 - add can of beans toot damage + case MOD_BEANS_BLAST: + switch (rndmsg) { + case 0: + message = "was engulfed by"; + message2 = "'s fecal plume"; + break; + case 1: + message = "was smothered thanks to"; + message2 = "'s Bean blast"; + break; + default: + message = "was poisoned by"; + message2 = "'s gas shroud"; + break; + } + break; + + //PKMOD - Ergodic 10/29/01 - add holdable radiation death + case MOD_RADIATION: + switch (rndmsg) { + case 0: + message = "was burned by"; + message2 = "'s radiation"; + break; + case 1: + message = "'s flesh was set ablaze by"; + message2 = "'s nuclear trap"; + break; + default: + message = "succumbed to radiation exposure from"; + break; + } + break; + + //PKMOD - Ergodic 08/02/02 - add holdable Personal Sentry death + case MOD_PERSONALSENTRY: + switch (rndmsg) { + case 0: + message = "ate some shoulder mounted love from"; + message2 = "'s auto cannon"; + break; + case 1: + message = "was chewed up by"; + message2 = "'s A.I. pet"; + break; + default: + message = "was hosed down by"; + message2 = "'s Personal Sentry"; + break; + } + break; + + //PKMOD - Ergodic 10/23/02 - Create new Means of Death for the Dragon Blade + case MOD_DRAGONBLADE: + switch (rndmsg) { + case 0: + message = "was bitten by the teeth of"; + message2 = "'s Dragon"; + break; + case 1: + message = "lost some chunks of flesh from"; + message2 = "'s Dragon Bite"; + break; + default: + message = "was carved into bits by"; + message2 = "'s Dragon Blade"; + break; + } + break; + + //PKMOD - Ergodic 01/05/04 - add QUAD FART beans toot damage + case MOD_QUADBEANS_BLAST: + switch (rndmsg) { + case 0: + message = "'s lungs were melted by"; + message2 = "'s Quaded Beans"; + break; + case 1: + message = "suffocated in"; + message2 = "'s enhanced fecal frenzy"; + break; + default: + message = "was kramered in"; + message2 = "'s caustic bio-gas"; + break; + } + break; + + + + //PKMOD + case MOD_TELEFRAG: + message = "tried to invade"; + message2 = "'s personal space"; + break; + default: + message = "was killed by"; + break; + } + + if (message) { + CG_Printf( "%s %s %s%s\n", + targetName, message, attackerName, message2); + return; + } + } + + // we don't know what it was + CG_Printf( "%s died.\n", targetName ); +} + +//========================================================================== + +/* +=============== +CG_UseItem +=============== +*/ +static void CG_UseItem( centity_t *cent ) { + clientInfo_t *ci; + int itemNum, clientNum; + gitem_t *item; + entityState_t *es; + + es = ¢->currentState; + + itemNum = (es->event & ~EV_EVENT_BITS) - EV_USE_ITEM0; + if ( itemNum < 0 || itemNum > HI_NUM_HOLDABLE ) { + itemNum = 0; + } + + // print a message if the local player + if ( es->number == cg.snap->ps.clientNum ) { + if ( !itemNum ) { + CG_CenterPrint( "No item to use", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + } else { + //PKMOD - Ergodic 12/08/01 - give unique message for the PRIAVTE BOT + if ( itemNum == HI_BOTHEAD ) + CG_CenterPrint( "Activating Private Bot", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + else { + item = BG_FindItemForHoldable( itemNum ); + CG_CenterPrint( va("Use %s", item->pickup_name), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + } + } + } + + switch ( itemNum ) { + default: + case HI_NONE: + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.useNothingSound ); + break; + + case HI_TELEPORTER: + break; + + case HI_MEDKIT: + clientNum = cent->currentState.clientNum; + if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { + ci = &cgs.clientinfo[ clientNum ]; + ci->medkitUsageTime = cg.time; + } + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.medkitSound ); + break; + + //PKMOD - Ergodic 10/13/01 - add new holdable code for RADIATE + case HI_RADIATE: + clientNum = cent->currentState.clientNum; + if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { + ci = &cgs.clientinfo[ clientNum ]; + ci->medkitUsageTime = cg.time; + } + //PKMOD - Ergodic 08/02/02 - Holdable: radiate activation sound + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.pkaradiateactivationSound ); + break; + + //PKMOD - Ergodic 12/08/01 - add new holdable code for PRIVATE BOT + case HI_BOTHEAD: + break; + + //PKMOD - Ergodic 08/02/02 - add new holdable code for PERSONAL SENTRY (no sound) + case HI_PERSENTRY: + break; + +#ifdef MISSIONPACK + case HI_KAMIKAZE: + break; + + case HI_PORTAL: + break; + case HI_INVULNERABILITY: + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.useInvulnerabilitySound ); + break; +#endif + } + +} + + +//PKMOD - Ergodic 11/17/00 - code for removing item from client +static void CG_ItemRemove( int itemNum ) { + int hold_giTag; + int i; + qboolean holding_shotgun; + +// cg.itemPickup = 0; //was itemNum +// cg.itemPickupTime = cg.time; +// cg.itemPickupBlendTime = cg.time; + + // see if it should be the grabbed weapon + if ( bg_itemlist[itemNum].giType == IT_WEAPON ) { + hold_giTag = bg_itemlist[itemNum].giTag; //get the weapon tag + + cg.snap->ps.stats[ STAT_WEAPONS ] &= ~( 1 << hold_giTag ); //remove the weapon + + holding_shotgun = qfalse; + //if removing the exploding shotgun then also remove the non-exploding shotgun + if ( hold_giTag == WP_EXPLODING_SHELLS ) { + holding_shotgun = qtrue; + cg.snap->ps.stats[ STAT_WEAPONS ] &= ~( 1 << WP_SHOTGUN ); + } + + //if removing the shotgun then also remove the exploding shells shotgun + if ( hold_giTag == WP_SHOTGUN ) { + holding_shotgun = qtrue; + cg.snap->ps.stats[ STAT_WEAPONS ] &= ~( 1 << WP_EXPLODING_SHELLS ); + } + + // do we hold the weapon that is to be removed? + if ( ( cg.weaponSelect == hold_giTag ) || holding_shotgun ) { + switch ( hold_giTag ) { + case WP_BEARTRAP: + case WP_GRAVITY: + case WP_SENTRY: + case WP_BEANS: + cg.weaponSelect = 1; + break; + default: + for ( i = WP_GRAPPLING_HOOK - 1; i > 0 ; i-- ) { + //modelled after CG_WeaponSelectable( ) + //check ammo + if (i == WP_SHOTGUN) { + if ( (!cg.snap->ps.ammo[WP_SHOTGUN]) && (!cg.snap->ps.ammo[WP_EXPLODING_SHELLS]) ) { + continue; + } + } + else if ( !cg.snap->ps.ammo[i] ) { + continue; + } + //check weapon + if ( ! (cg.snap->ps.stats[ STAT_WEAPONS ] & ( 1 << i ) ) ) { + continue; + } + + cg.weaponSelect = i; + break; + } + } + cg.weaponSelectTime = cg.time; + } + + } +} + +/* +================ +CG_ItemPickup + +A new item was picked up this frame +//PKMOD - Ergodic 07/06/00 - modified "autoswitch" logic for exploding shells and PKA Items +//PKMOD - Ergodic 07/06/00 (later in the day) - if pickup item is ammo_expshell and current +// weapon is the WP_SHOTGUN then switch to WP_EXPLODING_SHELLS +//PKMOD - Ergodic 07/06/00 handle case of picking up a "dropped" WP_EXPLODING_SHELLS when +// the current weapon is the WP_SHOTGUN then switch to WP_EXPLODING_SHELLS +================ +*/ +static void CG_ItemPickup( int itemNum ) { + int hold_giTag; + + cg.itemPickup = itemNum; + cg.itemPickupTime = cg.time; + cg.itemPickupBlendTime = cg.time; + // see if it should be the grabbed weapon + if ( bg_itemlist[itemNum].giType == IT_WEAPON ) { + hold_giTag = bg_itemlist[itemNum].giTag; + // select it immediately + if ( cg_autoswitch.integer && hold_giTag != WP_MACHINEGUN ) { + //PKMOD - Ergodic 07/06/00 - do not autoswitch to PKA Items + if ( hold_giTag == WP_GRAVITY ) + return; + if ( hold_giTag == WP_SENTRY ) + return; + if ( hold_giTag == WP_BEARTRAP ) + return; + if ( hold_giTag == WP_BEANS ) + return; + //PKMOD - Ergodic 07/06/00 - Logic for excploding shells + // if exploding shells in inventory then switch to exploding shells gun + if ( hold_giTag == WP_SHOTGUN ) { + if ( cg.snap->ps.ammo[WP_EXPLODING_SHELLS] ) + cg.weaponSelect = WP_EXPLODING_SHELLS; + else + cg.weaponSelect = WP_SHOTGUN; + + cg.weaponSelectTime = cg.time; + return; + } + + cg.weaponSelectTime = cg.time; + cg.weaponSelect = bg_itemlist[itemNum].giTag; + return; + } + + //PKMOD - Ergodic 07/06/00 handle case of picking up a "dropped" WP_EXPLODING_SHELLS when + // the current weapon is the WP_SHOTGUN then switch to WP_EXPLODING_SHELLS + if ( hold_giTag == WP_EXPLODING_SHELLS ) { + if ( cg.weaponSelect == WP_SHOTGUN ) { + cg.weaponSelect = WP_EXPLODING_SHELLS; + cg.weaponSelectTime = cg.time; + return; + } + } + + } + //case of picking up ammo_expshells 07/06/00 (later in the day) + else if ( ( bg_itemlist[itemNum].giType == IT_AMMO ) && bg_itemlist[itemNum].giTag == WP_EXPLODING_SHELLS) { + if ( cg.weaponSelect == WP_SHOTGUN ) { //is the shotgun the current model + //change weapon to exploding shells + cg.weaponSelect = WP_EXPLODING_SHELLS; + cg.weaponSelectTime = cg.time; + } + } +} + + +/* +================ +CG_PainEvent + +Also called by playerstate transition +================ +*/ +void CG_PainEvent( centity_t *cent, int health ) { + char *snd; + + // don't do more than two pain sounds a second + if ( cg.time - cent->pe.painTime < 500 ) { + return; + } + + if ( health < 25 ) { + snd = "*pain25_1.wav"; + } else if ( health < 50 ) { + snd = "*pain50_1.wav"; + } else if ( health < 75 ) { + snd = "*pain75_1.wav"; + } else { + snd = "*pain100_1.wav"; + } + trap_S_StartSound( NULL, cent->currentState.number, CHAN_VOICE, + CG_CustomSound( cent->currentState.number, snd ) ); + + // save pain time for programitic twitch animation + cent->pe.painTime = cg.time; + cent->pe.painDirection ^= 1; +} + + + +/* +============== +CG_EntityEvent + +An entity has an event value +also called by CG_CheckPlayerstateEvents +============== +*/ +#define DEBUGNAME(x) if(cg_debugEvents.integer){CG_Printf(x"\n");} +void CG_EntityEvent( centity_t *cent, vec3_t position ) { + entityState_t *es; + int event; + vec3_t dir; + const char *s; + int clientNum; + clientInfo_t *ci; + + es = ¢->currentState; + event = es->event & ~EV_EVENT_BITS; + + if ( cg_debugEvents.integer ) { + CG_Printf( "ent:%3i event:%3i ", es->number, event ); + } + + if ( !event ) { + DEBUGNAME("ZEROEVENT"); + return; + } + + clientNum = es->clientNum; + if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + clientNum = 0; + } + ci = &cgs.clientinfo[ clientNum ]; + + switch ( event ) { + // + // movement generated events + // + case EV_FOOTSTEP: + DEBUGNAME("EV_FOOTSTEP"); + if (cg_footsteps.integer) { + trap_S_StartSound (NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ ci->footsteps ][rand()&3] ); + } + break; + case EV_FOOTSTEP_METAL: + DEBUGNAME("EV_FOOTSTEP_METAL"); + if (cg_footsteps.integer) { + trap_S_StartSound (NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_METAL ][rand()&3] ); + } + break; + case EV_FOOTSPLASH: + DEBUGNAME("EV_FOOTSPLASH"); + if (cg_footsteps.integer) { + trap_S_StartSound (NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); + } + break; + case EV_FOOTWADE: + DEBUGNAME("EV_FOOTWADE"); + if (cg_footsteps.integer) { + trap_S_StartSound (NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); + } + break; + case EV_SWIM: + DEBUGNAME("EV_SWIM"); + if (cg_footsteps.integer) { + trap_S_StartSound (NULL, es->number, CHAN_BODY, + cgs.media.footsteps[ FOOTSTEP_SPLASH ][rand()&3] ); + } + break; + + + case EV_FALL_SHORT: + DEBUGNAME("EV_FALL_SHORT"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.landSound ); + if ( clientNum == cg.predictedPlayerState.clientNum ) { + // smooth landing z changes + cg.landChange = -8; + cg.landTime = cg.time; + } + break; + case EV_FALL_MEDIUM: + DEBUGNAME("EV_FALL_MEDIUM"); + // use normal pain sound + trap_S_StartSound( NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*pain100_1.wav" ) ); + if ( clientNum == cg.predictedPlayerState.clientNum ) { + // smooth landing z changes + cg.landChange = -16; + cg.landTime = cg.time; + } + break; + case EV_FALL_FAR: + DEBUGNAME("EV_FALL_FAR"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, CG_CustomSound( es->number, "*fall1.wav" ) ); + cent->pe.painTime = cg.time; // don't play a pain sound right after this + if ( clientNum == cg.predictedPlayerState.clientNum ) { + // smooth landing z changes + cg.landChange = -24; + cg.landTime = cg.time; + } + break; + + case EV_STEP_4: + case EV_STEP_8: + case EV_STEP_12: + case EV_STEP_16: // smooth out step up transitions + DEBUGNAME("EV_STEP"); + { + float oldStep; + int delta; + int step; + + if ( clientNum != cg.predictedPlayerState.clientNum ) { + break; + } + // if we are interpolating, we don't need to smooth steps + if ( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW) || + cg_nopredict.integer || cg_synchronousClients.integer ) { + break; + } + // check for stepping up before a previous step is completed + delta = cg.time - cg.stepTime; + if (delta < STEP_TIME) { + oldStep = cg.stepChange * (STEP_TIME - delta) / STEP_TIME; + } else { + oldStep = 0; + } + + // add this amount + step = 4 * (event - EV_STEP_4 + 1 ); + cg.stepChange = oldStep + step; + if ( cg.stepChange > MAX_STEP_CHANGE ) { + cg.stepChange = MAX_STEP_CHANGE; + } + cg.stepTime = cg.time; + break; + } + + case EV_JUMP_PAD: + DEBUGNAME("EV_JUMP_PAD"); +// CG_Printf( "EV_JUMP_PAD w/effect #%i\n", es->eventParm ); + { + localEntity_t *smoke; + vec3_t up = {0, 0, 1}; + + + smoke = CG_SmokePuff( cent->lerpOrigin, up, + 32, + 1, 1, 1, 0.33f, + 1000, + cg.time, 0, + LEF_PUFF_DONT_SCALE, + cgs.media.smokePuffShader ); + } + + // boing sound at origin, jump sound on player + trap_S_StartSound ( cent->lerpOrigin, -1, CHAN_VOICE, cgs.media.jumpPadSound ); + trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*jump1.wav" ) ); + break; + + case EV_JUMP: + DEBUGNAME("EV_JUMP"); + trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*jump1.wav" ) ); + break; + case EV_TAUNT: + DEBUGNAME("EV_TAUNT"); + trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, "*taunt.wav" ) ); + break; +#ifdef MISSIONPACK + case EV_TAUNT_YES: + DEBUGNAME("EV_TAUNT_YES"); + CG_VoiceChatLocal(SAY_TEAM, qfalse, es->number, COLOR_CYAN, VOICECHAT_YES); + break; + case EV_TAUNT_NO: + DEBUGNAME("EV_TAUNT_NO"); + CG_VoiceChatLocal(SAY_TEAM, qfalse, es->number, COLOR_CYAN, VOICECHAT_NO); + break; + case EV_TAUNT_FOLLOWME: + DEBUGNAME("EV_TAUNT_FOLLOWME"); + CG_VoiceChatLocal(SAY_TEAM, qfalse, es->number, COLOR_CYAN, VOICECHAT_FOLLOWME); + break; + case EV_TAUNT_GETFLAG: + DEBUGNAME("EV_TAUNT_GETFLAG"); + CG_VoiceChatLocal(SAY_TEAM, qfalse, es->number, COLOR_CYAN, VOICECHAT_ONGETFLAG); + break; + case EV_TAUNT_GUARDBASE: + DEBUGNAME("EV_TAUNT_GUARDBASE"); + CG_VoiceChatLocal(SAY_TEAM, qfalse, es->number, COLOR_CYAN, VOICECHAT_ONDEFENSE); + break; + case EV_TAUNT_PATROL: + DEBUGNAME("EV_TAUNT_PATROL"); + CG_VoiceChatLocal(SAY_TEAM, qfalse, es->number, COLOR_CYAN, VOICECHAT_ONPATROL); + break; +#endif + case EV_WATER_TOUCH: + DEBUGNAME("EV_WATER_TOUCH"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrInSound ); + break; + case EV_WATER_LEAVE: + DEBUGNAME("EV_WATER_LEAVE"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrOutSound ); + break; + case EV_WATER_UNDER: + DEBUGNAME("EV_WATER_UNDER"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.watrUnSound ); + break; + case EV_WATER_CLEAR: + DEBUGNAME("EV_WATER_CLEAR"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, CG_CustomSound( es->number, "*gasp.wav" ) ); + break; + + case EV_ITEM_PICKUP: + DEBUGNAME("EV_ITEM_PICKUP"); + { + gitem_t *item; + int index; + + index = es->eventParm; // player predicted + + if ( index < 1 || index >= bg_numItems ) { + break; + } + item = &bg_itemlist[ index ]; + + //PKMOD - Ergodic 08/13/01 - Debug dragon infinite (inactive) +// if(cg_debugEvents.integer) +// Com_Printf("CG_EntityEvent - Pickup, Item>%d<, Weapon>%d<, BT_AMMO>%d<\n", item->giTag, cent->currentState.weapon, cg.snap->ps.ammo[WP_BEARTRAP] ); + + + // powerups and team items will have a separate global sound, this one + // will be played at prediction time + if ( item->giType == IT_POWERUP || item->giType == IT_TEAM) { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.n_healthSound ); + } else if (item->giType == IT_PERSISTANT_POWERUP) { +#ifdef MISSIONPACK + switch (item->giTag ) { + case PW_SCOUT: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.scoutSound ); + break; + case PW_GUARD: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.guardSound ); + break; + case PW_DOUBLER: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.doublerSound ); + break; + case PW_AMMOREGEN: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.ammoregenSound ); + break; + } +#endif + } else { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, trap_S_RegisterSound( item->pickup_sound, qfalse ) ); + } + + // show icon and name on status bar + if ( es->number == cg.snap->ps.clientNum ) { + CG_ItemPickup( index ); + } + } + break; + + //PKMOD - Ergodic 12/05/01 - Radiate Item event + case EV_ITEM_RADIATE: + DEBUGNAME("EV_ITEM_RADIATE"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.pkaradiateitemSound ); + break; + + //PKMOD - Ergodic 12/05/01 - Radiate Player event + case EV_PLAYER_RADIATE: + DEBUGNAME("EV_PLAYER_RADIATE"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.pkaradiateplayerSound ); + break; + + case EV_GLOBAL_ITEM_PICKUP: + DEBUGNAME("EV_GLOBAL_ITEM_PICKUP"); + { + gitem_t *item; + int index; + + index = es->eventParm; // player predicted + + if ( index < 1 || index >= bg_numItems ) { + break; + } + item = &bg_itemlist[ index ]; + // powerup pickups are global + if( item->pickup_sound ) { + trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, trap_S_RegisterSound( item->pickup_sound, qfalse ) ); + } + + // show icon and name on status bar + if ( es->number == cg.snap->ps.clientNum ) { + CG_ItemPickup( index ); + } + } + break; + + // + // weapon events + // + case EV_NOAMMO: + DEBUGNAME("EV_NOAMMO"); +// trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.noAmmoSound ); + if ( es->number == cg.snap->ps.clientNum ) { + CG_OutOfAmmoChange(); + } + break; + case EV_CHANGE_WEAPON: + DEBUGNAME("EV_CHANGE_WEAPON"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.selectSound ); + //PKMOD - Ergodic 08/13/01 - Debug dragon infinite (inactive) +// if(cg_debugEvents.integer) +// Com_Printf("CG_EntityEvent - Change Weapon>%d<, Select>%d<, BT_AMMO>%d<, predicted BT_AMMO>%d<\n",cent->currentState.weapon, cg.weaponSelect, cg.snap->ps.ammo[WP_BEARTRAP], cg.predictedPlayerState.ammo[WP_BEARTRAP] ); + break; + case EV_FIRE_WEAPON: + DEBUGNAME("EV_FIRE_WEAPON"); + //PKMOD - Ergodic 08/13/01 - Debug dragon infinite (inactive) +// if(cg_debugEvents.integer) +// Com_Printf("CG_EntityEvent - Fire Weapon>%d<, Select>%d<, generic1>%d<, BT_AMMO>%d<, predicted BT_AMMO>%d<\n",cent->currentState.weapon, cg.weaponSelect, cent->currentState.generic1 & 15, cg.snap->ps.ammo[WP_BEARTRAP], cg.predictedPlayerState.ammo[WP_BEARTRAP] ); + CG_FireWeapon( cent ); + break; + + case EV_USE_ITEM0: + DEBUGNAME("EV_USE_ITEM0"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM1: + DEBUGNAME("EV_USE_ITEM1"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM2: + DEBUGNAME("EV_USE_ITEM2"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM3: + DEBUGNAME("EV_USE_ITEM3"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM4: + DEBUGNAME("EV_USE_ITEM4"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM5: + DEBUGNAME("EV_USE_ITEM5"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM6: + DEBUGNAME("EV_USE_ITEM6"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM7: + DEBUGNAME("EV_USE_ITEM7"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM8: + DEBUGNAME("EV_USE_ITEM8"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM9: + DEBUGNAME("EV_USE_ITEM9"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM10: + DEBUGNAME("EV_USE_ITEM10"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM11: + DEBUGNAME("EV_USE_ITEM11"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM12: + DEBUGNAME("EV_USE_ITEM12"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM13: + DEBUGNAME("EV_USE_ITEM13"); + CG_UseItem( cent ); + break; + case EV_USE_ITEM14: + DEBUGNAME("EV_USE_ITEM14"); + CG_UseItem( cent ); + break; + + //================================================================= + + // + // other events + // + case EV_PLAYER_TELEPORT_IN: + DEBUGNAME("EV_PLAYER_TELEPORT_IN"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.teleInSound ); + CG_SpawnEffect( position); + break; + + case EV_PLAYER_TELEPORT_OUT: + DEBUGNAME("EV_PLAYER_TELEPORT_OUT"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.teleOutSound ); + CG_SpawnEffect( position); + break; + + case EV_ITEM_POP: + DEBUGNAME("EV_ITEM_POP"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.respawnSound ); + break; + case EV_ITEM_RESPAWN: + DEBUGNAME("EV_ITEM_RESPAWN"); + cent->miscTime = cg.time; // scale up from this + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.respawnSound ); + break; + + case EV_GRENADE_BOUNCE: + DEBUGNAME("EV_GRENADE_BOUNCE"); + if ( rand() & 1 ) { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.hgrenb1aSound ); + } else { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.hgrenb2aSound ); + } + break; + +#ifdef MISSIONPACK + case EV_PROXIMITY_MINE_STICK: + DEBUGNAME("EV_PROXIMITY_MINE_STICK"); + if( es->eventParm & SURF_FLESH ) { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.wstbimplSound ); + } else if( es->eventParm & SURF_METALSTEPS ) { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.wstbimpmSound ); + } else { + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.wstbimpdSound ); + } + break; + + case EV_PROXIMITY_MINE_TRIGGER: + DEBUGNAME("EV_PROXIMITY_MINE_TRIGGER"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.wstbactvSound ); + break; + case EV_KAMIKAZE: + DEBUGNAME("EV_KAMIKAZE"); + CG_KamikazeEffect( cent->lerpOrigin ); + break; + case EV_OBELISKEXPLODE: + DEBUGNAME("EV_OBELISKEXPLODE"); + CG_ObeliskExplode( cent->lerpOrigin, es->eventParm ); + break; + case EV_OBELISKPAIN: + DEBUGNAME("EV_OBELISKPAIN"); + CG_ObeliskPain( cent->lerpOrigin ); + break; + case EV_INVUL_IMPACT: + DEBUGNAME("EV_INVUL_IMPACT"); + CG_InvulnerabilityImpact( cent->lerpOrigin, cent->currentState.angles ); + break; + case EV_JUICED: + DEBUGNAME("EV_JUICED"); + CG_InvulnerabilityJuiced( cent->lerpOrigin ); + break; + case EV_LIGHTNINGBOLT: + DEBUGNAME("EV_LIGHTNINGBOLT"); + CG_LightningBoltBeam(es->origin2, es->pos.trBase); + break; +#endif + case EV_SCOREPLUM: + DEBUGNAME("EV_SCOREPLUM"); + CG_ScorePlum( cent->currentState.otherEntityNum, cent->lerpOrigin, cent->currentState.time ); + break; + + // + // missile impacts + // + case EV_MISSILE_HIT: + DEBUGNAME("EV_MISSILE_HIT"); + ByteToDir( es->eventParm, dir ); + CG_MissileHitPlayer( es->weapon, position, dir, es->otherEntityNum ); + break; + + case EV_MISSILE_MISS: + DEBUGNAME("EV_MISSILE_MISS"); + ByteToDir( es->eventParm, dir ); + CG_MissileHitWall( es->weapon, 0, position, dir, IMPACTSOUND_DEFAULT ); + break; + + case EV_MISSILE_MISS_METAL: + DEBUGNAME("EV_MISSILE_MISS_METAL"); + ByteToDir( es->eventParm, dir ); + CG_MissileHitWall( es->weapon, 0, position, dir, IMPACTSOUND_METAL ); + break; + + case EV_RAILTRAIL: + DEBUGNAME("EV_RAILTRAIL"); + cent->currentState.weapon = WP_RAILGUN; + // if the end was on a nomark surface, don't make an explosion + CG_RailTrail( ci, es->origin2, es->pos.trBase ); + if ( es->eventParm != 255 ) { + ByteToDir( es->eventParm, dir ); + CG_MissileHitWall( es->weapon, es->clientNum, position, dir, IMPACTSOUND_DEFAULT ); + } + break; + + //PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability + case EV_BULLET_HIT_WALL: + DEBUGNAME("EV_BULLET_HIT_WALL"); + ByteToDir( es->eventParm, dir ); + CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qfalse, ENTITYNUM_WORLD, qfalse ); + break; + + //PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability + case EV_BULLET_HIT_FLESH: + DEBUGNAME("EV_BULLET_HIT_FLESH"); + CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm, qfalse ); + break; + + case EV_SHOTGUN: + DEBUGNAME("EV_SHOTGUN"); + CG_ShotgunFire( es ); + break; + + case EV_GENERAL_SOUND: + DEBUGNAME("EV_GENERAL_SOUND"); + if ( cgs.gameSounds[ es->eventParm ] ) { + trap_S_StartSound (NULL, es->number, CHAN_VOICE, cgs.gameSounds[ es->eventParm ] ); + } else { + s = CG_ConfigString( CS_SOUNDS + es->eventParm ); + trap_S_StartSound (NULL, es->number, CHAN_VOICE, CG_CustomSound( es->number, s ) ); + } + break; + + case EV_GLOBAL_SOUND: // play from the player's head so it never diminishes + DEBUGNAME("EV_GLOBAL_SOUND"); + if ( cgs.gameSounds[ es->eventParm ] ) { + trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, cgs.gameSounds[ es->eventParm ] ); + } else { + s = CG_ConfigString( CS_SOUNDS + es->eventParm ); + trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, CG_CustomSound( es->number, s ) ); + } + break; + + case EV_GLOBAL_TEAM_SOUND: // play from the player's head so it never diminishes + { + DEBUGNAME("EV_GLOBAL_TEAM_SOUND"); + switch( es->eventParm ) { + case GTS_RED_CAPTURE: // CTF: red team captured the blue flag, 1FCTF: red team captured the neutral flag + if ( cgs.clientinfo[cg.clientNum].team == TEAM_RED ) + CG_AddBufferedSound( cgs.media.captureYourTeamSound ); + else + CG_AddBufferedSound( cgs.media.captureOpponentSound ); + break; + case GTS_BLUE_CAPTURE: // CTF: blue team captured the red flag, 1FCTF: blue team captured the neutral flag + if ( cgs.clientinfo[cg.clientNum].team == TEAM_BLUE ) + CG_AddBufferedSound( cgs.media.captureYourTeamSound ); + else + CG_AddBufferedSound( cgs.media.captureOpponentSound ); + break; + case GTS_RED_RETURN: // CTF: blue flag returned, 1FCTF: never used + if ( cgs.clientinfo[cg.clientNum].team == TEAM_RED ) + CG_AddBufferedSound( cgs.media.returnYourTeamSound ); + else + CG_AddBufferedSound( cgs.media.returnOpponentSound ); + // + CG_AddBufferedSound( cgs.media.blueFlagReturnedSound ); + break; + case GTS_BLUE_RETURN: // CTF red flag returned, 1FCTF: neutral flag returned + if ( cgs.clientinfo[cg.clientNum].team == TEAM_BLUE ) + CG_AddBufferedSound( cgs.media.returnYourTeamSound ); + else + CG_AddBufferedSound( cgs.media.returnOpponentSound ); + // + CG_AddBufferedSound( cgs.media.redFlagReturnedSound ); + break; + + case GTS_RED_TAKEN: // CTF: red team took blue flag, 1FCTF: blue team took the neutral flag + // if this player picked up the flag then a sound is played in CG_CheckLocalSounds + if (cg.snap->ps.powerups[PW_BLUEFLAG] || cg.snap->ps.powerups[PW_NEUTRALFLAG]) { + } + else { + if (cgs.clientinfo[cg.clientNum].team == TEAM_BLUE) { +#ifdef MISSIONPACK + if (cgs.gametype == GT_1FCTF) + CG_AddBufferedSound( cgs.media.yourTeamTookTheFlagSound ); + else +#endif + CG_AddBufferedSound( cgs.media.enemyTookYourFlagSound ); + } + else if (cgs.clientinfo[cg.clientNum].team == TEAM_RED) { +#ifdef MISSIONPACK + if (cgs.gametype == GT_1FCTF) + CG_AddBufferedSound( cgs.media.enemyTookTheFlagSound ); + else +#endif + CG_AddBufferedSound( cgs.media.yourTeamTookEnemyFlagSound ); + } + } + break; + case GTS_BLUE_TAKEN: // CTF: blue team took the red flag, 1FCTF red team took the neutral flag + // if this player picked up the flag then a sound is played in CG_CheckLocalSounds + if (cg.snap->ps.powerups[PW_REDFLAG] || cg.snap->ps.powerups[PW_NEUTRALFLAG]) { + } + else { + if (cgs.clientinfo[cg.clientNum].team == TEAM_RED) { +#ifdef MISSIONPACK + if (cgs.gametype == GT_1FCTF) + CG_AddBufferedSound( cgs.media.yourTeamTookTheFlagSound ); + else +#endif + CG_AddBufferedSound( cgs.media.enemyTookYourFlagSound ); + } + else if (cgs.clientinfo[cg.clientNum].team == TEAM_BLUE) { +#ifdef MISSIONPACK + if (cgs.gametype == GT_1FCTF) + CG_AddBufferedSound( cgs.media.enemyTookTheFlagSound ); + else +#endif + CG_AddBufferedSound( cgs.media.yourTeamTookEnemyFlagSound ); + } + } + break; + case GTS_REDOBELISK_ATTACKED: // Overload: red obelisk is being attacked + if (cgs.clientinfo[cg.clientNum].team == TEAM_RED) { + CG_AddBufferedSound( cgs.media.yourBaseIsUnderAttackSound ); + } + break; + case GTS_BLUEOBELISK_ATTACKED: // Overload: blue obelisk is being attacked + if (cgs.clientinfo[cg.clientNum].team == TEAM_BLUE) { + CG_AddBufferedSound( cgs.media.yourBaseIsUnderAttackSound ); + } + break; + + case GTS_REDTEAM_SCORED: + CG_AddBufferedSound(cgs.media.redScoredSound); + break; + case GTS_BLUETEAM_SCORED: + CG_AddBufferedSound(cgs.media.blueScoredSound); + break; + case GTS_REDTEAM_TOOK_LEAD: + CG_AddBufferedSound(cgs.media.redLeadsSound); + break; + case GTS_BLUETEAM_TOOK_LEAD: + CG_AddBufferedSound(cgs.media.blueLeadsSound); + break; + case GTS_TEAMS_ARE_TIED: + CG_AddBufferedSound( cgs.media.teamsTiedSound ); + break; +#ifdef MISSIONPACK + case GTS_KAMIKAZE: + trap_S_StartLocalSound(cgs.media.kamikazeFarSound, CHAN_ANNOUNCER); + break; +#endif + default: + break; + } + break; + } + + case EV_PAIN: + // local player sounds are triggered in CG_CheckLocalSounds, + // so ignore events on the player + DEBUGNAME("EV_PAIN"); + if ( cent->currentState.number != cg.snap->ps.clientNum ) { + CG_PainEvent( cent, es->eventParm ); + } + break; + + case EV_DEATH1: + case EV_DEATH2: + case EV_DEATH3: + DEBUGNAME("EV_DEATHx"); + trap_S_StartSound( NULL, es->number, CHAN_VOICE, + CG_CustomSound( es->number, va("*death%i.wav", event - EV_DEATH1 + 1) ) ); + break; + + + case EV_OBITUARY: + DEBUGNAME("EV_OBITUARY"); + CG_Obituary( es ); + break; + + // + // powerup events + // + case EV_POWERUP_QUAD: + DEBUGNAME("EV_POWERUP_QUAD"); + if ( es->number == cg.snap->ps.clientNum ) { + cg.powerupActive = PW_QUAD; + cg.powerupTime = cg.time; + } + trap_S_StartSound (NULL, es->number, CHAN_ITEM, cgs.media.quadSound ); + break; + case EV_POWERUP_BATTLESUIT: + DEBUGNAME("EV_POWERUP_BATTLESUIT"); + if ( es->number == cg.snap->ps.clientNum ) { + cg.powerupActive = PW_BATTLESUIT; + cg.powerupTime = cg.time; + } + trap_S_StartSound (NULL, es->number, CHAN_ITEM, cgs.media.protectSound ); + break; + case EV_POWERUP_REGEN: + DEBUGNAME("EV_POWERUP_REGEN"); + if ( es->number == cg.snap->ps.clientNum ) { + cg.powerupActive = PW_REGEN; + cg.powerupTime = cg.time; + } + trap_S_StartSound (NULL, es->number, CHAN_ITEM, cgs.media.regenSound ); + break; + + case EV_GIB_PLAYER: + DEBUGNAME("EV_GIB_PLAYER"); + // don't play gib sound when using the kamikaze because it interferes + // with the kamikaze sound, downside is that the gib sound will also + // not be played when someone is gibbed while just carrying the kamikaze + //PKMOD Ergodic - 07/08/01, remove kamizaki entity flag + // if ( !(es->eFlags & EF_KAMIKAZE) ) { + trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); + // } + CG_GibPlayer( cent->lerpOrigin ); + break; + + case EV_STOPLOOPINGSOUND: + DEBUGNAME("EV_STOPLOOPINGSOUND"); + trap_S_StopLoopingSound( es->number ); + es->loopSound = 0; + break; + + case EV_DEBUG_LINE: + DEBUGNAME("EV_DEBUG_LINE"); + CG_Beam( cent ); + break; + + // PKMOD - Ergodic 07/11/00 Events + case EV_GRAVITY_RELEASED: + DEBUGNAME("EV_GRAVITY_RELEASED"); + cent->miscTime = cg.time; // scale up from this + //PKMOD - Ergodic 07/12/00 change from CHAN_voice to CHAN_AUTO + trap_S_StartSound ( cent->lerpOrigin, -1, CHAN_AUTO, cgs.media.sfx_pkagravitylaunched ); + //PKMOD - Ergodic 11/01/02 - Move the call of this function to cg_ents + // to fix the Invisible Gravity Well bug + //CG_GravityWellActivate( cent->lerpOrigin ); + break; + + // + // PKMOD - Ergodic 05/26/00 Events + // + case EV_BEARTRAP_DIE: // PKMOD - Ergodic 05/26/00 Events + DEBUGNAME("EV_BEARTRAP_DIE"); + ByteToDir( es->eventParm, dir ); + CG_BearTrapDie( position ); + break; + + case EV_BEARTRAP_SNAP: // PKMOD - Ergodic 07/01/00 Events + DEBUGNAME("EV_BEARTRAP_SNAP"); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkabeartrapsnap ); + break; + + case EV_BEARTRAP_DROP: // PKMOD - Ergodic 08/07/00 Events + DEBUGNAME("EV_BEARTRAP_DROP"); + + //PKMOD - Ergodic 07/17/03 - use timer for driver of model animation + cent->miscTime = cg.time; // scale up from this + + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkabeartrapdrop ); + break; + + case EV_CHAINLIGHTNING_STRIKE: // PKMOD - Ergodic 08/22/00 Events + DEBUGNAME("EV_CHAINLIGHTNING_STRIKE"); + //uses hack for target location stored in es.angles + trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); + + if ( rand() % 2 ) //random number: { 0, 1 } + trap_S_StartSound (es->angles, es->number, CHAN_AUTO, cgs.media.sfx_chainlightningstrike1 ); + else + trap_S_StartSound (es->angles, es->number, CHAN_AUTO, cgs.media.sfx_chainlightningstrike2 ); + break; + + //PKMOD Ergodic 05/30/00 switch to gauntlet for PK Items noammo state + case EV_PKA_NOAMMO: + DEBUGNAME("EV_PKA_NOAMMO"); + if ( es->number == cg.snap->ps.clientNum ) { + CG_PKA_OutOfAmmoChange(); + } + break; + + //PKMOD Ergodic 07/19/00 display lightning flash + case EV_LIGHTNING_FX: + DEBUGNAME("EV_LIGHTNING_FX"); + CG_Lightning_FX( position, es->eventParm ); //flash location and flash constantLight + break; + + //PKMOD - Ergodic 09/06/00 gravity well item suck sounds from Mongusta + case EV_GRAVITYWELL_SUCK: // PKMOD - Ergodic 09/06/00 Events + DEBUGNAME("EV_GRAVITYWELL_SUCK"); + switch ( rand() % 3 ) { //random numbers: { 0, 1, 2 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkagravitywell_suck1 ); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkagravitywell_suck2 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkagravitywell_suck3 ); + break; + } + break; + + //PKMOD - Ergodic 11/16/00 - add target_remove code + case EV_ITEM_REMOVE: + DEBUGNAME("EV_ITEM_REMOVE"); + { + gitem_t *item; + int index; + //12/16/00 - add non compressed flag + trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, trap_S_RegisterSound( "sound/items/lostitem.wav", qfalse ) ); + + index = es->eventParm; // player predicted + + if ( index < 1 || index >= bg_numItems ) { + break; + } + item = &bg_itemlist[ index ]; + + // show icon and name on status bar + if ( es->number == cg.snap->ps.clientNum ) { + CG_ItemRemove( index ); + } + + } + break; + + //PKMOD - Ergodic 11/20/00 - add target_remove code for powerups + case EV_GLOBAL_ITEM_REMOVE: + DEBUGNAME("EV_GLOBAL_ITEM_REMOVE"); + { + gitem_t *item; + int index; + + index = es->eventParm; // player predicted + + if ( index < 1 || index >= bg_numItems ) { + break; + } + item = &bg_itemlist[ index ]; + // powerup pickups are global + //12/16/00 - add non compressed flag + trap_S_StartSound (NULL, cg.snap->ps.clientNum, CHAN_AUTO, trap_S_RegisterSound( "sound/items/lostpowerup.wav", qfalse ) ); + + // show icon and name on status bar + if ( es->number == cg.snap->ps.clientNum ) { + CG_ItemRemove( index ); + } + } + break; + + case EV_AUTOSENTRY_DROP: // PKMOD - Ergodic 11/22/00 drop the sentry sound + DEBUGNAME("EV_AUTOSENTRY_DROP"); + //PKMOD - Ergodic 11/25 - use timer for driver of model animation + cent->miscTime = cg.time; // scale up from this + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentrydrop ); + break; + + case EV_AUTOSENTRY_DIE: // PKMOD - Ergodic 11/22/00 blow-up the sentry sound + DEBUGNAME("EV_AUTOSENTRY_DIE"); + ByteToDir( es->eventParm, dir ); + CG_AutoSentryDie( position ); + break; + + //PKMOD - Ergodic 12/06/00 - special lightning shooter event + case EV_SHOOTER_LIGHTNING: + DEBUGNAME("EV_SHOOTER_LIGHTNING"); +// ByteToDir( es->eventParm, dir ); +// CG_MissileHitWall( es->weapon, 0, position, dir ); + CG_ChainLightning( cent ); + break; + + //PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability + case EV_AUTOSENTRY_HIT_WALL: + DEBUGNAME("EV_BULLET_HIT_WALL"); + ByteToDir( es->eventParm, dir ); + CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qfalse, ENTITYNUM_WORLD, qtrue ); + break; + + //PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability + case EV_AUTOSENTRY_HIT_FLESH: + DEBUGNAME("EV_BULLET_HIT_FLESH"); + CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm, qtrue ); + break; + + //PKMOD - Ergodic 12/26/00 add Beans fart noises from Mongusta + //PKMOD - Ergodic 04/13/01 - move gas effects routine to cg_effects and add bubbles + //PKMOD - Ergodic 06/30/01 add two more fart sounds from original Q1 PK + case EV_BEANS_TOOT: // PKMOD - Ergodic 12/26/00 Events + DEBUGNAME("EV_BEANS_TOOT"); + + //add gas effects + CG_BeansToot( cent->lerpOrigin ); + + //add gas sounds + //PKMOD - Ergodic 06/30/01 add two more fart sounds from original Q1 PK (was rand() % 5) + switch ( rand() % 7 ) { //random numbers: { 0, 1, 2, 3, 4, 5, 6 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart1 ); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart2 ); + break; + case 2: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart3 ); + break; + case 3: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart4 ); + break; + case 4: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart5 ); + break; + case 5: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart6 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart7 ); + break; + } + + break; + + //PKMOD - Ergodic 01/13/01 - add autosentry fire sounds from mongusta + case EV_AUTOSENTRY_FIRE: + DEBUGNAME("EV_AUTOSENTRY_FIRE"); + //add sentry firing noise + switch ( rand() % 3 ) { //random numbers: { 0, 1, 2 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentry1 ); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentry2 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentry3 ); + break; + } + + break; + + //PKMOD - Ergodic 03/26/01 - add autosentry ping sound + case EV_AUTOSENTRY_PING: + DEBUGNAME("EV_AUTOSENTRY_PING"); + //add sentry firing noise + switch ( rand() % 3 ) { //random numbers: { 0, 1, 2 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentry_ping1); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentry_ping2 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkasentry_ping3 ); + break; + } + + break; + + + //PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water + case EV_LIGHTNING_WATER_DISCHARGE: + DEBUGNAME("EV_LIGHTNING_WATER_DISCHARGE"); + CG_Lightning_Water_Discharge (position, es->eventParm); // eventParm is duration/size + break; + + //PKMOD - Ergodic 01/21/01 - add event to display coordinate model for exploding shells debug + case EV_COORD: + DEBUGNAME("EV_COORD"); + CG_Coord( es ); + break; + + //PKMOD - Ergodic 07/03/01 ChainLightning reflect sounds + case EV_CHAINLIGHTNING_REFLECT: // PKMOD - Ergodic 07/03/01 Events + DEBUGNAME("EV_CHAINLIGHTNING_REFLECT"); + //uses hack for target location stored in es.angles + if ( rand() % 2 ) //random number: { 0, 1 } + trap_S_StartSound (es->angles, es->number, CHAN_AUTO, cgs.media.sfx_chainlightningreflect1 ); + else + trap_S_StartSound (es->angles, es->number, CHAN_AUTO, cgs.media.sfx_chainlightningreflect2 ); + break; + + //PKMOD - Ergodic 01/07/02 - send message to client if not all Private Bot parts are held + case EV_INCOMPLETE_PRIVATEBOT: // PKMOD - Ergodic 01/07/02 Events + DEBUGNAME("EV_INCOMPLETE_PRIVATEBOT"); + + //PKMOD - Ergodic 03/17/04 - only send this message to the owner + if ( es->number == cg.snap->ps.clientNum ) { + CG_CenterPrint( "Incomplete Private Bot", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.useNothingSound ); + } + break; + + //PKMOD - Ergodic 03/18/02 - send message to client that no more Private Bots are available + case EV_NOAVAILABLE_PRIVATEBOTS: // PKMOD - Ergodic 03/18/02 Events + DEBUGNAME("EV_NOAVAILABLE_PRIVATEBOTS"); + switch ( rand() % 4 ) { //random numbers: { 0, 1, 2, 3 } + case 0: + CG_CenterPrint( "All Private Bots are active", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + break; + case 1: + CG_CenterPrint( "All Private Bots are deployed", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + break; + case 2: + CG_CenterPrint( "No Private Bots are left to assign", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + break; + default: + CG_CenterPrint( "All Private Bots are allocated", SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + break; + } + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.useNothingSound ); + break; + + //PKMOD - Ergodic 02/07/02 - message client if Private Bot is completed + + case EV_COMPLETED_PRIVATEBOT: + DEBUGNAME("EV_COMPLETED_PRIVATEBOT"); + { + int index; + + index = es->eventParm; // player predicted + + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.pkapribot_complete ); + + // show icon and name on status bar + if ( es->number == cg.snap->ps.clientNum ) { + CG_ItemPickup( index ); + } + } + break; + + //PKMOD - Ergodic 02/10/02 - send FRAG message to Private Bot's owner + case EV_PRIVATEBOT_FRAG: + DEBUGNAME("EV_PRIVATEBOT_FRAG"); + switch ( rand() % 2 ) { //random numbers: { 0, 1 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.pkapribot_frag1 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_BODY, cgs.media.pkapribot_frag2 ); + break; + } + break; + + //PKMOD - Ergodic 06/09/02 - create the teleport flash for the personal sentry (teleport in sound) + case EV_TELE_IN_PERSONALSENTRY: + DEBUGNAME( "EV_TELE_IN_PERSONALSENTRY" ); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.teleInSound ); + CG_PersentrySpawnEffect( position ); + break; + + //PKMOD - Ergodic 08/03/02 - create the teleport flash for the personal sentry (teleport out sound) + case EV_TELE_OUT_PERSONALSENTRY: + DEBUGNAME( "EV_TELE_OUT_PERSONALSENTRY" ); + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.teleOutSound ); + CG_PersentrySpawnEffect( position ); + break; + + //PKMOD - Ergodic 06/14/02 - create the firing sound for the personal sentry + //PKMOD - Ergodic 08/26/02 - add Personal Sentry fire sounds from StarDagger + case EV_FIRE_PERSONALSENTRY: + DEBUGNAME( "EV_FIRE_PERSONALSENTRY" ); + //add sentry firing noise + switch ( rand() % 3 ) { //random numbers: { 0, 1, 2 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.pkapersentry_fire1 ); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.pkapersentry_fire2 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.pkapersentry_fire3 ); + break; + } + + break; + + //PKMOD - Ergodic 11/21/03 - Play an earthquake sound + //PKMOD - Ergodic 12/07/03 - removed, code moved to global sound + //case EV_EARTHQUAKE: + // DEBUGNAME( "EV_EARTHQUAKE" ); + // trap_S_StartSound (NULL, ENTITYNUM_NONE, CHAN_AUTO, cgs.media.pkaearthquake ); + // break; + + //PKMOD - Ergodic 12/06/03 - play the charge up sound + case EV_CHAINLIGHTNING_CHARGE_UP: + DEBUGNAME("EV_CHAINLIGHTNING_CHARGE_UP"); + trap_S_StartSound(position, es->number, CHAN_AUTO, cgs.media.pkachargeup ); + break; + + //PKMOD - Ergodic 01/05/04 - add quad farting logic for differing CG graphic sequence + case EV_QUADBEANS_TOOT: + DEBUGNAME("EV_QUADBEANS_TOOT"); + + //add gas effects + CG_QuadBeansToot( cent->lerpOrigin ); + + //PKMOD - Ergodic 03/17/04 - add new quad farting sounds that occur very rarely + if ( ( rand() % 100 ) > 91 ) { + switch ( rand() % 3 ) { //random numbers: { 0, 1, 2 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkaquadfart1 ); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkaquadfart2 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkaquadfart3 ); + break; + } + } else { + switch ( rand() % 7 ) { //random numbers: { 0, 1, 2, 3, 4, 5, 6 } + case 0: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart1 ); + break; + case 1: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart2 ); + break; + case 2: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart3 ); + break; + case 3: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart4 ); + break; + case 4: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart5 ); + break; + case 5: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart6 ); + break; + default: + trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.sfx_pkafart7 ); + break; + } + } + + //PKMOD - Ergodic 01/14/04 - add gib effect at beans blast area + trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.gibSound ); + CG_GibPlayer( cent->lerpOrigin ); + + break; + + + + default: + DEBUGNAME("UNKNOWN"); + CG_Error( "Unknown event: %i", event ); + break; + } + +} + + +/* +============== +CG_CheckEvents + +============== +*/ +void CG_CheckEvents( centity_t *cent ) { + +//PKMOD - Ergodic 09/30/01 - debug missing EV_LIGHTNING_FX event (inactive) +/* + entityState_t *es; + int event; + + es = ¢->currentState; + event = es->event & ~EV_EVENT_BITS; + if ( event == EV_LIGHTNING_FX ) + Com_Printf( "CG_CheckEvents detected!\n" ); + +*/ + + // check for event-only entities + if ( cent->currentState.eType > ET_EVENTS ) { + if ( cent->previousEvent ) { + return; // already fired + } + // if this is a player event set the entity number of the client entity number + if ( cent->currentState.eFlags & EF_PLAYER_EVENT ) { + cent->currentState.number = cent->currentState.otherEntityNum; + } + + cent->previousEvent = 1; + + cent->currentState.event = cent->currentState.eType - ET_EVENTS; + } else { + // check for events riding with another entity + if ( cent->currentState.event == cent->previousEvent ) { + return; + } + cent->previousEvent = cent->currentState.event; + if ( ( cent->currentState.event & ~EV_EVENT_BITS ) == 0 ) { + return; + } + } + + // calculate the position at exactly the frame time + BG_EvaluateTrajectory( ¢->currentState.pos, cg.snap->serverTime, cent->lerpOrigin ); + CG_SetEntitySoundPosition( cent ); + + CG_EntityEvent( cent, cent->lerpOrigin ); +} + diff --git a/quake3/source/code/cgame/cg_info.c b/quake3/source/code/cgame/cg_info.c new file mode 100644 index 0000000..a3124e9 --- /dev/null +++ b/quake3/source/code/cgame/cg_info.c @@ -0,0 +1,315 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_info.c -- display information while data is being loading + +#include "cg_local.h" + +#define MAX_LOADING_PLAYER_ICONS 16 + //PKMOD - Ergodic 02/04/01 - make 3 rows of registered icons +#define MAX_LOADING_ITEM_ICONS 39 //was 26 + +static int loadingPlayerIconCount; +static int loadingItemIconCount; +static qhandle_t loadingPlayerIcons[MAX_LOADING_PLAYER_ICONS]; +static qhandle_t loadingItemIcons[MAX_LOADING_ITEM_ICONS]; + + +/* +=================== +CG_DrawLoadingIcons +=================== +*/ +static void CG_DrawLoadingIcons( void ) { + int n; + int x, y; + + for( n = 0; n < loadingPlayerIconCount; n++ ) { + x = 16 + n * 78; + y = 324-40; + CG_DrawPic( x, y, 64, 64, loadingPlayerIcons[n] ); + } + +/* PKMOD - Ergodic 02/04/01 - original code + for( n = 0; n < loadingItemIconCount; n++ ) { + y = 400-40; + if( n >= 13 ) { + y += 40; + } + x = 16 + n % 13 * 48; + CG_DrawPic( x, y, 32, 32, loadingItemIcons[n] ); + } +*/ + //PKMOD - Ergodic 02/04/01 - make 3 row s of registered icons + for( n = 0; n < loadingItemIconCount; n++ ) { + y = 400-40; + if ( n >= 26 ) { + y += 80; + } + else { + if( n >= 13 ) { + y += 40; + } + } + x = 16 + n % 13 * 48; + CG_DrawPic( x, y, 32, 32, loadingItemIcons[n] ); + } + +} + + +/* +====================== +CG_LoadingString + +====================== +*/ +void CG_LoadingString( const char *s ) { + Q_strncpyz( cg.infoScreenText, s, sizeof( cg.infoScreenText ) ); + + trap_UpdateScreen(); +} + +/* +=================== +CG_LoadingItem +=================== +*/ +void CG_LoadingItem( int itemNum ) { + gitem_t *item; + + item = &bg_itemlist[itemNum]; + + if ( item->icon && loadingItemIconCount < MAX_LOADING_ITEM_ICONS ) { + loadingItemIcons[loadingItemIconCount++] = trap_R_RegisterShaderNoMip( item->icon ); + } + + CG_LoadingString( item->pickup_name ); +} + +/* +=================== +CG_LoadingClient +=================== +*/ +void CG_LoadingClient( int clientNum ) { + const char *info; + char *skin; + char personality[MAX_QPATH]; + char model[MAX_QPATH]; + char iconName[MAX_QPATH]; + + info = CG_ConfigString( CS_PLAYERS + clientNum ); + + if ( loadingPlayerIconCount < MAX_LOADING_PLAYER_ICONS ) { + Q_strncpyz( model, Info_ValueForKey( info, "model" ), sizeof( model ) ); + skin = Q_strrchr( model, '/' ); + if ( skin ) { + *skin++ = '\0'; + } else { + skin = "default"; + } + + Com_sprintf( iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", model, skin ); + + loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip( iconName ); + if ( !loadingPlayerIcons[loadingPlayerIconCount] ) { + Com_sprintf( iconName, MAX_QPATH, "models/players/characters/%s/icon_%s.tga", model, skin ); + loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip( iconName ); + } + if ( !loadingPlayerIcons[loadingPlayerIconCount] ) { + Com_sprintf( iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", DEFAULT_MODEL, "default" ); + loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip( iconName ); + } + if ( loadingPlayerIcons[loadingPlayerIconCount] ) { + loadingPlayerIconCount++; + } + } + + Q_strncpyz( personality, Info_ValueForKey( info, "n" ), sizeof(personality) ); + Q_CleanStr( personality ); + + if( cgs.gametype == GT_SINGLE_PLAYER ) { + trap_S_RegisterSound( va( "sound/player/announce/%s.wav", personality ), qtrue ); + } + + CG_LoadingString( personality ); +} + + +/* +==================== +CG_DrawInformation + +Draw all the status / pacifier stuff during level loading +==================== +*/ +void CG_DrawInformation( void ) { + const char *s; + const char *info; + const char *sysInfo; + int y; + int value; + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + int hold_hub_flag; + + qhandle_t levelshot; + qhandle_t detail; + char buf[1024]; + + info = CG_ConfigString( CS_SERVERINFO ); + sysInfo = CG_ConfigString( CS_SYSTEMINFO ); + + s = Info_ValueForKey( info, "mapname" ); + levelshot = trap_R_RegisterShaderNoMip( va( "levelshots/%s.tga", s ) ); + if ( !levelshot ) { + levelshot = trap_R_RegisterShaderNoMip( "menu/art/unknownmap" ); + } + trap_R_SetColor( NULL ); + CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot ); + + // blend a detail texture over it + detail = trap_R_RegisterShader( "levelShotDetail" ); + trap_R_DrawStretchPic( 0, 0, cgs.glconfig.vidWidth, cgs.glconfig.vidHeight, 0, 0, 2.5, 2, detail ); + + // draw the icons of things as they are loaded + CG_DrawLoadingIcons(); + + // the first 150 rows are reserved for the client connection + // screen to write into + if ( cg.infoScreenText[0] ) { + UI_DrawProportionalString( 320, 128-32, va("Loading... %s", cg.infoScreenText), + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + } else { + UI_DrawProportionalString( 320, 128-32, "Awaiting snapshot...", + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + } + + // draw info string information + + y = 180-32; + + // don't print server lines if playing a local game + trap_Cvar_VariableStringBuffer( "sv_running", buf, sizeof( buf ) ); + if ( !atoi( buf ) ) { + // server hostname + Q_strncpyz(buf, Info_ValueForKey( info, "sv_hostname" ), 1024); + Q_CleanStr(buf); + UI_DrawProportionalString( 320, y, buf, + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + + // pure server + s = Info_ValueForKey( sysInfo, "sv_pure" ); + if ( s[0] == '1' ) { + UI_DrawProportionalString( 320, y, "Pure Server", + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + + // server-specific message of the day + s = CG_ConfigString( CS_MOTD ); + if ( s[0] ) { + UI_DrawProportionalString( 320, y, s, + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + + // some extra space after hostname and motd + y += 10; + } + + // map-specific message (long map name) + s = CG_ConfigString( CS_MESSAGE ); + if ( s[0] ) { + UI_DrawProportionalString( 320, y, s, + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + + // cheats warning + s = Info_ValueForKey( sysInfo, "sv_cheats" ); + if ( s[0] == '1' ) { + UI_DrawProportionalString( 320, y, "CHEATS ARE ENABLED", + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + + // game type + switch ( cgs.gametype ) { + case GT_FFA: + s = "Free For All"; + break; + case GT_SINGLE_PLAYER: + s = "Single Player"; + break; + case GT_TOURNAMENT: + s = "Tournament"; + break; + case GT_TEAM: + s = "Team Deathmatch"; + break; + case GT_CTF: + s = "Capture The Flag"; + break; +#ifdef MISSIONPACK + case GT_1FCTF: + s = "One Flag CTF"; + break; + case GT_OBELISK: + s = "Overload"; + break; + case GT_HARVESTER: + s = "Harvester"; + break; +#endif + default: + s = "Unknown Gametype"; + break; + } + UI_DrawProportionalString( 320, y, s, + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + + y += PROP_HEIGHT; + + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + hold_hub_flag = atoi( Info_ValueForKey( info, "hub_flag" ) ); + + if ( hold_hub_flag ) { + value = atoi( Info_ValueForKey( info, "hub_timelimit" ) ); + } + else { + value = atoi( Info_ValueForKey( info, "timelimit" ) ); + } + + if ( value ) { + UI_DrawProportionalString( 320, y, va( "timelimit %i", value ), + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + + if (cgs.gametype != GT_CTF) { + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + if ( hold_hub_flag ) { + value = atoi( Info_ValueForKey( info, "hub_fraglimit" ) ); + } + else { + value = atoi( Info_ValueForKey( info, "fraglimit" ) ); + } + + if ( value ) { + UI_DrawProportionalString( 320, y, va( "fraglimit %i", value ), + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + } + + if (cgs.gametype >= GT_CTF) { + value = atoi( Info_ValueForKey( info, "capturelimit" ) ); + if ( value ) { + UI_DrawProportionalString( 320, y, va( "capturelimit %i", value ), + UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); + y += PROP_HEIGHT; + } + } +} + diff --git a/quake3/source/code/cgame/cg_local.h b/quake3/source/code/cgame/cg_local.h new file mode 100644 index 0000000..01b82eb --- /dev/null +++ b/quake3/source/code/cgame/cg_local.h @@ -0,0 +1,2194 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +#include "../game/q_shared.h" +#include "tr_types.h" +#include "../game/bg_public.h" +#include "cg_public.h" + + +// The entire cgame module is unloaded and reloaded on each level change, +// so there is NO persistant data between levels on the client side. +// If you absolutely need something stored, it can either be kept +// by the server in the server stored userinfos, or stashed in a cvar. + +#ifdef MISSIONPACK +#define CG_FONT_THRESHOLD 0.1 +#endif + +#define POWERUP_BLINKS 5 + +#define POWERUP_BLINK_TIME 1000 +#define FADE_TIME 200 +#define PULSE_TIME 200 +#define DAMAGE_DEFLECT_TIME 100 +#define DAMAGE_RETURN_TIME 400 +#define DAMAGE_TIME 500 +#define LAND_DEFLECT_TIME 150 +#define LAND_RETURN_TIME 300 +#define STEP_TIME 200 +#define DUCK_TIME 100 +#define PAIN_TWITCH_TIME 200 +#define WEAPON_SELECT_TIME 1400 +#define ITEM_SCALEUP_TIME 1000 +#define ZOOM_TIME 150 +#define ITEM_BLOB_TIME 200 +#define MUZZLE_FLASH_TIME 20 +#define SINK_TIME 1000 // time for fragments to sink into ground before going away +#define ATTACKER_HEAD_TIME 10000 +#define REWARD_TIME 3000 + +#define PULSE_SCALE 1.5 // amount to scale up the icons when activating + +#define MAX_STEP_CHANGE 32 + +#define MAX_VERTS_ON_POLY 10 +#define MAX_MARK_POLYS 256 + +#define STAT_MINUS 10 // num frame for '-' stats digit + +#define ICON_SIZE 48 +//PKMOD - Ergodic 05/11/01 - make a smaller icon size for display multiple holdables +#define ICON_SIZE_SMALL 32 + +#define CHAR_WIDTH 32 +#define CHAR_HEIGHT 48 +#define TEXT_ICON_SPACE 4 + +#define TEAMCHAT_WIDTH 80 +#define TEAMCHAT_HEIGHT 8 + +// very large characters +#define GIANT_WIDTH 32 +#define GIANT_HEIGHT 48 + +#define NUM_CROSSHAIRS 10 + +#define TEAM_OVERLAY_MAXNAME_WIDTH 12 +#define TEAM_OVERLAY_MAXLOCATION_WIDTH 16 + +#define DEFAULT_MODEL "sarge" +#ifdef MISSIONPACK +#define DEFAULT_TEAM_MODEL "james" +#define DEFAULT_TEAM_HEAD "*james" +#else +#define DEFAULT_TEAM_MODEL "sarge" +#define DEFAULT_TEAM_HEAD "sarge" +#endif + +#define DEFAULT_REDTEAM_NAME "Stroggs" +#define DEFAULT_BLUETEAM_NAME "Pagans" + +typedef enum { + FOOTSTEP_NORMAL, + FOOTSTEP_BOOT, + FOOTSTEP_FLESH, + FOOTSTEP_MECH, + FOOTSTEP_ENERGY, + FOOTSTEP_METAL, + FOOTSTEP_SPLASH, + + FOOTSTEP_TOTAL +} footstep_t; + +typedef enum { + IMPACTSOUND_DEFAULT, + IMPACTSOUND_METAL, + IMPACTSOUND_FLESH +} impactSound_t; + +//================================================= + +// player entities need to track more information +// than any other type of entity. + +// note that not every player entity is a client entity, +// because corpses after respawn are outside the normal +// client numbering range + +// when changing animation, set animationTime to frameTime + lerping time +// The current lerp will finish out, then it will lerp to the new animation +typedef struct { + int oldFrame; + int oldFrameTime; // time when ->oldFrame was exactly on + + int frame; + int frameTime; // time when ->frame will be exactly on + + float backlerp; + + float yawAngle; + qboolean yawing; + float pitchAngle; + qboolean pitching; + + int animationNumber; // may include ANIM_TOGGLEBIT + animation_t *animation; + int animationTime; // time when the first frame of the animation will be exact +} lerpFrame_t; + + +typedef struct { + lerpFrame_t legs, torso, flag; + int painTime; + int painDirection; // flip from 0 to 1 + int lightningFiring; + + // railgun trail spawning + vec3_t railgunImpact; + qboolean railgunFlash; + + // machinegun spinning + float barrelAngle; + int barrelTime; + qboolean barrelSpinning; +} playerEntity_t; + +//================================================= + + + +// centity_t have a direct corespondence with gentity_t in the game, but +// only the entityState_t is directly communicated to the cgame +typedef struct centity_s { + entityState_t currentState; // from cg.frame + entityState_t nextState; // from cg.nextFrame, if available + qboolean interpolate; // true if next is valid to interpolate to + qboolean currentValid; // true if cg.frame holds this entity + + int muzzleFlashTime; // move to playerEntity? + int previousEvent; + int teleportFlag; + + int trailTime; // so missile trails can handle dropped initial packets + int dustTrailTime; + int miscTime; + + int snapShotTime; // last time this entity was found in a snapshot + //PKMOD - Ergodic 10/20/01 - hold the radiate state timer + int PKA_RadiateTime; + //PKMOD - Ergodic 11/30/01 - hold the radiate infected state timer + int PKA_RadiateInfectTime; + //PKMOD - Ergodic 11/17/01 - add new custom shader for radiate effect on simple items + qhandle_t PKA_customShader; // use one image for the entire thing + + playerEntity_t pe; + + int errorTime; // decay the error from this time + vec3_t errorOrigin; + vec3_t errorAngles; + + qboolean extrapolated; // false if origin / angles is an interpolation + vec3_t rawOrigin; + vec3_t rawAngles; + + vec3_t beamEnd; + + // exact interpolated position of entity on this frame + vec3_t lerpOrigin; + vec3_t lerpAngles; +} centity_t; + + +//====================================================================== + +// local entities are created as a result of events or predicted actions, +// and live independantly from all server transmitted entities + +typedef struct markPoly_s { + struct markPoly_s *prevMark, *nextMark; + int time; + qhandle_t markShader; + qboolean alphaFade; // fade alpha instead of rgb + float color[4]; + poly_t poly; + polyVert_t verts[MAX_VERTS_ON_POLY]; +} markPoly_t; + + +typedef enum { + LE_MARK, + LE_EXPLOSION, + LE_SPRITE_EXPLOSION, + LE_FRAGMENT, + LE_MOVE_SCALE_FADE, + LE_FALL_SCALE_FADE, + LE_FADE_RGB, + LE_SCALE_FADE, + LE_SCOREPLUM, + LE_SCALED_SPRITE_EXPLOSION, //PKMOD - Ergodic 01/12/04 - add LE for quad beans + +#ifdef MISSIONPACK + LE_KAMIKAZE, + LE_INVULIMPACT, + LE_INVULJUICED, + LE_SHOWREFENTITY +#endif +} leType_t; + +typedef enum { + LEF_PUFF_DONT_SCALE = 0x0001, // do not scale size over time + LEF_TUMBLE = 0x0002, // tumble over time, used for ejecting shells + LEF_SOUND1 = 0x0004, // sound 1 for kamikaze + LEF_SOUND2 = 0x0008 // sound 2 for kamikaze +} leFlag_t; + +typedef enum { + LEMT_NONE, + LEMT_BURN, + LEMT_BLOOD +} leMarkType_t; // fragment local entities can leave marks on walls + +typedef enum { + LEBS_NONE, + LEBS_BLOOD, + LEBS_BRASS +} leBounceSoundType_t; // fragment local entities can make sounds on impacts + +typedef struct localEntity_s { + struct localEntity_s *prev, *next; + leType_t leType; + int leFlags; + + int startTime; + int endTime; + int fadeInTime; + + float lifeRate; // 1.0 / (endTime - startTime) + + trajectory_t pos; + trajectory_t angles; + + float bounceFactor; // 0.0 = no bounce, 1.0 = perfect + + float color[4]; + + float radius; + + float light; + vec3_t lightColor; + + leMarkType_t leMarkType; // mark to leave on fragment impact + leBounceSoundType_t leBounceSoundType; + + refEntity_t refEntity; +} localEntity_t; + +//====================================================================== + + +typedef struct { + int client; + int score; + int ping; + int time; + int scoreFlags; + int powerUps; + int accuracy; + int impressiveCount; + int excellentCount; + int guantletCount; + int defendCount; + int assistCount; + int captures; + qboolean perfect; + int team; + //PKMOD - Ergodic 02/28/04 - add PainKiller medal awards to ownerdraw + int painkillerCount; +} score_t; + +// each client has an associated clientInfo_t +// that contains media references necessary to present the +// client model and other color coded effects +// this is regenerated each time a client's configstring changes, +// usually as a result of a userinfo (name, model, etc) change +#define MAX_CUSTOM_SOUNDS 32 + +typedef struct { + qboolean infoValid; + + char name[MAX_QPATH]; + team_t team; + + int botSkill; // 0 = not bot, 1-5 = bot + //PKMOD - Ergodic 01/09/02 - add info to structure so Private Bot will not appear in scoreboard + int privateBot; // 0 = Not Private Bot, 1 = Private Bot + + vec3_t color1; + vec3_t color2; + + int score; // updated by score servercmds + int location; // location index for team mode + int health; // you only get this info about your teammates + int armor; + int curWeapon; + + int handicap; + int wins, losses; // in tourney mode + + int teamTask; // task in teamplay (offence/defence) + qboolean teamLeader; // true when this is a team leader + + int powerups; // so can display quad/flag status + + int medkitUsageTime; + int invulnerabilityStartTime; + int invulnerabilityStopTime; + + int breathPuffTime; + + // when clientinfo is changed, the loading of models/skins/sounds + // can be deferred until you are dead, to prevent hitches in + // gameplay + char modelName[MAX_QPATH]; + char skinName[MAX_QPATH]; + char headModelName[MAX_QPATH]; + char headSkinName[MAX_QPATH]; + char redTeam[MAX_TEAMNAME]; + char blueTeam[MAX_TEAMNAME]; + qboolean deferred; + + qboolean newAnims; // true if using the new mission pack animations + qboolean fixedlegs; // true if legs yaw is always the same as torso yaw + qboolean fixedtorso; // true if torso never changes yaw + + vec3_t headOffset; // move head in icon views + footstep_t footsteps; + gender_t gender; // from model + + qhandle_t legsModel; + qhandle_t legsSkin; + + qhandle_t torsoModel; + qhandle_t torsoSkin; + + qhandle_t headModel; + qhandle_t headSkin; + + qhandle_t modelIcon; + + animation_t animations[MAX_TOTALANIMATIONS]; + + sfxHandle_t sounds[MAX_CUSTOM_SOUNDS]; +} clientInfo_t; + + +// each WP_* weapon enum has an associated weaponInfo_t +// that contains media references necessary to present the +// weapon and its effects +typedef struct weaponInfo_s { + qboolean registered; + gitem_t *item; + + qhandle_t handsModel; // the hands don't actually draw, they just position the weapon + qhandle_t weaponModel; + qhandle_t barrelModel; + qhandle_t flashModel; + + vec3_t weaponMidpoint; // so it will rotate centered instead of by tag + + float flashDlight; + vec3_t flashDlightColor; + sfxHandle_t flashSound[4]; // fast firing weapons randomly choose + + qhandle_t weaponIcon; + qhandle_t ammoIcon; + + qhandle_t ammoModel; + + qhandle_t missileModel; + sfxHandle_t missileSound; + void (*missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi ); + float missileDlight; + vec3_t missileDlightColor; + int missileRenderfx; + + void (*ejectBrassFunc)( centity_t * ); + + float trailRadius; + float wiTrailTime; + + sfxHandle_t readySound; + sfxHandle_t firingSound; + qboolean loopFireSound; +} weaponInfo_t; + + +// each IT_* item has an associated itemInfo_t +// that constains media references necessary to present the +// item and its effects +typedef struct { + qboolean registered; + qhandle_t models[MAX_ITEM_MODELS]; + qhandle_t icon; +} itemInfo_t; + + +typedef struct { + int itemNum; +} powerupInfo_t; + + +#define MAX_SKULLTRAIL 10 + +typedef struct { + vec3_t positions[MAX_SKULLTRAIL]; + int numpositions; +} skulltrail_t; + +//PKMOD - Ergodic 10/13/00 - add hubinfo fields +typedef struct { + char info[128]; +} hubInfoDisplay_t; + + +#define MAX_REWARDSTACK 10 +#define MAX_SOUNDBUFFER 20 + +//====================================================================== + +// all cg.stepTime, cg.duckTime, cg.landTime, etc are set to cg.time when the action +// occurs, and they will have visible effects for #define STEP_TIME or whatever msec after + +#define MAX_PREDICTED_EVENTS 16 + +typedef struct { + int clientFrame; // incremented each frame + + int clientNum; + + qboolean demoPlayback; + qboolean levelShot; // taking a level menu screenshot + int deferredPlayerLoading; + qboolean loading; // don't defer players at initial startup + qboolean intermissionStarted; // don't play voice rewards, because game will end shortly + + // there are only one or two snapshot_t that are relevent at a time + int latestSnapshotNum; // the number of snapshots the client system has received + int latestSnapshotTime; // the time from latestSnapshotNum, so we don't need to read the snapshot yet + + snapshot_t *snap; // cg.snap->serverTime <= cg.time + snapshot_t *nextSnap; // cg.nextSnap->serverTime > cg.time, or NULL + snapshot_t activeSnapshots[2]; + + float frameInterpolation; // (float)( cg.time - cg.frame->serverTime ) / (cg.nextFrame->serverTime - cg.frame->serverTime) + + qboolean thisFrameTeleport; + qboolean nextFrameTeleport; + + int frametime; // cg.time - cg.oldTime + + int time; // this is the time value that the client + // is rendering at. + int oldTime; // time at last frame, used for missile trails and prediction checking + + int physicsTime; // either cg.snap->time or cg.nextSnap->time + + int timelimitWarnings; // 5 min, 1 min, overtime + int fraglimitWarnings; + + qboolean mapRestart; // set on a map restart to set back the weapon + + qboolean renderingThirdPerson; // during deaths, chasecams, etc + + // prediction state + qboolean hyperspace; // true if prediction has hit a trigger_teleport + playerState_t predictedPlayerState; + centity_t predictedPlayerEntity; + qboolean validPPS; // clear until the first call to CG_PredictPlayerState + int predictedErrorTime; + vec3_t predictedError; + + int eventSequence; + int predictableEvents[MAX_PREDICTED_EVENTS]; + + float stepChange; // for stair up smoothing + int stepTime; + + float duckChange; // for duck viewheight smoothing + int duckTime; + + float landChange; // for landing hard + int landTime; + + // input state sent to server + int weaponSelect; + + // auto rotating items + vec3_t autoAngles; + vec3_t autoAxis[3]; + vec3_t autoAnglesFast; + vec3_t autoAxisFast[3]; + //PKMOD - Ergodic 01/27/02 - add slower rotating items + vec3_t autoAnglesSlow; + vec3_t autoAxisSlow[3]; + + // view rendering + refdef_t refdef; + vec3_t refdefViewAngles; // will be converted to refdef.viewaxis + + // zoom key + qboolean zoomed; + int zoomTime; + float zoomSensitivity; + + // information screen text during loading + char infoScreenText[MAX_STRING_CHARS]; + + // scoreboard + int scoresRequestTime; + int numScores; + int selectedScore; + int teamScores[2]; + score_t scores[MAX_CLIENTS]; + qboolean showScores; + qboolean scoreBoardShowing; + int scoreFadeTime; + char killerName[MAX_NAME_LENGTH]; + char spectatorList[MAX_STRING_CHARS]; // list of names + int spectatorLen; // length of list + float spectatorWidth; // width in device units + int spectatorTime; // next time to offset + int spectatorPaintX; // current paint x + int spectatorPaintX2; // current paint x + int spectatorOffset; // current offset from start + int spectatorPaintLen; // current offset from start + + // skull trails + skulltrail_t skulltrails[MAX_CLIENTS]; + + // centerprinting + int centerPrintTime; + int centerPrintCharWidth; + int centerPrintY; + char centerPrint[1024]; + int centerPrintLines; + + // low ammo warning state + int lowAmmoWarning; // 1 = low, 2 = empty + + // kill timers for carnage reward + int lastKillTime; + + // crosshair client ID + int crosshairClientNum; + int crosshairClientTime; + + // powerup active flashing + int powerupActive; + int powerupTime; + + // attacking player + int attackerTime; + int voiceTime; + + // reward medals + int rewardStack; + int rewardTime; + int rewardCount[MAX_REWARDSTACK]; + qhandle_t rewardShader[MAX_REWARDSTACK]; + qhandle_t rewardSound[MAX_REWARDSTACK]; + + // sound buffer mainly for announcer sounds + int soundBufferIn; + int soundBufferOut; + int soundTime; + qhandle_t soundBuffer[MAX_SOUNDBUFFER]; + + // for voice chat buffer + int voiceChatTime; + int voiceChatBufferIn; + int voiceChatBufferOut; + + // warmup countdown + int warmup; + int warmupCount; + + //========================== + + int itemPickup; + int itemPickupTime; + int itemPickupBlendTime; // the pulse around the crosshair is timed seperately + + int weaponSelectTime; + int weaponAnimation; + int weaponAnimationTime; + + // blend blobs + float damageTime; + float damageX, damageY, damageValue; + + // status bar head + float headYaw; + float headEndPitch; + float headEndYaw; + int headEndTime; + float headStartPitch; + float headStartYaw; + int headStartTime; + + // view movement + float v_dmg_time; + float v_dmg_pitch; + float v_dmg_roll; + + vec3_t kick_angles; // weapon kicks + vec3_t kick_origin; + + // temp working variables for player view + float bobfracsin; + int bobcycle; + float xyspeed; + int nextOrbitTime; + + //qboolean cameraMode; // if rendering from a loaded camera + + + // development tool + refEntity_t testModelEntity; + char testModelName[MAX_QPATH]; + qboolean testGun; + +} cg_t; + + +// all of the model, shader, and sound references that are +// loaded at gamestate time are stored in cgMedia_t +// Other media that can be tied to clients, weapons, or items are +// stored in the clientInfo_t, itemInfo_t, weaponInfo_t, and powerupInfo_t +typedef struct { + qhandle_t charsetShader; + qhandle_t charsetProp; + qhandle_t charsetPropGlow; + qhandle_t charsetPropB; + qhandle_t whiteShader; + + qhandle_t redCubeModel; + qhandle_t blueCubeModel; + qhandle_t redCubeIcon; + qhandle_t blueCubeIcon; + qhandle_t redFlagModel; + qhandle_t blueFlagModel; + qhandle_t neutralFlagModel; + qhandle_t redFlagShader[3]; + qhandle_t blueFlagShader[3]; + qhandle_t flagShader[4]; + + qhandle_t flagPoleModel; + qhandle_t flagFlapModel; + + qhandle_t redFlagFlapSkin; + qhandle_t blueFlagFlapSkin; + qhandle_t neutralFlagFlapSkin; + + qhandle_t redFlagBaseModel; + qhandle_t blueFlagBaseModel; + qhandle_t neutralFlagBaseModel; + +#ifdef MISSIONPACK + qhandle_t overloadBaseModel; + qhandle_t overloadTargetModel; + qhandle_t overloadLightsModel; + qhandle_t overloadEnergyModel; + + qhandle_t harvesterModel; + qhandle_t harvesterRedSkin; + qhandle_t harvesterBlueSkin; + qhandle_t harvesterNeutralModel; +#endif + + qhandle_t armorModel; + qhandle_t armorIcon; + + qhandle_t teamStatusBar; + + qhandle_t deferShader; + + // gib explosions + qhandle_t gibAbdomen; + qhandle_t gibArm; + qhandle_t gibChest; + qhandle_t gibFist; + qhandle_t gibFoot; + qhandle_t gibForearm; + qhandle_t gibIntestine; + qhandle_t gibLeg; + qhandle_t gibSkull; + qhandle_t gibBrain; + + qhandle_t smoke2; + + qhandle_t machinegunBrassModel; + qhandle_t shotgunBrassModel; + + qhandle_t railRingsShader; + qhandle_t railCoreShader; + + qhandle_t lightningShader; + + qhandle_t friendShader; + + qhandle_t balloonShader; + qhandle_t connectionShader; + + qhandle_t selectShader; + qhandle_t viewBloodShader; + qhandle_t tracerShader; + qhandle_t crosshairShader[NUM_CROSSHAIRS]; + qhandle_t lagometerShader; + qhandle_t backTileShader; + qhandle_t noammoShader; + + qhandle_t smokePuffShader; + qhandle_t smokePuffRageProShader; + qhandle_t shotgunSmokePuffShader; + qhandle_t plasmaBallShader; + qhandle_t waterBubbleShader; + qhandle_t bloodTrailShader; +#ifdef MISSIONPACK + qhandle_t nailPuffShader; + qhandle_t blueProxMine; +#endif + + qhandle_t numberShaders[11]; + + qhandle_t shadowMarkShader; + + qhandle_t botSkillShaders[5]; + + // wall mark shaders + qhandle_t wakeMarkShader; + qhandle_t bloodMarkShader; + qhandle_t bulletMarkShader; + qhandle_t burnMarkShader; + qhandle_t holeMarkShader; + qhandle_t energyMarkShader; + + // powerup shaders + qhandle_t quadShader; + qhandle_t redQuadShader; + qhandle_t quadWeaponShader; + qhandle_t invisShader; + qhandle_t regenShader; + qhandle_t battleSuitShader; + qhandle_t battleWeaponShader; + qhandle_t hastePuffShader; + qhandle_t redKamikazeShader; + qhandle_t blueKamikazeShader; + + // weapon effect models + qhandle_t bulletFlashModel; + qhandle_t ringFlashModel; + qhandle_t dishFlashModel; + qhandle_t lightningExplosionModel; + + // weapon effect shaders + qhandle_t railExplosionShader; + qhandle_t plasmaExplosionShader; + qhandle_t bulletExplosionShader; + qhandle_t rocketExplosionShader; + qhandle_t grenadeExplosionShader; + qhandle_t bfgExplosionShader; + qhandle_t bloodExplosionShader; + + // special effects models + qhandle_t teleportEffectModel; + qhandle_t teleportEffectShader; +#ifdef MISSIONPACK + qhandle_t kamikazeEffectModel; + qhandle_t kamikazeShockWave; + qhandle_t kamikazeHeadModel; + qhandle_t kamikazeHeadTrail; + qhandle_t guardPowerupModel; + qhandle_t scoutPowerupModel; + qhandle_t doublerPowerupModel; + qhandle_t ammoRegenPowerupModel; + qhandle_t invulnerabilityImpactModel; + qhandle_t invulnerabilityJuicedModel; + qhandle_t medkitUsageModel; + qhandle_t dustPuffShader; + qhandle_t heartShader; +#endif + qhandle_t invulnerabilityPowerupModel; + + // scoreboard headers + qhandle_t scoreboardName; + qhandle_t scoreboardPing; + qhandle_t scoreboardScore; + qhandle_t scoreboardTime; + + // medals shown during gameplay + qhandle_t medalImpressive; + qhandle_t medalExcellent; + qhandle_t medalGauntlet; + qhandle_t medalDefend; + qhandle_t medalAssist; + qhandle_t medalCapture; + + // sounds + sfxHandle_t quadSound; + sfxHandle_t tracerSound; + sfxHandle_t selectSound; + sfxHandle_t useNothingSound; + sfxHandle_t wearOffSound; + sfxHandle_t footsteps[FOOTSTEP_TOTAL][4]; + sfxHandle_t sfx_lghit1; + sfxHandle_t sfx_lghit2; + sfxHandle_t sfx_lghit3; + sfxHandle_t sfx_ric1; + sfxHandle_t sfx_ric2; + sfxHandle_t sfx_ric3; + sfxHandle_t sfx_railg; + sfxHandle_t sfx_rockexp; + sfxHandle_t sfx_plasmaexp; +#ifdef MISSIONPACK + sfxHandle_t sfx_proxexp; + sfxHandle_t sfx_nghit; + sfxHandle_t sfx_nghitflesh; + sfxHandle_t sfx_nghitmetal; + sfxHandle_t sfx_chghit; + sfxHandle_t sfx_chghitflesh; + sfxHandle_t sfx_chghitmetal; + sfxHandle_t kamikazeExplodeSound; + sfxHandle_t kamikazeImplodeSound; + sfxHandle_t kamikazeFarSound; + sfxHandle_t useInvulnerabilitySound; + sfxHandle_t invulnerabilityImpactSound1; + sfxHandle_t invulnerabilityImpactSound2; + sfxHandle_t invulnerabilityImpactSound3; + sfxHandle_t invulnerabilityJuicedSound; + sfxHandle_t obeliskHitSound1; + sfxHandle_t obeliskHitSound2; + sfxHandle_t obeliskHitSound3; + sfxHandle_t obeliskRespawnSound; + sfxHandle_t winnerSound; + sfxHandle_t loserSound; + sfxHandle_t youSuckSound; +#endif + sfxHandle_t gibSound; + sfxHandle_t gibBounce1Sound; + sfxHandle_t gibBounce2Sound; + sfxHandle_t gibBounce3Sound; + sfxHandle_t teleInSound; + sfxHandle_t teleOutSound; + sfxHandle_t noAmmoSound; + sfxHandle_t respawnSound; + sfxHandle_t talkSound; + sfxHandle_t landSound; + sfxHandle_t fallSound; + sfxHandle_t jumpPadSound; + + sfxHandle_t oneMinuteSound; + sfxHandle_t fiveMinuteSound; + sfxHandle_t suddenDeathSound; + + sfxHandle_t threeFragSound; + sfxHandle_t twoFragSound; + sfxHandle_t oneFragSound; + + sfxHandle_t hitSound; + sfxHandle_t hitSoundHighArmor; + sfxHandle_t hitSoundLowArmor; + sfxHandle_t hitTeamSound; + sfxHandle_t impressiveSound; + sfxHandle_t excellentSound; + sfxHandle_t deniedSound; + sfxHandle_t humiliationSound; + sfxHandle_t assistSound; + sfxHandle_t defendSound; + sfxHandle_t firstImpressiveSound; + sfxHandle_t firstExcellentSound; + sfxHandle_t firstHumiliationSound; + + sfxHandle_t takenLeadSound; + sfxHandle_t tiedLeadSound; + sfxHandle_t lostLeadSound; + + sfxHandle_t voteNow; + sfxHandle_t votePassed; + sfxHandle_t voteFailed; + + sfxHandle_t watrInSound; + sfxHandle_t watrOutSound; + sfxHandle_t watrUnSound; + + sfxHandle_t flightSound; + sfxHandle_t medkitSound; + + sfxHandle_t weaponHoverSound; + + // teamplay sounds + sfxHandle_t captureAwardSound; + sfxHandle_t redScoredSound; + sfxHandle_t blueScoredSound; + sfxHandle_t redLeadsSound; + sfxHandle_t blueLeadsSound; + sfxHandle_t teamsTiedSound; + + sfxHandle_t captureYourTeamSound; + sfxHandle_t captureOpponentSound; + sfxHandle_t returnYourTeamSound; + sfxHandle_t returnOpponentSound; + sfxHandle_t takenYourTeamSound; + sfxHandle_t takenOpponentSound; + + sfxHandle_t redFlagReturnedSound; + sfxHandle_t blueFlagReturnedSound; + sfxHandle_t neutralFlagReturnedSound; + sfxHandle_t enemyTookYourFlagSound; + sfxHandle_t enemyTookTheFlagSound; + sfxHandle_t yourTeamTookEnemyFlagSound; + sfxHandle_t yourTeamTookTheFlagSound; + sfxHandle_t youHaveFlagSound; + sfxHandle_t yourBaseIsUnderAttackSound; + sfxHandle_t holyShitSound; + + // tournament sounds + sfxHandle_t count3Sound; + sfxHandle_t count2Sound; + sfxHandle_t count1Sound; + sfxHandle_t countFightSound; + sfxHandle_t countPrepareSound; + +#ifdef MISSIONPACK + // new stuff + qhandle_t patrolShader; + qhandle_t assaultShader; + qhandle_t campShader; + qhandle_t followShader; + qhandle_t defendShader; + qhandle_t teamLeaderShader; + qhandle_t retrieveShader; + qhandle_t escortShader; + qhandle_t flagShaders[3]; + sfxHandle_t countPrepareTeamSound; + + sfxHandle_t ammoregenSound; + sfxHandle_t doublerSound; + sfxHandle_t guardSound; + sfxHandle_t scoutSound; +#endif + + //PKMOD - Ergodic 01/28/04 - Dynamic HUD activation: move flagShaders & heartShader to active code + qhandle_t flagShaders[3]; + qhandle_t heartShader; + + //PKMOD - Ergodic 01/30/04 - Dynamic HUD activation: move the following Shaders to active code + qhandle_t patrolShader; + qhandle_t assaultShader; + qhandle_t campShader; + qhandle_t followShader; + qhandle_t defendShader; + qhandle_t retrieveShader; + qhandle_t escortShader; + + qhandle_t cursor; + qhandle_t selectCursor; + qhandle_t sizeCursor; + + sfxHandle_t regenSound; + sfxHandle_t protectSound; + sfxHandle_t n_healthSound; + sfxHandle_t hgrenb1aSound; + sfxHandle_t hgrenb2aSound; + //PKMOD - Ergodic 12/19/00 - remove Team Arena proxmine sounds +// sfxHandle_t wstbimplSound; +// sfxHandle_t wstbimpmSound; +// sfxHandle_t wstbimpdSound; +// sfxHandle_t wstbactvSound; + + //PKMOD - Ergodic 05/21/00 add models and sounds and shaders + sfxHandle_t sfx_pkagravitylaunched; + qhandle_t pkabeartrapgib1; + qhandle_t pkabeartrapgib2; + qhandle_t pkabeartrapgib3; + qhandle_t pkabeartrapgib4; + qhandle_t pkabeartrap; //Ergodic 05/31/00 + qhandle_t pkabeartrapfollow; //Ergodic 06/11/00 + sfxHandle_t sfx_pkabeartrapdrop; + sfxHandle_t sfx_pkabeartrapbreakup; + sfxHandle_t sfx_pkabeartrapsnap; + + //PKMOD - Ergodic 03/23/01 - add team parameters + qhandle_t pkabeartrap_red; + qhandle_t pkabeartrap_blue; + + + //PKMOD - Ergodic 01/16/01 - add model for exploding shells weaponhit + qhandle_t explshellsFlashModel; + + qhandle_t shellsExplosionShader1; //Ergodic 06/18/00 (updated 01/16/01) + qhandle_t shellsExplosionShader2; //Ergodic 01/16/01 + qhandle_t shellsExplosionShader3; //Ergodic 01/16/01 + qhandle_t shellsExplosionShader4; //Ergodic 01/16/01 + qhandle_t shellsExplosionShader5; //Ergodic 01/16/01 + qhandle_t shellsExplosionShader6; //Ergodic 01/16/01 + + qhandle_t pkagravitywelluniverse; //Ergodic 03/18/01 + + //PKMOD - Ergodic 08/01/00 - nailgun models/shaders + qhandle_t nailImpactShader; + qhandle_t nailFlashModel; + qhandle_t nailMarkShader; + qhandle_t nail1; //Ergodic 08/03/00 static nail entity + + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills + qhandle_t medalPainKiller; + sfxHandle_t painkillerSound; + + //PKMOD - Ergodic 08/21/00 ChainLightning special shaders + qhandle_t chainlightningShader; + + //PKMOD - Ergodic 08/22/00 ChainLightning Gun player hit shader effect + qhandle_t clgplayerhitShader; + + //PKMOD - Ergodic 08/22/00 ChainLightning strike sounds + sfxHandle_t sfx_chainlightningstrike1; + sfxHandle_t sfx_chainlightningstrike2; + + //PKMOD - Ergodic 08/25/00 nailgun ricochet sounds + sfxHandle_t sfx_nailrico1; + sfxHandle_t sfx_nailrico2; + sfxHandle_t sfx_nailrico3; + sfxHandle_t sfx_nailrico4; + + //PKMOD - Ergodic 09/06/00 gravity well item suck sounds from Mongusta + sfxHandle_t sfx_pkagravitywell_suck1; + sfxHandle_t sfx_pkagravitywell_suck2; + sfxHandle_t sfx_pkagravitywell_suck3; + + //PKMOD - Ergodic 09/29/00 shaders for hub voting images + qhandle_t voting_levelshot_0; + qhandle_t voting_levelshot_1; + qhandle_t voting_levelshot_2; + qhandle_t voting_levelshot_3; + qhandle_t voting_levelshot_4; + qhandle_t voting_levelshot_5; + qhandle_t voting_levelshot_6; + qhandle_t voting_levelshot_7; + qhandle_t voting_levelshot_8; + qhandle_t voting_levelshot_9; + qhandle_t voting_levelshot_10; + qhandle_t voting_levelshot_11; + qhandle_t voting_levelshot_12; + qhandle_t voting_levelshot_13; + qhandle_t voting_levelshot_14; + qhandle_t voting_levelshot_15; + qhandle_t voting_levelshot_16; + qhandle_t voting_levelshot_17; + qhandle_t voting_levelshot_18; + qhandle_t voting_levelshot_19; + qhandle_t voting_levelshot_20; + qhandle_t voting_levelshot_21; + qhandle_t voting_levelshot_22; + qhandle_t voting_levelshot_23; + qhandle_t voting_levelshot_24; + + //PKMOD - Ergodic 10/03/00 dragon beam shader effect + qhandle_t dragonboltShader; + + //PKMOD - Ergodic 11/12/00 airfist flash model shader + qhandle_t airfistFlashShader; + + //PKMOD - Ergodic 11/16/00 update airfist flash model to correspond to airfist_level + qhandle_t airfist4FlashModel; + qhandle_t airfist3FlashModel; + qhandle_t airfist2FlashModel; + qhandle_t airfist1FlashModel; + qhandle_t airfist0FlashModel; + + //PKMOD - Ergodic 11/22/00 add autosentry handles + sfxHandle_t sfx_pkasentrydrop; + //PKMOD - Ergodic 11/27/00 autosentry pickup model will be pkasentry_deploy0 +// qhandle_t pkasentry_pickup; + //PKMOD - Ergodic 11/25/00 add autosentry deploy models + //PKMOD - Ergodic 05/31/02 - use autosentry animation model + /* + qhandle_t pkasentry_deploy0; + qhandle_t pkasentry_deploy1; + qhandle_t pkasentry_deploy2; + qhandle_t pkasentry_deploy3; + qhandle_t pkasentry_deploy4; + qhandle_t pkasentry_deploy5; + qhandle_t pkasentry_deploy6; + qhandle_t pkasentry_deploy7; + qhandle_t pkasentry_deploy8; + qhandle_t pkasentry_deploy9; + qhandle_t pkasentry_deploy10; + */ + //PKMOD - Ergodic 03/20/01 - add team parameters + //PKMOD - Ergodic 05/31/02 - use autosentry animation model + qhandle_t pkasentry_red; + qhandle_t pkasentry_blue; + //PKMOD - Ergodic 06/01/02 - add default autosentry model for dragon deploy + qhandle_t pkasentry; + /* + qhandle_t pkasentry_deploy0_red; + qhandle_t pkasentry_deploy1_red; + qhandle_t pkasentry_deploy2_red; + qhandle_t pkasentry_deploy3_red; + qhandle_t pkasentry_deploy4_red; + qhandle_t pkasentry_deploy5_red; + qhandle_t pkasentry_deploy6_red; + qhandle_t pkasentry_deploy7_red; + qhandle_t pkasentry_deploy8_red; + qhandle_t pkasentry_deploy9_red; + qhandle_t pkasentry_deploy10_red; + qhandle_t pkasentry_deploy0_blue; + qhandle_t pkasentry_deploy1_blue; + qhandle_t pkasentry_deploy2_blue; + qhandle_t pkasentry_deploy3_blue; + qhandle_t pkasentry_deploy4_blue; + qhandle_t pkasentry_deploy5_blue; + qhandle_t pkasentry_deploy6_blue; + qhandle_t pkasentry_deploy7_blue; + qhandle_t pkasentry_deploy8_blue; + qhandle_t pkasentry_deploy9_blue; + qhandle_t pkasentry_deploy10_blue; + */ + + //PKMOD - Ergodic 12/02/00 add split autosentry models + qhandle_t pkasentry_base; + //PKMOD - Ergodic 03/20/01 - add team parameters + qhandle_t pkasentry_base_red; + qhandle_t pkasentry_base_blue; + + //PKMOD - Ergodic 03/20/01 - add team parameters + qhandle_t pkasentry_turret; + qhandle_t pkasentry_turret_red; + qhandle_t pkasentry_turret_blue; + + //PKMOD - Ergodic 12/14/00 - add autosentry gib models + qhandle_t pkasentry_gib1; + qhandle_t pkasentry_gib2; + qhandle_t pkasentry_gib3; + qhandle_t pkasentry_gib4; + qhandle_t pkasentry_gib5; + qhandle_t pkasentry_gib6; + qhandle_t pkasentry_gib7; + qhandle_t pkasentry_gib8; + qhandle_t pkasentry_gib9; + qhandle_t pkasentry_gib10; + qhandle_t pkasentry_gib11; + qhandle_t pkasentry_gib12; + qhandle_t pkasentry_gib13; + qhandle_t pkasentry_gib14; + qhandle_t pkasentry_gib15; + qhandle_t pkasentry_gib16; + qhandle_t pkasentry_gib17; + + //PKMOD - Ergodic 12/26/00 add beans fart sounds + sfxHandle_t sfx_pkafart1; + sfxHandle_t sfx_pkafart2; + sfxHandle_t sfx_pkafart3; + sfxHandle_t sfx_pkafart4; + sfxHandle_t sfx_pkafart5; + //PKMOD - Ergodic 06/30/01 add two more fart sounds from original Q1 PK + sfxHandle_t sfx_pkafart6; + sfxHandle_t sfx_pkafart7; + + //PKMOD - Ergodic 06/30/01 add airfist sounds for all types of situations + sfxHandle_t sfx_pkaairfistfire; + sfxHandle_t sfx_pkaairfistwaterfire; + sfxHandle_t sfx_pkaairfistempty; + sfxHandle_t sfx_pkaairfistwaterempty; + + //PKMOD - Ergodic 12/27/00 add beans shader + qhandle_t pkafartPuffShader; + + //PKMOD - Ergodic 12/28/00 add flash model for autosentry + qhandle_t autosentryFlashModel; + + //PKMOD - Ergodic 01/13/01 - add autosentry fire sounds from mongusta + qhandle_t sfx_pkasentry1; + qhandle_t sfx_pkasentry2; + qhandle_t sfx_pkasentry3; + + //PKMOD - Ergodic 01/21/01 - add coordinate model for exploding shells debug + qhandle_t coordFlashModel; + + //PKMOD - Ergodic 03/26/01 - autosentry sonar ping sounds + sfxHandle_t sfx_pkasentry_ping1; + sfxHandle_t sfx_pkasentry_ping2; + sfxHandle_t sfx_pkasentry_ping3; + + //PKMOD - Ergodic 04/06/01 - add autosentry missile sprite + qhandle_t autosentryBallShader; + + //PKMOD - Ergodic 06/20/01 - add legs model for swinging zombie + qhandle_t pkazombie_legsModel; + qhandle_t pkazombie_legsSkin; + + //PKMOD - Ergodic 06/21/01 - add torso model for swinging zombie + qhandle_t pkazombie_torsoModel; + qhandle_t pkazombie_torsoSkin; + + //PKMOD - Ergodic 06/21/01 - add head model for swinging zombie + qhandle_t pkazombie_headModel; + qhandle_t pkazombie_headSkin; + + //PKMOD - Ergodic 07/03/01 ChainLightning reflect sounds + sfxHandle_t sfx_chainlightningreflect1; + sfxHandle_t sfx_chainlightningreflect2; + + //PKMOD - Ergodic 10/14/01 - add shaders for radiation holdable spark effect + qhandle_t radiate1Shader; + qhandle_t radiate2Shader; + qhandle_t radiate3Shader; + qhandle_t radiate4Shader; + qhandle_t radiate5Shader; + qhandle_t radiate6Shader; + + //PKMOD - Ergodic 11/17/01 - add icons for simple items that are radiated + qhandle_t radiate1SimpleIcon; + qhandle_t radiate2SimpleIcon; + qhandle_t radiate3SimpleIcon; + + //PKMOD - Ergodic 11/27/01 - add radition trail for infected players + qhandle_t radiationTrailShader; + + //PKMOD - Ergodic 12/03/01 - New Holdables - Private Bot pickup skins + qhandle_t privatebot_legsSkin; + qhandle_t privatebot_torsoSkin; + qhandle_t privatebot_headSkin; + + //PKMOD - Ergodic 12/05/01 - Holdable: radiate sounds + qhandle_t pkaradiatewarningSound; + qhandle_t pkaradiateitemSound; + qhandle_t pkaradiateplayerSound; + //PKMOD - Ergodic 08/02/02 - Holdable: radiate activation sound + sfxHandle_t pkaradiateactivationSound; + + //PKMOD - Ergodic 12/07/01 - Holdable: Private Bot HUD Icons + qhandle_t pkapribot_001Icon; + qhandle_t pkapribot_010Icon; + qhandle_t pkapribot_011Icon; + qhandle_t pkapribot_100Icon; + qhandle_t pkapribot_101Icon; + qhandle_t pkapribot_110Icon; + qhandle_t pkapribot_111Icon; + + //PKMOD - Ergodic 12/16/01 - add new model for repositioned deployed gauntlet blade +// qhandle_t pkagauntlet_bladeModel; + + //PKMOD - Ergodic 02/05/02 - add attack sounds for beartrap and autosentry + sfxHandle_t beartrap_attackSound; + sfxHandle_t autosentry_attackSound; + sfxHandle_t radiate_attackSound; + + //PKMOD - Ergodic 02/07/02 - add Private Bot completed sound + sfxHandle_t pkapribot_complete; + + //PKMOD - Ergodic 02/10/02 - send FRAG message to Private Bot's owner + sfxHandle_t pkapribot_frag1; + sfxHandle_t pkapribot_frag2; + + //PKMOD - Ergodic 02/14/02 - explosive shells hit sounds + sfxHandle_t sfx_expgunhit1; + sfxHandle_t sfx_expgunhit2; + sfxHandle_t sfx_expgunhit3; + //PKMOD - Ergodic 07/10/02 - add 2 more explosive shells hit sounds + sfxHandle_t sfx_expgunhit4; + sfxHandle_t sfx_expgunhit5; + + //PKMOD - Ergodic 05/07/02 - add active personal sentry model + qhandle_t persentry_active; + + //PKMOD - Ergodic 06/08/02 - add personal sentry teleport model + qhandle_t persentry_teleportEffectModel; + + //PKMOD - Ergodic 06/12/02 - add personal sentry missile shader + qhandle_t personalsentryBallShader; + + //PKMOD - Ergodic 08/02/02 - Holdable: Personal Sentry hover sound + qhandle_t pkapersentryhoverSound; + //PKMOD - Ergodic 08/26/02 - add Personal Sentry fire sounds from StarDagger + qhandle_t pkapersentry_fire1; + qhandle_t pkapersentry_fire2; + qhandle_t pkapersentry_fire3; + + //PKMOD - Ergodic 09/11/02 - add private bot field effect + qhandle_t privatebot_CueModel; + + //PKMOD - Ergodic 10/14/02 - Add the gravity well expanding wave + qhandle_t pkagravitywellwave; + + //PKMOD - Ergodic 10/18/02 - Add the gravity well spark + qhandle_t pkagravitywellspark; + + //PKMOD - Ergodic 07/18/03 - add invisible Beartrap Shaders + qhandle_t pkainvisbeartrap1; + qhandle_t pkainvisbeartrap2; + qhandle_t pkainvisbeartrap3; + qhandle_t pkainvisbeartrap4; + qhandle_t pkainvisbeartrap5; + qhandle_t pkainvisbeartrap6; + qhandle_t pkainvisbeartrap7; + qhandle_t pkainvisbeartrap8; + qhandle_t pkainvisbeartrap9; + qhandle_t pkainvisbeartrap10; + qhandle_t pkainvisbeartrap11; + qhandle_t pkainvisbeartrap12; + qhandle_t pkainvisbeartrap13; + qhandle_t pkainvisbeartrap14; + qhandle_t pkainvisbeartrap15; + qhandle_t pkainvisbeartrap16; + qhandle_t pkainvisbeartrap17; + qhandle_t pkainvisbeartrap18; + qhandle_t pkainvisbeartrap19; + qhandle_t pkainvisbeartrap20; + + //PKMOD - Ergodic 08/20/03 - add special shader for shooter lightning + qhandle_t shooterlightningShader; + + //PKMOD - Ergodic 09/18/03 - Beartrap Invisibility Spark sprite shaders + qhandle_t pkabeartrapspark1Shader; + qhandle_t pkabeartrapspark2Shader; + qhandle_t pkabeartrapspark3Shader; + qhandle_t pkabeartrapspark4Shader; + qhandle_t pkabeartrapspark5Shader; + + //PKMOD - Ergodic 11/21/03 - Earthquake sound for Gravity Well effect on out of reach players + //PKMOD - Ergodic 12/07/03 - removed, code moved to global sound + //qhandle_t pkaearthquake; + + //PKMOD - Ergodic 12/08/03 - Add chargeup sound for BearTrap, Autosentry invisibility + qhandle_t pkachargeup; + + //PKMOD - Ergodic 12/13/03 - add invisible Autosentry Shaders + qhandle_t pkainvisautosentry1; + qhandle_t pkainvisautosentry2; + qhandle_t pkainvisautosentry3; + qhandle_t pkainvisautosentry4; + qhandle_t pkainvisautosentry5; + qhandle_t pkainvisautosentry6; + qhandle_t pkainvisautosentry7; + qhandle_t pkainvisautosentry8; + qhandle_t pkainvisautosentry9; + qhandle_t pkainvisautosentry10; + qhandle_t pkainvisautosentry11; + qhandle_t pkainvisautosentry12; + qhandle_t pkainvisautosentry13; + qhandle_t pkainvisautosentry14; + qhandle_t pkainvisautosentry15; + qhandle_t pkainvisautosentry16; + qhandle_t pkainvisautosentry17; + qhandle_t pkainvisautosentry18; + qhandle_t pkainvisautosentry19; + qhandle_t pkainvisautosentry20; + + //PKMOD - Ergodic 01/07/04 - add quad farting logic for differing CG graphic sequence + qhandle_t pkaquadbeansShader; + qhandle_t pkaquadbeansModel; + + //PKMOD - Ergodic 03/17/04 - add quad beans fart sounds + sfxHandle_t sfx_pkaquadfart1; + sfxHandle_t sfx_pkaquadfart2; + sfxHandle_t sfx_pkaquadfart3; + +} cgMedia_t; + + +// The client game static (cgs) structure hold everything +// loaded or calculated from the gamestate. It will NOT +// be cleared when a tournement restart is done, allowing +// all clients to begin playing instantly +typedef struct { + gameState_t gameState; // gamestate from server + glconfig_t glconfig; // rendering configuration + float screenXScale; // derived from glconfig + float screenYScale; + float screenXBias; + + int serverCommandSequence; // reliable command stream counter + int processedSnapshotNum;// the number of snapshots cgame has requested + + qboolean localServer; // detected on startup by checking sv_running + + // parsed from serverinfo + gametype_t gametype; + int dmflags; + int teamflags; + int fraglimit; + int capturelimit; + int timelimit; + int maxclients; + char mapname[MAX_QPATH]; + char redTeam[MAX_QPATH]; + char blueTeam[MAX_QPATH]; + + int voteTime; + int voteYes; + int voteNo; + qboolean voteModified; // beep whenever changed + char voteString[MAX_STRING_TOKENS]; + + int teamVoteTime[2]; + int teamVoteYes[2]; + int teamVoteNo[2]; + qboolean teamVoteModified[2]; // beep whenever changed + char teamVoteString[2][MAX_STRING_TOKENS]; + + int levelStartTime; + + int scores1, scores2; // from configstrings + int redflag, blueflag; // flag status from configstrings + int flagStatus; + + qboolean newHud; + + // + // locally derived information from gamestate + // + qhandle_t gameModels[MAX_MODELS]; + sfxHandle_t gameSounds[MAX_SOUNDS]; + + int numInlineModels; + qhandle_t inlineDrawModel[MAX_MODELS]; + vec3_t inlineModelMidpoints[MAX_MODELS]; + + clientInfo_t clientinfo[MAX_CLIENTS]; + + // teamchat width is *3 because of embedded color codes + char teamChatMsgs[TEAMCHAT_HEIGHT][TEAMCHAT_WIDTH*3+1]; + int teamChatMsgTimes[TEAMCHAT_HEIGHT]; + int teamChatPos; + int teamLastChatPos; + + int cursorX; + int cursorY; + qboolean eventHandling; + qboolean mouseCaptured; + qboolean sizingHud; + void *capturedItem; + qhandle_t activeCursor; + + // orders + int currentOrder; + qboolean orderPending; + int orderTime; + int currentVoiceClient; + int acceptOrderTime; + int acceptTask; + int acceptLeader; + char acceptVoice[MAX_NAME_LENGTH]; + + // media + cgMedia_t media; + + //PKMOD - Ergodic 10/13/00 - add hubinfo fields + hubInfoDisplay_t hubInfoDisplay[3]; + +} cgs_t; + + +//PKMOD - Ergodic 05/11/01 - register holdables into their own array +// for optimization purposes +extern int cg_holdable[ HI_NUM_HOLDABLE ]; + +//============================================================================== + +extern cgs_t cgs; +extern cg_t cg; +extern centity_t cg_entities[MAX_GENTITIES]; +extern weaponInfo_t cg_weapons[MAX_WEAPONS]; +extern itemInfo_t cg_items[MAX_ITEMS]; +extern markPoly_t cg_markPolys[MAX_MARK_POLYS]; + +extern vmCvar_t cg_centertime; +extern vmCvar_t cg_runpitch; +extern vmCvar_t cg_runroll; +extern vmCvar_t cg_bobup; +extern vmCvar_t cg_bobpitch; +extern vmCvar_t cg_bobroll; +extern vmCvar_t cg_swingSpeed; +extern vmCvar_t cg_shadows; +extern vmCvar_t cg_gibs; +extern vmCvar_t cg_drawTimer; +extern vmCvar_t cg_drawFPS; +extern vmCvar_t cg_drawSnapshot; +extern vmCvar_t cg_draw3dIcons; +extern vmCvar_t cg_drawIcons; +extern vmCvar_t cg_drawAmmoWarning; +extern vmCvar_t cg_drawCrosshair; +extern vmCvar_t cg_drawCrosshairNames; +extern vmCvar_t cg_drawRewards; +extern vmCvar_t cg_drawTeamOverlay; +extern vmCvar_t cg_teamOverlayUserinfo; +extern vmCvar_t cg_crosshairX; +extern vmCvar_t cg_crosshairY; +extern vmCvar_t cg_crosshairSize; +extern vmCvar_t cg_crosshairHealth; +extern vmCvar_t cg_drawStatus; +extern vmCvar_t cg_draw2D; +extern vmCvar_t cg_animSpeed; +extern vmCvar_t cg_debugAnim; +extern vmCvar_t cg_debugPosition; +extern vmCvar_t cg_debugEvents; +extern vmCvar_t cg_railTrailTime; +extern vmCvar_t cg_errorDecay; +extern vmCvar_t cg_nopredict; +extern vmCvar_t cg_noPlayerAnims; +extern vmCvar_t cg_showmiss; +extern vmCvar_t cg_footsteps; +extern vmCvar_t cg_addMarks; +extern vmCvar_t cg_brassTime; +extern vmCvar_t cg_gun_frame; +extern vmCvar_t cg_gun_x; +extern vmCvar_t cg_gun_y; +extern vmCvar_t cg_gun_z; +extern vmCvar_t cg_drawGun; +extern vmCvar_t cg_viewsize; +extern vmCvar_t cg_tracerChance; +extern vmCvar_t cg_tracerWidth; +extern vmCvar_t cg_tracerLength; +extern vmCvar_t cg_autoswitch; +extern vmCvar_t cg_ignore; +extern vmCvar_t cg_simpleItems; +extern vmCvar_t cg_fov; +extern vmCvar_t cg_zoomFov; +extern vmCvar_t cg_thirdPersonRange; +extern vmCvar_t cg_thirdPersonAngle; +extern vmCvar_t cg_thirdPerson; +extern vmCvar_t cg_stereoSeparation; +extern vmCvar_t cg_lagometer; +extern vmCvar_t cg_drawAttacker; +extern vmCvar_t cg_synchronousClients; +extern vmCvar_t cg_teamChatTime; +extern vmCvar_t cg_teamChatHeight; +extern vmCvar_t cg_stats; +extern vmCvar_t cg_forceModel; +extern vmCvar_t cg_buildScript; +extern vmCvar_t cg_paused; +extern vmCvar_t cg_blood; +extern vmCvar_t cg_predictItems; +extern vmCvar_t cg_deferPlayers; +extern vmCvar_t cg_drawFriend; +extern vmCvar_t cg_teamChatsOnly; +extern vmCvar_t cg_noVoiceChats; +extern vmCvar_t cg_noVoiceText; +extern vmCvar_t cg_scorePlum; +extern vmCvar_t cg_smoothClients; +extern vmCvar_t pmove_fixed; +extern vmCvar_t pmove_msec; +//extern vmCvar_t cg_pmove_fixed; +extern vmCvar_t cg_cameraOrbit; +extern vmCvar_t cg_cameraOrbitDelay; +extern vmCvar_t cg_timescaleFadeEnd; +extern vmCvar_t cg_timescaleFadeSpeed; +extern vmCvar_t cg_timescale; +extern vmCvar_t cg_cameraMode; +extern vmCvar_t cg_smallFont; +extern vmCvar_t cg_bigFont; +extern vmCvar_t cg_noTaunt; +extern vmCvar_t cg_noProjectileTrail; +extern vmCvar_t cg_oldRail; +extern vmCvar_t cg_oldRocket; +extern vmCvar_t cg_oldPlasma; +extern vmCvar_t cg_trueLightning; +//PKMOD - Ergodic 08/16/03 - add cvar for PKA full weapon cycling +extern vmCvar_t cg_pkafullweaponcycling; + +#ifdef MISSIONPACK +extern vmCvar_t cg_redTeamName; +extern vmCvar_t cg_blueTeamName; +extern vmCvar_t cg_currentSelectedPlayer; +extern vmCvar_t cg_currentSelectedPlayerName; +extern vmCvar_t cg_singlePlayer; +extern vmCvar_t cg_enableDust; +extern vmCvar_t cg_enableBreath; +extern vmCvar_t cg_singlePlayerActive; +extern vmCvar_t cg_recordSPDemo; +extern vmCvar_t cg_recordSPDemoName; +extern vmCvar_t cg_obeliskRespawnDelay; +#endif + +//PKMOD - Ergodic 02/02/04 - Enable this code so that POSTGAME will show proper completion time +extern vmCvar_t cg_singlePlayerActive; +extern vmCvar_t cg_recordSPDemo; +extern vmCvar_t cg_recordSPDemoName; + +//PKMOD - Ergodic 01/17/04 - Enable HUD in PKA3.0 +extern vmCvar_t cg_redTeamName; +extern vmCvar_t cg_blueTeamName; +extern vmCvar_t cg_currentSelectedPlayer; +extern vmCvar_t cg_currentSelectedPlayerName; + + +// +// cg_main.c +// +const char *CG_ConfigString( int index ); +const char *CG_Argv( int arg ); + +void QDECL CG_Printf( const char *msg, ... ); +void QDECL CG_Error( const char *msg, ... ); + +void CG_StartMusic( void ); + +//PKMOD - Ergodic 10/14/00 - add post vote music +void CG_StartPostVoteMusic( const char *postvotemusic ); + +void CG_UpdateCvars( void ); + +int CG_CrosshairPlayer( void ); +int CG_LastAttacker( void ); +void CG_LoadMenus(const char *menuFile); +void CG_KeyEvent(int key, qboolean down); +void CG_MouseEvent(int x, int y); +void CG_EventHandling(int type); +void CG_RankRunFrame( void ); +void CG_SetScoreSelection(void *menu); +score_t *CG_GetSelectedScore(); +void CG_BuildSpectatorString(); + + +// +// cg_view.c +// +void CG_TestModel_f (void); +void CG_TestGun_f (void); +void CG_TestModelNextFrame_f (void); +void CG_TestModelPrevFrame_f (void); +void CG_TestModelNextSkin_f (void); +void CG_TestModelPrevSkin_f (void); +void CG_ZoomDown_f( void ); +void CG_ZoomUp_f( void ); +void CG_AddBufferedSound( sfxHandle_t sfx); + +void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ); + + +// +// cg_drawtools.c +// +void CG_AdjustFrom640( float *x, float *y, float *w, float *h ); +void CG_FillRect( float x, float y, float width, float height, const float *color ); +void CG_DrawPic( float x, float y, float width, float height, qhandle_t hShader ); +void CG_DrawString( float x, float y, const char *string, + float charWidth, float charHeight, const float *modulate ); + + +void CG_DrawStringExt( int x, int y, const char *string, const float *setColor, + qboolean forceColor, qboolean shadow, int charWidth, int charHeight, int maxChars ); +void CG_DrawBigString( int x, int y, const char *s, float alpha ); +void CG_DrawBigStringColor( int x, int y, const char *s, vec4_t color ); +void CG_DrawSmallString( int x, int y, const char *s, float alpha ); +void CG_DrawSmallStringColor( int x, int y, const char *s, vec4_t color ); + +int CG_DrawStrlen( const char *str ); + +float *CG_FadeColor( int startMsec, int totalMsec ); +float *CG_TeamColor( int team ); +void CG_TileClear( void ); +void CG_ColorForHealth( vec4_t hcolor ); +void CG_GetColorForHealth( int health, int armor, vec4_t hcolor ); + +void UI_DrawProportionalString( int x, int y, const char* str, int style, vec4_t color ); +void CG_DrawRect( float x, float y, float width, float height, float size, const float *color ); +void CG_DrawSides(float x, float y, float w, float h, float size); +void CG_DrawTopBottom(float x, float y, float w, float h, float size); + + +// +// cg_draw.c, cg_newDraw.c +// +extern int sortedTeamPlayers[TEAM_MAXOVERLAY]; +extern int numSortedTeamPlayers; +extern int drawTeamOverlayModificationCount; +extern char systemChat[256]; +extern char teamChat1[256]; +extern char teamChat2[256]; + +//PKMOD - Ergodic 10/13/00 - add hubinfo fields +extern int numHubInfoLines; + +void CG_AddLagometerFrameInfo( void ); +void CG_AddLagometerSnapshotInfo( snapshot_t *snap ); +void CG_CenterPrint( const char *str, int y, int charWidth ); +void CG_DrawHead( float x, float y, float w, float h, int clientNum, vec3_t headAngles ); +void CG_DrawActive( stereoFrame_t stereoView ); +void CG_DrawFlagModel( float x, float y, float w, float h, int team, qboolean force2D ); +void CG_DrawTeamBackground( int x, int y, int w, int h, float alpha, int team ); +void CG_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle); +void CG_Text_Paint(float x, float y, float scale, vec4_t color, const char *text, float adjust, int limit, int style); +int CG_Text_Width(const char *text, float scale, int limit); +int CG_Text_Height(const char *text, float scale, int limit); +void CG_SelectPrevPlayer(); +void CG_SelectNextPlayer(); +float CG_GetValue(int ownerDraw); +qboolean CG_OwnerDrawVisible(int flags); +void CG_RunMenuScript(char **args); +void CG_ShowResponseHead(); +void CG_SetPrintString(int type, const char *p); +void CG_InitTeamChat(); +void CG_GetTeamColor(vec4_t *color); +const char *CG_GetGameStatusText(); +const char *CG_GetKillerText(); +void CG_Draw3DModel( float x, float y, float w, float h, qhandle_t model, qhandle_t skin, vec3_t origin, vec3_t angles ); +void CG_Text_PaintChar(float x, float y, float width, float height, float scale, float s, float t, float s2, float t2, qhandle_t hShader); +void CG_CheckOrderPending(); +const char *CG_GameTypeString(); +qboolean CG_YourTeamHasFlag(); +qboolean CG_OtherTeamHasFlag(); +qhandle_t CG_StatusHandle(int task); + + + +// +// cg_player.c +// +void CG_Player( centity_t *cent ); +void CG_ResetPlayerEntity( centity_t *cent ); +void CG_AddRefEntityWithPowerups( refEntity_t *ent, entityState_t *state, int team ); +void CG_NewClientInfo( int clientNum ); +sfxHandle_t CG_CustomSound( int clientNum, const char *soundName ); + +// +// cg_predict.c +// +void CG_BuildSolidList( void ); +int CG_PointContents( const vec3_t point, int passEntityNum ); +void CG_Trace( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, + int skipNumber, int mask ); +void CG_PredictPlayerState( void ); +void CG_LoadDeferredPlayers( void ); + + +// +// cg_events.c +// +void CG_CheckEvents( centity_t *cent ); +const char *CG_PlaceString( int rank ); +void CG_EntityEvent( centity_t *cent, vec3_t position ); +void CG_PainEvent( centity_t *cent, int health ); + + +// +// cg_ents.c +// +void CG_SetEntitySoundPosition( centity_t *cent ); +void CG_AddPacketEntities( void ); +void CG_Beam( centity_t *cent ); +void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out ); + +void CG_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + qhandle_t parentModel, char *tagName ); +void CG_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + qhandle_t parentModel, char *tagName ); +//PKMOD - Ergodic 12/06/00 - added for special lightning shooter event +void CG_ChainLightning( centity_t *cent ); +//PKMOD - Ergodic 01/21/01 - add event to display coordinate model for exploding shells debug +void CG_Coord( entityState_t *es ); +//PKMOD - Ergodic - debug code +char *CG_vtos( const vec3_t v ); + +// +// cg_weapons.c +// +void CG_NextWeapon_f( void ); +void CG_PrevWeapon_f( void ); +void CG_Weapon_f( void ); + +void CG_RegisterWeapon( int weaponNum ); +void CG_RegisterItemVisuals( int itemNum ); + +void CG_FireWeapon( centity_t *cent ); +void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType ); +void CG_MissileHitPlayer( int weapon, vec3_t origin, vec3_t dir, int entityNum ); +void CG_ShotgunFire( entityState_t *es ); +//void CG_Bullet( vec3_t origin, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum ); +//PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability +void CG_Bullet( vec3_t end, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum, qboolean autosentry ); + +void CG_RailTrail( clientInfo_t *ci, vec3_t start, vec3_t end ); +void CG_GrappleTrail( centity_t *ent, const weaponInfo_t *wi ); +void CG_AddViewWeapon (playerState_t *ps); +void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent, int team ); +void CG_DrawWeaponSelect( void ); + +void CG_OutOfAmmoChange( void ); // should this be in pmove? + +//PKMOD - Ergodic 07/02/00 PKA weapon commands +void CG_Weapon_GravityWell( void ); +void CG_Weapon_Sentry( void ); +void CG_Weapon_BearTrap( void ); +void CG_Weapon_Beans( void ); + +//PKMOD - Ergodic 07/12/00 PKA weapon commands +void CG_Weapon_Gauntlet( void ); +void CG_Weapon_MachineGun( void ); +void CG_Weapon_ShotGun( void ); +void CG_Weapon_AirFist( void ); +void CG_Weapon_NailGun( void ); +void CG_Weapon_GrenadeLauncher( void ); +void CG_Weapon_RocketLauncher( void ); +void CG_Weapon_LightningGun( void ); +void CG_Weapon_RailGun( void ); +void CG_Weapon_Harpoon( void ); + +//PKMOD - Ergodic 03/01/01 dragon deploy pka weapon +void CG_Weapon_DragonDeploy( void ); + +//PKMOD - Ergodic 04/04/01 - add last weapon command +void CG_LastWeapon_f( void ); + +// +// cg_marks.c +// +void CG_InitMarkPolys( void ); +void CG_AddMarks( void ); +void CG_ImpactMark( qhandle_t markShader, + const vec3_t origin, const vec3_t dir, + float orientation, + float r, float g, float b, float a, + qboolean alphaFade, + float radius, qboolean temporary ); + +// +// cg_localents.c +// +void CG_InitLocalEntities( void ); +localEntity_t *CG_AllocLocalEntity( void ); +void CG_AddLocalEntities( void ); + +// +// cg_effects.c +// +localEntity_t *CG_SmokePuff( const vec3_t p, + const vec3_t vel, + float radius, + float r, float g, float b, float a, + float duration, + int startTime, + int fadeInTime, + int leFlags, + qhandle_t hShader ); +void CG_BubbleTrail( vec3_t start, vec3_t end, float spacing ); +void CG_SpawnEffect( vec3_t org ); +#ifdef MISSIONPACK +void CG_KamikazeEffect( vec3_t org ); +void CG_ObeliskExplode( vec3_t org, int entityNum ); +void CG_ObeliskPain( vec3_t org ); +void CG_InvulnerabilityImpact( vec3_t org, vec3_t angles ); +void CG_InvulnerabilityJuiced( vec3_t org ); +void CG_LightningBoltBeam( vec3_t start, vec3_t end ); +#endif +void CG_ScorePlum( int client, vec3_t org, int score ); + +void CG_GibPlayer( vec3_t playerOrigin ); +void CG_BigExplode( vec3_t playerOrigin ); + +void CG_Bleed( vec3_t origin, int entityNum ); + +localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir, + qhandle_t hModel, qhandle_t shader, int msec, + qboolean isSprite ); + +//PKMOD - Ergodic 05/23/00 - 05/26/00 event/effect routines +void CG_BearTrapDie( vec3_t BearTrapOrigin ); +//PKMOD - Ergodic 06/30/00 - modify beartrap code to be called by cg_player +void CG_BearTraps_Follow( centity_t *cent ); +//PKMOD - Ergodic 07/01/00 - chain lightning gun stubs +void CG_ChainShaft( entityState_t *es ); +//PKMOD - Ergodic 07/19/00 - display lightning flash +void CG_Lightning_FX( vec3_t position, int constantlight ); +//PKMOD - Ergodic 11/22/00 - autosentry death routine +void CG_AutoSentryDie( vec3_t AutoSentryOrigin ); + +//PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water +void CG_Lightning_Water_Discharge (vec3_t origin, int msec); + +//PKMOD - Ergodic 02/20/01 - Add expanding gravity well +//void CG_GravityWellActivate( vec3_t org ); +//PKMOD - Ergodic 11/02/02 - Pass in the whole centity +//PKMOD - Ergodic 11/02/02 - remove call +//CG_GravityWellActivate( centity_t *cent ); + +//PKMOD - Ergodic 04/13/01 - Renders fecal plumes or bubbles from eating beans +void CG_BeansToot( vec3_t origin ); + +//PKMOD - Ergodic 10/14/01 - add radiation sparking effect +void CG_Radiation( vec3_t start ); + +//PKMOD - Ergodic 11/30/01 - add radiation trail to infected player +//void CG_RadiationTrail0( const vec3_t p ); + +//PKMOD - Ergodic 12/01/01 - add new radiation trail function to infected player +void CG_RadiationTrail( const vec3_t p, + vec3_t vel, + float radius, + float r, float g, float b, float a, + float duration, + int startTime, + int fadeInTime, + int leFlags, + qhandle_t hShader ); + +//PKMOD - Ergodic 06/08/02 - add personal sentry teleport model +void CG_PersentrySpawnEffect( vec3_t org ); + +//PKMOD - Ergodic 01/05/04 - add quad farting logic for differing CG graphic sequence +void CG_QuadBeansToot( vec3_t origin ); + + +// +// cg_snapshot.c +// +void CG_ProcessSnapshots( void ); + +// +// cg_info.c +// +void CG_LoadingString( const char *s ); +void CG_LoadingItem( int itemNum ); +void CG_LoadingClient( int clientNum ); +void CG_DrawInformation( void ); + +// +// cg_scoreboard.c +// +qboolean CG_DrawOldScoreboard( void ); +void CG_DrawOldTourneyScoreboard( void ); + +// +// cg_consolecmds.c +// +qboolean CG_ConsoleCommand( void ); +void CG_InitConsoleCommands( void ); + +// +// cg_servercmds.c +// +void CG_ExecuteNewServerCommands( int latestSequence ); +void CG_ParseServerinfo( void ); +void CG_SetConfigValues( void ); +void CG_LoadVoiceChats( void ); +void CG_ShaderStateChanged(void); +void CG_VoiceChatLocal( int mode, qboolean voiceOnly, int clientNum, int color, const char *cmd ); +void CG_PlayBufferedVoiceChats( void ); + +// +// cg_playerstate.c +// +void CG_Respawn( void ); +void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ); +void CG_CheckChangedPredictableEvents( playerState_t *ps ); + +// +//PKMOD - Ergodic 05/22/00 Add CG functions +// +void CG_PKA_OutOfAmmoChange( void ); + + + +//=============================================== + +// +// system traps +// These functions are how the cgame communicates with the main game system +// + +// print message on the local console +void trap_Print( const char *fmt ); + +// abort the game +void trap_Error( const char *fmt ); + +// milliseconds should only be used for performance tuning, never +// for anything game related. Get time from the CG_DrawActiveFrame parameter +int trap_Milliseconds( void ); + +// console variable interaction +void trap_Cvar_Register( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ); +void trap_Cvar_Update( vmCvar_t *vmCvar ); +void trap_Cvar_Set( const char *var_name, const char *value ); +void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ); + +// ServerCommand and ConsoleCommand parameter access +int trap_Argc( void ); +void trap_Argv( int n, char *buffer, int bufferLength ); +void trap_Args( char *buffer, int bufferLength ); + +// filesystem access +// returns length of file +int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ); +void trap_FS_Read( void *buffer, int len, fileHandle_t f ); +void trap_FS_Write( const void *buffer, int len, fileHandle_t f ); +void trap_FS_FCloseFile( fileHandle_t f ); +int trap_FS_Seek( fileHandle_t f, long offset, int origin ); // fsOrigin_t + +// add commands to the local console as if they were typed in +// for map changing, etc. The command is not executed immediately, +// but will be executed in order the next time console commands +// are processed +void trap_SendConsoleCommand( const char *text ); + +// register a command name so the console can perform command completion. +// FIXME: replace this with a normal console command "defineCommand"? +void trap_AddCommand( const char *cmdName ); + +// send a string to the server over the network +void trap_SendClientCommand( const char *s ); + +// force a screen update, only used during gamestate load +void trap_UpdateScreen( void ); + +// model collision +void trap_CM_LoadMap( const char *mapname ); +int trap_CM_NumInlineModels( void ); +clipHandle_t trap_CM_InlineModel( int index ); // 0 = world, 1+ = bmodels +clipHandle_t trap_CM_TempBoxModel( const vec3_t mins, const vec3_t maxs ); +int trap_CM_PointContents( const vec3_t p, clipHandle_t model ); +int trap_CM_TransformedPointContents( const vec3_t p, clipHandle_t model, const vec3_t origin, const vec3_t angles ); +void trap_CM_BoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask ); +void trap_CM_TransformedBoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask, + const vec3_t origin, const vec3_t angles ); + +// Returns the projection of a polygon onto the solid brushes in the world +int trap_CM_MarkFragments( int numPoints, const vec3_t *points, + const vec3_t projection, + int maxPoints, vec3_t pointBuffer, + int maxFragments, markFragment_t *fragmentBuffer ); + +// normal sounds will have their volume dynamically changed as their entity +// moves and the listener moves +void trap_S_StartSound( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ); +void trap_S_StopLoopingSound(int entnum); + +// a local sound is always played full volume +void trap_S_StartLocalSound( sfxHandle_t sfx, int channelNum ); +void trap_S_ClearLoopingSounds( qboolean killall ); +void trap_S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ); +void trap_S_AddRealLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ); +void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ); + +// respatialize recalculates the volumes of sound as they should be heard by the +// given entityNum and position +void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int inwater ); +sfxHandle_t trap_S_RegisterSound( const char *sample, qboolean compressed ); // returns buzz if not found +void trap_S_StartBackgroundTrack( const char *intro, const char *loop ); // empty name stops music +void trap_S_StopBackgroundTrack( void ); + + +void trap_R_LoadWorldMap( const char *mapname ); + +// all media should be registered during level startup to prevent +// hitches during gameplay +qhandle_t trap_R_RegisterModel( const char *name ); // returns rgb axis if not found +qhandle_t trap_R_RegisterSkin( const char *name ); // returns all white if not found +qhandle_t trap_R_RegisterShader( const char *name ); // returns all white if not found +qhandle_t trap_R_RegisterShaderNoMip( const char *name ); // returns all white if not found + +// a scene is built up by calls to R_ClearScene and the various R_Add functions. +// Nothing is drawn until R_RenderScene is called. +void trap_R_ClearScene( void ); +void trap_R_AddRefEntityToScene( const refEntity_t *re ); + +// polys are intended for simple wall marks, not really for doing +// significant construction +void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts ); +void trap_R_AddPolysToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int numPolys ); +void trap_R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b ); +int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ); +void trap_R_RenderScene( const refdef_t *fd ); +void trap_R_SetColor( const float *rgba ); // NULL = 1,1,1,1 +void trap_R_DrawStretchPic( float x, float y, float w, float h, + float s1, float t1, float s2, float t2, qhandle_t hShader ); +void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ); +int trap_R_LerpTag( orientation_t *tag, clipHandle_t mod, int startFrame, int endFrame, + float frac, const char *tagName ); +void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ); + +// The glconfig_t will not change during the life of a cgame. +// If it needs to change, the entire cgame will be restarted, because +// all the qhandle_t are then invalid. +void trap_GetGlconfig( glconfig_t *glconfig ); + +// the gamestate should be grabbed at startup, and whenever a +// configstring changes +void trap_GetGameState( gameState_t *gamestate ); + +// cgame will poll each frame to see if a newer snapshot has arrived +// that it is interested in. The time is returned seperately so that +// snapshot latency can be calculated. +void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ); + +// a snapshot get can fail if the snapshot (or the entties it holds) is so +// old that it has fallen out of the client system queue +qboolean trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ); + +// retrieve a text command from the server stream +// the current snapshot will hold the number of the most recent command +// qfalse can be returned if the client system handled the command +// argc() / argv() can be used to examine the parameters of the command +qboolean trap_GetServerCommand( int serverCommandNumber ); + +// returns the most recent command number that can be passed to GetUserCmd +// this will always be at least one higher than the number in the current +// snapshot, and it may be quite a few higher if it is a fast computer on +// a lagged connection +int trap_GetCurrentCmdNumber( void ); + +qboolean trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ); + +// used for the weapon select and zoom +void trap_SetUserCmdValue( int stateValue, float sensitivityScale ); + +// aids for VM testing +void testPrintInt( char *string, int i ); +void testPrintFloat( char *string, float f ); + +int trap_MemoryRemaining( void ); +void trap_R_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font); +qboolean trap_Key_IsDown( int keynum ); +int trap_Key_GetCatcher( void ); +void trap_Key_SetCatcher( int catcher ); +int trap_Key_GetKey( const char *binding ); + + +typedef enum { + SYSTEM_PRINT, + CHAT_PRINT, + TEAMCHAT_PRINT +} q3print_t; // bk001201 - warning: useless keyword or type name in empty declaration + +//PKMOD - Ergodic 10/10/2000 - voting images' shader assignments +extern char cg_voting_shader_flag[]; + +int trap_CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits); +e_status trap_CIN_StopCinematic(int handle); +e_status trap_CIN_RunCinematic (int handle); +void trap_CIN_DrawCinematic (int handle); +void trap_CIN_SetExtents (int handle, int x, int y, int w, int h); + +void trap_SnapVector( float *v ); + +qboolean trap_loadCamera(const char *name); +void trap_startCamera(int time); +qboolean trap_getCameraInfo(int time, vec3_t *origin, vec3_t *angles); + +qboolean trap_GetEntityToken( char *buffer, int bufferSize ); + +void CG_ClearParticles (void); +void CG_AddParticles (void); +void CG_ParticleSnow (qhandle_t pshader, vec3_t origin, vec3_t origin2, int turb, float range, int snum); +void CG_ParticleSmoke (qhandle_t pshader, centity_t *cent); +void CG_AddParticleShrapnel (localEntity_t *le); +void CG_ParticleSnowFlurry (qhandle_t pshader, centity_t *cent); +void CG_ParticleBulletDebris (vec3_t org, vec3_t vel, int duration); +void CG_ParticleSparks (vec3_t org, vec3_t vel, int duration, float x, float y, float speed); +void CG_ParticleDust (centity_t *cent, vec3_t origin, vec3_t dir); +void CG_ParticleMisc (qhandle_t pshader, vec3_t origin, int size, int duration, float alpha); +void CG_ParticleExplosion (char *animStr, vec3_t origin, vec3_t vel, int duration, int sizeStart, int sizeEnd); +extern qboolean initparticles; +int CG_NewParticleArea ( int num ); +//PKMOD - Ergodic 10/18/02 - draw super-sized particles... +void CG_ParticleSparks2 (vec3_t org, vec3_t vel, int duration, float x, float y, float speed); +//PKMOD - Ergodic 07/20/03 - particles for beartrap +void CG_ParticleSparks3 (vec3_t org, vec3_t vel, int duration, float x, float y, float speed); + + diff --git a/quake3/source/code/cgame/cg_localents.c b/quake3/source/code/cgame/cg_localents.c new file mode 100644 index 0000000..1d60f3b --- /dev/null +++ b/quake3/source/code/cgame/cg_localents.c @@ -0,0 +1,932 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +// cg_localents.c -- every frame, generate renderer commands for locally +// processed entities, like smoke puffs, gibs, shells, etc. + +#include "cg_local.h" + +#define MAX_LOCAL_ENTITIES 512 +localEntity_t cg_localEntities[MAX_LOCAL_ENTITIES]; +localEntity_t cg_activeLocalEntities; // double linked list +localEntity_t *cg_freeLocalEntities; // single linked list + +/* +=================== +CG_InitLocalEntities + +This is called at startup and for tournement restarts +=================== +*/ +void CG_InitLocalEntities( void ) { + int i; + + memset( cg_localEntities, 0, sizeof( cg_localEntities ) ); + cg_activeLocalEntities.next = &cg_activeLocalEntities; + cg_activeLocalEntities.prev = &cg_activeLocalEntities; + cg_freeLocalEntities = cg_localEntities; + for ( i = 0 ; i < MAX_LOCAL_ENTITIES - 1 ; i++ ) { + cg_localEntities[i].next = &cg_localEntities[i+1]; + } +} + + +/* +================== +CG_FreeLocalEntity +================== +*/ +void CG_FreeLocalEntity( localEntity_t *le ) { + if ( !le->prev ) { + CG_Error( "CG_FreeLocalEntity: not active" ); + } + + // remove from the doubly linked active list + le->prev->next = le->next; + le->next->prev = le->prev; + + // the free list is only singly linked + le->next = cg_freeLocalEntities; + cg_freeLocalEntities = le; +} + +/* +=================== +CG_AllocLocalEntity + +Will allways succeed, even if it requires freeing an old active entity +=================== +*/ +localEntity_t *CG_AllocLocalEntity( void ) { + localEntity_t *le; + + if ( !cg_freeLocalEntities ) { + // no free entities, so free the one at the end of the chain + // remove the oldest active entity + CG_FreeLocalEntity( cg_activeLocalEntities.prev ); + } + + le = cg_freeLocalEntities; + cg_freeLocalEntities = cg_freeLocalEntities->next; + + memset( le, 0, sizeof( *le ) ); + + // link into the active list + le->next = cg_activeLocalEntities.next; + le->prev = &cg_activeLocalEntities; + cg_activeLocalEntities.next->prev = le; + cg_activeLocalEntities.next = le; + return le; +} + + +/* +==================================================================================== + +FRAGMENT PROCESSING + +A fragment localentity interacts with the environment in some way (hitting walls), +or generates more localentities along a trail. + +==================================================================================== +*/ + +/* +================ +CG_BloodTrail + +Leave expanding blood puffs behind gibs +================ +*/ +void CG_BloodTrail( localEntity_t *le ) { + int t; + int t2; + int step; + vec3_t newOrigin; + localEntity_t *blood; + + step = 150; + t = step * ( (cg.time - cg.frametime + step ) / step ); + t2 = step * ( cg.time / step ); + + for ( ; t <= t2; t += step ) { + BG_EvaluateTrajectory( &le->pos, t, newOrigin ); + + blood = CG_SmokePuff( newOrigin, vec3_origin, + 20, // radius + 1, 1, 1, 1, // color + 2000, // trailTime + t, // startTime + 0, // fadeInTime + 0, // flags + cgs.media.bloodTrailShader ); + // use the optimized version + blood->leType = LE_FALL_SCALE_FADE; + // drop a total of 40 units over its lifetime + blood->pos.trDelta[2] = 40; + } +} + + +/* +================ +CG_FragmentBounceMark +================ +*/ +void CG_FragmentBounceMark( localEntity_t *le, trace_t *trace ) { + int radius; + + if ( le->leMarkType == LEMT_BLOOD ) { + + radius = 16 + (rand()&31); + CG_ImpactMark( cgs.media.bloodMarkShader, trace->endpos, trace->plane.normal, random()*360, + 1,1,1,1, qtrue, radius, qfalse ); + } else if ( le->leMarkType == LEMT_BURN ) { + + radius = 8 + (rand()&15); + CG_ImpactMark( cgs.media.burnMarkShader, trace->endpos, trace->plane.normal, random()*360, + 1,1,1,1, qtrue, radius, qfalse ); + } + + + // don't allow a fragment to make multiple marks, or they + // pile up while settling + le->leMarkType = LEMT_NONE; +} + +/* +================ +CG_FragmentBounceSound +================ +*/ +void CG_FragmentBounceSound( localEntity_t *le, trace_t *trace ) { + if ( le->leBounceSoundType == LEBS_BLOOD ) { + // half the gibs will make splat sounds + if ( rand() & 1 ) { + int r = rand()&3; + sfxHandle_t s; + + if ( r == 0 ) { + s = cgs.media.gibBounce1Sound; + } else if ( r == 1 ) { + s = cgs.media.gibBounce2Sound; + } else { + s = cgs.media.gibBounce3Sound; + } + trap_S_StartSound( trace->endpos, ENTITYNUM_WORLD, CHAN_AUTO, s ); + } + } else if ( le->leBounceSoundType == LEBS_BRASS ) { + + } + + // don't allow a fragment to make multiple bounce sounds, + // or it gets too noisy as they settle + le->leBounceSoundType = LEBS_NONE; +} + + +/* +================ +CG_ReflectVelocity +================ +*/ +void CG_ReflectVelocity( localEntity_t *le, trace_t *trace ) { + vec3_t velocity; + float dot; + int hitTime; + + // reflect the velocity on the trace plane + hitTime = cg.time - cg.frametime + cg.frametime * trace->fraction; + BG_EvaluateTrajectoryDelta( &le->pos, hitTime, velocity ); + dot = DotProduct( velocity, trace->plane.normal ); + VectorMA( velocity, -2*dot, trace->plane.normal, le->pos.trDelta ); + + VectorScale( le->pos.trDelta, le->bounceFactor, le->pos.trDelta ); + + VectorCopy( trace->endpos, le->pos.trBase ); + le->pos.trTime = cg.time; + + + // check for stop, making sure that even on low FPS systems it doesn't bobble + if ( trace->allsolid || + ( trace->plane.normal[2] > 0 && + ( le->pos.trDelta[2] < 40 || le->pos.trDelta[2] < -cg.frametime * le->pos.trDelta[2] ) ) ) { + le->pos.trType = TR_STATIONARY; + } else { + + } +} + +/* +================ +CG_AddFragment +================ +*/ +void CG_AddFragment( localEntity_t *le ) { + vec3_t newOrigin; + trace_t trace; + + if ( le->pos.trType == TR_STATIONARY ) { + // sink into the ground if near the removal time + int t; + float oldZ; + + t = le->endTime - cg.time; + if ( t < SINK_TIME ) { + // we must use an explicit lighting origin, otherwise the + // lighting would be lost as soon as the origin went + // into the ground + VectorCopy( le->refEntity.origin, le->refEntity.lightingOrigin ); + le->refEntity.renderfx |= RF_LIGHTING_ORIGIN; + oldZ = le->refEntity.origin[2]; + le->refEntity.origin[2] -= 16 * ( 1.0 - (float)t / SINK_TIME ); + trap_R_AddRefEntityToScene( &le->refEntity ); + le->refEntity.origin[2] = oldZ; + } else { + trap_R_AddRefEntityToScene( &le->refEntity ); + } + + return; + } + + // calculate new position + BG_EvaluateTrajectory( &le->pos, cg.time, newOrigin ); + + // trace a line from previous position to new position + CG_Trace( &trace, le->refEntity.origin, NULL, NULL, newOrigin, -1, CONTENTS_SOLID ); + if ( trace.fraction == 1.0 ) { + // still in free fall + VectorCopy( newOrigin, le->refEntity.origin ); + + if ( le->leFlags & LEF_TUMBLE ) { + vec3_t angles; + + BG_EvaluateTrajectory( &le->angles, cg.time, angles ); + AnglesToAxis( angles, le->refEntity.axis ); + } + + trap_R_AddRefEntityToScene( &le->refEntity ); + + // add a blood trail + if ( le->leBounceSoundType == LEBS_BLOOD ) { + CG_BloodTrail( le ); + } + + return; + } + + // if it is in a nodrop zone, remove it + // this keeps gibs from waiting at the bottom of pits of death + // and floating levels + if ( trap_CM_PointContents( trace.endpos, 0 ) & CONTENTS_NODROP ) { + CG_FreeLocalEntity( le ); + return; + } + + // leave a mark + CG_FragmentBounceMark( le, &trace ); + + // do a bouncy sound + CG_FragmentBounceSound( le, &trace ); + + // reflect the velocity on the trace plane + CG_ReflectVelocity( le, &trace ); + + trap_R_AddRefEntityToScene( &le->refEntity ); +} + +/* +===================================================================== + +TRIVIAL LOCAL ENTITIES + +These only do simple scaling or modulation before passing to the renderer +===================================================================== +*/ + +/* +==================== +CG_AddFadeRGB +==================== +*/ +void CG_AddFadeRGB( localEntity_t *le ) { + refEntity_t *re; + float c; + + re = &le->refEntity; + + c = ( le->endTime - cg.time ) * le->lifeRate; + c *= 0xff; + + re->shaderRGBA[0] = le->color[0] * c; + re->shaderRGBA[1] = le->color[1] * c; + re->shaderRGBA[2] = le->color[2] * c; + re->shaderRGBA[3] = le->color[3] * c; + + trap_R_AddRefEntityToScene( re ); +} + +/* +================== +CG_AddMoveScaleFade +================== +*/ +static void CG_AddMoveScaleFade( localEntity_t *le ) { + refEntity_t *re; + float c; + vec3_t delta; + float len; + + re = &le->refEntity; + + if ( le->fadeInTime > le->startTime && cg.time < le->fadeInTime ) { + // fade / grow time + c = 1.0 - (float) ( le->fadeInTime - cg.time ) / ( le->fadeInTime - le->startTime ); + } + else { + // fade / grow time + c = ( le->endTime - cg.time ) * le->lifeRate; + } + + re->shaderRGBA[3] = 0xff * c * le->color[3]; + + if ( !( le->leFlags & LEF_PUFF_DONT_SCALE ) ) { + re->radius = le->radius * ( 1.0 - c ) + 8; + } + + BG_EvaluateTrajectory( &le->pos, cg.time, re->origin ); + + // if the view would be "inside" the sprite, kill the sprite + // so it doesn't add too much overdraw + VectorSubtract( re->origin, cg.refdef.vieworg, delta ); + len = VectorLength( delta ); + if ( len < le->radius ) { + CG_FreeLocalEntity( le ); + return; + } + + trap_R_AddRefEntityToScene( re ); +} + + +/* +=================== +CG_AddScaleFade + +For rocket smokes that hang in place, fade out, and are +removed if the view passes through them. +There are often many of these, so it needs to be simple. +=================== +*/ +static void CG_AddScaleFade( localEntity_t *le ) { + refEntity_t *re; + float c; + vec3_t delta; + float len; + + re = &le->refEntity; + + // fade / grow time + c = ( le->endTime - cg.time ) * le->lifeRate; + + re->shaderRGBA[3] = 0xff * c * le->color[3]; + re->radius = le->radius * ( 1.0 - c ) + 8; + + // if the view would be "inside" the sprite, kill the sprite + // so it doesn't add too much overdraw + VectorSubtract( re->origin, cg.refdef.vieworg, delta ); + len = VectorLength( delta ); + if ( len < le->radius ) { + CG_FreeLocalEntity( le ); + return; + } + + trap_R_AddRefEntityToScene( re ); +} + + +/* +================= +CG_AddFallScaleFade + +This is just an optimized CG_AddMoveScaleFade +For blood mists that drift down, fade out, and are +removed if the view passes through them. +There are often 100+ of these, so it needs to be simple. +================= +*/ +static void CG_AddFallScaleFade( localEntity_t *le ) { + refEntity_t *re; + float c; + vec3_t delta; + float len; + + re = &le->refEntity; + + // fade time + c = ( le->endTime - cg.time ) * le->lifeRate; + + re->shaderRGBA[3] = 0xff * c * le->color[3]; + + re->origin[2] = le->pos.trBase[2] - ( 1.0 - c ) * le->pos.trDelta[2]; + + re->radius = le->radius * ( 1.0 - c ) + 16; + + //PKMOD - Ergodic 11/30/01 - debug radius (inactive) +// if ( (rand() % 101) > 95 ) +// Com_Printf("CG_AddFallScaleFade - re->radius>%f<, le->radius>%f<\n", re->radius, le->radius ); + + // if the view would be "inside" the sprite, kill the sprite + // so it doesn't add too much overdraw + VectorSubtract( re->origin, cg.refdef.vieworg, delta ); + len = VectorLength( delta ); + if ( len < le->radius ) { + CG_FreeLocalEntity( le ); + return; + } + + trap_R_AddRefEntityToScene( re ); +} + + + +/* +================ +CG_AddExplosion +================ +*/ +static void CG_AddExplosion( localEntity_t *ex ) { + refEntity_t *ent; + + ent = &ex->refEntity; + + // add the entity + trap_R_AddRefEntityToScene(ent); + + // add the dlight + if ( ex->light ) { + float light; + + light = (float)( cg.time - ex->startTime ) / ( ex->endTime - ex->startTime ); + if ( light < 0.5 ) { + light = 1.0; + } else { + light = 1.0 - ( light - 0.5 ) * 2; + } + light = ex->light * light; + trap_R_AddLightToScene(ent->origin, light, ex->lightColor[0], ex->lightColor[1], ex->lightColor[2] ); + } +} + +/* +================ +CG_AddSpriteExplosion +================ +*/ +static void CG_AddSpriteExplosion( localEntity_t *le ) { + refEntity_t re; + float c; + + re = le->refEntity; + + c = ( le->endTime - cg.time ) / ( float ) ( le->endTime - le->startTime ); + if ( c > 1 ) { + c = 1.0; // can happen during connection problems + } + + re.shaderRGBA[0] = 0xff; + re.shaderRGBA[1] = 0xff; + re.shaderRGBA[2] = 0xff; + re.shaderRGBA[3] = 0xff * c * 0.33; + + re.reType = RT_SPRITE; + re.radius = 42 * ( 1.0 - c ) + 30; + + trap_R_AddRefEntityToScene( &re ); + + // add the dlight + if ( le->light ) { + float light; + + light = (float)( cg.time - le->startTime ) / ( le->endTime - le->startTime ); + if ( light < 0.5 ) { + light = 1.0; + } else { + light = 1.0 - ( light - 0.5 ) * 2; + } + light = le->light * light; + trap_R_AddLightToScene(re.origin, light, le->lightColor[0], le->lightColor[1], le->lightColor[2] ); + } +} + + +/* +================ +PKMOD - Ergodic 01/12/04 - for quad beans blast +CG_AddScaledSpriteExplosion + + scale explosion from 1 to 2 times the size +================ +*/ +static void CG_AddScaledSpriteExplosion( localEntity_t *le ) { + refEntity_t re; + float c; + +// vec3_t test, axis[3]; + + re = le->refEntity; + + c = (float) (1 + 3*( cg.time - le->startTime ) / 1100); + + if ( c > 4.0 ) { + c = 4.0; // can happen during connection problems + } + +// VectorClear( test ); +// AnglesToAxis( test, axis ); + + +// VectorScale( axis[0], c, re.axis[0] ); +// VectorScale( axis[1], c, re.axis[1] ); +// VectorScale( axis[2], c, re.axis[2] ); +// re.nonNormalizedAxes = qtrue; + + + re.shaderRGBA[0] = 0xff; + re.shaderRGBA[1] = 0xff; + re.shaderRGBA[2] = 0xff; + re.shaderRGBA[3] = 0xff * c * 0.33; + + re.reType = RT_SPRITE; + re.radius = 40 * c; + + trap_R_AddRefEntityToScene( &re ); + + // add the dlight + if ( le->light ) { + float light; + + light = (float)( cg.time - le->startTime ) / ( le->endTime - le->startTime ); + if ( light < 0.5 ) { + light = 1.0; + } else { + light = 1.0 - ( light - 0.5 ) * 2; + } + light = le->light * light; + trap_R_AddLightToScene(re.origin, light, le->lightColor[0], le->lightColor[1], le->lightColor[2] ); + } +} + +#ifdef MISSIONPACK +/* +==================== +CG_AddKamikaze +==================== +*/ +void CG_AddKamikaze( localEntity_t *le ) { + refEntity_t *re; + refEntity_t shockwave; + float c; + vec3_t test, axis[3]; + int t; + + re = &le->refEntity; + + t = cg.time - le->startTime; + VectorClear( test ); + AnglesToAxis( test, axis ); + + if (t > KAMI_SHOCKWAVE_STARTTIME && t < KAMI_SHOCKWAVE_ENDTIME) { + + if (!(le->leFlags & LEF_SOUND1)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeExplodeSound ); + trap_S_StartLocalSound(cgs.media.kamikazeExplodeSound, CHAN_AUTO); + le->leFlags |= LEF_SOUND1; + } + // 1st kamikaze shockwave + memset(&shockwave, 0, sizeof(shockwave)); + shockwave.hModel = cgs.media.kamikazeShockWave; + shockwave.reType = RT_MODEL; + shockwave.shaderTime = re->shaderTime; + VectorCopy(re->origin, shockwave.origin); + + c = (float)(t - KAMI_SHOCKWAVE_STARTTIME) / (float)(KAMI_SHOCKWAVE_ENDTIME - KAMI_SHOCKWAVE_STARTTIME); + VectorScale( axis[0], c * KAMI_SHOCKWAVE_MAXRADIUS / KAMI_SHOCKWAVEMODEL_RADIUS, shockwave.axis[0] ); + VectorScale( axis[1], c * KAMI_SHOCKWAVE_MAXRADIUS / KAMI_SHOCKWAVEMODEL_RADIUS, shockwave.axis[1] ); + VectorScale( axis[2], c * KAMI_SHOCKWAVE_MAXRADIUS / KAMI_SHOCKWAVEMODEL_RADIUS, shockwave.axis[2] ); + shockwave.nonNormalizedAxes = qtrue; + + if (t > KAMI_SHOCKWAVEFADE_STARTTIME) { + c = (float)(t - KAMI_SHOCKWAVEFADE_STARTTIME) / (float)(KAMI_SHOCKWAVE_ENDTIME - KAMI_SHOCKWAVEFADE_STARTTIME); + } + else { + c = 0; + } + c *= 0xff; + shockwave.shaderRGBA[0] = 0xff - c; + shockwave.shaderRGBA[1] = 0xff - c; + shockwave.shaderRGBA[2] = 0xff - c; + shockwave.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &shockwave ); + } + + if (t > KAMI_EXPLODE_STARTTIME && t < KAMI_IMPLODE_ENDTIME) { + // explosion and implosion + c = ( le->endTime - cg.time ) * le->lifeRate; + c *= 0xff; + re->shaderRGBA[0] = le->color[0] * c; + re->shaderRGBA[1] = le->color[1] * c; + re->shaderRGBA[2] = le->color[2] * c; + re->shaderRGBA[3] = le->color[3] * c; + + if( t < KAMI_IMPLODE_STARTTIME ) { + c = (float)(t - KAMI_EXPLODE_STARTTIME) / (float)(KAMI_IMPLODE_STARTTIME - KAMI_EXPLODE_STARTTIME); + } + else { + if (!(le->leFlags & LEF_SOUND2)) { +// trap_S_StartSound (re->origin, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.kamikazeImplodeSound ); + trap_S_StartLocalSound(cgs.media.kamikazeImplodeSound, CHAN_AUTO); + le->leFlags |= LEF_SOUND2; + } + c = (float)(KAMI_IMPLODE_ENDTIME - t) / (float) (KAMI_IMPLODE_ENDTIME - KAMI_IMPLODE_STARTTIME); + } + VectorScale( axis[0], c * KAMI_BOOMSPHERE_MAXRADIUS / KAMI_BOOMSPHEREMODEL_RADIUS, re->axis[0] ); + VectorScale( axis[1], c * KAMI_BOOMSPHERE_MAXRADIUS / KAMI_BOOMSPHEREMODEL_RADIUS, re->axis[1] ); + VectorScale( axis[2], c * KAMI_BOOMSPHERE_MAXRADIUS / KAMI_BOOMSPHEREMODEL_RADIUS, re->axis[2] ); + re->nonNormalizedAxes = qtrue; + + trap_R_AddRefEntityToScene( re ); + // add the dlight + trap_R_AddLightToScene( re->origin, c * 1000.0, 1.0, 1.0, c ); + } + + if (t > KAMI_SHOCKWAVE2_STARTTIME && t < KAMI_SHOCKWAVE2_ENDTIME) { + // 2nd kamikaze shockwave + if (le->angles.trBase[0] == 0 && + le->angles.trBase[1] == 0 && + le->angles.trBase[2] == 0) { + le->angles.trBase[0] = random() * 360; + le->angles.trBase[1] = random() * 360; + le->angles.trBase[2] = random() * 360; + } + else { + c = 0; + } + memset(&shockwave, 0, sizeof(shockwave)); + shockwave.hModel = cgs.media.kamikazeShockWave; + shockwave.reType = RT_MODEL; + shockwave.shaderTime = re->shaderTime; + VectorCopy(re->origin, shockwave.origin); + + test[0] = le->angles.trBase[0]; + test[1] = le->angles.trBase[1]; + test[2] = le->angles.trBase[2]; + AnglesToAxis( test, axis ); + + c = (float)(t - KAMI_SHOCKWAVE2_STARTTIME) / (float)(KAMI_SHOCKWAVE2_ENDTIME - KAMI_SHOCKWAVE2_STARTTIME); + VectorScale( axis[0], c * KAMI_SHOCKWAVE2_MAXRADIUS / KAMI_SHOCKWAVEMODEL_RADIUS, shockwave.axis[0] ); + VectorScale( axis[1], c * KAMI_SHOCKWAVE2_MAXRADIUS / KAMI_SHOCKWAVEMODEL_RADIUS, shockwave.axis[1] ); + VectorScale( axis[2], c * KAMI_SHOCKWAVE2_MAXRADIUS / KAMI_SHOCKWAVEMODEL_RADIUS, shockwave.axis[2] ); + shockwave.nonNormalizedAxes = qtrue; + + if (t > KAMI_SHOCKWAVE2FADE_STARTTIME) { + c = (float)(t - KAMI_SHOCKWAVE2FADE_STARTTIME) / (float)(KAMI_SHOCKWAVE2_ENDTIME - KAMI_SHOCKWAVE2FADE_STARTTIME); + } + else { + c = 0; + } + c *= 0xff; + shockwave.shaderRGBA[0] = 0xff - c; + shockwave.shaderRGBA[1] = 0xff - c; + shockwave.shaderRGBA[2] = 0xff - c; + shockwave.shaderRGBA[3] = 0xff - c; + + trap_R_AddRefEntityToScene( &shockwave ); + } +} + + +/* +=================== +CG_AddInvulnerabilityImpact +=================== +*/ +void CG_AddInvulnerabilityImpact( localEntity_t *le ) { + trap_R_AddRefEntityToScene( &le->refEntity ); +} + +/* +=================== +CG_AddInvulnerabilityJuiced +=================== +*/ +void CG_AddInvulnerabilityJuiced( localEntity_t *le ) { + int t; + + t = cg.time - le->startTime; + if ( t > 3000 ) { + le->refEntity.axis[0][0] = (float) 1.0 + 0.3 * (t - 3000) / 2000; + le->refEntity.axis[1][1] = (float) 1.0 + 0.3 * (t - 3000) / 2000; + le->refEntity.axis[2][2] = (float) 0.7 + 0.3 * (2000 - (t - 3000)) / 2000; + } + if ( t > 5000 ) { + le->endTime = 0; + CG_GibPlayer( le->refEntity.origin ); + } + else { + trap_R_AddRefEntityToScene( &le->refEntity ); + } +} + +/* +=================== +CG_AddRefEntity +=================== +*/ +void CG_AddRefEntity( localEntity_t *le ) { + if (le->endTime < cg.time) { + CG_FreeLocalEntity( le ); + return; + } + trap_R_AddRefEntityToScene( &le->refEntity ); +} + +#endif +/* +=================== +CG_AddScorePlum +=================== +*/ +#define NUMBER_SIZE 8 + +void CG_AddScorePlum( localEntity_t *le ) { + refEntity_t *re; + vec3_t origin, delta, dir, vec, up = {0, 0, 1}; + float c, len; + int i, score, digits[10], numdigits, negative; + + re = &le->refEntity; + + c = ( le->endTime - cg.time ) * le->lifeRate; + + score = le->radius; + if (score < 0) { + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0x11; + re->shaderRGBA[2] = 0x11; + } + else { + re->shaderRGBA[0] = 0xff; + re->shaderRGBA[1] = 0xff; + re->shaderRGBA[2] = 0xff; + if (score >= 50) { + re->shaderRGBA[1] = 0; + } else if (score >= 20) { + re->shaderRGBA[0] = re->shaderRGBA[1] = 0; + } else if (score >= 10) { + re->shaderRGBA[2] = 0; + } else if (score >= 2) { + re->shaderRGBA[0] = re->shaderRGBA[2] = 0; + } + + } + if (c < 0.25) + re->shaderRGBA[3] = 0xff * 4 * c; + else + re->shaderRGBA[3] = 0xff; + + re->radius = NUMBER_SIZE / 2; + + VectorCopy(le->pos.trBase, origin); + origin[2] += 110 - c * 100; + + VectorSubtract(cg.refdef.vieworg, origin, dir); + CrossProduct(dir, up, vec); + VectorNormalize(vec); + + VectorMA(origin, -10 + 20 * sin(c * 2 * M_PI), vec, origin); + + // if the view would be "inside" the sprite, kill the sprite + // so it doesn't add too much overdraw + VectorSubtract( origin, cg.refdef.vieworg, delta ); + len = VectorLength( delta ); + if ( len < 20 ) { + CG_FreeLocalEntity( le ); + return; + } + + negative = qfalse; + if (score < 0) { + negative = qtrue; + score = -score; + } + + for (numdigits = 0; !(numdigits && !score); numdigits++) { + digits[numdigits] = score % 10; + score = score / 10; + } + + if (negative) { + digits[numdigits] = 10; + numdigits++; + } + + for (i = 0; i < numdigits; i++) { + VectorMA(origin, (float) (((float) numdigits / 2) - i) * NUMBER_SIZE, vec, re->origin); + re->customShader = cgs.media.numberShaders[digits[numdigits-1-i]]; + trap_R_AddRefEntityToScene( re ); + } +} + + +//============================================================================== + +/* +=================== +CG_AddLocalEntities + +=================== +*/ +void CG_AddLocalEntities( void ) { + localEntity_t *le, *next; + + // walk the list backwards, so any new local entities generated + // (trails, marks, etc) will be present this frame + le = cg_activeLocalEntities.prev; + for ( ; le != &cg_activeLocalEntities ; le = next ) { + // grab next now, so if the local entity is freed we + // still have it + next = le->prev; + + if ( cg.time >= le->endTime ) { + CG_FreeLocalEntity( le ); + continue; + } + switch ( le->leType ) { + default: + CG_Error( "Bad leType: %i", le->leType ); + break; + + case LE_MARK: + break; + + case LE_SPRITE_EXPLOSION: + CG_AddSpriteExplosion( le ); + break; + + case LE_EXPLOSION: + CG_AddExplosion( le ); + break; + + case LE_FRAGMENT: // gibs and brass + CG_AddFragment( le ); + break; + + case LE_MOVE_SCALE_FADE: // water bubbles + CG_AddMoveScaleFade( le ); + break; + + case LE_FADE_RGB: // teleporters, railtrails + CG_AddFadeRGB( le ); + break; + + case LE_FALL_SCALE_FADE: // gib blood trails + CG_AddFallScaleFade( le ); + break; + + case LE_SCALE_FADE: // rocket trails + CG_AddScaleFade( le ); + break; + + case LE_SCOREPLUM: + CG_AddScorePlum( le ); + break; + + //PKMOD - Ergodic 01/12/04 - add LE for quad beans + case LE_SCALED_SPRITE_EXPLOSION: + CG_AddScaledSpriteExplosion( le ); + break; + +#ifdef MISSIONPACK + case LE_KAMIKAZE: + CG_AddKamikaze( le ); + break; + case LE_INVULIMPACT: + CG_AddInvulnerabilityImpact( le ); + break; + case LE_INVULJUICED: + CG_AddInvulnerabilityJuiced( le ); + break; + case LE_SHOWREFENTITY: + CG_AddRefEntity( le ); + break; +#endif + } + + } +} + + + + diff --git a/quake3/source/code/cgame/cg_main.c b/quake3/source/code/cgame/cg_main.c new file mode 100644 index 0000000..0d90ddd --- /dev/null +++ b/quake3/source/code/cgame/cg_main.c @@ -0,0 +1,2545 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_main.c -- initialization and primary entry point for cgame +#include "cg_local.h" + +//PKMOD - Ergodic 01/17/04 - Enable HUD in PKA3.0 +//#ifdef MISSIONPACK +#include "../ui/ui_shared.h" +// display context for new ui stuff +displayContextDef_t cgDC; +//#endif + +int forceModelModificationCount = -1; + +void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ); +void CG_Shutdown( void ); + + +/* +================ +vmMain + +This is the only way control passes into the module. +This must be the very first function compiled into the .q3vm file +================ +*/ +int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) { + + switch ( command ) { + case CG_INIT: + //PKMOD - Ergodic 10/31/01 - debug CG_INIT arguments (inactive) +// Com_Printf("vmMain - 0>%d<, 1>%d<, 2>%d<, 3>%d<, 4>%d<, 5>%d<, 6>%d<, 7>%d<, 8>%d<, 9>%d<, 10>%d<, 11>%d<\n", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11 ); + CG_Init( arg0, arg1, arg2 ); + return 0; + case CG_SHUTDOWN: + CG_Shutdown(); + return 0; + case CG_CONSOLE_COMMAND: + return CG_ConsoleCommand(); + case CG_DRAW_ACTIVE_FRAME: + //PKMOD - Ergodic 10/31/01 - debug CG_DRAW_ACTIVE_FRAME arguments (inactive) +// Com_Printf("vmMain - 0>%d<, 1>%d<, 2>%d<, 3>%d<, 4>%d<, 5>%d<, 6>%d<, 7>%d<, 8>%d<, 9>%d<, 10>%d<, 11>%d<\n", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11 ); + CG_DrawActiveFrame( arg0, arg1, arg2 ); + return 0; + case CG_CROSSHAIR_PLAYER: + return CG_CrosshairPlayer(); + case CG_LAST_ATTACKER: + return CG_LastAttacker(); + case CG_KEY_EVENT: + CG_KeyEvent(arg0, arg1); + return 0; + case CG_MOUSE_EVENT: +//PKMOD - Ergodic 01/17/04 - enable HUD code in PKA 3.0 +//#ifdef MISSIONPACK + cgDC.cursorx = cgs.cursorX; + cgDC.cursory = cgs.cursorY; +//#endif + CG_MouseEvent(arg0, arg1); + return 0; + case CG_EVENT_HANDLING: + CG_EventHandling(arg0); + return 0; + default: + CG_Error( "vmMain: unknown command %i", command ); + break; + } + return -1; +} + + +cg_t cg; +cgs_t cgs; +centity_t cg_entities[MAX_GENTITIES]; +weaponInfo_t cg_weapons[MAX_WEAPONS]; +itemInfo_t cg_items[MAX_ITEMS]; + + +vmCvar_t cg_railTrailTime; +vmCvar_t cg_centertime; +vmCvar_t cg_runpitch; +vmCvar_t cg_runroll; +vmCvar_t cg_bobup; +vmCvar_t cg_bobpitch; +vmCvar_t cg_bobroll; +vmCvar_t cg_swingSpeed; +vmCvar_t cg_shadows; +vmCvar_t cg_gibs; +vmCvar_t cg_drawTimer; +vmCvar_t cg_drawFPS; +vmCvar_t cg_drawSnapshot; +vmCvar_t cg_draw3dIcons; +vmCvar_t cg_drawIcons; +vmCvar_t cg_drawAmmoWarning; +vmCvar_t cg_drawCrosshair; +vmCvar_t cg_drawCrosshairNames; +vmCvar_t cg_drawRewards; +vmCvar_t cg_crosshairSize; +vmCvar_t cg_crosshairX; +vmCvar_t cg_crosshairY; +vmCvar_t cg_crosshairHealth; +vmCvar_t cg_draw2D; +vmCvar_t cg_drawStatus; +vmCvar_t cg_animSpeed; +vmCvar_t cg_debugAnim; +vmCvar_t cg_debugPosition; +vmCvar_t cg_debugEvents; +vmCvar_t cg_errorDecay; +vmCvar_t cg_nopredict; +vmCvar_t cg_noPlayerAnims; +vmCvar_t cg_showmiss; +vmCvar_t cg_footsteps; +vmCvar_t cg_addMarks; +vmCvar_t cg_brassTime; +vmCvar_t cg_viewsize; +vmCvar_t cg_drawGun; +vmCvar_t cg_gun_frame; +vmCvar_t cg_gun_x; +vmCvar_t cg_gun_y; +vmCvar_t cg_gun_z; +vmCvar_t cg_tracerChance; +vmCvar_t cg_tracerWidth; +vmCvar_t cg_tracerLength; +vmCvar_t cg_autoswitch; +vmCvar_t cg_ignore; +vmCvar_t cg_simpleItems; +vmCvar_t cg_fov; +vmCvar_t cg_zoomFov; +vmCvar_t cg_thirdPerson; +vmCvar_t cg_thirdPersonRange; +vmCvar_t cg_thirdPersonAngle; +vmCvar_t cg_stereoSeparation; +vmCvar_t cg_lagometer; +vmCvar_t cg_drawAttacker; +vmCvar_t cg_synchronousClients; +vmCvar_t cg_teamChatTime; +vmCvar_t cg_teamChatHeight; +vmCvar_t cg_stats; +vmCvar_t cg_buildScript; +vmCvar_t cg_forceModel; +vmCvar_t cg_paused; +vmCvar_t cg_blood; +vmCvar_t cg_predictItems; +vmCvar_t cg_deferPlayers; +vmCvar_t cg_drawTeamOverlay; +vmCvar_t cg_teamOverlayUserinfo; +vmCvar_t cg_drawFriend; +vmCvar_t cg_teamChatsOnly; +vmCvar_t cg_noVoiceChats; +vmCvar_t cg_noVoiceText; +vmCvar_t cg_hudFiles; +vmCvar_t cg_scorePlum; +vmCvar_t cg_smoothClients; +vmCvar_t pmove_fixed; +//vmCvar_t cg_pmove_fixed; +vmCvar_t pmove_msec; +vmCvar_t cg_pmove_msec; +vmCvar_t cg_cameraMode; +vmCvar_t cg_cameraOrbit; +vmCvar_t cg_cameraOrbitDelay; +vmCvar_t cg_timescaleFadeEnd; +vmCvar_t cg_timescaleFadeSpeed; +vmCvar_t cg_timescale; +vmCvar_t cg_smallFont; +vmCvar_t cg_bigFont; +vmCvar_t cg_noTaunt; +vmCvar_t cg_noProjectileTrail; +vmCvar_t cg_oldRail; +vmCvar_t cg_oldRocket; +vmCvar_t cg_oldPlasma; +vmCvar_t cg_trueLightning; +//PKMOD - Ergodic 08/17/2002 - add Client error for communication to UI module +vmCvar_t cl_pkaerror; +//PKMOD - Ergodic 08/16/03 - add cvar for PKA full weapon cycling +vmCvar_t cg_pkafullweaponcycling; + + + +#ifdef MISSIONPACK +vmCvar_t cg_redTeamName; +vmCvar_t cg_blueTeamName; +vmCvar_t cg_currentSelectedPlayer; +vmCvar_t cg_currentSelectedPlayerName; +vmCvar_t cg_singlePlayer; +vmCvar_t cg_enableDust; +vmCvar_t cg_enableBreath; +vmCvar_t cg_singlePlayerActive; +vmCvar_t cg_recordSPDemo; +vmCvar_t cg_recordSPDemoName; +vmCvar_t cg_obeliskRespawnDelay; +#endif + +//PKMOD - Ergodic 02/02/04 - Enable this code so that POSTGAME will show proper completion time +vmCvar_t cg_singlePlayerActive; +vmCvar_t cg_recordSPDemo; +vmCvar_t cg_recordSPDemoName; + + +//PKMOD - Ergodic 01/17/04 - Enable Hud Code +vmCvar_t cg_redTeamName; +vmCvar_t cg_blueTeamName; +vmCvar_t cg_currentSelectedPlayer; +vmCvar_t cg_currentSelectedPlayerName; + +//PKMOD - Ergodic 05/11/01 - register holdables into their own array +// for optimization purposes +int cg_holdable[ HI_NUM_HOLDABLE ]; + +typedef struct { + vmCvar_t *vmCvar; + char *cvarName; + char *defaultString; + int cvarFlags; +} cvarTable_t; + +static cvarTable_t cvarTable[] = { // bk001129 + { &cg_ignore, "cg_ignore", "0", 0 }, // used for debugging + { &cg_autoswitch, "cg_autoswitch", "1", CVAR_ARCHIVE }, + { &cg_drawGun, "cg_drawGun", "1", CVAR_ARCHIVE }, + { &cg_zoomFov, "cg_zoomfov", "22.5", CVAR_ARCHIVE }, + { &cg_fov, "cg_fov", "90", CVAR_ARCHIVE }, + { &cg_viewsize, "cg_viewsize", "100", CVAR_ARCHIVE }, + { &cg_stereoSeparation, "cg_stereoSeparation", "0.4", CVAR_ARCHIVE }, + { &cg_shadows, "cg_shadows", "1", CVAR_ARCHIVE }, + { &cg_gibs, "cg_gibs", "1", CVAR_ARCHIVE }, + { &cg_draw2D, "cg_draw2D", "1", CVAR_ARCHIVE }, + { &cg_drawStatus, "cg_drawStatus", "1", CVAR_ARCHIVE }, + { &cg_drawTimer, "cg_drawTimer", "0", CVAR_ARCHIVE }, + { &cg_drawFPS, "cg_drawFPS", "0", CVAR_ARCHIVE }, + { &cg_drawSnapshot, "cg_drawSnapshot", "0", CVAR_ARCHIVE }, + { &cg_draw3dIcons, "cg_draw3dIcons", "1", CVAR_ARCHIVE }, + { &cg_drawIcons, "cg_drawIcons", "1", CVAR_ARCHIVE }, + { &cg_drawAmmoWarning, "cg_drawAmmoWarning", "1", CVAR_ARCHIVE }, + { &cg_drawAttacker, "cg_drawAttacker", "1", CVAR_ARCHIVE }, + { &cg_drawCrosshair, "cg_drawCrosshair", "4", CVAR_ARCHIVE }, + { &cg_drawCrosshairNames, "cg_drawCrosshairNames", "1", CVAR_ARCHIVE }, + { &cg_drawRewards, "cg_drawRewards", "1", CVAR_ARCHIVE }, + { &cg_crosshairSize, "cg_crosshairSize", "24", CVAR_ARCHIVE }, + { &cg_crosshairHealth, "cg_crosshairHealth", "1", CVAR_ARCHIVE }, + { &cg_crosshairX, "cg_crosshairX", "0", CVAR_ARCHIVE }, + { &cg_crosshairY, "cg_crosshairY", "0", CVAR_ARCHIVE }, + { &cg_brassTime, "cg_brassTime", "2500", CVAR_ARCHIVE }, + { &cg_simpleItems, "cg_simpleItems", "0", CVAR_ARCHIVE }, + { &cg_addMarks, "cg_marks", "1", CVAR_ARCHIVE }, + { &cg_lagometer, "cg_lagometer", "1", CVAR_ARCHIVE }, + { &cg_railTrailTime, "cg_railTrailTime", "400", CVAR_ARCHIVE }, + { &cg_gun_x, "cg_gunX", "0", CVAR_CHEAT }, + { &cg_gun_y, "cg_gunY", "0", CVAR_CHEAT }, + { &cg_gun_z, "cg_gunZ", "0", CVAR_CHEAT }, + { &cg_centertime, "cg_centertime", "3", CVAR_CHEAT }, + { &cg_runpitch, "cg_runpitch", "0.002", CVAR_ARCHIVE}, + { &cg_runroll, "cg_runroll", "0.005", CVAR_ARCHIVE }, + { &cg_bobup , "cg_bobup", "0.005", CVAR_CHEAT }, + { &cg_bobpitch, "cg_bobpitch", "0.002", CVAR_ARCHIVE }, + { &cg_bobroll, "cg_bobroll", "0.002", CVAR_ARCHIVE }, + { &cg_swingSpeed, "cg_swingSpeed", "0.3", CVAR_CHEAT }, + { &cg_animSpeed, "cg_animspeed", "1", CVAR_CHEAT }, + { &cg_debugAnim, "cg_debuganim", "0", CVAR_CHEAT }, + { &cg_debugPosition, "cg_debugposition", "0", CVAR_CHEAT }, + { &cg_debugEvents, "cg_debugevents", "0", CVAR_CHEAT }, + { &cg_errorDecay, "cg_errordecay", "100", 0 }, + { &cg_nopredict, "cg_nopredict", "0", 0 }, + { &cg_noPlayerAnims, "cg_noplayeranims", "0", CVAR_CHEAT }, + { &cg_showmiss, "cg_showmiss", "0", 0 }, + { &cg_footsteps, "cg_footsteps", "1", CVAR_CHEAT }, + { &cg_tracerChance, "cg_tracerchance", "0.4", CVAR_CHEAT }, + { &cg_tracerWidth, "cg_tracerwidth", "1", CVAR_CHEAT }, + { &cg_tracerLength, "cg_tracerlength", "100", CVAR_CHEAT }, + { &cg_thirdPersonRange, "cg_thirdPersonRange", "40", CVAR_CHEAT }, + { &cg_thirdPersonAngle, "cg_thirdPersonAngle", "0", CVAR_CHEAT }, + { &cg_thirdPerson, "cg_thirdPerson", "0", 0 }, + { &cg_teamChatTime, "cg_teamChatTime", "3000", CVAR_ARCHIVE }, + { &cg_teamChatHeight, "cg_teamChatHeight", "0", CVAR_ARCHIVE }, + { &cg_forceModel, "cg_forceModel", "0", CVAR_ARCHIVE }, + { &cg_predictItems, "cg_predictItems", "1", CVAR_ARCHIVE }, +#ifdef MISSIONPACK + { &cg_deferPlayers, "cg_deferPlayers", "0", CVAR_ARCHIVE }, +#else + { &cg_deferPlayers, "cg_deferPlayers", "1", CVAR_ARCHIVE }, +#endif + { &cg_drawTeamOverlay, "cg_drawTeamOverlay", "0", CVAR_ARCHIVE }, + { &cg_teamOverlayUserinfo, "teamoverlay", "0", CVAR_ROM | CVAR_USERINFO }, + { &cg_stats, "cg_stats", "0", 0 }, + { &cg_drawFriend, "cg_drawFriend", "1", CVAR_ARCHIVE }, + { &cg_teamChatsOnly, "cg_teamChatsOnly", "0", CVAR_ARCHIVE }, + { &cg_noVoiceChats, "cg_noVoiceChats", "0", CVAR_ARCHIVE }, + { &cg_noVoiceText, "cg_noVoiceText", "0", CVAR_ARCHIVE }, + // the following variables are created in other parts of the system, + // but we also reference them here + { &cg_buildScript, "com_buildScript", "0", 0 }, // force loading of all possible data amd error on failures + { &cg_paused, "cl_paused", "0", CVAR_ROM }, + { &cg_blood, "com_blood", "1", CVAR_ARCHIVE }, + { &cg_synchronousClients, "g_synchronousClients", "0", 0 }, // communicated by systeminfo +#ifdef MISSIONPACK + { &cg_redTeamName, "g_redteam", DEFAULT_REDTEAM_NAME, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_USERINFO }, + { &cg_blueTeamName, "g_blueteam", DEFAULT_BLUETEAM_NAME, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_USERINFO }, + { &cg_currentSelectedPlayer, "cg_currentSelectedPlayer", "0", CVAR_ARCHIVE}, + { &cg_currentSelectedPlayerName, "cg_currentSelectedPlayerName", "", CVAR_ARCHIVE}, + { &cg_singlePlayer, "ui_singlePlayerActive", "0", CVAR_USERINFO}, + { &cg_enableDust, "g_enableDust", "0", CVAR_SERVERINFO}, + { &cg_enableBreath, "g_enableBreath", "0", CVAR_SERVERINFO}, + { &cg_singlePlayerActive, "ui_singlePlayerActive", "0", CVAR_USERINFO}, + { &cg_recordSPDemo, "ui_recordSPDemo", "0", CVAR_ARCHIVE}, + { &cg_recordSPDemoName, "ui_recordSPDemoName", "", CVAR_ARCHIVE}, + { &cg_obeliskRespawnDelay, "g_obeliskRespawnDelay", "10", CVAR_SERVERINFO}, + { &cg_hudFiles, "cg_hudFiles", "ui/hud.txt", CVAR_ARCHIVE}, +#endif + + //PKMOD - Ergodic 02/02/04 - Enable this code so that POSTGAME will show proper completion time + { &cg_singlePlayerActive, "ui_singlePlayerActive", "0", CVAR_USERINFO}, + { &cg_recordSPDemo, "ui_recordSPDemo", "0", CVAR_ARCHIVE}, + { &cg_recordSPDemoName, "ui_recordSPDemoName", "", CVAR_ARCHIVE}, + + //PKMOD - Ergodic 01/17/03 - Activate HUD for PKA3.0 + { &cg_hudFiles, "cg_hudFiles", "ui/hud.txt", CVAR_ARCHIVE}, + { &cg_cameraOrbit, "cg_cameraOrbit", "0", CVAR_CHEAT}, + { &cg_cameraOrbitDelay, "cg_cameraOrbitDelay", "50", CVAR_ARCHIVE}, + { &cg_timescaleFadeEnd, "cg_timescaleFadeEnd", "1", 0}, + { &cg_timescaleFadeSpeed, "cg_timescaleFadeSpeed", "0", 0}, + { &cg_timescale, "timescale", "1", 0}, + { &cg_scorePlum, "cg_scorePlums", "1", CVAR_USERINFO | CVAR_ARCHIVE}, + { &cg_smoothClients, "cg_smoothClients", "0", CVAR_USERINFO | CVAR_ARCHIVE}, + { &cg_cameraMode, "com_cameraMode", "0", CVAR_CHEAT}, + + { &pmove_fixed, "pmove_fixed", "0", 0}, + { &pmove_msec, "pmove_msec", "8", 0}, + { &cg_noTaunt, "cg_noTaunt", "0", CVAR_ARCHIVE}, + { &cg_noProjectileTrail, "cg_noProjectileTrail", "0", CVAR_ARCHIVE}, + { &cg_smallFont, "ui_smallFont", "0.25", CVAR_ARCHIVE}, + { &cg_bigFont, "ui_bigFont", "0.4", CVAR_ARCHIVE}, + { &cg_oldRail, "cg_oldRail", "1", CVAR_ARCHIVE}, + { &cg_oldRocket, "cg_oldRocket", "1", CVAR_ARCHIVE}, + { &cg_oldPlasma, "cg_oldPlasma", "1", CVAR_ARCHIVE}, + { &cg_trueLightning, "cg_trueLightning", "0.0", CVAR_ARCHIVE}, +// { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE } + //PKMOD - Ergodic 08/17/2002 - add Client error for communication to UI module + { &cl_pkaerror, "cl_pkaerror", "0", CVAR_ROM }, + //PKMOD - Ergodic 08/16/03 - add cvar for PKA full weapon cycling + { &cg_pkafullweaponcycling, "cg_pkafullweaponcycling", "1", CVAR_ARCHIVE }, +}; + +static int cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] ); + +//PKMOD - Ergodic 10/10/2000 - 25 voting images' shader assignments - set to zero +char cg_voting_shader_flag[] = { "0000000000000000000000000" }; + +/* +================= +CG_RegisterCvars +================= +*/ +void CG_RegisterCvars( void ) { + int i; + cvarTable_t *cv; + char var[MAX_TOKEN_CHARS]; + + for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) { + trap_Cvar_Register( cv->vmCvar, cv->cvarName, + cv->defaultString, cv->cvarFlags ); + } + + // see if we are also running the server on this machine + trap_Cvar_VariableStringBuffer( "sv_running", var, sizeof( var ) ); + cgs.localServer = atoi( var ); + + forceModelModificationCount = cg_forceModel.modificationCount; + + trap_Cvar_Register(NULL, "model", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register(NULL, "headmodel", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register(NULL, "team_model", DEFAULT_TEAM_MODEL, CVAR_USERINFO | CVAR_ARCHIVE ); + trap_Cvar_Register(NULL, "team_headmodel", DEFAULT_TEAM_HEAD, CVAR_USERINFO | CVAR_ARCHIVE ); +} + +/* +=================== +CG_ForceModelChange +=================== +*/ +static void CG_ForceModelChange( void ) { + int i; + + for (i=0 ; ivmCvar ); + } + + // check for modications here + + // If team overlay is on, ask for updates from the server. If its off, + // let the server know so we don't receive it + if ( drawTeamOverlayModificationCount != cg_drawTeamOverlay.modificationCount ) { + drawTeamOverlayModificationCount = cg_drawTeamOverlay.modificationCount; + + if ( cg_drawTeamOverlay.integer > 0 ) { + trap_Cvar_Set( "teamoverlay", "1" ); + } else { + trap_Cvar_Set( "teamoverlay", "0" ); + } + // FIXME E3 HACK + trap_Cvar_Set( "teamoverlay", "1" ); + } + + // if force model changed + if ( forceModelModificationCount != cg_forceModel.modificationCount ) { + forceModelModificationCount = cg_forceModel.modificationCount; + CG_ForceModelChange(); + } +} + +int CG_CrosshairPlayer( void ) { + if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) { + return -1; + } + return cg.crosshairClientNum; +} + +int CG_LastAttacker( void ) { + if ( !cg.attackerTime ) { + return -1; + } + return cg.snap->ps.persistant[PERS_ATTACKER]; +} + +void QDECL CG_Printf( const char *msg, ... ) { + va_list argptr; + char text[1024]; + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + trap_Print( text ); +} + +void QDECL CG_Error( const char *msg, ... ) { + va_list argptr; + char text[1024]; + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + trap_Error( text ); +} + +#ifndef CGAME_HARD_LINKED +// this is only here so the functions in q_shared.c and bg_*.c can link (FIXME) + +void QDECL Com_Error( int level, const char *error, ... ) { + va_list argptr; + char text[1024]; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + CG_Error( "%s", text); +} + +void QDECL Com_Printf( const char *msg, ... ) { + va_list argptr; + char text[1024]; + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + CG_Printf ("%s", text); +} + +#endif + +/* +================ +CG_Argv +================ +*/ +const char *CG_Argv( int arg ) { + static char buffer[MAX_STRING_CHARS]; + + trap_Argv( arg, buffer, sizeof( buffer ) ); + + return buffer; +} + + +//======================================================================== + +/* +================= +CG_RegisterItemSounds + +The server says this item is used on this level +================= +*/ +static void CG_RegisterItemSounds( int itemNum ) { + gitem_t *item; + char data[MAX_QPATH]; + char *s, *start; + int len; + + item = &bg_itemlist[ itemNum ]; + + if( item->pickup_sound ) { + trap_S_RegisterSound( item->pickup_sound, qfalse ); + } + + // parse the space seperated precache string for other media + s = item->sounds; + if (!s || !s[0]) + return; + + while (*s) { + start = s; + while (*s && *s != ' ') { + s++; + } + + len = s-start; + if (len >= MAX_QPATH || len < 5) { + CG_Error( "PrecacheItem: %s has bad precache string", + item->classname); + return; + } + memcpy (data, start, len); + data[len] = 0; + if ( *s ) { + s++; + } + + if ( !strcmp(data+len-3, "wav" )) { + trap_S_RegisterSound( data, qfalse ); + } + } +} + + +/* +================= +CG_RegisterSounds + +called during a precache command +================= +*/ +static void CG_RegisterSounds( void ) { + int i; + char items[MAX_ITEMS+1]; + char name[MAX_QPATH]; + const char *soundName; + + //PKMOD - Ergodic 07/30/01 - debug "bad magic" crash (inactive) +// int dbg1, dbg2; +// dbg1 = 1; +// dbg2 = 2; + + // voice commands +#ifdef MISSIONPACK + CG_LoadVoiceChats(); +#endif + + cgs.media.oneMinuteSound = trap_S_RegisterSound( "sound/feedback/1_minute.wav", qtrue ); + cgs.media.fiveMinuteSound = trap_S_RegisterSound( "sound/feedback/5_minute.wav", qtrue ); + cgs.media.suddenDeathSound = trap_S_RegisterSound( "sound/feedback/sudden_death.wav", qtrue ); + cgs.media.oneFragSound = trap_S_RegisterSound( "sound/feedback/1_frag.wav", qtrue ); + cgs.media.twoFragSound = trap_S_RegisterSound( "sound/feedback/2_frags.wav", qtrue ); + cgs.media.threeFragSound = trap_S_RegisterSound( "sound/feedback/3_frags.wav", qtrue ); + cgs.media.count3Sound = trap_S_RegisterSound( "sound/feedback/three.wav", qtrue ); + cgs.media.count2Sound = trap_S_RegisterSound( "sound/feedback/two.wav", qtrue ); + cgs.media.count1Sound = trap_S_RegisterSound( "sound/feedback/one.wav", qtrue ); + cgs.media.countFightSound = trap_S_RegisterSound( "sound/feedback/fight.wav", qtrue ); + cgs.media.countPrepareSound = trap_S_RegisterSound( "sound/feedback/prepare.wav", qtrue ); +#ifdef MISSIONPACK + cgs.media.countPrepareTeamSound = trap_S_RegisterSound( "sound/feedback/prepare_team.wav", qtrue ); +#endif + + if ( cgs.gametype >= GT_TEAM || cg_buildScript.integer ) { + + cgs.media.captureAwardSound = trap_S_RegisterSound( "sound/teamplay/flagcapture_yourteam.wav", qtrue ); + cgs.media.redLeadsSound = trap_S_RegisterSound( "sound/feedback/redleads.wav", qtrue ); + cgs.media.blueLeadsSound = trap_S_RegisterSound( "sound/feedback/blueleads.wav", qtrue ); + cgs.media.teamsTiedSound = trap_S_RegisterSound( "sound/feedback/teamstied.wav", qtrue ); + cgs.media.hitTeamSound = trap_S_RegisterSound( "sound/feedback/hit_teammate.wav", qtrue ); + + cgs.media.redScoredSound = trap_S_RegisterSound( "sound/teamplay/voc_red_scores.wav", qtrue ); + cgs.media.blueScoredSound = trap_S_RegisterSound( "sound/teamplay/voc_blue_scores.wav", qtrue ); + + cgs.media.captureYourTeamSound = trap_S_RegisterSound( "sound/teamplay/flagcapture_yourteam.wav", qtrue ); + cgs.media.captureOpponentSound = trap_S_RegisterSound( "sound/teamplay/flagcapture_opponent.wav", qtrue ); + + cgs.media.returnYourTeamSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_yourteam.wav", qtrue ); + cgs.media.returnOpponentSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_opponent.wav", qtrue ); + + cgs.media.takenYourTeamSound = trap_S_RegisterSound( "sound/teamplay/flagtaken_yourteam.wav", qtrue ); + cgs.media.takenOpponentSound = trap_S_RegisterSound( "sound/teamplay/flagtaken_opponent.wav", qtrue ); + + if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) { + cgs.media.redFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/voc_red_returned.wav", qtrue ); + cgs.media.blueFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/voc_blue_returned.wav", qtrue ); + cgs.media.enemyTookYourFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_enemy_flag.wav", qtrue ); + cgs.media.yourTeamTookEnemyFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_team_flag.wav", qtrue ); + } + +#ifdef MISSIONPACK + if ( cgs.gametype == GT_1FCTF || cg_buildScript.integer ) { + // FIXME: get a replacement for this sound ? + cgs.media.neutralFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_opponent.wav", qtrue ); + cgs.media.yourTeamTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_team_1flag.wav", qtrue ); + cgs.media.enemyTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_enemy_1flag.wav", qtrue ); + } + + if ( cgs.gametype == GT_1FCTF || cgs.gametype == GT_CTF || cg_buildScript.integer ) { + cgs.media.youHaveFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_you_flag.wav", qtrue ); + cgs.media.holyShitSound = trap_S_RegisterSound("sound/feedback/voc_holyshit.wav", qtrue); + } + + if ( cgs.gametype == GT_OBELISK || cg_buildScript.integer ) { + cgs.media.yourBaseIsUnderAttackSound = trap_S_RegisterSound( "sound/teamplay/voc_base_attack.wav", qtrue ); + } +#else + cgs.media.youHaveFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_you_flag.wav", qtrue ); + cgs.media.holyShitSound = trap_S_RegisterSound("sound/feedback/voc_holyshit.wav", qtrue); + cgs.media.neutralFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_opponent.wav", qtrue ); + cgs.media.yourTeamTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_team_1flag.wav", qtrue ); + cgs.media.enemyTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_enemy_1flag.wav", qtrue ); +#endif + } + + cgs.media.tracerSound = trap_S_RegisterSound( "sound/weapons/machinegun/buletby1.wav", qfalse ); + cgs.media.selectSound = trap_S_RegisterSound( "sound/weapons/change.wav", qfalse ); + cgs.media.wearOffSound = trap_S_RegisterSound( "sound/items/wearoff.wav", qfalse ); + cgs.media.useNothingSound = trap_S_RegisterSound( "sound/items/use_nothing.wav", qfalse ); + cgs.media.gibSound = trap_S_RegisterSound( "sound/player/gibsplt1.wav", qfalse ); + cgs.media.gibBounce1Sound = trap_S_RegisterSound( "sound/player/gibimp1.wav", qfalse ); + cgs.media.gibBounce2Sound = trap_S_RegisterSound( "sound/player/gibimp2.wav", qfalse ); + cgs.media.gibBounce3Sound = trap_S_RegisterSound( "sound/player/gibimp3.wav", qfalse ); + +#ifdef MISSIONPACK + cgs.media.useInvulnerabilitySound = trap_S_RegisterSound( "sound/items/invul_activate.wav", qfalse ); + cgs.media.invulnerabilityImpactSound1 = trap_S_RegisterSound( "sound/items/invul_impact_01.wav", qfalse ); + cgs.media.invulnerabilityImpactSound2 = trap_S_RegisterSound( "sound/items/invul_impact_02.wav", qfalse ); + cgs.media.invulnerabilityImpactSound3 = trap_S_RegisterSound( "sound/items/invul_impact_03.wav", qfalse ); + cgs.media.invulnerabilityJuicedSound = trap_S_RegisterSound( "sound/items/invul_juiced.wav", qfalse ); + cgs.media.obeliskHitSound1 = trap_S_RegisterSound( "sound/items/obelisk_hit_01.wav", qfalse ); + cgs.media.obeliskHitSound2 = trap_S_RegisterSound( "sound/items/obelisk_hit_02.wav", qfalse ); + cgs.media.obeliskHitSound3 = trap_S_RegisterSound( "sound/items/obelisk_hit_03.wav", qfalse ); + cgs.media.obeliskRespawnSound = trap_S_RegisterSound( "sound/items/obelisk_respawn.wav", qfalse ); + + cgs.media.ammoregenSound = trap_S_RegisterSound("sound/items/cl_ammoregen.wav", qfalse); + cgs.media.doublerSound = trap_S_RegisterSound("sound/items/cl_doubler.wav", qfalse); + cgs.media.guardSound = trap_S_RegisterSound("sound/items/cl_guard.wav", qfalse); + cgs.media.scoutSound = trap_S_RegisterSound("sound/items/cl_scout.wav", qfalse); +#endif + + cgs.media.teleInSound = trap_S_RegisterSound( "sound/world/telein.wav", qfalse ); + cgs.media.teleOutSound = trap_S_RegisterSound( "sound/world/teleout.wav", qfalse ); + cgs.media.respawnSound = trap_S_RegisterSound( "sound/items/respawn1.wav", qfalse ); + + cgs.media.noAmmoSound = trap_S_RegisterSound( "sound/weapons/noammo.wav", qfalse ); + + cgs.media.talkSound = trap_S_RegisterSound( "sound/player/talk.wav", qfalse ); + cgs.media.landSound = trap_S_RegisterSound( "sound/player/land1.wav", qfalse); + + cgs.media.hitSound = trap_S_RegisterSound( "sound/feedback/hit.wav", qfalse ); +#ifdef MISSIONPACK + cgs.media.hitSoundHighArmor = trap_S_RegisterSound( "sound/feedback/hithi.wav", qfalse ); + cgs.media.hitSoundLowArmor = trap_S_RegisterSound( "sound/feedback/hitlo.wav", qfalse ); +#endif + + cgs.media.impressiveSound = trap_S_RegisterSound( "sound/feedback/impressive.wav", qtrue ); + cgs.media.excellentSound = trap_S_RegisterSound( "sound/feedback/excellent.wav", qtrue ); + cgs.media.deniedSound = trap_S_RegisterSound( "sound/feedback/denied.wav", qtrue ); + cgs.media.humiliationSound = trap_S_RegisterSound( "sound/feedback/humiliation.wav", qtrue ); + cgs.media.assistSound = trap_S_RegisterSound( "sound/feedback/assist.wav", qtrue ); + cgs.media.defendSound = trap_S_RegisterSound( "sound/feedback/defense.wav", qtrue ); +#ifdef MISSIONPACK + cgs.media.firstImpressiveSound = trap_S_RegisterSound( "sound/feedback/first_impressive.wav", qtrue ); + cgs.media.firstExcellentSound = trap_S_RegisterSound( "sound/feedback/first_excellent.wav", qtrue ); + cgs.media.firstHumiliationSound = trap_S_RegisterSound( "sound/feedback/first_gauntlet.wav", qtrue ); +#endif + + cgs.media.takenLeadSound = trap_S_RegisterSound( "sound/feedback/takenlead.wav", qtrue); + cgs.media.tiedLeadSound = trap_S_RegisterSound( "sound/feedback/tiedlead.wav", qtrue); + cgs.media.lostLeadSound = trap_S_RegisterSound( "sound/feedback/lostlead.wav", qtrue); + +#ifdef MISSIONPACK + cgs.media.voteNow = trap_S_RegisterSound( "sound/feedback/vote_now.wav", qtrue); + cgs.media.votePassed = trap_S_RegisterSound( "sound/feedback/vote_passed.wav", qtrue); + cgs.media.voteFailed = trap_S_RegisterSound( "sound/feedback/vote_failed.wav", qtrue); +#endif + + cgs.media.watrInSound = trap_S_RegisterSound( "sound/player/watr_in.wav", qfalse); + cgs.media.watrOutSound = trap_S_RegisterSound( "sound/player/watr_out.wav", qfalse); + cgs.media.watrUnSound = trap_S_RegisterSound( "sound/player/watr_un.wav", qfalse); + + cgs.media.jumpPadSound = trap_S_RegisterSound ("sound/world/jumppad.wav", qfalse ); + + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills + //PKMOD - Ergodic 09/03/00 updated Painkiller wav file with sounds from Mongusta + cgs.media.painkillerSound = trap_S_RegisterSound( "sound/feedback/PainkillerAward2.wav", qfalse ); + + + for (i=0 ; i<4 ; i++) { + Com_sprintf (name, sizeof(name), "sound/player/footsteps/step%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_NORMAL][i] = trap_S_RegisterSound (name, qfalse); + + Com_sprintf (name, sizeof(name), "sound/player/footsteps/boot%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_BOOT][i] = trap_S_RegisterSound (name, qfalse); + + Com_sprintf (name, sizeof(name), "sound/player/footsteps/flesh%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_FLESH][i] = trap_S_RegisterSound (name, qfalse); + + Com_sprintf (name, sizeof(name), "sound/player/footsteps/mech%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_MECH][i] = trap_S_RegisterSound (name, qfalse); + + Com_sprintf (name, sizeof(name), "sound/player/footsteps/energy%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_ENERGY][i] = trap_S_RegisterSound (name, qfalse); + + Com_sprintf (name, sizeof(name), "sound/player/footsteps/splash%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_SPLASH][i] = trap_S_RegisterSound (name, qfalse); + + Com_sprintf (name, sizeof(name), "sound/player/footsteps/clank%i.wav", i+1); + cgs.media.footsteps[FOOTSTEP_METAL][i] = trap_S_RegisterSound (name, qfalse); + } + + // only register the items that the server says we need + strcpy( items, CG_ConfigString( CS_ITEMS ) ); + + //PKMOD - Ergodic 07/30/01 - debug "bad magic" crash (inactive) +// Com_Printf( "CG_RegisterSounds - items>%s<\n\n", items ); +// Com_Printf( "CG_RegisterSounds - bg_numItems>%d<\n", bg_numItems ); + + for ( i = 1 ; i < bg_numItems ; i++ ) { +// if ( items[ i ] == '1' || cg_buildScript.integer ) { + CG_RegisterItemSounds( i ); +// } + } + + //PKMOD - Ergodic 07/30/01 - debug "bad magic" crash (inactive) +// if ( dbg1 != dbg2 ) +// return; + + for ( i = 1 ; i < MAX_SOUNDS ; i++ ) { + soundName = CG_ConfigString( CS_SOUNDS+i ); + if ( !soundName[0] ) { + break; + } + if ( soundName[0] == '*' ) { + continue; // custom sound + } + cgs.gameSounds[i] = trap_S_RegisterSound( soundName, qfalse ); + + //PKMOD - Ergodic 11/19/02 - debug mover sound (inactive) + //Com_Printf( "CG_RegisterSounds - soundindex: %d - name >%s<\n", i, &soundName[0] ); + + } + + // FIXME: only needed with item + cgs.media.flightSound = trap_S_RegisterSound( "sound/items/flight.wav", qfalse ); + cgs.media.medkitSound = trap_S_RegisterSound ("sound/items/use_medkit.wav", qfalse); + cgs.media.quadSound = trap_S_RegisterSound("sound/items/damage3.wav", qfalse); + cgs.media.sfx_ric1 = trap_S_RegisterSound ("sound/weapons/machinegun/ric1.wav", qfalse); + cgs.media.sfx_ric2 = trap_S_RegisterSound ("sound/weapons/machinegun/ric2.wav", qfalse); + cgs.media.sfx_ric3 = trap_S_RegisterSound ("sound/weapons/machinegun/ric3.wav", qfalse); + cgs.media.sfx_railg = trap_S_RegisterSound ("sound/weapons/railgun/railgf1a.wav", qfalse); + cgs.media.sfx_rockexp = trap_S_RegisterSound ("sound/weapons/rocket/rocklx1a.wav", qfalse); + cgs.media.sfx_plasmaexp = trap_S_RegisterSound ("sound/weapons/plasma/plasmx1a.wav", qfalse); +#ifdef MISSIONPACK + cgs.media.sfx_proxexp = trap_S_RegisterSound( "sound/weapons/proxmine/wstbexpl.wav" , qfalse); + cgs.media.sfx_nghit = trap_S_RegisterSound( "sound/weapons/nailgun/wnalimpd.wav" , qfalse); + cgs.media.sfx_nghitflesh = trap_S_RegisterSound( "sound/weapons/nailgun/wnalimpl.wav" , qfalse); + cgs.media.sfx_nghitmetal = trap_S_RegisterSound( "sound/weapons/nailgun/wnalimpm.wav", qfalse ); + cgs.media.sfx_chghit = trap_S_RegisterSound( "sound/weapons/vulcan/wvulimpd.wav", qfalse ); + cgs.media.sfx_chghitflesh = trap_S_RegisterSound( "sound/weapons/vulcan/wvulimpl.wav", qfalse ); + cgs.media.sfx_chghitmetal = trap_S_RegisterSound( "sound/weapons/vulcan/wvulimpm.wav", qfalse ); + cgs.media.weaponHoverSound = trap_S_RegisterSound( "sound/weapons/weapon_hover.wav", qfalse ); + cgs.media.kamikazeExplodeSound = trap_S_RegisterSound( "sound/items/kam_explode.wav", qfalse ); + cgs.media.kamikazeImplodeSound = trap_S_RegisterSound( "sound/items/kam_implode.wav", qfalse ); + cgs.media.kamikazeFarSound = trap_S_RegisterSound( "sound/items/kam_explode_far.wav", qfalse ); + cgs.media.winnerSound = trap_S_RegisterSound( "sound/feedback/voc_youwin.wav", qfalse ); + cgs.media.loserSound = trap_S_RegisterSound( "sound/feedback/voc_youlose.wav", qfalse ); + cgs.media.youSuckSound = trap_S_RegisterSound( "sound/misc/yousuck.wav", qfalse ); + + cgs.media.wstbimplSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpl.wav", qfalse); + cgs.media.wstbimpmSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpm.wav", qfalse); + cgs.media.wstbimpdSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpd.wav", qfalse); + cgs.media.wstbactvSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbactv.wav", qfalse); +#endif + + cgs.media.regenSound = trap_S_RegisterSound("sound/items/regen.wav", qfalse); + cgs.media.protectSound = trap_S_RegisterSound("sound/items/protect3.wav", qfalse); + cgs.media.n_healthSound = trap_S_RegisterSound("sound/items/n_health.wav", qfalse ); + cgs.media.hgrenb1aSound = trap_S_RegisterSound("sound/weapons/grenade/hgrenb1a.wav", qfalse); + cgs.media.hgrenb2aSound = trap_S_RegisterSound("sound/weapons/grenade/hgrenb2a.wav", qfalse); + +#ifdef MISSIONPACK + trap_S_RegisterSound("sound/player/james/death1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/death2.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/death3.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/jump1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/pain25_1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/pain75_1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/pain100_1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/falling1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/gasp.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/drown.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/fall1.wav", qfalse ); + trap_S_RegisterSound("sound/player/james/taunt.wav", qfalse ); + + trap_S_RegisterSound("sound/player/janet/death1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/death2.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/death3.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/jump1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/pain25_1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/pain75_1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/pain100_1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/falling1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/gasp.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/drown.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/fall1.wav", qfalse ); + trap_S_RegisterSound("sound/player/janet/taunt.wav", qfalse ); +#endif + //PKMOD - Ergodic 12/19/00 - remove Team Arena proxmine sounds +// cgs.media.wstbimplSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpl.wav", qfalse); +// cgs.media.wstbimpmSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpm.wav", qfalse); +// cgs.media.wstbimpdSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpd.wav", qfalse); +// cgs.media.wstbactvSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbactv.wav", qfalse); + + //PKMOD - Ergodic 05/22/00 add pka sounds + //12/16/00 - add non compressed flag + cgs.media.sfx_pkagravitylaunched = trap_S_RegisterSound ("sound/weapons2/gwell/gravity_released.wav", qfalse); + cgs.media.sfx_pkabeartrapbreakup = trap_S_RegisterSound ("sound/weapons2/beartrap/beartrap_breakup.wav", qfalse); + cgs.media.sfx_pkabeartrapdrop = trap_S_RegisterSound ("sound/weapons2/beartrap/beartrap_drop.wav", qfalse); + cgs.media.sfx_pkabeartrapsnap = trap_S_RegisterSound ("sound/weapons2/beartrap/beartrap_snap.wav", qfalse); + + //PKMOD - Ergodic 03/23/01 - add team parameters + cgs.media.pkabeartrap_red = trap_R_RegisterModel( "models/weapons2/beartrap/beartrap_red.md3" ); + cgs.media.pkabeartrap_blue = trap_R_RegisterModel( "models/weapons2/beartrap/beartrap_blue.md3" ); + + //PKMOD - Ergodic 08/22/00 ChainLightning strike sounds + //12/16/00 - add non compressed flag + cgs.media.sfx_chainlightningstrike1 = trap_S_RegisterSound( "sound/weapons2/chainlightning/Chainlight spark.wav", qfalse ); + cgs.media.sfx_chainlightningstrike2 = trap_S_RegisterSound( "sound/weapons2/chainlightning/Chainlight spark#2.wav", qfalse ); + + //PKMOD - Ergodic 08/25/00 nailgun ricochet sounds + //12/16/00 - add non compressed flag + cgs.media.sfx_nailrico1 = trap_S_RegisterSound ("sound/weapons2/nailgun/nailrico1.wav", qfalse); + cgs.media.sfx_nailrico2 = trap_S_RegisterSound ("sound/weapons2/nailgun/nailrico2.wav", qfalse); + cgs.media.sfx_nailrico3 = trap_S_RegisterSound ("sound/weapons2/nailgun/nailrico3.wav", qfalse); + cgs.media.sfx_nailrico4 = trap_S_RegisterSound ("sound/weapons2/nailgun/nailrico4.wav", qfalse); + + //PKMOD - Ergodic 09/06/00 gravity well item suck sounds from Mongusta + //12/16/00 - add non compressed flag + cgs.media.sfx_pkagravitywell_suck1 = trap_S_RegisterSound ("sound/weapons2/gwell/Grav Well Suk#1.wav", qfalse); + cgs.media.sfx_pkagravitywell_suck2 = trap_S_RegisterSound ("sound/weapons2/gwell/Grav Well Suk#2.wav", qfalse); + cgs.media.sfx_pkagravitywell_suck3 = trap_S_RegisterSound ("sound/weapons2/gwell/Grav Well Suk#3.wav", qfalse); + + //PKMOD - Ergodic 11/22/00 autosentry sounds from Mongusta + //12/16/00 - add non compressed flag + cgs.media.sfx_pkasentrydrop = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentrydeploy.wav", qfalse); + + //PKMOD - Ergodic 12/26/00 add beans fart sounds + cgs.media.sfx_pkafart1 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Blast.wav", qfalse); + cgs.media.sfx_pkafart2 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Short.wav", qfalse); + cgs.media.sfx_pkafart3 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Squish.wav", qfalse); + cgs.media.sfx_pkafart4 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Whistle.wav", qfalse); + cgs.media.sfx_pkafart5 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Whooppee.wav", qfalse); + //PKMOD - Ergodic 06/30/01 add two more fart sounds from original Q1 PK + cgs.media.sfx_pkafart6 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Q1PK_4.wav", qfalse); + cgs.media.sfx_pkafart7 = trap_S_RegisterSound ("sound/weapons2/beans/Fart Q1PK_5.wav", qfalse); + + //PKMOD - Ergodic 01/13/01 - add autosentry fire sounds from mongusta + cgs.media.sfx_pkasentry1 = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentryshot1.wav", qfalse); + cgs.media.sfx_pkasentry2 = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentryshot2.wav", qfalse); + cgs.media.sfx_pkasentry3 = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentryshot3.wav", qfalse); + + //PKMOD - Ergodic 03/26/01 - autosentry sonar ping sounds + cgs.media.sfx_pkasentry_ping1 = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentryping1.wav", qfalse); + cgs.media.sfx_pkasentry_ping2 = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentryping2.wav", qfalse); + cgs.media.sfx_pkasentry_ping3 = trap_S_RegisterSound ("sound/weapons2/autosentry/autosentryping3.wav", qfalse); + + //PKMOD - Ergodic 06/20/01 - add legs model for swinging zombie + cgs.media.pkazombie_legsModel = trap_R_RegisterModel( "models/players/biker/lower.md3" ); + cgs.media.pkazombie_legsSkin = trap_R_RegisterSkin( "models/mapobjects/zombie/lower_zombie.skin" ); + + //PKMOD - Ergodic 06/21/01 - add torso model for swinging zombie + cgs.media.pkazombie_torsoModel = trap_R_RegisterModel( "models/players/biker/upper.md3" ); + cgs.media.pkazombie_torsoSkin = trap_R_RegisterSkin( "models/mapobjects/zombie/upper_zombie.skin" ); + + //PKMOD - Ergodic 06/21/01 - add head model for swinging zombie + cgs.media.pkazombie_headModel = trap_R_RegisterModel( "models/players/biker/head.md3" ); + cgs.media.pkazombie_headSkin = trap_R_RegisterSkin( "models/mapobjects/zombie/head_zombie.skin" ); + + //PKMOD - Ergodic 06/30/01 add airfist sounds for all types of situations + cgs.media.sfx_pkaairfistfire = trap_S_RegisterSound ("sound/weapons2/airfist/af_fire.wav", qfalse); + cgs.media.sfx_pkaairfistwaterfire = trap_S_RegisterSound ("sound/weapons2/airfist/af_wfire.wav", qfalse); + cgs.media.sfx_pkaairfistempty = trap_S_RegisterSound ("sound/weapons2/airfist/af_empty.wav", qfalse); + cgs.media.sfx_pkaairfistwaterempty = trap_S_RegisterSound ("sound/weapons2/airfist/af_wempty.wav", qfalse); + + //PKMOD - Ergodic 07/03/01 ChainLightning reflect sounds + cgs.media.sfx_chainlightningreflect1 = trap_S_RegisterSound( "sound/weapons2/chainlightning/Electricute2.wav", qfalse ); + cgs.media.sfx_chainlightningreflect2 = trap_S_RegisterSound( "sound/weapons2/chainlightning/Electricute3.wav", qfalse ); + + //PKMOD - Ergodic 12/03/01 - New Holdables - Private Bot pickup skins + cgs.media.privatebot_legsSkin = trap_R_RegisterSkin( "models/players/tankjr/lower_default.skin" ); + cgs.media.privatebot_torsoSkin = trap_R_RegisterSkin( "models/players/doom/upper_phobos.skin" ); + cgs.media.privatebot_headSkin = trap_R_RegisterSkin( "models/players/visor/head_painkiller.skin" ); + + //PKMOD - Ergodic 12/05/01 - Holdable: radiate sounds + cgs.media.pkaradiatewarningSound = trap_S_RegisterSound( "sound/items/radiatewarning.wav", qfalse ); + cgs.media.pkaradiateitemSound = trap_S_RegisterSound( "sound/items/radiateitem.wav", qfalse ); + cgs.media.pkaradiateplayerSound = trap_S_RegisterSound( "sound/items/radiateplayer.wav", qfalse ); + //PKMOD - Ergodic 08/02/02 - Holdable: radiate activation sound + cgs.media.pkaradiateactivationSound = trap_S_RegisterSound( "sound/items/radiateroar.wav", qfalse ); + + //PKMOD - Ergodic 12/07/01 - Holdable: Private Bot HUD Icons + cgs.media.pkapribot_001Icon = trap_R_RegisterShader( "icons/iconh_pribot_001" ); + cgs.media.pkapribot_010Icon = trap_R_RegisterShader( "icons/iconh_pribot_010" ); + cgs.media.pkapribot_011Icon = trap_R_RegisterShader( "icons/iconh_pribot_011" ); + cgs.media.pkapribot_100Icon = trap_R_RegisterShader( "icons/iconh_pribot_100" ); + cgs.media.pkapribot_101Icon = trap_R_RegisterShader( "icons/iconh_pribot_101" ); + cgs.media.pkapribot_110Icon = trap_R_RegisterShader( "icons/iconh_pribot_110" ); + cgs.media.pkapribot_111Icon = trap_R_RegisterShader( "icons/iconh_pribot_111" ); + + //PKMOD - Ergodic 12/16/01 - add new model for repositioned deployed gauntlet blade +// cgs.media.pkagauntlet_bladeModel = trap_R_RegisterModel( "models/weapons2/gauntlet/gauntlet_blade.md3" ); + + //PKMOD - Ergodic 02/06/02 - add attack sounds for beartrap and autosentry + cgs.media.beartrap_attackSound = trap_S_RegisterSound( "sound/feedback/attack_Trap.wav", qfalse ); + cgs.media.autosentry_attackSound = trap_S_RegisterSound( "sound/feedback/attack_Sentry.wav", qfalse ); + cgs.media.radiate_attackSound = trap_S_RegisterSound( "sound/feedback/attack_Radiate.wav", qfalse ); + + //PKMOD - Ergodic 02/07/02 - add Private Bot completed sound + cgs.media.pkapribot_complete = trap_S_RegisterSound( "sound/items/unit_complete.wav", qfalse ); + + //PKMOD - Ergodic 02/10/02 - send FRAG message to Private Bot's owner + cgs.media.pkapribot_frag1 = trap_S_RegisterSound( "sound/feedback/PB_frag_obtained.wav", qfalse ); + cgs.media.pkapribot_frag2 = trap_S_RegisterSound( "sound/feedback/PB_opposition_eliminated.wav", qfalse ); + + //PKMOD - Ergodic 02/14/02 - explosive shells hit sounds + cgs.media.sfx_expgunhit1 = trap_S_RegisterSound ("sound/weapons2/expgun/ESG_Hits1.wav", qfalse); + cgs.media.sfx_expgunhit2 = trap_S_RegisterSound ("sound/weapons2/expgun/ESG_Hits2.wav", qfalse); + cgs.media.sfx_expgunhit3 = trap_S_RegisterSound ("sound/weapons2/expgun/ESG_Hits3.wav", qfalse); + //PKMOD - Ergodic 07/10/02 - add 2 more explosive shells hit sounds + cgs.media.sfx_expgunhit4 = trap_S_RegisterSound ("sound/weapons2/expgun/ESG_Hits4.wav", qfalse); + cgs.media.sfx_expgunhit5 = trap_S_RegisterSound ("sound/weapons2/expgun/ESG_Hits5.wav", qfalse); + + //PKMOD - Ergodic 08/02/02 - Holdable: Personal Sentry hover sound + cgs.media.pkapersentryhoverSound = trap_S_RegisterSound( "sound/items/persentryhover.wav", qfalse ); + + //PKMOD - Ergodic 08/26/02 - add Personal Sentry fire sounds from StarDagger + cgs.media.pkapersentry_fire1 = trap_S_RegisterSound ("sound/weapons2/persentry/PersSentryshot1.wav", qfalse); + cgs.media.pkapersentry_fire2 = trap_S_RegisterSound ("sound/weapons2/persentry/PersSentryshot2.wav", qfalse); + cgs.media.pkapersentry_fire3 = trap_S_RegisterSound ("sound/weapons2/persentry/PersSentryshot3.wav", qfalse); + + //PKMOD - Ergodic 08/20/03 - add special shader for shooter lightning + cgs.media.shooterlightningShader = trap_R_RegisterShader( "shooterlightningBolt" ); + + //PKMOD - Ergodic 11/21/03 - Earthquake sound for Gravity Well effect on out of reach players + //PKMOD - Ergodic 12/06/03 - update Earthquake sound for Gravity Well effect on out of reach players + //PKMOD - Ergodic 12/07/03 - removed, code moved to global sound + //cgs.media.pkaearthquake = trap_S_RegisterSound( "sound/weapons2/gwell/earthquake3.wav", qfalse ); + + //PKMOD - Ergodic 12/08/03 - Add chargeup sound for BearTrap, Autosentry invisibility + cgs.media.pkachargeup = trap_S_RegisterSound( "sound/weapons/lightning/lg_charge.wav", qfalse ); + + //PKMOD - Ergodic 03/17/04 - add quad beans fart sounds + cgs.media.sfx_pkaquadfart1 = trap_S_RegisterSound ("sound/weapons2/beans/QFart_Boom1.wav", qfalse); + cgs.media.sfx_pkaquadfart2 = trap_S_RegisterSound ("sound/weapons2/beans/QFart_Duck1.wav", qfalse); + cgs.media.sfx_pkaquadfart3 = trap_S_RegisterSound ("sound/weapons2/beans/QFart_Frog1.wav", qfalse); + + +} + + +//=================================================================================== + + +/* +================= +CG_RegisterGraphics + +This function may execute for a couple of minutes with a slow disk. +================= +*/ +static void CG_RegisterGraphics( void ) { + int i; + char items[MAX_ITEMS+1]; + static char *sb_nums[11] = { + "gfx/2d/numbers/zero_32b", + "gfx/2d/numbers/one_32b", + "gfx/2d/numbers/two_32b", + "gfx/2d/numbers/three_32b", + "gfx/2d/numbers/four_32b", + "gfx/2d/numbers/five_32b", + "gfx/2d/numbers/six_32b", + "gfx/2d/numbers/seven_32b", + "gfx/2d/numbers/eight_32b", + "gfx/2d/numbers/nine_32b", + "gfx/2d/numbers/minus_32b", + }; + + // clear any references to old media + memset( &cg.refdef, 0, sizeof( cg.refdef ) ); + trap_R_ClearScene(); + + CG_LoadingString( cgs.mapname ); + + trap_R_LoadWorldMap( cgs.mapname ); + + // precache status bar pics + CG_LoadingString( "game media" ); + + for ( i=0 ; i<11 ; i++) { + cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] ); + } + + cgs.media.botSkillShaders[0] = trap_R_RegisterShader( "menu/art/skill1.tga" ); + cgs.media.botSkillShaders[1] = trap_R_RegisterShader( "menu/art/skill2.tga" ); + cgs.media.botSkillShaders[2] = trap_R_RegisterShader( "menu/art/skill3.tga" ); + cgs.media.botSkillShaders[3] = trap_R_RegisterShader( "menu/art/skill4.tga" ); + cgs.media.botSkillShaders[4] = trap_R_RegisterShader( "menu/art/skill5.tga" ); + + cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" ); + + cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" ); + + cgs.media.scoreboardName = trap_R_RegisterShaderNoMip( "menu/tab/name.tga" ); + cgs.media.scoreboardPing = trap_R_RegisterShaderNoMip( "menu/tab/ping.tga" ); + cgs.media.scoreboardScore = trap_R_RegisterShaderNoMip( "menu/tab/score.tga" ); + cgs.media.scoreboardTime = trap_R_RegisterShaderNoMip( "menu/tab/time.tga" ); + + cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" ); + cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" ); + cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" ); +#ifdef MISSIONPACK + cgs.media.nailPuffShader = trap_R_RegisterShader( "nailtrail" ); + cgs.media.blueProxMine = trap_R_RegisterModel( "models/weaphits/proxmineb.md3" ); +#endif + cgs.media.plasmaBallShader = trap_R_RegisterShader( "sprites/plasma1" ); + cgs.media.bloodTrailShader = trap_R_RegisterShader( "bloodTrail" ); + cgs.media.lagometerShader = trap_R_RegisterShader("lagometer" ); + cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" ); + + cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" ); + + cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" ); + cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" ); + + for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) { + cgs.media.crosshairShader[i] = trap_R_RegisterShader( va("gfx/2d/crosshair%c", 'a'+i) ); + } + + cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" ); + cgs.media.noammoShader = trap_R_RegisterShader( "icons/noammo" ); + + // powerup shaders + cgs.media.quadShader = trap_R_RegisterShader("powerups/quad" ); + cgs.media.quadWeaponShader = trap_R_RegisterShader("powerups/quadWeapon" ); + cgs.media.battleSuitShader = trap_R_RegisterShader("powerups/battleSuit" ); + cgs.media.battleWeaponShader = trap_R_RegisterShader("powerups/battleWeapon" ); + cgs.media.invisShader = trap_R_RegisterShader("powerups/invisibility" ); + cgs.media.regenShader = trap_R_RegisterShader("powerups/regen" ); + cgs.media.hastePuffShader = trap_R_RegisterShader("hasteSmokePuff" ); + +#ifdef MISSIONPACK + if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF || cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) { +#else + if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) { +#endif + cgs.media.redCubeModel = trap_R_RegisterModel( "models/powerups/orb/r_orb.md3" ); + cgs.media.blueCubeModel = trap_R_RegisterModel( "models/powerups/orb/b_orb.md3" ); + cgs.media.redCubeIcon = trap_R_RegisterShader( "icons/skull_red" ); + cgs.media.blueCubeIcon = trap_R_RegisterShader( "icons/skull_blue" ); + } + +#ifdef MISSIONPACK + if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF || cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) { +#else + if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) { +#endif + cgs.media.redFlagModel = trap_R_RegisterModel( "models/flags/r_flag.md3" ); + cgs.media.blueFlagModel = trap_R_RegisterModel( "models/flags/b_flag.md3" ); + cgs.media.redFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_red1" ); + cgs.media.redFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_red2" ); + cgs.media.redFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_red3" ); + cgs.media.blueFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_blu1" ); + cgs.media.blueFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_blu2" ); + cgs.media.blueFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_blu3" ); +#ifdef MISSIONPACK + cgs.media.flagPoleModel = trap_R_RegisterModel( "models/flag2/flagpole.md3" ); + cgs.media.flagFlapModel = trap_R_RegisterModel( "models/flag2/flagflap3.md3" ); + + cgs.media.redFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/red.skin" ); + cgs.media.blueFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/blue.skin" ); + cgs.media.neutralFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/white.skin" ); + + cgs.media.redFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/red_base.md3" ); + cgs.media.blueFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/blue_base.md3" ); + cgs.media.neutralFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/ntrl_base.md3" ); +#endif + } + +#ifdef MISSIONPACK + if ( cgs.gametype == GT_1FCTF || cg_buildScript.integer ) { + cgs.media.neutralFlagModel = trap_R_RegisterModel( "models/flags/n_flag.md3" ); + cgs.media.flagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_neutral1" ); + cgs.media.flagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_red2" ); + cgs.media.flagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_blu2" ); + cgs.media.flagShader[3] = trap_R_RegisterShaderNoMip( "icons/iconf_neutral3" ); + } + + if ( cgs.gametype == GT_OBELISK || cg_buildScript.integer ) { + cgs.media.overloadBaseModel = trap_R_RegisterModel( "models/powerups/overload_base.md3" ); + cgs.media.overloadTargetModel = trap_R_RegisterModel( "models/powerups/overload_target.md3" ); + cgs.media.overloadLightsModel = trap_R_RegisterModel( "models/powerups/overload_lights.md3" ); + cgs.media.overloadEnergyModel = trap_R_RegisterModel( "models/powerups/overload_energy.md3" ); + } + + if ( cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) { + cgs.media.harvesterModel = trap_R_RegisterModel( "models/powerups/harvester/harvester.md3" ); + cgs.media.harvesterRedSkin = trap_R_RegisterSkin( "models/powerups/harvester/red.skin" ); + cgs.media.harvesterBlueSkin = trap_R_RegisterSkin( "models/powerups/harvester/blue.skin" ); + cgs.media.harvesterNeutralModel = trap_R_RegisterModel( "models/powerups/obelisk/obelisk.md3" ); + } + + cgs.media.redKamikazeShader = trap_R_RegisterShader( "models/weaphits/kamikred" ); + cgs.media.dustPuffShader = trap_R_RegisterShader("hasteSmokePuff" ); +#endif + + if ( cgs.gametype >= GT_TEAM || cg_buildScript.integer ) { + cgs.media.friendShader = trap_R_RegisterShader( "sprites/foe" ); + cgs.media.redQuadShader = trap_R_RegisterShader("powerups/blueflag" ); + cgs.media.teamStatusBar = trap_R_RegisterShader( "gfx/2d/colorbar.tga" ); +#ifdef MISSIONPACK + cgs.media.blueKamikazeShader = trap_R_RegisterShader( "models/weaphits/kamikblu" ); +#endif + } + + cgs.media.armorModel = trap_R_RegisterModel( "models/powerups/armor/armor_yel.md3" ); + cgs.media.armorIcon = trap_R_RegisterShaderNoMip( "icons/iconr_yellow" ); + + cgs.media.machinegunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" ); + cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); + + cgs.media.gibAbdomen = trap_R_RegisterModel( "models/gibs/abdomen.md3" ); + cgs.media.gibArm = trap_R_RegisterModel( "models/gibs/arm.md3" ); + cgs.media.gibChest = trap_R_RegisterModel( "models/gibs/chest.md3" ); + cgs.media.gibFist = trap_R_RegisterModel( "models/gibs/fist.md3" ); + cgs.media.gibFoot = trap_R_RegisterModel( "models/gibs/foot.md3" ); + cgs.media.gibForearm = trap_R_RegisterModel( "models/gibs/forearm.md3" ); + cgs.media.gibIntestine = trap_R_RegisterModel( "models/gibs/intestine.md3" ); + cgs.media.gibLeg = trap_R_RegisterModel( "models/gibs/leg.md3" ); + cgs.media.gibSkull = trap_R_RegisterModel( "models/gibs/skull.md3" ); + cgs.media.gibBrain = trap_R_RegisterModel( "models/gibs/brain.md3" ); + + cgs.media.smoke2 = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); + + cgs.media.balloonShader = trap_R_RegisterShader( "sprites/balloon3" ); + + cgs.media.bloodExplosionShader = trap_R_RegisterShader( "bloodExplosion" ); + + cgs.media.bulletFlashModel = trap_R_RegisterModel("models/weaphits/bullet.md3"); + cgs.media.ringFlashModel = trap_R_RegisterModel("models/weaphits/ring02.md3"); + cgs.media.dishFlashModel = trap_R_RegisterModel("models/weaphits/boom01.md3"); +#ifdef MISSIONPACK + cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/powerups/pop.md3" ); +#else + cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/misc/telep.md3" ); + cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" ); +#endif +#ifdef MISSIONPACK + cgs.media.kamikazeEffectModel = trap_R_RegisterModel( "models/weaphits/kamboom2.md3" ); + cgs.media.kamikazeShockWave = trap_R_RegisterModel( "models/weaphits/kamwave.md3" ); + cgs.media.kamikazeHeadModel = trap_R_RegisterModel( "models/powerups/kamikazi.md3" ); + cgs.media.kamikazeHeadTrail = trap_R_RegisterModel( "models/powerups/trailtest.md3" ); + cgs.media.guardPowerupModel = trap_R_RegisterModel( "models/powerups/guard_player.md3" ); + cgs.media.scoutPowerupModel = trap_R_RegisterModel( "models/powerups/scout_player.md3" ); + cgs.media.doublerPowerupModel = trap_R_RegisterModel( "models/powerups/doubler_player.md3" ); + cgs.media.ammoRegenPowerupModel = trap_R_RegisterModel( "models/powerups/ammo_player.md3" ); + cgs.media.invulnerabilityImpactModel = trap_R_RegisterModel( "models/powerups/shield/impact.md3" ); + cgs.media.invulnerabilityJuicedModel = trap_R_RegisterModel( "models/powerups/shield/juicer.md3" ); + cgs.media.medkitUsageModel = trap_R_RegisterModel( "models/powerups/regen.md3" ); + cgs.media.heartShader = trap_R_RegisterShaderNoMip( "ui/assets/statusbar/selectedhealth.tga" ); + +#endif + + cgs.media.invulnerabilityPowerupModel = trap_R_RegisterModel( "models/powerups/shield/shield.md3" ); + cgs.media.medalImpressive = trap_R_RegisterShaderNoMip( "medal_impressive" ); + cgs.media.medalExcellent = trap_R_RegisterShaderNoMip( "medal_excellent" ); + cgs.media.medalGauntlet = trap_R_RegisterShaderNoMip( "medal_gauntlet" ); + cgs.media.medalDefend = trap_R_RegisterShaderNoMip( "medal_defend" ); + cgs.media.medalAssist = trap_R_RegisterShaderNoMip( "medal_assist" ); + cgs.media.medalCapture = trap_R_RegisterShaderNoMip( "medal_capture" ); + + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills + cgs.media.medalPainKiller = trap_R_RegisterShaderNoMip( "medal_painkiller" ); + + //PKMOD - Ergodic 08/22/00 ChainLightning Gun player hit shader effect + cgs.media.clgplayerhitShader = trap_R_RegisterShader("models/weaphits/clgplayerhit" ); + + //PKMOD - Ergodic 11/12/00 airfist flash model shader + cgs.media.airfistFlashShader = trap_R_RegisterShader("models/weapons2/airfist/airfist_flash" ); + + //PKMOD - Ergodic 11/16/00 update airfist flash model to correspond to airfist_level + cgs.media.airfist4FlashModel = trap_R_RegisterModel( "models/weapons2/airfist/airfist4_flash.md3" ); + cgs.media.airfist3FlashModel = trap_R_RegisterModel( "models/weapons2/airfist/airfist3_flash.md3" ); + cgs.media.airfist2FlashModel = trap_R_RegisterModel( "models/weapons2/airfist/airfist2_flash.md3" ); + cgs.media.airfist1FlashModel = trap_R_RegisterModel( "models/weapons2/airfist/airfist1_flash.md3" ); + cgs.media.airfist0FlashModel = trap_R_RegisterModel( "models/weapons2/airfist/airfist0_flash.md3" ); + + //PKMOD - Ergodic 12/27/00 add beans shader + cgs.media.pkafartPuffShader = trap_R_RegisterShader( "pkafartPuff" ); + + //PKMOD - Ergodic 12/28/00 add flash model for autosentry (same as machinegun) + cgs.media.autosentryFlashModel = trap_R_RegisterModel( "models/weapons2/machinegun/machinegun_flash.md3" ); + + //PKMOD - Ergodic 01/16/01 - add model for exploding shells weaponhit + cgs.media.explshellsFlashModel = trap_R_RegisterModel("models/weaphits/explboom/explboom.md3"); + + //PKMOD - Ergodic 01/16/01 - add multi-shaders for exploding shells + cgs.media.shellsExplosionShader1 = trap_R_RegisterShader("shellsexplosion1" ); + cgs.media.shellsExplosionShader2 = trap_R_RegisterShader("shellsexplosion2" ); + cgs.media.shellsExplosionShader3 = trap_R_RegisterShader("shellsexplosion3" ); + cgs.media.shellsExplosionShader4 = trap_R_RegisterShader("shellsexplosion4" ); + cgs.media.shellsExplosionShader5 = trap_R_RegisterShader("shellsexplosion5" ); + cgs.media.shellsExplosionShader6 = trap_R_RegisterShader("shellsexplosion6" ); + + //PKMOD - Ergodic 01/21/01 - add coordinate model for exploding shells debug + cgs.media.coordFlashModel = trap_R_RegisterModel("models/weapons2/explgun/coord.md3"); + + //PKMOD - Ergodic 04/06/01 - add autosentry missile sprite + cgs.media.autosentryBallShader = trap_R_RegisterShader( "sprites/autosentry/missile1" ); + + //PKMOD - Ergodic 10/14/01 - add shaders for radiation holdable spark effect + cgs.media.radiate1Shader = trap_R_RegisterShader( "radiate1Spark" ); + cgs.media.radiate2Shader = trap_R_RegisterShader( "radiate2Spark" ); + cgs.media.radiate3Shader = trap_R_RegisterShader( "radiate3Spark" ); + cgs.media.radiate4Shader = trap_R_RegisterShader( "radiate4Spark" ); + cgs.media.radiate5Shader = trap_R_RegisterShader( "radiate5Spark" ); + cgs.media.radiate6Shader = trap_R_RegisterShader( "radiate6Spark" ); + + //PKMOD - Ergodic 11/17/01 - add icons for simple items that are radiatedt + cgs.media.radiate1SimpleIcon = trap_R_RegisterShader( "radiate1SimpleIcon" ); + cgs.media.radiate2SimpleIcon = trap_R_RegisterShader( "radiate2SimpleIcon" ); + cgs.media.radiate3SimpleIcon = trap_R_RegisterShader( "radiate3SimpleIcon" ); + + //PKMOD - Ergodic 11/27/01 - add radition trail for infected players + cgs.media.radiationTrailShader = trap_R_RegisterShader( "radiationTrail" ); + + //PKMOD - Ergodic 05/07/02 - add active personal sentry model + cgs.media.persentry_active = trap_R_RegisterModel("models/powerups/holdable/persentry_active.md3"); + + //PKMOD - Ergodic 06/08/02 - add personal sentry teleport model + cgs.media.persentry_teleportEffectModel = trap_R_RegisterModel( "models/powerups/holdable/persentry_tele.md3" ); + + //PKMOD - Ergodic 06/12/02 - add personal sentry missile shader + cgs.media.personalsentryBallShader = trap_R_RegisterShader( "sprites/personalsentry/missile1" ); + + //PKMOD - Ergodic 09/11/02 - add private bot field effect + cgs.media.privatebot_CueModel = trap_R_RegisterModel( "models/powerups/holdable/pbcue.md3" ); + + + memset( cg_items, 0, sizeof( cg_items ) ); + memset( cg_weapons, 0, sizeof( cg_weapons ) ); + + // only register the items that the server says we need + strcpy( items, CG_ConfigString( CS_ITEMS) ); + + for ( i = 1 ; i < bg_numItems ; i++ ) { + if ( items[ i ] == '1' || cg_buildScript.integer ) { + CG_LoadingItem( i ); + CG_RegisterItemVisuals( i ); + } + } + + //PKMOD - Ergodic 05/11/01 - register holdables into their own array + // for optimization purposes + for ( i = 0 ; i < bg_numItems ; i++ ) { + if ( bg_itemlist[i].giType == IT_HOLDABLE ) { + if ( bg_itemlist[i].giTag < HI_NUM_HOLDABLE ) { + cg_holdable[ bg_itemlist[i].giTag ] = i; + } + else { + Com_Error( ERR_DROP, "HOLDABLE array index has been exceeded: %d at offset %d\n", bg_itemlist[i].giTag, i); + } + } + } + + // wall marks + cgs.media.bulletMarkShader = trap_R_RegisterShader( "gfx/damage/bullet_mrk" ); + cgs.media.burnMarkShader = trap_R_RegisterShader( "gfx/damage/burn_med_mrk" ); + cgs.media.holeMarkShader = trap_R_RegisterShader( "gfx/damage/hole_lg_mrk" ); + cgs.media.energyMarkShader = trap_R_RegisterShader( "gfx/damage/plasma_mrk" ); + cgs.media.shadowMarkShader = trap_R_RegisterShader( "markShadow" ); + cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" ); + cgs.media.bloodMarkShader = trap_R_RegisterShader( "bloodMark" ); + + // register the inline models + cgs.numInlineModels = trap_CM_NumInlineModels(); + for ( i = 1 ; i < cgs.numInlineModels ; i++ ) { + char name[10]; + vec3_t mins, maxs; + int j; + + Com_sprintf( name, sizeof(name), "*%i", i ); + cgs.inlineDrawModel[i] = trap_R_RegisterModel( name ); + trap_R_ModelBounds( cgs.inlineDrawModel[i], mins, maxs ); + for ( j = 0 ; j < 3 ; j++ ) { + cgs.inlineModelMidpoints[i][j] = mins[j] + 0.5 * ( maxs[j] - mins[j] ); + } + } + + // register all the server specified models + for (i=1 ; i= MAX_CONFIGSTRINGS ) { + CG_Error( "CG_ConfigString: bad index: %i", index ); + } + return cgs.gameState.stringData + cgs.gameState.stringOffsets[ index ]; +} + +//================================================================== + +//PKMOD - Ergodic 10/13/00 - add alternate music to hub +/* +====================== +CG_StartPostVoteMusic + +====================== +*/ +void CG_StartPostVoteMusic( const char *postvotemusic ) { + char *s; + char parm1[MAX_QPATH], parm2[MAX_QPATH]; + + //PKMOD - Ergodic 10/14/00 - debug inactive +// Com_Printf( "CG_StartPostVoteMusic - initiating\n" ); + + + //PKMOD - Ergodic 10/14/00 - only do alternate music if player has voted +// if ( cg.snap->ps.persistant[PERS_HUB_FLAG] != 1 ) +// return; + //PKMOD - Ergodic 12/16/00 - change PERS_HUB_FLAG to be first bit of PERS_PAINKILLER_COUNT + if ( !( cg.snap->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) ) { + return; + } + + + //PKMOD - Ergodic 10/14/00 - debug inactive +// Com_Printf( "CG_StartPostVoteMusic - setting music\n" ); + + // start the background music +// s = (char *)CG_ConfigString( CS_POSTVOTE_MUSIC ); +// s = (char *)CG_ConfigString( CS_MUSIC ); + + s = (char *)postvotemusic; + + //PKMOD - Ergodic 10/14/00 - debug inactive +// Com_Printf( "CG_StartPostVoteMusic - setting music>%s<\n", s ); + + Q_strncpyz( parm1, COM_Parse( &s ), sizeof( parm1 ) ); + Q_strncpyz( parm2, COM_Parse( &s ), sizeof( parm2 ) ); + + trap_S_StartBackgroundTrack( parm1, parm2 ); +} + +/* +====================== +CG_StartMusic + +====================== +*/ +void CG_StartMusic( void ) { + char *s; + char parm1[MAX_QPATH], parm2[MAX_QPATH]; + + // start the background music + s = (char *)CG_ConfigString( CS_MUSIC ); + Q_strncpyz( parm1, COM_Parse( &s ), sizeof( parm1 ) ); + Q_strncpyz( parm2, COM_Parse( &s ), sizeof( parm2 ) ); + + trap_S_StartBackgroundTrack( parm1, parm2 ); +} +//PKMOD - Ergodic 01/17/04 - enable HUD code in PKA 3.0 +//#ifdef MISSIONPACK +char *CG_GetMenuBuffer(const char *filename) { + int len; + fileHandle_t f; + static char buf[MAX_MENUFILE]; + + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + if ( !f ) { + trap_Print( va( S_COLOR_RED "menu file not found: %s, using default\n", filename ) ); + return NULL; + } + if ( len >= MAX_MENUFILE ) { + trap_Print( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", filename, len, MAX_MENUFILE ) ); + trap_FS_FCloseFile( f ); + return NULL; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + return buf; +} + +// +// ============================== +// new hud stuff ( mission pack ) +// ============================== +// +qboolean CG_Asset_Parse(int handle) { + pc_token_t token; + const char *tempStr; + + if (!trap_PC_ReadToken(handle, &token)) + return qfalse; + if (Q_stricmp(token.string, "{") != 0) { + return qfalse; + } + + while ( 1 ) { + if (!trap_PC_ReadToken(handle, &token)) + return qfalse; + + if (Q_stricmp(token.string, "}") == 0) { + return qtrue; + } + + // font + if (Q_stricmp(token.string, "font") == 0) { + int pointSize; + if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + return qfalse; + } + cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.textFont); + continue; + } + + // smallFont + if (Q_stricmp(token.string, "smallFont") == 0) { + int pointSize; + if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + return qfalse; + } + cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.smallFont); + continue; + } + + // font + if (Q_stricmp(token.string, "bigfont") == 0) { + int pointSize; + if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) { + return qfalse; + } + cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.bigFont); + continue; + } + + // gradientbar + if (Q_stricmp(token.string, "gradientbar") == 0) { + if (!PC_String_Parse(handle, &tempStr)) { + return qfalse; + } + cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip(tempStr); + continue; + } + + // enterMenuSound + if (Q_stricmp(token.string, "menuEnterSound") == 0) { + if (!PC_String_Parse(handle, &tempStr)) { + return qfalse; + } + cgDC.Assets.menuEnterSound = trap_S_RegisterSound( tempStr, qfalse ); + continue; + } + + // exitMenuSound + if (Q_stricmp(token.string, "menuExitSound") == 0) { + if (!PC_String_Parse(handle, &tempStr)) { + return qfalse; + } + cgDC.Assets.menuExitSound = trap_S_RegisterSound( tempStr, qfalse ); + continue; + } + + // itemFocusSound + if (Q_stricmp(token.string, "itemFocusSound") == 0) { + if (!PC_String_Parse(handle, &tempStr)) { + return qfalse; + } + cgDC.Assets.itemFocusSound = trap_S_RegisterSound( tempStr, qfalse ); + continue; + } + + // menuBuzzSound + if (Q_stricmp(token.string, "menuBuzzSound") == 0) { + if (!PC_String_Parse(handle, &tempStr)) { + return qfalse; + } + cgDC.Assets.menuBuzzSound = trap_S_RegisterSound( tempStr, qfalse ); + continue; + } + + if (Q_stricmp(token.string, "cursor") == 0) { + if (!PC_String_Parse(handle, &cgDC.Assets.cursorStr)) { + return qfalse; + } + cgDC.Assets.cursor = trap_R_RegisterShaderNoMip( cgDC.Assets.cursorStr); + continue; + } + + if (Q_stricmp(token.string, "fadeClamp") == 0) { + if (!PC_Float_Parse(handle, &cgDC.Assets.fadeClamp)) { + return qfalse; + } + continue; + } + + if (Q_stricmp(token.string, "fadeCycle") == 0) { + if (!PC_Int_Parse(handle, &cgDC.Assets.fadeCycle)) { + return qfalse; + } + continue; + } + + if (Q_stricmp(token.string, "fadeAmount") == 0) { + if (!PC_Float_Parse(handle, &cgDC.Assets.fadeAmount)) { + return qfalse; + } + continue; + } + + if (Q_stricmp(token.string, "shadowX") == 0) { + if (!PC_Float_Parse(handle, &cgDC.Assets.shadowX)) { + return qfalse; + } + continue; + } + + if (Q_stricmp(token.string, "shadowY") == 0) { + if (!PC_Float_Parse(handle, &cgDC.Assets.shadowY)) { + return qfalse; + } + continue; + } + + if (Q_stricmp(token.string, "shadowColor") == 0) { + if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) { + return qfalse; + } + cgDC.Assets.shadowFadeClamp = cgDC.Assets.shadowColor[3]; + continue; + } + } + return qfalse; // bk001204 - why not? +} + +void CG_ParseMenu(const char *menuFile) { + pc_token_t token; + int handle; + + handle = trap_PC_LoadSource(menuFile); + if (!handle) + handle = trap_PC_LoadSource("ui/testhud.menu"); + if (!handle) + return; + + while ( 1 ) { + if (!trap_PC_ReadToken( handle, &token )) { + break; + } + + //if ( Q_stricmp( token, "{" ) ) { + // Com_Printf( "Missing { in menu file\n" ); + // break; + //} + + //if ( menuCount == MAX_MENUS ) { + // Com_Printf( "Too many menus!\n" ); + // break; + //} + + if ( token.string[0] == '}' ) { + break; + } + + if (Q_stricmp(token.string, "assetGlobalDef") == 0) { + if (CG_Asset_Parse(handle)) { + continue; + } else { + break; + } + } + + + if (Q_stricmp(token.string, "menudef") == 0) { + // start a new menu + Menu_New(handle); + } + } + trap_PC_FreeSource(handle); +} + +qboolean CG_Load_Menu(char **p) { + char *token; + + token = COM_ParseExt(p, qtrue); + + if (token[0] != '{') { + return qfalse; + } + + while ( 1 ) { + + token = COM_ParseExt(p, qtrue); + + if (Q_stricmp(token, "}") == 0) { + return qtrue; + } + + if ( !token || token[0] == 0 ) { + return qfalse; + } + + CG_ParseMenu(token); + } + return qfalse; +} + + + +void CG_LoadMenus(const char *menuFile) { + char *token; + char *p; + int len, start; + fileHandle_t f; + static char buf[MAX_MENUDEFFILE]; + + start = trap_Milliseconds(); + + len = trap_FS_FOpenFile( menuFile, &f, FS_READ ); + if ( !f ) { + trap_Error( va( S_COLOR_YELLOW "menu file not found: %s, using default\n", menuFile ) ); + len = trap_FS_FOpenFile( "ui/hud.txt", &f, FS_READ ); + if (!f) { + trap_Error( va( S_COLOR_RED "default menu file not found: ui/hud.txt, unable to continue!\n", menuFile ) ); + } + } + + if ( len >= MAX_MENUDEFFILE ) { + trap_Error( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", menuFile, len, MAX_MENUDEFFILE ) ); + trap_FS_FCloseFile( f ); + return; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + COM_Compress(buf); + + Menu_Reset(); + + p = buf; + + while ( 1 ) { + token = COM_ParseExt( &p, qtrue ); + if( !token || token[0] == 0 || token[0] == '}') { + break; + } + + //if ( Q_stricmp( token, "{" ) ) { + // Com_Printf( "Missing { in menu file\n" ); + // break; + //} + + //if ( menuCount == MAX_MENUS ) { + // Com_Printf( "Too many menus!\n" ); + // break; + //} + + if ( Q_stricmp( token, "}" ) == 0 ) { + break; + } + + if (Q_stricmp(token, "loadmenu") == 0) { + if (CG_Load_Menu(&p)) { + continue; + } else { + break; + } + } + } + + Com_Printf("UI menu load time = %d milli seconds\n", trap_Milliseconds() - start); + +} + + + +static qboolean CG_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) { + return qfalse; +} + + +static int CG_FeederCount(float feederID) { + int i, count; + count = 0; + if (feederID == FEEDER_REDTEAM_LIST) { + for (i = 0; i < cg.numScores; i++) { + if (cg.scores[i].team == TEAM_RED) { + count++; + } + } + } else if (feederID == FEEDER_BLUETEAM_LIST) { + for (i = 0; i < cg.numScores; i++) { + if (cg.scores[i].team == TEAM_BLUE) { + count++; + } + } + } else if (feederID == FEEDER_SCOREBOARD) { + return cg.numScores; + } + return count; +} + + +void CG_SetScoreSelection(void *p) { + menuDef_t *menu = (menuDef_t*)p; + playerState_t *ps = &cg.snap->ps; + int i, red, blue; + red = blue = 0; + for (i = 0; i < cg.numScores; i++) { + if (cg.scores[i].team == TEAM_RED) { + red++; + } else if (cg.scores[i].team == TEAM_BLUE) { + blue++; + } + if (ps->clientNum == cg.scores[i].client) { + cg.selectedScore = i; + } + } + + if (menu == NULL) { + // just interested in setting the selected score + return; + } + + if ( cgs.gametype >= GT_TEAM ) { + int feeder = FEEDER_REDTEAM_LIST; + i = red; + if (cg.scores[cg.selectedScore].team == TEAM_BLUE) { + feeder = FEEDER_BLUETEAM_LIST; + i = blue; + } + Menu_SetFeederSelection(menu, feeder, i, NULL); + } else { + Menu_SetFeederSelection(menu, FEEDER_SCOREBOARD, cg.selectedScore, NULL); + } +} + +// FIXME: might need to cache this info +static clientInfo_t * CG_InfoFromScoreIndex(int index, int team, int *scoreIndex) { + int i, count; + if ( cgs.gametype >= GT_TEAM ) { + count = 0; + for (i = 0; i < cg.numScores; i++) { + if (cg.scores[i].team == team) { + if (count == index) { + *scoreIndex = i; + return &cgs.clientinfo[cg.scores[i].client]; + } + count++; + } + } + } + *scoreIndex = index; + return &cgs.clientinfo[ cg.scores[index].client ]; +} + +static const char *CG_FeederItemText(float feederID, int index, int column, qhandle_t *handle) { + gitem_t *item; + int scoreIndex = 0; + clientInfo_t *info = NULL; + int team = -1; + score_t *sp = NULL; + + *handle = -1; + + if (feederID == FEEDER_REDTEAM_LIST) { + team = TEAM_RED; + } else if (feederID == FEEDER_BLUETEAM_LIST) { + team = TEAM_BLUE; + } + + info = CG_InfoFromScoreIndex(index, team, &scoreIndex); + sp = &cg.scores[scoreIndex]; + + if (info && info->infoValid) { + switch (column) { + case 0: + if ( info->powerups & ( 1 << PW_NEUTRALFLAG ) ) { + item = BG_FindItemForPowerup( PW_NEUTRALFLAG ); + *handle = cg_items[ ITEM_INDEX(item) ].icon; + } else if ( info->powerups & ( 1 << PW_REDFLAG ) ) { + item = BG_FindItemForPowerup( PW_REDFLAG ); + *handle = cg_items[ ITEM_INDEX(item) ].icon; + } else if ( info->powerups & ( 1 << PW_BLUEFLAG ) ) { + item = BG_FindItemForPowerup( PW_BLUEFLAG ); + *handle = cg_items[ ITEM_INDEX(item) ].icon; + } else { + if ( info->botSkill > 0 && info->botSkill <= 5 ) { + *handle = cgs.media.botSkillShaders[ info->botSkill - 1 ]; + } else if ( info->handicap < 100 ) { + return va("%i", info->handicap ); + } + } + break; + case 1: + if (team == -1) { + return ""; + } else { + *handle = CG_StatusHandle(info->teamTask); + } + break; + case 2: + if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << sp->client ) ) { + return "Ready"; + } + if (team == -1) { + if (cgs.gametype == GT_TOURNAMENT) { + return va("%i/%i", info->wins, info->losses); + } else if (info->infoValid && info->team == TEAM_SPECTATOR ) { + return "Spectator"; + } else { + return ""; + } + } else { + if (info->teamLeader) { + return "Leader"; + } + } + break; + case 3: + return info->name; + break; + case 4: + return va("%i", info->score); + break; + case 5: + return va("%4i", sp->time); + break; + case 6: + if ( sp->ping == -1 ) { + return "connecting"; + } + return va("%4i", sp->ping); + break; + } + } + + return ""; +} + +static qhandle_t CG_FeederItemImage(float feederID, int index) { + return 0; +} + +static void CG_FeederSelection(float feederID, int index) { + if ( cgs.gametype >= GT_TEAM ) { + int i, count; + int team = (feederID == FEEDER_REDTEAM_LIST) ? TEAM_RED : TEAM_BLUE; + count = 0; + for (i = 0; i < cg.numScores; i++) { + if (cg.scores[i].team == team) { + if (index == count) { + cg.selectedScore = i; + } + count++; + } + } + } else { + cg.selectedScore = index; + } +} +//PKMOD - Ergodic 01/17/04 - enable HUD code in PKA 3.0 +//#endif + +//PKMOD - Ergodic 01/17/04 - Enable HUD in PKA3.0 +//#ifdef MISSIONPACK // bk001204 - only needed there +static float CG_Cvar_Get(const char *cvar) { + char buff[128]; + memset(buff, 0, sizeof(buff)); + trap_Cvar_VariableStringBuffer(cvar, buff, sizeof(buff)); + return atof(buff); +} +//#endif + +//PKMOD - Ergodic 01/17/04 - Enable the mission pack code so that HUD code will work +//#ifdef MISSIONPACK +void CG_Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const char *text, int cursorPos, char cursor, int limit, int style) { + CG_Text_Paint(x, y, scale, color, text, 0, limit, style); +} + +static int CG_OwnerDrawWidth(int ownerDraw, float scale) { + switch (ownerDraw) { + case CG_GAME_TYPE: + return CG_Text_Width(CG_GameTypeString(), scale, 0); + case CG_GAME_STATUS: + return CG_Text_Width(CG_GetGameStatusText(), scale, 0); + break; + case CG_KILLER: + return CG_Text_Width(CG_GetKillerText(), scale, 0); + break; + case CG_RED_NAME: + return CG_Text_Width(cg_redTeamName.string, scale, 0); + break; + case CG_BLUE_NAME: + return CG_Text_Width(cg_blueTeamName.string, scale, 0); + break; + + + } + return 0; +} + +static int CG_PlayCinematic(const char *name, float x, float y, float w, float h) { + return trap_CIN_PlayCinematic(name, x, y, w, h, CIN_loop); +} + +static void CG_StopCinematic(int handle) { + trap_CIN_StopCinematic(handle); +} + +static void CG_DrawCinematic(int handle, float x, float y, float w, float h) { + trap_CIN_SetExtents(handle, x, y, w, h); + trap_CIN_DrawCinematic(handle); +} + +static void CG_RunCinematicFrame(int handle) { + trap_CIN_RunCinematic(handle); +} + +/* +================= +CG_LoadHudMenu(); + +================= +*/ +void CG_LoadHudMenu() { + char buff[1024]; + const char *hudSet; + + cgDC.registerShaderNoMip = &trap_R_RegisterShaderNoMip; + cgDC.setColor = &trap_R_SetColor; + cgDC.drawHandlePic = &CG_DrawPic; + cgDC.drawStretchPic = &trap_R_DrawStretchPic; + cgDC.drawText = &CG_Text_Paint; + cgDC.textWidth = &CG_Text_Width; + cgDC.textHeight = &CG_Text_Height; + cgDC.registerModel = &trap_R_RegisterModel; + cgDC.modelBounds = &trap_R_ModelBounds; + cgDC.fillRect = &CG_FillRect; + cgDC.drawRect = &CG_DrawRect; + cgDC.drawSides = &CG_DrawSides; + cgDC.drawTopBottom = &CG_DrawTopBottom; + cgDC.clearScene = &trap_R_ClearScene; + cgDC.addRefEntityToScene = &trap_R_AddRefEntityToScene; + cgDC.renderScene = &trap_R_RenderScene; + cgDC.registerFont = &trap_R_RegisterFont; + cgDC.ownerDrawItem = &CG_OwnerDraw; + cgDC.getValue = &CG_GetValue; + cgDC.ownerDrawVisible = &CG_OwnerDrawVisible; + cgDC.runScript = &CG_RunMenuScript; + cgDC.getTeamColor = &CG_GetTeamColor; + cgDC.setCVar = trap_Cvar_Set; + cgDC.getCVarString = trap_Cvar_VariableStringBuffer; + cgDC.getCVarValue = CG_Cvar_Get; + cgDC.drawTextWithCursor = &CG_Text_PaintWithCursor; + //cgDC.setOverstrikeMode = &trap_Key_SetOverstrikeMode; + //cgDC.getOverstrikeMode = &trap_Key_GetOverstrikeMode; + cgDC.startLocalSound = &trap_S_StartLocalSound; + cgDC.ownerDrawHandleKey = &CG_OwnerDrawHandleKey; + cgDC.feederCount = &CG_FeederCount; + cgDC.feederItemImage = &CG_FeederItemImage; + cgDC.feederItemText = &CG_FeederItemText; + cgDC.feederSelection = &CG_FeederSelection; + //cgDC.setBinding = &trap_Key_SetBinding; + //cgDC.getBindingBuf = &trap_Key_GetBindingBuf; + //cgDC.keynumToStringBuf = &trap_Key_KeynumToStringBuf; + //cgDC.executeText = &trap_Cmd_ExecuteText; + cgDC.Error = &Com_Error; + cgDC.Print = &Com_Printf; + cgDC.ownerDrawWidth = &CG_OwnerDrawWidth; + //cgDC.Pause = &CG_Pause; + cgDC.registerSound = &trap_S_RegisterSound; + cgDC.startBackgroundTrack = &trap_S_StartBackgroundTrack; + cgDC.stopBackgroundTrack = &trap_S_StopBackgroundTrack; + cgDC.playCinematic = &CG_PlayCinematic; + cgDC.stopCinematic = &CG_StopCinematic; + cgDC.drawCinematic = &CG_DrawCinematic; + cgDC.runCinematicFrame = &CG_RunCinematicFrame; + + Init_Display(&cgDC); + + Menu_Reset(); + + trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff)); + hudSet = buff; + if (hudSet[0] == '\0') { + hudSet = "ui/hud.txt"; + } + + CG_LoadMenus(hudSet); +} + +void CG_AssetCache() { + //if (Assets.textFont == NULL) { + // trap_R_RegisterFont("fonts/arial.ttf", 72, &Assets.textFont); + //} + //Assets.background = trap_R_RegisterShaderNoMip( ASSET_BACKGROUND ); + //Com_Printf("Menu Size: %i bytes\n", sizeof(Menus)); + cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip( ASSET_GRADIENTBAR ); + cgDC.Assets.fxBasePic = trap_R_RegisterShaderNoMip( ART_FX_BASE ); + cgDC.Assets.fxPic[0] = trap_R_RegisterShaderNoMip( ART_FX_RED ); + cgDC.Assets.fxPic[1] = trap_R_RegisterShaderNoMip( ART_FX_YELLOW ); + cgDC.Assets.fxPic[2] = trap_R_RegisterShaderNoMip( ART_FX_GREEN ); + cgDC.Assets.fxPic[3] = trap_R_RegisterShaderNoMip( ART_FX_TEAL ); + cgDC.Assets.fxPic[4] = trap_R_RegisterShaderNoMip( ART_FX_BLUE ); + cgDC.Assets.fxPic[5] = trap_R_RegisterShaderNoMip( ART_FX_CYAN ); + cgDC.Assets.fxPic[6] = trap_R_RegisterShaderNoMip( ART_FX_WHITE ); + cgDC.Assets.scrollBar = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR ); + cgDC.Assets.scrollBarArrowDown = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWDOWN ); + cgDC.Assets.scrollBarArrowUp = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWUP ); + cgDC.Assets.scrollBarArrowLeft = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWLEFT ); + cgDC.Assets.scrollBarArrowRight = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWRIGHT ); + cgDC.Assets.scrollBarThumb = trap_R_RegisterShaderNoMip( ASSET_SCROLL_THUMB ); + cgDC.Assets.sliderBar = trap_R_RegisterShaderNoMip( ASSET_SLIDER_BAR ); + cgDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip( ASSET_SLIDER_THUMB ); +} + +//PKMOD - Ergodic 01/17/04 - Enable the mission pack code so that HUD code will work +//#endif + +/* +================= +CG_Init + +Called after every level change or subsystem restart +Will perform callbacks to make the loading info screen update. +================= +*/ +void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) { + const char *s; + int version_test; //PKMOD - Ergodic 08/19/02 - Hold PKA version tests + + // clear everything + memset( &cgs, 0, sizeof( cgs ) ); + memset( &cg, 0, sizeof( cg ) ); + memset( cg_entities, 0, sizeof(cg_entities) ); + memset( cg_weapons, 0, sizeof(cg_weapons) ); + memset( cg_items, 0, sizeof(cg_items) ); + + cg.clientNum = clientNum; + + cgs.processedSnapshotNum = serverMessageNum; + cgs.serverCommandSequence = serverCommandSequence; + + // load a few needed things before we do any screen updates + cgs.media.charsetShader = trap_R_RegisterShader( "gfx/2d/bigchars" ); + cgs.media.whiteShader = trap_R_RegisterShader( "white" ); + cgs.media.charsetProp = trap_R_RegisterShaderNoMip( "menu/art/font1_prop.tga" ); + cgs.media.charsetPropGlow = trap_R_RegisterShaderNoMip( "menu/art/font1_prop_glo.tga" ); + cgs.media.charsetPropB = trap_R_RegisterShaderNoMip( "menu/art/font2_prop.tga" ); + + CG_RegisterCvars(); + + CG_InitConsoleCommands(); + + cg.weaponSelect = WP_MACHINEGUN; + + cgs.redflag = cgs.blueflag = -1; // For compatibily, default to unset for + cgs.flagStatus = -1; + // old servers + + // get the rendering configuration from the client system + trap_GetGlconfig( &cgs.glconfig ); + cgs.screenXScale = cgs.glconfig.vidWidth / 640.0; + cgs.screenYScale = cgs.glconfig.vidHeight / 480.0; + + // get the gamestate from the client system + trap_GetGameState( &cgs.gameState ); + + // check version + s = CG_ConfigString( CS_GAME_VERSION ); + //PKMOD - Ergodic 08/19/02 - give greater information when version tests fail + //< 0 string1 less than string2 + //= 0 string1 identical to string2 + //> 0 string1 greater than string2 + + + version_test = strcmp( s, GAME_VERSION ); + + if ( version_test ) { + if ( version_test < 0) { + //PKMOD - Ergodic 08/19/02 - set the CVAR + //Server version is less than Client Version + trap_Cvar_Set( "cl_pkaerror", va("QUAKE3 Client(%s)/Server(%s) game version mismatch!\n Client at a Higher Version than Server.\n Please try another PKA server", GAME_VERSION, s ) ); + CG_Error( "QUAKE3 Client(%s)/Server(%s) game version mismatch!\n Client at a Higher Version than Server.\n Please try another PKA server", GAME_VERSION, s ); + } + else { + //PKMOD - Ergodic 08/19/02 - set the CVAR + //Client version is less than Server Version + trap_Cvar_Set( "cl_pkaerror", va("QUAKE3 Client(%s)/Server(%s) game version mismatch!\n Server at a Higher Version than Client.\n Please upgrade at www.idsoftware.com", GAME_VERSION, s ) ); + CG_Error( "QUAKE3 Client(%s)/Server(%s) game mismatch!\n Server at a Higher Version than Client.\n Please upgrade at www.idsoftware.com", GAME_VERSION, s ); + } + } + + //PKMOD - Ergodic 02/01/01 - check the PKARENA game version + s = CG_ConfigString( CS_PKARENA_VERSION ); + + //PKMOD - Ergodic 08/19/02 - give greater information when version tests fail + version_test = strcmp( s, PKARENA_VERSION ); + if ( version_test ) { + if ( version_test < 0) { + //PKMOD - Ergodic 08/19/02 - set the CVAR + //Server version is less than Client Version + trap_Cvar_Set( "cl_pkaerror", va("PKARENA Client(%s)/Server(%s) game version mismatch!\n Client at a Higher Version than Server.\n Please try another PKA server", PKARENA_VERSION, s ) ); + CG_Error( "PKARENA Client(%s)/Server(%s) game version mismatch!\n Client at a Higher Version than Server.\n Please try another PKA server", PKARENA_VERSION, s ); + } + else { + //PKMOD - Ergodic 08/19/02 - set the CVAR + //Client version is less than Server Version + trap_Cvar_Set( "cl_pkaerror", va("PKARENA Client(%s)/Server(%s) game version mismatch!\n Server at a Higher Version than Client.\n Please upgrade at www.team-evolve.com", PKARENA_VERSION, s ) ); + CG_Error( "PKARENA Client(%s)/Server(%s) game version mismatch!\n Server at a Higher Version than Client.\n Please upgrade at www.team-evolve.com", PKARENA_VERSION, s ); + } + } + else { + //PKMOD - Ergodic 08/17/02 - clear the error CVAR + trap_Cvar_Set( "cl_pkaerror", "0" ); + } + + s = CG_ConfigString( CS_LEVEL_START_TIME ); + cgs.levelStartTime = atoi( s ); + + CG_ParseServerinfo(); + + // load the new map + CG_LoadingString( "collision map" ); + + trap_CM_LoadMap( cgs.mapname ); + +//PKMOD - Ergodic 01/31/03 - Activate HUD for PKA3.0 +//#ifdef MISSIONPACK + String_Init(); +//#endif + + cg.loading = qtrue; // force players to load instead of defer + + CG_LoadingString( "sounds" ); + + CG_RegisterSounds(); + + CG_LoadingString( "graphics" ); + + CG_RegisterGraphics(); + + CG_LoadingString( "clients" ); + + CG_RegisterClients(); // if low on memory, some clients will be deferred + +//PKMOD - Ergodic 03/12/04 - remove this to enable scollbars in scoreboard +//#ifdef MISSIONPACK + CG_AssetCache(); +//PKMOD - Ergodic 03/12/04 - remove this to enable scollbars in scoreboard +//#endif + //PKMOD - Ergodic 01/17/03 - Activate HUD for PKA3.0 + CG_LoadHudMenu(); // load new hud stuff + + cg.loading = qfalse; // future players will be deferred + + CG_InitLocalEntities(); + + CG_InitMarkPolys(); + + // remove the last loading update + cg.infoScreenText[0] = 0; + + // Make sure we have update values (scores) + CG_SetConfigValues(); + + CG_StartMusic(); + + CG_LoadingString( "" ); + +#ifdef MISSIONPACK + CG_InitTeamChat(); +#endif + + CG_ShaderStateChanged(); + + trap_S_ClearLoopingSounds( qtrue ); +} + +/* +================= +CG_Shutdown + +Called before every level change or subsystem restart +================= +*/ +void CG_Shutdown( void ) { + // some mods may need to do cleanup work here, + // like closing files or archiving session data +} + + +/* +================== +CG_EventHandling +================== + type 0 - no event handling + 1 - team menu + 2 - hud editor + +*/ +//PKMOD - Ergodic 01/30/04 - Activate HUD - These functions will use TA definitions found in UI module + +/* PKMOD++++++++++ +#ifndef MISSIONPACK +void CG_EventHandling(int type) { +} + + + +void CG_KeyEvent(int key, qboolean down) { +} + +void CG_MouseEvent(int x, int y) { +} +#endif +*/ //PKMOD--------- \ No newline at end of file diff --git a/quake3/source/code/cgame/cg_marks.c b/quake3/source/code/cgame/cg_marks.c new file mode 100644 index 0000000..c1af668 --- /dev/null +++ b/quake3/source/code/cgame/cg_marks.c @@ -0,0 +1,2381 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_marks.c -- wall marks + +#include "cg_local.h" + +/* +=================================================================== + +MARK POLYS + +=================================================================== +*/ + + +markPoly_t cg_activeMarkPolys; // double linked list +markPoly_t *cg_freeMarkPolys; // single linked list +markPoly_t cg_markPolys[MAX_MARK_POLYS]; +static int markTotal; + +/* +=================== +CG_InitMarkPolys + +This is called at startup and for tournement restarts +=================== +*/ +void CG_InitMarkPolys( void ) { + int i; + + memset( cg_markPolys, 0, sizeof(cg_markPolys) ); + + cg_activeMarkPolys.nextMark = &cg_activeMarkPolys; + cg_activeMarkPolys.prevMark = &cg_activeMarkPolys; + cg_freeMarkPolys = cg_markPolys; + for ( i = 0 ; i < MAX_MARK_POLYS - 1 ; i++ ) { + cg_markPolys[i].nextMark = &cg_markPolys[i+1]; + } +} + + +/* +================== +CG_FreeMarkPoly +================== +*/ +void CG_FreeMarkPoly( markPoly_t *le ) { + if ( !le->prevMark ) { + CG_Error( "CG_FreeLocalEntity: not active" ); + } + + // remove from the doubly linked active list + le->prevMark->nextMark = le->nextMark; + le->nextMark->prevMark = le->prevMark; + + // the free list is only singly linked + le->nextMark = cg_freeMarkPolys; + cg_freeMarkPolys = le; +} + +/* +=================== +CG_AllocMark + +Will allways succeed, even if it requires freeing an old active mark +=================== +*/ +markPoly_t *CG_AllocMark( void ) { + markPoly_t *le; + int time; + + if ( !cg_freeMarkPolys ) { + // no free entities, so free the one at the end of the chain + // remove the oldest active entity + time = cg_activeMarkPolys.prevMark->time; + while (cg_activeMarkPolys.prevMark && time == cg_activeMarkPolys.prevMark->time) { + CG_FreeMarkPoly( cg_activeMarkPolys.prevMark ); + } + } + + le = cg_freeMarkPolys; + cg_freeMarkPolys = cg_freeMarkPolys->nextMark; + + memset( le, 0, sizeof( *le ) ); + + // link into the active list + le->nextMark = cg_activeMarkPolys.nextMark; + le->prevMark = &cg_activeMarkPolys; + cg_activeMarkPolys.nextMark->prevMark = le; + cg_activeMarkPolys.nextMark = le; + return le; +} + + + +/* +================= +CG_ImpactMark + +origin should be a point within a unit of the plane +dir should be the plane normal + +temporary marks will not be stored or randomly oriented, but immediately +passed to the renderer. +================= +*/ +#define MAX_MARK_FRAGMENTS 128 +#define MAX_MARK_POINTS 384 + +void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, + float orientation, float red, float green, float blue, float alpha, + qboolean alphaFade, float radius, qboolean temporary ) { + vec3_t axis[3]; + float texCoordScale; + vec3_t originalPoints[4]; + byte colors[4]; + int i, j; + int numFragments; + markFragment_t markFragments[MAX_MARK_FRAGMENTS], *mf; + vec3_t markPoints[MAX_MARK_POINTS]; + vec3_t projection; + + if ( !cg_addMarks.integer ) { + return; + } + + if ( radius <= 0 ) { + CG_Error( "CG_ImpactMark called with <= 0 radius" ); + } + + //if ( markTotal >= MAX_MARK_POLYS ) { + // return; + //} + + // create the texture axis + VectorNormalize2( dir, axis[0] ); + PerpendicularVector( axis[1], axis[0] ); + RotatePointAroundVector( axis[2], axis[0], axis[1], orientation ); + CrossProduct( axis[0], axis[2], axis[1] ); + + texCoordScale = 0.5 * 1.0 / radius; + + // create the full polygon + for ( i = 0 ; i < 3 ; i++ ) { + originalPoints[0][i] = origin[i] - radius * axis[1][i] - radius * axis[2][i]; + originalPoints[1][i] = origin[i] + radius * axis[1][i] - radius * axis[2][i]; + originalPoints[2][i] = origin[i] + radius * axis[1][i] + radius * axis[2][i]; + originalPoints[3][i] = origin[i] - radius * axis[1][i] + radius * axis[2][i]; + } + + // get the fragments + VectorScale( dir, -20, projection ); + numFragments = trap_CM_MarkFragments( 4, (void *)originalPoints, + projection, MAX_MARK_POINTS, markPoints[0], + MAX_MARK_FRAGMENTS, markFragments ); + + colors[0] = red * 255; + colors[1] = green * 255; + colors[2] = blue * 255; + colors[3] = alpha * 255; + + for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) { + polyVert_t *v; + polyVert_t verts[MAX_VERTS_ON_POLY]; + markPoly_t *mark; + + // we have an upper limit on the complexity of polygons + // that we store persistantly + if ( mf->numPoints > MAX_VERTS_ON_POLY ) { + mf->numPoints = MAX_VERTS_ON_POLY; + } + for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) { + vec3_t delta; + + VectorCopy( markPoints[mf->firstPoint + j], v->xyz ); + + VectorSubtract( v->xyz, origin, delta ); + v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * texCoordScale; + v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * texCoordScale; + *(int *)v->modulate = *(int *)colors; + } + + // if it is a temporary (shadow) mark, add it immediately and forget about it + if ( temporary ) { + trap_R_AddPolyToScene( markShader, mf->numPoints, verts ); + continue; + } + + // otherwise save it persistantly + mark = CG_AllocMark(); + mark->time = cg.time; + mark->alphaFade = alphaFade; + mark->markShader = markShader; + mark->poly.numVerts = mf->numPoints; + mark->color[0] = red; + mark->color[1] = green; + mark->color[2] = blue; + mark->color[3] = alpha; + memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[0] ) ); + markTotal++; + } +} + + +/* +=============== +CG_AddMarks +=============== +*/ +#define MARK_TOTAL_TIME 10000 +#define MARK_FADE_TIME 1000 + +void CG_AddMarks( void ) { + int j; + markPoly_t *mp, *next; + int t; + int fade; + + if ( !cg_addMarks.integer ) { + return; + } + + mp = cg_activeMarkPolys.nextMark; + for ( ; mp != &cg_activeMarkPolys ; mp = next ) { + // grab next now, so if the local entity is freed we + // still have it + next = mp->nextMark; + + // see if it is time to completely remove it + if ( cg.time > mp->time + MARK_TOTAL_TIME ) { + CG_FreeMarkPoly( mp ); + continue; + } + + // fade out the energy bursts + if ( mp->markShader == cgs.media.energyMarkShader ) { + + fade = 450 - 450 * ( (cg.time - mp->time ) / 3000.0 ); + if ( fade < 255 ) { + if ( fade < 0 ) { + fade = 0; + } + if ( mp->verts[0].modulate[0] != 0 ) { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { + mp->verts[j].modulate[0] = mp->color[0] * fade; + mp->verts[j].modulate[1] = mp->color[1] * fade; + mp->verts[j].modulate[2] = mp->color[2] * fade; + } + } + } + } + + // fade all marks out with time + t = mp->time + MARK_TOTAL_TIME - cg.time; + if ( t < MARK_FADE_TIME ) { + fade = 255 * t / MARK_FADE_TIME; + if ( mp->alphaFade ) { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { + mp->verts[j].modulate[3] = fade; + } + } else { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) { + mp->verts[j].modulate[0] = mp->color[0] * fade; + mp->verts[j].modulate[1] = mp->color[1] * fade; + mp->verts[j].modulate[2] = mp->color[2] * fade; + } + } + } + + + trap_R_AddPolyToScene( mp->markShader, mp->poly.numVerts, mp->verts ); + } +} + +// cg_particles.c + +#define BLOODRED 2 +#define EMISIVEFADE 3 +#define GREY75 4 + +typedef struct particle_s +{ + struct particle_s *next; + + float time; + float endtime; + + vec3_t org; + vec3_t vel; + vec3_t accel; + int color; + float colorvel; + float alpha; + float alphavel; + int type; + qhandle_t pshader; + + float height; + float width; + + float endheight; + float endwidth; + + float start; + float end; + + float startfade; + qboolean rotate; + int snum; + + qboolean link; + + // Ridah + int shaderAnim; + int roll; + + int accumroll; + +} cparticle_t; + +typedef enum +{ + P_NONE, + P_WEATHER, + P_FLAT, + P_SMOKE, + P_ROTATE, + P_WEATHER_TURBULENT, + P_ANIM, // Ridah + P_BAT, + P_BLEED, + P_FLAT_SCALEUP, + P_FLAT_SCALEUP_FADE, + P_WEATHER_FLURRY, + P_SMOKE_IMPACT, + P_BUBBLE, + P_BUBBLE_TURBULENT, + P_SPRITE +} particle_type_t; + +#define MAX_SHADER_ANIMS 32 +#define MAX_SHADER_ANIM_FRAMES 64 + +static char *shaderAnimNames[MAX_SHADER_ANIMS] = { + "explode1", + NULL +}; +static qhandle_t shaderAnims[MAX_SHADER_ANIMS][MAX_SHADER_ANIM_FRAMES]; +static int shaderAnimCounts[MAX_SHADER_ANIMS] = { + 23 +}; +static float shaderAnimSTRatio[MAX_SHADER_ANIMS] = { + 1.0f +}; +static int numShaderAnims; +// done. + +#define PARTICLE_GRAVITY 40 +//PKMOD - Ergodic 03/18/04 - change max particles from 1024 to 1536 +#define MAX_PARTICLES 1536 + +cparticle_t *active_particles, *free_particles; +cparticle_t particles[MAX_PARTICLES]; +int cl_numparticles = MAX_PARTICLES; + +qboolean initparticles = qfalse; +vec3_t pvforward, pvright, pvup; +vec3_t rforward, rright, rup; + +float oldtime; + +/* +=============== +CL_ClearParticles +=============== +*/ +void CG_ClearParticles (void) +{ + int i; + + memset( particles, 0, sizeof(particles) ); + + free_particles = &particles[0]; + active_particles = NULL; + + for (i=0 ;itype == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY + || p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) + {// create a front facing polygon + + if (p->type != P_WEATHER_FLURRY) + { + if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) + { + if (org[2] > p->end) + { + p->time = cg.time; + VectorCopy (org, p->org); // Ridah, fixes rare snow flakes that flicker on the ground + + p->org[2] = ( p->start + crandom () * 4 ); + + + if (p->type == P_BUBBLE_TURBULENT) + { + p->vel[0] = crandom() * 4; + p->vel[1] = crandom() * 4; + } + + } + } + else + { + if (org[2] < p->end) + { + p->time = cg.time; + VectorCopy (org, p->org); // Ridah, fixes rare snow flakes that flicker on the ground + + while (p->org[2] < p->end) + { + p->org[2] += (p->start - p->end); + } + + + if (p->type == P_WEATHER_TURBULENT) + { + p->vel[0] = crandom() * 16; + p->vel[1] = crandom() * 16; + } + + } + } + + + // Rafael snow pvs check + if (!p->link) + return; + + p->alpha = 1; + } + + // Ridah, had to do this or MAX_POLYS is being exceeded in village1.bsp + if (Distance( cg.snap->ps.origin, org ) > 1024) { + return; + } + // done. + + if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) + { + VectorMA (org, -p->height, pvup, point); + VectorMA (point, -p->width, pvright, point); + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255 * p->alpha; + + VectorMA (org, -p->height, pvup, point); + VectorMA (point, p->width, pvright, point); + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, pvup, point); + VectorMA (point, p->width, pvright, point); + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, pvup, point); + VectorMA (point, -p->width, pvright, point); + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255 * p->alpha; + } + else + { + VectorMA (org, -p->height, pvup, point); + VectorMA (point, -p->width, pvright, point); + VectorCopy( point, TRIverts[0].xyz ); + TRIverts[0].st[0] = 1; + TRIverts[0].st[1] = 0; + TRIverts[0].modulate[0] = 255; + TRIverts[0].modulate[1] = 255; + TRIverts[0].modulate[2] = 255; + TRIverts[0].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, pvup, point); + VectorMA (point, -p->width, pvright, point); + VectorCopy (point, TRIverts[1].xyz); + TRIverts[1].st[0] = 0; + TRIverts[1].st[1] = 0; + TRIverts[1].modulate[0] = 255; + TRIverts[1].modulate[1] = 255; + TRIverts[1].modulate[2] = 255; + TRIverts[1].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, pvup, point); + VectorMA (point, p->width, pvright, point); + VectorCopy (point, TRIverts[2].xyz); + TRIverts[2].st[0] = 0; + TRIverts[2].st[1] = 1; + TRIverts[2].modulate[0] = 255; + TRIverts[2].modulate[1] = 255; + TRIverts[2].modulate[2] = 255; + TRIverts[2].modulate[3] = 255 * p->alpha; + } + + } + else if (p->type == P_SPRITE) + { + vec3_t rr, ru; + vec3_t rotate_ang; + + VectorSet (color, 1.0, 1.0, 0.5); + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + if (p->roll) { + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + rotate_ang[ROLL] += p->roll; + AngleVectors ( rotate_ang, NULL, rr, ru); + } + + if (p->roll) { + VectorMA (org, -height, ru, point); + VectorMA (point, -width, rr, point); + } else { + VectorMA (org, -height, pvup, point); + VectorMA (point, -width, pvright, point); + } + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*height, ru, point); + } else { + VectorMA (point, 2*height, pvup, point); + } + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*width, rr, point); + } else { + VectorMA (point, 2*width, pvright, point); + } + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, -2*height, ru, point); + } else { + VectorMA (point, -2*height, pvup, point); + } + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + } + else if (p->type == P_SMOKE || p->type == P_SMOKE_IMPACT) + {// create a front rotating facing polygon + + if ( p->type == P_SMOKE_IMPACT && Distance( cg.snap->ps.origin, org ) > 1024) { + return; + } + + if (p->color == BLOODRED) + VectorSet (color, 0.22f, 0.0f, 0.0f); + else if (p->color == GREY75) + { + float len; + float greyit; + float val; + len = Distance (cg.snap->ps.origin, org); + if (!len) + len = 1; + + val = 4096/len; + greyit = 0.25 * val; + if (greyit > 0.5) + greyit = 0.5; + + VectorSet (color, greyit, greyit, greyit); + } + else + VectorSet (color, 1.0, 1.0, 1.0); + + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + + if (cg.time > p->startfade) + { + invratio = 1 - ( (cg.time - p->startfade) / (p->endtime - p->startfade) ); + + if (p->color == EMISIVEFADE) + { + float fval; + fval = (invratio * invratio); + if (fval < 0) + fval = 0; + VectorSet (color, fval , fval , fval ); + } + invratio *= p->alpha; + } + else + invratio = 1 * p->alpha; + + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) + invratio = 1; + + if (invratio > 1) + invratio = 1; + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + if (p->type != P_SMOKE_IMPACT) + { + vec3_t temp; + + vectoangles (rforward, temp); + p->accumroll += p->roll; + temp[ROLL] += p->accumroll * 0.1; + AngleVectors ( temp, NULL, rright2, rup2); + } + else + { + VectorCopy (rright, rright2); + VectorCopy (rup, rup2); + } + + if (p->rotate) + { + VectorMA (org, -height, rup2, point); + VectorMA (point, -width, rright2, point); + } + else + { + VectorMA (org, -p->height, pvup, point); + VectorMA (point, -p->width, pvright, point); + } + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255 * color[0]; + verts[0].modulate[1] = 255 * color[1]; + verts[0].modulate[2] = 255 * color[2]; + verts[0].modulate[3] = 255 * invratio; + + if (p->rotate) + { + VectorMA (org, -height, rup2, point); + VectorMA (point, width, rright2, point); + } + else + { + VectorMA (org, -p->height, pvup, point); + VectorMA (point, p->width, pvright, point); + } + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255 * color[0]; + verts[1].modulate[1] = 255 * color[1]; + verts[1].modulate[2] = 255 * color[2]; + verts[1].modulate[3] = 255 * invratio; + + if (p->rotate) + { + VectorMA (org, height, rup2, point); + VectorMA (point, width, rright2, point); + } + else + { + VectorMA (org, p->height, pvup, point); + VectorMA (point, p->width, pvright, point); + } + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255 * color[0]; + verts[2].modulate[1] = 255 * color[1]; + verts[2].modulate[2] = 255 * color[2]; + verts[2].modulate[3] = 255 * invratio; + + if (p->rotate) + { + VectorMA (org, height, rup2, point); + VectorMA (point, -width, rright2, point); + } + else + { + VectorMA (org, p->height, pvup, point); + VectorMA (point, -p->width, pvright, point); + } + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255 * color[0]; + verts[3].modulate[1] = 255 * color[1]; + verts[3].modulate[2] = 255 * color[2]; + verts[3].modulate[3] = 255 * invratio; + + } + else if (p->type == P_BLEED) + { + vec3_t rr, ru; + vec3_t rotate_ang; + float alpha; + + alpha = p->alpha; + + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) + alpha = 1; + + if (p->roll) + { + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + rotate_ang[ROLL] += p->roll; + AngleVectors ( rotate_ang, NULL, rr, ru); + } + else + { + VectorCopy (pvup, ru); + VectorCopy (pvright, rr); + } + + VectorMA (org, -p->height, ru, point); + VectorMA (point, -p->width, rr, point); + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 111; + verts[0].modulate[1] = 19; + verts[0].modulate[2] = 9; + verts[0].modulate[3] = 255 * alpha; + + VectorMA (org, -p->height, ru, point); + VectorMA (point, p->width, rr, point); + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 111; + verts[1].modulate[1] = 19; + verts[1].modulate[2] = 9; + verts[1].modulate[3] = 255 * alpha; + + VectorMA (org, p->height, ru, point); + VectorMA (point, p->width, rr, point); + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 111; + verts[2].modulate[1] = 19; + verts[2].modulate[2] = 9; + verts[2].modulate[3] = 255 * alpha; + + VectorMA (org, p->height, ru, point); + VectorMA (point, -p->width, rr, point); + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 111; + verts[3].modulate[1] = 19; + verts[3].modulate[2] = 9; + verts[3].modulate[3] = 255 * alpha; + + } + else if (p->type == P_FLAT_SCALEUP) + { + float width, height; + float sinR, cosR; + + if (p->color == BLOODRED) + VectorSet (color, 1, 1, 1); + else + VectorSet (color, 0.5, 0.5, 0.5); + + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + if (width > p->endwidth) + width = p->endwidth; + + if (height > p->endheight) + height = p->endheight; + + sinR = height * sin(DEG2RAD(p->roll)) * sqrt(2); + cosR = width * cos(DEG2RAD(p->roll)) * sqrt(2); + + VectorCopy (org, verts[0].xyz); + verts[0].xyz[0] -= sinR; + verts[0].xyz[1] -= cosR; + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255 * color[0]; + verts[0].modulate[1] = 255 * color[1]; + verts[0].modulate[2] = 255 * color[2]; + verts[0].modulate[3] = 255; + + VectorCopy (org, verts[1].xyz); + verts[1].xyz[0] -= cosR; + verts[1].xyz[1] += sinR; + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255 * color[0]; + verts[1].modulate[1] = 255 * color[1]; + verts[1].modulate[2] = 255 * color[2]; + verts[1].modulate[3] = 255; + + VectorCopy (org, verts[2].xyz); + verts[2].xyz[0] += sinR; + verts[2].xyz[1] += cosR; + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255 * color[0]; + verts[2].modulate[1] = 255 * color[1]; + verts[2].modulate[2] = 255 * color[2]; + verts[2].modulate[3] = 255; + + VectorCopy (org, verts[3].xyz); + verts[3].xyz[0] += cosR; + verts[3].xyz[1] -= sinR; + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255 * color[0]; + verts[3].modulate[1] = 255 * color[1]; + verts[3].modulate[2] = 255 * color[2]; + verts[3].modulate[3] = 255; + } + else if (p->type == P_FLAT) + { + + VectorCopy (org, verts[0].xyz); + verts[0].xyz[0] -= p->height; + verts[0].xyz[1] -= p->width; + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + VectorCopy (org, verts[1].xyz); + verts[1].xyz[0] -= p->height; + verts[1].xyz[1] += p->width; + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + VectorCopy (org, verts[2].xyz); + verts[2].xyz[0] += p->height; + verts[2].xyz[1] += p->width; + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + VectorCopy (org, verts[3].xyz); + verts[3].xyz[0] += p->height; + verts[3].xyz[1] -= p->width; + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + + } + // Ridah + else if (p->type == P_ANIM) { + vec3_t rr, ru; + vec3_t rotate_ang; + int i, j; + + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + if (ratio >= 1.0f) { + ratio = 0.9999f; + } + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + // if we are "inside" this sprite, don't draw + if (Distance( cg.snap->ps.origin, org ) < width/1.5) { + return; + } + + i = p->shaderAnim; + j = (int)floor(ratio * shaderAnimCounts[p->shaderAnim]); + p->pshader = shaderAnims[i][j]; + + if (p->roll) { + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + rotate_ang[ROLL] += p->roll; + AngleVectors ( rotate_ang, NULL, rr, ru); + } + + if (p->roll) { + VectorMA (org, -height, ru, point); + VectorMA (point, -width, rr, point); + } else { + VectorMA (org, -height, pvup, point); + VectorMA (point, -width, pvright, point); + } + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*height, ru, point); + } else { + VectorMA (point, 2*height, pvup, point); + } + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*width, rr, point); + } else { + VectorMA (point, 2*width, pvright, point); + } + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, -2*height, ru, point); + } else { + VectorMA (point, -2*height, pvup, point); + } + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + } + // done. + + if (!p->pshader) { +// (SA) temp commented out for DM +// CG_Printf ("CG_AddParticleToScene type %d p->pshader == ZERO\n", p->type); + return; + } + + if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY) + trap_R_AddPolyToScene( p->pshader, 3, TRIverts ); + else + trap_R_AddPolyToScene( p->pshader, 4, verts ); + +} + +// Ridah, made this static so it doesn't interfere with other files +static float roll = 0.0; + +/* +=============== +CG_AddParticles +=============== +*/ +void CG_AddParticles (void) +{ + cparticle_t *p, *next; + float alpha; + float time, time2; + vec3_t org; + int color; + cparticle_t *active, *tail; + int type; + vec3_t rotate_ang; + + if (!initparticles) + CG_ClearParticles (); + + VectorCopy( cg.refdef.viewaxis[0], pvforward ); + VectorCopy( cg.refdef.viewaxis[1], pvright ); + VectorCopy( cg.refdef.viewaxis[2], pvup ); + + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + roll += ((cg.time - oldtime) * 0.1) ; + rotate_ang[ROLL] += (roll*0.9); + AngleVectors ( rotate_ang, rforward, rright, rup); + + oldtime = cg.time; + + active = NULL; + tail = NULL; + + for (p=active_particles ; p ; p=next) + { + + next = p->next; + + time = (cg.time - p->time)*0.001; + + alpha = p->alpha + time*p->alphavel; + if (alpha <= 0) + { // faded out + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + continue; + } + + if (p->type == P_SMOKE || p->type == P_ANIM || p->type == P_BLEED || p->type == P_SMOKE_IMPACT) + { + if (cg.time > p->endtime) + { + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + + continue; + } + + } + + if (p->type == P_WEATHER_FLURRY) + { + if (cg.time > p->endtime) + { + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + + continue; + } + } + + + if (p->type == P_FLAT_SCALEUP_FADE) + { + if (cg.time > p->endtime) + { + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + continue; + } + + } + + if ((p->type == P_BAT || p->type == P_SPRITE) && p->endtime < 0) { + // temporary sprite + CG_AddParticleToScene (p, p->org, alpha); + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + continue; + } + + p->next = NULL; + if (!tail) + active = tail = p; + else + { + tail->next = p; + tail = p; + } + + if (alpha > 1.0) + alpha = 1; + + color = p->color; + + time2 = time*time; + + org[0] = p->org[0] + p->vel[0]*time + p->accel[0]*time2; + org[1] = p->org[1] + p->vel[1]*time + p->accel[1]*time2; + org[2] = p->org[2] + p->vel[2]*time + p->accel[2]*time2; + + type = p->type; + + CG_AddParticleToScene (p, org, alpha); + } + + active_particles = active; +} + +/* +====================== +CG_AddParticles +====================== +*/ +void CG_ParticleSnowFlurry (qhandle_t pshader, centity_t *cent) +{ + cparticle_t *p; + qboolean turb = qtrue; + + if (!pshader) + CG_Printf ("CG_ParticleSnowFlurry pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->color = 0; + p->alpha = 0.90f; + p->alphavel = 0; + + p->start = cent->currentState.origin2[0]; + p->end = cent->currentState.origin2[1]; + + p->endtime = cg.time + cent->currentState.time; + p->startfade = cg.time + cent->currentState.time2; + + p->pshader = pshader; + + if (rand()%100 > 90) + { + p->height = 32; + p->width = 32; + p->alpha = 0.10f; + } + else + { + p->height = 1; + p->width = 1; + } + + p->vel[2] = -20; + + p->type = P_WEATHER_FLURRY; + + if (turb) + p->vel[2] = -10; + + VectorCopy(cent->currentState.origin, p->org); + + p->org[0] = p->org[0]; + p->org[1] = p->org[1]; + p->org[2] = p->org[2]; + + p->vel[0] = p->vel[1] = 0; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[0] += cent->currentState.angles[0] * 32 + (crandom() * 16); + p->vel[1] += cent->currentState.angles[1] * 32 + (crandom() * 16); + p->vel[2] += cent->currentState.angles[2]; + + if (turb) + { + p->accel[0] = crandom () * 16; + p->accel[1] = crandom () * 16; + } + +} + +void CG_ParticleSnow (qhandle_t pshader, vec3_t origin, vec3_t origin2, int turb, float range, int snum) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleSnow pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->color = 0; + p->alpha = 0.40f; + p->alphavel = 0; + p->start = origin[2]; + p->end = origin2[2]; + p->pshader = pshader; + p->height = 1; + p->width = 1; + + p->vel[2] = -50; + + if (turb) + { + p->type = P_WEATHER_TURBULENT; + p->vel[2] = -50 * 1.3; + } + else + { + p->type = P_WEATHER; + } + + VectorCopy(origin, p->org); + + p->org[0] = p->org[0] + ( crandom() * range); + p->org[1] = p->org[1] + ( crandom() * range); + p->org[2] = p->org[2] + ( crandom() * (p->start - p->end)); + + p->vel[0] = p->vel[1] = 0; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + if (turb) + { + p->vel[0] = crandom() * 16; + p->vel[1] = crandom() * 16; + } + + // Rafael snow pvs check + p->snum = snum; + p->link = qtrue; + +} + +void CG_ParticleBubble (qhandle_t pshader, vec3_t origin, vec3_t origin2, int turb, float range, int snum) +{ + cparticle_t *p; + float randsize; + + if (!pshader) + CG_Printf ("CG_ParticleSnow pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->color = 0; + p->alpha = 0.40f; + p->alphavel = 0; + p->start = origin[2]; + p->end = origin2[2]; + p->pshader = pshader; + + randsize = 1 + (crandom() * 0.5); + + p->height = randsize; + p->width = randsize; + + p->vel[2] = 50 + ( crandom() * 10 ); + + if (turb) + { + p->type = P_BUBBLE_TURBULENT; + p->vel[2] = 50 * 1.3; + } + else + { + p->type = P_BUBBLE; + } + + VectorCopy(origin, p->org); + + p->org[0] = p->org[0] + ( crandom() * range); + p->org[1] = p->org[1] + ( crandom() * range); + p->org[2] = p->org[2] + ( crandom() * (p->start - p->end)); + + p->vel[0] = p->vel[1] = 0; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + if (turb) + { + p->vel[0] = crandom() * 4; + p->vel[1] = crandom() * 4; + } + + // Rafael snow pvs check + p->snum = snum; + p->link = qtrue; + +} + +void CG_ParticleSmoke (qhandle_t pshader, centity_t *cent) +{ + + // using cent->density = enttime + // cent->frame = startfade + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleSmoke == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + cent->currentState.time; + p->startfade = cg.time + cent->currentState.time2; + + p->color = 0; + p->alpha = 1.0; + p->alphavel = 0; + p->start = cent->currentState.origin[2]; + p->end = cent->currentState.origin2[2]; + p->pshader = pshader; + p->rotate = qfalse; + p->height = 8; + p->width = 8; + p->endheight = 32; + p->endwidth = 32; + p->type = P_SMOKE; + + VectorCopy(cent->currentState.origin, p->org); + + p->vel[0] = p->vel[1] = 0; + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[2] = 5; + + if (cent->currentState.frame == 1)// reverse gravity + p->vel[2] *= -1; + + p->roll = 8 + (crandom() * 4); +} + + +void CG_ParticleBulletDebris (vec3_t org, vec3_t vel, int duration) +{ + + cparticle_t *p; + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + duration; + p->startfade = cg.time + duration/2; + + p->color = EMISIVEFADE; + p->alpha = 1.0; + p->alphavel = 0; + + p->height = 0.5; + p->width = 0.5; + p->endheight = 0.5; + p->endwidth = 0.5; + + p->pshader = cgs.media.tracerShader; + + p->type = P_SMOKE; + + VectorCopy(org, p->org); + + p->vel[0] = vel[0]; + p->vel[1] = vel[1]; + p->vel[2] = vel[2]; + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->accel[2] = -60; + p->vel[2] += -20; + +} + +/* +====================== +CG_ParticleExplosion +====================== +*/ + +void CG_ParticleExplosion (char *animStr, vec3_t origin, vec3_t vel, int duration, int sizeStart, int sizeEnd) +{ + cparticle_t *p; + int anim; + + if (animStr < (char *)10) + CG_Error( "CG_ParticleExplosion: animStr is probably an index rather than a string" ); + + // find the animation string + for (anim=0; shaderAnimNames[anim]; anim++) { + if (!Q_stricmp( animStr, shaderAnimNames[anim] )) + break; + } + if (!shaderAnimNames[anim]) { + CG_Error("CG_ParticleExplosion: unknown animation string: %s\n", animStr); + return; + } + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 0.5; + p->alphavel = 0; + + if (duration < 0) { + duration *= -1; + p->roll = 0; + } else { + p->roll = crandom()*179; + } + + p->shaderAnim = anim; + + p->width = sizeStart; + p->height = sizeStart*shaderAnimSTRatio[anim]; // for sprites that are stretch in either direction + + p->endheight = sizeEnd; + p->endwidth = sizeEnd*shaderAnimSTRatio[anim]; + + p->endtime = cg.time + duration; + + p->type = P_ANIM; + + VectorCopy( origin, p->org ); + VectorCopy( vel, p->vel ); + VectorClear( p->accel ); + +} + +// Rafael Shrapnel +void CG_AddParticleShrapnel (localEntity_t *le) +{ + return; +} +// done. + +int CG_NewParticleArea (int num) +{ + // const char *str; + char *str; + char *token; + int type; + vec3_t origin, origin2; + int i; + float range = 0; + int turb; + int numparticles; + int snum; + + str = (char *) CG_ConfigString (num); + if (!str[0]) + return (0); + + // returns type 128 64 or 32 + token = COM_Parse (&str); + type = atoi (token); + + if (type == 1) + range = 128; + else if (type == 2) + range = 64; + else if (type == 3) + range = 32; + else if (type == 0) + range = 256; + else if (type == 4) + range = 8; + else if (type == 5) + range = 16; + else if (type == 6) + range = 32; + else if (type == 7) + range = 64; + + + for (i=0; i<3; i++) + { + token = COM_Parse (&str); + origin[i] = atof (token); + } + + for (i=0; i<3; i++) + { + token = COM_Parse (&str); + origin2[i] = atof (token); + } + + token = COM_Parse (&str); + numparticles = atoi (token); + + token = COM_Parse (&str); + turb = atoi (token); + + token = COM_Parse (&str); + snum = atoi (token); + + for (i=0; i= 4) + CG_ParticleBubble (cgs.media.waterBubbleShader, origin, origin2, turb, range, snum); + else + CG_ParticleSnow (cgs.media.waterBubbleShader, origin, origin2, turb, range, snum); + } + + return (1); +} + +void CG_SnowLink (centity_t *cent, qboolean particleOn) +{ + cparticle_t *p, *next; + int id; + + id = cent->currentState.frame; + + for (p=active_particles ; p ; p=next) + { + next = p->next; + + if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT) + { + if (p->snum == id) + { + if (particleOn) + p->link = qtrue; + else + p->link = qfalse; + } + } + + } +} + +void CG_ParticleImpactSmokePuff (qhandle_t pshader, vec3_t origin) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleImpactSmokePuff pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 0.25; + p->alphavel = 0; + p->roll = crandom()*179; + + p->pshader = pshader; + + p->endtime = cg.time + 1000; + p->startfade = cg.time + 100; + + p->width = rand()%4 + 8; + p->height = rand()%4 + 8; + + p->endheight = p->height *2; + p->endwidth = p->width * 2; + + p->endtime = cg.time + 500; + + p->type = P_SMOKE_IMPACT; + + VectorCopy( origin, p->org ); + VectorSet(p->vel, 0, 0, 20); + VectorSet(p->accel, 0, 0, 20); + + p->rotate = qtrue; +} + +void CG_Particle_Bleed (qhandle_t pshader, vec3_t start, vec3_t dir, int fleshEntityNum, int duration) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_Particle_Bleed pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + p->endtime = cg.time + duration; + + if (fleshEntityNum) + p->startfade = cg.time; + else + p->startfade = cg.time + 100; + + p->width = 4; + p->height = 4; + + p->endheight = 4+rand()%3; + p->endwidth = p->endheight; + + p->type = P_SMOKE; + + VectorCopy( start, p->org ); + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = -20; + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->color = BLOODRED; + p->alpha = 0.75; + +} + +void CG_Particle_OilParticle (qhandle_t pshader, centity_t *cent) +{ + cparticle_t *p; + + int time; + int time2; + float ratio; + + float duration = 1500; + + time = cg.time; + time2 = cg.time + cent->currentState.time; + + ratio =(float)1 - ((float)time / (float)time2); + + if (!pshader) + CG_Printf ("CG_Particle_OilParticle == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + p->endtime = cg.time + duration; + + p->startfade = p->endtime; + + p->width = 1; + p->height = 3; + + p->endheight = 3; + p->endwidth = 1; + + p->type = P_SMOKE; + + VectorCopy(cent->currentState.origin, p->org ); + + p->vel[0] = (cent->currentState.origin2[0] * (16 * ratio)); + p->vel[1] = (cent->currentState.origin2[1] * (16 * ratio)); + p->vel[2] = (cent->currentState.origin2[2]); + + p->snum = 1.0f; + + VectorClear( p->accel ); + + p->accel[2] = -20; + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + +} + + +void CG_Particle_OilSlick (qhandle_t pshader, centity_t *cent) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_Particle_OilSlick == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + if (cent->currentState.angles2[2]) + p->endtime = cg.time + cent->currentState.angles2[2]; + else + p->endtime = cg.time + 60000; + + p->startfade = p->endtime; + + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + if (cent->currentState.angles2[0] || cent->currentState.angles2[1]) + { + p->width = cent->currentState.angles2[0]; + p->height = cent->currentState.angles2[0]; + + p->endheight = cent->currentState.angles2[1]; + p->endwidth = cent->currentState.angles2[1]; + } + else + { + p->width = 8; + p->height = 8; + + p->endheight = 16; + p->endwidth = 16; + } + + p->type = P_FLAT_SCALEUP; + + p->snum = 1.0; + + VectorCopy(cent->currentState.origin, p->org ); + + p->org[2]+= 0.55 + (crandom() * 0.5); + + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = 0; + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + +} + +void CG_OilSlickRemove (centity_t *cent) +{ + cparticle_t *p, *next; + int id; + + id = 1.0f; + + if (!id) + CG_Printf ("CG_OilSlickRevove NULL id\n"); + + for (p=active_particles ; p ; p=next) + { + next = p->next; + + if (p->type == P_FLAT_SCALEUP) + { + if (p->snum == id) + { + p->endtime = cg.time + 100; + p->startfade = p->endtime; + p->type = P_FLAT_SCALEUP_FADE; + + } + } + + } +} + +qboolean ValidBloodPool (vec3_t start) +{ +#define EXTRUDE_DIST 0.5 + + vec3_t angles; + vec3_t right, up; + vec3_t this_pos, x_pos, center_pos, end_pos; + float x, y; + float fwidth, fheight; + trace_t trace; + vec3_t normal; + + fwidth = 16; + fheight = 16; + + VectorSet (normal, 0, 0, 1); + + vectoangles (normal, angles); + AngleVectors (angles, NULL, right, up); + + VectorMA (start, EXTRUDE_DIST, normal, center_pos); + + for (x= -fwidth/2; xendpos, start); + legit = ValidBloodPool (start); + + if (!legit) + return; + + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + 3000; + p->startfade = p->endtime; + + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + rndSize = 0.4 + random()*0.6; + + p->width = 8*rndSize; + p->height = 8*rndSize; + + p->endheight = 16*rndSize; + p->endwidth = 16*rndSize; + + p->type = P_FLAT_SCALEUP; + + VectorCopy(start, p->org ); + + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = 0; + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + + p->color = BLOODRED; +} + +#define NORMALSIZE 16 +#define LARGESIZE 32 + +void CG_ParticleBloodCloud (centity_t *cent, vec3_t origin, vec3_t dir) +{ + float length; + float dist; + float crittersize; + vec3_t angles, forward; + vec3_t point; + cparticle_t *p; + int i; + + dist = 0; + + length = VectorLength (dir); + vectoangles (dir, angles); + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors (angles, forward, NULL, NULL); + AngleVectorsForward( angles, forward ); + + crittersize = LARGESIZE; + + if (length) + dist = length / crittersize; + + if (dist < 1) + dist = 1; + + VectorCopy (origin, point); + + for (i=0; inext; + p->next = active_particles; + active_particles = p; + + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = cgs.media.smokePuffShader; + + p->endtime = cg.time + 350 + (crandom() * 100); + + p->startfade = cg.time; + + p->width = LARGESIZE; + p->height = LARGESIZE; + p->endheight = LARGESIZE; + p->endwidth = LARGESIZE; + + p->type = P_SMOKE; + + VectorCopy( origin, p->org ); + + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = -1; + + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->color = BLOODRED; + + p->alpha = 0.75; + + } + + +} + +void CG_ParticleSparks (vec3_t org, vec3_t vel, int duration, float x, float y, float speed) +{ + cparticle_t *p; + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + duration; + p->startfade = cg.time + duration/2; + + p->color = EMISIVEFADE; + p->alpha = 0.4f; + p->alphavel = 0; + + p->height = 0.5; + p->width = 0.5; + p->endheight = 0.5; + p->endwidth = 0.5; + + p->pshader = cgs.media.tracerShader; + + p->type = P_SMOKE; + + VectorCopy(org, p->org); + + p->org[0] += (crandom() * x); + p->org[1] += (crandom() * y); + + p->vel[0] = vel[0]; + p->vel[1] = vel[1]; + p->vel[2] = vel[2]; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[0] += (crandom() * 4); + p->vel[1] += (crandom() * 4); + p->vel[2] += (20 + (crandom() * 10)) * speed; + + p->accel[0] = crandom () * 4; + p->accel[1] = crandom () * 4; + +} + +//PKMOD - Ergodic 01/18/02 - re-sized sparks - now even bigger! +void CG_ParticleSparks2 (vec3_t org, vec3_t vel, int duration, float x, float y, float speed) +{ + cparticle_t *p; + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + duration; + p->startfade = cg.time + duration/2; + + p->color = EMISIVEFADE; + p->alpha = 0.4f; + p->alphavel = 0; + + p->height = 3.0; + p->width = 3.0; + p->endheight = 3.0; + p->endwidth = 3.0; + + p->pshader = cgs.media.pkagravitywellspark; + + p->type = P_SMOKE; + + VectorCopy(org, p->org); + + p->org[0] += (crandom() * x); + p->org[1] += (crandom() * y); + + p->vel[0] = vel[0]; + p->vel[1] = vel[1]; + p->vel[2] = vel[2]; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[0] += (crandom() * 4); + p->vel[1] += (crandom() * 4); + p->vel[2] += (20 + (crandom() * 10)) * speed; + + p->accel[0] = crandom () * 4; + p->accel[1] = crandom () * 4; + +} + + +//PKMOD - Ergodic 07/20/03 - particles for beartrap +void CG_ParticleSparks3 (vec3_t org, vec3_t vel, int duration, float x, float y, float speed) +{ + cparticle_t *p; + float ransize; + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + duration; + p->startfade = cg.time + duration/2; + + //PKMOD - Ergodic 09/22/03 - change color + p->color = EMISIVEFADE; +// p->color = GREY75; + p->alpha = 0.4f; + p->alphavel = 0; + + //PKMOD - Ergodic 10/15/03 - vary the size + ransize = 2.0 + 1.25 * random(); + p->height = ransize; + p->width = ransize; + p->endheight = 2.0; + p->endwidth = 2.0; + + switch ( rand() % 5 ) { //random numbers: { 0, 1, 2, 3, 4 } + case 0: + p->pshader = cgs.media.pkabeartrapspark1Shader; + break; + case 1: + p->pshader = cgs.media.pkabeartrapspark2Shader; + break; + case 2: + p->pshader = cgs.media.pkabeartrapspark3Shader; + break; + case 3: + p->pshader = cgs.media.pkabeartrapspark4Shader; + break; + default: + p->pshader = cgs.media.pkabeartrapspark5Shader; + break; + } + + //PKMOD - Ergodic 09/22/03 - change type + //p->type = P_SMOKE; + p->type = P_SMOKE_IMPACT; + + VectorCopy(org, p->org); + + p->org[0] += (crandom() * x); + p->org[1] += (crandom() * y); + + p->vel[0] = vel[0]; + p->vel[1] = vel[1]; + p->vel[2] = vel[2]; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[0] += (crandom() * 4); + p->vel[1] += (crandom() * 4); + p->vel[2] += (20 + (crandom() * 10)) * speed; + + p->accel[0] = crandom () * 4; + p->accel[1] = crandom () * 4; + +} + +void CG_ParticleDust (centity_t *cent, vec3_t origin, vec3_t dir) +{ + float length; + float dist; + float crittersize; + vec3_t angles, forward; + vec3_t point; + cparticle_t *p; + int i; + + dist = 0; + + VectorNegate (dir, dir); + length = VectorLength (dir); + vectoangles (dir, angles); + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors (angles, forward, NULL, NULL); + AngleVectorsForward( angles, forward ); + + crittersize = LARGESIZE; + + if (length) + dist = length / crittersize; + + if (dist < 1) + dist = 1; + + VectorCopy (origin, point); + + for (i=0; inext; + p->next = active_particles; + active_particles = p; + + p->time = cg.time; + p->alpha = 5.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = cgs.media.smokePuffShader; + + // RF, stay around for long enough to expand and dissipate naturally + if (length) + p->endtime = cg.time + 4500 + (crandom() * 3500); + else + p->endtime = cg.time + 750 + (crandom() * 500); + + p->startfade = cg.time; + + p->width = LARGESIZE; + p->height = LARGESIZE; + + // RF, expand while falling + p->endheight = LARGESIZE*3.0; + p->endwidth = LARGESIZE*3.0; + + if (!length) + { + p->width *= 0.2f; + p->height *= 0.2f; + + p->endheight = NORMALSIZE; + p->endwidth = NORMALSIZE; + } + + p->type = P_SMOKE; + + VectorCopy( point, p->org ); + + p->vel[0] = crandom()*6; + p->vel[1] = crandom()*6; + p->vel[2] = random()*20; + + // RF, add some gravity/randomness + p->accel[0] = crandom()*3; + p->accel[1] = crandom()*3; + p->accel[2] = -PARTICLE_GRAVITY*0.4; + + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + + } + + +} + +void CG_ParticleMisc (qhandle_t pshader, vec3_t origin, int size, int duration, float alpha) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleImpactSmokePuff pshader == ZERO!\n"); + + if (!free_particles) + return; + + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = rand()%179; + + p->pshader = pshader; + + if (duration > 0) + p->endtime = cg.time + duration; + else + p->endtime = duration; + + p->startfade = cg.time; + + p->width = size; + p->height = size; + + p->endheight = size; + p->endwidth = size; + + p->type = P_SPRITE; + + VectorCopy( origin, p->org ); + + p->rotate = qfalse; +} + diff --git a/quake3/source/code/cgame/cg_newdraw.c b/quake3/source/code/cgame/cg_newdraw.c new file mode 100644 index 0000000..f8d38cc --- /dev/null +++ b/quake3/source/code/cgame/cg_newdraw.c @@ -0,0 +1,2236 @@ + +//PKMOD - Ergodic 01/17/04 - Enable Hud Code +//#ifndef MISSIONPACK // bk001204 +//#error This file not be used for classic Q3A. +//#endif + +#include "cg_local.h" +#include "../ui/ui_shared.h" + +extern displayContextDef_t cgDC; + + +// set in CG_ParseTeamInfo + +//static int sortedTeamPlayers[TEAM_MAXOVERLAY]; +//static int numSortedTeamPlayers; +int drawTeamOverlayModificationCount = -1; + +//static char systemChat[256]; +//static char teamChat1[256]; +//static char teamChat2[256]; + +void CG_InitTeamChat() { + memset(teamChat1, 0, sizeof(teamChat1)); + memset(teamChat2, 0, sizeof(teamChat2)); + memset(systemChat, 0, sizeof(systemChat)); +} + +void CG_SetPrintString(int type, const char *p) { + if (type == SYSTEM_PRINT) { + strcpy(systemChat, p); + } else { + strcpy(teamChat2, teamChat1); + strcpy(teamChat1, p); + } +} + +void CG_CheckOrderPending() { + if (cgs.gametype < GT_CTF) { + return; + } + if (cgs.orderPending) { + //clientInfo_t *ci = cgs.clientinfo + sortedTeamPlayers[cg_currentSelectedPlayer.integer]; + const char *p1, *p2, *b; + p1 = p2 = b = NULL; + switch (cgs.currentOrder) { + case TEAMTASK_OFFENSE: + p1 = VOICECHAT_ONOFFENSE; + p2 = VOICECHAT_OFFENSE; + b = "+button7; wait; -button7"; + break; + case TEAMTASK_DEFENSE: + p1 = VOICECHAT_ONDEFENSE; + p2 = VOICECHAT_DEFEND; + b = "+button8; wait; -button8"; + break; + case TEAMTASK_PATROL: + p1 = VOICECHAT_ONPATROL; + p2 = VOICECHAT_PATROL; + b = "+button9; wait; -button9"; + break; + case TEAMTASK_FOLLOW: + p1 = VOICECHAT_ONFOLLOW; + p2 = VOICECHAT_FOLLOWME; + b = "+button10; wait; -button10"; + break; + case TEAMTASK_CAMP: + p1 = VOICECHAT_ONCAMPING; + p2 = VOICECHAT_CAMP; + break; + case TEAMTASK_RETRIEVE: + p1 = VOICECHAT_ONGETFLAG; + p2 = VOICECHAT_RETURNFLAG; + break; + case TEAMTASK_ESCORT: + p1 = VOICECHAT_ONFOLLOWCARRIER; + p2 = VOICECHAT_FOLLOWFLAGCARRIER; + break; + } + + if (cg_currentSelectedPlayer.integer == numSortedTeamPlayers) { + // to everyone + trap_SendConsoleCommand(va("cmd vsay_team %s\n", p2)); + } else { + // for the player self + if (sortedTeamPlayers[cg_currentSelectedPlayer.integer] == cg.snap->ps.clientNum && p1) { + trap_SendConsoleCommand(va("teamtask %i\n", cgs.currentOrder)); + //trap_SendConsoleCommand(va("cmd say_team %s\n", p2)); + trap_SendConsoleCommand(va("cmd vsay_team %s\n", p1)); + } else if (p2) { + //trap_SendConsoleCommand(va("cmd say_team %s, %s\n", ci->name,p)); + trap_SendConsoleCommand(va("cmd vtell %d %s\n", sortedTeamPlayers[cg_currentSelectedPlayer.integer], p2)); + } + } + if (b) { + trap_SendConsoleCommand(b); + } + cgs.orderPending = qfalse; + } +} + +//PKMOD - Ergodic 02/08/04 - get maximum weapon ammo +// NOTES - these value should be in sync with void Add_Ammo in g_items.c + +int CG_GetMaxAmmo( int weapon) { + switch( weapon ) { + case WP_GAUNTLET: //weapon 1 + return (-1); + break; + case WP_MACHINEGUN: //weapon 2 + return (200); + break; + case WP_SHOTGUN: //weapon 3 + return (200); + break; + case WP_AIRFIST : //weapon 4 + return (4); + break; + case WP_NAILGUN : //weapon 5 + return (200); + break; + case WP_GRENADE_LAUNCHER: //weapon 6 + return (200); + break; + case WP_ROCKET_LAUNCHER: //weapon 7 + return (200); + break; + case WP_LIGHTNING: //weapon 8 + return (200); + break; + case WP_RAILGUN: //weapon 9 + return (200); + break; + case WP_GRAPPLING_HOOK: //weapon 10 + return (-1); + break; + case WP_GRAVITY: //weapon 11 + return (1); + break; + case WP_SENTRY: //weapon 12 + return (3); + break; + case WP_BEARTRAP: //weapon 13 + return (3); + break; + case WP_BEANS: //weapon 14 + return (1); + break; + case WP_EXPLODING_SHELLS: //weapon 15 + return (10); + break; + + default: + return (1); //this should never happen + break; + } +} + + +static void CG_SetSelectedPlayerName() { + if (cg_currentSelectedPlayer.integer >= 0 && cg_currentSelectedPlayer.integer < numSortedTeamPlayers) { + clientInfo_t *ci = cgs.clientinfo + sortedTeamPlayers[cg_currentSelectedPlayer.integer]; + if (ci) { + trap_Cvar_Set("cg_selectedPlayerName", ci->name); + trap_Cvar_Set("cg_selectedPlayer", va("%d", sortedTeamPlayers[cg_currentSelectedPlayer.integer])); + cgs.currentOrder = ci->teamTask; + } + } else { + trap_Cvar_Set("cg_selectedPlayerName", "Everyone"); + } +} +int CG_GetSelectedPlayer() { + if (cg_currentSelectedPlayer.integer < 0 || cg_currentSelectedPlayer.integer >= numSortedTeamPlayers) { + cg_currentSelectedPlayer.integer = 0; + } + return cg_currentSelectedPlayer.integer; +} + +void CG_SelectNextPlayer() { + CG_CheckOrderPending(); + if (cg_currentSelectedPlayer.integer >= 0 && cg_currentSelectedPlayer.integer < numSortedTeamPlayers) { + cg_currentSelectedPlayer.integer++; + } else { + cg_currentSelectedPlayer.integer = 0; + } + CG_SetSelectedPlayerName(); +} + +void CG_SelectPrevPlayer() { + CG_CheckOrderPending(); + if (cg_currentSelectedPlayer.integer > 0 && cg_currentSelectedPlayer.integer < numSortedTeamPlayers) { + cg_currentSelectedPlayer.integer--; + } else { + cg_currentSelectedPlayer.integer = numSortedTeamPlayers; + } + CG_SetSelectedPlayerName(); +} + + +static void CG_DrawPlayerArmorIcon( rectDef_t *rect, qboolean draw2D ) { + centity_t *cent; + playerState_t *ps; + vec3_t angles; + vec3_t origin; + + if ( cg_drawStatus.integer == 0 ) { + return; + } + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + if ( draw2D || ( !cg_draw3dIcons.integer && cg_drawIcons.integer) ) { // bk001206 - parentheses + CG_DrawPic( rect->x, rect->y + rect->h/2 + 1, rect->w, rect->h, cgs.media.armorIcon ); + } else if (cg_draw3dIcons.integer) { + VectorClear( angles ); + origin[0] = 90; + origin[1] = 0; + origin[2] = -10; + angles[YAW] = ( cg.time & 2047 ) * 360 / 2048.0; + + CG_Draw3DModel( rect->x, rect->y, rect->w, rect->h, cgs.media.armorModel, 0, origin, angles ); + } + +} + +static void CG_DrawPlayerArmorValue(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + char num[16]; + int value; + centity_t *cent; + playerState_t *ps; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + value = ps->stats[STAT_ARMOR]; + + + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", value); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } +} + +#ifndef MISSIONPACK // bk001206 +static float healthColors[4][4] = { +// { 0.2, 1.0, 0.2, 1.0 } , { 1.0, 0.2, 0.2, 1.0 }, {0.5, 0.5, 0.5, 1} }; + // bk0101016 - float const + { 1.0f, 0.69f, 0.0f, 1.0f } , // normal + { 1.0f, 0.2f, 0.2f, 1.0f }, // low health + { 0.5f, 0.5f, 0.5f, 1.0f}, // weapon firing + { 1.0f, 1.0f, 1.0f, 1.0f } }; // health > 100 +#endif + +static void CG_DrawPlayerAmmoIcon( rectDef_t *rect, qboolean draw2D ) { + centity_t *cent; + playerState_t *ps; + vec3_t angles; + vec3_t origin; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + if ( draw2D || (!cg_draw3dIcons.integer && cg_drawIcons.integer) ) { // bk001206 - parentheses + qhandle_t icon; + icon = cg_weapons[ cg.predictedPlayerState.weapon ].ammoIcon; + if ( icon ) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, icon ); + } + } else if (cg_draw3dIcons.integer) { + if ( cent->currentState.weapon && cg_weapons[ cent->currentState.weapon ].ammoModel ) { + VectorClear( angles ); + origin[0] = 70; + origin[1] = 0; + origin[2] = 0; + angles[YAW] = 90 + 20 * sin( cg.time / 1000.0 ); + CG_Draw3DModel( rect->x, rect->y, rect->w, rect->h, cg_weapons[ cent->currentState.weapon ].ammoModel, 0, origin, angles ); + } + } +} + +static void CG_DrawPlayerAmmoValue(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + char num[16]; + int value; + centity_t *cent; + playerState_t *ps; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + if ( cent->currentState.weapon ) { + value = ps->ammo[cent->currentState.weapon]; + if ( value > -1 ) { + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", value); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } + } + } + +} + +//PKMOD - ergodic 02/07/04 - add horizontal meters for ammo +//Meter: Horizontal Right to Left fill +static void CG_DrawPlayerAmmoMeter_HR2L(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + float value; + float rectx; + float rectw; + int max_value; + centity_t *cent; + playerState_t *ps; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + if ( cent->currentState.weapon ) { + max_value = CG_GetMaxAmmo( cent->currentState.weapon ); + if ( max_value < 0 ) + value = 1; + else { + //force a float value + value = ps->ammo[cent->currentState.weapon]; + value = value / max_value; + } + + if (shader) { + rectx = rect->x + rect->w * ( 1 - value ); + rectw = rect->w * value; + trap_R_SetColor( color ); + CG_DrawPic(rectx, rect->y, rectw, rect->h, shader); + trap_R_SetColor( NULL ); + } + } +} + +//PKMOD - ergodic 02/07/04 - add horizontal meters for ammo +//Meter: Horizontal Left to Right fill +static void CG_DrawPlayerAmmoMeter_HL2R(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + float value; + float rectw; + int max_value; + centity_t *cent; + playerState_t *ps; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + if ( cent->currentState.weapon ) { + max_value = CG_GetMaxAmmo( cent->currentState.weapon ); + if ( max_value < 0 ) + value = 1; + else { + //force a float value + value = ps->ammo[cent->currentState.weapon]; + value = value / max_value; + } + + if (shader) { + rectw = rect->w * value; + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rectw, rect->h, shader); + trap_R_SetColor( NULL ); + } + } +} + +//PKMOD - ergodic 02/08/04 - add horizontal meters for armor +//Meter: Horizontal Right to Left fill +static void CG_DrawPlayerArmorMeter_HR2L(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + float value; + float rectx; + float rectw; + centity_t *cent; + playerState_t *ps; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + //force a float value + value = ps->stats[STAT_ARMOR]; + value = value / 200; + + if (shader) { + rectx = rect->x + rect->w * ( 1 - value ); + rectw = rect->w * value; + trap_R_SetColor( color ); + CG_DrawPic(rectx, rect->y, rectw, rect->h, shader); + trap_R_SetColor( NULL ); + } +} + +//PKMOD - ergodic 02/07/04 - add horizontal meters for armor +//Meter: Horizontal Left to Right fill +static void CG_DrawPlayerArmorMeter_HL2R(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + float value; + float rectw; + centity_t *cent; + playerState_t *ps; + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + //force a float value + value = ps->stats[STAT_ARMOR]; + value = value / 200; + + if (shader) { + rectw = rect->w * value; + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rectw, rect->h, shader); + trap_R_SetColor( NULL ); + } +} + + +static void CG_DrawPlayerHead(rectDef_t *rect, qboolean draw2D) { + vec3_t angles; + float size, stretch; + float frac; + float x = rect->x; + + VectorClear( angles ); + + if ( cg.damageTime && cg.time - cg.damageTime < DAMAGE_TIME ) { + frac = (float)(cg.time - cg.damageTime ) / DAMAGE_TIME; + size = rect->w * 1.25 * ( 1.5 - frac * 0.5 ); + + stretch = size - rect->w * 1.25; + // kick in the direction of damage + x -= stretch * 0.5 + cg.damageX * stretch * 0.5; + + cg.headStartYaw = 180 + cg.damageX * 45; + + cg.headEndYaw = 180 + 20 * cos( crandom()*M_PI ); + cg.headEndPitch = 5 * cos( crandom()*M_PI ); + + cg.headStartTime = cg.time; + cg.headEndTime = cg.time + 100 + random() * 2000; + } else { + if ( cg.time >= cg.headEndTime ) { + // select a new head angle + cg.headStartYaw = cg.headEndYaw; + cg.headStartPitch = cg.headEndPitch; + cg.headStartTime = cg.headEndTime; + cg.headEndTime = cg.time + 100 + random() * 2000; + + cg.headEndYaw = 180 + 20 * cos( crandom()*M_PI ); + cg.headEndPitch = 5 * cos( crandom()*M_PI ); + } + + size = rect->w * 1.25; + } + + // if the server was frozen for a while we may have a bad head start time + if ( cg.headStartTime > cg.time ) { + cg.headStartTime = cg.time; + } + + frac = ( cg.time - cg.headStartTime ) / (float)( cg.headEndTime - cg.headStartTime ); + frac = frac * frac * ( 3 - 2 * frac ); + angles[YAW] = cg.headStartYaw + ( cg.headEndYaw - cg.headStartYaw ) * frac; + angles[PITCH] = cg.headStartPitch + ( cg.headEndPitch - cg.headStartPitch ) * frac; + + CG_DrawHead( x, rect->y, rect->w, rect->h, cg.snap->ps.clientNum, angles ); +} + +static void CG_DrawSelectedPlayerHealth( rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + clientInfo_t *ci; + int value; + char num[16]; + + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + if (ci) { + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", ci->health); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } + } +} + +static void CG_DrawSelectedPlayerArmor( rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + clientInfo_t *ci; + int value; + char num[16]; + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + if (ci) { + if (ci->armor > 0) { + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", ci->armor); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } + } + } +} + +qhandle_t CG_StatusHandle(int task) { + qhandle_t h = cgs.media.assaultShader; + switch (task) { + case TEAMTASK_OFFENSE : + h = cgs.media.assaultShader; + break; + case TEAMTASK_DEFENSE : + h = cgs.media.defendShader; + break; + case TEAMTASK_PATROL : + h = cgs.media.patrolShader; + break; + case TEAMTASK_FOLLOW : + h = cgs.media.followShader; + break; + case TEAMTASK_CAMP : + h = cgs.media.campShader; + break; + case TEAMTASK_RETRIEVE : + h = cgs.media.retrieveShader; + break; + case TEAMTASK_ESCORT : + h = cgs.media.escortShader; + break; + default : + h = cgs.media.assaultShader; + break; + } + return h; +} + +static void CG_DrawSelectedPlayerStatus( rectDef_t *rect ) { + clientInfo_t *ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + if (ci) { + qhandle_t h; + if (cgs.orderPending) { + // blink the icon + if ( cg.time > cgs.orderTime - 2500 && (cg.time >> 9 ) & 1 ) { + return; + } + h = CG_StatusHandle(cgs.currentOrder); + } else { + h = CG_StatusHandle(ci->teamTask); + } + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, h ); + } +} + + +static void CG_DrawPlayerStatus( rectDef_t *rect ) { + clientInfo_t *ci = &cgs.clientinfo[cg.snap->ps.clientNum]; + if (ci) { + qhandle_t h = CG_StatusHandle(ci->teamTask); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, h); + } +} + + +static void CG_DrawSelectedPlayerName( rectDef_t *rect, float scale, vec4_t color, qboolean voice, int textStyle) { + clientInfo_t *ci; + ci = cgs.clientinfo + ((voice) ? cgs.currentVoiceClient : sortedTeamPlayers[CG_GetSelectedPlayer()]); + if (ci) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, ci->name, 0, 0, textStyle); + } +} + +static void CG_DrawSelectedPlayerLocation( rectDef_t *rect, float scale, vec4_t color, int textStyle ) { + clientInfo_t *ci; + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + if (ci) { + const char *p = CG_ConfigString(CS_LOCATIONS + ci->location); + if (!p || !*p) { + p = "unknown"; + } + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, p, 0, 0, textStyle); + } +} + +static void CG_DrawPlayerLocation( rectDef_t *rect, float scale, vec4_t color, int textStyle ) { + clientInfo_t *ci = &cgs.clientinfo[cg.snap->ps.clientNum]; + if (ci) { + const char *p = CG_ConfigString(CS_LOCATIONS + ci->location); + if (!p || !*p) { + p = "unknown"; + } + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, p, 0, 0, textStyle); + } +} + + + +static void CG_DrawSelectedPlayerWeapon( rectDef_t *rect ) { + clientInfo_t *ci; + + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + if (ci) { + if ( cg_weapons[ci->curWeapon].weaponIcon ) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cg_weapons[ci->curWeapon].weaponIcon ); + } else { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.deferShader); + } + } +} + +//PKMOD - Ergodic 02/08/04 - add relative score value to the HUD's gauges +static void CG_DrawPlayerRelativeScore( rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + char num[16]; + int value; + + + if ( cg.snap->ps.persistant[PERS_SCORE] == cgs.scores1 ) { + //PKMOD - Ergodic 02/09/04 - debug wackie scores when respawn into game (inactive) + //Com_Printf( "RelativeScore - if " ); + //check if there is a scond place score... + if ( cgs.scores2 == SCORE_NOT_PRESENT ) + value = cg.snap->ps.persistant[PERS_SCORE]; + else + value = cg.snap->ps.persistant[PERS_SCORE] - cgs.scores2; + } else { + //PKMOD - Ergodic 02/09/04 - debug wackie scores when respawn into game (inactive) + //Com_Printf( "RelativeScore - else " ); + value = cg.snap->ps.persistant[PERS_SCORE] - cgs.scores1; + } + + //PKMOD - Ergodic 02/09/04 - debug wackie scores when respawn into game (inactive) + //Com_Printf( "- pers_score>%d<, score1>%d<, score2>%d<, value>%d<\n", cg.snap->ps.persistant[PERS_SCORE], cgs.scores1, cgs.scores2, value); + + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", value); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } +} + +static void CG_DrawPlayerScore( rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + char num[16]; + int value = cg.snap->ps.persistant[PERS_SCORE]; + + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", value); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } +} + +static void CG_DrawPlayerItem( rectDef_t *rect, float scale, qboolean draw2D) { + //int value; //PKMOD - Ergodic 02/01/04 - remove original code + //vec3_t origin, angles; //PKMOD - Ergodic 02/01/04 - remove original code + int i; + int holdable_index; + int y; + +//>>>>>> + // value = cg.snap->ps.stats[STAT_HOLDABLE_ITEM]; +// CG_RegisterItemVisuals( value ); + + //MOdify the code to handle more than one holdable in possession + if ( cg.snap->ps.stats[STAT_HOLDABLE_ITEM] ) { + //PKMOD - Ergodic 10/13/01 - move holdable icons higher up on the screen + // change start height from 1/2 to 1/4 from top of screen + // y = (SCREEN_HEIGHT-ICON_SIZE_SMALL)/2; + y = (SCREEN_HEIGHT-ICON_SIZE_SMALL)/4; + holdable_index = cg.snap->ps.stats[STAT_ACTIVE_HOLDABLE]; + for (i = 1; i < HI_NUM_HOLDABLE; i++) { + if ( cg.snap->ps.stats[STAT_HOLDABLE_ITEM] & ( 1 << holdable_index ) ) { + //PKMOD - Ergodic 12/07/01 - display Private Bot pieces as only one Icon + if ( ( holdable_index < HI_BOTLEGS ) || ( holdable_index > HI_BOTHEAD )) { + //only display valid holdables + if ( holdable_index < HI_NUM_HOLDABLE ) { + CG_RegisterItemVisuals( cg_holdable[holdable_index] ); + CG_DrawPic( 640-ICON_SIZE, y, ICON_SIZE_SMALL, ICON_SIZE_SMALL, cg_items[ cg_holdable[holdable_index] ].icon ); + } + //get next y offset + y += 1.2 * ICON_SIZE_SMALL; + } + } + //PKMOD - Ergodic 12/07/01 - now at end of Private Bot pieces list - then display + if ( holdable_index == HI_BOTHEAD ) { + //PKMOD - Ergodic 12/07/01 - hold private bot parts + int pribot_parts; + qhandle_t pribotIcon; + + pribot_parts = cg.snap->ps.stats[STAT_HOLDABLE_ITEM] & ( 7 << HI_BOTLEGS ); + if ( pribot_parts ) { + //encoding bits (LEGS TORSO HEAD) + switch ( pribot_parts >> HI_BOTLEGS ) { + case 1: + pribotIcon = cgs.media.pkapribot_100Icon; + break; + case 2: + pribotIcon = cgs.media.pkapribot_010Icon; + break; + case 3: + pribotIcon = cgs.media.pkapribot_110Icon; + break; + case 4: + pribotIcon = cgs.media.pkapribot_001Icon; + break; + case 5: + pribotIcon = cgs.media.pkapribot_101Icon; + break; + case 6: + pribotIcon = cgs.media.pkapribot_011Icon; + break; + case 7: + pribotIcon = cgs.media.pkapribot_111Icon; + break; + } + CG_DrawPic( 640-ICON_SIZE, y, ICON_SIZE_SMALL, ICON_SIZE_SMALL, pribotIcon ); + //get next y offset + y += 1.2 * ICON_SIZE_SMALL; + } + } + + //set next index, wrap around if at the end of the list + holdable_index = holdable_index + 1; + if ( holdable_index >= HI_NUM_HOLDABLE ) + holdable_index = 1; + + } + } + +//>>>>>> +/* PKMOD - Ergodic 02/01/04 - remove original code + value = cg.snap->ps.stats[STAT_HOLDABLE_ITEM]; + if ( value ) { + CG_RegisterItemVisuals( value ); + + if (qtrue) { + CG_RegisterItemVisuals( value ); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cg_items[ value ].icon ); + } else { + VectorClear( angles ); + origin[0] = 90; + origin[1] = 0; + origin[2] = -10; + angles[YAW] = ( cg.time & 2047 ) * 360 / 2048.0; + CG_Draw3DModel(rect->x, rect->y, rect->w, rect->h, cg_items[ value ].models[0], 0, origin, angles ); + } + } +*/ + +} + + +static void CG_DrawSelectedPlayerPowerup( rectDef_t *rect, qboolean draw2D ) { + clientInfo_t *ci; + int j; + float x, y; + + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + if (ci) { + x = rect->x; + y = rect->y; + + for (j = 0; j < PW_NUM_POWERUPS; j++) { + if (ci->powerups & (1 << j)) { + gitem_t *item; + item = BG_FindItemForPowerup( j ); + if (item) { + CG_DrawPic( x, y, rect->w, rect->h, trap_R_RegisterShader( item->icon ) ); + x += 3; + y += 3; + return; + } + } + } + + } +} + + +static void CG_DrawSelectedPlayerHead( rectDef_t *rect, qboolean draw2D, qboolean voice ) { + clipHandle_t cm; + clientInfo_t *ci; + float len; + vec3_t origin; + vec3_t mins, maxs, angles; + + + ci = cgs.clientinfo + ((voice) ? cgs.currentVoiceClient : sortedTeamPlayers[CG_GetSelectedPlayer()]); + + if (ci) { + if ( cg_draw3dIcons.integer ) { + cm = ci->headModel; + if ( !cm ) { + return; + } + + // offset the origin y and z to center the head + trap_R_ModelBounds( cm, mins, maxs ); + + origin[2] = -0.5 * ( mins[2] + maxs[2] ); + origin[1] = 0.5 * ( mins[1] + maxs[1] ); + + // calculate distance so the head nearly fills the box + // assume heads are taller than wide + len = 0.7 * ( maxs[2] - mins[2] ); + origin[0] = len / 0.268; // len / tan( fov/2 ) + + // allow per-model tweaking + VectorAdd( origin, ci->headOffset, origin ); + + angles[PITCH] = 0; + angles[YAW] = 180; + angles[ROLL] = 0; + + CG_Draw3DModel( rect->x, rect->y, rect->w, rect->h, ci->headModel, ci->headSkin, origin, angles ); + } else if ( cg_drawIcons.integer ) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, ci->modelIcon ); + } + + // if they are deferred, draw a cross out + if ( ci->deferred ) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.deferShader ); + } + } + +} + + +static void CG_DrawPlayerHealth(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + playerState_t *ps; + int value; + char num[16]; + + ps = &cg.snap->ps; + + value = ps->stats[STAT_HEALTH]; + + if (shader) { + trap_R_SetColor( color ); + CG_DrawPic(rect->x, rect->y, rect->w, rect->h, shader); + trap_R_SetColor( NULL ); + } else { + Com_sprintf (num, sizeof(num), "%i", value); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h, scale, color, num, 0, 0, textStyle); + } +} + + +static void CG_DrawRedScore(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + int value; + char num[16]; + if ( cgs.scores1 == SCORE_NOT_PRESENT ) { + Com_sprintf (num, sizeof(num), "-"); + } + else { + Com_sprintf (num, sizeof(num), "%i", cgs.scores1); + } + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + rect->w - value, rect->y + rect->h, scale, color, num, 0, 0, textStyle); +} + +static void CG_DrawBlueScore(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + int value; + char num[16]; + + if ( cgs.scores2 == SCORE_NOT_PRESENT ) { + Com_sprintf (num, sizeof(num), "-"); + } + else { + Com_sprintf (num, sizeof(num), "%i", cgs.scores2); + } + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + rect->w - value, rect->y + rect->h, scale, color, num, 0, 0, textStyle); +} + +// FIXME: team name support +static void CG_DrawRedName(rectDef_t *rect, float scale, vec4_t color, int textStyle ) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, cg_redTeamName.string , 0, 0, textStyle); +} + +static void CG_DrawBlueName(rectDef_t *rect, float scale, vec4_t color, int textStyle ) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, cg_blueTeamName.string, 0, 0, textStyle); +} + +static void CG_DrawBlueFlagName(rectDef_t *rect, float scale, vec4_t color, int textStyle ) { + int i; + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + if ( cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_RED && cgs.clientinfo[i].powerups & ( 1<< PW_BLUEFLAG )) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, cgs.clientinfo[i].name, 0, 0, textStyle); + return; + } + } +} + +static void CG_DrawBlueFlagStatus(rectDef_t *rect, qhandle_t shader) { + if (cgs.gametype != GT_CTF && cgs.gametype != GT_1FCTF) { + if (cgs.gametype == GT_HARVESTER) { + vec4_t color = {0, 0, 1, 1}; + trap_R_SetColor(color); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.blueCubeIcon ); + trap_R_SetColor(NULL); + } + return; + } + if (shader) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, shader ); + } else { + gitem_t *item = BG_FindItemForPowerup( PW_BLUEFLAG ); + if (item) { + vec4_t color = {0, 0, 1, 1}; + trap_R_SetColor(color); + if( cgs.blueflag >= 0 && cgs.blueflag <= 2 ) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.flagShaders[cgs.blueflag] ); + } else { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.flagShaders[0] ); + } + trap_R_SetColor(NULL); + } + } +} + +static void CG_DrawBlueFlagHead(rectDef_t *rect) { + int i; + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + if ( cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_RED && cgs.clientinfo[i].powerups & ( 1<< PW_BLUEFLAG )) { + vec3_t angles; + VectorClear( angles ); + angles[YAW] = 180 + 20 * sin( cg.time / 650.0 );; + CG_DrawHead( rect->x, rect->y, rect->w, rect->h, 0,angles ); + return; + } + } +} + +static void CG_DrawRedFlagName(rectDef_t *rect, float scale, vec4_t color, int textStyle ) { + int i; + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + if ( cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_BLUE && cgs.clientinfo[i].powerups & ( 1<< PW_REDFLAG )) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, cgs.clientinfo[i].name, 0, 0, textStyle); + return; + } + } +} + +static void CG_DrawRedFlagStatus(rectDef_t *rect, qhandle_t shader) { + if (cgs.gametype != GT_CTF && cgs.gametype != GT_1FCTF) { + if (cgs.gametype == GT_HARVESTER) { + vec4_t color = {1, 0, 0, 1}; + trap_R_SetColor(color); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.redCubeIcon ); + trap_R_SetColor(NULL); + } + return; + } + if (shader) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, shader ); + } else { + gitem_t *item = BG_FindItemForPowerup( PW_REDFLAG ); + if (item) { + vec4_t color = {1, 0, 0, 1}; + trap_R_SetColor(color); + if( cgs.redflag >= 0 && cgs.redflag <= 2) { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.flagShaders[cgs.redflag] ); + } else { + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.flagShaders[0] ); + } + trap_R_SetColor(NULL); + } + } +} + +static void CG_DrawRedFlagHead(rectDef_t *rect) { + int i; + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + if ( cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_BLUE && cgs.clientinfo[i].powerups & ( 1<< PW_REDFLAG )) { + vec3_t angles; + VectorClear( angles ); + angles[YAW] = 180 + 20 * sin( cg.time / 650.0 );; + CG_DrawHead( rect->x, rect->y, rect->w, rect->h, 0,angles ); + return; + } + } +} + +static void CG_HarvesterSkulls(rectDef_t *rect, float scale, vec4_t color, qboolean force2D, int textStyle ) { + char num[16]; + vec3_t origin, angles; + qhandle_t handle; + int value = cg.snap->ps.generic1; + + if (cgs.gametype != GT_HARVESTER) { + return; + } + + if( value > 99 ) { + value = 99; + } + + Com_sprintf (num, sizeof(num), "%i", value); + value = CG_Text_Width(num, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value), rect->y + rect->h, scale, color, num, 0, 0, textStyle); + + if (cg_drawIcons.integer) { + if (!force2D && cg_draw3dIcons.integer) { + VectorClear(angles); + origin[0] = 90; + origin[1] = 0; + origin[2] = -10; + angles[YAW] = ( cg.time & 2047 ) * 360 / 2048.0; + if( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) { + handle = cgs.media.redCubeModel; + } else { + handle = cgs.media.blueCubeModel; + } + CG_Draw3DModel( rect->x, rect->y, 35, 35, handle, 0, origin, angles ); + } else { + if( cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE ) { + handle = cgs.media.redCubeIcon; + } else { + handle = cgs.media.blueCubeIcon; + } + CG_DrawPic( rect->x + 3, rect->y + 16, 20, 20, handle ); + } + } +} + +static void CG_OneFlagStatus(rectDef_t *rect) { + if (cgs.gametype != GT_1FCTF) { + return; + } else { + gitem_t *item = BG_FindItemForPowerup( PW_NEUTRALFLAG ); + if (item) { + if( cgs.flagStatus >= 0 && cgs.flagStatus <= 4 ) { + vec4_t color = {1, 1, 1, 1}; + int index = 0; + if (cgs.flagStatus == FLAG_TAKEN_RED) { + color[1] = color[2] = 0; + index = 1; + } else if (cgs.flagStatus == FLAG_TAKEN_BLUE) { + color[0] = color[1] = 0; + index = 1; + } else if (cgs.flagStatus == FLAG_DROPPED) { + index = 2; + } + trap_R_SetColor(color); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.flagShaders[index] ); + } + } + } +} + + +//PKMOD - Ergodic 01/28/04 - Dynamic HUD activation: Ignore this code since PKA does not have TA type of powerups +/* +static void CG_DrawCTFPowerUp(rectDef_t *rect) { + int value; + + if (cgs.gametype < GT_CTF) { + return; + } + value = cg.snap->ps.stats[STAT_PERSISTANT_POWERUP]; + if ( value ) { + CG_RegisterItemVisuals( value ); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cg_items[ value ].icon ); + } +} +*/ + + +static void CG_DrawTeamColor(rectDef_t *rect, vec4_t color) { + CG_DrawTeamBackground(rect->x, rect->y, rect->w, rect->h, color[3], cg.snap->ps.persistant[PERS_TEAM]); +} + +static void CG_DrawAreaPowerUp(rectDef_t *rect, int align, float special, float scale, vec4_t color) { + char num[16]; + int sorted[MAX_POWERUPS]; + int sortedTime[MAX_POWERUPS]; + int i, j, k; + int active; + playerState_t *ps; + int t; + gitem_t *item; + float f; + rectDef_t r2; + float *inc; + r2.x = rect->x; + r2.y = rect->y; + r2.w = rect->w; + r2.h = rect->h; + + inc = (align == HUD_VERTICAL) ? &r2.y : &r2.x; + + ps = &cg.snap->ps; + + if ( ps->stats[STAT_HEALTH] <= 0 ) { + return; + } + + // sort the list by time remaining + active = 0; + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { + if ( !ps->powerups[ i ] ) { + continue; + } + t = ps->powerups[ i ] - cg.time; + // ZOID--don't draw if the power up has unlimited time (999 seconds) + // This is true of the CTF flags + if ( t <= 0 || t >= 999000) { + continue; + } + + // insert into the list + for ( j = 0 ; j < active ; j++ ) { + if ( sortedTime[j] >= t ) { + for ( k = active - 1 ; k >= j ; k-- ) { + sorted[k+1] = sorted[k]; + sortedTime[k+1] = sortedTime[k]; + } + break; + } + } + sorted[j] = i; + sortedTime[j] = t; + active++; + } + + // draw the icons and timers + for ( i = 0 ; i < active ; i++ ) { + + //PKMOD - Ergodic - 02/25/04 - add cases for HOLDABLE POWERUPs + if ( sorted[i] == PW_RADIATE ) { + item = BG_FindItemForHoldable( HI_RADIATE ); + } else if ( sorted[i] == PW_PERSENTRY ) { + item = BG_FindItemForHoldable( HI_PERSENTRY ); + } else + item = BG_FindItemForPowerup( sorted[i] ); + + if (item) { + t = ps->powerups[ sorted[i] ]; + if ( t - cg.time >= POWERUP_BLINKS * POWERUP_BLINK_TIME ) { + trap_R_SetColor( NULL ); + } else { + vec4_t modulate; + + f = (float)( t - cg.time ) / POWERUP_BLINK_TIME; + f -= (int)f; + modulate[0] = modulate[1] = modulate[2] = modulate[3] = f; + trap_R_SetColor( modulate ); + } + + CG_DrawPic( r2.x, r2.y, r2.w * .75, r2.h, trap_R_RegisterShader( item->icon ) ); + + Com_sprintf (num, sizeof(num), "%i", sortedTime[i] / 1000); + CG_Text_Paint(r2.x + (r2.w * .75) + 3 , r2.y + r2.h, scale, color, num, 0, 0, 0); + *inc += r2.w + special; + } + + } + trap_R_SetColor( NULL ); + +} + +float CG_GetValue(int ownerDraw) { + centity_t *cent; + clientInfo_t *ci; + playerState_t *ps; + + //PKMOD - ergodic 02/07/04 - for use in meteres +// int max_value; + + + cent = &cg_entities[cg.snap->ps.clientNum]; + ps = &cg.snap->ps; + + switch (ownerDraw) { + case CG_SELECTEDPLAYER_ARMOR: + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + return ci->armor; + break; + case CG_SELECTEDPLAYER_HEALTH: + ci = cgs.clientinfo + sortedTeamPlayers[CG_GetSelectedPlayer()]; + return ci->health; + break; + case CG_PLAYER_ARMOR_VALUE: + return ps->stats[STAT_ARMOR]; + break; + case CG_PLAYER_AMMO_VALUE: + if ( cent->currentState.weapon ) { + return ps->ammo[cent->currentState.weapon]; + } + break; + case CG_PLAYER_SCORE: + return cg.snap->ps.persistant[PERS_SCORE]; + break; + case CG_PLAYER_HEALTH: + return ps->stats[STAT_HEALTH]; + break; + case CG_RED_SCORE: + return cgs.scores1; + break; + case CG_BLUE_SCORE: + return cgs.scores2; + break; + + //PKMOD - ergodic 02/07/04 - add horizontal meters for ammo + case CG_PLAYER_AMMO_METER_HR2L: //Meter: Horizontal Right to Left fill + if ( cent->currentState.weapon ) { + //PKMOD - ergodic 02/09/04 - turn off addColorRange functionality for several PKA weapons + switch ( cent->currentState.weapon ) { + case WP_GAUNTLET: + return 100; + break; + case WP_AIRFIST: + return 100; + break; + case WP_GRAPPLING_HOOK: + return 100; + break; + case WP_GRAVITY: + return 100; + break; + case WP_SENTRY: + return 100; + break; + case WP_BEARTRAP: + return 100; + break; + case WP_BEANS: + return 100; + break; + default: + return ps->ammo[cent->currentState.weapon]; + break; + } + } + break; + case CG_PLAYER_AMMO_METER_HL2R: //Meter: Horizontal Left to Right fill + if ( cent->currentState.weapon ) { + //PKMOD - ergodic 02/09/04 - turn off addColorRange functionality for several PKA weapons + switch ( cent->currentState.weapon ) { + case WP_GAUNTLET: + return 100; + break; + case WP_AIRFIST: + return 100; + break; + case WP_GRAPPLING_HOOK: + return 100; + break; + case WP_GRAVITY: + return 100; + break; + case WP_SENTRY: + return 100; + break; + case WP_BEARTRAP: + return 100; + break; + case WP_BEANS: + return 100; + break; + default: + return ps->ammo[cent->currentState.weapon]; + break; + } + } + break; + + //PKMOD - Ergodic 02/08/04 - add relative score value to the HUD's gauges + case CG_PLAYER_RELATIVE_SCORE: + if ( cg.snap->ps.persistant[PERS_SCORE] == cgs.scores1 ) + return ( cg.snap->ps.persistant[PERS_SCORE] - cgs.scores2 ); + else + return ( cg.snap->ps.persistant[PERS_SCORE] - cgs.scores1 ); + break; + + + //PKMOD - ergodic 02/08/04 - add horizontal meters for armor + case CG_PLAYER_ARMOR_METER_HR2L: //Meter: Horizontal Right to Left fill + return ps->stats[STAT_ARMOR]; + break; + case CG_PLAYER_ARMOR_METER_HL2R: //Meter: Horizontal Left to Right fill + return ps->stats[STAT_ARMOR]; + break; + + + default: + break; + } + return -1; +} + +qboolean CG_OtherTeamHasFlag() { + if (cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF) { + int team = cg.snap->ps.persistant[PERS_TEAM]; + if (cgs.gametype == GT_1FCTF) { + if (team == TEAM_RED && cgs.flagStatus == FLAG_TAKEN_BLUE) { + return qtrue; + } else if (team == TEAM_BLUE && cgs.flagStatus == FLAG_TAKEN_RED) { + return qtrue; + } else { + return qfalse; + } + } else { + if (team == TEAM_RED && cgs.redflag == FLAG_TAKEN) { + return qtrue; + } else if (team == TEAM_BLUE && cgs.blueflag == FLAG_TAKEN) { + return qtrue; + } else { + return qfalse; + } + } + } + return qfalse; +} + +qboolean CG_YourTeamHasFlag() { + if (cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF) { + int team = cg.snap->ps.persistant[PERS_TEAM]; + if (cgs.gametype == GT_1FCTF) { + if (team == TEAM_RED && cgs.flagStatus == FLAG_TAKEN_RED) { + return qtrue; + } else if (team == TEAM_BLUE && cgs.flagStatus == FLAG_TAKEN_BLUE) { + return qtrue; + } else { + return qfalse; + } + } else { + if (team == TEAM_RED && cgs.blueflag == FLAG_TAKEN) { + return qtrue; + } else if (team == TEAM_BLUE && cgs.redflag == FLAG_TAKEN) { + return qtrue; + } else { + return qfalse; + } + } + } + return qfalse; +} + +// THINKABOUTME: should these be exclusive or inclusive.. +// +qboolean CG_OwnerDrawVisible(int flags) { + + if (flags & CG_SHOW_TEAMINFO) { + return (cg_currentSelectedPlayer.integer == numSortedTeamPlayers); + } + + if (flags & CG_SHOW_NOTEAMINFO) { + return !(cg_currentSelectedPlayer.integer == numSortedTeamPlayers); + } + + if (flags & CG_SHOW_OTHERTEAMHASFLAG) { + return CG_OtherTeamHasFlag(); + } + + if (flags & CG_SHOW_YOURTEAMHASENEMYFLAG) { + return CG_YourTeamHasFlag(); + } + + if (flags & (CG_SHOW_BLUE_TEAM_HAS_REDFLAG | CG_SHOW_RED_TEAM_HAS_BLUEFLAG)) { + if (flags & CG_SHOW_BLUE_TEAM_HAS_REDFLAG && (cgs.redflag == FLAG_TAKEN || cgs.flagStatus == FLAG_TAKEN_RED)) { + return qtrue; + } else if (flags & CG_SHOW_RED_TEAM_HAS_BLUEFLAG && (cgs.blueflag == FLAG_TAKEN || cgs.flagStatus == FLAG_TAKEN_BLUE)) { + return qtrue; + } + return qfalse; + } + + if (flags & CG_SHOW_ANYTEAMGAME) { + if( cgs.gametype >= GT_TEAM) { + return qtrue; + } + } + + if (flags & CG_SHOW_ANYNONTEAMGAME) { + if( cgs.gametype < GT_TEAM) { + return qtrue; + } + } + + if (flags & CG_SHOW_HARVESTER) { + if( cgs.gametype == GT_HARVESTER ) { + return qtrue; + } else { + return qfalse; + } + } + + if (flags & CG_SHOW_ONEFLAG) { + if( cgs.gametype == GT_1FCTF ) { + return qtrue; + } else { + return qfalse; + } + } + + if (flags & CG_SHOW_CTF) { + if( cgs.gametype == GT_CTF ) { + return qtrue; + } + } + + if (flags & CG_SHOW_OBELISK) { + if( cgs.gametype == GT_OBELISK ) { + return qtrue; + } else { + return qfalse; + } + } + + if (flags & CG_SHOW_HEALTHCRITICAL) { + if (cg.snap->ps.stats[STAT_HEALTH] < 25) { + return qtrue; + } + } + + if (flags & CG_SHOW_HEALTHOK) { + if (cg.snap->ps.stats[STAT_HEALTH] >= 25) { + return qtrue; + } + } + + if (flags & CG_SHOW_SINGLEPLAYER) { + if( cgs.gametype == GT_SINGLE_PLAYER ) { + return qtrue; + } + } + + if (flags & CG_SHOW_TOURNAMENT) { + if( cgs.gametype == GT_TOURNAMENT ) { + return qtrue; + } + } + + if (flags & CG_SHOW_DURINGINCOMINGVOICE) { + } + + if (flags & CG_SHOW_IF_PLAYER_HAS_FLAG) { + if (cg.snap->ps.powerups[PW_REDFLAG] || cg.snap->ps.powerups[PW_BLUEFLAG] || cg.snap->ps.powerups[PW_NEUTRALFLAG]) { + return qtrue; + } + } + return qfalse; +} + + + +static void CG_DrawPlayerHasFlag(rectDef_t *rect, qboolean force2D) { + int adj = (force2D) ? 0 : 2; + if( cg.predictedPlayerState.powerups[PW_REDFLAG] ) { + CG_DrawFlagModel( rect->x + adj, rect->y + adj, rect->w - adj, rect->h - adj, TEAM_RED, force2D); + } else if( cg.predictedPlayerState.powerups[PW_BLUEFLAG] ) { + CG_DrawFlagModel( rect->x + adj, rect->y + adj, rect->w - adj, rect->h - adj, TEAM_BLUE, force2D); + } else if( cg.predictedPlayerState.powerups[PW_NEUTRALFLAG] ) { + CG_DrawFlagModel( rect->x + adj, rect->y + adj, rect->w - adj, rect->h - adj, TEAM_FREE, force2D); + } +} + +static void CG_DrawAreaSystemChat(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, systemChat, 0, 0, 0); +} + +static void CG_DrawAreaTeamChat(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color,teamChat1, 0, 0, 0); +} + +static void CG_DrawAreaChat(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, teamChat2, 0, 0, 0); +} + +const char *CG_GetKillerText() { + const char *s = ""; + if ( cg.killerName[0] ) { + s = va("Fragged by %s", cg.killerName ); + } + return s; +} + + +static void CG_DrawKiller(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + // fragged by ... line + if ( cg.killerName[0] ) { + int x = rect->x + rect->w / 2; + CG_Text_Paint(x - CG_Text_Width(CG_GetKillerText(), scale, 0) / 2, rect->y + rect->h, scale, color, CG_GetKillerText(), 0, 0, textStyle); + } + +} + + +static void CG_DrawCapFragLimit(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + int limit = (cgs.gametype >= GT_CTF) ? cgs.capturelimit : cgs.fraglimit; + CG_Text_Paint(rect->x, rect->y, scale, color, va("%2i", limit),0, 0, textStyle); +} + +static void CG_Draw1stPlace(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + if (cgs.scores1 != SCORE_NOT_PRESENT) { + CG_Text_Paint(rect->x, rect->y, scale, color, va("%2i", cgs.scores1),0, 0, textStyle); + } +} + +static void CG_Draw2ndPlace(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle) { + if (cgs.scores2 != SCORE_NOT_PRESENT) { + CG_Text_Paint(rect->x, rect->y, scale, color, va("%2i", cgs.scores2),0, 0, textStyle); + } +} + +const char *CG_GetGameStatusText() { + const char *s = ""; + if ( cgs.gametype < GT_TEAM) { + if (cg.snap->ps.persistant[PERS_TEAM] != TEAM_SPECTATOR ) { + s = va("%s place with %i",CG_PlaceString( cg.snap->ps.persistant[PERS_RANK] + 1 ),cg.snap->ps.persistant[PERS_SCORE] ); + } + } else { + if ( cg.teamScores[0] == cg.teamScores[1] ) { + s = va("Teams are tied at %i", cg.teamScores[0] ); + } else if ( cg.teamScores[0] >= cg.teamScores[1] ) { + s = va("Red leads Blue, %i to %i", cg.teamScores[0], cg.teamScores[1] ); + } else { + s = va("Blue leads Red, %i to %i", cg.teamScores[1], cg.teamScores[0] ); + } + } + return s; +} + +static void CG_DrawGameStatus(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, CG_GetGameStatusText(), 0, 0, textStyle); +} + +const char *CG_GameTypeString() { + if ( cgs.gametype == GT_FFA ) { + return "Free For All"; + } else if ( cgs.gametype == GT_TEAM ) { + return "Team Deathmatch"; + } else if ( cgs.gametype == GT_CTF ) { + return "Capture the Flag"; + } else if ( cgs.gametype == GT_1FCTF ) { + return "One Flag CTF"; + } else if ( cgs.gametype == GT_OBELISK ) { + return "Overload"; + } else if ( cgs.gametype == GT_HARVESTER ) { + return "Harvester"; + } + return ""; +} +static void CG_DrawGameType(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader, int textStyle ) { + CG_Text_Paint(rect->x, rect->y + rect->h, scale, color, CG_GameTypeString(), 0, 0, textStyle); +} + +static void CG_Text_Paint_Limit(float *maxX, float x, float y, float scale, vec4_t color, const char* text, float adjust, int limit) { + int len, count; + vec4_t newColor; + glyphInfo_t *glyph; + if (text) { +// TTimo: FIXME +// const unsigned char *s = text; // bk001206 - unsigned + const char *s = text; + float max = *maxX; + float useScale; + fontInfo_t *font = &cgDC.Assets.textFont; + if (scale <= cg_smallFont.value) { + font = &cgDC.Assets.smallFont; + } else if (scale > cg_bigFont.value) { + font = &cgDC.Assets.bigFont; + } + useScale = scale * font->glyphScale; + trap_R_SetColor( color ); + len = strlen(text); + if (limit > 0 && len > limit) { + len = limit; + } + count = 0; + while (s && *s && count < len) { + glyph = &font->glyphs[(int)*s]; // TTimo: FIXME: getting nasty warnings without the cast, hopefully this doesn't break the VM build + if ( Q_IsColorString( s ) ) { + memcpy( newColor, g_color_table[ColorIndex(*(s+1))], sizeof( newColor ) ); + newColor[3] = color[3]; + trap_R_SetColor( newColor ); + s += 2; + continue; + } else { + float yadj = useScale * glyph->top; + if (CG_Text_Width(s, useScale, 1) + x > max) { + *maxX = 0; + break; + } + CG_Text_PaintChar(x, y - yadj, + glyph->imageWidth, + glyph->imageHeight, + useScale, + glyph->s, + glyph->t, + glyph->s2, + glyph->t2, + glyph->glyph); + x += (glyph->xSkip * useScale) + adjust; + *maxX = x; + count++; + s++; + } + } + trap_R_SetColor( NULL ); + } + +} + + + +#define PIC_WIDTH 12 + +void CG_DrawNewTeamInfo(rectDef_t *rect, float text_x, float text_y, float scale, vec4_t color, qhandle_t shader) { + int xx; + float y; + int i, j, len, count; + const char *p; + vec4_t hcolor; + float pwidth, lwidth, maxx, leftOver; + clientInfo_t *ci; + gitem_t *item; + qhandle_t h; + + // max player name width + pwidth = 0; + count = (numSortedTeamPlayers > 8) ? 8 : numSortedTeamPlayers; + for (i = 0; i < count; i++) { + ci = cgs.clientinfo + sortedTeamPlayers[i]; + if ( ci->infoValid && ci->team == cg.snap->ps.persistant[PERS_TEAM]) { + len = CG_Text_Width( ci->name, scale, 0); + if (len > pwidth) + pwidth = len; + } + } + + // max location name width + lwidth = 0; + for (i = 1; i < MAX_LOCATIONS; i++) { + p = CG_ConfigString(CS_LOCATIONS + i); + if (p && *p) { + len = CG_Text_Width(p, scale, 0); + if (len > lwidth) + lwidth = len; + } + } + + y = rect->y; + + for (i = 0; i < count; i++) { + ci = cgs.clientinfo + sortedTeamPlayers[i]; + if ( ci->infoValid && ci->team == cg.snap->ps.persistant[PERS_TEAM]) { + + xx = rect->x + 1; + for (j = 0; j <= PW_NUM_POWERUPS; j++) { + if (ci->powerups & (1 << j)) { + + item = BG_FindItemForPowerup( j ); + + if (item) { + CG_DrawPic( xx, y, PIC_WIDTH, PIC_WIDTH, trap_R_RegisterShader( item->icon ) ); + xx += PIC_WIDTH; + } + } + } + + // FIXME: max of 3 powerups shown properly + xx = rect->x + (PIC_WIDTH * 3) + 2; + + CG_GetColorForHealth( ci->health, ci->armor, hcolor ); + trap_R_SetColor(hcolor); + CG_DrawPic( xx, y + 1, PIC_WIDTH - 2, PIC_WIDTH - 2, cgs.media.heartShader ); + + //Com_sprintf (st, sizeof(st), "%3i %3i", ci->health, ci->armor); + //CG_Text_Paint(xx, y + text_y, scale, hcolor, st, 0, 0); + + // draw weapon icon + xx += PIC_WIDTH + 1; + +// weapon used is not that useful, use the space for task +#if 0 + if ( cg_weapons[ci->curWeapon].weaponIcon ) { + CG_DrawPic( xx, y, PIC_WIDTH, PIC_WIDTH, cg_weapons[ci->curWeapon].weaponIcon ); + } else { + CG_DrawPic( xx, y, PIC_WIDTH, PIC_WIDTH, cgs.media.deferShader ); + } +#endif + + trap_R_SetColor(NULL); + if (cgs.orderPending) { + // blink the icon + if ( cg.time > cgs.orderTime - 2500 && (cg.time >> 9 ) & 1 ) { + h = 0; + } else { + h = CG_StatusHandle(cgs.currentOrder); + } + } else { + h = CG_StatusHandle(ci->teamTask); + } + + if (h) { + CG_DrawPic( xx, y, PIC_WIDTH, PIC_WIDTH, h); + } + + xx += PIC_WIDTH + 1; + + leftOver = rect->w - xx; + maxx = xx + leftOver / 3; + + + + CG_Text_Paint_Limit(&maxx, xx, y + text_y, scale, color, ci->name, 0, 0); + + p = CG_ConfigString(CS_LOCATIONS + ci->location); + if (!p || !*p) { + p = "unknown"; + } + + xx += leftOver / 3 + 2; + maxx = rect->w - 4; + + CG_Text_Paint_Limit(&maxx, xx, y + text_y, scale, color, p, 0, 0); + y += text_y + 2; + if ( y + text_y + 2 > rect->y + rect->h ) { + break; + } + + } + } +} + + +void CG_DrawTeamSpectators(rectDef_t *rect, float scale, vec4_t color, qhandle_t shader) { + if (cg.spectatorLen) { + float maxX; + + if (cg.spectatorWidth == -1) { + cg.spectatorWidth = 0; + cg.spectatorPaintX = rect->x + 1; + cg.spectatorPaintX2 = -1; + } + + if (cg.spectatorOffset > cg.spectatorLen) { + cg.spectatorOffset = 0; + cg.spectatorPaintX = rect->x + 1; + cg.spectatorPaintX2 = -1; + } + + if (cg.time > cg.spectatorTime) { + cg.spectatorTime = cg.time + 10; + if (cg.spectatorPaintX <= rect->x + 2) { + if (cg.spectatorOffset < cg.spectatorLen) { + cg.spectatorPaintX += CG_Text_Width(&cg.spectatorList[cg.spectatorOffset], scale, 1) - 1; + cg.spectatorOffset++; + } else { + cg.spectatorOffset = 0; + if (cg.spectatorPaintX2 >= 0) { + cg.spectatorPaintX = cg.spectatorPaintX2; + } else { + cg.spectatorPaintX = rect->x + rect->w - 2; + } + cg.spectatorPaintX2 = -1; + } + } else { + cg.spectatorPaintX--; + if (cg.spectatorPaintX2 >= 0) { + cg.spectatorPaintX2--; + } + } + } + + maxX = rect->x + rect->w - 2; + CG_Text_Paint_Limit(&maxX, cg.spectatorPaintX, rect->y + rect->h - 3, scale, color, &cg.spectatorList[cg.spectatorOffset], 0, 0); + if (cg.spectatorPaintX2 >= 0) { + float maxX2 = rect->x + rect->w - 2; + CG_Text_Paint_Limit(&maxX2, cg.spectatorPaintX2, rect->y + rect->h - 3, scale, color, cg.spectatorList, 0, cg.spectatorOffset); + } + if (cg.spectatorOffset && maxX > 0) { + // if we have an offset ( we are skipping the first part of the string ) and we fit the string + if (cg.spectatorPaintX2 == -1) { + cg.spectatorPaintX2 = rect->x + rect->w - 2; + } + } else { + cg.spectatorPaintX2 = -1; + } + + } +} + + + +void CG_DrawMedal(int ownerDraw, rectDef_t *rect, float scale, vec4_t color, qhandle_t shader) { + score_t *score = &cg.scores[cg.selectedScore]; + float value = 0; + char *text = NULL; + color[3] = 0.25; + + switch (ownerDraw) { + case CG_ACCURACY: + value = score->accuracy; + break; + case CG_ASSISTS: + value = score->assistCount; + break; + case CG_DEFEND: + value = score->defendCount; + break; + case CG_EXCELLENT: + value = score->excellentCount; + break; + case CG_IMPRESSIVE: + value = score->impressiveCount; + break; + case CG_PERFECT: + value = score->perfect; + break; + case CG_GAUNTLET: + value = score->guantletCount; + break; + case CG_CAPTURES: + value = score->captures; + break; + //PKMOD - Ergodic 02/28/04 - add PainKiller medal awards to ownerdraw + case CG_PAINKILLER: + value = score->painkillerCount; + break; + } + + if (value > 0) { + if (ownerDraw != CG_PERFECT) { + if (ownerDraw == CG_ACCURACY) { + text = va("%i%%", (int)value); + if (value > 50) { + color[3] = 1.0; + } + } else { + text = va("%i", (int)value); + color[3] = 1.0; + } + } else { + if (value) { + color[3] = 1.0; + } + text = "Wow"; + } + } + + trap_R_SetColor(color); + CG_DrawPic( rect->x, rect->y, rect->w, rect->h, shader ); + + if (text) { + color[3] = 1.0; + value = CG_Text_Width(text, scale, 0); + CG_Text_Paint(rect->x + (rect->w - value) / 2, rect->y + rect->h + 10 , scale, color, text, 0, 0, 0); + } + trap_R_SetColor(NULL); + +} + + +// +void CG_OwnerDraw(float x, float y, float w, float h, float text_x, float text_y, int ownerDraw, int ownerDrawFlags, int align, float special, float scale, vec4_t color, qhandle_t shader, int textStyle) { + rectDef_t rect; + + if ( cg_drawStatus.integer == 0 ) { + return; + } + + //if (ownerDrawFlags != 0 && !CG_OwnerDrawVisible(ownerDrawFlags)) { + // return; + //} + + rect.x = x; + rect.y = y; + rect.w = w; + rect.h = h; + + switch (ownerDraw) { + case CG_PLAYER_ARMOR_ICON: + CG_DrawPlayerArmorIcon(&rect, ownerDrawFlags & CG_SHOW_2DONLY); + break; + case CG_PLAYER_ARMOR_ICON2D: + CG_DrawPlayerArmorIcon(&rect, qtrue); + break; + case CG_PLAYER_ARMOR_VALUE: + CG_DrawPlayerArmorValue(&rect, scale, color, shader, textStyle); + break; + case CG_PLAYER_AMMO_ICON: + CG_DrawPlayerAmmoIcon(&rect, ownerDrawFlags & CG_SHOW_2DONLY); + break; + case CG_PLAYER_AMMO_ICON2D: + CG_DrawPlayerAmmoIcon(&rect, qtrue); + break; + case CG_PLAYER_AMMO_VALUE: + CG_DrawPlayerAmmoValue(&rect, scale, color, shader, textStyle); + break; + + //PKMOD - Ergodic 02/07/04 - add horizontal meters for ammo + case CG_PLAYER_AMMO_METER_HR2L: //Meter: Horizontal Right to Left fill + CG_DrawPlayerAmmoMeter_HR2L(&rect, scale, color, shader, textStyle); + break; + case CG_PLAYER_AMMO_METER_HL2R: //Meter: Horizontal Left to Right fill + CG_DrawPlayerAmmoMeter_HL2R(&rect, scale, color, shader, textStyle); + break; + + //PKMOD - Ergodic 02/08/04 - add horizontal meters for armor + case CG_PLAYER_ARMOR_METER_HR2L: //Meter: Horizontal Right to Left fill + CG_DrawPlayerArmorMeter_HR2L(&rect, scale, color, shader, textStyle); + break; + case CG_PLAYER_ARMOR_METER_HL2R: //Meter: Horizontal Left to Right fill + CG_DrawPlayerArmorMeter_HL2R(&rect, scale, color, shader, textStyle); + break; + + //PKMOD - Ergodic 02/08/04 - add relative score value to the HUD's gauges + case CG_PLAYER_RELATIVE_SCORE: + CG_DrawPlayerRelativeScore(&rect, scale, color, shader, textStyle); + break; + + case CG_SELECTEDPLAYER_HEAD: + CG_DrawSelectedPlayerHead(&rect, ownerDrawFlags & CG_SHOW_2DONLY, qfalse); + break; + case CG_VOICE_HEAD: + CG_DrawSelectedPlayerHead(&rect, ownerDrawFlags & CG_SHOW_2DONLY, qtrue); + break; + case CG_VOICE_NAME: + CG_DrawSelectedPlayerName(&rect, scale, color, qtrue, textStyle); + break; + case CG_SELECTEDPLAYER_STATUS: + CG_DrawSelectedPlayerStatus(&rect); + break; + case CG_SELECTEDPLAYER_ARMOR: + CG_DrawSelectedPlayerArmor(&rect, scale, color, shader, textStyle); + break; + case CG_SELECTEDPLAYER_HEALTH: + CG_DrawSelectedPlayerHealth(&rect, scale, color, shader, textStyle); + break; + case CG_SELECTEDPLAYER_NAME: + CG_DrawSelectedPlayerName(&rect, scale, color, qfalse, textStyle); + break; + case CG_SELECTEDPLAYER_LOCATION: + CG_DrawSelectedPlayerLocation(&rect, scale, color, textStyle); + break; + case CG_SELECTEDPLAYER_WEAPON: + CG_DrawSelectedPlayerWeapon(&rect); + break; + case CG_SELECTEDPLAYER_POWERUP: + CG_DrawSelectedPlayerPowerup(&rect, ownerDrawFlags & CG_SHOW_2DONLY); + break; + case CG_PLAYER_HEAD: + CG_DrawPlayerHead(&rect, ownerDrawFlags & CG_SHOW_2DONLY); + break; + case CG_PLAYER_ITEM: + CG_DrawPlayerItem(&rect, scale, ownerDrawFlags & CG_SHOW_2DONLY); + break; + case CG_PLAYER_SCORE: + CG_DrawPlayerScore(&rect, scale, color, shader, textStyle); + break; + case CG_PLAYER_HEALTH: + CG_DrawPlayerHealth(&rect, scale, color, shader, textStyle); + break; + case CG_RED_SCORE: + CG_DrawRedScore(&rect, scale, color, shader, textStyle); + break; + case CG_BLUE_SCORE: + CG_DrawBlueScore(&rect, scale, color, shader, textStyle); + break; + case CG_RED_NAME: + CG_DrawRedName(&rect, scale, color, textStyle); + break; + case CG_BLUE_NAME: + CG_DrawBlueName(&rect, scale, color, textStyle); + break; + case CG_BLUE_FLAGHEAD: + CG_DrawBlueFlagHead(&rect); + break; + case CG_BLUE_FLAGSTATUS: + CG_DrawBlueFlagStatus(&rect, shader); + break; + case CG_BLUE_FLAGNAME: + CG_DrawBlueFlagName(&rect, scale, color, textStyle); + break; + case CG_RED_FLAGHEAD: + CG_DrawRedFlagHead(&rect); + break; + case CG_RED_FLAGSTATUS: + CG_DrawRedFlagStatus(&rect, shader); + break; + case CG_RED_FLAGNAME: + CG_DrawRedFlagName(&rect, scale, color, textStyle); + break; + case CG_HARVESTER_SKULLS: + CG_HarvesterSkulls(&rect, scale, color, qfalse, textStyle); + break; + case CG_HARVESTER_SKULLS2D: + CG_HarvesterSkulls(&rect, scale, color, qtrue, textStyle); + break; + case CG_ONEFLAG_STATUS: + CG_OneFlagStatus(&rect); + break; + case CG_PLAYER_LOCATION: + CG_DrawPlayerLocation(&rect, scale, color, textStyle); + break; + case CG_TEAM_COLOR: + CG_DrawTeamColor(&rect, color); + break; + case CG_CTF_POWERUP: + //PKMOD - Ergodic 01/28/04 - Dynamic HUD activation: Ignore this code since PKA does not have TA type of powerups + //CG_DrawCTFPowerUp(&rect); + break; + case CG_AREA_POWERUP: + CG_DrawAreaPowerUp(&rect, align, special, scale, color); + break; + case CG_PLAYER_STATUS: + CG_DrawPlayerStatus(&rect); + break; + case CG_PLAYER_HASFLAG: + CG_DrawPlayerHasFlag(&rect, qfalse); + break; + case CG_PLAYER_HASFLAG2D: + CG_DrawPlayerHasFlag(&rect, qtrue); + break; + case CG_AREA_SYSTEMCHAT: + CG_DrawAreaSystemChat(&rect, scale, color, shader); + break; + case CG_AREA_TEAMCHAT: + CG_DrawAreaTeamChat(&rect, scale, color, shader); + break; + case CG_AREA_CHAT: + CG_DrawAreaChat(&rect, scale, color, shader); + break; + case CG_GAME_TYPE: + CG_DrawGameType(&rect, scale, color, shader, textStyle); + break; + case CG_GAME_STATUS: + CG_DrawGameStatus(&rect, scale, color, shader, textStyle); + break; + case CG_KILLER: + CG_DrawKiller(&rect, scale, color, shader, textStyle); + break; + case CG_ACCURACY: + case CG_ASSISTS: + case CG_DEFEND: + case CG_EXCELLENT: + case CG_IMPRESSIVE: + case CG_PERFECT: + case CG_GAUNTLET: + case CG_CAPTURES: + //PKMOD - Ergodic 02/28/04 - add PainKiller medal awards to ownerdraw + case CG_PAINKILLER: + CG_DrawMedal(ownerDraw, &rect, scale, color, shader); + break; + case CG_SPECTATORS: + CG_DrawTeamSpectators(&rect, scale, color, shader); + break; + case CG_TEAMINFO: + if (cg_currentSelectedPlayer.integer == numSortedTeamPlayers) { + CG_DrawNewTeamInfo(&rect, text_x, text_y, scale, color, shader); + } + break; + case CG_CAPFRAGLIMIT: + CG_DrawCapFragLimit(&rect, scale, color, shader, textStyle); + break; + case CG_1STPLACE: + CG_Draw1stPlace(&rect, scale, color, shader, textStyle); + break; + case CG_2NDPLACE: + CG_Draw2ndPlace(&rect, scale, color, shader, textStyle); + break; + default: + break; + } +} + +void CG_MouseEvent(int x, int y) { + int n; + + if ( (cg.predictedPlayerState.pm_type == PM_NORMAL || cg.predictedPlayerState.pm_type == PM_SPECTATOR) && cg.showScores == qfalse) { + trap_Key_SetCatcher(0); + return; + } + + cgs.cursorX+= x; + if (cgs.cursorX < 0) + cgs.cursorX = 0; + else if (cgs.cursorX > 640) + cgs.cursorX = 640; + + cgs.cursorY += y; + if (cgs.cursorY < 0) + cgs.cursorY = 0; + else if (cgs.cursorY > 480) + cgs.cursorY = 480; + + n = Display_CursorType(cgs.cursorX, cgs.cursorY); + cgs.activeCursor = 0; + if (n == CURSOR_ARROW) { + cgs.activeCursor = cgs.media.selectCursor; + } else if (n == CURSOR_SIZER) { + cgs.activeCursor = cgs.media.sizeCursor; + } + + if (cgs.capturedItem) { + Display_MouseMove(cgs.capturedItem, x, y); + } else { + Display_MouseMove(NULL, cgs.cursorX, cgs.cursorY); + } + +} + +/* +================== +CG_HideTeamMenus +================== + +*/ +void CG_HideTeamMenu() { + Menus_CloseByName("teamMenu"); + Menus_CloseByName("getMenu"); +} + +/* +================== +CG_ShowTeamMenus +================== + +*/ +void CG_ShowTeamMenu() { + Menus_OpenByName("teamMenu"); +} + + + + +/* +================== +CG_EventHandling +================== + type 0 - no event handling + 1 - team menu + 2 - hud editor + +*/ +void CG_EventHandling(int type) { + cgs.eventHandling = type; + if (type == CGAME_EVENT_NONE) { + CG_HideTeamMenu(); + } else if (type == CGAME_EVENT_TEAMMENU) { + //CG_ShowTeamMenu(); + } else if (type == CGAME_EVENT_SCOREBOARD) { + } + +} + + + +void CG_KeyEvent(int key, qboolean down) { + + if (!down) { + return; + } + + if ( cg.predictedPlayerState.pm_type == PM_NORMAL || (cg.predictedPlayerState.pm_type == PM_SPECTATOR && cg.showScores == qfalse)) { + CG_EventHandling(CGAME_EVENT_NONE); + trap_Key_SetCatcher(0); + return; + } + + //if (key == trap_Key_GetKey("teamMenu") || !Display_CaptureItem(cgs.cursorX, cgs.cursorY)) { + // if we see this then we should always be visible + // CG_EventHandling(CGAME_EVENT_NONE); + // trap_Key_SetCatcher(0); + //} + + + + Display_HandleKey(key, down, cgs.cursorX, cgs.cursorY); + + if (cgs.capturedItem) { + cgs.capturedItem = NULL; + } else { + if (key == K_MOUSE2 && down) { + cgs.capturedItem = Display_CaptureItem(cgs.cursorX, cgs.cursorY); + } + } +} + +int CG_ClientNumFromName(const char *p) { + int i; + for (i = 0; i < cgs.maxclients; i++) { + if (cgs.clientinfo[i].infoValid && Q_stricmp(cgs.clientinfo[i].name, p) == 0) { + return i; + } + } + return -1; +} + +void CG_ShowResponseHead() { + Menus_OpenByName("voiceMenu"); + trap_Cvar_Set("cl_conXOffset", "72"); + cg.voiceTime = cg.time; +} + +void CG_RunMenuScript(char **args) { +} + + +void CG_GetTeamColor(vec4_t *color) { + if (cg.snap->ps.persistant[PERS_TEAM] == TEAM_RED) { + (*color)[0] = 1.0f; + (*color)[3] = 0.25f; + (*color)[1] = (*color)[2] = 0.0f; + } else if (cg.snap->ps.persistant[PERS_TEAM] == TEAM_BLUE) { + (*color)[0] = (*color)[1] = 0.0f; + (*color)[2] = 1.0f; + (*color)[3] = 0.25f; + } else { + (*color)[0] = (*color)[2] = 0.0f; + (*color)[1] = 0.17f; + (*color)[3] = 0.25f; + } +} + diff --git a/quake3/source/code/cgame/cg_particles.c b/quake3/source/code/cgame/cg_particles.c new file mode 100644 index 0000000..16767c8 --- /dev/null +++ b/quake3/source/code/cgame/cg_particles.c @@ -0,0 +1,1997 @@ +// Rafael particles +// cg_particles.c + +#include "cg_local.h" + +#define BLOODRED 2 +#define EMISIVEFADE 3 +#define GREY75 4 + +typedef struct particle_s +{ + struct particle_s *next; + + float time; + float endtime; + + vec3_t org; + vec3_t vel; + vec3_t accel; + int color; + float colorvel; + float alpha; + float alphavel; + int type; + qhandle_t pshader; + + float height; + float width; + + float endheight; + float endwidth; + + float start; + float end; + + float startfade; + qboolean rotate; + int snum; + + qboolean link; + + // Ridah + int shaderAnim; + int roll; + + int accumroll; + +} cparticle_t; + +typedef enum +{ + P_NONE, + P_WEATHER, + P_FLAT, + P_SMOKE, + P_ROTATE, + P_WEATHER_TURBULENT, + P_ANIM, // Ridah + P_BAT, + P_BLEED, + P_FLAT_SCALEUP, + P_FLAT_SCALEUP_FADE, + P_WEATHER_FLURRY, + P_SMOKE_IMPACT, + P_BUBBLE, + P_BUBBLE_TURBULENT, + P_SPRITE +} particle_type_t; + +#define MAX_SHADER_ANIMS 32 +#define MAX_SHADER_ANIM_FRAMES 64 + +static char *shaderAnimNames[MAX_SHADER_ANIMS] = { + "explode1", + "blacksmokeanim", + "twiltb2", + "expblue", + "blacksmokeanimb", // uses 'explode1' sequence + "blood", + NULL +}; +static qhandle_t shaderAnims[MAX_SHADER_ANIMS][MAX_SHADER_ANIM_FRAMES]; +static int shaderAnimCounts[MAX_SHADER_ANIMS] = { + 23, + 25, + 45, + 25, + 23, + 5, +}; +static float shaderAnimSTRatio[MAX_SHADER_ANIMS] = { + 1.405f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, + 1.0f, +}; +static int numShaderAnims; +// done. + +#define PARTICLE_GRAVITY 40 +#define MAX_PARTICLES 1024 * 8 + +cparticle_t *active_particles, *free_particles; +cparticle_t particles[MAX_PARTICLES]; +int cl_numparticles = MAX_PARTICLES; + +qboolean initparticles = qfalse; +vec3_t vforward, vright, vup; +vec3_t rforward, rright, rup; + +float oldtime; + +/* +=============== +CL_ClearParticles +=============== +*/ +void CG_ClearParticles (void) +{ + int i; + + memset( particles, 0, sizeof(particles) ); + + free_particles = &particles[0]; + active_particles = NULL; + + for (i=0 ;itype == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY + || p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) + {// create a front facing polygon + + if (p->type != P_WEATHER_FLURRY) + { + if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) + { + if (org[2] > p->end) + { + p->time = cg.time; + VectorCopy (org, p->org); // Ridah, fixes rare snow flakes that flicker on the ground + + p->org[2] = ( p->start + crandom () * 4 ); + + + if (p->type == P_BUBBLE_TURBULENT) + { + p->vel[0] = crandom() * 4; + p->vel[1] = crandom() * 4; + } + + } + } + else + { + if (org[2] < p->end) + { + p->time = cg.time; + VectorCopy (org, p->org); // Ridah, fixes rare snow flakes that flicker on the ground + + while (p->org[2] < p->end) + { + p->org[2] += (p->start - p->end); + } + + + if (p->type == P_WEATHER_TURBULENT) + { + p->vel[0] = crandom() * 16; + p->vel[1] = crandom() * 16; + } + + } + } + + + // Rafael snow pvs check + if (!p->link) + return; + + p->alpha = 1; + } + + // Ridah, had to do this or MAX_POLYS is being exceeded in village1.bsp + if (Distance( cg.snap->ps.origin, org ) > 1024) { + return; + } + // done. + + if (p->type == P_BUBBLE || p->type == P_BUBBLE_TURBULENT) + { + VectorMA (org, -p->height, vup, point); + VectorMA (point, -p->width, vright, point); + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255 * p->alpha; + + VectorMA (org, -p->height, vup, point); + VectorMA (point, p->width, vright, point); + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, vup, point); + VectorMA (point, p->width, vright, point); + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, vup, point); + VectorMA (point, -p->width, vright, point); + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255 * p->alpha; + } + else + { + VectorMA (org, -p->height, vup, point); + VectorMA (point, -p->width, vright, point); + VectorCopy( point, TRIverts[0].xyz ); + TRIverts[0].st[0] = 1; + TRIverts[0].st[1] = 0; + TRIverts[0].modulate[0] = 255; + TRIverts[0].modulate[1] = 255; + TRIverts[0].modulate[2] = 255; + TRIverts[0].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, vup, point); + VectorMA (point, -p->width, vright, point); + VectorCopy (point, TRIverts[1].xyz); + TRIverts[1].st[0] = 0; + TRIverts[1].st[1] = 0; + TRIverts[1].modulate[0] = 255; + TRIverts[1].modulate[1] = 255; + TRIverts[1].modulate[2] = 255; + TRIverts[1].modulate[3] = 255 * p->alpha; + + VectorMA (org, p->height, vup, point); + VectorMA (point, p->width, vright, point); + VectorCopy (point, TRIverts[2].xyz); + TRIverts[2].st[0] = 0; + TRIverts[2].st[1] = 1; + TRIverts[2].modulate[0] = 255; + TRIverts[2].modulate[1] = 255; + TRIverts[2].modulate[2] = 255; + TRIverts[2].modulate[3] = 255 * p->alpha; + } + + } + else if (p->type == P_SPRITE) + { + vec3_t rr, ru; + vec3_t rotate_ang; + + VectorSet (color, 1.0, 1.0, 1.0); + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + if (p->roll) { + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + rotate_ang[ROLL] += p->roll; + AngleVectors ( rotate_ang, NULL, rr, ru); + } + + if (p->roll) { + VectorMA (org, -height, ru, point); + VectorMA (point, -width, rr, point); + } else { + VectorMA (org, -height, vup, point); + VectorMA (point, -width, vright, point); + } + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*height, ru, point); + } else { + VectorMA (point, 2*height, vup, point); + } + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*width, rr, point); + } else { + VectorMA (point, 2*width, vright, point); + } + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, -2*height, ru, point); + } else { + VectorMA (point, -2*height, vup, point); + } + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + } + else if (p->type == P_SMOKE || p->type == P_SMOKE_IMPACT) + {// create a front rotating facing polygon + + if ( p->type == P_SMOKE_IMPACT && Distance( cg.snap->ps.origin, org ) > 1024) { + return; + } + + if (p->color == BLOODRED) + VectorSet (color, 0.22f, 0.0f, 0.0f); + else if (p->color == GREY75) + { + float len; + float greyit; + float val; + len = Distance (cg.snap->ps.origin, org); + if (!len) + len = 1; + + val = 4096/len; + greyit = 0.25 * val; + if (greyit > 0.5) + greyit = 0.5; + + VectorSet (color, greyit, greyit, greyit); + } + else + VectorSet (color, 1.0, 1.0, 1.0); + + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + + if (cg.time > p->startfade) + { + invratio = 1 - ( (cg.time - p->startfade) / (p->endtime - p->startfade) ); + + if (p->color == EMISIVEFADE) + { + float fval; + fval = (invratio * invratio); + if (fval < 0) + fval = 0; + VectorSet (color, fval , fval , fval ); + } + invratio *= p->alpha; + } + else + invratio = 1 * p->alpha; + + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) + invratio = 1; + + if (invratio > 1) + invratio = 1; + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + if (p->type != P_SMOKE_IMPACT) + { + vec3_t temp; + + vectoangles (rforward, temp); + p->accumroll += p->roll; + temp[ROLL] += p->accumroll * 0.1; + AngleVectors ( temp, NULL, rright2, rup2); + } + else + { + VectorCopy (rright, rright2); + VectorCopy (rup, rup2); + } + + if (p->rotate) + { + VectorMA (org, -height, rup2, point); + VectorMA (point, -width, rright2, point); + } + else + { + VectorMA (org, -p->height, vup, point); + VectorMA (point, -p->width, vright, point); + } + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255 * color[0]; + verts[0].modulate[1] = 255 * color[1]; + verts[0].modulate[2] = 255 * color[2]; + verts[0].modulate[3] = 255 * invratio; + + if (p->rotate) + { + VectorMA (org, -height, rup2, point); + VectorMA (point, width, rright2, point); + } + else + { + VectorMA (org, -p->height, vup, point); + VectorMA (point, p->width, vright, point); + } + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255 * color[0]; + verts[1].modulate[1] = 255 * color[1]; + verts[1].modulate[2] = 255 * color[2]; + verts[1].modulate[3] = 255 * invratio; + + if (p->rotate) + { + VectorMA (org, height, rup2, point); + VectorMA (point, width, rright2, point); + } + else + { + VectorMA (org, p->height, vup, point); + VectorMA (point, p->width, vright, point); + } + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255 * color[0]; + verts[2].modulate[1] = 255 * color[1]; + verts[2].modulate[2] = 255 * color[2]; + verts[2].modulate[3] = 255 * invratio; + + if (p->rotate) + { + VectorMA (org, height, rup2, point); + VectorMA (point, -width, rright2, point); + } + else + { + VectorMA (org, p->height, vup, point); + VectorMA (point, -p->width, vright, point); + } + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255 * color[0]; + verts[3].modulate[1] = 255 * color[1]; + verts[3].modulate[2] = 255 * color[2]; + verts[3].modulate[3] = 255 * invratio; + + } + else if (p->type == P_BLEED) + { + vec3_t rr, ru; + vec3_t rotate_ang; + float alpha; + + alpha = p->alpha; + + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) + alpha = 1; + + if (p->roll) + { + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + rotate_ang[ROLL] += p->roll; + AngleVectors ( rotate_ang, NULL, rr, ru); + } + else + { + VectorCopy (vup, ru); + VectorCopy (vright, rr); + } + + VectorMA (org, -p->height, ru, point); + VectorMA (point, -p->width, rr, point); + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 111; + verts[0].modulate[1] = 19; + verts[0].modulate[2] = 9; + verts[0].modulate[3] = 255 * alpha; + + VectorMA (org, -p->height, ru, point); + VectorMA (point, p->width, rr, point); + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 111; + verts[1].modulate[1] = 19; + verts[1].modulate[2] = 9; + verts[1].modulate[3] = 255 * alpha; + + VectorMA (org, p->height, ru, point); + VectorMA (point, p->width, rr, point); + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 111; + verts[2].modulate[1] = 19; + verts[2].modulate[2] = 9; + verts[2].modulate[3] = 255 * alpha; + + VectorMA (org, p->height, ru, point); + VectorMA (point, -p->width, rr, point); + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 111; + verts[3].modulate[1] = 19; + verts[3].modulate[2] = 9; + verts[3].modulate[3] = 255 * alpha; + + } + else if (p->type == P_FLAT_SCALEUP) + { + float width, height; + float sinR, cosR; + + if (p->color == BLOODRED) + VectorSet (color, 1, 1, 1); + else + VectorSet (color, 0.5, 0.5, 0.5); + + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + if (width > p->endwidth) + width = p->endwidth; + + if (height > p->endheight) + height = p->endheight; + + sinR = height * sin(DEG2RAD(p->roll)) * sqrt(2); + cosR = width * cos(DEG2RAD(p->roll)) * sqrt(2); + + VectorCopy (org, verts[0].xyz); + verts[0].xyz[0] -= sinR; + verts[0].xyz[1] -= cosR; + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255 * color[0]; + verts[0].modulate[1] = 255 * color[1]; + verts[0].modulate[2] = 255 * color[2]; + verts[0].modulate[3] = 255; + + VectorCopy (org, verts[1].xyz); + verts[1].xyz[0] -= cosR; + verts[1].xyz[1] += sinR; + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255 * color[0]; + verts[1].modulate[1] = 255 * color[1]; + verts[1].modulate[2] = 255 * color[2]; + verts[1].modulate[3] = 255; + + VectorCopy (org, verts[2].xyz); + verts[2].xyz[0] += sinR; + verts[2].xyz[1] += cosR; + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255 * color[0]; + verts[2].modulate[1] = 255 * color[1]; + verts[2].modulate[2] = 255 * color[2]; + verts[2].modulate[3] = 255; + + VectorCopy (org, verts[3].xyz); + verts[3].xyz[0] += cosR; + verts[3].xyz[1] -= sinR; + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255 * color[0]; + verts[3].modulate[1] = 255 * color[1]; + verts[3].modulate[2] = 255 * color[2]; + verts[3].modulate[3] = 255; + } + else if (p->type == P_FLAT) + { + + VectorCopy (org, verts[0].xyz); + verts[0].xyz[0] -= p->height; + verts[0].xyz[1] -= p->width; + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + VectorCopy (org, verts[1].xyz); + verts[1].xyz[0] -= p->height; + verts[1].xyz[1] += p->width; + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + VectorCopy (org, verts[2].xyz); + verts[2].xyz[0] += p->height; + verts[2].xyz[1] += p->width; + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + VectorCopy (org, verts[3].xyz); + verts[3].xyz[0] += p->height; + verts[3].xyz[1] -= p->width; + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + + } + // Ridah + else if (p->type == P_ANIM) { + vec3_t rr, ru; + vec3_t rotate_ang; + int i, j; + + time = cg.time - p->time; + time2 = p->endtime - p->time; + ratio = time / time2; + if (ratio >= 1.0f) { + ratio = 0.9999f; + } + + width = p->width + ( ratio * ( p->endwidth - p->width) ); + height = p->height + ( ratio * ( p->endheight - p->height) ); + + // if we are "inside" this sprite, don't draw + if (Distance( cg.snap->ps.origin, org ) < width/1.5) { + return; + } + + i = p->shaderAnim; + j = (int)floor(ratio * shaderAnimCounts[p->shaderAnim]); + p->pshader = shaderAnims[i][j]; + + if (p->roll) { + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + rotate_ang[ROLL] += p->roll; + AngleVectors ( rotate_ang, NULL, rr, ru); + } + + if (p->roll) { + VectorMA (org, -height, ru, point); + VectorMA (point, -width, rr, point); + } else { + VectorMA (org, -height, vup, point); + VectorMA (point, -width, vright, point); + } + VectorCopy (point, verts[0].xyz); + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*height, ru, point); + } else { + VectorMA (point, 2*height, vup, point); + } + VectorCopy (point, verts[1].xyz); + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, 2*width, rr, point); + } else { + VectorMA (point, 2*width, vright, point); + } + VectorCopy (point, verts[2].xyz); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + if (p->roll) { + VectorMA (point, -2*height, ru, point); + } else { + VectorMA (point, -2*height, vup, point); + } + VectorCopy (point, verts[3].xyz); + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + } + // done. + + if (!p->pshader) { +// (SA) temp commented out for DM +// CG_Printf ("CG_AddParticleToScene type %d p->pshader == ZERO\n", p->type); + return; + } + + if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT || p->type == P_WEATHER_FLURRY) + trap_R_AddPolyToScene( p->pshader, 3, TRIverts ); + else + trap_R_AddPolyToScene( p->pshader, 4, verts ); + +} + +// Ridah, made this static so it doesn't interfere with other files +static float roll = 0.0; + +/* +=============== +CG_AddParticles +=============== +*/ +void CG_AddParticles (void) +{ + cparticle_t *p, *next; + float alpha; + float time, time2; + vec3_t org; + int color; + cparticle_t *active, *tail; + int type; + vec3_t rotate_ang; + + if (!initparticles) + CG_ClearParticles (); + + VectorCopy( cg.refdef.viewaxis[0], vforward ); + VectorCopy( cg.refdef.viewaxis[1], vright ); + VectorCopy( cg.refdef.viewaxis[2], vup ); + + vectoangles( cg.refdef.viewaxis[0], rotate_ang ); + roll += ((cg.time - oldtime) * 0.1) ; + rotate_ang[ROLL] += (roll*0.9); + AngleVectors ( rotate_ang, rforward, rright, rup); + + oldtime = cg.time; + + active = NULL; + tail = NULL; + + for (p=active_particles ; p ; p=next) + { + + next = p->next; + + time = (cg.time - p->time)*0.001; + + alpha = p->alpha + time*p->alphavel; + if (alpha <= 0) + { // faded out + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + continue; + } + + if (p->type == P_SMOKE || p->type == P_ANIM || p->type == P_BLEED || p->type == P_SMOKE_IMPACT) + { + if (cg.time > p->endtime) + { + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + + continue; + } + + } + + if (p->type == P_WEATHER_FLURRY) + { + if (cg.time > p->endtime) + { + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + + continue; + } + } + + + if (p->type == P_FLAT_SCALEUP_FADE) + { + if (cg.time > p->endtime) + { + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + continue; + } + + } + + if ((p->type == P_BAT || p->type == P_SPRITE) && p->endtime < 0) { + // temporary sprite + CG_AddParticleToScene (p, p->org, alpha); + p->next = free_particles; + free_particles = p; + p->type = 0; + p->color = 0; + p->alpha = 0; + continue; + } + + p->next = NULL; + if (!tail) + active = tail = p; + else + { + tail->next = p; + tail = p; + } + + if (alpha > 1.0) + alpha = 1; + + color = p->color; + + time2 = time*time; + + org[0] = p->org[0] + p->vel[0]*time + p->accel[0]*time2; + org[1] = p->org[1] + p->vel[1]*time + p->accel[1]*time2; + org[2] = p->org[2] + p->vel[2]*time + p->accel[2]*time2; + + type = p->type; + + CG_AddParticleToScene (p, org, alpha); + } + + active_particles = active; +} + +/* +====================== +CG_AddParticles +====================== +*/ +void CG_ParticleSnowFlurry (qhandle_t pshader, centity_t *cent) +{ + cparticle_t *p; + qboolean turb = qtrue; + + if (!pshader) + CG_Printf ("CG_ParticleSnowFlurry pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->color = 0; + p->alpha = 0.90f; + p->alphavel = 0; + + p->start = cent->currentState.origin2[0]; + p->end = cent->currentState.origin2[1]; + + p->endtime = cg.time + cent->currentState.time; + p->startfade = cg.time + cent->currentState.time2; + + p->pshader = pshader; + + if (rand()%100 > 90) + { + p->height = 32; + p->width = 32; + p->alpha = 0.10f; + } + else + { + p->height = 1; + p->width = 1; + } + + p->vel[2] = -20; + + p->type = P_WEATHER_FLURRY; + + if (turb) + p->vel[2] = -10; + + VectorCopy(cent->currentState.origin, p->org); + + p->org[0] = p->org[0]; + p->org[1] = p->org[1]; + p->org[2] = p->org[2]; + + p->vel[0] = p->vel[1] = 0; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[0] += cent->currentState.angles[0] * 32 + (crandom() * 16); + p->vel[1] += cent->currentState.angles[1] * 32 + (crandom() * 16); + p->vel[2] += cent->currentState.angles[2]; + + if (turb) + { + p->accel[0] = crandom () * 16; + p->accel[1] = crandom () * 16; + } + +} + +void CG_ParticleSnow (qhandle_t pshader, vec3_t origin, vec3_t origin2, int turb, float range, int snum) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleSnow pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->color = 0; + p->alpha = 0.40f; + p->alphavel = 0; + p->start = origin[2]; + p->end = origin2[2]; + p->pshader = pshader; + p->height = 1; + p->width = 1; + + p->vel[2] = -50; + + if (turb) + { + p->type = P_WEATHER_TURBULENT; + p->vel[2] = -50 * 1.3; + } + else + { + p->type = P_WEATHER; + } + + VectorCopy(origin, p->org); + + p->org[0] = p->org[0] + ( crandom() * range); + p->org[1] = p->org[1] + ( crandom() * range); + p->org[2] = p->org[2] + ( crandom() * (p->start - p->end)); + + p->vel[0] = p->vel[1] = 0; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + if (turb) + { + p->vel[0] = crandom() * 16; + p->vel[1] = crandom() * 16; + } + + // Rafael snow pvs check + p->snum = snum; + p->link = qtrue; + +} + +void CG_ParticleBubble (qhandle_t pshader, vec3_t origin, vec3_t origin2, int turb, float range, int snum) +{ + cparticle_t *p; + float randsize; + + if (!pshader) + CG_Printf ("CG_ParticleSnow pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->color = 0; + p->alpha = 0.40f; + p->alphavel = 0; + p->start = origin[2]; + p->end = origin2[2]; + p->pshader = pshader; + + randsize = 1 + (crandom() * 0.5); + + p->height = randsize; + p->width = randsize; + + p->vel[2] = 50 + ( crandom() * 10 ); + + if (turb) + { + p->type = P_BUBBLE_TURBULENT; + p->vel[2] = 50 * 1.3; + } + else + { + p->type = P_BUBBLE; + } + + VectorCopy(origin, p->org); + + p->org[0] = p->org[0] + ( crandom() * range); + p->org[1] = p->org[1] + ( crandom() * range); + p->org[2] = p->org[2] + ( crandom() * (p->start - p->end)); + + p->vel[0] = p->vel[1] = 0; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + if (turb) + { + p->vel[0] = crandom() * 4; + p->vel[1] = crandom() * 4; + } + + // Rafael snow pvs check + p->snum = snum; + p->link = qtrue; + +} + +void CG_ParticleSmoke (qhandle_t pshader, centity_t *cent) +{ + + // using cent->density = enttime + // cent->frame = startfade + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleSmoke == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + cent->currentState.time; + p->startfade = cg.time + cent->currentState.time2; + + p->color = 0; + p->alpha = 1.0; + p->alphavel = 0; + p->start = cent->currentState.origin[2]; + p->end = cent->currentState.origin2[2]; + p->pshader = pshader; + p->rotate = qfalse; + p->height = 8; + p->width = 8; + p->endheight = 32; + p->endwidth = 32; + p->type = P_SMOKE; + + VectorCopy(cent->currentState.origin, p->org); + + p->vel[0] = p->vel[1] = 0; + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[2] = 5; + + if (cent->currentState.frame == 1)// reverse gravity + p->vel[2] *= -1; + + p->roll = 8 + (crandom() * 4); +} + + +void CG_ParticleBulletDebris (vec3_t org, vec3_t vel, int duration) +{ + + cparticle_t *p; + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + duration; + p->startfade = cg.time + duration/2; + + p->color = EMISIVEFADE; + p->alpha = 1.0; + p->alphavel = 0; + + p->height = 0.5; + p->width = 0.5; + p->endheight = 0.5; + p->endwidth = 0.5; + + p->pshader = cgs.media.tracerShader; + + p->type = P_SMOKE; + + VectorCopy(org, p->org); + + p->vel[0] = vel[0]; + p->vel[1] = vel[1]; + p->vel[2] = vel[2]; + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->accel[2] = -60; + p->vel[2] += -20; + +} + +/* +====================== +CG_ParticleExplosion +====================== +*/ + +void CG_ParticleExplosion (char *animStr, vec3_t origin, vec3_t vel, int duration, int sizeStart, int sizeEnd) +{ + cparticle_t *p; + int anim; + + if (animStr < (char *)10) + CG_Error( "CG_ParticleExplosion: animStr is probably an index rather than a string" ); + + // find the animation string + for (anim=0; shaderAnimNames[anim]; anim++) { + if (!stricmp( animStr, shaderAnimNames[anim] )) + break; + } + if (!shaderAnimNames[anim]) { + CG_Error("CG_ParticleExplosion: unknown animation string: %s\n", animStr); + return; + } + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + + if (duration < 0) { + duration *= -1; + p->roll = 0; + } else { + p->roll = crandom()*179; + } + + p->shaderAnim = anim; + + p->width = sizeStart; + p->height = sizeStart*shaderAnimSTRatio[anim]; // for sprites that are stretch in either direction + + p->endheight = sizeEnd; + p->endwidth = sizeEnd*shaderAnimSTRatio[anim]; + + p->endtime = cg.time + duration; + + p->type = P_ANIM; + + VectorCopy( origin, p->org ); + VectorCopy( vel, p->vel ); + VectorClear( p->accel ); + +} + +// Rafael Shrapnel +void CG_AddParticleShrapnel (localEntity_t *le) +{ + return; +} +// done. + +int CG_NewParticleArea (int num) +{ + // const char *str; + char *str; + char *token; + int type; + vec3_t origin, origin2; + int i; + float range = 0; + int turb; + int numparticles; + int snum; + + str = (char *) CG_ConfigString (num); + if (!str[0]) + return (0); + + // returns type 128 64 or 32 + token = COM_Parse (&str); + type = atoi (token); + + if (type == 1) + range = 128; + else if (type == 2) + range = 64; + else if (type == 3) + range = 32; + else if (type == 0) + range = 256; + else if (type == 4) + range = 8; + else if (type == 5) + range = 16; + else if (type == 6) + range = 32; + else if (type == 7) + range = 64; + + + for (i=0; i<3; i++) + { + token = COM_Parse (&str); + origin[i] = atof (token); + } + + for (i=0; i<3; i++) + { + token = COM_Parse (&str); + origin2[i] = atof (token); + } + + token = COM_Parse (&str); + numparticles = atoi (token); + + token = COM_Parse (&str); + turb = atoi (token); + + token = COM_Parse (&str); + snum = atoi (token); + + for (i=0; i= 4) + CG_ParticleBubble (cgs.media.waterBubbleShader, origin, origin2, turb, range, snum); + else + CG_ParticleSnow (cgs.media.waterBubbleShader, origin, origin2, turb, range, snum); + } + + return (1); +} + +void CG_SnowLink (centity_t *cent, qboolean particleOn) +{ + cparticle_t *p, *next; + int id; + + id = cent->currentState.frame; + + for (p=active_particles ; p ; p=next) + { + next = p->next; + + if (p->type == P_WEATHER || p->type == P_WEATHER_TURBULENT) + { + if (p->snum == id) + { + if (particleOn) + p->link = qtrue; + else + p->link = qfalse; + } + } + + } +} + +void CG_ParticleImpactSmokePuff (qhandle_t pshader, vec3_t origin) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleImpactSmokePuff pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 0.25; + p->alphavel = 0; + p->roll = crandom()*179; + + p->pshader = pshader; + + p->endtime = cg.time + 1000; + p->startfade = cg.time + 100; + + p->width = rand()%4 + 8; + p->height = rand()%4 + 8; + + p->endheight = p->height *2; + p->endwidth = p->width * 2; + + p->endtime = cg.time + 500; + + p->type = P_SMOKE_IMPACT; + + VectorCopy( origin, p->org ); + VectorSet(p->vel, 0, 0, 20); + VectorSet(p->accel, 0, 0, 20); + + p->rotate = qtrue; +} + +void CG_Particle_Bleed (qhandle_t pshader, vec3_t start, vec3_t dir, int fleshEntityNum, int duration) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_Particle_Bleed pshader == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + p->endtime = cg.time + duration; + + if (fleshEntityNum) + p->startfade = cg.time; + else + p->startfade = cg.time + 100; + + p->width = 4; + p->height = 4; + + p->endheight = 4+rand()%3; + p->endwidth = p->endheight; + + p->type = P_SMOKE; + + VectorCopy( start, p->org ); + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = -20; + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->color = BLOODRED; + p->alpha = 0.75; + +} + +void CG_Particle_OilParticle (qhandle_t pshader, centity_t *cent) +{ + cparticle_t *p; + + int time; + int time2; + float ratio; + + float duration = 1500; + + time = cg.time; + time2 = cg.time + cent->currentState.time; + + ratio =(float)1 - ((float)time / (float)time2); + + if (!pshader) + CG_Printf ("CG_Particle_OilParticle == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + p->endtime = cg.time + duration; + + p->startfade = p->endtime; + + p->width = 1; + p->height = 3; + + p->endheight = 3; + p->endwidth = 1; + + p->type = P_SMOKE; + + VectorCopy(cent->currentState.origin, p->org ); + + p->vel[0] = (cent->currentState.origin2[0] * (16 * ratio)); + p->vel[1] = (cent->currentState.origin2[1] * (16 * ratio)); + p->vel[2] = (cent->currentState.origin2[2]); + + p->snum = 1.0f; + + VectorClear( p->accel ); + + p->accel[2] = -20; + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + +} + + +void CG_Particle_OilSlick (qhandle_t pshader, centity_t *cent) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_Particle_OilSlick == ZERO!\n"); + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + if (cent->currentState.angles2[2]) + p->endtime = cg.time + cent->currentState.angles2[2]; + else + p->endtime = cg.time + 60000; + + p->startfade = p->endtime; + + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + if (cent->currentState.angles2[0] || cent->currentState.angles2[1]) + { + p->width = cent->currentState.angles2[0]; + p->height = cent->currentState.angles2[0]; + + p->endheight = cent->currentState.angles2[1]; + p->endwidth = cent->currentState.angles2[1]; + } + else + { + p->width = 8; + p->height = 8; + + p->endheight = 16; + p->endwidth = 16; + } + + p->type = P_FLAT_SCALEUP; + + p->snum = 1.0; + + VectorCopy(cent->currentState.origin, p->org ); + + p->org[2]+= 0.55 + (crandom() * 0.5); + + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = 0; + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + +} + +void CG_OilSlickRemove (centity_t *cent) +{ + cparticle_t *p, *next; + int id; + + id = 1.0f; + + if (!id) + CG_Printf ("CG_OilSlickRevove NULL id\n"); + + for (p=active_particles ; p ; p=next) + { + next = p->next; + + if (p->type == P_FLAT_SCALEUP) + { + if (p->snum == id) + { + p->endtime = cg.time + 100; + p->startfade = p->endtime; + p->type = P_FLAT_SCALEUP_FADE; + + } + } + + } +} + +qboolean ValidBloodPool (vec3_t start) +{ +#define EXTRUDE_DIST 0.5 + + vec3_t angles; + vec3_t right, up; + vec3_t this_pos, x_pos, center_pos, end_pos; + float x, y; + float fwidth, fheight; + trace_t trace; + vec3_t normal; + + fwidth = 16; + fheight = 16; + + VectorSet (normal, 0, 0, 1); + + vectoangles (normal, angles); + AngleVectors (angles, NULL, right, up); + + VectorMA (start, EXTRUDE_DIST, normal, center_pos); + + for (x= -fwidth/2; xendpos, start); + legit = ValidBloodPool (start); + + if (!legit) + return; + + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + 3000; + p->startfade = p->endtime; + + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = pshader; + + rndSize = 0.4 + random()*0.6; + + p->width = 8*rndSize; + p->height = 8*rndSize; + + p->endheight = 16*rndSize; + p->endwidth = 16*rndSize; + + p->type = P_FLAT_SCALEUP; + + VectorCopy(start, p->org ); + + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = 0; + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + + p->color = BLOODRED; +} + +#define NORMALSIZE 16 +#define LARGESIZE 32 + +void CG_ParticleBloodCloud (centity_t *cent, vec3_t origin, vec3_t dir) +{ + float length; + float dist; + float crittersize; + vec3_t angles, forward; + vec3_t point; + cparticle_t *p; + int i; + + dist = 0; + + length = VectorLength (dir); + vectoangles (dir, angles); + AngleVectors (angles, forward, NULL, NULL); + + crittersize = LARGESIZE; + + if (length) + dist = length / crittersize; + + if (dist < 1) + dist = 1; + + VectorCopy (origin, point); + + for (i=0; inext; + p->next = active_particles; + active_particles = p; + + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = cgs.media.smokePuffShader; + + p->endtime = cg.time + 350 + (crandom() * 100); + + p->startfade = cg.time; + + p->width = LARGESIZE; + p->height = LARGESIZE; + p->endheight = LARGESIZE; + p->endwidth = LARGESIZE; + + p->type = P_SMOKE; + + VectorCopy( origin, p->org ); + + p->vel[0] = 0; + p->vel[1] = 0; + p->vel[2] = -1; + + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->color = BLOODRED; + + p->alpha = 0.75; + + } + + +} + +void CG_ParticleSparks (vec3_t org, vec3_t vel, int duration, float x, float y, float speed) +{ + cparticle_t *p; + + if (!free_particles) + return; + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + + p->endtime = cg.time + duration; + p->startfade = cg.time + duration/2; + + p->color = EMISIVEFADE; + p->alpha = 0.4f; + p->alphavel = 0; + + p->height = 0.5; + p->width = 0.5; + p->endheight = 0.5; + p->endwidth = 0.5; + + p->pshader = cgs.media.tracerShader; + + p->type = P_SMOKE; + + VectorCopy(org, p->org); + + p->org[0] += (crandom() * x); + p->org[1] += (crandom() * y); + + p->vel[0] = vel[0]; + p->vel[1] = vel[1]; + p->vel[2] = vel[2]; + + p->accel[0] = p->accel[1] = p->accel[2] = 0; + + p->vel[0] += (crandom() * 4); + p->vel[1] += (crandom() * 4); + p->vel[2] += (20 + (crandom() * 10)) * speed; + + p->accel[0] = crandom () * 4; + p->accel[1] = crandom () * 4; + +} + +void CG_ParticleDust (centity_t *cent, vec3_t origin, vec3_t dir) +{ + float length; + float dist; + float crittersize; + vec3_t angles, forward; + vec3_t point; + cparticle_t *p; + int i; + + dist = 0; + + VectorNegate (dir, dir); + length = VectorLength (dir); + vectoangles (dir, angles); + AngleVectors (angles, forward, NULL, NULL); + + crittersize = LARGESIZE; + + if (length) + dist = length / crittersize; + + if (dist < 1) + dist = 1; + + VectorCopy (origin, point); + + for (i=0; inext; + p->next = active_particles; + active_particles = p; + + p->time = cg.time; + p->alpha = 5.0; + p->alphavel = 0; + p->roll = 0; + + p->pshader = cgs.media.smokePuffShader; + + // RF, stay around for long enough to expand and dissipate naturally + if (length) + p->endtime = cg.time + 4500 + (crandom() * 3500); + else + p->endtime = cg.time + 750 + (crandom() * 500); + + p->startfade = cg.time; + + p->width = LARGESIZE; + p->height = LARGESIZE; + + // RF, expand while falling + p->endheight = LARGESIZE*3.0; + p->endwidth = LARGESIZE*3.0; + + if (!length) + { + p->width *= 0.2f; + p->height *= 0.2f; + + p->endheight = NORMALSIZE; + p->endwidth = NORMALSIZE; + } + + p->type = P_SMOKE; + + VectorCopy( point, p->org ); + + p->vel[0] = crandom()*6; + p->vel[1] = crandom()*6; + p->vel[2] = random()*20; + + // RF, add some gravity/randomness + p->accel[0] = crandom()*3; + p->accel[1] = crandom()*3; + p->accel[2] = -PARTICLE_GRAVITY*0.4; + + VectorClear( p->accel ); + + p->rotate = qfalse; + + p->roll = rand()%179; + + p->alpha = 0.75; + + } + + +} + +void CG_ParticleMisc (qhandle_t pshader, vec3_t origin, int size, int duration, float alpha) +{ + cparticle_t *p; + + if (!pshader) + CG_Printf ("CG_ParticleImpactSmokePuff pshader == ZERO!\n"); + + if (!free_particles) + return; + + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + p->time = cg.time; + p->alpha = 1.0; + p->alphavel = 0; + p->roll = rand()%179; + + p->pshader = pshader; + + if (duration > 0) + p->endtime = cg.time + duration; + else + p->endtime = duration; + + p->startfade = cg.time; + + p->width = size; + p->height = size; + + p->endheight = size; + p->endwidth = size; + + p->type = P_SPRITE; + + VectorCopy( origin, p->org ); + + p->rotate = qfalse; +} diff --git a/quake3/source/code/cgame/cg_players.c b/quake3/source/code/cgame/cg_players.c new file mode 100644 index 0000000..4383a50 --- /dev/null +++ b/quake3/source/code/cgame/cg_players.c @@ -0,0 +1,2772 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_players.c -- handle the media and animation for player entities +#include "cg_local.h" + +char *cg_customSoundNames[MAX_CUSTOM_SOUNDS] = { + "*death1.wav", + "*death2.wav", + "*death3.wav", + "*jump1.wav", + "*pain25_1.wav", + "*pain50_1.wav", + "*pain75_1.wav", + "*pain100_1.wav", + "*falling1.wav", + "*gasp.wav", + "*drown.wav", + "*fall1.wav", + "*taunt.wav" +}; + + +/* +================ +CG_CustomSound + +================ +*/ +sfxHandle_t CG_CustomSound( int clientNum, const char *soundName ) { + clientInfo_t *ci; + int i; + + if ( soundName[0] != '*' ) { + return trap_S_RegisterSound( soundName, qfalse ); + } + + if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + clientNum = 0; + } + ci = &cgs.clientinfo[ clientNum ]; + + for ( i = 0 ; i < MAX_CUSTOM_SOUNDS && cg_customSoundNames[i] ; i++ ) { + if ( !strcmp( soundName, cg_customSoundNames[i] ) ) { + return ci->sounds[i]; + } + } + + CG_Error( "Unknown custom sound: %s", soundName ); + return 0; +} + + + +/* +============================================================================= + +CLIENT INFO + +============================================================================= +*/ + +/* +====================== +CG_ParseAnimationFile + +Read a configuration file containing animation coutns and rates +models/players/visor/animation.cfg, etc +====================== +*/ +static qboolean CG_ParseAnimationFile( const char *filename, clientInfo_t *ci ) { + char *text_p, *prev; + int len; + int i; + char *token; + float fps; + int skip; + char text[20000]; + fileHandle_t f; + animation_t *animations; + + animations = ci->animations; + + // load the file + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + if ( len <= 0 ) { + return qfalse; + } + if ( len >= sizeof( text ) - 1 ) { + CG_Printf( "File %s too long\n", filename ); + return qfalse; + } + trap_FS_Read( text, len, f ); + text[len] = 0; + trap_FS_FCloseFile( f ); + + // parse the text + text_p = text; + skip = 0; // quite the compiler warning + + ci->footsteps = FOOTSTEP_NORMAL; + VectorClear( ci->headOffset ); + ci->gender = GENDER_MALE; + ci->fixedlegs = qfalse; + ci->fixedtorso = qfalse; + + // read optional parameters + while ( 1 ) { + prev = text_p; // so we can unget + token = COM_Parse( &text_p ); + if ( !token ) { + break; + } + if ( !Q_stricmp( token, "footsteps" ) ) { + token = COM_Parse( &text_p ); + if ( !token ) { + break; + } + if ( !Q_stricmp( token, "default" ) || !Q_stricmp( token, "normal" ) ) { + ci->footsteps = FOOTSTEP_NORMAL; + } else if ( !Q_stricmp( token, "boot" ) ) { + ci->footsteps = FOOTSTEP_BOOT; + } else if ( !Q_stricmp( token, "flesh" ) ) { + ci->footsteps = FOOTSTEP_FLESH; + } else if ( !Q_stricmp( token, "mech" ) ) { + ci->footsteps = FOOTSTEP_MECH; + } else if ( !Q_stricmp( token, "energy" ) ) { + ci->footsteps = FOOTSTEP_ENERGY; + } else { + CG_Printf( "Bad footsteps parm in %s: %s\n", filename, token ); + } + continue; + } else if ( !Q_stricmp( token, "headoffset" ) ) { + for ( i = 0 ; i < 3 ; i++ ) { + token = COM_Parse( &text_p ); + if ( !token ) { + break; + } + ci->headOffset[i] = atof( token ); + } + continue; + } else if ( !Q_stricmp( token, "sex" ) ) { + token = COM_Parse( &text_p ); + if ( !token ) { + break; + } + if ( token[0] == 'f' || token[0] == 'F' ) { + ci->gender = GENDER_FEMALE; + } else if ( token[0] == 'n' || token[0] == 'N' ) { + ci->gender = GENDER_NEUTER; + } else { + ci->gender = GENDER_MALE; + } + continue; + } else if ( !Q_stricmp( token, "fixedlegs" ) ) { + ci->fixedlegs = qtrue; + continue; + } else if ( !Q_stricmp( token, "fixedtorso" ) ) { + ci->fixedtorso = qtrue; + continue; + } + + // if it is a number, start parsing animations + if ( token[0] >= '0' && token[0] <= '9' ) { + text_p = prev; // unget the token + break; + } + Com_Printf( "unknown token '%s' is %s\n", token, filename ); + } + + // read information for each frame + for ( i = 0 ; i < MAX_ANIMATIONS ; i++ ) { + + token = COM_Parse( &text_p ); + if ( !*token ) { + if( i >= TORSO_GETFLAG && i <= TORSO_NEGATIVE ) { + animations[i].firstFrame = animations[TORSO_GESTURE].firstFrame; + animations[i].frameLerp = animations[TORSO_GESTURE].frameLerp; + animations[i].initialLerp = animations[TORSO_GESTURE].initialLerp; + animations[i].loopFrames = animations[TORSO_GESTURE].loopFrames; + animations[i].numFrames = animations[TORSO_GESTURE].numFrames; + animations[i].reversed = qfalse; + animations[i].flipflop = qfalse; + continue; + } + break; + } + animations[i].firstFrame = atoi( token ); + // leg only frames are adjusted to not count the upper body only frames + if ( i == LEGS_WALKCR ) { + skip = animations[LEGS_WALKCR].firstFrame - animations[TORSO_GESTURE].firstFrame; + } + if ( i >= LEGS_WALKCR && i0) { + return qtrue; + } + return qfalse; +} + +/* +========================== +CG_FindClientModelFile +========================== +*/ +static qboolean CG_FindClientModelFile( char *filename, int length, clientInfo_t *ci, const char *teamName, const char *modelName, const char *skinName, const char *base, const char *ext ) { + char *team, *charactersFolder; + int i; + + if ( cgs.gametype >= GT_TEAM ) { + switch ( ci->team ) { + case TEAM_BLUE: { + team = "blue"; + break; + } + default: { + team = "red"; + break; + } + } + } + else { + team = "default"; + } + charactersFolder = ""; + while(1) { + for ( i = 0; i < 2; i++ ) { + if ( i == 0 && teamName && *teamName ) { + // "models/players/characters/james/stroggs/lower_lily_red.skin" + Com_sprintf( filename, length, "models/players/%s%s/%s%s_%s_%s.%s", charactersFolder, modelName, teamName, base, skinName, team, ext ); + } + else { + // "models/players/characters/james/lower_lily_red.skin" + Com_sprintf( filename, length, "models/players/%s%s/%s_%s_%s.%s", charactersFolder, modelName, base, skinName, team, ext ); + } + if ( CG_FileExists( filename ) ) { + return qtrue; + } + if ( cgs.gametype >= GT_TEAM ) { + if ( i == 0 && teamName && *teamName ) { + // "models/players/characters/james/stroggs/lower_red.skin" + Com_sprintf( filename, length, "models/players/%s%s/%s%s_%s.%s", charactersFolder, modelName, teamName, base, team, ext ); + } + else { + // "models/players/characters/james/lower_red.skin" + Com_sprintf( filename, length, "models/players/%s%s/%s_%s.%s", charactersFolder, modelName, base, team, ext ); + } + } + else { + if ( i == 0 && teamName && *teamName ) { + // "models/players/characters/james/stroggs/lower_lily.skin" + Com_sprintf( filename, length, "models/players/%s%s/%s%s_%s.%s", charactersFolder, modelName, teamName, base, skinName, ext ); + } + else { + // "models/players/characters/james/lower_lily.skin" + Com_sprintf( filename, length, "models/players/%s%s/%s_%s.%s", charactersFolder, modelName, base, skinName, ext ); + } + } + if ( CG_FileExists( filename ) ) { + return qtrue; + } + if ( !teamName || !*teamName ) { + break; + } + } + // if tried the heads folder first + if ( charactersFolder[0] ) { + break; + } + charactersFolder = "characters/"; + } + + return qfalse; +} + +/* +========================== +CG_FindClientHeadFile +========================== +*/ +static qboolean CG_FindClientHeadFile( char *filename, int length, clientInfo_t *ci, const char *teamName, const char *headModelName, const char *headSkinName, const char *base, const char *ext ) { + char *team, *headsFolder; + int i; + + if ( cgs.gametype >= GT_TEAM ) { + switch ( ci->team ) { + case TEAM_BLUE: { + team = "blue"; + break; + } + default: { + team = "red"; + break; + } + } + } + else { + team = "default"; + } + + if ( headModelName[0] == '*' ) { + headsFolder = "heads/"; + headModelName++; + } + else { + headsFolder = ""; + } + while(1) { + for ( i = 0; i < 2; i++ ) { + if ( i == 0 && teamName && *teamName ) { + Com_sprintf( filename, length, "models/players/%s%s/%s/%s%s_%s.%s", headsFolder, headModelName, headSkinName, teamName, base, team, ext ); + } + else { + Com_sprintf( filename, length, "models/players/%s%s/%s/%s_%s.%s", headsFolder, headModelName, headSkinName, base, team, ext ); + } + if ( CG_FileExists( filename ) ) { + return qtrue; + } + if ( cgs.gametype >= GT_TEAM ) { + if ( i == 0 && teamName && *teamName ) { + Com_sprintf( filename, length, "models/players/%s%s/%s%s_%s.%s", headsFolder, headModelName, teamName, base, team, ext ); + } + else { + Com_sprintf( filename, length, "models/players/%s%s/%s_%s.%s", headsFolder, headModelName, base, team, ext ); + } + } + else { + if ( i == 0 && teamName && *teamName ) { + Com_sprintf( filename, length, "models/players/%s%s/%s%s_%s.%s", headsFolder, headModelName, teamName, base, headSkinName, ext ); + } + else { + Com_sprintf( filename, length, "models/players/%s%s/%s_%s.%s", headsFolder, headModelName, base, headSkinName, ext ); + } + } + if ( CG_FileExists( filename ) ) { + return qtrue; + } + if ( !teamName || !*teamName ) { + break; + } + } + // if tried the heads folder first + if ( headsFolder[0] ) { + break; + } + headsFolder = "heads/"; + } + + return qfalse; +} + +/* +========================== +CG_RegisterClientSkin +========================== +*/ +static qboolean CG_RegisterClientSkin( clientInfo_t *ci, const char *teamName, const char *modelName, const char *skinName, const char *headModelName, const char *headSkinName ) { + char filename[MAX_QPATH]; + + /* + Com_sprintf( filename, sizeof( filename ), "models/players/%s/%slower_%s.skin", modelName, teamName, skinName ); + ci->legsSkin = trap_R_RegisterSkin( filename ); + if (!ci->legsSkin) { + Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/%slower_%s.skin", modelName, teamName, skinName ); + ci->legsSkin = trap_R_RegisterSkin( filename ); + if (!ci->legsSkin) { + Com_Printf( "Leg skin load failure: %s\n", filename ); + } + } + + + Com_sprintf( filename, sizeof( filename ), "models/players/%s/%supper_%s.skin", modelName, teamName, skinName ); + ci->torsoSkin = trap_R_RegisterSkin( filename ); + if (!ci->torsoSkin) { + Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/%supper_%s.skin", modelName, teamName, skinName ); + ci->torsoSkin = trap_R_RegisterSkin( filename ); + if (!ci->torsoSkin) { + Com_Printf( "Torso skin load failure: %s\n", filename ); + } + } + */ + if ( CG_FindClientModelFile( filename, sizeof(filename), ci, teamName, modelName, skinName, "lower", "skin" ) ) { + ci->legsSkin = trap_R_RegisterSkin( filename ); + } + if (!ci->legsSkin) { + Com_Printf( "Leg skin load failure: %s\n", filename ); + } + + if ( CG_FindClientModelFile( filename, sizeof(filename), ci, teamName, modelName, skinName, "upper", "skin" ) ) { + ci->torsoSkin = trap_R_RegisterSkin( filename ); + } + if (!ci->torsoSkin) { + Com_Printf( "Torso skin load failure: %s\n", filename ); + } + + if ( CG_FindClientHeadFile( filename, sizeof(filename), ci, teamName, headModelName, headSkinName, "head", "skin" ) ) { + ci->headSkin = trap_R_RegisterSkin( filename ); + } + if (!ci->headSkin) { + Com_Printf( "Head skin load failure: %s\n", filename ); + } + + // if any skins failed to load + if ( !ci->legsSkin || !ci->torsoSkin || !ci->headSkin ) { + return qfalse; + } + return qtrue; +} + +/* +========================== +CG_RegisterClientModelname +========================== +*/ +static qboolean CG_RegisterClientModelname( clientInfo_t *ci, const char *modelName, const char *skinName, const char *headModelName, const char *headSkinName, const char *teamName ) { + char filename[MAX_QPATH*2]; + const char *headName; + char newTeamName[MAX_QPATH*2]; + + if ( headModelName[0] == '\0' ) { + headName = modelName; + } + else { + headName = headModelName; + } + Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.md3", modelName ); + ci->legsModel = trap_R_RegisterModel( filename ); + if ( !ci->legsModel ) { + Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/lower.md3", modelName ); + ci->legsModel = trap_R_RegisterModel( filename ); + if ( !ci->legsModel ) { + Com_Printf( "Failed to load model file %s\n", filename ); + return qfalse; + } + } + + Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.md3", modelName ); + ci->torsoModel = trap_R_RegisterModel( filename ); + if ( !ci->torsoModel ) { + Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/upper.md3", modelName ); + ci->torsoModel = trap_R_RegisterModel( filename ); + if ( !ci->torsoModel ) { + Com_Printf( "Failed to load model file %s\n", filename ); + return qfalse; + } + } + + if( headName[0] == '*' ) { + Com_sprintf( filename, sizeof( filename ), "models/players/heads/%s/%s.md3", &headModelName[1], &headModelName[1] ); + } + else { + Com_sprintf( filename, sizeof( filename ), "models/players/%s/head.md3", headName ); + } + ci->headModel = trap_R_RegisterModel( filename ); + // if the head model could not be found and we didn't load from the heads folder try to load from there + if ( !ci->headModel && headName[0] != '*' ) { + Com_sprintf( filename, sizeof( filename ), "models/players/heads/%s/%s.md3", headModelName, headModelName ); + ci->headModel = trap_R_RegisterModel( filename ); + } + if ( !ci->headModel ) { + Com_Printf( "Failed to load model file %s\n", filename ); + return qfalse; + } + + // if any skins failed to load, return failure + if ( !CG_RegisterClientSkin( ci, teamName, modelName, skinName, headName, headSkinName ) ) { + if ( teamName && *teamName) { + Com_Printf( "(CG 1) Failed to load skin file: %s : %s : %s, %s : %s\n", teamName, modelName, skinName, headName, headSkinName ); + if( ci->team == TEAM_BLUE ) { + Com_sprintf(newTeamName, sizeof(newTeamName), "%s/", DEFAULT_BLUETEAM_NAME); + } + else { + Com_sprintf(newTeamName, sizeof(newTeamName), "%s/", DEFAULT_REDTEAM_NAME); + } + if ( !CG_RegisterClientSkin( ci, newTeamName, modelName, skinName, headName, headSkinName ) ) { + Com_Printf( "(CG 2) Failed to load skin file: %s : %s : %s, %s : %s\n", newTeamName, modelName, skinName, headName, headSkinName ); + return qfalse; + } + } else { + Com_Printf( "(cg 3) Failed to load skin file: %s : %s, %s : %s\n", modelName, skinName, headName, headSkinName ); + return qfalse; + } + } + + // load the animations + Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg", modelName ); + if ( !CG_ParseAnimationFile( filename, ci ) ) { + Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/animation.cfg", modelName ); + if ( !CG_ParseAnimationFile( filename, ci ) ) { + Com_Printf( "Failed to load animation file %s\n", filename ); + return qfalse; + } + } + + if ( CG_FindClientHeadFile( filename, sizeof(filename), ci, teamName, headName, headSkinName, "icon", "skin" ) ) { + ci->modelIcon = trap_R_RegisterShaderNoMip( filename ); + } + else if ( CG_FindClientHeadFile( filename, sizeof(filename), ci, teamName, headName, headSkinName, "icon", "tga" ) ) { + ci->modelIcon = trap_R_RegisterShaderNoMip( filename ); + } + + if ( !ci->modelIcon ) { + return qfalse; + } + + return qtrue; +} + +/* +==================== +CG_ColorFromString +==================== +*/ +static void CG_ColorFromString( const char *v, vec3_t color ) { + int val; + + VectorClear( color ); + + val = atoi( v ); + + if ( val < 1 || val > 7 ) { + VectorSet( color, 1, 1, 1 ); + return; + } + + if ( val & 1 ) { + color[2] = 1.0f; + } + if ( val & 2 ) { + color[1] = 1.0f; + } + if ( val & 4 ) { + color[0] = 1.0f; + } +} + +/* +=================== +CG_LoadClientInfo + +Load it now, taking the disk hits. +This will usually be deferred to a safe time +=================== +*/ +static void CG_LoadClientInfo( clientInfo_t *ci ) { + const char *dir, *fallback; + int i, modelloaded; + const char *s; + int clientNum; + char teamname[MAX_QPATH]; + + teamname[0] = 0; +#ifdef MISSIONPACK + if( cgs.gametype >= GT_TEAM) { + if( ci->team == TEAM_BLUE ) { + Q_strncpyz(teamname, cg_blueTeamName.string, sizeof(teamname) ); + } else { + Q_strncpyz(teamname, cg_redTeamName.string, sizeof(teamname) ); + } + } + if( teamname[0] ) { + strcat( teamname, "/" ); + } +#endif + modelloaded = qtrue; + + if ( !CG_RegisterClientModelname( ci, ci->modelName, ci->skinName, ci->headModelName, ci->headSkinName, teamname ) ) { + if ( cg_buildScript.integer ) { + CG_Error( "CG_RegisterClientModelname( %s, %s, %s, %s %s ) failed", ci->modelName, ci->skinName, ci->headModelName, ci->headSkinName, teamname ); + } + + // fall back to default team name + if( cgs.gametype >= GT_TEAM) { + // keep skin name + if( ci->team == TEAM_BLUE ) { + Q_strncpyz(teamname, DEFAULT_BLUETEAM_NAME, sizeof(teamname) ); + } else { + Q_strncpyz(teamname, DEFAULT_REDTEAM_NAME, sizeof(teamname) ); + } + if ( !CG_RegisterClientModelname( ci, DEFAULT_TEAM_MODEL, ci->skinName, DEFAULT_TEAM_HEAD, ci->skinName, teamname ) ) { + CG_Error( "DEFAULT_TEAM_MODEL / skin (%s/%s) failed to register", DEFAULT_TEAM_MODEL, ci->skinName ); + } + } else { + if ( !CG_RegisterClientModelname( ci, DEFAULT_MODEL, "default", DEFAULT_MODEL, "default", teamname ) ) { + CG_Error( "DEFAULT_MODEL (%s) failed to register", DEFAULT_MODEL ); + } + } + modelloaded = qfalse; + } + + ci->newAnims = qfalse; + if ( ci->torsoModel ) { + orientation_t tag; + // if the torso model has the "tag_flag" + if ( trap_R_LerpTag( &tag, ci->torsoModel, 0, 0, 1, "tag_flag" ) ) { + ci->newAnims = qtrue; + } + } + + // sounds + dir = ci->modelName; + fallback = (cgs.gametype >= GT_TEAM) ? DEFAULT_TEAM_MODEL : DEFAULT_MODEL; + + for ( i = 0 ; i < MAX_CUSTOM_SOUNDS ; i++ ) { + s = cg_customSoundNames[i]; + if ( !s ) { + break; + } + ci->sounds[i] = 0; + // if the model didn't load use the sounds of the default model + if (modelloaded) { + ci->sounds[i] = trap_S_RegisterSound( va("sound/player/%s/%s", dir, s + 1), qfalse ); + } + if ( !ci->sounds[i] ) { + ci->sounds[i] = trap_S_RegisterSound( va("sound/player/%s/%s", fallback, s + 1), qfalse ); + } + } + + ci->deferred = qfalse; + + // reset any existing players and bodies, because they might be in bad + // frames for this new model + clientNum = ci - cgs.clientinfo; + for ( i = 0 ; i < MAX_GENTITIES ; i++ ) { + if ( cg_entities[i].currentState.clientNum == clientNum + && cg_entities[i].currentState.eType == ET_PLAYER ) { + CG_ResetPlayerEntity( &cg_entities[i] ); + } + } +} + +/* +====================== +CG_CopyClientInfoModel +====================== +*/ +static void CG_CopyClientInfoModel( clientInfo_t *from, clientInfo_t *to ) { + VectorCopy( from->headOffset, to->headOffset ); + to->footsteps = from->footsteps; + to->gender = from->gender; + + to->legsModel = from->legsModel; + to->legsSkin = from->legsSkin; + to->torsoModel = from->torsoModel; + to->torsoSkin = from->torsoSkin; + to->headModel = from->headModel; + to->headSkin = from->headSkin; + to->modelIcon = from->modelIcon; + + to->newAnims = from->newAnims; + + memcpy( to->animations, from->animations, sizeof( to->animations ) ); + memcpy( to->sounds, from->sounds, sizeof( to->sounds ) ); +} + +/* +====================== +CG_ScanForExistingClientInfo +====================== +*/ +static qboolean CG_ScanForExistingClientInfo( clientInfo_t *ci ) { + int i; + clientInfo_t *match; + + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + match = &cgs.clientinfo[ i ]; + if ( !match->infoValid ) { + continue; + } + if ( match->deferred ) { + continue; + } + if ( !Q_stricmp( ci->modelName, match->modelName ) + && !Q_stricmp( ci->skinName, match->skinName ) + && !Q_stricmp( ci->headModelName, match->headModelName ) + && !Q_stricmp( ci->headSkinName, match->headSkinName ) + && !Q_stricmp( ci->blueTeam, match->blueTeam ) + && !Q_stricmp( ci->redTeam, match->redTeam ) + && (cgs.gametype < GT_TEAM || ci->team == match->team) ) { + // this clientinfo is identical, so use it's handles + + ci->deferred = qfalse; + + CG_CopyClientInfoModel( match, ci ); + + return qtrue; + } + } + + // nothing matches, so defer the load + return qfalse; +} + +/* +====================== +CG_SetDeferredClientInfo + +We aren't going to load it now, so grab some other +client's info to use until we have some spare time. +====================== +*/ +static void CG_SetDeferredClientInfo( clientInfo_t *ci ) { + int i; + clientInfo_t *match; + + // if someone else is already the same models and skins we + // can just load the client info + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + match = &cgs.clientinfo[ i ]; + if ( !match->infoValid || match->deferred ) { + continue; + } + if ( Q_stricmp( ci->skinName, match->skinName ) || + Q_stricmp( ci->modelName, match->modelName ) || +// Q_stricmp( ci->headModelName, match->headModelName ) || +// Q_stricmp( ci->headSkinName, match->headSkinName ) || + (cgs.gametype >= GT_TEAM && ci->team != match->team) ) { + continue; + } + // just load the real info cause it uses the same models and skins + CG_LoadClientInfo( ci ); + return; + } + + // if we are in teamplay, only grab a model if the skin is correct + if ( cgs.gametype >= GT_TEAM ) { + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + match = &cgs.clientinfo[ i ]; + if ( !match->infoValid || match->deferred ) { + continue; + } + if ( Q_stricmp( ci->skinName, match->skinName ) || + (cgs.gametype >= GT_TEAM && ci->team != match->team) ) { + continue; + } + ci->deferred = qtrue; + CG_CopyClientInfoModel( match, ci ); + return; + } + // load the full model, because we don't ever want to show + // an improper team skin. This will cause a hitch for the first + // player, when the second enters. Combat shouldn't be going on + // yet, so it shouldn't matter + CG_LoadClientInfo( ci ); + return; + } + + // find the first valid clientinfo and grab its stuff + for ( i = 0 ; i < cgs.maxclients ; i++ ) { + match = &cgs.clientinfo[ i ]; + if ( !match->infoValid ) { + continue; + } + + ci->deferred = qtrue; + CG_CopyClientInfoModel( match, ci ); + return; + } + + // we should never get here... + CG_Printf( "CG_SetDeferredClientInfo: no valid clients!\n" ); + + CG_LoadClientInfo( ci ); +} + + +/* +====================== +CG_NewClientInfo +====================== +*/ +void CG_NewClientInfo( int clientNum ) { + clientInfo_t *ci; + clientInfo_t newInfo; + const char *configstring; + const char *v; + char *slash; + + ci = &cgs.clientinfo[clientNum]; + + configstring = CG_ConfigString( clientNum + CS_PLAYERS ); + if ( !configstring[0] ) { + memset( ci, 0, sizeof( *ci ) ); + return; // player just left + } + + //PKMOD - Ergodic 01/09/02 - debug bot's userinfo (inactive) +// Com_Printf("CG_NewClientInfo - configstring>%s<\n", configstring); + + // build into a temp buffer so the defer checks can use + // the old value + memset( &newInfo, 0, sizeof( newInfo ) ); + + // isolate the player's name + v = Info_ValueForKey(configstring, "n"); + Q_strncpyz( newInfo.name, v, sizeof( newInfo.name ) ); + + // colors + v = Info_ValueForKey( configstring, "c1" ); + CG_ColorFromString( v, newInfo.color1 ); + + v = Info_ValueForKey( configstring, "c2" ); + CG_ColorFromString( v, newInfo.color2 ); + + // bot skill + v = Info_ValueForKey( configstring, "skill" ); + newInfo.botSkill = atoi( v ); + + //PKMOD - Ergodic 01/09/02 - add info to structure so Private Bot will not appear in scoreboard + // Private Bot + v = Info_ValueForKey( configstring, "pb" ); + //PKMOD - Ergodic 01/06/02 - debug bot's userinfo (inactive) +// Com_Printf("CG_NewClientInfo - privateBot>%s<\n", v ); + + if ( atoi( v ) == 1 ) + newInfo.privateBot = qtrue; + else + newInfo.privateBot = qfalse; + + // handicap + v = Info_ValueForKey( configstring, "hc" ); + newInfo.handicap = atoi( v ); + + // wins + v = Info_ValueForKey( configstring, "w" ); + newInfo.wins = atoi( v ); + + // losses + v = Info_ValueForKey( configstring, "l" ); + newInfo.losses = atoi( v ); + + // team + v = Info_ValueForKey( configstring, "t" ); + newInfo.team = atoi( v ); + + // team task + v = Info_ValueForKey( configstring, "tt" ); + newInfo.teamTask = atoi(v); + + // team leader + v = Info_ValueForKey( configstring, "tl" ); + newInfo.teamLeader = atoi(v); + + v = Info_ValueForKey( configstring, "g_redteam" ); + Q_strncpyz(newInfo.redTeam, v, MAX_TEAMNAME); + + v = Info_ValueForKey( configstring, "g_blueteam" ); + Q_strncpyz(newInfo.blueTeam, v, MAX_TEAMNAME); + + // model + v = Info_ValueForKey( configstring, "model" ); + if ( cg_forceModel.integer ) { + // forcemodel makes everyone use a single model + // to prevent load hitches + char modelStr[MAX_QPATH]; + char *skin; + + if( cgs.gametype >= GT_TEAM ) { + Q_strncpyz( newInfo.modelName, DEFAULT_TEAM_MODEL, sizeof( newInfo.modelName ) ); + Q_strncpyz( newInfo.skinName, "default", sizeof( newInfo.skinName ) ); + } else { + trap_Cvar_VariableStringBuffer( "model", modelStr, sizeof( modelStr ) ); + if ( ( skin = strchr( modelStr, '/' ) ) == NULL) { + skin = "default"; + } else { + *skin++ = 0; + } + + Q_strncpyz( newInfo.skinName, skin, sizeof( newInfo.skinName ) ); + Q_strncpyz( newInfo.modelName, modelStr, sizeof( newInfo.modelName ) ); + } + + if ( cgs.gametype >= GT_TEAM ) { + // keep skin name + slash = strchr( v, '/' ); + if ( slash ) { + Q_strncpyz( newInfo.skinName, slash + 1, sizeof( newInfo.skinName ) ); + } + } + } else { + Q_strncpyz( newInfo.modelName, v, sizeof( newInfo.modelName ) ); + + slash = strchr( newInfo.modelName, '/' ); + if ( !slash ) { + // modelName didn not include a skin name + Q_strncpyz( newInfo.skinName, "default", sizeof( newInfo.skinName ) ); + } else { + Q_strncpyz( newInfo.skinName, slash + 1, sizeof( newInfo.skinName ) ); + // truncate modelName + *slash = 0; + } + } + + // head model + v = Info_ValueForKey( configstring, "hmodel" ); + if ( cg_forceModel.integer ) { + // forcemodel makes everyone use a single model + // to prevent load hitches + char modelStr[MAX_QPATH]; + char *skin; + + if( cgs.gametype >= GT_TEAM ) { + Q_strncpyz( newInfo.headModelName, DEFAULT_TEAM_MODEL, sizeof( newInfo.headModelName ) ); + Q_strncpyz( newInfo.headSkinName, "default", sizeof( newInfo.headSkinName ) ); + } else { + trap_Cvar_VariableStringBuffer( "headmodel", modelStr, sizeof( modelStr ) ); + if ( ( skin = strchr( modelStr, '/' ) ) == NULL) { + skin = "default"; + } else { + *skin++ = 0; + } + + Q_strncpyz( newInfo.headSkinName, skin, sizeof( newInfo.headSkinName ) ); + Q_strncpyz( newInfo.headModelName, modelStr, sizeof( newInfo.headModelName ) ); + } + + if ( cgs.gametype >= GT_TEAM ) { + // keep skin name + slash = strchr( v, '/' ); + if ( slash ) { + Q_strncpyz( newInfo.headSkinName, slash + 1, sizeof( newInfo.headSkinName ) ); + } + } + } else { + Q_strncpyz( newInfo.headModelName, v, sizeof( newInfo.headModelName ) ); + + slash = strchr( newInfo.headModelName, '/' ); + if ( !slash ) { + // modelName didn not include a skin name + Q_strncpyz( newInfo.headSkinName, "default", sizeof( newInfo.headSkinName ) ); + } else { + Q_strncpyz( newInfo.headSkinName, slash + 1, sizeof( newInfo.headSkinName ) ); + // truncate modelName + *slash = 0; + } + } + + // scan for an existing clientinfo that matches this modelname + // so we can avoid loading checks if possible + if ( !CG_ScanForExistingClientInfo( &newInfo ) ) { + qboolean forceDefer; + + forceDefer = trap_MemoryRemaining() < 4000000; + + // if we are defering loads, just have it pick the first valid + if ( forceDefer || (cg_deferPlayers.integer && !cg_buildScript.integer && !cg.loading ) ) { + // keep whatever they had if it won't violate team skins + CG_SetDeferredClientInfo( &newInfo ); + // if we are low on memory, leave them with this model + if ( forceDefer ) { + CG_Printf( "Memory is low. Using deferred model.\n" ); + newInfo.deferred = qfalse; + } + } else { + CG_LoadClientInfo( &newInfo ); + } + } + + // replace whatever was there with the new one + newInfo.infoValid = qtrue; + *ci = newInfo; +} + + + +/* +====================== +CG_LoadDeferredPlayers + +Called each frame when a player is dead +and the scoreboard is up +so deferred players can be loaded +====================== +*/ +void CG_LoadDeferredPlayers( void ) { + int i; + clientInfo_t *ci; + + // scan for a deferred player to load + for ( i = 0, ci = cgs.clientinfo ; i < cgs.maxclients ; i++, ci++ ) { + if ( ci->infoValid && ci->deferred ) { + // if we are low on memory, leave it deferred + if ( trap_MemoryRemaining() < 4000000 ) { + CG_Printf( "Memory is low. Using deferred model.\n" ); + ci->deferred = qfalse; + continue; + } + CG_LoadClientInfo( ci ); +// break; + } + } +} + +/* +============================================================================= + +PLAYER ANIMATION + +============================================================================= +*/ + + +/* +=============== +CG_SetLerpFrameAnimation + +may include ANIM_TOGGLEBIT +=============== +*/ +static void CG_SetLerpFrameAnimation( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { + animation_t *anim; + + lf->animationNumber = newAnimation; + newAnimation &= ~ANIM_TOGGLEBIT; + + if ( newAnimation < 0 || newAnimation >= MAX_TOTALANIMATIONS ) { + CG_Error( "Bad animation number: %i", newAnimation ); + } + + anim = &ci->animations[ newAnimation ]; + + lf->animation = anim; + lf->animationTime = lf->frameTime + anim->initialLerp; + + if ( cg_debugAnim.integer ) { + CG_Printf( "Anim: %i\n", newAnimation ); + } +} + +/* +=============== +CG_RunLerpFrame + +Sets cg.snap, cg.oldFrame, and cg.backlerp +cg.time should be between oldFrameTime and frameTime after exit +=============== +*/ +static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float speedScale ) { + int f, numFrames; + animation_t *anim; + + // debugging tool to get no animations + if ( cg_animSpeed.integer == 0 ) { + lf->oldFrame = lf->frame = lf->backlerp = 0; + return; + } + + // see if the animation sequence is switching + if ( newAnimation != lf->animationNumber || !lf->animation ) { + CG_SetLerpFrameAnimation( ci, lf, newAnimation ); + } + + // if we have passed the current frame, move it to + // oldFrame and calculate a new frame + if ( cg.time >= lf->frameTime ) { + lf->oldFrame = lf->frame; + lf->oldFrameTime = lf->frameTime; + + // get the next frame based on the animation + anim = lf->animation; + if ( !anim->frameLerp ) { + return; // shouldn't happen + } + if ( cg.time < lf->animationTime ) { + lf->frameTime = lf->animationTime; // initial lerp + } else { + lf->frameTime = lf->oldFrameTime + anim->frameLerp; + } + f = ( lf->frameTime - lf->animationTime ) / anim->frameLerp; + f *= speedScale; // adjust for haste, etc + + numFrames = anim->numFrames; + if (anim->flipflop) { + numFrames *= 2; + } + if ( f >= numFrames ) { + f -= numFrames; + if ( anim->loopFrames ) { + f %= anim->loopFrames; + f += anim->numFrames - anim->loopFrames; + } else { + f = numFrames - 1; + // the animation is stuck at the end, so it + // can immediately transition to another sequence + lf->frameTime = cg.time; + } + } + if ( anim->reversed ) { + lf->frame = anim->firstFrame + anim->numFrames - 1 - f; + } + else if (anim->flipflop && f>=anim->numFrames) { + lf->frame = anim->firstFrame + anim->numFrames - 1 - (f%anim->numFrames); + } + else { + lf->frame = anim->firstFrame + f; + } + if ( cg.time > lf->frameTime ) { + lf->frameTime = cg.time; + if ( cg_debugAnim.integer ) { + CG_Printf( "Clamp lf->frameTime\n"); + } + } + } + + if ( lf->frameTime > cg.time + 200 ) { + lf->frameTime = cg.time; + } + + if ( lf->oldFrameTime > cg.time ) { + lf->oldFrameTime = cg.time; + } + // calculate current lerp value + if ( lf->frameTime == lf->oldFrameTime ) { + lf->backlerp = 0; + } else { + lf->backlerp = 1.0 - (float)( cg.time - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); + } +} + + +/* +=============== +CG_ClearLerpFrame +=============== +*/ +static void CG_ClearLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int animationNumber ) { + lf->frameTime = lf->oldFrameTime = cg.time; + CG_SetLerpFrameAnimation( ci, lf, animationNumber ); + lf->oldFrame = lf->frame = lf->animation->firstFrame; +} + + +/* +=============== +CG_PlayerAnimation +=============== +*/ +static void CG_PlayerAnimation( centity_t *cent, int *legsOld, int *legs, float *legsBackLerp, + int *torsoOld, int *torso, float *torsoBackLerp ) { + clientInfo_t *ci; + int clientNum; + float speedScale; + + clientNum = cent->currentState.clientNum; + + if ( cg_noPlayerAnims.integer ) { + *legsOld = *legs = *torsoOld = *torso = 0; + return; + } + + if ( cent->currentState.powerups & ( 1 << PW_HASTE ) ) { + speedScale = 1.5; + } else { + speedScale = 1; + } + + ci = &cgs.clientinfo[ clientNum ]; + + // do the shuffle turn frames locally + if ( cent->pe.legs.yawing && ( cent->currentState.legsAnim & ~ANIM_TOGGLEBIT ) == LEGS_IDLE ) { + CG_RunLerpFrame( ci, ¢->pe.legs, LEGS_TURN, speedScale ); + } else { + CG_RunLerpFrame( ci, ¢->pe.legs, cent->currentState.legsAnim, speedScale ); + } + + *legsOld = cent->pe.legs.oldFrame; + *legs = cent->pe.legs.frame; + *legsBackLerp = cent->pe.legs.backlerp; + + CG_RunLerpFrame( ci, ¢->pe.torso, cent->currentState.torsoAnim, speedScale ); + + *torsoOld = cent->pe.torso.oldFrame; + *torso = cent->pe.torso.frame; + *torsoBackLerp = cent->pe.torso.backlerp; +} + +/* +============================================================================= + +PLAYER ANGLES + +============================================================================= +*/ + +/* +================== +CG_SwingAngles +================== +*/ +static void CG_SwingAngles( float destination, float swingTolerance, float clampTolerance, + float speed, float *angle, qboolean *swinging ) { + float swing; + float move; + float scale; + + if ( !*swinging ) { + // see if a swing should be started + swing = AngleSubtract( *angle, destination ); + if ( swing > swingTolerance || swing < -swingTolerance ) { + *swinging = qtrue; + } + } + + if ( !*swinging ) { + return; + } + + // modify the speed depending on the delta + // so it doesn't seem so linear + swing = AngleSubtract( destination, *angle ); + scale = fabs( swing ); + if ( scale < swingTolerance * 0.5 ) { + scale = 0.5; + } else if ( scale < swingTolerance ) { + scale = 1.0; + } else { + scale = 2.0; + } + + // swing towards the destination angle + if ( swing >= 0 ) { + move = cg.frametime * scale * speed; + if ( move >= swing ) { + move = swing; + *swinging = qfalse; + } + *angle = AngleMod( *angle + move ); + } else if ( swing < 0 ) { + move = cg.frametime * scale * -speed; + if ( move <= swing ) { + move = swing; + *swinging = qfalse; + } + *angle = AngleMod( *angle + move ); + } + + // clamp to no more than tolerance + swing = AngleSubtract( destination, *angle ); + if ( swing > clampTolerance ) { + *angle = AngleMod( destination - (clampTolerance - 1) ); + } else if ( swing < -clampTolerance ) { + *angle = AngleMod( destination + (clampTolerance - 1) ); + } +} + +/* +================= +CG_AddPainTwitch +================= +*/ +static void CG_AddPainTwitch( centity_t *cent, vec3_t torsoAngles ) { + int t; + float f; + + t = cg.time - cent->pe.painTime; + if ( t >= PAIN_TWITCH_TIME ) { + return; + } + + f = 1.0 - (float)t / PAIN_TWITCH_TIME; + + if ( cent->pe.painDirection ) { + torsoAngles[ROLL] += 20 * f; + } else { + torsoAngles[ROLL] -= 20 * f; + } +} + + +/* +=============== +CG_PlayerAngles + +Handles seperate torso motion + + legs pivot based on direction of movement + + head always looks exactly at cent->lerpAngles + + if motion < 20 degrees, show in head only + if < 45 degrees, also show in torso +=============== +*/ +static void CG_PlayerAngles( centity_t *cent, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) { + vec3_t legsAngles, torsoAngles, headAngles; + float dest; + static int movementOffsets[8] = { 0, 22, 45, -22, 0, 22, -45, -22 }; + vec3_t velocity; + float speed; + int dir, clientNum; + clientInfo_t *ci; + + VectorCopy( cent->lerpAngles, headAngles ); + headAngles[YAW] = AngleMod( headAngles[YAW] ); + VectorClear( legsAngles ); + VectorClear( torsoAngles ); + + // --------- yaw ------------- + + // allow yaw to drift a bit + if ( ( cent->currentState.legsAnim & ~ANIM_TOGGLEBIT ) != LEGS_IDLE + || ( cent->currentState.torsoAnim & ~ANIM_TOGGLEBIT ) != TORSO_STAND ) { + // if not standing still, always point all in the same direction + cent->pe.torso.yawing = qtrue; // always center + cent->pe.torso.pitching = qtrue; // always center + cent->pe.legs.yawing = qtrue; // always center + } + + //PKMOD Ergodic 07/07/01 - debug new time2 encoding scheme (inactive) +// Com_Printf("CG_PlayerAngles - angles2[YAW]>%f<, time2>%d<\n", cent->currentState.angles2[YAW], ( cent->currentState.time2 >> 7 ) & 7 ); + + // adjust legs for movement dir + if ( cent->currentState.eFlags & EF_DEAD ) { + // don't let dead bodies twitch + dir = 0; + } else { + //PKMOD - Ergodic 07/07/01 - movementDir is now packed into time2 +// dir = cent->currentState.angles2[YAW]; + dir = ( cent->currentState.time2 >> 7 ) & 7; + if ( dir < 0 || dir > 7 ) { + CG_Error( "Bad player movement angle" ); + } + } + legsAngles[YAW] = headAngles[YAW] + movementOffsets[ dir ]; + torsoAngles[YAW] = headAngles[YAW] + 0.25 * movementOffsets[ dir ]; + + // torso + CG_SwingAngles( torsoAngles[YAW], 25, 90, cg_swingSpeed.value, ¢->pe.torso.yawAngle, ¢->pe.torso.yawing ); + CG_SwingAngles( legsAngles[YAW], 40, 90, cg_swingSpeed.value, ¢->pe.legs.yawAngle, ¢->pe.legs.yawing ); + + torsoAngles[YAW] = cent->pe.torso.yawAngle; + legsAngles[YAW] = cent->pe.legs.yawAngle; + + + // --------- pitch ------------- + + // only show a fraction of the pitch angle in the torso + if ( headAngles[PITCH] > 180 ) { + dest = (-360 + headAngles[PITCH]) * 0.75f; + } else { + dest = headAngles[PITCH] * 0.75f; + } + CG_SwingAngles( dest, 15, 30, 0.1f, ¢->pe.torso.pitchAngle, ¢->pe.torso.pitching ); + torsoAngles[PITCH] = cent->pe.torso.pitchAngle; + + // + clientNum = cent->currentState.clientNum; + if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { + ci = &cgs.clientinfo[ clientNum ]; + if ( ci->fixedtorso ) { + torsoAngles[PITCH] = 0.0f; + } + } + + // --------- roll ------------- + + + // lean towards the direction of travel + VectorCopy( cent->currentState.pos.trDelta, velocity ); + speed = VectorNormalize( velocity ); + if ( speed ) { + vec3_t axis[3]; + float side; + + speed *= 0.05f; + + AnglesToAxis( legsAngles, axis ); + side = speed * DotProduct( velocity, axis[1] ); + legsAngles[ROLL] -= side; + + side = speed * DotProduct( velocity, axis[0] ); + legsAngles[PITCH] += side; + } + + // + clientNum = cent->currentState.clientNum; + if ( clientNum >= 0 && clientNum < MAX_CLIENTS ) { + ci = &cgs.clientinfo[ clientNum ]; + if ( ci->fixedlegs ) { + legsAngles[YAW] = torsoAngles[YAW]; + legsAngles[PITCH] = 0.0f; + legsAngles[ROLL] = 0.0f; + } + } + + // pain twitch + CG_AddPainTwitch( cent, torsoAngles ); + + // pull the angles back out of the hierarchial chain + AnglesSubtract( headAngles, torsoAngles, headAngles ); + AnglesSubtract( torsoAngles, legsAngles, torsoAngles ); + AnglesToAxis( legsAngles, legs ); + AnglesToAxis( torsoAngles, torso ); + AnglesToAxis( headAngles, head ); +} + + +//========================================================================== + +/* +=============== +CG_HasteTrail +=============== +*/ +static void CG_HasteTrail( centity_t *cent ) { + localEntity_t *smoke; + vec3_t origin; + int anim; + + if ( cent->trailTime > cg.time ) { + return; + } + anim = cent->pe.legs.animationNumber & ~ANIM_TOGGLEBIT; + if ( anim != LEGS_RUN && anim != LEGS_BACK ) { + return; + } + + cent->trailTime += 100; + if ( cent->trailTime < cg.time ) { + cent->trailTime = cg.time; + } + + VectorCopy( cent->lerpOrigin, origin ); + origin[2] -= 16; + + smoke = CG_SmokePuff( origin, vec3_origin, + 8, + 1, 1, 1, 1, + 500, + cg.time, + 0, + 0, + cgs.media.hastePuffShader ); + + // use the optimized local entity add + smoke->leType = LE_SCALE_FADE; +} + +#ifdef MISSIONPACK +/* +=============== +CG_BreathPuffs +=============== +*/ +static void CG_BreathPuffs( centity_t *cent, refEntity_t *head) { + clientInfo_t *ci; + vec3_t up, origin; + int contents; + + ci = &cgs.clientinfo[ cent->currentState.number ]; + + if (!cg_enableBreath.integer) { + return; + } + if ( cent->currentState.number == cg.snap->ps.clientNum && !cg.renderingThirdPerson) { + return; + } + if ( cent->currentState.eFlags & EF_DEAD ) { + return; + } + contents = trap_CM_PointContents( head->origin, 0 ); + if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + return; + } + if ( ci->breathPuffTime > cg.time ) { + return; + } + + VectorSet( up, 0, 0, 8 ); + VectorMA(head->origin, 8, head->axis[0], origin); + VectorMA(origin, -4, head->axis[2], origin); + CG_SmokePuff( origin, up, 16, 1, 1, 1, 0.66f, 1500, cg.time, cg.time + 400, LEF_PUFF_DONT_SCALE, cgs.media.shotgunSmokePuffShader ); + ci->breathPuffTime = cg.time + 2000; +} + +/* +=============== +CG_DustTrail +=============== +*/ +static void CG_DustTrail( centity_t *cent ) { + int anim; + localEntity_t *dust; + vec3_t end, vel; + trace_t tr; + + if (!cg_enableDust.integer) + return; + + if ( cent->dustTrailTime > cg.time ) { + return; + } + + anim = cent->pe.legs.animationNumber & ~ANIM_TOGGLEBIT; + if ( anim != LEGS_LANDB && anim != LEGS_LAND ) { + return; + } + + cent->dustTrailTime += 40; + if ( cent->dustTrailTime < cg.time ) { + cent->dustTrailTime = cg.time; + } + + VectorCopy(cent->currentState.pos.trBase, end); + end[2] -= 64; + CG_Trace( &tr, cent->currentState.pos.trBase, NULL, NULL, end, cent->currentState.number, MASK_PLAYERSOLID ); + + if ( !(tr.surfaceFlags & SURF_DUST) ) + return; + + VectorCopy( cent->currentState.pos.trBase, end ); + end[2] -= 16; + + VectorSet(vel, 0, 0, -30); + dust = CG_SmokePuff( end, vel, + 24, + .8f, .8f, 0.7f, 0.33f, + 500, + cg.time, + 0, + 0, + cgs.media.dustPuffShader ); +} + +#endif + +/* +=============== +CG_TrailItem +=============== +*/ +static void CG_TrailItem( centity_t *cent, qhandle_t hModel ) { + refEntity_t ent; + vec3_t angles; + vec3_t axis[3]; + + VectorCopy( cent->lerpAngles, angles ); + angles[PITCH] = 0; + angles[ROLL] = 0; + AnglesToAxis( angles, axis ); + + memset( &ent, 0, sizeof( ent ) ); + VectorMA( cent->lerpOrigin, -16, axis[0], ent.origin ); + ent.origin[2] += 16; + angles[YAW] += 90; + AnglesToAxis( angles, ent.axis ); + + ent.hModel = hModel; + trap_R_AddRefEntityToScene( &ent ); +} + + +/* +=============== +CG_PlayerFlag +=============== +*/ +static void CG_PlayerFlag( centity_t *cent, qhandle_t hSkin, refEntity_t *torso ) { + clientInfo_t *ci; + refEntity_t pole; + refEntity_t flag; + vec3_t angles, dir; + int legsAnim, flagAnim, updateangles; + float angle, d; + + // show the flag pole model + memset( &pole, 0, sizeof(pole) ); + pole.hModel = cgs.media.flagPoleModel; + VectorCopy( torso->lightingOrigin, pole.lightingOrigin ); + pole.shadowPlane = torso->shadowPlane; + pole.renderfx = torso->renderfx; + CG_PositionEntityOnTag( &pole, torso, torso->hModel, "tag_flag" ); + trap_R_AddRefEntityToScene( &pole ); + + // show the flag model + memset( &flag, 0, sizeof(flag) ); + flag.hModel = cgs.media.flagFlapModel; + flag.customSkin = hSkin; + VectorCopy( torso->lightingOrigin, flag.lightingOrigin ); + flag.shadowPlane = torso->shadowPlane; + flag.renderfx = torso->renderfx; + + VectorClear(angles); + + updateangles = qfalse; + legsAnim = cent->currentState.legsAnim & ~ANIM_TOGGLEBIT; + if( legsAnim == LEGS_IDLE || legsAnim == LEGS_IDLECR ) { + flagAnim = FLAG_STAND; + } else if ( legsAnim == LEGS_WALK || legsAnim == LEGS_WALKCR ) { + flagAnim = FLAG_STAND; + updateangles = qtrue; + } else { + flagAnim = FLAG_RUN; + updateangles = qtrue; + } + + if ( updateangles ) { + + VectorCopy( cent->currentState.pos.trDelta, dir ); + // add gravity + dir[2] += 100; + VectorNormalize( dir ); + d = DotProduct(pole.axis[2], dir); + // if there is anough movement orthogonal to the flag pole + if (fabs(d) < 0.9) { + // + d = DotProduct(pole.axis[0], dir); + if (d > 1.0f) { + d = 1.0f; + } + else if (d < -1.0f) { + d = -1.0f; + } + angle = acos(d); + + d = DotProduct(pole.axis[1], dir); + if (d < 0) { + angles[YAW] = 360 - angle * 180 / M_PI; + } + else { + angles[YAW] = angle * 180 / M_PI; + } + if (angles[YAW] < 0) + angles[YAW] += 360; + if (angles[YAW] > 360) + angles[YAW] -= 360; + + //vectoangles( cent->currentState.pos.trDelta, tmpangles ); + //angles[YAW] = tmpangles[YAW] + 45 - cent->pe.torso.yawAngle; + // change the yaw angle + CG_SwingAngles( angles[YAW], 25, 90, 0.15f, ¢->pe.flag.yawAngle, ¢->pe.flag.yawing ); + } + + /* + d = DotProduct(pole.axis[2], dir); + angle = Q_acos(d); + + d = DotProduct(pole.axis[1], dir); + if (d < 0) { + angle = 360 - angle * 180 / M_PI; + } + else { + angle = angle * 180 / M_PI; + } + if (angle > 340 && angle < 20) { + flagAnim = FLAG_RUNUP; + } + if (angle > 160 && angle < 200) { + flagAnim = FLAG_RUNDOWN; + } + */ + } + + // set the yaw angle + angles[YAW] = cent->pe.flag.yawAngle; + // lerp the flag animation frames + ci = &cgs.clientinfo[ cent->currentState.clientNum ]; + CG_RunLerpFrame( ci, ¢->pe.flag, flagAnim, 1 ); + flag.oldframe = cent->pe.flag.oldFrame; + flag.frame = cent->pe.flag.frame; + flag.backlerp = cent->pe.flag.backlerp; + + AnglesToAxis( angles, flag.axis ); + CG_PositionRotatedEntityOnTag( &flag, &pole, pole.hModel, "tag_flag" ); + + trap_R_AddRefEntityToScene( &flag ); +} + + +#ifdef MISSIONPACK // bk001204 +/* +=============== +CG_PlayerTokens +=============== +*/ +static void CG_PlayerTokens( centity_t *cent, int renderfx ) { + int tokens, i, j; + float angle; + refEntity_t ent; + vec3_t dir, origin; + skulltrail_t *trail; + trail = &cg.skulltrails[cent->currentState.number]; + tokens = cent->currentState.generic1; + if ( !tokens ) { + trail->numpositions = 0; + return; + } + + if ( tokens > MAX_SKULLTRAIL ) { + tokens = MAX_SKULLTRAIL; + } + + // add skulls if there are more than last time + for (i = 0; i < tokens - trail->numpositions; i++) { + for (j = trail->numpositions; j > 0; j--) { + VectorCopy(trail->positions[j-1], trail->positions[j]); + } + VectorCopy(cent->lerpOrigin, trail->positions[0]); + } + trail->numpositions = tokens; + + // move all the skulls along the trail + VectorCopy(cent->lerpOrigin, origin); + for (i = 0; i < trail->numpositions; i++) { + VectorSubtract(trail->positions[i], origin, dir); + if (VectorNormalize(dir) > 30) { + VectorMA(origin, 30, dir, trail->positions[i]); + } + VectorCopy(trail->positions[i], origin); + } + + memset( &ent, 0, sizeof( ent ) ); + if( cgs.clientinfo[ cent->currentState.clientNum ].team == TEAM_BLUE ) { + ent.hModel = cgs.media.redCubeModel; + } else { + ent.hModel = cgs.media.blueCubeModel; + } + ent.renderfx = renderfx; + + VectorCopy(cent->lerpOrigin, origin); + for (i = 0; i < trail->numpositions; i++) { + VectorSubtract(origin, trail->positions[i], ent.axis[0]); + ent.axis[0][2] = 0; + VectorNormalize(ent.axis[0]); + VectorSet(ent.axis[2], 0, 0, 1); + CrossProduct(ent.axis[0], ent.axis[2], ent.axis[1]); + + VectorCopy(trail->positions[i], ent.origin); + angle = (((cg.time + 500 * MAX_SKULLTRAIL - 500 * i) / 16) & 255) * (M_PI * 2) / 255; + ent.origin[2] += sin(angle) * 10; + trap_R_AddRefEntityToScene( &ent ); + VectorCopy(trail->positions[i], origin); + } +} +#endif + + +/* +=============== +CG_PlayerPowerups +=============== +*/ +static void CG_PlayerPowerups( centity_t *cent, refEntity_t *torso ) { + int powerups; + clientInfo_t *ci; + + powerups = cent->currentState.powerups; + + //PKMOD - Ergodic 10/18/01 - debug modelindex2 usage for spare bits (inactive) +// if ( (rand() % 101) > 95 ) +// Com_Printf("CG_PlayerPowerups - modelindex2>%d<\n", cent->currentState.modelindex2); + + if ( !powerups ) { + return; + } + + // quad gives a dlight + if ( powerups & ( 1 << PW_QUAD ) ) { + trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.2f, 0.2f, 1 ); + } + + //PKMOD - Ergodic 12/05/01 - add radiate waring sound + if ( powerups & ( 1 << PW_RADIATE ) ) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, cgs.media.pkaradiatewarningSound ); + } + + //PKMOD - Ergodic 08/02/02 - add Personal Sentry hover sound + if ( powerups & ( 1 << PW_PERSENTRY ) ) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, cgs.media.pkapersentryhoverSound ); + } + + // flight plays a looped sound + if ( powerups & ( 1 << PW_FLIGHT ) ) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, cgs.media.flightSound ); + } + + ci = &cgs.clientinfo[ cent->currentState.clientNum ]; + // redflag + if ( powerups & ( 1 << PW_REDFLAG ) ) { + //PKMOD - Ergodic 08/29/01 - if not carrying the red flag + if ( ( cent->currentState.generic1 & 15 ) != PW_REDFLAG ) { + if (ci->newAnims) { + CG_PlayerFlag( cent, cgs.media.redFlagFlapSkin, torso ); + } + else { + CG_TrailItem( cent, cgs.media.redFlagModel ); + } + trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 1.0, 0.2f, 0.2f ); + } + } + + // blueflag + if ( powerups & ( 1 << PW_BLUEFLAG ) ) { + //PKMOD - Ergodic 08/29/01 - if not carrying the blue flag + if ( ( cent->currentState.generic1 & 15 ) != PW_BLUEFLAG ) { + if (ci->newAnims){ + CG_PlayerFlag( cent, cgs.media.blueFlagFlapSkin, torso ); + } + else { + CG_TrailItem( cent, cgs.media.blueFlagModel ); + } + trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 0.2f, 0.2f, 1.0 ); + + } + } + + // neutralflag + if ( powerups & ( 1 << PW_NEUTRALFLAG ) ) { + if (ci->newAnims) { + CG_PlayerFlag( cent, cgs.media.neutralFlagFlapSkin, torso ); + } + else { + CG_TrailItem( cent, cgs.media.neutralFlagModel ); + } + trap_R_AddLightToScene( cent->lerpOrigin, 200 + (rand()&31), 1.0, 1.0, 1.0 ); + } + + // haste leaves smoke trails + if ( powerups & ( 1 << PW_HASTE ) ) { + CG_HasteTrail( cent ); + } +} + + +/* +=============== +CG_PlayerFloatSprite + +Float a sprite over the player's head +=============== +*/ +static void CG_PlayerFloatSprite( centity_t *cent, qhandle_t shader ) { + int rf; + refEntity_t ent; + + if ( cent->currentState.number == cg.snap->ps.clientNum && !cg.renderingThirdPerson ) { + rf = RF_THIRD_PERSON; // only show in mirrors + } else { + rf = 0; + } + + memset( &ent, 0, sizeof( ent ) ); + VectorCopy( cent->lerpOrigin, ent.origin ); + ent.origin[2] += 48; + ent.reType = RT_SPRITE; + ent.customShader = shader; + ent.radius = 10; + ent.renderfx = rf; + ent.shaderRGBA[0] = 255; + ent.shaderRGBA[1] = 255; + ent.shaderRGBA[2] = 255; + ent.shaderRGBA[3] = 255; + trap_R_AddRefEntityToScene( &ent ); +} + + + +/* +=============== +CG_PlayerSprites + +Float sprites over the player's head +=============== +*/ +static void CG_PlayerSprites( centity_t *cent ) { + int team; + + if ( cent->currentState.eFlags & EF_CONNECTION ) { + CG_PlayerFloatSprite( cent, cgs.media.connectionShader ); + return; + } + + if ( cent->currentState.eFlags & EF_TALK ) { + CG_PlayerFloatSprite( cent, cgs.media.balloonShader ); + return; + } + + if ( cent->currentState.eFlags & EF_AWARD_IMPRESSIVE ) { + CG_PlayerFloatSprite( cent, cgs.media.medalImpressive ); + return; + } + + if ( cent->currentState.eFlags & EF_AWARD_EXCELLENT ) { + CG_PlayerFloatSprite( cent, cgs.media.medalExcellent ); + return; + } + + if ( cent->currentState.eFlags & EF_AWARD_GAUNTLET ) { + CG_PlayerFloatSprite( cent, cgs.media.medalGauntlet ); + return; + } + + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills + if ( cent->currentState.eFlags & EF_AWARD_PAINKILLER ) { + CG_PlayerFloatSprite( cent, cgs.media.medalPainKiller ); + return; + } + + if ( cent->currentState.eFlags & EF_AWARD_DEFEND ) { + CG_PlayerFloatSprite( cent, cgs.media.medalDefend ); + return; + } + + if ( cent->currentState.eFlags & EF_AWARD_ASSIST ) { + CG_PlayerFloatSprite( cent, cgs.media.medalAssist ); + return; + } + + if ( cent->currentState.eFlags & EF_AWARD_CAP ) { + CG_PlayerFloatSprite( cent, cgs.media.medalCapture ); + return; + } + + team = cgs.clientinfo[ cent->currentState.clientNum ].team; + if ( !(cent->currentState.eFlags & EF_DEAD) && + cg.snap->ps.persistant[PERS_TEAM] == team && + cgs.gametype >= GT_TEAM) { + if (cg_drawFriend.integer) { + CG_PlayerFloatSprite( cent, cgs.media.friendShader ); + } + return; + } +} + +/* +=============== +CG_PlayerShadow + +Returns the Z component of the surface being shadowed + + should it return a full plane instead of a Z? +=============== +*/ +#define SHADOW_DISTANCE 128 +static qboolean CG_PlayerShadow( centity_t *cent, float *shadowPlane ) { + vec3_t end, mins = {-15, -15, 0}, maxs = {15, 15, 2}; + trace_t trace; + float alpha; + + *shadowPlane = 0; + + if ( cg_shadows.integer == 0 ) { + return qfalse; + } + + // no shadows when invisible + if ( cent->currentState.powerups & ( 1 << PW_INVIS ) ) { + return qfalse; + } + + // send a trace down from the player to the ground + VectorCopy( cent->lerpOrigin, end ); + end[2] -= SHADOW_DISTANCE; + + trap_CM_BoxTrace( &trace, cent->lerpOrigin, end, mins, maxs, 0, MASK_PLAYERSOLID ); + + // no shadow if too high + if ( trace.fraction == 1.0 || trace.startsolid || trace.allsolid ) { + return qfalse; + } + + *shadowPlane = trace.endpos[2] + 1; + + if ( cg_shadows.integer != 1 ) { // no mark for stencil or projection shadows + return qtrue; + } + + // fade the shadow out with height + alpha = 1.0 - trace.fraction; + + // bk0101022 - hack / FPE - bogus planes? + //assert( DotProduct( trace.plane.normal, trace.plane.normal ) != 0.0f ) + + // add the mark as a temporary, so it goes directly to the renderer + // without taking a spot in the cg_marks array + CG_ImpactMark( cgs.media.shadowMarkShader, trace.endpos, trace.plane.normal, + cent->pe.legs.yawAngle, alpha,alpha,alpha,1, qfalse, 24, qtrue ); + + return qtrue; +} + + +/* +=============== +CG_PlayerSplash + +Draw a mark at the water surface +=============== +*/ +static void CG_PlayerSplash( centity_t *cent ) { + vec3_t start, end; + trace_t trace; + int contents; + polyVert_t verts[4]; + + if ( !cg_shadows.integer ) { + return; + } + + VectorCopy( cent->lerpOrigin, end ); + end[2] -= 24; + + // if the feet aren't in liquid, don't make a mark + // this won't handle moving water brushes, but they wouldn't draw right anyway... + contents = trap_CM_PointContents( end, 0 ); + if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) { + return; + } + + VectorCopy( cent->lerpOrigin, start ); + start[2] += 32; + + // if the head isn't out of liquid, don't make a mark + contents = trap_CM_PointContents( start, 0 ); + if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + return; + } + + // trace down to find the surface + trap_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ); + + if ( trace.fraction == 1.0 ) { + return; + } + + // create a mark polygon + VectorCopy( trace.endpos, verts[0].xyz ); + verts[0].xyz[0] -= 32; + verts[0].xyz[1] -= 32; + verts[0].st[0] = 0; + verts[0].st[1] = 0; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + VectorCopy( trace.endpos, verts[1].xyz ); + verts[1].xyz[0] -= 32; + verts[1].xyz[1] += 32; + verts[1].st[0] = 0; + verts[1].st[1] = 1; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + VectorCopy( trace.endpos, verts[2].xyz ); + verts[2].xyz[0] += 32; + verts[2].xyz[1] += 32; + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + VectorCopy( trace.endpos, verts[3].xyz ); + verts[3].xyz[0] += 32; + verts[3].xyz[1] -= 32; + verts[3].st[0] = 1; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + + trap_R_AddPolyToScene( cgs.media.wakeMarkShader, 4, verts ); +} + + + +/* +=============== +CG_AddRefEntityWithPowerups + +Adds a piece with modifications or duplications for powerups +Also called by CG_Missile for quad rockets, but nobody can tell... +=============== +*/ +void CG_AddRefEntityWithPowerups( refEntity_t *ent, entityState_t *state, int team ) { + + //PKMOD - Ergodic 08/22/00 - add logic for chainlightning player hit effect + if ( state->powerups & ( 1 << PW_CLGPLAYERHIT ) ) { + trap_R_AddRefEntityToScene( ent ); //add raw player "piece" image + ent->customShader = cgs.media.clgplayerhitShader; + trap_R_AddRefEntityToScene( ent ); //add player "piece" image with shader effect + } else { + if ( state->powerups & ( 1 << PW_INVIS ) ) { + ent->customShader = cgs.media.invisShader; + /* + if ( state->eFlags & EF_KAMIKAZE ) { + if (team == TEAM_BLUE) + ent->customShader = cgs.media.blueKamikazeShader; + else + ent->customShader = cgs.media.redKamikazeShader; + trap_R_AddRefEntityToScene( ent ); + } + else {*/ + trap_R_AddRefEntityToScene( ent ); + //} + + } else { + trap_R_AddRefEntityToScene( ent ); + + if ( state->powerups & ( 1 << PW_QUAD ) ) + { + if (team == TEAM_RED) + ent->customShader = cgs.media.redQuadShader; + else + ent->customShader = cgs.media.quadShader; + trap_R_AddRefEntityToScene( ent ); + } + if ( state->powerups & ( 1 << PW_REGEN ) ) { + if ( ( ( cg.time / 100 ) % 10 ) == 1 ) { + ent->customShader = cgs.media.regenShader; + trap_R_AddRefEntityToScene( ent ); + } + } + if ( state->powerups & ( 1 << PW_BATTLESUIT ) ) { + ent->customShader = cgs.media.battleSuitShader; + trap_R_AddRefEntityToScene( ent ); + } + } + } +} + +/* +================= +CG_LightVerts +================= +*/ +int CG_LightVerts( vec3_t normal, int numVerts, polyVert_t *verts ) +{ + int i, j; + float incoming; + vec3_t ambientLight; + vec3_t lightDir; + vec3_t directedLight; + + trap_R_LightForPoint( verts[0].xyz, ambientLight, directedLight, lightDir ); + + for (i = 0; i < numVerts; i++) { + incoming = DotProduct (normal, lightDir); + if ( incoming <= 0 ) { + verts[i].modulate[0] = ambientLight[0]; + verts[i].modulate[1] = ambientLight[1]; + verts[i].modulate[2] = ambientLight[2]; + verts[i].modulate[3] = 255; + continue; + } + j = ( ambientLight[0] + incoming * directedLight[0] ); + if ( j > 255 ) { + j = 255; + } + verts[i].modulate[0] = j; + + j = ( ambientLight[1] + incoming * directedLight[1] ); + if ( j > 255 ) { + j = 255; + } + verts[i].modulate[1] = j; + + j = ( ambientLight[2] + incoming * directedLight[2] ); + if ( j > 255 ) { + j = 255; + } + verts[i].modulate[2] = j; + + verts[i].modulate[3] = 255; + } + return qtrue; +} + +/* +=============== +CG_Player +=============== +*/ +void CG_Player( centity_t *cent ) { + clientInfo_t *ci; + refEntity_t legs; + refEntity_t torso; + refEntity_t head; + int clientNum; + int renderfx; + qboolean shadow; + float shadowPlane; + //PKMOD - Ergodic 05/07/02 - add active personal sentry model + refEntity_t persentry; + int holdtime; + +#ifdef MISSIONPACK + refEntity_t skull; + refEntity_t powerup; + int t; + float c; + float angle; + vec3_t dir, angles; +#endif + + + //PKMOD - Ergodic 11/30/01 - debug modelindex2 usage for spare bits (inactive) +// if ( (rand() % 101) > 95 ) +// Com_Printf("CG_Player - modelindex2>%d<\n", cent->currentState.modelindex2); + + + // the client number is stored in clientNum. It can't be derived + // from the entity number, because a single client may have + // multiple corpses on the level using the same clientinfo + clientNum = cent->currentState.clientNum; + if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + CG_Error( "Bad clientNum on player entity"); + } + ci = &cgs.clientinfo[ clientNum ]; + + //PKMOD - Ergodic 09/11/02 - display the Private Bot field effect if ent is a Private Bot and visible + if ( ci->privateBot ) { + if ( ! (cent->currentState.powerups & ( 1 << PW_INVIS ) ) ) { + refEntity_t pbfield; + + //PKMOD - Ergodic 09/11/02 - debug pb field effect (inactive) +// Com_Printf( "CG_Player - adding PB field\n" ); + + memset( &pbfield, 0, sizeof(pbfield) ); + VectorCopy( cent->lerpOrigin, pbfield.origin ); + AnglesToAxis( cent->lerpAngles, pbfield.axis ); + + pbfield.hModel = cgs.media.privatebot_CueModel; + trap_R_AddRefEntityToScene( &pbfield ); + } + } + + + // it is possible to see corpses from disconnected players that may + // not have valid clientinfo + if ( !ci->infoValid ) { + return; + } + + // get the player model information + renderfx = 0; + if ( cent->currentState.number == cg.snap->ps.clientNum) { + if (!cg.renderingThirdPerson) { + renderfx = RF_THIRD_PERSON; // only draw in mirrors + } else { + if (cg_cameraMode.integer) { + return; + } + } + } + + memset( &legs, 0, sizeof(legs) ); + memset( &torso, 0, sizeof(torso) ); + memset( &head, 0, sizeof(head) ); + + // get the rotation information + CG_PlayerAngles( cent, legs.axis, torso.axis, head.axis ); + + // get the animation state (after rotation, to allow feet shuffle) + CG_PlayerAnimation( cent, &legs.oldframe, &legs.frame, &legs.backlerp, + &torso.oldframe, &torso.frame, &torso.backlerp ); + +//PKMOD - Ergodic 11/13/00 - use time2 integer to store beartraps +//PKMOD - Ergodic 07/07/01 - use new packing scheme to encode # of beartraps + if ( cent->currentState.time2 & 3 ) + CG_BearTraps_Follow( cent ); + + //PKMOD - Ergodic 10/24/01 - add logic for radiation effect + if ( cent->currentState.powerups & ( 1 << PW_RADIATE ) ) { + if ( cent->PKA_RadiateTime < cg.time ) { + //PKMOD - Ergodic 11/24/01 - increase spark height + vec3_t sparkheight; + VectorCopy( cent->lerpOrigin, sparkheight ); + sparkheight[2] += DEFAULT_VIEWHEIGHT; + + CG_Radiation( sparkheight ); + cent->PKA_RadiateTime = cg.time + 1000; //every 1 seconds + } + } + + //PKMOD - Ergodic 11/30/01 - add logic for infected radiated player effect + if ( cent->currentState.modelindex2 & ( 1 << PKA_IRRADIATED ) ) { + + if ( cent->PKA_RadiateInfectTime < cg.time ) { + //PKMOD - Ergodic 11/24/01 - increase spark height + vec3_t sparkheight; + //PKMOD - Ergodic 12/01/01 - add a random velocity + vec3_t vel; + + VectorCopy( cent->lerpOrigin, sparkheight ); + sparkheight[2] += DEFAULT_VIEWHEIGHT + 5 - 2 * ( rand() % 5 ); + + vel[0] = 40 - 2 * ( rand() % 40 ); + vel[1] = 40 - 2 * ( rand() % 40 ); + vel[2] = 40 - 2 * ( rand() % 40 ); + + +// CG_RadiationTrail( sparkheight ); + + CG_RadiationTrail( sparkheight, vel, + 1, // radius + 1, 1, 1, 1, // color + 500, // trailTime + cg.time, // startTime + 0, //12/16/00 - add fadeInTime + 0, // flags + cgs.media.radiationTrailShader ); + +// cent->PKA_RadiateInfectTime = cg.time + 200 + rand() % 250; //every .2 seconds plus a random bit + cent->PKA_RadiateInfectTime = cg.time + 100 + rand() % 50; //every .1 seconds plus a random bit + } + } + + + // add the talk balloon or disconnect icon + CG_PlayerSprites( cent ); + + // add the shadow + shadow = CG_PlayerShadow( cent, &shadowPlane ); + + // add a water splash if partially in and out of water + CG_PlayerSplash( cent ); + + if ( cg_shadows.integer == 3 && shadow ) { + renderfx |= RF_SHADOW_PLANE; + } + renderfx |= RF_LIGHTING_ORIGIN; // use the same origin for all +#ifdef MISSIONPACK + if( cgs.gametype == GT_HARVESTER ) { + CG_PlayerTokens( cent, renderfx ); + } +#endif + // + // add the legs + // + legs.hModel = ci->legsModel; + legs.customSkin = ci->legsSkin; + + VectorCopy( cent->lerpOrigin, legs.origin ); + + VectorCopy( cent->lerpOrigin, legs.lightingOrigin ); + legs.shadowPlane = shadowPlane; + legs.renderfx = renderfx; + VectorCopy (legs.origin, legs.oldorigin); // don't positionally lerp at all + + CG_AddRefEntityWithPowerups( &legs, ¢->currentState, ci->team ); + + // if the model failed, allow the default nullmodel to be displayed + if (!legs.hModel) { + return; + } + + // + // add the torso + // + torso.hModel = ci->torsoModel; + if (!torso.hModel) { + return; + } + + torso.customSkin = ci->torsoSkin; + + VectorCopy( cent->lerpOrigin, torso.lightingOrigin ); + + CG_PositionRotatedEntityOnTag( &torso, &legs, ci->legsModel, "tag_torso"); + + torso.shadowPlane = shadowPlane; + torso.renderfx = renderfx; + + CG_AddRefEntityWithPowerups( &torso, ¢->currentState, ci->team ); + +#ifdef MISSIONPACK + if ( cent->currentState.eFlags & EF_KAMIKAZE ) { + + memset( &skull, 0, sizeof(skull) ); + + VectorCopy( cent->lerpOrigin, skull.lightingOrigin ); + skull.shadowPlane = shadowPlane; + skull.renderfx = renderfx; + + if ( cent->currentState.eFlags & EF_DEAD ) { + // one skull bobbing above the dead body + angle = ((cg.time / 7) & 255) * (M_PI * 2) / 255; + if (angle > M_PI * 2) + angle -= (float)M_PI * 2; + dir[0] = sin(angle) * 20; + dir[1] = cos(angle) * 20; + angle = ((cg.time / 4) & 255) * (M_PI * 2) / 255; + dir[2] = 15 + sin(angle) * 8; + VectorAdd(torso.origin, dir, skull.origin); + + dir[2] = 0; + VectorCopy(dir, skull.axis[1]); + VectorNormalize(skull.axis[1]); + VectorSet(skull.axis[2], 0, 0, 1); + CrossProduct(skull.axis[1], skull.axis[2], skull.axis[0]); + + skull.hModel = cgs.media.kamikazeHeadModel; + trap_R_AddRefEntityToScene( &skull ); + skull.hModel = cgs.media.kamikazeHeadTrail; + trap_R_AddRefEntityToScene( &skull ); + } + else { + // three skulls spinning around the player + angle = ((cg.time / 4) & 255) * (M_PI * 2) / 255; + dir[0] = cos(angle) * 20; + dir[1] = sin(angle) * 20; + dir[2] = cos(angle) * 20; + VectorAdd(torso.origin, dir, skull.origin); + + angles[0] = sin(angle) * 30; + angles[1] = (angle * 180 / M_PI) + 90; + if (angles[1] > 360) + angles[1] -= 360; + angles[2] = 0; + AnglesToAxis( angles, skull.axis ); + + /* + dir[2] = 0; + VectorInverse(dir); + VectorCopy(dir, skull.axis[1]); + VectorNormalize(skull.axis[1]); + VectorSet(skull.axis[2], 0, 0, 1); + CrossProduct(skull.axis[1], skull.axis[2], skull.axis[0]); + */ + + skull.hModel = cgs.media.kamikazeHeadModel; + trap_R_AddRefEntityToScene( &skull ); + // flip the trail because this skull is spinning in the other direction + VectorInverse(skull.axis[1]); + skull.hModel = cgs.media.kamikazeHeadTrail; + trap_R_AddRefEntityToScene( &skull ); + + angle = ((cg.time / 4) & 255) * (M_PI * 2) / 255 + M_PI; + if (angle > M_PI * 2) + angle -= (float)M_PI * 2; + dir[0] = sin(angle) * 20; + dir[1] = cos(angle) * 20; + dir[2] = cos(angle) * 20; + VectorAdd(torso.origin, dir, skull.origin); + + angles[0] = cos(angle - 0.5 * M_PI) * 30; + angles[1] = 360 - (angle * 180 / M_PI); + if (angles[1] > 360) + angles[1] -= 360; + angles[2] = 0; + AnglesToAxis( angles, skull.axis ); + + /* + dir[2] = 0; + VectorCopy(dir, skull.axis[1]); + VectorNormalize(skull.axis[1]); + VectorSet(skull.axis[2], 0, 0, 1); + CrossProduct(skull.axis[1], skull.axis[2], skull.axis[0]); + */ + + skull.hModel = cgs.media.kamikazeHeadModel; + trap_R_AddRefEntityToScene( &skull ); + skull.hModel = cgs.media.kamikazeHeadTrail; + trap_R_AddRefEntityToScene( &skull ); + + angle = ((cg.time / 3) & 255) * (M_PI * 2) / 255 + 0.5 * M_PI; + if (angle > M_PI * 2) + angle -= (float)M_PI * 2; + dir[0] = sin(angle) * 20; + dir[1] = cos(angle) * 20; + dir[2] = 0; + VectorAdd(torso.origin, dir, skull.origin); + + VectorCopy(dir, skull.axis[1]); + VectorNormalize(skull.axis[1]); + VectorSet(skull.axis[2], 0, 0, 1); + CrossProduct(skull.axis[1], skull.axis[2], skull.axis[0]); + + skull.hModel = cgs.media.kamikazeHeadModel; + trap_R_AddRefEntityToScene( &skull ); + skull.hModel = cgs.media.kamikazeHeadTrail; + trap_R_AddRefEntityToScene( &skull ); + } + } + + if ( cent->currentState.powerups & ( 1 << PW_GUARD ) ) { + memcpy(&powerup, &torso, sizeof(torso)); + powerup.hModel = cgs.media.guardPowerupModel; + powerup.frame = 0; + powerup.oldframe = 0; + powerup.customSkin = 0; + trap_R_AddRefEntityToScene( &powerup ); + } + if ( cent->currentState.powerups & ( 1 << PW_SCOUT ) ) { + memcpy(&powerup, &torso, sizeof(torso)); + powerup.hModel = cgs.media.scoutPowerupModel; + powerup.frame = 0; + powerup.oldframe = 0; + powerup.customSkin = 0; + trap_R_AddRefEntityToScene( &powerup ); + } + if ( cent->currentState.powerups & ( 1 << PW_DOUBLER ) ) { + memcpy(&powerup, &torso, sizeof(torso)); + powerup.hModel = cgs.media.doublerPowerupModel; + powerup.frame = 0; + powerup.oldframe = 0; + powerup.customSkin = 0; + trap_R_AddRefEntityToScene( &powerup ); + } + if ( cent->currentState.powerups & ( 1 << PW_AMMOREGEN ) ) { + memcpy(&powerup, &torso, sizeof(torso)); + powerup.hModel = cgs.media.ammoRegenPowerupModel; + powerup.frame = 0; + powerup.oldframe = 0; + powerup.customSkin = 0; + trap_R_AddRefEntityToScene( &powerup ); + } + if ( cent->currentState.powerups & ( 1 << PW_INVULNERABILITY ) ) { + if ( !ci->invulnerabilityStartTime ) { + ci->invulnerabilityStartTime = cg.time; + } + ci->invulnerabilityStopTime = cg.time; + } + else { + ci->invulnerabilityStartTime = 0; + } + if ( (cent->currentState.powerups & ( 1 << PW_INVULNERABILITY ) ) || + cg.time - ci->invulnerabilityStopTime < 250 ) { + + memcpy(&powerup, &torso, sizeof(torso)); + powerup.hModel = cgs.media.invulnerabilityPowerupModel; + powerup.customSkin = 0; + // always draw + powerup.renderfx &= ~RF_THIRD_PERSON; + VectorCopy(cent->lerpOrigin, powerup.origin); + + if ( cg.time - ci->invulnerabilityStartTime < 250 ) { + c = (float) (cg.time - ci->invulnerabilityStartTime) / 250; + } + else if (cg.time - ci->invulnerabilityStopTime < 250 ) { + c = (float) (250 - (cg.time - ci->invulnerabilityStopTime)) / 250; + } + else { + c = 1; + } + VectorSet( powerup.axis[0], c, 0, 0 ); + VectorSet( powerup.axis[1], 0, c, 0 ); + VectorSet( powerup.axis[2], 0, 0, c ); + trap_R_AddRefEntityToScene( &powerup ); + } + + t = cg.time - ci->medkitUsageTime; + if ( ci->medkitUsageTime && t < 500 ) { + memcpy(&powerup, &torso, sizeof(torso)); + powerup.hModel = cgs.media.medkitUsageModel; + powerup.customSkin = 0; + // always draw + powerup.renderfx &= ~RF_THIRD_PERSON; + VectorClear(angles); + AnglesToAxis(angles, powerup.axis); + VectorCopy(cent->lerpOrigin, powerup.origin); + powerup.origin[2] += -24 + (float) t * 80 / 500; + if ( t > 400 ) { + c = (float) (t - 1000) * 0xff / 100; + powerup.shaderRGBA[0] = 0xff - c; + powerup.shaderRGBA[1] = 0xff - c; + powerup.shaderRGBA[2] = 0xff - c; + powerup.shaderRGBA[3] = 0xff - c; + } + else { + powerup.shaderRGBA[0] = 0xff; + powerup.shaderRGBA[1] = 0xff; + powerup.shaderRGBA[2] = 0xff; + powerup.shaderRGBA[3] = 0xff; + } + trap_R_AddRefEntityToScene( &powerup ); + } +#endif // MISSIONPACK + + // + // add the head + // + head.hModel = ci->headModel; + if (!head.hModel) { + return; + } + head.customSkin = ci->headSkin; + + VectorCopy( cent->lerpOrigin, head.lightingOrigin ); + + CG_PositionRotatedEntityOnTag( &head, &torso, ci->torsoModel, "tag_head"); + + head.shadowPlane = shadowPlane; + head.renderfx = renderfx; + + CG_AddRefEntityWithPowerups( &head, ¢->currentState, ci->team ); + + //PKMOD - Ergodic 05/07/02 - if Personal Sentry is active on player + if ( cent->currentState.powerups & ( 1 << PW_PERSENTRY ) ) { +// if ( cent->currentState.modelindex2 & ( 1 << PKA_PERSENTRY_ACTIVE ) ) { + + //PKMOD - Ergodic 05/07/02 - debug persentry model (inactive) +// Com_Printf( "CG_Player - attaching persentry\n" ); + + memcpy(&persentry, &torso, sizeof(torso)); + persentry.hModel = cgs.media.persentry_active; + holdtime = cg.time / 50; // sec * ( 20f/sec / 1000 ) + persentry.frame = holdtime % 149; + persentry.oldframe = 0; + persentry.customSkin = 0; + trap_R_AddRefEntityToScene( &persentry ); + +//>>>>>>>>>>>> +/* + memset( &persentry, 0, sizeof(persentry) ); + + persentry.hModel = cgs.media.persentry_active; + +// torso.customSkin = ci->torsoSkin; + + VectorCopy( cent->lerpOrigin, persentry.lightingOrigin ); + + CG_PositionRotatedEntityOnTag( &persentry, &legs, ci->legsModel, "tag_persentry"); + + persentry.shadowPlane = shadowPlane; + persentry.renderfx = renderfx; + + CG_AddRefEntityWithPowerups( &persentry, ¢->currentState, ci->team ); + +//>>>>>>>>>>>> +*/ + + } + + +#ifdef MISSIONPACK + CG_BreathPuffs(cent, &head); + + CG_DustTrail(cent); +#endif + + // + // add the gun / barrel / flash + // + CG_AddPlayerWeapon( &torso, NULL, cent, ci->team ); + + // add powerups floating behind the player + CG_PlayerPowerups( cent, &torso ); +} + + +//===================================================================== + +/* +=============== +CG_ResetPlayerEntity + +A player just came into view or teleported, so reset all animation info +=============== +*/ +void CG_ResetPlayerEntity( centity_t *cent ) { + cent->errorTime = -99999; // guarantee no error decay added + cent->extrapolated = qfalse; + + CG_ClearLerpFrame( &cgs.clientinfo[ cent->currentState.clientNum ], ¢->pe.legs, cent->currentState.legsAnim ); + CG_ClearLerpFrame( &cgs.clientinfo[ cent->currentState.clientNum ], ¢->pe.torso, cent->currentState.torsoAnim ); + + BG_EvaluateTrajectory( ¢->currentState.pos, cg.time, cent->lerpOrigin ); + BG_EvaluateTrajectory( ¢->currentState.apos, cg.time, cent->lerpAngles ); + + VectorCopy( cent->lerpOrigin, cent->rawOrigin ); + VectorCopy( cent->lerpAngles, cent->rawAngles ); + + memset( ¢->pe.legs, 0, sizeof( cent->pe.legs ) ); + cent->pe.legs.yawAngle = cent->rawAngles[YAW]; + cent->pe.legs.yawing = qfalse; + cent->pe.legs.pitchAngle = 0; + cent->pe.legs.pitching = qfalse; + + memset( ¢->pe.torso, 0, sizeof( cent->pe.legs ) ); + cent->pe.torso.yawAngle = cent->rawAngles[YAW]; + cent->pe.torso.yawing = qfalse; + cent->pe.torso.pitchAngle = cent->rawAngles[PITCH]; + cent->pe.torso.pitching = qfalse; + + if ( cg_debugPosition.integer ) { + CG_Printf("%i ResetPlayerEntity yaw=%i\n", cent->currentState.number, cent->pe.torso.yawAngle ); + } +} + diff --git a/quake3/source/code/cgame/cg_playerstate.c b/quake3/source/code/cgame/cg_playerstate.c new file mode 100644 index 0000000..9077729 --- /dev/null +++ b/quake3/source/code/cgame/cg_playerstate.c @@ -0,0 +1,556 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_playerstate.c -- this file acts on changes in a new playerState_t +// With normal play, this will be done after local prediction, but when +// following another player or playing back a demo, it will be checked +// when the snapshot transitions like all the other entities + +#include "cg_local.h" + +/* +============== +CG_CheckAmmo + +If the ammo has gone low enough to generate the warning, play a sound +============== +*/ +void CG_CheckAmmo( void ) { + int i; + int total; + int previous; + int weapons; + + // see about how many seconds of ammo we have remaining + weapons = cg.snap->ps.stats[ STAT_WEAPONS ]; + total = 0; + for ( i = WP_MACHINEGUN ; i < WP_NUM_WEAPONS ; i++ ) { + if ( ! ( weapons & ( 1 << i ) ) ) { + continue; + } + switch ( i ) { + case WP_ROCKET_LAUNCHER: + case WP_GRENADE_LAUNCHER: + case WP_RAILGUN: + case WP_SHOTGUN: +#ifdef MISSIONPACK + case WP_PROX_LAUNCHER: +#endif + total += cg.snap->ps.ammo[i] * 1000; + break; + default: + total += cg.snap->ps.ammo[i] * 200; + break; + } + if ( total >= 5000 ) { + cg.lowAmmoWarning = 0; + return; + } + } + + previous = cg.lowAmmoWarning; + + if ( total == 0 ) { + cg.lowAmmoWarning = 2; + } else { + cg.lowAmmoWarning = 1; + } + + // play a sound on transitions + if ( cg.lowAmmoWarning != previous ) { + trap_S_StartLocalSound( cgs.media.noAmmoSound, CHAN_LOCAL_SOUND ); + } +} + +/* +============== +CG_DamageFeedback +============== +*/ +void CG_DamageFeedback( int yawByte, int pitchByte, int damage ) { + float left, front, up; + float kick; + int health; + float scale; + vec3_t dir; + vec3_t angles; + float dist; + float yaw, pitch; + + // show the attacking player's head and name in corner + cg.attackerTime = cg.time; + + // the lower on health you are, the greater the view kick will be + health = cg.snap->ps.stats[STAT_HEALTH]; + if ( health < 40 ) { + scale = 1; + } else { + scale = 40.0 / health; + } + kick = damage * scale; + + if (kick < 5) + kick = 5; + if (kick > 10) + kick = 10; + + // if yaw and pitch are both 255, make the damage always centered (falling, etc) + if ( yawByte == 255 && pitchByte == 255 ) { + cg.damageX = 0; + cg.damageY = 0; + cg.v_dmg_roll = 0; + cg.v_dmg_pitch = -kick; + } else { + // positional + pitch = pitchByte / 255.0 * 360; + yaw = yawByte / 255.0 * 360; + + angles[PITCH] = pitch; + angles[YAW] = yaw; + angles[ROLL] = 0; + + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( angles, dir, NULL, NULL ); + AngleVectorsForward( angles, dir ); + VectorSubtract( vec3_origin, dir, dir ); + + front = DotProduct (dir, cg.refdef.viewaxis[0] ); + left = DotProduct (dir, cg.refdef.viewaxis[1] ); + up = DotProduct (dir, cg.refdef.viewaxis[2] ); + + dir[0] = front; + dir[1] = left; + dir[2] = 0; + dist = VectorLength( dir ); + if ( dist < 0.1 ) { + dist = 0.1f; + } + + cg.v_dmg_roll = kick * left; + + cg.v_dmg_pitch = -kick * front; + + if ( front <= 0.1 ) { + front = 0.1f; + } + cg.damageX = -left / front; + cg.damageY = up / dist; + } + + // clamp the position + if ( cg.damageX > 1.0 ) { + cg.damageX = 1.0; + } + if ( cg.damageX < - 1.0 ) { + cg.damageX = -1.0; + } + + if ( cg.damageY > 1.0 ) { + cg.damageY = 1.0; + } + if ( cg.damageY < - 1.0 ) { + cg.damageY = -1.0; + } + + // don't let the screen flashes vary as much + if ( kick > 10 ) { + kick = 10; + } + cg.damageValue = kick; + cg.v_dmg_time = cg.time + DAMAGE_TIME; + cg.damageTime = cg.snap->serverTime; +} + + + + +/* +================ +CG_Respawn + +A respawn happened this snapshot +================ +*/ +void CG_Respawn( void ) { + // no error decay on player movement + cg.thisFrameTeleport = qtrue; + + // display weapons available + cg.weaponSelectTime = cg.time; + + // select the weapon the server says we are using + cg.weaponSelect = cg.snap->ps.weapon; + + //PKMOD - Ergodic 04/04/01, holds last weapon +// cg.weaponLast = cg.snap->ps.stats[ STAT_LAST_WEAPON ]; + + //PKMOD - Ergodic 04/04/01 - debug (inactive) +// Com_Printf( "CG_Respawn - current>%d<, last>%d<\n", cg.weaponSelect, cg.weaponLast ); + +} + +extern char *eventnames[]; + +/* +============== +CG_CheckPlayerstateEvents +============== +*/ +void CG_CheckPlayerstateEvents( playerState_t *ps, playerState_t *ops ) { + int i; + int event; + centity_t *cent; + + if ( ps->externalEvent && ps->externalEvent != ops->externalEvent ) { + cent = &cg_entities[ ps->clientNum ]; + cent->currentState.event = ps->externalEvent; + cent->currentState.eventParm = ps->externalEventParm; + CG_EntityEvent( cent, cent->lerpOrigin ); + } + + cent = &cg.predictedPlayerEntity; // cg_entities[ ps->clientNum ]; + // go through the predictable events buffer + for ( i = ps->eventSequence - MAX_PS_EVENTS ; i < ps->eventSequence ; i++ ) { + // if we have a new predictable event + if ( i >= ops->eventSequence + // or the server told us to play another event instead of a predicted event we already issued + // or something the server told us changed our prediction causing a different event + || (i > ops->eventSequence - MAX_PS_EVENTS && ps->events[i & (MAX_PS_EVENTS-1)] != ops->events[i & (MAX_PS_EVENTS-1)]) ) { + + event = ps->events[ i & (MAX_PS_EVENTS-1) ]; + cent->currentState.event = event; + cent->currentState.eventParm = ps->eventParms[ i & (MAX_PS_EVENTS-1) ]; + CG_EntityEvent( cent, cent->lerpOrigin ); + + cg.predictableEvents[ i & (MAX_PREDICTED_EVENTS-1) ] = event; + + cg.eventSequence++; + } + } +} + +/* +================== +CG_CheckChangedPredictableEvents +================== +*/ +void CG_CheckChangedPredictableEvents( playerState_t *ps ) { + int i; + int event; + centity_t *cent; + + cent = &cg.predictedPlayerEntity; + for ( i = ps->eventSequence - MAX_PS_EVENTS ; i < ps->eventSequence ; i++ ) { + // + if (i >= cg.eventSequence) { + continue; + } + // if this event is not further back in than the maximum predictable events we remember + if (i > cg.eventSequence - MAX_PREDICTED_EVENTS) { + // if the new playerstate event is different from a previously predicted one + if ( ps->events[i & (MAX_PS_EVENTS-1)] != cg.predictableEvents[i & (MAX_PREDICTED_EVENTS-1) ] ) { + + event = ps->events[ i & (MAX_PS_EVENTS-1) ]; + cent->currentState.event = event; + cent->currentState.eventParm = ps->eventParms[ i & (MAX_PS_EVENTS-1) ]; + CG_EntityEvent( cent, cent->lerpOrigin ); + + cg.predictableEvents[ i & (MAX_PREDICTED_EVENTS-1) ] = event; + + if ( cg_showmiss.integer ) { + CG_Printf("WARNING: changed predicted event\n"); + } + } + } + } +} + +/* +================== +pushReward +================== +*/ +static void pushReward(sfxHandle_t sfx, qhandle_t shader, int rewardCount) { + if (cg.rewardStack < (MAX_REWARDSTACK-1)) { + cg.rewardStack++; + cg.rewardSound[cg.rewardStack] = sfx; + cg.rewardShader[cg.rewardStack] = shader; + cg.rewardCount[cg.rewardStack] = rewardCount; + } +} + +/* +================== +CG_CheckLocalSounds +================== +*/ +void CG_CheckLocalSounds( playerState_t *ps, playerState_t *ops ) { + int highScore, health, armor, reward; + sfxHandle_t sfx; + int hold_stat_bits; //PKMOD - Ergodic 02/05/02 - hold the ATTACK bits for the proper sounds + + // don't play the sounds if the player just changed teams + if ( ps->persistant[PERS_TEAM] != ops->persistant[PERS_TEAM] ) { + return; + } + + // hit changes + if ( ps->persistant[PERS_HITS] > ops->persistant[PERS_HITS] ) { + armor = ps->persistant[PERS_ATTACKEE_ARMOR] & 0xff; + health = ps->persistant[PERS_ATTACKEE_ARMOR] >> 8; +#ifdef MISSIONPACK + if (armor > 50 ) { + trap_S_StartLocalSound( cgs.media.hitSoundHighArmor, CHAN_LOCAL_SOUND ); + } else if (armor || health > 100) { + trap_S_StartLocalSound( cgs.media.hitSoundLowArmor, CHAN_LOCAL_SOUND ); + } else { + trap_S_StartLocalSound( cgs.media.hitSound, CHAN_LOCAL_SOUND ); + } +#else + //PKMOD - Ergodic 02/05/02 - decode the ATTACK bits for the proper sounds + hold_stat_bits = ps->stats[STAT_PKA_BITS] & PKA_BITS_SENTRYATTACK; + switch ( hold_stat_bits ) { + case PKA_BITS_BEARTRAPATTACK: + trap_S_StartLocalSound( cgs.media.beartrap_attackSound, CHAN_LOCAL_SOUND ); + break; + case PKA_BITS_SENTRYATTACK: + trap_S_StartLocalSound( cgs.media.autosentry_attackSound, CHAN_LOCAL_SOUND ); + break; + case PKA_BITS_RADIATEATTACK: + trap_S_StartLocalSound( cgs.media.radiate_attackSound, CHAN_LOCAL_SOUND ); + break; + default: + trap_S_StartLocalSound( cgs.media.hitSound, CHAN_LOCAL_SOUND ); + break; + } + +#endif + } else if ( ps->persistant[PERS_HITS] < ops->persistant[PERS_HITS] ) { + trap_S_StartLocalSound( cgs.media.hitTeamSound, CHAN_LOCAL_SOUND ); + } + + // health changes of more than -1 should make pain sounds + if ( ps->stats[STAT_HEALTH] < ops->stats[STAT_HEALTH] - 1 ) { + if ( ps->stats[STAT_HEALTH] > 0 ) { + CG_PainEvent( &cg.predictedPlayerEntity, ps->stats[STAT_HEALTH] ); + } + } + + + // if we are going into the intermission, don't start any voices + if ( cg.intermissionStarted ) { + return; + } + + // reward sounds + reward = qfalse; + if (ps->persistant[PERS_CAPTURES] != ops->persistant[PERS_CAPTURES]) { + pushReward(cgs.media.captureAwardSound, cgs.media.medalCapture, ps->persistant[PERS_CAPTURES]); + reward = qtrue; + //Com_Printf("capture\n"); + } + if (ps->persistant[PERS_IMPRESSIVE_COUNT] != ops->persistant[PERS_IMPRESSIVE_COUNT]) { +#ifdef MISSIONPACK + if (ps->persistant[PERS_IMPRESSIVE_COUNT] == 1) { + sfx = cgs.media.firstImpressiveSound; + } else { + sfx = cgs.media.impressiveSound; + } +#else + sfx = cgs.media.impressiveSound; +#endif + pushReward(sfx, cgs.media.medalImpressive, ps->persistant[PERS_IMPRESSIVE_COUNT]); + reward = qtrue; + //Com_Printf("impressive\n"); + } + if (ps->persistant[PERS_EXCELLENT_COUNT] != ops->persistant[PERS_EXCELLENT_COUNT]) { +#ifdef MISSIONPACK + if (ps->persistant[PERS_EXCELLENT_COUNT] == 1) { + sfx = cgs.media.firstExcellentSound; + } else { + sfx = cgs.media.excellentSound; + } +#else + sfx = cgs.media.excellentSound; +#endif + pushReward(sfx, cgs.media.medalExcellent, ps->persistant[PERS_EXCELLENT_COUNT]); + reward = qtrue; + //Com_Printf("excellent\n"); + } + if (ps->persistant[PERS_GAUNTLET_FRAG_COUNT] != ops->persistant[PERS_GAUNTLET_FRAG_COUNT]) { +#ifdef MISSIONPACK + if (ops->persistant[PERS_GAUNTLET_FRAG_COUNT] == 1) { + sfx = cgs.media.firstHumiliationSound; + } else { + sfx = cgs.media.humiliationSound; + } +#else + sfx = cgs.media.humiliationSound; +#endif + pushReward(sfx, cgs.media.medalGauntlet, ps->persistant[PERS_GAUNTLET_FRAG_COUNT]); + reward = qtrue; + //Com_Printf("guantlet frag\n"); + } + if (ps->persistant[PERS_DEFEND_COUNT] != ops->persistant[PERS_DEFEND_COUNT]) { + pushReward(cgs.media.defendSound, cgs.media.medalDefend, ps->persistant[PERS_DEFEND_COUNT]); + reward = qtrue; + //Com_Printf("defend\n"); + } + if (ps->persistant[PERS_ASSIST_COUNT] != ops->persistant[PERS_ASSIST_COUNT]) { + pushReward(cgs.media.assistSound, cgs.media.medalAssist, ps->persistant[PERS_ASSIST_COUNT]); + reward = qtrue; + //Com_Printf("assist\n"); + } + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills + //PKMOD - Ergodic 12/16/00 - shift off add HUB_FLAG (first bit of PERS_PAINKILLER_COUNT) + if ( ( (ps->persistant[PERS_PAINKILLER_COUNT] >> 1) / 10 ) != ( (ops->persistant[PERS_PAINKILLER_COUNT] >> 1) / 10 )) { + //PKMOD - Ergodic 12/26/00 fixed typo on painkiller announcement sound + sfx = cgs.media.painkillerSound; + pushReward(sfx, cgs.media.medalPainKiller, (ps->persistant[PERS_PAINKILLER_COUNT] >> 1) / 10); + reward = qtrue; + //Com_Printf("painkiller\n"); + } + + //PKMOD OLD 1.17 codebase + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills +// case REWARD_PAINKILLER: +// trap_S_StartLocalSound( cgs.media.painkillerSound, CHAN_ANNOUNCER ); +// cg.rewardTime = cg.time; +// cg.rewardShader = cgs.media.medalPainKiller; +// cg.rewardCount = ps->persistant[PERS_PAINKILLER_COUNT] / 10; +// break; + + + // if any of the player event bits changed + if (ps->persistant[PERS_PLAYEREVENTS] != ops->persistant[PERS_PLAYEREVENTS]) { + if ((ps->persistant[PERS_PLAYEREVENTS] & PLAYEREVENT_DENIEDREWARD) != + (ops->persistant[PERS_PLAYEREVENTS] & PLAYEREVENT_DENIEDREWARD)) { + trap_S_StartLocalSound( cgs.media.deniedSound, CHAN_ANNOUNCER ); + } + else if ((ps->persistant[PERS_PLAYEREVENTS] & PLAYEREVENT_GAUNTLETREWARD) != + (ops->persistant[PERS_PLAYEREVENTS] & PLAYEREVENT_GAUNTLETREWARD)) { + trap_S_StartLocalSound( cgs.media.humiliationSound, CHAN_ANNOUNCER ); + } + else if ((ps->persistant[PERS_PLAYEREVENTS] & PLAYEREVENT_HOLYSHIT) != + (ops->persistant[PERS_PLAYEREVENTS] & PLAYEREVENT_HOLYSHIT)) { + trap_S_StartLocalSound( cgs.media.holyShitSound, CHAN_ANNOUNCER ); + } + reward = qtrue; + } + + // check for flag pickup + if ( cgs.gametype >= GT_TEAM ) { + if ((ps->powerups[PW_REDFLAG] != ops->powerups[PW_REDFLAG] && ps->powerups[PW_REDFLAG]) || + (ps->powerups[PW_BLUEFLAG] != ops->powerups[PW_BLUEFLAG] && ps->powerups[PW_BLUEFLAG]) || + (ps->powerups[PW_NEUTRALFLAG] != ops->powerups[PW_NEUTRALFLAG] && ps->powerups[PW_NEUTRALFLAG]) ) + { + trap_S_StartLocalSound( cgs.media.youHaveFlagSound, CHAN_ANNOUNCER ); + } + } + + // lead changes + if (!reward) { + // + if ( !cg.warmup ) { + // never play lead changes during warmup + if ( ps->persistant[PERS_RANK] != ops->persistant[PERS_RANK] ) { + //PKMOD - Ergodic 01/20/02 - don't play sounds when comparing with private bots + //PKMOD - Ergodic 02/05/02 - change STAT_PKA_BITS settings from enum type to definition + if ( !( ( ops->stats[STAT_PKA_BITS] & PKA_BITS_PRIVATEBOT ) || ( ps->stats[STAT_PKA_BITS] & PKA_BITS_PRIVATEBOT ) ) ) { + if ( cgs.gametype < GT_TEAM) { + if ( ps->persistant[PERS_RANK] == 0 ) { + CG_AddBufferedSound(cgs.media.takenLeadSound); + } else if ( ps->persistant[PERS_RANK] == RANK_TIED_FLAG ) { + CG_AddBufferedSound(cgs.media.tiedLeadSound); + } else if ( ( ops->persistant[PERS_RANK] & ~RANK_TIED_FLAG ) == 0 ) { + CG_AddBufferedSound(cgs.media.lostLeadSound); + } + } + } + } + } + } + + // timelimit warnings + if ( cgs.timelimit > 0 ) { + int msec; + + msec = cg.time - cgs.levelStartTime; + if ( !( cg.timelimitWarnings & 4 ) && msec > ( cgs.timelimit * 60 + 2 ) * 1000 ) { + cg.timelimitWarnings |= 1 | 2 | 4; + trap_S_StartLocalSound( cgs.media.suddenDeathSound, CHAN_ANNOUNCER ); + } + else if ( !( cg.timelimitWarnings & 2 ) && msec > (cgs.timelimit - 1) * 60 * 1000 ) { + cg.timelimitWarnings |= 1 | 2; + trap_S_StartLocalSound( cgs.media.oneMinuteSound, CHAN_ANNOUNCER ); + } + else if ( cgs.timelimit > 5 && !( cg.timelimitWarnings & 1 ) && msec > (cgs.timelimit - 5) * 60 * 1000 ) { + cg.timelimitWarnings |= 1; + trap_S_StartLocalSound( cgs.media.fiveMinuteSound, CHAN_ANNOUNCER ); + } + } + + // fraglimit warnings + if ( cgs.fraglimit > 0 && cgs.gametype < GT_CTF) { + highScore = cgs.scores1; + if ( !( cg.fraglimitWarnings & 4 ) && highScore == (cgs.fraglimit - 1) ) { + cg.fraglimitWarnings |= 1 | 2 | 4; + CG_AddBufferedSound(cgs.media.oneFragSound); + } + else if ( cgs.fraglimit > 2 && !( cg.fraglimitWarnings & 2 ) && highScore == (cgs.fraglimit - 2) ) { + cg.fraglimitWarnings |= 1 | 2; + CG_AddBufferedSound(cgs.media.twoFragSound); + } + else if ( cgs.fraglimit > 3 && !( cg.fraglimitWarnings & 1 ) && highScore == (cgs.fraglimit - 3) ) { + cg.fraglimitWarnings |= 1; + CG_AddBufferedSound(cgs.media.threeFragSound); + } + } +} + +/* +=============== +CG_TransitionPlayerState + +=============== +*/ +void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ) { + // check for changing follow mode + if ( ps->clientNum != ops->clientNum ) { + cg.thisFrameTeleport = qtrue; + // make sure we don't get any unwanted transition effects + *ops = *ps; + } + + // damage events (player is getting wounded) + if ( ps->damageEvent != ops->damageEvent && ps->damageCount ) { + CG_DamageFeedback( ps->damageYaw, ps->damagePitch, ps->damageCount ); + } + + // respawning + if ( ps->persistant[PERS_SPAWN_COUNT] != ops->persistant[PERS_SPAWN_COUNT] ) { + CG_Respawn(); + } + + if ( cg.mapRestart ) { + CG_Respawn(); + cg.mapRestart = qfalse; + } + + if ( cg.snap->ps.pm_type != PM_INTERMISSION + && ps->persistant[PERS_TEAM] != TEAM_SPECTATOR ) { + CG_CheckLocalSounds( ps, ops ); + } + + // check for going low on ammo + CG_CheckAmmo(); + + // run events + CG_CheckPlayerstateEvents( ps, ops ); + + // smooth the ducking viewheight change + if ( ps->viewheight != ops->viewheight ) { + cg.duckChange = ps->viewheight - ops->viewheight; + cg.duckTime = cg.time; + } +} + diff --git a/quake3/source/code/cgame/cg_predict.c b/quake3/source/code/cgame/cg_predict.c new file mode 100644 index 0000000..221469b --- /dev/null +++ b/quake3/source/code/cgame/cg_predict.c @@ -0,0 +1,643 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_predict.c -- this file generates cg.predictedPlayerState by either +// interpolating between snapshots from the server or locally predicting +// ahead the client's movement. +// It also handles local physics interaction, like fragments bouncing off walls + +#include "cg_local.h" + +static pmove_t cg_pmove; + +static int cg_numSolidEntities; +static centity_t *cg_solidEntities[MAX_ENTITIES_IN_SNAPSHOT]; +static int cg_numTriggerEntities; +static centity_t *cg_triggerEntities[MAX_ENTITIES_IN_SNAPSHOT]; + +/* +==================== +CG_BuildSolidList + +When a new cg.snap has been set, this function builds a sublist +of the entities that are actually solid, to make for more +efficient collision detection +==================== +*/ +void CG_BuildSolidList( void ) { + int i; + centity_t *cent; + snapshot_t *snap; + entityState_t *ent; + + cg_numSolidEntities = 0; + cg_numTriggerEntities = 0; + + if ( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) { + snap = cg.nextSnap; + } else { + snap = cg.snap; + } + + for ( i = 0 ; i < snap->numEntities ; i++ ) { + cent = &cg_entities[ snap->entities[ i ].number ]; + ent = ¢->currentState; + + //PKMOD Ergodic debug 07/04/01 (inactive) +// if ( ent->eType == ET_ZOMBIE ) { +// Com_Printf( "CG_BuildSolidList et_zombie found\n" ); +// } + + + //PKMOD Ergodic debug 09/30/01 (inactive) +// if ( ent->eType == ET_LIGHTNING_FX ) { +// Com_Printf( "CG_BuildSolidList ET_LIGHTNING_FX found\n" ); +// } + + + //PKMOD - Ergodic. 05/30/00 modify for beartrap + //PKMOD - Ergodic 11/15/00 add functionality to make trigger_push silent + if ( ent->eType == ET_BEARTRAP || ent->eType == ET_ITEM || ent->eType == ET_PUSH_TRIGGER || ent->eType == ET_TELEPORT_TRIGGER || ent->eType == ET_QUIET_TRIGGER) { + cg_triggerEntities[cg_numTriggerEntities] = cent; + cg_numTriggerEntities++; + continue; + } + + if ( cent->nextState.solid ) { + cg_solidEntities[cg_numSolidEntities] = cent; + cg_numSolidEntities++; + continue; + } + } +} + +/* +==================== +CG_ClipMoveToEntities + +==================== +*/ +static void CG_ClipMoveToEntities ( const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, + int skipNumber, int mask, trace_t *tr ) { + int i, x, zd, zu; + trace_t trace; + entityState_t *ent; + clipHandle_t cmodel; + vec3_t bmins, bmaxs; + vec3_t origin, angles; + centity_t *cent; + + for ( i = 0 ; i < cg_numSolidEntities ; i++ ) { + cent = cg_solidEntities[ i ]; + ent = ¢->currentState; + + if ( ent->number == skipNumber ) { + continue; + } + + if ( ent->solid == SOLID_BMODEL ) { + // special value for bmodel + cmodel = trap_CM_InlineModel( ent->modelindex ); + VectorCopy( cent->lerpAngles, angles ); + BG_EvaluateTrajectory( ¢->currentState.pos, cg.physicsTime, origin ); + } else { + // encoded bbox + x = (ent->solid & 255); + zd = ((ent->solid>>8) & 255); + zu = ((ent->solid>>16) & 255) - 32; + + bmins[0] = bmins[1] = -x; + bmaxs[0] = bmaxs[1] = x; + bmins[2] = -zd; + bmaxs[2] = zu; + + cmodel = trap_CM_TempBoxModel( bmins, bmaxs ); + VectorCopy( vec3_origin, angles ); + VectorCopy( cent->lerpOrigin, origin ); + } + + + trap_CM_TransformedBoxTrace ( &trace, start, end, + mins, maxs, cmodel, mask, origin, angles); + + if (trace.allsolid || trace.fraction < tr->fraction) { + trace.entityNum = ent->number; + *tr = trace; + } else if (trace.startsolid) { + tr->startsolid = qtrue; + } + if ( tr->allsolid ) { + return; + } + } +} + +/* +================ +CG_Trace +================ +*/ +void CG_Trace( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, + int skipNumber, int mask ) { + + trace_t t; + + trap_CM_BoxTrace ( &t, start, end, mins, maxs, 0, mask); + t.entityNum = t.fraction != 1.0 ? ENTITYNUM_WORLD : ENTITYNUM_NONE; + // check all other solid models + CG_ClipMoveToEntities (start, mins, maxs, end, skipNumber, mask, &t); + + *result = t; +} + +/* +================ +CG_PointContents +================ +*/ +int CG_PointContents( const vec3_t point, int passEntityNum ) { + int i; + entityState_t *ent; + centity_t *cent; + clipHandle_t cmodel; + int contents; + + contents = trap_CM_PointContents (point, 0); + + for ( i = 0 ; i < cg_numSolidEntities ; i++ ) { + cent = cg_solidEntities[ i ]; + + ent = ¢->currentState; + + if ( ent->number == passEntityNum ) { + continue; + } + + if (ent->solid != SOLID_BMODEL) { // special value for bmodel + continue; + } + + cmodel = trap_CM_InlineModel( ent->modelindex ); + if ( !cmodel ) { + continue; + } + + contents |= trap_CM_TransformedPointContents( point, cmodel, ent->origin, ent->angles ); + } + + return contents; +} + + +/* +======================== +CG_InterpolatePlayerState + +Generates cg.predictedPlayerState by interpolating between +cg.snap->player_state and cg.nextFrame->player_state +======================== +*/ +static void CG_InterpolatePlayerState( qboolean grabAngles ) { + float f; + int i; + playerState_t *out; + snapshot_t *prev, *next; + + out = &cg.predictedPlayerState; + prev = cg.snap; + next = cg.nextSnap; + + *out = cg.snap->ps; + + // if we are still allowing local input, short circuit the view angles + if ( grabAngles ) { + usercmd_t cmd; + int cmdNum; + + cmdNum = trap_GetCurrentCmdNumber(); + trap_GetUserCmd( cmdNum, &cmd ); + + PM_UpdateViewAngles( out, &cmd ); + } + + // if the next frame is a teleport, we can't lerp to it + if ( cg.nextFrameTeleport ) { + return; + } + + if ( !next || next->serverTime <= prev->serverTime ) { + return; + } + + f = (float)( cg.time - prev->serverTime ) / ( next->serverTime - prev->serverTime ); + + i = next->ps.bobCycle; + if ( i < prev->ps.bobCycle ) { + i += 256; // handle wraparound + } + out->bobCycle = prev->ps.bobCycle + f * ( i - prev->ps.bobCycle ); + + for ( i = 0 ; i < 3 ; i++ ) { + out->origin[i] = prev->ps.origin[i] + f * (next->ps.origin[i] - prev->ps.origin[i] ); + if ( !grabAngles ) { + out->viewangles[i] = LerpAngle( + prev->ps.viewangles[i], next->ps.viewangles[i], f ); + } + out->velocity[i] = prev->ps.velocity[i] + + f * (next->ps.velocity[i] - prev->ps.velocity[i] ); + } + +} + +/* +=================== +CG_TouchItem +//PKMOD - Ergodic 09/26/00 - don't register the touching of the voting_image entity. +// The voting_image is not a pickup item +=================== +*/ +static void CG_TouchItem( centity_t *cent ) { + gitem_t *item; + + if ( !cg_predictItems.integer ) { + return; + } + if ( !BG_PlayerTouchesItem( &cg.predictedPlayerState, ¢->currentState, cg.time ) ) { + return; + } + + // never pick an item up twice in a prediction + if ( cent->miscTime == cg.time ) { + return; + } + + if ( !BG_CanItemBeGrabbed( cgs.gametype, ¢->currentState, &cg.predictedPlayerState ) ) { + return; // can't hold it + } + + item = &bg_itemlist[ cent->currentState.modelindex ]; + + //PKMOD - Ergodic 09/26/00 - don't pickup the voting_image + if ( item->giType == IT_VOTING ) { + //PKMOD - Ergodic 09/28/00 - debug inactive +// Com_Printf("CG_TouchItem - voting entity index >%d<\n", cent->currentState.otherEntityNum ); + return; + } + + // Special case for flags. + // We don't predict touching our own flag +#ifdef MISSIONPACK + if( cgs.gametype == GT_1FCTF ) { + if( item->giTag != PW_NEUTRALFLAG ) { + return; + } + } + if( cgs.gametype == GT_CTF || cgs.gametype == GT_HARVESTER ) { +#else + if( cgs.gametype == GT_CTF ) { +#endif + if (cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_RED && + item->giTag == PW_REDFLAG) + return; + if (cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_BLUE && + item->giTag == PW_BLUEFLAG) + return; + } + + // grab it + BG_AddPredictableEventToPlayerstate( EV_ITEM_PICKUP, cent->currentState.modelindex , &cg.predictedPlayerState); + + // remove it from the frame so it won't be drawn + cent->currentState.eFlags |= EF_NODRAW; + + // don't touch it again this prediction + cent->miscTime = cg.time; + + // if its a weapon, give them some predicted ammo so the autoswitch will work + if ( item->giType == IT_WEAPON ) { + cg.predictedPlayerState.stats[ STAT_WEAPONS ] |= 1 << item->giTag; + if ( !cg.predictedPlayerState.ammo[ item->giTag ] ) { + cg.predictedPlayerState.ammo[ item->giTag ] = 1; + } + } +} + + +/* +========================= +CG_TouchTriggerPrediction + +Predict push triggers and items +========================= +*/ +static void CG_TouchTriggerPrediction( void ) { + int i; + trace_t trace; + entityState_t *ent; + clipHandle_t cmodel; + centity_t *cent; + qboolean spectator; + + // dead clients don't activate triggers + if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) { + return; + } + + spectator = ( cg.predictedPlayerState.pm_type == PM_SPECTATOR ); + + if ( cg.predictedPlayerState.pm_type != PM_NORMAL && !spectator ) { + return; + } + + for ( i = 0 ; i < cg_numTriggerEntities ; i++ ) { + cent = cg_triggerEntities[ i ]; + ent = ¢->currentState; + + if ( ent->eType == ET_ITEM && !spectator ) { + CG_TouchItem( cent ); + continue; + } + +//PKMOD - Ergodic. 05/30/00 modify for beartrap + if ( ent->eType == ET_BEARTRAP && !spectator ) { +//PKMOD - Ergodic 06/03/00 don't fire up cg_touchitem for launched beartraps +// CG_TouchItem( cent ); + continue; + } + + + if ( ent->solid != SOLID_BMODEL ) { + continue; + } + + cmodel = trap_CM_InlineModel( ent->modelindex ); + if ( !cmodel ) { + continue; + } + + trap_CM_BoxTrace( &trace, cg.predictedPlayerState.origin, cg.predictedPlayerState.origin, + cg_pmove.mins, cg_pmove.maxs, cmodel, -1 ); + + if ( !trace.startsolid ) { + continue; + } + + if ( ent->eType == ET_TELEPORT_TRIGGER ) { + cg.hyperspace = qtrue; + } else if ( ( ent->eType == ET_PUSH_TRIGGER ) || ( ent->eType == ET_TELEPORT_TRIGGER ) || ( ent->eType == ET_QUIET_TRIGGER ) ){ + BG_TouchJumpPad( &cg.predictedPlayerState, ent ); + } + } + + // if we didn't touch a jump pad this pmove frame + if ( cg.predictedPlayerState.jumppad_frame != cg.predictedPlayerState.pmove_framecount ) { + cg.predictedPlayerState.jumppad_frame = 0; + cg.predictedPlayerState.jumppad_ent = 0; + } +} + + + +/* +================= +CG_PredictPlayerState + +Generates cg.predictedPlayerState for the current cg.time +cg.predictedPlayerState is guaranteed to be valid after exiting. + +For demo playback, this will be an interpolation between two valid +playerState_t. + +For normal gameplay, it will be the result of predicted usercmd_t on +top of the most recent playerState_t received from the server. + +Each new snapshot will usually have one or more new usercmd over the last, +but we simulate all unacknowledged commands each time, not just the new ones. +This means that on an internet connection, quite a few pmoves may be issued +each frame. + +OPTIMIZE: don't re-simulate unless the newly arrived snapshot playerState_t +differs from the predicted one. Would require saving all intermediate +playerState_t during prediction. + +We detect prediction errors and allow them to be decayed off over several frames +to ease the jerk. +================= +*/ +void CG_PredictPlayerState( void ) { + int cmdNum, current; + playerState_t oldPlayerState; + qboolean moved; + usercmd_t oldestCmd; + usercmd_t latestCmd; + + cg.hyperspace = qfalse; // will be set if touching a trigger_teleport + + // if this is the first frame we must guarantee + // predictedPlayerState is valid even if there is some + // other error condition + if ( !cg.validPPS ) { + cg.validPPS = qtrue; + cg.predictedPlayerState = cg.snap->ps; + } + + + // demo playback just copies the moves + if ( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW) ) { + CG_InterpolatePlayerState( qfalse ); + return; + } + + // non-predicting local movement will grab the latest angles + if ( cg_nopredict.integer || cg_synchronousClients.integer ) { + CG_InterpolatePlayerState( qtrue ); + return; + } + + // prepare for pmove + cg_pmove.ps = &cg.predictedPlayerState; + cg_pmove.trace = CG_Trace; + cg_pmove.pointcontents = CG_PointContents; + if ( cg_pmove.ps->pm_type == PM_DEAD ) { + cg_pmove.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; + } + else { + cg_pmove.tracemask = MASK_PLAYERSOLID; + } + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR ) { + cg_pmove.tracemask &= ~CONTENTS_BODY; // spectators can fly through bodies + } + cg_pmove.noFootsteps = ( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; + + // save the state before the pmove so we can detect transitions + oldPlayerState = cg.predictedPlayerState; + + current = trap_GetCurrentCmdNumber(); + + // if we don't have the commands right after the snapshot, we + // can't accurately predict a current position, so just freeze at + // the last good position we had + cmdNum = current - CMD_BACKUP + 1; + trap_GetUserCmd( cmdNum, &oldestCmd ); + if ( oldestCmd.serverTime > cg.snap->ps.commandTime + && oldestCmd.serverTime < cg.time ) { // special check for map_restart + if ( cg_showmiss.integer ) { + CG_Printf ("exceeded PACKET_BACKUP on commands\n"); + } + return; + } + + // get the latest command so we can know which commands are from previous map_restarts + trap_GetUserCmd( current, &latestCmd ); + + // get the most recent information we have, even if + // the server time is beyond our current cg.time, + // because predicted player positions are going to + // be ahead of everything else anyway + if ( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) { + cg.predictedPlayerState = cg.nextSnap->ps; + cg.physicsTime = cg.nextSnap->serverTime; + } else { + cg.predictedPlayerState = cg.snap->ps; + cg.physicsTime = cg.snap->serverTime; + } + + if ( pmove_msec.integer < 8 ) { + trap_Cvar_Set("pmove_msec", "8"); + } + else if (pmove_msec.integer > 33) { + trap_Cvar_Set("pmove_msec", "33"); + } + + cg_pmove.pmove_fixed = pmove_fixed.integer;// | cg_pmove_fixed.integer; + cg_pmove.pmove_msec = pmove_msec.integer; + + // run cmds + moved = qfalse; + for ( cmdNum = current - CMD_BACKUP + 1 ; cmdNum <= current ; cmdNum++ ) { + // get the command + trap_GetUserCmd( cmdNum, &cg_pmove.cmd ); + + if ( cg_pmove.pmove_fixed ) { + PM_UpdateViewAngles( cg_pmove.ps, &cg_pmove.cmd ); + } + + // don't do anything if the time is before the snapshot player time + if ( cg_pmove.cmd.serverTime <= cg.predictedPlayerState.commandTime ) { + continue; + } + + // don't do anything if the command was from a previous map_restart + if ( cg_pmove.cmd.serverTime > latestCmd.serverTime ) { + continue; + } + + // check for a prediction error from last frame + // on a lan, this will often be the exact value + // from the snapshot, but on a wan we will have + // to predict several commands to get to the point + // we want to compare + if ( cg.predictedPlayerState.commandTime == oldPlayerState.commandTime ) { + vec3_t delta; + float len; + + if ( cg.thisFrameTeleport ) { + // a teleport will not cause an error decay + VectorClear( cg.predictedError ); + if ( cg_showmiss.integer ) { + CG_Printf( "PredictionTeleport\n" ); + } + cg.thisFrameTeleport = qfalse; + } else { + vec3_t adjusted; + CG_AdjustPositionForMover( cg.predictedPlayerState.origin, + cg.predictedPlayerState.groundEntityNum, cg.physicsTime, cg.oldTime, adjusted ); + + if ( cg_showmiss.integer ) { + if (!VectorCompare( oldPlayerState.origin, adjusted )) { + CG_Printf("prediction error\n"); + } + } + VectorSubtract( oldPlayerState.origin, adjusted, delta ); + len = VectorLength( delta ); + if ( len > 0.1 ) { + if ( cg_showmiss.integer ) { + CG_Printf("Prediction miss: %f\n", len); + } + if ( cg_errorDecay.integer ) { + int t; + float f; + + t = cg.time - cg.predictedErrorTime; + f = ( cg_errorDecay.value - t ) / cg_errorDecay.value; + if ( f < 0 ) { + f = 0; + } + if ( f > 0 && cg_showmiss.integer ) { + CG_Printf("Double prediction decay: %f\n", f); + } + VectorScale( cg.predictedError, f, cg.predictedError ); + } else { + VectorClear( cg.predictedError ); + } + VectorAdd( delta, cg.predictedError, cg.predictedError ); + cg.predictedErrorTime = cg.oldTime; + } + } + } + + // don't predict gauntlet firing, which is only supposed to happen + // when it actually inflicts damage + cg_pmove.gauntletHit = qfalse; + + if ( cg_pmove.pmove_fixed ) { + cg_pmove.cmd.serverTime = ((cg_pmove.cmd.serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer; + } + + //PKMOD - Ergodic 04/05/01 - debug (inactive) +// Com_Printf( "CG_PredictPlayerState - calling pmove\n" ); + + Pmove (&cg_pmove); + + moved = qtrue; + + // add push trigger movement effects + CG_TouchTriggerPrediction(); + + // check for predictable events that changed from previous predictions + //CG_CheckChangedPredictableEvents(&cg.predictedPlayerState); + } + + if ( cg_showmiss.integer > 1 ) { + CG_Printf( "[%i : %i] ", cg_pmove.cmd.serverTime, cg.time ); + } + + if ( !moved ) { + if ( cg_showmiss.integer ) { + CG_Printf( "not moved\n" ); + } + return; + } + + // adjust for the movement of the groundentity + CG_AdjustPositionForMover( cg.predictedPlayerState.origin, + cg.predictedPlayerState.groundEntityNum, + cg.physicsTime, cg.time, cg.predictedPlayerState.origin ); + + if ( cg_showmiss.integer ) { + if (cg.predictedPlayerState.eventSequence > oldPlayerState.eventSequence + MAX_PS_EVENTS) { + CG_Printf("WARNING: dropped event\n"); + } + } + + // fire events and other transition triggered things + CG_TransitionPlayerState( &cg.predictedPlayerState, &oldPlayerState ); + + if ( cg_showmiss.integer ) { + if (cg.eventSequence > cg.predictedPlayerState.eventSequence) { + CG_Printf("WARNING: double event\n"); + cg.eventSequence = cg.predictedPlayerState.eventSequence; + } + } +} + + diff --git a/quake3/source/code/cgame/cg_public.h b/quake3/source/code/cgame/cg_public.h new file mode 100644 index 0000000..2aaef36 --- /dev/null +++ b/quake3/source/code/cgame/cg_public.h @@ -0,0 +1,218 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + + +#define CMD_BACKUP 64 +#define CMD_MASK (CMD_BACKUP - 1) +// allow a lot of command backups for very fast systems +// multiple commands may be combined into a single packet, so this +// needs to be larger than PACKET_BACKUP + + +#define MAX_ENTITIES_IN_SNAPSHOT 256 + +// snapshots are a view of the server at a given time + +// Snapshots are generated at regular time intervals by the server, +// but they may not be sent if a client's rate level is exceeded, or +// they may be dropped by the network. +typedef struct { + int snapFlags; // SNAPFLAG_RATE_DELAYED, etc + int ping; + + int serverTime; // server time the message is valid for (in msec) + + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + entityState_t entities[MAX_ENTITIES_IN_SNAPSHOT]; // at the time of this snapshot + + int numServerCommands; // text based server commands to execute when this + int serverCommandSequence; // snapshot becomes current +} snapshot_t; + +enum { + CGAME_EVENT_NONE, + CGAME_EVENT_TEAMMENU, + CGAME_EVENT_SCOREBOARD, + CGAME_EVENT_EDITHUD +}; + + +/* +================================================================== + +functions imported from the main executable + +================================================================== +*/ + +#define CGAME_IMPORT_API_VERSION 4 + +typedef enum { + CG_PRINT, + CG_ERROR, + CG_MILLISECONDS, + CG_CVAR_REGISTER, + CG_CVAR_UPDATE, + CG_CVAR_SET, + CG_CVAR_VARIABLESTRINGBUFFER, + CG_ARGC, + CG_ARGV, + CG_ARGS, + CG_FS_FOPENFILE, + CG_FS_READ, + CG_FS_WRITE, + CG_FS_FCLOSEFILE, + CG_SENDCONSOLECOMMAND, + CG_ADDCOMMAND, + CG_SENDCLIENTCOMMAND, + CG_UPDATESCREEN, + CG_CM_LOADMAP, + CG_CM_NUMINLINEMODELS, + CG_CM_INLINEMODEL, + CG_CM_LOADMODEL, + CG_CM_TEMPBOXMODEL, + CG_CM_POINTCONTENTS, + CG_CM_TRANSFORMEDPOINTCONTENTS, + CG_CM_BOXTRACE, + CG_CM_TRANSFORMEDBOXTRACE, + CG_CM_MARKFRAGMENTS, + CG_S_STARTSOUND, + CG_S_STARTLOCALSOUND, + CG_S_CLEARLOOPINGSOUNDS, + CG_S_ADDLOOPINGSOUND, + CG_S_UPDATEENTITYPOSITION, + CG_S_RESPATIALIZE, + CG_S_REGISTERSOUND, + CG_S_STARTBACKGROUNDTRACK, + CG_R_LOADWORLDMAP, + CG_R_REGISTERMODEL, + CG_R_REGISTERSKIN, + CG_R_REGISTERSHADER, + CG_R_CLEARSCENE, + CG_R_ADDREFENTITYTOSCENE, + CG_R_ADDPOLYTOSCENE, + CG_R_ADDLIGHTTOSCENE, + CG_R_RENDERSCENE, + CG_R_SETCOLOR, + CG_R_DRAWSTRETCHPIC, + CG_R_MODELBOUNDS, + CG_R_LERPTAG, + CG_GETGLCONFIG, + CG_GETGAMESTATE, + CG_GETCURRENTSNAPSHOTNUMBER, + CG_GETSNAPSHOT, + CG_GETSERVERCOMMAND, + CG_GETCURRENTCMDNUMBER, + CG_GETUSERCMD, + CG_SETUSERCMDVALUE, + CG_R_REGISTERSHADERNOMIP, + CG_MEMORY_REMAINING, + CG_R_REGISTERFONT, + CG_KEY_ISDOWN, + CG_KEY_GETCATCHER, + CG_KEY_SETCATCHER, + CG_KEY_GETKEY, + CG_PC_ADD_GLOBAL_DEFINE, + CG_PC_LOAD_SOURCE, + CG_PC_FREE_SOURCE, + CG_PC_READ_TOKEN, + CG_PC_SOURCE_FILE_AND_LINE, + CG_S_STOPBACKGROUNDTRACK, + CG_REAL_TIME, + CG_SNAPVECTOR, + CG_REMOVECOMMAND, + CG_R_LIGHTFORPOINT, + CG_CIN_PLAYCINEMATIC, + CG_CIN_STOPCINEMATIC, + CG_CIN_RUNCINEMATIC, + CG_CIN_DRAWCINEMATIC, + CG_CIN_SETEXTENTS, + CG_R_REMAP_SHADER, + CG_S_ADDREALLOOPINGSOUND, + CG_S_STOPLOOPINGSOUND, + + CG_CM_TEMPCAPSULEMODEL, + CG_CM_CAPSULETRACE, + CG_CM_TRANSFORMEDCAPSULETRACE, + CG_R_ADDADDITIVELIGHTTOSCENE, + CG_GET_ENTITY_TOKEN, + CG_R_ADDPOLYSTOSCENE, + CG_R_INPVS, + // 1.32 + CG_FS_SEEK, + +/* + CG_LOADCAMERA, + CG_STARTCAMERA, + CG_GETCAMERAINFO, +*/ + + CG_MEMSET = 100, + CG_MEMCPY, + CG_STRNCPY, + CG_SIN, + CG_COS, + CG_ATAN2, + CG_SQRT, + CG_FLOOR, + CG_CEIL, + CG_TESTPRINTINT, + CG_TESTPRINTFLOAT, + CG_ACOS +} cgameImport_t; + + +/* +================================================================== + +functions exported to the main executable + +================================================================== +*/ + +typedef enum { + CG_INIT, +// void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) + // called when the level loads or when the renderer is restarted + // all media should be registered at this time + // cgame will display loading status by calling SCR_Update, which + // will call CG_DrawInformation during the loading process + // reliableCommandSequence will be 0 on fresh loads, but higher for + // demos, tourney restarts, or vid_restarts + + CG_SHUTDOWN, +// void (*CG_Shutdown)( void ); + // oportunity to flush and close any open files + + CG_CONSOLE_COMMAND, +// qboolean (*CG_ConsoleCommand)( void ); + // a console command has been issued locally that is not recognized by the + // main game system. + // use Cmd_Argc() / Cmd_Argv() to read the command, return qfalse if the + // command is not known to the game + + CG_DRAW_ACTIVE_FRAME, +// void (*CG_DrawActiveFrame)( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ); + // Generates and draws a game scene and status information at the given time. + // If demoPlayback is set, local movement prediction will not be enabled + + CG_CROSSHAIR_PLAYER, +// int (*CG_CrosshairPlayer)( void ); + + CG_LAST_ATTACKER, +// int (*CG_LastAttacker)( void ); + + CG_KEY_EVENT, +// void (*CG_KeyEvent)( int key, qboolean down ); + + CG_MOUSE_EVENT, +// void (*CG_MouseEvent)( int dx, int dy ); + CG_EVENT_HANDLING +// void (*CG_EventHandling)(int type); +} cgameExport_t; + +//---------------------------------------------- diff --git a/quake3/source/code/cgame/cg_scoreboard.c b/quake3/source/code/cgame/cg_scoreboard.c new file mode 100644 index 0000000..ed2c660 --- /dev/null +++ b/quake3/source/code/cgame/cg_scoreboard.c @@ -0,0 +1,531 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_scoreboard -- draw the scoreboard on top of the game screen +#include "cg_local.h" + + +#define SCOREBOARD_X (0) + +#define SB_HEADER 86 +#define SB_TOP (SB_HEADER+32) + +// Where the status bar starts, so we don't overwrite it +#define SB_STATUSBAR 420 + +#define SB_NORMAL_HEIGHT 40 +#define SB_INTER_HEIGHT 16 // interleaved height + +#define SB_MAXCLIENTS_NORMAL ((SB_STATUSBAR - SB_TOP) / SB_NORMAL_HEIGHT) +#define SB_MAXCLIENTS_INTER ((SB_STATUSBAR - SB_TOP) / SB_INTER_HEIGHT - 1) + +// Used when interleaved + + + +#define SB_LEFT_BOTICON_X (SCOREBOARD_X+0) +#define SB_LEFT_HEAD_X (SCOREBOARD_X+32) +#define SB_RIGHT_BOTICON_X (SCOREBOARD_X+64) +#define SB_RIGHT_HEAD_X (SCOREBOARD_X+96) +// Normal +#define SB_BOTICON_X (SCOREBOARD_X+32) +#define SB_HEAD_X (SCOREBOARD_X+64) + +#define SB_SCORELINE_X 112 + +#define SB_RATING_WIDTH (6 * BIGCHAR_WIDTH) // width 6 +#define SB_SCORE_X (SB_SCORELINE_X + BIGCHAR_WIDTH) // width 6 +#define SB_RATING_X (SB_SCORELINE_X + 6 * BIGCHAR_WIDTH) // width 6 +#define SB_PING_X (SB_SCORELINE_X + 12 * BIGCHAR_WIDTH + 8) // width 5 +#define SB_TIME_X (SB_SCORELINE_X + 17 * BIGCHAR_WIDTH + 8) // width 5 +#define SB_NAME_X (SB_SCORELINE_X + 22 * BIGCHAR_WIDTH) // width 15 + +// The new and improved score board +// +// In cases where the number of clients is high, the score board heads are interleaved +// here's the layout + +// +// 0 32 80 112 144 240 320 400 <-- pixel position +// bot head bot head score ping time name +// +// wins/losses are drawn on bot icon now + +static qboolean localClient; // true if local client has been displayed + + + /* +================= +CG_DrawScoreboard +================= +*/ +static void CG_DrawClientScore( int y, score_t *score, float *color, float fade, qboolean largeFormat ) { + char string[1024]; + vec3_t headAngles; + clientInfo_t *ci; + int iconx, headx; + + if ( score->client < 0 || score->client >= cgs.maxclients ) { + Com_Printf( "Bad score->client: %i\n", score->client ); + return; + } + + ci = &cgs.clientinfo[score->client]; + + iconx = SB_BOTICON_X + (SB_RATING_WIDTH / 2); + headx = SB_HEAD_X + (SB_RATING_WIDTH / 2); + + // draw the handicap or bot skill marker (unless player has flag) + if ( ci->powerups & ( 1 << PW_NEUTRALFLAG ) ) { + if( largeFormat ) { + CG_DrawFlagModel( iconx, y - ( 32 - BIGCHAR_HEIGHT ) / 2, 32, 32, TEAM_FREE, qfalse ); + } + else { + CG_DrawFlagModel( iconx, y, 16, 16, TEAM_FREE, qfalse ); + } + } else if ( ci->powerups & ( 1 << PW_REDFLAG ) ) { + if( largeFormat ) { + CG_DrawFlagModel( iconx, y - ( 32 - BIGCHAR_HEIGHT ) / 2, 32, 32, TEAM_RED, qfalse ); + } + else { + CG_DrawFlagModel( iconx, y, 16, 16, TEAM_RED, qfalse ); + } + } else if ( ci->powerups & ( 1 << PW_BLUEFLAG ) ) { + if( largeFormat ) { + CG_DrawFlagModel( iconx, y - ( 32 - BIGCHAR_HEIGHT ) / 2, 32, 32, TEAM_BLUE, qfalse ); + } + else { + CG_DrawFlagModel( iconx, y, 16, 16, TEAM_BLUE, qfalse ); + } + } else { + if ( ci->botSkill > 0 && ci->botSkill <= 5 ) { + if ( cg_drawIcons.integer ) { + if( largeFormat ) { + CG_DrawPic( iconx, y - ( 32 - BIGCHAR_HEIGHT ) / 2, 32, 32, cgs.media.botSkillShaders[ ci->botSkill - 1 ] ); + } + else { + CG_DrawPic( iconx, y, 16, 16, cgs.media.botSkillShaders[ ci->botSkill - 1 ] ); + } + } + } else if ( ci->handicap < 100 ) { + Com_sprintf( string, sizeof( string ), "%i", ci->handicap ); + if ( cgs.gametype == GT_TOURNAMENT ) + CG_DrawSmallStringColor( iconx, y - SMALLCHAR_HEIGHT/2, string, color ); + else + CG_DrawSmallStringColor( iconx, y, string, color ); + } + + // draw the wins / losses + if ( cgs.gametype == GT_TOURNAMENT ) { + Com_sprintf( string, sizeof( string ), "%i/%i", ci->wins, ci->losses ); + if( ci->handicap < 100 && !ci->botSkill ) { + CG_DrawSmallStringColor( iconx, y + SMALLCHAR_HEIGHT/2, string, color ); + } + else { + CG_DrawSmallStringColor( iconx, y, string, color ); + } + } + } + + // draw the face + VectorClear( headAngles ); + headAngles[YAW] = 180; + if( largeFormat ) { + CG_DrawHead( headx, y - ( ICON_SIZE - BIGCHAR_HEIGHT ) / 2, ICON_SIZE, ICON_SIZE, + score->client, headAngles ); + } + else { + CG_DrawHead( headx, y, 16, 16, score->client, headAngles ); + } + +#ifdef MISSIONPACK + // draw the team task + if ( ci->teamTask != TEAMTASK_NONE ) { + if ( ci->teamTask == TEAMTASK_OFFENSE ) { + CG_DrawPic( headx + 48, y, 16, 16, cgs.media.assaultShader ); + } + else if ( ci->teamTask == TEAMTASK_DEFENSE ) { + CG_DrawPic( headx + 48, y, 16, 16, cgs.media.defendShader ); + } + } +#endif + // draw the score line + if ( score->ping == -1 ) { + Com_sprintf(string, sizeof(string), + " connecting %s", ci->name); + } else if ( ci->team == TEAM_SPECTATOR ) { + Com_sprintf(string, sizeof(string), + " SPECT %3i %4i %s", score->ping, score->time, ci->name); + } else { + Com_sprintf(string, sizeof(string), + "%5i %4i %4i %s", score->score, score->ping, score->time, ci->name); + } + + // highlight your position + if ( score->client == cg.snap->ps.clientNum ) { + float hcolor[4]; + int rank; + + localClient = qtrue; + + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR + || cgs.gametype >= GT_TEAM ) { + rank = -1; + } else { + rank = cg.snap->ps.persistant[PERS_RANK] & ~RANK_TIED_FLAG; + } + if ( rank == 0 ) { + hcolor[0] = 0; + hcolor[1] = 0; + hcolor[2] = 0.7f; + } else if ( rank == 1 ) { + hcolor[0] = 0.7f; + hcolor[1] = 0; + hcolor[2] = 0; + } else if ( rank == 2 ) { + hcolor[0] = 0.7f; + hcolor[1] = 0.7f; + hcolor[2] = 0; + } else { + hcolor[0] = 0.7f; + hcolor[1] = 0.7f; + hcolor[2] = 0.7f; + } + + hcolor[3] = fade * 0.7; + CG_FillRect( SB_SCORELINE_X + BIGCHAR_WIDTH + (SB_RATING_WIDTH / 2), y, + 640 - SB_SCORELINE_X - BIGCHAR_WIDTH, BIGCHAR_HEIGHT+1, hcolor ); + } + + CG_DrawBigString( SB_SCORELINE_X + (SB_RATING_WIDTH / 2), y, string, fade ); + + // add the "ready" marker for intermission exiting + if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << score->client ) ) { + CG_DrawBigStringColor( iconx, y, "READY", color ); + } +} + +/* +================= +CG_TeamScoreboard +================= +*/ +static int CG_TeamScoreboard( int y, team_t team, float fade, int maxClients, int lineHeight ) { + int i; + score_t *score; + float color[4]; + int count; + clientInfo_t *ci; + + color[0] = color[1] = color[2] = 1.0; + color[3] = fade; + + count = 0; + for ( i = 0 ; i < cg.numScores && count < maxClients ; i++ ) { + score = &cg.scores[i]; + ci = &cgs.clientinfo[ score->client ]; + + if ( team != ci->team ) { + continue; + } + + //PKMOD - Ergodic 01/09/02 - add info to structure so Private Bot will not appear in scoreboard + if ( ci->privateBot ) { + continue; + } + + //PKMOD - Ergodic 01/09/02 - debug private bot on scoreboard (inactive) +// Com_Printf("CG_TeamScoreboard\n" ); + + CG_DrawClientScore( y + lineHeight * count, score, color, fade, lineHeight == SB_NORMAL_HEIGHT ); + + count++; + } + + return count; +} + +/* +================= +CG_DrawScoreboard + +Draw the normal in-game scoreboard +================= +*/ +qboolean CG_DrawOldScoreboard( void ) { + int x, y, w, i, n1, n2; + float fade; + float *fadeColor; + char *s; + int maxClients; + int lineHeight; + int topBorderSize, bottomBorderSize; + + // don't draw amuthing if the menu or console is up + if ( cg_paused.integer ) { + cg.deferredPlayerLoading = 0; + return qfalse; + } + + if ( cgs.gametype == GT_SINGLE_PLAYER && cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { + cg.deferredPlayerLoading = 0; + return qfalse; + } + + // don't draw scoreboard during death while warmup up + if ( cg.warmup && !cg.showScores ) { + return qfalse; + } + + if ( cg.showScores || cg.predictedPlayerState.pm_type == PM_DEAD || + cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { + fade = 1.0; + fadeColor = colorWhite; + } else { + fadeColor = CG_FadeColor( cg.scoreFadeTime, FADE_TIME ); + + if ( !fadeColor ) { + // next time scoreboard comes up, don't print killer + cg.deferredPlayerLoading = 0; + cg.killerName[0] = 0; + return qfalse; + } + fade = *fadeColor; + } + + + // fragged by ... line + if ( cg.killerName[0] ) { + s = va("Fragged by %s", cg.killerName ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + x = ( SCREEN_WIDTH - w ) / 2; + y = 40; + CG_DrawBigString( x, y, s, fade ); + } + + // current rank + if ( cgs.gametype < GT_TEAM) { + if (cg.snap->ps.persistant[PERS_TEAM] != TEAM_SPECTATOR ) { + s = va("%s place with %i", + CG_PlaceString( cg.snap->ps.persistant[PERS_RANK] + 1 ), + cg.snap->ps.persistant[PERS_SCORE] ); + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + x = ( SCREEN_WIDTH - w ) / 2; + y = 60; + CG_DrawBigString( x, y, s, fade ); + } + } else { + if ( cg.teamScores[0] == cg.teamScores[1] ) { + s = va("Teams are tied at %i", cg.teamScores[0] ); + } else if ( cg.teamScores[0] >= cg.teamScores[1] ) { + s = va("Red leads %i to %i",cg.teamScores[0], cg.teamScores[1] ); + } else { + s = va("Blue leads %i to %i",cg.teamScores[1], cg.teamScores[0] ); + } + + w = CG_DrawStrlen( s ) * BIGCHAR_WIDTH; + x = ( SCREEN_WIDTH - w ) / 2; + y = 60; + CG_DrawBigString( x, y, s, fade ); + } + + // scoreboard + y = SB_HEADER; + + CG_DrawPic( SB_SCORE_X + (SB_RATING_WIDTH / 2), y, 64, 32, cgs.media.scoreboardScore ); + CG_DrawPic( SB_PING_X - (SB_RATING_WIDTH / 2), y, 64, 32, cgs.media.scoreboardPing ); + CG_DrawPic( SB_TIME_X - (SB_RATING_WIDTH / 2), y, 64, 32, cgs.media.scoreboardTime ); + CG_DrawPic( SB_NAME_X - (SB_RATING_WIDTH / 2), y, 64, 32, cgs.media.scoreboardName ); + + y = SB_TOP; + + // If there are more than SB_MAXCLIENTS_NORMAL, use the interleaved scores + if ( cg.numScores > SB_MAXCLIENTS_NORMAL ) { + maxClients = SB_MAXCLIENTS_INTER; + lineHeight = SB_INTER_HEIGHT; + topBorderSize = 8; + bottomBorderSize = 16; + } else { + maxClients = SB_MAXCLIENTS_NORMAL; + lineHeight = SB_NORMAL_HEIGHT; + topBorderSize = 16; + bottomBorderSize = 16; + } + + localClient = qfalse; + + if ( cgs.gametype >= GT_TEAM ) { + // + // teamplay scoreboard + // + y += lineHeight/2; + + if ( cg.teamScores[0] >= cg.teamScores[1] ) { + n1 = CG_TeamScoreboard( y, TEAM_RED, fade, maxClients, lineHeight ); + CG_DrawTeamBackground( 0, y - topBorderSize, 640, n1 * lineHeight + bottomBorderSize, 0.33f, TEAM_RED ); + y += (n1 * lineHeight) + BIGCHAR_HEIGHT; + maxClients -= n1; + n2 = CG_TeamScoreboard( y, TEAM_BLUE, fade, maxClients, lineHeight ); + CG_DrawTeamBackground( 0, y - topBorderSize, 640, n2 * lineHeight + bottomBorderSize, 0.33f, TEAM_BLUE ); + y += (n2 * lineHeight) + BIGCHAR_HEIGHT; + maxClients -= n2; + } else { + n1 = CG_TeamScoreboard( y, TEAM_BLUE, fade, maxClients, lineHeight ); + CG_DrawTeamBackground( 0, y - topBorderSize, 640, n1 * lineHeight + bottomBorderSize, 0.33f, TEAM_BLUE ); + y += (n1 * lineHeight) + BIGCHAR_HEIGHT; + maxClients -= n1; + n2 = CG_TeamScoreboard( y, TEAM_RED, fade, maxClients, lineHeight ); + CG_DrawTeamBackground( 0, y - topBorderSize, 640, n2 * lineHeight + bottomBorderSize, 0.33f, TEAM_RED ); + y += (n2 * lineHeight) + BIGCHAR_HEIGHT; + maxClients -= n2; + } + n1 = CG_TeamScoreboard( y, TEAM_SPECTATOR, fade, maxClients, lineHeight ); + y += (n1 * lineHeight) + BIGCHAR_HEIGHT; + + } else { + // + // free for all scoreboard + // + n1 = CG_TeamScoreboard( y, TEAM_FREE, fade, maxClients, lineHeight ); + y += (n1 * lineHeight) + BIGCHAR_HEIGHT; + n2 = CG_TeamScoreboard( y, TEAM_SPECTATOR, fade, maxClients - n1, lineHeight ); + y += (n2 * lineHeight) + BIGCHAR_HEIGHT; + } + + if (!localClient) { + // draw local client at the bottom + for ( i = 0 ; i < cg.numScores ; i++ ) { + if ( cg.scores[i].client == cg.snap->ps.clientNum ) { + + //PKMOD - Ergodic 01/09/02 - add info to structure so Private Bot will not appear in scoreboard + if ( cgs.clientinfo[i].privateBot ) { + continue; + } + + //PKMOD - Ergodic 01/09/02 - debug private bot on scoreboard (inactive) +// Com_Printf("CG_DrawOldScoreboard\n" ); + + CG_DrawClientScore( y, &cg.scores[i], fadeColor, fade, lineHeight == SB_NORMAL_HEIGHT ); + break; + } + } + } + + // load any models that have been deferred + if ( ++cg.deferredPlayerLoading > 10 ) { + CG_LoadDeferredPlayers(); + } + + return qtrue; +} + +//================================================================================ + +/* +================ +CG_CenterGiantLine +================ +*/ +static void CG_CenterGiantLine( float y, const char *string ) { + float x; + vec4_t color; + + color[0] = 1; + color[1] = 1; + color[2] = 1; + color[3] = 1; + + x = 0.5 * ( 640 - GIANT_WIDTH * CG_DrawStrlen( string ) ); + + CG_DrawStringExt( x, y, string, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); +} + +/* +================= +CG_DrawTourneyScoreboard + +Draw the oversize scoreboard for tournements +================= +*/ +void CG_DrawOldTourneyScoreboard( void ) { + const char *s; + vec4_t color; + int min, tens, ones; + clientInfo_t *ci; + int y; + int i; + + // request more scores regularly + if ( cg.scoresRequestTime + 2000 < cg.time ) { + cg.scoresRequestTime = cg.time; + trap_SendClientCommand( "score" ); + } + + color[0] = 1; + color[1] = 1; + color[2] = 1; + color[3] = 1; + + // draw the dialog background + color[0] = color[1] = color[2] = 0; + color[3] = 1; + CG_FillRect( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, color ); + + // print the mesage of the day + s = CG_ConfigString( CS_MOTD ); + if ( !s[0] ) { + s = "Scoreboard"; + } + + // print optional title + CG_CenterGiantLine( 8, s ); + + // print server time + ones = cg.time / 1000; + min = ones / 60; + ones %= 60; + tens = ones / 10; + ones %= 10; + s = va("%i:%i%i", min, tens, ones ); + + CG_CenterGiantLine( 64, s ); + + + // print the two scores + + y = 160; + if ( cgs.gametype >= GT_TEAM ) { + // + // teamplay scoreboard + // + CG_DrawStringExt( 8, y, "Red Team", color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + s = va("%i", cg.teamScores[0] ); + CG_DrawStringExt( 632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + + y += 64; + + CG_DrawStringExt( 8, y, "Blue Team", color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + s = va("%i", cg.teamScores[1] ); + CG_DrawStringExt( 632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + } else { + // + // free for all scoreboard + // + for ( i = 0 ; i < MAX_CLIENTS ; i++ ) { + ci = &cgs.clientinfo[i]; + if ( !ci->infoValid ) { + continue; + } + if ( ci->team != TEAM_FREE ) { + continue; + } + + CG_DrawStringExt( 8, y, ci->name, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + s = va("%i", ci->score ); + CG_DrawStringExt( 632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); + y += 64; + } + } + + +} + diff --git a/quake3/source/code/cgame/cg_servercmds.c b/quake3/source/code/cgame/cg_servercmds.c new file mode 100644 index 0000000..70c2a6d --- /dev/null +++ b/quake3/source/code/cgame/cg_servercmds.c @@ -0,0 +1,1200 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_servercmds.c -- reliably sequenced text commands sent by the server +// these are processed at snapshot transition time, so there will definately +// be a valid snapshot this frame + +#include "cg_local.h" +#include "../../ui/menudef.h" // bk001205 - for Q3_ui as well + +typedef struct { + const char *order; + int taskNum; +} orderTask_t; + +static const orderTask_t validOrders[] = { + { VOICECHAT_GETFLAG, TEAMTASK_OFFENSE }, + { VOICECHAT_OFFENSE, TEAMTASK_OFFENSE }, + { VOICECHAT_DEFEND, TEAMTASK_DEFENSE }, + { VOICECHAT_DEFENDFLAG, TEAMTASK_DEFENSE }, + { VOICECHAT_PATROL, TEAMTASK_PATROL }, + { VOICECHAT_CAMP, TEAMTASK_CAMP }, + { VOICECHAT_FOLLOWME, TEAMTASK_FOLLOW }, + { VOICECHAT_RETURNFLAG, TEAMTASK_RETRIEVE }, + { VOICECHAT_FOLLOWFLAGCARRIER, TEAMTASK_ESCORT } +}; + +static const int numValidOrders = sizeof(validOrders) / sizeof(orderTask_t); + +#ifdef MISSIONPACK // bk001204 +static int CG_ValidOrder(const char *p) { + int i; + for (i = 0; i < numValidOrders; i++) { + if (Q_stricmp(p, validOrders[i].order) == 0) { + return validOrders[i].taskNum; + } + } + return -1; +} +#endif + +/* +================= +CG_ParseScores + +================= +*/ +static void CG_ParseScores( void ) { + int i, powerups; + + cg.numScores = atoi( CG_Argv( 1 ) ); + if ( cg.numScores > MAX_CLIENTS ) { + cg.numScores = MAX_CLIENTS; + } + + cg.teamScores[0] = atoi( CG_Argv( 2 ) ); + cg.teamScores[1] = atoi( CG_Argv( 3 ) ); + + memset( cg.scores, 0, sizeof( cg.scores ) ); + for ( i = 0 ; i < cg.numScores ; i++ ) { + // + //PKMOD - Ergodic 03/16/04 - fix painkiller medal error: change form of index from "i * 14 + n" to "i * 15 + n" + cg.scores[i].client = atoi( CG_Argv( i * 15 + 4 ) ); + cg.scores[i].score = atoi( CG_Argv( i * 15 + 5 ) ); + cg.scores[i].ping = atoi( CG_Argv( i * 15 + 6 ) ); + cg.scores[i].time = atoi( CG_Argv( i * 15 + 7 ) ); + cg.scores[i].scoreFlags = atoi( CG_Argv( i * 15 + 8 ) ); + powerups = atoi( CG_Argv( i * 15 + 9 ) ); + cg.scores[i].accuracy = atoi(CG_Argv(i * 15 + 10)); + cg.scores[i].impressiveCount = atoi(CG_Argv(i * 15 + 11)); + cg.scores[i].excellentCount = atoi(CG_Argv(i * 15 + 12)); + cg.scores[i].guantletCount = atoi(CG_Argv(i * 15 + 13)); + cg.scores[i].defendCount = atoi(CG_Argv(i * 15 + 14)); + cg.scores[i].assistCount = atoi(CG_Argv(i * 15 + 15)); + cg.scores[i].perfect = atoi(CG_Argv(i * 15 + 16)); + cg.scores[i].captures = atoi(CG_Argv(i * 15 + 17)); + //PKMOD - Ergodic 02/28/04 - add PainKiller medal awards to ownerdraw + cg.scores[i].painkillerCount = atoi(CG_Argv(i * 15 + 18));; + + if ( cg.scores[i].client < 0 || cg.scores[i].client >= MAX_CLIENTS ) { + cg.scores[i].client = 0; + } + cgs.clientinfo[ cg.scores[i].client ].score = cg.scores[i].score; + cgs.clientinfo[ cg.scores[i].client ].powerups = powerups; + + cg.scores[i].team = cgs.clientinfo[cg.scores[i].client].team; + } +//PKMOD - Ergodic 02/23/04 - enable HUD based scoreboard +//#ifdef MISSIONPACK + CG_SetScoreSelection(NULL); +//#endif + +} + +//PKMOD - Ergodic 10/13/00 - store hubinfo into cg fields +/* +================= +CG_ParseHubInfo + +================= +*/ +static void CG_ParseHubInfo( void ) { + int i; + + numHubInfoLines = atoi( CG_Argv( 1 ) ); + + //PKMOD - Ergodic 10/13/00 - debug inactive +// Com_Printf("CG_ParseHubInfo: numHubInfoLines >%d<\n", numHubInfoLines ); + + + //PKMOD - Ergodic 11/01/00 - change format to include a spacer line and timelimit + for ( i = 0 ; i < numHubInfoLines - 1; i++ ) { + if ( atoi( CG_Argv( i * 2 + 3 ) ) > 9 ) { + strcpy( cgs.hubInfoDisplay[i].info, " " ); + } + else { + strcpy( cgs.hubInfoDisplay[i].info, " " ); + } + //PKMOD - Ergodic 10/13/00 - debug inactive +// Com_Printf("CG_ParseHubInfo: 1 numHubInfoLines[%d]>%s<\n", i, cgs.hubInfoDisplay[i].info ); + + strcat( cgs.hubInfoDisplay[i].info, CG_Argv( i * 2 + 3 ) ); + //PKMOD - Ergodic 10/13/00 - debug inactive +// Com_Printf("CG_ParseHubInfo: 2 numHubInfoLines[%d]>%s<\n", i, cgs.hubInfoDisplay[i].info ); + + strcat( cgs.hubInfoDisplay[i].info, " " ); + //PKMOD - Ergodic 10/13/00 - debug inactive +// Com_Printf("CG_ParseHubInfo: 3 numHubInfoLines[%d]>%s<\n", i, cgs.hubInfoDisplay[i].info ); + + strcat( cgs.hubInfoDisplay[i].info, CG_Argv( i * 2 + 4 ) ); + //PKMOD - Ergodic 10/13/00 - debug inactive +// Com_Printf("CG_ParseHubInfo: 4 numHubInfoLines[%d]>%s<\n", i, cgs.hubInfoDisplay[i].info ); + } + + + //PKMOD - Ergodic 11/01/00 - get the time remaining + strcpy( cgs.hubInfoDisplay[i].info, " " ); + strcat( cgs.hubInfoDisplay[i].info, CG_Argv( i * 2 + 3 ) ); + strcat( cgs.hubInfoDisplay[i].info, " " ); + strcat( cgs.hubInfoDisplay[i].info, CG_Argv( i * 2 + 4 ) ); + +} + +/* +================= +CG_ParseTeamInfo + +================= +*/ +static void CG_ParseTeamInfo( void ) { + int i; + int client; + + numSortedTeamPlayers = atoi( CG_Argv( 1 ) ); + + for ( i = 0 ; i < numSortedTeamPlayers ; i++ ) { + client = atoi( CG_Argv( i * 6 + 2 ) ); + + sortedTeamPlayers[i] = client; + + cgs.clientinfo[ client ].location = atoi( CG_Argv( i * 6 + 3 ) ); + cgs.clientinfo[ client ].health = atoi( CG_Argv( i * 6 + 4 ) ); + cgs.clientinfo[ client ].armor = atoi( CG_Argv( i * 6 + 5 ) ); + cgs.clientinfo[ client ].curWeapon = atoi( CG_Argv( i * 6 + 6 ) ); + cgs.clientinfo[ client ].powerups = atoi( CG_Argv( i * 6 + 7 ) ); + } +} + + +/* +================ +CG_ParseServerinfo + +This is called explicitly when the gamestate is first received, +and whenever the server updates any serverinfo flagged cvars +================ +*/ +void CG_ParseServerinfo( void ) { + const char *info; + int hold_hub_flag; + char *mapname; + + info = CG_ConfigString( CS_SERVERINFO ); + cgs.gametype = atoi( Info_ValueForKey( info, "g_gametype" ) ); + trap_Cvar_Set("g_gametype", va("%i", cgs.gametype)); + cgs.dmflags = atoi( Info_ValueForKey( info, "dmflags" ) ); + cgs.teamflags = atoi( Info_ValueForKey( info, "teamflags" ) ); + + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + hold_hub_flag = atoi( Info_ValueForKey( info, "hub_flag" ) ); + if ( hold_hub_flag ) { + cgs.fraglimit = atoi( Info_ValueForKey( info, "hub_fraglimit" ) ); + cgs.timelimit = atoi( Info_ValueForKey( info, "hub_timelimit" ) ); + } + else { + cgs.fraglimit = atoi( Info_ValueForKey( info, "fraglimit" ) ); + cgs.timelimit = atoi( Info_ValueForKey( info, "timelimit" ) ); + } + + cgs.capturelimit = atoi( Info_ValueForKey( info, "capturelimit" ) ); + cgs.timelimit = atoi( Info_ValueForKey( info, "timelimit" ) ); + cgs.maxclients = atoi( Info_ValueForKey( info, "sv_maxclients" ) ); + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + cgs.maxclients = atoi( Info_ValueForKey( info, "sv_maxclients" ) ) + MAX_PRIVATE_BOTS; + mapname = Info_ValueForKey( info, "mapname" ); + Com_sprintf( cgs.mapname, sizeof( cgs.mapname ), "maps/%s.bsp", mapname ); + Q_strncpyz( cgs.redTeam, Info_ValueForKey( info, "g_redTeam" ), sizeof(cgs.redTeam) ); + trap_Cvar_Set("g_redTeam", cgs.redTeam); + Q_strncpyz( cgs.blueTeam, Info_ValueForKey( info, "g_blueTeam" ), sizeof(cgs.blueTeam) ); + trap_Cvar_Set("g_blueTeam", cgs.blueTeam); +} + +/* +================== +CG_ParseWarmup +================== +*/ +static void CG_ParseWarmup( void ) { + const char *info; + int warmup; + + info = CG_ConfigString( CS_WARMUP ); + + warmup = atoi( info ); + cg.warmupCount = -1; + + if ( warmup == 0 && cg.warmup ) { + + } else if ( warmup > 0 && cg.warmup <= 0 ) { +#ifdef MISSIONPACK + if (cgs.gametype >= GT_CTF && cgs.gametype <= GT_HARVESTER) { + trap_S_StartLocalSound( cgs.media.countPrepareTeamSound, CHAN_ANNOUNCER ); + } else +#endif + { + trap_S_StartLocalSound( cgs.media.countPrepareSound, CHAN_ANNOUNCER ); + } + } + + cg.warmup = warmup; +} + +/* +================ +CG_SetConfigValues + +Called on load to set the initial values from configure strings +================ +*/ +void CG_SetConfigValues( void ) { + const char *s; + + cgs.scores1 = atoi( CG_ConfigString( CS_SCORES1 ) ); + cgs.scores2 = atoi( CG_ConfigString( CS_SCORES2 ) ); + cgs.levelStartTime = atoi( CG_ConfigString( CS_LEVEL_START_TIME ) ); + if( cgs.gametype == GT_CTF ) { + s = CG_ConfigString( CS_FLAGSTATUS ); + cgs.redflag = s[0] - '0'; + cgs.blueflag = s[1] - '0'; + } +#ifdef MISSIONPACK + else if( cgs.gametype == GT_1FCTF ) { + s = CG_ConfigString( CS_FLAGSTATUS ); + cgs.flagStatus = s[0] - '0'; + } +#endif + cg.warmup = atoi( CG_ConfigString( CS_WARMUP ) ); +} + +/* +===================== +CG_ShaderStateChanged +===================== +*/ +void CG_ShaderStateChanged(void) { + char originalShader[MAX_QPATH]; + char newShader[MAX_QPATH]; + char timeOffset[16]; + const char *o; + char *n,*t; + + o = CG_ConfigString( CS_SHADERSTATE ); + while (o && *o) { + n = strstr(o, "="); + if (n && *n) { + strncpy(originalShader, o, n-o); + originalShader[n-o] = 0; + n++; + t = strstr(n, ":"); + if (t && *t) { + strncpy(newShader, n, t-n); + newShader[t-n] = 0; + } else { + break; + } + t++; + o = strstr(t, "@"); + if (o) { + strncpy(timeOffset, t, o-t); + timeOffset[o-t] = 0; + o++; + trap_R_RemapShader( originalShader, newShader, timeOffset ); + } + } else { + break; + } + } +} + +/* +================ +CG_ConfigStringModified + +================ +*/ +static void CG_ConfigStringModified( void ) { + const char *str; + int num; + + num = atoi( CG_Argv( 1 ) ); + + // get the gamestate from the client system, which will have the + // new configstring already integrated + trap_GetGameState( &cgs.gameState ); + + // look up the individual string that was modified + str = CG_ConfigString( num ); + + //PKMOD - Ergodic 10/14/00 - debug inactive +// Com_Printf( "CG_ConfigStringModified - num>%d<, str>%s<\n", num, str ); + + // do something with it if necessary + if ( num == CS_MUSIC ) { + CG_StartMusic(); + //PKMOD - Ergodic 10/14/00 - add alternate music to hub + } else if ( num == CS_POSTVOTE_MUSIC ) { + CG_StartPostVoteMusic( str ); + + } else if ( num == CS_SERVERINFO ) { + CG_ParseServerinfo(); + } else if ( num == CS_WARMUP ) { + CG_ParseWarmup(); + } else if ( num == CS_SCORES1 ) { + cgs.scores1 = atoi( str ); + } else if ( num == CS_SCORES2 ) { + cgs.scores2 = atoi( str ); + } else if ( num == CS_LEVEL_START_TIME ) { + cgs.levelStartTime = atoi( str ); + } else if ( num == CS_VOTE_TIME ) { + cgs.voteTime = atoi( str ); + cgs.voteModified = qtrue; + } else if ( num == CS_VOTE_YES ) { + cgs.voteYes = atoi( str ); + cgs.voteModified = qtrue; + } else if ( num == CS_VOTE_NO ) { + cgs.voteNo = atoi( str ); + cgs.voteModified = qtrue; + } else if ( num == CS_VOTE_STRING ) { + Q_strncpyz( cgs.voteString, str, sizeof( cgs.voteString ) ); +#ifdef MISSIONPACK + trap_S_StartLocalSound( cgs.media.voteNow, CHAN_ANNOUNCER ); +#endif //MISSIONPACK + } else if ( num >= CS_TEAMVOTE_TIME && num <= CS_TEAMVOTE_TIME + 1) { + cgs.teamVoteTime[num-CS_TEAMVOTE_TIME] = atoi( str ); + cgs.teamVoteModified[num-CS_TEAMVOTE_TIME] = qtrue; + } else if ( num >= CS_TEAMVOTE_YES && num <= CS_TEAMVOTE_YES + 1) { + cgs.teamVoteYes[num-CS_TEAMVOTE_YES] = atoi( str ); + cgs.teamVoteModified[num-CS_TEAMVOTE_YES] = qtrue; + } else if ( num >= CS_TEAMVOTE_NO && num <= CS_TEAMVOTE_NO + 1) { + cgs.teamVoteNo[num-CS_TEAMVOTE_NO] = atoi( str ); + cgs.teamVoteModified[num-CS_TEAMVOTE_NO] = qtrue; + } else if ( num >= CS_TEAMVOTE_STRING && num <= CS_TEAMVOTE_STRING + 1) { + Q_strncpyz( cgs.teamVoteString[num-CS_TEAMVOTE_STRING], str, sizeof( cgs.teamVoteString ) ); +#ifdef MISSIONPACK + trap_S_StartLocalSound( cgs.media.voteNow, CHAN_ANNOUNCER ); +#endif + } else if ( num == CS_INTERMISSION ) { + cg.intermissionStarted = atoi( str ); + } else if ( num >= CS_MODELS && num < CS_MODELS+MAX_MODELS ) { + cgs.gameModels[ num-CS_MODELS ] = trap_R_RegisterModel( str ); +//PKMOD - Ergodic 01/04/02 - Add bug fix from [TH]DemENtoR that was in the following post: +// http://www.quake3world.com/ubb/Forum4/HTML/005944.html +// } else if ( num >= CS_SOUNDS && num < CS_SOUNDS+MAX_MODELS ) { + } else if ( num >= CS_SOUNDS && num < CS_SOUNDS+MAX_SOUNDS ) { + if ( str[0] != '*' ) { // player specific sounds don't register here + cgs.gameSounds[ num-CS_SOUNDS] = trap_S_RegisterSound( str, qfalse ); + } + } else if ( num >= CS_PLAYERS && num < CS_PLAYERS+MAX_CLIENTS ) { + CG_NewClientInfo( num - CS_PLAYERS ); + CG_BuildSpectatorString(); + } else if ( num == CS_FLAGSTATUS ) { + if( cgs.gametype == GT_CTF ) { + // format is rb where its red/blue, 0 is at base, 1 is taken, 2 is dropped + cgs.redflag = str[0] - '0'; + cgs.blueflag = str[1] - '0'; + } +#ifdef MISSIONPACK + else if( cgs.gametype == GT_1FCTF ) { + cgs.flagStatus = str[0] - '0'; + } +#endif + } + else if ( num == CS_SHADERSTATE ) { + CG_ShaderStateChanged(); + } + +} + + +/* +======================= +CG_AddToTeamChat + +======================= +*/ +static void CG_AddToTeamChat( const char *str ) { + int len; + char *p, *ls; + int lastcolor; + int chatHeight; + + if (cg_teamChatHeight.integer < TEAMCHAT_HEIGHT) { + chatHeight = cg_teamChatHeight.integer; + } else { + chatHeight = TEAMCHAT_HEIGHT; + } + + if (chatHeight <= 0 || cg_teamChatTime.integer <= 0) { + // team chat disabled, dump into normal chat + cgs.teamChatPos = cgs.teamLastChatPos = 0; + return; + } + + len = 0; + + p = cgs.teamChatMsgs[cgs.teamChatPos % chatHeight]; + *p = 0; + + lastcolor = '7'; + + ls = NULL; + while (*str) { + if (len > TEAMCHAT_WIDTH - 1) { + if (ls) { + str -= (p - ls); + str++; + p -= (p - ls); + } + *p = 0; + + cgs.teamChatMsgTimes[cgs.teamChatPos % chatHeight] = cg.time; + + cgs.teamChatPos++; + p = cgs.teamChatMsgs[cgs.teamChatPos % chatHeight]; + *p = 0; + *p++ = Q_COLOR_ESCAPE; + *p++ = lastcolor; + len = 0; + ls = NULL; + } + + if ( Q_IsColorString( str ) ) { + *p++ = *str++; + lastcolor = *str; + *p++ = *str++; + continue; + } + if (*str == ' ') { + ls = p; + } + *p++ = *str++; + len++; + } + *p = 0; + + cgs.teamChatMsgTimes[cgs.teamChatPos % chatHeight] = cg.time; + cgs.teamChatPos++; + + if (cgs.teamChatPos - cgs.teamLastChatPos > chatHeight) + cgs.teamLastChatPos = cgs.teamChatPos - chatHeight; +} + +/* +=============== +CG_MapRestart + +The server has issued a map_restart, so the next snapshot +is completely new and should not be interpolated to. + +A tournement restart will clear everything, but doesn't +require a reload of all the media +=============== +*/ +static void CG_MapRestart( void ) { + if ( cg_showmiss.integer ) { + CG_Printf( "CG_MapRestart\n" ); + } + + CG_InitLocalEntities(); + CG_InitMarkPolys(); + CG_ClearParticles (); + + // make sure the "3 frags left" warnings play again + cg.fraglimitWarnings = 0; + + cg.timelimitWarnings = 0; + + cg.intermissionStarted = qfalse; + + cgs.voteTime = 0; + + cg.mapRestart = qtrue; + + CG_StartMusic(); + + trap_S_ClearLoopingSounds(qtrue); + + // we really should clear more parts of cg here and stop sounds + + // play the "fight" sound if this is a restart without warmup + if ( cg.warmup == 0 /* && cgs.gametype == GT_TOURNAMENT */) { + trap_S_StartLocalSound( cgs.media.countFightSound, CHAN_ANNOUNCER ); + CG_CenterPrint( "FIGHT!", 120, GIANTCHAR_WIDTH*2 ); + } +//PKMOD - Ergodic 02/02/04 - Enable this code so that POSTGAME will show proper completion time +//#ifdef MISSIONPACK + if (cg_singlePlayerActive.integer) { + trap_Cvar_Set("ui_matchStartTime", va("%i", cg.time)); + if (cg_recordSPDemo.integer && cg_recordSPDemoName.string && *cg_recordSPDemoName.string) { + trap_SendConsoleCommand(va("set g_synchronousclients 1 ; record %s \n", cg_recordSPDemoName.string)); + } + } +//#endif + trap_Cvar_Set("cg_thirdPerson", "0"); +} + +#define MAX_VOICEFILESIZE 16384 +#define MAX_VOICEFILES 8 +#define MAX_VOICECHATS 64 +#define MAX_VOICESOUNDS 64 +#define MAX_CHATSIZE 64 +#define MAX_HEADMODELS 64 + +typedef struct voiceChat_s +{ + char id[64]; + int numSounds; + sfxHandle_t sounds[MAX_VOICESOUNDS]; + char chats[MAX_VOICESOUNDS][MAX_CHATSIZE]; +} voiceChat_t; + +typedef struct voiceChatList_s +{ + char name[64]; + int gender; + int numVoiceChats; + voiceChat_t voiceChats[MAX_VOICECHATS]; +} voiceChatList_t; + +typedef struct headModelVoiceChat_s +{ + char headmodel[64]; + int voiceChatNum; +} headModelVoiceChat_t; + +voiceChatList_t voiceChatLists[MAX_VOICEFILES]; +headModelVoiceChat_t headModelVoiceChat[MAX_HEADMODELS]; + +/* +================= +CG_ParseVoiceChats +================= +*/ +int CG_ParseVoiceChats( const char *filename, voiceChatList_t *voiceChatList, int maxVoiceChats ) { + int len, i; + fileHandle_t f; + char buf[MAX_VOICEFILESIZE]; + char **p, *ptr; + char *token; + voiceChat_t *voiceChats; + qboolean compress; + sfxHandle_t sound; + + compress = qtrue; + if (cg_buildScript.integer) { + compress = qfalse; + } + + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + if ( !f ) { + trap_Print( va( S_COLOR_RED "voice chat file not found: %s\n", filename ) ); + return qfalse; + } + if ( len >= MAX_VOICEFILESIZE ) { + trap_Print( va( S_COLOR_RED "voice chat file too large: %s is %i, max allowed is %i", filename, len, MAX_VOICEFILESIZE ) ); + trap_FS_FCloseFile( f ); + return qfalse; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + ptr = buf; + p = &ptr; + + Com_sprintf(voiceChatList->name, sizeof(voiceChatList->name), "%s", filename); + voiceChats = voiceChatList->voiceChats; + for ( i = 0; i < maxVoiceChats; i++ ) { + voiceChats[i].id[0] = 0; + } + token = COM_ParseExt(p, qtrue); + if (!token || token[0] == 0) { + return qtrue; + } + if (!Q_stricmp(token, "female")) { + voiceChatList->gender = GENDER_FEMALE; + } + else if (!Q_stricmp(token, "male")) { + voiceChatList->gender = GENDER_MALE; + } + else if (!Q_stricmp(token, "neuter")) { + voiceChatList->gender = GENDER_NEUTER; + } + else { + trap_Print( va( S_COLOR_RED "expected gender not found in voice chat file: %s\n", filename ) ); + return qfalse; + } + + voiceChatList->numVoiceChats = 0; + while ( 1 ) { + token = COM_ParseExt(p, qtrue); + if (!token || token[0] == 0) { + return qtrue; + } + Com_sprintf(voiceChats[voiceChatList->numVoiceChats].id, sizeof( voiceChats[voiceChatList->numVoiceChats].id ), "%s", token); + token = COM_ParseExt(p, qtrue); + if (Q_stricmp(token, "{")) { + trap_Print( va( S_COLOR_RED "expected { found %s in voice chat file: %s\n", token, filename ) ); + return qfalse; + } + voiceChats[voiceChatList->numVoiceChats].numSounds = 0; + while(1) { + token = COM_ParseExt(p, qtrue); + if (!token || token[0] == 0) { + return qtrue; + } + if (!Q_stricmp(token, "}")) + break; + sound = trap_S_RegisterSound( token, compress ); + voiceChats[voiceChatList->numVoiceChats].sounds[voiceChats[voiceChatList->numVoiceChats].numSounds] = sound; + token = COM_ParseExt(p, qtrue); + if (!token || token[0] == 0) { + return qtrue; + } + Com_sprintf(voiceChats[voiceChatList->numVoiceChats].chats[ + voiceChats[voiceChatList->numVoiceChats].numSounds], MAX_CHATSIZE, "%s", token); + if (sound) + voiceChats[voiceChatList->numVoiceChats].numSounds++; + if (voiceChats[voiceChatList->numVoiceChats].numSounds >= MAX_VOICESOUNDS) + break; + } + voiceChatList->numVoiceChats++; + if (voiceChatList->numVoiceChats >= maxVoiceChats) + return qtrue; + } + return qtrue; +} + +/* +================= +CG_LoadVoiceChats +================= +*/ +void CG_LoadVoiceChats( void ) { + int size; + + size = trap_MemoryRemaining(); + CG_ParseVoiceChats( "scripts/female1.voice", &voiceChatLists[0], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/female2.voice", &voiceChatLists[1], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/female3.voice", &voiceChatLists[2], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/male1.voice", &voiceChatLists[3], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/male2.voice", &voiceChatLists[4], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/male3.voice", &voiceChatLists[5], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/male4.voice", &voiceChatLists[6], MAX_VOICECHATS ); + CG_ParseVoiceChats( "scripts/male5.voice", &voiceChatLists[7], MAX_VOICECHATS ); + CG_Printf("voice chat memory size = %d\n", size - trap_MemoryRemaining()); +} + +/* +================= +CG_HeadModelVoiceChats +================= +*/ +int CG_HeadModelVoiceChats( char *filename ) { + int len, i; + fileHandle_t f; + char buf[MAX_VOICEFILESIZE]; + char **p, *ptr; + char *token; + + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + if ( !f ) { + //trap_Print( va( "voice chat file not found: %s\n", filename ) ); + return -1; + } + if ( len >= MAX_VOICEFILESIZE ) { + trap_Print( va( S_COLOR_RED "voice chat file too large: %s is %i, max allowed is %i", filename, len, MAX_VOICEFILESIZE ) ); + trap_FS_FCloseFile( f ); + return -1; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + ptr = buf; + p = &ptr; + + token = COM_ParseExt(p, qtrue); + if (!token || token[0] == 0) { + return -1; + } + + for ( i = 0; i < MAX_VOICEFILES; i++ ) { + if ( !Q_stricmp(token, voiceChatLists[i].name) ) { + return i; + } + } + + //FIXME: maybe try to load the .voice file which name is stored in token? + + return -1; +} + + +/* +================= +CG_GetVoiceChat +================= +*/ +int CG_GetVoiceChat( voiceChatList_t *voiceChatList, const char *id, sfxHandle_t *snd, char **chat) { + int i, rnd; + + for ( i = 0; i < voiceChatList->numVoiceChats; i++ ) { + if ( !Q_stricmp( id, voiceChatList->voiceChats[i].id ) ) { + rnd = random() * voiceChatList->voiceChats[i].numSounds; + *snd = voiceChatList->voiceChats[i].sounds[rnd]; + *chat = voiceChatList->voiceChats[i].chats[rnd]; + return qtrue; + } + } + return qfalse; +} + +/* +================= +CG_VoiceChatListForClient +================= +*/ +voiceChatList_t *CG_VoiceChatListForClient( int clientNum ) { + clientInfo_t *ci; + int voiceChatNum, i, j, k, gender; + char filename[MAX_QPATH], headModelName[MAX_QPATH]; + + if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + clientNum = 0; + } + ci = &cgs.clientinfo[ clientNum ]; + + for ( k = 0; k < 2; k++ ) { + if ( k == 0 ) { + if (ci->headModelName[0] == '*') { + Com_sprintf( headModelName, sizeof(headModelName), "%s/%s", ci->headModelName+1, ci->headSkinName ); + } + else { + Com_sprintf( headModelName, sizeof(headModelName), "%s/%s", ci->headModelName, ci->headSkinName ); + } + } + else { + if (ci->headModelName[0] == '*') { + Com_sprintf( headModelName, sizeof(headModelName), "%s", ci->headModelName+1 ); + } + else { + Com_sprintf( headModelName, sizeof(headModelName), "%s", ci->headModelName ); + } + } + // find the voice file for the head model the client uses + for ( i = 0; i < MAX_HEADMODELS; i++ ) { + if (!Q_stricmp(headModelVoiceChat[i].headmodel, headModelName)) { + break; + } + } + if (i < MAX_HEADMODELS) { + return &voiceChatLists[headModelVoiceChat[i].voiceChatNum]; + } + // find a .vc file + for ( i = 0; i < MAX_HEADMODELS; i++ ) { + if (!strlen(headModelVoiceChat[i].headmodel)) { + Com_sprintf(filename, sizeof(filename), "scripts/%s.vc", headModelName); + voiceChatNum = CG_HeadModelVoiceChats(filename); + if (voiceChatNum == -1) + break; + Com_sprintf(headModelVoiceChat[i].headmodel, sizeof ( headModelVoiceChat[i].headmodel ), + "%s", headModelName); + headModelVoiceChat[i].voiceChatNum = voiceChatNum; + return &voiceChatLists[headModelVoiceChat[i].voiceChatNum]; + } + } + } + gender = ci->gender; + for (k = 0; k < 2; k++) { + // just pick the first with the right gender + for ( i = 0; i < MAX_VOICEFILES; i++ ) { + if (strlen(voiceChatLists[i].name)) { + if (voiceChatLists[i].gender == gender) { + // store this head model with voice chat for future reference + for ( j = 0; j < MAX_HEADMODELS; j++ ) { + if (!strlen(headModelVoiceChat[j].headmodel)) { + Com_sprintf(headModelVoiceChat[j].headmodel, sizeof ( headModelVoiceChat[j].headmodel ), + "%s", headModelName); + headModelVoiceChat[j].voiceChatNum = i; + break; + } + } + return &voiceChatLists[i]; + } + } + } + // fall back to male gender because we don't have neuter in the mission pack + if (gender == GENDER_MALE) + break; + gender = GENDER_MALE; + } + // store this head model with voice chat for future reference + for ( j = 0; j < MAX_HEADMODELS; j++ ) { + if (!strlen(headModelVoiceChat[j].headmodel)) { + Com_sprintf(headModelVoiceChat[j].headmodel, sizeof ( headModelVoiceChat[j].headmodel ), + "%s", headModelName); + headModelVoiceChat[j].voiceChatNum = 0; + break; + } + } + // just return the first voice chat list + return &voiceChatLists[0]; +} + +#define MAX_VOICECHATBUFFER 32 + +typedef struct bufferedVoiceChat_s +{ + int clientNum; + sfxHandle_t snd; + int voiceOnly; + char cmd[MAX_SAY_TEXT]; + char message[MAX_SAY_TEXT]; +} bufferedVoiceChat_t; + +bufferedVoiceChat_t voiceChatBuffer[MAX_VOICECHATBUFFER]; + +/* +================= +CG_PlayVoiceChat +================= +*/ +void CG_PlayVoiceChat( bufferedVoiceChat_t *vchat ) { +#ifdef MISSIONPACK + // if we are going into the intermission, don't start any voices + if ( cg.intermissionStarted ) { + return; + } + + if ( !cg_noVoiceChats.integer ) { + trap_S_StartLocalSound( vchat->snd, CHAN_VOICE); + if (vchat->clientNum != cg.snap->ps.clientNum) { + int orderTask = CG_ValidOrder(vchat->cmd); + if (orderTask > 0) { + cgs.acceptOrderTime = cg.time + 5000; + Q_strncpyz(cgs.acceptVoice, vchat->cmd, sizeof(cgs.acceptVoice)); + cgs.acceptTask = orderTask; + cgs.acceptLeader = vchat->clientNum; + } + // see if this was an order + CG_ShowResponseHead(); + } + } + if (!vchat->voiceOnly && !cg_noVoiceText.integer) { + CG_AddToTeamChat( vchat->message ); + CG_Printf( "%s\n", vchat->message ); + } + voiceChatBuffer[cg.voiceChatBufferOut].snd = 0; +#endif +} + +/* +===================== +CG_PlayBufferedVoieChats +===================== +*/ +void CG_PlayBufferedVoiceChats( void ) { +#ifdef MISSIONPACK + if ( cg.voiceChatTime < cg.time ) { + if (cg.voiceChatBufferOut != cg.voiceChatBufferIn && voiceChatBuffer[cg.voiceChatBufferOut].snd) { + // + CG_PlayVoiceChat(&voiceChatBuffer[cg.voiceChatBufferOut]); + // + cg.voiceChatBufferOut = (cg.voiceChatBufferOut + 1) % MAX_VOICECHATBUFFER; + cg.voiceChatTime = cg.time + 1000; + } + } +#endif +} + +/* +===================== +CG_AddBufferedVoiceChat +===================== +*/ +void CG_AddBufferedVoiceChat( bufferedVoiceChat_t *vchat ) { +#ifdef MISSIONPACK + // if we are going into the intermission, don't start any voices + if ( cg.intermissionStarted ) { + return; + } + + memcpy(&voiceChatBuffer[cg.voiceChatBufferIn], vchat, sizeof(bufferedVoiceChat_t)); + cg.voiceChatBufferIn = (cg.voiceChatBufferIn + 1) % MAX_VOICECHATBUFFER; + if (cg.voiceChatBufferIn == cg.voiceChatBufferOut) { + CG_PlayVoiceChat( &voiceChatBuffer[cg.voiceChatBufferOut] ); + cg.voiceChatBufferOut++; + } +#endif +} + +/* +================= +CG_VoiceChatLocal +================= +*/ +void CG_VoiceChatLocal( int mode, qboolean voiceOnly, int clientNum, int color, const char *cmd ) { +#ifdef MISSIONPACK + char *chat; + voiceChatList_t *voiceChatList; + clientInfo_t *ci; + sfxHandle_t snd; + bufferedVoiceChat_t vchat; + + // if we are going into the intermission, don't start any voices + if ( cg.intermissionStarted ) { + return; + } + + if ( clientNum < 0 || clientNum >= MAX_CLIENTS ) { + clientNum = 0; + } + ci = &cgs.clientinfo[ clientNum ]; + + cgs.currentVoiceClient = clientNum; + + voiceChatList = CG_VoiceChatListForClient( clientNum ); + + if ( CG_GetVoiceChat( voiceChatList, cmd, &snd, &chat ) ) { + // + if ( mode == SAY_TEAM || !cg_teamChatsOnly.integer ) { + vchat.clientNum = clientNum; + vchat.snd = snd; + vchat.voiceOnly = voiceOnly; + Q_strncpyz(vchat.cmd, cmd, sizeof(vchat.cmd)); + if ( mode == SAY_TELL ) { + Com_sprintf(vchat.message, sizeof(vchat.message), "[%s]: %c%c%s", ci->name, Q_COLOR_ESCAPE, color, chat); + } + else if ( mode == SAY_TEAM ) { + Com_sprintf(vchat.message, sizeof(vchat.message), "(%s): %c%c%s", ci->name, Q_COLOR_ESCAPE, color, chat); + } + else { + Com_sprintf(vchat.message, sizeof(vchat.message), "%s: %c%c%s", ci->name, Q_COLOR_ESCAPE, color, chat); + } + CG_AddBufferedVoiceChat(&vchat); + } + } +#endif +} + +/* +================= +CG_VoiceChat +================= +*/ +void CG_VoiceChat( int mode ) { +#ifdef MISSIONPACK + const char *cmd; + int clientNum, color; + qboolean voiceOnly; + + voiceOnly = atoi(CG_Argv(1)); + clientNum = atoi(CG_Argv(2)); + color = atoi(CG_Argv(3)); + cmd = CG_Argv(4); + + if (cg_noTaunt.integer != 0) { + if (!strcmp(cmd, VOICECHAT_KILLINSULT) || !strcmp(cmd, VOICECHAT_TAUNT) || \ + !strcmp(cmd, VOICECHAT_DEATHINSULT) || !strcmp(cmd, VOICECHAT_KILLGAUNTLET) || \ + !strcmp(cmd, VOICECHAT_PRAISE)) { + return; + } + } + + CG_VoiceChatLocal( mode, voiceOnly, clientNum, color, cmd ); +#endif +} + +/* +================= +CG_RemoveChatEscapeChar +================= +*/ +static void CG_RemoveChatEscapeChar( char *text ) { + int i, l; + + l = 0; + for ( i = 0; text[i]; i++ ) { + if (text[i] == '\x19') + continue; + text[l++] = text[i]; + } + text[l] = '\0'; +} + +/* +================= +CG_ServerCommand + +The string has been tokenized and can be retrieved with +Cmd_Argc() / Cmd_Argv() +================= +*/ +static void CG_ServerCommand( void ) { + const char *cmd; + char text[MAX_SAY_TEXT]; + + cmd = CG_Argv(0); + + if ( !cmd[0] ) { + // server claimed the command + return; + } + + if ( !strcmp( cmd, "cp" ) ) { + CG_CenterPrint( CG_Argv(1), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); + return; + } + + if ( !strcmp( cmd, "cs" ) ) { + CG_ConfigStringModified(); + return; + } + + if ( !strcmp( cmd, "print" ) ) { + CG_Printf( "%s", CG_Argv(1) ); +#ifdef MISSIONPACK + cmd = CG_Argv(1); // yes, this is obviously a hack, but so is the way we hear about + // votes passing or failing + if ( !Q_stricmpn( cmd, "vote failed", 11 ) || !Q_stricmpn( cmd, "team vote failed", 16 )) { + trap_S_StartLocalSound( cgs.media.voteFailed, CHAN_ANNOUNCER ); + } else if ( !Q_stricmpn( cmd, "vote passed", 11 ) || !Q_stricmpn( cmd, "team vote passed", 16 ) ) { + trap_S_StartLocalSound( cgs.media.votePassed, CHAN_ANNOUNCER ); + } +#endif + return; + } + + if ( !strcmp( cmd, "chat" ) ) { + if ( !cg_teamChatsOnly.integer ) { + trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); + Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); + CG_RemoveChatEscapeChar( text ); + CG_Printf( "%s\n", text ); + } + return; + } + + if ( !strcmp( cmd, "tchat" ) ) { + trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); + Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); + CG_RemoveChatEscapeChar( text ); + CG_AddToTeamChat( text ); + CG_Printf( "%s\n", text ); + return; + } + if ( !strcmp( cmd, "vchat" ) ) { + CG_VoiceChat( SAY_ALL ); + return; + } + + if ( !strcmp( cmd, "vtchat" ) ) { + CG_VoiceChat( SAY_TEAM ); + return; + } + + if ( !strcmp( cmd, "vtell" ) ) { + CG_VoiceChat( SAY_TELL ); + return; + } + + if ( !strcmp( cmd, "scores" ) ) { + CG_ParseScores(); + return; + } + + if ( !strcmp( cmd, "tinfo" ) ) { + CG_ParseTeamInfo(); + return; + } + + if ( !strcmp( cmd, "map_restart" ) ) { + CG_MapRestart(); + return; + } + + if ( Q_stricmp (cmd, "remapShader") == 0 ) { + if (trap_Argc() == 4) { + trap_R_RemapShader(CG_Argv(1), CG_Argv(2), CG_Argv(3)); + } + } + + // loaddeferred can be both a servercmd and a consolecmd + if ( !strcmp( cmd, "loaddefered" ) ) { // FIXME: spelled wrong, but not changing for demo + CG_LoadDeferredPlayers(); + return; + } + + // clientLevelShot is sent before taking a special screenshot for + // the menu system during development + if ( !strcmp( cmd, "clientLevelShot" ) ) { + cg.levelShot = qtrue; + return; + } + + //PKMOD - Ergodic 10/13/00 - add hubinfo command for voting + if ( !strcmp( cmd, "hubinfo_pka" ) ) { + CG_ParseHubInfo(); + return; + } + + //PKMOD - Ergodic 12/10/03 - add hubalternates server command + // This code is hit on client/server games + // and this code is hit on SP i.e.: /map hub_30 games + // and this code is hit on selected SinglePlayer games + if ( !strcmp( cmd, "cghubalternates" ) ) { + //PKMOD - Ergodic 03/29/04 - call will now take parameters form the server + char a1[MAX_HUB_DISPLAY_NAME]; + char a2[MAX_HUB_DISPLAY_NAME]; + char a3[MAX_HUB_DISPLAY_NAME]; + char a4[MAX_HUB_DISPLAY_NAME]; + + //PKMOD - Ergodic 03/29/04 - debug cghubalternates call (inactive) + //Com_Printf( "In CGame CG_ServerCommand - sending console command: hubalternates\n" ); + + + Q_strncpyz(a1, CG_Argv(1), sizeof(a1)); + Q_strncpyz(a2, CG_Argv(2), sizeof(a2)); + Q_strncpyz(a3, CG_Argv(3), sizeof(a3)); + Q_strncpyz(a4, CG_Argv(4), sizeof(a4)); + + //PKMOD - Ergodic 03/29/04 - debug cghubalternates call (inactive) + //Com_Printf( "In CGame CG_ServerCommand - sending console command: hubalternates\n" ); + //PKMOD - Ergodic 03/29/04 - debug hubalternates info (inactive) + //Com_Printf("CG_ServerCommand arg1>%s<\n", a1 ); + //Com_Printf("CG_ServerCommand arg2>%s<\n", a2 ); + //Com_Printf("CG_ServerCommand arg3>%s<\n", a3 ); + //Com_Printf("CG_ServerCommand arg4>%s<\n", a4 ); + + //PKMOD - Ergodic 03/29/04 - set the ui cvars + trap_Cvar_Set( "ui_HubAltDisp1", a1 ); + trap_Cvar_Set( "ui_HubAltDisp2", a2 ); + trap_Cvar_Set( "ui_HubAltDisp3", a3 ); + trap_Cvar_Set( "ui_HubAltDisp4", a4 ); + + trap_SendConsoleCommand( "hubalternates\n" ); + return; + } + + CG_Printf( "Unknown client game command: %s\n", cmd ); +} + + +/* +==================== +CG_ExecuteNewServerCommands + +Execute all of the server commands that were received along +with this this snapshot. +==================== +*/ +void CG_ExecuteNewServerCommands( int latestSequence ) { + while ( cgs.serverCommandSequence < latestSequence ) { + if ( trap_GetServerCommand( ++cgs.serverCommandSequence ) ) { + CG_ServerCommand(); + } + } +} diff --git a/quake3/source/code/cgame/cg_snapshot.c b/quake3/source/code/cgame/cg_snapshot.c new file mode 100644 index 0000000..bf90b43 --- /dev/null +++ b/quake3/source/code/cgame/cg_snapshot.c @@ -0,0 +1,402 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_snapshot.c -- things that happen on snapshot transition, +// not necessarily every single rendered frame + +#include "cg_local.h" + + + +/* +================== +CG_ResetEntity +================== +*/ +static void CG_ResetEntity( centity_t *cent ) { + // if the previous snapshot this entity was updated in is at least + // an event window back in time then we can reset the previous event + if ( cent->snapShotTime < cg.time - EVENT_VALID_MSEC ) { + cent->previousEvent = 0; + } + + cent->trailTime = cg.snap->serverTime; + + VectorCopy (cent->currentState.origin, cent->lerpOrigin); + VectorCopy (cent->currentState.angles, cent->lerpAngles); + if ( cent->currentState.eType == ET_PLAYER ) { + CG_ResetPlayerEntity( cent ); + } +} + +//PKMOD - Ergodic 07/04/01 - debug position +extern char *CG_vtos( const vec3_t v ); + +/* +=============== +CG_TransitionEntity + +cent->nextState is moved to cent->currentState and events are fired +=============== +*/ +static void CG_TransitionEntity( centity_t *cent ) { + cent->currentState = cent->nextState; + cent->currentValid = qtrue; + + //PKMOD Ergodic debug 07/19/00 (inactive) +// if ( cent->currentState.eType == ET_LIGHTNING_FX ) { +// Com_Printf("CG_TransitionEntity - ET_LIGHTNING_FX found\n"); +// } + + //PKMOD Ergodic debug 07/04/01 (inactive) +// if ( cent->currentState.eType == ET_ZOMBIE ) { +// Com_Printf("CG_TransitionEntity - ET_ZOMBIE found at >%s<\n", CG_vtos(cent->lerpOrigin) ) ; +// } + + // reset if the entity wasn't in the last frame or was teleported + if ( !cent->interpolate ) { + CG_ResetEntity( cent ); + } + + // clear the next state. if will be set by the next CG_SetNextSnap + cent->interpolate = qfalse; + + // check for events + CG_CheckEvents( cent ); +} + + +/* +================== +CG_SetInitialSnapshot + +This will only happen on the very first snapshot, or +on tourney restarts. All other times will use +CG_TransitionSnapshot instead. + +FIXME: Also called by map_restart? +================== +*/ +void CG_SetInitialSnapshot( snapshot_t *snap ) { + int i; + centity_t *cent; + entityState_t *state; + + cg.snap = snap; + + BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].currentState, qfalse ); + + // sort out solid entities + CG_BuildSolidList(); + + CG_ExecuteNewServerCommands( snap->serverCommandSequence ); + + // set our local weapon selection pointer to + // what the server has indicated the current weapon is + CG_Respawn(); + + for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { + state = &cg.snap->entities[ i ]; + cent = &cg_entities[ state->number ]; + + memcpy(¢->currentState, state, sizeof(entityState_t)); + //cent->currentState = *state; + cent->interpolate = qfalse; + cent->currentValid = qtrue; + + //PKMOD Ergodic debug 07/19/00 (inactive) +// if ( cent->currentState.eType == ET_LIGHTNING_FX ) { +// Com_Printf("CG_SetInitialSnapshot - ET_LIGHTNING_FX found\n"); +// } + + + CG_ResetEntity( cent ); + + // check for events + CG_CheckEvents( cent ); + } +} + + +/* +=================== +CG_TransitionSnapshot + +The transition point from snap to nextSnap has passed +=================== +*/ +static void CG_TransitionSnapshot( void ) { + centity_t *cent; + snapshot_t *oldFrame; + int i; + + if ( !cg.snap ) { + CG_Error( "CG_TransitionSnapshot: NULL cg.snap" ); + } + if ( !cg.nextSnap ) { + CG_Error( "CG_TransitionSnapshot: NULL cg.nextSnap" ); + } + + // execute any server string commands before transitioning entities + CG_ExecuteNewServerCommands( cg.nextSnap->serverCommandSequence ); + + // if we had a map_restart, set everthing with initial + if ( !cg.snap ) { + } + + // clear the currentValid flag for all entities in the existing snapshot + for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { + cent = &cg_entities[ cg.snap->entities[ i ].number ]; + cent->currentValid = qfalse; + } + + // move nextSnap to snap and do the transitions + oldFrame = cg.snap; + cg.snap = cg.nextSnap; + + BG_PlayerStateToEntityState( &cg.snap->ps, &cg_entities[ cg.snap->ps.clientNum ].currentState, qfalse ); + cg_entities[ cg.snap->ps.clientNum ].interpolate = qfalse; + + for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { + cent = &cg_entities[ cg.snap->entities[ i ].number ]; + CG_TransitionEntity( cent ); + + // remember time of snapshot this entity was last updated in + cent->snapShotTime = cg.snap->serverTime; + } + + cg.nextSnap = NULL; + + // check for playerstate transition events + if ( oldFrame ) { + playerState_t *ops, *ps; + + ops = &oldFrame->ps; + ps = &cg.snap->ps; + // teleporting checks are irrespective of prediction + if ( ( ps->eFlags ^ ops->eFlags ) & EF_TELEPORT_BIT ) { + cg.thisFrameTeleport = qtrue; // will be cleared by prediction code + } + + // if we are not doing client side movement prediction for any + // reason, then the client events and view changes will be issued now + if ( cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW) + || cg_nopredict.integer || cg_synchronousClients.integer ) { + CG_TransitionPlayerState( ps, ops ); + } + } + +} + + +/* +=================== +CG_SetNextSnap + +A new snapshot has just been read in from the client system. +=================== +*/ +static void CG_SetNextSnap( snapshot_t *snap ) { + int num; + entityState_t *es; + centity_t *cent; + + cg.nextSnap = snap; + + BG_PlayerStateToEntityState( &snap->ps, &cg_entities[ snap->ps.clientNum ].nextState, qfalse ); + cg_entities[ cg.snap->ps.clientNum ].interpolate = qtrue; + + // check for extrapolation errors + for ( num = 0 ; num < snap->numEntities ; num++ ) { + es = &snap->entities[num]; + cent = &cg_entities[ es->number ]; + + memcpy(¢->nextState, es, sizeof(entityState_t)); + //cent->nextState = *es; + + // if this frame is a teleport, or the entity wasn't in the + // previous frame, don't interpolate + if ( !cent->currentValid || ( ( cent->currentState.eFlags ^ es->eFlags ) & EF_TELEPORT_BIT ) ) { + cent->interpolate = qfalse; + } else { + cent->interpolate = qtrue; + } + } + + // if the next frame is a teleport for the playerstate, we + // can't interpolate during demos + if ( cg.snap && ( ( snap->ps.eFlags ^ cg.snap->ps.eFlags ) & EF_TELEPORT_BIT ) ) { + cg.nextFrameTeleport = qtrue; + } else { + cg.nextFrameTeleport = qfalse; + } + + // if changing follow mode, don't interpolate + if ( cg.nextSnap->ps.clientNum != cg.snap->ps.clientNum ) { + cg.nextFrameTeleport = qtrue; + } + + // if changing server restarts, don't interpolate + if ( ( cg.nextSnap->snapFlags ^ cg.snap->snapFlags ) & SNAPFLAG_SERVERCOUNT ) { + cg.nextFrameTeleport = qtrue; + } + + // sort out solid entities + CG_BuildSolidList(); +} + + +/* +======================== +CG_ReadNextSnapshot + +This is the only place new snapshots are requested +This may increment cgs.processedSnapshotNum multiple +times if the client system fails to return a +valid snapshot. +======================== +*/ +static snapshot_t *CG_ReadNextSnapshot( void ) { + qboolean r; + snapshot_t *dest; + + if ( cg.latestSnapshotNum > cgs.processedSnapshotNum + 1000 ) { + CG_Printf( "WARNING: CG_ReadNextSnapshot: way out of range, %i > %i", + cg.latestSnapshotNum, cgs.processedSnapshotNum ); + } + + while ( cgs.processedSnapshotNum < cg.latestSnapshotNum ) { + // decide which of the two slots to load it into + if ( cg.snap == &cg.activeSnapshots[0] ) { + dest = &cg.activeSnapshots[1]; + } else { + dest = &cg.activeSnapshots[0]; + } + + // try to read the snapshot from the client system + cgs.processedSnapshotNum++; + r = trap_GetSnapshot( cgs.processedSnapshotNum, dest ); + + // FIXME: why would trap_GetSnapshot return a snapshot with the same server time + if ( cg.snap && r && dest->serverTime == cg.snap->serverTime ) { + //continue; + } + + // if it succeeded, return + if ( r ) { + CG_AddLagometerSnapshotInfo( dest ); + return dest; + } + + // a GetSnapshot will return failure if the snapshot + // never arrived, or is so old that its entities + // have been shoved off the end of the circular + // buffer in the client system. + + // record as a dropped packet + CG_AddLagometerSnapshotInfo( NULL ); + + // If there are additional snapshots, continue trying to + // read them. + } + + // nothing left to read + return NULL; +} + + +/* +============ +CG_ProcessSnapshots + +We are trying to set up a renderable view, so determine +what the simulated time is, and try to get snapshots +both before and after that time if available. + +If we don't have a valid cg.snap after exiting this function, +then a 3D game view cannot be rendered. This should only happen +right after the initial connection. After cg.snap has been valid +once, it will never turn invalid. + +Even if cg.snap is valid, cg.nextSnap may not be, if the snapshot +hasn't arrived yet (it becomes an extrapolating situation instead +of an interpolating one) + +============ +*/ +void CG_ProcessSnapshots( void ) { + snapshot_t *snap; + int n; + + // see what the latest snapshot the client system has is + trap_GetCurrentSnapshotNumber( &n, &cg.latestSnapshotTime ); + if ( n != cg.latestSnapshotNum ) { + if ( n < cg.latestSnapshotNum ) { + // this should never happen + CG_Error( "CG_ProcessSnapshots: n < cg.latestSnapshotNum" ); + } + cg.latestSnapshotNum = n; + } + + // If we have yet to receive a snapshot, check for it. + // Once we have gotten the first snapshot, cg.snap will + // always have valid data for the rest of the game + while ( !cg.snap ) { + snap = CG_ReadNextSnapshot(); + if ( !snap ) { + // we can't continue until we get a snapshot + return; + } + + // set our weapon selection to what + // the playerstate is currently using + if ( !( snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) { + CG_SetInitialSnapshot( snap ); + } + } + + // loop until we either have a valid nextSnap with a serverTime + // greater than cg.time to interpolate towards, or we run + // out of available snapshots + do { + // if we don't have a nextframe, try and read a new one in + if ( !cg.nextSnap ) { + snap = CG_ReadNextSnapshot(); + + // if we still don't have a nextframe, we will just have to + // extrapolate + if ( !snap ) { + break; + } + + CG_SetNextSnap( snap ); + + + // if time went backwards, we have a level restart + if ( cg.nextSnap->serverTime < cg.snap->serverTime ) { + CG_Error( "CG_ProcessSnapshots: Server time went backwards" ); + } + } + + // if our time is < nextFrame's, we have a nice interpolating state + if ( cg.time >= cg.snap->serverTime && cg.time < cg.nextSnap->serverTime ) { + break; + } + + // we have passed the transition from nextFrame to frame + CG_TransitionSnapshot(); + } while ( 1 ); + + // assert our valid conditions upon exiting + if ( cg.snap == NULL ) { + CG_Error( "CG_ProcessSnapshots: cg.snap == NULL" ); + } + if ( cg.time < cg.snap->serverTime ) { + // this can happen right after a vid_restart + cg.time = cg.snap->serverTime; + } + if ( cg.nextSnap != NULL && cg.nextSnap->serverTime <= cg.time ) { + CG_Error( "CG_ProcessSnapshots: cg.nextSnap->serverTime <= cg.time" ); + } + +} + diff --git a/quake3/source/code/cgame/cg_syscalls.asm b/quake3/source/code/cgame/cg_syscalls.asm new file mode 100644 index 0000000..8363fe3 --- /dev/null +++ b/quake3/source/code/cgame/cg_syscalls.asm @@ -0,0 +1,106 @@ +code + +equ trap_Print -1 +equ trap_Error -2 +equ trap_Milliseconds -3 +equ trap_Cvar_Register -4 +equ trap_Cvar_Update -5 +equ trap_Cvar_Set -6 +equ trap_Cvar_VariableStringBuffer -7 +equ trap_Argc -8 +equ trap_Argv -9 +equ trap_Args -10 +equ trap_FS_FOpenFile -11 +equ trap_FS_Read -12 +equ trap_FS_Write -13 +equ trap_FS_FCloseFile -14 +equ trap_SendConsoleCommand -15 +equ trap_AddCommand -16 +equ trap_SendClientCommand -17 +equ trap_UpdateScreen -18 +equ trap_CM_LoadMap -19 +equ trap_CM_NumInlineModels -20 +equ trap_CM_InlineModel -21 +equ trap_CM_LoadModel -22 +equ trap_CM_TempBoxModel -23 +equ trap_CM_PointContents -24 +equ trap_CM_TransformedPointContents -25 +equ trap_CM_BoxTrace -26 +equ trap_CM_TransformedBoxTrace -27 +equ trap_CM_MarkFragments -28 +equ trap_S_StartSound -29 +equ trap_S_StartLocalSound -30 +equ trap_S_ClearLoopingSounds -31 +equ trap_S_AddLoopingSound -32 +equ trap_S_UpdateEntityPosition -33 +equ trap_S_Respatialize -34 +equ trap_S_RegisterSound -35 +equ trap_S_StartBackgroundTrack -36 +equ trap_R_LoadWorldMap -37 +equ trap_R_RegisterModel -38 +equ trap_R_RegisterSkin -39 +equ trap_R_RegisterShader -40 +equ trap_R_ClearScene -41 +equ trap_R_AddRefEntityToScene -42 +equ trap_R_AddPolyToScene -43 +equ trap_R_AddLightToScene -44 +equ trap_R_RenderScene -45 +equ trap_R_SetColor -46 +equ trap_R_DrawStretchPic -47 +equ trap_R_ModelBounds -48 +equ trap_R_LerpTag -49 +equ trap_GetGlconfig -50 +equ trap_GetGameState -51 +equ trap_GetCurrentSnapshotNumber -52 +equ trap_GetSnapshot -53 +equ trap_GetServerCommand -54 +equ trap_GetCurrentCmdNumber -55 +equ trap_GetUserCmd -56 +equ trap_SetUserCmdValue -57 +equ trap_R_RegisterShaderNoMip -58 +equ trap_MemoryRemaining -59 +equ trap_R_RegisterFont -60 +equ trap_Key_IsDown -61 +equ trap_Key_GetCatcher -62 +equ trap_Key_SetCatcher -63 +equ trap_Key_GetKey -64 +equ trap_PC_AddGlobalDefine -65 +equ trap_PC_LoadSource -66 +equ trap_PC_FreeSource -67 +equ trap_PC_ReadToken -68 +equ trap_PC_SourceFileAndLine -69 +equ trap_S_StopBackgroundTrack -70 +equ trap_RealTime -71 +equ trap_SnapVector -72 +equ trap_RemoveCommand -73 +equ trap_R_LightForPoint -74 +equ trap_CIN_PlayCinematic -75 +equ trap_CIN_StopCinematic -76 +equ trap_CIN_RunCinematic -77 +equ trap_CIN_DrawCinematic -78 +equ trap_CIN_SetExtents -79 +equ trap_R_RemapShader -80 +equ trap_S_AddRealLoopingSound -81 +equ trap_S_StopLoopingSound -82 +equ trap_CM_TempCapsuleModel -83 +equ trap_CM_CapsuleTrace -84 +equ trap_CM_TransformedCapsuleTrace -85 +equ trap_R_AddAdditiveLightToScene -86 +equ trap_GetEntityToken -87 +equ trap_R_AddPolysToScene -88 +equ trap_R_inPVS -89 +equ trap_FS_Seek -90 + +equ memset -101 +equ memcpy -102 +equ strncpy -103 +equ sin -104 +equ cos -105 +equ atan2 -106 +equ sqrt -107 +equ floor -108 +equ ceil -109 +equ testPrintInt -110 +equ testPrintFloat -111 +equ acos -112 + diff --git a/quake3/source/code/cgame/cg_syscalls.c b/quake3/source/code/cgame/cg_syscalls.c new file mode 100644 index 0000000..102fcc4 --- /dev/null +++ b/quake3/source/code/cgame/cg_syscalls.c @@ -0,0 +1,426 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_syscalls.c -- this file is only included when building a dll +// cg_syscalls.asm is included instead when building a qvm +#ifdef Q3_VM +#error "Do not use in VM build" +#endif + + +#include "cg_local.h" + +static int (QDECL *syscall)( int arg, ... ) = (int (QDECL *)( int, ...))-1; + + +void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) { + syscall = syscallptr; +} + + +int PASSFLOAT( float x ) { + float floatTemp; + floatTemp = x; + return *(int *)&floatTemp; +} + +void trap_Print( const char *fmt ) { + syscall( CG_PRINT, fmt ); +} + +void trap_Error( const char *fmt ) { + syscall( CG_ERROR, fmt ); +} + +int trap_Milliseconds( void ) { + return syscall( CG_MILLISECONDS ); +} + +void trap_Cvar_Register( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ) { + syscall( CG_CVAR_REGISTER, vmCvar, varName, defaultValue, flags ); +} + +void trap_Cvar_Update( vmCvar_t *vmCvar ) { + syscall( CG_CVAR_UPDATE, vmCvar ); +} + +void trap_Cvar_Set( const char *var_name, const char *value ) { + syscall( CG_CVAR_SET, var_name, value ); +} + +void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ) { + syscall( CG_CVAR_VARIABLESTRINGBUFFER, var_name, buffer, bufsize ); +} + +int trap_Argc( void ) { + return syscall( CG_ARGC ); +} + +void trap_Argv( int n, char *buffer, int bufferLength ) { + syscall( CG_ARGV, n, buffer, bufferLength ); +} + +void trap_Args( char *buffer, int bufferLength ) { + syscall( CG_ARGS, buffer, bufferLength ); +} + +int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ) { + return syscall( CG_FS_FOPENFILE, qpath, f, mode ); +} + +void trap_FS_Read( void *buffer, int len, fileHandle_t f ) { + syscall( CG_FS_READ, buffer, len, f ); +} + +void trap_FS_Write( const void *buffer, int len, fileHandle_t f ) { + syscall( CG_FS_WRITE, buffer, len, f ); +} + +void trap_FS_FCloseFile( fileHandle_t f ) { + syscall( CG_FS_FCLOSEFILE, f ); +} + +int trap_FS_Seek( fileHandle_t f, long offset, int origin ) { + return syscall( CG_FS_SEEK, f, offset, origin ); +} + +void trap_SendConsoleCommand( const char *text ) { + syscall( CG_SENDCONSOLECOMMAND, text ); +} + +void trap_AddCommand( const char *cmdName ) { + syscall( CG_ADDCOMMAND, cmdName ); +} + +void trap_RemoveCommand( const char *cmdName ) { + syscall( CG_REMOVECOMMAND, cmdName ); +} + +void trap_SendClientCommand( const char *s ) { + syscall( CG_SENDCLIENTCOMMAND, s ); +} + +void trap_UpdateScreen( void ) { + syscall( CG_UPDATESCREEN ); +} + +void trap_CM_LoadMap( const char *mapname ) { + syscall( CG_CM_LOADMAP, mapname ); +} + +int trap_CM_NumInlineModels( void ) { + return syscall( CG_CM_NUMINLINEMODELS ); +} + +clipHandle_t trap_CM_InlineModel( int index ) { + return syscall( CG_CM_INLINEMODEL, index ); +} + +clipHandle_t trap_CM_TempBoxModel( const vec3_t mins, const vec3_t maxs ) { + return syscall( CG_CM_TEMPBOXMODEL, mins, maxs ); +} + +clipHandle_t trap_CM_TempCapsuleModel( const vec3_t mins, const vec3_t maxs ) { + return syscall( CG_CM_TEMPCAPSULEMODEL, mins, maxs ); +} + +int trap_CM_PointContents( const vec3_t p, clipHandle_t model ) { + return syscall( CG_CM_POINTCONTENTS, p, model ); +} + +int trap_CM_TransformedPointContents( const vec3_t p, clipHandle_t model, const vec3_t origin, const vec3_t angles ) { + return syscall( CG_CM_TRANSFORMEDPOINTCONTENTS, p, model, origin, angles ); +} + +void trap_CM_BoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask ) { + syscall( CG_CM_BOXTRACE, results, start, end, mins, maxs, model, brushmask ); +} + +void trap_CM_CapsuleTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask ) { + syscall( CG_CM_CAPSULETRACE, results, start, end, mins, maxs, model, brushmask ); +} + +void trap_CM_TransformedBoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask, + const vec3_t origin, const vec3_t angles ) { + syscall( CG_CM_TRANSFORMEDBOXTRACE, results, start, end, mins, maxs, model, brushmask, origin, angles ); +} + +void trap_CM_TransformedCapsuleTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask, + const vec3_t origin, const vec3_t angles ) { + syscall( CG_CM_TRANSFORMEDCAPSULETRACE, results, start, end, mins, maxs, model, brushmask, origin, angles ); +} + +int trap_CM_MarkFragments( int numPoints, const vec3_t *points, + const vec3_t projection, + int maxPoints, vec3_t pointBuffer, + int maxFragments, markFragment_t *fragmentBuffer ) { + return syscall( CG_CM_MARKFRAGMENTS, numPoints, points, projection, maxPoints, pointBuffer, maxFragments, fragmentBuffer ); +} + +void trap_S_StartSound( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ) { + syscall( CG_S_STARTSOUND, origin, entityNum, entchannel, sfx ); +} + +void trap_S_StartLocalSound( sfxHandle_t sfx, int channelNum ) { + syscall( CG_S_STARTLOCALSOUND, sfx, channelNum ); +} + +void trap_S_ClearLoopingSounds( qboolean killall ) { + syscall( CG_S_CLEARLOOPINGSOUNDS, killall ); +} + +void trap_S_AddLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ) { + syscall( CG_S_ADDLOOPINGSOUND, entityNum, origin, velocity, sfx ); +} + +void trap_S_AddRealLoopingSound( int entityNum, const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx ) { + syscall( CG_S_ADDREALLOOPINGSOUND, entityNum, origin, velocity, sfx ); +} + +void trap_S_StopLoopingSound( int entityNum ) { + syscall( CG_S_STOPLOOPINGSOUND, entityNum ); +} + +void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ) { + syscall( CG_S_UPDATEENTITYPOSITION, entityNum, origin ); +} + +void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int inwater ) { + syscall( CG_S_RESPATIALIZE, entityNum, origin, axis, inwater ); +} + +sfxHandle_t trap_S_RegisterSound( const char *sample, qboolean compressed ) { + return syscall( CG_S_REGISTERSOUND, sample, compressed ); +} + +void trap_S_StartBackgroundTrack( const char *intro, const char *loop ) { + syscall( CG_S_STARTBACKGROUNDTRACK, intro, loop ); +} + +void trap_R_LoadWorldMap( const char *mapname ) { + syscall( CG_R_LOADWORLDMAP, mapname ); +} + +qhandle_t trap_R_RegisterModel( const char *name ) { + return syscall( CG_R_REGISTERMODEL, name ); +} + +qhandle_t trap_R_RegisterSkin( const char *name ) { + return syscall( CG_R_REGISTERSKIN, name ); +} + +qhandle_t trap_R_RegisterShader( const char *name ) { + return syscall( CG_R_REGISTERSHADER, name ); +} + +qhandle_t trap_R_RegisterShaderNoMip( const char *name ) { + return syscall( CG_R_REGISTERSHADERNOMIP, name ); +} + +void trap_R_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font) { + syscall(CG_R_REGISTERFONT, fontName, pointSize, font ); +} + +void trap_R_ClearScene( void ) { + syscall( CG_R_CLEARSCENE ); +} + +void trap_R_AddRefEntityToScene( const refEntity_t *re ) { + syscall( CG_R_ADDREFENTITYTOSCENE, re ); +} + +void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts ) { + syscall( CG_R_ADDPOLYTOSCENE, hShader, numVerts, verts ); +} + +void trap_R_AddPolysToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int num ) { + syscall( CG_R_ADDPOLYSTOSCENE, hShader, numVerts, verts, num ); +} + +int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ) { + return syscall( CG_R_LIGHTFORPOINT, point, ambientLight, directedLight, lightDir ); +} + +void trap_R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b ) { + syscall( CG_R_ADDLIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); +} + +void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ) { + syscall( CG_R_ADDADDITIVELIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); +} + +void trap_R_RenderScene( const refdef_t *fd ) { + syscall( CG_R_RENDERSCENE, fd ); +} + +void trap_R_SetColor( const float *rgba ) { + syscall( CG_R_SETCOLOR, rgba ); +} + +void trap_R_DrawStretchPic( float x, float y, float w, float h, + float s1, float t1, float s2, float t2, qhandle_t hShader ) { + syscall( CG_R_DRAWSTRETCHPIC, PASSFLOAT(x), PASSFLOAT(y), PASSFLOAT(w), PASSFLOAT(h), PASSFLOAT(s1), PASSFLOAT(t1), PASSFLOAT(s2), PASSFLOAT(t2), hShader ); +} + +void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ) { + syscall( CG_R_MODELBOUNDS, model, mins, maxs ); +} + +int trap_R_LerpTag( orientation_t *tag, clipHandle_t mod, int startFrame, int endFrame, + float frac, const char *tagName ) { + return syscall( CG_R_LERPTAG, tag, mod, startFrame, endFrame, PASSFLOAT(frac), tagName ); +} + +void trap_R_RemapShader( const char *oldShader, const char *newShader, const char *timeOffset ) { + syscall( CG_R_REMAP_SHADER, oldShader, newShader, timeOffset ); +} + +void trap_GetGlconfig( glconfig_t *glconfig ) { + syscall( CG_GETGLCONFIG, glconfig ); +} + +void trap_GetGameState( gameState_t *gamestate ) { + syscall( CG_GETGAMESTATE, gamestate ); +} + +void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) { + syscall( CG_GETCURRENTSNAPSHOTNUMBER, snapshotNumber, serverTime ); +} + +qboolean trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) { + return syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); +} + +qboolean trap_GetServerCommand( int serverCommandNumber ) { + return syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); +} + +int trap_GetCurrentCmdNumber( void ) { + return syscall( CG_GETCURRENTCMDNUMBER ); +} + +qboolean trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ) { + return syscall( CG_GETUSERCMD, cmdNumber, ucmd ); +} + +void trap_SetUserCmdValue( int stateValue, float sensitivityScale ) { + syscall( CG_SETUSERCMDVALUE, stateValue, PASSFLOAT(sensitivityScale) ); +} + +void testPrintInt( char *string, int i ) { + syscall( CG_TESTPRINTINT, string, i ); +} + +void testPrintFloat( char *string, float f ) { + syscall( CG_TESTPRINTFLOAT, string, PASSFLOAT(f) ); +} + +int trap_MemoryRemaining( void ) { + return syscall( CG_MEMORY_REMAINING ); +} + +qboolean trap_Key_IsDown( int keynum ) { + return syscall( CG_KEY_ISDOWN, keynum ); +} + +int trap_Key_GetCatcher( void ) { + return syscall( CG_KEY_GETCATCHER ); +} + +void trap_Key_SetCatcher( int catcher ) { + syscall( CG_KEY_SETCATCHER, catcher ); +} + +int trap_Key_GetKey( const char *binding ) { + return syscall( CG_KEY_GETKEY, binding ); +} + +int trap_PC_AddGlobalDefine( char *define ) { + return syscall( CG_PC_ADD_GLOBAL_DEFINE, define ); +} + +int trap_PC_LoadSource( const char *filename ) { + return syscall( CG_PC_LOAD_SOURCE, filename ); +} + +int trap_PC_FreeSource( int handle ) { + return syscall( CG_PC_FREE_SOURCE, handle ); +} + +int trap_PC_ReadToken( int handle, pc_token_t *pc_token ) { + return syscall( CG_PC_READ_TOKEN, handle, pc_token ); +} + +int trap_PC_SourceFileAndLine( int handle, char *filename, int *line ) { + return syscall( CG_PC_SOURCE_FILE_AND_LINE, handle, filename, line ); +} + +void trap_S_StopBackgroundTrack( void ) { + syscall( CG_S_STOPBACKGROUNDTRACK ); +} + +int trap_RealTime(qtime_t *qtime) { + return syscall( CG_REAL_TIME, qtime ); +} + +void trap_SnapVector( float *v ) { + syscall( CG_SNAPVECTOR, v ); +} + +// this returns a handle. arg0 is the name in the format "idlogo.roq", set arg1 to NULL, alteredstates to qfalse (do not alter gamestate) +int trap_CIN_PlayCinematic( const char *arg0, int xpos, int ypos, int width, int height, int bits) { + return syscall(CG_CIN_PLAYCINEMATIC, arg0, xpos, ypos, width, height, bits); +} + +// stops playing the cinematic and ends it. should always return FMV_EOF +// cinematics must be stopped in reverse order of when they are started +e_status trap_CIN_StopCinematic(int handle) { + return syscall(CG_CIN_STOPCINEMATIC, handle); +} + + +// will run a frame of the cinematic but will not draw it. Will return FMV_EOF if the end of the cinematic has been reached. +e_status trap_CIN_RunCinematic (int handle) { + return syscall(CG_CIN_RUNCINEMATIC, handle); +} + + +// draws the current frame +void trap_CIN_DrawCinematic (int handle) { + syscall(CG_CIN_DRAWCINEMATIC, handle); +} + + +// allows you to resize the animation dynamically +void trap_CIN_SetExtents (int handle, int x, int y, int w, int h) { + syscall(CG_CIN_SETEXTENTS, handle, x, y, w, h); +} + +/* +qboolean trap_loadCamera( const char *name ) { + return syscall( CG_LOADCAMERA, name ); +} + +void trap_startCamera(int time) { + syscall(CG_STARTCAMERA, time); +} + +qboolean trap_getCameraInfo( int time, vec3_t *origin, vec3_t *angles) { + return syscall( CG_GETCAMERAINFO, time, origin, angles ); +} +*/ + +qboolean trap_GetEntityToken( char *buffer, int bufferSize ) { + return syscall( CG_GET_ENTITY_TOKEN, buffer, bufferSize ); +} + +qboolean trap_R_inPVS( const vec3_t p1, const vec3_t p2 ) { + return syscall( CG_R_INPVS, p1, p2 ); +} diff --git a/quake3/source/code/cgame/cg_view.c b/quake3/source/code/cgame/cg_view.c new file mode 100644 index 0000000..6f9e425 --- /dev/null +++ b/quake3/source/code/cgame/cg_view.c @@ -0,0 +1,863 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_view.c -- setup all the parameters (position, angle, etc) +// for a 3D rendering +#include "cg_local.h" + + +/* +============================================================================= + + MODEL TESTING + +The viewthing and gun positioning tools from Q2 have been integrated and +enhanced into a single model testing facility. + +Model viewing can begin with either "testmodel " or "testgun ". + +The names must be the full pathname after the basedir, like +"models/weapons/v_launch/tris.md3" or "players/male/tris.md3" + +Testmodel will create a fake entity 100 units in front of the current view +position, directly facing the viewer. It will remain immobile, so you can +move around it to view it from different angles. + +Testgun will cause the model to follow the player around and supress the real +view weapon model. The default frame 0 of most guns is completely off screen, +so you will probably have to cycle a couple frames to see it. + +"nextframe", "prevframe", "nextskin", and "prevskin" commands will change the +frame or skin of the testmodel. These are bound to F5, F6, F7, and F8 in +q3default.cfg. + +If a gun is being tested, the "gun_x", "gun_y", and "gun_z" variables will let +you adjust the positioning. + +Note that none of the model testing features update while the game is paused, so +it may be convenient to test with deathmatch set to 1 so that bringing down the +console doesn't pause the game. + +============================================================================= +*/ + +/* +================= +CG_TestModel_f + +Creates an entity in front of the current position, which +can then be moved around +================= +*/ +void CG_TestModel_f (void) { + vec3_t angles; + + memset( &cg.testModelEntity, 0, sizeof(cg.testModelEntity) ); + if ( trap_Argc() < 2 ) { + return; + } + + Q_strncpyz (cg.testModelName, CG_Argv( 1 ), MAX_QPATH ); + cg.testModelEntity.hModel = trap_R_RegisterModel( cg.testModelName ); + + if ( trap_Argc() == 3 ) { + cg.testModelEntity.backlerp = atof( CG_Argv( 2 ) ); + cg.testModelEntity.frame = 1; + cg.testModelEntity.oldframe = 0; + } + if (! cg.testModelEntity.hModel ) { + CG_Printf( "Can't register model\n" ); + return; + } + + VectorMA( cg.refdef.vieworg, 100, cg.refdef.viewaxis[0], cg.testModelEntity.origin ); + + angles[PITCH] = 0; + angles[YAW] = 180 + cg.refdefViewAngles[1]; + angles[ROLL] = 0; + + AnglesToAxis( angles, cg.testModelEntity.axis ); + cg.testGun = qfalse; +} + +/* +================= +CG_TestGun_f + +Replaces the current view weapon with the given model +================= +*/ +void CG_TestGun_f (void) { + CG_TestModel_f(); + cg.testGun = qtrue; + cg.testModelEntity.renderfx = RF_MINLIGHT | RF_DEPTHHACK | RF_FIRST_PERSON; +} + + +void CG_TestModelNextFrame_f (void) { + cg.testModelEntity.frame++; + CG_Printf( "frame %i\n", cg.testModelEntity.frame ); +} + +void CG_TestModelPrevFrame_f (void) { + cg.testModelEntity.frame--; + if ( cg.testModelEntity.frame < 0 ) { + cg.testModelEntity.frame = 0; + } + CG_Printf( "frame %i\n", cg.testModelEntity.frame ); +} + +void CG_TestModelNextSkin_f (void) { + cg.testModelEntity.skinNum++; + CG_Printf( "skin %i\n", cg.testModelEntity.skinNum ); +} + +void CG_TestModelPrevSkin_f (void) { + cg.testModelEntity.skinNum--; + if ( cg.testModelEntity.skinNum < 0 ) { + cg.testModelEntity.skinNum = 0; + } + CG_Printf( "skin %i\n", cg.testModelEntity.skinNum ); +} + +static void CG_AddTestModel (void) { + int i; + + // re-register the model, because the level may have changed + cg.testModelEntity.hModel = trap_R_RegisterModel( cg.testModelName ); + if (! cg.testModelEntity.hModel ) { + CG_Printf ("Can't register model\n"); + return; + } + + // if testing a gun, set the origin reletive to the view origin + if ( cg.testGun ) { + VectorCopy( cg.refdef.vieworg, cg.testModelEntity.origin ); + VectorCopy( cg.refdef.viewaxis[0], cg.testModelEntity.axis[0] ); + VectorCopy( cg.refdef.viewaxis[1], cg.testModelEntity.axis[1] ); + VectorCopy( cg.refdef.viewaxis[2], cg.testModelEntity.axis[2] ); + + // allow the position to be adjusted + for (i=0 ; i<3 ; i++) { + cg.testModelEntity.origin[i] += cg.refdef.viewaxis[0][i] * cg_gun_x.value; + cg.testModelEntity.origin[i] += cg.refdef.viewaxis[1][i] * cg_gun_y.value; + cg.testModelEntity.origin[i] += cg.refdef.viewaxis[2][i] * cg_gun_z.value; + } + } + + trap_R_AddRefEntityToScene( &cg.testModelEntity ); +} + + + +//============================================================================ + + +/* +================= +CG_CalcVrect + +Sets the coordinates of the rendered window +================= +*/ +static void CG_CalcVrect (void) { + int size; + + // the intermission should allways be full screen + if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { + size = 100; + } else { + // bound normal viewsize + if (cg_viewsize.integer < 30) { + trap_Cvar_Set ("cg_viewsize","30"); + size = 30; + } else if (cg_viewsize.integer > 100) { + trap_Cvar_Set ("cg_viewsize","100"); + size = 100; + } else { + size = cg_viewsize.integer; + } + + } + cg.refdef.width = cgs.glconfig.vidWidth*size/100; + cg.refdef.width &= ~1; + + cg.refdef.height = cgs.glconfig.vidHeight*size/100; + cg.refdef.height &= ~1; + + cg.refdef.x = (cgs.glconfig.vidWidth - cg.refdef.width)/2; + cg.refdef.y = (cgs.glconfig.vidHeight - cg.refdef.height)/2; +} + +//============================================================================== + + +/* +=============== +CG_OffsetThirdPersonView + +=============== +*/ +#define FOCUS_DISTANCE 512 +static void CG_OffsetThirdPersonView( void ) { + vec3_t forward, right, up; + vec3_t view; + vec3_t focusAngles; + trace_t trace; + static vec3_t mins = { -4, -4, -4 }; + static vec3_t maxs = { 4, 4, 4 }; + vec3_t focusPoint; + float focusDist; + float forwardScale, sideScale; + + cg.refdef.vieworg[2] += cg.predictedPlayerState.viewheight; + + VectorCopy( cg.refdefViewAngles, focusAngles ); + + // if dead, look at killer + if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) { + focusAngles[YAW] = cg.predictedPlayerState.stats[STAT_DEAD_YAW]; + cg.refdefViewAngles[YAW] = cg.predictedPlayerState.stats[STAT_DEAD_YAW]; + } + + if ( focusAngles[PITCH] > 45 ) { + focusAngles[PITCH] = 45; // don't go too far overhead + } + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( focusAngles, forward, NULL, NULL ); + AngleVectorsForward( focusAngles, forward ); + + VectorMA( cg.refdef.vieworg, FOCUS_DISTANCE, forward, focusPoint ); + + VectorCopy( cg.refdef.vieworg, view ); + + view[2] += 8; + + cg.refdefViewAngles[PITCH] *= 0.5; + + AngleVectors( cg.refdefViewAngles, forward, right, up ); + + forwardScale = cos( cg_thirdPersonAngle.value / 180 * M_PI ); + sideScale = sin( cg_thirdPersonAngle.value / 180 * M_PI ); + VectorMA( view, -cg_thirdPersonRange.value * forwardScale, forward, view ); + VectorMA( view, -cg_thirdPersonRange.value * sideScale, right, view ); + + // trace a ray from the origin to the viewpoint to make sure the view isn't + // in a solid block. Use an 8 by 8 block to prevent the view from near clipping anything + + if (!cg_cameraMode.integer) { + CG_Trace( &trace, cg.refdef.vieworg, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID ); + + if ( trace.fraction != 1.0 ) { + VectorCopy( trace.endpos, view ); + view[2] += (1.0 - trace.fraction) * 32; + // try another trace to this position, because a tunnel may have the ceiling + // close enogh that this is poking out + + CG_Trace( &trace, cg.refdef.vieworg, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID ); + VectorCopy( trace.endpos, view ); + } + } + + + VectorCopy( view, cg.refdef.vieworg ); + + // select pitch to look at focus point from vieword + VectorSubtract( focusPoint, cg.refdef.vieworg, focusPoint ); + focusDist = sqrt( focusPoint[0] * focusPoint[0] + focusPoint[1] * focusPoint[1] ); + if ( focusDist < 1 ) { + focusDist = 1; // should never happen + } + cg.refdefViewAngles[PITCH] = -180 / M_PI * atan2( focusPoint[2], focusDist ); + cg.refdefViewAngles[YAW] -= cg_thirdPersonAngle.value; +} + + +// this causes a compiler bug on mac MrC compiler +static void CG_StepOffset( void ) { + int timeDelta; + + // smooth out stair climbing + timeDelta = cg.time - cg.stepTime; + if ( timeDelta < STEP_TIME ) { + cg.refdef.vieworg[2] -= cg.stepChange + * (STEP_TIME - timeDelta) / STEP_TIME; + } +} + +/* +=============== +CG_OffsetFirstPersonView + +=============== +*/ +static void CG_OffsetFirstPersonView( void ) { + float *origin; + float *angles; + float bob; + float ratio; + float delta; + float speed; + float f; + vec3_t predictedVelocity; + int timeDelta; + + if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { + return; + } + + origin = cg.refdef.vieworg; + angles = cg.refdefViewAngles; + + // if dead, fix the angle and don't add any kick + if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) { + angles[ROLL] = 40; + angles[PITCH] = -15; + angles[YAW] = cg.snap->ps.stats[STAT_DEAD_YAW]; + origin[2] += cg.predictedPlayerState.viewheight; + return; + } + + // add angles based on weapon kick + VectorAdd (angles, cg.kick_angles, angles); + + // add angles based on damage kick + if ( cg.damageTime ) { + ratio = cg.time - cg.damageTime; + if ( ratio < DAMAGE_DEFLECT_TIME ) { + ratio /= DAMAGE_DEFLECT_TIME; + angles[PITCH] += ratio * cg.v_dmg_pitch; + angles[ROLL] += ratio * cg.v_dmg_roll; + } else { + ratio = 1.0 - ( ratio - DAMAGE_DEFLECT_TIME ) / DAMAGE_RETURN_TIME; + if ( ratio > 0 ) { + angles[PITCH] += ratio * cg.v_dmg_pitch; + angles[ROLL] += ratio * cg.v_dmg_roll; + } + } + } + + // add pitch based on fall kick +#if 0 + ratio = ( cg.time - cg.landTime) / FALL_TIME; + if (ratio < 0) + ratio = 0; + angles[PITCH] += ratio * cg.fall_value; +#endif + + // add angles based on velocity + VectorCopy( cg.predictedPlayerState.velocity, predictedVelocity ); + + delta = DotProduct ( predictedVelocity, cg.refdef.viewaxis[0]); + angles[PITCH] += delta * cg_runpitch.value; + + delta = DotProduct ( predictedVelocity, cg.refdef.viewaxis[1]); + angles[ROLL] -= delta * cg_runroll.value; + + // add angles based on bob + + // make sure the bob is visible even at low speeds + speed = cg.xyspeed > 200 ? cg.xyspeed : 200; + + delta = cg.bobfracsin * cg_bobpitch.value * speed; + if (cg.predictedPlayerState.pm_flags & PMF_DUCKED) + delta *= 3; // crouching + angles[PITCH] += delta; + delta = cg.bobfracsin * cg_bobroll.value * speed; + if (cg.predictedPlayerState.pm_flags & PMF_DUCKED) + delta *= 3; // crouching accentuates roll + if (cg.bobcycle & 1) + delta = -delta; + angles[ROLL] += delta; + +//=================================== + + // add view height + origin[2] += cg.predictedPlayerState.viewheight; + + // smooth out duck height changes + timeDelta = cg.time - cg.duckTime; + if ( timeDelta < DUCK_TIME) { + cg.refdef.vieworg[2] -= cg.duckChange + * (DUCK_TIME - timeDelta) / DUCK_TIME; + } + + // add bob height + bob = cg.bobfracsin * cg.xyspeed * cg_bobup.value; + if (bob > 6) { + bob = 6; + } + + origin[2] += bob; + + + // add fall height + delta = cg.time - cg.landTime; + if ( delta < LAND_DEFLECT_TIME ) { + f = delta / LAND_DEFLECT_TIME; + cg.refdef.vieworg[2] += cg.landChange * f; + } else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) { + delta -= LAND_DEFLECT_TIME; + f = 1.0 - ( delta / LAND_RETURN_TIME ); + cg.refdef.vieworg[2] += cg.landChange * f; + } + + // add step offset + CG_StepOffset(); + + // add kick offset + + VectorAdd (origin, cg.kick_origin, origin); + + // pivot the eye based on a neck length +#if 0 + { +#define NECK_LENGTH 8 + vec3_t forward, up; + + cg.refdef.vieworg[2] -= NECK_LENGTH; + AngleVectors( cg.refdefViewAngles, forward, NULL, up ); + VectorMA( cg.refdef.vieworg, 3, forward, cg.refdef.vieworg ); + VectorMA( cg.refdef.vieworg, NECK_LENGTH, up, cg.refdef.vieworg ); + } +#endif +} + +//====================================================================== + +void CG_ZoomDown_f( void ) { + if ( cg.zoomed ) { + return; + } + cg.zoomed = qtrue; + cg.zoomTime = cg.time; +} + +void CG_ZoomUp_f( void ) { + if ( !cg.zoomed ) { + return; + } + cg.zoomed = qfalse; + cg.zoomTime = cg.time; +} + + +/* +==================== +CG_CalcFov + +Fixed fov at intermissions, otherwise account for fov variable and zooms. +==================== +*/ +#define WAVE_AMPLITUDE 1 +#define WAVE_FREQUENCY 0.4 + +static int CG_CalcFov( void ) { + float x; + float phase; + float v; + int contents; + float fov_x, fov_y; + float zoomFov; + float f; + int inwater; + + if ( cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { + // if in intermission, use a fixed value + fov_x = 90; + } else { + // user selectable + if ( cgs.dmflags & DF_FIXED_FOV ) { + // dmflag to prevent wide fov for all clients + fov_x = 90; + } else { + fov_x = cg_fov.value; + if ( fov_x < 1 ) { + fov_x = 1; + } else if ( fov_x > 160 ) { + fov_x = 160; + } + } + + // account for zooms + zoomFov = cg_zoomFov.value; + if ( zoomFov < 1 ) { + zoomFov = 1; + } else if ( zoomFov > 160 ) { + zoomFov = 160; + } + + if ( cg.zoomed ) { + f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME; + if ( f > 1.0 ) { + fov_x = zoomFov; + } else { + fov_x = fov_x + f * ( zoomFov - fov_x ); + } + } else { + f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME; + if ( f > 1.0 ) { + fov_x = fov_x; + } else { + fov_x = zoomFov + f * ( fov_x - zoomFov ); + } + } + } + + x = cg.refdef.width / tan( fov_x / 360 * M_PI ); + fov_y = atan2( cg.refdef.height, x ); + fov_y = fov_y * 360 / M_PI; + + // warp if underwater + contents = CG_PointContents( cg.refdef.vieworg, -1 ); + if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ){ + phase = cg.time / 1000.0 * WAVE_FREQUENCY * M_PI * 2; + v = WAVE_AMPLITUDE * sin( phase ); + fov_x += v; + fov_y -= v; + inwater = qtrue; + } + else { + inwater = qfalse; + } + + + // set it + cg.refdef.fov_x = fov_x; + cg.refdef.fov_y = fov_y; + + if ( !cg.zoomed ) { + cg.zoomSensitivity = 1; + } else { + cg.zoomSensitivity = cg.refdef.fov_y / 75.0; + } + + return inwater; +} + + + +/* +=============== +CG_DamageBlendBlob + +=============== +*/ +static void CG_DamageBlendBlob( void ) { + int t; + int maxTime; + refEntity_t ent; + + if ( !cg.damageValue ) { + return; + } + + //if (cg.cameraMode) { + // return; + //} + + // ragePro systems can't fade blends, so don't obscure the screen + if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) { + return; + } + + maxTime = DAMAGE_TIME; + t = cg.time - cg.damageTime; + if ( t <= 0 || t >= maxTime ) { + return; + } + + + memset( &ent, 0, sizeof( ent ) ); + ent.reType = RT_SPRITE; + ent.renderfx = RF_FIRST_PERSON; + + VectorMA( cg.refdef.vieworg, 8, cg.refdef.viewaxis[0], ent.origin ); + VectorMA( ent.origin, cg.damageX * -8, cg.refdef.viewaxis[1], ent.origin ); + VectorMA( ent.origin, cg.damageY * 8, cg.refdef.viewaxis[2], ent.origin ); + + ent.radius = cg.damageValue * 3; + ent.customShader = cgs.media.viewBloodShader; + ent.shaderRGBA[0] = 255; + ent.shaderRGBA[1] = 255; + ent.shaderRGBA[2] = 255; + ent.shaderRGBA[3] = 200 * ( 1.0 - ((float)t / maxTime) ); + trap_R_AddRefEntityToScene( &ent ); +} + + +/* +=============== +CG_CalcViewValues + +Sets cg.refdef view values +=============== +*/ +static int CG_CalcViewValues( void ) { + playerState_t *ps; + + memset( &cg.refdef, 0, sizeof( cg.refdef ) ); + + // strings for in game rendering + // Q_strncpyz( cg.refdef.text[0], "Park Ranger", sizeof(cg.refdef.text[0]) ); + // Q_strncpyz( cg.refdef.text[1], "19", sizeof(cg.refdef.text[1]) ); + + // calculate size of 3D view + CG_CalcVrect(); + + ps = &cg.predictedPlayerState; +/* + if (cg.cameraMode) { + vec3_t origin, angles; + if (trap_getCameraInfo(cg.time, &origin, &angles)) { + VectorCopy(origin, cg.refdef.vieworg); + angles[ROLL] = 0; + VectorCopy(angles, cg.refdefViewAngles); + AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); + return CG_CalcFov(); + } else { + cg.cameraMode = qfalse; + } + } +*/ + // intermission view + if ( ps->pm_type == PM_INTERMISSION ) { + VectorCopy( ps->origin, cg.refdef.vieworg ); + VectorCopy( ps->viewangles, cg.refdefViewAngles ); + AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); + return CG_CalcFov(); + } + + cg.bobcycle = ( ps->bobCycle & 128 ) >> 7; + cg.bobfracsin = fabs( sin( ( ps->bobCycle & 127 ) / 127.0 * M_PI ) ); + cg.xyspeed = sqrt( ps->velocity[0] * ps->velocity[0] + + ps->velocity[1] * ps->velocity[1] ); + + + VectorCopy( ps->origin, cg.refdef.vieworg ); + VectorCopy( ps->viewangles, cg.refdefViewAngles ); + + if (cg_cameraOrbit.integer) { + if (cg.time > cg.nextOrbitTime) { + cg.nextOrbitTime = cg.time + cg_cameraOrbitDelay.integer; + cg_thirdPersonAngle.value += cg_cameraOrbit.value; + } + } + // add error decay + if ( cg_errorDecay.value > 0 ) { + int t; + float f; + + t = cg.time - cg.predictedErrorTime; + f = ( cg_errorDecay.value - t ) / cg_errorDecay.value; + if ( f > 0 && f < 1 ) { + VectorMA( cg.refdef.vieworg, f, cg.predictedError, cg.refdef.vieworg ); + } else { + cg.predictedErrorTime = 0; + } + } + + if ( cg.renderingThirdPerson ) { + // back away from character + CG_OffsetThirdPersonView(); + } else { + // offset for local bobbing and kicks + CG_OffsetFirstPersonView(); + } + + // position eye reletive to origin + AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); + + if ( cg.hyperspace ) { + cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE; + } + + // field of view + return CG_CalcFov(); +} + + +/* +===================== +CG_PowerupTimerSounds +===================== +*/ +static void CG_PowerupTimerSounds( void ) { + int i; + int t; + + // powerup timers going away + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { + //PKMOD - Ergodic 06/03/01 - add bean powerup timer for armor countdown immunity, + // ignore the beans powerup + if ( i == PW_BEANS ) + continue; + + t = cg.snap->ps.powerups[i]; + if ( t <= cg.time ) { + continue; + } + if ( t - cg.time >= POWERUP_BLINKS * POWERUP_BLINK_TIME ) { + continue; + } + if ( ( t - cg.time ) / POWERUP_BLINK_TIME != ( t - cg.oldTime ) / POWERUP_BLINK_TIME ) { + trap_S_StartSound( NULL, cg.snap->ps.clientNum, CHAN_ITEM, cgs.media.wearOffSound ); + } + } +} + +/* +===================== +CG_AddBufferedSound +===================== +*/ +void CG_AddBufferedSound( sfxHandle_t sfx ) { + if ( !sfx ) + return; + cg.soundBuffer[cg.soundBufferIn] = sfx; + cg.soundBufferIn = (cg.soundBufferIn + 1) % MAX_SOUNDBUFFER; + if (cg.soundBufferIn == cg.soundBufferOut) { + cg.soundBufferOut++; + } +} + +/* +===================== +CG_PlayBufferedSounds +===================== +*/ +static void CG_PlayBufferedSounds( void ) { + if ( cg.soundTime < cg.time ) { + if (cg.soundBufferOut != cg.soundBufferIn && cg.soundBuffer[cg.soundBufferOut]) { + trap_S_StartLocalSound(cg.soundBuffer[cg.soundBufferOut], CHAN_ANNOUNCER); + cg.soundBuffer[cg.soundBufferOut] = 0; + cg.soundBufferOut = (cg.soundBufferOut + 1) % MAX_SOUNDBUFFER; + cg.soundTime = cg.time + 750; + } + } +} + +//========================================================================= + +/* +================= +CG_DrawActiveFrame + +Generates and draws a game scene and status information at the given time. +================= +*/ +void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ) { + int inwater; + + cg.time = serverTime; + cg.demoPlayback = demoPlayback; + + // update cvars + CG_UpdateCvars(); + + // if we are only updating the screen as a loading + // pacifier, don't even try to read snapshots + if ( cg.infoScreenText[0] != 0 ) { + CG_DrawInformation(); + return; + } + + // any looped sounds will be respecified as entities + // are added to the render list + trap_S_ClearLoopingSounds(qfalse); + + // clear all the render lists + trap_R_ClearScene(); + + // set up cg.snap and possibly cg.nextSnap + CG_ProcessSnapshots(); + + // if we haven't received any snapshots yet, all + // we can draw is the information screen + if ( !cg.snap || ( cg.snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) { + CG_DrawInformation(); + return; + } + + // let the client system know what our weapon and zoom settings are + trap_SetUserCmdValue( cg.weaponSelect, cg.zoomSensitivity ); + + // this counter will be bumped for every valid scene we generate + cg.clientFrame++; + + // update cg.predictedPlayerState + CG_PredictPlayerState(); + + // decide on third person view + cg.renderingThirdPerson = cg_thirdPerson.integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0); + + // build cg.refdef + inwater = CG_CalcViewValues(); + + // first person blend blobs, done after AnglesToAxis + if ( !cg.renderingThirdPerson ) { + CG_DamageBlendBlob(); + } + + // build the render lists + if ( !cg.hyperspace ) { + CG_AddPacketEntities(); // adter calcViewValues, so predicted player state is correct + CG_AddMarks(); + CG_AddParticles (); + CG_AddLocalEntities(); + } + CG_AddViewWeapon( &cg.predictedPlayerState ); + + // add buffered sounds + CG_PlayBufferedSounds(); + + // play buffered voice chats + CG_PlayBufferedVoiceChats(); + + // finish up the rest of the refdef + if ( cg.testModelEntity.hModel ) { + CG_AddTestModel(); + } + cg.refdef.time = cg.time; + memcpy( cg.refdef.areamask, cg.snap->areamask, sizeof( cg.refdef.areamask ) ); + + // warning sounds when powerup is wearing off + CG_PowerupTimerSounds(); + + // update audio positions + trap_S_Respatialize( cg.snap->ps.clientNum, cg.refdef.vieworg, cg.refdef.viewaxis, inwater ); + + // make sure the lagometerSample and frame timing isn't done twice when in stereo + if ( stereoView != STEREO_RIGHT ) { + cg.frametime = cg.time - cg.oldTime; + if ( cg.frametime < 0 ) { + cg.frametime = 0; + } + cg.oldTime = cg.time; + CG_AddLagometerFrameInfo(); + } + if (cg_timescale.value != cg_timescaleFadeEnd.value) { + if (cg_timescale.value < cg_timescaleFadeEnd.value) { + cg_timescale.value += cg_timescaleFadeSpeed.value * ((float)cg.frametime) / 1000; + if (cg_timescale.value > cg_timescaleFadeEnd.value) + cg_timescale.value = cg_timescaleFadeEnd.value; + } + else { + cg_timescale.value -= cg_timescaleFadeSpeed.value * ((float)cg.frametime) / 1000; + if (cg_timescale.value < cg_timescaleFadeEnd.value) + cg_timescale.value = cg_timescaleFadeEnd.value; + } + if (cg_timescaleFadeSpeed.value) { + trap_Cvar_Set("timescale", va("%f", cg_timescale.value)); + } + } + + // actually issue the rendering calls + CG_DrawActive( stereoView ); + + if ( cg_stats.integer ) { + CG_Printf( "cg.clientFrame:%i\n", cg.clientFrame ); + } + + +} + diff --git a/quake3/source/code/cgame/cg_weapons.c b/quake3/source/code/cgame/cg_weapons.c new file mode 100644 index 0000000..50d461b --- /dev/null +++ b/quake3/source/code/cgame/cg_weapons.c @@ -0,0 +1,3472 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// cg_weapons.c -- events and effects dealing with weapons +#include "cg_local.h" + +/* +========================== +CG_MachineGunEjectBrass +========================== +*/ +static void CG_MachineGunEjectBrass( centity_t *cent ) { + localEntity_t *le; + refEntity_t *re; + vec3_t velocity, xvelocity; + vec3_t offset, xoffset; + float waterScale = 1.0f; + vec3_t v[3]; + + if ( cg_brassTime.integer <= 0 ) { + return; + } + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + velocity[0] = 0; + velocity[1] = -50 + 40 * crandom(); + velocity[2] = 100 + 50 * crandom(); + + le->leType = LE_FRAGMENT; + le->startTime = cg.time; + le->endTime = le->startTime + cg_brassTime.integer + ( cg_brassTime.integer / 4 ) * random(); + + le->pos.trType = TR_GRAVITY; + le->pos.trTime = cg.time - (rand()&15); + + AnglesToAxis( cent->lerpAngles, v ); + + offset[0] = 8; + offset[1] = -4; + offset[2] = 24; + + xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; + xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; + xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; + VectorAdd( cent->lerpOrigin, xoffset, re->origin ); + + VectorCopy( re->origin, le->pos.trBase ); + + if ( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) { + waterScale = 0.10f; + } + + xvelocity[0] = velocity[0] * v[0][0] + velocity[1] * v[1][0] + velocity[2] * v[2][0]; + xvelocity[1] = velocity[0] * v[0][1] + velocity[1] * v[1][1] + velocity[2] * v[2][1]; + xvelocity[2] = velocity[0] * v[0][2] + velocity[1] * v[1][2] + velocity[2] * v[2][2]; + VectorScale( xvelocity, waterScale, le->pos.trDelta ); + + AxisCopy( axisDefault, re->axis ); + re->hModel = cgs.media.machinegunBrassModel; + + le->bounceFactor = 0.4 * waterScale; + + le->angles.trType = TR_LINEAR; + le->angles.trTime = cg.time; + le->angles.trBase[0] = rand()&31; + le->angles.trBase[1] = rand()&31; + le->angles.trBase[2] = rand()&31; + le->angles.trDelta[0] = 2; + le->angles.trDelta[1] = 1; + le->angles.trDelta[2] = 0; + + le->leFlags = LEF_TUMBLE; + le->leBounceSoundType = LEBS_BRASS; + le->leMarkType = LEMT_NONE; +} + +/* +========================== +CG_ShotgunEjectBrass +========================== +*/ +static void CG_ShotgunEjectBrass( centity_t *cent ) { + localEntity_t *le; + refEntity_t *re; + vec3_t velocity, xvelocity; + vec3_t offset, xoffset; + vec3_t v[3]; + int i; + + if ( cg_brassTime.integer <= 0 ) { + return; + } + + for ( i = 0; i < 2; i++ ) { + float waterScale = 1.0f; + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + velocity[0] = 60 + 60 * crandom(); + if ( i == 0 ) { + velocity[1] = 40 + 10 * crandom(); + } else { + velocity[1] = -40 + 10 * crandom(); + } + velocity[2] = 100 + 50 * crandom(); + + le->leType = LE_FRAGMENT; + le->startTime = cg.time; + le->endTime = le->startTime + cg_brassTime.integer*3 + cg_brassTime.integer * random(); + + le->pos.trType = TR_GRAVITY; + le->pos.trTime = cg.time; + + AnglesToAxis( cent->lerpAngles, v ); + + offset[0] = 8; + offset[1] = 0; + offset[2] = 24; + + xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; + xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; + xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; + VectorAdd( cent->lerpOrigin, xoffset, re->origin ); + VectorCopy( re->origin, le->pos.trBase ); + if ( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) { + waterScale = 0.10f; + } + + xvelocity[0] = velocity[0] * v[0][0] + velocity[1] * v[1][0] + velocity[2] * v[2][0]; + xvelocity[1] = velocity[0] * v[0][1] + velocity[1] * v[1][1] + velocity[2] * v[2][1]; + xvelocity[2] = velocity[0] * v[0][2] + velocity[1] * v[1][2] + velocity[2] * v[2][2]; + VectorScale( xvelocity, waterScale, le->pos.trDelta ); + + AxisCopy( axisDefault, re->axis ); + re->hModel = cgs.media.shotgunBrassModel; + le->bounceFactor = 0.3f; + + le->angles.trType = TR_LINEAR; + le->angles.trTime = cg.time; + le->angles.trBase[0] = rand()&31; + le->angles.trBase[1] = rand()&31; + le->angles.trBase[2] = rand()&31; + le->angles.trDelta[0] = 1; + le->angles.trDelta[1] = 0.5; + le->angles.trDelta[2] = 0; + + le->leFlags = LEF_TUMBLE; + le->leBounceSoundType = LEBS_BRASS; + le->leMarkType = LEMT_NONE; + } +} + + +#ifdef MISSIONPACK +/* +========================== +CG_NailgunEjectBrass +========================== +*/ +static void CG_NailgunEjectBrass( centity_t *cent ) { + localEntity_t *smoke; + vec3_t origin; + vec3_t v[3]; + vec3_t offset; + vec3_t xoffset; + vec3_t up; + + AnglesToAxis( cent->lerpAngles, v ); + + offset[0] = 0; + offset[1] = -12; + offset[2] = 24; + + xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; + xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; + xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; + VectorAdd( cent->lerpOrigin, xoffset, origin ); + + VectorSet( up, 0, 0, 64 ); + + smoke = CG_SmokePuff( origin, up, 32, 1, 1, 1, 0.33f, 700, cg.time, 0, 0, cgs.media.smokePuffShader ); + // use the optimized local entity add + smoke->leType = LE_SCALE_FADE; +} +#endif + + +/* +========================== +CG_RailTrail +========================== +*/ +void CG_RailTrail (clientInfo_t *ci, vec3_t start, vec3_t end) { + vec3_t axis[36], move, move2, next_move, vec, temp; + float len; + int i, j, skip; + + localEntity_t *le; + refEntity_t *re; + +#define RADIUS 4 +#define ROTATION 1 +#define SPACING 5 + + start[2] -= 4; + VectorCopy (start, move); + VectorSubtract (end, start, vec); + len = VectorNormalize (vec); + PerpendicularVector(temp, vec); + for (i = 0 ; i < 36; i++) { + RotatePointAroundVector(axis[i], vec, temp, i * 10);//banshee 2.4 was 10 + } + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + le->leType = LE_FADE_RGB; + le->startTime = cg.time; + le->endTime = cg.time + cg_railTrailTime.value; + le->lifeRate = 1.0 / (le->endTime - le->startTime); + + re->shaderTime = cg.time / 1000.0f; + re->reType = RT_RAIL_CORE; + re->customShader = cgs.media.railCoreShader; + + VectorCopy(start, re->origin); + VectorCopy(end, re->oldorigin); + + re->shaderRGBA[0] = ci->color1[0] * 255; + re->shaderRGBA[1] = ci->color1[1] * 255; + re->shaderRGBA[2] = ci->color1[2] * 255; + re->shaderRGBA[3] = 255; + + le->color[0] = ci->color1[0] * 0.75; + le->color[1] = ci->color1[1] * 0.75; + le->color[2] = ci->color1[2] * 0.75; + le->color[3] = 1.0f; + + AxisClear( re->axis ); + + VectorMA(move, 20, vec, move); + VectorCopy(move, next_move); + VectorScale (vec, SPACING, vec); + + if (cg_oldRail.integer != 0) { + // nudge down a bit so it isn't exactly in center + re->origin[2] -= 8; + re->oldorigin[2] -= 8; + return; + } + skip = -1; + + j = 18; + for (i = 0; i < len; i += SPACING) { + if (i != skip) { + skip = i + SPACING; + le = CG_AllocLocalEntity(); + re = &le->refEntity; + le->leFlags = LEF_PUFF_DONT_SCALE; + le->leType = LE_MOVE_SCALE_FADE; + le->startTime = cg.time; + le->endTime = cg.time + (i>>1) + 600; + le->lifeRate = 1.0 / (le->endTime - le->startTime); + + re->shaderTime = cg.time / 1000.0f; + re->reType = RT_SPRITE; + re->radius = 1.1f; + re->customShader = cgs.media.railRingsShader; + + re->shaderRGBA[0] = ci->color2[0] * 255; + re->shaderRGBA[1] = ci->color2[1] * 255; + re->shaderRGBA[2] = ci->color2[2] * 255; + re->shaderRGBA[3] = 255; + + le->color[0] = ci->color2[0] * 0.75; + le->color[1] = ci->color2[1] * 0.75; + le->color[2] = ci->color2[2] * 0.75; + le->color[3] = 1.0f; + + le->pos.trType = TR_LINEAR; + le->pos.trTime = cg.time; + + VectorCopy( move, move2); + VectorMA(move2, RADIUS , axis[j], move2); + VectorCopy(move2, le->pos.trBase); + + le->pos.trDelta[0] = axis[j][0]*6; + le->pos.trDelta[1] = axis[j][1]*6; + le->pos.trDelta[2] = axis[j][2]*6; + } + + VectorAdd (move, vec, move); + + j = j + ROTATION < 36 ? j + ROTATION : (j + ROTATION) % 36; + } +} + +/* +========================== +CG_RocketTrail +========================== +*/ +static void CG_RocketTrail( centity_t *ent, const weaponInfo_t *wi ) { + int step; + vec3_t origin, lastPos; + int t; + int startTime, contents; + int lastContents; + entityState_t *es; + vec3_t up; + localEntity_t *smoke; + + if ( cg_noProjectileTrail.integer ) { + return; + } + + up[0] = 0; + up[1] = 0; + up[2] = 0; + + step = 50; + + es = &ent->currentState; + startTime = ent->trailTime; + t = step * ( (startTime + step) / step ); + + BG_EvaluateTrajectory( &es->pos, cg.time, origin ); + contents = CG_PointContents( origin, -1 ); + + // if object (e.g. grenade) is stationary, don't toss up smoke + if ( es->pos.trType == TR_STATIONARY ) { + ent->trailTime = cg.time; + return; + } + + BG_EvaluateTrajectory( &es->pos, ent->trailTime, lastPos ); + lastContents = CG_PointContents( lastPos, -1 ); + + ent->trailTime = cg.time; + + if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + if ( contents & lastContents & CONTENTS_WATER ) { + CG_BubbleTrail( lastPos, origin, 8 ); + } + return; + } + + for ( ; t <= ent->trailTime ; t += step ) { + BG_EvaluateTrajectory( &es->pos, t, lastPos ); + + smoke = CG_SmokePuff( lastPos, up, + wi->trailRadius, + 1, 1, 1, 0.33f, + wi->wiTrailTime, + t, + 0, + 0, + cgs.media.smokePuffShader ); + // use the optimized local entity add + smoke->leType = LE_SCALE_FADE; + } + +} + +#ifdef MISSIONPACK +/* +========================== +CG_NailTrail +========================== +*/ +static void CG_NailTrail( centity_t *ent, const weaponInfo_t *wi ) { + int step; + vec3_t origin, lastPos; + int t; + int startTime, contents; + int lastContents; + entityState_t *es; + vec3_t up; + localEntity_t *smoke; + + if ( cg_noProjectileTrail.integer ) { + return; + } + + up[0] = 0; + up[1] = 0; + up[2] = 0; + + step = 50; + + es = &ent->currentState; + startTime = ent->trailTime; + t = step * ( (startTime + step) / step ); + + BG_EvaluateTrajectory( &es->pos, cg.time, origin ); + contents = CG_PointContents( origin, -1 ); + + // if object (e.g. grenade) is stationary, don't toss up smoke + if ( es->pos.trType == TR_STATIONARY ) { + ent->trailTime = cg.time; + return; + } + + BG_EvaluateTrajectory( &es->pos, ent->trailTime, lastPos ); + lastContents = CG_PointContents( lastPos, -1 ); + + ent->trailTime = cg.time; + + if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + if ( contents & lastContents & CONTENTS_WATER ) { + CG_BubbleTrail( lastPos, origin, 8 ); + } + return; + } + + for ( ; t <= ent->trailTime ; t += step ) { + BG_EvaluateTrajectory( &es->pos, t, lastPos ); + + smoke = CG_SmokePuff( lastPos, up, + wi->trailRadius, + 1, 1, 1, 0.33f, + wi->wiTrailTime, + t, + 0, + 0, + cgs.media.nailPuffShader ); + // use the optimized local entity add + smoke->leType = LE_SCALE_FADE; + } + +} +#endif + +/* +========================== +CG_NailTrail +========================== +*/ +static void CG_PlasmaTrail( centity_t *cent, const weaponInfo_t *wi ) { + localEntity_t *le; + refEntity_t *re; + entityState_t *es; + vec3_t velocity, xvelocity, origin; + vec3_t offset, xoffset; + vec3_t v[3]; + int t, startTime, step; + + float waterScale = 1.0f; + + if ( cg_noProjectileTrail.integer || cg_oldPlasma.integer ) { + return; + } + + step = 50; + + es = ¢->currentState; + startTime = cent->trailTime; + t = step * ( (startTime + step) / step ); + + BG_EvaluateTrajectory( &es->pos, cg.time, origin ); + + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + velocity[0] = 60 - 120 * crandom(); + velocity[1] = 40 - 80 * crandom(); + velocity[2] = 100 - 200 * crandom(); + + le->leType = LE_MOVE_SCALE_FADE; + le->leFlags = LEF_TUMBLE; + le->leBounceSoundType = LEBS_NONE; + le->leMarkType = LEMT_NONE; + + le->startTime = cg.time; + le->endTime = le->startTime + 600; + + le->pos.trType = TR_GRAVITY; + le->pos.trTime = cg.time; + + AnglesToAxis( cent->lerpAngles, v ); + + offset[0] = 2; + offset[1] = 2; + offset[2] = 2; + + xoffset[0] = offset[0] * v[0][0] + offset[1] * v[1][0] + offset[2] * v[2][0]; + xoffset[1] = offset[0] * v[0][1] + offset[1] * v[1][1] + offset[2] * v[2][1]; + xoffset[2] = offset[0] * v[0][2] + offset[1] * v[1][2] + offset[2] * v[2][2]; + + VectorAdd( origin, xoffset, re->origin ); + VectorCopy( re->origin, le->pos.trBase ); + + if ( CG_PointContents( re->origin, -1 ) & CONTENTS_WATER ) { + waterScale = 0.10f; + } + + xvelocity[0] = velocity[0] * v[0][0] + velocity[1] * v[1][0] + velocity[2] * v[2][0]; + xvelocity[1] = velocity[0] * v[0][1] + velocity[1] * v[1][1] + velocity[2] * v[2][1]; + xvelocity[2] = velocity[0] * v[0][2] + velocity[1] * v[1][2] + velocity[2] * v[2][2]; + VectorScale( xvelocity, waterScale, le->pos.trDelta ); + + AxisCopy( axisDefault, re->axis ); + re->shaderTime = cg.time / 1000.0f; + re->reType = RT_SPRITE; + re->radius = 0.25f; + re->customShader = cgs.media.railRingsShader; + le->bounceFactor = 0.3f; + + re->shaderRGBA[0] = wi->flashDlightColor[0] * 63; + re->shaderRGBA[1] = wi->flashDlightColor[1] * 63; + re->shaderRGBA[2] = wi->flashDlightColor[2] * 63; + re->shaderRGBA[3] = 63; + + le->color[0] = wi->flashDlightColor[0] * 0.2; + le->color[1] = wi->flashDlightColor[1] * 0.2; + le->color[2] = wi->flashDlightColor[2] * 0.2; + le->color[3] = 0.25f; + + le->angles.trType = TR_LINEAR; + le->angles.trTime = cg.time; + le->angles.trBase[0] = rand()&31; + le->angles.trBase[1] = rand()&31; + le->angles.trBase[2] = rand()&31; + le->angles.trDelta[0] = 1; + le->angles.trDelta[1] = 0.5; + le->angles.trDelta[2] = 0; + +} + +//PKMOD - Ergodic 03/10/01 - debug dragon return (trail appears behind player) +/* +============= +VectorToString PKMOD REMOVE THIS LATER + +This is just a convenience function +for printing vectors +============= +*/ +char *vtos( const vec3_t v ) { + static int index; + static char str[8][32]; + char *s; + + // use an array so that multiple vtos won't collide + s = str[index]; + index = (index + 1)&7; + + Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]); + + return s; +} + +/* +========================== +CG_GrappleTrail +========================== +*/ +void CG_GrappleTrail( centity_t *ent, const weaponInfo_t *wi ) { + vec3_t origin; + entityState_t *es; + vec3_t forward, up; + refEntity_t beam; + + //PKMOD - Ergodic 03/10/01 - debug dragon return (trail appears behind player) (inactive) +// int dragon_distance; + + es = &ent->currentState; + + //PKMOD - Ergodic 03/10/01 - set tongue's location in the old origin for cgame hack +// BG_EvaluateTrajectory( &es->pos, cg.time, origin ); + ent->trailTime = cg.time; + + memset( &beam, 0, sizeof( beam ) ); + //FIXME adjust for muzzle position + VectorCopy ( cg_entities[ ent->currentState.otherEntityNum ].lerpOrigin, beam.origin ); + beam.origin[2] += 26; + AngleVectors( cg_entities[ ent->currentState.otherEntityNum ].lerpAngles, forward, NULL, up ); + VectorMA( beam.origin, -6, up, beam.origin ); + //PKMOD - Ergodic 03/10/01 - set tongue's location in the old origin for cgame hack +// VectorCopy( origin, beam.oldorigin ); + + //PKMOD - Ergodic 03/11/01 - if dragon return origin is set then use it, else use launch value + // This will imply that dragon will not work correctly at coordinates (0,0,0) + // fix in the patch + if ( VectorLength( es->origin2 ) > 1 ) { + VectorCopy( es->origin2, beam.oldorigin ); + } + else { + BG_EvaluateTrajectory( &es->pos, cg.time, origin ); + VectorCopy( origin, beam.oldorigin ); + } + + //PKMOD - Ergodic 03/10/01 - debug dragon return (trail appears behind player) (inactive) +// dragon_distance = Distance( beam.origin, beam.oldorigin ); +// Com_Printf( "CG_GrappleTrail - origin>%s<, old>%s<, dist>%d<\n", vtos(beam.origin), vtos(beam.oldorigin), dragon_distance ); + + + if (Distance( beam.origin, beam.oldorigin ) < 64 ) + return; // Don't draw if close + + //PKMOD - Ergodic 10/03/00 change flash to railgun style to make a tighter beam + beam.reType = RT_RAIL_CORE; +// beam.reType = RT_LIGHTNING; + //PKMOD - Ergodic 10/03/00 dragon beam shader effect + beam.customShader = cgs.media.dragonboltShader; +// beam.customShader = cgs.media.lightningShader; + + AxisClear( beam.axis ); + beam.shaderRGBA[0] = 0xff; + beam.shaderRGBA[1] = 0xff; + beam.shaderRGBA[2] = 0xff; + beam.shaderRGBA[3] = 0xff; + trap_R_AddRefEntityToScene( &beam ); +} + +/* +========================== +CG_GrenadeTrail +========================== +*/ +static void CG_GrenadeTrail( centity_t *ent, const weaponInfo_t *wi ) { + CG_RocketTrail( ent, wi ); +} + +/* +========================== +//PKMOD - Ergodic 01/11/01 - add a nail trail that is "slimmed" down +CG_PKANailTrail +========================== +*/ +static void PKANailTrail( centity_t *ent, const weaponInfo_t *wi ) { + int step; + vec3_t origin, lastPos; + int t; + int startTime, contents; + int lastContents; + entityState_t *es; + vec3_t up; + localEntity_t *smoke; + + up[0] = 0; + up[1] = 0; + up[2] = 0; + + step = 200; //was 50 + + es = &ent->currentState; + startTime = ent->trailTime; + t = step * ( (startTime + step) / step ); + + BG_EvaluateTrajectory( &es->pos, cg.time, origin ); + contents = CG_PointContents( origin, -1 ); + + BG_EvaluateTrajectory( &es->pos, ent->trailTime, lastPos ); + lastContents = CG_PointContents( lastPos, -1 ); + + ent->trailTime = cg.time; + + if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + if ( contents & lastContents & CONTENTS_WATER ) { + CG_BubbleTrail( lastPos, origin, 48 ); //was 8 + } + return; + } + + for ( ; t <= ent->trailTime ; t += step ) { + BG_EvaluateTrajectory( &es->pos, t, lastPos ); + + smoke = CG_SmokePuff( lastPos, up, + wi->trailRadius, + 1, 1, 1, 0.33f, + wi->wiTrailTime, + t, + 0, + 0, + cgs.media.smokePuffShader ); + // use the optimized local entity add + smoke->leType = LE_SCALE_FADE; + } + +} + +/* +================= +CG_RegisterWeapon + +The server says this item is used on this level +================= +*/ +void CG_RegisterWeapon( int weaponNum ) { + weaponInfo_t *weaponInfo; + gitem_t *item, *ammo; + char path[MAX_QPATH]; + vec3_t mins, maxs; + int i; + + weaponInfo = &cg_weapons[weaponNum]; + + if ( weaponNum == 0 ) { + return; + } + + if ( weaponInfo->registered ) { + return; + } + + memset( weaponInfo, 0, sizeof( *weaponInfo ) ); + weaponInfo->registered = qtrue; + + for ( item = bg_itemlist + 1 ; item->classname ; item++ ) { + if ( item->giType == IT_WEAPON && item->giTag == weaponNum ) { + weaponInfo->item = item; + break; + } + } + if ( !item->classname ) { + CG_Error( "Couldn't find weapon %i", weaponNum ); + } + CG_RegisterItemVisuals( item - bg_itemlist ); + + // load cmodel before model so filecache works + weaponInfo->weaponModel = trap_R_RegisterModel( item->world_model[0] ); + + // calc midpoint for rotation + trap_R_ModelBounds( weaponInfo->weaponModel, mins, maxs ); + for ( i = 0 ; i < 3 ; i++ ) { + weaponInfo->weaponMidpoint[i] = mins[i] + 0.5 * ( maxs[i] - mins[i] ); + } + + weaponInfo->weaponIcon = trap_R_RegisterShader( item->icon ); + weaponInfo->ammoIcon = trap_R_RegisterShader( item->icon ); + + for ( ammo = bg_itemlist + 1 ; ammo->classname ; ammo++ ) { + if ( ammo->giType == IT_AMMO && ammo->giTag == weaponNum ) { + break; + } + } + if ( ammo->classname && ammo->world_model[0] ) { + weaponInfo->ammoModel = trap_R_RegisterModel( ammo->world_model[0] ); + } + + strcpy( path, item->world_model[0] ); + COM_StripExtension( path, path ); + strcat( path, "_flash.md3" ); + weaponInfo->flashModel = trap_R_RegisterModel( path ); + + //PKMOD - Ergodic 03/04/01 - add lightning gun to barrel list + //PKMOD - Ergodic 03/27/01 - remove lightning gun to barrel list + //PKMOD - Ergodic 05/15/03 - re-add lightning gun to barrel list for Uber's clg model +// if ( weaponNum == WP_MACHINEGUN || weaponNum == WP_GAUNTLET || weaponNum == WP_BFG ) { + if ( weaponNum == WP_MACHINEGUN || weaponNum == WP_GAUNTLET || weaponNum == WP_LIGHTNING ) { + strcpy( path, item->world_model[0] ); + COM_StripExtension( path, path ); + strcat( path, "_barrel.md3" ); + weaponInfo->barrelModel = trap_R_RegisterModel( path ); + } + + strcpy( path, item->world_model[0] ); + COM_StripExtension( path, path ); + strcat( path, "_hand.md3" ); + weaponInfo->handsModel = trap_R_RegisterModel( path ); + + if ( !weaponInfo->handsModel ) { + weaponInfo->handsModel = trap_R_RegisterModel( "models/weapons2/shotgun/shotgun_hand.md3" ); + } + + weaponInfo->loopFireSound = qfalse; + + switch ( weaponNum ) { + case WP_GAUNTLET: + MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); + weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/melee/fstrun.wav", qfalse ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); + break; + + case WP_LIGHTNING: + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); + //PKMOD - Ergodic 09/06/00 add new staionary sound from Mongusta + //12/16/00 - add non compressed flag + weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons2/chainlightning/Chainlight Stat#6a.wav", qfalse ); + + //12/16/00 - add non compressed flag + weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/lightning/lg_hum.wav", qfalse ); + + //PKMOD - Ergodic 08/22/00 add multiple fire sounds from Mongusta + //12/16/00 - add non compressed flag + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons2/chainlightning/Chainlight Fire#2.wav", qfalse ); + weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons2/chainlightning/Chainlight Fire#3.wav", qfalse ); + weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons2/chainlightning/Chainlight Fire#5.wav", qfalse ); + + //PKMOD - Ergodic 08/21/00 set the shader to chainlightning + cgs.media.chainlightningShader = trap_R_RegisterShader( "chainlightningBolt" ); + //PKMOD - Ergodic 08/21/00 set the map hit model to correct color + cgs.media.lightningExplosionModel = trap_R_RegisterModel( "models/weaphits/clghit1.md3" ); + //12/16/00 - add non compressed flag + cgs.media.sfx_lghit1 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit.wav", qfalse ); + cgs.media.sfx_lghit2 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit2.wav", qfalse ); + cgs.media.sfx_lghit3 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit3.wav", qfalse ); + + break; + + //PKMOD - Ergodic 10/03/00 hand models + //PKMOD - Ergodic 10/03/00 set the shader to the dragon + case WP_GRAPPLING_HOOK: + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); + weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/dragon/tongue.md3" ); + weaponInfo->weaponModel = trap_R_RegisterModel( "models/weapons2/dragon/dragonhold.md3" ); + weaponInfo->handsModel = trap_R_RegisterModel( "models/weapons2/dragon/dragonhold_hand.md3" ); + + //PKMOD - Ergodic 02/14/02 - use the plasmagun flyby sound for the moving tongue + weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/plasma/lasfly.wav", qfalse ); + + //PKMOD - Ergodic 02/14/02 - hack - store the gauntlet blade in the flashsound[3] + // Note: this sound will not be hard as a flashsound but will be called in + // cg_ents.c(CG_Dragon_Deploy) when gauntletblade is being deployed. + weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons2/gauntlet/Bladewhirl.wav", qfalse ); + + //PKMOD - Ergodic 10/03/00 set the beam shader to the dragon + cgs.media.dragonboltShader = trap_R_RegisterShader( "DragonBolt" ); + weaponInfo->missileTrailFunc = CG_GrappleTrail; + weaponInfo->missileDlight = 200; + weaponInfo->wiTrailTime = 2000; + weaponInfo->trailRadius = 64; + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->missileDlightColor, 1.0f, 1.0f, 0.5f ); + MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 0.5f ); + //12/16/00 - add non compressed flag + weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/melee/fsthum.wav", qfalse ); + //PKMOD - Ergodic 10/03/00 set the dragon fire sound + weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons2/dragon/gpulling.wav", qfalse ); + break; + +#ifdef MISSIONPACK + case WP_CHAINGUN: + weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/vulcan/wvulfire.wav", qfalse ); + weaponInfo->loopFireSound = qtrue; + MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/vulcan/vulcanf1b.wav", qfalse ); + weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/vulcan/vulcanf2b.wav", qfalse ); + weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons/vulcan/vulcanf3b.wav", qfalse ); + weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons/vulcan/vulcanf4b.wav", qfalse ); + weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; + cgs.media.bulletExplosionShader = trap_R_RegisterShader( "bulletExplosion" ); + break; +#endif + + case WP_MACHINEGUN: + MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf1b.wav", qfalse ); + weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf2b.wav", qfalse ); + weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf3b.wav", qfalse ); + weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons/machinegun/machgf4b.wav", qfalse ); + weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; + cgs.media.bulletExplosionShader = trap_R_RegisterShader( "bulletExplosion" ); + break; + + case WP_SHOTGUN: + MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/shotgun/sshotf1b.wav", qfalse ); + weaponInfo->ejectBrassFunc = CG_ShotgunEjectBrass; + break; + + case WP_ROCKET_LAUNCHER: + weaponInfo->missileModel = trap_R_RegisterModel( "models/ammo/rocket/rocket.md3" ); + weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/rocket/rockfly.wav", qfalse ); + weaponInfo->missileTrailFunc = CG_RocketTrail; + weaponInfo->missileDlight = 200; + weaponInfo->wiTrailTime = 2000; + weaponInfo->trailRadius = 64; + + MAKERGB( weaponInfo->missileDlightColor, 1, 0.75f, 0 ); + MAKERGB( weaponInfo->flashDlightColor, 1, 0.75f, 0 ); + + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); + cgs.media.rocketExplosionShader = trap_R_RegisterShader( "rocketExplosion" ); + break; + +#ifdef MISSIONPACK + case WP_PROX_LAUNCHER: + weaponInfo->missileModel = trap_R_RegisterModel( "models/weaphits/proxmine.md3" ); + weaponInfo->missileTrailFunc = CG_GrenadeTrail; + weaponInfo->wiTrailTime = 700; + weaponInfo->trailRadius = 32; + MAKERGB( weaponInfo->flashDlightColor, 1, 0.70f, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/proxmine/wstbfire.wav", qfalse ); + cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); + break; +#endif + + case WP_GRENADE_LAUNCHER: + weaponInfo->missileModel = trap_R_RegisterModel( "models/ammo/grenade1.md3" ); + weaponInfo->missileTrailFunc = CG_GrenadeTrail; + weaponInfo->wiTrailTime = 700; + weaponInfo->trailRadius = 32; + MAKERGB( weaponInfo->flashDlightColor, 1, 0.70f, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/grenade/grenlf1a.wav", qfalse ); + cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); + break; + +#ifdef MISSIONPACK + case WP_NAILGUN: + weaponInfo->ejectBrassFunc = CG_NailgunEjectBrass; + weaponInfo->missileTrailFunc = CG_NailTrail; +// weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/nailgun/wnalflit.wav", qfalse ); + weaponInfo->trailRadius = 16; + weaponInfo->wiTrailTime = 250; + weaponInfo->missileModel = trap_R_RegisterModel( "models/weaphits/nail.md3" ); + MAKERGB( weaponInfo->flashDlightColor, 1, 0.75f, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/nailgun/wnalfire.wav", qfalse ); + break; +#endif + + case WP_PLASMAGUN: +// weaponInfo->missileModel = cgs.media.invulnerabilityPowerupModel; + weaponInfo->missileTrailFunc = CG_PlasmaTrail; + weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/plasma/lasfly.wav", qfalse ); + MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/plasma/hyprbf1a.wav", qfalse ); + cgs.media.plasmaExplosionShader = trap_R_RegisterShader( "plasmaExplosion" ); + cgs.media.railRingsShader = trap_R_RegisterShader( "railDisc" ); + break; + + case WP_RAILGUN: + weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/railgun/rg_hum.wav", qfalse ); + MAKERGB( weaponInfo->flashDlightColor, 1, 0.5f, 0 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/railgun/railgf1a.wav", qfalse ); + cgs.media.railExplosionShader = trap_R_RegisterShader( "railExplosion" ); + cgs.media.railRingsShader = trap_R_RegisterShader( "railDisc" ); + cgs.media.railCoreShader = trap_R_RegisterShader( "railCore" ); + break; + + case WP_BFG: + weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/bfg/bfg_hum.wav", qfalse ); + MAKERGB( weaponInfo->flashDlightColor, 1, 0.7f, 1 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/bfg/bfg_fire.wav", qfalse ); + cgs.media.bfgExplosionShader = trap_R_RegisterShader( "bfgExplosion" ); + weaponInfo->missileModel = trap_R_RegisterModel( "models/weaphits/bfg.md3" ); + //12/16/00 - add non compressed flag + weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/rocket/rockfly.wav", qfalse + ); + break; + + //PKMOD + /*PKMOD -Add Weapons. + WP_HARPOON, + WP_GRAVITY, + WP_SENTRY, + WP_BEARTRAP, + WP_CHAINLG, + WP_A2K, + WP_EMPNUKE, + WP_AIRFIST, + WP_NAILGUN, + PKMOD -Add Weapons. */ +//PKMOD Ergodic 05/17/00 multi-model hack + case WP_GRAVITY: + //PKMOD - Ergodic 03/17/01 new PKA gravity well weapon to the "hold" model + weaponInfo->weaponModel = trap_R_RegisterModel( "models/weapons2/gwell/gwphold.md3" ); + weaponInfo->handsModel = trap_R_RegisterModel( "models/weapons2/gwell/gwphold_hand.md3" ); + //12/16/00 - add non compressed flag + weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons2/gwell/gravity_carry.wav", qfalse ); + weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/gwell/gwp.md3" ); + weaponInfo->wiTrailTime = 700; + weaponInfo->trailRadius = 32; + //PKMOD - Ergodic 07/11/00 - launch sound done in EV_GRAVITY_RELEASED +// weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons2/gwell/gravity_released.wav" ); + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 1.0f, 0.7f, 0.5f ); +//PKMOD - Ergodic 05/17/00 - make launch sound same as player jump sound (effort to throw heavy item) +//PKMOD - Ergodic 05/17/00 - don't register sound since it will be programatically controlled +// weaponInfo->flashSound[0] = CG_CustomSound( es->number, "*jump1.wav" ); + cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); + break; +// case WP_GRAVITY_LAUNCHED: +// weaponInfo->missileModel = trap_R_RegisterModel( "models/ammo/grenade1.md3" ); +// weaponInfo->wiTrailTime = 700; +// weaponInfo->trailRadius = 32; +// MAKERGB( weaponInfo->flashDlightColor, 1, 0.7, 0.5 ); +//PKMOD - Ergodic 05/17/00 - make launch sound same as player jump sound (effort to throw heavy item) +//PKMOD - Ergodic 05/17/00 - don't register sound since it will be programatically controlled +// cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); +// weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons2/gwell/gravity_released.wav" ); +// break; + case WP_SENTRY: + weaponInfo->weaponModel = trap_R_RegisterModel( "models/weapons2/autosentry/autosentry_hold.md3" ); + weaponInfo->missileTrailFunc = CG_GrenadeTrail; + weaponInfo->wiTrailTime = 700; + weaponInfo->trailRadius = 32; + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 1.0f, 0.7f, 0.5f ); + cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); + break; + case WP_BEARTRAP: + weaponInfo->weaponModel = trap_R_RegisterModel( "models/weapons2/beartrap/bearhold.md3" ); + weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/beartrap/beartrap.md3" ); + weaponInfo->missileTrailFunc = CG_GrenadeTrail; + weaponInfo->wiTrailTime = 700; + weaponInfo->trailRadius = 32; + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 1.0f, 0.7f, 0.5f ); +//PKMOD - Ergodic 05/27/00 - don't register sound since it will be programatically controlled +// weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/grenade/grenlf1a.wav" ); + cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); + break; +// case WP_CHAINLG: +// MAKERGB( weaponInfo->flashDlightColor, 0.6, 0.6, 1 ); +// weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/melee/fsthum.wav" ); +// weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/lightning/lg_hum.wav" ); +// +// weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/lightning/lg_fire.wav" ); +// cgs.media.lightningShader = trap_R_RegisterShader( "lightningBolt" ); +// cgs.media.lightningExplosionModel = trap_R_RegisterModel( "models/weaphits/crackle.md3" ); +// cgs.media.sfx_lghit1 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit.wav" ); +// cgs.media.sfx_lghit2 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit2.wav" ); +// cgs.media.sfx_lghit3 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit3.wav" ); +// +// break; +//PKMOD - Ergodic 05/17/00 modify airfist registration parameters + case WP_AIRFIST: + weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/airfist/airfist.md3" ); + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); + //12/16/00 - add non compressed flag + //PKMOD - Ergodic 07/01/01 - sound will be added programmatically later in this module +// weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons2/airfist/agfire22.wav", qfalse ); + + break; + case WP_NAILGUN: +//PKMOD - Ergodic 07/28/00 add nailgun model + weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/nailgun/nail.md3" ); + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 1.0f, 1.0f, 0.1f ); +//PKMOD - Ergodic 08/05/00 changed the weapon sounds to mongusta's files + //12/16/00 - add non compressed flag + weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons2/nailgun/nailgun_carry.wav", qfalse ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons2/nailgun/nailgunf1.wav", qfalse ); + weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons2/nailgun/nailgunf2.wav", qfalse ); + weaponInfo->flashSound[2] = trap_S_RegisterSound( "sound/weapons2/nailgun/nailgunf3.wav", qfalse ); + weaponInfo->flashSound[3] = trap_S_RegisterSound( "sound/weapons2/nailgun/nailgunf4.wav", qfalse ); +// weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; + //PKMOD - Ergodic 08/01/00 set nailgun impact + cgs.media.nailImpactShader = trap_R_RegisterShader( "nailImpact" ); +//PKMOD - Ergodic 01/11/01 add trail parameters + weaponInfo->missileTrailFunc = PKANailTrail; + weaponInfo->wiTrailTime = 400; + weaponInfo->trailRadius = 8; + + break; + case WP_EXPLODING_SHELLS: + //PKMOD - Ergodic 06/18/00 install custom shaders + MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0 ); + //12/16/00 - add non compressed flag + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/shotgun/sshotf1b.wav", qfalse ); + weaponInfo->ejectBrassFunc = CG_ShotgunEjectBrass; + break; + case WP_BEANS: + weaponInfo->weaponModel = trap_R_RegisterModel( "models/weapons2/beans/beanshold.md3" ); + weaponInfo->handsModel = trap_R_RegisterModel( "models/weapons2/beans/beanshold_hand.md3" ); + //PKMOD - Ergodic 12/16/00 - add "f" to force a float declaration + MAKERGB( weaponInfo->flashDlightColor, 1.0f, 0.7f, 0.5f ); + break; + + //PKMOD + + default: + MAKERGB( weaponInfo->flashDlightColor, 1, 1, 1 ); + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); + break; + } +} + +/* +================= +CG_RegisterItemVisuals + +The server says this item is used on this level +================= +*/ +void CG_RegisterItemVisuals( int itemNum ) { + itemInfo_t *itemInfo; + gitem_t *item; + + if ( itemNum < 0 || itemNum >= bg_numItems ) { + CG_Error( "CG_RegisterItemVisuals: itemNum %d out of range [0-%d]", itemNum, bg_numItems-1 ); + } + + itemInfo = &cg_items[ itemNum ]; + if ( itemInfo->registered ) { + return; + } + + item = &bg_itemlist[ itemNum ]; + + memset( itemInfo, 0, sizeof( &itemInfo ) ); + itemInfo->registered = qtrue; + + itemInfo->models[0] = trap_R_RegisterModel( item->world_model[0] ); + + //PKMOD - Ergodic 03/05/01 - CLG has different pickup model than handhold model (inactive) + //PKMOD - Ergodic 03/27/01 - code was inactivated due to CLG will not have a rotating barrel +// if ( ( item->giTag == WP_LIGHTNING ) && ( item->giType == IT_WEAPON ) ) +// itemInfo->models[1] = trap_R_RegisterModel( item->world_model[1] ); + + + itemInfo->icon = trap_R_RegisterShader( item->icon ); + + if ( item->giType == IT_WEAPON ) { + CG_RegisterWeapon( item->giTag ); + } + + // + // powerups have an accompanying ring or sphere + // + if ( item->giType == IT_POWERUP || item->giType == IT_HEALTH || + item->giType == IT_ARMOR || item->giType == IT_HOLDABLE ) { + if ( item->world_model[1] ) { + itemInfo->models[1] = trap_R_RegisterModel( item->world_model[1] ); + } + } +} + + +/* +======================================================================================== + +VIEW WEAPON + +======================================================================================== +*/ + +/* +================= +CG_MapTorsoToWeaponFrame + +================= +*/ +static int CG_MapTorsoToWeaponFrame( clientInfo_t *ci, int frame ) { + + // change weapon + if ( frame >= ci->animations[TORSO_DROP].firstFrame + && frame < ci->animations[TORSO_DROP].firstFrame + 9 ) { + return frame - ci->animations[TORSO_DROP].firstFrame + 6; + } + + // stand attack + if ( frame >= ci->animations[TORSO_ATTACK].firstFrame + && frame < ci->animations[TORSO_ATTACK].firstFrame + 6 ) { + return 1 + frame - ci->animations[TORSO_ATTACK].firstFrame; + } + + // stand attack 2 + if ( frame >= ci->animations[TORSO_ATTACK2].firstFrame + && frame < ci->animations[TORSO_ATTACK2].firstFrame + 6 ) { + return 1 + frame - ci->animations[TORSO_ATTACK2].firstFrame; + } + + return 0; +} + + +/* +============== +CG_CalculateWeaponPosition +============== +*/ +static void CG_CalculateWeaponPosition( vec3_t origin, vec3_t angles ) { + float scale; + int delta; + float fracsin; + + VectorCopy( cg.refdef.vieworg, origin ); + VectorCopy( cg.refdefViewAngles, angles ); + + // on odd legs, invert some angles + if ( cg.bobcycle & 1 ) { + scale = -cg.xyspeed; + } else { + scale = cg.xyspeed; + } + + // gun angles from bobbing + angles[ROLL] += scale * cg.bobfracsin * 0.005; + angles[YAW] += scale * cg.bobfracsin * 0.01; + angles[PITCH] += cg.xyspeed * cg.bobfracsin * 0.005; + + // drop the weapon when landing + delta = cg.time - cg.landTime; + if ( delta < LAND_DEFLECT_TIME ) { + origin[2] += cg.landChange*0.25 * delta / LAND_DEFLECT_TIME; + } else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) { + origin[2] += cg.landChange*0.25 * + (LAND_DEFLECT_TIME + LAND_RETURN_TIME - delta) / LAND_RETURN_TIME; + } + +#if 0 + // drop the weapon when stair climbing + delta = cg.time - cg.stepTime; + if ( delta < STEP_TIME/2 ) { + origin[2] -= cg.stepChange*0.25 * delta / (STEP_TIME/2); + } else if ( delta < STEP_TIME ) { + origin[2] -= cg.stepChange*0.25 * (STEP_TIME - delta) / (STEP_TIME/2); + } +#endif + + // idle drift + scale = cg.xyspeed + 40; + fracsin = sin( cg.time * 0.001 ); + angles[ROLL] += scale * fracsin * 0.01; + angles[YAW] += scale * fracsin * 0.01; + angles[PITCH] += scale * fracsin * 0.01; +} + + +/* +=============== +CG_LightningBolt + +Origin will be the exact tag point, which is slightly +different than the muzzle point used for determining hits. +The cent should be the non-predicted cent if it is from the player, +so the endpoint will reflect the simulated strike (lagging the predicted +angle) +=============== +*/ +static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { + trace_t trace; + refEntity_t beam; + vec3_t forward; + vec3_t muzzlePoint, endPoint; +// vec3_t holdv; + int shaftee; //12/15/03 hold number of player being directly shafted + qboolean straightbeam = qtrue; + + //PKMOD - Ergodic 07/06/01 - debug (inactive) +// Com_Printf("CG_LightningBolt\n"); + + if ( cent->currentState.weapon != WP_LIGHTNING ) { + //PKMOD - Ergodic 12/06/00 - debug inactive +// Com_Printf("CG_LightningBolt - nop exit\n"); + return; + } + + //PKMOD - Ergodic 07/06/01 - debug lightning strike (inactive) +// if ( cent->currentState.eFlags & EF_LIGHTNINGSTRIKE ) +// Com_Printf("CG_LightningBolt - EF_LIGHTNINGSTRIKE is set\n"); +// else +// Com_Printf("CG_LightningBolt - EF_LIGHTNINGSTRIKE inactive\n"); + + memset( &beam, 0, sizeof( beam ) ); + + //PKMOD - Ergodic 07/08/01 - only display shaft if NOT striking player + //PKMOD - Ergodic 12/15/03 - change logic to use location of CLG struck player + //if ( cent->currentState.eFlags & EF_LIGHTNINGSTRIKE ) + // return; + if ( cent->currentState.eFlags & EF_LIGHTNINGSTRIKE ) { + shaftee = cent->currentState.otherEntityNum2; + //minimally validate client + if ( shaftee >= 0 && shaftee < MAX_CLIENTS ) { + centity_t *target; + + target = &cg_entities[ shaftee ]; + + //PKMOD - Ergodic 12/15/03 - debug lightning strike (inactive) + //Com_Printf("CG_LightningBolt - inside valid client, shaftee>%d<, org>%s<, targ>%s<\n", shaftee, CG_vtos( origin), CG_vtos(target->lerpOrigin) ); + + VectorCopy( target->lerpOrigin, beam.oldorigin ); + beam.oldorigin[2] += DEFAULT_VIEWHEIGHT; //raise the impact point up + + VectorCopy( origin, beam.origin ); //CLG Muzzle Tag location + + straightbeam = qfalse; + + } + } + + if ( straightbeam ) { //here if we are not using lockon shaft beam + // CPMA "true" lightning + if ((cent->currentState.number == cg.predictedPlayerState.clientNum) && (cg_trueLightning.value != 0)) { + vec3_t angle; + int i; + + for (i = 0; i < 3; i++) { + float a = cent->lerpAngles[i] - cg.refdefViewAngles[i]; + if (a > 180) { + a -= 360; + } + if (a < -180) { + a += 360; + } + + angle[i] = cg.refdefViewAngles[i] + a * (1.0 - cg_trueLightning.value); + if (angle[i] < 0) { + angle[i] += 360; + } + if (angle[i] > 360) { + angle[i] -= 360; + } + } + + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors(angle, forward, NULL, NULL ); + AngleVectorsForward( angle, forward ); + VectorCopy(cent->lerpOrigin, muzzlePoint ); +// VectorCopy(cg.refdef.vieworg, muzzlePoint ); + } else { + // !CPMA + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( cent->lerpAngles, forward, NULL, NULL ); + AngleVectorsForward( cent->lerpAngles, forward ); + VectorCopy(cent->lerpOrigin, muzzlePoint ); + } + + //PKMOD - Ergodic 09/10/00 - remove original aiming vector aiming + //PKMOD - Ergodic 09/20/00 - reset original aiming vector aiming + //PKMOD - Ergodic 07/07/01 - if player strike then set the beam aim, co-opt field: angles2 +// VectorCopy( cent->currentState.angles2, forward ); + //PKMOD - Ergodic 07/07/01 - debug angles2 +// Com_Printf("CG_LightningBolt: angles2>%s<\n", vtos( cent->currentState.angles2 ) ); + //PKMOD - Ergodic 07/08/01 - reset original aiming vector aiming + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( cent->lerpAngles, forward, NULL, NULL ); + AngleVectorsForward( cent->lerpAngles, forward ); + + //PKMOD - Ergodic 09/10/00 - set the aim, co-opt field: apos.trDelta + // AngleVectors( cent->currentState.apos.trDelta, cent->currentState.apos.trDelta forward, NULL, NULL ); + //PKMOD - Ergodic 09/20/00 - undo apos aiming +// VectorCopy( cent->currentState.apos.trDelta, holdv ); + + + //PKMOD - Ergodic 09/20/00 - undo apos aiming +// VectorCopy( cent->currentState.apos.trDelta, forward ); + + // FIXME: crouch + muzzlePoint[2] += DEFAULT_VIEWHEIGHT; + + //PKMOD - Ergodic 01/16/01 - don't draw shaft if doing a Lightning Discharge in water + if (trap_CM_PointContents (muzzlePoint, 0) & MASK_WATER) + return; + + VectorMA( muzzlePoint, 14, forward, muzzlePoint ); + + // project forward by the lightning range + VectorMA( muzzlePoint, LIGHTNING_RANGE, forward, endPoint ); + + // see if it hit a wall + CG_Trace( &trace, muzzlePoint, vec3_origin, vec3_origin, endPoint, + cent->currentState.number, MASK_SHOT ); + + // this is the endpoint + VectorCopy( trace.endpos, beam.oldorigin ); + + // use the provided origin, even though it may be slightly + // different than the muzzle origin + VectorCopy( origin, beam.origin ); + } + +//PKMOD - Ergodic 08/21/00 change flash to railgun style to make a tighter beam + beam.reType = RT_RAIL_CORE; +// beam.reType = RT_LIGHTNING; +//PKMOD - Ergodic 08/21/00 set the shader to chainlightning + beam.customShader = cgs.media.chainlightningShader; + trap_R_AddRefEntityToScene( &beam ); + + if ( straightbeam ) { //here if we are not using lockon shaft beam + // add the impact flare if it hit something + if ( trace.fraction < 1.0 ) { + vec3_t angles; + vec3_t dir; + + VectorSubtract( beam.oldorigin, beam.origin, dir ); + VectorNormalize( dir ); + + memset( &beam, 0, sizeof( beam ) ); + beam.hModel = cgs.media.lightningExplosionModel; + + VectorMA( trace.endpos, -16, dir, beam.origin ); + + // make a random orientation + angles[0] = rand() % 360; + angles[1] = rand() % 360; + angles[2] = rand() % 360; + AnglesToAxis( angles, beam.axis ); + trap_R_AddRefEntityToScene( &beam ); + } + } +} + + +/* +=============== +CG_SpawnRailTrail + +Origin will be the exact tag point, which is slightly +different than the muzzle point used for determining hits. +=============== +*/ +static void CG_SpawnRailTrail( centity_t *cent, vec3_t origin ) { + clientInfo_t *ci; + + if ( cent->currentState.weapon != WP_RAILGUN ) { + return; + } + if ( !cent->pe.railgunFlash ) { + return; + } + cent->pe.railgunFlash = qtrue; + ci = &cgs.clientinfo[ cent->currentState.clientNum ]; + CG_RailTrail( ci, origin, cent->pe.railgunImpact ); +} + + +/* +====================== +CG_MachinegunSpinAngle +====================== +*/ +#define SPIN_SPEED 0.9 +#define COAST_TIME 1000 +static float CG_MachinegunSpinAngle( centity_t *cent ) { + int delta; + float angle; + float speed; + + delta = cg.time - cent->pe.barrelTime; + if ( cent->pe.barrelSpinning ) { + angle = cent->pe.barrelAngle + delta * SPIN_SPEED; + } else { + if ( delta > COAST_TIME ) { + delta = COAST_TIME; + } + + speed = 0.5 * ( SPIN_SPEED + (float)( COAST_TIME - delta ) / COAST_TIME ); + angle = cent->pe.barrelAngle + delta * speed; + } + + //PKMOD - Ergodic 12/19/01 - aways spin the gauntlet on the dragon + if ( cent->pe.barrelSpinning == !(cent->currentState.eFlags & EF_FIRING) ) { + cent->pe.barrelTime = cg.time; + cent->pe.barrelAngle = AngleMod( angle ); + cent->pe.barrelSpinning = !!(cent->currentState.eFlags & EF_FIRING); +#ifdef MISSIONPACK + if ( cent->currentState.weapon == WP_CHAINGUN && !cent->pe.barrelSpinning ) { + trap_S_StartSound( NULL, cent->currentState.number, CHAN_WEAPON, trap_S_RegisterSound( "sound/weapons/vulcan/wvulwind.wav", qfalse ) ); + } +#endif + } + + return angle; +} + + +/* +====================== +CG_MachinegunSpinAngle + +PKMOD - Ergodic 12/19/01 - aways spin the gauntlet blade on the dragon + ====================== +*/ +static float CG_GauntletSpinAngle( centity_t *cent ) { + int delta; + float angle; + float speed; + + delta = cg.time - cent->pe.barrelTime; + if ( cent->pe.barrelSpinning ) { + angle = cent->pe.barrelAngle + delta * SPIN_SPEED; + } else { + if ( delta > COAST_TIME ) { + delta = COAST_TIME; + } + + speed = 0.5 * ( SPIN_SPEED + (float)( COAST_TIME - delta ) / COAST_TIME ); + angle = cent->pe.barrelAngle + delta * speed; + } + + cent->pe.barrelTime = cg.time; + cent->pe.barrelAngle = AngleMod( angle ); + cent->pe.barrelSpinning = !!(cent->currentState.eFlags & EF_FIRING); + + return angle; +} + + +/* +======================== +CG_AddWeaponWithPowerups +======================== +*/ +static void CG_AddWeaponWithPowerups( refEntity_t *gun, int powerups ) { + // add powerup effects + if ( powerups & ( 1 << PW_INVIS ) ) { + gun->customShader = cgs.media.invisShader; + trap_R_AddRefEntityToScene( gun ); + } else { + trap_R_AddRefEntityToScene( gun ); + + if ( powerups & ( 1 << PW_BATTLESUIT ) ) { + gun->customShader = cgs.media.battleWeaponShader; + trap_R_AddRefEntityToScene( gun ); + } + if ( powerups & ( 1 << PW_QUAD ) ) { + gun->customShader = cgs.media.quadWeaponShader; + trap_R_AddRefEntityToScene( gun ); + } + } +} + + +/* +============= +CG_AddPlayerWeapon + +Used for both the view weapon (ps is valid) and the world modelother character models (ps is NULL) +The main player will have this called for BOTH cases, so effects like light and +sound should only be done on the world model case. +============= +*/ +void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent, int team ) { + refEntity_t gun; + refEntity_t barrel; + refEntity_t flash; + vec3_t angles; + weapon_t weaponNum; + weaponInfo_t *weapon; + centity_t *nonPredictedCent; +// int col; + + weaponNum = cent->currentState.weapon; + + //PKMOD - Ergodic 07/05/01 - debug (inactive) +// if ( rand() % 100 > 97 ) +// Com_Printf( "CG_AddPlayerWeapon - generic1:%d\n", cent->currentState.generic1 ); + + CG_RegisterWeapon( weaponNum ); + weapon = &cg_weapons[weaponNum]; + + // add the weapon + memset( &gun, 0, sizeof( gun ) ); + VectorCopy( parent->lightingOrigin, gun.lightingOrigin ); + gun.shadowPlane = parent->shadowPlane; + gun.renderfx = parent->renderfx; + + // set custom shading for railgun refire rate + if ( ps ) { + if ( cg.predictedPlayerState.weapon == WP_RAILGUN + && cg.predictedPlayerState.weaponstate == WEAPON_FIRING ) { + float f; + + f = (float)cg.predictedPlayerState.weaponTime / 1500; + gun.shaderRGBA[1] = 0; + gun.shaderRGBA[0] = + gun.shaderRGBA[2] = 255 * ( 1.0 - f ); + } else { + gun.shaderRGBA[0] = 255; + gun.shaderRGBA[1] = 255; + gun.shaderRGBA[2] = 255; + gun.shaderRGBA[3] = 255; + } + } + + gun.hModel = weapon->weaponModel; + if (!gun.hModel) { + return; + } + + if ( !ps ) { + // add weapon ready sound + cent->pe.lightningFiring = qfalse; + if ( ( cent->currentState.eFlags & EF_FIRING ) && weapon->firingSound ) { + // lightning gun and guantlet make a different sound when fire is held down + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, weapon->firingSound ); + cent->pe.lightningFiring = qtrue; + } else if ( weapon->readySound ) { + trap_S_AddLoopingSound( cent->currentState.number, cent->lerpOrigin, vec3_origin, weapon->readySound ); + } + } + + CG_PositionEntityOnTag( &gun, parent, parent->hModel, "tag_weapon"); + + CG_AddWeaponWithPowerups( &gun, cent->currentState.powerups ); + + //PKMOD - Ergodic 03/01/01 - Dragon alternate fire + //PKMOD - Ergodic 03/02/01 - modify logic to be based on weaponNum and not ammo + //PKMOD - Ergodic 03/13/01 - if current weapon is not the dragon then don't use the alternate weapon + if ( weaponNum == WP_GRAPPLING_HOOK ) { + //PKMOD - Ergodic 07/05/01 - use cent and not cg.snap so deploy weapon will appear + // on multiplayer entities + if ( cent->currentState.generic1 ) { + refEntity_t gun2; + weaponInfo_t *weapon2; + weapon_t deployNum; + + //PKMOD - Ergodic 03/14/01 - mask off the weapon bits (0 - 15) + //deployNum = cg.snap->ps.generic1 & 15; + //PKMOD - Ergodic 07/05/01 - use "ps" and not "cg" so deploy weapon + // will appear on multiplayer models and not just local client + deployNum = cent->currentState.generic1 & 15; + + // add the weapon + memset( &gun2, 0, sizeof( gun2 ) ); + VectorCopy( parent->lightingOrigin, gun2.lightingOrigin ); + gun2.shadowPlane = parent->shadowPlane; + gun2.renderfx = parent->renderfx; + + //PKMOD - Ergodic 12/15/01 - debug deploy gauntlet (inactive) +// Com_Printf( "CG_AddPlayerWeapon - deploying>%d<\n", deployNum ); + + + //PKMOD - Ergodic 08/29/01 - move code to include Flag as deploy weapon + //set the deploy model + if ( ( deployNum == PW_REDFLAG ) || ( deployNum == PW_BLUEFLAG ) ) { + if ( deployNum == PW_REDFLAG ) + gun2.hModel = cgs.media.redFlagModel; + else + gun2.hModel = cgs.media.blueFlagModel; + } + else { //NOT A FLAG: deploy a PA WEAPON + CG_RegisterWeapon( WP_GRAPPLING_HOOK ); + weapon2 = &cg_weapons[ deployNum ]; + //PKMOD - Ergodic 12/16/01 - show the barrel if depoying the gauntlet + if ( deployNum == WP_GAUNTLET ) { + //PKMOD - Ergodic 12/16/01 - select the barrel model + gun2.hModel = weapon2->barrelModel; + //PKMOD - Ergodic 12/16/01 - make gauntlet blade rotate + angles[YAW] = 0; // was CG_MachinegunSpinAngle( cent ); + angles[PITCH] = 0; //was -90 + angles[ROLL] = CG_GauntletSpinAngle( cent ); + AnglesToAxis( angles, gun2.axis ); + } + else + gun2.hModel = weapon2->weaponModel; + } + + if (!gun2.hModel) { + return; + } + //PKMOD - Ergodic 03/01/01 - debug inactive + // Com_Printf( "CG_AddPlayerWeapon - attaching beartrap to dragon\n" ); + + //PKMOD - Ergodic 12/16/01 - rotate the gauntlet_blade + if ( deployNum == WP_GAUNTLET ) { + //PKMOD - Ergodic 01/26/02 - only display gauntlet if NOT firing + if ( !( cent->currentState.eFlags & EF_FIRING ) ) { + CG_PositionRotatedEntityOnTag( &gun2, &gun, gun.hModel, "tag_gauntlet" ); + CG_AddWeaponWithPowerups( &gun2, cent->currentState.powerups ); + } + } + else { + CG_PositionEntityOnTag( &gun2, &gun, gun.hModel, "tag_tongue" ); + CG_AddWeaponWithPowerups( &gun2, cent->currentState.powerups ); + } + } + } + + + // add the spinning barrel + if ( weapon->barrelModel ) { + memset( &barrel, 0, sizeof( barrel ) ); + VectorCopy( parent->lightingOrigin, barrel.lightingOrigin ); + barrel.shadowPlane = parent->shadowPlane; + barrel.renderfx = parent->renderfx; + + barrel.hModel = weapon->barrelModel; + angles[YAW] = 0; + angles[PITCH] = 0; + angles[ROLL] = CG_MachinegunSpinAngle( cent ); + AnglesToAxis( angles, barrel.axis ); + + CG_PositionRotatedEntityOnTag( &barrel, &gun, weapon->weaponModel, "tag_barrel" ); + + CG_AddWeaponWithPowerups( &barrel, cent->currentState.powerups ); + } + + // make sure we aren't looking at cg.predictedPlayerEntity for LG + nonPredictedCent = &cg_entities[cent->currentState.clientNum]; + + // if the index of the nonPredictedCent is not the same as the clientNum + // then this is a fake player (like on teh single player podiums), so + // go ahead and use the cent + if( ( nonPredictedCent - cg_entities ) != cent->currentState.clientNum ) { + nonPredictedCent = cent; + } + + // add the flash + if ( ( weaponNum == WP_LIGHTNING || weaponNum == WP_GAUNTLET || weaponNum == WP_GRAPPLING_HOOK ) + && ( nonPredictedCent->currentState.eFlags & EF_FIRING ) ) + { + // continuous flash + } else { + // impulse flash + if ( cg.time - cent->muzzleFlashTime > MUZZLE_FLASH_TIME && !cent->pe.railgunFlash ) { + return; + } + } + + memset( &flash, 0, sizeof( flash ) ); + VectorCopy( parent->lightingOrigin, flash.lightingOrigin ); + flash.shadowPlane = parent->shadowPlane; + flash.renderfx = parent->renderfx; + + flash.hModel = weapon->flashModel; + if (!flash.hModel) { + return; + } + angles[YAW] = 0; + angles[PITCH] = 0; + angles[ROLL] = crandom() * 10; + AnglesToAxis( angles, flash.axis ); + + // colorize the railgun blast + if ( weaponNum == WP_RAILGUN ) { + clientInfo_t *ci; + + ci = &cgs.clientinfo[ cent->currentState.clientNum ]; + flash.shaderRGBA[0] = 255 * ci->color1[0]; + flash.shaderRGBA[1] = 255 * ci->color1[1]; + flash.shaderRGBA[2] = 255 * ci->color1[2]; + } + + CG_PositionRotatedEntityOnTag( &flash, &gun, weapon->weaponModel, "tag_flash"); + trap_R_AddRefEntityToScene( &flash ); + + if ( ps || cg.renderingThirdPerson || + cent->currentState.number != cg.predictedPlayerState.clientNum ) { + + // add lightning bolt + CG_LightningBolt( nonPredictedCent, flash.origin ); + + // add rail trail + CG_SpawnRailTrail( cent, flash.origin ); + + if ( weapon->flashDlightColor[0] || weapon->flashDlightColor[1] || weapon->flashDlightColor[2] ) { + trap_R_AddLightToScene( flash.origin, 300 + (rand()&31), weapon->flashDlightColor[0], + weapon->flashDlightColor[1], weapon->flashDlightColor[2] ); + } + } +} + +/* +============== +CG_AddViewWeapon + +Add the weapon, and flash for the player's view +============== +*/ +void CG_AddViewWeapon( playerState_t *ps ) { + refEntity_t hand; + centity_t *cent; + clientInfo_t *ci; + float fovOffset; + vec3_t angles; + weaponInfo_t *weapon; + + if ( ps->persistant[PERS_TEAM] == TEAM_SPECTATOR ) { + return; + } + + if ( ps->pm_type == PM_INTERMISSION ) { + return; + } + + // no gun if in third person view or a camera is active + //if ( cg.renderingThirdPerson || cg.cameraMode) { + if ( cg.renderingThirdPerson ) { + return; + } + + + // allow the gun to be completely removed + if ( !cg_drawGun.integer ) { + vec3_t origin; + + if ( cg.predictedPlayerState.eFlags & EF_FIRING ) { + // special hack for lightning gun... + VectorCopy( cg.refdef.vieworg, origin ); + VectorMA( origin, -8, cg.refdef.viewaxis[2], origin ); + CG_LightningBolt( &cg_entities[ps->clientNum], origin ); + } + return; + } + + // don't draw if testing a gun model + if ( cg.testGun ) { + return; + } + + // drop gun lower at higher fov + if ( cg_fov.integer > 90 ) { + fovOffset = -0.2 * ( cg_fov.integer - 90 ); + } else { + fovOffset = 0; + } + + cent = &cg.predictedPlayerEntity; // &cg_entities[cg.snap->ps.clientNum]; + CG_RegisterWeapon( ps->weapon ); + weapon = &cg_weapons[ ps->weapon ]; + + memset (&hand, 0, sizeof(hand)); + + // set up gun position + CG_CalculateWeaponPosition( hand.origin, angles ); + + VectorMA( hand.origin, cg_gun_x.value, cg.refdef.viewaxis[0], hand.origin ); + VectorMA( hand.origin, cg_gun_y.value, cg.refdef.viewaxis[1], hand.origin ); + VectorMA( hand.origin, (cg_gun_z.value+fovOffset), cg.refdef.viewaxis[2], hand.origin ); + + AnglesToAxis( angles, hand.axis ); + + // map torso animations to weapon animations + if ( cg_gun_frame.integer ) { + // development tool + hand.frame = hand.oldframe = cg_gun_frame.integer; + hand.backlerp = 0; + } else { + // get clientinfo for animation map + ci = &cgs.clientinfo[ cent->currentState.clientNum ]; + hand.frame = CG_MapTorsoToWeaponFrame( ci, cent->pe.torso.frame ); + hand.oldframe = CG_MapTorsoToWeaponFrame( ci, cent->pe.torso.oldFrame ); + hand.backlerp = cent->pe.torso.backlerp; + } + + hand.hModel = weapon->handsModel; + hand.renderfx = RF_DEPTHHACK | RF_FIRST_PERSON | RF_MINLIGHT; + + // add everything onto the hand + CG_AddPlayerWeapon( &hand, ps, &cg.predictedPlayerEntity, ps->persistant[PERS_TEAM] ); +} + +/* +============================================================================== + +WEAPON SELECTION + +============================================================================== +*/ + +/* +=================== +CG_DrawWeaponSelect +=================== +*/ +void CG_DrawWeaponSelect( void ) { + int i; + int bits; + int count; + int x, y, w; + char *name; + float *color; + + // don't display if dead + if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) { + return; + } + + color = CG_FadeColor( cg.weaponSelectTime, WEAPON_SELECT_TIME ); + if ( !color ) { + return; + } + trap_R_SetColor( color ); + + // showing weapon select clears pickup item display, but not the blend blob + cg.itemPickupTime = 0; + + // count the number of weapons owned + bits = cg.snap->ps.stats[ STAT_WEAPONS ]; + count = 0; + for ( i = 1 ; i < 16 ; i++ ) { + if ( bits & ( 1 << i ) ) { + count++; + } + } + + x = 320 - count * 20; + y = 380; + + for ( i = 1 ; i < 16 ; i++ ) { + if ( !( bits & ( 1 << i ) ) ) { + continue; + } + + CG_RegisterWeapon( i ); + + // draw weapon icon + CG_DrawPic( x, y, 32, 32, cg_weapons[i].weaponIcon ); + + // draw selection marker + if ( i == cg.weaponSelect ) { + CG_DrawPic( x-4, y-4, 40, 40, cgs.media.selectShader ); + } + + // no ammo cross on top + if ( !cg.snap->ps.ammo[ i ] ) { + CG_DrawPic( x, y, 32, 32, cgs.media.noammoShader ); + } + + x += 40; + } + + // draw the selected name + if ( cg_weapons[ cg.weaponSelect ].item ) { + name = cg_weapons[ cg.weaponSelect ].item->pickup_name; + if ( name ) { + w = CG_DrawStrlen( name ) * BIGCHAR_WIDTH; + x = ( SCREEN_WIDTH - w ) / 2; + CG_DrawBigStringColor(x, y - 22, name, color); + } + } + + trap_R_SetColor( NULL ); +} + + +/* +=============== +CG_WeaponSelectable +=============== +*/ +static qboolean CG_WeaponSelectable( int i ) { + //PKMOD - Ergodic 06/14/00 handle weapon WP_SHOTGUN, shotgun/exploding shells weapon selection + if (i == WP_SHOTGUN) { + if ( (!cg.snap->ps.ammo[WP_SHOTGUN]) && (!cg.snap->ps.ammo[WP_EXPLODING_SHELLS]) ) { + return qfalse; + } + } +//PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level +// airfist may have "useable" zero ammo + else if ( ( !cg.snap->ps.ammo[i] ) && ( i != WP_AIRFIST ) ) { + return qfalse; + } + + if ( ! (cg.snap->ps.stats[ STAT_WEAPONS ] & ( 1 << i ) ) ) { + return qfalse; + } + + return qtrue; +} + +/* +=============== +CG_NextWeapon_f +=============== +*/ +void CG_NextWeapon_f( void ) { + int i; + int original; + //PKMOD - Ergodic 08/16/03 - PKA full weapon cycling + int max_weapon; + + //PKMOD - Ergodic 08/16/03 - PKA full weapon cycling + if ( cg_pkafullweaponcycling.integer ) + max_weapon = WP_EXPLODING_SHELLS - 1; + else + max_weapon = WP_GRAPPLING_HOOK; + + if ( !cg.snap ) { + return; + } + if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + return; + } + + cg.weaponSelectTime = cg.time; + original = cg.weaponSelect; + +//PMMOD - Ergodic 06/10/00 For this type of cycling to work +// must follow weapon_t in bg_public.h for special +// PK Weapons. Assume grapple is the highest regular weapon. + for ( i = 0 ; i < WP_NUM_WEAPONS; i++ ) { + if (cg.weaponSelect == WP_EXPLODING_SHELLS) { + cg.weaponSelect = WP_SHOTGUN + 1; + } + else { + cg.weaponSelect++; + //PKMOD - Ergodic 08/16/03 - PKA full weapon cycling + // if ( cg.weaponSelect > WP_GRAPPLING_HOOK ) { + if ( cg.weaponSelect > max_weapon ) { + cg.weaponSelect = 0; + } + } + //PKMOD - Ergodic 08/18/03 - don't cycle to Gauntlet using "normal" weapon cycling + if ( cg_pkafullweaponcycling.integer != 1 ) + if ( cg.weaponSelect == WP_GAUNTLET ) { + continue; // never cycle to gauntlet + } + if ( CG_WeaponSelectable( cg.weaponSelect ) ) { + //PKMOD - Ergodic 06/14/00 handle weapon WP_SHOTGUN, shotgun/exploding shells weapon selection + if (cg.weaponSelect == WP_SHOTGUN) { + if ( cg.snap->ps.ammo[WP_EXPLODING_SHELLS] ) { + cg.weaponSelect = WP_EXPLODING_SHELLS; + } + + } //end if (cg.weaponSelect==WP_SHOTGUN), weapon WP_SHOTGUN selection + + break; + } + } + + //PKMOD - Ergodic 04/03/01 - code to fix selecting empty ammo weapon + if ( i == WP_NUM_WEAPONS ) { + cg.weaponSelect = original; + } + +} + +/* +=============== +CG_PrevWeapon_f +=============== +*/ +void CG_PrevWeapon_f( void ) { + int i; + int original; + //PKMOD - Ergodic 08/18/03 - PKA full weapon cycling + int max_weapon; + + //PKMOD - Ergodic 08/18/03 - PKA full weapon cycling + if ( cg_pkafullweaponcycling.integer ) + max_weapon = WP_EXPLODING_SHELLS - 1; + else + max_weapon = WP_GRAPPLING_HOOK; + + if ( !cg.snap ) { + return; + } + if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + return; + } + + cg.weaponSelectTime = cg.time; + original = cg.weaponSelect; + +//PMMOD - Ergodic 06/10/00 For this type of cycling to work +// must follow weapon_t in bg_public.h for special +// PK Weapons. Assume grapple is the highest regular weapon. + for ( i = 0 ; i < WP_NUM_WEAPONS; i++ ) { + if (cg.weaponSelect == WP_EXPLODING_SHELLS) { + cg.weaponSelect = WP_SHOTGUN - 1; + } + else { + cg.weaponSelect--; + //PMMOD - Ergodic 07/26/01 - fix pka hold cycling + //PKMOD - Ergodic 08/18/03 - PKA full weapon cycling + //if ( cg.weaponSelect > WP_GRAPPLING_HOOK ) { + // cg.weaponSelect = WP_GRAPPLING_HOOK; + //} + //else if ( cg.weaponSelect < 0 ) { + // cg.weaponSelect = WP_GRAPPLING_HOOK; + //} + if ( cg.weaponSelect > max_weapon ) { + cg.weaponSelect = max_weapon; + } + else if ( cg.weaponSelect < 0 ) { + cg.weaponSelect = max_weapon; + } + } + + //PKMOD - Ergodic 08/18/03 - don't cycle to Gauntlet using "normal" weapon cycling + if ( cg_pkafullweaponcycling.integer != 1 ) + if ( cg.weaponSelect == WP_GAUNTLET ) { + continue; // never cycle to gauntlet + } + + //PKMOD - Ergodic 04/03/01 - debug "BT & MG bug" (inactive) +// Com_Printf("CG_PrevWeapon_f - cg.weaponSelect>%d<, i>%d<\n", cg.weaponSelect, i ); + + if ( CG_WeaponSelectable( cg.weaponSelect ) ) { + //PKMOD - Ergodic 06/14/00 handle weapon WP_SHOTGUN, shotgun/exploding shells weapon selection + if (cg.weaponSelect == WP_SHOTGUN) { + if ( cg.snap->ps.ammo[WP_EXPLODING_SHELLS] ) { + cg.weaponSelect = WP_EXPLODING_SHELLS; + } + + } //end if (cg.weaponSelect==WP_SHOTGUN), weapon WP_SHOTGUN selection + + break; + } + } + + //PKMOD - Ergodic 04/03/01 - code to fix (BT & MG bug) +// if ( i == WP_GRAPPLING_HOOK ) { + if ( i == WP_NUM_WEAPONS ) { + cg.weaponSelect = original; + } +} + +/* +=============== +CG_Weapon_f +=============== +*/ +void CG_Weapon_f( void ) { + int num; + + if ( !cg.snap ) { + return; + } + if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + return; + } + + num = atoi( CG_Argv( 1 ) ); + + if ( num < 1 || num > 15 ) { + return; + } + + cg.weaponSelectTime = cg.time; + + //PKMOD - Ergodic 03/12/02 - check for auto-deploy + if ( cg.weaponSelect == num ) { + //PKMOD - Ergodic 10/23/02 - add reset dragon after holding dragon deploy and press "weapon 10" + if ( (( num >= WP_GRAVITY ) && ( num <= WP_BEANS )) || ( num == WP_GAUNTLET ) || ( num == WP_GRAPPLING_HOOK ) ) + CG_Weapon_DragonDeploy(); + return; + } + + //PKMOD - Ergodic 06/09/00 handle weapon 1 pka weapons cycling + //PKMOD - Ergodic 03/12/02 - turn wepon 1 cycling off + /*---------------begin: weapon 1 cycling ---------------- + if (num == 1) { + original = cg.weaponSelect; + cg.weaponSelect = 1; +//PMMOD - Ergodic 06/09/00 For this type of cycling to work +// must follow weapon_t in bg_public.h for special +// PK Weapons. This code will cycle from Gauntlet, +// Gravity Well, AutoSentry, BearTrap, and Beans. + if ( (original == 1) || ((original >= WP_GRAVITY) && (original <= WP_BEANS)) ) { + if ( original == 1 ) { + original = WP_GRAVITY - 1; + } + + for ( i = (original + 1) ; i <= WP_BEANS ; i++ ) { + if ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << i) ) { + cg.weaponSelect = i; // found the next weapon 1 selection + break; + } + } + } + + return; // always return from here on weapon 1 selection + } //end if (num==1), weapon 1 cycling + ---------------end: weapon 1 cycling ----------------*/ + + //PKMOD - Ergodic 06/14/00 handle weapon WP_SHOTGUN, shotgun/exploding shells weapon selection + if (num == WP_SHOTGUN) { + if ( ! ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << num ) ) ) { + return; // don't have the shotgun weapon + } + //we have the shotgun + if ( !cg.snap->ps.ammo[WP_EXPLODING_SHELLS] ) { + cg.weaponSelect = num; + } + else { + cg.weaponSelect = WP_EXPLODING_SHELLS; + } + + return; // always return from here on weapon WP_SHOTGUN selection + } //end if (num==WP_SHOTGUN), weapon WP_SHOTGUN selection + + if ( ! ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << num ) ) ) { + return; // don't have the weapon + } + + //PKMOD - Ergodic 06/28/01 - turn off dragon deploy if enabled and selecting dragon + if ( ( num == WP_GRAPPLING_HOOK ) && ( ( cg.snap->ps.generic1 & 15 ) > 0 ) ) { + char command[128]; + + Com_sprintf( command, 128, "gdeploy 0" ); + trap_SendClientCommand( command ); + } + + cg.weaponSelect = num; +} + +/* +=================== +CG_OutOfAmmoChange + +The current weapon has just run out of ammo +=================== +*/ +void CG_OutOfAmmoChange( void ) { + int i; + + cg.weaponSelectTime = cg.time; + + //PKMOD - Ergodic 07/06/00 handle case of out exploding shells ammo + // test wp_shotgun for selectablility first + if ( cg.weaponSelect == WP_EXPLODING_SHELLS ) { + if ( CG_WeaponSelectable( WP_SHOTGUN ) ) { + cg.weaponSelect = WP_SHOTGUN; + return; + } + } + +//PKMOD - Ergodic 06/10/00 For this type of cycling to work +// must follow weapon_t in bg_public.h for special +// PK Weapons. Assume grapple is the highest regular weapon. + for ( i = WP_GRAPPLING_HOOK - 1; i > 0 ; i-- ) { + if ( CG_WeaponSelectable( i ) ) { + cg.weaponSelect = i; + break; + } + } +} + +//PKMOD - Ergodic 07/02/00 weapon commands +/* +=============== +CG_CMD_Weapon_Select - select the specified weapon +=============== +*/ +void CG_CMD_Weapon_Select( int weapon_num ) { + //PKMOD - Ergodic 04/04/01 - save last weapon (04/05/01 - code done in bg_pmove) +// int original_weapon; + + //PKMOD - Ergodic 07/25/01 - debug airfist select (inactive) +// Com_Printf( "CG_CMD_Weapon_Select - weapon_num:%d, stat:%d ammo:%d\n", weapon_num, cg.snap->ps.stats[STAT_WEAPONS], cg.snap->ps.stats[STAT_WEAPONS], cg.snap->ps.ammo[weapon_num] ); + + if ( !cg.snap ) { + return; + } + if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { + return; + } + +//PKMOD - Ergodic 12/25/00 move to later down in the function +// cg.weaponSelectTime = cg.time; + + if ( ! ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << weapon_num ) ) ) { + return; // don't have the weapon + } + + //PKMOD - Ergodic 06/28/01 - debug (inactive) +// Com_Printf( "CG_CMD_Weapon_Select - weapon_num:%d, ps.generic1:%d, predictedPlayerState.generic1:%d\n", weapon_num, cg.snap->ps.generic1, cg.predictedPlayerState.generic1 ); + + //PKMOD - Ergodic 06/28/01 - turn off dragon deploy if enabled and selecting dragon + if ( ( weapon_num == WP_GRAPPLING_HOOK ) && ( ( cg.snap->ps.generic1 & 15 ) > 0 ) ) { + char command[128]; + + Com_sprintf( command, 128, "gdeploy 0" ); + trap_SendClientCommand( command ); + cg.weaponSelectTime = cg.time; + cg.weaponSelect = weapon_num; + return; + } + + //PKMOD - Ergodic 04/04/01 - save last weapon (04/05/01 - code done in bg_pmove) +// original_weapon = cg.weaponSelect; + + //PKMOD - Ergodic 12/25/00 add logic to not switch if out of ammo + //PKMOD - Ergodic 06/14/00 handle weapon WP_SHOTGUN, shotgun/exploding shells weapon selection + if (weapon_num == WP_SHOTGUN) { + //do we have exploding shells? + if ( cg.snap->ps.ammo[WP_EXPLODING_SHELLS] > 0 ) { + cg.weaponSelectTime = cg.time; + cg.weaponSelect = WP_EXPLODING_SHELLS; + + //PKMOD - Ergodic 04/04/01 - save last weapon if weapon number has changed + //PKMOD - Ergodic 04/05/01 - code done in bg_pmove +// if ( original_weapon != cg.weaponSelect ) +// cg.weaponLast = original_weapon; + + return; + } + //do we have regular shells? + if ( cg.snap->ps.ammo[WP_SHOTGUN] > 0 ) { + cg.weaponSelectTime = cg.time; + cg.weaponSelect = WP_SHOTGUN; + + //PKMOD - Ergodic 04/04/01 - save last weapon if weapon number has changed + //PKMOD - Ergodic 04/05/01 - code done in bg_pmove +// if ( original_weapon != cg.weaponSelect ) +// cg.weaponLast = original_weapon; + } + + } //end if (num==WP_SHOTGUN), weapon WP_SHOTGUN selection + else { + //all other weapons +//PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level +// airfist may have "useable" zero ammo +//PKMOD - Ergodic 07/25/01 - fix airfist selection +// if ( ( cg.snap->ps.ammo[weapon_num] != 0 ) && ( weapon_num != WP_AIRFIST ) ) { + if ( ( cg.snap->ps.ammo[weapon_num] != 0 ) || ( weapon_num == WP_AIRFIST ) ) { + cg.weaponSelectTime = cg.time; + cg.weaponSelect = weapon_num; + + //PKMOD - Ergodic 04/04/01 - save last weapon if weapon number has changed + //PKMOD - Ergodic 04/05/01 - code done in bg_pmove +// if ( original_weapon != cg.weaponSelect ) +// cg.weaponLast = original_weapon; + } + } +} + +/* +=============== +CG_LastWeapon_f - select the last wepon held +PKMOD - Ergodic 04/04/01 +=============== +*/ +void CG_LastWeapon_f( void ) { + + //PKMOD - Ergodic 04/04/01 - debug (inactive) +// Com_Printf( "CG_LastWeapon_f - current>%d<, last>%d<\n", cg.weaponSelect, cg.snap->ps.stats[ STAT_LAST_WEAPON ] ); + + CG_CMD_Weapon_Select( cg.snap->ps.stats[ STAT_LAST_WEAPON ] ); + +} + + +/* +=============== +CG_Weapon_Gauntlet - select the Gauntlet +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_Gauntlet( void ) { + CG_CMD_Weapon_Select( WP_GAUNTLET ); +} + +/* +=============== +CG_Weapon_MachineGun - select the MachineGun +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_MachineGun( void ) { + CG_CMD_Weapon_Select( WP_MACHINEGUN ); +} + +/* +=============== +CG_Weapon_ShotGun - select the ShotGun +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_ShotGun( void ) { + CG_CMD_Weapon_Select( WP_SHOTGUN ); +} + +/* +=============== +CG_Weapon_AirFist - select the AirFist +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_AirFist( void ) { + CG_CMD_Weapon_Select( WP_AIRFIST ); +} + +/* +=============== +CG_Weapon_NailGun - select the NailGun +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_NailGun( void ) { + CG_CMD_Weapon_Select( WP_NAILGUN ); +} + +/* +=============== +CG_Weapon_GrenadeLauncher - select the Grenade Launcher +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_GrenadeLauncher( void ) { + CG_CMD_Weapon_Select( WP_GRENADE_LAUNCHER ); +} + +/* +=============== +CG_Weapon_RocketLauncher - select the Rocket Launcher +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_RocketLauncher( void ) { + CG_CMD_Weapon_Select( WP_ROCKET_LAUNCHER ); +} + +/* +=============== +CG_Weapon_LightningGun - select the LightningGun +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_LightningGun( void ) { + CG_CMD_Weapon_Select( WP_LIGHTNING ); +} + +/* +=============== +CG_Weapon_RailGun - select the RailGun +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_RailGun( void ) { + CG_CMD_Weapon_Select( WP_RAILGUN ); +} + +/* +=============== +CG_Weapon_Harpoon - select the Harpoon +PKMOD - Ergodic 07/12/00 +=============== +*/ +void CG_Weapon_Harpoon( void ) { + CG_CMD_Weapon_Select( WP_GRAPPLING_HOOK ); +} + +/* +=============== +CG_Weapon_GravityWell - select the gravity well +PKMOD - Ergodic 07/02/00 +=============== +*/ +void CG_Weapon_GravityWell( void ) { + CG_CMD_Weapon_Select( WP_GRAVITY ); +} + +/* +=============== +CG_Weapon_Sentry - select the autosentry +PKMOD - Ergodic 07/02/00 +=============== +*/ +void CG_Weapon_Sentry( void ) { + CG_CMD_Weapon_Select( WP_SENTRY ); +} +/* +=============== +CG_Weapon_Beans - select the beartrap +PKMOD - Ergodic 07/02/00 +=============== +*/ +void CG_Weapon_BearTrap( void ) { + CG_CMD_Weapon_Select( WP_BEARTRAP ); +} + +/* +=============== +CG_Weapon_Beans - select the can of pork-n-beans +PKMOD - Ergodic 07/02/00 +=============== +*/ +void CG_Weapon_Beans( void ) { + CG_CMD_Weapon_Select( WP_BEANS ); +} + + +//PKMOD - Ergodic 05/20/00 switch to gauntlet +/* +=================== +CG_PKA_OutOfAmmoChange + +The current pka weapon has just run out of ammo +=================== +*/ +void CG_PKA_OutOfAmmoChange( void ) { + + //PKMOD - Ergodic 08/24/01 - debug removal of machinegun when testing infinite ammo bug (inactive) +// Com_Printf("CG_PKA_OutOfAmmoChange - removing weapon>%d<\n", cg.weaponSelect ); + + //PKMOD - Ergodic 06/27/00 physically remove the weapon from inventory + //PKMOD - Ergodic 03/02/01 - Does this work in the game code (I think not)? + cg.snap->ps.stats[STAT_WEAPONS] &= ~( 1 << cg.weaponSelect ); + + cg.weaponSelectTime = cg.time; + cg.weaponSelect = 1; +} + + +//PKMOD - Ergodic 03/01/01 dragon deploy pka weapon +/* +=================== +CG_Weapon_DragonDeploy + +Mount the current PKA weapon on the dragon + + if dragon's ammo = -1 then no weapon is being deployed + else weapon number (- ammo) == the weapon_t enum +=================== +*/ +void CG_Weapon_DragonDeploy( void ){ + char command[128]; + int deployNumber; + + //PKMOD - Ergodic 08/29/01 - debug (inactive) +// Com_Printf( "CG_Weapon_DragonDeploy - ps.generic1:%d, predictedPlayerState.generic1:%d\n", cg.snap->ps.generic1, cg.predictedPlayerState.generic1 ); + + //PKMOD - Ergodic 06/28/01 - turn off dragon deploy if enabled + if ( ( cg.weaponSelect == WP_GRAPPLING_HOOK ) && ( ( cg.snap->ps.generic1 & 15 ) > 0 ) ) { + Com_sprintf( command, 128, "gdeploy 0" ); + trap_SendClientCommand( command ); + //set the weapon to the dragon + cg.weaponSelect = WP_GRAPPLING_HOOK; + cg.weaponSelectTime = cg.time; + return; + } + + //check if player has a dragon in the inventory + if ( ! ( cg.snap->ps.stats[STAT_WEAPONS] & ( 1 << WP_GRAPPLING_HOOK ) ) ) { + return; // don't have the weapon + } + + //PKMOD - Ergodic 05/08/01 - change logic structure to "if" from "switch" + //PKMOD - Ergodic 08/29/01 - cchange logic to include flag carrying + //PKMOD - Ergodic 12/15/01 - add gauntlet to deployable weapon list + //PKMOD - Ergodic 03/12/02 - optimize selction logic + if ( (( cg.weaponSelect >= WP_GRAVITY ) && ( cg.weaponSelect <= WP_BEANS ) ) || + ( cg.weaponSelect == WP_GAUNTLET ) ) { + deployNumber = cg.weaponSelect; + + //PKMOD - Ergodic 12/15/01 - only check the ammo if not the gauntlet + if ( deployNumber != WP_GAUNTLET ) { + + //PKMOD - Ergodic 07/22/01 - check if player has ammo - to fix infinite ammo bug + if ( cg.snap->ps.ammo[ cg.weaponSelect ] < 1 ) { + return; // don't have the required ammo + } + } + } + else { + //PKMOD - Ergodic 08/29/01 - check if player is carrying the flag + if ( cg.snap->ps.powerups[PW_BLUEFLAG] ) + deployNumber = PW_BLUEFLAG; + else if ( cg.snap->ps.powerups[PW_REDFLAG] ) + deployNumber = PW_REDFLAG; + else + return; //exit since current weapon or flag can not be deployed + + } + + //++++ + //here if weapon can be deployed + //++++ + + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "CG_Weapon_DragonDeploy - valid deployable weapon\n" ); + + + //here if weapon can be deployed + + //set the dragon ammo to be the negative of the weapon number +// cg.predictedPlayerState.ammo[WP_GRAPPLING_HOOK] = 0 - cg.weaponSelect; + + //PKMOD - Ergodic 07/22/01 - debug infinite ammo (inactive) +// Com_Printf( "CG_Weapon_DragonDeploy - cg.weaponSelect:%d, ammo:%d\n", cg.weaponSelect, cg.snap->ps.ammo[ cg.weaponSelect ] ); + + //PKMOD - Ergodic 08/13/01 - Debug dragon infinite (inactive) +// Com_Printf("CG_Weapon_DragonDeploy - weaponSelect>%d<, ammo>%d<\n", cg.weaponSelect, cg.snap->ps.ammo[cg.weaponSelect] ); + + //PKMOD - Ergodic 03/03/01 - set generic1 to the alternate weapon +// cg.snap->ps.generic1 = cg.weaponSelect; +// cg.predictedPlayerState.generic1 = cg.weaponSelect; + + //PKMOD - Ergodic 02/20/04 - debug infinite flag bug (inactive) + //Com_Printf( "CG_Weapon_DragonDeploy - deployNumber>%d<\n", deployNumber ); + + + + Com_sprintf( command, 128, "gdeploy %i", deployNumber ); + trap_SendClientCommand( command ); + + //PKMOD - Ergodic 03/02/01 - debug (inactive) +// Com_Printf( "CG_Weapon_DragonDeploy - setting weapon to %d\n", cg.weaponSelect ); + + //set the weapon to the dragon + cg.weaponSelect = WP_GRAPPLING_HOOK; + cg.weaponSelectTime = cg.time; +} + + +/* +=================================================================================================== + +WEAPON EVENTS + +=================================================================================================== +*/ + +/* +================ +CG_FireWeapon + +Caused by an EV_FIRE_WEAPON event +================ +*/ +void CG_FireWeapon( centity_t *cent ) { + entityState_t *ent; + int c; + weaponInfo_t *weap; + + + //PKMOD - Ergodic 10/14/01 - debug radiation effect (inactive) + //PKMOD - Ergodic 10/20/01 - update to punctuate the radiation effect (inactive) +// if ( cent->PKA_RadiateTime < cg.time ) { +// CG_Radiation( cg.snap->ps.origin ); +// cent->PKA_RadiateTime = cg.time + 1000; //every 1 seconds +// } + + //PKMOD - Ergodic 08/21/01 - debug infinite ammo bug (inactive) +// Com_Printf("CG_FireWeapon - firing weapon\n" ); + + ent = ¢->currentState; + if ( ent->weapon == WP_NONE ) { + return; + } + if ( ent->weapon >= WP_NUM_WEAPONS ) { + CG_Error( "CG_FireWeapon: ent->weapon >= WP_NUM_WEAPONS" ); + return; + } + weap = &cg_weapons[ ent->weapon ]; + + // mark the entity as muzzle flashing, so when it is added it will + // append the flash to the weapon model + //PKMOD - Ergodic 11/12/00 add 200 msecs to the airfist flashtime + //PKMOD - Ergodic 11/16/00 add multiple flash models depending on airfist_level + if ( ent->weapon == WP_AIRFIST ) { + trace_t tr; + int sourceContentType; + vec3_t af_forward; + vec3_t af_end; + vec3_t af_muzzle; + + cent->muzzleFlashTime = cg.time + 200; + //PKMOD - Ergodic 07/07/01 - use new packing scheme to encode airfist level + switch ( ( cent->currentState.time2 >> 4 ) & 7) { + case 4: + weap->flashModel = cgs.media.airfist4FlashModel; + break; + case 3: + weap->flashModel = cgs.media.airfist3FlashModel; + break; + case 2: + weap->flashModel = cgs.media.airfist2FlashModel; + break; + case 1: + weap->flashModel = cgs.media.airfist1FlashModel; + break; + default: + weap->flashModel = cgs.media.airfist0FlashModel; + break; + } + + //PKMOD - Ergodic 07/01/01 - determine which airfist sound to play + VectorCopy( cg.snap->ps.origin, af_muzzle ); + af_muzzle[2] += cg.snap->ps.viewheight; + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( cg.snap->ps.viewangles, af_forward, NULL, NULL ); + AngleVectorsForward( cg.snap->ps.viewangles, af_forward ); + VectorMA( af_muzzle, 14, af_forward, af_muzzle ); + VectorMA( af_muzzle, 10, af_forward, af_end ); + + CG_Trace( &tr, af_muzzle, NULL, NULL, af_end, cg.predictedPlayerState.clientNum, MASK_SHOT ); + sourceContentType = trap_CM_PointContents( af_muzzle, 0 ); + + // FIXME: should probably move this cruft into CG_BubbleTrail + if ( sourceContentType & CONTENTS_WATER ) { + if ( cg.snap->ps.ammo[ WP_AIRFIST ] ) + weap->flashSound[0] = cgs.media.sfx_pkaairfistwaterfire; + else + weap->flashSound[0] = cgs.media.sfx_pkaairfistwaterempty; + } + else { + if ( cg.snap->ps.ammo[ WP_AIRFIST ] ) + weap->flashSound[0] = cgs.media.sfx_pkaairfistfire; + else + weap->flashSound[0] = cgs.media.sfx_pkaairfistempty; + } + + + } + else + cent->muzzleFlashTime = cg.time; + + // lightning gun only does this this on initial press + if ( ent->weapon == WP_LIGHTNING ) { + if ( cent->pe.lightningFiring ) { + return; + } + } + + // play quad sound if needed + if ( cent->currentState.powerups & ( 1 << PW_QUAD ) ) { + trap_S_StartSound (NULL, cent->currentState.number, CHAN_ITEM, cgs.media.quadSound ); + } + + // play a sound + for ( c = 0 ; c < 4 ; c++ ) { + if ( !weap->flashSound[c] ) { + break; + } + } + if ( c > 0 ) { + c = rand() % c; + if ( weap->flashSound[c] ) + { + trap_S_StartSound( NULL, ent->number, CHAN_WEAPON, weap->flashSound[c] ); + } + } + + // do brass ejection + if ( weap->ejectBrassFunc && cg_brassTime.integer > 0 ) { + weap->ejectBrassFunc( cent ); + } +} + + +/* +================= +CG_MissileHitWall + +Caused by an EV_MISSILE_MISS event, or directly by local bullet tracing +================= +*/ +void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType ) { + qhandle_t mod; + qhandle_t mark; + qhandle_t shader; + sfxHandle_t sfx; + float radius; + float light; + vec3_t lightColor; + localEntity_t *le; + int r; + qboolean alphaFade; + qboolean isSprite; + int duration; + vec3_t sprOrg; + vec3_t sprVel; + + mark = 0; + radius = 32; + sfx = 0; + mod = 0; + shader = 0; + light = 0; + lightColor[0] = 1; + lightColor[1] = 1; + lightColor[2] = 0; + + // set defaults + isSprite = qfalse; + duration = 600; + + //PKMOD - Ergodic 02/14/02 - debug weapon number (inactive) +// Com_Printf( "CG_MissileHitWall - weapon>%d<\n", weapon ); + + switch ( weapon ) { + default: +#ifdef MISSIONPACK + case WP_NAILGUN: + if( soundType == IMPACTSOUND_FLESH ) { + sfx = cgs.media.sfx_nghitflesh; + } else if( soundType == IMPACTSOUND_METAL ) { + sfx = cgs.media.sfx_nghitmetal; + } else { + sfx = cgs.media.sfx_nghit; + } + mark = cgs.media.holeMarkShader; + radius = 12; + break; +#endif + case WP_LIGHTNING: + // no explosion at LG impact, it is added with the beam + r = rand() & 3; + if ( r < 2 ) { + sfx = cgs.media.sfx_lghit2; + } else if ( r == 2 ) { + sfx = cgs.media.sfx_lghit1; + } else { + sfx = cgs.media.sfx_lghit3; + } + mark = cgs.media.holeMarkShader; + radius = 12; + break; +#ifdef MISSIONPACK + case WP_PROX_LAUNCHER: + mod = cgs.media.dishFlashModel; + shader = cgs.media.grenadeExplosionShader; + sfx = cgs.media.sfx_proxexp; + mark = cgs.media.burnMarkShader; + radius = 64; + light = 300; + isSprite = qtrue; + break; +#endif + case WP_GRENADE_LAUNCHER: + mod = cgs.media.dishFlashModel; + shader = cgs.media.grenadeExplosionShader; + sfx = cgs.media.sfx_rockexp; + mark = cgs.media.burnMarkShader; + radius = 64; + light = 300; + isSprite = qtrue; + break; + case WP_ROCKET_LAUNCHER: + mod = cgs.media.dishFlashModel; + shader = cgs.media.rocketExplosionShader; + sfx = cgs.media.sfx_rockexp; + mark = cgs.media.burnMarkShader; + radius = 64; + light = 300; + isSprite = qtrue; + duration = 1000; + lightColor[0] = 1; + lightColor[1] = 0.75; + lightColor[2] = 0.0; + if (cg_oldRocket.integer == 0) { + // explosion sprite animation + VectorMA( origin, 24, dir, sprOrg ); + VectorScale( dir, 64, sprVel ); + + CG_ParticleExplosion( "explode1", sprOrg, sprVel, 1400, 20, 30 ); + } + break; + case WP_RAILGUN: + mod = cgs.media.ringFlashModel; + shader = cgs.media.railExplosionShader; + sfx = cgs.media.sfx_plasmaexp; + mark = cgs.media.energyMarkShader; + radius = 24; + break; + case WP_PLASMAGUN: + mod = cgs.media.ringFlashModel; + shader = cgs.media.plasmaExplosionShader; + sfx = cgs.media.sfx_plasmaexp; + mark = cgs.media.energyMarkShader; + radius = 16; + break; + case WP_BFG: + mod = cgs.media.dishFlashModel; + shader = cgs.media.bfgExplosionShader; + sfx = cgs.media.sfx_rockexp; + mark = cgs.media.burnMarkShader; + radius = 32; + isSprite = qtrue; + break; + case WP_SHOTGUN: + mod = cgs.media.bulletFlashModel; + shader = cgs.media.bulletExplosionShader; + mark = cgs.media.bulletMarkShader; + sfx = 0; + radius = 4; + break; + +#ifdef MISSIONPACK + case WP_CHAINGUN: + mod = cgs.media.bulletFlashModel; + if( soundType == IMPACTSOUND_FLESH ) { + sfx = cgs.media.sfx_chghitflesh; + } else if( soundType == IMPACTSOUND_METAL ) { + sfx = cgs.media.sfx_chghitmetal; + } else { + sfx = cgs.media.sfx_chghit; + } + mark = cgs.media.bulletMarkShader; + + r = rand() & 3; + if ( r < 2 ) { + sfx = cgs.media.sfx_ric1; + } else if ( r == 2 ) { + sfx = cgs.media.sfx_ric2; + } else { + sfx = cgs.media.sfx_ric3; + } + + radius = 8; + break; +#endif + + case WP_MACHINEGUN: + mod = cgs.media.bulletFlashModel; + shader = cgs.media.bulletExplosionShader; + mark = cgs.media.bulletMarkShader; + + r = rand() & 3; + if ( r == 0 ) { + sfx = cgs.media.sfx_ric1; + } else if ( r == 1 ) { + sfx = cgs.media.sfx_ric2; + } else { + sfx = cgs.media.sfx_ric3; + } + + radius = 8; + break; + //PKMOD + /*PKMOD -Add Weapons. + WP_HARPOON, + WP_GRAVITY, + WP_SENTRY, + WP_BEARTRAP, + WP_CHAINLG, + WP_A2K, + WP_EMPNUKE, + WP_AIRFIST, + WP_NAILGUN, + PKMOD -Add Weapons. */ + case WP_GRAVITY: + //PKMOD Need shaders and SFX for this soon +// mark = cgs.media.burnMarkShader; +// mod = cgs.media.pkagravitylaunched; +// shader = cgs.media.rocketExplosionShader; +// sfx = cgs.media.sfx_pkagravitylaunched; + + +// mod = cgs.media.dishFlashModel; +// shader = cgs.media.grenadeExplosionShader; +// sfx = cgs.media.sfx_rockexp; +// mark = cgs.media.burnMarkShader; +// radius = 64; +// light = 300; +// isSprite = qtrue; + break; + case WP_SENTRY: + mod = cgs.media.bulletFlashModel; + shader = cgs.media.bulletExplosionShader; + mark = cgs.media.bulletMarkShader; + sfx = 0; + radius = 4; + break; + case WP_BEARTRAP: + mod = cgs.media.bulletFlashModel; + shader = cgs.media.bulletExplosionShader; + mark = cgs.media.bulletMarkShader; + sfx = cgs.media.sfx_pkabeartrapdrop; + radius = 4; + break; + case WP_CHAINLG: + //PKMOD rearrange for chain effect + // no explosion at lg impact, + r = rand() & 3; + if ( r < 2 ) { + sfx = cgs.media.sfx_lghit2; + } else if ( r == 2 ) { + sfx = cgs.media.sfx_lghit1; + } else { + sfx = cgs.media.sfx_lghit3; + } + mark = cgs.media.holeMarkShader; + radius = 12; + break; + case WP_AIRFIST: + //PKMOD probably remove mark altogether. Maybe add air mark + mark = cgs.media.holeMarkShader; + radius = 12; + break; + case WP_NAILGUN: + //PKMOD - Ergodic 08/01/00 set nailgun up correctly + mod = cgs.media.bulletFlashModel; + shader = cgs.media.nailImpactShader; + mark = cgs.media.nailMarkShader; + + //PKMOD - Ergodic 08/25/00 add new nailgun ricochet sounds + r = rand() & 63; //bias against sound #2 + if ( r == 0 ) { + sfx = cgs.media.sfx_nailrico2; + } else if ( r < 21 ) { + sfx = cgs.media.sfx_nailrico1; + } else if ( r < 41 ) { + sfx = cgs.media.sfx_nailrico3; + } else { + sfx = cgs.media.sfx_nailrico4; + } + + radius = 8; + break; +// case WP_NAILGUN + 128: +// //PKMOD - Ergodic 08/11/00 set nailgun hitting player +// mod = cgs.media.bulletFlashModel; +// shader = cgs.media.nailImpactShader; +// mark = cgs.media.nailMarkShader; +// +// r = rand() & 3; +// if ( r < 2 ) { +// sfx = cgs.media.sfx_ric1; +// } else if ( r == 2 ) { +// sfx = cgs.media.sfx_ric2; +// } else { +// sfx = cgs.media.sfx_ric3; +// } +// duration = 250; +// radius = 8; +// break; + case WP_EXPLODING_SHELLS: + mod = cgs.media.explshellsFlashModel; + + //PKMOD - Ergodic 01/16/01 - add multi-shaders for exploding shells + switch ( rand() % 6 ) { //random numbers: { 0, 1, 2, 3, 4, 5 } + case 0: + shader = cgs.media.shellsExplosionShader1; + break; + case 1: + shader = cgs.media.shellsExplosionShader2; + break; + case 2: + shader = cgs.media.shellsExplosionShader3; + break; + case 3: + shader = cgs.media.shellsExplosionShader4; + break; + case 4: + shader = cgs.media.shellsExplosionShader5; + break; + default: + shader = cgs.media.shellsExplosionShader6; + break; + } + + //PKMOD - Ergodic 02/14/02 - explosive shells hit sounds + //PKMOD - Ergodic 07/10/02 - add 2 more explosive shells hit sounds + switch ( rand() % 4 ) { //cases: 0, 1, 2, 3, 4 + case 0: + sfx = cgs.media.sfx_expgunhit1; + break; + case 1: + sfx = cgs.media.sfx_expgunhit2; + break; + case 2: + sfx = cgs.media.sfx_expgunhit3; + break; + case 3: + sfx = cgs.media.sfx_expgunhit4; + break; + default: + sfx = cgs.media.sfx_expgunhit5; + break; + } + + mark = cgs.media.burnMarkShader; + radius = 16; + light = 25; + //PKMOD - Ergodic 01/16/01 not a sprite anymore because sprite size seems too big +// isSprite = qtrue; + duration = 700; + lightColor[0] = 1; + lightColor[1] = 0.75; + lightColor[2] = 0.0; + break; + + } + //PKMOD + + if ( sfx ) { + trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, sfx ); + } + + // + // create the explosion + // + if ( mod ) { + le = CG_MakeExplosion( origin, dir, + mod, shader, + duration, isSprite ); + le->light = light; + VectorCopy( lightColor, le->lightColor ); + if ( weapon == WP_RAILGUN ) { + // colorize with client color + VectorCopy( cgs.clientinfo[clientNum].color1, le->color ); + } + } + + // + // impact mark + // + alphaFade = (mark == cgs.media.energyMarkShader); // plasma fades alpha, all others fade color + if ( weapon == WP_RAILGUN ) { + float *color; + + // colorize with client color + color = cgs.clientinfo[clientNum].color2; + CG_ImpactMark( mark, origin, dir, random()*360, color[0],color[1], color[2],1, alphaFade, radius, qfalse ); + } else { + CG_ImpactMark( mark, origin, dir, random()*360, 1,1,1,1, alphaFade, radius, qfalse ); + } +} + + +/* +================= +CG_MissileHitPlayer +================= +*/ +void CG_MissileHitPlayer( int weapon, vec3_t origin, vec3_t dir, int entityNum ) { + CG_Bleed( origin, entityNum ); + + // some weapons will make an explosion with the blood, while + // others will just make the blood + switch ( weapon ) { +// //PKMOD - Ergodic 08/11/00 - add impact on player from nail +// commentary - this code does not work visually, due to player movements +// - and will be removed +// case WP_NAILGUN: +// CG_MissileHitWall( weapon + 128, 0, origin, dir ); //Weapon hack + case WP_GRENADE_LAUNCHER: + case WP_ROCKET_LAUNCHER: + CG_MissileHitWall( weapon, 0, origin, dir, IMPACTSOUND_FLESH ); + break; + default: + break; + } +} + + + +/* +============================================================================ + +SHOTGUN TRACING + +============================================================================ +*/ + +/* +================ +CG_ShotgunPellet +================ +*/ +//PKMOD - Ergodic 06/18/00 change the call parameters to add in weapon argument +static void CG_ShotgunPellet( vec3_t start, vec3_t end, int skipNum, int weapon ) { + trace_t tr; + int sourceContentType, destContentType; + + CG_Trace( &tr, start, NULL, NULL, end, skipNum, MASK_SHOT ); + + sourceContentType = trap_CM_PointContents( start, 0 ); + destContentType = trap_CM_PointContents( tr.endpos, 0 ); + + // FIXME: should probably move this cruft into CG_BubbleTrail + if ( sourceContentType == destContentType ) { + if ( sourceContentType & CONTENTS_WATER ) { + CG_BubbleTrail( start, tr.endpos, 32 ); + } + } else if ( sourceContentType & CONTENTS_WATER ) { + trace_t trace; + + trap_CM_BoxTrace( &trace, end, start, NULL, NULL, 0, CONTENTS_WATER ); + CG_BubbleTrail( start, trace.endpos, 32 ); + } else if ( destContentType & CONTENTS_WATER ) { + trace_t trace; + + trap_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, CONTENTS_WATER ); + CG_BubbleTrail( tr.endpos, trace.endpos, 32 ); + } + + if ( tr.surfaceFlags & SURF_NOIMPACT ) { + return; + } + + //PKMOD - Ergodic 06/18/00 change the call argument from WP_SHOTGUN to weapon + if ( cg_entities[tr.entityNum].currentState.eType == ET_PLAYER ) { + CG_MissileHitPlayer( weapon, tr.endpos, tr.plane.normal, tr.entityNum ); + } else { + if ( tr.surfaceFlags & SURF_NOIMPACT ) { + // SURF_NOIMPACT will not make a flame puff or a mark + return; + } + if ( tr.surfaceFlags & SURF_METALSTEPS ) { + //PKMOD - Ergodic 06/18/00 change the call argument from WP_SHOTGUN to weapon + //PKMOD - Ergodic 01/16/01 - fixed missing exploding shells graphic + CG_MissileHitWall( weapon, 0, tr.endpos, tr.plane.normal, IMPACTSOUND_METAL ); + } else { + //PKMOD - Ergodic 06/18/00 change the call argument from WP_SHOTGUN to weapon + //PKMOD - Ergodic 01/16/01 - fixed missing exploding shells graphic + CG_MissileHitWall( weapon, 0, tr.endpos, tr.plane.normal, IMPACTSOUND_DEFAULT ); + } + } +} + +/* +================ +CG_ShotgunPattern + +Perform the same traces the server did to locate the +hit splashes +================ +*/ +//PKMOD - Ergodic 06/18/00 change the call parameters to add in weapon argument +//PKMOD - Ergodic 10/31/02 - Q3A Ver 1.32 change the call parameters to add in seed +static void CG_ShotgunPattern( vec3_t origin, vec3_t origin2, int seed, int otherEntNum, int weapon ) { + int i; + float r, u; + vec3_t end; + vec3_t forward, right, up; + //PKMOD - Ergodic 01/16/01 make the exploding shells tighter in spread + int spread; + int count; + //PKMOD - Ergodic 01/20/01 - debug shotgun origin +// vec3_t backward; + //PKMOD - Ergodic 01/22/01 - optimize the end location + vec3_t hold_end; + + // derive the right and up vectors from the forward vector, because + // the client won't have any other information + VectorNormalize2( origin2, forward ); + PerpendicularVector( right, forward ); + CrossProduct( forward, right, up ); + //PKMOD - Ergodic 01/16/01 make the exploding shells tighter in spread + //PKMOD - Ergodic 01/18/01 make the pellet counts equal + if ( weapon == WP_EXPLODING_SHELLS ) { + spread = DEFAULT_SHOTGUN_SPREAD * 12; + count = DEFAULT_SHOTGUN_COUNT; + VectorMA( origin, 8192 * 12, forward, hold_end); + } + else { + spread = DEFAULT_SHOTGUN_SPREAD * 16; //default spread + count = DEFAULT_SHOTGUN_COUNT; + VectorMA( origin, 8192 * 16, forward, hold_end); + } + + //PKMOD - Ergodic 01/20/01 - debug shotgun origin +// VectorSet(backward, 0,0,0); +// VectorMA(backward, -1, forward, backward); +// CG_MissileHitWall( weapon, 0, origin, backward, IMPACTSOUND_METAL ); + + // generate the "random" spread pattern + for ( i = 0 ; i < count ; i++ ) { + //PKMOD - Ergodic Debug - only 1 pellet +// for ( i = 0 ; i < 1 ; i++ ) { + //PKMOD - Ergodic 01/16/01 make the exploding shells tighter in spread + r = Q_crandom( &seed ) * spread; + u = Q_crandom( &seed ) * spread; + + VectorCopy( hold_end, end ); + VectorMA (end, r, right, end); + VectorMA (end, u, up, end); + + CG_ShotgunPellet( origin, end, otherEntNum, weapon ); + } +} + +/* +============== +CG_ShotgunFire +============== +*/ +void CG_ShotgunFire( entityState_t *es ) { + vec3_t v; + int contents; + + VectorSubtract( es->origin2, es->pos.trBase, v ); + VectorNormalize( v ); + VectorScale( v, 32, v ); + VectorAdd( es->pos.trBase, v, v ); + if ( cgs.glconfig.hardwareType != GLHW_RAGEPRO ) { + // ragepro can't alpha fade, so don't even bother with smoke + vec3_t up; + + contents = trap_CM_PointContents( es->pos.trBase, 0 ); + if ( !( contents & CONTENTS_WATER ) ) { + VectorSet( up, 0, 0, 8 ); + CG_SmokePuff( v, up, 32, 1, 1, 1, 0.33f, 900, cg.time, 0, LEF_PUFF_DONT_SCALE, cgs.media.shotgunSmokePuffShader ); + } + } + +//PKMOD - Ergodic 06/18/00 change the call parameters to add in weapon argument +//PKMOD - Ergodic 10/31/02 - Q3A Ver 1.32 change the call parameters to add in es->eventParm as the seed + CG_ShotgunPattern( es->pos.trBase, es->origin2, es->eventParm, es->otherEntityNum, es->weapon ); +} + +/* +============================================================================ + +BULLETS + +============================================================================ +*/ + + +/* +=============== +CG_Tracer +=============== +*/ +//PKMOD - Ergodic 03/26/01 - add autosentry into CG_Tracer, autosentrys produce +// larger traces +void CG_Tracer( vec3_t source, vec3_t dest, qboolean autosentry ) { + vec3_t forward, right; + polyVert_t verts[4]; + vec3_t line; + float len, begin, end; + vec3_t start, finish; + vec3_t midpoint; + //PKMOD - Ergodic 03/26/01 - add autosentry tracer hold values + float pkatracerLength, pkatracerWidth; + + if ( autosentry ) { + pkatracerLength = 150.0f; //default = 100.0 + pkatracerWidth = 2.5f; //default = 1.0 + } + else { + pkatracerLength = cg_tracerLength.value; + pkatracerWidth = cg_tracerWidth.value; + } + + // tracer + VectorSubtract( dest, source, forward ); + len = VectorNormalize( forward ); + + // start at least a little ways from the muzzle + if ( len < 100 ) { + return; + } + begin = 50 + random() * (len - 60); + end = begin + pkatracerLength; + if ( end > len ) { + end = len; + } + VectorMA( source, begin, forward, start ); + VectorMA( source, end, forward, finish ); + + line[0] = DotProduct( forward, cg.refdef.viewaxis[1] ); + line[1] = DotProduct( forward, cg.refdef.viewaxis[2] ); + + VectorScale( cg.refdef.viewaxis[1], line[1], right ); + VectorMA( right, -line[0], cg.refdef.viewaxis[2], right ); + VectorNormalize( right ); + + VectorMA( finish, pkatracerWidth, right, verts[0].xyz ); + verts[0].st[0] = 0; + verts[0].st[1] = 1; + verts[0].modulate[0] = 255; + verts[0].modulate[1] = 255; + verts[0].modulate[2] = 255; + verts[0].modulate[3] = 255; + + VectorMA( finish, -pkatracerWidth, right, verts[1].xyz ); + verts[1].st[0] = 1; + verts[1].st[1] = 0; + verts[1].modulate[0] = 255; + verts[1].modulate[1] = 255; + verts[1].modulate[2] = 255; + verts[1].modulate[3] = 255; + + VectorMA( start, -pkatracerWidth, right, verts[2].xyz ); + verts[2].st[0] = 1; + verts[2].st[1] = 1; + verts[2].modulate[0] = 255; + verts[2].modulate[1] = 255; + verts[2].modulate[2] = 255; + verts[2].modulate[3] = 255; + + VectorMA( start, pkatracerWidth, right, verts[3].xyz ); + verts[3].st[0] = 0; + verts[3].st[1] = 0; + verts[3].modulate[0] = 255; + verts[3].modulate[1] = 255; + verts[3].modulate[2] = 255; + verts[3].modulate[3] = 255; + + trap_R_AddPolyToScene( cgs.media.tracerShader, 4, verts ); + + midpoint[0] = ( start[0] + finish[0] ) * 0.5; + midpoint[1] = ( start[1] + finish[1] ) * 0.5; + midpoint[2] = ( start[2] + finish[2] ) * 0.5; + + // add the tracer sound + trap_S_StartSound( midpoint, ENTITYNUM_WORLD, CHAN_AUTO, cgs.media.tracerSound ); + +} + + +/* +====================== +CG_CalcMuzzlePoint +====================== +*/ +static qboolean CG_CalcMuzzlePoint( int entityNum, vec3_t muzzle ) { + vec3_t forward; + centity_t *cent; + int anim; + + if ( entityNum == cg.snap->ps.clientNum ) { + VectorCopy( cg.snap->ps.origin, muzzle ); + muzzle[2] += cg.snap->ps.viewheight; + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( cg.snap->ps.viewangles, forward, NULL, NULL ); + AngleVectorsForward( cg.snap->ps.viewangles, forward ); + VectorMA( muzzle, 14, forward, muzzle ); + return qtrue; + } + + cent = &cg_entities[entityNum]; + if ( !cent->currentValid ) { + return qfalse; + } + + VectorCopy( cent->currentState.pos.trBase, muzzle ); + + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( cent->currentState.apos.trBase, forward, NULL, NULL ); + AngleVectorsForward( cent->currentState.apos.trBase, forward ); + anim = cent->currentState.legsAnim & ~ANIM_TOGGLEBIT; + if ( anim == LEGS_WALKCR || anim == LEGS_IDLECR ) { + muzzle[2] += CROUCH_VIEWHEIGHT; + } else { + muzzle[2] += DEFAULT_VIEWHEIGHT; + } + + VectorMA( muzzle, 14, forward, muzzle ); + + return qtrue; + +} + +/* +====================== +CG_Bullet + +Renders bullet effects. +====================== +*/ +//PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability +void CG_Bullet( vec3_t end, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum, qboolean autosentry ) { + trace_t trace; + int sourceContentType, destContentType; + vec3_t start; + + // if the shooter is currently valid, calc a source point and possibly + // do trail effects + if ( sourceEntityNum >= 0 && cg_tracerChance.value > 0 ) { + if ( CG_CalcMuzzlePoint( sourceEntityNum, start ) ) { + sourceContentType = trap_CM_PointContents( start, 0 ); + destContentType = trap_CM_PointContents( end, 0 ); + + // do a complete bubble trail if necessary + if ( ( sourceContentType == destContentType ) && ( sourceContentType & CONTENTS_WATER ) ) { + CG_BubbleTrail( start, end, 32 ); + } + // bubble trail from water into air + else if ( ( sourceContentType & CONTENTS_WATER ) ) { + trap_CM_BoxTrace( &trace, end, start, NULL, NULL, 0, CONTENTS_WATER ); + CG_BubbleTrail( start, trace.endpos, 32 ); + } + // bubble trail from air into water + else if ( ( destContentType & CONTENTS_WATER ) ) { + trap_CM_BoxTrace( &trace, start, end, NULL, NULL, 0, CONTENTS_WATER ); + CG_BubbleTrail( end, trace.endpos, 32 ); + } + + // draw a tracer + //PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability + if ( autosentry ) { + if ( random() < 0.90 ) { + //PKMOD - Ergodic 03/26/01 - add autosentry into CG_Tracer + CG_Tracer( start, end, autosentry ); + } + } + else if ( random() < cg_tracerChance.value ) { + //PKMOD - Ergodic 03/26/01 - add autosentry into CG_Tracer + CG_Tracer( start, end, autosentry ); + } + } + } + + // impact splash and mark + if ( flesh ) { + CG_Bleed( end, fleshEntityNum ); + } else { + CG_MissileHitWall( WP_MACHINEGUN, 0, end, normal, IMPACTSOUND_DEFAULT ); + } + +} + + diff --git a/quake3/source/code/cgame/cgame.bat b/quake3/source/code/cgame/cgame.bat new file mode 100644 index 0000000..21090cd --- /dev/null +++ b/quake3/source/code/cgame/cgame.bat @@ -0,0 +1,68 @@ +set LIBRARY= +set INCLUDE= + +mkdir vm +cd vm + +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../game/bg_misc.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../game/bg_pmove.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../game/bg_slidemove.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../game/bg_lib.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../game/q_math.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../game/q_shared.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_consolecmds.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_draw.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_drawtools.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_effects.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_ents.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_event.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_info.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_localents.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_main.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_marks.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_players.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_playerstate.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_predict.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_scoreboard.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_servercmds.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_snapshot.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_view.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_weapons.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../../ui/ui_shared.c +@if errorlevel 1 goto quit +lcc -DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui ../cg_newdraw.c +@if errorlevel 1 goto quit + +q3asm -f ../cgame + +rem copy the qvm to a staging area... +rem copy \quake3\baseq3\vm\cgame.qvm c:\workmb\pkarena31\pkarena0\vm\cgame.qvm + +echo "Compilation was successful!" + +:quit +cd .. diff --git a/quake3/source/code/cgame/cgame.def b/quake3/source/code/cgame/cgame.def new file mode 100644 index 0000000..01861ba --- /dev/null +++ b/quake3/source/code/cgame/cgame.def @@ -0,0 +1,3 @@ +EXPORTS + vmMain + dllEntry diff --git a/quake3/source/code/cgame/cgame.dsp b/quake3/source/code/cgame/cgame.dsp new file mode 100644 index 0000000..f7fc37a --- /dev/null +++ b/quake3/source/code/cgame/cgame.dsp @@ -0,0 +1,344 @@ +# Microsoft Developer Studio Project File - Name="cgame" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 5.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=cgame - Win32 Debug TA +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "cgame.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "cgame.mak" CFG="cgame - Win32 Debug TA" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cgame - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "cgame - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "cgame - Win32 Release TA" (based on\ + "Win32 (x86) Dynamic-Link Library") +!MESSAGE "cgame - Win32 Debug TA" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP Scc_ProjName ""$/MissionPack/code/cgame", NPAAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cgame - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /G6 /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /machine:I386 /out:"../Release/cgamex86.dll" +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /G5 /MTd /W3 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /ZI /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /debug /machine:I386 /out:"../Debug/cgamex86.dll" +# SUBTRACT LINK32 /profile /nodefaultlib + +!ELSEIF "$(CFG)" == "cgame - Win32 Release TA" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "cgame___Win32_Release_TA" +# PROP BASE Intermediate_Dir "cgame___Win32_Release_TA" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TA" +# PROP Intermediate_Dir "Release_TA" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /G6 /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /G6 /W4 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "MISSIONPACK" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /machine:I386 /out:"../Release/cgamex86.dll" +# SUBTRACT BASE LINK32 /debug +# ADD LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /machine:I386 /out:"../Release_TA/cgamex86.dll" +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug TA" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "cgame___Win32_Debug_TA" +# PROP BASE Intermediate_Dir "cgame___Win32_Debug_TA" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_TA" +# PROP Intermediate_Dir "Debug_TA" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /G5 /MTd /W3 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /ZI /c +# ADD CPP /nologo /G5 /MTd /W3 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /ZI /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /debug /machine:I386 /out:"..\Debug/cgamex86.dll" +# SUBTRACT BASE LINK32 /profile /nodefaultlib +# ADD LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /debug /machine:I386 /def:".\cgame.def" /out:"..\Debug_TA\cgamex86.dll" +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "cgame - Win32 Release" +# Name "cgame - Win32 Debug" +# Name "cgame - Win32 Release TA" +# Name "cgame - Win32 Debug TA" +# Begin Group "Source Files" + +# PROP Default_Filter "c" +# Begin Source File + +SOURCE=..\game\bg_lib.c + +!IF "$(CFG)" == "cgame - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "cgame - Win32 Release TA" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug TA" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\game\bg_misc.c +# End Source File +# Begin Source File + +SOURCE=..\game\bg_pmove.c +# End Source File +# Begin Source File + +SOURCE=..\game\bg_slidemove.c +# End Source File +# Begin Source File + +SOURCE=.\cg_consolecmds.c +# End Source File +# Begin Source File + +SOURCE=.\cg_draw.c +# End Source File +# Begin Source File + +SOURCE=.\cg_drawtools.c +# End Source File +# Begin Source File + +SOURCE=.\cg_effects.c +# End Source File +# Begin Source File + +SOURCE=.\cg_ents.c +# End Source File +# Begin Source File + +SOURCE=.\cg_event.c +# End Source File +# Begin Source File + +SOURCE=.\cg_info.c +# End Source File +# Begin Source File + +SOURCE=.\cg_localents.c +# End Source File +# Begin Source File + +SOURCE=.\cg_main.c +# End Source File +# Begin Source File + +SOURCE=.\cg_marks.c +# End Source File +# Begin Source File + +SOURCE=.\cg_newDraw.c + +!IF "$(CFG)" == "cgame - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "cgame - Win32 Release TA" + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug TA" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\cg_players.c +# End Source File +# Begin Source File + +SOURCE=.\cg_playerstate.c +# End Source File +# Begin Source File + +SOURCE=.\cg_predict.c +# End Source File +# Begin Source File + +SOURCE=.\cg_scoreboard.c +# End Source File +# Begin Source File + +SOURCE=.\cg_servercmds.c +# End Source File +# Begin Source File + +SOURCE=.\cg_snapshot.c +# End Source File +# Begin Source File + +SOURCE=.\cg_syscalls.c +# End Source File +# Begin Source File + +SOURCE=.\cg_view.c +# End Source File +# Begin Source File + +SOURCE=.\cg_weapons.c +# End Source File +# Begin Source File + +SOURCE=..\game\q_math.c +# End Source File +# Begin Source File + +SOURCE=..\game\q_shared.c +# End Source File +# Begin Source File + +SOURCE=..\ui\ui_shared.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h" +# Begin Source File + +SOURCE=..\game\bg_public.h +# End Source File +# Begin Source File + +SOURCE=.\cg_local.h +# End Source File +# Begin Source File + +SOURCE=.\cg_public.h +# End Source File +# Begin Source File + +SOURCE=..\game\q_shared.h +# End Source File +# Begin Source File + +SOURCE=..\game\surfaceflags.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\cgame.def + +!IF "$(CFG)" == "cgame - Win32 Release" + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug" + +!ELSEIF "$(CFG)" == "cgame - Win32 Release TA" + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug TA" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/quake3/source/code/cgame/cgame.plg b/quake3/source/code/cgame/cgame.plg new file mode 100644 index 0000000..96155c2 --- /dev/null +++ b/quake3/source/code/cgame/cgame.plg @@ -0,0 +1,16 @@ +--------------------Configuration: cgame - Win32 Debug TA-------------------- +Begining build with project "C:\quake3\source\code\cgame\cgame.dsp", with item "cg_servercmds.c" +Active configuration is Win32 (x86) Dynamic-Link Library (based on Win32 (x86) Dynamic-Link Library) + + +Creating temp file "C:\DOCUME~1\brights\LOCALS~1\Temp\RSP81.tmp" with contents +Creating command line "cl.exe @C:\DOCUME~1\brights\LOCALS~1\Temp\RSP81.tmp" +Compiling... +Command line warning D4002 : ignoring unknown option '/ZI' +cg_servercmds.c + + + +cg_servercmds.obj - 0 error(s), 1 warning(s) diff --git a/quake3/source/code/cgame/cgame.q3asm b/quake3/source/code/cgame/cgame.q3asm new file mode 100644 index 0000000..bec4c4e --- /dev/null +++ b/quake3/source/code/cgame/cgame.q3asm @@ -0,0 +1,28 @@ +-o "\quake3\baseq3\vm\cgame" +cg_main +..\cg_syscalls +cg_consolecmds +cg_draw +cg_drawtools +cg_effects +cg_ents +cg_event +cg_info +cg_localents +cg_marks +cg_players +cg_playerstate +cg_predict +cg_scoreboard +cg_servercmds +cg_snapshot +cg_view +cg_weapons +bg_slidemove +bg_pmove +bg_lib +bg_misc +q_math +q_shared +ui_shared +cg_newdraw diff --git a/quake3/source/code/cgame/cgame_ta.bat b/quake3/source/code/cgame/cgame_ta.bat new file mode 100644 index 0000000..266e017 --- /dev/null +++ b/quake3/source/code/cgame/cgame_ta.bat @@ -0,0 +1,65 @@ +rem make sure we have a safe environement +set LIBRARY= +set INCLUDE= + +mkdir vm +cd vm +set cc=lcc -DQ3_VM -DMISSIONPACK -DCGAME -S -Wf-target=bytecode -Wf-g -I..\..\cgame -I..\..\game -I..\..\ui %1 + +%cc% ../../game/bg_misc.c +@if errorlevel 1 goto quit +%cc% ../../game/bg_pmove.c +@if errorlevel 1 goto quit +%cc% ../../game/bg_slidemove.c +@if errorlevel 1 goto quit +%cc% ../../game/bg_lib.c +@if errorlevel 1 goto quit +%cc% ../../game/q_math.c +@if errorlevel 1 goto quit +%cc% ../../game/q_shared.c +@if errorlevel 1 goto quit +%cc% ../cg_consolecmds.c +@if errorlevel 1 goto quit +%cc% ../cg_draw.c +@if errorlevel 1 goto quit +%cc% ../cg_drawtools.c +@if errorlevel 1 goto quit +%cc% ../cg_effects.c +@if errorlevel 1 goto quit +%cc% ../cg_ents.c +@if errorlevel 1 goto quit +%cc% ../cg_event.c +@if errorlevel 1 goto quit +%cc% ../cg_info.c +@if errorlevel 1 goto quit +%cc% ../cg_localents.c +@if errorlevel 1 goto quit +%cc% ../cg_main.c +@if errorlevel 1 goto quit +%cc% ../cg_marks.c +@if errorlevel 1 goto quit +%cc% ../cg_players.c +@if errorlevel 1 goto quit +%cc% ../cg_playerstate.c +@if errorlevel 1 goto quit +%cc% ../cg_predict.c +@if errorlevel 1 goto quit +%cc% ../cg_scoreboard.c +@if errorlevel 1 goto quit +%cc% ../cg_servercmds.c +@if errorlevel 1 goto quit +%cc% ../cg_snapshot.c +@if errorlevel 1 goto quit +%cc% ../cg_view.c +@if errorlevel 1 goto quit +%cc% ../cg_weapons.c +@if errorlevel 1 goto quit +%cc% ../../ui/ui_shared.c +@if errorlevel 1 goto quit +%cc% ../cg_newdraw.c +@if errorlevel 1 goto quit + + +q3asm -f ../cgame_ta +:quit +cd .. diff --git a/quake3/source/code/cgame/cgame_ta.q3asm b/quake3/source/code/cgame/cgame_ta.q3asm new file mode 100644 index 0000000..8b14ed9 --- /dev/null +++ b/quake3/source/code/cgame/cgame_ta.q3asm @@ -0,0 +1,28 @@ +-o "\quake3\missionpack\vm\cgame" +cg_main +..\cg_syscalls +cg_consolecmds +cg_draw +cg_drawtools +cg_effects +cg_ents +cg_event +cg_info +cg_localents +cg_marks +cg_players +cg_playerstate +cg_predict +cg_scoreboard +cg_servercmds +cg_snapshot +cg_view +cg_weapons +bg_slidemove +bg_pmove +bg_lib +bg_misc +q_math +q_shared +ui_shared +cg_newdraw diff --git a/quake3/source/code/cgame/tr_types.h b/quake3/source/code/cgame/tr_types.h new file mode 100644 index 0000000..a771145 --- /dev/null +++ b/quake3/source/code/cgame/tr_types.h @@ -0,0 +1,209 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +#ifndef __TR_TYPES_H +#define __TR_TYPES_H + + +#define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces +#define MAX_ENTITIES 1023 // can't be increased without changing drawsurf bit packing + +// renderfx flags +#define RF_MINLIGHT 1 // allways have some light (viewmodel, some items) +#define RF_THIRD_PERSON 2 // don't draw through eyes, only mirrors (player bodies, chat sprites) +#define RF_FIRST_PERSON 4 // only draw through eyes (view weapon, damage blood blob) +#define RF_DEPTHHACK 8 // for view weapon Z crunching +#define RF_NOSHADOW 64 // don't add stencil shadows + +#define RF_LIGHTING_ORIGIN 128 // use refEntity->lightingOrigin instead of refEntity->origin + // for lighting. This allows entities to sink into the floor + // with their origin going solid, and allows all parts of a + // player to get the same lighting +#define RF_SHADOW_PLANE 256 // use refEntity->shadowPlane +#define RF_WRAP_FRAMES 512 // mod the model frames by the maxframes to allow continuous + // animation without needing to know the frame count + +// refdef flags +#define RDF_NOWORLDMODEL 1 // used for player configuration screen +#define RDF_HYPERSPACE 4 // teleportation effect + +typedef struct { + vec3_t xyz; + float st[2]; + byte modulate[4]; +} polyVert_t; + +typedef struct poly_s { + qhandle_t hShader; + int numVerts; + polyVert_t *verts; +} poly_t; + +typedef enum { + RT_MODEL, + RT_POLY, + RT_SPRITE, + RT_BEAM, + RT_RAIL_CORE, + RT_RAIL_RINGS, + RT_LIGHTNING, + RT_PORTALSURFACE, // doesn't draw anything, just info for portals + + RT_MAX_REF_ENTITY_TYPE +} refEntityType_t; + +typedef struct { + refEntityType_t reType; + int renderfx; + + qhandle_t hModel; // opaque type outside refresh + + // most recent data + vec3_t lightingOrigin; // so multi-part models can be lit identically (RF_LIGHTING_ORIGIN) + float shadowPlane; // projection shadows go here, stencils go slightly lower + + vec3_t axis[3]; // rotation vectors + qboolean nonNormalizedAxes; // axis are not normalized, i.e. they have scale + float origin[3]; // also used as MODEL_BEAM's "from" + int frame; // also used as MODEL_BEAM's diameter + + // previous data for frame interpolation + float oldorigin[3]; // also used as MODEL_BEAM's "to" + int oldframe; + float backlerp; // 0.0 = current, 1.0 = old + + // texturing + int skinNum; // inline skin index + qhandle_t customSkin; // NULL for default skin + qhandle_t customShader; // use one image for the entire thing + + // misc + byte shaderRGBA[4]; // colors used by rgbgen entity shaders + float shaderTexCoord[2]; // texture coordinates used by tcMod entity modifiers + float shaderTime; // subtracted from refdef time to control effect start times + + // extra sprite information + float radius; + float rotation; +} refEntity_t; + + +#define MAX_RENDER_STRINGS 8 +#define MAX_RENDER_STRING_LENGTH 32 + +typedef struct { + int x, y, width, height; + float fov_x, fov_y; + vec3_t vieworg; + vec3_t viewaxis[3]; // transformation matrix + + // time in milliseconds for shader effects and other time dependent rendering issues + int time; + + int rdflags; // RDF_NOWORLDMODEL, etc + + // 1 bits will prevent the associated area from rendering at all + byte areamask[MAX_MAP_AREA_BYTES]; + + // text messages for deform text shaders + char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH]; +} refdef_t; + + +typedef enum { + STEREO_CENTER, + STEREO_LEFT, + STEREO_RIGHT +} stereoFrame_t; + + +/* +** glconfig_t +** +** Contains variables specific to the OpenGL configuration +** being run right now. These are constant once the OpenGL +** subsystem is initialized. +*/ +typedef enum { + TC_NONE, + TC_S3TC +} textureCompression_t; + +typedef enum { + GLDRV_ICD, // driver is integrated with window system + // WARNING: there are tests that check for + // > GLDRV_ICD for minidriverness, so this + // should always be the lowest value in this + // enum set + GLDRV_STANDALONE, // driver is a non-3Dfx standalone driver + GLDRV_VOODOO // driver is a 3Dfx standalone driver +} glDriverType_t; + +typedef enum { + GLHW_GENERIC, // where everthing works the way it should + GLHW_3DFX_2D3D, // Voodoo Banshee or Voodoo3, relevant since if this is + // the hardware type then there can NOT exist a secondary + // display adapter + GLHW_RIVA128, // where you can't interpolate alpha + GLHW_RAGEPRO, // where you can't modulate alpha on alpha textures + GLHW_PERMEDIA2 // where you don't have src*dst +} glHardwareType_t; + +typedef struct { + char renderer_string[MAX_STRING_CHARS]; + char vendor_string[MAX_STRING_CHARS]; + char version_string[MAX_STRING_CHARS]; + char extensions_string[BIG_INFO_STRING]; + + int maxTextureSize; // queried from GL + int maxActiveTextures; // multitexture ability + + int colorBits, depthBits, stencilBits; + + glDriverType_t driverType; + glHardwareType_t hardwareType; + + qboolean deviceSupportsGamma; + textureCompression_t textureCompression; + qboolean textureEnvAddAvailable; + + int vidWidth, vidHeight; + // aspect is the screen's physical width / height, which may be different + // than scrWidth / scrHeight if the pixels are non-square + // normal screens should be 4/3, but wide aspect monitors may be 16/9 + float windowAspect; + + int displayFrequency; + + // synonymous with "does rendering consume the entire screen?", therefore + // a Voodoo or Voodoo2 will have this set to TRUE, as will a Win32 ICD that + // used CDS. + qboolean isFullscreen; + qboolean stereoEnabled; + qboolean smpActive; // dual processor +} glconfig_t; + +// FIXME: VM should be OS agnostic .. in theory + +/* +#ifdef Q3_VM + +#define _3DFX_DRIVER_NAME "Voodoo" +#define OPENGL_DRIVER_NAME "Default" + +#elif defined(_WIN32) +*/ + +#if defined(Q3_VM) || defined(_WIN32) + +#define _3DFX_DRIVER_NAME "3dfxvgl" +#define OPENGL_DRIVER_NAME "opengl32" + +#else + +#define _3DFX_DRIVER_NAME "libMesaVoodooGL.so" +// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=524 +#define OPENGL_DRIVER_NAME "libGL.so.1" + +#endif // !defined _WIN32 + +#endif // __TR_TYPES_H diff --git a/quake3/source/code/game/Debug_TA/ai_chat.obj b/quake3/source/code/game/Debug_TA/ai_chat.obj new file mode 100644 index 0000000000000000000000000000000000000000..e9203ed558d6739b4ecb255298f09fa2463669fc GIT binary patch literal 31585 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 lnDF_v3oUm%ei!jvqnlsixN&5|{V$Z>`H%nr literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_cmd.sbr b/quake3/source/code/game/Debug_TA/ai_cmd.sbr new file mode 100644 index 0000000000000000000000000000000000000000..d77ba57a311a907abcc55898f448d98f67846d41 GIT binary patch literal 125520 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 Jb=lME{{R&tB_aR- literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_dmnet.obj b/quake3/source/code/game/Debug_TA/ai_dmnet.obj new file mode 100644 index 0000000000000000000000000000000000000000..8fe2a10de11119a4607b6081b410a6f194d5db33 GIT binary patch literal 45172 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%0A*@PQ!IU% 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 On}=&ArBEY_;r{|Sx>|q$ literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_items.sbr b/quake3/source/code/game/Debug_TA/g_items.sbr new file mode 100644 index 0000000000000000000000000000000000000000..6754cec87dd04610ebdb29b53235ef3b2795810c GIT binary patch literal 79294 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 U2l^cw)Zr|0KaM*O1yRZW4<4i8SpWb4 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_main.sbr b/quake3/source/code/game/Debug_TA/g_main.sbr new file mode 100644 index 0000000000000000000000000000000000000000..0cdbd2e659282fd03618d966e01fa33cef33283e GIT binary patch literal 80454 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 MH7_P(A|6ltACw`CssI20 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_mem.obj b/quake3/source/code/game/Debug_TA/g_mem.obj new file mode 100644 index 0000000000000000000000000000000000000000..881558c225edb997ad65bc25744f8c5cb2e16fee GIT binary patch literal 1165 zcmZuw&1(}u6n~qoVQH&YNxgOs5mHK)+MvcjA+-%9kkr(elPT*aI~#+WE^a2pdMHZp zP!~LT^`Kt73LZSBR?vS!s0TsNKcT4a%_Qj-eDL1<-pBmr>rF|Ufb>*4|0V`-36z*l zz?))+4_%l?@L}YP#>p8l1%D()K928EzoEX+RPa0w3@Z1`Mz^aX${H{cbtQfR`GM)! z!j5G25GQe8QOU#NAnkD1?s>v%H*%%o&DHXqH5QHCDy?m-lnYf>3x99+m#1mINPPrc zcHs;;VcF;(%=Nz?EgV$BnsNI+1%Hz1f1Z9#qh2tUseW%3Yd52LBQyAw3TLV4=_j)L zwd1g0^apdvqwp*R^soDJ3=7BMkF7)8#22|L<)n*r6CjtVM46|z4&zvI5j748v==0z z+nAF z+Pbykd47}mF1y@jja|XJEQQG9u9!#qVLr!PyX|p@`PjLf21yTe(Bcl=2|8sHR|`%lB}+0vRAHSz2YOTlYgpsRLxbHkvtMHX-BJ*vows*pgvU|(KG4M zen_Z?UZSd#O6H|SC}Bh~TZrg}@%1Xc?|z%1Y?YwBEnKkVyH|X4WbOu7Ez9AJ bUQ2cmRTj6~qAVG}s_ry9jzukj5zB>tR1U=P literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_mem.sbr b/quake3/source/code/game/Debug_TA/g_mem.sbr new file mode 100644 index 0000000000000000000000000000000000000000..85c7a45b85ca96f55bb260e65c87c48b49ce1b1b GIT binary patch literal 69152 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

vOheMt=u%;4tPgk&H-9q^>kK)o+Bv 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 J9*=_?{2u~7mG1xm literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_misc.obj b/quake3/source/code/game/Debug_TA/g_misc.obj new file mode 100644 index 0000000000000000000000000000000000000000..92f354d8f1c981314a4de68c107a876502ac1b2e GIT binary patch literal 7166 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 Uxo|*~`>pahqTJ6$+0YRDALnXxUH||9 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_missile.obj b/quake3/source/code/game/Debug_TA/g_missile.obj new file mode 100644 index 0000000000000000000000000000000000000000..cfdd8e7720e0a50b5fab0aadb1978400aa973ede GIT binary patch literal 45106 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

6-oXJ@Tf!e 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 Li`y#vOQ!xGdtyYE literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_mover.obj b/quake3/source/code/game/Debug_TA/g_mover.obj new file mode 100644 index 0000000000000000000000000000000000000000..b242f037c8990881b98d14d97d5fe483deb4cfc6 GIT binary patch literal 25815 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

{N21j8ShP^MYZb_b?$f+^t8PFS7 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_session.sbr b/quake3/source/code/game/Debug_TA/g_session.sbr new file mode 100644 index 0000000000000000000000000000000000000000..db85647e133dcde7b313a42da4f6a6c08ab5c711 GIT binary patch literal 69924 zcmb5X1$Y}r_dUE?tsJ{9Gc$9bDT6G@wi4M=B-u{Vw2ExY(Abt^$xc#cPMMoBGcz;8 zTV`fvhX1)|W_DLj-rx6r&(p`voO5S(81CG;vTVz?B0J2OJ)ECa7(b&_93JW@%;+d~ z7G`wk`wLd!zjHIXbEQJ5)LR_bvg7|luCLgU@7uEH|CE}YEA`}u3Y`$M9V-~Jtd*@? zZb~lG7*5Bcxkk&bA-ak+WqhtRmd?bJ&6d45u~n_6@YGy37H(<|H^umw)KIZ|DBr(! zeQ#f(G$UFV$&`mXdy6w#BQxU7kwi;0HX~mu6^6?4y_K2D>Q*k2&W2O*v6j6aku?l5 z&a$^5vL=yuQ_8ZNEoV(D7?^3TZRJ!_mYubNRhG4mrNfI!_5BYy>CcyYBp=K38|zs) zWHHwi&Z5vWtYEcet#9QDb2|!yWz@D+y%18nzGd%W1((^)+Q2H$8!TA%o(yeh4M-!} zIfgc}@vBSSy!_H#b=Jfeenba!K@p`b4tLvJWCO-paK!M-6r`u?bc#n@DCd zmVF4r+gQ1j3LnPsL@S2RSoYxzZEMBS;pT>zWuL*ub!J-IS-Hj*K^9PAdrLyO)^NhI zZ)5B4VCCCOmVG+|J6idUB0_gCv=jP4?|^0B$rW^@#0=@}!Hv^omCeU|;K0a8|1U$Ho3+0Pkdiq$p55x&dBKFU2%~GiXu>TBqpn{v;a01!lZn1;IqNfTZB|Z(U112{e#MAQwNRfZ z#A^naX65GLJFlDYbcFGpH%xeUgz=rl12XPsu=P>8B^ca;&5z)c4DQJmM{p?ybE*R% zymUZjyP2x45MG9So;8KwvJAFMpFn6ihC0|o5L}+YPU#{Dt-w%$eFVW38SGLujPObf zceB$VxH5x1s=5(gh2dUZ*#K50u$QVjgjZvDmh>frR%fVB^(=(fU@`jLY6Y|=MFv=@ z2(HCoQ92(&Ycn(`9S)&&7@E!Qhv2#l4zZIVxE_Ng>46BX&rq5D5yAQV@UUg(i{ls` zvD9>NJVSFVZ?-sr$Xv@eS)52{o~7rClNj9F(o@B$4DMsO{pH4hO#PT0_T_Y7**6QI zJNhrfy2=I`3^Jc%UVH_jVIJ$daymN5I)+3B+woKXMElke2L_Fim*nVVAuW@P9??^*ShC)-FXCEws+H?4whwoy zmCy~??^ZK=k1*w2Nh5Mc^DOSMDF|;-X(;Ut>9^vXaiVR5`C@_Rq6& z67<>)ixrB0K2}DF-Pw!GV#NY(P*y zHIeAG3i0<+Oo$+^vt)Q+L}EHb@OlXrhmjJdLxgXTFjo=Gb_m}neFnVZ4T;akh4Bx?U z8uh<1!*@y;T^XCDO$gj2KpGpR@iIL~1z}pco861uX@U>FM>=7N@b*6VUcjZ|U;*{8 zlMlYn>gX$A+b*l<&OZEptE;20C|!FOLFIc7AO&LiK1|vXpYVfVI#t^BKKLQ4s~|gy z1|Rk?u%RK@FEsklN35={zG2xi#eL|bR#$hS++o?11e7d1h7SpZVPx5pwWxD7xyLDu zPGZ>!Um{Ns1~|nBK8bWNG6#y-@td@t0w#H2=~{fkPg`B8Y^^@<8T7{?%zP+bn-6{# z@UUcgs!8@aBr6cJJk2NiJVlYQ=>(6k9QB`S-2cd`p2ya3cO6AH`U`@q?9A{b_M+8Q z>c|fuH+vX)RVy!nD3n<%d-~*G7Pv4AQ@js+#p)^-q-|#s9F?P2t*$vky=C->yf4mc zmTIDQ!K8^^C&1En80-xz2dV!2T&`1=-D!w7MHp33@TK?`g|WNsGE#3_gSyXj`{dri zysW!uj}Lwqu&SS46aPKSG}T@{!S^lIQnQTM2Lzb&K7)NI7&6%Ji}(?~FkD6k2aMFm zIDGXNM^H6I1APKWo!tg~Q9lKW^%BiG+X#MU<%aq(AzSv4fj+l%Tb6uLzp&7b9Mxqb z_oamcysuh^wKzJGw8U2uV}wyg$SC-0#2PRaGRLI#ja4$(T!VdUm2^ht8R$DKPzAku z?9D_~cm3Xyb&HGLK1TKj!MM)s>y!M^8XizxW)gHKU*X2 zFgt*h!hf+wOl}V(jJ~RvU#;ATSG4=A%b(3xlfr0}H2_ zEl(nQjG1-+CMNEjEc+A_#f|kh2fM^N)#D`MKWci=5l=Ius?~pG zcu1tveV?)d1ldo|F!Jt)0s-lph;pV!$#-mpGuBxirDv63fQ=&Y7La63XwnJDoI3}j z;2guL?1cg{vk7soA+Qs}$EpG{-i0_%6M~KjaNGdBfatlVwyOhOb4+ty=!;MjaN� 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_spawn.sbr b/quake3/source/code/game/Debug_TA/g_spawn.sbr new file mode 100644 index 0000000000000000000000000000000000000000..28272add03d39fcc4c86ddb62f88aad4fda1be22 GIT binary patch literal 74515 zcmb5X1$0}-_C0)cB{_CoW@hF7iJa5PcN5-2RnMBg zy~XnM`r=4-Xt=AVG<`~Zda^a%+*Y5MUMQD~gG2JYWtqx~PClN=#nQ>Kj=Khtl`JyO zaW^BfGLd9U+HqT*$jVMQw41Z4lh>piH|K<_9A`Dhgcp#?`yX=BR~VWp`B;+QSi{L9 zi}{vV4uziXgsUBAO($QR+gThK>M8X*)$<{>YdY>OPI$2$oVA>xc>_hq-IbxWoqlOT zH_y;IPGN8c%C;Lr>q-daDloL3GgurNDfBuuZWlALzLQT(jVIDMRCB&Q(U5FS)H`k; zbF+by?=1BV^cLr8UIO9T4IH*9= z*{tIp$na)PKCR({8J_4Q@EONFgrUuyL?+hSm~hijJ|GOC69yNn_ zcQdeq1kfGsVJPMl=MFgTy$sYj-Td5r48@)9zEYRt-p^3I(@X9Fh7wM1X@=uI$UuVx z#%}7k4>8#243y?L?!yc;In3lE3?wChPe01gjt+DD7z2|e0P1munw|3O!6CZ==qSw6(^e|wbQXJh9rqavq@C{GQfbg}pS8$jr+bhke$FBpCqHxE zKnY)a-a=U?zdMTaf(_>oM%RAPhT9NEUB6_*Q=Hx|Ci=1yS(ABdck(jqii7y}D^_f( zgZe}vUbDb7CqED0dEJJ0LKxq9!-jW87~feiB;$TMTOXxch{0Xh{0J`0;I3?O1Q%g2 zuN?s4MME;%?WT2w@M7c(tSJN+XRt&11VT$N)X5%#;F1h>Nf$wADTa#dBM2_dV7JyV z!pkr`gPjJ!Wf`2Q)s66S4ELDI2CzJV-L>ivUV-6R(w7igk)dAgSqQJhV)S{{3TS1D z^s`bCT!q1sbUuVuWoSS;973xxG@IQI!POZYWG6##4F=270})!2p&|B11dry2haEd# z9K-O4qtnH)49#);+2S}NbDh9saXg`Uj+rY?U~mt|Ocf_HxToXwmm5Md^<#F}i_?MQ z-XwtO^m{wn=WnJE)`xu@(|d2R$i9wr-dk;OKS%oRZ8o^SBVG6QP-M@4>#KKIu>&0G znRnXYfsS;{yKL|v2mSJYU4P0$SQ`BW=n!3ivbp+X%5mGB@EFHA6fLtyF^@4gl@sA% zG9B-f$mjft8*2^(4|nEtVj&kvEIa7fM>zTRI2Q4sXqOW?oYF@+b9(xRM7U_7qmY0s zVghzEg`*{f+_ZGX*9IB?7-yuA@9il=c8IdaI+&dE&B<&aV|$Z1&Z%o_K%N~}r~c!e zd}~9p8B;s5f_$EUa5k60CL-^+#}Yab6_KjTCt7ovWCCl*xkOKL5~&8qy^w3+$xgnf z)G^$xE1?&vJ=t+D;`(=rlOGtu9CI;4r(%@%BeRzLN&;s)`JujnZZ7&Y?$u7@WLDBSj+XNp zX8&9#FG0WEuvnq^=V4`(*j+uyELJQ)=R5g1K8BS9*ac3rNZ}JQ8w+xwlT9Qh<>PG` znU4jzNRdP`DhSikUF=@$P7?y~-O>rmgtrX9_W&-J z28yVMZ36JUPG@fs+jdz+w+-O;Io+MTCF$DR2`b;aA1M$k^kUME2ZSF0)1_%Q1mFjq z?xO4{8Uxrvzy=3pzt9vwA9lLCdxvGqlnkJcINdXfL!FMhqkxiyNAV$nFpL~`k`awu zMeZ?5qmwvpb0Cq&2?LxQ0G~iQ7@7Sg?D%ckPXd!Xuykz!;isH#E!&g;_%!|+}T7ijsAk*nw{x^ z#9nl|%bkUO;nSKd9TGj6bu>c3qNVvI1#2pNUHMy!5YA#-e6-#BH9&9&IKPT6E+o`t@{ z0#!7t#~w^nyX*IktXo{{_O!A;2*!10uYlx_&TzkWnZ2#xPfmWgzqh9!-Ekiy899bU z_}LlphS|QP6#vB;vANxkF#4)8zdHF5zj*rx;{4`}ctt#%v+D0oJ15~|?MDyi76w)K z2Nq5{Tb@AnNIUEP$@ydshWLqwkh=a$CnoNk9QPy}#f$Yf2fM^N+2gW@ zoI3}j;B3oj_M#z~*@QU964;61V^tv;??Rkw2tmh$IBtNRPxKsH+ts1&Ikq`32t=p} zdGLky188Xd#sVR9V~@Yc@=Df*${uyG|1r}?77UH}AH2lI)c&(jXvB+osipW)6M5l~ zbTCimGAn}`(-am7jrbqG-2b>#!J;Us8B$mH5rtU{IX29dh7ox2kVUWNnQ4hY<6lE$ z$w0$iOJpgPaop<|T-x>s9(vHGrUI7A^Cnj!b4P-Lx;`*J9+azRS$58}c{m?-5xqs1KKy;&!-TVAvMK=!lTc2MoxCw{1#{Vr4e^d4^ z$NfEkjb$fu+&^sOaUrv+{b`Z$A+HVpve*R7JDm9ce;jn7_4H4=6GK$BqFrOMTi$}| z+sy^c$>~;(d0P?NB7}2hd8i;NudRt}DF_n7ewg8{BwWPW{J-Y~8^Azbwy}B1P|XR& zFAf9ShVre=*?3Djk;$a6!H1R?=yn$M`{*3m|4B=3AL=Xibq>sP+_@IofspJG=2<8v z5Y~6c-Gi~}FdYsJ64;YKJcKZl*^A+Nh6{**(=m7Trr%<$a4hl@gw8>n%$o6+iqns|H2A-<0ROA@}c$&?z5N8I6 zom5`B%vk|=XO(B4I9qUO_UR%!&@qU;7FGhqb`fl_Q<~#ki|xwDgT)cYJui@EUPM_n z=Ud6$2#JQ|0t*!c8Y>`t%DQ%|+&+Q(BKH?!O-No+3UiYxYih^lZ zc*J7e5?A}oqZXSXn94n7v6+Ig^&YoSk3ejZCj>H?*4LRoN>T zYv^fKZJ&fG;wi`b1!AG8aIRR@N})NOSn<*JZ!!bH6>or?G{{>%C*Pb+LOQ_PK4BKo zL2}Xy-XW*E7Tpk)$+6+y^+`!_NEiD@)Smd!eB?YKwM%|XGFX^Bgk)JhnJ?m=5`G14uI3cRnf6 z4kW{l`+X&I5E=HiAIR7`Gr2ujimwCh$I6(82%{6>PnFD}Ow&w~Kl_|X@-Wh7cKu~O z`f#O9^gp@u9UiKB$jCRoI0Ob(6~(zL*$0oH4QV<^Cy zT+HX?gU1TP`d{29O#L4x93w5^a}w!zAz1rMRuU%&!OCB%k~mQaQw6GVJc&D0*(G?( z|Np+{=<4n1kp0h6tj$yGo}<1wS?9O|1WyemrY3XwY+F2@kek!lL{C$+A(m`z%Oo6k zn5yN|L-|sFac&P)_;V?EM#x97xxjYi%uqhn$}|H?dEC$9V*9L6zN=>hdRbm-d!gF1 zLULh?3+=N*vxnv8?;wWG31OR$>ttx~q0~J$q;XwL7f9>8P`)>im>;Y?FN7_Hq;|eZ z4YL|T7nszJU}_hJOlvg?~+hUo#?+6gW4VI zVq`bx(ojC%*OBiW9>h)KT;3PslJGJ?C3qXRjh9PMw9B~PMN(IUB$0fYcmKHL1$3oC z^_k=pR6DMEfn8;=WX5rE-3#PuMH*-TA-BH3u2C#8HHQNRk!#TsZMl3dB|RtB)(qkq z64!YI_QKd}%6+UPalMDPWE<;JP}Dz1{Dx3IlSrpBxjckhQuW9gZdP?aaAPQs4U8y9 zy?fQ0P|7Z-gB4a?|IHy2R6YMK=n0-gos0pg!&|ZL&nruMddWkzu@JW@(GSL|zJT72 z?_f`k16A3kaEC(Jhzy&7CDHE$ItP+~RpA8eF66s^q-PK&7A}=bGMItijcLdus1g$N z9vtj&Sq!D!0rpe(>RGR+zZ+#g$fEZ_Z!x2fcR+^(a&SLVwfK=%_5lp1@<i%wK^R3YAGMo7xTe`PHg9T9)-)mBmyuX7P&*bwyEB7u&QgKLz zSP2sqd-VO5doNVhL>{on`?4h+5~Gs`E%bpx=n{`w=tG5ufjw@qk3ty9IK#tc#6lmV zRkSXj638r`pJ2rsD)n`URz%QXC44HYp^&Hq=t3CBMEi^#0ebb9EAh|SUcjL*3Ce$= z9|!SjCGn+x14VqTlK4sq6zcU#;%ggitt_~^P}zVpxzIp^phqpJ^mwViGEgX7gm37FX4V65hRnpU_$I1 z!R+v*MScas`Qj^!{DwJ?GGFsE+EsrCINaMi0Q(xp{l<#^0ktkgzh#g86YVls8bYzY zWB4x(WA385%Kee(-xw`0Ow^=)4nIA`iEL$P8q*39`3C4 ztG_cCVh|toR8Ovp@gTDpBYC=}FyMjSo*~W2e{7*5faes@SEH`iyU-!gX(f|U7ivzg zCaNk$4tLx!uIap05cJDgZ3HEWphC1JfR8~8=nk351u7DjSk+(yrKqhCko@Vnu13WC zQZ3}ln!kWc4Ji6V+V2!gN(z#4tyIqtXA7Myma@!(ZoZ>f#9?k}i!21$UP7x`XkizN zM`?~Macf#^5n#gu(E8$1))hmlMP2TYni*Kk<^Cweye;llYzNW=mmsKHfyqRcbWtz5 zl4tE#mU6W-=PaU1^Ljhw;0$iHkRS9iURJIxBO z;M(@t$wDi-+F5qCz)G%8fdA_TeyFFf=x^UwajCw{C1La`W}RakXH{23#LxkTooLL} z+`Q1iZETT(tGl@U?40FW*{tE_4d6w`zew0{`fb6(n!wG@)B|HzqPc(x9Y#_iK z#?S-7hLj+nXM&9c=qY!>2B^l^ac+!4xA=Wm_w$>$EM7JbU1~m?h|5-1`ZV@(o4R=< z*xNH>ChARX2!W0TS{~}?DPXP9oh-m{ZeA*Q545&53j{hI=pK4stD1~8UFj4P+(Nli z#H|8jRl=LO22{nx>I5fhdpNEtELL?RD!jSd)zjUriKxB;<3_11+!=jJe9E)4M{McR z;##@S$RRz=(^hWZEG0fCp_>TkEtKBc#rkeOM~#J)V;hWPD8R5;bX@8w1l*ROCZ)Ow zFVEYt6JjD~1w(dwsUMz)f3+Xl!IeusSp!)=zgaxS`NhMlxU68p((Kh?!t&~LjODaC z;^0ihR+F(C2TXQu4X#gE&-E^L5T<|&*aUPoOvr3#%UN5=H7KW_}pR-GkiL5JfG+XPukxp@jYI6j+Prd`-Xr~x@@9GfMK97s+EtTuU~(v~7-+ zrn{IIOnEM`;4W@YxzIZ>6DNjCEw(E#vjAOYu{rnsa&s=RpyU9LZKIp%!#o;Dzbv?IF{=1YgdrhJt34iwFf6!fIaT&+Mn?oUt*6R< z#ph67Taem*lm1-6O)EYfNPnK-rX{KRH}ZQheXV29I(|=pu(<2$m?x7l?cx3H++Ns7 z*(!R0U%)WdxovNuOfAtW9v_k6jZU}^zpumoRg*76?F&jKRlX^CgF|mW%zC3*PmQ(r zhpcHfHP=1>fN3wa*gg<|$pTCpvClgQfN3FEHUc;pfNdJsHUc>Wh-niTHv%{mfN2aE zHv%{efN6#G2^=mGTKyXkI0AsF_YDag3BXkNBmzeT#zQlaqXUDXmB=x{k&q&EY;YK4 z2_1)|ZSTzyIbIM`4{bzF5X4l(6e1@IVrrtD$Vr0Os+daXWPwawOe1oNAf_^QB66xA zrZ#paavEi{I;ImjT@X_ryAU};5K|$$5;>FUXy4n7$XP)AjyJ@W?rg6wBwL&DLdf58 z&10N%yrGW?VGly*dXVF)nf-Z4*vup+GS&0ZRSj?wfeRpEW)(HXzt8~x^NQHp)7LXp z_V4{K)+Mny*^PgW^3%c9ZDpW2kjO$HH}u|#fm+f+!P350Gz&26Ev zHY0GW0wOVyz-`zYh=?Ft5xE^AV<&2)t%=-W5Ruu2$ej{Pgaq1w&|MH3KTe~?h}>-u zk*Onck3*7eL_Zk*cZ+;G@&o<)+?kw@Ifvu;g|i-Q&-zu-3a3=Q=bRZz?>O!Su|y5!uc zeTlJOWbDV>$cqvihc3i^#l)r@ZeMKV*Ca9v>D0c)*sn776K>>HiG2uTzhPplpj^cu z$v0iO@OJ&{k{bTSuja@+)ipSjaw?T*{Pz~?SDx9C1QGV}#g z)8@^~DD-o*Y%OI0WO-i(a!jc5)D^kR49IQ+rz9x}uZAhVKX^+AB1mYW?n3S02 zxM`x_`Y7HpwxKg+h=1qSB^%Mf0?A-aLo(m{1e3wK2J{CXHOXM*0{$bDpR89{Sc3rl zL@0$LfIMl%3IptCVtfFCNw84}EHof~A(4$u!-HPAx$0zh_%+ZSU;r+i;5RohH4)FZ z$_vnLBEKt=Y|SR*y~Rv|e<&Ekc?AzrL`U+c+X=Jg#N1-1Xg~V-)xY@FmRLHE=f<(T zoGeiBgZ%d2!EcwD=zrWaDmsTF2ig>iA+qz2f$9@e63uw7g2T`-2`8+w?XgTNhw~i5 zAp@&rm*mS0bK8Jy|bp zcO>yz#d+4V%u!?(RHiABY-~a<^v&KvM!W^psL#o=@tC~GI+k%34%cC_nC3%E!s)i=EH)b!)_ugH;kG2!(*~rj`-sH^h~x2=G==UY78fX^S z63gPac?v(hq`+CpR|C$aVnHokb16YFNEADb*wTVECS$ERMWLOBw9A zz5!mA2}q%E&Ly&(AjwvF(2jEBS`Jdn3&t{vt+OC25SbLyEa8bWGj##E6)o42jAv5H z;OYvoR?_NC`|&C&`63Ff>_e8&&^>g_gNyfrD8J+cnv0(O){dl z3XkX{gDa-3!h&oq$T%6^xLi_b8-d0Pgli>*wiRfCK)6p*Xgh&66X-1_y?wa5XKt~J zLT?k`^geT07jDU?lh86U6h|l%t4Hs}{NOoN_>^3IxV5bX7-r#C z86VA<4?hb5*@)vB2zb)RZG<04>=@>F49578#H0XWqx?*!IgG&?jPMKL77w=KzY%W@a~uaF z{7xbjAZ!#ECU47nNQYtiR2r=7Ep*Pp6GRJ7Ryc$0i~F|)GYU51RvWt&Tq0=_S(^m5 zH10nZ%_%w!Z>nSzIj)gzQ@o`x1HBJwtdJ$9C=s70TOrq??TWU~KdjL+nL~bsDTC)`&F$dcwsBcNw_7DJjat#hL#i<_hFJ*$<}ycw|q(?r_$W)ntAt z!ZSRW*UztG=TC}aF=$j{6PC$srhX}gWx$b+uiNY(v3^eT0K(Zukc2oI_o3cWYn zE1aF2$u-2XImd0G$UfnCZ=r7>&LH!!e(JGJKQleSP*%uHBjnLr+ikHN$ zbths+*yym5LG$cP@JIu;pf!ew9A%@*lUwXA2_9|0*5VA_&x{Z~#-=DH{&NT&YoH1G z<#_~;!xCB;(9Gj*z{O%CGd$W5RdQlDA1vx#QYk)rYB)c-(0f-(oM|Ok{Cx~5DW78* z&C9+4>H-6g&V`Ir9qhMz@Gs} zIW9l~>@DF;p{r-O+%Q<`t1AuncVT%uEWqE6?t|*L)ZvxcyE}}src2P?qbr%%N4YpI zYrXNnexGed_|TEPQ0;wTIkn#t9)Z>c|F}0iG7cB`N4t@G!jXH!!N1itI8>j=^w>~L z?_rZ(bFqI03@&OPW^xaON07)#Y|&=u8N#FfLqeyHO6akQgtG7m1%FIV?PE;uQKomA z8+kN5>OZ7(rk@fD%3M8#@q`C6{kQ|EeTpeO5gyP2J{ca60-hz65{`tNXOOgejvF~N z9C;=jc`_V%;$QyZp6f;)795|uVE)fN?|sh8_w)Sfv-Ydc=~pkbUwu)&dNIHHVmR_# zIPz>bGT%SkOP~iK9{7tKT*(}usP0whZm#pPsXDJ`H570kUHdY#@Di);YFEnoYFIXn z(oXKRP?Cfrdxj&2gd;DF{?EPM74X%tdxQPQjpiTt{4MtL^6l5nx07Ne2n9*)>-_3# z{OYZ4D%E>kwY`y z?MB`XN8Sua-ZFpPd*(y#9gX1QFPq6m=7aY~S06Uem2=TYqb0_{Zc7$8nX#}#K_Z_S zkqKtzc&&11er4!PX^0c$>zpUP!5RX8Hc0JFhQC8teK@_%@DH-a(2njMhJP~Q60Ypt zCGrc9P7x94ea@=ChHdx*hJQn48G(;XrX<6E${Gn>cmE9dD8rUKK>a5iBbqD4uw3Fb z0(&juI1vFj1z|fLh!IwTtI8KH)?)cWG?Fb2rDc82_RQ$-fDRnSTqcqcsfpB;=BE0M zkl3?+&0^I?n1dEE_4|g%B9Z3e-~ds_{g%+;D&#MF-`T`<1zB48vM=xh<1MSWH(JI| z+|+S@B(?k~YU~!Eej>G!QuW1N+4lb8M&4rw2rf#iM_3S6 z@}}U9`&*^d1`+Kh6p9VXOl}v+-$ha?cVi=?G z5={h!{qfuuY=(LUda)tEg}W_}`OMZ@YAd>aeGCxVJE9vxr%hiAXME z710|?gD`tWlUB0`iHIDPxkbVbols*09@+BQSv>=3n(x&T-BD5Gbs#YpMrUOfbU|{h z@%92yF?_NnGx8$Na1VT^{Arg@pFKh-H3J7%eq2m?VOpDyx|s! zcz;BCN*(sR#jdRF|C^E;AeAYWhf>|zpyP-SMc9~Q>$U5{DGlLy3Xk*P3554mc)SNs z3`d?~7dVi8*Yn8$EeUQ74vGY{rCWzZ4Rvs&A&bWfa)!aU1#pM}?HL~TuyO!7R1l*e zcDE;Vm=D4KP-~nTtHUGRWlV^?SBUX@M+CoD$CyV-Oy4C^oZwL&NUulfNr??~tbLgof}5}}g_nQP`|LZ=WiSMn)BrvsAK<}2GY zp|ch0Cp4MR`MwkyIz#M2#rSk7OXOlj_+}|bQ;kw=YJA;2`@^26S?#{on__vpT z``Ev4iOj~Q#0GjV+m~*Oj9^7MkYBwslEed!{1h2Fm@X%YcH|&3_b8L0vlik96Tg2H zp6}?vRB{Nphn2%JT#?|RBp?4bGLI`Y969Vv_oT`oc8?n19nPrFD%@I}iz!nMr$^bc zyufjh(3$RNi@rpZl?;9BnVf=Nj>MIRh$9PS48L>AN%ZMA!%Za?Dh~xksSrf6G z=!LEz^|n&@5-vKfB=n9#@g@jD^-Szt#h|xL;I38fg05xnc`wpA0^f9IV)a6`??v3} zI7hx8Q7g{t8T!CZjqVK$e;C2KQj}iG#o|VSA4Pg)TEzTk;F}14jM=s@1B=kjY)MSC zpG06V-P7G88o^sA^Ql2F6tJGgvCA03Gci)1p+|D=zKy}pWi~I)5Y6)KNRJcu7ZJR? zLxejl@MUCXp*&N%1m^NP+1J0)0z>L1AD`JVU0Iz|6z`}wX8u(ktXH(5d zG;}TTAAP(zHU($>1quJ;!&z8wU^QKc_|HDxj{bsWcVXhc_;^DKN~=YQ{_3Nxshs!? zhU>(|Nc}b+H4eKAQojeOx>PRSoJ1#FlH4CYC-;Z)GETMwOOyQ5C)3TbX^D)+T!!Rd zKG~9j147F#NA_=@%_W-o;!X;;Jjws~9j0yYRdAD&%oEQBx-Y{hAmFitM&R6 zssQyb$*PG<$S1v0s-=tTGcDpz6N*D-B<$lU+^&hWj9R@!e4;K@KMi{v%13=Tp30=< z=4(w7RX$Ol$l;caHNxlL~UufkvtC+>bPDmwSreXRlxRT{G^6vRk+aR2`m#1D zgKj}|Ig7TMA-pBwDUEE#cs2}jnAx_>b8 z`cct7b9)+!$YElGVBAPVwwN16`wD}z8U_n9`f%KmZDut^Hwuc@L?r12__vnPHjYA- zFZWHdQc0}EBT~hiL}3vUm*rdxxY7I=EK88t)Mwgo-?${fu|C*>x8)pLOOYApGx0_q zlU9hxhJJi7TPsFnw>}|?8#**#TMk=|l?ZL75T36{o32c3qGIhb8)HIRh2Z82PDv%j z7=2Y@TPTL}0Cpg&5!zBAowHUaw3R~q1ePi|55}ZLW@}|)t*t=g81qui+eG0>zrPC? z5B>ecUa7E6BGS{gjl#irb7EY!2}=Y9Ji+av42~m(!Oa@kKALTfr5l=Kjku!CiEX8< z9r)^a(mVJxCh$Ba74G3Ckc|1HZrI|;8a}rr*}AA4Z?Oo;vI`?Uf^mXUJUNX5-iB~} zRBp?XxoJ4g!t_DpwWgETp_1do8v}TID$|T|)RSlm5RxsuYlbl& z*(ARr56tEIxrx}0#MlJDCJ~!N3|+7x*{J7pP$^Q)(YTz)#12Mxr)k11gaez_4B^%& zwu~YS1DMLxa^zE5Z1hku;!9XVtTv9Jbg;8di9{wv-S$W%6?La^3{8&8FDhh3{U{w` zS03li(B;&E{c@#6~U> zZjYw%{z=yEh75|pUZIUTn+2E}9q290E8@~t@@Tfnqruv#QFo9#&}mWl^Y4RZGsibP zWr90J2VlNLO~ep^oueJ4j`%z{ip8B3k?A60w#Oqxc3~u@GFN6DnLc-wDTlX*^DLB) zjui2ghvOO4ax9FT=VW8BnIoOj}Aqwl}5en@^pd(ryD9W~bZw5P~U7|wFTgB^s zM7t16hHRpL2vJ+*O~wHviqYQUjIw-S5NAX}-GpNOJrFvW$c!ki|H>sJbqKMUimBLP zgnFXl%1UNl-Y6bz3%0vtc>q7DK!qa=peQ{nT5Qlm#PJOGMvEhenk~*AF3QDM=L%=r;toegdWv&w{hveG5n?lo`U>xSVsoNhg+ACh znA~1KaIOKT6<`%{A)$E&O84L-26qGm_b{M2S6vc`WLQ^wMkPC_lS?C!ERnsUczjys zbrtI5vPdLHc<(4Y)feG_39^?*B5efsi5B3F42MsCW8Wx@Fp5y9-~e$Ik^Q1#I+T^3 zgoi$a_K)s9+&6$#9{wee{&fTohz{@&c|Ai1qW_~~tPIPUu1(LPBDn`UUZem@;kIza((60F9a0 z6l^wd_{|nIiYJX zji5=RHhgUq3l@MeWUq@3aoMY8=z506K|2yPtKbdZDp+fw8w~`pg)DZH*OwNy(9H&d z*rH7QmS{Ak@4SJTROh3OQj~r(D4mW*-iStC zi$-3KMqY}#nP}uk*TtRyP5c%n+WsLM7i&KbZ*ND{xCACzOzWNKY#F?E=J$iO??m0{ z>^$#A;hlgk5_VzuJqgoA!mbRzFJX0&kSFi~1?b;kHv%6LkbC6S-j6o)=@9JvwA;|# zlqV63R?9dZh1LENb@yU|zeaf;kL7gNu{Xir6wJYx61#$Zi2WYGaQTQF?MwWRAg;!q z`;+)n3DH7I0cs?(e?{etBJf4byg*7x5$+G!h@b8Qy4P2~PVE|qJdiwimOf;yDc zKYAj>u+JnWw_)1`<}fl&m7Kfvge*&aTh^C2f)b%Bd5*)kE=Lk@35enx7f(dO29ftL z#}J8lGIi5LuYVlTXjQx(DkFLL=(xudssa>mnv`v8AxbX?|K-;Rr+3VN6Znqao=&+z zsHU2+x=Qp#{!ap`X0@gY&mJ;~)|gMIB6Wc(ygC=xcixV|C{t^z8sP;Aw@A(Mo<+5( z3s%M8-7bU45jt|rx}r$ZXO9c9(nM#3dQ|1;!c|Z{!|_8Bx&z&>svdL^?~Bm#*<|XmW`vJoU*Wphkgp zfv7S>eV}h8m#mtCQqUa?lrKzXsVdyqW%E#wCKz7Y%gU5wqTQOhH;`MV3eQXM(lsBX z^vUJ2h!(4_AX1F8TorULEp1tO?3gC9JQ1t=n@ns4VyPTD36y78LRJ(2&!t-0uwBd& zT1g-lEsLWT1~bG~_AzWD+K8Eza`;P{DMNUU8!$Y=DG={kZ}cIVv~VO=4bk-BIk&i|mF zo9oDgKd~yHW1q(-rkhta=JE{$)XIZJqd3qu>8^-eo@OVmHU#} ziV-+P?nhv20phs^`Z~haa2pAaZ6I<0CAJkLRhPiem*E_KAhGQP!xm`@rfgY<4<@?3 zpfYW>Z*soDyC;+_7ATwSNb9Pgv_;b+I#yyq;udMZ-p*k47Hdtk z$#-QvN>oAFf!9rv_DM{;A&|DXf^qI< zj)KZmLO(G`Y?1&CcmuK%I_VjdX%?umv!6wxMU$+cB-gD~1AVqe&S9=o!Cb?83_g^u zQUxjvg|HhrkLY9%jV1Nh1kWd)u{f7&?xZgyk+lT090JStb5*LL^tQ>Du&1^myAApJ zw)iC39b8Im3Ng9M#X2M^@+%0p6Bd1h=wS?X6{)GD>Y&WQbXlLxOI-0UBcp%XD2_^t zYe?-xiq4C0hlUSbOL%7=p419gV3MwQoRQR~`y6lB^-I^2+l3rfn{=$5zY}`{;av%f z{)j7>7U@P(c~Us-r}5*j^41aChMUOjMn*L?FrFY*Aja9hE`@T6CmP992XVZfY{M_e zrdg2NNOY2rSEW)$%no-D?vh0tV_4p3-|5KNp&0B6cRP_oqV9c8k|5!sPQmB;3xf%C{hw@#X)2z-!>rjJ5!+d zqzP@=ao=+yr7Gcvs?t>7xSuea!&P-qpx`PS%6e+*nxu<-$-X-h%7B$M$(&{PSih3kSBZZs@*fn~PX#1ndROr$;r$hkB{L23YmZzU@zjpo0VYZY zKYN!SCGig>4pfO|ycNpZD?*3wR1Y%g@0^{qEwC&qixWP!0#3j%40~Vbf=C{xLjINNE7X2 zVl7ANWThHoC~9*8OLPVoq()+SN}Qq+c#kNmY1HScgilpCjo*}JAz)j^+{he#T9sS? zB%s-omRpmLK2NVoV1DLe1kXd5ZO#zDTH#1nbj;5yo+(63CSd+%HjC=G>od|>!f6}m zT^w{pB+eG14mpsE=nV;-<3m{So3T;Yi1@jF`nK566_GkmC^23UqmWGqoiC7Cf823| zE)d8&FvuQt5x5WZAk z*&m{(Y)RxYKRv&<;O?2^2TJM$93~XMTe2&V>4r3 zKOZf78T@oS*&7UNXTJI*s5Ge?4VBE`i%D$JQIZUqn+zihMAPIp=p5uXD5c~#8wOx~ z18p9s62C=o&YYs-n}Wo!#mBjZYzBNIiGl=JPh2R$w|4xZM{pS+zV|OCeWx z_`KGwr3;)M?+i|l9UP~3Ri)d}rNwkW{e0XlfRsvp=uxJxdjzOMLfH7X$uLy!ANLB} zgb5unXHf7yL9jhYViHhiAomNBNni);xIL74K#&GwZ8VF}gDO<7hxlG%4+$m;8wL9a zJ}jVYkYS9b_-x{jFad2j>jmUd!DQlR55uEONh9DxX)HKB~2UPw+@lma{}18PqKOh;pYX0+IW(D_9#Lx2xPi~IH#A`FA5eY`*B2H z5)^&0Injuc9#8CLgW*t+#i{rNg0C15`v&v@IQKx3uL?FP){>kQld}QbdjNb*Kx^rE zGNIQ6ny>0kBlm`IQbXSLrqs}zRpRME9!g6Uoy{tGD_BM6F!I|~?P*g*=Mi{E0Dpdl z;|}ELT>)ESFtEn$rd%4rX9wW-1UA|r++h=YUof**p+|kleIQsX>>wHUV#<9e7?gOe zIKStcu?)iU84Yp?$&ZB0VC#;R(dRBD_pxx^Du8=#qMtB^{lw+OKGjdi=3Ep^O{o;N zAXkw3%usqucO|jU1+)G7DneffWM>Q-^rO%Kc=2Biqyl zeR@t7OnYejy=q`q0Y7X2-zJjZhnU|#g86-z@&ByKB)IXYlcDh_vA--9TxcI7^|z(G zEg5~BAp8HZj9pHjV1$1x?04*^NH}B6hXd=WjGoXK{6sBYm`SdmsrNd^56=~aYoO~qPTu;#!G7qY&pKw@XwnDEYrAu_88 zgB_xehl#H)xK(y+DjroNoi&0eI%bsUnn4t8Q$=*GAUa-t9Y9i8JBXsW;b8^nIze>cj-5`i=NzW@lHw>a6>0lZNKjMBmT z3gC?^U=$AySO9NQ0i%3yzyf&F3K#{13l_j*D`1omURVH+6PQhC)J-^wk{It1X)!W^ z9~MYY5KyNdZ})=T0N#0$-t6CK{6G>6706E%-Y&KFtOjo@NO^No3E7Wf*x(q4>32mk zTae)usU=n-v1Nde6N+WwjRgsAC2SoOVOY5_vtdh0>wkD=0lD=k66RG%YT(=^a63{6AbvuM9aBEWO0HqbX4e`l>b7Pyg zZ%Vc$kr86YHW;|0OKwLfE0DMIt4qmMdW=j?7&>;N*%qz}3AYI>)>?9(jy;L#;Bk^u zgv^Ql1=ol~+C3!CORfabsXi(siW@p10^ZHEbmFO?r!m?Lp?w_(y%W*_5u(l<%}H&+4H2jwp)l~F%n{Q*Q!TJw zC%gNoh%$5OtA>?vvp9QR|I(2#g0Jq5?zG*M#Yo$7Uz6&{la-UG200-q{1zk zJl2{?sgg*=p|U~q>`r80RGQMUVb?-#Hl=x{uth}kBB%0JtDho+BBJ$bPxd7eWg*NW z;~jiwlNw?iIM;(2O#*lCK?O{i62ttk;p-~|;NJ=LKf=^K#SQhHbm;_cj&SH4Q!r7B zd2S#&X8U=JKUZYrN$f{LG&DYQ1eyK4D47H_!dRM)Bz}M&!xBf4IM9n=Yx6wNvC|EPy^+|RUrz801L7V| z_JLOrJTnL)&8vu>HAd83GDl8|XP_7%c(xBhGeYPbg?MLsEs=8-F?X_r&QnNFhBpv8 zUm?Any^+ub3h71f&4e!WrQrSV7Gf9qV!&=AcClh=XLmcHOMFNQa3{e_71YsnH=)Z+ z@x7(|9>SMf*k8x*C2@rz>>_?2(JKw=?-lMRewD#1-V;1P>S{yz&j}tPe$5!UdyKUv z#eS79+#Vr*t>#_oRSNVd!Rvfbn#yq>BYgcBQS++#|Kmh%P{g$S6U1%|VB^?=PZPh1 zImo4;1qftA2G-4E3V2I|hcqxOml5?GeJkEVR9{@0w^)@>?JZ;6=lRt1)-m01#5#m$ zoqa{eeSz3*V{o5Eq>Nv+B6Ry0d7NUgmx$dlhE~?%+X=s&Na)TnJ^ejHJ%wHcUmGn+jQ@E?-(gA*7wH7<^=D}-s6mM zUvS2FpH+1K7*28xye9d8&;tr_M*NV-gNms6$ z7xMQ7^Y^Fl0YiGD)bk#08e@B%bpr zcx&bJ)89!v?-TJD>_?;_Utk>#!6&Em$1t7UycjHNgf47e8UvFq*tf%6q#X-ul;Fz* zy~AP^!B+@c~Dt+*l#% zr$j}u$DQu71V1B)d$V{_6pYIe{9NP9{#ot~U<-_A8DzdtM$fSMrZ#!ByaJgo$ruwJ zdcMLZzp|j-55V^oz^@6~Jty2>0sDp+_JOo>!5ux(Z;5)BAgdAlj-Yo7vO2-0sX>LgB zS5jUtng6)5F~xqPnC^?=UsycY!i^U4^gD?R#xbrA{bLW_bCCW+X`V=Eo(#8Hi1jDo z(OdP2z-kJj8ueAR9|!KTK-UN@iv)ZJ6Ieh1b0_1b2-PwPW8i9@$4EUa zSS?pI_DLGNXyKM&p=#N0@W5!zUg09brpRAhc{X z&jDp@0Xpb}VmVVhbO!k6TCO@A+09wL8ixB)X#ExUZn}tGK|pL#l5)$1V>^Xm4YyKt zU1PohFUEwxHND`G?`bHvN|1u5j&{EN#sQx)Pg7>KQ8H^I-o#HSb&^8!2Kutjr^}v0|!w zFw7ogHc>{*mkhoq@l6#si_Tue#wwOd$M7x$W(5StDJY9L9i!niK0Y|8;SmjEWo(dL6ebuok$=ifWMZVOt3BpqS4i7{i)>QCRJG_F$sz?|8x@dLQstooa)acmk`ch zNJPDOHi-ryWPPNsHdJM!0F&F2`0Lfc#T0E4CZGgV8v)oKlTD6d>l07_Lrru!*&Ro* z`UdI>a+5}JI0<6=i9;{hW?^-~fighTyoOARFgvAM>O|oPr)$W3D}|xB^YeZaiIfng zJa|;noJ&HfhSMv_w2-6MyW2@k7V2LX^}EPsgtg|84-m=KQN5Xj8 z3#(t545rFtkPv5Wu@FI`tNIu^wQF5i>&Y3&H$3PmMgxseMjX6ssW{8Bwm#1WKX0H!`8E{;9 z+-71%y7&K*PRzvv>U0VI?ut00a#Hj%GT=vKc8X=4zF*{YGP|0OvGnmKv`iSQFOe9; zJcCoYZ1get!Cy93&T;_5aFri{QkPFdB%o7*sQP>w_7EfZE>jq(ZlpF{t-|%m46WUv zae9vub1EfZfol2p$df1$JQDwu+#ZI5VI(fm_-?E+51&zN z&wmjMWCUKNP#Jsui%>8(-%x6ABQ;-v$H7%ICHAS5u-^gy9r=ALdG8YtfFCMkWIrPi zC@{ER$n9^qe=jh^ex=v}{~{L1$Zr%n@Lz<2x%rz?2N|jP3OpXat3ru`D<$lA!2d)3 zkV@YB1Oyy9NjTI91PTl;O71Yj{d<8SRzN$?Nc`x;4$euXr>*InMT$UmyjTRYQ zj^!wJ@@O%?AS+Pdlu-iQ%bO98D}TzIsxoz{R7*AuYrI6I(8?4#ZB#IF7R`J6T>DEIWAmS-89^h=SvE4krugthlq=+O;+(bmzlqqQOo!pPJ5QBKx!|p zb|>)jmjpAv8KFxhF)u3sHp9v>L6TI!C+0lCts8!@rKC?HTt< zR=K(J6H8Z&)EEnRRW*JjrUws&;MRErt7*QYBo2uZjCM7nnVl$YePu@|SDOp`U;b5t zFQcpYj_BHIz7C9~ll~*<1<71jot+}56n&|Kkx%q`qKfH{;Vn-52I9y+1~-8l70AGi zM4YOMB?;d|*zV7lB6c$|F^h`JmJsH3)`lez+# z+sNSlFN=3y_P2U(H{!XfjWasohb=6g$Xz`Bh3F#|gOlhaub1U*CH$v~g`}Jm@g5jrkIpBi zkDy^01T{B4jJLrMdkkXe#BsQdVEAzj<0y<*zTlrg7>?5$;J=|22W4qkJoE+eq!RjK zem0?}6f!>C2Z=px;>VlOV@v`=WS#+o(MgAXI1I}hrIr?6)aeu6XTekVpU~H|Q2s+F ztZ#Oo11Hyi##^F&l>59*Qah)gBA(nL%P)|YhfBUcLfFESdl8&ySu45Y$h~AZ3>VYk z^-b-|COse5SG2Df`QQ-ISF*2~7lWm6BgGPq|D3pssfemP~{ z78#K8dusG%BbUxsl6nV}{5&Qm3chi;j_A8U+vJCjJsht{@v--SQxXm+C8KpIoQZEG z^}eO1u~gWE^T{V7eEIgr8GW6^&z8{X&-Ai4 z$o*nDxUoT2@S+#JDvB&C#c;=7(he4zi}%mH(Lh ze}a64zbd>+Mos(^<2jHg^cWO*WkuvG7=yMXGAffXP^NKrK zT*y+y4T`Ym+Jfqf=Wvi8J$32(=SWb5uKenpRVl@VH*yP6 zVC8^-niMTee3bxh{8Ag&6Z$HB)c~(1s*5t-Y5`o_2-%nCs|Rq|sbSaJ)-2CD^zHc? z0b1taWNTWC^p|9sYX(TPluzp`^R+A;!>@zOY9MDR^e5SwF3SYg4oK*#?@Q>L^K}9e zUUaPG$vDjPF}iVC&Xm^u?{alUa0Lpk_umE09vjCRO0NIkCF?xVl_kg=8GiL6GEjRPXMITFLm(QDu86x<{rD7q242^h6Xu0hF7 z1CpGy=Sy)-%8d=m!M0~Uv9%~RE+A%BG!_+)8pw|i@EP1oV6TXZfNq5BgaFG5vcCnk zF6qqzG}aYa)fss`vJ(TWIS(O|_(=PH9~8j5WDZz8H|8b^Wc0s=ZvxfGdhH=Z)v&nE-Nf_RN5lF04^ z3hfXOO3V31SU6@Q84Hp)xG4ws1t>*bfWt2c;qJ}mK#cC;(Eu{>fK0u3;;G2M7L=(U zEfY)z{tl2#A|OImYho*s4M7sMiH8;@pIeh}9L4M5-iT~Nk*0u19M<__8=+Q?gFM;9X^m}9fk^=YiKrEZqZZ!O02Z@n_zfpMAx zab&huw`E>z=)fq}5)kw2*lZQ+DAF1bk?|Wy3Y{TNnN&c=81C84E%FPodWxk3V(j9~ zPkTbF{UMZ~(Byy+C%sCc1`1^YLRrznvw0iZcG?ME4O5Nc>aLN3*?^!TiRrQ@h_t# zPtlnHQK?H^{$Y-a^$c^2PD;B`v}cqk&i9^wKqFY7;O+rIF#!(l0Wj!0C^Rb|Bp>F| z=AGU+R#POzJRDbFPRAv%CIclK#QB4Zp!utWMx&IZyKCIu~I-x z)FCP+)dC$XB?deR9Jb*~AOSCh;$xp$1g&%H?__pR)MikW4VaU5XJUgD67u6vqG&?3 z=s}a?7gb5is9we>+ZfQ-u#@AxU`7;-eWZs1G`p>(`$-Q6Xnd&NYS3nr9SN`+j~f$q zQfLGd)Tz&@5xJ{1gsF}GPQX%yb_U)U>&IJp-|S-T!4#tn;uMR?+VIlY^7J>DLGDbhf->v3Mt{@D#EKN*&{Tgvlm@nU0z?xvDsb)tZ=V zs&xV5eD+`_CI+eO%RBIjjL#c2e>UH+88h%2RLTEr- zS{_~#kD<@vvAuCCp=1NeBWer?zqv@pY!PtTf`~^Vb#!;*_!Jsd*ybC7Bn6JDf!^o8 z$~05v=$Z!nz(A^Au5DrcN$eQGu)8tKP%FV>1>{2l7-T~8&b%tIMsCmO7&4VM!@vqVo46zTx%+C5dr6y6t|9PHigRE(TbBkLL5 z6{o~W?o?u@`q((wgAzNvdKQoP)|QlHe{jau)qppY1`24v)03eLbgUhW==bNS#Beb3JGXKe>im zDu@LWt39g*msDcz1iRMrYRYmwh1)aP`H0(9y_D%#Ytm)~;&vWo9 z3BijX;hELqDhbfVHRXZAoPKe%jg*lojd)2-zdUwn7%U?42qiDAF+y`0ybRTYA2z@< zO9n63AgXf@hOemUMqK@AhrNhgS;No4tsTI-1Ze3N_=!kz9U7 z&gNHdtr@`WXFqa$tc7kvWzQXg?OYEmmXEXO?KQA99x>?ga_=gczM}@eoq-ODf8Hto z#Me$_=&qVR{N^`)D+s@JMBwfksePEt_2KiU61t~`Ke$47vq<3HnxVqrj3TmfI_djN zSnU~bkp`LjYvipEe$R-Z2aE)+eBlSTm5;5?BJ*G+Q=FsZ*|szf8D4(^=v>Bm7=4dF zOLd+t-6L$0F8Mv*3n=m^t7d2>x`ABEnL2#D#vm72^sbEpvIL&wc}q!?gI=Q%nE!hI!fSb3Vc|DQ8@$ycJZ9bA47pVS|s{W&CFt}Le-sKog+#GWYHau>hCfBMBEgyUM(SpwpBXe$=;|59P``!f=jb&)>){47-8Jh@afGT+qDq1omT1f2pTj zG?p!L0SNFX2=<_xKh4n3HG}xcwh}t^vyRy3L*SR19@^SJZ|nKj8d#+KzrL;nOs=9@ z-&<3e^xQklZA8`(vH-H9tU_3lS(BKVWSE&GfIz2bx@V?IPxsKvBol%}Kx7qJBA`!D zFo+9oh&;swpBRycs3=cAK>-bmh-@EgLg4-9RGsSElf1{5Z@7K_zm{9KmQ$yyPGNg$ zda^CcSFmBt4ZOFTT63i?T$GjSHi;_9ni7rhu!o zQgr|F>TIgh6g*a;kok5nlgn8B&Ni2ERiDrUb3)^(t!PK&4cI>*o$xRZ>egLulU?M#n} zNs-3(OQt8{a=X#oEZ;Q6keL5u%25!Y_rWG(R7l4M>@R?H>xqu7TM) zZyl#$z=7Ex@(}R#kE#{b5e(BmDO${(Ch4 zJ;v9&2XLsWlL4HgQl?-PM0WPF+39t6(V-L)3Wm5Tic@$?6KrU-XB;(r?|`nS>+tnn z0sY)3AWybr(9$1d!Hl4c*CU&hRc-bSFjQnFu?>7J^$CkbJ~Jp3NlU<$nm)y}UqHQb z`97<| zJaKdf2kD`qY6%^yy(AE33#4+06%S$98s(jNuu(vMXiYwvqYZnoAV7Q=m(=Q9K96QC zIw%YWfDUJ9w2En|05B5(IHCqXk7S3XkRFL|!}_S{8Zo(t@WVl_z+(rLYa`Fen|&k( ztxT7w8{}C$LLG&u$Pu3jfq6P)M+fO#X<5~F(3pKgb_{1^2{Lb(;}Z9=0gjYs7iFom z&O?Rfk?y!)v{*!$mpSb5L3s_`xJd2YgkHn)j|LSC;}{EanQ9tC(*~BF5J2%u4^qK3 zsmr)coycv9-Nw`MMn6w~(bncok<;{e zIvj0M%i6?$zwYDC2Y8CqFDP|4|Gkg@{uiSU`1-^^ZT9uNK>dy-k5Y|Nf8f85vE+ZK z0Mwu9ufDWNJ;4q3A=N`5`;CF^v}ff&fbdSWN2o zzeK!D#4Gq}Ja#CE1bRix8x?ceau-^aB=&Eg^3Vs$((D=$zQ#F+d>}x#k?J2RmT;pb zPPvPGMbKY?`+;IUUtGg^e%;r%Hc?Dx1Z|~aIx~bGhbj|Yn@pPg8xr!YpdWe#YvON; zEXApq*!X%`N^2WuY!x!rKAIg`O+gl$^M&t9xIut@RX)8({sF0GBL^8NZK7kRfyjr0 z<>jm#4>TBj`$26&n9%?yb%sdqHh{0Fe&C;h^Fc?cIG!??Vhkr4`R)J;JsxzYF-aRW zcmv@iF4L>p%0XTPYw=CU7cn8GNr<%pPD|#>qg)+Ot_E%tcwI0+^M{limYgoY`ks`Ijv%F4`Igfr64F1+8j!b30zTVgUn%5@_^F^h4;8NudLrqoSw6Ojn%XR- z^l6l=!A!<>;b4~q{pktx5mQ1%l8Y+>@_dDIfPP|&ch~yNd?uC|5X}t=y9vj9f@|^a zrQ#Z!;k`NK>rsq7G|Vk8=?X`@BmDlMpzaGQ6XfvE zX7MM%1f~e&?9U2*7EDl|G)Xu89wl-80&(r+kQ`3L3*%RYVGSzBkl04}5D*lnC?Ih5 zhg>{D6&@8R4c+HBmi#totLE|FUO}8+KQEBYmfue z5BIQRlsAKpR`^_o-PRsOf{#56;BSc-C!y^%5^%8x;O!U?x0f>bP7I7+xpq3ETLXJ0 z6SwB{u@4{UevE8$h+Xia>;B-O&c6P3D&%URCkHj3&ZMl8B6A-6u%t^O@=T6+ZJp?o*LSLv5R4p$RL9cm)U`^tIfqQ>REONbazRB?+M3o zc4E-i-7}OaHhW2lU4Hz9=mV}yZfsg$jx`igYq)KhDPb6`l*n<8!?w-NE!M9%8$+Z;57 z&|0ZL%THO_`9eD+G@U?QWaKw)>Z>2&ip|^zf7uRi{)`XOxT;aD_s%xPtfhyhzbt9HA?u9`p_$?QTE)~pPyLY6BK+LYs8Oj!m%CX+N!}t#!1)DrTS+%eudwwcfF61~ZfD zW>Iu5#3z924NU-r1~+KP?k8E)oh55G`9QNO(ZwOFGOUjO+NMMFOGAvUW|(pJT;aHS zEhqR+#Jdu_JVr0pQtVfHm{vc|EE!{CuQV(Q`VW3!F@c$Olw-GHW z0_jai?IjU^H{=0hjBG<(8iPf&zaCk&d6%>MJ)}!Ic#nyb@yf9uyNfbXt z6cQfZY)riOL)cj=kr4|gR-q@Fsrm!9-dNi&yEDVL+-${A{gIL3qM7vK!v&n52QA!@ zD-Ri?G5a+`z=teiP4mr6f7m5rKmP|={D>9XBG{dDPpU}2v+~YDhTQ>@Cou~>Y6{J~ zGkN>68m|fXSh%dvkA*Lz1nw(={=_|nnRL^vcihYa$uC%4@V}U^wQLY~!k1S|_d1vJ z`UDb2VHbxmnPI_SA)q$ggUMY93JY9$A?ts$Bg#VL0tgKzhcwtG{S@UL-IX=zcBCs% z)(#`oev2(O$~wXk9Pcw0Vhf?gu|t-zXMwFOwU4%DXOnDI~hKCOcolzWRsNV^K&~3uw7e0z= z#!JC3Y_?LxSklKbZDpg?N~TCt@_rUK8gVylUOl8u4m9X@L;JmhSTxcImrG^Xr9M8v zS8%M61+lCxu0U7PERr&}D`5jLr{Fx6_y3EJA~{YdLl8*Kg!rg4G+WUNL!J% z8=;qmw*aRY&NDc7x{I(9)SfPta->h6#Cbc(z--Ioe)?n ziZuh>d`@ul^x90Qv)L%wXuaIeTRmz)EN2T%JQzs2v4mk(+goW1fYk(+?11-_k&iaX zM-Stq_R=WiG`V(ufu+s-#$2+{1ZmGjXDsd0nrRLJe}+Wx0&+okazHC1ea&`5!`UlK}vdkJ~u{FS@8xd4WmjO=M|^3mA0?g8Ky#4?^sAN{owi2vWOE={%8TAd4-) zmPDR~98M)O!x&RZ2`&pT3}Coe8p85G*;uA40*wHwt#9JCL;*$tV7pLtgk~JrgeUTx z$gQflMu2k#5L4<}K~@7%G}n#Y#$Nx||Cql)P8b%KupFHd5brc^8xtJa8$Vmn_5 z1rWxH6%_D#5fv#;tY(uMaDfQNAZONB5wh0r=?3<{qX!n!ztzXtC!A~%q>ex47; z5KPguq+G0`d0Z~YdLUR~qB0<#kd}V|q=Wft)`+hZ@h2cIkHOk9>RRhnf?e2bF6ti6 zt)%-@RSXD}XMl4z}hiP)@Pq<|_hR>3{)p?*wR*Kvy{kVUEUrLjkUK z0EYqeRe?U^AcQ#vH&P04jRQCgpsxw^SqCA^vAAqOfNLGVVF2AF&~<>Yw+zM;fqd$#jkr<^d%=kz#lYV8-u=F6Zb0yV9z+?*#fLJ=n(ED0-<+0 zlqS8fWD4+22k@*F224S|<&duSJoe+67=OgMxZ7b+2?(G`8~mn7*n1t`pUq+y$d5VH zkBpS8Czux2nV^2cg^Y~;%y8N#(j`nX&6+Q^K??ly7;Glfp86R_{y+@D#L83mvv_k% zydqu7Q5&S`B<$NO;EEGv^mFDtxD%cw{1+1*-U-2|h;3D@uwfAU1*;*(LFc1}&Dv6y z^Z;XEcz~mN%z&gX%Czj44E)&uY+lNiV8C}Ky3LF~E;voAvC3GsD(bHoebS)#BK7El zjQ+!+Vn)JFP)440vDT1>82P6Q)6dx<;}d%oH5Q&1UBI?dwLHp}3%HVLz#agjU7EjC z|6Vs#Z11GK=D(4-=37S08YePcf!c;@{Ro>8oW*~uAuTSjd!gUfgWF@^;*kQj0QAB* zf?YQ3cNA)&F^zb;a06}4oQwXq6Purv_L$dB2836C~nYnW#6ZtRli zv>vhlAlP(+E$6NHg8nhKHrs3n3_&$rT;S~hkJaACD$~grZ<0y{N)qh8{6%&(7?}^q z{sk>nY7iWsqMUbgI4wB{_Gjdgw`J^MU{n$M)L3nSyBm4;y&YyUKTuqq#bE!qe5;uT z?;uSJu3aawK-f-W7QW{boc6382^g?3*uuihgxQ9G%y;Jot?>hHSdr~Hb%-;8JjLJv zaS&~oTldop9XtiXi^0bYLx;wpj_fdoN>BZRp~K@4s(`bBY+?AwIP45B&oFjW95Wq| zeClUopZfSXjch5nwUxu4=m2DuR+wmEM`C~8GEir@(!a*BomOL#28X*$q^|YX5bhf&ldxQ3pO-L}Phs@YsRp~_ z!Msu?i_JD~+KizmqWpin7K*zfTPSZ!tY_EoDSgsA96nXUm*OM}9019;+sb&RhV$S7 zC7U=n7ExM~g4!v}| zxUjCFZTYOJXQ7O6Vt~HQKyhI)ou`mk+F*TSU5(nwnr$DnP<&s*X`mR%1ul}lw8pgl zs)>rvJ)KCzgX3E8uBq{$Q1TivJYO=G5=Z3?B%jyTsQqhlV`E4cYaTW_`!2WEI5t_+ z9nvh3Z11?6mXp2B@W>TW8lMQ>Z;_WxaUsq3*y$~RJ00K}-3K_tHyqFkkDau>xEssw za`J`f2QV%76dcOX z0qrHTat|lAkpIxhsT7uD*0~SM@2it{u>BccZ4u%pbqMMfErqi?TYx{S1KW6$^-K=- z^E#wEJB;FncUy${MIF+Y8yN)zx3+*bJIENMWKj_wZGk@MP;y}IsW~it$Vqu}n9Ue) zuGExA9B!-w`wQ@U2ha+%r{Me+iTu$?vC;tj6DzOK>^{WUpB;w2dvRf$CY*4Ni%@@Y z2)={E4rT1G2BSd_Hhe7InRNtqc#EJmI?B=XOeI zvz#ND^TJL!Ru5)px=8Egos!xd>mwZ1>pNwMvGi!>ykR(^r6Bjb#*2Cjf4oTPEr;8e z78qW50dI3KFEBv`qPc>z8p1CxNbfn4S&N#=f~Q`v{1(>xkQ3^!r*b~ZoQ4{wid_xy z#L(xQz?{f&?6^no#IApl$OjyVF)D^5^gIqd%MtppqiWKGJ&B24id(fTfp1pX5T*djjd7EEEfqw2iQx3G*GnHU^$N zVlj`=HitsRqnE;#Ro+hmcgIM)YbtCE_gxGwav(QB8ZfMKzmV}IF?z>Vf^$uJQjQ@!)G~|AX6mE7)jL-Y>Agl^)faX$NJe2Ve)*M^p7Ks(T58@Q}lV9rqk_ zt|uKAwVoR^&g{|_7!&OZCasT?VEU023&UB-oDFdfpHP&x-h#gwZYg<1IhW zvMq6t@&9l*WjY3D7{0~9+>mM1w!yQE-|ldNj9!Y>6{&J}*1?Ml9a!kF`q&7E|GFb^ z{QT`$8^%%$6TVqb=*CXpI4LJ7eLKdhpL<}LMo9NK66KcEPSQ5a27c_!jkSaO9Mfv6 zw(iTRANVie?ETpBxOijbGsgH&9Ztm?g9{A*+`&{WV{lQjyxB3Z+{tfFEexB0IsC63 zYPy9sD79TwDMeW;G3_^whL&m|Gmk7Y{5uCz%{I8J+ZCq#-ck5H4ae4mDl`7z81$xf zgb5}*<_P?$>lka9@wj1NoPh_1q24t48z{HJJUL36`g!XitMcoZ{a3@TZ4AX~WFxJD z;*8IN9nM*W?bx2>c~7>i#>|hNo@&Wthtt(OlpS7KCfU<1WV=tO>0X2Oy)7*{?D_I^ zUvokQo_@MTKh@HtT0Fg_h5q$5<8MMmp1xV@C*AKPGZ|F7diqJ#)Px-wCN%b6=)aL* zZG;bdhfw-Uu`AEJdKI+aBVBJub=pCt{DU=K`p z=OT6#3lBYrOhaf~<3aCZ$uvleTbefh-H6}f4IRhU5oS6u*wH&5@J>X-IUEQjCj@jt zdm*3dZi-^>g_{l%k?Ll4VA#Z5iUaUbgI?f;Muy8q!Z3pW96iuXtNdQ1dgWO~@RC!L z_r;$3<@vo9+?rrH@3*Ms@{D*^#GY5io==ZGpCQi(d!~J!uJPmJ0w962V$WxLdU~YJ ziAhrOjO?zG=Y|O0aB5i}j6G*O{dMdh8|5OK9WSzTX;*|=%|$jh;uTRUvN73ZaXSpkbVv zq_RL6ObT$k15i5X^vMs8&Fl#dD$!{aHY%Mj;5-Ko76%6zTQAtj4#Ub@rkW>9OgbIogMd>(pli33=U*?>Ou+A<^W7zY59JGARRRXW;ukpNRTc<(}AtmF&6G>+2|cJ>`)Ua^-kKFf#&`7tO# zsd019CUSSV#LyRGjlk$fE`{tz8HhnRib*EAD+OB-!?5)P4qs3pR|$H03?0Xai)>vj z*qJd5C$%V?aXf^1=2Ua*qGhS-zR7X+vfFizM0qOfo(knR_;@l6nfUSlYJ)+od4CASD?t>eJ| z0r{`FRgiTKp;JofJT^X|Nx(w=C1I?e$|zS$*mHz0cAHQ>K@>S_BS-Fx10~dj4RI7b z37_dR&Xj;&6i3~GK6ao)28&AwroAR9+8B%ND2M=;Gg?dM>LvcbKu9RGm8_+=rqMh}2`A{!pa;TjMtHd0S|`qW50<>>_xZvW87N4VrepAe~kczRw0pGf-T zNWl$KTcn=l7@qTVN2FfzbXTOHhAxWKE1v#Xq+a!OccfnP^wJ34f^=VmTOV|9gzFvj zK&0OB^oj^>fAr}QZfnqIM(SNppA)I=o?aEH_dGoq;nD@2iInH-;Yj(u9*q=Mmd?dN zeP8Dz+)PcUfF@nE#eRBlA?D`9lIvB1Q zB6SE{M?~r{Uw=6we>=BFa6_&)Me1l@UmrE8Q^~u9G?Zr|y01B(hglO_@WW@gk!&%I z1pamSd->jT5yq|sJ~?lI;{SX^Eej@4UvG&Ls@>N=4av<8rd{yete=ncJ_-8!Jix`i zhQA&BAm$Q&YD(zk&HALqgz7e7ma#ZUBvh}jv7v1XvE%=mR6hzaAkp)Y8t~1G56*3# zi}W24{e2Fx!>J9D!VgO7Ec>L+w(M1uOF$~ki8dt^9KZMrra0;d`^+>bvKvhjur(l^7WgMD*5{DNIwxmqAI?AC&Ev) z#@AaT`Ul!pWOFT1ohYFu30Lc^G@;I?fXM3w{C_-b;FvfJ`mjqV4gCK)a>>CRUt@@HDq6IS7Y= z{E|Tu+p#{!&V)bJeY>m(*WlS3EP58vkGdnTeEt@9ReU!-&9ZQgF|Mc6K7#8C>)% z3BXi;@|h23J>Lt6)1>~&qF!l&!{3t|!NMe( z^fetO7b_QiF?z$D8#*jXKe&;D`awA8yo5jcS6Q4{p@| zsi{2RUcp2FHwxhF-AIwG7vTjgJd%YMif{u9_hI2h{5+#k7n;>2Lim)@4>VIe@Tp)T zhwB6*xk4mYisWjg`%y)vnd2JnfqWpuvah`0O-kPva!<91OZ5M9P8IgzYkif!%acmo$|WXYAT z+*jN-D26yfw8PZ2%s_z|V5S3<009C+7?Y$iWhkVb7Lo#mVSv^sFex?Q7PaO(XLVP) zavJ_{XDog9JKs6Gd-m+!mE@ihi@306Xj|nqLL`K|Y6G#LUmp$TZp8+GW5$i~zI3Ii z)r0ry#y#F|EEnQ;c(*K<RODF-ChV@QxzMJti$R?*ssvd!_$o%%w;)?Vi5djUO6shEvp*Cg7J$PHn1Be3Jm{n$BtPl(g&$|&oN%sN4L)7POs(+?%S4j9XEzqo>^~*vTjp? z-DVwvmW^ReeVs;tE3-6@QgZ9sf%gPakVbWE*^Y`7H@nN z`SCh7>&r7m)xBuuS%gbZQc!a_d_-lMRs|Pxa;|i&$iHTYtk@^A*eCXtNZIM~bef2K zFOBV`yfD;z3bSLGIfWd&TeP|VAX<8of*OOha#4Q@PSfMFFmnnkQjDpP7^Ko<%54C< zQj>I-o9wo63Yut@l2p}mR1R&ESt4s>m}v{w2(mtJ>MD;ib5-WkxnUL>t+})%FO;Jy z`|%vYo`fk8nd*W)Y3|@p$TZ=a!=BMrP1|xsIz)wvo#D8(6!%yYzd+sZG6zSkc337H zvv>quS@DU#Lx(juzb*}c&>@o&9_ywSUW7H5LT@9MZ@-dHUAs*+u{(T9}mvW?!UWS4EUPRTCY=u#zH(CD?Cfqh1L ztulk>F?%vKmu>#rO17YR^ZJ*K7*!z~$=s7W*6Lx|)PlZkRL`ZNjl;c99?~#b+~3U2 zY5@OBS!(AqGaVG@RJd5sWu+^Y(eB8QdCtpK94bd|VHaUDPv%smeD z9!9?al5M;UB-{9_;{Kt~+dx-wDXaiPY4M%AJTF1WIfz~qT0$Rh|fU-t`RM0i-NaT6NRF}@ z=tj171Ibw!0FoYifi|(nejw@baUkjOIUt$SUjoSty#gdN^oBy##RgXibTh}h3P{F# zFOZytTA=r{)vm1FK)uXGfOauT0l67Hs&q$zb~5)}pdE~UsI1dKF6Mr&xbr|g%)O$x z4AAY&T~yrLKp$kT^a`WT6+lkrsuZ^xXghQ36=wtLX0B0jw*uY9T$kc@06CcJQ`}uZ zUCixKTo|a6xw{qj08j^W4=e5nP&;#vDDI0u+nD=`;!XkG%G^&CcNXXt=3Y|VpMmI8 z<6(fBH+4>zI zS+OrGYeu0;YDq|{p_&`NP6@F-N;rSP#>eiihB}B_T^hZvf957^dZ*0taN__ z(mC?qfn;lM0oAf@$x?h6Vrw;!w5|raldU$O7+bd}>vo{K*?I@i2wVNi8U>27^+BKr zTaPH~XMl#;`W2usTfe2OCxG^|_2)qQ*m_P`{{*z2t#1H@*gCJQ%a#eTk*%wMhS<6u zNRFr;Xpp%UpuMcS9Vp1$9ZKg13a~W>gjgofSyxt^|@gr(4?_3hTj` z77oRAEfm-GCc@#RqQe(3488!qb&SVbwVL=+&QcB1NAs`YZ_vBP7je4dT68oR+Z&GF z6AWlRU30bH>FwOz-s|1n-s5q2`}%vGJGzl>r3VzAxNk7ns%dB-G@@+@jcgkB#rNMr zGG&X8YO&xjf)^=znGDpDxGNNh+^D0wkpTM0l&GM^jghclWe^ z$kD4w3%g_J``nK9+Y2M* z;=4V4+r3C&cX!U1c$@q1tYo^4@Y$rO^D~SQ*t#SDzQjZ*Zk2)1m9%`14}X2 zD8HJxVTndGeJH4bL`jh|f`#<^s6MeqqA`C^5Bg{y81xMXy~8Mk*nI*uv?mHXURdbc z6OHNKk!T>4ASu~HwA&cPL>vi;G-{aI8cOW(h4s;>j>YXCly|{c#HR=2!Wq%J(WKTH zjl`qjU}toA*oTtagsw&cp~xVOi41sWORHw`=R6cMao>GnBo;!t*2n?VGQ%Rh1XqiN zN?Q(H@8J8G!LrWQfx8pF{XzRcJeojW2K>=LaDdV>FzAhs`iBGYTH1!pSK*HcB`}qh zY%mLOSNH=$DQoB_gcA#NIPvjSDm3~Wi>r!X*mU<9f_LM2{D`jMnL)Dlda69Dk|swg&=Ew-DdKz$p$zmk*V^SK*Hx zG`_MD`nkh=t?TQyH@DC+fxpzw#kmJ}JxGI$?DgqUdeF#=`oms!J0Ax)GMheu*UzJc ze19f$K5|^_)l|<9%e>c@FQKUu+rUZ<SBtGh8~~g5deNkzo8RNFSH+<|x76Fk zX|U2uGWFuPnW<|MPbdaJypF$H790Ip*JE#Kvg12K92Kc|iv=^7()-O!qYzJ+m`0p7 z_nR4ERQ@+gcxHz4v~%?u)+Gck5VK4WGO z`B)@~7F6R%;#6~sXuo-JaU1bs_TsA&*i zEMn@#;UdN+M$Ak@v!JhK3gR?0iETwpgSe@PsTV7Y7@L?wT@=KzH;X^ynVtrl9eJjY zDHtr(59QEaFU~2AHyj)dhH;y_NQdvz(2j9QrV>mewm-SEah&GO;*iQAsn;kk4LYf* z6GKYF%;py1Rt$M-MjBeJ(IsQ1ffCu|glF3QbGr9qqqTRqkeb|g7=(zuITho(^+ zGHHe`p=l5gn>4!8P@iO5bz($mBx4gdo0+;6alK-wKL=HuTs9hPb(_UXlZL+Hkyl>R zC@f0DZPhi1tjd^V>czz(2Gy$=ig75#G>E_^rV-Jpb#0`4+AQ{3*&MS|jw?$*Ji@BkM{KF%LFKqrGEf#V$pZIcZ_uraau)Tb$7vnGtV}BwC`e8TnGFFjSWBt;|$bw{nqmHk^u&we0nXtYMIG zmc0#;HHpNVQkLCpIcr+Mz)WjxE2omO?5q{6vaEG19bQao?|;Zif4V=Tn^(}i3E4a*V)&^F2-eAG9_he{8Ye3r2 z&M~x+l^^Ox*=91dv4l{rJVTpULxu84zR#+$JDG`1tz2wsB$mpensd=ueY`mqwd{W8 zW-}|-QS2Y=E6i1S@r7$Qv+Mz;xVbf#|KGxzheS(EbW6*`vquPQh3ZT;r4q5J-Z%Cq zv$d6rCY!=>wDAE1##*^dyt%=$4`gthl}n-*)F+Z{mVFSR@m8*-Icl(jiA}I_*+epv zvFt+_-p0zMRQNE4Ct5Ll#4Un?B`ijLN%YM!vQ>?BbmiT#tq^(@fyul*A z_8$XftlVBG&I=}-MHpTCMH6m87inWN=TmID$(tm{T19 z;iUsI+s#yUh43=u^Q>~)S$Y7VMVT4y= zxSO2@!Ic^8QPqv`Dh&7P$_B71fxT4KA-o#Hv!pK}v^qn5s%Ig*28+?}Rx6-2DKfxH zMQ|+!i_-ZJTAQIk>2L_G!_aJYKLpohaEP4@!Sxs{Ne@J5eTK^Hj|k4^hledQUmVBq zh^3~B;~AP`d9%d{MCMw)$>Kyp^DI4AoW$VXmYyn3WpE$M?JqY5Wa`K4urH?r%f49v z-RbwURG+_vLRcU6w{-8l)gT90(s^$)!2>PnySJO*L6&sgI|9x=i|VU)8nJ^d>6v$# z;31ZD%)3qSPz(L?e_ek{Wh{-}0(7`qfHK)=JZaf&R&b1E9f6kFyO6^eoXUytNSThO z$8uS3;>MZ-!K17>9azXk63Y%c_R&_ZErLbdFWPB2M^XA1YfkS#S%eD)Iu;4YA|_xL zQqa2k33tpn)*+)a?SPe z1g3Um1^GM);Y>D-O+?PJk0*38Dk52zi#2D{@fg;S^N5~e#gg@weG%8fQ>|QYv3$tz1`M9+URv44#D` zb}yEF1%qcJDk@gKWnW2T0iq9gp_RIcQuu_-#)4dAWn!_(xkyV|=3_xF zR!FQFJBAmDT%wRnEGv_($Xv=i$#xAJovD`nD$&cV`eZ8Btf1EjU5<`6Et3;i=3$9@ zg_UheDVYxlTxm78BodbWmrTpfxg45Tv0*H`HXyz7YO8CoSduQKrs``@38`czS&xRq ztcgUgRfxZrVnPIQoh8EqBNEdgg4av1IE<7q9U^>#gt>}fwnO+v=`-j>C_Cmm05=KH zmPW}j$02;PgzM|@VN7xe-y-3JgfYt@e5-_;CA`DhSik-RxfMP7{3aJ<_W~{z2Mef& zoqX_pR!3g}+jdz+clP1;TU{M}Md{kR2rA!u04Wg5_hHhG_=Fz>)2Y&~_rVWYT?N@u zH2AQGfej7GexcEaK4Nus^$p9GDeglbwYs_siM3?s{)tVNxx$vsYK zbP~%>_!4=7Fu*B3@JXbDkvUMrj^CvH6fnsHOV{EPe%k6%Woz|;&!9gJVdg{e+I;Y{ zfQKc^Q%$nZAz6W#r(O(c;WoL#ju@|kb zQb&FOx!J?Wt6F&pM4`-D+0!TgvcQE|nBsllD^^#zAZMf&3`p_xDZ;3Nf-l9lD2&~0myvqg8q|HJ+b8!9 z=4IVQdwlS_fK~nUn)vTorm6Pw3BGTsmYQY6J|MuH_ZjR%!H~gzU&N2_h2b(XIAEkc z#^I~KID)Dv8t4;1>g+b?i~1>0te0rk*+%d)D>u}S3E8rT4D`9B+p^?~`h|sdy!M^8XizxW)gHKU*X2 zFgt*h!hf+wOl}V(jJ~RvU#;ATSG4=A%b(3xlfr0}H2_ zEl(nQjG1-+CMNEjEc+A_#f|kh2fM^N)#D`MKWci=5l=Ius?~pG zcu1tveV?)d1ldo|F!Jt)0s-lph;pV!$#-mpGuBxirDv63fQ=&Y7La63XwnJDoI3}j z;2guL?1cg{vk7soA+Qs}$EpG{-i0_%6M~KjaNGdBfatlVwyOhOb4+ty=!;MjaN� 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 LE>YprA-Qe$PjJJO83+7-LA zGIC0q#Gy2p5Wt0ofSvGBOnY)DkitnqW7<=w`3%Jn_dpZUkaEf)aT{7bLIAt}H#7In zy`zzPx(D0;_q*@Cd*6L;-g~nW-IJ8 zI_CS>^;Av7CTX_q1S(hib+*;$^6rkh^zNS84ZHhmdbgcSwz{xCVViOs+bPGf)y8dz zdnz%CyB;yrA%@yse_ZF1y?%Tg%g9DC)}n3AhHcY`*M@CkeO8g3`a~Sn#3+uiuM>$= zU#L5o7}XWIIf-l((=5bPkMY!DJYk>Hsm`o0zL3`uCto3-F#$g{&P5zE$wqMqTYcOX z`ZU^V@H67P0b`wuvChI+V>zEibsNGlAE)kT<8{OMW)qLaH)jHV<^+811pKTx z$6TLHjOH3_UYy0o+CX+%Un2MO$(ArLOSNs=XQ&)Jum1CJ4l#-+%uOTlSZ)@?xrk*U z*(er_Z4oi*A8c^~TcVls47MjiLAcJd;}AUo&U3;<0Y`y3&kJ)DoAZLeQFw2IrglA5 zopxSKv^zgdz(LlWmxPJp(39!>v#3Jz8Mb~|n5eZF#UWv)QG_jD5hiLGnm#uvN@QSi zngybzApD#s%z>W`&T_%3aaz2lP7CLJVU9BCw44z6COm%sa#o1ew1vg8woFusWvxk= zXzVp<=K_JrH}HiCIOgjjQH6Yo^sE$Sng(IM`1s~k31)<~T40Jc7S<)A3WXKU@ls); z6f|S+T#CJO5%$hT=mzMy&|y1I^3LFgo(x+rsLL$O}9;K+LK_ykp5g?8WQmB$@q?B{1?gi z+sXLOWc;0Ed{;8QI~ngy#`}`-cN1`!H7i)O>wUdBmY3y zYSre6I`wi0bsI#S!Hw1VP_(XBt=YlvMHPxEwtIXes?hEctMZ3&Rh*9nqLTuH{X}5O zlh^`36=uqAn2MvqM3IK3V+khsN{O9@eEmQ6wn?Hn?QNmMi-n0|S%J-}8T-;w>`RNF z8=)JZ=R(hdu7?&QJwbG_BH9M41g4lpt7>7U{0Q@^7hp%okc zwW2P~VQiWgOju=ncjqS5MW71>7V$4iz~M4jEKHR7;GQa+MqhY1OGJHoVMw^wUNWwl z^I3t!fwoj&3OS5znJ`gop{XgsBv!`fgqfx{Y}qVKL8s1n0*T0$3rvwA$LA;Dgbb_@ z)hJPD-72u?v@HRL0k;biWkC$JLzpqtlkhrPgFln~Z$JaJhFK4*t67b)x}DV{tjvpe z(95q_O~Q2{U}v#1?|cF4XXUc`Dl2n&59&R_>SwHuurfz&=!2EHHH1D`4YRtQ)m~Q5 zvU;D@)GF#_0jo8v`dJOL`YNm2Sv|(;WmZR6eadPEzF-bwUd*b6)zz%7VRb#LJ6V07 z)sw7VXY~=Qx)aIUe5hK?SbeIQ**aERSzXWSd#s*h^*XEfS=CG?9}8KnX7vSD*Rc9F zt0!0;W_5&BH5PA>tA(sOS=p?<&gw2!2UxwvY8E;R`n!VFR#txk6=dj9W-qdOn^o1x z)XUkdE@0KoD$8mot6Nz;$m&T}hgltARXv5goylrBs~%Q4R$pRu6I3vw`h1^sm}+sx`(R=07z@3MNFt*^2Agw;HBiv(krTF$DAmBVTmt9`5< zWAz@Z=~Jn{URExvKV!9@)jzR%i&f1u>SZ3QRjjUJ<+0ks>aSV-1FN62`jFMM>EvSp zt4mmASe00PlhuQ)o@e!QD5L?;`7vg5>d40$R-0MvV09a-hgcni3i^A4*}JT&XHd`c zSY61fpVbJfTUhO9b%52+SiJ)k_?>hr`DkQyF;rkpGaF*{Wmb2xdI&0L@hr37v8tL$ zKIX8xfK{4Rk=2c?_Okk0R?oBgZ&oMcCx*cqZ(y~W)fZSb4Z3+7GiW|XkEK#WRc)&_ zUsJKR+vjgC7b~T#y*XRV*_(%~Vf-~v9xG?9e7@Y24Vv)Z@+Y7;MpIRj7PF0n{OKnS zMAX62k?sX=LrB6CnGDY6))8x`q7$$Uo`^<(Z;KUU<+D7~S`w@@-)enqX! zH*DrDJ|aH>F)tDkc?HDWP$Tjd$QDJ+mtv!em@gV`R>Zu|J)nrW{U1`qyb&E$q!*>r zvA`nl#&eS*J3u-W*#ojgkq1FW75Nd!jf%VgvQLqJ1393`dmyhXG99H46j_MUWIQfW z%&S4>DAEnGToDW8az%E63@Wk*WTztcg50dg4?yl!~Jf2GJ?kY^Nm6y(>690WP4$S*)<;O-d3 zd<>*nk!fhrt;hn9tRk0#>{Mg`75N{K zD-|(gDk!oHAm)Kz^yn zQy?EGau{SP?#R(7-Uew@<5{FyMN@}ypJtXZ}D)K1EAw>>>e5A-bAhmd1h~k-qIX_2{Ss-f_xd`McMb?8{tB4D- zN0D714=8ds$WIh`9OP9+%zO36iu?}bRJ`{@F;`<1ELP+Ukai}^QKI*?#?1LEn^&d= za`}8m!7GiW2GT8=OlS9%Eq$qhfx*02DciZ!fLF3c2GS+B;0=a_j#8;u3U!a0&%0$i zTP)6RyRA4pY!#^cwo$7DcSC4sQ}90PAHnb6l2@N(Z0g%DZnR3S zwKZ>d6+C;$E^V~(6;++=84pPsYOM?ovV-no7JaY7YjV5!9p7Ns?WN*KTi&$``sZvXBTczx^lx!>D881q_ zp=EShz^_d6s_S+O+p#oV4{Ot3hW&+n9Qk(FE_W4Li`RzLf;J{ZD@#dMOb@8F=(XhY z{#2=X0q-o?wqnSk$!d0())hd|bzgD2T?hkcx3^Y?(#8DPP_fX4k@5PHhITt|vjGo6 zzRw+|v}X#|$VQ}spEJbL?QX@2sEmX@LgG}sTyY0E4j@)!w1ycWQq{EG9&`)jFzn5< zN*FWNtE$;uv~oR`b{sr5!O&IZKARs+bZXWd#!_~QVVa`4#+0z?(a2<2KME}^nSsDp zSG2+n>?*jPYvtXYyl4zfm+Z1#$l85lBX(=CQplMHlb467A#&|EFl*YZ!S$8lFha(d znyh1Ob@Nz>&0m8NMFB>ff44tMnS~Z$6#H zlCh0gZs`h}9u42>ub2tVo%y2WO=!jTHlfW#F4G_eYE0N9Ms0uj_7&F^t-N8PN=LzL zpS{J3hiQn}FjF}<>lq`hIWv-$Ja*}V<+-DNJKOZi+X(EL9q#ZjdJ|s4o`R>fr#Na4 z+q}bevi@(OL;gQS;?hPtuXomZTf1AdxtZkekaij;6JAuV4eGWpb z9eJZM@d=YzRt9ad%~mQ5W|vAdm~EuA6;?mdot2$C$GVF{F1;9;0C8rTktErAD&}fD zk=5UIj4`%EO)v@AU%6)Qj#Y2T<@^kpbVu`GDh8*xW?hAL*ZlvC(W!_rL=T03JBV8N zhHeYDee=YOGwKUf)XX?H$F@0J`mEBBys?Jod$^?1#WF5_e1IVqKPw5tG+9Z&W)&ph zV8yrMwC^-itxice!9om>xP}6o^%3xKE5r{gu*LFk0!uXb$s2FM_GRPPOIsymsN910 vT*uAh#nGJRQ6|!D116e`|6|%PvtY(qoMBpW@~s8cf-2?>8~x+;%TE0-S>!Fw literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_syscalls.sbr b/quake3/source/code/game/Debug_TA/g_syscalls.sbr new file mode 100644 index 0000000000000000000000000000000000000000..8c75a471d57b6b15a8c6f3b079f07ef094a4689e GIT binary patch literal 84809 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

~u1;4|-N+g2i~P%Ga&_11xYMlg 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 Jr5-9W{|}?HoV5S| literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_target.obj b/quake3/source/code/game/Debug_TA/g_target.obj new file mode 100644 index 0000000000000000000000000000000000000000..667797d0cfbc89f88fa6db4ab4bc8051cdea85b3 GIT binary patch literal 8541 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 J^N3Cn{{vngROtW! literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_target.sbr b/quake3/source/code/game/Debug_TA/g_target.sbr new file mode 100644 index 0000000000000000000000000000000000000000..4dbb262e95c05983c78dbfdfe644bff40013d093 GIT binary patch literal 72804 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_team.obj b/quake3/source/code/game/Debug_TA/g_team.obj new file mode 100644 index 0000000000000000000000000000000000000000..3a8dd9c87b8ce4830598b8151ef4699b0550f0e4 GIT binary patch literal 15086 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 Tgu`3o{}zb9Df^e> z{vN=_vXeRPA2#y1kXhCKw8;37*M@&tYy##TPW=Br4!Y2K`X}9qA*x!@t})pyZ$b6# z<^tyAbSuZat%z+A!a1`%R1lTd)$~Ib!B};e4u=K_>`5RVLYT?y#c(~t1w_DU8lOopENSjz(`*n3yJAt%n*P=p%1dsT z&i*`{X(pSPqnX%+A7Dk36z%DhBo7OS?kJ+VJ37kBPU6QU`q36@W&sep$8nFbU<*M_ z^H>YEGIB{as>fL@Wdw;HFQ}=_G>QIB5+?+R$x8Gnb7FwWF#YlX>ft1tewNZ*!zkOy z7RwPclf@|(ZIjprJk^3zDB3#*1*T%!WUgIg`#YskP8U%FPgPhd@{9mH&E{B$GXum< zDlc8;tN^^T%Ck?LEx0uMbdeqC7{p!+D}iFW2sYR$&2g^9c4g$j;)vs(7f3TNqO6+p zt>kWmL_>0cg$e=#wo`=Xb`L@y@sO47V)tUNd)Q({!L%zp zVzF+Ct9|BCi_H*B=leP z^farsPr?-Ol;iyZvCvdFSFCEK(40=J_-Ok#nStPnH$YAr;a-NXdB|jz^EX*E4vMis>7jaK=(i=aWkK0Q)cFWIwPO`E$HW8g= z_Kz$Si!6kts* z=JWEwV})V;FYXhj{*M!mk(Tf|iFCXWtoa61?UA zf8TR-_4ahg{%0xH<|%g1QQw@bbKC)fr-l+!lev7hEgnzE&FO5SrzzSHOE$M<5{^4e z)$-|~e5t=Uw}&eHxfDDjYf|YxGts(q;*~>-y2BG57wR+!j?i(JKv;+ zSq-5JOln6kwF^TgwtEzFeNiZ1pPUlZ2Om%T;t=kL>s9>>B^k?T&RZ zvYT^hD4*}^$afA8;-+yf?~8Fsc$uIQyp7w&%OxnBL~ zOmYgU9ap`;t}<9MpTK`VeB>KK30;r-osn6jddv~>YpQiLnxm~q*Iw(9>OiDdgKf@tGXY!F_gy!MwFx8 zz3NRUWf#=J3ahUF=8y@hp8po~1W%$)#(>n}tyuTxl_fpB%)sx)G~^Lf2?=@+ z4tBUKhSKf;`>A{Ntk=`ujj|tP(fgpcn9;{OphE&VxF4xn{75VN0ESa}q=+INWuXTl z*V9kzXp22Wtgo=UD8i4i=);Qk^b2}2QOr1xgbE!cIkub;k_pI|E1bo^qoKl(3|^y} z5#Cp;APmJrjbC05wcChyc&Z*%57l8!#K`xlq1ms8n#= zt1R+7kcktBU2U-!Liu3}USq)*LwPCN#0idjBQsb!FR%mva&3un7-P@tTf~bn`H7QBn-@%M$@_CA&g|4;bAjkp^woj zT9;1=WERg)u;LAs`Z`1_B51G@K9$u_NK^uJA&g_9ea4Oez52_Q_~ⅆLw)@<-gF6 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 z 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_trigger.obj b/quake3/source/code/game/Debug_TA/g_trigger.obj new file mode 100644 index 0000000000000000000000000000000000000000..0816edac2cf085683c21b9443095a9f72faca7f4 GIT binary patch literal 18438 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 A0{{R3 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_trigger.sbr b/quake3/source/code/game/Debug_TA/g_trigger.sbr new file mode 100644 index 0000000000000000000000000000000000000000..2082ed7381637e79824d79778fe98d33adeecc1c GIT binary patch literal 75883 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 B&cpx! literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_utils.sbr b/quake3/source/code/game/Debug_TA/g_utils.sbr new file mode 100644 index 0000000000000000000000000000000000000000..2296ba374c5a1023c802b6a41d0c51013f9f6dde GIT binary patch literal 73369 zcmb5X1$0}-_C0)cB{_CoW@hF7iJa5PcN5-2RnMBg zy~XnM`r=4-Xt=AVG<`~Zda^a%+*Y5MUMQD~gG2JYWtqx~PClN=#nQ>Kj=Khtl`JyO zaW^BfGLd9U+HqT*$jVMQw41Z4lh>piH|K<_9A`Dhgcp#?`yX=BR~VWp`B;+QSi{L9 zi}{vV4uziXgsUBAO($QR+gThK>M8X*)$<{>YdY>OPI$2$oVA>xc>_hq-IbxWoqlOT zH_y;IPGN8c%C;Lr>q-daDloL3GgurNDfBuuZWlALzLQT(jVIDMRCB&Q(U5FS)H`k; zbF+by?=1BV^cLr8UIO9T4IH*9= z*{tIp$na)PKCR({8J_4Q@EONFgrUuyL?+hSm~hijJ|GOC69yNn_ zcQdeq1kfGsVJPMl=MFgTy$sYj-Td5r48@)9zEYRt-p^3I(@X9Fh7wM1X@=uI$UuVx z#%}7k4>8#243y?L?!yc;In3lE3?wChPe01gjt+DD7z2|e0P1munw|3O!6CZ==qSw6(^e|wbQXJh9rqavq@C{GQfbg}pS8$jr+bhke$FBpCqHxE zKnY)a-a=U?zdMTaf(_>oM%RAPhT9NEUB6_*Q=Hx|Ci=1yS(ABdck(jqii7y}D^_f( zgZe}vUbDb7CqED0dEJJ0LKxq9!-jW87~feiB;$TMTOXxch{0Xh{0J`0;I3?O1Q%g2 zuN?s4MME;%?WT2w@M7c(tSJN+XRt&11VT$N)X5%#;F1h>Nf$wADTa#dBM2_dV7JyV z!pkr`gPjJ!Wf`2Q)s66S4ELDI2CzJV-L>ivUV-6R(w7igk)dAgSqQJhV)S{{3TS1D z^s`bCT!q1sbUuVuWoSS;973xxG@IQI!POZYWG6##4F=270})!2p&|B11dry2haEd# z9K-O4qtnH)49#);+2S}NbDh9saXg`Uj+rY?U~mt|Ocf_HxToXwmm5Md^<#F}i_?MQ z-XwtO^m{wn=WnJE)`xu@(|d2R$i9wr-dk;OKS%oRZ8o^SBVG6QP-M@4>#KKIu>&0G znRnXYfsS;{yKL|v2mSJYU4P0$SQ`BW=n!3ivbp+X%5mGB@EFHA6fLtyF^@4gl@sA% zG9B-f$mjft8*2^(4|nEtVj&kvEIa7fM>zTRI2Q4sXqOW?oYF@+b9(xRM7U_7qmY0s zVghzEg`*{f+_ZGX*9IB?7-yuA@9il=c8IdaI+&dE&B<&aV|$Z1&Z%o_K%N~}r~c!e zd}~9p8B;s5f_$EUa5k60CL-^+#}Yab6_KjTCt7ovWCCl*xkOKL5~&8qy^w3+$xgnf z)G^$xE1?&vJ=t+D;`(=rlOGtu9CI;4r(%@%BeRzLN&;s)`JujnZZ7&Y?$u7@WLDBSj+XNp zX8&9#FG0WEuvnq^=V4`(*j+uyELJQ)=R5g1K8BS9*ac3rNZ}JQ8w+xwlT9Qh<>PG` znU4jzNRdP`DhSikUF=@$P7?y~-O>rmgtrX9_W&-J z28yVMZ36JUPG@fs+jdz+w+-O;Io+MTCF$DR2`b;aA1M$k^kUME2ZSF0)1_%Q1mFjq z?xO4{8Uxrvzy=3pzt9vwA9lLCdxvGqlnkJcINdXfL!FMhqkxiyNAV$nFpL~`k`awu zMeZ?5qmwvpb0Cq&2?LxQ0G~iQ7@7Sg?D%ckPXd!Xuykz!;isH#E!&g;_%!|+}T7ijsAk*nw{x^ z#9nl|%bkUO;nSKd9TGj6bu>c3qNVvI1#2pNUHMy!5YA#-e6-#BH9&9&IKPT6E+o`t@{ z0#!7t#~w^nyX*IktXo{{_O!A;2*!10uYlx_&TzkWnZ2#xPfmWgzqh9!-Ekiy899bU z_}LlphS|QP6#vB;vANxkF#4)8zdHF5zj*rx;{4`}ctt#%v+D0oJ15~|?MDyi76w)K z2Nq5{Tb@AnNIUEP$@ydshWLqwkh=a$CnoNk9QPy}#f$Yf2fM^N+2gW@ zoI3}j;B3oj_M#z~*@QU964;61V^tv;??Rkw2tmh$IBtNRPxKsH+ts1&Ikq`32t=p} zdGLky188Xd#sVR9V~@Yc@=Df*${uyG|1r}?77UH}AH2lI)c&(jXvB+osipW)6M5l~ zbTCimGAn}`(-am7jrbqG-2b>#!J;Us8B$mH5rtU{IX29dh7ox2kVUWNnQ4hY<6lE$ z$w0$iOJpgPaop<|T-x>s9(vHGrUI7A^Cnj!b4P-Lx;`*J9+azRS$58}c{m?-5xqs1KKy;&!-TVAvMK=!lTc2MoxCw{1#{Vr4e^d4^ z$NfEkjb$fu+&^sOaUrv+{b`Z$A+HVpve*R7JDm9ce;jn7_4H4=6GK$BqFrOMTi$}| z+sy^c$>~;(d0P?NB7}2hd8i;NudRt}DF_n7ewg8{BwWPW{J-Y~8^Azbwy}B1P|XR& zFAf9ShVre=*?3Djk;$a6!H1R?=yn$M`{*3m|4B=3AL=Xibq>sP+_@IofspJG=2<8v z5Y~6c-Gi~}FdYsJ64;YKJcKZl*^A+Nh6{**(=m7Trr%<$a4hl@gw8>n%$o6+iqns|H2A-<0ROA@}c$&?z5N8I6 zom5`B%vk|=XO(B4I9qUO_UR%!&@qU;7FGhqb`fl_Q<~#ki|xwDgT)cYJui@EUPM_n z=Ud6$2#JQ|0t*!c8Y>`t%DQ%|+&+Q(BKH?!O-No+3UiYxYih^lZ zc*J7e5?A}oqZXSXn94n7v6+Ig^&YoSk3ejZCj>H?*4LRoN>T zYv^fKZJ&fG;wi`b1!AG8aIRR@N})NOSn<*JZ!!bH6>or?G{{>%C*Pb+LOQ_PK4BKo zL2}Xy-XW*E7Tpk)$+6+y^+`!_NEiD@)Smd!eB?YKwM%|XGFX^Bgk)JhnJ?m=5`G14uI3cRnf6 z4kW{l`+X&I5E=HiAIR7`Gr2ujimwCh$I6(82%{6>PnFD}Ow&w~Kl_|X@-Wh7cKu~O z`f#O9^gp@u9UiKB$jCRoI0Ob(6~(zL*$0oH4QV<^Cy zT+HX?gU1TP`d{29O#L4x93w5^a}w!zAz1rMRuU%&!OCB%k~mQaQw6GVJc&D0*(G?( z|Np+{=<4n1kp0h6tj$yGo}<1wS?9O|1WyemrY3XwY+F2@kek!lL{C$+A(m`z%Oo6k zn5yN|L-|sFac&P)_;V?EM#x97xxjYi%uqhn$}|H?dEC$9V*9L6zN=>hdRbm-d!gF1 zLULh?3+=N*vxnv8?;wWG31OR$>ttx~q0~J$q;XwL7f9>8P`)>im>;Y?FN7_Hq;|eZ z4YL|T7nszJU}_hJOlvg?~+hUo#?+6gW4VI zVq`bx(ojC%*OBiW9>h)KT;3PslJGJ?C3qXRjh9PMw9B~PMN(IUB$0fYcmKHL1$3oC z^_k=pR6DMEfn8;=WX5rE-3#PuMH*-TA-BH3u2C#8HHQNRk!#TsZMl3dB|RtB)(qkq z64!YI_QKd}%6+UPalMDPWE<;JP}Dz1{Dx3IlSrpBxjckhQuW9gZdP?aaAPQs4U8y9 zy?fQ0P|7Z-gB4a?|IHy2R6YMK=n0-gos0pg!&|ZL&nruMddWkzu@JW@(GSL|zJT72 z?_f`k16A3kaEC(Jhzy&7CDHE$ItP+~RpA8eF66s^q-PK&7A}=bGMItijcLdus1g$N z9vtj&Sq!D!0rpe(>RGR+zZ+#g$fEZ_Z!x2fcR+^(a&SLVwfK=%_5lp1@<i%wK^R3YAGMo7xTe`PHg9T9)-)mBmyuX7P&*bwyEB7u&QgKLz zSP2sqd-VO5doNVhL>{on`?4h+5~Gs`E%bpx=n{`w=tG5ufjw@qk3ty9IK#tc#6lmV zRkSXj638r`pJ2rsD)n`URz%QXC44HYp^&Hq=t3CBMEi^#0ebb9EAh|SUcjL*3Ce$= z9|!SjCGn+x14VqTlK4sq6zcU#;%ggitt_~^P}zVpxzIp^phqpJ^mwViGEgX7gm37FX4V65hRnpU_$I1 z!R+v*MScas`Qj^!{DwJ?GGFsE+EsrCINaMi0Q(xp{l<#^0ktkgzh#g86YVls8bYzY zWB4x(WA385%Kee(-xw`0Ow^=)4nIA`iEL$P8q*39`3C4 ztG_cCVh|toR8Ovp@gTDpBYC=}FyMjSo*~W2e{7*5faes@SEH`iyU-!gX(f|U7ivzg zCaNk$4tLx!uIap05cJDgZ3HEWphC1JfR8~8=nk351u7DjSk+(yrKqhCko@Vnu13WC zQZ3}ln!kWc4Ji6V+V2!gN(z#4tyIqtXA7Myma@!(ZoZ>f#9?k}i!21$UP7x`XkizN zM`?~Macf#^5n#gu(E8$1))hmlMP2TYni*Kk<^Cweye;llYzNW=mmsKHfyqRcbWtz5 zl4tE#mU6W-=PaU1^Ljhw;0$iHkRS9iURJIxBO z;M(@t$wDi-+F5qCz)G%8fdA_TeyFFf=x^UwajCw{C1La`W}RakXH{23#LxkTooLL} z+`Q1iZETT(tGl@U?40FW*{tE_4d6w`zew0{`fb6(n!wG@)B|HzqPc(x9Y#_iK z#?S-7hLj+nXM&9c=qY!>2B^l^ac+!4xA=Wm_w$>$EM7JbU1~m?h|5-1`ZV@(o4R=< z*xNH>ChARX2!W0TS{~}?DPXP9oh-m{ZeA*Q545&53j{hI=pK4stD1~8UFj4P+(Nli z#H|8jRl=LO22{nx>I5fhdpNEtELL?RD!jSd)zjUriKxB;<3_11+!=jJe9E)4M{McR z;##@S$RRz=(^hWZEG0fCp_>TkEtKBc#rkeOM~#J)V;hWPD8R5;bX@8w1l*ROCZ)Ow zFVEYt6JjD~1w(dwsUMz)f3+Xl!IeusSp!)=zgaxS`NhMlxU68p((Kh?!t&~LjODaC z;^0ihR+F(C2TXQu4X#gE&-E^L5T<|&*aUPoOvr3#%UN5=H7KW_}pR-GkiL5JfG+XPukxp@jYI6j+Prd`-Xr~x@@9GfMK97s+EtTuU~(v~7-+ zrn{IIOnEM`;4W@YxzIZ>6DNjCEw(E#vjAOYu{s6o7FbDduvlQlz0qPbF&^zQe3J!x1T@ufvjul|^Qc4&xgMMWZ?Whs zpg035daFfyDcf0|*9SwQ+br7Wp|p!f+xDZiY0l{loCifXawJ==gmTR>EkupJ!3P94 z*`rq9;IjocEk(_~!3PC54fALq{j%V;#i-&p5r%{?t@d~z!m!|`N-^lO5^tFyX>-aqZ!s4#0W1dXLw1@Y%b9-SU zWvl1~egVT+=eE6tGPOjjczi^LH#*@y{JswRS53YQwJ#`{RQaal4Gz8iFzbzKJvG+e zAF`&|)Li=j0H(dvV*5Y0HzhzCvdn(X!UPE;0OSw-Zvz0Bmh(4lL#CY7!S=vjt&flRwBm)M?#9wvB6=G zC3GB;w!Jq;h^dKoA}0xAt70mllLaz$F^$M6f|$zKiO8vf znA+Hx$Z3?(>X=UCbU{pg>_X%WK}?10O5{wYqkV5TB4+{dJKhjiy0g8$kZf(n3n72Y zHIH%5@rFJoggpqI>p_mIX7=YHVKbAQ$W+fqS2e&%1TKJtnN`#j|3U-&&nseYPhZba z*}wO{SeL}+WJ@v!4fhJ{*_XI9Q?HX{YegcLx>-Uk@(gJuLYG-cjFz#?U^=_pZBr?M zRwHzUCdGKG6S>kLBC{@$t6XS}o2{|)dc>}FvrW*cGT!<`t}%$j+knWmZkq}Tv>~DE zTo^29tc?gHMfPv z+Kj-h3W&r+0=HprAR>ZnMdWsfjGd^FwkC3iK}2R7B6mtG5fW$zLU%!E{5XvkBXYMv zM5d0&JrYfX1ZpI7FN7ve&}c~__ZdWFCK0(`qKOco1>6j=2i%^n@moxUK`nz1A~-OB zqm8~|c*vbxpNM07f@2lt%tzepOsLzka|$@`b`W~ZZ7%iCP^6Q{6K+FqsbGY9nCg>m zODqmMqF6481IR2V@{sHHl6lI0U=D*%yYX}zY`AF)g3}fH*)wjk9_Kw7XmXy4JmXe} zL$33jTh}v#xp8WrbHicBc@{}lM;>t_&$=}=E)H6V{DRxuGc?p&R6#MjFwtL<=#q1% z_9e!Ck+C0hBQHv99J&zu6%(6sxP7saUz5lzq*MDEW53GSPq>j+CH5hV{f3FHf^rpu zB;R!9k^={^GcOW<91HZI2X zAp4#>yQ5UX)PzIiW=!aPclJ!EK6`l#o=E5ex7lyIT z?Kua1jE0+!Wzb*oMxOA^x3Pmuy4_3nYUz4at1(6HEr{8qgnn)FgwI3;2&rezIO+VGRQG z6QLB20P>_2D-5uoiSYplCc#D_u+V_`g+w+s4G((d=Bkt3;nzTSfC0F4g5TW4)I>br zDlb60iTtievNfBK_ZBk={-IzD=M_9i5go~&ZYRu|6LX85qW$RSSO4NyTVm-vo*T#V zaPq54b;qv-%5RYXt` zcqLn(%;I>}nvet6fn>+1d;mX~cs23X1YTUnwX$l$)b-g+9l_dK0C`WP^Npyk_GG=Z z-I2s=73W#cGDneFP?@Ggvat!d&^LPv8SxfWqdq6g#$)m#>sZEFI9!LxZjxNXCbMGw zrZ4vv38&kdv)F7{SoaZ&hTD=@PaBZB?jsfxAdbgd(iFOrSX`itWOAw?ZRNKiyGQ2 z9LF4PFJfS^3v41WJW3vr%PT=PCo;3tiz}fgh-{(ptl zWqdSaKKv{c*(MyR4~HYL01eA>jpu@8C@<}e0pFv2f{TRhl`|3fAfUr?un7l3PAsvS4Q)#fSx6nBYPY^9US>X(}FYezK%qZB1TW#!CaEYWzWNi}I z(zyRvG^gk^ys45=#zu|k%ZqC|Y2Y=vBlwkz5`laH^$7M`kb^AIuv zb$rC)(@g4JisM>K^SG1Z^|KTo!+VyU!;_)7YffeI3C!GS%wW~LvzZP&S&mD+WMNH- z&852lBkU4Zap?9$KUzz0R|CS&2i|8A${VOr`V(xu2<~RUX^CdKeOQ=i!AnxMGK&!F zFj#zA46zp_)@iVoSR>X1=m{4i+-2bQrlcqn7ia#9m@AO?WIvn+;E_EAyTe&iR+IUq z2+#0fW`AjdGd<80U>U+a9&C%SEb-kvypH>^<%rJmP%XytM0-8dE655Y`aHrEWhL8m z{oxsK*n#rohYGMqz{6A)vJ`HKO-f`MVfY0FIy5N*7C`0TQUb{AaDAe29A*eSP9-oH zMqnI3$6d>nyPWN zuW)v9Cf5+l<{Y<$BKw5ny@kGkIG<3o653B8a}b)$jA4~IAY9)wm@Cy$ua>ds!C?V% zC2)>Ag?T$9TwfZ3Q~P1>U_tPy#1AugtP8WiG(v|PC|(k~ z)}4qQVWY!J2FHP$udX!Q--YGvumFEMx(}+~QioS&@9r?lnl3?mkFI25ALZh> zto6nN`+c?<;X_CELbdmW<?DM0h|8_+)rM3V4=ON;nd7oc#x(i{Z#~ z;mEV$$bA2BFM%F}c;GK`a3ynqqPkb1ySdKGrs}+&)lk5FbnVN`!b_~Wt6eGUt6|wR zN;|pNLP-*i>=}+65{|qy`ak!2SHM@p?hW=IH=2Lo^S9W~%eP-Q-%g5^AQU9Euk)*~ z@vFDGk=Mfb&%Mq5<9728By*QZCeS(G3C9OZ<+7dMYTsd6Z`!{3mh?^Oq;H2iMGnn) zw;Opo9C682-tGOSrOo zm&h+bIz>dF_c^Qn8n)pN82$~FWduGlnUW0uDQhHj-TgD*qYPW}0QH}6jA*VD!*Yq& z2<)|p<3t4D6ol<~AVydTt}0)+Sc~Ng(MYy9l$P~5+cTrT13GXRbD2m+q$W~Vnw#o3 zLSoPQHH%dnVGdfv)bAT2i$t1>g9Ahz_gg}XtB}9!ePZ?r)V+8$`65P$)JiGr3(Pe-}xq+>MQl(%2y&QSr~_{!y9MxJU~u*tD#g2y*og zOEeJ__Q!Kuuo>zZ=*5Nr7w)z^<}+JsslAw?z#6<=B#kD)tHYko;oica%_3%1CL+0v zRYY$n4Z`dhO(gm5bS8StBn(dNS$8;!u1TkD>a9DAU{{)-{V#AWH$l*s_Pw z=2EIDK8i15+fLc3L{TJY6)-osOAy^DAgfPvmn1&j$J+~dwI!#NWx{d>-6bN*UTRvc zZgK?@yGC+&7-4j*D-y~J)Qq!3MznD&5!+2LoSy4M^RzOd0wM8E=&nMbLjW2O70mJM}hWB_W((yU@Xw$ywTQGwKUMqH>xU>VgF(QDbY7%E1}*n9Gxc5MRP5o|)> z(NB()>kyd{>6YsVgRL8m>=Kc5W=3H1B89JU*Q1J}$Ik(3b|cnRFY5}OwR2`p@`hU^ z;{6fnDRtQM7Q3>x|8GiafK;Yf9!hm2v?RDSI4Ba(mTnyuHPpe8hAbW{$QcIX7Qi6_v}btS!^#2VP(h4> z*xjDcVLk-^L#=UYtPYQKmoXvoULnTs9TEIq9b+CTF@2Xvae_yAAiW|b2p;W$;uuM^ zL&x9)DIS?bW0PbJ92c1k3k-9iy(6I$2$>t?NrX-!WUiT;37ta7T*;>hoeoG^o3Cus zgw9r|pU`AN=lfD<=nSz7730&TERl;9;hUu#k;@d(cX#cCu2QHUIyZQ!no8_C#rSq{ zXCgNMNy`;Alm#@4--Yl^fMuoY2kf|A93D3ZE4+wJhwFCp?+pH($-h1PyF35R;@@8W z?PLGGB{CbI5*z5fY+t%9GJ+N5Kz{YkND>b?@>68!V7i) zc)p_tQ^_IZ9##&^a7BWLl6?H%$ULspaOAKv-IFSV*ga~1cQ~Uyt8i;^E~ZR5oE~M% z@&d<2LT9?8E&38sRxt*R}p?yVZBgL z;yeq;bBFDLSrB9a4mWKG0! zq8GY?)Z0qoOStH`lF&N}#hV}q)ibeo6@%U~fxA|@3%ZuQ=eZM6EclXXpbvHM%!2{9y#^N>O?#7mFJSeiZ4IX%X|Efo~%GF=pGs3@k!7vn4Un zeiDJfbWeAWXasMe%%=vyP{4W`$1YHWMBVE3k<2dSutO8Wn;7R(#~7V?xpxQ6!-5wA7rh48ys^u zNPZJ>9}7pmj<}CA(sz-OzPMEDkn?{z3oZ{2c4L`ft%xPY0=x$P0SgOmXy9)lpG`F< z(a^QTfAsO@*c6=g7bN_X4`*S$fz@;&;y?R%JNgTj-Gzz&;^Pe|D6JMH`m2w&rgGvp z7_Ji+BlX*S)Hv)eNc|q9>QcFQa}u3!NpgSqoZKJE%Q)E%EKTxHpG-H$rX?~Oa~YC< z`D9B94hSu~9NE8pHkWATi#sXY@+AM`lRLJxq|>s*sVU1pJ_BFJlBms*8n!r5uh#2R zr~=f#B&#MaA)oY0sg^FT&$Ng?O(+hTk+6@aaJwefGHUe_@rk-r{WR=xC?ECVcq)^Y zo3AxVRQW`GB8R7@j=L6#F+PFqS6e*S#_iVHB&&Tghqsy8<~F(Y!?uTPO^{7CHcGbD z0%rlAX-(S=b9R$BQZ2(45HPW)(UUY)KcllJyxeD!?He;1UWp z(JEm)p(Pc{PLjTnsLgWmi7RgF%z9}h(ka9zXH9sPQKAJ+(2UNLM$R^8>dV@s z47vr;LAFpbYJG?FFeC2CZn5!h>X96svX6N($GbE5lyr zRZe9qM=_XSa|WZH*9fd)0JH=&AgG>I4FH#)ZxC3`0Il$89h;hz5&B_R^xUgQd2GyK z|BNMHk7`hDe9GxBpyIBDiu*G;T*=0Hjc7mhh>rU?!)r#n=!oi)sV z>qkZV%Z;RwA^SLU_I+ZMrhCiHfz$Y>WwM6@r^9I3<-7 zWAs&tZJ`*>1K5GAMrccgbk16x&{hiZ6IiO?JQ$M}nXQ$HwYCC{W6Vo6Zxe+l{r)ao zJoNV$d!@oQiAYb|HVOyh&53c@CM*#c@C3JuGB}PD1~+SD`)IZ`mTqW{HR6gkC$^Qc zcHpbyN$=p(n85RxRJezmKr-f&x?zhWYxvxjWb2}Gyu~6U%Px%c2*wFY@#HiLcpJj? zQMoNk=BD8|3)2UY-(!tI;B@&qwb=xD6RMefuF*G?Uzo?KE^`mr% zU727;OM}Fa<2<1(Ay^P);l>z-C9sSlo>N>NTC~ZWTp-#;RJ%FAPJ&ZZG@FMp5*xWl zxILQ2`zKku8!{*YdxbXYY!+Z@bfC8|uZT-q$)njOj|OX}M%_W~K&M6F&%Y0v%^ctG zlnL$>9f0`~H4#Guc8+$GI^y%-C>D2CM5c>~*&dG&*@cmq%3PUsWcu7yrX1cL&a+TH zI#R^brk)|3$@XBx-J)}fg@IDP=3q}^g($3>M<}!xfsSZ-peWn!y&3F`c8LlxZxyfm z5$!@O8M2A~Aw+GJHyHLmRii7=y-h?CsYbU}3m9RvC$rGvBm6TTV>7)ju zFqA|ptg15zl}&5lgvs!b3F9J2o-3Sfi#r@0=_$^!^?wd!M~KZV>MOkSiOq?275ZT3 zU~+o_!MO&UR)AH+g@ooADBXjT7~ByM+{1w8Ty;q#l3`u#8I|myPA-i^vPAZZ;_+#j z*Hx&K%Oa5+;k~2qR9}PxCdghMiL?>iCt83zG8{hnjeVmq!YD$af&;`=MD~k{=}=aB z5+3>x+CRGcaNht{dH9z=`qvRWAUeQ9yNv~_%x_)!**H8do}){bk{W8{vuTx+7y z5KoXe#uAN*oGgPdv?6}2hquKt^>r~hK0HO{ILpA$lyAwNCVaew8(@N)YL`>vvm{Qi zM64B?#^;HhXfb%K$ps4j64{fYGI{1RZP-z~#wqjU=rH`6boO=G=`sk^o*Z>wXM3Fz zg%s}RbO60U?9`|o0dF#VTC`($XsFbW?)Fy1>>*G0M%3GsIV0MwDtx-clc9fR6tm>a zAuoJZbeMe!TgrFX8P4`{h>q|fi*ZhrJN0}WS5{m-aj$i5aQXU#dzKDW>V#>5-|B}GP0yJh~ zQ?S{+Dy}GQT-?0@g3ugWMNaWI}`;$yI?$7-D3oGJs*&fT) zPib(TME!?RuP`I2V$B;3)?N{H9ghDiqj;{@AxlAs;j5xW$qEdv7`)n>vLn&R<%F)m zG=e6L+VHheELZ@>ki9NC#AUCVq3anM2kl7Itb#Xqt6;5#ZZr_Y7P8n)USC?+LN^-- zVv92ITcRcT!IOl)z%54n)=@YjEJ5P7`Ip3{NZgKvzaO(`|4_3|*Gm(=BRKahOXyB4 zcvx-Wv|22wmLqmo0K>PICwO;oHCchsJyA2|t;FEH*iu6Yimg0@_v!kET|9&L`^z2F z41^vC%-?GgdC(h8Ycc##U>#qZ$iu-kdtE}0_;Wn2NTSjKAFb#!=t>(z<*@QtuorF^ zmBY&8(Rd6$OC(BAoHyZ96dT`-$UGs8Z<#H`#w4B;0;e0C5RyA_65WLOQ-WhtDt6q2 zHzoWu;U<_W!;GHzSmMtF#3k`@M4uJ3IR%?f`7NdK#GVrjHtH=RHi6Ld0@*XgL_#kx zJq%cxzV$xjMd=384|GGjRaB0IFGU-hr={_-Llv)E6MWf#y#3gQ&?^QKb4w$;Es0kH z1m(9Q{F=i0eqYU;w~xvp_w`_{Pl`s~cik4Y(i_nkz4HcUQk{=BN>TdFpmaJKc_SKm zEgE?_8hI(|W}=ZFT^D--H1S)QX#0n3T&(>#yuBS&;}V!?F|Bu^vt{twncolAz7ut) zv-7+gg?9qFNZ5tp_asag3A-}&g%U<8q1<%@BlrF$QOd($GJpf>A1bbz7(vn zIaMd;>^?$Y3Dgjqg5JtE6SFxKz7AINAUn`E(T0{O`DDFpBg#a+B_dydi5rpch|uxw zFoEw)B)kUCIqnFtA1tP6%^~(j%LR$6bC|V2sbr|#Sp3LYk zQJzFBS}o&v6ju97)ZL2-{uJ#2Xs2yp&b3+GHj(=exm2!+E-vKA3+hl( z|LBPj!#MGF}`9BG$n$?;rJbTC_T4O$;iqr+F@akM#-+4OYJ?Xg+#)s0dluEE zE?5xv>tpFJ+bN)w$C>QR-W3s*t;495>i=nizhs(R2xye~q_lWS~i zg)aoXk5+ByqVw@aTcf(q#j4~hG}CXxx3*)U7q6mzRNfPT;ZN4-qsb+z@YE-hfEoqX z1)|Cj^?|;XT(W8kN#nqYWoFDp}$iFRx1-au}dDm*X2OV@mm z(kGY8B3i7zf=DsWa#hg1w6taAv16LZ@7B`}S;5%kr;}T&g5xK4A+dG^A)nD#rt1h^*`0S|gmr~zmX~F^u9{ZFV^q|` zdO~tH-jdAf?_%OfDv0%kkgll18pYvijNh@>hbysjbjR2a?lj7D~hM(U!GIRArw zZmuH}{=}+)j(r}Vm~LLxn9Dab;O21;hPRM#F4dNiCyO$u_9VQe!17CT_(d(dRPIY= zD@NcHxgUY81&HSw=<5hu!)+uywt>h2l-O2~R9yl;Uxst|fyA~G3|pirn6hOZKA7nC zg37eb&LYkGTdXzF zCf}9yC{YDv2VOTx+9xsXhCtfl3I>TaR;61!CGIJNniSGo&r=B{1IfuDU1#=DWG5Aor zN)@Oy6vA%gJff35G?vs~6Fi@I#^PMAxs$$-MAj0}atJKn&sC|0(%U9q!k*fO>^9`< z+v1aCcW^1ODa7P17weFy$gd#WPFVC2qK7fmRivhps)I5I(`9`&FLA}cjEw$iqc|!p zt|7G(DLOC09U4A#E#aMgcv34|fl0dJaYj;`?sL3h*Dqa9ZWnS`ZPKxJ{!Z)-gm)z@ z`XjDjTBI9E{B%3DWl8*U=A8yVHqz<7dKff#51x)jPOo@gXb9mMf^vJJl= zn`S|7Bhg7hUX@B2F+1ErxJwpojA41BeWxR5hhnfR-0egTiMsbWk+Y-lpeq+`@IQmU zaQf0!B|mHmeFA<7bbUEsd;f|1b>MHYtxM=@qQ=7jfuHn4qDV=s6$g=>eA|H7?@WQ- zlP0uf$9>O0QO2g!flCmdrHBuRU^c#8W$R2bd@s z{OnzRl*B)jI8Y^;@m45ruLvE!Q$5I}%L}!D0x(SWU}fXYjk1C^Argr zLPwdzWaL3Pz+1jW$sDbWE=u+q2)`|hq>oWbwZO8dEKc~?3OE77FzkJy3nF=(l9Q6q zGoUvvMeuk9Vbp-ZpM_G_W?^a4CnzmHBrVzrtbUroWyqeWEVkoVk1Vw;sgsn7Ax*T8 ziM1T5la*?Wp{UIXEYTTUkQ#~QDRGKQ;60+Krcs}(5g@A1tb0c%~X;pFo zkbq`ST5e4~`aHcVf%%z>5j+oJwmCxpYlS0S(J?=-c%~3BnSlA5*(|E#uFptk38!tK zcX7}akvLn3I^;kuqBkUTjt^nQZ^lMpBjV@!>DyvMS48SOp~QGaj6yacbiP1l{c*<; zx0&AI2kuVG)dakli7R|U`vR_|NnGg@^@&!Txa8+2rID@@!fw=o z?m+ZvU)*nh>!;%yIVvKS7!=5PDKpL1UK1lmlo3j_49GJ08%RXp+}j%?h&9431Q>kCc{v@f7~l@ z6DD-ToI%0+1i|(oiAg}6f!r@hCV?HW52{eT9^!k6JtUYYY!vJx z_^^PoL54A!;>JPr;M@aAzAD(HSW9wJOwI;y?*Z^N0j;Iu z$%I}PXuhgDjocf;Ney||n^Hq>R*9zvc_=MabT+H#tzZ?M!^m$}wWm!Lok!pu0sQ$H zjysT}cLi*T!N3}~n{sIgpB;eT6WC~jaEDFoeZkCLg&y@G_km!ou!CgWiz)Y^U{K<< z;{2X(#xe-YXEewqBtH@|gRMJOMxVQs+{eOss{rn~iGIQu_7j&A`&2(6n{!bxHKkJ6 zf?PrBGehYu-Ic^X7tHqSs|bA|kexAbAR+jr0i|PKL*y$#uyt=v$$bQB1p5S#*OB~M zNNFB#qY5`6sFZI6$E^WeVPPV^f!Mc#VFJPzI zy`3?B_OW&du+{SMYHdT*@@}2k{ks9NIt0 z#b3l%5}eA0G;Fj*d;B-?l?69fCKdEQq*oETH5F@V!I}d%T*&&W0*RezW5PQhhRCcY z40eb<9wxrJ;8xkOsd!Y8bk+!>=$KKWYX(uYO%>6#g6MepbpT0W?I4QghKCiP>jcrw z;NP0)xfQKSnp2lc1g!XkD^iD_zM2I?bG$*wMH$A77drycOLP(L8x>F1Tb%RB^$X|a#B3+TkP5eC z@>pvorAi_dhsp-cvpbQ2QE5uYhFuG}*_7s)!WI$Di=4_^t$vCOiip;$J=vE?l!Y*h zjCb&zO=^g7;9L)8Gzr|j2Nf`7N(}SEhOe&>fPW{{{|Hm}6gSj&(xnr)Il`fHOuDFP}93hgCAqR9y~xEvbx9;3$0`Jz~*%hBObSFSGi3GTZOV-ow0X~a`e zSk&Z=e%EmiC$S$1(a`wJ5oGrFqGS@#2xDnFlK26B3`-nE;y^EgvFSOQ@Ik)3!H*$+ zuoX8GxUsI5dErcc`KE))6rvQ^p-jbc+ONTz^YAb+@-NjXJZ`` zY^*bw#Ia+b-f8ld|1$|5=YjRu5}ZZscn`}pVN-B6!4o{N9@sg=PV}%`6SfNH5w%q5?Bp?2A>};-^$Q7~VqmLrn*@S5ZULJug!8Sz6R4=SSOlOGX!NTGm5$*060R$R1*oaJ~?`^Xs1 zU&!AV%-^FbWKE2)VAbQ6#F$upO_9e`1U*RJz0+XzJC@<`U>UyWH=m$v4&J1Vg6Idr zPx^4G0aumoPt(dD>^}xcHgGGd^KWC4M3CtWRK3%Os)F5*JvqlX%Xj z;H{OX$(xdVBZdNk#;PsQGzcM z^bU(v1YaR&m3vTb5Pg+sP(cpIRLJXVDy>>>Xg3JH9t2@MqnE%e>v=|OZsQhta$NDQ!kfZ>y!CKBXU>mrMV%g zUrBkrWd7sI#uWRFV!AJee_`=p3pZNG)9)lQ7{|Ce^p8Dw&q4YRrFkNuc{1E)A=aOS zM{m_9lKYDsOa>ZLt@xDmf-Ok=t&zO522>El|3lp0w`=}nmiT8(AKWvQQ{DANIE#~+ zLfv9H)d7XMy2T1r<7miRiZ~N>C2TEk>IsDfQYEZ9$chk9E0hL`LV0$n4tEE4b?Oke>4%$#HjDf3p9wYUz zV6|M;*e7Z5qJ>+Ag{o!0!2_c;dxhgH*qkj~jbD%}V*jk}-TYwf!qqN3X<=nuq`I@W zP%f)4qBcT{RuA-a&Ke%jZ8w||ha(GBi|k_6b4r7~UHs|hUi#PqxOjCBp60;kFyk&^ z<7$FC6I`+yM)rIP=D5?tkp-F9QplS=XWNxROG~&g1251ST&5bH^*Rgic7!cOfzYzm zJO`Aq1?Zp?isel4&>7&LYq{!hWH)E|Y8dWIq4ihXyXhi&1p%=|Ny;r3j_nkNHQY+o zb&dH3yciP#*Ytu%zNewwDnSaKI@Uy!r z;e86H-7?|z1#U=AmA3(@DKJkax`7oo_eNQq>`82h&V&5})x2|wY@~?suriO>#)_%# z!7zJ}*+dyJUo!Zf#5YykEINA;8>?6<9mBg2m=zElr=Tq2bc}}6`1s(UhDS7vnF-Zc zFJMfe&JW=Y4cKOaX_n{&4bVh^q(X79r_AO87@f8FI+J)?5R>f{j`T#f6a-Tuq8&kC zD*^2N{*i>X76{uu@njAY1Y+Az49jEQ)4d)|Vp}1s6@yP6LvlMIX)KcDOXp*WZZD{} z$Q?&)2Texubs~Y70RCEbGQqkah(=eR^{0}Hn^a|$#3U%n{L@L)3qdtXaH>C(TtYa1 zArbZB*(4f-koA$i+EA5^0!(g8;;&Z&7gMxJn1B*cZ3JL{Og1@+txrG!3^mc^WOp3J z>Kmvl$W0o>;UtLdCl0-2n}yW{2g(3V^BOWO!t9i4sS|}GoUS4BtrUjh&d>WzBvL|{ z^59WPb1n&`8cwey(?X73?`|hGS*U+m)bApj5!RYVK0qidkllpH^q#9${gj>H9|_}W zFRXrLGMFlpK|-9h!MZo+y)VW=G9Wbl--V1P+sEMoniI=zA|?*R;di^Ilg|42zCTxj zdm^~ypb0si!HYbmBl&!%M9GzgJ7?|)9|LK45^|q5H0CUkm?07xU!Ib|nY}&$X25ab zahr)5>E8cKIx!aysM96*yDQ?1%1P17$bcV_*(sKF`hJnq$?R%A#?r@|&@y4HzC>aW z^9)YqveC!n2Y=aEIm-bI!&QC+N?kq;k$_GKqU!T$*h7rqyG&uEx{=y+wF=iKGqiSx z#_2su%&C-s1*+xWCqK86Z@@Om3Vc9;c}5_WsWWf0@<{wsa(fsKhLN~LDk^PK7 zpupgMA-BKb{=L8u`;}q`{EJv1BfnATz<&`6=H_oo9b}~DEAV*yt_md%u9UFf0sjyA zLn?Xi6A*CdB;ima5GXLXD7nK7_wNOUSQW(%{}-`9M#fO+h<_0Z=B9>HM;a+iWb)Vp zrq&oZa@`=00vDjjQKLopyNFh15y~80EgD^!4oxc1TxD|7wQ+u>#4)2JBrAUJ#i5o` z$BvT9n_^k_U&kr0$FYj|OEUiP%H!%1wqF(eQshsl;-*QZ3mutnm_+LMv0~v{4BK+iw+0oIX04 zpvbBeIb&2J6)g;RWEiJsa!Q0rnccmvMffZamIrK(yAGXSoLxO*=5PmJxtrri1yXx< zwYx6;j+|57R~X2Tl<*rHxa*HZ&f;<5T%vlaSl@!@5rlIZarm?WW1ml`%-_b!t1pNe zcSAbmxWLZ=P7IqwY z+MU49UlPpxW`r)4#JsFbWL7To(?eFaWVKyhty@`Z(rUDV>KyF~OUlMW5C1xnwrAWc zS>@)=Pb^(AQe!OORn_>Bm>xV7f?MYitfu*nk~kzvFxu6OW_F^q^_3l=Tx~A!fB9Dp zzKpKoJECi=`8qI`PWq3a7bJ6Cb#{uJQuL(`Mn2K&i7KW)hPOEJ8;B$S7~BMIR3HO4 z5^<_3mLz-=VY@$HirCG>#4IWfo&F0(7l;>U%Gya;PzqIU-qO)}9Poyc9)^4qi6Ox{zCaexTA3lp75&XLQ` zdxO#NJQ-Wz`>L^XL(x(3I}x}afc{>ji-*LJcmO~Pp5)*%3QJKvI#?(12Z7VeFN|HF z?vVW!-uNQILzYk_H_qsUAGWY~B6soh7ov|?3{Ikxyk3^KmGGY`7LsyO#Cu?fJvyJ5 zK7xj25Y*iGFy013>@kR;6UX5;g5k$CjH57K`GS7}VK`22fd7V89F(PD@z58+3lv-MNQKwIMp9N3de?ni=LirD! zu)f)S4xC*78E=X9QSS3LN$s3|ig6aZId59_Heu+#mC+QPDwbRl#JG;a3;Q$ z)ccm2#!_Ju&L^LU^Z^*mWujXVXP4*>bc6{H*^Kz1q2&t7qwXd35h!UoX@+hP2}BWJ^PFB@CiVR&3U!2E z{UP;(rP6V9rh03+i_0mR~I>4KGzI8ZlFAxZkAAZ$TN!2 z{|WLH{;KdQ88z`wkXP3taa@wZ^#Fzw>|Z6b9Dtuv+^I1gMarbRqR&Z$f`raH%q#9_ zaUn|)Hz>lMYYVC`p2IFxm3O}g-JuA<5bSv)&^sUEeY&eae4V0$pwQXTD?9Q$J)gildneA z7luC6UdYN~-iN~=$JK}03s=JCj^!^Vzes@d2E~6!EgGOyhk}zknZ*K(XW!${l7I04 zrSDWj#Fq%**7nCGvt)q5*u-5o;iUqwXK5ZGwRC_|mpIT0kXa_c&`+eykX59X9Zl&h zIfmqNqe=7@dDR1BfAY(Z=IiK~p@!rNqe=Y@>;*`!IGQv+e!U>sl>%%Qs|%Xe-pDOP zft3RSYErZ?@l^u2@k?!7Pw1=kRRg@5s4mKQs|9dzBV=EmuO7fZW_NRVlMkK*m;zC$btvHV%m3=12@LN3VUWQ*e`jpy)>ECScSmxdtUS z4M=j*o-f5UDK|DK2iu}C zx}-M?&{$VwRcGY&$W9Ef<~)Q<;wLTS@#Fdw**qYEjg9P6__H|h4}j%%ivUXkr!GB) z(Om!}whTzX!(;<)lA3VIhTAY~?(vn4n9f!KDJdg3`9Z5x>ooCPwlQV44#?Osf`y2O zFgO*!x3&pL$PiX&eQ%3kc{y<)gu6GJ12MXXM+3;j12XmEiKik1TTrHc zv`jD=_&Y!{iGT=Mt%OF+!8W3yGPqeyE&M8M52Eh_Q<^ zKkW&z_J>e{LX!hRob)P%8Yq+r2xUbN&*p7t+i53wHB2>%tGh-DW&?sc&Dw4vr?@7{ zr+C|=DU{tUAS*pxH&57} z$d914Q=||OVZSpnUeB9Kv5tV4me0tUW}Zf=&VUq4SShp}Aq8703^9K{tj8J_%Q2x+$bx*)ELM9f&5|k4zoZBsx9kD~7)M5Qiu`G+|w)-%j8Iw|c&(VkJFINy8z0gYgRg1ZL<#RNFG2f(23pwO&#_V7k@Pl=gYeN@B`vRi&yksUwD8sUF11)ZHx+&Wqkd;++zG-j<#YzD& zQHQ9QR10*llo;?NaM*?`fdsr1ijRG25wy;&zmwTPQJXheBCTbG0ue_f*&% zb+LC7x7*PFlH99;tb>jnZF(@Ny(=iIv6Wthr{p-%9ZIQvDx`cb;4pn6zi$Qaos5qp zxnBjDgKrV+UXCWUzfyQ~U=?D=5Fe zsn!LI^Vx%$m>8t8FYmxBmP3$6{WMq|$w43sN9WeSN=I@561 zg6WjE+^_@Xt=CyKa1JWJNP@fA$XWDXeYOW7Iy}&h?-n{Nx&L zsUQ|itoE!LTvCa-6YN^gt0~L%6mHWbbbies3^th%LKoC%(y-T*+dC1su%@RUKhMFd zBm^&lglATZt0X`d*OUhebNa>6Hd02WG~y*S{qoqQVX%nEBb2JNbIZ9jAsk6dE^Fg49ujZuTNV>S#i@DAbG>M{@ZU zIh$X-wPpafpZ&=3u@<@wl|6R|wsSqOSU%38x7Wbdc*LN`%e|{)`i>g>b_O~q{&}bT z6JI-#p}T7O@SETGtswl?5rMmFr1oJl*N4xaO6Z;%{@@DT%_4z&YlaGgGm6N{>7?&7 zVYO$#MH*!8uaUPx_&pyR#erC{2p{r*YL;V(_pQG0d%`A197Yw{T z#FxJ?!Y!5L?TqtfjroD5JEcM-qhHl@&SVwcWs$FI@Uu{T^W;*|$b3^nlaB&^d#yLIm`KLcN$*Fc0Bc5ZI43{iU9A z(O9;~1t7qmAlQR${xm~B*9_t(+e+xv&pKkC4}o85dT49^yshV7|6gHe0v}mb<^QUe z*L3B*bUgu4R-1iCWk>cTy~XZyha_~1z=TRtNtYz4P)m2GMMY5-0cD?-k!1uNKv0Bf z7#5*HM2A6eP-gfD%8r0C!yqb41OM+icd1wD=I`f|Po?Voes_KM-Fxo2_nzCzjuf`1 z7N$CidIcM6Zt&h}Z7)^kaZ%R5B9rKoDt_CGx$eDKGhH0(UW9n3wWC<5@D@)FwAX9p zDsMiQ?{tli*C&dG_pEFD@3xB1D|6=?x0aWy96^*b3@>Oz>lL+K@Qbdd-fPthXePKy zYe4Q_KDjtB*Hk>KP$d7ph8lI(!M&`)57I)@;<$cO2h~iJQW?!EQ8q&Pn|4u)SrZBr zv8ti2nf#v)r7dYWI-jUgVPpoU&NBBw4%N(l5!Q83Q)i^pd{blCB=RR2MF+_QW^HF? zN-T;r+b@-#OUvy>bF+NYnnF_klO;z{MDN2UV;ZDx1s1)TbsRDjr!!>MaM~h0muWTK z_cYa6MkZ@B=t2@@J~Gz__S0o*oIYX}ZWz{+bi|o#n2!S13kdj;=>a7(*#1#CHjT{I zdFwch0SB``^39s%j04!bkssFzz{c0af+{K#fBz(#%bYOMRGmeoNTyd zBtN%~#FMQUw8D?7V4J8)@x&%&Rhw-ihKk`Swt=sbKB3FWw~Hpqq9t&pW>#YQL?pd( z=eWJxaj^<#NB)X3tUR!`k2pEwWf*mk?LbJq5q-b|y;(bc?&`rE6v+2%$d{L7!yXm{#CvH?om?6lfEP^v7c+YXx9H?sXTBMZsAVNSZZ4~RHYUR+R=+B$^> zts~um(eiScIgNqv?tH*gWcX?j+^U~<>F525K9CJR69o@u!$YIsS1Nf-T2%0B{d`;{|0NX= zJRzUq8Lh!n`obO_>CiiXid7g>KaJ05sgBUxV|!Dl+|KCZOeW7}Tf&nvM@CeS%sd9r zwRNC#`(2;Yx`uMp1{7M{A0#_+tfMnxtB*t=!=60$R~$0mA@jz{1>W#i9k9>=U7~*f z(TSHh@lw4SPaO)9K#vpaM#WOGI*+%?CH7iY^3V%qadD*+zM(ls-XGCz4D=0^E8J+w zDR(Dd8uit1KTsYUE3ec%znKlMY?YXfi#jUh!tfA1jx;8@Hd!?JzqpVmM1ANLs)_&A z$p$nP6PsQyD`~x}89RxLbuKRsoh(7R%=yCgF5DnsZ(UFCiGM(8+2ml@)wa;tY2f4| z(XrK{J055-eEXp`5oUSBNu43lyA6;Hq} z+~6&Oi?}L9wT(l(2sYwd;hu;IF~fye6>(a!R9&vkfqFIYCJtU5^~?NWz#W#H>3~zC zcIk2LKI@zlpB8ZhX`o$iIc*i8{4r}FZ(on}Y>zEctPSxSQRf&cUN3s0=&MCNwnG6T`vps=~)m`88{ zWv`T1+6-@{DPKf2cFWw|7JO@!ULut%a}+DxCO~zNGOq#9HfgRp7B_$PNnHja9cM>* z73be=!V=^P06DXHd|a>(@(M0y5s_$SZK98|jzaer}qQeS6gCc8NP&BB+Gi?2Uhv|Esg z@xzgK3v9P@D?p<|5bMYuF3egHf&kF91R!E;TB{%)<>*D$;ac$&~94F!(XdbSBd0+fn{v;_n z!Vwx6NI8=9bD(BM>NrQ**vYW@6WYtrx+YfC$GB^l5p+y0{v8>iYBIr5jYNg{Kha=$ zcxphW=0^)8!q<6Is?|=tty$hds(6mW-bi7c^+7q_G0&CJg#HV?oSstXDA$&(BnPG+ z?pDVre~sp}<8v9itv!l_k39zPzd11{q3tyixYz@DD+Q$Or3${C0@GKneNNGLB6}v2 zTXTBVhYz}+BJX;{E_lgxe|V^~#eYvKxjxZdLd};mDJQuq^A9N-i>@;;C>pO!xeFUG zW*CMT7RC!Gej5;44Pg}97Pg^GFth<P!P`w4ZHE*x^cHv^;^8W^$}d4{(a*NhGslYn~_$Ok>qtIy=NN zgYToiVFuq(s1|Kk z&|a&d;5^DxxO#qyjFbL?xiD_t7*t&rQXi3$p_p`eJO_5+Q}zk#2R`)#(&QDv@vYVL(j zj2D$h+jX`!G_^oxuD3N}Xtea9xU(=e)Lmb_daT$}E{URhdulixiTfrBlSa|)FU$Oh z{_fvwN>b0uW7QkyqnUAjt!7$ZCb&b=68sCXQKJSHFb^`z19v)XERER)dv_y~5_~dd zLP?EQ2C8+Ls586dIS)whgRQWcTk~8jsADAsQAfo4^r(_>X-R2~0!n~u=Wh#6bWFyrsJ;<$Pv zCp;(Noda)-(Mz=y`;;CQmVoEQo#jc)6CI3W$JD8oUpnO5amCD;IJK_XJD;8p>m<{e zVr5)AeQo5-wk^=mDc zAIdL}jq%Hjy}wb=6!)KF^b4I0se?7j_&sf*~ zXFXg^=E7VLHm@WvZV!E|3`#G!vi=~RN1Jq0hCey+O|kSqrW*Ro%@zNeBmIbIX$Yb> zk=p+_@sDF2Fvi6;q_r_v=Kbq-t2XO3ySI?8=-`bfYTL(q3a^zG=Gx=?D!SdgvC?)O z@PSM64%2JecQMlvKCD6RLQHRhS~F3jE6Qr4yql;e%wtMttiRkoHf9P;VFDM$Jw)Nc zqRb zqp|umBj7_8v8MSpr9bQwv5)_wDt^R@Z53=Gx~DXxUs?IwiD7jID4xVD^q8qMQ)cn@ zWi?(C@bP%bL>~)ZMhV>31^RF8Da@o>X1$YU9w>gnnu7n$fwYF?ir zVJf>k#AHSVze6DJa5s~?3JMFZyvX|R?T9j;T!6@6vPX-3rJs?!(_LAU?wmpmWo<7( z?X!5nM%hHzN8^3bLTVwjI6Gt&dkJh=rBo|6h1*}TKg8y0KgM7Nz;W~=IZw@IRYhOs zWo9m>6VB?AiKY1Upe#7*pfw$+j8|-V+6Nhwd&(?NX_*d{ij(sG(dG;Fn=rWKLiQT6 z`NbL{NvmVZxQ^s@EJgo!I;snmM=16>m=1A-wH?`!3cLYeX3_Mz_2MwNZD2>G+VWpu zf%v9;w1)kwE5fh@lPA)y^1oR*!bP%b1kjN9OkY0+)s@r#ENv{5Mh!WL_F z#*$u@g;ut_UK=jUl)O*Hn;7vTY+l`>P4>5h>tp-8qf|8RB|O$OhFQ(=Iee+cnplu! zZRZMfnam<3bDIj*k2!_&SegI-IdUni+^@Zb?)ccejT>s6Pi0PcEk3r7&O)J&Dr8oM zjQry&-$LbVFO}UW$GI?DD)uqO)Qzf*Yb%w1+{pDdzxG}nS8}$>#JRQNTQ z&$fzgr6_xdG~gWBYvph4cJXYd%&nW4c9!WVpHRv+jijtUPKVD{d|SnBF0>@}qC%VD z?Ul8ii6vd2X4=k5`-IZWHX{yu>pkOsGQEpZW-G-UTS^tn&A4|{()LRFkQ$KPRC=$) z?#kWaL$l_Idnj>7C2pjop0}6sc2b^olO^uBWT)HS3hmqk$xW{g|D@u(v`Hh;U4y2C zI0(6K{Db4RlJW9JIiCT)@jV; z2kEji@$TD3HzV;_4ebzJTL#!)0}a^GY#uv=>>&CXVVFP3*ujR!Fgn^%mhDFL(s&E- zis7LK*G_i+)HOtnUKV};n3ymD3@ZxKzEcT z_~6XOOlWSKQL=e^wV$_o)X}M&%{TEdkSt;e!>qQq%N78u2`t zA7Yb<46MUW_&J2*g;hgpE(5@ep^5xB1Bl*X`dz>g2Yw!q>4|i`k_6riO`zkE50Be@ z3-~fL(i4!1UO!eEm#HlN3yu6l>yD-iA%oOlqi-zhQaq(eyUHl7B%2YPB@8hxXdc8iofi{ry#aV++T6B3bKMMk}btl!1Ae+SCQAqrP$#< zi*bXSqG52y+(jmGY|YlGz)jWxv>=XMl>&qExqWiNnscSgPw-ZG?b1YS2^L? z1ZY_G`;5MOwL`xNx}ZMTK2}3HWyj4m4migH{o>vU=voJz>mkDI$9_WxoaX@z1N1Kr z`j&?Xvp+XdI^f$L&@e#PJLr555#|6cTX4Vy9?&pAH#z7+AoiAF?W{}`r%?KNRzGy$ zMNMF(J|@G<&8jnB(k8ZEKhMWMCBywc8lj!%-=eZLM%K-=fz5YJ*JXBht3ux~PiVxGL*%9NDdKEPmo(X1a)GlIAHzhg*U6Y5^*(Pr?y6xcO7!4`lXj3ex_QNN?8g~l|J znWZmi`|ua&f7|J54NF&SvF5r-bBm=xsFEME0TYil&ekx);EUKLG1q#;{?)ZXTLc33c zC>TC&6xuTl%_)vBRAz$b71}!u(FD8=6wS5lXuvTPbh3SWj%=)B2>hHT*yWU(87q900jz_m1Mj4O|Bglx*Q}ETXcoh+X48gJzCc|n8Px3V-oPP(jl*ywCou555@vZgzfS)$n9xtms#{hr~8 zE209A2=BM#<=V7R=6mY&7T`J$_?K=o4e!NUz9wW*afIr|yDedU+Jy9$ zMwbKO))weN4;h1$TU5lOE$A;iDh|vu!44{Y$V+u{SR6Lsj;^IV;&Edg*vSF^=>b`R z&ICBWC6V8FDJu==pRBy1+3l*>6CR`Q?wXjC2`A2R3H4i#@Ekn0r((Y|m<)Q@@L9Su z>j>)bmY`32SO@F|jMH1-=M3zFp=Otc2JC*_eU$QtjZ!)+=ab5Lb)y`s2dgt(()!3+)ji{Useh1}~JFYOk8yrlFukJ~~!7%#lQ?|N7lm{5UauHdbP z_~nK4z9*TrsOc;`^}@>LRqrDw(qB*K9ITv{2B*%hhIC@|Ifp1G@fi;5GYVg$fzF!AowC4fTdSMALc_#IYIiSCdw02vW>7)2}gN?eHnD}$YP$N9Ueu+lR~j&RrizN?wG{q zO^1!)ex8C0JgBdr3>a3qpRf4B6h2PhCwtV}SCmV`c4%3ktnL(x7dcJnQbLa>^f2R* zu$kbqiu5*+@}vP4D$wtNx#N?yDVsAnkFrSdr5>L{zm`t2Tk+2|;i=$@6+Xek0+}jV zqR2o4VN1NrRF7hVX{=8T5hl;axc+g}GdkIbR4w8($n47Qb&QE=415L|MxSGx;u*T_ zj8WPo(k}!%Ot0`92`qRQYv0w5dTnvJ#+MQkcJ4XWTu*r}tzKVf&g{w-7!&PMC7qfk zVft|^7KXD-Ij5yLdP319&iNr_obDO^i5MOAIEByjFimwD8D}05A^+lFZ z+XgQxeznI1GI}YiE3V01*93P>%weI!>SLoC{svFb`1RSTHq26t5^iiJEMli`npAQr z{V2t2o_nxN<49{gNpdS{r)V2y13x=+Q}4lDo@upJ+xFe5AN&_+_U`sPt=?4qj4OVR z$EA8x@Pxwmd03id3NE`WKj;}OcWTMy4Pz6qhW~eunr@*3rFNb)N~f$EvJS9hWQ4Jf zXf`M5Z041GNp^IEujJ+LIr+@7jU)U{7`~7XpEtj^%!Hj;^CNsQA8eJe-(SkNwg%f} zB-pbA`-G$M8`|vD&lmE+_8JQ4rF^i1glTPU%>`^_pfDeLup)jm$_04f=SJ2r$h@8( z#QKUJF10PWe&|tt9VkgNg|fa98OuJ$~H}? zzHBW-;Hw7Fy3r_ahIoDib~-obcbmFiB{ERMRor_}5H$PaLe(jOBtmGvV$@cts?i{cW;8W7j0W5613^c)Hj# z3HM0kJN_;BvI`};U%usn2P78Z{!Amn$Gwn$mj$G_|Lq=(Je6su;o_^cXa{H!j4!mcEUvwX^zSt^{H1bO{3FTvA-(B>z>rt*c%;TGZW z7JV1(xx4r$nxVx+N*}Ko=y4gCtv`Dc)}}b1sEPN>OMpLxeqP5U>`8*1vwX^zU9%zm zFY?9qFW6mZq>0x9og!$m)6O==-`C`qChDZeym-r!aTF{$`Iy5$tIRE^gX0qJH{h1; zOfEi-CU%IEAD@W(EBsm-?07KzE0{1RY8Z98or_NdIn*HoK9ofVKo8G`>srF4Nq8KO z^@wc94uoY%czlxnYz>ZdtP^1!mar#+hJLC8hfu$Y7|2lDxcAQyCJ!_kCfmZ)4LJt7H@%%pi?M@uWt zG>s@1;E+KB_3Qs&sr+Nu&|j^=@%I0KoPyS8HT}40e4S>noX8M&QZ_6n3=ly ze)31JIHcd_%`p48C~nfUr+bFLd#gCo0qcIk`dX-BCh=G3tlIwU@9Bd_2pch z4Xa7;#cWth%wI0}vSNL0a@PMV0`o;a>52KQQ@qoJLHBTm1|uRM{#15OHoPw4Yk)(6 zI?oA@0)*1tXF0Ncq5fQ8%aIE%(%+5&H7DK&=;IKPg(@*zO6y<@zAP&}&*jKTHvBzfda%wvk!h!X<6HC@pPR52lnZ{A4QI{@&rO1# z(}E?M|DajRSCKs|UxHuiPfGQOe$m)}E3vy4KJ5&0e4{3Ceqx;dX!mzPf@dK{t6cD; zE8ay?yr<0jn$29CR9Rp{QD*%y8(x%z*GIwA`lUA)UO=ZV-vhiT0FjmF^$TtDMSVXn zPQvq(F!dR{lnu{s$%&}>uT^|4JQPVZ7boIGVa6r^f@hBZ)A0W(!2n0(dIXx^-%VHsF)GmIXd$bl z?+-%uN_{s8FV(*dz66}`hj6(gZ19CHBK%Ggw#|}AKrgcmJ&1yEO(K7wYiKcX5dM?4 zDHv-QRP-m3g*lOTuvC{4$xjLDh`SgYfMrd}*d=U3xBEE9%1zZpS~>O1s(* z@z>ZkAj9Fc<~x(PaoWVrL3p*aJg#;e*QcVs zp(*P9^;zARsDl#Dfrr;q0S5*0PG85{%)#&L5OBu(#)NO-%$ebgnc*fg0}gc~;g6qQ z$SH0(*Na?EX!HGsBsf~X^tRDgcWe+%=f+lKzxa%o~++Y}v@~RKEKR zzVspT(}IxwlJ_PdOp@5(OYqeod{zj-*Mji=BxLs`ocomNK7-R00%aTHy2ShiUk}3H xJMy|DI78#%%UMCl#z{)VALI?b1ZV#}!Z-gO;heum;7Ij$v%~l^+ zKeg@adw;w)ADDd4+H0-7*4k_TJUdyDGDW-g?AiG@6>HiHntbL|G=|E<_lK-U?ZW{5 z_JjR%T9!5^9NH4LpYe0rjhZ$kMbk1rCd3<4H7!>wT0f_;qAXnIFm?mpR^&Vr%GdJq z=iJxS3 zk+|D$1~L*U@pH%qBBv4+`Z5v)K8IRJ+7fsBnC^Gcm692Wlp)e#=;M9*I5Z_bKqC1* zi#pb)kC}lPiM2i|EA(6BlYRP0%Z^`{e9QJH$MHv?_#^m?{^YPfIqXlC<4+FxlSBSw zx%>e$`~frk0bTjyR+2NppB(ZhXQDqj>`%@_f7lM&pBz)qfIkT>ep#aAq!~ne`4fe{ z_VgMPB%K7XQQ+|;uY`pGyN1wY5)xA|T_Yz6_xp3}z=j zkkE%LlAaOIM|iT~U_u|UTRelqoK0aC_pCN6sv@(TFO_etho3@0F;^Nrn&ogf2>!3M z%Cjx2IUD2bD*NmspDiL`#4$0&?;;XLG^@~w)2VKMaV$8xvPP>Bn_~KY@jH4HIW!Rc zWmd;4;j`xV4F3^wW^kzbN2}8`t@Q|=G$Xjr)b~ZZ2hdxz@JchVFM5D_juu{8GcOkG zv2FDu(@p#f>@&|Zc5DYjOh0bdg2;^yKiwtC1Ve{_Z+l4X@N1l`UrWgqGj$J0M)Rjamlg*dI@OSF9!a2v>-CISKq#2LwbJFzlVs1zCGGJjs`LV+d09` zVDwg|O{mV!|LlZ5YUeR2Oq2{zclTuWAa#6;;%AP{DF9+DLVZ);2#Z1Xxl+0qFElMIz?TFJY zrhYs+kkZi;zBr+`C-koV*`%PK?Rou`L`i!x0|oMor-Z)UvNbRg543}#f=jLj+T(?} zs>Kp(bIFf33O%`v()>J!|DHUD6Cprp!7PXW?pYN2hc8q7X4?QPiw>nIioq00MzY!c z!Msw;?J}{!IC}%*eXWDANjw=MK}w}Iq9L+zR~ncPSZjk6QK!Ka!X-d4$JQ=Xbnd z%)>sJ7Y~fZ^$|>HmLNTj@=U=Z^oWTObA&Jtd71I(X2v5iQ}X$Zz+kUFKvL1>foYks zb_|s~sZ^cDa1zr;ik$uz*lTy|95eW8^o^{JABCq3uY`oD_gDAOjKcLBdY2jKiay}G z=#i;ruq*nYFS~iZHB$|uPmj3!^j=q=o}}benYgA5zYPPc$jVr7zb$~3SeHF(ZKMii z){0nlUKCkVGuJf_^7KX7)MchxGZjx0T}mGYfy-2nGL z$Mhb1a+ov?`i*TgQ&JdY3JlMzNyC(-XCV;#rH>-PSE3dS(_MCebFEybm6YG$jHX^y z=zEUxhSpHUeq%bdJx7Jq4dFqfY0F=87KqCiqi5ObGI-VUPaP4~!v;zx>aGYdr2tmw zJ|no70=OI{FOml+8D;ZPf(*>yk};m@C*#f-m4!Yw=hHpjzte+o;((9 zK6Z9y>=cNxV3uv6wd;}56JtuuP9`joJVRoN+&7HKWN7OORR}mq4c!r(KSt@toD8gqaql~q#Z7E!+qOc*rBu@lN_qlV&>K9$O87QyaZA9=ls$u%+MGUS@WD4mwP3{HG6O!}@prWauYjyVijjaUH@; z-CrErMfz5XQF4gadbkrlP6*SC1p91FQ5~csQL;VJK}Oib^-SE6=pb`!Vg(Z)uR{G; z;i~0;zh*%!u+JXaFocbn!7+;3*1cdfw$V2zdq~VEtTF>*=5$((8O60Gc+c?@Uf$r& zYOu$_iSwz6qx@LBpcbWxd%R;kwt@K=1jiC<|F`KuExm0tg!8zs?|TjqNw?oPhnJGU zZeu!G-m7n=6@Se%TAZFlL+n!xVV|gYk`(KjS7qaznw%$zWrq$2p6$|lM*FS?1ltU> z^ZKJb+T8BT+`e}F^y%J?S`?5e$xL$>VJx)`1|}EXq_;QEFk@6=J{}`2cK7flzh6ay z|1UJ%30aM1B87Te>_$vZr}f_u#Q;k*w6DSKOG!uvJ$pencF;GHH`+~y4_apXH1s?= zP>A4Y*g6gBZ97I~_zeFizBtv1+uTX?G}l3s!4w)P_$(vZO$@1-+aD(}Tb;@3qC=^Q zVlc&}H;0VyY^jK%^qR}7T7UVC%_FB3#aNDhW|?aiR<#^&QIF_?dva0#loMyUj4;|p z$OG!N;>wwKan`!UIa~a@Hd?SnH3KjBRK3vyV=zODtW=&vyT_T5uN;UTmb})m_b`|wu_#zZH#_5S3MfV zyzXtgn~FGKy{&8}$xuB`fmxi<^5#1%$;4I)uTew?{oWWvM`nO4+Rbao%yyh%N{Y~Q zV+4m-15GhTV1%onX@xh1Xl9a0v=Jw>(IfLPy>&n6@s=KZTgP*FKX8&=6*I58#*@uw*9+FMsT@4+Mf}K-C|b|e za}l4@@*@Z4_6oJc#%WL<=X{dmgsVJ@a=XaLT(F1a?&atJ_-XT7l9m2WCO))CUjC~%##5*Ok zeHUr)oXVgn(5=aY)+1CmZ6n=@keYmnc9ho1U23wEV>x~k4?M`n9lQbMk-Y6FjEoNW zusEJF96|GY;=~S8nhTIPWyXF8nF&!4$IZxi!V1UkCr-dJN!NMY^EhN2ADC-?odear zgSg^d|AX96A?{CZ`s?cZE%gPFN$R=v*p{8#G+mDpvrGNCVs7t}UHx!H8@>RJ$Mk+X zhQ35_B>p+dA+i5_ybCj8^o$+9v5Qh__%`Hi^kvSj@N|>YjMJQ36iJC!Y-|Q9)|@l; zg=;tzt}&^wYNm#UMEAW_wW`cS=2mW-U%u9R>KncR>Uf%T8JhvkcKXs*il!rTtK&%Y;H%_n`$y;LGW7jU1l{lgpl#3s# zF{D);t4WP=eY^1dm#_=&*8pUFWK`JHNnF4owU`OI^OqxJ9;!e?yT z2T6(+(~YgO=+QNHIzxR1w+@|m&@PjPPx^4}H0)~O^>l_%h#`p-^2!+(Kr~iQPllDZ zIA`Eq1vYoeuy(AZ3{DGD)iwrMBrTbTi?o*qJikj0^q<|Xzdj5PH_FUnElB7ffs&`=mCW`Zpe9O(w&lcvCA;VRbFa6Ew>j2``l7dp$I?CY zohaEC3#u2_zJ$Kl8vgVb<9w<{BI^x=`g>O}XFpH~N-h59z8pTzpa1RB> zC|pkYX&o=FAQtO*v1r(UTkgQwTNux{Y@eLtMt~pstdmdcmX(Frq3yNs=z z;gsskhPp6LkD`j?U8X(|9mvAkJ>UdhxRzJ7{Q5o4bZ#P9xZhq?Gv9Tsfkx?A;J6)J zoH^pQ5N*rr^#fE#X1J z(0fe1r#Ih6?-uA)x#_y5ScO)%?nL4RBj1Un-Fz%?)V3clejrcR6>i6}k>PTmar+h< zgZ>bf0zsEnOtn4EaLYzKeSl68-ucs>To@7Co;AcHP>((Ky6=RHd3({Sx}{-VEyV!{W<&SI(nEGa=9qy|uV39b1&{-4x@x))-jRCiV(A9U zX`I%w(|#kkzfa#ULzC62Cu=?g&-t>$F?*p!w<)sF5xVVqbLECbw>_EB4hKg%<7f;b&O}H4|6L60zQ+HlyBN`t zGu)M+7NNy=51P{0LEr9~52cgdtNq`-JwXSZ#HFxe5Lo4+hU%_%tnxo#xb)buRbH!G3IJLLPu#vFy5!f zX%@0Ko3hxY4RJy4M51+(m!r#TV%jekr$^vcI~VQg7!uDQg(5U&8Wes zY>Q7&Yb!%{vd#oN#*kKPYm6IdPupAL6s)qbl+Go;+i2r!Io^G?d&2Igv&bN>K3O|u z+a6!i^HxjE3E6Ta%4@5guR`|^->`4vQy+;Qu3&A1IS2%93XJ2;1#HKK^)@acPgw=I zMigTk^*OfCx}1zRD5IV$&3t0d9Jnq)+GOb_$F8rWDvH4rGjKBP9P)h+eLek6T9~|Z z>YDGm*lN)-mOkv@$9h}UuK)e+^zEG|*O8{5#P4FD>7XmYtzZS5tDdkz`b)c0%d2R& z3=NrV7Yz+`RFFJ}4-WVd6l{J~YuN`Gh`F`a;9oN-MNZum$Y8t*u1612)HQxyj1`jg zW}KhrbNwmE*w_Y;B$9JPrf#4nt9ltwgCJP0p7x)q8-L<#0GiS!Z9MafW3%6(@W6 z&hB{htrR3PZU~&8`B)MBL&BcU>!7M#5%3K!pdv?$Z#a*6T~pBoAVhD;fM8m9rhB>` zB4xA|^IlC(Uh$WhoN6+LUnWD`Gv13taN5Q<{45b15#R8(2_i{4__f>8m#lL$C)c}` zC-F;AF3u$$PTX^JyiLyXaDKqU={=r1!*6N8z`y%*2P83?Y3W*-LJuhPFFhk!)lFpx-m7s$^NKUTB^P%g{<0!Xyb zx@qe@Sz()Uzp8ipN_rCWO4=iE@T>Ac$Cs3cYtH9~nMn!7{5?i(b-N>@L6zv5dY2SYXTFA18ROvBA`@W+6T+s#;ZA_sQY!0Ob zuK>D%^;H0Ulu->3{YFu`_8`#pj2;D=&u9jAu(aMx*K&ZaW0VUtmr)+jwTxy1NxRJh z65nnDx*4U}S`m;$BM2ldy-Cp;746#!4JzbED3-I9i-DGLZI=QqWi%5=XEYyZ3G>|w zw4BkMKq3(YTFiX+0u?f<1S(*(1t=dVTZ;lMXY@Fb$UXxkvYkL8`y!CYejP|W|97B8 ztnV<8#NfNC^n@z?sVe=2D*d%8O{&t9KzXb$ZK{pVSLiaJnOr(op+yR90TK&Zfu!~K z07?Hnu1bHRO5aqa@2S#sES_)SXevB!IY76w=IelNWwc0@E&&qR0MH69y$?w8suD=@>Jde2SF|+D&=P}eAc?^; zMO&+A4*`7~n$xv5Akq97kZ67uNGyF3NPIg4B+>W{kXTRbtJuD5pw)~%4z!ZdT|mWL zM+s07qiR*!s7kk}(sm%pt6d6xQK6~lYFdCb?+20y9RQNn`Zkc*{GUK;xVE1u+G~n7 ztZ2VgG!1()RD)h|kwSA6S_HJ5OAVkq8SMd*dcO)JwH;OHrwaWSkZ3-o&~!|oLc0=3 zG&ca<$(mb%#E-{-W`UNj#T4x`3OxyQp4g&j{|Y2=`R_n$x%4QIwC^iGQtvMn?M+1+ z2a?KdI8ws&opLJ0g3lLd$@pAFTzF zeiT!sPpHzps`M8?JK4+YFVM6Qqpd)w26^>$pbEA$JzLX|c%V%Ol5D?Pp+yP>fW)db zK)0|&1(0N2yDHtG&~AmE2a@sh%RuE^@5_qzEk*l@qV*}-+dwkf{vPN)mYsqjKxk(J z3GEU^yF$^H0Ex{3h1Mw44upU3{PXxx#^@B#dPaUMl|=SDAo2H7An|vRD!oIYyA)av zB>rvy5`VWS+QW*rL(!g4w7o#$+e<*=TaTiBN73Sn_PU~FTx8D%nKLx46n>;@#Xyqd z>w(0hjS6j6=pi7<;tn7gPd^Lv36923RcRlPXc+{m;nLrz(%-AnaiD50eG=8zGMb9T z>0+RCtw5m%6f%J%&d&nXvBcR}*nW~Ft^$(0e-@~bOJ4?RU^D}h;76J7QXuKcD}i#E z76y`*?gnaNiCi?~{am_Kp^ZQhE`0$=YWoh5)G-YmQ0ff;J;ZzmfW$X{u8pPxeF~-N z+SNc?fU>oRfrM{Bp^qSpqIn;Xl%56>&o^9d_un4_N&hWG14;kg03?yz41|BEtrJ1+ zWh0rxEPDx%&=x4P1ZX{%-Uak9qe`G=pmgm8pdv>5fFz5*4kYdS!j*Qceg|aLc9o`W zW{D2~32mN21wiXjnym$a5NgzM4^S)9b}HHvK({chQ_-FWLMlM^1dv$uQy{VGbs({7 z2uL))4OGt(pT@M=#^@O!iQjVyy`<0qpce3@Yrj&o-zxO3LQ_9%YsmzXES?S|^?pc| z=Bd)FRq1?HdZQ{`q)OK+bRW>AY;zls^o1CZSpT#_&ntAr)pmrwqR=0Jq^ErH8oRUw z2;C5o{1#A@QQAlB*1rTudO$vqSkMF{`4ZrE9}L2BSZy(o?F`cdcET1+mc} zLc4%ESn~jo#NgLJlH+M}ZR@83tzj+G743tHc9o*dRGN&ASqkMVv`V37Ac@9) zAZe{107)iJyWXZ<2qgJ8N1+>m#Hyu=RtmJ9{oMpq%cxKBjQ}m<82k=s2ct2de_`|< zki_)r1$J%MDii>cv9ko|(=736Ad}H&72gX$V%0Yk?Sw+-U;l#^amge$0+?X5Qco9(?F8<**NgP)CGMxK$2mX0g1$wKq7GskVq^6I+rCH zfWE}~9ss(4Y1@DvVe~9ekkOZb_A=jBfxgJ78%QjD8Azgb9Ozb-_!-c@GT&>8?+wNG zKNVlf75fvOml0%1ym=bL~q1Oj~u2m=t10fg=f z^d!(tjGhPD#^`H6F-G46dLAfUI|9_j=sQ5qG5Rjh7Z`mXXb+7bBx{q+Rf-qpl2Dq1@sJ~-vB+$=yyO*G5RCWlZ^fh^aP_*3Z>qtX}g$~4)i!9 zk)Oo>;9~96>7{*{x8;LI|M3~H z`0VGo`5+>db5X~&OE7EVXN#_B#|rU>nDBWM{4L;V`48~n)1Hqn@M#+U8WTPvD9?vX z54zl+b**zdY#abjXMRO>Q+a(|9sb~9sDk**tIDeDYO5=&!gbYkmDn{+D8DaMRu`_X z4>xIZHdNP!NCcl#r!}oIZSlv}eKJzEF*JW&Q+=edJhZO7z9O`)vTPH+N;ikf8tUuj zl#77t+x_PjQ$SBk!4x~;>;l(tRq@{Fw+3}RO z`uh3TV@#zF^Dvsu-}FU#N=r9{>uCVv4^ilIDgK|pf2oTo7z(sbxF8hPjB(5ls-v0a zKKYOy=D`?Cb~`-x;^`4o;%KJI+dY(4QG#!!2i0fcS@gL7m?UdYxmiiL0gaioI66HsVLY~m)bwyD&V>HeH)$#o;i^s8N%p*k)>4-6T>hMel zCD%i_9F(~p%11z11Q92y1)#`B*@N*g8zje`J3Tzay$%%9qbEFxrvsFK^YA=7iRT4S zex-QwR?J^`BMiPOU80q)F$I}9*Gs{?exsLy{3&!O$ma#1V6d{hpd4EODT;>p#T00s z<)wfj*P*O{6tb7j<*D^x5A_uEI?5I&KL6qIi+ND>3=hxuz%z^WP@L)WhDVAhbOSi* z;YkB)3ObLp7is<|Y+esuslBwkzKJB|Lzy13QjopWt1NpO%jzodBp=(;EO_zuG}{X*n<*gxvUzR*3$dTUe=4V$5fqeP>Y>a>A3W%#p!QBL1yV10DQLm_ zy%gkOm6w9p+~c9lLqe_aQc(L`59K=Wbb#uz8TOp(;hBeszUSeY56WjeJoC|l?HTaeup=NsS!?aaiBgD5XuTvl5i zh&=dUZK$Zex-Lx12-NKM|V z`3vXXpp{lKZ3EMYx1gdzzduAaE~#!@U0?V>7=p`6SBEw==yl=h@B<`*^6GGPs7Wgg zHdMvX-wQs+FDg`p326qlCMf~tO#R$3HlYzWm=RF_9;%NoTR zWJhCtQxg)ZB2o_N&5}G#k%mwsY$C<%iDTgziY%eZ#!y{ZMW_~uS6&5Q#0fUkDpGB^ zvc7y{D7?bvT*~e;XCs#=#-iG?CZs8>aPc%SQ5oAPA-C$|+*?syx6w{aCIqn;cS!Cm zTq-%}IOtVpwe2#bMgvq-F0ZfO=(eSzv8=MbuCyZ5P+M>37?KpsXh2JtWR^CDKtSu^ zr)`<5cy$%bqw-auu+!UD*yjgJaC%Tx)>s*`JMH4KIvYwut_amthO0D~R#$-@kHZHg zyqW~jwj2nq8=dsFy2AP`G&XoR#R@NRRk*QwqvMQHD-FU*dHh;jUl&GCLuQLbYDijI zMqS3va3ycGm%as&t3YIt$VlNPJCB!@t}Lsljx^bBPU5o@+{(U?($mCxEcL6=udLu& zjCAtSR2nLSO)Kgv3(CtQ7^ogtUXABF>sH~AWp$_worT7iJa5PcN5-2Rn2}d1gStp;L zoX0*1U}?r+p>NfO zp59`4dVO&uJ2c$YQ<^>{K0VnQZ*HqkOfQtn#la!@-m*+(MJFH6-_u zk;QyVEQdl*cf!?f4$fN6(7b`7-vMaupa_&lxNZjTCyF8n=s?Sl`Jfrp6QL9I82ApJ+(7Ch8rx zkGa{v$#<6e26~HgH7|j1?FNq9&lERw=JNj=IrETcnTc-f*m&*;flW}Isg`teVygd* zeaLL;UP(P9hU)ZA>`sX>8ocZq61?zNt-+vna8pBcc41 zShM5a%GTe?DRh(__cjK$b_$&(gl=bO8}x&oe#gCop>3VQPywMk8QP8^)c;)!ZjYKl zyt^6LK?3Lw_b?Q5igO1X_g)6-oNj*ZK8E5>cVDT?aqnlS-svUx07D61ivKaypAWy^i~g1=3D;Z>cosxX)T-veP}t56ovn}3EyUn1Y<>h6W^h-wID(5X znAZ+~@S-7^?RL|;LU=Lq1=bXTi!<0EeFC8+80usXL2yY1yQGUCv=l={_7Mb^X0Tgp z7~y3Yp21Fo;Ia(P)apifIfi>oWdm5A!0uXg2(Q5KEa^)Kt;kTX_AG=~Vln!>Y6Y}1 zMfzE(2(H3lNje`wt1>ho9S)(@7@E!Qhv4cA4ziOWxCVn|>46BX$g9bo#v=?ejNN2j_JL(SY%&EI`6GExSu0^_cj~c-;u6+dnmH!zxCBStk?mL z^vpYL@IXg8=3O>;kb{2tzpg*!AuNsl0(6KjK-pYbEI?53fdmM{+P_)a598T#YojE=ILn2(X&{0T0 z7BK<4nZnVMLT*~R;%kG9e~dFy$oKY?Av;9bV;xM+`Q~Ickg>hV9Ou-vH6YK9t5g5+ zPQJAv*^H?jSwTKeKscMrU=xvd++zuyh>A$nCQ7jgYN#mNs0VUD?&p;Ix+`;pm87&^_#cNEH4pf6?cbSK~4Tfn4! z8G~mah~10hUe4f|h>D7pZ@E_xISbK;yU{L=dnJLho%~SWKsOit8uw}^axyFF97oG} z4YPl)lb4|1Zdj~P{PVCfO6;y4WELwHp!1#l93R6<0_*~(S)}j@nT-Xx(8(qelk)Ml zjLgS^T%<^%6+4C(iCnBmHj$IbR%9+=o@Bd*jm}iZeU<2?PD3i4XjSMnLYJYVP0Qv5 zmU&p>Uhd>t(kk--fh(NWw&rHX{Y$3h$T=LESF&Low>Bib@+zl$pj4JFrBn6QsDyMX zn`%HqV%9{W*C-O~rI-*wTE4)!Z%B}S;Cm*5WYpitrA{~;aer#G7X*Aan~ktn;`6i z>o9yf!x_~7x(weTVRU6|mewP1rvMpjl*Y^SAQgmZ=`MCJcBcse_-^ThWx`tq;Cld< zO9MsJ!!`lgl=60DKz#aS$^f ziq{^1p8-59S)OW>eHO_I#4Jw>h(1SAWNasbhdL4cPaF4nS=9^J8t!bOm_~m=aLvy2 zKw>XC-Q~_gKXS8+mDgH%2}E&-wX$nK{$+uSvoOU6z*n5^p`x_yZUjf==vAkC&S1|F zdPE@*=QT&0s6#MmqSpzqw4D}v!^uOcuP~SEl;d_;;!P1o6%+$0zC~f|Zo942+s=UL zGcy8m?_gdwU36vueiyLTPmhiNo@1M8_kiI0j<(b+EA{~a=DgQp9}0#H_5~t-gf9#a zA%p!^>SG+f`bs0Hnv#V+0i!#K1|4tJ7}TL9n+TOK-4cB zv?E9Lkd^z=$piDNb=ZibBS}kqB{4=AWrU2vUn5q(t&ll3t#6#N#pYVO?GS5Qa zVSy@|)ngAPs@?T_N7gMac6(ac9|Yq%vsXa!M`yTSyUgBJ@Fyof+~3>NkM6jSk&GO} zBK+)(c*AU8Qi}iLjM&`nM;LuonO~j!h+n+@195(HM!X^(&RO+$r=64VvG${fa|?s2 z`vVK7oh?rwd!(Ip|Kxl!2SfZsLr7i!r4ti(PL6w$jpD`nn}c0qo$PZG@jp5}n24uX zQfu`e86Fbp)WD~l5JC3S)2zJrp-@QrCZe3~Q}P{GamG5sr_8Jp4zW=r-dQAB6NZe0 zWX_#~QE;~9G<(sI%xprOV+riU@Ug0pjCUc<^oxdFL0Cw^!EN%EFmx<}QxvRYLi8 zo_zcb@_i&$4dqASkFbJP3+XoHQHEAWNH-{tF}y~|+bTRkU`?rB43wuBT1#pdp{E&I zn;Zw(GX&NlP2j~)WX+KKQYf-k$bC5!Sv%yu5{j%7a^Gd<)(!a^_4kOZ7xK5wKS-ga zD%KALwqQS+h7n?ekZsGKtn7vyx4QB8IUu@G$nJf9v7#G?{H@Qg7TkoxTjT#0h`%ZO zm*f5(z{awZIqn}e^0<&$)&8`|_>k9ze_3n-<{eJ_|3418(0ckO-H9QpTG6gC*)4BD z_3h>Y=HzrM$GokGZ4tsbvpiG~mDkopwiE=3VL#09RuV2^ZT{c$f(>9GFWcC>WT@tZ z;unX3ZA1Ci=4`wroycTT*x*CU3v@e+`h9ec?Ej=Cw-5Cd`#J~aIqqBw?LbKO2=goy z6A0_Ol5 zZkW#gJe+AJo0y}S*o7ZpMUxcm>69c73yAJ0qPjae%F0gS$0hpF7HVbz5WB~5kFj72 zK~3{m3$`+HNj9p-SuAA)i5@Sgsm(Nr{!S7n1c=E>^eA&;fXOiZ@&M}LB%6Mg(p|$S z+sPKo5i^s;DHd&$*ake+f>S8kI|l`(V%lV`U1a+^rBO~7Q3Fp^SSs?206fj+Sco$N z#7-(NUFNI+ytB%)Pn<2dH2ZXs9q1UuUJEOMV!H@7*eT6%uElm`S&y==Pgy(h-LLc#vmF{BqVy}DHVnxBU zD?DPcZi%aX=245y5KQGBv)D|**m{p!s7D~S$P)sY%4+11gqWm1? zB}*Sx@bclgLTXR^Xg+eDklH0bCK)Wu9zwD#pUf9=Pjb>5Kb?=;OE`AR&wWm^vNtvn zon`iqFDjXR$Y_7~(x*)M_9bh&%U1!~tAYJgg1zEvUqC*(KPmQ~Z+ynI_G4wtLxju18e6}qfPsq*bY@(+r+7L@Nw`CHJ zJ51H`>7jh7zc{ytD*U+=JR{^I*j!+{a%L!>YGs-Mr9AFuaj|_?DBsmH0=+CRwY^a7 zSs}Tw#fA3Sq1nT7^LG$K=Y+7$$8|C^_)zMe8`8KgrVFHXUMSxiNX!q`o)^NFLQ*^5 zq=s1yp$klEM=-SuLngL+6mxx1C|{qP64VDDPyFH#?uhGE{R|};%6CbqrB3wUib3s; zbuqG=b7?4_@9W5S4iDm{aW3zRaY=ZYpc1@|+s4Z!DB5M*?;@!yLXt>6&AWeG@&dY2 zq54d63aTAfy}+(ASTf_dxb6jVwIU5PfRI~XVAm*?n3}@@gUGdLiMCummy(_nYikDa z42kPJ0()WXHRV25lDOW(Te6LHDJbfnBYs0DpGl-snOq*iEvb6s3^%K~AGk4;#|B1} zqu#yhO(?^90-Xa%z^ZTpb{F#9KhiS@6APEhB^k`X@5VIb5mX5Y zdJhhExGaX!?g0C#d-bf>)8CDQt~u9Ev>|lY1i6QO0FJC#DzGnvj$@PljLs z1S=q1d`Z3{=TiPD8NayvvRQpPq?w^oM4~+tf{p++Of`rA&&t^mZGjsw8|k@FzGtXZ zaNMgb@;s1<6Np`Hu@^%5VGCYk!52e$Dci&ej(a0BWGyIe7KzA(#9rdG;J8#qNFH9s zG{eMI1EE`$S3-TJfU18`^wm&b2lqy*bx`ni9CSLcuOo2>zvQhpZy>@@N%UxUlF%hs z}<9d21|E9;&Lj6OnF{g~*7!P+= z`qkeV3^9n0da5Va#dwfejFCKDQyB0-Z_kkCs{!O=(Li_s0%fx zR})p0B8NNf7}s>(DhT@JtTuv@L{K4G6TrtH26TtaaE4Bk^f=dw8t-xd=OS-5R zUCFcdD@(cBnR6Cc+SQ)hW`Si~?VnRDu&k>~OS=V@b9K6!>PF6BU*umlldHR4$DL+{ zS8#3n>|~)8UF|G8TVN$uC&2%813%Q$SM;~GUjqvMeOp0m534wJf&{e>Rem_dAM?iL5u;GNj`VyXp;U}6w0X7g| z4rAznU_(j}&@;hC0`!!-U;|WR>^L_@p zDdJXvu`1!sTm!1&Vs(NOwLKhH6&9qOGXXKEc=4mUpZ-*avHZ z9dU4`Vyns6jRPh-w+7cItmk?cI|x(21#AL38zy8nwB@X=1n<^8Xd1kLAU zmRN#QK&#FYw4lRrhi!r^rQAFP9UPxcF4Hb-BGiB!HIB^^Mh+w=16G?nQE5vNGj6^u zjd3LEYzb%GJPffVdZaw8q*~?e?B-+5>86-i+DUOx zZ_{1O3#L4mSa27&r(EbAn28g^r54*2m|1`>vsfOOS*R|z*lxhOdS=Lh=?aS#fXy}F zl@{y(SRN>JV!T{su})wE!~LCztSSQJunSnBw|^L$;%ls2QRKun$Z@Z=ST`^{XBa@6 zUT3ixz+g)_hz->B77MJTH&`sN;@)VnnHZ0D8NSJaJp!6)xY>fcyLnV1hFlNMfVWt5 z7Eqjl6us4=y_D@N&+CIB(QOv(^HAEwqiy@q+BE0%2F`;b966G$RzkVvm=>Z&-{1p+ zo9t1mZ}8cIo0g(x-{6CSn}&HbkbYTk+hSDln+QWfm{xl{5Mfww({ifp*Nlz`Zdy;3 z{ff__ytW{<{U-gnf}2)+I*|T6!A(n2^>5_&VES6eo^|}50AX?0)iF;dW7@;}+qu24 zk+N0v0>6M^taIDmLYZ2kRXjc-!yBD&AAVnl{i`NlhT0dDOsafS@&>k~L!B((ZBAaDc#Q|}uRI1+%V@JR%Y3XF$lB1Z=XLo1PEf+HbC=-A*e z$PzjZN!#9=BXYbTrXJdeoFIs)h$%!)6vWg-JCTzFu~jjZ(8&Usx|l}f6hTa7>_p^L zK}>DzOyo4mXmv~{a=IX%Ur4q#=)rnkb5RqAz$W<=1#?98)c|BrRyV)k_R2gr5BG(v1;%z|WTDMJw1lo|$ zbuJ7RG}cB0u2(=LHYRX`+eQ&VHX(AO+nmA;0zb7Wk(&%6GGmF{?6#?pKobbvf|}bx zV{Jy@Rs}?2B7xhmHxLm)wjy#nM8;0kNLv%R!yqEF4Usz~mIw*71EIShG=7{$ixIio zAR<#ou200VJ;AXGbLJy%b|%zq**OKAcRL6@<~Eo5XDHH1Er`>qE4L01g1;ObG{p=YxS&#Fc3^X}UMV@i1 z!y(ss&aLa2!Q42t&$;2S<2;Kbt0RxNk!RhS8W#sGM1H|-?im{DEvlfHU6|-ENp#7% zQ~MHQzsT5+xsewoHV$2g{fdcAIo!V3$gfFc7SgGGjj>;4>?hpFs}lPV#(u-ZRzbOn zL6UE}a>;>%SQ@>JHu`V5x~Pp0g=-w=ZA=uy{c@)2a>5HZ&O7ex?m{mt$|dlwI~y0{ zdXRn3o!wC?VQRu5ax*6MzB_v+RG+;(22UjPfm`mL+vI_p6a3H>OC}%Pg6Ky$i1iHk z==Pk0K1Rb$%}>T4LiZ%{iHosgka{AYy6I#t-sHFm20wGB#o8UWfq~CmY;Mtgc4X)a zrl!rCm&pT@5LO~o%a=hWmztDl1%)LE)K{d4**I94KzvOi+1ijo&(a=)^$El`J~1gV z&2iI2zx7ePV{Aib$`Jp~txGndg9VbonucV)_X#G0bq(kbK5CM|$_4yKCO=uPu&@RJ z`iW2qM*w-!iWLUf&&2ou1e0K+5LjqH{6Zodn}!Fya&y(m?(l1%JHP;3I>B#lVrn9u zZPq!0h&560iPSJk!^Q(XHt1Yo~9?y+q zc{y32;s^Qdzk}Z{GtvLJX;gF$M-H?p7DHs`9|P4VrX-s2Tm^@rVG>SQW!qz!Ru1Pm zghK{a%Pz^68|JnpT^Q_>jP1*hhr|9jaQ9=(NEmVQ4Y8cOLfxNGlu&&ph0$~Xkt!mn z2)vT5PiAqvYE8(2>p-$&R6c+oOuU+SYXUE><62oYVe0y9rjB53Er7hI()mVIS9`Kv z+U`i=wTknsXPKkOET~LVBH7r4Ti6sPSNM-Qa zx+Rvyaq|>@dP#w^lCK7wOT~g(y5>@XVvs0y8nLAXYfQ#kbBaPc4asE$mFB?n^?K=` zxP1e>EEAAI;halkIYE-G@}M2%#%Vy&droA%>XRPsd>TG^cQe>5IQ=2qHqOJ`_l2@=>t{Uu?SF-P{7M_`( z2_2eT#mRtJ9bxQpakOP{4FtPN{X?C2F2rHDW_V^HKQLIt-tcMw-+(6*abF`7#<}L$mNwFn-iH?>cy4N6GXPqc=85lNba*lYD>jt7VsKOE}LXT zZxtTVNd{L;TZIMLT99!vym7gt&^7{%7YNr%3T-RU1c7j$q|kN(Z6?rLOnUopchB5n z7lqy?vV$U9h|D`gVv1l}1?YX|vM$_`PbZ;eWGIeMCRUH$i}}HGs_-ef`fzJo3oy*W ztuj8EF&};wifj{()Q7_nSb&CQxyEzBGL(Xh(GbqYGYRZy&7ANx(MF5fv5)H?R990t zmu#KJjk6KQH4yNmkJ|`8kk~QI@feKpBZ)}?!bbU-Omi56H5lO+!Yv+b#eXB-8s<0- zM);jXDnQsMFihT-^^gw3^ro~&>N+ZXq53uY8-#H}`VE4W0`B(gRM zY-!woESghv8s1dNC~{mQ-KKa;VFr31)L0=)Oi>~}Pqsp?McWl^pUKBpVGB=HxOoVf zfjT~7@o6UYF2!-JrFq;*@%mYckKsMb&f&>W+%=~%`2=R}G-j}B-q}nCo-D_uUb3*J z#OBgnfDv{Ht2lIfq93g#xT^u-=L7FE3FQscDE$exUIceD;Iu?D-99W#wBRKvTbV_O zbr>u@Er!^O66-WrORN!V0`!E75$-Z@ds9-BiHkG;Ma&h*d$J!+1MtY6g5BY)DXYo+ zQiNxCFtfij!I>Ut3a|{}9uKxfSeE$i9$v@&*m6W?d8ig+d7`}@>J?-K5`7+Fin5Yz zy8iGCIP5@q@o+&R!&=r88WPNW=m*KsjH$m}qrlUivI>QeN^buB&|F3jyI*B84B zxcGA1^_lgNaDSn{uTaML*^r-^6HaFHtc#r4HPel zUF%N7jNcfDL-34pwQX@_1};30@ZfC*a9{;0rf~TT6p5*MUC+ zj&fXp1lU``nL=03aJgZy)K^y;?(f3#c36PF9o+}jZ>hs8vv+qGWlfi$y+>Cvv5#_b zT-JKyf&D()jPRi&d!gFaM0KFs7E3XdR>lh~ro&@+Tb{fC539hJ~y6$xeG5(@s9oZ82j-lI(K zG&k~Sc+`JL=}bQ*6qLDo3gZb6X8LglQu`EBcp^NY1$;6*AO$>2DkU5VInN+z_Z&BJ zXgKmrIPzpT^2ERV!#&rHJS;dqcftIhd*1t;m+$BK)o1NjpVO~iXutZReDz{}^~G@H zxp3s!aAdxJxR*c=LOk#nIk=KJKvCVR(A`|;Wm9!t&uS>(KDzd0X5l4P-PNv?_0_O! z8l|1wYoR0wNA?Uy4hctI8vUPpy({3WVfP06j~mTD@cCQp=jGe4n{Ow@N)QT?+SmEj z*Z9?2-NtVBopYI?}X!nrE=NMZ?*3*tv7Aod`tSKbkeuOog#;3 zyxWbu9ge&ij=W|5y7$b7+&db<$6q#+jm!t{kFGv!peyI1k48(3gWZ-aa57_Ihk`^t zGa?hr%<)>~(EQ5KnbHs^%GWthe1kOv{%nxin+$)4u=;R%o8cd1jiDXgI}HD1!X;eU zy-Va5Ae|y2(EFTKe+}F42Mqs)$}$2UnM_HB|CBWny6*lN@KJ^>d4T#)I7T#Aieb6L zYXtUM#Bm}5a0-vJ#sjJZrCBT^HoE6q*y z8zHf0{hGz9jW7o-V(Rw|kwqfS#lZohj{7a4#Z|~(_P(=;>k6{8@?~G(2gX}gac{JY zpSY>x{zz*1QPkKiK>b8&C8g?%y|V57#f`kj4iH?FR*$eCGI?_rMtOg&%+lHs^zGeI z@8nIv9rw3NsSP69O(+x_l$qQvlD~_jRPM$`MrrI2kf``)bN{GJYh0uS7HnEpO$536 zhb5W_3j5=^E!Yh84D@0{fD3n99`l*4wbWkBP+$$-E|Nx*;MHMI=WuUf&}I>{Die`h z#wwyWlm=n;j3%vS5fTwODszj39Xg@L2t2aov$J{z(lp92E{x8~Ea-yd zTFIF$U4UJfY?^Fc5!*oMkjlkuv8<67Aw8LNV{s@xjK@&@LzHRm5$l>oDUhWAVQksM zXmcsm6d%PGv2Ca9RH7&nv;YgAlh&l zAifOO2+M}LGco|RWNB8hA6sg^il{(pJ0mXCBCw3=is-fMS_~ByAc0a_B=8XOb}XiK*aiyG?SNJAEn732(qaSPxO0opS>?qTHsa;P9i zLF{f%=rA9G|Do16HCBg5y33dld9M)T_l^jDuZ}T~l$gFtq&UH&Jdj?I5(JO-Kyi#D z+M#3cffSESqOnP`29AqNh6RSX(B6^I353iI@+3kh5i-}z&4f-NWUk~>giZ$}t<6`q zX+mc!)K6$Kq4RwyG<1g8g^Ka%QkKZYitx=+j>u(-=)1diLRTr&51kvlR81vzonm~u zxHFL(fTZP$8p;Bi#qUD+Ccv`N^#gX?E)I{IgB4!Hro(l+`F95Y&g9=7{@tB_XYp?@ z|Msze-x8UPPl*lmUbZjY78${cav;BYXC#RS9Qi3SbTC~`679%AWbRQWLuW0-4<>&9 zC_LZMgQ?^Yat|wqWw;{2LrFgVZ)6@8fnT;*Cf>xiMduKGMbS1~9mrh}?5haBs<2)t zC~+Q%*9@s3+DwYv9oR<@MOA*NdJhCQY zInfJULF#R#@FiSyTuJC1h2l*RgzA~tyNW??nZRAE+y!0B-t%6ha|FKW%*5)2YTt{v z*Kv+~KcZHg*E95iof_R682&JVb)_i1l#9iU1V4)O%Cw02&%iek{ur}uVFnhVo7s|> zXg`U-V7jNfM>K-BQ07yEU?^ZcjboQFglA%;K0}Y>+b@X7^J38;bjPpAWLuz738! z93;PqxQ~S+Uq{@>8R@&oNMBs4b;$X@yakts2fMLMuvWwpV*y?R|A2)BH#G3Kkk6)? zlW6E#;y?O$b8HIE`U?{N$%nJB-oR?Q5b>XVydC`o%kIL&fAR5#6qHtr68+UjTT?ml z8w}Tpi;?gwIFyh2a6FYs z%gxuCB&vL(K9R#yQ^#G4#2BBz_Ny(PYvXonZIabKnZw)6Y;&93`eEBcwkF6X8yh9t zYJszW&$OoW?o^F#YNOetmv1wU##vDvXXNx@$GPS;%0MP&l={Sy++gSUnz6 zTKk(tY>IFl9g}NVHNsic!Y#4Pq%7=(nd8M2ZD>wpakC1Y3AUt*Tgm#27!}|U4sZzt zn`o6Vp3ssCWhY7BRFj>hY}97C_{0^rb!NS^66qA;ld~o~%P7%;CTK?INh4>QGxcR{ zQU=|E=yDcqHA8qy!pkenl;LrbJxmRPR#1lay7q!p4TDy+N#Q{^ss@0|&o>CHW`I`sw2nqH0OsISKTnv?0eQKL`Cl>I$Fzg{%3rTsw`6Zc2{{aG^N{t}L?8+HF+ zCELtuif$AXt%*p|3-E6(qir08 zDqrrKWTlc=i$|o2H;KX`BreOj7;vNcF<6!$v#HOt;l6Q6f@6KK1#inaww59@&S&C{ zJSMFWkq!O$V769_$ZmZ?6gPBez_uK=8Y>anOd&j9kv3hK*hIzJWj4lyv(i@j1|n?$6iZ5xGy@#e(1Y!j9U40wXuMHw7N3WJ+9vVAn$8cR1c#~N`(n-kkg zSv&C6@uYX~X-wdGOe);NO&}TbN!_r;ku`j7OR{xQIo@Isl4Tc0dIaMHrFe201-uR6 z`l#HNC3DkooQ3Iw$Zty`L3t(V9Jh{eL(~_?FheEBi8luD_Ee@B<)|mo6d)v9de;nN zKC(%EMIM;T^>Y)k9f`3CfK4Jci5R+IL$XoN=b%!gnxktr^0t zQEVAS7zQwvspZJ0wAkpOV#JrQhFEPJL+M~=of3&min{HQNGj@1;~1J8m7i3|iuzGH z#I8&*qoqM&$Z?)fmJlq6vT$Pz!xC6V5zi?u4=vhcPA(8_BdXmTU?;&TDw@s17>SKs zB-|cNn>clShNKQ={%6cc9av@aNwL&1Q~o zc*+EKiVnbhiJFKZ0y{@LN*(cea1@I>DCkDpL+`59e7Z z9~~*;X;aS-&SZNq;%-s>4GPV{p2P}KST~PQXfFaC(egl1w%vO(*ct5-6=L2hUiTx~ zg;+9V6a7Po+A41{4j@sC_7-Q9ZYgB~J|XSg?796{7_$VB9SRk zsjEI^%CLR1P`^S@w)6o$nF*AlI2;rQ`wP7ZNeI?Xga;~Ni2{=+QnM>5t>)874Mt%o ziBwosXAmlz*1!pq;UN>oMUXsKINKI?I6Bf(oMY?%9LkOmn_1LXc;^$F6YVPW!Op?t z_5y-)4LGd;tB4B;%`;HC2PZMOBOthk0nNGUl1L=Oy4o`;*+HFL8i{0y>=ni1(=xBC zP$!o~B00i)N8zcy2nS4%y*v_WBe+kr0C!|KeDWLnMqz|eghB-eh^vU~7ZuZ?tn?&2 z^dYo=bob%D0j%=yFM;&0BX~e`fQQKI89EUC9~~p#jo&OOcIrX!1~LbEk;%bT0pWwA zNDKXxHRE-N8uup7G>24-V|?=-4*x@=b#1wvY<_Y%+F#sD_%I7&yN8YKeFP7;Adcbr zrc`r%tWFm9`$-;Q$wo|rbO-YQ@gptXj+AKY_$cwCEFNoUNQ$i;*Q&?J9c{VRM57^| zAaRT(8WTBL24QGL{8$ffi)HHTVsdjYK6Fbpj@K}=z6#ON!Cq-rQ%xBuLqj-%|=E>1v_%-S5>$1~j5U4#l>b}nQIwcAz z+|TI%dV|=hQ9A)hb-^$GVj=S6dPEGy>fsn%Eq zmGmj$^99DKLC%#>=Ac49BYuJ4VxS(w$>(!I7y1wq68qFIh+o8%Y0Lg4fr|xb%*3W( zvw=?52IdTMpDI^HyW(HBI-IE|5rxwT(3ixf)K-3MT?RZ7+f)UwKru)qLIr9U4v-^ zO&Yb~YoqwlBmiT`UKbtWvRBQ}^$d-Jb|h+6!5h3)u+~C18VF(wS?ngSFD-1Ln+*i9 zMVa_5(USb&Ny1;?79)P^C>#-%AaUFLOX5-_ZpXskk6E;Ts9C4$r3v2=ocop~bSD-( zthR7kEtXWv5xXmZ;akfSygRs>tU&0VsG0IsV(?yUsi6eLR-VE8bbZ4vp27S5R`eNkr46ETSa~ei3pb3) zVde2?Jcgeo5+x|koA4=$jqgTeo)E^j%obu}5>E<&(+y4t$(=ZfZbJMi!Lcb7J8r_8 z5`LO+6HJw1Mo)Y!@n-_!lK42H&kEX{g3YJ=meP1)&j|(_^%fDEK^=4&PN-iDE($oIvtI?5skbS zjl3Lk5K zp_9NTlwcBF1U?nOx=1Lpc%PZ9qh5Ar^?n|WWzjKsfSyI<3qkPXT%xgb++Jc|3f9=1 zs*`heAEB=VYKToiZ{?eb*&GUA2djCI9q5~AL(7zWvR<|kWg_1akuSi+jmURI=y-RS z!1pE+UW4ZxcZApv7Spum5d4u~a|$mn(2M60`^gHn$8ZNBt@?8mt%d$NjQMv@X7raR zPa+nrmT^1^tNkVF?!^Rujq*Gm%jvFTZ-T!mn1eATb_M$o`#pf+@)0@Om-rt+T#Y^V zC-J8eqJ@+K)JSIkipm*D)}>+objiW2@4tDp(>5^Y+AMCH$o+?0D%V687jonUbttKS z^hAhZpGiz^!?q2~VPu>tId|&`S(f^?tS@l{B|=s59EWdRjwIj`5XCtzo`{4EBJW|2 zArkRq>ZXZa|2U%2s(3wAM)L5{agQfd1t{J$DcjaUlwJ=0%g+%`@0bB6@EyH9opOUv zO*Lb6mFSE7p9ECRYE2cMJ!BHCF`rOH>H<}GbuO;&yd8y6rq)(9!V3~^k(%W_i)vFB ztct9v5PziOvZ1sLIiWtDt;_@>9^rq+p*A#S5ZGI?}@XS)8jRNZe zQDunwK;KF(Sv3WvpgR~SUzp5NRk*Rs=Aj@>Fub&vl_|+YyES!hAh%2vo|oXIYd%Qn zlgnihEmmJaq!?$pD(GHX+OqQ4F->H7B3Ab|nb-=%QaN-ID9^BjtSA7UOSQCNyO<@k zl0Yn47Dp`%W{9oqW7tNt5nDyDKsl!nUDZRa@kTrG)jWKfJolPPaCHxCg@SP>VrvK{ z{XLNM&SciCU~KZ!$*onv@e{j{Si6Fd&*&@Dbp)^M&bu+fx!!k4MP47p#|mWic>RRNF$FF;Xpa)H@qz^ulLJI2 zP!e~$$vEyw@KlfJW`bfm!+PRGHmizEsEUlQij1p@jID}nS`|q~BRfVTbT1ii>60(ti*!EEz*F!ox$oY)|zOO z@5*|VsDiQsubU+8lbCixAZ>94gTxxE(k-46_Y^`+3hAxqsf3aOWz(2bV>x-*cN)<6(fnPx>KIq$JjggUC+4Z9wdIraOlgdCGZL20swpLs5AxYPK~$65msCZiHZoOKdO2xa#wf`_F{;R@mGu z*|GEsxqXzAIm_;`ekHN568~1@KPa%D3P{HEuHsL^`zstvW*X$z9=SN;sU5ikOq2|M z_AWn4;vY&Js1nV1E0niagbv@S9%Rzxg<3!X7$$qLvhn6dSwS0e32e36TG;r9RLKzM zn=$DC3-F!np~3d5WfF%~$<>Z-W?~O{K1`VAR?!_=A9ifoyDPhe*=tzZh-@OQ- zqfBBl@}L~xE#IPKj#fq&C3_8o-skvvYxNlEA# z&>NQ`c)WrzYQW&nLaA%Bur%otl$IZo7VQL9Kh5AWWKUEU+i|Q%mRgq7NlL|#Cfdiu zT8`AoN;Sq%)aC@1=nO7Mjl}YlI7KD!9#K@&sLxdipQ>;gzbVZ^z_yIJkvaObD!Bki zK(i+;wBn% zIOvK*kA!4kO3MX2!gJ zK3euN`004EHyGB=eDz6CX;L>DDw)9-lh~r8BpEU{8AcX}rpay4ImmBNO380F48ZyZ z+B{Arev9CoIYq}e1&Lvck8=&lTYb_Ti|y5rdhWQ*=WRBvz;q^XyDwm}YI(SpLay%c zd97PZ7dSoM8Jr$FI8N`XO1Gm+i|K&+`M6sEDV6-tqfB4-2vCQFu<>t`VW{3e?iIKR z6FOqfpx}LiV0)0nB%sbf?iVDJzz*1PdnogOAPvUaXcnOdRj6JM@x8~XfYp@6b{Rg&M{a(#Pz(?(o;f+)kfMH49HCPbd|Z&l!@*Tw!t&O zHaL`VpRH<2nl`|19U`&k1h8|TWc3Kb&kGE-@g(`|QG{L)$aDp9PA{=v6f98oL(hB{?Z3X9KwR0Qj1K*3$80 zLaz%nU)7yP?hWCjhP>-dsi8Nk#M6U3l$I(wn^p8yu!_!Mel>1OHDDhfx ze$O{!8HD9C8srj^9|@Vk)*UOO&s|FHW8u720QcNPKVb~}iOY$7s-KX}xhR;LQYmaf zt|0Z9q4bvSN@AZ2X8ZM3guW2S&KNk55d6}B(y^~0@|7Uix;LlfJ_0p@eFDhqNPaD( zG>^AYg_{sm$~S`J)&Q=sFcIHC>|4Pw1mGfqRdqAb?*y%D&~w=L<{T!idK+8yhhVGT z&KN&(y3*O_4kAD41g69BPC`Eu((NBQB%F~TSHBPpPT2Pl|CPAc`Mpb(`^o-Bwy6#J z^qef1_R#oy)xfL*e%JuMO(ee$F~5HV^ZPL4|5=quaN|)YL*r3me_1TJ&^|`$Z%cVw zGWs|{_WxrUyPQ732>)2v@7Pa~aK@Mq2i8*=J)tr9iCVlclUzT`6~G-6*n(n1C9Ac@ zg$HIzgexTMm#ob5l!;WxV8Bkxa;}3j6s$7QF^MUW&eiQ5+{+sy9f}1Oo3i=d(-p|B7eqIw*A<}a2T}AHI9>s|K@i=No>zcw7(~aSaB#f>c%up!rGxhs zz#CV|WJ0N$hmM)}}?1@NX7FbW74EP%&Wz$hWSumBz>Fq_b*n{X5*G2SE6Vq^k8 zERdccpiV#D?ghI6yz?Zz*}u{Ffg~6zke?{LU25%F4c=Ce^5&!xvLC~+!7&cg?}}u$ zAj2zCORPj<%K#xK6wAUJ3liK)*g7b}uySK&!cgvX_j#m zCR8VoED1RO5{L`HLlL^i288N82wemIUhvI?2ccVRM5sZa6lQZ6d114=3Bg7I&3@J# z2{t9s6eNO2gR!KOLE3Ep$CKGn7`gb9G;Yk8h;h1ignQwEV%}gefnks%{r-_Tv z1P;x74YCCVTK+`TIIAaCbamy)aW7@3?fbnHg6EnF26ZWCCnwd6h>dlJ*Z<0PjD znG^jBt`Ui}dq|#_TnVC6eN=9^8VFAFLEjn=?tRb+cJe9D;t!5~!0a4ge4D={x#>P< zt^VNp2a$FW!frufXoDJs10WE)RuE!j58Dtjd0}*CDX&j>yK1#1X-e!S62?dk=SZwQ zS*hm9Bnv`%)tqm@EmVd?N5vQA(g4?*WI6-swPW)uzq*ILb{okqA?5IHmnJwMLjH>a zn<-EfH*`V-yqjt1#8W{}W3(AU`#KJKC!_-+M4dUBliGqCB2Ya-Vc!3id2=K6r9f9a2x(N4;iYMzW&iUl}h4XS^wi9AVg`NrdLYPIy zJNV8fHN-e@t_L%k1n%C03Yan_hWTN`*H;L@zZ2?zgsFRq8|pjh(h1xg;m|pzV4@cD z+(2~9_VXBjuE@yA9g_vm;4tKb_e@c9LA^kcc_P9cjT}>g{NCjE@RE=p4;(GCKV|k5 znNdSW8w9@;0hI)W_7Wk{$r!L*pGy0Xnf`fGW&Z`G6`seu{0e?`~W|OC5|F-pclc|^c+q2AYb0##}Gf* zikk`CSXaxua4ZE5@gmMIaU3NMwMpo{KrA>A`*?DPd9f?V6G$Fj5fLM35-vihB_Vx8 zW!wON68R&^OS-se!j4vKSMVr++)?Dbl}g&_=rJ>TOC1F~XDSw8)h0IX(paanv5pBg z))`FV*fCJ=G>OezdRVRrTZMB8p5%e` zz|JRj@))X+@}7bEg@jKru+>6dMD)}O6d${U@M#9t3HwrFryC4=Be6TboZuM-#66ts z1Fs->W)MW0R}npHjHtV0j+_+FKruq_Y#)SXgwQz(@y_;IBIhb%?qms_r;wfuZy}k30>$*!TaAW#4hs1fZayyV#UdIfPJ)*zsH5v{LYJB1 zdrSE}gfF+SzmDHa;tE69Mf^UZR~ppcE8I`~DuY+NCwPF=)rRt)6FfxxnlWE7|)F;ZNt?~RSk3ErE%#~I_k z;EeG;tLXkQoa7pKP4WSu2NdFr_#u%86;boaj|e@aP{5+(Q{oRRE?Pv+a=fU0WDMso zTyeAOsu}9$YUyk9whJHX|Vbo%kX%x4BzvcPf#`oZ_-9V^aJ51 zeK^&CD^Hm|ekAjh&+z(7n4icz?K5^<{7m8*pRlG9zmRy=C$Okxl2B=h3oO}5Jm*vJ z*2?Fnzms_0C*m>Kk4Qtlz&aX&PfqENVLH2cF<90JUD&)d1}0swZ-==^I~LX`!Iueo zhs7#_uMo7#Jt#MbzDhKxActcr9s~ zm+0ceKOk=0RlrphL_Z{CJX^p^6`+p@sSk{$hWp25$6K+i$w6GF1f)7we7u|m{O ziHc&6JKbdoent@YX7Qvb7?&gXxyG0Mv)miN78uVm$b6xUo?-J%ZSrV&1u|cfF(y3p ze1%VbWkJ0kfbT1SUlX)@PPo4U_6;%Y18L`iJ9?tu67?=YRwMWwLGKo1b%Nh}pyRGV zq3- zq`Y1-|8Zqwiv310-50~Zuz0YA8!hDNcM=(lV_Y5j#~!@rApM8ZJdw~m8E&%>>rcX? zx9Stg{Y4HY1C6Oxd`f!379{@GNZwfkDhT5LA@1+nHGeWo{4=Hx?wQJ|?)oB}#mP*e zZn2!|fWlneVuh-4G~_KsoQb*;ww5>bgu();5>_2#MF^-BN&`irf>`^ZMnY8r8J!S) zW}*0FDCRv{go`YI)f7ZE>Z@u$4%}sdt`S-m3HS~suz&#OPR30Us$~+!z|}mDk$PCL zTCQsBlQekI!Y#u>)w18v-Pv0x zm(>?h8=*z32YNbZ4G-wH8_tNsk%g*7cCqR?rNQ1V{&aIMeQW_-yt)TZbKrBBahI@h zHNl+;E?EsDdp-qo-09)Sf=p~F z1IpL}bkGUKa;A9b4DipjTy;3Io3ng14ELqb`YZ0;bP>IRfY_oW<(3P_b_&B9Zl&tF z#(V=_j0u5jdch;#(@<`eAO%ky?L|DLLowm%3o=hrX0=f=X???sU)!P3n-p4Olu(no z@`XNt4nfvLL&NAkiAx7)ar(vIM&!{bEc(P;Z(WHTFZ4_P>WYnng^mt+Tt3KVU$44e zEOL0C!fCfmczuBzl2hevKxzuilZkF%h0VQD7AJcW8=~`I|3EeGTp}AOVmz$OBet<( zs(UcZ9%MFAM$DHCz9;cb6*r5{Uc|;KmP*I)E(B%;1ji{Ti#Q#l;WR!zIH=(f4P$0P zHP#ClQ>gPpctZoWnP8eFIza<8Q6Q;M9PBBxxd29IExyhq-WJ4UdxaxCku3$ml!$0Y z5ZFopd%u4qp{)hNwog2n!vulYHWb71nD=zAN0ZoA2y4aQlgE(UPDmPyB>B?$Sfbkt z>Me4|5!*qNk$jy1|ej9q^~wqWupL-+miU})xgCRZ4xG+1XLRV*dLQkj$-Q*PyjI!m`MsYX^V*80hFWF{cb-{r$K-0X2Op7o(rCRDl;RvT|$b2h>p}6z&eiMn5 z5T-nMRMMPFLaBz+E6KEwqu0CJNlg~&Ul#Sd$YzAK=8+E&$_ivRAu_$^s#QN_C-_Ig zc-jlAUzrT1%4CobXKk?V&3W&OagYoMP5*Zx?&+kne!lO| zmEfKTZaHW|j%V;9kLgH0-ziaYrQyz*JHp368lHsQrwxrcOC)B9gvOVrWN>D$4}ckP zTzK4OVn(|6|B_D3#RKYe3I6ViIHPh>^fEHwM`U)2Wu3lXZx;Bls>;7^!ZgHeId4^~nsa z-Jx-Mj}mh#C18PS`S;1st>hc9O|k+XP+*=BNM-8G+pIhi|CHPwhJ#@wF46dItTGRu zQEbnD5esAlUZqeOd;N=0FgM>&YHuSoUxCNLRWl{_sg$ta0skHOeJgqI6A*wODr96o zBM>MsxL?TaZ@7OiFvNbP*a80{7RbnN6gu!#9>1$XiGwR8?03Nb zL;jFT-unau96Cuj)CdF$3@%FUFvI%ABe)b*WTKHVtdMM5WNm6gq8GLc#W1g%YQa zP9`X_Dn-s1l}JSk!yOsM>6x4oVNzyyuWJ!L%Y)?so8zuS=ND&J&zL#f!B_6)I8uSs zo?Y#(OTQ!MRQDAI@*^eu#s=>CBayRsTsW7go+{S2;CTe$oJJfzZNS*)6Dsq!vGVE* zqQ>2jPB|{{bAS`WCJ{Lz%?3UQGZxqyd=i>ggl@j928znD?W_#IArma0H% zFRpec@bi}hGrt+3OC>QcD-)TO%l!0^l`UCqmsjgn)|#{$t)MzbyTX#P@zBG+j->4w z_exf|x$_fCSB%sc3wTvEek7&`4~5{?c?7FzzM~`#i4u%5t(pPW%Sq$Ug=*fg2Ub zz>P$ls){8E-$dB%&zB;0GchrXip!P|=5^LX=rZJQA+HZ8ZElt&b1RuvnB>blc72n& z0-4*$;QlX*cVG6mdT%%4xyrOwVT?OS25(>2;`6UNgGZXR9qg&xb@}9LWB%QgPrD}Y z?^gV~HUGw`BE8G(3bXiep&~EBnwaR_!9_H*R)Xn zLno|ncAo<$*MG)aqJ5P6yiHO&r=KF8+#<^_kd}u_zCS|P!jpRuoM>4qx#P&aWH<~L z)8X|^?aL-TAJvyT`4M9U%9>xfIeU)Pjtl$ zlXQx{0YavQx&s|y!b3JAerRa9g7T<)Nqq!LnogP_-hw>e zPxxa4Yo2kYt8-j6lK*Tz9zHN( zLjr?s@}Gl89qJ2L{4OQIF93=`(-hdP$kV;2h<*u_E$&U3PZR$NxXHA%JnG03c#Z;J zL%{r)0WK8@eN&CPYlgiXCJHg^c#-J09@^BF!|$EqD(EE=-&q1t#MeBhmzPO>KZ-&f z;a7i1{a~qd9G$7&TJGX3Yvg{ioOn9IE(#faoy56VmY|6L00gh7ro_I3rfRF)rv;U)Ee$LDf3%U1~th^#`ACc4rP9~GSYd_CCv=< z9?3r}8N-;sNmxvI;A=x(18|_=cZDeTXHc#Vyo|NWd9DbrrDMM znEZc&e1*R%yh=t*{1fEWwMZP7q;Nfe;RO3v$t(xprxbT;Oh=J2>8|K=5}_cW^A7Wh zJ6c@GQp634u;>Wk-akRLsD>HFtMP=v1h>auuhVjBD#ekK}}QFr+GCEz>-VQQJl z^VhDwrEFD&EQc4?s`-S!qwtuZa0B`v%z5XR)yLS?L0K%Y|0byqv1@{otTK#$>0OQ&BIJD$n zJV5C?)e!L|0=TvPamg$hU@$gu*G+h-0PInroMEFHtIgUf0lXDRe2*_kfO1lA5n=&J8a=$rF( z0uo+ytmVl#%=9t3aaqok*8T5tbw+Rn3a2oV4dlaZSpN4a&i`XFjpDC^jx2W>z#76^|Ooj}Pz}+)H4uh>C!2gzSU>%L=l; z1-35f%>p#m6+y?ElO$iNnq zsUIy9Oa}fAkW3;VLRM>HE0PUC619nk7AButlW!cw>*3yrY(tTzfJhwH`C=QA!)c9| ztlLr~Ilo9Nu7Xr#JBsWW5aEM7*~Dp$ZBKzo0Rf4q6^5f0-qhoOk84NlhVgH`GTni3 zngelUwpO=gUTo;VDAp1X^Xu4b73(O{8W5538%PSBAx@c8K*kvE+08BT3$c2Nr2}H@ z;>=HbLahBEl%UY$fDk9WN}&b{WdcH3(ZjQO8`^f-30@6TjpFLAk%HNPpiZ;4o5(4y zi88r>48Ir@*^we`0TCTGoI%a7nM9c>0U5GppGQX&=#A~8d9+|Xo>Ul@hAm8FYCuRo zq|L%zCY@FwrD^jCiLsIyBt|mD)tGJyX;-!jqjd+O$@U{t2Q`UK&-scWuq(x91jJj~WPkB5 zqa{z#nE_F$OI`k9j*9gRbBs<(yHT`flqk;ko_|0iSfJqU0YNbV4(j zKwMfLUK5X@&*HJYaVw!@1IZ(53<$ruNXBdtaM^;0MN4s$Q;bVf{($7{Rc+G0RXZ!D9vFLjo9NLo`M7I2FwYd?uzz94`cY zL}HGVy#$ss5+|4#sCLXl8Db|Itf>u`6F{>>PZAXB0PNa5RmT+G7o8mJ-R)G2oKhp} z8Qc}8#7XW{VyF7pIM{;{JI!EYb17gu6Fc2t<8rC798+i1h)+WEQ$QF~xNwr&WvR|I z+_hjjBrA= z@G1$xiy+~d)#54%(8V?7fx?`AakPz;ktvOMNlm{zc4-(aBJv0&FRd{`a~Zr0)q@{4 zz%xq*FV`Tda}S2EsOd&r{b`52h+J92*NyrEAbZ;nT}8QAH-43ere1I$ZmFwlhWqiu z3A2LaewMtZW?<&La!+SD)gixVf!`|PN3OMS9UkX(BJT$hzD}xUpbxJ(U~TC{&Zv>1 zUms{-%sUjkp@!DH=~5XT=m$v(&@BozLr`@+hljXePRWT*{d`e7wdW7g^-Vn!%!&Wp~L%9i)ulGc_If zxvW_NUt(amFO_n=P%|V(gK}-B;wHu`H5@OO1rm7!Eha5?e~d@VXk;A#qdSc6eH1Os;QoXQ_Vfje3x`cciyVxe~knY`Y1 z`;SqLC=P!V3O|KJu}^Aj_$G!wMYSTqne|5MW}=@NG*js68OBh*h3Mz#HA6E?UFHP? zZx8Y1FN|l*wlRNp+gR5UW*)X?OkfFGa1 z&oNo_TXruK`(BHFM-;;qvx4K|CK2EGzGe;#MFz!_F|QB-{h&}U<`v9CxE2KVV@-dl zr(86aEph<}@FxiNpqoF<(9bo4_{p{sI`y-T*ylswmzo~h+COjW`PUj)r2N0Wz5~9> zB5VKN$>i3M_eJczBP!NiS3$%ibO>M)z`8NzLLy0SxXC4eek%5Yu3cQ$E(-RQ#op_# zpSruY-T$hqqKJYOu_5UHdCttd_q|E{e!u)~<~`4u-p-tvIfLV=4f88A@&p_9+`#uk zvZ6IN1`lP`Pco6dE#w~qGM;q`avt8)03239Bb_ibON@`P59-!&KQ(E_Q>>pT*ZK_Z-|OLi{C6G%XI#Z_1<^Nrgm4vr80BLHO(SP>b0UQi52~Q1(o|mZ`KP zOoz-zQA(%GA;eO_O-9Nf5oPvv;vq5xX&k>4_C%O& z51O0pn`8(H*-vJQQYnl+IAn|lDMx`RH)9_M2}*|(WcF~%QgScTO1hgQ)&Yjby&1?t z46;0Bo)4_UkSSpX0b}C^)4CT9I1<(6DTVz4c=UUFWMZKEhrlr~Wsc5U!)cgsp!NrS zvtl~t0qEcn$DnW=+eP&YakWEKr&6#2i@9CxCcn@kBi7Aroz!CDu&ODosf5FHs#JzX!_iLGpWWRBw@jK~?Ri zU>uc+f>sd8+1e&&YVZ~vN+F@3i0dUdrLRvyhsHDGXyMzW_&nXHsNOoo&uvq*WJ`sX z-dqUVrMi$k>ZGh_vwaFvMe}?d1E0q+VZ5X7km|@%O2CtvQHHc*ilcH>yM5eovJiJl z1y7Vg%LA^RQ@A-3(4f=-Z5Q~I7t!kjpeAbP?_J41#lGtZEehCoOPTSz9?uSPaD?In z)ZHBwGgub$7xW~c?%}Ajk=WUd4NaI9k8xq|>A;yej&8@goDB}sXYjHVZahhFd!-th zn({detoD&Ws4Wo75KC^twACUf^Pr;ueeVLjrIiQvpg{n6A1SHXt!-`S)=mb6;sDUT z0=49^EOh|X1OSE>0LYPIuoTq&P&XovnxPSkdl2_ewRXtd0pZ%vTV2i$2thL%avTO_ z6%StrA}AW-Gd{3R2koF#Lu+nI-VV@MeS>zeBxE8IZ#X+$*uP2PN_l2nhNU$J4O(Wp z-=tFPR;o%;)D2jCi?2KZ~0V|;TL#1wr>gVGyw8@^e zM1Jpx;>`zGiqvbAS}wnj%I`CRJ{Q%8rPK>iJuIdEA(YqHqSWj1`=(IdVgaas^H-mf zRPRWKJv=2-Z#_h;hBmR&_`c+7grpw2H!;fXls-;n@q;qWu#D`(f)=-$$>Ft*suYg;FaS<_toBbGGS(qu+OiGk;cFZ)(E;Nrey?@pDULi{ zp2ib{f{0+MBg;X>)=bwJ^ePwG=TWAi1}u{^J&w3eQVx1u3d2TyZBsUf7cFti-O;C~ zYP(^6AlufK?U6LEkLnwe4C$CuWiH#$+=LN_jfu}DQnBOriAY#gOQvZyy^J^a3pYA{jR0%%a(j>V0ok&Vf@W9RWXDMZN1vIR)|GMB z0}Te-eh{1BrzM4(I!%jqANVtHTWVA;+gWcgB^Yig%G&|--IeJ|3WFSvse((9_guEe zCU_f(`EnFvHP`MoE(I=yuga5$Q|#EAWg*u-a5PD+$qF<3otY?1EJ)0R)t1#8!)toYOIZ9S-7hUa4CTC zu+lNsXk8*|H-{{v7mf@x_{X|47uD_pxh~V*Dcu<>lRX^&edK4(Y3t8s?S9ax{BX>J zl^u4L11Jm#)Q${sepWC7E-LFVz0VRUWN(K(=&)Ko;fOrK?jH*3(Ny=S#l_y0D%_Sp8g*!;N^y@uK0d3YCLNwgJ8b1jXqD5E%PIDqdxS zM+0hr?DJcp{5@5fZ*6Nf%X|@HA-B(L#V9+R1yKm^wG{3FyM^ZA0+{|1^zye6qhlB$ zo&gCDqh1NrtVkWt5jJ!r*!+?06R?f%n453ITf>+^+xYPB%$X>fh#Fall$>9r8neyw z>t$(vBq0*NLQm=Hs*=~5*#}X?qa3y_gjMAmdA(zd%cJrAEk-%HrBIpep3;L9m~psT z45NIP8dU+C%h21}t4Of1hY9?9N5)NP`-}uk>;d>81cdda0{$2R!%waqE$D`ny_1Po zb85tf4`e?ccY3u!u6J4OMt?AC8eWrqu+BPeX0sJa*uzp4(zih)) z$wQs#Jep~FeA-OQqq5nY9ein7%?56Gs?(4YIV{6?TU&-ZI&>Nx;0?vBM+L07BgHFU zj_>ATzG-1TDC+pIJnn}%?jc>0tyASJ0+~32OgWQv&k}7mGSgb z@hEgcdQx^)g{;<^=8xmb^?^bNg_howu4-s&s?IN1(3Y8+ZKa_5U}!p>nXc_<=rn?E zU6$)3jCT*&m{`s&X^|VpLNdeswQke;BI;qrMf{|+5u@tIVI5?)2Oe=)TNtwq_OU`D z>Af?J1tm%}SKpQALLIA1)N?&YALt5;dAkE%XvWzbEZY;sZ1V!P#ynP_-InXAVy;sH zu7bkM#QK60bWTGRK=g(rfI@>AG$ePSkS1lQ?WPShD-xZV7EwmT@xR%4$bL>5bE}zV zf_JWPUA>SJ)D!tG1Ya9wFOgDgExk-Gf)}N$vYk**RAL@GDvx4$#UX!4=ggW3x7HMw3 zO<-2IdR_7rOy$?5jq=OPy>AF;vU^h+@`bF1#K0Qzc(b(9JTKDMG<3{H8+=ZE1hS3D})!=bSx=R*~wqw%5nib4$L$P(>foy0p+S{Sug|U0_aXSW% zshD%11R6iJ62^M)G@0|W4A_`fcHF5LV>u~( z=Z@)K1dE11xe2j-;mChZ%Y@NR-H?<7zTE#T+0l ziCO41Q)nj7wDx5sUgPo2^puWTYC}WWdAe>Bwl-Mr)KGTlj z%BplnHFQH*+lQ#Fi;rxOMGQkF+*KA54WY$xLRPSkfz8OZc4vzG9W2=Dw0YVOb1){r zcF0G(PmRN>f_{R|jJ237IJ>5FOov?$l;mj`3y%3+ zYtses8-8Gt3$)Kc8=L6{iE&lVH>M-;I+mbc_C{r+a)e-C0h1{Xe(gYZgaGRRm{l}J z-F&7QxNTq~Lv8t6Z~+OL@{!{AJC}uKdSi`L2>p9Y2XPX2jQ~^%@Ix9T>E(@BW#TSu zb2WzrtV>*j+JJ~;mFJcoP+^PRhM&?@&hv0GOd`Sp9*lcIC%7@)h={u~-IOo7+lZ@DGgaI2e~%`d5jAK*!=?e=X4i!xj6CY7=KB3bFNF$3K$gik+Pz= zFl@r&7b-=SAycpmo9WJDE~yckwzQUfcXO6Y@>(Is40#fCUe%N)>q_*-w5{({C>YlX zr@6*3pg25-PnS?V3u0T_nF5``RU{KPkXRkmDY%an`M>XxGqZeOdkZ=7F{lhL)H<8W zxZyQ9Z1{26P__LR@|f^H)y&Jc;mQ9NrEyxQ%;*+DqBE#kDROvkdLuxwX|%G%>} z_)davFSt#Gpldza;OQCGJ z7589a+F6)>r384IO5U~DOL%wr)uaWCLxgcxVeBWT0pC8tx0~=;Gg&mp#glIP3bcC> z#Ft(jzMtTGl(CV>sX>!N7zxB-c6o8YR`Ed*HsHZ!Q@UH6^5I}14JqR+WKLTAMkxCf zm<;*1LLMrNRoOP~bsBZ~A+qg^a1SiQFvD=Hgm$RxEdw}MJk{ITYz$5a*-7*;a+p6R z?01F_)99?qERP#ul!mo{KrkF;a2a&RVJE1nA(v~VJUv{}Hr&9X%ad{Xa3PN{A+(F zVtK-$mr=l)q49Ja=*{i++yZPF8tU<&Qm$`nZRb)J_6rUD1kky6X6Z0lXz0HOy{VxS zZNWip4yu=+S|Pi(&8N(cQ@0K}5l|-%yum;uk_0P;Ca?yOJ22}Kg82nUZUi|vDbeYu zO`zIiN^=~o8MM#_Y|ha$pu?zS^GwXC6oR`PFcZMcY_19016@Wl-R+=RfC~GYcrDQZ zEdX#_C_jrU4jjUB^j1f=qGFE&PI7=#rOtE6Y#=>iDw4}Q(TvY`SX+RxAqMyYhqnXo znvZRoT(%>dw@OqL+sTfh0}SoiZWQn-j+AAX*v+OG@IQ{&31V{=yR_24csJ~4pjlRPaVAr^lqe*dbkNtZr~+(2X$KrMlqW*l?`nTa{BKK2j>|JELKiM z%FlGfxgbLDf%t=UA>L?k^d8W&MnE5D4`7|`uz3XxdpDU5EUa6(e|?T)nBR+`qTMJI z&UFk6!VFRya?XfmAZ`0R85~VeMRQ9zn@9IJ-yx>}!44D4fHom5|Nns6*p|;2@`a9k zD#%^!(6+P$y>*epPAfAHb_$KHC8qn~c+?OmBBXz(0)A>+kDow6m=c8+`o$WZs< zsmM`z>hmsfz?lJ1i7juQV7t^oXE9X>2kI%Y=@(I#Ip}Oaow@A1>Q-|$O7eb%L(c(9 zn?<2v<4T8}Yq8MKvDjhfm5DEzL2h)!^WmYO)vq=3?kx_z0O+`UV?|pxgj1Zjxzzy| z20$InI{{kaphW=$KL_Ewp#v@o0PzFpb_ZP?K=5-gUZixu9|A!909xjtO9BXfeuKvr z9B^p>h#x?AJLob%I9mp7XRaeNA3{Is>K+GPUIgayZJb{26PfwSGU|GRbw2DXpkT-nAzT-bu=%w@NH+!~czmD)#~Aea zn!L9fKrG{QW;&p)!GQ1}8Hg?oP%e6*$#lS70U)bZC@>vzPk@Z6YQuRv6XGM1isb$|ngHQ{|OM-kF_^FlTQ28WQMU95% zv%q6zF5lH6nhThcDZv>4BVC$bw!ig;6~{Yy*8CN>*8JX(MdC!FyCJrrS-&c3gh1oJ z!7z>Q5c5KRF9tV-!11#>a0Fl~lp{E0BX&n278=z^WPo(gisq9r{#Ib9HC(b|3vI4j zG?!R5Fmxe3<^U!v+BjW9slg}Vl*DLj5&LzA#SJ!1j^aD?jnLj~nPCtJqUrb!IS%k< zAwO1__CtL0St<~cp!by;8E7!752*iwlIt z8wMnPQfs4Ce!vVXlD$h25~x7l7jXA5h(0X6`vZaY>IETVuyG^M-eG7|W+tY}i26{V zeZvr%K%fKpNZ|d#aG-cuCD?&s%nU%Tsy_}@^&w$4>QeA(tN1@G0FYGfFmYqYg#bIQ zD2owAEXBjX8ds4=228BTV3_zUl!noUg;sSc(bCxH(J4NcIK~w)(v2Dt24WHY!~$f} zWkA?|1vseyav6$;Us@MXEc!YW@6-Yh4n1{cAYalPGVhr*L!6ODzfM9ss=!GJ4sV&b zwpLp}WNcs}p}E94FUK*h7e@_mHP{mmCQHp39Jcw+CJZAH(|=sSmkdR=P=0Wso>0Jh zjY&U>|M~(x88=a20Lazd2Em&PxJ(`pvdM#M5xI#O=%s&h5w(OE42N7LQumIxX(ig54IfPrHK2-M{T69i5+-uJ zCq{1pEDeC5(`_a`?hJqmSnTBf;vk{l9ni;O9KfA7Qbq#Hhkzmdi)ISGQ zx8<>=(3b~vba*^VE5sE6F<6emrY%BwFaWA@X6GJ8Y(alGptBUFVb!^<&>t}p|VbK=oUjvi|%p+UT*I5LbmhYF7u@Ys2ec@opVh-9+>#2gjE z;d_|)-YHh={7UZcLx6Y6pm>Wj82L_(Gg>LuLjuhyS01~oWF^M^1_&n6W(>hvb&Yyvs4H+nm zabN(NUhzFV@XdSzsh!`E?U>JFgjK>YGGMTsK^BkL%oDUSKq2BWQ#i6J=Sg7h7?F?Z z4I9P%7y-uxpmae_7*@C+EBM3^-j1=4XVfd^W?P%>)G|)EszY4p$YF-@!Z0;pn2Hq- z{YKOTL23#}w$lI;1*i*v(e0hx^KHs_A7zr@(*t}I#ggonIO7Wnu8CS;0a ziXim`1V`dsqNWPg7{+Qv5nZL>D&MuF@m|&+1 z(}@^{wzNXkR4<%Y2An)?-<#(|;aME;ROfkGvo}|RaQ!jhk|ipcY)@>ByY5t@n)Jw*)vLBbQ=##WlI5Mez8JQP}9P^4Ki#e@DO|;Y;0#G>oknVYsW9 zVG>UIhM8JjO!tQPiq{_4rg2Ow0w$)GVke~ybATTwb3^^$(SXxRtG4aCTR*U0Ajx|y z;FIDFl~23iPXsuNHw1SG{B!`bS%%=OOY#c=2evyU=j>rP1T6ml7NBNWsDw~EhKtRPqy$-zZ^XjQGS7NziYS)2Sc$NnTV8V6?w0`OZKzI z*!`@e>=^@izkH?@naTD+IZoC>-lcnGIX8V$j`73tb~%cQvmvtE{ZTpX5b>=h+7YhB zx@*|m9UtU#wPS;+^NUtwvD!&M_^kuoZ5iW`UswjV7hw``12Cnyd%?t zJ%eHL^>cYMJMiHVjlH#v<@)<_{atxq2agT>T&}S}2c92c{Un*j54d)`3!`#*i1ZjolL zJT~)$ni1h`G!%#Sy0MBo+Lcl%aI9gEVeEus9u?1gI>8d+;D_`&n#ALz2oqkjH4^dr zh#syr)CBLB>krEH%5rsLL^q|w6#Zd2tk^L3r5@bm?Bjs_8oje5nLvjKxwnxG|{|Ei>Fjp(?iYw3^XY~YT23A~e_W1hYX+7VA59;ZJbDIPr(PA@s8aeJifc1-C+FEe>kdb2ZCDxh+;ibWae`prVLEmo(CYB(BYDT=%-TwqRT^ z7-HgD9?@HP`oOf_tPr?Z-;nmURZ-x<<&N}L67-ffXk(WHEovJE{j>}EIatr|^dV`z zWg+PIWt896s~A&1aeURpO4w<}+beizKwdL|6?a^L+O7zN?Jv9 z*o46E!Te3q1O$Aq)3o#e0zS|^s|+?yD9FXO9y2>x(u2TFI>G!aZZ%DEI-LcD(nE*( zJ?}G1n;%}(g4|7`^l)iG!)yzxm+Q}{ml3SFhNvFl>8i9ICfP)vZ4?TMw8=UU#RA@! zck_FH7j4orWgI`k!)%5*V5HZb#c+Ny?!!kT6<#Y1^63iC{3X<>Q9V*Vj^J-Xofg&N zGQTLJg~bF;$1t9U4mQ@ShPgu61{@1Bc(54s<3To{(K zmE}yvuejB%Q9a$$6Fi!2nC6+kgjy;+Y>Fhs^f34zQ)*5I7EP?nq8eNrqfBoMIOV5)Y*c7zbX0ITSW<1KE3H5oDD*}v+ z%~Is3~qgP)>b+xCPAXT79ksY-m=p!v&>A9Y6^TNNhFaUawr`x^oFKrBT zdFC&nc2=Bt=7>+zE#RTwZn2BfdFcytJX!>R8+`%4>B@+e$C{9imw!p# z&n~Lavw{k3=;j7uBz>0D=;>Z)X}HjS;IKHV^$f3zmi6d7)7EfB5kxv`9pyjD&TO2T{u&AfGAsz7X)m9(3vUum*}s zout@-7JB*ukGHpv(E37gw;|spAo6pO$Lre{dHPIGpBLj5?Q=Z-`7!(^R8Hx0J&o<} zGf)RH)ur@#p-)`Z#z=d$V zFGebH+xucP1jSq3XJT|fKR%sZMdXhwydF7<+s_Ty^c7OCm)ja!=(^Wcb_P64>8oUb z#o%;gT%D~n&VYh~1{V5N=O|G~fK>dKT-0g&CwM~Un@CU>@i1IN{&Fe#v|SR z@)|f*EFcyCC3zDZB;;tZIIi~8HR3>yu9X}G9!c?BWNTunOZN>Nxp8$HqxD^i8UZ-&!F^g!C)4^*9%l_u?iC6K^82g z3$qQpLTw^hB9Yu`Bl)Mx-R+D7*LrXFbZJ`O>LPhVD2U`u>p&!*$h@=^GUL&>tuua7 zJ)YixI&ZCzmw6_pM{(%)ykhVKr`4?U8PTwghyThgocW2EgbT~>K-%Uz_yZ0`@ObBt#^d`LUYo$GD!W|O=s#m`M%#Q#heP{dm%380QrMB|HAPL zyAnUj*9y;=qvgS%4MKUKFcbd7SoKnmRrO%N2u+K?8nE7(bRonyy@o`TSVqo~QOhX`IIK10dV_%1Y7HI{RkR|#ro{E>~ z2RwZTMz2(fzTZO-YCs8R*n7mknPCxDzcXxkiM~%}*n2!RP~4bdLE#KLsJ~DURd|No zyx>2nwklzqQ;aY_ES&CFO%!MuqMPi>q!zg;XNVGwe#Fy{dipVs7Z^=h zKgQ@;*2NArqlAL96s9_+MBgi;9zI9L)p7E9hsQfWkb3}O7zzEV-%H@2;16q!J`UUl zV(f;FB}N~II*};v10j3_ZtB$i^6C#N#MLZ%_emubV30+W9{!La@S;)tH=g9}8hl{A zo>X&6bbJ8V6mGyg=%FpqjY}^pP&3{9haRDNO7wD%fB0OEqMQf);Q+EP2iK{gQduZD zfW8mGqg2k4Pm~I(rr%P*eTg8`{gw)R1q}U`3a&#SF3NHjF)}PlaJ2!2cLwQ6-dVs0 zQgB5HeiP~{wz-5_%rEd>%m3^;e=_iO{HLxL>ZLJtlQ@>f^tCa4LrmWh)5~J|)|kFK zrf#;7!i@t2QB$Tbpp0-Ezv#G&hi^mk?yp$FNO#MW`FL)vO+Ly5B;Z;>WVCPoDL7W7FWLQ=geUPQb4zKNA*V2|v_&`A0u z$?iKgt`AG}JE$Ej*gh85l2Wx=9M{K^3MWbhRBOdiA5%C(dVdN;|80Ipugww;AZ#} zYKZVB6cZRDK>5&98%p#`DTcNZEpd~CEal->!+iMu+QTs+9Hzx7J$$V*3Rou$;20i= z-_VOmSkBtb#t}T6y$7})oh_Gdn%&TW8&;VdZ-Mf<#O_*u)1={ z^%z5y!c*~IaJs}3@cL_yf0d>D{Q}KwKVleL57L~#z9Lb7>h*Qt%$feu)6bJf{Z`!H z(BENNzm_td@P#!N{7;DS_nH_8l|twt0bk>^UdO~Tq;EW&+#%l@PgP4wv4Fw383d1$ zFPIJhK?+zSX+etM@w=4%9y7uWa-%IC$GTv3;8atIkCRTV9YF>2$kuF}c&R6kEG9~Q z9@By?hA^8wLXa-?Ijm@(s=S0c(N%KX4=Nd_GEfN#-&Asw)*p%Rm82JF<;~3`qwjB6HYALnelq(_(exc3Ty&m6me&jCJK3l3PoS?(JZqvsjqK3C}1bLy>0}9^;OR7b^xGr*BA-|kLEg22sa;+0So9F;vT`6uKpkg&YR*%8`bqVaP*(weI)pzH;D6P6H1>de{zX#> z^}ivmmjkYU3Kb&&xG(~!H$q%*23-G7s4V|?wBDORqVV5yPPI}RmCzZ^O$g`Hz{i@v zwbr_l>I-q19DS+v5QeC}veBt;1RcVP|1t3Vlh*s#h<|ZTtR^`NBFepeRa(j^7VhFd zwNoi6=wP^?g$0733AGQYNp-LVN#+{i&{D1u@Ug$I4lCslyPpfNk3$VFUyUf$ z2l!kgfM1NsCbH*V@f9Rm)iV?w`be5oEPaX?Ekp_C)3B$2;h+t(-hV_Z!R zu}%3Ew)f(yrj+~H@H;1tDw+n zQk!$M0~OYES(|+=G3!!V=X3&he0xel<(~F_x7SeXVZ~mjsinQSQ`A z(bw3K@bOZs*q`R}w8+!E!^pCqZU(hyT+z<}Y!8PJKH4{jN1k*1$ABL%dSHvh96YSg zV~E6~MBqKvZ*y{7eM2i$NdGR?-T}U8+BmWd=f!dS?i0 zi6+&0Vd6;pt#tWgBpxvKaj5S~HLflm74=D7j9*uE=0Hr>zo{+%rPpK!xfpG?N(9ziGD<4LamB%q5_Oq@rRZTrjLbby|ji6F}s{Yx!M8g6dzCJ zwPkr7vc9$jn~z;?2l5mdlIDj>bAgm5%lKp|?S%TtmEx&ViW{ZCPICpu(mUM`cK0{A zGF})e1~>|&>ey4Zq3KPoEJcw8@(B01GpDRD!Q2?`aNWpRBv`hu?p z^cNhUutu}I5KvNW9cSchvD?ID&v1L93AIyPpXPJV5N8xHQSB0EnIpE7*8v+IHemw6KeOkJ_EBn&ZH&OUJ}(EFweF>dDWqDy)wlJ5e$Ndk8k4Gt#m$AC0*zi zW2~_xSA7@vtvMLzc%kB#d~eEwm-@e~%8|}1wMqJimdUmW7Qj;->lIF(H|`E^tH zvUYHE@MNG+(y7qU6-<)sfqh~h@-<@{sG8Un5>RBy`bH#S6 z&p)o%Zi{oRcPr+!JL9Bbm4;ug((Ve7KMMkd&8?{D`vdZWLWZEZ9^4NFoSyCIs)yx>Ncvf6V9(eFmP)WcJx|>dl(F>4?-%@T zv`E~G5cEa)vakP@C-n2ae#Y0Q#+09cLv6-i5V4zPT}ictxX>_wZ=KLDLKOAQxi+<( zK+-tW&f@+XgaU|HW%yHjB=id+dhAJu8Z4h!PVFTQgf_%E_7=wyU+p6fcz@AX`#LvD zXQ*{6Onpco+ugxJS`kBm9YQBGk_i?eT-X#!P-qY(p-5tVjGCuU5DDyMw^*cr@QROV z2uE(AT}`NbLcfe+n46G!bUwfIDkIJ^hJK-Xj_5@ zc0t3qiCrrkw0||hEk#g5M64Fn`}B}dA0S~dwKAb2I6&m9j}lxUtxD)xdQhuTqA~SJ zLSG^18pIt_YZH1}nI48nKTq(S8Uh~6b81XiLVXpYjTf5wCZRu!srAUSgz{ZNe-u;S zC-hD7`C~$V8B-e)dWn2)Oz4keYEy!{MM%Lf3H?<}MUuKjKCvUQI;LVt{V)04F{wX^ zshyJAlh0j}(88!)lX{SR?w-_ZVrp^~#v~O;Qh+&qI>> bvzYo_QeQ7QKP;)&#?-K+ewLq@^HTpGZiiXk literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/game.bsc b/quake3/source/code/game/Debug_TA/game.bsc new file mode 100644 index 0000000000000000000000000000000000000000..46200f5a2e71c58e63bf6929245e34b6a5baa776 GIT binary patch literal 1680384 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�|=AiN68fTiWD~GDTm2pF3O8-0g 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 +o3&gEij5lod~tisG*Y9BBQEEsKrLL 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≷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�il_{ioae&F# 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

s;u1sW!(?<8~Pb~=#u#~`3isWB3$NBG78 z@x@cFH3w*clm>ycKWc&gD16I+v_E1%2Zit3K(`C(0#g0D9rQYoM#N#D1HyOuWV0VU z9|+4Sv|9!=L{KG=YET2D@*04eP>P)<&>sZFfPOD%Es*Behk$m9l;?nM6!d$b=LLNT zlrQLYdn3ixz=hRwPPKS>T*9&ACdPkklOJo&5RlgR z8&I0m=ri5a7!P!dXfPQ_y;}}siIf|Fj^ZK1ss_px+H#-|h1LSJU+S&}`asZkfi$oE z4Cp1H{R!wbLH)`s>xiI%Kw|`z0R3IiQlNZ6aiHe}Z2@PrPh?Pfx_!c$8I&p@H_8cJf#sHu*rF0CCM*AcnUUJH?rUPlTR{&|WF9phz z(lAh5G`Jl|qx~+R^Q3emkVgBHKzw_fVRZuSml}TsQjec-mGSszfzA=WGl4YQ4h7PY zQUt`?rWsa=Q#udm^Fj*(spM9mpNlu{2YN|b`x%h>{xHxkq1DVZ>)ktnw9hvJsbB5` zx>ck+3B(_Sg7!e#M#ACyqk|3u4U-z5pJg)oU?7z@66irG9Sfvmbrz83oa=zjk~S6q z>H6R{ARPfQpc_T!?*VB>?*h^&`8|+EN#ShM+618f(%M`gjhwFn?GP!i0%>Obql1nB zX^t(OW7%;v3y8O@GOX)?G_Fgw_e9(ex^i zM$>PBMoQ@cAdRNK13f01_ASR7aw*LL(rCIE=!-%t0NO8nk38aaLEns_+}Nc&?5kYK+EVS)GjZPxq;daE2R#C$alZ%XuOj77K%+&<`#=SP(yli# zekxF*&;|i%jE@AmL}=rHz9CY|fbJG_9nb_RT>zvp-UOsE-U2jUO78&D7=I9GoX{Qx z+AUIk4x};u8j!~LL7=h1_pZa2{UsB{BY-rDuLXKdq^tze{P#T|jm~XA8l67_(%yO> zNTc(Nc_unTK!ZfeI-sF~wgG94p92jL+8-RgKLHhqen)^bgJjG{zX>fHNaOSZAnpC> zK-&9@fbvCN6i9pjULYNV4*_ZKU-V_u`(uH$_oo5a@ZvyS-k_?yl4*H$p{iix$(GGKioC(P zaIgWagBr)-|9J}=LbdppJmbKgw=7UoU6of8UX(Yuz9Fl)m>V(orfle73Tv}aIW4HuY zh3d$&C>X8|2Ww4{=x=CfCcGG4VLOJlCSOM^&5gHuJaYc2QHOu)C2?c zkm$BBR8teWsa9+{7OrM2)K)h(iq^PS;&~pISGhO<2ZRh`HO?Bqqad|c&h+YmSRmoYPwwf_@Q#koGOE4(By44u!%9`(WOJ zrf@h^mxs6vH&icL6l}l<=tZ_;8SWf~nq(OERx?E>LrAqd$%DPL>GLpr91Jean=x?; z^)u#pX@ct(Eb_Qe>j=#_PlLeab)DwYTw`6DUzv}jPcKi^(WXf~4#*$*w0>1 zI666H{!x`$?s_D(40*`8 zQ;e-J{@;8Ve;gUd9wkU^=he%GFRVsN(a(oR zv9RhhY23UUn*vLN`STh>O%0X7d6ih6&RZ0y4bBTxS5(#31;fKD?HcYs!>byCm0?{t zrh(jtw=sJ8q=WWYe=Rsc{>i~#Qu#T-8XgWVmkcgXlry;kFLe7zvFFeEHa@}1LoI%| zfalg*DZ>{uHj>H@EB8s`cG3SCIA==XsQi&a6dpm-9VSX1UKI!jYznpPla?k642KCo z3Qy5kCAmB=g77?ycCGle zuNEKPPNDD^L_chuA08O#$541I;-^gVQN*rMIF1IBtIu5UJc@2{^{MjJqQu)%DBlES zKAfzzL^Ae}j8|9kLn*bMO`*JzLOGH``5X++&M<9JAO7d=^+Vg)@A-K9J`*JEchRSS zN7-I|Ci!Zy{`D!8rJ!8d*R(~+1!D@VbWm-{LdmxdLrbMl&TT1jzV1*ciy!_lh54Ld zRZI+p%Y%Vhr5Gy;3PxFPI+CUJf|1tC4u#y0_~ZyrexbF~;StKHLaQ^0GTM49iBe!~ zbtu?$HB@p{A|L7_lzQxc9EwODIo7eek9fXdWP!EOkwfMu9St43&^sLtkH{G@+FIpO z%EyctfswKpwKaZ}XQZ{<phI=A2XB`5uerL>|*U$EI$kb>lQ1DIU9^2g-MD`b)cU5sR{kg}?9`$jgXm8A7<~#r`Ds$EG1h9Qmb8VL zC`D$3w|2pq!7z zt@?+Qucz>ANufODqliAEM_T;Pe6a&`)*C%~gsd)HOMl6>hI`xE-;10gtJ9G~ectu) zkn#cLe92`X~cI(N7+1lTm<7yBs8nQ*RXbc*tFvLirLXTToL+Tt(xJJQue= zl*~^xc=p*mItB|dRquAJpnnQ6?J<+M-uNnNWnqSJBeSq@taS(s>O)Gt&!>;bDI8<% z^6@uf=P?&oggT^0jtr6C8hldg` zNR^DNUheRSw~mD$`>$|uk6i}QRG zX&u?7*p)+%Ayx+`QAS!h4ut}TrOLs2?# zwnPr@9CN*akhbGz4r-k+)mN*iz*_FFRg^C)BDdC!s8#N(Rg_;~?ZfDG_4z7z^kY1B zcM9df6v`7RlpQ__tti5|1izxMZ7F56wceqy)!n_+8f7i_@w}DFgI!X&kLP_K4<+-< z^7^4&(mKY)1gDn74_0XHV1gTMKVRsp#rj1llq-D{k&I19o-3KQWB--zP$=g*UoBD= z`6w!9gmuW@r`VD0PNEcA+mk2-*5)M2D68F}u&tG7>+Ldc{1hR2EsQZw@8lQB&qBEI za~En2nc=HdG|J*n9e8SCC$-y8!7Q^qi88|4?5B(_vQ{Ng3axMwrNEk(L>XmGPNIyk z2Ky-mMOKbOq3v5?#f@|PR*bPS5iuSsiV9^9;@aMcTASQj%r@9@tcN@}miY(0JeKng z_-r}k!A_wgiKoEo@A62kQPvS(>tjb2S^JVG`BtZ&f>puRBnsAtNtDr6eG&yL;UvmP ztH4Jo!d%eLp+I@-H_*4|I zG0)NK5lWrhR9l}yESXj@vjJ~Itcry-A-wRz%WA7)QcX49L(jnRv{eCmxQVa7RB&ae zp~@8k)(|ch)KkJj;g}K(msB_KZi76|456e1Z+>Pp)d~Ual{W+`AsBj230)p)0J~KY zZV1#nnwKmKRaa32^fm=EL-i_D2qh(RDn#_85MJEl1)0kT1#!CUjO9Kwd>UCeMK@jVIW=Tf3ZZ+aXVzp(BG~O7vbW zak(WLMAGaav~vs8EqDv9ZgCuSO)yZ8%N)`}LEn89p_SC&1#KNJE6m25OK4RYURZ&9 zHF8@+9v0Lz$!!j+f^Rs&E9#BvNnM5prv@5l1{)fyc~>GlGjvn1p{c&4uF7a&dY^`B zI2wu=H9gR%F0u`Sz}caIIM%9IhIc2SK;5Dm4hpGOT2e8ofv$6(rv!1u2iISeVbbCN zViVRupX$nriI;Ooxc({&EelSon_SJeGQ2WC2ceUi>Jh~(t3@PQ6<4#}h8dxTT3jf) z8KO(5gHjv8c~hVPgGm%(7&Dwi{lJ3i8eaXN)Ka+x;zWc)nO3(j?FG zTrtgaYev{8w4$`GYI+buMkvxxbHa!gIAR(zNAI;Xz@eUqK!t{|E5zT9Y5gj5KgS4m z2{g0OeKa*77RP;t-F`BmQ68vSDk@)&dsn4$g@^7EeWq52Su8`?2!myEoyTFCjJNY9 zv`|qjXW-h_n?4ab!^NiCUU9@3eH?-q1L4{ebAmMpFm^rf3z>mJMR5nJVWz7BqP-*> z4phRZX?2%Z2WzUXTF8j90~d)HSwjQO*2LTS^pbY+99#*hFzqS7>%!j3jG?8q^URMIW>}F7lgtURSkhf zwwuJOy~t5tVfL%X7)f##-=;f3Mh^+WSOBlj30C3~pOd{O1?rgdY~Rq}@D-S=lce&t zkWZ=*V1Qk560YlsL3}+#*=nA|?`*_<2s5AQ(}{Amr{Z$CmXb`J(^OqqT@|QtN@djg ztDxCQi-VO*O@!gOq`I~Q@x-fd(svSj>@ImM4TL8K19hsC%9`646qFB?>W)9RK5>yUe)fX3;x#yPyxCd1ZHz+@&`LvqHJG~jPe o3{sDHy4iLH_;CftbV@Q2;)4wpHq{Avd$^~PeeB*4vRO&`f9xu=o&W#< literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_dmnet.sbr b/quake3/source/code/game/Debug_TA/ai_dmnet.sbr new file mode 100644 index 0000000000000000000000000000000000000000..7c5d73098c2afab9d0f16b2e2f1a3afff84f73b8 GIT binary patch literal 128760 zcmb4s1$0}-*7enuj}#_5QWG+|1r*<_^P|Ge?f=xK4bl>9dCmvx?)VmrKKgoyF;$rLN-i z8HK*06Z-Gm^g>U*tFON}v~lPEDK;bDTk0(IZankbMIMTi$7jP0i;Lv6j|YOM;(C50+*O7W!6g z=;O@v{!lB)qRh_&h<+wQ~T;({cIVQY-)ZYJ)lfJ^xOv%TR{Kgti z9$Cz{#BwO~bSGTxIBPoj;@r;Sz)(-A->IGtsa?}?cX7gt?cl8C49y!TI_|Cvt?l$n z8@hRh)^Q4hGf=kO7+P0CC|7}@^_;=t&`6=zsd2lQiS?a)Vro2*&Y_y~^@)aLYogw9 z`7Ep`C02~IxO zoXTb$_dtd>bMk2oAI$JXCxOp6?ja0q?j$m?*2aY6p2o(F?B;CY37^a7~0k;3>6T%lcDVxLjB*x;P$8) z#Jih;9VCG6a1TQYZM44=|K)dP_4L_dy04 zBrtYU$9;&wMrWWj$8jHKpvhq-A7LOV0et#VhIVwA34jir^{?mZb9`v?@ab(%}$VjiK4>eh9A4;2=90f@?5XmL7=EnhXuGKO%TEKRoQ% z`QjLcM;x6lj%8?$UV-FF=Rr0+h|wCsU5w?u5rU&Y@_TJ&JjZ!Ks`G z50mM5r$j#IPuy5@Ab7YlrxOdgNMhMR$3DWzx5u%F2SvM_$l;Ve(wWoKKP19M3mt_7 zWDygvn<*SEDdeW5E50_!_{TUSg?w*M8L~r^J=VeGoNrEM0~ylFgXfkrm|g1cbA>3^oyY$32$NiKvKFT|Uv8%On$6L(V07l9Na^IPQg93r}|P zJ*AG}Ze0nzQ0>W%dlA>aQ=I(35ayVR89EiCydRmpgrU=%d`F>-1^QA3Pj~X&y#-9# zmoaz-g4n${?&S=giKwVp`IdVHk+TqexEt-_xK|Q5+sP004RmwSuW_$-A}6zw&T+Jy z*D(9%I(Z5D?S{n)#Xk=#qr~p&L1wXH0XpBw&+##=B)~3knnenqkl9#}3!Q8tF)1H! z%gB5z$VG}ITCrnzk;ui0WD_}=Y(?f0=1I0|*yv1k+*gTS>NKR%iB^SPBXk)$+O%w5 zV3~&{?&VIdC9N_a5V*o=ZEJ3J+`nX6j-11xc_kahace`;E3b082TEn>QaV*%jY>$T zvZ)3%BxX${dW|B%UWy43#I=qL4~$4mhX`IL!O}2N!gPr6^%CYPg4qt?8>G*m7oqH! z?*QB=Kzjxy#~g?7O%iUX!-p}+A$+rhn9d~Uaw+X^N zxDLa&Gn_&FugmZq5=K|XW@$YFcM6cfMrpiE4^lyxmhNKrVt1MlfbW)0SSGw>0KNxs zxinBjJ!}(z?{zwRi`cfyD!Od|zt8FJ>@7*x-cC^Y-u*~{SfLk_c03^b0GKXKyCDES z=yVrlN6{F-9s)KvDEoz`0Q#`g-Q7DZTc%_HeZ=XWQ5@=Y+#Lm!EIf)234~$fxRZ=% z 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�A|LCio;=jp?S4c4fOTT6Z9tY(Fw}P?PBNoUa%HyHb2cK)j_*_80#$ zTJjW~84#7a)a4)Ms94W1$LOTA8%29YiQ;_k`3E$D1q$vS5EK*O;2r>jzJo%u0z&d( zE^XfFy^}J%0U5J{X}}NGRjv(P6zvO$+Vhf`AfXJ)!VR>z$?2wSe?V4N)%m8u85Ao8 z#6%sUVp1*8!BS$tlfYpct^^YBQYb$5sYTE_xBgCM2SsfLMcIHkX?G?zSRo-l4kd~v zREr)oIet-a7NCHrbH?tMRxo zVJC$~FhQOAoEq_anCu&nyPzRDSAj--ZcV@naV}GvSHmk2=?K<=${q@3J35lB+ts2b>f z{;NzgWsa_Czz+gC!N)}O?V5e&Ng>bxh%X(aFKy-A={GDK)a5 z!Ci4moa9a=cB+q!gFPs*(+oB?mjbpkvC|DUE|(h1F?B|b_#`wx1%xq$3n#f;KG`oe*8QK zuaXeF2oj!IEv}LPU0hQhD9q^>N83mlnbL@t)bz_^mxjS2B9Bn=(i$T)m%+IDblmb$uTxF0{9 zFe^yzXUS`724>DH_jHz19rBA7_^l#-!fN1`tX_q)|O7>j2bEW z^??S)yhFhoYG}=yE|t-Njv#cSLSu(YDBO{RZc=F6Pzh2;5xUun2&tn9-J(!4UL48g zSLAGd_12mJ+BDb+MSx3Rx-soN}g>?^N`{7CxFgnoQKi( z__I{!+0s42Ch3yj^Syu~kFsipW}+L&rJSk5$7>97kwu=Y87zufc9&e#LCOd|Q`3Q; z%bF$dB?gB3QYqI9HA7-FDA#r>ZeqMr!|`%iAdxrFV$w2~S4zHD)768@#=RYqd!I7- zu3`uKU0yr>RpdUvz`?A**P^2YuBO0;H5ipcFklzYsr)e%xT8g)AJxn(7J7$}$?I*m z{}|PX;_yeI@KZ<>`=rK(Z({gUR4WpkS#P9nCic*WnM7w z_7GqG!U(rilD9L?mo?@Gn(mYek&J#-(>aq>beBcGuEEbj_05w@MI-Y~4NX1@`0*M1 z9Fs-AW%n|%@3rW6L@``3D>yE067h}iYv#aEWKcXA^9m8r4+`~SUco$sYe8T?*7TQp z%0*+@A{T%Fe}Z5Sy7|)#{aiDMpKL3kQ$Op7eLe(!sp+Au{r_X^I>6&9uI_6602N#E zN^4v6-m49mV%n-%!fI$G8`Bn*wJa=Yg^C-!nch2u-h1yY5LyT&fj~$I3BC8;`OiIf zX5Q>dkUt-v;yvfiyqS6PX71cObLVfioxd%>judQ9ZC_H6<`r!4xk2u`f<(_?4KB(` z)$2oFA^g3Aaou}*Scf?Hy^!LEf{JweAim;(RAOW}GlVZ6m+#c|^^NqWRql1$`F|{s zm{)q|8*VMn4B-f(oMCv28T~}o48d>PmioDX7tr+MDy@{Og`sSI?l(T^NA`I6zb$u znZbRKox{3c1b!W;smuA#{E9g&U+7LUiVhNqs&8in4;Dol+b=1e@8f2pxw>x(JjRQk zEF~%|#OQ-f#^{jT3M_gv{5U93kzXM7;fycjxlE(!{>-ONP)vL?(1j$+;zGSXuoXil z^K==*af4~S#LqaA7Zevp;V(eKiMa`-FtGhY;fNLL)_D^+4HFK`{=iGKam)j-!Q&Za z{xeq23m#t~x@ulfScoXFnA@Xk^DnH(cxv3dlO!e%bE_#VzsP%1p=?UVqF9Y~u=fI- zOprnEO}N=j_`oUt12@eJfoP3RXcB zr`!~$+1*8lR>+US5SODk6yL;63JE!T0xw^%7sIy zp4g;}YO_iqri!j5*ap5>#)LYHuUgoj5iJ2%YUW8!s};(qT-j$XcWflMdZD|b3|1aU ztx<@RGY*4M2iTfO$s5sAj%dj<^Y>aJ-(>D}gcSwiYZvPHox-()GC0C;0(2dVVg}1# z{(_wZ=(-kNfWj{5Xz#?dIM?RAo+alE%ILO-t=alMK1U8q;lvZO+n}($vvXt+1FN|t z5M~QJWkUmZV%nO|oq4cP0N*IY=l95lJy;L`Z_Jij(9_$C&)VvsFdTr|gw*^IEK4l` zGXaQALjrmv1C|2a4DW{es1A)-+ymUau&1AM2b62Ydu+|N@TfWMgE9d`QA14BI4T=4r3a}T+q`s(vGR=P@>xwLh)Z^HJAP9P8!zsS zB$vPV*0#^VW%(>D*1z}`X82#+33*sYAkHY(9EbuMycvyNlovd<0s?KymvsgIUYmzI z9}p=r_#hg+jeqas-$%$knip(W7=1i1*uF6OS0c|#kBYv)zb_JbNg5#fviuE}6-58d z4|az_PQ59pSna)x)A$-|wIfRp+Z%&&TceLPnY^AiF4#A+Qz4p1Rvszn+MMX@e%CkH z))3iwln8pdV2N3ls1x=3Lkl-qcs8%b zV?aSXpxMIQsMwPps=-%fANFycl%WM8jp;=e{DLJ1-dc!ZBbDsT4B|#hoN~AL?84+Q z!VhG6doznz=CAUCiwY#CxrG&jnf9(uj5yMnLH&I4#*TG@so8?W*+hmR?%eD(i=oJuJC`B@Qf1$cSt9 zS?62$&_WzRN+o#9X@P+9A65-0+mVGl+heL!#Ey7WVP!8=ycXz*qOYcTY!f|oylthU z(Xz^E!6q=-F@?$Yg%~4pQkB?J99Jljuh0(APfYX1vI}#PR~QKD4GLveMqk0HsQX}M zkty(seDdjN#s*otn~JYQ^h{}7S)&+qV+r$T-qd+uWZ729+%ZHW@wz2F+;|5Cr=} zDV~)Mj}Fuh-Dhhe&lOgT^z?S=GM`E;^!9l@7-eTjLxlM~Ux;(ScA>cg3H@H&SN;l~ zXa#m;Vo;QkN5279SEN>ECzCr0tpADFdl0MZUpUf>yM{4?_R7V-^X8#xBGH}0hl=DU zg&mo$B`Ge=cM(d!&+w%T4OQ~CX88uu#8sC2!s9AOI^=jqjjf}m{u-kkPbpMnhMN|l z1Ue2kFfhtDg;fc}T!!7&97RHmJxt)=S{Nsx%{3ATu?ONikMQlKB)|7a|H`%9$^KAi z&Sc`&oEFCLf$m4e4mt6OU2z93VKT9Kz^f&ZC&6hJN``RXRFDb7`be&X(XuPuI zZXYGFoJxpcp|2f^-zb3s73hX-3$~$1v~!fi1eF*RgA86=*C>IQDaAbWv-Bu-l6?U0 z3CD4Ek&w4LrN}O^8HGXO)oBL{`_IanwrjAxJJSy<%|LGkBf$PfPBK}&$e1V6sT`?c z`YLg!^6<>Q%39nE4E>g4gy)3N!+;Hs&DF=O>cxhW|YKKm1uY72?-FFo6U3; z>cC8gGq4yaP8=n&y^7G7(~DPl(kO|Y&69ct=V7jt@Nl`0sZ@#n_MYDE5e(pGiG;kL zYSdTyu$bgw&a?@2TCOY7X}Kzs88m~hL{>AIt4u=?^h6n!5xlK8Egl{Dr`iB7$`;+t ziQ$3|8VL2gh`L{YnrdAToekD^vn zEIq1>tDmw*p}mXhGu;WU);gEe%F6Z5Fo&?GcNSH)_jWdnEM3~0ZqD?GqI;J&oz5#t z_O}nHqT8C0^%2IqyUmlNo#z)(Z=4Cu4CmK|wf9A$_sFw^->*p3s8lW1LFyj3*K)l+ zXFBZtVId{?KoJ&{Xwkvc(12PRZy4TVb~Bu#<&lT)Kl1doWvUu@mbU!3uQP zNc}Ne>OdzI8qD;mk6T6O5WE7Y-p~ZlXb6Lb;vPn*J}uU6iGgNRq9cl^%1|Buvw4n) zFDt^_s?&_S=L*Nw!;;`ViQMs!>&5IvEycX0r$tK06N@S{129iiU>@6T1kLh{Wlk;{ z)HM@Mt+RNiVB~{!63dzNV4sZcVlI3xYSt8|6^VYN#R+XH5?sv)oZ$(G!i_87neCax z-SeNf&p*3JGc(H73#^x$$}cEVkE8LtHeP4^twn8O7{MG+RF|$c81OuMhTJ z1iNR7t1xghW6psQsIIvJ!Fq5tnN4#IxSAgMaGNp4%B1v`t?P9~HRzLe$?%bdZzz%x zNSmQGlilziTcMkfEjoheO?cWT7QUs36GordhS(Y%8GL^Y)@$<``iMos_t zne-jf!)$;2h0tC4#Y*3`#IN>|_vol;zQxG6;Atkg4=_d(s5Sk=7>e@PDep(t{rZ~x zg0*H6y}eptR3>V(co13G^oVAo`Th}L_28fwv2bD)dZI4XA2t2P*nSz#4Da%B14H#k zLFQ$2(Tf*X$nrdC=&GKfPBj`ct{D8}Q_ z?(bqaK#3$~sOPoOw9XRk%V@ls@WrC0{v;eMmHc1& zwwgL{C;ZR?JG`#Nvi=(nMq_6>v6vz7DggP08?d+=gu;SQUMTv1%#1Pxp#~7 zYCp`um;n2rAIW)YY*r=v9zJHQ#kk-cYU-bjxE`nr0(GD_ZB2>yO??s_n3S6{a8I#L z+e^bqeLpnig8Gd#2+0NPV_-AW!+_*j6-zX9ByPtd`)MvqN9B&>J_E-o4r$FmwiAgj zKGS6z=xT$|d(+UzWMP1~Ux0rp8WLMBc05|aUyFuit}Boz zU@+82#%DbX!zLnr;iW{!qf&?qn;ss)T+%`;FxdQ&;jWA<$&-YaSGXQFuLjX3TgL@I z6`A*4=w)L+!ZzC(CS>Pl`Pt01#E@`n+fbl$WECleiwV~Xa|+I5MSlMrxl~r}*Pg^3 zA7$flL#>Uej1yjsZAlCkq~fI1Go<(w;**GDd#UV3nQPOOlbcMAVN^|CD-xfgIB)Yy zv>ob*{LP{{!3`<676r$ssgv87a%)r0gvpX{T(Z+`6H@DB zQF7C(2*M36viX6KCq<`qwiNC#ejeADoJYkb&}(1zn>7Sf#-TM^kf z6jFF=!kbdCGSe%*PBoWLr`s9%P92Y7M)ENl+P3s9gV>UZQf4-*!44raiEbwn`kxeR z8gUm;uxRgYIC8(%NSd80?|;+1Ts=7Wi(9xe>^wkKo@fYAhI zjp7@IP>u>)jt26g_R1{eG`UJvpm98F%$9{FD0?ody=U(>Ue*wZXD9-ZLJ2{*L!o#^ zTE?3V4SUN}5L7Q0R4pfXa(uUJo`J7K8aTx;eXZkbnrbi{wT}xvV_=Oo2-z#JVWqL~ zY`|R-Qws_=6s%5*&jH?vO(rt2c3E(DfPL+YJ83QhfhdNW`CKJL@6d4<BdBE8Jj|)01P@ta9*B9F!A`gbhSV}WY^iQgp??#%C0b%W2y7P` z>6R4-HsM*k$Kpm+Tx5y;EMZNli!HMN%p!)0lw}?*<4Y{p>p1C%j$dl|KJY_J;HDYO z^k+tl5f#mLfEDP6KwoAU4Sb-5GLk2}*`fvhL(rP$$ig>eHn$y;jJPzZ|InXYK>ZRhU4!!11`PeH`WW|aI03oZl* z#RuvS)`hsE!QzX6XH-G2H5;&wvfSd3gYPEYkA-!Q_^+2)fh9Qti9R(b9Bl=b`T~3# z+-D?VAWi=~01}-rMT<*0GlI|KSj!v;1|BA91BnS~_;?E+40xyy)|UD1 zYdyhohm6;Yy65#Qmap|hiyvz6zM*s{EO-_^OrDE{y6BcL+gbQrGlvFDv) zi6b0Q0hhPzU^~@PM@p%X56n}H=@*HfW~rk<4Gd-$H}vSeF^jxm<4nsP zZ8&e}ILC6wjAts&AQxNkSR@Fo`bpJyFSG1%U~5M@61~GvPO;nTGv_mN?N7OatmFOP%B>q}dWTQd;6rx6r1)g z$0yTi>;k!;sqR%&tS49&W|^QKU?ZcT52;M$!uCNdGS%mcZIG6J*rRnZ9f>}~%pdg_ zEUY5YKN5c2gJ-u7_Q*FV%SqU`XCo9R+UQ}*JvoM)5qN|GPmdv>Dq_V5JZzZ6{zNrI z19U#G($tpHq6esf;ZbJwqLQL7+GW{eBwkj6=B4x?4EWAO_c-}iEHBGyco~O`iuwfE z|0;_&lFdFz_D#oHGZJ=!l6lAF8Zu9jdEcc;vN&RVVpLJJ@Ob8N1f}R$*$KDD*JYHgxM}X-04s{~uJSuAkwBp35eG_Q<;K zery3~hH(VDY#4VGYN47&A`|$5Cc5^+_?y5`t5WpX!kTLr&Et$11cp!^-GGURHrCd# zobvV9B~fi6V!vRy6_jh^R(#9;-Sf?kR{>H`P3!u(9pJ^VK1P|I=*caSR)LZPyD#5J zOgS+hi2Vy%s_j7te2R81bG*15EcY_X$ZZ*ul|~nlR}F6q!rj=qujn`}d~0Sw8k7Ai z_Fb*2e3fWg2<^HA4#G;Av+zFu&1bJZS^yI^CR9Fsvx{npuo9 zfxJd?9iPNE%&+@(QXAw@s2F10klM(ns?zf?RYsz3lG?H1c=4sXN8oOOG(6j1z8`GvJAz=FFi{|E&AMh zZgVJuO;1B<=$8@>SJ#{{CkF}I24&i`OfCLcgW|AN#8SlD&!k+5(NQ(?7RDcd{@YG z@_>>pGB_47I4cdi^pEyI^F2XsrpuN5iTU-0V%(#bD}@lZsMSCyg{du920?5gGZ@N9 zrTylDUn4N>vnX2%ZG;m8@@`r)Gc)bIk`k^B>KjW#(Q0b8Ezm;oepP0i*x3a4qCc4&|Uw(npNQmz0%T`me` z%wu&plvSeG-f=fAAA70FNhqRrydp%uMOm)!L0RuH=q-q=9pOH@Ql_}h5eY=>6#rrw z@f#dI6XO7u<&h`?+ajl%9MRg|3mpmJY=Pe5Q0wxTO#C*7>bXY{Tj2LNTw0+GtIm~(-p|E=$b^Iawr#v=`JPL zvOVQl$E$T^O|wb^Qaf;6!j-r23a* z@E#nu5xG~DlSvOYe7Nq^kHCPpNcvw#bHWa31ic0QhSDw>)a;(ll-aMlDMj8LQ>4Pk zY(|+6#*{I7FoWshS)Yz6RNPXB{9*@-9Gxh3DpanasmT1};q}Ftlp!MngZZQHNYB2I$ z*KwF-Fw66iJCfSaQRs_8xYpT;{HDt5YeAicaq0}kLAYV$JJlr?7rODM?Lun0qX^p- z6T=ZB<+e(<_4mwMG6yFc(l8if!vHM3Og+P;mU@CoF6qzoFOhA8l@!?737C(8i$^%~ z$W}NODxOpdTUNQB1mTYH@S0p&4fi!9YaPi?P$mqc+|MLG%j5en_Q@Xg#KKHZmzi2> zDb?Uf;Y0QX>L}3c1e&qpk+hNMu4Gz5CNrSKEE27bsO}pWUSdin=TYj(&vtwj#x?(u z4di#v;=SaJr1x^PP}(F-WKto6E%CNc&Ez_KE=fa#mU%ZjK6X2aN^C?LN+W2H?#gbl z68$+6h#903Nh`6xli;>9%+mUhRuM4M^g<^iiG{C&?|Z0XWVkUijDPfC!H#>5S?VQD z7QLPyG|ueG78uQTHiZuKg<$%z9t)M3LzzQ;8J_w3ioQQlaLd{9bd^#c z<^*IEAEXOi+Mx#9-j-lvOAkyTa#v^3b^TRvbQpcCo9VB00?eQ9 zj@mF>F%-ByTc930eSM)G`=pyZx$LzE+%#6`4ksj~6}3~e4c)+xow?q3aG#Sj+N$aM z_S6sJ7qEEuJ2^J5*FJsZA9TDluSfTje%R5{Ej>D8i~P8gfV-15moE&PfSLZ!j@4nI z0!nR-bV{qN4N~kGCx$OoDP2bnk^ZZrrDrSe`t~qI{^mqjPn9t}VT2MdI0>m~mcT*^ zyyyh@s&4L$l5dbi(Xg9eOmITJQ7p0e zv7hBlk|;T5c%|Mfj>bs6rBv@Q)&Q`0;zN{_Zxu&NNxw~c0B#a&HKK^nZx>7Keq{Vk zF)EPiRDGyVH{XfCJH^pB1>U7VpKQkw{M};N2ZDs}5x0+fuUPhg0DfP^QMtkN&`7Ub z#Spw-9K}WukROojL6@|(|DZUEeITGdEM7#9oUPu6#Zlep@sYHrZ0||RMgScCt&&ik zy3OO`VhQ zglZ6RzCIGw%^BaS)b4VGL3dYtS6qqvxe;x>L8NqB#rMQ;ED}@G7fXL4-V;G$@ zC?vLDfcV7_m5D}VD}no+0CrSZw0|33rZ9q zdBxa>fkKV9unks>hy;KqSXiVr8nMP=D)tE%iC9B1mH1o*qY%$zZWDb%BM@tVrkGEd z=))SBsnjwig0NO)S7ujcISt}Gi(uS>E)r5b@ktiftGXKqPPSmy72z7jX^Q2-JHnfo zsN50=1ScE2B2f+Gw4%eqYs+_Iij^#5?`PIvPAgkjgBLVlw3y9dZmGB(kT#Bq-Vzy@NVd*tW7D5wYm>bba zDYa$^Tn(7;%qEn*2(DG4<1cnKBC->9HLmTI40-{gI-!%SQvyS$xh*2i3anewF@#G< zM+ULUL*_G9Ar~xKw?r-xL2=hB>F1`VZvI-o#FSw^e{N7B_vWQhgdP@Q!>qhfh<-kD zBf?nmhY!q#iZ&|2Eh6F*!V@@kFPE-~$XEPw7&f`|v$#snFd@-@g*!o#N7FjE!s zf~51Gz;u-*h&dy~Ta|_~gbJdk@md|0>=6#HYi*_xEo)eLS0eEaf3C{{d zqUS||txI&3tbc`VD}hB`9H@U7i`~1Vnku4^xzILyswBskaj`Jwb#|2Ws9#mXNOj6* ztl6l?8iAuI8>Z+H5&C+u{bZ;CZ`2-=y^`(JTT+2--`o@DOypOS=`X=zz;4mMhR{F> zS1D%O{U7<2IUIUtafW^t4-x{Kj97H?SzU7+v*r>+0sEGIDhNSI60^K!7F zGfSd>ly!u((>Wzjm-M(ccW6eUkMil~5;rDIb@e^wRp|oKSg(%l<$IiYTu31`o;+o% ze6gmKb9dq}qHpgnmb^41xiTN^)_d9%!gS)R^%3%INN)J3pYck016j`p`Yhfpt9>&W zNurC>=WPjY4ND-#Qw%1^^95Gtc2YUszrT~Zht!ykzZY%J52(zTKEIck%fply)7|$E z3Oq&u7<6(yeXo#yg0xi1Z#*34vPF2>31Flc!@u_$vw4nEW4QJZhU@KOG<+1d#h~lF zLOElzXi>-ByQcM{?{T^LJ_X;>$BymU``8xl9ZH2xy-&Cf{#5Ab=Qi7~nBiCclXHA~ z1ri7gy2{u7hk(!HJANMDl%(5pzK(3D=$jG=afRxAUjoOV8^?Ym_LE?A7XHNFznb6b zC;Ww2bRuM|C-7H7fk4g)7-6WJcq<@IN5^gzr!se$hO>q#&w75Lx8R% zsP#4C&JaMW3Y6{0n?Pc9A=FJ*Okhm`vfOtiHd52NLP@>gf3?^Kf~nK4l<7AX!1vdc z&5mLAyI*CzwrcDfc1-eQ(LkMj-vArj!t7Jn(TTYZ4 zIFRr3iJ16uoP4-&1I)I<$V3OHhG>$qTWmElGbTDH%eA*U*(yI>bY(6rMqX@e zgDHZ1Z7v`B^46k2L#}{zQGGL}SuC9A zoZFn}Qb8pP>zBg?7RcyefuST>m)umMhYO0nCi2c3hYKx`VA;f6N8FZqu$KvSoTT#H za9dg8WFc~#aJaYvNlu+O+W&@YE5Mu~X-2u;a9stsbA-$Gx@}A1d?9iiZn&BPNiOmj zbu8h&2;i6KW8fh3toOJl0@P)WqUBh4v@s&nfxA*UG4SPj-*(9h-eYrIBQl|DEy0A> z5ws4h3Su`1mg`WfBz2QexxTb2Qny&j6kNP;xX}THyF(a3jZ@JU=x*Yk{|w>rw5azP z#`m7p+A->nLgqNm5I_%;*seDH6QPLnoXrvulmAn~XZy|SNjr(>M8Z0*#`2mq*k`>U zlIWYx4J9>|n;OisUNZb>pIVa@`KJ*Xr#}a3cd+_BCNfd&zJW1IX8f zln>IC4BZ7+Fo1ePs4;wFtz_R8c9dHTH!~pRyTZwEo8=MH7=j<_1AogIrXdAC5uvgC zU>aNSbD_s}f#LcE6yQq{;J|76ne2ALr3;|G7D~$IF&azoTVXgY$$V!<+f*KGyW07{al$cMz8&g>HXh+}j?49Ob=s`+RV3HJ)g|2meO0Pd zY@eR%-b$O^Y~mS;@@3(=0X%IjA%4S+)t?u9$gI~BA$&UOJ<@eThRHV+W(@z;0NIWBR9UNL`JHfA z0iL{xkW!f}Zjjt&!tsS=kqb#~75iVls)8s&D?;<#IuSce)VvX_RV z;iBoW=s|hG*VLl6iD5MfOH*DjZK9NZ+n8(vJS;ERIwn82!;@ejV)?dbo4DP*xaj}_ zGc4#f_8v`qCxhEPy|~c;(iI_!W`|9OXjM$E`0VPM*_%Ol7`vYrcNri>jd1cJ5S$E$ znrac$LiP-tM6y;$Y3gk9|-R@MNkdraUy9V)>i=EACk@^R-wnM)lNT|L^laVrVyD=q#pN_@P<8NJ;dZ8 zO*J+3)m7p=TanCuWaQFG>{%qTz{uiK2hDb6!o7rBaY>=vC~Wx2yrO2Ng6aw!AZU&*<07qDk?0zH;{GJ6n%dx{(gf-W9Ms%#GmWBa zQF@3dT0K!?q}L`sOk5R4;dMj&=tE;(5bf<4EBde)F2%(?Zpf7` zHQXe1xPe;X6vAnJ9)|{egn{LHTRHM9m#H0Tu_W9v7zB@s(V#3rqTvq10JuzsvQ(Cb zAR8)L7L#Mk>LEBf<~sx6B*S2HOe}N;R9UOVu`%lmfM*Os$Kf}gS;HU4$0S-@I}9?2 zOhM#?nEry}3&JPH=r$0yKtZ&Q%~xKn!h^R!s6I*a=F^YqxrK$rLo6ofAYr8*;q0(Hn@5)Km`n$C<_ZvfmS z3Y`_R-hllrbau@51~`AoIc$Z6JwrARxJ@*Vb7Sf!7`DK9G4&Iu)8zb^=ONB~}!_W!gIzgQ-l6NP5f~EX4kUDGEc6o`MC7vA zBJM_z>o+9J%VVLR0InDySHyfj0sJiJhgb4_qEFZz9P(0+n&b0Ay7P#KD@$nY8A=ZiV;e8i~ z7X@X$k!6;S%AFVJ&hV6Ah`%X@s0+HM0Jts74H3aF+nRMbP?c+rb4c9n2s>HG*m5qpdxT>l_5S1Yh~6uxd#p0&ley0@_I_&)Nq-=9zk5t&JubVi zZqbYG@%}I3`yXTHPZ4(h&_^TP=>a#iT*5B!p#0Y1<5K(X9*V(?o9RU7;@ux7Q7!vp zjKdrbS^yh3Lxe8d@FNp@cg$+37 zE~g^wa=O(v&r@#PQV-5wIQ-HLdpm3Qw2t#=FSMgp^bQiw#JaIi_VGK3KO4htazuj< z6BNLmBVWyP`qlV*uFw|uvNC^-wV(s(r*j{XzZt|_s|M!{dhqiEvA09-!~Vp|y%hE^^#c9F?<9{= z=H={8@;JeN3aD*jrkf{-|4XJ4>9SZvJW1pg?M?-97YQ2e-)yu2e<#}T|I}sE?M9V_ z8vI%eCS5(g6A`ueP4nBF+#&XkV9t^cO&4C30s1L^FE78d&Gt}G zLF5aeW_u{7015@jGTX1qE(NMsC}|*3Qe~P4786X(_8T&NT!3otn9W8JG2275To^2D zjM*NW+W@X4AlJnPh7t;RWr1N{k`NkDK!L16#I7|9e=mep2bM%V2<*~681|(#N@YET zl^YDX)>uE08LuUbEG0cg`_a0k4$3m)Yya6Om$hbm?K+$0($0*py=7W1ADZ#ClWdbK zV9og2HMW&vCrx{}at{5^4@_HTINZRxeW@%M%?3tub>9RIJ~PP3hB_IoQhFOoF{vFi zk=$5q@1@3=g$BiNwqvOz!F_eOBeDhiI6=fn?Bo+Q)!5F6Ay5~mJNuLpXk}!!ixQk+ zbTOJxL{=v@5LtzVFc0O+LK15AZ)|ie!bVqoZkU2AOL5BpO$umG{H`k1IRal9epQ#M z^0itd*uGSNno_e{RyL6ukH*YWjBcvD)|U2T^1#%I)g#8fy3&r(+iWpq;2T5Pb|uR_ zwhK-40_)Eon=0D1G`cR!HLEl;Zys#)TqmMf^`*Ufx~L$!KA+q$M&6>AViAZZXYcMU z!tUOUZ3P=khfLssP57iH(*pP)@to$;p^*-4lFcGPLus%BTV=OWTLDoUuoD$^ZwX5v z8pAYxWl45d`JmBP5hV}t5sA0vbYoJ}Nwo=;>!{k6)EuGAH)|bL+mqQ-m@yqyJCNT; z_^};TJ4J%JQWWt8yHwx#Vh!2`%9)+0`i%Fz8L^#h; zRZH|RL8ZB@qiR>eM+xjXs_KazD=0=+k#~-&Mp7r1<~pjHBS8zRda9)I991orI7^5e zM^!6xJEwHCqiQyp^CitFN7e4+E)vd+zj&Zn^7bHcsSp_HrQG&p*j{9=^cebY{vU&W zce-CjHjH0r)f-Cxms$1ylOt5caIn0I;~sC|70nkzn+}yX6DQQlZLuXBy>2O;37ebh zhB`RjN<=RM)lu;_A}viaoatbAI}vknC_Y_GDEM@fKRlSKpXg@U7li zDry-u;T5gSU8P)(3w?K~F2pfT;@3T;x`3s)j*Rz~;s=ccIx^l@Y7{>m8t*Ud!J#Et zKH`&y3W87m0ei$8HHnHPi+RQ-ut z+5){q-18@HZJB=>#`h;~W0j}>2$|zg+(Af*^`}*RI}~yLLInW z^@}hV269Lpzko5=XAhx1{Y5>EE-D=X^T z;??i4iW1Hkud3auWepfE$M7?(Mgpfuj4?`m4XYCs??D5P*m6jbtAmFtKJ9`m~T^I*}uT9)kNkW%ezr#BE2;O|?YK*}VY1Z}A@H!G~ z3L>)}8EsoAiI82NjQ}AS&vBdb?CJ(A{lyp(F{h3;@CBrvN~+6YL!X?3D^J)47+{g} zMn31~4D*BaLTo&ij2>%=L@^d4n@xNXSSFg9n`)XWa7}onXzuG#X45fbQqJ`NofP?O zHkM52w%LF}oBKi)_2Ry%s+h~ER`0rp28+D5D3j$1;TE};-nufThPa4hX2v)V`Dta8 zO`*sMSOT$_1h}OE6ZLZvb0LaxALv#Fg+ry41>mp`V(T(}Nn8fma?1%D=(eDz`?S0X zoSHE$P{Eh7CB?S!#VQh2wqr4jHMC*mw5>0K{wq!sWB1vPO2DWSbwxN)hiJ2EbKkDa zDgrYsw0&7`W0~6ictQ!ub}I8uq(B!2v~w9& zK%T9dbB_?a@DbLH0L>U!0>$Gszp73YL@TL0RFrk_OpG}tD2tVutn3(P3yW~J5Xvz! zt1O#`?c^g8d8Lj(RhceNFw=mpE^}8O&mvG`02AN~vks(YmKkFouhnfJR$FGY9n3ut zsVlRtfhOCgyOznY$#XbRq_yd1mEjBs)F1EoO@Z9@4&|tx^^+uMDmfwv6$w)dRJsN- z?GmtH2&ZxF8gMjR)KG>~LFQ47?k!{fK?$462F<0$bNRbj8=^oIY&?FqoQL4)dvnT2 z%9KIVO9RSgx28mb`Z6=$?=Awu*{vzwLgwJciqPV?Jpv^TT?QmhJ=!- z+iM-T!z#+82n&VG*_xuRFOUZ?)2yv2Bh2zZAuxG|f%RI^@u00NB7KmdM+W4PGPf@w zelT$}w;SsJF}F*<4d?bl%bGE_&Z%p}SwHJr(JB5gG8*OEnraR&n*-^Zx|Zq|jCVMQ zi%C&u?jy=HHOIobhGv{)q(v2@*O5LY;mPH^s?O|3`PA&XWF5Tf*o@1sU>U}cjND?6 zRUw^H=4ithc+s*l>>LO>=n6Tyte{u_kp}A=U?-R9HRV112)lr(8PF+Z1BfFM ziDELwuT#sq(!;p&O5;bt0tDC|qwizpL+Xpl<_}>ikuyD86S%l+ zp#`QBxTMS+cHD+PFD+~D?8I4q_-lBWA934tB)+T+u^}=&C@ccCD|C68o$K6Gc|{rL zCX3Hto>!L90kqVgGNo`=m9^tK%ytvXSm(>DiJ2DA`SKbRX_)s_*ctO$l%*FdgGf}T z%j-~wo_;ZEC-}hY`CD&>!2X0Y%j9V{u-Wj&b$YzfH8uhPVDMIp(M@iw(EVgGTBz0N zW`DE@NnL>5Cgg8yj;oIZH*#>hON6iv)Wo_uP8VYL3L{G$rCe|aU5ni(EC*Ai&6J`` zu?K{d;WUfW71%?byyY6_TtOCQAZpSf)j&=0<6A5#d z0>-pB)viZ9R2Bv@+UdCUm@;(@*qhT>-7wc$oF7+wc2ixI$zPWwPY}mJ`b53x>QuLN zS@I+qoGGtuO}5olLa)Q%sOyhEmmv&KN(|by)%DOSb@lO-Llc#iO&Dk!@pKGj7-;`O zikDMV&8nWOK5GnWpq?h>&M)iI;~9c2ZOK}RsbHfZJgX?e0kkygX=h!QJV(3|JDehB z9r9O)G_`PFm##qmM%bQw#$bo%KTizLR}&XTJAf|`oK+_)C|z0nod|Aqo?V^9{Gm&U z7YUk|Bdx8a)iuORBpVX5s_SKqiaiP9*w>}QKe9QlRP45=m&PtOz!e@6@j{mzuPK$&RwlJBH(pl})5eC{^_EhuyBHFqG03--gb~xgSgrtmr_8iOeNz*9)Aj`4wO~uN#Ct%UF#1CHJ&RY+ zf{I}l;QOpaYjaB9g}ieNwje&RglPj17-K!Y|ER24*5i$p z)>)6?74XMC+`erOc$VStxb4HYl|!^ zF}i{HoCH>Tv+G*t&OulaFwoqg|9?T%d{O(70XZ^h)&Egw(HCV=Rqekl!|WlEBB9!2 zrufQC+k4Xd2H@+mZkp`&iUeP9F8QX6ZYdG|7SjrxRrb99ciGRz#FAoZzt?JrZ3APT zto5-aa$izEWKlBepeCKH$&bvRHXUbSd<&PC&k%nmOu5~M-K#j$;_TU=?qR#6Dz zb^+ZN34UM;E*Cd@9Qv8<@^R=d2EjT3*{q-fhzKBOn=#d68{Lmgnjbel!Tq@qD~NYs zjhEF%c=ia}uaF!n7oPFYhKdT~h%O+{D~g*wfJFm-j+c~Nm&^SlJzXPWvRzDSLfo$3 zv5tUfaok(tFO38UY7Vp{-Z?Uu8W_TEa!O5%%f`l3x&~JU06Y+vwoooce1zep529qL z$&VY2)R=onB#4ZcT+8Ax{PQxd2%-`Mg>eBV#W7_=MaMRCW-vMK859n;FJX#%2`)TA zc|26fj%3mm7oT9IczOvQu#8eG^WET$NqB-_!tzpxRnUGCNPt($9Ye8I(mdA8p zH`hr-*OoU2qrvceT~3@#bR9Hmx^IbxpF(_Hkscc9>4crZ1}|7oWgU7NCD)gx9~tPx z0t4keo!AEPKHOx0nxM-AJcHnd^8V6;a$!yOzH;c zY(kr$VbG4?`2OH^g32(+G;6}}qZMO5sY_3h&Gi(ZcKG7}WQlw!7 zrvC$fPmM3aRvp>6dI5h=i<>Q77xL$pVO7j1fPHu<%~lZ8D|I5#i-~L<@9(h4B}AsX zH>^X=r9`)}sFcIxc^R2)rD#KTU+v|@w$nF(1*1eZG~!o~+8*L*Tw$!4UrB669515Z z4p>(a+kx%iJ?(13JH{8Z_w_7jUutu`hVV|(i~S41P5#%C-C6TTcyt8fz{@e@btHF* zqhS%%7w-P{c{bPUNhJ)`$(>Rr)eWR7EalbxMlzL#*$)dlljJ56Ri=ANAUQ+aOrlx| zb}>WTLZU_q1YkiJa$HrdZFVcUnendlJlQ3Q`O*-#k*M_vT+`Bx@8fndb#b}DpaU<< zOLPaRT}`1q;!YB?;@BXxP(GCKId_q%k9Q8w8^kiuJpFE>4RQVA{dT^GOd|##+?;M( z_+Elde9MR&ZZf%#Xmi}&%532K3GWu~L?}!HJwT{MAydr*ceg`@d$}Iaf5a&3C)-K;6G7dcNw20 z1YM>BP1%WCRZRLvNzWZki_+ly){I9XAMhTSGWsxRah`tMP7!;W&&}?32EhrSdEKBH_Z9$p3x>3>jqUrzkEc?s5T+<*@JUy;!3iT{x3l<~vvLHjSEuDJLtU*o^iahY~s=fCI0JMr%~`0wuc zBK-R;{(HXGG7^28KYQ4z*aKY)zGGWtzmT-8@-9;?Fx`gJBVszJt)w^ZnXsepTevSi z%Dx@_z>@u5ngQG_7KwhuCuC&w)yeG>0t4vhFr`4ti9|movOhlFPK=tF{=Rk&@1GGK zgbsip!Muflz>or_6MaE!IF69!Ho0NGv})uCAEoN>R~B3tmwmrBZXzxoU_Og5)WhDK z?(#{K-#3(4tmQW061AUyOJ<3Cj7jhv;iayk*;B&zWDg)a+&;7b9|>-mk=qn-jR3g= z`MRh<+p3wC`HB2NA@3UZXEFzeOxVi5*s33r&1%DFxQavLy)eA-YB7B^d3oXiz}I(J z$Y=tMU2(X9>AxSx!*NFt%C4*iu{e^94K=B4r?D)KBGZAX2=@Rgp>Zpgv3;aaGU033 zilgIbE~%HoMqZ;=9D|R$GtlZi=YbHs^&9;WdyPLIomJ>GGEKp1$JXGnf{ zzcR0C__E2w&-8FxQ(Q$r?kta^y;K5dn1SMKkE1VaMa!JyF?PsV$#$u8JyQGBDtSQx zmj~y??czwL3~ahtRhZy=4zlMvQc^*Mgb{W1yx=>Me^4EZ%V@l%H7tHXd;r_|Grg8r z(-IfTqQ~Q4xo3qhG70#muvT81$2BkZR%cL?*UJkoj*A!Q(s+fjTPE=a@d+bX2H?x$ zjU##z!SJ zx4%@$`UKs%bH13qC(=>&7+K>e%N8h&n5KGCWU{$9!&6GeYUsk;9JWA^#MCx*^mVV+%I!JK_~3nmTaV5S-KK zz8?81Nm(EE^$f}UEC$su?SGZ7Z(rEnG?>JFrRYhUkk|hHdfaq&^IUkA@Lc8IbR6nq zW5I9X3B2tD5K}E9R)k0t7xrqKy)REjo1(IV`YFNnqtu6nlI|saQ!bsI!JhGHT)VXH z+k*uWZ~M!5b^Fi~A5Ref*2v;oL{z%cX8t`h*Q*a0J`CHvqt%xE(L7rG+D)puv|_@N zv!SMNzlemCY$nDp6s*n?kx3vD-Q8H7Ydg=fOjMYfv;<4+u8_CaV3|OeIqisG)|$Z` z!O&k&7;I3`c39qHD`mYVHcG?gdt7b07o%v>QiVcQw)f*iyv;h(xgb5P$3xnz*mx1E zZ6CtjpF=nofkHHE*hNWajBMDfphYS69#@IQOazup*>iuvm>@E=wntKgPv_WUZ<5>S){6Ex$NcQ z#9*J)%+?Sw1Ir^DF!D=uaY@O$iLsRdU7cGnrJJoYsSfuxrhB`Z=1D5~kg%CS^IBi> zlI_=gEJDW%A@eKJZ6sU^mYdRFaI3E<+lJagODgA1UHNdHSM!`EWTK}pp>;uscgt)g z3~y!DCTEaSJg=UE-?mIwSAipk3q>^^#nE`I?_2lri%7lM_m8%fBO6YQfer`tUAS+cRQrbaac+~3G z2-Y+}6N2eHhgq(cxwh6w4?)cJZh6lPf~rY(6&hy)(z5w^)Q1cUql(p=TqJy?`Icc^ zRIbr*=9@J1*_Pf-Xw0wnCamxtEIFepJ6G^Jw8>jVG+QnbJzr)j(+PIxqvXp^&uL%6 zV4z|g69Jvg_7nl>TpadzDeN);V?P@>7RuC@SXO$ z@7rJn;9cUGNgXiPV*x)fAg2{>xA*|@L5_@K^1>aimfD}xJWK)5B8mVGLk&Vylu9+XQ@McXpn{lJi2+%v4C)3gqDB);20-Bm6gca!!| zN8_|0x15V}-H?YnvbJYf4m(l@D7W;HKHZq1I_Ifm%d+WNFk5>{*)fha>6|)toMSYJ zQ^Zbi1PAJ*HN!h4>?9}90=sSo9{@Bk9THBllxp-)z!X1CaD)}@kt2!tder1eB}@g* za0$^t{`Z^f>k>720(Ph^C%yWtNif~%Vi?!o*@vDhd1A)uobS#ExtDpqa12x|Ln>#T z|E-+kiVc0Ne0CR1lD)Z&O;y#{tc;_9)k*Ks7f(vmu@9xVA>V10?)jHFflwoj*@9o` z$QFAX)^)UN9EXn9kEyH7rn)|4Fj(_U@Is82s+xLz@uqA!oV1V)Am&BgnoVM_hSyQ= z$R<_AnPQXP?O0XNQ@m6~Holp>@5>cHUl4U|MJw=Nu7K0_+ydm`ToD$3Wt+pFKsUna zmecHRjq;e~!&YC_rhUS4uF>7M@@Gq#HecPQ`HLgQYI65UJ(DHIBClz)crJ@$gS#*7 zZgF^6~UxvtIOA2|{%8#bX}qI+3B5wr#FsX~h)o-IBk*}sW} zlYX=R5&=0?l*RwA&uAFmoB4P(n^z?p`3hxi>&D{O1cmk>glL_zz<^5T42bS4e@g_h zMEWg3_sP8{g0nL{opSgY6PEkjKFT7R`g@oB{s7boi#CH$m2&?5WD<@5w_s~%bxU2c zwXV{f9gdUyG?&zq!gk-&XSuX)@JL~vm;FPlGLO%5g>vrWSe;T|8_@)bA=Lh4Jqs}YC}_C^A`FL2FY)J zPbk%ZBMrFYW@cNX^eU16_IKrzwN0%Q-jKrI{jRW{!>LaoFjTGVq}hmRzW?1c*hbTs zkSjWDBHcdq!|x_ykSV?UMmJRb_`BlG^@(Idg4NLNRX_c%cuS(Lp2C~4{6GJ$Fpd~a z-2z)!wx;YaW67GHwGAbH{Y{BfZu4!+1d+)(eO+EUvrLU@yX}}F@3&KUEuovGqQ5O` zYqm2p9hWP}L-=}M59}J~NWqvAdaA#Y63dM#QQ6!eh7QSM`7s4>P=(>YW>RK_F=ZO+ zl9fEEfn4&(l)zS_7HqPtLNvE(eCM;6S;3g143$!iE0Sg=Bs^LJMGMCi)j^|)5=CQ5 zV6SE?P7&!QuJL1vaOCj z*tLZ>JZThNooH@qlswop*trF%$+=SIL{zFRDOvSVXiBb-Y%F#6E@dcFo-31>sk{H0 zFp6UH6`r+Xu1K=FzJ?nDTd>a!s8yU%BghDIl3du%LDf1H2 ztK`zyDK|G&(}H4&&;b-$HCG7XFj`vmDF;zvwOk1~kI`D&g3x?&dg4$Dt)467&p9as z8LYt!%netl+!|vE>saL^4`;S(jwNZQGEC=Y1U`boYmFtW**eK1DY^Dok}g}jr&6w) zk$17qSkjuW6a8J?3VUQkuUd||tv4CLFEMm9wahg(hZTsg@8OA-22l+PNNnH{Gco_6 z)zOlL3lrdjXieM{4jwcn|LC*b51cOHuWUDxweGlW*+ILN;pW+ zpqqP?H`T;QZsC!3Zc%k^s>kRzimzCMWtK7NG*7_2an<&=^r+^RrrkqDViJ>XQ_uG2{`c9Ck>Y_6|3b)hE1hE=3-N7T!pqia(raO9+G#JvX!8AL01Wq-}3VKZv zJ9|V$wM5%g#dH@Buf?$gnakE;iiF3w!_Da2s;gFbY(sU`EV*xRJ*KPlm|2O2x><=m zFxsf{TIF#ju_D5oP@@N zi!!OYS?h_^CX%fvkSdmS9)ZWo$ujdy)g*WI_?Bv{H0%-JSsqbif}(ED`qz6*va+cS zh1h~bgGbDio8aJwCDG^+8Zj2lJdIS7M@a`TW!Q>jvq!>$sfRFBQQgg>#DuBbbS7)@ zxW?)>>_V?sS~b|DMZ+|CCAliMBXe!@x#~nCdLH~_7&K;kgxST;^G%@U zc$DsXx4ZCn_ZZnGZ*MM~>)~$7so-<=@TltDo9mlo_rCq?RYBczY!R~rQXO?KPo{ZR zf^!w>qRQ#sV~`wh>R5z*Jlf7MI7$GW4!RLucRi(2o|I{jlz!Z*iSFz1+A4-_Wb$^8 zmZmYJDxe)6$s?4~)mxda)1#nl*!EWSvCAi0>f}z^Y8i=kXVUa27PDXygPSUq^G4Aa zNl@Js6L(Lh{+p_8YN^`;3*JP1s){;=s*>|9U9FLY+nK0mGHww~nUkIfx>?;&Cu5l^ zm-}UrVx5=sRiJyBcERKZ=*GC}wW=B?{bfc@!kU2cs7Ba3ipKG%3b_fjpUL}1@fA%~ z7=%<;?Dtt6FtPR&%fbLtXGZf@ha4D9)hAjcn)M))?mwDusGf;v&BLSzeLB=9RHGd7 zNvBXOWWr&e^EHY^q(^*uluEIfG7Ei~T%AId)2v-xeJtsteA>>_$CFy-Q*Nv{ ziQLgX=M5I8l07Di^+t=+NFO_zHp9i~v(Yn>EnG`=lL^9oZu6qCi=4|bD}R} zX8NjHcLx; zko;9X@6@!1$X)Gop`P{%$!jL7ty`zZa31+L*=w^{f3kR${B>Epn`r(+^7<^&b-@3U zydjHptGw4p-k3$25jPdC^X&`+bk>ow=-hX77`_D~qCfTZOf5 z%6v<|YsDB^!gKCwUASj5V?^)XnxfJ&p1I%aKzmL61mgFFIF74U%+*8LYD2i+aoCB0 z4yc@{C8~OI?8G*hq3y#7UUS3t?O z3dzkHN?sv>!eNg7Huo>|;iQ8Zf zY6*FZn6!RtZ8ajLSwqO%#7)QoYXo_Rp!zDNG0S&}%z>*BgO4;TgTP=6e~*Ml98$~0 zR!s1|Nr1LWHq1rOYJgwEy6!$OWL;&gzJ%#a^C98ZL~<6a`89YH4){l+Y6TuzV# zYYX|9q#0@?Sd7drpAdAeo*4u`B`BVz9r*h*{+8eca~YChN1~sr6g**d&Gqn^%IIS( zC|{6LPutEE{*p+}$Gi)vuQZ>!#x^dA69m5|n5@Q-RE2CS2!2Bl9YKl`iK>a@TMH)Y z5ie24pDK!f=a@OQb>cv%A^bgI88JAasGZ~o2Wnf_QuId;l@;@@M1N9LhL#2bKTl4! zGGGN?JuW09`ir2A=m|OrH4*$(Ks(^!RW}ojOaa<}Ne8u3vq+vGHPvE&Z=pz30Igk; zz&HVzm}I@VvvgaNC>CI94aRJj_r4@b zgb3qdv=f{tU>FOdgJ4X+7DVNcmYheZbPB#@8f5S}cM~cjq>t_)5}(po-Kza{KLV4c zU|laC)&l;VJVig-UjCXg#YB&{7Mk)Y_LU+&qOU!}Un@|eP4R}nVM41<2}jZqB5O>68LC2RzmUJzoT7b3EhlSD(FdxH zWbG;J4Zo|3ZMNCw_-~|Va~$Lt!Fgm+9-_>7T~;u~uxPE-yQ8CyBfg%8SG2XZil;Fk zv%bg3^1aE@%aPu|qhWoloW<*BmM6EN$5mG$;G|ykwgSnGJW?!UF!SY;*w`bWptUl? z0#ciJ6pe4z&$X#XG|hoczp5pH_@t_fZsw6_XKePVG$m1mYIBdr1wfpFRWaSdW9C*T z8&O8pN~d~6gN&tCA)DqAh^mRPLeQ}Oef9W| zE zVo~S?n#=Z-PFmco&QelX8^o#Al6GNcSk;``EQ{G>E{d!vRezdoIe7<$*@+LFV;PK0 zD6?u%yIZiTx}gcEDo=AQ3j0n=bwv~12C72sVX57=G%clC)SebMjnbNEZ9{&lP3>jL z8VosF=!o3s0Ciz+OSwLQRH{AgGo?~i_DyqA(h8i^Q?O;qDFvN3Rh>#XF%Y4Yq*1Xt zK4@Pjh7fSlIJz)X<*VJ1ZqaP_PIWj6TB>GP&kQ>q!S$djZCwsD%Xh1{r5&N(l1eCW z+KE+#o9Fl>7EQRIldsmQa@~%_ZEYWQkMie8Ts zs;fzvZX<1}6;j=AKPQ9!D>6-uvel`TwO!yyF%x3YP-U>!!CEab5UFC==NM`1y2ctz zPO2gHJ4SBYw45r78OJq2!NN{9MDt4|wUnwl4mb%cg{%N|9Fo@;V84ERF52SR1IQei(c-=1=T4RI)U7>sCv1` z=fi?_^1+K8i4|}ye1rTX?FOlQL#Aq*s;~z*vZe;! zHC18{bRg zWqK~XnW;J~;~4o1!^q*ISX|I6lZh&-1ebr>`@*gR%!FJC2Wml zxukj6QnE)2i;Z#B*tl&*JI*S0%i1wx@Tx%{$n?jK!6T5nF?}3Fnd8QgfuVk~G&Q%IfXQ<~XnB+hq_F=alT@E@$aLC+w1fkick zGYMYka!~Xvq8AD3W;|@ShK7pi_iU0E3u)#&1cBAQbq=XZgfgugzSncfT`HV>`zfOV zo=5mHfiY30+>81H@yi95Ac!Gx0f{Rdf%k#1oit-yNa{+V%;Vkca1p7igp!$^OUQ_v z%*1DYwV*j)q}ii*DFv<>LqI1qxinO=xYm27ZH&vwTqlg~O07!48XSpULHv5Az+OF0 zn95v9<_2L{=bC2B_A)bGMdC(BBF5xJlg&3d;$)w|370je~&61_)IL`8S8M{gs1ufTA_*I;C2a57|YpJ1W;?hXpx zFJQ76VsfK7o_{Cd2LzVZ(>A}0;DZ8ES2Ba!-Gm8 z(I*K0#RIqGy`^{)PkZ225xKn-;4>b$btL)}!Dl^idL;T6g3o#2Hj(Hv1pg`^D&RHQ zvn2jz2vKNETRunPd6SJS`B1aJ5`4h}QM11h{JRIDX3rCR(F0Ml7YM%OfvDNv3I4+a zQL`5bzU+ah*-Hff>4B)(%LM-=p#N%MDwJSo(rB-k1oGOZwLr0x@Voye^>3357CLjs z&3}l$YL`*EETi!W9pp8V|FL94TT<5CZxa2lMQhtC;C_Sj+r(d!M>MxEa4otBH;PB1 z?~;36IF&~`zDMkh5JNM*PwdSQLo0qj?5z+(BYs5e?GQ6v7ukMH>YY&(a{q+XyQ3&P zj+o0*tZ5Rul{|(UUNx*5Q?|OLQecvsG0Il_oi_EEL|Svy{R5N@5iu(7VFQ zB7zzctZMM=G#ipzO`jtMOgMa@P1K710DCOi)kC(SsTCT`#)Q`p7`h8pR)k)|Gu9Lc zJ|%G`SVa>N*ubnMjEpf}c{d}owlF9ZJ&&z0l*z7-%}K2zlxz|R>#_xjb%ikFjhEq6 zlIsbHr?<3bS9KcM_08jw{tMrV)CT3${6ufIf&5_*CbgkQHDOe36jQ`>QX6@cRcE&$ zv+*cKjZ)i^-Na+<7J==^Z0a$(&0u@tn|XLmQ+<8Y9PyveAh)^4`I`WCAiIUfYD#Yz zABpZrp{bq_{6}!K6Q1V5;#1n0=$0M|pSWIo0E;ont+GhhUI~(0XOV0%Y0L_e)3Zq1 zES2Q8$>OA8&@o^+Cb?}EsddB&TXNft!5I?<9QG91K1;-Jz?tM{czj)B=n<_YyMxcx zV(W^&=Q@%*dZd`J)SnDTKiQo;mUc_Ggq=lxXOCx}w&uoq(z|5QP1q!%j+h3r36I68 zh$N0NHIk_C2yW=H>6%Da`g8)P`*3Q&^!a8ARE-jFFL^f#RC@xlytK!eTgcXUY^xjs z!~tLuGd+SQd2PB@(zPBfxrQsfHu7~I-;8aH=vRft=d^3N+#1ZGb)(3*V3)|Oazr8R zN5qLC7ja@^gyo+kTzz>+SZ`B9Iqut-m5?r`QCKbxBmU2Xf(fhd) zh`}5Wn#zL~`44+ng6rbJm&Nk)>UeNf92J4LCD^T8{+lI#^WkDKLiO^y09#e$_cz5T zTca!6Ugd~h(SpdYgI$d-97m*RuW~8d?ou}S$6PiL|G7uG1icb)&vGd^0_JIH_X$gj zKzS(b?&ZNg@*kWK!4W}#QlMZ!w7_%AgFVWFJyFg!ubgN(9JkR1+*b;TNM3BiPAR8E z{puNHRGp$umayHHu%oxT}j_~h7{zaTQ;EVYe!Q>#kYk3q`SO7%KIQ+#m75IzDaQ}^> zj~p5a{v-c?jQ<)2_!=^Z#EBOXDH`BQ=(R7QuY4GHKuF){FGpZy{wq_ian|#3HH3s^ zLkkb;yTX+ZL9gi!`O(uNL1(%A9z;z~j|9!d`UCeYNO|&cHA2u&3^MqyuRQ244>Ax& z(6^KoMsT;iCm;*gocXx>K+;Dq#I5WiRS>;65;X8%1+eaE9k282c(By55n=N>mS|Ty zn6+GLYk7dH<$&YT0SV3qTCb-2Fin_<-q~v!GYz$LFFh4Y+pg`B!Kx* z#7SE;LFlFB5*rQwI3yNy#e#G!m=_DWW5N7b&=U*xivpC;|?f@Jmc4JnSS()*R54t#ws3Zt9X?Cnx2gWN0kS+ zmgd8j66{|b99fRv`LLk~d^_OhBf-%IE`V)>P5qBZu#gy}O@cR-c_(6lcg?>fAIdP_ z_r^pKK>gGSkjj^6>C!jxzvyQy!ma?n2umi-`xW!hL53aYyDYvS`h$7tQ3 z_#$^q*Jt{>TM@HWo90|L%~`f-&USDA9NS1io^-&o%7b%In&tEGuL3MFgJtCwE6fX? zjpGNFlO&7f|8yM8k50^!jtMfJ7j!claQN?RWQMTLRuEqRmL2F?mxSZ&+IeP#$7l<= zOXNSS3Z#1@zYX$&YvmsW(BEAF3!{U9%fF$7iG+4Z{A@{Ag=laP+v~ z+VbFLK6BJRqHTG>lN5M$x%}vCzGdV(Cy!%Uesr(!X$8?#9d6o=3^+%A@CF z6k|_=4Emw{n;*R(FZio;;pl~V!PWdaz)dOBq4~IxqNk zT<|I-ZbBPe6Ussk-ROoq8SL45+D)Q2g(CUUTjWQ6^wzxK29b*1_8Twz_UxB^N0>)J z^zQISe)OKa;4aCjAbNjTwEXCU<^d?tBmY;~m4Hi8Tx&SDy1VKQT!MG;c8|EQD!9Zo zF}R>HK@^RNL#D~U+YZOF9qksqjBq|~ZuE>tYAVi5Ef@U!x z;`{$o-P1E%2_N4#Ur*JkvsHDSzfM)pyrRHY44jG(VKuITy$`!xT+;rA} zf2>g!XUZPSBE7O8OUjhJ>Xp6GoGFDLACAPE&CL_M0kR@@Q&wWoX+%~jD9G9jB;N5L zA%FI;uuh=>NhV<7eJ!W3utAkU!C$lhSomNUu<&684#>ueDn@T}B`j>oy|nVlE^gk| z%A2>1GV)n2>E!PoT|QUZl3FYOYR**3L({*Nx+kd=1g&hR7(D(mRf<(Y@H=DZOo2tT zlGm%m^wYWjWTSbqQH-Pu2&z~&0!i16llGEO(naIwMv17!NwrkKWs7n{Eh`n*R4Q&& zrub`KS*@f?hKFB-YGpy{q-@Ek7bXT6(uUlqk4o8FObbpNE9ej0v{KY>C;N)#b_b}) z+aAx`X(bynoa(UBrBeFfO6fx?r4OZ;9OiW#p*qsL zbfl*pBj#?6lZhM*C&wz!Qtxlg$S2^IvSDHSd()5Yh&4fHMfNqj!04I6dr&QkC z@2a)bz3!gnG+~Ym4gT{8M*Q?jCwf*oaYm&RXL>bf3DZpIpn~sLD)>RAg0m|X^zsVM z@wfFy>f#%|_0JUVlqn6Uv~XVKIGvx5lamX*^@}S9>Jl}P z+Pk!5@3PDuqU!Pr8%_p#ML*eH01PS*fU78EWk|`w(9FV4JsMVFO@^2Cs4M2wHL5`U zbuvOqE1Q*(lB4`}nQxWg&IMH|a=qkB#tptdV{*+_#!AH!IxaT^x|N%9UcZFik`s_* zNVdNHN_JjZZ-=H9=?u)yAFvZwao*_h*|1>X@2DJ#-;|i{VhON0LBHibepx5K%RuHK zVO}Z|{Y0Cra&P%5_Lx@kDfYM+WaWU;DPpGSw8m9GR-O=Z3foYZC$(9tPM*q~^sxJM zrJqyFZW)4gT0RM7x_9_lby#NdOJ;dz=Lk2uaE#Mru6nr<pv#~0F~yqGdM zK<3MyZDG!~IAdErL0t%6n?!Rk*%ROZia0UuJK8W)CaXhHSi!#M)08CmS*HeogqRm=~jT*&1Gtt+RY2 zW`0H)rj$);h5)d+?z^`` z*)OW?nF^b`JLFODoq=3=i5}}Im5nHY0mJi zM%hmlOWUgKPP8lQrtehyvTpj0cThv@=7D)%*tO2ukPclJulkTOmk(8!oqS$Zv4lEl zX39=XddD~>t2{609rHM#SDc<2|1i#u1J8-e&kN3t)3e&kISM z*f1Kia=9_@)|p|@cZD(6)oW>>!Iz)j=GP=)cz=@9oD4SRF{R5@I{HqoEgAiaHxLva zR*NID?v2#$jnM9mh|S1YuG8*~h~;`?Kv}?k+*DH8^uOyD7O2Kiz7M}JW^J7rg+AP@ zj*Y^A+?qOeM@h@hZ#XDCraH!EUX4?)?o_YF#%5eBzcB^{4Rg6m%dgO}2TCe;`v3if zS5)K8-m8aHTshCa zc;Lks4awfjl)m$;FiBU?iQefijF}jl&JDaC(;z!Am<{r!5)V@1(GAipFjE@D1mrnH ziN`ib5SXVMq=ga>Rbtl$X&IQQ4N{}TgO&KL25A+Try4Aur?d;Ww)d=6oSIG#_0>^l z;SGV!3e(lCso5Nu7GH@sjp1EuLkA84hO|c-)x6n^_%c0ye>T1l?^?;;35;JhY3od^ z$#??`8D}YjU&K2G>6-nAxa^6+Y`=ha3ercpb6_}olzU*nHz`8R-1sX0!pJUxnHHPF zkXjv#E~dB7$zgd#zOF2tYE2h#9Uhoju^bVYXJa`sFf(F)AU6XORt@9N#H`)`G%HfLCZI30S$62jX*KR_c#`@IAsPvhkD93v-fP&Pk>-?7zQNrtpLY?`zqFdtE{2ihv8^Yq5DfmVp5aO9%o(N=pCh zYf}nKROeD3TSJ5NVe~SejLNWVCN3|Zi7Rv_a=NXIo4&kxc)<6*p>b7tK*-fPKUb%E zhGj3wyC$2?Ys#kc&w?}sUYn=DBLc2xOEG{W19NgcN^)Ib9@fJ3f$pYn47hBQWpu_e z2E(8%V?E2y17aOnevz@<3}ec2i)Z;|fc8Cl<}9}dW++vdL9JzcVBVtzey(n9hPReG z19OQQxQm+QZeFcS$n4((w9)2!z5NFQvy9U6JNO!-WAd<E^4 zb@X;^EPn{h^HuEhS~Sc70Q09f@*FKYd0rhz_XaNnrki$nzVFvdd7~`wW3VtAlSRJ1 zI52ojxhlrY!rJsYN65+>UiVV3Wm&+jDeSXpMP`4M@;G@Xw}AyObKpHM`sch+)_H^L zGY2;K`iFt(s&{x_$QQ%T&yXgj7I4uS!c2g!F6@ElJ3-70WN2 zwkr#7snlq(Gl9+=2UJzdV-ukn01c&~oiv zlY%sa1ZbUmvbVb8BvCIHLT@oNGtwLB72=8i?liW^HDZ43uQm1ANn7974%u*YR6`iF z14AZ|bpD{w7+>lVnip7tl0!p2Lc*ARJv6WNVW22%uHMO~#2~3bw5i-T6zmkf^y=qEGry4*BbZn#8nDuwM)LOr>>V_DbXw zlpEQwS7KTvaI||yKuvmtYd3{5p#tz4<9f85&1ppd`}qdz4{hUkz(BB7iN z3;7g5t5$}G{ILqCSCbW6J5`bb+Q^VURzc$pIaO{9xvcZrfG39LLVC?{#2nUw zOwy?KL|lt7`N;0fOwP?Xd0Z_aDl!C(o?q zUy1_I3l!L{D1b6P9tFNo6rk}Ps+uU!JR%CfXjQ~(z-zYK4Wo38qev9-=M~*KT?!G` z4iZ~LTsv5*iOf9J(<&nD;ov*s3IdgN5myit8X~SBDD15)PKuG)Q3nFypiN|Y$1H2r z^nl8JBTWH9PE)u57OlHh#&@*Ga`amPjw$^LHS;UDjvW_ z1ToalrgA6eLuMbh;Gm9?{7h$!lN+NfC)vf@LJPALI)-I< zHeB&+bi@Q>SYn1JGDauHutdg2q`XBux~-&kWRksjHGO5Ke|_x*1O3ZL3nLRg`M5Sy zKSI_2Qq^CZm=THmO4VPB^(``>yj3r^Yhe+7GbMMI?0of`ISX&8_oF=UO^BF0jZR7r zKJJOq9A-=gd~$D;ZY#$or6()*VeE9bI<5i&ABgny6nF1I%ECrxY$mCE7SO@_QpEGa@BC8!=OWg_)jvHl(S?j7?;& zXL*ia87R$TMgHhpo{!9}6vi*Ilm~1#vu-5B z%(^;Q#`Y?g$K7~4GV4hU6GKS(9~ft+ylZ zX=IOKA5Ga+)~V5x13W9=6q(TppZ$zUWV4p>>}NC_`&eaR2!dr-*`l(eF%;V(vs_(4 zr$19F_;}*{x5$j~qx1K?cj@T-BOM+2XX@j2WkHt4(fm(j#(Bvvnn>=*B)?20t1O=> z!DjZcVyp?hd|=HSmL#-(op3h2|J6#sX3UzEbYH$^sbP=Szgo*I7*bgO>MgTi?}K0e z_O{G|*`G#L&GoNn&8upyjb)Atv-?>y4jT_ugX#gST4`sACzWOD;g|}7rEDt3;Y`QUL8JfRm(1W)$^Y>zmsln))Ol&va+z-# z=yhJ1>HM)L4<>ofrr;2rf{?-#9Hvvy`{SqJ)j9>~!8NLyQ*eZ33WkncXU%N-F4t#; z8!S@*C6-@hl;vYx(DfrXR#wMY9tOdz*EUWqp_*>kZpu3ObKl8Zv^{OSHLu8Rn66l+ zEHftG2`HQg-*3;E$nk%csUG|uZ+U=#!X2vF$!{&8NM&V$Wv+zAdoc%U%yW8|yodK= z&Oz;i8e`yii29vO(inp@coAch$yJsgJ*tD_o6D})EUA0UW2WSe;^#sdqfm_FJj?tB zLTca4f$^s;Gp4x-Dr{&{kg1j#6X>ep8Leq25M?vH!?V>xq$28$%vI|sqf7G?1bE~B zs2~8+^BVl}Vu}HaOBk@rmy;LfX{4^tP+)_iz!F7)^@-V#$g9?%u$+;<8;HLM13qlc@L`Q|Y|GP^cN8!-Vzk~>z}T3`pZsK9r+~qh_Z2YEvfj6Rpn$=a z4;3)bveCC}vWDc%I`2XL*ps({tqv__QzF|e7yeD)`ZVME%ya!iF#}vw@wv^im;X@b zo*~1RiVTnfGBkHwoK$PNIjeF+0eBZU#*8*eWw&uF z*giL9rGw*A4%a$**A6Og?Ba;M?8?E8s0_A4l+DTEj{87Zz=r5Z$JHN=M>}o^K~%c= z2!h8rGm>@rhS&eCa{XQNiX7+6R;-9F+XQxV+yp}KBsMtto+G4r-5(_&SvkuQ!@%-` zTo09;?Feb0_e!1Z?FeHa^l^l-&FUbOfYQ&QieF(krV6N^PgPDXa!eIq4ZMJ{iybo# zG+*MFaiDM+<+8Kq%dtztDRt7ufBCw2~ zvpV7&TGc_^M=L`eac)a?Q=1fIm?O@Ct{Se(v$DoOVh^Ip#d*$Y{)J zrZu;?ES-6wey2^+nJ0H|R(L^ir&vr+g!d`(9QIbnWTsd&`xNCi$HGd&*qtR^E1`>j zkbGXc-%?d8Rn`7fW#u=Hu+p|z+6LX_(qyJx(VsH^)}@%%zF67>-R;sGrbDs(NOyuN z>sYLSExE^~*-)oq+2QbkMLit8&oR&0zi8!tOpbb#;sL{G{VC1XTUrlc$1>0;YXYra8h^dk9a@xSsJ`Gby}h_%z!wd4?45 zX|CcE%J}%qWu9a5Oh5mqs+qaGsF(%UUQ!V9?0U7bK)E~!y{vP(6J0iCS6QSy3PMYr zXW-&z&`WE z{2f#5oIAfhT5rDN@8w51PJu7OkjtI&?sKCJE24&gzyEr|ajpzGPWiW$`1^dvDRpY* zox3boU>{`7e>0E~5c0~;y?y!eAQhs9{cCY1cb_xA;m-Ql!sx;Uw_iHrn#wDyXHG8- z(r%bB{rZaP$W5i1yXA+&q&O{C1Zdp>?8BBHvSR#y@e;?GFdw*~eo?f3`Q2n#&{%&@ z!<`H3?*d-3_|7E@7cRM%^dP=+;ev+6(d+9MHC$SHhv3pBv1sX%J4=_Q`tXv^3?8 zL@NcI|KEoHSw8Jhxg>h!vWEI-!_D>g)ht=CIC^R64O*Xj>+f4i!gA4}Hda5sbb9@w z`nwvO8yoIwSlqCzKDuBDi*hRKqtS&8r8mVEM4g+KHZ;Jj&NYkgS+IP;?F$wzh~7sY zWA{b%OBcg<&ZnkCm&BGWZn*Da$62&A_zmCvdM#YA)PYeK(z6>I>K8^EvuTFsEHt9Q zsLRz2(TY2w3+_RMu3l2V@Y2%7OG?pRP@?qCC9%cxOYdC}Z7h`xr4v}QI~LY2UoIMn zEr#XyGv{P0ZLD8T!8R}C+!n zr1>G|J#stF`OxR~CDFOjhUL*^cQn@1@6S2HKepFd_(xy5r+(pr`K8MmmM*-nlr*NX zZ#FjEarc!=7B642u%WtP`EqnWR8ZMOdgK#xuby#3WyOrSH{DQo{q##q8}5O-)YLCq zR623O{4;Zc6J;)EFF0>Ov|-Wm^Oi2Tw_#aq>9PiK)N}8xzsGSXFLHh4#`i1mtUK!$ zE?ltquJbj!v%F!2#8lXu`cFq_X8tIJn3sBqn4a3t|8+O%(WuhNE;dtO*<`Ha>v~b z(Wcm?s>KKLVt)B& zE2GxlPY*JV0;AE&uTd=uw4&U|V7z%SFB-zEw#weL0941DnwCCs#8@B{-!U0fC+b%;N0nsN%GNhp zP;%l$lRh?C7fM#HoZz5{M7N=uwg@VRRJOrM;wvlTZx$zB8G#+H(E5f5vqc1iX=-s$ zft=Kp@i#_gbqgfLw+?&|ddEg(X0m+f+;$iQx3%L#FpW>?6UrJ;nx=x*x-%cJ7R;^B ztp~DxOp77Qx_28=x| zWaPih2f-WPR^untg?iddk`?HL+b?CC`iip>ZYwJUN>3}R%3i{1Le&mtcUQA^sF$q` zk_uQsq^2KUi6lrcmdN+38cu9xajY&&$qy$w`8`l&_V0={*US zqlm(ZyiTTC-^?~)Ui6fpeS-}W${Zt2QU%B6zotBCyhFtCU7;Fn%B=tB0MW!6+BVJ1 zk&4mQ*)l6)R|m^vmp_h8u#R2c?OX^=GhsGM2Rpj!kr3a(PsRg!iD|puGme%9)V?)J zLP>m^hOKO0g@GDtslS4$tDjcp%5f=9t_ z2StGOQRH^qwiX6F#?%$QgCMD=ZJczgmMe^RBqbLklJUNxoIZ&@vOz*8C9wrKH4sT1 zFs0)hsDx&=qQR`veo(+|rB!>!V$VelJ}R78LIc%>_O=Z(c+H5WvrUj6Za-J^#-E`! zh2i!OYYz1>G}*EIZklXVxczNaSouTY_W$O06Yq}>x4+KshJQ@B{in)r%#lyaA1MGy z9Vfi=Ancu(fi~DHpQ(!=!r5oza9%VF32Ht@8o%R;{w$0k%`{Tbg2*&{+{zgez+t*g zelVxnzAog7fqOS%7*yMj4kx%-g(63A_LqZ}gJpN{JI8uy_i+0+G^cItA#VK|>k?21 zS!uhf(ErC?`wZ)p?Hljg8LGq?_^Hm2ItGG*(-F2e1oyNVF9ACWFk9u3wyuami4R6{(~=06d{ zFL}`w5ah?S=t3x~elt2c&+_C)IfYf8f@qcHDU43DJfY}h%X4&eyyY1KMNO|gHp&^F z$_d8`dbe}R5ojf;=2u7@?&lTYU&AEUx@5?}SJ3;ZA)*4K0ZexjQiFYdx->ICM`&g? zqBJwd&UV;0{^n>b94>%T$qxB0GybBUL?Z-DnKI>y%oxQl@1AjaPhvi(ciwsD6`2x4 z-R)D!8&soQ)ZnM8k?x#F+(o%M*}Fe}SrMBn`Y8h%VK8cPr0%J6G?^G7dRXW9ABCje ze<5Q!p~|p2qD;7bE6Bbc;r6cwzkCs2-a|3#_p%mgn%amgY)ya7BX+?;KJ!77#AO3l z3nrptjqlGu(GlKd2I|OADNba|%$$poG?KH}VAq4%=||{L5O4W|45Asb>wp;a*T6EH zZt0|sRvV-%^HWv%ukQqr(knu#YeTQ^jQ551j~nmTGnB3y9AUwY9BxWvu=JdPrZG*9SG}v&tLx_k)5t2( zy$fd*WbNXvi*GsIcZoM+)1?rfF)Fho$2Wwj^|>7P$Zdptw!Kzw$8S07j`5L2l!)GFW$?CrFv+IxHq78%O2hrJAuPNZSmNyjvWgs9$+>_}R!neBl07r-Yxa9*F;aGAT^DWR;&ZH}(OD5SJLt)M#SG z%F{I8tq)>$Ik@_`mgh=g?hZJQ;Y9uEszdBFtVMd~KzBckS+}wQbHu<^i{3EWhOYeB z1jh11^tSje*)I@%U&Pokn2`?ilaO>6GmOUj#y5@kBKzpSxhDgd4)4a!&{fTi>;&6N zWea~cdRP3JU6=tM8|B(8DIw48n9P{~$2Lhq=}hb37uo)+v^sHgjcz;&oV{7&bt4vw-VDwm&`X~fq z(?GQ5Y-7+}M_n!7Fs1#oj=t$l(=paYwi}&gFSd5PTeqEgt0ubD-BPJZZe*8Obh2Cb zf+St&R_~UiscvLXPed+mB&+wi)v07%%B_11OnY0lK&@0{UwY0y$z0^t9gxf+xB4J6 zw@pMH-N+%Nw%#}M9n9#W+Nh(XQK7-O_#5R2lE;BNet)U63bWq9qEhjEwC}jqH)YHI zmFV%18(#qioVyIhUo3`yh<4-R2l5a&k4DIXS2>xZ05D|f0^*62gA4tN7|U+?sVTeT z1(?vS?iWRO6GslS8te8D*A38Y@_iG&+vf2b-QQxh=T%To8#H%}L?4iOd`F56xOz6s zA;s;%*Z6@^e@mUx{kIefaa$X6lR|-{g}F)jfuyCmN#%j0XfSC)3knP*uEZ2BdSJ($WuQ=`(}$zASxK zklvrA&koWLXX*2T^nom$Th+E)o-3pF)Tc2>=ixG~!pd{xbJtD>C3}W#rWYYQciR9i zFTo9Y1SC7Y%BnN6CiU1PD3F%z1c*&X)}}U177FJ{C?y?PpL+B{QaZU4ErTtaylv%4 zTqMZ0w-mq)2{TaSD;p!z3b6UAXk)Uzn6yeXi~s$)RUZdAzLk#PtU8<3sx4aZ%1rKK zwdEstV6OrxT+K_G-OA>6U3@Ej=5^%65=bEA$QO%;(s3@7Rh*NXfX@?-vsv$|q6IHXrPfKM+E^(ztE6QY+Q=Gzh8=BMv)YB7 z=Upo34_1M>OumdQ6bn<XdltI1?C!sS+!j1I5g zncNu|r@#p^FAz}e%yl{IA(`3auJ#(i<>U@$*||@AV6+jGU8&c`FMHw)WHQI^oZO+v ze2m^O?tLW%9H(_LgmHRMt(TqIaYG{6L2veV4%+C)*gT*i*3pA8Ye+{1Q+iA|XV8lr zw*DGFFxGd{c;C35$YH3lvnMj3e^@5I9mJoCo(NqVf7pN(kKzMGV6o8e#7>ebH;oeC z$0^;E?%pmW>!dMRJKH^x+)bs>6CJTXzBAwSRgCjkrxhhb?zPwy6^Q+hYq{Pa8QXZ* zP7-|Bt-KIflXU}b?bIaCl?UCbX_9o%tt^+MLvHPKN$PW}swAn{t(=Uco{HI20HmJE zd4eE7r+S=(V%CH?GbTpR6!Uj3tv-y>p(^I}R#h%ru~;0;8$-@2=@C8=* z4O(n`D2K^O!uFev#zi+|F5bhVXJ$qZMi0%JySJH5+k-DmL5l+S(?$(l+8mo8?@QO1@Ds z!^izW4eQe^Ur=;w-x`!^_B+`eHi}>=;fKdhNnyJ1n;bk1C&_gC(6G~Rxr%g=D8O@< zd=n&3hd7ffKX`267ncp9x!UC%_Cq_~bZYQC&IM%A*G6@W`XN8Tk6#$NOl>X@GpR-t zaeA=QS#>Imx>pyA@=>+hkSAcN1b1oo%BOFyIo)KgkZUIaJ0WW+Yjva`f^<$sMO*bl)pi!WD*AD$ zk$Sfdo%HT8%^#5(tr5@T&QN^YcA-<#ZzE$*Wb2pyEzj}lUbwMI)yAX=T(=0>*1o40eC5!qfA+1iX<$n9?R)~2Z} z$cwa?a8{Jr(AvE9^H5|Jd-&;Ibqiyjk;9FZ>}|7P_s1EPDp*w8r0X3VIr=K%o@(7; zYM1PI9ByE1z_N9+WNXDNnU{P=gbTvH*`dO}jF)W?dppnS_ug4ho1V5U*rnn>>E*3` zPXYEs){=tRTx6}xrq;%r*NzE$7jjWWd(yIQ-Fm5pOp>cNKvuHtLee7}gD%FQVy`S7 z{p07lj%n{9In{ zmDBVQ_#@;`M*^zhvd~b~cu2ihPTt=`HJ)kj)stnvT?uMOAOYiMzZnK*GJ;OKAAB4pK`G!jk27?-#(Z6r%)on5^ zGY$=!jy####P&^ht$<|kr6W(J9%U=1yBIIf(CNsQ)MISx^qdwiK{nH8^3!$gf$=fS=7QW0d? zn5{b^z@uTSOT37mvcSzLt26s@v1kOo;WVv{J0aVVim=e(sQ=ZwQ)t) ztA5fjA>gb@)~$)ZIX3Z13|2$*TJMH1=p`c?+)5tZCF?f2wV}*MdbbV2WJhGM!^{eV z&rjUkli0^g>iE}_IAGC1K`mEMOa~`iu9pG{#iiT&(0g+X{sb~76HJ$D!$rw;TbP48 z=E%L3xcUWZ+P0lIvYX1T>lPktw5O0AOVxe)=YakhVc`mCw#}2(#jvKtuVe>zt82Z^ z$Dx36tKw~RN$+XWlFgw%Z$=CBK2nHz!i6w@f@C9$_fTclHA>XVog;J&g3~ZyagX}s zPRqLT;X{T23t?1}3`Tfyx@$b0EI~QJxH5Jm1^WTki-axvjI|@r0aA|1@=7h8@I|&cTL3Cbb`e6fppg)D4I?% zH^24CH)i9vethdm9L6VHCub&r;!}?tf@8>7u9wyifyePLBW^;Ty$OE$;YRGHvjki? zqDbz0W#$E^7f?U7!3vE{4+`8U0{LkK(#|UIlyrh$f+3JLdzhkVr#6Cs2gh*Di5hTY zD!xN>iD4(JDBaROgwa=(wa=XBt14Yq8m)AO8xYBP=6r5~hPcVK`jJ42+UiLW*slMdR zR4XgFB36;~SbyFEfaFd(1Lp{SACm@%?>eI7OCWh9zdntFI3pEoe~>0^nTVh%Hse>{ zkej8C=uo0@u&Wg64YN(`s&s-0`@7ady`WR9#rM4leja&rVxF`J7FQ5;c{_>2T?fcV)I9edRi!x|9TPw$V!CkC>}A7r4{Vp*HK~b z&z!?{vh%r}CHPEA*K-qNfqN3;@X7q1$29G;`%^eK_Bul#+~`U0t_dddnK8P8XeK9x zXQdNlW(StPi6Z}-{7n@5-}pCJ`3@+!H^I;0l`m6~sf0v}fY?+*B1TtMbSlB9k?x}S z-c6{>k(_#}kx63&RZVF$%8@A%Nn~bjIFc`4Yy|$#l+5h`V&)Nhz=kn)=nHI-Jhwk6Y z`iGZpa4?U{Jctj!LQzS*RhYlpO2O`f5Q~!mqEgc1RwsF?U!2ZwO*IT)`ia#aeItKu zYR-TLxewz=Av+nVh!yes1l9`dnQ=L(xZ%O?8j$D6VMHJbo`SS=q)4a!ucvi*;?nhF z89ym~AedMYW8#?JlhDV5>(|yk9#q;Bzp-X|f_eY;ROE$p*H#9RNOvl-JKeQi@UB#3 zPr9p{IKfmc#^+3s$54bnK~6)FTsTOSj7Ip{l;kq<*QX?l7Qt>N%&F7UT`xcqyP&YA z=3xr8n-osVC^%IgN_Xu6@H!d#5Tu#Gv|Y&aNX4?g1S4y)As69{!fexbV=4q`#s+v? zhtu(7CqLtFmb;ytb0&otKQPsmX?u^17;M5G3Cctqbr}0()Df_QpQFRxER@ib;Fyw! zO%(KCx08c!GBVap>>|Jf{W!PtHKE}!C*My0dAC&touo&jyB-5%vXdruI~nzpVgpx( z6;F6d1;Kl*o>zVs&J->Uk^(%LNMYd z>Ccl$xZSuf9hyULYMyalkA7>E1KU!h_VS{EUqHD13#fLolY)I`5t**61(UMQa6Pt5 zQ#pJL?q2jRre%+EQkyBv*AX46B0nW_RKJTsYYc^(b%r2aET?Z79iN0+e%<|Rgr4Z= zJ1gsLoRy-~S)n7gwmh9!$$kaY9nwJlj3S_9S{y8>WLjK5N6Aha()f_CB%iIIL7^(9 zL_`{#vT->tiWS6@$Vrx-#8ZO$ugDx9WZ&OKj{Opz_dQLV?(D;7%A=$DxQnw%4gEz) znW5*S$N4cWvP%PD<`hlIiyfbi>`6833P#D^HMobY60*k< z+(>zkCkXs$$$0oQ22WXxpUY8y=vsRos$m#p-Z6BoJs%7*0}3Tu=VKN=<;AkL-B@bi z%8%>SFp-ld2qw{8O%~2}!fWC%u_u8a%JWk zUpG7aV2X%+LWn6pxAdA!QPN}05ZXb3!{gK6ggJ+NAYEtGlmnZ zL1zDKkv-jpmbCZ@J7+65%u)^Q>MCq{IaEkBbm&x&cW!b$Cd7^0MwqJ7i>xtD${F0m z5t;yn8W#2Ab5I=ysm_(KiMx)wtKt#n1XA3Xs%|)p_=N5cUjHfy2}tQ_SqZ>@NW)7i z%olrY`UOyAdY$u7(RyU)k>d+yWn5VZ4J57*B;{EJ6IY%EOI)6!M_l327!0Es{J3I{ zfR7>$Z~#>C+|}B0B`WsbuEI>Yu5zXolNlX+ z^oEB^+3}WDXI`nglq^rI`%ecgkMAI@ytzrLOsrM@iLEkeR{w03zdBNt*X!f(!>hak zLR61jUH_kLCUiwHmblITm1f#Rr$eN|oq24e;S0YO^J{f+59ipq{;SWT-~l56zIRHn z40{*LJe7V8|2-35q|5PpS*?tVX0e(3gif|GA02kn1x~$&{SpgD|G0`163FEZRR6e2 zW*{6r*89g*a!b{d*loi=I#QCVF3AS(DHNl6sPi*AGEOo&7BEaQbn-0C?@S1jY>8ao ze~SZ`whg$==*A)7M6oFzlrBn+g3n_$;O1pc5X*vC>=TRKyxy-;hTgAh?c;s59$C&| zQr6ugD?>$`&nnuasJutcR6qlI!lyy`_*RBDr@5f_Zd`-%ylK#yJt3KUiwFAZBPZqI zH4NrS83o+Vi42u8cDRX2#NKQOaJ|XIoPm)c^%yOb?z)gf&cMi-+B8FmQ%U3uj9F5T z)(CMLiL~)+w6T|9PSZHDsU`)x>t^u22F53k65Wm(eq|J-EVpeYzV@z%K(v|6S&P|7 zLoS)f)_`F+io%9YYR98S>BMf>EIR|Lh%GRA3dLGEXG&%lV=eNSy>ns|pL&=>gl@wW z^#1L5*hTt7YO^r#jXS(WYZ!hB1}`y#)fe4)t4v1ZjwgYP3l(8(1JHznuHpz%*e3`S9_vqMZhWFSb6|9{3u}Z^v{zw|oLWY6Y*@hKM z6;)J0R@9Uu6>3CXI8s?zQO9IOT{KdmL9H$xsVs^bx_?m-#oC5BPyYVTr+SHLKsx^B3lrP3S7K|6P{BzN5`6O<_0?U-$X66LyW^Z1p_td+ZNzF}sS z+>S=W%=)-(3-NVm=)olvz5xL;%po&n_|cUiSB&!*C8fJ0x-#U7eKv`_E=E_+V@x#x zB(TD&h}B57Sqrrt>)66tq&(J0E|H~MS&x**I=#L#Xr2*TP@I&0^uDJg;x4WnE5&zQ z2vgw2NtcCCX@A&>qF6KRtRVJ>ot41p1V8QlIkMngEP39uJ=VcsR;%sj z`I`~hRT1u*d0bqV$-YMvb{ncUT8%3=o25LQcwP=_(Vi^VEPw5|N>i8>upL)Lsy=L^ zE#FCg)1|T5^%QckjrGdHrhqrm#l)K)4R{k>Y&P^xJ(l&RVN1SPY3`sMa4@_+>tEPM z8tT@#_Vs<81je^L&iE2ee1+dxoCE-Wt#2zUiuucZTUk-;y(;Sq^dkxd`qlI!3Z?mV zWJFkbjc`vE|)G6L{3ubf^8y%#-t~G-m4+*q~>ntOkk*oPvgMEJ&BEI zBN`XuaoJhoXyawzg)F#C`=+#)GfDywH~d{V6F%BXjOk{l$F=N-+I_rR?uIFhu4)k;%{ZE0YpT|Dm?~yIvb2bC1a6 z=lhjO3EJO!Whmi5FP9y~rDayI9kUWYq;Ul#R~|dnTKqIYSSiE$Y%QElr}rmBPf~DH z^cV$&;lu@ufSf4c-2?qn+)Pe0BCp8|gll5|%?2G@3i~fNXyXc4-fxhC^Sz&Im!3C~ z{YI|2>y=B?lNUT0*IS=sjZJSV;rmwCL9UGV%$C{|SetXam$mt$fwegY;K}5CEW0*8 zVxOsqU7QqkT(xnhEX*Zr_^WaW8~$9!j|sG{Ecs%Fp-PO(`MiQF?l#jJTP0aoi*9{iIu&u)k|NviXt8n}u1<{;n;c1S8v1_`Wy6 z&k(_)gUVMh}nOth^?eox3Gpm zH^ZYZIC2rH$&|GRgCvvOwcP!rg-D@x?%Le}%08j&QAz=MWj7)F-u&#F1YX0E2JZz^ zzuRdp-y-rQ^5L_n0Z_Z9R`keqN6>(LPpyz<;_A}%xKC!Di_}dsX$M^IYV>yi3q@aU z)|rrq3*cO~nG+}-I)}UtM>+MnR(1>dMY7P|7jofj z2XDSz@|#F93Z6HTf(*ZscWO@Fyl5=wXAHG_HGb<8CSA-Yv&GnWUww(>Y~Y8f22}28 zqfGwGO!RrwVK$pWH;@5YdRm!<|LBpZNgJcAiHDpWQFR!hmEkt^m<}Okg^eOx7MIS*FYXz#M9ZK-=M+uBu_>ea2=<=k|*?vt1A67#$3s`-6iMe zINU>)8&MDSPG2t12n%{oMR^!~aPbN?g3pqRl^r(zY@`f7D`u*X<7-y)yyyvfm!nL4 z5r;EB!j#?fI0A5J4!npd=XFbbOwNDjfP_O~mHmnYXRy>s-#pOCWd)f1mmbL?N9VMd z%zJC042HL5{(dGF`%I8|o+F34{OzT=#AAj<> zHso-vgv?YxF~3}0ocbm8BZvRaPoJ)`4-0)hHSp=Wjvf#?>t*PH^|(G^l_N)|{ln!@ zTJ9W!nqWo5Xama);tyuy6b@nt<(YwCTzm(Y?#`+y3d$cmE7?g(StmnKbX@j0-DJ^& z{$1=n0nQkPf95D(d0R3u8|C2*IM`IZ-oK)x)##du1Pw(O?M>9+izWxB=&$$sXAUye z%KBghj>K+EdJdW){ze`y!12jmbN8G@$>DW2Ea&6o72X&8jS|b>kLPdj?iIN&ZBC%( zAz1i#ak(lm{WsL~U?U@i=aFh{P~%^?G@b3oi6u0nvdT4dD*zMK#P?)m;EdmK&ckc) zIiGi&8F(xsC1@gOTLpazh-0_o{2r;@g3bbs(-6nm02(J5j`I}IZb5fWmwq%0Teq!m zLW#FgZFeodg6=<8*2SVVe(G!QxrdnQVv*V$d=fsbzX%}973Do&B(TG#WRjx1{1FU) zE#F1;m0Hl7CzaeMN^v0UL;KQnJOU?{BXEMG$4_(me*i4;9i-s&^i_OeyGn+kr~l+J zF$x!nqO|zPr~i1*9RheqSuJlOwel1-V1Y&QJzMuVJW~zSx>~-o5wvEP@q{%{({ofi zP6Mnz!2ft{#jkrNtQe~%r}rIb9p52I*ze{-%J^YXDMXlS`&gUERMS6Uh~}ON;L_LGCJGylhQH~+~4*1kU}|$+?(L%`z@3bXsHb{#bh-J zjGyq)1e?^llcn>CqfHfJGCBB`I^$Uui6OZmBQqJi==^%S+Gj)njE#lZWQX**H>A(u z>hNmma~e-18+c6J88pZ9s z6U7^(@N~goy7drPQ*C_HTQX9T#uQ)4eM06%B$D}XiqiXq&X>Lk9k1XSJ4{%&q>ddb zY?n_SD(nSAhbad#)xCdU2d9pwCaX(&D%c`${*s(9`c|bqJt$K^b`Uuzjd&;Y%TwG(Rm?fyLxTkWa>Vni7 zqQ(|{U;+o<)z|RSeGV}N&)nf{t4x5K^9t(j50JB#oIV4tx@8GAtvE(aY(pNyC z>Idabl?U9&K7UWvlk5F_9yvcLS&f&LxN_?lSDztim?F3(PI`6@P|l-Wl2H9}Pp*sb zAPz>(KEi;udgQ z^X7f>HI>Cb5VT;wzq%|%W_(OlFucaJz# zy$4$qAmbs$5fWe9mtf-lu5Mv*pvTbsseK7alxzK_xLsiMWP?WEHjU_D8VBZoiq)|z zJe=CC=lW4@=cEs$JZhOrh%LGffHj*!6;lbRooowdQ>YmZBxxIY02tS;lAX-#*4Ds# zlioq%s+qhjB#)Q4m9uyytD*|sj%yhlSt5w>iFJ?JWW!&AId{@9%jGP=Q~@iQ!}uE5 zF2chNaxPZ$`iI=yasLA3$>^2t)f?6C`IB9Zg5O?*fEM#gB1oW#M zyw+gJqhDo%vblKt}F}{PJc>3lQq$Y(A+g#FIwl(vjv$a+BcWp&$B|T~_jhgbWozNn zy+eUil)29%!@dNCsNmk?={f&rJy6}RvlM#kqfTyOJh42{g!3X`T>rwS*+eH!3coAQ zTO@_wm77)AG)AiH?U7vkOif@L>2q35WBlLm!`T$-RO9J`FP;c90T@w{_dWc(_=j*8 zpG|{C7AwVj@nA0r+Q`nz4{OUL+dD<1?;gC;!uOc}#Agey`8mfe$$9sSxLQ=4Y(Hia z#PE#{xzx!*#TGP6vAh=w74L#Te`SJSo?8KbN1vgOV^Rg*rH^AT3!Y6MSI;g5QopB< z@03*fICjJ+3y4mv)#8K8+4{kWJ+y?^0ig&H*(wwTcORO4NTk`Dl@1E>}s@VY1NZCOR0$KNW>hz^H1*_79hy5 zFF_&y_X30-z9b|-==kJ~XDi7|3vhK5c!U5U{H{DTmK1*1+by{yK*-r}T5i_l1_-`1 zWDlzIuCXDf+vGN_+OkZZglT^F*zltuZ`eD)0Ku`4Bf7lk1znwEINtRl9?4PLt&-Rw zWhU2%rtY=ah2tbDwV65DUv9+#I_FWT&CHL?=~;LRMP^5vDTUqj7L3kYa&wiMIhf5g z-b}-6u8BEyKf<^tA;WZXMuDJPH)*x0=k(PG8MBaXBLbOoJg|lYgbd@NBZUm|>`RCo zjg6@A?6nLTwrfvcjgV3Gt|gV{lr-HN7Ba}NFCjt##rPqEaakrYwUZ>gYRF({&W4Pf zXEdfFZumQ1hj9mH*i0JhfKDdhB|uyUd>-E6CH_KAGsM8T@io4KpSlkC6qx+QB358- z^#I?+T6Y*8&3vA>4}Umg%TIPPQ((l~jj!+!e5QmMvqPaA5Xx)BU4241D3p{?`h`MH zGojU7WJ2*1nvmP6!BUt z>Gi8j5wFGiTEEH^@mlFWWR@x7wOF}h(9|g+1H4WV*={;TWNInKM;%f*eCm+O;ZvuG z_7;5+J1}KbAq|Tn$at?6AUDy5Exfn_WP-l}{F-d`$H)jYuxX>$&9FUE@ZW?o0+xS|&Z_4IJ}@!ewYGA$OYO;RgS{ zn_TKmcP$hia+-$KT#W$=aax{KFg(na^vLPTwY8)?r|8P@fR?bqFC;}D z_~E*;jbF`MnWtwdSpTirzoxG|0vR#ke{xY7Mv7}%B0Cw zIf<{4@!u``K;}ng%M;I)49GA248)rULd|nAuGuz;Z!eZ+#Cj_YHf!Q!`PdrNY<}jmft|oD*ix0&McfR$#KRA)fqgqvdZP~FI;wkV3O z4263M@|vtrB%BzK(JN%j&#g9h{V&417Lc6vhH}1gtGFhqHAX8LBjJ?>G(zvXqgWK9 zkw0t7u}zU)R*b)yhhG)o)aiC%FGbD~*B=mpC8ajH%H4`G4hz&QCm}@Z6Cmaz)JK zdAt7%U34PH97dm#rgATlLK;}e33bV7l8f`YaqjfhjU4gTu{7+Z!3W&6#JxAe@;OS2mNNKC{!UT4Q<`=+sJyfiOziBve<1Eoq3Ai z2vrqdnoD3QT;g`EeE^41ivipE=L z0j!I2f}h&dZTF~4rl2E6 zgEHr43lK-x`NmP+`eRtY&`{U=P0Z)CQHKY*Q#kv_%S!#KVF)yxTkirbLtc!c@ogNt zohXJdf4UQ&>O?Uw!49`fe&Au(PAaRK6uZoFq{{mb$f^!x-;@9mS%| z635t`4!;D0SY5H{0y<3d*tC{DT#1ltU)(EYbA@Cof!Hw)K_R|_pAHIn469)+f3KwI z1poD&{_|{{eNOY^^&2panr&!b2q!*7vyB|>(KZFWWn8n{$t28X>K?z8W;0VrR-j^1 zStZS8IMS6v%x0K#%yx@4+a63Lht->ATg+D)7aKz&oT24tHrT5;SzC+|L^VDiG0^8!nEaM?(WRph6j_jeao24)Kon&X;P&Xek?4#Nr zwY;u$jBJ$Ap6IrBvcL9jfJX#oOlzPw&arxM?TtMGXWM~hD97_@ftfmwzHgl-N9kb3 zaeTSCc8SyVs!6ua;7dl7^{%% zK`VX&$1dH+Ls$IvqHK{#D`syp75Pz*(Zr8>Szq9}fBgO`@kA($-p?0T73mHZR7{tL zd@QfHQj8Z0LKbFi+>ld|S_a+$e~4y?@0y&s0g|*!!hlAgycH`TJl_}SQ6L6;3e=#b z0<-U%pX|S2KJXil=H{&ZO`+hc(jy1=Mh@y75dRrkuBis8ofkP&<5k;V6b&`y!Qt=@ zS!{kwca)bj`}LrGdN2bNk4RP@a;vbMLR0p+m8H^@{ci1e+X}oz5PZGeIMj-Hd*m&! zJbs5s`6|m;345CVs+4Kivg!Q?Ett}#UJ!J8q(Aho{jqPVq^S`VqB8M3wg=R7xKzqJ(9<_>7?pz6uwpATYSfO ze2&6WwUdCo7=22cN$kRIWy--!E1ck6eXLNx%oxJgL$eGz{;=0WhZAjNrg=rVKXF6U zT}zy6Qqj`aRW^lu(}}*m*7PBBVV0V!{y1Y{>8gotqKPqvL<3x1WPjB$Ab7RCB6cbG zTeptKILd!9UMTHp-3k@?FN3%dYJJA09s}l{mMwm&jUbHU{&Y?jW)I*y)j%g$TZM9Y zCGm{l@Q=jQhUrN0w*au1yPA1mDt02g)|c7%)sHsh#RIZXDPLB6O@)nz&4kP}rAV`x)@Aazpm=HfHS$9Bw`7Yf4Dx@VN2mR$nxczy4uRe%3?>f#qJO4fw zyD0p{vvB*@K;RROvhu4NH12?3m*-1l!NA|TvZL5x`hwxX4}Ng(#EC9|qW;!g^b}T1 zrk$8gAyUz%Hd5(L<$wrAst;M|LkHIr5QcOBIs_%S)Cr8QyJ@14e%shf)C|IbMUN)} z9*%d9cJMrA2R~6UMsTq(nT!eXqsn8Nuf)}9h{%gwD&_j&ijM{Cl?U(raHW%ubEsOX zYbH{)!3%oZAQ`vYL2>I+M%Fq0puZNO1YMn}rciEK9E)F@egdly$rVW@t5YTw`?uEQ zSk$jUetpgfRkTbYEpNyu5Kg2qQu-Q%6TA84vLY%RPW%vGR3&>IA1c|lMZ;jznWh@S zlD!+KL}dL0rv)qUZv1YZM@|hCG^ZH`LcNQ@iDvTVGo26evi_!&;zrKsyu=z7(=^I| zFu-r@Vy}~#3@Mui$o3V8{Z zg-OUhxqjsL2&V~0a5VUhzK+A3YBFknoJeZQJH)c!q?zy#Lhnr)GqRy5++MCB!8S6V zew+lF2w^P#2);m$T=wOU!3}$X3oqvjx9^{PoMmr#7uFg{tZSDr8MoxO|2iGzpR+rjL&s8_d7ew8F(F!4}$INM>kN6=tb zAJJW4UuzK^rBUwxv}a@Ipd0d+ZJ=f{9^)nkHHj)`_92W3Bi}NZUPZ&%hxn5*|rBjy2tzZ(c$V2&b~!-iTw~#hKy=f=@;G*;3heXcMU+c=+yilNrS*|JC|v#WkxPMD?NtvRVY-Wlt?`Gw z;=cS39+gRZ=?HG|)w%gZ7aXZk0w!3VdE?J z?q!?EPcgY2OA!ocD>=}{dx-c|U%@D1qGMa-6^!pdi)fMJw}CPH<0FMDz>di3WOQo6 zuly(0UV|^j+QgYvq6C$r64L`pM3F2?ETuWx8u=9p`!l++bQ@0I)>7h5Y!TpL0^-ah zks%W0r;)G@(@J)d=FgW_f|EM-&i5N=8_nXZL=B2spAn4YRs6MDyfpwRL(gG)&qhWa z-0NBp+TXUy-6PXN;xJ*_ong-XNEFkd($oP{q^!!Nvl-pu0RLX8|eNJg=?43=)wE|!L; zGAvRUZ5pFTPb>3D8WlBZy}uJ~ESYD!vSyJUGVjaiRAPtP`R<7!;79Sl^JRYYva8TU z@XkCu>l99q3<7@Qmgz$q@D$rJLmM#TZ;byBTMs`xgt)jzV&oBj*jp+JU(N1E<#VW{ zf=B#U_&)#T6&8*fogZYDN%BZ?>ymw~eXk*fQwKA+C-wKZe22tV588vn5C2KSG4{$A zHX9=%|CwDRdHD-GVNhaywtiTsaJBPJ^m34mpYgq zl8bU}#>_+6tbwNz5tA`jldu*!0RH5<^-$5RJ2-*}J4HdO9g@+E%P0R8621}g^=AS` zW%w>_@in)t6ef|OfV=VCVU6ffSdii_I(2AK@>mzP6 z`zPyo|L0&ybMU9sDV{%>iWhiHQz6+W3@DJq%xLV8SU`V_Y)%If-8;&re6aonlq50}7p zEM1;mI(+vlc&H243-7n%dO9yeYDLEsAUm(X? zD<@mX<>LT@J>|tvXeaI%=(T8Ed>-tPYtgv)j8vTW^9~nMO9e4?ydb7d1VR)*>V<-s zI!O>yCu=I)nRewr*;zKWlc~Cc8S5DR^>FrHe-^L>eM{QE1>*%a8o!D(aX5aD{~o8E zn7k2#7~dvLs|tEMFcvn_J^iJ%{=i`Fi$(R|xs#7L(nSK^T@>6A#=;#OrrQ+ZG9bRn zl)p0DnWXS`Y8b231z2A65^vy9A zyQ??S-YAq5-rjRpZ&FH6o3sGzApR>1vUB#vZ@_PU0nFMByRos!(8PqBoLvB9Hg@8& z_&s?bYg~{I->J5#eLm#Hb(<`vi`f7(<5~Qf4r#!KVf$Q9fv(#g*97u#D|u3|0DmpV zCpY&XMyvw`Bb)tCze+V~3|9I!K+{4p%e)5*e9##k2MXIb3T}tL-P(ybWB&w(NE5gEN^BhlP~>|)V%q#5O3yxC`U+-E zXj|O!D#BFO6wU3zQJL@gy5*&AhvI#HHSm*X^-#Ru)FYId2gMJ2)qTdxhA7VZ4!D(6 zygsWqeoP7zyr!wVo0T2bvgeepTr0-42Col$3|6#~@zgtyvcv6_@MAxSI@mYSD5p1) zOe~hJYH+T?V<2(4NH#t8fRbUpkvPh3rkLulsUAMq)ZwJ(p4rZK? zGwWPRyt_b%{%lgXgIRE4E=&9WA%Snq_Uo9VuD>FSU7t7<9Ce7rxvJV9??fvy2>mnFGzUF<@W9N)oDCwhynG(GMN=t2fBV+1yFRy}1-FGp?lj5hbhMoagz-`7uGa;Paz` z7U1*4_`lHk6+SuBDsg^;&+~+q!RNU`JB&~6+jYn`-ou>h5X|Dol>VE@W zDN+stRSGIZz~VHq#Nki)Xx{UHrU>nFpbG>o0J=iZdW-mTMCS`_E6^rrR^l82qBRSh zzW`}z{{*^5XyY*Jtdbn#fvy(X$APXA+HF8*33?DHBB&EcrTjb4T*>iEAgxGD>geE{exp?w5MwLcF?b>0L-FDr4r1*9#w+onzonH<*xsrGjOY3nZo`kUna4p2nU zAs{W|n4=wM7HEY|DUfP#CXlZI(9M#18<4j7e4E+?^a)8_0yGb(#Ch1Jego+5LOXAa zDfcFzI-xZI%>*iRmIB=*=s$q8+$Vvw+-HH*x-S8#b$K|k zU{bFEQX4b^sSUnpQ=bRAQ8f4^klNrkHuXP&RF~s0_tA1c1f=Db0%^GufVA9cKw8E; zAg%AcKw4j1V0UVzv^bDT`I1GOfodf6`#@UrT|ip%JwU2K8c6g021qqH2&5YP6X*s= zDREB6PSW)v?@ge~h4wEX%{%s3gU$i^s-#{FR4qBK22$-m38dQ32U6{ufKrHuZNv8n6Cj z`SOYl?PMS=_f#M)cN&nEG1I2r3Us~He4$N^+0+Ms)XptH^F)Ks0?iQgQ=r=g9RxZ{ zkaL{zgOh+%gKAtPN7Z4 z>UOcvJ`S`p)S- zQ4EJ{5j5VSC{Ux&+JRg_KL+XmDs)}}`n1q~1N3h~%UIgzlW?RhsUHGr7c?FyE_{=L zG;bMDo6xSdv_(Lgw;f3Hc3Rq#mX@)!f|D&Dkmh~T(q016cIyXHpBx0z{`PU~0%|Sq z0#bio3*?E;Uk6$v=%A(LVfFiv&`t%?91$SRF&F5wl6nhvqHY2zbT$F46WY&!v`>HF zBaZVqp`8tMi=YKS^8|GO>6pCM(tZK70jY&f2IvdIS5#_frvoYNW=mUSY3qQr|9;J; zcH7jqENwKxkxDrWNb9y5NWJN^KpP!u@I@f?p|1d)16qmmW1ufe>ZH?kL%-0O3baX5 z?*)RpA#VccaY1W<7D?(xo4VPe?*n~VQg1)Q_~|1+D&;>c`kqB^SoB{&2%0GEPZs^n zriR8FKPUtGj_}n1T`OpzMGsl@9iVSZ>Mwwv5;R~@c!J}6OK2AWeN#{!kV;+wR4ufB z2l|GfZvj0i=x0D*7xXsJ*8~-Q)aY_5(9=RY-=YYRYH$nC7D=rKQtg)ksgJJ$(l-Al zkb2k-po@{C#5oA`RY7k7seZ*DGkM1WY2M3#H17-`&AS{(^R5KaypIFH^)D2VzRO0*`Xr|D9 z1++s@21w;iMkTbgX+Y0Q>i2;(bqCP(LVF(QIYGODDh2%>NXy7WsL(P_0Mfi?0(}*H zCC&vvYJ*3Cb_(r#7X23J3ZWHEGB!9HXuHsE0s66^6+k}{w8qjl0qq8@(D^FRE=m11 z&`Uyl#?qbx`ian9vb0x$UKH9sOFIbkg3#WwwCZzAE$0JiEf)d(Quvx}>Ux{{2#~hw zf7sL=HuZU+Ur62;fz)?@Y5Cr=e1Eolf46)ggp}7L?^qzU{dqvD)kQ#BZiP*qWm7*1 zq~*>B(sDm#`8q7$XDr`(%lCxk`=RCg5s;Sl640xn)z5)m5%f0D&w)yu^79;LkDwVq zKa8Qy@N(qqq-^YM{D)M#!sjpplzT>PFS{=~qf?9xdocVVk z_3`Z%?YHPpK>J0P4_#oSOa{_Ey$WcL$lD2|rS$-*E(d_L75)aKt#Hy5!#55{`OXJY zzA7N)s|WgolzSJDN`BCyCoI}&Q4f&HJN`mktdhL5fcA=h-?3=SMTYMrAg$XtAkA?u z(61%$RX}x;cMgzhbqCN*lDYusRY6ODRLbXp>LkZEfHcQMZHhW0^=F0$xaixvZEME@KRoC03=ZHu-6y(y*r z2ncS8)Sm*OQvs!b-jLLTHuWu=I^|Nw`7hzCvgkpe-${;#fc{fZ7tldL->|f8K-UUw zH;~%2*P>I)jEB_#Y3l73MJ@URP#>g}IEB+3=eL4R08+`P0c{dmuSHK@X8O#S%MCgM zNIjmRQsZq}EssbXfROmi88qYCnFusu6TdL{F?roN++f`j-R! zK~irAQhDD6Qh#{?=(kA4UL;VbpbXIW1RZ~svCCMXT9Goz(q>xp1t4vYmw~iB{tHNJ z&W*VPB5x|tAwgFIseYdY(!AY3n)la0n)lB@n)mW5!xsfozRv(D-&cT??>9h)q>TRt z(lTzo#^m*YH1Ah{H1D5)v;{8&yXL(TNb}CcAC)}%I+OPyAhq8a=L5MQ>Sj^7SU~REuu6 zC~na=Ec&TMzXehojJd(o{DVN+w=M?ytJM5DAdTL)18MYb1bSX-`2f&ys9T})4A65z zd&Q#PTl4|Au-av;MIQ!It9d{v$@^QNx1`)Ypkk4H7F<&`y$mQUv}HirmiGhAlN>vM zj+NBNjV7AS1X8VHK*vbxr-4-7exQ2Edp;C-8mQ2j4x}1X1Mvj4(3ubP0YN_j(i}xF zg-RZ8(KL%zS+oNPE(j?v0L_!q{sA-w@-Q!kY4=HL2arnsHP9a6tN(=K94+Op0aEQ> z2IAR4q4O`Gp9|k5H=ERIAhkg=kfweC=qM>|6HuY#eG5oy`B$ITf_W67>UmRnTa3%6uu~Xdsn$E|BJp0BPRqfHZF{ zkmkJ^Nb}AC(!6azn)hKK&HE)F&AS;$^L`y@w3Pd8Ak91aR%4+Pfi%ZUK%>A{;+%Gy zvB6nDd6Kst=<8CCuK=kHVzW(awF5cA_ozi*0oo@yz5%2y_;Vojp+i90zGu!c^(Y6@ zdRzshTFn5`dfW)~j>ww@r1eMw^?_F6d>QC%N!VO7;N}T6`&|pBX18Ky33rM9LJI|o07F`bXJaQB|w^`bQK$`apmiA>J zt=ls|TDO;N>K`ro8<1+cyxw@kN+9hi>n*JdNPEi5K-wOCK)-dU{l{)M{&F#p%3BJg zqrs~{C+Csx);sWfMnHwmGK*GQ^cc{IlKPBAuUK^ad{agQ=zx^l3Z(Kj0cpGa2M|vh z3!QIT+A}~J3HyN7NZx;0G^N3Dcp_QiTn02w@?HaUuJGLg)Fh}8h%XQ*bfQ2}p>^JA z#^jfPv@QP==t9kVm(lc(Kx#E!64ur_6G+>r97x;fDj==L3?TJC-gV#;_=V0aAhqr) zAoavA0;!azfmF&5fKQ?C74^)cO5@$8g7@>7qw8^5c0Ua%=-v!bf&jE#m_OeB3i!wlbR;R?NgyA;`-vXd7 z3OaQm&XYx}j{==7d{+aVgVYjd9nfh)`wyVAgzsBGXA13Eple0SUZ9DRdeEjGy9jG5 z;cEd>`+e4;$1VB+kd8Aci~ecR35!kM2|yo{GR_534K4#x4gLtEG1ggPRv0e>eN;5~ zz*56^F_4yavqhh^=qZb;K7}(^DQy)HpRp`-z5)bigkAc8&Jf9amKn*TmK(`uShUch z)fW9XkZLsvPN3S~45V7Eu;{xM{oJAjF{9O&fSwlHKM$l@h3+w0jlS1Nz6eMqf5M_K zS+v8V2`kV;rIzOcsUO?`bdJ>bVIcK`gFrV)xqr1Nbf2MpCn)(h8G-t`w~rEV>(Lis(TI2Tk5J7JU||R^+_|^jXRKI*>-B-xG=Ce*(=CDFrP!DHJr$qAP$t zA$->XsWt8bsuR9X1I?7w&j7*U;a6V;;#&eK4eLi;?>457UOr19mCK-YnWxfzgZ zbxNCQ)!TuzRa=3s1t0cCfV7PUfUXgm7dNzT04Z$%s7fT~x0`yL0d%#{&I8iYrU6|g zwCjK(f^Gy-Yuo{(w*R(8uK`ULz5_rir7&U2_#lwxxB^He&jPwqa?Ax%$)5(Q6x!#2 zRLUkG&9M!rLQ=bdG{?(8%Iu2 zEi=kBz8eNo?N0={Mr<(N(k=zke%SzY0pyi9p8}dKlJ5t)O=u4RY2CgD)F?Ln2~fT8 zy$YlnoVpt8Euozaq`iAF&|IOdw6uqSJ}Hu)0ICyt+kj?@em?~Im!Mw)eMI>F476AH zZcdsStpK`RQa=Zz_4qE(DU$bPpsA92(i*I>1)T$QtDqS`+HQ?NTDOOR_DC6z0X;8L zwgRbsKLb+zegUNV4FIWrmwUJ`0Lg_;4G@-zK#dl)So9{)Z={TCKVxciuSH)5x>Kb5 zz@k?z%6rJb}i21k)y=9 z1xO=OGmzS^8%XW8_BqjDHIQoc zW1v-%;~-G8pnf1UJG43)!^ldZjRWFa8cLi?fld`Ew*YD0dw}kj)J+!s5a>Rk?XxHY zgsB9i6n)O*Ca7K@ab zKx*;3fo4iQz5}FM{R~Jgv=?ZR(Nu4IgEkJETYX>@8v^wYW zhW0rirCs&~L)-Gd>be#%DXJ@d0iAVyqRyh56*DS}u1ol)XL`DOqK2L~6M-40hlehv ztm&!gDe3NNs;dVEV}f4{LB)iu4+K$BLGcmA1QT?TV8jOriNu)IbzOrWN!Dl7T|Q%c z?f&Q7s#|rtNqzLpU;jPl+;i_e_uN~L9u%5-OR#^wK%x79HgIj*fYviww?6RYgbmPO zZVHg>zw?0_x!z8obzC|ZXg*NAxD@DFE?ok2I=B2*pqp9Fxiz@!yh5Q>3S9>z`(Q25 zNvyjc=qA>E2}pYIF_83N;zl8EaXbQ%%8wibuR~G@@z;g3}{*}?iK;LI{ zDbQL*CeZg7SwP=qWCLB#=sut|jD7%g9ivBpu4VKn&^3%616s}K383#VdLHODMy~@A%4U@F9rH1mRkw*LvVFs4bVBv-34?uqn`jh!liqGwlR7IXc1d^ALwC5lkdcP z6pWe_nypY4NUn|F0{X!O@^2^5os3=qLMMTH3kYEj^dS%?8qmbMgt(REjt9D((HDR& zXEYs1>Ly5zHM)TwZrZDI5;K${tj0m+tM1=Iom>ckB|ccZjUYygt8=S84LS>tse zIa7|>99&O(K<{$ft^|6Nt!x33a{H9rdq5t`eQ8UekpPk!IUuBW^yyNdgC=GNx%XKNa zKA>N5=^)TA8C?wY1(y4ok{bou$E5|JUodikrn1~JC3h9j&$)CJ&|XH@0ez9>)+)IT zK+kdM9YD`A+6;6G%iX8segyOkm+k<1n$Z(Lr?TA7l-xd`JzV;0pr;u9J5U45{il-q z1JKX7^evz#8NH|E4k@|MfKF%KBeAId9iyXxcC*HbK+k}y7gK?L%G@*{8L=~f&R~rg z&@L`b0ZENcpeLBS5J+ka0{sJP7(g=q#uQo)w39Wq0Ll1!2Ix!d!Eb@2?(Y=(BM=$@ z|Na+9<~pot9iVVDw9$V*41n_~oyf*%@%jICbCEbO3%}F21BkK`WM<>D1M+L|dlx?2 z@wp$LoAGJD=Y5oI!sj{q;Cxg2Lp`srsDJ3aSu6XV>Vb{64eRN640czNZU5L0JR5Zf z#~VReS~839dp7$k_4m$_zyD*_2p@l(_0B~*PXG4X@6P(=K04l!`YT7I{>m}`_sH%~ z@B83|xkLTF{r7$SKjA!`77gpWxW4qmQodnLIz6+YSL{F7CDNyL!}eFOrgSwoH{Q&WwK(exTZ?mM!CGwE#&BV2^USQT5cxH8*tN3W7@L{^e$oV58TDi4 zu<4mTH4(ojP58>+=o0em2>ha55X&${bGSic&cPY2;GxWyaYjeT%*GknqJvnuzKcl= zeI|#K$>cB&DMPuRzxJY-Zv*Leu+f40^dr#P2Bgb8Rl~eo!@LV7g%2IF_K$&dJLH}2 zAzc&dOiK+zcVcvz3>e+=NR5nJ!_bwFu0{Jl-SWB`<}NULyS9O$b%~CNVy0)&?NmOf z8z)Wp4B6+cpd!CSW^p>1BpUqwq18|x0rO4`^LY((vg}+a23r3JW*FzvveE8%gO*vq z#?NP_WqJ}#crhsrhLk4>!}J^*NFITmR?V{1O7I?3YLWDXnhY@}m;}5G+vS3xT~Wxa z1arN{Tn~nJilNM{VB`__^9Yy^HJLqN&c!FxdI@J2Ys{NCTc$Ce;Or)iIT{1CO)*Bn zDr8IJRkcrt%qjSUb)|52n#T0uEcAJ%8zu!B{z((U@eJgq4JK1fE%JE>{0mZ%Op>bQBdBXm4U+{k1sD0D9Y>Qf%AQ+PlP73IU!;>-pKEzMHqzUKCP}BVdq?I z2*XxvuC2W#&QBu3+8?f!iMR54A!TL`mCMu;Ixtx<-)Uae9?!!LnPM3({urlkD}T6M zh{L$vu0%6G5e)sQCj&U79qM@-pPwV3WxEW|sgz2VE2V-l?S=Ry*vd;8s;i|j#!oH6 z9&2fAouOq1Fj?SV1)AEHG2P7?rsI%$*w34@PgrrHT<8)400~=GZf$cCG}|r7^3)EK&@Q zX$sk9g0vwM*gDAURx(E38naYx3F_Jkna`9AdGIl)Iq$5f)S7=NR9xoxS%P{MZKrt<_E-zrUeXz~eN-_3;%(SD`P{$`F`sC)b4$_lD^U`$jGkYv z7yxl9Qt9j&Q9IMY$RlV)XASc;FdLN?&5I<~9lG--Mot^GQK@p?`%0Ad&H$b-g$wJ?IaK}CE< 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_team.obj b/quake3/source/code/game/Debug_TA/ai_team.obj new file mode 100644 index 0000000000000000000000000000000000000000..738bec21e323782d5ce387cfe8fe12ba285cd56b GIT binary patch literal 21355 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 YcnXeo(Iz)VtXQPbIxW6H0Fz7oH-jAQ`v3p{ literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_team.sbr b/quake3/source/code/game/Debug_TA/ai_team.sbr new file mode 100644 index 0000000000000000000000000000000000000000..6e90e9e795824f4e6165985d50c660832a6664bd GIT binary patch literal 113752 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 SEnnZ0OrZ6>gy3-nLGlC4;5kwN literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_vcmd.obj b/quake3/source/code/game/Debug_TA/ai_vcmd.obj new file mode 100644 index 0000000000000000000000000000000000000000..3e0cc8b02cb3cc3bfa414df8d124227ec5d44064 GIT binary patch literal 8056 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 RvJ=ZDwaSx?;X?8)^)E8HNuK}! literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/ai_vcmd.sbr b/quake3/source/code/game/Debug_TA/ai_vcmd.sbr new file mode 100644 index 0000000000000000000000000000000000000000..d53b05ff8ba67e7c14fc523b16d6f6f4517c7427 GIT binary patch literal 115842 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 QTs1Jf39hsy6XMnX03{{PS^xk5 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/bg_misc.sbr b/quake3/source/code/game/Debug_TA/bg_misc.sbr new file mode 100644 index 0000000000000000000000000000000000000000..52ae04f9b1023f5627c8d61bb5b077dbdcdee5e2 GIT binary patch literal 49549 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 K5+v24;{O5pF9nDI literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/bg_pmove.obj b/quake3/source/code/game/Debug_TA/bg_pmove.obj new file mode 100644 index 0000000000000000000000000000000000000000..b6488d65643d8ffba911db28a71819581d79e0ad GIT binary patch literal 28818 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 UcUtRBK?f4;Sk@Va%yszx0$;7e>Hq)$ literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/bg_slidemove.obj b/quake3/source/code/game/Debug_TA/bg_slidemove.obj new file mode 100644 index 0000000000000000000000000000000000000000..2a470ee2f47adcab37fc819f56b080b27981aee7 GIT binary patch literal 6176 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/bg_slidemove.sbr b/quake3/source/code/game/Debug_TA/bg_slidemove.sbr new file mode 100644 index 0000000000000000000000000000000000000000..4cc81b493b3c580567fa1f61f12b5b106dffff4f GIT binary patch literal 47458 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 KW>;0!sQ(X-5l$Zf literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_active.obj b/quake3/source/code/game/Debug_TA/g_active.obj new file mode 100644 index 0000000000000000000000000000000000000000..41681486d74421c24469f8cd15d5d0f5b4e6e189 GIT binary patch literal 13035 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 HsPO**jd)=; literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_active.sbr b/quake3/source/code/game/Debug_TA/g_active.sbr new file mode 100644 index 0000000000000000000000000000000000000000..6b92aea32bfbfc6cd2fc91e5b0c0613e38dc0fd1 GIT binary patch literal 74704 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 HP6q!E>XnHX literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_arenas.obj b/quake3/source/code/game/Debug_TA/g_arenas.obj new file mode 100644 index 0000000000000000000000000000000000000000..776dede604ab47a431e799839bc729257fd5722e GIT binary patch literal 7604 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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_bot.obj b/quake3/source/code/game/Debug_TA/g_bot.obj new file mode 100644 index 0000000000000000000000000000000000000000..b4799ba47f24cce4a190651e7997bebf8ef9a73f GIT binary patch literal 24235 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 ISl94B0hl^Fr~m)} literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_bot.sbr b/quake3/source/code/game/Debug_TA/g_bot.sbr new file mode 100644 index 0000000000000000000000000000000000000000..8d1acaaf2a4a2fe7f3dbd9b1161c976d64c4e6c5 GIT binary patch literal 77260 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 z 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� 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¬{Z*`Pz;cv9hB5u<#Dk`ze&frLJX%qa1O5 zrUN&~f7UuD%cXA1s3ls@$-t}b)A~K3=+os-{Z;GdG#qiYRLd>p>1ex$wC>F4M}({% z)_PtzOif;bn9Cwl6^fJ&_GgFK;u3pk|^@yv%HXJx+)XTyJ?sZxhGLkn_j`tb3 zkWnAdF$V=&PfoRgg!xg)#3vYD<$5TVzfYNTm#qffl~JFO((NeS8FbRmx8TB>i&hA7 zsjqFMrX}?KxCGr4sE2Q~zJ^}@#?`l4=VcyCsPB3qn~7kqimM;#JST;QNnh)YBopSzmctm#uD(Q%bK9!AeR7CnhkLv_S(>vFBE9gDVc`NCi z=e&5Pjj;2bcT7Y&p%i*7v-6-<vL~AJ*lTS-TXB$-N*#LG{a+5>Wzv2ZyD&d@w%})BBTDnOt*Q0HYZ}|frtEgpeJJI zfrkSFcy7ebV2_v?Y#y@65&YMTnjevY``3(qSpL-c5&ajRp2ydnfYa+66OGH0} zG&AbqPxs)EK0}}ib z5&cz4%D0p`dIogys$~)VG#$@L{Fojh#qs_Sdi;ur8MA67Ga@s{s)(MNL}Cf`T14NH zQtw9Wj_or%k~*fB)uhyNw(W{Q+s4&K*AS~rLwxQUaJAonUpSVRuz-jt_&>J!%NhH^ z|J#UO#kO0KQJW)rHDx8Ze-JuGa71=ztB}V~R4>A*QbvWN@(WoCzh&}^Kq?-Upk+yw zpaW8Sl8*AE>J!y3ljj#vX%4V~e_Nt2XVmsl5l9hLe^R7gc8uzmD4HT_h^9Ny3yxi) zQiVe>?d=*ZR_oG7XM$+|C?KZ&{MvpQ{m3J8IVYl|GWOy)7c>sHhmaN3eG?1!y$l&BExY zSh@%0T|=p+x%*?Ix|%KXUPkQfnX^$yR+4>TUT0D@C;jR;Ch)#%#If{#VB(v=S145^ ztPwkS&Qm`%*wPSxnVC+wf>Nhj`b?Gvy zI;z)-TTP7$1;hD#46A9RqVm;Dx}-_#qIz9M_sOXGs9uBp8v0WMTk{CC<}89E%T<%` zt7iVTSVlIPe6aVn6Yn@R98jy`>cp-qxz1hzB{V^NXoTQ1Ia5I@V*iOvi^Ab&ojIl3wZDOBm@gwS>B#{*NGQ(Q#2!Ev4f^ z`Be|ljbZ%|vR5u$V1xXr$4EEw3%rlhE3NQ^xDx6q5+Jr9j(^epenvgRmUQPIY8kzl zyWh;HXX(Z~yWBaR6Nh@9UL8>{&~ZRqLxh2(0m_S{T%S@a$hnfgtN8mWp|hfD4ZZKs zi$biUV{TNfr{j#M+CYX+`1>h|_2ugGsGK99lR;@F@TZq6;*}zf37*L;;bWA{QN7FSus*V+hI*wkn?pW*4P33AFq4A_#8&ebL zSQt|iWdj{o)iHgKq>m&g$Mmg9nWd1}G=`eNIzyk}_>8OHFff`*DzKIw3{ccS6WvI; znMHu3C8l3wxiCw%x^k(um~M(o;iWSv)y~R-yYx@xY?%|P5YsCq8r5AAQe^3KVe9>v zt=U{mE#tzrZJ*$t^Sqc{M*8-l5OBWpZ{NpA1sCw(qF*1ZSQp3i7b(4MA9ZO=_w6Iw z0k|&{H)h1EV!B@+`9u5l>l0Uh)K{RuGMh5OYcb7&(J*Cd!v;Sxf{P#QiL@v7F3rDfJw^&(j-Dsu$?M-1kIG jy+}74D`Q)c(vjlomII literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/g_cmds.obj b/quake3/source/code/game/Debug_TA/g_cmds.obj new file mode 100644 index 0000000000000000000000000000000000000000..b3a3d939d163be60bc65eb7c9fbbef33005d9ca6 GIT binary patch literal 35597 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�iiX~9MyRr5%%ib3WAF_hIVtdwjs5%p2XZ%Gq9^( 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

{#la(khrK1)rwcE)GSwlky*-_B60 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

ISyu}HHldvp; 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%0D>Yi(W!nb@@Buy~+pl_b5WuOB?co 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

S3Z7tTEFrf_u z5G zSP(^X!)FT6&4TE5bejTn^B{`$h2IpQ!-MGdcp5=;iy(?V1J5at-7<*oh_fist%B%C z6b`;qAiQ-EjMBk-3gB&uU=(j13gD4NFiHp)Du71`%qBGI zCLBdcjP{6nF*1P*6-bW}P)|SJ?ghI6*c_1FZfP`rAPN3I$&VG@F17ZowjQbNNyTM9 zhGBza9Hw8mRlzrRAj2zCOKd=5#{eNG6w7WzcAT&kP=sOS#>|E-DXstEb_HpUA4I~u z3JNoLU;($2a8&$5lg2r581bEhxbQgGlGtT1VJD`|N$)Cj8XE%aYUKgOaH6{j>g`zI zwgq2~3Z}D+qcEWgfn-U*`IkUU03M3aJ+>iK=|Sik+Y*X<5W2+(LRA8#Fq^~33!B|h z1gix!`&n}&7)_!kNCb}tV@M~0wAucTB{M-7x%kt)1gB!c69uNiu|6p?-#DU4CX-H0 z5x=oh#l>hGhi1M88Bc-Qr3m1(tskB2M3FiX@i(qJ6HEzc6#sfVgehy!<8U7)dziRya}Xs_bJcf4}N`+(jEcE zxA{wwo91)Y>aU)}oKUTY&=YBEZ8gb_AlAm`=E3P&`?0an2{#DV&!Rvz-t_ zD%_IEW38E#>Jq6KR5oay4kF!y(v*(vs4jA|D9tm4Eh3s1IhD6svnbLdBD!Af$-aj~ zuMlRD@eaOyr1}^K&h=nM6UW_qPyqu+O=z@!e%SDpMFMjuFu>G3#SQhH&>oPREgU+> zWK7gzo*Rgc*?xb@%n=zmxnr{6861Y3@SZ7ZE~pnMGFL>nqmg4uke^3>UoQ#y@xZ|{ zhf!ufkr^~}bc5iRBE-Xz6n1|R5=~B^!R63!K&dun&K1NeU5*aNDA{)(7~FRs%Onme zt;SPPSk&ZUbe+@-P3 zV`H5VY^?K{#EGR)@6>q9{{;k3^1w=L2`(gdvWI1Buqn8R;3*zh3G8BGr+Qen23v(o z2%hGFmB20|c6upQNIB0y{R+Zo7}#nduOxbA5sHspP53MW>k0cBVrLr+dn2(szmDKJ z2E;v_>;tbScy16xnl}2UrMS-`(kt$?}h7ETbIn(!JvYrBYn1@72}GIPc9q z;EeHLaK`wMRrF9PC%GzKlYB(zVGVIc{Fuli8qwyHpAdRfLjjAD&xt>#anT}jmg7b3 zCgcF|qoVB2Q=$^dNcnPJ`7SScWHqW%!Zbe2TJJc#}2? zqMryq?Zc@mTzSg$@iUoce1_Lw!u&$!S)Z}v;#U&S`Ghr<_>IK#K7mCooq$S998$^Z z`+`rwTPvTR{z>9RpNK_aKOznJ66>fBJ~^d7meASF%fYgi(uK{!QkZnXz8&TwjaXRW zRSF+^g`js>976C_f>yalZ&MImL^P-%hrcP{i?y`Yaznd8@UmjW-8%pkVa$55Z z4F|C|0+=VhJgGNHNebde5}u~;&9?%WC%z)7w{=QZOTH4pcL;hLQM#K#GVc-=t+Rrk zDFE+Tz)N&h;_nkT?kZLz^Z_B`*#f?(5c@+y+6TrOL_Q)COXFuipywd;F(KLI>D$S* zh<-v;6not1u1)Y$g19$}B}BmpCsz2#XF9&@pXJ^Fw!m~{1?F?j=re4tra>Mp!=n|L zFUS}Z9=yUJ_@xE){lJCRp1s(G@=QEkW-V1pcl7 ze&>OXg2O8y-xFE#GGQ~aKP;8?T4Xqdex%S+4m(?t{)sdzUi{Kj%B2_FW8vFB>xkS{ zdueV<>K9U8FIn=qGLmAyQcUlQ;a^xh*upOslKzcE8sivOhyJk#J{(B@u4$e~Xr8=1 z;Xeou-m33N?oVa5UsCMHLfO61J8%)r7(VX(en80hfTbLP-#b2x9Gr;0y~D zR3ebk3E`(Qh?P>zd$d?bu#AGJM*XVVkCP%jL}*zg@H-g6Oab@HEF! z(->OW#?=Y#MR1ie7}@hF7~Y+S-DR2Bs>qvu&X%XpY7)**cT_WjtCzvEUUMGajR!QJm@D7Su)f~Sr~zWv4lpEA!7BC8o&RfYfA|CllS$3Y&YQ3{LhWwnFE@{()-V{fKO>5#wQH ze`4EcOzR#Da{!rbH6!Lr20xJa2#uRX=OAJuHI}N6;#~;L3J8wUpe*8aWroxE=-{9} zlH*}a8P*FJQ)uUhM-kgjFr6h>7!VpOkW?rR_5`*U!04>;+abhuAST-@ab_l?ZAU>c zB_i7K1jY$q@Apq2G+rQV`^1wuOc03eL@_LnIZyX`5{aFKuvQE{c{0gegru=Zf-jv< zA-b!e-XeD@vE6hslCLueLq_E~=pxtK{+R!K~PqRc;!M5Pc^qXeh= z3&_QV^A{3PFJ45VN(fmWaUdp8Ex@FP1paz80B38c(i&j`Nw z&z5QZl%3$84C869ywAmCFhwSVxHxNrb#K;tUyOrfKxo?1g^VZLXW#;w6U*KrCJw~m zce|~b&ieVjKidWOL~zSN6LLqvNj6N27cfe*M9FsbH_w;=9|QI9B&1$2H0CVH;B=AD z@#QHQoZ0IKzzpEkd$Dx;ze&gE-~n}g7yR87a7N{%=w+nakI3v4diC`EDyNfKWqgdK zA8$g-gt5AaL=WZ}oXTaRkI7Fva_S9W7_RaoP_I+Cj|6l|5PgG4zlRvX_X!V_Ra2X; zt-|$_8CttT;{=aSSe<7VOTYrv@*k3)Q_NRkn`8w(qQG1ukV;pWw^=zP{yDjQ4F|(W zT%z&aSaBY{pxAy(5esDGOA7736ro^lzN6FuMrw%ykHW7oQ{up43Hu%JKafADnD;&b zfgdR_&jDtzD*9n6pBrAUJ z#i5qzoH$4-XNm=Laq=f=ULVJb;;&BrWXDdxS@*CKoBps$Y#W^iqa zoHkfwa5>;i4D-P0gT?%UtVe+}1_^L4Z$>=5iXo9RwM<1SRhy}YHD0_}XhSA+)}Vxf z?Y9vn&K{ghP-J6@oHHnqq88qaBIj~Sgh`p*y>3qUJP(!!Y>wK3==mOs3pClZVILvv zR&f{Y`uWZw@O(Ncjb2YHNBWxv;Dw-<=!i!Y^>(mfv;H<6+_=qWa9StpzV8 z2-h|3SVKlI_9cXR`O8^3?I~i28cCNOm-;!td18z!hl$I|YWkaUd}o1Eu4{5V2aNn&1B#%u2(etO8tF08(5%JfFp z8oU~vVU*;xmXvLYRt@NJrX8PM$Er6sf?@}Yaa_d$USEcvkZHp+A~<~>z*?JY>JoQF z6PfA_jAr(!v;>y@qFj9b>%-~kx$gd^_O|A2W5x-d81d2Qe|4ipho% z#&_0#=<4L}B(I-W+T5%`<}NaIFxZz@?)t^*+GOq~gWJIjUWM6T^1a81XN%KXpE2$w z8N8d_l#j#i3m$leIoNT*ai}~9+lGHf@Zr}O{vF4^$}{|w z4&$JV*Tcxz(+I<@dKJ7o)ZrK{4ckrP8BOT-^ms!I*=IFmJiOx#F|g-M{8$n_#w5^3 z=6Ns}opkqyqq4kUs;%WU9-amx<_q9?GZ5ErZE-aKjqyBkFM^ZHLE}pi-r)$pWRujL z(@*h8(l3*iXHCAhLflD{TL?~cu*KX-y>h)S-U=inA!eF93?U(_~n+ z$iu#8h<*u_E$&U3&l3L%xXHA%JnG03c!2_6L%{sh0c^bqeN%?IOTwBC6NQ+4yiD|4 z53Om);@41dQM8c6ca}gD@kGz*gt7Bc!8iJvW@r$5unUMKg9<>2H7S$UJ-uNIVsm#P(gnW;5L zy+xVdf-YNY1!nD(`!gt4 zf!?l%kvv6~;qX_G=IGO_<_Bc|4zi}%HUAO$e}a6GH>;1yJ3~y%OD47Bkr=K};g|r! z3D&WaSq{KYC>{!m>s=AvJ|mYZNa%TodBqJbPS+F(2SwO(Z9%^z?*{q7Q`c7%i3COH z=&vG!hbX4O@zNSODGADGXZiS@;2Z^Eh?&mux3KjS?9w7x4lk@#O9+3VD#Q54&d|OV(~rE%mykjQidPXTH?pZ*bqbS)M7K}9 zmkq`cOA}bV;%ZYr_#PT0(dw0n7}hS%n0!;JJ!R;3-pg58%=>UB1k-=!d--D6+`#-v zZiN8n4GR7Gd&K~yH7t($hmlqaFrM{~!{-4j2PplDHAH-s0B$XV^fU2Q0}RF{R0E8# zS^)O!&|Oli2Po|@2d@9ftPx=7MN(!+{i=M;!IYjQOBrvi!6bT%y!nAHg8bTp`3kyi z7(#NL!KD6$>}5!r!;9|1D~r7OhXgtpkGG1xcM?b<=ya4JflsK*m;z zC$b?$whf5jUP;U{2d{k_QE)^+P&6lWA~0x`+?bLh1CpGymq>9F%8d%j!SZJbu}vv9 zIv{3NG!_*G1?0yB_%v=UuvbJyIN}}v%fog7mK9`wDQt7nV*@nS6e9zBIwe5<#swtcf3gbqOf|TI!(ACR z_xQ@zOlN#RO3DaMe(ow&H&y(aZ9|!z0y1`tU?JimY+Fj~9FUM9#`@4+hUmip+1X`j zB3jopifQZ`5YPjaOOfezqbal75;AZ*h_`woiR_M{P&6P^FXtO!p(r9*5hQVN)7)5c zu>gnP7sAb)&4HNYZ%>)ZfJ~+M=_$&<4wQ)xmI)>UKMJUgs(=VtT@&!B0J1trqBiji z!{l>3`IG{ z?%#FY_qx}$?sc#K_eyozqnxT;PStXiUaj6ehi<%)F%S1&Ed$|QtsHAyj=Gz*%|y=P zDwWS6myepG+vOVNa-GXXZ#Jq2HJi;VmCyAqA7wSic|0wn?6qDyYp{YBF3f<3`;^lS zE+;)By;{^!W+3fa<#gjIPVy*|*+`7%e&u;nif8gb)f{_-Qx05v2?psE0@DA7uBHLE{Bv$z01XHSi3kMq&K9cIEP2q zDc=T{ue5Z1@WkPXd?M|7<#NR3qS~GDaavxja%*(C>E$ziW;NfSydo|ywS=ioH!7zl zmy=$Nsa|!;>!{019`BH2nJ{Ms@|iBKjnTpHWgs$rP^g|dyIEyB=E^3A9|w1FnM8Nb zhf_8I1{YzqMP2Uu4$1MwHe1VK<=X6Wm00TCKM$+2KckP)ol?DWz18E&`MooGpmA(a zj<>lSXg{k>Vkrj*<&aghiids_mChs^_L+Do5Pr;ChW}Omb?VV9bNyEt?@lr9;u<^a z^mWSgsuYvGVk@nR7tJ}NyH|O=I>jqFMz|WWg$<`W#qOLLzfom=O^UIGkw-Xsd6P2T zqfNY$U@wS0p!C<8Eam{+DNql!(jzhE{D{uxAU&PBk|wt*UZ=u(RhJ2CrWu;{^{Oy= zTvfGY?uKxO^j^xSxPfPq{3NsLCBqow-UmyeWh0K7Z9`zw)_1 zV-KGn*k2(xb$K>aX%C3T(T&{=DY0Kf^_l^XYvX!Qsc+V}+^w8}%=oIus1;{JoETn^x<-MQ4kh_~D?dW*Yt>)S(b&5->W zgBkCaA#`t27fS|{+QmFAs_G8j5kzE{G%*x)mePdG&`MUagd|4E64#{ya#xozX{>-_E0avqwD$7D#)I zHGMRrvxUzp+~zjE)*3&S(H1?~(cIXv|A>6=g5F2XWZcTTcy+Ily1!n@|0JPlJI=cv zJc}6!zFo!Zn9OsMRd`T!E!_;E_T!uuS2kMS9d+v%MeLh2djztYd zOL96R-q3!miK+}K^A}87KhN+ErF}6&-Xsd7y;G&WWIVX#%P6_ms#mezr7Sb4mZm$j zao8@+myKP2Ac!Gpng3U4d+MWA@3l+!RkcbY^0nXhDVJFlns}6Ez$j9-u&-wr~Cir;bU62iTpt$Gq|bD`;m;eJW?p*(rR~;Fs_OYu<#RaFbVRkg!@A*rOxb?MhC{EQ-X--oj4Owg47SQRkGIRX zs_IiIA6NR%Gonomu{f2Su+9D#gptKjpN!%gyUOjC88*$WKNfA3uu@>O!gx(8^;bqc z*br&%WK;i?Qva1!6OXn=%=-;|YFEksW}Nq>8mE+TEyH}i>2negnd7fB8lx&ipSQ}t zXYkRe<0tvll2v|_p&t2Y;L|j6SIx`h{-RZXt5h~udIfdAk9qvBj5~Nxq+P~2 zR(Jc59@kQgeuaLBdwpmd87-~N9ZlxR7KXGH@pm{j)6C~p>h~G#e9*0xM*VO=p5Djd zKQfxtllTiZ&YKxLk;22P4JUUssSmV$UuFG6#?I#UJ$y#%aFw1ZH@C?CM@Qyk@J(^u z#c|6D)1NYSH8r%e6}KJU*%@!`V9V#zJbRBH?`&z(ek-=|Z)M1cSo(`_eAB$OgBKL# z4F~QgQP7{2)pWtDHd24dP@ku1;X_-8_isuJWXg<; zs9Rh{+Pd1Q?#Ofont;ZlzLL8-Z|}V zHg@uD;juRISOq8IFad$fsrMj|&R74rz{_0EH0z|A9f$emDOYAG`>afPWSNs< zebJ5!vWRCZQ4NW22BYQDC^O7;&#-t$@JX3z7wwP%rY}~rx6xZvh&NEGQ!p@iKh(dZAm%=;;PFe5D;Hnl+h)WB9R;GNs?&=-EXJ$(B z*_krVtz2FTo~eYq%nlYWkamsCNj#pD$*v-Dl83~*q)(`_`Z<{`t#Xv0uJqvd+)U|} zcON&Oemt;4GUsPHA28#h3&Qg3YvO>3h zy}U}r`%tR57i2axHg>ktv6@c^a@~M=ztG5y?6#un$viFZF^ZE~Y3MrcdW+RV7`L+0fj+zteQkoL}QtqAK!ADz7~|Y}uD) z^1^vjWs^iJzQgRVF3XIzwi5FbD(_1(JMNJ0G0OI?bKj}-(#$x!arOnxk6`HrF~NU|D5{&Wo7;9j^N8P)4sMN zczGtn6-us0rA4JZrv5J~<$Dr(X-;Jq1XKUN#;6`5++dzeG4hL{?~@n@>`SE|}` z?M)5YZ7=%ROC~EjP7BrtUXe+7|v|2 zGh5#wb*RSW+NL|K_&Zf|^h23+8;7eKTif~GCGWsn{rb%6ID-?k#$v5^s5<}0j^J>H zlyqa}uJ+c3NFzOtG$#3|vK+~8+MG9MR&!jTj>P|9wR$xdU7Gs%tjy~#s$vaPYn~!H!w70e$*0v`p8}B))FAGTS+cT>gI7y3Y`;+YqM4 zE0(RY-IrP2aDqOt$b|U`o0?}%Wt_wR}jjNY4;pI6zr<`ZczXAlEbCatYnKJdsgGAbZ}n#zoy zkl_GL6+f4Gf>Q(;3eX7CnJ1)AIw{`)F0p0JP}VlD&~XFUddzAMb3x@YkxhZ$z(P3f z0SH3@Qj2d(gQo#CaO_j6l=;kEoz1a`KFwDLu^hJ_ZKjvKQUZ}I?~zR261FFruTTcP zy*OL>5_7Z;gIXMv9%B{YGw zUCEh>=WjBPv_?)IR;T8>#U$cy*-|<>cB^kW%Qi@eueP?wUAEnwN96U6y>=OO?%&hP zskan%wZ`|~K@D_299F}o{6}WRPDW(rx~+Lpi4pkNv2R+L_oU57CK!MZ!yjA*_w`a` z{G-e0{vg{;%KE2F^TsCM)H$d|_~F=3S+*RDx#1-r17!RNJkfO6<8_Cf&$(H02478o!x{XphK?pPyOY+Tz~xZW+1}n1KYXxN zUP$FjjMnG;EIGYt<@@BOAhmCjq3q1k6nY$X#^W62A2x2UvTiTT(w#s`VKS##^sJ;gHo>bR^jw|m-$tz#h?|rF$*SY<;P$!?A=lwA2J*v9W z>$9p)$hWg83KvS_07VYeKB~%cw!oXRYD~5Ci_Cl&Dzz87C9A6S*iLn})_Af~&Rjp0 zEFsy_BU!r}VvYMc@4PeC6mD&n1Km%%cBjX(s#_Y`^nq?otDGOv-+ji+N#fj`rH&h~ z=E#iq*W$YM1=6NuUShv3OCLrZuH-yO-yZm^wH)bj!rpI z=j@X8d{}xPt`(;Gb~?UX8JFf@+`f?NcG7V>(#aWU+<1K{)$4A@D|x|8&-H8eK&P8k zz@axs0tAgg(x~n|N~+>|fwa1BSkIm;btt0_$LGv^#QokZ_N{t1<9r2+m)VmwVLgdo zAAT|RUg{{ttfg;@ml*HQ+TGg5<%wPF#}0H7mU(OG&uZ7_OuW;ss`qAkKCVu3I@8pC zTzYr8T=;OBIj49iOOB6pb&}UqWau^H@DDBrIpF4{1y$@@lXO_PBrT4wxRYtwI@5$o$LY)n%;n!Hk_o`OfDX-ZdY-qWSHuybP8+>0@bz5uv z`qs`^L^cWrZ=*M1^ffZRKdVEXG@1=l#$PiBW*;DIEqp$kD;dX+bA6Y022_qwI*u^= z94-Rw4ew$oAKn(Qc|L?~PqS>eVft9vDgDwe>sZzv+N3>Y_>Gl6nk7Au4ns|AYT(zc z(>TS_5ahUtx&7A4AJ0-djN@``NJZmFE8E{bd)MX(Rozc8UpWR(u2IuI0;=VFQd*d8 zk2{n!skc~ZyVk(#-MTG(TKAe}TVzZchV&zfQ^@ot9M-hN>577?oX=8pi(XCciq*94 zjK%Zi=%DFkma)Lh5w8yEV_ExKs=4u{4+5WSGcBr~LZ5WYS#O&@59GWkHTw_r z+S-4FFUEJ=X1mw(R9%0_j0tvYqZ;sw1^p3%Y{UCFxohWu!co7l5b}z>$=yfZd8^l+i$U{ zT^xB$N48TL9><{1qUm)zn(5zf`%epQWyuA}zhrT&*3NNn6USq6Vh~ohn4ie% zkZZX-dT1R3p}6epGGvS}F4XS`rOb-x$f_ypnM%*qy871N&VvkV$-7m$%x5Y4Gn4uBSkC4t zpFCxKma_5;k;+&h&ssU(^tRvF(Y29Q(qx>PNvUOF8RtuzqaIBEPKX%fpU7Da{4O~ zkO!jFS1$^c@40`qYL4Rzl;iW2<2Fm`_`OK^6(~RZu~+V0%9CzI%5+|eNxlOsgL#Sl zLS;WcB#lHpHK>=6Aq07tU44(htm2CU(try?`{Pl2@!=9By)YzuA^oI9iBgJ^PFlWH z$rmce-K{aX*Qqa;U#4z5Q|`qfx)~|Q9HEt}d&?L~RHnmbZ?=aggv?I#W#Xa#q++Go zkKO38U9IxC5xq2{1vm$WmutJ~bSt?Nw7a3by;+W@FIROd(`I!oPxaGfO1@Id2kA`O zTV&>ZO3~J=+|Dt1f$kM*hF>{7c_y?cqz|&$dR0Gfj-$$5HLKL+up_DB7KXmtzEd6n zFh>Gar`Y#(P>)@<9@i?n9QMjy$T^bZfk48tKctpeMV2E$dFJ9O*SrsgaSD0PCpLYtb8d$V7Im$ELi17jTO!f(_D zIquN?F2-hSya^+xC(`xGEEwxhXR1Sw95>G`Fw&t`Z$_2l`dIUEIhAE}L#^L}F89ui z&VYtmKaAek&_-LZrdDgJS4A~*>>4{M$Lx%oU`-8}+IZlN;UlRMV;t(jjv%+N*A)|= zV7GE3vh$=whgBn}<}szX)tb;;H()!heiWVEO5`Z}R5=JfVGYMH9BplH zHAOKc?{D%gMQdorz~e%l$K;HIhw!X^tJTe+;+@uTn>E-=sdrgR49gvAAW1pRQ&+|l z)^^;nNkeq(cUyZ4_KuU>rfF|&Y3(!@Q3>0ttV1gf$6MnB_|;ZwlQOxREr$W!R=gcC z(#l<0CBMeX?a1a9_dQnYKx>ejWY=-2fZL~5kE6$_rCf)*hKn0~XWp7Rjfo*M8=H1D z#2VDof3LIV6EYXZvkX)7*IV%pL=Jp7{NcQiCzGw-h2E+U&@0UYSiRPEGHK)9O;Zae z*3EMN`abJ$r^jLEaeYDI4c6fNz7BB+|6c1RjlCik4f-t(|Nheb#a}7Va=f z3}nPetSvAMdAw_DqNA(cz*LEdY{H;^HDRliyv z@4nw!--xxc^T^IvoP$%IxcPuJ^f`ta8Quxgs5QOGF_GtDo;S3H`yGSIgXu%o^nha` z&n1ijVh#O{LFK_TW=(H)OynuyQw-Mdpkq*ZFpXQ&LzsBvi>saOElnpm=x1I1lQj;c z7~4BzvU~Z2I%a-LNUrrd=lP6Y$$o86i{?E4pOyADt?lEqfrsxnU6-@FPb$+tYSYg4 zV>Bp+xuk@5IubX(CYAJVM=JHSrV(<7-lh z&uCSyo^V>2atUf$1sR`d?X&wtLpvv#`kpV3L0a<{U1ohU9Z374D*VeX3nx~Av@a?7 zt1kJvhW2LJ2IX{;>)Y2cP$w~(QGQ?B#?Lr>Svh=j8wY)exT}*pZ0y9oq7Fm!@STrn zZ*{cPB*y{z0>f8TQIBb(9533_vRP&Lo;Ik*%4J& zE&^%aK85e7d#r^=0K!}x;VBz6Dk+DB`qIdbr>G5dXXIA;-<@=|+DqNBS2Z6o7e5%Jm3p0NeErC&9srZ#CE~(wXukDK5={U)Xbh?S(xazP+yT~9syJ%_B=-DXN)jakl zZKCVTkPIKo?5mO{T`z59WLS**l14cV<+Cu&cgkVWhHJhDl0H22)X~K8r3{uV@0mn6 zoKcPbcdE35Nl!U~W0)D+)@qU#)i+2bxpK*KUe@C}kHw1&+EkixGdG}NiTM7ULWpS;M0-xk%e}Li~AZu6Q8bB zFJiN}c`A7{SY^DxDkWf@NTnAz&?P|gzN z+B;vaRkMAs_LHHA8dyb)jZ0nL?-u2Jj}c~+;e(FB+33zxhB3#mlMy@R{vxB_Qqo5q z{c8FFPRn^NT^Yt5Lrp`BVLKfVmFsp1}WRPHoz{K=hHj_h8bY~OQi^xb<~+T?_jp>wI) z4;%~Y!LczOF18}#eIG%_#uf9jV^%xtr1>Sv{4;HKvT>N*+<4eLuUo8K zR=0K8WqcSrm%04gwm#-Kn8)ap)B3hfyBx1el-KXJ^|BXBFI7Ij*FN?rh1#ooytLcP zlzr2&n}xRKmn!p?V^%kqI0TY&1?Q?EWBRg4PdHBcUX<610e$gGd#XC_qbAZ{dwm$; z7oT9#r<11|+%u!kVZ>j2vK=3@-;-quq?IY-GaMuPD3_hwS15;k$KfDPRGrj$88(=L z&vi_qRyDO8lZybaP`2|O8+#e{@@kgl%Jf3VL|YVt6CDN|rq~O$U9T3FDb8DGRA-km zUhHI+Tj=I~+HPffsbf;IJ!9fFoie{nn-8@#A3b?JZ#Fb>!I%dIxL~WyWlnBcPAt_Y zTUuLA%438KXH2!q9S5^9sFO!-<|*rL$I2m|EEJEds^>{6mHBF~Szox{tBiXcquK;z zhhYxxuTl0Ym;E?>pFE?!^F(WN#OzuaQJMN(>+)hlb~{ulhXam7m@^*98%W!yEY(R% zYnwJ)s|<%6!&S%I;wMebB8I*$*i5&5l`2IwS{`r9Nrl zk$79FYGrG5+p5)t2wmqI+doDfkKH_o)X~JCLHeoeL)N3!zQ0H4rVufhvOre#lDw&-yOR;pLA^TD{t!d1qH1fzid@pq%b@ zJ8|j9-m%a=H!7dkxP8_@pg3!UE;8Z z$KFozU`sQXnvN*Xw>X~iw7u7-QTe>h@!8iYPiuO;BFgLSj+Z(`6(_SLHYxi%9J^H7 zWj?0N?{ds)Lzca^$sSeq5yvhjeO$`j72D)Km}1`BQo)T5b3Asd%Ku@Px`u@Vs=jBF2B@s4{p;~r%yUgQd>Ffl%oy(06$OWy0(KU$I~3GnznD> z`eFP6RlUzTek#1K__Qhe=N-F**JZw4nZM|mrCGYn?Y7Eabv(G;sg_)}FdhO{`M>U1 zb+@pKgW5gPDDA;or*iw2tRy>}ME(p)uSb;|+A|HL zZs#Z6cmR<*i^ucjnsP^7MbnAucxR-!weGszb$hSfU3G|ISES$<{#`lt?b%(|+|n59 zy-LDiy-l{gWBr$7u394`B_~O zZmx{3e~o|rQ91Q^!r^#B-HFCai!W@89C2mysULy=u@T7m^^dRIZkusy0~du8vrK`& zelrCE6+aIrCZ2>gzCSVXyZwn^KQ^YsvuhG7&#Fm`o__#e{fopTUm#EbZrrv%(E|=J zEimOU1(`;eN|+{?W|%6NYMA0orWgg?&)c6EWg1}0V=88#;Po1HAfmi6C(u~y<Y2KkhM8pk(*}jhZ&}iB&^Afu!^=&&9_(fsHtA`D%LW5)WIjxiPk!a_dRMv|KFl<2 zv}M6Q@-QiXu-@=)gTvr7)3T)BgfCM$Q$15RlbR9#h7F$vm#u!kw&xqPzW-G$Cx1Ot zx2v3C!>7Sz;SW$ZrgElwrf#NTCOfZb_%c(0^i8f`1?dP=57UUT&44RR!8fP+O11){ zRTzx8e0ty`OfyU?Ou+}4A5#TWgsF#Vgh|So0auuU4<+YO0Iy(*F!eBvFwHQnFa-xF zi%IgzuL2%n>R}pj>0+B9y<)VAJo?~RGGAqwzWPy}wkJ!=Pvwj7PrM?KP2MM-xY9Xp zIw5DTBD#OhiK`WzQ(Psard*QSa7r1rERAkglw|TLNv=h=DYc9z{U`HC^>)vfV94*O zPc_6{0d4yK_y1(fbsYX51p03W@c(#$$=Nw|cSzFaGj{|&$JLat$`uv+%eN#DNc_LJ zhLUsnzn97JuzIqJ;p|_+v)lR&{0lpdv~MT39=X-&QUBI5{pgY%0UdDp&z|5pI?OV+ zKVtKLegymo_!00U;77oZfFA)r0)7Pi2>223Bj88CkANQmKLUOP{0R6F@FUk0* z0Y3tM1pEm25%446N5GGO9|1oCegymo_!00U;77oZfFA)r0)7Pi2>223Bj88CkANQm zKLUOP{0R6F@FUk0*0Y3tM1pEm25%446N5GGO9|1oCegymo_!00U;77oZfFA)r z0)7Pi2>223Bj88CkANQmKLUOP{0R6F@FUk0*0Y3tM1pEm25%446N5GGO9|1oC zegymo_!00U;77oZfFA)r0)7Pi2>223Bj88CkANQmKLUOP{0R6F@FUk0*0Y3tM z1pEm25%446N5GGO9|1oCegymo_!00U;77oZfFA)r0)7Pi2>223Bj88CkANQmKLUOP z{0R6F@FUk0*0Y3tM1pEm25%446N5GGO9|1oCegymo_!00U;77oZfFA)r0)7Pi z2>223Bj88CkANQmKLUOP{0R6F@FUk0*0Y3tM1pEm25%446N5GGO9|1oCegymo z_!00U;77oZfFA)r0)7PkzmGunSqBoE!Q^~%pgWje&GZbWdhAy`DGk0*0Y3tM1pEm25%446N8rCT0(ocbPuS_dwIcq^|F4Qb{=2Ia-4jjO?n=eZ3MZbB z3mg8=kANQmKLUOP{0R6F@FUk0*0Y3tM1pdcFU}yQMi_++k3iJ0T8a;kFXgfWA zlHBFdBKYkp_lP8Sd!#=6c5mZXzSBIHLHr~xQl5>eEQ`ct!R05K zw6*Q#yW;UXQZC-9KO6hpXfpPqZIIWi$voVe)FpUPYP%9G$D^eMX;*0Oyxo5#Z^<@! zD?E8+oAxfR%(upqw*f8U(WEYMPkEBJ$Kxm3fLANe4vcs-DR0749`!q=U5U0`oo77d z$$S?)nzY@ZN9*2Z9-^Hx59++)$t!W$@My9=ylq_S61@1-^}C&4j>k{REAVJiUdc9E z#Wq@vOB;MX`w#L)T$;3ES&q18In?^a&)wD}Z;vOhXan15Bim>b9_>i^sq0rXZ|tQm zGvsyGr%85&vJ;iaLRmHm#1i_ZVQrk!{aB*8@wcSU5a0hOADDe7r3+%qm{U{ zN~2Y{v^t~JxHMTuYQ4F%G2<6^Y1Xf28*N}4ZDbp5!lS9!qq$=*+QK&4ibv}vRt2u| z@-En)Q0v2`Nu9-S!=tG~AqfK};S&kWxreeB{w&KyG&KoYR>xDWlZf%8i zB=c~uH>tDCBY0`*`jGN+Jev3wY@?NIqg8k`nQx6(W8M*uX7{yY?@Qg+N<9bPpVZVk za;=Y1js+s+;+6V~FyFY#Ppllj1md3giq_-Of-jQxoT}lX+OxMG>PGi2htzMtRi5OP zeblM@1)ll!_(|KH*+yINXtJ%Ypt)luc`H1}G@@;I@=7}mUY5GfMa$VnEAVJl_<5H@ z>QaKAdmTx66`s6Oml}^Iv5IV?#a&wEi*?&|YZ6l_ugB$QwSjH45s#*hFYVg-eTHsO#+3 zq<-SJ-L_xj$}4_SmxxD`b?(h8F^GHoMC_+l~CX!`k1b^ADw_ zW1e*Jb*c7|>r>OyH>9RRH>RfNJ?Yt-Qti2Qsp*&}J!#TBmY?#o^$)b9=C5+4W%-9} zx9*2s=e2fu5CB=9$nt3O`G_3btLmkd9$vx%r8HlY9IHc1D&b% zepg!ZkDN%I|MDHF{!aZ&eX8zEwJ+PWsejpBspSoL(yKOIq1%%?ezJURcc+#=<4Nbf zD%Bo$rDb^nuTHhkd(s8nNxNG9*Cf+2|4mm~?3MSV+6QdfEbodZUHV$%Z|r@Z^r}q< z_4+RFNiBcSlV05+d(^`Cf4GA-qK?E`O5 z+9m&rD=q%s_!PV&=`Z#!(%r6jIP2fUXX9N-e<{CbIGL9Gw!G8WAK2rsY>s!O{}F%j zk)QOp?zHWX%08M}UeB~npGMz5;yO06>ub>1ZF<9%mid%_A+@|YS6b#@^TniH(xaYq z;7dunl-KV{i~q7GT{4sE-|b1~d^y!V>Pky_WnT#=#!dWXe%|szUro(l=SoZd!r4@N z!jqnNrNzJWYe|1e_j%IGuC%Jp*OUH|?s26he`qdgmvqFF-tweF-%9#RdG((3I_YT> z4>@+P`gW@Sf+roBPqj~Z(z)MBwa<9ck%z;HY>oqMdz>OI^|EPi`x<^EoM@w7wtd_E ztZk3Eo5}nt9MJNk#DUDBJRhl!h=-~1m_?L&V`O((We)2rzR68)UV+x%-e2U6d@>~Zw>xY9kO?JWjtm-6ae@haYvTA%pUsp(lydg7G_5@C)#ZM^cU zQvIhq>AZcZ_Jk+BOuC=;V9P7JHr2m`_d;cntbIVzFHgo_>a)yp+Vvsz&vw~u{iOet z_()muv*iV=d2f{d)~1(8hh6cB9ZH@5v?rZ?U8+6iNiTZR^Vc6p)JuCY`}d;S)ckEX zq^4Iq>Dn7p?K7Tq_f4txB~QA%F4ewr^MS;$S)a1KE!~o|OS=4UGA(iQ9uKY{N@`|?M0E)biYma=CepkN_w>2Sw3^(W7FMNvOSvqOv=->Om46FXyawc?YW$^{A_)?vJa{@ zDf{c1D^6{nE7-fa&Lj5tHul8Rb$(mk0_l1DrGB#fW_398i@Yt>Kl0wxbn!@PdVuu2 zYyTQ}U#dNB(l#D@nD4l2dmcWs+F8DmEA{ft%l2y4SMga%dyTQXE%~yfARHyegymo_!00U;77oZfFA)r0)7Pi2>223Bj88CkHG)j2-JNp zoLD+rUk8i9L%Hzq{>0|94*5Czx#+p@IJ^K}36ET)eQM!D@G|r$d;wkw z?}Ddad>~N+AA~Q$C7Pq~&?N^FG4x4z6}$^R3-5vVz!%|@@P2so9DHA@^LD|9;G^ih z@Ok(IyzoM<_cm#tQuqjb4!sh-2w#NP!n2PaNUXrS;LC8SPcJ;@*a2=KP)~RzJpBN9 zJK%%brxu=o=c7mA4^i04frxV7hd$~1Bo?wAv^-#gqOmH;K75G37>~&!)xKe&m2hP!K3g}cpZg`dW!^h#Z;tyYeN8r8i+%J8Z?L>+`kH2Fj^#b=U}6b94<3cD!i(U8@C|qwd=?(4 z=H4273m$^k!Ha_j6S?phJPI#>C*ULSV)zg|{v>pG((e#^Aw>gNbSM1iTDB z2k(Q&;fwI9dFp?L_OFAFz}Lkez6#$Ge|Y{g4kprTST1-CJO@4o?}O*Vr{J^jBKRCU zkaI9m3SWYk!zSHU;nRq(zAV)a~I{~`D$ zJc2$3FU~)hXoF9|Bk%-#4n7F)g)hP9-~;eAc;I;l6T|Q=cnN$A9(t5@3ZI1M!H3~9 z@FMsEd>&o~51mW`f$NAZd=(yo_rdd@Py2_D!Pnr@XHLNj z3TXf6bMRVt8GH%e2d{*$!Drw#@GbZzydEBUjP3C}+CMxGUJvhr7r_VMJ@7L4EW96H z1rMH2`-j)T%iyE%1U&r$U7tSD;nV0t@Hl)9J_a9!FT$tbOYjx=96Y;__77izSHZX7 zYw%up`t{TqJ`K--hrY`?h3CWb;KeVX{lkmk5qK%Q3_b|2fLFoi;9+BcpM&w_rXWu-S8p!GQ1By2G4%c!NeeZPIS1$e+iybMEgfygIB_*;9Kx+_$)lM zNd4gp@I3eyd>LK_pL?+`rwX2aA?+W%4qgEd)>2P+0-g;|z$f5&@ILrDybzxEJ?c}e z%PE5ATtxdvFN25SRq!f!FT56B2cLpR;4%0bybYd!=U+_whxfs2;Jxr6crSbaJ_etH z55uS68}Kps9K7ff+CO{=UJsvvufYf4^YAVB415V5`aW@hufp@-B_*_fco94X58Ocg z;Un-6yb8Vq&xO~)^Dd?ThsWSycriQy?}L}Y``|P1O85|b3tj^sgO^-J`-e}#WAGS! z4n6|!f-k|B;63m)c+N{{|L`q%6?_OD`T_kRd=#DspMp=oi{KmZX?PjDsFd~(uYyP5 zi|{)55PSt5gD=3>;R$%?Wwd{IAG`vdek1jVC*V2oG59zQ|h1bDn;1PHX9w?{%!xQjQ zcmm!BZ-e*3hu|ad0r(hv89of3g6Hm}{ln+rHSkIJ61*2a17Cwr!{^~!@D2D9JoF>h z*Dl&WJP#g&Z@`P-qwqi-^@lIRL+~ni?rz#YybfLiFM!A3gYaT_0=@t*gZIHh6|{f& z5WEsz10RF;!0X{t@F{oiQ@I`nXyzpw;KRgDngRjFA@Im+%ybrzvPrsS^!*eQW|L`$* z7@iNGf)Bup;B)W=cqx1dp1qg$4_|}Vz{Btam{(8xhxftj;8FMxd>9^wkHJ^q-S8=R zego|vz69TdOP{|6FF8W{N8f_S;N$SnHE8fDcpiKSJ_|2`=QPs(;brg|_%gf-J_uif z*TEOyoA4MsJ3{-vg*wB-@N9S=ydRziAA--p3*lq%U=wwM&%u}AYTpFUK1%yXUxQb` zYvEh)E_ehUdL``_-UiQuFT)e?B6#jG+CRJu9)=IVtKhxxVR#*U3O)vp!PnuF@C3Xd zO8bZR!Rz4j@F93VdNmeXamn-b z!!P!khIF+1@7LN9lb^KEEyZWuOW})_WJnYG~P}e(h)@kFws- zerNK^_YCrgK?3c*^K{-bO?f?NH=DeCE+9~O4*LbP3%a%6-NtVaZS|d6lW!?ZUdwZk zXt(xgE!X&sqW!T~Yp*fdINEbf?D^zDpm%pTF^Tq%4{5(V<2Q{~KA^Q8qs^lIXi#e* zqs^n8`yQ=52W`5eI(1tYeh!OL%a8Ut=(g^LbO9MtxX%P1g+aNZu=dH zQnYjWw8OaZD@RMeUnibrv`VxCpVx_>8Lb9wcezfy$!K+GKdsY=6{E$_?q1M|Ul^?m z?PrH{;weV!M%#P1TczytM!jfJvm$I z+6LN-F3^d7qivx*dsrtvZnWUT`x9R<%kc@LrK5fE?K*MNXxV6kPt%DtqvfI1zgH)I zYP15huOxKBxCe^R&Un3U8;_enSD;;fQL0vlcELwdwK&?1?@HBr&{jO<^`niM_V@T{ zdj3ObfeTGuqm80{|CL755ST#QFn!qLMw>#r%Fe@RGiY0*sd?wnPI~e#pnd)osea37 z)mIzMJY>9v_Ul4j*T+r#HqrX7OVxsp@Er1Rs+NuR_`juUd1$}zXoYC)W@EPVC`S9t zrKT<>E@f!HeWTXwwqJqvCez2-xKyHDb9d^ph0$hApKbkW(XKRovDNC)hHg*I8%5iB zbE+0c>$+EKAJB^!NTA)dTWh06>qYxRp4L8Sv;nlpxYqvJXhUe1n05I=qm7`on*GB0 zMjJ=_on7ZaEl#0L=j!qvH`+YfJIsE;YD;MU^7B-`b+lifpQ>%4MLv+Kr7!GH9Ggtl zveCk(T}fA#)5LXFw0C|?`#oyvoR9XP(H=8eA=X+49XF`BkFDU#|Hj8UkUonJaX{bZ>!Lv=Xy@?>ByRXg@T4$+bp{pf#8de4o)` zXumQ2&`m~bL(6-QPM9t}(1rHU16sSm_;sUQWAc_6tq1MjPv}II(fZJ~&eaLKEexP- zn10e~LumiY?2oKAg4Xn79lxiV^2X5mO&hn{%mmuo%(hTu{HD-eH>dO7W3*YcrykVW zw9yvO9{;UbM;ZdlXxVQ_)mG6CKQC2VN1MDLRog^++kL58;8EI;ZKs%`4eVpk65ls| zrfw2ZfE&2*E20krSlr!~_Z1cuP+7PV%=7Z^o*_b;{fEE26OwW?;`%E$&yeORb%ny_4FzKtylIbndZyRC<+NRH|vM&xNetJ(~Al;-3 zNN;u&2C_}Ml=N>tUl_=(#7?Kfi9DdlCJzrVW8Wj6QnP@ zETDcBvz(igt~GtHh|{Fw=0v83`EQYa&~6miOH0Cu-(9D&2P$Z<<)lBqH$Bj6$`6zN zA@66{Up?v2uhRql#@v%9 z(xayS_2QqC9vC<2DCsP-Uy-@Ak^aOv$@z7Y9(s2&-Anq?iuAxF`A2C#{iNgeBq!;n zVw+A|s3FFAU<51%rH`lpd%!wy0E~kp-~c!Qj)61a47dO;f-B$}xB&)Or@mNbJzy0$0Cs^3;6ON>ScDfH2q$tcqrW;x z8l0*QCwjqoa1~qzH^B`s{iU>%8vMZmun;T-OTj9z608Sn!8q6j&Vq}?uBHv8)bs|;2>BAj)Jw|B-jSdf<53OI0WXt0(*?SU>jHpc7v7R z5LgRNf>Ce*>;l)oUNCr^`G9%gC|Ckcf?;qLjDm|`H@FH8f}7yDq<6F2ucG`4V!`|P zU0^v_3D$#AFb*!_H`9wh^_>H|%Bcs~3vP%G=G@2pcGAAV+FdLMxJY^yjFMgk)AumF zf#n4Y!Bw#MP1Fah0MoB#n*npdIj|7Sxu5dDKCla%0Hfe6SXsq(@E+=M4a+w|IiwfC z^nI)kFc%EH4?nOAECl<&TCnW{lmYgDi{LQ02?j^We=TtYbHONB2=;)b;1E~|PJ*@I z0vH81z%DTRgVYBs0tdlLa28wy7r`wsG0t+#QTLCdJ&Xn>)~V|!SchO9xC9n~f#1@G zz&vmb9C{poa2?E>p!^N&;Kc8-gL7csCyCpiDHALJm%yICP~N|=eLaCcm;kH50k94n z17qL}m;jf-K5!Ep0<#0$(*TRWDX;>Z1LuO=Gn^zg8QkX}T@G%6y2v`NKfpuU>7WYHIJ}?0WLfoSSqu>xY0gi$5;1sw9&VkuaVLqRtK42ag1&hEw zunZgrtH1@Y4%`4^VD3|y4_F5Ffe~;B90JF{IdBSG2j{??r&0c=i8r{!e8b=x*aa4$ zkAh|33|Iv&gLU8*m;mdunGYBThrm8?3>*cgz!`7}TnE>{?57h)uow(|hWUbdU=%C@ zd%!Yq2&@99!8&jmjDdkOm@ile_JLL45Eui;z&>ya90ljVS#Swl2iL&tXE1-T7z|C( zM!-C<8!Q4xz%pR7^jYc$#=yZdb$S>~ke&wnz*TSztUQZ)h#$BH zu7O)%;B55IQQkADA2-k_V7zGQ#KCl!V11rHf zuohefqhR1to;L#X!CtTe90a4_DA)^5f@9z;I1es@>)ruz2p-e zoCO2dP%qKJRj>!#1ZTkX^JwFYGf>LCthO5J1CD~dMZ~S1a=|D#3U-5&;2<~)j)9Bd zELeG*`1G(G;3OCY7r-uX9qa|uUq@ar9~=cs!AYJ1iw>8;EY%mpK0A=nL;g2P}XI0M##t6&ri^-&+N80-b>z(KGF90kX~NpKOI1p{w_ zgN5KKSOso^ZD4vE_rJkha1ty8m%vgmct7(8i@{p37L0-kunQapd%-Di5L^UD!3}T{ z%z1$MgC*c17zS6t7`O@cg6X%@p1@pi1}p?uz)~>S&-}pxuokQUqhJ*50{g&Ta2y;2 z=fP2M4V(l6Z)W~r4!8&wgR5W|Oz&X%-^zT!KCloR2TQ?ua1kv1NBqGya1$H_)8mv0 z=7MWrAsBo+zF!9g&4h%&(t^ zO)vtcpQH>h7aRo(!C9~rTmdV=&=~ar3&BM&`cdYW!2TKXfLq`sm^VdUuoPSbYX$E{ z{{r)Q70df2<^zs^h2Rue3N8x1nl#S?SAxr6Ef}0-USJW}1(t)oU@bTZwt=HyA2pJD`yUc0?MZ_#VF_a!ZQ?b$}K=(Wr92J*A0Q_25l7-}(T(d-#Uu;{hR^9S;? zs8h-R_7bhdq(!r{j9}4gx6d+I^xB_k1dCp~y+?1+Yk#&8EPCyEMzH9$%QFx1v#3+a z|K}NMF=^4v-Z!x5wVT^L0gGPy3yfgVYq$3*EPCxPGJ-{~-QE|n=(WGt2o}Beml(mK z*IsM{i(b3EUuV&4zt{*Cz4l9tV9{$YF@i;}-CUv$SoGRoY6Od3yLtQ}V9{&0w>T_% z?JqZiMX%jlf(}^p+RKb!(QCJt$Sr#9uP}l|uf5y|7QJ?R%gCbFzRL&}z4qNku;{f{ z7{Q{~ew7g{dhL6RV9{&8+6WfC_DUmI^xF3t!J^lGjS(z*?XNU~MX$Ze2o}BeeMYe8 zwO?xli(dPFBUtp>!$z>^wI48oMX&v!5iEM`)kd)BwbvNIqSt=N2o}Be>x^L0YrozI z7QOabBUtp>Z!m&Iul+_NSoGR&GJ-{~z0L?0z4lv-V9{$oVg!p`d!rF7dhJJzV9{$o zW(12~d$SQNdhNFw!J^lGn-MH}?Z=H^(Q9utf<>?Wb|YBy+S`p_(QEHCf<>?Wgb^%y z?I(?3(QCic2o}BeyNqDbYroqF7QOaY8Ns60Zf}uV^x9uz1dCq#Jw~wTwf7joqSyX< zBUtp>?=^x&uf5j@7QOcSj9}4ge}fS$dhKsCf<>>r&j=R1_BR>9qSxMU1dCq#gGR9E zwLfG8i(dOb7{Q{~{#GMc^x8jQ1dCq#s1YoB?H@FPMX!C#2o}Bej~cu;{g~8Ns60{%a#x^xFU32o}Be z-x$H7*Z#N>EPCx5MzH9$`)NM{egymo_!00U;77oZfFA)r0)7Pi2>223Bj88CkANQm zKLUOP{0R6F@FUk0*0Y3u&QzDRl1@G-GR;w|{Wtl4P;Jtubs}u8&>Td(iFH|R% z>KI?~;p#-sBaC(TeBOhYuTB*0V~oN%J=SCNMZC9gy^QtCIFCmdv+TLNpYUVe=fOXA zBjY!=>9XPxJvPR~4;k<9d%Sn@U7f%51n($3R-NcQk9Sr&s}l*v3n}?3V@>kTqtvPX zM0KK@F;$`kyqm*sk$0ozJ*4z}@=^C3#+O*Wt6IMcwZxc>l-++j<-Lq|E79fMo&G!V z!!~;X?}6M=ohbM+W7a*a=RY#9vF-cSYK+?v=B?&agfGio+^Xw8ZDJy}o-Z+WCd=GU zy~~-Fcu#op9Nydbp{`@;WxOLi&wOJ#Z!hnwNIv;(e1mu%*LvUw)r?zMofy4~cT1?- zI?Gx^eCl{lQ@&fUOr6qM?p4-PL5#5w&}U!FyB;qg#s?T<@`bwG^z(Vg<72$5dUthV zg|QJvNsqJcMybanQ!&e5%6ggF&v={h>cnOtcII301IDUkS;|-zT|51Mi?S-I)5e0< zqttDRbvgYV$}#I($@&euZ(xuL)0&5 z+DVM~jI+*%S!YXZ$7Q$j4GhW(v(1muru$f~81;~M*#h(_LDq?k`JBF=n9yHT=FwJ} ze>VP`wjHxQ%NWr$)V-L#WRdsNO5kJ6tLPA8#8St$sBV+Jms2*|r_@c}v&*I37Smsh zn6{ApNV2`R(ML|PP6w}K>;uYQq(6~-A-0h|*26O6s1}78Bbm0^%a|19-(_90KFV32 z>$IIVVzvwpQs)TE*+!eG_!ir>*^Z~K(eaWpry*{rMCR}eGW)Ck+%D1Av8+h7~ZKFo6VgX{HrjN%~U)eO>R zq>ht}=QHt5wo{f{-v91qzO(F$#3sLx>??>%!6I#nY2xc3^UtSVoAi%C`n0W&(*M#n zbPmS1ZPe>dIa&sDT*v5(P~BBbY8RvANjO13$EWo)yXthaRf?g{pHZM30f z+FpqDHZ1Fhb}oL)toKp26X7%T0lCCwls33Yza?6fK0#1^Ic!&Dw5xI2P4qeJgXn7# zH?Th=9?O*3#`=)4qVrgH<;1U)eU*$09cLQ|(I!i2%Ti99eR0<-8OwmarhHxPHdyJJ9&?InYNyXelde{~QX|tl`62qeJQx~(1i&jNH zBV(D5(pKtOCw1TDJywoC#5PL4L5@R&uVY)J&E$7+{6;&RXM2(N^_S@r%UQ;SM~SUj zM{(M_j1e==z9e=F$9giJ6#bEWyQP3_C?fq3>m#4ORLU+O?*Q9k4}E75>vo-OBOm`c z@``+x7Zw?7O>qV z=!-nh0Lxcl;$O-+M3HH~@_j1t3DVAGT>Jpb zzezhUB!7w2i|s3)tekuux@8L zH>sfQY|^f_IHnYPAKQ8z>mowCjx$BD=hN@VJLEF{&@^pem2D!Oyg}24EwT?Pr!CHz zd4%aNrK~n$6rp_-(cTw`wTvrK%kfqn+p5^*S4V#>SjKib#j&+;`4yP+lv?`00LOj( zw6TcUm&a(I8(-AE3HsC;`h{6JHl!U%-YLqDl5d(ijn%T==)>2DxqPo`j#$nRQ}L5u zuZdrr`i;=XO)y32r#8=F;&@GbhKXxA>uHH`ibiC6zfjkInf*fv$PoQ%E-{k)RkWKRb+0$;XN~xZ9-clVcY7uG%P54{arndgU<>8LwxWZK!~CDtU{D zO}*?hiI1dbS%!YvZT(65DYn^7_7i0sABjzViiypBZp(i zRkM#0|31?mvL8)uw==YdDD}(dcy5SwzQX=SzWp@!b=E1{+%Ro=lw&zHMheGYWwh%M zZE}VFr-tS1Vtr*3hh>&i<}p`CpHE-Y#WAa-$B1by`xfCL_Je|3U>C;;!sRzbdBf~S zikVjr`=d$r!7{c)0e$-z+rcv1NCkaSIel_5{Y)4?$u~)#G)%HFVz257`-h1sDo$C+b*OSzJYTp+4 zbG#6Qnd z&&TkK@_iwplOq@VpTU2I+UX~lyGYn1KCp%{To!fIMV=D2KtIrhu4HeMejVQpVIN0n zuk!7Ur0hY4ElAohGLAwk*Avj^QYXhqGmakf8CQ*B!;8}2VVjahzG2m)e!m}|C}Bx_ zYm)XU*XB5aEe;%G&4;mD7XIWIbt~UC2{YDMWV}?5K4!^F(jP}3axSKPa$X{@DdrFn z{ElEbnRZ)+?bP#|!;UM_c`rUCPW|WHNLxg|x#XLR z|C01WvGJSTRqC@RkbRbXlK6sAd`5SYzK(u%lKyZ+>J+*z{MQV= zxrXu&U}wFw*IezZN6^6l{h;iTDEs2{sE;h54r{QRB6LzkTdc>v>d9viUyzS)o~FGG zp{E*rMKxorF16hy;-^2t8l1NK;A&W65mup+iRvyv+0Y* zTIf6R<)V)+bSh`ryG71&#Ib`QWs_^!b1??54zVNE*%Ugg*KvZR$;Nk8fs4p{06!yP z1+?eXemB=p7V2?=-#otvK6C>9RrKLUp)36c{TjM${y6JHlu2mIXs?Ux!PFId(UV6VOZy> z`N&m)9>(a)g})r}Ic$@535Fct19sSaoSHcZKoNV?`Eu1MgG0;JdW%peJTEX zMb@>cn;Q6!BSVmJP!Z|M@DT;@>Lrg#^fHA##V#Z7L+}7Eq3?>SGf4h(7Hz zvMEa*@)l4JOW2ao%!=QnJ&dB?5wSbUvBWtC*?P#Y5`8Su<|J)Mbi`bt9G^W&9S@@? z`Sz#8%^-Wucj$NdjndDj_FyINWB7+9(Ywl-WbE5T-ox}GgOoXj&V{}g-*8mg0C~iy z*D?HT4gGqS+Dig|DCt7zx(hq0fOiePBZ+^QBkk&L`V{JA5PeUmFRa3jWv|6DWUHkN z&G>%dA^T>@d6_XsAwD}xbv{HNGlEQc*q_A9F(>^a#2>N&=m)dKd`r?#17oEAXl z{#I=9R{A&UtDCXi0(n-!dk~*Af=tI4gVj?8*+(mOKK+u~Q-$_@5$a+ZTL{W}8aC9W z^U4Twq*`=TN?VGku0*C0e21LnsKL*S(?;bwM0z<-e3vreJ9=jL;Rg$l{}{e<6*=;$ zhaPm$Or6cr4ie~i6kkz>&IYk5pltpNZxvrqUPtp$-k>4_O1MqI99mrmU zC0ogd{xXYxPSOuzQ@!nA{9qq#aMtQuVsa0H`kTfFEaH2XsP7f}h8)_2(8?ZXGsrQ3 zj7Ry6^P7NQ2;CI%E8`d8SIaNXuZv$VzY_YjY3!sQIg8O{5%o5LJ*Q=Vhm7mQHBgYtDej|*{yLG%Nye5$?B0d}c7GZ6& zcO{6(w_5?VUGFGnDoo&b`k%Uiyp@D zI~9yQkI`Pb@G%QoUjsVkak#ObhQ0J+10&c;IcY}dLrmO^<|X(jbC3n~&+-k((pNb3 zUrU-0tUjJnJIKDLQXC3Rg#zS-M{A1_n;H+f8Ad*j$-KV>js{ph2vv!hk; zzP5%s*<)pYU3-Jz{js{X)VZ~#y+d$oOGi^nXDY6~p|P&Bxg$^yWqoVszGgxjnjN}^ zmd=Ah*O2IFXln@s8k<||gub!0EpVXK$*ZX`5NK-Y2sF309FVka4F{UqN$y;CbP8R2 zthG((+M5ovG}O!a=7v`2+B@nxn)b`Nt#dyK+7CB%?2mCj;ih;4as@hDnpz>}Y$yYP zL#<74kaIJ{B5fdWIObeLqfIT%O)aUgXmo#l!~W(#G`bHh)N^j{sNY}L+)VmtRHEAB z4dh+deh@vSvJLESu4`{69{sd;MA05H)i*RZbilFxrk1*cP5U)ebP{iF+TSF_3N*Gg zHMAg=$^BqwN1Z4ViiY-h-F^|MrQvX(HQvxx*Magl;%!Zb>R=piYwc**-yv!V#8JQK zqpbmrHnhdt8jKW1S5EdF4F}_tK2^?+Sd)kx=!mto9+q?4O)33}mPC&tgT!~XH>E1* zP*Yn+XPxLp0-768S*)S0siUqXB_`nqF^8tOHzpcYN)JIa+R}Q6GSxS=$0eU=w6n9R zUTRma+Zx(Co%|(TXUpLx(Gz*!)Sj-3mIkrTXtXh9q^a|Tmw;oP2ap_$@wC;69YmvO z-7zJuQ#xwvjCXL2Vb<5D^Z@U=Lk(CVi0g&}2OF?Xy;fyNcry}4qoO@W5XV}mOQbM4 zIuc0TIqfH2Cy9m5T%~xRaXB|6_BS9*>bkM11yggvn;Q^_c(F7|*N9y?d7>+lIgJ84 z?QBBvEzwj+N`Wao)y10}o+iGj-L%7K^sqGTs8c?4-O<)0?Fjig+Ab;PjE+hKb57}$ z^TiiA*u-CW5h-Xx%BhYD;umeW5kDekL4AqEwzj2$BrIjX3I6j-1@3Rf9^ui_+95xO zwzXA)ut&$wG}bvz1yNE>RGVi&n`gjko&l?Q5}r1dKvXM2O(h^_iWN{(0jEtRU`)kS zRa6=VhpDEhTSbAWQ$+!-BH?SQD4;4#ol|)^DokNi7^rV|zNk@!*~XCq6ds zoNGPtgBmZia&-NaHIkpWJV%M2x9|iqErTb2;G~%%J_wCN%~(TaHu#u_f7LJCw324Y z6MvjCrD;Qa(}!Pz-ypwo@)@z>tF3&6rrCoHpa0Fd>f5q5%XoB-vGaLuJ&b(EmDA?m z=aFI9gU3C1#)EBMF{|E9c(zBsArG$bU_)olb6Rf(|KB>#dF<-R^6j_mIumX6S+4F) z{KWS&*MW)uTh9|4$l~Rj#74Yf|1WVKc2UT$EQ5Xc<-77&W;rLml{wsx*X)zjksmL= zxL(Q_`K}{h$vSP$(1)LYqK%lizx6zejRjx8_jIY_g4rjpr;YNB``B>LlPJ%S<)i)b ztXZetj(ghgqK{mD{Qtikx2%2SMrFu5NnLNm=WmTaMt`&(?dsW2z6~t?4efuu{GV)i zoc^lNN1y$k{%p~MpKN|6ef2Nb*P%%x=aK?PpQS%^($6veXtw?6&)4$F^rI4COqT5VOyss&n{4eZ+;TV z(@E<+`KKc`xCpA8xql%n&M;>Xw8t{u1L`bo&O zhHf1&?y2jX3}e!x>$LL~bT|5cS)NQ{&XRwZN6t*?{+6&~8~A_`t1s^Pe^Az`C&9Dp z*h$(5ipW1neN|H56(?(Ze~W^ZX67X2`Cnv_k#yKeAV=r6VNdFqRne z&`*QMeCBJ*ntnn1hM>iB=D)dDz^|D(@H9L^9{Fp)*(gL2(!9OTeb=_W6j8HM@yF0uK{6V5L9Ccx41!j=pjjOC`XQ z;7Wc4I<}g#(hHB{;A+y>5??EGF4|MAl_po)*MQQG=vinBvFTnNV+gLa;^y?aUg?ip zagsKGZ1b$~3|j5C${Gtrtg%;^H1!rP1&=Du`ZezXSUgg^`M0F;g~UtP9Q9%1yysEq z%d{Lx(ocb_6!(IUfn$n?z$@5CQt=o#k6(&V$SNO@p&2-?6{& zTmX1p=_Ty|dSAA%gvl{?!LDT9|L}Z+HSQ_|cYzmmZdnE%2KVWjO%+&Z#|f*VttTZO zIaaJSoh4)#d?7THV~F@Hek)cUF>tnLEEDqJVh^qWhphQ-jTPSuzc_f&3M=>Y7yVXT zhh={Y$i1p@C7v~bGHZ=c%4{Ds>&&SuEnnM1z1I5J#h_(#hWCh-KF7MA)a&C`SczPt zXG1IJxTPb(VJp6y^dmYxD zthh1ow3U~`oo5m=gqb)w7pX6m>zLJ!1t7|EA1@)w@3B4Bx}^9>$Bo(EIOO#$y~2mYXa3)yO@RN;yQd+J>fa{inxXq za4q>BQCy<9UvZ`4OtSS_>#N0Tt0S7eLh+KSL_5u_rQ7g2Jo9z@mQ=f)*0EZ>Cw&5(gAWR;?e%~w!3q3`kFs{e@QVd4iZJY`)={DL+9EM*M0VqrsHsC7q4c4zS z(MZ^mXKZfL9VNe7i{}J5w2lk|s>>QHz5v>|g@x}C5AOG1lXs@`ariBI(yw~3m#)K- zU*ftgoM7F*+nNhY{G7&jTXrhpa!ipvSML=#A@pU6v$P&dJ@NG(Z0Pc>dX}&v#iN?O z+=`!POj8XmK*z_3?*%t&{F0{c0uK?M#ZUMRYkZ#KENzp8iY1L4WgZ;!U`aENZx~m8 zg5?-cJyq%0&k1D=sPq-oOJ9b${W9@0gwJZd1-b6G#x42a604mSDUTk?*-dykI9Kg8 z54ozr#oA7$t@b;q@(n9}mijj%r#UYWKdClQMVb{&Z{kCiY!X%s&Xzs_d9pq2Gmya# zl&zDm;UBZw|55m^=)7o9>s8VXcx=?rde0rC>-FR}rg+s;4nvz$M1Q-BXUbmU_EVwD zxF=S^xQuhr%lUC$y4;D+DRt8s9%aObBpzO4yLoQ!#XLU;Pl*o^Cg(6XRLuP6q7&&Q z-ahh3I~Q@EYm>MM&3EQfm%a#o5*HzVITw-FAbHEReUxcfp2c%`kHsJQd5f>1UEE=% z(ZIOoWzrO(Cv$DiV>?~CDfF=f?`|v1q^niAA{RP5<`su6IVJ6)2OD~GE<+E!$hDF| zUX!L)^Dx*xFWGfMc~;1830WfW9rTpfrb}O6e4-B0asSJU1h$Zad^ws&j_CUm#(nFQ zCy2i7EJK!TwQ4UR)w4-A2TdqLJ(~C;%jS#VH)COw#++wfx>gq}0JT2EuhWhBupo<7R7d^TtTc?a6t2`yt{h;!T5I(PQ^H#ZPEqTi*pI6qC!L`Dh zvMgD7$CYoy!*dM%g*|1-lt-I;+3zvgBXM zAmfTv&pFVPc+&J@lMxT^!FA*{`3I46N$Vp={j$V`gunV-!L{%WTlp7}c7pu6EIn0| zeo)&*;ANgN3KNbzAH6s!GXF2J^3IfEQTbMQbYjx>T5_5&IS<1(ltI?G>Y{@9u;K0T zohup2vgBz$BSs&ZX%Tt#D({I5byIESQKI}uGRVH<;VbNCJp4wi`ixt4F_D3v&=0B| zR9m{9_wbZ-a&*CO#^PUL*@~0G`M;#LUFOxX_7gFyyoN4jj=jh8$!nYfvC{HVkisqReLOy>#eY+{{sK~q+b zZ!&xaEt{zI=+LAw=Q2+oIm)wZ9r?R-tTsX(gG$?F*=#rZi))?{jSs=IHv_+30vpyiiMUK^d~;n{2DHAuPUtT9!QCDTT{o@{*C zI=m|~_$$M^-($~%mh2`?MEQx@1D2#nSAZ@ zgt03tFNu$N$~J-g{l@-n1{tnrEE#LDp$V&e8Iq@iV#u5DivxYwS5?e3cbuXIGnHtk7v)fnT95p5@U6A_D&f^@=~HkQ@gwWB8;KvZ=zBBx zg9$5M(tD42;`_BO%ane~vi*5#S&(`wo{KzutBJ)hDh$7EPWQX6Q>Fa^nhzocGUWzV3#ZbW0OXSmNpK zJBlXGoM$q`_5ONoe{ItKE$8yrpD0)1wiERe%b)|3-{A2R<(a&W=NLYBVz|%@=Txm3 zZx}vv1!RCM(^TT zj6>Ytjjok3_$r4_;Wa1n3-+EEX7VuSnaAC{B3~enYuD0@yp{FnpSWoZUFy8FHhlb* zteqZq=!?FxmQP~U!TDA_jkfaK#Sz}w{}pRdd!2G6)z*8}mhJpjk?+_e4xdP#Q?JK% zICQI|ABWG%0Y|1-&D#8JK60IX&00O0_~6$v(}lV+hZ{OMCnM}pQF$WY)q~vk&&_Oy zwcIl|JSM*3gm>hxbmE5o&_H zaqaz?{Z^0C%)gpG% zAJaSs*0GJ%4xUB1-_cvw1&WX`1l? zChbvdOsCdn4h)W~smo48mPFt6-jgDz;pWbxiS37lCxa#o9SD7ST^DEcZvzPW{ z@W7PAx2JP$88XqvJpEVCOW3PtaBcazwXe)XpDAnv|C}k@gynqEU#|K8^p7`u>~rmV z9KW}G8)F-7j};lluZE_J_EY#Qw=b>wJpOyoKi>hKe~3KcmaSIXwBae|rFXhKYOFE9 z+`q4_*Fog8>Acq?SGnm+9`sK;X0>}SpZ^Um{;6BmZ2a)a@LKq?lWyp)lS_XxJWn=F z#r*#+&*XKk&Lz)M%LmLoN&mBv%-w%*WG&w6oCon&nP|os2Oh_c3M^kTyN`YJ4rETB ziH9AQ{|4^oXP7@pnnl{aomQ?_>958uo0qVTw>$PYv`#w?e)&Xu?WIjGtkXAFXGkyk zc#jbIc6)f_S>r%&`b@YtLqC`)-QN;c|9k&BiK*ZJn|L>{5kYEy5;iY5D7#Ap0vB9x zL7;9QyE)YD?+D3OC3ViWAqVT4WE+gYwM{KMw`_=sHks)bKDdh2IQ zF;Kz2KbzSP@e1Z)7qI8hUzn?%#Xe@t9cMny{&zoRzarYs{3q9rbEk)hXM8*PQugMG z^K6YZ7O$yhUn25dz70NKuo^t=m-eCB;4*G++&%_hZI zt_Rp_?~UyB^bDsD8{f*@_X+a)B6|}RIqf)yHJ6-Pw@r_K(2;BKO7{J0aITZTVLz#7 z^4rFJ%0Dp9qHnG-AP_!>}hll{-mD0uoy=iLno!^DX@wC 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�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 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/q_math.obj b/quake3/source/code/game/Debug_TA/q_math.obj new file mode 100644 index 0000000000000000000000000000000000000000..4a50b90b01064e192fa36a5970146ee4259659d1 GIT binary patch literal 14848 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 X3^`FF4;-9*<(&Sz)1Fa-}~J= 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 T;c6f%LOeqKyyIOQLmU|ZSwKP= literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/qagamex86.lib b/quake3/source/code/game/Debug_TA/qagamex86.lib new file mode 100644 index 0000000000000000000000000000000000000000..ae876fbe72347d4f67fefd8a9bc604246bf1d418 GIT binary patch literal 2612 zcmd5;y>HV{5Wi<9BuWsnP=_oOgJ2{$spAAuAy=dl6=@rV6tOvOQ;|qX1yxj)iG@Fj zi75jEQwIj-%!ogr8{EAQ`?)D@Qvu?n_i^{`{O)&m?>*mH4G;GQPYMt1BvqWc=RI0! zRGg$-u@$c>7kUK%$N{hufXpsHb{X5LX!#OAz7zx-o9*pRH)yWEc-q-$cegvi+wgTb z-al@55CmI0t=7B>ypME*M)%py*7Kmb)?GuJ;rLAu^hcxhgUR7L&}L%gXuKH?41GB7Y816kfo^y*4D=fET(#2_V@l(<9@E29;Hz9@^H zqw?7+w3q?a;sgH!V#RdA3{zTUgg%8VTr)85DJo(K6-k#mK1RcZmVZ;BJnV;)@LpBz zv4oQ*;(vvW$i(J@HI;fE7h-n<+mWV6av$s|jc4gP3NS=Grs9h^9s-J44iXvTrYe@? zf&t1yA7Dz7fs$}v=)0zpxTJ%ESf>_CNPd?(Nn{D|SaLKN@Dlqg*6<&!$x5{z-7GD} zculs^Gno=5BeFt16H(4q`7G`zXEB$YCF6Sw7k_&L6%yIG#CfXJbl=5!8sQFSe6J~w z$d|ridjS4q&HBErl*UNxNhT8N>Ua^<~Cd{D;b`ZAGk+RxWLMj{o{$|&NZBW z#P&(bC<3-+_hj}G5%`R2Uo<`6IzIwmQRmzFdY%*mowk``x>>jA_jJRYB@@NMj2&i-b&?+bfUA)vradUnXod@ zb4#6dj+d-WMu-&&9paXh2uG|#?B}1EwAX6U%6A+3OCsvyJMQ|w)d%HihE1nM>w|%O li7!K}x5{P)$N>XLSktK%lIk_>QgCaXjJH>Li``~u%Qa6kY6 literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/qagamex86.map b/quake3/source/code/game/Debug_TA/qagamex86.map new file mode 100644 index 0000000..f492bff --- /dev/null +++ b/quake3/source/code/game/Debug_TA/qagamex86.map @@ -0,0 +1,2862 @@ + qagamex86 + + Timestamp is 402d0b32 (Fri Feb 13 12:36:50 2004) + + Preferred load address is 20000000 + + Start Length Name Class + 0001:00000000 0006d1beH .text CODE + 0002:00000000 000024c1H .rdata DATA + 0002:000024d0 0000005aH .edata DATA + 0003:00000000 00000004H .CRT$XCA DATA + 0003:00000004 00000004H .CRT$XCZ DATA + 0003:00000008 00000004H .CRT$XIA DATA + 0003:0000000c 00000004H .CRT$XIC DATA + 0003:00000010 00000004H .CRT$XIZ DATA + 0003:00000014 00000004H .CRT$XPA DATA + 0003:00000018 00000004H .CRT$XPX DATA + 0003:0000001c 00000004H .CRT$XPZ DATA + 0003:00000020 00000004H .CRT$XTA DATA + 0003:00000024 00000004H .CRT$XTZ DATA + 0003:00000030 00010344H .data DATA + 0003:00010378 0015a188H .bss DATA + 0004:00000000 00000014H .idata$2 DATA + 0004:00000014 00000014H .idata$3 DATA + 0004:00000028 00000124H .idata$4 DATA + 0004:0000014c 00000124H .idata$5 DATA + 0004:00000270 0000051cH .idata$6 DATA + + Address Publics by Value Rva+Base Lib:Object + + 0001:00000000 _BotNumActivePlayers 20001000 f ai_chat.obj + 0001:00000109 _BotIsFirstInRankings 20001109 f ai_chat.obj + 0001:0000022a _BotIsLastInRankings 2000122a f ai_chat.obj + 0001:0000034b _BotFirstClientInRankings 2000134b f ai_chat.obj + 0001:000004a0 _BotLastClientInRankings 200014a0 f ai_chat.obj + 0001:000005f5 _BotRandomOpponentName 200015f5 f ai_chat.obj + 0001:000007f1 _PrivateBotOwner 200017f1 f ai_chat.obj + 0001:00000862 _BotMapTitle 20001862 f ai_chat.obj + 0001:000008b3 _BotWeaponNameForMeansOfDeath 200018b3 f ai_chat.obj + 0001:000009f9 _BotRandomWeaponName 200019f9 f ai_chat.obj + 0001:00000a9a _BotVisibleEnemies 20001a9a f ai_chat.obj + 0001:00000bda _BotValidChatPosition 20001bda f ai_chat.obj + 0001:00000db9 _BotChat_EnterGame 20001db9 f ai_chat.obj + 0001:00000efd _BotChat_ExitGame 20001efd f ai_chat.obj + 0001:0000102a _BotChat_StartLevel 2000202a f ai_chat.obj + 0001:00001175 _BotChat_EndLevel 20002175 f ai_chat.obj + 0001:000013b4 _BotChat_Death 200023b4 f ai_chat.obj + 0001:00001953 _BotChat_Kill 20002953 f ai_chat.obj + 0001:00001c33 _BotChat_EnemySuicide 20002c33 f ai_chat.obj + 0001:00001d89 _BotChat_HitTalking 20002d89 f ai_chat.obj + 0001:00001f38 _BotChat_HitNoDeath 20002f38 f ai_chat.obj + 0001:00002149 _BotChat_HitNoKill 20003149 f ai_chat.obj + 0001:00002304 _BotChat_Random 20003304 f ai_chat.obj + 0001:000025bc _BotChatTime 200035bc f ai_chat.obj + 0001:000025e8 _BotChatTest 200035e8 f ai_chat.obj + 0001:000033a0 _BotPrintTeamGoal 200043a0 f ai_cmd.obj + 0001:000035c0 _BotGetItemTeamGoal 200045c0 f ai_cmd.obj + 0001:0000361e _BotGetMessageTeamGoal 2000461e f ai_cmd.obj + 0001:0000367e _BotGetTime 2000467e f ai_cmd.obj + 0001:000037a0 _FindClientByName 200047a0 f ai_cmd.obj + 0001:000038aa _FindEnemyByName 200048aa f ai_cmd.obj + 0001:000039e9 _NumPlayersOnSameTeam 200049e9 f ai_cmd.obj + 0001:00003ab7 _BotGetPatrolWaypoints 20004ab7 f ai_cmd.obj + 0001:00003d3d _BotAddressedToBot 20004d3d f ai_cmd.obj + 0001:00003fbb _BotGPSToPosition 20004fbb f ai_cmd.obj + 0001:000040b6 _BotMatch_HelpAccompany 200050b6 f ai_cmd.obj + 0001:000045d7 _BotMatch_DefendKeyArea 200055d7 f ai_cmd.obj + 0001:00004754 _BotMatch_GetItem 20005754 f ai_cmd.obj + 0001:000048ea _BotMatch_Camp 200058ea f ai_cmd.obj + 0001:00004d23 _BotMatch_Patrol 20005d23 f ai_cmd.obj + 0001:00004ebe _BotMatch_GetFlag 20005ebe f ai_cmd.obj + 0001:00004ff7 _BotMatch_AttackEnemyBase 20005ff7 f ai_cmd.obj + 0001:00005115 _BotMatch_RushBase 20006115 f ai_cmd.obj + 0001:0000522d _BotMatch_TaskPreference 2000622d f ai_cmd.obj + 0001:000053d8 _BotMatch_ReturnFlag 200063d8 f ai_cmd.obj + 0001:000054d7 _BotMatch_JoinSubteam 200064d7 f ai_cmd.obj + 0001:000055ae _BotMatch_LeaveSubteam 200065ae f ai_cmd.obj + 0001:0000566f _BotMatch_WhichTeam 2000666f f ai_cmd.obj + 0001:000056f7 _BotMatch_CheckPoint 200066f7 f ai_cmd.obj + 0001:00005986 _BotMatch_FormationSpace 20006986 f ai_cmd.obj + 0001:00005a5b _BotMatch_Dismiss 20006a5b f ai_cmd.obj + 0001:00005b72 _BotMatch_Suicide 20006b72 f ai_cmd.obj + 0001:00005c09 _BotMatch_StartTeamLeaderShip 20006c09 f ai_cmd.obj + 0001:00005ccb _BotMatch_StopTeamLeaderShip 20006ccb f ai_cmd.obj + 0001:00005dae _BotMatch_WhoIsTeamLeader 20006dae f ai_cmd.obj + 0001:00005e11 _BotMatch_WhatAreYouDoing 20006e11 f ai_cmd.obj + 0001:00006110 _BotMatch_WhatIsMyCommand 20007110 f ai_cmd.obj + 0001:00006157 _BotNearestVisibleItem 20007157 f ai_cmd.obj + 0001:000062ce _BotMatch_WhereAreYou 200072ce f ai_cmd.obj + 0001:00006640 _BotMatch_LeadTheWay 20007640 f ai_cmd.obj + 0001:0000691e _BotMatch_Kill 2000791e f ai_cmd.obj + 0001:00006ab8 _BotMatch_CTF 20007ab8 f ai_cmd.obj + 0001:00006c69 _BotMatch_EnterGame 20007c69 f ai_cmd.obj + 0001:00006caa _BotMatch_NewLeader 20007caa f ai_cmd.obj + 0001:00006d04 _BotMatchMessage 20007d04 f ai_cmd.obj + 0001:000070e0 _BotResetNodeSwitches 200080e0 f ai_dmnet.obj + 0001:000070ef _BotDumpNodeSwitches 200080ef f ai_dmnet.obj + 0001:00007176 _BotRecordNodeSwitch 20008176 f ai_dmnet.obj + 0001:00007206 _BotGetAirGoal 20008206 f ai_dmnet.obj + 0001:000073a3 _BotGoForAir 200083a3 f ai_dmnet.obj + 0001:0000748e _BotNearbyGoal 2000848e f ai_dmnet.obj + 0001:0000753d _BotReachedGoal 2000853d f ai_dmnet.obj + 0001:000076ef _BotGetItemLongTermGoal 200086ef f ai_dmnet.obj + 0001:0000782b _BotGetLongTermGoal 2000882b f ai_dmnet.obj + 0001:0000966c _BotLongTermGoal 2000a66c f ai_dmnet.obj + 0001:00009b70 _AIEnter_Intermission 2000ab70 f ai_dmnet.obj + 0001:00009bd6 _AINode_Intermission 2000abd6 f ai_dmnet.obj + 0001:00009c43 _AIEnter_Observer 2000ac43 f ai_dmnet.obj + 0001:00009c7b _AINode_Observer 2000ac7b f ai_dmnet.obj + 0001:00009ca6 _AIEnter_Stand 2000aca6 f ai_dmnet.obj + 0001:00009ce7 _AINode_Stand 2000ace7 f ai_dmnet.obj + 0001:00009e01 _AIEnter_Respawn 2000ae01 f ai_dmnet.obj + 0001:00009f01 _AINode_Respawn 2000af01 f ai_dmnet.obj + 0001:0000a001 _BotSelectActivateWeapon 2000b001 f ai_dmnet.obj + 0001:0000a0a4 _BotClearPath 2000b0a4 f ai_dmnet.obj + 0001:0000a3c0 _AIEnter_Seek_ActivateEntity 2000b3c0 f ai_dmnet.obj + 0001:0000a3ec _AINode_Seek_ActivateEntity 2000b3ec f ai_dmnet.obj + 0001:0000ac88 _AIEnter_Seek_NBG 2000bc88 f ai_dmnet.obj + 0001:0000ad0c _AINode_Seek_NBG 2000bd0c f ai_dmnet.obj + 0001:0000b1b6 _AIEnter_Seek_LTG 2000c1b6 f ai_dmnet.obj + 0001:0000b23a _AINode_Seek_LTG 2000c23a f ai_dmnet.obj + 0001:0000b8a4 _AIEnter_Battle_Fight 2000c8a4 f ai_dmnet.obj + 0001:0000b8e2 _AIEnter_Battle_SuicidalFight 2000c8e2 f ai_dmnet.obj + 0001:0000b934 _AINode_Battle_Fight 2000c934 f ai_dmnet.obj + 0001:0000becf _AIEnter_Battle_Chase 2000cecf f ai_dmnet.obj + 0001:0000bf09 _AINode_Battle_Chase 2000cf09 f ai_dmnet.obj + 0001:0000c451 _AIEnter_Battle_Retreat 2000d451 f ai_dmnet.obj + 0001:0000c47d _AINode_Battle_Retreat 2000d47d f ai_dmnet.obj + 0001:0000cacb _AIEnter_Battle_NBG 2000dacb f ai_dmnet.obj + 0001:0000caf7 _AINode_Battle_NBG 2000daf7 f ai_dmnet.obj + 0001:0000d030 _BotSetUserInfo 2000e030 f ai_dmq3.obj + 0001:0000d094 _BotCTFCarryingFlag 2000e094 f ai_dmq3.obj + 0001:0000d0ce _BotTeam 2000e0ce f ai_dmq3.obj + 0001:0000d166 _BotOppositeTeam 2000e166 f ai_dmq3.obj + 0001:0000d19b _BotEnemyFlag 2000e19b f ai_dmq3.obj + 0001:0000d1bd _BotTeamFlag 2000e1bd f ai_dmq3.obj + 0001:0000d1df _EntityIsDead 2000e1df f ai_dmq3.obj + 0001:0000d226 _EntityCarriesFlag 2000e226 f ai_dmq3.obj + 0001:0000d25a _EntityIsInvisible 2000e25a f ai_dmq3.obj + 0001:0000d289 _EntityIsShooting 2000e289 f ai_dmq3.obj + 0001:0000d2a7 _EntityIsChatting 2000e2a7 f ai_dmq3.obj + 0001:0000d2c5 _EntityHasQuad 2000e2c5 f ai_dmq3.obj + 0001:0000d2e0 _BotRememberLastOrderedTask 2000e2e0 f ai_dmq3.obj + 0001:0000d347 _BotSetTeamStatus 2000e347 f ai_dmq3.obj + 0001:0000d34c _BotSetLastOrderedTask 2000e34c f ai_dmq3.obj + 0001:0000d4fc _BotRefuseOrder 2000e4fc f ai_dmq3.obj + 0001:0000d57d _BotCTFSeekGoals 2000e57d f ai_dmq3.obj + 0001:0000e10c _BotCTFRetreatGoals 2000f10c f ai_dmq3.obj + 0001:0000e190 _BotTeamGoals 2000f190 f ai_dmq3.obj + 0001:0000e1d4 _BotPointAreaNum 2000f1d4 f ai_dmq3.obj + 0001:0000e246 _ClientName 2000f246 f ai_dmq3.obj + 0001:0000e2d8 _ClientSkin 2000f2d8 f ai_dmq3.obj + 0001:0000e35a _ClientFromName 2000f35a f ai_dmq3.obj + 0001:0000e41b _ClientOnSameTeamFromName 2000f41b f ai_dmq3.obj + 0001:0000e4fa _stristr 2000f4fa f ai_dmq3.obj + 0001:0000e58a _EasyClientName 2000f58a f ai_dmq3.obj + 0001:0000e813 _BotSynonymContext 2000f813 f ai_dmq3.obj + 0001:0000e853 _BotEatBeans 2000f853 f ai_dmq3.obj + 0001:0000e8e6 _BotChooseWeapon 2000f8e6 f ai_dmq3.obj + 0001:0000e980 _BotSetupForMovement 2000f980 f ai_dmq3.obj + 0001:0000eadb _BotCheckItemPickup 2000fadb f ai_dmq3.obj + 0001:0000eae0 _BotUpdateInventory 2000fae0 f ai_dmq3.obj + 0001:0000ef46 _BotUpdateBattleInventory 2000ff46 f ai_dmq3.obj + 0001:0000efd1 _BotBattleUseItems 2000ffd1 f ai_dmq3.obj + 0001:0000f0b0 _BotSetTeleportTime 200100b0 f ai_dmq3.obj + 0001:0000f0e9 _BotIsDead 200100e9 f ai_dmq3.obj + 0001:0000f0fc _BotIsObserver 200100fc f ai_dmq3.obj + 0001:0000f164 _BotIntermission 20010164 f ai_dmq3.obj + 0001:0000f1a1 _BotInLavaOrSlime 200101a1 f ai_dmq3.obj + 0001:0000f1ea _BotCreateWayPoint 200101ea f ai_dmq3.obj + 0001:0000f2df _BotFindWayPoint 200102df f ai_dmq3.obj + 0001:0000f31e _BotFreeWaypoints 2001031e f ai_dmq3.obj + 0001:0000f354 _BotInitWaypoints 20010354 f ai_dmq3.obj + 0001:0000f3a5 _TeamPlayIsOn 200103a5 f ai_dmq3.obj + 0001:0000f3b6 _BotAggression 200103b6 f ai_dmq3.obj + 0001:0000f5b0 _BotFeelingBad 200105b0 f ai_dmq3.obj + 0001:0000f60b _BotWantsToRetreat 2001060b f ai_dmq3.obj + 0001:0000f6a9 _BotWantsToChase 200106a9 f ai_dmq3.obj + 0001:0000f738 _BotWantsToHelp 20010738 f ai_dmq3.obj + 0001:0000f742 _BotCanAndWantsToRocketJump 20010742 f ai_dmq3.obj + 0001:0000f7ed _BotHasPersistantPowerupAndWeapon 200107ed f ai_dmq3.obj + 0001:0000f8c1 _BotGoCamp 200108c1 f ai_dmq3.obj + 0001:0000f9b7 _BotWantsToCamp 200109b7 f ai_dmq3.obj + 0001:0000fbec _BotDontAvoid 20010bec f ai_dmq3.obj + 0001:0000fc40 _BotGoForPowerups 20010c40 f ai_dmq3.obj + 0001:0000fca7 _BotRoamGoal 20010ca7 f ai_dmq3.obj + 0001:0001001e _BotAttackMove 2001101e f ai_dmq3.obj + 0001:00010818 _BotSameTeam 20011818 f ai_dmq3.obj + 0001:000109aa _InFieldOfVision 200119aa f ai_dmq3.obj + 0001:00010aac _BotEntityVisible 20011aac f ai_dmq3.obj + 0001:000110af _BotFindEnemy 200120af f ai_dmq3.obj + 0001:0001160f _BotTeamFlagCarrierVisible 2001260f f ai_dmq3.obj + 0001:0001170a _BotTeamFlagCarrier 2001270a f ai_dmq3.obj + 0001:000117b6 _BotEnemyFlagCarrierVisible 200127b6 f ai_dmq3.obj + 0001:000118b1 _BotVisibleTeamMatesAndEnemies 200128b1 f ai_dmq3.obj + 0001:00011a3f _BotAimAtEnemy 20012a3f f ai_dmq3.obj + 0001:00012f04 _BotCheckAttack 20013f04 f ai_dmq3.obj + 0001:000134c1 _BotMapScripts 200144c1 f ai_dmq3.obj + 0001:00013911 _BotSetMovedir 20014911 f ai_dmq3.obj + 0001:000139dd _BotModelMinsMaxs 200149dd f ai_dmq3.obj + 0001:00013b50 _BotFuncButtonActivateGoal 20014b50 f ai_dmq3.obj + 0001:000147b3 _BotFuncDoorActivateGoal 200157b3 f ai_dmq3.obj + 0001:00014985 _BotTriggerMultipleActivateGoal 20015985 f ai_dmq3.obj + 0001:00014c93 _BotPopFromActivateGoalStack 20015c93 f ai_dmq3.obj + 0001:00014cfa _BotPushOntoActivateGoalStack 20015cfa f ai_dmq3.obj + 0001:00014e06 _BotClearActivateGoalStack 20015e06 f ai_dmq3.obj + 0001:00014e25 _BotEnableActivateGoalAreas 20015e25 f ai_dmq3.obj + 0001:00014e8e _BotIsGoingToActivateEntity 20015e8e f ai_dmq3.obj + 0001:00014f5a _BotGetActivateGoal 20015f5a f ai_dmq3.obj + 0001:0001588c _BotGoForActivateGoal 2001688c f ai_dmq3.obj + 0001:00015940 _BotPrintActivateGoalInfo 20016940 f ai_dmq3.obj + 0001:00015a3e _BotRandomMove 20016a3e f ai_dmq3.obj + 0001:00015ac6 _BotAIBlocked 20016ac6 f ai_dmq3.obj + 0001:00015f08 _BotAIPredictObstacles 20016f08 f ai_dmq3.obj + 0001:000160a0 _BotCheckConsoleMessages 200170a0 f ai_dmq3.obj + 0001:000164ca _BotCheckForGrenades 200174ca f ai_dmq3.obj + 0001:00016506 _BotCheckForBeartraps 20017506 f ai_dmq3.obj + 0001:00016615 _BotCheckForAutosentrys 20017615 f ai_dmq3.obj + 0001:00016725 _BotCheckForGravityWells 20017725 f ai_dmq3.obj + 0001:0001679c _BotCheckEvents 2001779c f ai_dmq3.obj + 0001:00016c49 _BotCheckSnapshot 20017c49 f ai_dmq3.obj + 0001:00016d51 _BotCheckAir 20017d51 f ai_dmq3.obj + 0001:00016d8b _BotAlternateRoute 20017d8b f ai_dmq3.obj + 0001:00016e30 _BotGetAlternateRouteGoal 20017e30 f ai_dmq3.obj + 0001:00016f6c _BotSetupAlternativeRouteGoals 20017f6c f ai_dmq3.obj + 0001:00016f86 _BotDeathmatchAI 20017f86 f ai_dmq3.obj + 0001:00017351 _BotSetEntityNumForGoalWithModel 20018351 f ai_dmq3.obj + 0001:00017424 _BotSetEntityNumForGoal 20018424 f ai_dmq3.obj + 0001:000174dd _BotGoalForBSPEntity 200184dd f ai_dmq3.obj + 0001:00017672 _BotSetupDeathmatchAI 20018672 f ai_dmq3.obj + 0001:00017876 _BotShutdownDeathmatchAI 20018876 f ai_dmq3.obj + 0001:00017890 _BotAI_Print 20018890 f ai_main.obj + 0001:00017987 _BotAI_Trace 20018987 f ai_main.obj + 0001:00017a50 _BotAI_GetClientState 20018a50 f ai_main.obj + 0001:00017aa9 _BotAI_GetEntityState 20018aa9 f ai_main.obj + 0001:00017b23 _BotAI_GetSnapshotEntity 20018b23 f ai_main.obj + 0001:00017b72 _BotAI_BotInitialChat 20018b72 f ai_main.obj + 0001:00017c32 _BotTestAAS 20018c32 f ai_main.obj + 0001:00017d05 _BotReportStatus 20018d05 f ai_main.obj + 0001:000180c6 _BotTeamplayReport 200190c6 f ai_main.obj + 0001:000182d9 _BotSetInfoConfigString 200192d9 f ai_main.obj + 0001:00018681 _BotUpdateInfoConfigStrings 20019681 f ai_main.obj + 0001:00018760 _BotInterbreedBots 20019760 f ai_main.obj + 0001:00018911 _BotWriteInterbreeded 20019911 f ai_main.obj + 0001:000189cf _BotInterbreedEndMatch 200199cf f ai_main.obj + 0001:00018a46 _BotInterbreeding 20019a46 f ai_main.obj + 0001:00018b69 _BotEntityInfo 20019b69 f ai_main.obj + 0001:00018b7e _NumBots 20019b7e f ai_main.obj + 0001:00018b88 _BotTeamLeader 20019b88 f ai_main.obj + 0001:00018bd3 _AngleDifference 20019bd3 f ai_main.obj + 0001:00018c2e _BotChangeViewAngle 20019c2e f ai_main.obj + 0001:00018d07 _BotChangeViewAngles 20019d07 f ai_main.obj + 0001:00019055 _BotInputToUserCommand 2001a055 f ai_main.obj + 0001:0001945d _BotUpdateInput 2001a45d f ai_main.obj + 0001:0001958e _BotAIRegularUpdate 2001a58e f ai_main.obj + 0001:000195bd _RemoveColorEscapeSequences 2001a5bd f ai_main.obj + 0001:00019664 _BotAI 2001a664 f ai_main.obj + 0001:00019a7a _BotScheduleBotThink 2001aa7a f ai_main.obj + 0001:00019ae9 _BotWriteSessionData 2001aae9 f ai_main.obj + 0001:00019c01 _BotReadSessionData 2001ac01 f ai_main.obj + 0001:00019cfc _BotAISetupClient 2001acfc f ai_main.obj + 0001:0001a113 _BotAIShutdownClient 2001b113 f ai_main.obj + 0001:0001a234 _BotResetState 2001b234 f ai_main.obj + 0001:0001a479 _BotAILoadMap 2001b479 f ai_main.obj + 0001:0001a535 _BotAIStartFrame 2001b535 f ai_main.obj + 0001:0001abc1 _BotInitLibrary 2001bbc1 f ai_main.obj + 0001:0001b0c5 _BotAISetup 2001c0c5 f ai_main.obj + 0001:0001b249 _BotAIShutdown 2001c249 f ai_main.obj + 0001:0001b390 _BotValidTeamLeader 2001c390 f ai_team.obj + 0001:0001b3ce _BotNumTeamMates 2001c3ce f ai_team.obj + 0001:0001b4ee _BotClientTravelTimeToGoal 2001c4ee f ai_team.obj + 0001:0001b54c _BotSortTeamMatesByBaseTravelTime 2001c54c f ai_team.obj + 0001:0001b79a _BotSetTeamMateTaskPreference 2001c79a f ai_team.obj + 0001:0001b7de _BotGetTeamMateTaskPreference 2001c7de f ai_team.obj + 0001:0001b839 _BotSortTeamMatesByTaskPreference 2001c839 f ai_team.obj + 0001:0001b9b3 _BotSayTeamOrderAlways 2001c9b3 f ai_team.obj + 0001:0001ba5d _BotSayTeamOrder 2001ca5d f ai_team.obj + 0001:0001ba72 _BotVoiceChat 2001ca72 f ai_team.obj + 0001:0001ba77 _BotVoiceChatOnly 2001ca77 f ai_team.obj + 0001:0001ba7c _BotSayVoiceTeamOrder 2001ca7c f ai_team.obj + 0001:0001ba81 _BotCTFOrders_BothFlagsNotAtBase 2001ca81 f ai_team.obj + 0001:0001bfb4 _BotCTFOrders_FlagNotAtBase 2001cfb4 f ai_team.obj + 0001:0001c6d1 _BotCTFOrders_EnemyFlagNotAtBase 2001d6d1 f ai_team.obj + 0001:0001cb74 _BotCTFOrders_BothFlagsAtBase 2001db74 f ai_team.obj + 0001:0001d28c _BotCTFOrders 2001e28c f ai_team.obj + 0001:0001d335 _BotCreateGroup 2001e335 f ai_team.obj + 0001:0001d3e1 _BotTeamOrders 2001e3e1 f ai_team.obj + 0001:0001d62a _FindHumanTeamLeader 2001e62a f ai_team.obj + 0001:0001d6df _BotTeamAI 2001e6df f ai_team.obj + 0001:0001dbd0 _BotVoiceChat_GetFlag 2001ebd0 f ai_vcmd.obj + 0001:0001dcba _BotVoiceChat_Offense 2001ecba f ai_vcmd.obj + 0001:0001dd8a _BotVoiceChat_Defend 2001ed8a f ai_vcmd.obj + 0001:0001dea2 _BotVoiceChat_DefendFlag 2001eea2 f ai_vcmd.obj + 0001:0001debb _BotVoiceChat_Patrol 2001eebb f ai_vcmd.obj + 0001:0001df49 _BotVoiceChat_Camp 2001ef49 f ai_vcmd.obj + 0001:0001e139 _BotVoiceChat_FollowMe 2001f139 f ai_vcmd.obj + 0001:0001e345 _BotVoiceChat_FollowFlagCarrier 2001f345 f ai_vcmd.obj + 0001:0001e382 _BotVoiceChat_ReturnFlag 2001f382 f ai_vcmd.obj + 0001:0001e432 _BotVoiceChat_StartLeader 2001f432 f ai_vcmd.obj + 0001:0001e44e _BotVoiceChat_StopLeader 2001f44e f ai_vcmd.obj + 0001:0001e4a2 _BotVoiceChat_WhoIsLeader 2001f4a2 f ai_vcmd.obj + 0001:0001e52d _BotVoiceChat_WantOnDefense 2001f52d f ai_vcmd.obj + 0001:0001e5d9 _BotVoiceChat_WantOnOffense 2001f5d9 f ai_vcmd.obj + 0001:0001e685 _BotVoiceChat_Dummy 2001f685 f ai_vcmd.obj + 0001:0001e68a _BotVoiceChatCommand 2001f68a f ai_vcmd.obj + 0001:0001e8f0 _BG_FindItemForPowerup 2001f8f0 f bg_misc.obj + 0001:0001e964 _BG_FindItemForHoldable 2001f964 f bg_misc.obj + 0001:0001e9c9 _BG_FindItemForWeapon 2001f9c9 f bg_misc.obj + 0001:0001ea1b _BG_FindItem 2001fa1b f bg_misc.obj + 0001:0001ea5d _BG_PlayerTouchesItem 2001fa5d f bg_misc.obj + 0001:0001eb0b _BG_CanItemBeGrabbed 2001fb0b f bg_misc.obj + 0001:0001ee30 _BG_EvaluateTrajectory 2001fe30 f bg_misc.obj + 0001:0001f0ff _BG_EvaluateTrajectoryDelta 200200ff f bg_misc.obj + 0001:0001f30f _BG_AddPredictableEventToPlayerstate 2002030f f bg_misc.obj + 0001:0001f3b3 _BG_TouchJumpPad 200203b3 f bg_misc.obj + 0001:0001f495 _BG_PlayerStateToEntityState 20020495 f bg_misc.obj + 0001:0001f8da _BG_PlayerStateToEntityStateExtraPolate 200208da f bg_misc.obj + 0001:0001fd40 _PM_AddEvent 20020d40 f bg_pmove.obj + 0001:0001fd5b _PM_AddTouchEnt 20020d5b f bg_pmove.obj + 0001:0001fddb _PM_ClipVelocity 20020ddb f bg_pmove.obj + 0001:0001fe6d _PM_UpdateViewAngles 20020e6d f bg_pmove.obj + 0001:0001ff5c _PM_NextHoldable 20020f5c f bg_pmove.obj + 0001:00020045 _PmoveSingle 20021045 f bg_pmove.obj + 0001:000236c3 _Pmove 200246c3 f bg_pmove.obj + 0001:000237b0 _PM_SlideMove 200247b0 f bg_slidemove.obj + 0001:00024114 _PM_StepSlideMove 20025114 f bg_slidemove.obj + 0001:00024550 _P_DamageFeedback 20025550 f g_active.obj + 0001:000246d8 _P_WorldEffects 200256d8 f g_active.obj + 0001:00024971 _G_SetClientSound 20025971 f g_active.obj + 0001:000249bc _ClientImpacts 200259bc f g_active.obj + 0001:00024ab2 _G_TouchTriggers 20025ab2 f g_active.obj + 0001:00024dbc _SpectatorThink 20025dbc f g_active.obj + 0001:00024f05 _ClientInactivityTimer 20025f05 f g_active.obj + 0001:00025037 _ClientTimerActions 20026037 f g_active.obj + 0001:00025249 _ClientIntermissionThink 20026249 f g_active.obj + 0001:000252c1 _ClientEvents 200262c1 f g_active.obj + 0001:00025640 _SendPendingPredictableEvents 20026640 f g_active.obj + 0001:0002573d _ClientThink_real 2002673d f g_active.obj + 0001:00025fa2 _ClientThink 20026fa2 f g_active.obj + 0001:00026010 _G_RunClient 20027010 f g_active.obj + 0001:00026051 _SpectatorClientEndFrame 20027051 f g_active.obj + 0001:000261cf _ClientEndFrame 200271cf f g_active.obj + 0001:00026340 _UpdateTournamentInfo 20027340 f g_arenas.obj + 0001:00026645 _SpawnModelsOnVictoryPads 20027645 f g_arenas.obj + 0001:000271d9 _Svcmd_AbortPodium_f 200281d9 f g_arenas.obj + 0001:00027220 _trap_Cvar_VariableValue 20028220 f g_bot.obj + 0001:00027254 _G_ParseInfos 20028254 f g_bot.obj + 0001:00027415 _G_GetArenaInfoByMap 20028415 f g_bot.obj + 0001:00027473 _G_AddRandomBot 20028473 f g_bot.obj + 0001:00027709 _G_RemoveRandomBot 20028709 f g_bot.obj + 0001:000277f3 _G_CountHumanPlayers 200287f3 f g_bot.obj + 0001:00027884 _G_CountBotPlayers 20028884 f g_bot.obj + 0001:00027985 _G_CheckMinimumPlayers 20028985 f g_bot.obj + 0001:00027b91 _G_CheckBotSpawn 20028b91 f g_bot.obj + 0001:00027ce9 _G_RemoveQueuedBotBegin 20028ce9 f g_bot.obj + 0001:00027d2a _G_BotConnect 20028d2a f g_bot.obj + 0001:00027df9 _Svcmd_AddBot_f 20028df9 f g_bot.obj + 0001:000284ba _botdriverThink 200294ba f g_bot.obj + 0001:0002867e _G_AddPrivateBot 2002967e f g_bot.obj + 0001:00028c47 _Svcmd_BotList_f 20029c47 f g_bot.obj + 0001:00028df1 _G_GetBotInfoByNumber 20029df1 f g_bot.obj + 0001:00028e2f _G_GetBotInfoByName 20029e2f f g_bot.obj + 0001:00028e95 _G_InitBots 20029e95 f g_bot.obj + 0001:00029720 _SortHub 2002a720 f g_client.obj + 0001:0002975c _func_hubvote_think 2002a75c f g_client.obj + 0001:00029ba5 _spawn_hubvote 2002aba5 f g_client.obj + 0001:00029c03 _SP_info_player_postvote 2002ac03 f g_client.obj + 0001:00029c6d _SP_info_player_deathmatch 2002ac6d f g_client.obj + 0001:00029d09 _SP_info_player_start 2002ad09 f g_client.obj + 0001:00029d27 _SP_info_player_intermission 2002ad27 f g_client.obj + 0001:00029d2c _SpotWouldTelefrag 2002ad2c f g_client.obj + 0001:00029e05 _SelectNearestDeathmatchSpawnPoint 2002ae05 f g_client.obj + 0001:00029f52 _SelectRandomDeathmatchSpawnPoint 2002af52 f g_client.obj + 0001:0002a055 _SelectRandomDistantSpawnPoint 2002b055 f g_client.obj + 0001:0002a21b _SelectClosestSpawnPoint 2002b21b f g_client.obj + 0001:0002a37a _SelectRandomFurthestSpawnPoint 2002b37a f g_client.obj + 0001:0002a71f _SelectRandomDistantSpawnPoint2 2002b71f f g_client.obj + 0001:0002a926 _SelectSpawnPoint 2002b926 f g_client.obj + 0001:0002aa38 _SelectInitialSpawnPoint 2002ba38 f g_client.obj + 0001:0002ab41 _SelectSpectatorSpawnPoint 2002bb41 f g_client.obj + 0001:0002ab91 _InitBodyQue 2002bb91 f g_client.obj + 0001:0002abee _BodySink 2002bbee f g_client.obj + 0001:0002ac49 _CopyToBodyQue 2002bc49 f g_client.obj + 0001:0002afc9 _SetClientViewAngle 2002bfc9 f g_client.obj + 0001:0002b097 _respawn 2002c097 f g_client.obj + 0001:0002b0e3 _TeamCount 2002c0e3 f g_client.obj + 0001:0002b15e _TeamLeader 2002c15e f g_client.obj + 0001:0002b1db _PickTeam 2002c1db f g_client.obj + 0001:0002b23f _ClientUserinfoChanged 2002c23f f g_client.obj + 0001:0002ba4d _ClientConnect 2002ca4d f g_client.obj + 0001:0002bc99 _ClientBegin 2002cc99 f g_client.obj + 0001:0002bdfc _ClientSpawn 2002cdfc f g_client.obj + 0001:0002c8ac _ClientDisconnect 2002d8ac f g_client.obj + 0001:0002cb00 _DeathmatchScoreboardMessage 2002db00 f g_cmds.obj + 0001:0002cda9 _Cmd_Score_f 2002dda9 f g_cmds.obj + 0001:0002cdba _CheatsOk 2002ddba f g_cmds.obj + 0001:0002ce2f _ConcatArgs 2002de2f f g_cmds.obj + 0001:0002cf31 _SanitizeString 2002df31 f g_cmds.obj + 0001:0002cfa3 _ClientNumberFromString 2002dfa3 f g_cmds.obj + 0001:0002d16e _Cmd_Give_f 2002e16e f g_cmds.obj + 0001:0002d5e6 _Cmd_God_f 2002e5e6 f g_cmds.obj + 0001:0002d660 _Cmd_Notarget_f 2002e660 f g_cmds.obj + 0001:0002d6da _Cmd_Noclip_f 2002e6da f g_cmds.obj + 0001:0002d765 _Cmd_LevelShot_f 2002e765 f g_cmds.obj + 0001:0002d7c8 _Cmd_TeamTask_f 2002e7c8 f g_cmds.obj + 0001:0002d895 _Cmd_Kill_f 2002e895 f g_cmds.obj + 0001:0002d90c _BroadcastTeamChange 2002e90c f g_cmds.obj + 0001:0002d9d7 _SetTeam 2002e9d7 f g_cmds.obj + 0001:0002dddb _StopFollowing 2002eddb f g_cmds.obj + 0001:0002de67 _Cmd_Team_f 2002ee67 f g_cmds.obj + 0001:0002e011 _Cmd_Follow_f 2002f011 f g_cmds.obj + 0001:0002e15d _Cmd_FollowCycle_f 2002f15d f g_cmds.obj + 0001:0002e299 _G_Say 2002f299 f g_cmds.obj + 0001:0002e6ea _G_Voice 2002f6ea f g_cmds.obj + 0001:0002e87d _Cmd_GameCommand_f 2002f87d f g_cmds.obj + 0001:0002e956 _Cmd_Where_f 2002f956 f g_cmds.obj + 0001:0002e992 _Cmd_CallVote_f 2002f992 f g_cmds.obj + 0001:0002efbf _Cmd_Vote_f 2002ffbf f g_cmds.obj + 0001:0002f124 _Cmd_CallTeamVote_f 20030124 f g_cmds.obj + 0001:0002f873 _Cmd_TeamVote_f 20030873 f g_cmds.obj + 0001:0002fa37 _Cmd_SetViewpos_f 20030a37 f g_cmds.obj + 0001:0002fb49 _Cmd_Stats_f 20030b49 f g_cmds.obj + 0001:0002fb4e _Cmd_DragonDeploy_f 20030b4e f g_cmds.obj + 0001:0002fcce _ClientCommand 20030cce f g_cmds.obj + 0001:00030a20 _PrivateBotOwnerTeam 20031a20 f g_combat.obj + 0001:00030aa6 _ScorePlum 20031aa6 f g_combat.obj + 0001:00030af9 _AddScore 20031af9 f g_combat.obj + 0001:00030c2f _TossClientItems 20031c2f f g_combat.obj + 0001:000311f8 _LookAtKiller 200321f8 f g_combat.obj + 0001:000312d7 _GibEntity 200322d7 f g_combat.obj + 0001:00031312 _body_die 20032312 f g_combat.obj + 0001:0003134b _CheckAlmostCapture 2003234b f g_combat.obj + 0001:00031519 _CheckAlmostScored 20032519 f g_combat.obj + 0001:00031621 _player_die 20032621 f g_combat.obj + 0001:00031fac _CheckArmor 20032fac f g_combat.obj + 0001:0003203f _RaySphereIntersections 2003303f f g_combat.obj + 0001:00032242 _G_Damage 20033242 f g_combat.obj + 0001:0003299a _CanDamage 2003399a f g_combat.obj + 0001:00032b72 _G_RadiusDamage 20033b72 f g_combat.obj + 0001:00032e30 _Pickup_Powerup 20033e30 f g_items.obj + 0001:0003305f _Pickup_Holdable 2003405f f g_items.obj + 0001:0003322b _Add_Ammo 2003422b f g_items.obj + 0001:00033405 _Pickup_Ammo 20034405 f g_items.obj + 0001:0003349e _Pickup_Weapon 2003449e f g_items.obj + 0001:000336df _Pickup_Health 200346df f g_items.obj + 0001:000337e5 _Pickup_Armor 200347e5 f g_items.obj + 0001:0003385b _PKA_RestoreItem 2003485b f g_items.obj + 0001:000339f5 _RespawnItem 200349f5 f g_items.obj + 0001:00033c79 _PlayerRadiateThink 20034c79 f g_items.obj + 0001:00033eac _ItemRadiateThink 20034eac f g_items.obj + 0001:00033fb9 _Touch_Item 20034fb9 f g_items.obj + 0001:00034872 _Remove_Holdable 20035872 f g_items.obj + 0001:000348bc _Remove_Ammo 200358bc f g_items.obj + 0001:000349db _Remove_Weapon 200359db f g_items.obj + 0001:00034bae _Remove_Health 20035bae f g_items.obj + 0001:00034c00 _Remove_Armor 20035c00 f g_items.obj + 0001:00034c7a _Remove_Powerup 20035c7a f g_items.obj + 0001:00034cc7 _Touch_Item_Remove 20035cc7 f g_items.obj + 0001:00034eb8 _LaunchItem 20035eb8 f g_items.obj + 0001:00035061 _Drop_Item 20036061 f g_items.obj + 0001:0003531e _Throw_Item 2003631e f g_items.obj + 0001:0003537a _Use_Item 2003637a f g_items.obj + 0001:0003538b _FinishSpawningItem 2003638b f g_items.obj + 0001:00035866 _G_CheckTeamItems 20036866 f g_items.obj + 0001:000358f6 _ClearRegisteredItems 200368f6 f g_items.obj + 0001:00035948 _RegisterItem 20036948 f g_items.obj + 0001:0003597b _SaveRegisteredItems 2003697b f g_items.obj + 0001:00035a2c _G_ItemDisabled 20036a2c f g_items.obj + 0001:00035a61 _G_SpawnItem 20036a61 f g_items.obj + 0001:00035e3c _G_SlideItem 20036e3c f g_items.obj + 0001:00035fb4 _G_BounceItem 20036fb4 f g_items.obj + 0001:000361cd _G_RunItem 200371cd f g_items.obj + 0001:00036380 _vmMain 20037380 f g_main.obj + 0001:0003648a _G_Printf 2003748a f g_main.obj + 0001:000364d3 _G_Error 200374d3 f g_main.obj + 0001:0003651c _G_FindTeams 2003751c f g_main.obj + 0001:000366de _G_RemapTeamShaders 200376de f g_main.obj + 0001:000366e3 _G_RegisterCvars 200376e3 f g_main.obj + 0001:000367b9 _G_UpdateCvars 200377b9 f g_main.obj + 0001:0003687c _G_InitGame 2003787c f g_main.obj + 0001:00036bee _G_ShutdownGame 20037bee f g_main.obj + 0001:00036c53 _Com_Error 20037c53 f g_main.obj + 0001:00036ca1 _Com_Printf 20037ca1 f g_main.obj + 0001:00036cef _AddTournamentPlayer 20037cef f g_main.obj + 0001:00036e11 _RemoveTournamentLoser 20037e11 f g_main.obj + 0001:00036e63 _RemoveTournamentWinner 20037e63 f g_main.obj + 0001:00036eb5 _AdjustTournamentScores 20037eb5 f g_main.obj + 0001:00036f75 _SortRanks 20037f75 f g_main.obj + 0001:000370c1 _CalculateRanks 200380c1 f g_main.obj + 0001:000375c4 _SendScoreboardMessageToAllClients 200385c4 f g_main.obj + 0001:0003761b _MoveClientToIntermission 2003861b f g_main.obj + 0001:00037759 _FindIntermissionPoint 20038759 f g_main.obj + 0001:00037849 _BeginIntermission 20038849 f g_main.obj + 0001:000378f8 _ExitLevel 200388f8 f g_main.obj + 0001:00037a33 _G_LogPrintf 20038a33 f g_main.obj + 0001:00037b52 _LogExit 20038b52 f g_main.obj + 0001:00037c74 _CheckIntermissionExit 20038c74 f g_main.obj + 0001:00037df4 _ScoreIsTied 20038df4 f g_main.obj + 0001:00037e69 _CheckExitRules 20038e69 f g_main.obj + 0001:000380fe _CheckTournament 200390fe f g_main.obj + 0001:000383ca _CheckVote 200393ca f g_main.obj + 0001:000384b2 _PrintTeam 200394b2 f g_main.obj + 0001:00038505 _SetLeader 20039505 f g_main.obj + 0001:0003867b _CheckTeamLeader 2003967b f g_main.obj + 0001:000387a9 _CheckTeamVote 200397a9 f g_main.obj + 0001:000388f6 _CheckCvars 200398f6 f g_main.obj + 0001:0003895b _G_RunThink 2003995b f g_main.obj + 0001:000389c6 _G_RunFrame 200399c6 f g_main.obj + 0001:00038d00 _G_Alloc 20039d00 f g_mem.obj + 0001:00038d85 _G_InitMemory 20039d85 f g_mem.obj + 0001:00038d94 _Svcmd_GameMem_f 20039d94 f g_mem.obj + 0001:00038dc0 _SP_info_camp 20039dc0 f g_misc.obj + 0001:00038dd8 _SP_info_null 20039dd8 f g_misc.obj + 0001:00038de9 _SP_info_notnull 20039de9 f g_misc.obj + 0001:00038e01 _SP_light 20039e01 f g_misc.obj + 0001:00038e12 _TeleportPlayer 20039e12 f g_misc.obj + 0001:00039073 _SP_misc_teleporter_dest 2003a073 f g_misc.obj + 0001:00039078 _SP_misc_model 2003a078 f g_misc.obj + 0001:00039089 _locateCamera 2003a089 f g_misc.obj + 0001:000391f8 _SP_misc_portal_surface 2003a1f8 f g_misc.obj + 0001:000392bf _SP_misc_portal_camera 2003a2bf f g_misc.obj + 0001:00039354 _Use_Shooter 2003a354 f g_misc.obj + 0001:000397ad _InitShooter 2003a7ad f g_misc.obj + 0001:00039933 _SP_shooter_rocket 2003a933 f g_misc.obj + 0001:00039946 _SP_shooter_plasma 2003a946 f g_misc.obj + 0001:00039959 _SP_shooter_grenade 2003a959 f g_misc.obj + 0001:0003996c _SP_shooter_shell 2003a96c f g_misc.obj + 0001:0003997f _SP_shooter_rail 2003a97f f g_misc.obj + 0001:00039992 _SP_shooter_lightning 2003a992 f g_misc.obj + 0001:000399a5 _SP_shooter_bullet 2003a9a5 f g_misc.obj + 0001:000399b8 _SP_shooter_nail 2003a9b8 f g_misc.obj + 0001:000399cb _SP_shooter_beartrap 2003a9cb f g_misc.obj + 0001:000399e0 _alt_vtos 2003a9e0 f g_missile.obj + 0001:00039a55 _G_BounceMissile 2003aa55 f g_missile.obj + 0001:00039db4 _G_ExplodeMissile 2003adb4 f g_missile.obj + 0001:00039ef8 _G_MissileImpact 2003aef8 f g_missile.obj + 0001:0003a73a _G_RunMissile 2003b73a f g_missile.obj + 0001:0003af1c _AutoSentry_BaseDeath 2003bf1c f g_missile.obj + 0001:0003af41 _AutoSentry_TurretDeath 2003bf41 f g_missile.obj + 0001:0003b00a _AutoSentry_BaseDie 2003c00a f g_missile.obj + 0001:0003b01b _AutoSentry_TurretDie 2003c01b f g_missile.obj + 0001:0003b02c _AutoSentry_Touch 2003c02c f g_missile.obj + 0001:0003b031 _AutoSentryBase_Think 2003c031 f g_missile.obj + 0001:0003b174 _AutoSentryAimed 2003c174 f g_missile.obj + 0001:0003b296 _AutoSentry_Fire 2003c296 f g_missile.obj + 0001:0003b588 _AutoSentryAttack_Think 2003c588 f g_missile.obj + 0001:0003b8a4 _Find_Sentry 2003c8a4 f g_missile.obj + 0001:0003b908 _AutoSentryFindTarget 2003c908 f g_missile.obj + 0001:0003bc74 _AutoSentryTurret_Rotate 2003cc74 f g_missile.obj + 0001:0003bd91 _AutoSentryTurret_Think 2003cd91 f g_missile.obj + 0001:0003be97 _AutoSentryEnable_Think 2003ce97 f g_missile.obj + 0001:0003c224 _AutoSentryDeploy_Think 2003d224 f g_missile.obj + 0001:0003c2ac _fire_autosentry 2003d2ac f g_missile.obj + 0001:0003c53a _PersonalSentry_Exit 2003d53a f g_missile.obj + 0001:0003c669 _PersonalSentry_Fire 2003d669 f g_missile.obj + 0001:0003c8d4 _PersonalSentryAttack_Think 2003d8d4 f g_missile.obj + 0001:0003cc7c _PersonalSentry_Think 2003dc7c f g_missile.obj + 0001:0003cf54 _G_AddPersonalSentry 2003df54 f g_missile.obj + 0001:0003d215 _ignore_entity 2003e215 f g_missile.obj + 0001:0003d304 _G_airfistThink 2003e304 f g_missile.obj + 0001:0003da53 _fire_airfist 2003ea53 f g_missile.obj + 0001:0003dd50 _NailTouch 2003ed50 f g_missile.obj + 0001:0003ddc4 _NailDeath 2003edc4 f g_missile.obj + 0001:0003ddf8 _fire_nailgun 2003edf8 f g_missile.obj + 0001:0003dfc0 _GravityTouch 2003efc0 f g_missile.obj + 0001:0003dffd _GravityThink 2003effd f g_missile.obj + 0001:0003ea9b _Release_Gravity 2003fa9b f g_missile.obj + 0001:0003ecc1 _fire_gravity 2003fcc1 f g_missile.obj + 0001:0003eec5 _BearTrapDeath 2003fec5 f g_missile.obj + 0001:0003ef33 _BearTrapKill 2003ff33 f g_missile.obj + 0001:0003ef44 _BearTrapFollow 2003ff44 f g_missile.obj + 0001:0003f2c3 _BearTrapTouch 200402c3 f g_missile.obj + 0001:0003f45c _Beartrap_Think 2004045c f g_missile.obj + 0001:0003f52b _fire_beartrap 2004052b f g_missile.obj + 0001:0003f90c _fire_plasma 2004090c f g_missile.obj + 0001:0003facc _fire_grenade 20040acc f g_missile.obj + 0001:0003fc95 _fire_bfg 20040c95 f g_missile.obj + 0001:0003fe55 _fire_rocket 20040e55 f g_missile.obj + 0001:00040015 _DragonReturn 20041015 f g_missile.obj + 0001:00040403 _DragonTouch 20041403 f g_missile.obj + 0001:000405a7 _fire_grapple 200415a7 f g_missile.obj + 0001:000407d8 _fire_dragon_deploy 200417d8 f g_missile.obj + 0001:00040bde _activate_dragon_deploy 20041bde f g_missile.obj + 0001:00040e70 _G_TestEntityPosition 20041e70 f g_mover.obj + 0001:00040f66 _G_CreateRotationMatrix 20041f66 f g_mover.obj + 0001:00040f98 _G_TransposeMatrix 20041f98 f g_mover.obj + 0001:00040ffa _G_RotatePoint 20041ffa f g_mover.obj + 0001:0004108b _G_TryPushingEntity 2004208b f g_mover.obj + 0001:00041681 _G_CheckProxMinePosition 20042681 f g_mover.obj + 0001:00041760 _G_TryPushingProxMine 20042760 f g_mover.obj + 0001:000418ff _G_QPush 200428ff f g_mover.obj + 0001:00041989 _G_MoverPush 20042989 f g_mover.obj + 0001:00041f76 _G_MoverTeam 20042f76 f g_mover.obj + 0001:00042182 _G_zombieMove 20043182 f g_mover.obj + 0001:0004228b _G_RunMover 2004328b f g_mover.obj + 0001:000422e6 _SetMoverState 200432e6 f g_mover.obj + 0001:00042529 _MatchTeam 20043529 f g_mover.obj + 0001:00042561 _ReturnToPos1 20043561 f g_mover.obj + 0001:000425b0 _Reached_BinaryMover 200435b0 f g_mover.obj + 0001:000426e5 _Use_BinaryMover 200436e5 f g_mover.obj + 0001:000428c7 _InitMover 200438c7 f g_mover.obj + 0001:00042bed _Blocked_Door 20043bed f g_mover.obj + 0001:00042d75 _Touch_DoorTrigger 20043d75 f g_mover.obj + 0001:00042f3b _Think_SpawnNewDoorTrigger 20043f3b f g_mover.obj + 0001:00043141 _Think_MatchTeam 20044141 f g_mover.obj + 0001:00043162 _SP_func_door 20044162 f g_mover.obj + 0001:000434fc _Touch_Plat 200444fc f g_mover.obj + 0001:00043542 _Touch_PlatCenterTrigger 20044542 f g_mover.obj + 0001:00043581 _SpawnPlatTrigger 20044581 f g_mover.obj + 0001:0004372e _SP_func_plat 2004472e f g_mover.obj + 0001:00043926 _Touch_Button 20044926 f g_mover.obj + 0001:00043959 _SP_func_button 20044959 f g_mover.obj + 0001:00043b7f _Think_BeginMoving 20044b7f f g_mover.obj + 0001:00043b9a _Reached_Train 20044b9a f g_mover.obj + 0001:00043d75 _Think_SetupTrainTargets 20044d75 f g_mover.obj + 0001:00043eb5 _SP_path_corner 20044eb5 f g_mover.obj + 0001:00043eef _SP_func_train 20044eef f g_mover.obj + 0001:00043ff4 _SP_func_static 20044ff4 f g_mover.obj + 0001:0004406c _SP_func_rotating 2004506c f g_mover.obj + 0001:000441b4 _SP_func_bobbing 200451b4 f g_mover.obj + 0001:0004430b _SP_func_pendulum 2004530b f g_mover.obj + 0001:00044497 _Touch_Zombie 20045497 f g_mover.obj + 0001:0004450b _Zombie_Think 2004550b f g_mover.obj + 0001:00044553 _SP_func_zombie 20045553 f g_mover.obj + 0001:00044a70 _G_WriteClientSessionData 20045a70 f g_session.obj + 0001:00044b41 _G_ReadSessionData 20045b41 f g_session.obj + 0001:00044c2f _G_InitSessionData 20045c2f f g_session.obj + 0001:00044d2d _G_InitWorldSession 20045d2d f g_session.obj + 0001:00044d8d _G_WriteSessionData 20045d8d f g_session.obj + 0001:00044e10 _G_SpawnString 20045e10 f g_spawn.obj + 0001:00044e83 _G_SpawnFloat 20045e83 f g_spawn.obj + 0001:00044eb8 _G_SpawnInt 20045eb8 f g_spawn.obj + 0001:00044eed _G_SpawnVector 20045eed f g_spawn.obj + 0001:00044f34 _SP_item_botroam 20045f34 f g_spawn.obj + 0001:00044f39 _G_CallSpawn 20045f39 f g_spawn.obj + 0001:00045060 _G_NewString 20046060 f g_spawn.obj + 0001:00045118 _G_ParseField 20046118 f g_spawn.obj + 0001:0004527b _G_SpawnGEntityFromSpawnVars 2004627b f g_spawn.obj + 0001:00045463 _G_AddSpawnVarToken 20046463 f g_spawn.obj + 0001:000454d8 _G_ParseSpawnVars 200464d8 f g_spawn.obj + 0001:00045620 _SP_worldspawn 20046620 f g_spawn.obj + 0001:00045815 _G_SpawnEntitiesFromString 20046815 f g_spawn.obj + 0001:00045870 _G_FilterPacket 20046870 f g_svcmds.obj + 0001:00045963 _G_ProcessIPBans 20046963 f g_svcmds.obj + 0001:00045d77 _Svcmd_AddIP_f 20046d77 f g_svcmds.obj + 0001:00045dc2 _Svcmd_RemoveIP_f 20046dc2 f g_svcmds.obj + 0001:00045eae _Svcmd_EntityList_f 20046eae f g_svcmds.obj + 0001:000460a5 _ClientForString 200470a5 f g_svcmds.obj + 0001:000461aa _Svcmd_ForceTeam_f 200471aa f g_svcmds.obj + 0001:00046232 _ConsoleCommand 20047232 f g_svcmds.obj + 0001:00046490 _dllEntry 20047490 f g_syscalls.obj + 0001:0004649d _PASSFLOAT 2004749d f g_syscalls.obj + 0001:000464ae _trap_Printf 200474ae f g_syscalls.obj + 0001:000464c2 _trap_Error 200474c2 f g_syscalls.obj + 0001:000464d6 _trap_Milliseconds 200474d6 f g_syscalls.obj + 0001:000464e6 _trap_Argc 200474e6 f g_syscalls.obj + 0001:000464f6 _trap_Argv 200474f6 f g_syscalls.obj + 0001:00046512 _trap_FS_FOpenFile 20047512 f g_syscalls.obj + 0001:0004652e _trap_FS_Read 2004752e f g_syscalls.obj + 0001:0004654a _trap_FS_Write 2004754a f g_syscalls.obj + 0001:00046566 _trap_FS_FCloseFile 20047566 f g_syscalls.obj + 0001:0004657a _trap_FS_GetFileList 2004757a f g_syscalls.obj + 0001:0004659a _trap_FS_Seek 2004759a f g_syscalls.obj + 0001:000465b6 _trap_SendConsoleCommand 200475b6 f g_syscalls.obj + 0001:000465ce _trap_Cvar_Register 200475ce f g_syscalls.obj + 0001:000465ee _trap_Cvar_Update 200475ee f g_syscalls.obj + 0001:00046602 _trap_Cvar_Set 20047602 f g_syscalls.obj + 0001:0004661a _trap_Cvar_VariableIntegerValue 2004761a f g_syscalls.obj + 0001:0004662e _trap_Cvar_VariableStringBuffer 2004762e f g_syscalls.obj + 0001:0004664a _trap_LocateGameData 2004764a f g_syscalls.obj + 0001:0004666e _trap_DropClient 2004766e f g_syscalls.obj + 0001:00046686 _trap_SendServerCommand 20047686 f g_syscalls.obj + 0001:0004669e _trap_SetConfigstring 2004769e f g_syscalls.obj + 0001:000466b6 _trap_GetConfigstring 200476b6 f g_syscalls.obj + 0001:000466d2 _trap_GetUserinfo 200476d2 f g_syscalls.obj + 0001:000466ee _trap_SetUserinfo 200476ee f g_syscalls.obj + 0001:00046706 _trap_GetServerinfo 20047706 f g_syscalls.obj + 0001:0004671e _trap_SetBrushModel 2004771e f g_syscalls.obj + 0001:00046736 _trap_Trace 20047736 f g_syscalls.obj + 0001:00046762 _trap_TraceCapsule 20047762 f g_syscalls.obj + 0001:0004678e _trap_PointContents 2004778e f g_syscalls.obj + 0001:000467a6 _trap_InPVS 200477a6 f g_syscalls.obj + 0001:000467be _trap_InPVSIgnorePortals 200477be f g_syscalls.obj + 0001:000467d6 _trap_AdjustAreaPortalState 200477d6 f g_syscalls.obj + 0001:000467ee _trap_AreasConnected 200477ee f g_syscalls.obj + 0001:00046806 _trap_LinkEntity 20047806 f g_syscalls.obj + 0001:0004681a _trap_UnlinkEntity 2004781a f g_syscalls.obj + 0001:0004682e _trap_EntitiesInBox 2004782e f g_syscalls.obj + 0001:0004684e _trap_EntityContact 2004784e f g_syscalls.obj + 0001:0004686a _trap_EntityContactCapsule 2004786a f g_syscalls.obj + 0001:00046886 _trap_BotAllocateClient 20047886 f g_syscalls.obj + 0001:00046896 _trap_BotFreeClient 20047896 f g_syscalls.obj + 0001:000468aa _trap_GetUsercmd 200478aa f g_syscalls.obj + 0001:000468c2 _trap_GetEntityToken 200478c2 f g_syscalls.obj + 0001:000468da _trap_DebugPolygonCreate 200478da f g_syscalls.obj + 0001:000468f6 _trap_DebugPolygonDelete 200478f6 f g_syscalls.obj + 0001:0004690a _trap_RealTime 2004790a f g_syscalls.obj + 0001:0004691e _trap_SnapVector 2004791e f g_syscalls.obj + 0001:00046932 _trap_BotLibSetup 20047932 f g_syscalls.obj + 0001:00046945 _trap_BotLibShutdown 20047945 f g_syscalls.obj + 0001:00046958 _trap_BotLibVarSet 20047958 f g_syscalls.obj + 0001:00046973 _trap_BotLibVarGet 20047973 f g_syscalls.obj + 0001:00046992 _trap_BotLibDefine 20047992 f g_syscalls.obj + 0001:000469a9 _trap_BotLibStartFrame 200479a9 f g_syscalls.obj + 0001:000469c9 _trap_BotLibLoadMap 200479c9 f g_syscalls.obj + 0001:000469e0 _trap_BotLibUpdateEntity 200479e0 f g_syscalls.obj + 0001:000469fb _trap_BotLibTest 200479fb f g_syscalls.obj + 0001:00046a1e _trap_BotGetSnapshotEntity 20047a1e f g_syscalls.obj + 0001:00046a39 _trap_BotGetServerCommand 20047a39 f g_syscalls.obj + 0001:00046a58 _trap_BotUserCommand 20047a58 f g_syscalls.obj + 0001:00046a73 _trap_AAS_EntityInfo 20047a73 f g_syscalls.obj + 0001:00046a8e _trap_AAS_Initialized 20047a8e f g_syscalls.obj + 0001:00046aa1 _trap_AAS_PresenceTypeBoundingBox 20047aa1 f g_syscalls.obj + 0001:00046ac0 _trap_AAS_Time 20047ac0 f g_syscalls.obj + 0001:00046adc _trap_AAS_PointAreaNum 20047adc f g_syscalls.obj + 0001:00046af3 _trap_AAS_PointReachabilityAreaIndex 20047af3 f g_syscalls.obj + 0001:00046b0a _trap_AAS_TraceAreas 20047b0a f g_syscalls.obj + 0001:00046b31 _trap_AAS_BBoxAreas 20047b31 f g_syscalls.obj + 0001:00046b54 _trap_AAS_AreaInfo 20047b54 f g_syscalls.obj + 0001:00046b6f _trap_AAS_PointContents 20047b6f f g_syscalls.obj + 0001:00046b86 _trap_AAS_NextBSPEntity 20047b86 f g_syscalls.obj + 0001:00046b9d _trap_AAS_ValueForBSPEpairKey 20047b9d f g_syscalls.obj + 0001:00046bc0 _trap_AAS_VectorForBSPEpairKey 20047bc0 f g_syscalls.obj + 0001:00046bdf _trap_AAS_FloatForBSPEpairKey 20047bdf f g_syscalls.obj + 0001:00046bfe _trap_AAS_IntForBSPEpairKey 20047bfe f g_syscalls.obj + 0001:00046c1d _trap_AAS_AreaReachability 20047c1d f g_syscalls.obj + 0001:00046c34 _trap_AAS_AreaTravelTimeToGoalArea 20047c34 f g_syscalls.obj + 0001:00046c57 _trap_AAS_EnableRoutingArea 20047c57 f g_syscalls.obj + 0001:00046c72 _trap_AAS_PredictRoute 20047c72 f g_syscalls.obj + 0001:00046cb1 _trap_AAS_AlternativeRouteGoals 20047cb1 f g_syscalls.obj + 0001:00046ce4 _trap_AAS_Swimming 20047ce4 f g_syscalls.obj + 0001:00046cfb _trap_AAS_PredictClientMovement 20047cfb f g_syscalls.obj + 0001:00046d4b _trap_EA_Say 20047d4b f g_syscalls.obj + 0001:00046d66 _trap_EA_SayTeam 20047d66 f g_syscalls.obj + 0001:00046d81 _trap_EA_Command 20047d81 f g_syscalls.obj + 0001:00046d9c _trap_EA_Action 20047d9c f g_syscalls.obj + 0001:00046db7 _trap_EA_Gesture 20047db7 f g_syscalls.obj + 0001:00046dce _trap_EA_Talk 20047dce f g_syscalls.obj + 0001:00046de5 _trap_EA_Attack 20047de5 f g_syscalls.obj + 0001:00046dfc _trap_EA_Use 20047dfc f g_syscalls.obj + 0001:00046e13 _trap_EA_Respawn 20047e13 f g_syscalls.obj + 0001:00046e2a _trap_EA_Crouch 20047e2a f g_syscalls.obj + 0001:00046e41 _trap_EA_MoveUp 20047e41 f g_syscalls.obj + 0001:00046e58 _trap_EA_MoveDown 20047e58 f g_syscalls.obj + 0001:00046e6f _trap_EA_MoveForward 20047e6f f g_syscalls.obj + 0001:00046e86 _trap_EA_MoveBack 20047e86 f g_syscalls.obj + 0001:00046e9d _trap_EA_MoveLeft 20047e9d f g_syscalls.obj + 0001:00046eb4 _trap_EA_MoveRight 20047eb4 f g_syscalls.obj + 0001:00046ecb _trap_EA_SelectWeapon 20047ecb f g_syscalls.obj + 0001:00046ee6 _trap_EA_Jump 20047ee6 f g_syscalls.obj + 0001:00046efd _trap_EA_DelayedJump 20047efd f g_syscalls.obj + 0001:00046f14 _trap_EA_Move 20047f14 f g_syscalls.obj + 0001:00046f3c _trap_EA_View 20047f3c f g_syscalls.obj + 0001:00046f57 _trap_EA_EndRegular 20047f57 f g_syscalls.obj + 0001:00046f7b _trap_EA_GetInput 20047f7b f g_syscalls.obj + 0001:00046fa3 _trap_EA_ResetInput 20047fa3 f g_syscalls.obj + 0001:00046fba _trap_BotLoadCharacter 20047fba f g_syscalls.obj + 0001:00046fde _trap_BotFreeCharacter 20047fde f g_syscalls.obj + 0001:00046ff5 _trap_Characteristic_Float 20047ff5 f g_syscalls.obj + 0001:00047019 _trap_Characteristic_BFloat 20048019 f g_syscalls.obj + 0001:00047057 _trap_Characteristic_Integer 20048057 f g_syscalls.obj + 0001:00047072 _trap_Characteristic_BInteger 20048072 f g_syscalls.obj + 0001:00047095 _trap_Characteristic_String 20048095 f g_syscalls.obj + 0001:000470b8 _trap_BotAllocChatState 200480b8 f g_syscalls.obj + 0001:000470cb _trap_BotFreeChatState 200480cb f g_syscalls.obj + 0001:000470e2 _trap_BotQueueConsoleMessage 200480e2 f g_syscalls.obj + 0001:00047101 _trap_BotRemoveConsoleMessage 20048101 f g_syscalls.obj + 0001:0004711c _trap_BotNextConsoleMessage 2004811c f g_syscalls.obj + 0001:00047137 _trap_BotNumConsoleMessages 20048137 f g_syscalls.obj + 0001:0004714e _trap_BotInitialChat 2004814e f g_syscalls.obj + 0001:0004718d _trap_BotNumInitialChats 2004818d f g_syscalls.obj + 0001:000471a8 _trap_BotReplyChat 200481a8 f g_syscalls.obj + 0001:000471eb _trap_BotChatLength 200481eb f g_syscalls.obj + 0001:00047202 _trap_BotEnterChat 20048202 f g_syscalls.obj + 0001:00047221 _trap_BotGetChatMessage 20048221 f g_syscalls.obj + 0001:00047240 _trap_StringContains 20048240 f g_syscalls.obj + 0001:0004725f _trap_BotFindMatch 2004825f f g_syscalls.obj + 0001:0004727e _trap_BotMatchVariable 2004827e f g_syscalls.obj + 0001:000472a1 _trap_UnifyWhiteSpaces 200482a1 f g_syscalls.obj + 0001:000472b8 _trap_BotReplaceSynonyms 200482b8 f g_syscalls.obj + 0001:000472d3 _trap_BotLoadChatFile 200482d3 f g_syscalls.obj + 0001:000472f2 _trap_BotSetChatGender 200482f2 f g_syscalls.obj + 0001:0004730d _trap_BotSetChatName 2004830d f g_syscalls.obj + 0001:0004732c _trap_BotResetGoalState 2004832c f g_syscalls.obj + 0001:00047343 _trap_BotResetAvoidGoals 20048343 f g_syscalls.obj + 0001:0004735a _trap_BotRemoveFromAvoidGoals 2004835a f g_syscalls.obj + 0001:00047375 _trap_BotPushGoal 20048375 f g_syscalls.obj + 0001:00047390 _trap_BotPopGoal 20048390 f g_syscalls.obj + 0001:000473a7 _trap_BotEmptyGoalStack 200483a7 f g_syscalls.obj + 0001:000473be _trap_BotDumpAvoidGoals 200483be f g_syscalls.obj + 0001:000473d5 _trap_BotDumpGoalStack 200483d5 f g_syscalls.obj + 0001:000473ec _trap_BotGoalName 200483ec f g_syscalls.obj + 0001:0004740b _trap_BotGetTopGoal 2004840b f g_syscalls.obj + 0001:00047426 _trap_BotGetSecondGoal 20048426 f g_syscalls.obj + 0001:00047441 _trap_BotChooseLTGItem 20048441 f g_syscalls.obj + 0001:00047464 _trap_BotChooseNBGItem 20048464 f g_syscalls.obj + 0001:00047498 _trap_BotTouchingGoal 20048498 f g_syscalls.obj + 0001:000474b3 _trap_BotItemGoalInVisButNotVisible 200484b3 f g_syscalls.obj + 0001:000474d6 _trap_BotGetLevelItemGoal 200484d6 f g_syscalls.obj + 0001:000474f5 _trap_BotGetNextCampSpotGoal 200484f5 f g_syscalls.obj + 0001:00047510 _trap_BotGetMapLocationGoal 20048510 f g_syscalls.obj + 0001:0004752b _trap_BotAvoidGoalTime 2004852b f g_syscalls.obj + 0001:0004754f _trap_BotSetAvoidGoalTime 2004854f f g_syscalls.obj + 0001:00047577 _trap_BotInitLevelItems 20048577 f g_syscalls.obj + 0001:0004758a _trap_BotUpdateEntityItems 2004858a f g_syscalls.obj + 0001:0004759d _trap_BotLoadItemWeights 2004859d f g_syscalls.obj + 0001:000475b8 _trap_BotFreeItemWeights 200485b8 f g_syscalls.obj + 0001:000475cf _trap_BotInterbreedGoalFuzzyLogic 200485cf f g_syscalls.obj + 0001:000475ee _trap_BotSaveGoalFuzzyLogic 200485ee f g_syscalls.obj + 0001:00047609 _trap_BotMutateGoalFuzzyLogic 20048609 f g_syscalls.obj + 0001:00047629 _trap_BotAllocGoalState 20048629 f g_syscalls.obj + 0001:00047640 _trap_BotFreeGoalState 20048640 f g_syscalls.obj + 0001:00047657 _trap_BotResetMoveState 20048657 f g_syscalls.obj + 0001:0004766e _trap_BotAddAvoidSpot 2004866e f g_syscalls.obj + 0001:0004769a _trap_BotMoveToGoal 2004869a f g_syscalls.obj + 0001:000476bd _trap_BotMoveInDirection 200486bd f g_syscalls.obj + 0001:000476e9 _trap_BotResetAvoidReach 200486e9 f g_syscalls.obj + 0001:00047700 _trap_BotResetLastAvoidReach 20048700 f g_syscalls.obj + 0001:00047717 _trap_BotReachabilityArea 20048717 f g_syscalls.obj + 0001:00047732 _trap_BotMovementViewTarget 20048732 f g_syscalls.obj + 0001:00047762 _trap_BotPredictVisiblePosition 20048762 f g_syscalls.obj + 0001:00047789 _trap_BotAllocMoveState 20048789 f g_syscalls.obj + 0001:0004779c _trap_BotFreeMoveState 2004879c f g_syscalls.obj + 0001:000477b3 _trap_BotInitMoveState 200487b3 f g_syscalls.obj + 0001:000477ce _trap_BotChooseBestFightWeapon 200487ce f g_syscalls.obj + 0001:000477e9 _trap_BotGetWeaponInfo 200487e9 f g_syscalls.obj + 0001:00047808 _trap_BotLoadWeaponWeights 20048808 f g_syscalls.obj + 0001:00047823 _trap_BotAllocWeaponState 20048823 f g_syscalls.obj + 0001:00047836 _trap_BotFreeWeaponState 20048836 f g_syscalls.obj + 0001:0004784d _trap_BotResetWeaponState 2004884d f g_syscalls.obj + 0001:00047864 _trap_GeneticParentsAndChildSelection 20048864 f g_syscalls.obj + 0001:0004788b _trap_PC_LoadSource 2004888b f g_syscalls.obj + 0001:000478a2 _trap_PC_FreeSource 200488a2 f g_syscalls.obj + 0001:000478b9 _trap_PC_ReadToken 200488b9 f g_syscalls.obj + 0001:000478d4 _trap_PC_SourceFileAndLine 200488d4 f g_syscalls.obj + 0001:00047900 _Use_Target_Remove 20048900 f g_target.obj + 0001:000479a1 _SP_target_remove 200489a1 f g_target.obj + 0001:000479b3 _Use_Target_Give 200489b3 f g_target.obj + 0001:00047a54 _SP_target_give 20048a54 f g_target.obj + 0001:00047a66 _Use_target_remove_powerups 20048a66 f g_target.obj + 0001:00047aed _SP_target_remove_powerups 20048aed f g_target.obj + 0001:00047aff _Think_Target_Delay 20048aff f g_target.obj + 0001:00047b1a _Use_Target_Delay 20048b1a f g_target.obj + 0001:00047b9d _SP_target_delay 20048b9d f g_target.obj + 0001:00047c0d _Use_Target_Score 20048c0d f g_target.obj + 0001:00047c32 _SP_target_score 20048c32 f g_target.obj + 0001:00047c5d _Use_Target_Print 20048c5d f g_target.obj + 0001:00047d4c _SP_target_print 20048d4c f g_target.obj + 0001:00047dbb _Use_Target_Speaker 20048dbb f g_target.obj + 0001:00047e6b _SP_target_speaker 20048e6b f g_target.obj + 0001:00048032 _target_laser_think 20049032 f g_target.obj + 0001:0004824e _target_laser_on 2004924e f g_target.obj + 0001:00048277 _target_laser_off 20049277 f g_target.obj + 0001:00048295 _target_laser_use 20049295 f g_target.obj + 0001:000482cc _target_laser_start 200492cc f g_target.obj + 0001:000483c1 _SP_target_laser 200493c1 f g_target.obj + 0001:000483e5 _target_teleporter_use 200493e5 f g_target.obj + 0001:0004843f _SP_target_teleporter 2004943f f g_target.obj + 0001:00048484 _target_relay_use 20049484 f g_target.obj + 0001:00048550 _SP_target_relay 20049550 f g_target.obj + 0001:00048562 _target_kill_use 20049562 f g_target.obj + 0001:00048584 _SP_target_kill 20049584 f g_target.obj + 0001:00048596 _SP_target_position 20049596 f g_target.obj + 0001:000485ae _SP_target_location 200495ae f g_target.obj + 0001:000486e0 _Team_InitGame 200496e0 f g_team.obj + 0001:00048737 _OtherTeam 20049737 f g_team.obj + 0001:00048759 _TeamName 20049759 f g_team.obj + 0001:0004878a _OtherTeamName 2004978a f g_team.obj + 0001:000487bb _TeamColorString 200497bb f g_team.obj + 0001:000487ec _PrintMsg 200497ec f g_team.obj + 0001:0004889f _AddTeamScore 2004989f f g_team.obj + 0001:000489a0 _OnSameTeam 200499a0 f g_team.obj + 0001:000489f7 _Team_SetFlagStatus 200499f7 f g_team.obj + 0001:00048ac8 _Team_CheckDroppedItem 20049ac8 f g_team.obj + 0001:00048b22 _Team_ForceGesture 20049b22 f g_team.obj + 0001:00048b9f _Team_FragBonuses 20049b9f f g_team.obj + 0001:00049570 _Team_CheckHurtCarrier 2004a570 f g_team.obj + 0001:000495ff _Team_ResetFlag 2004a5ff f g_team.obj + 0001:000496b4 _Team_ResetFlags 2004a6b4 f g_team.obj + 0001:000496d6 _Team_ReturnFlagSound 2004a6d6 f g_team.obj + 0001:0004973e _Team_TakeFlagSound 2004a73e f g_team.obj + 0001:00049817 _Team_CaptureFlagSound 2004a817 f g_team.obj + 0001:0004987f _Team_ReturnFlag 2004a87f f g_team.obj + 0001:000498d0 _Team_FreeEntity 2004a8d0 f g_team.obj + 0001:00049924 _Team_DroppedFlagThink 2004a924 f g_team.obj + 0001:00049992 _Team_TouchOurFlag 2004a992 f g_team.obj + 0001:00049e60 _Team_TouchEnemyFlag 2004ae60 f g_team.obj + 0001:00049f0a _Pickup_Team 2004af0a f g_team.obj + 0001:00049fb5 _Team_GetLocation 2004afb5 f g_team.obj + 0001:0004a0a4 _Team_GetLocationMsg 2004b0a4 f g_team.obj + 0001:0004a15a _SelectRandomTeamSpawnPoint 2004b15a f g_team.obj + 0001:0004a248 _SelectCTFSpawnPoint 2004b248 f g_team.obj + 0001:0004a2df _TeamplayInfoMessage 2004b2df f g_team.obj + 0001:0004a5d8 _CheckTeamStatus 2004b5d8 f g_team.obj + 0001:0004a742 _SP_team_CTF_redplayer 2004b742 f g_team.obj + 0001:0004a747 _SP_team_CTF_blueplayer 2004b747 f g_team.obj + 0001:0004a74c _SP_team_CTF_redspawn 2004b74c f g_team.obj + 0001:0004a751 _SP_team_CTF_bluespawn 2004b751 f g_team.obj + 0001:0004a760 _InitTrigger 2004b760 f g_trigger.obj + 0001:0004a7c6 _multi_wait 2004b7c6 f g_trigger.obj + 0001:0004a7d8 _multi_trigger 2004b7d8 f g_trigger.obj + 0001:0004a964 _Use_Multi 2004b964 f g_trigger.obj + 0001:0004a979 _Touch_Multi 2004b979 f g_trigger.obj + 0001:0004a99c _SP_trigger_multiple 2004b99c f g_trigger.obj + 0001:0004aa68 _trigger_always_think 2004ba68 f g_trigger.obj + 0001:0004aa89 _SP_trigger_always 2004ba89 f g_trigger.obj + 0001:0004aaae _trigger_push_touch 2004baae f g_trigger.obj + 0001:0004aad7 _AimAtTarget 2004bad7 f g_trigger.obj + 0001:0004ac4a _SP_trigger_push 2004bc4a f g_trigger.obj + 0001:0004ace9 _Use_target_push 2004bce9 f g_trigger.obj + 0001:0004ad9b _SP_target_push 2004bd9b f g_trigger.obj + 0001:0004aee8 _trigger_teleporter_touch 2004bee8 f g_trigger.obj + 0001:0004af77 _SP_trigger_teleport 2004bf77 f g_trigger.obj + 0001:0004aff4 _postvote_music_think 2004bff4 f g_trigger.obj + 0001:0004b059 _spawn_postvote_music 2004c059 f g_trigger.obj + 0001:0004b0ae _trigger_hubvote_touch 2004c0ae f g_trigger.obj + 0001:0004b18e _SP_trigger_hubvote 2004c18e f g_trigger.obj + 0001:0004b4e1 _trigger_hubalternates_touch 2004c4e1 f g_trigger.obj + 0001:0004b55b _SP_trigger_hubalternates 2004c55b f g_trigger.obj + 0001:0004b5d8 _Svcmd_hubaltvoting_f 2004c5d8 f g_trigger.obj + 0001:0004ba6f _hurt_use 2004ca6f f g_trigger.obj + 0001:0004ba9a _hurt_touch 2004ca9a f g_trigger.obj + 0001:0004bb72 _SP_trigger_hurt 2004cb72 f g_trigger.obj + 0001:0004bc05 _func_timer_think 2004cc05 f g_trigger.obj + 0001:0004bc7f _func_timer_use 2004cc7f f g_trigger.obj + 0001:0004bcb7 _SP_func_timer 2004ccb7 f g_trigger.obj + 0001:0004bd96 _func_lightning_fx_think 2004cd96 f g_trigger.obj + 0001:0004bfc0 _SP_func_lightning_fx 2004cfc0 f g_trigger.obj + 0001:0004c1bc _Use_Gravity 2004d1bc f g_trigger.obj + 0001:0004c20d _Touch_Gravity 2004d20d f g_trigger.obj + 0001:0004c26c _SP_func_local_gravity 2004d26c f g_trigger.obj + 0001:0004c330 _AddRemap 2004d330 f g_utils.obj + 0001:0004c412 _BuildShaderStateConfig 2004d412 f g_utils.obj + 0001:0004c4d5 _G_FindConfigstringIndex 2004d4d5 f g_utils.obj + 0001:0004c5a9 _G_ModelIndex 2004d5a9 f g_utils.obj + 0001:0004c5c3 _G_SoundIndex 2004d5c3 f g_utils.obj + 0001:0004c5e0 _G_TeamCommand 2004d5e0 f g_utils.obj + 0001:0004c658 _G_Find 2004d658 f g_utils.obj + 0001:0004c6dd _G_PickTarget 2004d6dd f g_utils.obj + 0001:0004c79b _G_UseTargets 2004d79b f g_utils.obj + 0001:0004c89b _tv 2004d89b f g_utils.obj + 0001:0004c8e2 _vtos 2004d8e2 f g_utils.obj + 0001:0004c945 _G_SetMovedir 2004d945 f g_utils.obj + 0001:0004ca2e _vectoyaw 2004da2e f g_utils.obj + 0001:0004caeb _G_InitGentity 2004daeb f g_utils.obj + 0001:0004cb2c _G_Spawn 2004db2c f g_utils.obj + 0001:0004cc90 _G_EntitiesFree 2004dc90 f g_utils.obj + 0001:0004cce1 _G_FreeEntity 2004dce1 f g_utils.obj + 0001:0004cd3c _G_TempEntity 2004dd3c f g_utils.obj + 0001:0004cdef _G_KillBox 2004ddef f g_utils.obj + 0001:0004cf2a _G_AddPredictableEvent 2004df2a f g_utils.obj + 0001:0004cf57 _G_AddEvent 2004df57 f g_utils.obj + 0001:0004d039 _G_Sound 2004e039 f g_utils.obj + 0001:0004d063 _G_SetOrigin 2004e063 f g_utils.obj + 0001:0004d0f3 _DebugLine 2004e0f3 f g_utils.obj + 0001:0004d350 _CalcMuzzlePoint 2004e350 f g_weapon.obj + 0001:0004d420 _CalcMuzzlePointOrigin 2004e420 f g_weapon.obj + 0001:0004d4f0 _G_BounceProjectile 2004e4f0 f g_weapon.obj + 0001:0004d5cf _Weapon_Gauntlet 2004e5cf f g_weapon.obj + 0001:0004d5d4 _CheckGauntletAttack 2004e5d4 f g_weapon.obj + 0001:0004d78f _Weapon_fire_gravity 2004e78f f g_weapon.obj + 0001:0004d7db _Weapon_fire_autosentry 2004e7db f g_weapon.obj + 0001:0004d806 _Weapon_fire_beartrap 2004e806 f g_weapon.obj + 0001:0004d833 _Weapon_fire_airfist 2004e833 f g_weapon.obj + 0001:0004da78 _Weapon_fire_nailgun 2004ea78 f g_weapon.obj + 0001:0004dad3 _SnapVectorTowards 2004ead3 f g_weapon.obj + 0001:0004db51 _Bullet_Fire 2004eb51 f g_weapon.obj + 0001:0004de3d _shooter_bullet_fire 2004ee3d f g_weapon.obj + 0001:0004de8a _BFG_Fire 2004ee8a f g_weapon.obj + 0001:0004dee5 _ShotgunPellet 2004eee5 f g_weapon.obj + 0001:0004e028 _ShotgunPattern 2004f028 f g_weapon.obj + 0001:0004e1fb _weapon_supershotgun_fire 2004f1fb f g_weapon.obj + 0001:0004e2e4 _shooter_supershotgun_fire 2004f2e4 f g_weapon.obj + 0001:0004e3cb _weapon_grenadelauncher_fire 2004f3cb f g_weapon.obj + 0001:0004e447 _Weapon_RocketLauncher_Fire 2004f447 f g_weapon.obj + 0001:0004e4a2 _Weapon_Plasmagun_Fire 2004f4a2 f g_weapon.obj + 0001:0004e4fd _weapon_railgun_fire 2004f4fd f g_weapon.obj + 0001:0004eb9c _shooter_railgun_fire 2004fb9c f g_weapon.obj + 0001:0004ebec _Weapon_GrapplingHook_Fire 2004fbec f g_weapon.obj + 0001:0004ec68 _Weapon_HookFree 2004fc68 f g_weapon.obj + 0001:0004ecf0 _Weapon_HookThink 2004fcf0 f g_weapon.obj + 0001:0004ee47 _G_LightningDischargeDamage 2004fe47 f g_weapon.obj + 0001:0004f016 _Find_ChainLightningTarget 20050016 f g_weapon.obj + 0001:0004f2b5 _ChainLightningThink 200502b5 f g_weapon.obj + 0001:0004f8a0 _ChainLightningStrike 200508a0 f g_weapon.obj + 0001:0004fa9c _Weapon_LightningFire 20050a9c f g_weapon.obj + 0001:0004ff4c _shooter_Lightning_fire 20050f4c f g_weapon.obj + 0001:0005005f _Exploding_ShellsPellet 2005105f f g_weapon.obj + 0001:000501b4 _Exploding_ShellsPattern 200511b4 f g_weapon.obj + 0001:00050327 _weapon_exploding_shells_fire 20051327 f g_weapon.obj + 0001:00050415 _TootThink 20051415 f g_weapon.obj + 0001:000507c8 _weapon_beans_eat 200517c8 f g_weapon.obj + 0001:00050969 _LogAccuracyHit 20051969 f g_weapon.obj + 0001:000509dd _FireWeapon 200519dd f g_weapon.obj + 0001:00050c60 _Q_rand 20051c60 f q_math.obj + 0001:00050c7d _Q_random 20051c7d f q_math.obj + 0001:00050ca2 _Q_crandom 20051ca2 f q_math.obj + 0001:00050cc5 _ClampChar 20051cc5 f q_math.obj + 0001:00050ce1 _ClampShort 20051ce1 f q_math.obj + 0001:00050d08 _DirToByte 20051d08 f q_math.obj + 0001:00050d9f _ByteToDir 20051d9f f q_math.obj + 0001:00050e0c _ColorBytes3 20051e0c f q_math.obj + 0001:00050e4a _ColorBytes4 20051e4a f q_math.obj + 0001:00050e99 _NormalizeColor 20051e99 f q_math.obj + 0001:00050f38 _PlaneFromPoints 20051f38 f q_math.obj + 0001:0005105a _RotatePointAroundVector 2005205a f q_math.obj + 0001:00051258 _RotateAroundDirection 20052258 f q_math.obj + 0001:000512d5 _vectoangles 200522d5 f q_math.obj + 0001:0005143c _AnglesToAxis 2005243c f q_math.obj + 0001:0005148e _AxisClear 2005248e f q_math.obj + 0001:000514ec _AxisCopy 200524ec f q_math.obj + 0001:0005155b _ProjectPointOnPlane 2005255b f q_math.obj + 0001:0005164d _MakeNormalVectors 2005264d f q_math.obj + 0001:00051703 _VectorRotate 20052703 f q_math.obj + 0001:0005178d _Q_rsqrt 2005278d f q_math.obj + 0001:000517dd _Q_fabs 200527dd f q_math.obj + 0001:000517fa _LerpAngle 200527fa f q_math.obj + 0001:0005184f _AngleSubtract 2005284f f q_math.obj + 0001:0005189f _AnglesSubtract 2005289f f q_math.obj + 0001:000518f5 _AngleMod 200528f5 f q_math.obj + 0001:0005191f _AngleNormalize360 2005291f f q_math.obj + 0001:0005194b _AngleNormalize180 2005294b f q_math.obj + 0001:0005197b _AngleDelta 2005297b f q_math.obj + 0001:00051992 _SetPlaneSignbits 20052992 f q_math.obj + 0001:000519ee _BoxOnPlaneSide 200529ee f q_math.obj + 0001:00051c25 _RadiusFromBounds 20052c25 f q_math.obj + 0001:00051ced _ClearBounds 20052ced f q_math.obj + 0001:00051d2c _AddPointToBounds 20052d2c f q_math.obj + 0001:00051de3 _VectorNormalize 20052de3 f q_math.obj + 0001:00051e6e _VectorNormalize2 20052e6e f q_math.obj + 0001:00051f18 __VectorMA 20052f18 f q_math.obj + 0001:00051f59 __DotProduct 20052f59 f q_math.obj + 0001:00051f84 __VectorSubtract 20052f84 f q_math.obj + 0001:00051fbc __VectorAdd 20052fbc f q_math.obj + 0001:00051ff4 __VectorCopy 20052ff4 f q_math.obj + 0001:0005201b __VectorScale 2005301b f q_math.obj + 0001:0005204b _Vector4Scale 2005304b f q_math.obj + 0001:0005208a _Q_log2 2005308a f q_math.obj + 0001:000520b5 _MatrixMultiply 200530b5 f q_math.obj + 0001:00052251 _AngleVectors 20053251 f q_math.obj + 0001:0005242d _AngleVectorsForward 2005342d f q_math.obj + 0001:000524d3 _PerpendicularVector 200534d3 f q_math.obj + 0001:00052590 _Com_Clamp 20053590 f q_shared.obj + 0001:000525bc _COM_SkipPath 200535bc f q_shared.obj + 0001:000525f6 _COM_StripExtension 200535f6 f q_shared.obj + 0001:00052634 _COM_DefaultExtension 20053634 f q_shared.obj + 0001:000526ae _ShortSwap 200536ae f q_shared.obj + 0001:000526ea _ShortNoSwap 200536ea f q_shared.obj + 0001:000526f3 _LongSwap 200536f3 f q_shared.obj + 0001:00052766 _LongNoSwap 20053766 f q_shared.obj + 0001:0005276e _Long64Swap 2005376e f q_shared.obj + 0001:000527ae _Long64NoSwap 200537ae f q_shared.obj + 0001:000527b9 _FloatSwap 200537b9 f q_shared.obj + 0001:000527dd _FloatNoSwap 200537dd f q_shared.obj + 0001:000527e7 _COM_BeginParseSession 200537e7 f q_shared.obj + 0001:00052811 _COM_GetCurrentParseLine 20053811 f q_shared.obj + 0001:0005281b _COM_Parse 2005381b f q_shared.obj + 0001:0005282e _COM_ParseError 2005382e f q_shared.obj + 0001:00052875 _COM_ParseWarning 20053875 f q_shared.obj + 0001:000528bc _COM_Compress 200538bc f q_shared.obj + 0001:00052ab6 _COM_ParseExt 20053ab6 f q_shared.obj + 0001:00052d2e _COM_MatchToken 20053d2e f q_shared.obj + 0001:00052d70 _SkipBracedSection 20053d70 f q_shared.obj + 0001:00052dd5 _SkipRestOfLine 20053dd5 f q_shared.obj + 0001:00052e1f _Parse1DMatrix 20053e1f f q_shared.obj + 0001:00052e8b _Parse2DMatrix 20053e8b f q_shared.obj + 0001:00052eef _Parse3DMatrix 20053eef f q_shared.obj + 0001:00052f5b _Q_isprint 20053f5b f q_shared.obj + 0001:00052f75 _Q_islower 20053f75 f q_shared.obj + 0001:00052f8f _Q_isupper 20053f8f f q_shared.obj + 0001:00052fa9 _Q_isalpha 20053fa9 f q_shared.obj + 0001:00052fcf _Q_strrchr 20053fcf f q_shared.obj + 0001:00053026 _Q_strncpyz 20054026 f q_shared.obj + 0001:0005308b _Q_stricmpn 2005408b f q_shared.obj + 0001:00053154 _Q_strncmp 20054154 f q_shared.obj + 0001:000531bc _Q_stricmp 200541bc f q_shared.obj + 0001:000531f4 _Q_strlwr 200541f4 f q_shared.obj + 0001:0005322e _Q_strupr 2005422e f q_shared.obj + 0001:00053268 _Q_strcat 20054268 f q_shared.obj + 0001:000532b0 _Q_PrintStrlen 200542b0 f q_shared.obj + 0001:00053325 _Q_CleanStr 20054325 f q_shared.obj + 0001:000533ae _Com_sprintf 200543ae f q_shared.obj + 0001:0005344e _va 2005444e f q_shared.obj + 0001:000534a1 _Info_ValueForKey 200544a1 f q_shared.obj + 0001:0005361b _Info_NextPair 2005461b f q_shared.obj + 0001:000536ec _Info_RemoveKey 200546ec f q_shared.obj + 0001:00053855 _Info_RemoveKey_Big 20054855 f q_shared.obj + 0001:000539c2 _Info_Validate 200549c2 f q_shared.obj + 0001:000539f8 _Info_SetValueForKey 200549f8 f q_shared.obj + 0001:00053b70 _Info_SetValueForKey_Big 20054b70 f q_shared.obj + 0001:00053ce0 _atol 20054ce0 f LIBCMTD:atox.obj + 0001:00053de0 _atoi 20054de0 f LIBCMTD:atox.obj + 0001:00053e00 __atoi64 20054e00 f LIBCMTD:atox.obj + 0001:00053f30 _strlen 20054f30 f LIBCMTD:strlen.obj + 0001:00053fb0 _srand 20054fb0 f LIBCMTD:rand.obj + 0001:00053fc0 _rand 20054fc0 f LIBCMTD:rand.obj + 0001:00054000 __fpmath 20055000 f LIBCMTD:fpinit.obj + 0001:00054030 __fpclear 20055030 f LIBCMTD:fpinit.obj + 0001:00054040 __cfltcvt_init 20055040 f LIBCMTD:fpinit.obj + 0001:00054090 ___setfflag 20055090 f LIBCMTD:fpinit.obj + 0001:000540ac __ftol 200550ac f LIBCMTD:ftol.obj + 0001:000540e0 _strcpy 200550e0 f LIBCMTD:strcat.obj + 0001:000540f0 _strcat 200550f0 f LIBCMTD:strcat.obj + 0001:000541d0 _strncpy 200551d0 f LIBCMTD:strncpy.obj + 0001:000542d0 _memcpy 200552d0 f LIBCMTD:memcpy.obj + 0001:00054610 _atof 20055610 f LIBCMTD:atof.obj + 0001:00054690 _strcmp 20055690 f LIBCMTD:strcmp.obj + 0001:00054720 _sscanf 20055720 f LIBCMTD:sscanf.obj + 0001:000547e0 __CIsqrt 200557e0 f LIBCMTD:sqrt.obj + 0001:000547f4 _sqrt 200557f4 LIBCMTD:sqrt.obj + 0001:000548a0 _memset 200558a0 f LIBCMTD:memset.obj + 0001:00054900 __toupper 20055900 f LIBCMTD:toupper.obj + 0001:00054910 _toupper 20055910 f LIBCMTD:toupper.obj + 0001:000549b0 __toupper_lk 200559b0 f LIBCMTD:toupper.obj + 0001:00054ae0 _memmove 20055ae0 f LIBCMTD:memmove.obj + 0001:00054e20 _strstr 20055e20 f LIBCMTD:strstr.obj + 0001:00054ea0 _fabs 20055ea0 f LIBCMTD:fabs.obj + 0001:00054fa0 _vsprintf 20055fa0 f LIBCMTD:vsprintf.obj + 0001:000550a0 _abs 200560a0 f LIBCMTD:abs.obj + 0001:000550e0 _strchr 200560e0 f LIBCMTD:strchr.obj + 0001:000550e6 ___from_strstr_to_strchr 200560e6 LIBCMTD:strchr.obj + 0001:000551a0 __CIsin 200561a0 f LIBCMTD:sin.obj + 0001:000551b4 _sin 200561b4 LIBCMTD:sin.obj + 0001:00055250 __CIcos 20056250 f LIBCMTD:cos.obj + 0001:00055264 _cos 20056264 LIBCMTD:cos.obj + 0001:00055300 __alloca_probe 20056300 LIBCMTD:chkstk.obj + 0001:00055300 __chkstk 20056300 LIBCMTD:chkstk.obj + 0001:00055330 _qsort 20056330 f LIBCMTD:qsort.obj + 0001:00055630 __tolower 20056630 f LIBCMTD:tolower.obj + 0001:00055640 _tolower 20056640 f LIBCMTD:tolower.obj + 0001:000556e0 __tolower_lk 200566e0 f LIBCMTD:tolower.obj + 0001:00055810 _ceil 20056810 f LIBCMTD:ceil.obj + 0001:00055950 _atan2 20056950 f LIBCMTD:87ctriga.obj + 0001:0005595a __CIatan2 2005695a f LIBCMTD:87ctriga.obj + 0001:00055970 __assert 20056970 f LIBCMTD:assert.obj + 0001:00055d00 __CRT_INIT@12 20056d00 f LIBCMTD:dllcrt0.obj + 0001:00055ed0 __DllMainCRTStartup@12 20056ed0 f LIBCMTD:dllcrt0.obj + 0001:00055fd0 __amsg_exit 20056fd0 f LIBCMTD:dllcrt0.obj + 0001:00056010 __isctype 20057010 f LIBCMTD:isctype.obj + 0001:000560d0 __allmul 200570d0 f LIBCMTD:llmul.obj + 0001:00056110 __mtinit 20057110 f LIBCMTD:tidtable.obj + 0001:000561a0 __mtterm 200571a0 f LIBCMTD:tidtable.obj + 0001:000561d0 __initptd 200571d0 f LIBCMTD:tidtable.obj + 0001:000561f0 __getptd 200571f0 f LIBCMTD:tidtable.obj + 0001:00056290 __freeptd 20057290 f LIBCMTD:tidtable.obj + 0001:00056380 ___threadid 20057380 f LIBCMTD:tidtable.obj + 0001:00056390 ___threadhandle 20057390 f LIBCMTD:tidtable.obj + 0001:000563a0 __setdefaultprecision 200573a0 f LIBCMTD:fp8.obj + 0001:000563c0 __ms_p5_test_fdiv 200573c0 f LIBCMTD:testfdiv.obj + 0001:00056420 __ms_p5_mp_test_fdiv 20057420 f LIBCMTD:testfdiv.obj + 0001:00056470 __forcdecpt 20057470 f LIBCMTD:cvt.obj + 0001:00056520 __cropzeros 20057520 f LIBCMTD:cvt.obj + 0001:00056600 __positive 20057600 f LIBCMTD:cvt.obj + 0001:00056630 __fassign 20057630 f LIBCMTD:cvt.obj + 0001:00056680 __cftoe 20057680 f LIBCMTD:cvt.obj + 0001:00056880 __cftof 20057880 f LIBCMTD:cvt.obj + 0001:00056a40 __cftog 20057a40 f LIBCMTD:cvt.obj + 0001:00056b30 __cfltcvt 20057b30 f LIBCMTD:cvt.obj + 0001:00056bc0 __fltin2 20057bc0 f LIBCMTD:cfin.obj + 0001:00056c80 __input 20057c80 f LIBCMTD:input.obj + 0001:00058190 __CrtDbgBreak 20059190 f LIBCMTD:dbgrpt.obj + 0001:000581a0 __CrtSetReportMode 200591a0 f LIBCMTD:dbgrpt.obj + 0001:00058200 __CrtSetReportFile 20059200 f LIBCMTD:dbgrpt.obj + 0001:00058280 __CrtSetReportHook 20059280 f LIBCMTD:dbgrpt.obj + 0001:000582a0 __CrtDbgReport 200592a0 f LIBCMTD:dbgrpt.obj + 0001:00058940 __trandisp1 20059940 f LIBCMTD:87disp.obj + 0001:000589a7 __trandisp2 200599a7 f LIBCMTD:87disp.obj + 0001:00058a33 __rttospopde 20059a33 LIBCMTD:87disp.obj + 0001:00058a38 __rttospop 20059a38 LIBCMTD:87disp.obj + 0001:00058a3a __rtnospop 20059a3a LIBCMTD:87disp.obj + 0001:00058a3c __rttosnpop 20059a3c LIBCMTD:87disp.obj + 0001:00058a3d __rtnospopde 20059a3d LIBCMTD:87disp.obj + 0001:00058a44 __rtzeropop 20059a44 LIBCMTD:87disp.obj + 0001:00058a46 __rtzeronpop 20059a46 LIBCMTD:87disp.obj + 0001:00058a4b __rtonepop 20059a4b LIBCMTD:87disp.obj + 0001:00058a4d __rtonenpop 20059a4d LIBCMTD:87disp.obj + 0001:00058a52 __tosnan1 20059a52 LIBCMTD:87disp.obj + 0001:00058a7d __nosnan2 20059a7d LIBCMTD:87disp.obj + 0001:00058a7f __tosnan2 20059a7f LIBCMTD:87disp.obj + 0001:00058aa7 __nan2 20059aa7 LIBCMTD:87disp.obj + 0001:00058ae6 __rtindfpop 20059ae6 LIBCMTD:87disp.obj + 0001:00058ae8 __rtindfnpop 20059ae8 LIBCMTD:87disp.obj + 0001:00058af9 __rttosnpopde 20059af9 LIBCMTD:87disp.obj + 0001:00058b03 __rtchsifneg 20059b03 LIBCMTD:87disp.obj + 0001:00058b10 __startTwoArgErrorHandling 20059b10 f LIBCMTD:genexcep.obj + 0001:00058b27 __startOneArgErrorHandling 20059b27 f LIBCMTD:genexcep.obj + 0001:00058b70 __twoToTOS 20059b70 f LIBCMTD:common.obj + 0001:00058b85 __load_CW 20059b85 f LIBCMTD:common.obj + 0001:00058b9c __convertTOStoQNaN 20059b9c f LIBCMTD:common.obj + 0001:00058bb5 __fload_withFB 20059bb5 f LIBCMTD:common.obj + 0001:00058bf8 __checkTOS_withFB 20059bf8 f LIBCMTD:common.obj + 0001:00058c0e __fast_exit 20059c0e f LIBCMTD:common.obj + 0001:00058c1b __math_exit 20059c1b f LIBCMTD:common.obj + 0001:00058c45 __check_overflow_exit 20059c45 f LIBCMTD:common.obj + 0001:00058c59 __check_range_exit 20059c59 f LIBCMTD:common.obj + 0001:00058d00 __mtinitlocks 20059d00 f LIBCMTD:mlock.obj + 0001:00058d40 __mtdeletelocks 20059d40 f LIBCMTD:mlock.obj + 0001:00058de0 __lock 20059de0 f LIBCMTD:mlock.obj + 0001:00058e80 __unlock 20059e80 f LIBCMTD:mlock.obj + 0001:00058ea0 __lock_file 20059ea0 f LIBCMTD:mlock.obj + 0001:00058ee0 __lock_file2 20059ee0 f LIBCMTD:mlock.obj + 0001:00058f10 __unlock_file 20059f10 f LIBCMTD:mlock.obj + 0001:00058f50 __unlock_file2 20059f50 f LIBCMTD:mlock.obj + 0001:00058f80 __lockerr_exit 20059f80 f LIBCMTD:mlock.obj + 0001:00058fa0 _setlocale 20059fa0 f LIBCMTD:setlocal.obj + 0001:00059620 __expandlocale 2005a620 f LIBCMTD:setlocal.obj + 0001:000597b0 ___init_dummy 2005a7b0 f LIBCMTD:setlocal.obj + 0001:000597c0 __strcats 2005a7c0 f LIBCMTD:setlocal.obj + 0001:00059810 ___lc_strtolc 2005a810 f LIBCMTD:setlocal.obj + 0001:00059970 ___lc_lctostr 2005a970 f LIBCMTD:setlocal.obj + 0001:000599e0 ___crtLCMapStringW 2005a9e0 f LIBCMTD:aw_map.obj + 0001:00059cf0 ___crtLCMapStringA 2005acf0 f LIBCMTD:aw_map.obj + 0001:0005a000 __handle_qnan1 2005b000 f LIBCMTD:fpexcept.obj + 0001:0005a060 __handle_qnan2 2005b060 f LIBCMTD:fpexcept.obj + 0001:0005a0d0 __except1 2005b0d0 f LIBCMTD:fpexcept.obj + 0001:0005a190 __except2 2005b190 f LIBCMTD:fpexcept.obj + 0001:0005a260 __raise_exc 2005b260 f LIBCMTD:fpexcept.obj + 0001:0005a730 __handle_exc 2005b730 f LIBCMTD:fpexcept.obj + 0001:0005aab0 __umatherr 2005bab0 f LIBCMTD:fpexcept.obj + 0001:0005ab50 __set_errno 2005bb50 f LIBCMTD:fpexcept.obj + 0001:0005abd0 __errcode 2005bbd0 f LIBCMTD:fpexcept.obj + 0001:0005ac50 __set_exp 2005bc50 f LIBCMTD:util.obj + 0001:0005ac90 __get_exp 2005bc90 f LIBCMTD:util.obj + 0001:0005acc0 __add_exp 2005bcc0 f LIBCMTD:util.obj + 0001:0005ad00 __set_bexp 2005bd00 f LIBCMTD:util.obj + 0001:0005ad40 __sptype 2005bd40 f LIBCMTD:util.obj + 0001:0005adc0 __decomp 2005bdc0 f LIBCMTD:util.obj + 0001:0005af00 __statfp 2005bf00 f LIBCMTD:fpctrl.obj + 0001:0005af20 __clrfp 2005bf20 f LIBCMTD:fpctrl.obj + 0001:0005af40 __ctrlfp 2005bf40 f LIBCMTD:fpctrl.obj + 0001:0005af80 __set_statfp 2005bf80 f LIBCMTD:fpctrl.obj + 0001:0005b000 __flsbuf 2005c000 f LIBCMTD:_flsbuf.obj + 0001:0005b280 __output 2005c280 f LIBCMTD:output.obj + 0001:0005c120 __frnd 2005d120 f LIBCMTD:frnd.obj + 0001:0005c15c __fFATN2 2005d15c LIBCMTD:87triga.obj + 0001:0005c1ac __rtpiby2 2005d1ac LIBCMTD:87triga.obj + 0001:0005c1f0 __cintrindisp2 2005d1f0 f LIBCMTD:87cdisp.obj + 0001:0005c22e __cintrindisp1 2005d22e f LIBCMTD:87cdisp.obj + 0001:0005c26b __ctrandisp2 2005d26b f LIBCMTD:87cdisp.obj + 0001:0005c3eb __ctrandisp1 2005d3eb f LIBCMTD:87cdisp.obj + 0001:0005c41e __fload 2005d41e f LIBCMTD:87cdisp.obj + 0001:0005c460 _abort 2005d460 f LIBCMTD:abort.obj + 0001:0005c490 __cinit 2005d490 f LIBCMTD:crt0dat.obj + 0001:0005c4d0 _exit 2005d4d0 f LIBCMTD:crt0dat.obj + 0001:0005c4f0 __exit 2005d4f0 f LIBCMTD:crt0dat.obj + 0001:0005c510 __cexit 2005d510 f LIBCMTD:crt0dat.obj + 0001:0005c530 __c_exit 2005d530 f LIBCMTD:crt0dat.obj + 0001:0005c640 __lockexit 2005d640 f LIBCMTD:crt0dat.obj + 0001:0005c650 __unlockexit 2005d650 f LIBCMTD:crt0dat.obj + 0001:0005c690 _signal 2005d690 f LIBCMTD:winsig.obj + 0001:0005c960 _raise 2005d960 f LIBCMTD:winsig.obj + 0001:0005cc10 ___fpecode 2005dc10 f LIBCMTD:winsig.obj + 0001:0005cc20 ___pxcptinfoptrs 2005dc20 f LIBCMTD:winsig.obj + 0001:0005cc30 ___crtMessageBoxA 2005dc30 f LIBCMTD:crtmbox.obj + 0001:0005ccf0 __itoa 2005dcf0 f LIBCMTD:xtoa.obj + 0001:0005ce10 __ltoa 2005de10 f LIBCMTD:xtoa.obj + 0001:0005ce50 __ultoa 2005de50 f LIBCMTD:xtoa.obj + 0001:0005ce70 __i64toa 2005de70 f LIBCMTD:xtoa.obj + 0001:0005cfa0 __ui64toa 2005dfa0 f LIBCMTD:xtoa.obj + 0001:0005cfc0 _strncat 2005dfc0 f LIBCMTD:strncat.obj + 0001:0005d0f0 _fflush 2005e0f0 f LIBCMTD:fflush.obj + 0001:0005d140 __fflush_lk 2005e140 f LIBCMTD:fflush.obj + 0001:0005d190 __flush 2005e190 f LIBCMTD:fflush.obj + 0001:0005d250 __flushall 2005e250 f LIBCMTD:fflush.obj + 0001:0005d3a0 _fprintf 2005e3a0 f LIBCMTD:fprintf.obj + 0001:0005d470 _setvbuf 2005e470 f LIBCMTD:setvbuf.obj + 0001:0005d5e0 ___initstdio 2005e5e0 f LIBCMTD:_file.obj + 0001:0005d710 ___endstdio 2005e710 f LIBCMTD:_file.obj + 0001:0005d730 __ioinit 2005e730 f LIBCMTD:ioinit.obj + 0001:0005da60 __ioterm 2005ea60 f LIBCMTD:ioinit.obj + 0001:0005db00 _malloc 2005eb00 f LIBCMTD:dbgheap.obj + 0001:0005db20 __malloc_dbg 2005eb20 f LIBCMTD:dbgheap.obj + 0001:0005db50 __nh_malloc 2005eb50 f LIBCMTD:dbgheap.obj + 0001:0005db70 __nh_malloc_dbg 2005eb70 f LIBCMTD:dbgheap.obj + 0001:0005dbd0 __heap_alloc 2005ebd0 f LIBCMTD:dbgheap.obj + 0001:0005dbf0 __heap_alloc_dbg 2005ebf0 f LIBCMTD:dbgheap.obj + 0001:0005df10 _calloc 2005ef10 f LIBCMTD:dbgheap.obj + 0001:0005df30 __calloc_dbg 2005ef30 f LIBCMTD:dbgheap.obj + 0001:0005df90 _realloc 2005ef90 f LIBCMTD:dbgheap.obj + 0001:0005dfb0 __realloc_dbg 2005efb0 f LIBCMTD:dbgheap.obj + 0001:0005e510 __expand 2005f510 f LIBCMTD:dbgheap.obj + 0001:0005e530 __expand_dbg 2005f530 f LIBCMTD:dbgheap.obj + 0001:0005e570 _free 2005f570 f LIBCMTD:dbgheap.obj + 0001:0005e590 __free_lk 2005f590 f LIBCMTD:dbgheap.obj + 0001:0005e5b0 __free_dbg 2005f5b0 f LIBCMTD:dbgheap.obj + 0001:0005e5e0 __free_dbg_lk 2005f5e0 f LIBCMTD:dbgheap.obj + 0001:0005e9d0 __msize 2005f9d0 f LIBCMTD:dbgheap.obj + 0001:0005e9f0 __msize_dbg 2005f9f0 f LIBCMTD:dbgheap.obj + 0001:0005eb50 __CrtSetBreakAlloc 2005fb50 f LIBCMTD:dbgheap.obj + 0001:0005eb70 __CrtSetDbgBlockType 2005fb70 f LIBCMTD:dbgheap.obj + 0001:0005ec10 __CrtSetAllocHook 2005fc10 f LIBCMTD:dbgheap.obj + 0001:0005ecc0 __CrtCheckMemory 2005fcc0 f LIBCMTD:dbgheap.obj + 0001:0005f030 __CrtSetDbgFlag 20060030 f LIBCMTD:dbgheap.obj + 0001:0005f060 __CrtDoForAllClientObjects 20060060 f LIBCMTD:dbgheap.obj + 0001:0005f0d0 __CrtIsValidPointer 200600d0 f LIBCMTD:dbgheap.obj + 0001:0005f120 __CrtIsValidHeapPointer 20060120 f LIBCMTD:dbgheap.obj + 0001:0005f1b0 __CrtIsMemoryBlock 200601b0 f LIBCMTD:dbgheap.obj + 0001:0005f2a0 __CrtSetDumpClient 200602a0 f LIBCMTD:dbgheap.obj + 0001:0005f2c0 __CrtMemCheckpoint 200602c0 f LIBCMTD:dbgheap.obj + 0001:0005f430 __CrtMemDifference 20060430 f LIBCMTD:dbgheap.obj + 0001:0005f560 __CrtMemDumpAllObjectsSince 20060560 f LIBCMTD:dbgheap.obj + 0001:0005f940 __CrtDumpMemoryLeaks 20060940 f LIBCMTD:dbgheap.obj + 0001:0005f9c0 __CrtMemDumpStatistics 200609c0 f LIBCMTD:dbgheap.obj + 0001:0005fa90 __setenvp 20060a90 f LIBCMTD:stdenvp.obj + 0001:0005fbd0 __setargv 20060bd0 f LIBCMTD:stdargv.obj + 0001:000600d0 __setmbcp 200610d0 f LIBCMTD:mbctype.obj + 0001:00060540 __getmbcp 20061540 f LIBCMTD:mbctype.obj + 0001:00060550 ___initmbctable 20061550 f LIBCMTD:mbctype.obj + 0001:00060560 ___crtGetEnvironmentStringsW 20061560 f LIBCMTD:aw_env.obj + 0001:000607e0 ___crtGetEnvironmentStringsA 200617e0 f LIBCMTD:aw_env.obj + 0001:00060a00 __heap_init 20061a00 f LIBCMTD:heapinit.obj + 0001:00060a50 __heap_term 20061a50 f LIBCMTD:heapinit.obj + 0001:00060aa0 __set_error_mode 20061aa0 f LIBCMTD:errmode.obj + 0001:00060af0 ___set_app_type 20061af0 f LIBCMTD:errmode.obj + 0001:00060b00 _DllMain@12 20061b00 f LIBCMTD:dllmain.obj + 0001:00060b10 __FF_MSGBANNER 20061b10 f LIBCMTD:crt0msg.obj + 0001:00060b60 __NMSG_WRITE 20061b60 f LIBCMTD:crt0msg.obj + 0001:00060d60 __GET_RTERRMSG 20061d60 f LIBCMTD:crt0msg.obj + 0001:00060db0 ___crtGetStringTypeW 20061db0 f LIBCMTD:aw_str.obj + 0001:00060fc0 ___crtGetStringTypeA 20061fc0 f LIBCMTD:aw_str.obj + 0001:00061120 __XcptFilter 20062120 f LIBCMTD:winxfltr.obj + 0001:00061340 __statusfp 20062340 f LIBCMTD:ieee87.obj + 0001:00061360 __clearfp 20062360 f LIBCMTD:ieee87.obj + 0001:00061380 __control87 20062380 f LIBCMTD:ieee87.obj + 0001:000613d0 __controlfp 200623d0 f LIBCMTD:ieee87.obj + 0001:000613f0 __fpreset 200623f0 f LIBCMTD:ieee87.obj + 0001:000617e0 __ZeroTail 200627e0 f LIBCMTD:intrncvt.obj + 0001:00061870 __IncMan 20062870 f LIBCMTD:intrncvt.obj + 0001:00061920 __RoundMan 20062920 f LIBCMTD:intrncvt.obj + 0001:00061a00 __CopyMan 20062a00 f LIBCMTD:intrncvt.obj + 0001:00061a50 __FillZeroMan 20062a50 f LIBCMTD:intrncvt.obj + 0001:00061a80 __IsZeroMan 20062a80 f LIBCMTD:intrncvt.obj + 0001:00061ac0 __ShrMan 20062ac0 f LIBCMTD:intrncvt.obj + 0001:00061bb0 __ld12cvt 20062bb0 f LIBCMTD:intrncvt.obj + 0001:00061e00 __ld12tod 20062e00 f LIBCMTD:intrncvt.obj + 0001:00061e20 __ld12tof 20062e20 f LIBCMTD:intrncvt.obj + 0001:00061e40 __ld12told 20062e40 f LIBCMTD:intrncvt.obj + 0001:00061f00 __atodbl 20062f00 f LIBCMTD:intrncvt.obj + 0001:00061f40 __atoldbl 20062f40 f LIBCMTD:intrncvt.obj + 0001:00061f80 __atoflt 20062f80 f LIBCMTD:intrncvt.obj + 0001:00061fc0 __fptostr 20062fc0 f LIBCMTD:_fptostr.obj + 0001:000620b0 __fltout2 200630b0 f LIBCMTD:cfout.obj + 0001:00062130 ___dtold 20063130 f LIBCMTD:cfout.obj + 0001:000622a0 __fptrap 200632a0 f LIBCMTD:crt0fp.obj + 0001:000622b0 ___strgtold12 200632b0 f LIBCMTD:strgtold.obj + 0001:00062df0 ___STRINGTOLD 20063df0 f LIBCMTD:strgtold.obj + 0001:00062e40 _mbtowc 20063e40 f LIBCMTD:mbtowc.obj + 0001:00062ec0 __mbtowc_lk 20063ec0 f LIBCMTD:mbtowc.obj + 0001:00063020 _isalpha 20064020 f LIBCMTD:_ctype.obj + 0001:00063070 _isupper 20064070 f LIBCMTD:_ctype.obj + 0001:000630b0 _islower 200640b0 f LIBCMTD:_ctype.obj + 0001:000630f0 _isdigit 200640f0 f LIBCMTD:_ctype.obj + 0001:00063130 _isxdigit 20064130 f LIBCMTD:_ctype.obj + 0001:00063180 _isspace 20064180 f LIBCMTD:_ctype.obj + 0001:000631c0 _ispunct 200641c0 f LIBCMTD:_ctype.obj + 0001:00063200 _isalnum 20064200 f LIBCMTD:_ctype.obj + 0001:00063250 _isprint 20064250 f LIBCMTD:_ctype.obj + 0001:000632a0 _isgraph 200642a0 f LIBCMTD:_ctype.obj + 0001:000632f0 _iscntrl 200642f0 f LIBCMTD:_ctype.obj + 0001:00063330 ___isascii 20064330 f LIBCMTD:_ctype.obj + 0001:00063340 ___toascii 20064340 f LIBCMTD:_ctype.obj + 0001:00063350 ___iscsymf 20064350 f LIBCMTD:_ctype.obj + 0001:000633b0 ___iscsym 200643b0 f LIBCMTD:_ctype.obj + 0001:00063410 __allshl 20064410 f LIBCMTD:llshl.obj + 0001:00063430 __filbuf 20064430 f LIBCMTD:_filbuf.obj + 0001:00063620 _ungetc 20064620 f LIBCMTD:ungetc.obj + 0001:00063690 __ungetc_lk 20064690 f LIBCMTD:ungetc.obj + 0001:000637d0 __snprintf 200647d0 f LIBCMTD:snprintf.obj + 0001:000638d0 __vsnprintf 200648d0 f LIBCMTD:vsnprint.obj + 0001:000639d0 __87except 200649d0 f LIBCMTD:87except.obj + 0001:00063b50 ___init_time 20064b50 f LIBCMTD:inittime.obj + 0001:00064690 ___init_numeric 20065690 f LIBCMTD:initnum.obj + 0001:000649c0 ___init_monetary 200659c0 f LIBCMTD:initmon.obj + 0001:00064e20 ___init_ctype 20065e20 f LIBCMTD:initctyp.obj + 0001:000651c0 ___init_collate 200661c0 f LIBCMTD:initcoll.obj + 0001:000651d0 _strcspn 200661d0 f LIBCMTD:strcspn.obj + 0001:00065210 _strncmp 20066210 f LIBCMTD:strncmp.obj + 0001:00065250 _strpbrk 20066250 f LIBCMTD:strpbrk.obj + 0001:00065290 ___get_qualified_locale 20066290 f LIBCMTD:getqloc.obj + 0001:00065930 __dosmaperr 20066930 f LIBCMTD:dosmap.obj + 0001:000659d0 __errno 200669d0 f LIBCMTD:dosmap.obj + 0001:000659e0 ___doserrno 200669e0 f LIBCMTD:dosmap.obj + 0001:000659f0 __matherr 200669f0 f LIBCMTD:matherr.obj + 0001:00065a00 __lseek 20066a00 f LIBCMTD:lseek.obj + 0001:00065a90 __lseek_lk 20066a90 f LIBCMTD:lseek.obj + 0001:00065b50 __write 20066b50 f LIBCMTD:write.obj + 0001:00065be0 __write_lk 20066be0 f LIBCMTD:write.obj + 0001:00065e60 __getbuf 20066e60 f LIBCMTD:_getbuf.obj + 0001:00065f30 __isatty 20066f30 f LIBCMTD:isatty.obj + 0001:00065f70 _wctomb 20066f70 f LIBCMTD:wctomb.obj + 0001:00065ff0 __wctomb_lk 20066ff0 f LIBCMTD:wctomb.obj + 0001:00066090 __aulldiv 20067090 f LIBCMTD:ulldiv.obj + 0001:00066100 __aullrem 20067100 f LIBCMTD:ullrem.obj + 0001:00066180 __commit 20067180 f LIBCMTD:commit.obj + 0001:00066260 __stbuf 20067260 f LIBCMTD:_sftbuf.obj + 0001:00066390 __ftbuf 20067390 f LIBCMTD:_sftbuf.obj + 0001:00066430 __freebuf 20067430 f LIBCMTD:_freebuf.obj + 0001:000664d0 __fcloseall 200674d0 f LIBCMTD:closeall.obj + 0001:000665b0 ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z 200675b0 f LIBCMTD:handler.obj + 0001:000665e0 ?_query_new_handler@@YAP6AHI@ZXZ 200675e0 f LIBCMTD:handler.obj + 0001:000665f0 __callnewh 200675f0 f LIBCMTD:handler.obj + 0001:00066620 __malloc_base 20067620 f LIBCMTD:malloc.obj + 0001:00066640 __nh_malloc_base 20067640 f LIBCMTD:malloc.obj + 0001:000666c0 __heap_alloc_base 200676c0 f LIBCMTD:malloc.obj + 0001:00066730 __CrtDefaultAllocHook 20067730 f LIBCMTD:dbghook.obj + 0001:00066740 __expand_base 20067740 f LIBCMTD:expand.obj + 0001:00066800 __realloc_base 20067800 f LIBCMTD:realloc.obj + 0001:00066a00 __free_base 20067a00 f LIBCMTD:free.obj + 0001:00066a80 __heapchk 20067a80 f LIBCMTD:heapchk.obj + 0001:00066b00 __heapset 20067b00 f LIBCMTD:heapchk.obj + 0001:00066b10 __get_sbh_threshold 20067b10 f LIBCMTD:sbheap.obj + 0001:00066b20 __set_sbh_threshold 20067b20 f LIBCMTD:sbheap.obj + 0001:00066b50 ___sbh_new_region 20067b50 f LIBCMTD:sbheap.obj + 0001:00066d30 ___sbh_release_region 20067d30 f LIBCMTD:sbheap.obj + 0001:00066db0 ___sbh_decommit_pages 20067db0 f LIBCMTD:sbheap.obj + 0001:00066f10 ___sbh_find_block 20067f10 f LIBCMTD:sbheap.obj + 0001:00066fa0 ___sbh_free_block 20067fa0 f LIBCMTD:sbheap.obj + 0001:00067010 ___sbh_alloc_block 20068010 f LIBCMTD:sbheap.obj + 0001:000673d0 ___sbh_alloc_block_from_page 200683d0 f LIBCMTD:sbheap.obj + 0001:00067680 ___sbh_resize_block 20068680 f LIBCMTD:sbheap.obj + 0001:000677f0 ___sbh_heap_check 200687f0 f LIBCMTD:sbheap.obj + 0001:00067a30 _sprintf 20068a30 f LIBCMTD:sprintf.obj + 0001:00067b30 _wcslen 20068b30 f LIBCMTD:wcslen.obj + 0001:00067b60 ___addl 20068b60 f LIBCMTD:mantold.obj + 0001:00067ba0 ___add_12 20068ba0 f LIBCMTD:mantold.obj + 0001:00067c50 ___shl_12 20068c50 f LIBCMTD:mantold.obj + 0001:00067cb0 ___shr_12 20068cb0 f LIBCMTD:mantold.obj + 0001:00067d20 ___mtold12 20068d20 f LIBCMTD:mantold.obj + 0001:00067e60 _$I10_OUTPUT 20068e60 f LIBCMTD:x10fout.obj + 0001:00068380 ___ld12mul 20069380 f LIBCMTD:tenpow.obj + 0001:000687d0 ___multtenpow12 200697d0 f LIBCMTD:tenpow.obj + 0001:000688a0 __read 200698a0 f LIBCMTD:read.obj + 0001:00068930 __read_lk 20069930 f LIBCMTD:read.obj + 0001:00068d80 __Getdays 20069d80 f LIBCMTD:strftime.obj + 0001:00068eb0 __Getmonths 20069eb0 f LIBCMTD:strftime.obj + 0001:00068fe0 __Gettnames 20069fe0 f LIBCMTD:strftime.obj + 0001:00069350 _strftime 2006a350 f LIBCMTD:strftime.obj + 0001:00069370 __Strftime 2006a370 f LIBCMTD:strftime.obj + 0001:0006a120 ___getlocaleinfo 2006b120 f LIBCMTD:inithelp.obj + 0001:0006a3b0 _localeconv 2006b3b0 f LIBCMTD:lconv.obj + 0001:0006a3c0 ___crtGetLocaleInfoW 2006b3c0 f LIBCMTD:aw_loc.obj + 0001:0006a540 ___crtGetLocaleInfoA 2006b540 f LIBCMTD:aw_loc.obj + 0001:0006a6d0 _wcstol 2006b6d0 f LIBCMTD:wcstol.obj + 0001:0006a9d0 _wcstoul 2006b9d0 f LIBCMTD:wcstol.obj + 0001:0006a9f0 __strcmpi 2006b9f0 f LIBCMTD:stricmp.obj + 0001:0006a9f0 __stricmp 2006b9f0 f LIBCMTD:stricmp.obj + 0001:0006aac0 __alloc_osfhnd 2006bac0 f LIBCMTD:osfinfo.obj + 0001:0006acb0 __set_osfhnd 2006bcb0 f LIBCMTD:osfinfo.obj + 0001:0006ad70 __free_osfhnd 2006bd70 f LIBCMTD:osfinfo.obj + 0001:0006ae50 __get_osfhandle 2006be50 f LIBCMTD:osfinfo.obj + 0001:0006aec0 __open_osfhandle 2006bec0 f LIBCMTD:osfinfo.obj + 0001:0006afb0 __lock_fhandle 2006bfb0 f LIBCMTD:osfinfo.obj + 0001:0006b040 __unlock_fhandle 2006c040 f LIBCMTD:osfinfo.obj + 0001:0006b070 _fclose 2006c070 f LIBCMTD:fclose.obj + 0001:0006b100 __fclose_lk 2006c100 f LIBCMTD:fclose.obj + 0001:0006b1c0 ___tzset 2006c1c0 f LIBCMTD:tzset.obj + 0001:0006b200 __tzset 2006c200 f LIBCMTD:tzset.obj + 0001:0006b580 __isindst 2006c580 f LIBCMTD:tzset.obj + 0001:0006bab0 _towupper 2006cab0 f LIBCMTD:towupper.obj + 0001:0006bb60 __towupper_lk 2006cb60 f LIBCMTD:towupper.obj + 0001:0006bc20 _iswctype 2006cc20 f LIBCMTD:iswctype.obj + 0001:0006bca0 _is_wctype 2006cca0 f LIBCMTD:iswctype.obj + 0001:0006bcc0 __close 2006ccc0 f LIBCMTD:close.obj + 0001:0006bd40 __close_lk 2006cd40 f LIBCMTD:close.obj + 0001:0006bdf0 _wcstombs 2006cdf0 f LIBCMTD:wcstombs.obj + 0001:0006be70 __wcstombs_lk 2006ce70 f LIBCMTD:wcstombs.obj + 0001:0006c1d0 _getenv 2006d1d0 f LIBCMTD:getenv.obj + 0001:0006c200 __getenv_lk 2006d200 f LIBCMTD:getenv.obj + 0001:0006c2c0 __mbsnbicoll 2006d2c0 f LIBCMTD:mbsnbico.obj + 0001:0006c310 ___wtomb_environ 2006d310 f LIBCMTD:wtombenv.obj + 0001:0006c3c0 ___crtCompareStringW 2006d3c0 f LIBCMTD:aw_cmp.obj + 0001:0006c6c0 ___crtCompareStringA 2006d6c0 f LIBCMTD:aw_cmp.obj + 0001:0006cad0 ___crtsetenv 2006dad0 f LIBCMTD:setenv.obj + 0001:0006cf20 __mbschr 2006df20 f LIBCMTD:mbschr.obj + 0001:0006d00e _InterlockedDecrement@4 2006e00e f kernel32:KERNEL32.dll + 0001:0006d014 _InterlockedIncrement@4 2006e014 f kernel32:KERNEL32.dll + 0001:0006d01a _GetModuleFileNameA@12 2006e01a f kernel32:KERNEL32.dll + 0001:0006d020 _GetCommandLineA@0 2006e020 f kernel32:KERNEL32.dll + 0001:0006d026 _GetProcAddress@8 2006e026 f kernel32:KERNEL32.dll + 0001:0006d02c _GetModuleHandleA@4 2006e02c f kernel32:KERNEL32.dll + 0001:0006d032 _GetVersion@0 2006e032 f kernel32:KERNEL32.dll + 0001:0006d038 _GetCurrentThreadId@0 2006e038 f kernel32:KERNEL32.dll + 0001:0006d03e _TlsSetValue@8 2006e03e f kernel32:KERNEL32.dll + 0001:0006d044 _TlsAlloc@0 2006e044 f kernel32:KERNEL32.dll + 0001:0006d04a _TlsFree@4 2006e04a f kernel32:KERNEL32.dll + 0001:0006d050 _SetLastError@4 2006e050 f kernel32:KERNEL32.dll + 0001:0006d056 _TlsGetValue@4 2006e056 f kernel32:KERNEL32.dll + 0001:0006d05c _GetLastError@0 2006e05c f kernel32:KERNEL32.dll + 0001:0006d062 _GetCurrentThread@0 2006e062 f kernel32:KERNEL32.dll + 0001:0006d068 _DebugBreak@0 2006e068 f kernel32:KERNEL32.dll + 0001:0006d06e _GetStdHandle@4 2006e06e f kernel32:KERNEL32.dll + 0001:0006d074 _WriteFile@20 2006e074 f kernel32:KERNEL32.dll + 0001:0006d07a _OutputDebugStringA@4 2006e07a f kernel32:KERNEL32.dll + 0001:0006d080 _LoadLibraryA@4 2006e080 f kernel32:KERNEL32.dll + 0001:0006d086 _InitializeCriticalSection@4 2006e086 f kernel32:KERNEL32.dll + 0001:0006d08c _DeleteCriticalSection@4 2006e08c f kernel32:KERNEL32.dll + 0001:0006d092 _EnterCriticalSection@4 2006e092 f kernel32:KERNEL32.dll + 0001:0006d098 _LeaveCriticalSection@4 2006e098 f kernel32:KERNEL32.dll + 0001:0006d09e _ExitProcess@4 2006e09e f kernel32:KERNEL32.dll + 0001:0006d0a4 _FatalAppExitA@8 2006e0a4 f kernel32:KERNEL32.dll + 0001:0006d0aa _Sleep@4 2006e0aa f kernel32:KERNEL32.dll + 0001:0006d0b0 _MultiByteToWideChar@24 2006e0b0 f kernel32:KERNEL32.dll + 0001:0006d0b6 _WideCharToMultiByte@32 2006e0b6 f kernel32:KERNEL32.dll + 0001:0006d0bc _LCMapStringA@24 2006e0bc f kernel32:KERNEL32.dll + 0001:0006d0c2 _LCMapStringW@24 2006e0c2 f kernel32:KERNEL32.dll + 0001:0006d0c8 _RaiseException@16 2006e0c8 f kernel32:KERNEL32.dll + 0001:0006d0ce _TerminateProcess@8 2006e0ce f kernel32:KERNEL32.dll + 0001:0006d0d4 _GetCurrentProcess@0 2006e0d4 f kernel32:KERNEL32.dll + 0001:0006d0da _SetConsoleCtrlHandler@8 2006e0da f kernel32:KERNEL32.dll + 0001:0006d0e0 _SetHandleCount@4 2006e0e0 f kernel32:KERNEL32.dll + 0001:0006d0e6 _GetFileType@4 2006e0e6 f kernel32:KERNEL32.dll + 0001:0006d0ec _GetStartupInfoA@4 2006e0ec f kernel32:KERNEL32.dll + 0001:0006d0f2 _IsBadWritePtr@8 2006e0f2 f kernel32:KERNEL32.dll + 0001:0006d0f8 _IsBadReadPtr@8 2006e0f8 f kernel32:KERNEL32.dll + 0001:0006d0fe _HeapValidate@12 2006e0fe f kernel32:KERNEL32.dll + 0001:0006d104 _GetCPInfo@8 2006e104 f kernel32:KERNEL32.dll + 0001:0006d10a _GetACP@0 2006e10a f kernel32:KERNEL32.dll + 0001:0006d110 _GetOEMCP@0 2006e110 f kernel32:KERNEL32.dll + 0001:0006d116 _FreeEnvironmentStringsA@4 2006e116 f kernel32:KERNEL32.dll + 0001:0006d11c _FreeEnvironmentStringsW@4 2006e11c f kernel32:KERNEL32.dll + 0001:0006d122 _GetEnvironmentStrings@0 2006e122 f kernel32:KERNEL32.dll + 0001:0006d128 _GetEnvironmentStringsW@0 2006e128 f kernel32:KERNEL32.dll + 0001:0006d12e _HeapDestroy@4 2006e12e f kernel32:KERNEL32.dll + 0001:0006d134 _HeapCreate@12 2006e134 f kernel32:KERNEL32.dll + 0001:0006d13a _VirtualFree@12 2006e13a f kernel32:KERNEL32.dll + 0001:0006d140 _GetStringTypeA@20 2006e140 f kernel32:KERNEL32.dll + 0001:0006d146 _GetStringTypeW@16 2006e146 f kernel32:KERNEL32.dll + 0001:0006d14c _UnhandledExceptionFilter@4 2006e14c f kernel32:KERNEL32.dll + 0001:0006d152 _IsValidLocale@8 2006e152 f kernel32:KERNEL32.dll + 0001:0006d158 _IsValidCodePage@4 2006e158 f kernel32:KERNEL32.dll + 0001:0006d15e _GetUserDefaultLCID@0 2006e15e f kernel32:KERNEL32.dll + 0001:0006d164 _SetFilePointer@16 2006e164 f kernel32:KERNEL32.dll + 0001:0006d16a _FlushFileBuffers@4 2006e16a f kernel32:KERNEL32.dll + 0001:0006d170 _HeapAlloc@12 2006e170 f kernel32:KERNEL32.dll + 0001:0006d176 _HeapReAlloc@16 2006e176 f kernel32:KERNEL32.dll + 0001:0006d17c _HeapFree@12 2006e17c f kernel32:KERNEL32.dll + 0001:0006d182 _VirtualAlloc@16 2006e182 f kernel32:KERNEL32.dll + 0001:0006d188 _ReadFile@20 2006e188 f kernel32:KERNEL32.dll + 0001:0006d18e _GetLocaleInfoA@16 2006e18e f kernel32:KERNEL32.dll + 0001:0006d194 _GetLocaleInfoW@16 2006e194 f kernel32:KERNEL32.dll + 0001:0006d19a _SetStdHandle@8 2006e19a f kernel32:KERNEL32.dll + 0001:0006d1a0 _GetTimeZoneInformation@4 2006e1a0 f kernel32:KERNEL32.dll + 0001:0006d1a6 _CloseHandle@4 2006e1a6 f kernel32:KERNEL32.dll + 0001:0006d1ac _CompareStringA@24 2006e1ac f kernel32:KERNEL32.dll + 0001:0006d1b2 _CompareStringW@24 2006e1b2 f kernel32:KERNEL32.dll + 0001:0006d1b8 _SetEnvironmentVariableA@8 2006e1b8 f kernel32:KERNEL32.dll + 0002:00000b18 ??_C@_0P@LNLA@format?5?$CB?$DN?5NULL?$AA@ 2006fb18 LIBCMTD:sscanf.obj + 0002:00000b28 ??_C@_08EJDA@sscanf?4c?$AA@ 2006fb28 LIBCMTD:sscanf.obj + 0002:00000b34 ??_C@_0P@OOIN@string?5?$CB?$DN?5NULL?$AA@ 2006fb34 LIBCMTD:sscanf.obj + 0002:00000b50 ??_C@_0L@HE@vsprintf?4c?$AA@ 2006fb50 LIBCMTD:vsprintf.obj + 0002:00000b68 ??_C@_02JJJH@?6?6?$AA@ 2006fb68 LIBCMTD:assert.obj + 0002:00000b6c ??_C@_01BJG@?6?$AA@ 2006fb6c LIBCMTD:assert.obj + 0002:00000b70 ??_C@_03NAME@?4?4?4?$AA@ 2006fb70 LIBCMTD:assert.obj + 0002:00000b74 ??_C@_0CF@JPDF@Microsoft?5Visual?5C?$CL?$CL?5Runtime?5Lib@ 2006fb74 LIBCMTD:assert.obj + 0002:00000b9c ??_C@_0DN@MHHJ@?$CIPress?5Retry?5to?5debug?5the?5applic@ 2006fb9c LIBCMTD:assert.obj + 0002:00000bdc ??_C@_0HA@EJLJ@For?5information?5on?5how?5your?5prog@ 2006fbdc LIBCMTD:assert.obj + 0002:00000c4c ??_C@_0N@NOAB@Expression?3?5?$AA@ 2006fc4c LIBCMTD:assert.obj + 0002:00000c5c ??_C@_06JMOL@Line?3?5?$AA@ 2006fc5c LIBCMTD:assert.obj + 0002:00000c64 ??_C@_06FAAO@File?3?5?$AA@ 2006fc64 LIBCMTD:assert.obj + 0002:00000c6c ??_C@_0BH@NNCD@?$DMprogram?5name?5unknown?$DO?$AA@ 2006fc6c LIBCMTD:assert.obj + 0002:00000c84 ??_C@_09PIFG@Program?3?5?$AA@ 2006fc84 LIBCMTD:assert.obj + 0002:00000c90 ??_C@_0BC@OIMC@Assertion?5failed?$CB?$AA@ 2006fc90 LIBCMTD:assert.obj + 0002:00000ca4 ??_C@_05EODD@IsTNT?$AA@ 2006fca4 LIBCMTD:dllcrt0.obj + 0002:00000cac ??_C@_0N@IDOE@kernel32?4dll?$AA@ 2006fcac LIBCMTD:dllcrt0.obj + 0002:00000cbc ??_C@_0L@ENLJ@tidtable?4c?$AA@ 2006fcbc LIBCMTD:tidtable.obj + 0002:00000cd0 ??_C@_0BK@JEGK@IsProcessorFeaturePresent?$AA@ 2006fcd0 LIBCMTD:testfdiv.obj + 0002:00000cec ??_C@_08OBID@KERNEL32?$AA@ 2006fcec LIBCMTD:testfdiv.obj + 0002:00000d00 ??_C@_05OFLO@e?$CL000?$AA@ 2006fd00 LIBCMTD:cvt.obj + 0002:00000d08 ??_C@_0P@FHEA@stream?5?$CB?$DN?5NULL?$AA@ 2006fd08 LIBCMTD:input.obj + 0002:00000d18 ??_C@_07IEFA@input?4c?$AA@ 2006fd18 LIBCMTD:input.obj + 0002:00000d20 ??_C@_0BB@BLL@Assertion?5Failed?$AA@ 2006fd20 LIBCMTD:dbgrpt.obj + 0002:00000d34 ??_C@_05CKBG@Error?$AA@ 2006fd34 LIBCMTD:dbgrpt.obj + 0002:00000d3c ??_C@_07JCGI@Warning?$AA@ 2006fd3c LIBCMTD:dbgrpt.obj + 0002:00000d44 ??_C@_0M@ODEP@?$CFs?$CI?$CFd?$CJ?5?3?5?$CFs?$AA@ 2006fd44 LIBCMTD:dbgrpt.obj + 0002:00000d50 ??_C@_01FEHD@?$AN?$AA@ 2006fd50 LIBCMTD:dbgrpt.obj + 0002:00000d54 ??_C@_0BD@BEAK@Assertion?5failed?3?5?$AA@ 2006fd54 LIBCMTD:dbgrpt.obj + 0002:00000d68 ??_C@_0CL@LCCP@_CrtDbgReport?3?5String?5too?5long?5o@ 2006fd68 LIBCMTD:dbgrpt.obj + 0002:00000d94 ??_C@_0DC@EMDK@Second?5Chance?5Assertion?5Failed?3?5@ 2006fd94 LIBCMTD:dbgrpt.obj + 0002:00000dc8 ??_C@_09NJAK@wsprintfA?$AA@ 2006fdc8 LIBCMTD:dbgrpt.obj + 0002:00000dd4 ??_C@_0L@HKL@user32?4dll?$AA@ 2006fdd4 LIBCMTD:dbgrpt.obj + 0002:00000de0 ??_C@_0CD@GCMD@Microsoft?5Visual?5C?$CL?$CL?5Debug?5Libra@ 2006fde0 LIBCMTD:dbgrpt.obj + 0002:00000e04 ??_C@_0FD@EBDD@Debug?5?$CFs?$CB?6?6Program?3?5?$CFs?$CFs?$CFs?$CFs?$CFs?$CFs@ 2006fe04 LIBCMTD:dbgrpt.obj + 0002:00000e58 ??_C@_09DCKN@?6Module?3?5?$AA@ 2006fe58 LIBCMTD:dbgrpt.obj + 0002:00000e64 ??_C@_07HJII@?6File?3?5?$AA@ 2006fe64 LIBCMTD:dbgrpt.obj + 0002:00000e6c ??_C@_07LFGN@?6Line?3?5?$AA@ 2006fe6c LIBCMTD:dbgrpt.obj + 0002:00000e74 ??_C@_00A@?$AA@ 2006fe74 LIBCMTD:dbgrpt.obj + 0002:00000e78 ??_C@_0HD@BHFH@?6?6For?5information?5on?5how?5your?5pr@ 2006fe78 LIBCMTD:dbgrpt.obj + 0002:00000eec ??_C@_08GFHP@dbgrpt?4c?$AA@ 2006feec LIBCMTD:dbgrpt.obj + 0002:00000ef8 ??_C@_0BG@FBEA@szUserMessage?5?$CB?$DN?5NULL?$AA@ 2006fef8 LIBCMTD:dbgrpt.obj + 0002:00000f18 __DEFAULT_CW_in_mem 2006ff18 LIBCMTD:common.obj + 0002:00000f1a __pi_by_2_to_61 2006ff1a LIBCMTD:common.obj + 0002:00000f54 ??_C@_07PDLA@mlock?4c?$AA@ 2006ff54 LIBCMTD:mlock.obj + 0002:00000f5c ??_C@_07PCLE@LC_TIME?$AA@ 2006ff5c LIBCMTD:setlocal.obj + 0002:00000f64 ??_C@_0L@NKG@LC_NUMERIC?$AA@ 2006ff64 LIBCMTD:setlocal.obj + 0002:00000f70 ??_C@_0M@CBIH@LC_MONETARY?$AA@ 2006ff70 LIBCMTD:setlocal.obj + 0002:00000f7c ??_C@_08LFGE@LC_CTYPE?$AA@ 2006ff7c LIBCMTD:setlocal.obj + 0002:00000f88 ??_C@_0L@CFLC@LC_COLLATE?$AA@ 2006ff88 LIBCMTD:setlocal.obj + 0002:00000f94 ??_C@_06GCPK@LC_ALL?$AA@ 2006ff94 LIBCMTD:setlocal.obj + 0002:00000f9c ??_C@_01FAJB@?$DL?$AA@ 2006ff9c LIBCMTD:setlocal.obj + 0002:00000fa0 ??_C@_02BGDO@?$DN?$DL?$AA@ 2006ffa0 LIBCMTD:setlocal.obj + 0002:00000fa4 ??_C@_0L@MOEE@setlocal?4c?$AA@ 2006ffa4 LIBCMTD:setlocal.obj + 0002:00000fb0 ??_C@_01KPOD@?$DN?$AA@ 2006ffb0 LIBCMTD:setlocal.obj + 0002:00000fb4 ??_C@_03DBOJ@_?4?0?$AA@ 2006ffb4 LIBCMTD:setlocal.obj + 0002:00000fb8 ??_C@_01PJCK@?4?$AA@ 2006ffb8 LIBCMTD:setlocal.obj + 0002:00000fbc ??_C@_01NON@_?$AA@ 2006ffbc LIBCMTD:setlocal.obj + 0002:00000fc0 ??_C@_08GINJ@aw_map?4c?$AA@ 2006ffc0 LIBCMTD:aw_map.obj + 0002:00000fcc ??_C@_01A@?$AA?$AA@ 2006ffcc LIBCMTD:aw_map.obj + 0002:00000fd0 ??_C@_13A@?$AA?$AA?$AA?$AA@ 2006ffd0 LIBCMTD:aw_map.obj + 0002:00000fd4 ??_C@_03GAFO@_yn?$AA@ 2006ffd4 LIBCMTD:fpexcept.obj + 0002:00000fd8 ??_C@_03GNLD@_y1?$AA@ 2006ffd8 LIBCMTD:fpexcept.obj + 0002:00000fdc ??_C@_03MHCE@_y0?$AA@ 2006ffdc LIBCMTD:fpexcept.obj + 0002:00000fe0 ??_C@_05PAK@frexp?$AA@ 2006ffe0 LIBCMTD:fpexcept.obj + 0002:00000fe8 ??_C@_04JKCH@fmod?$AA@ 2006ffe8 LIBCMTD:fpexcept.obj + 0002:00000ff0 ??_C@_06GGHF@_hypot?$AA@ 2006fff0 LIBCMTD:fpexcept.obj + 0002:00000ff8 ??_C@_05JNMC@_cabs?$AA@ 2006fff8 LIBCMTD:fpexcept.obj + 0002:00001000 ??_C@_05MEKH@ldexp?$AA@ 20070000 LIBCMTD:fpexcept.obj + 0002:00001008 ??_C@_04KAOJ@modf?$AA@ 20070008 LIBCMTD:fpexcept.obj + 0002:00001010 ??_C@_04EHAJ@fabs?$AA@ 20070010 LIBCMTD:fpexcept.obj + 0002:00001018 ??_C@_05MFBN@floor?$AA@ 20070018 LIBCMTD:fpexcept.obj + 0002:00001020 ??_C@_04JJMP@ceil?$AA@ 20070020 LIBCMTD:fpexcept.obj + 0002:00001028 ??_C@_03JLPI@tan?$AA@ 20070028 LIBCMTD:fpexcept.obj + 0002:0000102c ??_C@_03DLFL@cos?$AA@ 2007002c LIBCMTD:fpexcept.obj + 0002:00001030 ??_C@_03JAMN@sin?$AA@ 20070030 LIBCMTD:fpexcept.obj + 0002:00001034 ??_C@_04LMBE@sqrt?$AA@ 20070034 LIBCMTD:fpexcept.obj + 0002:0000103c ??_C@_05BFPO@atan2?$AA@ 2007003c LIBCMTD:fpexcept.obj + 0002:00001044 ??_C@_04EAGN@atan?$AA@ 20070044 LIBCMTD:fpexcept.obj + 0002:0000104c ??_C@_04OAMO@acos?$AA@ 2007004c LIBCMTD:fpexcept.obj + 0002:00001054 ??_C@_04ELFI@asin?$AA@ 20070054 LIBCMTD:fpexcept.obj + 0002:0000105c ??_C@_04LFAD@tanh?$AA@ 2007005c LIBCMTD:fpexcept.obj + 0002:00001064 ??_C@_04PFKD@cosh?$AA@ 20070064 LIBCMTD:fpexcept.obj + 0002:0000106c ??_C@_04NPAI@sinh?$AA@ 2007006c LIBCMTD:fpexcept.obj + 0002:00001074 ??_C@_05IJHH@log10?$AA@ 20070074 LIBCMTD:fpexcept.obj + 0002:0000107c ??_C@_03BGKD@log?$AA@ 2007007c LIBCMTD:fpexcept.obj + 0002:00001080 ??_C@_03EGFG@pow?$AA@ 20070080 LIBCMTD:fpexcept.obj + 0002:00001084 ??_C@_03CDGJ@exp?$AA@ 20070084 LIBCMTD:fpexcept.obj + 0002:00001098 ??_C@_0DP@IHIN@?$CI?$CCinconsistent?5IOB?5fields?$CC?0?5stre@ 20070098 LIBCMTD:_flsbuf.obj + 0002:000010d8 ??_C@_09LGEI@_flsbuf?4c?$AA@ 200700d8 LIBCMTD:_flsbuf.obj + 0002:000010e4 ??_C@_0M@KJPK@str?5?$CB?$DN?5NULL?$AA@ 200700e4 LIBCMTD:_flsbuf.obj + 0002:000010f0 ___lookuptable 200700f0 LIBCMTD:output.obj + 0002:0000114c ??_C@_1O@POHA@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 2007014c LIBCMTD:output.obj + 0002:0000115c ??_C@_06ONKE@?$CInull?$CJ?$AA@ 2007015c LIBCMTD:output.obj + 0002:00001164 ??_C@_08MIHI@output?4c?$AA@ 20070164 LIBCMTD:output.obj + 0002:00001170 ??_C@_0P@PIHB@ch?5?$CB?$DN?5_T?$CI?8?20?8?$CJ?$AA@ 20070170 LIBCMTD:output.obj + 0002:000011b0 ??_C@_08CNMA@winsig?4c?$AA@ 200701b0 LIBCMTD:winsig.obj + 0002:000011bc ??_C@_0BD@NJFP@GetLastActivePopup?$AA@ 200701bc LIBCMTD:crtmbox.obj + 0002:000011d0 ??_C@_0BA@GILI@GetActiveWindow?$AA@ 200701d0 LIBCMTD:crtmbox.obj + 0002:000011e0 ??_C@_0M@PKCK@MessageBoxA?$AA@ 200701e0 LIBCMTD:crtmbox.obj + 0002:000011ec ??_C@_09DLOM@fprintf?4c?$AA@ 200701ec LIBCMTD:fprintf.obj + 0002:000011f8 ??_C@_09GCII@setvbuf?4c?$AA@ 200701f8 LIBCMTD:setvbuf.obj + 0002:00001204 ??_C@_07HPAH@_file?4c?$AA@ 20070204 LIBCMTD:_file.obj + 0002:0000120c ??_C@_08KFDJ@ioinit?4c?$AA@ 2007020c LIBCMTD:ioinit.obj + 0002:00001218 ??_C@_06DPMO@Client?$AA@ 20070218 LIBCMTD:dbgheap.obj + 0002:00001220 ??_C@_06BAFM@Ignore?$AA@ 20070220 LIBCMTD:dbgheap.obj + 0002:00001228 ??_C@_03DICE@CRT?$AA@ 20070228 LIBCMTD:dbgheap.obj + 0002:0000122c ??_C@_06BILL@Normal?$AA@ 2007022c LIBCMTD:dbgheap.obj + 0002:00001234 ??_C@_04NEN@Free?$AA@ 20070234 LIBCMTD:dbgheap.obj + 0002:0000123c ??_C@_0DC@CGID@Error?3?5memory?5allocation?3?5bad?5me@ 2007023c LIBCMTD:dbgheap.obj + 0002:00001270 ??_C@_0CE@FMIA@Invalid?5allocation?5size?3?5?$CFu?5byte@ 20070270 LIBCMTD:dbgheap.obj + 0002:00001294 ??_C@_02DILL@?$CFs?$AA@ 20070294 LIBCMTD:dbgheap.obj + 0002:00001298 ??_C@_0CB@CPBI@Client?5hook?5allocation?5failure?4?6@ 20070298 LIBCMTD:dbgheap.obj + 0002:000012bc ??_C@_0DF@DKHF@Client?5hook?5allocation?5failure?5a@ 200702bc LIBCMTD:dbgheap.obj + 0002:000012f4 ??_C@_09IMJC@dbgheap?4c?$AA@ 200702f4 LIBCMTD:dbgheap.obj + 0002:00001300 ??_C@_0BC@EPKL@_CrtCheckMemory?$CI?$CJ?$AA@ 20070300 LIBCMTD:dbgheap.obj + 0002:00001314 ??_C@_0BK@JDHA@_pFirstBlock?5?$DN?$DN?5pOldBlock?$AA@ 20070314 LIBCMTD:dbgheap.obj + 0002:00001330 ??_C@_0BJ@NMEF@_pLastBlock?5?$DN?$DN?5pOldBlock?$AA@ 20070330 LIBCMTD:dbgheap.obj + 0002:0000134c ??_C@_0DC@BOCN@fRealloc?5?$HM?$HM?5?$CI?$CBfRealloc?5?$CG?$CG?5pNewBl@ 2007034c LIBCMTD:dbgheap.obj + 0002:00001380 ??_C@_0DK@DKOM@_BLOCK_TYPE?$CIpOldBlock?9?$DOnBlockUse@ 20070380 LIBCMTD:dbgheap.obj + 0002:000013bc ??_C@_0EF@EDKM@pOldBlock?9?$DOnLine?5?$DN?$DN?5IGNORE_LINE?5@ 200703bc LIBCMTD:dbgheap.obj + 0002:00001404 ??_C@_0CC@GPMO@_CrtIsValidHeapPointer?$CIpUserData@ 20070404 LIBCMTD:dbgheap.obj + 0002:00001428 ??_C@_0CN@FHGE@Allocation?5too?5large?5or?5negative@ 20070428 LIBCMTD:dbgheap.obj + 0002:00001458 ??_C@_0CE@EAMN@Client?5hook?5re?9allocation?5failur@ 20070458 LIBCMTD:dbgheap.obj + 0002:0000147c ??_C@_0DI@KKMM@Client?5hook?5re?9allocation?5failur@ 2007047c LIBCMTD:dbgheap.obj + 0002:000014b4 ??_C@_0BG@JCEC@_pFirstBlock?5?$DN?$DN?5pHead?$AA@ 200704b4 LIBCMTD:dbgheap.obj + 0002:000014cc ??_C@_0BF@NLNN@_pLastBlock?5?$DN?$DN?5pHead?$AA@ 200704cc LIBCMTD:dbgheap.obj + 0002:000014e4 ??_C@_0BO@PLHH@pHead?9?$DOnBlockUse?5?$DN?$DN?5nBlockUse?$AA@ 200704e4 LIBCMTD:dbgheap.obj + 0002:00001504 ??_C@_0DN@KKIO@pHead?9?$DOnLine?5?$DN?$DN?5IGNORE_LINE?5?$CG?$CG?5p@ 20070504 LIBCMTD:dbgheap.obj + 0002:00001544 ??_C@_0CK@OJNB@DAMAGE?3?5after?5?$CFhs?5block?5?$CI?$CD?$CFd?$CJ?5at@ 20070544 LIBCMTD:dbgheap.obj + 0002:00001570 ??_C@_0CL@IJIL@DAMAGE?3?5before?5?$CFhs?5block?5?$CI?$CD?$CFd?$CJ?5a@ 20070570 LIBCMTD:dbgheap.obj + 0002:0000159c ??_C@_0CH@PHOC@_BLOCK_TYPE_IS_VALID?$CIpHead?9?$DOnBlo@ 2007059c LIBCMTD:dbgheap.obj + 0002:000015c4 ??_C@_0BL@MBNA@Client?5hook?5free?5failure?4?6?$AA@ 200705c4 LIBCMTD:dbgheap.obj + 0002:000015e0 ??_C@_0DK@EKKL@memory?5check?5error?5at?50x?$CF08X?5?$DN?50@ 200705e0 LIBCMTD:dbgheap.obj + 0002:0000161c ??_C@_0CJ@GCII@?$CFhs?5located?5at?50x?$CF08X?5is?5?$CFu?5byte@ 2007061c LIBCMTD:dbgheap.obj + 0002:00001648 ??_C@_0CA@EJPI@?$CFhs?5allocated?5at?5file?5?$CFhs?$CI?$CFd?$CJ?4?6?$AA@ 20070648 LIBCMTD:dbgheap.obj + 0002:00001668 ??_C@_0CJ@LHHG@DAMAGE?3?5on?5top?5of?5Free?5block?5at?5@ 20070668 LIBCMTD:dbgheap.obj + 0002:00001694 ??_C@_07GJHM@DAMAGED?$AA@ 20070694 LIBCMTD:dbgheap.obj + 0002:0000169c ??_C@_0CL@ODIE@_heapchk?5fails?5with?5unknown?5retu@ 2007069c LIBCMTD:dbgheap.obj + 0002:000016c8 ??_C@_0CC@EHNC@_heapchk?5fails?5with?5_HEAPBADPTR?4@ 200706c8 LIBCMTD:dbgheap.obj + 0002:000016ec ??_C@_0CC@JNDP@_heapchk?5fails?5with?5_HEAPBADEND?4@ 200706ec LIBCMTD:dbgheap.obj + 0002:00001710 ??_C@_0CD@DNMG@_heapchk?5fails?5with?5_HEAPBADNODE@ 20070710 LIBCMTD:dbgheap.obj + 0002:00001734 ??_C@_0CE@JMCB@_heapchk?5fails?5with?5_HEAPBADBEGI@ 20070734 LIBCMTD:dbgheap.obj + 0002:00001758 ??_C@_0CD@MEMI@Bad?5memory?5block?5found?5at?50x?$CF08X@ 20070758 LIBCMTD:dbgheap.obj + 0002:0000177c ??_C@_0CI@GMAO@_CrtMemCheckPoint?3?5NULL?5state?5po@ 2007077c LIBCMTD:dbgheap.obj + 0002:000017a4 ??_C@_0CI@MNAE@_CrtMemDifference?3?5NULL?5state?5po@ 200707a4 LIBCMTD:dbgheap.obj + 0002:000017cc ??_C@_0BH@PKIJ@Object?5dump?5complete?4?6?$AA@ 200707cc LIBCMTD:dbgheap.obj + 0002:000017e4 ??_C@_0DB@DBPF@crt?5block?5at?50x?$CF08X?0?5subtype?5?$CFx?0@ 200707e4 LIBCMTD:dbgheap.obj + 0002:00001818 ??_C@_0CI@JLM@normal?5block?5at?50x?$CF08X?0?5?$CFu?5bytes@ 20070818 LIBCMTD:dbgheap.obj + 0002:00001840 ??_C@_0DE@PFEA@client?5block?5at?50x?$CF08X?0?5subtype?5@ 20070840 LIBCMTD:dbgheap.obj + 0002:00001874 ??_C@_06MBCE@?$HL?$CFld?$HN?5?$AA@ 20070874 LIBCMTD:dbgheap.obj + 0002:0000187c ??_C@_0L@BLDJ@?$CFhs?$CI?$CFd?$CJ?5?3?5?$AA@ 2007087c LIBCMTD:dbgheap.obj + 0002:00001888 ??_C@_0BE@FEMA@?$CDFile?5Error?$CD?$CI?$CFd?$CJ?5?3?5?$AA@ 20070888 LIBCMTD:dbgheap.obj + 0002:0000189c ??_C@_0BE@FPPM@Dumping?5objects?5?9?$DO?6?$AA@ 2007089c LIBCMTD:dbgheap.obj + 0002:000018b0 ??_C@_0BA@POLM@?5Data?3?5?$DM?$CFs?$DO?5?$CFs?6?$AA@ 200708b0 LIBCMTD:dbgheap.obj + 0002:000018c0 ??_C@_05JLAO@?$CF?42X?5?$AA@ 200708c0 LIBCMTD:dbgheap.obj + 0002:000018c8 ??_C@_0BI@KONA@Detected?5memory?5leaks?$CB?6?$AA@ 200708c8 LIBCMTD:dbgheap.obj + 0002:000018e0 ??_C@_0BP@LCCN@Total?5allocations?3?5?$CFld?5bytes?4?6?$AA@ 200708e0 LIBCMTD:dbgheap.obj + 0002:00001900 ??_C@_0CB@COID@Largest?5number?5used?3?5?$CFld?5bytes?4?6@ 20070900 LIBCMTD:dbgheap.obj + 0002:00001924 ??_C@_0BO@MEJD@?$CFld?5bytes?5in?5?$CFld?5?$CFhs?5Blocks?4?6?$AA@ 20070924 LIBCMTD:dbgheap.obj + 0002:00001944 ??_C@_09IGKD@stdenvp?4c?$AA@ 20070944 LIBCMTD:stdenvp.obj + 0002:00001950 ??_C@_09MPMN@stdargv?4c?$AA@ 20070950 LIBCMTD:stdargv.obj + 0002:0000195c ??_C@_08FFKK@aw_env?4c?$AA@ 2007095c LIBCMTD:aw_env.obj + 0002:00001968 ??_C@_0P@GGKG@runtime?5error?5?$AA@ 20070968 LIBCMTD:crt0msg.obj + 0002:00001978 ??_C@_02PIMC@?$AN?6?$AA@ 20070978 LIBCMTD:crt0msg.obj + 0002:0000197c ??_C@_0O@DELO@TLOSS?5error?$AN?6?$AA@ 2007097c LIBCMTD:crt0msg.obj + 0002:0000198c ??_C@_0N@OMLL@SING?5error?$AN?6?$AA@ 2007098c LIBCMTD:crt0msg.obj + 0002:0000199c ??_C@_0P@OJAK@DOMAIN?5error?$AN?6?$AA@ 2007099c LIBCMTD:crt0msg.obj + 0002:000019ac ??_C@_0CF@EANP@R6028?$AN?6?9?5unable?5to?5initialize?5he@ 200709ac LIBCMTD:crt0msg.obj + 0002:000019d4 ??_C@_0DF@ECGN@R6027?$AN?6?9?5not?5enough?5space?5for?5lo@ 200709d4 LIBCMTD:crt0msg.obj + 0002:00001a0c ??_C@_0DF@FKAC@R6026?$AN?6?9?5not?5enough?5space?5for?5st@ 20070a0c LIBCMTD:crt0msg.obj + 0002:00001a44 ??_C@_0CG@DPMN@R6025?$AN?6?9?5pure?5virtual?5function?5c@ 20070a44 LIBCMTD:crt0msg.obj + 0002:00001a6c ??_C@_0DF@CKIP@R6024?$AN?6?9?5not?5enough?5space?5for?5_o@ 20070a6c LIBCMTD:crt0msg.obj + 0002:00001aa4 ??_C@_0CJ@GGOE@R6019?$AN?6?9?5unable?5to?5open?5console?5@ 20070aa4 LIBCMTD:crt0msg.obj + 0002:00001ad0 ??_C@_0CB@LBOB@R6018?$AN?6?9?5unexpected?5heap?5error?$AN?6@ 20070ad0 LIBCMTD:crt0msg.obj + 0002:00001af4 ??_C@_0CN@FPEG@R6017?$AN?6?9?5unexpected?5multithread?5@ 20070af4 LIBCMTD:crt0msg.obj + 0002:00001b24 ??_C@_0CM@OBIC@R6016?$AN?6?9?5not?5enough?5space?5for?5th@ 20070b24 LIBCMTD:crt0msg.obj + 0002:00001b50 ??_C@_0CB@HPAL@?$AN?6abnormal?5program?5termination?$AN?6@ 20070b50 LIBCMTD:crt0msg.obj + 0002:00001b74 ??_C@_0CM@JOOB@R6009?$AN?6?9?5not?5enough?5space?5for?5en@ 20070b74 LIBCMTD:crt0msg.obj + 0002:00001ba0 ??_C@_0CK@OIBL@R6008?$AN?6?9?5not?5enough?5space?5for?5ar@ 20070ba0 LIBCMTD:crt0msg.obj + 0002:00001bcc ??_C@_0CF@LKPB@R6002?$AN?6?9?5floating?5point?5not?5load@ 20070bcc LIBCMTD:crt0msg.obj + 0002:00001bf4 ??_C@_0BK@DEOK@Runtime?5Error?$CB?6?6Program?3?5?$AA@ 20070bf4 LIBCMTD:crt0msg.obj + 0002:00001c10 ??_C@_08OKGP@aw_str?4c?$AA@ 20070c10 LIBCMTD:aw_str.obj + 0002:00001c1c ??_C@_08MOLN@mbtowc?4c?$AA@ 20070c1c LIBCMTD:mbtowc.obj + 0002:00001c28 ??_C@_0CD@NPPL@MB_CUR_MAX?5?$DN?$DN?51?5?$HM?$HM?5MB_CUR_MAX?5?$DN?$DN@ 20070c28 LIBCMTD:mbtowc.obj + 0002:00001c4c ??_C@_09DNOI@_filbuf?4c?$AA@ 20070c4c LIBCMTD:_filbuf.obj + 0002:00001c58 ??_C@_08JKP@ungetc?4c?$AA@ 20070c58 LIBCMTD:ungetc.obj + 0002:00001c64 ??_C@_09NEAG@sprintf?4c?$AA@ 20070c64 LIBCMTD:snprintf.obj + 0002:00001c70 ??_C@_0L@EEGJ@inittime?4c?$AA@ 20070c70 LIBCMTD:inittime.obj + 0002:00001c7c ??_C@_09IMJJ@initnum?4c?$AA@ 20070c7c LIBCMTD:initnum.obj + 0002:00001c88 ??_C@_09KPNI@initmon?4c?$AA@ 20070c88 LIBCMTD:initmon.obj + 0002:00001c94 ??_C@_0L@COIL@initctyp?4c?$AA@ 20070c94 LIBCMTD:initctyp.obj + 0002:00001ca0 ??_C@_0O@GLHB@united?9states?$AA@ 20070ca0 LIBCMTD:getqloc.obj + 0002:00001cb0 ??_C@_0P@IIKK@united?9kingdom?$AA@ 20070cb0 LIBCMTD:getqloc.obj + 0002:00001cc0 ??_C@_0O@ILBP@united?5states?$AA@ 20070cc0 LIBCMTD:getqloc.obj + 0002:00001cd0 ??_C@_0P@KBEK@united?5kingdom?$AA@ 20070cd0 LIBCMTD:getqloc.obj + 0002:00001ce0 ??_C@_03IGKO@twn?$AA@ 20070ce0 LIBCMTD:getqloc.obj + 0002:00001ce4 ??_C@_06CMKP@turkey?$AA@ 20070ce4 LIBCMTD:getqloc.obj + 0002:00001cec ??_C@_03PMGP@tur?$AA@ 20070cec LIBCMTD:getqloc.obj + 0002:00001cf0 ??_C@_06OBJC@taiwan?$AA@ 20070cf0 LIBCMTD:getqloc.obj + 0002:00001cf8 ??_C@_0M@EKGN@switzerland?$AA@ 20070cf8 LIBCMTD:getqloc.obj + 0002:00001d04 ??_C@_06PJFL@sweden?$AA@ 20070d04 LIBCMTD:getqloc.obj + 0002:00001d0c ??_C@_03JDMO@swe?$AA@ 20070d0c LIBCMTD:getqloc.obj + 0002:00001d10 ??_C@_03COKO@svk?$AA@ 20070d10 LIBCMTD:getqloc.obj + 0002:00001d14 ??_C@_05FBKI@spain?$AA@ 20070d14 LIBCMTD:getqloc.obj + 0002:00001d1c ??_C@_0M@BDFM@south?9korea?$AA@ 20070d1c LIBCMTD:getqloc.obj + 0002:00001d28 ??_C@_0M@HNHN@south?5korea?$AA@ 20070d28 LIBCMTD:getqloc.obj + 0002:00001d34 ??_C@_03FANM@sgp?$AA@ 20070d34 LIBCMTD:getqloc.obj + 0002:00001d38 ??_C@_09EOGO@singapore?$AA@ 20070d38 LIBCMTD:getqloc.obj + 0002:00001d44 ??_C@_06NHNE@russia?$AA@ 20070d44 LIBCMTD:getqloc.obj + 0002:00001d4c ??_C@_03CKBC@prt?$AA@ 20070d4c LIBCMTD:getqloc.obj + 0002:00001d50 ??_C@_08EJOH@pr?9china?$AA@ 20070d50 LIBCMTD:getqloc.obj + 0002:00001d5c ??_C@_08CHMG@pr?5china?$AA@ 20070d5c LIBCMTD:getqloc.obj + 0002:00001d68 ??_C@_08GGAN@portugal?$AA@ 20070d68 LIBCMTD:getqloc.obj + 0002:00001d74 ??_C@_06NOHH@poland?$AA@ 20070d74 LIBCMTD:getqloc.obj + 0002:00001d7c ??_C@_03EECH@pol?$AA@ 20070d7c LIBCMTD:getqloc.obj + 0002:00001d80 ??_C@_03DPCG@nzl?$AA@ 20070d80 LIBCMTD:getqloc.obj + 0002:00001d84 ??_C@_02OCJK@nz?$AA@ 20070d84 LIBCMTD:getqloc.obj + 0002:00001d88 ??_C@_06BAPG@norway?$AA@ 20070d88 LIBCMTD:getqloc.obj + 0002:00001d90 ??_C@_0M@MMKA@new?9zealand?$AA@ 20070d90 LIBCMTD:getqloc.obj + 0002:00001d9c ??_C@_0M@OFEA@new?5zealand?$AA@ 20070d9c LIBCMTD:getqloc.obj + 0002:00001da8 ??_C@_0M@POGE@netherlands?$AA@ 20070da8 LIBCMTD:getqloc.obj + 0002:00001db4 ??_C@_06KJLN@mexico?$AA@ 20070db4 LIBCMTD:getqloc.obj + 0002:00001dbc ??_C@_03HEJJ@mex?$AA@ 20070dbc LIBCMTD:getqloc.obj + 0002:00001dc0 ??_C@_05OOCK@korea?$AA@ 20070dc0 LIBCMTD:getqloc.obj + 0002:00001dc8 ??_C@_05EEKJ@japan?$AA@ 20070dc8 LIBCMTD:getqloc.obj + 0002:00001dd0 ??_C@_05DHEA@italy?$AA@ 20070dd0 LIBCMTD:getqloc.obj + 0002:00001dd8 ??_C@_03DEBD@irl?$AA@ 20070dd8 LIBCMTD:getqloc.obj + 0002:00001ddc ??_C@_07JJLD@ireland?$AA@ 20070ddc LIBCMTD:getqloc.obj + 0002:00001de4 ??_C@_07FGBB@iceland?$AA@ 20070de4 LIBCMTD:getqloc.obj + 0002:00001dec ??_C@_07IDDB@hungary?$AA@ 20070dec LIBCMTD:getqloc.obj + 0002:00001df4 ??_C@_09MGEH@hong?9kong?$AA@ 20070df4 LIBCMTD:getqloc.obj + 0002:00001e00 ??_C@_09OHNN@hong?5kong?$AA@ 20070e00 LIBCMTD:getqloc.obj + 0002:00001e0c ??_C@_07CCAK@holland?$AA@ 20070e0c LIBCMTD:getqloc.obj + 0002:00001e14 ??_C@_03EFD@hkg?$AA@ 20070e14 LIBCMTD:getqloc.obj + 0002:00001e18 ??_C@_06FLIB@greece?$AA@ 20070e18 LIBCMTD:getqloc.obj + 0002:00001e20 ??_C@_0O@MEPL@great?5britain?$AA@ 20070e20 LIBCMTD:getqloc.obj + 0002:00001e30 ??_C@_03EJIM@grc?$AA@ 20070e30 LIBCMTD:getqloc.obj + 0002:00001e34 ??_C@_07CPP@germany?$AA@ 20070e34 LIBCMTD:getqloc.obj + 0002:00001e3c ??_C@_03CAMC@gbr?$AA@ 20070e3c LIBCMTD:getqloc.obj + 0002:00001e40 ??_C@_06DNOH@france?$AA@ 20070e40 LIBCMTD:getqloc.obj + 0002:00001e48 ??_C@_07IMFA@finland?$AA@ 20070e48 LIBCMTD:getqloc.obj + 0002:00001e50 ??_C@_07LGIB@england?$AA@ 20070e50 LIBCMTD:getqloc.obj + 0002:00001e58 ??_C@_03GOFI@dnk?$AA@ 20070e58 LIBCMTD:getqloc.obj + 0002:00001e5c ??_C@_07ILKC@denmark?$AA@ 20070e5c LIBCMTD:getqloc.obj + 0002:00001e64 ??_C@_03ELPA@cze?$AA@ 20070e64 LIBCMTD:getqloc.obj + 0002:00001e68 ??_C@_03KHAN@chn?$AA@ 20070e68 LIBCMTD:getqloc.obj + 0002:00001e6c ??_C@_05NMPB@china?$AA@ 20070e6c LIBCMTD:getqloc.obj + 0002:00001e74 ??_C@_03MAM@che?$AA@ 20070e74 LIBCMTD:getqloc.obj + 0002:00001e78 ??_C@_06CJAO@canada?$AA@ 20070e78 LIBCMTD:getqloc.obj + 0002:00001e80 ??_C@_03EPD@can?$AA@ 20070e80 LIBCMTD:getqloc.obj + 0002:00001e84 ??_C@_07GN@britain?$AA@ 20070e84 LIBCMTD:getqloc.obj + 0002:00001e8c ??_C@_06GEHJ@brazil?$AA@ 20070e8c LIBCMTD:getqloc.obj + 0002:00001e94 ??_C@_03GOO@bra?$AA@ 20070e94 LIBCMTD:getqloc.obj + 0002:00001e98 ??_C@_07ECDD@belgium?$AA@ 20070e98 LIBCMTD:getqloc.obj + 0002:00001ea0 ??_C@_03FJGB@bel?$AA@ 20070ea0 LIBCMTD:getqloc.obj + 0002:00001ea4 ??_C@_03DIDL@aut?$AA@ 20070ea4 LIBCMTD:getqloc.obj + 0002:00001ea8 ??_C@_07OIK@austria?$AA@ 20070ea8 LIBCMTD:getqloc.obj + 0002:00001eb0 ??_C@_09MKKB@australia?$AA@ 20070eb0 LIBCMTD:getqloc.obj + 0002:00001ebc ??_C@_03GNNO@aus?$AA@ 20070ebc LIBCMTD:getqloc.obj + 0002:00001ec0 ??_C@_07DLAK@america?$AA@ 20070ec0 LIBCMTD:getqloc.obj + 0002:00001ec8 ??_C@_03IPEP@usa?$AA@ 20070ec8 LIBCMTD:getqloc.obj + 0002:00001ecc ??_C@_02PILH@us?$AA@ 20070ecc LIBCMTD:getqloc.obj + 0002:00001ed0 ??_C@_02FHP@uk?$AA@ 20070ed0 LIBCMTD:getqloc.obj + 0002:00001ed4 ??_C@_07BNFK@turkish?$AA@ 20070ed4 LIBCMTD:getqloc.obj + 0002:00001edc ??_C@_03MKGF@trk?$AA@ 20070edc LIBCMTD:getqloc.obj + 0002:00001ee0 ??_C@_05DEAI@swiss?$AA@ 20070ee0 LIBCMTD:getqloc.obj + 0002:00001ee8 ??_C@_07ENHD@swedish?$AA@ 20070ee8 LIBCMTD:getqloc.obj + 0002:00001ef0 ??_C@_03IFGE@sve?$AA@ 20070ef0 LIBCMTD:getqloc.obj + 0002:00001ef4 ??_C@_0P@NJBN@spanish?9modern?$AA@ 20070ef4 LIBCMTD:getqloc.obj + 0002:00001f04 ??_C@_0BA@NHDN@spanish?9mexican?$AA@ 20070f04 LIBCMTD:getqloc.obj + 0002:00001f14 ??_C@_07EFLC@spanish?$AA@ 20070f14 LIBCMTD:getqloc.obj + 0002:00001f1c ??_C@_06KFFJ@slovak?$AA@ 20070f1c LIBCMTD:getqloc.obj + 0002:00001f24 ??_C@_03EBAN@sky?$AA@ 20070f24 LIBCMTD:getqloc.obj + 0002:00001f28 ??_C@_07JNDN@russian?$AA@ 20070f28 LIBCMTD:getqloc.obj + 0002:00001f30 ??_C@_03LKIP@rus?$AA@ 20070f30 LIBCMTD:getqloc.obj + 0002:00001f34 ??_C@_03LCE@ptg?$AA@ 20070f34 LIBCMTD:getqloc.obj + 0002:00001f38 ??_C@_03LOP@ptb?$AA@ 20070f38 LIBCMTD:getqloc.obj + 0002:00001f3c ??_C@_0BF@KMMM@portuguese?9brazilian?$AA@ 20070f3c LIBCMTD:getqloc.obj + 0002:00001f54 ??_C@_0L@HNPF@portuguese?$AA@ 20070f54 LIBCMTD:getqloc.obj + 0002:00001f60 ??_C@_06CDNL@polish?$AA@ 20070f60 LIBCMTD:getqloc.obj + 0002:00001f68 ??_C@_03CKDN@plk?$AA@ 20070f68 LIBCMTD:getqloc.obj + 0002:00001f6c ??_C@_0BC@BAAE@norwegian?9nynorsk?$AA@ 20070f6c LIBCMTD:getqloc.obj + 0002:00001f80 ??_C@_0BB@PBHK@norwegian?9bokmal?$AA@ 20070f80 LIBCMTD:getqloc.obj + 0002:00001f94 ??_C@_09EHKL@norwegian?$AA@ 20070f94 LIBCMTD:getqloc.obj + 0002:00001fa0 ??_C@_03BLDF@nor?$AA@ 20070fa0 LIBCMTD:getqloc.obj + 0002:00001fa4 ??_C@_03EMKB@non?$AA@ 20070fa4 LIBCMTD:getqloc.obj + 0002:00001fa8 ??_C@_03HGMI@nld?$AA@ 20070fa8 LIBCMTD:getqloc.obj + 0002:00001fac ??_C@_03IJLK@nlb?$AA@ 20070fac LIBCMTD:getqloc.obj + 0002:00001fb0 ??_C@_06KKAE@korean?$AA@ 20070fb0 LIBCMTD:getqloc.obj + 0002:00001fb8 ??_C@_03BHJ@kor?$AA@ 20070fb8 LIBCMTD:getqloc.obj + 0002:00001fbc ??_C@_03LKFD@jpn?$AA@ 20070fbc LIBCMTD:getqloc.obj + 0002:00001fc0 ??_C@_08KCAB@japanese?$AA@ 20070fc0 LIBCMTD:getqloc.obj + 0002:00001fcc ??_C@_03OLMB@its?$AA@ 20070fcc LIBCMTD:getqloc.obj + 0002:00001fd0 ??_C@_0O@BEAN@italian?9swiss?$AA@ 20070fd0 LIBCMTD:getqloc.obj + 0002:00001fe0 ??_C@_07CBME@italian?$AA@ 20070fe0 LIBCMTD:getqloc.obj + 0002:00001fe8 ??_C@_03BHJP@ita?$AA@ 20070fe8 LIBCMTD:getqloc.obj + 0002:00001fec ??_C@_03CCLJ@isl?$AA@ 20070fec LIBCMTD:getqloc.obj + 0002:00001ff0 ??_C@_0O@OIFK@irish?9english?$AA@ 20070ff0 LIBCMTD:getqloc.obj + 0002:00002000 ??_C@_09OEEF@icelandic?$AA@ 20071000 LIBCMTD:getqloc.obj + 0002:0000200c ??_C@_09IBNG@hungarian?$AA@ 2007100c LIBCMTD:getqloc.obj + 0002:00002018 ??_C@_03FCHO@hun?$AA@ 20071018 LIBCMTD:getqloc.obj + 0002:0000201c ??_C@_05DOKD@greek?$AA@ 2007101c LIBCMTD:getqloc.obj + 0002:00002024 ??_C@_0N@NBPL@german?9swiss?$AA@ 20071024 LIBCMTD:getqloc.obj + 0002:00002034 ??_C@_0BA@MKDC@german?9austrian?$AA@ 20071034 LIBCMTD:getqloc.obj + 0002:00002044 ??_C@_06IAFA@german?$AA@ 20071044 LIBCMTD:getqloc.obj + 0002:0000204c ??_C@_03LCOK@frs?$AA@ 2007104c LIBCMTD:getqloc.obj + 0002:00002050 ??_C@_0N@ODNB@french?9swiss?$AA@ 20071050 LIBCMTD:getqloc.obj + 0002:00002060 ??_C@_0BA@NABK@french?9canadian?$AA@ 20071060 LIBCMTD:getqloc.obj + 0002:00002070 ??_C@_0P@CJNO@french?9belgian?$AA@ 20071070 LIBCMTD:getqloc.obj + 0002:00002080 ??_C@_06PMNM@french?$AA@ 20071080 LIBCMTD:getqloc.obj + 0002:00002088 ??_C@_03BLJK@frc?$AA@ 20071088 LIBCMTD:getqloc.obj + 0002:0000208c ??_C@_03LBAN@frb?$AA@ 2007108c LIBCMTD:getqloc.obj + 0002:00002090 ??_C@_03EOLE@fra?$AA@ 20071090 LIBCMTD:getqloc.obj + 0002:00002094 ??_C@_07DLFI@finnish?$AA@ 20071094 LIBCMTD:getqloc.obj + 0002:0000209c ??_C@_03KLOL@fin?$AA@ 2007109c LIBCMTD:getqloc.obj + 0002:000020a0 ??_C@_03KNMC@esp?$AA@ 200710a0 LIBCMTD:getqloc.obj + 0002:000020a4 ??_C@_03KPHI@esn?$AA@ 200710a4 LIBCMTD:getqloc.obj + 0002:000020a8 ??_C@_03FAMB@esm?$AA@ 200710a8 LIBCMTD:getqloc.obj + 0002:000020ac ??_C@_03DPKJ@enz?$AA@ 200710ac LIBCMTD:getqloc.obj + 0002:000020b0 ??_C@_03DOPE@enu?$AA@ 200710b0 LIBCMTD:getqloc.obj + 0002:000020b4 ??_C@_03GJGA@eni?$AA@ 200710b4 LIBCMTD:getqloc.obj + 0002:000020b8 ??_C@_0M@LJOL@english?9usa?$AA@ 200710b8 LIBCMTD:getqloc.obj + 0002:000020c4 ??_C@_0L@FMNC@english?9us?$AA@ 200710c4 LIBCMTD:getqloc.obj + 0002:000020d0 ??_C@_0L@KBBK@english?9uk?$AA@ 200710d0 LIBCMTD:getqloc.obj + 0002:000020dc ??_C@_0L@EGPP@english?9nz?$AA@ 200710dc LIBCMTD:getqloc.obj + 0002:000020e8 ??_C@_0M@PMJI@english?9ire?$AA@ 200710e8 LIBCMTD:getqloc.obj + 0002:000020f4 ??_C@_0M@DCFH@english?9can?$AA@ 200710f4 LIBCMTD:getqloc.obj + 0002:00002100 ??_C@_0M@FLHK@english?9aus?$AA@ 20071100 LIBCMTD:getqloc.obj + 0002:0000210c ??_C@_0BB@HNCK@english?9american?$AA@ 2007110c LIBCMTD:getqloc.obj + 0002:00002120 ??_C@_07ELCN@english?$AA@ 20071120 LIBCMTD:getqloc.obj + 0002:00002128 ??_C@_03MCKK@eng?$AA@ 20071128 LIBCMTD:getqloc.obj + 0002:0000212c ??_C@_03GIPG@enc?$AA@ 2007112c LIBCMTD:getqloc.obj + 0002:00002130 ??_C@_03DNNI@ena?$AA@ 20071130 LIBCMTD:getqloc.obj + 0002:00002134 ??_C@_03EEPO@ell?$AA@ 20071134 LIBCMTD:getqloc.obj + 0002:00002138 ??_C@_0O@PAMI@dutch?9belgian?$AA@ 20071138 LIBCMTD:getqloc.obj + 0002:00002148 ??_C@_05NPEI@dutch?$AA@ 20071148 LIBCMTD:getqloc.obj + 0002:00002150 ??_C@_03OCEJ@deu?$AA@ 20071150 LIBCMTD:getqloc.obj + 0002:00002154 ??_C@_03BNDL@des?$AA@ 20071154 LIBCMTD:getqloc.obj + 0002:00002158 ??_C@_03OBGF@dea?$AA@ 20071158 LIBCMTD:getqloc.obj + 0002:0000215c ??_C@_06KEAI@danish?$AA@ 2007115c LIBCMTD:getqloc.obj + 0002:00002164 ??_C@_03LKJC@dan?$AA@ 20071164 LIBCMTD:getqloc.obj + 0002:00002168 ??_C@_05BMOA@czech?$AA@ 20071168 LIBCMTD:getqloc.obj + 0002:00002170 ??_C@_03LPJK@csy?$AA@ 20071170 LIBCMTD:getqloc.obj + 0002:00002174 ??_C@_03POL@cht?$AA@ 20071174 LIBCMTD:getqloc.obj + 0002:00002178 ??_C@_03FKAO@chs?$AA@ 20071178 LIBCMTD:getqloc.obj + 0002:0000217c ??_C@_0BE@FPEJ@chinese?9traditional?$AA@ 2007117c LIBCMTD:getqloc.obj + 0002:00002190 ??_C@_0BC@CHFL@chinese?9singapore?$AA@ 20071190 LIBCMTD:getqloc.obj + 0002:000021a4 ??_C@_0BD@DCMH@chinese?9simplified?$AA@ 200711a4 LIBCMTD:getqloc.obj + 0002:000021b8 ??_C@_0BB@JMOE@chinese?9hongkong?$AA@ 200711b8 LIBCMTD:getqloc.obj + 0002:000021cc ??_C@_07NGFN@chinese?$AA@ 200711cc LIBCMTD:getqloc.obj + 0002:000021d4 ??_C@_03PCOI@chi?$AA@ 200711d4 LIBCMTD:getqloc.obj + 0002:000021d8 ??_C@_03FIHP@chh?$AA@ 200711d8 LIBCMTD:getqloc.obj + 0002:000021dc ??_C@_08HFLO@canadian?$AA@ 200711dc LIBCMTD:getqloc.obj + 0002:000021e8 ??_C@_07INIJ@belgian?$AA@ 200711e8 LIBCMTD:getqloc.obj + 0002:000021f0 ??_C@_0L@LCCA@australian?$AA@ 200711f0 LIBCMTD:getqloc.obj + 0002:000021fc ??_C@_0BB@BJIO@american?9english?$AA@ 200711fc LIBCMTD:getqloc.obj + 0002:00002210 ??_C@_0BB@DAGO@american?5english?$AA@ 20071210 LIBCMTD:getqloc.obj + 0002:00002224 ??_C@_08HENB@american?$AA@ 20071224 LIBCMTD:getqloc.obj + 0002:00002230 ??_C@_03DGJE@OCP?$AA@ 20071230 LIBCMTD:getqloc.obj + 0002:00002234 ??_C@_03EKFG@ACP?$AA@ 20071234 LIBCMTD:getqloc.obj + 0002:00002238 ??_C@_09EMDO@_getbuf?4c?$AA@ 20071238 LIBCMTD:_getbuf.obj + 0002:00002244 ??_C@_09JNND@_sftbuf?4c?$AA@ 20071244 LIBCMTD:_sftbuf.obj + 0002:00002250 ??_C@_0BH@EOPG@flag?5?$DN?$DN?50?5?$HM?$HM?5flag?5?$DN?$DN?51?$AA@ 20071250 LIBCMTD:_sftbuf.obj + 0002:00002268 ??_C@_0L@JIE@_freebuf?4c?$AA@ 20071268 LIBCMTD:_freebuf.obj + 0002:00002274 ??_C@_06PAPI@1?$CDQNAN?$AA@ 20071274 LIBCMTD:x10fout.obj + 0002:0000227c ??_C@_05BGNL@1?$CDINF?$AA@ 2007127c LIBCMTD:x10fout.obj + 0002:00002284 ??_C@_05EDPF@1?$CDIND?$AA@ 20071284 LIBCMTD:x10fout.obj + 0002:0000228c ??_C@_06LKFM@1?$CDSNAN?$AA@ 2007128c LIBCMTD:x10fout.obj + 0002:00002294 ??_C@_07CJME@H?3mm?3ss?$AA@ 20071294 LIBCMTD:strftime.obj + 0002:0000229c ??_C@_0BE@MHI@dddd?0?5MMMM?5dd?0?5yyyy?$AA@ 2007129c LIBCMTD:strftime.obj + 0002:000022b0 ??_C@_06HCAD@M?1d?1yy?$AA@ 200712b0 LIBCMTD:strftime.obj + 0002:000022b8 ??_C@_02DBLP@PM?$AA@ 200712b8 LIBCMTD:strftime.obj + 0002:000022bc ??_C@_02ENLM@AM?$AA@ 200712bc LIBCMTD:strftime.obj + 0002:000022c0 ??_C@_08LIDF@December?$AA@ 200712c0 LIBCMTD:strftime.obj + 0002:000022cc ??_C@_08NJLI@November?$AA@ 200712cc LIBCMTD:strftime.obj + 0002:000022d8 ??_C@_07IAMM@October?$AA@ 200712d8 LIBCMTD:strftime.obj + 0002:000022e0 ??_C@_09MKGD@September?$AA@ 200712e0 LIBCMTD:strftime.obj + 0002:000022ec ??_C@_06PADP@August?$AA@ 200712ec LIBCMTD:strftime.obj + 0002:000022f4 ??_C@_04PIJO@July?$AA@ 200712f4 LIBCMTD:strftime.obj + 0002:000022fc ??_C@_04ICFP@June?$AA@ 200712fc LIBCMTD:strftime.obj + 0002:00002304 ??_C@_05JFGC@April?$AA@ 20071304 LIBCMTD:strftime.obj + 0002:0000230c ??_C@_05FGPD@March?$AA@ 2007130c LIBCMTD:strftime.obj + 0002:00002314 ??_C@_08PGBA@February?$AA@ 20071314 LIBCMTD:strftime.obj + 0002:00002320 ??_C@_07BPKJ@January?$AA@ 20071320 LIBCMTD:strftime.obj + 0002:00002328 ??_C@_03PGJO@Dec?$AA@ 20071328 LIBCMTD:strftime.obj + 0002:0000232c ??_C@_03PDLM@Nov?$AA@ 2007132c LIBCMTD:strftime.obj + 0002:00002330 ??_C@_03BLHK@Oct?$AA@ 20071330 LIBCMTD:strftime.obj + 0002:00002334 ??_C@_03DPFM@Sep?$AA@ 20071334 LIBCMTD:strftime.obj + 0002:00002338 ??_C@_03CMCH@Aug?$AA@ 20071338 LIBCMTD:strftime.obj + 0002:0000233c ??_C@_03OBKI@Jul?$AA@ 2007133c LIBCMTD:strftime.obj + 0002:00002340 ??_C@_03LEIG@Jun?$AA@ 20071340 LIBCMTD:strftime.obj + 0002:00002344 ??_C@_03MGHB@May?$AA@ 20071344 LIBCMTD:strftime.obj + 0002:00002348 ??_C@_03MJJM@Apr?$AA@ 20071348 LIBCMTD:strftime.obj + 0002:0000234c ??_C@_03GNHA@Mar?$AA@ 2007134c LIBCMTD:strftime.obj + 0002:00002350 ??_C@_03PICE@Feb?$AA@ 20071350 LIBCMTD:strftime.obj + 0002:00002354 ??_C@_03IEIF@Jan?$AA@ 20071354 LIBCMTD:strftime.obj + 0002:00002358 ??_C@_08FAKH@Saturday?$AA@ 20071358 LIBCMTD:strftime.obj + 0002:00002364 ??_C@_06ONCK@Friday?$AA@ 20071364 LIBCMTD:strftime.obj + 0002:0000236c ??_C@_08CCFO@Thursday?$AA@ 2007136c LIBCMTD:strftime.obj + 0002:00002378 ??_C@_09PBIN@Wednesday?$AA@ 20071378 LIBCMTD:strftime.obj + 0002:00002384 ??_C@_07BMBC@Tuesday?$AA@ 20071384 LIBCMTD:strftime.obj + 0002:0000238c ??_C@_06CHLK@Monday?$AA@ 2007138c LIBCMTD:strftime.obj + 0002:00002394 ??_C@_06OOEM@Sunday?$AA@ 20071394 LIBCMTD:strftime.obj + 0002:0000239c ??_C@_03MPKK@Sat?$AA@ 2007139c LIBCMTD:strftime.obj + 0002:000023a0 ??_C@_03FINJ@Fri?$AA@ 200713a0 LIBCMTD:strftime.obj + 0002:000023a4 ??_C@_03HIKC@Thu?$AA@ 200713a4 LIBCMTD:strftime.obj + 0002:000023a8 ??_C@_03HECK@Wed?$AA@ 200713a8 LIBCMTD:strftime.obj + 0002:000023ac ??_C@_03ECCP@Tue?$AA@ 200713ac LIBCMTD:strftime.obj + 0002:000023b0 ??_C@_03PIEP@Mon?$AA@ 200713b0 LIBCMTD:strftime.obj + 0002:000023b4 ??_C@_03FHEP@Sun?$AA@ 200713b4 LIBCMTD:strftime.obj + 0002:000023b8 ??_C@_03MKGK@a?1p?$AA@ 200713b8 LIBCMTD:strftime.obj + 0002:000023bc ??_C@_05BDJK@am?1pm?$AA@ 200713bc LIBCMTD:strftime.obj + 0002:000023c4 ??_C@_0L@HKCB@inithelp?4c?$AA@ 200713c4 LIBCMTD:inithelp.obj + 0002:000023d0 ??_C@_08OKNB@aw_loc?4c?$AA@ 200713d0 LIBCMTD:aw_loc.obj + 0002:000023dc ??_C@_09LNLM@osfinfo?4c?$AA@ 200713dc LIBCMTD:osfinfo.obj + 0002:000023e8 ??_C@_08PHBD@fclose?4c?$AA@ 200713e8 LIBCMTD:fclose.obj + 0002:000023f8 ___dnames 200713f8 LIBCMTD:timeset.obj + 0002:00002410 ___mnames 20071410 LIBCMTD:timeset.obj + 0002:00002438 ??_C@_07DEKI@tzset?4c?$AA@ 20071438 LIBCMTD:tzset.obj + 0002:00002440 ??_C@_02JHIA@TZ?$AA@ 20071440 LIBCMTD:tzset.obj + 0002:00002444 ??_C@_0L@LIHO@wcstombs?4c?$AA@ 20071444 LIBCMTD:wcstombs.obj + 0002:00002450 ??_C@_0N@ILLM@pwcs?5?$CB?$DN?5NULL?$AA@ 20071450 LIBCMTD:wcstombs.obj + 0002:00002460 ??_C@_0L@EJNO@wtombenv?4c?$AA@ 20071460 LIBCMTD:wtombenv.obj + 0002:0000246c ??_C@_08BGPE@aw_cmp?4c?$AA@ 2007146c LIBCMTD:aw_cmp.obj + 0002:00002478 ??_C@_0DN@PPKB@cchCount1?$DN?$DN0?5?$CG?$CG?5cchCount2?$DN?$DN1?5?$HM?$HM?5@ 20071478 LIBCMTD:aw_cmp.obj + 0002:000024b8 ??_C@_08FEIK@setenv?4c?$AA@ 200714b8 LIBCMTD:setenv.obj + 0003:00000000 ___xc_a 20072000 LIBCMTD:crt0init.obj + 0003:00000004 ___xc_z 20072004 LIBCMTD:crt0init.obj + 0003:00000008 ___xi_a 20072008 LIBCMTD:crt0init.obj + 0003:00000010 ___xi_z 20072010 LIBCMTD:crt0init.obj + 0003:00000014 ___xp_a 20072014 LIBCMTD:crt0init.obj + 0003:0000001c ___xp_z 2007201c LIBCMTD:crt0init.obj + 0003:00000020 ___xt_a 20072020 LIBCMTD:crt0init.obj + 0003:00000024 ___xt_z 20072024 LIBCMTD:crt0init.obj + 0003:00003240 _voiceCommands 20075240 ai_vcmd.obj + 0003:000033c8 _bg_itemlist 200753c8 bg_misc.obj + 0003:00003e58 _bg_numItems 20075e58 bg_misc.obj + 0003:00003e60 _eventnames 20075e60 bg_misc.obj + 0003:00005f04 _pm_stopspeed 20077f04 bg_pmove.obj + 0003:00005f08 _pm_duckScale 20077f08 bg_pmove.obj + 0003:00005f0c _pm_swimScale 20077f0c bg_pmove.obj + 0003:00005f10 _pm_wadeScale 20077f10 bg_pmove.obj + 0003:00005f14 _pm_accelerate 20077f14 bg_pmove.obj + 0003:00005f18 _pm_airaccelerate 20077f18 bg_pmove.obj + 0003:00005f1c _pm_wateraccelerate 20077f1c bg_pmove.obj + 0003:00005f20 _pm_flyaccelerate 20077f20 bg_pmove.obj + 0003:00005f24 _pm_friction 20077f24 bg_pmove.obj + 0003:00005f28 _pm_waterfriction 20077f28 bg_pmove.obj + 0003:00005f2c _pm_flightfriction 20077f2c bg_pmove.obj + 0003:00005f30 _pm_spectatorfriction 20077f30 bg_pmove.obj + 0003:00007f18 _modNames 20079f18 g_combat.obj + 0003:0000a188 _fields 2007c188 g_spawn.obj + 0003:0000a2d8 _spawns 2007c2d8 g_spawn.obj + 0003:0000bc90 _axisDefault 2007dc90 q_math.obj + 0003:0000bcb8 _colorBlack 2007dcb8 q_math.obj + 0003:0000bcc8 _colorRed 2007dcc8 q_math.obj + 0003:0000bcd8 _colorGreen 2007dcd8 q_math.obj + 0003:0000bce8 _colorBlue 2007dce8 q_math.obj + 0003:0000bcf8 _colorYellow 2007dcf8 q_math.obj + 0003:0000bd08 _colorMagenta 2007dd08 q_math.obj + 0003:0000bd18 _colorCyan 2007dd18 q_math.obj + 0003:0000bd28 _colorWhite 2007dd28 q_math.obj + 0003:0000bd38 _colorLtGrey 2007dd38 q_math.obj + 0003:0000bd48 _colorMdGrey 2007dd48 q_math.obj + 0003:0000bd58 _colorDkGrey 2007dd58 q_math.obj + 0003:0000bd68 _g_color_table 2007dd68 q_math.obj + 0003:0000bde8 _bytedirs 2007dde8 q_math.obj + 0003:0000c8f0 __fltused 2007e8f0 LIBCMTD:fpinit.obj + 0003:0000c8f4 __ldused 2007e8f4 LIBCMTD:fpinit.obj + 0003:0000c8f8 __FPinit 2007e8f8 LIBCMTD:fpinit.obj + 0003:0000c8fc __FPmtinit 2007e8fc LIBCMTD:fpinit.obj + 0003:0000c900 __FPmtterm 2007e900 LIBCMTD:fpinit.obj + 0003:0000c984 __aexit_rtn 2007e984 LIBCMTD:dllcrt0.obj + 0003:0000c988 __pctype 2007e988 LIBCMTD:ctype.obj + 0003:0000c98c __pwctype 2007e98c LIBCMTD:ctype.obj + 0003:0000c990 __ctype 2007e990 LIBCMTD:ctype.obj + 0003:0000cb94 ___mb_cur_max 2007eb94 LIBCMTD:nlsdata1.obj + 0003:0000cb98 ___decimal_point 2007eb98 LIBCMTD:nlsdata1.obj + 0003:0000cb9c ___decimal_point_length 2007eb9c LIBCMTD:nlsdata1.obj + 0003:0000cba0 ___tlsindex 2007eba0 LIBCMTD:tidtable.obj + 0003:0000cba8 __cfltcvt_tab 2007eba8 LIBCMTD:cmiscdat.obj + 0003:0000cbd0 __crtAssertBusy 2007ebd0 LIBCMTD:dbgrpt.obj + 0003:0000cbd8 __CrtDbgMode 2007ebd8 LIBCMTD:dbgrpt.obj + 0003:0000cbe8 __CrtDbgFile 2007ebe8 LIBCMTD:dbgrpt.obj + 0003:0000cc10 __indefinite 2007ec10 LIBCMTD:87disp.obj + 0003:0000cc1a __piby2 2007ec1a LIBCMTD:87disp.obj + 0003:0000cc40 __locktable 2007ec40 LIBCMTD:mlock.obj + 0003:0000cf38 __d_inf 2007ef38 LIBCMTD:util.obj + 0003:0000cf40 __d_ind 2007ef40 LIBCMTD:util.obj + 0003:0000cf48 __d_max 2007ef48 LIBCMTD:util.obj + 0003:0000cf50 __d_min 2007ef50 LIBCMTD:util.obj + 0003:0000cf58 __d_mzero 2007ef58 LIBCMTD:util.obj + 0003:0000cf7c ___nullstring 2007ef7c LIBCMTD:output.obj + 0003:0000cf80 ___wnullstring 2007ef80 LIBCMTD:output.obj + 0003:0000cf90 __OP_ATAN2jmptab 2007ef90 LIBCMTD:87triga.obj + 0003:0000cfe0 __iob 2007efe0 LIBCMTD:_file.obj + 0003:0000d260 ___badioinfo 2007f260 LIBCMTD:ioinit.obj + 0003:0000d288 __crtDbgFlag 2007f288 LIBCMTD:dbgheap.obj + 0003:0000d290 __crtBreakAlloc 2007f290 LIBCMTD:dbgheap.obj + 0003:0000d3b0 __amblksiz 2007f3b0 LIBCMTD:heapinit.obj + 0003:0000d448 __XcptActTab 2007f448 LIBCMTD:winxfltr.obj + 0003:0000d4c0 __First_FPE_Indx 2007f4c0 LIBCMTD:winxfltr.obj + 0003:0000d4c4 __Num_FPE 2007f4c4 LIBCMTD:winxfltr.obj + 0003:0000d4c8 __XcptActTabSize 2007f4c8 LIBCMTD:winxfltr.obj + 0003:0000d4cc __XcptActTabCount 2007f4cc LIBCMTD:winxfltr.obj + 0003:0000d500 ___rg_lang_rec 2007f500 LIBCMTD:getqloc.obj + 0003:0000d818 ___rg_ctry_rec 2007f818 LIBCMTD:getqloc.obj + 0003:0000dad0 ___rgrgwlang 2007fad0 LIBCMTD:getqloc.obj + 0003:0000de60 __matherr_flag 2007fe60 LIBCMTD:matherr.obj + 0003:0000de70 __pfnAllocHook 2007fe70 LIBCMTD:dbghook.obj + 0003:0000de78 ___small_block_heap 2007fe78 LIBCMTD:sbheap.obj + 0003:0000fe9c ___sbh_threshold 20081e9c LIBCMTD:sbheap.obj + 0003:0000fea0 ___lc_time_c 20081ea0 LIBCMTD:strftime.obj + 0003:0000ff4c ___lc_time_curr 20081f4c LIBCMTD:strftime.obj + 0003:0000ff50 ___lconv_static_decimal 20081f50 LIBCMTD:lconv.obj + 0003:0000ff58 ___lconv_c 20081f58 LIBCMTD:lconv.obj + 0003:0000ff88 ___lconv 20081f88 LIBCMTD:lconv.obj + 0003:0000ff90 __pow10pos 20081f90 LIBCMTD:constpow.obj + 0003:000100f0 __pow10neg 200820f0 LIBCMTD:constpow.obj + 0003:00010250 __timezone 20082250 LIBCMTD:timeset.obj + 0003:00010254 __daylight 20082254 LIBCMTD:timeset.obj + 0003:00010258 __dstbias 20082258 LIBCMTD:timeset.obj + 0003:000102e0 __tzname 200822e0 LIBCMTD:timeset.obj + 0003:00010308 __lpdays 20082308 LIBCMTD:days.obj + 0003:00010340 __days 20082340 LIBCMTD:days.obj + 0003:00010678 _c_pmove 20082678 bg_pmove.obj + 0003:00055de8 _remapCount 200c7de8 g_utils.obj + 0003:00055e80 _vec3_origin 200c7e80 q_math.obj + 0003:0006c0ac ___fastflag 200de0ac LIBCMTD:fpinit.obj + 0003:0006c0b0 __adjust_fdiv 200de0b0 LIBCMTD:fpinit.obj + 0003:0006c0b8 __aenvptr 200de0b8 LIBCMTD:dllcrt0.obj + 0003:0006c0bc __wenvptr 200de0bc LIBCMTD:dllcrt0.obj + 0003:0006c0c0 ___error_mode 200de0c0 LIBCMTD:dllcrt0.obj + 0003:0006c0c4 ___app_type 200de0c4 LIBCMTD:dllcrt0.obj + 0003:0006c140 ___lc_handle 200de140 LIBCMTD:nlsdata2.obj + 0003:0006c158 ___lc_codepage 200de158 LIBCMTD:nlsdata2.obj + 0003:0006c164 __umaskval 200de164 LIBCMTD:crt0dat.obj + 0003:0006c168 __osver 200de168 LIBCMTD:crt0dat.obj + 0003:0006c16c __winver 200de16c LIBCMTD:crt0dat.obj + 0003:0006c170 __winmajor 200de170 LIBCMTD:crt0dat.obj + 0003:0006c174 __winminor 200de174 LIBCMTD:crt0dat.obj + 0003:0006c178 ___argc 200de178 LIBCMTD:crt0dat.obj + 0003:0006c17c ___argv 200de17c LIBCMTD:crt0dat.obj + 0003:0006c180 ___wargv 200de180 LIBCMTD:crt0dat.obj + 0003:0006c184 __environ 200de184 LIBCMTD:crt0dat.obj + 0003:0006c188 ___initenv 200de188 LIBCMTD:crt0dat.obj + 0003:0006c18c __wenviron 200de18c LIBCMTD:crt0dat.obj + 0003:0006c190 ___winitenv 200de190 LIBCMTD:crt0dat.obj + 0003:0006c194 __pgmptr 200de194 LIBCMTD:crt0dat.obj + 0003:0006c198 __wpgmptr 200de198 LIBCMTD:crt0dat.obj + 0003:0006c19c __exitflag 200de19c LIBCMTD:crt0dat.obj + 0003:0006c1a0 __C_Termination_Done 200de1a0 LIBCMTD:crt0dat.obj + 0003:0006c1a4 __C_Exit_Done 200de1a4 LIBCMTD:crt0dat.obj + 0003:0006c1cc __cflush 200de1cc LIBCMTD:_file.obj + 0003:0006c2f0 __mbctype 200de2f0 LIBCMTD:mbctype.obj + 0003:0006c3f4 ___mbcodepage 200de3f4 LIBCMTD:mbctype.obj + 0003:0006c3f8 ___mblcid 200de3f8 LIBCMTD:mbctype.obj + 0003:0006c400 ___mbulinfo 200de400 LIBCMTD:mbctype.obj + 0003:0006c418 __adbgmsg 200de418 LIBCMTD:crt0msg.obj + 0003:0006c424 ___lc_time_intl 200de424 LIBCMTD:inittime.obj + 0003:0006c440 ___lc_id 200de440 LIBCMTD:nlsdata3.obj + 0003:0006c468 __stdbuf 200de468 LIBCMTD:_sftbuf.obj + 0003:0006c470 __newmode 200de470 LIBCMTD:_newmode.obj + 0003:0006c474 ?_pnhHeap@@3P6AHI@ZA 200de474 LIBCMTD:handler.obj + 0003:0006c47c __alternate_form 200de47c LIBCMTD:strftime.obj + 0003:0006c480 __no_lead_zeros 200de480 LIBCMTD:strftime.obj + 0003:0006c490 ___lconv_static_null 200de490 LIBCMTD:lconv.obj + 0003:0006c580 _remappedShaders 200de580 + 0003:00070780 _neutralObelisk 200e2780 + 0003:000707a0 _teamgame 200e27a0 + 0003:000707c4 _pushed_p 200e27c4 + 0003:000707e0 _pushed 200e27e0 + 0003:000787e0 _g_hub_timelimit 200ea7e0 + 0003:00078900 _g_synchronousClients 200ea900 + 0003:00078a20 _g_maxGameClients 200eaa20 + 0003:00078b40 _g_fraglimit 200eab40 + 0003:00078c60 _g_gametype 200eac60 + 0003:00078d80 _g_pkatourneyrules 200ead80 + 0003:00078ea0 _g_password 200eaea0 + 0003:00078fc0 _hub_flag 200eafc0 + 0003:000790e0 _g_dmflags 200eb0e0 + 0003:00079200 _pmove_msec 200eb200 + 0003:00079320 _Respawn_Positions 200eb320 + 0003:00079460 _g_cheats 200eb460 + 0003:00079580 _g_capturelimit 200eb580 + 0003:000796a0 _g_weaponTeamRespawn 200eb6a0 + 0003:000797c0 _g_needpass 200eb7c0 + 0003:000798e0 _g_pkatourneychat 200eb8e0 + 0003:00079a00 _g_speed 200eba00 + 0003:00079b20 _g_teamForceBalance 200ebb20 + 0003:00079c40 _g_doWarmup 200ebc40 + 0003:00079d60 _g_debugDamage 200ebd60 + 0003:00079e80 _g_podiumDist 200ebe80 + 0003:00079fa0 _g_banIPs 200ebfa0 + 0003:0007a0c0 _pmove_fixed 200ec0c0 + 0003:0007a1e0 _g_rankings 200ec1e0 + 0003:0007a300 _g_knockback 200ec300 + 0003:0007a420 _g_clients 200ec420 + 0003:00086720 _g_maxclients 200f8720 + 0003:00086830 _Respawn_Position_Index 200f8830 + 0003:00086840 _g_podiumDrop 200f8840 + 0003:00086960 _g_timelimit 200f8960 + 0003:00086a80 _g_filterBan 200f8a80 + 0003:00086ba0 _g_smoothClients 200f8ba0 + 0003:00086cc0 _g_debugAlloc 200f8cc0 + 0003:00086de0 _g_inactivity 200f8de0 + 0003:00086f00 _level 200f8f00 + 0003:00089300 _g_HubAltMap1 200fb300 + 0003:00089420 _g_HubAltMap2 200fb420 + 0003:00089540 _g_HubAltMap3 200fb540 + 0003:00089660 _g_HubAltMap4 200fb660 + 0003:00089780 _g_restarted 200fb780 + 0003:000898a0 _g_teamAutoJoin 200fb8a0 + 0003:000899c0 _g_blood 200fb9c0 + 0003:00089ae0 _g_gravity 200fbae0 + 0003:00089c00 _g_listEntity 200fbc00 + 0003:00089d20 _g_allowVote 200fbd20 + 0003:00089e40 _g_entities 200fbe40 + 0003:0015ee40 _g_hub_fraglimit 201d0e40 + 0003:0015ef60 _g_log 201d0f60 + 0003:0015f080 _g_friendlyFire 201d1080 + 0003:0015f1a0 _g_weaponRespawn 201d11a0 + 0003:0015f2c0 _g_debugMove 201d12c0 + 0003:0015f3e0 _g_PrivateBotSkill 201d13e0 + 0003:0015f500 _g_motd 201d1500 + 0003:0015f620 _g_HubAltTitle3 201d1620 + 0003:0015f740 _g_HubAltTitle4 201d1740 + 0003:0015f860 _g_HubAltTitle1 201d1860 + 0003:0015f980 _g_HubAltTitle2 201d1980 + 0003:0015faa0 _g_forcerespawn 201d1aa0 + 0003:0015fbc0 _g_warmup 201d1bc0 + 0003:0015fce0 _g_logSync 201d1ce0 + 0003:0015fe00 _g_quadfactor 201d1e00 + 0003:0015ff20 _g_dedicated 201d1f20 + 0003:00160040 _itemRegistered 201d2040 + 0003:00160440 _bot_minplayers 201d2440 + 0003:00160550 _g_numArenas 201d2550 + 0003:00160554 _podium2 201d2554 + 0003:00160558 _podium3 201d2558 + 0003:0016055c _podium1 201d255c + 0003:00160560 _pml 201d2560 + 0003:001605ec _pm 201d25ec + 0003:001605f0 _Hub_Index 201d25f0 + 0003:00160600 _hubInfo 201d2600 + 0003:00161a3c _active_private_bots 201d3a3c + 0003:00161a40 _ctftaskpreferences 201d3a40 + 0003:00162440 _bot_interbreedcycle 201d4440 + 0003:00162550 _numbots 201d4550 + 0003:00162560 _bot_testsolid 201d4560 + 0003:00162680 _bot_interbreedwrite 201d4680 + 0003:001627a0 _bot_developer 201d47a0 + 0003:001628c0 _bot_testclusters 201d48c0 + 0003:001629d0 _bot_interbreedmatchcount 201d49d0 + 0003:001629e0 _bot_saveroutingcache 201d49e0 + 0003:00162b00 _bot_thinktime 201d4b00 + 0003:00162c20 _botstates 201d4c20 + 0003:00162d20 _regularupdate_time 201d4d20 + 0003:00162d24 _bot_interbreed 201d4d24 + 0003:00162d28 _floattime 201d4d28 + 0003:00162d40 _bot_pause 201d4d40 + 0003:00162e60 _bot_interbreedbots 201d4e60 + 0003:00162f80 _bot_memorydump 201d4f80 + 0003:001630a0 _bot_report 201d50a0 + 0003:001631c0 _bot_interbreedchar 201d51c0 + 0003:001632d0 _lastteleport_origin 201d52d0 + 0003:001632e0 _ctf_blueflag 201d52e0 + 0003:00163320 _g_spSkill 201d5320 + 0003:00163440 _bot_testrchat 201d5440 + 0003:00163550 _gametype 201d5550 + 0003:00163560 _bot_nochat 201d5560 + 0003:00163680 _bot_dragon 201d5680 + 0003:00163790 _max_bspmodelindex 201d5790 + 0003:001637a0 _bot_fastchat 201d57a0 + 0003:001638c0 _bot_rocketjump 201d58c0 + 0003:001639e0 _bot_predictobstacles 201d59e0 + 0003:00163b00 _bot_challenge 201d5b00 + 0003:00163c10 _red_numaltroutegoals 201d5c10 + 0003:00163c20 _ctf_redflag 201d5c20 + 0003:00163c58 _botai_freewaypoints 201d5c58 + 0003:00163c5c _altroutegoals_setup 201d5c5c + 0003:00163c60 _lastteleport_time 201d5c60 + 0003:00163c80 _blue_altroutegoals 201d5c80 + 0003:00163f80 _blue_numaltroutegoals 201d5f80 + 0003:00163fa0 _botai_waypoints 201d5fa0 + 0003:001671a0 _bot_grapple 201d91a0 + 0003:001672c0 _red_altroutegoals 201d92c0 + 0003:001675c0 _maxclients 201d95c0 + 0003:001675c4 _numnodeswitches 201d95c4 + 0003:001675e0 _nodeswitch 201d95e0 + 0003:001692a0 _notleader 201db2a0 + 0003:001693a0 __crtheap 201db3a0 + 0003:001693a4 __pfnDumpClient 201db3a4 + 0003:001693c0 ___pioinfo 201db3c0 + 0003:001694c0 __nhandle 201db4c0 + 0003:001694c4 ___piob 201db4c4 + 0003:001694e0 __bufin 201db4e0 + 0003:0016a4e0 __nstream 201dc4e0 + 0003:0016a4e4 ___onexitend 201dc4e4 + 0003:0016a4e8 ___onexitbegin 201dc4e8 + 0003:0016a4ec ___setlc_active 201dc4ec + 0003:0016a4f0 ___unguarded_readlc_active 201dc4f0 + 0003:0016a4f4 __pfnReportHook 201dc4f4 + 0003:0016a4f8 __acmdln 201dc4f8 + 0003:0016a4fc __pRawDllMain 201dc4fc + 0004:00000000 __IMPORT_DESCRIPTOR_KERNEL32 201dd000 kernel32:KERNEL32.dll + 0004:00000014 __NULL_IMPORT_DESCRIPTOR 201dd014 kernel32:KERNEL32.dll + 0004:0000014c __imp__InterlockedDecrement@4 201dd14c kernel32:KERNEL32.dll + 0004:00000150 __imp__InterlockedIncrement@4 201dd150 kernel32:KERNEL32.dll + 0004:00000154 __imp__GetModuleFileNameA@12 201dd154 kernel32:KERNEL32.dll + 0004:00000158 __imp__GetCommandLineA@0 201dd158 kernel32:KERNEL32.dll + 0004:0000015c __imp__GetProcAddress@8 201dd15c kernel32:KERNEL32.dll + 0004:00000160 __imp__GetModuleHandleA@4 201dd160 kernel32:KERNEL32.dll + 0004:00000164 __imp__GetVersion@0 201dd164 kernel32:KERNEL32.dll + 0004:00000168 __imp__GetCurrentThreadId@0 201dd168 kernel32:KERNEL32.dll + 0004:0000016c __imp__TlsSetValue@8 201dd16c kernel32:KERNEL32.dll + 0004:00000170 __imp__TlsAlloc@0 201dd170 kernel32:KERNEL32.dll + 0004:00000174 __imp__TlsFree@4 201dd174 kernel32:KERNEL32.dll + 0004:00000178 __imp__SetLastError@4 201dd178 kernel32:KERNEL32.dll + 0004:0000017c __imp__TlsGetValue@4 201dd17c kernel32:KERNEL32.dll + 0004:00000180 __imp__GetLastError@0 201dd180 kernel32:KERNEL32.dll + 0004:00000184 __imp__GetCurrentThread@0 201dd184 kernel32:KERNEL32.dll + 0004:00000188 __imp__DebugBreak@0 201dd188 kernel32:KERNEL32.dll + 0004:0000018c __imp__GetStdHandle@4 201dd18c kernel32:KERNEL32.dll + 0004:00000190 __imp__WriteFile@20 201dd190 kernel32:KERNEL32.dll + 0004:00000194 __imp__OutputDebugStringA@4 201dd194 kernel32:KERNEL32.dll + 0004:00000198 __imp__LoadLibraryA@4 201dd198 kernel32:KERNEL32.dll + 0004:0000019c __imp__InitializeCriticalSection@4 201dd19c kernel32:KERNEL32.dll + 0004:000001a0 __imp__DeleteCriticalSection@4 201dd1a0 kernel32:KERNEL32.dll + 0004:000001a4 __imp__EnterCriticalSection@4 201dd1a4 kernel32:KERNEL32.dll + 0004:000001a8 __imp__LeaveCriticalSection@4 201dd1a8 kernel32:KERNEL32.dll + 0004:000001ac __imp__ExitProcess@4 201dd1ac kernel32:KERNEL32.dll + 0004:000001b0 __imp__FatalAppExitA@8 201dd1b0 kernel32:KERNEL32.dll + 0004:000001b4 __imp__Sleep@4 201dd1b4 kernel32:KERNEL32.dll + 0004:000001b8 __imp__MultiByteToWideChar@24 201dd1b8 kernel32:KERNEL32.dll + 0004:000001bc __imp__WideCharToMultiByte@32 201dd1bc kernel32:KERNEL32.dll + 0004:000001c0 __imp__LCMapStringA@24 201dd1c0 kernel32:KERNEL32.dll + 0004:000001c4 __imp__LCMapStringW@24 201dd1c4 kernel32:KERNEL32.dll + 0004:000001c8 __imp__RaiseException@16 201dd1c8 kernel32:KERNEL32.dll + 0004:000001cc __imp__TerminateProcess@8 201dd1cc kernel32:KERNEL32.dll + 0004:000001d0 __imp__GetCurrentProcess@0 201dd1d0 kernel32:KERNEL32.dll + 0004:000001d4 __imp__SetConsoleCtrlHandler@8 201dd1d4 kernel32:KERNEL32.dll + 0004:000001d8 __imp__SetHandleCount@4 201dd1d8 kernel32:KERNEL32.dll + 0004:000001dc __imp__GetFileType@4 201dd1dc kernel32:KERNEL32.dll + 0004:000001e0 __imp__GetStartupInfoA@4 201dd1e0 kernel32:KERNEL32.dll + 0004:000001e4 __imp__IsBadWritePtr@8 201dd1e4 kernel32:KERNEL32.dll + 0004:000001e8 __imp__IsBadReadPtr@8 201dd1e8 kernel32:KERNEL32.dll + 0004:000001ec __imp__HeapValidate@12 201dd1ec kernel32:KERNEL32.dll + 0004:000001f0 __imp__GetCPInfo@8 201dd1f0 kernel32:KERNEL32.dll + 0004:000001f4 __imp__GetACP@0 201dd1f4 kernel32:KERNEL32.dll + 0004:000001f8 __imp__GetOEMCP@0 201dd1f8 kernel32:KERNEL32.dll + 0004:000001fc __imp__FreeEnvironmentStringsA@4 201dd1fc kernel32:KERNEL32.dll + 0004:00000200 __imp__FreeEnvironmentStringsW@4 201dd200 kernel32:KERNEL32.dll + 0004:00000204 __imp__GetEnvironmentStrings@0 201dd204 kernel32:KERNEL32.dll + 0004:00000208 __imp__GetEnvironmentStringsW@0 201dd208 kernel32:KERNEL32.dll + 0004:0000020c __imp__HeapDestroy@4 201dd20c kernel32:KERNEL32.dll + 0004:00000210 __imp__HeapCreate@12 201dd210 kernel32:KERNEL32.dll + 0004:00000214 __imp__VirtualFree@12 201dd214 kernel32:KERNEL32.dll + 0004:00000218 __imp__GetStringTypeA@20 201dd218 kernel32:KERNEL32.dll + 0004:0000021c __imp__GetStringTypeW@16 201dd21c kernel32:KERNEL32.dll + 0004:00000220 __imp__UnhandledExceptionFilter@4 201dd220 kernel32:KERNEL32.dll + 0004:00000224 __imp__IsValidLocale@8 201dd224 kernel32:KERNEL32.dll + 0004:00000228 __imp__IsValidCodePage@4 201dd228 kernel32:KERNEL32.dll + 0004:0000022c __imp__GetUserDefaultLCID@0 201dd22c kernel32:KERNEL32.dll + 0004:00000230 __imp__SetFilePointer@16 201dd230 kernel32:KERNEL32.dll + 0004:00000234 __imp__FlushFileBuffers@4 201dd234 kernel32:KERNEL32.dll + 0004:00000238 __imp__HeapAlloc@12 201dd238 kernel32:KERNEL32.dll + 0004:0000023c __imp__HeapReAlloc@16 201dd23c kernel32:KERNEL32.dll + 0004:00000240 __imp__HeapFree@12 201dd240 kernel32:KERNEL32.dll + 0004:00000244 __imp__VirtualAlloc@16 201dd244 kernel32:KERNEL32.dll + 0004:00000248 __imp__ReadFile@20 201dd248 kernel32:KERNEL32.dll + 0004:0000024c __imp__GetLocaleInfoA@16 201dd24c kernel32:KERNEL32.dll + 0004:00000250 __imp__GetLocaleInfoW@16 201dd250 kernel32:KERNEL32.dll + 0004:00000254 __imp__SetStdHandle@8 201dd254 kernel32:KERNEL32.dll + 0004:00000258 __imp__GetTimeZoneInformation@4 201dd258 kernel32:KERNEL32.dll + 0004:0000025c __imp__CloseHandle@4 201dd25c kernel32:KERNEL32.dll + 0004:00000260 __imp__CompareStringA@24 201dd260 kernel32:KERNEL32.dll + 0004:00000264 __imp__CompareStringW@24 201dd264 kernel32:KERNEL32.dll + 0004:00000268 __imp__SetEnvironmentVariableA@8 201dd268 kernel32:KERNEL32.dll + 0004:0000026c \177KERNEL32_NULL_THUNK_DATA 201dd26c kernel32:KERNEL32.dll + + entry point at 0001:00055ed0 + + Static symbols + + 0001:00052ce1 _SkipWhitespace 20053ce1 f q_shared.obj + 0001:00050ffa _CrossProduct 20051ffa f q_math.obj + 0001:00051cae _VectorLength 20052cae f q_math.obj + 0001:0004e19b _CrossProduct 2004f19b f g_weapon.obj + 0001:0004efd7 _VectorLength 2004ffd7 f g_weapon.obj + 0001:0004fee4 _VectorNormalizeFast 20050ee4 f g_weapon.obj + 0001:0004c9e9 _VectorCompare 2004d9e9 f g_utils.obj + 0001:0004d2e8 _CrossProduct 2004e2e8 f g_utils.obj + 0001:0004a91f _VectorCompare 2004b91f f g_trigger.obj + 0001:00049531 _VectorLength 2004a531 f g_team.obj + 0001:0004a5c9 _SortClients 2004b5c9 f g_team.obj + 0001:000485e8 _target_location_linkup 200495e8 f g_target.obj + 0001:00045a23 _AddIP 20046a23 f g_svcmds.obj + 0001:00045abc _StringToFilter 20046abc f g_svcmds.obj + 0001:00045c0d _UpdateIPBans 20046c0d f g_svcmds.obj + 0001:00041654 _VectorInverse 20042654 f g_mover.obj + 0001:00042bae _VectorLength 20043bae f g_mover.obj + 0001:00042dfe _Touch_DoorTriggerSpectator 20043dfe f g_mover.obj + 0001:00039d75 _VectorLength 2003ad75 f g_missile.obj + 0001:0003974d _CrossProduct 2003a74d f g_misc.obj + 0001:000398f9 _InitShooter_Finish 2003a8f9 f g_misc.obj + 0001:000314da _VectorLength 200324da f g_combat.obj + 0001:0002e5d8 _G_SayTo 2002f5d8 f g_cmds.obj + 0001:0002e7a5 _G_VoiceTo 2002f7a5 f g_cmds.obj + 0001:000302b3 _Cmd_Say_f 200312b3 f g_cmds.obj + 0001:00030305 _Cmd_say_teambyid_f 20031305 f g_cmds.obj + 0001:00030456 _Cmd_Tell_f 20031456 f g_cmds.obj + 0001:00030587 _Cmd_Voice_f 20031587 f g_cmds.obj + 0001:000305dd _Cmd_VoiceTell_f 200315dd f g_cmds.obj + 0001:00030722 _Cmd_VoiceTaunt_f 20031722 f g_cmds.obj + 0001:00029f13 _VectorLength 2002af13 f g_client.obj + 0001:0002a34f _VectorLengthSquared 2002b34f f g_client.obj + 0001:0002b8d5 _ClientCleanName 2002c8d5 f g_client.obj + 0001:00027c68 _PlayerIntroSound 20028c68 f g_bot.obj + 0001:00027f60 _G_AddBot 20028f60 f g_bot.obj + 0001:00028450 _AddBotToSpawnQueue 20029450 f g_bot.obj + 0001:000290c8 _G_LoadArenas 2002a0c8 f g_bot.obj + 0001:00029250 _G_LoadArenasFromFile 2002a250 f g_bot.obj + 0001:00029358 _G_SpawnBots 2002a358 f g_bot.obj + 0001:000294d2 _G_LoadBots 2002a4d2 f g_bot.obj + 0001:00029615 _G_LoadBotsFromFile 2002a615 f g_bot.obj + 0001:00026790 _SpawnModelOnVictoryPad 20027790 f g_arenas.obj + 0001:00026b48 _CelebrateStart 20027b48 f g_arenas.obj + 0001:00026b9e _CelebrateStop 20027b9e f g_arenas.obj + 0001:00026bed _SpawnPodium 20027bed f g_arenas.obj + 0001:00026d75 _PodiumPlacementThink 20027d75 f g_arenas.obj + 0001:000240b4 _CrossProduct 200250b4 f bg_slidemove.obj + 0001:000205aa _PM_WaterJumpMove 200215aa f bg_pmove.obj + 0001:00020621 _PM_WaterMove 20021621 f bg_pmove.obj + 0001:00020851 _VectorLength 20021851 f bg_pmove.obj + 0001:00020890 _PM_Friction 20021890 f bg_pmove.obj + 0001:00020a47 _PM_Accelerate 20021a47 f bg_pmove.obj + 0001:00020b02 _PM_CmdScale 20021b02 f bg_pmove.obj + 0001:00020be7 _PM_CheckWaterJump 20021be7 f bg_pmove.obj + 0001:00020d7c _PM_FlyMove 20021d7c f bg_pmove.obj + 0001:00020e77 _PM_AirMove 20021e77 f bg_pmove.obj + 0001:00020fc6 _PM_SetMovementDir 20021fc6 f bg_pmove.obj + 0001:00021194 _PM_GrappleMove 20022194 f bg_pmove.obj + 0001:000212e3 _PM_WalkMove 200222e3 f bg_pmove.obj + 0001:0002168f _PM_CheckJump 2002268f f bg_pmove.obj + 0001:00021793 _PM_ForceLegsAnim 20022793 f bg_pmove.obj + 0001:000217b2 _PM_StartLegsAnim 200227b2 f bg_pmove.obj + 0001:000217f9 _PM_DeadMove 200227f9 f bg_pmove.obj + 0001:000218c8 _PM_NoclipMove 200228c8 f bg_pmove.obj + 0001:00021b38 _PM_GroundTrace 20022b38 f bg_pmove.obj + 0001:00021e44 _PM_CrashLand 20022e44 f bg_pmove.obj + 0001:0002203d _PM_FootstepForSurface 2002303d f bg_pmove.obj + 0001:00022070 _PM_CorrectAllSolid 20023070 f bg_pmove.obj + 0001:0002225a _PM_GroundTraceMissed 2002325a f bg_pmove.obj + 0001:000223a7 _PM_SetWaterLevel 200233a7 f bg_pmove.obj + 0001:0002251e _PM_CheckDuck 2002351e f bg_pmove.obj + 0001:000227f8 _PM_Footsteps 200237f8 f bg_pmove.obj + 0001:00022a72 _PM_ContinueLegsAnim 20023a72 f bg_pmove.obj + 0001:00022aa6 _PM_WaterEvents 20023aa6 f bg_pmove.obj + 0001:00022b31 _PM_TorsoAnimation 20023b31 f bg_pmove.obj + 0001:00022b7e _PM_ContinueTorsoAnim 20023b7e f bg_pmove.obj + 0001:00022bb2 _PM_StartTorsoAnim 20023bb2 f bg_pmove.obj + 0001:00022beb _PM_Weapon 20023beb f bg_pmove.obj + 0001:000233ae _PM_BeginWeaponChange 200243ae f bg_pmove.obj + 0001:000234f6 _PM_FinishWeaponChange 200244f6 f bg_pmove.obj + 0001:00023587 _PM_Animate 20024587 f bg_pmove.obj + 0001:000235cc _PM_DropTimers 200245cc f bg_pmove.obj + 0001:0000e0cd _VectorLength 2000f0cd f ai_dmq3.obj + 0001:000107b8 _CrossProduct 200117b8 f ai_dmq3.obj + 0001:00011084 _VectorLengthSquared 20012084 f ai_dmq3.obj + 0001:00013998 _VectorCompare 20014998 f ai_dmq3.obj + 0001:00009641 _VectorLengthSquared 2000a641 f ai_dmnet.obj + 0001:0000a381 _VectorLength 2000b381 f ai_dmnet.obj + 0001:0000ac43 _VectorCompare 2000bc43 f ai_dmnet.obj + 0001:0000628f _VectorLength 2000728f f ai_cmd.obj + 0001:0006cdb0 _findenv 2006ddb0 f LIBCMTD:setenv.obj + 0001:0006ce30 _copy_environ 2006de30 f LIBCMTD:setenv.obj + 0001:0006c660 _wcsncnt 2006d660 f LIBCMTD:aw_cmp.obj + 0001:0006ca80 _strncnt 2006da80 f LIBCMTD:aw_cmp.obj + 0001:0006c160 _wcsncnt 2006d160 f LIBCMTD:wcstombs.obj + 0001:0006b220 __tzset_lk 2006c220 f LIBCMTD:tzset.obj + 0001:0006b5b0 __isindst_lk 2006c5b0 f LIBCMTD:tzset.obj + 0001:0006b8b0 _cvtdate 2006c8b0 f LIBCMTD:tzset.obj + 0001:0006a6f0 _wcstoxl 2006b6f0 f LIBCMTD:wcstol.obj + 0001:00069500 __expandtime 2006a500 f LIBCMTD:strftime.obj + 0001:00069b30 __store_str 2006ab30 f LIBCMTD:strftime.obj + 0001:00069b80 __store_num 2006ab80 f LIBCMTD:strftime.obj + 0001:00069c30 __store_number 2006ac30 f LIBCMTD:strftime.obj + 0001:00069ce0 __store_winword 2006ace0 f LIBCMTD:strftime.obj + 0001:00065650 _trans_lang_lang 20066650 f LIBCMTD:getqloc.obj + 0001:000656e0 _trans_ctry_ctry 200666e0 f LIBCMTD:getqloc.obj + 0001:00065770 _trans_ctry_lang 20066770 f LIBCMTD:getqloc.obj + 0001:000657f0 _testSpecialCtry 200667f0 f LIBCMTD:getqloc.obj + 0001:00065820 _match_ctry_lang 20066820 f LIBCMTD:getqloc.obj + 0001:00064af0 __get_lc_lconv 20065af0 f LIBCMTD:initmon.obj + 0001:00064d00 _fix_grouping 20065d00 f LIBCMTD:initmon.obj + 0001:00064d80 __free_lc_lconv 20065d80 f LIBCMTD:initmon.obj + 0001:00064940 _fix_grouping 20065940 f LIBCMTD:initnum.obj + 0001:00063c30 __get_lc_time 20064c30 f LIBCMTD:inittime.obj + 0001:000641c0 __free_lc_time 200651c0 f LIBCMTD:inittime.obj + 0001:000644d0 _storeTimeFmt 200654d0 f LIBCMTD:inittime.obj + 0001:00061450 __abstract_cw 20062450 f LIBCMTD:ieee87.obj + 0001:000615d0 __hw_cw 200625d0 f LIBCMTD:ieee87.obj + 0001:00061730 __abstract_sw 20062730 f LIBCMTD:ieee87.obj + 0001:000612e0 _xcptlookup 200622e0 f LIBCMTD:winxfltr.obj + 0001:000603f0 _getSystemCP 200613f0 f LIBCMTD:mbctype.obj + 0001:00060450 _CPtoLCID 20061450 f LIBCMTD:mbctype.obj + 0001:000604d0 _setSBCS 200614d0 f LIBCMTD:mbctype.obj + 0001:0005fca0 _parse_cmdline 20060ca0 f LIBCMTD:stdargv.obj + 0001:0005dff0 _realloc_help 2005eff0 f LIBCMTD:dbgheap.obj + 0001:0005ec30 _CheckBytes 2005fc30 f LIBCMTD:dbgheap.obj + 0001:0005f820 __printMemBlockData 20060820 f LIBCMTD:dbgheap.obj + 0001:0005d260 _flsall 2005e260 f LIBCMTD:fflush.obj + 0001:0005cd40 _xtoa 2005dd40 f LIBCMTD:xtoa.obj + 0001:0005cec0 _x64toa@20 2005dec0 f LIBCMTD:xtoa.obj + 0001:0005c8c0 _ctrlevent_capture@4 2005d8c0 f LIBCMTD:winsig.obj + 0001:0005cbb0 _siglookup 2005dbb0 f LIBCMTD:winsig.obj + 0001:0005c550 _doexit 2005d550 f LIBCMTD:crt0dat.obj + 0001:0005c660 __initterm 2005d660 f LIBCMTD:crt0dat.obj + 0001:0005bfb0 _write_char 2005cfb0 f LIBCMTD:output.obj + 0001:0005c030 _write_multi_char 2005d030 f LIBCMTD:output.obj + 0001:0005c070 _write_string 2005d070 f LIBCMTD:output.obj + 0001:0005c0c0 _get_int_arg 2005d0c0 f LIBCMTD:output.obj + 0001:0005c0e0 _get_int64_arg 2005d0e0 f LIBCMTD:output.obj + 0001:0005c100 _get_short_arg 2005d100 f LIBCMTD:output.obj + 0001:0005ab90 __get_fname 2005bb90 f LIBCMTD:fpexcept.obj + 0001:00059c90 _wcsncnt 2005ac90 f LIBCMTD:aw_map.obj + 0001:00059fb0 _strncnt 2005afb0 f LIBCMTD:aw_map.obj + 0001:00059390 __setlocale_set_cat 2005a390 f LIBCMTD:setlocal.obj + 0001:00059520 __setlocale_get_all 2005a520 f LIBCMTD:setlocal.obj + 0001:00058630 _CrtMessageWindow 20059630 f LIBCMTD:dbgrpt.obj + 0001:00058070 __hextodec 20059070 f LIBCMTD:input.obj + 0001:000580d0 __inc 200590d0 f LIBCMTD:input.obj + 0001:00058130 __un_inc 20059130 f LIBCMTD:input.obj + 0001:00058150 __whiteout 20059150 f LIBCMTD:input.obj + 0001:00056700 __cftoe2 20057700 f LIBCMTD:cvt.obj + 0001:000568f0 __cftof2 200578f0 f LIBCMTD:cvt.obj + 0001:00056b90 __shift 20057b90 f LIBCMTD:cvt.obj + 0001:00055570 _shortsort 20056570 f LIBCMTD:qsort.obj + 0001:000555e0 _swap 200565e0 f LIBCMTD:qsort.obj + 0001:00055300 _$$$00001 20056300 f LIBCMTD:chkstk.obj + 0001:000550d0 _$$$00001 200560d0 f LIBCMTD:strchr.obj + +FIXUPS: 559f5 a5 fffffd4d 12 18 16 10 1c 31 10 fffffeb8 2a 33 1a fffffe67 +FIXUPS: 55669 11 fffff98d 5 a ffffff9e 11 fffffd35 85 69 33 8c 34 1579 +FIXUPS: 5646d 15a fffffc90 12 2a 10 1b 2a 10 fffffeaf 12 2a 10 1b 2a 10 +FIXUPS: 55fc6 2a 45 4a fffffe32 2b 28 16 1d 29 25 ffffff0a fffffaca 1c +FIXUPS: 55988 1238 e 1e 20 16 15 16 14 16 14 19 19 a 1f fffffc70 a fffffec2 +FIXUPS: 56850 28 1e 2c 12 21 20 25 fffffd4f 1c 13 6d a5 fffffbd2 2a ad0 +FIXUPS: 56e9b 15 7e 1e 1e 1d 68 9 fffff9b9 1e d 19 16 14 2c 1b 17 27 16 +FIXUPS: 56ad0 14 c 1d 16 15 16 14 11 14 16 14 564 2a 2e 37 81 2a 21 62 +FIXUPS: 572ec 1a 1a 1a 1a e fffffd45 fffffc9d 31 8 5b 9 17 1c 5 c 5 5 5 +FIXUPS: 56e39 3d 7 f 5 22b1 24 f ffffea6d 36 fffff866 28 19f 20 3a 2f 1a +FIXUPS: 5773c 61 102 27 16 98 35 68 12 40 33 48 3c 36 1c 1a 18 17 fffff8a5 +FIXUPS: 573ae 12bc 2f 4d 23 10 70 24 5a 46 2f c1 24 e5 39 76 4a 3d 76 6c +FIXUPS: 58cc0 20 77 27 70 46 31 35 44 35 1c 157 8a 5a9 1d 21 14 26 19d +FIXUPS: 598e6 19 19 a ffffe384 2d 47 4a 9 19 a4 1aa 1d 118 1de 32 97 1f +FIXUPS: 58427 a8 28 33 43 64 46 41 17a8 13 a 34 a 6a 2c 44 2c fffffcd9 +FIXUPS: 59c98 7 fffffead fffff75d 10b 2a 18 38 16 2b 14 2e 18 18 7a 63 +FIXUPS: 595f2 47 1e d 2f 15 d41 47 1b 40 3e 31 4e 4e 1a 25 2a 9b 19 1b +FIXUPS: 5a6f4 2e 1b 14 19 19 11 67 27 40 2a 45 2e 33 4a 25 2b fffff3d4 +FIXUPS: 5ac4b e 13 e eb 9b c9 a3 e 13 e fffff024 43 8c 48 51 19 2f 2d 39 +FIXUPS: 5a1f6 5a 38 47 17 31 11 1a 22 10 43 26 d06 2c c 3a e 11 2f 44 c +FIXUPS: 5b231 e 11 182 1d8 1ac 2b 33 1b6 f4 27 36 44 c 10 16 c 32 d ffffeed9 +FIXUPS: 5aaf5 7c 78 1e9e 1e 2a 1b 116 25 122 1e 30 75 32 22 26 177 55 53 +FIXUPS: 5c020 108 10 3e 54 4d 28 fffffaab 1c3 17 fffff167 a 14 52 a 14 +FIXUPS: 5d5de 13 19 b 31 10 fffffe10 a a fffffd92 3d 5e 133 38 fffffd96 +FIXUPS: 5d1c7 7 10 fffff198 34 24 cb 67 133 18 21 34 30 a8 e2 142 ba 14b8 +FIXUPS: 5dfb6 fffff711 43 9 82 24 27 2a 17 58 50 44 1d 16 c4 13 28 16 1d +FIXUPS: 5da7c 99 ff 10 fffff889 12 1d 20 1e 20 1b 77 f1b c c 5b 72 fffffdfa +FIXUPS: 5e3f0 1e c 17 13 c fffffcad e c f 22 28 78 6e 21 68 33 40 25 f +FIXUPS: 5dd0e 18 11b 21 4b 4a 2696 a1 20 31 28 4f 3a 31 18 45 18 f 1a 88 +FIXUPS: 608f0 2a 34 39 16 7c 2a 28 ffffdcdd 13 e8 29a fffffb44 35 18 a6 +FIXUPS: 5e724 fffffd73 1852 8 51 2b 28 28 28 16 94 2b 32 2b 39 20 49 33 +FIXUPS: 6000e 67 47 80 1f 5e 15 4d 5a 11 5c 1b ec 33 49 10e fffff09d 50 +FIXUPS: 5f67d 1f 62 34 3b 2b 3b 45 2b c 41 6b 56 36 c 2b 1c 2c 1c 16 c +FIXUPS: 5fa63 62 51 1f 45 c 5a 1f 93 fffff325 1e d 35 21 1b 1c 6b 28 32 +FIXUPS: 5f183 18 1f 5b 66 25 25 b3 19 59 5f 54 85 15 1e d 18 20 1c 10 a +FIXUPS: 5f5f4 164f 13 22 fffffe50 28 1f 29 26 17 12 1c ffffdf71 26 28 15 +FIXUPS: 5eb8f d 1d 25 2f 1c 69 28 5f 54 21 128 1e 1b 33 2f 51 2d33 14 13 +FIXUPS: 61d10 1a 19 fffffce2 fffffc0a 2e 88 2f 69 1a 16 12a 4a 94 2b fffff6f9 +FIXUPS: 610e5 18 15 7 10a 45 ff 4c 15 7 e 179 fffff6d2 21e9 20 68 82 10 +FIXUPS: 62f5b 10 30 10 fffff3a6 21 21 24 2a 19 c fffffd21 13 fffffd67 5d +FIXUPS: 61f96 e e 103 59 fffffa26 1c 77 6e 57 15 17 230f 3e fffff575 14d +FIXUPS: 637b2 1c8 8c 152 6d 248 13 fffff486 fffffe19 28 29 ffffff8c fffff828 +FIXUPS: 62905 8b 14 270 19 1c 13 2a 3a 10 13 16 26 1e 41 1be6 4b fffffe4d +FIXUPS: 64826 44 4b fffffd89 18 10 f 39 5f fffffd43 82 2a fffffb3b 4d 40 +FIXUPS: 64104 43 4d 40 43 50 50 4d 65 60 fffffa9f 24 13 4a 1475 11 11 11 +FIXUPS: 653a2 11 11 11 11 14 14 14 14 14 14 14 14 14 14 14 36 1c 1c 2c +FIXUPS: 65677 fffff3ea 72 13 24 17 fffffdd5 2a 776 22 22 22 22 22 22 22 +FIXUPS: 6519c 3c 11 11 11 11 11 10 11 11 11 11 11 11 11 11 11 11 11 11 +FIXUPS: 6531a 11 11 11 fffff963 1f 1f 1f 1c 1f 1f 1f 1f 1f 1f 1f 1f 1f +FIXUPS: 64e5f 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 1f 22 22 d52 11 +FIXUPS: 65de8 11 11 fffff8b9 1d 1d 17 16 11 11 46 13 14 5b 11 10 34 30 +FIXUPS: 658af 3b fffff288 1f 10 e 1e 11 25 11 5e 1f 14a3 e e e 2b 11 fffff845 +FIXUPS: 659fe 10 e 4c 11 4f 11 4d 1f 1f 1f 1f 17 17 1f 1f 1f 1f 1f 1f 1f +FIXUPS: 65cc8 1f bd 11 bb1 21 1f d 21 10 fffff902 41 52 1d 22 8a 92 6a +FIXUPS: 66559 89 2c 29 54 90 6c fffff6d6 1f 19 19 19 106 65 a6 22 17 e +FIXUPS: 671c9 2e 2d a 16 fffffd54 21 13 50 5e fffffe04 37 fffffccd b 14 +FIXUPS: 66bb5 f 6d 1a2 b 10 3e b fffffbfb b 14 14 f 27 11 4c fffffe3d fdc +FIXUPS: 67925 59 14 a c 39 fffffd8f 14 36 14 f fffffe51 48 29 3e f d fffffebe +FIXUPS: 675d2 ffffff0e 5c 41 1f fffffeb1 3a fffffdf9 21 7e 98 33 fffffdc8 +FIXUPS: 68d98 c 27 6c fffffc25 2a 45 4b fffff19b 236 11a 9e a3 102 119 +FIXUPS: 67a8e 8 12 27 b 2a ffffff0d 14 1d a c fffffdb9 17 43 14 37 1b 371c +FIXUPS: 698d2 b 14 14 f 137 b 23 2c5 fffff8a0 70 4f 1e9 fffff70c 43 33 +FIXUPS: 6902c bd 2d 9b 32 43 c 10 c fffff969 21 35 35 13a c 1632 84 8d +FIXUPS: 6a549 23 23 23 3a 51 24 51 2a 28 45 2d 2d 28 28 1c 29 41 84 3a +FIXUPS: 6a95b 31 36 50 a 21 164 31c 20 fffff08e 9 2e 9 6e 15 37 15 1e 14 +FIXUPS: 6a0c8 1c 1c 1b 36 3a 9 2e 9 48 9 2e 9 2e 9 2c 9 2c 9 2c 9 3d 13b8 +FIXUPS: 6b854 27 11 d8 7e fffffaa7 88 13 ea 96 13 fffffab5 33 2c 32 20 +FIXUPS: 6b24b 14 1b 43 6f ffffea8d 15 1b 50 9 2e 9 71 15 1b 21b8 f 4c 27 +FIXUPS: 6c163 f 27 fffff938 82 2f 83 7d 11 b8 b d6 b 65 b 66 2f e b 18 +FIXUPS: 6bf9e 3d 2f fffffa57 24 a 23 fffffc30 b24 8 7 1b 2b 17 af 16 3e +FIXUPS: 6c383 15 18 c 18 17 a 15 3b 5b 52 6c 29 c d b0 53 66 53 25 23 fffff8f1 +FIXUPS: 6c0c6 d52 24 13 62 3e 6b 60 64 54 8c 3b fffffbb9 b 14 c f 1e 1b +FIXUPS: 6cd71 10 29 2d fffffea3 34 fffffe62 1d 14 8e 2c fffff5d4 11 14 +FIXUPS: 6dda2 3c a7 19 28 c 21 fffff542 19 e4 81 63 e 13 e f3 19 fc 140 +FIXUPS: 6d9ff 5c e fffff8f7 43 ffffff4b fffffee9 c d 2e 29 19 2c fff96fd1 +FIXUPS: 426a 1a 17 27 6 18 12 16 19 27 6 18 12 16 69ba8 f 58 28 29 fffffaf6 +FIXUPS: 6db29 29 3a 40 3e 33 4b 59 5a c 19 fff960de 16 1a 17 34 16 19 34 +FIXUPS: 3f32 19 34 16 19 34 16 19 34 16 19 34 16 29 21 1a 38 16 19 38 16 +FIXUPS: 41f0 38 16 fffff826 16 19 34 16 19 34 16 19 34 16 19 34 16 19 31 +FIXUPS: 3c66 16 19 31 16 16 19 31 16 16 19 31 16 16 19 31 fffff9aa 2b 9 +FIXUPS: 380c 6 a 16 12 16 19 2b 9 6 6 a 16 12 16 19 2b 9 6 6 a 16 12 16 +FIXUPS: 39b6 17 34 16 19 fffffa90 15 f 2c 14 6 18 12 c 6 18 12 44 2a 2b +FIXUPS: 3632 14 16 12 16 19 2b 9 14 16 12 16 19 2b 2a 12 16 fffff83c e +FIXUPS: 302c 3c 17 24 f 23 21 27 69 24 e 29 3c 17 24 f 26 24 27 47 84 b +FIXUPS: 33ec 27 2a 15 17 28 d 1a fffff5c6 1b 1a 15 21 2a 1f 2a 1f 2a a +FIXUPS: 2bdb 21 19 58 24 b 29 2b 17 2c 13 17 66 71 b 29 33 32 21 1e c5 +FIXUPS: 2614 1f 21 12 5b 21 12 1f 2a 41 39 22 16 1f 22 16 10 22 16 d 2c +FIXUPS: 28e5 16 16 16 79 24 3f 15 17 23 15 fffff872 12 9 b a 16 12 10 9 +FIXUPS: 2350 6 a 16 12 79 24 27 39 13 8 17 33 1a 15 24 21 12 1f 21 12 1f +FIXUPS: 2602 fffff935 33 14 27 14 9 14 16 12 47 36 15 32 14 24 14 2a 12 +FIXUPS: 2190 36 d 18 35 14 27 15 12 9 6 f 16 12 fffff519 5d 14 26 16 e +FIXUPS: 193d 33 90 1c ce 1a 20 13 1a 25 38 3a a6 63 83 28 57 33 14 27 15 +FIXUPS: 1e8c 9 14 16 12 fffff42d 9 20 3c 76 f 18 9 1d 9 20 41 28 76 f 18 +FIXUPS: 155e 1d 9 20 41 28 87 f 18 9 1d 9 1d 38 22 61 678b 18 18 18 18 +FIXUPS: 7fc5 15 15 15 15 17 11 ffff8fd7 6c f 18 9 1d 9 47 6f f 18 9 1d +FIXUPS: 11e6 20 3c 6f f 18 9 6841 1c f 24 1c f 95 4b c 35 c 13 1d 2c 71 +FIXUPS: 7dae 18 18 18 18 18 18 18 18 18 18 18 18 19 19 18 1d fffff6df 21 +FIXUPS: 764a 16 35 f 33 2f f 33 1b 28 19 d2 1c 1b 3b 6e 18 13 16 23 1a +FIXUPS: 79e7 23 f 1b 16 57 c 31 27 fffff4f2 1a 15 15 15 15 15 15 1a f 21 +FIXUPS: 7124 15 4b 1b 13 4e 40 31 4f 12a 18 13 16 23 48 5a 2d 56 52 20 +FIXUPS: 7605 fffff5e5 14 15 33 1b 26 f 2a 15 20 2c f 17 2a 13 34 1e 18 +FIXUPS: 6e06 43 18 13 16 23 56 1a 23 1a 23 1a 23 1a fffff789 f 2f 21 1f +FIXUPS: 67f2 1b 1f 19 70 49 41 21 1b 15 16 23 1f 1d 8e 18 13 16 23 f 49 +FIXUPS: 6b67 15 13 1a 1a f fffff7e7 14 2b 23 f 32 64 c 15 16 23 1b 24 1a +FIXUPS: 6582 21 15 16 1b 20 1a f 1b 17 f 13 18 20 15 1b 13 20 fffff7d6 +FIXUPS: 5f1a f 32 60 d c c c 26 17 23 f 33 64 c c 44 23 f 32 64 c 25 18 +FIXUPS: 6282 f 27 99 1b 1a 1b fffff581 18 13 16 23 f 29 1b 1f 108 19 c9 +FIXUPS: 5bf1 21 24 3b 42 4d c c 43 18 13 16 23 10 18 32 42 40 c c fffff56a +FIXUPS: 542c 21 2e f 48 35 ad c c 15 16 23 1d 23 f 39 42 4d c c 43 18 13 +FIXUPS: 57cd 23 1a 1d 1c 39 57 c fffff546 f 17 27 2b 1f f 17 27 3e 18 26 +FIXUPS: 5092 5c 18 13 16 23 1a 18 1c 21 33 3f 1c f 21 3b 19 d9 1d 38 fffff40c +FIXUPS: 4820 5b 13 34 4d 21 13 56 21 13 34 64 f 1a 59 25 18 f 31 17 13 +FIXUPS: 4bb9 e3 32 f 20 5c 13 44 18 18 909f c 7f 1f 34 5c 1b 40 ffff63a0 +FIXUPS: 440b 21 21 21 21 21 21 21 21 1e 43 15 40 23 3f 21 1e 44 18 5e 15 +FIXUPS: 475c 5c 9219 34 5b 1b 40 26 24 15 13 15 13 15 24 20 f 15 3e 28 +FIXUPS: dc5d 32 49 1e 59 26 39 19 15 13 13 2a 1b 22 fffff6cb f 15 1d 13 +FIXUPS: d5bf 28 16 c 16 11 39 49 1e 6d 2b 15 15 c 1f 15 55 32 16 32 13 +FIXUPS: d8de 1b 22 c c 7f fffff627 1e 15 15 24 3e 28 25 7c 54 5b 36 11 +FIXUPS: d25f c 24 18 1f 6f 31 4d 17 5b 15 2d 24 15 13 15 13 15 24 fffff6d2 +FIXUPS: cc3c 20 10 20 27 10 20 38 19 15 18 13 37 28 25 c 1d 2a 22 c c 1c +FIXUPS: ceb6 2f 32 15 13 15 13 15 24 fffff7e6 11 22 d 3f 49 6c 12 2c 12 +FIXUPS: c944 15 13 15 13 15 1d 13 1d 20 61 20 10 20 20 18 21 13 1d 15 32 +FIXUPS: cbc8 fffff6e5 13 10 20 3e 28 25 31 3b e 10 15 19 12 11 15 1c 49 +FIXUPS: c501 2c 16 31 17 17 24 18 1f 10 49 3f 48 5d fffff725 35 26 17 17 +FIXUPS: bf0c 18 1f 10 49 3f 45 47 1a 2c 49 18 3c 10 15 14 12 11 28 1c 1c +FIXUPS: c222 26 15 13 15 13 fffff61a 13 87 36 95 43 58 60 5c 1b 42 10 15 +FIXUPS: bc04 12 11 c 6d 1c 1c 1c 26 15 13 15 13 15 3e 27 25 23 23 fffff587 +FIXUPS: b3fa 10 11 13 10 11 13 10 11 3e 27 25 11 6b b4 1e 13 26 19 13 35 +FIXUPS: b731 1a 48 13 35 3c 1a 17 2a 1b fffff40b 24 47 10 21 39 15 28 34 +FIXUPS: adef 2b 12 12 12 12 c 10 37 60 15 11 34 34 50 164 4e 4e 8b 9d 31 +FIXUPS: b376 3c fffff316 12 1e 25 53 12 1e 28 19 22 cc a4 5c 12 1e 47 5d +FIXUPS: aab5 1e 5e 34 21 c c 22 1e 10 10 37 24 c 1e fffff3aa 4c e2 1e 48 +FIXUPS: a227 16 13 19 2d 15 2c 10 76 40 2d 15 22 49 10 16 1a 48 59 16 13 +FIXUPS: a56d 2d 15 28 44 1b fffff3ef 1e 9a 12 1e 1b 14 25 35 1e 5a 54 12 +FIXUPS: 9c92 1b 16 43 58 4f e 74 12 32 26 1e 38 73 42 20 1c 1e 1b fffff441 +FIXUPS: 9505 1a 16 13 25 34 1a 16 5a 23 1a 35 8e 1a 1e 3f 1a 1e 51 71 1a +FIXUPS: 98d4 1b 14 24 49 22 1a 1e 1f 22 fffff2a1 64 35 110 19 47 43 20 +FIXUPS: 8f4f e 61 5e 1d 12 1e 36 a 3b 6b 25 43 58 3c 16 26 19 20 22 b3 +FIXUPS: 93ce 12 1e fffff2db 2e 23 10 39 29 33 10 12 12 16 7f 12 1e 1b 14 +FIXUPS: 8969 31 52 1f 31 22 b2 75 12 1e 1b 14 40 12 1e 26 fb59 14 17 2f +FIXUPS: 1884e 20 fffef895 21 36 11 1f 41 21 a1 3c 20 e9 1a 3b 1a c 20 14 +FIXUPS: 84a3 1a 2f 40 33 2f 30 a2 33 fbbc 15 61 12 c 1b 24 3a a0 7b 3e +FIXUPS: 184ef a 17 33 19 23 bb 47 12 21 19 19 19 19 19 19 19 19 1d 13 14 +FIXUPS: 17d03 18 2b 25 77 36 53 19 15a 1b 1b 16 38 16 20 22 16 1b 20 39 +FIXUPS: 18162 10 c c c c c 10 10 1d 34 10 fffff109 11 24 10 20 e 22 2b +FIXUPS: 17456 1d c 20 1b 43 2b a9 66 aa 77 262 26 11 10 17a 23 11 1f 98 +FIXUPS: 17cae 1c 13 13 ffffef6c 40 ea 68 2d 8a 10d 4b 24 43 17 18 24 19 +FIXUPS: 170f5 16 5f 1e c 19 13 3d 1d 2a 1f 1d f 21 14 d 1b 39 fffff30f +FIXUPS: 16661 53 1f 86 12 2c 53 1d 18 31 1d 71 2b 15 15 27 1d 58 51 13 +FIXUPS: 16a4c 2e 1d 85 1b 3a 49 17 1f 1c 31 fffff3ce 27 27 20 1b 23 2e +FIXUPS: 1610b 2f 3c 2b 1e 47 1f 57 20 95 20 57 2b 23 11 4e 2f 26 13 46 +FIXUPS: 16537 2d 19 1f 86 ffffeca5 49 1e 64 69 21 3b 1e f2 45 12d 21 49 +FIXUPS: 15761 71 21 4a 18f 21 4d 123 45 111 f0 77 55 100 13 1d a 17 2f +FIXUPS: 146fd 98 1b 1d 55 20 55 2a 13 16 34 39 38 23b 21 4a 1e 35 2a ad +FIXUPS: 14d7c 23 33 c3 dc 69 21 3b 1e f7 45 116 ffffe81f 86 ce 73 41 62 +FIXUPS: 13d58 55 32 55 c5 6e 1b a1 24 d0 21 39 1f 3b 49 63 13f 33 a7 11 +FIXUPS: 144d7 16 10 1b 157 1a ffffe708 2a 21 2a 21 2a 21 3c f 1d 15 198 +FIXUPS: 13116 8 cb 98 67 86 fe 32 8e 52 123 80 1a 56 56 4c 4b 54 54 149 +FIXUPS: 1256c 17 c e2 1a 19 38 88 1a 19 81 1a 19 38 ae 1a 4b 42 2b a4 8c +FIXUPS: 12b80 21 34 71 24 2f 2f 21 2f 21 2c ffffed5c d2 17 1b c8 c3 5e +FIXUPS: 11dec 5f 60 44 60 45 138 21 52 f 59 7f 1a 26 13 1a 34 5e 57 15 +FIXUPS: 12400 27 8a 55 51 ffffe8f5 56 42 c2 25 10d 21 2b 1b 21 21 3d 16 +FIXUPS: 11222 62 51 127 5a 94 50 9c 1f 42 121 1df 1e 14 9 16 9 46 15 ffffec9c +FIXUPS: 106c0 21 f 27 b2 137 1b 49 70 ba 3f 78 15 2d 29 1f 2e 1f 14 1d +FIXUPS: 10c5e 11 11 11 60 30 29 30 42 29 30 ffffe9e6 31 3b 59 1b 39 1d +FIXUPS: f975 1a 141 2f 43c 20 3e 1f 8 3f 1b 2f 24 13 27 87 14 9 91 54 2b +FIXUPS: 10306 31c 30 f ffffecb9 1b d 30 5a f 18 9 37 51 27 f 18 9 65 14 +FIXUPS: f5a4 10 4e 19 18 17 16 17 26 17 11 17 3f 1a 90 17 fffff518 c 14 +FIXUPS: ed2b e7 4b 1a 87 83 d c 5e 1e 1b 3b 30 14 12 3c 16 1c 57 20 17 +FIXUPS: f1df 4c 3c 25 1b d 16 2b fffff2ba 57 cc 19 d 1e 12 13 24 71 f 1d +FIXUPS: e8a2 40 6e 3b 14 3e 82 24 6b d c 14 5e 1f 6e 3b 14 17 24 57 d61a +FIXUPS: 1c33f 18 1c f ffff1ccb 17 16 f 7e 14 9 20 9 22 34 22 44 59 ca 40 +FIXUPS: e403 33 29 f 2b 2b 17 d 64 1b 24 da04 18 14 19 f 18 19 f 18 19 +FIXUPS: 1c063 18 f e f e 8 21 1c 1c 1c 1c 1c 1c 1c 19 19 19 19 21 8 88 +FIXUPS: 1bcef 19 f 18 19 f 18 14 12 14 19 f 16 19 f 18 19 f 18 19 f 18 +FIXUPS: 1bec0 f 18 19 f 18 19 f 18 19 fffff796 8 1b 22 6f 8 52 1c 20 25 +FIXUPS: 1b8a1 15 184 d 5 91 39 70 26 30 f 18 f 1d e 1e 14 19 f 18 19 f +FIXUPS: 1b253 1b 8f 12 13 57 1e 5f 1e 1e 1e 1e 2e f 5c 21 17 a d d d d +FIXUPS: 1b58a d d d d 11 de 2a 12 1b fffff7d0 f 26 20 20 21 12 12 27 2c +FIXUPS: 1b00f 16 3f 21 25 16 c 8 1d 12 41 c 1f 12 12 12 12 12 12 12 c 13 +FIXUPS: 1a841 14 c 20 16 1a 60 ba 19 19 5b 174 17 13 21 21 b9 27 38 f 10 +FIXUPS: 1ad8c 37 21 c 29 19 21 f 26 19 21 fffff3a4 92 45 30 e 6 1a 107 +FIXUPS: 1a4ca 20 44 46 31 cd 2e 1a 18 19 26 14 1d 1d 10 14 c 20 19 10 14 +FIXUPS: 1a7f8 20 19 fffff1f5 12 8 10 d 21 e 8 4e 14 3f b 14 21 21 a1 f +FIXUPS: 19cfc 62 21 80 8 6 47 28 23 31 f6 84 1b 1bd 22 fffff195 23 20 23 +FIXUPS: 1945f 23 20 23 20 1e 1e 1e 1e 1e 1e 1b 18 18 20 1f 1f bf f 18 9 +FIXUPS: 19750 d7 48 21 134 44 d fffff523 28 26 26 26 26 26 23 23 23 50 +FIXUPS: 19155 f 18 9 1d 9 1b 14 7e f 18 9 1d 9 1b 2d 18 28 15 18 56 fffff777 +FIXUPS: 18b4c 15 20 69 3d 17 d 11 12 18 11 13 f 18 12 17 28 18 28 15 10 +FIXUPS: 18da0 16 56 28 23 28 23 28 23 28 57b1 49 37 16 14 6f 39 63 16 24 +FIXUPS: 1e91c 16 13 15 18 4b 15 15 a0 a7 7c ffff9d0b 4c 16 16 16 16 f 42 +FIXUPS: 18a99 31 49 56e4 38 17 1a 1f 18 59 e e e 2e 32 24 1d 16 28 69 f +FIXUPS: 1e489 9 1d 9 1d 7f 1a 15 1a 15 57 7f 1c c fffff7e2 38 17 1a 1f +FIXUPS: 1df68 17 13 18 15 17 13 18 1a 17 13 18 15 17 13 18 15 17 13 18 +FIXUPS: 1e11b 1d 18 1d 40 17 17 fffff950 1f 1a 2a 1a 5b 17 13 18 15 17 +FIXUPS: 1dc84 18 1a 17 13 18 15 17 13 18 15 17 13 18 10 1d 18 1d 40 17 +FIXUPS: 1de76 fffff82f 1f 27 1a 69 17 10 15 3c 17 10 15 37 17 10 15 10 +FIXUPS: 1d8c2 18 1d 57 17 17 1c 2d 54 28 1f 1d 1f 1a 5e fffff82d 18 54 +FIXUPS: 1d3c4 13 18 15 17 13 18 1a 17 13 18 15 17 13 18 15 17 13 18 10 +FIXUPS: 1d57d 18 1d 40 17 17 1c 38 17 fffff943 1a 61 17 13 18 15 17 13 +FIXUPS: 1d0e2 1a 17 13 18 15 17 13 18 15 17 13 18 10 1d 18 1d 40 17 17 +FIXUPS: 1d2d8 38 17 fffff875 28 28 15 1d 15 19 15 10 37 17 10 15 10 1d +FIXUPS: 1cd29 1d 35 4e 28 1c 1d 1c 17 54 17 1c 17 59 17 1a 1f fffff56e +FIXUPS: 1c541 33 2b 6a f 18 9 1d 9 1d 1b 123 19 2f 18 7d ad 2c 2c 42 18 +FIXUPS: 1ca1d 1b 1a 17 32 1a 6f 17 10 15 29dc 28 12 17 18 15 14 1a 28 12 +FIXUPS: 1f639 18 15 14 1a 2d 84 7e 7e 19 50 ffffcaf3 1a 2f 6c f 18 9 1d +FIXUPS: 1c4a8 1d 3e 2a81 c3 12 18 35 70 c c 2d 19 c3 12 18 50 71 c c 14 +FIXUPS: 1f36b c 46 5e c 1e 23 13 31 1e 18 17 16 13 10d6 371 17 17 8b 17 +FIXUPS: 20a50 ffffe1d4 5a d c c c 25 35 5e c c 1f 2a 1b 3e 5e c c 1b 4b +FIXUPS: 1ef15 13 c c 2b 52e3 f4 174 35 91 2e 19 1c1 ffffb238 52 37 2e d2 +FIXUPS: 1fb54 283 14 115 1d8 be 152 42 f 3a 81 c b 3b de 17 17 78 17 335a +FIXUPS: 2396f c 2c c 24 55 6 1a 1b 36 26 22 22 21 41 c 34 15b 18 37 1c +FIXUPS: 23ecd 2b 50 c 5a dc 1c c 7c 47 ffffe6fd 7a 115 9a 20 120 21 8e +FIXUPS: 22ca2 23 70 aa 8 50 27 c 9a c7 2d 1c a 6 6c 1fc b1 23 4d1 37 19 +FIXUPS: 238e4 c 3f ffffe592 b 1e f 64 20 32 a 277 f f0 a 18 7 a 42 b 2d +FIXUPS: 223f8 d f 5d f2 59 2c 14 86 af 17 25 3c 6e ffffed65 5 5 5 5 11 +FIXUPS: 215b0 78 9 a e b8 48 68 2c 14 55 3c 50 23f 13 15 13 15 5c 77 14f +FIXUPS: 21d91 b8 19 a 14 3611 3d 1f 1f c 1f ffffb81b 36d 17 170 43 dd 25 +FIXUPS: 2145b 5 5 18 5 3d 14 5 13 5 16 1b 5 1b 15 10 7 5 5 5891 1e 51 13 +FIXUPS: 26f65 1e 12 37 39 43 130 74 7d c 61 2d 1a 12 ffffd567 67 14d 234 +FIXUPS: 24caa ac 2c 80 f 90 f 2c3 1c7 68 d4f 16 67 24e 11 2f 28 28 22 87 +FIXUPS: 26509 c1 31 b2 1d 159 1d 58 3b 14 c9 1e 2c 62 15 22 47 147 4d 1a +FIXUPS: 26c9a 162 12ef 37 ac ffffd42a 17 1d 54 20 15b f a 11 f f f 37 7d +FIXUPS: 25937 2f 66 ef bf 15c 1f 19 104 43 39 c 5e df 52 167f 72 59 26 +FIXUPS: 277ac 29f 2f a6 c 69 5f 60 1a d 1f 1f 1f 1c 42 12 4e d 1f 1f 1f +FIXUPS: 27e1c 59 37 ac 58 37 ab 2419 b 2b 2e 1a f 1e 60 17 13 c 15 9 14 +FIXUPS: 2a630 20 9 2e 9 f 1f 1d 29 ffffccba 39 166 f 82 c 2a 16 30 29e1 +FIXUPS: 2a05d 18 14 2b 9 32 1a f 1e 60 17 13 c 15 9 3d 1c 16 12 20 9 2e +FIXUPS: 2a2cb f 1f 1d 29 46 25 31 22 fffff939 10 1f 1b 10 1f 29 9 2e 9 +FIXUPS: 29e63 13 29 5 16 21 16 10 f 1f 14 15 16 f 1a 14 11 15 16 f 20 14 +FIXUPS: 29821 1f 1b 14 10 21 1b 14 10 1f 1b 19 19 19 8 19 d 4f 1b ab 4e +FIXUPS: 29b93 7e 15 2a a 48 10 1f 1b 10 1f fffff63d 15 16 15 18 5b 10 18 +FIXUPS: 29445 5e c 24 28 28 45 1b 4e 1b 49 25 1b 12 1d 19 19 24 15 3f 44 +FIXUPS: 297d3 2a 14 fffff731 13 19 20 20 21 31 19 19 16 15 39 3b 3b 1a +FIXUPS: 29151 1e 1a 2a 1e 1a 2c 1a 2b 1a 2b 14 1a d 13 d 2a fffff843 1d +FIXUPS: 28b9b 64 3c 14 9 21 e 31 1b b 66 19 10 14 9 1f 10 17 15 1d a 1f +FIXUPS: 28e43 1b 26 1c 16 26 1c 2b fffff531 5e 8c 2c 19 39 8c 3a 3a 10 +FIXUPS: 286ec b c0 c 11 b 1e3 4a d 18 1d a d 18 1d 2f d 18 1d e 2b d 4d39 +FIXUPS: 2d89f 18 a3 3d 21 11 83 c 77 8 1b ffffa745 c 34 23 11 1a 27 1a +FIXUPS: 28319 1e e 1e 1a 14 f 14 9 d 2e 53 483c 8 46 c 6a 15 23 35 b 11 +FIXUPS: 2cddc 9f 4e 3d 59 32 150 127 14 9 185 198 b4 6f 10 20 c b2 12 a7 +FIXUPS: 2d833 4b ffffee1a 2c 10 14 10 14 10 14 10 14 10 40 61 8e 1f 18 +FIXUPS: 2ca42 36 14 f 2f 18 20 15 75 3f c 3d 1c c 1d b fffff62e 18 14 1a +FIXUPS: 2c300 15 47 14 24 39 2b 25 b 14 9 7d d 16 10 18 d 16 10 3b 1a 18 +FIXUPS: 2c5d1 18 1c 2e 22 3a fffff0ff 53 f7 16 d 19 27 f 17 17 11 28 21 +FIXUPS: 2ba58 35 2f 1d 6c 75 53 49 11 49 2f4 59 a3 c 17 125 11 4f 3b ffffe9fd +FIXUPS: 2acb1 6d 17 73 8d 41 33 41 5a 3a 15 36 15 3e 16 a 5d 19 63 b8 16 +FIXUPS: 2b1f0 19 93 10d 22 53 186 1c 7d 33 604f 20 38 92 29 ab 29 2b 29 +FIXUPS: 319c8 29 1e ffff8dcf aa f 20 d5 26 1b f 20 90 1d 84 31 e d e 23 +FIXUPS: 2abf8 1e 31 662e 10 16 d 10 1a f 19 15 1d f 8c a 17 13 1c 34 15 +FIXUPS: 3147d f 6f 37 19 31 10 1a f 1d 15 1d f 6f fffff965 10 19 10 19 +FIXUPS: 31049 19 10 19 10 19 10 19 12 19 12 19 10 19 10 19 10 19 10 19 +FIXUPS: 311e7 19 10 19 10 16 10 fffffacd 19 14 19 14 19 10 19 10 19 16 +FIXUPS: 30e20 16 19 12 19 16 19 16 19 12 19 10 19 10 19 c 1b 19 10 19 10 +FIXUPS: 306d6 10 f1 13 22 1b 13 1b 13 6a 39 35 23 2e 4a 10 31 10 23 1a +FIXUPS: 30a76 f 1a 4b f 1f f 17 30 9 191 14 fffff3f2 b 78 33 35 35 1b 2a +FIXUPS: 30295 f 17 17 13 15 22 19 bb 31 1a 2e 1a 22 f 99 f 16 2d 1a 25 +FIXUPS: 305fe 1e 35 fffff61a 3f 2a 2c 19 21 37 27 1c 19 1d 29 1c 1c 27 +FIXUPS: 2fe8e 1d b a7 b f 14 b 13 b 31 39 35 23 2b 3d b fffff7bb 1c f 5c +FIXUPS: 2f94b 16 e 1a 12 24 2c 35 35 1b 16 11 15 22 19 1d 1d 1d 1d 1d 1d +FIXUPS: 2fbaf 1a 24 1e 2a b 14 fffff415 c1 9a 1d 106 2a 2c 12 32 2c 2c +FIXUPS: 2f3eb 32 2c 4d 32 2c 1f 2c 29 63 6a 14 7c 1a 42 2c 4b 4f 71 1a +FIXUPS: 2f895 fffff1bd 2f 2f 15 3c 15 1e 15 19 2a 1d 31 33 7d 63 5e 45 +FIXUPS: 2eda8 10 c c a1 5f 20 20 20 3a 60 13 3e 20 1b fffff599 4c 1a 14 +FIXUPS: 2e6b5 1a 14 5d 1a 13 2d a 1b 30 1d f 21 14 15 16 f 79 28 b 27 b +FIXUPS: 2e993 b 25 b 47 15 fffff46c 3d af 4d 31 1a 44 1a 26 73 16 1f 1a +FIXUPS: 2e179 13 14 2b 3e 39 15e 33 3b 3b 3b 3b 40 16 4b c 10 14 18 4f18 +FIXUPS: 3350f 2c 56 15a 2e 41 109 1ac 61 4b 4b 48 2d 90 135 39 18 69 1b +FIXUPS: 2dd0a f 32 39 1a 13 1b 1a 1d 1a 26 44 4931 35 14 e5 14 1b 1d 228 +FIXUPS: 32b6e 26 31 31 27 21 1e 1e 1e c 73 5e 8e 37 b5 52 1d 9e 8 46 d9 +FIXUPS: 33184 1ac 61 ffffeb42 b 1f e 12 1f 97 30 27 27 26 b 1f 34 b 1f +FIXUPS: 3215b 1f 10f 11 11 f 2b 5d ad 85 97 58 58 97 52 18 4bcb 3d c 22 +FIXUPS: 37334 e 1b 12 ffffa742 77 2d d4 a9 15 4b b 1f e 12 1f 22 b 1f e +FIXUPS: 31e07 1f 22 b 1f e 12 1f 4d80 18 c 14 18 24 16 13 18 c 14 18 1d +FIXUPS: 36d51 13 18 11 13 18 c 1a 18 6c 17 161 17 f3 17 17 1c de 1f fffff60f +FIXUPS: 3685b 10 13 30 d 30 1b a 9 a 9 a 9 18 b9 11 29 c 24 20 20 20 25 +FIXUPS: 36b1a c c 5a 1c 25 18 39 fffff361 85 17 38 48 3f 3f 3a 3a 37 43 +FIXUPS: 3624f 59 5c 2c 3f 13 d6 58 15 18 c 21 55 5d 42 5e 42 5d 42 5e 42 +FIXUPS: 353c0 4e 18 15 15 15 1c 15 55 1a 7b 1c 49 3d 48 b1 24 2e da 3a9 +FIXUPS: 35d53 15 15 15 15 15 2d 2a 1a 2f 39 28 ffffeccc 16 10 2d 64 55 +FIXUPS: 34cbd 61 55 55 d 22 2c 44 3a 24 5b 49 47 72 58 5b 59 5a 1f 3a 1e +FIXUPS: 35219 74 7d 50 3e 4956 ffffa2ba 2b 4d b5 2e 19 2e 19 2e 19 2e 16 +FIXUPS: 3421c 272 17b 46 2e 260 30 58 15 18 c 1e 2e 33 40 6d 36 16 10 4d73 +FIXUPS: 398c5 26 3d 16 14 59 60 5 a7 2a 43 26 1a 1a 23 1a 1e 17 11 d 8 +FIXUPS: 39c5e a 8 5 5 5 7 a 8 42 fffff54d f 4a f 55 b d 6e b 31 f 43 b +FIXUPS: 39434 23 35 1d 4f 46 d 44 d 7d 27 23 d 192 2f 1c 18 d 1c fffff2a9 +FIXUPS: 38b47 1b 1b 39 ae 14c 3c 8d 2f 48 d f 42 d 60 d 22 d 6c 17 b 35 +FIXUPS: 390c7 1f d 36 2c b d 79 b fffff329 b 12 b 28 b 26 b 8 e 52 27 c3 +FIXUPS: 3876c 22 69 47 29 f e 5 51 c a f 20 c 32 7d f2 23 27 fffff030 d +FIXUPS: 37b63 c c 8 5e 16 16 d e 8 a 10 2e 1e 30 1e 122 52 52 64 5c 34b +FIXUPS: 38474 b 14 b 20 b 12 b fffff3a5 12 12 c 8 5 5 11 4e 28 d 3e 16 +FIXUPS: 379d0 16 d 14 f 8 11 2a 78 8 5 5 5 e 5 a 16 11 d 2e63 13 13 13 +FIXUPS: 39d2e 20 5a ffffd603 13 1b e 10 10 10 10 10 c b 61 19 30 19 12c +FIXUPS: 376d3 66 36 23 12 5e 44 b 23 2b39 8f 92 14 8 52 56 4a 1c 1c 1c +FIXUPS: 3a64c 1c 1c 13 3d 1d 1c d1 22 16 2e 9 18 46 43 19 36 13 13 13 13 +FIXUPS: 41ce1 2b 13 50 64 11 35 ffff7fb6 11 18 11 2f 23 21 6c b0 1e 18 +FIXUPS: 3a04a 1e 18 1a 16 c c3 42 17 c 6a c8 16 17 6b1d a 13a 17 17 156 +FIXUPS: 41134 b8 27 c2 d7 2d 40 96 ef 14 a 17b 17 17 7e 1c 1c2 17 17 201 +FIXUPS: 41c46 27 2a 12 13 12 ffffe6e3 38 5b 31 28 31 32 36 a 1b 33 e2 fe +FIXUPS: 4088f 17 17 41 19 a 13a 17 17 4e a 143 17 17 4e a 13a 17 17 ffffe9c9 +FIXUPS: 3f7f8 1b b9 3c 47 133 e 10 1e4 10 3f a 129 17 17 aa 5d 25 28 35 +FIXUPS: 3ffe6 7f fe 22 35 59 1b 1f 4a 52 70 ffffe839 1d f9 16 bd 27 61 +FIXUPS: 3ee0d 11f 17 17 9a 5a 13 119 c9 69 31 31 161 1f 1f 3d 30 31 31 +FIXUPS: 3f607 9b 7c 2e c 47 ffffe7aa 2e c5 19 1b5 103 c9 8a 5d 74 15 101 +FIXUPS: 3e695 2c 1d 1b 1b 71 48 131 29 29 79 1e 53 e 16 a 95 11 11 56 ffffe8b9 +FIXUPS: 3d473 17 17 5f 2c 37 dd 5c 3f 31 8 af 9d 17 17 69 40 7a 10f c4 +FIXUPS: 3dbb1 21 9f 27 28 35 3b 40 24 80 f9 ffffe635 81 5f e2 2d 28 5f +FIXUPS: 3c899 cf 85 2b 70 14 7d 4d 51 2a 19 14 9f b7 50 8 96 3a 1c 94 2a5 +FIXUPS: 3d219 69 31 fa ffffe960 73 53 31 c 5b 62 12 32 75 8 13 3b 36 11 +FIXUPS: 3c04a 2e c 37 c 4e 128 c 29 5f 10 67 79 8 a9 a2 17 ffffee81 a2 +FIXUPS: 3b45a 3e f 48 f 11 f 28 f 3f e8 13 51 4f 54 78 69 69 45 4f 74 86 +FIXUPS: 3baa6 94 93 35 11 c 58 54 fffff0db 27 b 11 11 16 2a f 5b 49 42 +FIXUPS: 3af59 2e 35 57 20 53 22 4a 47 5d c 5b 17 10 2f f 9f 2c f 20 40 +FIXUPS: 455a0 19 1f 16 17 34 11 16f 40 10 2c 14 12 f 173 17 27 1d ffff4fdb +FIXUPS: 3aa25 11 11 34 17 127 24 57 34 12 20 3b 95 a218 e c 18 c 46 c 103 +FIXUPS: 45121 8a 23 16 1c 16 16 c 68 14 6c 1c 16 16 17 34 1a f 86 14 4c +FIXUPS: 454e9 82 1c fffff27d 23 16 a0 3e 35 15 aa 16 18 17 1a 1a ec 56 +FIXUPS: 44cda 14 2a 35 40 27 e 53 e 27 18 e 19 21 22 e c ffffeee1 2e 4d +FIXUPS: 43e6a b1 14 b6 1a 7e 9d 1c 23 15 28 9c 1c 43 18 17 1a 1a 153 2e +FIXUPS: 444b0 c8 10 19b 17 28 54 1c 1c ffffeedf f 35 34 24 3a 28 59 24 +FIXUPS: 43898 24 28 1f 10 2e 19 24 21 21 21 b4 82 76 52 52 4d 35 16 c 49 +FIXUPS: 43d46 26 ffffec26 a1 217 1c 9d 48 b5 24 3f af 4a 62 1a 72 86 1f +FIXUPS: 430fb cf e7 20 c 225 c 46 1d 36 3c 24 24 34 22 24 2491 2c 21 54 +FIXUPS: 45beb 6a 13 21 99 26 f 2b 1b e 4f ffffc0e5 39 68 f 14f e0 10 ae +FIXUPS: 423d6 3c eb 66 b7 11c 6d 10c 42 3d53 11 f f 14 b 16 e 16 e 16 e +FIXUPS: 4670d 16 11 16 11 16 11 23 1b 32 b d 23 e 8 5 9 fffff29b 22 18 +FIXUPS: 461e9 1a 1a 65 3f 21 12 24 12 1d 12 1b 12 18 36 15 5f 10 16 24 +FIXUPS: 464b8 4a 2b 21 11 25 11 19 16 f 1c 44 d3c c 1b 13 1e c 1b 13 24 +FIXUPS: 47433 e b 11 e b ffffe9dc 44 f 26 f 26 26 2b 39 5a 3e 31 18 12 +FIXUPS: 46147 37 2e e17 f f f f 16 23 d 81 25 38 5e 1c 25 f 27 2f 23 14 +FIXUPS: 4726a 1b c 1b c 1b c 1b c 1b c 1b c fffff808 61 e7 19 f 31 14 e +FIXUPS: 46d41 f 1b 16 f 18 f 15 f 1b 16 7a 8 15 5d 2a 12 12 12 12 12 12 +FIXUPS: 46fa5 f 244e 16 1c 22 18 98 3f 36 2a 3a 3c 5a 2c ffffe310 35e 20d +FIXUPS: 47f5f 28 3b 60 d 43d eb 123 4f 75 ffffe240 34 55 6b 28 1a 22b3 +FIXUPS: 48d7b 28 7b 2a 1a 23 1c 16 13 e 31 1b 14 c 3c 1d 8a 12b 70 48 27 +FIXUPS: 4926e 11 36 e 35 22 18 27 4f e 2180 33 3b 1a be b9 ffffd1f9 22 +FIXUPS: 4897b 19 4d 22 2b 19 45 1e 1e 1c 2d 31 31 41 20 55 63 1a 3c b 27 +FIXUPS: 48d1f 19 b 1dc6 18 ad 10 b1 3f dd a6 5 1f 20 30 18 1f 30 24 1e +FIXUPS: 4af94 16 d2 31 7c 21 87 15 3f a 26 22 71 f0 14f ffffef67 d4 f8 +FIXUPS: 4a682 14 10 1d a 19 13 57 83 54 13 51 9 15 e 10 1e 1b 1b 63 9 55 +FIXUPS: 4a9f5 18 46 9 2a 9 19 ffffec78 c df 14 18 4d 10 16 213 22 1d 1d +FIXUPS: 49bd5 33 90 2d 20 a8 2d 20 e1 121 171 b4 28 10 2c 43 13e 28 10 +FIXUPS: 4a44a 2730 d 75 1e 1d 37 40 20 1c 5a e 1e6 37 17 1b 39 1c 16 19 +FIXUPS: 4d046 21 21 21 6f e 8b 79 36 14 1c 93 ffffc3cb 2ebe 23 21 18 14 +FIXUPS: 4c638 18 14 2c 9 30 9 9d 3c 33 87 16 1b 16 18 16 18 16 4a 89 2a +FIXUPS: 4ca55 f 1f e 8e 48 fffff610 c 19 54 18 1f 13 18 c 14 18 1f 16 13 +FIXUPS: 4c2ea c 14 18 1f 16 13 18 17 18 7b 21 2f 23 23 17 79 11 fffff4c0 +FIXUPS: 4ba49 16 15 c 4e 7d 15 36 1c 4b 56 22 16 53 b4 3e 5c 18 f6 16 1c +FIXUPS: 4bf7f 49 23 21 16 20 c 10 84 16 1b3a f 35 c 67 21 39 5a 11 11 16 +FIXUPS: 4dde1 17 a9 7c 31 1f dc 15d 63 c c8 ffffd493 1d 16 c1 4c 31 8f +FIXUPS: 4b993 20 1c 1a15 44 7f 19 72 20 30 16 22 1d 67 d 7a 3e 25 51 c +FIXUPS: 4d7ec 8 8 33 1e 3f 83 c b 11 1b 39 38 ca 148 3be8 6e 22 50 5d 63 +FIXUPS: 519c7 9d 30 35 11 11 22 f 16 f 11 11 11 11 e e e e e e e e e ffffb763 +FIXUPS: 4d386 3f 3e05 12 14 3a 1b a0 50 59 17 17 11 3d 2e 28 35 3b 2d 38 +FIXUPS: 51562 26 af 16 18 13 18 13 2a 37 1b 3b 2f 26 fffff0f8 5e f5 97 +FIXUPS: 50aaa 3c f 39 f a1 d4 c1 8a 48 7c f 43 40 1a 23 33 15 26 1a 3c +FIXUPS: 51088 4e 37 1c 25 10 3d ffffeb4c f4 10 100 22 62 55 44 b3 5b 144 +FIXUPS: 5029d 6c 4f 22 54 62 4c 84 4f 67 6d 6f 77 42 1b 42 10 3f 3f 2e +FIXUPS: 50894 ffffead1 11 4a 27 18 1a 1d 24 1a 1d 24 1a 1d 27 84 4f 49 +FIXUPS: 4f684 54 7e 50 e 120 1b 5f 13 e ed 179 e 51 18 fffff0d9 31 2f 21 +FIXUPS: 4eddb f 48 3a 15 1c 1a 1d 7f 44 40 25 10 32 12 14 3a 1b a0 b0 47 +FIXUPS: 4f267 17 11 4a 18 46 17 fffff18e a9 75 20 63 49 1d 4d 2a 25 17 +FIXUPS: 4e7b5 18 15 16 15 18 72 43 20 57 13a 1a 1d 53 1f 24 2b b 3a b fe +FIXUPS: 528af 1b 1c 1d 2c 24 36 2ca 1a 36 3c 13a 8b 3c7 17 22 17 23 17 +FIXUPS: 53447 17 22 17 78 29 37 c ffffae64 16 17 a3 16 37c1 25 16f 11 11 +FIXUPS: 51e58 11 11 11 116 c d9 14 66 46 33 14 14 16 1d 1a 7c 46 1a 8f +FIXUPS: 523cf 1d 6a 139 24 12f 16 237b 11 13 12 11 15 12 27 f e 17 15 13 +FIXUPS: 54b79 a 16 e 12 11 13 12 11 13 12 11 15 12 27 f e 17 15 fffff5a4 +FIXUPS: 5428b 1a 112 23 2b 23 18 4c 1e 1f 16 ff 11c 16 e 102 17 27 9 16 +FIXUPS: 5488b 102 17 28 16 25 16 e 12 11 13 ffffebde 47 1d 129 3c 1d 21 +FIXUPS: 5386a 23 24 25e 228 13 1b 1f ab 26 f 1c 19 38 13 19 40 13 e7 15 +FIXUPS: 54061 17 162 36 3a diff --git a/quake3/source/code/game/Debug_TA/qagamex86.pdb b/quake3/source/code/game/Debug_TA/qagamex86.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c425296c134fdafdb218f553749148667fe4747a GIT binary patch literal 680960 zcmeF433yc1*?`ZTB^x^;q9R5_MMY#2H>!kW!bB#?n1oHyAtVzLO)_IT~t)GE~r>>siLJ8Emf>&QK{nktEKwC-?{fBLyTJ;1nkZ8ybSl;d(ZNnbIL@d$gQqSR!*r*M01A>95kp?&Q3>+R!aGlvef0C z0oh7j_VO@wvF8%cr5@bfKUV^-1h!EL{8u0FoNrC+oX%gnf35^v3Ahq)CE!ZHm4GV& zR|2jCTnV@ma3$bMz?Fb20apU91Y8NY5^yEpO2CzXD*;ymt^`~OxDs$B;7Y)iz|SiI zr8cHBz?0R;4e9jH^~;rjD*;ymt^`~OxDs$B;7Y)ifGYu40Z`ZHnw#>$3h0y7^< ziD3Zq%YXHsJR*NzcUIo6x%{V_Tq*ToXJvJl7jm%?(#&sXmDN@LFWy*PmC8|`u5qq& zaFPG-*7AR=YZ5n0ebnNIJm=>f@k8#39~t`E4nyvXd+Plx9fs9iBJ6eEm0$5Whu^-$ zPa@yfLBbb5%yr_0=vUrASg{jOK1Q^Lt| z^3liyC!MeIyxbqjb>DW=&>>PjvAiNsTv1dU_~^syoV?c=qkN<4Dib=-2N0f5bu3R- zHda?QRhRIEYWMwcFKBfys3hNY86nJyR`*T(nV>orRL-ogn_8RH{vcn~Q(@4Dzm8)9 zWhH^o&>;h>>+8ARleBs>Rn{)WEk=SuMI~c$hYlP(XyEX{!-nMcFR9pj+kbzE$`CQA zgDm-1sUWud$$R< zbAGHLUfC2aPd3#xP92}lu)6A$Ds@}?VdbSWtl3UjH=3|IL= z!3k@D39IMmXtJWNA$nA-F7SlJSm9a1{-X&<&VM1E=7rPmGyPi z`LXI~xN<7RF)d}p$gV~B{Frz9Om%5&8 zBnQ)*#<1O0QiUd5sfX=$x?*NLn$~*wAt$Vn?T3|?df4P$f9X8)cZdnAgHu1+)mB>a z&eSFIoUn$OuyUj>$#06%flWvGH)-1Fgfq~DqwB|lXd>AZn@L*J5tiwH#5-v5ss1J` z>3^j39ql5LNK5%JVXk$;>}$f@zTGg>l1}s8O=6HLf4xnZJ4gX(C!su(4*8mJS32SL z{GM>r)i*a~bwnqfT-DWtn}v)^1I78_^rWwk)9x*B!pSk=WDrhXemEU6G-=7|Y^TL% z!pJ6!{IK+n(~?)_yGuIZe6_+EM|G6%Tem!X;pvf^32TiL*5@r@6(vShR!b)`oJ@1w zAL?Su?;{fy?Hgf@Z>md1C9rhlmFWjP3E6Xr@2W;glHnwy%KLkKs;s-lTRTI6ZU$~q^!=S_HBE22#eb&Y&%Cb+bO zXY#MYo}g08O?aKlD(e!_mVQ?{^3Q~|)Cucx6IRDiesN{onHfoMxg4;a{sh!R?S;h$ zmyUFqa=E|>>pm0KcH`@+qcWdc5i4e9w@zkp)AZe$Fnjc{)3>N4%$ATUVkY=Bg=yNg z8BUnDm@xh2_0ecNEwVIaWUUj%LK8-(Ladk9=f&fJ8Fk6Lw1ySl-j?AtCaew;M$2cG zmat5IEpx)U%!Jj0>HTTZeA=5jCVtAJRWiy+Z@E0Er=7kFTfz*;FnF_ud7BgFIVQ~Q z3!?SW;h?UXttj!XxDXa6GaOaqCJBDJF)uFm6O_fbE z(^SWpc0u*B(>Tk7)xESi8E;M&M5i=QwQJC{j3N6veb`zjyrc;)TX&757m=3l!pLx? z6HcQEr=#v0rFGubq-n&CwhU`cSUFmHqZq6npN{fq^6EAxoGB)puC0BBidsUePS1C4 zWY}vbJ6)4Zcp}44Wg;19YKo<~-#pg|Yn%zILq≈204!r>l)K>Du6g6*ghXoP3(o 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 *Oj0kKnj_v@Gv?kfnOT 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

`OKxW@LLqK8tlX{oj{t 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 c-i6xoo>lPR79h8!_;|05lNyBme*a literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/vc50.idb b/quake3/source/code/game/Debug_TA/vc50.idb new file mode 100644 index 0000000000000000000000000000000000000000..b4f702ba2437e2a8f74ce186cc70f8499fb20340 GIT binary patch literal 82944 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

\n"); +} + +static void do_item_list(list_ty x) { + int count = Seq_length(x); + + if (count == 0) + printf("empty item list\n"); + else { + int i; + printf("item list"); + printf("
    \n"); + for (i = 0; i < count; i++) { + rcc_item_ty item = Seq_get(x, i); + printf("
  1. ", item->uid); + do_item(item); + printf("
  2. \n"); + } + printf("
\n"); + } +} + +static void do_string(string_ty x) { + printf("%d,'%s'", x.len, x.str); +} + +static void do_generic_string(void *x) { + do_string(*(string_ty *)x); +} + +static void do_string_list(list_ty x) { + do_list(x, do_generic_string, "string", "ol", ""); +} + +static void do_node(void *y) { + rcc_node_ty x = y; + + if (x->kind == rcc_LABEL_enum) + printf("", x->v.rcc_LABEL.label); +#define attributes xx(x,suffix,suffix); xx(x,size,int) + switch (x->kind) { + static char *typename = "node"; + caselabel(CNST); + yy(CNST,value,int); + break; + caselabel(CNSTF); + yy(CNSTF,value,real); + break; + caselabel(ARG); + yy(ARG,left,node); + yy(ARG,len,int); + yy(ARG,align,int); + break; + caselabel(ASGN); + yy(ASGN,left,node); + yy(ASGN,right,node); + yy(ASGN,len,int); + yy(ASGN,align,int); + break; + caselabel(CVT); + yy(CVT,op,op); + yy(CVT,left,node); + yy(CVT,fromsize,int); + break; + caselabel(CALL); + yy(CALL,left,node); + yy(CALL,type,uid); + break; + caselabel(CALLB); + yy(CALLB,left,node); + yy(CALLB,right,node); + yy(CALLB,type,uid); + break; + caselabel(RET); break; + caselabel(ADDRG); + yy(ADDRG,uid,uid); + break; + caselabel(ADDRL); + yy(ADDRL,uid,uid); + break; + caselabel(ADDRF); + yy(ADDRF,uid,uid); + break; + caselabel(Unary); + yy(Unary,op,op); + yy(Unary,left,node); + break; + caselabel(Binary); + yy(Binary,op,op); + yy(Binary,left,node); + yy(Binary,right,node); + break; + caselabel(Compare); + yy(Compare,op,op); + yy(Compare,left,node); + yy(Compare,right,node); + yy(Compare,label,label); + break; + caselabel(LABEL); + yy(LABEL,label,define_label); + break; + caselabel(BRANCH); + yy(BRANCH,label,label); + break; + caselabel(CSE); + yy(CSE,uid,uid); + yy(CSE,node,node); + break; + default: assert(0); + } +#undef attributes + printf(""); +} + +static void do_node_list(list_ty x) { + do_list(x, do_node, "node", "ol", ""); +} + +static void do_interface(void *); + +static void do_interface_list(list_ty x) { + do_list(x, do_interface, "interface", "ol", ""); +} + +static void do_interface(void *y) { + rcc_interface_ty x = y; + + if (x->kind == rcc_Address_enum) + printf("", x->v.rcc_Address.uid); + else if (x->kind == rcc_Local_enum) + printf("", x->v.rcc_Local.uid); +#define attributes + switch (x->kind) { + static char *typename = "interface"; + caselabel(Export); + yy(Export,p,uid); + break; + caselabel(Import); + yy(Import,p,uid); + break; + caselabel(Global); + yy(Global,p,uid); + yy(Global,seg,seg); + break; + caselabel(Local); + yy(Local,uid,define_uid); + yy(Local,p,symbol); + break; + caselabel(Address); + yy(Address,uid,define_uid); + yy(Address,q,symbol); + yy(Address,p,uid); + yy(Address,n,int); + break; + caselabel(Segment); + yy(Segment,seg,seg); + break; + caselabel(Defaddress); + yy(Defaddress,p,uid); + break; + caselabel(Deflabel); + yy(Deflabel,label,label); + break; + caselabel(Defconst); + yy(Defconst,suffix,suffix); + yy(Defconst,size,int); + yy(Defconst,value,int); + break; + caselabel(Defconstf); + yy(Defconstf,size,int); + yy(Defconstf,value,real); + break; + caselabel(Defstring); + yy(Defstring,s,string); + break; + caselabel(Space); + yy(Space,n,int); + break; + caselabel(Function); + yy(Function,f,uid); + yy(Function,caller,uid_list); + yy(Function,callee,uid_list); + yy(Function,ncalls,int); + yy(Function,codelist,interface_list); + break; + caselabel(Forest); + yy(Forest,nodes,node_list); + break; + case rcc_Blockbeg_enum: printf("Blockbeg : %s", typename); return; + case rcc_Blockend_enum: printf("Blockend : %s", typename); return; + default: assert(0); + } +#undef attributes + printf("\n"); +} + +static void do_program(rcc_program_ty x) { + printf("
    \n"); + xx(x,nuids,int); + xx(x,nlabels,int); + xx(x,items,item_list); + xx(x,interfaces,interface_list); + xx(x,argc,int); + xx(x,argv,string_list); + printf("
\n"); +} + +int main(int argc, char *argv[]) { + int i, version; + float stamp = (assert(strstr(rcsid, ",v")), strtod(strstr(rcsid, ",v")+2, NULL)) +; + char *infile = NULL, *outfile = NULL; + rcc_program_ty pickle; + + for (i = 1; i < argc; i++) + if (*argv[i] != '-' || strcmp(argv[i], "-") == 0) { + if (infile == NULL) + infile = argv[i]; + else if (outfile == NULL) + outfile = argv[i]; + } + if (infile != NULL && strcmp(infile, "-") != 0 + && freopen(infile, "rb", stdin) == NULL) { + fprintf(stderr, "%s: can't read `%s'\n", argv[0], infile); + exit(EXIT_FAILURE); + } + if (infile == NULL || strcmp(infile, "-") == 0) + infile = "Standard Input"; +#if WIN32 + else + _setmode(_fileno(stdin), _O_BINARY); +#endif + if (outfile != NULL && strcmp(outfile, "-") != 0 + && freopen(outfile, "w", stdout) == NULL) { + fprintf(stderr, "%s: can't write `%s'\n", argv[0], outfile); + exit(EXIT_FAILURE); + } + version = read_int(stdin); + assert(version/100 == (int)stamp); + pickle = rcc_read_program(stdin); + printf("%s\n" + "\n" + "\n

%s

\n", infile, infile); + printf("

version = %d.%d

", version/100, version%100); + do_program(pickle); + { + time_t t; + time(&t); + printf("
%s
\n", ctime(&t)); + } + printf("\n"); + return EXIT_SUCCESS; +} diff --git a/quake3/source/lcc/src/alloc.c b/quake3/source/lcc/src/alloc.c new file mode 100644 index 0000000..698da4f --- /dev/null +++ b/quake3/source/lcc/src/alloc.c @@ -0,0 +1,94 @@ +#include "c.h" +struct block { + struct block *next; + char *limit; + char *avail; +}; +union align { + long l; + char *p; + double d; + int (*f)(void); +}; +union header { + struct block b; + union align a; +}; +#ifdef PURIFY +union header *arena[3]; + +void *allocate(unsigned long n, unsigned a) { + union header *new = malloc(sizeof *new + n); + + assert(a < NELEMS(arena)); + if (new == NULL) { + error("insufficient memory\n"); + exit(1); + } + new->b.next = (void *)arena[a]; + arena[a] = new; + return new + 1; +} + +void deallocate(unsigned a) { + union header *p, *q; + + assert(a < NELEMS(arena)); + for (p = arena[a]; p; p = q) { + q = (void *)p->b.next; + free(p); + } + arena[a] = NULL; +} + +void *newarray(unsigned long m, unsigned long n, unsigned a) { + return allocate(m*n, a); +} +#else +static struct block + first[] = { { NULL }, { NULL }, { NULL } }, + *arena[] = { &first[0], &first[1], &first[2] }; +static struct block *freeblocks; + +void *allocate(unsigned long n, unsigned a) { + struct block *ap; + + assert(a < NELEMS(arena)); + assert(n > 0); + ap = arena[a]; + n = roundup(n, sizeof (union align)); + while (n > ap->limit - ap->avail) { + if ((ap->next = freeblocks) != NULL) { + freeblocks = freeblocks->next; + ap = ap->next; + } else + { + unsigned m = sizeof (union header) + n + roundup(10*1024, sizeof (union align)); + ap->next = malloc(m); + ap = ap->next; + if (ap == NULL) { + error("insufficient memory\n"); + exit(1); + } + ap->limit = (char *)ap + m; + } + ap->avail = (char *)((union header *)ap + 1); + ap->next = NULL; + arena[a] = ap; + + } + ap->avail += n; + return ap->avail - n; +} + +void *newarray(unsigned long m, unsigned long n, unsigned a) { + return allocate(m*n, a); +} +void deallocate(unsigned a) { + assert(a < NELEMS(arena)); + arena[a]->next = freeblocks; + freeblocks = first[a].next; + first[a].next = NULL; + arena[a] = &first[a]; +} +#endif diff --git a/quake3/source/lcc/src/alpha.md b/quake3/source/lcc/src/alpha.md new file mode 100644 index 0000000..6b4ec6c --- /dev/null +++ b/quake3/source/lcc/src/alpha.md @@ -0,0 +1,1192 @@ +%{ +#define INTTMP ((0xff<<1)|(1<<22)|(1<<25)|(1<<27)) +#define INTVAR (0x3f<<9) +#define FLTTMP ((0x3f<<10)|(0x1ff<<22)) +#define FLTVAR (0xff<<2) + +#define INTRET 0x00000001 +#define FLTRET 0x00000003 + +#define readsreg(p) \ + (generic((p)->op)==INDIR && (p)->kids[0]->op==VREG+P) +#define setsrc(d) ((d) && (d)->x.regnode && \ + (d)->x.regnode->set == src->x.regnode->set && \ + (d)->x.regnode->mask&src->x.regnode->mask) + +#define relink(a, b) ((b)->x.prev = (a), (a)->x.next = (b)) + +#include "c.h" +#define NODEPTR_TYPE Node +#define OP_LABEL(p) ((p)->op) +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define STATE_LABEL(p) ((p)->x.state) +static void address(Symbol, Symbol, long); +static void blkfetch(int, int, int, int); +static void blkloop(int, int, int, int, int, int[]); +static void blkstore(int, int, int, int); +static void defaddress(Symbol); +static void defconst(int, int, Value); +static void defstring(int, char *); +static void defsymbol(Symbol); +static void doarg(Node); +static void emit2(Node); +static void export(Symbol); +static void clobber(Node); +static void function(Symbol, Symbol [], Symbol [], int); +static void global(Symbol); +static void import(Symbol); +static void local(Symbol); +static void progbeg(int, char **); +static void progend(void); +static void segment(int); +static void space(int); +static void target(Node); +static Symbol ireg[32], freg[32]; +static Symbol iregw, fregw; + +static int tmpregs[] = {4, 2, 3}; +static Symbol blkreg; + +static int cseg; + +static char *currentfile; + +%} +%start stmt +%term CNSTF4=4113 +%term CNSTF8=8209 +%term CNSTF16=16401 +%term CNSTI1=1045 +%term CNSTI2=2069 +%term CNSTI4=4117 +%term CNSTI8=8213 +%term CNSTP4=4119 +%term CNSTP8=8215 +%term CNSTU1=1046 +%term CNSTU2=2070 +%term CNSTU4=4118 +%term CNSTU8=8214 + +%term ARGB=41 +%term ARGF4=4129 +%term ARGF8=8225 +%term ARGF16=16417 +%term ARGI4=4133 +%term ARGI8=8229 +%term ARGP4=4135 +%term ARGP8=8231 +%term ARGU4=4134 +%term ARGU8=8230 + +%term ASGNB=57 +%term ASGNF4=4145 +%term ASGNF8=8241 +%term ASGNF16=16433 +%term ASGNI1=1077 +%term ASGNI2=2101 +%term ASGNI4=4149 +%term ASGNI8=8245 +%term ASGNP4=4151 +%term ASGNP8=8247 +%term ASGNU1=1078 +%term ASGNU2=2102 +%term ASGNU4=4150 +%term ASGNU8=8246 + +%term INDIRB=73 +%term INDIRF4=4161 +%term INDIRF8=8257 +%term INDIRF16=16449 +%term INDIRI1=1093 +%term INDIRI2=2117 +%term INDIRI4=4165 +%term INDIRI8=8261 +%term INDIRP4=4167 +%term INDIRP8=8263 +%term INDIRU1=1094 +%term INDIRU2=2118 +%term INDIRU4=4166 +%term INDIRU8=8262 + +%term CVFF4=4209 +%term CVFF8=8305 +%term CVFF16=16497 +%term CVFI4=4213 +%term CVFI8=8309 + +%term CVIF4=4225 +%term CVIF8=8321 +%term CVIF16=16513 +%term CVII1=1157 +%term CVII2=2181 +%term CVII4=4229 +%term CVII8=8325 +%term CVIU1=1158 +%term CVIU2=2182 +%term CVIU4=4230 +%term CVIU8=8326 + +%term CVPP4=4247 +%term CVPP8=8343 +%term CVPP16=16535 +%term CVPU4=4246 +%term CVPU8=8342 + +%term CVUI1=1205 +%term CVUI2=2229 +%term CVUI4=4277 +%term CVUI8=8373 +%term CVUP4=4279 +%term CVUP8=8375 +%term CVUP16=16567 +%term CVUU1=1206 +%term CVUU2=2230 +%term CVUU4=4278 +%term CVUU8=8374 + +%term NEGF4=4289 +%term NEGF8=8385 +%term NEGF16=16577 +%term NEGI4=4293 +%term NEGI8=8389 + +%term CALLB=217 +%term CALLF4=4305 +%term CALLF8=8401 +%term CALLF16=16593 +%term CALLI4=4309 +%term CALLI8=8405 +%term CALLP4=4311 +%term CALLP8=8407 +%term CALLU4=4310 +%term CALLU8=8406 +%term CALLV=216 + +%term RETF4=4337 +%term RETF8=8433 +%term RETF16=16625 +%term RETI4=4341 +%term RETI8=8437 +%term RETP4=4343 +%term RETP8=8439 +%term RETU4=4342 +%term RETU8=8438 +%term RETV=248 + +%term ADDRGP4=4359 +%term ADDRGP8=8455 + +%term ADDRFP4=4375 +%term ADDRFP8=8471 + +%term ADDRLP4=4391 +%term ADDRLP8=8487 + +%term ADDF4=4401 +%term ADDF8=8497 +%term ADDF16=16689 +%term ADDI4=4405 +%term ADDI8=8501 +%term ADDP4=4407 +%term ADDP8=8503 +%term ADDU4=4406 +%term ADDU8=8502 + +%term SUBF4=4417 +%term SUBF8=8513 +%term SUBF16=16705 +%term SUBI4=4421 +%term SUBI8=8517 +%term SUBP4=4423 +%term SUBP8=8519 +%term SUBU4=4422 +%term SUBU8=8518 + +%term LSHI4=4437 +%term LSHI8=8533 +%term LSHU4=4438 +%term LSHU8=8534 + +%term MODI4=4453 +%term MODI8=8549 +%term MODU4=4454 +%term MODU8=8550 + +%term RSHI4=4469 +%term RSHI8=8565 +%term RSHU4=4470 +%term RSHU8=8566 + +%term BANDI4=4485 +%term BANDI8=8581 +%term BANDU4=4486 +%term BANDU8=8582 + +%term BCOMI4=4501 +%term BCOMI8=8597 +%term BCOMU4=4502 +%term BCOMU8=8598 + +%term BORI4=4517 +%term BORI8=8613 +%term BORU4=4518 +%term BORU8=8614 + +%term BXORI4=4533 +%term BXORI8=8629 +%term BXORU4=4534 +%term BXORU8=8630 + +%term DIVF4=4545 +%term DIVF8=8641 +%term DIVF16=16833 +%term DIVI4=4549 +%term DIVI8=8645 +%term DIVU4=4550 +%term DIVU8=8646 + +%term MULF4=4561 +%term MULF8=8657 +%term MULF16=16849 +%term MULI4=4565 +%term MULI8=8661 +%term MULU4=4566 +%term MULU8=8662 + +%term EQF4=4577 +%term EQF8=8673 +%term EQF16=16865 +%term EQI4=4581 +%term EQI8=8677 +%term EQU4=4582 +%term EQU8=8678 + +%term GEF4=4593 +%term GEF8=8689 +%term GEI4=4597 +%term GEI8=8693 +%term GEI16=16885 +%term GEU4=4598 +%term GEU8=8694 + +%term GTF4=4609 +%term GTF8=8705 +%term GTF16=16897 +%term GTI4=4613 +%term GTI8=8709 +%term GTU4=4614 +%term GTU8=8710 + +%term LEF4=4625 +%term LEF8=8721 +%term LEF16=16913 +%term LEI4=4629 +%term LEI8=8725 +%term LEU4=4630 +%term LEU8=8726 + +%term LTF4=4641 +%term LTF8=8737 +%term LTF16=16929 +%term LTI4=4645 +%term LTI8=8741 +%term LTU4=4646 +%term LTU8=8742 + +%term NEF4=4657 +%term NEF8=8753 +%term NEF16=16945 +%term NEI4=4661 +%term NEI8=8757 +%term NEU4=4662 +%term NEU8=8758 + +%term JUMPV=584 + +%term LABELV=600 + +%term LOADB=233 +%term LOADF4=4321 +%term LOADF8=8417 +%term LOADF16=16609 +%term LOADI1=1253 +%term LOADI2=2277 +%term LOADI4=4325 +%term LOADI8=8421 +%term LOADP4=4327 +%term LOADP8=8423 +%term LOADU1=1254 +%term LOADU2=2278 +%term LOADU4=4326 +%term LOADU8=8422 + +%term VREGP=711 +%% +reg: INDIRI1(VREGP) "# read register\n" +reg: INDIRU1(VREGP) "# read register\n" + +reg: INDIRI2(VREGP) "# read register\n" +reg: INDIRU2(VREGP) "# read register\n" + +reg: INDIRF4(VREGP) "# read register\n" +reg: INDIRI4(VREGP) "# read register\n" +reg: INDIRP4(VREGP) "# read register\n" +reg: INDIRU4(VREGP) "# read register\n" + +reg: INDIRF8(VREGP) "# read register\n" +reg: INDIRI8(VREGP) "# read register\n" +reg: INDIRP8(VREGP) "# read register\n" +reg: INDIRU8(VREGP) "# read register\n" + +stmt: ASGNI1(VREGP,reg) "# write register\n" +stmt: ASGNU1(VREGP,reg) "# write register\n" + +stmt: ASGNI2(VREGP,reg) "# write register\n" +stmt: ASGNU2(VREGP,reg) "# write register\n" + +stmt: ASGNF4(VREGP,reg) "# write register\n" +stmt: ASGNI4(VREGP,reg) "# write register\n" +stmt: ASGNP4(VREGP,reg) "# write register\n" +stmt: ASGNU4(VREGP,reg) "# write register\n" + +stmt: ASGNF8(VREGP,reg) "# write register\n" +stmt: ASGNI8(VREGP,reg) "# write register\n" +stmt: ASGNP8(VREGP,reg) "# write register\n" +stmt: ASGNU8(VREGP,reg) "# write register\n" +con: CNSTI1 "%a" +con: CNSTU1 "%a" + +con: CNSTI2 "%a" +con: CNSTU2 "%a" + +con: CNSTI4 "%a" +con: CNSTU4 "%a" +con: CNSTP4 "%a" + +con: CNSTI8 "%a" +con: CNSTU8 "%a" +con: CNSTP8 "%a" +stmt: reg "" +acon: con "%0" +acon: ADDRGP8 "%a" + +addr: ADDI4(reg,acon) "%1($%0)" +addr: ADDI8(reg,acon) "%1($%0)" +addr: ADDU8(reg,acon) "%1($%0)" +addr: ADDP8(reg,acon) "%1($%0)" + +addr: acon "%0" +addr: reg "($%0)" + +addr: ADDRFP8 "%a+%F($sp)" +addr: ADDRLP8 "%a+%F($sp)" + +reg: addr "lda $%c,%0\n" 1 + +reg: CNSTI1 "# reg\n" range(a, 0, 0) +reg: CNSTI2 "# reg\n" range(a, 0, 0) +reg: CNSTI4 "# reg\n" range(a, 0, 0) +reg: CNSTI8 "# reg\n" range(a, 0, 0) +reg: CNSTU1 "# reg\n" range(a, 0, 0) +reg: CNSTU2 "# reg\n" range(a, 0, 0) +reg: CNSTU4 "# reg\n" range(a, 0, 0) +reg: CNSTU8 "# reg\n" range(a, 0, 0) +reg: CNSTP8 "# reg\n" range(a, 0, 0) + +stmt: ASGNI1(addr,reg) "stb $%1,%0\n" 1 +stmt: ASGNU1(addr,reg) "stb $%1,%0\n" 1 +stmt: ASGNI2(addr,reg) "stw $%1,%0\n" 1 +stmt: ASGNU2(addr,reg) "stw $%1,%0\n" 1 + +stmt: ASGNI4(addr,reg) "stl $%1,%0\n" 1 +stmt: ASGNU4(addr,reg) "stl $%1,%0\n" 1 +stmt: ASGNI8(addr,reg) "stq $%1,%0\n" 1 +stmt: ASGNU8(addr,reg) "stq $%1,%0\n" 1 +stmt: ASGNP8(addr,reg) "stq $%1,%0\n" 1 + +reg: INDIRI1(reg) "ldb $%c,($%0)\n" 1 +reg: INDIRI2(reg) "ldw $%c,($%0)\n" 1 +reg: INDIRI4(addr) "ldl $%c,%0\n" 1 +reg: INDIRI8(addr) "ldq $%c,%0\n" 1 +reg: INDIRP8(addr) "ldq $%c,%0\n" 1 +reg: INDIRU1(reg) "ldbu $%c,($%0)\n" 1 +reg: INDIRU2(reg) "ldwu $%c,($%0)\n" 1 +reg: INDIRU4(addr) "ldl $%c,%0\nzap $%c,240,$%c\n" 2 +reg: INDIRU8(addr) "ldq $%c,%0\n" 1 + +reg: CVII4(INDIRI1(reg)) "ldb $%c,($%0)\n" 1 +reg: CVII8(INDIRI1(reg)) "ldb $%c,($%0)\n" 1 +reg: CVII4(INDIRI2(reg)) "ldw $%c,($%0)\n" 1 +reg: CVII8(INDIRI2(reg)) "ldw $%c,($%0)\n" 1 +reg: CVII8(INDIRI4(addr)) "ldl $%c,%0\n" 1 + +reg: CVUU4(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1 +reg: CVUU8(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1 +reg: CVUU4(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1 +reg: CVUU8(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1 +reg: CVUU8(INDIRU4(addr)) "ldl $%c,%0\nzap $%c,240,$%c\n" 2 + +reg: CVUI4(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1 +reg: CVUI8(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1 +reg: CVUI4(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1 +reg: CVUI8(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1 +reg: CVUI8(INDIRU4(addr)) "ldl $%c,%0\nzap $%c,240,$%c\n" 2 + +reg: CVIU8(reg) "mov $%0,$%c\n" move(a) + +reg: INDIRF4(addr) "lds $f%c,%0\n" 1 +reg: INDIRF8(addr) "ldt $f%c,%0\n" 1 +stmt: ASGNF4(addr,reg) "sts $f%1,%0\n" 1 +stmt: ASGNF8(addr,reg) "stt $f%1,%0\n" 1 + +reg: MULI4(reg,rc) "mull $%0,%1,$%c\n" 1 +reg: MULI8(reg,rc) "mulq $%0,%1,$%c\n" 1 +reg: MULU4(reg,rc) "mull $%0,%1,$%c\nzap $%c,240,$%c\n" 2 +reg: MULU8(reg,rc) "mulq $%0,%1,$%c\n" 1 + +reg: DIVI4(reg,rc) "divl $%0,%1,$%c\n" 1 +reg: DIVI8(reg,rc) "divq $%0,%1,$%c\n" 1 +reg: DIVU4(reg,rc) "divlu $%0,%1,$%c\n" 1 +reg: DIVU8(reg,rc) "divqu $%0,%1,$%c\n" 1 +reg: MODI4(reg,rc) "reml $%0,%1,$%c\n" 1 +reg: MODI8(reg,rc) "remq $%0,%1,$%c\n" 1 +reg: MODU4(reg,rc) "remlu $%0,%1,$%c\n" 1 +reg: MODU8(reg,rc) "remqu $%0,%1,$%c\n" 1 + +rc: con "%0" +rc: reg "$%0" + +reg: ADDI4(reg,rc) "addl $%0,%1,$%c\n" 1 +reg: ADDI8(reg,rc) "addq $%0,%1,$%c\n" 1 +reg: ADDP8(reg,rc) "addq $%0,%1,$%c\n" 1 +reg: ADDU4(reg,rc) "addl $%0,%1,$%c\nzap $%c,240,$%c\n" 2 +reg: ADDU8(reg,rc) "addq $%0,%1,$%c\n" 1 +reg: SUBI4(reg,rc) "subl $%0,%1,$%c\n" 1 +reg: SUBI8(reg,rc) "subq $%0,%1,$%c\n" 1 +reg: SUBP8(reg,rc) "subq $%0,%1,$%c\n" 1 +reg: SUBU4(reg,rc) "subl $%0,%1,$%c\nzap $%c,240,$%c\n" 2 +reg: SUBU8(reg,rc) "subq $%0,%1,$%c\n" 1 + +reg: BANDI4(reg,rc) "and $%0,%1,$%c\naddl $%c,0,$%c\n" 2 +reg: BANDI8(reg,rc) "and $%0,%1,$%c\n" 1 +reg: BANDU4(reg,rc) "and $%0,%1,$%c\n" 1 +reg: BANDU8(reg,rc) "and $%0,%1,$%c\n" 1 +reg: BORI4(reg,rc) "or $%0,%1,$%c\naddl $%c,0,$%c\n" 2 +reg: BORI8(reg,rc) "or $%0,%1,$%c\n" 1 +reg: BORU4(reg,rc) "or $%0,%1,$%c\n" 1 +reg: BORU8(reg,rc) "or $%0,%1,$%c\n" 1 +reg: BXORI4(reg,rc) "xor $%0,%1,$%c\naddl $%c,0,$%c\n" 2 +reg: BXORI8(reg,rc) "xor $%0,%1,$%c\n" 1 +reg: BXORU4(reg,rc) "xor $%0,%1,$%c\n" 1 +reg: BXORU8(reg,rc) "xor $%0,%1,$%c\n" 1 + +rc6: CNSTI4 "%a" range(a,0,63) +rc6: CNSTI8 "%a" range(a,0,63) +rc6: reg "$%0" + +reg: LSHI4(reg,rc6) "sll $%0,%1,$%c\naddl $%c,0,$%c\n" 2 +reg: LSHI8(reg,rc6) "sll $%0,%1,$%c\n" 1 +reg: LSHU4(reg,rc6) "sll $%0,%1,$%c\nzap $%c,240,$%c\n" 2 +reg: LSHU8(reg,rc6) "sll $%0,%1,$%c\n" 1 +reg: RSHI4(reg,rc6) "sra $%0,%1,$%c\naddl $%c,0,$%c\n" 2 +reg: RSHI8(reg,rc6) "sra $%0,%1,$%c\n" 1 +reg: RSHU4(reg,rc6) "srl $%0,%1,$%c\n" 1 +reg: RSHU8(reg,rc6) "srl $%0,%1,$%c\n" 1 + +reg: BCOMI4(reg) "not $%0,$%c\naddl $%c,0,$%c\n" 2 +reg: BCOMU4(reg) "not $%0,$%c\nzap $%c,240,$%c\n" 2 +reg: BCOMI8(reg) "not $%0,$%c\n" 1 +reg: BCOMU8(reg) "not $%0,$%c\n" 1 +reg: NEGI4(reg) "negl $%0,$%c\n" 1 +reg: NEGI8(reg) "negq $%0,$%c\n" 1 +reg: LOADI1(reg) "mov $%0,$%c\n" move(a) +reg: LOADI2(reg) "mov $%0,$%c\n" move(a) +reg: LOADI4(reg) "mov $%0,$%c\n" move(a) +reg: LOADI8(reg) "mov $%0,$%c\n" move(a) +reg: LOADP8(reg) "mov $%0,$%c\n" move(a) +reg: LOADU1(reg) "mov $%0,$%c\n" move(a) +reg: LOADU2(reg) "mov $%0,$%c\n" move(a) +reg: LOADU4(reg) "mov $%0,$%c\n" move(a) +reg: LOADU8(reg) "mov $%0,$%c\n" move(a) + +reg: ADDF4(reg,reg) "adds $f%0,$f%1,$f%c\n" 1 +reg: ADDF8(reg,reg) "addt $f%0,$f%1,$f%c\n" 1 +reg: DIVF4(reg,reg) "divs $f%0,$f%1,$f%c\n" 1 +reg: DIVF8(reg,reg) "divt $f%0,$f%1,$f%c\n" 1 +reg: MULF4(reg,reg) "muls $f%0,$f%1,$f%c\n" 1 +reg: MULF8(reg,reg) "mult $f%0,$f%1,$f%c\n" 1 +reg: SUBF4(reg,reg) "subs $f%0,$f%1,$f%c\n" 1 +reg: SUBF8(reg,reg) "subt $f%0,$f%1,$f%c\n" 1 +reg: LOADF4(reg) "fmov $f%0,$f%c\n" move(a) +reg: LOADF8(reg) "fmov $f%0,$f%c\n" move(a) +reg: NEGF4(reg) "negs $f%0,$f%c\n" 1 +reg: NEGF8(reg) "negt $f%0,$f%c\n" 1 +reg: CVII4(reg) "sll $%0,8*(8-%a),$%c\nsra $%c,8*(8-%a),$%c\n" 2 +reg: CVII8(reg) "sll $%0,8*(8-%a),$%c\nsra $%c,8*(8-%a),$%c\n" 2 +reg: CVUI4(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1 +reg: CVUI8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1 +reg: CVUU4(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1 +reg: CVUU8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1 + +reg: CVUP8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1 + +reg: CVFF4(reg) "cvtts $f%0,$f%c\n" 1 +reg: CVFF8(reg) "cvtst $f%0,$f%c\n" 1 + +reg: CVIF4(reg) "stq $%0,-56+%F($sp)\nldt $%f%c,-56+%F($sp)\ncvtqs $f%c,$f%c\n" 3 +reg: CVIF8(reg) "stq $%0,-56+%F($sp)\nldt $%f%c,-56+%F($sp)\ncvtqt $f%c,$f%c\n" 3 +reg: CVIF4(INDIRI4(addr)) "lds $f%c,%0\ncvtlq $f%c,$f%c\ncvtqs $f%c,$f%c\n" 3 +reg: CVIF4(INDIRI8(addr)) "ldt $f%c,%0\ncvtqs $f%c,$f%c\n" 2 +reg: CVIF8(INDIRI4(addr)) "lds $f%c,%0\ncvtlq $f%c,$f%c\ncvtqt $f%c,$f%c\n" 3 +reg: CVIF8(INDIRI8(addr)) "ldt $f%c,%0\ncvtqt $f%c,$f%c\n" 2 + +reg: CVFI4(reg) "cvttqc $f%0,$f1\ncvtql $f1,$f1\nsts $f1,-56+%F($sp)\nldl $%c,-56+%F($sp)\n" 4 +reg: CVFI8(reg) "cvttqc $f%0,$f1\nstt $f1,-56+%F($sp)\nldq $%c,-56+%F($sp)\n" 3 + +stmt: LABELV "%a:\n" + +stmt: JUMPV(acon) "br %0\n" 1 +stmt: JUMPV(reg) "jmp ($%0)\n" 1 + +stmt: EQI4(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2 +stmt: EQU4(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2 +stmt: EQI8(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2 +stmt: EQU8(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2 +stmt: NEI4(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: NEU4(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: NEI8(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: NEU8(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: GEI4(reg,rc6) "cmplt $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: GEI8(reg,rc6) "cmplt $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: GEU4(reg,rc6) "cmpult $%0,%1,$23\nbeq $23,%a\n" 1 +stmt: GEU8(reg,rc6) "cmpult $%0,%1,$23\nbeq $23,%a\n" 1 +stmt: GTI4(reg,rc6) "cmple $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: GTI8(reg,rc6) "cmple $%0,%1,$23\nbeq $23,%a\n" 2 +stmt: GTU4(reg,rc6) "cmpule $%0,%1,$23\nbeq $23,%a\n" 1 +stmt: GTU8(reg,rc6) "cmpule $%0,%1,$23\nbeq $23,%a\n" 1 +stmt: LEI4(reg,rc6) "cmple $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LEI8(reg,rc6) "cmple $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LEU4(reg,rc6) "cmpule $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LEU8(reg,rc6) "cmpule $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LTI4(reg,rc6) "cmplt $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LTI8(reg,rc6) "cmplt $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LTU4(reg,rc6) "cmpult $%0,%1,$23\nbne $23,%a\n" 2 +stmt: LTU8(reg,rc6) "cmpult $%0,%1,$23\nbne $23,%a\n" 2 + +stmt: EQF4(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbne $f1,%a\n" 2 +stmt: EQF8(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbne $f1,%a\n" 2 +stmt: LEF4(reg,reg) "cmptle $f%0,$f%1,$f1\nfbne $f1,%a\n" 2 +stmt: LEF8(reg,reg) "cmptle $f%0,$f%1,$f1\nfbne $f1,%a\n" 2 +stmt: LTF4(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbne $f1,%a\n" 2 +stmt: LTF8(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbne $f1,%a\n" 2 + +stmt: NEF4(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2 +stmt: NEF8(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2 +stmt: GEF4(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2 +stmt: GEF8(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2 +stmt: GTF4(reg,reg) "cmptle $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2 +stmt: GTF8(reg,reg) "cmptle $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2 + +ar: ADDRGP8 "%a" +ar: reg "($%0)" + +reg: CALLF4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +reg: CALLF8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +reg: CALLI4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +reg: CALLI8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +reg: CALLP8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +reg: CALLU4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +reg: CALLU8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 +stmt: CALLV(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2 + +stmt: RETF4(reg) "# ret\n" 1 +stmt: RETF8(reg) "# ret\n" 1 +stmt: RETI4(reg) "# ret\n" 1 +stmt: RETU4(reg) "# ret\n" 1 +stmt: RETI8(reg) "# ret\n" 1 +stmt: RETU8(reg) "# ret\n" 1 +stmt: RETP8(reg) "# ret\n" 1 +stmt: RETV(reg) "# ret\n" 1 + +stmt: ARGF4(reg) "# arg\n" 1 +stmt: ARGF8(reg) "# arg\n" 1 +stmt: ARGI4(reg) "# arg\n" 1 +stmt: ARGI8(reg) "# arg\n" 1 +stmt: ARGP8(reg) "# arg\n" 1 +stmt: ARGU4(reg) "# arg\n" 1 +stmt: ARGU8(reg) "# arg\n" 1 + +stmt: ARGB(INDIRB(reg)) "# argb %0\n" 1 +stmt: ASGNB(reg,INDIRB(reg)) "# asgnb %0 %1\n" 1 + +%% +static void progend(void){} + +static void progbeg(int argc, char *argv[]) { + int i; + + { + union { + char c; + int i; + } u; + u.i = 0; + u.c = 1; + swap = ((int)(u.i == 1)) != IR->little_endian; + } + parseflags(argc, argv); + + for (i = 0; i < 32; i++) + freg[i] = mkreg("%d", i, 1, FREG); + for (i = 0; i < 32; i++) + ireg[i] = mkreg("%d", i, 1, IREG); + ireg[29]->x.name = "gp"; + ireg[30]->x.name = "sp"; + fregw = mkwildcard(freg); + iregw = mkwildcard(ireg); + + tmask[IREG] = INTTMP; tmask[FREG] = FLTTMP; + vmask[IREG] = INTVAR; vmask[FREG] = FLTVAR; + + blkreg = mkreg("1", 1, 0xf, IREG); + +} + +static Symbol rmap(int opk) { + switch (optype(opk)) { + case I: case U: case P: case B: + return iregw; + case F: + return fregw; + default: + return 0; + } +} + +static Symbol argreg(int offset, int ty) { + if (offset >= 48) + return NULL; + else if (ty == F) + return freg[(offset/8) + 16]; + else + return ireg[(offset/8) + 16]; +} + +static void target(Node p) { + assert(p); + switch (specific(p->op)) { + case CNST+I: case CNST+U: case CNST+P: + if (range(p, 0, 0) == 0) { + setreg(p, ireg[31]); + p->x.registered = 1; + } + break; + case CNST+F: + if (p->syms[0]->u.c.v.d == 0) { + setreg(p, freg[31]); + p->x.registered = 1; + } + break; + + case CALL+V: + rtarget(p, 0, ireg[27]); + break; + case CALL+F: + rtarget(p, 0, ireg[27]); + setreg(p, freg[0]); + break; + case CALL+I: case CALL+P: case CALL+U: + rtarget(p, 0, ireg[27]); + setreg(p, ireg[0]); + break; + case RET+F: + rtarget(p, 0, freg[0]); + break; + case RET+I: case RET+U: case RET+P: + rtarget(p, 0, ireg[0]); + break; + + case ARG+F: case ARG+I: case ARG+P: case ARG+U: { + Symbol q = argreg(p->syms[2]->u.c.v.i, optype(p->op)); + if (q) + rtarget(p, 0, q); + break; + } + + + case ASGN+B: rtarget(p->kids[1], 0, blkreg); break; + case ARG+B: rtarget(p->kids[0], 0, blkreg); break; + + } +} + +static void clobber(Node p) { + assert(p); + switch (specific(p->op)) { + case ASGN+I: case ASGN+U: + if (opsize(p->op) <= 2) + spill(1<<24, IREG, p); + break; + + case DIV+I: case DIV+U: case MOD+I: case MOD+U: + spill(((1<<27)|(3<<24))&~p->syms[RX]->x.regnode->mask, IREG, p); + break; + + case CALL+F: + spill(INTTMP | INTRET, IREG, p); + spill(FLTTMP, FREG, p); + break; + case CALL+I: case CALL+P: case CALL+U: + spill(INTTMP, IREG, p); + spill(FLTTMP | FLTRET, FREG, p); + break; + case CALL+V: + spill(INTTMP | INTRET, IREG, p); + spill(FLTTMP | FLTRET, FREG, p); + break; + + } +} + +static void emit2(Node p) { + int dst, n, src, sz, ty; + static int ty0; + Symbol q; + + switch (specific(p->op)) { + case ARG+F: case ARG+I: case ARG+P: case ARG+U: + ty = optype(p->op); + sz = opsize(p->op); + q = argreg(p->syms[2]->u.c.v.i, ty); + src = getregnum(p->x.kids[0]); + if (q) + break; + else if (ty == F && sz == 4) + print("sts $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); + else if (ty == F && sz == 8) + print("stt $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); + else if (sz == 4) + print("stq $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); + else if (sz == 8) + print("stq $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48); + else + assert(0); + break; + + case ASGN+B: + dalign = salign = p->syms[1]->u.c.v.i; + blkcopy(getregnum(p->x.kids[0]), 0, + getregnum(p->x.kids[1]), 0, + p->syms[0]->u.c.v.i, tmpregs); + break; + + + case ARG+B: { + int doff = p->syms[2]->u.c.v.i, soff = 0, sreg = getregnum(p->x.kids[0]); + dalign = 8; + salign = p->syms[1]->u.c.v.i; + n = p->syms[0]->u.c.v.i; + for ( ; doff <= 40 && n > 0; doff += 8) { + print("uldq $%d,%d($%d)\n", (doff/8)+16, soff, sreg); + soff += 8; + n -= 8; + } + if (n > 0) + blkcopy(30, doff - 48, sreg, soff, n, tmpregs); + break; + } + + } +} + +static void doarg(Node p) { + p->syms[2] = intconst(mkactual(8, roundup(p->syms[0]->u.c.v.i,8))); +} + +static void local(Symbol p) { + if (askregvar(p, rmap(ttob(p->type))) == 0) + mkauto(p); +} + +static int bitcount(unsigned mask) { + unsigned i, n = 0; + + for (i = 1; i; i <<= 1) + if (mask&i) + n++; + return n; +} + +static void function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { + int i, sizeargs, saved, sizefsave, sizeisave, varargs; + Symbol r, argregs[6]; + + usedmask[0] = usedmask[1] = 0; + freemask[0] = freemask[1] = ~(unsigned)0; + maxargoffset = offset = maxoffset = 0; + + for (i = 0; callee[i]; i++) + ; + varargs = variadic(f->type) + || i > 0 && strcmp(callee[i-1]->name, "va_alist") == 0; + if (varargs) + sizeargs = 2*48; + else + sizeargs = 48; + + for (i = 0; callee[i]; i++) { + Symbol p = callee[i]; + Symbol q = caller[i]; + assert(q); + if (isfloat(p->type) && varargs) { + p->x.offset = q->x.offset = offset - 2*48; + p->x.name = q->x.name = stringd(offset - 2*48); + } else { + p->x.offset = q->x.offset = offset - 48; + p->x.name = q->x.name = stringd(offset - 48); + } + offset = roundup(offset, q->type->align); + r = argreg(offset, optype(ttob(q->type))); + if (i < 6) + argregs[i] = r; + offset = roundup(offset + q->type->size, 8); + if (varargs) + p->sclass = AUTO; + else if (r && ncalls == 0 && !isstruct(q->type) && !p->addressed +) { + p->sclass = q->sclass = REGISTER; + askregvar(p, r); + assert(p->x.regnode && p->x.regnode->vbl == p); + q->x = p->x; + q->type = p->type; + } else if (askregvar(p, rmap(ttob(p->type))) + && r != NULL /* + && (isint(p->type) || p->type == q->type) */ +) { + assert(q->sclass != REGISTER); + p->sclass = q->sclass = REGISTER; + q->type = p->type; + } + + } + assert(!caller[i]); + + offset = sizeargs + 8; + gencode(caller, callee); + usedmask[IREG] &= ~(INTTMP|(0x3f<<16)|INTRET); + usedmask[FREG] &= ~(FLTTMP|(0x3f<<16)|FLTRET); + if (ncalls || usedmask[IREG] || usedmask[FREG]) + usedmask[IREG] |= 1<<26; + sizefsave = 8*bitcount(usedmask[FREG]); + sizeisave = 8*bitcount(usedmask[IREG]); + if (maxargoffset > 48) + maxargoffset -= 48; + else + maxargoffset = 0; + if (maxoffset < sizeargs) + maxoffset = sizeargs; + framesize = roundup(maxargoffset + sizefsave + sizeisave + maxoffset, 16); + segment(CODE); + print(".ent %s\n", f->x.name); + print("%s:\n", f->x.name); + print("ldgp $gp,0($27)\n"); + i = maxargoffset + sizefsave - framesize; + if (framesize > 0) + print("lda $sp,%d($sp)\n", -framesize); + if (usedmask[FREG]) + print(".fmask 0x%x,%d\n", usedmask[FREG], i - 8); + if (usedmask[IREG]) + print(".mask 0x%x,%d\n", usedmask[IREG], i + sizeisave - 8); + print(".frame $sp,%d,$26,%d\n", framesize, sizeargs); + + saved = maxargoffset; + for (i = 2; i <= 9; i++) + if (usedmask[FREG]&(1<x.regnode != callee[i]->x.regnode) { + Symbol out = callee[i]; + Symbol in = caller[i]; + int rn = r->x.regnode->number; + int rs = r->x.regnode->set; + int tyin = ttob(in->type); + + assert(out && in && r && r->x.regnode); + assert(out->sclass != REGISTER || out->x.regnode); + if (out->sclass == REGISTER) { + if (rs == FREG) + print("fmov $f%d,$f%d\n", rn, out->x.regnode->number); + else + print("mov $%d,$%d\n", rn, out->x.regnode->number); + + } else { + int off = in->x.offset + framesize; + if (rs == FREG && tyin == F+sizeop(8)) + print("stt $f%d,%d($sp)\n", rn, off); + else if (rs == FREG && tyin == F+sizeop(4)) + print("sts $f%d,%d($sp)\n", rn, off); + else { + int i, n = (in->type->size + 7)/8; + for (i = rn; i < rn+n && i <= 21; i++) + print("stq $%d,%d($sp)\n", i, off + (i-rn)*8); + } + + } + + } + } + if (varargs && callee[i-1]) { + i = callee[i-1]->x.offset + roundup(callee[i-1]->type->size, 8); + for (i = (48+i)/8; i < 6; i++) { + print("stq $%d,%d($sp)\n", i + 16, framesize - 48 + 8*i); + print("stt $f%d,%d($sp)\n", i + 16, framesize - 2*48 + 8*i); + } + } + print(".prologue 1\n"); + + emitcode(); + saved = maxargoffset; + for (i = 2; i <= 9; i++) + if (usedmask[FREG]&(1< 0) + print("lda $sp,%d($sp)\n", framesize); + print("ret\n"); + print(".end %s\n", f->x.name); + +} + +static void defconst(int suffix, int size, Value v) { + if (suffix == F && size == 4) { + float f = v.d; + print(".long 0x%x\n", *(unsigned *)&f); + } else if (suffix == F && size == 8) { + double d = v.d; + unsigned *p = (unsigned *)&d; + print(".long 0x%x\n.long 0x%x\n", p[swap], p[!swap]); + } else if (suffix == P) + print(".quad 0x%X\n", v.p); + else if (size == 1) + print(".byte 0x%x\n", suffix == I ? v.i : v.u); + else if (size == 2) + print(".word 0x%x\n", suffix == I ? v.i&0xFFFF : v.u&0xFFFF); + else if (size == 4) + print(".long 0x%x\n", suffix == I ? v.i : v.u); + else if (size == 8) + print(".quad 0x%X\n", suffix == I ? v.i : v.u); + +} + +static void defaddress(Symbol p) { + print(".quad %s\n", p->x.name); +} + +static void defstring(int n, char *str) { + char *s; + + for (s = str; s < str + n; s++) + print(".byte %d\n", (*s)&0377); +} + +static void export(Symbol p) { + print(".globl %s\n", p->x.name); +} + +static void import(Symbol p) { + if (!isfunc(p->type)) + print(".extern %s %d\n", p->name, p->type->size); +} + +static void defsymbol(Symbol p) { + if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf("L.%d", genlabel(1)); + else if (p->generated) + p->x.name = stringf("L.%s", p->name); + else + assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)), + p->x.name = p->name; +} + +static void address(Symbol q, Symbol p, long n) { + if (p->scope == GLOBAL + || p->sclass == STATIC || p->sclass == EXTERN) + q->x.name = stringf("%s%s%D", p->x.name, + n >= 0 ? "+" : "", n); + else { + assert(n <= INT_MAX && n >= INT_MIN); + q->x.offset = p->x.offset + n; + q->x.name = stringd(q->x.offset); + } +} + +static void global(Symbol p) { + if (p->u.seg == DATA || p->u.seg == LIT) { + assert(p->type->align <= 8); + print(".align %c\n", ".01.2...3"[p->type->align]); + print("%s:\n", p->x.name); + } else if (p->sclass == STATIC || Aflag >= 2) + print(".lcomm %s,%d\n", p->x.name, p->type->size); + else + print( ".comm %s,%d\n", p->x.name, p->type->size); +} + +static void segment(int n) { + cseg = n; + switch (n) { + case DATA: print(".sdata\n"); break; + case CODE: print(".text\n"); break; + case LIT: print(".rdata\n"); break; + } +} + +static void space(int n) { + if (cseg != BSS) + print(".space %d\n", n); +} + +static void blkloop(int dreg, int doff, int sreg, int soff, int size, int tmps[]) { + int lab = genlabel(1); + + print("addq $%d,%d,$%d\n", sreg, size&~7, sreg); + print("addq $%d,%d,$%d\n", dreg, size&~7, tmps[2]); + blkcopy(tmps[2], doff, sreg, soff, size&7, tmps); + print("L.%d:\n", lab); + print("addq $%d,%d,$%d\n", sreg, -8, sreg); + print("addq $%d,%d,$%d\n", tmps[2], -8, tmps[2]); + blkcopy(tmps[2], doff, sreg, soff, 8, tmps); + print("cmpult $%d,$%d,$23\nbne $23,L.%d\n", dreg, tmps[2], lab); +} + +static void blkfetch(int size, int off, int reg, int tmp) { + assert(size == 1 || size == 2 || size == 4 || size == 8); + if (size == 1) + print("ldb $%d,%d($%d)\n", tmp, off, reg); + else if (size == 2) + print("ldw $%d,%d($%d)\n", tmp, off, reg); + else if (salign >= size && size == 4) + print("ldl $%d,%d($%d)\n", tmp, off, reg); + else if (salign >= size && size == 8) + print("ldq $%d,%d($%d)\n", tmp, off, reg); + else if (size == 4) + print("uldl $%d,%d($%d)\n", tmp, off, reg); + else + print("uldq $%d,%d($%d)\n", tmp, off, reg); +} + +static void blkstore(int size, int off, int reg, int tmp) { + assert(size == 1 || size == 2 || size == 4 || size == 8); + if (size == 1) + print("stb $%d,%d($%d)\n", tmp, off, reg); + else if (size == 2) + print("stw $%d,%d($%d)\n", tmp, off, reg); + else if (dalign >= size && size == 4) + print("stl $%d,%d($%d)\n", tmp, off, reg); + else if (dalign >= size && size == 8) + print("stq $%d,%d($%d)\n", tmp, off, reg); + else if (size == 4) + print("ustl $%d,%d($%d)\n", tmp, off, reg); + else + print("ustq $%d,%d($%d)\n", tmp, off, reg); +} + +/* stabinit - initialize stab output */ +static void stabinit(char *file, int argc, char *argv[]) { + if (file) { + print(".file 2,\"%s\"\n", file); + currentfile = file; + } +} + +/* stabline - emit stab entry for source coordinate *cp */ +static void stabline(Coordinate *cp) { + if (cp->file && cp->file != currentfile) { + print(".file 2,\"%s\"\n", cp->file); + currentfile = cp->file; + } + print(".loc 2,%d\n", cp->y); +} + +/* stabsym - output a stab entry for symbol p */ +static void stabsym(Symbol p) { + if (p == cfunc && IR->stabline) + (*IR->stabline)(&p->src); +} +Interface alphaIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 8, 8, 0, /* long */ + 8, 8, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 8, 8, 0, /* T * */ + 0, 1, 0, /* struct */ + + 1, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + address, + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol, + emit, + export, + function, + gen, + global, + import, + local, + progbeg, + progend, + segment, + space, + 0, 0, 0, stabinit, stabline, stabsym, 0, + { + 1, /* max_unaligned_load */ + rmap, + blkfetch, blkstore, blkloop, + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + doarg, + target, + clobber, + + } + +}; + + +static char rcsid[] = "$Id: alpha.md,v 1.1.1.1 2001/10/17 21:53:35 timo Exp $"; + diff --git a/quake3/source/lcc/src/asdl.c b/quake3/source/lcc/src/asdl.c new file mode 100644 index 0000000..1c01c0c --- /dev/null +++ b/quake3/source/lcc/src/asdl.c @@ -0,0 +1,399 @@ +#include "c.h" +#include "rcc.h" +#if WIN32 +#include +#include +#endif + + +static list_ty interfaces; +static rcc_program_ty pickle; + +char *string(const char *str) { + return (char *)Atom_string(str); +} + +char *stringd(long n) { + return (char *)Atom_int(n); +} + +char *stringn(const char *str, int len) { + return (char *)Atom_new(str, len); +} + +static void put(rcc_interface_ty node) { + Seq_addhi(interfaces, node); +} + +static int typeuid(Type ty) { + rcc_type_ty type; + + assert(ty); + if (ty->x.typeno != 0) + return ty->x.typeno; + ty->x.typeno = pickle->nuids++; + switch (ty->op) { +#define xx(op) case op: type = rcc_##op(ty->size, ty->align); break + xx(INT); + xx(UNSIGNED); + xx(FLOAT); + xx(VOID); +#undef xx +#define xx(op) case op: type = rcc_##op(ty->size, ty->align, typeuid(ty->type)); break + xx(POINTER); + xx(ARRAY); + xx(CONST); + xx(VOLATILE); +#undef xx + case CONST+VOLATILE: + type = rcc_CONST(ty->size, ty->align, typeuid(ty->type)); + break; + case ENUM: { + list_ty ids = Seq_new(0); + int i; + for (i = 0; ty->u.sym->u.idlist[i] != NULL; i++) + Seq_addhi(ids, rcc_enum_(ty->u.sym->u.idlist[i]->name, + ty->u.sym->u.idlist[i]->u.value)); + assert(i > 0); + type = rcc_ENUM(ty->size, ty->align, ty->u.sym->name, ids); + break; + } + case STRUCT: case UNION: { + list_ty fields = Seq_new(0); + Field p = fieldlist(ty); + for ( ; p != NULL; p = p->link) + Seq_addhi(fields, rcc_field(p->name, typeuid(p->type), p->offset, p->bitsize, p->lsb)); + if (ty->op == STRUCT) + type = rcc_STRUCT(ty->size, ty->align, ty->u.sym->name, fields); + else + type = rcc_UNION (ty->size, ty->align, ty->u.sym->name, fields); + break; + } + case FUNCTION: { + list_ty formals = Seq_new(0); + if (ty->u.f.proto != NULL && ty->u.f.proto[0] != NULL) { + int i; + for (i = 0; ty->u.f.proto[i] != NULL; i++) + Seq_addhi(formals, to_generic_int(typeuid(ty->u.f.proto[i]))); + } else if (ty->u.f.proto != NULL && ty->u.f.proto[0] == NULL) + Seq_addhi(formals, to_generic_int(typeuid(voidtype))); + type = rcc_FUNCTION(ty->size, ty->align, typeuid(ty->type), formals); + break; + } + default: assert(0); + } + Seq_addhi(pickle->items, rcc_Type(ty->x.typeno, type)); + return ty->x.typeno; +} + +static int symboluid(Symbol p) { + assert(p); + assert(p->scope != CONSTANTS && p->scope != LABELS); + if (p->x.offset == 0) + p->x.offset = pickle->nuids++; + return p->x.offset; +} + +static rcc_symbol_ty mk_symbol(Symbol p) { + int flags = 0, ref = 10000*p->ref; + + if (p->ref > 0 && ref == 0) + ref++; +#define xx(f,n) flags |= p->f<name, typeuid(p->type), p->scope, p->sclass, ref, flags); +} + +static rcc_real_ty mk_real(int size, Value v) { + unsigned *p = (unsigned *)&v.d; + return rcc_real(p[swap], p[1-swap]); +} + +static void asdl_segment(int n) { + static int cseg; + + if (cseg != n) + put(rcc_Segment(cseg = n)); +} + +static void asdl_address(Symbol q, Symbol p, long n) { + assert(q->x.offset == 0); + put(rcc_Address(symboluid(q), mk_symbol(q), symboluid(p), n)); +} + +static void asdl_blockbeg(Env *e) { + put(rcc_Blockbeg()); +} + +static void asdl_blockend(Env *e) { + put(rcc_Blockend()); +} + +static void asdl_defaddress(Symbol p) { + if (p->scope == LABELS) + put(rcc_Deflabel(p->u.l.label)); + else + put(rcc_Defaddress(symboluid(p))); +} + +static void asdl_defconst(int suffix, int size, Value v) { + switch (suffix) { + case I: put(rcc_Defconst(suffix, size, v.i)); return; + case U: put(rcc_Defconst(suffix, size, v.u)); return; + case P: put(rcc_Defconst(suffix, size, (unsigned long)v.p)); return; /* FIXME */ + case F: put(rcc_Defconstf(size, mk_real(size, v))); return; + assert(0); + } +} + +static void asdl_defstring(int len, char *str) { + put(rcc_Defstring(Text_box(stringn(str, len), len))); +} + +static void asdl_defsymbol(Symbol p) { + if (p->scope >= GLOBAL) + symboluid(p); +} + +static Symbol temps; + +static rcc_node_ty visit(Node p) { + Symbol q; + rcc_node_ty left = NULL, right = NULL; + int suffix = optype(p->op), size = opsize(p->op); + + assert(p); + for (q = temps; q; q = q->u.t.next) + if (q->u.t.cse == p) { + q->u.t.cse = NULL; + return rcc_CSE(0, 0, symboluid(q), visit(p)); + } + if (p->kids[0] != NULL) + left = visit(p->kids[0]); + if (p->kids[1] != NULL) + right = visit(p->kids[1]); + switch (specific(p->op)) { + case CNST+F: + assert(p->syms[0]); + return rcc_CNSTF(suffix, size, mk_real(size, p->syms[0]->u.c.v)); + case CALL+B: + assert(p->syms[0]); + assert(p->syms[0]->type); + return rcc_CALLB(suffix, size, left, right, typeuid(p->syms[0]->type)); + case RET+V: + return rcc_RET(suffix, size); + case LABEL+V: + assert(p->syms[0]); + return rcc_LABEL(suffix, size, p->syms[0]->u.l.label); + } + switch (generic(p->op)) { + case CNST: + assert(p->syms[0]); + return rcc_CNST(suffix, size, p->syms[0]->u.c.v.i); /* FIXME */ + case ARG: + assert(p->syms[0]); + return rcc_ARG(suffix, size, left, p->syms[0]->u.c.v.i, p->syms[1]->u.c.v.i); + case ASGN: + assert(p->syms[0]); + assert(p->syms[1]); + return rcc_ASGN(suffix, size, left, right, p->syms[0]->u.c.v.i, p->syms[1]->u.c.v.i); + case CVF: case CVI: case CVP: case CVU: + assert(p->syms[0]); + return rcc_CVT(suffix, size, generic(p->op), left, p->syms[0]->u.c.v.i); + case CALL: + assert(p->syms[0]); + assert(p->syms[0]->type); + return rcc_CALL(suffix, size, left, typeuid(p->syms[0]->type)); +#define xx(op) case op: return rcc_##op(suffix, size, symboluid(p->syms[0])) + xx(ADDRG); + xx(ADDRF); +#undef xx + case ADDRL: + if (!p->syms[0]->defined) + (*IR->local)(p->syms[0]); + p->syms[0]->defined = 1; + return rcc_ADDRL(suffix, size, symboluid(p->syms[0])); + case JUMP: + if (p->syms[0] != NULL) + return rcc_BRANCH(suffix, size, p->syms[0]->u.l.label); + return rcc_Unary(suffix, size, generic(p->op), left); + case INDIR: case RET: case NEG: case BCOM: + return rcc_Unary(suffix, size, generic(p->op), left); + case BOR: case BAND: case BXOR: case RSH: case LSH: + case ADD: case SUB: case DIV: case MUL: case MOD: + return rcc_Binary(suffix, size, generic(p->op), left, right); + case EQ: case NE: case GT: case GE: case LE: case LT: + assert(p->syms[0]); + return rcc_Compare(suffix, size, generic(p->op), left, right, p->syms[0]->u.l.label); + } + assert(0); + return NULL; +} + +static void asdl_emit(Node p) {} + +static void asdl_local(Symbol p) { + assert(p->x.offset == 0); + put(rcc_Local(symboluid(p), mk_symbol(p))); + if (p->temporary && p->u.t.cse) { + p->u.t.next = temps; + temps = p; + } +} + +static Symbol pending = NULL; + +static void dopending(Symbol p) { + if (pending != NULL) { + int uid = symboluid(pending); + rcc_symbol_ty symbol = mk_symbol(pending); + Seq_addhi(pickle->items, rcc_Symbol(uid, symbol)); + } + pending = p; +} + + +static void asdl_export(Symbol p) { + put(rcc_Export(symboluid(p))); +} + +static void asdl_function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { + list_ty codelist = Seq_new(0), save, calleelist = Seq_new(0), callerlist = Seq_new(0); + int i; + + dopending(f); + for (i = 0; caller[i] != NULL; i++) { + asdl_local(caller[i]); + Seq_addhi(callerlist, to_generic_int(symboluid(caller[i]))); + } + for (i = 0; callee[i] != NULL; i++) { + asdl_local(callee[i]); + Seq_addhi(calleelist, to_generic_int(symboluid(callee[i]))); + } + save = interfaces; + interfaces = codelist; + gencode(caller, callee); + asdl_segment(CODE); + emitcode(); + interfaces = save; + put(rcc_Function(symboluid(f), callerlist, calleelist, ncalls, codelist)); +} + +static Node asdl_gen(Node p) { + Node q; + list_ty forest = Seq_new(0); + + for (q = p; p != NULL; p = p->link) + if (specific(p->op) == JUMP+V && specific(p->kids[0]->op) == ADDRG+P + && p->kids[0]->syms[0]->scope == LABELS) { + p->syms[0] = p->kids[0]->syms[0]; + p->kids[0] = NULL; + } + for (p = q; p != NULL; p = p->link) + Seq_addhi(forest, visit(p)); + put(rcc_Forest(forest)); + temps = NULL; + return q; +} + +static void asdl_global(Symbol p) { + dopending(p); + put(rcc_Global(symboluid(p), p->u.seg)); +} + +static void asdl_import(Symbol p) { + dopending(p); + put(rcc_Import(symboluid(p))); +} + +static void asdl_progbeg(int argc, char *argv[]) { + int i; + +#if WIN32 + _setmode(_fileno(stdout), _O_BINARY); +#endif + pickle = rcc_program(1, 0, Seq_new(0), Seq_new(0), argc, Seq_new(0)); + for (i = 0; i < argc; i++) + Seq_addhi(pickle->argv, to_generic_string(Text_box(argv[i], strlen(argv[i]) + 1))); + interfaces = pickle->interfaces; +} + +static int checkuid(list_ty list) { + int i, n = 0, count = Seq_length(list); + + for (i = 0; i < count; i++) { + rcc_interface_ty in = Seq_get(list, i); + if (in->kind == rcc_Local_enum + || in->kind == rcc_Address_enum) + n++; + else if (in->kind == rcc_Function_enum) + n += checkuid(in->v.rcc_Function.codelist); + } + return n; +} + +static void asdl_progend(void) { + dopending(NULL); + { + int n = checkuid(pickle->interfaces) + Seq_length(pickle->items); + if (n != pickle->nuids - 1) + fprintf(stderr, "?bogus uid count: have %d should have %d\n", + n, pickle->nuids-1); + } + pickle->nlabels = genlabel(0); + write_int((int)(100*(assert(strstr(rcsid, ",v")), strtod(strstr(rcsid, ",v")+2, NULL)) +), stdout); + rcc_write_program(pickle, stdout); +} +static void asdl_space(int n) { + put(rcc_Space(n)); +} + +void asdl_init(int argc, char *argv[]) { + int i; + static int inited; + + if (inited) + return; + inited = 1; + for (i = 1; i < argc; i++) + if (strcmp(argv[i], "-asdl") == 0) { +#define xx(f) IR->f = asdl_##f + xx(address); + xx(blockbeg); + xx(blockend); + xx(defaddress); + xx(defconst); + xx(defstring); + xx(defsymbol); + xx(emit); + xx(export); + xx(function); + xx(gen); + xx(global); + xx(import); + xx(local); + xx(progbeg); + xx(progend); + xx(segment); + xx(space); +#undef xx +#define xx(f) IR->f = 0 + xx(stabblock); + xx(stabend); + xx(stabfend); + xx(stabinit); + xx(stabline); + xx(stabsym); + xx(stabtype); +#undef xx + IR->wants_dag = 0; + prunetemps = 0; /* pass2 prunes useless temps */ + assignargs = 0; /* pass2 generates caller to callee assignments */ + } +} diff --git a/quake3/source/lcc/src/bind.c b/quake3/source/lcc/src/bind.c new file mode 100644 index 0000000..3723e37 --- /dev/null +++ b/quake3/source/lcc/src/bind.c @@ -0,0 +1,23 @@ +#include "c.h" +extern Interface alphaIR; +extern Interface mipsebIR, mipselIR; +extern Interface sparcIR, solarisIR; +extern Interface x86IR, x86linuxIR; +extern Interface symbolicIR, symbolic64IR; +extern Interface nullIR; +extern Interface bytecodeIR; +Binding bindings[] = { + "alpha/osf", &alphaIR, + "mips/irix", &mipsebIR, + "mips/ultrix", &mipselIR, + "sparc/sun", &sparcIR, + "sparc/solaris", &solarisIR, + "x86/win32", &x86IR, + "x86/linux", &x86linuxIR, + "symbolic/osf", &symbolic64IR, + "symbolic/irix", &symbolicIR, + "symbolic", &symbolicIR, + "null", &nullIR, + "bytecode", &bytecodeIR, + NULL, NULL +}; diff --git a/quake3/source/lcc/src/bytecode.c b/quake3/source/lcc/src/bytecode.c new file mode 100644 index 0000000..f32a04f --- /dev/null +++ b/quake3/source/lcc/src/bytecode.c @@ -0,0 +1,365 @@ +#include "c.h" +#define I(f) b_##f + + +static void I(segment)(int n) { + static int cseg; + + if (cseg != n) + switch (cseg = n) { + case CODE: print("code\n"); return; + case DATA: print("data\n"); return; + case BSS: print("bss\n"); return; + case LIT: print("lit\n"); return; + default: assert(0); + } +} + +static void I(address)(Symbol q, Symbol p, long n) { + q->x.name = stringf("%s%s%D", p->x.name, n > 0 ? "+" : "", n); +} + +static void I(defaddress)(Symbol p) { + print("address %s\n", p->x.name); +} + +static void I(defconst)(int suffix, int size, Value v) { + switch (suffix) { + case I: + if (size > sizeof (int)) + print("byte %d %D\n", size, v.i); + else + print("byte %d %d\n", size, v.i); + return; + case U: + if (size > sizeof (unsigned)) + print("byte %d %U\n", size, v.u); + else + print("byte %d %u\n", size, v.u); + return; + case P: print("byte %d %U\n", size, (unsigned long)v.p); return; + case F: + if (size == 4) { + float f = v.d; + print("byte 4 %u\n", *(unsigned *)&f); + } else { + unsigned *p = (unsigned *)&v.d; + print("byte 4 %u\n", p[swap]); + print("byte 4 %u\n", p[1 - swap]); + } + return; + } + assert(0); +} + +static void I(defstring)(int len, char *str) { + char *s; + + for (s = str; s < str + len; s++) + print("byte 1 %d\n", (*s)&0377); +} + +static void I(defsymbol)(Symbol p) { + if (p->scope == CONSTANTS) + switch (optype(ttob(p->type))) { + case I: p->x.name = stringf("%D", p->u.c.v.i); break; + case U: p->x.name = stringf("%U", p->u.c.v.u); break; + case P: p->x.name = stringf("%U", p->u.c.v.p); break; + case F: + { // JDC: added this to get inline floats + unsigned temp; + + *(float *)&temp = p->u.c.v.d; + p->x.name = stringf("%U", temp ); + } + break;// JDC: added this + default: assert(0); + } + else if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf("$%d", genlabel(1)); + else if (p->scope == LABELS || p->generated) + p->x.name = stringf("$%s", p->name); + else + p->x.name = p->name; +} + +static void dumptree(Node p) { + switch (specific(p->op)) { + case ASGN+B: + assert(p->kids[0]); + assert(p->kids[1]); + assert(p->syms[0]); + dumptree(p->kids[0]); + dumptree(p->kids[1]); + print("%s %d\n", opname(p->op), p->syms[0]->u.c.v.u); + return; + case RET+V: + assert(!p->kids[0]); + assert(!p->kids[1]); + print("%s\n", opname(p->op)); + return; + } + switch (generic(p->op)) { + case CNST: case ADDRG: case ADDRF: case ADDRL: case LABEL: + assert(!p->kids[0]); + assert(!p->kids[1]); + assert(p->syms[0] && p->syms[0]->x.name); + print("%s %s\n", opname(p->op), p->syms[0]->x.name); + return; + case CVF: case CVI: case CVP: case CVU: + assert(p->kids[0]); + assert(!p->kids[1]); + assert(p->syms[0]); + dumptree(p->kids[0]); + print("%s %d\n", opname(p->op), p->syms[0]->u.c.v.i); + return; + case ARG: case BCOM: case NEG: case INDIR: case JUMP: case RET: + assert(p->kids[0]); + assert(!p->kids[1]); + dumptree(p->kids[0]); + print("%s\n", opname(p->op)); + return; + case CALL: + assert(p->kids[0]); + assert(!p->kids[1]); + assert(optype(p->op) != B); + dumptree(p->kids[0]); + print("%s\n", opname(p->op)); + if ( !p->count ) { printf("pop\n"); }; // JDC + return; + case ASGN: case BOR: case BAND: case BXOR: case RSH: case LSH: + case ADD: case SUB: case DIV: case MUL: case MOD: + assert(p->kids[0]); + assert(p->kids[1]); + dumptree(p->kids[0]); + dumptree(p->kids[1]); + print("%s\n", opname(p->op)); + return; + case EQ: case NE: case GT: case GE: case LE: case LT: + assert(p->kids[0]); + assert(p->kids[1]); + assert(p->syms[0]); + assert(p->syms[0]->x.name); + dumptree(p->kids[0]); + dumptree(p->kids[1]); + print("%s %s\n", opname(p->op), p->syms[0]->x.name); + return; + } + assert(0); +} + +static void I(emit)(Node p) { + for (; p; p = p->link) + dumptree(p); +} + +static void I(export)(Symbol p) { + print("export %s\n", p->x.name); +} + +static void I(function)(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { + int i; + + (*IR->segment)(CODE); + offset = 0; + for (i = 0; caller[i] && callee[i]; i++) { + offset = roundup(offset, caller[i]->type->align); + caller[i]->x.name = callee[i]->x.name = stringf("%d", offset); + caller[i]->x.offset = callee[i]->x.offset = offset; + offset += caller[i]->type->size; + } + maxargoffset = maxoffset = argoffset = offset = 0; + gencode(caller, callee); + print("proc %s %d %d\n", f->x.name, maxoffset, maxargoffset); + emitcode(); + print("endproc %s %d %d\n", f->x.name, maxoffset, maxargoffset); + +} + +static void gen02(Node p) { + assert(p); + if (generic(p->op) == ARG) { + assert(p->syms[0]); + argoffset += (p->syms[0]->u.c.v.i < 4 ? 4 : p->syms[0]->u.c.v.i); + } else if (generic(p->op) == CALL) { + maxargoffset = (argoffset > maxargoffset ? argoffset : maxargoffset); + argoffset = 0; + } +} + +static void gen01(Node p) { + if (p) { + gen01(p->kids[0]); + gen01(p->kids[1]); + gen02(p); + } +} + +static Node I(gen)(Node p) { + Node q; + + assert(p); + for (q = p; q; q = q->link) + gen01(q); + return p; +} + +static void I(global)(Symbol p) { + print("align %d\n", p->type->align > 4 ? 4 : p->type->align); + print("LABELV %s\n", p->x.name); +} + +static void I(import)(Symbol p) { + print("import %s\n", p->x.name); +} + +static void I(local)(Symbol p) { + offset = roundup(offset, p->type->align); + p->x.name = stringf("%d", offset); + p->x.offset = offset; + offset += p->type->size; +} + +static void I(progbeg)(int argc, char *argv[]) {} + +static void I(progend)(void) {} + +static void I(space)(int n) { + print("skip %d\n", n); +} + +//======================================================== + +// JDC: hacked up to get interleaved source lines in asm code +static char *sourceFile; +static char *sourcePtr; +static int sourceLine; + +static int filelength( FILE *f ) { + int pos; + int end; + + pos = ftell (f); + fseek (f, 0, SEEK_END); + end = ftell (f); + fseek (f, pos, SEEK_SET); + + return end; +} + +static void LoadSourceFile( const char *filename ) { + FILE *f; + int length; + + f = fopen( filename, "r" ); + if ( !f ) { + print( ";couldn't open %s\n", filename ); + sourceFile = NULL; + return; + } + length = filelength( f ); + sourceFile = malloc( length + 1 ); + if ( sourceFile ) { + fread( sourceFile, length, 1, f ); + sourceFile[length] = 0; + } + + fclose( f ); + sourceLine = 1; + sourcePtr = sourceFile; +} + +static void PrintToSourceLine( int line ) { + int c; + + if ( !sourceFile ) { + return; + } + while ( sourceLine <= line ) { + int i; + + for ( i = 0 ; sourcePtr[i] && sourcePtr[i] != '\n' ; i++ ) { + } + c = sourcePtr[i]; + if ( c == '\n' ) { + sourcePtr[i] = 0; + } + print( ";%d:%s\n", sourceLine, sourcePtr ); + if ( c == 0 ) { + sourcePtr += i; // end of file + } else { + sourcePtr += i+1; + } + sourceLine++; + } +} + +static void I(stabline)(Coordinate *cp) { + static char *prevfile; + static int prevline; + + if (cp->file && (prevfile == NULL || strcmp(prevfile, cp->file) != 0)) { + print("file \"%s\"\n", prevfile = cp->file); + prevline = 0; + if ( sourceFile ) { + free( sourceFile ); + sourceFile = NULL; + } + // load the new source file + LoadSourceFile( cp->file ); + } + if (cp->y != prevline) { + print("line %d\n", prevline = cp->y); + PrintToSourceLine( cp->y ); + } +} + +//======================================================== + +#define b_blockbeg blockbeg +#define b_blockend blockend + +Interface bytecodeIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 0, /* float */ // JDC: use inline floats + 4, 4, 0, /* double */ // JDC: don't ever emit 8 byte double code + 4, 4, 0, /* long double */ // JDC: don't ever emit 8 byte double code + 4, 4, 0, /* T* */ + 0, 4, 0, /* struct */ + 0, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 0, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + I(address), + I(blockbeg), + I(blockend), + I(defaddress), + I(defconst), + I(defstring), + I(defsymbol), + I(emit), + I(export), + I(function), + I(gen), + I(global), + I(import), + I(local), + I(progbeg), + I(progend), + I(segment), + I(space), + 0, /* I(stabblock) */ + 0, /* I(stabend) */ + 0, /* I(stabfend) */ + 0, /* I(stabinit) */ + I(stabline), + 0, /* I(stabsym) */ + 0, /* I(stabtype) */ +}; diff --git a/quake3/source/lcc/src/c.h b/quake3/source/lcc/src/c.h new file mode 100644 index 0000000..e21419d --- /dev/null +++ b/quake3/source/lcc/src/c.h @@ -0,0 +1,723 @@ +#include +#include +#include +#include +#include +#include + +#define NEW(p,a) ((p) = allocate(sizeof *(p), (a))) +#define NEW0(p,a) memset(NEW((p),(a)), 0, sizeof *(p)) +#define isaddrop(op) (specific(op)==ADDRG+P || specific(op)==ADDRL+P \ + || specific(op)==ADDRF+P) + +#define MAXLINE 512 +#define BUFSIZE 4096 + +#define istypename(t,tsym) (kind[t] == CHAR \ + || t == ID && tsym && tsym->sclass == TYPEDEF) +#define sizeop(n) ((n)<<10) +#define generic(op) ((op)&0x3F0) +#define specific(op) ((op)&0x3FF) +#define opindex(op) (((op)>>4)&0x3F) +#define opkind(op) ((op)&~0x3F0) +#define opsize(op) ((op)>>10) +#define optype(op) ((op)&0xF) +#ifdef __LCC__ +#ifndef __STDC__ +#define __STDC__ +#endif +#endif +#define NELEMS(a) ((int)(sizeof (a)/sizeof ((a)[0]))) +#undef roundup +#define roundup(x,n) (((x)+((n)-1))&(~((n)-1))) +#define mkop(op,ty) (specific((op) + ttob(ty))) + +#define extend(x,ty) ((x)&(1<<(8*(ty)->size-1)) ? (x)|((~0UL)<<(8*(ty)->size-1)) : (x)&ones(8*(ty)->size)) +#define ones(n) ((n)>=8*sizeof (unsigned long) ? ~0UL : ~((~0UL)<<(n))) + +#define isqual(t) ((t)->op >= CONST) +#define unqual(t) (isqual(t) ? (t)->type : (t)) + +#define isvolatile(t) ((t)->op == VOLATILE \ + || (t)->op == CONST+VOLATILE) +#define isconst(t) ((t)->op == CONST \ + || (t)->op == CONST+VOLATILE) +#define isarray(t) (unqual(t)->op == ARRAY) +#define isstruct(t) (unqual(t)->op == STRUCT \ + || unqual(t)->op == UNION) +#define isunion(t) (unqual(t)->op == UNION) +#define isfunc(t) (unqual(t)->op == FUNCTION) +#define isptr(t) (unqual(t)->op == POINTER) +#define ischar(t) ((t)->size == 1 && isint(t)) +#define isint(t) (unqual(t)->op == INT \ + || unqual(t)->op == UNSIGNED) +#define isfloat(t) (unqual(t)->op == FLOAT) +#define isarith(t) (unqual(t)->op <= UNSIGNED) +#define isunsigned(t) (unqual(t)->op == UNSIGNED) +#define isscalar(t) (unqual(t)->op <= POINTER \ + || unqual(t)->op == ENUM) +#define isenum(t) (unqual(t)->op == ENUM) +#define fieldsize(p) (p)->bitsize +#define fieldright(p) ((p)->lsb - 1) +#define fieldleft(p) (8*(p)->type->size - \ + fieldsize(p) - fieldright(p)) +#define fieldmask(p) (~(~(unsigned)0<mulops_calls \ + && (generic(op)==DIV||generic(op)==MOD||generic(op)==MUL) \ + && ( optype(op)==U || optype(op)==I)) +static Node forest; +static struct dag { + struct node node; + struct dag *hlink; +} *buckets[16]; +int nodecount; +static Tree firstarg; +int assignargs = 1; +int prunetemps = -1; +static Node *tail; + +static int depth = 0; +static Node replace(Node); +static Node prune(Node); +static Node asgnnode(Symbol, Node); +static struct dag *dagnode(int, Node, Node, Symbol); +static Symbol equated(Symbol); +static void fixup(Node); +static void labelnode(int); +static void list(Node); +static void kill(Symbol); +static Node node(int, Node, Node, Symbol); +static void printdag1(Node, int, int); +static void printnode(Node, int, int); +static void reset(void); +static Node tmpnode(Node); +static void typestab(Symbol, void *); +static Node undag(Node); +static Node visit(Node, int); +static void unlist(void); +void walk(Tree tp, int tlab, int flab) { + listnodes(tp, tlab, flab); + if (forest) { + Node list = forest->link; + forest->link = NULL; + if (!IR->wants_dag) + list = undag(list); + code(Gen)->u.forest = list; + forest = NULL; + } + reset(); + deallocate(STMT); +} + +static Node node(int op, Node l, Node r, Symbol sym) { + int i; + struct dag *p; + + i = (opindex(op)^((unsigned long)sym>>2))&(NELEMS(buckets)-1); + for (p = buckets[i]; p; p = p->hlink) + if (p->node.op == op && p->node.syms[0] == sym + && p->node.kids[0] == l && p->node.kids[1] == r) + return &p->node; + p = dagnode(op, l, r, sym); + p->hlink = buckets[i]; + buckets[i] = p; + ++nodecount; + return &p->node; +} +static struct dag *dagnode(int op, Node l, Node r, Symbol sym) { + struct dag *p; + + NEW0(p, FUNC); + p->node.op = op; + if ((p->node.kids[0] = l) != NULL) + ++l->count; + if ((p->node.kids[1] = r) != NULL) + ++r->count; + p->node.syms[0] = sym; + return p; +} +Node newnode(int op, Node l, Node r, Symbol sym) { + return &dagnode(op, l, r, sym)->node; +} +static void kill(Symbol p) { + int i; + struct dag **q; + + for (i = 0; i < NELEMS(buckets); i++) + for (q = &buckets[i]; *q; ) + if (generic((*q)->node.op) == INDIR && + (!isaddrop((*q)->node.kids[0]->op) + || (*q)->node.kids[0]->syms[0] == p)) { + *q = (*q)->hlink; + --nodecount; + } else + q = &(*q)->hlink; +} +static void reset(void) { + if (nodecount > 0) + memset(buckets, 0, sizeof buckets); + nodecount = 0; +} +Node listnodes(Tree tp, int tlab, int flab) { + Node p = NULL, l, r; + int op; + + assert(tlab || flab || tlab == 0 && flab == 0); + if (tp == NULL) + return NULL; + if (tp->node) + return tp->node; + op = tp->op + sizeop(tp->type->size); + switch (generic(tp->op)) { + case AND: { if (depth++ == 0) reset(); + if (flab) { + listnodes(tp->kids[0], 0, flab); + listnodes(tp->kids[1], 0, flab); + } else { + listnodes(tp->kids[0], 0, flab = genlabel(1)); + listnodes(tp->kids[1], tlab, 0); + labelnode(flab); + } + depth--; } break; + case OR: { if (depth++ == 0) + reset(); + if (tlab) { + listnodes(tp->kids[0], tlab, 0); + listnodes(tp->kids[1], tlab, 0); + } else { + tlab = genlabel(1); + listnodes(tp->kids[0], tlab, 0); + listnodes(tp->kids[1], 0, flab); + labelnode(tlab); + } + depth--; + } break; + case NOT: { return listnodes(tp->kids[0], flab, tlab); } + case COND: { Tree q = tp->kids[1]; + assert(tlab == 0 && flab == 0); + if (tp->u.sym) + addlocal(tp->u.sym); + flab = genlabel(2); + listnodes(tp->kids[0], 0, flab); + assert(q && q->op == RIGHT); + reset(); + listnodes(q->kids[0], 0, 0); + if (forest->op == LABEL+V) { + equatelab(forest->syms[0], findlabel(flab + 1)); + unlist(); + } + list(jump(flab + 1)); + labelnode(flab); + listnodes(q->kids[1], 0, 0); + if (forest->op == LABEL+V) { + equatelab(forest->syms[0], findlabel(flab + 1)); + unlist(); + } + labelnode(flab + 1); + + if (tp->u.sym) + p = listnodes(idtree(tp->u.sym), 0, 0); } break; + case CNST: { Type ty = unqual(tp->type); + assert(ty->u.sym); + if (tlab || flab) { + assert(ty == inttype); + if (tlab && tp->u.v.i != 0) + list(jump(tlab)); + else if (flab && tp->u.v.i == 0) + list(jump(flab)); + } + else if (ty->u.sym->addressed) + p = listnodes(cvtconst(tp), 0, 0); + else + p = node(op, NULL, NULL, constant(ty, tp->u.v)); } break; + case RIGHT: { if ( tp->kids[0] && tp->kids[1] + && generic(tp->kids[1]->op) == ASGN + && (generic(tp->kids[0]->op) == INDIR + && tp->kids[0]->kids[0] == tp->kids[1]->kids[0] + || (tp->kids[0]->op == FIELD + && tp->kids[0] == tp->kids[1]->kids[0]))) { + assert(tlab == 0 && flab == 0); + if (generic(tp->kids[0]->op) == INDIR) { + p = listnodes(tp->kids[0], 0, 0); + list(p); + listnodes(tp->kids[1], 0, 0); + } + else { + assert(generic(tp->kids[0]->kids[0]->op) == INDIR); + list(listnodes(tp->kids[0]->kids[0], 0, 0)); + p = listnodes(tp->kids[0], 0, 0); + listnodes(tp->kids[1], 0, 0); + } + } else if (tp->kids[1]) { + listnodes(tp->kids[0], 0, 0); + p = listnodes(tp->kids[1], tlab, flab); + } else + p = listnodes(tp->kids[0], tlab, flab); } break; + case JUMP: { assert(tlab == 0 && flab == 0); + assert(tp->u.sym == 0); + assert(tp->kids[0]); + l = listnodes(tp->kids[0], 0, 0); + list(newnode(JUMP+V, l, NULL, NULL)); + reset(); } break; + case CALL: { Tree save = firstarg; + firstarg = NULL; + assert(tlab == 0 && flab == 0); + if (tp->op == CALL+B && !IR->wants_callb) { + Tree arg0 = tree(ARG+P, tp->kids[1]->type, + tp->kids[1], NULL); + if (IR->left_to_right) + firstarg = arg0; + l = listnodes(tp->kids[0], 0, 0); + if (!IR->left_to_right || firstarg) { + firstarg = NULL; + listnodes(arg0, 0, 0); + } + p = newnode(CALL+V, l, NULL, NULL); + } else { + l = listnodes(tp->kids[0], 0, 0); + r = listnodes(tp->kids[1], 0, 0); + p = newnode(tp->op == CALL+B ? tp->op : op, l, r, NULL); + } + NEW0(p->syms[0], FUNC); + assert(isptr(tp->kids[0]->type)); + assert(isfunc(tp->kids[0]->type->type)); + p->syms[0]->type = tp->kids[0]->type->type; + list(p); + reset(); + cfunc->u.f.ncalls++; + firstarg = save; + } break; + case ARG: { assert(tlab == 0 && flab == 0); + if (IR->left_to_right) + listnodes(tp->kids[1], 0, 0); + if (firstarg) { + Tree arg = firstarg; + firstarg = NULL; + listnodes(arg, 0, 0); + } + l = listnodes(tp->kids[0], 0, 0); + list(newnode(tp->op == ARG+B ? tp->op : op, l, NULL, NULL)); + forest->syms[0] = intconst(tp->type->size); + forest->syms[1] = intconst(tp->type->align); + if (!IR->left_to_right) + listnodes(tp->kids[1], 0, 0); } break; + case EQ: case NE: case GT: case GE: case LE: + case LT: { assert(tp->u.sym == 0); + assert(errcnt || tlab || flab); + l = listnodes(tp->kids[0], 0, 0); + r = listnodes(tp->kids[1], 0, 0); + assert(errcnt || opkind(l->op) == opkind(r->op)); + assert(errcnt || optype(op) == optype(l->op)); + if (tlab) + assert(flab == 0), + list(newnode(generic(tp->op) + opkind(l->op), l, r, findlabel(tlab))); + else if (flab) { + switch (generic(tp->op)) { + case EQ: op = NE; break; + case NE: op = EQ; break; + case GT: op = LE; break; + case LT: op = GE; break; + case GE: op = LT; break; + case LE: op = GT; break; + default: assert(0); + } + list(newnode(op + opkind(l->op), l, r, findlabel(flab))); + } + if (forest && forest->syms[0]) + forest->syms[0]->ref++; } break; + case ASGN: { assert(tlab == 0 && flab == 0); + if (tp->kids[0]->op == FIELD) { + Tree x = tp->kids[0]->kids[0]; + Field f = tp->kids[0]->u.field; + assert(generic(x->op) == INDIR); + reset(); + l = listnodes(lvalue(x), 0, 0); + if (fieldsize(f) < 8*f->type->size) { + unsigned int fmask = fieldmask(f); + unsigned int mask = fmask<kids[1]; + if (q->op == CNST+I && q->u.v.i == 0 + || q->op == CNST+U && q->u.v.u == 0) + q = bittree(BAND, x, cnsttree(unsignedtype, (unsigned long)~mask)); + else if (q->op == CNST+I && (q->u.v.i&fmask) == fmask + || q->op == CNST+U && (q->u.v.u&fmask) == fmask) + q = bittree(BOR, x, cnsttree(unsignedtype, (unsigned long)mask)); + else { + listnodes(q, 0, 0); + q = bittree(BOR, + bittree(BAND, rvalue(lvalue(x)), + cnsttree(unsignedtype, (unsigned long)~mask)), + bittree(BAND, shtree(LSH, cast(q, unsignedtype), + cnsttree(unsignedtype, (unsigned long)fieldright(f))), + cnsttree(unsignedtype, (unsigned long)mask))); + } + r = listnodes(q, 0, 0); + op = ASGN + ttob(q->type); + } else { + r = listnodes(tp->kids[1], 0, 0); + op = ASGN + ttob(tp->kids[1]->type); + } + } else { + l = listnodes(tp->kids[0], 0, 0); + r = listnodes(tp->kids[1], 0, 0); + } + list(newnode(tp->op == ASGN+B ? tp->op : op, l, r, NULL)); + forest->syms[0] = intconst(tp->kids[1]->type->size); + forest->syms[1] = intconst(tp->kids[1]->type->align); + if (isaddrop(tp->kids[0]->op) + && !tp->kids[0]->u.sym->computed) + kill(tp->kids[0]->u.sym); + else + reset(); + p = listnodes(tp->kids[1], 0, 0); } break; + case BOR: case BAND: case BXOR: + case ADD: case SUB: case RSH: + case LSH: { assert(tlab == 0 && flab == 0); + l = listnodes(tp->kids[0], 0, 0); + r = listnodes(tp->kids[1], 0, 0); + p = node(op, l, r, NULL); } break; + case DIV: case MUL: + case MOD: { assert(tlab == 0 && flab == 0); + l = listnodes(tp->kids[0], 0, 0); + r = listnodes(tp->kids[1], 0, 0); + p = node(op, l, r, NULL); + if (IR->mulops_calls && isint(tp->type)) { + list(p); + cfunc->u.f.ncalls++; + } } break; + case RET: { assert(tlab == 0 && flab == 0); + l = listnodes(tp->kids[0], 0, 0); + list(newnode(op, l, NULL, NULL)); } break; + case CVF: case CVI: case CVP: + case CVU: { assert(tlab == 0 && flab == 0); + assert(optype(tp->kids[0]->op) != optype(tp->op) || tp->kids[0]->type->size != tp->type->size); + l = listnodes(tp->kids[0], 0, 0); + p = node(op, l, NULL, intconst(tp->kids[0]->type->size)); + } break; + case BCOM: + case NEG: { assert(tlab == 0 && flab == 0); + l = listnodes(tp->kids[0], 0, 0); + p = node(op, l, NULL, NULL); } break; + case INDIR: { Type ty = tp->kids[0]->type; + assert(tlab == 0 && flab == 0); + l = listnodes(tp->kids[0], 0, 0); + if (isptr(ty)) + ty = unqual(ty)->type; + if (isvolatile(ty) + || (isstruct(ty) && unqual(ty)->u.sym->u.s.vfields)) + p = newnode(tp->op == INDIR+B ? tp->op : op, l, NULL, NULL); + else + p = node(tp->op == INDIR+B ? tp->op : op, l, NULL, NULL); } break; + case FIELD: { Tree q = tp->kids[0]; + if (tp->type == inttype) { + long n = fieldleft(tp->u.field); + q = shtree(RSH, + shtree(LSH, q, cnsttree(inttype, n)), + cnsttree(inttype, n + fieldright(tp->u.field))); + } else if (fieldsize(tp->u.field) < 8*tp->u.field->type->size) + q = bittree(BAND, + shtree(RSH, q, cnsttree(inttype, (long)fieldright(tp->u.field))), + cnsttree(unsignedtype, (unsigned long)fieldmask(tp->u.field))); + assert(tlab == 0 && flab == 0); + p = listnodes(q, 0, 0); } break; + case ADDRG: + case ADDRF: { assert(tlab == 0 && flab == 0); + p = node(tp->op + sizeop(voidptype->size), NULL, NULL, tp->u.sym); + } break; + case ADDRL: { assert(tlab == 0 && flab == 0); + if (tp->u.sym->temporary) + addlocal(tp->u.sym); + p = node(tp->op + sizeop(voidptype->size), NULL, NULL, tp->u.sym); } break; + default:assert(0); + } + tp->node = p; + return p; +} +static void list(Node p) { + if (p && p->link == NULL) { + if (forest) { + p->link = forest->link; + forest->link = p; + } else + p->link = p; + forest = p; + } +} +static void labelnode(int lab) { + assert(lab); + if (forest && forest->op == LABEL+V) + equatelab(findlabel(lab), forest->syms[0]); + else + list(newnode(LABEL+V, NULL, NULL, findlabel(lab))); + reset(); +} +static void unlist(void) { + Node p; + + assert(forest); + assert(forest != forest->link); + p = forest->link; + while (p->link != forest) + p = p->link; + p->link = forest->link; + forest = p; +} +Tree cvtconst(Tree p) { + Symbol q = constant(p->type, p->u.v); + Tree e; + + if (q->u.c.loc == NULL) + q->u.c.loc = genident(STATIC, p->type, GLOBAL); + if (isarray(p->type)) { + e = simplify(ADDRG, atop(p->type), NULL, NULL); + e->u.sym = q->u.c.loc; + } else + e = idtree(q->u.c.loc); + return e; +} +void gencode(Symbol caller[], Symbol callee[]) { + Code cp; + Coordinate save; + + if (prunetemps == -1) + prunetemps = !IR->wants_dag; + save = src; + if (assignargs) { + int i; + Symbol p, q; + cp = codehead.next->next; + codelist = codehead.next; + for (i = 0; (p = callee[i]) != NULL + && (q = caller[i]) != NULL; i++) + if (p->sclass != q->sclass || p->type != q->type) + walk(asgn(p, idtree(q)), 0, 0); + codelist->next = cp; + cp->prev = codelist; + } + if (glevel && IR->stabsym) { + int i; + Symbol p, q; + for (i = 0; (p = callee[i]) != NULL + && (q = caller[i]) != NULL; i++) { + (*IR->stabsym)(p); + if (p->sclass != q->sclass || p->type != q->type) + (*IR->stabsym)(q); + } + swtoseg(CODE); + } + cp = codehead.next; + for ( ; errcnt <= 0 && cp; cp = cp->next) + switch (cp->kind) { + case Address: (*IR->address)(cp->u.addr.sym, cp->u.addr.base, + cp->u.addr.offset); break; + case Blockbeg: { + Symbol *p = cp->u.block.locals; + (*IR->blockbeg)(&cp->u.block.x); + for ( ; *p; p++) + if ((*p)->ref != 0.0) + (*IR->local)(*p); + else if (glevel) (*IR->local)(*p); + } + break; + case Blockend: (*IR->blockend)(&cp->u.begin->u.block.x); break; + case Defpoint: src = cp->u.point.src; break; + case Gen: case Jump: + case Label: if (prunetemps) + cp->u.forest = prune(cp->u.forest); + fixup(cp->u.forest); + cp->u.forest = (*IR->gen)(cp->u.forest); break; + case Local: (*IR->local)(cp->u.var); break; + case Switch: break; + default: assert(0); + } + src = save; +} +static void fixup(Node p) { + for ( ; p; p = p->link) + switch (generic(p->op)) { + case JUMP: + if (specific(p->kids[0]->op) == ADDRG+P) + p->kids[0]->syms[0] = + equated(p->kids[0]->syms[0]); + break; + case LABEL: assert(p->syms[0] == equated(p->syms[0])); break; + case EQ: case GE: case GT: case LE: case LT: case NE: + assert(p->syms[0]); + p->syms[0] = equated(p->syms[0]); + } +} +static Symbol equated(Symbol p) { + { Symbol q; for (q = p->u.l.equatedto; q; q = q->u.l.equatedto) assert(p != q); } + while (p->u.l.equatedto) + p = p->u.l.equatedto; + return p; +} +void emitcode(void) { + Code cp; + Coordinate save; + + save = src; + cp = codehead.next; + for ( ; errcnt <= 0 && cp; cp = cp->next) + switch (cp->kind) { + case Address: break; + case Blockbeg: if (glevel && IR->stabblock) { + (*IR->stabblock)('{', cp->u.block.level - LOCAL, cp->u.block.locals); + swtoseg(CODE); + } + break; + case Blockend: if (glevel && IR->stabblock) { + Code bp = cp->u.begin; + foreach(bp->u.block.identifiers, bp->u.block.level, typestab, NULL); + foreach(bp->u.block.types, bp->u.block.level, typestab, NULL); + (*IR->stabblock)('}', bp->u.block.level - LOCAL, bp->u.block.locals); + swtoseg(CODE); + } + break; + case Defpoint: src = cp->u.point.src; + if (glevel > 0 && IR->stabline) { + (*IR->stabline)(&cp->u.point.src); swtoseg(CODE); } break; + case Gen: case Jump: + case Label: if (cp->u.forest) + (*IR->emit)(cp->u.forest); break; + case Local: if (glevel && IR->stabsym) { + (*IR->stabsym)(cp->u.var); + swtoseg(CODE); + } break; + case Switch: { int i; + defglobal(cp->u.swtch.table, LIT); + (*IR->defaddress)(equated(cp->u.swtch.labels[0])); + for (i = 1; i < cp->u.swtch.size; i++) { + long k = cp->u.swtch.values[i-1]; + while (++k < cp->u.swtch.values[i]) + assert(k < LONG_MAX), + (*IR->defaddress)(equated(cp->u.swtch.deflab)); + (*IR->defaddress)(equated(cp->u.swtch.labels[i])); + } + swtoseg(CODE); + } break; + default: assert(0); + } + src = save; +} + +static Node undag(Node forest) { + Node p; + + tail = &forest; + for (p = forest; p; p = p->link) + if (generic(p->op) == INDIR) { + assert(p->count >= 1); + visit(p, 1); + if (p->syms[2]) { + assert(p->syms[2]->u.t.cse); + p->syms[2]->u.t.cse = NULL; + addlocal(p->syms[2]); + } + } else if (iscall(p->op) && p->count >= 1) + visit(p, 1); + else { + assert(p->count == 0), + visit(p, 1); + *tail = p; + tail = &p->link; + } + *tail = NULL; + return forest; +} +static Node replace(Node p) { + if (p && ( generic(p->op) == INDIR + && generic(p->kids[0]->op) == ADDRL + && p->kids[0]->syms[0]->temporary + && p->kids[0]->syms[0]->u.t.replace)) { + p = p->kids[0]->syms[0]->u.t.cse; + if (generic(p->op) == INDIR && isaddrop(p->kids[0]->op)) + p = newnode(p->op, newnode(p->kids[0]->op, NULL, NULL, + p->kids[0]->syms[0]), NULL, NULL); + else if (generic(p->op) == ADDRG) + p = newnode(p->op, NULL, NULL, p->syms[0]); + else + assert(0); + p->count = 1; + } else if (p) { + p->kids[0] = replace(p->kids[0]); + p->kids[1] = replace(p->kids[1]); + } + return p; +} +static Node prune(Node forest) { + Node p, *tail = &forest; + int count = 0; + + for (p = forest; p; p = p->link) { + if (count > 0) { + p->kids[0] = replace(p->kids[0]); + p->kids[1] = replace(p->kids[1]); + } + if (( generic(p->op) == ASGN + && generic(p->kids[0]->op) == ADDRL + && p->kids[0]->syms[0]->temporary + && p->kids[0]->syms[0]->u.t.cse == p->kids[1])) { + Symbol tmp = p->kids[0]->syms[0]; + if (!tmp->defined) + (*IR->local)(tmp); + tmp->defined = 1; + if (( generic(p->kids[1]->op) == INDIR + && isaddrop(p->kids[1]->kids[0]->op) + && p->kids[1]->kids[0]->syms[0]->sclass == REGISTER) + || (( generic(p->kids[1]->op) == INDIR + && isaddrop(p->kids[1]->kids[0]->op)) && tmp->sclass == AUTO) + || (generic(p->kids[1]->op) == ADDRG && tmp->sclass == AUTO)) { + tmp->u.t.replace = 1; + count++; + continue; /* and omit the assignment */ + } + } + /* keep the assignment and other roots */ + *tail = p; + tail = &(*tail)->link; + } + assert(*tail == NULL); + return forest; +} +static Node visit(Node p, int listed) { + if (p) + if (p->syms[2]) + p = tmpnode(p); + else if (p->count <= 1 && !iscall(p->op) + || p->count == 0 && iscall(p->op)) { + p->kids[0] = visit(p->kids[0], 0); + p->kids[1] = visit(p->kids[1], 0); + } + + else if (specific(p->op) == ADDRL+P || specific(p->op) == ADDRF+P) { + assert(!listed); + p = newnode(p->op, NULL, NULL, p->syms[0]); + p->count = 1; + } + else if (p->op == INDIR+B) { + p = newnode(p->op, p->kids[0], NULL, NULL); + p->count = 1; + p->kids[0] = visit(p->kids[0], 0); + p->kids[1] = visit(p->kids[1], 0); + } + else { + p->kids[0] = visit(p->kids[0], 0); + p->kids[1] = visit(p->kids[1], 0); + p->syms[2] = temporary(REGISTER, btot(p->op, opsize(p->op))); + assert(!p->syms[2]->defined); + p->syms[2]->ref = 1; + p->syms[2]->u.t.cse = p; + + *tail = asgnnode(p->syms[2], p); + tail = &(*tail)->link; + if (!listed) + p = tmpnode(p); + }; + return p; +} +static Node tmpnode(Node p) { + Symbol tmp = p->syms[2]; + + assert(tmp); + if (--p->count == 0) + p->syms[2] = NULL; + p = newnode(INDIR + ttob(tmp->type), + newnode(ADDRL + ttob(voidptype), NULL, NULL, tmp), NULL, NULL); + p->count = 1; + return p; +} +static Node asgnnode(Symbol tmp, Node p) { + p = newnode(ASGN + ttob(tmp->type), + newnode(ADDRL + ttob(voidptype), NULL, NULL, tmp), p, NULL); + p->syms[0] = intconst(tmp->type->size); + p->syms[1] = intconst(tmp->type->align); + return p; +} +/* printdag - print dag p on fd, or the node list if p == 0 */ +void printdag(Node p, int fd) { + FILE *f = fd == 1 ? stdout : stderr; + + printed(0); + if (p == 0) { + if ((p = forest) != NULL) + do { + p = p->link; + printdag1(p, fd, 0); + } while (p != forest); + } else if (*printed(nodeid((Tree)p))) + fprint(f, "node'%d printed above\n", nodeid((Tree)p)); + else + printdag1(p, fd, 0); +} + +/* printdag1 - recursively print dag p */ +static void printdag1(Node p, int fd, int lev) { + int id, i; + + if (p == 0 || *printed(id = nodeid((Tree)p))) + return; + *printed(id) = 1; + for (i = 0; i < NELEMS(p->kids); i++) + printdag1(p->kids[i], fd, lev + 1); + printnode(p, fd, lev); +} + +/* printnode - print fields of dag p */ +static void printnode(Node p, int fd, int lev) { + if (p) { + FILE *f = fd == 1 ? stdout : stderr; + int i, id = nodeid((Tree)p); + fprint(f, "%c%d%s", lev == 0 ? '\'' : '#', id, + &" "[id < 10 ? 0 : id < 100 ? 1 : 2]); + fprint(f, "%s count=%d", opname(p->op), p->count); + for (i = 0; i < NELEMS(p->kids) && p->kids[i]; i++) + fprint(f, " #%d", nodeid((Tree)p->kids[i])); + if (generic(p->op) == CALL && p->syms[0] && p->syms[0]->type) + fprint(f, " {%t}", p->syms[0]->type); + else + for (i = 0; i < NELEMS(p->syms) && p->syms[i]; i++) + if (p->syms[i]->name) + fprint(f, " %s", p->syms[i]->name); + else + fprint(f, " %p", p->syms[i]); + fprint(f, "\n"); + } +} + +/* typestab - emit stab entries for p */ +static void typestab(Symbol p, void *cl) { + if (!isfunc(p->type) && (p->sclass == EXTERN || p->sclass == STATIC) && IR->stabsym) + (*IR->stabsym)(p); + else if ((p->sclass == TYPEDEF || p->sclass == 0) && IR->stabtype) + (*IR->stabtype)(p); +} + diff --git a/quake3/source/lcc/src/dagcheck.md b/quake3/source/lcc/src/dagcheck.md new file mode 100644 index 0000000..5deec0d --- /dev/null +++ b/quake3/source/lcc/src/dagcheck.md @@ -0,0 +1,210 @@ +%{ +#include "c.h" +typedef Node NODEPTR_TYPE; +#define OP_LABEL(p) (specific((p)->op)) +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define STATE_LABEL(p) ((p)->x.state) +#define PANIC error +%} +%term CNSTF=17 CNSTI=21 CNSTP=23 CNSTU=22 +%term ARGB=41 ARGF=33 ARGI=37 ARGP=39 ARGU=38 +%term ASGNB=57 ASGNF=49 ASGNI=53 ASGNP=55 ASGNU=54 +%term INDIRB=73 INDIRF=65 INDIRI=69 INDIRP=71 INDIRU=70 +%term CVFF=113 CVFI=117 +%term CVIF=129 CVII=133 CVIU=134 +%term CVPP=151 CVPU=150 +%term CVUI=181 CVUP=183 CVUU=182 +%term NEGF=193 NEGI=197 +%term CALLB=217 CALLF=209 CALLI=213 CALLP=215 CALLU=214 CALLV=216 +%term RETF=241 RETI=245 RETP=247 RETU=246 RETV=248 +%term ADDRGP=263 +%term ADDRFP=279 +%term ADDRLP=295 +%term ADDF=305 ADDI=309 ADDP=311 ADDU=310 +%term SUBF=321 SUBI=325 SUBP=327 SUBU=326 +%term LSHI=341 LSHU=342 +%term MODI=357 MODU=358 +%term RSHI=373 RSHU=374 +%term BANDI=389 BANDU=390 +%term BCOMI=405 BCOMU=406 +%term BORI=421 BORU=422 +%term BXORI=437 BXORU=438 +%term DIVF=449 DIVI=453 DIVU=454 +%term MULF=465 MULI=469 MULU=470 +%term EQF=481 EQI=485 EQU=486 +%term GEF=497 GEI=501 GEU=502 +%term GTF=513 GTI=517 GTU=518 +%term LEF=529 LEI=533 LEU=534 +%term LTF=545 LTI=549 LTU=550 +%term NEF=561 NEI=565 NEU=566 +%term JUMPV=584 +%term LABELV=600 +%% +stmt: INDIRB(P) "" +stmt: INDIRF(P) "" +stmt: INDIRI(P) "" +stmt: INDIRU(P) "" +stmt: INDIRP(P) "" +stmt: CALLF(P) "" +stmt: CALLI(P) "" +stmt: CALLU(P) "" +stmt: CALLP(P) "" +stmt: V "" +bogus: I "" 1 +bogus: U "" 1 +bogus: P "" 1 +bogus: F "" 1 +bogus: B "" 1 +bogus: V "" 1 +I: bogus "" 1 +U: bogus "" 1 +P: bogus "" 1 +F: bogus "" 1 +B: bogus "" 1 +V: bogus "" 1 +F: CNSTF "" +I: CNSTI "" +P: CNSTP "" +U: CNSTU "" +V: ARGB(B) "" +V: ARGF(F) "" +V: ARGI(I) "" +V: ARGU(U) "" +V: ARGP(P) "" +V: ASGNB(P,B) "" +V: ASGNF(P,F) "" +V: ASGNI(P,I) "" +V: ASGNU(P,U) "" +V: ASGNP(P,P) "" +B: INDIRB(P) "" +F: INDIRF(P) "" +I: INDIRI(P) "" +U: INDIRU(P) "" +P: INDIRP(P) "" +I: CVII(I) "" +I: CVUI(U) "" +I: CVFI(F) "" +U: CVIU(I) "" +U: CVUU(U) "" +U: CVPU(P) "" +F: CVIF(I) "" +F: CVFF(F) "" +P: CVUP(U) "" +P: CVPP(P) "" +F: NEGF(F) "" +I: NEGI(I) "" +V: CALLB(P,P) "" +F: CALLF(P) "" +I: CALLI(P) "" +U: CALLU(P) "" +P: CALLP(P) "" +V: CALLV(P) "" +V: RETF(F) "" +V: RETI(I) "" +V: RETU(U) "" +V: RETP(P) "" +V: RETV "" +P: ADDRGP "" +P: ADDRFP "" +P: ADDRLP "" +F: ADDF(F,F) "" +I: ADDI(I,I) "" +P: ADDP(P,I) "" +P: ADDP(I,P) "" +P: ADDP(U,P) "" +P: ADDP(P,U) "" +U: ADDU(U,U) "" +F: SUBF(F,F) "" +I: SUBI(I,I) "" +P: SUBP(P,I) "" +P: SUBP(P,U) "" +U: SUBU(U,U) "" +I: LSHI(I,I) "" +U: LSHU(U,I) "" +I: MODI(I,I) "" +U: MODU(U,U) "" +I: RSHI(I,I) "" +U: RSHU(U,I) "" +U: BANDU(U,U) "" +I: BANDI(I,I) "" +U: BCOMU(U) "" +I: BCOMI(I) "" +I: BORI(I,I) "" +U: BORU(U,U) "" +U: BXORU(U,U) "" +I: BXORI(I,I) "" +F: DIVF(F,F) "" +I: DIVI(I,I) "" +U: DIVU(U,U) "" +F: MULF(F,F) "" +I: MULI(I,I) "" +U: MULU(U,U) "" +V: EQF(F,F) "" +V: EQI(I,I) "" +V: EQU(U,U) "" +V: GEF(F,F) "" +V: GEI(I,I) "" +V: GEU(U,U) "" +V: GTF(F,F) "" +V: GTI(I,I) "" +V: GTU(U,U) "" +V: LEF(F,F) "" +V: LEI(I,I) "" +V: LEU(U,U) "" +V: LTF(F,F) "" +V: LTI(I,I) "" +V: LTU(U,U) "" +V: NEF(F,F) "" +V: NEI(I,I) "" +V: NEU(U,U) "" +V: JUMPV(P) "" +V: LABELV "" +%% + +static void reduce(NODEPTR_TYPE p, int goalnt) { + int i, sz = opsize(p->op), rulenumber = _rule(p->x.state, goalnt); + short *nts = _nts[rulenumber]; + NODEPTR_TYPE kids[10]; + + assert(rulenumber); + _kids(p, rulenumber, kids); + for (i = 0; nts[i]; i++) + reduce(kids[i], nts[i]); + switch (optype(p->op)) { +#define xx(ty) if (sz == ty->size) return + case I: + case U: + xx(chartype); + xx(shorttype); + xx(inttype); + xx(longtype); + xx(longlong); + break; + case F: + xx(floattype); + xx(doubletype); + xx(longdouble); + break; + case P: + xx(voidptype); + xx(funcptype); + break; + case V: + case B: if (sz == 0) return; +#undef xx + } + printdag(p, 2); + assert(0); +} + +void check(Node p) { + struct _state { short cost[1]; }; + + _label(p); + if (((struct _state *)p->x.state)->cost[1] > 0) { + printdag(p, 2); + assert(0); + } + reduce(p, 1); +} diff --git a/quake3/source/lcc/src/decl.c b/quake3/source/lcc/src/decl.c new file mode 100644 index 0000000..59e0850 --- /dev/null +++ b/quake3/source/lcc/src/decl.c @@ -0,0 +1,1160 @@ +#include "c.h" + + +#define add(x,n) (x > inttype->u.sym->u.limits.max.i-(n) ? (overflow=1,x) : x+(n)) +#define chkoverflow(x,n) ((void)add(x,n)) +#define bits2bytes(n) (((n) + 7)/8) +static int regcount; + +static List autos, registers; +Symbol cfunc; /* current function */ +Symbol retv; /* return value location for structs */ + +static void checkref(Symbol, void *); +static Symbol dclglobal(int, char *, Type, Coordinate *); +static Symbol dcllocal(int, char *, Type, Coordinate *); +static Symbol dclparam(int, char *, Type, Coordinate *); +static Type dclr(Type, char **, Symbol **, int); +static Type dclr1(char **, Symbol **, int); +static void decl(Symbol (*)(int, char *, Type, Coordinate *)); +extern void doconst(Symbol, void *); +static void doglobal(Symbol, void *); +static void doextern(Symbol, void *); +static void exitparams(Symbol []); +static void fields(Type); +static void funcdefn(int, char *, Type, Symbol [], Coordinate); +static void initglobal(Symbol, int); +static void oldparam(Symbol, void *); +static Symbol *parameters(Type); +static Type specifier(int *); +static Type structdcl(int); +static Type tnode(int, Type); +void program(void) { + int n; + + level = GLOBAL; + for (n = 0; t != EOI; n++) + if (kind[t] == CHAR || kind[t] == STATIC + || t == ID || t == '*' || t == '(') { + decl(dclglobal); + deallocate(STMT); + if (!(glevel >= 3 || xref)) + deallocate(FUNC); + } else if (t == ';') { + warning("empty declaration\n"); + t = gettok(); + } else { + error("unrecognized declaration\n"); + t = gettok(); + } + if (n == 0) + warning("empty input file\n"); +} +static Type specifier(int *sclass) { + int cls, cons, sign, size, type, vol; + Type ty = NULL; + + cls = vol = cons = sign = size = type = 0; + if (sclass == NULL) + cls = AUTO; + for (;;) { + int *p, tt = t; + switch (t) { + case AUTO: + case REGISTER: if (level <= GLOBAL && cls == 0) + error("invalid use of `%k'\n", t); + p = &cls; t = gettok(); break; + case STATIC: case EXTERN: + case TYPEDEF: p = &cls; t = gettok(); break; + case CONST: p = &cons; t = gettok(); break; + case VOLATILE: p = &vol; t = gettok(); break; + case SIGNED: + case UNSIGNED: p = &sign; t = gettok(); break; + case LONG: if (size == LONG) { + size = 0; + tt = LONG+LONG; + } + p = &size; t = gettok(); break; + case SHORT: p = &size; t = gettok(); break; + case VOID: case CHAR: case INT: case FLOAT: + case DOUBLE: p = &type; ty = tsym->type; + t = gettok(); break; + case ENUM: p = &type; ty = enumdcl(); break; + case STRUCT: + case UNION: p = &type; ty = structdcl(t); break; + case ID: + if (istypename(t, tsym) && type == 0 + && sign == 0 && size == 0) { + use(tsym, src); + ty = tsym->type; + if (isqual(ty) + && ty->size != ty->type->size) { + ty = unqual(ty); + if (isconst(tsym->type)) + ty = qual(CONST, ty); + if (isvolatile(tsym->type)) + ty = qual(VOLATILE, ty); + tsym->type = ty; + } + p = &type; + t = gettok(); + } else + p = NULL; + break; + default: p = NULL; + } + if (p == NULL) + break; + if (*p) + error("invalid use of `%k'\n", tt); + *p = tt; + } + if (sclass) + *sclass = cls; + if (type == 0) { + type = INT; + ty = inttype; + } + if (size == SHORT && type != INT + || size == LONG+LONG && type != INT + || size == LONG && type != INT && type != DOUBLE + || sign && type != INT && type != CHAR) + error("invalid type specification\n"); + if (type == CHAR && sign) + ty = sign == UNSIGNED ? unsignedchar : signedchar; + else if (size == SHORT) + ty = sign == UNSIGNED ? unsignedshort : shorttype; + else if (size == LONG && type == DOUBLE) + ty = longdouble; + else if (size == LONG+LONG) { + ty = sign == UNSIGNED ? unsignedlonglong : longlong; + if (Aflag >= 1) + warning("`%t' is a non-ANSI type\n", ty); + } else if (size == LONG) + ty = sign == UNSIGNED ? unsignedlong : longtype; + else if (sign == UNSIGNED && type == INT) + ty = unsignedtype; + if (cons == CONST) + ty = qual(CONST, ty); + if (vol == VOLATILE) + ty = qual(VOLATILE, ty); + return ty; +} +static void decl(Symbol (*dcl)(int, char *, Type, Coordinate *)) { + int sclass; + Type ty, ty1; + static char stop[] = { CHAR, STATIC, ID, 0 }; + + ty = specifier(&sclass); + if (t == ID || t == '*' || t == '(' || t == '[') { + char *id; + Coordinate pos; + id = NULL; + pos = src; + if (level == GLOBAL) { + Symbol *params = NULL; + ty1 = dclr(ty, &id, ¶ms, 0); + if (params && id && isfunc(ty1) + && (t == '{' || istypename(t, tsym) + || (kind[t] == STATIC && t != TYPEDEF))) { + if (sclass == TYPEDEF) { + error("invalid use of `typedef'\n"); + sclass = EXTERN; + } + if (ty1->u.f.oldstyle) + exitscope(); + funcdefn(sclass, id, ty1, params, pos); + return; + } else if (params) + exitparams(params); + } else + ty1 = dclr(ty, &id, NULL, 0); + for (;;) { + if (Aflag >= 1 && !hasproto(ty1)) + warning("missing prototype\n"); + if (id == NULL) + error("missing identifier\n"); + else if (sclass == TYPEDEF) + { + Symbol p = lookup(id, identifiers); + if (p && p->scope == level) + error("redeclaration of `%s'\n", id); + p = install(id, &identifiers, level, + level < LOCAL ? PERM : FUNC); + p->type = ty1; + p->sclass = TYPEDEF; + p->src = pos; + } + else + (void)(*dcl)(sclass, id, ty1, &pos); + if (t != ',') + break; + t = gettok(); + id = NULL; + pos = src; + ty1 = dclr(ty, &id, NULL, 0); + } + } else if (ty == NULL + || !(isenum(ty) || + isstruct(ty) && (*unqual(ty)->u.sym->name < '1' || *unqual(ty)->u.sym->name > '9'))) + error("empty declaration\n"); + test(';', stop); +} +static Symbol dclglobal(int sclass, char *id, Type ty, Coordinate *pos) { + Symbol p; + + if (sclass == 0) + sclass = AUTO; + else if (sclass != EXTERN && sclass != STATIC) { + error("invalid storage class `%k' for `%t %s'\n", + sclass, ty, id); + sclass = AUTO; + } + p = lookup(id, identifiers); + if (p && p->scope == GLOBAL) { + if (p->sclass != TYPEDEF && eqtype(ty, p->type, 1)) + ty = compose(ty, p->type); + else + error("redeclaration of `%s' previously declared at %w\n", p->name, &p->src); + + if (!isfunc(ty) && p->defined && t == '=') + error("redefinition of `%s' previously defined at %w\n", p->name, &p->src); + + if (p->sclass == EXTERN && sclass == STATIC + || p->sclass == STATIC && sclass == AUTO + || p->sclass == AUTO && sclass == STATIC) + warning("inconsistent linkage for `%s' previously declared at %w\n", p->name, &p->src); + + } + if (p == NULL || p->scope != GLOBAL) { + Symbol q = lookup(id, externals); + if (q) { + if (sclass == STATIC || !eqtype(ty, q->type, 1)) + warning("declaration of `%s' does not match previous declaration at %w\n", id, &q->src); + + p = relocate(id, externals, globals); + p->sclass = sclass; + } else { + p = install(id, &globals, GLOBAL, PERM); + p->sclass = sclass; + (*IR->defsymbol)(p); + } + if (p->sclass != STATIC) { + static int nglobals; + nglobals++; + if (Aflag >= 2 && nglobals == 512) + warning("more than 511 external identifiers\n"); + } + } else if (p->sclass == EXTERN) + p->sclass = sclass; + p->type = ty; + p->src = *pos; + if (t == '=' && isfunc(p->type)) { + error("illegal initialization for `%s'\n", p->name); + t = gettok(); + initializer(p->type, 0); + } else if (t == '=') { + initglobal(p, 0); + if (glevel > 0 && IR->stabsym) { + (*IR->stabsym)(p); swtoseg(p->u.seg); } + } else if (p->sclass == STATIC && !isfunc(p->type) + && p->type->size == 0) + error("undefined size for `%t %s'\n", p->type, p->name); + return p; +} +static void initglobal(Symbol p, int flag) { + Type ty; + + if (t == '=' || flag) { + if (p->sclass == STATIC) { + for (ty = p->type; isarray(ty); ty = ty->type) + ; + defglobal(p, isconst(ty) ? LIT : DATA); + } else + defglobal(p, DATA); + if (t == '=') + t = gettok(); + ty = initializer(p->type, 0); + if (isarray(p->type) && p->type->size == 0) + p->type = ty; + if (p->sclass == EXTERN) + p->sclass = AUTO; + } +} +void defglobal(Symbol p, int seg) { + p->u.seg = seg; + swtoseg(p->u.seg); + if (p->sclass != STATIC) + (*IR->export)(p); + (*IR->global)(p); + p->defined = 1; +} + +static Type dclr(Type basety, char **id, Symbol **params, int abstract) { + Type ty = dclr1(id, params, abstract); + + for ( ; ty; ty = ty->type) + switch (ty->op) { + case POINTER: + basety = ptr(basety); + break; + case FUNCTION: + basety = func(basety, ty->u.f.proto, + ty->u.f.oldstyle); + break; + case ARRAY: + basety = array(basety, ty->size, 0); + break; + case CONST: case VOLATILE: + basety = qual(ty->op, basety); + break; + default: assert(0); + } + if (Aflag >= 2 && basety->size > 32767) + warning("more than 32767 bytes in `%t'\n", basety); + return basety; +} +static Type tnode(int op, Type type) { + Type ty; + + NEW0(ty, STMT); + ty->op = op; + ty->type = type; + return ty; +} +static Type dclr1(char **id, Symbol **params, int abstract) { + Type ty = NULL; + + switch (t) { + case ID: if (id) + *id = token; + else + error("extraneous identifier `%s'\n", token); + t = gettok(); break; + case '*': t = gettok(); if (t == CONST || t == VOLATILE) { + Type ty1; + ty1 = ty = tnode(t, NULL); + while ((t = gettok()) == CONST || t == VOLATILE) + ty1 = tnode(t, ty1); + ty->type = dclr1(id, params, abstract); + ty = ty1; + } else + ty = dclr1(id, params, abstract); + ty = tnode(POINTER, ty); break; + case '(': t = gettok(); if (abstract + && (t == REGISTER || istypename(t, tsym) || t == ')')) { + Symbol *args; + ty = tnode(FUNCTION, ty); + enterscope(); + if (level > PARAM) + enterscope(); + args = parameters(ty); + exitparams(args); + } else { + ty = dclr1(id, params, abstract); + expect(')'); + if (abstract && ty == NULL + && (id == NULL || *id == NULL)) + return tnode(FUNCTION, NULL); + } break; + case '[': break; + default: return ty; + } + while (t == '(' || t == '[') + switch (t) { + case '(': t = gettok(); { Symbol *args; + ty = tnode(FUNCTION, ty); + enterscope(); + if (level > PARAM) + enterscope(); + args = parameters(ty); + if (params && *params == NULL) + *params = args; + else + exitparams(args); + } + break; + case '[': t = gettok(); { int n = 0; + if (kind[t] == ID) { + n = intexpr(']', 1); + if (n <= 0) { + error("`%d' is an illegal array size\n", n); + n = 1; + } + } else + expect(']'); + ty = tnode(ARRAY, ty); + ty->size = n; } break; + default: assert(0); + } + return ty; +} +static Symbol *parameters(Type fty) { + List list = NULL; + Symbol *params; + + if (kind[t] == STATIC || istypename(t, tsym)) { + int n = 0; + Type ty1 = NULL; + for (;;) { + Type ty; + int sclass = 0; + char *id = NULL; + if (ty1 && t == ELLIPSIS) { + static struct symbol sentinel; + if (sentinel.type == NULL) { + sentinel.type = voidtype; + sentinel.defined = 1; + } + if (ty1 == voidtype) + error("illegal formal parameter types\n"); + list = append(&sentinel, list); + t = gettok(); + break; + } + if (!istypename(t, tsym) && t != REGISTER) + error("missing parameter type\n"); + n++; + ty = dclr(specifier(&sclass), &id, NULL, 1); + if ( ty == voidtype && (ty1 || id) + || ty1 == voidtype) + error("illegal formal parameter types\n"); + if (id == NULL) + id = stringd(n); + if (ty != voidtype) + list = append(dclparam(sclass, id, ty, &src), list); + if (Aflag >= 1 && !hasproto(ty)) + warning("missing prototype\n"); + if (ty1 == NULL) + ty1 = ty; + if (t != ',') + break; + t = gettok(); + } + fty->u.f.proto = newarray(length(list) + 1, + sizeof (Type *), PERM); + params = ltov(&list, FUNC); + for (n = 0; params[n]; n++) + fty->u.f.proto[n] = params[n]->type; + fty->u.f.proto[n] = NULL; + fty->u.f.oldstyle = 0; + } else { + if (t == ID) + for (;;) { + Symbol p; + if (t != ID) { + error("expecting an identifier\n"); + break; + } + p = dclparam(0, token, inttype, &src); + p->defined = 0; + list = append(p, list); + t = gettok(); + if (t != ',') + break; + t = gettok(); + } + params = ltov(&list, FUNC); + fty->u.f.proto = NULL; + fty->u.f.oldstyle = 1; + } + if (t != ')') { + static char stop[] = { CHAR, STATIC, IF, ')', 0 }; + expect(')'); + skipto('{', stop); + } + if (t == ')') + t = gettok(); + return params; +} +static void exitparams(Symbol params[]) { + assert(params); + if (params[0] && !params[0]->defined) + error("extraneous old-style parameter list\n"); + if (level > PARAM) + exitscope(); + exitscope(); +} + +static Symbol dclparam(int sclass, char *id, Type ty, Coordinate *pos) { + Symbol p; + + if (isfunc(ty)) + ty = ptr(ty); + else if (isarray(ty)) + ty = atop(ty); + if (sclass == 0) + sclass = AUTO; + else if (sclass != REGISTER) { + error("invalid storage class `%k' for `%t%s\n", + sclass, ty, stringf(id ? " %s'" : "' parameter", id)); + sclass = AUTO; + } else if (isvolatile(ty) || isstruct(ty)) { + warning("register declaration ignored for `%t%s\n", + ty, stringf(id ? " %s'" : "' parameter", id)); + sclass = AUTO; + } + + p = lookup(id, identifiers); + if (p && p->scope == level) + error("duplicate declaration for `%s' previously declared at %w\n", id, &p->src); + + else + p = install(id, &identifiers, level, FUNC); + p->sclass = sclass; + p->src = *pos; + p->type = ty; + p->defined = 1; + if (t == '=') { + error("illegal initialization for parameter `%s'\n", id); + t = gettok(); + (void)expr1(0); + } + return p; +} +static Type structdcl(int op) { + char *tag; + Type ty; + Symbol p; + Coordinate pos; + + t = gettok(); + pos = src; + if (t == ID) { + tag = token; + t = gettok(); + } else + tag = ""; + if (t == '{') { + static char stop[] = { IF, ',', 0 }; + ty = newstruct(op, tag); + ty->u.sym->src = pos; + ty->u.sym->defined = 1; + t = gettok(); + if (istypename(t, tsym)) + fields(ty); + else + error("invalid %k field declarations\n", op); + test('}', stop); + } + else if (*tag && (p = lookup(tag, types)) != NULL + && p->type->op == op) { + ty = p->type; + if (t == ';' && p->scope < level) + ty = newstruct(op, tag); + } + else { + if (*tag == 0) + error("missing %k tag\n", op); + ty = newstruct(op, tag); + } + if (*tag && xref) + use(ty->u.sym, pos); + return ty; +} +static void fields(Type ty) { + { int n = 0; + while (istypename(t, tsym)) { + static char stop[] = { IF, CHAR, '}', 0 }; + Type ty1 = specifier(NULL); + for (;;) { + Field p; + char *id = NULL; + Type fty = dclr(ty1, &id, NULL, 0); + p = newfield(id, ty, fty); + if (Aflag >= 1 && !hasproto(p->type)) + warning("missing prototype\n"); + if (t == ':') { + if (unqual(p->type) != inttype + && unqual(p->type) != unsignedtype) { + error("`%t' is an illegal bit-field type\n", + p->type); + p->type = inttype; + } + t = gettok(); + p->bitsize = intexpr(0, 0); + if (p->bitsize > 8*inttype->size || p->bitsize < 0) { + error("`%d' is an illegal bit-field size\n", + p->bitsize); + p->bitsize = 8*inttype->size; + } else if (p->bitsize == 0 && id) { + warning("extraneous 0-width bit field `%t %s' ignored\n", p->type, id); + + p->name = stringd(genlabel(1)); + } + p->lsb = 1; + } + else { + if (id == NULL) + error("field name missing\n"); + else if (isfunc(p->type)) + error("`%t' is an illegal field type\n", p->type); + else if (p->type->size == 0) + error("undefined size for field `%t %s'\n", + p->type, id); + } + if (isconst(p->type)) + ty->u.sym->u.s.cfields = 1; + if (isvolatile(p->type)) + ty->u.sym->u.s.vfields = 1; + n++; + if (Aflag >= 2 && n == 128) + warning("more than 127 fields in `%t'\n", ty); + if (t != ',') + break; + t = gettok(); + } + test(';', stop); + } } + { int bits = 0, off = 0, overflow = 0; + Field p, *q = &ty->u.sym->u.s.flist; + ty->align = IR->structmetric.align; + for (p = *q; p; p = p->link) { + int a = p->type->align ? p->type->align : 1; + if (p->lsb) + a = unsignedtype->align; + if (ty->op == UNION) + off = bits = 0; + else if (p->bitsize == 0 || bits == 0 + || bits - 1 + p->bitsize > 8*unsignedtype->size) { + off = add(off, bits2bytes(bits-1)); + bits = 0; + chkoverflow(off, a - 1); + off = roundup(off, a); + } + if (a > ty->align) + ty->align = a; + p->offset = off; + + if (p->lsb) { + if (bits == 0) + bits = 1; + if (IR->little_endian) + p->lsb = bits; + else + p->lsb = 8*unsignedtype->size - bits + 1 + - p->bitsize + 1; + bits += p->bitsize; + } else + off = add(off, p->type->size); + if (off + bits2bytes(bits-1) > ty->size) + ty->size = off + bits2bytes(bits-1); + if (p->name == NULL + || !('1' <= *p->name && *p->name <= '9')) { + *q = p; + q = &p->link; + } + } + *q = NULL; + chkoverflow(ty->size, ty->align - 1); + ty->size = roundup(ty->size, ty->align); + if (overflow) { + error("size of `%t' exceeds %d bytes\n", ty, inttype->u.sym->u.limits.max.i); + ty->size = inttype->u.sym->u.limits.max.i&(~(ty->align - 1)); + } } +} +static void funcdefn(int sclass, char *id, Type ty, Symbol params[], Coordinate pt) { + int i, n; + Symbol *callee, *caller, p; + Type rty = freturn(ty); + + if (isstruct(rty) && rty->size == 0) + error("illegal use of incomplete type `%t'\n", rty); + for (n = 0; params[n]; n++) + ; + if (n > 0 && params[n-1]->name == NULL) + params[--n] = NULL; + if (Aflag >= 2 && n > 31) + warning("more than 31 parameters in function `%s'\n", id); + if (ty->u.f.oldstyle) { + if (Aflag >= 1) + warning("old-style function definition for `%s'\n", id); + caller = params; + callee = newarray(n + 1, sizeof *callee, FUNC); + memcpy(callee, caller, (n+1)*sizeof *callee); + enterscope(); + assert(level == PARAM); + while (kind[t] == STATIC || istypename(t, tsym)) + decl(dclparam); + foreach(identifiers, PARAM, oldparam, callee); + + for (i = 0; (p = callee[i]) != NULL; i++) { + if (!p->defined) + callee[i] = dclparam(0, p->name, inttype, &p->src); + *caller[i] = *p; + caller[i]->sclass = AUTO; + caller[i]->type = promote(p->type); + } + p = lookup(id, identifiers); + if (p && p->scope == GLOBAL && isfunc(p->type) + && p->type->u.f.proto) { + Type *proto = p->type->u.f.proto; + for (i = 0; caller[i] && proto[i]; i++) { + Type ty = unqual(proto[i]); + if (eqtype(isenum(ty) ? ty->type : ty, + unqual(caller[i]->type), 1) == 0) + break; + else if (isenum(ty) && !isenum(unqual(caller[i]->type))) + warning("compatibility of `%t' and `%t' is compiler dependent\n", + proto[i], caller[i]->type); + } + if (proto[i] || caller[i]) + error("conflicting argument declarations for function `%s'\n", id); + + } + else { + Type *proto = newarray(n + 1, sizeof *proto, PERM); + if (Aflag >= 1) + warning("missing prototype for `%s'\n", id); + for (i = 0; i < n; i++) + proto[i] = caller[i]->type; + proto[i] = NULL; + ty = func(rty, proto, 1); + } + } else { + callee = params; + caller = newarray(n + 1, sizeof *caller, FUNC); + for (i = 0; (p = callee[i]) != NULL && p->name; i++) { + NEW(caller[i], FUNC); + *caller[i] = *p; + if (isint(p->type)) + caller[i]->type = promote(p->type); + caller[i]->sclass = AUTO; + if ('1' <= *p->name && *p->name <= '9') + error("missing name for parameter %d to function `%s'\n", i + 1, id); + + } + caller[i] = NULL; + } + for (i = 0; (p = callee[i]) != NULL; i++) + if (p->type->size == 0) { + error("undefined size for parameter `%t %s'\n", + p->type, p->name); + caller[i]->type = p->type = inttype; + } + if (Aflag >= 2 && sclass != STATIC && strcmp(id, "main") == 0) { + if (ty->u.f.oldstyle) + warning("`%t %s()' is a non-ANSI definition\n", rty, id); + else if (!(rty == inttype + && (n == 0 && callee[0] == NULL + || n == 2 && callee[0]->type == inttype + && isptr(callee[1]->type) && callee[1]->type->type == charptype + && !variadic(ty)))) + warning("`%s' is a non-ANSI definition\n", typestring(ty, id)); + } + p = lookup(id, identifiers); + if (p && isfunc(p->type) && p->defined) + error("redefinition of `%s' previously defined at %w\n", + p->name, &p->src); + cfunc = dclglobal(sclass, id, ty, &pt); + cfunc->u.f.label = genlabel(1); + cfunc->u.f.callee = callee; + cfunc->u.f.pt = src; + cfunc->defined = 1; + if (xref) + use(cfunc, cfunc->src); + if (Pflag) + printproto(cfunc, cfunc->u.f.callee); + if (ncalled >= 0) + ncalled = findfunc(cfunc->name, pt.file); + labels = table(NULL, LABELS); + stmtlabs = table(NULL, LABELS); + refinc = 1.0; + regcount = 0; + codelist = &codehead; + codelist->next = NULL; + if (!IR->wants_callb && isstruct(rty)) + retv = genident(AUTO, ptr(rty), PARAM); + compound(0, NULL, 0); + + { + Code cp; + for (cp = codelist; cp->kind < Label; cp = cp->prev) + ; + if (cp->kind != Jump) { + if (rty != voidtype) { + warning("missing return value\n"); + retcode(cnsttree(inttype, 0L)); + } else + retcode(NULL); + } + } + definelab(cfunc->u.f.label); + if (events.exit) + apply(events.exit, cfunc, NULL); + walk(NULL, 0, 0); + exitscope(); + assert(level == PARAM); + foreach(identifiers, level, checkref, NULL); + if (!IR->wants_callb && isstruct(rty)) { + Symbol *a; + a = newarray(n + 2, sizeof *a, FUNC); + a[0] = retv; + memcpy(&a[1], callee, (n+1)*sizeof *callee); + callee = a; + a = newarray(n + 2, sizeof *a, FUNC); + NEW(a[0], FUNC); + *a[0] = *retv; + memcpy(&a[1], caller, (n+1)*sizeof *callee); + caller = a; + } + if (!IR->wants_argb) + for (i = 0; caller[i]; i++) + if (isstruct(caller[i]->type)) { + caller[i]->type = ptr(caller[i]->type); + callee[i]->type = ptr(callee[i]->type); + caller[i]->structarg = callee[i]->structarg = 1; + } + if (glevel > 1) for (i = 0; callee[i]; i++) callee[i]->sclass = AUTO; + if (cfunc->sclass != STATIC) + (*IR->export)(cfunc); + if (glevel && IR->stabsym) { + swtoseg(CODE); (*IR->stabsym)(cfunc); } + swtoseg(CODE); + (*IR->function)(cfunc, caller, callee, cfunc->u.f.ncalls); + if (glevel && IR->stabfend) + (*IR->stabfend)(cfunc, lineno); + foreach(stmtlabs, LABELS, checklab, NULL); + exitscope(); + expect('}'); + labels = stmtlabs = NULL; + retv = NULL; + cfunc = NULL; +} +static void oldparam(Symbol p, void *cl) { + int i; + Symbol *callee = cl; + + for (i = 0; callee[i]; i++) + if (p->name == callee[i]->name) { + callee[i] = p; + return; + } + error("declared parameter `%s' is missing\n", p->name); +} +void compound(int loop, struct swtch *swp, int lev) { + Code cp; + int nregs; + + walk(NULL, 0, 0); + cp = code(Blockbeg); + enterscope(); + assert(level >= LOCAL); + if (level == LOCAL && events.entry) + apply(events.entry, cfunc, NULL); + definept(NULL); + expect('{'); + autos = registers = NULL; + if (level == LOCAL && IR->wants_callb + && isstruct(freturn(cfunc->type))) { + retv = genident(AUTO, ptr(freturn(cfunc->type)), level); + retv->defined = 1; + retv->ref = 1; + registers = append(retv, registers); + } + while (kind[t] == CHAR || kind[t] == STATIC + || istypename(t, tsym) && getchr() != ':') + decl(dcllocal); + { + int i; + Symbol *a = ltov(&autos, STMT); + nregs = length(registers); + for (i = 0; a[i]; i++) + registers = append(a[i], registers); + cp->u.block.locals = ltov(®isters, FUNC); + } + if (events.blockentry) + apply(events.blockentry, cp->u.block.locals, NULL); + while (kind[t] == IF || kind[t] == ID) + statement(loop, swp, lev); + walk(NULL, 0, 0); + foreach(identifiers, level, checkref, NULL); + { + int i = nregs, j; + Symbol p; + for ( ; (p = cp->u.block.locals[i]) != NULL; i++) { + for (j = i; j > nregs + && cp->u.block.locals[j-1]->ref < p->ref; j--) + cp->u.block.locals[j] = cp->u.block.locals[j-1]; + cp->u.block.locals[j] = p; + } + } + if (events.blockexit) + apply(events.blockexit, cp->u.block.locals, NULL); + cp->u.block.level = level; + cp->u.block.identifiers = identifiers; + cp->u.block.types = types; + code(Blockend)->u.begin = cp; + if (reachable(Gen)) + definept(NULL); + if (level > LOCAL) { + exitscope(); + expect('}'); + } +} +static void checkref(Symbol p, void *cl) { + if (p->scope >= PARAM + && (isvolatile(p->type) || isfunc(p->type))) + p->addressed = 1; + if (Aflag >= 2 && p->defined && p->ref == 0) { + if (p->sclass == STATIC) + warning("static `%t %s' is not referenced\n", + p->type, p->name); + else if (p->scope == PARAM) + warning("parameter `%t %s' is not referenced\n", + p->type, p->name); + else if (p->scope >= LOCAL && p->sclass != EXTERN) + warning("local `%t %s' is not referenced\n", + p->type, p->name); + } + if (p->sclass == AUTO + && (p->scope == PARAM && regcount == 0 + || p->scope >= LOCAL) + && !p->addressed && isscalar(p->type) && p->ref >= 3.0) + p->sclass = REGISTER; + if (level == GLOBAL && p->sclass == STATIC && !p->defined + && isfunc(p->type) && p->ref) + error("undefined static `%t %s'\n", p->type, p->name); + assert(!(level == GLOBAL && p->sclass == STATIC && !p->defined && !isfunc(p->type))); +} +static Symbol dcllocal(int sclass, char *id, Type ty, Coordinate *pos) { + Symbol p, q; + + if (sclass == 0) + sclass = isfunc(ty) ? EXTERN : AUTO; + else if (isfunc(ty) && sclass != EXTERN) { + error("invalid storage class `%k' for `%t %s'\n", + sclass, ty, id); + sclass = EXTERN; + } else if (sclass == REGISTER + && (isvolatile(ty) || isstruct(ty) || isarray(ty))) { + warning("register declaration ignored for `%t %s'\n", + ty, id); + sclass = AUTO; + } + q = lookup(id, identifiers); + if (q && q->scope >= level + || q && q->scope == PARAM && level == LOCAL) + if (sclass == EXTERN && q->sclass == EXTERN + && eqtype(q->type, ty, 1)) + ty = compose(ty, q->type); + else + error("redeclaration of `%s' previously declared at %w\n", q->name, &q->src); + + assert(level >= LOCAL); + p = install(id, &identifiers, level, sclass == STATIC || sclass == EXTERN ? PERM : FUNC); + p->type = ty; + p->sclass = sclass; + p->src = *pos; + switch (sclass) { + case EXTERN: q = lookup(id, globals); + if (q == NULL || q->sclass == TYPEDEF || q->sclass == ENUM) { + q = lookup(id, externals); + if (q == NULL) { + q = install(p->name, &externals, GLOBAL, PERM); + q->type = p->type; + q->sclass = EXTERN; + q->src = src; + (*IR->defsymbol)(q); + } + } + if (!eqtype(p->type, q->type, 1)) + warning("declaration of `%s' does not match previous declaration at %w\n", q->name, &q->src); + + p->u.alias = q; break; + case STATIC: (*IR->defsymbol)(p); + initglobal(p, 0); + if (!p->defined) + if (p->type->size > 0) { + defglobal(p, BSS); + (*IR->space)(p->type->size); + } else + error("undefined size for `%t %s'\n", + p->type, p->name); + p->defined = 1; break; + case REGISTER: registers = append(p, registers); + regcount++; + p->defined = 1; + break; + case AUTO: autos = append(p, autos); + p->defined = 1; break; + default: assert(0); + } + if (t == '=') { + Tree e; + if (sclass == EXTERN) + error("illegal initialization of `extern %s'\n", id); + t = gettok(); + definept(NULL); + if (isscalar(p->type) + || isstruct(p->type) && t != '{') { + if (t == '{') { + t = gettok(); + e = expr1(0); + expect('}'); + } else + e = expr1(0); + } else { + Symbol t1; + Type ty = p->type, ty1 = ty; + while (isarray(ty1)) + ty1 = ty1->type; + if (!isconst(ty) && (!isarray(ty) || !isconst(ty1))) + ty = qual(CONST, ty); + t1 = genident(STATIC, ty, GLOBAL); + initglobal(t1, 1); + if (isarray(p->type) && p->type->size == 0 + && t1->type->size > 0) + p->type = array(p->type->type, + t1->type->size/t1->type->type->size, 0); + e = idtree(t1); + } + walk(root(asgn(p, e)), 0, 0); + p->ref = 1; + } + if (!isfunc(p->type) && p->defined && p->type->size <= 0) + error("undefined size for `%t %s'\n", p->type, id); + return p; +} +void finalize(void) { + foreach(externals, GLOBAL, doextern, NULL); + foreach(identifiers, GLOBAL, doglobal, NULL); + foreach(identifiers, GLOBAL, checkref, NULL); + foreach(constants, CONSTANTS, doconst, NULL); +} +static void doextern(Symbol p, void *cl) { + (*IR->import)(p); +} +static void doglobal(Symbol p, void *cl) { + if (!p->defined && (p->sclass == EXTERN + || isfunc(p->type) && p->sclass == AUTO)) + (*IR->import)(p); + else if (!p->defined && !isfunc(p->type) + && (p->sclass == AUTO || p->sclass == STATIC)) { + if (isarray(p->type) + && p->type->size == 0 && p->type->type->size > 0) + p->type = array(p->type->type, 1, 0); + if (p->type->size > 0) { + defglobal(p, BSS); + (*IR->space)(p->type->size); + if (glevel > 0 && IR->stabsym) + (*IR->stabsym)(p); + } else + error("undefined size for `%t %s'\n", + p->type, p->name); + p->defined = 1; + } + if (Pflag + && !isfunc(p->type) + && !p->generated && p->sclass != EXTERN) + printdecl(p, p->type); +} +void doconst(Symbol p, void *cl) { + if (p->u.c.loc) { + assert(p->u.c.loc->u.seg == 0); + defglobal(p->u.c.loc, LIT); + if (isarray(p->type) && p->type->type == widechar) { + unsigned int *s = p->u.c.v.p; + int n = p->type->size/widechar->size; + while (n-- > 0) { + Value v; + v.u = *s++; + (*IR->defconst)(widechar->op, widechar->size, v); + } + } else if (isarray(p->type)) + (*IR->defstring)(p->type->size, p->u.c.v.p); + else + (*IR->defconst)(p->type->op, p->type->size, p->u.c.v); + p->u.c.loc = NULL; + } +} +void checklab(Symbol p, void *cl) { + if (!p->defined) + error("undefined label `%s'\n", p->name); + p->defined = 1; +} + +Type enumdcl(void) { + char *tag; + Type ty; + Symbol p; + Coordinate pos; + + t = gettok(); + pos = src; + if (t == ID) { + tag = token; + t = gettok(); + } else + tag = ""; + if (t == '{') { + static char follow[] = { IF, 0 }; + int n = 0; + long k = -1; + List idlist = 0; + ty = newstruct(ENUM, tag); + t = gettok(); + if (t != ID) + error("expecting an enumerator identifier\n"); + while (t == ID) { + char *id = token; + Coordinate s; + if (tsym && tsym->scope == level) + error("redeclaration of `%s' previously declared at %w\n", + token, &tsym->src); + s = src; + t = gettok(); + if (t == '=') { + t = gettok(); + k = intexpr(0, 0); + } else { + if (k == inttype->u.sym->u.limits.max.i) + error("overflow in value for enumeration constant `%s'\n", id); + k++; + } + p = install(id, &identifiers, level, level < LOCAL ? PERM : FUNC); + p->src = s; + p->type = ty; + p->sclass = ENUM; + p->u.value = k; + idlist = append(p, idlist); + n++; + if (Aflag >= 2 && n == 128) + warning("more than 127 enumeration constants in `%t'\n", ty); + if (t != ',') + break; + t = gettok(); + if (Aflag >= 2 && t == '}') + warning("non-ANSI trailing comma in enumerator list\n"); + } + test('}', follow); + ty->type = inttype; + ty->size = ty->type->size; + ty->align = ty->type->align; + ty->u.sym->u.idlist = ltov(&idlist, PERM); + ty->u.sym->defined = 1; + } else if ((p = lookup(tag, types)) != NULL && p->type->op == ENUM) { + ty = p->type; + if (t == ';') + error("empty declaration\n"); + } else { + error("unknown enumeration `%s'\n", tag); + ty = newstruct(ENUM, tag); + ty->type = inttype; + } + if (*tag && xref) + use(p, pos); + return ty; +} + +Type typename(void) { + Type ty = specifier(NULL); + + if (t == '*' || t == '(' || t == '[') { + ty = dclr(ty, NULL, NULL, 1); + if (Aflag >= 1 && !hasproto(ty)) + warning("missing prototype\n"); + } + return ty; +} + diff --git a/quake3/source/lcc/src/enode.c b/quake3/source/lcc/src/enode.c new file mode 100644 index 0000000..a81c632 --- /dev/null +++ b/quake3/source/lcc/src/enode.c @@ -0,0 +1,543 @@ +#include "c.h" + + +static Tree addtree(int, Tree, Tree); +static Tree andtree(int, Tree, Tree); +static Tree cmptree(int, Tree, Tree); +static int compatible(Type, Type); +static int isnullptr(Tree e); +static Tree multree(int, Tree, Tree); +static Tree subtree(int, Tree, Tree); +#define isvoidptr(ty) \ + (isptr(ty) && unqual(ty->type) == voidtype) + +Tree (*optree[])(int, Tree, Tree) = { +#define xx(a,b,c,d,e,f,g) e, +#define yy(a,b,c,d,e,f,g) e, +#include "token.h" +}; +Tree call(Tree f, Type fty, Coordinate src) { + int n = 0; + Tree args = NULL, r = NULL, e; + Type *proto, rty = unqual(freturn(fty)); + Symbol t3 = NULL; + + if (fty->u.f.oldstyle) + proto = NULL; + else + proto = fty->u.f.proto; + if (hascall(f)) + r = f; + if (isstruct(rty)) + { + t3 = temporary(AUTO, unqual(rty)); + if (rty->size == 0) + error("illegal use of incomplete type `%t'\n", rty); + } + if (t != ')') + for (;;) { + Tree q = pointer(expr1(0)); + if (proto && *proto && *proto != voidtype) + { + Type aty; + q = value(q); + aty = assign(*proto, q); + if (aty) + q = cast(q, aty); + else + error("type error in argument %d to %s; found `%t' expected `%t'\n", n + 1, funcname(f), + + q->type, *proto); + if ((isint(q->type) || isenum(q->type)) + && q->type->size != inttype->size) + q = cast(q, promote(q->type)); + ++proto; + } + else + { + if (!fty->u.f.oldstyle && *proto == NULL) + error("too many arguments to %s\n", funcname(f)); + q = value(q); + if (isarray(q->type) || q->type->size == 0) + error("type error in argument %d to %s; `%t' is illegal\n", n + 1, funcname(f), q->type); + + else + q = cast(q, promote(q->type)); + } + if (!IR->wants_argb && isstruct(q->type)) + if (iscallb(q)) + q = addrof(q); + else { + Symbol t1 = temporary(AUTO, unqual(q->type)); + q = asgn(t1, q); + q = tree(RIGHT, ptr(t1->type), + root(q), lvalue(idtree(t1))); + } + if (q->type->size == 0) + q->type = inttype; + if (hascall(q)) + r = r ? tree(RIGHT, voidtype, r, q) : q; + args = tree(mkop(ARG, q->type), q->type, q, args); + n++; + if (Aflag >= 2 && n == 32) + warning("more than 31 arguments in a call to %s\n", + funcname(f)); + if (t != ',') + break; + t = gettok(); + } + expect(')'); + if (proto && *proto && *proto != voidtype) + error("insufficient number of arguments to %s\n", + funcname(f)); + if (r) + args = tree(RIGHT, voidtype, r, args); + e = calltree(f, rty, args, t3); + if (events.calls) + apply(events.calls, &src, &e); + return e; +} +Tree calltree(Tree f, Type ty, Tree args, Symbol t3) { + Tree p; + + if (args) + f = tree(RIGHT, f->type, args, f); + if (isstruct(ty)) + assert(t3), + p = tree(RIGHT, ty, + tree(CALL+B, ty, f, addrof(idtree(t3))), + idtree(t3)); + else { + Type rty = ty; + if (isenum(ty)) + rty = unqual(ty)->type; + if (!isfloat(rty)) + rty = promote(rty); + p = tree(mkop(CALL, rty), rty, f, NULL); + if (isptr(ty) || p->type->size > ty->size) + p = cast(p, ty); + } + return p; +} +Tree vcall(Symbol func, Type ty, ...) { + va_list ap; + Tree args = NULL, e, f = pointer(idtree(func)), r = NULL; + + assert(isfunc(func->type)); + if (ty == NULL) + ty = freturn(func->type); + va_start(ap, ty); + while ((e = va_arg(ap, Tree)) != NULL) { + if (hascall(e)) + r = r == NULL ? e : tree(RIGHT, voidtype, r, e); + args = tree(mkop(ARG, e->type), e->type, e, args); + } + va_end(ap); + if (r != NULL) + args = tree(RIGHT, voidtype, r, args); + return calltree(f, ty, args, NULL); +} +int iscallb(Tree e) { + return e->op == RIGHT && e->kids[0] && e->kids[1] + && e->kids[0]->op == CALL+B + && e->kids[1]->op == INDIR+B + && isaddrop(e->kids[1]->kids[0]->op) + && e->kids[1]->kids[0]->u.sym->temporary; +} + +static Tree addtree(int op, Tree l, Tree r) { + Type ty = inttype; + + if (isarith(l->type) && isarith(r->type)) { + ty = binary(l->type, r->type); + l = cast(l, ty); + r = cast(r, ty); + } else if (isptr(l->type) && isint(r->type)) + return addtree(ADD, r, l); + else if ( isptr(r->type) && isint(l->type) + && !isfunc(r->type->type)) + { + long n; + ty = unqual(r->type); + n = unqual(ty->type)->size; + if (n == 0) + error("unknown size for type `%t'\n", ty->type); + l = cast(l, promote(l->type)); + if (n > 1) + l = multree(MUL, cnsttree(signedptr, n), l); + if (YYcheck && !isaddrop(r->op)) /* omit */ + return nullcall(ty, YYcheck, r, l); /* omit */ + return simplify(ADD, ty, l, r); + } + + else + typeerror(op, l, r); + return simplify(op, ty, l, r); +} + +Tree cnsttree(Type ty, ...) { + Tree p = tree(mkop(CNST,ty), ty, NULL, NULL); + va_list ap; + + va_start(ap, ty); + switch (ty->op) { + case INT: p->u.v.i = va_arg(ap, long); break; + case UNSIGNED:p->u.v.u = va_arg(ap, unsigned long)&ones(8*ty->size); break; + case FLOAT: p->u.v.d = va_arg(ap, long double); break; + case POINTER: p->u.v.p = va_arg(ap, void *); break; + default: assert(0); + } + va_end(ap); + return p; +} + +Tree consttree(unsigned n, Type ty) { + if (isarray(ty)) + ty = atop(ty); + else assert(isint(ty)); + return cnsttree(ty, (unsigned long)n); +} +static Tree cmptree(int op, Tree l, Tree r) { + Type ty; + + if (isarith(l->type) && isarith(r->type)) { + ty = binary(l->type, r->type); + l = cast(l, ty); + r = cast(r, ty); + } else if (compatible(l->type, r->type)) { + ty = unsignedptr; + l = cast(l, ty); + r = cast(r, ty); + } else { + ty = unsignedtype; + typeerror(op, l, r); + } + return simplify(mkop(op,ty), inttype, l, r); +} +static int compatible(Type ty1, Type ty2) { + return isptr(ty1) && !isfunc(ty1->type) + && isptr(ty2) && !isfunc(ty2->type) + && eqtype(unqual(ty1->type), unqual(ty2->type), 0); +} +static int isnullptr(Tree e) { + Type ty = unqual(e->type); + + return generic(e->op) == CNST + && (ty->op == INT && e->u.v.i == 0 + || ty->op == UNSIGNED && e->u.v.u == 0 + || isvoidptr(ty) && e->u.v.p == NULL); +} +Tree eqtree(int op, Tree l, Tree r) { + Type xty = l->type, yty = r->type; + + if (isptr(xty) && isnullptr(r) + || isptr(xty) && !isfunc(xty->type) && isvoidptr(yty) + || (isptr(xty) && isptr(yty) + && eqtype(unqual(xty->type), unqual(yty->type), 1))) { + Type ty = unsignedptr; + l = cast(l, ty); + r = cast(r, ty); + return simplify(mkop(op,ty), inttype, l, r); + } + if (isptr(yty) && isnullptr(l) + || isptr(yty) && !isfunc(yty->type) && isvoidptr(xty)) + return eqtree(op, r, l); + return cmptree(op, l, r); +} + +Type assign(Type xty, Tree e) { + Type yty = unqual(e->type); + + xty = unqual(xty); + if (isenum(xty)) + xty = xty->type; + if (xty->size == 0 || yty->size == 0) + return NULL; + if ( isarith(xty) && isarith(yty) + || isstruct(xty) && xty == yty) + return xty; + if (isptr(xty) && isnullptr(e)) + return xty; + if ((isvoidptr(xty) && isptr(yty) + || isptr(xty) && isvoidptr(yty)) + && ( (isconst(xty->type) || !isconst(yty->type)) + && (isvolatile(xty->type) || !isvolatile(yty->type)))) + return xty; + + if ((isptr(xty) && isptr(yty) + && eqtype(unqual(xty->type), unqual(yty->type), 1)) + && ( (isconst(xty->type) || !isconst(yty->type)) + && (isvolatile(xty->type) || !isvolatile(yty->type)))) + return xty; + if (isptr(xty) && isptr(yty) + && ( (isconst(xty->type) || !isconst(yty->type)) + && (isvolatile(xty->type) || !isvolatile(yty->type)))) { + Type lty = unqual(xty->type), rty = unqual(yty->type); + if (isenum(lty) && rty == inttype + || isenum(rty) && lty == inttype) { + if (Aflag >= 1) + warning("assignment between `%t' and `%t' is compiler-dependent\n", + xty, yty); + return xty; + } + } + return NULL; +} +Tree asgntree(int op, Tree l, Tree r) { + Type aty, ty; + + r = pointer(r); + ty = assign(l->type, r); + if (ty) + r = cast(r, ty); + else { + typeerror(ASGN, l, r); + if (r->type == voidtype) + r = retype(r, inttype); + ty = r->type; + } + if (l->op != FIELD) + l = lvalue(l); + aty = l->type; + if (isptr(aty)) + aty = unqual(aty)->type; + if ( isconst(aty) + || isstruct(aty) && unqual(aty)->u.sym->u.s.cfields) + if (isaddrop(l->op) + && !l->u.sym->computed && !l->u.sym->generated) + error("assignment to const identifier `%s'\n", + l->u.sym->name); + else + error("assignment to const location\n"); + if (l->op == FIELD) { + long n = 8*l->u.field->type->size - fieldsize(l->u.field); + if (n > 0 && isunsigned(l->u.field->type)) + r = bittree(BAND, r, + cnsttree(r->type, (unsigned long)fieldmask(l->u.field))); + else if (n > 0) { + if (r->op == CNST+I) { + n = r->u.v.i; + if (n&(1<<(fieldsize(l->u.field)-1))) + n |= ~0UL<u.field); + r = cnsttree(r->type, n); + } else + r = shtree(RSH, + shtree(LSH, r, cnsttree(inttype, n)), + cnsttree(inttype, n)); + } + } + if (isstruct(ty) && isaddrop(l->op) && iscallb(r)) + return tree(RIGHT, ty, + tree(CALL+B, ty, r->kids[0]->kids[0], l), + idtree(l->u.sym)); + return tree(mkop(op,ty), ty, l, r); +} +Tree condtree(Tree e, Tree l, Tree r) { + Symbol t1; + Type ty, xty = l->type, yty = r->type; + Tree p; + + if (isarith(xty) && isarith(yty)) + ty = binary(xty, yty); + else if (eqtype(xty, yty, 1)) + ty = unqual(xty); + else if (isptr(xty) && isnullptr(r)) + ty = xty; + else if (isnullptr(l) && isptr(yty)) + ty = yty; + else if (isptr(xty) && !isfunc(xty->type) && isvoidptr(yty) + || isptr(yty) && !isfunc(yty->type) && isvoidptr(xty)) + ty = voidptype; + else if ((isptr(xty) && isptr(yty) + && eqtype(unqual(xty->type), unqual(yty->type), 1))) + ty = xty; + else { + typeerror(COND, l, r); + return consttree(0, inttype); + } + if (isptr(ty)) { + ty = unqual(unqual(ty)->type); + if (isptr(xty) && isconst(unqual(xty)->type) + || isptr(yty) && isconst(unqual(yty)->type)) + ty = qual(CONST, ty); + if (isptr(xty) && isvolatile(unqual(xty)->type) + || isptr(yty) && isvolatile(unqual(yty)->type)) + ty = qual(VOLATILE, ty); + ty = ptr(ty); + } + switch (e->op) { + case CNST+I: return cast(e->u.v.i != 0 ? l : r, ty); + case CNST+U: return cast(e->u.v.u != 0 ? l : r, ty); + case CNST+P: return cast(e->u.v.p != 0 ? l : r, ty); + case CNST+F: return cast(e->u.v.d != 0.0 ? l : r, ty); + } + if (ty != voidtype && ty->size > 0) { + t1 = genident(REGISTER, unqual(ty), level); + /* t1 = temporary(REGISTER, unqual(ty)); */ + l = asgn(t1, l); + r = asgn(t1, r); + } else + t1 = NULL; + p = tree(COND, ty, cond(e), + tree(RIGHT, ty, root(l), root(r))); + p->u.sym = t1; + return p; +} +/* addrof - address of p */ +Tree addrof(Tree p) { + Tree q = p; + + for (;;) + switch (generic(q->op)) { + case RIGHT: + assert(q->kids[0] || q->kids[1]); + q = q->kids[1] ? q->kids[1] : q->kids[0]; + continue; + case ASGN: + q = q->kids[1]; + continue; + case COND: { + Symbol t1 = q->u.sym; + q->u.sym = 0; + q = idtree(t1); + /* fall thru */ + } + case INDIR: + if (p == q) + return q->kids[0]; + q = q->kids[0]; + return tree(RIGHT, q->type, root(p), q); + default: + error("addressable object required\n"); + return value(p); + } +} + +/* andtree - construct tree for l [&& ||] r */ +static Tree andtree(int op, Tree l, Tree r) { + if (!isscalar(l->type) || !isscalar(r->type)) + typeerror(op, l, r); + return simplify(op, inttype, cond(l), cond(r)); +} + +/* asgn - generate tree for assignment of expr e to symbol p sans qualifiers */ +Tree asgn(Symbol p, Tree e) { + if (isarray(p->type)) + e = tree(ASGN+B, p->type, idtree(p), + tree(INDIR+B, e->type, e, NULL)); + else { + Type ty = p->type; + p->type = unqual(p->type); + if (isstruct(p->type) && p->type->u.sym->u.s.cfields) { + p->type->u.sym->u.s.cfields = 0; + e = asgntree(ASGN, idtree(p), e); + p->type->u.sym->u.s.cfields = 1; + } else + e = asgntree(ASGN, idtree(p), e); + p->type = ty; + } + return e; +} + +/* bittree - construct tree for l [& | ^ %] r */ +Tree bittree(int op, Tree l, Tree r) { + Type ty = inttype; + + if (isint(l->type) && isint(r->type)) { + ty = binary(l->type, r->type); + l = cast(l, ty); + r = cast(r, ty); + } else + typeerror(op, l, r); + return simplify(op, ty, l, r); +} + +/* multree - construct tree for l [* /] r */ +static Tree multree(int op, Tree l, Tree r) { + Type ty = inttype; + + if (isarith(l->type) && isarith(r->type)) { + ty = binary(l->type, r->type); + l = cast(l, ty); + r = cast(r, ty); + } else + typeerror(op, l, r); + return simplify(op, ty, l, r); +} + +/* shtree - construct tree for l [>> <<] r */ +Tree shtree(int op, Tree l, Tree r) { + Type ty = inttype; + + if (isint(l->type) && isint(r->type)) { + ty = promote(l->type); + l = cast(l, ty); + r = cast(r, inttype); + } else + typeerror(op, l, r); + return simplify(op, ty, l, r); +} + +/* subtree - construct tree for l - r */ +static Tree subtree(int op, Tree l, Tree r) { + long n; + Type ty = inttype; + + if (isarith(l->type) && isarith(r->type)) { + ty = binary(l->type, r->type); + l = cast(l, ty); + r = cast(r, ty); + } else if (isptr(l->type) && !isfunc(l->type->type) && isint(r->type)) { + ty = unqual(l->type); + n = unqual(ty->type)->size; + if (n == 0) + error("unknown size for type `%t'\n", ty->type); + r = cast(r, promote(r->type)); + if (n > 1) + r = multree(MUL, cnsttree(signedptr, n), r); + if (isunsigned(r->type)) + r = cast(r, unsignedptr); + else + r = cast(r, signedptr); + return simplify(SUB+P, ty, l, r); + } else if (compatible(l->type, r->type)) { + ty = unqual(l->type); + n = unqual(ty->type)->size; + if (n == 0) + error("unknown size for type `%t'\n", ty->type); + l = simplify(SUB+U, unsignedptr, + cast(l, unsignedptr), cast(r, unsignedptr)); + return simplify(DIV+I, longtype, + cast(l, longtype), cnsttree(longtype, n)); + } else + typeerror(op, l, r); + return simplify(op, ty, l, r); +} + +/* typeerror - issue "operands of op have illegal types `l' and `r'" */ +void typeerror(int op, Tree l, Tree r) { + int i; + static struct { int op; char *name; } ops[] = { + ASGN, "=", INDIR, "*", NEG, "-", + ADD, "+", SUB, "-", LSH, "<<", + MOD, "%", RSH, ">>", BAND, "&", + BCOM, "~", BOR, "|", BXOR, "^", + DIV, "/", MUL, "*", EQ, "==", + GE, ">=", GT, ">", LE, "<=", + LT, "<", NE, "!=", AND, "&&", + NOT, "!", OR, "||", COND, "?:", + 0, 0 + }; + + op = generic(op); + for (i = 0; ops[i].op; i++) + if (op == ops[i].op) + break; + assert(ops[i].name); + if (r) + error("operands of %s have illegal types `%t' and `%t'\n", + ops[i].name, l->type, r->type); + else + error("operand of unary %s has illegal type `%t'\n", ops[i].name, + l->type); +} diff --git a/quake3/source/lcc/src/error.c b/quake3/source/lcc/src/error.c new file mode 100644 index 0000000..56d164c --- /dev/null +++ b/quake3/source/lcc/src/error.c @@ -0,0 +1,137 @@ +#include "c.h" + + +static void printtoken(void); +int errcnt = 0; +int errlimit = 20; +char kind[] = { +#define xx(a,b,c,d,e,f,g) f, +#define yy(a,b,c,d,e,f,g) f, +#include "token.h" +}; +int wflag; /* != 0 to suppress warning messages */ + +void test(int tok, char set[]) { + if (t == tok) + t = gettok(); + else { + expect(tok); + skipto(tok, set); + if (t == tok) + t = gettok(); + } +} +void expect(int tok) { + if (t == tok) + t = gettok(); + else { + error("syntax error; found"); + printtoken(); + fprint(stderr, " expecting `%k'\n", tok); + } +} +void error(const char *fmt, ...) { + va_list ap; + + if (errcnt++ >= errlimit) { + errcnt = -1; + error("too many errors\n"); + exit(1); + } + va_start(ap, fmt); + if (firstfile != file && firstfile && *firstfile) + fprint(stderr, "%s: ", firstfile); + fprint(stderr, "%w: ", &src); + vfprint(stderr, NULL, fmt, ap); + va_end(ap); +} + +void skipto(int tok, char set[]) { + int n; + char *s; + + assert(set); + for (n = 0; t != EOI && t != tok; t = gettok()) { + for (s = set; *s && kind[t] != *s; s++) + ; + if (kind[t] == *s) + break; + if (n++ == 0) + error("skipping"); + if (n <= 8) + printtoken(); + else if (n == 9) + fprint(stderr, " ..."); + } + if (n > 8) { + fprint(stderr, " up to"); + printtoken(); + } + if (n > 0) + fprint(stderr, "\n"); +} +/* fatal - issue fatal error message and exit */ +int fatal(const char *name, const char *fmt, int n) { + print("\n"); + errcnt = -1; + error("compiler error in %s--", name); + fprint(stderr, fmt, n); + exit(EXIT_FAILURE); + return 0; +} + +/* printtoken - print current token preceeded by a space */ +static void printtoken(void) { + switch (t) { + case ID: fprint(stderr, " `%s'", token); break; + case ICON: + fprint(stderr, " `%s'", vtoa(tsym->type, tsym->u.c.v)); + break; + case SCON: { + int i, n; + if (ischar(tsym->type->type)) { + char *s = tsym->u.c.v.p; + n = tsym->type->size; + fprint(stderr, " \""); + for (i = 0; i < 20 && i < n && *s; s++, i++) + if (*s < ' ' || *s >= 0177) + fprint(stderr, "\\%o", *s); + else + fprint(stderr, "%c", *s); + } else { /* wchar_t string */ + unsigned int *s = tsym->u.c.v.p; + assert(tsym->type->type->size == widechar->size); + n = tsym->type->size/widechar->size; + fprint(stderr, " L\""); + for (i = 0; i < 20 && i < n && *s; s++, i++) + if (*s < ' ' || *s >= 0177) + fprint(stderr, "\\x%x", *s); + else + fprint(stderr, "%c", *s); + } + if (i < n) + fprint(stderr, " ..."); + else + fprint(stderr, "\""); + break; + } + case FCON: + fprint(stderr, " `%S'", token, (char*)cp - token); + break; + case '`': case '\'': fprint(stderr, " \"%k\"", t); break; + default: fprint(stderr, " `%k'", t); + } +} + +/* warning - issue warning error message */ +void warning(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + if (wflag == 0) { + errcnt--; + error("warning: "); + vfprint(stderr, NULL, fmt, ap); + } + va_end(ap); +} diff --git a/quake3/source/lcc/src/event.c b/quake3/source/lcc/src/event.c new file mode 100644 index 0000000..12f409f --- /dev/null +++ b/quake3/source/lcc/src/event.c @@ -0,0 +1,28 @@ +#include "c.h" + + +struct entry { + Apply func; + void *cl; +}; + +Events events; +void attach(Apply func, void *cl, List *list) { + struct entry *p; + + NEW(p, PERM); + p->func = func; + p->cl = cl; + *list = append(p, *list); +} +void apply(List event, void *arg1, void *arg2) { + if (event) { + List lp = event; + do { + struct entry *p = lp->x; + (*p->func)(p->cl, arg1, arg2); + lp = lp->link; + } while (lp != event); + } +} + diff --git a/quake3/source/lcc/src/expr.c b/quake3/source/lcc/src/expr.c new file mode 100644 index 0000000..30b79cc --- /dev/null +++ b/quake3/source/lcc/src/expr.c @@ -0,0 +1,709 @@ +#include "c.h" + + +static char prec[] = { +#define xx(a,b,c,d,e,f,g) c, +#define yy(a,b,c,d,e,f,g) c, +#include "token.h" +}; +static int oper[] = { +#define xx(a,b,c,d,e,f,g) d, +#define yy(a,b,c,d,e,f,g) d, +#include "token.h" +}; +float refinc = 1.0; +static Tree expr2(void); +static Tree expr3(int); +static Tree nullcheck(Tree); +static Tree postfix(Tree); +static Tree unary(void); +static Tree primary(void); +static Type super(Type ty); + +static Type super(Type ty) { + switch (ty->op) { + case INT: + if (ty->size < inttype->size) + return inttype; + break; + case UNSIGNED: + if (ty->size < unsignedtype->size) + return unsignedtype; + break; + case POINTER: + return unsignedptr; + } + return ty; +} +Tree expr(int tok) { + static char stop[] = { IF, ID, '}', 0 }; + Tree p = expr1(0); + + while (t == ',') { + Tree q; + t = gettok(); + q = pointer(expr1(0)); + p = tree(RIGHT, q->type, root(value(p)), q); + } + if (tok) + test(tok, stop); + return p; +} +Tree expr0(int tok) { + return root(expr(tok)); +} +Tree expr1(int tok) { + static char stop[] = { IF, ID, 0 }; + Tree p = expr2(); + + if (t == '=' + || (prec[t] >= 6 && prec[t] <= 8) + || (prec[t] >= 11 && prec[t] <= 13)) { + int op = t; + t = gettok(); + if (oper[op] == ASGN) + p = asgntree(ASGN, p, value(expr1(0))); + else + { + expect('='); + p = incr(op, p, expr1(0)); + } + } + if (tok) + test(tok, stop); + return p; +} +Tree incr(int op, Tree v, Tree e) { + return asgntree(ASGN, v, (*optree[op])(oper[op], v, e)); +} +static Tree expr2(void) { + Tree p = expr3(4); + + if (t == '?') { + Tree l, r; + Coordinate pts[2]; + if (Aflag > 1 && isfunc(p->type)) + warning("%s used in a conditional expression\n", + funcname(p)); + p = pointer(p); + t = gettok(); + pts[0] = src; + l = pointer(expr(':')); + pts[1] = src; + r = pointer(expr2()); + if (events.points) + { + apply(events.points, &pts[0], &l); + apply(events.points, &pts[1], &r); + } + p = condtree(p, l, r); + } + return p; +} +Tree value(Tree p) { + int op = generic(rightkid(p)->op); + + if (p->type != voidtype + && (op==AND || op==OR || op==NOT || op==EQ || op==NE + || op== LE || op==LT || op== GE || op==GT)) + p = condtree(p, consttree(1, inttype), + consttree(0, inttype)); + return p; +} +static Tree expr3(int k) { + int k1; + Tree p = unary(); + + for (k1 = prec[t]; k1 >= k; k1--) + while (prec[t] == k1 && *cp != '=') { + Tree r; + Coordinate pt; + int op = t; + t = gettok(); + pt = src; + p = pointer(p); + if (op == ANDAND || op == OROR) { + r = pointer(expr3(k1)); + if (events.points) + apply(events.points, &pt, &r); + } else + r = pointer(expr3(k1 + 1)); + p = (*optree[op])(oper[op], p, r); + } + return p; +} +static Tree unary(void) { + Tree p; + + switch (t) { + case '*': t = gettok(); p = unary(); p = pointer(p); + if (isptr(p->type) + && (isfunc(p->type->type) || isarray(p->type->type))) + p = retype(p, p->type->type); + else { + if (YYnull) + p = nullcheck(p); + p = rvalue(p); + } break; + case '&': t = gettok(); p = unary(); if (isarray(p->type) || isfunc(p->type)) + p = retype(p, ptr(p->type)); + else + p = lvalue(p); + if (isaddrop(p->op) && p->u.sym->sclass == REGISTER) + error("invalid operand of unary &; `%s' is declared register\n", p->u.sym->name); + + else if (isaddrop(p->op)) + p->u.sym->addressed = 1; + break; + case '+': t = gettok(); p = unary(); p = pointer(p); + if (isarith(p->type)) + p = cast(p, promote(p->type)); + else + typeerror(ADD, p, NULL); break; + case '-': t = gettok(); p = unary(); p = pointer(p); + if (isarith(p->type)) { + Type ty = promote(p->type); + p = cast(p, ty); + if (isunsigned(ty)) { + warning("unsigned operand of unary -\n"); + p = simplify(ADD, ty, simplify(BCOM, ty, p, NULL), cnsttree(ty, 1UL)); + } else + p = simplify(NEG, ty, p, NULL); + } else + typeerror(SUB, p, NULL); break; + case '~': t = gettok(); p = unary(); p = pointer(p); + if (isint(p->type)) { + Type ty = promote(p->type); + p = simplify(BCOM, ty, cast(p, ty), NULL); + } else + typeerror(BCOM, p, NULL); break; + case '!': t = gettok(); p = unary(); p = pointer(p); + if (isscalar(p->type)) + p = simplify(NOT, inttype, cond(p), NULL); + else + typeerror(NOT, p, NULL); break; + case INCR: t = gettok(); p = unary(); p = incr(INCR, pointer(p), consttree(1, inttype)); break; + case DECR: t = gettok(); p = unary(); p = incr(DECR, pointer(p), consttree(1, inttype)); break; + case TYPECODE: case SIZEOF: { int op = t; + Type ty; + p = NULL; + t = gettok(); + if (t == '(') { + t = gettok(); + if (istypename(t, tsym)) { + ty = typename(); + expect(')'); + } else { + p = postfix(expr(')')); + ty = p->type; + } + } else { + p = unary(); + ty = p->type; + } + assert(ty); + if (op == TYPECODE) + p = cnsttree(inttype, (long)ty->op); + else { + if (isfunc(ty) || ty->size == 0) + error("invalid type argument `%t' to `sizeof'\n", ty); + else if (p && rightkid(p)->op == FIELD) + error("`sizeof' applied to a bit field\n"); + p = cnsttree(unsignedlong, (unsigned long)ty->size); + } } break; + case '(': + t = gettok(); + if (istypename(t, tsym)) { + Type ty, ty1 = typename(), pty; + expect(')'); + ty = unqual(ty1); + if (isenum(ty)) { + Type ty2 = ty->type; + if (isconst(ty1)) + ty2 = qual(CONST, ty2); + if (isvolatile(ty1)) + ty2 = qual(VOLATILE, ty2); + ty1 = ty2; + ty = ty->type; + } + p = pointer(unary()); + pty = p->type; + if (isenum(pty)) + pty = pty->type; + if (isarith(pty) && isarith(ty) + || isptr(pty) && isptr(ty)) { + explicitCast++; + p = cast(p, ty); + explicitCast--; + } else if (isptr(pty) && isint(ty) + || isint(pty) && isptr(ty)) { + if (Aflag >= 1 && ty->size < pty->size) + warning("conversion from `%t' to `%t' is compiler dependent\n", p->type, ty); + + p = cast(p, ty); + } else if (ty != voidtype) { + error("cast from `%t' to `%t' is illegal\n", + p->type, ty1); + ty1 = inttype; + } + if (generic(p->op) == INDIR || ty->size == 0) + p = tree(RIGHT, ty1, NULL, p); + else + p = retype(p, ty1); + } else + p = postfix(expr(')')); + break; + default: + p = postfix(primary()); + } + return p; +} + +static Tree postfix(Tree p) { + for (;;) + switch (t) { + case INCR: p = tree(RIGHT, p->type, + tree(RIGHT, p->type, + p, + incr(t, p, consttree(1, inttype))), + p); + t = gettok(); break; + case DECR: p = tree(RIGHT, p->type, + tree(RIGHT, p->type, + p, + incr(t, p, consttree(1, inttype))), + p); + t = gettok(); break; + case '[': { + Tree q; + t = gettok(); + q = expr(']'); + if (YYnull) + if (isptr(p->type)) + p = nullcheck(p); + else if (isptr(q->type)) + q = nullcheck(q); + p = (*optree['+'])(ADD, pointer(p), pointer(q)); + if (isptr(p->type) && isarray(p->type->type)) + p = retype(p, p->type->type); + else + p = rvalue(p); + } break; + case '(': { + Type ty; + Coordinate pt; + p = pointer(p); + if (isptr(p->type) && isfunc(p->type->type)) + ty = p->type->type; + else { + error("found `%t' expected a function\n", p->type); + ty = func(voidtype, NULL, 1); + p = retype(p, ptr(ty)); + } + pt = src; + t = gettok(); + p = call(p, ty, pt); + } break; + case '.': t = gettok(); + if (t == ID) { + if (isstruct(p->type)) { + Tree q = addrof(p); + p = field(q, token); + q = rightkid(q); + if (isaddrop(q->op) && q->u.sym->temporary) + p = tree(RIGHT, p->type, p, NULL); + } else + error("left operand of . has incompatible type `%t'\n", + p->type); + t = gettok(); + } else + error("field name expected\n"); break; + case DEREF: t = gettok(); + p = pointer(p); + if (t == ID) { + if (isptr(p->type) && isstruct(p->type->type)) { + if (YYnull) + p = nullcheck(p); + p = field(p, token); + } else + error("left operand of -> has incompatible type `%t'\n", p->type); + + t = gettok(); + } else + error("field name expected\n"); break; + default: + return p; + } +} +static Tree primary(void) { + Tree p; + + assert(t != '('); + switch (t) { + case ICON: + case FCON: p = tree(mkop(CNST,tsym->type), tsym->type, NULL, NULL); + p->u.v = tsym->u.c.v; + break; + case SCON: if (ischar(tsym->type->type)) + tsym->u.c.v.p = stringn(tsym->u.c.v.p, tsym->type->size); + else + tsym->u.c.v.p = memcpy(allocate(tsym->type->size, PERM), tsym->u.c.v.p, tsym->type->size); + tsym = constant(tsym->type, tsym->u.c.v); + if (tsym->u.c.loc == NULL) + tsym->u.c.loc = genident(STATIC, tsym->type, GLOBAL); + p = idtree(tsym->u.c.loc); break; + case ID: if (tsym == NULL) + { + Symbol p = install(token, &identifiers, level, FUNC); + p->src = src; + if (getchr() == '(') { + Symbol q = lookup(token, externals); + p->type = func(inttype, NULL, 1); + p->sclass = EXTERN; + if (Aflag >= 1) + warning("missing prototype\n"); + if (q && !eqtype(q->type, p->type, 1)) + warning("implicit declaration of `%s' does not match previous declaration at %w\n", q->name, &q->src); + + if (q == NULL) { + q = install(p->name, &externals, GLOBAL, PERM); + q->type = p->type; + q->sclass = EXTERN; + q->src = src; + (*IR->defsymbol)(q); + } + p->u.alias = q; + } else { + error("undeclared identifier `%s'\n", p->name); + p->sclass = AUTO; + p->type = inttype; + if (p->scope == GLOBAL) + (*IR->defsymbol)(p); + else + addlocal(p); + } + t = gettok(); + if (xref) + use(p, src); + return idtree(p); + } + if (xref) + use(tsym, src); + if (tsym->sclass == ENUM) + p = consttree(tsym->u.value, inttype); + else { + if (tsym->sclass == TYPEDEF) + error("illegal use of type name `%s'\n", tsym->name); + p = idtree(tsym); + } break; + case FIRSTARG: + if (level > PARAM && cfunc && cfunc->u.f.callee[0]) + p = idtree(cfunc->u.f.callee[0]); + else { + error("illegal use of `%k'\n", FIRSTARG); + p = cnsttree(inttype, 0L); + } + break; + default: + error("illegal expression\n"); + p = cnsttree(inttype, 0L); + } + t = gettok(); + return p; +} +Tree idtree(Symbol p) { + int op; + Tree e; + Type ty = p->type ? unqual(p->type) : voidptype; + + if (p->scope == GLOBAL || p->sclass == STATIC) + op = ADDRG; + else if (p->scope == PARAM) { + op = ADDRF; + if (isstruct(p->type) && !IR->wants_argb) + { + e = tree(mkop(op,voidptype), ptr(ptr(p->type)), NULL, NULL); + e->u.sym = p; + return rvalue(rvalue(e)); + } + } else if (p->sclass == EXTERN) { + assert(p->u.alias); + p = p->u.alias; + op = ADDRG; + } else + op = ADDRL; + p->ref += refinc; + if (isarray(ty)) + e = tree(mkop(op,voidptype), p->type, NULL, NULL); + else if (isfunc(ty)) + e = tree(mkop(op,funcptype), p->type, NULL, NULL); + else + e = tree(mkop(op,voidptype), ptr(p->type), NULL, NULL); + e->u.sym = p; + if (isptr(e->type)) + e = rvalue(e); + return e; +} + +Tree rvalue(Tree p) { + Type ty = deref(p->type); + + ty = unqual(ty); + return tree(mkop(INDIR,ty), ty, p, NULL); +} +Tree lvalue(Tree p) { + if (generic(p->op) != INDIR) { + error("lvalue required\n"); + return value(p); + } else if (unqual(p->type) == voidtype) + warning("`%t' used as an lvalue\n", p->type); + return p->kids[0]; +} +Tree retype(Tree p, Type ty) { + Tree q; + + if (p->type == ty) + return p; + q = tree(p->op, ty, p->kids[0], p->kids[1]); + q->node = p->node; + q->u = p->u; + return q; +} +Tree rightkid(Tree p) { + while (p && p->op == RIGHT) + if (p->kids[1]) + p = p->kids[1]; + else if (p->kids[0]) + p = p->kids[0]; + else + assert(0); + assert(p); + return p; +} +int hascall(Tree p) { + if (p == 0) + return 0; + if (generic(p->op) == CALL || (IR->mulops_calls && + (p->op == DIV+I || p->op == MOD+I || p->op == MUL+I + || p->op == DIV+U || p->op == MOD+U || p->op == MUL+U))) + return 1; + return hascall(p->kids[0]) || hascall(p->kids[1]); +} +Type binary(Type xty, Type yty) { +#define xx(t) if (xty == t || yty == t) return t + xx(longdouble); + xx(doubletype); + xx(floattype); + xx(unsignedlonglong); + xx(longlong); + xx(unsignedlong); + if (xty == longtype && yty == unsignedtype + || xty == unsignedtype && yty == longtype) + if (longtype->size > unsignedtype->size) + return longtype; + else + return unsignedlong; + xx(longtype); + xx(unsignedtype); + return inttype; +#undef xx +} +Tree pointer(Tree p) { + if (isarray(p->type)) + /* assert(p->op != RIGHT || p->u.sym == NULL), */ + p = retype(p, atop(p->type)); + else if (isfunc(p->type)) + p = retype(p, ptr(p->type)); + return p; +} +Tree cond(Tree p) { + int op = generic(rightkid(p)->op); + + if (op == AND || op == OR || op == NOT + || op == EQ || op == NE + || op == LE || op == LT || op == GE || op == GT) + return p; + p = pointer(p); + return (*optree[NEQ])(NE, p, consttree(0, inttype)); +} +Tree cast(Tree p, Type type) { + Type src, dst; + + p = value(p); + if (p->type == type) + return p; + dst = unqual(type); + src = unqual(p->type); + if (src->op != dst->op || src->size != dst->size) { + switch (src->op) { + case INT: + if (src->size < inttype->size) + p = simplify(CVI, inttype, p, NULL); + break; + case UNSIGNED: + if (src->size < inttype->size) + p = simplify(CVU, inttype, p, NULL); + else if (src->size < unsignedtype->size) + p = simplify(CVU, unsignedtype, p, NULL); + break; + case ENUM: + p = retype(p, inttype); + break; + case POINTER: + if (isint(dst) && src->size > dst->size) + warning("conversion from `%t' to `%t' is undefined\n", p->type, type); + p = simplify(CVP, super(src), p, NULL); + break; + case FLOAT: + break; + default: assert(0); + } + { + src = unqual(p->type); + dst = super(dst); + if (src->op != dst->op) + switch (src->op) { + case INT: + p = simplify(CVI, dst, p, NULL); + break; + case UNSIGNED: + if (isfloat(dst)) { + Type ssrc = signedint(src); + Tree two = cnsttree(longdouble, (long double)2.0); + p = (*optree['+'])(ADD, + (*optree['*'])(MUL, + two, + simplify(CVU, ssrc, + simplify(RSH, src, + p, consttree(1, inttype)), NULL)), + simplify(CVU, ssrc, + simplify(BAND, src, + p, consttree(1, unsignedtype)), NULL)); + } else + p = simplify(CVU, dst, p, NULL); + break; + case FLOAT: + if (isunsigned(dst)) { + Type sdst = signedint(dst); + Tree c = cast(cnsttree(longdouble, (long double)sdst->u.sym->u.limits.max.i + 1), src); + p = condtree( + simplify(GE, src, p, c), + (*optree['+'])(ADD, + cast(cast(simplify(SUB, src, p, c), sdst), dst), + cast(cnsttree(unsignedlong, (unsigned long)sdst->u.sym->u.limits.max.i + 1), dst)), + simplify(CVF, sdst, p, NULL)); + } else + p = simplify(CVF, dst, p, NULL); + break; + default: assert(0); + } + dst = unqual(type); + } + } + src = unqual(p->type); + switch (src->op) { + case INT: + if (src->op != dst->op || src->size != dst->size) + p = simplify(CVI, dst, p, NULL); + break; + case UNSIGNED: + if (src->op != dst->op || src->size != dst->size) + p = simplify(CVU, dst, p, NULL); + break; + case FLOAT: + if (src->op != dst->op || src->size != dst->size) + p = simplify(CVF, dst, p, NULL); + break; + case POINTER: + if (src->op != dst->op) + p = simplify(CVP, dst, p, NULL); + else { + if (isfunc(src->type) && !isfunc(dst->type) + || !isfunc(src->type) && isfunc(dst->type)) + warning("conversion from `%t' to `%t' is compiler dependent\n", p->type, type); + + if (src->size != dst->size) + p = simplify(CVP, dst, p, NULL); + } + break; + default: assert(0); + } + return retype(p, type); +} +Tree field(Tree p, const char *name) { + Field q; + Type ty1, ty = p->type; + + if (isptr(ty)) + ty = deref(ty); + ty1 = ty; + ty = unqual(ty); + if ((q = fieldref(name, ty)) != NULL) { + if (isarray(q->type)) { + ty = q->type->type; + if (isconst(ty1) && !isconst(ty)) + ty = qual(CONST, ty); + if (isvolatile(ty1) && !isvolatile(ty)) + ty = qual(VOLATILE, ty); + ty = array(ty, q->type->size/ty->size, q->type->align); + } else { + ty = q->type; + if (isconst(ty1) && !isconst(ty)) + ty = qual(CONST, ty); + if (isvolatile(ty1) && !isvolatile(ty)) + ty = qual(VOLATILE, ty); + ty = ptr(ty); + } + if (YYcheck && !isaddrop(p->op) && q->offset > 0) /* omit */ + p = nullcall(ty, YYcheck, p, consttree(q->offset, inttype)); /* omit */ + else /* omit */ + p = simplify(ADD+P, ty, p, consttree(q->offset, inttype)); + + if (q->lsb) { + p = tree(FIELD, ty->type, rvalue(p), NULL); + p->u.field = q; + } else if (!isarray(q->type)) + p = rvalue(p); + + } else { + error("unknown field `%s' of `%t'\n", name, ty); + p = rvalue(retype(p, ptr(inttype))); + } + return p; +} +/* funcname - return name of function f or a function' */ +char *funcname(Tree f) { + if (isaddrop(f->op)) + return stringf("`%s'", f->u.sym->name); + return "a function"; +} +static Tree nullcheck(Tree p) { + if (!needconst && YYnull && isptr(p->type)) { + p = value(p); + if (strcmp(YYnull->name, "_YYnull") == 0) { + Symbol t1 = temporary(REGISTER, voidptype); + p = tree(RIGHT, p->type, + tree(OR, voidtype, + cond(asgn(t1, cast(p, voidptype))), + vcall(YYnull, voidtype, (file && *file ? pointer(idtree(mkstr(file)->u.c.loc)) : cnsttree(voidptype, NULL)), cnsttree(inttype, (long)lineno) , NULL)), + idtree(t1)); + } + + else + p = nullcall(p->type, YYnull, p, cnsttree(inttype, 0L)); + + } + return p; +} +Tree nullcall(Type pty, Symbol f, Tree p, Tree e) { + Type ty; + + if (isarray(pty)) + return retype(nullcall(atop(pty), f, p, e), pty); + ty = unqual(unqual(p->type)->type); + return vcall(f, pty, + p, e, + cnsttree(inttype, (long)ty->size), + cnsttree(inttype, (long)ty->align), + (file && *file ? pointer(idtree(mkstr(file)->u.c.loc)) : cnsttree(voidptype, NULL)), cnsttree(inttype, (long)lineno) , NULL); +} diff --git a/quake3/source/lcc/src/gen.c b/quake3/source/lcc/src/gen.c new file mode 100644 index 0000000..ab8506a --- /dev/null +++ b/quake3/source/lcc/src/gen.c @@ -0,0 +1,830 @@ +#include "c.h" + + +#define readsreg(p) \ + (generic((p)->op)==INDIR && (p)->kids[0]->op==VREG+P) +#define setsrc(d) ((d) && (d)->x.regnode && \ + (d)->x.regnode->set == src->x.regnode->set && \ + (d)->x.regnode->mask&src->x.regnode->mask) + +#define relink(a, b) ((b)->x.prev = (a), (a)->x.next = (b)) + +static Symbol askfixedreg(Symbol); +static Symbol askreg(Symbol, unsigned*); +static void blkunroll(int, int, int, int, int, int, int[]); +static void docall(Node); +static void dumpcover(Node, int, int); +static void dumpregs(char *, char *, char *); +static void dumprule(int); +static void dumptree(Node); +static unsigned emitasm(Node, int); +static void genreload(Node, Symbol, int); +static void genspill(Symbol, Node, Symbol); +static Symbol getreg(Symbol, unsigned*, Node); +static int getrule(Node, int); +static void linearize(Node, Node); +static int moveself(Node); +static void prelabel(Node); +static Node* prune(Node, Node*); +static void putreg(Symbol); +static void ralloc(Node); +static void reduce(Node, int); +static int reprune(Node*, int, int, Node); +static int requate(Node); +static Node reuse(Node, int); +static void rewrite(Node); +static Symbol spillee(Symbol, unsigned mask[], Node); +static void spillr(Symbol, Node); +static int uses(Node, Regnode); + +int offset; + +int maxoffset; + +int framesize; +int argoffset; + +int maxargoffset; + +int dalign, salign; +int bflag = 0; /* omit */ +int dflag = 0; + +int swap; + +unsigned (*emitter)(Node, int) = emitasm; +static char NeedsReg[] = { + 0, /* unused */ + 1, /* CNST */ + 0, 0, /* ARG ASGN */ + 1, /* INDIR */ + 0, 0, 1, 1, /* - - CVF CVI */ + 1, 0, 1, 1, /* CVP - CVU NEG */ + 1, /* CALL */ + 1, /* LOAD */ + 0, /* RET */ + 1, 1, 1, /* ADDRG ADDRF ADDRL */ + 1, 1, 1, 1, 1, /* ADD SUB LSH MOD RSH */ + 1, 1, 1, 1, /* BAND BCOM BOR BXOR */ + 1, 1, /* DIV MUL */ + 0, 0, 0, 0, 0, 0, /* EQ GE GT LE LT NE */ + 0, 0 /* JUMP LABEL */ +}; +Node head; + +unsigned freemask[2]; +unsigned usedmask[2]; +unsigned tmask[2]; +unsigned vmask[2]; +Symbol mkreg(char *fmt, int n, int mask, int set) { + Symbol p; + + NEW0(p, PERM); + p->name = p->x.name = stringf(fmt, n); + NEW0(p->x.regnode, PERM); + p->x.regnode->number = n; + p->x.regnode->mask = mask<x.regnode->set = set; + return p; +} +Symbol mkwildcard(Symbol *syms) { + Symbol p; + + NEW0(p, PERM); + p->name = p->x.name = "wildcard"; + p->x.wildcard = syms; + return p; +} +void mkauto(Symbol p) { + assert(p->sclass == AUTO); + offset = roundup(offset + p->type->size, p->type->align); + p->x.offset = -offset; + p->x.name = stringd(-offset); +} +void blockbeg(Env *e) { + e->offset = offset; + e->freemask[IREG] = freemask[IREG]; + e->freemask[FREG] = freemask[FREG]; +} +void blockend(Env *e) { + if (offset > maxoffset) + maxoffset = offset; + offset = e->offset; + freemask[IREG] = e->freemask[IREG]; + freemask[FREG] = e->freemask[FREG]; +} +int mkactual(int align, int size) { + int n = roundup(argoffset, align); + + argoffset = n + size; + return n; +} +static void docall(Node p) { + p->syms[1] = p->syms[0]; + p->syms[0] = intconst(argoffset); + if (argoffset > maxargoffset) + maxargoffset = argoffset; + argoffset = 0; +} +void blkcopy(int dreg, int doff, int sreg, int soff, int size, int tmp[]) { + assert(size >= 0); + if (size == 0) + return; + else if (size <= 2) + blkunroll(size, dreg, doff, sreg, soff, size, tmp); + else if (size == 3) { + blkunroll(2, dreg, doff, sreg, soff, 2, tmp); + blkunroll(1, dreg, doff+2, sreg, soff+2, 1, tmp); + } + else if (size <= 16) { + blkunroll(4, dreg, doff, sreg, soff, size&~3, tmp); + blkcopy(dreg, doff+(size&~3), + sreg, soff+(size&~3), size&3, tmp); + } + else + (*IR->x.blkloop)(dreg, doff, sreg, soff, size, tmp); +} +static void blkunroll(int k, int dreg, int doff, int sreg, int soff, int size, int tmp[]) { + int i; + + assert(IR->x.max_unaligned_load); + if (k > IR->x.max_unaligned_load + && (k > salign || k > dalign)) + k = IR->x.max_unaligned_load; + for (i = 0; i+k < size; i += 2*k) { + (*IR->x.blkfetch)(k, soff+i, sreg, tmp[0]); + (*IR->x.blkfetch)(k, soff+i+k, sreg, tmp[1]); + (*IR->x.blkstore)(k, doff+i, dreg, tmp[0]); + (*IR->x.blkstore)(k, doff+i+k, dreg, tmp[1]); + } + if (i < size) { + (*IR->x.blkfetch)(k, i+soff, sreg, tmp[0]); + (*IR->x.blkstore)(k, i+doff, dreg, tmp[0]); + } +} +void parseflags(int argc, char *argv[]) { + int i; + + for (i = 0; i < argc; i++) + if (strcmp(argv[i], "-d") == 0) + dflag = 1; + else if (strcmp(argv[i], "-b") == 0) /* omit */ + bflag = 1; /* omit */ +} +static int getrule(Node p, int nt) { + int rulenum; + + assert(p); + rulenum = (*IR->x._rule)(p->x.state, nt); + if (!rulenum) { + fprint(stderr, "(%x->op=%s at %w is corrupt.)\n", p, opname(p->op), &src); + assert(0); + } + return rulenum; +} +static void reduce(Node p, int nt) { + int rulenum, i; + short *nts; + Node kids[10]; + + p = reuse(p, nt); + rulenum = getrule(p, nt); + nts = IR->x._nts[rulenum]; + (*IR->x._kids)(p, rulenum, kids); + for (i = 0; nts[i]; i++) + reduce(kids[i], nts[i]); + if (IR->x._isinstruction[rulenum]) { + assert(p->x.inst == 0 || p->x.inst == nt); + p->x.inst = nt; + if (p->syms[RX] && p->syms[RX]->temporary) { + debug(fprint(stderr, "(using %s)\n", p->syms[RX]->name)); + p->syms[RX]->x.usecount++; + } + } +} +static Node reuse(Node p, int nt) { + struct _state { + short cost[1]; + }; + Symbol r = p->syms[RX]; + + if (generic(p->op) == INDIR && p->kids[0]->op == VREG+P + && r->u.t.cse && p->x.mayrecalc + && ((struct _state*)r->u.t.cse->x.state)->cost[nt] == 0) + return r->u.t.cse; + else + return p; +} + +int mayrecalc(Node p) { + int op; + + assert(p && p->syms[RX]); + if (p->syms[RX]->u.t.cse == NULL) + return 0; + op = generic(p->syms[RX]->u.t.cse->op); + if (op == CNST || op == ADDRF || op == ADDRG || op == ADDRL) { + p->x.mayrecalc = 1; + return 1; + } else + return 0; +} +static Node *prune(Node p, Node pp[]) { + if (p == NULL) + return pp; + p->x.kids[0] = p->x.kids[1] = p->x.kids[2] = NULL; + if (p->x.inst == 0) + return prune(p->kids[1], prune(p->kids[0], pp)); + else if (p->syms[RX] && p->syms[RX]->temporary + && p->syms[RX]->x.usecount < 2) { + p->x.inst = 0; + debug(fprint(stderr, "(clobbering %s)\n", p->syms[RX]->name)); + return prune(p->kids[1], prune(p->kids[0], pp)); + } + else { + prune(p->kids[1], prune(p->kids[0], &p->x.kids[0])); + *pp = p; + return pp + 1; + } +} + +#define ck(i) return (i) ? 0 : LBURG_MAX + +int range(Node p, int lo, int hi) { + Symbol s = p->syms[0]; + + switch (specific(p->op)) { + case ADDRF+P: + case ADDRL+P: ck(s->x.offset >= lo && s->x.offset <= hi); + case CNST+I: ck(s->u.c.v.i >= lo && s->u.c.v.i <= hi); + case CNST+U: ck(s->u.c.v.u >= lo && s->u.c.v.u <= hi); + case CNST+P: ck(s->u.c.v.p == 0 && lo <= 0 && hi >= 0); + } + return LBURG_MAX; +} +static void dumptree(Node p) { + if (p->op == VREG+P && p->syms[0]) { + fprint(stderr, "VREGP(%s)", p->syms[0]->name); + return; + } else if (generic(p->op) == LOAD) { + fprint(stderr, "LOAD("); + dumptree(p->kids[0]); + fprint(stderr, ")"); + return; + } + fprint(stderr, "%s(", opname(p->op)); + switch (generic(p->op)) { + case CNST: case LABEL: + case ADDRG: case ADDRF: case ADDRL: + if (p->syms[0]) + fprint(stderr, "%s", p->syms[0]->name); + break; + case RET: + if (p->kids[0]) + dumptree(p->kids[0]); + break; + case CVF: case CVI: case CVP: case CVU: case JUMP: + case ARG: case BCOM: case NEG: case INDIR: + dumptree(p->kids[0]); + break; + case CALL: + if (optype(p->op) != B) { + dumptree(p->kids[0]); + break; + } + /* else fall thru */ + case EQ: case NE: case GT: case GE: case LE: case LT: + case ASGN: case BOR: case BAND: case BXOR: case RSH: case LSH: + case ADD: case SUB: case DIV: case MUL: case MOD: + dumptree(p->kids[0]); + fprint(stderr, ", "); + dumptree(p->kids[1]); + break; + default: assert(0); + } + fprint(stderr, ")"); +} +static void dumpcover(Node p, int nt, int in) { + int rulenum, i; + short *nts; + Node kids[10]; + + p = reuse(p, nt); + rulenum = getrule(p, nt); + nts = IR->x._nts[rulenum]; + fprint(stderr, "dumpcover(%x) = ", p); + for (i = 0; i < in; i++) + fprint(stderr, " "); + dumprule(rulenum); + (*IR->x._kids)(p, rulenum, kids); + for (i = 0; nts[i]; i++) + dumpcover(kids[i], nts[i], in+1); +} + +static void dumprule(int rulenum) { + assert(rulenum); + fprint(stderr, "%s / %s", IR->x._string[rulenum], + IR->x._templates[rulenum]); + if (!IR->x._isinstruction[rulenum]) + fprint(stderr, "\n"); +} +static unsigned emitasm(Node p, int nt) { + int rulenum; + short *nts; + char *fmt; + Node kids[10]; + + p = reuse(p, nt); + rulenum = getrule(p, nt); + nts = IR->x._nts[rulenum]; + fmt = IR->x._templates[rulenum]; + assert(fmt); + if (IR->x._isinstruction[rulenum] && p->x.emitted) + print("%s", p->syms[RX]->x.name); + else if (*fmt == '#') + (*IR->x.emit2)(p); + else { + if (*fmt == '?') { + fmt++; + assert(p->kids[0]); + if (p->syms[RX] == p->x.kids[0]->syms[RX]) + while (*fmt++ != '\n') + ; + } + for ((*IR->x._kids)(p, rulenum, kids); *fmt; fmt++) + if (*fmt != '%') + (void)putchar(*fmt); + else if (*++fmt == 'F') + print("%d", framesize); + else if (*fmt >= '0' && *fmt <= '9') + emitasm(kids[*fmt - '0'], nts[*fmt - '0']); + else if (*fmt >= 'a' && *fmt < 'a' + NELEMS(p->syms)) + fputs(p->syms[*fmt - 'a']->x.name, stdout); + else + (void)putchar(*fmt); + } + return 0; +} +void emit(Node p) { + for (; p; p = p->x.next) { + assert(p->x.registered); + if (p->x.equatable && requate(p) || moveself(p)) + ; + else + (*emitter)(p, p->x.inst); + p->x.emitted = 1; + } +} +static int moveself(Node p) { + return p->x.copy + && p->syms[RX]->x.name == p->x.kids[0]->syms[RX]->x.name; +} +int move(Node p) { + p->x.copy = 1; + return 1; +} +static int requate(Node q) { + Symbol src = q->x.kids[0]->syms[RX]; + Symbol tmp = q->syms[RX]; + Node p; + int n = 0; + + debug(fprint(stderr, "(requate(%x): tmp=%s src=%s)\n", q, tmp->x.name, src->x.name)); + for (p = q->x.next; p; p = p->x.next) + if (p->x.copy && p->syms[RX] == src + && p->x.kids[0]->syms[RX] == tmp) + debug(fprint(stderr, "(requate arm 0 at %x)\n", p)), + p->syms[RX] = tmp; + else if (setsrc(p->syms[RX]) && !moveself(p) && !readsreg(p)) + return 0; + else if (p->x.spills) + return 0; + else if (generic(p->op) == CALL && p->x.next) + return 0; + else if (p->op == LABEL+V && p->x.next) + return 0; + else if (p->syms[RX] == tmp && readsreg(p)) + debug(fprint(stderr, "(requate arm 5 at %x)\n", p)), + n++; + else if (p->syms[RX] == tmp) + break; + debug(fprint(stderr, "(requate arm 7 at %x)\n", p)); + assert(n > 0); + for (p = q->x.next; p; p = p->x.next) + if (p->syms[RX] == tmp && readsreg(p)) { + p->syms[RX] = src; + if (--n <= 0) + break; + } + return 1; +} +static void prelabel(Node p) { + if (p == NULL) + return; + prelabel(p->kids[0]); + prelabel(p->kids[1]); + if (NeedsReg[opindex(p->op)]) + setreg(p, (*IR->x.rmap)(opkind(p->op))); + switch (generic(p->op)) { + case ADDRF: case ADDRL: + if (p->syms[0]->sclass == REGISTER) + p->op = VREG+P; + break; + case INDIR: + if (p->kids[0]->op == VREG+P) + setreg(p, p->kids[0]->syms[0]); + break; + case ASGN: + if (p->kids[0]->op == VREG+P) + rtarget(p, 1, p->kids[0]->syms[0]); + break; + case CVI: case CVU: case CVP: + if (optype(p->op) != F + && opsize(p->op) <= p->syms[0]->u.c.v.i) + p->op = LOAD + opkind(p->op); + break; + } + (IR->x.target)(p); +} +void setreg(Node p, Symbol r) { + p->syms[RX] = r; +} +void rtarget(Node p, int n, Symbol r) { + Node q = p->kids[n]; + + assert(q); + assert(r); + assert(r->sclass == REGISTER || !r->x.wildcard); + assert(q->syms[RX]); + if (r != q->syms[RX] && !q->syms[RX]->x.wildcard) { + q = newnode(LOAD + opkind(q->op), + q, NULL, q->syms[0]); + if (r->u.t.cse == p->kids[n]) + r->u.t.cse = q; + p->kids[n] = p->x.kids[n] = q; + q->x.kids[0] = q->kids[0]; + } + setreg(q, r); + debug(fprint(stderr, "(targeting %x->x.kids[%d]=%x to %s)\n", p, n, p->kids[n], r->x.name)); +} +static void rewrite(Node p) { + assert(p->x.inst == 0); + prelabel(p); + debug(dumptree(p)); + debug(fprint(stderr, "\n")); + (*IR->x._label)(p); + debug(dumpcover(p, 1, 0)); + reduce(p, 1); +} +Node gen(Node forest) { + int i; + struct node sentinel; + Node dummy, p; + + head = forest; + for (p = forest; p; p = p->link) { + assert(p->count == 0); + if (generic(p->op) == CALL) + docall(p); + else if ( generic(p->op) == ASGN + && generic(p->kids[1]->op) == CALL) + docall(p->kids[1]); + else if (generic(p->op) == ARG) + (*IR->x.doarg)(p); + rewrite(p); + p->x.listed = 1; + } + for (p = forest; p; p = p->link) + prune(p, &dummy); + relink(&sentinel, &sentinel); + for (p = forest; p; p = p->link) + linearize(p, &sentinel); + forest = sentinel.x.next; + assert(forest); + sentinel.x.next->x.prev = NULL; + sentinel.x.prev->x.next = NULL; + for (p = forest; p; p = p->x.next) + for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) { + assert(p->x.kids[i]->syms[RX]); + if (p->x.kids[i]->syms[RX]->temporary) { + p->x.kids[i]->x.prevuse = + p->x.kids[i]->syms[RX]->x.lastuse; + p->x.kids[i]->syms[RX]->x.lastuse = p->x.kids[i]; + } + } + for (p = forest; p; p = p->x.next) { + ralloc(p); + if (p->x.listed && NeedsReg[opindex(p->op)] + && (*IR->x.rmap)(opkind(p->op))) { + assert(generic(p->op) == CALL || generic(p->op) == LOAD); + putreg(p->syms[RX]); + } + } + return forest; +} +int notarget(Node p) { + return p->syms[RX]->x.wildcard ? 0 : LBURG_MAX; +} +static void putreg(Symbol r) { + assert(r && r->x.regnode); + freemask[r->x.regnode->set] |= r->x.regnode->mask; + debug(dumpregs("(freeing %s)\n", r->x.name, NULL)); +} +static Symbol askfixedreg(Symbol s) { + Regnode r = s->x.regnode; + int n = r->set; + + if (r->mask&~freemask[n]) + return NULL; + else { + freemask[n] &= ~r->mask; + usedmask[n] |= r->mask; + return s; + } +} +static Symbol askreg(Symbol rs, unsigned rmask[]) { + int i; + + if (rs->x.wildcard == NULL) + return askfixedreg(rs); + for (i = 31; i >= 0; i--) { + Symbol r = rs->x.wildcard[i]; + if (r != NULL + && !(r->x.regnode->mask&~rmask[r->x.regnode->set]) + && askfixedreg(r)) + return r; + } + return NULL; +} + +static Symbol getreg(Symbol s, unsigned mask[], Node p) { + Symbol r = askreg(s, mask); + if (r == NULL) { + r = spillee(s, mask, p); + assert(r && r->x.regnode); + spill(r->x.regnode->mask, r->x.regnode->set, p); + r = askreg(s, mask); + } + assert(r && r->x.regnode); + r->x.regnode->vbl = NULL; + return r; +} +int askregvar(Symbol p, Symbol regs) { + Symbol r; + + assert(p); + if (p->sclass != REGISTER) + return 0; + else if (!isscalar(p->type)) { + p->sclass = AUTO; + return 0; + } + else if (p->temporary) { + p->x.name = "?"; + return 1; + } + else if ((r = askreg(regs, vmask)) != NULL) { + p->x.regnode = r->x.regnode; + p->x.regnode->vbl = p; + p->x.name = r->x.name; + debug(dumpregs("(allocating %s to symbol %s)\n", p->x.name, p->name)); + return 1; + } + else { + p->sclass = AUTO; + return 0; + } +} +static void linearize(Node p, Node next) { + int i; + + for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) + linearize(p->x.kids[i], next); + relink(next->x.prev, p); + relink(p, next); + debug(fprint(stderr, "(listing %x)\n", p)); +} +static void ralloc(Node p) { + int i; + unsigned mask[2]; + + mask[0] = tmask[0]; + mask[1] = tmask[1]; + assert(p); + debug(fprint(stderr, "(rallocing %x)\n", p)); + for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) { + Node kid = p->x.kids[i]; + Symbol r = kid->syms[RX]; + assert(r && kid->x.registered); + if (r->sclass != REGISTER && r->x.lastuse == kid) + putreg(r); + } + if (!p->x.registered && NeedsReg[opindex(p->op)] + && (*IR->x.rmap)(opkind(p->op))) { + Symbol sym = p->syms[RX], set = sym; + assert(sym); + if (sym->temporary) + set = (*IR->x.rmap)(opkind(p->op)); + assert(set); + if (set->sclass != REGISTER) { + Symbol r; + if (*IR->x._templates[getrule(p, p->x.inst)] == '?') + for (i = 1; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) { + Symbol r = p->x.kids[i]->syms[RX]; + assert(p->x.kids[i]->x.registered); + assert(r && r->x.regnode); + assert(sym->x.wildcard || sym != r); + mask[r->x.regnode->set] &= ~r->x.regnode->mask; + } + r = getreg(set, mask, p); + if (sym->temporary) { + Node q; + r->x.lastuse = sym->x.lastuse; + for (q = sym->x.lastuse; q; q = q->x.prevuse) { + q->syms[RX] = r; + q->x.registered = 1; + if (sym->u.t.cse && q->x.copy) + q->x.equatable = 1; + } + } else { + p->syms[RX] = r; + r->x.lastuse = p; + } + debug(dumpregs("(allocating %s to node %x)\n", r->x.name, (char *) p)); + } + } + p->x.registered = 1; + (*IR->x.clobber)(p); +} +static Symbol spillee(Symbol set, unsigned mask[], Node here) { + Symbol bestreg = NULL; + int bestdist = -1, i; + + assert(set); + if (!set->x.wildcard) + bestreg = set; + else { + for (i = 31; i >= 0; i--) { + Symbol ri = set->x.wildcard[i]; + if ( + ri != NULL && + ri->x.lastuse && + (ri->x.regnode->mask&tmask[ri->x.regnode->set]&mask[ri->x.regnode->set]) + ) { + Regnode rn = ri->x.regnode; + Node q = here; + int dist = 0; + for (; q && !uses(q, rn); q = q->x.next) + dist++; + if (q && dist > bestdist) { + bestdist = dist; + bestreg = ri; + } + } + } + } + assert(bestreg); /* Must be able to spill something. Reconfigure the register allocator + to ensure that we can allocate a register for all nodes without spilling + the node's necessary input regs. */ + assert(bestreg->x.regnode->vbl == NULL); /* Can't spill register variables because + the reload site might be in other blocks. Reconfigure the register allocator + to ensure that this register is never allocated to a variable. */ + return bestreg; +} +static int uses(Node p, Regnode rn) { + int i; + + for (i = 0; i < NELEMS(p->x.kids); i++) + if ( + p->x.kids[i] && + p->x.kids[i]->x.registered && + rn->set == p->x.kids[i]->syms[RX]->x.regnode->set && + (rn->mask&p->x.kids[i]->syms[RX]->x.regnode->mask) + ) + return 1; + return 0; +} +static void spillr(Symbol r, Node here) { + int i; + Symbol tmp; + Node p = r->x.lastuse; + assert(p); + while (p->x.prevuse) + assert(r == p->syms[RX]), + p = p->x.prevuse; + assert(p->x.registered && !readsreg(p)); + tmp = newtemp(AUTO, optype(p->op), opsize(p->op)); + genspill(r, p, tmp); + for (p = here->x.next; p; p = p->x.next) + for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) { + Node k = p->x.kids[i]; + if (k->x.registered && k->syms[RX] == r) + genreload(p, tmp, i); + } + putreg(r); +} +static void genspill(Symbol r, Node last, Symbol tmp) { + Node p, q; + Symbol s; + unsigned ty; + + debug(fprint(stderr, "(spilling %s to local %s)\n", r->x.name, tmp->x.name)); + debug(fprint(stderr, "(genspill: ")); + debug(dumptree(last)); + debug(fprint(stderr, ")\n")); + ty = opkind(last->op); + NEW0(s, FUNC); + s->sclass = REGISTER; + s->name = s->x.name = r->x.name; + s->x.regnode = r->x.regnode; + q = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, s); + q = newnode(INDIR + ty, q, NULL, NULL); + p = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, tmp); + p = newnode(ASGN + ty, p, q, NULL); + p->x.spills = 1; + rewrite(p); + prune(p, &q); + q = last->x.next; + linearize(p, q); + for (p = last->x.next; p != q; p = p->x.next) { + ralloc(p); + assert(!p->x.listed || !NeedsReg[opindex(p->op)] || !(*IR->x.rmap)(opkind(p->op))); + } +} + +static void genreload(Node p, Symbol tmp, int i) { + Node q; + int ty; + + debug(fprint(stderr, "(replacing %x with a reload from %s)\n", p->x.kids[i], tmp->x.name)); + debug(fprint(stderr, "(genreload: ")); + debug(dumptree(p->x.kids[i])); + debug(fprint(stderr, ")\n")); + ty = opkind(p->x.kids[i]->op); + q = newnode(ADDRL+P + sizeop(IR->ptrmetric.size), NULL, NULL, tmp); + p->x.kids[i] = newnode(INDIR + ty, q, NULL, NULL); + rewrite(p->x.kids[i]); + prune(p->x.kids[i], &q); + reprune(&p->kids[1], reprune(&p->kids[0], 0, i, p), i, p); + prune(p, &q); + linearize(p->x.kids[i], p); +} +static int reprune(Node *pp, int k, int n, Node p) { + struct node x, *q = *pp; + + if (q == NULL || k > n) + return k; + else if (q->x.inst == 0) + return reprune(&q->kids[1], + reprune(&q->kids[0], k, n, p), n, p); + if (k == n) { + debug(fprint(stderr, "(reprune changes %x from %x to %x)\n", pp, *pp, p->x.kids[n])); + *pp = p->x.kids[n]; + x = *p; + (IR->x.target)(&x); + } + return k + 1; +} +void spill(unsigned mask, int n, Node here) { + int i; + Node p; + + here->x.spills = 1; + usedmask[n] |= mask; + if (mask&~freemask[n]) { + + assert( /* It makes no sense for a node to clobber() its target. */ + here->x.registered == 0 || /* call isn't coming through clobber() */ + here->syms[RX] == NULL || + here->syms[RX]->x.regnode == NULL || + here->syms[RX]->x.regnode->set != n || + (here->syms[RX]->x.regnode->mask&mask) == 0 + ); + + for (p = here; p; p = p->x.next) + for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) { + Symbol r = p->x.kids[i]->syms[RX]; + assert(r); + if (p->x.kids[i]->x.registered && r->x.regnode->set == n + && r->x.regnode->mask&mask) + spillr(r, here); + } + } +} +static void dumpregs(char *msg, char *a, char *b) { + fprint(stderr, msg, a, b); + fprint(stderr, "(free[0]=%x)\n", freemask[0]); + fprint(stderr, "(free[1]=%x)\n", freemask[1]); +} + +int getregnum(Node p) { + assert(p && p->syms[RX] && p->syms[RX]->x.regnode); + return p->syms[RX]->x.regnode->number; +} + + +unsigned regloc(Symbol p) { + assert(p && p->sclass == REGISTER && p->sclass == REGISTER && p->x.regnode); + return p->x.regnode->set<<8 | p->x.regnode->number; +} + diff --git a/quake3/source/lcc/src/init.c b/quake3/source/lcc/src/init.c new file mode 100644 index 0000000..67bcc69 --- /dev/null +++ b/quake3/source/lcc/src/init.c @@ -0,0 +1,318 @@ +#include "c.h" + + +static int curseg; /* current segment */ + +/* defpointer - initialize a pointer to p or to 0 if p==0 */ +void defpointer(Symbol p) { + if (p) { + (*IR->defaddress)(p); + p->ref++; + } else { + static Value v; + (*IR->defconst)(P, voidptype->size, v); + } +} + +/* genconst - generate/check constant expression e; return size */ +static int genconst(Tree e, int def) { + for (;;) + switch (generic(e->op)) { + case ADDRG: + if (def) + (*IR->defaddress)(e->u.sym); + return e->type->size; + case CNST: + if (e->op == CNST+P && isarray(e->type)) { + e = cvtconst(e); + continue; + } + if (def) + (*IR->defconst)(e->type->op, e->type->size, e->u.v); + return e->type->size; + case RIGHT: + assert(e->kids[0] || e->kids[1]); + if (e->kids[1] && e->kids[0]) + error("initializer must be constant\n"); + e = e->kids[1] ? e->kids[1] : e->kids[0]; + continue; + case CVP: + if (isarith(e->type)) + error("cast from `%t' to `%t' is illegal in constant expressions\n", + e->kids[0]->type, e->type); + /* fall thru */ + case CVI: case CVU: case CVF: + e = e->kids[0]; + continue; + default: + error("initializer must be constant\n"); + if (def) + genconst(consttree(0, inttype), def); + return inttype->size; + } +} + +/* initvalue - evaluate a constant expression for a value of integer type ty */ +static Tree initvalue(Type ty) { + Type aty; + Tree e; + + needconst++; + e = expr1(0); + if ((aty = assign(ty, e)) != NULL) + e = cast(e, aty); + else { + error("invalid initialization type; found `%t' expected `%t'\n", + e->type, ty); + e = retype(consttree(0, inttype), ty); + } + needconst--; + if (generic(e->op) != CNST) { + error("initializer must be constant\n"); + e = retype(consttree(0, inttype), ty); + } + return e; +} + +/* initarray - initialize array of ty of <= len bytes; if len == 0, go to } */ +static int initarray(int len, Type ty, int lev) { + int n = 0; + + do { + initializer(ty, lev); + n += ty->size; + if (len > 0 && n >= len || t != ',') + break; + t = gettok(); + } while (t != '}'); + return n; +} + +/* initchar - initialize array of <= len ty characters; if len == 0, go to } */ +static int initchar(int len, Type ty) { + int n = 0; + char buf[16], *s = buf; + + do { + *s++ = initvalue(ty)->u.v.i; + if (++n%inttype->size == 0) { + (*IR->defstring)(inttype->size, buf); + s = buf; + } + if (len > 0 && n >= len || t != ',') + break; + t = gettok(); + } while (t != '}'); + if (s > buf) + (*IR->defstring)(s - buf, buf); + return n; +} + +/* initend - finish off an initialization at level lev; accepts trailing comma */ +static void initend(int lev, char follow[]) { + if (lev == 0 && t == ',') + t = gettok(); + test('}', follow); +} + +/* initfields - initialize <= an unsigned's worth of bit fields in fields p to q */ +static int initfields(Field p, Field q) { + unsigned int bits = 0; + int i, n = 0; + + do { + i = initvalue(inttype)->u.v.i; + if (fieldsize(p) < 8*p->type->size) { + if (p->type == inttype && + (i < -(int)(fieldmask(p)>>1)-1 || i > (int)(fieldmask(p)>>1)) + || p->type == unsignedtype && (i&~fieldmask(p)) != 0) + warning("initializer exceeds bit-field width\n"); + i &= fieldmask(p); + } + bits |= i<little_endian) { + if (fieldsize(p) + fieldright(p) > n) + n = fieldsize(p) + fieldright(p); + } else { + if (fieldsize(p) + fieldleft(p) > n) + n = fieldsize(p) + fieldleft(p); + } + if (p->link == q) + break; + p = p->link; + } while (t == ',' && (t = gettok()) != 0); + n = (n + 7)/8; + for (i = 0; i < n; i++) { + Value v; + if (IR->little_endian) { + v.u = (unsigned char)bits; + bits >>= 8; + } else { /* a big endian */ + v.u = (unsigned char)(bits>>(8*(unsignedtype->size - 1))); + bits <<= 8; + } + (*IR->defconst)(U, unsignedchar->size, v); + } + return n; +} + +/* initstruct - initialize a struct ty of <= len bytes; if len == 0, go to } */ +static int initstruct(int len, Type ty, int lev) { + int a, n = 0; + Field p = ty->u.sym->u.s.flist; + + do { + if (p->offset > n) { + (*IR->space)(p->offset - n); + n += p->offset - n; + } + if (p->lsb) { + Field q = p; + while (q->link && q->link->offset == p->offset) + q = q->link; + n += initfields(p, q->link); + p = q; + } else { + initializer(p->type, lev); + n += p->type->size; + } + if (p->link) { + p = p->link; + a = p->type->align; + } else + a = ty->align; + if (a && n%a) { + (*IR->space)(a - n%a); + n = roundup(n, a); + } + if (len > 0 && n >= len || t != ',') + break; + t = gettok(); + } while (t != '}'); + return n; +} + +/* initializer - constexpr | { constexpr ( , constexpr )* [ , ] } */ +Type initializer(Type ty, int lev) { + int n = 0; + Tree e; + Type aty = NULL; + static char follow[] = { IF, CHAR, STATIC, 0 }; + + ty = unqual(ty); + if (isscalar(ty)) { + needconst++; + if (t == '{') { + t = gettok(); + e = expr1(0); + initend(lev, follow); + } else + e = expr1(0); + e = pointer(e); + if ((aty = assign(ty, e)) != NULL) + e = cast(e, aty); + else + error("invalid initialization type; found `%t' expected `%t'\n", + e->type, ty); + n = genconst(e, 1); + deallocate(STMT); + needconst--; + } + if ((isunion(ty) || isstruct(ty)) && ty->size == 0) { + static char follow[] = { CHAR, STATIC, 0 }; + error("cannot initialize undefined `%t'\n", ty); + skipto(';', follow); + return ty; + } else if (isunion(ty)) { + if (t == '{') { + t = gettok(); + n = initstruct(ty->u.sym->u.s.flist->type->size, ty, lev + 1); + initend(lev, follow); + } else { + if (lev == 0) + error("missing { in initialization of `%t'\n", ty); + n = initstruct(ty->u.sym->u.s.flist->type->size, ty, lev + 1); + } + } else if (isstruct(ty)) { + if (t == '{') { + t = gettok(); + n = initstruct(0, ty, lev + 1); + test('}', follow); + } else if (lev > 0) + n = initstruct(ty->size, ty, lev + 1); + else { + error("missing { in initialization of `%t'\n", ty); + n = initstruct(ty->u.sym->u.s.flist->type->size, ty, lev + 1); + } + } + if (isarray(ty)) + aty = unqual(ty->type); + if (isarray(ty) && ischar(aty)) { + if (t == SCON) { + if (ty->size > 0 && ty->size == tsym->type->size - 1) + tsym->type = array(chartype, ty->size, 0); + n = tsym->type->size; + (*IR->defstring)(tsym->type->size, tsym->u.c.v.p); + t = gettok(); + } else if (t == '{') { + t = gettok(); + if (t == SCON) { + ty = initializer(ty, lev + 1); + initend(lev, follow); + return ty; + } + n = initchar(0, aty); + test('}', follow); + } else if (lev > 0 && ty->size > 0) + n = initchar(ty->size, aty); + else { /* eg, char c[] = 0; */ + error("missing { in initialization of `%t'\n", ty); + n = initchar(1, aty); + } + } else if (isarray(ty)) { + if (t == SCON && aty == widechar) { + int i; + unsigned int *s = tsym->u.c.v.p; + if (ty->size > 0 && ty->size == tsym->type->size - widechar->size) + tsym->type = array(widechar, ty->size/widechar->size, 0); + n = tsym->type->size; + for (i = 0; i < n; i += widechar->size) { + Value v; + v.u = *s++; + (*IR->defconst)(widechar->op, widechar->size, v); + } + t = gettok(); + } else if (t == '{') { + t = gettok(); + if (t == SCON && aty == widechar) { + ty = initializer(ty, lev + 1); + initend(lev, follow); + return ty; + } + n = initarray(0, aty, lev + 1); + test('}', follow); + } else if (lev > 0 && ty->size > 0) + n = initarray(ty->size, aty, lev + 1); + else { + error("missing { in initialization of `%t'\n", ty); + n = initarray(aty->size, aty, lev + 1); + } + } + if (ty->size) { + if (n > ty->size) + error("too many initializers\n"); + else if (n < ty->size) + (*IR->space)(ty->size - n); + } else if (isarray(ty) && ty->type->size > 0) + ty = array(ty->type, n/ty->type->size, 0); + else + ty->size = n; + return ty; +} + +/* swtoseg - switch to segment seg, if necessary */ +void swtoseg(int seg) { + if (curseg != seg) + (*IR->segment)(seg); + curseg = seg; +} diff --git a/quake3/source/lcc/src/inits.c b/quake3/source/lcc/src/inits.c new file mode 100644 index 0000000..d4d49df --- /dev/null +++ b/quake3/source/lcc/src/inits.c @@ -0,0 +1,8 @@ +void init(int argc, char *argv[]) { + {extern void input_init(int, char *[]); input_init(argc, argv);} + {extern void main_init(int, char *[]); main_init(argc, argv);} + {extern void prof_init(int, char *[]); prof_init(argc, argv);} + {extern void trace_init(int, char *[]); trace_init(argc, argv);} + {extern void type_init(int, char *[]); type_init(argc, argv);} + {extern void x86linux_init(int, char *[]); x86linux_init(argc, argv);} +} diff --git a/quake3/source/lcc/src/input.c b/quake3/source/lcc/src/input.c new file mode 100644 index 0000000..2f34420 --- /dev/null +++ b/quake3/source/lcc/src/input.c @@ -0,0 +1,134 @@ +#include "c.h" + + +static void pragma(void); +static void resynch(void); + +static int bsize; +static unsigned char buffer[MAXLINE+1 + BUFSIZE+1]; +unsigned char *cp; /* current input character */ +char *file; /* current input file name */ +char *firstfile; /* first input file */ +unsigned char *limit; /* points to last character + 1 */ +char *line; /* current line */ +int lineno; /* line number of current line */ + +void nextline(void) { + do { + if (cp >= limit) { + fillbuf(); + if (cp >= limit) + cp = limit; + if (cp == limit) + return; + } else { + lineno++; + for (line = (char *)cp; *cp==' ' || *cp=='\t'; cp++) + ; + if (*cp == '#') { + resynch(); + nextline(); + } + } + } while (*cp == '\n' && cp == limit); +} +void fillbuf(void) { + if (bsize == 0) + return; + if (cp >= limit) + cp = &buffer[MAXLINE+1]; + else + { + int n = limit - cp; + unsigned char *s = &buffer[MAXLINE+1] - n; + assert(s >= buffer); + line = (char *)s - ((char *)cp - line); + while (cp < limit) + *s++ = *cp++; + cp = &buffer[MAXLINE+1] - n; + } + if (feof(stdin)) + bsize = 0; + else + bsize = fread(&buffer[MAXLINE+1], 1, BUFSIZE, stdin); + if (bsize < 0) { + error("read error\n"); + exit(EXIT_FAILURE); + } + limit = &buffer[MAXLINE+1+bsize]; + *limit = '\n'; +} +void input_init(int argc, char *argv[]) { + static int inited; + + if (inited) + return; + inited = 1; + main_init(argc, argv); + limit = cp = &buffer[MAXLINE+1]; + bsize = -1; + lineno = 0; + file = NULL; + fillbuf(); + if (cp >= limit) + cp = limit; + nextline(); +} + +/* pragma - handle #pragma ref id... */ +static void pragma(void) { + if ((t = gettok()) == ID && strcmp(token, "ref") == 0) + for (;;) { + while (*cp == ' ' || *cp == '\t') + cp++; + if (*cp == '\n' || *cp == 0) + break; + if ((t = gettok()) == ID && tsym) { + tsym->ref++; + use(tsym, src); + } + } +} + +/* resynch - set line number/file name in # n [ "file" ] and #pragma ... */ +static void resynch(void) { + for (cp++; *cp == ' ' || *cp == '\t'; ) + cp++; + if (limit - cp < MAXLINE) + fillbuf(); + if (strncmp((char *)cp, "pragma", 6) == 0) { + cp += 6; + pragma(); + } else if (*cp >= '0' && *cp <= '9') { + line: for (lineno = 0; *cp >= '0' && *cp <= '9'; ) + lineno = 10*lineno + *cp++ - '0'; + lineno--; + while (*cp == ' ' || *cp == '\t') + cp++; + if (*cp == '"') { + file = (char *)++cp; + while (*cp && *cp != '"' && *cp != '\n') + cp++; + file = stringn(file, (char *)cp - file); + if (*cp == '\n') + warning("missing \" in preprocessor line\n"); + if (firstfile == 0) + firstfile = file; + } + } else if (strncmp((char *)cp, "line", 4) == 0) { + for (cp += 4; *cp == ' ' || *cp == '\t'; ) + cp++; + if (*cp >= '0' && *cp <= '9') + goto line; + if (Aflag >= 2) + warning("unrecognized control line\n"); + } else if (Aflag >= 2 && *cp != '\n') + warning("unrecognized control line\n"); + while (*cp) + if (*cp++ == '\n') + if (cp == limit + 1) + nextline(); + else + break; +} + diff --git a/quake3/source/lcc/src/lex.c b/quake3/source/lcc/src/lex.c new file mode 100644 index 0000000..09c50f3 --- /dev/null +++ b/quake3/source/lcc/src/lex.c @@ -0,0 +1,922 @@ +#include "c.h" +#include +#include + + +#define MAXTOKEN 32 + +enum { BLANK=01, NEWLINE=02, LETTER=04, + DIGIT=010, HEX=020, OTHER=040 }; + +static unsigned char map[256] = { /* 000 nul */ 0, + /* 001 soh */ 0, + /* 002 stx */ 0, + /* 003 etx */ 0, + /* 004 eot */ 0, + /* 005 enq */ 0, + /* 006 ack */ 0, + /* 007 bel */ 0, + /* 010 bs */ 0, + /* 011 ht */ BLANK, + /* 012 nl */ NEWLINE, + /* 013 vt */ BLANK, + /* 014 ff */ BLANK, + /* 015 cr */ 0, + /* 016 so */ 0, + /* 017 si */ 0, + /* 020 dle */ 0, + /* 021 dc1 */ 0, + /* 022 dc2 */ 0, + /* 023 dc3 */ 0, + /* 024 dc4 */ 0, + /* 025 nak */ 0, + /* 026 syn */ 0, + /* 027 etb */ 0, + /* 030 can */ 0, + /* 031 em */ 0, + /* 032 sub */ 0, + /* 033 esc */ 0, + /* 034 fs */ 0, + /* 035 gs */ 0, + /* 036 rs */ 0, + /* 037 us */ 0, + /* 040 sp */ BLANK, + /* 041 ! */ OTHER, + /* 042 " */ OTHER, + /* 043 # */ OTHER, + /* 044 $ */ 0, + /* 045 % */ OTHER, + /* 046 & */ OTHER, + /* 047 ' */ OTHER, + /* 050 ( */ OTHER, + /* 051 ) */ OTHER, + /* 052 * */ OTHER, + /* 053 + */ OTHER, + /* 054 , */ OTHER, + /* 055 - */ OTHER, + /* 056 . */ OTHER, + /* 057 / */ OTHER, + /* 060 0 */ DIGIT, + /* 061 1 */ DIGIT, + /* 062 2 */ DIGIT, + /* 063 3 */ DIGIT, + /* 064 4 */ DIGIT, + /* 065 5 */ DIGIT, + /* 066 6 */ DIGIT, + /* 067 7 */ DIGIT, + /* 070 8 */ DIGIT, + /* 071 9 */ DIGIT, + /* 072 : */ OTHER, + /* 073 ; */ OTHER, + /* 074 < */ OTHER, + /* 075 = */ OTHER, + /* 076 > */ OTHER, + /* 077 ? */ OTHER, + /* 100 @ */ 0, + /* 101 A */ LETTER|HEX, + /* 102 B */ LETTER|HEX, + /* 103 C */ LETTER|HEX, + /* 104 D */ LETTER|HEX, + /* 105 E */ LETTER|HEX, + /* 106 F */ LETTER|HEX, + /* 107 G */ LETTER, + /* 110 H */ LETTER, + /* 111 I */ LETTER, + /* 112 J */ LETTER, + /* 113 K */ LETTER, + /* 114 L */ LETTER, + /* 115 M */ LETTER, + /* 116 N */ LETTER, + /* 117 O */ LETTER, + /* 120 P */ LETTER, + /* 121 Q */ LETTER, + /* 122 R */ LETTER, + /* 123 S */ LETTER, + /* 124 T */ LETTER, + /* 125 U */ LETTER, + /* 126 V */ LETTER, + /* 127 W */ LETTER, + /* 130 X */ LETTER, + /* 131 Y */ LETTER, + /* 132 Z */ LETTER, + /* 133 [ */ OTHER, + /* 134 \ */ OTHER, + /* 135 ] */ OTHER, + /* 136 ^ */ OTHER, + /* 137 _ */ LETTER, + /* 140 ` */ 0, + /* 141 a */ LETTER|HEX, + /* 142 b */ LETTER|HEX, + /* 143 c */ LETTER|HEX, + /* 144 d */ LETTER|HEX, + /* 145 e */ LETTER|HEX, + /* 146 f */ LETTER|HEX, + /* 147 g */ LETTER, + /* 150 h */ LETTER, + /* 151 i */ LETTER, + /* 152 j */ LETTER, + /* 153 k */ LETTER, + /* 154 l */ LETTER, + /* 155 m */ LETTER, + /* 156 n */ LETTER, + /* 157 o */ LETTER, + /* 160 p */ LETTER, + /* 161 q */ LETTER, + /* 162 r */ LETTER, + /* 163 s */ LETTER, + /* 164 t */ LETTER, + /* 165 u */ LETTER, + /* 166 v */ LETTER, + /* 167 w */ LETTER, + /* 170 x */ LETTER, + /* 171 y */ LETTER, + /* 172 z */ LETTER, + /* 173 { */ OTHER, + /* 174 | */ OTHER, + /* 175 } */ OTHER, + /* 176 ~ */ OTHER, }; +static struct symbol tval; +static char cbuf[BUFSIZE+1]; +static unsigned int wcbuf[BUFSIZE+1]; + +Coordinate src; /* current source coordinate */ +int t; +char *token; /* current token */ +Symbol tsym; /* symbol table entry for current token */ + +static void *cput(int c, void *cl); +static void *wcput(int c, void *cl); +static void *scon(int q, void *put(int c, void *cl), void *cl); +static int backslash(int q); +static Symbol fcon(void); +static Symbol icon(unsigned long, int, int); +static void ppnumber(char *); + +int gettok(void) { + for (;;) { + register unsigned char *rcp = cp; + while (map[*rcp]&BLANK) + rcp++; + if (limit - rcp < MAXTOKEN) { + cp = rcp; + fillbuf(); + rcp = cp; + } + src.file = file; + src.x = (char *)rcp - line; + src.y = lineno; + cp = rcp + 1; + switch (*rcp++) { + case '/': if (*rcp == '*') { + int c = 0; + for (rcp++; *rcp != '/' || c != '*'; ) + if (map[*rcp]&NEWLINE) { + if (rcp < limit) + c = *rcp; + cp = rcp + 1; + nextline(); + rcp = cp; + if (rcp == limit) + break; + } else + c = *rcp++; + if (rcp < limit) + rcp++; + else + error("unclosed comment\n"); + cp = rcp; + continue; + } + return '/'; + case '<': + if (*rcp == '=') return cp++, LEQ; + if (*rcp == '<') return cp++, LSHIFT; + return '<'; + case '>': + if (*rcp == '=') return cp++, GEQ; + if (*rcp == '>') return cp++, RSHIFT; + return '>'; + case '-': + if (*rcp == '>') return cp++, DEREF; + if (*rcp == '-') return cp++, DECR; + return '-'; + case '=': return *rcp == '=' ? cp++, EQL : '='; + case '!': return *rcp == '=' ? cp++, NEQ : '!'; + case '|': return *rcp == '|' ? cp++, OROR : '|'; + case '&': return *rcp == '&' ? cp++, ANDAND : '&'; + case '+': return *rcp == '+' ? cp++, INCR : '+'; + case ';': case ',': case ':': + case '*': case '~': case '%': case '^': case '?': + case '[': case ']': case '{': case '}': case '(': case ')': + return rcp[-1]; + case '\n': case '\v': case '\r': case '\f': + nextline(); + if (cp == limit) { + tsym = NULL; + return EOI; + } + continue; + + case 'i': + if (rcp[0] == 'f' + && !(map[rcp[1]]&(DIGIT|LETTER))) { + cp = rcp + 1; + return IF; + } + if (rcp[0] == 'n' + && rcp[1] == 't' + && !(map[rcp[2]]&(DIGIT|LETTER))) { + cp = rcp + 2; + tsym = inttype->u.sym; + return INT; + } + goto id; + case 'h': case 'j': case 'k': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'x': case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + case 'G': case 'H': case 'I': case 'J': case 'K': + case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': + id: + if (limit - rcp < MAXLINE) { + cp = rcp - 1; + fillbuf(); + rcp = ++cp; + } + assert(cp == rcp); + token = (char *)rcp - 1; + while (map[*rcp]&(DIGIT|LETTER)) + rcp++; + token = stringn(token, (char *)rcp - token); + tsym = lookup(token, identifiers); + cp = rcp; + return ID; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { + unsigned long n = 0; + if (limit - rcp < MAXLINE) { + cp = rcp - 1; + fillbuf(); + rcp = ++cp; + } + assert(cp == rcp); + token = (char *)rcp - 1; + if (*token == '0' && (*rcp == 'x' || *rcp == 'X')) { + int d, overflow = 0; + while (*++rcp) { + if (map[*rcp]&DIGIT) + d = *rcp - '0'; + else if (*rcp >= 'a' && *rcp <= 'f') + d = *rcp - 'a' + 10; + else if (*rcp >= 'A' && *rcp <= 'F') + d = *rcp - 'A' + 10; + else + break; + if (n&~(~0UL >> 4)) + overflow = 1; + else + n = (n<<4) + d; + } + if ((char *)rcp - token <= 2) + error("invalid hexadecimal constant `%S'\n", token, (char *)rcp-token); + cp = rcp; + tsym = icon(n, overflow, 16); + } else if (*token == '0') { + int err = 0, overflow = 0; + for ( ; map[*rcp]&DIGIT; rcp++) { + if (*rcp == '8' || *rcp == '9') + err = 1; + if (n&~(~0UL >> 3)) + overflow = 1; + else + n = (n<<3) + (*rcp - '0'); + } + if (*rcp == '.' || *rcp == 'e' || *rcp == 'E') { + cp = rcp; + tsym = fcon(); + return FCON; + } + cp = rcp; + tsym = icon(n, overflow, 8); + if (err) + error("invalid octal constant `%S'\n", token, (char*)cp-token); + } else { + int overflow = 0; + for (n = *token - '0'; map[*rcp]&DIGIT; ) { + int d = *rcp++ - '0'; + if (n > (ULONG_MAX - d)/10) + overflow = 1; + else + n = 10*n + d; + } + if (*rcp == '.' || *rcp == 'e' || *rcp == 'E') { + cp = rcp; + tsym = fcon(); + return FCON; + } + cp = rcp; + tsym = icon(n, overflow, 10); + } + return ICON; + } + case '.': + if (rcp[0] == '.' && rcp[1] == '.') { + cp += 2; + return ELLIPSIS; + } + if ((map[*rcp]&DIGIT) == 0) + return '.'; + if (limit - rcp < MAXLINE) { + cp = rcp - 1; + fillbuf(); + rcp = ++cp; + } + assert(cp == rcp); + cp = rcp - 1; + token = (char *)cp; + tsym = fcon(); + return FCON; + case 'L': + if (*rcp == '\'') { + unsigned int *s = scon(*cp, wcput, wcbuf); + if (s - wcbuf > 2) + warning("excess characters in wide-character literal ignored\n"); + tval.type = widechar; + tval.u.c.v.u = wcbuf[0]; + tsym = &tval; + return ICON; + } else if (*rcp == '"') { + unsigned int *s = scon(*cp, wcput, wcbuf); + tval.type = array(widechar, s - wcbuf, 0); + tval.u.c.v.p = wcbuf; + tsym = &tval; + return SCON; + } else + goto id; + case '\'': { + char *s = scon(*--cp, cput, cbuf); + if (s - cbuf > 2) + warning("excess characters in multibyte character literal ignored\n"); + tval.type = inttype; + if (chartype->op == INT) + tval.u.c.v.i = extend(cbuf[0], chartype); + else + tval.u.c.v.i = cbuf[0]&0xFF; + tsym = &tval; + return ICON; + } + case '"': { + char *s = scon(*--cp, cput, cbuf); + tval.type = array(chartype, s - cbuf, 0); + tval.u.c.v.p = cbuf; + tsym = &tval; + return SCON; + } + case 'a': + if (rcp[0] == 'u' + && rcp[1] == 't' + && rcp[2] == 'o' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + return AUTO; + } + goto id; + case 'b': + if (rcp[0] == 'r' + && rcp[1] == 'e' + && rcp[2] == 'a' + && rcp[3] == 'k' + && !(map[rcp[4]]&(DIGIT|LETTER))) { + cp = rcp + 4; + return BREAK; + } + goto id; + case 'c': + if (rcp[0] == 'a' + && rcp[1] == 's' + && rcp[2] == 'e' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + return CASE; + } + if (rcp[0] == 'h' + && rcp[1] == 'a' + && rcp[2] == 'r' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + tsym = chartype->u.sym; + return CHAR; + } + if (rcp[0] == 'o' + && rcp[1] == 'n' + && rcp[2] == 's' + && rcp[3] == 't' + && !(map[rcp[4]]&(DIGIT|LETTER))) { + cp = rcp + 4; + return CONST; + } + if (rcp[0] == 'o' + && rcp[1] == 'n' + && rcp[2] == 't' + && rcp[3] == 'i' + && rcp[4] == 'n' + && rcp[5] == 'u' + && rcp[6] == 'e' + && !(map[rcp[7]]&(DIGIT|LETTER))) { + cp = rcp + 7; + return CONTINUE; + } + goto id; + case 'd': + if (rcp[0] == 'e' + && rcp[1] == 'f' + && rcp[2] == 'a' + && rcp[3] == 'u' + && rcp[4] == 'l' + && rcp[5] == 't' + && !(map[rcp[6]]&(DIGIT|LETTER))) { + cp = rcp + 6; + return DEFAULT; + } + if (rcp[0] == 'o' + && rcp[1] == 'u' + && rcp[2] == 'b' + && rcp[3] == 'l' + && rcp[4] == 'e' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + tsym = doubletype->u.sym; + return DOUBLE; + } + if (rcp[0] == 'o' + && !(map[rcp[1]]&(DIGIT|LETTER))) { + cp = rcp + 1; + return DO; + } + goto id; + case 'e': + if (rcp[0] == 'l' + && rcp[1] == 's' + && rcp[2] == 'e' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + return ELSE; + } + if (rcp[0] == 'n' + && rcp[1] == 'u' + && rcp[2] == 'm' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + return ENUM; + } + if (rcp[0] == 'x' + && rcp[1] == 't' + && rcp[2] == 'e' + && rcp[3] == 'r' + && rcp[4] == 'n' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return EXTERN; + } + goto id; + case 'f': + if (rcp[0] == 'l' + && rcp[1] == 'o' + && rcp[2] == 'a' + && rcp[3] == 't' + && !(map[rcp[4]]&(DIGIT|LETTER))) { + cp = rcp + 4; + tsym = floattype->u.sym; + return FLOAT; + } + if (rcp[0] == 'o' + && rcp[1] == 'r' + && !(map[rcp[2]]&(DIGIT|LETTER))) { + cp = rcp + 2; + return FOR; + } + goto id; + case 'g': + if (rcp[0] == 'o' + && rcp[1] == 't' + && rcp[2] == 'o' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + return GOTO; + } + goto id; + case 'l': + if (rcp[0] == 'o' + && rcp[1] == 'n' + && rcp[2] == 'g' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + return LONG; + } + goto id; + case 'r': + if (rcp[0] == 'e' + && rcp[1] == 'g' + && rcp[2] == 'i' + && rcp[3] == 's' + && rcp[4] == 't' + && rcp[5] == 'e' + && rcp[6] == 'r' + && !(map[rcp[7]]&(DIGIT|LETTER))) { + cp = rcp + 7; + return REGISTER; + } + if (rcp[0] == 'e' + && rcp[1] == 't' + && rcp[2] == 'u' + && rcp[3] == 'r' + && rcp[4] == 'n' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return RETURN; + } + goto id; + case 's': + if (rcp[0] == 'h' + && rcp[1] == 'o' + && rcp[2] == 'r' + && rcp[3] == 't' + && !(map[rcp[4]]&(DIGIT|LETTER))) { + cp = rcp + 4; + return SHORT; + } + if (rcp[0] == 'i' + && rcp[1] == 'g' + && rcp[2] == 'n' + && rcp[3] == 'e' + && rcp[4] == 'd' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return SIGNED; + } + if (rcp[0] == 'i' + && rcp[1] == 'z' + && rcp[2] == 'e' + && rcp[3] == 'o' + && rcp[4] == 'f' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return SIZEOF; + } + if (rcp[0] == 't' + && rcp[1] == 'a' + && rcp[2] == 't' + && rcp[3] == 'i' + && rcp[4] == 'c' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return STATIC; + } + if (rcp[0] == 't' + && rcp[1] == 'r' + && rcp[2] == 'u' + && rcp[3] == 'c' + && rcp[4] == 't' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return STRUCT; + } + if (rcp[0] == 'w' + && rcp[1] == 'i' + && rcp[2] == 't' + && rcp[3] == 'c' + && rcp[4] == 'h' + && !(map[rcp[5]]&(DIGIT|LETTER))) { + cp = rcp + 5; + return SWITCH; + } + goto id; + case 't': + if (rcp[0] == 'y' + && rcp[1] == 'p' + && rcp[2] == 'e' + && rcp[3] == 'd' + && rcp[4] == 'e' + && rcp[5] == 'f' + && !(map[rcp[6]]&(DIGIT|LETTER))) { + cp = rcp + 6; + return TYPEDEF; + } + goto id; + case 'u': + if (rcp[0] == 'n' + && rcp[1] == 'i' + && rcp[2] == 'o' + && rcp[3] == 'n' + && !(map[rcp[4]]&(DIGIT|LETTER))) { + cp = rcp + 4; + return UNION; + } + if (rcp[0] == 'n' + && rcp[1] == 's' + && rcp[2] == 'i' + && rcp[3] == 'g' + && rcp[4] == 'n' + && rcp[5] == 'e' + && rcp[6] == 'd' + && !(map[rcp[7]]&(DIGIT|LETTER))) { + cp = rcp + 7; + return UNSIGNED; + } + goto id; + case 'v': + if (rcp[0] == 'o' + && rcp[1] == 'i' + && rcp[2] == 'd' + && !(map[rcp[3]]&(DIGIT|LETTER))) { + cp = rcp + 3; + tsym = voidtype->u.sym; + return VOID; + } + if (rcp[0] == 'o' + && rcp[1] == 'l' + && rcp[2] == 'a' + && rcp[3] == 't' + && rcp[4] == 'i' + && rcp[5] == 'l' + && rcp[6] == 'e' + && !(map[rcp[7]]&(DIGIT|LETTER))) { + cp = rcp + 7; + return VOLATILE; + } + goto id; + case 'w': + if (rcp[0] == 'h' + && rcp[1] == 'i' + && rcp[2] == 'l' + && rcp[3] == 'e' + && !(map[rcp[4]]&(DIGIT|LETTER))) { + cp = rcp + 4; + return WHILE; + } + goto id; + case '_': + if (rcp[0] == '_' + && rcp[1] == 't' + && rcp[2] == 'y' + && rcp[3] == 'p' + && rcp[4] == 'e' + && rcp[5] == 'c' + && rcp[6] == 'o' + && rcp[7] == 'd' + && rcp[8] == 'e' + && !(map[rcp[9]]&(DIGIT|LETTER))) { + cp = rcp + 9; + return TYPECODE; + } + if (rcp[0] == '_' + && rcp[1] == 'f' + && rcp[2] == 'i' + && rcp[3] == 'r' + && rcp[4] == 's' + && rcp[5] == 't' + && rcp[6] == 'a' + && rcp[7] == 'r' + && rcp[8] == 'g' + && !(map[rcp[9]]&(DIGIT|LETTER))) { + cp = rcp + 9; + return FIRSTARG; + } + goto id; + default: + if ((map[cp[-1]]&BLANK) == 0) + if (cp[-1] < ' ' || cp[-1] >= 0177) + error("illegal character `\\0%o'\n", cp[-1]); + else + error("illegal character `%c'\n", cp[-1]); + } + } +} +static Symbol icon(unsigned long n, int overflow, int base) { + if ((*cp=='u'||*cp=='U') && (cp[1]=='l'||cp[1]=='L') + || (*cp=='l'||*cp=='L') && (cp[1]=='u'||cp[1]=='U')) { + tval.type = unsignedlong; + cp += 2; + } else if (*cp == 'u' || *cp == 'U') { + if (overflow || n > unsignedtype->u.sym->u.limits.max.i) + tval.type = unsignedlong; + else + tval.type = unsignedtype; + cp += 1; + } else if (*cp == 'l' || *cp == 'L') { + if (overflow || n > longtype->u.sym->u.limits.max.i) + tval.type = unsignedlong; + else + tval.type = longtype; + cp += 1; + } else if (overflow || n > longtype->u.sym->u.limits.max.i) + tval.type = unsignedlong; + else if (n > inttype->u.sym->u.limits.max.i) + tval.type = longtype; + else if (base != 10 && n > inttype->u.sym->u.limits.max.i) + tval.type = unsignedtype; + else + tval.type = inttype; + switch (tval.type->op) { + case INT: + if (overflow || n > tval.type->u.sym->u.limits.max.i) { + warning("overflow in constant `%S'\n", token, + (char*)cp - token); + tval.u.c.v.i = tval.type->u.sym->u.limits.max.i; + } else + tval.u.c.v.i = n; + break; + case UNSIGNED: + if (overflow || n > tval.type->u.sym->u.limits.max.u) { + warning("overflow in constant `%S'\n", token, + (char*)cp - token); + tval.u.c.v.u = tval.type->u.sym->u.limits.max.u; + } else + tval.u.c.v.u = n; + break; + default: assert(0); + } + ppnumber("integer"); + return &tval; +} +static void ppnumber(char *which) { + unsigned char *rcp = cp--; + + for ( ; (map[*cp]&(DIGIT|LETTER)) || *cp == '.'; cp++) + if ((cp[0] == 'E' || cp[0] == 'e') + && (cp[1] == '-' || cp[1] == '+')) + cp++; + if (cp > rcp) + error("`%S' is a preprocessing number but an invalid %s constant\n", token, + + (char*)cp-token, which); +} +static Symbol fcon(void) { + if (*cp == '.') + do + cp++; + while (map[*cp]&DIGIT); + if (*cp == 'e' || *cp == 'E') { + if (*++cp == '-' || *cp == '+') + cp++; + if (map[*cp]&DIGIT) + do + cp++; + while (map[*cp]&DIGIT); + else + error("invalid floating constant `%S'\n", token, + (char*)cp - token); + } + + errno = 0; + tval.u.c.v.d = strtod(token, NULL); + if (errno == ERANGE) + warning("overflow in floating constant `%S'\n", token, + (char*)cp - token); + if (*cp == 'f' || *cp == 'F') { + ++cp; + if (tval.u.c.v.d > floattype->u.sym->u.limits.max.d) + warning("overflow in floating constant `%S'\n", token, + (char*)cp - token); + tval.type = floattype; + } else if (*cp == 'l' || *cp == 'L') { + cp++; + tval.type = longdouble; + } else { + if (tval.u.c.v.d > doubletype->u.sym->u.limits.max.d) + warning("overflow in floating constant `%S'\n", token, + (char*)cp - token); + tval.type = doubletype; + } + ppnumber("floating"); + return &tval; +} + +static void *cput(int c, void *cl) { + char *s = cl; + + if (c < 0 || c > 255) + warning("overflow in escape sequence with resulting value `%d'\n", c); + *s++ = c; + return s; +} + +static void *wcput(int c, void *cl) { + unsigned int *s = cl; + + *s++ = c; + return s; +} + +static void *scon(int q, void *put(int c, void *cl), void *cl) { + int n = 0, nbad = 0; + + do { + cp++; + while (*cp != q) { + int c; + if (map[*cp]&NEWLINE) { + if (cp < limit) + break; + cp++; + nextline(); + if (cp == limit) + break; + continue; + } + c = *cp++; + if (c == '\\') { + if (map[*cp]&NEWLINE) { + if (cp < limit) + break; + cp++; + nextline(); + } + if (limit - cp < MAXTOKEN) + fillbuf(); + c = backslash(q); + } else if (c < 0 || c > 255 || map[c] == 0) + nbad++; + if (n++ < BUFSIZE) + cl = put(c, cl); + } + if (*cp == q) + cp++; + else + error("missing %c\n", q); + } while (q == '"' && getchr() == '"'); + cl = put(0, cl); + if (n >= BUFSIZE) + error("%s literal too long\n", q == '"' ? "string" : "character"); + if (Aflag >= 2 && q == '"' && n > 509) + warning("more than 509 characters in a string literal\n"); + if (Aflag >= 2 && nbad > 0) + warning("%s literal contains non-portable characters\n", + q == '"' ? "string" : "character"); + return cl; +} +int getchr(void) { + for (;;) { + while (map[*cp]&BLANK) + cp++; + if (!(map[*cp]&NEWLINE)) + return *cp; + cp++; + nextline(); + if (cp == limit) + return EOI; + } +} +static int backslash(int q) { + unsigned int c; + + switch (*cp++) { + case 'a': return 7; + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + case '\'': case '"': case '\\': case '\?': break; + case 'x': { + int overflow = 0; + if ((map[*cp]&(DIGIT|HEX)) == 0) { + if (*cp < ' ' || *cp == 0177) + error("ill-formed hexadecimal escape sequence\n"); + else + error("ill-formed hexadecimal escape sequence `\\x%c'\n", *cp); + if (*cp != q) + cp++; + return 0; + } + for (c = 0; map[*cp]&(DIGIT|HEX); cp++) { + if (c >> (8*widechar->size - 4)) + overflow = 1; + if (map[*cp]&DIGIT) + c = (c<<4) + *cp - '0'; + else + c = (c<<4) + (*cp&~040) - 'A' + 10; + } + if (overflow) + warning("overflow in hexadecimal escape sequence\n"); + return c&ones(8*widechar->size); + } + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c = *(cp-1) - '0'; + if (*cp >= '0' && *cp <= '7') { + c = (c<<3) + *cp++ - '0'; + if (*cp >= '0' && *cp <= '7') + c = (c<<3) + *cp++ - '0'; + } + return c; + default: + if (cp[-1] < ' ' || cp[-1] >= 0177) + warning("unrecognized character escape sequence\n"); + else + warning("unrecognized character escape sequence `\\%c'\n", cp[-1]); + } + return cp[-1]; +} diff --git a/quake3/source/lcc/src/list.c b/quake3/source/lcc/src/list.c new file mode 100644 index 0000000..dbd63ed --- /dev/null +++ b/quake3/source/lcc/src/list.c @@ -0,0 +1,56 @@ +#include "c.h" + + +static List freenodes; /* free list nodes */ + +/* append - append x to list, return new list */ +List append(void *x, List list) { + List new; + + if ((new = freenodes) != NULL) + freenodes = freenodes->link; + else + NEW(new, PERM); + if (list) { + new->link = list->link; + list->link = new; + } else + new->link = new; + new->x = x; + return new; +} + +/* length - # elements in list */ +int length(List list) { + int n = 0; + + if (list) { + List lp = list; + do + n++; + while ((lp = lp->link) != list); + } + return n; +} + +/* ltov - convert list to an NULL-terminated vector allocated in arena */ +void *ltov(List *list, unsigned arena) { + int i = 0; + void **array = newarray(length(*list) + 1, sizeof array[0], arena); + + if (*list) { + List lp = *list; + do { + lp = lp->link; + array[i++] = lp->x; + } while (lp != *list); +#ifndef PURIFY + lp = (*list)->link; + (*list)->link = freenodes; + freenodes = lp; +#endif + } + *list = NULL; + array[i] = NULL; + return array; +} diff --git a/quake3/source/lcc/src/main.c b/quake3/source/lcc/src/main.c new file mode 100644 index 0000000..1367fa0 --- /dev/null +++ b/quake3/source/lcc/src/main.c @@ -0,0 +1,225 @@ +#include "c.h" + +static char rcsid[] = "main.c - faked rcsid"; + +static void typestab(Symbol, void *); + +static void stabline(Coordinate *); +static void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *); +Interface *IR = NULL; + +int Aflag; /* >= 0 if -A specified */ +int Pflag; /* != 0 if -P specified */ +int glevel; /* == [0-9] if -g[0-9] specified */ +int xref; /* != 0 for cross-reference data */ +Symbol YYnull; /* _YYnull symbol if -n or -nvalidate specified */ +Symbol YYcheck; /* _YYcheck symbol if -nvalidate,check specified */ + +static char *comment; +static Interface stabIR; +static char *currentfile; /* current file name */ +static int currentline; /* current line number */ +static FILE *srcfp; /* stream for current file, if non-NULL */ +static int srcpos; /* position of srcfp, if srcfp is non-NULL */ +int main(int argc, char *argv[]) { + int i, j; + for (i = argc - 1; i > 0; i--) + if (strncmp(argv[i], "-target=", 8) == 0) + break; + if (i > 0) { + char *s = strchr(argv[i], '\\'); + if (s != NULL) + *s = '/'; + for (j = 0; bindings[j].name && bindings[j].ir; j++) + if (strcmp(&argv[i][8], bindings[j].name) == 0) { + IR = bindings[j].ir; + break; + } + if (s != NULL) + *s = '\\'; + } + if (!IR) { + fprint(stderr, "%s: unknown target", argv[0]); + if (i > 0) + fprint(stderr, " `%s'", &argv[i][8]); + fprint(stderr, "; must specify one of\n"); + for (i = 0; bindings[i].name; i++) + fprint(stderr, "\t-target=%s\n", bindings[i].name); + exit(EXIT_FAILURE); + } + init(argc, argv); + t = gettok(); + (*IR->progbeg)(argc, argv); + if (glevel && IR->stabinit) + (*IR->stabinit)(firstfile, argc, argv); + program(); + if (events.end) + apply(events.end, NULL, NULL); + memset(&events, 0, sizeof events); + if (glevel || xref) { + Symbol symroot = NULL; + Coordinate src; + foreach(types, GLOBAL, typestab, &symroot); + foreach(identifiers, GLOBAL, typestab, &symroot); + src.file = firstfile; + src.x = 0; + src.y = lineno; + if ((glevel > 2 || xref) && IR->stabend) + (*IR->stabend)(&src, symroot, + ltov(&loci, PERM), + ltov(&symbols, PERM), NULL); + else if (IR->stabend) + (*IR->stabend)(&src, NULL, NULL, NULL, NULL); + } + finalize(); + (*IR->progend)(); + deallocate(PERM); + return errcnt > 0; +} +/* main_init - process program arguments */ +void main_init(int argc, char *argv[]) { + char *infile = NULL, *outfile = NULL; + int i; + static int inited; + + if (inited) + return; + inited = 1; + type_init(argc, argv); + for (i = 1; i < argc; i++) + if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "-g2") == 0) + glevel = 2; + else if (strncmp(argv[i], "-g", 2) == 0) { /* -gn[,x] */ + char *p = strchr(argv[i], ','); + glevel = atoi(argv[i]+2); + if (p) { + comment = p + 1; + if (glevel == 0) + glevel = 1; + if (stabIR.stabline == NULL) { + stabIR.stabline = IR->stabline; + stabIR.stabend = IR->stabend; + IR->stabline = stabline; + IR->stabend = stabend; + } + } + } else if (strcmp(argv[i], "-x") == 0) + xref++; + else if (strcmp(argv[i], "-A") == 0) { + ++Aflag; + } else if (strcmp(argv[i], "-P") == 0) + Pflag++; + else if (strcmp(argv[i], "-w") == 0) + wflag++; + else if (strcmp(argv[i], "-n") == 0) { + if (!YYnull) { + YYnull = install(string("_YYnull"), &globals, GLOBAL, PERM); + YYnull->type = func(voidptype, NULL, 1); + YYnull->sclass = EXTERN; + (*IR->defsymbol)(YYnull); + } + } else if (strncmp(argv[i], "-n", 2) == 0) { /* -nvalid[,check] */ + char *p = strchr(argv[i], ','); + if (p) { + YYcheck = install(string(p+1), &globals, GLOBAL, PERM); + YYcheck->type = func(voidptype, NULL, 1); + YYcheck->sclass = EXTERN; + (*IR->defsymbol)(YYcheck); + p = stringn(argv[i]+2, p - (argv[i]+2)); + } else + p = string(argv[i]+2); + YYnull = install(p, &globals, GLOBAL, PERM); + YYnull->type = func(voidptype, NULL, 1); + YYnull->sclass = EXTERN; + (*IR->defsymbol)(YYnull); + } else if (strcmp(argv[i], "-v") == 0) + fprint(stderr, "%s %s\n", argv[0], rcsid); + else if (strncmp(argv[i], "-s", 2) == 0) + density = strtod(&argv[i][2], NULL); + else if (strncmp(argv[i], "-errout=", 8) == 0) { + FILE *f = fopen(argv[i]+8, "w"); + if (f == NULL) { + fprint(stderr, "%s: can't write errors to `%s'\n", argv[0], argv[i]+8); + exit(EXIT_FAILURE); + } + fclose(f); + f = freopen(argv[i]+8, "w", stderr); + assert(f); + } else if (strncmp(argv[i], "-e", 2) == 0) { + int x; + if ((x = strtol(&argv[i][2], NULL, 0)) > 0) + errlimit = x; + } else if (strncmp(argv[i], "-little_endian=", 15) == 0) + IR->little_endian = argv[i][15] - '0'; + else if (strncmp(argv[i], "-mulops_calls=", 18) == 0) + IR->mulops_calls = argv[i][18] - '0'; + else if (strncmp(argv[i], "-wants_callb=", 13) == 0) + IR->wants_callb = argv[i][13] - '0'; + else if (strncmp(argv[i], "-wants_argb=", 12) == 0) + IR->wants_argb = argv[i][12] - '0'; + else if (strncmp(argv[i], "-left_to_right=", 15) == 0) + IR->left_to_right = argv[i][15] - '0'; + else if (strncmp(argv[i], "-wants_dag=", 11) == 0) + IR->wants_dag = argv[i][11] - '0'; + else if (*argv[i] != '-' || strcmp(argv[i], "-") == 0) { + if (infile == NULL) + infile = argv[i]; + else if (outfile == NULL) + outfile = argv[i]; + } + + if (infile != NULL && strcmp(infile, "-") != 0 + && freopen(infile, "r", stdin) == NULL) { + fprint(stderr, "%s: can't read `%s'\n", argv[0], infile); + exit(EXIT_FAILURE); + } + if (outfile != NULL && strcmp(outfile, "-") != 0 + && freopen(outfile, "w", stdout) == NULL) { + fprint(stderr, "%s: can't write `%s'\n", argv[0], outfile); + exit(EXIT_FAILURE); + } +} +/* typestab - emit stab entries for p */ +static void typestab(Symbol p, void *cl) { + if (*(Symbol *)cl == 0 && p->sclass && p->sclass != TYPEDEF) + *(Symbol *)cl = p; + if ((p->sclass == TYPEDEF || p->sclass == 0) && IR->stabtype) + (*IR->stabtype)(p); +} + +/* stabline - emit source code for source coordinate *cp */ +static void stabline(Coordinate *cp) { + if (cp->file && cp->file != currentfile) { + if (srcfp) + fclose(srcfp); + currentfile = cp->file; + srcfp = fopen(currentfile, "r"); + srcpos = 0; + currentline = 0; + } + if (currentline != cp->y && srcfp) { + char buf[512]; + if (srcpos > cp->y) { + rewind(srcfp); + srcpos = 0; + } + for ( ; srcpos < cp->y; srcpos++) + if (fgets(buf, sizeof buf, srcfp) == NULL) { + fclose(srcfp); + srcfp = NULL; + break; + } + if (srcfp && srcpos == cp->y) + print("%s%s", comment, buf); + } + currentline = cp->y; + if (stabIR.stabline) + (*stabIR.stabline)(cp); +} + +static void stabend(Coordinate *cp, Symbol p, Coordinate **cpp, Symbol *sp, Symbol *stab) { + if (stabIR.stabend) + (*stabIR.stabend)(cp, p, cpp, sp, stab); + if (srcfp) + fclose(srcfp); +} diff --git a/quake3/source/lcc/src/mips.md b/quake3/source/lcc/src/mips.md new file mode 100644 index 0000000..de34b39 --- /dev/null +++ b/quake3/source/lcc/src/mips.md @@ -0,0 +1,1120 @@ +%{ +#define INTTMP 0x0100ff00 +#define INTVAR 0x40ff0000 +#define FLTTMP 0x000f0ff0 +#define FLTVAR 0xfff00000 + +#define INTRET 0x00000004 +#define FLTRET 0x00000003 + +#define readsreg(p) \ + (generic((p)->op)==INDIR && (p)->kids[0]->op==VREG+P) +#define setsrc(d) ((d) && (d)->x.regnode && \ + (d)->x.regnode->set == src->x.regnode->set && \ + (d)->x.regnode->mask&src->x.regnode->mask) + +#define relink(a, b) ((b)->x.prev = (a), (a)->x.next = (b)) + +#include "c.h" +#define NODEPTR_TYPE Node +#define OP_LABEL(p) ((p)->op) +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define STATE_LABEL(p) ((p)->x.state) +static void address(Symbol, Symbol, long); +static void blkfetch(int, int, int, int); +static void blkloop(int, int, int, int, int, int[]); +static void blkstore(int, int, int, int); +static void defaddress(Symbol); +static void defconst(int, int, Value); +static void defstring(int, char *); +static void defsymbol(Symbol); +static void doarg(Node); +static void emit2(Node); +static void export(Symbol); +static void clobber(Node); +static void function(Symbol, Symbol [], Symbol [], int); +static void global(Symbol); +static void import(Symbol); +static void local(Symbol); +static void progbeg(int, char **); +static void progend(void); +static void segment(int); +static void space(int); +static void target(Node); +static int bitcount (unsigned); +static Symbol argreg (int, int, int, int, int); + +static Symbol ireg[32], freg2[32], d6; +static Symbol iregw, freg2w; +static int tmpregs[] = {3, 9, 10}; +static Symbol blkreg; + +static int gnum = 8; +static int pic; + +static int cseg; +%} +%start stmt +%term CNSTF4=4113 +%term CNSTF8=8209 +%term CNSTF16=16401 +%term CNSTI1=1045 +%term CNSTI2=2069 +%term CNSTI4=4117 +%term CNSTI8=8213 +%term CNSTP4=4119 +%term CNSTP8=8215 +%term CNSTU1=1046 +%term CNSTU2=2070 +%term CNSTU4=4118 +%term CNSTU8=8214 + +%term ARGB=41 +%term ARGF4=4129 +%term ARGF8=8225 +%term ARGF16=16417 +%term ARGI4=4133 +%term ARGI8=8229 +%term ARGP4=4135 +%term ARGP8=8231 +%term ARGU4=4134 +%term ARGU8=8230 + +%term ASGNB=57 +%term ASGNF4=4145 +%term ASGNF8=8241 +%term ASGNF16=16433 +%term ASGNI1=1077 +%term ASGNI2=2101 +%term ASGNI4=4149 +%term ASGNI8=8245 +%term ASGNP4=4151 +%term ASGNP8=8247 +%term ASGNU1=1078 +%term ASGNU2=2102 +%term ASGNU4=4150 +%term ASGNU8=8246 + +%term INDIRB=73 +%term INDIRF4=4161 +%term INDIRF8=8257 +%term INDIRF16=16449 +%term INDIRI1=1093 +%term INDIRI2=2117 +%term INDIRI4=4165 +%term INDIRI8=8261 +%term INDIRP4=4167 +%term INDIRP8=8263 +%term INDIRU1=1094 +%term INDIRU2=2118 +%term INDIRU4=4166 +%term INDIRU8=8262 + +%term CVFF4=4209 +%term CVFF8=8305 +%term CVFF16=16497 +%term CVFI4=4213 +%term CVFI8=8309 + +%term CVIF4=4225 +%term CVIF8=8321 +%term CVIF16=16513 +%term CVII1=1157 +%term CVII2=2181 +%term CVII4=4229 +%term CVII8=8325 +%term CVIU1=1158 +%term CVIU2=2182 +%term CVIU4=4230 +%term CVIU8=8326 + +%term CVPP4=4247 +%term CVPP8=8343 +%term CVPP16=16535 +%term CVPU4=4246 +%term CVPU8=8342 + +%term CVUI1=1205 +%term CVUI2=2229 +%term CVUI4=4277 +%term CVUI8=8373 +%term CVUP4=4279 +%term CVUP8=8375 +%term CVUP16=16567 +%term CVUU1=1206 +%term CVUU2=2230 +%term CVUU4=4278 +%term CVUU8=8374 + +%term NEGF4=4289 +%term NEGF8=8385 +%term NEGF16=16577 +%term NEGI4=4293 +%term NEGI8=8389 + +%term CALLB=217 +%term CALLF4=4305 +%term CALLF8=8401 +%term CALLF16=16593 +%term CALLI4=4309 +%term CALLI8=8405 +%term CALLP4=4311 +%term CALLP8=8407 +%term CALLU4=4310 +%term CALLU8=8406 +%term CALLV=216 + +%term RETF4=4337 +%term RETF8=8433 +%term RETF16=16625 +%term RETI4=4341 +%term RETI8=8437 +%term RETP4=4343 +%term RETP8=8439 +%term RETU4=4342 +%term RETU8=8438 +%term RETV=248 + +%term ADDRGP4=4359 +%term ADDRGP8=8455 + +%term ADDRFP4=4375 +%term ADDRFP8=8471 + +%term ADDRLP4=4391 +%term ADDRLP8=8487 + +%term ADDF4=4401 +%term ADDF8=8497 +%term ADDF16=16689 +%term ADDI4=4405 +%term ADDI8=8501 +%term ADDP4=4407 +%term ADDP8=8503 +%term ADDU4=4406 +%term ADDU8=8502 + +%term SUBF4=4417 +%term SUBF8=8513 +%term SUBF16=16705 +%term SUBI4=4421 +%term SUBI8=8517 +%term SUBP4=4423 +%term SUBP8=8519 +%term SUBU4=4422 +%term SUBU8=8518 + +%term LSHI4=4437 +%term LSHI8=8533 +%term LSHU4=4438 +%term LSHU8=8534 + +%term MODI4=4453 +%term MODI8=8549 +%term MODU4=4454 +%term MODU8=8550 + +%term RSHI4=4469 +%term RSHI8=8565 +%term RSHU4=4470 +%term RSHU8=8566 + +%term BANDI4=4485 +%term BANDI8=8581 +%term BANDU4=4486 +%term BANDU8=8582 + +%term BCOMI4=4501 +%term BCOMI8=8597 +%term BCOMU4=4502 +%term BCOMU8=8598 + +%term BORI4=4517 +%term BORI8=8613 +%term BORU4=4518 +%term BORU8=8614 + +%term BXORI4=4533 +%term BXORI8=8629 +%term BXORU4=4534 +%term BXORU8=8630 + +%term DIVF4=4545 +%term DIVF8=8641 +%term DIVF16=16833 +%term DIVI4=4549 +%term DIVI8=8645 +%term DIVU4=4550 +%term DIVU8=8646 + +%term MULF4=4561 +%term MULF8=8657 +%term MULF16=16849 +%term MULI4=4565 +%term MULI8=8661 +%term MULU4=4566 +%term MULU8=8662 + +%term EQF4=4577 +%term EQF8=8673 +%term EQF16=16865 +%term EQI4=4581 +%term EQI8=8677 +%term EQU4=4582 +%term EQU8=8678 + +%term GEF4=4593 +%term GEF8=8689 +%term GEI4=4597 +%term GEI8=8693 +%term GEI16=16885 +%term GEU4=4598 +%term GEU8=8694 + +%term GTF4=4609 +%term GTF8=8705 +%term GTF16=16897 +%term GTI4=4613 +%term GTI8=8709 +%term GTU4=4614 +%term GTU8=8710 + +%term LEF4=4625 +%term LEF8=8721 +%term LEF16=16913 +%term LEI4=4629 +%term LEI8=8725 +%term LEU4=4630 +%term LEU8=8726 + +%term LTF4=4641 +%term LTF8=8737 +%term LTF16=16929 +%term LTI4=4645 +%term LTI8=8741 +%term LTU4=4646 +%term LTU8=8742 + +%term NEF4=4657 +%term NEF8=8753 +%term NEF16=16945 +%term NEI4=4661 +%term NEI8=8757 +%term NEU4=4662 +%term NEU8=8758 + +%term JUMPV=584 + +%term LABELV=600 + +%term LOADB=233 +%term LOADF4=4321 +%term LOADF8=8417 +%term LOADF16=16609 +%term LOADI1=1253 +%term LOADI2=2277 +%term LOADI4=4325 +%term LOADI8=8421 +%term LOADP4=4327 +%term LOADP8=8423 +%term LOADU1=1254 +%term LOADU2=2278 +%term LOADU4=4326 +%term LOADU8=8422 + +%term VREGP=711 +%% +reg: INDIRI1(VREGP) "# read register\n" +reg: INDIRU1(VREGP) "# read register\n" + +reg: INDIRI2(VREGP) "# read register\n" +reg: INDIRU2(VREGP) "# read register\n" + +reg: INDIRF4(VREGP) "# read register\n" +reg: INDIRI4(VREGP) "# read register\n" +reg: INDIRP4(VREGP) "# read register\n" +reg: INDIRU4(VREGP) "# read register\n" + +reg: INDIRF8(VREGP) "# read register\n" +reg: INDIRI8(VREGP) "# read register\n" +reg: INDIRP8(VREGP) "# read register\n" +reg: INDIRU8(VREGP) "# read register\n" + +stmt: ASGNI1(VREGP,reg) "# write register\n" +stmt: ASGNU1(VREGP,reg) "# write register\n" + +stmt: ASGNI2(VREGP,reg) "# write register\n" +stmt: ASGNU2(VREGP,reg) "# write register\n" + +stmt: ASGNF4(VREGP,reg) "# write register\n" +stmt: ASGNI4(VREGP,reg) "# write register\n" +stmt: ASGNP4(VREGP,reg) "# write register\n" +stmt: ASGNU4(VREGP,reg) "# write register\n" + +stmt: ASGNF8(VREGP,reg) "# write register\n" +stmt: ASGNI8(VREGP,reg) "# write register\n" +stmt: ASGNP8(VREGP,reg) "# write register\n" +stmt: ASGNU8(VREGP,reg) "# write register\n" +con: CNSTI1 "%a" +con: CNSTU1 "%a" + +con: CNSTI2 "%a" +con: CNSTU2 "%a" + +con: CNSTI4 "%a" +con: CNSTU4 "%a" +con: CNSTP4 "%a" + +con: CNSTI8 "%a" +con: CNSTU8 "%a" +con: CNSTP8 "%a" +stmt: reg "" +acon: con "%0" +acon: ADDRGP4 "%a" +addr: ADDI4(reg,acon) "%1($%0)" +addr: ADDU4(reg,acon) "%1($%0)" +addr: ADDP4(reg,acon) "%1($%0)" +addr: acon "%0" +addr: reg "($%0)" +addr: ADDRFP4 "%a+%F($sp)" +addr: ADDRLP4 "%a+%F($sp)" +reg: addr "la $%c,%0\n" 1 +reg: CNSTI1 "# reg\n" range(a, 0, 0) +reg: CNSTI2 "# reg\n" range(a, 0, 0) +reg: CNSTI4 "# reg\n" range(a, 0, 0) +reg: CNSTU1 "# reg\n" range(a, 0, 0) +reg: CNSTU2 "# reg\n" range(a, 0, 0) +reg: CNSTU4 "# reg\n" range(a, 0, 0) +reg: CNSTP4 "# reg\n" range(a, 0, 0) +stmt: ASGNI1(addr,reg) "sb $%1,%0\n" 1 +stmt: ASGNU1(addr,reg) "sb $%1,%0\n" 1 +stmt: ASGNI2(addr,reg) "sh $%1,%0\n" 1 +stmt: ASGNU2(addr,reg) "sh $%1,%0\n" 1 +stmt: ASGNI4(addr,reg) "sw $%1,%0\n" 1 +stmt: ASGNU4(addr,reg) "sw $%1,%0\n" 1 +stmt: ASGNP4(addr,reg) "sw $%1,%0\n" 1 +reg: INDIRI1(addr) "lb $%c,%0\n" 1 +reg: INDIRU1(addr) "lbu $%c,%0\n" 1 +reg: INDIRI2(addr) "lh $%c,%0\n" 1 +reg: INDIRU2(addr) "lhu $%c,%0\n" 1 +reg: INDIRI4(addr) "lw $%c,%0\n" 1 +reg: INDIRU4(addr) "lw $%c,%0\n" 1 +reg: INDIRP4(addr) "lw $%c,%0\n" 1 + +reg: CVII4(INDIRI1(addr)) "lb $%c,%0\n" 1 +reg: CVII4(INDIRI2(addr)) "lh $%c,%0\n" 1 +reg: CVUU4(INDIRU1(addr)) "lbu $%c,%0\n" 1 +reg: CVUU4(INDIRU2(addr)) "lhu $%c,%0\n" 1 +reg: CVUI4(INDIRU1(addr)) "lbu $%c,%0\n" 1 +reg: CVUI4(INDIRU2(addr)) "lhu $%c,%0\n" 1 +reg: INDIRF4(addr) "l.s $f%c,%0\n" 1 +reg: INDIRF8(addr) "l.d $f%c,%0\n" 1 +stmt: ASGNF4(addr,reg) "s.s $f%1,%0\n" 1 +stmt: ASGNF8(addr,reg) "s.d $f%1,%0\n" 1 +reg: DIVI4(reg,reg) "div $%c,$%0,$%1\n" 1 +reg: DIVU4(reg,reg) "divu $%c,$%0,$%1\n" 1 +reg: MODI4(reg,reg) "rem $%c,$%0,$%1\n" 1 +reg: MODU4(reg,reg) "remu $%c,$%0,$%1\n" 1 +reg: MULI4(reg,reg) "mul $%c,$%0,$%1\n" 1 +reg: MULU4(reg,reg) "mul $%c,$%0,$%1\n" 1 +rc: con "%0" +rc: reg "$%0" + +reg: ADDI4(reg,rc) "addu $%c,$%0,%1\n" 1 +reg: ADDP4(reg,rc) "addu $%c,$%0,%1\n" 1 +reg: ADDU4(reg,rc) "addu $%c,$%0,%1\n" 1 +reg: BANDI4(reg,rc) "and $%c,$%0,%1\n" 1 +reg: BORI4(reg,rc) "or $%c,$%0,%1\n" 1 +reg: BXORI4(reg,rc) "xor $%c,$%0,%1\n" 1 +reg: BANDU4(reg,rc) "and $%c,$%0,%1\n" 1 +reg: BORU4(reg,rc) "or $%c,$%0,%1\n" 1 +reg: BXORU4(reg,rc) "xor $%c,$%0,%1\n" 1 +reg: SUBI4(reg,rc) "subu $%c,$%0,%1\n" 1 +reg: SUBP4(reg,rc) "subu $%c,$%0,%1\n" 1 +reg: SUBU4(reg,rc) "subu $%c,$%0,%1\n" 1 +rc5: CNSTI4 "%a" range(a,0,31) +rc5: reg "$%0" + +reg: LSHI4(reg,rc5) "sll $%c,$%0,%1\n" 1 +reg: LSHU4(reg,rc5) "sll $%c,$%0,%1\n" 1 +reg: RSHI4(reg,rc5) "sra $%c,$%0,%1\n" 1 +reg: RSHU4(reg,rc5) "srl $%c,$%0,%1\n" 1 +reg: BCOMI4(reg) "not $%c,$%0\n" 1 +reg: BCOMU4(reg) "not $%c,$%0\n" 1 +reg: NEGI4(reg) "negu $%c,$%0\n" 1 +reg: LOADI1(reg) "move $%c,$%0\n" move(a) +reg: LOADU1(reg) "move $%c,$%0\n" move(a) +reg: LOADI2(reg) "move $%c,$%0\n" move(a) +reg: LOADU2(reg) "move $%c,$%0\n" move(a) +reg: LOADI4(reg) "move $%c,$%0\n" move(a) +reg: LOADP4(reg) "move $%c,$%0\n" move(a) +reg: LOADU4(reg) "move $%c,$%0\n" move(a) +reg: ADDF4(reg,reg) "add.s $f%c,$f%0,$f%1\n" 1 +reg: ADDF8(reg,reg) "add.d $f%c,$f%0,$f%1\n" 1 +reg: DIVF4(reg,reg) "div.s $f%c,$f%0,$f%1\n" 1 +reg: DIVF8(reg,reg) "div.d $f%c,$f%0,$f%1\n" 1 +reg: MULF4(reg,reg) "mul.s $f%c,$f%0,$f%1\n" 1 +reg: MULF8(reg,reg) "mul.d $f%c,$f%0,$f%1\n" 1 +reg: SUBF4(reg,reg) "sub.s $f%c,$f%0,$f%1\n" 1 +reg: SUBF8(reg,reg) "sub.d $f%c,$f%0,$f%1\n" 1 +reg: LOADF4(reg) "mov.s $f%c,$f%0\n" move(a) +reg: LOADF8(reg) "mov.d $f%c,$f%0\n" move(a) +reg: NEGF4(reg) "neg.s $f%c,$f%0\n" 1 +reg: NEGF8(reg) "neg.d $f%c,$f%0\n" 1 +reg: CVII4(reg) "sll $%c,$%0,8*(4-%a); sra $%c,$%c,8*(4-%a)\n" 2 +reg: CVUI4(reg) "and $%c,$%0,(1<<(8*%a))-1\n" 1 +reg: CVUU4(reg) "and $%c,$%0,(1<<(8*%a))-1\n" 1 +reg: CVFF4(reg) "cvt.s.d $f%c,$f%0\n" 1 +reg: CVFF8(reg) "cvt.d.s $f%c,$f%0\n" 1 +reg: CVIF4(reg) "mtc1 $%0,$f%c; cvt.s.w $f%c,$f%c\n" 2 +reg: CVIF8(reg) "mtc1 $%0,$f%c; cvt.d.w $f%c,$f%c\n" 2 +reg: CVFI4(reg) "trunc.w.s $f2,$f%0,$%c; mfc1 $%c,$f2\n" (a->syms[0]->u.c.v.i==4?2:LBURG_MAX) +reg: CVFI4(reg) "trunc.w.d $f2,$f%0,$%c; mfc1 $%c,$f2\n" (a->syms[0]->u.c.v.i==8?2:LBURG_MAX) +stmt: LABELV "%a:\n" +stmt: JUMPV(acon) "b %0\n" 1 +stmt: JUMPV(reg) ".cpadd $%0\nj $%0\n" !pic +stmt: JUMPV(reg) "j $%0\n" pic +stmt: EQI4(reg,reg) "beq $%0,$%1,%a\n" 1 +stmt: EQU4(reg,reg) "beq $%0,$%1,%a\n" 1 +stmt: GEI4(reg,reg) "bge $%0,$%1,%a\n" 1 +stmt: GEU4(reg,reg) "bgeu $%0,$%1,%a\n" 1 +stmt: GTI4(reg,reg) "bgt $%0,$%1,%a\n" 1 +stmt: GTU4(reg,reg) "bgtu $%0,$%1,%a\n" 1 +stmt: LEI4(reg,reg) "ble $%0,$%1,%a\n" 1 +stmt: LEU4(reg,reg) "bleu $%0,$%1,%a\n" 1 +stmt: LTI4(reg,reg) "blt $%0,$%1,%a\n" 1 +stmt: LTU4(reg,reg) "bltu $%0,$%1,%a\n" 1 +stmt: NEI4(reg,reg) "bne $%0,$%1,%a\n" 1 +stmt: NEU4(reg,reg) "bne $%0,$%1,%a\n" 1 +stmt: EQF4(reg,reg) "c.eq.s $f%0,$f%1; bc1t %a\n" 2 +stmt: EQF8(reg,reg) "c.eq.d $f%0,$f%1; bc1t %a\n" 2 +stmt: LEF4(reg,reg) "c.le.s $f%0,$f%1; bc1t %a\n" 2 +stmt: LEF8(reg,reg) "c.le.d $f%0,$f%1; bc1t %a\n" 2 +stmt: LTF4(reg,reg) "c.lt.s $f%0,$f%1; bc1t %a\n" 2 +stmt: LTF8(reg,reg) "c.lt.d $f%0,$f%1; bc1t %a\n" 2 +stmt: GEF4(reg,reg) "c.lt.s $f%0,$f%1; bc1f %a\n" 2 +stmt: GEF8(reg,reg) "c.lt.d $f%0,$f%1; bc1f %a\n" 2 +stmt: GTF4(reg,reg) "c.le.s $f%0,$f%1; bc1f %a\n" 2 +stmt: GTF8(reg,reg) "c.le.d $f%0,$f%1; bc1f %a\n" 2 +stmt: NEF4(reg,reg) "c.eq.s $f%0,$f%1; bc1f %a\n" 2 +stmt: NEF8(reg,reg) "c.eq.d $f%0,$f%1; bc1f %a\n" 2 +ar: ADDRGP4 "%a" + +reg: CALLF4(ar) "jal %0\n" 1 +reg: CALLF8(ar) "jal %0\n" 1 +reg: CALLI4(ar) "jal %0\n" 1 +reg: CALLP4(ar) "jal %0\n" 1 +reg: CALLU4(ar) "jal %0\n" 1 +stmt: CALLV(ar) "jal %0\n" 1 +ar: reg "$%0" +ar: CNSTP4 "%a" range(a, 0, 0x0fffffff) +stmt: RETF4(reg) "# ret\n" 1 +stmt: RETF8(reg) "# ret\n" 1 +stmt: RETI4(reg) "# ret\n" 1 +stmt: RETU4(reg) "# ret\n" 1 +stmt: RETP4(reg) "# ret\n" 1 +stmt: RETV(reg) "# ret\n" 1 +stmt: ARGF4(reg) "# arg\n" 1 +stmt: ARGF8(reg) "# arg\n" 1 +stmt: ARGI4(reg) "# arg\n" 1 +stmt: ARGP4(reg) "# arg\n" 1 +stmt: ARGU4(reg) "# arg\n" 1 + +stmt: ARGB(INDIRB(reg)) "# argb %0\n" 1 +stmt: ASGNB(reg,INDIRB(reg)) "# asgnb %0 %1\n" 1 +%% +static void progend(void){} +static void progbeg(int argc, char *argv[]) { + int i; + + { + union { + char c; + int i; + } u; + u.i = 0; + u.c = 1; + swap = ((int)(u.i == 1)) != IR->little_endian; + } + print(".set reorder\n"); + pic = !IR->little_endian; + parseflags(argc, argv); + for (i = 0; i < argc; i++) + if (strncmp(argv[i], "-G", 2) == 0) + gnum = atoi(argv[i] + 2); + else if (strcmp(argv[i], "-pic=1") == 0 + || strcmp(argv[i], "-pic=0") == 0) + pic = argv[i][5]-'0'; + for (i = 0; i < 31; i += 2) + freg2[i] = mkreg("%d", i, 3, FREG); + for (i = 0; i < 32; i++) + ireg[i] = mkreg("%d", i, 1, IREG); + ireg[29]->x.name = "sp"; + d6 = mkreg("6", 6, 3, IREG); + freg2w = mkwildcard(freg2); + iregw = mkwildcard(ireg); + tmask[IREG] = INTTMP; tmask[FREG] = FLTTMP; + vmask[IREG] = INTVAR; vmask[FREG] = FLTVAR; + blkreg = mkreg("8", 8, 7, IREG); +} +static Symbol rmap(int opk) { + switch (optype(opk)) { + case I: case U: case P: case B: + return iregw; + case F: + return freg2w; + default: + return 0; + } +} +static void target(Node p) { + assert(p); + switch (specific(p->op)) { + case CNST+I: case CNST+U: case CNST+P: + if (range(p, 0, 0) == 0) { + setreg(p, ireg[0]); + p->x.registered = 1; + } + break; + case CALL+V: + rtarget(p, 0, ireg[25]); + break; + case CALL+F: + rtarget(p, 0, ireg[25]); + setreg(p, freg2[0]); + break; + case CALL+I: case CALL+P: case CALL+U: + rtarget(p, 0, ireg[25]); + setreg(p, ireg[2]); + break; + case RET+F: + rtarget(p, 0, freg2[0]); + break; + case RET+I: case RET+U: case RET+P: + rtarget(p, 0, ireg[2]); + break; + case ARG+F: case ARG+I: case ARG+P: case ARG+U: { + static int ty0; + int ty = optype(p->op); + Symbol q; + + q = argreg(p->x.argno, p->syms[2]->u.c.v.i, ty, opsize(p->op), ty0); + if (p->x.argno == 0) + ty0 = ty; + if (q && + !(ty == F && q->x.regnode->set == IREG)) + rtarget(p, 0, q); + break; + } + case ASGN+B: rtarget(p->kids[1], 0, blkreg); break; + case ARG+B: rtarget(p->kids[0], 0, blkreg); break; + } +} +static void clobber(Node p) { + assert(p); + switch (specific(p->op)) { + case CALL+F: + spill(INTTMP | INTRET, IREG, p); + spill(FLTTMP, FREG, p); + break; + case CALL+I: case CALL+P: case CALL+U: + spill(INTTMP, IREG, p); + spill(FLTTMP | FLTRET, FREG, p); + break; + case CALL+V: + spill(INTTMP | INTRET, IREG, p); + spill(FLTTMP | FLTRET, FREG, p); + break; + } +} +static void emit2(Node p) { + int dst, n, src, sz, ty; + static int ty0; + Symbol q; + + switch (specific(p->op)) { + case ARG+F: case ARG+I: case ARG+P: case ARG+U: + ty = optype(p->op); + sz = opsize(p->op); + if (p->x.argno == 0) + ty0 = ty; + q = argreg(p->x.argno, p->syms[2]->u.c.v.i, ty, sz, ty0); + src = getregnum(p->x.kids[0]); + if (q == NULL && ty == F && sz == 4) + print("s.s $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i); + else if (q == NULL && ty == F) + print("s.d $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i); + else if (q == NULL) + print("sw $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i); + else if (ty == F && sz == 4 && q->x.regnode->set == IREG) + print("mfc1 $%d,$f%d\n", q->x.regnode->number, src); + else if (ty == F && q->x.regnode->set == IREG) + print("mfc1.d $%d,$f%d\n", q->x.regnode->number, src); + break; + case ASGN+B: + dalign = salign = p->syms[1]->u.c.v.i; + blkcopy(getregnum(p->x.kids[0]), 0, + getregnum(p->x.kids[1]), 0, + p->syms[0]->u.c.v.i, tmpregs); + break; + case ARG+B: + dalign = 4; + salign = p->syms[1]->u.c.v.i; + blkcopy(29, p->syms[2]->u.c.v.i, + getregnum(p->x.kids[0]), 0, + p->syms[0]->u.c.v.i, tmpregs); + n = p->syms[2]->u.c.v.i + p->syms[0]->u.c.v.i; + dst = p->syms[2]->u.c.v.i; + for ( ; dst <= 12 && dst < n; dst += 4) + print("lw $%d,%d($sp)\n", (dst/4)+4, dst); + break; + } +} +static Symbol argreg(int argno, int offset, int ty, int sz, int ty0) { + assert((offset&3) == 0); + if (offset > 12) + return NULL; + else if (argno == 0 && ty == F) + return freg2[12]; + else if (argno == 1 && ty == F && ty0 == F) + return freg2[14]; + else if (argno == 1 && ty == F && sz == 8) + return d6; /* Pair! */ + else + return ireg[(offset/4) + 4]; +} +static void doarg(Node p) { + static int argno; + int align; + + if (argoffset == 0) + argno = 0; + p->x.argno = argno++; + align = p->syms[1]->u.c.v.i < 4 ? 4 : p->syms[1]->u.c.v.i; + p->syms[2] = intconst(mkactual(align, + p->syms[0]->u.c.v.i)); +} +static void local(Symbol p) { + if (askregvar(p, rmap(ttob(p->type))) == 0) + mkauto(p); +} +static void function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { + int i, saved, sizefsave, sizeisave, varargs; + Symbol r, argregs[4]; + + usedmask[0] = usedmask[1] = 0; + freemask[0] = freemask[1] = ~(unsigned)0; + offset = maxoffset = maxargoffset = 0; + for (i = 0; callee[i]; i++) + ; + varargs = variadic(f->type) + || i > 0 && strcmp(callee[i-1]->name, "va_alist") == 0; + for (i = 0; callee[i]; i++) { + Symbol p = callee[i]; + Symbol q = caller[i]; + assert(q); + offset = roundup(offset, q->type->align); + p->x.offset = q->x.offset = offset; + p->x.name = q->x.name = stringd(offset); + r = argreg(i, offset, optype(ttob(q->type)), q->type->size, optype(ttob(caller[0]->type))); + if (i < 4) + argregs[i] = r; + offset = roundup(offset + q->type->size, 4); + if (varargs) + p->sclass = AUTO; + else if (r && ncalls == 0 && + !isstruct(q->type) && !p->addressed && + !(isfloat(q->type) && r->x.regnode->set == IREG) +) { + p->sclass = q->sclass = REGISTER; + askregvar(p, r); + assert(p->x.regnode && p->x.regnode->vbl == p); + q->x = p->x; + q->type = p->type; + } + else if (askregvar(p, rmap(ttob(p->type))) + && r != NULL + && (isint(p->type) || p->type == q->type)) { + assert(q->sclass != REGISTER); + p->sclass = q->sclass = REGISTER; + q->type = p->type; + } + } + assert(!caller[i]); + offset = 0; + gencode(caller, callee); + if (ncalls) + usedmask[IREG] |= ((unsigned)1)<<31; + usedmask[IREG] &= 0xc0ff0000; + usedmask[FREG] &= 0xfff00000; + if (pic && ncalls) + usedmask[IREG] |= 1<<25; + maxargoffset = roundup(maxargoffset, usedmask[FREG] ? 8 : 4); + if (ncalls && maxargoffset < 16) + maxargoffset = 16; + sizefsave = 4*bitcount(usedmask[FREG]); + sizeisave = 4*bitcount(usedmask[IREG]); + framesize = roundup(maxargoffset + sizefsave + + sizeisave + maxoffset, 8); + segment(CODE); + print(".align 2\n"); + print(".ent %s\n", f->x.name); + print("%s:\n", f->x.name); + i = maxargoffset + sizefsave - framesize; + print(".frame $sp,%d,$31\n", framesize); + if (pic) + print(".set noreorder\n.cpload $25\n.set reorder\n"); + if (framesize > 0) + print("addu $sp,$sp,%d\n", -framesize); + if (usedmask[FREG]) + print(".fmask 0x%x,%d\n", usedmask[FREG], i - 8); + if (usedmask[IREG]) + print(".mask 0x%x,%d\n", usedmask[IREG], + i + sizeisave - 4); + saved = maxargoffset; + for (i = 20; i <= 30; i += 2) + if (usedmask[FREG]&(3<x.regnode != callee[i]->x.regnode) { + Symbol out = callee[i]; + Symbol in = caller[i]; + int rn = r->x.regnode->number; + int rs = r->x.regnode->set; + int tyin = ttob(in->type); + + assert(out && in && r && r->x.regnode); + assert(out->sclass != REGISTER || out->x.regnode); + if (out->sclass == REGISTER + && (isint(out->type) || out->type == in->type)) { + int outn = out->x.regnode->number; + if (rs == FREG && tyin == F+sizeop(8)) + print("mov.d $f%d,$f%d\n", outn, rn); + else if (rs == FREG && tyin == F+sizeop(4)) + print("mov.s $f%d,$f%d\n", outn, rn); + else if (rs == IREG && tyin == F+sizeop(8)) + print("mtc1.d $%d,$f%d\n", rn, outn); + else if (rs == IREG && tyin == F+sizeop(4)) + print("mtc1 $%d,$f%d\n", rn, outn); + else + print("move $%d,$%d\n", outn, rn); + } else { + int off = in->x.offset + framesize; + if (rs == FREG && tyin == F+sizeop(8)) + print("s.d $f%d,%d($sp)\n", rn, off); + else if (rs == FREG && tyin == F+sizeop(4)) + print("s.s $f%d,%d($sp)\n", rn, off); + else { + int i, n = (in->type->size + 3)/4; + for (i = rn; i < rn+n && i <= 7; i++) + print("sw $%d,%d($sp)\n", i, off + (i-rn)*4); + } + } + } + } + if (varargs && callee[i-1]) { + i = callee[i-1]->x.offset + callee[i-1]->type->size; + for (i = roundup(i, 4)/4; i <= 3; i++) + print("sw $%d,%d($sp)\n", i + 4, framesize + 4*i); + } + emitcode(); + saved = maxargoffset; + for (i = 20; i <= 30; i += 2) + if (usedmask[FREG]&(3< 0) + print("addu $sp,$sp,%d\n", framesize); + print("j $31\n"); + print(".end %s\n", f->x.name); +} +static void defconst(int suffix, int size, Value v) { + if (suffix == F && size == 4) { + float f = v.d; + print(".word 0x%x\n", *(unsigned *)&f); + } + else if (suffix == F && size == 8) { + double d = v.d; + unsigned *p = (unsigned *)&d; + print(".word 0x%x\n.word 0x%x\n", p[swap], p[!swap]); + } + else if (suffix == P) + print(".word 0x%x\n", v.p); + else if (size == 1) + print(".byte 0x%x\n", suffix == I ? v.i : v.u); + else if (size == 2) + print(".half 0x%x\n", suffix == I ? v.i : v.u); + else if (size == 4) + print(".word 0x%x\n", suffix == I ? v.i : v.u); +} +static void defaddress(Symbol p) { + if (pic && p->scope == LABELS) + print(".gpword %s\n", p->x.name); + else + print(".word %s\n", p->x.name); +} +static void defstring(int n, char *str) { + char *s; + + for (s = str; s < str + n; s++) + print(".byte %d\n", (*s)&0377); +} +static void export(Symbol p) { + print(".globl %s\n", p->x.name); +} +static void import(Symbol p) { + if (!isfunc(p->type)) + print(".extern %s %d\n", p->name, p->type->size); +} +static void defsymbol(Symbol p) { + if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf("L.%d", genlabel(1)); + else if (p->generated) + p->x.name = stringf("L.%s", p->name); + else + assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)), + p->x.name = p->name; +} +static void address(Symbol q, Symbol p, long n) { + if (p->scope == GLOBAL + || p->sclass == STATIC || p->sclass == EXTERN) + q->x.name = stringf("%s%s%D", p->x.name, + n >= 0 ? "+" : "", n); + else { + assert(n <= INT_MAX && n >= INT_MIN); + q->x.offset = p->x.offset + n; + q->x.name = stringd(q->x.offset); + } +} +static void global(Symbol p) { + if (p->u.seg == BSS) { + if (p->sclass == STATIC || Aflag >= 2) + print(".lcomm %s,%d\n", p->x.name, p->type->size); + else + print( ".comm %s,%d\n", p->x.name, p->type->size); + } else { + if (p->u.seg == DATA + && (p->type->size == 0 || p->type->size > gnum)) + print(".data\n"); + else if (p->u.seg == DATA) + print(".sdata\n"); + print(".align %c\n", ".01.2...3"[p->type->align]); + print("%s:\n", p->x.name); + } +} +static void segment(int n) { + cseg = n; + switch (n) { + case CODE: print(".text\n"); break; + case LIT: print(".rdata\n"); break; + } +} +static void space(int n) { + if (cseg != BSS) + print(".space %d\n", n); +} +static void blkloop(int dreg, int doff, int sreg, int soff, int size, int tmps[]) { + int lab = genlabel(1); + + print("addu $%d,$%d,%d\n", sreg, sreg, size&~7); + print("addu $%d,$%d,%d\n", tmps[2], dreg, size&~7); + blkcopy(tmps[2], doff, sreg, soff, size&7, tmps); + print("L.%d:\n", lab); + print("addu $%d,$%d,%d\n", sreg, sreg, -8); + print("addu $%d,$%d,%d\n", tmps[2], tmps[2], -8); + blkcopy(tmps[2], doff, sreg, soff, 8, tmps); + print("bltu $%d,$%d,L.%d\n", dreg, tmps[2], lab); +} +static void blkfetch(int size, int off, int reg, int tmp) { + assert(size == 1 || size == 2 || size == 4); + if (size == 1) + print("lbu $%d,%d($%d)\n", tmp, off, reg); + else if (salign >= size && size == 2) + print("lhu $%d,%d($%d)\n", tmp, off, reg); + else if (salign >= size) + print("lw $%d,%d($%d)\n", tmp, off, reg); + else if (size == 2) + print("ulhu $%d,%d($%d)\n", tmp, off, reg); + else + print("ulw $%d,%d($%d)\n", tmp, off, reg); +} +static void blkstore(int size, int off, int reg, int tmp) { + if (size == 1) + print("sb $%d,%d($%d)\n", tmp, off, reg); + else if (dalign >= size && size == 2) + print("sh $%d,%d($%d)\n", tmp, off, reg); + else if (dalign >= size) + print("sw $%d,%d($%d)\n", tmp, off, reg); + else if (size == 2) + print("ush $%d,%d($%d)\n", tmp, off, reg); + else + print("usw $%d,%d($%d)\n", tmp, off, reg); +} +static void stabinit(char *, int, char *[]); +static void stabline(Coordinate *); +static void stabsym(Symbol); + +static char *currentfile; + +static int bitcount(unsigned mask) { + unsigned i, n = 0; + + for (i = 1; i; i <<= 1) + if (mask&i) + n++; + return n; +} + +/* stabinit - initialize stab output */ +static void stabinit(char *file, int argc, char *argv[]) { + if (file) { + print(".file 2,\"%s\"\n", file); + currentfile = file; + } +} + +/* stabline - emit stab entry for source coordinate *cp */ +static void stabline(Coordinate *cp) { + if (cp->file && cp->file != currentfile) { + print(".file 2,\"%s\"\n", cp->file); + currentfile = cp->file; + } + print(".loc 2,%d\n", cp->y); +} + +/* stabsym - output a stab entry for symbol p */ +static void stabsym(Symbol p) { + if (p == cfunc && IR->stabline) + (*IR->stabline)(&p->src); +} +Interface mipsebIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 4, 4, 0, /* T * */ + 0, 1, 0, /* struct */ + 0, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + address, + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol, + emit, + export, + function, + gen, + global, + import, + local, + progbeg, + progend, + segment, + space, + 0, 0, 0, stabinit, stabline, stabsym, 0, + { + 4, /* max_unaligned_load */ + rmap, + blkfetch, blkstore, blkloop, + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + doarg, + target, + clobber, + + } +}, mipselIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 4, 4, 0, /* T * */ + 0, 1, 0, /* struct */ + 1, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + address, + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol, + emit, + export, + function, + gen, + global, + import, + local, + progbeg, + progend, + segment, + space, + 0, 0, 0, stabinit, stabline, stabsym, 0, + { + 4, /* max_unaligned_load */ + rmap, + blkfetch, blkstore, blkloop, + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + doarg, + target, + clobber, + + } +}; +static char rcsid[] = "$Id: mips.md,v 1.1.1.1 2001/10/17 21:53:37 timo Exp $"; diff --git a/quake3/source/lcc/src/null.c b/quake3/source/lcc/src/null.c new file mode 100644 index 0000000..52129fc --- /dev/null +++ b/quake3/source/lcc/src/null.c @@ -0,0 +1,74 @@ +#include "c.h" +#define I(f) null_##f + +static Node I(gen)(Node p) { return p; } +static void I(address)(Symbol q, Symbol p, long n) {} +static void I(blockbeg)(Env *e) {} +static void I(blockend)(Env *e) {} +static void I(defaddress)(Symbol p) {} +static void I(defconst)(int suffix, int size, Value v) {} +static void I(defstring)(int len, char *s) {} +static void I(defsymbol)(Symbol p) {} +static void I(emit)(Node p) {} +static void I(export)(Symbol p) {} +static void I(function)(Symbol f, Symbol caller[], Symbol callee[], int ncalls) {} +static void I(global)(Symbol p) {} +static void I(import)(Symbol p) {} +static void I(local)(Symbol p) {} +static void I(progbeg)(int argc, char *argv[]) {} +static void I(progend)(void) {} +static void I(segment)(int s) {} +static void I(space)(int n) {} +static void I(stabblock)(int brace, int lev, Symbol *p) {} +static void I(stabend)(Coordinate *cp, Symbol p, Coordinate **cpp, Symbol *sp, Symbol *stab) {} +static void I(stabfend)(Symbol p, int lineno) {} +static void I(stabinit)(char *file, int argc, char *argv[]) {} +static void I(stabline)(Coordinate *cp) {} +static void I(stabsym)(Symbol p) {} +static void I(stabtype)(Symbol p) {} + + +Interface nullIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 8, 8, 1, /* long */ + 8 ,8, 1, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 16,16,1, /* long double */ + 4, 4, 0, /* T* */ + 0, 4, 0, /* struct */ + 1, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 0, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + I(address), + I(blockbeg), + I(blockend), + I(defaddress), + I(defconst), + I(defstring), + I(defsymbol), + I(emit), + I(export), + I(function), + I(gen), + I(global), + I(import), + I(local), + I(progbeg), + I(progend), + I(segment), + I(space), + I(stabblock), + I(stabend), + I(stabfend), + I(stabinit), + I(stabline), + I(stabsym), + I(stabtype) +}; diff --git a/quake3/source/lcc/src/output.c b/quake3/source/lcc/src/output.c new file mode 100644 index 0000000..e8fe6f5 --- /dev/null +++ b/quake3/source/lcc/src/output.c @@ -0,0 +1,134 @@ +#include "c.h" + + +static char *outs(const char *str, FILE *f, char *bp) { + if (f) + fputs(str, f); + else + while (*bp = *str++) + bp++; + return bp; +} + +static char *outd(long n, FILE *f, char *bp) { + unsigned long m; + char buf[25], *s = buf + sizeof buf; + + *--s = '\0'; + if (n < 0) + m = -n; + else + m = n; + do + *--s = m%10 + '0'; + while ((m /= 10) != 0); + if (n < 0) + *--s = '-'; + return outs(s, f, bp); +} + +static char *outu(unsigned long n, int base, FILE *f, char *bp) { + char buf[25], *s = buf + sizeof buf; + + *--s = '\0'; + do + *--s = "0123456789abcdef"[n%base]; + while ((n /= base) != 0); + return outs(s, f, bp); +} +void print(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vfprint(stdout, NULL, fmt, ap); + va_end(ap); +} +/* fprint - formatted output to f */ +void fprint(FILE *f, const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vfprint(f, NULL, fmt, ap); + va_end(ap); +} + +/* stringf - formatted output to a saved string */ +char *stringf(const char *fmt, ...) { + char buf[1024]; + va_list ap; + + va_start(ap, fmt); + vfprint(NULL, buf, fmt, ap); + va_end(ap); + return string(buf); +} + +/* vfprint - formatted output to f or string bp */ +void vfprint(FILE *f, char *bp, const char *fmt, va_list ap) { + for (; *fmt; fmt++) + if (*fmt == '%') + switch (*++fmt) { + case 'd': bp = outd(va_arg(ap, int), f, bp); break; + case 'D': bp = outd(va_arg(ap, long), f, bp); break; + case 'U': bp = outu(va_arg(ap, unsigned long), 10, f, bp); break; + case 'u': bp = outu(va_arg(ap, unsigned), 10, f, bp); break; + case 'o': bp = outu(va_arg(ap, unsigned), 8, f, bp); break; + case 'X': bp = outu(va_arg(ap, unsigned long), 16, f, bp); break; + case 'x': bp = outu(va_arg(ap, unsigned), 16, f, bp); break; + case 'f': case 'e': + case 'g': { + static char format[] = "%f"; + char buf[128]; + format[1] = *fmt; + sprintf(buf, format, va_arg(ap, double)); + bp = outs(buf, f, bp); + } +; break; + case 's': bp = outs(va_arg(ap, char *), f, bp); break; + case 'p': { + void *p = va_arg(ap, void *); + if (p) + bp = outs("0x", f, bp); + bp = outu((unsigned long)p, 16, f, bp); + break; + } + case 'c': if (f) fputc(va_arg(ap, int), f); else *bp++ = va_arg(ap, int); break; + case 'S': { char *s = va_arg(ap, char *); + int n = va_arg(ap, int); + if (s) + for ( ; n-- > 0; s++) + if (f) (void)putc(*s, f); else *bp++ = *s; + } break; + case 'k': { int t = va_arg(ap, int); + static char *tokens[] = { +#define xx(a,b,c,d,e,f,g) g, +#define yy(a,b,c,d,e,f,g) g, +#include "token.h" + }; + assert(tokens[t&0177]); + bp = outs(tokens[t&0177], f, bp); + } break; + case 't': { Type ty = va_arg(ap, Type); + assert(f); + outtype(ty ? ty : voidtype, f); + } break; + case 'w': { Coordinate *p = va_arg(ap, Coordinate *); + if (p->file && *p->file) { + bp = outs(p->file, f, bp); + bp = outs(":", f, bp); + } + bp = outd(p->y, f, bp); + } break; + case 'I': { int n = va_arg(ap, int); + while (--n >= 0) + if (f) (void)putc(' ', f); else *bp++ = ' '; + } break; + default: if (f) (void)putc(*fmt, f); else *bp++ = *fmt; break; + } + else if (f) + (void)putc(*fmt, f); + else + *bp++ = *fmt; + if (!f) + *bp = '\0'; +} diff --git a/quake3/source/lcc/src/pass2.c b/quake3/source/lcc/src/pass2.c new file mode 100644 index 0000000..f9e41cf --- /dev/null +++ b/quake3/source/lcc/src/pass2.c @@ -0,0 +1,665 @@ +#include "c.h" +#include "rcc.h" +#if WIN32 +#include +#include +#endif + + +Interface *IR = NULL; +int Aflag; /* >= 0 if -A specified */ +int Pflag; /* != 0 if -P specified */ +int glevel; /* == [0-9] if -g[0-9] specified */ +int xref; /* != 0 for cross-reference data */ +Symbol YYnull; /* _YYnull symbol if -n or -nvalidate specified */ +Symbol YYcheck; /* _YYcheck symbol if -nvalidate,check specified */ + +static int verbose = 1; +#define VERBOSE(n,arg) (verbose >= n ? (void)(arg):(void)0) +static int nuids; +static rcc_item_ty *items; +static void **itemmap; + +static void *uid2type(int uid) { + assert(uid >= 0 && uid < nuids); + if (itemmap[uid] == NULL) { + Type ty; + rcc_type_ty type = (void *)items[uid]; + assert(items[uid]); + assert(items[uid]->uid == uid); + assert(items[uid]->kind == rcc_Type_enum); + type = items[uid]->v.rcc_Type.type; + assert(type); + switch (type->kind) { + case rcc_INT_enum: + ty = btot(INT, type->size); + assert(ty->align == type->align); + break; + case rcc_UNSIGNED_enum: + ty = btot(UNSIGNED, type->size); + assert(ty->align == type->align); + break; + case rcc_FLOAT_enum: + ty = btot(FLOAT, type->size); + assert(ty->align == type->align); + break; + case rcc_VOID_enum: + ty = voidtype; + break; + case rcc_POINTER_enum: + ty = ptr(uid2type(type->v.rcc_POINTER.type)); + break; + case rcc_ARRAY_enum: + ty = uid2type(type->v.rcc_ARRAY.type); + assert(ty->size > 0); + ty = array(ty, type->size/ty->size, 0); + break; + case rcc_CONST_enum: + ty = qual(CONST, uid2type(type->v.rcc_CONST.type)); + break; + case rcc_VOLATILE_enum: + ty = qual(VOLATILE, uid2type(type->v.rcc_VOLATILE.type)); + break; + case rcc_ENUM_enum: { + int i, n = Seq_length(type->v.rcc_ENUM.ids); + ty = newstruct(ENUM, string(type->v.rcc_ENUM.tag)); + ty->type = inttype; + ty->size = ty->type->size; + ty->align = ty->type->align; + ty->u.sym->u.idlist = newarray(n + 1, sizeof *ty->u.sym->u.idlist, PERM); + for (i = 0; i < n; i++) { + rcc_enum__ty e = Seq_remlo(type->v.rcc_ENUM.ids); + Symbol p = install(e->id, &identifiers, GLOBAL, PERM); + p->type = ty; + p->sclass = ENUM; + p->u.value = e->value; + ty->u.sym->u.idlist[i] = p; + free(e); + } + ty->u.sym->u.idlist[i] = NULL; + Seq_free(&type->v.rcc_ENUM.ids); + break; + } + case rcc_STRUCT_enum: case rcc_UNION_enum: { + int i, n; + Field *tail; + list_ty fields; + if (type->kind == rcc_STRUCT_enum) { + ty = newstruct(STRUCT, string(type->v.rcc_STRUCT.tag)); + fields = type->v.rcc_STRUCT.fields; + } else { + ty = newstruct(UNION, string(type->v.rcc_UNION.tag)); + fields = type->v.rcc_UNION.fields; + } + itemmap[uid] = ty; /* recursive types */ + ty->size = type->size; + ty->align = type->align; + tail = &ty->u.sym->u.s.flist; + n = Seq_length(fields); + for (i = 0; i < n; i++) { + rcc_field_ty field = Seq_remlo(fields); + NEW0(*tail, PERM); + (*tail)->name = (char *)field->id; + (*tail)->type = uid2type(field->type); + (*tail)->offset = field->offset; + (*tail)->bitsize = field->bitsize; + (*tail)->lsb = field->lsb; + if (isconst((*tail)->type)) + ty->u.sym->u.s.cfields = 1; + if (isvolatile((*tail)->type)) + ty->u.sym->u.s.vfields = 1; + tail = &(*tail)->link; + free(field); + } + Seq_free(&fields); + break; + } + case rcc_FUNCTION_enum: { + int n = Seq_length(type->v.rcc_FUNCTION.formals); + if (n > 0) { + int i; + Type *proto = newarray(n + 1, sizeof *proto, PERM); + for (i = 0; i < n; i++) { + int *formal = Seq_remlo(type->v.rcc_FUNCTION.formals); + proto[i] = uid2type(*formal); + free(formal); + } + proto[i] = NULL; + ty = func(uid2type(type->v.rcc_FUNCTION.type), proto, 0); + } else + ty = func(uid2type(type->v.rcc_FUNCTION.type), NULL, 1); + Seq_free(&type->v.rcc_FUNCTION.formals); + break; + } + default: assert(0); + } + if (itemmap[uid] == NULL) { + itemmap[uid] = ty; + free(type); + free(items[uid]); + items[uid] = NULL; + } else + assert(itemmap[uid] == ty); + } + return itemmap[uid]; +} + +static Symbol uid2symbol(int uid) { + assert(uid >= 0 && uid < nuids); + if (itemmap[uid] == NULL) { + Symbol p; + rcc_symbol_ty symbol; + assert(items[uid]); + assert(items[uid]->uid == uid); + assert(items[uid]->kind == rcc_Symbol_enum); + symbol = items[uid]->v.rcc_Symbol.symbol; + assert(symbol); + NEW0(p, PERM); + p->name = (char *)symbol->id; + p->scope = symbol->scope; + p->sclass = symbol->sclass; + p->type = uid2type(symbol->type); +#define xx(f,n) p->f = symbol->flags>>n; + xx(structarg,0) + xx(addressed,1) + xx(computed,2) + xx(temporary,3) + xx(generated,4) +#undef xx + p->ref = symbol->ref/10000.0; + assert(p->scope != CONSTANTS && p->scope != LABELS); + if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN) + (*IR->defsymbol)(p); + itemmap[uid] = p; + free(symbol); + free(items[uid]); + items[uid] = NULL; + } + return itemmap[uid]; +} + +#define xx(s) static void do##s(rcc_interface_ty); +xx(Export) +xx(Import) +xx(Global) +xx(Local) +xx(Address) +xx(Segment) +xx(Defaddress) +xx(Deflabel) +xx(Defconst) +xx(Defconstf) +xx(Defstring) +xx(Space) +xx(Function) +xx(Blockbeg) +xx(Blockend) +xx(Forest) +#undef xx +static void (*doX[])(rcc_interface_ty in) = { +#define xx(s) 0, +xx(Export) +xx(Import) +xx(Global) +xx(Local) +xx(Address) +xx(Segment) +xx(Defaddress) +xx(Deflabel) +xx(Defconst) +xx(Defconstf) +xx(Defstring) +xx(Space) +xx(Function) +xx(Blockbeg) +xx(Blockend) +xx(Forest) + 0 +#undef xx +}; + +static void interface(rcc_interface_ty in) { + assert(in); + (*doX[in->kind])(in); + free(in); +} + +static void doExport(rcc_interface_ty in) { + (*IR->export)(uid2symbol(in->v.rcc_Export.p)); +} + +static void doImport(rcc_interface_ty in) { + Symbol p = uid2symbol(in->v.rcc_Export.p); + + (*IR->import)(p); + p->defined = 1; +} + +static void doGlobal(rcc_interface_ty in) { + Symbol p = uid2symbol(in->v.rcc_Global.p); + + p->u.seg = in->v.rcc_Global.seg; + (*IR->global)(p); + p->defined = 1; +} + +static void doLocal(rcc_interface_ty in) { + int uid = in->v.rcc_Local.uid; + + assert(uid >= 0 && uid < nuids); + assert(items[uid] == NULL); + items[uid] = rcc_Symbol(uid, in->v.rcc_Local.p); + if (in->v.rcc_Local.p->scope >= LOCAL) + addlocal(uid2symbol(uid)); +} + +static void doAddress(rcc_interface_ty in) { + int uid = in->v.rcc_Address.uid; + Symbol p = uid2symbol(in->v.rcc_Address.p); + + assert(uid >= 0 && uid < nuids); + assert(items[uid] == NULL); + items[uid] = rcc_Symbol(uid, in->v.rcc_Address.q); + if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN) + (*IR->address)(uid2symbol(uid), p, in->v.rcc_Address.n); + else { + Code cp = code(Address); + cp->u.addr.sym = uid2symbol(uid); + cp->u.addr.base = p; + cp->u.addr.offset = in->v.rcc_Address.n; + } +} + +static void doSegment(rcc_interface_ty in) { + (*IR->segment)(in->v.rcc_Segment.seg); +} + +static void doDefaddress(rcc_interface_ty in) { + (*IR->defaddress)(uid2symbol(in->v.rcc_Defaddress.p)); +} + +static void doDeflabel(rcc_interface_ty in) { + (*IR->defaddress)(findlabel(in->v.rcc_Deflabel.label)); +} + +static void doDefconst(rcc_interface_ty in) { + Value v; + + v.i = in->v.rcc_Defconst.value; + (*IR->defconst)(in->v.rcc_Defconst.suffix, in->v.rcc_Defconst.size, v); +} + +static void doDefconstf(rcc_interface_ty in) { + Value v; + unsigned *p = (unsigned *)&v.d; + + p[swap] = in->v.rcc_Defconstf.value->msb; + p[1-swap] = in->v.rcc_Defconstf.value->lsb; + (*IR->defconst)(F, in->v.rcc_Defconstf.size, v); + free(in->v.rcc_Defconstf.value); +} + +static void doDefstring(rcc_interface_ty in) { + (*IR->defstring)(in->v.rcc_Defstring.s.len, (char *)in->v.rcc_Defstring.s.str); + free((char *)in->v.rcc_Defstring.s.str); +} + +static void doSpace(rcc_interface_ty in) { + (*IR->space)(in->v.rcc_Space.n); +} + +static void doFunction(rcc_interface_ty in) { + int i, n; + Symbol *caller, *callee; + + /* + Initialize: + define the function symbol, + initialize callee and caller arrays. + */ + cfunc = uid2symbol(in->v.rcc_Function.f); + labels = table(NULL, LABELS); + enterscope(); + n = Seq_length(in->v.rcc_Function.caller); + caller = newarray(n + 1, sizeof *caller, FUNC); + for (i = 0; i < n; i++) { + int *uid = Seq_remlo(in->v.rcc_Function.caller); + caller[i] = uid2symbol(*uid); + free(uid); + } + caller[i] = NULL; + Seq_free(&in->v.rcc_Function.caller); + callee = newarray(n + 1, sizeof *callee, FUNC); + for (i = 0; i < n; i++) { + int *uid = Seq_remlo(in->v.rcc_Function.callee); + callee[i] = uid2symbol(*uid); + free(uid); + } + callee[i] = NULL; + Seq_free(&in->v.rcc_Function.callee); + cfunc->u.f.callee = callee; + cfunc->defined = 1; + /* + Initialize the code list, + traverse the interfaces inside the function; + each call appends code list entries. + */ + codelist = &codehead; + codelist->next = NULL; + n = Seq_length(in->v.rcc_Function.codelist); + for (i = 0; i < n; i++) + interface(Seq_remlo(in->v.rcc_Function.codelist)); + Seq_free(&in->v.rcc_Function.codelist); + /* + Call the back end, + Wrap-up. + */ + exitscope(); + (*IR->function)(cfunc, caller, callee, in->v.rcc_Function.ncalls); + cfunc = NULL; + labels = NULL; +} + +static struct block { + Code begin; + struct block *prev; +} *blockstack = NULL; + +static void doBlockbeg(rcc_interface_ty in) { + struct block *b; + Code cp = code(Blockbeg); + + enterscope(); + cp->u.block.level = level; + cp->u.block.locals = newarray(1, sizeof *cp->u.block.locals, FUNC); + cp->u.block.locals[0] = NULL; + cp->u.block.identifiers = NULL; + cp->u.block.types = NULL; + NEW(b, FUNC); + b->begin = cp; + b->prev = blockstack; + blockstack = b; +} + +static void doBlockend(rcc_interface_ty in) { + assert(blockstack); + code(Blockend)->u.begin = blockstack->begin; + blockstack = blockstack->prev; + exitscope(); +} + +static Node visit(rcc_node_ty node) { + int op; + Node left = NULL, right = NULL, p = NULL; + Symbol sym = NULL; + + switch (node->kind) { +#define T(x) rcc_##x##_enum + case T(CSE): { + Symbol q = uid2symbol(node->v.rcc_CSE.uid); + assert(q->temporary); + q->u.t.cse = p = visit(node->v.rcc_CSE.node); + break; + } + case T(CNST): { + Value v; + v.i = node->v.rcc_CNST.value; + sym = constant(btot(node->suffix, node->size), v); + op = CNST; + break; + } + case T(CNSTF): { + Value v; + unsigned *p = (unsigned *)&v.d; + p[swap] = node->v.rcc_CNSTF.value->msb; + p[1-swap] = node->v.rcc_CNSTF.value->lsb; + sym = constant(btot(node->suffix, node->size), v); + free(node->v.rcc_CNSTF.value); + op = CNST; + break; + } + case T(ARG): + p = newnode(ARG + node->suffix + sizeop(node->size), + visit(node->v.rcc_ARG.left), NULL, + intconst(node->v.rcc_ARG.len)); + p->syms[1] = intconst(node->v.rcc_ARG.align); + break; + case T(ASGN): + p = newnode(ASGN + node->suffix + sizeop(node->size), + visit(node->v.rcc_ASGN.left), visit(node->v.rcc_ASGN.right), + intconst(node->v.rcc_ASGN.len)); + p->syms[1] = intconst(node->v.rcc_ASGN.align); + break; + case T(CVT): + op = node->v.rcc_CVT.op; + left = visit(node->v.rcc_CVT.left); + sym = intconst(node->v.rcc_CVT.fromsize); + break; + case T(CALL): + op = CALL; + left = visit(node->v.rcc_CALL.left); + NEW0(sym, FUNC); + sym->type = uid2type(node->v.rcc_CALL.type); + break; + case T(CALLB): + op = CALL; + left = visit(node->v.rcc_CALLB.left); + right = visit(node->v.rcc_CALLB.right); + NEW0(sym, FUNC); + sym->type = uid2type(node->v.rcc_CALLB.type); + break; + case T(RET): + op = RET; + break; + case T(ADDRG): + op = ADDRG; + sym = uid2symbol(node->v.rcc_ADDRG.uid); + break; + case T(ADDRL): + op = ADDRL; + sym = uid2symbol(node->v.rcc_ADDRG.uid); + break; + case T(ADDRF): + op = ADDRF; + sym = uid2symbol(node->v.rcc_ADDRG.uid); + break; + case T(Unary): + op = node->v.rcc_Unary.op; + left = visit(node->v.rcc_Unary.left); + break; + case T(Binary): + op = node->v.rcc_Binary.op; + left = visit(node->v.rcc_Binary.left); + right = visit(node->v.rcc_Binary.right); + break; + case T(Compare): + op = node->v.rcc_Compare.op; + left = visit(node->v.rcc_Compare.left); + right = visit(node->v.rcc_Compare.right); + sym = findlabel(node->v.rcc_Compare.label); + break; + case T(LABEL): + op = LABEL; + sym = findlabel(node->v.rcc_LABEL.label); + break; + case T(BRANCH): + op = JUMP; + left = newnode(ADDRG+P+sizeop(voidptype->size), NULL, NULL, findlabel(node->v.rcc_BRANCH.label)); + break; +#undef T + default: assert(0); + } + if (p == NULL) + p = newnode(op + node->suffix + sizeop(node->size), left, right, sym); + free(node); + return p; +} + +static void doForest(rcc_interface_ty in) { + Node *tail = &code(Gen)->u.forest; + int i, n = Seq_length(in->v.rcc_Forest.nodes); + + for (i = 0; i < n; i++) { + *tail = visit(Seq_remlo(in->v.rcc_Forest.nodes)); + assert(*tail); + tail = &(*tail)->link; + } + *tail = NULL; + Seq_free(&in->v.rcc_Forest.nodes); +} + +int main(int argc, char *argv[]) { + int i, version; + float stamp = (assert(strstr(rcsid, ",v")), strtod(strstr(rcsid, ",v")+2, NULL)) +; + char *infile = NULL, *outfile = NULL; + rcc_program_ty pickle; + + for (i = 1; i < argc; i++) + if (*argv[i] != '-' || strcmp(argv[i], "-") == 0) { + if (infile == NULL) + infile = argv[i]; + else if (outfile == NULL) + outfile = argv[i]; + } + if (infile != NULL && strcmp(infile, "-") != 0 + && freopen(infile, "rb", stdin) == NULL) { + fprint(stderr, "%s: can't read `%s'\n", argv[0], infile); + exit(EXIT_FAILURE); + } +#if WIN32 + else + _setmode(_fileno(stdin), _O_BINARY); +#endif + if (outfile != NULL && strcmp(outfile, "-") != 0 + && freopen(outfile, "w", stdout) == NULL) { + fprint(stderr, "%s: can't write `%s'\n", argv[0], outfile); + exit(EXIT_FAILURE); + } + version = read_int(stdin); + assert(version/100 == (int)stamp); + pickle = rcc_read_program(stdin); + argc = pickle->argc; + argv = newarray(argc + 1, sizeof *argv, PERM); + { + for (i = 0; i < argc; i++) { + string_ty *arg = Seq_remlo(pickle->argv); + argv[i] = (char *)arg->str; + free(arg); + } + argv[i] = NULL; + assert(i == argc); + Seq_free(&pickle->argv); + } + for (i = argc - 1; i > 0; i--) + if (strncmp(argv[i], "-target=", 8) == 0) + break; + if (i > 0) { + int j; + for (j = 0; bindings[j].name && bindings[j].ir; j++) + if (strcmp(&argv[i][8], bindings[j].name) == 0) { + IR = bindings[j].ir; + break; + } + } + if (!IR) { + fprint(stderr, "%s: unknown target", argv[0]); + if (i > 0) + fprint(stderr, " `%s'", &argv[i][8]); + fprint(stderr, "; must specify one of\n"); + for (i = 0; bindings[i].name; i++) + fprint(stderr, "\t-target=%s\n", bindings[i].name); + exit(EXIT_FAILURE); + } + IR->wants_dag = 0; /* pickle's hold trees */ + init(argc, argv); + genlabel(pickle->nlabels); + level = GLOBAL; + { + int i, count; + nuids = pickle->nuids; + items = newarray(nuids, sizeof *items, PERM); + itemmap = newarray(nuids, sizeof *items, PERM); + for (i = 0; i < nuids; i++) { + itemmap[i] = NULL; + items[i] = NULL; + } + (*IR->progbeg)(argc, argv); + count = Seq_length(pickle->items); + for (i = 0; i < count; i++) { + rcc_item_ty item = Seq_remlo(pickle->items); + int uid = item->uid; + assert(uid >= 0 && uid < nuids); + assert(items[uid] == NULL); + items[uid] = item; + } + Seq_free(&pickle->items); +#define xx(s) assert(rcc_##s##_enum < sizeof doX/sizeof doX[0] && doX[rcc_##s##_enum]==0); \ + doX[rcc_##s##_enum] = do##s; + xx(Export) + xx(Import) + xx(Global) + xx(Local) + xx(Address) + xx(Segment) + xx(Defaddress) + xx(Deflabel) + xx(Defconst) + xx(Defconstf) + xx(Defstring) + xx(Space) + xx(Function) + xx(Blockbeg) + xx(Blockend) + xx(Forest) +#undef xx + count = Seq_length(pickle->interfaces); + for (i = 0; i < count; i++) + interface(Seq_remlo(pickle->interfaces)); + Seq_free(&pickle->interfaces); + free(pickle); + (*IR->progend)(); + } + deallocate(PERM); + return errcnt > 0; +} + +/* main_init - process program arguments */ +void main_init(int argc, char *argv[]) { + int i; + static int inited; + + if (inited) + return; + inited = 1; + for (i = 1; i < argc; i++) + if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "-g2") == 0) + glevel = 2; + else if (strcmp(argv[i], "-w") == 0) + wflag++; + else if (strcmp(argv[i], "-v") == 0) { + fprint(stderr, "%s %s\n", argv[0], rcsid); + verbose++; + } else if (strncmp(argv[i], "-errout=", 8) == 0) { + FILE *f = fopen(argv[i]+8, "w"); + if (f == NULL) { + fprint(stderr, "%s: can't write errors to `%s'\n", argv[0], argv[i]+8); + exit(EXIT_FAILURE); + } + fclose(f); + f = freopen(argv[i]+8, "w", stderr); + assert(f); + } else if (strncmp(argv[i], "-e", 2) == 0) { + int x; + if ((x = strtol(&argv[i][2], NULL, 0)) > 0) + errlimit = x; + } +} + +void init(int argc, char *argv[]) { + {extern void main_init(int, char *[]); main_init(argc, argv);} + {extern void prof_init(int, char *[]); prof_init(argc, argv);} + {extern void trace_init(int, char *[]); trace_init(argc, argv);} + {extern void type_init(int, char *[]); type_init(argc, argv);} + {extern void x86linux_init(int, char *[]); x86linux_init(argc, argv);} +} diff --git a/quake3/source/lcc/src/prof.c b/quake3/source/lcc/src/prof.c new file mode 100644 index 0000000..59ce879 --- /dev/null +++ b/quake3/source/lcc/src/prof.c @@ -0,0 +1,227 @@ +#include "c.h" + + +struct callsite { + char *file, *name; + union coordinate { + unsigned int coord; + struct { unsigned int y:16,x:10,index:6; } le; + struct { unsigned int index:6,x:10,y:16; } be; + } u; +}; +struct func { + struct func *link; + struct caller *callers; + char *name; + union coordinate src; +}; +struct map { /* source code map; 200 coordinates/map */ + int size; + union coordinate u[200]; +}; + +int npoints; /* # of execution points if -b specified */ +int ncalled = -1; /* #times prof.out says current function was called */ +static Symbol YYlink; /* symbol for file's struct _bbdata */ +static Symbol YYcounts; /* symbol for _YYcounts if -b specified */ +static List maplist; /* list of struct map *'s */ +static List filelist; /* list of file names */ +static Symbol funclist; /* list of struct func *'s */ +static Symbol afunc; /* current function's struct func */ + +/* bbcall - build tree to set _callsite at call site *cp, emit call site data */ +static void bbcall(Symbol yycounts, Coordinate *cp, Tree *e) { + static Symbol caller; + Value v; + union coordinate u; + Symbol p = genident(STATIC, array(voidptype, 0, 0), GLOBAL); + Tree t = *e; + + defglobal(p, LIT); + defpointer(cp->file ? mkstr(cp->file)->u.c.loc : (Symbol)0); + defpointer(mkstr(cfunc->name)->u.c.loc); + if (IR->little_endian) { + u.le.x = cp->x; + u.le.y = cp->y; + } else { + u.be.x = cp->x; + u.be.y = cp->y; + } + (*IR->defconst)(U, unsignedtype->size, (v.u = u.coord, v)); + if (caller == 0) { + caller = mksymbol(EXTERN, "_caller", ptr(voidptype)); + caller->defined = 0; + } + if (generic((*e)->op) != CALL) + t = (*e)->kids[0]; + assert(generic(t->op) == CALL); + t = tree(t->op, t->type, + tree(RIGHT, t->kids[0]->type, + t->kids[0], + tree(RIGHT, t->kids[0]->type, asgn(caller, idtree(p)), t->kids[0])), + t->kids[1]); + if (generic((*e)->op) != CALL) + t = tree((*e)->op, (*e)->type, t, (*e)->kids[1]); + *e = t; +} + +/* bbentry - return tree for _prologue(&afunc, &YYlink)' */ +static void bbentry(Symbol yylink, Symbol f) { + static Symbol prologue; + + afunc = genident(STATIC, array(voidptype, 4, 0), GLOBAL); + if (prologue == 0) { + prologue = mksymbol(EXTERN, "_prologue", ftype(inttype, voidptype)); + prologue->defined = 0; + } + walk(vcall(prologue, voidtype, pointer(idtree(afunc)), pointer(idtree(yylink)), NULL), 0, 0); + +} + +/* bbexit - return tree for _epilogue(&afunc)' */ +static void bbexit(Symbol yylink, Symbol f, Tree e) { + static Symbol epilogue; + + if (epilogue == 0) { + epilogue = mksymbol(EXTERN, "_epilogue", ftype(inttype, voidptype)); + epilogue->defined = 0; + } + walk(vcall(epilogue, voidtype, pointer(idtree(afunc)), NULL), 0, 0); +} + +/* bbfile - add file to list of file names, return its index */ +static int bbfile(char *file) { + if (file) { + List lp; + int i = 1; + if ((lp = filelist) != NULL) + do { + lp = lp->link; + if (((Symbol)lp->x)->u.c.v.p == file) + return i; + i++; + } while (lp != filelist); + filelist = append(mkstr(file), filelist); + return i; + } + return 0; +} + +/* bbfunc - emit function name and src coordinates */ +static void bbfunc(Symbol yylink, Symbol f) { + Value v; + union coordinate u; + + defglobal(afunc, DATA); + defpointer(funclist); + defpointer(NULL); + defpointer(mkstr(f->name)->u.c.loc); + if (IR->little_endian) { + u.le.x = f->u.f.pt.x; + u.le.y = f->u.f.pt.y; + u.le.index = bbfile(f->u.f.pt.file); + } else { + u.be.x = f->u.f.pt.x; + u.be.y = f->u.f.pt.y; + u.be.index = bbfile(f->u.f.pt.file); + } + (*IR->defconst)(U, unsignedtype->size, (v.u = u.coord, v)); + funclist = afunc; +} + +/* bbincr - build tree to increment execution point at *cp */ +static void bbincr(Symbol yycounts, Coordinate *cp, Tree *e) { + struct map *mp = maplist->x; + Tree t; + + /* append *cp to source map */ + if (mp->size >= NELEMS(mp->u)) { + NEW(mp, PERM); + mp->size = 0; + maplist = append(mp, maplist); + } + if (IR->little_endian) { + mp->u[mp->size].le.x = cp->x; + mp->u[mp->size].le.y = cp->y; + mp->u[mp->size++].le.index = bbfile(cp->file); + } else { + mp->u[mp->size].be.x = cp->x; + mp->u[mp->size].be.y = cp->y; + mp->u[mp->size++].be.index = bbfile(cp->file); + } + t = incr('+', rvalue((*optree['+'])(ADD, pointer(idtree(yycounts)), + consttree(npoints++, inttype))), consttree(1, inttype)); + if (*e) + *e = tree(RIGHT, (*e)->type, t, *e); + else + *e = t; +} + +/* bbvars - emit definition for basic block counting data */ +static void bbvars(Symbol yylink) { + int i, j, n = npoints; + Value v; + struct map **mp; + Symbol coords, files, *p; + + if (!YYcounts && !yylink) + return; + if (YYcounts) { + if (n <= 0) + n = 1; + YYcounts->type = array(unsignedtype, n, 0); + defglobal(YYcounts, BSS); + } + files = genident(STATIC, array(charptype, 1, 0), GLOBAL); + defglobal(files, LIT); + for (p = ltov(&filelist, PERM); *p; p++) + defpointer((*p)->u.c.loc); + defpointer(NULL); + coords = genident(STATIC, array(unsignedtype, n, 0), GLOBAL); + defglobal(coords, LIT); + for (i = n, mp = ltov(&maplist, PERM); *mp; i -= (*mp)->size, mp++) + for (j = 0; j < (*mp)->size; j++) + (*IR->defconst)(U, unsignedtype->size, (v.u = (*mp)->u[j].coord, v)); + if (i > 0) + (*IR->space)(i*coords->type->type->size); + defpointer(NULL); + defglobal(yylink, DATA); + defpointer(NULL); + (*IR->defconst)(U, unsignedtype->size, (v.u = n, v)); + defpointer(YYcounts); + defpointer(coords); + defpointer(files); + defpointer(funclist); +} + +/* profInit - initialize basic block profiling options */ +void prof_init(int argc, char *argv[]) { + int i; + static int inited; + + if (inited) + return; + inited = 1; + type_init(argc, argv); + if (IR) + for (i = 1; i < argc; i++) + if (strncmp(argv[i], "-a", 2) == 0) { + if (ncalled == -1 + && process(argv[i][2] ? &argv[i][2] : "prof.out") > 0) + ncalled = 0; + } else if ((strcmp(argv[i], "-b") == 0 + || strcmp(argv[i], "-C") == 0) && YYlink == 0) { + YYlink = genident(STATIC, array(unsignedtype, 0, 0), GLOBAL); + attach((Apply)bbentry, YYlink, &events.entry); + attach((Apply)bbexit, YYlink, &events.returns); + attach((Apply)bbfunc, YYlink, &events.exit); + attach((Apply)bbvars, YYlink, &events.end); + if (strcmp(argv[i], "-b") == 0) { + YYcounts = genident(STATIC, array(unsignedtype, 0, 0), GLOBAL); + maplist = append(allocate(sizeof (struct map), PERM), maplist); + ((struct map *)maplist->x)->size = 0; + attach((Apply)bbcall, YYcounts, &events.calls); + attach((Apply)bbincr, YYcounts, &events.points); + } + } +} diff --git a/quake3/source/lcc/src/profio.c b/quake3/source/lcc/src/profio.c new file mode 100644 index 0000000..3e74770 --- /dev/null +++ b/quake3/source/lcc/src/profio.c @@ -0,0 +1,276 @@ +/* C compiler: prof.out input + +prof.out format: +#files + name + ... (#files-1 times) +#functions + name file# x y count caller file x y + ... (#functions-1 times) +#points + file# x y count + ... (#points-1 times) +*/ +#include "c.h" + + +struct count { /* count data: */ + int x, y; /* source coordinate */ + int count; /* associated execution count */ +}; + +#define MAXTOKEN 64 + +struct file { /* per-file prof.out data: */ + struct file *link; /* link to next file */ + char *name; /* file name */ + int size; /* size of counts[] */ + int count; /* counts[0..count-1] hold valid data */ + struct count *counts; /* count data */ + struct func { /* function data: */ + struct func *link; /* link to next function */ + char *name; /* function name */ + struct count count; /* total number of calls */ + struct caller { /* caller data: */ + struct caller *link; /* link to next caller */ + char *name; /* caller's name */ + char *file; /* call site: file, x, y */ + int x, y; + int count; /* number of calls from this site */ + } *callers; + } *funcs; /* list of functions */ +} *filelist; +FILE *fp; + +/* acaller - add caller and site (file,x,y) to callee's callers list */ +static void acaller(char *caller, char *file, int x, int y, int count, struct func *callee) { + struct caller *q; + + assert(callee); + for (q = callee->callers; q && (caller != q->name + || file != q->file || x != q->x || y != q->y); q = q->link) + ; + if (!q) { + struct caller **r; + NEW(q, PERM); + q->name = caller; + q->file = file; + q->x = x; + q->y = y; + q->count = 0; + for (r = &callee->callers; *r && (strcmp(q->name, (*r)->name) > 0 + || strcmp(q->file, (*r)->file) > 0 || q->y > (*r)->y || q->y > (*r)->y); r = &(*r)->link) + ; + q->link = *r; + *r = q; + } + q->count += count; +} + +/* compare - return <0, 0, >0 if ab, resp. */ +static int compare(struct count *a, struct count *b) { + if (a->y == b->y) + return a->x - b->x; + return a->y - b->y; +} + +/* findfile - return file name's file list entry, or 0 */ +static struct file *findfile(char *name) { + struct file *p; + + for (p = filelist; p; p = p->link) + if (p->name == name) + return p; + return 0; +} + +/* afunction - add function name and its data to file's function list */ +static struct func *afunction(char *name, char *file, int x, int y, int count) { + struct file *p = findfile(file); + struct func *q; + + assert(p); + for (q = p->funcs; q && name != q->name; q = q->link) + ; + if (!q) { + struct func **r; + NEW(q, PERM); + q->name = name; + q->count.x = x; + q->count.y = y; + q->count.count = 0; + q->callers = 0; + for (r = &p->funcs; *r && compare(&q->count, &(*r)->count) > 0; r = &(*r)->link) + ; + q->link = *r; + *r = q; + } + q->count.count += count; + return q; +} + +/* apoint - append execution point i to file's data */ +static void apoint(int i, char *file, int x, int y, int count) { + struct file *p = findfile(file); + + assert(p); + if (i >= p->size) { + int j; + if (p->size == 0) { + p->size = i >= 200 ? 2*i : 200; + p->counts = newarray(p->size, sizeof *p->counts, PERM); + } else { + struct count *new; + p->size = 2*i; + new = newarray(p->size, sizeof *new, PERM); + for (j = 0; j < p->count; j++) + new[j] = p->counts[j]; + p->counts = new; + } + for (j = p->count; j < p->size; j++) { + static struct count z; + p->counts[j] = z; + } + } + p->counts[i].x = x; + p->counts[i].y = y; + p->counts[i].count += count; + if (i >= p->count) + p->count = i + 1; +} + +/* findcount - return count associated with (file,x,y) or -1 */ +int findcount(char *file, int x, int y) { + static struct file *cursor; + + if (cursor == 0 || cursor->name != file) + cursor = findfile(file); + if (cursor) { + int l, u; + struct count *c = cursor->counts; + for (l = 0, u = cursor->count - 1; l <= u; ) { + int k = (l + u)/2; + if (c[k].y > y || c[k].y == y && c[k].x > x) + u = k - 1; + else if (c[k].y < y || c[k].y == y && c[k].x < x) + l = k + 1; + else + return c[k].count; + } + } + return -1; +} + +/* findfunc - return count associated with function name in file or -1 */ +int findfunc(char *name, char *file) { + static struct file *cursor; + + if (cursor == 0 || cursor->name != file) + cursor = findfile(file); + if (cursor) { + struct func *p; + for (p = cursor->funcs; p; p = p->link) + if (p->name == name) + return p->count.count; + } + return -1; +} + +/* getd - read a nonnegative number */ +static int getd(void) { + int c, n = 0; + + while ((c = getc(fp)) != EOF && (c == ' ' || c == '\n' || c == '\t')) + ; + if (c >= '0' && c <= '9') { + do + n = 10*n + (c - '0'); + while ((c = getc(fp)) >= '0' && c <= '9'); + return n; + } + return -1; +} + +/* getstr - read a string */ +static char *getstr(void) { + int c; + char buf[MAXTOKEN], *s = buf; + + while ((c = getc(fp)) != EOF && c != ' ' && c != '\n' && c != '\t') + if (s - buf < (int)sizeof buf - 2) + *s++ = c; + *s = 0; + return s == buf ? (char *)0 : string(buf); +} + +/* gather - read prof.out data from fd */ +static int gather(void) { + int i, nfiles, nfuncs, npoints; + char *files[64]; + + if ((nfiles = getd()) < 0) + return 0; + assert(nfiles < NELEMS(files)); + for (i = 0; i < nfiles; i++) { + if ((files[i] = getstr()) == 0) + return -1; + if (!findfile(files[i])) { + struct file *new; + NEW(new, PERM); + new->name = files[i]; + new->size = new->count = 0; + new->counts = 0; + new->funcs = 0; + new->link = filelist; + filelist = new; + } + } + if ((nfuncs = getd()) < 0) + return -1; + for (i = 0; i < nfuncs; i++) { + struct func *q; + char *name, *file; + int f, x, y, count; + if ((name = getstr()) == 0 || (f = getd()) <= 0 + || (x = getd()) < 0 || (y = getd()) < 0 || (count = getd()) < 0) + return -1; + q = afunction(name, files[f-1], x, y, count); + if ((name = getstr()) == 0 || (file = getstr()) == 0 + || (x = getd()) < 0 || (y = getd()) < 0) + return -1; + if (*name != '?') + acaller(name, file, x, y, count, q); + } + if ((npoints = getd()) < 0) + return -1; + for (i = 0; i < npoints; i++) { + int f, x, y, count; + if ((f = getd()) < 0 || (x = getd()) < 0 || (y = getd()) < 0 + || (count = getd()) < 0) + return -1; + if (f) + apoint(i, files[f-1], x, y, count); + } + return 1; +} + +/* process - read prof.out data from file */ +int process(char *file) { + int more; + + if ((fp = fopen(file, "r")) != NULL) { + struct file *p; + while ((more = gather()) > 0) + ; + fclose(fp); + if (more < 0) + return more; + for (p = filelist; p; p = p->link) + qsort(p->counts, p->count, sizeof *p->counts, + (int (*)(const void *, const void *)) + compare); + + return 1; + } + return 0; +} diff --git a/quake3/source/lcc/src/rcc.asdl b/quake3/source/lcc/src/rcc.asdl new file mode 100644 index 0000000..847c070 --- /dev/null +++ b/quake3/source/lcc/src/rcc.asdl @@ -0,0 +1,70 @@ +-- lcc IR +-- $Id: rcc.asdl,v 1.1.1.1 2001/10/17 21:53:37 timo Exp $ +module rcc { + +-- Pickles start with an int version number, followed by rcc.program + +program = (int nuids,int nlabels,item* items,interface* interfaces,int argc,string *argv) + +real = (int msb,int lsb) + +item = Symbol(symbol symbol) + | Type(type type) + attributes(int uid) + +symbol = (identifier id,int type,int scope,int sclass,int ref,int flags) + +field = (identifier id,int type,int offset,int bitsize,int lsb) + +enum = (identifier id,int value) + +type = INT + | UNSIGNED + | FLOAT + | VOID + | POINTER(int type) + | ENUM(identifier tag,enum* ids) + | STRUCT(identifier tag,field* fields) + | UNION(identifier tag,field* fields) + | ARRAY(int type) + | FUNCTION(int type,int* formals) + | CONST(int type) + | VOLATILE(int type) + attributes(int size,int align) + +interface = Export(int p) + | Import(int p) + | Global(int p,int seg) + | Local(int uid,symbol p) -- includes formals + | Address(int uid,symbol q,int p,int n) + | Segment(int seg) + | Defaddress(int p) + | Deflabel(int label) + | Defconst(int suffix,int size,int value) + | Defconstf(int size,real value) + | Defstring(string s) + | Space(int n) + | Function(int f,int* caller,int* callee,int ncalls,interface* codelist) + | Blockbeg + | Blockend + | Forest(node* nodes) + +node = CNST(int value) + | CNSTF(real value) + | ARG(node left,int len,int align) + | ASGN(node left,node right,int len,int align) + | CVT(int op,node left,int fromsize) + | CALL(node left,int type) + | CALLB(node left,node right,int type) + | RET + | ADDRG(int uid) + | ADDRL(int uid) + | ADDRF(int uid) + | Unary(int op,node left) -- INDIR RET JUMP NEG BCOM + | Binary(int op,node left,node right) -- ADD SUB DIV MUL MOD BOR BAND BXOR RSH LSH + | Compare(int op,node left,node right,int label) -- EQ NE GT GE LE LT + | LABEL(int label) + | BRANCH(int label) + | CSE(int uid,node node) + attributes(int suffix,int size) +} diff --git a/quake3/source/lcc/src/run.sh b/quake3/source/lcc/src/run.sh new file mode 100644 index 0000000..432872e --- /dev/null +++ b/quake3/source/lcc/src/run.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# run .../target/os/tst/foo.s [ remotehost ] + +# set -x +target=`echo $1 | awk -F/ '{ print $(NF-3) }'` +os=`echo $1 | awk -F/ '{ print $(NF-2) }'` +dir=$target/$os + +case "$1" in +*symbolic/irix*) idir=include/mips/irix; remotehost=noexecute ;; +*symbolic/osf*) idir=include/alpha/osf; remotehost=noexecute ;; +*) idir=include/$dir; remotehost=${2-$REMOTEHOST} ;; +esac + +if [ ! -d "$target/$os" -o ! -d "$idir" ]; then + echo 2>&1 $0: unknown combination '"'$target/$os'"' + exit 1 +fi + +C=`basename $1 .s` +BUILDDIR=${BUILDDIR-.} LCC="${LCC-${BUILDDIR}/lcc} -Wo-lccdir=$BUILDDIR" +TSTDIR=${TSTDIR-${BUILDDIR}/$dir/tst} +if [ ! -d $TSTDIR ]; then mkdir -p $TSTDIR; fi + +echo ${BUILDDIR}/rcc$EXE -target=$target/$os $1: 1>&2 +$LCC -S -I$idir -Ualpha -Usun -Uvax -Umips -Ux86 \ + -Wf-errout=$TSTDIR/$C.2 -D$target -Wf-g0 \ + -Wf-target=$target/$os -o $1 tst/$C.c +if [ $? != 0 ]; then remotehost=noexecute; fi +if [ -r $dir/tst/$C.2bk ]; then + diff $dir/tst/$C.2bk $TSTDIR/$C.2 +fi +if [ -r $dir/tst/$C.sbk ]; then + if diff $dir/tst/$C.sbk $TSTDIR/$C.s; then exit 0; fi +fi + +case "$remotehost" in +noexecute) exit 0 ;; +""|"-") $LCC -o $TSTDIR/$C$EXE $1; $TSTDIR/$C$EXE $TSTDIR/$C.1 ;; +*) rcp $1 $remotehost: + if expr "$remotehost" : '.*@' >/dev/null ; then + remotehost="`expr $remotehost : '.*@\(.*\)'` -l `expr $remotehost : '\(.*\)@'`" + fi + rsh $remotehost "cc -o $C$EXE $C.s -lm;./$C$EXE;rm -f $C$EXE $C.[so]" $TSTDIR/$C.1 + ;; +esac +if [ -r $dir/tst/$C.1bk ]; then + diff $dir/tst/$C.1bk $TSTDIR/$C.1 + exit $? +fi +exit 0 diff --git a/quake3/source/lcc/src/simp.c b/quake3/source/lcc/src/simp.c new file mode 100644 index 0000000..04699bb --- /dev/null +++ b/quake3/source/lcc/src/simp.c @@ -0,0 +1,587 @@ +#include "c.h" +#include + + +#define foldcnst(TYPE,VAR,OP) \ + if (l->op == CNST+TYPE && r->op == CNST+TYPE) \ + return cnsttree(ty, l->u.v.VAR OP r->u.v.VAR) +#define commute(L,R) \ + if (generic(R->op) == CNST && generic(L->op) != CNST) \ + do { Tree t = L; L = R; R = t; } while(0) +#define xfoldcnst(TYPE,VAR,OP,FUNC)\ + if (l->op == CNST+TYPE && r->op == CNST+TYPE\ + && FUNC(l->u.v.VAR,r->u.v.VAR,\ + ty->u.sym->u.limits.min.VAR,\ + ty->u.sym->u.limits.max.VAR, needconst)) \ + return cnsttree(ty, l->u.v.VAR OP r->u.v.VAR) +#define xcvtcnst(FTYPE,SRC,DST,VAR,EXPR) \ + if (l->op == CNST+FTYPE) do {\ + if (!explicitCast\ + && ((SRC) < DST->u.sym->u.limits.min.VAR || (SRC) > DST->u.sym->u.limits.max.VAR))\ + warning("overflow in converting constant expression from `%t' to `%t'\n", l->type, DST);\ + if (needconst\ + || !((SRC) < DST->u.sym->u.limits.min.VAR || (SRC) > DST->u.sym->u.limits.max.VAR))\ + return cnsttree(ty, (EXPR)); } while(0) +#define identity(X,Y,TYPE,VAR,VAL) \ + if (X->op == CNST+TYPE && X->u.v.VAR == VAL) return Y +#define zerofield(OP,TYPE,VAR) \ + if (l->op == FIELD \ + && r->op == CNST+TYPE && r->u.v.VAR == 0)\ + return eqtree(OP, bittree(BAND, l->kids[0],\ + cnsttree(unsignedtype, \ + (unsigned long)fieldmask(l->u.field)<u.field))), r) +#define cfoldcnst(TYPE,VAR,OP) \ + if (l->op == CNST+TYPE && r->op == CNST+TYPE) \ + return cnsttree(inttype, (long)(l->u.v.VAR OP r->u.v.VAR)) +#define foldaddp(L,R,RTYPE,VAR) \ + if (L->op == CNST+P && R->op == CNST+RTYPE) { \ + Tree e = tree(CNST+P, ty, NULL, NULL);\ + e->u.v.p = (char *)L->u.v.p + R->u.v.VAR;\ + return e; } +#define ufoldcnst(TYPE,EXP) if (l->op == CNST+TYPE) return EXP +#define sfoldcnst(OP) \ + if (l->op == CNST+U && r->op == CNST+I \ + && r->u.v.i >= 0 && r->u.v.i < 8*l->type->size) \ + return cnsttree(ty, (unsigned long)(l->u.v.u OP r->u.v.i)) +#define geu(L,R,V) \ + if (R->op == CNST+U && R->u.v.u == 0) do { \ + warning("result of unsigned comparison is constant\n"); \ + return tree(RIGHT, inttype, root(L), cnsttree(inttype, (long)(V))); } while(0) +#define idempotent(OP) if (l->op == OP) return l->kids[0] + +int needconst; +int explicitCast; +static int addi(long x, long y, long min, long max, int needconst) { + int cond = x == 0 || y == 0 + || x < 0 && y < 0 && x >= min - y + || x < 0 && y > 0 + || x > 0 && y < 0 + || x > 0 && y > 0 && x <= max - y; + if (!cond && needconst) { + warning("overflow in constant expression\n"); + cond = 1; + } + return cond; + + +} + +static int addd(double x, double y, double min, double max, int needconst) { + int cond = x == 0 || y == 0 + || x < 0 && y < 0 && x >= min - y + || x < 0 && y > 0 + || x > 0 && y < 0 + || x > 0 && y > 0 && x <= max - y; + if (!cond && needconst) { + warning("overflow in constant expression\n"); + cond = 1; + } + return cond; + + +} + +static Tree addrtree(Tree e, long n, Type ty) { + Symbol p = e->u.sym, q; + + if (p->scope == GLOBAL + || p->sclass == STATIC || p->sclass == EXTERN) + NEW0(q, PERM); + else + NEW0(q, FUNC); + q->name = stringd(genlabel(1)); + q->sclass = p->sclass; + q->scope = p->scope; + assert(isptr(ty) || isarray(ty)); + q->type = isptr(ty) ? ty->type : ty; + q->temporary = p->temporary; + q->generated = p->generated; + q->addressed = p->addressed; + q->computed = 1; + q->defined = 1; + q->ref = 1; + if (p->scope == GLOBAL + || p->sclass == STATIC || p->sclass == EXTERN) { + if (p->sclass == AUTO) + q->sclass = STATIC; + (*IR->address)(q, p, n); + } else { + Code cp; + addlocal(p); + cp = code(Address); + cp->u.addr.sym = q; + cp->u.addr.base = p; + cp->u.addr.offset = n; + } + e = tree(e->op, ty, NULL, NULL); + e->u.sym = q; + return e; +} + +/* div[id] - return 1 if min <= x/y <= max, 0 otherwise */ +static int divi(long x, long y, long min, long max, int needconst) { + int cond = y != 0 && !(x == min && y == -1); + if (!cond && needconst) { + warning("overflow in constant expression\n"); + cond = 1; + } + return cond; + + +} + +static int divd(double x, double y, double min, double max, int needconst) { + int cond; + + if (x < 0) x = -x; + if (y < 0) y = -y; + cond = y != 0 && !(y < 1 && x > max*y); + if (!cond && needconst) { + warning("overflow in constant expression\n"); + cond = 1; + } + return cond; + +} + +/* mul[id] - return 1 if min <= x*y <= max, 0 otherwise */ +static int muli(long x, long y, long min, long max, int needconst) { + int cond = x > -1 && x <= 1 || y > -1 && y <= 1 + || x < 0 && y < 0 && -x <= max/-y + || x < 0 && y > 0 && x >= min/y + || x > 0 && y < 0 && y >= min/x + || x > 0 && y > 0 && x <= max/y; + if (!cond && needconst) { + warning("overflow in constant expression\n"); + cond = 1; + } + return cond; + + +} + +static int muld(double x, double y, double min, double max, int needconst) { + int cond = x >= -1 && x <= 1 || y >= -1 && y <= 1 + || x < 0 && y < 0 && -x <= max/-y + || x < 0 && y > 0 && x >= min/y + || x > 0 && y < 0 && y >= min/x + || x > 0 && y > 0 && x <= max/y; + if (!cond && needconst) { + warning("overflow in constant expression\n"); + cond = 1; + } + return cond; + + +} +/* sub[id] - return 1 if min <= x-y <= max, 0 otherwise */ +static int subi(long x, long y, long min, long max, int needconst) { + return addi(x, -y, min, max, needconst); +} + +static int subd(double x, double y, double min, double max, int needconst) { + return addd(x, -y, min, max, needconst); +} +Tree constexpr(int tok) { + Tree p; + + needconst++; + p = expr1(tok); + needconst--; + return p; +} + +int intexpr(int tok, int n) { + Tree p = constexpr(tok); + + needconst++; + if (p->op == CNST+I || p->op == CNST+U) + n = cast(p, inttype)->u.v.i; + else + error("integer expression must be constant\n"); + needconst--; + return n; +} +Tree simplify(int op, Type ty, Tree l, Tree r) { + int n; + Tree p; + + if (optype(op) == 0) + op = mkop(op, ty); + switch (op) { + case ADD+U: + foldcnst(U,u,+); + commute(r,l); + identity(r,l,U,u,0); + break; + case ADD+I: + xfoldcnst(I,i,+,addi); + commute(r,l); + identity(r,l,I,i,0); + break; + case CVI+I: + xcvtcnst(I,l->u.v.i,ty,i,(long)extend(l->u.v.i,ty)); + break; + case CVU+I: + if (l->op == CNST+U) { + if (!explicitCast && l->u.v.u > ty->u.sym->u.limits.max.i) + warning("overflow in converting constant expression from `%t' to `%t'\n", l->type, ty); + if (needconst || !(l->u.v.u > ty->u.sym->u.limits.max.i)) + return cnsttree(ty, (long)extend(l->u.v.u,ty)); + } + break; + case CVP+U: + xcvtcnst(P,(unsigned long)l->u.v.p,ty,u,(unsigned long)l->u.v.p); + break; + case CVU+P: + xcvtcnst(U,(void*)l->u.v.u,ty,p,(void*)l->u.v.u); + break; + case CVP+P: + xcvtcnst(P,l->u.v.p,ty,p,l->u.v.p); + break; + case CVI+U: + xcvtcnst(I,l->u.v.i,ty,u,((unsigned long)l->u.v.i)&ones(8*ty->size)); + break; + case CVU+U: + xcvtcnst(U,l->u.v.u,ty,u,l->u.v.u&ones(8*ty->size)); + break; + + case CVI+F: + xcvtcnst(I,l->u.v.i,ty,d,(long double)l->u.v.i); + case CVU+F: + xcvtcnst(U,l->u.v.u,ty,d,(long double)l->u.v.u); + break; + case CVF+I: + xcvtcnst(F,l->u.v.d,ty,i,(long)l->u.v.d); + break; + case CVF+F: { + float d; + if (l->op == CNST+F) + if (l->u.v.d < ty->u.sym->u.limits.min.d) + d = ty->u.sym->u.limits.min.d; + else if (l->u.v.d > ty->u.sym->u.limits.max.d) + d = ty->u.sym->u.limits.max.d; + else + d = l->u.v.d; + xcvtcnst(F,l->u.v.d,ty,d,(long double)d); + break; + } + case BAND+U: + foldcnst(U,u,&); + commute(r,l); + identity(r,l,U,u,ones(8*ty->size)); + if (r->op == CNST+U && r->u.v.u == 0) + return tree(RIGHT, ty, root(l), cnsttree(ty, 0UL)); + break; + case BAND+I: + foldcnst(I,i,&); + commute(r,l); + identity(r,l,I,i,ones(8*ty->size)); + if (r->op == CNST+I && r->u.v.u == 0) + return tree(RIGHT, ty, root(l), cnsttree(ty, 0L)); + break; + + case MUL+U: + commute(l,r); + if (l->op == CNST+U && (n = ispow2(l->u.v.u)) != 0) + return simplify(LSH, ty, r, cnsttree(inttype, (long)n)); + foldcnst(U,u,*); + identity(r,l,U,u,1); + break; + case NE+I: + cfoldcnst(I,i,!=); + commute(r,l); + zerofield(NE,I,i); + break; + + case EQ+I: + cfoldcnst(I,i,==); + commute(r,l); + zerofield(EQ,I,i); + break; + case ADD+P: + foldaddp(l,r,I,i); + foldaddp(l,r,U,u); + foldaddp(r,l,I,i); + foldaddp(r,l,U,u); + commute(r,l); + identity(r,retype(l,ty),I,i,0); + identity(r,retype(l,ty),U,u,0); + if (isaddrop(l->op) + && (r->op == CNST+I && r->u.v.i <= longtype->u.sym->u.limits.max.i + && r->u.v.i >= longtype->u.sym->u.limits.min.i + || r->op == CNST+U && r->u.v.u <= longtype->u.sym->u.limits.max.i)) + return addrtree(l, cast(r, longtype)->u.v.i, ty); + if (l->op == ADD+P && isaddrop(l->kids[1]->op) + && (r->op == CNST+I && r->u.v.i <= longtype->u.sym->u.limits.max.i + && r->u.v.i >= longtype->u.sym->u.limits.min.i + || r->op == CNST+U && r->u.v.u <= longtype->u.sym->u.limits.max.i)) + return simplify(ADD+P, ty, l->kids[0], + addrtree(l->kids[1], cast(r, longtype)->u.v.i, ty)); + if ((l->op == ADD+I || l->op == SUB+I) + && l->kids[1]->op == CNST+I && isaddrop(r->op)) + return simplify(ADD+P, ty, l->kids[0], + simplify(generic(l->op)+P, ty, r, l->kids[1])); + if (l->op == ADD+P && generic(l->kids[1]->op) == CNST + && generic(r->op) == CNST) + return simplify(ADD+P, ty, l->kids[0], + simplify(ADD, l->kids[1]->type, l->kids[1], r)); + if (l->op == ADD+I && generic(l->kids[1]->op) == CNST + && r->op == ADD+P && generic(r->kids[1]->op) == CNST) + return simplify(ADD+P, ty, l->kids[0], + simplify(ADD+P, ty, r->kids[0], + simplify(ADD, r->kids[1]->type, l->kids[1], r->kids[1]))); + if (l->op == RIGHT && l->kids[1]) + return tree(RIGHT, ty, l->kids[0], + simplify(ADD+P, ty, l->kids[1], r)); + else if (l->op == RIGHT && l->kids[0]) + return tree(RIGHT, ty, + simplify(ADD+P, ty, l->kids[0], r), NULL); + break; + + case ADD+F: + xfoldcnst(F,d,+,addd); + commute(r,l); + break; + case AND+I: + op = AND; + ufoldcnst(I,l->u.v.i ? cond(r) : l); /* 0&&r => 0, 1&&r => r */ + break; + case OR+I: + op = OR; + /* 0||r => r, 1||r => 1 */ + ufoldcnst(I,l->u.v.i ? cnsttree(ty, 1L) : cond(r)); + break; + case BCOM+I: + ufoldcnst(I,cnsttree(ty, (long)extend((~l->u.v.i)&ones(8*ty->size), ty))); + idempotent(BCOM+U); + break; + case BCOM+U: + ufoldcnst(U,cnsttree(ty, (unsigned long)((~l->u.v.u)&ones(8*ty->size)))); + idempotent(BCOM+U); + break; + case BOR+U: + foldcnst(U,u,|); + commute(r,l); + identity(r,l,U,u,0); + break; + case BOR+I: + foldcnst(I,i,|); + commute(r,l); + identity(r,l,I,i,0); + break; + case BXOR+U: + foldcnst(U,u,^); + commute(r,l); + identity(r,l,U,u,0); + break; + case BXOR+I: + foldcnst(I,i,^); + commute(r,l); + identity(r,l,I,i,0); + break; + case DIV+F: + xfoldcnst(F,d,/,divd); + break; + case DIV+I: + identity(r,l,I,i,1); + if (r->op == CNST+I && r->u.v.i == 0 + || l->op == CNST+I && l->u.v.i == ty->u.sym->u.limits.min.i + && r->op == CNST+I && r->u.v.i == -1) + break; + xfoldcnst(I,i,/,divi); + break; + case DIV+U: + identity(r,l,U,u,1); + if (r->op == CNST+U && r->u.v.u == 0) + break; + if (r->op == CNST+U && (n = ispow2(r->u.v.u)) != 0) + return simplify(RSH, ty, l, cnsttree(inttype, (long)n)); + foldcnst(U,u,/); + break; + case EQ+F: + cfoldcnst(F,d,==); + commute(r,l); + break; + case EQ+U: + cfoldcnst(U,u,==); + commute(r,l); + zerofield(EQ,U,u); + break; + case GE+F: cfoldcnst(F,d,>=); break; + case GE+I: cfoldcnst(I,i,>=); break; + case GE+U: + geu(l,r,1); /* l >= 0 => (l,1) */ + cfoldcnst(U,u,>=); + if (l->op == CNST+U && l->u.v.u == 0) /* 0 >= r => r == 0 */ + return eqtree(EQ, r, l); + break; + case GT+F: cfoldcnst(F,d, >); break; + case GT+I: cfoldcnst(I,i, >); break; + case GT+U: + geu(r,l,0); /* 0 > r => (r,0) */ + cfoldcnst(U,u, >); + if (r->op == CNST+U && r->u.v.u == 0) /* l > 0 => l != 0 */ + return eqtree(NE, l, r); + break; + case LE+F: cfoldcnst(F,d,<=); break; + case LE+I: cfoldcnst(I,i,<=); break; + case LE+U: + geu(r,l,1); /* 0 <= r => (r,1) */ + cfoldcnst(U,u,<=); + if (r->op == CNST+U && r->u.v.u == 0) /* l <= 0 => l == 0 */ + return eqtree(EQ, l, r); + break; + case LSH+I: + identity(r,l,I,i,0); + if (l->op == CNST+I && r->op == CNST+I + && r->u.v.i >= 0 && r->u.v.i < 8*l->type->size + && muli(l->u.v.i, 1<u.v.i, ty->u.sym->u.limits.min.i, ty->u.sym->u.limits.max.i, needconst)) + return cnsttree(ty, (long)(l->u.v.i<u.v.i)); + if (r->op == CNST+I && (r->u.v.i >= 8*ty->size || r->u.v.i < 0)) { + warning("shifting an `%t' by %d bits is undefined\n", ty, r->u.v.i); + break; + } + + break; + case LSH+U: + identity(r,l,I,i,0); + sfoldcnst(<<); + if (r->op == CNST+I && (r->u.v.i >= 8*ty->size || r->u.v.i < 0)) { + warning("shifting an `%t' by %d bits is undefined\n", ty, r->u.v.i); + break; + } + + break; + + case LT+F: cfoldcnst(F,d, <); break; + case LT+I: cfoldcnst(I,i, <); break; + case LT+U: + geu(l,r,0); /* l < 0 => (l,0) */ + cfoldcnst(U,u, <); + if (l->op == CNST+U && l->u.v.u == 0) /* 0 < r => r != 0 */ + return eqtree(NE, r, l); + break; + case MOD+I: + if (r->op == CNST+I && r->u.v.i == 1) /* l%1 => (l,0) */ + return tree(RIGHT, ty, root(l), cnsttree(ty, 0L)); + if (r->op == CNST+I && r->u.v.i == 0 + || l->op == CNST+I && l->u.v.i == ty->u.sym->u.limits.min.i + && r->op == CNST+I && r->u.v.i == -1) + break; + xfoldcnst(I,i,%,divi); + break; + case MOD+U: + if (r->op == CNST+U && ispow2(r->u.v.u)) /* l%2^n => l&(2^n-1) */ + return bittree(BAND, l, cnsttree(ty, r->u.v.u - 1)); + if (r->op == CNST+U && r->u.v.u == 0) + break; + foldcnst(U,u,%); + break; + case MUL+F: + xfoldcnst(F,d,*,muld); + commute(l,r); + break; + case MUL+I: + commute(l,r); + xfoldcnst(I,i,*,muli); + if (l->op == CNST+I && r->op == ADD+I && r->kids[1]->op == CNST+I) + /* c1*(x + c2) => c1*x + c1*c2 */ + return simplify(ADD, ty, simplify(MUL, ty, l, r->kids[0]), + simplify(MUL, ty, l, r->kids[1])); + if (l->op == CNST+I && r->op == SUB+I && r->kids[1]->op == CNST+I) + /* c1*(x - c2) => c1*x - c1*c2 */ + return simplify(SUB, ty, simplify(MUL, ty, l, r->kids[0]), + simplify(MUL, ty, l, r->kids[1])); + if (l->op == CNST+I && l->u.v.i > 0 && (n = ispow2(l->u.v.i)) != 0) + /* 2^n * r => r<u.v.d)); + idempotent(NEG+F); + break; + case NEG+I: + if (l->op == CNST+I) { + if (needconst && l->u.v.i == ty->u.sym->u.limits.min.i) + warning("overflow in constant expression\n"); + if (needconst || l->u.v.i != ty->u.sym->u.limits.min.i) + return cnsttree(ty, -l->u.v.i); + } + idempotent(NEG+I); + break; + case NOT+I: + op = NOT; + ufoldcnst(I,cnsttree(ty, !l->u.v.i)); + break; + case RSH+I: + identity(r,l,I,i,0); + if (l->op == CNST+I && r->op == CNST+I + && r->u.v.i >= 0 && r->u.v.i < 8*l->type->size) { + long n = l->u.v.i>>r->u.v.i; + if (l->u.v.i < 0) + n |= ~0UL<<(8*l->type->size - r->u.v.i); + return cnsttree(ty, n); + } + if (r->op == CNST+I && (r->u.v.i >= 8*ty->size || r->u.v.i < 0)) { + warning("shifting an `%t' by %d bits is undefined\n", ty, r->u.v.i); + break; + } + + break; + case RSH+U: + identity(r,l,I,i,0); + sfoldcnst(>>); + if (r->op == CNST+I && (r->u.v.i >= 8*ty->size || r->u.v.i < 0)) { + warning("shifting an `%t' by %d bits is undefined\n", ty, r->u.v.i); + break; + } + + break; + case SUB+F: + xfoldcnst(F,d,-,subd); + break; + case SUB+I: + xfoldcnst(I,i,-,subi); + identity(r,l,I,i,0); + break; + case SUB+U: + foldcnst(U,u,-); + identity(r,l,U,u,0); + break; + case SUB+P: + if (l->op == CNST+P && r->op == CNST+P) + return cnsttree(ty, (long)((char *)l->u.v.p - (char *)r->u.v.p)); + if (r->op == CNST+I || r->op == CNST+U) + return simplify(ADD, ty, l, + cnsttree(inttype, r->op == CNST+I ? -r->u.v.i : -(long)r->u.v.u)); + if (isaddrop(l->op) && r->op == ADD+I && r->kids[1]->op == CNST+I) + /* l - (x + c) => l-c - x */ + return simplify(SUB, ty, + simplify(SUB, ty, l, r->kids[1]), r->kids[0]); + break; + default:assert(0); + } + return tree(op, ty, l, r); +} +/* ispow2 - if u > 1 && u == 2^n, return n, otherwise return 0 */ +int ispow2(unsigned long u) { + int n; + + if (u > 1 && (u&(u-1)) == 0) + for (n = 0; u; u >>= 1, n++) + if (u&1) + return n; + return 0; +} + diff --git a/quake3/source/lcc/src/sparc.md b/quake3/source/lcc/src/sparc.md new file mode 100644 index 0000000..aa17016 --- /dev/null +++ b/quake3/source/lcc/src/sparc.md @@ -0,0 +1,1163 @@ +%{ +#include "c.h" +#define NODEPTR_TYPE Node +#define OP_LABEL(p) ((p)->op) +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define STATE_LABEL(p) ((p)->x.state) +static void address(Symbol, Symbol, long); +static void blkfetch(int, int, int, int); +static void blkloop(int, int, int, int, int, int[]); +static void blkstore(int, int, int, int); +static void defaddress(Symbol); +static void defconst(int, int, Value); +static void defstring(int, char *); +static void defsymbol(Symbol); +static void doarg(Node); +static void emit2(Node); +static void export(Symbol); +static void clobber(Node); +static void function(Symbol, Symbol [], Symbol [], int); +static void global(Symbol); +static void import(Symbol); +static void local(Symbol); +static void progbeg(int, char **); +static void progend(void); +static void segment(int); +static void space(int); +static void target(Node); +static int imm(Node); +static void renameregs(void); +extern Interface sparcIR, solarisIR; +static void defsymbol2(Symbol); +static void export2(Symbol); +static void globalend(void); +static void global2(Symbol); +static void segment2(int); +static void progend2(void); + +extern char *stabprefix; +extern void stabblock(int, int, Symbol*); +extern void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *); +extern void stabfend(Symbol, int); +extern void stabinit(char *, int, char *[]); +extern void stabline(Coordinate *); +extern void stabsym(Symbol); +extern void stabtype(Symbol); +static Symbol greg[32], gregw; +static Symbol *oreg = &greg[8], *ireg = &greg[24]; +static Symbol freg[32], freg2[32]; +static Symbol fregw, freg2w; + +static int regvars; +static int retstruct; + +static int pflag = 0; + +static int cseg; + +%} +%start stmt +%term CNSTF4=4113 +%term CNSTF8=8209 +%term CNSTF16=16401 +%term CNSTI1=1045 +%term CNSTI2=2069 +%term CNSTI4=4117 +%term CNSTI8=8213 +%term CNSTP4=4119 +%term CNSTP8=8215 +%term CNSTU1=1046 +%term CNSTU2=2070 +%term CNSTU4=4118 +%term CNSTU8=8214 + +%term ARGB=41 +%term ARGF4=4129 +%term ARGF8=8225 +%term ARGF16=16417 +%term ARGI4=4133 +%term ARGI8=8229 +%term ARGP4=4135 +%term ARGP8=8231 +%term ARGU4=4134 +%term ARGU8=8230 + +%term ASGNB=57 +%term ASGNF4=4145 +%term ASGNF8=8241 +%term ASGNF16=16433 +%term ASGNI1=1077 +%term ASGNI2=2101 +%term ASGNI4=4149 +%term ASGNI8=8245 +%term ASGNP4=4151 +%term ASGNP8=8247 +%term ASGNU1=1078 +%term ASGNU2=2102 +%term ASGNU4=4150 +%term ASGNU8=8246 + +%term INDIRB=73 +%term INDIRF4=4161 +%term INDIRF8=8257 +%term INDIRF16=16449 +%term INDIRI1=1093 +%term INDIRI2=2117 +%term INDIRI4=4165 +%term INDIRI8=8261 +%term INDIRP4=4167 +%term INDIRP8=8263 +%term INDIRU1=1094 +%term INDIRU2=2118 +%term INDIRU4=4166 +%term INDIRU8=8262 + +%term CVFF4=4209 +%term CVFF8=8305 +%term CVFF16=16497 +%term CVFI4=4213 +%term CVFI8=8309 + +%term CVIF4=4225 +%term CVIF8=8321 +%term CVIF16=16513 +%term CVII1=1157 +%term CVII2=2181 +%term CVII4=4229 +%term CVII8=8325 +%term CVIU1=1158 +%term CVIU2=2182 +%term CVIU4=4230 +%term CVIU8=8326 + +%term CVPP4=4247 +%term CVPP8=8343 +%term CVPP16=16535 +%term CVPU4=4246 +%term CVPU8=8342 + +%term CVUI1=1205 +%term CVUI2=2229 +%term CVUI4=4277 +%term CVUI8=8373 +%term CVUP4=4279 +%term CVUP8=8375 +%term CVUP16=16567 +%term CVUU1=1206 +%term CVUU2=2230 +%term CVUU4=4278 +%term CVUU8=8374 + +%term NEGF4=4289 +%term NEGF8=8385 +%term NEGF16=16577 +%term NEGI4=4293 +%term NEGI8=8389 + +%term CALLB=217 +%term CALLF4=4305 +%term CALLF8=8401 +%term CALLF16=16593 +%term CALLI4=4309 +%term CALLI8=8405 +%term CALLP4=4311 +%term CALLP8=8407 +%term CALLU4=4310 +%term CALLU8=8406 +%term CALLV=216 + +%term RETF4=4337 +%term RETF8=8433 +%term RETF16=16625 +%term RETI4=4341 +%term RETI8=8437 +%term RETP4=4343 +%term RETP8=8439 +%term RETU4=4342 +%term RETU8=8438 +%term RETV=248 + +%term ADDRGP4=4359 +%term ADDRGP8=8455 + +%term ADDRFP4=4375 +%term ADDRFP8=8471 + +%term ADDRLP4=4391 +%term ADDRLP8=8487 + +%term ADDF4=4401 +%term ADDF8=8497 +%term ADDF16=16689 +%term ADDI4=4405 +%term ADDI8=8501 +%term ADDP4=4407 +%term ADDP8=8503 +%term ADDU4=4406 +%term ADDU8=8502 + +%term SUBF4=4417 +%term SUBF8=8513 +%term SUBF16=16705 +%term SUBI4=4421 +%term SUBI8=8517 +%term SUBP4=4423 +%term SUBP8=8519 +%term SUBU4=4422 +%term SUBU8=8518 + +%term LSHI4=4437 +%term LSHI8=8533 +%term LSHU4=4438 +%term LSHU8=8534 + +%term MODI4=4453 +%term MODI8=8549 +%term MODU4=4454 +%term MODU8=8550 + +%term RSHI4=4469 +%term RSHI8=8565 +%term RSHU4=4470 +%term RSHU8=8566 + +%term BANDI4=4485 +%term BANDI8=8581 +%term BANDU4=4486 +%term BANDU8=8582 + +%term BCOMI4=4501 +%term BCOMI8=8597 +%term BCOMU4=4502 +%term BCOMU8=8598 + +%term BORI4=4517 +%term BORI8=8613 +%term BORU4=4518 +%term BORU8=8614 + +%term BXORI4=4533 +%term BXORI8=8629 +%term BXORU4=4534 +%term BXORU8=8630 + +%term DIVF4=4545 +%term DIVF8=8641 +%term DIVF16=16833 +%term DIVI4=4549 +%term DIVI8=8645 +%term DIVU4=4550 +%term DIVU8=8646 + +%term MULF4=4561 +%term MULF8=8657 +%term MULF16=16849 +%term MULI4=4565 +%term MULI8=8661 +%term MULU4=4566 +%term MULU8=8662 + +%term EQF4=4577 +%term EQF8=8673 +%term EQF16=16865 +%term EQI4=4581 +%term EQI8=8677 +%term EQU4=4582 +%term EQU8=8678 + +%term GEF4=4593 +%term GEF8=8689 +%term GEI4=4597 +%term GEI8=8693 +%term GEI16=16885 +%term GEU4=4598 +%term GEU8=8694 + +%term GTF4=4609 +%term GTF8=8705 +%term GTF16=16897 +%term GTI4=4613 +%term GTI8=8709 +%term GTU4=4614 +%term GTU8=8710 + +%term LEF4=4625 +%term LEF8=8721 +%term LEF16=16913 +%term LEI4=4629 +%term LEI8=8725 +%term LEU4=4630 +%term LEU8=8726 + +%term LTF4=4641 +%term LTF8=8737 +%term LTF16=16929 +%term LTI4=4645 +%term LTI8=8741 +%term LTU4=4646 +%term LTU8=8742 + +%term NEF4=4657 +%term NEF8=8753 +%term NEF16=16945 +%term NEI4=4661 +%term NEI8=8757 +%term NEU4=4662 +%term NEU8=8758 + +%term JUMPV=584 + +%term LABELV=600 + +%term LOADB=233 +%term LOADF4=4321 +%term LOADF8=8417 +%term LOADF16=16609 +%term LOADI1=1253 +%term LOADI2=2277 +%term LOADI4=4325 +%term LOADI8=8421 +%term LOADP4=4327 +%term LOADP8=8423 +%term LOADU1=1254 +%term LOADU2=2278 +%term LOADU4=4326 +%term LOADU8=8422 + +%term VREGP=711 +%% +reg: INDIRI1(VREGP) "# read register\n" +reg: INDIRU1(VREGP) "# read register\n" + +reg: INDIRI2(VREGP) "# read register\n" +reg: INDIRU2(VREGP) "# read register\n" + +reg: INDIRF4(VREGP) "# read register\n" +reg: INDIRI4(VREGP) "# read register\n" +reg: INDIRP4(VREGP) "# read register\n" +reg: INDIRU4(VREGP) "# read register\n" + +reg: INDIRF8(VREGP) "# read register\n" +reg: INDIRI8(VREGP) "# read register\n" +reg: INDIRP8(VREGP) "# read register\n" +reg: INDIRU8(VREGP) "# read register\n" + +stmt: ASGNI1(VREGP,reg) "# write register\n" +stmt: ASGNU1(VREGP,reg) "# write register\n" + +stmt: ASGNI2(VREGP,reg) "# write register\n" +stmt: ASGNU2(VREGP,reg) "# write register\n" + +stmt: ASGNF4(VREGP,reg) "# write register\n" +stmt: ASGNI4(VREGP,reg) "# write register\n" +stmt: ASGNP4(VREGP,reg) "# write register\n" +stmt: ASGNU4(VREGP,reg) "# write register\n" + +stmt: ASGNF8(VREGP,reg) "# write register\n" +stmt: ASGNI8(VREGP,reg) "# write register\n" +stmt: ASGNP8(VREGP,reg) "# write register\n" +stmt: ASGNU8(VREGP,reg) "# write register\n" +con: CNSTI1 "%a" +con: CNSTU1 "%a" + +con: CNSTI2 "%a" +con: CNSTU2 "%a" + +con: CNSTI4 "%a" +con: CNSTU4 "%a" +con: CNSTP4 "%a" + +con: CNSTI8 "%a" +con: CNSTU8 "%a" +con: CNSTP8 "%a" +stmt: reg "" +reg: ADDRGP4 "set %a,%%%c\n" 1 +stk13: ADDRFP4 "%a" imm(a) +stk13: ADDRLP4 "%a" imm(a) +reg: stk13 "add %0,%%fp,%%%c\n" 1 +stk: ADDRFP4 "set %a,%%%c\n" 2 +stk: ADDRLP4 "set %a,%%%c\n" 2 +reg: ADDRFP4 "set %a,%%%c\nadd %%%c,%%fp,%%%c\n" 3 +reg: ADDRLP4 "set %a,%%%c\nadd %%%c,%%fp,%%%c\n" 3 +con13: CNSTI1 "%a" imm(a) +con13: CNSTI2 "%a" imm(a) +con13: CNSTI4 "%a" imm(a) +con13: CNSTU1 "%a" imm(a) +con13: CNSTU2 "%a" imm(a) +con13: CNSTU4 "%a" imm(a) +con13: CNSTP4 "%a" imm(a) +base: ADDI4(reg,con13) "%%%0+%1" +base: ADDP4(reg,con13) "%%%0+%1" +base: ADDU4(reg,con13) "%%%0+%1" +base: reg "%%%0" +base: con13 "%0" +base: stk13 "%%fp+%0" +addr: base "%0" +addr: ADDI4(reg,reg) "%%%0+%%%1" +addr: ADDP4(reg,reg) "%%%0+%%%1" +addr: ADDU4(reg,reg) "%%%0+%%%1" +addr: stk "%%fp+%%%0" +reg: INDIRI1(addr) "ldsb [%0],%%%c\n" 1 +reg: INDIRI2(addr) "ldsh [%0],%%%c\n" 1 +reg: INDIRI4(addr) "ld [%0],%%%c\n" 1 +reg: INDIRU1(addr) "ldub [%0],%%%c\n" 1 +reg: INDIRU2(addr) "lduh [%0],%%%c\n" 1 +reg: INDIRU4(addr) "ld [%0],%%%c\n" 1 +reg: INDIRP4(addr) "ld [%0],%%%c\n" 1 +reg: INDIRF4(addr) "ld [%0],%%f%c\n" 1 +stmt: ASGNI1(addr,reg) "stb %%%1,[%0]\n" 1 +stmt: ASGNI2(addr,reg) "sth %%%1,[%0]\n" 1 +stmt: ASGNI4(addr,reg) "st %%%1,[%0]\n" 1 +stmt: ASGNU1(addr,reg) "stb %%%1,[%0]\n" 1 +stmt: ASGNU2(addr,reg) "sth %%%1,[%0]\n" 1 +stmt: ASGNU4(addr,reg) "st %%%1,[%0]\n" 1 +stmt: ASGNP4(addr,reg) "st %%%1,[%0]\n" 1 +stmt: ASGNF4(addr,reg) "st %%f%1,[%0]\n" 1 +addrl: ADDRLP4 "%%%fp+%a" imm(a) + +reg: INDIRF8(addrl) "ldd [%0],%%f%c\n" 1 +stmt: ASGNF8(addrl,reg) "std %%f%1,[%0]\n" 1 +reg: INDIRF8(base) "ld2 [%0],%%f%c\n" 2 +stmt: ASGNF8(base,reg) "st2 %%f%1,[%0]\n" 2 +spill: ADDRLP4 "%a" !imm(a) + +stmt: ASGNI1(spill,reg) "set %0,%%g1\nstb %%%1,[%%fp+%%g1]\n" +stmt: ASGNI2(spill,reg) "set %0,%%g1\nsth %%%1,[%%fp+%%g1]\n" +stmt: ASGNI4(spill,reg) "set %0,%%g1\nst %%%1,[%%fp+%%g1]\n" +stmt: ASGNU1(spill,reg) "set %0,%%g1\nstb %%%1,[%%fp+%%g1]\n" +stmt: ASGNU2(spill,reg) "set %0,%%g1\nsth %%%1,[%%fp+%%g1]\n" +stmt: ASGNU4(spill,reg) "set %0,%%g1\nst %%%1,[%%fp+%%g1]\n" +stmt: ASGNP4(spill,reg) "set %0,%%g1\nst %%%1,[%%fp+%%g1]\n" +stmt: ASGNF4(spill,reg) "set %0,%%g1\nst %%f%1,[%%fp+%%g1]\n" +stmt: ASGNF8(spill,reg) "set %0,%%g1\nstd %%f%1,[%%fp+%%g1]\n" +reg: CVII4(INDIRI1(addr)) "ldsb [%0],%%%c\n" 1 +reg: CVII4(INDIRI2(addr)) "ldsh [%0],%%%c\n" 1 +reg: CVUU4(INDIRU1(addr)) "ldub [%0],%%%c\n" 1 +reg: CVUU4(INDIRU2(addr)) "lduh [%0],%%%c\n" 1 +reg: CVUI4(INDIRU1(addr)) "ldub [%0],%%%c\n" 1 +reg: CVUI4(INDIRU2(addr)) "lduh [%0],%%%c\n" 1 +reg: LOADI1(reg) "mov %%%0,%%%c\n" move(a) +reg: LOADI2(reg) "mov %%%0,%%%c\n" move(a) +reg: LOADI4(reg) "mov %%%0,%%%c\n" move(a) +reg: LOADP4(reg) "mov %%%0,%%%c\n" move(a) +reg: LOADU1(reg) "mov %%%0,%%%c\n" move(a) +reg: LOADU2(reg) "mov %%%0,%%%c\n" move(a) +reg: LOADU4(reg) "mov %%%0,%%%c\n" move(a) +reg: CNSTI1 "# reg\n" range(a, 0, 0) +reg: CNSTI2 "# reg\n" range(a, 0, 0) +reg: CNSTI4 "# reg\n" range(a, 0, 0) +reg: CNSTP4 "# reg\n" range(a, 0, 0) +reg: CNSTU1 "# reg\n" range(a, 0, 0) +reg: CNSTU2 "# reg\n" range(a, 0, 0) +reg: CNSTU4 "# reg\n" range(a, 0, 0) +reg: con "set %0,%%%c\n" 1 +rc: con13 "%0" +rc: reg "%%%0" +reg: ADDI4(reg,rc) "add %%%0,%1,%%%c\n" 1 +reg: ADDP4(reg,rc) "add %%%0,%1,%%%c\n" 1 +reg: ADDU4(reg,rc) "add %%%0,%1,%%%c\n" 1 +reg: BANDI4(reg,rc) "and %%%0,%1,%%%c\n" 1 +reg: BORI4(reg,rc) "or %%%0,%1,%%%c\n" 1 +reg: BXORI4(reg,rc) "xor %%%0,%1,%%%c\n" 1 +reg: BANDU4(reg,rc) "and %%%0,%1,%%%c\n" 1 +reg: BORU4(reg,rc) "or %%%0,%1,%%%c\n" 1 +reg: BXORU4(reg,rc) "xor %%%0,%1,%%%c\n" 1 +reg: SUBI4(reg,rc) "sub %%%0,%1,%%%c\n" 1 +reg: SUBP4(reg,rc) "sub %%%0,%1,%%%c\n" 1 +reg: SUBU4(reg,rc) "sub %%%0,%1,%%%c\n" 1 +rc5: CNSTI4 "%a" range(a, 0, 31) +rc5: reg "%%%0" +reg: LSHI4(reg,rc5) "sll %%%0,%1,%%%c\n" 1 +reg: LSHU4(reg,rc5) "sll %%%0,%1,%%%c\n" 1 +reg: RSHI4(reg,rc5) "sra %%%0,%1,%%%c\n" 1 +reg: RSHU4(reg,rc5) "srl %%%0,%1,%%%c\n" 1 +reg: BANDI4(reg,BCOMI4(rc)) "andn %%%0,%1,%%%c\n" 1 +reg: BORI4(reg,BCOMI4(rc)) "orn %%%0,%1,%%%c\n" 1 +reg: BXORI4(reg,BCOMI4(rc)) "xnor %%%0,%1,%%%c\n" 1 +reg: BANDU4(reg,BCOMU4(rc)) "andn %%%0,%1,%%%c\n" 1 +reg: BORU4(reg,BCOMU4(rc)) "orn %%%0,%1,%%%c\n" 1 +reg: BXORU4(reg,BCOMU4(rc)) "xnor %%%0,%1,%%%c\n" 1 +reg: NEGI4(reg) "neg %%%0,%%%c\n" 1 +reg: BCOMI4(reg) "not %%%0,%%%c\n" 1 +reg: BCOMU4(reg) "not %%%0,%%%c\n" 1 +reg: CVII4(reg) "sll %%%0,8*(4-%a),%%%c; sra %%%c,8*(4-%a),%%%c\n" 2 +reg: CVUU4(reg) "sll %%%0,8*(4-%a),%%%c; srl %%%c,8*(4-%a),%%%c\n" 2 +reg: CVUU4(reg) "and %%%0,0xff,%%%c\n" (a->syms[0]->u.c.v.i == 1 ? 1 : LBURG_MAX) +reg: CVUU4(reg) "set 0xffff,%%g1; and %%%0,%%g1,%%%c\n" 2 +reg: CVUI4(reg) "and %%%0,0xff,%%%c\n" (a->syms[0]->u.c.v.i == 1 ? 1 : LBURG_MAX) +reg: CVUI4(reg) "set 0xffff,%%g1; and %%%0,%%g1,%%%c\n" 2 +addrg: ADDRGP4 "%a" +stmt: JUMPV(addrg) "ba %0; nop\n" 2 +stmt: JUMPV(addr) "jmp %0; nop\n" 2 +stmt: LABELV "%a:\n" +stmt: EQI4(reg,rc) "cmp %%%0,%1; be %a; nop\n" 3 +stmt: EQU4(reg,rc) "cmp %%%0,%1; be %a; nop\n" 3 +stmt: GEI4(reg,rc) "cmp %%%0,%1; bge %a; nop\n" 3 +stmt: GEU4(reg,rc) "cmp %%%0,%1; bgeu %a; nop\n" 3 +stmt: GTI4(reg,rc) "cmp %%%0,%1; bg %a; nop\n" 3 +stmt: GTU4(reg,rc) "cmp %%%0,%1; bgu %a; nop\n" 3 +stmt: LEI4(reg,rc) "cmp %%%0,%1; ble %a; nop\n" 3 +stmt: LEU4(reg,rc) "cmp %%%0,%1; bleu %a; nop\n" 3 +stmt: LTI4(reg,rc) "cmp %%%0,%1; bl %a; nop\n" 3 +stmt: LTU4(reg,rc) "cmp %%%0,%1; blu %a; nop\n" 3 +stmt: NEI4(reg,rc) "cmp %%%0,%1; bne %a; nop\n" 3 +stmt: NEU4(reg,rc) "cmp %%%0,%1; bne %a; nop\n" 3 +call: ADDRGP4 "%a" +call: addr "%0" +reg: CALLF8(call) "call %0; nop\n" 2 +reg: CALLF4(call) "call %0; nop\n" 2 +reg: CALLI4(call) "call %0; nop\n" 2 +reg: CALLP4(call) "call %0; nop\n" 2 +reg: CALLU4(call) "call %0; nop\n" 2 +stmt: CALLV(call) "call %0; nop\n" 2 +stmt: CALLB(call,reg) "call %0; st %%%1,[%%sp+64]; unimp %b&0xfff\n" 3 + +stmt: RETF8(reg) "# ret\n" 1 +stmt: RETF4(reg) "# ret\n" 1 +stmt: RETI4(reg) "# ret\n" 1 +stmt: RETU4(reg) "# ret\n" 1 +stmt: RETP4(reg) "# ret\n" 1 +stmt: ARGI4(reg) "st %%%0,[%%sp+4*%c+68]\n" 1 +stmt: ARGU4(reg) "st %%%0,[%%sp+4*%c+68]\n" 1 +stmt: ARGP4(reg) "st %%%0,[%%sp+4*%c+68]\n" 1 +stmt: ARGF4(reg) "# ARGF4\n" 1 +stmt: ARGF8(reg) "# ARGF8\n" 1 + +reg: DIVI4(reg,rc) "sra %%%0,31,%%g1; wr %%g0,%%g1,%%y; nop; nop; nop; sdiv %%%0,%1,%%%c\n" 6 + +reg: DIVU4(reg,rc) "wr %%g0,%%g0,%%y; nop; nop; nop; udiv %%%0,%1,%%%c\n" 5 + +reg: MODI4(reg,rc) "sra %%%0,31,%%g1; wr %%g0,%%g1,%%y; nop; nop; nop; sdiv %%%0,%1,%%g1\n; smul %%g1,%1,%%g1; sub %%%0,%%g1,%%%c\n" 8 + + +reg: MODU4(reg,rc) "wr %%g0,%%g0,%%y; nop; nop; nop; udiv %%%0,%1,%%g1\n; umul %%g1,%1,%%g1; sub %%%0,%%g1,%%%c\n" 7 + + +reg: MULI4(rc,reg) "smul %%%1,%0,%%%c\n" 1 +reg: MULU4(rc,reg) "umul %%%1,%0,%%%c\n" 1 +reg: ADDF8(reg,reg) "faddd %%f%0,%%f%1,%%f%c\n" 1 +reg: ADDF4(reg,reg) "fadds %%f%0,%%f%1,%%f%c\n" 1 +reg: DIVF8(reg,reg) "fdivd %%f%0,%%f%1,%%f%c\n" 1 +reg: DIVF4(reg,reg) "fdivs %%f%0,%%f%1,%%f%c\n" 1 +reg: MULF8(reg,reg) "fmuld %%f%0,%%f%1,%%f%c\n" 1 +reg: MULF4(reg,reg) "fmuls %%f%0,%%f%1,%%f%c\n" 1 +reg: SUBF8(reg,reg) "fsubd %%f%0,%%f%1,%%f%c\n" 1 +reg: SUBF4(reg,reg) "fsubs %%f%0,%%f%1,%%f%c\n" 1 +reg: NEGF4(reg) "fnegs %%f%0,%%f%c\n" 1 +reg: LOADF4(reg) "fmovs %%f%0,%%f%c\n" 1 +reg: CVFF4(reg) "fdtos %%f%0,%%f%c\n" 1 +reg: CVFF8(reg) "fstod %%f%0,%%f%c\n" 1 +reg: CVFI4(reg) "fstoi %%f%0,%%f0; st %%f0,[%%sp+64]; ld [%%sp+64],%%%c\n" (a->syms[0]->u.c.v.i==4?3:LBURG_MAX) + +reg: CVFI4(reg) "fdtoi %%f%0,%%f0; st %%f0,[%%sp+64]; ld [%%sp+64],%%%c\n" (a->syms[0]->u.c.v.i==8?3:LBURG_MAX) + +reg: CVIF4(reg) "st %%%0,[%%sp+64]; ld [%%sp+64],%%f%c; fitos %%f%c,%%f%c\n" 3 + +reg: CVIF8(reg) "st %%%0,[%%sp+64]; ld [%%sp+64],%%f%c; fitod %%f%c,%%f%c\n" 3 + +rel: EQF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbue" +rel: EQF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbue" +rel: GEF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbuge" +rel: GEF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbuge" +rel: GTF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbug" +rel: GTF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbug" +rel: LEF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbule" +rel: LEF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbule" +rel: LTF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbul" +rel: LTF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbul" +rel: NEF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbne" +rel: NEF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbne" + +stmt: rel "%0 %a; nop\n" 4 +reg: LOADF8(reg) "# LOADD\n" 2 + +reg: NEGF8(reg) "# NEGD\n" 2 + +stmt: ASGNB(reg,INDIRB(reg)) "# ASGNB\n" + +%% +static void progend(void){} +static void progbeg(int argc, char *argv[]) { + int i; + + { + union { + char c; + int i; + } u; + u.i = 0; + u.c = 1; + swap = ((int)(u.i == 1)) != IR->little_endian; + } + parseflags(argc, argv); + for (i = 0; i < argc; i++) + if (strcmp(argv[i], "-p") == 0 || strcmp(argv[i], "-pg") == 0) + pflag = 1; + if (IR == &solarisIR) + stabprefix = ".LL"; + else + stabprefix = "L"; + for (i = 0; i < 8; i++) { + greg[i + 0] = mkreg(stringf("g%d", i), i + 0, 1, IREG); + greg[i + 8] = mkreg(stringf("o%d", i), i + 8, 1, IREG); + greg[i + 16] = mkreg(stringf("l%d", i), i + 16, 1, IREG); + greg[i + 24] = mkreg(stringf("i%d", i), i + 24, 1, IREG); + } + gregw = mkwildcard(greg); + for (i = 0; i < 32; i++) + freg[i] = mkreg("%d", i, 1, FREG); + for (i = 0; i < 31; i += 2) + freg2[i] = mkreg("%d", i, 3, FREG); + fregw = mkwildcard(freg); + freg2w = mkwildcard(freg2); + tmask[IREG] = 0x3fff3e00; + vmask[IREG] = 0x3ff00000; + tmask[FREG] = ~(unsigned)0; + vmask[FREG] = 0; +} +static Symbol rmap(int opk) { + switch (optype(opk)) { + case I: case U: case P: case B: + return gregw; + case F: + return opsize(opk) == 4 ? fregw : freg2w; + default: + return 0; + } +} +static void target(Node p) { + assert(p); + switch (specific(p->op)) { + case CNST+I: case CNST+U: case CNST+P: + if (range(p, 0, 0) == 0) { + setreg(p, greg[0]); + p->x.registered = 1; + } + break; + case CALL+B: + assert(p->syms[1] && p->syms[1]->type && isfunc(p->syms[1]->type)); + p->syms[1] = intconst(freturn(p->syms[1]->type)->size); + break; + case CALL+F: setreg(p, opsize(p->op)==4?freg[0]:freg2[0]); break; + case CALL+I: case CALL+P: case CALL+U: + case CALL+V: setreg(p, oreg[0]); break; + case RET+F: rtarget(p, 0, opsize(p->op)==4?freg[0]:freg2[0]); break; + case RET+I: case RET+P: case RET+U: + rtarget(p, 0, ireg[0]); + p->kids[0]->x.registered = 1; + break; + case ARG+I: case ARG+P: case ARG+U: + if (p->syms[RX]->u.c.v.i < 6) { + rtarget(p, 0, oreg[p->syms[RX]->u.c.v.i]); + p->op = LOAD+opkind(p->op); + setreg(p, oreg[p->syms[RX]->u.c.v.i]); + } + break; + } +} +static void clobber(Node p) { + assert(p); + switch (specific(p->op)) { + case CALL+B: case CALL+F: case CALL+I: + spill(~(unsigned)3, FREG, p); + break; + case CALL+V: + spill(oreg[0]->x.regnode->mask, IREG, p); + spill(~(unsigned)3, FREG, p); + break; + case ARG+F: + if (opsize(p->op) == 4 && p->syms[2]->u.c.v.i <= 6) + spill((1<<(p->syms[2]->u.c.v.i + 8)), IREG, p); + else if (opsize(p->op) == 8 && p->syms[2]->u.c.v.i <= 5) + spill((3<<(p->syms[2]->u.c.v.i + 8))&0xff00, IREG, p); + break; + } +} +static int imm(Node p) { + return range(p, -4096, 4091); +} +static void doarg(Node p) { + assert(p && p->syms[0] && p->op != ARG+B); + p->syms[RX] = intconst(mkactual(4, + p->syms[0]->u.c.v.i)/4); +} +static void emit2(Node p) { + switch (p->op) { + case ARG+F+sizeop(4): { + int n = p->syms[RX]->u.c.v.i; + print("st %%f%d,[%%sp+4*%d+68]\n", + getregnum(p->x.kids[0]), n); + if (n <= 5) + print("ld [%%sp+4*%d+68],%%o%d\n", n, n); + break; + } + case ARG+F+sizeop(8): { + int n = p->syms[RX]->u.c.v.i; + int src = getregnum(p->x.kids[0]); + print("st %%f%d,[%%sp+4*%d+68]\n", src, n); + print("st %%f%d,[%%sp+4*%d+68]\n", src+1, n+1); + if (n <= 5) + print("ld [%%sp+4*%d+68],%%o%d\n", n, n); + if (n <= 4) + print("ld [%%sp+4*%d+68],%%o%d\n", n+1, n+1); + break; + } + case LOAD+F+sizeop(8): { + int dst = getregnum(p); + int src = getregnum(p->x.kids[0]); + print("fmovs %%f%d,%%f%d; ", src, dst); + print("fmovs %%f%d,%%f%d\n", src+1, dst+1); + break; + } + case NEG+F+sizeop(8): { + int dst = getregnum(p); + int src = getregnum(p->x.kids[0]); + print("fnegs %%f%d,%%f%d; ", src, dst); + print("fmovs %%f%d,%%f%d\n", src+1, dst+1); + break; + } + case ASGN+B: { + static int tmpregs[] = { 1, 2, 3 }; + dalign = salign = p->syms[1]->u.c.v.i; + blkcopy(getregnum(p->x.kids[0]), 0, + getregnum(p->x.kids[1]), 0, + p->syms[0]->u.c.v.i, tmpregs); + break; + } + } +} +static void local(Symbol p) { + if (retstruct) { + assert(p == retv); + p->x.name = stringd(4*16); + p->x.offset = 4*16; + p->sclass = AUTO; + retstruct = 0; + return; + } + if (isscalar(p->type) && !p->addressed && !isfloat(p->type)) + p->sclass = REGISTER; + if (askregvar(p, rmap(ttob(p->type))) == 0) + mkauto(p); + else if (p->scope > LOCAL) + regvars++; +} +static void function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { + int autos = 0, i, leaf, reg, varargs; + + if (IR == &solarisIR) + globalend(); + regvars = 0; + for (i = 0; callee[i]; i++) + ; + varargs = variadic(f->type) + || i > 0 && strcmp(callee[i-1]->name, + "__builtin_va_alist") == 0; + usedmask[0] = usedmask[1] = 0; + freemask[0] = freemask[1] = ~(unsigned)0; + for (i = 0; i < 8; i++) + ireg[i]->x.regnode->vbl = NULL; + offset = 68; + maxargoffset = 24; + reg = 0; + for (i = 0; callee[i]; i++) { + Symbol p = callee[i], q = caller[i]; + int size = roundup(q->type->size, 4); + assert(q); + if (isfloat(p->type) || reg >= 6) { + p->x.offset = q->x.offset = offset; + p->x.name = q->x.name = stringd(offset); + p->sclass = q->sclass = AUTO; + autos++; + } + else if (p->addressed || varargs) { + p->x.offset = offset; + p->x.name = stringd(p->x.offset); + p->sclass = AUTO; + q->sclass = REGISTER; + askregvar(q, ireg[reg]); + assert(q->x.regnode); + autos++; + } + else { + p->sclass = q->sclass = REGISTER; + askregvar(p, ireg[reg]); + assert(p->x.regnode); + q->x.name = p->x.name; + } + offset += size; + reg += isstruct(p->type) ? 1 : size/4; + } + assert(caller[i] == 0); + offset = maxoffset = 0; + retstruct = isstruct(freturn(f->type)); + gencode(caller, callee); + maxargoffset = roundup(maxargoffset, 4); + framesize = roundup(maxoffset + maxargoffset + 4*(16+1), 8); + assert(!varargs || autos); + leaf = (!ncalls + && !maxoffset && !autos && !regvars + && !isstruct(freturn(f->type)) + && !(usedmask[IREG]&0x00ffff01) + && !(usedmask[FREG]&~(unsigned)3) + && !pflag && !glevel); + print(".align 4\n%s:\n", f->x.name); + if (leaf) { + for (i = 0; caller[i] && callee[i]; i++) { + Symbol p = caller[i], q = callee[i]; + if (p->sclass == REGISTER && q->sclass == REGISTER) { + assert(q->x.regnode); + assert(q->x.regnode->set == IREG); + assert(q->x.regnode->number >= 24); + assert(q->x.regnode->number <= 31); + p->x.name = greg[q->x.regnode->number - 16]->x.name; + } + } + renameregs(); + } else if (framesize <= 4095) + print("save %%sp,%d,%%sp\n", -framesize); + else + print("set %d,%%g1; save %%sp,%%g1,%%sp\n", -framesize); + if (varargs) + for (; reg < 6; reg++) + print("st %%i%d,[%%fp+%d]\n", reg, 4*reg + 68); + else { + offset = 4*(16 + 1); + reg = 0; + for (i = 0; caller[i]; i++) { + Symbol p = caller[i]; + if (isfloat(p->type) && p->type->size == 8 && reg <= 4) { + print("st %%r%d,[%%fp+%d]\n", + ireg[reg++]->x.regnode->number, offset); + print("st %%r%d,[%%fp+%d]\n", + ireg[reg++]->x.regnode->number, offset + 4); + } else if (isfloat(p->type) && p->type->size == 4 && reg <= 5) + print("st %%r%d,[%%fp+%d]\n", + ireg[reg++]->x.regnode->number, offset); + else + reg++; + offset += roundup(p->type->size, 4); + } + } + if (pflag) { + int lab = genlabel(1); + print("set L%d,%%o0; call mcount; nop\n", lab); + print(".seg \"data\"\n.align 4; L%d:.word 0\n.seg \"text\"\n", lab); + } + emitcode(); + if (isstruct(freturn(f->type))) + print("jmp %%i7+12; restore\n"); + else if (!leaf) + print("ret; restore\n"); + else { + renameregs(); + print("retl; nop\n"); + } + if (IR == &solarisIR) { + print(".type %s,#function\n", f->x.name); + print(".size %s,.-%s\n", f->x.name, f->x.name); + } +} +#define exch(x, y, t) (((t) = x), ((x) = (y)), ((y) = (t))) + +static void renameregs(void) { + int i; + + for (i = 0; i < 8; i++) { + char *ptmp; + int itmp; + if (ireg[i]->x.regnode->vbl) + ireg[i]->x.regnode->vbl->x.name = oreg[i]->x.name; + exch(ireg[i]->x.name, oreg[i]->x.name, ptmp); + exch(ireg[i]->x.regnode->number, + oreg[i]->x.regnode->number, itmp); + } +} +static void defconst(int suffix, int size, Value v) { + if (suffix == F && size == 4) { + float f = v.d; + print(".word 0x%x\n", *(unsigned *)&f); + } else if (suffix == F && size == 8) { + double d = v.d; + unsigned *p = (unsigned *)&d; + print(".word 0x%x\n.word 0x%x\n", p[swap], p[!swap]); + } else if (suffix == P) + print(".word 0x%x\n", v.p); + else if (size == 1) + print(".byte 0x%x\n", suffix == I ? v.i : v.u); + else if (size == 2) + print(".half 0x%x\n", suffix == I ? v.i : v.u); + else if (size == 4) + print(".word 0x%x\n", suffix == I ? v.i : v.u); + else assert(0); +} + +static void defaddress(Symbol p) { + print(".word %s\n", p->x.name); +} + +static void defstring(int n, char *str) { + char *s; + + for (s = str; s < str + n; s++) + print(".byte %d\n", (*s)&0377); +} + +static void address(Symbol q, Symbol p, long n) { + if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN) + q->x.name = stringf("%s%s%D", p->x.name, n >= 0 ? "+" : "", n); + else { + assert(n <= INT_MAX && n >= INT_MIN); + q->x.offset = p->x.offset + n; + q->x.name = stringd(q->x.offset); + } +} +static void export(Symbol p) { + print(".global %s\n", p->x.name); +} +static void import(Symbol p) {} +static void defsymbol(Symbol p) { + if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf("%d", genlabel(1)); + else + assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)), + p->x.name = p->name; + if (p->scope >= LABELS) + p->x.name = stringf(p->generated ? "L%s" : "_%s", + p->x.name); +} +static void segment(int n) { + cseg = n; + switch (n) { + case CODE: print(".seg \"text\"\n"); break; + case BSS: print(".seg \"bss\"\n"); break; + case DATA: print(".seg \"data\"\n"); break; + case LIT: print(".seg \"text\"\n"); break; + } +} +static void space(int n) { + if (cseg != BSS) + print(".skip %d\n", n); +} +static void global(Symbol p) { + print(".align %d\n", p->type->align); + assert(p->u.seg); + if (p->u.seg == BSS + && (p->sclass == STATIC || Aflag >= 2)) + print(".reserve %s,%d\n", p->x.name, p->type->size); + else if (p->u.seg == BSS) + print(".common %s,%d\n", p->x.name, p->type->size); + else + print("%s:\n", p->x.name); +} +static void blkfetch(int k, int off, int reg, int tmp) { + assert(k == 1 || k == 2 || k == 4); + assert(salign >= k); + if (k == 1) + print("ldub [%%r%d+%d],%%r%d\n", reg, off, tmp); + else if (k == 2) + print("lduh [%%r%d+%d],%%r%d\n", reg, off, tmp); + else + print("ld [%%r%d+%d],%%r%d\n", reg, off, tmp); +} +static void blkstore(int k, int off, int reg, int tmp) { + assert(k == 1 || k == 2 || k == 4); + assert(dalign >= k); + if (k == 1) + print("stb %%r%d,[%%r%d+%d]\n", tmp, reg, off); + else if (k == 2) + print("sth %%r%d,[%%r%d+%d]\n", tmp, reg, off); + else + print("st %%r%d,[%%r%d+%d]\n", tmp, reg, off); +} +static void blkloop(int dreg, int doff, int sreg, int soff, int size, int tmps[]) { + if ((size&~7) < 4096) { + print("add %%r%d,%d,%%r%d\n", sreg, size&~7, sreg); + print("add %%r%d,%d,%%r%d\n", dreg, size&~7, tmps[2]); + } else { + print("set %d,%%r%d\n", size&~7, tmps[2]); + print("add %%r%d,%%r%d,%%r%d\n", sreg, tmps[2], sreg); + print("add %%r%d,%%r%d,%%r%d\n", dreg, tmps[2], tmps[2]); + } + blkcopy(tmps[2], doff, sreg, soff, size&7, tmps); + print("1: dec 8,%%r%d\n", tmps[2]); + blkcopy(tmps[2], doff, sreg, soff - 8, 8, tmps); + print("cmp %%r%d,%%r%d; ", tmps[2], dreg); + print("bgt 1b; "); + print("dec 8,%%r%d\n", sreg); +} +static void defsymbol2(Symbol p) { + if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf(".%d", genlabel(1)); + else + assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)), + p->x.name = p->name; + if (p->scope >= LABELS) + p->x.name = stringf(p->generated ? ".L%s" : "%s", + p->x.name); +} + +static Symbol prevg; + +static void globalend(void) { + if (prevg && prevg->type->size > 0) + print(".size %s,%d\n", prevg->x.name, prevg->type->size); + prevg = NULL; +} + +static void export2(Symbol p) { + globalend(); + print(".global %s\n", p->x.name); +} + +static void progend2(void) { + globalend(); +} + +static void global2(Symbol p) { + globalend(); + assert(p->u.seg); + if (!p->generated) { + print(".type %s,#%s\n", p->x.name, + isfunc(p->type) ? "function" : "object"); + if (p->type->size > 0) + print(".size %s,%d\n", p->x.name, p->type->size); + else + prevg = p; + } + if (p->u.seg == BSS && p->sclass == STATIC) + print(".local %s\n.common %s,%d,%d\n", p->x.name, p->x.name, + p->type->size, p->type->align); + else if (p->u.seg == BSS && Aflag >= 2) + print(".align %d\n%s:.skip %d\n", p->type->align, p->x.name, + p->type->size); + else if (p->u.seg == BSS) + print(".common %s,%d,%d\n", p->x.name, p->type->size, p->type->align); + else + print(".align %d\n%s:\n", p->type->align, p->x.name); +} + +static void segment2(int n) { + cseg = n; + switch (n) { + case CODE: print(".section \".text\"\n"); break; + case BSS: print(".section \".bss\"\n"); break; + case DATA: print(".section \".data\"\n"); break; + case LIT: print(".section \".rodata\"\n"); break; + } +} +Interface sparcIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 4, 4, 0, /* T * */ + 0, 1, 0, /* struct */ + 0, /* little_endian */ + 0, /* mulops_calls */ + 1, /* wants_callb */ + 0, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + address, + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol, + emit, + export, + function, + gen, + global, + import, + local, + progbeg, + progend, + segment, + space, + stabblock, 0, 0, stabinit, stabline, stabsym, stabtype, + { + 1, /* max_unaligned_load */ + rmap, + blkfetch, blkstore, blkloop, + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + doarg, + target, + clobber, + + } +}; + +Interface solarisIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 4, 4, 0, /* T * */ + 0, 1, 0, /* struct */ + 0, /* little_endian */ + 0, /* mulops_calls */ + 1, /* wants_callb */ + 0, /* wants_argb */ + 1, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + address, + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol2, + emit, + export2, + function, + gen, + global2, + import, + local, + progbeg, + progend2, + segment2, + space, + stabblock, 0, 0, stabinit, stabline, stabsym, stabtype, + { + 1, /* max_unaligned_load */ + rmap, + blkfetch, blkstore, blkloop, + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + doarg, + target, + clobber, + + } +}; +static char rcsid[] = "$Id: sparc.md,v 1.1.1.1 2001/10/17 21:53:37 timo Exp $"; diff --git a/quake3/source/lcc/src/stab.c b/quake3/source/lcc/src/stab.c new file mode 100644 index 0000000..152b778 --- /dev/null +++ b/quake3/source/lcc/src/stab.c @@ -0,0 +1,330 @@ +#include +#include +#include "c.h" +#include "stab.h" + + +static char *currentfile; /* current file name */ +static int ntypes; + +extern Interface sparcIR; + +char *stabprefix = "L"; + +extern char *stabprefix; +extern void stabblock(int, int, Symbol*); +extern void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *); +extern void stabfend(Symbol, int); +extern void stabinit(char *, int, char *[]); +extern void stabline(Coordinate *); +extern void stabsym(Symbol); +extern void stabtype(Symbol); + +static void asgncode(Type, int); +static void dbxout(Type); +static int dbxtype(Type); +static int emittype(Type, int, int); + +/* asgncode - assign type code to ty */ +static void asgncode(Type ty, int lev) { + if (ty->x.marked || ty->x.typeno) + return; + ty->x.marked = 1; + switch (ty->op) { + case VOLATILE: case CONST: case VOLATILE+CONST: + asgncode(ty->type, lev); + ty->x.typeno = ty->type->x.typeno; + break; + case POINTER: case FUNCTION: case ARRAY: + asgncode(ty->type, lev + 1); + /* fall thru */ + case VOID: case INT: case UNSIGNED: case FLOAT: + break; + case STRUCT: case UNION: { + Field p; + for (p = fieldlist(ty); p; p = p->link) + asgncode(p->type, lev + 1); + /* fall thru */ + case ENUM: + if (ty->x.typeno == 0) + ty->x.typeno = ++ntypes; + if (lev > 0 && (*ty->u.sym->name < '0' || *ty->u.sym->name > '9')) + dbxout(ty); + break; + } + default: + assert(0); + } +} + +/* dbxout - output .stabs entry for type ty */ +static void dbxout(Type ty) { + ty = unqual(ty); + if (!ty->x.printed) { + int col = 0; + print(".stabs \""), col += 8; + if (ty->u.sym && !(isfunc(ty) || isarray(ty) || isptr(ty))) + print("%s", ty->u.sym->name), col += strlen(ty->u.sym->name); + print(":%c", isstruct(ty) || isenum(ty) ? 'T' : 't'), col += 2; + emittype(ty, 0, col); + print("\",%d,0,0,0\n", N_LSYM); + } +} + +/* dbxtype - emit a stabs entry for type ty, return type code */ +static int dbxtype(Type ty) { + asgncode(ty, 0); + dbxout(ty); + return ty->x.typeno; +} + +/* + * emittype - emit ty's type number, emitting its definition if necessary. + * Returns the output column number after emission; col is the approximate + * output column before emission and is used to emit continuation lines for long + * struct, union, and enum types. Continuations are not emitted for other types, + * even if the definition is long. lev is the depth of calls to emittype. + */ +static int emittype(Type ty, int lev, int col) { + int tc = ty->x.typeno; + + if (isconst(ty) || isvolatile(ty)) { + col = emittype(ty->type, lev, col); + ty->x.typeno = ty->type->x.typeno; + ty->x.printed = 1; + return col; + } + if (tc == 0) { + ty->x.typeno = tc = ++ntypes; +/* fprint(2,"`%t'=%d\n", ty, tc); */ + } + print("%d", tc), col += 3; + if (ty->x.printed) + return col; + ty->x.printed = 1; + switch (ty->op) { + case VOID: /* void is defined as itself */ + print("=%d", tc), col += 1+3; + break; + case INT: + if (ty == chartype) /* plain char is a subrange of itself */ + print("=r%d;%d;%d;", tc, ty->u.sym->u.limits.min.i, ty->u.sym->u.limits.max.i), + col += 2+3+2*2.408*ty->size+2; + else /* other signed ints are subranges of int */ + print("=r1;%D;%D;", ty->u.sym->u.limits.min.i, ty->u.sym->u.limits.max.i), + col += 4+2*2.408*ty->size+2; + break; + case UNSIGNED: + if (ty == chartype) /* plain char is a subrange of itself */ + print("=r%d;0;%u;", tc, ty->u.sym->u.limits.max.i), + col += 2+3+2+2.408*ty->size+1; + else /* other signed ints are subranges of int */ + print("=r1;0;%U;", ty->u.sym->u.limits.max.i), + col += 4+2.408*ty->size+1; + break; + case FLOAT: /* float, double, long double get sizes, not ranges */ + print("=r1;%d;0;", ty->size), col += 4+1+3; + break; + case POINTER: + print("=*"), col += 2; + col = emittype(ty->type, lev + 1, col); + break; + case FUNCTION: + print("=f"), col += 2; + col = emittype(ty->type, lev + 1, col); + break; + case ARRAY: /* array includes subscript as an int range */ + if (ty->size && ty->type->size) + print("=ar1;0;%d;", ty->size/ty->type->size - 1), col += 7+3+1; + else + print("=ar1;0;-1;"), col += 10; + col = emittype(ty->type, lev + 1, col); + break; + case STRUCT: case UNION: { + Field p; + if (!ty->u.sym->defined) { + print("=x%c%s:", ty->op == STRUCT ? 's' : 'u', ty->u.sym->name); + col += 2+1+strlen(ty->u.sym->name)+1; + break; + } + if (lev > 0 && (*ty->u.sym->name < '0' || *ty->u.sym->name > '9')) { + ty->x.printed = 0; + break; + } + print("=%c%d", ty->op == STRUCT ? 's' : 'u', ty->size), col += 1+1+3; + for (p = fieldlist(ty); p; p = p->link) { + if (p->name) + print("%s:", p->name), col += strlen(p->name)+1; + else + print(":"), col += 1; + col = emittype(p->type, lev + 1, col); + if (p->lsb) + print(",%d,%d;", 8*p->offset + + (IR->little_endian ? fieldright(p) : fieldleft(p)), + fieldsize(p)); + else + print(",%d,%d;", 8*p->offset, 8*p->type->size); + col += 1+3+1+3+1; /* accounts for ,%d,%d; */ + if (col >= 80 && p->link) { + print("\\\\\",%d,0,0,0\n.stabs \"", N_LSYM); + col = 8; + } + } + print(";"), col += 1; + break; + } + case ENUM: { + Symbol *p; + if (lev > 0 && (*ty->u.sym->name < '0' || *ty->u.sym->name > '9')) { + ty->x.printed = 0; + break; + } + print("=e"), col += 2; + for (p = ty->u.sym->u.idlist; *p; p++) { + print("%s:%d,", (*p)->name, (*p)->u.value), col += strlen((*p)->name)+3; + if (col >= 80 && p[1]) { + print("\\\\\",%d,0,0,0\n.stabs \"", N_LSYM); + col = 8; + } + } + print(";"), col += 1; + break; + } + default: + assert(0); + } + return col; +} + +/* stabblock - output a stab entry for '{' or '}' at level lev */ +void stabblock(int brace, int lev, Symbol *p) { + if (brace == '{') + while (*p) + stabsym(*p++); + if (IR == &sparcIR) + print(".stabd 0x%x,0,%d\n", brace == '{' ? N_LBRAC : N_RBRAC, lev); + else { + int lab = genlabel(1); + print(".stabn 0x%x,0,%d,%s%d-%s\n", brace == '{' ? N_LBRAC : N_RBRAC, lev, + stabprefix, lab, cfunc->x.name); + print("%s%d:\n", stabprefix, lab); + } +} + +/* stabinit - initialize stab output */ +void stabinit(char *file, int argc, char *argv[]) { + typedef void (*Closure)(Symbol, void *); + extern char *getcwd(char *, size_t); + + print(".stabs \"lcc4_compiled.\",0x%x,0,0,0\n", N_OPT); + if (file && *file) { + char buf[1024], *cwd = getcwd(buf, sizeof buf); + if (cwd) + print(".stabs \"%s/\",0x%x,0,3,%stext0\n", cwd, N_SO, stabprefix); + print(".stabs \"%s\",0x%x,0,3,%stext0\n", file, N_SO, stabprefix); + (*IR->segment)(CODE); + print("%stext0:\n", stabprefix, N_SO); + currentfile = file; + } + dbxtype(inttype); + dbxtype(chartype); + dbxtype(doubletype); + dbxtype(floattype); + dbxtype(longdouble); + dbxtype(longtype); + dbxtype(longlong); + dbxtype(shorttype); + dbxtype(signedchar); + dbxtype(unsignedchar); + dbxtype(unsignedlong); + dbxtype(unsignedlonglong); + dbxtype(unsignedshort); + dbxtype(unsignedtype); + dbxtype(voidtype); + foreach(types, GLOBAL, (Closure)stabtype, NULL); +} + +/* stabline - emit stab entry for source coordinate *cp */ +void stabline(Coordinate *cp) { + if (cp->file && cp->file != currentfile) { + int lab = genlabel(1); + print(".stabs \"%s\",0x%x,0,0,%s%d\n", cp->file, N_SOL, stabprefix, lab); + print("%s%d:\n", stabprefix, lab); + currentfile = cp->file; + } + if (IR == &sparcIR) + print(".stabd 0x%x,0,%d\n", N_SLINE, cp->y); + else { + int lab = genlabel(1); + print(".stabn 0x%x,0,%d,%s%d-%s\n", N_SLINE, cp->y, + stabprefix, lab, cfunc->x.name); + print("%s%d:\n", stabprefix, lab); + } +} + +/* stabsym - output a stab entry for symbol p */ +void stabsym(Symbol p) { + int code, tc, sz = p->type->size; + + if (p->generated || p->computed) + return; + if (isfunc(p->type)) { + print(".stabs \"%s:%c%d\",%d,0,0,%s\n", p->name, + p->sclass == STATIC ? 'f' : 'F', dbxtype(freturn(p->type)), + N_FUN, p->x.name); + return; + } + if (!IR->wants_argb && p->scope == PARAM && p->structarg) { + assert(isptr(p->type) && isstruct(p->type->type)); + tc = dbxtype(p->type->type); + sz = p->type->type->size; + } else + tc = dbxtype(p->type); + if (p->sclass == AUTO && p->scope == GLOBAL || p->sclass == EXTERN) { + print(".stabs \"%s:G", p->name); + code = N_GSYM; + } else if (p->sclass == STATIC) { + print(".stabs \"%s:%c%d\",%d,0,0,%s\n", p->name, p->scope == GLOBAL ? 'S' : 'V', + tc, p->u.seg == BSS ? N_LCSYM : N_STSYM, p->x.name); + return; + } else if (p->sclass == REGISTER) { + if (p->x.regnode) { + int r = p->x.regnode->number; + if (p->x.regnode->set == FREG) + r += 32; /* floating point */ + print(".stabs \"%s:%c%d\",%d,0,", p->name, + p->scope == PARAM ? 'P' : 'r', tc, N_RSYM); + print("%d,%d\n", sz, r); + } + return; + } else if (p->scope == PARAM) { + print(".stabs \"%s:p", p->name); + code = N_PSYM; + } else if (p->scope >= LOCAL) { + print(".stabs \"%s:", p->name); + code = N_LSYM; + } else + assert(0); + print("%d\",%d,0,0,%s\n", tc, code, + p->scope >= PARAM && p->sclass != EXTERN ? p->x.name : "0"); +} + +/* stabtype - output a stab entry for type *p */ +void stabtype(Symbol p) { + if (p->type) { + if (p->sclass == 0) + dbxtype(p->type); + else if (p->sclass == TYPEDEF) + print(".stabs \"%s:t%d\",%d,0,0,0\n", p->name, dbxtype(p->type), N_LSYM); + } +} + +/* stabend - finalize a function */ +void stabfend(Symbol p, int lineno) {} + +/* stabend - finalize stab output */ +void stabend(Coordinate *cp, Symbol p, Coordinate **cpp, Symbol *sp, Symbol *stab) { + (*IR->segment)(CODE); + print(".stabs \"\", %d, 0, 0,%setext\n", N_SO, stabprefix); + print("%setext:\n", stabprefix); +} diff --git a/quake3/source/lcc/src/stab.h b/quake3/source/lcc/src/stab.h new file mode 100644 index 0000000..bfb7ebf --- /dev/null +++ b/quake3/source/lcc/src/stab.h @@ -0,0 +1,113 @@ +/* @(#)stab.h 1.11 92/05/11 SMI */ +/* + * Copyright (c) 1990 by Sun Microsystems, Inc. + */ + +/* + * This file gives definitions supplementing + * for permanent symbol table entries. + * These must have one of the N_STAB bits on, + * and are subject to relocation according to the masks in . + */ + +#ifndef _STAB_H +#define _STAB_H + + +#if !defined(_a_out_h) && !defined(_A_OUT_H) +/* this file contains fragments of a.out.h and stab.h relevant to + * support of stabX processing within ELF files - see the + * Format of a symbol table entry + */ +struct nlist { + union { + char *n_name; /* for use when in-core */ + long n_strx; /* index into file string table */ + } n_un; + unsigned char n_type; /* type flag (N_TEXT,..) */ + char n_other; /* unused */ + short n_desc; /* see */ + unsigned long n_value; /* value of symbol (or sdb offset) */ +}; + +/* + * Simple values for n_type. + */ +#define N_UNDF 0x0 /* undefined */ +#define N_ABS 0x2 /* absolute */ +#define N_TEXT 0x4 /* text */ +#define N_DATA 0x6 /* data */ +#define N_BSS 0x8 /* bss */ +#define N_COMM 0x12 /* common (internal to ld) */ +#define N_FN 0x1f /* file name symbol */ + +#define N_EXT 01 /* external bit, or'ed in */ +#define N_TYPE 0x1e /* mask for all the type bits */ + +#endif + +/* + * for symbolic debugger, sdb(1): + */ +#define N_GSYM 0x20 /* global symbol: name,,0,type,0 */ +#define N_FNAME 0x22 /* procedure name (f77 kludge): name,,0 */ +#define N_FUN 0x24 /* procedure: name,,0,linenumber,address */ +#define N_STSYM 0x26 /* static symbol: name,,0,type,address */ +#define N_LCSYM 0x28 /* .lcomm symbol: name,,0,type,address */ +#define N_MAIN 0x2a /* name of main routine : name,,0,0,0 */ +#define N_ROSYM 0x2c /* ro_data objects */ +#define N_OBJ 0x38 /* object file path or name */ +#define N_OPT 0x3c /* compiler options */ +#define N_RSYM 0x40 /* register sym: name,,0,type,register */ +#define N_SLINE 0x44 /* src line: 0,,0,linenumber,address */ +#define N_FLINE 0x4c /* function start.end */ +#define N_SSYM 0x60 /* structure elt: name,,0,type,struct_offset */ +#define N_ENDM 0x62 /* last stab emitted for module */ +#define N_SO 0x64 /* source file name: name,,0,0,address */ +#define N_LSYM 0x80 /* local sym: name,,0,type,offset */ +#define N_BINCL 0x82 /* header file: name,,0,0,0 */ +#define N_SOL 0x84 /* #included file name: name,,0,0,address */ +#define N_PSYM 0xa0 /* parameter: name,,0,type,offset */ +#define N_EINCL 0xa2 /* end of include file */ +#define N_ENTRY 0xa4 /* alternate entry: name,linenumber,address */ +#define N_LBRAC 0xc0 /* left bracket: 0,,0,nesting level,address */ +#define N_EXCL 0xc2 /* excluded include file */ +#define N_RBRAC 0xe0 /* right bracket: 0,,0,nesting level,address */ +#define N_BCOMM 0xe2 /* begin common: name,, */ +#define N_ECOMM 0xe4 /* end common: name,, */ +#define N_ECOML 0xe8 /* end common (local name): ,,address */ +#define N_LENG 0xfe /* second stab entry with length information */ + +/* + * for the berkeley pascal compiler, pc(1): + */ +#define N_PC 0x30 /* global pascal symbol: name,,0,subtype,line */ +#define N_WITH 0xea /* pascal with statement: type,,0,0,offset */ + +/* + * for code browser only + */ +#define N_BROWS 0x48 /* path to associated .cb file */ + +/* + * Optional langauge designations for N_SO + */ +#define N_SO_AS 1 /* Assembler */ +#define N_SO_C 2 /* C */ +#define N_SO_ANSI_C 3 /* ANSI C */ +#define N_SO_CC 4 /* C++ */ +#define N_SO_FORTRAN 5 /* Fortran 77 */ +#define N_SO_PASCAL 6 /* Pascal */ + +/* + * Floating point type values + */ +#define NF_NONE 0 /* Undefined type */ +#define NF_SINGLE 1 /* IEEE 32 bit float */ +#define NF_DOUBLE 2 /* IEEE 64 bit float */ +#define NF_COMPLEX 3 /* Fortran complex */ +#define NF_COMPLEX16 4 /* Fortran double complex */ +#define NF_COMPLEX32 5 /* Fortran complex*16 */ +#define NF_LDOUBLE 6 /* Long double */ + +#endif diff --git a/quake3/source/lcc/src/stmt.c b/quake3/source/lcc/src/stmt.c new file mode 100644 index 0000000..b742a32 --- /dev/null +++ b/quake3/source/lcc/src/stmt.c @@ -0,0 +1,697 @@ +#include "c.h" + + +#define SWSIZE 512 + +#define den(i,j) ((j-buckets[i]+1.0)/(v[j]-v[buckets[i]]+1)) + +struct code codehead = { Start }; +Code codelist = &codehead; +float density = 0.5; +Table stmtlabs; + +static int foldcond(Tree e1, Tree e2); +static void caselabel(Swtch, long, int); +static void cmp(int, Symbol, long, int); +static Tree conditional(int); +static void dostmt(int, Swtch, int); +static int equal(Symbol, Symbol); +static void forstmt(int, Swtch, int); +static void ifstmt(int, int, Swtch, int); +static Symbol localaddr(Tree); +static void stmtlabel(void); +static void swstmt(int, int, int); +static void whilestmt(int, Swtch, int); +Code code(int kind) { + Code cp; + + if (!reachable(kind)) + warning("unreachable code\n"); + + NEW(cp, FUNC); + cp->kind = kind; + cp->prev = codelist; + cp->next = NULL; + codelist->next = cp; + codelist = cp; + return cp; +} +int reachable(int kind) { + Code cp; + + if (kind > Start) { + Code cp; + for (cp = codelist; cp->kind < Label; ) + cp = cp->prev; + if (cp->kind == Jump || cp->kind == Switch) + return 0; + } + return 1; +} +void addlocal(Symbol p) { + if (!p->defined) { + code(Local)->u.var = p; + p->defined = 1; + p->scope = level; + } +} +void definept(Coordinate *p) { + Code cp = code(Defpoint); + + cp->u.point.src = p ? *p : src; + cp->u.point.point = npoints; + if (ncalled > 0) { + int n = findcount(cp->u.point.src.file, + cp->u.point.src.x, cp->u.point.src.y); + if (n > 0) + refinc = (float)n/ncalled; + } + if (glevel > 2) locus(identifiers, &cp->u.point.src); + if (events.points && reachable(Gen)) + { + Tree e = NULL; + apply(events.points, &cp->u.point.src, &e); + if (e) + listnodes(e, 0, 0); + } +} +void statement(int loop, Swtch swp, int lev) { + float ref = refinc; + + if (Aflag >= 2 && lev == 15) + warning("more than 15 levels of nested statements\n"); + switch (t) { + case IF: ifstmt(genlabel(2), loop, swp, lev + 1); + break; + case WHILE: whilestmt(genlabel(3), swp, lev + 1); break; + case DO: dostmt(genlabel(3), swp, lev + 1); expect(';'); + break; + + case FOR: forstmt(genlabel(4), swp, lev + 1); + break; + case BREAK: walk(NULL, 0, 0); + definept(NULL); + if (swp && swp->lab > loop) + branch(swp->lab + 1); + else if (loop) + branch(loop + 2); + else + error("illegal break statement\n"); + t = gettok(); expect(';'); + break; + + case CONTINUE: walk(NULL, 0, 0); + definept(NULL); + if (loop) + branch(loop + 1); + else + error("illegal continue statement\n"); + t = gettok(); expect(';'); + break; + + case SWITCH: swstmt(loop, genlabel(2), lev + 1); + break; + case CASE: { + int lab = genlabel(1); + if (swp == NULL) + error("illegal case label\n"); + definelab(lab); + while (t == CASE) { + static char stop[] = { IF, ID, 0 }; + Tree p; + t = gettok(); + p = constexpr(0); + if (generic(p->op) == CNST && isint(p->type)) { + if (swp) { + needconst++; + p = cast(p, swp->sym->type); + if (p->type->op == UNSIGNED) + p->u.v.i = extend(p->u.v.u, p->type); + needconst--; + caselabel(swp, p->u.v.i, lab); + } + } else + error("case label must be a constant integer expression\n"); + + test(':', stop); + } + statement(loop, swp, lev); + } break; + case DEFAULT: if (swp == NULL) + error("illegal default label\n"); + else if (swp->deflab) + error("extra default label\n"); + else { + swp->deflab = findlabel(swp->lab); + definelab(swp->deflab->u.l.label); + } + t = gettok(); + expect(':'); + statement(loop, swp, lev); break; + case RETURN: { + Type rty = freturn(cfunc->type); + t = gettok(); + definept(NULL); + if (t != ';') + if (rty == voidtype) { + error("extraneous return value\n"); + expr(0); + retcode(NULL); + } else + retcode(expr(0)); + else { + if (rty != voidtype) + warning("missing return value\n"); + retcode(NULL); + } + branch(cfunc->u.f.label); + } expect(';'); + break; + + case '{': compound(loop, swp, lev + 1); break; + case ';': definept(NULL); t = gettok(); break; + case GOTO: walk(NULL, 0, 0); + definept(NULL); + t = gettok(); + if (t == ID) { + Symbol p = lookup(token, stmtlabs); + if (p == NULL) { + p = install(token, &stmtlabs, 0, FUNC); + p->scope = LABELS; + p->u.l.label = genlabel(1); + p->src = src; + } + use(p, src); + branch(p->u.l.label); + t = gettok(); + } else + error("missing label in goto\n"); expect(';'); + break; + + case ID: if (getchr() == ':') { + stmtlabel(); + statement(loop, swp, lev); + break; + } + default: definept(NULL); + if (kind[t] != ID) { + error("unrecognized statement\n"); + t = gettok(); + } else { + Tree e = expr0(0); + listnodes(e, 0, 0); + if (nodecount == 0 || nodecount > 200) + walk(NULL, 0, 0); + else if (glevel) walk(NULL, 0, 0); + deallocate(STMT); + } expect(';'); + break; + + } + if (kind[t] != IF && kind[t] != ID + && t != '}' && t != EOI) { + static char stop[] = { IF, ID, '}', 0 }; + error("illegal statement termination\n"); + skipto(0, stop); + } + refinc = ref; +} + +static void ifstmt(int lab, int loop, Swtch swp, int lev) { + t = gettok(); + expect('('); + definept(NULL); + walk(conditional(')'), 0, lab); + refinc /= 2.0; + statement(loop, swp, lev); + if (t == ELSE) { + branch(lab + 1); + t = gettok(); + definelab(lab); + statement(loop, swp, lev); + if (findlabel(lab + 1)->ref) + definelab(lab + 1); + } else + definelab(lab); +} +static Tree conditional(int tok) { + Tree p = expr(tok); + + if (Aflag > 1 && isfunc(p->type)) + warning("%s used in a conditional expression\n", + funcname(p)); + return cond(p); +} +static void stmtlabel(void) { + Symbol p = lookup(token, stmtlabs); + + if (p == NULL) { + p = install(token, &stmtlabs, 0, FUNC); + p->scope = LABELS; + p->u.l.label = genlabel(1); + p->src = src; + } + if (p->defined) + error("redefinition of label `%s' previously defined at %w\n", p->name, &p->src); + + p->defined = 1; + definelab(p->u.l.label); + t = gettok(); + expect(':'); +} +static void forstmt(int lab, Swtch swp, int lev) { + int once = 0; + Tree e1 = NULL, e2 = NULL, e3 = NULL; + Coordinate pt2, pt3; + + t = gettok(); + expect('('); + definept(NULL); + if (kind[t] == ID) + e1 = texpr(expr0, ';', FUNC); + else + expect(';'); + walk(e1, 0, 0); + pt2 = src; + refinc *= 10.0; + if (kind[t] == ID) + e2 = texpr(conditional, ';', FUNC); + else + expect(';'); + pt3 = src; + if (kind[t] == ID) + e3 = texpr(expr0, ')', FUNC); + else { + static char stop[] = { IF, ID, '}', 0 }; + test(')', stop); + } + if (e2) { + once = foldcond(e1, e2); + if (!once) + branch(lab + 3); + } + definelab(lab); + statement(lab, swp, lev); + definelab(lab + 1); + definept(&pt3); + if (e3) + walk(e3, 0, 0); + if (e2) { + if (!once) + definelab(lab + 3); + definept(&pt2); + walk(e2, lab, 0); + } else { + definept(&pt2); + branch(lab); + } + if (findlabel(lab + 2)->ref) + definelab(lab + 2); +} +static void swstmt(int loop, int lab, int lev) { + Tree e; + struct swtch sw; + Code head, tail; + + t = gettok(); + expect('('); + definept(NULL); + e = expr(')'); + if (!isint(e->type)) { + error("illegal type `%t' in switch expression\n", + e->type); + e = retype(e, inttype); + } + e = cast(e, promote(e->type)); + if (generic(e->op) == INDIR && isaddrop(e->kids[0]->op) + && e->kids[0]->u.sym->type == e->type + && !isvolatile(e->kids[0]->u.sym->type)) { + sw.sym = e->kids[0]->u.sym; + walk(NULL, 0, 0); + } else { + sw.sym = genident(REGISTER, e->type, level); + addlocal(sw.sym); + walk(asgn(sw.sym, e), 0, 0); + } + head = code(Switch); + sw.lab = lab; + sw.deflab = NULL; + sw.ncases = 0; + sw.size = SWSIZE; + sw.values = newarray(SWSIZE, sizeof *sw.values, FUNC); + sw.labels = newarray(SWSIZE, sizeof *sw.labels, FUNC); + refinc /= 10.0; + statement(loop, &sw, lev); + if (sw.deflab == NULL) { + sw.deflab = findlabel(lab); + definelab(lab); + if (sw.ncases == 0) + warning("switch statement with no cases\n"); + } + if (findlabel(lab + 1)->ref) + definelab(lab + 1); + tail = codelist; + codelist = head->prev; + codelist->next = head->prev = NULL; + if (sw.ncases > 0) + swgen(&sw); + branch(lab); + head->next->prev = codelist; + codelist->next = head->next; + codelist = tail; +} +static void caselabel(Swtch swp, long val, int lab) { + int k; + + if (swp->ncases >= swp->size) + { + long *vals = swp->values; + Symbol *labs = swp->labels; + swp->size *= 2; + swp->values = newarray(swp->size, sizeof *swp->values, FUNC); + swp->labels = newarray(swp->size, sizeof *swp->labels, FUNC); + for (k = 0; k < swp->ncases; k++) { + swp->values[k] = vals[k]; + swp->labels[k] = labs[k]; + } + } + k = swp->ncases; + for ( ; k > 0 && swp->values[k-1] >= val; k--) { + swp->values[k] = swp->values[k-1]; + swp->labels[k] = swp->labels[k-1]; + } + if (k < swp->ncases && swp->values[k] == val) + error("duplicate case label `%d'\n", val); + swp->values[k] = val; + swp->labels[k] = findlabel(lab); + ++swp->ncases; + if (Aflag >= 2 && swp->ncases == 258) + warning("more than 257 cases in a switch\n"); +} +void swgen(Swtch swp) { + int *buckets, k, n; + long *v = swp->values; + + buckets = newarray(swp->ncases + 1, + sizeof *buckets, FUNC); + for (n = k = 0; k < swp->ncases; k++, n++) { + buckets[n] = k; + while (n > 0 && den(n-1, k) >= density) + n--; + } + buckets[n] = swp->ncases; + swcode(swp, buckets, 0, n - 1); +} +void swcode(Swtch swp, int b[], int lb, int ub) { + int hilab, lolab, l, u, k = (lb + ub)/2; + long *v = swp->values; + + if (k > lb && k < ub) { + lolab = genlabel(1); + hilab = genlabel(1); + } else if (k > lb) { + lolab = genlabel(1); + hilab = swp->deflab->u.l.label; + } else if (k < ub) { + lolab = swp->deflab->u.l.label; + hilab = genlabel(1); + } else + lolab = hilab = swp->deflab->u.l.label; + l = b[k]; + u = b[k+1] - 1; + if (u - l + 1 <= 3) + { + int i; + for (i = l; i <= u; i++) + cmp(EQ, swp->sym, v[i], swp->labels[i]->u.l.label); + if (k > lb && k < ub) + cmp(GT, swp->sym, v[u], hilab); + else if (k > lb) + cmp(GT, swp->sym, v[u], hilab); + else if (k < ub) + cmp(LT, swp->sym, v[l], lolab); + else + assert(lolab == hilab), + branch(lolab); + walk(NULL, 0, 0); + } + else { + Tree e; + Type ty = signedint(swp->sym->type); + Symbol table = genident(STATIC, + array(voidptype, u - l + 1, 0), GLOBAL); + (*IR->defsymbol)(table); + if (!isunsigned(swp->sym->type) || v[l] != 0) + cmp(LT, swp->sym, v[l], lolab); + cmp(GT, swp->sym, v[u], hilab); + e = (*optree['-'])(SUB, cast(idtree(swp->sym), ty), cnsttree(ty, v[l])); + if (e->type->size < unsignedptr->size) + e = cast(e, unsignedlong); + walk(tree(JUMP, voidtype, + rvalue((*optree['+'])(ADD, pointer(idtree(table)), e)), NULL), + 0, 0); + code(Switch); + codelist->u.swtch.table = table; + codelist->u.swtch.sym = swp->sym; + codelist->u.swtch.deflab = swp->deflab; + codelist->u.swtch.size = u - l + 1; + codelist->u.swtch.values = &v[l]; + codelist->u.swtch.labels = &swp->labels[l]; + if (v[u] - v[l] + 1 >= 10000) + warning("switch generates a huge table\n"); + } + if (k > lb) { + assert(lolab != swp->deflab->u.l.label); + definelab(lolab); + swcode(swp, b, lb, k - 1); + } + if (k < ub) { + assert(hilab != swp->deflab->u.l.label); + definelab(hilab); + swcode(swp, b, k + 1, ub); + } +} +static void cmp(int op, Symbol p, long n, int lab) { + Type ty = signedint(p->type); + + listnodes(eqtree(op, + cast(idtree(p), ty), + cnsttree(ty, n)), + lab, 0); +} +void retcode(Tree p) { + Type ty; + + if (p == NULL) { + if (events.returns) + apply(events.returns, cfunc, NULL); + return; + } + p = pointer(p); + ty = assign(freturn(cfunc->type), p); + if (ty == NULL) { + error("illegal return type; found `%t' expected `%t'\n", + p->type, freturn(cfunc->type)); + return; + } + p = cast(p, ty); + if (retv) + { + if (iscallb(p)) + p = tree(RIGHT, p->type, + tree(CALL+B, p->type, + p->kids[0]->kids[0], idtree(retv)), + rvalue(idtree(retv))); + else + p = asgntree(ASGN, rvalue(idtree(retv)), p); + walk(p, 0, 0); + if (events.returns) + apply(events.returns, cfunc, rvalue(idtree(retv))); + return; + } + if (events.returns) + { + Symbol t1 = genident(AUTO, p->type, level); + addlocal(t1); + walk(asgn(t1, p), 0, 0); + apply(events.returns, cfunc, idtree(t1)); + p = idtree(t1); + } + if (!isfloat(p->type)) + p = cast(p, promote(p->type)); + if (isptr(p->type)) + { + Symbol q = localaddr(p); + if (q && (q->computed || q->generated)) + warning("pointer to a %s is an illegal return value\n", + q->scope == PARAM ? "parameter" : "local"); + else if (q) + warning("pointer to %s `%s' is an illegal return value\n", + q->scope == PARAM ? "parameter" : "local", q->name); + } + walk(tree(mkop(RET,p->type), p->type, p, NULL), 0, 0); +} +void definelab(int lab) { + Code cp; + Symbol p = findlabel(lab); + + assert(lab); + walk(NULL, 0, 0); + code(Label)->u.forest = newnode(LABEL+V, NULL, NULL, p); + for (cp = codelist->prev; cp->kind <= Label; ) + cp = cp->prev; + while ( cp->kind == Jump + && cp->u.forest->kids[0] + && specific(cp->u.forest->kids[0]->op) == ADDRG+P + && cp->u.forest->kids[0]->syms[0] == p) { + assert(cp->u.forest->kids[0]->syms[0]->u.l.label == lab); + p->ref--; + assert(cp->next); + assert(cp->prev); + cp->prev->next = cp->next; + cp->next->prev = cp->prev; + cp = cp->prev; + while (cp->kind <= Label) + cp = cp->prev; + } +} +Node jump(int lab) { + Symbol p = findlabel(lab); + + p->ref++; + return newnode(JUMP+V, newnode(ADDRG+ttob(voidptype), NULL, NULL, p), + NULL, NULL); +} +void branch(int lab) { + Code cp; + Symbol p = findlabel(lab); + + assert(lab); + walk(NULL, 0, 0); + code(Label)->u.forest = jump(lab); + for (cp = codelist->prev; cp->kind < Label; ) + cp = cp->prev; + while ( cp->kind == Label + && cp->u.forest->op == LABEL+V + && !equal(cp->u.forest->syms[0], p)) { + equatelab(cp->u.forest->syms[0], p); + assert(cp->next); + assert(cp->prev); + cp->prev->next = cp->next; + cp->next->prev = cp->prev; + cp = cp->prev; + while (cp->kind < Label) + cp = cp->prev; + } + if (cp->kind == Jump || cp->kind == Switch) { + p->ref--; + codelist->prev->next = NULL; + codelist = codelist->prev; + } else { + codelist->kind = Jump; + if (cp->kind == Label + && cp->u.forest->op == LABEL+V + && equal(cp->u.forest->syms[0], p)) + warning("source code specifies an infinite loop"); + } +} +void equatelab(Symbol old, Symbol new) { + assert(old->u.l.equatedto == NULL); + old->u.l.equatedto = new; + new->ref++; +} +static int equal(Symbol lprime, Symbol dst) { + assert(dst && lprime); + for ( ; dst; dst = dst->u.l.equatedto) + if (lprime == dst) + return 1; + return 0; +} +/* dostmt - do statement while ( expression ) */ +static void dostmt(int lab, Swtch swp, int lev) { + refinc *= 10.0; + t = gettok(); + definelab(lab); + statement(lab, swp, lev); + definelab(lab + 1); + expect(WHILE); + expect('('); + definept(NULL); + walk(conditional(')'), lab, 0); + if (findlabel(lab + 2)->ref) + definelab(lab + 2); +} + +/* foldcond - check if initial test in for(e1;e2;e3) S is necessary */ +static int foldcond(Tree e1, Tree e2) { + int op = generic(e2->op); + Symbol v; + + if (e1 == 0 || e2 == 0) + return 0; + if (generic(e1->op) == ASGN && isaddrop(e1->kids[0]->op) + && generic(e1->kids[1]->op) == CNST) { + v = e1->kids[0]->u.sym; + e1 = e1->kids[1]; + } else + return 0; + if ((op==LE || op==LT || op==EQ || op==NE || op==GT || op==GE) + && generic(e2->kids[0]->op) == INDIR + && e2->kids[0]->kids[0]->u.sym == v + && e2->kids[1]->op == e1->op) { + e1 = simplify(op, e2->type, e1, e2->kids[1]); + if (e1->op == CNST+I) + return e1->u.v.i; + } + return 0; +} + +/* localaddr - returns q if p yields the address of local/parameter q; otherwise returns 0 */ +static Symbol localaddr(Tree p) { + if (p == NULL) + return NULL; + switch (generic(p->op)) { + case INDIR: case CALL: case ARG: + return NULL; + case ADDRL: case ADDRF: + return p->u.sym; + case RIGHT: case ASGN: + if (p->kids[1]) + return localaddr(p->kids[1]); + return localaddr(p->kids[0]); + case COND: { + Symbol q; + assert(p->kids[1] && p->kids[1]->op == RIGHT); + if ((q = localaddr(p->kids[1]->kids[0])) != NULL) + return q; + return localaddr(p->kids[1]->kids[1]); + } + default: { + Symbol q; + if (p->kids[0] && (q = localaddr(p->kids[0])) != NULL) + return q; + return localaddr(p->kids[1]); + } + } +} + +/* whilestmt - while ( expression ) statement */ +static void whilestmt(int lab, Swtch swp, int lev) { + Coordinate pt; + Tree e; + + refinc *= 10.0; + t = gettok(); + expect('('); + walk(NULL, 0, 0); + pt = src; + e = texpr(conditional, ')', FUNC); + branch(lab + 1); + definelab(lab); + statement(lab, swp, lev); + definelab(lab + 1); + definept(&pt); + walk(e, lab, 0); + if (findlabel(lab + 2)->ref) + definelab(lab + 2); +} diff --git a/quake3/source/lcc/src/string.c b/quake3/source/lcc/src/string.c new file mode 100644 index 0000000..4fee2c9 --- /dev/null +++ b/quake3/source/lcc/src/string.c @@ -0,0 +1,122 @@ +#include "c.h" + + +static struct string { + char *str; + int len; + struct string *link; +} *buckets[1024]; +static int scatter[] = { /* map characters to random values */ + 2078917053, 143302914, 1027100827, 1953210302, 755253631, + 2002600785, 1405390230, 45248011, 1099951567, 433832350, + 2018585307, 438263339, 813528929, 1703199216, 618906479, + 573714703, 766270699, 275680090, 1510320440, 1583583926, + 1723401032, 1965443329, 1098183682, 1636505764, 980071615, + 1011597961, 643279273, 1315461275, 157584038, 1069844923, + 471560540, 89017443, 1213147837, 1498661368, 2042227746, + 1968401469, 1353778505, 1300134328, 2013649480, 306246424, + 1733966678, 1884751139, 744509763, 400011959, 1440466707, + 1363416242, 973726663, 59253759, 1639096332, 336563455, + 1642837685, 1215013716, 154523136, 593537720, 704035832, + 1134594751, 1605135681, 1347315106, 302572379, 1762719719, + 269676381, 774132919, 1851737163, 1482824219, 125310639, + 1746481261, 1303742040, 1479089144, 899131941, 1169907872, + 1785335569, 485614972, 907175364, 382361684, 885626931, + 200158423, 1745777927, 1859353594, 259412182, 1237390611, + 48433401, 1902249868, 304920680, 202956538, 348303940, + 1008956512, 1337551289, 1953439621, 208787970, 1640123668, + 1568675693, 478464352, 266772940, 1272929208, 1961288571, + 392083579, 871926821, 1117546963, 1871172724, 1771058762, + 139971187, 1509024645, 109190086, 1047146551, 1891386329, + 994817018, 1247304975, 1489680608, 706686964, 1506717157, + 579587572, 755120366, 1261483377, 884508252, 958076904, + 1609787317, 1893464764, 148144545, 1415743291, 2102252735, + 1788268214, 836935336, 433233439, 2055041154, 2109864544, + 247038362, 299641085, 834307717, 1364585325, 23330161, + 457882831, 1504556512, 1532354806, 567072918, 404219416, + 1276257488, 1561889936, 1651524391, 618454448, 121093252, + 1010757900, 1198042020, 876213618, 124757630, 2082550272, + 1834290522, 1734544947, 1828531389, 1982435068, 1002804590, + 1783300476, 1623219634, 1839739926, 69050267, 1530777140, + 1802120822, 316088629, 1830418225, 488944891, 1680673954, + 1853748387, 946827723, 1037746818, 1238619545, 1513900641, + 1441966234, 367393385, 928306929, 946006977, 985847834, + 1049400181, 1956764878, 36406206, 1925613800, 2081522508, + 2118956479, 1612420674, 1668583807, 1800004220, 1447372094, + 523904750, 1435821048, 923108080, 216161028, 1504871315, + 306401572, 2018281851, 1820959944, 2136819798, 359743094, + 1354150250, 1843084537, 1306570817, 244413420, 934220434, + 672987810, 1686379655, 1301613820, 1601294739, 484902984, + 139978006, 503211273, 294184214, 176384212, 281341425, + 228223074, 147857043, 1893762099, 1896806882, 1947861263, + 1193650546, 273227984, 1236198663, 2116758626, 489389012, + 593586330, 275676551, 360187215, 267062626, 265012701, + 719930310, 1621212876, 2108097238, 2026501127, 1865626297, + 894834024, 552005290, 1404522304, 48964196, 5816381, + 1889425288, 188942202, 509027654, 36125855, 365326415, + 790369079, 264348929, 513183458, 536647531, 13672163, + 313561074, 1730298077, 286900147, 1549759737, 1699573055, + 776289160, 2143346068, 1975249606, 1136476375, 262925046, + 92778659, 1856406685, 1884137923, 53392249, 1735424165, + 1602280572 +}; +char *string(const char *str) { + const char *s; + + for (s = str; *s; s++) + ; + return stringn(str, s - str); +} +char *stringd(long n) { + char str[25], *s = str + sizeof (str); + unsigned long m; + + if (n == LONG_MIN) + m = (unsigned long)LONG_MAX + 1; + else if (n < 0) + m = -n; + else + m = n; + do + *--s = m%10 + '0'; + while ((m /= 10) != 0); + if (n < 0) + *--s = '-'; + return stringn(s, str + sizeof (str) - s); +} +char *stringn(const char *str, int len) { + int i; + unsigned int h; + const char *end; + struct string *p; + + assert(str); + for (h = 0, i = len, end = str; i > 0; i--) + h = (h<<1) + scatter[*(unsigned char *)end++]; + h &= NELEMS(buckets)-1; + for (p = buckets[h]; p; p = p->link) + if (len == p->len) { + const char *s1 = str; + char *s2 = p->str; + do { + if (s1 == end) + return p->str; + } while (*s1++ == *s2++); + } + { + static char *next, *strlimit; + if (len + 1 >= strlimit - next) { + int n = len + 4*1024; + next = allocate(n, PERM); + strlimit = next + n; + } + NEW(p, PERM); + p->len = len; + for (p->str = next; str < end; ) + *next++ = *str++; + *next++ = 0; + p->link = buckets[h]; + buckets[h] = p; + return p->str; + } +} diff --git a/quake3/source/lcc/src/sym.c b/quake3/source/lcc/src/sym.c new file mode 100644 index 0000000..1d754d4 --- /dev/null +++ b/quake3/source/lcc/src/sym.c @@ -0,0 +1,315 @@ +#include "c.h" +#include + + +#define equalp(x) v.x == p->sym.u.c.v.x + +struct table { + int level; + Table previous; + struct entry { + struct symbol sym; + struct entry *link; + } *buckets[256]; + Symbol all; +}; +#define HASHSIZE NELEMS(((Table)0)->buckets) +static struct table + cns = { CONSTANTS }, + ext = { GLOBAL }, + ids = { GLOBAL }, + tys = { GLOBAL }; +Table constants = &cns; +Table externals = &ext; +Table identifiers = &ids; +Table globals = &ids; +Table types = &tys; +Table labels; +int level = GLOBAL; +static int tempid; +List loci, symbols; + +Table table(Table tp, int level) { + Table new; + + NEW0(new, FUNC); + new->previous = tp; + new->level = level; + if (tp) + new->all = tp->all; + return new; +} +void foreach(Table tp, int lev, void (*apply)(Symbol, void *), void *cl) { + assert(tp); + while (tp && tp->level > lev) + tp = tp->previous; + if (tp && tp->level == lev) { + Symbol p; + Coordinate sav; + sav = src; + for (p = tp->all; p && p->scope == lev; p = p->up) { + src = p->src; + (*apply)(p, cl); + } + src = sav; + } +} +void enterscope(void) { + if (++level == LOCAL) + tempid = 0; +} +void exitscope(void) { + rmtypes(level); + if (types->level == level) + types = types->previous; + if (identifiers->level == level) { + if (Aflag >= 2) { + int n = 0; + Symbol p; + for (p = identifiers->all; p && p->scope == level; p = p->up) + if (++n > 127) { + warning("more than 127 identifiers declared in a block\n"); + break; + } + } + identifiers = identifiers->previous; + } + assert(level >= GLOBAL); + --level; +} +Symbol install(const char *name, Table *tpp, int level, int arena) { + Table tp = *tpp; + struct entry *p; + unsigned h = (unsigned long)name&(HASHSIZE-1); + + assert(level == 0 || level >= tp->level); + if (level > 0 && tp->level < level) + tp = *tpp = table(tp, level); + NEW0(p, arena); + p->sym.name = (char *)name; + p->sym.scope = level; + p->sym.up = tp->all; + tp->all = &p->sym; + p->link = tp->buckets[h]; + tp->buckets[h] = p; + return &p->sym; +} +Symbol relocate(const char *name, Table src, Table dst) { + struct entry *p, **q; + Symbol *r; + unsigned h = (unsigned long)name&(HASHSIZE-1); + + for (q = &src->buckets[h]; *q; q = &(*q)->link) + if (name == (*q)->sym.name) + break; + assert(*q); + /* + Remove the entry from src's hash chain + and from its list of all symbols. + */ + p = *q; + *q = (*q)->link; + for (r = &src->all; *r && *r != &p->sym; r = &(*r)->up) + ; + assert(*r == &p->sym); + *r = p->sym.up; + /* + Insert the entry into dst's hash chain + and into its list of all symbols. + Return the symbol-table entry. + */ + p->link = dst->buckets[h]; + dst->buckets[h] = p; + p->sym.up = dst->all; + dst->all = &p->sym; + return &p->sym; +} +Symbol lookup(const char *name, Table tp) { + struct entry *p; + unsigned h = (unsigned long)name&(HASHSIZE-1); + + assert(tp); + do + for (p = tp->buckets[h]; p; p = p->link) + if (name == p->sym.name) + return &p->sym; + while ((tp = tp->previous) != NULL); + return NULL; +} +int genlabel(int n) { + static int label = 1; + + label += n; + return label - n; +} +Symbol findlabel(int lab) { + struct entry *p; + unsigned h = lab&(HASHSIZE-1); + + for (p = labels->buckets[h]; p; p = p->link) + if (lab == p->sym.u.l.label) + return &p->sym; + NEW0(p, FUNC); + p->sym.name = stringd(lab); + p->sym.scope = LABELS; + p->sym.up = labels->all; + labels->all = &p->sym; + p->link = labels->buckets[h]; + labels->buckets[h] = p; + p->sym.generated = 1; + p->sym.u.l.label = lab; + (*IR->defsymbol)(&p->sym); + return &p->sym; +} +Symbol constant(Type ty, Value v) { + struct entry *p; + unsigned h = v.u&(HASHSIZE-1); + + ty = unqual(ty); + for (p = constants->buckets[h]; p; p = p->link) + if (eqtype(ty, p->sym.type, 1)) + switch (ty->op) { + case INT: if (equalp(i)) return &p->sym; break; + case UNSIGNED: if (equalp(u)) return &p->sym; break; + case FLOAT: if (equalp(d)) return &p->sym; break; + case FUNCTION: if (equalp(g)) return &p->sym; break; + case ARRAY: + case POINTER: if (equalp(p)) return &p->sym; break; + default: assert(0); + } + NEW0(p, PERM); + p->sym.name = vtoa(ty, v); + p->sym.scope = CONSTANTS; + p->sym.type = ty; + p->sym.sclass = STATIC; + p->sym.u.c.v = v; + p->link = constants->buckets[h]; + p->sym.up = constants->all; + constants->all = &p->sym; + constants->buckets[h] = p; + if (ty->u.sym && !ty->u.sym->addressed) + (*IR->defsymbol)(&p->sym); + p->sym.defined = 1; + return &p->sym; +} +Symbol intconst(int n) { + Value v; + + v.i = n; + return constant(inttype, v); +} +Symbol genident(int scls, Type ty, int lev) { + Symbol p; + + NEW0(p, lev >= LOCAL ? FUNC : PERM); + p->name = stringd(genlabel(1)); + p->scope = lev; + p->sclass = scls; + p->type = ty; + p->generated = 1; + if (lev == GLOBAL) + (*IR->defsymbol)(p); + return p; +} + +Symbol temporary(int scls, Type ty) { + Symbol p; + + NEW0(p, FUNC); + p->name = stringd(++tempid); + p->scope = level < LOCAL ? LOCAL : level; + p->sclass = scls; + p->type = ty; + p->temporary = 1; + p->generated = 1; + return p; +} +Symbol newtemp(int sclass, int tc, int size) { + Symbol p = temporary(sclass, btot(tc, size)); + + (*IR->local)(p); + p->defined = 1; + return p; +} + +Symbol allsymbols(Table tp) { + return tp->all; +} + +void locus(Table tp, Coordinate *cp) { + loci = append(cp, loci); + symbols = append(allsymbols(tp), symbols); +} + +void use(Symbol p, Coordinate src) { + Coordinate *cp; + + NEW(cp, PERM); + *cp = src; + p->uses = append(cp, p->uses); +} +/* findtype - find type ty in identifiers */ +Symbol findtype(Type ty) { + Table tp = identifiers; + int i; + struct entry *p; + + assert(tp); + do + for (i = 0; i < HASHSIZE; i++) + for (p = tp->buckets[i]; p; p = p->link) + if (p->sym.type == ty && p->sym.sclass == TYPEDEF) + return &p->sym; + while ((tp = tp->previous) != NULL); + return NULL; +} + +/* mkstr - make a string constant */ +Symbol mkstr(char *str) { + Value v; + Symbol p; + + v.p = str; + p = constant(array(chartype, strlen(v.p) + 1, 0), v); + if (p->u.c.loc == NULL) + p->u.c.loc = genident(STATIC, p->type, GLOBAL); + return p; +} + +/* mksymbol - make a symbol for name, install in &globals if sclass==EXTERN */ +Symbol mksymbol(int sclass, const char *name, Type ty) { + Symbol p; + + if (sclass == EXTERN) + p = install(string(name), &globals, GLOBAL, PERM); + else { + NEW0(p, PERM); + p->name = string(name); + p->scope = GLOBAL; + } + p->sclass = sclass; + p->type = ty; + (*IR->defsymbol)(p); + p->defined = 1; + return p; +} + +/* vtoa - return string for the constant v of type ty */ +char *vtoa(Type ty, Value v) { + char buf[50]; + + ty = unqual(ty); + switch (ty->op) { + case INT: return stringd(v.i); + case UNSIGNED: return stringf((v.u&~0x7FFF) ? "0x%X" : "%U", v.u); + case FLOAT: return stringf("%g", (double)v.d); + case ARRAY: + if (ty->type == chartype || ty->type == signedchar + || ty->type == unsignedchar) + return v.p; + return stringf("%p", v.p); + case POINTER: return stringf("%p", v.p); + case FUNCTION: return stringf("%p", v.g); + } + assert(0); return NULL; +} diff --git a/quake3/source/lcc/src/symbolic.c b/quake3/source/lcc/src/symbolic.c new file mode 100644 index 0000000..35ff55c --- /dev/null +++ b/quake3/source/lcc/src/symbolic.c @@ -0,0 +1,494 @@ +#include +#include +#include "c.h" + +#define I(f) s_##f + +static Node *tail; +static int off, maxoff, uid = 0, verbose = 0, html = 0; + +static const char *yyBEGIN(const char *tag) { + if (html) + print("<%s>", tag); + return tag; +} + +static void yyEND(const char *tag) { + if (html) + print("", tag); + if (isupper(*tag)) + print("\n"); +} + +#define BEGIN(tag) do { const char *yytag=yyBEGIN(#tag); +#define END yyEND(yytag); } while (0) +#define ITEM BEGIN(li) +#define START BEGIN(LI) +#define ANCHOR(attr,code) do { const char *yytag="a"; if (html) { printf(""); } +#define NEWLINE print(html ? "
\n" : "\n") + +static void emitCoord(Coordinate src) { + if (src.file && *src.file) { + ANCHOR(href,print("%s", src.file)); print("%s", src.file); END; + print(":"); + } + print("%d.%d", src.y, src.x); +} + +static void emitString(int len, const char *s) { + for ( ; len-- > 0; s++) + if (*s == '&' && html) + print("&"); + else if (*s == '<' && html) + print("<"); + else if (*s == '>' && html) + print("<"); + else if (*s == '"' || *s == '\\') + print("\\%c", *s); + else if (*s >= ' ' && *s < 0177) + print("%c", *s); + else + print("\\%d%d%d", (*s>>6)&3, (*s>>3)&7, *s&7); +} + +static void emitSymRef(Symbol p) { + (*IR->defsymbol)(p); + ANCHOR(href,print("#%s", p->x.name)); BEGIN(code); print("%s", p->name); END; END; +} + +static void emitSymbol(Symbol p) { + (*IR->defsymbol)(p); + ANCHOR(name,print("%s", p->x.name)); BEGIN(code); print("%s", p->name); END; END; + BEGIN(ul); +#define xx(field,code) ITEM; if (!html) print(" "); print(#field "="); code; END + if (verbose && (src.y || src.x)) + xx(src,emitCoord(p->src)); + xx(type,print("%t", p->type)); + xx(sclass,print("%k", p->sclass)); + switch (p->scope) { + case CONSTANTS: xx(scope,print("CONSTANTS")); break; + case LABELS: xx(scope,print("LABELS")); break; + case GLOBAL: xx(scope,print("GLOBAL")); break; + case PARAM: xx(scope,print("PARAM")); break; + case LOCAL: xx(scope,print("LOCAL")); break; + default: + if (p->scope > LOCAL) + xx(scope,print("LOCAL+%d", p->scope-LOCAL)); + else + xx(scope,print("%d", p->scope)); + } + if (p->scope >= PARAM && p->sclass != STATIC) + xx(offset,print("%d", p->x.offset)); + xx(ref,print("%f", p->ref)); + if (p->temporary && p->u.t.cse) + xx(u.t.cse,print("%p", p->u.t.cse)); + END; +#undef xx +} + +/* address - initialize q for addressing expression p+n */ +static void I(address)(Symbol q, Symbol p, long n) { + q->name = stringf("%s%s%D", p->name, n > 0 ? "+" : "", n); + (*IR->defsymbol)(q); + START; print("address "); emitSymbol(q); END; +} + +/* blockbeg - start a block */ +static void I(blockbeg)(Env *e) { + e->offset = off; + START; print("blockbeg off=%d", off); END; +} + +/* blockend - start a block */ +static void I(blockend)(Env *e) { + if (off > maxoff) + maxoff = off; + START; print("blockend off=%d", off); END; + off = e->offset; +} + +/* defaddress - initialize an address */ +static void I(defaddress)(Symbol p){ + START; print("defaddress "); emitSymRef(p); END; +} + +/* defconst - define a constant */ +static void I(defconst)(int suffix, int size, Value v) { + START; + print("defconst "); + switch (suffix) { + case I: + print("int.%d ", size); + BEGIN(code); + if (size > sizeof (int)) + print("%D", v.i); + else + print("%d", (int)v.i); + END; + break; + case U: + print("unsigned.%d ", size); + BEGIN(code); + if (size > sizeof (unsigned)) + print("%U", v.u); + else + print("%u", (unsigned)v.u); + END; + break; + case P: print("void*.%d ", size); BEGIN(code); print("%p", v.p); END; break; + case F: print("float.%d ", size); BEGIN(code); print("%g", (double)v.d); END; break; + default: assert(0); + } + END; +} + +/* defstring - emit a string constant */ +static void I(defstring)(int len, char *s) { + START; print("defstring "); + BEGIN(code); print("\""); emitString(len, s); print("\""); END; + END; +} + +/* defsymbol - define a symbol: initialize p->x */ +static void I(defsymbol)(Symbol p) { + if (p->x.name == NULL) + p->x.name = stringd(++uid); +} + +/* emit - emit the dags on list p */ +static void I(emit)(Node p){ + ITEM; + if (!html) + print(" "); + for (; p; p = p->x.next) { + if (p->op == LABEL+V) { + assert(p->syms[0]); + ANCHOR(name,print("%s", p->syms[0]->x.name)); + BEGIN(code); print("%s", p->syms[0]->name); END; + END; + print(":"); + } else { + int i; + if (p->x.listed) { + BEGIN(strong); print("%d", p->x.inst); END; print("'"); + print(" %s", opname(p->op)); + } else + print("%d. %s", p->x.inst, opname(p->op)); + if (p->count > 1) + print(" count=%d", p->count); + for (i = 0; i < NELEMS(p->kids) && p->kids[i]; i++) + print(" #%d", p->kids[i]->x.inst); + if (generic(p->op) == CALL && p->syms[0] && p->syms[0]->type) + print(" {%t}", p->syms[0]->type); + else + for (i = 0; i < NELEMS(p->syms) && p->syms[i]; i++) { + print(" "); + if (p->syms[i]->scope == CONSTANTS) + print(p->syms[i]->name); + else + emitSymRef(p->syms[i]); + } + } + NEWLINE; + } + END; +} + +/* export - announce p as exported */ +static void I(export)(Symbol p) { + START; print("export "); emitSymRef(p); END; +} + +/* function - generate code for a function */ +static void I(function)(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { + int i; + + (*IR->defsymbol)(f); + off = 0; + for (i = 0; caller[i] && callee[i]; i++) { + off = roundup(off, caller[i]->type->align); + caller[i]->x.offset = callee[i]->x.offset = off; + off += caller[i]->type->size; + } + if (!html) { + print("function "); + emitSymbol(f); + print(" ncalls=%d\n", ncalls); + for (i = 0; caller[i]; i++) + START; print("caller "); emitSymbol(caller[i]); END; + for (i = 0; callee[i]; i++) + START; print("callee "); emitSymbol(callee[i]); END; + } else { + START; + print("function"); + BEGIN(UL); +#define xx(field,code) ITEM; print(#field "="); code; END + xx(f,emitSymbol(f)); + xx(ncalls,print("%d", ncalls)); + if (caller[0]) { + ITEM; print("caller"); BEGIN(OL); + for (i = 0; caller[i]; i++) + ITEM; emitSymbol(caller[i]); END; + END; END; + ITEM; print("callee"); BEGIN(OL); + for (i = 0; callee[i]; i++) + ITEM; emitSymbol(callee[i]); END; + END; END; + } else { + xx(caller,BEGIN(em); print("empty"); END); + xx(callee,BEGIN(em); print("empty"); END); + } + END; + END; + } + maxoff = off = 0; + gencode(caller, callee); + if (html) + START; print("emitcode"); BEGIN(ul); emitcode(); END; END; + else + emitcode(); + START; print("maxoff=%d", maxoff); END; +#undef xx +} + +/* visit - generate code for *p */ +static int visit(Node p, int n) { + if (p && p->x.inst == 0) { + p->x.inst = ++n; + n = visit(p->kids[0], n); + n = visit(p->kids[1], n); + *tail = p; + tail = &p->x.next; + } + return n; +} + +/* gen0 - generate code for the dags on list p */ +static Node I(gen)(Node p) { + int n; + Node nodelist; + + tail = &nodelist; + for (n = 0; p; p = p->link) { + switch (generic(p->op)) { /* check for valid forest */ + case CALL: + assert(IR->wants_dag || p->count == 0); + break; + case ARG: + case ASGN: case JUMP: case LABEL: case RET: + case EQ: case GE: case GT: case LE: case LT: case NE: + assert(p->count == 0); + break; + case INDIR: + assert(IR->wants_dag && p->count > 0); + break; + default: + assert(0); + } + check(p); + p->x.listed = 1; + n = visit(p, n); + } + *tail = 0; + return nodelist; +} + +/* global - announce a global */ +static void I(global)(Symbol p) { + START; print("global "); emitSymbol(p); END; +} + +/* import - import a symbol */ +static void I(import)(Symbol p) { + START; print("import "); emitSymRef(p); END; +} + +/* local - local variable */ +static void I(local)(Symbol p) { + if (p->temporary) + p->name = stringf("t%s", p->name); + (*IR->defsymbol)(p); + off = roundup(off, p->type->align); + p->x.offset = off; + off += p->type->size; + START; print(p->temporary ? "temporary " : "local "); emitSymbol(p); END; +} + +/* progbeg - beginning of program */ +static void I(progbeg)(int argc, char *argv[]) { + int i; + + for (i = 1; i < argc; i++) + if (strcmp(argv[i], "-v") == 0) + verbose++; + else if (strcmp(argv[i], "-html") == 0) + html++; + if (html) { + print("\n"); + print(""); + BEGIN(head); + if (firstfile && *firstfile) + BEGIN(title); emitString(strlen(firstfile), firstfile); END; + print("\n"); + END; + print("\n"); + if (firstfile && *firstfile) + BEGIN(h1); emitString(strlen(firstfile), firstfile); END; + BEGIN(P); BEGIN(em); + print("Links lead from uses of identifiers and labels to their definitions."); + END; END; + print("
    \n"); + START; + print("progbeg"); + BEGIN(ol); + for (i = 1; i < argc; i++) { + ITEM; + BEGIN(code); print("\""); emitString(strlen(argv[i]), argv[i]); print("\""); END; + END; + } + END; + END; + } +} + +/* progend - end of program */ +static void I(progend)(void) { + START; print("progend"); END; + if (html) { + time_t t; + print("
\n"); + time(&t); + print("
%s
\n", ctime(&t)); + print("\n"); + } +} + +/* segment - switch to segment s */ +static void I(segment)(int s) { + START; print("segment %s", &"text\0bss\0.data\0lit\0.sym\0."[5*s-5]); END; +} + +/* space - initialize n bytes of space */ +static void I(space)(int n) { + START; print("space %d", n); END; +} + +static void I(stabblock)(int brace, int lev, Symbol *p) {} + +/* stabend - finalize stab output */ +static void I(stabend)(Coordinate *cp, Symbol p, Coordinate **cpp, Symbol *sp, Symbol *stab) { + int i; + + if (p) + emitSymRef(p); + print("\n"); + if (cpp && sp) + for (i = 0; cpp[i] && sp[i]; i++) { + print("%w.%d: ", cpp[i], cpp[i]->x); + emitSymRef(sp[i]); + print("\n"); + } +} + +static void I(stabfend)(Symbol p, int lineno) {} +static void I(stabinit)(char *file, int argc, char *argv[]) {} + +/* stabline - emit line number information for source coordinate *cp */ +static void I(stabline)(Coordinate *cp) { + if (cp->file) + print("%s:", cp->file); + print("%d.%d:\n", cp->y, cp->x); +} + +static void I(stabsym)(Symbol p) {} +static void I(stabtype)(Symbol p) {} + +Interface symbolicIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 4, 4, 0, /* T* */ + 0, 4, 0, /* struct */ + 0, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 1, /* left_to_right */ + 1, /* wants_dag */ + 0, /* unsigned_char */ + I(address), + I(blockbeg), + I(blockend), + I(defaddress), + I(defconst), + I(defstring), + I(defsymbol), + I(emit), + I(export), + I(function), + I(gen), + I(global), + I(import), + I(local), + I(progbeg), + I(progend), + I(segment), + I(space), + I(stabblock), + I(stabend), + I(stabfend), + I(stabinit), + I(stabline), + I(stabsym), + I(stabtype) +}; + +Interface symbolic64IR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 8, 8, 0, /* long */ + 8, 8, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 8, 1, /* double */ + 8, 8, 1, /* long double */ + 8, 8, 0, /* T* */ + 0, 1, 0, /* struct */ + 1, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 1, /* left_to_right */ + 1, /* wants_dag */ + 0, /* unsigned_char */ + I(address), + I(blockbeg), + I(blockend), + I(defaddress), + I(defconst), + I(defstring), + I(defsymbol), + I(emit), + I(export), + I(function), + I(gen), + I(global), + I(import), + I(local), + I(progbeg), + I(progend), + I(segment), + I(space), + I(stabblock), + I(stabend), + I(stabfend), + I(stabinit), + I(stabline), + I(stabsym), + I(stabtype) +}; diff --git a/quake3/source/lcc/src/token.h b/quake3/source/lcc/src/token.h new file mode 100644 index 0000000..f92bf6a --- /dev/null +++ b/quake3/source/lcc/src/token.h @@ -0,0 +1,133 @@ +/* +xx(symbol, value, prec, op, optree, kind, string) +*/ +yy(0, 0, 0, 0, 0, 0, 0) +xx(FLOAT, 1, 0, 0, 0, CHAR, "float") +xx(DOUBLE, 2, 0, 0, 0, CHAR, "double") +xx(CHAR, 3, 0, 0, 0, CHAR, "char") +xx(SHORT, 4, 0, 0, 0, CHAR, "short") +xx(INT, 5, 0, 0, 0, CHAR, "int") +xx(UNSIGNED, 6, 0, 0, 0, CHAR, "unsigned") +xx(POINTER, 7, 0, 0, 0, 0, "pointer") +xx(VOID, 8, 0, 0, 0, CHAR, "void") +xx(STRUCT, 9, 0, 0, 0, CHAR, "struct") +xx(UNION, 10, 0, 0, 0, CHAR, "union") +xx(FUNCTION, 11, 0, 0, 0, 0, "function") +xx(ARRAY, 12, 0, 0, 0, 0, "array") +xx(ENUM, 13, 0, 0, 0, CHAR, "enum") +xx(LONG, 14, 0, 0, 0, CHAR, "long") +xx(CONST, 15, 0, 0, 0, CHAR, "const") +xx(VOLATILE, 16, 0, 0, 0, CHAR, "volatile") +yy(0, 17, 0, 0, 0, 0, 0) +yy(0, 18, 0, 0, 0, 0, 0) +yy(0, 19, 0, 0, 0, 0, 0) +yy(0, 20, 0, 0, 0, 0, 0) +yy(0, 21, 0, 0, 0, 0, 0) +yy(0, 22, 0, 0, 0, 0, 0) +yy(0, 23, 0, 0, 0, 0, 0) +yy(0, 24, 0, 0, 0, 0, 0) +yy(0, 25, 0, 0, 0, 0, 0) +yy(0, 26, 0, 0, 0, 0, 0) +yy(0, 27, 0, 0, 0, 0, 0) +yy(0, 28, 0, 0, 0, 0, "long long") +yy(0, 29, 0, 0, 0, 0, 0) +yy(0, 30, 0, 0, 0, 0, 0) +yy(0, 31, 0, 0, 0, 0, "const volatile") +xx(ID, 32, 0, 0, 0, ID, "identifier") +yy(0, 33, 0, 0, 0, ID, "!") +xx(FCON, 34, 0, 0, 0, ID, "floating constant") +xx(ICON, 35, 0, 0, 0, ID, "integer constant") +xx(SCON, 36, 0, 0, 0, ID, "string constant") +yy(0, 37, 13, MOD, bittree,'%', "%") +yy(0, 38, 8, BAND, bittree,ID, "&") +xx(INCR, 39, 0, ADD, addtree,ID, "++") +yy(0, 40, 0, 0, 0, ID, "(") +yy(0, 41, 0, 0, 0, ')', ")") +yy(0, 42, 13, MUL, multree,ID, "*") +yy(0, 43, 12, ADD, addtree,ID, "+") +yy(0, 44, 1, 0, 0, ',', ",") +yy(0, 45, 12, SUB, subtree,ID, "-") +yy(0, 46, 0, 0, 0, '.', ".") +yy(0, 47, 13, DIV, multree,'/', "/") +xx(DECR, 48, 0, SUB, subtree,ID, "--") +xx(DEREF, 49, 0, 0, 0, DEREF, "->") +xx(ANDAND, 50, 5, AND, andtree,ANDAND, "&&") +xx(OROR, 51, 4, OR, andtree,OROR, "||") +xx(LEQ, 52, 10, LE, cmptree,LEQ, "<=") +xx(EQL, 53, 9, EQ, eqtree, EQL, "==") +xx(NEQ, 54, 9, NE, eqtree, NEQ, "!=") +xx(GEQ, 55, 10, GE, cmptree,GEQ, ">=") +xx(RSHIFT, 56, 11, RSH, shtree, RSHIFT, ">>") +xx(LSHIFT, 57, 11, LSH, shtree, LSHIFT, "<<") +yy(0, 58, 0, 0, 0, ':', ":") +yy(0, 59, 0, 0, 0, IF, ";") +yy(0, 60, 10, LT, cmptree,'<', "<") +yy(0, 61, 2, ASGN, asgntree,'=', "=") +yy(0, 62, 10, GT, cmptree,'>', ">") +yy(0, 63, 0, 0, 0, '?', "?") +xx(ELLIPSIS, 64, 0, 0, 0, ELLIPSIS,"...") +xx(SIZEOF, 65, 0, 0, 0, ID, "sizeof") +yy(0, 66, 0, 0, 0, 0, 0) +xx(AUTO, 67, 0, 0, 0, STATIC, "auto") +xx(BREAK, 68, 0, 0, 0, IF, "break") +xx(CASE, 69, 0, 0, 0, IF, "case") +xx(CONTINUE, 70, 0, 0, 0, IF, "continue") +xx(DEFAULT, 71, 0, 0, 0, IF, "default") +xx(DO, 72, 0, 0, 0, IF, "do") +xx(ELSE, 73, 0, 0, 0, IF, "else") +xx(EXTERN, 74, 0, 0, 0, STATIC, "extern") +xx(FOR, 75, 0, 0, 0, IF, "for") +xx(GOTO, 76, 0, 0, 0, IF, "goto") +xx(IF, 77, 0, 0, 0, IF, "if") +xx(REGISTER, 78, 0, 0, 0, STATIC, "register") +xx(RETURN, 79, 0, 0, 0, IF, "return") +xx(SIGNED, 80, 0, 0, 0, CHAR, "signed") +xx(STATIC, 81, 0, 0, 0, STATIC, "static") +xx(SWITCH, 82, 0, 0, 0, IF, "switch") +xx(TYPEDEF, 83, 0, 0, 0, STATIC, "typedef") +xx(WHILE, 84, 0, 0, 0, IF, "while") +xx(TYPECODE, 85, 0, 0, 0, ID, "__typecode") +xx(FIRSTARG, 86, 0, 0, 0, ID, "__firstarg") +yy(0, 87, 0, 0, 0, 0, 0) +yy(0, 88, 0, 0, 0, 0, 0) +yy(0, 89, 0, 0, 0, 0, 0) +yy(0, 90, 0, 0, 0, 0, 0) +yy(0, 91, 0, 0, 0, '[', "[") +yy(0, 92, 0, 0, 0, 0, 0) +yy(0, 93, 0, 0, 0, ']', "]") +yy(0, 94, 7, BXOR, bittree,'^', "^") +yy(0, 95, 0, 0, 0, 0, 0) +yy(0, 96, 0, 0, 0, 0, 0) +yy(0, 97, 0, 0, 0, 0, 0) +yy(0, 98, 0, 0, 0, 0, 0) +yy(0, 99, 0, 0, 0, 0, 0) +yy(0, 100, 0, 0, 0, 0, 0) +yy(0, 101, 0, 0, 0, 0, 0) +yy(0, 102, 0, 0, 0, 0, 0) +yy(0, 103, 0, 0, 0, 0, 0) +yy(0, 104, 0, 0, 0, 0, 0) +yy(0, 105, 0, 0, 0, 0, 0) +yy(0, 106, 0, 0, 0, 0, 0) +yy(0, 107, 0, 0, 0, 0, 0) +yy(0, 108, 0, 0, 0, 0, 0) +yy(0, 109, 0, 0, 0, 0, 0) +yy(0, 110, 0, 0, 0, 0, 0) +yy(0, 111, 0, 0, 0, 0, 0) +yy(0, 112, 0, 0, 0, 0, 0) +yy(0, 113, 0, 0, 0, 0, 0) +yy(0, 114, 0, 0, 0, 0, 0) +yy(0, 115, 0, 0, 0, 0, 0) +yy(0, 116, 0, 0, 0, 0, 0) +yy(0, 117, 0, 0, 0, 0, 0) +yy(0, 118, 0, 0, 0, 0, 0) +yy(0, 119, 0, 0, 0, 0, 0) +yy(0, 120, 0, 0, 0, 0, 0) +yy(0, 121, 0, 0, 0, 0, 0) +yy(0, 122, 0, 0, 0, 0, 0) +yy(0, 123, 0, 0, 0, IF, "{") +yy(0, 124, 6, BOR, bittree,'|', "|") +yy(0, 125, 0, 0, 0, '}', "}") +yy(0, 126, 0, BCOM, 0, ID, "~") +xx(EOI, 127, 0, 0, 0, EOI, "end of input") +#undef xx +#undef yy diff --git a/quake3/source/lcc/src/trace.c b/quake3/source/lcc/src/trace.c new file mode 100644 index 0000000..55b18a1 --- /dev/null +++ b/quake3/source/lcc/src/trace.c @@ -0,0 +1,180 @@ +#include "c.h" + + +static char *fmt, *fp, *fmtend; /* format string, current & limit pointer */ +static Tree args; /* printf arguments */ +static Symbol frameno; /* local holding frame number */ + +/* appendstr - append str to the evolving format string, expanding it if necessary */ +static void appendstr(char *str) { + do + if (fp == fmtend) + if (fp) { + char *s = allocate(2*(fmtend - fmt), FUNC); + strncpy(s, fmt, fmtend - fmt); + fp = s + (fmtend - fmt); + fmtend = s + 2*(fmtend - fmt); + fmt = s; + } else { + fp = fmt = allocate(80, FUNC); + fmtend = fmt + 80; + } + while ((*fp++ = *str++) != 0); + fp--; +} + +/* tracevalue - append format and argument to print the value of e */ +static void tracevalue(Tree e, int lev) { + Type ty = unqual(e->type); + + switch (ty->op) { + case INT: + if (ty == chartype || ty == signedchar) + appendstr("'\\x%02x'"); + else if (ty == longtype) + appendstr("0x%ld"); + else + appendstr("0x%d"); + break; + case UNSIGNED: + if (ty == chartype || ty == unsignedchar) + appendstr("'\\x%02x'"); + else if (ty == unsignedlong) + appendstr("0x%lx"); + else + appendstr("0x%x"); + break; + case FLOAT: + if (ty == longdouble) + appendstr("%Lg"); + else + appendstr("%g"); + break; + case POINTER: + if (unqual(ty->type) == chartype + || unqual(ty->type) == signedchar + || unqual(ty->type) == unsignedchar) { + static Symbol null; + if (null == NULL) + null = mkstr("(null)"); + tracevalue(cast(e, unsignedtype), lev + 1); + appendstr(" \"%.30s\""); + e = condtree(e, e, pointer(idtree(null->u.c.loc))); + } else { + appendstr("("); appendstr(typestring(ty, "")); appendstr(")0x%x"); + } + break; + case STRUCT: { + Field q; + appendstr("("); appendstr(typestring(ty, "")); appendstr("){"); + for (q = ty->u.sym->u.s.flist; q; q = q->link) { + appendstr(q->name); appendstr("="); + tracevalue(field(addrof(e), q->name), lev + 1); + if (q->link) + appendstr(","); + } + appendstr("}"); + return; + } + case UNION: + appendstr("("); appendstr(typestring(ty, "")); appendstr("){...}"); + return; + case ARRAY: + if (lev && ty->type->size > 0) { + int i; + e = pointer(e); + appendstr("{"); + for (i = 0; i < ty->size/ty->type->size; i++) { + Tree p = (*optree['+'])(ADD, e, consttree(i, inttype)); + if (isptr(p->type) && isarray(p->type->type)) + p = retype(p, p->type->type); + else + p = rvalue(p); + if (i) + appendstr(","); + tracevalue(p, lev + 1); + } + appendstr("}"); + } else + appendstr(typestring(ty, "")); + return; + default: + assert(0); + } + e = cast(e, promote(ty)); + args = tree(mkop(ARG,e->type), e->type, e, args); +} + +/* tracefinis - complete & generate the trace call to print */ +static void tracefinis(Symbol printer) { + Tree *ap; + Symbol p; + + *fp = 0; + p = mkstr(string(fmt)); + for (ap = &args; *ap; ap = &(*ap)->kids[1]) + ; + *ap = tree(ARG+P, charptype, pointer(idtree(p->u.c.loc)), 0); + walk(calltree(pointer(idtree(printer)), freturn(printer->type), args, NULL), 0, 0); + args = 0; + fp = fmtend = 0; +} + +/* tracecall - generate code to trace entry to f */ +static void tracecall(Symbol printer, Symbol f) { + int i; + Symbol counter = genident(STATIC, inttype, GLOBAL); + + defglobal(counter, BSS); + (*IR->space)(counter->type->size); + frameno = genident(AUTO, inttype, level); + addlocal(frameno); + appendstr(f->name); appendstr("#"); + tracevalue(asgn(frameno, incr(INCR, idtree(counter), consttree(1, inttype))), 0); + appendstr("("); + for (i = 0; f->u.f.callee[i]; i++) { + if (i) + appendstr(","); + appendstr(f->u.f.callee[i]->name); appendstr("="); + tracevalue(idtree(f->u.f.callee[i]), 0); + } + if (variadic(f->type)) + appendstr(",..."); + appendstr(") called\n"); + tracefinis(printer); +} + +/* tracereturn - generate code to trace return e */ +static void tracereturn(Symbol printer, Symbol f, Tree e) { + appendstr(f->name); appendstr("#"); + tracevalue(idtree(frameno), 0); + appendstr(" returned"); + if (freturn(f->type) != voidtype && e) { + appendstr(" "); + tracevalue(e, 0); + } + appendstr("\n"); + tracefinis(printer); +} + +/* trace_init - initialize for tracing */ +void trace_init(int argc, char *argv[]) { + int i; + static int inited; + + if (inited) + return; + inited = 1; + type_init(argc, argv); + if (IR) + for (i = 1; i < argc; i++) + if (strncmp(argv[i], "-t", 2) == 0 && strchr(argv[i], '=') == NULL) { + Symbol printer = mksymbol(EXTERN, + argv[i][2] ? &argv[i][2] : "printf", + ftype(inttype, ptr(qual(CONST, chartype)))); + printer->defined = 0; + attach((Apply)tracecall, printer, &events.entry); + attach((Apply)tracereturn, printer, &events.returns); + break; + } +} diff --git a/quake3/source/lcc/src/tree.c b/quake3/source/lcc/src/tree.c new file mode 100644 index 0000000..1f5b49c --- /dev/null +++ b/quake3/source/lcc/src/tree.c @@ -0,0 +1,223 @@ +#include "c.h" + + +int where = STMT; +static int warn; +static int nid = 1; /* identifies trees & nodes in debugging output */ +static struct nodeid { + int printed; + Tree node; +} ids[500]; /* if ids[i].node == p, then p's id is i */ + +static void printtree1(Tree, int, int); + +Tree tree(int op, Type type, Tree left, Tree right) { + Tree p; + + NEW0(p, where); + p->op = op; + p->type = type; + p->kids[0] = left; + p->kids[1] = right; + return p; +} + +Tree texpr(Tree (*f)(int), int tok, int a) { + int save = where; + Tree p; + + where = a; + p = (*f)(tok); + where = save; + return p; +} +static Tree root1(Tree p) { + if (p == NULL) + return p; + if (p->type == voidtype) + warn++; + switch (generic(p->op)) { + case COND: { + Tree q = p->kids[1]; + assert(q && q->op == RIGHT); + if (p->u.sym && q->kids[0] && generic(q->kids[0]->op) == ASGN) + q->kids[0] = root1(q->kids[0]->kids[1]); + else + q->kids[0] = root1(q->kids[0]); + if (p->u.sym && q->kids[1] && generic(q->kids[1]->op) == ASGN) + q->kids[1] = root1(q->kids[1]->kids[1]); + else + q->kids[1] = root1(q->kids[1]); + p->u.sym = 0; + if (q->kids[0] == 0 && q->kids[1] == 0) + p = root1(p->kids[0]); + } + break; + case AND: case OR: + if ((p->kids[1] = root1(p->kids[1])) == 0) + p = root1(p->kids[0]); + break; + case NOT: + if (warn++ == 0) + warning("expression with no effect elided\n"); + return root1(p->kids[0]); + case RIGHT: + if (p->kids[1] == 0) + return root1(p->kids[0]); + if (p->kids[0] && p->kids[0]->op == CALL+B + && p->kids[1] && p->kids[1]->op == INDIR+B) + /* avoid premature release of the CALL+B temporary */ + return p->kids[0]; + if (p->kids[0] && p->kids[0]->op == RIGHT + && p->kids[1] == p->kids[0]->kids[0]) + /* de-construct e++ construction */ + return p->kids[0]->kids[1]; + p = tree(RIGHT, p->type, root1(p->kids[0]), root1(p->kids[1])); + return p->kids[0] || p->kids[1] ? p : (Tree)0; + case EQ: case NE: case GT: case GE: case LE: case LT: + case ADD: case SUB: case MUL: case DIV: case MOD: + case LSH: case RSH: case BAND: case BOR: case BXOR: + if (warn++ == 0) + warning("expression with no effect elided\n"); + p = tree(RIGHT, p->type, root1(p->kids[0]), root1(p->kids[1])); + return p->kids[0] || p->kids[1] ? p : (Tree)0; + case INDIR: + if (p->type->size == 0 && unqual(p->type) != voidtype) + warning("reference to `%t' elided\n", p->type); + if (isptr(p->kids[0]->type) && isvolatile(p->kids[0]->type->type)) + warning("reference to `volatile %t' elided\n", p->type); + /* fall thru */ + case CVI: case CVF: case CVU: case CVP: + case NEG: case BCOM: case FIELD: + if (warn++ == 0) + warning("expression with no effect elided\n"); + return root1(p->kids[0]); + case ADDRL: case ADDRG: case ADDRF: case CNST: + if (needconst) + return p; + if (warn++ == 0) + warning("expression with no effect elided\n"); + return NULL; + case ARG: case ASGN: case CALL: case JUMP: case LABEL: + break; + default: assert(0); + } + return p; +} + +Tree root(Tree p) { + warn = 0; + return root1(p); +} + +char *opname(int op) { + static char *opnames[] = { + "", + "CNST", + "ARG", + "ASGN", + "INDIR", + "CVC", + "CVD", + "CVF", + "CVI", + "CVP", + "CVS", + "CVU", + "NEG", + "CALL", + "*LOAD*", + "RET", + "ADDRG", + "ADDRF", + "ADDRL", + "ADD", + "SUB", + "LSH", + "MOD", + "RSH", + "BAND", + "BCOM", + "BOR", + "BXOR", + "DIV", + "MUL", + "EQ", + "GE", + "GT", + "LE", + "LT", + "NE", + "JUMP", + "LABEL", + "AND", + "NOT", + "OR", + "COND", + "RIGHT", + "FIELD" + }, *suffixes[] = { + "0", "F", "D", "C", "S", "I", "U", "P", "V", "B", + "10","11","12","13","14","15" + }; + + if (generic(op) >= AND && generic(op) <= FIELD && opsize(op) == 0) + return opnames[opindex(op)]; + return stringf("%s%s%s", + opindex(op) > 0 && opindex(op) < NELEMS(opnames) ? + opnames[opindex(op)] : stringd(opindex(op)), + suffixes[optype(op)], opsize(op) > 0 ? stringd(opsize(op)) : ""); +} + +int nodeid(Tree p) { + int i = 1; + + ids[nid].node = p; + while (ids[i].node != p) + i++; + if (i == nid) + ids[nid++].printed = 0; + return i; +} + +/* printed - return pointer to ids[id].printed */ +int *printed(int id) { + if (id) + return &ids[id].printed; + nid = 1; + return 0; +} + +/* printtree - print tree p on fd */ +void printtree(Tree p, int fd) { + (void)printed(0); + printtree1(p, fd, 1); +} + +/* printtree1 - recursively print tree p */ +static void printtree1(Tree p, int fd, int lev) { + FILE *f = fd == 1 ? stdout : stderr; + int i; + static char blanks[] = " "; + + if (p == 0 || *printed(i = nodeid(p))) + return; + fprint(f, "#%d%S%S", i, blanks, i < 10 ? 2 : i < 100 ? 1 : 0, blanks, lev); + fprint(f, "%s %t", opname(p->op), p->type); + *printed(i) = 1; + for (i = 0; i < NELEMS(p->kids); i++) + if (p->kids[i]) + fprint(f, " #%d", nodeid(p->kids[i])); + if (p->op == FIELD && p->u.field) + fprint(f, " %s %d..%d", p->u.field->name, + fieldsize(p->u.field) + fieldright(p->u.field), fieldright(p->u.field)); + else if (generic(p->op) == CNST) + fprint(f, " %s", vtoa(p->type, p->u.v)); + else if (p->u.sym) + fprint(f, " %s", p->u.sym->name); + if (p->node) + fprint(f, " node=%p", p->node); + fprint(f, "\n"); + for (i = 0; i < NELEMS(p->kids); i++) + printtree1(p->kids[i], fd, lev + 1); +} diff --git a/quake3/source/lcc/src/types.c b/quake3/source/lcc/src/types.c new file mode 100644 index 0000000..eead3e1 --- /dev/null +++ b/quake3/source/lcc/src/types.c @@ -0,0 +1,748 @@ +#include "c.h" +#include + + +static Field isfield(const char *, Field); +static Type type(int, Type, int, int, void *); + +static struct entry { + struct type type; + struct entry *link; +} *typetable[128]; +static int maxlevel; + +static Symbol pointersym; + +Type chartype; /* char */ +Type doubletype; /* double */ +Type floattype; /* float */ +Type inttype; /* signed int */ +Type longdouble; /* long double */ +Type longtype; /* long */ +Type longlong; /* long long */ +Type shorttype; /* signed short int */ +Type signedchar; /* signed char */ +Type unsignedchar; /* unsigned char */ +Type unsignedlong; /* unsigned long int */ +Type unsignedlonglong; /* unsigned long long int */ +Type unsignedshort; /* unsigned short int */ +Type unsignedtype; /* unsigned int */ +Type funcptype; /* void (*)() */ +Type charptype; /* char* */ +Type voidptype; /* void* */ +Type voidtype; /* basic types: void */ +Type unsignedptr; /* unsigned type to hold void* */ +Type signedptr; /* signed type to hold void* */ +Type widechar; /* unsigned type that represents wchar_t */ + +static Type xxinit(int op, char *name, Metrics m) { + Symbol p = install(string(name), &types, GLOBAL, PERM); + Type ty = type(op, 0, m.size, m.align, p); + + assert(ty->align == 0 || ty->size%ty->align == 0); + p->type = ty; + p->addressed = m.outofline; + switch (ty->op) { + case INT: + p->u.limits.max.i = ones(8*ty->size)>>1; + p->u.limits.min.i = -p->u.limits.max.i - 1; + break; + case UNSIGNED: + p->u.limits.max.u = ones(8*ty->size); + p->u.limits.min.u = 0; + break; + case FLOAT: + if (ty->size == sizeof (float)) + p->u.limits.max.d = FLT_MAX; + else if (ty->size == sizeof (double)) + p->u.limits.max.d = DBL_MAX; + else + p->u.limits.max.d = LDBL_MAX; + p->u.limits.min.d = -p->u.limits.max.d; + break; + default: assert(0); + } + return ty; +} +static Type type(int op, Type ty, int size, int align, void *sym) { + unsigned h = (op^((unsigned long)ty>>3)) +&(NELEMS(typetable)-1); + struct entry *tn; + + if (op != FUNCTION && (op != ARRAY || size > 0)) + for (tn = typetable[h]; tn; tn = tn->link) + if (tn->type.op == op && tn->type.type == ty + && tn->type.size == size && tn->type.align == align + && tn->type.u.sym == sym) + return &tn->type; + NEW0(tn, PERM); + tn->type.op = op; + tn->type.type = ty; + tn->type.size = size; + tn->type.align = align; + tn->type.u.sym = sym; + tn->link = typetable[h]; + typetable[h] = tn; + return &tn->type; +} +void type_init(int argc, char *argv[]) { + static int inited; + int i; + + if (inited) + return; + inited = 1; + if (!IR) + return; + for (i = 1; i < argc; i++) { + int size, align, outofline; + if (strncmp(argv[i], "-unsigned_char=", 15) == 0) + IR->unsigned_char = argv[i][15] - '0'; +#define xx(name) \ + else if (sscanf(argv[i], "-" #name "=%d,%d,%d", &size, &align, &outofline) == 3) { \ + IR->name.size = size; IR->name.align = align; \ + IR->name.outofline = outofline; } + xx(charmetric) + xx(shortmetric) + xx(intmetric) + xx(longmetric) + xx(longlongmetric) + xx(floatmetric) + xx(doublemetric) + xx(longdoublemetric) + xx(ptrmetric) + xx(structmetric) +#undef xx + } +#define xx(v,name,op,metrics) v=xxinit(op,name,IR->metrics) + xx(chartype, "char", IR->unsigned_char ? UNSIGNED : INT,charmetric); + xx(doubletype, "double", FLOAT, doublemetric); + xx(floattype, "float", FLOAT, floatmetric); + xx(inttype, "int", INT, intmetric); + xx(longdouble, "long double", FLOAT, longdoublemetric); + xx(longtype, "long int", INT, longmetric); + xx(longlong, "long long int", INT, longlongmetric); + xx(shorttype, "short", INT, shortmetric); + xx(signedchar, "signed char", INT, charmetric); + xx(unsignedchar, "unsigned char", UNSIGNED,charmetric); + xx(unsignedlong, "unsigned long", UNSIGNED,longmetric); + xx(unsignedshort, "unsigned short", UNSIGNED,shortmetric); + xx(unsignedtype, "unsigned int", UNSIGNED,intmetric); + xx(unsignedlonglong,"unsigned long long",UNSIGNED,longlongmetric); +#undef xx + { + Symbol p; + p = install(string("void"), &types, GLOBAL, PERM); + voidtype = type(VOID, NULL, 0, 0, p); + p->type = voidtype; + } + pointersym = install(string("T*"), &types, GLOBAL, PERM); + pointersym->addressed = IR->ptrmetric.outofline; + pointersym->u.limits.max.p = (void*)ones(8*IR->ptrmetric.size); + pointersym->u.limits.min.p = 0; + voidptype = ptr(voidtype); + funcptype = ptr(func(voidtype, NULL, 1)); + charptype = ptr(chartype); +#define xx(v,t) if (v==NULL && t->size==voidptype->size && t->align==voidptype->align) v=t + xx(unsignedptr,unsignedshort); + xx(unsignedptr,unsignedtype); + xx(unsignedptr,unsignedlong); + xx(unsignedptr,unsignedlonglong); + if (unsignedptr == NULL) + unsignedptr = type(UNSIGNED, NULL, voidptype->size, voidptype->align, voidptype->u.sym); + xx(signedptr,shorttype); + xx(signedptr,inttype); + xx(signedptr,longtype); + xx(signedptr,longlong); + if (signedptr == NULL) + signedptr = type(INT, NULL, voidptype->size, voidptype->align, voidptype->u.sym); +#undef xx + widechar = unsignedshort; + for (i = 0; i < argc; i++) { +#define xx(name,type) \ + if (strcmp(argv[i], "-wchar_t=" #name) == 0) \ + widechar = type; + xx(unsigned_char,unsignedchar) + xx(unsigned_int,unsignedtype) + xx(unsigned_short,unsignedshort) + } +#undef xx +} +void rmtypes(int lev) { + if (maxlevel >= lev) { + int i; + maxlevel = 0; + for (i = 0; i < NELEMS(typetable); i++) { + struct entry *tn, **tq = &typetable[i]; + while ((tn = *tq) != NULL) + if (tn->type.op == FUNCTION) + tq = &tn->link; + else if (tn->type.u.sym && tn->type.u.sym->scope >= lev) + *tq = tn->link; + else { + if (tn->type.u.sym && tn->type.u.sym->scope > maxlevel) + maxlevel = tn->type.u.sym->scope; + tq = &tn->link; + } + + } + } +} +Type ptr(Type ty) { + return type(POINTER, ty, IR->ptrmetric.size, + IR->ptrmetric.align, pointersym); +} +Type deref(Type ty) { + if (isptr(ty)) + ty = ty->type; + else + error("type error: %s\n", "pointer expected"); + return isenum(ty) ? unqual(ty)->type : ty; +} +Type array(Type ty, int n, int a) { + assert(ty); + if (isfunc(ty)) { + error("illegal type `array of %t'\n", ty); + return array(inttype, n, 0); + } + if (isarray(ty) && ty->size == 0) + error("missing array size\n"); + if (ty->size == 0) { + if (unqual(ty) == voidtype) + error("illegal type `array of %t'\n", ty); + else if (Aflag >= 2) + warning("declaring type array of %t' is undefined\n", ty); + + } else if (n > INT_MAX/ty->size) { + error("size of `array of %t' exceeds %d bytes\n", + ty, INT_MAX); + n = 1; + } + return type(ARRAY, ty, n*ty->size, + a ? a : ty->align, NULL); +} +Type atop(Type ty) { + if (isarray(ty)) + return ptr(ty->type); + error("type error: %s\n", "array expected"); + return ptr(ty); +} +Type qual(int op, Type ty) { + if (isarray(ty)) + ty = type(ARRAY, qual(op, ty->type), ty->size, + ty->align, NULL); + else if (isfunc(ty)) + warning("qualified function type ignored\n"); + else if (isconst(ty) && op == CONST + || isvolatile(ty) && op == VOLATILE) + error("illegal type `%k %t'\n", op, ty); + else { + if (isqual(ty)) { + op += ty->op; + ty = ty->type; + } + ty = type(op, ty, ty->size, ty->align, NULL); + } + return ty; +} +Type func(Type ty, Type *proto, int style) { + if (ty && (isarray(ty) || isfunc(ty))) + error("illegal return type `%t'\n", ty); + ty = type(FUNCTION, ty, 0, 0, NULL); + ty->u.f.proto = proto; + ty->u.f.oldstyle = style; + return ty; +} +Type freturn(Type ty) { + if (isfunc(ty)) + return ty->type; + error("type error: %s\n", "function expected"); + return inttype; +} +int variadic(Type ty) { + if (isfunc(ty) && ty->u.f.proto) { + int i; + for (i = 0; ty->u.f.proto[i]; i++) + ; + return i > 1 && ty->u.f.proto[i-1] == voidtype; + } + return 0; +} +Type newstruct(int op, char *tag) { + Symbol p; + + assert(tag); + if (*tag == 0) + tag = stringd(genlabel(1)); + else + if ((p = lookup(tag, types)) != NULL && (p->scope == level + || p->scope == PARAM && level == PARAM+1)) { + if (p->type->op == op && !p->defined) + return p->type; + error("redefinition of `%s' previously defined at %w\n", + p->name, &p->src); + } + p = install(tag, &types, level, PERM); + p->type = type(op, NULL, 0, 0, p); + if (p->scope > maxlevel) + maxlevel = p->scope; + p->src = src; + return p->type; +} +Field newfield(char *name, Type ty, Type fty) { + Field p, *q = &ty->u.sym->u.s.flist; + + if (name == NULL) + name = stringd(genlabel(1)); + for (p = *q; p; q = &p->link, p = *q) + if (p->name == name) + error("duplicate field name `%s' in `%t'\n", + name, ty); + NEW0(p, PERM); + *q = p; + p->name = name; + p->type = fty; + if (xref) { /* omit */ + if (ty->u.sym->u.s.ftab == NULL) /* omit */ + ty->u.sym->u.s.ftab = table(NULL, level); /* omit */ + install(name, &ty->u.sym->u.s.ftab, 0, PERM)->src = src;/* omit */ + } /* omit */ + return p; +} +int eqtype(Type ty1, Type ty2, int ret) { + if (ty1 == ty2) + return 1; + if (ty1->op != ty2->op) + return 0; + switch (ty1->op) { + case ENUM: case UNION: case STRUCT: + case UNSIGNED: case INT: case FLOAT: + return 0; + case POINTER: return eqtype(ty1->type, ty2->type, 1); + case VOLATILE: case CONST+VOLATILE: + case CONST: return eqtype(ty1->type, ty2->type, 1); + case ARRAY: if (eqtype(ty1->type, ty2->type, 1)) { + if (ty1->size == ty2->size) + return 1; + if (ty1->size == 0 || ty2->size == 0) + return ret; + } + return 0; + case FUNCTION: if (eqtype(ty1->type, ty2->type, 1)) { + Type *p1 = ty1->u.f.proto, *p2 = ty2->u.f.proto; + if (p1 == p2) + return 1; + if (p1 && p2) { + for ( ; *p1 && *p2; p1++, p2++) + if (eqtype(unqual(*p1), unqual(*p2), 1) == 0) + return 0; + if (*p1 == NULL && *p2 == NULL) + return 1; + } else { + if (variadic(p1 ? ty1 : ty2)) + return 0; + if (p1 == NULL) + p1 = p2; + for ( ; *p1; p1++) { + Type ty = unqual(*p1); + if (promote(ty) != (isenum(ty) ? ty->type : ty)) + return 0; + } + return 1; + } + } + return 0; + } + assert(0); return 0; +} +Type promote(Type ty) { + ty = unqual(ty); + switch (ty->op) { + case ENUM: + return inttype; + case INT: + if (ty->size < inttype->size) + return inttype; + break; + case UNSIGNED: + if (ty->size < inttype->size) + return inttype; + if (ty->size < unsignedtype->size) + return unsignedtype; + break; + case FLOAT: + if (ty->size < doubletype->size) + return doubletype; + } + return ty; +} +Type signedint(Type ty) { + if (ty->op == INT) + return ty; + assert(ty->op == UNSIGNED); +#define xx(t) if (ty->size == t->size) return t + xx(inttype); + xx(longtype); + xx(longlong); +#undef xx + assert(0); return NULL; +} +Type compose(Type ty1, Type ty2) { + if (ty1 == ty2) + return ty1; + assert(ty1->op == ty2->op); + switch (ty1->op) { + case POINTER: + return ptr(compose(ty1->type, ty2->type)); + case CONST+VOLATILE: + return qual(CONST, qual(VOLATILE, + compose(ty1->type, ty2->type))); + case CONST: case VOLATILE: + return qual(ty1->op, compose(ty1->type, ty2->type)); + case ARRAY: { Type ty = compose(ty1->type, ty2->type); + if (ty1->size && (ty1->type->size && ty2->size == 0 || ty1->size == ty2->size)) + return array(ty, ty1->size/ty1->type->size, ty1->align); + if (ty2->size && ty2->type->size && ty1->size == 0) + return array(ty, ty2->size/ty2->type->size, ty2->align); + return array(ty, 0, 0); } + case FUNCTION: { Type *p1 = ty1->u.f.proto, *p2 = ty2->u.f.proto; + Type ty = compose(ty1->type, ty2->type); + List tlist = NULL; + if (p1 == NULL && p2 == NULL) + return func(ty, NULL, 1); + if (p1 && p2 == NULL) + return func(ty, p1, ty1->u.f.oldstyle); + if (p2 && p1 == NULL) + return func(ty, p2, ty2->u.f.oldstyle); + for ( ; *p1 && *p2; p1++, p2++) { + Type ty = compose(unqual(*p1), unqual(*p2)); + if (isconst(*p1) || isconst(*p2)) + ty = qual(CONST, ty); + if (isvolatile(*p1) || isvolatile(*p2)) + ty = qual(VOLATILE, ty); + tlist = append(ty, tlist); + } + assert(*p1 == NULL && *p2 == NULL); + return func(ty, ltov(&tlist, PERM), 0); } + } + assert(0); return NULL; +} +int ttob(Type ty) { + switch (ty->op) { + case CONST: case VOLATILE: case CONST+VOLATILE: + return ttob(ty->type); + case VOID: case INT: case UNSIGNED: case FLOAT: + return ty->op + sizeop(ty->size); + case POINTER: + return POINTER + sizeop(voidptype->size); + case FUNCTION: + return POINTER + sizeop(funcptype->size); + case ARRAY: case STRUCT: case UNION: + return STRUCT; + case ENUM: + return INT + sizeop(inttype->size); + } + assert(0); return INT; +} +Type btot(int op, int size) { +#define xx(ty) if (size == (ty)->size) return ty; + switch (optype(op)) { + case F: + xx(floattype); + xx(doubletype); + xx(longdouble); + assert(0); return 0; + case I: + if (chartype->op == INT) + xx(chartype); + xx(signedchar); + xx(shorttype); + xx(inttype); + xx(longtype); + xx(longlong); + assert(0); return 0; + case U: + if (chartype->op == UNSIGNED) + xx(chartype); + xx(unsignedchar); + xx(unsignedshort); + xx(unsignedtype); + xx(unsignedlong); + xx(unsignedlonglong); + assert(0); return 0; + case P: + xx(voidptype); + xx(funcptype); + assert(0); return 0; + } +#undef xx + assert(0); return 0; +} +int hasproto(Type ty) { + if (ty == 0) + return 1; + switch (ty->op) { + case CONST: case VOLATILE: case CONST+VOLATILE: case POINTER: + case ARRAY: + return hasproto(ty->type); + case FUNCTION: + return hasproto(ty->type) && ty->u.f.proto; + case STRUCT: case UNION: + case VOID: case FLOAT: case ENUM: case INT: case UNSIGNED: + return 1; + } + assert(0); return 0; +} +/* fieldlist - construct a flat list of fields in type ty */ +Field fieldlist(Type ty) { + return ty->u.sym->u.s.flist; +} + +/* fieldref - find field name of type ty, return entry */ +Field fieldref(const char *name, Type ty) { + Field p = isfield(name, unqual(ty)->u.sym->u.s.flist); + + if (p && xref) { + Symbol q; + assert(unqual(ty)->u.sym->u.s.ftab); + q = lookup(name, unqual(ty)->u.sym->u.s.ftab); + assert(q); + use(q, src); + } + return p; +} + +/* ftype - return a function type for rty function (ty,...)' */ +Type ftype(Type rty, Type ty) { + List list = append(ty, NULL); + + list = append(voidtype, list); + return func(rty, ltov(&list, PERM), 0); +} + +/* isfield - if name is a field in flist, return pointer to the field structure */ +static Field isfield(const char *name, Field flist) { + for ( ; flist; flist = flist->link) + if (flist->name == name) + break; + return flist; +} + +/* outtype - output type ty */ +void outtype(Type ty, FILE *f) { + switch (ty->op) { + case CONST+VOLATILE: case CONST: case VOLATILE: + fprint(f, "%k %t", ty->op, ty->type); + break; + case STRUCT: case UNION: case ENUM: + assert(ty->u.sym); + if (ty->size == 0) + fprint(f, "incomplete "); + assert(ty->u.sym->name); + if (*ty->u.sym->name >= '1' && *ty->u.sym->name <= '9') { + Symbol p = findtype(ty); + if (p == 0) + fprint(f, "%k defined at %w", ty->op, &ty->u.sym->src); + else + fprint(f, p->name); + } else { + fprint(f, "%k %s", ty->op, ty->u.sym->name); + if (ty->size == 0) + fprint(f, " defined at %w", &ty->u.sym->src); + } + break; + case VOID: case FLOAT: case INT: case UNSIGNED: + fprint(f, ty->u.sym->name); + break; + case POINTER: + fprint(f, "pointer to %t", ty->type); + break; + case FUNCTION: + fprint(f, "%t function", ty->type); + if (ty->u.f.proto && ty->u.f.proto[0]) { + int i; + fprint(f, "(%t", ty->u.f.proto[0]); + for (i = 1; ty->u.f.proto[i]; i++) + if (ty->u.f.proto[i] == voidtype) + fprint(f, ",..."); + else + fprint(f, ",%t", ty->u.f.proto[i]); + fprint(f, ")"); + } else if (ty->u.f.proto && ty->u.f.proto[0] == 0) + fprint(f, "(void)"); + + break; + case ARRAY: + if (ty->size > 0 && ty->type && ty->type->size > 0) { + fprint(f, "array %d", ty->size/ty->type->size); + while (ty->type && isarray(ty->type) && ty->type->type->size > 0) { + ty = ty->type; + fprint(f, ",%d", ty->size/ty->type->size); + } + } else + fprint(f, "incomplete array"); + if (ty->type) + fprint(f, " of %t", ty->type); + break; + default: assert(0); + } +} + +/* printdecl - output a C declaration for symbol p of type ty */ +void printdecl(Symbol p, Type ty) { + switch (p->sclass) { + case AUTO: + fprint(stderr, "%s;\n", typestring(ty, p->name)); + break; + case STATIC: case EXTERN: + fprint(stderr, "%k %s;\n", p->sclass, typestring(ty, p->name)); + break; + case TYPEDEF: case ENUM: + break; + default: assert(0); + } +} + +/* printproto - output a prototype declaration for function p */ +void printproto(Symbol p, Symbol callee[]) { + if (p->type->u.f.proto) + printdecl(p, p->type); + else { + int i; + List list = 0; + if (callee[0] == 0) + list = append(voidtype, list); + else + for (i = 0; callee[i]; i++) + list = append(callee[i]->type, list); + printdecl(p, func(freturn(p->type), ltov(&list, PERM), 0)); + } +} + +/* prtype - print details of type ty on f with given indent */ +static void prtype(Type ty, FILE *f, int indent, unsigned mark) { + switch (ty->op) { + default: + fprint(f, "(%d %d %d [%p])", ty->op, ty->size, ty->align, ty->u.sym); + break; + case FLOAT: case INT: case UNSIGNED: case VOID: + fprint(f, "(%k %d %d [\"%s\"])", ty->op, ty->size, ty->align, ty->u.sym->name); + break; + case CONST+VOLATILE: case CONST: case VOLATILE: case POINTER: case ARRAY: + fprint(f, "(%k %d %d ", ty->op, ty->size, ty->align); + prtype(ty->type, f, indent+1, mark); + fprint(f, ")"); + break; + case STRUCT: case UNION: + fprint(f, "(%k %d %d [\"%s\"]", ty->op, ty->size, ty->align, ty->u.sym->name); + if (ty->x.marked != mark) { + Field p; + ty->x.marked = mark; + for (p = ty->u.sym->u.s.flist; p; p = p->link) { + fprint(f, "\n%I", indent+1); + prtype(p->type, f, indent+1, mark); + fprint(f, " %s@%d", p->name, p->offset); + if (p->lsb) + fprint(f, ":%d..%d", + fieldsize(p) + fieldright(p), fieldright(p)); + } + fprint(f, "\n%I", indent); + } + fprint(f, ")"); + break; + case ENUM: + fprint(f, "(%k %d %d [\"%s\"]", ty->op, ty->size, ty->align, ty->u.sym->name); + if (ty->x.marked != mark) { + int i; + Symbol *p = ty->u.sym->u.idlist; + ty->x.marked = mark; + for (i = 0; p[i] != NULL; i++) + fprint(f, "%I%s=%d\n", indent+1, p[i]->name, p[i]->u.value); + } + fprint(f, ")"); + break; + case FUNCTION: + fprint(f, "(%k %d %d ", ty->op, ty->size, ty->align); + prtype(ty->type, f, indent+1, mark); + if (ty->u.f.proto) { + int i; + fprint(f, "\n%I{", indent+1); + for (i = 0; ty->u.f.proto[i]; i++) { + if (i > 0) + fprint(f, "%I", indent+2); + prtype(ty->u.f.proto[i], f, indent+2, mark); + fprint(f, "\n"); + } + fprint(f, "%I}", indent+1); + } + fprint(f, ")"); + break; + } +} + +/* printtype - print details of type ty on fd */ +void printtype(Type ty, int fd) { + static unsigned mark; + prtype(ty, fd == 1 ? stdout : stderr, 0, ++mark); + fprint(fd == 1 ? stdout : stderr, "\n"); +} + +/* typestring - return ty as C declaration for str, which may be "" */ +char *typestring(Type ty, char *str) { + for ( ; ty; ty = ty->type) { + Symbol p; + switch (ty->op) { + case CONST+VOLATILE: case CONST: case VOLATILE: + if (isptr(ty->type)) + str = stringf("%k %s", ty->op, str); + else + return stringf("%k %s", ty->op, typestring(ty->type, str)); + break; + case STRUCT: case UNION: case ENUM: + assert(ty->u.sym); + if ((p = findtype(ty)) != NULL) + return *str ? stringf("%s %s", p->name, str) : p->name; + if (*ty->u.sym->name >= '1' && *ty->u.sym->name <= '9') + warning("unnamed %k in prototype\n", ty->op); + if (*str) + return stringf("%k %s %s", ty->op, ty->u.sym->name, str); + else + return stringf("%k %s", ty->op, ty->u.sym->name); + case VOID: case FLOAT: case INT: case UNSIGNED: + return *str ? stringf("%s %s", ty->u.sym->name, str) : ty->u.sym->name; + case POINTER: + if (!ischar(ty->type) && (p = findtype(ty)) != NULL) + return *str ? stringf("%s %s", p->name, str) : p->name; + str = stringf(isarray(ty->type) || isfunc(ty->type) ? "(*%s)" : "*%s", str); + break; + case FUNCTION: + if ((p = findtype(ty)) != NULL) + return *str ? stringf("%s %s", p->name, str) : p->name; + if (ty->u.f.proto == 0) + str = stringf("%s()", str); + else if (ty->u.f.proto[0]) { + int i; + str = stringf("%s(%s", str, typestring(ty->u.f.proto[0], "")); + for (i = 1; ty->u.f.proto[i]; i++) + if (ty->u.f.proto[i] == voidtype) + str = stringf("%s, ...", str); + else + str = stringf("%s, %s", str, typestring(ty->u.f.proto[i], "")); + str = stringf("%s)", str); + } else + str = stringf("%s(void)", str); + break; + case ARRAY: + if ((p = findtype(ty)) != NULL) + return *str ? stringf("%s %s", p->name, str) : p->name; + if (ty->type && ty->type->size > 0) + str = stringf("%s[%d]", str, ty->size/ty->type->size); + else + str = stringf("%s[]", str); + break; + default: assert(0); + } + } + assert(0); return 0; +} + diff --git a/quake3/source/lcc/src/x86.md b/quake3/source/lcc/src/x86.md new file mode 100644 index 0000000..427f790 --- /dev/null +++ b/quake3/source/lcc/src/x86.md @@ -0,0 +1,998 @@ +%{ +enum { EAX=0, ECX=1, EDX=2, EBX=3, ESI=6, EDI=7 }; +#include "c.h" +#define NODEPTR_TYPE Node +#define OP_LABEL(p) ((p)->op) +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define STATE_LABEL(p) ((p)->x.state) +static void address(Symbol, Symbol, long); +static void blkfetch(int, int, int, int); +static void blkloop(int, int, int, int, int, int[]); +static void blkstore(int, int, int, int); +static void defaddress(Symbol); +static void defconst(int, int, Value); +static void defstring(int, char *); +static void defsymbol(Symbol); +static void doarg(Node); +static void emit2(Node); +static void export(Symbol); +static void clobber(Node); +static void function(Symbol, Symbol [], Symbol [], int); +static void global(Symbol); +static void import(Symbol); +static void local(Symbol); +static void progbeg(int, char **); +static void progend(void); +static void segment(int); +static void space(int); +static void target(Node); +extern int ckstack(Node, int); +extern int memop(Node); +extern int sametree(Node, Node); +static Symbol charreg[32], shortreg[32], intreg[32]; +static Symbol fltreg[32]; + +static Symbol charregw, shortregw, intregw, fltregw; + +static int cseg; + +static Symbol quo, rem; + +%} +%start stmt +%term CNSTF4=4113 +%term CNSTF8=8209 +%term CNSTF16=16401 +%term CNSTI1=1045 +%term CNSTI2=2069 +%term CNSTI4=4117 +%term CNSTI8=8213 +%term CNSTP4=4119 +%term CNSTP8=8215 +%term CNSTU1=1046 +%term CNSTU2=2070 +%term CNSTU4=4118 +%term CNSTU8=8214 + +%term ARGB=41 +%term ARGF4=4129 +%term ARGF8=8225 +%term ARGF16=16417 +%term ARGI4=4133 +%term ARGI8=8229 +%term ARGP4=4135 +%term ARGP8=8231 +%term ARGU4=4134 +%term ARGU8=8230 + +%term ASGNB=57 +%term ASGNF4=4145 +%term ASGNF8=8241 +%term ASGNF16=16433 +%term ASGNI1=1077 +%term ASGNI2=2101 +%term ASGNI4=4149 +%term ASGNI8=8245 +%term ASGNP4=4151 +%term ASGNP8=8247 +%term ASGNU1=1078 +%term ASGNU2=2102 +%term ASGNU4=4150 +%term ASGNU8=8246 + +%term INDIRB=73 +%term INDIRF4=4161 +%term INDIRF8=8257 +%term INDIRF16=16449 +%term INDIRI1=1093 +%term INDIRI2=2117 +%term INDIRI4=4165 +%term INDIRI8=8261 +%term INDIRP4=4167 +%term INDIRP8=8263 +%term INDIRU1=1094 +%term INDIRU2=2118 +%term INDIRU4=4166 +%term INDIRU8=8262 + +%term CVFF4=4209 +%term CVFF8=8305 +%term CVFF16=16497 +%term CVFI4=4213 +%term CVFI8=8309 + +%term CVIF4=4225 +%term CVIF8=8321 +%term CVIF16=16513 +%term CVII1=1157 +%term CVII2=2181 +%term CVII4=4229 +%term CVII8=8325 +%term CVIU1=1158 +%term CVIU2=2182 +%term CVIU4=4230 +%term CVIU8=8326 + +%term CVPP4=4247 +%term CVPP8=8343 +%term CVPP16=16535 +%term CVPU4=4246 +%term CVPU8=8342 + +%term CVUI1=1205 +%term CVUI2=2229 +%term CVUI4=4277 +%term CVUI8=8373 +%term CVUP4=4279 +%term CVUP8=8375 +%term CVUP16=16567 +%term CVUU1=1206 +%term CVUU2=2230 +%term CVUU4=4278 +%term CVUU8=8374 + +%term NEGF4=4289 +%term NEGF8=8385 +%term NEGF16=16577 +%term NEGI4=4293 +%term NEGI8=8389 + +%term CALLB=217 +%term CALLF4=4305 +%term CALLF8=8401 +%term CALLF16=16593 +%term CALLI4=4309 +%term CALLI8=8405 +%term CALLP4=4311 +%term CALLP8=8407 +%term CALLU4=4310 +%term CALLU8=8406 +%term CALLV=216 + +%term RETF4=4337 +%term RETF8=8433 +%term RETF16=16625 +%term RETI4=4341 +%term RETI8=8437 +%term RETP4=4343 +%term RETP8=8439 +%term RETU4=4342 +%term RETU8=8438 +%term RETV=248 + +%term ADDRGP4=4359 +%term ADDRGP8=8455 + +%term ADDRFP4=4375 +%term ADDRFP8=8471 + +%term ADDRLP4=4391 +%term ADDRLP8=8487 + +%term ADDF4=4401 +%term ADDF8=8497 +%term ADDF16=16689 +%term ADDI4=4405 +%term ADDI8=8501 +%term ADDP4=4407 +%term ADDP8=8503 +%term ADDU4=4406 +%term ADDU8=8502 + +%term SUBF4=4417 +%term SUBF8=8513 +%term SUBF16=16705 +%term SUBI4=4421 +%term SUBI8=8517 +%term SUBP4=4423 +%term SUBP8=8519 +%term SUBU4=4422 +%term SUBU8=8518 + +%term LSHI4=4437 +%term LSHI8=8533 +%term LSHU4=4438 +%term LSHU8=8534 + +%term MODI4=4453 +%term MODI8=8549 +%term MODU4=4454 +%term MODU8=8550 + +%term RSHI4=4469 +%term RSHI8=8565 +%term RSHU4=4470 +%term RSHU8=8566 + +%term BANDI4=4485 +%term BANDI8=8581 +%term BANDU4=4486 +%term BANDU8=8582 + +%term BCOMI4=4501 +%term BCOMI8=8597 +%term BCOMU4=4502 +%term BCOMU8=8598 + +%term BORI4=4517 +%term BORI8=8613 +%term BORU4=4518 +%term BORU8=8614 + +%term BXORI4=4533 +%term BXORI8=8629 +%term BXORU4=4534 +%term BXORU8=8630 + +%term DIVF4=4545 +%term DIVF8=8641 +%term DIVF16=16833 +%term DIVI4=4549 +%term DIVI8=8645 +%term DIVU4=4550 +%term DIVU8=8646 + +%term MULF4=4561 +%term MULF8=8657 +%term MULF16=16849 +%term MULI4=4565 +%term MULI8=8661 +%term MULU4=4566 +%term MULU8=8662 + +%term EQF4=4577 +%term EQF8=8673 +%term EQF16=16865 +%term EQI4=4581 +%term EQI8=8677 +%term EQU4=4582 +%term EQU8=8678 + +%term GEF4=4593 +%term GEF8=8689 +%term GEI4=4597 +%term GEI8=8693 +%term GEI16=16885 +%term GEU4=4598 +%term GEU8=8694 + +%term GTF4=4609 +%term GTF8=8705 +%term GTF16=16897 +%term GTI4=4613 +%term GTI8=8709 +%term GTU4=4614 +%term GTU8=8710 + +%term LEF4=4625 +%term LEF8=8721 +%term LEF16=16913 +%term LEI4=4629 +%term LEI8=8725 +%term LEU4=4630 +%term LEU8=8726 + +%term LTF4=4641 +%term LTF8=8737 +%term LTF16=16929 +%term LTI4=4645 +%term LTI8=8741 +%term LTU4=4646 +%term LTU8=8742 + +%term NEF4=4657 +%term NEF8=8753 +%term NEF16=16945 +%term NEI4=4661 +%term NEI8=8757 +%term NEU4=4662 +%term NEU8=8758 + +%term JUMPV=584 + +%term LABELV=600 + +%term LOADB=233 +%term LOADF4=4321 +%term LOADF8=8417 +%term LOADF16=16609 +%term LOADI1=1253 +%term LOADI2=2277 +%term LOADI4=4325 +%term LOADI8=8421 +%term LOADP4=4327 +%term LOADP8=8423 +%term LOADU1=1254 +%term LOADU2=2278 +%term LOADU4=4326 +%term LOADU8=8422 + +%term VREGP=711 +%% +reg: INDIRI1(VREGP) "# read register\n" +reg: INDIRU1(VREGP) "# read register\n" + +reg: INDIRI2(VREGP) "# read register\n" +reg: INDIRU2(VREGP) "# read register\n" + +reg: INDIRF4(VREGP) "# read register\n" +reg: INDIRI4(VREGP) "# read register\n" +reg: INDIRP4(VREGP) "# read register\n" +reg: INDIRU4(VREGP) "# read register\n" + +reg: INDIRF8(VREGP) "# read register\n" +reg: INDIRI8(VREGP) "# read register\n" +reg: INDIRP8(VREGP) "# read register\n" +reg: INDIRU8(VREGP) "# read register\n" + +stmt: ASGNI1(VREGP,reg) "# write register\n" +stmt: ASGNU1(VREGP,reg) "# write register\n" + +stmt: ASGNI2(VREGP,reg) "# write register\n" +stmt: ASGNU2(VREGP,reg) "# write register\n" + +stmt: ASGNF4(VREGP,reg) "# write register\n" +stmt: ASGNI4(VREGP,reg) "# write register\n" +stmt: ASGNP4(VREGP,reg) "# write register\n" +stmt: ASGNU4(VREGP,reg) "# write register\n" + +stmt: ASGNF8(VREGP,reg) "# write register\n" +stmt: ASGNI8(VREGP,reg) "# write register\n" +stmt: ASGNP8(VREGP,reg) "# write register\n" +stmt: ASGNU8(VREGP,reg) "# write register\n" +con: CNSTI1 "%a" +con: CNSTU1 "%a" + +con: CNSTI2 "%a" +con: CNSTU2 "%a" + +con: CNSTI4 "%a" +con: CNSTU4 "%a" +con: CNSTP4 "%a" + +con: CNSTI8 "%a" +con: CNSTU8 "%a" +con: CNSTP8 "%a" +stmt: reg "" +acon: ADDRGP4 "(%a)" +acon: con "(%0)" +base: ADDRGP4 "(%a)" +base: reg "[%0]" +base: ADDI4(reg,acon) "%1[%0]" +base: ADDP4(reg,acon) "%1[%0]" +base: ADDU4(reg,acon) "%1[%0]" +base: ADDRFP4 "(%a)[ebp]" +base: ADDRLP4 "(%a)[ebp]" +index: reg "%0" +index: LSHI4(reg,con1) "%0*2" +index: LSHI4(reg,con2) "%0*4" +index: LSHI4(reg,con3) "%0*8" + +con1: CNSTI4 "1" range(a, 1, 1) +con1: CNSTU4 "1" range(a, 1, 1) +con2: CNSTI4 "2" range(a, 2, 2) +con2: CNSTU4 "2" range(a, 2, 2) +con3: CNSTI4 "3" range(a, 3, 3) +con3: CNSTU4 "3" range(a, 3, 3) +index: LSHU4(reg,con1) "%0*2" +index: LSHU4(reg,con2) "%0*4" +index: LSHU4(reg,con3) "%0*8" +addr: base "%0" +addr: ADDI4(index,base) "%1[%0]" +addr: ADDP4(index,base) "%1[%0]" +addr: ADDU4(index,base) "%1[%0]" +addr: index "[%0]" +mem: INDIRI1(addr) "byte ptr %0" +mem: INDIRI2(addr) "word ptr %0" +mem: INDIRI4(addr) "dword ptr %0" +mem: INDIRU1(addr) "byte ptr %0" +mem: INDIRU2(addr) "word ptr %0" +mem: INDIRU4(addr) "dword ptr %0" +mem: INDIRP4(addr) "dword ptr %0" +rc: reg "%0" +rc: con "%0" + +mr: reg "%0" +mr: mem "%0" + +mrc0: mem "%0" +mrc0: rc "%0" +mrc1: mem "%0" 1 +mrc1: rc "%0" + +mrc3: mem "%0" 3 +mrc3: rc "%0" +reg: addr "lea %c,%0\n" 1 +reg: mrc0 "mov %c,%0\n" 1 +reg: LOADI1(reg) "# move\n" 1 +reg: LOADI2(reg) "# move\n" 1 +reg: LOADI4(reg) "# move\n" move(a) +reg: LOADU1(reg) "# move\n" 1 +reg: LOADU2(reg) "# move\n" 1 +reg: LOADU4(reg) "# move\n" move(a) +reg: LOADP4(reg) "# move\n" move(a) +reg: ADDI4(reg,mrc1) "?mov %c,%0\nadd %c,%1\n" 1 +reg: ADDP4(reg,mrc1) "?mov %c,%0\nadd %c,%1\n" 1 +reg: ADDU4(reg,mrc1) "?mov %c,%0\nadd %c,%1\n" 1 +reg: SUBI4(reg,mrc1) "?mov %c,%0\nsub %c,%1\n" 1 +reg: SUBP4(reg,mrc1) "?mov %c,%0\nsub %c,%1\n" 1 +reg: SUBU4(reg,mrc1) "?mov %c,%0\nsub %c,%1\n" 1 +reg: BANDI4(reg,mrc1) "?mov %c,%0\nand %c,%1\n" 1 +reg: BORI4(reg,mrc1) "?mov %c,%0\nor %c,%1\n" 1 +reg: BXORI4(reg,mrc1) "?mov %c,%0\nxor %c,%1\n" 1 +reg: BANDU4(reg,mrc1) "?mov %c,%0\nand %c,%1\n" 1 +reg: BORU4(reg,mrc1) "?mov %c,%0\nor %c,%1\n" 1 +reg: BXORU4(reg,mrc1) "?mov %c,%0\nxor %c,%1\n" 1 +stmt: ASGNI4(addr,ADDI4(mem,con1)) "inc %1\n" memop(a) +stmt: ASGNI4(addr,ADDU4(mem,con1)) "inc %1\n" memop(a) +stmt: ASGNP4(addr,ADDP4(mem,con1)) "inc %1\n" memop(a) +stmt: ASGNI4(addr,SUBI4(mem,con1)) "dec %1\n" memop(a) +stmt: ASGNI4(addr,SUBU4(mem,con1)) "dec %1\n" memop(a) +stmt: ASGNP4(addr,SUBP4(mem,con1)) "dec %1\n" memop(a) +stmt: ASGNI4(addr,ADDI4(mem,rc)) "add %1,%2\n" memop(a) +stmt: ASGNI4(addr,SUBI4(mem,rc)) "sub %1,%2\n" memop(a) +stmt: ASGNU4(addr,ADDU4(mem,rc)) "add %1,%2\n" memop(a) +stmt: ASGNU4(addr,SUBU4(mem,rc)) "sub %1,%2\n" memop(a) + +stmt: ASGNI4(addr,BANDI4(mem,rc)) "and %1,%2\n" memop(a) +stmt: ASGNI4(addr,BORI4(mem,rc)) "or %1,%2\n" memop(a) +stmt: ASGNI4(addr,BXORI4(mem,rc)) "xor %1,%2\n" memop(a) +stmt: ASGNU4(addr,BANDU4(mem,rc)) "and %1,%2\n" memop(a) +stmt: ASGNU4(addr,BORU4(mem,rc)) "or %1,%2\n" memop(a) +stmt: ASGNU4(addr,BXORU4(mem,rc)) "xor %1,%2\n" memop(a) +reg: BCOMI4(reg) "?mov %c,%0\nnot %c\n" 2 +reg: BCOMU4(reg) "?mov %c,%0\nnot %c\n" 2 +reg: NEGI4(reg) "?mov %c,%0\nneg %c\n" 2 + +stmt: ASGNI4(addr,BCOMI4(mem)) "not %1\n" memop(a) +stmt: ASGNU4(addr,BCOMU4(mem)) "not %1\n" memop(a) +stmt: ASGNI4(addr,NEGI4(mem)) "neg %1\n" memop(a) +reg: LSHI4(reg,con5) "?mov %c,%0\nsal %c,%1\n" 2 +reg: LSHU4(reg,con5) "?mov %c,%0\nshl %c,%1\n" 2 +reg: RSHI4(reg,con5) "?mov %c,%0\nsar %c,%1\n" 2 +reg: RSHU4(reg,con5) "?mov %c,%0\nshr %c,%1\n" 2 + +stmt: ASGNI4(addr,LSHI4(mem,con5)) "sal %1,%2\n" memop(a) +stmt: ASGNI4(addr,LSHU4(mem,con5)) "shl %1,%2\n" memop(a) +stmt: ASGNI4(addr,RSHI4(mem,con5)) "sar %1,%2\n" memop(a) +stmt: ASGNI4(addr,RSHU4(mem,con5)) "shr %1,%2\n" memop(a) + +con5: CNSTI4 "%a" range(a, 0, 31) + +reg: LSHI4(reg,reg) "?mov %c,%0\nmov ecx,%1\nsal %c,cl\n" 3 +reg: LSHU4(reg,reg) "?mov %c,%0\nmov ecx,%1\nshl %c,cl\n" 2 +reg: RSHI4(reg,reg) "?mov %c,%0\nmov ecx,%1\nsar %c,cl\n" 2 +reg: RSHU4(reg,reg) "?mov %c,%0\nmov ecx,%1\nshr %c,cl\n" 2 +reg: MULI4(reg,mrc3) "?mov %c,%0\nimul %c,%1\n" 14 +reg: MULI4(con,mr) "imul %c,%1,%0\n" 13 +reg: MULU4(reg,mr) "mul %1\n" 13 +reg: DIVU4(reg,reg) "xor edx,edx\ndiv %1\n" +reg: MODU4(reg,reg) "xor edx,edx\ndiv %1\n" +reg: DIVI4(reg,reg) "cdq\nidiv %1\n" +reg: MODI4(reg,reg) "cdq\nidiv %1\n" +reg: CVPU4(reg) "mov %c,%0\n" move(a) +reg: CVUP4(reg) "mov %c,%0\n" move(a) +reg: CVII4(INDIRI1(addr)) "movsx %c,byte ptr %0\n" 3 +reg: CVII4(INDIRI2(addr)) "movsx %c,word ptr %0\n" 3 +reg: CVUU4(INDIRU1(addr)) "movzx %c,byte ptr %0\n" 3 +reg: CVUU4(INDIRU2(addr)) "movzx %c,word ptr %0\n" 3 +reg: CVII4(reg) "# extend\n" 3 +reg: CVIU4(reg) "# extend\n" 3 +reg: CVUI4(reg) "# extend\n" 3 +reg: CVUU4(reg) "# extend\n" 3 + +reg: CVII1(reg) "# truncate\n" 1 +reg: CVII2(reg) "# truncate\n" 1 +reg: CVUU1(reg) "# truncate\n" 1 +reg: CVUU2(reg) "# truncate\n" 1 +stmt: ASGNI1(addr,rc) "mov byte ptr %0,%1\n" 1 +stmt: ASGNI2(addr,rc) "mov word ptr %0,%1\n" 1 +stmt: ASGNI4(addr,rc) "mov dword ptr %0,%1\n" 1 +stmt: ASGNU1(addr,rc) "mov byte ptr %0,%1\n" 1 +stmt: ASGNU2(addr,rc) "mov word ptr %0,%1\n" 1 +stmt: ASGNU4(addr,rc) "mov dword ptr %0,%1\n" 1 +stmt: ASGNP4(addr,rc) "mov dword ptr %0,%1\n" 1 +stmt: ARGI4(mrc3) "push %0\n" 1 +stmt: ARGU4(mrc3) "push %0\n" 1 +stmt: ARGP4(mrc3) "push %0\n" 1 +stmt: ASGNB(reg,INDIRB(reg)) "mov ecx,%a\nrep movsb\n" +stmt: ARGB(INDIRB(reg)) "sub esp,%a\nmov edi,esp\nmov ecx,%a\nrep movsb\n" + +memf: INDIRF8(addr) "qword ptr %0" +memf: INDIRF4(addr) "dword ptr %0" +memf: CVFF8(INDIRF4(addr)) "dword ptr %0" +reg: memf "fld %0\n" 3 +stmt: ASGNF8(addr,reg) "fstp qword ptr %0\n" 7 +stmt: ASGNF4(addr,reg) "fstp dword ptr %0\n" 7 +stmt: ASGNF4(addr,CVFF4(reg)) "fstp dword ptr %0\n" 7 +stmt: ARGF8(reg) "sub esp,8\nfstp qword ptr [esp]\n" +stmt: ARGF4(reg) "sub esp,4\nfstp dword ptr [esp]\n" +reg: NEGF8(reg) "fchs\n" +reg: NEGF4(reg) "fchs\n" +flt: memf " %0" +flt: reg "p st(1),st" +reg: ADDF8(reg,flt) "fadd%1\n" +reg: ADDF4(reg,flt) "fadd%1\n" +reg: DIVF8(reg,flt) "fdiv%1\n" +reg: DIVF4(reg,flt) "fdiv%1\n" +reg: MULF8(reg,flt) "fmul%1\n" +reg: MULF4(reg,flt) "fmul%1\n" +reg: SUBF8(reg,flt) "fsub%1\n" +reg: SUBF4(reg,flt) "fsub%1\n" +reg: CVFF8(reg) "# CVFF8\n" +reg: CVFF4(reg) "sub esp,4\nfstp dword ptr 0[esp]\nfld dword ptr 0[esp]\nadd esp,4\n" 12 + +reg: CVFI4(reg) "call __ftol\n" 31 +reg: CVIF8(INDIRI4(addr)) "fild dword ptr %0\n" 10 +reg: CVIF4(reg) "push %0\nfild dword ptr 0[esp]\nadd esp,4\n" 12 + +reg: CVIF8(reg) "push %0\nfild dword ptr 0[esp]\nadd esp,4\n" 12 + +addrj: ADDRGP4 "%a" +addrj: reg "%0" 2 +addrj: mem "%0" 2 + +stmt: JUMPV(addrj) "jmp %0\n" 3 +stmt: LABELV "%a:\n" +stmt: EQI4(mem,rc) "cmp %0,%1\nje %a\n" 5 +stmt: GEI4(mem,rc) "cmp %0,%1\njge %a\n" 5 +stmt: GTI4(mem,rc) "cmp %0,%1\njg %a\n" 5 +stmt: LEI4(mem,rc) "cmp %0,%1\njle %a\n" 5 +stmt: LTI4(mem,rc) "cmp %0,%1\njl %a\n" 5 +stmt: NEI4(mem,rc) "cmp %0,%1\njne %a\n" 5 +stmt: GEU4(mem,rc) "cmp %0,%1\njae %a\n" 5 +stmt: GTU4(mem,rc) "cmp %0,%1\nja %a\n" 5 +stmt: LEU4(mem,rc) "cmp %0,%1\njbe %a\n" 5 +stmt: LTU4(mem,rc) "cmp %0,%1\njb %a\n" 5 +stmt: EQI4(reg,mrc1) "cmp %0,%1\nje %a\n" 4 +stmt: GEI4(reg,mrc1) "cmp %0,%1\njge %a\n" 4 +stmt: GTI4(reg,mrc1) "cmp %0,%1\njg %a\n" 4 +stmt: LEI4(reg,mrc1) "cmp %0,%1\njle %a\n" 4 +stmt: LTI4(reg,mrc1) "cmp %0,%1\njl %a\n" 4 +stmt: NEI4(reg,mrc1) "cmp %0,%1\njne %a\n" 4 + +stmt: EQU4(reg,mrc1) "cmp %0,%1\nje %a\n" 4 +stmt: GEU4(reg,mrc1) "cmp %0,%1\njae %a\n" 4 +stmt: GTU4(reg,mrc1) "cmp %0,%1\nja %a\n" 4 +stmt: LEU4(reg,mrc1) "cmp %0,%1\njbe %a\n" 4 +stmt: LTU4(reg,mrc1) "cmp %0,%1\njb %a\n" 4 +stmt: NEU4(reg,mrc1) "cmp %0,%1\njne %a\n" 4 +cmpf: memf " %0" +cmpf: reg "p" +stmt: EQF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nje %a\n" +stmt: GEF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njbe %a\n" +stmt: GTF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njb %a\n" +stmt: LEF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njae %a\n" +stmt: LTF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nja %a\n" +stmt: NEF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njne %a\n" + +stmt: EQF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nje %a\n" +stmt: GEF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njbe %a\n" +stmt: GTF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njb %a\n" +stmt: LEF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njae %a\n" +stmt: LTF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nja %a\n" +stmt: NEF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njne %a\n" +reg: CALLI4(addrj) "call %0\nadd esp,%a\n" +reg: CALLU4(addrj) "call %0\nadd esp,%a\n" +reg: CALLP4(addrj) "call %0\nadd esp,%a\n" +stmt: CALLV(addrj) "call %0\nadd esp,%a\n" +reg: CALLF4(addrj) "call %0\nadd esp,%a\n" +reg: CALLF8(addrj) "call %0\nadd esp,%a\n" +stmt: CALLF4(addrj) "call %0\nadd esp,%a\nfstp\n" +stmt: CALLF8(addrj) "call %0\nadd esp,%a\nfstp\n" + +stmt: RETI4(reg) "# ret\n" +stmt: RETU4(reg) "# ret\n" +stmt: RETP4(reg) "# ret\n" +stmt: RETF4(reg) "# ret\n" +stmt: RETF8(reg) "# ret\n" +%% +static void progbeg(int argc, char *argv[]) { + int i; + + { + union { + char c; + int i; + } u; + u.i = 0; + u.c = 1; + swap = ((int)(u.i == 1)) != IR->little_endian; + } + parseflags(argc, argv); + intreg[EAX] = mkreg("eax", EAX, 1, IREG); + intreg[EDX] = mkreg("edx", EDX, 1, IREG); + intreg[ECX] = mkreg("ecx", ECX, 1, IREG); + intreg[EBX] = mkreg("ebx", EBX, 1, IREG); + intreg[ESI] = mkreg("esi", ESI, 1, IREG); + intreg[EDI] = mkreg("edi", EDI, 1, IREG); + + shortreg[EAX] = mkreg("ax", EAX, 1, IREG); + shortreg[ECX] = mkreg("cx", ECX, 1, IREG); + shortreg[EDX] = mkreg("dx", EDX, 1, IREG); + shortreg[EBX] = mkreg("bx", EBX, 1, IREG); + shortreg[ESI] = mkreg("si", ESI, 1, IREG); + shortreg[EDI] = mkreg("di", EDI, 1, IREG); + + charreg[EAX] = mkreg("al", EAX, 1, IREG); + charreg[ECX] = mkreg("cl", ECX, 1, IREG); + charreg[EDX] = mkreg("dl", EDX, 1, IREG); + charreg[EBX] = mkreg("bl", EBX, 1, IREG); + for (i = 0; i < 8; i++) + fltreg[i] = mkreg("%d", i, 0, FREG); + charregw = mkwildcard(charreg); + shortregw = mkwildcard(shortreg); + intregw = mkwildcard(intreg); + fltregw = mkwildcard(fltreg); + + tmask[IREG] = (1<x.regnode->mask |= 1<x.regnode->mask |= 1<op)) { + case MUL+U: + setreg(p, quo); + rtarget(p, 0, intreg[EAX]); + break; + case DIV+I: case DIV+U: + setreg(p, quo); + rtarget(p, 0, quo); + break; + case MOD+I: case MOD+U: + setreg(p, rem); + rtarget(p, 0, quo); + break; + case ASGN+B: + rtarget(p, 0, intreg[EDI]); + rtarget(p->kids[1], 0, intreg[ESI]); + break; + case ARG+B: + rtarget(p->kids[0], 0, intreg[ESI]); + break; + case CVF+I: + setreg(p, intreg[EAX]); + break; + case CALL+I: case CALL+U: case CALL+P: case CALL+V: + setreg(p, intreg[EAX]); + break; + case RET+I: case RET+U: case RET+P: + rtarget(p, 0, intreg[EAX]); + break; + } +} + +static void clobber(Node p) { + static int nstack = 0; + + assert(p); + nstack = ckstack(p, nstack); + switch (specific(p->op)) { + case RSH+I: case RSH+U: case LSH+I: case LSH+U: + if (generic(p->kids[1]->op) != CNST + && !( generic(p->kids[1]->op) == INDIR + && specific(p->kids[1]->kids[0]->op) == VREG+P + && p->kids[1]->syms[RX]->u.t.cse + && generic(p->kids[1]->syms[RX]->u.t.cse->op) == CNST +)) { + spill(1<op)==F) + +int ckstack(Node p, int n) { + int i; + + for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++) + if (isfp(p->x.kids[i])) + n--; + if (isfp(p) && p->count > 0) + n++; + if (n > 8) + error("expression too complicated\n"); + debug(fprint(stderr, "(ckstack(%x)=%d)\n", p, n)); + assert(n >= 0); + return n; +} +int memop(Node p) { + assert(p); + assert(generic(p->op) == ASGN); + assert(p->kids[0]); + assert(p->kids[1]); + if (generic(p->kids[1]->kids[0]->op) == INDIR + && sametree(p->kids[0], p->kids[1]->kids[0]->kids[0])) + return 3; + else + return LBURG_MAX; +} +int sametree(Node p, Node q) { + return p == NULL && q == NULL + || p && q && p->op == q->op && p->syms[0] == q->syms[0] + && sametree(p->kids[0], q->kids[0]) + && sametree(p->kids[1], q->kids[1]); +} +static void emit2(Node p) { + int op = specific(p->op); +#define preg(f) ((f)[getregnum(p->x.kids[0])]->x.name) + + if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movsx %s,%s\n", p->syms[RX]->x.name +, preg(charreg)); + else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movsx %s,%s\n", p->syms[RX]->x.name +, preg(charreg)); + else if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movsx %s,%s\n", p->syms[RX]->x.name +, preg(shortreg)); + else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movsx %s,%s\n", p->syms[RX]->x.name +, preg(shortreg)); + + else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movzx %s,%s\n", p->syms[RX]->x.name +, preg(charreg)); + else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movzx %s,%s\n", p->syms[RX]->x.name +, preg(charreg)); + else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movzx %s,%s\n", p->syms[RX]->x.name +, preg(shortreg)); + else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movzx %s,%s\n", p->syms[RX]->x.name +, preg(shortreg)); + else if (generic(op) == CVI || generic(op) == CVU || generic(op) == LOAD) { + char *dst = intreg[getregnum(p)]->x.name; + char *src = preg(intreg); + assert(opsize(p->op) <= opsize(p->x.kids[0]->op)); + if (dst != src) + print("mov %s,%s\n", dst, src); + } +} + +static void doarg(Node p) { + assert(p && p->syms[0]); + mkactual(4, p->syms[0]->u.c.v.i); +} +static void blkfetch(int k, int off, int reg, int tmp) {} +static void blkstore(int k, int off, int reg, int tmp) {} +static void blkloop(int dreg, int doff, int sreg, int soff, + int size, int tmps[]) {} +static void local(Symbol p) { + if (isfloat(p->type)) + p->sclass = AUTO; + if (askregvar(p, (*IR->x.rmap)(ttob(p->type))) == 0) + mkauto(p); +} +static void function(Symbol f, Symbol caller[], Symbol callee[], int n) { + int i; + + print("%s:\n", f->x.name); + print("push ebx\n"); + print("push esi\n"); + print("push edi\n"); + print("push ebp\n"); + print("mov ebp,esp\n"); + usedmask[0] = usedmask[1] = 0; + freemask[0] = freemask[1] = ~(unsigned)0; + offset = 16 + 4; + for (i = 0; callee[i]; i++) { + Symbol p = callee[i]; + Symbol q = caller[i]; + assert(q); + p->x.offset = q->x.offset = offset; + p->x.name = q->x.name = stringf("%d", p->x.offset); + p->sclass = q->sclass = AUTO; + offset += roundup(q->type->size, 4); + } + assert(caller[i] == 0); + offset = maxoffset = 0; + gencode(caller, callee); + framesize = roundup(maxoffset, 4); + if (framesize > 0) + print("sub esp,%d\n", framesize); + emitcode(); + print("mov esp,ebp\n"); + print("pop ebp\n"); + print("pop edi\n"); + print("pop esi\n"); + print("pop ebx\n"); + print("ret\n"); +} +static void defsymbol(Symbol p) { + if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf("L%d", genlabel(1)); + else if (p->generated) + p->x.name = stringf("L%s", p->name); + else if (p->scope == GLOBAL || p->sclass == EXTERN) + p->x.name = stringf("_%s", p->name); + else if (p->scope == CONSTANTS + && (isint(p->type) || isptr(p->type)) + && p->name[0] == '0' && p->name[1] == 'x') + p->x.name = stringf("0%sH", &p->name[2]); + else + p->x.name = p->name; +} +static void address(Symbol q, Symbol p, long n) { + if (p->scope == GLOBAL + || p->sclass == STATIC || p->sclass == EXTERN) + q->x.name = stringf("%s%s%D", + p->x.name, n >= 0 ? "+" : "", n); + else { + assert(n <= INT_MAX && n >= INT_MIN); + q->x.offset = p->x.offset + n; + q->x.name = stringd(q->x.offset); + } +} +static void defconst(int suffix, int size, Value v) { + if (suffix == I && size == 1) + print("db %d\n", v.u); + else if (suffix == I && size == 2) + print("dw %d\n", v.i); + else if (suffix == I && size == 4) + print("dd %d\n", v.i); + else if (suffix == U && size == 1) + print("db 0%xH\n", v.u); + else if (suffix == U && size == 2) + print("dw 0%xH\n", v.u); + else if (suffix == U && size == 4) + print("dd 0%xH\n", v.u); + else if (suffix == P && size == 4) + print("dd 0%xH\n", v.p); + else if (suffix == F && size == 4) { + float f = v.d; + print("dd 0%xH\n", *(unsigned *)&f); + } + else if (suffix == F && size == 8) { + double d = v.d; + unsigned *p = (unsigned *)&d; + print("dd 0%xH\ndd 0%xH\n", p[swap], p[!swap]); + } + else assert(0); +} +static void defaddress(Symbol p) { + print("dd %s\n", p->x.name); +} +static void defstring(int n, char *str) { + char *s; + + for (s = str; s < str + n; s++) + print("db %d\n", (*s)&0377); +} +static void export(Symbol p) { + print("public %s\n", p->x.name); +} +static void import(Symbol p) { + int oldseg = cseg; + + if (p->ref > 0) { + segment(0); + print("extrn %s:near\n", p->x.name); + segment(oldseg); + } +} +static void global(Symbol p) { + print("align %d\n", + p->type->align > 4 ? 4 : p->type->align); + print("%s label byte\n", p->x.name); + if (p->u.seg == BSS) + print("db %d dup (0)\n", p->type->size); +} +static void space(int n) { + if (cseg != BSS) + print("db %d dup (0)\n", n); +} +Interface x86IR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 4, 1, /* double */ + 8, 4, 1, /* long double */ + 4, 4, 0, /* T * */ + 0, 4, 0, /* struct; so that ARGB keeps stack aligned */ + 1, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 0, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + address, + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol, + emit, + export, + function, + gen, + global, + import, + local, + progbeg, + progend, + segment, + space, + 0, 0, 0, 0, 0, 0, 0, + {1, rmap, + blkfetch, blkstore, blkloop, + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + doarg, + target, + clobber, +} +}; +static char rcsid[] = "$Id: x86.md,v 1.1.1.1 2001/10/17 21:53:38 timo Exp $"; diff --git a/quake3/source/lcc/src/x86linux.md b/quake3/source/lcc/src/x86linux.md new file mode 100644 index 0000000..edf42d7 --- /dev/null +++ b/quake3/source/lcc/src/x86linux.md @@ -0,0 +1,1081 @@ +%{ +/* x86/linux lburg spec. Derived from x86.md by +Marcos Ramirez +Horst von Brand +Jacob Navia +*/ +enum { EAX=0, ECX=1, EDX=2, EBX=3, ESI=6, EDI=7 }; +#include "c.h" +#define NODEPTR_TYPE Node +#define OP_LABEL(p) ((p)->op) +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define STATE_LABEL(p) ((p)->x.state) +extern int ckstack(Node, int); +extern int memop(Node); +extern int sametree(Node, Node); +static Symbol charreg[32], shortreg[32], intreg[32]; +static Symbol fltreg[32]; + +static Symbol charregw, shortregw, intregw, fltregw; + +static int cseg; + +static Symbol quo, rem; + +extern char *stabprefix; +extern void stabblock(int, int, Symbol*); +extern void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *); +extern void stabfend(Symbol, int); +extern void stabinit(char *, int, char *[]); +extern void stabline(Coordinate *); +extern void stabsym(Symbol); +extern void stabtype(Symbol); + +static int pflag = 0; +static char rcsid[] = "$Id: x86linux.md,v 1.1.1.1 2001/10/17 21:53:38 timo Exp $"; + +#define hasargs(p) (p->syms[0] && p->syms[0]->u.c.v.i > 0 ? 0 : LBURG_MAX) +%} +%start stmt +%term CNSTF4=4113 +%term CNSTF8=8209 +%term CNSTF16=16401 +%term CNSTI1=1045 +%term CNSTI2=2069 +%term CNSTI4=4117 +%term CNSTI8=8213 +%term CNSTP4=4119 +%term CNSTP8=8215 +%term CNSTU1=1046 +%term CNSTU2=2070 +%term CNSTU4=4118 +%term CNSTU8=8214 + +%term ARGB=41 +%term ARGF4=4129 +%term ARGF8=8225 +%term ARGF16=16417 +%term ARGI4=4133 +%term ARGI8=8229 +%term ARGP4=4135 +%term ARGP8=8231 +%term ARGU4=4134 +%term ARGU8=8230 + +%term ASGNB=57 +%term ASGNF4=4145 +%term ASGNF8=8241 +%term ASGNF16=16433 +%term ASGNI1=1077 +%term ASGNI2=2101 +%term ASGNI4=4149 +%term ASGNI8=8245 +%term ASGNP4=4151 +%term ASGNP8=8247 +%term ASGNU1=1078 +%term ASGNU2=2102 +%term ASGNU4=4150 +%term ASGNU8=8246 + +%term INDIRB=73 +%term INDIRF4=4161 +%term INDIRF8=8257 +%term INDIRF16=16449 +%term INDIRI1=1093 +%term INDIRI2=2117 +%term INDIRI4=4165 +%term INDIRI8=8261 +%term INDIRP4=4167 +%term INDIRP8=8263 +%term INDIRU1=1094 +%term INDIRU2=2118 +%term INDIRU4=4166 +%term INDIRU8=8262 + +%term CVFF4=4209 +%term CVFF8=8305 +%term CVFF16=16497 +%term CVFI4=4213 +%term CVFI8=8309 + +%term CVIF4=4225 +%term CVIF8=8321 +%term CVIF16=16513 +%term CVII1=1157 +%term CVII2=2181 +%term CVII4=4229 +%term CVII8=8325 +%term CVIU1=1158 +%term CVIU2=2182 +%term CVIU4=4230 +%term CVIU8=8326 + +%term CVPP4=4247 +%term CVPP8=8343 +%term CVPP16=16535 +%term CVPU4=4246 +%term CVPU8=8342 + +%term CVUI1=1205 +%term CVUI2=2229 +%term CVUI4=4277 +%term CVUI8=8373 +%term CVUP4=4279 +%term CVUP8=8375 +%term CVUP16=16567 +%term CVUU1=1206 +%term CVUU2=2230 +%term CVUU4=4278 +%term CVUU8=8374 + +%term NEGF4=4289 +%term NEGF8=8385 +%term NEGF16=16577 +%term NEGI4=4293 +%term NEGI8=8389 + +%term CALLB=217 +%term CALLF4=4305 +%term CALLF8=8401 +%term CALLF16=16593 +%term CALLI4=4309 +%term CALLI8=8405 +%term CALLP4=4311 +%term CALLP8=8407 +%term CALLU4=4310 +%term CALLU8=8406 +%term CALLV=216 + +%term RETF4=4337 +%term RETF8=8433 +%term RETF16=16625 +%term RETI4=4341 +%term RETI8=8437 +%term RETP4=4343 +%term RETP8=8439 +%term RETU4=4342 +%term RETU8=8438 +%term RETV=248 + +%term ADDRGP4=4359 +%term ADDRGP8=8455 + +%term ADDRFP4=4375 +%term ADDRFP8=8471 + +%term ADDRLP4=4391 +%term ADDRLP8=8487 + +%term ADDF4=4401 +%term ADDF8=8497 +%term ADDF16=16689 +%term ADDI4=4405 +%term ADDI8=8501 +%term ADDP4=4407 +%term ADDP8=8503 +%term ADDU4=4406 +%term ADDU8=8502 + +%term SUBF4=4417 +%term SUBF8=8513 +%term SUBF16=16705 +%term SUBI4=4421 +%term SUBI8=8517 +%term SUBP4=4423 +%term SUBP8=8519 +%term SUBU4=4422 +%term SUBU8=8518 + +%term LSHI4=4437 +%term LSHI8=8533 +%term LSHU4=4438 +%term LSHU8=8534 + +%term MODI4=4453 +%term MODI8=8549 +%term MODU4=4454 +%term MODU8=8550 + +%term RSHI4=4469 +%term RSHI8=8565 +%term RSHU4=4470 +%term RSHU8=8566 + +%term BANDI4=4485 +%term BANDI8=8581 +%term BANDU4=4486 +%term BANDU8=8582 + +%term BCOMI4=4501 +%term BCOMI8=8597 +%term BCOMU4=4502 +%term BCOMU8=8598 + +%term BORI4=4517 +%term BORI8=8613 +%term BORU4=4518 +%term BORU8=8614 + +%term BXORI4=4533 +%term BXORI8=8629 +%term BXORU4=4534 +%term BXORU8=8630 + +%term DIVF4=4545 +%term DIVF8=8641 +%term DIVF16=16833 +%term DIVI4=4549 +%term DIVI8=8645 +%term DIVU4=4550 +%term DIVU8=8646 + +%term MULF4=4561 +%term MULF8=8657 +%term MULF16=16849 +%term MULI4=4565 +%term MULI8=8661 +%term MULU4=4566 +%term MULU8=8662 + +%term EQF4=4577 +%term EQF8=8673 +%term EQF16=16865 +%term EQI4=4581 +%term EQI8=8677 +%term EQU4=4582 +%term EQU8=8678 + +%term GEF4=4593 +%term GEF8=8689 +%term GEI4=4597 +%term GEI8=8693 +%term GEI16=16885 +%term GEU4=4598 +%term GEU8=8694 + +%term GTF4=4609 +%term GTF8=8705 +%term GTF16=16897 +%term GTI4=4613 +%term GTI8=8709 +%term GTU4=4614 +%term GTU8=8710 + +%term LEF4=4625 +%term LEF8=8721 +%term LEF16=16913 +%term LEI4=4629 +%term LEI8=8725 +%term LEU4=4630 +%term LEU8=8726 + +%term LTF4=4641 +%term LTF8=8737 +%term LTF16=16929 +%term LTI4=4645 +%term LTI8=8741 +%term LTU4=4646 +%term LTU8=8742 + +%term NEF4=4657 +%term NEF8=8753 +%term NEF16=16945 +%term NEI4=4661 +%term NEI8=8757 +%term NEU4=4662 +%term NEU8=8758 + +%term JUMPV=584 + +%term LABELV=600 + +%term LOADB=233 +%term LOADF4=4321 +%term LOADF8=8417 +%term LOADF16=16609 +%term LOADI1=1253 +%term LOADI2=2277 +%term LOADI4=4325 +%term LOADI8=8421 +%term LOADP4=4327 +%term LOADP8=8423 +%term LOADU1=1254 +%term LOADU2=2278 +%term LOADU4=4326 +%term LOADU8=8422 + +%term VREGP=711 +%% +reg: INDIRI1(VREGP) "# read register\n" +reg: INDIRU1(VREGP) "# read register\n" + +reg: INDIRI2(VREGP) "# read register\n" +reg: INDIRU2(VREGP) "# read register\n" + +reg: INDIRI4(VREGP) "# read register\n" +reg: INDIRP4(VREGP) "# read register\n" +reg: INDIRU4(VREGP) "# read register\n" + +reg: INDIRI8(VREGP) "# read register\n" +reg: INDIRP8(VREGP) "# read register\n" +reg: INDIRU8(VREGP) "# read register\n" + +freg: INDIRF4(VREGP) "# read register\n" +freg: INDIRF8(VREGP) "# read register\n" + +stmt: ASGNI1(VREGP,reg) "# write register\n" +stmt: ASGNU1(VREGP,reg) "# write register\n" + +stmt: ASGNI2(VREGP,reg) "# write register\n" +stmt: ASGNU2(VREGP,reg) "# write register\n" + +stmt: ASGNF4(VREGP,reg) "# write register\n" +stmt: ASGNI4(VREGP,reg) "# write register\n" +stmt: ASGNP4(VREGP,reg) "# write register\n" +stmt: ASGNU4(VREGP,reg) "# write register\n" + +stmt: ASGNF8(VREGP,reg) "# write register\n" +stmt: ASGNI8(VREGP,reg) "# write register\n" +stmt: ASGNP8(VREGP,reg) "# write register\n" +stmt: ASGNU8(VREGP,reg) "# write register\n" + +cnst: CNSTI1 "%a" +cnst: CNSTU1 "%a" + +cnst: CNSTI2 "%a" +cnst: CNSTU2 "%a" + +cnst: CNSTI4 "%a" +cnst: CNSTU4 "%a" +cnst: CNSTP4 "%a" + +cnst: CNSTI8 "%a" +cnst: CNSTU8 "%a" +cnst: CNSTP8 "%a" + +con: cnst "$%0" + +stmt: reg "" +stmt: freg "" + +acon: ADDRGP4 "%a" +acon: ADDRGP8 "%a" +acon: cnst "%0" + +baseaddr: ADDRGP4 "%a" +base: reg "(%0)" +base: ADDI4(reg,acon) "%1(%0)" +base: ADDP4(reg,acon) "%1(%0)" +base: ADDU4(reg,acon) "%1(%0)" +base: ADDRFP4 "%a(%%ebp)" +base: ADDRLP4 "%a(%%ebp)" + +index: reg "%0" +index: LSHI4(reg,con1) "%0,2" +index: LSHI4(reg,con2) "%0,4" +index: LSHI4(reg,con3) "%0,8" +index: LSHU4(reg,con1) "%0,2" +index: LSHU4(reg,con2) "%0,4" +index: LSHU4(reg,con3) "%0,8" + +con0: CNSTI4 "1" range(a, 0, 0) +con0: CNSTU4 "1" range(a, 0, 0) +con1: CNSTI4 "1" range(a, 1, 1) +con1: CNSTU4 "1" range(a, 1, 1) +con2: CNSTI4 "2" range(a, 2, 2) +con2: CNSTU4 "2" range(a, 2, 2) +con3: CNSTI4 "3" range(a, 3, 3) +con3: CNSTU4 "3" range(a, 3, 3) + +addr: base "%0" +addr: baseaddr "%0" +addr: ADDI4(index,baseaddr) "%1(,%0)" +addr: ADDP4(index,baseaddr) "%1(,%0)" +addr: ADDU4(index,baseaddr) "%1(,%0)" + +addr: ADDI4(reg,baseaddr) "%1(%0)" +addr: ADDP4(reg,baseaddr) "%1(%0)" +addr: ADDU4(reg,baseaddr) "%1(%0)" + +addr: ADDI4(index,reg) "(%1,%0)" +addr: ADDP4(index,reg) "(%1,%0)" +addr: ADDU4(index,reg) "(%1,%0)" + +addr: index "(,%0)" + +mem1: INDIRI1(addr) "%0" +mem1: INDIRU1(addr) "%0" +mem2: INDIRI2(addr) "%0" +mem2: INDIRU2(addr) "%0" +mem4: INDIRI4(addr) "%0" +mem4: INDIRU4(addr) "%0" +mem4: INDIRP4(addr) "%0" + +rc: reg "%0" +rc: con "%0" + +mr: reg "%0" +mr: mem4 "%0" + +mr1: reg "%0" +mr1: mem1 "%0" + +mr2: reg "%0" +mr2: mem2 "%0" + +mrc: mem4 "%0" 1 +mrc: mem1 "%0" 1 +mrc: mem2 "%0" 1 +mrc: rc "%0" + +reg: addr "leal %0,%c\n" 1 +reg: mr "movl %0,%c\n" 1 +reg: mr1 "movb %0,%c\n" 1 +reg: mr2 "movw %0,%c\n" 1 +reg: con "movl %0,%c\n" 1 + +reg: LOADI1(reg) "# move\n" 1 +reg: LOADI2(reg) "# move\n" 1 +reg: LOADI4(reg) "# move\n" move(a) +reg: LOADU1(reg) "# move\n" 1 +reg: LOADU2(reg) "# move\n" 1 +reg: LOADU4(reg) "# move\n" move(a) +reg: LOADP4(reg) "# move\n" move(a) +reg: ADDI4(reg,mrc) "?movl %0,%c\naddl %1,%c\n" 1 +reg: ADDP4(reg,mrc) "?movl %0,%c\naddl %1,%c\n" 1 +reg: ADDU4(reg,mrc) "?movl %0,%c\naddl %1,%c\n" 1 +reg: SUBI4(reg,mrc) "?movl %0,%c\nsubl %1,%c\n" 1 +reg: SUBP4(reg,mrc) "?movl %0,%c\nsubl %1,%c\n" 1 +reg: SUBU4(reg,mrc) "?movl %0,%c\nsubl %1,%c\n" 1 +reg: BANDI4(reg,mrc) "?movl %0,%c\nandl %1,%c\n" 1 +reg: BORI4(reg,mrc) "?movl %0,%c\norl %1,%c\n" 1 +reg: BXORI4(reg,mrc) "?movl %0,%c\nxorl %1,%c\n" 1 +reg: BANDU4(reg,mrc) "?movl %0,%c\nandl %1,%c\n" 1 +reg: BORU4(reg,mrc) "?movl %0,%c\norl %1,%c\n" 1 +reg: BXORU4(reg,mrc) "?movl %0,%c\nxorl %1,%c\n" 1 + +stmt: ASGNI4(addr,ADDI4(mem4,con1)) "incl %1\n" memop(a) +stmt: ASGNI4(addr,ADDU4(mem4,con1)) "incl %1\n" memop(a) +stmt: ASGNP4(addr,ADDP4(mem4,con1)) "incl %1\n" memop(a) +stmt: ASGNI4(addr,SUBI4(mem4,con1)) "decl %1\n" memop(a) +stmt: ASGNI4(addr,SUBU4(mem4,con1)) "decl %1\n" memop(a) +stmt: ASGNP4(addr,SUBP4(mem4,con1)) "decl %1\n" memop(a) +stmt: ASGNI4(addr,ADDI4(mem4,rc)) "addl %2,%1\n" memop(a) +stmt: ASGNI4(addr,SUBI4(mem4,rc)) "sub %2,%1\n" memop(a) +stmt: ASGNU4(addr,ADDU4(mem4,rc)) "add %2,%1\n" memop(a) +stmt: ASGNU4(addr,SUBU4(mem4,rc)) "sub %2,%1\n" memop(a) + +stmt: ASGNI4(addr,BANDI4(mem4,rc)) "andl %2,%1\n" memop(a) +stmt: ASGNI4(addr,BORI4(mem4,rc)) "orl %2,%1\n" memop(a) +stmt: ASGNI4(addr,BXORI4(mem4,rc)) "xorl %2,%1\n" memop(a) +stmt: ASGNU4(addr,BANDU4(mem4,rc)) "andl %2,%1\n" memop(a) +stmt: ASGNU4(addr,BORU4(mem4,rc)) "orl %2,%1\n" memop(a) +stmt: ASGNU4(addr,BXORU4(mem4,rc)) "xorl %2,%1\n" memop(a) +reg: BCOMI4(reg) "?movl %0,%c\nnotl %c\n" 2 +reg: BCOMU4(reg) "?movl %0,%c\nnotl %c\n" 2 +reg: NEGI4(reg) "?movl %0,%c\nnegl %c\n" 2 + +stmt: ASGNI4(addr,BCOMI4(mem4)) "notl %1\n" memop(a) +stmt: ASGNU4(addr,BCOMU4(mem4)) "notl %1\n" memop(a) +stmt: ASGNI4(addr,NEGI4(mem4)) "negl %1\n" memop(a) +reg: LSHI4(reg,rc5) "?movl %0,%c\nsall %1,%c\n" 2 +reg: LSHU4(reg,rc5) "?movl %0,%c\nshll %1,%c\n" 2 +reg: RSHI4(reg,rc5) "?movl %0,%c\nsarl %1,%c\n" 2 +reg: RSHU4(reg,rc5) "?movl %0,%c\nshrl %1,%c\n" 2 + +stmt: ASGNI4(addr,LSHI4(mem4,rc5)) "sall %2,%1\n" memop(a) +stmt: ASGNI4(addr,LSHU4(mem4,rc5)) "shll %2,%1\n" memop(a) +stmt: ASGNI4(addr,RSHI4(mem4,rc5)) "sarl %2,%1\n" memop(a) +stmt: ASGNI4(addr,RSHU4(mem4,rc5)) "shrl %2,%1\n" memop(a) + +rc5: CNSTI4 "$%a" range(a, 0, 31) +rc5: reg "%%cl" +reg: MULI4(reg,mrc) "?movl %0,%c\nimull %1,%c\n" 14 +reg: MULI4(con,mr) "imul %0,%1,%c\n" 13 +reg: MULU4(reg,mr) "mull %1\n" 13 +reg: DIVU4(reg,reg) "xorl %%edx,%%edx\ndivl %1\n" +reg: MODU4(reg,reg) "xorl %%edx,%%edx\ndivl %1\n" +reg: DIVI4(reg,reg) "cdq\nidivl %1\n" +reg: MODI4(reg,reg) "cdq\nidivl %1\n" +reg: CVPU4(reg) "movl %0,%c\n" move(a) +reg: CVUP4(reg) "movl %0,%c\n" move(a) +reg: CVII4(INDIRI1(addr)) "movsbl %0,%c\n" 3 +reg: CVII4(INDIRI2(addr)) "movswl %0,%c\n" 3 +reg: CVUU4(INDIRU1(addr)) "movzbl %0,%c\n" 3 +reg: CVUU4(INDIRU2(addr)) "movzwl %0,%c\n" 3 +reg: CVII4(reg) "# extend\n" 3 +reg: CVIU4(reg) "# extend\n" 3 +reg: CVUI4(reg) "# extend\n" 3 +reg: CVUU4(reg) "# extend\n" 3 + +reg: CVII1(reg) "# truncate\n" 1 +reg: CVII2(reg) "# truncate\n" 1 +reg: CVUU1(reg) "# truncate\n" 1 +reg: CVUU2(reg) "# truncate\n" 1 + +mrca: mem4 "%0" +mrca: rc "%0" +mrca: ADDRGP4 "$%a" +mrca: ADDRGP8 "$%a" + +stmt: ASGNI1(addr,rc) "movb %1,%0\n" 1 +stmt: ASGNI2(addr,rc) "movw %1,%0\n" 1 +stmt: ASGNI4(addr,rc) "movl %1,%0\n" 1 +stmt: ASGNU1(addr,rc) "movb %1,%0\n" 1 +stmt: ASGNU2(addr,rc) "movw %1,%0\n" 1 +stmt: ASGNU4(addr,rc) "movl %1,%0\n" 1 +stmt: ASGNP4(addr,rc) "movl %1,%0\n" 1 +stmt: ARGI4(mrca) "pushl %0\n" 1 +stmt: ARGU4(mrca) "pushl %0\n" 1 +stmt: ARGP4(mrca) "pushl %0\n" 1 +stmt: ASGNB(reg,INDIRB(reg)) "movl $%a,%%ecx\nrep\nmovsb\n" +stmt: ARGB(INDIRB(reg)) "subl $%a,%%esp\nmovl %%esp,%%edi\nmovl $%a,%%ecx\nrep\nmovsb\n" + +memf: INDIRF8(addr) "l %0" +memf: INDIRF4(addr) "s %0" +memf: CVFF8(INDIRF4(addr)) "s %0" +memf: CVFF4(INDIRF8(addr)) "l %0" + +freg: memf "fld%0\n" 3 + +stmt: ASGNF8(addr,freg) "fstpl %0\n" 7 +stmt: ASGNF4(addr,freg) "fstps %0\n" 7 +stmt: ASGNF4(addr,CVFF4(freg)) "fstps %0\n" 7 + +stmt: ARGF8(freg) "subl $8,%%esp\nfstpl (%%esp)\n" +stmt: ARGF4(freg) "subl $4,%%esp\nfstps (%%esp)\n" +freg: NEGF8(freg) "fchs\n" +freg: NEGF4(freg) "fchs\n" + +flt: memf "%0" +flt: freg "p %%st(1),%%st" + +freg: ADDF4(freg,flt) "fadd%1\n" +freg: ADDF8(freg,flt) "fadd%1\n" + +freg: DIVF4(freg,flt) "fdiv%1\n" +freg: DIVF8(freg,flt) "fdiv%1\n" + +freg: MULF4(freg,flt) "fmul%1\n" +freg: MULF8(freg,flt) "fmul%1\n" + +freg: SUBF4(freg,flt) "fsub%1\n" +freg: SUBF8(freg,flt) "fsub%1\n" + +freg: CVFF8(freg) "# CVFF8\n" +freg: CVFF4(freg) "sub $4,%%esp\nfstps (%%esp)\nflds (%%esp)\naddl $4,%%esp\n" 12 + +stmt: ASGNI4(addr,CVFI4(freg)) "fistpl %0\n" 29 +reg: CVFI4(freg) "subl $4,%%esp\nfistpl 0(%%esp)\npopl %c\n" 31 + +freg: CVIF8(INDIRI4(addr)) "fildl %0\n" 10 +freg: CVIF8(reg) "pushl %0\nfildl (%%esp)\naddl $4,%%esp\n" 12 + +freg: CVIF4(INDIRI4(addr)) "fildl %0\n" 10 +freg: CVIF4(reg) "pushl %0\nfildl (%%esp)\naddl $4,%%esp\n" 12 + +addrj: ADDRGP4 "%a" +addrj: reg "*%0" 2 +addrj: mem4 "*%0" 2 + +stmt: LABELV "%a:\n" +stmt: JUMPV(addrj) "jmp %0\n" 3 +stmt: EQI4(mem4,rc) "cmpl %1,%0\nje %a\n" 5 +stmt: GEI4(mem4,rc) "cmpl %1,%0\njge %a\n" 5 +stmt: GTI4(mem4,rc) "cmpl %1,%0\njg %a\n" 5 +stmt: LEI4(mem4,rc) "cmpl %1,%0\njle %a\n" 5 +stmt: LTI4(mem4,rc) "cmpl %1,%0\njl %a\n" 5 +stmt: NEI4(mem4,rc) "cmpl %1,%0\njne %a\n" 5 +stmt: GEU4(mem4,rc) "cmpl %1,%0\njae %a\n" 5 +stmt: GTU4(mem4,rc) "cmpl %1,%0\nja %a\n" 5 +stmt: LEU4(mem4,rc) "cmpl %1,%0\njbe %a\n" 5 +stmt: LTU4(mem4,rc) "cmpl %1,%0\njb %a\n" 5 +stmt: EQI4(reg,mrc) "cmpl %1,%0\nje %a\n" 4 +stmt: GEI4(reg,mrc) "cmpl %1,%0\njge %a\n" 4 +stmt: GTI4(reg,mrc) "cmpl %1,%0\njg %a\n" 4 +stmt: LEI4(reg,mrc) "cmpl %1,%0\njle %a\n" 4 +stmt: LTI4(reg,mrc) "cmpl %1,%0\njl %a\n" 4 +stmt: NEI4(reg,mrc) "cmpl %1,%0\njne %a\n" 4 + +stmt: EQU4(reg,mrc) "cmpl %1,%0\nje %a\n" 4 +stmt: GEU4(reg,mrc) "cmpl %1,%0\njae %a\n" 4 +stmt: GTU4(reg,mrc) "cmpl %1,%0\nja %a\n" 4 +stmt: LEU4(reg,mrc) "cmpl %1,%0\njbe %a\n" 4 +stmt: LTU4(reg,mrc) "cmpl %1,%0\njb %a\n" 4 +stmt: NEU4(reg,mrc) "cmpl %1,%0\njne %a\n" 4 + +stmt: EQI4(BANDU4(mr,con),con0) "testl %1,%0\nje %a\n" 3 +stmt: NEI4(BANDU4(mr,con),con0) "testl %1,%0\njne %a\n" + +stmt: EQI4(BANDU4(CVII2(INDIRI2(addr)),con),con0) "testw %1,%0\nje %a\n" +stmt: NEI4(BANDU4(CVII2(INDIRI2(addr)),con),con0) "testw %1,%0\njne %a\n" +stmt: EQI4(BANDU4(CVIU2(INDIRI2(addr)),con),con0) "testw %1,%0\nje %a\n" +stmt: NEI4(BANDU4(CVIU2(INDIRI2(addr)),con),con0) "testw %1,%0\njne %a\n" +stmt: EQI4(BANDU4(CVII1(INDIRI1(addr)),con),con0) "testb %1,%0\nje %a\n" + +cmpf: INDIRF8(addr) "l %0" +cmpf: INDIRF4(addr) "s %0" +cmpf: CVFF8(INDIRF4(addr)) "s %0" +cmpf: freg "p" + +stmt: EQF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nje %a\n" +stmt: GEF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njbe %a\n" +stmt: GTF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njb %a\n" +stmt: LEF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njae %a\n" +stmt: LTF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nja %a\n" +stmt: NEF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njne %a\n" + +stmt: EQF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nje %a\n" +stmt: GEF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njbe %a\n" +stmt: GTF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njb %a\n" +stmt: LEF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njae %a\n" +stmt: LTF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nja %a\n" +stmt: NEF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njne %a\n" + +freg: DIVF8(freg,CVIF8(INDIRI4(addr))) "fidivl %1\n" +freg: DIVF8(CVIF8(INDIRI4(addr)),freg) "fidivrl %0\n" +freg: DIVF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fidivs %1\n" +freg: DIVF8(CVIF8(CVII2(INDIRI2(addr))),freg) "fidivrs %0\n" +freg: MULF8(freg,CVIF8(INDIRI4(addr))) "fimull %1\n" +freg: MULF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fimuls %1\n" +freg: SUBF8(freg,CVIF8(INDIRI4(addr))) "fisubl %1\n" +freg: SUBF8(CVIF8(INDIRI4(addr)),freg) "fisubrl %0\n" +freg: SUBF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fisubs %1\n" +freg: SUBF8(CVIF8(CVII2(INDIRI2(addr))),freg) "fisubrs %0\n" +freg: ADDF8(freg,CVIF8(INDIRI4(addr))) "fiaddl %1\n" +freg: ADDF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fiadds %1\n" +freg: ADDF8(freg,CVFF8(INDIRF4(addr))) "fdivs %1\n" +freg: SUBF8(freg,CVFF8(INDIRF4(addr))) "fsubs %1\n" +freg: MULF8(freg,CVFF8(INDIRF4(addr))) "fmuls %1\n" +freg: DIVF8(freg,CVFF8(INDIRF4(addr))) "fdivs %1\n" +freg: LOADF8(memf) "fld%0\n" + +reg: CALLI4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a) +reg: CALLU4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a) +reg: CALLP4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a) + +reg: CALLI4(addrj) "call %0\n" 1 +reg: CALLU4(addrj) "call %0\n" 1 +reg: CALLP4(addrj) "call %0\n" 1 + +stmt: CALLV(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a) +stmt: CALLV(addrj) "call %0\n" 1 + +freg: CALLF4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a) +freg: CALLF4(addrj) "call %0\n" 1 + +stmt: CALLF4(addrj) "call %0\naddl $%a,%%esp\nfstp %%st(0)\n" hasargs(a) +stmt: CALLF4(addrj) "call %0\nfstp %%st(0)\n" 1 + +freg: CALLF8(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a) +freg: CALLF8(addrj) "call %0\n" 1 + +stmt: CALLF8(addrj) "call %0\naddl $%a,%%esp\nfstp %%st(0)\n" hasargs(a) +stmt: CALLF8(addrj) "call %0\nfstp %%st(0)\n" 1 + +stmt: RETI4(reg) "# ret\n" +stmt: RETU4(reg) "# ret\n" +stmt: RETP4(reg) "# ret\n" +stmt: RETF4(freg) "# ret\n" +stmt: RETF8(freg) "# ret\n" +%% +static void progbeg(int argc, char *argv[]) { + int i; + + { + union { + char c; + int i; + } u; + u.i = 0; + u.c = 1; + swap = ((int)(u.i == 1)) != IR->little_endian; + } + parseflags(argc, argv); + for (i = 0; i < argc; i++) + if (strcmp(argv[i], "-p") == 0 || strcmp(argv[i], "-pg") == 0) + pflag = 1; + intreg[EAX] = mkreg("%%eax", EAX, 1, IREG); + intreg[EDX] = mkreg("%%edx", EDX, 1, IREG); + intreg[ECX] = mkreg("%%ecx", ECX, 1, IREG); + intreg[EBX] = mkreg("%%ebx", EBX, 1, IREG); + intreg[ESI] = mkreg("%%esi", ESI, 1, IREG); + intreg[EDI] = mkreg("%%edi", EDI, 1, IREG); + shortreg[EAX] = mkreg("%%ax", EAX, 1, IREG); + shortreg[ECX] = mkreg("%%cx", ECX, 1, IREG); + shortreg[EDX] = mkreg("%%dx", EDX, 1, IREG); + shortreg[EBX] = mkreg("%%bx", EBX, 1, IREG); + shortreg[ESI] = mkreg("%%si", ESI, 1, IREG); + shortreg[EDI] = mkreg("%%di", EDI, 1, IREG); + charreg[EAX] = mkreg("%%al", EAX, 1, IREG); + charreg[ECX] = mkreg("%%cl", ECX, 1, IREG); + charreg[EDX] = mkreg("%%dl", EDX, 1, IREG); + charreg[EBX] = mkreg("%%bl", EBX, 1, IREG); + for (i = 0; i < 8; i++) + fltreg[i] = mkreg("%d", i, 0, FREG); + charregw = mkwildcard(charreg); + shortregw = mkwildcard(shortreg); + intregw = mkwildcard(intreg); + fltregw = mkwildcard(fltreg); + + tmask[IREG] = (1<x.regnode->mask |= 1<x.regnode->mask |= 1<type->size > 0) + print(".size %s,%d\n", prevg->x.name, prevg->type->size); + prevg = NULL; +} + +static void progend(void) { + globalend(); + (*IR->segment)(CODE); + print(".ident \"LCC: 4.1\"\n"); +} + +static void target(Node p) { + assert(p); + switch (specific(p->op)) { + case RSH+I: case RSH+U: case LSH+I: case LSH+U: + if (generic(p->kids[1]->op) != CNST + && !( generic(p->kids[1]->op) == INDIR + && specific(p->kids[1]->kids[0]->op) == VREG+P + && p->kids[1]->syms[RX]->u.t.cse + && generic(p->kids[1]->syms[RX]->u.t.cse->op) == CNST)) { + rtarget(p, 1, intreg[ECX]); + setreg(p, intreg[EAX]); + } + break; + case MUL+U: + setreg(p, quo); + rtarget(p, 0, intreg[EAX]); + break; + case DIV+I: case DIV+U: + setreg(p, quo); + rtarget(p, 0, intreg[EAX]); + rtarget(p, 1, intreg[ECX]); + break; + case MOD+I: case MOD+U: + setreg(p, rem); + rtarget(p, 0, intreg[EAX]); + rtarget(p, 1, intreg[ECX]); + break; + case ASGN+B: + rtarget(p, 0, intreg[EDI]); + rtarget(p->kids[1], 0, intreg[ESI]); + break; + case ARG+B: + rtarget(p->kids[0], 0, intreg[ESI]); + break; + case CVF+I: + setreg(p, intreg[EAX]); + break; + case CALL+I: case CALL+U: case CALL+P: case CALL+V: + setreg(p, intreg[EAX]); + break; + case RET+I: case RET+U: case RET+P: + rtarget(p, 0, intreg[EAX]); + break; + } +} + +static void clobber(Node p) { + static int nstack = 0; + + assert(p); + nstack = ckstack(p, nstack); + switch (specific(p->op)) { + case ASGN+B: case ARG+B: + spill(1<op); +#define preg(f) ((f)[getregnum(p->x.kids[0])]->x.name) + + if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movsbl %s,%s\n", preg(charreg), p->syms[RX]->x.name); + else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movsbl %s,%s\n", preg(charreg), p->syms[RX]->x.name); + else if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movswl %s,%s\n", preg(shortreg), p->syms[RX]->x.name); + else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movswl %s,%s\n", preg(shortreg), p->syms[RX]->x.name); + else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movzbl %s,%s\n", preg(charreg), p->syms[RX]->x.name); + else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1) + print("movzbl %s,%s\n", preg(charreg), p->syms[RX]->x.name); + else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movzwl %s,%s\n", preg(shortreg), p->syms[RX]->x.name); + else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2) + print("movzwl %s,%s\n", preg(shortreg), p->syms[RX]->x.name); + else if (generic(op) == CVI || generic(op) == CVU || generic(op) == LOAD) { + char *dst = intreg[getregnum(p)]->x.name; + char *src = preg(intreg); + assert(opsize(p->op) <= opsize(p->x.kids[0]->op)); + if (dst != src) + print("movl %s,%s\n", src, dst); + } +} + +static void function(Symbol f, Symbol caller[], Symbol callee[], int n) { + int i; + + globalend(); + print(".align 16\n"); + print(".type %s,@function\n", f->x.name); + print("%s:\n", f->x.name); + print("pushl %%ebp\n"); + if (pflag) { + static int plab; + print("movl %%esp,%%ebp\n"); + (*IR->segment)(DATA); + print(".align 4\n.LP%d:\n.long 0\n", plab); + (*IR->segment)(CODE); + print("movl $.LP%d,%%edx\ncall mcount\n", plab); + plab++; + } + print("pushl %%ebx\n"); + print("pushl %%esi\n"); + print("pushl %%edi\n"); + print("movl %%esp,%%ebp\n"); + + usedmask[0] = usedmask[1] = 0; + freemask[0] = freemask[1] = ~0U; + offset = 16 + 4; + for (i = 0; callee[i]; i++) { + Symbol p = callee[i]; + Symbol q = caller[i]; + assert(q); + offset = roundup(offset, q->type->align); + p->x.offset = q->x.offset = offset; + p->x.name = q->x.name = stringf("%d", p->x.offset); + p->sclass = q->sclass = AUTO; + offset += roundup(q->type->size, 4); + } + assert(caller[i] == 0); + offset = maxoffset = 0; + gencode(caller, callee); + framesize = roundup(maxoffset, 4); + if (framesize > 0) + print("subl $%d,%%esp\n", framesize); + emitcode(); + print("movl %%ebp,%%esp\n"); + print("popl %%edi\n"); + print("popl %%esi\n"); + print("popl %%ebx\n"); + print("popl %%ebp\n"); + print("ret\n"); + { int l = genlabel(1); + print(".Lf%d:\n", l); + print(".size %s,.Lf%d-%s\n", f->x.name, l, f->x.name); + } +} + +static void defsymbol(Symbol p) { + if (p->scope >= LOCAL && p->sclass == STATIC) + p->x.name = stringf("%s.%d", p->name, genlabel(1)); + else if (p->generated) + p->x.name = stringf(".LC%s", p->name); + else if (p->scope == GLOBAL || p->sclass == EXTERN) + p->x.name = stringf("%s", p->name); + else + p->x.name = p->name; +} + +static void segment(int n) { + if (n == cseg) + return; + cseg = n; + if (cseg == CODE) + print(".text\n"); + else if (cseg == BSS) + print(".bss\n"); + else if (cseg == DATA || cseg == LIT) + print(".data\n"); +} + +static void defconst(int suffix, int size, Value v) { + if (suffix == I && size == 1) + print(".byte %d\n", v.u); + else if (suffix == I && size == 2) + print(".word %d\n", v.i); + else if (suffix == I && size == 4) + print(".long %d\n", v.i); + else if (suffix == U && size == 1) + print(".byte %d\n", v.u); + else if (suffix == U && size == 2) + print(".word %d\n", v.u); + else if (suffix == U && size == 4) + print(".long %d\n", v.u); + else if (suffix == P && size == 4) + print(".long %d\n", v.p); + else if (suffix == F && size == 4) { + float f = v.d; + print(".long %d\n", *(unsigned *)&f); + } else if (suffix == F && size == 8) { + double d = v.d; + unsigned *p = (unsigned *)&d; + print(".long %d\n.long %d\n", p[swap], p[!swap]); + } + else assert(0); +} + +static void defaddress(Symbol p) { + print(".long %s\n", p->x.name); +} + +static void defstring(int n, char *str) { + char *s; + + for (s = str; s < str + n; s++) + print(".byte %d\n", (*s)&0377); +} + +static void export(Symbol p) { + globalend(); + print(".globl %s\n", p->x.name); +} + +static void import(Symbol p) {} + +static void global(Symbol p) { + globalend(); + print(".align %d\n", p->type->align > 4 ? 4 : p->type->align); + if (!p->generated) { + print(".type %s,@%s\n", p->x.name, + isfunc(p->type) ? "function" : "object"); + if (p->type->size > 0) + print(".size %s,%d\n", p->x.name, p->type->size); + else + prevg = p; + } + if (p->u.seg == BSS) { + if (p->sclass == STATIC) + print(".lcomm %s,%d\n", p->x.name, p->type->size); + else + print(".comm %s,%d\n", p->x.name, p->type->size); + } else { + print("%s:\n", p->x.name); + } +} + +static void space(int n) { + if (cseg != BSS) + print(".space %d\n", n); +} + +Interface x86linuxIR = { + 1, 1, 0, /* char */ + 2, 2, 0, /* short */ + 4, 4, 0, /* int */ + 4, 4, 0, /* long */ + 4, 4, 0, /* long long */ + 4, 4, 1, /* float */ + 8, 4, 1, /* double */ + 8, 4, 1, /* long double */ + 4, 4, 0, /* T * */ + 0, 4, 0, /* struct; so that ARGB keeps stack aligned */ + 1, /* little_endian */ + 0, /* mulops_calls */ + 0, /* wants_callb */ + 1, /* wants_argb */ + 0, /* left_to_right */ + 0, /* wants_dag */ + 0, /* unsigned_char */ + 0, /* address */ + blockbeg, + blockend, + defaddress, + defconst, + defstring, + defsymbol, + emit, + export, + function, + gen, + global, + import, + 0, /* local */ + progbeg, + progend, + segment, + space, + stabblock, stabend, 0, stabinit, stabline, stabsym, stabtype, + {1, rmap, + 0, 0, 0, /* blkfetch, blkstore, blkloop */ + _label, + _rule, + _nts, + _kids, + _string, + _templates, + _isinstruction, + _ntname, + emit2, + 0, /* doarg */ + target, + clobber, + } +}; + +void x86linux_init(int argc, char *argv[]) { + static int inited; + extern Interface x86IR; + + if (inited) + return; + inited = 1; +#define xx(f) assert(!x86linuxIR.f); x86linuxIR.f = x86IR.f + xx(address); + xx(local); + xx(x.blkfetch); + xx(x.blkstore); + xx(x.blkloop); + xx(x.doarg); +#undef xx +} diff --git a/quake3/source/lcc/tst/8q.0 b/quake3/source/lcc/tst/8q.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/8q.c b/quake3/source/lcc/tst/8q.c new file mode 100644 index 0000000..e55ba1a --- /dev/null +++ b/quake3/source/lcc/tst/8q.c @@ -0,0 +1,39 @@ +int up[15], down[15], rows[8], x[8]; +int queens(), print(); + +main() +{ + int i; + + for (i = 0; i < 15; i++) + up[i] = down[i] = 1; + for (i = 0; i < 8; i++) + rows[i] = 1; + queens(0); + return 0; +} + +queens(c) +{ + int r; + + for (r = 0; r < 8; r++) + if (rows[r] && up[r-c+7] && down[r+c]) { + rows[r] = up[r-c+7] = down[r+c] = 0; + x[c] = r; + if (c == 7) + print(); + else + queens(c + 1); + rows[r] = up[r-c+7] = down[r+c] = 1; + } +} + +print() +{ + int k; + + for (k = 0; k < 8; k++) + printf("%c ", x[k]+'1'); + printf("\n"); +} diff --git a/quake3/source/lcc/tst/array.0 b/quake3/source/lcc/tst/array.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/array.c b/quake3/source/lcc/tst/array.c new file mode 100644 index 0000000..7b03da5 --- /dev/null +++ b/quake3/source/lcc/tst/array.c @@ -0,0 +1,48 @@ +int x[3][4], *y[3]; + +main() { + int z[3][4]; + int i, j, *p; + + for (i = 0; i < 3; i++) { + for (j = 0; j < 4; j++) + x[i][j] = 1000*i + j; + y[i] = x[i]; + } + f(); + for (i = 0; i < 3; i++) { + y[i] = p = &z[i][0]; + for (j = 0; j < 4; j++) + p[j] = x[i][j]; + } + g(z, y); + return 0; +} + +f() { + int i, j; + + for (i = 0; i < 3; i++) + for (j = 0; j < 4; j++) + printf(" %d", x[i][j]); + printf("\n"); + for (i = 0; i < 3; i++) + for (j = 0; j < 4; j++) + printf(" %d", y[i][j]); + printf("\n"); +} + +g(x, y) +int x[][4], *y[]; +{ + int i, j; + + for (i = 0; i < 3; i++) + for (j = 0; j < 4; j++) + printf(" %d", x[i][j]); + printf("\n"); + for (i = 0; i < 3; i++) + for (j = 0; j < 4; j++) + printf(" %d", y[i][j]); + printf("\n"); +} diff --git a/quake3/source/lcc/tst/cf.0 b/quake3/source/lcc/tst/cf.0 new file mode 100644 index 0000000..1c9226a --- /dev/null +++ b/quake3/source/lcc/tst/cf.0 @@ -0,0 +1,32 @@ +/* cf - print character frequencies */ +float f[128]; + +main(argc, argv) +int argc; +char *argv[]; +{ + int i, c, nc; + float cutoff, atof(); + + if (argc <= 1) + cutoff = 0.0; + else + cutoff = atof(argv[1])/100; + for (i = 0; i <= 127; ) + f[i++] = 0.0; + nc = 0; + while ((c = getchar()) != -1) { + f[c] += 1; + nc++; + } + printf("char\tfreq\n"); + for (i = 0; i <= 127; ++i) + if (f[i] && f[i]/nc >= cutoff) { + if (i <= ' ') + printf("%03o", i); + else + printf("%c", i); + printf("\t%.1f\n", 100*f[i]/nc); + } + return 0; +} diff --git a/quake3/source/lcc/tst/cf.c b/quake3/source/lcc/tst/cf.c new file mode 100644 index 0000000..1c9226a --- /dev/null +++ b/quake3/source/lcc/tst/cf.c @@ -0,0 +1,32 @@ +/* cf - print character frequencies */ +float f[128]; + +main(argc, argv) +int argc; +char *argv[]; +{ + int i, c, nc; + float cutoff, atof(); + + if (argc <= 1) + cutoff = 0.0; + else + cutoff = atof(argv[1])/100; + for (i = 0; i <= 127; ) + f[i++] = 0.0; + nc = 0; + while ((c = getchar()) != -1) { + f[c] += 1; + nc++; + } + printf("char\tfreq\n"); + for (i = 0; i <= 127; ++i) + if (f[i] && f[i]/nc >= cutoff) { + if (i <= ' ') + printf("%03o", i); + else + printf("%c", i); + printf("\t%.1f\n", 100*f[i]/nc); + } + return 0; +} diff --git a/quake3/source/lcc/tst/cq.0 b/quake3/source/lcc/tst/cq.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/cq.c b/quake3/source/lcc/tst/cq.c new file mode 100644 index 0000000..55d18d1 --- /dev/null +++ b/quake3/source/lcc/tst/cq.c @@ -0,0 +1,5316 @@ + struct defs { + int cbits; /* No. of bits per char */ + int ibits; /* int */ + int sbits; /* short */ + int lbits; /* long */ + int ubits; /* unsigned */ + int fbits; /* float */ + int dbits; /* double */ + float fprec; /* Smallest number that can be */ + float dprec; /* significantly added to 1. */ + int flgs; /* Print return codes, by section */ + int flgm; /* Announce machine dependencies */ + int flgd; /* give explicit diagnostics */ + int flgl; /* Report local return codes. */ + int rrc; /* recent return code */ + int crc; /* Cumulative return code */ + char rfs[8]; /* Return from section */ + }; +main(n,args) /* C REFERENCE MANUAL */ +int n; +char **args; +{ + +/* This program performs a series of tests on a C compiler, +based on information in the + + C REFERENCE MANUAL + +which appears as Appendix A to the book "The C Programming +Language" by Brian W. Kernighan and Dennis M. Ritchie +(Prentice-Hall, 1978, $10.95). This Appendix is hereafter +referred to as "the Manual". + + The rules followed in writing this program are: + + 1. The entire program is written in legal C, according + to the Manual. It should compile with no error messages, + although some warning messages may be produced by some + compilers. Failure to compile should be interpreted as + a compiler error. + + 2. The program is clean, in that it does not make use + of any features of the operating system on which it runs, + with the sole exceptions of the printf() function, and an + internal "options" routine, which is easily excised. + + 3. No global variables are used, except for the spec- + ific purpose of testing the global variable facility. + + The program is divided into modules having names of the +form snnn... These modules correspond to those sections of the +Manual, as identified by boldface type headings, in which +there is something to test. For example, s241() corresponds +to section 2.4.1 of the Manual (Integer constants) and tests +the facilities described therein. The module numbering +scheme is ambiguous, especially when it names modules +referring to more than one section; module s7813, for ex- +ample, deals with sections 7.8 through 7.13. Nonetheless, +it is surprisingly easy to find a section in the Manual +corresponding to a section of code, and vice versa. + + Note also that there seem to be "holes" in the program, +at least from the point of view that there exist sections in the +Manual for which there is no corresponding code. Such holes +arise from three causes: (a) there is nothing in that partic- +ular section to test, (b) everything in that section is tested +elsewhere, and (c) it was deemed advisable not to check cer- +tain features like preprocessor or listing control features. + + Modules are called by a main program main(). The mod- +ules that are called, and the sequence in which they are +called, are determined by two lists in main(), in which the +module names appear. The first list (an extern statement) +declares the module names to be external. The second (a stat- +ic int statement) names the modules and defines the sequence +in which they are called. There is no need for these lists +to be in the same order, but it is probably a good idea to keep +them that way in the interest of clarity. Since there are no +cross-linkages between modules, new modules may be added, +or old ones deleted, simply by editing the lists, with one +exception: section s26, which pokes around at the hardware +trying to figure out the characteristics of the machine that +it is running on, saves information that is subsequently +used by sections s626, s72, and s757. If this program is +to be broken up into smallish pieces, say for running on +a microcomputer, take care to see that s26 is called before +calling any of the latter three sections. The size +of the lists, i.e., the number of modules to be called, is +not explicitly specified as a program parameter, but is +determined dynamically using the sizeof operator. + + Communication between the main program and the modules +takes place in two ways. In all cases, a pointer to a structure +is passed to the called module. The structure contains flags +that will determine the type of information to be published +by the module, and fields that may be written in by the +module. The former include "flgm" and "flgd", which, if set +to a nonzero value, specify that machine dependencies are to +be announced or that error messages are to be printed, re- +spectively. The called module's name, and the hardware char- +acteristics probed in s26() comprise the latter. + + + Also, in all cases, a return code is returned by the called +module. A return code of zero indicates that all has gone well; +nonzero indicates otherwise. Since more than one type of error +may be detected by a module, the return code is a composite +of error indicators, which, individually, are given as numbers +that are powers of two. Thus, a return code of 10 indicates +that two specific errors, 8 and 2, were detected. Whether or +not the codes returned by the modules are printed by the main +program is determined by setting "flgs" to 1 (resp. 0). + + The entire logic of the main program is contained in the +half-dozen or so lines at the end. The somewhat cryptic +statement: + + d0.rrc = (*sec[j])(pd0); + +in the for loop calls the modules. The rest of the code is +reasonably straightforward. + + Finally, in each of the modules, there is the following +prologue: + + snnn(pd0) + struct defs *pd0; + { + static char snnner[] = "snnn,er%d\n"; + static char qsnnn[8] = "snnn "; + char *ps, *pt; + int rc; + + rc = 0; + ps = qsnnn; + pt = pd0->rfs; + while(*pt++ = *ps++); + +used for housekeeping, handshaking and module initialization. + + */ + extern + s22(), + s241(), + s243(), + s244(), + s25(), + s26(), + s4(), + s61(), + s626(), + s71(), + s72(), + s757(), + s7813(), + s714(), + s715(), + s81(), + s84(), + s85(), + s86(), + s88(), + s9() + ; + + int j; + static int (*sec[])() = { + s22, + s241, + s243, + s244, + s25, + s26, + s4, + s61, + s626, + s71, + s72, + s757, + s7813, + s714, + s715, + s81, + s84, + s85, + s86, + s88, + s9 + }; + + static struct defs d0, *pd0; + + d0.flgs = 1; /* These flags dictate */ + d0.flgm = 1; /* the verbosity of */ + d0.flgd = 1; /* the program. */ + d0.flgl = 1; + + pd0 = &d0; + + for (j=0; j rfs; + while (*pt++ = *ps++); + + /* An identifier is a sequence of letters and digits; + the first character must be a letter. The under- + score _ counts as a letter. */ + + a=1; + _=2; + _234=3; + a234=4; + if(a+_+_234+a234 != 10) { + rc = rc+1; + if(pd0->flgd != 0) printf(s22er,1); + } + + /* Upper and lower case letters are different. */ + + A = 2; + if (A == a) { + rc = rc+4; + if (pd0->flgd != 0) printf(s22er,4); + } + + return(rc); +} +s241(pd0) /* 2.4.1 Integer constants + 2.4.2 Explicit long constants */ +struct defs *pd0; +{ + long pow2(); + static char s241er[] = "s241,er%d\n"; + static char qs241[8] = "s241 "; + char *ps, *pt; + int rc, j, lrc; + static long g[39] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,6,0,8,0,12,0,16,0,18,0,20,0,24, + 0,28,0,30,0,32,0,36}; + long d[39], o[39], x[39]; + + rc = 0; + lrc = 0; + ps = qs241; + pt = pd0 -> rfs; + while (*pt++ = *ps++); + + /* An integer constant consisting of a sequence of digits is + taken to be octal if it begins with 0 (digit zero), decimal + otherwise. */ + + if ( 8 != 010 + || 16 != 020 + || 24 != 030 + || 32 != 040 + || 40 != 050 + || 48 != 060 + || 56 != 070 + || 64 != 0100 + || 72 != 0110 + || 80 != 0120 + || 9 != 0011 + || 17 != 0021 + || 25 != 0031 + || 33 != 0041 + || 41 != 0051 + || 49 != 0061 + || 57 != 0071 + || 65 != 0101 + || 73 != 0111 + || 81 != 0121 ){ + + rc = rc+1; + if( pd0->flgd != 0 ) printf(s241er,1); + } + + /* A sequence of digits preceded by 0x or 0X (digit zero) + is taken to be a hexadecimal integer. The hexadecimal + digits include a or A through f or F with values 10 + through 15. */ + + if ( 0x00abcdef != 0xabcdef + || 0xabcdef != 0Xabcdef || 0Xabcdef != 0XAbcdef + || 0XAbcdef != 0XABcdef || 0XABcdef != 0XABCdef + || 0XABCdef != 0XABCDef || 0XABCDef != 0XABCDEf + || 0XABCDEf != 0XABCDEF || 0xABCDEF != 11259375 ){ + + rc = rc+2; + if( pd0->flgd != 0 ) printf(s241er,2); + } + + /* A decimal constant whose value exceeds the largest signed + machine integer is taken to be long; an octal or hex con- + stant which exceeds the largest unsigned machine integer + is likewise taken to be long. */ + + if ( sizeof 010000000000 != sizeof(long) /* 2**30 */ + || sizeof 1073741824 != sizeof(long) /* ditto */ + || sizeof 0x40000000 != sizeof(long) ){ /* " */ + + rc = rc+4; + if( pd0->flgd != 0 ) printf(s241er,4); + } + + /* A decimal, octal, or hexadecimal constant immediately followed + by l (letter ell) or L is a long constant. */ + + if ( sizeof 67l != sizeof(long) + || sizeof 67L != sizeof(long) + || sizeof 067l != sizeof(long) + || sizeof 067L != sizeof(long) + || sizeof 0X67l != sizeof(long) + || sizeof 0x67L != sizeof(long) ){ + + rc = rc+8; + if( pd0 -> flgd != 0 ) printf(s241er,8); + } + + /* Finally, we test to see that decimal (d), octal (o), + and hexadecimal (x) constants representing the same values + agree among themselves, and with computed values, at spec- + ified points over an appropriate range. The points select- + ed here are those with the greatest potential for caus- + ing trouble, i.e., zero, 1-16, and values of 2**n and + 2**n - 1 where n is some multiple of 4 or 6. Unfortunately, + just what happens when a value is too big to fit in a + long is undefined; however, it would be nice if what + happened were at least consistent... */ + + for ( j=0; j<17; j++ ) g[j] = j; + for ( j=18; j<39; ) { + g[j] = pow2(g[j]); + g[j-1] = g[j] - 1; + j = j+2; + } + + d[0] = 0; o[0] = 00; x[0] = 0x0; + d[1] = 1; o[1] = 01; x[1] = 0x1; + d[2] = 2; o[2] = 02; x[2] = 0x2; + d[3] = 3; o[3] = 03; x[3] = 0x3; + d[4] = 4; o[4] = 04; x[4] = 0x4; + d[5] = 5; o[5] = 05; x[5] = 0x5; + d[6] = 6; o[6] = 06; x[6] = 0x6; + d[7] = 7; o[7] = 07; x[7] = 0x7; + d[8] = 8; o[8] = 010; x[8] = 0x8; + d[9] = 9; o[9] = 011; x[9] = 0x9; + d[10] = 10; o[10] = 012; x[10] = 0xa; + d[11] = 11; o[11] = 013; x[11] = 0xb; + d[12] = 12; o[12] = 014; x[12] = 0xc; + d[13] = 13; o[13] = 015; x[13] = 0xd; + d[14] = 14; o[14] = 016; x[14] = 0xe; + d[15] = 15; o[15] = 017; x[15] = 0xf; + d[16] = 16; o[16] = 020; x[16] = 0x10; + d[17] = 63; o[17] = 077; x[17] = 0x3f; + d[18] = 64; o[18] = 0100; x[18] = 0x40; + d[19] = 255; o[19] = 0377; x[19] = 0xff; + d[20] = 256; o[20] = 0400; x[20] = 0x100; + d[21] = 4095; o[21] = 07777; x[21] = 0xfff; + d[22] = 4096; o[22] = 010000; x[22] = 0x1000; + d[23] = 65535; o[23] = 0177777; x[23] = 0xffff; + d[24] = 65536; o[24] = 0200000; x[24] = 0x10000; + d[25] = 262143; o[25] = 0777777; x[25] = 0x3ffff; + d[26] = 262144; o[26] = 01000000; x[26] = 0x40000; + d[27] = 1048575; o[27] = 03777777; x[27] = 0xfffff; + d[28] = 1048576; o[28] = 04000000; x[28] = 0x100000; + d[29] = 16777215; o[29] = 077777777; x[29] = 0xffffff; + d[30] = 16777216; o[30] = 0100000000; x[30] = 0x1000000; + d[31] = 268435455; o[31] = 01777777777; x[31] = 0xfffffff; + d[32] = 268435456; o[32] = 02000000000; x[32] = 0x10000000; + d[33] = 1073741823; o[33] = 07777777777; x[33] = 0x3fffffff; + d[34] = 1073741824; o[34] = 010000000000; x[34] = 0x40000000; + d[35] = 4294967295; o[35] = 037777777777; x[35] = 0xffffffff; + d[36] = 4294967296; o[36] = 040000000000; x[36] = 0x100000000; + d[37] = 68719476735; o[37] = 0777777777777; x[37] = 0xfffffffff; + d[38] = 68719476736; o[38] = 01000000000000; x[38] = 0x1000000000; + + /* WHEW! */ + + for (j=0; j<39; j++){ + if ( g[j] != d[j] + || d[j] != o[j] + || o[j] != x[j]) { + + if( pd0 -> flgm != 0 ) { +/* printf(s241er,16); save in case opinions change... */ + printf("Decimal and octal/hex constants sometimes give\n"); + printf(" different results when assigned to longs.\n"); + } +/* lrc = 1; save... */ + } + } + + if (lrc != 0) rc =16; + + return rc; +} + +long pow2(n) /* Calculate 2**n by multiplying, not shifting */ +long n; +{ + long s; + s = 1; + while(n--) s = s*2; + return s; +} +s243(pd0) /* 2.4.3 Character constants */ +struct defs *pd0; +{ + static char s243er[] = "s243,er%d\n"; + static char qs243[8] = "s243 "; + char *ps, *pt; + int rc; + char chars[256]; + + rc = 0; + ps = qs243; + pt = pd0->rfs; + while(*pt++ = *ps++); + + /* One of the problems that arises when testing character constants + is that of definition: What, exactly, is the character set? + In order to guarantee a certain amount of machine independence, + the character set we will use here is the set of characters writ- + able as escape sequences in C, plus those characters used in writ- + ing C programs, i.e., + + letters: + ABCDEFGHIJKLMNOPQRSTUVWXYZ 26 + abcdefghijklmnopqrstuvwxyz 26 + numbers: + 0123456789 10 + special characters: + ~!"#%&()_=-^|{}[]+;*:<>,.?/ 27 + extra special characters: + newline \n + horizontal tab \t + backspace \b + carriage return \r + form feed \f + backslash \\ + single quote \' 7 + blank & NUL 2 + --- + 98 + + Any specific implementation of C may of course support additional + characters. */ + + /* Since the value of a character constant is the numerical value + of the character in the machine's character set, there should + be a one-to-one correspondence between characters and values. */ + + zerofill(chars); + + chars['a'] = 1; chars['A'] = 1; chars['~'] = 1; chars['0'] = 1; + chars['b'] = 1; chars['B'] = 1; chars['!'] = 1; chars['1'] = 1; + chars['c'] = 1; chars['C'] = 1; chars['"'] = 1; chars['2'] = 1; + chars['d'] = 1; chars['D'] = 1; chars['#'] = 1; chars['3'] = 1; + chars['e'] = 1; chars['E'] = 1; chars['%'] = 1; chars['4'] = 1; + chars['f'] = 1; chars['F'] = 1; chars['&'] = 1; chars['5'] = 1; + chars['g'] = 1; chars['G'] = 1; chars['('] = 1; chars['6'] = 1; + chars['h'] = 1; chars['H'] = 1; chars[')'] = 1; chars['7'] = 1; + chars['i'] = 1; chars['I'] = 1; chars['_'] = 1; chars['8'] = 1; + chars['j'] = 1; chars['J'] = 1; chars['='] = 1; chars['9'] = 1; + chars['k'] = 1; chars['K'] = 1; chars['-'] = 1; + chars['l'] = 1; chars['L'] = 1; chars['^'] = 1; + chars['m'] = 1; chars['M'] = 1; chars['|'] = 1; chars['\n'] = 1; + chars['n'] = 1; chars['N'] = 1; chars['\t'] = 1; + chars['o'] = 1; chars['O'] = 1; chars['{'] = 1; chars['\b'] = 1; + chars['p'] = 1; chars['P'] = 1; chars['}'] = 1; chars['\r'] = 1; + chars['q'] = 1; chars['Q'] = 1; chars['['] = 1; chars['\f'] = 1; + chars['r'] = 1; chars['R'] = 1; chars[']'] = 1; + chars['s'] = 1; chars['S'] = 1; chars['+'] = 1; chars['\\'] = 1; + chars['t'] = 1; chars['T'] = 1; chars[';'] = 1; chars['\''] = 1; + chars['u'] = 1; chars['U'] = 1; chars['*'] = 1; + chars['v'] = 1; chars['V'] = 1; chars[':'] = 1; chars['\0'] = 1; + chars['w'] = 1; chars['W'] = 1; chars['<'] = 1; chars[' '] = 1; + chars['x'] = 1; chars['X'] = 1; chars['>'] = 1; + chars['y'] = 1; chars['Y'] = 1; chars[','] = 1; + chars['z'] = 1; chars['Z'] = 1; chars['.'] = 1; + chars['?'] = 1; + chars['/'] = 1; + + if(sumof(chars) != 98){ + rc = rc+1; + if(pd0->flgd != 0) printf(s243er,1); + } + + /* Finally, the escape \ddd consists of the backslash followed + by 1, 2, or 3 octal digits which are taken to specify the + desired character. */ + + if( '\0' != 0 || '\01' != 1 || '\02' != 2 + || '\03' != 3 || '\04' != 4 || '\05' != 5 + || '\06' != 6 || '\07' != 7 || '\10' != 8 + || '\17' != 15 || '\20' != 16 || '\77' != 63 + || '\100' != 64 || '\177' != 127 ){ + + rc = rc+8; + if(pd0->flgd != 0) printf(s243er,8); + } + + return rc; +} +zerofill(x) +char *x; +{ + int j; + + for (j=0; j<256; j++) *x++ = 0; +} +sumof(x) +char *x; +{ + char *p; + int total, j; + + p = x; + total = 0; + + for(j=0; j<256; j++) total = total+ *p++; + return total; +} +s244(pd0) +struct defs *pd0; +{ + double a[8]; + int rc, lrc, j; + static char s244er[] = "s244,er%d\n"; + static char qs244[8] = "s244 "; + char *ps, *pt; + + ps = qs244; + pt = pd0->rfs; + while(*pt++ = *ps++); + rc = 0; + lrc = 0; + + /* Unfortunately, there's not a lot we can do with floating constants. + We can check to see that the various representations can be com- + piled, that the conversion is such that they yield the same hard- + ware representations in all cases, and that all representations + thus checked are double precision. */ + + a[0] = .1250E+04; + a[1] = 1.250E3; + a[2] = 12.50E02; + a[3] = 125.0e+1; + a[4] = 1250e00; + a[5] = 12500.e-01; + a[6] = 125000e-2; + a[7] = 1250.; + + lrc = 0; + for (j=0; j<7; j++) if(a[j] != a[j+1]) lrc = 1; + + if(lrc != 0) { + if(pd0->flgd != 0) printf(s244er,1); + rc = rc+1; + } + + if ( (sizeof .1250E+04 ) != sizeof(double) + || (sizeof 1.250E3 ) != sizeof(double) + || (sizeof 12.50E02 ) != sizeof(double) + || (sizeof 1.250e+1 ) != sizeof(double) + || (sizeof 1250e00 ) != sizeof(double) + || (sizeof 12500.e-01) != sizeof(double) + || (sizeof 125000e-2 ) != sizeof(double) + || (sizeof 1250. ) != sizeof(double)){ + + if(pd0->flgd != 0) printf(s244er,2); + rc = rc+2; + } + + return rc; +} +s25(pd0) +struct defs *pd0; +{ + char *s, *s2; + int rc, lrc, j; + static char s25er[] = "s25,er%d\n"; + static char qs25[8] = "s25 "; + char *ps, *pt; + + ps = qs25; + pt = pd0->rfs; + while(*pt++ = *ps++); + rc = 0; + + /* A string is a sequence of characters surrounded by double + quotes, as in "...". */ + + s = "..."; + + /* A string has type "array of characters" and storage class + static and is initialized with the given characters. */ + + if ( s[0] != s[1] || s[1] != s[2] + || s[2] != '.' ) { + + rc = rc+1; + if(pd0->flgd != 0) printf(s25er,1); + } + + /* The compiler places a null byte \0 at the end of each string + so the program which scans the string can find its end. */ + + if( s[3] != '\0' ){ + rc = rc+4; + if(pd0->flgd != 0) printf(s25er,4); + } + + /* In a string, the double quote character " must be preceded + by a \. */ + + if( ".\"."[1] != '"' ){ + rc = rc+8; + if(pd0->flgd != 0) printf(s25er,8); + } + + /* In addition, the same escapes described for character constants + may be used. */ + + s = "\n\t\b\r\f\\\'"; + + if( s[0] != '\n' + || s[1] != '\t' + || s[2] != '\b' + || s[3] != '\r' + || s[4] != '\f' + || s[5] != '\\' + || s[6] != '\'' ){ + + rc = rc+16; + if( pd0->flgd != 0) printf(s25er,16); + } + + /* Finally, a \ and an immediately following newline are ignored */ + + s2 = "queep!"; + s = "queep!"; + + lrc = 0; + for (j=0; jflgd != 0) printf(s25er,32); + } + return rc; +} +s26(pd0) /* 2.6 Hardware Characteristics */ +struct defs *pd0; +{ + static char qs26[8] = "s26 "; + char *ps, *pt; + char c0, c1; + float temp, one, delta; + double tempd, oned; + static char s[] = "%3d bits in %ss.\n"; + static char s2[] = "%e is the least number that can be added to 1. (%s).\n"; + + ps = qs26; + pt = pd0->rfs; + + while(*pt++ = *ps++); + + /* Here, we shake the machinery a little to see what falls + out. First, we find out how many bits are in a char. */ + + pd0->cbits = 0; + c0 = 0; + c1 = 1; + + while(c0 != c1) { + c1 = c1<<1; + pd0->cbits = pd0->cbits+1; + } + /* That information lets us determine the size of everything else. */ + + pd0->ibits = pd0->cbits * sizeof(int); + pd0->sbits = pd0->cbits * sizeof(short); + pd0->lbits = pd0->cbits * sizeof(long); + pd0->ubits = pd0->cbits * sizeof(unsigned); + pd0->fbits = pd0->cbits * sizeof(float); + pd0->dbits = pd0->cbits * sizeof(double); + + /* We have now almost reconstructed the table in section 2.6, the + exception being the range of the floating point hardware. + Now there are just so many ways to conjure up a floating point + representation system that it's damned near impossible to guess + what's going on by writing a program to interpret bit patterns. + Further, the information isn't all that useful, if we consider + the fact that machines that won't handle numbers between 10**30 + and 10**-30 are very hard to find, and that people playing with + numbers outside that range have a lot more to worry about than + just the capacity of the characteristic. + + A much more useful measure is the precision, which can be ex- + pressed in terms of the smallest number that can be added to + 1. without loss of significance. We calculate that here, for + float and double. */ + + one = 1.; + delta = 1.; + temp = 0.; + while(temp != one) { + temp = one+delta; + delta = delta/2.; + } + pd0->fprec = delta * 4.; + oned = 1.; + delta = 1.; + tempd = 0.; + while(tempd != oned) { + tempd = oned+delta; + delta = delta/2.; + } + pd0->dprec = delta * 4.; + + /* Now, if anyone's interested, we publish the results. */ + + if(pd0->flgm != 0) { + printf(s,pd0->cbits,"char"); + printf(s,pd0->ibits,"int"); + printf(s,pd0->sbits,"short"); + printf(s,pd0->lbits,"long"); + printf(s,pd0->ubits,"unsigned"); + printf(s,pd0->fbits,"float"); + printf(s,pd0->dbits,"double"); + printf(s2,pd0->fprec,"float"); + printf(s2,pd0->dprec,"double"); + } + /* Since we are only exploring and perhaps reporting, but not + testing any features, we cannot return an error code. */ + + return 0; +} +int extvar; +s4(pd0) /* 4. What's in a name? */ +struct defs *pd0; +{ + static char s4er[] = "s4,er%d\n"; + static char qs4[8] = "s4 "; + char *ps, *pt; + int j, rc; + + short sint; /* short integer, for size test */ + int pint; /* plain */ + long lint; /* long */ + unsigned target; + unsigned int mask; + + rc = 0; + ps = qs4; + pt = pd0->rfs; + + while(*pt++ = *ps++); + +/* There are four declarable storage classes: automatic, +static, external, and register. Automatic variables have +been dealt with extensively thus far, and will not be specif- +ically treated in this section. Register variables are treated +in section s81. + + Static variables are local to a block, but retain their +values upon reentry to a block, even after control has left +the block. */ + + for (j=0; j<3; j++) + if(svtest(j) != zero()){ + rc = 1; + if(pd0->flgd != 0) printf(s4er,1); + } + ; + +/* External variables exist and retain their values throughout +the execution of the entire program, and may be used for comm- +unication between functions, even separately compiled functions. + */ + + setev(); + if(testev() != 0){ + rc=rc+2; + if(pd0->flgd != 0) printf(s4er,2); + } +/* + Characters have been tested elsewhere (in s243). + + Up to three sizes of integer, declared short int, int, and +long int, are available. Longer integers provide no less storage +than shorter ones, but implementation may make either short +integers, or long integers, or both, equivalent to plain +integers. + */ + + if(sizeof lint < sizeof pint || sizeof pint < sizeof sint){ + + rc = rc+4; + if(pd0->flgd != 0) printf(s4er,4); + } + +/* Unsigned integers, declared unsigned, obey the laws of +arithmetic modulo 2**n, where n is the number of bits in the +implementation */ + + target = ~0U; + mask = 1; + + for(j=0; j<(sizeof target)*pd0->cbits; j++){ + + mask = mask⌖ + target = target>>1; + } + + if(mask != 1 || target != 0){ + + rc = rc+8; + if(pd0->flgd != 0) printf(s4er,8); + } + + return rc; +} +svtest(n) +int n; +{ + static k; + int rc; + switch (n) { + + case 0: k = 1978; + rc = 0; + break; + + case 1: if(k != 1978) rc = 1; + else{ + k = 1929; + rc = 0; + } + break; + + case 2: if(k != 1929) rc = 1; + else rc = 0; + break; + } + return rc; +} +zero(){ /* Returns a value of zero, possibly */ + static k; /* with side effects, as it's called */ + int rc; /* alternately with svtest, above, */ + k = 2; /* and has the same internal storage */ + rc = 0; /* requirements. */ + return rc; +} +testev(){ + if(extvar != 1066) return 1; + else return 0; +} +s61(pd0) /* Characters and integers */ +struct defs *pd0; +{ + static char s61er[] = "s61,er%d\n"; + static char qs61[8] = "s61 "; + short from, shortint; + long int to, longint; + int rc, lrc; + int j; + char fromc, charint; + char *wd, *pc[6]; + + static char upper_alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + static char lower_alpha[] = "abcdefghijklmnopqrstuvwxyz"; + static char numbers[] = "0123456789"; + static char special_characters[] = "~!\"#%&()_=-^|{}[]+;*:<>,.?/"; + static char extra_special_characters[] = "\n\t\b\r\f\\\'"; + static char blank_and_NUL[] = " \0"; + + char *ps, *pt; + ps = qs61; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + +/* A character or a short integer may be used wherever +an integer may be used. In all cases, the value is converted +to integer. This principle is extensively used throughout this +program, and will not be explicitly tested here. */ + +/* Conversion of a shorter integer to a longer always +involves sign extension. */ + + from = -19; + to = from; + + if(to != -19){ + rc = rc+1; + if(pd0->flgd != 0) printf(s61er,1); + } + +/* It is guaranteed that a member of the standard char- +acter set is nonnegative. */ + + pc[0] = upper_alpha; + pc[1] = lower_alpha; + pc[2] = numbers; + pc[3] = special_characters; + pc[4] = extra_special_characters; + pc[5] = blank_and_NUL; + + lrc = 0; + for (j=0; j<6; j++) + while(*pc[j]) if(*pc[j]++ < 0) lrc =1; + + if(lrc != 0){ + rc=rc+2; + if(pd0->flgd != 0) printf(s61er,2); + } + +/* When a longer integer is converted to a shorter or +to a char, it is truncated on the left; excess bits are +simply discarded. */ + + longint = 1048579; /* =2**20+3 */ + shortint = longint; + charint = longint; + + if((shortint != longint && shortint != 3) || + (charint != longint && charint != 3)) { + rc = rc+8; + if(pd0->flgd != 0) printf(s61er,8); + } + + return rc; +} +s626(pd0) /* 6.2 Float and double */ + /* 6.3 Floating and integral */ + /* 6.4 Pointers and integers */ + /* 6.5 Unsigned */ + /* 6.6 Arithmetic conversions */ +struct defs *pd0; +{ + static char s626er[] = "s626,er%d\n"; + static char qs626[8] = "s626 "; + int rc; + char *ps, *pt; + float eps, f1, f2, f3, f4, f; + long lint1, lint2, l, ls; + char c, t[28], t0; + short s; + int is, i, j; + unsigned u, us; + double d, ds; + ps = qs626; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* Conversions of integral values to floating type are + well-behaved. */ + + f1 = 1.; + lint1 = 1.; + lint2 = 1.; + + for(j=0;jlbits-2;j++){ + f1 = f1*2; + lint2 = (lint2<<1)|lint1; + } + f2 = lint2; + f1 = (f1-f2)/f1; + if(f1>2.*pd0->fprec){ + + rc = rc+2; + if(pd0->flgd != 0) printf(s626er,2); + } + + /* Pointer-integer combinations are discussed in s74, + "Additive operators". The unsigned-int combination + appears below. */ + + c = 125; + s = 125; + i = 125; is = 15625; + u = 125; us = 15625; + l = 125; ls = 15625; + f = 125.; + d = 125.; ds = 15625.; + + for(j=0;j<28;j++) t[j] = 0; + + if(c*c != is) t[ 0] = 1; + if(s*c != is) t[ 1] = 1; + if(s*s != is) t[ 2] = 1; + if(i*c != is) t[ 3] = 1; + if(i*s != is) t[ 4] = 1; + if(i*i != is) t[ 5] = 1; + if(u*c != us) t[ 6] = 1; + if(u*s != us) t[ 7] = 1; + if(u*i != us) t[ 8] = 1; + if(u*u != us) t[ 9] = 1; + if(l*c != ls) t[10] = 1; + if(l*s != ls) t[11] = 1; + if(l*i != ls) t[12] = 1; + if(l*u != us) t[13] = 1; + if(l*l != ls) t[14] = 1; + if(f*c != ds) t[15] = 1; + if(f*s != ds) t[16] = 1; + if(f*i != ds) t[17] = 1; + if(f*u != ds) t[18] = 1; + if(f*l != ds) t[19] = 1; + if(f*f != ds) t[20] = 1; + if(d*c != ds) t[21] = 1; + if(d*s != ds) t[22] = 1; + if(d*i != ds) t[23] = 1; + if(d*u != ds) t[24] = 1; + if(d*l != ds) t[25] = 1; + if(d*f != ds) t[26] = 1; + if(d*d != ds) t[27] = 1; + + t0 = 0; + for(j=0; j<28; j++) t0 = t0+t[j]; + + if(t0 != 0){ + + rc = rc+4; + if(pd0->flgd != 0){ + + printf(s626er,4); + printf(" key="); + for(j=0;j<28;j++) printf("%d",t[j]); + printf("\n"); + } + } + + /* When an unsigned integer is converted to long, + the value of the result is the same numerically + as that of the unsigned integer. */ + + l = (unsigned)0100000; + if((long)l > (unsigned)0100000){ + + rc = rc+8; + if(pd0->flgd != 0) printf(s626er,8); + } + + return rc; +} +s71(pd0) /* 7.1 Primary expressions */ +struct defs *pd0; +{ + static char s71er[] = "s71,er%d\n"; + static char qs71[8] = "s71 "; + int rc; + char *ps, *pt; + static char q = 'q'; + int x[10], McCarthy(), clobber(), a, b, *p; + ps = qs71; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + +/* Testing of expressions and operators is quite complicated, + because (a) problems are apt to surface in queer combinations + of operators and operands, rather than in isolation, + and (b) the number of expressions needed to provoke a case + of improper behaviour may be quite large. Hence, we take the + following approach: for this section, and for subsequent + sections through 7.15, we will check the primitive operations + in isolation, thus verifying that the primitives work, + after a fashion. The job of testing combinations, we will + leave to a separate, machine-generated program, to be included + in the C test package at some later date. + */ + +/* A string is a primary expression. The identifier points to + the first character of a string. + */ + + if(*"queep" != q){ + rc = rc+1; + if(pd0->flgd != 0) printf(s71er,1); + } +/* A parenthesized expression is a primary expression whose + type and value are the same as those of the unadorned + expression. + */ + if((2+3) != 2+3) { + rc = rc+2; + if(pd0->flgd != 0) printf(s71er,2); + } + +/* A primary expression followed by an expression in square + brackets is a primary expression. The intuitive meaning is + that of a subscript. The expression E1[E2] is identical + (by definition) to *((E1)+(E2)). + */ + + x[5] = 1942; + if(x[5] != 1942 || x[5] != *((x)+(5))){ + rc = rc+4; + if(pd0->flgd != 0) printf(s71er,4); + } + +/* If the various flavors of function calls didn't work, we + would never have gotten this far; however, we do need to + show that functions can be recursive... + */ + + if ( McCarthy(-5) != 91){ + rc = rc+8; + if(pd0->flgd != 0) printf(s71er,8); + } + +/* and that argument passing is strictly by value. */ + + a = 2; + b = 3; + p = &b; + + clobber(a,p); + + if(a != 2 || b != 2){ + rc = rc+16; + if(pd0->flgd != 0) printf(s71er,16); + } + +/* Finally, structures and unions are addressed thusly: */ + + if(pd0->dprec != (*pd0).dprec){ + rc = rc+32; + if(pd0->flgd != 0) printf(s71er,32); + } + + return rc; +} +McCarthy(x) +int x; +{ + if(x>100) return x-10; + else return McCarthy( McCarthy(x+11)); +} +clobber(x,y) +int x, *y; +{ + x = 3; + *y = 2; +} +s714(pd0) /* 7.14 Assignment operators */ +struct defs *pd0; +{ + static char f[] = "Local error %d.\n"; + static char s714er[] = "s714,er%d\n"; + static char qs714[8] = "s714 "; + register int prlc, lrc; + int rc; + char cl, cr; + short sl, sr; + int il, ir; + long ll, lr; + unsigned ul, ur; + float fl, fr; + double dl, dr; + char *ps, *pt; + ps = qs714; + pt = pd0->rfs; + rc = 0; + lrc = 0; + prlc = pd0->flgl; + while (*pt++ = *ps++); + + /* This section tests the assignment operators. + + It is an exhaustive test of all assignment statements + of the form: + + vl op vr + + where vl and vr are variables from the set + {char,short,int,long,unsigned,float,double} and op is + one of the assignment operators. There are 395 such + statements. + + The initial values for the variables have been chosen + so that both the initial values and the results will + "fit" in just about any implementation, and that the re- + sults will be such that they test for the proper form- + ation of composite operators, rather than checking for + the valid operation of those operators' components. + For example, in checking >>=, we want to verify that + a right shift and a move take place, rather than + whether or not there may be some peculiarities about + the right shift. Such tests have been made previously, + and to repeat them here would be to throw out a red + herring. + + The table below lists the operators, assignment targets, + initial values for left and right operands, and the + expected values of the results. + + + = += -= *= /= %= >>= <<= &= ^= |= +char 2 7 3 10 2 1 1 20 8 6 14 +short 2 7 3 10 2 1 1 20 8 6 14 +int 2 7 3 10 2 1 1 20 8 6 14 +long 2 7 3 10 2 1 1 20 8 6 14 +unsigned 2 7 3 10 2 1 1 20 8 6 14 +float 2 7 3 10 2.5 | | +double 2 7 3 10 2.5 | | + | | +initial (5,2) | (5,2) | (12,10) + + The following machine-generated program reflects the + tests described in the table. + */ + + cl = 5; cr = 2; + cl = cr; + if(cl != 2){ + lrc = 1; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl = sr; + if(cl != 2){ + lrc = 2; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl = ir; + if(cl != 2){ + lrc = 3; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl = lr; + if(cl != 2){ + lrc = 4; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl = ur; + if(cl != 2){ + lrc = 5; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl = fr; + if(cl != 2){ + lrc = 6; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl = dr; + if(cl != 2){ + lrc = 7; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl = cr; + if(sl != 2){ + lrc = 8; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl = sr; + if(sl != 2){ + lrc = 9; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl = ir; + if(sl != 2){ + lrc = 10; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl = lr; + if(sl != 2){ + lrc = 11; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl = ur; + if(sl != 2){ + lrc = 12; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl = fr; + if(sl != 2){ + lrc = 13; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl = dr; + if(sl != 2){ + lrc = 14; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il = cr; + if(il != 2){ + lrc = 15; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il = sr; + if(il != 2){ + lrc = 16; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il = ir; + if(il != 2){ + lrc = 17; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il = lr; + if(il != 2){ + lrc = 18; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il = ur; + if(il != 2){ + lrc = 19; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il = fr; + if(il != 2){ + lrc = 20; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il = dr; + if(il != 2){ + lrc = 21; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll = cr; + if(ll != 2){ + lrc = 22; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll = sr; + if(ll != 2){ + lrc = 23; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll = ir; + if(ll != 2){ + lrc = 24; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll = lr; + if(ll != 2){ + lrc = 25; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll = ur; + if(ll != 2){ + lrc = 26; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll = fr; + if(ll != 2){ + lrc = 27; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll = dr; + if(ll != 2){ + lrc = 28; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul = cr; + if(ul != 2){ + lrc = 29; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul = sr; + if(ul != 2){ + lrc = 30; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul = ir; + if(ul != 2){ + lrc = 31; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul = lr; + if(ul != 2){ + lrc = 32; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul = ur; + if(ul != 2){ + lrc = 33; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul = fr; + if(ul != 2){ + lrc = 34; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul = dr; + if(ul != 2){ + lrc = 35; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl = cr; + if(fl != 2){ + lrc = 36; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl = sr; + if(fl != 2){ + lrc = 37; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl = ir; + if(fl != 2){ + lrc = 38; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl = lr; + if(fl != 2){ + lrc = 39; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl = ur; + if(fl != 2){ + lrc = 40; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl = fr; + if(fl != 2){ + lrc = 41; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl = dr; + if(fl != 2){ + lrc = 42; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl = cr; + if(dl != 2){ + lrc = 43; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl = sr; + if(dl != 2){ + lrc = 44; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl = ir; + if(dl != 2){ + lrc = 45; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl = lr; + if(dl != 2){ + lrc = 46; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl = ur; + if(dl != 2){ + lrc = 47; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl = fr; + if(dl != 2){ + lrc = 48; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl = dr; + if(dl != 2){ + lrc = 49; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl += cr; + if(cl != 7){ + lrc = 50; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl += sr; + if(cl != 7){ + lrc = 51; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl += ir; + if(cl != 7){ + lrc = 52; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl += lr; + if(cl != 7){ + lrc = 53; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl += ur; + if(cl != 7){ + lrc = 54; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl += fr; + if(cl != 7){ + lrc = 55; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl += dr; + if(cl != 7){ + lrc = 56; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl += cr; + if(sl != 7){ + lrc = 57; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl += sr; + if(sl != 7){ + lrc = 58; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl += ir; + if(sl != 7){ + lrc = 59; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl += lr; + if(sl != 7){ + lrc = 60; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl += ur; + if(sl != 7){ + lrc = 61; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl += fr; + if(sl != 7){ + lrc = 62; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl += dr; + if(sl != 7){ + lrc = 63; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il += cr; + if(il != 7){ + lrc = 64; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il += sr; + if(il != 7){ + lrc = 65; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il += ir; + if(il != 7){ + lrc = 66; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il += lr; + if(il != 7){ + lrc = 67; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il += ur; + if(il != 7){ + lrc = 68; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il += fr; + if(il != 7){ + lrc = 69; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il += dr; + if(il != 7){ + lrc = 70; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll += cr; + if(ll != 7){ + lrc = 71; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll += sr; + if(ll != 7){ + lrc = 72; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll += ir; + if(ll != 7){ + lrc = 73; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll += lr; + if(ll != 7){ + lrc = 74; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll += ur; + if(ll != 7){ + lrc = 75; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll += fr; + if(ll != 7){ + lrc = 76; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll += dr; + if(ll != 7){ + lrc = 77; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul += cr; + if(ul != 7){ + lrc = 78; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul += sr; + if(ul != 7){ + lrc = 79; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul += ir; + if(ul != 7){ + lrc = 80; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul += lr; + if(ul != 7){ + lrc = 81; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul += ur; + if(ul != 7){ + lrc = 82; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul += fr; + if(ul != 7){ + lrc = 83; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul += dr; + if(ul != 7){ + lrc = 84; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl += cr; + if(fl != 7){ + lrc = 85; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl += sr; + if(fl != 7){ + lrc = 86; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl += ir; + if(fl != 7){ + lrc = 87; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl += lr; + if(fl != 7){ + lrc = 88; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl += ur; + if(fl != 7){ + lrc = 89; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl += fr; + if(fl != 7){ + lrc = 90; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl += dr; + if(fl != 7){ + lrc = 91; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl += cr; + if(dl != 7){ + lrc = 92; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl += sr; + if(dl != 7){ + lrc = 93; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl += ir; + if(dl != 7){ + lrc = 94; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl += lr; + if(dl != 7){ + lrc = 95; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl += ur; + if(dl != 7){ + lrc = 96; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl += fr; + if(dl != 7){ + lrc = 97; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl += dr; + if(dl != 7){ + lrc = 98; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl -= cr; + if(cl != 3){ + lrc = 99; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl -= sr; + if(cl != 3){ + lrc = 100; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl -= ir; + if(cl != 3){ + lrc = 101; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl -= lr; + if(cl != 3){ + lrc = 102; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl -= ur; + if(cl != 3){ + lrc = 103; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl -= fr; + if(cl != 3){ + lrc = 104; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl -= dr; + if(cl != 3){ + lrc = 105; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl -= cr; + if(sl != 3){ + lrc = 106; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl -= sr; + if(sl != 3){ + lrc = 107; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl -= ir; + if(sl != 3){ + lrc = 108; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl -= lr; + if(sl != 3){ + lrc = 109; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl -= ur; + if(sl != 3){ + lrc = 110; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl -= fr; + if(sl != 3){ + lrc = 111; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl -= dr; + if(sl != 3){ + lrc = 112; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il -= cr; + if(il != 3){ + lrc = 113; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il -= sr; + if(il != 3){ + lrc = 114; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il -= ir; + if(il != 3){ + lrc = 115; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il -= lr; + if(il != 3){ + lrc = 116; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il -= ur; + if(il != 3){ + lrc = 117; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il -= fr; + if(il != 3){ + lrc = 118; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il -= dr; + if(il != 3){ + lrc = 119; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll -= cr; + if(ll != 3){ + lrc = 120; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll -= sr; + if(ll != 3){ + lrc = 121; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll -= ir; + if(ll != 3){ + lrc = 122; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll -= lr; + if(ll != 3){ + lrc = 123; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll -= ur; + if(ll != 3){ + lrc = 124; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll -= fr; + if(ll != 3){ + lrc = 125; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll -= dr; + if(ll != 3){ + lrc = 126; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul -= cr; + if(ul != 3){ + lrc = 127; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul -= sr; + if(ul != 3){ + lrc = 128; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul -= ir; + if(ul != 3){ + lrc = 129; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul -= lr; + if(ul != 3){ + lrc = 130; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul -= ur; + if(ul != 3){ + lrc = 131; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul -= fr; + if(ul != 3){ + lrc = 132; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul -= dr; + if(ul != 3){ + lrc = 133; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl -= cr; + if(fl != 3){ + lrc = 134; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl -= sr; + if(fl != 3){ + lrc = 135; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl -= ir; + if(fl != 3){ + lrc = 136; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl -= lr; + if(fl != 3){ + lrc = 137; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl -= ur; + if(fl != 3){ + lrc = 138; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl -= fr; + if(fl != 3){ + lrc = 139; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl -= dr; + if(fl != 3){ + lrc = 140; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl -= cr; + if(dl != 3){ + lrc = 141; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl -= sr; + if(dl != 3){ + lrc = 142; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl -= ir; + if(dl != 3){ + lrc = 143; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl -= lr; + if(dl != 3){ + lrc = 144; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl -= ur; + if(dl != 3){ + lrc = 145; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl -= fr; + if(dl != 3){ + lrc = 146; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl -= dr; + if(dl != 3){ + lrc = 147; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl *= cr; + if(cl != 10){ + lrc = 148; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl *= sr; + if(cl != 10){ + lrc = 149; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl *= ir; + if(cl != 10){ + lrc = 150; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl *= lr; + if(cl != 10){ + lrc = 151; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl *= ur; + if(cl != 10){ + lrc = 152; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl *= fr; + if(cl != 10){ + lrc = 153; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl *= dr; + if(cl != 10){ + lrc = 154; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl *= cr; + if(sl != 10){ + lrc = 155; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl *= sr; + if(sl != 10){ + lrc = 156; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl *= ir; + if(sl != 10){ + lrc = 157; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl *= lr; + if(sl != 10){ + lrc = 158; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl *= ur; + if(sl != 10){ + lrc = 159; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl *= fr; + if(sl != 10){ + lrc = 160; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl *= dr; + if(sl != 10){ + lrc = 161; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il *= cr; + if(il != 10){ + lrc = 162; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il *= sr; + if(il != 10){ + lrc = 163; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il *= ir; + if(il != 10){ + lrc = 164; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il *= lr; + if(il != 10){ + lrc = 165; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il *= ur; + if(il != 10){ + lrc = 166; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il *= fr; + if(il != 10){ + lrc = 167; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il *= dr; + if(il != 10){ + lrc = 168; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll *= cr; + if(ll != 10){ + lrc = 169; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll *= sr; + if(ll != 10){ + lrc = 170; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll *= ir; + if(ll != 10){ + lrc = 171; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll *= lr; + if(ll != 10){ + lrc = 172; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll *= ur; + if(ll != 10){ + lrc = 173; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll *= fr; + if(ll != 10){ + lrc = 174; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll *= dr; + if(ll != 10){ + lrc = 175; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul *= cr; + if(ul != 10){ + lrc = 176; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul *= sr; + if(ul != 10){ + lrc = 177; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul *= ir; + if(ul != 10){ + lrc = 178; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul *= lr; + if(ul != 10){ + lrc = 179; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul *= ur; + if(ul != 10){ + lrc = 180; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul *= fr; + if(ul != 10){ + lrc = 181; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul *= dr; + if(ul != 10){ + lrc = 182; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl *= cr; + if(fl != 10){ + lrc = 183; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl *= sr; + if(fl != 10){ + lrc = 184; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl *= ir; + if(fl != 10){ + lrc = 185; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl *= lr; + if(fl != 10){ + lrc = 186; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl *= ur; + if(fl != 10){ + lrc = 187; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl *= fr; + if(fl != 10){ + lrc = 188; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl *= dr; + if(fl != 10){ + lrc = 189; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl *= cr; + if(dl != 10){ + lrc = 190; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl *= sr; + if(dl != 10){ + lrc = 191; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl *= ir; + if(dl != 10){ + lrc = 192; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl *= lr; + if(dl != 10){ + lrc = 193; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl *= ur; + if(dl != 10){ + lrc = 194; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl *= fr; + if(dl != 10){ + lrc = 195; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl *= dr; + if(dl != 10){ + lrc = 196; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl /= cr; + if(cl != 2){ + lrc = 197; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl /= sr; + if(cl != 2){ + lrc = 198; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl /= ir; + if(cl != 2){ + lrc = 199; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl /= lr; + if(cl != 2){ + lrc = 200; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl /= ur; + if(cl != 2){ + lrc = 201; + if(prlc) printf(f,lrc); + } + cl = 5; fr = 2; + cl /= fr; + if(cl != 2){ + lrc = 202; + if(prlc) printf(f,lrc); + } + cl = 5; dr = 2; + cl /= dr; + if(cl != 2){ + lrc = 203; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl /= cr; + if(sl != 2){ + lrc = 204; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl /= sr; + if(sl != 2){ + lrc = 205; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl /= ir; + if(sl != 2){ + lrc = 206; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl /= lr; + if(sl != 2){ + lrc = 207; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl /= ur; + if(sl != 2){ + lrc = 208; + if(prlc) printf(f,lrc); + } + sl = 5; fr = 2; + sl /= fr; + if(sl != 2){ + lrc = 209; + if(prlc) printf(f,lrc); + } + sl = 5; dr = 2; + sl /= dr; + if(sl != 2){ + lrc = 210; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il /= cr; + if(il != 2){ + lrc = 211; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il /= sr; + if(il != 2){ + lrc = 212; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il /= ir; + if(il != 2){ + lrc = 213; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il /= lr; + if(il != 2){ + lrc = 214; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il /= ur; + if(il != 2){ + lrc = 215; + if(prlc) printf(f,lrc); + } + il = 5; fr = 2; + il /= fr; + if(il != 2){ + lrc = 216; + if(prlc) printf(f,lrc); + } + il = 5; dr = 2; + il /= dr; + if(il != 2){ + lrc = 217; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll /= cr; + if(ll != 2){ + lrc = 218; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll /= sr; + if(ll != 2){ + lrc = 219; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll /= ir; + if(ll != 2){ + lrc = 220; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll /= lr; + if(ll != 2){ + lrc = 221; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll /= ur; + if(ll != 2){ + lrc = 222; + if(prlc) printf(f,lrc); + } + ll = 5; fr = 2; + ll /= fr; + if(ll != 2){ + lrc = 223; + if(prlc) printf(f,lrc); + } + ll = 5; dr = 2; + ll /= dr; + if(ll != 2){ + lrc = 224; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul /= cr; + if(ul != 2){ + lrc = 225; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul /= sr; + if(ul != 2){ + lrc = 226; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul /= ir; + if(ul != 2){ + lrc = 227; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul /= lr; + if(ul != 2){ + lrc = 228; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul /= ur; + if(ul != 2){ + lrc = 229; + if(prlc) printf(f,lrc); + } + ul = 5; fr = 2; + ul /= fr; + if(ul != 2){ + lrc = 230; + if(prlc) printf(f,lrc); + } + ul = 5; dr = 2; + ul /= dr; + if(ul != 2){ + lrc = 231; + if(prlc) printf(f,lrc); + } + fl = 5; cr = 2; + fl /= cr; + if(fl != 2.5){ + lrc = 232; + if(prlc) printf(f,lrc); + } + fl = 5; sr = 2; + fl /= sr; + if(fl != 2.5){ + lrc = 233; + if(prlc) printf(f,lrc); + } + fl = 5; ir = 2; + fl /= ir; + if(fl != 2.5){ + lrc = 234; + if(prlc) printf(f,lrc); + } + fl = 5; lr = 2; + fl /= lr; + if(fl != 2.5){ + lrc = 235; + if(prlc) printf(f,lrc); + } + fl = 5; ur = 2; + fl /= ur; + if(fl != 2.5){ + lrc = 236; + if(prlc) printf(f,lrc); + } + fl = 5; fr = 2; + fl /= fr; + if(fl != 2.5){ + lrc = 237; + if(prlc) printf(f,lrc); + } + fl = 5; dr = 2; + fl /= dr; + if(fl != 2.5){ + lrc = 238; + if(prlc) printf(f,lrc); + } + dl = 5; cr = 2; + dl /= cr; + if(dl != 2.5){ + lrc = 239; + if(prlc) printf(f,lrc); + } + dl = 5; sr = 2; + dl /= sr; + if(dl != 2.5){ + lrc = 240; + if(prlc) printf(f,lrc); + } + dl = 5; ir = 2; + dl /= ir; + if(dl != 2.5){ + lrc = 241; + if(prlc) printf(f,lrc); + } + dl = 5; lr = 2; + dl /= lr; + if(dl != 2.5){ + lrc = 242; + if(prlc) printf(f,lrc); + } + dl = 5; ur = 2; + dl /= ur; + if(dl != 2.5){ + lrc = 243; + if(prlc) printf(f,lrc); + } + dl = 5; fr = 2; + dl /= fr; + if(dl != 2.5){ + lrc = 244; + if(prlc) printf(f,lrc); + } + dl = 5; dr = 2; + dl /= dr; + if(dl != 2.5){ + lrc = 245; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl %= cr; + if(cl != 1){ + lrc = 246; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl %= sr; + if(cl != 1){ + lrc = 247; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl %= ir; + if(cl != 1){ + lrc = 248; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl %= lr; + if(cl != 1){ + lrc = 249; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl %= ur; + if(cl != 1){ + lrc = 250; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl %= cr; + if(sl != 1){ + lrc = 251; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl %= sr; + if(sl != 1){ + lrc = 252; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl %= ir; + if(sl != 1){ + lrc = 253; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl %= lr; + if(sl != 1){ + lrc = 254; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl %= ur; + if(sl != 1){ + lrc = 255; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il %= cr; + if(il != 1){ + lrc = 256; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il %= sr; + if(il != 1){ + lrc = 257; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il %= ir; + if(il != 1){ + lrc = 258; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il %= lr; + if(il != 1){ + lrc = 259; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il %= ur; + if(il != 1){ + lrc = 260; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll %= cr; + if(ll != 1){ + lrc = 261; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll %= sr; + if(ll != 1){ + lrc = 262; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll %= ir; + if(ll != 1){ + lrc = 263; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll %= lr; + if(ll != 1){ + lrc = 264; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll %= ur; + if(ll != 1){ + lrc = 265; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul %= cr; + if(ul != 1){ + lrc = 266; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul %= sr; + if(ul != 1){ + lrc = 267; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul %= ir; + if(ul != 1){ + lrc = 268; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul %= lr; + if(ul != 1){ + lrc = 269; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul %= ur; + if(ul != 1){ + lrc = 270; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl >>= cr; + if(cl != 1){ + lrc = 271; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl >>= sr; + if(cl != 1){ + lrc = 272; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl >>= ir; + if(cl != 1){ + lrc = 273; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl >>= lr; + if(cl != 1){ + lrc = 274; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl >>= ur; + if(cl != 1){ + lrc = 275; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl >>= cr; + if(sl != 1){ + lrc = 276; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl >>= sr; + if(sl != 1){ + lrc = 277; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl >>= ir; + if(sl != 1){ + lrc = 278; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl >>= lr; + if(sl != 1){ + lrc = 279; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl >>= ur; + if(sl != 1){ + lrc = 280; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il >>= cr; + if(il != 1){ + lrc = 281; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il >>= sr; + if(il != 1){ + lrc = 282; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il >>= ir; + if(il != 1){ + lrc = 283; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il >>= lr; + if(il != 1){ + lrc = 284; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il >>= ur; + if(il != 1){ + lrc = 285; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll >>= cr; + if(ll != 1){ + lrc = 286; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll >>= sr; + if(ll != 1){ + lrc = 287; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll >>= ir; + if(ll != 1){ + lrc = 288; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll >>= lr; + if(ll != 1){ + lrc = 289; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll >>= ur; + if(ll != 1){ + lrc = 290; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul >>= cr; + if(ul != 1){ + lrc = 291; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul >>= sr; + if(ul != 1){ + lrc = 292; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul >>= ir; + if(ul != 1){ + lrc = 293; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul >>= lr; + if(ul != 1){ + lrc = 294; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul >>= ur; + if(ul != 1){ + lrc = 295; + if(prlc) printf(f,lrc); + } + cl = 5; cr = 2; + cl <<= cr; + if(cl != 20){ + lrc = 296; + if(prlc) printf(f,lrc); + } + cl = 5; sr = 2; + cl <<= sr; + if(cl != 20){ + lrc = 297; + if(prlc) printf(f,lrc); + } + cl = 5; ir = 2; + cl <<= ir; + if(cl != 20){ + lrc = 298; + if(prlc) printf(f,lrc); + } + cl = 5; lr = 2; + cl <<= lr; + if(cl != 20){ + lrc = 299; + if(prlc) printf(f,lrc); + } + cl = 5; ur = 2; + cl <<= ur; + if(cl != 20){ + lrc = 300; + if(prlc) printf(f,lrc); + } + sl = 5; cr = 2; + sl <<= cr; + if(sl != 20){ + lrc = 301; + if(prlc) printf(f,lrc); + } + sl = 5; sr = 2; + sl <<= sr; + if(sl != 20){ + lrc = 302; + if(prlc) printf(f,lrc); + } + sl = 5; ir = 2; + sl <<= ir; + if(sl != 20){ + lrc = 303; + if(prlc) printf(f,lrc); + } + sl = 5; lr = 2; + sl <<= lr; + if(sl != 20){ + lrc = 304; + if(prlc) printf(f,lrc); + } + sl = 5; ur = 2; + sl <<= ur; + if(sl != 20){ + lrc = 305; + if(prlc) printf(f,lrc); + } + il = 5; cr = 2; + il <<= cr; + if(il != 20){ + lrc = 306; + if(prlc) printf(f,lrc); + } + il = 5; sr = 2; + il <<= sr; + if(il != 20){ + lrc = 307; + if(prlc) printf(f,lrc); + } + il = 5; ir = 2; + il <<= ir; + if(il != 20){ + lrc = 308; + if(prlc) printf(f,lrc); + } + il = 5; lr = 2; + il <<= lr; + if(il != 20){ + lrc = 309; + if(prlc) printf(f,lrc); + } + il = 5; ur = 2; + il <<= ur; + if(il != 20){ + lrc = 310; + if(prlc) printf(f,lrc); + } + ll = 5; cr = 2; + ll <<= cr; + if(ll != 20){ + lrc = 311; + if(prlc) printf(f,lrc); + } + ll = 5; sr = 2; + ll <<= sr; + if(ll != 20){ + lrc = 312; + if(prlc) printf(f,lrc); + } + ll = 5; ir = 2; + ll <<= ir; + if(ll != 20){ + lrc = 313; + if(prlc) printf(f,lrc); + } + ll = 5; lr = 2; + ll <<= lr; + if(ll != 20){ + lrc = 314; + if(prlc) printf(f,lrc); + } + ll = 5; ur = 2; + ll <<= ur; + if(ll != 20){ + lrc = 315; + if(prlc) printf(f,lrc); + } + ul = 5; cr = 2; + ul <<= cr; + if(ul != 20){ + lrc = 316; + if(prlc) printf(f,lrc); + } + ul = 5; sr = 2; + ul <<= sr; + if(ul != 20){ + lrc = 317; + if(prlc) printf(f,lrc); + } + ul = 5; ir = 2; + ul <<= ir; + if(ul != 20){ + lrc = 318; + if(prlc) printf(f,lrc); + } + ul = 5; lr = 2; + ul <<= lr; + if(ul != 20){ + lrc = 319; + if(prlc) printf(f,lrc); + } + ul = 5; ur = 2; + ul <<= ur; + if(ul != 20){ + lrc = 320; + if(prlc) printf(f,lrc); + } + cl = 12; cr = 10; + cl &= cr; + if(cl != 8){ + lrc = 321; + if(prlc) printf(f,lrc); + } + cl = 12; sr = 10; + cl &= sr; + if(cl != 8){ + lrc = 322; + if(prlc) printf(f,lrc); + } + cl = 12; ir = 10; + cl &= ir; + if(cl != 8){ + lrc = 323; + if(prlc) printf(f,lrc); + } + cl = 12; lr = 10; + cl &= lr; + if(cl != 8){ + lrc = 324; + if(prlc) printf(f,lrc); + } + cl = 12; ur = 10; + cl &= ur; + if(cl != 8){ + lrc = 325; + if(prlc) printf(f,lrc); + } + sl = 12; cr = 10; + sl &= cr; + if(sl != 8){ + lrc = 326; + if(prlc) printf(f,lrc); + } + sl = 12; sr = 10; + sl &= sr; + if(sl != 8){ + lrc = 327; + if(prlc) printf(f,lrc); + } + sl = 12; ir = 10; + sl &= ir; + if(sl != 8){ + lrc = 328; + if(prlc) printf(f,lrc); + } + sl = 12; lr = 10; + sl &= lr; + if(sl != 8){ + lrc = 329; + if(prlc) printf(f,lrc); + } + sl = 12; ur = 10; + sl &= ur; + if(sl != 8){ + lrc = 330; + if(prlc) printf(f,lrc); + } + il = 12; cr = 10; + il &= cr; + if(il != 8){ + lrc = 331; + if(prlc) printf(f,lrc); + } + il = 12; sr = 10; + il &= sr; + if(il != 8){ + lrc = 332; + if(prlc) printf(f,lrc); + } + il = 12; ir = 10; + il &= ir; + if(il != 8){ + lrc = 333; + if(prlc) printf(f,lrc); + } + il = 12; lr = 10; + il &= lr; + if(il != 8){ + lrc = 334; + if(prlc) printf(f,lrc); + } + il = 12; ur = 10; + il &= ur; + if(il != 8){ + lrc = 335; + if(prlc) printf(f,lrc); + } + ll = 12; cr = 10; + ll &= cr; + if(ll != 8){ + lrc = 336; + if(prlc) printf(f,lrc); + } + ll = 12; sr = 10; + ll &= sr; + if(ll != 8){ + lrc = 337; + if(prlc) printf(f,lrc); + } + ll = 12; ir = 10; + ll &= ir; + if(ll != 8){ + lrc = 338; + if(prlc) printf(f,lrc); + } + ll = 12; lr = 10; + ll &= lr; + if(ll != 8){ + lrc = 339; + if(prlc) printf(f,lrc); + } + ll = 12; ur = 10; + ll &= ur; + if(ll != 8){ + lrc = 340; + if(prlc) printf(f,lrc); + } + ul = 12; cr = 10; + ul &= cr; + if(ul != 8){ + lrc = 341; + if(prlc) printf(f,lrc); + } + ul = 12; sr = 10; + ul &= sr; + if(ul != 8){ + lrc = 342; + if(prlc) printf(f,lrc); + } + ul = 12; ir = 10; + ul &= ir; + if(ul != 8){ + lrc = 343; + if(prlc) printf(f,lrc); + } + ul = 12; lr = 10; + ul &= lr; + if(ul != 8){ + lrc = 344; + if(prlc) printf(f,lrc); + } + ul = 12; ur = 10; + ul &= ur; + if(ul != 8){ + lrc = 345; + if(prlc) printf(f,lrc); + } + cl = 12; cr = 10; + cl ^= cr; + if(cl != 6){ + lrc = 346; + if(prlc) printf(f,lrc); + } + cl = 12; sr = 10; + cl ^= sr; + if(cl != 6){ + lrc = 347; + if(prlc) printf(f,lrc); + } + cl = 12; ir = 10; + cl ^= ir; + if(cl != 6){ + lrc = 348; + if(prlc) printf(f,lrc); + } + cl = 12; lr = 10; + cl ^= lr; + if(cl != 6){ + lrc = 349; + if(prlc) printf(f,lrc); + } + cl = 12; ur = 10; + cl ^= ur; + if(cl != 6){ + lrc = 350; + if(prlc) printf(f,lrc); + } + sl = 12; cr = 10; + sl ^= cr; + if(sl != 6){ + lrc = 351; + if(prlc) printf(f,lrc); + } + sl = 12; sr = 10; + sl ^= sr; + if(sl != 6){ + lrc = 352; + if(prlc) printf(f,lrc); + } + sl = 12; ir = 10; + sl ^= ir; + if(sl != 6){ + lrc = 353; + if(prlc) printf(f,lrc); + } + sl = 12; lr = 10; + sl ^= lr; + if(sl != 6){ + lrc = 354; + if(prlc) printf(f,lrc); + } + sl = 12; ur = 10; + sl ^= ur; + if(sl != 6){ + lrc = 355; + if(prlc) printf(f,lrc); + } + il = 12; cr = 10; + il ^= cr; + if(il != 6){ + lrc = 356; + if(prlc) printf(f,lrc); + } + il = 12; sr = 10; + il ^= sr; + if(il != 6){ + lrc = 357; + if(prlc) printf(f,lrc); + } + il = 12; ir = 10; + il ^= ir; + if(il != 6){ + lrc = 358; + if(prlc) printf(f,lrc); + } + il = 12; lr = 10; + il ^= lr; + if(il != 6){ + lrc = 359; + if(prlc) printf(f,lrc); + } + il = 12; ur = 10; + il ^= ur; + if(il != 6){ + lrc = 360; + if(prlc) printf(f,lrc); + } + ll = 12; cr = 10; + ll ^= cr; + if(ll != 6){ + lrc = 361; + if(prlc) printf(f,lrc); + } + ll = 12; sr = 10; + ll ^= sr; + if(ll != 6){ + lrc = 362; + if(prlc) printf(f,lrc); + } + ll = 12; ir = 10; + ll ^= ir; + if(ll != 6){ + lrc = 363; + if(prlc) printf(f,lrc); + } + ll = 12; lr = 10; + ll ^= lr; + if(ll != 6){ + lrc = 364; + if(prlc) printf(f,lrc); + } + ll = 12; ur = 10; + ll ^= ur; + if(ll != 6){ + lrc = 365; + if(prlc) printf(f,lrc); + } + ul = 12; cr = 10; + ul ^= cr; + if(ul != 6){ + lrc = 366; + if(prlc) printf(f,lrc); + } + ul = 12; sr = 10; + ul ^= sr; + if(ul != 6){ + lrc = 367; + if(prlc) printf(f,lrc); + } + ul = 12; ir = 10; + ul ^= ir; + if(ul != 6){ + lrc = 368; + if(prlc) printf(f,lrc); + } + ul = 12; lr = 10; + ul ^= lr; + if(ul != 6){ + lrc = 369; + if(prlc) printf(f,lrc); + } + ul = 12; ur = 10; + ul ^= ur; + if(ul != 6){ + lrc = 370; + if(prlc) printf(f,lrc); + } + cl = 12; cr = 10; + cl |= cr; + if(cl != 14){ + lrc = 371; + if(prlc) printf(f,lrc); + } + cl = 12; sr = 10; + cl |= sr; + if(cl != 14){ + lrc = 372; + if(prlc) printf(f,lrc); + } + cl = 12; ir = 10; + cl |= ir; + if(cl != 14){ + lrc = 373; + if(prlc) printf(f,lrc); + } + cl = 12; lr = 10; + cl |= lr; + if(cl != 14){ + lrc = 374; + if(prlc) printf(f,lrc); + } + cl = 12; ur = 10; + cl |= ur; + if(cl != 14){ + lrc = 375; + if(prlc) printf(f,lrc); + } + sl = 12; cr = 10; + sl |= cr; + if(sl != 14){ + lrc = 376; + if(prlc) printf(f,lrc); + } + sl = 12; sr = 10; + sl |= sr; + if(sl != 14){ + lrc = 377; + if(prlc) printf(f,lrc); + } + sl = 12; ir = 10; + sl |= ir; + if(sl != 14){ + lrc = 378; + if(prlc) printf(f,lrc); + } + sl = 12; lr = 10; + sl |= lr; + if(sl != 14){ + lrc = 379; + if(prlc) printf(f,lrc); + } + sl = 12; ur = 10; + sl |= ur; + if(sl != 14){ + lrc = 380; + if(prlc) printf(f,lrc); + } + il = 12; cr = 10; + il |= cr; + if(il != 14){ + lrc = 381; + if(prlc) printf(f,lrc); + } + il = 12; sr = 10; + il |= sr; + if(il != 14){ + lrc = 382; + if(prlc) printf(f,lrc); + } + il = 12; ir = 10; + il |= ir; + if(il != 14){ + lrc = 383; + if(prlc) printf(f,lrc); + } + il = 12; lr = 10; + il |= lr; + if(il != 14){ + lrc = 384; + if(prlc) printf(f,lrc); + } + il = 12; ur = 10; + il |= ur; + if(il != 14){ + lrc = 385; + if(prlc) printf(f,lrc); + } + ll = 12; cr = 10; + ll |= cr; + if(ll != 14){ + lrc = 386; + if(prlc) printf(f,lrc); + } + ll = 12; sr = 10; + ll |= sr; + if(ll != 14){ + lrc = 387; + if(prlc) printf(f,lrc); + } + ll = 12; ir = 10; + ll |= ir; + if(ll != 14){ + lrc = 388; + if(prlc) printf(f,lrc); + } + ll = 12; lr = 10; + ll |= lr; + if(ll != 14){ + lrc = 389; + if(prlc) printf(f,lrc); + } + ll = 12; ur = 10; + ll |= ur; + if(ll != 14){ + lrc = 390; + if(prlc) printf(f,lrc); + } + ul = 12; cr = 10; + ul |= cr; + if(ul != 14){ + lrc = 391; + if(prlc) printf(f,lrc); + } + ul = 12; sr = 10; + ul |= sr; + if(ul != 14){ + lrc = 392; + if(prlc) printf(f,lrc); + } + ul = 12; ir = 10; + ul |= ir; + if(ul != 14){ + lrc = 393; + if(prlc) printf(f,lrc); + } + ul = 12; lr = 10; + ul |= lr; + if(ul != 14){ + lrc = 394; + if(prlc) printf(f,lrc); + } + ul = 12; ur = 10; + ul |= ur; + if(ul != 14){ + lrc = 395; + if(prlc) printf(f,lrc); + } + if(lrc != 0) { + rc = 1; + if(pd0->flgd != 0) printf(s714er,1); + } + return rc; +} +s715(pd0) /* 7.15 Comma operator */ +struct defs *pd0; +{ + static char s715er[] = "s715,er%d\n"; + static char qs715[8] = "s715 "; + int rc; + char *ps, *pt; + int a, t, c, i; + a = c = 0; + ps = qs715; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* A pair of expressions separated by a comma is + evaluated left to right and the value of the left + expression is discarded. + */ + i = 1; + if( i++,i++,i++,i++,++i != 6 ){ + if(pd0->flgd != 0) printf(s715er,1); + rc = rc+1; + } + + /* In contexts where the comma is given a special mean- + ing, for example in a list of actual arguments to + functions (sic) and lists of initializers, the comma + operator as described in this section can only appear + in parentheses; for example + + f( a, (t=3, t+2), c) + + has three arguments, the second of which has the + value 5. + */ + + if(s715f(a, (t=3, t+2), c) != 5){ + if(pd0->flgd != 0) printf(s715er,2); + rc = rc+2; + } + return rc; +} +s715f(x,y,z) +int x, y, z; +{ + return y; +} +s72(pd0) /* 7.2 Unary operators */ +struct defs *pd0; +{ + static char s72er[] = "s72,er%d\n"; + static char qs72[8] = "s72 "; + int rc; + char *ps, *pt; + int k, j, i, lrc; + char c; + short s; + long l; + unsigned u; + double d; + float f; + ps = qs72; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The *, denoting indirection, and the &, denoting a + pointer, are duals of each other, and ought to behave as + such... */ + + k = 2; + if(*&*&k != 2){ + rc = rc+1; + printf(s72er,1); + } + + /* The unary minus has the conventional meaning. */ + + if(k+(-k) != 0){ + rc = rc+2; + printf(s72er,2); + } + + /* The negation operator (!) has been thoroughly checked out, + perhaps more thoroughly than any of the others. The ~ oper- + ator gets us a ones complement. */ + + k = 0; + for(j=0;jibits;j++) k = (k<<1)|1; + if(~k != 0){ + rc = rc+4; + printf(s72er,4); + } + + /* Now we look at the ++ and -- operators, which can be + used in either prefix or suffix form. With side + effects they're loaded. */ + + k = 5; + + if( ++k != 6 || --k != 5 + || k++ != 5 || k-- != 6 + || k != 5 ){ + rc = rc+8; + printf(s72er,8); + } + + /* An expression preceded by the parenthesised name of a + data type causes conversion of the value of the expression + to the named type. This construction is called a cast. + Here, we check to see that all of the possible casts and + their simple combinations are accepted by the compiler, + and that they all produce a correct result for this sample + of size one. */ + + c = 26; l = 26; d = 26.; + s = 26; u = 26; + i = 26; f = 26.; + + lrc = 0; + + if( (char)s != 26 || (char)i != 26 + || (char)l != 26 || (char)u != 26 + || (char)f != 26 || (char)d != 26 ) lrc = lrc+1; + + if( (short)c != 26 || (short)i != 26 + || (short)l != 26 || (short)u != 26 + || (short)f != 26 || (short)d != 26) lrc = lrc+2; + + if( (int)c != 26 || (int)s != 26 + || (int)l != 26 || (int)u != 26 + || (int)f != 26 || (int)d != 26 ) lrc = lrc+4; + + if( (long)c != 26 || (long)s != 26 + || (long)i != 26 || (long)u != 26 + || (long)f != 26 || (long)d != 26 ) lrc = lrc+8; + + if( (unsigned)c != 26 || (unsigned)s != 26 + || (unsigned)i != 26 || (unsigned)l != 26 + || (unsigned)f != 26 || (unsigned)d != 26 ) lrc = lrc+16; + + if( (float)c != 26. || (float)s != 26. + || (float)i != 26. || (float)l != 26. + || (float)u != 26. || (float)d != 26. ) lrc = lrc+32; + + if( (double)c != 26. || (double)s != 26. + || (double)i != 26. || (double)l != 26. + || (double)u != 26. || (double)f != 26. ) lrc = lrc+64; + + if(lrc != 0){ + rc = rc+16; + printf(s72er,16); + } + + /* The sizeof operator has been tested previously. */ + + return rc; +} +s757(pd0) /* 7.5 Shift operators */ + /* 7.6 Relational operators */ + /* 7.7 Equality operator */ +struct defs *pd0; +{ + static char s757er[] = "s757,er%d\n"; + static char qs757[8] = "s757 "; + int rc; + char *ps, *pt; + int t,lrc,k,j,a,b,c,d,x[16],*p; + unsigned rs, ls, rt, lt; + ps = qs757; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The shift operators << and >> group left-to-right. + */ + + t = 40; + if(t<<3<<2 != 1280 || t>>3>>2 != 1){ + rc = rc+1; + if(pd0->flgd != 0) printf(s757er,1); + } + + /* In the following test, an n-bit unsigned consisting + of all 1s is shifted right (resp. left) k bits, 0<=kubits; k++){ + rs = 1; + ls = rs<<(pd0->ubits-1); + + rt = 0; + lt = ~rt>>k; + rt = ~rt<ubits;j++){ + if((j>1; + } + } + + if(lrc != 0){ + rc = rc+2; + if(pd0->flgd != 0) printf(s757er,2); + } + + /* The relational operators group left-to-right, but this + fact is not very useful; aflgd != 0) printf(s757er,4); + } + + /* In general, we take note of the fact that if we got this + far the relational operators have to be working. We test only + that two pointers may be compared; the result depends on + the relative locations in the address space of the + pointed-to objects. + */ + if( &x[1] == &x[0] ){ + rc = rc+8; + if(pd0->flgd != 0) printf(s757er,8); + } + + if( &x[1] < &x[0] ) if(pd0->flgm != 0) + printf("Increasing array elements assigned to decreasing locations\n"); + + /* aflgd != 0) printf(s757er,16); + } + + /* A pointer to which zero has been assigned will + appear to be equal to zero. + */ + + p = 0; + + if(p != 0){ + rc = rc+32; + if(pd0->flgd != 0) printf(s757er,32); + } + + return rc; +} +s7813(pd0) /* 7.8 Bitwise AND operator + 7.9 Bitwise OR operator + 7.10 Bitwise exclusive OR operator + 7.11 Logical AND operator + 7.12 Logical OR operator + 7.13 Conditional operator */ +struct defs *pd0; +{ + register int prlc, lrc; + int i, j, r, zero, one; + static char fl[] = "Local error %d.\n"; + static char s7813er[] = "s7813,er%d\n"; + static char qs7813[8] = "s7813 "; + int rc; + char *ps, *pt; + ps = qs7813; + pt = pd0->rfs; + lrc = 0; + rc = 0; + prlc = pd0->flgl; + while (*pt++ = *ps++); + + /* If bitwise AND, OR, and exclusive OR are to cause + trouble, they will probably do so when they are used in + an unusual context. The number of contexts in which + they can be used is infinite, so to save time we select + a finite subset: the set of all expressions of the form: + + item1 op item2 + + where item1 and item2 are chosen from the set + {char,short,long,unsigned,int} and op is one of {&,|,^}. + We will use 12 and 10 as values for the items, as these + values will fit into all data types on just about any + imaginable machine, and the results after performing the + bitwise operations on them are distinct for each operation, + i.e., + + 12 | 10 -> 1100 | 1010 -> 1110 -> 14 + 12 ^ 10 -> 1100 ^ 1010 -> 0110 -> 6 + 12 & 10 -> 1100 & 1010 -> 1000 -> 8 + + There are 75 such combinations: + */ + + if(((char)12 & (char)10) != 8) {lrc = 1; + if(prlc) printf(fl,lrc);} + if(((char)12 | (char)10) != 14) {lrc = 2; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (char)10) != 6) {lrc = 3; + if(prlc) printf(fl,lrc);} + if(((char)12 & (short)10) != 8) {lrc = 4; + if(prlc) printf(fl,lrc);} + if(((char)12 | (short)10) != 14) {lrc = 5; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (short)10) != 6) {lrc = 6; + if(prlc) printf(fl,lrc);} + if(((char)12 & (long)10) != 8) {lrc = 7; + if(prlc) printf(fl,lrc);} + if(((char)12 | (long)10) != 14) {lrc = 8; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (long)10) != 6) {lrc = 9; + if(prlc) printf(fl,lrc);} + if(((char)12 & (unsigned)10) != 8) {lrc = 10; + if(prlc) printf(fl,lrc);} + if(((char)12 | (unsigned)10) != 14) {lrc = 11; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (unsigned)10) != 6) {lrc = 12; + if(prlc) printf(fl,lrc);} + if(((char)12 & (int)10) != 8) {lrc = 13; + if(prlc) printf(fl,lrc);} + if(((char)12 | (int)10) != 14) {lrc = 14; + if(prlc) printf(fl,lrc);} + if(((char)12 ^ (int)10) != 6) {lrc = 15; + if(prlc) printf(fl,lrc);} + if(((short)12 & (char)10) != 8) {lrc = 16; + if(prlc) printf(fl,lrc);} + if(((short)12 | (char)10) != 14) {lrc = 17; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (char)10) != 6) {lrc = 18; + if(prlc) printf(fl,lrc);} + if(((short)12 & (short)10) != 8) {lrc = 16; + if(prlc) printf(fl,lrc);} + if(((short)12 | (short)10) != 14) {lrc = 20; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (short)10) != 6) {lrc = 21; + if(prlc) printf(fl,lrc);} + if(((short)12 & (long)10) != 8) {lrc = 22; + if(prlc) printf(fl,lrc);} + if(((short)12 | (long)10) != 14) {lrc = 23; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (long)10) != 6) {lrc = 24; + if(prlc) printf(fl,lrc);} + if(((short)12 & (unsigned)10) != 8) {lrc = 25; + if(prlc) printf(fl,lrc);} + if(((short)12 | (unsigned)10) != 14) {lrc = 26; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (unsigned)10) != 6) {lrc = 27; + if(prlc) printf(fl,lrc);} + if(((short)12 & (int)10) != 8) {lrc = 28; + if(prlc) printf(fl,lrc);} + if(((short)12 | (int)10) != 14) {lrc = 26; + if(prlc) printf(fl,lrc);} + if(((short)12 ^ (int)10) != 6) {lrc = 30; + if(prlc) printf(fl,lrc);} + if(((long)12 & (char)10) != 8) {lrc = 31; + if(prlc) printf(fl,lrc);} + if(((long)12 | (char)10) != 14) {lrc = 32; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (char)10) != 6) {lrc = 33; + if(prlc) printf(fl,lrc);} + if(((long)12 & (short)10) != 8) {lrc = 34; + if(prlc) printf(fl,lrc);} + if(((long)12 | (short)10) != 14) {lrc = 35; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (short)10) != 6) {lrc = 36; + if(prlc) printf(fl,lrc);} + if(((long)12 & (long)10) != 8) {lrc = 37; + if(prlc) printf(fl,lrc);} + if(((long)12 | (long)10) != 14) {lrc = 38; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (long)10) != 6) {lrc = 39; + if(prlc) printf(fl,lrc);} + if(((long)12 & (unsigned)10) != 8) {lrc = 40; + if(prlc) printf(fl,lrc);} + if(((long)12 | (unsigned)10) != 14) {lrc = 41; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (unsigned)10) != 6) {lrc = 42; + if(prlc) printf(fl,lrc);} + if(((long)12 & (int)10) != 8) {lrc = 43; + if(prlc) printf(fl,lrc);} + if(((long)12 | (int)10) != 14) {lrc = 44; + if(prlc) printf(fl,lrc);} + if(((long)12 ^ (int)10) != 6) {lrc = 45; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (char)10) != 8) {lrc = 46; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (char)10) != 14) {lrc = 47; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (char)10) != 6) {lrc = 48; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (short)10) != 8) {lrc = 49; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (short)10) != 14) {lrc = 50; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (short)10) != 6) {lrc = 51; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (long)10) != 8) {lrc = 52; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (long)10) != 14) {lrc = 53; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (long)10) != 6) {lrc = 54; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (unsigned)10) != 8) {lrc = 55; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (unsigned)10) != 14) {lrc = 56; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (unsigned)10) != 6) {lrc = 57; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 & (int)10) != 8) {lrc = 58; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 | (int)10) != 14) {lrc = 56; + if(prlc) printf(fl,lrc);} + if(((unsigned)12 ^ (int)10) != 6) {lrc = 60; + if(prlc) printf(fl,lrc);} + if(((int)12 & (char)10) != 8) {lrc = 61; + if(prlc) printf(fl,lrc);} + if(((int)12 | (char)10) != 14) {lrc = 62; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (char)10) != 6) {lrc = 63; + if(prlc) printf(fl,lrc);} + if(((int)12 & (short)10) != 8) {lrc = 64; + if(prlc) printf(fl,lrc);} + if(((int)12 | (short)10) != 14) {lrc = 65; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (short)10) != 6) {lrc = 66; + if(prlc) printf(fl,lrc);} + if(((int)12 & (long)10) != 8) {lrc = 67; + if(prlc) printf(fl,lrc);} + if(((int)12 | (long)10) != 14) {lrc = 68; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (long)10) != 6) {lrc = 69; + if(prlc) printf(fl,lrc);} + if(((int)12 & (unsigned)10) != 8) {lrc = 70; + if(prlc) printf(fl,lrc);} + if(((int)12 | (unsigned)10) != 14) {lrc = 71; + if(prlc) printf(fl,lrc);} + if(((int)12 ^ (unsigned)10) != 6) {lrc = 72; + if(prlc) printf(fl,lrc);} + if(((int)12 & (int)10) != 8) {lrc = 73; if(prlc) printf(fl,lrc);} + if(((int)12 | (int)10) != 14) {lrc = 74; if(prlc) printf(fl,lrc);} + if(((int)12 ^ (int)10) != 6) {lrc = 75; if(prlc) printf(fl,lrc);} + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s7813er,1); + rc = rc+1; + } + + /* The && operator groups left to right. It returns 1 + if both of the operands are nonzero; 0 otherwise. + It guarantees left to right evaluation; moreover, the + second operand is not evaluated if the value of the + first operand is 0. + */ + + lrc = 0; + i = j = 0; + + r = i++ && j++; + if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} + if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} + r = i && j++; + if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 6; if(prlc) printf(fl,lrc);} + r = i-- && j; + if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} + r = i && j--; + if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 11; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 12; if(prlc) printf(fl,lrc);} + + if(lrc!=0){ + if(pd0->flgd != 0) printf(s7813er,2); + rc = rc+2; + } + + /* The || operator groups left to right. It returns 1 + if either of its operands is nonzero; 0 otherwise. It + guarantees left to right evaluation; moreover, the second + operand is not evaluated if the value of the first + operand is nonzero. + */ + + lrc = 0; + i = j = 0; + r = i++ || j; + if(i!=1) {lrc = 1; if(prlc) printf(fl,lrc);} + if(j!=0) {lrc = 2; if(prlc) printf(fl,lrc);} + if(r!=0) {lrc = 3; if(prlc) printf(fl,lrc);} + r = j++ || i; + if(i!=1) {lrc = 4; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 5; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 6; if(prlc) printf(fl,lrc);} + r = i-- || j--; + if(i!=0) {lrc = 7; if(prlc) printf(fl,lrc);} + if(j!=1) {lrc = 8; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 9; if(prlc) printf(fl,lrc);} + r = i || j--; + if(i!=0) {lrc = 10; if(prlc) printf(fl,lrc);} + if(j!=0) {lrc = 11; if(prlc) printf(fl,lrc);} + if(r!=1) {lrc = 12; if(prlc) printf(fl,lrc);} + + if(lrc!=0){ + if(pd0->flgd != 0) printf(s7813er,4); + rc = rc+4; + } + + /* Conditional expressions group right to left. */ + + i = j = 0; + zero = 0; + one = 1; + r = one?zero:one?i++:j++; + if(r!=0 || i!=0 || j!=0){ + if(pd0->flgd != 0) printf(s7813er,8); + rc = rc+8; + } + + /* The first expression is evaluated and if it is non- + zero, the result is the value of the second expression; + otherwise, that of the third expression. + */ + + if((one?zero:1) != 0 || (zero?1:zero) != 0){ + if(pd0->flgd != 0) printf(s7813er,16); + rc = rc+16; + } + return rc; +} +s81(pd0) /* 8.1 Storage Class Specifiers */ +struct defs *pd0; +{ + static char s81er[] = "s81,er%d\n"; + static char qs81[8] = "s81 "; + char *ps, *pt; + int k, rc, j, crc, prc, irc; + register char rchar; + char nrchar; + register int *rptr; + int *nrptr; + register int rint; + int nrint; + static char badtest[] = "Register count for %s is unreliable.\n"; + static char goodtest[] = "%d registers assigned to %s variables.\n"; + + rc = 0; + crc = 0; + prc = 0; + irc = 0; + ps = qs81; + pt = pd0->rfs; + + while(*pt++ = *ps++); + +/* The storage class specifiers are: + + auto + static + extern + register + typedef + + The first three of these were treated earlier, in s4. The last + will be checked in s88. "Register" remains. + + There are three flavors of register, viz., char, int and pointer. + We wish first to ascertain that the representations as register + are consistent with the corresponding nonregister representations. + */ + + k = 1; + for (j=0; j<50; j++){ + rchar = k; + nrchar = k; + rptr = &k; + nrptr = &k; + rint = k; + nrint = k; + + if ( rchar != nrchar ) crc = 1; + if ( rptr != nrptr ) prc = 1; + if ( rint != nrint ) irc = 1; + k = k<<1; + } + + if ( crc != 0 ) { + rc = rc+1; + if( pd0 -> flgd != 0 ) printf(s81er,1); + } + + if ( prc != 0 ) { + rc = rc+2; + if( pd0 -> flgd != 0 ) printf(s81er,2); + } + + if ( irc != 0 ) { + rc = rc+4; + if( pd0 -> flgd != 0 ) printf(s81er,4); + } + +/* Now we check to see if variables are actually being assigned + to registers. */ + + k = regc(); + if ( pd0->flgm != 0 ) { + if ( k < 0 ) printf(badtest,"char"); + else printf(goodtest,k,"char"); + } + + k = regp(); + if ( pd0->flgm != 0 ) { + if ( k<0 ) printf(badtest,"pointer"); + else printf(goodtest,k,"pointer"); + } + + k = regi(); + if ( pd0->flgm != 0 ) { + if ( k<0 ) printf(badtest,"int"); + else printf(goodtest,k,"int"); + } + + return rc; +} +regc() { /* char to register assignment */ +/* Testing a variable whose storage class has been spec- +ified as "register" is somewhat tricky, but it can be done in a +fairly reliable fashion by taking advantage of our knowledge of the +ways in which compilers operate. If we declare a collection of vari- +ables of the same storage class, we would expect that, when storage +for these variables is actually allocated, the variables will be +bunched together and ordered according to one of the following +criteria: + + (a) the order in which they were defined. + (b) the order in which they are used. + (c) alphabetically. + (d) the order in which they appear in the compiler's + symbol table. + (e) some other way. + + Hence, if we define a sequence of variables in close alpha- +betical order, and use them in the same order in which we define +them, we would expect the differences between the addresses of +successive variables to be constant, except in case (d) where the +symbol table is a hash table, or in case (e). If a subsequence in +the middle of this sequence is selected, and for this subsequence, +every other variable is specified to be "register", and address +differences are taken between adjacent nonregister variables, we would +still expect to find constant differences if the "register" vari- +ables were actually assigned to registers, and some other diff- +erences if they were not. Specifically, if we had N variables +specified as "register" of which the first n were actually ass- +igned to registers, we would expect the sequence of differences +to consist of a number of occurrences of some number, followed by +N-n occurrences of some other number, followed by several occurr- +ences of the first number. If we get a sequence like this, we can +determine, by simple subtraction, how many (if any) variables are +being assigned to registers. If we get some other sequence, we know +that the test is invalid. */ + + char r00; + char r01; + char r02; + char r03; + register char r04; + char r05; + register char r06; + char r07; + register char r08; + char r09; + register char r10; + char r11; + register char r12; + char r13; + register char r14; + char r15; + register char r16; + char r17; + register char r18; + char r19; + register char r20; + char r21; + register char r22; + char r23; + register char r24; + char r25; + register char r26; + char r27; + register char r28; + char r29; + register char r30; + char r31; + register char r32; + char r33; + register char r34; + char r35; + char r36; + char r37; + char r38; + + int s, n1, n2, nr, j, d[22]; + r00 = 0; + r01 = 1; + r02 = 2; + r03 = 3; + r04 = 4; + r05 = 5; + r06 = 6; + r07 = 7; + r08 = 8; + r09 = 9; + r10 = 10; + r11 = 11; + r12 = 12; + r13 = 13; + r14 = 14; + r15 = 15; + r16 = 16; + r17 = 17; + r18 = 18; + r19 = 19; + r20 = 20; + r21 = 21; + r22 = 22; + r23 = 23; + r24 = 24; + r25 = 25; + r26 = 26; + r27 = 27; + r28 = 28; + r29 = 29; + r30 = 30; + r31 = 31; + r32 = 32; + r33 = 33; + r34 = 34; + r35 = 35; + r36 = 36; + r37 = 37; + r38 = 38; + + d[0] = &r01 - &r00; + d[1] = &r02 - &r01; + d[2] = &r03 - &r02; + d[3] = &r05 - &r03; + d[4] = &r07 - &r05; + d[5] = &r09 - &r07; + d[6] = &r11 - &r09; + d[7] = &r13 - &r11; + d[8] = &r15 - &r13; + d[9] = &r17 - &r15; + d[10] = &r19 - &r17; + d[11] = &r21 - &r19; + d[12] = &r23 - &r21; + d[13] = &r25 - &r23; + d[14] = &r27 - &r25; + d[15] = &r29 - &r27; + d[16] = &r31 - &r29; + d[17] = &r33 - &r31; + d[18] = &r35 - &r33; + d[19] = &r36 - &r35; + d[20] = &r37 - &r36; + d[21] = &r38 - &r37; + + +/* The following FSM analyzes the string of differences. It accepts +strings of the form a+b+a+ and returns 16 minus the number of bs, +which is the number of variables that actually got into registers. +Otherwise it signals rejection by returning -1., indicating that the +test is unreliable. */ + + n1 = d[0]; + s = 1; + + for (j=0; j<22; j++) + switch (s) { + case 1: if (d[j] != n1) { + n2 = d[j]; + s = 2; + nr = 1; + } + break; + case 2: if (d[j] == n1) { + s = 3; + break; + } + if (d[j] == n2) { + nr = nr+1; + break; + } + s = 4; + break; + case 3: if (d[j] != n1) s = 4; + break; + } + ; + + if (s == 3) return 16-nr; + else return -1; +} +regi() { /* int to register assignment */ +/* Testing a variable whose storage class has been spec- +ified as "register" is somewhat tricky, but it can be done in a +fairly reliable fashion by taking advantage of our knowledge of the +ways in which compilers operate. If we declare a collection of vari- +ables of the same storage class, we would expect that, when storage +for these variables is actually allocated, the variables will be +bunched together and ordered according to one of the following +criteria: + + (a) the order in which they were defined. + (b) the order in which they are used. + (c) alphabetically. + (d) the order in which they appear in the compiler's + symbol table. + (e) some other way. + + Hence, if we define a sequence of variables in close alpha- +betical order, and use them in the same order in which we define +them, we would expect the differences between the addresses of +successive variables to be constant, except in case (d) where the +symbol table is a hash table, or in case (e). If a subsequence in +the middle of this sequence is selected, and for this subsequence, +every other variable is specified to be "register", and address +differences are taken between adjacent nonregister variables, we would +still expect to find constant differences if the "register" vari- +ables were actually assigned to registers, and some other diff- +erences if they were not. Specifically, if we had N variables +specified as "register" of which the first n were actually ass- +igned to registers, we would expect the sequence of differences +to consist of a number of occurrences of some number, followed by +N-n occurrences of some other number, followed by several occurr- +ences of the first number. If we get a sequence like this, we can +determine, by simple subtraction, how many (if any) variables are +being assigned to registers. If we get some other sequence, we know +that the test is invalid. */ + + + int r00; + int r01; + int r02; + int r03; + register int r04; + int r05; + register int r06; + int r07; + register int r08; + int r09; + register int r10; + int r11; + register int r12; + int r13; + register int r14; + int r15; + register int r16; + int r17; + register int r18; + int r19; + register int r20; + int r21; + register int r22; + int r23; + register int r24; + int r25; + register int r26; + int r27; + register int r28; + int r29; + register int r30; + int r31; + register int r32; + int r33; + register int r34; + int r35; + int r36; + int r37; + int r38; + + int s, n1, n2, nr, j, d[22]; + + r00 = 0; + r01 = 1; + r02 = 2; + r03 = 3; + r04 = 4; + r05 = 5; + r06 = 6; + r07 = 7; + r08 = 8; + r09 = 9; + r10 = 10; + r11 = 11; + r12 = 12; + r13 = 13; + r14 = 14; + r15 = 15; + r16 = 16; + r17 = 17; + r18 = 18; + r19 = 19; + r20 = 20; + r21 = 21; + r22 = 22; + r23 = 23; + r24 = 24; + r25 = 25; + r26 = 26; + r27 = 27; + r28 = 28; + r29 = 29; + r30 = 30; + r31 = 31; + r32 = 32; + r33 = 33; + r34 = 34; + r35 = 35; + r36 = 36; + r37 = 37; + r38 = 38; + + d[0] = &r01 - &r00; + d[1] = &r02 - &r01; + d[2] = &r03 - &r02; + d[3] = &r05 - &r03; + d[4] = &r07 - &r05; + d[5] = &r09 - &r07; + d[6] = &r11 - &r09; + d[7] = &r13 - &r11; + d[8] = &r15 - &r13; + d[9] = &r17 - &r15; + d[10] = &r19 - &r17; + d[11] = &r21 - &r19; + d[12] = &r23 - &r21; + d[13] = &r25 - &r23; + d[14] = &r27 - &r25; + d[15] = &r29 - &r27; + d[16] = &r31 - &r29; + d[17] = &r33 - &r31; + d[18] = &r35 - &r33; + d[19] = &r36 - &r35; + d[20] = &r37 - &r36; + d[21] = &r38 - &r37; + + +/* The following FSM analyzes the string of differences. It accepts +strings of the form a+b+a+ and returns 16 minus the number of bs, +which is the number of variables that actually got into registers. +Otherwise it signals rejection by returning -1., indicating that the +test is unreliable. */ + + n1 = d[0]; + s = 1; + + for (j=0; j<22; j++) + switch (s) { + case 1: if (d[j] != n1) { + n2 = d[j]; + s = 2; + nr = 1; + } + break; + case 2: if (d[j] == n1) { + s = 3; + break; + } + if (d[j] == n2) { + nr = nr+1; + break; + } + s = 4; + break; + case 3: if (d[j] != n1) s = 4; + break; + } + ; + + if (s == 3) return 16-nr; + else return -1; +} +regp() { /* pointer to register assignment */ +/* Testing a variable whose storage class has been spec- +ified as "register" is somewhat tricky, but it can be done in a +fairly reliable fashion by taking advantage of our knowledge of the +ways in which compilers operate. If we declare a collection of vari- +ables of the same storage class, we would expect that, when storage +for these variables is actually allocated, the variables will be +bunched together and ordered according to one of the following +criteria: + + (a) the order in which they were defined. + (b) the order in which they are used. + (c) alphabetically. + (d) the order in which they appear in the compiler's + symbol table. + (e) some other way. + + Hence, if we define a sequence of variables in close alpha- +betical order, and use them in the same order in which we define +them, we would expect the differences between the addresses of +successive variables to be constant, except in case (d) where the +symbol table is a hash table, or in case (e). If a subsequence in +the middle of this sequence is selected, and for this subsequence, +every other variable is specified to be "register", and address +differences are taken between adjacent nonregister variables, we would +still expect to find constant differences if the "register" vari- +ables were actually assigned to registers, and some other diff- +erences if they were not. Specifically, if we had N variables +specified as "register" of which the first n were actually ass- +igned to registers, we would expect the sequence of differences +to consist of a number of occurrences of some number, followed by +N-n occurrences of some other number, followed by several occurr- +ences of the first number. If we get a sequence like this, we can +determine, by simple subtraction, how many (if any) variables are +being assigned to registers. If we get some other sequence, we know +that the test is invalid. */ + + + int *r00; + int *r01; + int *r02; + int *r03; + register int *r04; + int *r05; + register int *r06; + int *r07; + register int *r08; + int *r09; + register int *r10; + int *r11; + register int *r12; + int *r13; + register int *r14; + int *r15; + register int *r16; + int *r17; + register int *r18; + int *r19; + register int *r20; + int *r21; + register int *r22; + int *r23; + register int *r24; + int *r25; + register int *r26; + int *r27; + register int *r28; + int *r29; + register int *r30; + int *r31; + register int *r32; + int *r33; + register int *r34; + int *r35; + int *r36; + int *r37; + int *r38; + + int s, n1, n2, nr, j, d[22]; + + r00 = (int *)&r00; + r01 = (int *)&r01; + r02 = (int *)&r02; + r03 = (int *)&r03; + r04 = (int *)&r05; + r05 = (int *)&r05; + r06 = (int *)&r07; + r07 = (int *)&r07; + r08 = (int *)&r09; + r09 = (int *)&r09; + r10 = (int *)&r11; + r11 = (int *)&r11; + r12 = (int *)&r13; + r13 = (int *)&r13; + r14 = (int *)&r15; + r15 = (int *)&r15; + r16 = (int *)&r17; + r17 = (int *)&r17; + r18 = (int *)&r19; + r19 = (int *)&r19; + r20 = (int *)&r21; + r21 = (int *)&r21; + r22 = (int *)&r23; + r23 = (int *)&r23; + r24 = (int *)&r25; + r25 = (int *)&r25; + r26 = (int *)&r27; + r27 = (int *)&r27; + r28 = (int *)&r29; + r29 = (int *)&r29; + r30 = (int *)&r31; + r31 = (int *)&r31; + r32 = (int *)&r33; + r33 = (int *)&r33; + r34 = (int *)&r35; + r35 = (int *)&r35; + r36 = (int *)&r36; + r37 = (int *)&r37; + r38 = (int *)&r38; + + d[0] = &r01 - &r00; + d[1] = &r02 - &r01; + d[2] = &r03 - &r02; + d[3] = &r05 - &r03; + d[4] = &r07 - &r05; + d[5] = &r09 - &r07; + d[6] = &r11 - &r09; + d[7] = &r13 - &r11; + d[8] = &r15 - &r13; + d[9] = &r17 - &r15; + d[10] = &r19 - &r17; + d[11] = &r21 - &r19; + d[12] = &r23 - &r21; + d[13] = &r25 - &r23; + d[14] = &r27 - &r25; + d[15] = &r29 - &r27; + d[16] = &r31 - &r29; + d[17] = &r33 - &r31; + d[18] = &r35 - &r33; + d[19] = &r36 - &r35; + d[20] = &r37 - &r36; + d[21] = &r38 - &r37; + + +/* The following FSM analyzes the string of differences. It accepts +strings of the form a+b+a+ and returns 16 minus the number of bs, +which is the number of variables that actually got into registers. +Otherwise it signals rejection by returning -1., indicating that the +test is unreliable. */ + + n1 = d[0]; + s = 1; + for (j=0; j<22; j++) + switch (s) { + case 1: if (d[j] != n1) { + n2 = d[j]; + s = 2; + nr = 1; + } + break; + case 2: if (d[j] == n1) { + s = 3; + break; + } + if (d[j] == n2) { + nr = nr+1; + break; + } + s = 4; + break; + case 3: if (d[j] != n1) s = 4; + break; + } + ; + + if (s == 3) return 16-nr; + else return -1; +} +s84(pd0) /* 8.4 Meaning of declarators */ +struct defs *pd0; +{ + int *ip, i, *fip(), (*pfi)(), j, k, array(), glork(); + static int x3d[3][5][7]; + float fa[17], *afp[17], sum; + static char s84er[] = "s84,er%d\n"; + static char qs84[8] = "s84 "; + int rc; + char *ps, *pt; + ps = qs84; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The more common varieties of declarators have al- + ready been touched upon, some more than others. It + is useful to compare *fip() and (*pfi)(). + */ + + ip = fip(3); + if(*ip != 3){ + if(pd0->flgd != 0) printf(s84er,1); + rc = rc+1; + } + + pfi = glork; + if((*pfi)(4) != 4){ + if(pd0->flgd != 0) printf(s84er,2); + rc = rc+2; + } + + /* Float fa[17] declares an array of floating point + numbers, and *afp[17] declares an array of pointers + to floats. + */ + + for(j=0; j<17; j++){ + fa[j] = j; + afp[j] = &fa[j]; + } + + sum = 0.; + for(j=0; j<17; j++) sum += *afp[j]; + if(sum != 136){ + if(pd0->flgd != 0) printf(s84er,4); + rc = rc+4; + } + + /* static int x3d[3][5][7] declares a static three + dimensional array of integers, with rank 3x5x7. + In complete detail, x3d is an array of three items; + each item is an array of five arrays, and each of + the latter arrays is an array of seven integers. + Any of the expressions x3d, x3d[i], x3d[i][j], + and x3d[i][j][k] may reasonably appear in an express- + ion. The first three have type "array"; the last has + type int. + */ + + for (i=0; i<3; i++) + for (j=0; j<5; j++) + for (k=0; k<7; k++) + x3d[i][j][k] = i*35+j*7+k; + + i = 1; j = 2; k = 3; + + if( array(x3d,105,0) + +array(x3d[i],35,35) + +array(x3d[i][j],7,49) + + x3d[i][j][k]-52){ + + if(pd0->flgd != 0) printf(s84er,8); + rc = rc+8; + } + + return rc; +} +array(a,size,start) +int a[], size, start; +{ + int i; + for(i=0; irfs; + rc = 0; + while (*pt++ = *ps++); + + /* Within a structure, the objects declared have + addresses which increase as their declarations are + read left to right. + */ + + if( (char *)&s1.count - &s1.tword[0] <= 0 + ||(char *)&s1.left - (char *)&s1.count <= 0 + ||(char *)&s1.right - (char *)&s1.left <= 0){ + if(pd0->flgd != 0) printf(s85er,1); + rc = rc+1; + } + + /* Each non-field member of a structure begins on an + addressing boundary appropriate to its type. + */ + + diff[0] = &sc.c - &sc.cdummy; + diff[1] = (char *)&ss.s - &ss.cdummy; + diff[2] = (char *)&si.i - &si.cdummy; + diff[3] = (char *)&sl.l - &sl.cdummy; + diff[4] = (char *)&su.u - &su.cdummy; + diff[5] = (char *)&sf.f - &sf.cdummy; + diff[6] = (char *)&sd.d - &sd.cdummy; + + if(pd0->flgm != 0) + for(j=0; j<7; j++) + printf("%s%s%d\n",type[j],aln,diff[j]); + + /* Field specifications are highly implementation de- + pendent. About the only thing we can do here is to + check is that the compiler accepts the field constructs, + and that they seem to work, after a fashion, at + run time... + */ + + s3.threebit = 7; + s3.twobit = s3.threebit; + s3.threebit = s3.twobit; + + if(s3.threebit != 3){ + if(s3.threebit == -1){ + if(pd0->flgm != 0) printf("Sign extension in fields\n"); + } + else{ + if(pd0->flgd != 0) printf(s85er,2); + rc = rc+2; + } + } + + s3.onebit = 1; + if(s3.onebit != 1){ + if(pd0->flgm != 0) + printf("Be especially careful with 1-bit fields!\n"); + } + + /* A union may be thought of as a structure all of whose + members begin at offset 0 and whose size is sufficient + to contain any of its members. + */ + + if( (char *)u0.u1 - (char *)&u0 != 0 + ||(char *)u0.u2 - (char *)&u0 != 0 + ||(char *)u0.u3 - (char *)&u0 != 0 + ||(char *)u0.u4 - (char *)&u0 != 0 + ||(char *)u0.u5 - (char *)&u0 != 0 + ||(char *)u0.u6 - (char *)&u0 != 0 + ||(char *)u0.u7 - (char *)&u0 != 0){ + + if(pd0->flgd != 0) printf(s85er,4); + rc = rc+4; + } + + if( sizeof u0 < sizeof u0.u1 + ||sizeof u0 < sizeof u0.u2 + ||sizeof u0 < sizeof u0.u3 + ||sizeof u0 < sizeof u0.u4 + ||sizeof u0 < sizeof u0.u5 + ||sizeof u0 < sizeof u0.u6 + ||sizeof u0 < sizeof u0.u7){ + + if(pd0->flgd != 0) printf(s85er,8); + rc = rc+8; + } + + /* Finally, we check that the pointers work. */ + + s1.right = &s2; + s2.tword[0] = 2; + s1.right->tword[0] += 1; + if(s2.tword[0] != 3){ + if(pd0->flgd != 0) printf(s85er,16); + rc = rc+16; + } + return rc; +} +s86(pd0) /* 8.6 Initialization */ +struct defs *pd0; +{ + static char s86er[] = "s86,er%d\n"; + static char qs86[8] = "s86 "; + int lrc, rc; + char *ps, *pt; + int one(), i, j, k; + static int x[] = {1,3,5}; + static int *pint = x+2; + static int zero[10]; + int *apint = pint-1; + register int *rpint = apint+one(); + static float y0[] = {1,3,5,2,4,6,3,5,7,0,0,0}; + static float y1[4][3] = { + {1,3,5}, + {2,4,6}, + {3,5,7}, + }; + static float y2[4][3] = {1,3,5,2,4,6,3,5,7}; + static float y3[4][3] = { + {1},{2},{3},{4} + }; + ps = qs86; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* The expression in an initializer for a static or + external variable must be a constant expression or + an expression that reduces to the address of a pre- + viously declared variable, possibly offset by a + constant expression. + */ + + if(*pint != 5){ + if(pd0->flgd != 0) printf(s86er,1); + rc = rc+1; + } + + /* Automatic and register variables may be initialized + by arbitrary expressions involving constants and previously + declared variables and functions. + */ + + if(*apint != 3){ + if(pd0->flgd != 0) printf(s86er,2); + rc = rc+2; + } + + if(*rpint != 5){ + if(pd0->flgd != 0) printf(s86er,4); + rc = rc+4; + } + + /* Static variables that are not initialized are guar- + anteed to start off as zero. + */ + + lrc = 0; + for(j=0; j<10; j++) + if(zero[j] != 0) lrc = 1; + if(lrc != 0){ + if(pd0->flgd != 0) printf(s86er,8); + rc = rc+8; + } + + /* y0, y1, and y2, as declared, should define and + initialize identical arrays. + */ + lrc = 0; + for(i=0; i<4; i++) + for(j=0; j<3; j++){ + k = 3*i+j; + if( y1[i][j] != y2[i][j] + ||y1[i][j] != y0[k]) lrc = 1; + } + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s86er,16); + rc = rc+16; + } + + /* y3 initializes the first column of the array and + leaves the rest zero. + */ + + lrc = 0; + for(j=0; j<4; j++) if(y3[j][0] != j+1) lrc = 1; + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s86er,32); + rc = rc+32; + } + return rc; +} +one(){ + return 1; +} +int *metricp; +s88(pd0) /* 8.8 Typedef */ +struct defs *pd0; +{ + static char s88er[] = "s88,er%d\n"; + static char qs88[8] = "s88 "; + int rc; + char *ps, *pt; + + /* Declarations whose "storage class" is typdef do not + define storage, but instead define identifiers which + can later be used as if they were type keywords naming + fundamental or derived types. + */ + + typedef int MILES, *KLICKSP; + typedef struct {double re, im;} complex; + + MILES distance; + extern KLICKSP metricp; + complex z, *zp; + + ps = qs88; + pt = pd0->rfs; + rc = 0; + while(*pt++ = *ps++); + + /* Hopefully, all of this stuff will compile. After that, + we can only make some superficial tests. + + The type of distance is int, + */ + + if(sizeof distance != sizeof(int)){ + if(pd0->flgd != 0) printf(s88er,1); + rc = rc+1; + } + + /* that of metricp is "pointer to int", */ + + metricp = &distance; + distance = 2; + *metricp = 3; + + if(distance != 3){ + if(pd0->flgd != 0) printf(s88er,2); + rc = rc+2; + } + + /* and that of z is the specified structure. zp is a + pointer to such a structure. + */ + + z.re = 0.; + z.im = 0.; + zp = &z; + zp->re = 1.; + zp->im = 1.; + if(z.re+z.im != 2.){ + if(pd0->flgd != 0) printf(s88er,4); + rc = rc+4; + } + + return rc; +} +s9(pd0) /* 9 Statements */ +struct defs *pd0; +{ + static char s9er[] = "s9,er%d\n"; + static char qs9[8] = "s9 "; + int rc; + char *ps, *pt; + int lrc, i; + + ps = qs9; + pt = pd0->rfs; + rc = 0; + while (*pt++ = *ps++); + + /* One would think that the section on statements would + provide the most variety in the entire sequence of tests. + As it turns out, most of the material in this section has + already been checked in the process of checking out + everything else, and the section at this point is somewhat + anticlimactic. For this reason, we restrict ourselves + to testing two features not already covered. + + Compound statements are delimited by braces. They have the + nice property that identifiers of the auto and register + variety are pushed and popped. It is currently legal to + transfer into a block, but we wont... + */ + + lrc = 0; + for(i=0; i<2; i++){ + int j; + register int k; + j = k = 2; + { + int j; + register int k; + j = k = 3; + if((j != 3) || (k != 3)) lrc = 1; + } + if((j != 2) || (k != 2)) lrc = 1; + } + + if(lrc != 0){ + if(pd0->flgd != 0) printf(s9er,1); + rc = rc+1; + } + + /* Goto statements go to labeled statements, we hope. */ + + goto nobarf; + if(pd0->flgd != 0) printf(s9er,2); + rc = rc+2; + nobarf:; + + return rc; +} +setev(){ /* Sets an external variable. Used */ + extern int extvar; /* by s4, and should be compiled */ + extvar = 1066; /* separately from s4. */ +} + int lbits; /* long */ + int ubits; /* unsigned */ + int fbits; /* float */ + int dbits; /* double */ + float fprec; /* Smallest number that can be */ + float dprec; /* significantly added to 1. */ + int flgs; /* Print return codes, by section */ + int flgm; /* Announce machine dependencies */ + int flgd; /* give explicit diagnostics */ + int flgl; /* Report local return codes. */ + int rrc; /* recent return code */ + int crc; /* Cumulative return code */ + char rfs[8]; /* Return from section */ diff --git a/quake3/source/lcc/tst/cvt.0 b/quake3/source/lcc/tst/cvt.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/cvt.c b/quake3/source/lcc/tst/cvt.c new file mode 100644 index 0000000..4fb7186 --- /dev/null +++ b/quake3/source/lcc/tst/cvt.c @@ -0,0 +1,35 @@ +signed char c; +signed short s; +signed int i; +signed long int l; +unsigned char C; +unsigned short S; +unsigned int I; +unsigned long int L; +float f; +double d; +long double D; +void *p; +void (*P)(void); + +void print(void) { + printf("%d %d %d %ld %u %u %u %lu %f %f %lf\n",c,s,i,l,C,S,I,L,f,d,D); +} + +main() { + c= 1; s=c;i=c;l=c;C=c;S=c;I=c;L=c;f=c;d=c;D=c; print(); + s= 2; c=s; i=s;l=s;C=s;S=s;I=s;L=s;f=s;d=s;D=s; print(); + i= 3; c=i;s=i; l=i;C=i;S=i;I=i;L=i;f=i;d=i;D=i; print(); + l= 4; c=l;s=l;i=l; C=l;S=l;I=l;L=l;f=l;d=l;D=l; print(); + C= 5; c=C;s=C;i=C;l=C; S=C;I=C;L=C;f=C;d=C;D=C; print(); + S= 6; c=S;s=S;i=S;l=S;C=S; I=S;L=S;f=S;d=S;D=S; print(); + I= 7; c=I;s=I;i=I;l=I;C=I;S=I; L=I;f=I;d=I;D=I; print(); + L= 8; c=L;s=L;i=L;l=L;C=L;S=L;I=S; f=L;d=L;D=L; print(); + f= 9; c=f;s=f;i=f;l=f;C=f;S=f;I=f;L=f; d=f;D=f; print(); + d=10; c=d;s=d;i=d;l=d;C=d;S=d;I=d;L=d;f=d; D=d; print(); + D=11; c=D;s=D;i=D;l=D;C=D;S=D;I=D;L=D;f=D;d=D; print(); + + p=0; p=0L; p=0U; p=0UL; p=P; + P=0; P=0L; P=0U; P=0UL; P=p; + return 0; +} diff --git a/quake3/source/lcc/tst/fields.0 b/quake3/source/lcc/tst/fields.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/fields.c b/quake3/source/lcc/tst/fields.c new file mode 100644 index 0000000..658f4f6 --- /dev/null +++ b/quake3/source/lcc/tst/fields.c @@ -0,0 +1,34 @@ +struct foo { + int a; + char b; + int x : 12, y : 4, : 0, : 4, z : 3; + char c; +} x = { 1, 2, 3, 4, 5, 6 }; +int i = 16; +struct baz { unsigned int a:2, b:4, c:32;} y = { 7, 8, 9}; + +main() +{ + printf("x = %d %d %d %d %d %d\n", x.a, x.b, x.x, x.y, x.z, x.c); + printf("y = %d %d %d\n", y.a, y.b, y.c); + x.y = i; + x.z = 070; + printf("x = %d %d %d %d %d %d\n", x.a, x.b, x.x, x.y, x.z, x.c); + y.a = 2; + y.c = i; + printf("y = %d %d %d\n", y.a, y.b, y.c); + f2(&x); + return 0; +} + +f1(struct baz *p) { + p->a = p->b = 0; + if (p->b) + printf("p->b != 0!\n"); + p->a = 0x3; p->b = 0xf; + printf("p->a = 0x%x, p->b = 0x%x\n", p->a, p->b); +} +f2(struct baz *p) { + p->a = (i==0); + p->b = (f1(p),0); +} diff --git a/quake3/source/lcc/tst/front.0 b/quake3/source/lcc/tst/front.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/front.c b/quake3/source/lcc/tst/front.c new file mode 100644 index 0000000..0ce8ae7 --- /dev/null +++ b/quake3/source/lcc/tst/front.c @@ -0,0 +1,120 @@ +main() { + exit(0); +} + +nested(a,b) { + if ((a<4 && b == 'r') + || (a == 1 && (b == 'h' || b == 'i')) + || (a == 2 && (b == 'o' || b == 'y')) + ) a=b; +} + +/* type name scope */ + +void s(struct D *d) {} /* this struct D differs from the one below */ +typedef struct D D; +struct D {int x, y;} Dy={0}; +D Dz={1}; +Dfunc(){ + D a; a.y=1; + s(&Dy); /* error */ +} + +/* qualifiers */ + +const a; int b; +const int a, *x; int b, *y; +volatile unsigned z; + +f() { + x = y; + z = z + z; /* should be 2 references to z's r-value */ +} +f1() { + x = &a; + x = &b; + y = &a; /* error */ + y = &b; +} +f2(int **a, int **b) { + f(&x, &y); + **a = 0; + return **b; +} +g(const int *p) { + g(&a); + g(&b); + return *p; +} +h(int *p) { + f(&a); + f(&b); + return *p; +} +h1(const int x, int y) { + h1(a,b); + h1(b,a); + return x + y; +} +h2() { + char *b; const void *p; + p = b; + b = p; /* error */ +} + + +/* static naming */ + +extern int yy; set1() { { static yy=1; yy=2;} yy=4;} +static int yy; set2() { yy=5; {static yy=2; yy=3; }} +static void goo() {} +sss() { int goo; { static int goo();} goo=1;} +rrr(p) float *p; { extern int xr; + { static float xr; + { extern int *xr; } p=&xr; }} + +/* local extern */ + +static int ss1; +int ss3; +extern int ss5; +setstatic() { extern int ss1,ss2,ss3,ss4; ss1 = ss2; ss3 = ss4; ss5 = 0;} +static int ss2; +int ss4; +static int ss5; + +/* function prototypes */ + +int fx1(void); +int fx1(); + +int gx1(double x); +int gx1(x) double x; { gx1(&x); } /* error */ + +int hx1(); +int hx1(double x,...); /* error */ + +int ff1(double x, int *y); +int ff1(x,y) float x; int y[]; {x=y[0];} + +int gg1(int a); +int gg1(a,b){a=b;} + +int hh1(const int x); +hh1(a) {return a;} + +extern int strcmp(const char*, const char*); +extern void qsort(void*, int, int, int (*)(const void*, const void*)); +extern int cmp(char**a, char**b) { return strcmp(*a,*b); } +sort() { + int n; char *a[100]; + qsort(a, n, sizeof(char*), (int (*)(const void*, const void*))cmp); + qsort(a, n, sizeof(char*), cmp); /* error */ +} + +/* nasty calls */ + +onearg(){ + int a,b,c,d; + f( ( (a? (b = 1): (c = 2)), (d ? 3 : 4) ) ); /* 1 argument */ +} diff --git a/quake3/source/lcc/tst/incr.0 b/quake3/source/lcc/tst/incr.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/incr.c b/quake3/source/lcc/tst/incr.c new file mode 100644 index 0000000..d3d6144 --- /dev/null +++ b/quake3/source/lcc/tst/incr.c @@ -0,0 +1,39 @@ +main() {} + +memchar() { + char x, *p; + + &x, &p; + x = *p++; + x = *++p; + x = *p--; + x = *--p; +} + +memint() { + int x, *p; + + &x, &p; + x = *p++; + x = *++p; + x = *p--; + x = *--p; +} + +regchar() { + register char x, *p; + + x = *p++; + x = *++p; + x = *p--; + x = *--p; +} + +regint() { + register int x, *p; + + x = *p++; + x = *++p; + x = *p--; + x = *--p; +} diff --git a/quake3/source/lcc/tst/init.0 b/quake3/source/lcc/tst/init.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/init.c b/quake3/source/lcc/tst/init.c new file mode 100644 index 0000000..310c707 --- /dev/null +++ b/quake3/source/lcc/tst/init.c @@ -0,0 +1,59 @@ + +typedef struct { int codes[3]; char name[6]; } Word; + +Word words[] = { + 1, 2, 3, "if", + { { 4, 5 }, { 'f', 'o', 'r' } }, + 6, 7, 8, {"else"}, + { { 9, 10, 11,}, 'w', 'h', 'i', 'l', 'e', }, + { 0 }, +}, *wordlist = words; + +int x[][5] = { 1, 2, 3, 4, 0, { 5, 6 }, { 7 } }; +int *y[] = { x[0], x[1], x[2], 0 }; + + +main() +{ + int i, j; + + for (i = 0; y[i]; i++) { + for (j = 0; y[i][j]; j++) + printf(" %d", y[i][j]); + printf("\n"); + } + f(); + g(wordlist); + return 0; +} + +f() { + static char *keywords[] = {"if", "for", "else", "while", 0, }; + char **p; + + for (p = keywords; *p; p++) + printf("%s\n", *p); +} + +g(p) +Word *p; +{ + int i; + + for ( ; p->codes[0]; p++) { + for (i = 0; i < sizeof p->codes/sizeof(p->codes[0]); i++) + printf("%d ", p->codes[i]); + printf("%s\n", p->name); + } + h(); +} + +h() +{ + int i; + + for (i = 0; i < sizeof(words)/sizeof(Word); i++) + printf("%d %d %d %s\n", words[i].codes[0], + words[i].codes[1], words[i].codes[2], + &words[i].name[0]); +} diff --git a/quake3/source/lcc/tst/limits.0 b/quake3/source/lcc/tst/limits.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/limits.c b/quake3/source/lcc/tst/limits.c new file mode 100644 index 0000000..03b1806 --- /dev/null +++ b/quake3/source/lcc/tst/limits.c @@ -0,0 +1,19 @@ +#include + +main() { + printf("UCHAR_MAX: %08x=%d\n", UCHAR_MAX, UCHAR_MAX); + printf("USHRT_MAX: %08x=%d\n", USHRT_MAX, USHRT_MAX); + printf("UINT_MAX: %08x=%d\n", UINT_MAX, UINT_MAX); + printf("ULONG_MAX: %08lx=%ld\n", ULONG_MAX, ULONG_MAX); + printf("CHAR_MAX: %08x=%d\n", CHAR_MAX, CHAR_MAX); + printf("SCHAR_MAX: %08x=%d\n", SCHAR_MAX, SCHAR_MAX); + printf("SHRT_MAX: %08x=%d\n", SHRT_MAX, SHRT_MAX); + printf("INT_MAX: %08x=%d\n", INT_MAX, INT_MAX); + printf("LONG_MAX: %08lx=%ld\n", LONG_MAX, LONG_MAX); + printf("CHAR_MIN: %08x=%d\n", CHAR_MIN, CHAR_MIN); + printf("SCHAR_MIN: %08x=%d\n", SCHAR_MIN, SCHAR_MIN); + printf("SHRT_MIN: %08x=%d\n", SHRT_MIN, SHRT_MIN); + printf("INT_MIN: %08x=%d\n", INT_MIN, INT_MIN); + printf("LONG_MIN: %08lx=%ld\n", LONG_MIN, LONG_MIN); + return 0; +} diff --git a/quake3/source/lcc/tst/paranoia.0 b/quake3/source/lcc/tst/paranoia.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/paranoia.c b/quake3/source/lcc/tst/paranoia.c new file mode 100644 index 0000000..76e0f05 --- /dev/null +++ b/quake3/source/lcc/tst/paranoia.c @@ -0,0 +1,2203 @@ +#undef V9 +#define NOPAUSE +/* A C version of Kahan's Floating Point Test "Paranoia" + + Thos Sumner, UCSF, Feb. 1985 + David Gay, BTL, Jan. 1986 + + This is a rewrite from the Pascal version by + + B. A. Wichmann, 18 Jan. 1985 + + (and does NOT exhibit good C programming style). + +(C) Apr 19 1983 in BASIC version by: + Professor W. M. Kahan, + 567 Evans Hall + Electrical Engineering & Computer Science Dept. + University of California + Berkeley, California 94720 + USA + +converted to Pascal by: + B. A. Wichmann + National Physical Laboratory + Teddington Middx + TW11 OLW + UK + +converted to C by: + + David M. Gay and Thos Sumner + AT&T Bell Labs Computer Center, Rm. U-76 + 600 Mountain Avenue University of California + Murray Hill, NJ 07974 San Francisco, CA 94143 + USA USA + +with simultaneous corrections to the Pascal source (reflected +in the Pascal source available over netlib). +[A couple of bug fixes from dgh = sun!dhough incorporated 31 July 1986.] + +Reports of results on various systems from all the versions +of Paranoia are being collected by Richard Karpinski at the +same address as Thos Sumner. This includes sample outputs, +bug reports, and criticisms. + +You may copy this program freely if you acknowledge its source. +Comments on the Pascal version to NPL, please. + + +The C version catches signals from floating-point exceptions. +If signal(SIGFPE,...) is unavailable in your environment, you may +#define NOSIGNAL to comment out the invocations of signal. + +This source file is too big for some C compilers, but may be split +into pieces. Comments containing "SPLIT" suggest convenient places +for this splitting. At the end of these comments is an "ed script" +(for the UNIX(tm) editor ed) that will do this splitting. + +By #defining Single when you compile this source, you may obtain +a single-precision C version of Paranoia. + + +The following is from the introductory commentary from Wichmann's work: + +The BASIC program of Kahan is written in Microsoft BASIC using many +facilities which have no exact analogy in Pascal. The Pascal +version below cannot therefore be exactly the same. Rather than be +a minimal transcription of the BASIC program, the Pascal coding +follows the conventional style of block-structured languages. Hence +the Pascal version could be useful in producing versions in other +structured languages. + +Rather than use identifiers of minimal length (which therefore have +little mnemonic significance), the Pascal version uses meaningful +identifiers as follows [Note: A few changes have been made for C]: + + +BASIC C BASIC C BASIC C + + A J S StickyBit + A1 AInverse J0 NoErrors T + B Radix [Failure] T0 Underflow + B1 BInverse J1 NoErrors T2 ThirtyTwo + B2 RadixD2 [SeriousDefect] T5 OneAndHalf + B9 BMinusU2 J2 NoErrors T7 TwentySeven + C [Defect] T8 TwoForty + C1 CInverse J3 NoErrors U OneUlp + D [Flaw] U0 UnderflowThreshold + D4 FourD K PageNo U1 + E0 L Milestone U2 + E1 M V + E2 Exp2 N V0 + E3 N1 V8 + E5 MinSqEr O Zero V9 + E6 SqEr O1 One W + E7 MaxSqEr O2 Two X + E8 O3 Three X1 + E9 O4 Four X8 + F1 MinusOne O5 Five X9 Random1 + F2 Half O8 Eight Y + F3 Third O9 Nine Y1 + F6 P Precision Y2 + F9 Q Y9 Random2 + G1 GMult Q8 Z + G2 GDiv Q9 Z0 PseudoZero + G3 GAddSub R Z1 + H R1 RMult Z2 + H1 HInverse R2 RDiv Z9 + I R3 RAddSub + IO NoTrials R4 RSqrt + I3 IEEE R9 Random9 + + SqRWrng + +All the variables in BASIC are true variables and in consequence, +the program is more difficult to follow since the "constants" must +be determined (the glossary is very helpful). The Pascal version +uses Real constants, but checks are added to ensure that the values +are correctly converted by the compiler. + +The major textual change to the Pascal version apart from the +identifiersis that named procedures are used, inserting parameters +wherehelpful. New procedures are also introduced. The +correspondence is as follows: + + +BASIC Pascal +lines + + 90- 140 Pause + 170- 250 Instructions + 380- 460 Heading + 480- 670 Characteristics + 690- 870 History +2940-2950 Random +3710-3740 NewD +4040-4080 DoesYequalX +4090-4110 PrintIfNPositive +4640-4850 TestPartialUnderflow + +=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= + +Below is an "ed script" that splits para.c into 10 files +of the form part[1-8].c, subs.c, and msgs.c, plus a header +file, paranoia.h, that these files require. + +r paranoia.c +$ +?SPLIT ++,$w msgs.c + .,$d +?SPLIT + .d ++d +-,$w subs.c +-,$d +?part8 ++d +?include + .,$w part8.c + .,$d +-d +?part7 ++d +?include + .,$w part7.c + .,$d +-d +?part6 ++d +?include + .,$w part6.c + .,$d +-d +?part5 ++d +?include + .,$w part5.c + .,$d +-d +?part4 ++d +?include + .,$w part4.c + .,$d +-d +?part3 ++d +?include + .,$w part3.c + .,$d +-d +?part2 ++d +?include + .,$w part2.c + .,$d +?SPLIT + .d +1,/^#include/-1d +1,$w part1.c +/Computed constants/,$d +1,$s/^int/extern &/ +1,$s/^FLOAT/extern &/ +1,$s/^char/extern &/ +1,$s! = .*!;! +/^Guard/,/^Round/s/^/extern / +/^jmp_buf/s/^/extern / +/^Sig_type/s/^/extern / +s/$/\ +extern void sigfpe();/ +w paranoia.h +q + +*/ + +#include +#ifndef NOSIGNAL +#include +#endif +#include + +extern double fabs(), floor(), log(), pow(), sqrt(); + +#ifdef Single +#define FLOAT float +#define FABS(x) (float)fabs((double)(x)) +#define FLOOR(x) (float)floor((double)(x)) +#define LOG(x) (float)log((double)(x)) +#define POW(x,y) (float)pow((double)(x),(double)(y)) +#define SQRT(x) (float)sqrt((double)(x)) +#else +#define FLOAT double +#define FABS(x) fabs(x) +#define FLOOR(x) floor(x) +#define LOG(x) log(x) +#define POW(x,y) pow(x,y) +#define SQRT(x) sqrt(x) +#endif + +jmp_buf ovfl_buf; +typedef void (*Sig_type)(); +Sig_type sigsave; + +#define KEYBOARD 0 + +FLOAT Radix, BInvrse, RadixD2, BMinusU2; +FLOAT Sign(), Random(); + +/*Small floating point constants.*/ +FLOAT Zero = 0.0; +FLOAT Half = 0.5; +FLOAT One = 1.0; +FLOAT Two = 2.0; +FLOAT Three = 3.0; +FLOAT Four = 4.0; +FLOAT Five = 5.0; +FLOAT Eight = 8.0; +FLOAT Nine = 9.0; +FLOAT TwentySeven = 27.0; +FLOAT ThirtyTwo = 32.0; +FLOAT TwoForty = 240.0; +FLOAT MinusOne = -1.0; +FLOAT OneAndHalf = 1.5; +/*Integer constants*/ +int NoTrials = 20; /*Number of tests for commutativity. */ +#define False 0 +#define True 1 + +/* Definitions for declared types + Guard == (Yes, No); + Rounding == (Chopped, Rounded, Other); + Message == packed array [1..40] of char; + Class == (Flaw, Defect, Serious, Failure); + */ +#define Yes 1 +#define No 0 +#define Chopped 2 +#define Rounded 1 +#define Other 0 +#define Flaw 3 +#define Defect 2 +#define Serious 1 +#define Failure 0 +typedef int Guard, Rounding, Class; +typedef char Message; + +/* Declarations of Variables */ +int Indx; +char ch[8]; +FLOAT AInvrse, A1; +FLOAT C, CInvrse; +FLOAT D, FourD; +FLOAT E0, E1, Exp2, E3, MinSqEr; +FLOAT SqEr, MaxSqEr, E9; +FLOAT Third; +FLOAT F6, F9; +FLOAT H, HInvrse; +int I; +FLOAT StickyBit, J; +FLOAT MyZero; +FLOAT Precision; +FLOAT Q, Q9; +FLOAT R, Random9; +FLOAT T, Underflow, S; +FLOAT OneUlp, UfThold, U1, U2; +FLOAT V, V0, V9; +FLOAT W; +FLOAT X, X1, X2, X8, Random1; +FLOAT Y, Y1, Y2, Random2; +FLOAT Z, PseudoZero, Z1, Z2, Z9; +int ErrCnt[4]; +int fpecount; +int Milestone; +int PageNo; +int M, N, N1; +Guard GMult, GDiv, GAddSub; +Rounding RMult, RDiv, RAddSub, RSqrt; +int Break, Done, NotMonot, Monot, Anomaly, IEEE, + SqRWrng, UfNGrad; +/* Computed constants. */ +/*U1 gap below 1.0, i.e, 1.0-U1 is next number below 1.0 */ +/*U2 gap above 1.0, i.e, 1.0+U2 is next number above 1.0 */ + +/* floating point exception receiver */ + void +sigfpe(i) +{ + fpecount++; + printf("\n* * * FLOATING-POINT ERROR * * *\n"); + fflush(stdout); + if (sigsave) { +#ifndef NOSIGNAL + signal(SIGFPE, sigsave); +#endif + sigsave = 0; + longjmp(ovfl_buf, 1); + } + abort(); +} + +main() +{ +#ifdef mc + char *out; + ieee_flags("set", "precision", "double", &out); +#endif + /* First two assignments use integer right-hand sides. */ + Zero = 0; + One = 1; + Two = One + One; + Three = Two + One; + Four = Three + One; + Five = Four + One; + Eight = Four + Four; + Nine = Three * Three; + TwentySeven = Nine * Three; + ThirtyTwo = Four * Eight; + TwoForty = Four * Five * Three * Four; + MinusOne = -One; + Half = One / Two; + OneAndHalf = One + Half; + ErrCnt[Failure] = 0; + ErrCnt[Serious] = 0; + ErrCnt[Defect] = 0; + ErrCnt[Flaw] = 0; + PageNo = 1; + /*=============================================*/ + Milestone = 0; + /*=============================================*/ +#ifndef NOSIGNAL + signal(SIGFPE, sigfpe); +#endif + Instructions(); + Pause(); + Heading(); + Pause(); + Characteristics(); + Pause(); + History(); + Pause(); + /*=============================================*/ + Milestone = 7; + /*=============================================*/ + printf("Program is now RUNNING tests on small integers:\n"); + + TstCond (Failure, (Zero + Zero == Zero) && (One - One == Zero) + && (One > Zero) && (One + One == Two), + "0+0 != 0, 1-1 != 0, 1 <= 0, or 1+1 != 2"); + Z = - Zero; + if (Z != 0.0) { + ErrCnt[Failure] = ErrCnt[Failure] + 1; + printf("Comparison alleges that -0.0 is Non-zero!\n"); + U1 = 0.001; + Radix = 1; + TstPtUf(); + } + TstCond (Failure, (Three == Two + One) && (Four == Three + One) + && (Four + Two * (- Two) == Zero) + && (Four - Three - One == Zero), + "3 != 2+1, 4 != 3+1, 4+2*(-2) != 0, or 4-3-1 != 0"); + TstCond (Failure, (MinusOne == (0 - One)) + && (MinusOne + One == Zero ) && (One + MinusOne == Zero) + && (MinusOne + FABS(One) == Zero) + && (MinusOne + MinusOne * MinusOne == Zero), + "-1+1 != 0, (-1)+abs(1) != 0, or -1+(-1)*(-1) != 0"); + TstCond (Failure, Half + MinusOne + Half == Zero, + "1/2 + (-1) + 1/2 != 0"); + /*=============================================*/ + /*SPLIT + part2(); + part3(); + part4(); + part5(); + part6(); + part7(); + part8(); + } +#include "paranoia.h" +part2(){ +*/ + Milestone = 10; + /*=============================================*/ + TstCond (Failure, (Nine == Three * Three) + && (TwentySeven == Nine * Three) && (Eight == Four + Four) + && (ThirtyTwo == Eight * Four) + && (ThirtyTwo - TwentySeven - Four - One == Zero), + "9 != 3*3, 27 != 9*3, 32 != 8*4, or 32-27-4-1 != 0"); + TstCond (Failure, (Five == Four + One) && + (TwoForty == Four * Five * Three * Four) + && (TwoForty / Three - Four * Four * Five == Zero) + && ( TwoForty / Four - Five * Three * Four == Zero) + && ( TwoForty / Five - Four * Three * Four == Zero), + "5 != 4+1, 240/3 != 80, 240/4 != 60, or 240/5 != 48"); + if (ErrCnt[Failure] == 0) { + printf("-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K.\n"); + printf("\n"); + } + printf("Searching for Radix and Precision.\n"); + W = One; + do { + W = W + W; + Y = W + One; + Z = Y - W; + Y = Z - One; + } while (MinusOne + FABS(Y) < Zero); + /*.. now W is just big enough that |((W+1)-W)-1| >= 1 ...*/ + Precision = Zero; + Y = One; + do { + Radix = W + Y; + Y = Y + Y; + Radix = Radix - W; + } while ( Radix == Zero); + if (Radix < Two) Radix = One; + printf("Radix = %f .\n", Radix); + if (Radix != 1) { + W = One; + do { + Precision = Precision + One; + W = W * Radix; + Y = W + One; + } while ((Y - W) == One); + } + /*... now W == Radix^Precision is barely too big to satisfy (W+1)-W == 1 + ...*/ + U1 = One / W; + U2 = Radix * U1; + printf("Closest relative separation found is U1 = %.7e .\n\n", U1); + printf("Recalculating radix and precision\n "); + + /*save old values*/ + E0 = Radix; + E1 = U1; + E9 = U2; + E3 = Precision; + + X = Four / Three; + Third = X - One; + F6 = Half - Third; + X = F6 + F6; + X = FABS(X - Third); + if (X < U2) X = U2; + + /*... now X = (unknown no.) ulps of 1+...*/ + do { + U2 = X; + Y = Half * U2 + ThirtyTwo * U2 * U2; + Y = One + Y; + X = Y - One; + } while ( ! ((U2 <= X) || (X <= Zero))); + + /*... now U2 == 1 ulp of 1 + ... */ + X = Two / Three; + F6 = X - Half; + Third = F6 + F6; + X = Third - Half; + X = FABS(X + F6); + if (X < U1) X = U1; + + /*... now X == (unknown no.) ulps of 1 -... */ + do { + U1 = X; + Y = Half * U1 + ThirtyTwo * U1 * U1; + Y = Half - Y; + X = Half + Y; + Y = Half - X; + X = Half + Y; + } while ( ! ((U1 <= X) || (X <= Zero))); + /*... now U1 == 1 ulp of 1 - ... */ + if (U1 == E1) printf("confirms closest relative separation U1 .\n"); + else printf("gets better closest relative separation U1 = %.7e .\n", U1); + W = One / U1; + F9 = (Half - U1) + Half; + Radix = FLOOR(0.01 + U2 / U1); + if (Radix == E0) printf("Radix confirmed.\n"); + else printf("MYSTERY: recalculated Radix = %.7e .\n", Radix); + TstCond (Defect, Radix <= Eight + Eight, + "Radix is too big: roundoff problems"); + TstCond (Flaw, (Radix == Two) || (Radix == 10) + || (Radix == One), "Radix is not as good as 2 or 10"); + /*=============================================*/ + Milestone = 20; + /*=============================================*/ + TstCond (Failure, F9 - Half < Half, + "(1-U1)-1/2 < 1/2 is FALSE, prog. fails?"); + X = F9; + I = 1; + Y = X - Half; + Z = Y - Half; + TstCond (Failure, (X != One) + || (Z == Zero), "Comparison is fuzzy,X=1 but X-1/2-1/2 != 0"); + X = One + U2; + I = 0; + /*=============================================*/ + Milestone = 25; + /*=============================================*/ + /*... BMinusU2 = nextafter(Radix, 0) */ + BMinusU2 = Radix - One; + BMinusU2 = (BMinusU2 - U2) + One; + /* Purify Integers */ + if (Radix != One) { + X = - TwoForty * LOG(U1) / LOG(Radix); + Y = FLOOR(Half + X); + if (FABS(X - Y) * Four < One) X = Y; + Precision = X / TwoForty; + Y = FLOOR(Half + Precision); + if (FABS(Precision - Y) * TwoForty < Half) Precision = Y; + } + if ((Precision != FLOOR(Precision)) || (Radix == One)) { + printf("Precision cannot be characterized by an Integer number\n"); + printf("of significant digits but, by itself, this is a minor flaw.\n"); + } + if (Radix == One) + printf("logarithmic encoding has precision characterized solely by U1.\n"); + else printf("The number of significant digits of the Radix is %f .\n", + Precision); + TstCond (Serious, U2 * Nine * Nine * TwoForty < One, + "Precision worse than 5 decimal figures "); + /*=============================================*/ + Milestone = 30; + /*=============================================*/ + /* Test for extra-precise subepressions */ + X = FABS(((Four / Three - One) - One / Four) * Three - One / Four); + do { + Z2 = X; + X = (One + (Half * Z2 + ThirtyTwo * Z2 * Z2)) - One; + } while ( ! ((Z2 <= X) || (X <= Zero))); + X = Y = Z = FABS((Three / Four - Two / Three) * Three - One / Four); + do { + Z1 = Z; + Z = (One / Two - ((One / Two - (Half * Z1 + ThirtyTwo * Z1 * Z1)) + + One / Two)) + One / Two; + } while ( ! ((Z1 <= Z) || (Z <= Zero))); + do { + do { + Y1 = Y; + Y = (Half - ((Half - (Half * Y1 + ThirtyTwo * Y1 * Y1)) + Half + )) + Half; + } while ( ! ((Y1 <= Y) || (Y <= Zero))); + X1 = X; + X = ((Half * X1 + ThirtyTwo * X1 * X1) - F9) + F9; + } while ( ! ((X1 <= X) || (X <= Zero))); + if ((X1 != Y1) || (X1 != Z1)) { + BadCond(Serious, "Disagreements among the values X1, Y1, Z1,\n"); + printf("respectively %.7e, %.7e, %.7e,\n", X1, Y1, Z1); + printf("are symptoms of inconsistencies introduced\n"); + printf("by extra-precise evaluation of arithmetic subexpressions.\n"); + notify("Possibly some part of this"); + if ((X1 == U1) || (Y1 == U1) || (Z1 == U1)) printf( + "That feature is not tested further by this program.\n") ; + } + else { + if ((Z1 != U1) || (Z2 != U2)) { + if ((Z1 >= U1) || (Z2 >= U2)) { + BadCond(Failure, ""); + notify("Precision"); + printf("\tU1 = %.7e, Z1 - U1 = %.7e\n",U1,Z1-U1); + printf("\tU2 = %.7e, Z2 - U2 = %.7e\n",U2,Z2-U2); + } + else { + if ((Z1 <= Zero) || (Z2 <= Zero)) { + printf("Because of unusual Radix = %f", Radix); + printf(", or exact rational arithmetic a result\n"); + printf("Z1 = %.7e, or Z2 = %.7e ", Z1, Z2); + notify("of an\nextra-precision"); + } + if (Z1 != Z2 || Z1 > Zero) { + X = Z1 / U1; + Y = Z2 / U2; + if (Y > X) X = Y; + Q = - LOG(X); + printf("Some subexpressions appear to be calculated extra\n"); + printf("precisely with about %g extra B-digits, i.e.\n", + (Q / LOG(Radix))); + printf("roughly %g extra significant decimals.\n", + Q / LOG(10.)); + } + printf("That feature is not tested further by this program.\n"); + } + } + } + Pause(); + /*=============================================*/ + /*SPLIT + } +#include "paranoia.h" +part3(){ +*/ + Milestone = 35; + /*=============================================*/ + if (Radix >= Two) { + X = W / (Radix * Radix); + Y = X + One; + Z = Y - X; + T = Z + U2; + X = T - Z; + TstCond (Failure, X == U2, + "Subtraction is not normalized X=Y,X+Z != Y+Z!"); + if (X == U2) printf( + "Subtraction appears to be normalized, as it should be."); + } + printf("\nChecking for guard digit in *, /, and -.\n"); + Y = F9 * One; + Z = One * F9; + X = F9 - Half; + Y = (Y - Half) - X; + Z = (Z - Half) - X; + X = One + U2; + T = X * Radix; + R = Radix * X; + X = T - Radix; + X = X - Radix * U2; + T = R - Radix; + T = T - Radix * U2; + X = X * (Radix - One); + T = T * (Radix - One); + if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)) GMult = Yes; + else { + GMult = No; + TstCond (Serious, False, + "* lacks a Guard Digit, so 1*X != X"); + } + Z = Radix * U2; + X = One + Z; + Y = FABS((X + Z) - X * X) - U2; + X = One - U2; + Z = FABS((X - U2) - X * X) - U1; + TstCond (Failure, (Y <= Zero) + && (Z <= Zero), "* gets too many final digits wrong.\n"); + Y = One - U2; + X = One + U2; + Z = One / Y; + Y = Z - X; + X = One / Three; + Z = Three / Nine; + X = X - Z; + T = Nine / TwentySeven; + Z = Z - T; + TstCond(Defect, X == Zero && Y == Zero && Z == Zero, + "Division lacks a Guard Digit, so error can exceed 1 ulp\nor 1/3 and 3/9 and 9/27 may disagree"); + Y = F9 / One; + X = F9 - Half; + Y = (Y - Half) - X; + X = One + U2; + T = X / One; + X = T - X; + if ((X == Zero) && (Y == Zero) && (Z == Zero)) GDiv = Yes; + else { + GDiv = No; + TstCond (Serious, False, + "Division lacks a Guard Digit, so X/1 != X"); + } + X = One / (One + U2); + Y = X - Half - Half; + TstCond (Serious, Y < Zero, + "Computed value of 1/1.000..1 >= 1"); + X = One - U2; + Y = One + Radix * U2; + Z = X * Radix; + T = Y * Radix; + R = Z / Radix; + StickyBit = T / Radix; + X = R - X; + Y = StickyBit - Y; + TstCond (Failure, X == Zero && Y == Zero, + "* and/or / gets too many last digits wrong"); + Y = One - U1; + X = One - F9; + Y = One - Y; + T = Radix - U2; + Z = Radix - BMinusU2; + T = Radix - T; + if ((X == U1) && (Y == U1) && (Z == U2) && (T == U2)) GAddSub = Yes; + else { + GAddSub = No; + TstCond (Serious, False, + "- lacks Guard Digit, so cancellation is obscured"); + } + if (F9 != One && F9 - One >= Zero) { + BadCond(Serious, "comparison alleges (1-U1) < 1 although\n"); + printf(" subtraction yields (1-U1) - 1 = 0 , thereby vitiating\n"); + printf(" such precautions against division by zero as\n"); + printf(" ... if (X == 1.0) {.....} else {.../(X-1.0)...}\n"); + } + if (GMult == Yes && GDiv == Yes && GAddSub == Yes) printf( + " *, /, and - appear to have guard digits, as they should.\n"); + /*=============================================*/ + Milestone = 40; + /*=============================================*/ + Pause(); + printf("Checking rounding on multiply, divide and add/subtract.\n"); + RMult = Other; + RDiv = Other; + RAddSub = Other; + RadixD2 = Radix / Two; + A1 = Two; + Done = False; + do { + AInvrse = Radix; + do { + X = AInvrse; + AInvrse = AInvrse / A1; + } while ( ! (FLOOR(AInvrse) != AInvrse)); + Done = (X == One) || (A1 > Three); + if (! Done) A1 = Nine + One; + } while ( ! (Done)); + if (X == One) A1 = Radix; + AInvrse = One / A1; + X = A1; + Y = AInvrse; + Done = False; + do { + Z = X * Y - Half; + TstCond (Failure, Z == Half, + "X * (1/X) differs from 1"); + Done = X == Radix; + X = Radix; + Y = One / X; + } while ( ! (Done)); + Y2 = One + U2; + Y1 = One - U2; + X = OneAndHalf - U2; + Y = OneAndHalf + U2; + Z = (X - U2) * Y2; + T = Y * Y1; + Z = Z - X; + T = T - X; + X = X * Y2; + Y = (Y + U2) * Y1; + X = X - OneAndHalf; + Y = Y - OneAndHalf; + if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T <= Zero)) { + X = (OneAndHalf + U2) * Y2; + Y = OneAndHalf - U2 - U2; + Z = OneAndHalf + U2 + U2; + T = (OneAndHalf - U2) * Y1; + X = X - (Z + U2); + StickyBit = Y * Y1; + S = Z * Y2; + T = T - Y; + Y = (U2 - Y) + StickyBit; + Z = S - (Z + U2 + U2); + StickyBit = (Y2 + U2) * Y1; + Y1 = Y2 * Y1; + StickyBit = StickyBit - Y2; + Y1 = Y1 - Half; + if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero) + && ( StickyBit == Zero) && (Y1 == Half)) { + RMult = Rounded; + printf("Multiplication appears to round correctly.\n"); + } + else if ((X + U2 == Zero) && (Y < Zero) && (Z + U2 == Zero) + && (T < Zero) && (StickyBit + U2 == Zero) + && (Y1 < Half)) { + RMult = Chopped; + printf("Multiplication appears to chop.\n"); + } + else printf("* is neither chopped nor correctly rounded.\n"); + if ((RMult == Rounded) && (GMult == No)) notify("Multiplication"); + } + else printf("* is neither chopped nor correctly rounded.\n"); + /*=============================================*/ + Milestone = 45; + /*=============================================*/ + Y2 = One + U2; + Y1 = One - U2; + Z = OneAndHalf + U2 + U2; + X = Z / Y2; + T = OneAndHalf - U2 - U2; + Y = (T - U2) / Y1; + Z = (Z + U2) / Y2; + X = X - OneAndHalf; + Y = Y - T; + T = T / Y1; + Z = Z - (OneAndHalf + U2); + T = (U2 - OneAndHalf) + T; + if (! ((X > Zero) || (Y > Zero) || (Z > Zero) || (T > Zero))) { + X = OneAndHalf / Y2; + Y = OneAndHalf - U2; + Z = OneAndHalf + U2; + X = X - Y; + T = OneAndHalf / Y1; + Y = Y / Y1; + T = T - (Z + U2); + Y = Y - Z; + Z = Z / Y2; + Y1 = (Y2 + U2) / Y2; + Z = Z - OneAndHalf; + Y2 = Y1 - Y2; + Y1 = (F9 - U1) / F9; + if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero) + && (Y2 == Zero) && (Y2 == Zero) + && (Y1 - Half == F9 - Half )) { + RDiv = Rounded; + printf("Division appears to round correctly.\n"); + if (GDiv == No) notify("Division"); + } + else if ((X < Zero) && (Y < Zero) && (Z < Zero) && (T < Zero) + && (Y2 < Zero) && (Y1 - Half < F9 - Half)) { + RDiv = Chopped; + printf("Division appears to chop.\n"); + } + } + if (RDiv == Other) printf("/ is neither chopped nor correctly rounded.\n"); + BInvrse = One / Radix; + TstCond (Failure, (BInvrse * Radix - Half == Half), + "Radix * ( 1 / Radix ) differs from 1"); + /*=============================================*/ + /*SPLIT + } +#include "paranoia.h" +part4(){ +*/ + Milestone = 50; + /*=============================================*/ + TstCond (Failure, ((F9 + U1) - Half == Half) + && ((BMinusU2 + U2 ) - One == Radix - One), + "Incomplete carry-propagation in Addition"); + X = One - U1 * U1; + Y = One + U2 * (One - U2); + Z = F9 - Half; + X = (X - Half) - Z; + Y = Y - One; + if ((X == Zero) && (Y == Zero)) { + RAddSub = Chopped; + printf("Add/Subtract appears to be chopped.\n"); + } + if (GAddSub == Yes) { + X = (Half + U2) * U2; + Y = (Half - U2) * U2; + X = One + X; + Y = One + Y; + X = (One + U2) - X; + Y = One - Y; + if ((X == Zero) && (Y == Zero)) { + X = (Half + U2) * U1; + Y = (Half - U2) * U1; + X = One - X; + Y = One - Y; + X = F9 - X; + Y = One - Y; + if ((X == Zero) && (Y == Zero)) { + RAddSub = Rounded; + printf("Addition/Subtraction appears to round correctly.\n"); + if (GAddSub == No) notify("Add/Subtract"); + } + else printf("Addition/Subtraction neither rounds nor chops.\n"); + } + else printf("Addition/Subtraction neither rounds nor chops.\n"); + } + else printf("Addition/Subtraction neither rounds nor chops.\n"); + S = One; + X = One + Half * (One + Half); + Y = (One + U2) * Half; + Z = X - Y; + T = Y - X; + StickyBit = Z + T; + if (StickyBit != Zero) { + S = Zero; + BadCond(Flaw, "(X - Y) + (Y - X) is non zero!\n"); + } + StickyBit = Zero; + if ((GMult == Yes) && (GDiv == Yes) && (GAddSub == Yes) + && (RMult == Rounded) && (RDiv == Rounded) + && (RAddSub == Rounded) && (FLOOR(RadixD2) == RadixD2)) { + printf("Checking for sticky bit.\n"); + X = (Half + U1) * U2; + Y = Half * U2; + Z = One + Y; + T = One + X; + if ((Z - One <= Zero) && (T - One >= U2)) { + Z = T + Y; + Y = Z - X; + if ((Z - T >= U2) && (Y - T == Zero)) { + X = (Half + U1) * U1; + Y = Half * U1; + Z = One - Y; + T = One - X; + if ((Z - One == Zero) && (T - F9 == Zero)) { + Z = (Half - U1) * U1; + T = F9 - Z; + Q = F9 - Y; + if ((T - F9 == Zero) && (F9 - U1 - Q == Zero)) { + Z = (One + U2) * OneAndHalf; + T = (OneAndHalf + U2) - Z + U2; + X = One + Half / Radix; + Y = One + Radix * U2; + Z = X * Y; + if (T == Zero && X + Radix * U2 - Z == Zero) { + if (Radix != Two) { + X = Two + U2; + Y = X / Two; + if ((Y - One == Zero)) StickyBit = S; + } + else StickyBit = S; + } + } + } + } + } + } + if (StickyBit == One) printf("Sticky bit apparently used correctly.\n"); + else printf("Sticky bit used incorrectly or not at all.\n"); + TstCond (Flaw, !(GMult == No || GDiv == No || GAddSub == No || + RMult == Other || RDiv == Other || RAddSub == Other), + "lack(s) of guard digits or failure(s) to correctly round or chop\n(noted above) count as one flaw in the final tally below"); + /*=============================================*/ + Milestone = 60; + /*=============================================*/ + printf("\n"); + printf("Does Multiplication commute? "); + printf("Testing on %d random pairs.\n", NoTrials); + Random9 = SQRT(3.0); + Random1 = Third; + I = 1; + do { + X = Random(); + Y = Random(); + Z9 = Y * X; + Z = X * Y; + Z9 = Z - Z9; + I = I + 1; + } while ( ! ((I > NoTrials) || (Z9 != Zero))); + if (I == NoTrials) { + Random1 = One + Half / Three; + Random2 = (U2 + U1) + One; + Z = Random1 * Random2; + Y = Random2 * Random1; + Z9 = (One + Half / Three) * ((U2 + U1) + One) - (One + Half / + Three) * ((U2 + U1) + One); + } + if (! ((I == NoTrials) || (Z9 == Zero))) + BadCond(Defect, "X * Y == Y * X trial fails.\n"); + else printf(" No failures found in %d integer pairs.\n", NoTrials); + /*=============================================*/ + Milestone = 70; + /*=============================================*/ + printf("\nRunning test of square root(x).\n"); + TstCond (Failure, (Zero == SQRT(Zero)) + && (- Zero == SQRT(- Zero)) + && (One == SQRT(One)), "Square root of 0.0, -0.0 or 1.0 wrong"); + MinSqEr = Zero; + MaxSqEr = Zero; + J = Zero; + X = Radix; + OneUlp = U2; + SqXMinX (Serious); + X = BInvrse; + OneUlp = BInvrse * U1; + SqXMinX (Serious); + X = U1; + OneUlp = U1 * U1; + SqXMinX (Serious); + if (J != Zero) Pause(); + printf("Testing if sqrt(X * X) == X for %d Integers X.\n", NoTrials); + J = Zero; + X = Two; + Y = Radix; + if ((Radix != One)) do { + X = Y; + Y = Radix * Y; + } while ( ! ((Y - X >= NoTrials))); + OneUlp = X * U2; + I = 1; + while (I <= NoTrials) { + X = X + One; + SqXMinX (Defect); + if (J > Zero) break; + I = I + 1; + } + printf("Test for sqrt monotonicity.\n"); + I = - 1; + X = BMinusU2; + Y = Radix; + Z = Radix + Radix * U2; + NotMonot = False; + Monot = False; + while ( ! (NotMonot || Monot)) { + I = I + 1; + X = SQRT(X); + Q = SQRT(Y); + Z = SQRT(Z); + if ((X > Q) || (Q > Z)) NotMonot = True; + else { + Q = FLOOR(Q + Half); + if ((I > 0) || (Radix == Q * Q)) Monot = True; + else if (I > 0) { + if (I > 1) Monot = True; + else { + Y = Y * BInvrse; + X = Y - U1; + Z = Y + U1; + } + } + else { + Y = Q; + X = Y - U2; + Z = Y + U2; + } + } + } + if (Monot) printf("sqrt has passed a test for Monotonicity.\n"); + else { + BadCond(Defect, ""); + printf("sqrt(X) is non-monotonic for X near %.7e .\n", Y); + } + /*=============================================*/ + /*SPLIT + } +#include "paranoia.h" +part5(){ +*/ + Milestone = 80; + /*=============================================*/ + MinSqEr = MinSqEr + Half; + MaxSqEr = MaxSqEr - Half; + Y = (SQRT(One + U2) - One) / U2; + SqEr = (Y - One) + U2 / Eight; + if (SqEr > MaxSqEr) MaxSqEr = SqEr; + SqEr = Y + U2 / Eight; + if (SqEr < MinSqEr) MinSqEr = SqEr; + Y = ((SQRT(F9) - U2) - (One - U2)) / U1; + SqEr = Y + U1 / Eight; + if (SqEr > MaxSqEr) MaxSqEr = SqEr; + SqEr = (Y + One) + U1 / Eight; + if (SqEr < MinSqEr) MinSqEr = SqEr; + OneUlp = U2; + X = OneUlp; + for( Indx = 1; Indx <= 3; ++Indx) { + Y = SQRT((X + U1 + X) + F9); + Y = ((Y - U2) - ((One - U2) + X)) / OneUlp; + Z = ((U1 - X) + F9) * Half * X * X / OneUlp; + SqEr = (Y + Half) + Z; + if (SqEr < MinSqEr) MinSqEr = SqEr; + SqEr = (Y - Half) + Z; + if (SqEr > MaxSqEr) MaxSqEr = SqEr; + if (((Indx == 1) || (Indx == 3))) + X = OneUlp * Sign (X) * FLOOR(Eight / (Nine * SQRT(OneUlp))); + else { + OneUlp = U1; + X = - OneUlp; + } + } + /*=============================================*/ + Milestone = 85; + /*=============================================*/ + SqRWrng = False; + Anomaly = False; + RSqrt = Other; /* ~dgh */ + if (Radix != One) { + printf("Testing whether sqrt is rounded or chopped.\n"); + D = FLOOR(Half + POW(Radix, One + Precision - FLOOR(Precision))); + /* ... == Radix^(1 + fract) if (Precision == Integer + fract. */ + X = D / Radix; + Y = D / A1; + if ((X != FLOOR(X)) || (Y != FLOOR(Y))) { + Anomaly = True; + } + else { + X = Zero; + Z2 = X; + Y = One; + Y2 = Y; + Z1 = Radix - One; + FourD = Four * D; + do { + if (Y2 > Z2) { + Q = Radix; + Y1 = Y; + do { + X1 = FABS(Q + FLOOR(Half - Q / Y1) * Y1); + Q = Y1; + Y1 = X1; + } while ( ! (X1 <= Zero)); + if (Q <= One) { + Z2 = Y2; + Z = Y; + } + } + Y = Y + Two; + X = X + Eight; + Y2 = Y2 + X; + if (Y2 >= FourD) Y2 = Y2 - FourD; + } while ( ! (Y >= D)); + X8 = FourD - Z2; + Q = (X8 + Z * Z) / FourD; + X8 = X8 / Eight; + if (Q != FLOOR(Q)) Anomaly = True; + else { + Break = False; + do { + X = Z1 * Z; + X = X - FLOOR(X / Radix) * Radix; + if (X == One) + Break = True; + else + Z1 = Z1 - One; + } while ( ! (Break || (Z1 <= Zero))); + if ((Z1 <= Zero) && (! Break)) Anomaly = True; + else { + if (Z1 > RadixD2) Z1 = Z1 - Radix; + do { + NewD(); + } while ( ! (U2 * D >= F9)); + if (D * Radix - D != W - D) Anomaly = True; + else { + Z2 = D; + I = 0; + Y = D + (One + Z) * Half; + X = D + Z + Q; + SR3750(); + Y = D + (One - Z) * Half + D; + X = D - Z + D; + X = X + Q + X; + SR3750(); + NewD(); + if (D - Z2 != W - Z2) Anomaly = True; + else { + Y = (D - Z2) + (Z2 + (One - Z) * Half); + X = (D - Z2) + (Z2 - Z + Q); + SR3750(); + Y = (One + Z) * Half; + X = Q; + SR3750(); + if (I == 0) Anomaly = True; + } + } + } + } + } + if ((I == 0) || Anomaly) { + BadCond(Failure, "Anomalous arithmetic with Integer < "); + printf("Radix^Precision = %.7e\n", W); + printf(" fails test whether sqrt rounds or chops.\n"); + SqRWrng = True; + } + } + if (! Anomaly) { + if (! ((MinSqEr < Zero) || (MaxSqEr > Zero))) { + RSqrt = Rounded; + printf("Square root appears to be correctly rounded.\n"); + } + else { + if ((MaxSqEr + U2 > U2 - Half) || (MinSqEr > Half) + || (MinSqEr + Radix < Half)) SqRWrng = True; + else { + RSqrt = Chopped; + printf("Square root appears to be chopped.\n"); + } + } + } + if (SqRWrng) { + printf("Square root is neither chopped nor correctly rounded.\n"); + printf("Observed errors run from %.7e ", MinSqEr - Half); + printf("to %.7e ulps.\n", Half + MaxSqEr); + TstCond (Serious, MaxSqEr - MinSqEr < Radix * Radix, + "sqrt gets too many last digits wrong"); + } + /*=============================================*/ + Milestone = 90; + /*=============================================*/ + Pause(); + printf("Testing powers Z^i for small Integers Z and i.\n"); + N = 0; + /* ... test powers of zero. */ + I = 0; + Z = -Zero; + M = 3.0; + Break = False; + do { + X = One; + SR3980(); + if (I <= 10) { + I = 1023; + SR3980(); + } + if (Z == MinusOne) Break = True; + else { + Z = MinusOne; + PrintIfNPositive(); + N = 0; + /* .. if(-1)^N is invalid, replace MinusOne by One. */ + I = - 4; + } + } while ( ! Break); + PrintIfNPositive(); + N1 = N; + N = 0; + Z = A1; + M = FLOOR(Two * LOG(W) / LOG(A1)); + Break = False; + do { + X = Z; + I = 1; + SR3980(); + if (Z == AInvrse) Break = True; + else Z = AInvrse; + } while ( ! (Break)); + /*=============================================*/ + Milestone = 100; + /*=============================================*/ + /* Powers of Radix have been tested, */ + /* next try a few primes */ + M = NoTrials; + Z = Three; + do { + X = Z; + I = 1; + SR3980(); + do { + Z = Z + Two; + } while ( Three * FLOOR(Z / Three) == Z ); + } while ( Z < Eight * Three ); + if (N > 0) { + printf("Errors like this may invalidate financial calculations\n"); + printf("\tinvolving interest rates.\n"); + } + PrintIfNPositive(); + N += N1; + if (N == 0) printf("... no discrepancis found.\n"); + if (N > 0) Pause(); + else printf("\n"); + /*=============================================*/ + /*SPLIT + } +#include "paranoia.h" +part6(){ +*/ + Milestone = 110; + /*=============================================*/ + printf("Seeking Underflow thresholds UfThold and E0.\n"); + D = U1; + if (Precision != FLOOR(Precision)) { + D = BInvrse; + X = Precision; + do { + D = D * BInvrse; + X = X - One; + } while ( X > Zero); + } + Y = One; + Z = D; + /* ... D is power of 1/Radix < 1. */ + do { + C = Y; + Y = Z; + Z = Y * Y; + } while ((Y > Z) && (Z + Z > Z)); + Y = C; + Z = Y * D; + do { + C = Y; + Y = Z; + Z = Y * D; + } while ((Y > Z) && (Z + Z > Z)); + if (Radix < Two) HInvrse = Two; + else HInvrse = Radix; + H = One / HInvrse; + /* ... 1/HInvrse == H == Min(1/Radix, 1/2) */ + CInvrse = One / C; + E0 = C; + Z = E0 * H; + /* ...1/Radix^(BIG Integer) << 1 << CInvrse == 1/C */ + do { + Y = E0; + E0 = Z; + Z = E0 * H; + } while ((E0 > Z) && (Z + Z > Z)); + UfThold = E0; + E1 = Zero; + Q = Zero; + E9 = U2; + S = One + E9; + D = C * S; + if (D <= C) { + E9 = Radix * U2; + S = One + E9; + D = C * S; + if (D <= C) { + BadCond(Failure, "multiplication gets too many last digits wrong.\n"); + Underflow = E0; + Y1 = Zero; + PseudoZero = Z; + Pause(); + } + } + else { + Underflow = D; + PseudoZero = Underflow * H; + UfThold = Zero; + do { + Y1 = Underflow; + Underflow = PseudoZero; + if (E1 + E1 <= E1) { + Y2 = Underflow * HInvrse; + E1 = FABS(Y1 - Y2); + Q = Y1; + if ((UfThold == Zero) && (Y1 != Y2)) UfThold = Y1; + } + PseudoZero = PseudoZero * H; + } while ((Underflow > PseudoZero) + && (PseudoZero + PseudoZero > PseudoZero)); + } + /* Comment line 4530 .. 4560 */ + if (PseudoZero != Zero) { + printf("\n"); + Z = PseudoZero; + /* ... Test PseudoZero for "phoney- zero" violates */ + /* ... PseudoZero < Underflow or PseudoZero < PseudoZero + PseudoZero + ... */ + if (PseudoZero <= Zero) { + BadCond(Failure, "Positive expressions can underflow to an\n"); + printf("allegedly negative value\n"); + printf("PseudoZero that prints out as: %g .\n", PseudoZero); + X = - PseudoZero; + if (X <= Zero) { + printf("But -PseudoZero, which should be\n"); + printf("positive, isn't; it prints out as %g .\n", X); + } + } + else { + BadCond(Flaw, "Underflow can stick at an allegedly positive\n"); + printf("value PseudoZero that prints out as %g .\n", PseudoZero); + } + TstPtUf(); + } + /*=============================================*/ + Milestone = 120; + /*=============================================*/ + if (CInvrse * Y > CInvrse * Y1) { + S = H * S; + E0 = Underflow; + } + if (! ((E1 == Zero) || (E1 == E0))) { + BadCond(Defect, ""); + if (E1 < E0) { + printf("Products underflow at a higher"); + printf(" threshold than differences.\n"); + if (PseudoZero == Zero) + E0 = E1; + } + else { + printf("Difference underflows at a higher"); + printf(" threshold than products.\n"); + } + } + printf("Smallest strictly positive number found is E0 = %g .\n", E0); + Z = E0; + TstPtUf(); + Underflow = E0; + if (N == 1) Underflow = Y; + I = 4; + if (E1 == Zero) I = 3; + if (UfThold == Zero) I = I - 2; + UfNGrad = True; + switch (I) { + case 1: + UfThold = Underflow; + if ((CInvrse * Q) != ((CInvrse * Y) * S)) { + UfThold = Y; + BadCond(Failure, "Either accuracy deteriorates as numbers\n"); + printf("approach a threshold = %.17e\n", UfThold);; + printf(" coming down from %.17e\n", C); + printf(" or else multiplication gets too many last digits wrong.\n"); + } + Pause(); + break; + + case 2: + BadCond(Failure, "Underflow confuses Comparison, which alleges that\n"); + printf("Q == Y while denying that |Q - Y| == 0; these values\n"); + printf("print out as Q = %.17e, Y = %.17e .\n", Q, Y2); + printf ("|Q - Y| = %.17e .\n" , FABS(Q - Y2)); + UfThold = Q; + break; + + case 3: + X = X; + break; + + case 4: + if ((Q == UfThold) && (E1 == E0) + && (FABS( UfThold - E1 / E9) <= E1)) { + UfNGrad = False; + printf("Underflow is gradual; it incurs Absolute Error =\n"); + printf("(roundoff in UfThold) < E0.\n"); + Y = E0 * CInvrse; + Y = Y * (OneAndHalf + U2); + X = CInvrse * (One + U2); + Y = Y / X; + IEEE = (Y == E0); + } + } + if (UfNGrad) { + printf("\n"); + sigsave = sigfpe; + if (setjmp(ovfl_buf)) { + printf("Underflow / UfThold failed!\n"); + R = H + H; + } + else R = SQRT(Underflow / UfThold); + sigsave = 0; + if (R <= H) { + Z = R * UfThold; + X = Z * (One + R * H * (One + H)); + } + else { + Z = UfThold; + X = Z * (One + H * H * (One + H)); + } + if (! ((X == Z) || (X - Z != Zero))) { + BadCond(Flaw, ""); + printf("X = %.17e\n\tis not equal to Z = %.17e .\n", X, Z); + Z9 = X - Z; + printf("yet X - Z yields %.17e .\n", Z9); + printf(" Should this NOT signal Underflow, "); + printf("this is a SERIOUS DEFECT\nthat causes "); + printf("confusion when innocent statements like\n");; + printf(" if (X == Z) ... else"); + printf(" ... (f(X) - f(Z)) / (X - Z) ...\n"); + printf("encounter Division by Zero although actually\n"); + sigsave = sigfpe; + if (setjmp(ovfl_buf)) printf("X / Z fails!\n"); + else printf("X / Z = 1 + %g .\n", (X / Z - Half) - Half); + sigsave = 0; + } + } + printf("The Underflow threshold is %.17e, %s\n", UfThold, + " below which"); + printf("calculation may suffer larger Relative error than "); + printf("merely roundoff.\n"); + Y2 = U1 * U1; + Y = Y2 * Y2; + Y2 = Y * U1; + if (Y2 <= UfThold) { + if (Y > E0) { + BadCond(Defect, ""); + I = 5; + } + else { + BadCond(Serious, ""); + I = 4; + } + printf("Range is too narrow; U1^%d Underflows.\n", I); + } + /*=============================================*/ + /*SPLIT + } +#include "paranoia.h" +part7(){ +*/ + Milestone = 130; + /*=============================================*/ + Y = - FLOOR(Half - TwoForty * LOG(UfThold) / LOG(HInvrse)) / TwoForty; + Y2 = Y + Y; + printf("Since underflow occurs below the threshold\n"); + printf("UfThold = (%.17e) ^ (%.17e)\nonly underflow ", HInvrse, Y); + printf("should afflict the expression\n\t(%.17e) ^ (%.17e);\n", HInvrse, Y); + V9 = POW(HInvrse, Y2); + printf("actually calculating yields: %.17e .\n", V9); + if (! ((V9 >= Zero) && (V9 <= (Radix + Radix + E9) * UfThold))) { + BadCond(Serious, "this is not between 0 and underflow\n"); + printf(" threshold = %.17e .\n", UfThold); + } + else if (! (V9 > UfThold * (One + E9))) + printf("This computed value is O.K.\n"); + else { + BadCond(Defect, "this is not between 0 and underflow\n"); + printf(" threshold = %.17e .\n", UfThold); + } + /*=============================================*/ + Milestone = 140; + /*=============================================*/ + printf("\n"); + /* ...calculate Exp2 == exp(2) == 7.389056099... */ + X = Zero; + I = 2; + Y = Two * Three; + Q = Zero; + N = 0; + do { + Z = X; + I = I + 1; + Y = Y / (I + I); + R = Y + Q; + X = Z + R; + Q = (Z - X) + R; + } while(X > Z); + Z = (OneAndHalf + One / Eight) + X / (OneAndHalf * ThirtyTwo); + X = Z * Z; + Exp2 = X * X; + X = F9; + Y = X - U1; + printf("Testing X^((X + 1) / (X - 1)) vs. exp(2) = %.17e as X -> 1.\n", + Exp2); + for(I = 1;;) { + Z = X - BInvrse; + Z = (X + One) / (Z - (One - BInvrse)); + Q = POW(X, Z) - Exp2; + if (FABS(Q) > TwoForty * U2) { + N = 1; + V9 = (X - BInvrse) - (One - BInvrse); + BadCond(Defect, "Calculated"); + printf(" %.17e for\n", POW(X,Z)); + printf("\t(1 + (%.17e) ^ (%.17e);\n", V9, Z); + printf("\tdiffers from correct value by %.17e .\n", Q); + printf("\tThis much error may spoil financial\n"); + printf("\tcalculations involving tiny interest rates.\n"); + break; + } + else { + Z = (Y - X) * Two + Y; + X = Y; + Y = Z; + Z = One + (X - F9)*(X - F9); + if (Z > One && I < NoTrials) I++; + else { + if (X > One) { + if (N == 0) + printf("Accuracy seems adequate.\n"); + break; + } + else { + X = One + U2; + Y = U2 + U2; + Y += X; + I = 1; + } + } + } + } + /*=============================================*/ + Milestone = 150; + /*=============================================*/ + printf("Testing powers Z^Q at four nearly extreme values.\n"); + N = 0; + Z = A1; + Q = FLOOR(Half - LOG(C) / LOG(A1)); + Break = False; + do { + X = CInvrse; + Y = POW(Z, Q); + IsYeqX(); + Q = - Q; + X = C; + Y = POW(Z, Q); + IsYeqX(); + if (Z < One) Break = True; + else Z = AInvrse; + } while ( ! (Break)); + PrintIfNPositive(); + if (N == 0) printf(" ... no discrepancies found.\n"); + printf("\n"); + + /*=============================================*/ + Milestone = 160; + /*=============================================*/ + Pause(); + printf("Searching for Overflow threshold:\n"); + printf("This may generate an error.\n"); + Y = - CInvrse; + V9 = HInvrse * Y; + sigsave = sigfpe; + if (setjmp(ovfl_buf)) { I = 0; V9 = Y; goto overflow; } + do { + V = Y; + Y = V9; + V9 = HInvrse * Y; + } while(V9 < Y); + I = 1; +overflow: + sigsave = 0; + Z = V9; + printf("Can `Z = -Y' overflow?\n"); + printf("Trying it on Y = %.17e .\n", Y); + V9 = - Y; + V0 = V9; + if (V - Y == V + V0) printf("Seems O.K.\n"); + else { + printf("finds a "); + BadCond(Flaw, "-(-Y) differs from Y.\n"); + } + if (Z != Y) { + BadCond(Serious, ""); + printf("overflow past %.17e\n\tshrinks to %.17e .\n", Y, Z); + } + if (I) { + Y = V * (HInvrse * U2 - HInvrse); + Z = Y + ((One - HInvrse) * U2) * V; + if (Z < V0) Y = Z; + if (Y < V0) V = Y; + if (V0 - V < V0) V = V0; + } + else { + V = Y * (HInvrse * U2 - HInvrse); + V = V + ((One - HInvrse) * U2) * Y; + } + printf("Overflow threshold is V = %.17e .\n", V); + if (I) printf("Overflow saturates at V0 = %.17e .\n", V0); + else printf("There is no saturation value because the system traps on overflow.\n"); + V9 = V * One; + printf("No Overflow should be signaled for V * 1 = %.17e\n", V9); + V9 = V / One; + printf(" nor for V / 1 = %.17e .\n", V9); + printf("Any overflow signal separating this * from the one\n"); + printf("above is a DEFECT.\n"); + /*=============================================*/ + Milestone = 170; + /*=============================================*/ + if (!(-V < V && -V0 < V0 && -UfThold < V && UfThold < V)) { + BadCond(Failure, "Comparisons involving "); + printf("+-%g, +-%g\nand +-%g are confused by Overflow.", + V, V0, UfThold); + } + /*=============================================*/ + Milestone = 175; + /*=============================================*/ + printf("\n"); + for(Indx = 1; Indx <= 3; ++Indx) { + switch (Indx) { + case 1: Z = UfThold; break; + case 2: Z = E0; break; + case 3: Z = PseudoZero; break; + } + if (Z != Zero) { + V9 = SQRT(Z); + Y = V9 * V9; + if (Y / (One - Radix * E9) < Z + || Y > (One + Radix * E9) * Z) { /* dgh: + E9 --> * E9 */ + if (V9 > U1) BadCond(Serious, ""); + else BadCond(Defect, ""); + printf("Comparison alleges that what prints as Z = %.17e\n", Z); + printf(" is too far from sqrt(Z) ^ 2 = %.17e .\n", Y); + } + } + } + /*=============================================*/ + Milestone = 180; + /*=============================================*/ + for(Indx = 1; Indx <= 2; ++Indx) { + if (Indx == 1) Z = V; + else Z = V0; + V9 = SQRT(Z); + X = (One - Radix * E9) * V9; + V9 = V9 * X; + if (((V9 < (One - Two * Radix * E9) * Z) || (V9 > Z))) { + Y = V9; + if (X < W) BadCond(Serious, ""); + else BadCond(Defect, ""); + printf("Comparison alleges that Z = %17e\n", Z); + printf(" is too far from sqrt(Z) ^ 2 (%.17e) .\n", Y); + } + } + /*=============================================*/ + /*SPLIT + } +#include "paranoia.h" +part8(){ +*/ + Milestone = 190; + /*=============================================*/ + Pause(); + X = UfThold * V; + Y = Radix * Radix; + if (X*Y < One || X > Y) { + if (X * Y < U1 || X > Y/U1) BadCond(Defect, "Badly"); + else BadCond(Flaw, ""); + + printf(" unbalanced range; UfThold * V = %.17e\n\t%s\n", + X, "is too far from 1.\n"); + } + /*=============================================*/ + Milestone = 200; + /*=============================================*/ + for (Indx = 1; Indx <= 5; ++Indx) { + X = F9; + switch (Indx) { + case 2: X = One + U2; break; + case 3: X = V; break; + case 4: X = UfThold; break; + case 5: X = Radix; + } + Y = X; + sigsave = sigfpe; + if (setjmp(ovfl_buf)) + printf(" X / X traps when X = %g\n", X); + else { + V9 = (Y / X - Half) - Half; + if (V9 == Zero) continue; + if (V9 == - U1 && Indx < 5) BadCond(Flaw, ""); + else BadCond(Serious, ""); + printf(" X / X differs from 1 when X = %.17e\n", X); + printf(" instead, X / X - 1/2 - 1/2 = %.17e .\n", V9); + } + sigsave = 0; + } + /*=============================================*/ + Milestone = 210; + /*=============================================*/ + MyZero = Zero; + printf("\n"); + printf("What message and/or values does Division by Zero produce?\n") ; +#ifndef NOPAUSE + printf("This can interupt your program. You can "); + printf("skip this part if you wish.\n"); + printf("Do you wish to compute 1 / 0? "); + fflush(stdout); + read (KEYBOARD, ch, 8); + if ((ch[0] == 'Y') || (ch[0] == 'y')) { +#endif + sigsave = sigfpe; + printf(" Trying to compute 1 / 0 produces ..."); + if (!setjmp(ovfl_buf)) printf(" %.7e .\n", One / MyZero); + sigsave = 0; +#ifndef NOPAUSE + } + else printf("O.K.\n"); + printf("\nDo you wish to compute 0 / 0? "); + fflush(stdout); + read (KEYBOARD, ch, 80); + if ((ch[0] == 'Y') || (ch[0] == 'y')) { +#endif + sigsave = sigfpe; + printf("\n Trying to compute 0 / 0 produces ..."); + if (!setjmp(ovfl_buf)) printf(" %.7e .\n", Zero / MyZero); + sigsave = 0; +#ifndef NOPAUSE + } + else printf("O.K.\n"); +#endif + /*=============================================*/ + Milestone = 220; + /*=============================================*/ + Pause(); + printf("\n"); + { + static char *msg[] = { + "FAILUREs encountered =", + "SERIOUS DEFECTs discovered =", + "DEFECTs discovered =", + "FLAWs discovered =" }; + int i; + for(i = 0; i < 4; i++) if (ErrCnt[i]) + printf("The number of %-29s %d.\n", + msg[i], ErrCnt[i]); + } + printf("\n"); + if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[Defect] + + ErrCnt[Flaw]) > 0) { + if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[ + Defect] == 0) && (ErrCnt[Flaw] > 0)) { + printf("The arithmetic diagnosed seems "); + printf("Satisfactory though flawed.\n"); + } + if ((ErrCnt[Failure] + ErrCnt[Serious] == 0) + && ( ErrCnt[Defect] > 0)) { + printf("The arithmetic diagnosed may be Acceptable\n"); + printf("despite inconvenient Defects.\n"); + } + if ((ErrCnt[Failure] + ErrCnt[Serious]) > 0) { + printf("The arithmetic diagnosed has "); + printf("unacceptable Serious Defects.\n"); + } + if (ErrCnt[Failure] > 0) { + printf("Potentially fatal FAILURE may have spoiled this"); + printf(" program's subsequent diagnoses.\n"); + } + } + else { + printf("No failures, defects nor flaws have been discovered.\n"); + if (! ((RMult == Rounded) && (RDiv == Rounded) + && (RAddSub == Rounded) && (RSqrt == Rounded))) + printf("The arithmetic diagnosed seems Satisfactory.\n"); + else { + if (StickyBit >= One && + (Radix - Two) * (Radix - Nine - One) == Zero) { + printf("Rounding appears to conform to "); + printf("the proposed IEEE standard P"); + if ((Radix == Two) && + ((Precision - Four * Three * Two) * + ( Precision - TwentySeven - + TwentySeven + One) == Zero)) + printf("754"); + else printf("854"); + if (IEEE) printf(".\n"); + else { + printf(",\nexcept for possibly Double Rounding"); + printf(" during Gradual Underflow.\n"); + } + } + printf("The arithmetic diagnosed appears to be Excellent!\n"); + } + } + if (fpecount) + printf("\nA total of %d floating point exceptions were registered.\n", + fpecount); + printf("END OF TEST.\n"); + return 0; + } + +/*SPLIT subs.c +#include "paranoia.h" +*/ + +/* Sign */ + +FLOAT Sign (X) +FLOAT X; +{ return X >= 0. ? 1.0 : -1.0; } + +/* Pause */ + +Pause() +{ +#ifndef NOPAUSE + char ch[8]; + + printf("\nTo continue, press RETURN"); + fflush(stdout); + read(KEYBOARD, ch, 8); +#endif + printf("\nDiagnosis resumes after milestone Number %d", Milestone); + printf(" Page: %d\n\n", PageNo); + ++Milestone; + ++PageNo; + } + + /* TstCond */ + +TstCond (K, Valid, T) +int K, Valid; +char *T; +{ if (! Valid) { BadCond(K,T); printf(".\n"); } } + +BadCond(K, T) +int K; +char *T; +{ + static char *msg[] = { "FAILURE", "SERIOUS DEFECT", "DEFECT", "FLAW" }; + + ErrCnt [K] = ErrCnt [K] + 1; + printf("%s: %s", msg[K], T); + } + +/* Random */ +/* Random computes + X = (Random1 + Random9)^5 + Random1 = X - FLOOR(X) + 0.000005 * X; + and returns the new value of Random1 +*/ + +FLOAT Random() +{ + FLOAT X, Y; + + X = Random1 + Random9; + Y = X * X; + Y = Y * Y; + X = X * Y; + Y = X - FLOOR(X); + Random1 = Y + X * 0.000005; + return(Random1); + } + +/* SqXMinX */ + +SqXMinX (ErrKind) +int ErrKind; +{ + FLOAT XA, XB; + + XB = X * BInvrse; + XA = X - XB; + SqEr = ((SQRT(X * X) - XB) - XA) / OneUlp; + if (SqEr != Zero) { + if (SqEr < MinSqEr) MinSqEr = SqEr; + if (SqEr > MaxSqEr) MaxSqEr = SqEr; + J = J + 1.0; + BadCond(ErrKind, "\n"); + printf("sqrt( %.17e) - %.17e = %.17e\n", X * X, X, OneUlp * SqEr); + printf("\tinstead of correct value 0 .\n"); + } + } + +/* NewD */ + +NewD() +{ + X = Z1 * Q; + X = FLOOR(Half - X / Radix) * Radix + X; + Q = (Q - X * Z) / Radix + X * X * (D / Radix); + Z = Z - Two * X * D; + if (Z <= Zero) { + Z = - Z; + Z1 = - Z1; + } + D = Radix * D; + } + +/* SR3750 */ + +SR3750() +{ + if (! ((X - Radix < Z2 - Radix) || (X - Z2 > W - Z2))) { + I = I + 1; + X2 = SQRT(X * D); + Y2 = (X2 - Z2) - (Y - Z2); + X2 = X8 / (Y - Half); + X2 = X2 - Half * X2 * X2; + SqEr = (Y2 + Half) + (Half - X2); + if (SqEr < MinSqEr) MinSqEr = SqEr; + SqEr = Y2 - X2; + if (SqEr > MaxSqEr) MaxSqEr = SqEr; + } + } + +/* IsYeqX */ + +IsYeqX() +{ + if (Y != X) { + if (N <= 0) { + if (Z == Zero && Q <= Zero) + printf("WARNING: computing\n"); + else BadCond(Defect, "computing\n"); + printf("\t(%.17e) ^ (%.17e)\n", Z, Q); + printf("\tyielded %.17e;\n", Y); + printf("\twhich compared unequal to correct %.17e ;\n", + X); + printf("\t\tthey differ by %.17e .\n", Y - X); + } + N = N + 1; /* ... count discrepancies. */ + } + } + +/* SR3980 */ + +SR3980() +{ + do { + Q = (FLOAT) I; + Y = POW(Z, Q); + IsYeqX(); + if (++I > M) break; + X = Z * X; + } while ( X < W ); + } + +/* PrintIfNPositive */ + +PrintIfNPositive() +{ + if (N > 0) printf("Similar discrepancies have occurred %d times.\n", N); + } + +/* TstPtUf */ + +TstPtUf() +{ + N = 0; + if (Z != Zero) { + printf("Since comparison denies Z = 0, evaluating "); + printf("(Z + Z) / Z should be safe.\n"); + sigsave = sigfpe; + if (setjmp(ovfl_buf)) goto very_serious; + Q9 = (Z + Z) / Z; + printf("What the machine gets for (Z + Z) / Z is %.17e .\n", + Q9); + if (FABS(Q9 - Two) < Radix * U2) { + printf("This is O.K., provided Over/Underflow"); + printf(" has NOT just been signaled.\n"); + } + else { + if ((Q9 < One) || (Q9 > Two)) { +very_serious: + N = 1; + ErrCnt [Serious] = ErrCnt [Serious] + 1; + printf("This is a VERY SERIOUS DEFECT!\n"); + } + else { + N = 1; + ErrCnt [Defect] = ErrCnt [Defect] + 1; + printf("This is a DEFECT!\n"); + } + } + sigsave = 0; + V9 = Z * One; + Random1 = V9; + V9 = One * Z; + Random2 = V9; + V9 = Z / One; + if ((Z == Random1) && (Z == Random2) && (Z == V9)) { + if (N > 0) Pause(); + } + else { + N = 1; + BadCond(Defect, "What prints as Z = "); + printf("%.17e\n\tcompares different from ", Z); + if (Z != Random1) printf("Z * 1 = %.17e ", Random1); + if (! ((Z == Random2) + || (Random2 == Random1))) + printf("1 * Z == %g\n", Random2); + if (! (Z == V9)) printf("Z / 1 = %.17e\n", V9); + if (Random2 != Random1) { + ErrCnt [Defect] = ErrCnt [Defect] + 1; + BadCond(Defect, "Multiplication does not commute!\n"); + printf("\tComparison alleges that 1 * Z = %.17e\n", + Random2); + printf("\tdiffers from Z * 1 = %.17e\n", Random1); + } + Pause(); + } + } + } + +notify(s) +char *s; +{ + printf("%s test appears to be inconsistent...\n", s); + printf(" PLEASE NOTIFY KARPINKSI!\n"); + } + +/*SPLIT msgs.c */ + +/* Instructions */ + +msglist(s) +char **s; +{ while(*s) printf("%s\n", *s++); } + +Instructions() +{ + static char *instr[] = { + "Lest this program stop prematurely, i.e. before displaying\n", + " `END OF TEST',\n", + "try to persuade the computer NOT to terminate execution when an", + "error like Over/Underflow or Division by Zero occurs, but rather", + "to persevere with a surrogate value after, perhaps, displaying some", + "warning. If persuasion avails naught, don't despair but run this", + "program anyway to see how many milestones it passes, and then", + "amend it to make further progress.\n", + "Answer questions with Y, y, N or n (unless otherwise indicated).\n", + 0}; + + msglist(instr); + } + +/* Heading */ + +Heading() +{ + static char *head[] = { + "Users are invited to help debug and augment this program so it will", + "cope with unanticipated and newly uncovered arithmetic pathologies.\n", + "Please send suggestions and interesting results to", + "\tRichard Karpinski", + "\tComputer Center U-76", + "\tUniversity of California", + "\tSan Francisco, CA 94143-0704, USA\n", + "In doing so, please include the following information:", +#ifdef Single + "\tPrecision:\tsingle;", +#else + "\tPrecision:\tdouble;", +#endif + "\tVersion:\t10 February 1989;", + "\tComputer:\n", + "\tCompiler:\n", + "\tOptimization level:\n", + "\tOther relevant compiler options:", + 0}; + + msglist(head); + } + +/* Characteristics */ + +Characteristics() +{ + static char *chars[] = { + "Running this program should reveal these characteristics:", + " Radix = 1, 2, 4, 8, 10, 16, 100, 256 ...", + " Precision = number of significant digits carried.", + " U2 = Radix/Radix^Precision = One Ulp", + "\t(OneUlpnit in the Last Place) of 1.000xxx .", + " U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 .", + " Adequacy of guard digits for Mult., Div. and Subt.", + " Whether arithmetic is chopped, correctly rounded, or something else", + "\tfor Mult., Div., Add/Subt. and Sqrt.", + " Whether a Sticky Bit used correctly for rounding.", + " UnderflowThreshold = an underflow threshold.", + " E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy.", + " V = an overflow threshold, roughly.", + " V0 tells, roughly, whether Infinity is represented.", + " Comparisions are checked for consistency with subtraction", + "\tand for contamination with pseudo-zeros.", + " Sqrt is tested. Y^X is not tested.", + " Extra-precise subexpressions are revealed but NOT YET tested.", + " Decimal-Binary conversion is NOT YET tested for accuracy.", + 0}; + + msglist(chars); + } + +History() + +{ /* History */ + /* Converted from Brian Wichmann's Pascal version to C by Thos Sumner, + with further massaging by David M. Gay. */ + + static char *hist[] = { + "The program attempts to discriminate among", + " FLAWs, like lack of a sticky bit,", + " Serious DEFECTs, like lack of a guard digit, and", + " FAILUREs, like 2+2 == 5 .", + "Failures may confound subsequent diagnoses.\n", + "The diagnostic capabilities of this program go beyond an earlier", + "program called `MACHAR', which can be found at the end of the", + "book `Software Manual for the Elementary Functions' (1980) by", + "W. J. Cody and W. Waite. Although both programs try to discover", + "the Radix, Precision and range (over/underflow thresholds)", + "of the arithmetic, this program tries to cope with a wider variety", + "of pathologies, and to say how well the arithmetic is implemented.", + "\nThe program is based upon a conventional radix representation for", + "floating-point numbers, but also allows logarithmic encoding", + "as used by certain early WANG machines.\n", + "BASIC version of this program (C) 1983 by Prof. W. M. Kahan;", + "see source comments for more history.", + 0}; + + msglist(hist); + } + +double +pow(x, y) /* return x ^ y (exponentiation) */ +double x, y; +{ + extern double exp(), frexp(), ldexp(), log(), modf(); + double xy, ye; + long i; + int ex, ey = 0, flip = 0; + + if (!y) return 1.0; + + if ((y < -1100. || y > 1100.) && x != -1.) return exp(y * log(x)); + + if (y < 0.) { y = -y; flip = 1; } + y = modf(y, &ye); + if (y) xy = exp(y * log(x)); + else xy = 1.0; + /* next several lines assume >= 32 bit integers */ + x = frexp(x, &ex); + if (i = ye) for(;;) { + if (i & 1) { xy *= x; ey += ex; } + if (!(i >>= 1)) break; + x *= x; + ex *= 2; + if (x < .5) { x *= 2.; ex -= 1; } + } + if (flip) { xy = 1. / xy; ey = -ey; } + return ldexp(xy, ey); +} diff --git a/quake3/source/lcc/tst/sort.0 b/quake3/source/lcc/tst/sort.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/sort.c b/quake3/source/lcc/tst/sort.c new file mode 100644 index 0000000..029de8e --- /dev/null +++ b/quake3/source/lcc/tst/sort.c @@ -0,0 +1,65 @@ +int in[] = {10, 32, -1, 567, 3, 18, 1, -51, 789, 0}; + +main() { + int i; + + sort(in, (sizeof in)/(sizeof in[0])); + for (i = 0; i < (sizeof in)/(sizeof in[0]); i++) { + putd(in[i]); + putchar('\n'); + } + return 0; +} + +/* putd - output decimal number */ +putd(n) { + if (n < 0) { + putchar('-'); + n = -n; + } + if (n/10) + putd(n/10); + putchar(n%10 + '0'); +} + +int *xx; + +/* sort - sort a[0..n-1] into increasing order */ +sort(a, n) int a[]; { + quick(xx = a, 0, --n); +} + +/* quick - quicksort a[lb..ub] */ +quick(a, lb, ub) int a[]; { + int k, partition(); + + if (lb >= ub) + return; + k = partition(a, lb, ub); + quick(a, lb, k - 1); + quick(a, k + 1, ub); +} + +/* partition - partition a[i..j] */ +int partition(a, i, j) int a[]; { + int v, k; + + j++; + k = i; + v = a[k]; + while (i < j) { + i++; while (a[i] < v) i++; + j--; while (a[j] > v) j--; + if (i < j) exchange(&a[i], &a[j]); + } + exchange(&a[k], &a[j]); + return j; +} + +/* exchange - exchange *x and *y */ +exchange(x, y) int *x, *y; { + int t; + + printf("exchange(%d,%d)\n", x - xx, y - xx); + t = *x; *x = *y; *y = t; +} diff --git a/quake3/source/lcc/tst/spill.0 b/quake3/source/lcc/tst/spill.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/spill.c b/quake3/source/lcc/tst/spill.c new file mode 100644 index 0000000..4a3d9aa --- /dev/null +++ b/quake3/source/lcc/tst/spill.c @@ -0,0 +1,17 @@ +main(){} + +f(i){i=f()+f();} + +f2(i){i=f()+(i?f():1);} + +f3(int i,int *p){register r1=0,r2=0,r3=0,r4=0,r5=0,r6=0,r7=0,r8=0,r9=0,r10=0;*p++=i?f():0;} + +double a[10],b[10];int i;f4(){register r6=0,r7=0,r8=0,r9=0,r10=0,r11=0;i=a[i]+b[i] && i && a[i]-b[i];} +/* f4 causes parent to spill child on vax when odd double regs are enabled */ + +int j, k, m, n; +double *A, *B, x; +f5(){ + x=A[k*m]*A[j*m]+B[k*n]*B[j*n]; + x=A[k*m]*B[j*n]-B[k*n]*A[j*m]; +} diff --git a/quake3/source/lcc/tst/stdarg.0 b/quake3/source/lcc/tst/stdarg.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/stdarg.c b/quake3/source/lcc/tst/stdarg.c new file mode 100644 index 0000000..ff6c918 --- /dev/null +++ b/quake3/source/lcc/tst/stdarg.c @@ -0,0 +1,51 @@ +#include + +struct node { int a[4]; } x = {1,2,3,4}; + +print(char *fmt, ...); + +main() { + print("test 1\n"); + print("test %s\n", "2"); + print("test %d%c", 3, '\n'); + print("%s%s %w%c", "te", "st", 4, '\n'); + print("%s%s %f%c", "te", "st", 5.0, '\n'); + print("%b %b %b %b %b %b\n", x, x, x, x, x, x); + return 0; +} + +print(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + for (; *fmt; fmt++) + if (*fmt == '%') + switch (*++fmt) { + case 'b': { + struct node x = va_arg(ap, struct node); + printf("{%d %d %d %d}", x.a[0], x.a[1], x.a[2], x.a[3]); + break; + } + case 'c': + printf("%c", va_arg(ap, char)); + break; + case 'd': + printf("%d", va_arg(ap, int)); + break; + case 'w': + printf("%x", va_arg(ap, short)); + break; + case 's': + printf("%s", va_arg(ap, char *)); + break; + case 'f': + printf("%f", va_arg(ap, double)); + break; + default: + printf("%c", *fmt); + break; + } + else + printf("%c", *fmt); + va_end(ap); +} diff --git a/quake3/source/lcc/tst/struct.0 b/quake3/source/lcc/tst/struct.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/struct.c b/quake3/source/lcc/tst/struct.c new file mode 100644 index 0000000..97da897 --- /dev/null +++ b/quake3/source/lcc/tst/struct.c @@ -0,0 +1,69 @@ +typedef struct point { int x,y; } point; +typedef struct rect { point pt1, pt2; } rect; + +point addpoint(point p1, point p2) { /* add two points */ + p1.x += p2.x; + p1.y += p2.y; + return p1; +} + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +rect canonrect(rect r) { /* canonicalize rectangle coordinates */ + rect temp; + + temp.pt1.x = min(r.pt1.x, r.pt2.x); + temp.pt1.y = min(r.pt1.y, r.pt2.y); + temp.pt2.x = max(r.pt1.x, r.pt2.x); + temp.pt2.y = max(r.pt1.y, r.pt2.y); + return temp; +} + +point makepoint(int x, int y) { /* make a point from x and y components */ + point p; + + p.x = x; + p.y = y; + return p; +} + +rect makerect(point p1, point p2) { /* make a rectangle from two points */ + rect r; + + r.pt1 = p1; + r.pt2 = p2; + return canonrect(r); +} + +int ptinrect(point p, rect r) { /* is p in r? */ + return p.x >= r.pt1.x && p.x < r.pt2.x + && p.y >= r.pt1.y && p.y < r.pt2.y; +} + +struct odd {char a[3]; } y = {'a', 'b', 0}; + +odd(struct odd y) { + struct odd x = y; + printf("%s\n", x.a); +} + +main() { + int i; + point x, origin = { 0, 0 }, maxpt = { 320, 320 }; + point pts[] = { -1, -1, 1, 1, 20, 300, 500, 400 }; + rect screen = makerect(addpoint(maxpt, makepoint(-10, -10)), + addpoint(origin, makepoint(10, 10))); + + for (i = 0; i < sizeof pts/sizeof pts[0]; i++) { + printf("(%d,%d) is ", pts[i].x, + (x = makepoint(pts[i].x, pts[i].y)).y); + if (ptinrect(x, screen) == 0) + printf("not "); + printf("within [%d,%d; %d,%d]\n", screen.pt1.x, screen.pt1.y, + screen.pt2.x, screen.pt2.y); + } + odd(y); + exit(0); +} + diff --git a/quake3/source/lcc/tst/switch.0 b/quake3/source/lcc/tst/switch.0 new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/tst/switch.c b/quake3/source/lcc/tst/switch.c new file mode 100644 index 0000000..0cd48de --- /dev/null +++ b/quake3/source/lcc/tst/switch.c @@ -0,0 +1,137 @@ +main() +{ + int i; char *s; + + for (s = "bfnrtvx"; *s; s++) + printf("%c = 0x%x\n", *s, backslash(*s)); + f(); + g(); + h(); + for (i = 0x1000000; i&0x7000000; i += 0x1000000) + big(i); + limit(); + return 0; +} + +backslash(c) +{ + switch (c) { + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 't': + return '\t'; + case 'v': + return '\v'; + } + return c; +} + +f() { + int i, x = 0, y; + + printf("f:\n"); + for (i = 0; i <= 20; i++) { + y = i; + switch (i) { + case 1: x = i; break; + case 2: x = i; break; + case 7: x = i; break; + case 8: x = i; break; + case 9: x = i; break; + case 16: x = i; break; + case 17: x = i; break; + case 18: x = i; break; + case 19: x = i; break; + case 20: x = i; break; + } + printf("x = %d\n", x); + } +} + +g() { + int i; + + printf("g:\n"); + for (i = 1; i <= 10; i++) + switch (i) { + case 1: case 2: printf("1 %d\n", i); break; + case 3: case 4: case 5: printf("2 %d\n", i); break; + case 6: case 7: case 8: printf("3 %d\n", i); + default: + printf("d %d\n", i); break; + case 1001: case 1002: case 1003: case 1004: + printf("5 %d\n", i); break; + case 3001: case 3002: case 3003: case 3004: + printf("6 %d\n", i); break; + } +} + +h() +{ + int i, n=0; + + printf("h:\n"); + for (i = 1; i <= 500; i++) + switch (i) { + default: n++; continue; + case 128: printf("i = %d\n", i); break; + case 16: printf("i = %d\n", i); break; + case 8: printf("i = %d\n", i); break; + case 120: printf("i = %d\n", i); break; + case 280: printf("i = %d\n", i); break; + case 264: printf("i = %d\n", i); break; + case 248: printf("i = %d\n", i); break; + case 272: printf("i = %d\n", i); break; + case 304: printf("i = %d\n", i); break; + case 296: printf("i = %d\n", i); break; + case 288: printf("i = %d\n", i); break; + case 312: printf("i = %d\n", i); break; + } + printf("%d defaults\n", n); +} + +big(x) unsigned x; { + switch(x&0x6000000){ + case -1: + case -2: + case 0x0000000: + printf("x = 0x%x\n", x); break; + case 0x2000000: + printf("x = 0x%x\n", x); break; + case 0x4000000: + printf("x = 0x%x\n", x); break; + default: + printf("x = 0x%x (default)\n", x); break; + } +} + +#include + +limit() { + int i; + + for (i = INT_MIN; i <= INT_MIN+5; i++) + switch (i) { + case INT_MIN: printf("0\n"); break; + case INT_MIN+1: printf("1\n"); break; + case INT_MIN+2: printf("2\n"); break; + case INT_MIN+3: printf("3\n"); break; + case INT_MIN+4: printf("4\n"); break; + default: printf("5\n"); break; + } + for (i = INT_MAX; i >= INT_MAX-5; i--) + switch (i) { + case INT_MAX: printf("0\n"); break; + case INT_MAX-1: printf("1\n"); break; + case INT_MAX-2: printf("2\n"); break; + case INT_MAX-3: printf("3\n"); break; + case INT_MAX-4: printf("4\n"); break; + default: printf("5\n"); break; + } +} diff --git a/quake3/source/lcc/tst/wf1.0 b/quake3/source/lcc/tst/wf1.0 new file mode 100644 index 0000000..28f6ebd --- /dev/null +++ b/quake3/source/lcc/tst/wf1.0 @@ -0,0 +1,115 @@ +/* wf1 - print word frequencies; uses structures */ + +struct node { + int count; /* frequency count */ + struct node *left; /* left subtree */ + struct node *right; /* right subtree */ + char *word; /* word itself */ +} words[2000]; +int next; /* index of next free entry in words */ + +struct node *lookup(); + +main() +{ + struct node *root; + char word[20]; + + root = 0; + next = 0; + while (getword(word)) + lookup(word, &root)->count++; + tprint(root); + return 0; +} + +/* err - print error message s and die */ +err(s) +char *s; +{ + printf("? %s\n", s); + exit(1); +} + +/* getword - get next input word into buf, return 0 on EOF */ +int getword(buf) +char *buf; +{ + char *s; + int c; + + while ((c = getchar()) != -1 && isletter(c) == 0) + ; + for (s = buf; c = isletter(c); c = getchar()) + *s++ = c; + *s = 0; + if (s > buf) + return (1); + return (0); +} + +/* isletter - return folded version of c if it is a letter, 0 otherwise */ +int isletter(c) +int c; +{ + if (c >= 'A' && c <= 'Z') + c += 'a' - 'A'; + if (c >= 'a' && c <= 'z') + return (c); + return (0); +} + +/* lookup - lookup word in tree; install if necessary */ +struct node *lookup(word, p) +char *word; +struct node **p; +{ + int cond; + char *malloc(); + + if (*p) { + cond = strcmp(word, (*p)->word); + if (cond < 0) + return lookup(word, &(*p)->left); + else if (cond > 0) + return lookup(word, &(*p)->right); + else + return *p; + } + if (next >= 2000) + err("out of node storage"); + words[next].count = 0; + words[next].left = words[next].right = 0; + words[next].word = malloc(strlen(word) + 1); + if (words[next].word == 0) + err("out of word storage"); + strcpy(words[next].word, word); + return *p = &words[next++]; +} + +/* tprint - print tree */ +tprint(tree) +struct node *tree; +{ + if (tree) { + tprint(tree->left); + printf("%d\t%s\n", tree->count, tree->word); + tprint(tree->right); + } +} + +/* strcmp - compare s1 and s2, return <0, 0, or >0 */ +int strcmp(s1, s2) +char *s1, *s2; +{ + while (*s1 == *s2) { + if (*s1++ == 0) + return 0; + ++s2; + } + if (*s1 == 0) + return -1; + else if (*s2 == 0) + return 1; + return *s1 - *s2; +} diff --git a/quake3/source/lcc/tst/wf1.c b/quake3/source/lcc/tst/wf1.c new file mode 100644 index 0000000..a95b4ec --- /dev/null +++ b/quake3/source/lcc/tst/wf1.c @@ -0,0 +1,101 @@ +/* wf1 - print word frequencies; uses structures */ + +struct node { + int count; /* frequency count */ + struct node *left; /* left subtree */ + struct node *right; /* right subtree */ + char *word; /* word itself */ +} words[2000]; +int next; /* index of next free entry in words */ + +struct node *lookup(); + +main() { + struct node *root; + char word[20]; + + root = 0; + next = 0; + while (getword(word)) + lookup(word, &root)->count++; + tprint(root); + return 0; +} + +/* err - print error message s and die */ +err(s) char *s; { + printf("? %s\n", s); + exit(1); +} + +/* getword - get next input word into buf, return 0 on EOF */ +int getword(buf) char *buf; { + char *s; + int c; + + while ((c = getchar()) != -1 && isletter(c) == 0) + ; + for (s = buf; c = isletter(c); c = getchar()) + *s++ = c; + *s = 0; + if (s > buf) + return (1); + return (0); +} + +/* isletter - return folded version of c if it is a letter, 0 otherwise */ +int isletter(c) { + if (c >= 'A' && c <= 'Z') + c += 'a' - 'A'; + if (c >= 'a' && c <= 'z') + return (c); + return (0); +} + +/* lookup - lookup word in tree; install if necessary */ +struct node *lookup(word, p) char *word; struct node **p; { + int cond; + char *malloc(); + + if (*p) { + cond = strcmp(word, (*p)->word); + if (cond < 0) + return lookup(word, &(*p)->left); + else if (cond > 0) + return lookup(word, &(*p)->right); + else + return *p; + } + if (next >= 2000) + err("out of node storage"); + words[next].count = 0; + words[next].left = words[next].right = 0; + words[next].word = malloc(strlen(word) + 1); + if (words[next].word == 0) + err("out of word storage"); + strcpy(words[next].word, word); + return *p = &words[next++]; +} + +/* tprint - print tree */ +tprint(tree) struct node *tree; { + if (tree) { + tprint(tree->left); + printf("%d\t%s\n", tree->count, tree->word); + tprint(tree->right); + } +} + +/* strcmp - compare s1 and s2, return <0, 0, or >0 */ +int strcmp(s1, s2) char *s1, *s2; { + while (*s1 == *s2) { + if (*s1++ == 0) + return 0; + ++s2; + } + if (*s1 == 0) + return -1; + else if (*s2 == 0) + return 1; + return *s1 - *s2; +} diff --git a/quake3/source/lcc/tst/yacc.0 b/quake3/source/lcc/tst/yacc.0 new file mode 100644 index 0000000..8bea9c4 --- /dev/null +++ b/quake3/source/lcc/tst/yacc.0 @@ -0,0 +1 @@ +a=-b+5*c diff --git a/quake3/source/lcc/tst/yacc.c b/quake3/source/lcc/tst/yacc.c new file mode 100644 index 0000000..cd3e9d0 --- /dev/null +++ b/quake3/source/lcc/tst/yacc.c @@ -0,0 +1,591 @@ +# define ID 257 +# define CON 258 +# define UNARYMINUS 259 +#define yyclearin yychar = -1 +#define yyerrok yyerrflag = 0 +extern int yychar; +extern short yyerrflag; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif +#ifndef YYSTYPE +#define YYSTYPE int +#endif +YYSTYPE yylval, yyval; +# define YYERRCODE 256 + + + +#include + +# define U(x) x +# define NLSTATE yyprevious=YYNEWLINE +# define BEGIN yybgin = yysvec + 1 + +# define INITIAL 0 +# define YYLERR yysvec +# define YYSTATE (yyestate-yysvec-1) +# define YYOPTIM 1 +# define YYLMAX 200 +# define output(c) (void)putc(c,yyout) +# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar) +# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;} +# define yymore() (yymorfg=1) +# define ECHO fprintf(yyout, "%s",yytext) +# define REJECT { nstr = yyreject(); goto yyfussy;} +int yyleng; extern char yytext[]; +int yymorfg; +extern char *yysptr, yysbuf[]; +int yytchar; +FILE *yyin ={stdin}, *yyout ={stdout}; +extern int yylineno; +struct yysvf { + struct yywork *yystoff; + struct yysvf *yyother; + int *yystops;}; +struct yysvf *yyestate; +extern struct yysvf yysvec[], *yybgin; +# define YYNEWLINE 10 +yylex(){ +int nstr; extern int yyprevious; +while((nstr = yylook()) >= 0) +yyfussy: switch(nstr){ +case 0: +if(yywrap()) return(0); break; +case 1: + return ID; +break; +case 2: + return CON; +break; +case 3: + ; +break; +case 4: + return yytext[0]; +break; +case -1: +break; +default: +fprintf(yyout,"bad switch yylook %d",nstr); +} return(0); } +/* end of yylex */ +int yyvstop[] ={ +0, + +4, +0, + +3, +4, +0, + +2, +4, +0, + +1, +4, +0, + +2, +0, + +1, +0, +0}; +# define YYTYPE char +struct yywork { YYTYPE verify, advance; } yycrank[] ={ +0,0, 0,0, 1,3, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 1,4, 1,3, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 1,5, 5,7, 5,7, +5,7, 5,7, 5,7, 5,7, +5,7, 5,7, 5,7, 5,7, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 1,6, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 0,0, 0,0, +0,0, 0,0, 6,8, 0,0, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 6,8, 6,8, +6,8, 6,8, 0,0, 0,0, +0,0}; +struct yysvf yysvec[] ={ +0, 0, 0, +yycrank+-1, 0, 0, +yycrank+0, yysvec+1, 0, +yycrank+0, 0, yyvstop+1, +yycrank+0, 0, yyvstop+3, +yycrank+2, 0, yyvstop+6, +yycrank+19, 0, yyvstop+9, +yycrank+0, yysvec+5, yyvstop+12, +yycrank+0, yysvec+6, yyvstop+14, +0, 0, 0}; +struct yywork *yytop = yycrank+141; +struct yysvf *yybgin = yysvec+1; +char yymatch[] ={ +00 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,011 ,012 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +011 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' , +'0' ,'0' ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , +'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , +'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , +'A' ,'A' ,'A' ,01 ,01 ,01 ,01 ,'A' , +01 ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , +'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , +'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , +'A' ,'A' ,'A' ,01 ,01 ,01 ,01 ,01 , +0}; +char yyextra[] ={ +0,0,0,0,0,0,0,0, +0}; +/* ncform 4.1 83/08/11 */ + +int yylineno =1; +# define YYU(x) x +# define NLSTATE yyprevious=YYNEWLINE +char yytext[YYLMAX]; +struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp; +char yysbuf[YYLMAX]; +char *yysptr = yysbuf; +int *yyfnd; +extern struct yysvf *yyestate; +int yyprevious = YYNEWLINE; +yylook(){ + register struct yysvf *yystate, **lsp; + register struct yywork *yyt; + struct yysvf *yyz; + int yych; + struct yywork *yyr; +# ifdef LEXDEBUG + int debug; +# endif + char *yylastch; + /* start off machines */ +# ifdef LEXDEBUG + debug = 0; +# endif + if (!yymorfg) + yylastch = yytext; + else { + yymorfg=0; + yylastch = yytext+yyleng; + } + for(;;){ + lsp = yylstate; + yyestate = yystate = yybgin; + if (yyprevious==YYNEWLINE) yystate++; + for (;;){ +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1); +# endif + yyt = yystate->yystoff; + if(yyt == yycrank){ /* may not be any transitions */ + yyz = yystate->yyother; + if(yyz == 0)break; + if(yyz->yystoff == yycrank)break; + } + *yylastch++ = yych = input(); + tryagain: +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"char "); + allprint(yych); + putchar('\n'); + } +# endif + yyr = yyt; + if ( yyt > yycrank){ + yyt = yyr + yych; + if (yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transitions */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + } +# ifdef YYOPTIM + else if(yyt < yycrank) { /* r < yycrank */ + yyt = yyr = yycrank+(yycrank-yyt); +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"compressed state\n"); +# endif + yyt = yyt + yych; + if(yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transitions */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + yyt = yyr + YYU(yymatch[yych]); +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"try fall back character "); + allprint(YYU(yymatch[yych])); + putchar('\n'); + } +# endif + if(yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transition */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + } + if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){ +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1); +# endif + goto tryagain; + } +# endif + else + {unput(*--yylastch);break;} + contin: +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"state %d char ",yystate-yysvec-1); + allprint(yych); + putchar('\n'); + } +# endif + ; + } +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1); + allprint(yych); + putchar('\n'); + } +# endif + while (lsp-- > yylstate){ + *yylastch-- = 0; + if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){ + yyolsp = lsp; + if(yyextra[*yyfnd]){ /* must backup */ + while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){ + lsp--; + unput(*yylastch--); + } + } + yyprevious = YYU(*yylastch); + yylsp = lsp; + yyleng = yylastch-yytext+1; + yytext[yyleng] = 0; +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"\nmatch "); + sprint(yytext); + fprintf(yyout," action %d\n",*yyfnd); + } +# endif + return(*yyfnd++); + } + unput(*yylastch); + } + if (yytext[0] == 0 /* && feof(yyin) */) + { + yysptr=yysbuf; + return(0); + } + yyprevious = yytext[0] = input(); + if (yyprevious>0) + output(yyprevious); + yylastch=yytext; +# ifdef LEXDEBUG + if(debug)putchar('\n'); +# endif + } + } +yyback(p, m) + int *p; +{ +if (p==0) return(0); +while (*p) + { + if (*p++ == m) + return(1); + } +return(0); +} + /* the following are only used in the lex library */ +yyinput(){ + return(input()); + } +yyoutput(c) + int c; { + output(c); + } +yyunput(c) + int c; { + unput(c); + } + +main() { + yyparse(); + return 0; +} + +/* yyerror - issue error message */ +yyerror(s) char *s; { + printf("%s\n", s); +} +short yyexca[] ={ +-1, 1, + 0, -1, + -2, 0, + }; +# define YYNPROD 15 +# define YYLAST 249 +short yyact[]={ + + 12, 2, 9, 8, 17, 11, 25, 17, 15, 18, + 16, 10, 18, 17, 15, 7, 16, 13, 18, 5, + 3, 1, 0, 19, 20, 0, 0, 21, 22, 23, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 6 }; +short yypact[]={ + +-1000, -9,-1000, 5, -7, -59,-1000,-1000,-1000, -40, + -29, -40, -40,-1000,-1000, -40, -40, -40, -40, -38, + -35, -38, -38,-1000,-1000,-1000 }; +short yypgo[]={ + + 0, 21, 20, 17, 11 }; +short yyr1[]={ + + 0, 1, 1, 1, 1, 2, 4, 4, 4, 4, + 4, 4, 4, 4, 3 }; +short yyr2[]={ + + 0, 0, 2, 3, 3, 3, 3, 3, 3, 3, + 2, 3, 1, 1, 1 }; +short yychk[]={ + +-1000, -1, 10, -2, 256, -3, 257, 10, 10, 61, + -4, 45, 40, -3, 258, 43, 45, 42, 47, -4, + -4, -4, -4, -4, -4, 41 }; +short yydef[]={ + + 1, -2, 2, 0, 0, 0, 14, 3, 4, 0, + 5, 0, 0, 12, 13, 0, 0, 0, 0, 10, + 0, 6, 7, 8, 9, 11 }; +#ifndef lint +#endif + +# define YYFLAG -1000 +# define YYERROR goto yyerrlab +# define YYACCEPT return(0) +# define YYABORT return(1) + +/* parser for yacc output */ + +#ifdef YYDEBUG +int yydebug = 0; /* 1 for debugging */ +#endif +YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ +int yychar = -1; /* current input token number */ +int yynerrs = 0; /* number of errors */ +short yyerrflag = 0; /* error recovery flag */ + +yyparse() { + + short yys[YYMAXDEPTH]; + short yyj, yym; + register YYSTYPE *yypvt; + register short yystate, *yyps, yyn; + register YYSTYPE *yypv; + register short *yyxi; + + yystate = 0; + yychar = -1; + yynerrs = 0; + yyerrflag = 0; + yyps= &yys[-1]; + yypv= &yyv[-1]; + + yystack: /* put a state and value onto the stack */ + +#ifdef YYDEBUG + if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar ); +#endif + if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); } + *yyps = yystate; + ++yypv; + *yypv = yyval; + + yynewstate: + + yyn = yypact[yystate]; + + if( yyn<= YYFLAG ) goto yydefault; /* simple state */ + + if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0; + if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault; + + if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */ + yychar = -1; + yyval = yylval; + yystate = yyn; + if( yyerrflag > 0 ) --yyerrflag; + goto yystack; + } + + yydefault: + /* default state action */ + + if( (yyn=yydef[yystate]) == -2 ) { + if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0; + /* look through exception table */ + + for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */ + + while( *(yyxi+=2) >= 0 ){ + if( *yyxi == yychar ) break; + } + if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */ + } + + if( yyn == 0 ){ /* error */ + /* error ... attempt to resume parsing */ + + switch( yyerrflag ){ + + case 0: /* brand new error */ + + yyerror( "syntax error" ); + yyerrlab: + ++yynerrs; + + case 1: + case 2: /* incompletely recovered error ... try again */ + + yyerrflag = 3; + + /* find a state where "error" is a legal shift action */ + + while ( yyps >= yys ) { + yyn = yypact[*yyps] + YYERRCODE; + if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){ + yystate = yyact[yyn]; /* simulate a shift of "error" */ + goto yystack; + } + yyn = yypact[*yyps]; + + /* the current yyps has no shift onn "error", pop stack */ + +#ifdef YYDEBUG + if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] ); +#endif + --yyps; + --yypv; + } + + /* there is no state on the stack with an error shift ... abort */ + + yyabort: + return(1); + + + case 3: /* no shift yet; clobber input char */ + +#ifdef YYDEBUG + if( yydebug ) printf( "error recovery discards char %d\n", yychar ); +#endif + + if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */ + yychar = -1; + goto yynewstate; /* try again in the same state */ + + } + + } + + /* reduction by production yyn */ + +#ifdef YYDEBUG + if( yydebug ) printf("reduce %d\n",yyn); +#endif + yyps -= yyr2[yyn]; + yypvt = yypv; + yypv -= yyr2[yyn]; + yyval = yypv[1]; + yym=yyn; + /* consult goto table to find next state */ + yyn = yyr1[yyn]; + yyj = yypgo[yyn] + *yyps + 1; + if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]]; + switch(yym){ + +case 4: +{ yyerrok; } break; +case 5: +{ printf("store\n"); } break; +case 6: +{ printf("add\n"); } break; +case 7: +{ printf("negate\nadd\n"); } break; +case 8: +{ printf("multiply\n"); } break; +case 9: +{ printf("divide\n"); } break; +case 10: +{ printf("negate\n"); } break; +case 12: +{ printf("load\n"); } break; +case 13: +{ printf("push %s\n", yytext); } break; +case 14: +{ printf("%s\n", yytext); } break; + } + goto yystack; /* stack new state and value */ + + } +int yywrap() { return 1; } diff --git a/quake3/source/lcc/x86/linux/tst/8q.1bk b/quake3/source/lcc/x86/linux/tst/8q.1bk new file mode 100644 index 0000000..c66df8e --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/8q.1bk @@ -0,0 +1,92 @@ +1 5 8 6 3 7 2 4 +1 6 8 3 7 4 2 5 +1 7 4 6 8 2 5 3 +1 7 5 8 2 4 6 3 +2 4 6 8 3 1 7 5 +2 5 7 1 3 8 6 4 +2 5 7 4 1 8 6 3 +2 6 1 7 4 8 3 5 +2 6 8 3 1 4 7 5 +2 7 3 6 8 5 1 4 +2 7 5 8 1 4 6 3 +2 8 6 1 3 5 7 4 +3 1 7 5 8 2 4 6 +3 5 2 8 1 7 4 6 +3 5 2 8 6 4 7 1 +3 5 7 1 4 2 8 6 +3 5 8 4 1 7 2 6 +3 6 2 5 8 1 7 4 +3 6 2 7 1 4 8 5 +3 6 2 7 5 1 8 4 +3 6 4 1 8 5 7 2 +3 6 4 2 8 5 7 1 +3 6 8 1 4 7 5 2 +3 6 8 1 5 7 2 4 +3 6 8 2 4 1 7 5 +3 7 2 8 5 1 4 6 +3 7 2 8 6 4 1 5 +3 8 4 7 1 6 2 5 +4 1 5 8 2 7 3 6 +4 1 5 8 6 3 7 2 +4 2 5 8 6 1 3 7 +4 2 7 3 6 8 1 5 +4 2 7 3 6 8 5 1 +4 2 7 5 1 8 6 3 +4 2 8 5 7 1 3 6 +4 2 8 6 1 3 5 7 +4 6 1 5 2 8 3 7 +4 6 8 2 7 1 3 5 +4 6 8 3 1 7 5 2 +4 7 1 8 5 2 6 3 +4 7 3 8 2 5 1 6 +4 7 5 2 6 1 3 8 +4 7 5 3 1 6 8 2 +4 8 1 3 6 2 7 5 +4 8 1 5 7 2 6 3 +4 8 5 3 1 7 2 6 +5 1 4 6 8 2 7 3 +5 1 8 4 2 7 3 6 +5 1 8 6 3 7 2 4 +5 2 4 6 8 3 1 7 +5 2 4 7 3 8 6 1 +5 2 6 1 7 4 8 3 +5 2 8 1 4 7 3 6 +5 3 1 6 8 2 4 7 +5 3 1 7 2 8 6 4 +5 3 8 4 7 1 6 2 +5 7 1 3 8 6 4 2 +5 7 1 4 2 8 6 3 +5 7 2 4 8 1 3 6 +5 7 2 6 3 1 4 8 +5 7 2 6 3 1 8 4 +5 7 4 1 3 8 6 2 +5 8 4 1 3 6 2 7 +5 8 4 1 7 2 6 3 +6 1 5 2 8 3 7 4 +6 2 7 1 3 5 8 4 +6 2 7 1 4 8 5 3 +6 3 1 7 5 8 2 4 +6 3 1 8 4 2 7 5 +6 3 1 8 5 2 4 7 +6 3 5 7 1 4 2 8 +6 3 5 8 1 4 2 7 +6 3 7 2 4 8 1 5 +6 3 7 2 8 5 1 4 +6 3 7 4 1 8 2 5 +6 4 1 5 8 2 7 3 +6 4 2 8 5 7 1 3 +6 4 7 1 3 5 2 8 +6 4 7 1 8 2 5 3 +6 8 2 4 1 7 5 3 +7 1 3 8 6 4 2 5 +7 2 4 1 8 5 3 6 +7 2 6 3 1 4 8 5 +7 3 1 6 8 5 2 4 +7 3 8 2 5 1 6 4 +7 4 2 5 8 1 3 6 +7 4 2 8 6 1 3 5 +7 5 3 1 6 8 2 4 +8 2 4 1 7 5 3 6 +8 2 5 3 1 7 4 6 +8 3 1 6 2 5 7 4 +8 4 1 3 6 2 7 5 diff --git a/quake3/source/lcc/x86/linux/tst/8q.2bk b/quake3/source/lcc/x86/linux/tst/8q.2bk new file mode 100644 index 0000000..fb28350 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/8q.2bk @@ -0,0 +1,2 @@ +tst/8q.c:30: warning: missing return value +tst/8q.c:39: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/8q.sbk b/quake3/source/lcc/x86/linux/tst/8q.sbk new file mode 100644 index 0000000..34af0f1 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/8q.sbk @@ -0,0 +1,180 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $0,-4(%ebp) +.LC2: +movl -4(%ebp),%edi +leal (,%edi,4),%edi +movl $1,down(%edi) +movl $1,up(%edi) +.LC3: +incl -4(%ebp) +cmpl $15,-4(%ebp) +jl .LC2 +movl $0,-4(%ebp) +.LC6: +movl -4(%ebp),%edi +movl $1,rows(,%edi,4) +.LC7: +incl -4(%ebp) +cmpl $8,-4(%ebp) +jl .LC6 +pushl $0 +call queens +addl $4,%esp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf10: +.size main,.Lf10-main +.globl queens +.align 16 +.type queens,@function +queens: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $0,-4(%ebp) +.LC12: +movl -4(%ebp),%edi +cmpl $0,rows(,%edi,4) +je .LC16 +movl 20(%ebp),%esi +movl %edi,%ebx +subl %esi,%ebx +cmpl $0,up+28(,%ebx,4) +je .LC16 +leal (%esi,%edi),%edi +cmpl $0,down(,%edi,4) +je .LC16 +movl -4(%ebp),%edi +movl 20(%ebp),%esi +leal (%esi,%edi),%ebx +movl $0,down(,%ebx,4) +movl %edi,%ebx +subl %esi,%ebx +movl $0,up+28(,%ebx,4) +movl $0,rows(,%edi,4) +movl 20(%ebp),%edi +movl -4(%ebp),%esi +movl %esi,x(,%edi,4) +cmpl $7,20(%ebp) +jne .LC20 +call print +jmp .LC21 +.LC20: +movl 20(%ebp),%edi +leal 1(%edi),%edi +pushl %edi +call queens +addl $4,%esp +.LC21: +movl -4(%ebp),%edi +movl 20(%ebp),%esi +leal (%esi,%edi),%ebx +movl $1,down(,%ebx,4) +movl %edi,%ebx +subl %esi,%ebx +movl $1,up+28(,%ebx,4) +movl $1,rows(,%edi,4) +.LC16: +.LC13: +incl -4(%ebp) +cmpl $8,-4(%ebp) +jl .LC12 +movl $0,%eax +.LC11: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf23: +.size queens,.Lf23-queens +.globl print +.align 16 +.type print,@function +print: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $0,-4(%ebp) +.LC25: +movl -4(%ebp),%edi +movl x(,%edi,4),%edi +leal 49(%edi),%edi +pushl %edi +pushl $.LC29 +call printf +addl $8,%esp +.LC26: +incl -4(%ebp) +cmpl $8,-4(%ebp) +jl .LC25 +pushl $.LC30 +call printf +addl $4,%esp +movl $0,%eax +.LC24: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf31: +.size print,.Lf31-print +.bss +.globl x +.align 4 +.type x,@object +.size x,32 +.comm x,32 +.globl rows +.align 4 +.type rows,@object +.size rows,32 +.comm rows,32 +.globl down +.align 4 +.type down,@object +.size down,60 +.comm down,60 +.globl up +.align 4 +.type up,@object +.size up,60 +.comm up,60 +.data +.align 1 +.LC30: +.byte 10 +.byte 0 +.align 1 +.LC29: +.byte 37 +.byte 99 +.byte 32 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/array.1bk b/quake3/source/lcc/x86/linux/tst/array.1bk new file mode 100644 index 0000000..e188568 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/array.1bk @@ -0,0 +1,4 @@ + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 diff --git a/quake3/source/lcc/x86/linux/tst/array.2bk b/quake3/source/lcc/x86/linux/tst/array.2bk new file mode 100644 index 0000000..0a9b206 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/array.2bk @@ -0,0 +1,2 @@ +tst/array.c:33: warning: missing return value +tst/array.c:48: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/array.sbk b/quake3/source/lcc/x86/linux/tst/array.sbk new file mode 100644 index 0000000..2505a6d --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/array.sbk @@ -0,0 +1,235 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $60,%esp +movl $0,-8(%ebp) +.LC2: +movl $0,-4(%ebp) +.LC6: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movl %esi,%ebx +sall $4,%ebx +leal x(%ebx),%ebx +imul $1000,%esi,%esi +leal (%edi,%esi),%esi +movl %esi,(%ebx,%edi,4) +.LC7: +incl -4(%ebp) +cmpl $4,-4(%ebp) +jl .LC6 +movl -8(%ebp),%edi +movl %edi,%esi +sall $4,%esi +leal x(%esi),%esi +movl %esi,y(,%edi,4) +.LC3: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC2 +call f +movl $0,-8(%ebp) +.LC10: +movl -8(%ebp),%edi +movl %edi,%esi +sall $4,%esi +leal -60(%ebp),%ebx +leal (%ebx,%esi),%esi +movl %esi,-12(%ebp) +movl %esi,y(,%edi,4) +movl $0,-4(%ebp) +.LC14: +movl -4(%ebp),%edi +leal (,%edi,4),%edi +movl -12(%ebp),%esi +movl -8(%ebp),%ebx +sall $4,%ebx +leal x(%ebx),%ebx +movl (%ebx,%edi),%ebx +movl %ebx,(%esi,%edi) +.LC15: +incl -4(%ebp) +cmpl $4,-4(%ebp) +jl .LC14 +.LC11: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC10 +pushl $y +leal -60(%ebp),%edi +pushl %edi +call g +addl $8,%esp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf18: +.size main,.Lf18-main +.globl f +.align 16 +.type f,@function +f: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl $0,-8(%ebp) +.LC20: +movl $0,-4(%ebp) +.LC24: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +sall $4,%esi +leal x(%esi),%esi +pushl (%esi,%edi,4) +pushl $.LC28 +call printf +addl $8,%esp +.LC25: +incl -4(%ebp) +cmpl $4,-4(%ebp) +jl .LC24 +.LC21: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC20 +pushl $.LC29 +call printf +addl $4,%esp +movl $0,-8(%ebp) +.LC30: +movl $0,-4(%ebp) +.LC34: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movl y(,%esi,4),%esi +pushl (%esi,%edi,4) +pushl $.LC28 +call printf +addl $8,%esp +.LC35: +incl -4(%ebp) +cmpl $4,-4(%ebp) +jl .LC34 +.LC31: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC30 +pushl $.LC29 +call printf +addl $4,%esp +movl $0,%eax +.LC19: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf38: +.size f,.Lf38-f +.globl g +.align 16 +.type g,@function +g: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl $0,-8(%ebp) +.LC40: +movl $0,-4(%ebp) +.LC44: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +sall $4,%esi +movl 20(%ebp),%ebx +leal (%ebx,%esi),%esi +pushl (%esi,%edi,4) +pushl $.LC28 +call printf +addl $8,%esp +.LC45: +incl -4(%ebp) +cmpl $4,-4(%ebp) +jl .LC44 +.LC41: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC40 +pushl $.LC29 +call printf +addl $4,%esp +movl $0,-8(%ebp) +.LC48: +movl $0,-4(%ebp) +.LC52: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movl 24(%ebp),%ebx +movl (%ebx,%esi,4),%esi +pushl (%esi,%edi,4) +pushl $.LC28 +call printf +addl $8,%esp +.LC53: +incl -4(%ebp) +cmpl $4,-4(%ebp) +jl .LC52 +.LC49: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC48 +pushl $.LC29 +call printf +addl $4,%esp +movl $0,%eax +.LC39: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf56: +.size g,.Lf56-g +.bss +.globl y +.align 4 +.type y,@object +.size y,12 +.comm y,12 +.globl x +.align 4 +.type x,@object +.size x,48 +.comm x,48 +.data +.align 1 +.LC29: +.byte 10 +.byte 0 +.align 1 +.LC28: +.byte 32 +.byte 37 +.byte 100 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/cf.1bk b/quake3/source/lcc/x86/linux/tst/cf.1bk new file mode 100644 index 0000000..24e21ba --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cf.1bk @@ -0,0 +1,51 @@ +char freq +011 8.1 +012 6.1 +040 11.9 +! 0.2 +" 1.5 +% 0.6 +& 0.4 +' 0.4 +( 2.9 +) 2.9 +* 0.8 ++ 1.3 +, 1.3 +- 0.4 +. 0.6 +/ 1.0 +0 2.5 +1 1.9 +2 0.6 +3 0.2 +7 0.4 +8 0.2 +; 3.8 +< 0.8 += 2.7 +> 0.2 +[ 1.5 +\ 0.8 +] 1.5 +a 3.1 +c 4.4 +e 2.3 +f 6.0 +g 1.3 +h 1.0 +i 5.0 +l 1.0 +m 0.2 +n 3.3 +o 2.1 +p 1.0 +q 0.4 +r 4.2 +s 0.6 +t 3.8 +u 1.2 +v 0.6 +w 0.2 +{ 0.6 +} 0.6 diff --git a/quake3/source/lcc/x86/linux/tst/cf.2bk b/quake3/source/lcc/x86/linux/tst/cf.2bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/linux/tst/cf.sbk b/quake3/source/lcc/x86/linux/tst/cf.sbk new file mode 100644 index 0000000..dc886e0 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cf.sbk @@ -0,0 +1,161 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $24,%esp +cmpl $1,20(%ebp) +jg .LC2 +flds .LC4 +fstps -16(%ebp) +jmp .LC3 +.LC2: +movl 24(%ebp),%edi +pushl 4(%edi) +call atof +addl $4,%esp +fstps -20(%ebp) +flds -20(%ebp) +fdivs .LC5 +fstps -16(%ebp) +.LC3: +movl $0,-4(%ebp) +.LC6: +movl -4(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-4(%ebp) +flds .LC4 +fstps f(,%edi,4) +.LC7: +cmpl $127,-4(%ebp) +jle .LC6 +movl $0,-8(%ebp) +jmp .LC11 +.LC10: +movl -12(%ebp),%edi +leal f(,%edi,4),%edi +flds (,%edi) +fadds .LC13 +fstps (,%edi) +incl -8(%ebp) +.LC11: +call getchar +movl %eax,-12(%ebp) +cmpl $-1,%eax +jne .LC10 +pushl $.LC14 +call printf +addl $4,%esp +movl $0,-4(%ebp) +.LC15: +movl -4(%ebp),%edi +flds f(,%edi,4) +fstps -24(%ebp) +flds .LC4 +fcomps -24(%ebp) +fstsw %ax +sahf +je .LC19 +flds -24(%ebp) +fildl -8(%ebp) +fdivp %st(1),%st +flds -16(%ebp) +fcompp +fstsw %ax +sahf +ja .LC19 +cmpl $32,-4(%ebp) +jg .LC21 +pushl -4(%ebp) +pushl $.LC23 +call printf +addl $8,%esp +jmp .LC22 +.LC21: +pushl -4(%ebp) +pushl $.LC24 +call printf +addl $8,%esp +.LC22: +flds .LC5 +movl -4(%ebp),%edi +fmuls f(,%edi,4) +fildl -8(%ebp) +fdivp %st(1),%st +subl $8,%esp +fstpl (%esp) +pushl $.LC25 +call printf +addl $12,%esp +.LC19: +.LC16: +incl -4(%ebp) +cmpl $127,-4(%ebp) +jle .LC15 +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf26: +.size main,.Lf26-main +.bss +.globl f +.align 4 +.type f,@object +.size f,512 +.comm f,512 +.data +.align 1 +.LC25: +.byte 9 +.byte 37 +.byte 46 +.byte 49 +.byte 102 +.byte 10 +.byte 0 +.align 1 +.LC24: +.byte 37 +.byte 99 +.byte 0 +.align 1 +.LC23: +.byte 37 +.byte 48 +.byte 51 +.byte 111 +.byte 0 +.align 1 +.LC14: +.byte 99 +.byte 104 +.byte 97 +.byte 114 +.byte 9 +.byte 102 +.byte 114 +.byte 101 +.byte 113 +.byte 10 +.byte 0 +.align 4 +.LC13: +.long 1065353216 +.align 4 +.LC5: +.long 1120403456 +.align 4 +.LC4: +.long 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/cq.1bk b/quake3/source/lcc/x86/linux/tst/cq.1bk new file mode 100644 index 0000000..05acbee --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cq.1bk @@ -0,0 +1,48 @@ +Section s22 returned 0. +Decimal and octal/hex constants sometimes give + different results when assigned to longs. +Decimal and octal/hex constants sometimes give + different results when assigned to longs. +Section s241 returned 0. +Section s243 returned 0. +Section s244 returned 0. +Section s25 returned 0. + 8 bits in chars. + 32 bits in ints. + 16 bits in shorts. + 32 bits in longs. + 32 bits in unsigneds. + 32 bits in floats. + 64 bits in doubles. +1.192093e-07 is the least number that can be added to 1. (float). +2.220446e-16 is the least number that can be added to 1. (double). +Section s26 returned 0. +Section s4 returned 0. +Section s61 returned 0. +Section s626 returned 0. +Section s71 returned 0. +Section s72 returned 0. +Section s757 returned 0. +Section s7813 returned 0. +Section s714 returned 0. +Section s715 returned 0. +Register count for char is unreliable. +Register count for pointer is unreliable. +Register count for int is unreliable. +Section s81 returned 0. +Section s84 returned 0. +char alignment: 1 +short alignment: 2 +int alignment: 4 +long alignment: 4 +unsigned alignment: 4 +float alignment: 4 +double alignment: 4 +Sign extension in fields +Be especially careful with 1-bit fields! +Section s85 returned 0. +Section s86 returned 0. +Section s88 returned 0. +Section s9 returned 0. + +No errors detected. diff --git a/quake3/source/lcc/x86/linux/tst/cq.2bk b/quake3/source/lcc/x86/linux/tst/cq.2bk new file mode 100644 index 0000000..295f5b6 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cq.2bk @@ -0,0 +1,25 @@ +tst/cq.c:394: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:394: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:394: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:395: warning: overflow in constant `4294967296' +tst/cq.c:395: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:395: warning: overflow in constant `040000000000' +tst/cq.c:395: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:395: warning: overflow in constant `0x100000000' +tst/cq.c:395: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:396: warning: overflow in constant `68719476735' +tst/cq.c:396: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:396: warning: overflow in constant `0777777777777' +tst/cq.c:396: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:396: warning: overflow in constant `0xfffffffff' +tst/cq.c:396: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:397: warning: overflow in constant `68719476736' +tst/cq.c:397: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:397: warning: overflow in constant `01000000000000' +tst/cq.c:397: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:397: warning: overflow in constant `0x1000000000' +tst/cq.c:397: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:533: warning: missing return value +tst/cq.c:1169: warning: missing return value +tst/cq.c:5294: warning: unreachable code +tst/cq.c:5303: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/cq.sbk b/quake3/source/lcc/x86/linux/tst/cq.sbk new file mode 100644 index 0000000..6e93567 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cq.sbk @@ -0,0 +1,15756 @@ +.data +.align 4 +.type sec.2,@object +sec.2: +.long s22 +.long s241 +.long s243 +.long s244 +.long s25 +.long s26 +.long s4 +.long s61 +.long s626 +.long s71 +.long s72 +.long s757 +.long s7813 +.long s714 +.long s715 +.long s81 +.long s84 +.long s85 +.long s86 +.long s88 +.long s9 +.bss +.size sec.2,84 +.align 4 +.type d0.3,@object +.size d0.3,68 +.lcomm d0.3,68 +.align 4 +.type pd0.4,@object +.size pd0.4,4 +.lcomm pd0.4,4 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $1,d0.3+36 +movl $1,d0.3+40 +movl $1,d0.3+44 +movl $1,d0.3+48 +leal d0.3,%edi +movl %edi,pd0.4 +movl $0,-4(%ebp) +jmp .LC12 +.LC9: +pushl pd0.4 +movl -4(%ebp),%edi +call *sec.2(,%edi,4) +addl $4,%esp +movl %eax,d0.3+52 +movl d0.3+56,%edi +movl d0.3+52,%esi +leal (%esi,%edi),%edi +movl %edi,d0.3+56 +cmpl $0,d0.3+36 +je .LC17 +pushl d0.3+52 +pushl $d0.3+60 +pushl $.LC20 +call printf +addl $12,%esp +.LC17: +.LC10: +incl -4(%ebp) +.LC12: +movl -4(%ebp),%edi +cmpl $21,%edi +jb .LC9 +cmpl $0,d0.3+56 +jne .LC23 +pushl $.LC26 +call printf +addl $4,%esp +jmp .LC24 +.LC23: +pushl $.LC27 +call printf +addl $4,%esp +.LC24: +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf28: +.size main,.Lf28-main +.data +.align 1 +.type s22er.30,@object +s22er.30: +.byte 115 +.byte 50 +.byte 50 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s22er.30,10 +.align 1 +.type qs22.31,@object +.size qs22.31,8 +qs22.31: +.byte 115 +.byte 50 +.byte 50 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s22 +.text +.align 16 +.type s22,@function +s22: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $32,%esp +movl $0,-12(%ebp) +leal qs22.31,%edi +movl %edi,-4(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-8(%ebp) +.LC32: +.LC33: +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movl -4(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-4(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC32 +movl $1,-16(%ebp) +movl $2,-24(%ebp) +movl $3,-28(%ebp) +movl $4,-20(%ebp) +movl -16(%ebp),%edi +movl -24(%ebp),%esi +leal (%esi,%edi),%edi +movl -28(%ebp),%esi +leal (%esi,%edi),%edi +movl -20(%ebp),%esi +leal (%esi,%edi),%edi +cmpl $10,%edi +je .LC35 +incl -12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC37 +pushl $1 +pushl $s22er.30 +call printf +addl $8,%esp +.LC37: +.LC35: +movl $2,-32(%ebp) +movl -16(%ebp),%edi +cmpl %edi,-32(%ebp) +jne .LC39 +addl $4,-12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC41 +pushl $4 +pushl $s22er.30 +call printf +addl $8,%esp +.LC41: +.LC39: +movl -12(%ebp),%eax +.LC29: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf43: +.size s22,.Lf43-s22 +.data +.align 1 +.type s241er.45,@object +s241er.45: +.byte 115 +.byte 50 +.byte 52 +.byte 49 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s241er.45,11 +.align 1 +.type qs241.46,@object +.size qs241.46,8 +qs241.46: +.byte 115 +.byte 50 +.byte 52 +.byte 49 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 4 +.type g.47,@object +.size g.47,156 +g.47: +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 0 +.long 6 +.long 0 +.long 8 +.long 0 +.long 12 +.long 0 +.long 16 +.long 0 +.long 18 +.long 0 +.long 20 +.long 0 +.long 24 +.long 0 +.long 28 +.long 0 +.long 30 +.long 0 +.long 32 +.long 0 +.long 36 +.globl s241 +.text +.align 16 +.type s241,@function +s241: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $488,%esp +movl $0,-484(%ebp) +movl $0,-488(%ebp) +leal qs241.46,%edi +movl %edi,-476(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-480(%ebp) +.LC48: +.LC49: +movl -480(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-480(%ebp) +movl -476(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-476(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC48 +jmp .LC51 +incl -484(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC53 +pushl $1 +pushl $s241er.45 +call printf +addl $8,%esp +.LC53: +.LC51: +jmp .LC55 +addl $2,-484(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC57 +pushl $2 +pushl $s241er.45 +call printf +addl $8,%esp +.LC57: +.LC55: +jmp .LC59 +addl $4,-484(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC61 +pushl $4 +pushl $s241er.45 +call printf +addl $8,%esp +.LC61: +.LC59: +jmp .LC63 +addl $8,-484(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC65 +pushl $8 +pushl $s241er.45 +call printf +addl $8,%esp +.LC65: +.LC63: +movl $0,-4(%ebp) +.LC67: +movl -4(%ebp),%edi +movl %edi,g.47(,%edi,4) +.LC68: +incl -4(%ebp) +cmpl $17,-4(%ebp) +jl .LC67 +movl $18,-4(%ebp) +.LC71: +movl -4(%ebp),%edi +leal g.47(,%edi,4),%edi +pushl (,%edi) +call pow2 +addl $4,%esp +movl %eax,(,%edi) +movl -4(%ebp),%edi +leal (,%edi,4),%edi +movl g.47(%edi),%esi +subl $1,%esi +movl %esi,g.47-4(%edi) +addl $2,-4(%ebp) +.LC72: +cmpl $39,-4(%ebp) +jl .LC71 +movl $0,-160(%ebp) +movl $0,-316(%ebp) +movl $0,-472(%ebp) +movl $1,-156(%ebp) +movl $1,-312(%ebp) +movl $1,-468(%ebp) +movl $2,-152(%ebp) +movl $2,-308(%ebp) +movl $2,-464(%ebp) +movl $3,-148(%ebp) +movl $3,-304(%ebp) +movl $3,-460(%ebp) +movl $4,-144(%ebp) +movl $4,-300(%ebp) +movl $4,-456(%ebp) +movl $5,-140(%ebp) +movl $5,-296(%ebp) +movl $5,-452(%ebp) +movl $6,-136(%ebp) +movl $6,-292(%ebp) +movl $6,-448(%ebp) +movl $7,-132(%ebp) +movl $7,-288(%ebp) +movl $7,-444(%ebp) +movl $8,-128(%ebp) +movl $8,-284(%ebp) +movl $8,-440(%ebp) +movl $9,-124(%ebp) +movl $9,-280(%ebp) +movl $9,-436(%ebp) +movl $10,-120(%ebp) +movl $10,-276(%ebp) +movl $10,-432(%ebp) +movl $11,-116(%ebp) +movl $11,-272(%ebp) +movl $11,-428(%ebp) +movl $12,-112(%ebp) +movl $12,-268(%ebp) +movl $12,-424(%ebp) +movl $13,-108(%ebp) +movl $13,-264(%ebp) +movl $13,-420(%ebp) +movl $14,-104(%ebp) +movl $14,-260(%ebp) +movl $14,-416(%ebp) +movl $15,-100(%ebp) +movl $15,-256(%ebp) +movl $15,-412(%ebp) +movl $16,-96(%ebp) +movl $16,-252(%ebp) +movl $16,-408(%ebp) +movl $63,-92(%ebp) +movl $63,-248(%ebp) +movl $63,-404(%ebp) +movl $64,-88(%ebp) +movl $64,-244(%ebp) +movl $64,-400(%ebp) +movl $255,-84(%ebp) +movl $255,-240(%ebp) +movl $255,-396(%ebp) +movl $256,-80(%ebp) +movl $256,-236(%ebp) +movl $256,-392(%ebp) +movl $4095,-76(%ebp) +movl $4095,-232(%ebp) +movl $4095,-388(%ebp) +movl $4096,-72(%ebp) +movl $4096,-228(%ebp) +movl $4096,-384(%ebp) +movl $65535,-68(%ebp) +movl $65535,-224(%ebp) +movl $65535,-380(%ebp) +movl $65536,-64(%ebp) +movl $65536,-220(%ebp) +movl $65536,-376(%ebp) +movl $262143,-60(%ebp) +movl $262143,-216(%ebp) +movl $262143,-372(%ebp) +movl $262144,-56(%ebp) +movl $262144,-212(%ebp) +movl $262144,-368(%ebp) +movl $1048575,-52(%ebp) +movl $1048575,-208(%ebp) +movl $1048575,-364(%ebp) +movl $1048576,-48(%ebp) +movl $1048576,-204(%ebp) +movl $1048576,-360(%ebp) +movl $16777215,-44(%ebp) +movl $16777215,-200(%ebp) +movl $16777215,-356(%ebp) +movl $16777216,-40(%ebp) +movl $16777216,-196(%ebp) +movl $16777216,-352(%ebp) +movl $268435455,-36(%ebp) +movl $268435455,-192(%ebp) +movl $268435455,-348(%ebp) +movl $268435456,-32(%ebp) +movl $268435456,-188(%ebp) +movl $268435456,-344(%ebp) +movl $1073741823,-28(%ebp) +movl $1073741823,-184(%ebp) +movl $1073741823,-340(%ebp) +movl $1073741824,-24(%ebp) +movl $1073741824,-180(%ebp) +movl $1073741824,-336(%ebp) +movl $0xffffffff,%edi +movl %edi,-20(%ebp) +movl $0xffffffff,%edi +movl %edi,-176(%ebp) +movl $0xffffffff,%edi +movl %edi,-332(%ebp) +movl $0xffffffff,%edi +movl %edi,-16(%ebp) +movl $0xffffffff,%edi +movl %edi,-172(%ebp) +movl $0xffffffff,%edi +movl %edi,-328(%ebp) +movl $0xffffffff,%edi +movl %edi,-12(%ebp) +movl $0xffffffff,%edi +movl %edi,-168(%ebp) +movl $0xffffffff,%edi +movl %edi,-324(%ebp) +movl $0xffffffff,%edi +movl %edi,-8(%ebp) +movl $0xffffffff,%edi +movl %edi,-164(%ebp) +movl $0xffffffff,%edi +movl %edi,-320(%ebp) +movl $0,-4(%ebp) +.LC190: +movl -4(%ebp),%edi +leal (,%edi,4),%edi +leal -160(%ebp),%esi +movl (%esi,%edi),%esi +cmpl %esi,g.47(%edi) +jne .LC197 +leal -316(%ebp),%ebx +movl (%ebx,%edi),%ebx +cmpl %ebx,%esi +jne .LC197 +leal -472(%ebp),%esi +cmpl (%esi,%edi),%ebx +je .LC194 +.LC197: +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC198 +pushl $.LC200 +call printf +addl $4,%esp +pushl $.LC201 +call printf +addl $4,%esp +.LC198: +.LC194: +.LC191: +incl -4(%ebp) +cmpl $39,-4(%ebp) +jl .LC190 +cmpl $0,-488(%ebp) +je .LC202 +movl $16,-484(%ebp) +.LC202: +movl -484(%ebp),%eax +.LC44: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf204: +.size s241,.Lf204-s241 +.globl pow2 +.align 16 +.type pow2,@function +pow2: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $1,-4(%ebp) +jmp .LC207 +.LC206: +sall $1,-4(%ebp) +.LC207: +movl 20(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,20(%ebp) +cmpl $0,%edi +jne .LC206 +movl -4(%ebp),%eax +.LC205: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf209: +.size pow2,.Lf209-pow2 +.data +.align 1 +.type s243er.211,@object +s243er.211: +.byte 115 +.byte 50 +.byte 52 +.byte 51 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s243er.211,11 +.align 1 +.type qs243.212,@object +.size qs243.212,8 +qs243.212: +.byte 115 +.byte 50 +.byte 52 +.byte 51 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s243 +.text +.align 16 +.type s243,@function +s243: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $268,%esp +movl $0,-268(%ebp) +leal qs243.212,%edi +movl %edi,-260(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-264(%ebp) +.LC213: +.LC214: +movl -264(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-264(%ebp) +movl -260(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-260(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC213 +leal -256(%ebp),%edi +pushl %edi +call zerofill +addl $4,%esp +movb $1,-159(%ebp) +movb $1,-191(%ebp) +movb $1,-130(%ebp) +movb $1,-208(%ebp) +movb $1,-158(%ebp) +movb $1,-190(%ebp) +movb $1,-223(%ebp) +movb $1,-207(%ebp) +movb $1,-157(%ebp) +movb $1,-189(%ebp) +movb $1,-222(%ebp) +movb $1,-206(%ebp) +movb $1,-156(%ebp) +movb $1,-188(%ebp) +movb $1,-221(%ebp) +movb $1,-205(%ebp) +movb $1,-155(%ebp) +movb $1,-187(%ebp) +movb $1,-219(%ebp) +movb $1,-204(%ebp) +movb $1,-154(%ebp) +movb $1,-186(%ebp) +movb $1,-218(%ebp) +movb $1,-203(%ebp) +movb $1,-153(%ebp) +movb $1,-185(%ebp) +movb $1,-216(%ebp) +movb $1,-202(%ebp) +movb $1,-152(%ebp) +movb $1,-184(%ebp) +movb $1,-215(%ebp) +movb $1,-201(%ebp) +movb $1,-151(%ebp) +movb $1,-183(%ebp) +movb $1,-161(%ebp) +movb $1,-200(%ebp) +movb $1,-150(%ebp) +movb $1,-182(%ebp) +movb $1,-195(%ebp) +movb $1,-199(%ebp) +movb $1,-149(%ebp) +movb $1,-181(%ebp) +movb $1,-211(%ebp) +movb $1,-148(%ebp) +movb $1,-180(%ebp) +movb $1,-162(%ebp) +movb $1,-147(%ebp) +movb $1,-179(%ebp) +movb $1,-132(%ebp) +movb $1,-246(%ebp) +movb $1,-146(%ebp) +movb $1,-178(%ebp) +movb $1,-247(%ebp) +movb $1,-145(%ebp) +movb $1,-177(%ebp) +movb $1,-133(%ebp) +movb $1,-248(%ebp) +movb $1,-144(%ebp) +movb $1,-176(%ebp) +movb $1,-131(%ebp) +movb $1,-243(%ebp) +movb $1,-143(%ebp) +movb $1,-175(%ebp) +movb $1,-165(%ebp) +movb $1,-244(%ebp) +movb $1,-142(%ebp) +movb $1,-174(%ebp) +movb $1,-163(%ebp) +movb $1,-141(%ebp) +movb $1,-173(%ebp) +movb $1,-213(%ebp) +movb $1,-164(%ebp) +movb $1,-140(%ebp) +movb $1,-172(%ebp) +movb $1,-197(%ebp) +movb $1,-217(%ebp) +movb $1,-139(%ebp) +movb $1,-171(%ebp) +movb $1,-214(%ebp) +movb $1,-138(%ebp) +movb $1,-170(%ebp) +movb $1,-198(%ebp) +movb $1,-256(%ebp) +movb $1,-137(%ebp) +movb $1,-169(%ebp) +movb $1,-196(%ebp) +movb $1,-224(%ebp) +movb $1,-136(%ebp) +movb $1,-168(%ebp) +movb $1,-194(%ebp) +movb $1,-135(%ebp) +movb $1,-167(%ebp) +movb $1,-212(%ebp) +movb $1,-134(%ebp) +movb $1,-166(%ebp) +movb $1,-210(%ebp) +movb $1,-193(%ebp) +movb $1,-209(%ebp) +leal -256(%ebp),%edi +pushl %edi +call sumof +addl $4,%esp +cmpl $98,%eax +je .LC313 +incl -268(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC315 +pushl $1 +pushl $s243er.211 +call printf +addl $8,%esp +.LC315: +.LC313: +jmp .LC317 +addl $8,-268(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC319 +pushl $8 +pushl $s243er.211 +call printf +addl $8,%esp +.LC319: +.LC317: +movl -268(%ebp),%eax +.LC210: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf321: +.size s243,.Lf321-s243 +.globl zerofill +.align 16 +.type zerofill,@function +zerofill: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $0,-4(%ebp) +.LC323: +movl 20(%ebp),%edi +leal 1(%edi),%esi +movl %esi,20(%ebp) +movb $0,(,%edi) +.LC324: +incl -4(%ebp) +cmpl $256,-4(%ebp) +jl .LC323 +movl $0,%eax +.LC322: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf327: +.size zerofill,.Lf327-zerofill +.globl sumof +.align 16 +.type sumof,@function +sumof: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $12,%esp +movl 20(%ebp),%edi +movl %edi,-12(%ebp) +movl $0,-4(%ebp) +movl $0,-8(%ebp) +.LC329: +movl -12(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-12(%ebp) +movsbl (,%edi),%edi +addl %edi,-4(%ebp) +.LC330: +incl -8(%ebp) +cmpl $256,-8(%ebp) +jl .LC329 +movl -4(%ebp),%eax +.LC328: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf333: +.size sumof,.Lf333-sumof +.data +.align 1 +.type s244er.335,@object +s244er.335: +.byte 115 +.byte 50 +.byte 52 +.byte 52 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s244er.335,11 +.align 1 +.type qs244.336,@object +.size qs244.336,8 +qs244.336: +.byte 115 +.byte 50 +.byte 52 +.byte 52 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s244 +.text +.align 16 +.type s244,@function +s244: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $92,%esp +leal qs244.336,%edi +movl %edi,-72(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-76(%ebp) +.LC337: +.LC338: +movl -76(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-76(%ebp) +movl -72(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-72(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC337 +movl $0,-84(%ebp) +movl $0,-80(%ebp) +fldl .LC340 +fstpl -68(%ebp) +fldl .LC340 +fstpl -60(%ebp) +fldl .LC340 +fstpl -52(%ebp) +fldl .LC340 +fstpl -44(%ebp) +fldl .LC340 +fstpl -36(%ebp) +fldl .LC340 +fstpl -28(%ebp) +fldl .LC340 +fstpl -20(%ebp) +fldl .LC340 +fstpl -12(%ebp) +movl $0,-80(%ebp) +movl $0,-4(%ebp) +.LC348: +movl -4(%ebp),%edi +leal (,%edi,8),%edi +leal -68(%ebp),%esi +leal -60(%ebp),%ebx +fldl (%ebx,%edi) +fcompl (%esi,%edi) +fstsw %ax +sahf +je .LC352 +movl $1,-80(%ebp) +.LC352: +.LC349: +incl -4(%ebp) +cmpl $7,-4(%ebp) +jl .LC348 +cmpl $0,-80(%ebp) +je .LC355 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC357 +pushl $1 +pushl $s244er.335 +call printf +addl $8,%esp +.LC357: +incl -84(%ebp) +.LC355: +jmp .LC359 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC361 +pushl $2 +pushl $s244er.335 +call printf +addl $8,%esp +.LC361: +addl $2,-84(%ebp) +.LC359: +movl -84(%ebp),%eax +.LC334: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf363: +.size s244,.Lf363-s244 +.data +.align 1 +.type s25er.365,@object +s25er.365: +.byte 115 +.byte 50 +.byte 53 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s25er.365,10 +.align 1 +.type qs25.366,@object +.size qs25.366,8 +qs25.366: +.byte 115 +.byte 50 +.byte 53 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s25 +.text +.align 16 +.type s25,@function +s25: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $28,%esp +leal qs25.366,%edi +movl %edi,-16(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-20(%ebp) +.LC367: +.LC368: +movl -20(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-20(%ebp) +movl -16(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-16(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC367 +movl $0,-24(%ebp) +leal .LC370,%edi +movl %edi,-8(%ebp) +movl -8(%ebp),%edi +movsbl 1(%edi),%esi +movsbl (,%edi),%ebx +cmpl %esi,%ebx +jne .LC374 +movsbl 2(%edi),%edi +cmpl %edi,%esi +jne .LC374 +cmpl $46,%edi +je .LC371 +.LC374: +incl -24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC375 +pushl $1 +pushl $s25er.365 +call printf +addl $8,%esp +.LC375: +.LC371: +movl -8(%ebp),%edi +movsbl 3(%edi),%edi +cmpl $0,%edi +je .LC377 +addl $4,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC379 +pushl $4 +pushl $s25er.365 +call printf +addl $8,%esp +.LC379: +.LC377: +movsbl .LC383+1,%edi +cmpl $34,%edi +je .LC381 +addl $8,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC385 +pushl $8 +pushl $s25er.365 +call printf +addl $8,%esp +.LC385: +.LC381: +leal .LC387,%edi +movl %edi,-8(%ebp) +movl -8(%ebp),%edi +movsbl (,%edi),%esi +cmpl $10,%esi +jne .LC395 +movsbl 1(%edi),%esi +cmpl $9,%esi +jne .LC395 +movsbl 2(%edi),%esi +cmpl $8,%esi +jne .LC395 +movsbl 3(%edi),%esi +cmpl $13,%esi +jne .LC395 +movsbl 4(%edi),%esi +cmpl $12,%esi +jne .LC395 +movsbl 5(%edi),%esi +cmpl $92,%esi +jne .LC395 +movsbl 6(%edi),%edi +cmpl $39,%edi +je .LC388 +.LC395: +addl $16,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC396 +pushl $16 +pushl $s25er.365 +call printf +addl $8,%esp +.LC396: +.LC388: +leal .LC398,%edi +movl %edi,-12(%ebp) +movl %edi,-8(%ebp) +movl $0,-28(%ebp) +movl $0,-4(%ebp) +jmp .LC402 +.LC399: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movsbl (%esi,%edi),%esi +movl -12(%ebp),%ebx +movsbl (%ebx,%edi),%edi +cmpl %edi,%esi +je .LC403 +movl $1,-28(%ebp) +.LC403: +.LC400: +incl -4(%ebp) +.LC402: +movl -4(%ebp),%edi +cmpl $7,%edi +jb .LC399 +cmpl $0,-28(%ebp) +je .LC405 +addl $32,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC407 +pushl $32 +pushl $s25er.365 +call printf +addl $8,%esp +.LC407: +.LC405: +movl -24(%ebp),%eax +.LC364: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf409: +.size s25,.Lf409-s25 +.data +.align 1 +.type qs26.411,@object +.size qs26.411,8 +qs26.411: +.byte 115 +.byte 50 +.byte 54 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.type s.412,@object +s.412: +.byte 37 +.byte 51 +.byte 100 +.byte 32 +.byte 98 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 37 +.byte 115 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.size s.412,18 +.align 1 +.type s2.413,@object +s2.413: +.byte 37 +.byte 101 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 108 +.byte 101 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 97 +.byte 100 +.byte 100 +.byte 101 +.byte 100 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 49 +.byte 46 +.byte 32 +.byte 40 +.byte 37 +.byte 115 +.byte 41 +.byte 46 +.byte 10 +.byte 0 +.size s2.413,54 +.globl s26 +.text +.align 16 +.type s26,@function +s26: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $56,%esp +leal qs26.411,%edi +movl %edi,-36(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-40(%ebp) +.LC414: +.LC415: +movl -40(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-40(%ebp) +movl -36(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-36(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC414 +movl 20(%ebp),%edi +movl $0,(,%edi) +movb $0,-41(%ebp) +movb $1,-5(%ebp) +jmp .LC418 +.LC417: +movsbl -5(%ebp),%edi +leal (,%edi,2),%edi +movl %edi,%ebx +movb %bl,-5(%ebp) +movl 20(%ebp),%edi +incl (,%edi) +.LC418: +movsbl -41(%ebp),%edi +movsbl -5(%ebp),%esi +cmpl %esi,%edi +jne .LC417 +movl 20(%ebp),%edi +movl (,%edi),%esi +leal (,%esi,4),%esi +movl %esi,4(%edi) +movl 20(%ebp),%edi +movl (,%edi),%esi +leal (,%esi,2),%esi +movl %esi,8(%edi) +movl 20(%ebp),%edi +movl (,%edi),%esi +leal (,%esi,4),%esi +movl %esi,12(%edi) +movl 20(%ebp),%edi +movl (,%edi),%esi +leal (,%esi,4),%esi +movl %esi,16(%edi) +movl 20(%ebp),%edi +movl (,%edi),%esi +leal (,%esi,4),%esi +movl %esi,20(%edi) +movl 20(%ebp),%edi +movl (,%edi),%esi +leal (,%esi,8),%esi +movl %esi,24(%edi) +flds .LC420 +fstps -16(%ebp) +flds .LC420 +fstps -4(%ebp) +flds .LC421 +fstps -12(%ebp) +jmp .LC423 +.LC422: +flds -16(%ebp) +fadds -4(%ebp) +fstps -12(%ebp) +flds -4(%ebp) +fdivl .LC425 +fstps -4(%ebp) +.LC423: +flds -16(%ebp) +fcomps -12(%ebp) +fstsw %ax +sahf +jne .LC422 +movl 20(%ebp),%edi +fldl .LC426 +fmuls -4(%ebp) +fstps 28(%edi) +fldl .LC427 +fstpl -32(%ebp) +flds .LC420 +fstps -4(%ebp) +fldl .LC428 +fstpl -24(%ebp) +jmp .LC430 +.LC429: +flds -4(%ebp) +fstpl -56(%ebp) +fldl -32(%ebp) +faddl -56(%ebp) +fstpl -24(%ebp) +fldl -56(%ebp) +fdivl .LC425 +fstps -4(%ebp) +.LC430: +fldl -32(%ebp) +fcompl -24(%ebp) +fstsw %ax +sahf +jne .LC429 +movl 20(%ebp),%edi +fldl .LC426 +fmuls -4(%ebp) +fstps 32(%edi) +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC432 +pushl $.LC434 +movl 20(%ebp),%edi +pushl (,%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC435 +movl 20(%ebp),%edi +pushl 4(%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC436 +movl 20(%ebp),%edi +pushl 8(%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC437 +movl 20(%ebp),%edi +pushl 12(%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC438 +movl 20(%ebp),%edi +pushl 16(%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC439 +movl 20(%ebp),%edi +pushl 20(%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC440 +movl 20(%ebp),%edi +pushl 24(%edi) +pushl $s.412 +call printf +addl $12,%esp +pushl $.LC439 +movl 20(%ebp),%edi +flds 28(%edi) +subl $8,%esp +fstpl (%esp) +pushl $s2.413 +call printf +addl $16,%esp +pushl $.LC440 +movl 20(%ebp),%edi +flds 32(%edi) +subl $8,%esp +fstpl (%esp) +pushl $s2.413 +call printf +addl $16,%esp +.LC432: +movl $0,%eax +.LC410: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf441: +.size s26,.Lf441-s26 +.data +.align 1 +.type s4er.443,@object +s4er.443: +.byte 115 +.byte 52 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s4er.443,9 +.align 1 +.type qs4.444,@object +.size qs4.444,8 +qs4.444: +.byte 115 +.byte 52 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s4 +.text +.align 16 +.type s4,@function +s4: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $36,%esp +movl $0,-24(%ebp) +leal qs4.444,%edi +movl %edi,-16(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-20(%ebp) +.LC445: +.LC446: +movl -20(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-20(%ebp) +movl -16(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-16(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC445 +movl $0,-4(%ebp) +.LC448: +pushl -4(%ebp) +call svtest +addl $4,%esp +movl %eax,%edi +call zero +cmpl %eax,%edi +je .LC452 +movl $1,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC454 +pushl $1 +pushl $s4er.443 +call printf +addl $8,%esp +.LC454: +.LC452: +.LC449: +incl -4(%ebp) +cmpl $3,-4(%ebp) +jl .LC448 +call setev +call testev +cmpl $0,%eax +je .LC456 +addl $2,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC458 +pushl $2 +pushl $s4er.443 +call printf +addl $8,%esp +.LC458: +.LC456: +jmp .LC460 +addl $4,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC462 +pushl $4 +pushl $s4er.443 +call printf +addl $8,%esp +.LC462: +.LC460: +movl $0xffffffff,-8(%ebp) +movl $1,-12(%ebp) +movl $0,-4(%ebp) +jmp .LC467 +.LC464: +movl -8(%ebp),%edi +andl %edi,-12(%ebp) +shrl $1,%edi +movl %edi,-8(%ebp) +.LC465: +incl -4(%ebp) +.LC467: +movl -4(%ebp),%edi +movl 20(%ebp),%esi +movl (,%esi),%esi +leal (,%esi,4),%esi +cmpl %esi,%edi +jb .LC464 +movl -12(%ebp),%edi +cmpl $1,%edi +jne .LC470 +movl -8(%ebp),%edi +cmpl $0,%edi +je .LC468 +.LC470: +addl $8,-24(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC471 +pushl $8 +pushl $s4er.443 +call printf +addl $8,%esp +.LC471: +.LC468: +movl -24(%ebp),%eax +.LC442: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf473: +.size s4,.Lf473-s4 +.bss +.align 4 +.type k.475,@object +.size k.475,4 +.lcomm k.475,4 +.globl svtest +.text +.align 16 +.type svtest,@function +svtest: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl 20(%ebp),%edi +cmpl $0,%edi +je .LC478 +cmpl $1,%edi +je .LC479 +cmpl $2,%edi +je .LC482 +jmp .LC476 +.LC478: +movl $1978,k.475 +movl $0,-4(%ebp) +jmp .LC477 +.LC479: +cmpl $1978,k.475 +je .LC480 +movl $1,-4(%ebp) +jmp .LC477 +.LC480: +movl $1929,k.475 +movl $0,-4(%ebp) +jmp .LC477 +.LC482: +cmpl $1929,k.475 +je .LC483 +movl $1,-4(%ebp) +jmp .LC477 +.LC483: +movl $0,-4(%ebp) +.LC476: +.LC477: +movl -4(%ebp),%eax +.LC474: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf485: +.size svtest,.Lf485-svtest +.bss +.align 4 +.type k.487,@object +.size k.487,4 +.lcomm k.487,4 +.globl zero +.text +.align 16 +.type zero,@function +zero: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $2,k.487 +movl $0,-4(%ebp) +movl -4(%ebp),%eax +.LC486: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf488: +.size zero,.Lf488-zero +.globl testev +.align 16 +.type testev,@function +testev: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +cmpl $1066,extvar +je .LC490 +movl $1,%eax +jmp .LC489 +.LC490: +movl $0,%eax +.LC489: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf492: +.size testev,.Lf492-testev +.data +.align 1 +.type s61er.494,@object +s61er.494: +.byte 115 +.byte 54 +.byte 49 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s61er.494,10 +.align 1 +.type qs61.495,@object +.size qs61.495,8 +qs61.495: +.byte 115 +.byte 54 +.byte 49 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.type upper_alpha.496,@object +upper_alpha.496: +.byte 65 +.byte 66 +.byte 67 +.byte 68 +.byte 69 +.byte 70 +.byte 71 +.byte 72 +.byte 73 +.byte 74 +.byte 75 +.byte 76 +.byte 77 +.byte 78 +.byte 79 +.byte 80 +.byte 81 +.byte 82 +.byte 83 +.byte 84 +.byte 85 +.byte 86 +.byte 87 +.byte 88 +.byte 89 +.byte 90 +.byte 0 +.size upper_alpha.496,27 +.align 1 +.type lower_alpha.497,@object +lower_alpha.497: +.byte 97 +.byte 98 +.byte 99 +.byte 100 +.byte 101 +.byte 102 +.byte 103 +.byte 104 +.byte 105 +.byte 106 +.byte 107 +.byte 108 +.byte 109 +.byte 110 +.byte 111 +.byte 112 +.byte 113 +.byte 114 +.byte 115 +.byte 116 +.byte 117 +.byte 118 +.byte 119 +.byte 120 +.byte 121 +.byte 122 +.byte 0 +.size lower_alpha.497,27 +.align 1 +.type numbers.498,@object +numbers.498: +.byte 48 +.byte 49 +.byte 50 +.byte 51 +.byte 52 +.byte 53 +.byte 54 +.byte 55 +.byte 56 +.byte 57 +.byte 0 +.size numbers.498,11 +.align 1 +.type special_characters.499,@object +special_characters.499: +.byte 126 +.byte 33 +.byte 34 +.byte 35 +.byte 37 +.byte 38 +.byte 40 +.byte 41 +.byte 95 +.byte 61 +.byte 45 +.byte 94 +.byte 124 +.byte 123 +.byte 125 +.byte 91 +.byte 93 +.byte 43 +.byte 59 +.byte 42 +.byte 58 +.byte 60 +.byte 62 +.byte 44 +.byte 46 +.byte 63 +.byte 47 +.byte 0 +.size special_characters.499,28 +.align 1 +.type extra_special_characters.500,@object +extra_special_characters.500: +.byte 10 +.byte 9 +.byte 8 +.byte 13 +.byte 12 +.byte 92 +.byte 39 +.byte 0 +.size extra_special_characters.500,8 +.align 1 +.type blank_and_NUL.501,@object +blank_and_NUL.501: +.byte 32 +.byte 0 +.byte 0 +.size blank_and_NUL.501,3 +.globl s61 +.text +.align 16 +.type s61,@function +s61: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $60,%esp +leal qs61.495,%edi +movl %edi,-36(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-40(%ebp) +movl $0,-48(%ebp) +.LC502: +.LC503: +movl -40(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-40(%ebp) +movl -36(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-36(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC502 +movw $-19,-54(%ebp) +movswl -54(%ebp),%edi +movl %edi,-60(%ebp) +cmpl $-19,-60(%ebp) +je .LC505 +incl -48(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC507 +pushl $1 +pushl $s61er.494 +call printf +addl $8,%esp +.LC507: +.LC505: +leal upper_alpha.496,%edi +movl %edi,-28(%ebp) +leal lower_alpha.497,%edi +movl %edi,-24(%ebp) +leal numbers.498,%edi +movl %edi,-20(%ebp) +leal special_characters.499,%edi +movl %edi,-16(%ebp) +leal extra_special_characters.500,%edi +movl %edi,-12(%ebp) +leal blank_and_NUL.501,%edi +movl %edi,-8(%ebp) +movl $0,-32(%ebp) +movl $0,-4(%ebp) +jmp .LC519 +.LC518: +movl -4(%ebp),%edi +leal -28(%ebp),%esi +leal (%esi,%edi,4),%edi +movl (,%edi),%esi +leal 1(%esi),%ebx +movl %ebx,(,%edi) +movsbl (,%esi),%edi +cmpl $0,%edi +jge .LC521 +movl $1,-32(%ebp) +.LC521: +.LC519: +movl -4(%ebp),%edi +leal -28(%ebp),%esi +movl (%esi,%edi,4),%edi +movsbl (,%edi),%edi +cmpl $0,%edi +jne .LC518 +.LC515: +incl -4(%ebp) +cmpl $6,-4(%ebp) +jl .LC519 +cmpl $0,-32(%ebp) +je .LC523 +addl $2,-48(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC525 +pushl $2 +pushl $s61er.494 +call printf +addl $8,%esp +.LC525: +.LC523: +movl $1048579,-44(%ebp) +movl -44(%ebp),%edi +movl %edi,%esi +movw %si,-50(%ebp) +movl %edi,%ebx +movb %bl,-51(%ebp) +movswl -50(%ebp),%edi +cmpl -44(%ebp),%edi +je .LC530 +cmpl $3,%edi +jne .LC529 +.LC530: +movsbl -51(%ebp),%edi +cmpl -44(%ebp),%edi +je .LC527 +cmpl $3,%edi +je .LC527 +.LC529: +addl $8,-48(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC531 +pushl $8 +pushl $s61er.494 +call printf +addl $8,%esp +.LC531: +.LC527: +movl -48(%ebp),%eax +.LC493: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf533: +.size s61,.Lf533-s61 +.data +.align 1 +.type s626er.535,@object +s626er.535: +.byte 115 +.byte 54 +.byte 50 +.byte 54 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s626er.535,11 +.align 1 +.type qs626.536,@object +.size qs626.536,8 +qs626.536: +.byte 115 +.byte 54 +.byte 50 +.byte 54 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s626 +.text +.align 16 +.type s626,@function +s626: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $128,%esp +leal qs626.536,%edi +movl %edi,-56(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-60(%ebp) +movl $0,-104(%ebp) +.LC537: +.LC538: +movl -60(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-60(%ebp) +movl -56(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-56(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC537 +flds .LC420 +fstps -36(%ebp) +movl $1,-64(%ebp) +movl $1,-40(%ebp) +movl $0,-4(%ebp) +jmp .LC543 +.LC540: +flds .LC544 +fmuls -36(%ebp) +fstps -36(%ebp) +movl -40(%ebp),%edi +leal (,%edi,2),%edi +orl -64(%ebp),%edi +movl %edi,-40(%ebp) +.LC541: +incl -4(%ebp) +.LC543: +movl 20(%ebp),%edi +movl 12(%edi),%edi +subl $2,%edi +cmpl %edi,-4(%ebp) +jl .LC540 +fildl -40(%ebp) +fstps -112(%ebp) +flds -36(%ebp) +fsubs -112(%ebp) +fdivs -36(%ebp) +fstps -36(%ebp) +fldl .LC425 +movl 20(%ebp),%edi +fmuls 28(%edi) +fcomps -36(%ebp) +fstsw %ax +sahf +jae .LC545 +addl $2,-104(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC547 +pushl $2 +pushl $s626er.535 +call printf +addl $8,%esp +.LC547: +.LC545: +movb $125,-73(%ebp) +movw $125,-76(%ebp) +movl $125,-80(%ebp) +movl $15625,-96(%ebp) +movl $125,-84(%ebp) +movl $15625,-100(%ebp) +movl $125,-68(%ebp) +movl $15625,-108(%ebp) +flds .LC549 +fstps -72(%ebp) +fldl .LC550 +fstpl -92(%ebp) +fldl .LC551 +fstpl -52(%ebp) +movl $0,-4(%ebp) +.LC552: +movl -4(%ebp),%edi +leal -32(%ebp),%esi +movb $0,(%esi,%edi) +.LC553: +incl -4(%ebp) +cmpl $28,-4(%ebp) +jl .LC552 +movsbl -73(%ebp),%edi +movl %edi,%esi +imull %edi,%esi +cmpl -96(%ebp),%esi +je .LC556 +movb $1,-32(%ebp) +.LC556: +movswl -76(%ebp),%edi +movsbl -73(%ebp),%esi +imull %esi,%edi +cmpl -96(%ebp),%edi +je .LC558 +movb $1,-31(%ebp) +.LC558: +movswl -76(%ebp),%edi +movl %edi,%esi +imull %edi,%esi +cmpl -96(%ebp),%esi +je .LC561 +movb $1,-30(%ebp) +.LC561: +movl -80(%ebp),%edi +movsbl -73(%ebp),%esi +imull %esi,%edi +cmpl -96(%ebp),%edi +je .LC564 +movb $1,-29(%ebp) +.LC564: +movl -80(%ebp),%edi +movswl -76(%ebp),%esi +imull %esi,%edi +cmpl -96(%ebp),%edi +je .LC567 +movb $1,-28(%ebp) +.LC567: +movl -80(%ebp),%edi +movl %edi,%esi +imull %edi,%esi +cmpl -96(%ebp),%esi +je .LC570 +movb $1,-27(%ebp) +.LC570: +movl -84(%ebp),%eax +movsbl -73(%ebp),%edi +mull %edi +cmpl -100(%ebp),%eax +je .LC573 +movb $1,-26(%ebp) +.LC573: +movl -84(%ebp),%eax +movswl -76(%ebp),%edi +mull %edi +cmpl -100(%ebp),%eax +je .LC576 +movb $1,-25(%ebp) +.LC576: +movl -84(%ebp),%eax +movl -80(%ebp),%edi +mull %edi +cmpl -100(%ebp),%eax +je .LC579 +movb $1,-24(%ebp) +.LC579: +movl -84(%ebp),%edi +movl %edi,%eax +mull %edi +cmpl -100(%ebp),%eax +je .LC582 +movb $1,-23(%ebp) +.LC582: +movl -68(%ebp),%edi +movsbl -73(%ebp),%esi +imull %esi,%edi +cmpl -108(%ebp),%edi +je .LC585 +movb $1,-22(%ebp) +.LC585: +movl -68(%ebp),%edi +movswl -76(%ebp),%esi +imull %esi,%edi +cmpl -108(%ebp),%edi +je .LC588 +movb $1,-21(%ebp) +.LC588: +movl -68(%ebp),%edi +imull -80(%ebp),%edi +cmpl -108(%ebp),%edi +je .LC591 +movb $1,-20(%ebp) +.LC591: +movl -68(%ebp),%edi +movl %edi,%eax +mull -84(%ebp) +cmpl -100(%ebp),%eax +je .LC594 +movb $1,-19(%ebp) +.LC594: +movl -68(%ebp),%edi +movl %edi,%esi +imull %edi,%esi +cmpl -108(%ebp),%esi +je .LC597 +movb $1,-18(%ebp) +.LC597: +flds -72(%ebp) +movsbl -73(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC600 +movb $1,-17(%ebp) +.LC600: +flds -72(%ebp) +movswl -76(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC603 +movb $1,-16(%ebp) +.LC603: +flds -72(%ebp) +fildl -80(%ebp) +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC606 +movb $1,-15(%ebp) +.LC606: +movl -84(%ebp),%edi +flds -72(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC609 +movb $1,-14(%ebp) +.LC609: +flds -72(%ebp) +fildl -68(%ebp) +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC613 +movb $1,-13(%ebp) +.LC613: +flds -72(%ebp) +fmuls -72(%ebp) +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC616 +movb $1,-12(%ebp) +.LC616: +fldl -92(%ebp) +movsbl -73(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC619 +movb $1,-11(%ebp) +.LC619: +fldl -92(%ebp) +movswl -76(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC622 +movb $1,-10(%ebp) +.LC622: +fldl -92(%ebp) +fimull -80(%ebp) +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC625 +movb $1,-9(%ebp) +.LC625: +movl -84(%ebp),%edi +fldl -92(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fmulp %st(1),%st +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC628 +movb $1,-8(%ebp) +.LC628: +fldl -92(%ebp) +fimull -68(%ebp) +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC631 +movb $1,-7(%ebp) +.LC631: +fldl -92(%ebp) +fmuls -72(%ebp) +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC634 +movb $1,-6(%ebp) +.LC634: +fldl -92(%ebp) +fmull -92(%ebp) +fldl -52(%ebp) +fcompp +fstsw %ax +sahf +je .LC637 +movb $1,-5(%ebp) +.LC637: +movb $0,-41(%ebp) +movl $0,-4(%ebp) +.LC640: +movsbl -41(%ebp),%edi +movl -4(%ebp),%esi +leal -32(%ebp),%ebx +movsbl (%ebx,%esi),%esi +leal (%esi,%edi),%edi +movl %edi,%ebx +movb %bl,-41(%ebp) +.LC641: +incl -4(%ebp) +cmpl $28,-4(%ebp) +jl .LC640 +movsbl -41(%ebp),%edi +cmpl $0,%edi +je .LC644 +addl $4,-104(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC646 +pushl $4 +pushl $s626er.535 +call printf +addl $8,%esp +pushl $.LC648 +call printf +addl $4,%esp +movl $0,-4(%ebp) +.LC649: +movl -4(%ebp),%edi +leal -32(%ebp),%esi +movsbl (%esi,%edi),%edi +pushl %edi +pushl $.LC653 +call printf +addl $8,%esp +.LC650: +incl -4(%ebp) +cmpl $28,-4(%ebp) +jl .LC649 +pushl $.LC654 +call printf +addl $4,%esp +.LC646: +.LC644: +movl $32768,-68(%ebp) +movl -68(%ebp),%edi +cmpl $0x8000,%edi +jbe .LC655 +addl $8,-104(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC657 +pushl $8 +pushl $s626er.535 +call printf +addl $8,%esp +.LC657: +.LC655: +movl -104(%ebp),%eax +.LC534: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf659: +.size s626,.Lf659-s626 +.data +.align 1 +.type s71er.661,@object +s71er.661: +.byte 115 +.byte 55 +.byte 49 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s71er.661,10 +.align 1 +.type qs71.662,@object +.size qs71.662,8 +qs71.662: +.byte 115 +.byte 55 +.byte 49 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.type q.663,@object +.size q.663,1 +q.663: +.byte 113 +.globl s71 +.text +.align 16 +.type s71,@function +s71: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $68,%esp +leal qs71.662,%edi +movl %edi,-4(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-8(%ebp) +movl $0,-12(%ebp) +.LC664: +.LC665: +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movl -4(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-4(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC664 +movsbl .LC669,%edi +movsbl q.663,%esi +cmpl %esi,%edi +je .LC667 +incl -12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC670 +pushl $1 +pushl $s71er.661 +call printf +addl $8,%esp +.LC670: +.LC667: +jmp .LC672 +addl $2,-12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC674 +pushl $2 +pushl $s71er.661 +call printf +addl $8,%esp +.LC674: +.LC672: +movl $1942,-32(%ebp) +cmpl $1942,-32(%ebp) +jne .LC682 +movl -32(%ebp),%edi +cmpl %edi,-32(%ebp) +je .LC677 +.LC682: +addl $4,-12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC683 +pushl $4 +pushl $s71er.661 +call printf +addl $8,%esp +.LC683: +.LC677: +pushl $-5 +call McCarthy +addl $4,%esp +cmpl $91,%eax +je .LC685 +addl $8,-12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC687 +pushl $8 +pushl $s71er.661 +call printf +addl $8,%esp +.LC687: +.LC685: +movl $2,-56(%ebp) +movl $3,-60(%ebp) +leal -60(%ebp),%edi +movl %edi,-64(%ebp) +pushl -64(%ebp) +pushl -56(%ebp) +call clobber +addl $8,%esp +cmpl $2,-56(%ebp) +jne .LC691 +cmpl $2,-60(%ebp) +je .LC689 +.LC691: +addl $16,-12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC692 +pushl $16 +pushl $s71er.661 +call printf +addl $8,%esp +.LC692: +.LC689: +movl 20(%ebp),%edi +flds 32(%edi) +fstps -68(%ebp) +flds -68(%ebp) +fcomps -68(%ebp) +fstsw %ax +sahf +je .LC694 +addl $32,-12(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC696 +pushl $32 +pushl $s71er.661 +call printf +addl $8,%esp +.LC696: +.LC694: +movl -12(%ebp),%eax +.LC660: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf698: +.size s71,.Lf698-s71 +.globl McCarthy +.align 16 +.type McCarthy,@function +McCarthy: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +cmpl $100,20(%ebp) +jle .LC700 +movl 20(%ebp),%edi +movl %edi,%eax +subl $10,%eax +jmp .LC699 +.LC700: +movl 20(%ebp),%edi +leal 11(%edi),%edi +pushl %edi +call McCarthy +addl $4,%esp +movl %eax,%edi +pushl %edi +call McCarthy +addl $4,%esp +movl %eax,%edi +.LC699: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf702: +.size McCarthy,.Lf702-McCarthy +.globl clobber +.align 16 +.type clobber,@function +clobber: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl $3,20(%ebp) +movl 24(%ebp),%edi +movl $2,(,%edi) +movl $0,%eax +.LC703: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf704: +.size clobber,.Lf704-clobber +.data +.align 1 +.type f.706,@object +f.706: +.byte 76 +.byte 111 +.byte 99 +.byte 97 +.byte 108 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 37 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.size f.706,17 +.align 1 +.type s714er.707,@object +s714er.707: +.byte 115 +.byte 55 +.byte 49 +.byte 52 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s714er.707,11 +.align 1 +.type qs714.708,@object +.size qs714.708,8 +qs714.708: +.byte 115 +.byte 55 +.byte 49 +.byte 52 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s714 +.text +.align 16 +.type s714,@function +s714: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $248,%esp +leal qs714.708,%edi +movl %edi,-68(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%esi +movl %esi,-72(%ebp) +movl $0,-76(%ebp) +movl $0,-8(%ebp) +movl 48(%edi),%edi +movl %edi,-4(%ebp) +.LC709: +.LC710: +movl -72(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-72(%ebp) +movl -68(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-68(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC709 +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movb -25(%ebp),%bl +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC712 +movl $1,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC714 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC714: +.LC712: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC716 +movl $2,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC718 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC718: +.LC716: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC720 +movl $3,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC722 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC722: +.LC720: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC724 +movl $4,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC726 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC726: +.LC724: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC728 +movl $5,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC730 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC730: +.LC728: +movb $5,-9(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC732 +movl $6,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC734 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC734: +.LC732: +movb $5,-9(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC736 +movl $7,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC738 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC738: +.LC736: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC740 +movl $8,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC742 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC742: +.LC740: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movw -28(%ebp),%di +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC744 +movl $9,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC746 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC746: +.LC744: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC748 +movl $10,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC750 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC750: +.LC748: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC752 +movl $11,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC754 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC754: +.LC752: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC756 +movl $12,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC758 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC758: +.LC756: +movw $5,-12(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC760 +movl $13,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC762 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC762: +.LC760: +movw $5,-12(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC764 +movl $14,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC766 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC766: +.LC764: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC768 +movl $15,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC770 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC770: +.LC768: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC772 +movl $16,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC774 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC774: +.LC772: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC776 +movl $17,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC778 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC778: +.LC776: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC780 +movl $18,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC782 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC782: +.LC780: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC784 +movl $19,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC786 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC786: +.LC784: +movl $5,-16(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -56(%ebp) +fistpl -16(%ebp) +cmpl $2,-16(%ebp) +je .LC788 +movl $20,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC790 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC790: +.LC788: +movl $5,-16(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fistpl -16(%ebp) +cmpl $2,-16(%ebp) +je .LC792 +movl $21,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC794 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC794: +.LC792: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC796 +movl $22,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC798 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC798: +.LC796: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC800 +movl $23,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC802 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC802: +.LC800: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC804 +movl $24,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC806 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC806: +.LC804: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC808 +movl $25,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC810 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC810: +.LC808: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC812 +movl $26,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC814 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC814: +.LC812: +movl $5,-20(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -56(%ebp) +fistpl -20(%ebp) +cmpl $2,-20(%ebp) +je .LC816 +movl $27,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC818 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC818: +.LC816: +movl $5,-20(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fistpl -20(%ebp) +cmpl $2,-20(%ebp) +je .LC820 +movl $28,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC822 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC822: +.LC820: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC824 +movl $29,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC826 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC826: +.LC824: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC828 +movl $30,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC830 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC830: +.LC828: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC832 +movl $31,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC834 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC834: +.LC832: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC836 +movl $32,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC838 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC838: +.LC836: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC840 +movl $33,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC842 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC842: +.LC840: +movl $5,-24(%ebp) +flds .LC544 +fstps -56(%ebp) +flds .LC847 +fcomps -56(%ebp) +fstsw %ax +sahf +ja .LC845 +flds -56(%ebp) +fsubs .LC847 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-80(%ebp) +jmp .LC846 +.LC845: +flds -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-80(%ebp) +.LC846: +movl -80(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC848 +movl $34,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC850 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC850: +.LC848: +movl $5,-24(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl .LC855 +fcompl -64(%ebp) +fstsw %ax +sahf +ja .LC853 +fldl -64(%ebp) +fsubl .LC855 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-92(%ebp) +jmp .LC854 +.LC853: +fldl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-92(%ebp) +.LC854: +movl -92(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC856 +movl $35,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC858 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC858: +.LC856: +flds .LC860 +fstps -44(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC861 +movl $36,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC863 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC863: +.LC861: +flds .LC860 +fstps -44(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC865 +movl $37,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC867 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC867: +.LC865: +flds .LC860 +fstps -44(%ebp) +movl $2,-32(%ebp) +fildl -32(%ebp) +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC869 +movl $38,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC871 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC871: +.LC869: +flds .LC860 +fstps -44(%ebp) +movl $2,-36(%ebp) +fildl -36(%ebp) +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC873 +movl $39,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC875 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC875: +.LC873: +flds .LC860 +fstps -44(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC877 +movl $40,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC879 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC879: +.LC877: +flds .LC860 +fstps -44(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -56(%ebp) +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC881 +movl $41,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC883 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC883: +.LC881: +flds .LC860 +fstps -44(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fstps -44(%ebp) +flds .LC544 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC885 +movl $42,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC887 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC887: +.LC885: +fldl .LC889 +fstpl -52(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC890 +movl $43,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC892 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC892: +.LC890: +fldl .LC889 +fstpl -52(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC894 +movl $44,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC896 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC896: +.LC894: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-32(%ebp) +fildl -32(%ebp) +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC898 +movl $45,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC900 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC900: +.LC898: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-36(%ebp) +fildl -36(%ebp) +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC902 +movl $46,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC904 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC904: +.LC902: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC906 +movl $47,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC908 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC908: +.LC906: +fldl .LC889 +fstpl -52(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -56(%ebp) +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC910 +movl $48,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC912 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC912: +.LC910: +fldl .LC889 +fstpl -52(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fstpl -52(%ebp) +fldl .LC425 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC914 +movl $49,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC916 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC916: +.LC914: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC918 +movl $50,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC920 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC920: +.LC918: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC922 +movl $51,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC924 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC924: +.LC922: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%edi +movl -32(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC926 +movl $52,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC928 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC928: +.LC926: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%edi +movl -36(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC930 +movl $53,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC932 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC932: +.LC930: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +movl -40(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC934 +movl $54,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC936 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC936: +.LC934: +movb $5,-9(%ebp) +flds .LC544 +fstps -56(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fadds -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC938 +movl $55,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC940 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC940: +.LC938: +movb $5,-9(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $7,%edi +je .LC942 +movl $56,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC944 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC944: +.LC942: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%esi +leal (%esi,%edi),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC946 +movl $57,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC948 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC948: +.LC946: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%esi +leal (%esi,%edi),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC950 +movl $58,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC952 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC952: +.LC950: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%edi +movl -32(%ebp),%esi +leal (%esi,%edi),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC954 +movl $59,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC956 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC956: +.LC954: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%edi +movl -36(%ebp),%esi +leal (%esi,%edi),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC958 +movl $60,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC960 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC960: +.LC958: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +movl -40(%ebp),%esi +leal (%esi,%edi),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC962 +movl $61,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC964 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC964: +.LC962: +movw $5,-12(%ebp) +flds .LC544 +fstps -56(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fadds -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC966 +movl $62,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC968 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC968: +.LC966: +movw $5,-12(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $7,%edi +je .LC970 +movl $63,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC972 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC972: +.LC970: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +addl %edi,-16(%ebp) +cmpl $7,-16(%ebp) +je .LC974 +movl $64,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC976 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC976: +.LC974: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +addl %edi,-16(%ebp) +cmpl $7,-16(%ebp) +je .LC978 +movl $65,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC980 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC980: +.LC978: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +addl %edi,-16(%ebp) +cmpl $7,-16(%ebp) +je .LC982 +movl $66,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC984 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC984: +.LC982: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +addl %edi,-16(%ebp) +cmpl $7,-16(%ebp) +je .LC986 +movl $67,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC988 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC988: +.LC986: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -16(%ebp),%edi +movl -40(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,-16(%ebp) +cmpl $7,-16(%ebp) +je .LC990 +movl $68,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC992 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC992: +.LC990: +movl $5,-16(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -16(%ebp) +fadds -56(%ebp) +fistpl -16(%ebp) +cmpl $7,-16(%ebp) +je .LC994 +movl $69,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC996 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC996: +.LC994: +movl $5,-16(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fildl -16(%ebp) +faddl -64(%ebp) +fistpl -16(%ebp) +cmpl $7,-16(%ebp) +je .LC998 +movl $70,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1000 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1000: +.LC998: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +addl %edi,-20(%ebp) +cmpl $7,-20(%ebp) +je .LC1002 +movl $71,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1004 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1004: +.LC1002: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +addl %edi,-20(%ebp) +cmpl $7,-20(%ebp) +je .LC1006 +movl $72,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1008 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1008: +.LC1006: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +addl %edi,-20(%ebp) +cmpl $7,-20(%ebp) +je .LC1010 +movl $73,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1012 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1012: +.LC1010: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +addl %edi,-20(%ebp) +cmpl $7,-20(%ebp) +je .LC1014 +movl $74,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1016 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1016: +.LC1014: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -20(%ebp),%edi +movl -40(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,-20(%ebp) +cmpl $7,-20(%ebp) +je .LC1018 +movl $75,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1020 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1020: +.LC1018: +movl $5,-20(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -20(%ebp) +fadds -56(%ebp) +fistpl -20(%ebp) +cmpl $7,-20(%ebp) +je .LC1022 +movl $76,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1024 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1024: +.LC1022: +movl $5,-20(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fildl -20(%ebp) +faddl -64(%ebp) +fistpl -20(%ebp) +cmpl $7,-20(%ebp) +je .LC1026 +movl $77,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1028 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1028: +.LC1026: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +add %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1030 +movl $78,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1032 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1032: +.LC1030: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +add %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1034 +movl $79,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1036 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1036: +.LC1034: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +add %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1038 +movl $80,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1040 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1040: +.LC1038: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +add %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1042 +movl $81,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1044 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1044: +.LC1042: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +add %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1046 +movl $82,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1048 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1048: +.LC1046: +movl $5,-24(%ebp) +flds .LC544 +fstps -56(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fadds -56(%ebp) +fstps -128(%ebp) +flds .LC847 +fcomps -128(%ebp) +fstsw %ax +sahf +ja .LC1051 +flds -128(%ebp) +fsubs .LC847 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-124(%ebp) +jmp .LC1052 +.LC1051: +flds -128(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-124(%ebp) +.LC1052: +movl -124(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1053 +movl $83,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1055 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1055: +.LC1053: +movl $5,-24(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +faddl -64(%ebp) +fstpl -144(%ebp) +fldl .LC855 +fcompl -144(%ebp) +fstsw %ax +sahf +ja .LC1058 +fldl -144(%ebp) +fsubl .LC855 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-136(%ebp) +jmp .LC1059 +.LC1058: +fldl -144(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-136(%ebp) +.LC1059: +movl -136(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $7,%edi +je .LC1060 +movl $84,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1062 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1062: +.LC1060: +flds .LC860 +fstps -44(%ebp) +movb $2,-25(%ebp) +flds -44(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1064 +movl $85,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1067 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1067: +.LC1064: +flds .LC860 +fstps -44(%ebp) +movw $2,-28(%ebp) +flds -44(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1069 +movl $86,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1071 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1071: +.LC1069: +flds .LC860 +fstps -44(%ebp) +movl $2,-32(%ebp) +flds -44(%ebp) +fildl -32(%ebp) +faddp %st(1),%st +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1073 +movl $87,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1075 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1075: +.LC1073: +flds .LC860 +fstps -44(%ebp) +movl $2,-36(%ebp) +flds -44(%ebp) +fildl -36(%ebp) +faddp %st(1),%st +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1077 +movl $88,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1079 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1079: +.LC1077: +flds .LC860 +fstps -44(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +flds -44(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +faddp %st(1),%st +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1081 +movl $89,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1083 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1083: +.LC1081: +flds .LC860 +fstps -44(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -44(%ebp) +fadds -56(%ebp) +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1085 +movl $90,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1087 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1087: +.LC1085: +flds .LC860 +fstps -44(%ebp) +fldl .LC425 +fstpl -64(%ebp) +flds -44(%ebp) +faddl -64(%ebp) +fstps -44(%ebp) +flds .LC1066 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1089 +movl $91,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1091 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1091: +.LC1089: +fldl .LC889 +fstpl -52(%ebp) +movb $2,-25(%ebp) +fldl -52(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1093 +movl $92,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1096 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1096: +.LC1093: +fldl .LC889 +fstpl -52(%ebp) +movw $2,-28(%ebp) +fldl -52(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1098 +movl $93,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1100 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1100: +.LC1098: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-32(%ebp) +fldl -52(%ebp) +fiaddl -32(%ebp) +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1102 +movl $94,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1104 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1104: +.LC1102: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-36(%ebp) +fldl -52(%ebp) +fiaddl -36(%ebp) +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1106 +movl $95,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1108 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1108: +.LC1106: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +fldl -52(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +faddp %st(1),%st +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1110 +movl $96,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1112 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1112: +.LC1110: +fldl .LC889 +fstpl -52(%ebp) +flds .LC544 +fstps -56(%ebp) +fldl -52(%ebp) +fadds -56(%ebp) +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1114 +movl $97,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1116 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1116: +.LC1114: +fldl .LC889 +fstpl -52(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -52(%ebp) +faddl -64(%ebp) +fstpl -52(%ebp) +fldl .LC1095 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1118 +movl $98,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1120 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1120: +.LC1118: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%esi +subl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1122 +movl $99,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1124 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1124: +.LC1122: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%esi +subl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1126 +movl $100,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1128 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1128: +.LC1126: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%edi +subl -32(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1130 +movl $101,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1132 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1132: +.LC1130: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%edi +subl -36(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1134 +movl $102,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1136 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1136: +.LC1134: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +subl -40(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1138 +movl $103,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1140 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1140: +.LC1138: +movb $5,-9(%ebp) +flds .LC544 +fstps -56(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubs -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1142 +movl $104,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1144 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1144: +.LC1142: +movb $5,-9(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $3,%edi +je .LC1146 +movl $105,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1148 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1148: +.LC1146: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%esi +subl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1150 +movl $106,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1152 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1152: +.LC1150: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%esi +subl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1154 +movl $107,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1156 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1156: +.LC1154: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%edi +subl -32(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1158 +movl $108,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1160 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1160: +.LC1158: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%edi +subl -36(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1162 +movl $109,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1164 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1164: +.LC1162: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +subl -40(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1166 +movl $110,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1168 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1168: +.LC1166: +movw $5,-12(%ebp) +flds .LC544 +fstps -56(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubs -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1170 +movl $111,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1172 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1172: +.LC1170: +movw $5,-12(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $3,%edi +je .LC1174 +movl $112,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1176 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1176: +.LC1174: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +sub %edi,-16(%ebp) +cmpl $3,-16(%ebp) +je .LC1178 +movl $113,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1180 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1180: +.LC1178: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +sub %edi,-16(%ebp) +cmpl $3,-16(%ebp) +je .LC1182 +movl $114,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1184 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1184: +.LC1182: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +sub %edi,-16(%ebp) +cmpl $3,-16(%ebp) +je .LC1186 +movl $115,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1188 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1188: +.LC1186: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +sub %edi,-16(%ebp) +cmpl $3,-16(%ebp) +je .LC1190 +movl $116,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1192 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1192: +.LC1190: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -16(%ebp),%edi +subl -40(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $3,-16(%ebp) +je .LC1194 +movl $117,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1196 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1196: +.LC1194: +movl $5,-16(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -16(%ebp) +fsubs -56(%ebp) +fistpl -16(%ebp) +cmpl $3,-16(%ebp) +je .LC1198 +movl $118,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1200 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1200: +.LC1198: +movl $5,-16(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fisubrl -16(%ebp) +fistpl -16(%ebp) +cmpl $3,-16(%ebp) +je .LC1202 +movl $119,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1204 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1204: +.LC1202: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +sub %edi,-20(%ebp) +cmpl $3,-20(%ebp) +je .LC1206 +movl $120,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1208 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1208: +.LC1206: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +sub %edi,-20(%ebp) +cmpl $3,-20(%ebp) +je .LC1210 +movl $121,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1212 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1212: +.LC1210: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +sub %edi,-20(%ebp) +cmpl $3,-20(%ebp) +je .LC1214 +movl $122,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1216 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1216: +.LC1214: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +sub %edi,-20(%ebp) +cmpl $3,-20(%ebp) +je .LC1218 +movl $123,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1220 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1220: +.LC1218: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -20(%ebp),%edi +subl -40(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $3,-20(%ebp) +je .LC1222 +movl $124,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1224 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1224: +.LC1222: +movl $5,-20(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -20(%ebp) +fsubs -56(%ebp) +fistpl -20(%ebp) +cmpl $3,-20(%ebp) +je .LC1226 +movl $125,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1228 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1228: +.LC1226: +movl $5,-20(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fisubrl -20(%ebp) +fistpl -20(%ebp) +cmpl $3,-20(%ebp) +je .LC1230 +movl $126,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1232 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1232: +.LC1230: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%edi +sub %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1234 +movl $127,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1236 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1236: +.LC1234: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%edi +sub %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1238 +movl $128,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1240 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1240: +.LC1238: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%edi +sub %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1242 +movl $129,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1244 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1244: +.LC1242: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%edi +sub %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1246 +movl $130,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1248 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1248: +.LC1246: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +sub %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1250 +movl $131,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1252 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1252: +.LC1250: +movl $5,-24(%ebp) +flds .LC544 +fstps -56(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fsubs -56(%ebp) +fstps -160(%ebp) +flds .LC847 +fcomps -160(%ebp) +fstsw %ax +sahf +ja .LC1255 +flds -160(%ebp) +fsubs .LC847 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-156(%ebp) +jmp .LC1256 +.LC1255: +flds -160(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-156(%ebp) +.LC1256: +movl -156(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1257 +movl $132,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1259 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1259: +.LC1257: +movl $5,-24(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fsubl -64(%ebp) +fstpl -176(%ebp) +fldl .LC855 +fcompl -176(%ebp) +fstsw %ax +sahf +ja .LC1262 +fldl -176(%ebp) +fsubl .LC855 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-168(%ebp) +jmp .LC1263 +.LC1262: +fldl -176(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-168(%ebp) +.LC1263: +movl -168(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $3,%edi +je .LC1264 +movl $133,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1266 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1266: +.LC1264: +flds .LC860 +fstps -44(%ebp) +movb $2,-25(%ebp) +flds -44(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubp %st(1),%st +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1268 +movl $134,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1271 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1271: +.LC1268: +flds .LC860 +fstps -44(%ebp) +movw $2,-28(%ebp) +flds -44(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubp %st(1),%st +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1273 +movl $135,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1275 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1275: +.LC1273: +flds .LC860 +fstps -44(%ebp) +movl $2,-32(%ebp) +flds -44(%ebp) +fildl -32(%ebp) +fsubp %st(1),%st +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1277 +movl $136,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1279 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1279: +.LC1277: +flds .LC860 +fstps -44(%ebp) +movl $2,-36(%ebp) +flds -44(%ebp) +fildl -36(%ebp) +fsubp %st(1),%st +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1281 +movl $137,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1283 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1283: +.LC1281: +flds .LC860 +fstps -44(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +flds -44(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fsubp %st(1),%st +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1285 +movl $138,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1287 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1287: +.LC1285: +flds .LC860 +fstps -44(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -44(%ebp) +fsubs -56(%ebp) +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1289 +movl $139,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1291 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1291: +.LC1289: +flds .LC860 +fstps -44(%ebp) +fldl .LC425 +fstpl -64(%ebp) +flds -44(%ebp) +fsubl -64(%ebp) +fstps -44(%ebp) +flds .LC1270 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1293 +movl $140,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1295 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1295: +.LC1293: +fldl .LC889 +fstpl -52(%ebp) +movb $2,-25(%ebp) +fldl -52(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubp %st(1),%st +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1297 +movl $141,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1300 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1300: +.LC1297: +fldl .LC889 +fstpl -52(%ebp) +movw $2,-28(%ebp) +fldl -52(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fsubp %st(1),%st +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1302 +movl $142,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1304 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1304: +.LC1302: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-32(%ebp) +fldl -52(%ebp) +fisubl -32(%ebp) +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1306 +movl $143,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1308 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1308: +.LC1306: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-36(%ebp) +fldl -52(%ebp) +fisubl -36(%ebp) +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1310 +movl $144,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1312 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1312: +.LC1310: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +fldl -52(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fsubp %st(1),%st +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1314 +movl $145,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1316 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1316: +.LC1314: +fldl .LC889 +fstpl -52(%ebp) +flds .LC544 +fstps -56(%ebp) +fldl -52(%ebp) +fsubs -56(%ebp) +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1318 +movl $146,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1320 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1320: +.LC1318: +fldl .LC889 +fstpl -52(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -52(%ebp) +fsubl -64(%ebp) +fstpl -52(%ebp) +fldl .LC1299 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1322 +movl $147,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1324 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1324: +.LC1322: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%esi +imull %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1326 +movl $148,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1328 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1328: +.LC1326: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%esi +imull %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1330 +movl $149,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1332 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1332: +.LC1330: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%edi +imull -32(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1334 +movl $150,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1336 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1336: +.LC1334: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%edi +imull -36(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1338 +movl $151,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1340 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1340: +.LC1338: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +movl %edi,%eax +mull -40(%ebp) +movl %eax,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1342 +movl $152,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1344 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1344: +.LC1342: +movb $5,-9(%ebp) +flds .LC544 +fstps -56(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmuls -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1346 +movl $153,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1348 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1348: +.LC1346: +movb $5,-9(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmull -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $10,%edi +je .LC1350 +movl $154,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1352 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1352: +.LC1350: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%esi +imull %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1354 +movl $155,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1356 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1356: +.LC1354: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%esi +imull %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1358 +movl $156,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1360 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1360: +.LC1358: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%edi +imull -32(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1362 +movl $157,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1364 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1364: +.LC1362: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%edi +imull -36(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1366 +movl $158,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1368 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1368: +.LC1366: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +movl %edi,%eax +mull -40(%ebp) +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1370 +movl $159,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1372 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1372: +.LC1370: +movw $5,-12(%ebp) +flds .LC544 +fstps -56(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmuls -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1374 +movl $160,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1376 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1376: +.LC1374: +movw $5,-12(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmull -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $10,%edi +je .LC1378 +movl $161,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1380 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1380: +.LC1378: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movl -16(%ebp),%edi +movsbl -25(%ebp),%esi +imull %esi,%edi +movl %edi,-16(%ebp) +cmpl $10,-16(%ebp) +je .LC1382 +movl $162,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1384 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1384: +.LC1382: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movl -16(%ebp),%edi +movswl -28(%ebp),%esi +imull %esi,%edi +movl %edi,-16(%ebp) +cmpl $10,-16(%ebp) +je .LC1386 +movl $163,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1388 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1388: +.LC1386: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -16(%ebp),%edi +imull -32(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $10,-16(%ebp) +je .LC1390 +movl $164,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1392 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1392: +.LC1390: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -16(%ebp),%edi +imull -36(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $10,-16(%ebp) +je .LC1394 +movl $165,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1396 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1396: +.LC1394: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -16(%ebp),%edi +movl %edi,%eax +mull -40(%ebp) +movl %eax,%edi +movl %edi,-16(%ebp) +cmpl $10,-16(%ebp) +je .LC1398 +movl $166,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1400 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1400: +.LC1398: +movl $5,-16(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -16(%ebp) +fmuls -56(%ebp) +fistpl -16(%ebp) +cmpl $10,-16(%ebp) +je .LC1402 +movl $167,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1404 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1404: +.LC1402: +movl $5,-16(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fildl -16(%ebp) +fmull -64(%ebp) +fistpl -16(%ebp) +cmpl $10,-16(%ebp) +je .LC1406 +movl $168,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1408 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1408: +.LC1406: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movl -20(%ebp),%edi +movsbl -25(%ebp),%esi +imull %esi,%edi +movl %edi,-20(%ebp) +cmpl $10,-20(%ebp) +je .LC1410 +movl $169,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1412 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1412: +.LC1410: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movl -20(%ebp),%edi +movswl -28(%ebp),%esi +imull %esi,%edi +movl %edi,-20(%ebp) +cmpl $10,-20(%ebp) +je .LC1414 +movl $170,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1416 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1416: +.LC1414: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -20(%ebp),%edi +imull -32(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $10,-20(%ebp) +je .LC1418 +movl $171,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1420 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1420: +.LC1418: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -20(%ebp),%edi +imull -36(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $10,-20(%ebp) +je .LC1422 +movl $172,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1424 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1424: +.LC1422: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -20(%ebp),%edi +movl %edi,%eax +mull -40(%ebp) +movl %eax,%edi +movl %edi,-20(%ebp) +cmpl $10,-20(%ebp) +je .LC1426 +movl $173,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1428 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1428: +.LC1426: +movl $5,-20(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -20(%ebp) +fmuls -56(%ebp) +fistpl -20(%ebp) +cmpl $10,-20(%ebp) +je .LC1430 +movl $174,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1432 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1432: +.LC1430: +movl $5,-20(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fildl -20(%ebp) +fmull -64(%ebp) +fistpl -20(%ebp) +cmpl $10,-20(%ebp) +je .LC1434 +movl $175,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1436 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1436: +.LC1434: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movl -24(%ebp),%eax +movsbl -25(%ebp),%edi +mull %edi +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1438 +movl $176,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1440 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1440: +.LC1438: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movl -24(%ebp),%eax +movswl -28(%ebp),%edi +mull %edi +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1442 +movl $177,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1444 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1444: +.LC1442: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -24(%ebp),%eax +movl -32(%ebp),%edi +mull %edi +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1446 +movl $178,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1448 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1448: +.LC1446: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -24(%ebp),%eax +movl -36(%ebp),%edi +mull %edi +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1450 +movl $179,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1452 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1452: +.LC1450: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -24(%ebp),%eax +mull -40(%ebp) +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1454 +movl $180,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1456 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1456: +.LC1454: +movl $5,-24(%ebp) +flds .LC544 +fstps -56(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fmuls -56(%ebp) +fstps -192(%ebp) +flds .LC847 +fcomps -192(%ebp) +fstsw %ax +sahf +ja .LC1459 +flds -192(%ebp) +fsubs .LC847 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-188(%ebp) +jmp .LC1460 +.LC1459: +flds -192(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-188(%ebp) +.LC1460: +movl -188(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1461 +movl $181,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1463 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1463: +.LC1461: +movl $5,-24(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fmull -64(%ebp) +fstpl -208(%ebp) +fldl .LC855 +fcompl -208(%ebp) +fstsw %ax +sahf +ja .LC1466 +fldl -208(%ebp) +fsubl .LC855 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-200(%ebp) +jmp .LC1467 +.LC1466: +fldl -208(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-200(%ebp) +.LC1467: +movl -200(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $10,%edi +je .LC1468 +movl $182,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1470 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1470: +.LC1468: +flds .LC860 +fstps -44(%ebp) +movb $2,-25(%ebp) +flds -44(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1472 +movl $183,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1475 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1475: +.LC1472: +flds .LC860 +fstps -44(%ebp) +movw $2,-28(%ebp) +flds -44(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1477 +movl $184,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1479 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1479: +.LC1477: +flds .LC860 +fstps -44(%ebp) +movl $2,-32(%ebp) +flds -44(%ebp) +fildl -32(%ebp) +fmulp %st(1),%st +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1481 +movl $185,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1483 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1483: +.LC1481: +flds .LC860 +fstps -44(%ebp) +movl $2,-36(%ebp) +flds -44(%ebp) +fildl -36(%ebp) +fmulp %st(1),%st +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1485 +movl $186,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1487 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1487: +.LC1485: +flds .LC860 +fstps -44(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +flds -44(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fmulp %st(1),%st +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1489 +movl $187,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1491 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1491: +.LC1489: +flds .LC860 +fstps -44(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -44(%ebp) +fmuls -56(%ebp) +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1493 +movl $188,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1495 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1495: +.LC1493: +flds .LC860 +fstps -44(%ebp) +fldl .LC425 +fstpl -64(%ebp) +flds -44(%ebp) +fmull -64(%ebp) +fstps -44(%ebp) +flds .LC1474 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1497 +movl $189,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1499 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1499: +.LC1497: +fldl .LC889 +fstpl -52(%ebp) +movb $2,-25(%ebp) +fldl -52(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1501 +movl $190,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1504 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1504: +.LC1501: +fldl .LC889 +fstpl -52(%ebp) +movw $2,-28(%ebp) +fldl -52(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1506 +movl $191,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1508 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1508: +.LC1506: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-32(%ebp) +fldl -52(%ebp) +fimull -32(%ebp) +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1510 +movl $192,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1512 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1512: +.LC1510: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-36(%ebp) +fldl -52(%ebp) +fimull -36(%ebp) +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1514 +movl $193,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1516 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1516: +.LC1514: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +fldl -52(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fmulp %st(1),%st +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1518 +movl $194,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1520 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1520: +.LC1518: +fldl .LC889 +fstpl -52(%ebp) +flds .LC544 +fstps -56(%ebp) +fldl -52(%ebp) +fmuls -56(%ebp) +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1522 +movl $195,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1524 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1524: +.LC1522: +fldl .LC889 +fstpl -52(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -52(%ebp) +fmull -64(%ebp) +fstpl -52(%ebp) +fldl .LC1503 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1526 +movl $196,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1528 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1528: +.LC1526: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1530 +movl $197,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1532 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1532: +.LC1530: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1534 +movl $198,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1536 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1536: +.LC1534: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1538 +movl $199,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1540 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1540: +.LC1538: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1542 +movl $200,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1544 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1544: +.LC1542: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %eax,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1546 +movl $201,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1548 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1548: +.LC1546: +movb $5,-9(%ebp) +flds .LC544 +fstps -56(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivs -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1550 +movl $202,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1552 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1552: +.LC1550: +movb $5,-9(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movsbl -9(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $2,%edi +je .LC1554 +movl $203,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1556 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1556: +.LC1554: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1558 +movl $204,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1560 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1560: +.LC1558: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1562 +movl $205,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1564 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1564: +.LC1562: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1566 +movl $206,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1568 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1568: +.LC1566: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1570 +movl $207,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1572 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1572: +.LC1570: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1574 +movl $208,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1576 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1576: +.LC1574: +movw $5,-12(%ebp) +flds .LC544 +fstps -56(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivs -56(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1578 +movl $209,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1580 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1580: +.LC1578: +movw $5,-12(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movswl -12(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivl -64(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $2,%edi +je .LC1582 +movl $210,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1584 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1584: +.LC1582: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movl -16(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC1586 +movl $211,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1588 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1588: +.LC1586: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movl -16(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC1590 +movl $212,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1592 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1592: +.LC1590: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -16(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC1594 +movl $213,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1596 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1596: +.LC1594: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -16(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC1598 +movl $214,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1600 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1600: +.LC1598: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -16(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %eax,%edi +movl %edi,-16(%ebp) +cmpl $2,-16(%ebp) +je .LC1602 +movl $215,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1604 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1604: +.LC1602: +movl $5,-16(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -16(%ebp) +fdivs -56(%ebp) +fistpl -16(%ebp) +cmpl $2,-16(%ebp) +je .LC1606 +movl $216,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1608 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1608: +.LC1606: +movl $5,-16(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fidivrl -16(%ebp) +fistpl -16(%ebp) +cmpl $2,-16(%ebp) +je .LC1610 +movl $217,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1612 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1612: +.LC1610: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movl -20(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC1614 +movl $218,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1616 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1616: +.LC1614: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movl -20(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC1618 +movl $219,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1620 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1620: +.LC1618: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -20(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC1622 +movl $220,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1624 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1624: +.LC1622: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -20(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %eax,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC1626 +movl $221,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1628 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1628: +.LC1626: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -20(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %eax,%edi +movl %edi,-20(%ebp) +cmpl $2,-20(%ebp) +je .LC1630 +movl $222,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1632 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1632: +.LC1630: +movl $5,-20(%ebp) +flds .LC544 +fstps -56(%ebp) +fildl -20(%ebp) +fdivs -56(%ebp) +fistpl -20(%ebp) +cmpl $2,-20(%ebp) +je .LC1634 +movl $223,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1636 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1636: +.LC1634: +movl $5,-20(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -64(%ebp) +fidivrl -20(%ebp) +fistpl -20(%ebp) +cmpl $2,-20(%ebp) +je .LC1638 +movl $224,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1640 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1640: +.LC1638: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movl -24(%ebp),%eax +movsbl -25(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1642 +movl $225,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1644 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1644: +.LC1642: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movl -24(%ebp),%eax +movswl -28(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1646 +movl $226,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1648 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1648: +.LC1646: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -24(%ebp),%eax +movl -32(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1650 +movl $227,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1652 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1652: +.LC1650: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -24(%ebp),%eax +movl -36(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1654 +movl $228,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1656 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1656: +.LC1654: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -24(%ebp),%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1658 +movl $229,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1660 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1660: +.LC1658: +movl $5,-24(%ebp) +flds .LC544 +fstps -56(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fdivs -56(%ebp) +fstps -224(%ebp) +flds .LC847 +fcomps -224(%ebp) +fstsw %ax +sahf +ja .LC1663 +flds -224(%ebp) +fsubs .LC847 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-220(%ebp) +jmp .LC1664 +.LC1663: +flds -224(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-220(%ebp) +.LC1664: +movl -220(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1665 +movl $230,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1667 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1667: +.LC1665: +movl $5,-24(%ebp) +fldl .LC425 +fstpl -64(%ebp) +movl -24(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fdivl -64(%ebp) +fstpl -240(%ebp) +fldl .LC855 +fcompl -240(%ebp) +fstsw %ax +sahf +ja .LC1670 +fldl -240(%ebp) +fsubl .LC855 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-232(%ebp) +jmp .LC1671 +.LC1670: +fldl -240(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-232(%ebp) +.LC1671: +movl -232(%ebp),%edi +movl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $2,%edi +je .LC1672 +movl $231,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1674 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1674: +.LC1672: +flds .LC860 +fstps -44(%ebp) +movb $2,-25(%ebp) +flds -44(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivp %st(1),%st +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1676 +movl $232,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1679 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1679: +.LC1676: +flds .LC860 +fstps -44(%ebp) +movw $2,-28(%ebp) +flds -44(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivp %st(1),%st +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1681 +movl $233,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1683 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1683: +.LC1681: +flds .LC860 +fstps -44(%ebp) +movl $2,-32(%ebp) +flds -44(%ebp) +fildl -32(%ebp) +fdivp %st(1),%st +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1685 +movl $234,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1687 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1687: +.LC1685: +flds .LC860 +fstps -44(%ebp) +movl $2,-36(%ebp) +flds -44(%ebp) +fildl -36(%ebp) +fdivp %st(1),%st +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1689 +movl $235,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1691 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1691: +.LC1689: +flds .LC860 +fstps -44(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +flds -44(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fdivp %st(1),%st +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1693 +movl $236,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1695 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1695: +.LC1693: +flds .LC860 +fstps -44(%ebp) +flds .LC544 +fstps -56(%ebp) +flds -44(%ebp) +fdivs -56(%ebp) +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1697 +movl $237,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1699 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1699: +.LC1697: +flds .LC860 +fstps -44(%ebp) +fldl .LC425 +fstpl -64(%ebp) +flds -44(%ebp) +fdivl -64(%ebp) +fstps -44(%ebp) +fldl .LC1678 +fcomps -44(%ebp) +fstsw %ax +sahf +je .LC1701 +movl $238,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1703 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1703: +.LC1701: +fldl .LC889 +fstpl -52(%ebp) +movb $2,-25(%ebp) +fldl -52(%ebp) +movsbl -25(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivp %st(1),%st +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1705 +movl $239,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1707 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1707: +.LC1705: +fldl .LC889 +fstpl -52(%ebp) +movw $2,-28(%ebp) +fldl -52(%ebp) +movswl -28(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivp %st(1),%st +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1709 +movl $240,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1711 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1711: +.LC1709: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-32(%ebp) +fldl -52(%ebp) +fidivl -32(%ebp) +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1713 +movl $241,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1715 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1715: +.LC1713: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-36(%ebp) +fldl -52(%ebp) +fidivl -36(%ebp) +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1717 +movl $242,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1719 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1719: +.LC1717: +fldl .LC889 +fstpl -52(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +fldl -52(%ebp) +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fdivp %st(1),%st +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1721 +movl $243,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1723 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1723: +.LC1721: +fldl .LC889 +fstpl -52(%ebp) +flds .LC544 +fstps -56(%ebp) +fldl -52(%ebp) +fdivs -56(%ebp) +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1725 +movl $244,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1727 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1727: +.LC1725: +fldl .LC889 +fstpl -52(%ebp) +fldl .LC425 +fstpl -64(%ebp) +fldl -52(%ebp) +fdivl -64(%ebp) +fstpl -52(%ebp) +fldl .LC1678 +fcompl -52(%ebp) +fstsw %ax +sahf +je .LC1729 +movl $245,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1731 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1731: +.LC1729: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1733 +movl $246,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1735 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1735: +.LC1733: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1737 +movl $247,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1739 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1739: +.LC1737: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1741 +movl $248,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1743 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1743: +.LC1741: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1745 +movl $249,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1747 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1747: +.LC1745: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %edx,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1749 +movl $250,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1751 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1751: +.LC1749: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1753 +movl $251,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1755 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1755: +.LC1753: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1757 +movl $252,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1759 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1759: +.LC1757: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1761 +movl $253,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1763 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1763: +.LC1761: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %edx,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1765 +movl $254,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1767 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1767: +.LC1765: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %edx,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1769 +movl $255,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1771 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1771: +.LC1769: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movl -16(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1773 +movl $256,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1775 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1775: +.LC1773: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movl -16(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1777 +movl $257,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1779 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1779: +.LC1777: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -16(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1781 +movl $258,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1783 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1783: +.LC1781: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -16(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1785 +movl $259,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1787 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1787: +.LC1785: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -16(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %edx,%edi +movl %edi,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1789 +movl $260,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1791 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1791: +.LC1789: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movl -20(%ebp),%eax +movsbl -25(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1793 +movl $261,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1795 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1795: +.LC1793: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movl -20(%ebp),%eax +movswl -28(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1797 +movl $262,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1799 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1799: +.LC1797: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -20(%ebp),%eax +movl -32(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1801 +movl $263,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1803 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1803: +.LC1801: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -20(%ebp),%eax +movl -36(%ebp),%ecx +cdq +idivl %ecx +movl %edx,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1805 +movl $264,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1807 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1807: +.LC1805: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -20(%ebp),%edi +movl %edi,%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %edx,%edi +movl %edi,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1809 +movl $265,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1811 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1811: +.LC1809: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movl -24(%ebp),%eax +movsbl -25(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %edx,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1813 +movl $266,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1815 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1815: +.LC1813: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movl -24(%ebp),%eax +movswl -28(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %edx,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1817 +movl $267,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1819 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1819: +.LC1817: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -24(%ebp),%eax +movl -32(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %edx,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1821 +movl $268,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1823 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1823: +.LC1821: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -24(%ebp),%eax +movl -36(%ebp),%edi +movl %edi,%ecx +xorl %edx,%edx +divl %ecx +movl %edx,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1825 +movl $269,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1827 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1827: +.LC1825: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -24(%ebp),%eax +movl -40(%ebp),%ecx +xorl %edx,%edx +divl %ecx +movl %edx,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1829 +movl $270,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1831 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1831: +.LC1829: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1833 +movl $271,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1835 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1835: +.LC1833: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1837 +movl $272,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1839 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1839: +.LC1837: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%edi +movl -32(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1841 +movl $273,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1843 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1843: +.LC1841: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%edi +movl -36(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1845 +movl $274,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1847 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1847: +.LC1845: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +movl -40(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $1,%edi +je .LC1849 +movl $275,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1851 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1851: +.LC1849: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1853 +movl $276,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1855 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1855: +.LC1853: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1857 +movl $277,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1859 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1859: +.LC1857: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%edi +movl -32(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1861 +movl $278,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1863 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1863: +.LC1861: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%edi +movl -36(%ebp),%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1865 +movl $279,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1867 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1867: +.LC1865: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +movl -40(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +sarl %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $1,%edi +je .LC1869 +movl $280,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1871 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1871: +.LC1869: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%ecx +sarl %cl,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1873 +movl $281,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1875 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1875: +.LC1873: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%ecx +sarl %cl,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1877 +movl $282,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1879 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1879: +.LC1877: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%ecx +sarl %cl,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1881 +movl $283,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1883 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1883: +.LC1881: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%ecx +sarl %cl,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1885 +movl $284,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1887 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1887: +.LC1885: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,%ecx +sarl %cl,-16(%ebp) +cmpl $1,-16(%ebp) +je .LC1889 +movl $285,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1891 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1891: +.LC1889: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%ecx +sarl %cl,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1893 +movl $286,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1895 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1895: +.LC1893: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%ecx +sarl %cl,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1897 +movl $287,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1899 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1899: +.LC1897: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%ecx +sarl %cl,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1901 +movl $288,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1903 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1903: +.LC1901: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%ecx +sarl %cl,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1905 +movl $289,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1907 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1907: +.LC1905: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,%ecx +sarl %cl,-20(%ebp) +cmpl $1,-20(%ebp) +je .LC1909 +movl $290,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1911 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1911: +.LC1909: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movl -24(%ebp),%edi +movsbl -25(%ebp),%ecx +movl %edi,%eax +shrl %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1913 +movl $291,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1915 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1915: +.LC1913: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movl -24(%ebp),%edi +movswl -28(%ebp),%ecx +movl %edi,%eax +shrl %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1917 +movl $292,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1919 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1919: +.LC1917: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -24(%ebp),%edi +movl -32(%ebp),%ecx +movl %edi,%eax +shrl %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1921 +movl $293,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1923 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1923: +.LC1921: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -24(%ebp),%edi +movl -36(%ebp),%ecx +movl %edi,%eax +shrl %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1925 +movl $294,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1927 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1927: +.LC1925: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -24(%ebp),%edi +movl -40(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +shrl %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $1,%edi +je .LC1929 +movl $295,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1931 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1931: +.LC1929: +movb $5,-9(%ebp) +movb $2,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $20,%edi +je .LC1933 +movl $296,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1935 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1935: +.LC1933: +movb $5,-9(%ebp) +movw $2,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $20,%edi +je .LC1937 +movl $297,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1939 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1939: +.LC1937: +movb $5,-9(%ebp) +movl $2,-32(%ebp) +movsbl -9(%ebp),%edi +movl -32(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $20,%edi +je .LC1941 +movl $298,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1943 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1943: +.LC1941: +movb $5,-9(%ebp) +movl $2,-36(%ebp) +movsbl -9(%ebp),%edi +movl -36(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $20,%edi +je .LC1945 +movl $299,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1947 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1947: +.LC1945: +movb $5,-9(%ebp) +movl $2,-40(%ebp) +movsbl -9(%ebp),%edi +movl -40(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $20,%edi +je .LC1949 +movl $300,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1951 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1951: +.LC1949: +movw $5,-12(%ebp) +movb $2,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $20,%edi +je .LC1953 +movl $301,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1955 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1955: +.LC1953: +movw $5,-12(%ebp) +movw $2,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $20,%edi +je .LC1957 +movl $302,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1959 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1959: +.LC1957: +movw $5,-12(%ebp) +movl $2,-32(%ebp) +movswl -12(%ebp),%edi +movl -32(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $20,%edi +je .LC1961 +movl $303,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1963 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1963: +.LC1961: +movw $5,-12(%ebp) +movl $2,-36(%ebp) +movswl -12(%ebp),%edi +movl -36(%ebp),%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $20,%edi +je .LC1965 +movl $304,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1967 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1967: +.LC1965: +movw $5,-12(%ebp) +movl $2,-40(%ebp) +movswl -12(%ebp),%edi +movl -40(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +sall %cl,%eax +movl %eax,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $20,%edi +je .LC1969 +movl $305,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1971 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1971: +.LC1969: +movl $5,-16(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%ecx +sall %cl,-16(%ebp) +cmpl $20,-16(%ebp) +je .LC1973 +movl $306,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1975 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1975: +.LC1973: +movl $5,-16(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%ecx +sall %cl,-16(%ebp) +cmpl $20,-16(%ebp) +je .LC1977 +movl $307,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1979 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1979: +.LC1977: +movl $5,-16(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%ecx +sall %cl,-16(%ebp) +cmpl $20,-16(%ebp) +je .LC1981 +movl $308,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1983 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1983: +.LC1981: +movl $5,-16(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%ecx +sall %cl,-16(%ebp) +cmpl $20,-16(%ebp) +je .LC1985 +movl $309,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1987 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1987: +.LC1985: +movl $5,-16(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,%ecx +sall %cl,-16(%ebp) +cmpl $20,-16(%ebp) +je .LC1989 +movl $310,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1991 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1991: +.LC1989: +movl $5,-20(%ebp) +movb $2,-25(%ebp) +movsbl -25(%ebp),%ecx +sall %cl,-20(%ebp) +cmpl $20,-20(%ebp) +je .LC1993 +movl $311,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1995 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1995: +.LC1993: +movl $5,-20(%ebp) +movw $2,-28(%ebp) +movswl -28(%ebp),%ecx +sall %cl,-20(%ebp) +cmpl $20,-20(%ebp) +je .LC1997 +movl $312,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC1999 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC1999: +.LC1997: +movl $5,-20(%ebp) +movl $2,-32(%ebp) +movl -32(%ebp),%ecx +sall %cl,-20(%ebp) +cmpl $20,-20(%ebp) +je .LC2001 +movl $313,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2003 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2003: +.LC2001: +movl $5,-20(%ebp) +movl $2,-36(%ebp) +movl -36(%ebp),%ecx +sall %cl,-20(%ebp) +cmpl $20,-20(%ebp) +je .LC2005 +movl $314,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2007 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2007: +.LC2005: +movl $5,-20(%ebp) +movl $2,-40(%ebp) +movl -40(%ebp),%edi +movl %edi,%ecx +sall %cl,-20(%ebp) +cmpl $20,-20(%ebp) +je .LC2009 +movl $315,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2011 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2011: +.LC2009: +movl $5,-24(%ebp) +movb $2,-25(%ebp) +movl -24(%ebp),%edi +movsbl -25(%ebp),%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $20,%edi +je .LC2013 +movl $316,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2015 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2015: +.LC2013: +movl $5,-24(%ebp) +movw $2,-28(%ebp) +movl -24(%ebp),%edi +movswl -28(%ebp),%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $20,%edi +je .LC2017 +movl $317,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2019 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2019: +.LC2017: +movl $5,-24(%ebp) +movl $2,-32(%ebp) +movl -24(%ebp),%edi +movl -32(%ebp),%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $20,%edi +je .LC2021 +movl $318,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2023 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2023: +.LC2021: +movl $5,-24(%ebp) +movl $2,-36(%ebp) +movl -24(%ebp),%edi +movl -36(%ebp),%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $20,%edi +je .LC2025 +movl $319,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2027 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2027: +.LC2025: +movl $5,-24(%ebp) +movl $2,-40(%ebp) +movl -24(%ebp),%edi +movl -40(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-24(%ebp) +movl -24(%ebp),%edi +cmpl $20,%edi +je .LC2029 +movl $320,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2031 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2031: +.LC2029: +movb $12,-9(%ebp) +movb $10,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%esi +andl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $8,%edi +je .LC2033 +movl $321,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2035 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2035: +.LC2033: +movb $12,-9(%ebp) +movw $10,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%esi +andl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $8,%edi +je .LC2037 +movl $322,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2039 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2039: +.LC2037: +movb $12,-9(%ebp) +movl $10,-32(%ebp) +movsbl -9(%ebp),%edi +andl -32(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $8,%edi +je .LC2041 +movl $323,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2043 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2043: +.LC2041: +movb $12,-9(%ebp) +movl $10,-36(%ebp) +movsbl -9(%ebp),%edi +andl -36(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $8,%edi +je .LC2045 +movl $324,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2047 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2047: +.LC2045: +movb $12,-9(%ebp) +movl $10,-40(%ebp) +movsbl -9(%ebp),%edi +andl -40(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $8,%edi +je .LC2049 +movl $325,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2051 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2051: +.LC2049: +movw $12,-12(%ebp) +movb $10,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%esi +andl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $8,%edi +je .LC2053 +movl $326,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2055 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2055: +.LC2053: +movw $12,-12(%ebp) +movw $10,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%esi +andl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $8,%edi +je .LC2057 +movl $327,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2059 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2059: +.LC2057: +movw $12,-12(%ebp) +movl $10,-32(%ebp) +movswl -12(%ebp),%edi +andl -32(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $8,%edi +je .LC2061 +movl $328,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2063 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2063: +.LC2061: +movw $12,-12(%ebp) +movl $10,-36(%ebp) +movswl -12(%ebp),%edi +andl -36(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $8,%edi +je .LC2065 +movl $329,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2067 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2067: +.LC2065: +movw $12,-12(%ebp) +movl $10,-40(%ebp) +movswl -12(%ebp),%edi +andl -40(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $8,%edi +je .LC2069 +movl $330,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2071 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2071: +.LC2069: +movl $12,-16(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +andl %edi,-16(%ebp) +cmpl $8,-16(%ebp) +je .LC2073 +movl $331,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2075 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2075: +.LC2073: +movl $12,-16(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +andl %edi,-16(%ebp) +cmpl $8,-16(%ebp) +je .LC2077 +movl $332,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2079 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2079: +.LC2077: +movl $12,-16(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +andl %edi,-16(%ebp) +cmpl $8,-16(%ebp) +je .LC2081 +movl $333,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2083 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2083: +.LC2081: +movl $12,-16(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +andl %edi,-16(%ebp) +cmpl $8,-16(%ebp) +je .LC2085 +movl $334,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2087 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2087: +.LC2085: +movl $12,-16(%ebp) +movl $10,-40(%ebp) +movl -16(%ebp),%edi +andl -40(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $8,-16(%ebp) +je .LC2089 +movl $335,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2091 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2091: +.LC2089: +movl $12,-20(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +andl %edi,-20(%ebp) +cmpl $8,-20(%ebp) +je .LC2093 +movl $336,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2095 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2095: +.LC2093: +movl $12,-20(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +andl %edi,-20(%ebp) +cmpl $8,-20(%ebp) +je .LC2097 +movl $337,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2099 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2099: +.LC2097: +movl $12,-20(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +andl %edi,-20(%ebp) +cmpl $8,-20(%ebp) +je .LC2101 +movl $338,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2103 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2103: +.LC2101: +movl $12,-20(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +andl %edi,-20(%ebp) +cmpl $8,-20(%ebp) +je .LC2105 +movl $339,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2107 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2107: +.LC2105: +movl $12,-20(%ebp) +movl $10,-40(%ebp) +movl -20(%ebp),%edi +andl -40(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $8,-20(%ebp) +je .LC2109 +movl $340,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2111 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2111: +.LC2109: +movl $12,-24(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +andl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $8,%edi +je .LC2113 +movl $341,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2115 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2115: +.LC2113: +movl $12,-24(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +andl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $8,%edi +je .LC2117 +movl $342,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2119 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2119: +.LC2117: +movl $12,-24(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +andl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $8,%edi +je .LC2121 +movl $343,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2123 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2123: +.LC2121: +movl $12,-24(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +andl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $8,%edi +je .LC2125 +movl $344,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2127 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2127: +.LC2125: +movl $12,-24(%ebp) +movl $10,-40(%ebp) +movl -40(%ebp),%edi +andl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $8,%edi +je .LC2129 +movl $345,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2131 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2131: +.LC2129: +movb $12,-9(%ebp) +movb $10,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%esi +xorl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $6,%edi +je .LC2133 +movl $346,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2135 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2135: +.LC2133: +movb $12,-9(%ebp) +movw $10,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%esi +xorl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $6,%edi +je .LC2137 +movl $347,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2139 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2139: +.LC2137: +movb $12,-9(%ebp) +movl $10,-32(%ebp) +movsbl -9(%ebp),%edi +xorl -32(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $6,%edi +je .LC2141 +movl $348,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2143 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2143: +.LC2141: +movb $12,-9(%ebp) +movl $10,-36(%ebp) +movsbl -9(%ebp),%edi +xorl -36(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $6,%edi +je .LC2145 +movl $349,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2147 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2147: +.LC2145: +movb $12,-9(%ebp) +movl $10,-40(%ebp) +movsbl -9(%ebp),%edi +xorl -40(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $6,%edi +je .LC2149 +movl $350,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2151 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2151: +.LC2149: +movw $12,-12(%ebp) +movb $10,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%esi +xorl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $6,%edi +je .LC2153 +movl $351,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2155 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2155: +.LC2153: +movw $12,-12(%ebp) +movw $10,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%esi +xorl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $6,%edi +je .LC2157 +movl $352,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2159 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2159: +.LC2157: +movw $12,-12(%ebp) +movl $10,-32(%ebp) +movswl -12(%ebp),%edi +xorl -32(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $6,%edi +je .LC2161 +movl $353,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2163 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2163: +.LC2161: +movw $12,-12(%ebp) +movl $10,-36(%ebp) +movswl -12(%ebp),%edi +xorl -36(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $6,%edi +je .LC2165 +movl $354,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2167 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2167: +.LC2165: +movw $12,-12(%ebp) +movl $10,-40(%ebp) +movswl -12(%ebp),%edi +xorl -40(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $6,%edi +je .LC2169 +movl $355,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2171 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2171: +.LC2169: +movl $12,-16(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +xorl %edi,-16(%ebp) +cmpl $6,-16(%ebp) +je .LC2173 +movl $356,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2175 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2175: +.LC2173: +movl $12,-16(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +xorl %edi,-16(%ebp) +cmpl $6,-16(%ebp) +je .LC2177 +movl $357,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2179 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2179: +.LC2177: +movl $12,-16(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +xorl %edi,-16(%ebp) +cmpl $6,-16(%ebp) +je .LC2181 +movl $358,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2183 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2183: +.LC2181: +movl $12,-16(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +xorl %edi,-16(%ebp) +cmpl $6,-16(%ebp) +je .LC2185 +movl $359,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2187 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2187: +.LC2185: +movl $12,-16(%ebp) +movl $10,-40(%ebp) +movl -16(%ebp),%edi +xorl -40(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $6,-16(%ebp) +je .LC2189 +movl $360,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2191 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2191: +.LC2189: +movl $12,-20(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +xorl %edi,-20(%ebp) +cmpl $6,-20(%ebp) +je .LC2193 +movl $361,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2195 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2195: +.LC2193: +movl $12,-20(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +xorl %edi,-20(%ebp) +cmpl $6,-20(%ebp) +je .LC2197 +movl $362,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2199 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2199: +.LC2197: +movl $12,-20(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +xorl %edi,-20(%ebp) +cmpl $6,-20(%ebp) +je .LC2201 +movl $363,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2203 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2203: +.LC2201: +movl $12,-20(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +xorl %edi,-20(%ebp) +cmpl $6,-20(%ebp) +je .LC2205 +movl $364,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2207 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2207: +.LC2205: +movl $12,-20(%ebp) +movl $10,-40(%ebp) +movl -20(%ebp),%edi +xorl -40(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $6,-20(%ebp) +je .LC2209 +movl $365,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2211 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2211: +.LC2209: +movl $12,-24(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +xorl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $6,%edi +je .LC2213 +movl $366,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2215 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2215: +.LC2213: +movl $12,-24(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +xorl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $6,%edi +je .LC2217 +movl $367,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2219 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2219: +.LC2217: +movl $12,-24(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +xorl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $6,%edi +je .LC2221 +movl $368,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2223 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2223: +.LC2221: +movl $12,-24(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +xorl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $6,%edi +je .LC2225 +movl $369,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2227 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2227: +.LC2225: +movl $12,-24(%ebp) +movl $10,-40(%ebp) +movl -40(%ebp),%edi +xorl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $6,%edi +je .LC2229 +movl $370,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2231 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2231: +.LC2229: +movb $12,-9(%ebp) +movb $10,-25(%ebp) +movsbl -9(%ebp),%edi +movsbl -25(%ebp),%esi +orl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $14,%edi +je .LC2233 +movl $371,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2235 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2235: +.LC2233: +movb $12,-9(%ebp) +movw $10,-28(%ebp) +movsbl -9(%ebp),%edi +movswl -28(%ebp),%esi +orl %esi,%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $14,%edi +je .LC2237 +movl $372,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2239 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2239: +.LC2237: +movb $12,-9(%ebp) +movl $10,-32(%ebp) +movsbl -9(%ebp),%edi +orl -32(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $14,%edi +je .LC2241 +movl $373,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2243 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2243: +.LC2241: +movb $12,-9(%ebp) +movl $10,-36(%ebp) +movsbl -9(%ebp),%edi +orl -36(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $14,%edi +je .LC2245 +movl $374,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2247 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2247: +.LC2245: +movb $12,-9(%ebp) +movl $10,-40(%ebp) +movsbl -9(%ebp),%edi +orl -40(%ebp),%edi +movl %edi,%ebx +movb %bl,-9(%ebp) +movsbl -9(%ebp),%edi +cmpl $14,%edi +je .LC2249 +movl $375,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2251 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2251: +.LC2249: +movw $12,-12(%ebp) +movb $10,-25(%ebp) +movswl -12(%ebp),%edi +movsbl -25(%ebp),%esi +orl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $14,%edi +je .LC2253 +movl $376,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2255 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2255: +.LC2253: +movw $12,-12(%ebp) +movw $10,-28(%ebp) +movswl -12(%ebp),%edi +movswl -28(%ebp),%esi +orl %esi,%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $14,%edi +je .LC2257 +movl $377,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2259 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2259: +.LC2257: +movw $12,-12(%ebp) +movl $10,-32(%ebp) +movswl -12(%ebp),%edi +orl -32(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $14,%edi +je .LC2261 +movl $378,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2263 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2263: +.LC2261: +movw $12,-12(%ebp) +movl $10,-36(%ebp) +movswl -12(%ebp),%edi +orl -36(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $14,%edi +je .LC2265 +movl $379,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2267 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2267: +.LC2265: +movw $12,-12(%ebp) +movl $10,-40(%ebp) +movswl -12(%ebp),%edi +orl -40(%ebp),%edi +movw %di,-12(%ebp) +movswl -12(%ebp),%edi +cmpl $14,%edi +je .LC2269 +movl $380,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2271 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2271: +.LC2269: +movl $12,-16(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +orl %edi,-16(%ebp) +cmpl $14,-16(%ebp) +je .LC2273 +movl $381,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2275 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2275: +.LC2273: +movl $12,-16(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +orl %edi,-16(%ebp) +cmpl $14,-16(%ebp) +je .LC2277 +movl $382,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2279 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2279: +.LC2277: +movl $12,-16(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +orl %edi,-16(%ebp) +cmpl $14,-16(%ebp) +je .LC2281 +movl $383,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2283 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2283: +.LC2281: +movl $12,-16(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +orl %edi,-16(%ebp) +cmpl $14,-16(%ebp) +je .LC2285 +movl $384,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2287 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2287: +.LC2285: +movl $12,-16(%ebp) +movl $10,-40(%ebp) +movl -16(%ebp),%edi +orl -40(%ebp),%edi +movl %edi,-16(%ebp) +cmpl $14,-16(%ebp) +je .LC2289 +movl $385,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2291 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2291: +.LC2289: +movl $12,-20(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +orl %edi,-20(%ebp) +cmpl $14,-20(%ebp) +je .LC2293 +movl $386,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2295 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2295: +.LC2293: +movl $12,-20(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +orl %edi,-20(%ebp) +cmpl $14,-20(%ebp) +je .LC2297 +movl $387,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2299 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2299: +.LC2297: +movl $12,-20(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +orl %edi,-20(%ebp) +cmpl $14,-20(%ebp) +je .LC2301 +movl $388,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2303 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2303: +.LC2301: +movl $12,-20(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +orl %edi,-20(%ebp) +cmpl $14,-20(%ebp) +je .LC2305 +movl $389,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2307 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2307: +.LC2305: +movl $12,-20(%ebp) +movl $10,-40(%ebp) +movl -20(%ebp),%edi +orl -40(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $14,-20(%ebp) +je .LC2309 +movl $390,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2311 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2311: +.LC2309: +movl $12,-24(%ebp) +movb $10,-25(%ebp) +movsbl -25(%ebp),%edi +orl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $14,%edi +je .LC2313 +movl $391,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2315 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2315: +.LC2313: +movl $12,-24(%ebp) +movw $10,-28(%ebp) +movswl -28(%ebp),%edi +orl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $14,%edi +je .LC2317 +movl $392,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2319 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2319: +.LC2317: +movl $12,-24(%ebp) +movl $10,-32(%ebp) +movl -32(%ebp),%edi +orl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $14,%edi +je .LC2321 +movl $393,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2323 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2323: +.LC2321: +movl $12,-24(%ebp) +movl $10,-36(%ebp) +movl -36(%ebp),%edi +orl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $14,%edi +je .LC2325 +movl $394,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2327 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2327: +.LC2325: +movl $12,-24(%ebp) +movl $10,-40(%ebp) +movl -40(%ebp),%edi +orl %edi,-24(%ebp) +movl -24(%ebp),%edi +cmpl $14,%edi +je .LC2329 +movl $395,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2331 +pushl -8(%ebp) +pushl $f.706 +call printf +addl $8,%esp +.LC2331: +.LC2329: +cmpl $0,-8(%ebp) +je .LC2333 +movl $1,-76(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2335 +pushl $1 +pushl $s714er.707 +call printf +addl $8,%esp +.LC2335: +.LC2333: +movl -76(%ebp),%eax +.LC705: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2337: +.size s714,.Lf2337-s714 +.data +.align 1 +.type s715er.2339,@object +s715er.2339: +.byte 115 +.byte 55 +.byte 49 +.byte 53 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s715er.2339,11 +.align 1 +.type qs715.2340,@object +.size qs715.2340,8 +qs715.2340: +.byte 115 +.byte 55 +.byte 49 +.byte 53 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s715 +.text +.align 16 +.type s715,@function +s715: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $28,%esp +movl $0,-28(%ebp) +movl $0,-20(%ebp) +leal qs715.2340,%edi +movl %edi,-4(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-8(%ebp) +movl $0,-16(%ebp) +.LC2341: +.LC2342: +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movl -4(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-4(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC2341 +movl $1,-12(%ebp) +incl -12(%ebp) +incl -12(%ebp) +incl -12(%ebp) +incl -12(%ebp) +movl -12(%ebp),%edi +leal 1(%edi),%edi +movl %edi,-12(%ebp) +cmpl $6,%edi +je .LC2344 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2346 +pushl $1 +pushl $s715er.2339 +call printf +addl $8,%esp +.LC2346: +incl -16(%ebp) +.LC2344: +pushl -28(%ebp) +movl $3,-24(%ebp) +movl -24(%ebp),%edi +leal 2(%edi),%edi +pushl %edi +pushl -20(%ebp) +call s715f +addl $12,%esp +cmpl $5,%eax +je .LC2348 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2350 +pushl $2 +pushl $s715er.2339 +call printf +addl $8,%esp +.LC2350: +addl $2,-16(%ebp) +.LC2348: +movl -16(%ebp),%eax +.LC2338: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2352: +.size s715,.Lf2352-s715 +.globl s715f +.align 16 +.type s715f,@function +s715f: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 24(%ebp),%eax +.LC2353: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2354: +.size s715f,.Lf2354-s715f +.data +.align 1 +.type s72er.2356,@object +s72er.2356: +.byte 115 +.byte 55 +.byte 50 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s72er.2356,10 +.align 1 +.type qs72.2357,@object +.size qs72.2357,8 +qs72.2357: +.byte 115 +.byte 55 +.byte 50 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s72 +.text +.align 16 +.type s72,@function +s72: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $100,%esp +leal qs72.2357,%edi +movl %edi,-12(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-16(%ebp) +movl $0,-24(%ebp) +.LC2358: +.LC2359: +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +movl -12(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-12(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC2358 +movl $2,-4(%ebp) +cmpl $2,-4(%ebp) +je .LC2361 +incl -24(%ebp) +pushl $1 +pushl $s72er.2356 +call printf +addl $8,%esp +.LC2361: +movl -4(%ebp),%edi +movl %edi,%esi +negl %esi +leal (%esi,%edi),%edi +cmpl $0,%edi +je .LC2363 +addl $2,-24(%ebp) +pushl $2 +pushl $s72er.2356 +call printf +addl $8,%esp +.LC2363: +movl $0,-4(%ebp) +movl $0,-8(%ebp) +jmp .LC2368 +.LC2365: +movl -4(%ebp),%edi +leal (,%edi,2),%edi +orl $1,%edi +movl %edi,-4(%ebp) +.LC2366: +incl -8(%ebp) +.LC2368: +movl 20(%ebp),%edi +movl 4(%edi),%edi +cmpl %edi,-8(%ebp) +jl .LC2365 +movl -4(%ebp),%edi +notl %edi +cmpl $0,%edi +je .LC2369 +addl $4,-24(%ebp) +pushl $4 +pushl $s72er.2356 +call printf +addl $8,%esp +.LC2369: +movl $5,-4(%ebp) +movl -4(%ebp),%edi +leal 1(%edi),%edi +movl %edi,-4(%ebp) +cmpl $6,%edi +jne .LC2376 +movl -4(%ebp),%edi +subl $1,%edi +movl %edi,-4(%ebp) +cmpl $5,%edi +jne .LC2376 +movl -4(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-4(%ebp) +cmpl $5,%edi +jne .LC2376 +movl -4(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,-4(%ebp) +cmpl $6,%edi +jne .LC2376 +cmpl $5,-4(%ebp) +je .LC2371 +.LC2376: +addl $8,-24(%ebp) +pushl $8 +pushl $s72er.2356 +call printf +addl $8,%esp +.LC2371: +movb $26,-29(%ebp) +movl $26,-36(%ebp) +fldl .LC2377 +fstpl -48(%ebp) +movw $26,-32(%ebp) +movl $26,-40(%ebp) +movl $26,-28(%ebp) +flds .LC2378 +fstps -52(%ebp) +movl $0,-20(%ebp) +movswl -32(%ebp),%edi +movl %edi,%ebx +movsbl %bl,%edi +cmpl $26,%edi +jne .LC2385 +movl -28(%ebp),%edi +movl %edi,%ebx +movsbl %bl,%edi +cmpl $26,%edi +jne .LC2385 +movl -36(%ebp),%edi +movl %edi,%ebx +movsbl %bl,%edi +cmpl $26,%edi +jne .LC2385 +movl -40(%ebp),%edi +movl %edi,%ebx +movsbl %bl,%edi +cmpl $26,%edi +jne .LC2385 +flds -52(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movsbl %bl,%edi +cmpl $26,%edi +jne .LC2385 +fldl -48(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%ebx +movsbl %bl,%edi +cmpl $26,%edi +je .LC2379 +.LC2385: +incl -20(%ebp) +.LC2379: +movsbl -29(%ebp),%edi +movswl %di,%edi +cmpl $26,%edi +jne .LC2392 +movl -28(%ebp),%edi +movswl %di,%edi +cmpl $26,%edi +jne .LC2392 +movl -36(%ebp),%edi +movswl %di,%edi +cmpl $26,%edi +jne .LC2392 +movl -40(%ebp),%edi +movswl %di,%edi +cmpl $26,%edi +jne .LC2392 +flds -52(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movswl %di,%edi +cmpl $26,%edi +jne .LC2392 +fldl -48(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movswl %di,%edi +cmpl $26,%edi +je .LC2386 +.LC2392: +addl $2,-20(%ebp) +.LC2386: +movsbl -29(%ebp),%edi +cmpl $26,%edi +jne .LC2399 +movswl -32(%ebp),%edi +cmpl $26,%edi +jne .LC2399 +cmpl $26,-36(%ebp) +jne .LC2399 +movl -40(%ebp),%edi +cmpl $26,%edi +jne .LC2399 +flds -52(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +cmpl $26,%eax +jne .LC2399 +fldl -48(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +cmpl $26,%eax +je .LC2393 +.LC2399: +addl $4,-20(%ebp) +.LC2393: +movsbl -29(%ebp),%edi +cmpl $26,%edi +jne .LC2406 +movswl -32(%ebp),%edi +cmpl $26,%edi +jne .LC2406 +cmpl $26,-28(%ebp) +jne .LC2406 +movl -40(%ebp),%edi +cmpl $26,%edi +jne .LC2406 +flds -52(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +cmpl $26,%eax +jne .LC2406 +fldl -48(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +cmpl $26,%eax +je .LC2400 +.LC2406: +addl $8,-20(%ebp) +.LC2400: +movsbl -29(%ebp),%edi +cmpl $26,%edi +jne .LC2415 +movswl -32(%ebp),%edi +cmpl $26,%edi +jne .LC2415 +movl -28(%ebp),%edi +cmpl $26,%edi +jne .LC2415 +movl -36(%ebp),%edi +cmpl $26,%edi +jne .LC2415 +flds .LC847 +fcomps -52(%ebp) +fstsw %ax +sahf +ja .LC2416 +flds -52(%ebp) +fsubs .LC847 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-56(%ebp) +jmp .LC2417 +.LC2416: +flds -52(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-56(%ebp) +.LC2417: +movl -56(%ebp),%edi +cmpl $26,%edi +jne .LC2415 +fldl .LC855 +fcompl -48(%ebp) +fstsw %ax +sahf +ja .LC2418 +fldl -48(%ebp) +fsubl .LC855 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-60(%ebp) +jmp .LC2419 +.LC2418: +fldl -48(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-60(%ebp) +.LC2419: +movl -60(%ebp),%edi +cmpl $26,%edi +je .LC2407 +.LC2415: +addl $16,-20(%ebp) +.LC2407: +movsbl -29(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2426 +movswl -32(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2426 +fildl -28(%ebp) +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2426 +fildl -36(%ebp) +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2426 +movl -40(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +sub $4,%esp +fstps (%esp) +flds (%esp) +addl $4,%esp +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2426 +fldl -48(%ebp) +fldl .LC2377 +fcompp +fstsw %ax +sahf +je .LC2420 +.LC2426: +addl $32,-20(%ebp) +.LC2420: +movsbl -29(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2433 +movswl -32(%ebp),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2433 +fildl -28(%ebp) +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2433 +fildl -36(%ebp) +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2433 +movl -40(%ebp),%edi +fldl .LC611 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fldl .LC2377 +fcompp +fstsw %ax +sahf +jne .LC2433 +fldl .LC2377 +fcomps -52(%ebp) +fstsw %ax +sahf +je .LC2427 +.LC2433: +addl $64,-20(%ebp) +.LC2427: +cmpl $0,-20(%ebp) +je .LC2434 +addl $16,-24(%ebp) +pushl $16 +pushl $s72er.2356 +call printf +addl $8,%esp +.LC2434: +movl -24(%ebp),%eax +.LC2355: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2436: +.size s72,.Lf2436-s72 +.data +.align 1 +.type s757er.2438,@object +s757er.2438: +.byte 115 +.byte 55 +.byte 53 +.byte 55 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s757er.2438,11 +.align 1 +.type qs757.2439,@object +.size qs757.2439,8 +qs757.2439: +.byte 115 +.byte 55 +.byte 53 +.byte 55 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s757 +.text +.align 16 +.type s757,@function +s757: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $148,%esp +leal qs757.2439,%edi +movl %edi,-112(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-116(%ebp) +movl $0,-120(%ebp) +.LC2440: +.LC2441: +movl -116(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-116(%ebp) +movl -112(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-112(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC2440 +movl $40,-124(%ebp) +movl -124(%ebp),%edi +leal (,%edi,8),%esi +leal (,%esi,4),%esi +cmpl $1280,%esi +jne .LC2445 +sarl $3,%edi +sarl $2,%edi +cmpl $1,%edi +je .LC2443 +.LC2445: +incl -120(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2446 +pushl $1 +pushl $s757er.2438 +call printf +addl $8,%esp +.LC2446: +.LC2443: +movl $0,-84(%ebp) +movl $0,-100(%ebp) +jmp .LC2451 +.LC2448: +movl $1,-92(%ebp) +movl -92(%ebp),%edi +movl 20(%ebp),%esi +movl 16(%esi),%esi +movl %esi,%ecx +subl $1,%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-96(%ebp) +movl $0,-104(%ebp) +movl -104(%ebp),%edi +notl %edi +movl -100(%ebp),%esi +movl %esi,%ecx +movl %edi,%eax +shrl %cl,%eax +movl %eax,-108(%ebp) +movl %esi,%ecx +movl %edi,%eax +shll %cl,%eax +movl %eax,-104(%ebp) +movl $0,-88(%ebp) +jmp .LC2455 +.LC2452: +movl -100(%ebp),%edi +cmpl %edi,-88(%ebp) +jge .LC2463 +movl $1,-132(%ebp) +jmp .LC2464 +.LC2463: +movl $0,-132(%ebp) +.LC2464: +movl -92(%ebp),%edi +andl -104(%ebp),%edi +cmpl $0,%edi +jne .LC2465 +movl $1,-136(%ebp) +jmp .LC2466 +.LC2465: +movl $0,-136(%ebp) +.LC2466: +movl -136(%ebp),%edi +cmpl %edi,-132(%ebp) +jne .LC2462 +movl -100(%ebp),%edi +cmpl %edi,-88(%ebp) +jge .LC2467 +movl $1,-140(%ebp) +jmp .LC2468 +.LC2467: +movl $0,-140(%ebp) +.LC2468: +movl -96(%ebp),%edi +andl -108(%ebp),%edi +cmpl $0,%edi +jne .LC2469 +movl $1,-144(%ebp) +jmp .LC2470 +.LC2469: +movl $0,-144(%ebp) +.LC2470: +movl -144(%ebp),%edi +cmpl %edi,-140(%ebp) +je .LC2456 +.LC2462: +movl $1,-84(%ebp) +.LC2456: +movl -92(%ebp),%edi +leal (,%edi,2),%edi +movl %edi,-92(%ebp) +movl -96(%ebp),%edi +shrl $1,%edi +movl %edi,-96(%ebp) +.LC2453: +incl -88(%ebp) +.LC2455: +movl 20(%ebp),%edi +movl 16(%edi),%edi +cmpl %edi,-88(%ebp) +jl .LC2452 +.LC2449: +incl -100(%ebp) +.LC2451: +movl 20(%ebp),%edi +movl 16(%edi),%edi +cmpl %edi,-100(%ebp) +jl .LC2448 +cmpl $0,-84(%ebp) +je .LC2471 +addl $2,-120(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2473 +pushl $2 +pushl $s757er.2438 +call printf +addl $8,%esp +.LC2473: +.LC2471: +movl $3,-16(%ebp) +movl $2,-12(%ebp) +movl $1,-8(%ebp) +movl -12(%ebp),%edi +cmpl %edi,-16(%ebp) +jge .LC2481 +movl $1,-136(%ebp) +jmp .LC2482 +.LC2481: +movl $0,-136(%ebp) +.LC2482: +movl -8(%ebp),%edi +cmpl %edi,-136(%ebp) +jge .LC2479 +movl $1,-132(%ebp) +jmp .LC2480 +.LC2479: +movl $0,-132(%ebp) +.LC2480: +cmpl $1,-132(%ebp) +je .LC2475 +addl $4,-120(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2483 +pushl $4 +pushl $s757er.2438 +call printf +addl $8,%esp +.LC2483: +.LC2475: +leal -76(%ebp),%edi +leal -80(%ebp),%esi +cmpl %esi,%edi +jne .LC2485 +addl $8,-120(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2488 +pushl $8 +pushl $s757er.2438 +call printf +addl $8,%esp +.LC2488: +.LC2485: +leal -76(%ebp),%edi +leal -80(%ebp),%esi +cmpl %esi,%edi +jae .LC2490 +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC2493 +pushl $.LC2495 +call printf +addl $4,%esp +.LC2493: +.LC2490: +movl $0,-84(%ebp) +movl $0,-88(%ebp) +.LC2496: +movl -88(%ebp),%edi +leal -80(%ebp),%esi +movl $1,(%esi,%edi,4) +.LC2497: +incl -88(%ebp) +cmpl $16,-88(%ebp) +jl .LC2496 +movl $0,-76(%ebp) +movl $0,-64(%ebp) +movl $0,-56(%ebp) +movl $0,-52(%ebp) +movl $0,-44(%ebp) +movl $0,-28(%ebp) +movl $0,-16(%ebp) +.LC2506: +movl $0,-12(%ebp) +.LC2510: +movl $0,-8(%ebp) +.LC2514: +movl $0,-4(%ebp) +.LC2518: +movl -12(%ebp),%edi +cmpl %edi,-16(%ebp) +jge .LC2529 +movl $1,-144(%ebp) +jmp .LC2530 +.LC2529: +movl $0,-144(%ebp) +.LC2530: +movl -4(%ebp),%edi +cmpl %edi,-8(%ebp) +jge .LC2531 +movl $1,-148(%ebp) +jmp .LC2532 +.LC2531: +movl $0,-148(%ebp) +.LC2532: +movl -148(%ebp),%edi +cmpl %edi,-144(%ebp) +jne .LC2527 +movl $1,-140(%ebp) +jmp .LC2528 +.LC2527: +movl $0,-140(%ebp) +.LC2528: +movl -16(%ebp),%edi +movl -12(%ebp),%esi +leal (,%esi,4),%esi +leal (%esi,%edi,8),%edi +movl -8(%ebp),%esi +leal (,%esi,2),%esi +leal (%esi,%edi),%edi +movl -4(%ebp),%esi +leal (%esi,%edi),%edi +leal -80(%ebp),%esi +movl (%esi,%edi,4),%edi +cmpl %edi,-140(%ebp) +je .LC2522 +movl $1,-84(%ebp) +.LC2522: +.LC2519: +incl -4(%ebp) +cmpl $2,-4(%ebp) +jl .LC2518 +.LC2515: +incl -8(%ebp) +cmpl $2,-8(%ebp) +jl .LC2514 +.LC2511: +incl -12(%ebp) +cmpl $2,-12(%ebp) +jl .LC2510 +.LC2507: +incl -16(%ebp) +cmpl $2,-16(%ebp) +jl .LC2506 +cmpl $0,-84(%ebp) +je .LC2533 +addl $16,-120(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2535 +pushl $16 +pushl $s757er.2438 +call printf +addl $8,%esp +.LC2535: +.LC2533: +movl $0,-128(%ebp) +movl -128(%ebp),%edi +cmpl $0,%edi +je .LC2537 +addl $32,-120(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2539 +pushl $32 +pushl $s757er.2438 +call printf +addl $8,%esp +.LC2539: +.LC2537: +movl -120(%ebp),%eax +.LC2437: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2541: +.size s757,.Lf2541-s757 +.data +.align 1 +.type fl.2543,@object +fl.2543: +.byte 76 +.byte 111 +.byte 99 +.byte 97 +.byte 108 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 37 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.size fl.2543,17 +.align 1 +.type s7813er.2544,@object +s7813er.2544: +.byte 115 +.byte 55 +.byte 56 +.byte 49 +.byte 51 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s7813er.2544,12 +.align 1 +.type qs7813.2545,@object +.size qs7813.2545,8 +qs7813.2545: +.byte 115 +.byte 55 +.byte 56 +.byte 49 +.byte 51 +.byte 32 +.byte 32 +.byte 0 +.globl s7813 +.text +.align 16 +.type s7813,@function +s7813: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $88,%esp +leal qs7813.2545,%edi +movl %edi,-24(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%esi +movl %esi,-28(%ebp) +movl $0,-8(%ebp) +movl $0,-32(%ebp) +movl 48(%edi),%edi +movl %edi,-4(%ebp) +.LC2546: +.LC2547: +movl -28(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-28(%ebp) +movl -24(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-24(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC2546 +jmp .LC2549 +movl $1,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2551 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2551: +.LC2549: +jmp .LC2553 +movl $2,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2555 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2555: +.LC2553: +jmp .LC2557 +movl $3,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2559 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2559: +.LC2557: +jmp .LC2561 +movl $4,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2563 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2563: +.LC2561: +jmp .LC2565 +movl $5,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2567 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2567: +.LC2565: +jmp .LC2569 +movl $6,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2571 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2571: +.LC2569: +jmp .LC2573 +movl $7,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2575 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2575: +.LC2573: +jmp .LC2577 +movl $8,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2579 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2579: +.LC2577: +jmp .LC2581 +movl $9,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2583 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2583: +.LC2581: +jmp .LC2585 +movl $10,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2587 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2587: +.LC2585: +jmp .LC2589 +movl $11,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2591 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2591: +.LC2589: +jmp .LC2593 +movl $12,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2595 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2595: +.LC2593: +jmp .LC2597 +movl $13,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2599 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2599: +.LC2597: +jmp .LC2601 +movl $14,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2603 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2603: +.LC2601: +jmp .LC2605 +movl $15,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2607 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2607: +.LC2605: +jmp .LC2609 +movl $16,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2611 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2611: +.LC2609: +jmp .LC2613 +movl $17,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2615 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2615: +.LC2613: +jmp .LC2617 +movl $18,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2619 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2619: +.LC2617: +jmp .LC2621 +movl $16,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2623 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2623: +.LC2621: +jmp .LC2625 +movl $20,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2627 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2627: +.LC2625: +jmp .LC2629 +movl $21,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2631 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2631: +.LC2629: +jmp .LC2633 +movl $22,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2635 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2635: +.LC2633: +jmp .LC2637 +movl $23,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2639 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2639: +.LC2637: +jmp .LC2641 +movl $24,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2643 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2643: +.LC2641: +jmp .LC2645 +movl $25,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2647 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2647: +.LC2645: +jmp .LC2649 +movl $26,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2651 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2651: +.LC2649: +jmp .LC2653 +movl $27,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2655 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2655: +.LC2653: +jmp .LC2657 +movl $28,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2659 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2659: +.LC2657: +jmp .LC2661 +movl $26,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2663 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2663: +.LC2661: +jmp .LC2665 +movl $30,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2667 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2667: +.LC2665: +jmp .LC2669 +movl $31,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2671 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2671: +.LC2669: +jmp .LC2673 +movl $32,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2675 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2675: +.LC2673: +jmp .LC2677 +movl $33,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2679 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2679: +.LC2677: +jmp .LC2681 +movl $34,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2683 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2683: +.LC2681: +jmp .LC2685 +movl $35,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2687 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2687: +.LC2685: +jmp .LC2689 +movl $36,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2691 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2691: +.LC2689: +jmp .LC2693 +movl $37,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2695 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2695: +.LC2693: +jmp .LC2697 +movl $38,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2699 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2699: +.LC2697: +jmp .LC2701 +movl $39,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2703 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2703: +.LC2701: +jmp .LC2705 +movl $40,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2707 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2707: +.LC2705: +jmp .LC2709 +movl $41,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2711 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2711: +.LC2709: +jmp .LC2713 +movl $42,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2715 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2715: +.LC2713: +jmp .LC2717 +movl $43,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2719 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2719: +.LC2717: +jmp .LC2721 +movl $44,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2723 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2723: +.LC2721: +jmp .LC2725 +movl $45,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2727 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2727: +.LC2725: +jmp .LC2729 +movl $46,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2731 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2731: +.LC2729: +jmp .LC2733 +movl $47,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2735 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2735: +.LC2733: +jmp .LC2737 +movl $48,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2739 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2739: +.LC2737: +jmp .LC2741 +movl $49,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2743 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2743: +.LC2741: +jmp .LC2745 +movl $50,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2747 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2747: +.LC2745: +jmp .LC2749 +movl $51,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2751 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2751: +.LC2749: +jmp .LC2753 +movl $52,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2755 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2755: +.LC2753: +jmp .LC2757 +movl $53,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2759 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2759: +.LC2757: +jmp .LC2761 +movl $54,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2763 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2763: +.LC2761: +jmp .LC2765 +movl $55,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2767 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2767: +.LC2765: +jmp .LC2769 +movl $56,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2771 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2771: +.LC2769: +jmp .LC2773 +movl $57,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2775 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2775: +.LC2773: +jmp .LC2777 +movl $58,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2779 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2779: +.LC2777: +jmp .LC2781 +movl $56,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2783 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2783: +.LC2781: +jmp .LC2785 +movl $60,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2787 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2787: +.LC2785: +jmp .LC2789 +movl $61,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2791 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2791: +.LC2789: +jmp .LC2793 +movl $62,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2795 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2795: +.LC2793: +jmp .LC2797 +movl $63,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2799 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2799: +.LC2797: +jmp .LC2801 +movl $64,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2803 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2803: +.LC2801: +jmp .LC2805 +movl $65,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2807 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2807: +.LC2805: +jmp .LC2809 +movl $66,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2811 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2811: +.LC2809: +jmp .LC2813 +movl $67,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2815 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2815: +.LC2813: +jmp .LC2817 +movl $68,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2819 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2819: +.LC2817: +jmp .LC2821 +movl $69,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2823 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2823: +.LC2821: +jmp .LC2825 +movl $70,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2827 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2827: +.LC2825: +jmp .LC2829 +movl $71,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2831 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2831: +.LC2829: +jmp .LC2833 +movl $72,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2835 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2835: +.LC2833: +jmp .LC2837 +movl $73,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2839 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2839: +.LC2837: +jmp .LC2841 +movl $74,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2843 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2843: +.LC2841: +jmp .LC2845 +movl $75,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2847 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2847: +.LC2845: +cmpl $0,-8(%ebp) +je .LC2849 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2851 +pushl $1 +pushl $s7813er.2544 +call printf +addl $8,%esp +.LC2851: +incl -32(%ebp) +.LC2849: +movl $0,-8(%ebp) +movl $0,-16(%ebp) +movl $0,-12(%ebp) +movl -12(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-12(%ebp) +cmpl $0,%edi +je .LC2854 +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +cmpl $0,%edi +je .LC2854 +movl $1,-44(%ebp) +jmp .LC2855 +.LC2854: +movl $0,-44(%ebp) +.LC2855: +movl -44(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $1,-12(%ebp) +je .LC2856 +movl $1,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2858 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2858: +.LC2856: +cmpl $0,-16(%ebp) +je .LC2860 +movl $2,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2862 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2862: +.LC2860: +cmpl $0,-20(%ebp) +je .LC2864 +movl $3,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2866 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2866: +.LC2864: +cmpl $0,-12(%ebp) +je .LC2869 +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +cmpl $0,%edi +je .LC2869 +movl $1,-48(%ebp) +jmp .LC2870 +.LC2869: +movl $0,-48(%ebp) +.LC2870: +movl -48(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $1,-12(%ebp) +je .LC2871 +movl $4,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2873 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2873: +.LC2871: +cmpl $1,-16(%ebp) +je .LC2875 +movl $5,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2877 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2877: +.LC2875: +cmpl $0,-20(%ebp) +je .LC2879 +movl $6,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2881 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2881: +.LC2879: +movl -12(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,-12(%ebp) +cmpl $0,%edi +je .LC2884 +cmpl $0,-16(%ebp) +je .LC2884 +movl $1,-52(%ebp) +jmp .LC2885 +.LC2884: +movl $0,-52(%ebp) +.LC2885: +movl -52(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $0,-12(%ebp) +je .LC2886 +movl $7,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2888 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2888: +.LC2886: +cmpl $1,-16(%ebp) +je .LC2890 +movl $8,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2892 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2892: +.LC2890: +cmpl $1,-20(%ebp) +je .LC2894 +movl $9,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2896 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2896: +.LC2894: +cmpl $0,-12(%ebp) +je .LC2899 +movl -16(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,-16(%ebp) +cmpl $0,%edi +je .LC2899 +movl $1,-56(%ebp) +jmp .LC2900 +.LC2899: +movl $0,-56(%ebp) +.LC2900: +movl -56(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $0,-12(%ebp) +je .LC2901 +movl $10,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2903 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2903: +.LC2901: +cmpl $1,-16(%ebp) +je .LC2905 +movl $11,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2907 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2907: +.LC2905: +cmpl $0,-20(%ebp) +je .LC2909 +movl $12,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2911 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2911: +.LC2909: +cmpl $0,-8(%ebp) +je .LC2913 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2915 +pushl $2 +pushl $s7813er.2544 +call printf +addl $8,%esp +.LC2915: +addl $2,-32(%ebp) +.LC2913: +movl $0,-8(%ebp) +movl $0,-16(%ebp) +movl $0,-12(%ebp) +movl -12(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-12(%ebp) +cmpl $0,%edi +jne .LC2920 +cmpl $0,-16(%ebp) +je .LC2918 +.LC2920: +movl $1,-60(%ebp) +jmp .LC2919 +.LC2918: +movl $0,-60(%ebp) +.LC2919: +movl -60(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $1,-12(%ebp) +je .LC2921 +movl $1,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2923 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2923: +.LC2921: +cmpl $0,-16(%ebp) +je .LC2925 +movl $2,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2927 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2927: +.LC2925: +cmpl $0,-20(%ebp) +je .LC2929 +movl $3,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2931 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2931: +.LC2929: +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +cmpl $0,%edi +jne .LC2936 +cmpl $0,-12(%ebp) +je .LC2934 +.LC2936: +movl $1,-64(%ebp) +jmp .LC2935 +.LC2934: +movl $0,-64(%ebp) +.LC2935: +movl -64(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $1,-12(%ebp) +je .LC2937 +movl $4,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2939 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2939: +.LC2937: +cmpl $1,-16(%ebp) +je .LC2941 +movl $5,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2943 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2943: +.LC2941: +cmpl $1,-20(%ebp) +je .LC2945 +movl $6,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2947 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2947: +.LC2945: +movl -12(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,-12(%ebp) +cmpl $0,%edi +jne .LC2952 +movl -16(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,-16(%ebp) +cmpl $0,%edi +je .LC2950 +.LC2952: +movl $1,-68(%ebp) +jmp .LC2951 +.LC2950: +movl $0,-68(%ebp) +.LC2951: +movl -68(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $0,-12(%ebp) +je .LC2953 +movl $7,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2955 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2955: +.LC2953: +cmpl $1,-16(%ebp) +je .LC2957 +movl $8,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2959 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2959: +.LC2957: +cmpl $1,-20(%ebp) +je .LC2961 +movl $9,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2963 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2963: +.LC2961: +cmpl $0,-12(%ebp) +jne .LC2968 +movl -16(%ebp),%edi +movl %edi,%esi +subl $1,%esi +movl %esi,-16(%ebp) +cmpl $0,%edi +je .LC2966 +.LC2968: +movl $1,-72(%ebp) +jmp .LC2967 +.LC2966: +movl $0,-72(%ebp) +.LC2967: +movl -72(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $0,-12(%ebp) +je .LC2969 +movl $10,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2971 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2971: +.LC2969: +cmpl $0,-16(%ebp) +je .LC2973 +movl $11,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2975 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2975: +.LC2973: +cmpl $1,-20(%ebp) +je .LC2977 +movl $12,-8(%ebp) +cmpl $0,-4(%ebp) +je .LC2979 +pushl -8(%ebp) +pushl $fl.2543 +call printf +addl $8,%esp +.LC2979: +.LC2977: +cmpl $0,-8(%ebp) +je .LC2981 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2983 +pushl $4 +pushl $s7813er.2544 +call printf +addl $8,%esp +.LC2983: +addl $4,-32(%ebp) +.LC2981: +movl $0,-16(%ebp) +movl $0,-12(%ebp) +movl $0,-36(%ebp) +movl $1,-40(%ebp) +cmpl $0,-40(%ebp) +je .LC2987 +movl -36(%ebp),%edi +movl %edi,-76(%ebp) +jmp .LC2988 +.LC2987: +cmpl $0,-40(%ebp) +je .LC2989 +movl -12(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-12(%ebp) +movl %edi,-80(%ebp) +jmp .LC2990 +.LC2989: +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +movl %edi,-80(%ebp) +.LC2990: +movl -80(%ebp),%edi +movl %edi,-76(%ebp) +.LC2988: +movl -76(%ebp),%edi +movl %edi,-20(%ebp) +cmpl $0,-20(%ebp) +jne .LC2994 +cmpl $0,-12(%ebp) +jne .LC2994 +cmpl $0,-16(%ebp) +je .LC2991 +.LC2994: +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC2995 +pushl $8 +pushl $s7813er.2544 +call printf +addl $8,%esp +.LC2995: +addl $8,-32(%ebp) +.LC2991: +cmpl $0,-40(%ebp) +je .LC3002 +movl -36(%ebp),%edi +movl %edi,-84(%ebp) +jmp .LC3003 +.LC3002: +movl $1,-84(%ebp) +.LC3003: +cmpl $0,-84(%ebp) +jne .LC3001 +cmpl $0,-36(%ebp) +je .LC3004 +movl $1,-88(%ebp) +jmp .LC3005 +.LC3004: +movl -36(%ebp),%edi +movl %edi,-88(%ebp) +.LC3005: +cmpl $0,-88(%ebp) +je .LC2997 +.LC3001: +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3006 +pushl $16 +pushl $s7813er.2544 +call printf +addl $8,%esp +.LC3006: +addl $16,-32(%ebp) +.LC2997: +movl -32(%ebp),%eax +.LC2542: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3008: +.size s7813,.Lf3008-s7813 +.data +.align 1 +.type s81er.3010,@object +s81er.3010: +.byte 115 +.byte 56 +.byte 49 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s81er.3010,10 +.align 1 +.type qs81.3011,@object +.size qs81.3011,8 +qs81.3011: +.byte 115 +.byte 56 +.byte 49 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.type badtest.3012,@object +badtest.3012: +.byte 82 +.byte 101 +.byte 103 +.byte 105 +.byte 115 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 99 +.byte 111 +.byte 117 +.byte 110 +.byte 116 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 37 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 117 +.byte 110 +.byte 114 +.byte 101 +.byte 108 +.byte 105 +.byte 97 +.byte 98 +.byte 108 +.byte 101 +.byte 46 +.byte 10 +.byte 0 +.size badtest.3012,38 +.align 1 +.type goodtest.3013,@object +goodtest.3013: +.byte 37 +.byte 100 +.byte 32 +.byte 114 +.byte 101 +.byte 103 +.byte 105 +.byte 115 +.byte 116 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 97 +.byte 115 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 101 +.byte 100 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 37 +.byte 115 +.byte 32 +.byte 118 +.byte 97 +.byte 114 +.byte 105 +.byte 97 +.byte 98 +.byte 108 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.size goodtest.3013,40 +.globl s81 +.text +.align 16 +.type s81,@function +s81: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $56,%esp +movl $0,-56(%ebp) +movl $0,-44(%ebp) +movl $0,-48(%ebp) +movl $0,-52(%ebp) +leal qs81.3011,%edi +movl %edi,-36(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-40(%ebp) +.LC3014: +.LC3015: +movl -40(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-40(%ebp) +movl -36(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-36(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC3014 +movl $1,-16(%ebp) +movl $0,-20(%ebp) +.LC3017: +movl -16(%ebp),%edi +movl %edi,%ebx +movb %bl,-1(%ebp) +movb %bl,-21(%ebp) +leal -16(%ebp),%esi +movl %esi,-8(%ebp) +leal -16(%ebp),%esi +movl %esi,-28(%ebp) +movl %edi,-12(%ebp) +movl %edi,-32(%ebp) +movsbl -1(%ebp),%edi +movsbl -21(%ebp),%esi +cmpl %esi,%edi +je .LC3021 +movl $1,-44(%ebp) +.LC3021: +movl -8(%ebp),%edi +movl -28(%ebp),%esi +cmpl %esi,%edi +je .LC3023 +movl $1,-48(%ebp) +.LC3023: +movl -32(%ebp),%edi +cmpl %edi,-12(%ebp) +je .LC3025 +movl $1,-52(%ebp) +.LC3025: +sall $1,-16(%ebp) +.LC3018: +incl -20(%ebp) +cmpl $50,-20(%ebp) +jl .LC3017 +cmpl $0,-44(%ebp) +je .LC3027 +incl -56(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3029 +pushl $1 +pushl $s81er.3010 +call printf +addl $8,%esp +.LC3029: +.LC3027: +cmpl $0,-48(%ebp) +je .LC3031 +addl $2,-56(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3033 +pushl $2 +pushl $s81er.3010 +call printf +addl $8,%esp +.LC3033: +.LC3031: +cmpl $0,-52(%ebp) +je .LC3035 +addl $4,-56(%ebp) +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3037 +pushl $4 +pushl $s81er.3010 +call printf +addl $8,%esp +.LC3037: +.LC3035: +call regc +movl %eax,-16(%ebp) +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC3039 +cmpl $0,-16(%ebp) +jge .LC3041 +pushl $.LC434 +pushl $badtest.3012 +call printf +addl $8,%esp +jmp .LC3042 +.LC3041: +pushl $.LC434 +pushl -16(%ebp) +pushl $goodtest.3013 +call printf +addl $12,%esp +.LC3042: +.LC3039: +call regp +movl %eax,-16(%ebp) +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC3043 +cmpl $0,-16(%ebp) +jge .LC3045 +pushl $.LC3047 +pushl $badtest.3012 +call printf +addl $8,%esp +jmp .LC3046 +.LC3045: +pushl $.LC3047 +pushl -16(%ebp) +pushl $goodtest.3013 +call printf +addl $12,%esp +.LC3046: +.LC3043: +call regi +movl %eax,-16(%ebp) +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC3048 +cmpl $0,-16(%ebp) +jge .LC3050 +pushl $.LC435 +pushl $badtest.3012 +call printf +addl $8,%esp +jmp .LC3051 +.LC3050: +pushl $.LC435 +pushl -16(%ebp) +pushl $goodtest.3013 +call printf +addl $12,%esp +.LC3051: +.LC3048: +movl -56(%ebp),%eax +.LC3009: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3052: +.size s81,.Lf3052-s81 +.globl regc +.align 16 +.type regc,@function +regc: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $148,%esp +movb $0,-138(%ebp) +movb $1,-117(%ebp) +movb $2,-118(%ebp) +movb $3,-119(%ebp) +movb $4,-1(%ebp) +movb $5,-120(%ebp) +movb $6,-2(%ebp) +movb $7,-121(%ebp) +movb $8,-3(%ebp) +movb $9,-122(%ebp) +movb $10,-4(%ebp) +movb $11,-123(%ebp) +movb $12,-5(%ebp) +movb $13,-124(%ebp) +movb $14,-6(%ebp) +movb $15,-125(%ebp) +movb $16,-7(%ebp) +movb $17,-126(%ebp) +movb $18,-8(%ebp) +movb $19,-127(%ebp) +movb $20,-9(%ebp) +movb $21,-128(%ebp) +movb $22,-10(%ebp) +movb $23,-129(%ebp) +movb $24,-11(%ebp) +movb $25,-130(%ebp) +movb $26,-12(%ebp) +movb $27,-131(%ebp) +movb $28,-13(%ebp) +movb $29,-132(%ebp) +movb $30,-14(%ebp) +movb $31,-133(%ebp) +movb $32,-15(%ebp) +movb $33,-134(%ebp) +movb $34,-16(%ebp) +movb $35,-135(%ebp) +movb $36,-136(%ebp) +movb $37,-137(%ebp) +movb $38,-139(%ebp) +leal -117(%ebp),%edi +leal -138(%ebp),%esi +movl %edi,%ebx +subl %esi,%ebx +movl %ebx,%esi +movl %esi,-104(%ebp) +leal -118(%ebp),%esi +subl %edi,%esi +movl %esi,%edi +movl %edi,-100(%ebp) +leal -119(%ebp),%edi +leal -118(%ebp),%esi +subl %esi,%edi +movl %edi,-96(%ebp) +leal -120(%ebp),%edi +leal -119(%ebp),%esi +subl %esi,%edi +movl %edi,-92(%ebp) +leal -121(%ebp),%edi +leal -120(%ebp),%esi +subl %esi,%edi +movl %edi,-88(%ebp) +leal -122(%ebp),%edi +leal -121(%ebp),%esi +subl %esi,%edi +movl %edi,-84(%ebp) +leal -123(%ebp),%edi +leal -122(%ebp),%esi +subl %esi,%edi +movl %edi,-80(%ebp) +leal -124(%ebp),%edi +leal -123(%ebp),%esi +subl %esi,%edi +movl %edi,-76(%ebp) +leal -125(%ebp),%edi +leal -124(%ebp),%esi +subl %esi,%edi +movl %edi,-72(%ebp) +leal -126(%ebp),%edi +leal -125(%ebp),%esi +subl %esi,%edi +movl %edi,-68(%ebp) +leal -127(%ebp),%edi +leal -126(%ebp),%esi +subl %esi,%edi +movl %edi,-64(%ebp) +leal -128(%ebp),%edi +leal -127(%ebp),%esi +subl %esi,%edi +movl %edi,-60(%ebp) +leal -129(%ebp),%edi +leal -128(%ebp),%esi +subl %esi,%edi +movl %edi,-56(%ebp) +leal -130(%ebp),%edi +leal -129(%ebp),%esi +subl %esi,%edi +movl %edi,-52(%ebp) +leal -131(%ebp),%edi +leal -130(%ebp),%esi +subl %esi,%edi +movl %edi,-48(%ebp) +leal -132(%ebp),%edi +leal -131(%ebp),%esi +subl %esi,%edi +movl %edi,-44(%ebp) +leal -133(%ebp),%edi +leal -132(%ebp),%esi +subl %esi,%edi +movl %edi,-40(%ebp) +leal -134(%ebp),%edi +leal -133(%ebp),%esi +subl %esi,%edi +movl %edi,-36(%ebp) +leal -135(%ebp),%edi +leal -134(%ebp),%esi +subl %esi,%edi +movl %edi,-32(%ebp) +leal -136(%ebp),%edi +leal -135(%ebp),%esi +subl %esi,%edi +movl %edi,-28(%ebp) +leal -137(%ebp),%edi +leal -136(%ebp),%esi +subl %esi,%edi +movl %edi,-24(%ebp) +leal -139(%ebp),%edi +leal -137(%ebp),%esi +subl %esi,%edi +movl %edi,-20(%ebp) +movl -104(%ebp),%edi +movl %edi,-116(%ebp) +movl $1,-112(%ebp) +movl $0,-108(%ebp) +.LC3075: +movl -112(%ebp),%edi +cmpl $1,%edi +je .LC3081 +cmpl $2,%edi +je .LC3084 +cmpl $3,%edi +je .LC3089 +jmp .LC3079 +.LC3081: +movl -108(%ebp),%edi +leal -104(%ebp),%esi +movl -116(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3080 +movl -108(%ebp),%edi +leal -104(%ebp),%esi +movl (%esi,%edi,4),%edi +movl %edi,-148(%ebp) +movl $2,-112(%ebp) +movl $1,-144(%ebp) +jmp .LC3080 +.LC3084: +movl -108(%ebp),%edi +leal -104(%ebp),%esi +movl -116(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jne .LC3085 +movl $3,-112(%ebp) +jmp .LC3080 +.LC3085: +movl -108(%ebp),%edi +leal -104(%ebp),%esi +movl -148(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jne .LC3087 +incl -144(%ebp) +jmp .LC3080 +.LC3087: +movl $4,-112(%ebp) +jmp .LC3080 +.LC3089: +movl -108(%ebp),%edi +leal -104(%ebp),%esi +movl -116(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3080 +movl $4,-112(%ebp) +.LC3079: +.LC3080: +.LC3076: +incl -108(%ebp) +cmpl $22,-108(%ebp) +jl .LC3075 +cmpl $3,-112(%ebp) +jne .LC3092 +movl $16,%edi +movl %edi,%eax +subl -144(%ebp),%eax +jmp .LC3053 +.LC3092: +movl $-1,%eax +.LC3053: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3094: +.size regc,.Lf3094-regc +.globl regi +.align 16 +.type regi,@function +regi: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $264,%esp +movl $0,-252(%ebp) +movl $1,-168(%ebp) +movl $2,-172(%ebp) +movl $3,-176(%ebp) +movl $4,-4(%ebp) +movl $5,-180(%ebp) +movl $6,-8(%ebp) +movl $7,-184(%ebp) +movl $8,-12(%ebp) +movl $9,-188(%ebp) +movl $10,-16(%ebp) +movl $11,-192(%ebp) +movl $12,-20(%ebp) +movl $13,-196(%ebp) +movl $14,-24(%ebp) +movl $15,-200(%ebp) +movl $16,-28(%ebp) +movl $17,-204(%ebp) +movl $18,-32(%ebp) +movl $19,-208(%ebp) +movl $20,-36(%ebp) +movl $21,-212(%ebp) +movl $22,-40(%ebp) +movl $23,-216(%ebp) +movl $24,-44(%ebp) +movl $25,-220(%ebp) +movl $26,-48(%ebp) +movl $27,-224(%ebp) +movl $28,-52(%ebp) +movl $29,-228(%ebp) +movl $30,-56(%ebp) +movl $31,-232(%ebp) +movl $32,-60(%ebp) +movl $33,-236(%ebp) +movl $34,-64(%ebp) +movl $35,-240(%ebp) +movl $36,-244(%ebp) +movl $37,-248(%ebp) +movl $38,-256(%ebp) +leal -168(%ebp),%edi +movl $4,%esi +leal -252(%ebp),%ebx +movl %edi,%edx +subl %ebx,%edx +movl %edx,%eax +movl %esi,%ecx +cdq +idivl %ecx +movl %eax,-152(%ebp) +leal -172(%ebp),%ebx +subl %edi,%ebx +movl %ebx,%eax +movl %esi,%ecx +cdq +idivl %ecx +movl %eax,-148(%ebp) +leal -176(%ebp),%edi +leal -172(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-144(%ebp) +leal -180(%ebp),%edi +leal -176(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-140(%ebp) +leal -184(%ebp),%edi +leal -180(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-136(%ebp) +leal -188(%ebp),%edi +leal -184(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-132(%ebp) +leal -192(%ebp),%edi +leal -188(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-128(%ebp) +leal -196(%ebp),%edi +leal -192(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-124(%ebp) +leal -200(%ebp),%edi +leal -196(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-120(%ebp) +leal -204(%ebp),%edi +leal -200(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-116(%ebp) +leal -208(%ebp),%edi +leal -204(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-112(%ebp) +leal -212(%ebp),%edi +leal -208(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-108(%ebp) +leal -216(%ebp),%edi +leal -212(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-104(%ebp) +leal -220(%ebp),%edi +leal -216(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-100(%ebp) +leal -224(%ebp),%edi +leal -220(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-96(%ebp) +leal -228(%ebp),%edi +leal -224(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-92(%ebp) +leal -232(%ebp),%edi +leal -228(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-88(%ebp) +leal -236(%ebp),%edi +leal -232(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-84(%ebp) +leal -240(%ebp),%edi +leal -236(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-80(%ebp) +leal -244(%ebp),%edi +leal -240(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-76(%ebp) +leal -248(%ebp),%edi +leal -244(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-72(%ebp) +leal -256(%ebp),%edi +leal -248(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-68(%ebp) +movl -152(%ebp),%edi +movl %edi,-164(%ebp) +movl $1,-160(%ebp) +movl $0,-156(%ebp) +.LC3117: +movl -160(%ebp),%edi +cmpl $1,%edi +je .LC3123 +cmpl $2,%edi +je .LC3126 +cmpl $3,%edi +je .LC3131 +jmp .LC3121 +.LC3123: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -164(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3122 +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl (%esi,%edi,4),%edi +movl %edi,-264(%ebp) +movl $2,-160(%ebp) +movl $1,-260(%ebp) +jmp .LC3122 +.LC3126: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -164(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jne .LC3127 +movl $3,-160(%ebp) +jmp .LC3122 +.LC3127: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -264(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jne .LC3129 +incl -260(%ebp) +jmp .LC3122 +.LC3129: +movl $4,-160(%ebp) +jmp .LC3122 +.LC3131: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -164(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3122 +movl $4,-160(%ebp) +.LC3121: +.LC3122: +.LC3118: +incl -156(%ebp) +cmpl $22,-156(%ebp) +jl .LC3117 +cmpl $3,-160(%ebp) +jne .LC3134 +movl $16,%edi +movl %edi,%eax +subl -260(%ebp),%eax +jmp .LC3095 +.LC3134: +movl $-1,%eax +.LC3095: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3136: +.size regi,.Lf3136-regi +.globl regp +.align 16 +.type regp,@function +regp: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $264,%esp +leal -252(%ebp),%edi +movl %edi,-252(%ebp) +leal -228(%ebp),%edi +movl %edi,-228(%ebp) +leal -232(%ebp),%edi +movl %edi,-232(%ebp) +leal -236(%ebp),%edi +movl %edi,-236(%ebp) +leal -164(%ebp),%edi +movl %edi,-4(%ebp) +leal -164(%ebp),%edi +movl %edi,-164(%ebp) +leal -168(%ebp),%edi +movl %edi,-8(%ebp) +leal -168(%ebp),%edi +movl %edi,-168(%ebp) +leal -172(%ebp),%edi +movl %edi,-12(%ebp) +leal -172(%ebp),%edi +movl %edi,-172(%ebp) +leal -176(%ebp),%edi +movl %edi,-16(%ebp) +leal -176(%ebp),%edi +movl %edi,-176(%ebp) +leal -180(%ebp),%edi +movl %edi,-20(%ebp) +leal -180(%ebp),%edi +movl %edi,-180(%ebp) +leal -184(%ebp),%edi +movl %edi,-24(%ebp) +leal -184(%ebp),%edi +movl %edi,-184(%ebp) +leal -188(%ebp),%edi +movl %edi,-28(%ebp) +leal -188(%ebp),%edi +movl %edi,-188(%ebp) +leal -192(%ebp),%edi +movl %edi,-32(%ebp) +leal -192(%ebp),%edi +movl %edi,-192(%ebp) +leal -196(%ebp),%edi +movl %edi,-36(%ebp) +leal -196(%ebp),%edi +movl %edi,-196(%ebp) +leal -200(%ebp),%edi +movl %edi,-40(%ebp) +leal -200(%ebp),%edi +movl %edi,-200(%ebp) +leal -204(%ebp),%edi +movl %edi,-44(%ebp) +leal -204(%ebp),%edi +movl %edi,-204(%ebp) +leal -208(%ebp),%edi +movl %edi,-48(%ebp) +leal -208(%ebp),%edi +movl %edi,-208(%ebp) +leal -212(%ebp),%edi +movl %edi,-52(%ebp) +leal -212(%ebp),%edi +movl %edi,-212(%ebp) +leal -216(%ebp),%edi +movl %edi,-56(%ebp) +leal -216(%ebp),%edi +movl %edi,-216(%ebp) +leal -220(%ebp),%edi +movl %edi,-60(%ebp) +leal -220(%ebp),%edi +movl %edi,-220(%ebp) +leal -224(%ebp),%edi +movl %edi,-64(%ebp) +leal -224(%ebp),%edi +movl %edi,-224(%ebp) +leal -240(%ebp),%edi +movl %edi,-240(%ebp) +leal -244(%ebp),%edi +movl %edi,-244(%ebp) +leal -256(%ebp),%edi +movl %edi,-256(%ebp) +leal -228(%ebp),%edi +movl $4,%esi +leal -252(%ebp),%ebx +movl %edi,%edx +subl %ebx,%edx +movl %edx,%eax +movl %esi,%ecx +cdq +idivl %ecx +movl %eax,-152(%ebp) +leal -232(%ebp),%ebx +subl %edi,%ebx +movl %ebx,%eax +movl %esi,%ecx +cdq +idivl %ecx +movl %eax,-148(%ebp) +leal -236(%ebp),%edi +leal -232(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-144(%ebp) +leal -164(%ebp),%edi +leal -236(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-140(%ebp) +leal -168(%ebp),%edi +leal -164(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-136(%ebp) +leal -172(%ebp),%edi +leal -168(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-132(%ebp) +leal -176(%ebp),%edi +leal -172(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-128(%ebp) +leal -180(%ebp),%edi +leal -176(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-124(%ebp) +leal -184(%ebp),%edi +leal -180(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-120(%ebp) +leal -188(%ebp),%edi +leal -184(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-116(%ebp) +leal -192(%ebp),%edi +leal -188(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-112(%ebp) +leal -196(%ebp),%edi +leal -192(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-108(%ebp) +leal -200(%ebp),%edi +leal -196(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-104(%ebp) +leal -204(%ebp),%edi +leal -200(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-100(%ebp) +leal -208(%ebp),%edi +leal -204(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-96(%ebp) +leal -212(%ebp),%edi +leal -208(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-92(%ebp) +leal -216(%ebp),%edi +leal -212(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-88(%ebp) +leal -220(%ebp),%edi +leal -216(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-84(%ebp) +leal -224(%ebp),%edi +leal -220(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-80(%ebp) +leal -240(%ebp),%edi +leal -224(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-76(%ebp) +leal -244(%ebp),%edi +leal -240(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-72(%ebp) +leal -256(%ebp),%edi +leal -244(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +movl %eax,-68(%ebp) +movl -152(%ebp),%edi +movl %edi,-248(%ebp) +movl $1,-160(%ebp) +movl $0,-156(%ebp) +.LC3159: +movl -160(%ebp),%edi +cmpl $1,%edi +je .LC3165 +cmpl $2,%edi +je .LC3168 +cmpl $3,%edi +je .LC3173 +jmp .LC3163 +.LC3165: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -248(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3164 +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl (%esi,%edi,4),%edi +movl %edi,-264(%ebp) +movl $2,-160(%ebp) +movl $1,-260(%ebp) +jmp .LC3164 +.LC3168: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -248(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jne .LC3169 +movl $3,-160(%ebp) +jmp .LC3164 +.LC3169: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -264(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jne .LC3171 +incl -260(%ebp) +jmp .LC3164 +.LC3171: +movl $4,-160(%ebp) +jmp .LC3164 +.LC3173: +movl -156(%ebp),%edi +leal -152(%ebp),%esi +movl -248(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3164 +movl $4,-160(%ebp) +.LC3163: +.LC3164: +.LC3160: +incl -156(%ebp) +cmpl $22,-156(%ebp) +jl .LC3159 +cmpl $3,-160(%ebp) +jne .LC3176 +movl $16,%edi +movl %edi,%eax +subl -260(%ebp),%eax +jmp .LC3137 +.LC3176: +movl $-1,%eax +.LC3137: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3178: +.size regp,.Lf3178-regp +.bss +.align 4 +.type x3d.3180,@object +.size x3d.3180,420 +.lcomm x3d.3180,420 +.data +.align 1 +.type s84er.3181,@object +s84er.3181: +.byte 115 +.byte 56 +.byte 52 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s84er.3181,10 +.align 1 +.type qs84.3182,@object +.size qs84.3182,8 +qs84.3182: +.byte 115 +.byte 56 +.byte 52 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s84 +.text +.align 16 +.type s84,@function +s84: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $172,%esp +leal qs84.3182,%edi +movl %edi,-156(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-160(%ebp) +movl $0,-164(%ebp) +.LC3183: +.LC3184: +movl -160(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-160(%ebp) +movl -156(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-156(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC3183 +pushl $3 +call fip +addl $4,%esp +movl %eax,-168(%ebp) +movl -168(%ebp),%edi +cmpl $3,(,%edi) +je .LC3186 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3188 +pushl $1 +pushl $s84er.3181 +call printf +addl $8,%esp +.LC3188: +incl -164(%ebp) +.LC3186: +leal glork,%edi +movl %edi,-172(%ebp) +pushl $4 +call *-172(%ebp) +addl $4,%esp +cmpl $4,%eax +je .LC3190 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3192 +pushl $2 +pushl $s84er.3181 +call printf +addl $8,%esp +.LC3192: +addl $2,-164(%ebp) +.LC3190: +movl $0,-8(%ebp) +.LC3194: +movl -8(%ebp),%edi +leal -80(%ebp),%esi +pushl %edi +fildl (%esp) +addl $4,%esp +fstps (%esi,%edi,4) +movl -8(%ebp),%edi +leal (,%edi,4),%edi +leal -148(%ebp),%esi +leal -80(%ebp),%ebx +leal (%ebx,%edi),%ebx +movl %ebx,(%esi,%edi) +.LC3195: +incl -8(%ebp) +cmpl $17,-8(%ebp) +jl .LC3194 +flds .LC421 +fstps -152(%ebp) +movl $0,-8(%ebp) +.LC3198: +flds -152(%ebp) +movl -8(%ebp),%edi +leal -148(%ebp),%esi +movl (%esi,%edi,4),%edi +fadds (,%edi) +fstps -152(%ebp) +.LC3199: +incl -8(%ebp) +cmpl $17,-8(%ebp) +jl .LC3198 +flds .LC3204 +fcomps -152(%ebp) +fstsw %ax +sahf +je .LC3202 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3205 +pushl $4 +pushl $s84er.3181 +call printf +addl $8,%esp +.LC3205: +addl $4,-164(%ebp) +.LC3202: +movl $0,-12(%ebp) +.LC3207: +movl $0,-8(%ebp) +.LC3211: +movl $0,-4(%ebp) +.LC3215: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movl -12(%ebp),%ebx +imul $28,%esi,%edx +imul $140,%ebx,%ecx +leal x3d.3180(%ecx),%ecx +leal (%ecx,%edx),%edx +imul $35,%ebx,%ebx +imul $7,%esi,%esi +leal (%esi,%ebx),%esi +leal (%edi,%esi),%esi +movl %esi,(%edx,%edi,4) +.LC3216: +incl -4(%ebp) +cmpl $7,-4(%ebp) +jl .LC3215 +.LC3212: +incl -8(%ebp) +cmpl $5,-8(%ebp) +jl .LC3211 +.LC3208: +incl -12(%ebp) +cmpl $3,-12(%ebp) +jl .LC3207 +movl $1,-12(%ebp) +movl $2,-8(%ebp) +movl $3,-4(%ebp) +pushl $0 +pushl $105 +pushl $x3d.3180 +call array +addl $12,%esp +movl %eax,%edi +pushl $35 +pushl $35 +imul $140,-12(%ebp),%esi +leal x3d.3180(%esi),%esi +pushl %esi +call array +addl $12,%esp +movl %eax,%esi +pushl $49 +pushl $7 +imul $28,-8(%ebp),%ebx +imul $140,-12(%ebp),%edx +leal x3d.3180(%edx),%edx +leal (%edx,%ebx),%ebx +pushl %ebx +call array +addl $12,%esp +leal (%esi,%edi),%edi +leal (%eax,%edi),%edi +movl -4(%ebp),%esi +imul $28,-8(%ebp),%ebx +imul $140,-12(%ebp),%edx +leal x3d.3180(%edx),%edx +leal (%edx,%ebx),%ebx +movl (%ebx,%esi,4),%esi +leal (%esi,%edi),%edi +subl $52,%edi +cmpl $0,%edi +je .LC3219 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3221 +pushl $8 +pushl $s84er.3181 +call printf +addl $8,%esp +.LC3221: +addl $8,-164(%ebp) +.LC3219: +movl -164(%ebp),%eax +.LC3179: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3223: +.size s84,.Lf3223-s84 +.globl array +.align 16 +.type array,@function +array: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $0,-4(%ebp) +jmp .LC3228 +.LC3225: +movl -4(%ebp),%edi +movl 20(%ebp),%esi +movl 28(%ebp),%ebx +leal (%ebx,%edi),%ebx +cmpl %ebx,(%esi,%edi,4) +je .LC3229 +movl $1,%eax +jmp .LC3224 +.LC3229: +.LC3226: +incl -4(%ebp) +.LC3228: +movl 24(%ebp),%edi +cmpl %edi,-4(%ebp) +jl .LC3225 +movl $0,%eax +.LC3224: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3231: +.size array,.Lf3231-array +.bss +.align 4 +.type y.3233,@object +.size y.3233,4 +.lcomm y.3233,4 +.globl fip +.text +.align 16 +.type fip,@function +fip: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +leal y.3233,%edi +movl 20(%ebp),%esi +movl %esi,y.3233 +movl %edi,%eax +.LC3232: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3234: +.size fip,.Lf3234-fip +.globl glork +.align 16 +.type glork,@function +glork: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%eax +.LC3235: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3236: +.size glork,.Lf3236-glork +.data +.align 1 +.type s85er.3238,@object +s85er.3238: +.byte 115 +.byte 56 +.byte 53 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s85er.3238,10 +.align 1 +.type qs85.3239,@object +.size qs85.3239,8 +qs85.3239: +.byte 115 +.byte 56 +.byte 53 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 4 +.type type.3247,@object +type.3247: +.long .LC434 +.long .LC436 +.long .LC435 +.long .LC437 +.long .LC438 +.long .LC439 +.long .LC440 +.size type.3247,28 +.align 1 +.type aln.3248,@object +aln.3248: +.byte 32 +.byte 97 +.byte 108 +.byte 105 +.byte 103 +.byte 110 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 58 +.byte 32 +.byte 0 +.size aln.3248,13 +.globl s85 +.text +.align 16 +.type s85,@function +s85: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $404,%esp +leal qs85.3239,%edi +movl %edi,-276(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-280(%ebp) +movl $0,-320(%ebp) +.LC3252: +.LC3253: +movl -280(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-280(%ebp) +movl -276(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-276(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC3252 +leal -296(%ebp),%edi +leal -316(%ebp),%esi +subl %esi,%edi +cmpl $0,%edi +jle .LC3263 +leal -292(%ebp),%edi +leal -296(%ebp),%esi +subl %esi,%edi +cmpl $0,%edi +jle .LC3263 +leal -288(%ebp),%edi +leal -292(%ebp),%esi +subl %esi,%edi +cmpl $0,%edi +jg .LC3255 +.LC3263: +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3264 +pushl $1 +pushl $s85er.3238 +call printf +addl $8,%esp +.LC3264: +incl -320(%ebp) +.LC3255: +leal -355(%ebp),%edi +leal -356(%ebp),%esi +subl %esi,%edi +movl %edi,-272(%ebp) +leal -358(%ebp),%edi +leal -360(%ebp),%esi +subl %esi,%edi +movl %edi,-268(%ebp) +leal -364(%ebp),%edi +leal -368(%ebp),%esi +subl %esi,%edi +movl %edi,-264(%ebp) +leal -372(%ebp),%edi +leal -376(%ebp),%esi +subl %esi,%edi +movl %edi,-260(%ebp) +leal -380(%ebp),%edi +leal -384(%ebp),%esi +subl %esi,%edi +movl %edi,-256(%ebp) +leal -388(%ebp),%edi +leal -392(%ebp),%esi +subl %esi,%edi +movl %edi,-252(%ebp) +leal -400(%ebp),%edi +leal -404(%ebp),%esi +subl %esi,%edi +movl %edi,-248(%ebp) +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC3279 +movl $0,-244(%ebp) +.LC3281: +movl -244(%ebp),%edi +leal (,%edi,4),%edi +leal -272(%ebp),%esi +pushl (%esi,%edi) +pushl $aln.3248 +pushl type.3247(%edi) +pushl $.LC3285 +call printf +addl $16,%esp +.LC3282: +incl -244(%ebp) +cmpl $7,-244(%ebp) +jl .LC3281 +.LC3279: +movl -284(%ebp),%edi +orl $56,%edi +movl %edi,-284(%ebp) +movl -284(%ebp),%edi +movl %edi,%esi +andl $0xfffffffc,%esi +sall $26,%edi +sarl $29,%edi +sall $30,%edi +sarl $30,%edi +andl $3,%edi +orl %edi,%esi +movl %esi,-284(%ebp) +movl -284(%ebp),%edi +movl %edi,%esi +andl $0xffffffc7,%esi +sall $30,%edi +sarl $30,%edi +sall $29,%edi +sarl $29,%edi +leal (,%edi,8),%edi +andl $56,%edi +orl %edi,%esi +movl %esi,-284(%ebp) +movl -284(%ebp),%edi +sall $26,%edi +sarl $29,%edi +cmpl $3,%edi +je .LC3286 +movl -284(%ebp),%edi +sall $26,%edi +sarl $29,%edi +cmpl $-1,%edi +jne .LC3288 +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC3289 +pushl $.LC3292 +call printf +addl $4,%esp +jmp .LC3289 +.LC3288: +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3293 +pushl $2 +pushl $s85er.3238 +call printf +addl $8,%esp +.LC3293: +addl $2,-320(%ebp) +.LC3289: +.LC3286: +movl -284(%ebp),%edi +orl $64,%edi +movl %edi,-284(%ebp) +movl -284(%ebp),%edi +sall $25,%edi +sarl $31,%edi +cmpl $1,%edi +je .LC3295 +movl 20(%ebp),%edi +cmpl $0,40(%edi) +je .LC3297 +pushl $.LC3299 +call printf +addl $4,%esp +.LC3297: +.LC3295: +leal -240(%ebp),%edi +movl %edi,%esi +subl %edi,%esi +cmpl $0,%esi +jne .LC3307 +cmpl $0,%esi +jne .LC3307 +cmpl $0,%esi +jne .LC3307 +cmpl $0,%esi +jne .LC3307 +cmpl $0,%esi +jne .LC3307 +cmpl $0,%esi +jne .LC3307 +cmpl $0,%esi +je .LC3300 +.LC3307: +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3308 +pushl $4 +pushl $s85er.3238 +call printf +addl $8,%esp +.LC3308: +addl $4,-320(%ebp) +.LC3300: +jmp .LC3310 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3312 +pushl $8 +pushl $s85er.3238 +call printf +addl $8,%esp +.LC3312: +addl $8,-320(%ebp) +.LC3310: +leal -352(%ebp),%edi +movl %edi,-288(%ebp) +movb $2,-352(%ebp) +movl -288(%ebp),%edi +movsbl (,%edi),%esi +leal 1(%esi),%esi +movl %esi,%ebx +movb %bl,(,%edi) +movsbl -352(%ebp),%edi +cmpl $3,%edi +je .LC3316 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3318 +pushl $16 +pushl $s85er.3238 +call printf +addl $8,%esp +.LC3318: +addl $16,-320(%ebp) +.LC3316: +movl -320(%ebp),%eax +.LC3237: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3320: +.size s85,.Lf3320-s85 +.data +.align 1 +.type s86er.3322,@object +s86er.3322: +.byte 115 +.byte 56 +.byte 54 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s86er.3322,10 +.align 1 +.type qs86.3323,@object +.size qs86.3323,8 +qs86.3323: +.byte 115 +.byte 56 +.byte 54 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.align 4 +.type x.3324,@object +x.3324: +.long 1 +.long 3 +.long 5 +.size x.3324,12 +.align 4 +.type pint.3325,@object +.size pint.3325,4 +pint.3325: +.long x.3324+8 +.bss +.align 4 +.type zero.3327,@object +.size zero.3327,40 +.lcomm zero.3327,40 +.data +.align 4 +.type y0.3328,@object +y0.3328: +.long 1065353216 +.long 1077936128 +.long 1084227584 +.long 1073741824 +.long 1082130432 +.long 1086324736 +.long 1077936128 +.long 1084227584 +.long 1088421888 +.long 0 +.long 0 +.long 0 +.size y0.3328,48 +.align 4 +.type y1.3329,@object +.size y1.3329,48 +y1.3329: +.long 1065353216 +.long 1077936128 +.long 1084227584 +.long 1073741824 +.long 1082130432 +.long 1086324736 +.long 1077936128 +.long 1084227584 +.long 1088421888 +.space 12 +.align 4 +.type y2.3330,@object +.size y2.3330,48 +y2.3330: +.long 1065353216 +.long 1077936128 +.long 1084227584 +.long 1073741824 +.long 1082130432 +.long 1086324736 +.long 1077936128 +.long 1084227584 +.long 1088421888 +.space 12 +.align 4 +.type y3.3331,@object +.size y3.3331,48 +y3.3331: +.long 1065353216 +.space 8 +.long 1073741824 +.space 8 +.long 1077936128 +.space 8 +.long 1082130432 +.space 8 +.globl s86 +.text +.align 16 +.type s86,@function +s86: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $40,%esp +movl pint.3325,%edi +leal -4(%edi),%edi +movl %edi,-36(%ebp) +call one +movl -36(%ebp),%esi +leal (%esi,%eax,4),%edi +movl %edi,-4(%ebp) +leal qs86.3323,%edi +movl %edi,-24(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-28(%ebp) +movl $0,-32(%ebp) +.LC3332: +.LC3333: +movl -28(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-28(%ebp) +movl -24(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-24(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC3332 +movl pint.3325,%edi +cmpl $5,(,%edi) +je .LC3335 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3337 +pushl $1 +pushl $s86er.3322 +call printf +addl $8,%esp +.LC3337: +incl -32(%ebp) +.LC3335: +movl -36(%ebp),%edi +cmpl $3,(,%edi) +je .LC3339 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3341 +pushl $2 +pushl $s86er.3322 +call printf +addl $8,%esp +.LC3341: +addl $2,-32(%ebp) +.LC3339: +movl -4(%ebp),%edi +cmpl $5,(,%edi) +je .LC3343 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3345 +pushl $4 +pushl $s86er.3322 +call printf +addl $8,%esp +.LC3345: +addl $4,-32(%ebp) +.LC3343: +movl $0,-20(%ebp) +movl $0,-8(%ebp) +.LC3347: +movl -8(%ebp),%edi +cmpl $0,zero.3327(,%edi,4) +je .LC3351 +movl $1,-20(%ebp) +.LC3351: +.LC3348: +incl -8(%ebp) +cmpl $10,-8(%ebp) +jl .LC3347 +cmpl $0,-20(%ebp) +je .LC3353 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3355 +pushl $8 +pushl $s86er.3322 +call printf +addl $8,%esp +.LC3355: +addl $8,-32(%ebp) +.LC3353: +movl $0,-20(%ebp) +movl $0,-12(%ebp) +.LC3357: +movl $0,-8(%ebp) +.LC3361: +imul $3,-12(%ebp),%edi +movl -8(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,-16(%ebp) +movl -8(%ebp),%edi +leal (,%edi,4),%edi +imul $12,-12(%ebp),%esi +leal y1.3329(%esi),%ebx +flds (%ebx,%edi) +fstps -40(%ebp) +leal y2.3330(%esi),%esi +flds (%esi,%edi) +fcomps -40(%ebp) +fstsw %ax +sahf +jne .LC3367 +movl -16(%ebp),%edi +flds y0.3328(,%edi,4) +fcomps -40(%ebp) +fstsw %ax +sahf +je .LC3365 +.LC3367: +movl $1,-20(%ebp) +.LC3365: +.LC3362: +incl -8(%ebp) +cmpl $3,-8(%ebp) +jl .LC3361 +.LC3358: +incl -12(%ebp) +cmpl $4,-12(%ebp) +jl .LC3357 +cmpl $0,-20(%ebp) +je .LC3368 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3370 +pushl $16 +pushl $s86er.3322 +call printf +addl $8,%esp +.LC3370: +addl $16,-32(%ebp) +.LC3368: +movl $0,-20(%ebp) +movl $0,-8(%ebp) +.LC3372: +movl -8(%ebp),%edi +imul $12,%edi,%esi +leal 1(%edi),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fcomps y3.3331(%esi) +fstsw %ax +sahf +je .LC3376 +movl $1,-20(%ebp) +.LC3376: +.LC3373: +incl -8(%ebp) +cmpl $4,-8(%ebp) +jl .LC3372 +cmpl $0,-20(%ebp) +je .LC3378 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3380 +pushl $32 +pushl $s86er.3322 +call printf +addl $8,%esp +.LC3380: +addl $32,-32(%ebp) +.LC3378: +movl -32(%ebp),%eax +.LC3321: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3382: +.size s86,.Lf3382-s86 +.globl one +.align 16 +.type one,@function +one: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl $1,%eax +.LC3383: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3384: +.size one,.Lf3384-one +.data +.align 1 +.type s88er.3386,@object +s88er.3386: +.byte 115 +.byte 56 +.byte 56 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s88er.3386,10 +.align 1 +.type qs88.3387,@object +.size qs88.3387,8 +qs88.3387: +.byte 115 +.byte 56 +.byte 56 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s88 +.text +.align 16 +.type s88,@function +s88: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $44,%esp +leal qs88.3387,%edi +movl %edi,-4(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-8(%ebp) +movl $0,-12(%ebp) +.LC3389: +.LC3390: +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movl -4(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-4(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC3389 +jmp .LC3392 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3394 +pushl $1 +pushl $s88er.3386 +call printf +addl $8,%esp +.LC3394: +incl -12(%ebp) +.LC3392: +leal -32(%ebp),%edi +movl %edi,metricp +movl $2,-32(%ebp) +movl metricp,%edi +movl $3,(,%edi) +cmpl $3,-32(%ebp) +je .LC3396 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3398 +pushl $2 +pushl $s88er.3386 +call printf +addl $8,%esp +.LC3398: +addl $2,-12(%ebp) +.LC3396: +fldl .LC428 +fstpl -28(%ebp) +fldl .LC428 +fstpl -20(%ebp) +leal -28(%ebp),%edi +movl %edi,-36(%ebp) +movl -36(%ebp),%edi +fldl .LC427 +fstpl (,%edi) +movl -36(%ebp),%edi +fldl .LC427 +fstpl 8(%edi) +fldl -28(%ebp) +faddl -20(%ebp) +fldl .LC425 +fcompp +fstsw %ax +sahf +je .LC3401 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3404 +pushl $4 +pushl $s88er.3386 +call printf +addl $8,%esp +.LC3404: +addl $4,-12(%ebp) +.LC3401: +movl -12(%ebp),%eax +.LC3385: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3406: +.size s88,.Lf3406-s88 +.data +.align 1 +.type s9er.3408,@object +s9er.3408: +.byte 115 +.byte 57 +.byte 44 +.byte 101 +.byte 114 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.size s9er.3408,9 +.align 1 +.type qs9.3409,@object +.size qs9.3409,8 +qs9.3409: +.byte 115 +.byte 57 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 0 +.globl s9 +.text +.align 16 +.type s9,@function +s9: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $36,%esp +leal qs9.3409,%edi +movl %edi,-12(%ebp) +movl 20(%ebp),%edi +leal 60(%edi),%edi +movl %edi,-16(%ebp) +movl $0,-20(%ebp) +.LC3410: +.LC3411: +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +movl -12(%ebp),%esi +leal 1(%esi),%ebx +movl %ebx,-12(%ebp) +movb (,%esi),%bl +movb %bl,(,%edi) +movsbl %bl,%edi +cmpl $0,%edi +jne .LC3410 +movl $0,-8(%ebp) +movl $0,-4(%ebp) +.LC3413: +movl $2,-24(%ebp) +movl $2,-28(%ebp) +movl $3,-32(%ebp) +movl $3,-36(%ebp) +cmpl $3,-36(%ebp) +jne .LC3419 +cmpl $3,-32(%ebp) +je .LC3417 +.LC3419: +movl $1,-8(%ebp) +.LC3417: +cmpl $2,-28(%ebp) +jne .LC3422 +cmpl $2,-24(%ebp) +je .LC3420 +.LC3422: +movl $1,-8(%ebp) +.LC3420: +.LC3414: +incl -4(%ebp) +cmpl $2,-4(%ebp) +jl .LC3413 +cmpl $0,-8(%ebp) +je .LC3427 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3425 +pushl $1 +pushl $s9er.3408 +call printf +addl $8,%esp +.LC3425: +incl -20(%ebp) +jmp .LC3427 +movl 20(%ebp),%edi +cmpl $0,44(%edi) +je .LC3428 +pushl $2 +pushl $s9er.3408 +call printf +addl $8,%esp +.LC3428: +addl $2,-20(%ebp) +.LC3427: +movl -20(%ebp),%eax +.LC3407: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3430: +.size s9,.Lf3430-s9 +.globl setev +.align 16 +.type setev,@function +setev: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl $1066,extvar +movl $0,%eax +.LC3431: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3432: +.size setev,.Lf3432-setev +.bss +.globl rfs +.align 1 +.type rfs,@object +.size rfs,8 +.comm rfs,8 +.globl crc +.align 4 +.type crc,@object +.size crc,4 +.comm crc,4 +.globl rrc +.align 4 +.type rrc,@object +.size rrc,4 +.comm rrc,4 +.globl flgl +.align 4 +.type flgl,@object +.size flgl,4 +.comm flgl,4 +.globl flgd +.align 4 +.type flgd,@object +.size flgd,4 +.comm flgd,4 +.globl flgm +.align 4 +.type flgm,@object +.size flgm,4 +.comm flgm,4 +.globl flgs +.align 4 +.type flgs,@object +.size flgs,4 +.comm flgs,4 +.globl dprec +.align 4 +.type dprec,@object +.size dprec,4 +.comm dprec,4 +.globl fprec +.align 4 +.type fprec,@object +.size fprec,4 +.comm fprec,4 +.globl dbits +.align 4 +.type dbits,@object +.size dbits,4 +.comm dbits,4 +.globl fbits +.align 4 +.type fbits,@object +.size fbits,4 +.comm fbits,4 +.globl ubits +.align 4 +.type ubits,@object +.size ubits,4 +.comm ubits,4 +.globl lbits +.align 4 +.type lbits,@object +.size lbits,4 +.comm lbits,4 +.globl metricp +.align 4 +.type metricp,@object +.size metricp,4 +.comm metricp,4 +.globl extvar +.align 4 +.type extvar,@object +.size extvar,4 +.comm extvar,4 +.data +.align 1 +.LC3299: +.byte 66 +.byte 101 +.byte 32 +.byte 101 +.byte 115 +.byte 112 +.byte 101 +.byte 99 +.byte 105 +.byte 97 +.byte 108 +.byte 108 +.byte 121 +.byte 32 +.byte 99 +.byte 97 +.byte 114 +.byte 101 +.byte 102 +.byte 117 +.byte 108 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 49 +.byte 45 +.byte 98 +.byte 105 +.byte 116 +.byte 32 +.byte 102 +.byte 105 +.byte 101 +.byte 108 +.byte 100 +.byte 115 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC3292: +.byte 83 +.byte 105 +.byte 103 +.byte 110 +.byte 32 +.byte 101 +.byte 120 +.byte 116 +.byte 101 +.byte 110 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 102 +.byte 105 +.byte 101 +.byte 108 +.byte 100 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC3285: +.byte 37 +.byte 115 +.byte 37 +.byte 115 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 4 +.LC3204: +.long 1124597760 +.align 1 +.LC3047: +.byte 112 +.byte 111 +.byte 105 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 0 +.align 1 +.LC2495: +.byte 73 +.byte 110 +.byte 99 +.byte 114 +.byte 101 +.byte 97 +.byte 115 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 97 +.byte 114 +.byte 114 +.byte 97 +.byte 121 +.byte 32 +.byte 101 +.byte 108 +.byte 101 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 97 +.byte 115 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 101 +.byte 100 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 100 +.byte 101 +.byte 99 +.byte 114 +.byte 101 +.byte 97 +.byte 115 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 108 +.byte 111 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 10 +.byte 0 +.align 4 +.LC2378: +.long 1104150528 +.align 4 +.LC2377: +.long 0 +.long 1077542912 +.align 4 +.LC1678: +.long 0 +.long 1074003968 +.align 4 +.LC1503: +.long 0 +.long 1076101120 +.align 4 +.LC1474: +.long 1092616192 +.align 4 +.LC1299: +.long 0 +.long 1074266112 +.align 4 +.LC1270: +.long 1077936128 +.align 4 +.LC1095: +.long 0 +.long 1075576832 +.align 4 +.LC1066: +.long 1088421888 +.align 4 +.LC889: +.long 0 +.long 1075052544 +.align 4 +.LC860: +.long 1084227584 +.align 4 +.LC855: +.long 0 +.long 1105199104 +.align 4 +.LC847: +.long 1325400064 +.align 1 +.LC669: +.byte 113 +.byte 117 +.byte 101 +.byte 101 +.byte 112 +.byte 0 +.align 1 +.LC654: +.byte 10 +.byte 0 +.align 1 +.LC653: +.byte 37 +.byte 100 +.byte 0 +.align 1 +.LC648: +.byte 32 +.byte 32 +.byte 32 +.byte 107 +.byte 101 +.byte 121 +.byte 61 +.byte 0 +.align 4 +.LC611: +.long 0 +.long 1073741824 +.align 4 +.LC551: +.long 0 +.long 1087276160 +.align 4 +.LC550: +.long 0 +.long 1079984128 +.align 4 +.LC549: +.long 1123680256 +.align 4 +.LC544: +.long 1073741824 +.align 1 +.LC440: +.byte 100 +.byte 111 +.byte 117 +.byte 98 +.byte 108 +.byte 101 +.byte 0 +.align 1 +.LC439: +.byte 102 +.byte 108 +.byte 111 +.byte 97 +.byte 116 +.byte 0 +.align 1 +.LC438: +.byte 117 +.byte 110 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 101 +.byte 100 +.byte 0 +.align 1 +.LC437: +.byte 108 +.byte 111 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC436: +.byte 115 +.byte 104 +.byte 111 +.byte 114 +.byte 116 +.byte 0 +.align 1 +.LC435: +.byte 105 +.byte 110 +.byte 116 +.byte 0 +.align 1 +.LC434: +.byte 99 +.byte 104 +.byte 97 +.byte 114 +.byte 0 +.align 4 +.LC428: +.long 0 +.long 0 +.align 4 +.LC427: +.long 0 +.long 1072693248 +.align 4 +.LC426: +.long 0 +.long 1074790400 +.align 4 +.LC425: +.long 0 +.long 1073741824 +.align 4 +.LC421: +.long 0 +.align 4 +.LC420: +.long 1065353216 +.align 1 +.LC398: +.byte 113 +.byte 117 +.byte 101 +.byte 101 +.byte 112 +.byte 33 +.byte 0 +.align 1 +.LC387: +.byte 10 +.byte 9 +.byte 8 +.byte 13 +.byte 12 +.byte 92 +.byte 39 +.byte 0 +.align 1 +.LC383: +.byte 46 +.byte 34 +.byte 46 +.byte 0 +.align 1 +.LC370: +.byte 46 +.byte 46 +.byte 46 +.byte 0 +.align 4 +.LC340: +.long 0 +.long 1083410432 +.align 1 +.LC201: +.byte 32 +.byte 32 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 114 +.byte 101 +.byte 115 +.byte 117 +.byte 108 +.byte 116 +.byte 115 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 110 +.byte 32 +.byte 97 +.byte 115 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 101 +.byte 100 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 108 +.byte 111 +.byte 110 +.byte 103 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC200: +.byte 68 +.byte 101 +.byte 99 +.byte 105 +.byte 109 +.byte 97 +.byte 108 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 111 +.byte 99 +.byte 116 +.byte 97 +.byte 108 +.byte 47 +.byte 104 +.byte 101 +.byte 120 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 115 +.byte 116 +.byte 97 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 115 +.byte 111 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 109 +.byte 101 +.byte 115 +.byte 32 +.byte 103 +.byte 105 +.byte 118 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC27: +.byte 10 +.byte 70 +.byte 97 +.byte 105 +.byte 108 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC26: +.byte 10 +.byte 78 +.byte 111 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 115 +.byte 32 +.byte 100 +.byte 101 +.byte 116 +.byte 101 +.byte 99 +.byte 116 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC20: +.byte 83 +.byte 101 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 37 +.byte 115 +.byte 32 +.byte 114 +.byte 101 +.byte 116 +.byte 117 +.byte 114 +.byte 110 +.byte 101 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/cvt.1bk b/quake3/source/lcc/x86/linux/tst/cvt.1bk new file mode 100644 index 0000000..74c79f1 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cvt.1bk @@ -0,0 +1,11 @@ +1 1 1 1 1 1 1 1 1.000000 1.000000 1.000000 +2 2 2 2 2 2 2 2 2.000000 2.000000 2.000000 +3 3 3 3 3 3 3 3 3.000000 3.000000 3.000000 +4 4 4 4 4 4 4 4 4.000000 4.000000 4.000000 +5 5 5 5 5 5 5 5 5.000000 5.000000 5.000000 +6 6 6 6 6 6 6 6 6.000000 6.000000 6.000000 +7 7 7 7 7 7 7 7 7.000000 7.000000 7.000000 +8 8 8 8 8 8 8 8 8.000000 8.000000 8.000000 +9 9 9 9 9 9 9 9 9.000000 9.000000 9.000000 +10 10 10 10 10 10 10 10 10.000000 10.000000 10.000000 +11 11 11 11 11 11 11 11 11.000000 11.000000 11.000000 diff --git a/quake3/source/lcc/x86/linux/tst/cvt.2bk b/quake3/source/lcc/x86/linux/tst/cvt.2bk new file mode 100644 index 0000000..b3ab360 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cvt.2bk @@ -0,0 +1,2 @@ +tst/cvt.c:32: warning: conversion from `pointer to void function(void)' to `pointer to void' is compiler dependent +tst/cvt.c:33: warning: conversion from `pointer to void' to `pointer to void function(void)' is compiler dependent diff --git a/quake3/source/lcc/x86/linux/tst/cvt.sbk b/quake3/source/lcc/x86/linux/tst/cvt.sbk new file mode 100644 index 0000000..06b427b --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/cvt.sbk @@ -0,0 +1,792 @@ +.globl print +.text +.align 16 +.type print,@function +print: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +fldl D +subl $8,%esp +fstpl (%esp) +fldl d +subl $8,%esp +fstpl (%esp) +flds f +subl $8,%esp +fstpl (%esp) +pushl L +pushl I +movw S,%di +movzwl %di,%edi +pushl %edi +movb C,%bl +movzbl %bl,%edi +pushl %edi +pushl l +pushl i +movswl s,%edi +pushl %edi +movsbl c,%edi +pushl %edi +pushl $.LC2 +call printf +addl $60,%esp +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf3: +.size print,.Lf3-print +.globl main +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $296,%esp +movb $1,c +movsbl c,%edi +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,l +movl %edi,%esi +movl %esi,%ebx +movb %bl,C +movl %esi,%ebx +movw %bx,S +movl %esi,I +movl %esi,L +pushl %edi +fildl (%esp) +addl $4,%esp +fstps f +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -8(%ebp) +fldl -8(%ebp) +fstpl d +fldl -8(%ebp) +fstpl D +call print +movw $2,s +movswl s,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,i +movl %edi,l +movl %edi,%esi +movl %esi,%ebx +movb %bl,C +movl %esi,%ebx +movw %bx,S +movl %esi,I +movl %esi,L +pushl %edi +fildl (%esp) +addl $4,%esp +fstps f +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -16(%ebp) +fldl -16(%ebp) +fstpl d +fldl -16(%ebp) +fstpl D +call print +movl $3,i +movl i,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,l +movl %edi,%esi +movl %esi,%ebx +movb %bl,C +movl %esi,%ebx +movw %bx,S +movl %esi,I +movl %esi,L +pushl %edi +fildl (%esp) +addl $4,%esp +fstps f +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -24(%ebp) +fldl -24(%ebp) +fstpl d +fldl -24(%ebp) +fstpl D +call print +movl $4,l +movl l,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,%esi +movl %esi,%ebx +movb %bl,C +movl %esi,%ebx +movw %bx,S +movl %esi,I +movl %esi,L +pushl %edi +fildl (%esp) +addl $4,%esp +fstps f +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -32(%ebp) +fldl -32(%ebp) +fstpl d +fldl -32(%ebp) +fstpl D +call print +movb $5,C +movb C,%bl +movzbl %bl,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,l +movl %edi,%esi +movl %esi,%ebx +movw %bx,S +movl %esi,I +movl %esi,L +pushl %edi +fildl (%esp) +addl $4,%esp +fstps f +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -40(%ebp) +fldl -40(%ebp) +fstpl d +fldl -40(%ebp) +fstpl D +call print +movw $6,S +movw S,%di +movzwl %di,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,l +movl %edi,%esi +movl %esi,%ebx +movb %bl,C +movl %esi,I +movl %esi,L +pushl %edi +fildl (%esp) +addl $4,%esp +fstps f +pushl %edi +fildl (%esp) +addl $4,%esp +fstpl -48(%ebp) +fldl -48(%ebp) +fstpl d +fldl -48(%ebp) +fstpl D +call print +movl $7,I +movl I,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%ebx +movw %bx,s +movl %edi,i +movl %edi,l +movl %edi,%ebx +movb %bl,C +movl %edi,%esi +movw %si,S +movl %edi,L +fldl .LC5 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstpl -56(%ebp) +fldl -56(%ebp) +fstps f +fldl -56(%ebp) +fstpl d +fldl -56(%ebp) +fstpl D +call print +movl $8,L +movl L,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%ebx +movw %bx,s +movl %edi,i +movl %edi,l +movl %edi,%ebx +movb %bl,C +movl %edi,%esi +movw %si,S +movw S,%si +movzwl %si,%esi +movl %esi,I +fldl .LC5 +movl %edi,%esi +shrl $1,%esi +pushl %esi +fildl (%esp) +addl $4,%esp +fmulp %st(1),%st +andl $1,%edi +pushl %edi +fildl (%esp) +addl $4,%esp +faddp %st(1),%st +fstpl -64(%ebp) +fldl -64(%ebp) +fstps f +fldl -64(%ebp) +fstpl d +fldl -64(%ebp) +fstpl D +call print +flds .LC6 +fstps f +flds f +fstps -84(%ebp) +flds -84(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,l +flds .LC10 +fcomps -84(%ebp) +fstsw %ax +sahf +ja .LC8 +flds -84(%ebp) +fsubs .LC10 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-68(%ebp) +jmp .LC9 +.LC8: +flds -84(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-68(%ebp) +.LC9: +movl -68(%ebp),%edi +movl %edi,%ebx +movb %bl,C +flds .LC10 +fcomps f +fstsw %ax +sahf +ja .LC12 +flds f +fsubs .LC10 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-72(%ebp) +jmp .LC13 +.LC12: +flds f +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-72(%ebp) +.LC13: +movl -72(%ebp),%edi +movw %di,S +flds .LC10 +fcomps f +fstsw %ax +sahf +ja .LC15 +flds f +fsubs .LC10 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-76(%ebp) +jmp .LC16 +.LC15: +flds f +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-76(%ebp) +.LC16: +movl -76(%ebp),%edi +movl %edi,I +flds .LC10 +fcomps f +fstsw %ax +sahf +ja .LC18 +flds f +fsubs .LC10 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-80(%ebp) +jmp .LC19 +.LC18: +flds f +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-80(%ebp) +.LC19: +movl -80(%ebp),%edi +movl %edi,L +flds f +fstpl -120(%ebp) +fldl -120(%ebp) +fstpl d +fldl -120(%ebp) +fstpl D +call print +fldl .LC20 +fstpl d +fldl d +fstpl -144(%ebp) +fldl -144(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,l +fldl .LC24 +fcompl -144(%ebp) +fstsw %ax +sahf +ja .LC22 +fldl -144(%ebp) +fsubl .LC24 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-124(%ebp) +jmp .LC23 +.LC22: +fldl -144(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-124(%ebp) +.LC23: +movl -124(%ebp),%edi +movl %edi,%ebx +movb %bl,C +fldl .LC24 +fcompl d +fstsw %ax +sahf +ja .LC26 +fldl d +fsubl .LC24 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-128(%ebp) +jmp .LC27 +.LC26: +fldl d +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-128(%ebp) +.LC27: +movl -128(%ebp),%edi +movw %di,S +fldl .LC24 +fcompl d +fstsw %ax +sahf +ja .LC29 +fldl d +fsubl .LC24 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-132(%ebp) +jmp .LC30 +.LC29: +fldl d +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-132(%ebp) +.LC30: +movl -132(%ebp),%edi +movl %edi,I +fldl .LC24 +fcompl d +fstsw %ax +sahf +ja .LC32 +fldl d +fsubl .LC24 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-136(%ebp) +jmp .LC33 +.LC32: +fldl d +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-136(%ebp) +.LC33: +movl -136(%ebp),%edi +movl %edi,L +fldl d +fstps f +fldl d +fstpl D +call print +fldl .LC34 +fstpl D +fldl D +fstpl -232(%ebp) +fldl -232(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,%ebx +movb %bl,c +movl %edi,%esi +movw %si,s +movl %edi,i +movl %edi,l +fldl .LC38 +fcompl -232(%ebp) +fstsw %ax +sahf +ja .LC36 +fldl -232(%ebp) +fsubl .LC38 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-212(%ebp) +jmp .LC37 +.LC36: +fldl -232(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-212(%ebp) +.LC37: +movl -212(%ebp),%edi +movl %edi,%ebx +movb %bl,C +fldl .LC38 +fcompl D +fstsw %ax +sahf +ja .LC40 +fldl D +fsubl .LC38 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-216(%ebp) +jmp .LC41 +.LC40: +fldl D +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-216(%ebp) +.LC41: +movl -216(%ebp),%edi +movw %di,S +fldl .LC38 +fcompl D +fstsw %ax +sahf +ja .LC43 +fldl D +fsubl .LC38 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-220(%ebp) +jmp .LC44 +.LC43: +fldl D +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-220(%ebp) +.LC44: +movl -220(%ebp),%edi +movl %edi,I +fldl .LC38 +fcompl D +fstsw %ax +sahf +ja .LC46 +fldl D +fsubl .LC38 +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +leal 0x80000000(%edi),%edi +movl %edi,-224(%ebp) +jmp .LC47 +.LC46: +fldl D +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,%edi +movl %edi,-224(%ebp) +.LC47: +movl -224(%ebp),%edi +movl %edi,L +fldl D +fstps f +fldl D +fstpl d +call print +movl $0,p +movl $0,p +movl $0,p +movl $0,p +movl P,%edi +movl %edi,p +movl $0,P +movl $0,P +movl $0,P +movl $0,P +movl p,%edi +movl %edi,P +movl $0,%eax +.LC4: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf48: +.size main,.Lf48-main +.bss +.globl P +.align 4 +.type P,@object +.size P,4 +.comm P,4 +.globl p +.align 4 +.type p,@object +.size p,4 +.comm p,4 +.globl D +.align 4 +.type D,@object +.size D,8 +.comm D,8 +.globl d +.align 4 +.type d,@object +.size d,8 +.comm d,8 +.globl f +.align 4 +.type f,@object +.size f,4 +.comm f,4 +.globl L +.align 4 +.type L,@object +.size L,4 +.comm L,4 +.globl I +.align 4 +.type I,@object +.size I,4 +.comm I,4 +.globl S +.align 2 +.type S,@object +.size S,2 +.comm S,2 +.globl C +.align 1 +.type C,@object +.size C,1 +.comm C,1 +.globl l +.align 4 +.type l,@object +.size l,4 +.comm l,4 +.globl i +.align 4 +.type i,@object +.size i,4 +.comm i,4 +.globl s +.align 2 +.type s,@object +.size s,2 +.comm s,2 +.globl c +.align 1 +.type c,@object +.size c,1 +.comm c,1 +.data +.align 4 +.LC38: +.long 0 +.long 1105199104 +.align 4 +.LC34: +.long 0 +.long 1076232192 +.align 4 +.LC24: +.long 0 +.long 1105199104 +.align 4 +.LC20: +.long 0 +.long 1076101120 +.align 4 +.LC10: +.long 1325400064 +.align 4 +.LC6: +.long 1091567616 +.align 4 +.LC5: +.long 0 +.long 1073741824 +.align 1 +.LC2: +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 108 +.byte 100 +.byte 32 +.byte 37 +.byte 117 +.byte 32 +.byte 37 +.byte 117 +.byte 32 +.byte 37 +.byte 117 +.byte 32 +.byte 37 +.byte 108 +.byte 117 +.byte 32 +.byte 37 +.byte 102 +.byte 32 +.byte 37 +.byte 102 +.byte 32 +.byte 37 +.byte 108 +.byte 102 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/fields.1bk b/quake3/source/lcc/x86/linux/tst/fields.1bk new file mode 100644 index 0000000..f30b13f --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/fields.1bk @@ -0,0 +1,5 @@ +x = 1 2 3 4 -3 6 +y = 3 8 9 +x = 1 2 3 0 0 6 +y = 2 8 16 +p->a = 0x3, p->b = 0xf diff --git a/quake3/source/lcc/x86/linux/tst/fields.2bk b/quake3/source/lcc/x86/linux/tst/fields.2bk new file mode 100644 index 0000000..e689d78 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/fields.2bk @@ -0,0 +1,4 @@ +tst/fields.c:6: warning: initializer exceeds bit-field width +tst/fields.c:8: warning: initializer exceeds bit-field width +tst/fields.c:30: warning: missing return value +tst/fields.c:34: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/fields.sbk b/quake3/source/lcc/x86/linux/tst/fields.sbk new file mode 100644 index 0000000..44607ae --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/fields.sbk @@ -0,0 +1,321 @@ +.data +.globl x +.align 4 +.type x,@object +.size x,16 +x: +.long 1 +.byte 2 +.space 3 +.byte 3 +.byte 64 +.space 2 +.byte 80 +.byte 6 +.space 2 +.globl i +.align 4 +.type i,@object +.size i,4 +i: +.long 16 +.globl y +.align 4 +.type y,@object +.size y,8 +y: +.byte 35 +.space 3 +.byte 9 +.byte 0 +.byte 0 +.byte 0 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movsbl x+13,%edi +pushl %edi +movl x+12,%edi +sall $25,%edi +sarl $29,%edi +pushl %edi +movl x+8,%edi +sall $16,%edi +sarl $28,%edi +pushl %edi +movl x+8,%edi +sall $20,%edi +sarl $20,%edi +pushl %edi +movsbl x+4,%edi +pushl %edi +pushl x +pushl $.LC4 +call printf +addl $28,%esp +pushl y+4 +movl y,%edi +movl %edi,%esi +shrl $2,%esi +andl $15,%esi +pushl %esi +andl $3,%edi +pushl %edi +pushl $.LC10 +call printf +addl $16,%esp +movl x+8,%edi +andl $0xffff0fff,%edi +movl i,%esi +sall $28,%esi +sarl $28,%esi +shll $12,%esi +andl $0xf000,%esi +orl %esi,%edi +movl %edi,x+8 +movl x+12,%edi +andl $0xffffff8f,%edi +movl %edi,x+12 +movsbl x+13,%edi +pushl %edi +movl x+12,%edi +sall $25,%edi +sarl $29,%edi +pushl %edi +movl x+8,%edi +sall $16,%edi +sarl $28,%edi +pushl %edi +movl x+8,%edi +sall $20,%edi +sarl $20,%edi +pushl %edi +movsbl x+4,%edi +pushl %edi +pushl x +pushl $.LC4 +call printf +addl $28,%esp +movl y,%edi +andl $0xfffffffc,%edi +orl $2,%edi +movl %edi,y +movl i,%edi +movl %edi,y+4 +pushl y+4 +movl y,%edi +movl %edi,%esi +shrl $2,%esi +andl $15,%esi +pushl %esi +andl $3,%edi +pushl %edi +pushl $.LC10 +call printf +addl $16,%esp +pushl $x +call f2 +addl $4,%esp +movl $0,%eax +.LC3: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf21: +.size main,.Lf21-main +.globl f1 +.align 16 +.type f1,@function +f1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +andl $0xffffffc3,(,%edi) +movl 20(%ebp),%edi +movl (,%edi),%esi +andl $0xfffffffc,%esi +movl $0,%ebx +andl $3,%ebx +andl $3,%ebx +orl %ebx,%esi +movl %esi,(,%edi) +movl 20(%ebp),%edi +movl (,%edi),%edi +andl $60,%edi +cmpl $0,%edi +je .LC23 +pushl $.LC25 +call printf +addl $4,%esp +.LC23: +movl 20(%ebp),%edi +orl $3,(,%edi) +movl 20(%ebp),%edi +orl $60,(,%edi) +movl 20(%ebp),%edi +movl (,%edi),%edi +movl %edi,%esi +shrl $2,%esi +andl $15,%esi +pushl %esi +andl $3,%edi +pushl %edi +pushl $.LC26 +call printf +addl $12,%esp +movl $0,%eax +.LC22: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf27: +.size f1,.Lf27-f1 +.globl f2 +.align 16 +.type f2,@function +f2: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +cmpl $0,i +jne .LC30 +movl $1,-4(%ebp) +jmp .LC31 +.LC30: +movl $0,-4(%ebp) +.LC31: +movl 20(%ebp),%edi +movl (,%edi),%esi +andl $0xfffffffc,%esi +movl -4(%ebp),%ebx +andl $3,%ebx +andl $3,%ebx +orl %ebx,%esi +movl %esi,(,%edi) +movl 20(%ebp),%edi +pushl %edi +call f1 +addl $4,%esp +movl (,%edi),%esi +andl $0xffffffc3,%esi +movl $0,%ebx +andl $15,%ebx +leal (,%ebx,4),%ebx +andl $60,%ebx +orl %ebx,%esi +movl %esi,(,%edi) +movl $0,%eax +.LC28: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf32: +.size f2,.Lf32-f2 +.data +.align 1 +.LC26: +.byte 112 +.byte 45 +.byte 62 +.byte 97 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 120 +.byte 37 +.byte 120 +.byte 44 +.byte 32 +.byte 112 +.byte 45 +.byte 62 +.byte 98 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 120 +.byte 37 +.byte 120 +.byte 10 +.byte 0 +.align 1 +.LC25: +.byte 112 +.byte 45 +.byte 62 +.byte 98 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC10: +.byte 121 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC4: +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/front.2bk b/quake3/source/lcc/x86/linux/tst/front.2bk new file mode 100644 index 0000000..841e6a5 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/front.2bk @@ -0,0 +1,29 @@ +tst/front.c:3: warning: missing return value +tst/front.c:10: warning: missing return value +tst/front.c:20: type error in argument 1 to `s'; found `pointer to struct D' expected `pointer to incomplete struct D defined at tst/front.c:14' +tst/front.c:21: warning: missing return value +tst/front.c:32: warning: missing return value +tst/front.c:36: operands of = have illegal types `pointer to int' and `pointer to const int' +tst/front.c:38: warning: missing return value +tst/front.c:62: operands of = have illegal types `pointer to char' and `pointer to const void' +tst/front.c:63: warning: missing return value +tst/front.c:68: warning: missing return value +tst/front.c:69: warning: inconsistent linkage for `yy' previously declared at tst/front.c:68 +tst/front.c:69: warning: missing return value +tst/front.c:71: invalid storage class `static' for `int function goo' +tst/front.c:71: warning: declaration of `goo' does not match previous declaration at tst/front.c:70 +tst/front.c:71: warning: missing return value +tst/front.c:74: warning: declaration of `xr' does not match previous declaration at tst/front.c:72 +tst/front.c:74: warning: missing return value +tst/front.c:81: warning: missing return value +tst/front.c:82: warning: declaration of `ss2' does not match previous declaration at tst/front.c:81 +tst/front.c:84: warning: inconsistent linkage for `ss5' previously declared at tst/front.c:80 +tst/front.c:92: type error in argument 1 to `gx1'; found `pointer to double' expected `double' +tst/front.c:92: warning: missing return value +tst/front.c:95: redeclaration of `hx1' previously declared at tst/front.c:94 +tst/front.c:98: warning: missing return value +tst/front.c:101: conflicting argument declarations for function `gg1' +tst/front.c:101: warning: missing return value +tst/front.c:112: type error in argument 4 to `qsort'; found `pointer to int function(pointer to pointer to char,pointer to pointer to char)' expected `pointer to int function(pointer to const void,pointer to const void)' +tst/front.c:113: warning: missing return value +tst/front.c:120: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/front.sbk b/quake3/source/lcc/x86/linux/tst/front.sbk new file mode 100644 index 0000000..348b6fe --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/front.sbk @@ -0,0 +1,530 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl $0 +call exit +addl $4,%esp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2: +.size main,.Lf2-main +.globl nested +.align 16 +.type nested,@function +nested: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +cmpl $4,20(%ebp) +jge .LC7 +cmpl $114,24(%ebp) +je .LC10 +.LC7: +cmpl $1,20(%ebp) +jne .LC9 +movl 24(%ebp),%edi +cmpl $104,%edi +je .LC10 +cmpl $105,%edi +je .LC10 +.LC9: +cmpl $2,20(%ebp) +jne .LC4 +movl 24(%ebp),%edi +cmpl $111,%edi +je .LC10 +cmpl $121,%edi +jne .LC4 +.LC10: +movl 24(%ebp),%edi +movl %edi,20(%ebp) +.LC4: +movl $0,%eax +.LC3: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf11: +.size nested,.Lf11-nested +.globl s +.align 16 +.type s,@function +s: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +.LC12: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf13: +.size s,.Lf13-s +.data +.globl Dy +.align 4 +.type Dy,@object +.size Dy,8 +Dy: +.long 0 +.space 4 +.globl Dz +.align 4 +.type Dz,@object +.size Dz,8 +Dz: +.long 1 +.space 4 +.globl Dfunc +.text +.align 16 +.type Dfunc,@function +Dfunc: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf16: +.size Dfunc,.Lf16-Dfunc +.globl f +.align 16 +.type f,@function +f: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf18: +.size f,.Lf18-f +.globl f1 +.align 16 +.type f1,@function +f1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf20: +.size f1,.Lf20-f1 +.globl f2 +.align 16 +.type f2,@function +f2: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf22: +.size f2,.Lf22-f2 +.globl g +.align 16 +.type g,@function +g: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf24: +.size g,.Lf24-g +.globl h +.align 16 +.type h,@function +h: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf26: +.size h,.Lf26-h +.globl h1 +.align 16 +.type h1,@function +h1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf28: +.size h1,.Lf28-h1 +.globl h2 +.align 16 +.type h2,@function +h2: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf30: +.size h2,.Lf30-h2 +.data +.align 4 +.type yy.32,@object +.size yy.32,4 +yy.32: +.long 1 +.globl set1 +.text +.align 16 +.type set1,@function +set1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf33: +.size set1,.Lf33-set1 +.data +.align 4 +.type yy.35,@object +.size yy.35,4 +yy.35: +.long 2 +.globl set2 +.text +.align 16 +.type set2,@function +set2: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf36: +.size set2,.Lf36-set2 +.align 16 +.type goo,@function +goo: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf38: +.size goo,.Lf38-goo +.globl sss +.align 16 +.type sss,@function +sss: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf40: +.size sss,.Lf40-sss +.bss +.align 4 +.type xr.42,@object +.size xr.42,4 +.lcomm xr.42,4 +.globl rrr +.text +.align 16 +.type rrr,@function +rrr: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf43: +.size rrr,.Lf43-rrr +.globl setstatic +.align 16 +.type setstatic,@function +setstatic: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf45: +.size setstatic,.Lf45-setstatic +.globl gx1 +.align 16 +.type gx1,@function +gx1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf47: +.size gx1,.Lf47-gx1 +.globl ff1 +.align 16 +.type ff1,@function +ff1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf49: +.size ff1,.Lf49-ff1 +.globl gg1 +.align 16 +.type gg1,@function +gg1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf51: +.size gg1,.Lf51-gg1 +.globl hh1 +.align 16 +.type hh1,@function +hh1: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf53: +.size hh1,.Lf53-hh1 +.globl cmp +.align 16 +.type cmp,@function +cmp: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf55: +.size cmp,.Lf55-cmp +.globl sort +.align 16 +.type sort,@function +sort: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf57: +.size sort,.Lf57-sort +.globl onearg +.align 16 +.type onearg,@function +onearg: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf65: +.size onearg,.Lf65-onearg +.bss +.globl ss4 +.align 4 +.type ss4,@object +.size ss4,4 +.comm ss4,4 +.align 4 +.type ss2,@object +.size ss2,4 +.lcomm ss2,4 +.align 4 +.type ss5,@object +.size ss5,4 +.lcomm ss5,4 +.globl ss3 +.align 4 +.type ss3,@object +.size ss3,4 +.comm ss3,4 +.align 4 +.type ss1,@object +.size ss1,4 +.lcomm ss1,4 +.align 4 +.type yy,@object +.size yy,4 +.lcomm yy,4 +.globl z +.align 4 +.type z,@object +.size z,4 +.comm z,4 +.globl y +.align 4 +.type y,@object +.size y,4 +.comm y,4 +.globl x +.align 4 +.type x,@object +.size x,4 +.comm x,4 +.globl b +.align 4 +.type b,@object +.size b,4 +.comm b,4 +.globl a +.align 4 +.type a,@object +.size a,4 +.comm a,4 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/incr.1bk b/quake3/source/lcc/x86/linux/tst/incr.1bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/linux/tst/incr.2bk b/quake3/source/lcc/x86/linux/tst/incr.2bk new file mode 100644 index 0000000..b86c400 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/incr.2bk @@ -0,0 +1,9 @@ +tst/incr.c:1: warning: missing return value +tst/incr.c:6: warning: expression with no effect elided +tst/incr.c:6: warning: expression with no effect elided +tst/incr.c:11: warning: missing return value +tst/incr.c:16: warning: expression with no effect elided +tst/incr.c:16: warning: expression with no effect elided +tst/incr.c:21: warning: missing return value +tst/incr.c:30: warning: missing return value +tst/incr.c:39: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/incr.sbk b/quake3/source/lcc/x86/linux/tst/incr.sbk new file mode 100644 index 0000000..1179a8a --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/incr.sbk @@ -0,0 +1,181 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2: +.size main,.Lf2-main +.globl memchar +.align 16 +.type memchar,@function +memchar: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl -8(%ebp),%edi +leal 1(%edi),%edi +movl %edi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl -8(%ebp),%edi +leal -1(%edi),%esi +movl %esi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl -8(%ebp),%edi +leal -1(%edi),%edi +movl %edi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl $0,%eax +.LC3: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf4: +.size memchar,.Lf4-memchar +.globl memint +.align 16 +.type memint,@function +memint: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl -8(%ebp),%edi +leal 4(%edi),%esi +movl %esi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl -8(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl -8(%ebp),%edi +leal -4(%edi),%esi +movl %esi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl -8(%ebp),%edi +leal -4(%edi),%edi +movl %edi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl $0,%eax +.LC5: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf6: +.size memint,.Lf6-memint +.globl regchar +.align 16 +.type regchar,@function +regchar: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl -8(%ebp),%edi +leal 1(%edi),%edi +movl %edi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl -8(%ebp),%edi +leal -1(%edi),%esi +movl %esi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl -8(%ebp),%edi +leal -1(%edi),%edi +movl %edi,-8(%ebp) +movb (,%edi),%bl +movb %bl,-1(%ebp) +movl $0,%eax +.LC7: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf8: +.size regchar,.Lf8-regchar +.globl regint +.align 16 +.type regint,@function +regint: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl -8(%ebp),%edi +leal 4(%edi),%esi +movl %esi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl -8(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl -8(%ebp),%edi +leal -4(%edi),%esi +movl %esi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl -8(%ebp),%edi +leal -4(%edi),%edi +movl %edi,-8(%ebp) +movl (,%edi),%edi +movl %edi,-4(%ebp) +movl $0,%eax +.LC9: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf10: +.size regint,.Lf10-regint +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/init.1bk b/quake3/source/lcc/x86/linux/tst/init.1bk new file mode 100644 index 0000000..042f3bb --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/init.1bk @@ -0,0 +1,16 @@ + 1 2 3 4 + 5 6 + 7 +if +for +else +while +1 2 3 if +4 5 0 for +6 7 8 else +9 10 11 while +1 2 3 if +4 5 0 for +6 7 8 else +9 10 11 while +0 0 0 diff --git a/quake3/source/lcc/x86/linux/tst/init.2bk b/quake3/source/lcc/x86/linux/tst/init.2bk new file mode 100644 index 0000000..da08062 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/init.2bk @@ -0,0 +1,3 @@ +tst/init.c:36: warning: missing return value +tst/init.c:49: warning: missing return value +tst/init.c:59: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/init.sbk b/quake3/source/lcc/x86/linux/tst/init.sbk new file mode 100644 index 0000000..843e281 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/init.sbk @@ -0,0 +1,336 @@ +.data +.globl words +.align 4 +.type words,@object +words: +.long 1 +.long 2 +.long 3 +.byte 105 +.byte 102 +.byte 0 +.space 3 +.space 2 +.long 4 +.long 5 +.space 4 +.byte 102 +.byte 111 +.byte 114 +.space 3 +.space 2 +.long 6 +.long 7 +.long 8 +.byte 101 +.byte 108 +.byte 115 +.byte 101 +.byte 0 +.space 1 +.space 2 +.long 9 +.long 10 +.long 11 +.byte 119 +.byte 104 +.byte 105 +.byte 108 +.byte 101 +.space 1 +.space 2 +.long 0 +.space 8 +.space 8 +.size words,100 +.globl wordlist +.align 4 +.type wordlist,@object +.size wordlist,4 +wordlist: +.long words +.globl x +.align 4 +.type x,@object +x: +.long 1 +.long 2 +.long 3 +.long 4 +.long 0 +.long 5 +.long 6 +.space 12 +.long 7 +.space 16 +.size x,60 +.globl y +.align 4 +.type y,@object +y: +.long x +.long x+20 +.long x+40 +.long 0 +.size y,16 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl $0,-8(%ebp) +jmp .LC8 +.LC5: +movl $0,-4(%ebp) +jmp .LC12 +.LC9: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movl y(,%esi,4),%esi +pushl (%esi,%edi,4) +pushl $.LC13 +call printf +addl $8,%esp +.LC10: +incl -4(%ebp) +.LC12: +movl -4(%ebp),%edi +movl -8(%ebp),%esi +movl y(,%esi,4),%esi +cmpl $0,(%esi,%edi,4) +jne .LC9 +pushl $.LC14 +call printf +addl $4,%esp +.LC6: +incl -8(%ebp) +.LC8: +movl -8(%ebp),%edi +movl y(,%edi,4),%edi +cmpl $0,%edi +jne .LC5 +call f +pushl wordlist +call g +addl $4,%esp +movl $0,%eax +.LC4: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf15: +.size main,.Lf15-main +.data +.align 4 +.type keywords.17,@object +keywords.17: +.long .LC18 +.long .LC19 +.long .LC20 +.long .LC21 +.long 0 +.size keywords.17,20 +.globl f +.text +.align 16 +.type f,@function +f: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +leal keywords.17,%edi +movl %edi,-4(%ebp) +jmp .LC25 +.LC22: +movl -4(%ebp),%edi +pushl (,%edi) +pushl $.LC26 +call printf +addl $8,%esp +.LC23: +movl -4(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-4(%ebp) +.LC25: +movl -4(%ebp),%edi +movl (,%edi),%edi +cmpl $0,%edi +jne .LC22 +movl $0,%eax +.LC16: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf27: +.size f,.Lf27-f +.globl g +.align 16 +.type g,@function +g: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +jmp .LC32 +.LC29: +movl $0,-4(%ebp) +jmp .LC36 +.LC33: +movl -4(%ebp),%edi +movl 20(%ebp),%esi +pushl (%esi,%edi,4) +pushl $.LC37 +call printf +addl $8,%esp +.LC34: +incl -4(%ebp) +.LC36: +movl -4(%ebp),%edi +cmpl $3,%edi +jb .LC33 +movl 20(%ebp),%edi +leal 12(%edi),%edi +pushl %edi +pushl $.LC26 +call printf +addl $8,%esp +.LC30: +movl 20(%ebp),%edi +leal 20(%edi),%edi +movl %edi,20(%ebp) +.LC32: +movl 20(%ebp),%edi +cmpl $0,(,%edi) +jne .LC29 +call h +movl $0,%eax +.LC28: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf38: +.size g,.Lf38-g +.globl h +.align 16 +.type h,@function +h: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $0,-4(%ebp) +jmp .LC43 +.LC40: +imul $20,-4(%ebp),%edi +leal words+12(%edi),%esi +pushl %esi +pushl words+8(%edi) +pushl words+4(%edi) +pushl words(%edi) +pushl $.LC44 +call printf +addl $20,%esp +.LC41: +incl -4(%ebp) +.LC43: +movl -4(%ebp),%edi +cmpl $5,%edi +jb .LC40 +movl $0,%eax +.LC39: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf48: +.size h,.Lf48-h +.data +.align 1 +.LC44: +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC37: +.byte 37 +.byte 100 +.byte 32 +.byte 0 +.align 1 +.LC26: +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC21: +.byte 119 +.byte 104 +.byte 105 +.byte 108 +.byte 101 +.byte 0 +.align 1 +.LC20: +.byte 101 +.byte 108 +.byte 115 +.byte 101 +.byte 0 +.align 1 +.LC19: +.byte 102 +.byte 111 +.byte 114 +.byte 0 +.align 1 +.LC18: +.byte 105 +.byte 102 +.byte 0 +.align 1 +.LC14: +.byte 10 +.byte 0 +.align 1 +.LC13: +.byte 32 +.byte 37 +.byte 100 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/limits.1bk b/quake3/source/lcc/x86/linux/tst/limits.1bk new file mode 100644 index 0000000..f0c1dc8 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/limits.1bk @@ -0,0 +1,14 @@ +UCHAR_MAX: 000000ff=255 +USHRT_MAX: 0000ffff=65535 +UINT_MAX: ffffffff=-1 +ULONG_MAX: ffffffff=-1 +CHAR_MAX: 0000007f=127 +SCHAR_MAX: 0000007f=127 +SHRT_MAX: 00007fff=32767 +INT_MAX: 7fffffff=2147483647 +LONG_MAX: 7fffffff=2147483647 +CHAR_MIN: ffffff80=-128 +SCHAR_MIN: ffffff80=-128 +SHRT_MIN: ffff8000=-32768 +INT_MIN: 80000000=-2147483648 +LONG_MIN: 80000000=-2147483648 diff --git a/quake3/source/lcc/x86/linux/tst/limits.2bk b/quake3/source/lcc/x86/linux/tst/limits.2bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/linux/tst/limits.sbk b/quake3/source/lcc/x86/linux/tst/limits.sbk new file mode 100644 index 0000000..bed5d18 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/limits.sbk @@ -0,0 +1,396 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl $255 +pushl $255 +pushl $.LC2 +call printf +addl $12,%esp +pushl $65535 +pushl $65535 +pushl $.LC3 +call printf +addl $12,%esp +pushl $0xffffffff +pushl $0xffffffff +pushl $.LC4 +call printf +addl $12,%esp +pushl $0xffffffff +pushl $0xffffffff +pushl $.LC5 +call printf +addl $12,%esp +pushl $127 +pushl $127 +pushl $.LC6 +call printf +addl $12,%esp +pushl $127 +pushl $127 +pushl $.LC7 +call printf +addl $12,%esp +pushl $32767 +pushl $32767 +pushl $.LC8 +call printf +addl $12,%esp +pushl $2147483647 +pushl $2147483647 +pushl $.LC9 +call printf +addl $12,%esp +pushl $2147483647 +pushl $2147483647 +pushl $.LC10 +call printf +addl $12,%esp +pushl $-128 +pushl $-128 +pushl $.LC11 +call printf +addl $12,%esp +pushl $-128 +pushl $-128 +pushl $.LC12 +call printf +addl $12,%esp +pushl $-32768 +pushl $-32768 +pushl $.LC13 +call printf +addl $12,%esp +pushl $-2147483648 +pushl $-2147483648 +pushl $.LC14 +call printf +addl $12,%esp +pushl $-2147483648 +pushl $-2147483648 +pushl $.LC15 +call printf +addl $12,%esp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf16: +.size main,.Lf16-main +.data +.align 1 +.LC15: +.byte 76 +.byte 79 +.byte 78 +.byte 71 +.byte 95 +.byte 77 +.byte 73 +.byte 78 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 108 +.byte 120 +.byte 61 +.byte 37 +.byte 108 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC14: +.byte 73 +.byte 78 +.byte 84 +.byte 95 +.byte 77 +.byte 73 +.byte 78 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC13: +.byte 83 +.byte 72 +.byte 82 +.byte 84 +.byte 95 +.byte 77 +.byte 73 +.byte 78 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC12: +.byte 83 +.byte 67 +.byte 72 +.byte 65 +.byte 82 +.byte 95 +.byte 77 +.byte 73 +.byte 78 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC11: +.byte 67 +.byte 72 +.byte 65 +.byte 82 +.byte 95 +.byte 77 +.byte 73 +.byte 78 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC10: +.byte 76 +.byte 79 +.byte 78 +.byte 71 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 108 +.byte 120 +.byte 61 +.byte 37 +.byte 108 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC9: +.byte 73 +.byte 78 +.byte 84 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC8: +.byte 83 +.byte 72 +.byte 82 +.byte 84 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC7: +.byte 83 +.byte 67 +.byte 72 +.byte 65 +.byte 82 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC6: +.byte 67 +.byte 72 +.byte 65 +.byte 82 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC5: +.byte 85 +.byte 76 +.byte 79 +.byte 78 +.byte 71 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 108 +.byte 120 +.byte 61 +.byte 37 +.byte 108 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC4: +.byte 85 +.byte 73 +.byte 78 +.byte 84 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC3: +.byte 85 +.byte 83 +.byte 72 +.byte 82 +.byte 84 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC2: +.byte 85 +.byte 67 +.byte 72 +.byte 65 +.byte 82 +.byte 95 +.byte 77 +.byte 65 +.byte 88 +.byte 58 +.byte 9 +.byte 37 +.byte 48 +.byte 56 +.byte 120 +.byte 61 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/paranoia.1bk b/quake3/source/lcc/x86/linux/tst/paranoia.1bk new file mode 100644 index 0000000..da344e6 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/paranoia.1bk @@ -0,0 +1,183 @@ +Lest this program stop prematurely, i.e. before displaying + + `END OF TEST', + +try to persuade the computer NOT to terminate execution when an +error like Over/Underflow or Division by Zero occurs, but rather +to persevere with a surrogate value after, perhaps, displaying some +warning. If persuasion avails naught, don't despair but run this +program anyway to see how many milestones it passes, and then +amend it to make further progress. + +Answer questions with Y, y, N or n (unless otherwise indicated). + + +Diagnosis resumes after milestone Number 0 Page: 1 + +Users are invited to help debug and augment this program so it will +cope with unanticipated and newly uncovered arithmetic pathologies. + +Please send suggestions and interesting results to + Richard Karpinski + Computer Center U-76 + University of California + San Francisco, CA 94143-0704, USA + +In doing so, please include the following information: + Precision: double; + Version: 10 February 1989; + Computer: + + Compiler: + + Optimization level: + + Other relevant compiler options: + +Diagnosis resumes after milestone Number 1 Page: 2 + +Running this program should reveal these characteristics: + Radix = 1, 2, 4, 8, 10, 16, 100, 256 ... + Precision = number of significant digits carried. + U2 = Radix/Radix^Precision = One Ulp + (OneUlpnit in the Last Place) of 1.000xxx . + U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 . + Adequacy of guard digits for Mult., Div. and Subt. + Whether arithmetic is chopped, correctly rounded, or something else + for Mult., Div., Add/Subt. and Sqrt. + Whether a Sticky Bit used correctly for rounding. + UnderflowThreshold = an underflow threshold. + E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy. + V = an overflow threshold, roughly. + V0 tells, roughly, whether Infinity is represented. + Comparisions are checked for consistency with subtraction + and for contamination with pseudo-zeros. + Sqrt is tested. Y^X is not tested. + Extra-precise subexpressions are revealed but NOT YET tested. + Decimal-Binary conversion is NOT YET tested for accuracy. + +Diagnosis resumes after milestone Number 2 Page: 3 + +The program attempts to discriminate among + FLAWs, like lack of a sticky bit, + Serious DEFECTs, like lack of a guard digit, and + FAILUREs, like 2+2 == 5 . +Failures may confound subsequent diagnoses. + +The diagnostic capabilities of this program go beyond an earlier +program called `MACHAR', which can be found at the end of the +book `Software Manual for the Elementary Functions' (1980) by +W. J. Cody and W. Waite. Although both programs try to discover +the Radix, Precision and range (over/underflow thresholds) +of the arithmetic, this program tries to cope with a wider variety +of pathologies, and to say how well the arithmetic is implemented. + +The program is based upon a conventional radix representation for +floating-point numbers, but also allows logarithmic encoding +as used by certain early WANG machines. + +BASIC version of this program (C) 1983 by Prof. W. M. Kahan; +see source comments for more history. + +Diagnosis resumes after milestone Number 3 Page: 4 + +Program is now RUNNING tests on small integers: +-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K. + +Searching for Radix and Precision. +Radix = 2.000000 . +Closest relative separation found is U1 = 1.1102230e-16 . + +Recalculating radix and precision + confirms closest relative separation U1 . +Radix confirmed. +The number of significant digits of the Radix is 53.000000 . +Some subexpressions appear to be calculated extra +precisely with about 11 extra B-digits, i.e. +roughly 3.31133 extra significant decimals. +That feature is not tested further by this program. + +Diagnosis resumes after milestone Number 30 Page: 5 + +Subtraction appears to be normalized, as it should be. +Checking for guard digit in *, /, and -. + *, /, and - appear to have guard digits, as they should. + +Diagnosis resumes after milestone Number 40 Page: 6 + +Checking rounding on multiply, divide and add/subtract. +* is neither chopped nor correctly rounded. +/ is neither chopped nor correctly rounded. +Addition/Subtraction neither rounds nor chops. +Sticky bit used incorrectly or not at all. +FLAW: lack(s) of guard digits or failure(s) to correctly round or chop +(noted above) count as one flaw in the final tally below. + +Does Multiplication commute? Testing on 20 random pairs. + No failures found in 20 integer pairs. + +Running test of square root(x). +Testing if sqrt(X * X) == X for 20 Integers X. +Test for sqrt monotonicity. +sqrt has passed a test for Monotonicity. +Testing whether sqrt is rounded or chopped. +Square root is neither chopped nor correctly rounded. +Observed errors run from -5.0000000e-01 to 5.0000000e-01 ulps. + +Diagnosis resumes after milestone Number 90 Page: 7 + +Testing powers Z^i for small Integers Z and i. +... no discrepancis found. + +Seeking Underflow thresholds UfThold and E0. +Smallest strictly positive number found is E0 = 4.94066e-324 . +Since comparison denies Z = 0, evaluating (Z + Z) / Z should be safe. +What the machine gets for (Z + Z) / Z is 2.00000000000000000e+00 . +This is O.K., provided Over/Underflow has NOT just been signaled. +Underflow is gradual; it incurs Absolute Error = +(roundoff in UfThold) < E0. +The Underflow threshold is 2.22507385850720188e-308, below which +calculation may suffer larger Relative error than merely roundoff. +Since underflow occurs below the threshold +UfThold = (2.00000000000000000e+00) ^ (-1.02200000000000000e+03) +only underflow should afflict the expression + (2.00000000000000000e+00) ^ (-1.02200000000000000e+03); +actually calculating yields: 0.00000000000000000e+00 . +This computed value is O.K. + +Testing X^((X + 1) / (X - 1)) vs. exp(2) = 7.38905609893065218e+00 as X -> 1. +Accuracy seems adequate. +Testing powers Z^Q at four nearly extreme values. + ... no discrepancies found. + + +Diagnosis resumes after milestone Number 160 Page: 8 + +Searching for Overflow threshold: +This may generate an error. +Can `Z = -Y' overflow? +Trying it on Y = -Inf . +Seems O.K. +Overflow threshold is V = 1.79769313486231571e+308 . +Overflow saturates at V0 = Inf . +No Overflow should be signaled for V * 1 = 1.79769313486231571e+308 + nor for V / 1 = 1.79769313486231571e+308 . +Any overflow signal separating this * from the one +above is a DEFECT. + + +Diagnosis resumes after milestone Number 190 Page: 9 + + +What message and/or values does Division by Zero produce? + Trying to compute 1 / 0 produces ... Inf . + + Trying to compute 0 / 0 produces ... NaN . + +Diagnosis resumes after milestone Number 220 Page: 10 + + +The number of FLAWs discovered = 1. + +The arithmetic diagnosed seems Satisfactory though flawed. +END OF TEST. diff --git a/quake3/source/lcc/x86/linux/tst/paranoia.2bk b/quake3/source/lcc/x86/linux/tst/paranoia.2bk new file mode 100644 index 0000000..f6ddf16 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/paranoia.2bk @@ -0,0 +1,16 @@ +tst/paranoia.c:1867: warning: missing return value +tst/paranoia.c:1874: warning: missing return value +tst/paranoia.c:1884: warning: missing return value +tst/paranoia.c:1924: warning: missing return value +tst/paranoia.c:1939: warning: missing return value +tst/paranoia.c:1956: warning: missing return value +tst/paranoia.c:1975: warning: missing return value +tst/paranoia.c:1988: warning: missing return value +tst/paranoia.c:1995: warning: missing return value +tst/paranoia.c:2055: warning: missing return value +tst/paranoia.c:2062: warning: missing return value +tst/paranoia.c:2070: warning: missing return value +tst/paranoia.c:2087: warning: missing return value +tst/paranoia.c:2115: warning: missing return value +tst/paranoia.c:2144: warning: missing return value +tst/paranoia.c:2173: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/paranoia.sbk b/quake3/source/lcc/x86/linux/tst/paranoia.sbk new file mode 100644 index 0000000..79c571c --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/paranoia.sbk @@ -0,0 +1,20248 @@ +.data +.globl Zero +.align 4 +.type Zero,@object +.size Zero,8 +Zero: +.long 0 +.long 0 +.globl Half +.align 4 +.type Half,@object +.size Half,8 +Half: +.long 0 +.long 1071644672 +.globl One +.align 4 +.type One,@object +.size One,8 +One: +.long 0 +.long 1072693248 +.globl Two +.align 4 +.type Two,@object +.size Two,8 +Two: +.long 0 +.long 1073741824 +.globl Three +.align 4 +.type Three,@object +.size Three,8 +Three: +.long 0 +.long 1074266112 +.globl Four +.align 4 +.type Four,@object +.size Four,8 +Four: +.long 0 +.long 1074790400 +.globl Five +.align 4 +.type Five,@object +.size Five,8 +Five: +.long 0 +.long 1075052544 +.globl Eight +.align 4 +.type Eight,@object +.size Eight,8 +Eight: +.long 0 +.long 1075838976 +.globl Nine +.align 4 +.type Nine,@object +.size Nine,8 +Nine: +.long 0 +.long 1075970048 +.globl TwentySeven +.align 4 +.type TwentySeven,@object +.size TwentySeven,8 +TwentySeven: +.long 0 +.long 1077608448 +.globl ThirtyTwo +.align 4 +.type ThirtyTwo,@object +.size ThirtyTwo,8 +ThirtyTwo: +.long 0 +.long 1077936128 +.globl TwoForty +.align 4 +.type TwoForty,@object +.size TwoForty,8 +TwoForty: +.long 0 +.long 1080950784 +.globl MinusOne +.align 4 +.type MinusOne,@object +.size MinusOne,8 +MinusOne: +.long 0 +.long -1074790400 +.globl OneAndHalf +.align 4 +.type OneAndHalf,@object +.size OneAndHalf,8 +OneAndHalf: +.long 0 +.long 1073217536 +.globl NoTrials +.align 4 +.type NoTrials,@object +.size NoTrials,4 +NoTrials: +.long 20 +.globl sigfpe +.text +.align 16 +.type sigfpe,@function +sigfpe: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +incl fpecount +pushl $.LC3 +call printf +addl $4,%esp +pushl $_IO_stdout_ +call fflush +addl $4,%esp +movl sigsave,%edi +cmpl $0,%edi +je .LC4 +pushl sigsave +pushl $8 +call signal +addl $8,%esp +movl $0,sigsave +pushl $1 +pushl $ovfl_buf +call longjmp +addl $8,%esp +.LC4: +call abort +.LC2: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf6: +.size sigfpe,.Lf6-sigfpe +.data +.align 4 +.type msg.758,@object +msg.758: +.long .LC759 +.long .LC760 +.long .LC761 +.long .LC762 +.size msg.758,16 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $1684,%esp +fldl .LC8 +fstpl Zero +fldl .LC9 +fstpl One +fldl One +fstpl -8(%ebp) +fldl -8(%ebp) +faddl -8(%ebp) +fstpl Two +fldl Two +fstpl -16(%ebp) +fldl -16(%ebp) +faddl -8(%ebp) +fstpl Three +fldl Three +fstpl -24(%ebp) +fldl -24(%ebp) +faddl -8(%ebp) +fstpl Four +fldl Four +fstpl -32(%ebp) +fldl -32(%ebp) +faddl -8(%ebp) +fstpl Five +fldl -32(%ebp) +faddl -32(%ebp) +fstpl Eight +fldl -24(%ebp) +fmull -24(%ebp) +fstpl Nine +fldl Nine +fmull -24(%ebp) +fstpl TwentySeven +fldl -32(%ebp) +fmull Eight +fstpl ThirtyTwo +fldl -32(%ebp) +fmull Five +fmull -24(%ebp) +fmull -32(%ebp) +fstpl TwoForty +fldl -8(%ebp) +fchs +fstpl MinusOne +fldl -8(%ebp) +fdivl -16(%ebp) +fstpl Half +fldl -8(%ebp) +faddl Half +fstpl OneAndHalf +movl $0,ErrCnt +movl $0,ErrCnt+4 +movl $0,ErrCnt+8 +movl $0,ErrCnt+12 +movl $1,PageNo +movl $0,Milestone +pushl $sigfpe +pushl $8 +call signal +addl $8,%esp +call Instructions +call Pause +call Heading +call Pause +call Characteristics +call Pause +call History +call Pause +movl $7,Milestone +pushl $.LC13 +call printf +addl $4,%esp +pushl $.LC15 +fldl Zero +faddl Zero +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC16 +fldl One +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC16 +fldl Zero +fcompl One +fstsw %ax +sahf +jae .LC16 +fldl One +faddl One +fldl Two +fcompp +fstsw %ax +sahf +jne .LC16 +movl $1,-36(%ebp) +jmp .LC17 +.LC16: +movl $0,-36(%ebp) +.LC17: +pushl -36(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl Zero +fchs +fstpl Z +fldl .LC8 +fcompl Z +fstsw %ax +sahf +je .LC18 +incl ErrCnt +pushl $.LC20 +call printf +addl $4,%esp +fldl .LC21 +fstpl U1 +fldl .LC9 +fstpl Radix +call TstPtUf +.LC18: +pushl $.LC23 +fldl Two +faddl One +fcompl Three +fstsw %ax +sahf +jne .LC24 +fldl Three +faddl One +fcompl Four +fstsw %ax +sahf +jne .LC24 +fldl Four +fldl Two +fldl Two +fchs +fmulp %st(1),%st +faddp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC24 +fldl Four +fsubl Three +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC24 +movl $1,-56(%ebp) +jmp .LC25 +.LC24: +movl $0,-56(%ebp) +.LC25: +pushl -56(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl .LC8 +fsubl One +fcompl MinusOne +fstsw %ax +sahf +jne .LC28 +fldl MinusOne +faddl One +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC28 +fldl One +faddl MinusOne +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC28 +fldl One +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -132(%ebp) +fldl MinusOne +faddl -132(%ebp) +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC28 +fldl MinusOne +fldl MinusOne +fmull MinusOne +faddp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC28 +movl $1,-100(%ebp) +jmp .LC29 +.LC28: +movl $0,-100(%ebp) +.LC29: +pushl $.LC27 +pushl -100(%ebp) +pushl $0 +call TstCond +addl $12,%esp +pushl $.LC31 +fldl Half +faddl MinusOne +faddl Half +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC32 +movl $1,-152(%ebp) +jmp .LC33 +.LC32: +movl $0,-152(%ebp) +.LC33: +pushl -152(%ebp) +pushl $0 +call TstCond +addl $12,%esp +movl $10,Milestone +pushl $.LC35 +fldl Three +fmull Three +fcompl Nine +fstsw %ax +sahf +jne .LC36 +fldl Nine +fmull Three +fcompl TwentySeven +fstsw %ax +sahf +jne .LC36 +fldl Four +faddl Four +fcompl Eight +fstsw %ax +sahf +jne .LC36 +fldl Eight +fmull Four +fcompl ThirtyTwo +fstsw %ax +sahf +jne .LC36 +fldl ThirtyTwo +fsubl TwentySeven +fsubl Four +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC36 +movl $1,-164(%ebp) +jmp .LC37 +.LC36: +movl $0,-164(%ebp) +.LC37: +pushl -164(%ebp) +pushl $0 +call TstCond +addl $12,%esp +pushl $.LC39 +fldl Four +faddl One +fcompl Five +fstsw %ax +sahf +jne .LC40 +fldl Four +fmull Five +fmull Three +fmull Four +fcompl TwoForty +fstsw %ax +sahf +jne .LC40 +fldl TwoForty +fdivl Three +fldl Four +fmull Four +fmull Five +fsubp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC40 +fldl TwoForty +fdivl Four +fldl Five +fmull Three +fmull Four +fsubp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC40 +fldl TwoForty +fdivl Five +fldl Four +fmull Three +fmull Four +fsubp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC40 +movl $1,-216(%ebp) +jmp .LC41 +.LC40: +movl $0,-216(%ebp) +.LC41: +pushl -216(%ebp) +pushl $0 +call TstCond +addl $12,%esp +cmpl $0,ErrCnt +jne .LC42 +pushl $.LC44 +call printf +addl $4,%esp +pushl $.LC45 +call printf +addl $4,%esp +.LC42: +pushl $.LC46 +call printf +addl $4,%esp +fldl One +fstpl W +.LC47: +fldl W +fstpl -264(%ebp) +fldl -264(%ebp) +faddl -264(%ebp) +fstpl W +fldl W +fstpl -272(%ebp) +fldl -272(%ebp) +faddl One +fstpl Y +fldl Y +fsubl -272(%ebp) +fstpl Z +fldl Z +fsubl One +fstpl Y +.LC48: +fldl Y +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -264(%ebp) +fldl MinusOne +faddl -264(%ebp) +fldl Zero +fcompp +fstsw %ax +sahf +ja .LC47 +fldl Zero +fstpl Precision +fldl One +fstpl Y +.LC50: +fldl Y +fstpl -280(%ebp) +fldl W +faddl -280(%ebp) +fstpl Radix +fldl -280(%ebp) +faddl -280(%ebp) +fstpl Y +fldl Radix +fsubl W +fstpl Radix +.LC51: +fldl Zero +fcompl Radix +fstsw %ax +sahf +je .LC50 +fldl Two +fcompl Radix +fstsw %ax +sahf +jbe .LC53 +fldl One +fstpl Radix +.LC53: +fldl Radix +subl $8,%esp +fstpl (%esp) +pushl $.LC55 +call printf +addl $12,%esp +fldl .LC9 +fcompl Radix +fstsw %ax +sahf +je .LC56 +fldl One +fstpl W +.LC58: +fldl Precision +faddl One +fstpl Precision +fldl W +fmull Radix +fstpl W +fldl W +faddl One +fstpl Y +.LC59: +fldl Y +fsubl W +fldl One +fcompp +fstsw %ax +sahf +je .LC58 +.LC56: +fldl One +fdivl W +fstpl U1 +fldl U1 +fstpl -272(%ebp) +fldl Radix +fmull -272(%ebp) +fstpl U2 +fldl -272(%ebp) +subl $8,%esp +fstpl (%esp) +pushl $.LC61 +call printf +addl $12,%esp +pushl $.LC62 +call printf +addl $4,%esp +fldl Radix +fstpl E0 +fldl U1 +fstpl E1 +fldl U2 +fstpl E9 +fldl Precision +fstpl E3 +fldl Four +fdivl Three +fstpl X +fldl X +fsubl One +fstpl Third +fldl Third +fstpl -280(%ebp) +fldl Half +fsubl -280(%ebp) +fstpl F6 +fldl F6 +fstpl -288(%ebp) +fldl -288(%ebp) +faddl -288(%ebp) +fstpl X +fldl X +fsubl -280(%ebp) +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -296(%ebp) +fldl -296(%ebp) +fstpl X +fldl U2 +fcompl X +fstsw %ax +sahf +jbe .LC63 +fldl U2 +fstpl X +.LC63: +.LC65: +fldl X +fstpl U2 +fldl U2 +fstpl -304(%ebp) +fldl Half +fmull -304(%ebp) +fldl ThirtyTwo +fmull -304(%ebp) +fmull -304(%ebp) +faddp %st(1),%st +fstpl Y +fldl One +faddl Y +fstpl Y +fldl Y +fsubl One +fstpl X +.LC66: +fldl X +fcompl U2 +fstsw %ax +sahf +jae .LC68 +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC65 +.LC68: +fldl Two +fdivl Three +fstpl X +fldl X +fsubl Half +fstpl F6 +fldl F6 +fstpl -320(%ebp) +fldl -320(%ebp) +faddl -320(%ebp) +fstpl Third +fldl Third +fsubl Half +fstpl X +fldl X +faddl -320(%ebp) +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -328(%ebp) +fldl -328(%ebp) +fstpl X +fldl U1 +fcompl X +fstsw %ax +sahf +jbe .LC69 +fldl U1 +fstpl X +.LC69: +.LC71: +fldl X +fstpl U1 +fldl U1 +fstpl -344(%ebp) +fldl Half +fmull -344(%ebp) +fldl ThirtyTwo +fmull -344(%ebp) +fmull -344(%ebp) +faddp %st(1),%st +fstpl Y +fldl Half +fsubl Y +fstpl Y +fldl Half +faddl Y +fstpl X +fldl Half +fsubl X +fstpl Y +fldl Half +faddl Y +fstpl X +.LC72: +fldl X +fcompl U1 +fstsw %ax +sahf +jae .LC74 +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC71 +.LC74: +fldl E1 +fcompl U1 +fstsw %ax +sahf +jne .LC75 +pushl $.LC77 +call printf +addl $4,%esp +jmp .LC76 +.LC75: +fldl U1 +subl $8,%esp +fstpl (%esp) +pushl $.LC78 +call printf +addl $12,%esp +.LC76: +fldl One +fdivl U1 +fstpl W +fldl Half +fsubl U1 +faddl Half +fstpl F9 +fldl U2 +fdivl U1 +faddl .LC79 +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -360(%ebp) +fldl -360(%ebp) +fstpl Radix +fldl E0 +fcompl Radix +fstsw %ax +sahf +jne .LC80 +pushl $.LC82 +call printf +addl $4,%esp +jmp .LC81 +.LC80: +fldl Radix +subl $8,%esp +fstpl (%esp) +pushl $.LC83 +call printf +addl $12,%esp +.LC81: +pushl $.LC85 +fldl Eight +faddl Eight +fcompl Radix +fstsw %ax +sahf +jb .LC86 +movl $1,-364(%ebp) +jmp .LC87 +.LC86: +movl $0,-364(%ebp) +.LC87: +pushl -364(%ebp) +pushl $2 +call TstCond +addl $12,%esp +pushl $.LC89 +fldl Two +fcompl Radix +fstsw %ax +sahf +je .LC93 +fldl .LC94 +fcompl Radix +fstsw %ax +sahf +je .LC93 +fldl One +fcompl Radix +fstsw %ax +sahf +jne .LC90 +.LC93: +movl $1,-376(%ebp) +jmp .LC91 +.LC90: +movl $0,-376(%ebp) +.LC91: +pushl -376(%ebp) +pushl $3 +call TstCond +addl $12,%esp +movl $20,Milestone +pushl $.LC96 +fldl F9 +fsubl Half +fldl Half +fcompp +fstsw %ax +sahf +jbe .LC97 +movl $1,-388(%ebp) +jmp .LC98 +.LC97: +movl $0,-388(%ebp) +.LC98: +pushl -388(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl F9 +fstpl X +movl $1,I +fldl X +fsubl Half +fstpl Y +fldl Y +fsubl Half +fstpl Z +pushl $.LC100 +fldl One +fcompl X +fstsw %ax +sahf +jne .LC103 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC101 +.LC103: +movl $1,-400(%ebp) +jmp .LC102 +.LC101: +movl $0,-400(%ebp) +.LC102: +pushl -400(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl One +faddl U2 +fstpl X +movl $0,I +movl $25,Milestone +fldl Radix +fsubl One +fstpl BMinusU2 +fldl BMinusU2 +fsubl U2 +faddl One +fstpl BMinusU2 +fldl One +fcompl Radix +fstsw %ax +sahf +je .LC104 +fldl U1 +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -440(%ebp) +fldl Radix +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -448(%ebp) +fldl TwoForty +fchs +fmull -440(%ebp) +fdivl -448(%ebp) +fstpl X +fldl Half +faddl X +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -456(%ebp) +fldl -456(%ebp) +fstpl Y +fldl X +fsubl Y +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -464(%ebp) +fldl -464(%ebp) +fmull Four +fldl One +fcompp +fstsw %ax +sahf +jbe .LC106 +fldl Y +fstpl X +.LC106: +fldl X +fdivl TwoForty +fstpl Precision +fldl Half +faddl Precision +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -472(%ebp) +fldl -472(%ebp) +fstpl Y +fldl Precision +fsubl Y +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -480(%ebp) +fldl -480(%ebp) +fmull TwoForty +fldl Half +fcompp +fstsw %ax +sahf +jbe .LC108 +fldl Y +fstpl Precision +.LC108: +.LC104: +fldl Precision +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -448(%ebp) +fldl -448(%ebp) +fcompl Precision +fstsw %ax +sahf +jne .LC112 +fldl One +fcompl Radix +fstsw %ax +sahf +jne .LC110 +.LC112: +pushl $.LC113 +call printf +addl $4,%esp +pushl $.LC114 +call printf +addl $4,%esp +.LC110: +fldl One +fcompl Radix +fstsw %ax +sahf +jne .LC115 +pushl $.LC117 +call printf +addl $4,%esp +jmp .LC116 +.LC115: +fldl Precision +subl $8,%esp +fstpl (%esp) +pushl $.LC118 +call printf +addl $12,%esp +.LC116: +pushl $.LC120 +fldl U2 +fmull Nine +fmull Nine +fmull TwoForty +fldl One +fcompp +fstsw %ax +sahf +jbe .LC121 +movl $1,-452(%ebp) +jmp .LC122 +.LC121: +movl $0,-452(%ebp) +.LC122: +pushl -452(%ebp) +pushl $1 +call TstCond +addl $12,%esp +movl $30,Milestone +fldl One +fdivl Four +fstpl -492(%ebp) +fldl Four +fdivl Three +fsubl One +fsubl -492(%ebp) +fmull Three +fsubl -492(%ebp) +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -500(%ebp) +fldl -500(%ebp) +fstpl X +.LC123: +fldl X +fstpl Z2 +fldl Z2 +fstpl -516(%ebp) +fldl One +fldl Half +fmull -516(%ebp) +fldl ThirtyTwo +fmull -516(%ebp) +fmull -516(%ebp) +faddp %st(1),%st +faddp %st(1),%st +fsubl One +fstpl X +.LC124: +fldl X +fcompl Z2 +fstsw %ax +sahf +jae .LC126 +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC123 +.LC126: +fldl Three +fdivl Four +fldl Two +fdivl Three +fsubp %st(1),%st +fmull Three +fldl One +fdivl Four +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -532(%ebp) +fldl -532(%ebp) +fstpl Z +fldl -532(%ebp) +fstpl Y +fldl -532(%ebp) +fstpl X +.LC127: +fldl Z +fstpl Z1 +fldl One +fdivl Two +fstpl -540(%ebp) +fldl Z1 +fstpl -548(%ebp) +fldl -540(%ebp) +fldl -540(%ebp) +fldl Half +fmull -548(%ebp) +fldl ThirtyTwo +fmull -548(%ebp) +fmull -548(%ebp) +faddp %st(1),%st +fsubp %st(1),%st +faddl -540(%ebp) +fsubp %st(1),%st +faddl -540(%ebp) +fstpl Z +.LC128: +fldl Z +fcompl Z1 +fstsw %ax +sahf +jae .LC130 +fldl Zero +fcompl Z +fstsw %ax +sahf +jb .LC127 +.LC130: +.LC131: +.LC134: +fldl Y +fstpl Y1 +fldl Y1 +fstpl -556(%ebp) +fldl Half +fldl Half +fldl Half +fmull -556(%ebp) +fldl ThirtyTwo +fmull -556(%ebp) +fmull -556(%ebp) +faddp %st(1),%st +fsubp %st(1),%st +faddl Half +fsubp %st(1),%st +faddl Half +fstpl Y +.LC135: +fldl Y +fcompl Y1 +fstsw %ax +sahf +jae .LC137 +fldl Zero +fcompl Y +fstsw %ax +sahf +jb .LC134 +.LC137: +fldl X +fstpl X1 +fldl X1 +fstpl -556(%ebp) +fldl Half +fmull -556(%ebp) +fldl ThirtyTwo +fmull -556(%ebp) +fmull -556(%ebp) +faddp %st(1),%st +fsubl F9 +faddl F9 +fstpl X +.LC132: +fldl X +fcompl X1 +fstsw %ax +sahf +jae .LC138 +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC131 +.LC138: +fldl Y1 +fcompl X1 +fstsw %ax +sahf +jne .LC141 +fldl Z1 +fcompl X1 +fstsw %ax +sahf +je .LC139 +.LC141: +pushl $.LC142 +pushl $1 +call BadCond +addl $8,%esp +fldl Z1 +subl $8,%esp +fstpl (%esp) +fldl Y1 +subl $8,%esp +fstpl (%esp) +fldl X1 +subl $8,%esp +fstpl (%esp) +pushl $.LC143 +call printf +addl $28,%esp +pushl $.LC144 +call printf +addl $4,%esp +pushl $.LC145 +call printf +addl $4,%esp +pushl $.LC146 +call notify +addl $4,%esp +fldl U1 +fcompl X1 +fstsw %ax +sahf +je .LC150 +fldl U1 +fcompl Y1 +fstsw %ax +sahf +je .LC150 +fldl U1 +fcompl Z1 +fstsw %ax +sahf +jne .LC140 +.LC150: +pushl $.LC151 +call printf +addl $4,%esp +jmp .LC140 +.LC139: +fldl U1 +fcompl Z1 +fstsw %ax +sahf +jne .LC154 +fldl U2 +fcompl Z2 +fstsw %ax +sahf +je .LC152 +.LC154: +fldl U1 +fcompl Z1 +fstsw %ax +sahf +jbe .LC157 +fldl U2 +fcompl Z2 +fstsw %ax +sahf +ja .LC155 +.LC157: +pushl $.LC158 +pushl $0 +call BadCond +addl $8,%esp +pushl $.LC159 +call notify +addl $4,%esp +fldl Z1 +fsubl U1 +subl $8,%esp +fstpl (%esp) +fldl U1 +subl $8,%esp +fstpl (%esp) +pushl $.LC160 +call printf +addl $20,%esp +fldl Z2 +fsubl U2 +subl $8,%esp +fstpl (%esp) +fldl U2 +subl $8,%esp +fstpl (%esp) +pushl $.LC161 +call printf +addl $20,%esp +jmp .LC156 +.LC155: +fldl Zero +fcompl Z1 +fstsw %ax +sahf +jae .LC164 +fldl Zero +fcompl Z2 +fstsw %ax +sahf +jb .LC162 +.LC164: +fldl Radix +subl $8,%esp +fstpl (%esp) +pushl $.LC165 +call printf +addl $12,%esp +pushl $.LC166 +call printf +addl $4,%esp +fldl Z2 +subl $8,%esp +fstpl (%esp) +fldl Z1 +subl $8,%esp +fstpl (%esp) +pushl $.LC167 +call printf +addl $20,%esp +pushl $.LC168 +call notify +addl $4,%esp +.LC162: +fldl Z2 +fcompl Z1 +fstsw %ax +sahf +jne .LC171 +fldl Zero +fcompl Z1 +fstsw %ax +sahf +jae .LC169 +.LC171: +fldl Z1 +fdivl U1 +fstpl X +fldl Z2 +fdivl U2 +fstpl Y +fldl X +fcompl Y +fstsw %ax +sahf +jae .LC172 +fldl Y +fstpl X +.LC172: +fldl X +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -580(%ebp) +fldl -580(%ebp) +fchs +fstpl Q +pushl $.LC174 +call printf +addl $4,%esp +fldl Radix +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -588(%ebp) +fldl Q +fdivl -588(%ebp) +subl $8,%esp +fstpl (%esp) +pushl $.LC175 +call printf +addl $12,%esp +fldl .LC94 +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -596(%ebp) +fldl Q +fdivl -596(%ebp) +subl $8,%esp +fstpl (%esp) +pushl $.LC176 +call printf +addl $12,%esp +.LC169: +pushl $.LC151 +call printf +addl $4,%esp +.LC156: +.LC152: +.LC140: +call Pause +movl $35,Milestone +fldl Two +fcompl Radix +fstsw %ax +sahf +ja .LC177 +fldl W +fldl Radix +fmull Radix +fdivp %st(1),%st +fstpl X +fldl X +fstpl -576(%ebp) +fldl -576(%ebp) +faddl One +fstpl Y +fldl Y +fsubl -576(%ebp) +fstpl Z +fldl Z +fstpl -584(%ebp) +fldl -584(%ebp) +faddl U2 +fstpl T +fldl T +fsubl -584(%ebp) +fstpl X +pushl $.LC180 +fldl U2 +fcompl X +fstsw %ax +sahf +jne .LC181 +movl $1,-560(%ebp) +jmp .LC182 +.LC181: +movl $0,-560(%ebp) +.LC182: +pushl -560(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl U2 +fcompl X +fstsw %ax +sahf +jne .LC183 +pushl $.LC185 +call printf +addl $4,%esp +.LC183: +.LC177: +pushl $.LC186 +call printf +addl $4,%esp +fldl F9 +fmull One +fstpl Y +fldl One +fmull F9 +fstpl Z +fldl F9 +fsubl Half +fstpl X +fldl X +fstpl -588(%ebp) +fldl Y +fsubl Half +fsubl -588(%ebp) +fstpl Y +fldl Z +fsubl Half +fsubl -588(%ebp) +fstpl Z +fldl One +faddl U2 +fstpl X +fldl X +fstpl -604(%ebp) +fldl -604(%ebp) +fmull Radix +fstpl T +fldl Radix +fmull -604(%ebp) +fstpl R +fldl T +fsubl Radix +fstpl X +fldl Radix +fmull U2 +fstpl -620(%ebp) +fldl X +fsubl -620(%ebp) +fstpl X +fldl R +fsubl Radix +fstpl T +fldl T +fsubl -620(%ebp) +fstpl T +fldl Radix +fsubl One +fstpl -628(%ebp) +fldl X +fmull -628(%ebp) +fstpl X +fldl T +fmull -628(%ebp) +fstpl T +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC187 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC187 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC187 +fldl Zero +fcompl T +fstsw %ax +sahf +jne .LC187 +movl $1,GMult +jmp .LC188 +.LC187: +movl $0,GMult +pushl $.LC189 +pushl $0 +pushl $1 +call TstCond +addl $12,%esp +.LC188: +fldl Radix +fmull U2 +fstpl Z +fldl Z +fstpl -648(%ebp) +fldl One +faddl -648(%ebp) +fstpl X +fldl X +fstpl -656(%ebp) +fldl -656(%ebp) +faddl -648(%ebp) +fldl -656(%ebp) +fmull -656(%ebp) +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -664(%ebp) +fldl -664(%ebp) +fsubl U2 +fstpl Y +fldl One +fsubl U2 +fstpl X +fldl X +fstpl -680(%ebp) +fldl -680(%ebp) +fsubl U2 +fldl -680(%ebp) +fmull -680(%ebp) +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -688(%ebp) +fldl -688(%ebp) +fsubl U1 +fstpl Z +pushl $.LC191 +fldl Zero +fcompl Y +fstsw %ax +sahf +jb .LC192 +fldl Zero +fcompl Z +fstsw %ax +sahf +jb .LC192 +movl $1,-640(%ebp) +jmp .LC193 +.LC192: +movl $0,-640(%ebp) +.LC193: +pushl -640(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl One +fsubl U2 +fstpl Y +fldl One +faddl U2 +fstpl X +fldl One +fdivl Y +fstpl Z +fldl Z +fsubl X +fstpl Y +fldl One +fdivl Three +fstpl X +fldl Three +fdivl Nine +fstpl Z +fldl Z +fstpl -740(%ebp) +fldl X +fsubl -740(%ebp) +fstpl X +fldl Nine +fdivl TwentySeven +fstpl T +fldl -740(%ebp) +fsubl T +fstpl Z +pushl $.LC195 +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC196 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC196 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC196 +movl $1,-700(%ebp) +jmp .LC197 +.LC196: +movl $0,-700(%ebp) +.LC197: +pushl -700(%ebp) +pushl $2 +call TstCond +addl $12,%esp +fldl F9 +fdivl One +fstpl Y +fldl F9 +fsubl Half +fstpl X +fldl Y +fsubl Half +fsubl X +fstpl Y +fldl One +faddl U2 +fstpl X +fldl X +fstpl -780(%ebp) +fldl -780(%ebp) +fdivl One +fstpl T +fldl T +fsubl -780(%ebp) +fstpl X +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC198 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC198 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC198 +movl $1,GDiv +jmp .LC199 +.LC198: +movl $0,GDiv +pushl $.LC200 +pushl $0 +pushl $1 +call TstCond +addl $12,%esp +.LC199: +fldl One +fldl One +faddl U2 +fdivp %st(1),%st +fstpl X +fldl X +fsubl Half +fsubl Half +fstpl Y +pushl $.LC202 +fldl Zero +fcompl Y +fstsw %ax +sahf +jbe .LC203 +movl $1,-792(%ebp) +jmp .LC204 +.LC203: +movl $0,-792(%ebp) +.LC204: +pushl -792(%ebp) +pushl $1 +call TstCond +addl $12,%esp +fldl One +fsubl U2 +fstpl X +fldl One +fldl Radix +fmull U2 +faddp %st(1),%st +fstpl Y +fldl X +fstpl -844(%ebp) +fldl -844(%ebp) +fmull Radix +fstpl Z +fldl Y +fstpl -852(%ebp) +fldl -852(%ebp) +fmull Radix +fstpl T +fldl Z +fdivl Radix +fstpl R +fldl T +fdivl Radix +fstpl StickyBit +fldl R +fsubl -844(%ebp) +fstpl X +fldl StickyBit +fsubl -852(%ebp) +fstpl Y +pushl $.LC206 +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC207 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC207 +movl $1,-812(%ebp) +jmp .LC208 +.LC207: +movl $0,-812(%ebp) +.LC208: +pushl -812(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl One +fsubl U1 +fstpl Y +fldl One +fsubl F9 +fstpl X +fldl One +fsubl Y +fstpl Y +fldl Radix +fsubl U2 +fstpl T +fldl Radix +fsubl BMinusU2 +fstpl Z +fldl Radix +fsubl T +fstpl T +fldl U1 +fcompl X +fstsw %ax +sahf +jne .LC209 +fldl U1 +fcompl Y +fstsw %ax +sahf +jne .LC209 +fldl U2 +fcompl Z +fstsw %ax +sahf +jne .LC209 +fldl U2 +fcompl T +fstsw %ax +sahf +jne .LC209 +movl $1,GAddSub +jmp .LC210 +.LC209: +movl $0,GAddSub +pushl $.LC211 +pushl $0 +pushl $1 +call TstCond +addl $12,%esp +.LC210: +fldl One +fcompl F9 +fstsw %ax +sahf +je .LC212 +fldl F9 +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +ja .LC212 +pushl $.LC214 +pushl $1 +call BadCond +addl $8,%esp +pushl $.LC215 +call printf +addl $4,%esp +pushl $.LC216 +call printf +addl $4,%esp +pushl $.LC217 +call printf +addl $4,%esp +.LC212: +cmpl $1,GMult +jne .LC218 +cmpl $1,GDiv +jne .LC218 +cmpl $1,GAddSub +jne .LC218 +pushl $.LC220 +call printf +addl $4,%esp +.LC218: +movl $40,Milestone +call Pause +pushl $.LC221 +call printf +addl $4,%esp +movl $0,RMult +movl $0,RDiv +movl $0,RAddSub +fldl Radix +fdivl Two +fstpl RadixD2 +fldl Two +fstpl A1 +movl $0,Done +.LC222: +fldl Radix +fstpl AInvrse +.LC225: +fldl AInvrse +fstpl -924(%ebp) +fldl -924(%ebp) +fstpl X +fldl -924(%ebp) +fdivl A1 +fstpl AInvrse +.LC226: +fldl AInvrse +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -924(%ebp) +fldl AInvrse +fcompl -924(%ebp) +fstsw %ax +sahf +je .LC225 +fldl One +fcompl X +fstsw %ax +sahf +je .LC231 +fldl Three +fcompl A1 +fstsw %ax +sahf +jae .LC229 +.LC231: +movl $1,-928(%ebp) +jmp .LC230 +.LC229: +movl $0,-928(%ebp) +.LC230: +movl -928(%ebp),%edi +movl %edi,Done +cmpl $0,Done +jne .LC232 +fldl Nine +faddl One +fstpl A1 +.LC232: +.LC223: +cmpl $0,Done +je .LC222 +fldl One +fcompl X +fstsw %ax +sahf +jne .LC234 +fldl Radix +fstpl A1 +.LC234: +fldl One +fdivl A1 +fstpl AInvrse +fldl A1 +fstpl X +fldl AInvrse +fstpl Y +movl $0,Done +.LC236: +fldl X +fmull Y +fsubl Half +fstpl Z +pushl $.LC240 +fldl Half +fcompl Z +fstsw %ax +sahf +jne .LC241 +movl $1,-928(%ebp) +jmp .LC242 +.LC241: +movl $0,-928(%ebp) +.LC242: +pushl -928(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl Radix +fcompl X +fstsw %ax +sahf +jne .LC244 +movl $1,-940(%ebp) +jmp .LC245 +.LC244: +movl $0,-940(%ebp) +.LC245: +movl -940(%ebp),%edi +movl %edi,Done +fldl Radix +fstpl X +fldl One +fdivl X +fstpl Y +.LC237: +cmpl $0,Done +je .LC236 +fldl One +faddl U2 +fstpl Y2 +fldl One +fsubl U2 +fstpl Y1 +fldl OneAndHalf +fsubl U2 +fstpl X +fldl OneAndHalf +faddl U2 +fstpl Y +fldl X +fstpl -956(%ebp) +fldl Y2 +fstpl -964(%ebp) +fldl -956(%ebp) +fsubl U2 +fmull -964(%ebp) +fstpl Z +fldl Y +fstpl -972(%ebp) +fldl Y1 +fstpl -980(%ebp) +fldl -972(%ebp) +fmull -980(%ebp) +fstpl T +fldl Z +fsubl -956(%ebp) +fstpl Z +fldl T +fsubl -956(%ebp) +fstpl T +fldl -956(%ebp) +fmull -964(%ebp) +fstpl X +fldl -972(%ebp) +faddl U2 +fmull -980(%ebp) +fstpl Y +fldl X +fsubl OneAndHalf +fstpl X +fldl Y +fsubl OneAndHalf +fstpl Y +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC246 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC246 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC246 +fldl Zero +fcompl T +fstsw %ax +sahf +jb .LC246 +fldl OneAndHalf +faddl U2 +fstpl -1012(%ebp) +fldl -1012(%ebp) +fmull Y2 +fstpl X +fldl OneAndHalf +fsubl U2 +fstpl -1028(%ebp) +fldl -1028(%ebp) +fsubl U2 +fstpl Y +fldl -1012(%ebp) +faddl U2 +fstpl Z +fldl Y1 +fstpl -1036(%ebp) +fldl -1028(%ebp) +fmull -1036(%ebp) +fstpl T +fldl Z +fstpl -1044(%ebp) +fldl -1044(%ebp) +faddl U2 +fstpl -1052(%ebp) +fldl X +fsubl -1052(%ebp) +fstpl X +fldl Y +fstpl -1060(%ebp) +fldl -1060(%ebp) +fmull -1036(%ebp) +fstpl StickyBit +fldl -1044(%ebp) +fmull Y2 +fstpl S +fldl T +fsubl -1060(%ebp) +fstpl T +fldl U2 +fsubl -1060(%ebp) +faddl StickyBit +fstpl Y +fldl S +fldl -1052(%ebp) +faddl U2 +fsubp %st(1),%st +fstpl Z +fldl Y2 +faddl U2 +fmull -1036(%ebp) +fstpl StickyBit +fldl Y2 +fmull -1036(%ebp) +fstpl Y1 +fldl StickyBit +fsubl Y2 +fstpl StickyBit +fldl Y1 +fsubl Half +fstpl Y1 +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC248 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC248 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC248 +fldl Zero +fcompl T +fstsw %ax +sahf +jne .LC248 +fldl Zero +fcompl StickyBit +fstsw %ax +sahf +jne .LC248 +fldl Half +fcompl Y1 +fstsw %ax +sahf +jne .LC248 +movl $1,RMult +pushl $.LC250 +call printf +addl $4,%esp +jmp .LC249 +.LC248: +fldl X +faddl U2 +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC251 +fldl Zero +fcompl Y +fstsw %ax +sahf +jbe .LC251 +fldl Z +faddl U2 +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC251 +fldl Zero +fcompl T +fstsw %ax +sahf +jbe .LC251 +fldl StickyBit +faddl U2 +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC251 +fldl Half +fcompl Y1 +fstsw %ax +sahf +jbe .LC251 +movl $2,RMult +pushl $.LC253 +call printf +addl $4,%esp +jmp .LC252 +.LC251: +pushl $.LC254 +call printf +addl $4,%esp +.LC252: +.LC249: +cmpl $1,RMult +jne .LC247 +cmpl $0,GMult +jne .LC247 +pushl $.LC257 +call notify +addl $4,%esp +jmp .LC247 +.LC246: +pushl $.LC254 +call printf +addl $4,%esp +.LC247: +movl $45,Milestone +fldl One +faddl U2 +fstpl Y2 +fldl One +fsubl U2 +fstpl Y1 +fldl OneAndHalf +faddl U2 +fstpl -1020(%ebp) +fldl -1020(%ebp) +faddl U2 +fstpl Z +fldl Z +fstpl -1028(%ebp) +fldl Y2 +fstpl -1036(%ebp) +fldl -1028(%ebp) +fdivl -1036(%ebp) +fstpl X +fldl OneAndHalf +fsubl U2 +fsubl U2 +fstpl T +fldl T +fstpl -1044(%ebp) +fldl Y1 +fstpl -1052(%ebp) +fldl -1044(%ebp) +fsubl U2 +fdivl -1052(%ebp) +fstpl Y +fldl -1028(%ebp) +faddl U2 +fdivl -1036(%ebp) +fstpl Z +fldl X +fsubl OneAndHalf +fstpl X +fldl Y +fsubl -1044(%ebp) +fstpl Y +fldl -1044(%ebp) +fdivl -1052(%ebp) +fstpl T +fldl Z +fsubl -1020(%ebp) +fstpl Z +fldl U2 +fsubl OneAndHalf +faddl T +fstpl T +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC258 +fldl Zero +fcompl Y +fstsw %ax +sahf +jb .LC258 +fldl Zero +fcompl Z +fstsw %ax +sahf +jb .LC258 +fldl Zero +fcompl T +fstsw %ax +sahf +jb .LC258 +fldl Y2 +fstpl -1076(%ebp) +fldl OneAndHalf +fdivl -1076(%ebp) +fstpl X +fldl OneAndHalf +fsubl U2 +fstpl Y +fldl OneAndHalf +faddl U2 +fstpl Z +fldl Y +fstpl -1092(%ebp) +fldl X +fsubl -1092(%ebp) +fstpl X +fldl Y1 +fstpl -1100(%ebp) +fldl OneAndHalf +fdivl -1100(%ebp) +fstpl T +fldl -1092(%ebp) +fdivl -1100(%ebp) +fstpl Y +fldl Z +fstpl -1108(%ebp) +fldl T +fldl -1108(%ebp) +faddl U2 +fsubp %st(1),%st +fstpl T +fldl Y +fsubl -1108(%ebp) +fstpl Y +fldl -1108(%ebp) +fdivl -1076(%ebp) +fstpl Z +fldl -1076(%ebp) +faddl U2 +fdivl -1076(%ebp) +fstpl Y1 +fldl Z +fsubl OneAndHalf +fstpl Z +fldl Y1 +fsubl -1076(%ebp) +fstpl Y2 +fldl F9 +fsubl U1 +fdivl F9 +fstpl Y1 +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC260 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC260 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC260 +fldl Zero +fcompl T +fstsw %ax +sahf +jne .LC260 +fldl Zero +fcompl Y2 +fstsw %ax +sahf +jne .LC260 +fldl Zero +fcompl Y2 +fstsw %ax +sahf +jne .LC260 +fldl Y1 +fsubl Half +fldl F9 +fsubl Half +fcompp +fstsw %ax +sahf +jne .LC260 +movl $1,RDiv +pushl $.LC262 +call printf +addl $4,%esp +cmpl $0,GDiv +jne .LC261 +pushl $.LC265 +call notify +addl $4,%esp +jmp .LC261 +.LC260: +fldl Zero +fcompl X +fstsw %ax +sahf +jbe .LC266 +fldl Zero +fcompl Y +fstsw %ax +sahf +jbe .LC266 +fldl Zero +fcompl Z +fstsw %ax +sahf +jbe .LC266 +fldl Zero +fcompl T +fstsw %ax +sahf +jbe .LC266 +fldl Zero +fcompl Y2 +fstsw %ax +sahf +jbe .LC266 +fldl Y1 +fsubl Half +fldl F9 +fsubl Half +fcompp +fstsw %ax +sahf +jbe .LC266 +movl $2,RDiv +pushl $.LC268 +call printf +addl $4,%esp +.LC266: +.LC261: +.LC258: +cmpl $0,RDiv +jne .LC269 +pushl $.LC271 +call printf +addl $4,%esp +.LC269: +fldl One +fdivl Radix +fstpl BInvrse +pushl $.LC273 +fldl BInvrse +fmull Radix +fsubl Half +fldl Half +fcompp +fstsw %ax +sahf +jne .LC274 +movl $1,-1064(%ebp) +jmp .LC275 +.LC274: +movl $0,-1064(%ebp) +.LC275: +pushl -1064(%ebp) +pushl $0 +call TstCond +addl $12,%esp +movl $50,Milestone +pushl $.LC277 +fldl F9 +faddl U1 +fsubl Half +fldl Half +fcompp +fstsw %ax +sahf +jne .LC278 +fldl BMinusU2 +faddl U2 +fsubl One +fldl Radix +fsubl One +fcompp +fstsw %ax +sahf +jne .LC278 +movl $1,-1084(%ebp) +jmp .LC279 +.LC278: +movl $0,-1084(%ebp) +.LC279: +pushl -1084(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl One +fldl U1 +fmull U1 +fsubp %st(1),%st +fstpl X +fldl One +fldl U2 +fldl One +fsubl U2 +fmulp %st(1),%st +faddp %st(1),%st +fstpl Y +fldl F9 +fsubl Half +fstpl Z +fldl X +fsubl Half +fsubl Z +fstpl X +fldl Y +fsubl One +fstpl Y +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC280 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC280 +movl $2,RAddSub +pushl $.LC282 +call printf +addl $4,%esp +.LC280: +cmpl $1,GAddSub +jne .LC283 +fldl Half +faddl U2 +fmull U2 +fstpl X +fldl Half +fsubl U2 +fmull U2 +fstpl Y +fldl One +faddl X +fstpl X +fldl One +faddl Y +fstpl Y +fldl One +faddl U2 +fsubl X +fstpl X +fldl One +fsubl Y +fstpl Y +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC285 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC285 +fldl Half +faddl U2 +fmull U1 +fstpl X +fldl Half +fsubl U2 +fmull U1 +fstpl Y +fldl One +fsubl X +fstpl X +fldl One +fsubl Y +fstpl Y +fldl F9 +fsubl X +fstpl X +fldl One +fsubl Y +fstpl Y +fldl Zero +fcompl X +fstsw %ax +sahf +jne .LC287 +fldl Zero +fcompl Y +fstsw %ax +sahf +jne .LC287 +movl $1,RAddSub +pushl $.LC289 +call printf +addl $4,%esp +cmpl $0,GAddSub +jne .LC284 +pushl $.LC292 +call notify +addl $4,%esp +jmp .LC284 +.LC287: +pushl $.LC293 +call printf +addl $4,%esp +jmp .LC284 +.LC285: +pushl $.LC293 +call printf +addl $4,%esp +jmp .LC284 +.LC283: +pushl $.LC293 +call printf +addl $4,%esp +.LC284: +fldl One +fstpl S +fldl One +fldl Half +fldl One +faddl Half +fmulp %st(1),%st +faddp %st(1),%st +fstpl X +fldl One +faddl U2 +fmull Half +fstpl Y +fldl X +fstpl -1164(%ebp) +fldl Y +fstpl -1172(%ebp) +fldl -1164(%ebp) +fsubl -1172(%ebp) +fstpl Z +fldl -1172(%ebp) +fsubl -1164(%ebp) +fstpl T +fldl Z +faddl T +fstpl StickyBit +fldl Zero +fcompl StickyBit +fstsw %ax +sahf +je .LC294 +fldl Zero +fstpl S +pushl $.LC296 +pushl $3 +call BadCond +addl $8,%esp +.LC294: +fldl Zero +fstpl StickyBit +cmpl $1,GMult +jne .LC297 +cmpl $1,GDiv +jne .LC297 +cmpl $1,GAddSub +jne .LC297 +cmpl $1,RMult +jne .LC297 +cmpl $1,RDiv +jne .LC297 +cmpl $1,RAddSub +jne .LC297 +fldl RadixD2 +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1180(%ebp) +fldl RadixD2 +fcompl -1180(%ebp) +fstsw %ax +sahf +jne .LC297 +pushl $.LC299 +call printf +addl $4,%esp +fldl Half +faddl U1 +fmull U2 +fstpl X +fldl Half +fmull U2 +fstpl Y +fldl One +faddl Y +fstpl Z +fldl One +faddl X +fstpl T +fldl Z +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +jb .LC300 +fldl T +fsubl One +fldl U2 +fcompp +fstsw %ax +sahf +ja .LC300 +fldl T +faddl Y +fstpl Z +fldl Z +fsubl X +fstpl Y +fldl Z +fsubl T +fldl U2 +fcompp +fstsw %ax +sahf +ja .LC302 +fldl Y +fsubl T +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC302 +fldl Half +faddl U1 +fmull U1 +fstpl X +fldl Half +fmull U1 +fstpl Y +fldl One +fsubl Y +fstpl Z +fldl One +fsubl X +fstpl T +fldl Z +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC304 +fldl T +fsubl F9 +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC304 +fldl Half +fsubl U1 +fmull U1 +fstpl Z +fldl F9 +fsubl Z +fstpl T +fldl F9 +fsubl Y +fstpl Q +fldl T +fsubl F9 +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC306 +fldl F9 +fsubl U1 +fsubl Q +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC306 +fldl One +faddl U2 +fmull OneAndHalf +fstpl Z +fldl OneAndHalf +faddl U2 +fsubl Z +faddl U2 +fstpl T +fldl One +fldl Half +fdivl Radix +faddp %st(1),%st +fstpl X +fldl One +fldl Radix +fmull U2 +faddp %st(1),%st +fstpl Y +fldl X +fmull Y +fstpl Z +fldl Zero +fcompl T +fstsw %ax +sahf +jne .LC308 +fldl X +fldl Radix +fmull U2 +faddp %st(1),%st +fsubl Z +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC308 +fldl Two +fcompl Radix +fstsw %ax +sahf +je .LC310 +fldl Two +faddl U2 +fstpl X +fldl X +fdivl Two +fstpl Y +fldl Y +fsubl One +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC311 +fldl S +fstpl StickyBit +jmp .LC311 +.LC310: +fldl S +fstpl StickyBit +.LC311: +.LC308: +.LC306: +.LC304: +.LC302: +.LC300: +.LC297: +fldl One +fcompl StickyBit +fstsw %ax +sahf +jne .LC314 +pushl $.LC316 +call printf +addl $4,%esp +jmp .LC315 +.LC314: +pushl $.LC317 +call printf +addl $4,%esp +.LC315: +pushl $.LC319 +cmpl $0,GMult +je .LC320 +cmpl $0,GDiv +je .LC320 +cmpl $0,GAddSub +je .LC320 +cmpl $0,RMult +je .LC320 +cmpl $0,RDiv +je .LC320 +cmpl $0,RAddSub +je .LC320 +movl $1,-1184(%ebp) +jmp .LC321 +.LC320: +movl $0,-1184(%ebp) +.LC321: +pushl -1184(%ebp) +pushl $3 +call TstCond +addl $12,%esp +movl $60,Milestone +pushl $.LC45 +call printf +addl $4,%esp +pushl $.LC322 +call printf +addl $4,%esp +pushl NoTrials +pushl $.LC323 +call printf +addl $8,%esp +fldl .LC324 +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1192(%ebp) +fldl -1192(%ebp) +fstpl Random9 +fldl Third +fstpl Random1 +movl $1,I +.LC325: +call Random +fstpl -1200(%ebp) +fldl -1200(%ebp) +fstpl X +call Random +fstpl -1208(%ebp) +fldl -1208(%ebp) +fstpl Y +fldl Y +fmull X +fstpl Z9 +fldl X +fmull Y +fstpl Z +fldl Z +fsubl Z9 +fstpl Z9 +incl I +.LC326: +movl NoTrials,%edi +cmpl %edi,I +jg .LC328 +fldl Zero +fcompl Z9 +fstsw %ax +sahf +je .LC325 +.LC328: +movl NoTrials,%edi +cmpl %edi,I +jne .LC329 +fldl One +fldl Half +fdivl Three +faddp %st(1),%st +fstpl -1208(%ebp) +fldl -1208(%ebp) +fstpl Random1 +fldl U2 +faddl U1 +faddl One +fstpl -1216(%ebp) +fldl -1216(%ebp) +fstpl Random2 +fldl Random1 +fstpl -1224(%ebp) +fldl Random2 +fstpl -1232(%ebp) +fldl -1224(%ebp) +fmull -1232(%ebp) +fstpl Z +fldl -1232(%ebp) +fmull -1224(%ebp) +fstpl Y +fldl -1208(%ebp) +fmull -1216(%ebp) +fstpl -1240(%ebp) +fldl -1240(%ebp) +fsubl -1240(%ebp) +fstpl Z9 +.LC329: +movl NoTrials,%edi +cmpl %edi,I +je .LC331 +fldl Zero +fcompl Z9 +fstsw %ax +sahf +je .LC331 +pushl $.LC333 +pushl $2 +call BadCond +addl $8,%esp +jmp .LC332 +.LC331: +pushl NoTrials +pushl $.LC334 +call printf +addl $8,%esp +.LC332: +movl $70,Milestone +pushl $.LC335 +call printf +addl $4,%esp +fldl Zero +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1212(%ebp) +fldl -1212(%ebp) +fcompl Zero +fstsw %ax +sahf +jne .LC338 +fldl Zero +fchs +fstpl -1220(%ebp) +fldl -1220(%ebp) +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1228(%ebp) +fldl -1228(%ebp) +fcompl -1220(%ebp) +fstsw %ax +sahf +jne .LC338 +fldl One +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1244(%ebp) +fldl -1244(%ebp) +fcompl One +fstsw %ax +sahf +jne .LC338 +movl $1,-1196(%ebp) +jmp .LC339 +.LC338: +movl $0,-1196(%ebp) +.LC339: +pushl $.LC337 +pushl -1196(%ebp) +pushl $0 +call TstCond +addl $12,%esp +fldl Zero +fstpl MinSqEr +fldl Zero +fstpl MaxSqEr +fldl Zero +fstpl J +fldl Radix +fstpl X +fldl U2 +fstpl OneUlp +pushl $1 +call SqXMinX +addl $4,%esp +fldl BInvrse +fstpl X +fldl BInvrse +fmull U1 +fstpl OneUlp +pushl $1 +call SqXMinX +addl $4,%esp +fldl U1 +fstpl X +fldl U1 +fmull U1 +fstpl OneUlp +pushl $1 +call SqXMinX +addl $4,%esp +fldl Zero +fcompl J +fstsw %ax +sahf +je .LC340 +call Pause +.LC340: +pushl NoTrials +pushl $.LC342 +call printf +addl $8,%esp +fldl Zero +fstpl J +fldl Two +fstpl X +fldl Radix +fstpl Y +fldl One +fcompl Radix +fstsw %ax +sahf +je .LC343 +.LC345: +fldl Y +fstpl -1284(%ebp) +fldl -1284(%ebp) +fstpl X +fldl Radix +fmull -1284(%ebp) +fstpl Y +.LC346: +fldl Y +fsubl X +fildl NoTrials +fcompp +fstsw %ax +sahf +ja .LC345 +.LC343: +fldl X +fmull U2 +fstpl OneUlp +movl $1,I +jmp .LC349 +.LC348: +fldl X +faddl One +fstpl X +pushl $2 +call SqXMinX +addl $4,%esp +fldl Zero +fcompl J +fstsw %ax +sahf +jae .LC351 +jmp .LC350 +.LC351: +incl I +.LC349: +movl NoTrials,%edi +cmpl %edi,I +jle .LC348 +.LC350: +pushl $.LC353 +call printf +addl $4,%esp +movl $-1,I +fldl BMinusU2 +fstpl X +fldl Radix +fstpl Y +fldl Radix +fldl Radix +fmull U2 +faddp %st(1),%st +fstpl Z +movl $0,NotMonot +movl $0,Monot +jmp .LC355 +.LC354: +incl I +fldl X +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1292(%ebp) +fldl -1292(%ebp) +fstpl X +fldl Y +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1300(%ebp) +fldl -1300(%ebp) +fstpl Q +fldl Z +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1308(%ebp) +fldl -1308(%ebp) +fstpl Z +fldl Q +fcompl X +fstsw %ax +sahf +jb .LC359 +fldl Z +fcompl Q +fstsw %ax +sahf +jae .LC357 +.LC359: +movl $1,NotMonot +jmp .LC358 +.LC357: +fldl Q +faddl Half +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1324(%ebp) +fldl -1324(%ebp) +fstpl Q +cmpl $0,I +jg .LC362 +fldl Q +fmull Q +fcompl Radix +fstsw %ax +sahf +jne .LC360 +.LC362: +movl $1,Monot +jmp .LC361 +.LC360: +cmpl $0,I +jle .LC363 +cmpl $1,I +jle .LC365 +movl $1,Monot +jmp .LC364 +.LC365: +fldl Y +fmull BInvrse +fstpl Y +fldl Y +fstpl -1340(%ebp) +fldl -1340(%ebp) +fsubl U1 +fstpl X +fldl -1340(%ebp) +faddl U1 +fstpl Z +jmp .LC364 +.LC363: +fldl Q +fstpl Y +fldl Y +fstpl -1340(%ebp) +fldl -1340(%ebp) +fsubl U2 +fstpl X +fldl -1340(%ebp) +faddl U2 +fstpl Z +.LC364: +.LC361: +.LC358: +.LC355: +cmpl $0,NotMonot +jne .LC367 +cmpl $0,Monot +je .LC354 +.LC367: +cmpl $0,Monot +je .LC368 +pushl $.LC370 +call printf +addl $4,%esp +jmp .LC369 +.LC368: +pushl $.LC158 +pushl $2 +call BadCond +addl $8,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +pushl $.LC371 +call printf +addl $12,%esp +.LC369: +movl $80,Milestone +fldl MinSqEr +faddl Half +fstpl MinSqEr +fldl MaxSqEr +fsubl Half +fstpl MaxSqEr +fldl One +faddl U2 +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1300(%ebp) +fldl -1300(%ebp) +fsubl One +fdivl U2 +fstpl Y +fldl Y +fsubl One +fldl U2 +fdivl Eight +faddp %st(1),%st +fstpl SqEr +fldl MaxSqEr +fcompl SqEr +fstsw %ax +sahf +jae .LC372 +fldl SqEr +fstpl MaxSqEr +.LC372: +fldl Y +fldl U2 +fdivl Eight +faddp %st(1),%st +fstpl SqEr +fldl MinSqEr +fcompl SqEr +fstsw %ax +sahf +jbe .LC374 +fldl SqEr +fstpl MinSqEr +.LC374: +fldl F9 +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1324(%ebp) +fldl -1324(%ebp) +fsubl U2 +fldl One +fsubl U2 +fsubp %st(1),%st +fdivl U1 +fstpl Y +fldl Y +fldl U1 +fdivl Eight +faddp %st(1),%st +fstpl SqEr +fldl MaxSqEr +fcompl SqEr +fstsw %ax +sahf +jae .LC376 +fldl SqEr +fstpl MaxSqEr +.LC376: +fldl Y +faddl One +fldl U1 +fdivl Eight +faddp %st(1),%st +fstpl SqEr +fldl MinSqEr +fcompl SqEr +fstsw %ax +sahf +jbe .LC378 +fldl SqEr +fstpl MinSqEr +.LC378: +fldl U2 +fstpl OneUlp +fldl OneUlp +fstpl X +movl $1,Indx +.LC380: +fldl X +faddl U1 +faddl X +faddl F9 +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1356(%ebp) +fldl -1356(%ebp) +fstpl Y +fldl Y +fsubl U2 +fldl One +fsubl U2 +faddl X +fsubp %st(1),%st +fdivl OneUlp +fstpl Y +fldl U1 +fsubl X +faddl F9 +fmull Half +fmull X +fmull X +fdivl OneUlp +fstpl Z +fldl Y +faddl Half +faddl Z +fstpl SqEr +fldl MinSqEr +fcompl SqEr +fstsw %ax +sahf +jbe .LC384 +fldl SqEr +fstpl MinSqEr +.LC384: +fldl Y +fsubl Half +faddl Z +fstpl SqEr +fldl MaxSqEr +fcompl SqEr +fstsw %ax +sahf +jae .LC386 +fldl SqEr +fstpl MaxSqEr +.LC386: +movl Indx,%edi +cmpl $1,%edi +je .LC390 +cmpl $3,%edi +jne .LC388 +.LC390: +fldl X +subl $8,%esp +fstpl (%esp) +call Sign +addl $8,%esp +fstpl -1396(%ebp) +fldl OneUlp +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1404(%ebp) +fldl Eight +fldl Nine +fmull -1404(%ebp) +fdivp %st(1),%st +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1412(%ebp) +fldl OneUlp +fmull -1396(%ebp) +fmull -1412(%ebp) +fstpl X +jmp .LC389 +.LC388: +fldl U1 +fstpl OneUlp +fldl OneUlp +fchs +fstpl X +.LC389: +.LC381: +incl Indx +cmpl $3,Indx +jle .LC380 +movl $85,Milestone +movl $0,SqRWrng +movl $0,Anomaly +movl $0,RSqrt +fldl One +fcompl Radix +fstsw %ax +sahf +je .LC391 +pushl $.LC393 +call printf +addl $4,%esp +fldl Precision +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1356(%ebp) +fldl One +faddl Precision +fsubl -1356(%ebp) +subl $8,%esp +fstpl (%esp) +fldl Radix +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -1364(%ebp) +fldl Half +faddl -1364(%ebp) +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1372(%ebp) +fldl -1372(%ebp) +fstpl D +fldl D +fdivl Radix +fstpl X +fldl D +fdivl A1 +fstpl Y +fldl X +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1396(%ebp) +fldl -1396(%ebp) +fcompl X +fstsw %ax +sahf +jne .LC396 +fldl Y +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1412(%ebp) +fldl -1412(%ebp) +fcompl Y +fstsw %ax +sahf +je .LC394 +.LC396: +movl $1,Anomaly +jmp .LC395 +.LC394: +fldl Zero +fstpl X +fldl X +fstpl Z2 +fldl One +fstpl Y +fldl Y +fstpl Y2 +fldl Radix +fsubl One +fstpl Z1 +fldl Four +fmull D +fstpl FourD +.LC397: +fldl Z2 +fcompl Y2 +fstsw %ax +sahf +jae .LC400 +fldl Radix +fstpl Q +fldl Y +fstpl Y1 +.LC402: +fldl Half +fldl Q +fdivl Y1 +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1436(%ebp) +fldl Q +fldl -1436(%ebp) +fmull Y1 +faddp %st(1),%st +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -1444(%ebp) +fldl -1444(%ebp) +fstpl X1 +fldl Y1 +fstpl Q +fldl X1 +fstpl Y1 +.LC403: +fldl Zero +fcompl X1 +fstsw %ax +sahf +jb .LC402 +fldl One +fcompl Q +fstsw %ax +sahf +jb .LC405 +fldl Y2 +fstpl Z2 +fldl Y +fstpl Z +.LC405: +.LC400: +fldl Y +faddl Two +fstpl Y +fldl X +faddl Eight +fstpl X +fldl Y2 +faddl X +fstpl Y2 +fldl FourD +fcompl Y2 +fstsw %ax +sahf +ja .LC407 +fldl Y2 +fsubl FourD +fstpl Y2 +.LC407: +.LC398: +fldl D +fcompl Y +fstsw %ax +sahf +ja .LC397 +fldl FourD +fsubl Z2 +fstpl X8 +fldl X8 +fstpl -1436(%ebp) +fldl -1436(%ebp) +fldl Z +fmull Z +faddp %st(1),%st +fdivl FourD +fstpl Q +fldl -1436(%ebp) +fdivl Eight +fstpl X8 +fldl Q +fstpl -1452(%ebp) +fldl -1452(%ebp) +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1460(%ebp) +fldl -1460(%ebp) +fcompl -1452(%ebp) +fstsw %ax +sahf +je .LC409 +movl $1,Anomaly +jmp .LC410 +.LC409: +movl $0,Break +.LC411: +fldl Z1 +fmull Z +fstpl X +fldl X +fstpl -1468(%ebp) +fldl -1468(%ebp) +fdivl Radix +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1476(%ebp) +fldl -1468(%ebp) +fldl -1476(%ebp) +fmull Radix +fsubp %st(1),%st +fstpl X +fldl One +fcompl X +fstsw %ax +sahf +jne .LC414 +movl $1,Break +jmp .LC415 +.LC414: +fldl Z1 +fsubl One +fstpl Z1 +.LC415: +.LC412: +cmpl $0,Break +jne .LC416 +fldl Zero +fcompl Z1 +fstsw %ax +sahf +jb .LC411 +.LC416: +fldl Zero +fcompl Z1 +fstsw %ax +sahf +jb .LC417 +cmpl $0,Break +jne .LC417 +movl $1,Anomaly +jmp .LC418 +.LC417: +fldl RadixD2 +fcompl Z1 +fstsw %ax +sahf +jae .LC419 +fldl Z1 +fsubl Radix +fstpl Z1 +.LC419: +.LC421: +call NewD +.LC422: +fldl U2 +fmull D +fldl F9 +fcompp +fstsw %ax +sahf +ja .LC421 +fldl D +fmull Radix +fsubl D +fldl W +fsubl D +fcompp +fstsw %ax +sahf +je .LC424 +movl $1,Anomaly +jmp .LC425 +.LC424: +fldl D +fstpl Z2 +movl $0,I +fldl D +fldl One +faddl Z +fmull Half +faddp %st(1),%st +fstpl Y +fldl D +faddl Z +faddl Q +fstpl X +call SR3750 +fldl D +fldl One +fsubl Z +fmull Half +faddp %st(1),%st +faddl D +fstpl Y +fldl D +fsubl Z +faddl D +fstpl X +fldl X +fstpl -1508(%ebp) +fldl -1508(%ebp) +faddl Q +faddl -1508(%ebp) +fstpl X +call SR3750 +call NewD +fldl D +fsubl Z2 +fldl W +fsubl Z2 +fcompp +fstsw %ax +sahf +je .LC426 +movl $1,Anomaly +jmp .LC427 +.LC426: +fldl D +fsubl Z2 +fstpl -1532(%ebp) +fldl -1532(%ebp) +fldl Z2 +fldl One +fsubl Z +fmull Half +faddp %st(1),%st +faddp %st(1),%st +fstpl Y +fldl -1532(%ebp) +fldl Z2 +fsubl Z +faddl Q +faddp %st(1),%st +fstpl X +call SR3750 +fldl One +faddl Z +fmull Half +fstpl Y +fldl Q +fstpl X +call SR3750 +cmpl $0,I +jne .LC428 +movl $1,Anomaly +.LC428: +.LC427: +.LC425: +.LC418: +.LC410: +.LC395: +cmpl $0,I +je .LC432 +cmpl $0,Anomaly +je .LC430 +.LC432: +pushl $.LC433 +pushl $0 +call BadCond +addl $8,%esp +fldl W +subl $8,%esp +fstpl (%esp) +pushl $.LC434 +call printf +addl $12,%esp +pushl $.LC435 +call printf +addl $4,%esp +movl $1,SqRWrng +.LC430: +.LC391: +cmpl $0,Anomaly +jne .LC436 +fldl Zero +fcompl MinSqEr +fstsw %ax +sahf +ja .LC438 +fldl Zero +fcompl MaxSqEr +fstsw %ax +sahf +jb .LC438 +movl $1,RSqrt +pushl $.LC440 +call printf +addl $4,%esp +jmp .LC439 +.LC438: +fldl MaxSqEr +faddl U2 +fldl U2 +fsubl Half +fcompp +fstsw %ax +sahf +jb .LC444 +fldl Half +fcompl MinSqEr +fstsw %ax +sahf +jb .LC444 +fldl MinSqEr +faddl Radix +fldl Half +fcompp +fstsw %ax +sahf +jbe .LC441 +.LC444: +movl $1,SqRWrng +jmp .LC442 +.LC441: +movl $2,RSqrt +pushl $.LC445 +call printf +addl $4,%esp +.LC442: +.LC439: +.LC436: +cmpl $0,SqRWrng +je .LC446 +pushl $.LC448 +call printf +addl $4,%esp +fldl MinSqEr +fsubl Half +subl $8,%esp +fstpl (%esp) +pushl $.LC449 +call printf +addl $12,%esp +fldl Half +faddl MaxSqEr +subl $8,%esp +fstpl (%esp) +pushl $.LC450 +call printf +addl $12,%esp +pushl $.LC452 +fldl MaxSqEr +fsubl MinSqEr +fldl Radix +fmull Radix +fcompp +fstsw %ax +sahf +jbe .LC453 +movl $1,-1344(%ebp) +jmp .LC454 +.LC453: +movl $0,-1344(%ebp) +.LC454: +pushl -1344(%ebp) +pushl $1 +call TstCond +addl $12,%esp +.LC446: +movl $90,Milestone +call Pause +pushl $.LC455 +call printf +addl $4,%esp +movl $0,N +movl $0,I +fldl Zero +fchs +fstpl Z +movl $3,M +movl $0,Break +.LC456: +fldl One +fstpl X +call SR3980 +cmpl $10,I +jg .LC459 +movl $1023,I +call SR3980 +.LC459: +fldl MinusOne +fcompl Z +fstsw %ax +sahf +jne .LC461 +movl $1,Break +jmp .LC462 +.LC461: +fldl MinusOne +fstpl Z +call PrintIfNPositive +movl $0,N +movl $-4,I +.LC462: +.LC457: +cmpl $0,Break +je .LC456 +call PrintIfNPositive +movl N,%edi +movl %edi,N1 +movl $0,N +fldl A1 +fstpl Z +fldl W +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -1348(%ebp) +fldl A1 +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -1356(%ebp) +fldl Two +fmull -1348(%ebp) +fdivl -1356(%ebp) +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1364(%ebp) +fldl -1364(%ebp) +fistpl M +movl $0,Break +.LC463: +fldl Z +fstpl X +movl $1,I +call SR3980 +fldl AInvrse +fcompl Z +fstsw %ax +sahf +jne .LC466 +movl $1,Break +jmp .LC467 +.LC466: +fldl AInvrse +fstpl Z +.LC467: +.LC464: +cmpl $0,Break +je .LC463 +movl $100,Milestone +movl NoTrials,%edi +movl %edi,M +fldl Three +fstpl Z +.LC468: +fldl Z +fstpl X +movl $1,I +call SR3980 +.LC471: +fldl Z +faddl Two +fstpl Z +.LC472: +fldl Z +fdivl Three +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1380(%ebp) +fldl Three +fmull -1380(%ebp) +fldl Z +fcompp +fstsw %ax +sahf +je .LC471 +.LC469: +fldl Eight +fmull Three +fcompl Z +fstsw %ax +sahf +ja .LC468 +cmpl $0,N +jle .LC474 +pushl $.LC476 +call printf +addl $4,%esp +pushl $.LC477 +call printf +addl $4,%esp +.LC474: +call PrintIfNPositive +movl N1,%edi +addl %edi,N +cmpl $0,N +jne .LC478 +pushl $.LC480 +call printf +addl $4,%esp +.LC478: +cmpl $0,N +jle .LC481 +call Pause +jmp .LC482 +.LC481: +pushl $.LC45 +call printf +addl $4,%esp +.LC482: +movl $110,Milestone +pushl $.LC483 +call printf +addl $4,%esp +fldl U1 +fstpl D +fldl Precision +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1380(%ebp) +fldl -1380(%ebp) +fcompl Precision +fstsw %ax +sahf +je .LC484 +fldl BInvrse +fstpl D +fldl Precision +fstpl X +.LC486: +fldl D +fmull BInvrse +fstpl D +fldl X +fsubl One +fstpl X +.LC487: +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC486 +.LC484: +fldl One +fstpl Y +fldl D +fstpl Z +.LC489: +fldl Y +fstpl C +fldl Z +fstpl Y +fldl Y +fstpl -1388(%ebp) +fldl -1388(%ebp) +fmull -1388(%ebp) +fstpl Z +.LC490: +fldl Z +fcompl Y +fstsw %ax +sahf +jae .LC492 +fldl Z +faddl Z +fldl Z +fcompp +fstsw %ax +sahf +jb .LC489 +.LC492: +fldl C +fstpl Y +fldl Y +fmull D +fstpl Z +.LC493: +fldl Y +fstpl C +fldl Z +fstpl Y +fldl Y +fmull D +fstpl Z +.LC494: +fldl Z +fcompl Y +fstsw %ax +sahf +jae .LC496 +fldl Z +faddl Z +fldl Z +fcompp +fstsw %ax +sahf +jb .LC493 +.LC496: +fldl Two +fcompl Radix +fstsw %ax +sahf +jbe .LC497 +fldl Two +fstpl HInvrse +jmp .LC498 +.LC497: +fldl Radix +fstpl HInvrse +.LC498: +fldl One +fdivl HInvrse +fstpl H +fldl One +fdivl C +fstpl CInvrse +fldl C +fstpl E0 +fldl E0 +fmull H +fstpl Z +.LC499: +fldl E0 +fstpl Y +fldl Z +fstpl E0 +fldl E0 +fmull H +fstpl Z +.LC500: +fldl Z +fcompl E0 +fstsw %ax +sahf +jae .LC502 +fldl Z +faddl Z +fldl Z +fcompp +fstsw %ax +sahf +jb .LC499 +.LC502: +fldl E0 +fstpl UfThold +fldl Zero +fstpl E1 +fldl Zero +fstpl Q +fldl U2 +fstpl E9 +fldl One +faddl E9 +fstpl S +fldl C +fmull S +fstpl D +fldl C +fcompl D +fstsw %ax +sahf +jb .LC503 +fldl Radix +fmull U2 +fstpl E9 +fldl One +faddl E9 +fstpl S +fldl C +fmull S +fstpl D +fldl C +fcompl D +fstsw %ax +sahf +jb .LC504 +pushl $.LC507 +pushl $0 +call BadCond +addl $8,%esp +fldl E0 +fstpl Underflow +fldl Zero +fstpl Y1 +fldl Z +fstpl PseudoZero +call Pause +jmp .LC504 +.LC503: +fldl D +fstpl Underflow +fldl Underflow +fmull H +fstpl PseudoZero +fldl Zero +fstpl UfThold +.LC508: +fldl Underflow +fstpl Y1 +fldl PseudoZero +fstpl Underflow +fldl E1 +faddl E1 +fldl E1 +fcompp +fstsw %ax +sahf +jb .LC511 +fldl Underflow +fmull HInvrse +fstpl Y2 +fldl Y1 +fsubl Y2 +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -1452(%ebp) +fldl -1452(%ebp) +fstpl E1 +fldl Y1 +fstpl Q +fldl Zero +fcompl UfThold +fstsw %ax +sahf +jne .LC513 +fldl Y2 +fcompl Y1 +fstsw %ax +sahf +je .LC513 +fldl Y1 +fstpl UfThold +.LC513: +.LC511: +fldl PseudoZero +fmull H +fstpl PseudoZero +.LC509: +fldl PseudoZero +fcompl Underflow +fstsw %ax +sahf +jae .LC515 +fldl PseudoZero +faddl PseudoZero +fldl PseudoZero +fcompp +fstsw %ax +sahf +jb .LC508 +.LC515: +.LC504: +fldl Zero +fcompl PseudoZero +fstsw %ax +sahf +je .LC516 +pushl $.LC45 +call printf +addl $4,%esp +fldl PseudoZero +fstpl Z +fldl Zero +fcompl PseudoZero +fstsw %ax +sahf +jb .LC518 +pushl $.LC520 +pushl $0 +call BadCond +addl $8,%esp +pushl $.LC521 +call printf +addl $4,%esp +fldl PseudoZero +subl $8,%esp +fstpl (%esp) +pushl $.LC522 +call printf +addl $12,%esp +fldl PseudoZero +fchs +fstpl X +fldl Zero +fcompl X +fstsw %ax +sahf +jb .LC519 +pushl $.LC525 +call printf +addl $4,%esp +fldl X +subl $8,%esp +fstpl (%esp) +pushl $.LC526 +call printf +addl $12,%esp +jmp .LC519 +.LC518: +pushl $.LC527 +pushl $3 +call BadCond +addl $8,%esp +fldl PseudoZero +subl $8,%esp +fstpl (%esp) +pushl $.LC528 +call printf +addl $12,%esp +.LC519: +call TstPtUf +.LC516: +movl $120,Milestone +fldl CInvrse +fmull Y +fldl CInvrse +fmull Y1 +fcompp +fstsw %ax +sahf +jae .LC529 +fldl H +fmull S +fstpl S +fldl Underflow +fstpl E0 +.LC529: +fldl Zero +fcompl E1 +fstsw %ax +sahf +je .LC531 +fldl E0 +fcompl E1 +fstsw %ax +sahf +je .LC531 +pushl $.LC158 +pushl $2 +call BadCond +addl $8,%esp +fldl E0 +fcompl E1 +fstsw %ax +sahf +jbe .LC533 +pushl $.LC535 +call printf +addl $4,%esp +pushl $.LC536 +call printf +addl $4,%esp +fldl Zero +fcompl PseudoZero +fstsw %ax +sahf +jne .LC534 +fldl E1 +fstpl E0 +jmp .LC534 +.LC533: +pushl $.LC539 +call printf +addl $4,%esp +pushl $.LC540 +call printf +addl $4,%esp +.LC534: +.LC531: +fldl E0 +subl $8,%esp +fstpl (%esp) +pushl $.LC541 +call printf +addl $12,%esp +fldl E0 +fstpl Z +call TstPtUf +fldl E0 +fstpl Underflow +cmpl $1,N +jne .LC542 +fldl Y +fstpl Underflow +.LC542: +movl $4,I +fldl Zero +fcompl E1 +fstsw %ax +sahf +jne .LC544 +movl $3,I +.LC544: +fldl Zero +fcompl UfThold +fstsw %ax +sahf +jne .LC546 +sub $2,I +.LC546: +movl $1,UfNGrad +movl I,%edi +cmpl $1,%edi +jl .LC548 +cmpl $4,%edi +jg .LC548 +jmp *.LC571-4(,%edi,4) +.data +.align 4 +.LC571: +.long .LC550 +.long .LC557 +.long .LC562 +.long .LC563 +.text +.LC550: +fldl Underflow +fstpl UfThold +fldl CInvrse +fmull Q +fldl CInvrse +fmull Y +fmull S +fcompp +fstsw %ax +sahf +je .LC551 +fldl Y +fstpl UfThold +pushl $.LC553 +pushl $0 +call BadCond +addl $8,%esp +fldl UfThold +subl $8,%esp +fstpl (%esp) +pushl $.LC554 +call printf +addl $12,%esp +fldl C +subl $8,%esp +fstpl (%esp) +pushl $.LC555 +call printf +addl $12,%esp +pushl $.LC556 +call printf +addl $4,%esp +.LC551: +call Pause +jmp .LC549 +.LC557: +pushl $.LC558 +pushl $0 +call BadCond +addl $8,%esp +pushl $.LC559 +call printf +addl $4,%esp +fldl Y2 +subl $8,%esp +fstpl (%esp) +fldl Q +subl $8,%esp +fstpl (%esp) +pushl $.LC560 +call printf +addl $20,%esp +fldl Q +fsubl Y2 +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -1468(%ebp) +fldl -1468(%ebp) +subl $8,%esp +fstpl (%esp) +pushl $.LC561 +call printf +addl $12,%esp +fldl Q +fstpl UfThold +jmp .LC549 +.LC562: +fldl X +fstpl X +jmp .LC549 +.LC563: +fldl UfThold +fcompl Q +fstsw %ax +sahf +jne .LC564 +fldl E0 +fcompl E1 +fstsw %ax +sahf +jne .LC564 +fldl UfThold +fldl E1 +fdivl E9 +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -1492(%ebp) +fldl E1 +fcompl -1492(%ebp) +fstsw %ax +sahf +jb .LC564 +movl $0,UfNGrad +pushl $.LC566 +call printf +addl $4,%esp +pushl $.LC567 +call printf +addl $4,%esp +fldl E0 +fmull CInvrse +fstpl Y +fldl Y +fldl OneAndHalf +faddl U2 +fmulp %st(1),%st +fstpl Y +fldl CInvrse +fldl One +faddl U2 +fmulp %st(1),%st +fstpl X +fldl Y +fdivl X +fstpl Y +fldl E0 +fcompl Y +fstsw %ax +sahf +jne .LC569 +movl $1,-1496(%ebp) +jmp .LC570 +.LC569: +movl $0,-1496(%ebp) +.LC570: +movl -1496(%ebp),%edi +movl %edi,IEEE +.LC564: +.LC548: +.LC549: +cmpl $0,UfNGrad +je .LC573 +pushl $.LC45 +call printf +addl $4,%esp +leal sigfpe,%edi +movl %edi,sigsave +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +je .LC575 +pushl $.LC577 +call printf +addl $4,%esp +fldl H +faddl H +fstpl R +jmp .LC576 +.LC575: +fldl Underflow +fdivl UfThold +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1460(%ebp) +fldl -1460(%ebp) +fstpl R +.LC576: +movl $0,sigsave +fldl H +fcompl R +fstsw %ax +sahf +jb .LC578 +fldl R +fmull UfThold +fstpl Z +fldl Z +fldl One +fldl R +fmull H +fldl One +faddl H +fmulp %st(1),%st +faddp %st(1),%st +fmulp %st(1),%st +fstpl X +jmp .LC579 +.LC578: +fldl UfThold +fstpl Z +fldl Z +fldl One +fldl H +fmull H +fldl One +faddl H +fmulp %st(1),%st +faddp %st(1),%st +fmulp %st(1),%st +fstpl X +.LC579: +fldl Z +fcompl X +fstsw %ax +sahf +je .LC580 +fldl X +fsubl Z +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC580 +pushl $.LC158 +pushl $3 +call BadCond +addl $8,%esp +fldl Z +subl $8,%esp +fstpl (%esp) +fldl X +subl $8,%esp +fstpl (%esp) +pushl $.LC582 +call printf +addl $20,%esp +fldl X +fsubl Z +fstpl Z9 +fldl Z9 +subl $8,%esp +fstpl (%esp) +pushl $.LC583 +call printf +addl $12,%esp +pushl $.LC584 +call printf +addl $4,%esp +pushl $.LC585 +call printf +addl $4,%esp +pushl $.LC586 +call printf +addl $4,%esp +pushl $.LC587 +call printf +addl $4,%esp +pushl $.LC588 +call printf +addl $4,%esp +pushl $.LC589 +call printf +addl $4,%esp +leal sigfpe,%edi +movl %edi,sigsave +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +je .LC590 +pushl $.LC592 +call printf +addl $4,%esp +jmp .LC591 +.LC590: +fldl X +fdivl Z +fsubl Half +fsubl Half +subl $8,%esp +fstpl (%esp) +pushl $.LC593 +call printf +addl $12,%esp +.LC591: +movl $0,sigsave +.LC580: +.LC573: +pushl $.LC595 +fldl UfThold +subl $8,%esp +fstpl (%esp) +pushl $.LC594 +call printf +addl $16,%esp +pushl $.LC596 +call printf +addl $4,%esp +pushl $.LC597 +call printf +addl $4,%esp +fldl U1 +fmull U1 +fstpl Y2 +fldl Y2 +fstpl -1468(%ebp) +fldl -1468(%ebp) +fmull -1468(%ebp) +fstpl Y +fldl Y +fmull U1 +fstpl Y2 +fldl UfThold +fcompl Y2 +fstsw %ax +sahf +jb .LC598 +fldl E0 +fcompl Y +fstsw %ax +sahf +jae .LC600 +pushl $.LC158 +pushl $2 +call BadCond +addl $8,%esp +movl $5,I +jmp .LC601 +.LC600: +pushl $.LC158 +pushl $1 +call BadCond +addl $8,%esp +movl $4,I +.LC601: +pushl I +pushl $.LC602 +call printf +addl $8,%esp +.LC598: +movl $130,Milestone +fldl UfThold +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -1476(%ebp) +fldl HInvrse +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -1484(%ebp) +fldl Half +fldl TwoForty +fmull -1476(%ebp) +fdivl -1484(%ebp) +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1492(%ebp) +fldl -1492(%ebp) +fchs +fdivl TwoForty +fstpl Y +fldl Y +faddl Y +fstpl Y2 +pushl $.LC603 +call printf +addl $4,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +fldl HInvrse +subl $8,%esp +fstpl (%esp) +pushl $.LC604 +call printf +addl $20,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +fldl HInvrse +subl $8,%esp +fstpl (%esp) +pushl $.LC605 +call printf +addl $20,%esp +fldl Y2 +subl $8,%esp +fstpl (%esp) +fldl HInvrse +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -1508(%ebp) +fldl -1508(%ebp) +fstpl V9 +fldl V9 +subl $8,%esp +fstpl (%esp) +pushl $.LC606 +call printf +addl $12,%esp +fldl Zero +fcompl V9 +fstsw %ax +sahf +ja .LC609 +fldl Radix +faddl Radix +faddl E9 +fmull UfThold +fcompl V9 +fstsw %ax +sahf +jae .LC607 +.LC609: +pushl $.LC610 +pushl $1 +call BadCond +addl $8,%esp +fldl UfThold +subl $8,%esp +fstpl (%esp) +pushl $.LC611 +call printf +addl $12,%esp +jmp .LC608 +.LC607: +fldl UfThold +fldl One +faddl E9 +fmulp %st(1),%st +fcompl V9 +fstsw %ax +sahf +jb .LC612 +pushl $.LC614 +call printf +addl $4,%esp +jmp .LC613 +.LC612: +pushl $.LC610 +pushl $2 +call BadCond +addl $8,%esp +fldl UfThold +subl $8,%esp +fstpl (%esp) +pushl $.LC611 +call printf +addl $12,%esp +.LC613: +.LC608: +movl $140,Milestone +pushl $.LC45 +call printf +addl $4,%esp +fldl Zero +fstpl X +movl $2,I +fldl Two +fmull Three +fstpl Y +fldl Zero +fstpl Q +movl $0,N +.LC615: +fldl X +fstpl Z +incl I +movl I,%edi +fldl Y +leal (%edi,%edi),%edi +pushl %edi +fildl (%esp) +addl $4,%esp +fdivp %st(1),%st +fstpl Y +fldl Y +faddl Q +fstpl R +fldl Z +fstpl -1540(%ebp) +fldl R +fstpl -1548(%ebp) +fldl -1540(%ebp) +faddl -1548(%ebp) +fstpl X +fldl -1540(%ebp) +fsubl X +faddl -1548(%ebp) +fstpl Q +.LC616: +fldl Z +fcompl X +fstsw %ax +sahf +jb .LC615 +fldl OneAndHalf +fldl One +fdivl Eight +faddp %st(1),%st +fldl X +fldl OneAndHalf +fmull ThirtyTwo +fdivp %st(1),%st +faddp %st(1),%st +fstpl Z +fldl Z +fstpl -1548(%ebp) +fldl -1548(%ebp) +fmull -1548(%ebp) +fstpl X +fldl X +fstpl -1556(%ebp) +fldl -1556(%ebp) +fmull -1556(%ebp) +fstpl Exp2 +fldl F9 +fstpl X +fldl X +fsubl U1 +fstpl Y +fldl Exp2 +subl $8,%esp +fstpl (%esp) +pushl $.LC618 +call printf +addl $12,%esp +movl $1,I +.LC619: +fldl X +fsubl BInvrse +fstpl Z +fldl X +faddl One +fldl Z +fldl One +fsubl BInvrse +fsubp %st(1),%st +fdivp %st(1),%st +fstpl Z +fldl Z +subl $8,%esp +fstpl (%esp) +fldl X +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -1588(%ebp) +fldl -1588(%ebp) +fsubl Exp2 +fstpl Q +fldl Q +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -1596(%ebp) +fldl TwoForty +fmull U2 +fcompl -1596(%ebp) +fstsw %ax +sahf +jae .LC623 +movl $1,N +fldl X +fsubl BInvrse +fldl One +fsubl BInvrse +fsubp %st(1),%st +fstpl V9 +pushl $.LC625 +pushl $2 +call BadCond +addl $8,%esp +fldl Z +subl $8,%esp +fstpl (%esp) +fldl X +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -1612(%ebp) +fldl -1612(%ebp) +subl $8,%esp +fstpl (%esp) +pushl $.LC626 +call printf +addl $12,%esp +fldl Z +subl $8,%esp +fstpl (%esp) +fldl V9 +subl $8,%esp +fstpl (%esp) +pushl $.LC627 +call printf +addl $20,%esp +fldl Q +subl $8,%esp +fstpl (%esp) +pushl $.LC628 +call printf +addl $12,%esp +pushl $.LC629 +call printf +addl $4,%esp +pushl $.LC630 +call printf +addl $4,%esp +jmp .LC621 +.LC623: +fldl Y +fstpl -1604(%ebp) +fldl -1604(%ebp) +fsubl X +fmull Two +faddl -1604(%ebp) +fstpl Z +fldl -1604(%ebp) +fstpl X +fldl Z +fstpl Y +fldl X +fsubl F9 +fstpl -1612(%ebp) +fldl One +fldl -1612(%ebp) +fmull -1612(%ebp) +faddp %st(1),%st +fstpl Z +fldl One +fcompl Z +fstsw %ax +sahf +jae .LC631 +movl NoTrials,%edi +cmpl %edi,I +jge .LC631 +incl I +jmp .LC619 +.LC631: +fldl One +fcompl X +fstsw %ax +sahf +jae .LC633 +cmpl $0,N +jne .LC621 +pushl $.LC637 +call printf +addl $4,%esp +jmp .LC621 +.LC633: +fldl One +faddl U2 +fstpl X +fldl U2 +faddl U2 +fstpl Y +fldl Y +faddl X +fstpl Y +movl $1,I +jmp .LC619 +.LC621: +movl $150,Milestone +pushl $.LC638 +call printf +addl $4,%esp +movl $0,N +fldl A1 +fstpl Z +fldl C +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -1564(%ebp) +fldl A1 +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -1572(%ebp) +fldl Half +fldl -1564(%ebp) +fdivl -1572(%ebp) +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -1580(%ebp) +fldl -1580(%ebp) +fstpl Q +movl $0,Break +.LC639: +fldl CInvrse +fstpl X +fldl Q +subl $8,%esp +fstpl (%esp) +fldl Z +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -1588(%ebp) +fldl -1588(%ebp) +fstpl Y +call IsYeqX +fldl Q +fchs +fstpl Q +fldl C +fstpl X +fldl Q +subl $8,%esp +fstpl (%esp) +fldl Z +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -1596(%ebp) +fldl -1596(%ebp) +fstpl Y +call IsYeqX +fldl One +fcompl Z +fstsw %ax +sahf +jbe .LC642 +movl $1,Break +jmp .LC643 +.LC642: +fldl AInvrse +fstpl Z +.LC643: +.LC640: +cmpl $0,Break +je .LC639 +call PrintIfNPositive +cmpl $0,N +jne .LC644 +pushl $.LC646 +call printf +addl $4,%esp +.LC644: +pushl $.LC45 +call printf +addl $4,%esp +movl $160,Milestone +call Pause +pushl $.LC647 +call printf +addl $4,%esp +pushl $.LC648 +call printf +addl $4,%esp +fldl CInvrse +fchs +fstpl Y +fldl HInvrse +fmull Y +fstpl V9 +leal sigfpe,%edi +movl %edi,sigsave +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +je .LC649 +movl $0,I +fldl Y +fstpl V9 +jmp .LC651 +.LC649: +.LC652: +fldl Y +fstpl V +fldl V9 +fstpl Y +fldl HInvrse +fmull Y +fstpl V9 +.LC653: +fldl Y +fcompl V9 +fstsw %ax +sahf +ja .LC652 +movl $1,I +.LC651: +movl $0,sigsave +fldl V9 +fstpl Z +pushl $.LC655 +call printf +addl $4,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +pushl $.LC656 +call printf +addl $12,%esp +fldl Y +fchs +fstpl V9 +fldl V9 +fstpl V0 +fldl V +fsubl Y +fldl V +faddl V0 +fcompp +fstsw %ax +sahf +jne .LC657 +pushl $.LC659 +call printf +addl $4,%esp +jmp .LC658 +.LC657: +pushl $.LC660 +call printf +addl $4,%esp +pushl $.LC661 +pushl $3 +call BadCond +addl $8,%esp +.LC658: +fldl Y +fcompl Z +fstsw %ax +sahf +je .LC662 +pushl $.LC158 +pushl $1 +call BadCond +addl $8,%esp +fldl Z +subl $8,%esp +fstpl (%esp) +fldl Y +subl $8,%esp +fstpl (%esp) +pushl $.LC664 +call printf +addl $20,%esp +.LC662: +cmpl $0,I +je .LC665 +fldl V +fldl HInvrse +fmull U2 +fsubl HInvrse +fmulp %st(1),%st +fstpl Y +fldl Y +fldl One +fsubl HInvrse +fmull U2 +fmull V +faddp %st(1),%st +fstpl Z +fldl V0 +fcompl Z +fstsw %ax +sahf +jbe .LC667 +fldl Z +fstpl Y +.LC667: +fldl V0 +fcompl Y +fstsw %ax +sahf +jbe .LC669 +fldl Y +fstpl V +.LC669: +fldl V0 +fsubl V +fldl V0 +fcompp +fstsw %ax +sahf +jbe .LC666 +fldl V0 +fstpl V +jmp .LC666 +.LC665: +fldl Y +fldl HInvrse +fmull U2 +fsubl HInvrse +fmulp %st(1),%st +fstpl V +fldl V +fldl One +fsubl HInvrse +fmull U2 +fmull Y +faddp %st(1),%st +fstpl V +.LC666: +fldl V +subl $8,%esp +fstpl (%esp) +pushl $.LC673 +call printf +addl $12,%esp +cmpl $0,I +je .LC674 +fldl V0 +subl $8,%esp +fstpl (%esp) +pushl $.LC676 +call printf +addl $12,%esp +jmp .LC675 +.LC674: +pushl $.LC677 +call printf +addl $4,%esp +.LC675: +fldl V +fmull One +fstpl V9 +fldl V9 +subl $8,%esp +fstpl (%esp) +pushl $.LC678 +call printf +addl $12,%esp +fldl V +fdivl One +fstpl V9 +fldl V9 +subl $8,%esp +fstpl (%esp) +pushl $.LC679 +call printf +addl $12,%esp +pushl $.LC680 +call printf +addl $4,%esp +pushl $.LC681 +call printf +addl $4,%esp +movl $170,Milestone +fldl V +fchs +fldl V +fcompp +fstsw %ax +sahf +jbe .LC686 +fldl V0 +fchs +fldl V0 +fcompp +fstsw %ax +sahf +jbe .LC686 +fldl UfThold +fchs +fldl V +fcompp +fstsw %ax +sahf +jbe .LC686 +fldl V +fcompl UfThold +fstsw %ax +sahf +ja .LC682 +.LC686: +pushl $.LC687 +pushl $0 +call BadCond +addl $8,%esp +fldl UfThold +subl $8,%esp +fstpl (%esp) +fldl V0 +subl $8,%esp +fstpl (%esp) +fldl V +subl $8,%esp +fstpl (%esp) +pushl $.LC688 +call printf +addl $28,%esp +.LC682: +movl $175,Milestone +pushl $.LC45 +call printf +addl $4,%esp +movl $1,Indx +.LC689: +movl Indx,%edi +cmpl $1,%edi +je .LC695 +cmpl $2,%edi +je .LC696 +cmpl $3,%edi +je .LC697 +jmp .LC693 +.LC695: +fldl UfThold +fstpl Z +jmp .LC694 +.LC696: +fldl E0 +fstpl Z +jmp .LC694 +.LC697: +fldl PseudoZero +fstpl Z +.LC693: +.LC694: +fldl Zero +fcompl Z +fstsw %ax +sahf +je .LC698 +fldl Z +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1628(%ebp) +fldl -1628(%ebp) +fstpl V9 +fldl V9 +fmull V9 +fstpl Y +fldl Radix +fmull E9 +fstpl -1660(%ebp) +fldl Y +fldl One +fsubl -1660(%ebp) +fdivp %st(1),%st +fldl Z +fcompp +fstsw %ax +sahf +ja .LC702 +fldl One +faddl -1660(%ebp) +fmull Z +fcompl Y +fstsw %ax +sahf +jae .LC700 +.LC702: +fldl U1 +fcompl V9 +fstsw %ax +sahf +jae .LC703 +pushl $.LC158 +pushl $1 +call BadCond +addl $8,%esp +jmp .LC704 +.LC703: +pushl $.LC158 +pushl $2 +call BadCond +addl $8,%esp +.LC704: +fldl Z +subl $8,%esp +fstpl (%esp) +pushl $.LC705 +call printf +addl $12,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +pushl $.LC706 +call printf +addl $12,%esp +.LC700: +.LC698: +.LC690: +incl Indx +cmpl $3,Indx +jle .LC689 +movl $180,Milestone +movl $1,Indx +.LC707: +cmpl $1,Indx +jne .LC711 +fldl V +fstpl Z +jmp .LC712 +.LC711: +fldl V0 +fstpl Z +.LC712: +fldl Z +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -1628(%ebp) +fldl -1628(%ebp) +fstpl V9 +fldl V9 +fstpl -1636(%ebp) +fldl One +fldl Radix +fmull E9 +fsubp %st(1),%st +fmull -1636(%ebp) +fstpl X +fldl -1636(%ebp) +fmull X +fstpl V9 +fldl One +fldl Two +fmull Radix +fmull E9 +fsubp %st(1),%st +fmull Z +fcompl V9 +fstsw %ax +sahf +ja .LC715 +fldl Z +fcompl V9 +fstsw %ax +sahf +jae .LC713 +.LC715: +fldl V9 +fstpl Y +fldl W +fcompl X +fstsw %ax +sahf +jbe .LC716 +pushl $.LC158 +pushl $1 +call BadCond +addl $8,%esp +jmp .LC717 +.LC716: +pushl $.LC158 +pushl $2 +call BadCond +addl $8,%esp +.LC717: +fldl Z +subl $8,%esp +fstpl (%esp) +pushl $.LC718 +call printf +addl $12,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +pushl $.LC719 +call printf +addl $12,%esp +.LC713: +.LC708: +incl Indx +cmpl $2,Indx +jle .LC707 +movl $190,Milestone +call Pause +fldl UfThold +fmull V +fstpl X +fldl Radix +fmull Radix +fstpl Y +fldl X +fmull Y +fldl One +fcompp +fstsw %ax +sahf +ja .LC722 +fldl Y +fcompl X +fstsw %ax +sahf +jae .LC720 +.LC722: +fldl X +fmull Y +fldl U1 +fcompp +fstsw %ax +sahf +ja .LC725 +fldl Y +fdivl U1 +fcompl X +fstsw %ax +sahf +jae .LC723 +.LC725: +pushl $.LC726 +pushl $2 +call BadCond +addl $8,%esp +jmp .LC724 +.LC723: +pushl $.LC158 +pushl $3 +call BadCond +addl $8,%esp +.LC724: +pushl $.LC728 +fldl X +subl $8,%esp +fstpl (%esp) +pushl $.LC727 +call printf +addl $16,%esp +.LC720: +movl $200,Milestone +movl $1,Indx +.LC729: +fldl F9 +fstpl X +movl Indx,%edi +cmpl $2,%edi +jl .LC733 +cmpl $5,%edi +jg .LC733 +jmp *.LC739-8(,%edi,4) +.data +.align 4 +.LC739: +.long .LC735 +.long .LC736 +.long .LC737 +.long .LC738 +.text +.LC735: +fldl One +faddl U2 +fstpl X +jmp .LC734 +.LC736: +fldl V +fstpl X +jmp .LC734 +.LC737: +fldl UfThold +fstpl X +jmp .LC734 +.LC738: +fldl Radix +fstpl X +.LC733: +.LC734: +fldl X +fstpl Y +leal sigfpe,%edi +movl %edi,sigsave +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +je .LC741 +fldl X +subl $8,%esp +fstpl (%esp) +pushl $.LC743 +call printf +addl $12,%esp +jmp .LC742 +.LC741: +fldl Y +fdivl X +fsubl Half +fsubl Half +fstpl V9 +fldl Zero +fcompl V9 +fstsw %ax +sahf +jne .LC744 +jmp .LC730 +.LC744: +fldl U1 +fchs +fcompl V9 +fstsw %ax +sahf +jne .LC746 +cmpl $5,Indx +jge .LC746 +pushl $.LC158 +pushl $3 +call BadCond +addl $8,%esp +jmp .LC747 +.LC746: +pushl $.LC158 +pushl $1 +call BadCond +addl $8,%esp +.LC747: +fldl X +subl $8,%esp +fstpl (%esp) +pushl $.LC748 +call printf +addl $12,%esp +fldl V9 +subl $8,%esp +fstpl (%esp) +pushl $.LC749 +call printf +addl $12,%esp +.LC742: +movl $0,sigsave +.LC730: +incl Indx +cmpl $5,Indx +jle .LC729 +movl $210,Milestone +fldl Zero +fstpl MyZero +pushl $.LC45 +call printf +addl $4,%esp +pushl $.LC750 +call printf +addl $4,%esp +leal sigfpe,%edi +movl %edi,sigsave +pushl $.LC751 +call printf +addl $4,%esp +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +jne .LC752 +fldl One +fdivl MyZero +subl $8,%esp +fstpl (%esp) +pushl $.LC754 +call printf +addl $12,%esp +.LC752: +movl $0,sigsave +leal sigfpe,%edi +movl %edi,sigsave +pushl $.LC755 +call printf +addl $4,%esp +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +jne .LC756 +fldl Zero +fdivl MyZero +subl $8,%esp +fstpl (%esp) +pushl $.LC754 +call printf +addl $12,%esp +.LC756: +movl $0,sigsave +movl $220,Milestone +call Pause +pushl $.LC45 +call printf +addl $4,%esp +movl $0,-1648(%ebp) +.LC763: +movl -1648(%ebp),%edi +cmpl $0,ErrCnt(,%edi,4) +je .LC767 +movl -1648(%ebp),%edi +leal (,%edi,4),%edi +pushl ErrCnt(%edi) +pushl msg.758(%edi) +pushl $.LC769 +call printf +addl $12,%esp +.LC767: +.LC764: +incl -1648(%ebp) +cmpl $4,-1648(%ebp) +jl .LC763 +pushl $.LC45 +call printf +addl $4,%esp +movl ErrCnt,%edi +movl ErrCnt+4,%esi +leal (%esi,%edi),%edi +movl ErrCnt+8,%esi +leal (%esi,%edi),%edi +movl ErrCnt+12,%esi +leal (%esi,%edi),%edi +cmpl $0,%edi +jle .LC770 +movl ErrCnt,%edi +movl ErrCnt+4,%esi +leal (%esi,%edi),%edi +movl ErrCnt+8,%esi +leal (%esi,%edi),%edi +cmpl $0,%edi +jne .LC775 +cmpl $0,ErrCnt+12 +jle .LC775 +pushl $.LC780 +call printf +addl $4,%esp +pushl $.LC781 +call printf +addl $4,%esp +.LC775: +movl ErrCnt,%edi +movl ErrCnt+4,%esi +leal (%esi,%edi),%edi +cmpl $0,%edi +jne .LC782 +cmpl $0,ErrCnt+8 +jle .LC782 +pushl $.LC786 +call printf +addl $4,%esp +pushl $.LC787 +call printf +addl $4,%esp +.LC782: +movl ErrCnt,%edi +movl ErrCnt+4,%esi +leal (%esi,%edi),%edi +cmpl $0,%edi +jle .LC788 +pushl $.LC791 +call printf +addl $4,%esp +pushl $.LC792 +call printf +addl $4,%esp +.LC788: +cmpl $0,ErrCnt +jle .LC771 +pushl $.LC795 +call printf +addl $4,%esp +pushl $.LC796 +call printf +addl $4,%esp +jmp .LC771 +.LC770: +pushl $.LC797 +call printf +addl $4,%esp +cmpl $1,RMult +jne .LC802 +cmpl $1,RDiv +jne .LC802 +cmpl $1,RAddSub +jne .LC802 +cmpl $1,RSqrt +je .LC798 +.LC802: +pushl $.LC803 +call printf +addl $4,%esp +jmp .LC799 +.LC798: +fldl One +fcompl StickyBit +fstsw %ax +sahf +ja .LC804 +fldl Radix +fsubl Two +fldl Radix +fsubl Nine +fsubl One +fmulp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC804 +pushl $.LC806 +call printf +addl $4,%esp +pushl $.LC807 +call printf +addl $4,%esp +fldl Two +fcompl Radix +fstsw %ax +sahf +jne .LC808 +fldl Precision +fldl Four +fmull Three +fmull Two +fsubp %st(1),%st +fldl Precision +fsubl TwentySeven +fsubl TwentySeven +faddl One +fmulp %st(1),%st +fldl Zero +fcompp +fstsw %ax +sahf +jne .LC808 +pushl $.LC810 +call printf +addl $4,%esp +jmp .LC809 +.LC808: +pushl $.LC811 +call printf +addl $4,%esp +.LC809: +cmpl $0,IEEE +je .LC812 +pushl $.LC814 +call printf +addl $4,%esp +jmp .LC813 +.LC812: +pushl $.LC815 +call printf +addl $4,%esp +pushl $.LC816 +call printf +addl $4,%esp +.LC813: +.LC804: +pushl $.LC817 +call printf +addl $4,%esp +.LC799: +.LC771: +cmpl $0,fpecount +je .LC818 +pushl fpecount +pushl $.LC820 +call printf +addl $8,%esp +.LC818: +pushl $.LC821 +call printf +addl $4,%esp +movl $0,%eax +.LC7: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf822: +.size main,.Lf822-main +.globl Sign +.align 16 +.type Sign,@function +Sign: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +fldl .LC8 +fcompl 20(%ebp) +fstsw %ax +sahf +ja .LC825 +fldl .LC9 +fstpl -8(%ebp) +jmp .LC826 +.LC825: +fldl .LC827 +fstpl -8(%ebp) +.LC826: +fldl -8(%ebp) +.LC823: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf828: +.size Sign,.Lf828-Sign +.globl Pause +.align 16 +.type Pause,@function +Pause: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl Milestone +pushl $.LC830 +call printf +addl $8,%esp +pushl PageNo +pushl $.LC831 +call printf +addl $8,%esp +incl Milestone +incl PageNo +movl $0,%eax +.LC829: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf832: +.size Pause,.Lf832-Pause +.globl TstCond +.align 16 +.type TstCond,@function +TstCond: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +cmpl $0,24(%ebp) +jne .LC834 +pushl 28(%ebp) +pushl 20(%ebp) +call BadCond +addl $8,%esp +pushl $.LC814 +call printf +addl $4,%esp +.LC834: +movl $0,%eax +.LC833: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf836: +.size TstCond,.Lf836-TstCond +.data +.align 4 +.type msg.838,@object +msg.838: +.long .LC839 +.long .LC840 +.long .LC841 +.long .LC842 +.size msg.838,16 +.globl BadCond +.text +.align 16 +.type BadCond,@function +BadCond: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +leal ErrCnt(,%edi,4),%edi +incl (,%edi) +pushl 24(%ebp) +movl 20(%ebp),%edi +pushl msg.838(,%edi,4) +pushl $.LC843 +call printf +addl $12,%esp +movl $0,%eax +.LC837: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf844: +.size BadCond,.Lf844-BadCond +.globl Random +.align 16 +.type Random,@function +Random: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $48,%esp +fldl Random1 +faddl Random9 +fstpl -8(%ebp) +fldl -8(%ebp) +fmull -8(%ebp) +fstpl -16(%ebp) +fldl -16(%ebp) +fmull -16(%ebp) +fstpl -16(%ebp) +fldl -8(%ebp) +fmull -16(%ebp) +fstpl -8(%ebp) +fldl -8(%ebp) +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -48(%ebp) +fldl -8(%ebp) +fsubl -48(%ebp) +fstpl -16(%ebp) +fldl -16(%ebp) +fldl .LC846 +fmull -8(%ebp) +faddp %st(1),%st +fstpl Random1 +fldl Random1 +.LC845: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf847: +.size Random,.Lf847-Random +.globl SqXMinX +.align 16 +.type SqXMinX,@function +SqXMinX: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $40,%esp +fldl X +fmull BInvrse +fstpl -8(%ebp) +fldl X +fsubl -8(%ebp) +fstpl -16(%ebp) +fldl X +fmull X +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -32(%ebp) +fldl -32(%ebp) +fsubl -8(%ebp) +fsubl -16(%ebp) +fdivl OneUlp +fstpl SqEr +fldl Zero +fcompl SqEr +fstsw %ax +sahf +je .LC849 +fldl MinSqEr +fcompl SqEr +fstsw %ax +sahf +jbe .LC851 +fldl SqEr +fstpl MinSqEr +.LC851: +fldl MaxSqEr +fcompl SqEr +fstsw %ax +sahf +jae .LC853 +fldl SqEr +fstpl MaxSqEr +.LC853: +fldl J +faddl .LC9 +fstpl J +pushl $.LC45 +pushl 20(%ebp) +call BadCond +addl $8,%esp +fldl OneUlp +fmull SqEr +subl $8,%esp +fstpl (%esp) +fldl X +subl $8,%esp +fstpl (%esp) +fldl X +fmull X +subl $8,%esp +fstpl (%esp) +pushl $.LC855 +call printf +addl $28,%esp +pushl $.LC856 +call printf +addl $4,%esp +.LC849: +movl $0,%eax +.LC848: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf857: +.size SqXMinX,.Lf857-SqXMinX +.globl NewD +.align 16 +.type NewD,@function +NewD: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $40,%esp +fldl Z1 +fmull Q +fstpl X +fldl Half +fldl X +fdivl Radix +fsubp %st(1),%st +subl $8,%esp +fstpl (%esp) +call floor +addl $8,%esp +fstpl -8(%ebp) +fldl -8(%ebp) +fmull Radix +faddl X +fstpl X +fldl X +fstpl -24(%ebp) +fldl Z +fstpl -32(%ebp) +fldl Q +fldl -24(%ebp) +fmull -32(%ebp) +fsubp %st(1),%st +fdivl Radix +fldl -24(%ebp) +fmull -24(%ebp) +fldl D +fdivl Radix +fmulp %st(1),%st +faddp %st(1),%st +fstpl Q +fldl -32(%ebp) +fldl Two +fmull -24(%ebp) +fmull D +fsubp %st(1),%st +fstpl Z +fldl Zero +fcompl Z +fstsw %ax +sahf +jb .LC859 +fldl Z +fchs +fstpl Z +fldl Z1 +fchs +fstpl Z1 +.LC859: +fldl Radix +fmull D +fstpl D +movl $0,%eax +.LC858: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf861: +.size NewD,.Lf861-NewD +.globl SR3750 +.align 16 +.type SR3750,@function +SR3750: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $64,%esp +fldl X +fsubl Radix +fldl Z2 +fsubl Radix +fcompp +fstsw %ax +sahf +ja .LC863 +fldl X +fsubl Z2 +fldl W +fsubl Z2 +fcompp +fstsw %ax +sahf +jb .LC863 +incl I +fldl X +fmull D +subl $8,%esp +fstpl (%esp) +call sqrt +addl $8,%esp +fstpl -32(%ebp) +fldl -32(%ebp) +fstpl X2 +fldl X2 +fsubl Z2 +fldl Y +fsubl Z2 +fsubp %st(1),%st +fstpl Y2 +fldl X8 +fldl Y +fsubl Half +fdivp %st(1),%st +fstpl X2 +fldl X2 +fstpl -64(%ebp) +fldl -64(%ebp) +fldl Half +fmull -64(%ebp) +fmull -64(%ebp) +fsubp %st(1),%st +fstpl X2 +fldl Y2 +faddl Half +fldl Half +fsubl X2 +faddp %st(1),%st +fstpl SqEr +fldl MinSqEr +fcompl SqEr +fstsw %ax +sahf +jbe .LC865 +fldl SqEr +fstpl MinSqEr +.LC865: +fldl Y2 +fsubl X2 +fstpl SqEr +fldl MaxSqEr +fcompl SqEr +fstsw %ax +sahf +jae .LC867 +fldl SqEr +fstpl MaxSqEr +.LC867: +.LC863: +movl $0,%eax +.LC862: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf869: +.size SR3750,.Lf869-SR3750 +.globl IsYeqX +.align 16 +.type IsYeqX,@function +IsYeqX: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +fldl X +fcompl Y +fstsw %ax +sahf +je .LC871 +cmpl $0,N +jg .LC873 +fldl Zero +fcompl Z +fstsw %ax +sahf +jne .LC875 +fldl Zero +fcompl Q +fstsw %ax +sahf +jb .LC875 +pushl $.LC877 +call printf +addl $4,%esp +jmp .LC876 +.LC875: +pushl $.LC878 +pushl $2 +call BadCond +addl $8,%esp +.LC876: +fldl Q +subl $8,%esp +fstpl (%esp) +fldl Z +subl $8,%esp +fstpl (%esp) +pushl $.LC879 +call printf +addl $20,%esp +fldl Y +subl $8,%esp +fstpl (%esp) +pushl $.LC880 +call printf +addl $12,%esp +fldl X +subl $8,%esp +fstpl (%esp) +pushl $.LC881 +call printf +addl $12,%esp +fldl Y +fsubl X +subl $8,%esp +fstpl (%esp) +pushl $.LC882 +call printf +addl $12,%esp +.LC873: +incl N +.LC871: +movl $0,%eax +.LC870: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf883: +.size IsYeqX,.Lf883-IsYeqX +.globl SR3980 +.align 16 +.type SR3980,@function +SR3980: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +.LC885: +fildl I +fstpl Q +fldl Q +subl $8,%esp +fstpl (%esp) +fldl Z +subl $8,%esp +fstpl (%esp) +call pow +addl $16,%esp +fstpl -8(%ebp) +fldl -8(%ebp) +fstpl Y +call IsYeqX +movl I,%edi +leal 1(%edi),%edi +movl %edi,I +cmpl M,%edi +jle .LC888 +jmp .LC887 +.LC888: +fldl Z +fmull X +fstpl X +.LC886: +fldl W +fcompl X +fstsw %ax +sahf +ja .LC885 +.LC887: +movl $0,%eax +.LC884: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf890: +.size SR3980,.Lf890-SR3980 +.globl PrintIfNPositive +.align 16 +.type PrintIfNPositive,@function +PrintIfNPositive: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +cmpl $0,N +jle .LC892 +pushl N +pushl $.LC894 +call printf +addl $8,%esp +.LC892: +movl $0,%eax +.LC891: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf895: +.size PrintIfNPositive,.Lf895-PrintIfNPositive +.globl TstPtUf +.align 16 +.type TstPtUf,@function +TstPtUf: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $48,%esp +movl $0,N +fldl Zero +fcompl Z +fstsw %ax +sahf +je .LC897 +pushl $.LC899 +call printf +addl $4,%esp +pushl $.LC900 +call printf +addl $4,%esp +leal sigfpe,%edi +movl %edi,sigsave +pushl $ovfl_buf +call __setjmp +addl $4,%esp +cmpl $0,%eax +je .LC901 +jmp .LC903 +.LC901: +fldl Z +faddl Z +fdivl Z +fstpl Q9 +fldl Q9 +subl $8,%esp +fstpl (%esp) +pushl $.LC904 +call printf +addl $12,%esp +fldl Q9 +fsubl Two +subl $8,%esp +fstpl (%esp) +call fabs +addl $8,%esp +fstpl -16(%ebp) +fldl Radix +fmull U2 +fcompl -16(%ebp) +fstsw %ax +sahf +jbe .LC905 +pushl $.LC907 +call printf +addl $4,%esp +pushl $.LC908 +call printf +addl $4,%esp +jmp .LC906 +.LC905: +fldl One +fcompl Q9 +fstsw %ax +sahf +ja .LC911 +fldl Two +fcompl Q9 +fstsw %ax +sahf +jae .LC909 +.LC911: +.LC903: +movl $1,N +movl ErrCnt+4,%edi +leal 1(%edi),%edi +movl %edi,ErrCnt+4 +pushl $.LC914 +call printf +addl $4,%esp +jmp .LC910 +.LC909: +movl $1,N +movl ErrCnt+8,%edi +leal 1(%edi),%edi +movl %edi,ErrCnt+8 +pushl $.LC917 +call printf +addl $4,%esp +.LC910: +.LC906: +movl $0,sigsave +fldl Z +fmull One +fstpl V9 +fldl V9 +fstpl Random1 +fldl One +fmull Z +fstpl V9 +fldl V9 +fstpl Random2 +fldl Z +fdivl One +fstpl V9 +fldl Random1 +fcompl Z +fstsw %ax +sahf +jne .LC918 +fldl Random2 +fcompl Z +fstsw %ax +sahf +jne .LC918 +fldl V9 +fcompl Z +fstsw %ax +sahf +jne .LC918 +cmpl $0,N +jle .LC919 +call Pause +jmp .LC919 +.LC918: +movl $1,N +pushl $.LC922 +pushl $2 +call BadCond +addl $8,%esp +fldl Z +subl $8,%esp +fstpl (%esp) +pushl $.LC923 +call printf +addl $12,%esp +fldl Random1 +fcompl Z +fstsw %ax +sahf +je .LC924 +fldl Random1 +subl $8,%esp +fstpl (%esp) +pushl $.LC926 +call printf +addl $12,%esp +.LC924: +fldl Random2 +fcompl Z +fstsw %ax +sahf +je .LC927 +fldl Random1 +fcompl Random2 +fstsw %ax +sahf +je .LC927 +fldl Random2 +subl $8,%esp +fstpl (%esp) +pushl $.LC929 +call printf +addl $12,%esp +.LC927: +fldl V9 +fcompl Z +fstsw %ax +sahf +je .LC930 +fldl V9 +subl $8,%esp +fstpl (%esp) +pushl $.LC932 +call printf +addl $12,%esp +.LC930: +fldl Random1 +fcompl Random2 +fstsw %ax +sahf +je .LC933 +movl ErrCnt+8,%edi +leal 1(%edi),%edi +movl %edi,ErrCnt+8 +pushl $.LC937 +pushl $2 +call BadCond +addl $8,%esp +fldl Random2 +subl $8,%esp +fstpl (%esp) +pushl $.LC938 +call printf +addl $12,%esp +fldl Random1 +subl $8,%esp +fstpl (%esp) +pushl $.LC939 +call printf +addl $12,%esp +.LC933: +call Pause +.LC919: +.LC897: +movl $0,%eax +.LC896: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf940: +.size TstPtUf,.Lf940-TstPtUf +.globl notify +.align 16 +.type notify,@function +notify: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl 20(%ebp) +pushl $.LC942 +call printf +addl $8,%esp +pushl $.LC943 +call printf +addl $4,%esp +movl $0,%eax +.LC941: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf944: +.size notify,.Lf944-notify +.globl msglist +.align 16 +.type msglist,@function +msglist: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +jmp .LC947 +.LC946: +movl 20(%ebp),%edi +leal 4(%edi),%esi +movl %esi,20(%ebp) +pushl (,%edi) +pushl $.LC949 +call printf +addl $8,%esp +.LC947: +movl 20(%ebp),%edi +movl (,%edi),%edi +cmpl $0,%edi +jne .LC946 +movl $0,%eax +.LC945: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf950: +.size msglist,.Lf950-msglist +.data +.align 4 +.type instr.952,@object +instr.952: +.long .LC953 +.long .LC954 +.long .LC955 +.long .LC956 +.long .LC957 +.long .LC958 +.long .LC959 +.long .LC960 +.long .LC961 +.long 0 +.size instr.952,40 +.globl Instructions +.text +.align 16 +.type Instructions,@function +Instructions: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl $instr.952 +call msglist +addl $4,%esp +movl $0,%eax +.LC951: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf962: +.size Instructions,.Lf962-Instructions +.data +.align 4 +.type head.964,@object +head.964: +.long .LC965 +.long .LC966 +.long .LC967 +.long .LC968 +.long .LC969 +.long .LC970 +.long .LC971 +.long .LC972 +.long .LC973 +.long .LC974 +.long .LC975 +.long .LC976 +.long .LC977 +.long .LC978 +.long 0 +.size head.964,60 +.globl Heading +.text +.align 16 +.type Heading,@function +Heading: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl $head.964 +call msglist +addl $4,%esp +movl $0,%eax +.LC963: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf979: +.size Heading,.Lf979-Heading +.data +.align 4 +.type chars.981,@object +chars.981: +.long .LC982 +.long .LC983 +.long .LC984 +.long .LC985 +.long .LC986 +.long .LC987 +.long .LC988 +.long .LC989 +.long .LC990 +.long .LC991 +.long .LC992 +.long .LC993 +.long .LC994 +.long .LC995 +.long .LC996 +.long .LC997 +.long .LC998 +.long .LC999 +.long .LC1000 +.long 0 +.size chars.981,80 +.globl Characteristics +.text +.align 16 +.type Characteristics,@function +Characteristics: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl $chars.981 +call msglist +addl $4,%esp +movl $0,%eax +.LC980: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf1001: +.size Characteristics,.Lf1001-Characteristics +.data +.align 4 +.type hist.1003,@object +hist.1003: +.long .LC1004 +.long .LC1005 +.long .LC1006 +.long .LC1007 +.long .LC1008 +.long .LC1009 +.long .LC1010 +.long .LC1011 +.long .LC1012 +.long .LC1013 +.long .LC1014 +.long .LC1015 +.long .LC1016 +.long .LC1017 +.long .LC1018 +.long .LC1019 +.long .LC1020 +.long 0 +.size hist.1003,72 +.globl History +.text +.align 16 +.type History,@function +History: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl $hist.1003 +call msglist +addl $4,%esp +movl $0,%eax +.LC1002: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf1021: +.size History,.Lf1021-History +.globl pow +.align 16 +.type pow,@function +pow: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $96,%esp +movl $0,-20(%ebp) +movl $0,-24(%ebp) +fldl .LC8 +fcompl 28(%ebp) +fstsw %ax +sahf +jne .LC1023 +fldl .LC9 +jmp .LC1022 +.LC1023: +fldl .LC1028 +fcompl 28(%ebp) +fstsw %ax +sahf +ja .LC1027 +fldl .LC1029 +fcompl 28(%ebp) +fstsw %ax +sahf +jae .LC1025 +.LC1027: +fldl .LC827 +fcompl 20(%ebp) +fstsw %ax +sahf +je .LC1025 +fldl 20(%ebp) +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -48(%ebp) +fldl 28(%ebp) +fmull -48(%ebp) +subl $8,%esp +fstpl (%esp) +call exp +addl $8,%esp +fstpl -56(%ebp) +fldl -56(%ebp) +jmp .LC1022 +.LC1025: +fldl .LC8 +fcompl 28(%ebp) +fstsw %ax +sahf +jbe .LC1030 +fldl 28(%ebp) +fchs +fstpl 28(%ebp) +movl $1,-24(%ebp) +.LC1030: +leal -32(%ebp),%edi +pushl %edi +fldl 28(%ebp) +subl $8,%esp +fstpl (%esp) +call modf +addl $12,%esp +fstpl -64(%ebp) +fldl -64(%ebp) +fstpl 28(%ebp) +fldl .LC8 +fcompl 28(%ebp) +fstsw %ax +sahf +je .LC1032 +fldl 20(%ebp) +subl $8,%esp +fstpl (%esp) +call log +addl $8,%esp +fstpl -72(%ebp) +fldl 28(%ebp) +fmull -72(%ebp) +subl $8,%esp +fstpl (%esp) +call exp +addl $8,%esp +fstpl -80(%ebp) +fldl -80(%ebp) +fstpl -16(%ebp) +jmp .LC1033 +.LC1032: +fldl .LC9 +fstpl -16(%ebp) +.LC1033: +leal -8(%ebp),%edi +pushl %edi +fldl 20(%ebp) +subl $8,%esp +fstpl (%esp) +call frexp +addl $12,%esp +fstpl -88(%ebp) +fldl -88(%ebp) +fstpl 20(%ebp) +fldl -32(%ebp) +subl $4,%esp +fistpl 0(%esp) +popl %eax +movl %eax,-4(%ebp) +cmpl $0,%eax +je .LC1034 +.LC1036: +movl -4(%ebp),%edi +andl $1,%edi +cmpl $0,%edi +je .LC1040 +fldl -16(%ebp) +fmull 20(%ebp) +fstpl -16(%ebp) +movl -8(%ebp),%edi +addl %edi,-20(%ebp) +.LC1040: +movl -4(%ebp),%edi +sarl $1,%edi +movl %edi,-4(%ebp) +cmpl $0,%edi +jne .LC1042 +jmp .LC1038 +.LC1042: +fldl 20(%ebp) +fmull 20(%ebp) +fstpl 20(%ebp) +sall $1,-8(%ebp) +fldl .LC1046 +fcompl 20(%ebp) +fstsw %ax +sahf +jbe .LC1036 +fldl .LC1047 +fmull 20(%ebp) +fstpl 20(%ebp) +decl -8(%ebp) +jmp .LC1036 +.LC1038: +.LC1034: +cmpl $0,-24(%ebp) +je .LC1048 +fldl .LC9 +fdivl -16(%ebp) +fstpl -16(%ebp) +negl -20(%ebp) +.LC1048: +pushl -20(%ebp) +fldl -16(%ebp) +subl $8,%esp +fstpl (%esp) +call ldexp +addl $12,%esp +fstpl -96(%ebp) +fldl -96(%ebp) +.LC1022: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf1050: +.size pow,.Lf1050-pow +.bss +.globl UfNGrad +.align 4 +.type UfNGrad,@object +.size UfNGrad,4 +.comm UfNGrad,4 +.globl SqRWrng +.align 4 +.type SqRWrng,@object +.size SqRWrng,4 +.comm SqRWrng,4 +.globl IEEE +.align 4 +.type IEEE,@object +.size IEEE,4 +.comm IEEE,4 +.globl Anomaly +.align 4 +.type Anomaly,@object +.size Anomaly,4 +.comm Anomaly,4 +.globl Monot +.align 4 +.type Monot,@object +.size Monot,4 +.comm Monot,4 +.globl NotMonot +.align 4 +.type NotMonot,@object +.size NotMonot,4 +.comm NotMonot,4 +.globl Done +.align 4 +.type Done,@object +.size Done,4 +.comm Done,4 +.globl Break +.align 4 +.type Break,@object +.size Break,4 +.comm Break,4 +.globl RSqrt +.align 4 +.type RSqrt,@object +.size RSqrt,4 +.comm RSqrt,4 +.globl RAddSub +.align 4 +.type RAddSub,@object +.size RAddSub,4 +.comm RAddSub,4 +.globl RDiv +.align 4 +.type RDiv,@object +.size RDiv,4 +.comm RDiv,4 +.globl RMult +.align 4 +.type RMult,@object +.size RMult,4 +.comm RMult,4 +.globl GAddSub +.align 4 +.type GAddSub,@object +.size GAddSub,4 +.comm GAddSub,4 +.globl GDiv +.align 4 +.type GDiv,@object +.size GDiv,4 +.comm GDiv,4 +.globl GMult +.align 4 +.type GMult,@object +.size GMult,4 +.comm GMult,4 +.globl N1 +.align 4 +.type N1,@object +.size N1,4 +.comm N1,4 +.globl N +.align 4 +.type N,@object +.size N,4 +.comm N,4 +.globl M +.align 4 +.type M,@object +.size M,4 +.comm M,4 +.globl PageNo +.align 4 +.type PageNo,@object +.size PageNo,4 +.comm PageNo,4 +.globl Milestone +.align 4 +.type Milestone,@object +.size Milestone,4 +.comm Milestone,4 +.globl fpecount +.align 4 +.type fpecount,@object +.size fpecount,4 +.comm fpecount,4 +.globl ErrCnt +.align 4 +.type ErrCnt,@object +.size ErrCnt,16 +.comm ErrCnt,16 +.globl Z9 +.align 4 +.type Z9,@object +.size Z9,8 +.comm Z9,8 +.globl Z2 +.align 4 +.type Z2,@object +.size Z2,8 +.comm Z2,8 +.globl Z1 +.align 4 +.type Z1,@object +.size Z1,8 +.comm Z1,8 +.globl PseudoZero +.align 4 +.type PseudoZero,@object +.size PseudoZero,8 +.comm PseudoZero,8 +.globl Z +.align 4 +.type Z,@object +.size Z,8 +.comm Z,8 +.globl Random2 +.align 4 +.type Random2,@object +.size Random2,8 +.comm Random2,8 +.globl Y2 +.align 4 +.type Y2,@object +.size Y2,8 +.comm Y2,8 +.globl Y1 +.align 4 +.type Y1,@object +.size Y1,8 +.comm Y1,8 +.globl Y +.align 4 +.type Y,@object +.size Y,8 +.comm Y,8 +.globl Random1 +.align 4 +.type Random1,@object +.size Random1,8 +.comm Random1,8 +.globl X8 +.align 4 +.type X8,@object +.size X8,8 +.comm X8,8 +.globl X2 +.align 4 +.type X2,@object +.size X2,8 +.comm X2,8 +.globl X1 +.align 4 +.type X1,@object +.size X1,8 +.comm X1,8 +.globl X +.align 4 +.type X,@object +.size X,8 +.comm X,8 +.globl W +.align 4 +.type W,@object +.size W,8 +.comm W,8 +.globl V9 +.align 4 +.type V9,@object +.size V9,8 +.comm V9,8 +.globl V0 +.align 4 +.type V0,@object +.size V0,8 +.comm V0,8 +.globl V +.align 4 +.type V,@object +.size V,8 +.comm V,8 +.globl U2 +.align 4 +.type U2,@object +.size U2,8 +.comm U2,8 +.globl U1 +.align 4 +.type U1,@object +.size U1,8 +.comm U1,8 +.globl UfThold +.align 4 +.type UfThold,@object +.size UfThold,8 +.comm UfThold,8 +.globl OneUlp +.align 4 +.type OneUlp,@object +.size OneUlp,8 +.comm OneUlp,8 +.globl S +.align 4 +.type S,@object +.size S,8 +.comm S,8 +.globl Underflow +.align 4 +.type Underflow,@object +.size Underflow,8 +.comm Underflow,8 +.globl T +.align 4 +.type T,@object +.size T,8 +.comm T,8 +.globl Random9 +.align 4 +.type Random9,@object +.size Random9,8 +.comm Random9,8 +.globl R +.align 4 +.type R,@object +.size R,8 +.comm R,8 +.globl Q9 +.align 4 +.type Q9,@object +.size Q9,8 +.comm Q9,8 +.globl Q +.align 4 +.type Q,@object +.size Q,8 +.comm Q,8 +.globl Precision +.align 4 +.type Precision,@object +.size Precision,8 +.comm Precision,8 +.globl MyZero +.align 4 +.type MyZero,@object +.size MyZero,8 +.comm MyZero,8 +.globl J +.align 4 +.type J,@object +.size J,8 +.comm J,8 +.globl StickyBit +.align 4 +.type StickyBit,@object +.size StickyBit,8 +.comm StickyBit,8 +.globl I +.align 4 +.type I,@object +.size I,4 +.comm I,4 +.globl HInvrse +.align 4 +.type HInvrse,@object +.size HInvrse,8 +.comm HInvrse,8 +.globl H +.align 4 +.type H,@object +.size H,8 +.comm H,8 +.globl F9 +.align 4 +.type F9,@object +.size F9,8 +.comm F9,8 +.globl F6 +.align 4 +.type F6,@object +.size F6,8 +.comm F6,8 +.globl Third +.align 4 +.type Third,@object +.size Third,8 +.comm Third,8 +.globl E9 +.align 4 +.type E9,@object +.size E9,8 +.comm E9,8 +.globl MaxSqEr +.align 4 +.type MaxSqEr,@object +.size MaxSqEr,8 +.comm MaxSqEr,8 +.globl SqEr +.align 4 +.type SqEr,@object +.size SqEr,8 +.comm SqEr,8 +.globl MinSqEr +.align 4 +.type MinSqEr,@object +.size MinSqEr,8 +.comm MinSqEr,8 +.globl E3 +.align 4 +.type E3,@object +.size E3,8 +.comm E3,8 +.globl Exp2 +.align 4 +.type Exp2,@object +.size Exp2,8 +.comm Exp2,8 +.globl E1 +.align 4 +.type E1,@object +.size E1,8 +.comm E1,8 +.globl E0 +.align 4 +.type E0,@object +.size E0,8 +.comm E0,8 +.globl FourD +.align 4 +.type FourD,@object +.size FourD,8 +.comm FourD,8 +.globl D +.align 4 +.type D,@object +.size D,8 +.comm D,8 +.globl CInvrse +.align 4 +.type CInvrse,@object +.size CInvrse,8 +.comm CInvrse,8 +.globl C +.align 4 +.type C,@object +.size C,8 +.comm C,8 +.globl A1 +.align 4 +.type A1,@object +.size A1,8 +.comm A1,8 +.globl AInvrse +.align 4 +.type AInvrse,@object +.size AInvrse,8 +.comm AInvrse,8 +.globl ch +.align 1 +.type ch,@object +.size ch,8 +.comm ch,8 +.globl Indx +.align 4 +.type Indx,@object +.size Indx,4 +.comm Indx,4 +.globl BMinusU2 +.align 4 +.type BMinusU2,@object +.size BMinusU2,8 +.comm BMinusU2,8 +.globl RadixD2 +.align 4 +.type RadixD2,@object +.size RadixD2,8 +.comm RadixD2,8 +.globl BInvrse +.align 4 +.type BInvrse,@object +.size BInvrse,8 +.comm BInvrse,8 +.globl Radix +.align 4 +.type Radix,@object +.size Radix,8 +.comm Radix,8 +.globl sigsave +.align 4 +.type sigsave,@object +.size sigsave,4 +.comm sigsave,4 +.globl ovfl_buf +.align 4 +.type ovfl_buf,@object +.size ovfl_buf,24 +.comm ovfl_buf,24 +.data +.align 4 +.LC1047: +.long 0 +.long 1073741824 +.align 4 +.LC1046: +.long 0 +.long 1071644672 +.align 4 +.LC1029: +.long 0 +.long 1083256832 +.align 4 +.LC1028: +.long 0 +.long -1064226816 +.align 1 +.LC1020: +.byte 115 +.byte 101 +.byte 101 +.byte 32 +.byte 115 +.byte 111 +.byte 117 +.byte 114 +.byte 99 +.byte 101 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 109 +.byte 111 +.byte 114 +.byte 101 +.byte 32 +.byte 104 +.byte 105 +.byte 115 +.byte 116 +.byte 111 +.byte 114 +.byte 121 +.byte 46 +.byte 0 +.align 1 +.LC1019: +.byte 66 +.byte 65 +.byte 83 +.byte 73 +.byte 67 +.byte 32 +.byte 118 +.byte 101 +.byte 114 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 40 +.byte 67 +.byte 41 +.byte 32 +.byte 49 +.byte 57 +.byte 56 +.byte 51 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 80 +.byte 114 +.byte 111 +.byte 102 +.byte 46 +.byte 32 +.byte 87 +.byte 46 +.byte 32 +.byte 77 +.byte 46 +.byte 32 +.byte 75 +.byte 97 +.byte 104 +.byte 97 +.byte 110 +.byte 59 +.byte 0 +.align 1 +.LC1018: +.byte 97 +.byte 115 +.byte 32 +.byte 117 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 99 +.byte 101 +.byte 114 +.byte 116 +.byte 97 +.byte 105 +.byte 110 +.byte 32 +.byte 101 +.byte 97 +.byte 114 +.byte 108 +.byte 121 +.byte 32 +.byte 87 +.byte 65 +.byte 78 +.byte 71 +.byte 32 +.byte 109 +.byte 97 +.byte 99 +.byte 104 +.byte 105 +.byte 110 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC1017: +.byte 102 +.byte 108 +.byte 111 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 45 +.byte 112 +.byte 111 +.byte 105 +.byte 110 +.byte 116 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 115 +.byte 44 +.byte 32 +.byte 98 +.byte 117 +.byte 116 +.byte 32 +.byte 97 +.byte 108 +.byte 115 +.byte 111 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 111 +.byte 119 +.byte 115 +.byte 32 +.byte 108 +.byte 111 +.byte 103 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 105 +.byte 99 +.byte 32 +.byte 101 +.byte 110 +.byte 99 +.byte 111 +.byte 100 +.byte 105 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC1016: +.byte 10 +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 98 +.byte 97 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 117 +.byte 112 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 118 +.byte 101 +.byte 110 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 97 +.byte 108 +.byte 32 +.byte 114 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 114 +.byte 101 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 101 +.byte 110 +.byte 116 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 0 +.align 1 +.LC1015: +.byte 111 +.byte 102 +.byte 32 +.byte 112 +.byte 97 +.byte 116 +.byte 104 +.byte 111 +.byte 108 +.byte 111 +.byte 103 +.byte 105 +.byte 101 +.byte 115 +.byte 44 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 115 +.byte 97 +.byte 121 +.byte 32 +.byte 104 +.byte 111 +.byte 119 +.byte 32 +.byte 119 +.byte 101 +.byte 108 +.byte 108 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 109 +.byte 112 +.byte 108 +.byte 101 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 101 +.byte 100 +.byte 46 +.byte 0 +.align 1 +.LC1014: +.byte 111 +.byte 102 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 44 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 116 +.byte 114 +.byte 105 +.byte 101 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 111 +.byte 112 +.byte 101 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 97 +.byte 32 +.byte 119 +.byte 105 +.byte 100 +.byte 101 +.byte 114 +.byte 32 +.byte 118 +.byte 97 +.byte 114 +.byte 105 +.byte 101 +.byte 116 +.byte 121 +.byte 0 +.align 1 +.LC1013: +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 44 +.byte 32 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 114 +.byte 97 +.byte 110 +.byte 103 +.byte 101 +.byte 32 +.byte 40 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 47 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 115 +.byte 41 +.byte 0 +.align 1 +.LC1012: +.byte 87 +.byte 46 +.byte 32 +.byte 74 +.byte 46 +.byte 32 +.byte 67 +.byte 111 +.byte 100 +.byte 121 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 87 +.byte 46 +.byte 32 +.byte 87 +.byte 97 +.byte 105 +.byte 116 +.byte 101 +.byte 46 +.byte 32 +.byte 65 +.byte 108 +.byte 116 +.byte 104 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 32 +.byte 98 +.byte 111 +.byte 116 +.byte 104 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 115 +.byte 32 +.byte 116 +.byte 114 +.byte 121 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 0 +.align 1 +.LC1011: +.byte 98 +.byte 111 +.byte 111 +.byte 107 +.byte 32 +.byte 32 +.byte 96 +.byte 83 +.byte 111 +.byte 102 +.byte 116 +.byte 119 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 77 +.byte 97 +.byte 110 +.byte 117 +.byte 97 +.byte 108 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 69 +.byte 108 +.byte 101 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 97 +.byte 114 +.byte 121 +.byte 32 +.byte 70 +.byte 117 +.byte 110 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 39 +.byte 32 +.byte 40 +.byte 49 +.byte 57 +.byte 56 +.byte 48 +.byte 41 +.byte 32 +.byte 98 +.byte 121 +.byte 0 +.align 1 +.LC1010: +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 99 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 100 +.byte 32 +.byte 96 +.byte 77 +.byte 65 +.byte 67 +.byte 72 +.byte 65 +.byte 82 +.byte 39 +.byte 44 +.byte 32 +.byte 119 +.byte 104 +.byte 105 +.byte 99 +.byte 104 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 101 +.byte 110 +.byte 100 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 0 +.align 1 +.LC1009: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 99 +.byte 97 +.byte 112 +.byte 97 +.byte 98 +.byte 105 +.byte 108 +.byte 105 +.byte 116 +.byte 105 +.byte 101 +.byte 115 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 103 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 121 +.byte 111 +.byte 110 +.byte 100 +.byte 32 +.byte 97 +.byte 110 +.byte 32 +.byte 101 +.byte 97 +.byte 114 +.byte 108 +.byte 105 +.byte 101 +.byte 114 +.byte 0 +.align 1 +.LC1008: +.byte 70 +.byte 97 +.byte 105 +.byte 108 +.byte 117 +.byte 114 +.byte 101 +.byte 115 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 115 +.byte 101 +.byte 113 +.byte 117 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC1007: +.byte 32 +.byte 32 +.byte 32 +.byte 70 +.byte 65 +.byte 73 +.byte 76 +.byte 85 +.byte 82 +.byte 69 +.byte 115 +.byte 44 +.byte 32 +.byte 108 +.byte 105 +.byte 107 +.byte 101 +.byte 32 +.byte 50 +.byte 43 +.byte 50 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 53 +.byte 32 +.byte 46 +.byte 0 +.align 1 +.LC1006: +.byte 32 +.byte 32 +.byte 32 +.byte 83 +.byte 101 +.byte 114 +.byte 105 +.byte 111 +.byte 117 +.byte 115 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 115 +.byte 44 +.byte 32 +.byte 108 +.byte 105 +.byte 107 +.byte 101 +.byte 32 +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 97 +.byte 32 +.byte 103 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 44 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 0 +.align 1 +.LC1005: +.byte 32 +.byte 32 +.byte 32 +.byte 70 +.byte 76 +.byte 65 +.byte 87 +.byte 115 +.byte 44 +.byte 32 +.byte 108 +.byte 105 +.byte 107 +.byte 101 +.byte 32 +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 97 +.byte 32 +.byte 115 +.byte 116 +.byte 105 +.byte 99 +.byte 107 +.byte 121 +.byte 32 +.byte 98 +.byte 105 +.byte 116 +.byte 44 +.byte 0 +.align 1 +.LC1004: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 97 +.byte 116 +.byte 116 +.byte 101 +.byte 109 +.byte 112 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 114 +.byte 105 +.byte 109 +.byte 105 +.byte 110 +.byte 97 +.byte 116 +.byte 101 +.byte 32 +.byte 97 +.byte 109 +.byte 111 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC1000: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 68 +.byte 101 +.byte 99 +.byte 105 +.byte 109 +.byte 97 +.byte 108 +.byte 45 +.byte 66 +.byte 105 +.byte 110 +.byte 97 +.byte 114 +.byte 121 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 118 +.byte 101 +.byte 114 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 78 +.byte 79 +.byte 84 +.byte 32 +.byte 89 +.byte 69 +.byte 84 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 97 +.byte 99 +.byte 99 +.byte 117 +.byte 114 +.byte 97 +.byte 99 +.byte 121 +.byte 46 +.byte 0 +.align 1 +.LC999: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 69 +.byte 120 +.byte 116 +.byte 114 +.byte 97 +.byte 45 +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 101 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 101 +.byte 120 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 101 +.byte 118 +.byte 101 +.byte 97 +.byte 108 +.byte 101 +.byte 100 +.byte 32 +.byte 98 +.byte 117 +.byte 116 +.byte 32 +.byte 78 +.byte 79 +.byte 84 +.byte 32 +.byte 89 +.byte 69 +.byte 84 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 101 +.byte 100 +.byte 46 +.byte 0 +.align 1 +.LC998: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 83 +.byte 113 +.byte 114 +.byte 116 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 101 +.byte 100 +.byte 46 +.byte 32 +.byte 32 +.byte 89 +.byte 94 +.byte 88 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 101 +.byte 100 +.byte 46 +.byte 0 +.align 1 +.LC997: +.byte 9 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 116 +.byte 97 +.byte 109 +.byte 105 +.byte 110 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 112 +.byte 115 +.byte 101 +.byte 117 +.byte 100 +.byte 111 +.byte 45 +.byte 122 +.byte 101 +.byte 114 +.byte 111 +.byte 115 +.byte 46 +.byte 0 +.align 1 +.LC996: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 99 +.byte 104 +.byte 101 +.byte 99 +.byte 107 +.byte 101 +.byte 100 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 115 +.byte 105 +.byte 115 +.byte 116 +.byte 101 +.byte 110 +.byte 99 +.byte 121 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 0 +.align 1 +.LC995: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 86 +.byte 48 +.byte 32 +.byte 32 +.byte 116 +.byte 101 +.byte 108 +.byte 108 +.byte 115 +.byte 44 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 108 +.byte 121 +.byte 44 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 32 +.byte 73 +.byte 110 +.byte 102 +.byte 105 +.byte 110 +.byte 105 +.byte 116 +.byte 121 +.byte 32 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 114 +.byte 101 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 101 +.byte 110 +.byte 116 +.byte 101 +.byte 100 +.byte 46 +.byte 0 +.align 1 +.LC994: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 86 +.byte 32 +.byte 61 +.byte 32 +.byte 97 +.byte 110 +.byte 32 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 44 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 108 +.byte 121 +.byte 46 +.byte 0 +.align 1 +.LC993: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 69 +.byte 48 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 80 +.byte 115 +.byte 101 +.byte 117 +.byte 100 +.byte 111 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 116 +.byte 101 +.byte 108 +.byte 108 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 97 +.byte 98 +.byte 114 +.byte 117 +.byte 112 +.byte 116 +.byte 44 +.byte 32 +.byte 103 +.byte 114 +.byte 97 +.byte 100 +.byte 117 +.byte 97 +.byte 108 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 102 +.byte 117 +.byte 122 +.byte 122 +.byte 121 +.byte 46 +.byte 0 +.align 1 +.LC992: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 84 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 61 +.byte 32 +.byte 97 +.byte 110 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 46 +.byte 0 +.align 1 +.LC991: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 87 +.byte 104 +.byte 101 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 97 +.byte 32 +.byte 83 +.byte 116 +.byte 105 +.byte 99 +.byte 107 +.byte 121 +.byte 32 +.byte 66 +.byte 105 +.byte 116 +.byte 32 +.byte 117 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 105 +.byte 110 +.byte 103 +.byte 46 +.byte 0 +.align 1 +.LC990: +.byte 9 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 46 +.byte 44 +.byte 32 +.byte 68 +.byte 105 +.byte 118 +.byte 46 +.byte 44 +.byte 32 +.byte 65 +.byte 100 +.byte 100 +.byte 47 +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 46 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 83 +.byte 113 +.byte 114 +.byte 116 +.byte 46 +.byte 0 +.align 1 +.LC989: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 87 +.byte 104 +.byte 101 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 44 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 100 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 115 +.byte 111 +.byte 109 +.byte 101 +.byte 116 +.byte 104 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 101 +.byte 108 +.byte 115 +.byte 101 +.byte 0 +.align 1 +.LC988: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 65 +.byte 100 +.byte 101 +.byte 113 +.byte 117 +.byte 97 +.byte 99 +.byte 121 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 103 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 46 +.byte 44 +.byte 32 +.byte 68 +.byte 105 +.byte 118 +.byte 46 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 46 +.byte 0 +.align 1 +.LC987: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 85 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 49 +.byte 47 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 94 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 61 +.byte 32 +.byte 79 +.byte 110 +.byte 101 +.byte 32 +.byte 85 +.byte 108 +.byte 112 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 108 +.byte 105 +.byte 116 +.byte 116 +.byte 108 +.byte 101 +.byte 32 +.byte 108 +.byte 101 +.byte 115 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 110 +.byte 32 +.byte 49 +.byte 46 +.byte 48 +.byte 32 +.byte 46 +.byte 0 +.align 1 +.LC986: +.byte 9 +.byte 40 +.byte 79 +.byte 110 +.byte 101 +.byte 85 +.byte 108 +.byte 112 +.byte 110 +.byte 105 +.byte 116 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 76 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 80 +.byte 108 +.byte 97 +.byte 99 +.byte 101 +.byte 41 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 49 +.byte 46 +.byte 48 +.byte 48 +.byte 48 +.byte 120 +.byte 120 +.byte 120 +.byte 32 +.byte 46 +.byte 0 +.align 1 +.LC985: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 85 +.byte 50 +.byte 32 +.byte 61 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 47 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 94 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 61 +.byte 32 +.byte 79 +.byte 110 +.byte 101 +.byte 32 +.byte 85 +.byte 108 +.byte 112 +.byte 0 +.align 1 +.LC984: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 61 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 105 +.byte 102 +.byte 105 +.byte 99 +.byte 97 +.byte 110 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 99 +.byte 97 +.byte 114 +.byte 114 +.byte 105 +.byte 101 +.byte 100 +.byte 46 +.byte 0 +.align 1 +.LC983: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 49 +.byte 44 +.byte 32 +.byte 50 +.byte 44 +.byte 32 +.byte 52 +.byte 44 +.byte 32 +.byte 56 +.byte 44 +.byte 32 +.byte 49 +.byte 48 +.byte 44 +.byte 32 +.byte 49 +.byte 54 +.byte 44 +.byte 32 +.byte 49 +.byte 48 +.byte 48 +.byte 44 +.byte 32 +.byte 50 +.byte 53 +.byte 54 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 0 +.align 1 +.LC982: +.byte 82 +.byte 117 +.byte 110 +.byte 110 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 114 +.byte 101 +.byte 118 +.byte 101 +.byte 97 +.byte 108 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 115 +.byte 101 +.byte 32 +.byte 99 +.byte 104 +.byte 97 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 101 +.byte 114 +.byte 105 +.byte 115 +.byte 116 +.byte 105 +.byte 99 +.byte 115 +.byte 58 +.byte 0 +.align 1 +.LC978: +.byte 9 +.byte 79 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 114 +.byte 101 +.byte 108 +.byte 101 +.byte 118 +.byte 97 +.byte 110 +.byte 116 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 105 +.byte 108 +.byte 101 +.byte 114 +.byte 32 +.byte 111 +.byte 112 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 58 +.byte 0 +.align 1 +.LC977: +.byte 9 +.byte 79 +.byte 112 +.byte 116 +.byte 105 +.byte 109 +.byte 105 +.byte 122 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 108 +.byte 101 +.byte 118 +.byte 101 +.byte 108 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC976: +.byte 9 +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 105 +.byte 108 +.byte 101 +.byte 114 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC975: +.byte 9 +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 114 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC974: +.byte 9 +.byte 86 +.byte 101 +.byte 114 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 58 +.byte 9 +.byte 49 +.byte 48 +.byte 32 +.byte 70 +.byte 101 +.byte 98 +.byte 114 +.byte 117 +.byte 97 +.byte 114 +.byte 121 +.byte 32 +.byte 49 +.byte 57 +.byte 56 +.byte 57 +.byte 59 +.byte 0 +.align 1 +.LC973: +.byte 9 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 58 +.byte 9 +.byte 100 +.byte 111 +.byte 117 +.byte 98 +.byte 108 +.byte 101 +.byte 59 +.byte 0 +.align 1 +.LC972: +.byte 73 +.byte 110 +.byte 32 +.byte 100 +.byte 111 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 115 +.byte 111 +.byte 44 +.byte 32 +.byte 112 +.byte 108 +.byte 101 +.byte 97 +.byte 115 +.byte 101 +.byte 32 +.byte 105 +.byte 110 +.byte 99 +.byte 108 +.byte 117 +.byte 100 +.byte 101 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 102 +.byte 111 +.byte 108 +.byte 108 +.byte 111 +.byte 119 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 105 +.byte 110 +.byte 102 +.byte 111 +.byte 114 +.byte 109 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 58 +.byte 0 +.align 1 +.LC971: +.byte 9 +.byte 83 +.byte 97 +.byte 110 +.byte 32 +.byte 70 +.byte 114 +.byte 97 +.byte 110 +.byte 99 +.byte 105 +.byte 115 +.byte 99 +.byte 111 +.byte 44 +.byte 32 +.byte 67 +.byte 65 +.byte 32 +.byte 57 +.byte 52 +.byte 49 +.byte 52 +.byte 51 +.byte 45 +.byte 48 +.byte 55 +.byte 48 +.byte 52 +.byte 44 +.byte 32 +.byte 85 +.byte 83 +.byte 65 +.byte 10 +.byte 0 +.align 1 +.LC970: +.byte 9 +.byte 85 +.byte 110 +.byte 105 +.byte 118 +.byte 101 +.byte 114 +.byte 115 +.byte 105 +.byte 116 +.byte 121 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 67 +.byte 97 +.byte 108 +.byte 105 +.byte 102 +.byte 111 +.byte 114 +.byte 110 +.byte 105 +.byte 97 +.byte 0 +.align 1 +.LC969: +.byte 9 +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 67 +.byte 101 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 85 +.byte 45 +.byte 55 +.byte 54 +.byte 0 +.align 1 +.LC968: +.byte 9 +.byte 82 +.byte 105 +.byte 99 +.byte 104 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 75 +.byte 97 +.byte 114 +.byte 112 +.byte 105 +.byte 110 +.byte 115 +.byte 107 +.byte 105 +.byte 0 +.align 1 +.LC967: +.byte 80 +.byte 108 +.byte 101 +.byte 97 +.byte 115 +.byte 101 +.byte 32 +.byte 115 +.byte 101 +.byte 110 +.byte 100 +.byte 32 +.byte 115 +.byte 117 +.byte 103 +.byte 103 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 105 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 114 +.byte 101 +.byte 115 +.byte 117 +.byte 108 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 0 +.align 1 +.LC966: +.byte 99 +.byte 111 +.byte 112 +.byte 101 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 117 +.byte 110 +.byte 97 +.byte 110 +.byte 116 +.byte 105 +.byte 99 +.byte 105 +.byte 112 +.byte 97 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 110 +.byte 101 +.byte 119 +.byte 108 +.byte 121 +.byte 32 +.byte 117 +.byte 110 +.byte 99 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 112 +.byte 97 +.byte 116 +.byte 104 +.byte 111 +.byte 108 +.byte 111 +.byte 103 +.byte 105 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC965: +.byte 85 +.byte 115 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 105 +.byte 110 +.byte 118 +.byte 105 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 104 +.byte 101 +.byte 108 +.byte 112 +.byte 32 +.byte 100 +.byte 101 +.byte 98 +.byte 117 +.byte 103 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 97 +.byte 117 +.byte 103 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 115 +.byte 111 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 119 +.byte 105 +.byte 108 +.byte 108 +.byte 0 +.align 1 +.LC961: +.byte 65 +.byte 110 +.byte 115 +.byte 119 +.byte 101 +.byte 114 +.byte 32 +.byte 113 +.byte 117 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 89 +.byte 44 +.byte 32 +.byte 121 +.byte 44 +.byte 32 +.byte 78 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 110 +.byte 32 +.byte 40 +.byte 117 +.byte 110 +.byte 108 +.byte 101 +.byte 115 +.byte 115 +.byte 32 +.byte 111 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 119 +.byte 105 +.byte 115 +.byte 101 +.byte 32 +.byte 105 +.byte 110 +.byte 100 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 101 +.byte 100 +.byte 41 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC960: +.byte 97 +.byte 109 +.byte 101 +.byte 110 +.byte 100 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 109 +.byte 97 +.byte 107 +.byte 101 +.byte 32 +.byte 102 +.byte 117 +.byte 114 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 101 +.byte 115 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC959: +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 97 +.byte 110 +.byte 121 +.byte 119 +.byte 97 +.byte 121 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 115 +.byte 101 +.byte 101 +.byte 32 +.byte 104 +.byte 111 +.byte 119 +.byte 32 +.byte 109 +.byte 97 +.byte 110 +.byte 121 +.byte 32 +.byte 109 +.byte 105 +.byte 108 +.byte 101 +.byte 115 +.byte 116 +.byte 111 +.byte 110 +.byte 101 +.byte 115 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 112 +.byte 97 +.byte 115 +.byte 115 +.byte 101 +.byte 115 +.byte 44 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 110 +.byte 0 +.align 1 +.LC958: +.byte 119 +.byte 97 +.byte 114 +.byte 110 +.byte 105 +.byte 110 +.byte 103 +.byte 46 +.byte 32 +.byte 32 +.byte 73 +.byte 102 +.byte 32 +.byte 112 +.byte 101 +.byte 114 +.byte 115 +.byte 117 +.byte 97 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 118 +.byte 97 +.byte 105 +.byte 108 +.byte 115 +.byte 32 +.byte 110 +.byte 97 +.byte 117 +.byte 103 +.byte 104 +.byte 116 +.byte 44 +.byte 32 +.byte 100 +.byte 111 +.byte 110 +.byte 39 +.byte 116 +.byte 32 +.byte 100 +.byte 101 +.byte 115 +.byte 112 +.byte 97 +.byte 105 +.byte 114 +.byte 32 +.byte 98 +.byte 117 +.byte 116 +.byte 32 +.byte 114 +.byte 117 +.byte 110 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 0 +.align 1 +.LC957: +.byte 116 +.byte 111 +.byte 32 +.byte 112 +.byte 101 +.byte 114 +.byte 115 +.byte 101 +.byte 118 +.byte 101 +.byte 114 +.byte 101 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 97 +.byte 32 +.byte 115 +.byte 117 +.byte 114 +.byte 114 +.byte 111 +.byte 103 +.byte 97 +.byte 116 +.byte 101 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 97 +.byte 102 +.byte 116 +.byte 101 +.byte 114 +.byte 44 +.byte 32 +.byte 112 +.byte 101 +.byte 114 +.byte 104 +.byte 97 +.byte 112 +.byte 115 +.byte 44 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 112 +.byte 108 +.byte 97 +.byte 121 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 115 +.byte 111 +.byte 109 +.byte 101 +.byte 0 +.align 1 +.LC956: +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 108 +.byte 105 +.byte 107 +.byte 101 +.byte 32 +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 47 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 111 +.byte 99 +.byte 99 +.byte 117 +.byte 114 +.byte 115 +.byte 44 +.byte 32 +.byte 98 +.byte 117 +.byte 116 +.byte 32 +.byte 114 +.byte 97 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 0 +.align 1 +.LC955: +.byte 116 +.byte 114 +.byte 121 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 112 +.byte 101 +.byte 114 +.byte 115 +.byte 117 +.byte 97 +.byte 100 +.byte 101 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 78 +.byte 79 +.byte 84 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 116 +.byte 101 +.byte 114 +.byte 109 +.byte 105 +.byte 110 +.byte 97 +.byte 116 +.byte 101 +.byte 32 +.byte 101 +.byte 120 +.byte 101 +.byte 99 +.byte 117 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 110 +.byte 32 +.byte 97 +.byte 110 +.byte 0 +.align 1 +.LC954: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 96 +.byte 69 +.byte 78 +.byte 68 +.byte 32 +.byte 79 +.byte 70 +.byte 32 +.byte 84 +.byte 69 +.byte 83 +.byte 84 +.byte 39 +.byte 44 +.byte 10 +.byte 0 +.align 1 +.LC953: +.byte 76 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 115 +.byte 116 +.byte 111 +.byte 112 +.byte 32 +.byte 112 +.byte 114 +.byte 101 +.byte 109 +.byte 97 +.byte 116 +.byte 117 +.byte 114 +.byte 101 +.byte 108 +.byte 121 +.byte 44 +.byte 32 +.byte 105 +.byte 46 +.byte 101 +.byte 46 +.byte 32 +.byte 98 +.byte 101 +.byte 102 +.byte 111 +.byte 114 +.byte 101 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 112 +.byte 108 +.byte 97 +.byte 121 +.byte 105 +.byte 110 +.byte 103 +.byte 10 +.byte 0 +.align 1 +.LC949: +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC943: +.byte 32 +.byte 32 +.byte 32 +.byte 80 +.byte 76 +.byte 69 +.byte 65 +.byte 83 +.byte 69 +.byte 32 +.byte 78 +.byte 79 +.byte 84 +.byte 73 +.byte 70 +.byte 89 +.byte 32 +.byte 75 +.byte 65 +.byte 82 +.byte 80 +.byte 73 +.byte 78 +.byte 75 +.byte 83 +.byte 73 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC942: +.byte 37 +.byte 115 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 105 +.byte 110 +.byte 99 +.byte 111 +.byte 110 +.byte 115 +.byte 105 +.byte 115 +.byte 116 +.byte 101 +.byte 110 +.byte 116 +.byte 46 +.byte 46 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC939: +.byte 9 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 90 +.byte 32 +.byte 42 +.byte 32 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC938: +.byte 9 +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 49 +.byte 32 +.byte 42 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC937: +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 100 +.byte 111 +.byte 101 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 109 +.byte 117 +.byte 116 +.byte 101 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC932: +.byte 90 +.byte 32 +.byte 47 +.byte 32 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC929: +.byte 49 +.byte 32 +.byte 42 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 37 +.byte 103 +.byte 10 +.byte 0 +.align 1 +.LC926: +.byte 90 +.byte 32 +.byte 42 +.byte 32 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 0 +.align 1 +.LC923: +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 9 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 101 +.byte 115 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.LC922: +.byte 87 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 112 +.byte 114 +.byte 105 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 0 +.align 1 +.LC917: +.byte 84 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC914: +.byte 84 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 86 +.byte 69 +.byte 82 +.byte 89 +.byte 32 +.byte 83 +.byte 69 +.byte 82 +.byte 73 +.byte 79 +.byte 85 +.byte 83 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC908: +.byte 32 +.byte 104 +.byte 97 +.byte 115 +.byte 32 +.byte 78 +.byte 79 +.byte 84 +.byte 32 +.byte 106 +.byte 117 +.byte 115 +.byte 116 +.byte 32 +.byte 98 +.byte 101 +.byte 101 +.byte 110 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 97 +.byte 108 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC907: +.byte 84 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 79 +.byte 46 +.byte 75 +.byte 46 +.byte 44 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 118 +.byte 105 +.byte 100 +.byte 101 +.byte 100 +.byte 32 +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 47 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 0 +.align 1 +.LC904: +.byte 87 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 109 +.byte 97 +.byte 99 +.byte 104 +.byte 105 +.byte 110 +.byte 101 +.byte 32 +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 40 +.byte 90 +.byte 32 +.byte 43 +.byte 32 +.byte 90 +.byte 41 +.byte 32 +.byte 47 +.byte 32 +.byte 90 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC900: +.byte 40 +.byte 90 +.byte 32 +.byte 43 +.byte 32 +.byte 90 +.byte 41 +.byte 32 +.byte 47 +.byte 32 +.byte 90 +.byte 32 +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 115 +.byte 97 +.byte 102 +.byte 101 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC899: +.byte 83 +.byte 105 +.byte 110 +.byte 99 +.byte 101 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 100 +.byte 101 +.byte 110 +.byte 105 +.byte 101 +.byte 115 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 101 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 0 +.align 1 +.LC894: +.byte 83 +.byte 105 +.byte 109 +.byte 105 +.byte 108 +.byte 97 +.byte 114 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 114 +.byte 101 +.byte 112 +.byte 97 +.byte 110 +.byte 99 +.byte 105 +.byte 101 +.byte 115 +.byte 32 +.byte 104 +.byte 97 +.byte 118 +.byte 101 +.byte 32 +.byte 111 +.byte 99 +.byte 99 +.byte 117 +.byte 114 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 116 +.byte 105 +.byte 109 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC882: +.byte 9 +.byte 9 +.byte 116 +.byte 104 +.byte 101 +.byte 121 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC881: +.byte 9 +.byte 119 +.byte 104 +.byte 105 +.byte 99 +.byte 104 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 117 +.byte 110 +.byte 101 +.byte 113 +.byte 117 +.byte 97 +.byte 108 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 59 +.byte 10 +.byte 0 +.align 1 +.LC880: +.byte 9 +.byte 121 +.byte 105 +.byte 101 +.byte 108 +.byte 100 +.byte 101 +.byte 100 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 59 +.byte 10 +.byte 0 +.align 1 +.LC879: +.byte 9 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 32 +.byte 94 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 10 +.byte 0 +.align 1 +.LC878: +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 10 +.byte 0 +.align 1 +.LC877: +.byte 87 +.byte 65 +.byte 82 +.byte 78 +.byte 73 +.byte 78 +.byte 71 +.byte 58 +.byte 32 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 10 +.byte 0 +.align 1 +.LC856: +.byte 9 +.byte 105 +.byte 110 +.byte 115 +.byte 116 +.byte 101 +.byte 97 +.byte 100 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 48 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC855: +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 40 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 32 +.byte 45 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 4 +.LC846: +.long -1998362383 +.long 1054144693 +.align 1 +.LC843: +.byte 37 +.byte 115 +.byte 58 +.byte 32 +.byte 32 +.byte 37 +.byte 115 +.byte 0 +.align 1 +.LC842: +.byte 70 +.byte 76 +.byte 65 +.byte 87 +.byte 0 +.align 1 +.LC841: +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 0 +.align 1 +.LC840: +.byte 83 +.byte 69 +.byte 82 +.byte 73 +.byte 79 +.byte 85 +.byte 83 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 0 +.align 1 +.LC839: +.byte 70 +.byte 65 +.byte 73 +.byte 76 +.byte 85 +.byte 82 +.byte 69 +.byte 0 +.align 1 +.LC831: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 80 +.byte 97 +.byte 103 +.byte 101 +.byte 58 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 10 +.byte 0 +.align 1 +.LC830: +.byte 10 +.byte 68 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 105 +.byte 115 +.byte 32 +.byte 114 +.byte 101 +.byte 115 +.byte 117 +.byte 109 +.byte 101 +.byte 115 +.byte 32 +.byte 97 +.byte 102 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 109 +.byte 105 +.byte 108 +.byte 101 +.byte 115 +.byte 116 +.byte 111 +.byte 110 +.byte 101 +.byte 32 +.byte 78 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 32 +.byte 37 +.byte 100 +.byte 0 +.align 4 +.LC827: +.long 0 +.long -1074790400 +.align 1 +.LC821: +.byte 69 +.byte 78 +.byte 68 +.byte 32 +.byte 79 +.byte 70 +.byte 32 +.byte 84 +.byte 69 +.byte 83 +.byte 84 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC820: +.byte 10 +.byte 65 +.byte 32 +.byte 116 +.byte 111 +.byte 116 +.byte 97 +.byte 108 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 102 +.byte 108 +.byte 111 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 112 +.byte 111 +.byte 105 +.byte 110 +.byte 116 +.byte 32 +.byte 101 +.byte 120 +.byte 99 +.byte 101 +.byte 112 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 119 +.byte 101 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 101 +.byte 103 +.byte 105 +.byte 115 +.byte 116 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC817: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 69 +.byte 120 +.byte 99 +.byte 101 +.byte 108 +.byte 108 +.byte 101 +.byte 110 +.byte 116 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC816: +.byte 32 +.byte 100 +.byte 117 +.byte 114 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 71 +.byte 114 +.byte 97 +.byte 100 +.byte 117 +.byte 97 +.byte 108 +.byte 32 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC815: +.byte 44 +.byte 10 +.byte 101 +.byte 120 +.byte 99 +.byte 101 +.byte 112 +.byte 116 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 112 +.byte 111 +.byte 115 +.byte 115 +.byte 105 +.byte 98 +.byte 108 +.byte 121 +.byte 32 +.byte 68 +.byte 111 +.byte 117 +.byte 98 +.byte 108 +.byte 101 +.byte 32 +.byte 82 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 105 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC814: +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC811: +.byte 56 +.byte 53 +.byte 52 +.byte 0 +.align 1 +.LC810: +.byte 55 +.byte 53 +.byte 52 +.byte 0 +.align 1 +.LC807: +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 112 +.byte 111 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 73 +.byte 69 +.byte 69 +.byte 69 +.byte 32 +.byte 115 +.byte 116 +.byte 97 +.byte 110 +.byte 100 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 80 +.byte 0 +.align 1 +.LC806: +.byte 82 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 111 +.byte 114 +.byte 109 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 0 +.align 1 +.LC803: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 115 +.byte 101 +.byte 101 +.byte 109 +.byte 115 +.byte 32 +.byte 83 +.byte 97 +.byte 116 +.byte 105 +.byte 115 +.byte 102 +.byte 97 +.byte 99 +.byte 116 +.byte 111 +.byte 114 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC797: +.byte 78 +.byte 111 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 117 +.byte 114 +.byte 101 +.byte 115 +.byte 44 +.byte 32 +.byte 100 +.byte 101 +.byte 102 +.byte 101 +.byte 99 +.byte 116 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 102 +.byte 108 +.byte 97 +.byte 119 +.byte 115 +.byte 32 +.byte 104 +.byte 97 +.byte 118 +.byte 101 +.byte 32 +.byte 98 +.byte 101 +.byte 101 +.byte 110 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC796: +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 39 +.byte 115 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 115 +.byte 101 +.byte 113 +.byte 117 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC795: +.byte 80 +.byte 111 +.byte 116 +.byte 101 +.byte 110 +.byte 116 +.byte 105 +.byte 97 +.byte 108 +.byte 108 +.byte 121 +.byte 32 +.byte 102 +.byte 97 +.byte 116 +.byte 97 +.byte 108 +.byte 32 +.byte 70 +.byte 65 +.byte 73 +.byte 76 +.byte 85 +.byte 82 +.byte 69 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 104 +.byte 97 +.byte 118 +.byte 101 +.byte 32 +.byte 115 +.byte 112 +.byte 111 +.byte 105 +.byte 108 +.byte 101 +.byte 100 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 0 +.align 1 +.LC792: +.byte 117 +.byte 110 +.byte 97 +.byte 99 +.byte 99 +.byte 101 +.byte 112 +.byte 116 +.byte 97 +.byte 98 +.byte 108 +.byte 101 +.byte 32 +.byte 83 +.byte 101 +.byte 114 +.byte 105 +.byte 111 +.byte 117 +.byte 115 +.byte 32 +.byte 68 +.byte 101 +.byte 102 +.byte 101 +.byte 99 +.byte 116 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC791: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 104 +.byte 97 +.byte 115 +.byte 32 +.byte 0 +.align 1 +.LC787: +.byte 100 +.byte 101 +.byte 115 +.byte 112 +.byte 105 +.byte 116 +.byte 101 +.byte 32 +.byte 105 +.byte 110 +.byte 99 +.byte 111 +.byte 110 +.byte 118 +.byte 101 +.byte 110 +.byte 105 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 68 +.byte 101 +.byte 102 +.byte 101 +.byte 99 +.byte 116 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC786: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 65 +.byte 99 +.byte 99 +.byte 101 +.byte 112 +.byte 116 +.byte 97 +.byte 98 +.byte 108 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC781: +.byte 83 +.byte 97 +.byte 116 +.byte 105 +.byte 115 +.byte 102 +.byte 97 +.byte 99 +.byte 116 +.byte 111 +.byte 114 +.byte 121 +.byte 32 +.byte 116 +.byte 104 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 32 +.byte 102 +.byte 108 +.byte 97 +.byte 119 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC780: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 100 +.byte 105 +.byte 97 +.byte 103 +.byte 110 +.byte 111 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 115 +.byte 101 +.byte 101 +.byte 109 +.byte 115 +.byte 32 +.byte 0 +.align 1 +.LC769: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 32 +.byte 37 +.byte 45 +.byte 50 +.byte 57 +.byte 115 +.byte 32 +.byte 37 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC762: +.byte 70 +.byte 76 +.byte 65 +.byte 87 +.byte 115 +.byte 32 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 61 +.byte 0 +.align 1 +.LC761: +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 115 +.byte 32 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 61 +.byte 0 +.align 1 +.LC760: +.byte 83 +.byte 69 +.byte 82 +.byte 73 +.byte 79 +.byte 85 +.byte 83 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 115 +.byte 32 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 61 +.byte 0 +.align 1 +.LC759: +.byte 70 +.byte 65 +.byte 73 +.byte 76 +.byte 85 +.byte 82 +.byte 69 +.byte 115 +.byte 32 +.byte 32 +.byte 101 +.byte 110 +.byte 99 +.byte 111 +.byte 117 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 101 +.byte 100 +.byte 32 +.byte 61 +.byte 0 +.align 1 +.LC755: +.byte 10 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 84 +.byte 114 +.byte 121 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 32 +.byte 48 +.byte 32 +.byte 47 +.byte 32 +.byte 48 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 100 +.byte 117 +.byte 99 +.byte 101 +.byte 115 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 0 +.align 1 +.LC754: +.byte 32 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC751: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 84 +.byte 114 +.byte 121 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 32 +.byte 49 +.byte 32 +.byte 47 +.byte 32 +.byte 48 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 100 +.byte 117 +.byte 99 +.byte 101 +.byte 115 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 0 +.align 1 +.LC750: +.byte 87 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 109 +.byte 101 +.byte 115 +.byte 115 +.byte 97 +.byte 103 +.byte 101 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 47 +.byte 111 +.byte 114 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 115 +.byte 32 +.byte 100 +.byte 111 +.byte 101 +.byte 115 +.byte 32 +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 100 +.byte 117 +.byte 99 +.byte 101 +.byte 63 +.byte 10 +.byte 0 +.align 1 +.LC749: +.byte 32 +.byte 32 +.byte 105 +.byte 110 +.byte 115 +.byte 116 +.byte 101 +.byte 97 +.byte 100 +.byte 44 +.byte 32 +.byte 88 +.byte 32 +.byte 47 +.byte 32 +.byte 88 +.byte 32 +.byte 45 +.byte 32 +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 45 +.byte 32 +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC748: +.byte 32 +.byte 32 +.byte 88 +.byte 32 +.byte 47 +.byte 32 +.byte 88 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 49 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 110 +.byte 32 +.byte 88 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC743: +.byte 32 +.byte 32 +.byte 88 +.byte 32 +.byte 47 +.byte 32 +.byte 88 +.byte 32 +.byte 32 +.byte 116 +.byte 114 +.byte 97 +.byte 112 +.byte 115 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 110 +.byte 32 +.byte 88 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 103 +.byte 10 +.byte 0 +.align 1 +.LC728: +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 102 +.byte 97 +.byte 114 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 49 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC727: +.byte 32 +.byte 117 +.byte 110 +.byte 98 +.byte 97 +.byte 108 +.byte 97 +.byte 110 +.byte 99 +.byte 101 +.byte 100 +.byte 32 +.byte 114 +.byte 97 +.byte 110 +.byte 103 +.byte 101 +.byte 59 +.byte 32 +.byte 85 +.byte 102 +.byte 84 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 42 +.byte 32 +.byte 86 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 9 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC726: +.byte 66 +.byte 97 +.byte 100 +.byte 108 +.byte 121 +.byte 0 +.align 1 +.LC719: +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 102 +.byte 97 +.byte 114 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 40 +.byte 90 +.byte 41 +.byte 32 +.byte 94 +.byte 32 +.byte 50 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC718: +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC706: +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 102 +.byte 97 +.byte 114 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 40 +.byte 90 +.byte 41 +.byte 32 +.byte 94 +.byte 32 +.byte 50 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC705: +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 119 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 112 +.byte 114 +.byte 105 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC688: +.byte 43 +.byte 45 +.byte 37 +.byte 103 +.byte 44 +.byte 32 +.byte 43 +.byte 45 +.byte 37 +.byte 103 +.byte 10 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 43 +.byte 45 +.byte 37 +.byte 103 +.byte 32 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 117 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 46 +.byte 0 +.align 1 +.LC687: +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 105 +.byte 110 +.byte 118 +.byte 111 +.byte 108 +.byte 118 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 0 +.align 1 +.LC681: +.byte 97 +.byte 98 +.byte 111 +.byte 118 +.byte 101 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC680: +.byte 65 +.byte 110 +.byte 121 +.byte 32 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 97 +.byte 108 +.byte 32 +.byte 115 +.byte 101 +.byte 112 +.byte 97 +.byte 114 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 42 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 111 +.byte 110 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC679: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 86 +.byte 32 +.byte 47 +.byte 32 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC678: +.byte 78 +.byte 111 +.byte 32 +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 97 +.byte 108 +.byte 101 +.byte 100 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 86 +.byte 32 +.byte 42 +.byte 32 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC677: +.byte 84 +.byte 104 +.byte 101 +.byte 114 +.byte 101 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 32 +.byte 115 +.byte 97 +.byte 116 +.byte 117 +.byte 114 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 98 +.byte 101 +.byte 99 +.byte 97 +.byte 117 +.byte 115 +.byte 101 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 115 +.byte 121 +.byte 115 +.byte 116 +.byte 101 +.byte 109 +.byte 32 +.byte 116 +.byte 114 +.byte 97 +.byte 112 +.byte 115 +.byte 32 +.byte 111 +.byte 110 +.byte 32 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC676: +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 115 +.byte 97 +.byte 116 +.byte 117 +.byte 114 +.byte 97 +.byte 116 +.byte 101 +.byte 115 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 86 +.byte 48 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC673: +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 86 +.byte 32 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC664: +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 112 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 9 +.byte 115 +.byte 104 +.byte 114 +.byte 105 +.byte 110 +.byte 107 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC661: +.byte 45 +.byte 40 +.byte 45 +.byte 89 +.byte 41 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 89 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC660: +.byte 102 +.byte 105 +.byte 110 +.byte 100 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 0 +.align 1 +.LC659: +.byte 83 +.byte 101 +.byte 101 +.byte 109 +.byte 115 +.byte 32 +.byte 79 +.byte 46 +.byte 75 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC656: +.byte 84 +.byte 114 +.byte 121 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 111 +.byte 110 +.byte 32 +.byte 89 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC655: +.byte 67 +.byte 97 +.byte 110 +.byte 32 +.byte 96 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 45 +.byte 89 +.byte 39 +.byte 32 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 63 +.byte 10 +.byte 0 +.align 1 +.LC648: +.byte 84 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 103 +.byte 101 +.byte 110 +.byte 101 +.byte 114 +.byte 97 +.byte 116 +.byte 101 +.byte 32 +.byte 97 +.byte 110 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC647: +.byte 83 +.byte 101 +.byte 97 +.byte 114 +.byte 99 +.byte 104 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 79 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC646: +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 32 +.byte 110 +.byte 111 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 114 +.byte 101 +.byte 112 +.byte 97 +.byte 110 +.byte 99 +.byte 105 +.byte 101 +.byte 115 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC638: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 112 +.byte 111 +.byte 119 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 90 +.byte 94 +.byte 81 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 114 +.byte 32 +.byte 110 +.byte 101 +.byte 97 +.byte 114 +.byte 108 +.byte 121 +.byte 32 +.byte 101 +.byte 120 +.byte 116 +.byte 114 +.byte 101 +.byte 109 +.byte 101 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC637: +.byte 65 +.byte 99 +.byte 99 +.byte 117 +.byte 114 +.byte 97 +.byte 99 +.byte 121 +.byte 32 +.byte 115 +.byte 101 +.byte 101 +.byte 109 +.byte 115 +.byte 32 +.byte 97 +.byte 100 +.byte 101 +.byte 113 +.byte 117 +.byte 97 +.byte 116 +.byte 101 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC630: +.byte 9 +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 105 +.byte 110 +.byte 118 +.byte 111 +.byte 108 +.byte 118 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 105 +.byte 110 +.byte 121 +.byte 32 +.byte 105 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 114 +.byte 97 +.byte 116 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC629: +.byte 9 +.byte 84 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 109 +.byte 117 +.byte 99 +.byte 104 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 115 +.byte 112 +.byte 111 +.byte 105 +.byte 108 +.byte 32 +.byte 102 +.byte 105 +.byte 110 +.byte 97 +.byte 110 +.byte 99 +.byte 105 +.byte 97 +.byte 108 +.byte 10 +.byte 0 +.align 1 +.LC628: +.byte 9 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC627: +.byte 9 +.byte 40 +.byte 49 +.byte 32 +.byte 43 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 32 +.byte 94 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 59 +.byte 10 +.byte 0 +.align 1 +.LC626: +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 10 +.byte 0 +.align 1 +.LC625: +.byte 67 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 101 +.byte 100 +.byte 0 +.align 1 +.LC618: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 88 +.byte 94 +.byte 40 +.byte 40 +.byte 88 +.byte 32 +.byte 43 +.byte 32 +.byte 49 +.byte 41 +.byte 32 +.byte 47 +.byte 32 +.byte 40 +.byte 88 +.byte 32 +.byte 45 +.byte 32 +.byte 49 +.byte 41 +.byte 41 +.byte 32 +.byte 118 +.byte 115 +.byte 46 +.byte 32 +.byte 101 +.byte 120 +.byte 112 +.byte 40 +.byte 50 +.byte 41 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 88 +.byte 32 +.byte 45 +.byte 62 +.byte 32 +.byte 49 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC614: +.byte 84 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 79 +.byte 46 +.byte 75 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC611: +.byte 32 +.byte 32 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC610: +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 98 +.byte 101 +.byte 116 +.byte 119 +.byte 101 +.byte 101 +.byte 110 +.byte 32 +.byte 48 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 10 +.byte 0 +.align 1 +.LC606: +.byte 97 +.byte 99 +.byte 116 +.byte 117 +.byte 97 +.byte 108 +.byte 108 +.byte 121 +.byte 32 +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 121 +.byte 105 +.byte 101 +.byte 108 +.byte 100 +.byte 115 +.byte 58 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC605: +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 97 +.byte 102 +.byte 102 +.byte 108 +.byte 105 +.byte 99 +.byte 116 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 101 +.byte 120 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 10 +.byte 9 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 32 +.byte 94 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 59 +.byte 10 +.byte 0 +.align 1 +.LC604: +.byte 85 +.byte 102 +.byte 84 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 61 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 32 +.byte 94 +.byte 32 +.byte 40 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 41 +.byte 10 +.byte 111 +.byte 110 +.byte 108 +.byte 121 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 0 +.align 1 +.LC603: +.byte 83 +.byte 105 +.byte 110 +.byte 99 +.byte 101 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 111 +.byte 99 +.byte 99 +.byte 117 +.byte 114 +.byte 115 +.byte 32 +.byte 98 +.byte 101 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC602: +.byte 82 +.byte 97 +.byte 110 +.byte 103 +.byte 101 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 110 +.byte 97 +.byte 114 +.byte 114 +.byte 111 +.byte 119 +.byte 59 +.byte 32 +.byte 85 +.byte 49 +.byte 94 +.byte 37 +.byte 100 +.byte 32 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC597: +.byte 109 +.byte 101 +.byte 114 +.byte 101 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 111 +.byte 102 +.byte 102 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC596: +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 115 +.byte 117 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 32 +.byte 108 +.byte 97 +.byte 114 +.byte 103 +.byte 101 +.byte 114 +.byte 32 +.byte 82 +.byte 101 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 110 +.byte 32 +.byte 0 +.align 1 +.LC595: +.byte 32 +.byte 98 +.byte 101 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 119 +.byte 104 +.byte 105 +.byte 99 +.byte 104 +.byte 0 +.align 1 +.LC594: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC593: +.byte 88 +.byte 32 +.byte 47 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 49 +.byte 32 +.byte 43 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC592: +.byte 88 +.byte 32 +.byte 47 +.byte 32 +.byte 90 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 115 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC589: +.byte 101 +.byte 110 +.byte 99 +.byte 111 +.byte 117 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 97 +.byte 108 +.byte 116 +.byte 104 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 32 +.byte 97 +.byte 99 +.byte 116 +.byte 117 +.byte 97 +.byte 108 +.byte 108 +.byte 121 +.byte 10 +.byte 0 +.align 1 +.LC588: +.byte 32 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 32 +.byte 40 +.byte 102 +.byte 40 +.byte 88 +.byte 41 +.byte 32 +.byte 45 +.byte 32 +.byte 102 +.byte 40 +.byte 90 +.byte 41 +.byte 41 +.byte 32 +.byte 47 +.byte 32 +.byte 40 +.byte 88 +.byte 32 +.byte 45 +.byte 32 +.byte 90 +.byte 41 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC587: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 105 +.byte 102 +.byte 32 +.byte 40 +.byte 88 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 90 +.byte 41 +.byte 32 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 32 +.byte 32 +.byte 101 +.byte 108 +.byte 115 +.byte 101 +.byte 0 +.align 1 +.LC586: +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 117 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 110 +.byte 32 +.byte 105 +.byte 110 +.byte 110 +.byte 111 +.byte 99 +.byte 101 +.byte 110 +.byte 116 +.byte 32 +.byte 115 +.byte 116 +.byte 97 +.byte 116 +.byte 101 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 108 +.byte 105 +.byte 107 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC585: +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 83 +.byte 69 +.byte 82 +.byte 73 +.byte 79 +.byte 85 +.byte 83 +.byte 32 +.byte 68 +.byte 69 +.byte 70 +.byte 69 +.byte 67 +.byte 84 +.byte 10 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 99 +.byte 97 +.byte 117 +.byte 115 +.byte 101 +.byte 115 +.byte 32 +.byte 0 +.align 1 +.LC584: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 83 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 78 +.byte 79 +.byte 84 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 97 +.byte 108 +.byte 32 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 44 +.byte 32 +.byte 0 +.align 1 +.LC583: +.byte 121 +.byte 101 +.byte 116 +.byte 32 +.byte 88 +.byte 32 +.byte 45 +.byte 32 +.byte 90 +.byte 32 +.byte 121 +.byte 105 +.byte 101 +.byte 108 +.byte 100 +.byte 115 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC582: +.byte 88 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 9 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 101 +.byte 113 +.byte 117 +.byte 97 +.byte 108 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 90 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC577: +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 47 +.byte 32 +.byte 85 +.byte 102 +.byte 84 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 101 +.byte 100 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC567: +.byte 40 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 111 +.byte 102 +.byte 102 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 85 +.byte 102 +.byte 84 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 41 +.byte 32 +.byte 60 +.byte 32 +.byte 69 +.byte 48 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC566: +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 103 +.byte 114 +.byte 97 +.byte 100 +.byte 117 +.byte 97 +.byte 108 +.byte 59 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 105 +.byte 110 +.byte 99 +.byte 117 +.byte 114 +.byte 115 +.byte 32 +.byte 65 +.byte 98 +.byte 115 +.byte 111 +.byte 108 +.byte 117 +.byte 116 +.byte 101 +.byte 32 +.byte 69 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 61 +.byte 10 +.byte 0 +.align 1 +.LC561: +.byte 124 +.byte 81 +.byte 32 +.byte 45 +.byte 32 +.byte 89 +.byte 124 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC560: +.byte 112 +.byte 114 +.byte 105 +.byte 110 +.byte 116 +.byte 32 +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 81 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 89 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC559: +.byte 81 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 89 +.byte 32 +.byte 119 +.byte 104 +.byte 105 +.byte 108 +.byte 101 +.byte 32 +.byte 100 +.byte 101 +.byte 110 +.byte 121 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 124 +.byte 81 +.byte 32 +.byte 45 +.byte 32 +.byte 89 +.byte 124 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 48 +.byte 59 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 115 +.byte 101 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC558: +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 117 +.byte 115 +.byte 101 +.byte 115 +.byte 32 +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 44 +.byte 32 +.byte 119 +.byte 104 +.byte 105 +.byte 99 +.byte 104 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 10 +.byte 0 +.align 1 +.LC556: +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 101 +.byte 108 +.byte 115 +.byte 101 +.byte 32 +.byte 109 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 109 +.byte 97 +.byte 110 +.byte 121 +.byte 32 +.byte 108 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 119 +.byte 114 +.byte 111 +.byte 110 +.byte 103 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC555: +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 100 +.byte 111 +.byte 119 +.byte 110 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC554: +.byte 97 +.byte 112 +.byte 112 +.byte 114 +.byte 111 +.byte 97 +.byte 99 +.byte 104 +.byte 32 +.byte 97 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 49 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC553: +.byte 69 +.byte 105 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 97 +.byte 99 +.byte 99 +.byte 117 +.byte 114 +.byte 97 +.byte 99 +.byte 121 +.byte 32 +.byte 100 +.byte 101 +.byte 116 +.byte 101 +.byte 114 +.byte 105 +.byte 111 +.byte 114 +.byte 97 +.byte 116 +.byte 101 +.byte 115 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC541: +.byte 83 +.byte 109 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 115 +.byte 116 +.byte 114 +.byte 105 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 112 +.byte 111 +.byte 115 +.byte 105 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 69 +.byte 48 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC540: +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 110 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 100 +.byte 117 +.byte 99 +.byte 116 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC539: +.byte 68 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 101 +.byte 110 +.byte 99 +.byte 101 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 115 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 97 +.byte 32 +.byte 104 +.byte 105 +.byte 103 +.byte 104 +.byte 101 +.byte 114 +.byte 0 +.align 1 +.LC536: +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 110 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 101 +.byte 110 +.byte 99 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC535: +.byte 80 +.byte 114 +.byte 111 +.byte 100 +.byte 117 +.byte 99 +.byte 116 +.byte 115 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 97 +.byte 32 +.byte 104 +.byte 105 +.byte 103 +.byte 104 +.byte 101 +.byte 114 +.byte 0 +.align 1 +.LC528: +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 80 +.byte 115 +.byte 101 +.byte 117 +.byte 100 +.byte 111 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 112 +.byte 114 +.byte 105 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC527: +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 32 +.byte 115 +.byte 116 +.byte 105 +.byte 99 +.byte 107 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 97 +.byte 110 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 100 +.byte 108 +.byte 121 +.byte 32 +.byte 112 +.byte 111 +.byte 115 +.byte 105 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC526: +.byte 112 +.byte 111 +.byte 115 +.byte 105 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 44 +.byte 32 +.byte 105 +.byte 115 +.byte 110 +.byte 39 +.byte 116 +.byte 59 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 112 +.byte 114 +.byte 105 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC525: +.byte 66 +.byte 117 +.byte 116 +.byte 32 +.byte 45 +.byte 80 +.byte 115 +.byte 101 +.byte 117 +.byte 100 +.byte 111 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 44 +.byte 32 +.byte 119 +.byte 104 +.byte 105 +.byte 99 +.byte 104 +.byte 32 +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 98 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC522: +.byte 80 +.byte 115 +.byte 101 +.byte 117 +.byte 100 +.byte 111 +.byte 90 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 112 +.byte 114 +.byte 105 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 97 +.byte 115 +.byte 58 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC521: +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 100 +.byte 108 +.byte 121 +.byte 32 +.byte 110 +.byte 101 +.byte 103 +.byte 97 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC520: +.byte 80 +.byte 111 +.byte 115 +.byte 105 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 101 +.byte 120 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 32 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 97 +.byte 110 +.byte 10 +.byte 0 +.align 1 +.LC507: +.byte 109 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 109 +.byte 97 +.byte 110 +.byte 121 +.byte 32 +.byte 108 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 119 +.byte 114 +.byte 111 +.byte 110 +.byte 103 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC483: +.byte 83 +.byte 101 +.byte 101 +.byte 107 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 85 +.byte 110 +.byte 100 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 32 +.byte 116 +.byte 104 +.byte 114 +.byte 101 +.byte 115 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 115 +.byte 32 +.byte 85 +.byte 102 +.byte 84 +.byte 104 +.byte 111 +.byte 108 +.byte 100 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 69 +.byte 48 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC480: +.byte 46 +.byte 46 +.byte 46 +.byte 32 +.byte 110 +.byte 111 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 99 +.byte 114 +.byte 101 +.byte 112 +.byte 97 +.byte 110 +.byte 99 +.byte 105 +.byte 115 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC477: +.byte 9 +.byte 105 +.byte 110 +.byte 118 +.byte 111 +.byte 108 +.byte 118 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 105 +.byte 110 +.byte 116 +.byte 101 +.byte 114 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 114 +.byte 97 +.byte 116 +.byte 101 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC476: +.byte 69 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 115 +.byte 32 +.byte 108 +.byte 105 +.byte 107 +.byte 101 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 105 +.byte 110 +.byte 118 +.byte 97 +.byte 108 +.byte 105 +.byte 100 +.byte 97 +.byte 116 +.byte 101 +.byte 32 +.byte 102 +.byte 105 +.byte 110 +.byte 97 +.byte 110 +.byte 99 +.byte 105 +.byte 97 +.byte 108 +.byte 32 +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC455: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 112 +.byte 111 +.byte 119 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 90 +.byte 94 +.byte 105 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 115 +.byte 109 +.byte 97 +.byte 108 +.byte 108 +.byte 32 +.byte 73 +.byte 110 +.byte 116 +.byte 101 +.byte 103 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 90 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 105 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC452: +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 32 +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 109 +.byte 97 +.byte 110 +.byte 121 +.byte 32 +.byte 108 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 119 +.byte 114 +.byte 111 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC450: +.byte 116 +.byte 111 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 117 +.byte 108 +.byte 112 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC449: +.byte 79 +.byte 98 +.byte 115 +.byte 101 +.byte 114 +.byte 118 +.byte 101 +.byte 100 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 115 +.byte 32 +.byte 114 +.byte 117 +.byte 110 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 0 +.align 1 +.LC448: +.byte 83 +.byte 113 +.byte 117 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 111 +.byte 111 +.byte 116 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 101 +.byte 105 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC445: +.byte 83 +.byte 113 +.byte 117 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 111 +.byte 111 +.byte 116 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC440: +.byte 83 +.byte 113 +.byte 117 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 111 +.byte 111 +.byte 116 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC435: +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 115 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 115 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC434: +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 94 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC433: +.byte 65 +.byte 110 +.byte 111 +.byte 109 +.byte 97 +.byte 108 +.byte 111 +.byte 117 +.byte 115 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 73 +.byte 110 +.byte 116 +.byte 101 +.byte 103 +.byte 101 +.byte 114 +.byte 32 +.byte 60 +.byte 32 +.byte 0 +.align 1 +.LC393: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 119 +.byte 104 +.byte 101 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 100 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC371: +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 40 +.byte 88 +.byte 41 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 110 +.byte 45 +.byte 109 +.byte 111 +.byte 110 +.byte 111 +.byte 116 +.byte 111 +.byte 110 +.byte 105 +.byte 99 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 88 +.byte 32 +.byte 110 +.byte 101 +.byte 97 +.byte 114 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC370: +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 32 +.byte 104 +.byte 97 +.byte 115 +.byte 32 +.byte 112 +.byte 97 +.byte 115 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 97 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 77 +.byte 111 +.byte 110 +.byte 111 +.byte 116 +.byte 111 +.byte 110 +.byte 105 +.byte 99 +.byte 105 +.byte 116 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC353: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 32 +.byte 109 +.byte 111 +.byte 110 +.byte 111 +.byte 116 +.byte 111 +.byte 110 +.byte 105 +.byte 99 +.byte 105 +.byte 116 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC342: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 105 +.byte 102 +.byte 32 +.byte 115 +.byte 113 +.byte 114 +.byte 116 +.byte 40 +.byte 88 +.byte 32 +.byte 42 +.byte 32 +.byte 88 +.byte 41 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 88 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 73 +.byte 110 +.byte 116 +.byte 101 +.byte 103 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 88 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC337: +.byte 83 +.byte 113 +.byte 117 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 111 +.byte 111 +.byte 116 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 48 +.byte 46 +.byte 48 +.byte 44 +.byte 32 +.byte 45 +.byte 48 +.byte 46 +.byte 48 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 49 +.byte 46 +.byte 48 +.byte 32 +.byte 119 +.byte 114 +.byte 111 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC335: +.byte 10 +.byte 82 +.byte 117 +.byte 110 +.byte 110 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 115 +.byte 113 +.byte 117 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 114 +.byte 111 +.byte 111 +.byte 116 +.byte 40 +.byte 120 +.byte 41 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC334: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 78 +.byte 111 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 117 +.byte 114 +.byte 101 +.byte 115 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 105 +.byte 110 +.byte 116 +.byte 101 +.byte 103 +.byte 101 +.byte 114 +.byte 32 +.byte 112 +.byte 97 +.byte 105 +.byte 114 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC333: +.byte 88 +.byte 32 +.byte 42 +.byte 32 +.byte 89 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 89 +.byte 32 +.byte 42 +.byte 32 +.byte 88 +.byte 32 +.byte 116 +.byte 114 +.byte 105 +.byte 97 +.byte 108 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 4 +.LC324: +.long 0 +.long 1074266112 +.align 1 +.LC323: +.byte 84 +.byte 101 +.byte 115 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 111 +.byte 110 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 114 +.byte 97 +.byte 110 +.byte 100 +.byte 111 +.byte 109 +.byte 32 +.byte 112 +.byte 97 +.byte 105 +.byte 114 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC322: +.byte 68 +.byte 111 +.byte 101 +.byte 115 +.byte 32 +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 99 +.byte 111 +.byte 109 +.byte 109 +.byte 117 +.byte 116 +.byte 101 +.byte 63 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.LC319: +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 40 +.byte 115 +.byte 41 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 103 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 117 +.byte 114 +.byte 101 +.byte 40 +.byte 115 +.byte 41 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 10 +.byte 40 +.byte 110 +.byte 111 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 97 +.byte 98 +.byte 111 +.byte 118 +.byte 101 +.byte 41 +.byte 32 +.byte 99 +.byte 111 +.byte 117 +.byte 110 +.byte 116 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 111 +.byte 110 +.byte 101 +.byte 32 +.byte 102 +.byte 108 +.byte 97 +.byte 119 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 102 +.byte 105 +.byte 110 +.byte 97 +.byte 108 +.byte 32 +.byte 116 +.byte 97 +.byte 108 +.byte 108 +.byte 121 +.byte 32 +.byte 98 +.byte 101 +.byte 108 +.byte 111 +.byte 119 +.byte 0 +.align 1 +.LC317: +.byte 83 +.byte 116 +.byte 105 +.byte 99 +.byte 107 +.byte 121 +.byte 32 +.byte 98 +.byte 105 +.byte 116 +.byte 32 +.byte 117 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 105 +.byte 110 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 97 +.byte 116 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC316: +.byte 83 +.byte 116 +.byte 105 +.byte 99 +.byte 107 +.byte 121 +.byte 32 +.byte 98 +.byte 105 +.byte 116 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 97 +.byte 114 +.byte 101 +.byte 110 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 117 +.byte 115 +.byte 101 +.byte 100 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC299: +.byte 67 +.byte 104 +.byte 101 +.byte 99 +.byte 107 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 115 +.byte 116 +.byte 105 +.byte 99 +.byte 107 +.byte 121 +.byte 32 +.byte 98 +.byte 105 +.byte 116 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC296: +.byte 40 +.byte 88 +.byte 32 +.byte 45 +.byte 32 +.byte 89 +.byte 41 +.byte 32 +.byte 43 +.byte 32 +.byte 40 +.byte 89 +.byte 32 +.byte 45 +.byte 32 +.byte 88 +.byte 41 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 110 +.byte 32 +.byte 122 +.byte 101 +.byte 114 +.byte 111 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC293: +.byte 65 +.byte 100 +.byte 100 +.byte 105 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 47 +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 110 +.byte 101 +.byte 105 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC292: +.byte 65 +.byte 100 +.byte 100 +.byte 47 +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 0 +.align 1 +.LC289: +.byte 65 +.byte 100 +.byte 100 +.byte 105 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 47 +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC282: +.byte 65 +.byte 100 +.byte 100 +.byte 47 +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC277: +.byte 73 +.byte 110 +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 108 +.byte 101 +.byte 116 +.byte 101 +.byte 32 +.byte 99 +.byte 97 +.byte 114 +.byte 114 +.byte 121 +.byte 45 +.byte 112 +.byte 114 +.byte 111 +.byte 112 +.byte 97 +.byte 103 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 65 +.byte 100 +.byte 100 +.byte 105 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 0 +.align 1 +.LC273: +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 42 +.byte 32 +.byte 40 +.byte 32 +.byte 49 +.byte 32 +.byte 47 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 41 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 49 +.byte 0 +.align 1 +.LC271: +.byte 47 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 101 +.byte 105 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC268: +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC265: +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 0 +.align 1 +.LC262: +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC257: +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 0 +.align 1 +.LC254: +.byte 42 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 101 +.byte 105 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 112 +.byte 101 +.byte 100 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC253: +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 99 +.byte 104 +.byte 111 +.byte 112 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC250: +.byte 77 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 105 +.byte 99 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 99 +.byte 111 +.byte 114 +.byte 114 +.byte 101 +.byte 99 +.byte 116 +.byte 108 +.byte 121 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC240: +.byte 88 +.byte 32 +.byte 42 +.byte 32 +.byte 40 +.byte 49 +.byte 47 +.byte 88 +.byte 41 +.byte 32 +.byte 100 +.byte 105 +.byte 102 +.byte 102 +.byte 101 +.byte 114 +.byte 115 +.byte 32 +.byte 102 +.byte 114 +.byte 111 +.byte 109 +.byte 32 +.byte 49 +.byte 0 +.align 1 +.LC221: +.byte 67 +.byte 104 +.byte 101 +.byte 99 +.byte 107 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 111 +.byte 110 +.byte 32 +.byte 109 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 121 +.byte 44 +.byte 32 +.byte 100 +.byte 105 +.byte 118 +.byte 105 +.byte 100 +.byte 101 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 97 +.byte 100 +.byte 100 +.byte 47 +.byte 115 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC220: +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 32 +.byte 42 +.byte 44 +.byte 32 +.byte 47 +.byte 44 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 45 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 104 +.byte 97 +.byte 118 +.byte 101 +.byte 32 +.byte 103 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 44 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 121 +.byte 32 +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC217: +.byte 32 +.byte 32 +.byte 46 +.byte 46 +.byte 46 +.byte 32 +.byte 32 +.byte 105 +.byte 102 +.byte 32 +.byte 40 +.byte 88 +.byte 32 +.byte 61 +.byte 61 +.byte 32 +.byte 49 +.byte 46 +.byte 48 +.byte 41 +.byte 32 +.byte 123 +.byte 46 +.byte 46 +.byte 46 +.byte 46 +.byte 46 +.byte 125 +.byte 32 +.byte 101 +.byte 108 +.byte 115 +.byte 101 +.byte 32 +.byte 123 +.byte 46 +.byte 46 +.byte 46 +.byte 47 +.byte 40 +.byte 88 +.byte 45 +.byte 49 +.byte 46 +.byte 48 +.byte 41 +.byte 46 +.byte 46 +.byte 46 +.byte 125 +.byte 10 +.byte 0 +.align 1 +.LC216: +.byte 32 +.byte 32 +.byte 115 +.byte 117 +.byte 99 +.byte 104 +.byte 32 +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 97 +.byte 117 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 97 +.byte 103 +.byte 97 +.byte 105 +.byte 110 +.byte 115 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 122 +.byte 101 +.byte 114 +.byte 111 +.byte 32 +.byte 97 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC215: +.byte 32 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 121 +.byte 105 +.byte 101 +.byte 108 +.byte 100 +.byte 115 +.byte 32 +.byte 32 +.byte 40 +.byte 49 +.byte 45 +.byte 85 +.byte 49 +.byte 41 +.byte 32 +.byte 45 +.byte 32 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 32 +.byte 44 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 101 +.byte 98 +.byte 121 +.byte 32 +.byte 118 +.byte 105 +.byte 116 +.byte 105 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 10 +.byte 0 +.align 1 +.LC214: +.byte 99 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 115 +.byte 32 +.byte 32 +.byte 40 +.byte 49 +.byte 45 +.byte 85 +.byte 49 +.byte 41 +.byte 32 +.byte 60 +.byte 32 +.byte 49 +.byte 32 +.byte 32 +.byte 97 +.byte 108 +.byte 116 +.byte 104 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 10 +.byte 0 +.align 1 +.LC211: +.byte 45 +.byte 32 +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 115 +.byte 32 +.byte 71 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 68 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 44 +.byte 32 +.byte 115 +.byte 111 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 99 +.byte 101 +.byte 108 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 111 +.byte 98 +.byte 115 +.byte 99 +.byte 117 +.byte 114 +.byte 101 +.byte 100 +.byte 0 +.align 1 +.LC206: +.byte 42 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 47 +.byte 111 +.byte 114 +.byte 32 +.byte 47 +.byte 32 +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 109 +.byte 97 +.byte 110 +.byte 121 +.byte 32 +.byte 108 +.byte 97 +.byte 115 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 119 +.byte 114 +.byte 111 +.byte 110 +.byte 103 +.byte 0 +.align 1 +.LC202: +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 117 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 49 +.byte 47 +.byte 49 +.byte 46 +.byte 48 +.byte 48 +.byte 48 +.byte 46 +.byte 46 +.byte 49 +.byte 32 +.byte 62 +.byte 61 +.byte 32 +.byte 49 +.byte 0 +.align 1 +.LC200: +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 71 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 68 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 44 +.byte 32 +.byte 115 +.byte 111 +.byte 32 +.byte 88 +.byte 47 +.byte 49 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 88 +.byte 0 +.align 1 +.LC195: +.byte 68 +.byte 105 +.byte 118 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 71 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 68 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 44 +.byte 32 +.byte 115 +.byte 111 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 32 +.byte 101 +.byte 120 +.byte 99 +.byte 101 +.byte 101 +.byte 100 +.byte 32 +.byte 49 +.byte 32 +.byte 117 +.byte 108 +.byte 112 +.byte 10 +.byte 111 +.byte 114 +.byte 32 +.byte 32 +.byte 49 +.byte 47 +.byte 51 +.byte 32 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 32 +.byte 51 +.byte 47 +.byte 57 +.byte 32 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 32 +.byte 57 +.byte 47 +.byte 50 +.byte 55 +.byte 32 +.byte 109 +.byte 97 +.byte 121 +.byte 32 +.byte 100 +.byte 105 +.byte 115 +.byte 97 +.byte 103 +.byte 114 +.byte 101 +.byte 101 +.byte 0 +.align 1 +.LC191: +.byte 42 +.byte 32 +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 109 +.byte 97 +.byte 110 +.byte 121 +.byte 32 +.byte 102 +.byte 105 +.byte 110 +.byte 97 +.byte 108 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 119 +.byte 114 +.byte 111 +.byte 110 +.byte 103 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC189: +.byte 42 +.byte 32 +.byte 108 +.byte 97 +.byte 99 +.byte 107 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 71 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 68 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 44 +.byte 32 +.byte 115 +.byte 111 +.byte 32 +.byte 49 +.byte 42 +.byte 88 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 88 +.byte 0 +.align 1 +.LC186: +.byte 10 +.byte 67 +.byte 104 +.byte 101 +.byte 99 +.byte 107 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 103 +.byte 117 +.byte 97 +.byte 114 +.byte 100 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 32 +.byte 105 +.byte 110 +.byte 32 +.byte 42 +.byte 44 +.byte 32 +.byte 47 +.byte 44 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 45 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC185: +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 109 +.byte 97 +.byte 108 +.byte 105 +.byte 122 +.byte 101 +.byte 100 +.byte 44 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 105 +.byte 116 +.byte 32 +.byte 115 +.byte 104 +.byte 111 +.byte 117 +.byte 108 +.byte 100 +.byte 32 +.byte 98 +.byte 101 +.byte 46 +.byte 0 +.align 1 +.LC180: +.byte 83 +.byte 117 +.byte 98 +.byte 116 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 110 +.byte 111 +.byte 114 +.byte 109 +.byte 97 +.byte 108 +.byte 105 +.byte 122 +.byte 101 +.byte 100 +.byte 32 +.byte 88 +.byte 61 +.byte 89 +.byte 44 +.byte 88 +.byte 43 +.byte 90 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 89 +.byte 43 +.byte 90 +.byte 33 +.byte 0 +.align 1 +.LC176: +.byte 114 +.byte 111 +.byte 117 +.byte 103 +.byte 104 +.byte 108 +.byte 121 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 101 +.byte 120 +.byte 116 +.byte 114 +.byte 97 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 105 +.byte 102 +.byte 105 +.byte 99 +.byte 97 +.byte 110 +.byte 116 +.byte 32 +.byte 100 +.byte 101 +.byte 99 +.byte 105 +.byte 109 +.byte 97 +.byte 108 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC175: +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 101 +.byte 108 +.byte 121 +.byte 32 +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 32 +.byte 97 +.byte 98 +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 37 +.byte 103 +.byte 32 +.byte 101 +.byte 120 +.byte 116 +.byte 114 +.byte 97 +.byte 32 +.byte 66 +.byte 45 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 44 +.byte 32 +.byte 105 +.byte 46 +.byte 101 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC174: +.byte 83 +.byte 111 +.byte 109 +.byte 101 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 101 +.byte 120 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 32 +.byte 97 +.byte 112 +.byte 112 +.byte 101 +.byte 97 +.byte 114 +.byte 32 +.byte 116 +.byte 111 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 101 +.byte 120 +.byte 116 +.byte 114 +.byte 97 +.byte 10 +.byte 0 +.align 1 +.LC168: +.byte 111 +.byte 102 +.byte 32 +.byte 97 +.byte 110 +.byte 10 +.byte 101 +.byte 120 +.byte 116 +.byte 114 +.byte 97 +.byte 45 +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 0 +.align 1 +.LC167: +.byte 90 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 90 +.byte 50 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 0 +.align 1 +.LC166: +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 101 +.byte 120 +.byte 97 +.byte 99 +.byte 116 +.byte 32 +.byte 114 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 97 +.byte 108 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 97 +.byte 32 +.byte 114 +.byte 101 +.byte 115 +.byte 117 +.byte 108 +.byte 116 +.byte 10 +.byte 0 +.align 1 +.LC165: +.byte 66 +.byte 101 +.byte 99 +.byte 97 +.byte 117 +.byte 115 +.byte 101 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 117 +.byte 110 +.byte 117 +.byte 115 +.byte 117 +.byte 97 +.byte 108 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 102 +.byte 0 +.align 1 +.LC161: +.byte 9 +.byte 85 +.byte 50 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 90 +.byte 50 +.byte 32 +.byte 45 +.byte 32 +.byte 85 +.byte 50 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC160: +.byte 9 +.byte 85 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 90 +.byte 49 +.byte 32 +.byte 45 +.byte 32 +.byte 85 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC159: +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 0 +.align 1 +.LC158: +.byte 0 +.align 1 +.LC151: +.byte 84 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 102 +.byte 101 +.byte 97 +.byte 116 +.byte 117 +.byte 114 +.byte 101 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 102 +.byte 117 +.byte 114 +.byte 116 +.byte 104 +.byte 101 +.byte 114 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC146: +.byte 80 +.byte 111 +.byte 115 +.byte 115 +.byte 105 +.byte 98 +.byte 108 +.byte 121 +.byte 32 +.byte 115 +.byte 111 +.byte 109 +.byte 101 +.byte 32 +.byte 112 +.byte 97 +.byte 114 +.byte 116 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 0 +.align 1 +.LC145: +.byte 98 +.byte 121 +.byte 32 +.byte 101 +.byte 120 +.byte 116 +.byte 114 +.byte 97 +.byte 45 +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 101 +.byte 32 +.byte 101 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 101 +.byte 116 +.byte 105 +.byte 99 +.byte 32 +.byte 115 +.byte 117 +.byte 98 +.byte 101 +.byte 120 +.byte 112 +.byte 114 +.byte 101 +.byte 115 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 115 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC144: +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 115 +.byte 121 +.byte 109 +.byte 112 +.byte 116 +.byte 111 +.byte 109 +.byte 115 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 105 +.byte 110 +.byte 99 +.byte 111 +.byte 110 +.byte 115 +.byte 105 +.byte 115 +.byte 116 +.byte 101 +.byte 110 +.byte 99 +.byte 105 +.byte 101 +.byte 115 +.byte 32 +.byte 105 +.byte 110 +.byte 116 +.byte 114 +.byte 111 +.byte 100 +.byte 117 +.byte 99 +.byte 101 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC143: +.byte 114 +.byte 101 +.byte 115 +.byte 112 +.byte 101 +.byte 99 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 108 +.byte 121 +.byte 32 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 44 +.byte 32 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 44 +.byte 10 +.byte 0 +.align 1 +.LC142: +.byte 68 +.byte 105 +.byte 115 +.byte 97 +.byte 103 +.byte 114 +.byte 101 +.byte 101 +.byte 109 +.byte 101 +.byte 110 +.byte 116 +.byte 115 +.byte 32 +.byte 97 +.byte 109 +.byte 111 +.byte 110 +.byte 103 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 118 +.byte 97 +.byte 108 +.byte 117 +.byte 101 +.byte 115 +.byte 32 +.byte 88 +.byte 49 +.byte 44 +.byte 32 +.byte 89 +.byte 49 +.byte 44 +.byte 32 +.byte 90 +.byte 49 +.byte 44 +.byte 10 +.byte 0 +.align 1 +.LC120: +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 119 +.byte 111 +.byte 114 +.byte 115 +.byte 101 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 110 +.byte 32 +.byte 53 +.byte 32 +.byte 100 +.byte 101 +.byte 99 +.byte 105 +.byte 109 +.byte 97 +.byte 108 +.byte 32 +.byte 102 +.byte 105 +.byte 103 +.byte 117 +.byte 114 +.byte 101 +.byte 115 +.byte 32 +.byte 32 +.byte 0 +.align 1 +.LC118: +.byte 84 +.byte 104 +.byte 101 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 105 +.byte 102 +.byte 105 +.byte 99 +.byte 97 +.byte 110 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 116 +.byte 104 +.byte 101 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 37 +.byte 102 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC117: +.byte 108 +.byte 111 +.byte 103 +.byte 97 +.byte 114 +.byte 105 +.byte 116 +.byte 104 +.byte 109 +.byte 105 +.byte 99 +.byte 32 +.byte 101 +.byte 110 +.byte 99 +.byte 111 +.byte 100 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 104 +.byte 97 +.byte 115 +.byte 32 +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 99 +.byte 104 +.byte 97 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 101 +.byte 114 +.byte 105 +.byte 122 +.byte 101 +.byte 100 +.byte 32 +.byte 115 +.byte 111 +.byte 108 +.byte 101 +.byte 108 +.byte 121 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 85 +.byte 49 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC114: +.byte 111 +.byte 102 +.byte 32 +.byte 115 +.byte 105 +.byte 103 +.byte 110 +.byte 105 +.byte 102 +.byte 105 +.byte 99 +.byte 97 +.byte 110 +.byte 116 +.byte 32 +.byte 100 +.byte 105 +.byte 103 +.byte 105 +.byte 116 +.byte 115 +.byte 32 +.byte 98 +.byte 117 +.byte 116 +.byte 44 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 105 +.byte 116 +.byte 115 +.byte 101 +.byte 108 +.byte 102 +.byte 44 +.byte 32 +.byte 116 +.byte 104 +.byte 105 +.byte 115 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 97 +.byte 32 +.byte 109 +.byte 105 +.byte 110 +.byte 111 +.byte 114 +.byte 32 +.byte 102 +.byte 108 +.byte 97 +.byte 119 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC113: +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 99 +.byte 97 +.byte 110 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 98 +.byte 101 +.byte 32 +.byte 99 +.byte 104 +.byte 97 +.byte 114 +.byte 97 +.byte 99 +.byte 116 +.byte 101 +.byte 114 +.byte 105 +.byte 122 +.byte 101 +.byte 100 +.byte 32 +.byte 98 +.byte 121 +.byte 32 +.byte 97 +.byte 110 +.byte 32 +.byte 73 +.byte 110 +.byte 116 +.byte 101 +.byte 103 +.byte 101 +.byte 114 +.byte 32 +.byte 110 +.byte 117 +.byte 109 +.byte 98 +.byte 101 +.byte 114 +.byte 10 +.byte 0 +.align 1 +.LC100: +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 102 +.byte 117 +.byte 122 +.byte 122 +.byte 121 +.byte 44 +.byte 88 +.byte 61 +.byte 49 +.byte 32 +.byte 98 +.byte 117 +.byte 116 +.byte 32 +.byte 88 +.byte 45 +.byte 49 +.byte 47 +.byte 50 +.byte 45 +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 0 +.align 1 +.LC96: +.byte 40 +.byte 49 +.byte 45 +.byte 85 +.byte 49 +.byte 41 +.byte 45 +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 60 +.byte 32 +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 70 +.byte 65 +.byte 76 +.byte 83 +.byte 69 +.byte 44 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 103 +.byte 46 +.byte 32 +.byte 102 +.byte 97 +.byte 105 +.byte 108 +.byte 115 +.byte 63 +.byte 0 +.align 4 +.LC94: +.long 0 +.long 1076101120 +.align 1 +.LC89: +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 103 +.byte 111 +.byte 111 +.byte 100 +.byte 32 +.byte 97 +.byte 115 +.byte 32 +.byte 50 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 49 +.byte 48 +.byte 0 +.align 1 +.LC85: +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 116 +.byte 111 +.byte 111 +.byte 32 +.byte 98 +.byte 105 +.byte 103 +.byte 58 +.byte 32 +.byte 114 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 111 +.byte 102 +.byte 102 +.byte 32 +.byte 112 +.byte 114 +.byte 111 +.byte 98 +.byte 108 +.byte 101 +.byte 109 +.byte 115 +.byte 0 +.align 1 +.LC83: +.byte 77 +.byte 89 +.byte 83 +.byte 84 +.byte 69 +.byte 82 +.byte 89 +.byte 58 +.byte 32 +.byte 114 +.byte 101 +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 101 +.byte 100 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC82: +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 105 +.byte 114 +.byte 109 +.byte 101 +.byte 100 +.byte 46 +.byte 10 +.byte 0 +.align 4 +.LC79: +.long 1202590843 +.long 1065646817 +.align 1 +.LC78: +.byte 103 +.byte 101 +.byte 116 +.byte 115 +.byte 32 +.byte 98 +.byte 101 +.byte 116 +.byte 116 +.byte 101 +.byte 114 +.byte 32 +.byte 99 +.byte 108 +.byte 111 +.byte 115 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 114 +.byte 101 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 115 +.byte 101 +.byte 112 +.byte 97 +.byte 114 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 85 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC77: +.byte 99 +.byte 111 +.byte 110 +.byte 102 +.byte 105 +.byte 114 +.byte 109 +.byte 115 +.byte 32 +.byte 99 +.byte 108 +.byte 111 +.byte 115 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 114 +.byte 101 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 115 +.byte 101 +.byte 112 +.byte 97 +.byte 114 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 85 +.byte 49 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC62: +.byte 82 +.byte 101 +.byte 99 +.byte 97 +.byte 108 +.byte 99 +.byte 117 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 114 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 112 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 10 +.byte 32 +.byte 0 +.align 1 +.LC61: +.byte 67 +.byte 108 +.byte 111 +.byte 115 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 114 +.byte 101 +.byte 108 +.byte 97 +.byte 116 +.byte 105 +.byte 118 +.byte 101 +.byte 32 +.byte 115 +.byte 101 +.byte 112 +.byte 97 +.byte 114 +.byte 97 +.byte 116 +.byte 105 +.byte 111 +.byte 110 +.byte 32 +.byte 102 +.byte 111 +.byte 117 +.byte 110 +.byte 100 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 85 +.byte 49 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 46 +.byte 55 +.byte 101 +.byte 32 +.byte 46 +.byte 10 +.byte 10 +.byte 0 +.align 1 +.LC55: +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 102 +.byte 32 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC46: +.byte 83 +.byte 101 +.byte 97 +.byte 114 +.byte 99 +.byte 104 +.byte 105 +.byte 110 +.byte 103 +.byte 32 +.byte 102 +.byte 111 +.byte 114 +.byte 32 +.byte 82 +.byte 97 +.byte 100 +.byte 105 +.byte 120 +.byte 32 +.byte 97 +.byte 110 +.byte 100 +.byte 32 +.byte 80 +.byte 114 +.byte 101 +.byte 99 +.byte 105 +.byte 115 +.byte 105 +.byte 111 +.byte 110 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC45: +.byte 10 +.byte 0 +.align 1 +.LC44: +.byte 45 +.byte 49 +.byte 44 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 49 +.byte 47 +.byte 50 +.byte 44 +.byte 32 +.byte 49 +.byte 44 +.byte 32 +.byte 50 +.byte 44 +.byte 32 +.byte 51 +.byte 44 +.byte 32 +.byte 52 +.byte 44 +.byte 32 +.byte 53 +.byte 44 +.byte 32 +.byte 57 +.byte 44 +.byte 32 +.byte 50 +.byte 55 +.byte 44 +.byte 32 +.byte 51 +.byte 50 +.byte 32 +.byte 38 +.byte 32 +.byte 50 +.byte 52 +.byte 48 +.byte 32 +.byte 97 +.byte 114 +.byte 101 +.byte 32 +.byte 79 +.byte 46 +.byte 75 +.byte 46 +.byte 10 +.byte 0 +.align 1 +.LC39: +.byte 53 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 52 +.byte 43 +.byte 49 +.byte 44 +.byte 32 +.byte 50 +.byte 52 +.byte 48 +.byte 47 +.byte 51 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 56 +.byte 48 +.byte 44 +.byte 32 +.byte 50 +.byte 52 +.byte 48 +.byte 47 +.byte 52 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 54 +.byte 48 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 50 +.byte 52 +.byte 48 +.byte 47 +.byte 53 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 52 +.byte 56 +.byte 0 +.align 1 +.LC35: +.byte 57 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 51 +.byte 42 +.byte 51 +.byte 44 +.byte 32 +.byte 50 +.byte 55 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 57 +.byte 42 +.byte 51 +.byte 44 +.byte 32 +.byte 51 +.byte 50 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 56 +.byte 42 +.byte 52 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 51 +.byte 50 +.byte 45 +.byte 50 +.byte 55 +.byte 45 +.byte 52 +.byte 45 +.byte 49 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 0 +.align 1 +.LC31: +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 43 +.byte 32 +.byte 40 +.byte 45 +.byte 49 +.byte 41 +.byte 32 +.byte 43 +.byte 32 +.byte 49 +.byte 47 +.byte 50 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 0 +.align 1 +.LC27: +.byte 45 +.byte 49 +.byte 43 +.byte 49 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 40 +.byte 45 +.byte 49 +.byte 41 +.byte 43 +.byte 97 +.byte 98 +.byte 115 +.byte 40 +.byte 49 +.byte 41 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 45 +.byte 49 +.byte 43 +.byte 40 +.byte 45 +.byte 49 +.byte 41 +.byte 42 +.byte 40 +.byte 45 +.byte 49 +.byte 41 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 0 +.align 1 +.LC23: +.byte 51 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 50 +.byte 43 +.byte 49 +.byte 44 +.byte 32 +.byte 52 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 51 +.byte 43 +.byte 49 +.byte 44 +.byte 32 +.byte 52 +.byte 43 +.byte 50 +.byte 42 +.byte 40 +.byte 45 +.byte 50 +.byte 41 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 52 +.byte 45 +.byte 51 +.byte 45 +.byte 49 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 0 +.align 4 +.LC21: +.long -755914244 +.long 1062232653 +.align 1 +.LC20: +.byte 67 +.byte 111 +.byte 109 +.byte 112 +.byte 97 +.byte 114 +.byte 105 +.byte 115 +.byte 111 +.byte 110 +.byte 32 +.byte 97 +.byte 108 +.byte 108 +.byte 101 +.byte 103 +.byte 101 +.byte 115 +.byte 32 +.byte 116 +.byte 104 +.byte 97 +.byte 116 +.byte 32 +.byte 45 +.byte 48 +.byte 46 +.byte 48 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 78 +.byte 111 +.byte 110 +.byte 45 +.byte 122 +.byte 101 +.byte 114 +.byte 111 +.byte 33 +.byte 10 +.byte 0 +.align 1 +.LC15: +.byte 48 +.byte 43 +.byte 48 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 49 +.byte 45 +.byte 49 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 49 +.byte 32 +.byte 60 +.byte 61 +.byte 32 +.byte 48 +.byte 44 +.byte 32 +.byte 111 +.byte 114 +.byte 32 +.byte 49 +.byte 43 +.byte 49 +.byte 32 +.byte 33 +.byte 61 +.byte 32 +.byte 50 +.byte 0 +.align 1 +.LC13: +.byte 80 +.byte 114 +.byte 111 +.byte 103 +.byte 114 +.byte 97 +.byte 109 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 110 +.byte 111 +.byte 119 +.byte 32 +.byte 82 +.byte 85 +.byte 78 +.byte 78 +.byte 73 +.byte 78 +.byte 71 +.byte 32 +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 115 +.byte 32 +.byte 111 +.byte 110 +.byte 32 +.byte 115 +.byte 109 +.byte 97 +.byte 108 +.byte 108 +.byte 32 +.byte 105 +.byte 110 +.byte 116 +.byte 101 +.byte 103 +.byte 101 +.byte 114 +.byte 115 +.byte 58 +.byte 10 +.byte 0 +.align 4 +.LC9: +.long 0 +.long 1072693248 +.align 4 +.LC8: +.long 0 +.long 0 +.align 1 +.LC3: +.byte 10 +.byte 42 +.byte 32 +.byte 42 +.byte 32 +.byte 42 +.byte 32 +.byte 70 +.byte 76 +.byte 79 +.byte 65 +.byte 84 +.byte 73 +.byte 78 +.byte 71 +.byte 45 +.byte 80 +.byte 79 +.byte 73 +.byte 78 +.byte 84 +.byte 32 +.byte 69 +.byte 82 +.byte 82 +.byte 79 +.byte 82 +.byte 32 +.byte 42 +.byte 32 +.byte 42 +.byte 32 +.byte 42 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/sort.1bk b/quake3/source/lcc/x86/linux/tst/sort.1bk new file mode 100644 index 0000000..380d529 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/sort.1bk @@ -0,0 +1,20 @@ +exchange(1,9) +exchange(3,7) +exchange(5,6) +exchange(0,5) +exchange(0,3) +exchange(0,0) +exchange(1,2) +exchange(6,6) +exchange(8,9) +exchange(7,8) +-51 +-1 +0 +1 +3 +10 +18 +32 +567 +789 diff --git a/quake3/source/lcc/x86/linux/tst/sort.2bk b/quake3/source/lcc/x86/linux/tst/sort.2bk new file mode 100644 index 0000000..27488a1 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/sort.2bk @@ -0,0 +1,5 @@ +tst/sort.c:23: warning: missing return value +tst/sort.c:30: warning: missing return value +tst/sort.c:37: warning: missing return value +tst/sort.c:41: warning: missing return value +tst/sort.c:65: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/sort.sbk b/quake3/source/lcc/x86/linux/tst/sort.sbk new file mode 100644 index 0000000..11dbcdd --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/sort.sbk @@ -0,0 +1,330 @@ +.data +.globl in +.align 4 +.type in,@object +in: +.long 10 +.long 32 +.long -1 +.long 567 +.long 3 +.long 18 +.long 1 +.long -51 +.long 789 +.long 0 +.size in,40 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +pushl $10 +pushl $in +call sort +addl $8,%esp +movl $0,-4(%ebp) +jmp .LC5 +.LC2: +movl -4(%ebp),%edi +pushl in(,%edi,4) +call putd +addl $4,%esp +pushl $10 +call putchar +addl $4,%esp +.LC3: +incl -4(%ebp) +.LC5: +movl -4(%ebp),%edi +cmpl $10,%edi +jb .LC2 +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf6: +.size main,.Lf6-main +.globl putd +.align 16 +.type putd,@function +putd: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +cmpl $0,20(%ebp) +jge .LC8 +pushl $45 +call putchar +addl $4,%esp +negl 20(%ebp) +.LC8: +movl 20(%ebp),%eax +movl $10,%ecx +cdq +idivl %ecx +cmpl $0,%eax +je .LC10 +movl 20(%ebp),%eax +movl $10,%ecx +cdq +idivl %ecx +pushl %eax +call putd +addl $4,%esp +.LC10: +movl 20(%ebp),%eax +movl $10,%ecx +cdq +idivl %ecx +leal 48(%edx),%edi +pushl %edi +call putchar +addl $4,%esp +movl $0,%eax +.LC7: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf12: +.size putd,.Lf12-putd +.globl sort +.align 16 +.type sort,@function +sort: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 24(%ebp),%edi +subl $1,%edi +movl %edi,24(%ebp) +pushl %edi +pushl $0 +movl 20(%ebp),%edi +movl %edi,xx +pushl %edi +call quick +addl $12,%esp +movl $0,%eax +.LC13: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf14: +.size sort,.Lf14-sort +.globl quick +.align 16 +.type quick,@function +quick: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl 28(%ebp),%edi +cmpl %edi,24(%ebp) +jl .LC16 +jmp .LC15 +.LC16: +pushl 28(%ebp) +pushl 24(%ebp) +pushl 20(%ebp) +call partition +addl $12,%esp +movl %eax,-4(%ebp) +movl -4(%ebp),%edi +subl $1,%edi +pushl %edi +pushl 24(%ebp) +pushl 20(%ebp) +call quick +addl $12,%esp +pushl 28(%ebp) +movl -4(%ebp),%edi +leal 1(%edi),%edi +pushl %edi +pushl 20(%ebp) +call quick +addl $12,%esp +movl $0,%eax +.LC15: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf18: +.size quick,.Lf18-quick +.globl partition +.align 16 +.type partition,@function +partition: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +incl 28(%ebp) +movl 24(%ebp),%edi +movl %edi,-8(%ebp) +movl -8(%ebp),%edi +movl 20(%ebp),%esi +movl (%esi,%edi,4),%edi +movl %edi,-4(%ebp) +jmp .LC21 +.LC20: +incl 24(%ebp) +jmp .LC24 +.LC23: +incl 24(%ebp) +.LC24: +movl 24(%ebp),%edi +movl 20(%ebp),%esi +movl -4(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jl .LC23 +decl 28(%ebp) +jmp .LC27 +.LC26: +decl 28(%ebp) +.LC27: +movl 28(%ebp),%edi +movl 20(%ebp),%esi +movl -4(%ebp),%ebx +cmpl %ebx,(%esi,%edi,4) +jg .LC26 +movl 28(%ebp),%edi +cmpl %edi,24(%ebp) +jge .LC29 +movl 20(%ebp),%edi +movl 28(%ebp),%esi +leal (%edi,%esi,4),%esi +pushl %esi +movl 24(%ebp),%esi +leal (%edi,%esi,4),%edi +pushl %edi +call exchange +addl $8,%esp +.LC29: +.LC21: +movl 28(%ebp),%edi +cmpl %edi,24(%ebp) +jl .LC20 +movl 20(%ebp),%edi +movl 28(%ebp),%esi +leal (%edi,%esi,4),%esi +pushl %esi +movl -8(%ebp),%esi +leal (%edi,%esi,4),%edi +pushl %edi +call exchange +addl $8,%esp +movl 28(%ebp),%eax +.LC19: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf31: +.size partition,.Lf31-partition +.globl exchange +.align 16 +.type exchange,@function +exchange: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl xx,%edi +movl $4,%esi +movl 24(%ebp),%ebx +subl %edi,%ebx +movl %ebx,%eax +movl %esi,%ecx +cdq +idivl %ecx +pushl %eax +movl 20(%ebp),%ebx +subl %edi,%ebx +movl %ebx,%eax +movl %esi,%ecx +cdq +idivl %ecx +pushl %eax +pushl $.LC33 +call printf +addl $12,%esp +movl 20(%ebp),%edi +movl (,%edi),%esi +movl %esi,-4(%ebp) +movl 24(%ebp),%esi +movl (,%esi),%esi +movl %esi,(,%edi) +movl 24(%ebp),%edi +movl -4(%ebp),%esi +movl %esi,(,%edi) +movl $0,%eax +.LC32: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf34: +.size exchange,.Lf34-exchange +.bss +.globl xx +.align 4 +.type xx,@object +.size xx,4 +.comm xx,4 +.data +.align 1 +.LC33: +.byte 101 +.byte 120 +.byte 99 +.byte 104 +.byte 97 +.byte 110 +.byte 103 +.byte 101 +.byte 40 +.byte 37 +.byte 100 +.byte 44 +.byte 37 +.byte 100 +.byte 41 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/spill.1bk b/quake3/source/lcc/x86/linux/tst/spill.1bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/linux/tst/spill.2bk b/quake3/source/lcc/x86/linux/tst/spill.2bk new file mode 100644 index 0000000..f7e3521 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/spill.2bk @@ -0,0 +1,6 @@ +tst/spill.c:1: warning: missing return value +tst/spill.c:3: warning: missing return value +tst/spill.c:5: warning: missing return value +tst/spill.c:7: warning: missing return value +tst/spill.c:9: warning: missing return value +tst/spill.c:17: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/spill.sbk b/quake3/source/lcc/x86/linux/tst/spill.sbk new file mode 100644 index 0000000..13799ab --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/spill.sbk @@ -0,0 +1,282 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf2: +.size main,.Lf2-main +.globl f +.align 16 +.type f,@function +f: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +call f +movl %eax,%edi +call f +leal (%eax,%edi),%edi +movl %edi,20(%ebp) +movl $0,%eax +.LC3: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf4: +.size f,.Lf4-f +.globl f2 +.align 16 +.type f2,@function +f2: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +call f +movl %eax,%edi +cmpl $0,20(%ebp) +je .LC7 +call f +movl %eax,%esi +movl %esi,-4(%ebp) +jmp .LC8 +.LC7: +movl $1,-4(%ebp) +.LC8: +movl -4(%ebp),%esi +leal (%esi,%edi),%edi +movl %edi,20(%ebp) +movl $0,%eax +.LC5: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf9: +.size f2,.Lf9-f2 +.globl f3 +.align 16 +.type f3,@function +f3: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $44,%esp +movl $0,-4(%ebp) +movl $0,-8(%ebp) +movl $0,-12(%ebp) +movl $0,-16(%ebp) +movl $0,-20(%ebp) +movl $0,-24(%ebp) +movl $0,-28(%ebp) +movl $0,-32(%ebp) +movl $0,-36(%ebp) +movl $0,-40(%ebp) +movl 24(%ebp),%edi +leal 4(%edi),%esi +movl %esi,24(%ebp) +cmpl $0,20(%ebp) +je .LC12 +call f +movl %eax,%esi +movl %esi,-44(%ebp) +jmp .LC13 +.LC12: +movl $0,-44(%ebp) +.LC13: +movl -44(%ebp),%esi +movl %esi,(,%edi) +movl $0,%eax +.LC10: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf14: +.size f3,.Lf14-f3 +.globl f4 +.align 16 +.type f4,@function +f4: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $52,%esp +movl $0,-4(%ebp) +movl $0,-8(%ebp) +movl $0,-12(%ebp) +movl $0,-16(%ebp) +movl $0,-20(%ebp) +movl $0,-24(%ebp) +movl i,%edi +leal (,%edi,8),%esi +fldl a(%esi) +fstpl -36(%ebp) +fldl b(%esi) +fstpl -44(%ebp) +fldl -36(%ebp) +faddl -44(%ebp) +fldl .LC19 +fcompp +fstsw %ax +sahf +je .LC17 +cmpl $0,%edi +je .LC17 +fldl -36(%ebp) +fsubl -44(%ebp) +fldl .LC19 +fcompp +fstsw %ax +sahf +je .LC17 +movl $1,-28(%ebp) +jmp .LC18 +.LC17: +movl $0,-28(%ebp) +.LC18: +movl -28(%ebp),%edi +movl %edi,i +movl $0,%eax +.LC15: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf20: +.size f4,.Lf20-f4 +.globl f5 +.align 16 +.type f5,@function +f5: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl k,%edi +movl m,%esi +movl A,%ebx +movl %edi,%edx +imull %esi,%edx +leal (%ebx,%edx,8),%edx +movl j,%ecx +movl %ecx,%eax +imull %esi,%eax +leal (%ebx,%eax,8),%esi +movl n,%ebx +movl B,%eax +imull %ebx,%edi +leal (%eax,%edi,8),%edi +imull %ebx,%ecx +leal (%eax,%ecx,8),%ebx +fldl (,%edx) +fmull (,%esi) +fldl (,%edi) +fmull (,%ebx) +faddp %st(1),%st +fstpl x +fldl (,%edx) +fmull (,%ebx) +fldl (,%edi) +fmull (,%esi) +fsubp %st(1),%st +fstpl x +movl $0,%eax +.LC21: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf22: +.size f5,.Lf22-f5 +.bss +.globl x +.align 4 +.type x,@object +.size x,8 +.comm x,8 +.globl B +.align 4 +.type B,@object +.size B,4 +.comm B,4 +.globl A +.align 4 +.type A,@object +.size A,4 +.comm A,4 +.globl n +.align 4 +.type n,@object +.size n,4 +.comm n,4 +.globl m +.align 4 +.type m,@object +.size m,4 +.comm m,4 +.globl k +.align 4 +.type k,@object +.size k,4 +.comm k,4 +.globl j +.align 4 +.type j,@object +.size j,4 +.comm j,4 +.globl i +.align 4 +.type i,@object +.size i,4 +.comm i,4 +.globl b +.align 4 +.type b,@object +.size b,80 +.comm b,80 +.globl a +.align 4 +.type a,@object +.size a,80 +.comm a,80 +.data +.align 4 +.LC19: +.long 0 +.long 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/stdarg.1bk b/quake3/source/lcc/x86/linux/tst/stdarg.1bk new file mode 100644 index 0000000..097aef7 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/stdarg.1bk @@ -0,0 +1,6 @@ +test 1 +test 2 +test 3 +test 4 +test 5.000000 +{1 2 3 4} {1 2 3 4} {1 2 3 4} {1 2 3 4} {1 2 3 4} {1 2 3 4} diff --git a/quake3/source/lcc/x86/linux/tst/stdarg.2bk b/quake3/source/lcc/x86/linux/tst/stdarg.2bk new file mode 100644 index 0000000..a832cf9 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/stdarg.2bk @@ -0,0 +1 @@ +tst/stdarg.c:51: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/stdarg.sbk b/quake3/source/lcc/x86/linux/tst/stdarg.sbk new file mode 100644 index 0000000..f1001e6 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/stdarg.sbk @@ -0,0 +1,395 @@ +.data +.globl x +.align 4 +.type x,@object +.size x,16 +x: +.long 1 +.long 2 +.long 3 +.long 4 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +pushl $.LC2 +call print +addl $4,%esp +pushl $.LC4 +pushl $.LC3 +call print +addl $8,%esp +pushl $10 +pushl $3 +pushl $.LC5 +call print +addl $12,%esp +pushl $10 +pushl $4 +pushl $.LC8 +pushl $.LC7 +pushl $.LC6 +call print +addl $20,%esp +pushl $10 +fldl .LC10 +subl $8,%esp +fstpl (%esp) +pushl $.LC8 +pushl $.LC7 +pushl $.LC9 +call print +addl $24,%esp +leal x,%edi +movl %edi,-8(%ebp) +movl %edi,%esi +movl %esi,-4(%ebp) +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +movl -8(%ebp),%edi +movl %edi,%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +movl -8(%ebp),%edi +movl %edi,%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +movl -8(%ebp),%edi +movl %edi,%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +movl -8(%ebp),%edi +movl %edi,%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +movl -8(%ebp),%edi +movl %edi,%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +pushl $.LC11 +call print +addl $100,%esp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf12: +.size main,.Lf12-main +.globl print +.align 16 +.type print,@function +print: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $28,%esp +leal 24(%ebp),%edi +movl %edi,-4(%ebp) +jmp .LC19 +.LC16: +movl 20(%ebp),%edi +movsbl (,%edi),%edi +cmpl $37,%edi +jne .LC20 +movl 20(%ebp),%edi +leal 1(%edi),%edi +movl %edi,20(%ebp) +movsbl (,%edi),%edi +movl %edi,-8(%ebp) +movl -8(%ebp),%edi +cmpl $115,%edi +je .LC36 +cmpl $115,%edi +jg .LC41 +.LC40: +movl -8(%ebp),%edi +cmpl $98,%edi +jl .LC22 +cmpl $102,%edi +jg .LC22 +jmp *.LC42-392(,%edi,4) +.data +.align 4 +.LC42: +.long .LC25 +.long .LC30 +.long .LC32 +.long .LC22 +.long .LC38 +.text +.LC41: +cmpl $119,-8(%ebp) +je .LC34 +jmp .LC22 +.LC25: +movl -4(%ebp),%edi +leal 16(%edi),%edi +movl %edi,-28(%ebp) +movl %edi,-4(%ebp) +leal -24(%ebp),%edi +movl -28(%ebp),%esi +leal -16(%esi),%esi +movl $16,%ecx +rep +movsb +pushl -12(%ebp) +pushl -16(%ebp) +pushl -20(%ebp) +pushl -24(%ebp) +pushl $.LC26 +call printf +addl $20,%esp +jmp .LC21 +.LC30: +movl -4(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-4(%ebp) +movsbl -4(%edi),%edi +pushl %edi +pushl $.LC31 +call printf +addl $8,%esp +jmp .LC21 +.LC32: +movl -4(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-4(%ebp) +pushl -4(%edi) +pushl $.LC33 +call printf +addl $8,%esp +jmp .LC21 +.LC34: +movl -4(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-4(%ebp) +movswl -4(%edi),%edi +pushl %edi +pushl $.LC35 +call printf +addl $8,%esp +jmp .LC21 +.LC36: +movl -4(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-4(%ebp) +pushl -4(%edi) +pushl $.LC37 +call printf +addl $8,%esp +jmp .LC21 +.LC38: +movl -4(%ebp),%edi +leal 8(%edi),%edi +movl %edi,-4(%ebp) +fldl -8(%edi) +subl $8,%esp +fstpl (%esp) +pushl $.LC39 +call printf +addl $12,%esp +jmp .LC21 +.LC22: +movl 20(%ebp),%edi +movsbl (,%edi),%edi +pushl %edi +pushl $.LC31 +call printf +addl $8,%esp +jmp .LC21 +.LC20: +movl 20(%ebp),%edi +movsbl (,%edi),%edi +pushl %edi +pushl $.LC31 +call printf +addl $8,%esp +.LC21: +.LC17: +incl 20(%ebp) +.LC19: +movl 20(%ebp),%edi +movsbl (,%edi),%edi +cmpl $0,%edi +jne .LC16 +movl $0,%eax +.LC13: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf44: +.size print,.Lf44-print +.data +.align 1 +.LC39: +.byte 37 +.byte 102 +.byte 0 +.align 1 +.LC37: +.byte 37 +.byte 115 +.byte 0 +.align 1 +.LC35: +.byte 37 +.byte 120 +.byte 0 +.align 1 +.LC33: +.byte 37 +.byte 100 +.byte 0 +.align 1 +.LC31: +.byte 37 +.byte 99 +.byte 0 +.align 1 +.LC26: +.byte 123 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 125 +.byte 0 +.align 1 +.LC11: +.byte 37 +.byte 98 +.byte 32 +.byte 37 +.byte 98 +.byte 32 +.byte 37 +.byte 98 +.byte 32 +.byte 37 +.byte 98 +.byte 32 +.byte 37 +.byte 98 +.byte 32 +.byte 37 +.byte 98 +.byte 10 +.byte 0 +.align 4 +.LC10: +.long 0 +.long 1075052544 +.align 1 +.LC9: +.byte 37 +.byte 115 +.byte 37 +.byte 115 +.byte 32 +.byte 37 +.byte 102 +.byte 37 +.byte 99 +.byte 0 +.align 1 +.LC8: +.byte 115 +.byte 116 +.byte 0 +.align 1 +.LC7: +.byte 116 +.byte 101 +.byte 0 +.align 1 +.LC6: +.byte 37 +.byte 115 +.byte 37 +.byte 115 +.byte 32 +.byte 37 +.byte 119 +.byte 37 +.byte 99 +.byte 0 +.align 1 +.LC5: +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 37 +.byte 100 +.byte 37 +.byte 99 +.byte 0 +.align 1 +.LC4: +.byte 50 +.byte 0 +.align 1 +.LC3: +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC2: +.byte 116 +.byte 101 +.byte 115 +.byte 116 +.byte 32 +.byte 49 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/struct.1bk b/quake3/source/lcc/x86/linux/tst/struct.1bk new file mode 100644 index 0000000..2358779 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/struct.1bk @@ -0,0 +1,5 @@ +(-1,-1) is not within [10,10; 310,310] +(1,1) is not within [10,10; 310,310] +(20,300) is within [10,10; 310,310] +(500,400) is not within [10,10; 310,310] +ab diff --git a/quake3/source/lcc/x86/linux/tst/struct.2bk b/quake3/source/lcc/x86/linux/tst/struct.2bk new file mode 100644 index 0000000..8a01bb1 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/struct.2bk @@ -0,0 +1,2 @@ +tst/struct.c:49: warning: missing return value +tst/struct.c:68: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/struct.sbk b/quake3/source/lcc/x86/linux/tst/struct.sbk new file mode 100644 index 0000000..7c5b58b --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/struct.sbk @@ -0,0 +1,477 @@ +.globl addpoint +.text +.align 16 +.type addpoint,@function +addpoint: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 32(%ebp),%edi +addl %edi,24(%ebp) +movl 36(%ebp),%edi +addl %edi,28(%ebp) +movl 20(%ebp),%edi +leal 24(%ebp),%esi +movl $8,%ecx +rep +movsb +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf5: +.size addpoint,.Lf5-addpoint +.globl canonrect +.align 16 +.type canonrect,@function +canonrect: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $32,%esp +movl 32(%ebp),%edi +cmpl %edi,24(%ebp) +jge .LC11 +movl 24(%ebp),%edi +movl %edi,-20(%ebp) +jmp .LC12 +.LC11: +movl 32(%ebp),%edi +movl %edi,-20(%ebp) +.LC12: +movl -20(%ebp),%edi +movl %edi,-16(%ebp) +movl 36(%ebp),%edi +cmpl %edi,28(%ebp) +jge .LC21 +movl 28(%ebp),%edi +movl %edi,-24(%ebp) +jmp .LC22 +.LC21: +movl 36(%ebp),%edi +movl %edi,-24(%ebp) +.LC22: +movl -24(%ebp),%edi +movl %edi,-12(%ebp) +movl 32(%ebp),%edi +cmpl %edi,24(%ebp) +jle .LC27 +movl 24(%ebp),%edi +movl %edi,-28(%ebp) +jmp .LC28 +.LC27: +movl 32(%ebp),%edi +movl %edi,-28(%ebp) +.LC28: +movl -28(%ebp),%edi +movl %edi,-8(%ebp) +movl 36(%ebp),%edi +cmpl %edi,28(%ebp) +jle .LC38 +movl 28(%ebp),%edi +movl %edi,-32(%ebp) +jmp .LC39 +.LC38: +movl 36(%ebp),%edi +movl %edi,-32(%ebp) +.LC39: +movl -32(%ebp),%edi +movl %edi,-4(%ebp) +movl 20(%ebp),%edi +leal -16(%ebp),%esi +movl $16,%ecx +rep +movsb +.LC6: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf40: +.size canonrect,.Lf40-canonrect +.globl makepoint +.align 16 +.type makepoint,@function +makepoint: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl 24(%ebp),%edi +movl %edi,-8(%ebp) +movl 28(%ebp),%edi +movl %edi,-4(%ebp) +movl 20(%ebp),%edi +leal -8(%ebp),%esi +movl $8,%ecx +rep +movsb +.LC41: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf44: +.size makepoint,.Lf44-makepoint +.globl makerect +.align 16 +.type makerect,@function +makerect: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $16,%esp +leal -16(%ebp),%edi +leal 24(%ebp),%esi +movl $8,%ecx +rep +movsb +leal -8(%ebp),%edi +leal 32(%ebp),%esi +movl $8,%ecx +rep +movsb +leal -16(%ebp),%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +pushl 20(%ebp) +call canonrect +addl $20,%esp +.LC45: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf48: +.size makerect,.Lf48-makerect +.globl ptinrect +.align 16 +.type ptinrect,@function +ptinrect: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl 20(%ebp),%edi +cmpl 28(%ebp),%edi +jl .LC57 +cmpl 36(%ebp),%edi +jge .LC57 +movl 32(%ebp),%edi +cmpl %edi,24(%ebp) +jl .LC57 +movl 40(%ebp),%edi +cmpl %edi,24(%ebp) +jge .LC57 +movl $1,-4(%ebp) +jmp .LC58 +.LC57: +movl $0,-4(%ebp) +.LC58: +movl -4(%ebp),%eax +.LC49: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf59: +.size ptinrect,.Lf59-ptinrect +.data +.globl y +.align 4 +.type y,@object +.size y,4 +y: +.byte 97 +.byte 98 +.byte 0 +.space 1 +.globl odd +.text +.align 16 +.type odd,@function +odd: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +leal -4(%ebp),%edi +leal 20(%ebp),%esi +movl $4,%ecx +rep +movsb +leal -4(%ebp),%edi +pushl %edi +pushl $.LC61 +call printf +addl $8,%esp +movl $0,%eax +.LC60: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf62: +.size odd,.Lf62-odd +.data +.align 4 +.LC64: +.long 0 +.long 0 +.align 4 +.LC65: +.long 320 +.long 320 +.align 4 +.LC66: +.long -1 +.long -1 +.long 1 +.long 1 +.long 20 +.long 300 +.long 500 +.long 400 +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $108,%esp +leal -68(%ebp),%edi +leal .LC64,%esi +movl $8,%ecx +rep +movsb +leal -76(%ebp),%edi +leal .LC65,%esi +movl $8,%ecx +rep +movsb +leal -36(%ebp),%edi +leal .LC66,%esi +movl $32,%ecx +rep +movsb +pushl $-10 +pushl $-10 +leal -84(%ebp),%edi +pushl %edi +call makepoint +addl $12,%esp +leal -84(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +leal -76(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +leal -92(%ebp),%edi +pushl %edi +call addpoint +addl $20,%esp +pushl $10 +pushl $10 +leal -100(%ebp),%edi +pushl %edi +call makepoint +addl $12,%esp +leal -100(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +leal -68(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +leal -108(%ebp),%edi +pushl %edi +call addpoint +addl $20,%esp +leal -108(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +leal -92(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +leal -52(%ebp),%edi +pushl %edi +call makerect +addl $20,%esp +movl $0,-4(%ebp) +jmp .LC70 +.LC67: +movl -4(%ebp),%edi +leal (,%edi,8),%edi +leal -32(%ebp),%esi +pushl (%esi,%edi) +leal -36(%ebp),%esi +pushl (%esi,%edi) +leal -60(%ebp),%edi +pushl %edi +call makepoint +addl $12,%esp +pushl -56(%ebp) +movl -4(%ebp),%edi +leal -36(%ebp),%esi +pushl (%esi,%edi,8) +pushl $.LC71 +call printf +addl $12,%esp +leal -52(%ebp),%esi +subl $16,%esp +movl %esp,%edi +movl $16,%ecx +rep +movsb +leal -60(%ebp),%esi +subl $8,%esp +movl %esp,%edi +movl $8,%ecx +rep +movsb +call ptinrect +addl $24,%esp +cmpl $0,%eax +jne .LC74 +pushl $.LC76 +call printf +addl $4,%esp +.LC74: +pushl -40(%ebp) +pushl -44(%ebp) +pushl -48(%ebp) +pushl -52(%ebp) +pushl $.LC77 +call printf +addl $20,%esp +.LC68: +incl -4(%ebp) +.LC70: +movl -4(%ebp),%edi +cmpl $4,%edi +jb .LC67 +leal y,%esi +subl $4,%esp +movl %esp,%edi +movl $4,%ecx +rep +movsb +call odd +addl $4,%esp +pushl $0 +call exit +addl $4,%esp +movl $0,%eax +.LC63: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf82: +.size main,.Lf82-main +.data +.align 1 +.LC77: +.byte 119 +.byte 105 +.byte 116 +.byte 104 +.byte 105 +.byte 110 +.byte 32 +.byte 91 +.byte 37 +.byte 100 +.byte 44 +.byte 37 +.byte 100 +.byte 59 +.byte 32 +.byte 37 +.byte 100 +.byte 44 +.byte 37 +.byte 100 +.byte 93 +.byte 10 +.byte 0 +.align 1 +.LC76: +.byte 110 +.byte 111 +.byte 116 +.byte 32 +.byte 0 +.align 1 +.LC71: +.byte 40 +.byte 37 +.byte 100 +.byte 44 +.byte 37 +.byte 100 +.byte 41 +.byte 32 +.byte 105 +.byte 115 +.byte 32 +.byte 0 +.align 1 +.LC61: +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/switch.1bk b/quake3/source/lcc/x86/linux/tst/switch.1bk new file mode 100644 index 0000000..559e8e3 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/switch.1bk @@ -0,0 +1,76 @@ +b = 0x8 +f = 0xc +n = 0xa +r = 0xd +t = 0x9 +v = 0xb +x = 0x78 +f: +x = 0 +x = 1 +x = 2 +x = 2 +x = 2 +x = 2 +x = 2 +x = 7 +x = 8 +x = 9 +x = 9 +x = 9 +x = 9 +x = 9 +x = 9 +x = 9 +x = 16 +x = 17 +x = 18 +x = 19 +x = 20 +g: +1 1 +1 2 +2 3 +2 4 +2 5 +3 6 +d 6 +3 7 +d 7 +3 8 +d 8 +d 9 +d 10 +h: +i = 8 +i = 16 +i = 120 +i = 128 +i = 248 +i = 264 +i = 272 +i = 280 +i = 288 +i = 296 +i = 304 +i = 312 +488 defaults +x = 0x1000000 +x = 0x2000000 +x = 0x3000000 +x = 0x4000000 +x = 0x5000000 +x = 0x6000000 (default) +x = 0x7000000 (default) +0 +1 +2 +3 +4 +5 +0 +1 +2 +3 +4 +5 diff --git a/quake3/source/lcc/x86/linux/tst/switch.2bk b/quake3/source/lcc/x86/linux/tst/switch.2bk new file mode 100644 index 0000000..76387b3 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/switch.2bk @@ -0,0 +1,5 @@ +tst/switch.c:55: warning: missing return value +tst/switch.c:73: warning: missing return value +tst/switch.c:97: warning: missing return value +tst/switch.c:112: warning: missing return value +tst/switch.c:137: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/switch.sbk b/quake3/source/lcc/x86/linux/tst/switch.sbk new file mode 100644 index 0000000..c77e6a6 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/switch.sbk @@ -0,0 +1,899 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +leal .LC6,%edi +movl %edi,-4(%ebp) +jmp .LC5 +.LC2: +movl -4(%ebp),%edi +movsbl (,%edi),%edi +pushl %edi +call backslash +addl $4,%esp +pushl %eax +movl -4(%ebp),%edi +movsbl (,%edi),%edi +pushl %edi +pushl $.LC7 +call printf +addl $12,%esp +.LC3: +incl -4(%ebp) +.LC5: +movl -4(%ebp),%edi +movsbl (,%edi),%edi +cmpl $0,%edi +jne .LC2 +call f +call g +call h +movl $16777216,-8(%ebp) +jmp .LC11 +.LC8: +pushl -8(%ebp) +call big +addl $4,%esp +.LC9: +addl $16777216,-8(%ebp) +.LC11: +movl -8(%ebp),%edi +andl $117440512,%edi +cmpl $0,%edi +jne .LC8 +call limit +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf12: +.size main,.Lf12-main +.globl backslash +.align 16 +.type backslash,@function +backslash: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +cmpl $102,%edi +je .LC17 +cmpl $102,%edi +jg .LC23 +.LC22: +cmpl $98,20(%ebp) +je .LC16 +jmp .LC14 +.LC23: +movl 20(%ebp),%edi +cmpl $110,%edi +je .LC18 +cmpl $110,%edi +jl .LC14 +.LC24: +movl 20(%ebp),%edi +cmpl $114,%edi +je .LC19 +cmpl $116,%edi +je .LC20 +cmpl $118,%edi +je .LC21 +jmp .LC14 +.LC16: +movl $8,%eax +jmp .LC13 +.LC17: +movl $12,%eax +jmp .LC13 +.LC18: +movl $10,%eax +jmp .LC13 +.LC19: +movl $13,%eax +jmp .LC13 +.LC20: +movl $9,%eax +jmp .LC13 +.LC21: +movl $11,%eax +jmp .LC13 +.LC14: +movl 20(%ebp),%eax +.LC13: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf25: +.size backslash,.Lf25-backslash +.globl f +.align 16 +.type f,@function +f: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $12,%esp +movl $0,-8(%ebp) +pushl $.LC27 +call printf +addl $4,%esp +movl $0,-4(%ebp) +.LC28: +movl -4(%ebp),%edi +movl %edi,-12(%ebp) +movl -4(%ebp),%edi +cmpl $1,%edi +jl .LC32 +cmpl $20,%edi +jg .LC32 +jmp *.LC44-4(,%edi,4) +.data +.align 4 +.LC44: +.long .LC34 +.long .LC35 +.long .LC32 +.long .LC32 +.long .LC32 +.long .LC32 +.long .LC36 +.long .LC37 +.long .LC38 +.long .LC32 +.long .LC32 +.long .LC32 +.long .LC32 +.long .LC32 +.long .LC32 +.long .LC39 +.long .LC40 +.long .LC41 +.long .LC42 +.long .LC43 +.text +.LC34: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC35: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC36: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC37: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC38: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC39: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC40: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC41: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC42: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC33 +.LC43: +movl -4(%ebp),%edi +movl %edi,-8(%ebp) +.LC32: +.LC33: +pushl -8(%ebp) +pushl $.LC46 +call printf +addl $8,%esp +.LC29: +incl -4(%ebp) +cmpl $20,-4(%ebp) +jle .LC28 +movl $0,%eax +.LC26: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf47: +.size f,.Lf47-f +.globl g +.align 16 +.type g,@function +g: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +pushl $.LC49 +call printf +addl $4,%esp +movl $1,-4(%ebp) +.LC50: +movl -4(%ebp),%edi +cmpl $1001,%edi +jl .LC67 +cmpl $1004,%edi +jg .LC68 +jmp *.LC69-4004(,%edi,4) +.data +.align 4 +.LC69: +.long .LC63 +.long .LC63 +.long .LC63 +.long .LC63 +.text +.LC67: +movl -4(%ebp),%edi +cmpl $1,%edi +jl .LC54 +cmpl $8,%edi +jg .LC54 +jmp *.LC71-4(,%edi,4) +.data +.align 4 +.LC71: +.long .LC56 +.long .LC56 +.long .LC58 +.long .LC58 +.long .LC58 +.long .LC60 +.long .LC60 +.long .LC60 +.text +.LC68: +movl -4(%ebp),%edi +cmpl $3001,%edi +jl .LC54 +cmpl $3004,%edi +jg .LC54 +jmp *.LC73-12004(,%edi,4) +.data +.align 4 +.LC73: +.long .LC65 +.long .LC65 +.long .LC65 +.long .LC65 +.text +.LC56: +pushl -4(%ebp) +pushl $.LC57 +call printf +addl $8,%esp +jmp .LC55 +.LC58: +pushl -4(%ebp) +pushl $.LC59 +call printf +addl $8,%esp +jmp .LC55 +.LC60: +pushl -4(%ebp) +pushl $.LC61 +call printf +addl $8,%esp +.LC54: +pushl -4(%ebp) +pushl $.LC62 +call printf +addl $8,%esp +jmp .LC55 +.LC63: +pushl -4(%ebp) +pushl $.LC64 +call printf +addl $8,%esp +jmp .LC55 +.LC65: +pushl -4(%ebp) +pushl $.LC66 +call printf +addl $8,%esp +.LC55: +.LC51: +incl -4(%ebp) +cmpl $10,-4(%ebp) +jle .LC50 +movl $0,%eax +.LC48: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf75: +.size g,.Lf75-g +.globl h +.align 16 +.type h,@function +h: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +movl $0,-8(%ebp) +pushl $.LC77 +call printf +addl $4,%esp +movl $1,-4(%ebp) +.LC78: +movl -4(%ebp),%edi +cmpl $264,%edi +je .LC90 +cmpl $264,%edi +jg .LC98 +.LC97: +movl -4(%ebp),%edi +cmpl $120,%edi +je .LC88 +cmpl $120,%edi +jg .LC100 +.LC99: +movl -4(%ebp),%edi +cmpl $8,%edi +je .LC87 +cmpl $8,%edi +jl .LC82 +.LC101: +cmpl $16,-4(%ebp) +je .LC86 +jmp .LC82 +.LC100: +movl -4(%ebp),%edi +cmpl $128,%edi +je .LC84 +cmpl $128,%edi +jl .LC82 +.LC102: +cmpl $248,-4(%ebp) +je .LC91 +jmp .LC82 +.LC98: +movl -4(%ebp),%edi +cmpl $288,%edi +je .LC95 +cmpl $288,%edi +jg .LC104 +.LC103: +movl -4(%ebp),%edi +cmpl $272,%edi +je .LC92 +cmpl $272,%edi +jl .LC82 +.LC105: +cmpl $280,-4(%ebp) +je .LC89 +jmp .LC82 +.LC104: +movl -4(%ebp),%edi +cmpl $304,%edi +je .LC93 +cmpl $304,%edi +jg .LC107 +.LC106: +cmpl $296,-4(%ebp) +je .LC94 +jmp .LC82 +.LC107: +cmpl $312,-4(%ebp) +je .LC96 +jmp .LC82 +.LC82: +incl -8(%ebp) +jmp .LC79 +.LC84: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC86: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC87: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC88: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC89: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC90: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC91: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC92: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC93: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC94: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC95: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +jmp .LC83 +.LC96: +pushl -4(%ebp) +pushl $.LC85 +call printf +addl $8,%esp +.LC83: +.LC79: +incl -4(%ebp) +cmpl $500,-4(%ebp) +jle .LC78 +pushl -8(%ebp) +pushl $.LC108 +call printf +addl $8,%esp +movl $0,%eax +.LC76: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf109: +.size h,.Lf109-h +.globl big +.align 16 +.type big,@function +big: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl 20(%ebp),%edi +andl $0x6000000,%edi +movl %edi,-4(%ebp) +movl -4(%ebp),%edi +cmpl $33554432,%edi +je .LC116 +cmpl $33554432,%edi +jg .LC120 +.LC119: +movl -4(%ebp),%edi +cmpl $-2,%edi +je .LC114 +cmpl $-1,%edi +je .LC114 +cmpl $0,%edi +je .LC114 +jmp .LC111 +.LC120: +movl -4(%ebp),%edi +cmpl $67108864,%edi +je .LC117 +jmp .LC111 +.LC114: +pushl 20(%ebp) +pushl $.LC115 +call printf +addl $8,%esp +jmp .LC112 +.LC116: +pushl 20(%ebp) +pushl $.LC115 +call printf +addl $8,%esp +jmp .LC112 +.LC117: +pushl 20(%ebp) +pushl $.LC115 +call printf +addl $8,%esp +jmp .LC112 +.LC111: +pushl 20(%ebp) +pushl $.LC118 +call printf +addl $8,%esp +.LC112: +movl $0,%eax +.LC110: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf121: +.size big,.Lf121-big +.globl limit +.align 16 +.type limit,@function +limit: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl $-2147483648,-4(%ebp) +.LC123: +movl -4(%ebp),%edi +movl $-2147483648,%esi +cmpl $-2147483648,%edi +jl .LC127 +cmpl $-2147483644,%edi +jg .LC127 +leal (,%edi,4),%edi +leal (,%esi,4),%esi +subl %esi,%edi +jmp *.LC140(%edi) +.data +.align 4 +.LC140: +.long .LC129 +.long .LC131 +.long .LC133 +.long .LC135 +.long .LC137 +.text +.LC129: +pushl $.LC130 +call printf +addl $4,%esp +jmp .LC128 +.LC131: +pushl $.LC132 +call printf +addl $4,%esp +jmp .LC128 +.LC133: +pushl $.LC134 +call printf +addl $4,%esp +jmp .LC128 +.LC135: +pushl $.LC136 +call printf +addl $4,%esp +jmp .LC128 +.LC137: +pushl $.LC138 +call printf +addl $4,%esp +jmp .LC128 +.LC127: +pushl $.LC139 +call printf +addl $4,%esp +.LC128: +.LC124: +incl -4(%ebp) +cmpl $-2147483643,-4(%ebp) +jle .LC123 +movl $2147483647,-4(%ebp) +.LC141: +movl -4(%ebp),%edi +movl $2147483643,%esi +cmpl $2147483643,%edi +jl .LC145 +cmpl $2147483647,%edi +jg .LC145 +leal (,%edi,4),%edi +leal (,%esi,4),%esi +subl %esi,%edi +jmp *.LC152(%edi) +.data +.align 4 +.LC152: +.long .LC151 +.long .LC150 +.long .LC149 +.long .LC148 +.long .LC147 +.text +.LC147: +pushl $.LC130 +call printf +addl $4,%esp +jmp .LC146 +.LC148: +pushl $.LC132 +call printf +addl $4,%esp +jmp .LC146 +.LC149: +pushl $.LC134 +call printf +addl $4,%esp +jmp .LC146 +.LC150: +pushl $.LC136 +call printf +addl $4,%esp +jmp .LC146 +.LC151: +pushl $.LC138 +call printf +addl $4,%esp +jmp .LC146 +.LC145: +pushl $.LC139 +call printf +addl $4,%esp +.LC146: +.LC142: +decl -4(%ebp) +cmpl $2147483642,-4(%ebp) +jge .LC141 +movl $0,%eax +.LC122: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf153: +.size limit,.Lf153-limit +.data +.align 1 +.LC139: +.byte 53 +.byte 10 +.byte 0 +.align 1 +.LC138: +.byte 52 +.byte 10 +.byte 0 +.align 1 +.LC136: +.byte 51 +.byte 10 +.byte 0 +.align 1 +.LC134: +.byte 50 +.byte 10 +.byte 0 +.align 1 +.LC132: +.byte 49 +.byte 10 +.byte 0 +.align 1 +.LC130: +.byte 48 +.byte 10 +.byte 0 +.align 1 +.LC118: +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 120 +.byte 37 +.byte 120 +.byte 32 +.byte 40 +.byte 100 +.byte 101 +.byte 102 +.byte 97 +.byte 117 +.byte 108 +.byte 116 +.byte 41 +.byte 10 +.byte 0 +.align 1 +.LC115: +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 120 +.byte 37 +.byte 120 +.byte 10 +.byte 0 +.align 1 +.LC108: +.byte 37 +.byte 100 +.byte 32 +.byte 100 +.byte 101 +.byte 102 +.byte 97 +.byte 117 +.byte 108 +.byte 116 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC85: +.byte 105 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC77: +.byte 104 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC66: +.byte 54 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC64: +.byte 53 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC62: +.byte 100 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC61: +.byte 51 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC59: +.byte 50 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC57: +.byte 49 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC49: +.byte 103 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC46: +.byte 120 +.byte 32 +.byte 61 +.byte 32 +.byte 37 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC27: +.byte 102 +.byte 58 +.byte 10 +.byte 0 +.align 1 +.LC7: +.byte 37 +.byte 99 +.byte 32 +.byte 61 +.byte 32 +.byte 48 +.byte 120 +.byte 37 +.byte 120 +.byte 10 +.byte 0 +.align 1 +.LC6: +.byte 98 +.byte 102 +.byte 110 +.byte 114 +.byte 116 +.byte 118 +.byte 120 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/wf1.1bk b/quake3/source/lcc/x86/linux/tst/wf1.1bk new file mode 100644 index 0000000..095e087 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/wf1.1bk @@ -0,0 +1,74 @@ +5 a +2 and +5 buf +16 c +8 char +1 compare +4 cond +5 count +1 d +1 die +3 else +1 entry +1 eof +4 err +1 error +1 exit +1 folded +1 for +1 free +1 frequencies +1 frequency +1 get +2 getchar +3 getword +14 if +2 in +1 index +1 input +1 install +8 int +1 into +1 is +4 isletter +1 it +1 itself +5 left +1 letter +7 lookup +1 main +2 malloc +1 message +2 n +1 necessary +12 next +9 node +4 of +1 on +1 or +1 otherwise +2 out +8 p +3 print +2 printf +16 return +5 right +4 root +25 s +2 storage +3 strcmp +1 strcpy +1 strlen +8 struct +1 structures +2 subtree +1 t +5 tprint +9 tree +1 uses +1 version +1 wf +3 while +21 word +9 words +2 z diff --git a/quake3/source/lcc/x86/linux/tst/wf1.2bk b/quake3/source/lcc/x86/linux/tst/wf1.2bk new file mode 100644 index 0000000..0e7a8a6 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/wf1.2bk @@ -0,0 +1,2 @@ +tst/wf1.c:29: warning: missing return value +tst/wf1.c:87: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/wf1.sbk b/quake3/source/lcc/x86/linux/tst/wf1.sbk new file mode 100644 index 0000000..fb237a3 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/wf1.sbk @@ -0,0 +1,437 @@ +.globl main +.text +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $24,%esp +movl $0,-24(%ebp) +movl $0,next +jmp .LC3 +.LC2: +leal -24(%ebp),%edi +pushl %edi +leal -20(%ebp),%edi +pushl %edi +call lookup +addl $8,%esp +incl (,%eax) +.LC3: +leal -20(%ebp),%edi +pushl %edi +call getword +addl $4,%esp +cmpl $0,%eax +jne .LC2 +pushl -24(%ebp) +call tprint +addl $4,%esp +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf5: +.size main,.Lf5-main +.globl err +.align 16 +.type err,@function +err: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl 20(%ebp) +pushl $.LC7 +call printf +addl $8,%esp +pushl $1 +call exit +addl $4,%esp +movl $0,%eax +.LC6: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf8: +.size err,.Lf8-err +.globl getword +.align 16 +.type getword,@function +getword: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $8,%esp +.LC10: +.LC11: +call getchar +movl %eax,%edi +movl %edi,-4(%ebp) +cmpl $-1,%edi +je .LC13 +pushl -4(%ebp) +call isletter +addl $4,%esp +cmpl $0,%eax +je .LC10 +.LC13: +movl 20(%ebp),%edi +movl %edi,-8(%ebp) +jmp .LC17 +.LC14: +movl -8(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-8(%ebp) +movl -4(%ebp),%esi +movl %esi,%ebx +movb %bl,(,%edi) +.LC15: +call getchar +movl %eax,-4(%ebp) +.LC17: +pushl -4(%ebp) +call isletter +addl $4,%esp +movl %eax,-4(%ebp) +cmpl $0,%eax +jne .LC14 +movl -8(%ebp),%edi +movb $0,(,%edi) +movl -8(%ebp),%edi +movl 20(%ebp),%esi +cmpl %esi,%edi +jbe .LC18 +movl $1,%eax +jmp .LC9 +.LC18: +movl $0,%eax +.LC9: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf20: +.size getword,.Lf20-getword +.globl isletter +.align 16 +.type isletter,@function +isletter: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +cmpl $65,%edi +jl .LC22 +cmpl $90,%edi +jg .LC22 +addl $32,20(%ebp) +.LC22: +movl 20(%ebp),%edi +cmpl $97,%edi +jl .LC24 +cmpl $122,%edi +jg .LC24 +movl 20(%ebp),%eax +jmp .LC21 +.LC24: +movl $0,%eax +.LC21: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf26: +.size isletter,.Lf26-isletter +.globl lookup +.align 16 +.type lookup,@function +lookup: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +movl 24(%ebp),%edi +movl (,%edi),%edi +cmpl $0,%edi +je .LC28 +movl 24(%ebp),%edi +movl (,%edi),%edi +pushl 12(%edi) +pushl 20(%ebp) +call strcmp +addl $8,%esp +movl %eax,-4(%ebp) +cmpl $0,-4(%ebp) +jge .LC30 +movl 24(%ebp),%edi +movl (,%edi),%edi +leal 4(%edi),%edi +pushl %edi +pushl 20(%ebp) +call lookup +addl $8,%esp +movl %eax,%edi +jmp .LC27 +.LC30: +cmpl $0,-4(%ebp) +jle .LC32 +movl 24(%ebp),%edi +movl (,%edi),%edi +leal 8(%edi),%edi +pushl %edi +pushl 20(%ebp) +call lookup +addl $8,%esp +movl %eax,%edi +jmp .LC27 +.LC32: +movl 24(%ebp),%edi +movl (,%edi),%eax +jmp .LC27 +.LC28: +cmpl $2000,next +jl .LC34 +pushl $.LC36 +call err +addl $4,%esp +.LC34: +movl next,%edi +sall $4,%edi +movl $0,words(%edi) +movl next,%edi +sall $4,%edi +movl $0,words+8(%edi) +movl $0,words+4(%edi) +pushl 20(%ebp) +call strlen +addl $4,%esp +leal 1(%eax),%edi +pushl %edi +call malloc +addl $4,%esp +movl next,%esi +sall $4,%esi +movl %eax,words+12(%esi) +movl next,%edi +sall $4,%edi +movl words+12(%edi),%edi +cmpl $0,%edi +jne .LC40 +pushl $.LC43 +call err +addl $4,%esp +.LC40: +pushl 20(%ebp) +movl next,%edi +sall $4,%edi +pushl words+12(%edi) +call strcpy +addl $8,%esp +movl next,%edi +leal 1(%edi),%esi +movl %esi,next +sall $4,%edi +leal words(%edi),%edi +movl 24(%ebp),%esi +movl %edi,(,%esi) +movl %edi,%eax +.LC27: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf45: +.size lookup,.Lf45-lookup +.globl tprint +.align 16 +.type tprint,@function +tprint: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +cmpl $0,%edi +je .LC47 +movl 20(%ebp),%edi +pushl 4(%edi) +call tprint +addl $4,%esp +movl 20(%ebp),%edi +pushl 12(%edi) +pushl (,%edi) +pushl $.LC49 +call printf +addl $12,%esp +movl 20(%ebp),%edi +pushl 8(%edi) +call tprint +addl $4,%esp +.LC47: +movl $0,%eax +.LC46: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf50: +.size tprint,.Lf50-tprint +.globl strcmp +.align 16 +.type strcmp,@function +strcmp: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +jmp .LC53 +.LC52: +movl 20(%ebp),%edi +leal 1(%edi),%esi +movl %esi,20(%ebp) +movsbl (,%edi),%edi +cmpl $0,%edi +jne .LC55 +movl $0,%eax +jmp .LC51 +.LC55: +incl 24(%ebp) +.LC53: +movl 20(%ebp),%edi +movsbl (,%edi),%edi +movl 24(%ebp),%esi +movsbl (,%esi),%esi +cmpl %esi,%edi +je .LC52 +movl 20(%ebp),%edi +movsbl (,%edi),%edi +cmpl $0,%edi +jne .LC57 +movl $-1,%eax +jmp .LC51 +.LC57: +movl 24(%ebp),%edi +movsbl (,%edi),%edi +cmpl $0,%edi +jne .LC59 +movl $1,%eax +jmp .LC51 +.LC59: +movl 20(%ebp),%edi +movsbl (,%edi),%edi +movl 24(%ebp),%esi +movsbl (,%esi),%esi +movl %edi,%eax +subl %esi,%eax +.LC51: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf61: +.size strcmp,.Lf61-strcmp +.bss +.globl next +.align 4 +.type next,@object +.size next,4 +.comm next,4 +.globl words +.align 4 +.type words,@object +.size words,32000 +.comm words,32000 +.data +.align 1 +.LC49: +.byte 37 +.byte 100 +.byte 9 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC43: +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 119 +.byte 111 +.byte 114 +.byte 100 +.byte 32 +.byte 115 +.byte 116 +.byte 111 +.byte 114 +.byte 97 +.byte 103 +.byte 101 +.byte 0 +.align 1 +.LC36: +.byte 111 +.byte 117 +.byte 116 +.byte 32 +.byte 111 +.byte 102 +.byte 32 +.byte 110 +.byte 111 +.byte 100 +.byte 101 +.byte 32 +.byte 115 +.byte 116 +.byte 111 +.byte 114 +.byte 97 +.byte 103 +.byte 101 +.byte 0 +.align 1 +.LC7: +.byte 63 +.byte 32 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/linux/tst/yacc.1bk b/quake3/source/lcc/x86/linux/tst/yacc.1bk new file mode 100644 index 0000000..b08a02f --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/yacc.1bk @@ -0,0 +1,10 @@ +a +b +load +negate +push 5 +c +load +multiply +add +store diff --git a/quake3/source/lcc/x86/linux/tst/yacc.2bk b/quake3/source/lcc/x86/linux/tst/yacc.2bk new file mode 100644 index 0000000..a84aa5b --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/yacc.2bk @@ -0,0 +1,3 @@ +tst/yacc.c:345: warning: missing return value +tst/yacc.c:349: warning: missing return value +tst/yacc.c:359: warning: missing return value diff --git a/quake3/source/lcc/x86/linux/tst/yacc.sbk b/quake3/source/lcc/x86/linux/tst/yacc.sbk new file mode 100644 index 0000000..a4370b7 --- /dev/null +++ b/quake3/source/lcc/x86/linux/tst/yacc.sbk @@ -0,0 +1,2526 @@ +.data +.globl yyin +.align 4 +.type yyin,@object +.size yyin,4 +yyin: +.long _IO_stdin_ +.globl yyout +.align 4 +.type yyout,@object +.size yyout,4 +yyout: +.long _IO_stdout_ +.globl yylex +.text +.align 16 +.type yylex,@function +yylex: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $4,%esp +jmp .LC3 +.LC2: +.LC5: +movl -4(%ebp),%edi +cmpl $-1,%edi +jl .LC6 +cmpl $4,%edi +jg .LC6 +jmp *.LC17+4(,%edi,4) +.data +.align 4 +.LC17: +.long .LC7 +.long .LC8 +.long .LC11 +.long .LC12 +.long .LC7 +.long .LC14 +.text +.LC8: +call yywrap +cmpl $0,%eax +je .LC7 +movl $0,%eax +jmp .LC1 +.LC11: +movl $257,%eax +jmp .LC1 +.LC12: +movl $258,%eax +jmp .LC1 +.LC14: +movsbl yytext,%eax +jmp .LC1 +.LC6: +pushl -4(%ebp) +pushl $.LC16 +pushl yyout +call fprintf +addl $12,%esp +.LC7: +.LC3: +call yylook +movl %eax,-4(%ebp) +cmpl $0,%eax +jge .LC2 +movl $0,%eax +.LC1: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf19: +.size yylex,.Lf19-yylex +.data +.globl yyvstop +.align 4 +.type yyvstop,@object +yyvstop: +.long 0 +.long 4 +.long 0 +.long 3 +.long 4 +.long 0 +.long 2 +.long 4 +.long 0 +.long 1 +.long 4 +.long 0 +.long 2 +.long 0 +.long 1 +.long 0 +.long 0 +.size yyvstop,68 +.globl yycrank +.align 4 +.type yycrank,@object +yycrank: +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 1 +.byte 3 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 1 +.byte 4 +.space 2 +.byte 1 +.byte 3 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 1 +.byte 5 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 5 +.byte 7 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 1 +.byte 6 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 6 +.byte 8 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.byte 0 +.byte 0 +.space 2 +.size yycrank,580 +.globl yysvec +.align 4 +.type yysvec,@object +yysvec: +.long 0 +.long 0 +.long 0 +.long yycrank-4 +.long 0 +.long 0 +.long yycrank +.long yysvec+12 +.long 0 +.long yycrank +.long 0 +.long yyvstop+4 +.long yycrank +.long 0 +.long yyvstop+12 +.long yycrank+8 +.long 0 +.long yyvstop+24 +.long yycrank+76 +.long 0 +.long yyvstop+36 +.long yycrank +.long yysvec+60 +.long yyvstop+48 +.long yycrank +.long yysvec+72 +.long yyvstop+56 +.long 0 +.long 0 +.long 0 +.size yysvec,120 +.globl yytop +.align 4 +.type yytop,@object +.size yytop,4 +yytop: +.long yycrank+564 +.globl yybgin +.align 4 +.type yybgin,@object +.size yybgin,4 +yybgin: +.long yysvec+12 +.globl yymatch +.align 1 +.type yymatch,@object +yymatch: +.byte 0 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 9 +.byte 10 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 9 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 48 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 65 +.byte 1 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 65 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 1 +.byte 0 +.size yymatch,129 +.globl yyextra +.align 1 +.type yyextra,@object +yyextra: +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.byte 0 +.size yyextra,9 +.globl yylineno +.align 4 +.type yylineno,@object +.size yylineno,4 +yylineno: +.long 1 +.globl yysptr +.align 4 +.type yysptr,@object +.size yysptr,4 +yysptr: +.long yysbuf +.globl yyprevious +.align 4 +.type yyprevious,@object +.size yyprevious,4 +yyprevious: +.long 10 +.globl yylook +.text +.align 16 +.type yylook,@function +yylook: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $44,%esp +cmpl $0,yymorfg +jne .LC35 +leal yytext,%edi +movl %edi,-16(%ebp) +jmp .LC36 +.LC35: +movl $0,yymorfg +movl yyleng,%edi +leal yytext(%edi),%edi +movl %edi,-16(%ebp) +.LC36: +.LC37: +leal yylstate,%edi +movl %edi,-8(%ebp) +movl yybgin,%edi +movl %edi,-4(%ebp) +movl %edi,yyestate +cmpl $10,yyprevious +jne .LC41 +movl -4(%ebp),%edi +leal 12(%edi),%edi +movl %edi,-4(%ebp) +.LC41: +.LC43: +movl -4(%ebp),%edi +movl (,%edi),%edi +movl %edi,-12(%ebp) +movl -12(%ebp),%edi +leal yycrank,%esi +cmpl %esi,%edi +jne .LC47 +movl -4(%ebp),%edi +movl 4(%edi),%edi +movl %edi,-28(%ebp) +movl -28(%ebp),%edi +cmpl $0,%edi +jne .LC49 +jmp .LC94 +.LC49: +movl -28(%ebp),%edi +movl (,%edi),%edi +leal yycrank,%esi +cmpl %esi,%edi +jne .LC51 +jmp .LC94 +.LC51: +.LC47: +movl -16(%ebp),%edi +leal 1(%edi),%esi +movl %esi,-16(%ebp) +movl yysptr,%esi +leal yysbuf,%ebx +cmpl %ebx,%esi +jbe .LC61 +movl yysptr,%esi +leal -1(%esi),%esi +movl %esi,yysptr +movsbl (,%esi),%esi +movl %esi,-40(%ebp) +jmp .LC62 +.LC61: +movl yyin,%esi +movl 4(%esi),%ebx +movl 8(%esi),%esi +cmpl %esi,%ebx +jb .LC63 +pushl yyin +call __uflow +addl $4,%esp +movl %eax,%esi +movl %esi,-44(%ebp) +jmp .LC64 +.LC63: +movl yyin,%esi +leal 4(%esi),%esi +movl (,%esi),%ebx +leal 1(%ebx),%edx +movl %edx,(,%esi) +movb (,%ebx),%bl +movzbl %bl,%esi +movl %esi,-44(%ebp) +.LC64: +movl -44(%ebp),%esi +movl %esi,-40(%ebp) +.LC62: +movl -40(%ebp),%esi +movl %esi,yytchar +cmpl $10,%esi +jne .LC59 +incl yylineno +movl yytchar,%esi +movl %esi,-36(%ebp) +jmp .LC60 +.LC59: +movl yytchar,%esi +movl %esi,-36(%ebp) +.LC60: +cmpl $-1,-36(%ebp) +jne .LC57 +movl $0,-32(%ebp) +jmp .LC58 +.LC57: +movl yytchar,%esi +movl %esi,-32(%ebp) +.LC58: +movl -32(%ebp),%esi +movl %esi,-20(%ebp) +movl %esi,%ebx +movb %bl,(,%edi) +.LC65: +movl -12(%ebp),%edi +movl %edi,-24(%ebp) +leal yycrank,%esi +cmpl %esi,%edi +jbe .LC66 +movl -20(%ebp),%edi +movl -24(%ebp),%esi +leal (%esi,%edi,4),%edi +movl %edi,-12(%ebp) +movl -12(%ebp),%edi +movl %edi,%esi +movl yytop,%ebx +cmpl %ebx,%esi +ja .LC67 +movsbl (,%edi),%edi +imul $12,%edi,%edi +leal yysvec(%edi),%edi +movl -4(%ebp),%esi +cmpl %esi,%edi +jne .LC67 +leal yysvec,%edi +movl -12(%ebp),%esi +movsbl 1(%esi),%esi +imul $12,%esi,%esi +leal yysvec(%esi),%esi +cmpl %edi,%esi +jne .LC70 +movl -16(%ebp),%edi +leal -1(%edi),%edi +movl %edi,-16(%ebp) +movsbl (,%edi),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC72 +decl yylineno +.LC72: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +jmp .LC94 +.LC70: +movl -8(%ebp),%edi +leal 4(%edi),%esi +movl %esi,-8(%ebp) +movl -12(%ebp),%esi +movsbl 1(%esi),%esi +imul $12,%esi,%esi +leal yysvec(%esi),%esi +movl %esi,-4(%ebp) +movl %esi,(,%edi) +jmp .LC43 +.LC66: +movl -12(%ebp),%edi +leal yycrank,%esi +cmpl %esi,%edi +jae .LC75 +leal yycrank,%edi +movl -12(%ebp),%esi +subl %esi,%edi +movl %edi,%eax +movl $4,%ecx +cdq +idivl %ecx +leal yycrank(,%eax,4),%edi +movl %edi,-24(%ebp) +movl %edi,-12(%ebp) +movl -20(%ebp),%edi +movl -12(%ebp),%esi +leal (%esi,%edi,4),%edi +movl %edi,-12(%ebp) +movl -12(%ebp),%edi +movl %edi,%esi +movl yytop,%ebx +cmpl %ebx,%esi +ja .LC77 +movsbl (,%edi),%edi +imul $12,%edi,%edi +leal yysvec(%edi),%edi +movl -4(%ebp),%esi +cmpl %esi,%edi +jne .LC77 +leal yysvec,%edi +movl -12(%ebp),%esi +movsbl 1(%esi),%esi +imul $12,%esi,%esi +leal yysvec(%esi),%esi +cmpl %edi,%esi +jne .LC79 +movl -16(%ebp),%edi +leal -1(%edi),%edi +movl %edi,-16(%ebp) +movsbl (,%edi),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC81 +decl yylineno +.LC81: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +jmp .LC94 +.LC79: +movl -8(%ebp),%edi +leal 4(%edi),%esi +movl %esi,-8(%ebp) +movl -12(%ebp),%esi +movsbl 1(%esi),%esi +imul $12,%esi,%esi +leal yysvec(%esi),%esi +movl %esi,-4(%ebp) +movl %esi,(,%edi) +jmp .LC43 +.LC77: +movl -20(%ebp),%edi +movsbl yymatch(%edi),%edi +movl -24(%ebp),%esi +leal (%esi,%edi,4),%edi +movl %edi,-12(%ebp) +movl -12(%ebp),%edi +movl %edi,%esi +movl yytop,%ebx +cmpl %ebx,%esi +ja .LC83 +movsbl (,%edi),%edi +imul $12,%edi,%edi +leal yysvec(%edi),%edi +movl -4(%ebp),%esi +cmpl %esi,%edi +jne .LC83 +leal yysvec,%edi +movl -12(%ebp),%esi +movsbl 1(%esi),%esi +imul $12,%esi,%esi +leal yysvec(%esi),%esi +cmpl %edi,%esi +jne .LC85 +movl -16(%ebp),%edi +leal -1(%edi),%edi +movl %edi,-16(%ebp) +movsbl (,%edi),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC87 +decl yylineno +.LC87: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +jmp .LC94 +.LC85: +movl -8(%ebp),%edi +leal 4(%edi),%esi +movl %esi,-8(%ebp) +movl -12(%ebp),%esi +movsbl 1(%esi),%esi +imul $12,%esi,%esi +leal yysvec(%esi),%esi +movl %esi,-4(%ebp) +movl %esi,(,%edi) +jmp .LC43 +.LC83: +.LC75: +.LC67: +movl -4(%ebp),%edi +movl 4(%edi),%edi +movl %edi,-4(%ebp) +cmpl $0,%edi +je .LC89 +movl -4(%ebp),%edi +movl (,%edi),%edi +movl %edi,-12(%ebp) +leal yycrank,%esi +cmpl %esi,%edi +je .LC89 +jmp .LC65 +.LC89: +movl -16(%ebp),%edi +leal -1(%edi),%edi +movl %edi,-16(%ebp) +movsbl (,%edi),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC91 +decl yylineno +.LC91: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +jmp .LC94 +.LC93: +movl -16(%ebp),%edi +leal -1(%edi),%esi +movl %esi,-16(%ebp) +movb $0,(,%edi) +movl -8(%ebp),%edi +movl (,%edi),%edi +movl %edi,%esi +cmpl $0,%esi +je .LC96 +movl 8(%edi),%edi +movl %edi,yyfnd +cmpl $0,%edi +je .LC96 +movl yyfnd,%edi +cmpl $0,(,%edi) +jle .LC96 +movl -8(%ebp),%edi +movl %edi,yyolsp +movl yyfnd,%edi +movl (,%edi),%edi +movsbl yyextra(%edi),%edi +cmpl $0,%edi +je .LC98 +jmp .LC101 +.LC100: +movl -8(%ebp),%edi +leal -4(%edi),%edi +movl %edi,-8(%ebp) +movl -16(%ebp),%edi +leal -1(%edi),%esi +movl %esi,-16(%ebp) +movsbl (,%edi),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC103 +decl yylineno +.LC103: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +.LC101: +movl yyfnd,%edi +movl (,%edi),%edi +negl %edi +pushl %edi +movl -8(%ebp),%edi +movl (,%edi),%edi +pushl 8(%edi) +call yyback +addl $8,%esp +cmpl $1,%eax +je .LC105 +movl -8(%ebp),%edi +leal yylstate,%esi +cmpl %esi,%edi +ja .LC100 +.LC105: +.LC98: +movl -16(%ebp),%edi +movsbl (,%edi),%esi +movl %esi,yyprevious +movl -8(%ebp),%esi +movl %esi,yylsp +leal yytext,%esi +subl %esi,%edi +leal 1(%edi),%edi +movl %edi,yyleng +movl yyleng,%edi +movb $0,yytext(%edi) +movl yyfnd,%edi +leal 4(%edi),%esi +movl %esi,yyfnd +movl (,%edi),%eax +jmp .LC34 +.LC96: +movl -16(%ebp),%edi +movsbl (,%edi),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC106 +decl yylineno +.LC106: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +.LC94: +movl -8(%ebp),%edi +leal -4(%edi),%esi +movl %esi,-8(%ebp) +leal yylstate,%esi +cmpl %esi,%edi +ja .LC93 +movsbl yytext,%edi +cmpl $0,%edi +jne .LC108 +leal yysbuf,%edi +movl %edi,yysptr +movl $0,%eax +jmp .LC34 +.LC108: +movl yysptr,%edi +leal yysbuf,%esi +cmpl %esi,%edi +jbe .LC118 +movl yysptr,%edi +leal -1(%edi),%edi +movl %edi,yysptr +movsbl (,%edi),%edi +movl %edi,-40(%ebp) +jmp .LC119 +.LC118: +movl yyin,%edi +movl 4(%edi),%esi +movl 8(%edi),%edi +cmpl %edi,%esi +jb .LC120 +pushl yyin +call __uflow +addl $4,%esp +movl %eax,%edi +movl %edi,-44(%ebp) +jmp .LC121 +.LC120: +movl yyin,%edi +leal 4(%edi),%edi +movl (,%edi),%esi +leal 1(%esi),%ebx +movl %ebx,(,%edi) +movb (,%esi),%bl +movzbl %bl,%edi +movl %edi,-44(%ebp) +.LC121: +movl -44(%ebp),%edi +movl %edi,-40(%ebp) +.LC119: +movl -40(%ebp),%edi +movl %edi,yytchar +cmpl $10,%edi +jne .LC116 +incl yylineno +movl yytchar,%edi +movl %edi,-36(%ebp) +jmp .LC117 +.LC116: +movl yytchar,%edi +movl %edi,-36(%ebp) +.LC117: +cmpl $-1,-36(%ebp) +jne .LC114 +movl $0,-32(%ebp) +jmp .LC115 +.LC114: +movl yytchar,%edi +movl %edi,-32(%ebp) +.LC115: +movl -32(%ebp),%edi +movl %edi,%ebx +movb %bl,yytext +movsbl %bl,%edi +movl %edi,yyprevious +cmpl $0,yyprevious +jle .LC122 +movl yyout,%edi +movl 20(%edi),%esi +movl 24(%edi),%edi +cmpl %edi,%esi +jb .LC125 +movl yyprevious,%edi +movl %edi,%ebx +movzbl %bl,%edi +pushl %edi +pushl yyout +call __overflow +addl $8,%esp +jmp .LC126 +.LC125: +movl yyout,%edi +leal 20(%edi),%edi +movl (,%edi),%esi +leal 1(%esi),%ebx +movl %ebx,(,%edi) +movl yyprevious,%edi +movl %edi,%ebx +movb %bl,(,%esi) +.LC126: +.LC122: +leal yytext,%edi +movl %edi,-16(%ebp) +jmp .LC37 +.LC34: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf127: +.size yylook,.Lf127-yylook +.globl yyback +.align 16 +.type yyback,@function +yyback: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +cmpl $0,%edi +jne .LC132 +movl $0,%eax +jmp .LC128 +.LC131: +movl 20(%ebp),%edi +leal 4(%edi),%esi +movl %esi,20(%ebp) +movl 24(%ebp),%esi +cmpl %esi,(,%edi) +jne .LC134 +movl $1,%eax +jmp .LC128 +.LC134: +.LC132: +movl 20(%ebp),%edi +cmpl $0,(,%edi) +jne .LC131 +movl $0,%eax +.LC128: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf136: +.size yyback,.Lf136-yyback +.globl yyinput +.align 16 +.type yyinput,@function +yyinput: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $16,%esp +movl yysptr,%edi +leal yysbuf,%esi +cmpl %esi,%edi +jbe .LC146 +movl yysptr,%edi +leal -1(%edi),%edi +movl %edi,yysptr +movsbl (,%edi),%edi +movl %edi,-12(%ebp) +jmp .LC147 +.LC146: +movl yyin,%edi +movl 4(%edi),%esi +movl 8(%edi),%edi +cmpl %edi,%esi +jb .LC148 +pushl yyin +call __uflow +addl $4,%esp +movl %eax,%edi +movl %edi,-16(%ebp) +jmp .LC149 +.LC148: +movl yyin,%edi +leal 4(%edi),%edi +movl (,%edi),%esi +leal 1(%esi),%ebx +movl %ebx,(,%edi) +movb (,%esi),%bl +movzbl %bl,%edi +movl %edi,-16(%ebp) +.LC149: +movl -16(%ebp),%edi +movl %edi,-12(%ebp) +.LC147: +movl -12(%ebp),%edi +movl %edi,yytchar +cmpl $10,%edi +jne .LC144 +incl yylineno +movl yytchar,%edi +movl %edi,-8(%ebp) +jmp .LC145 +.LC144: +movl yytchar,%edi +movl %edi,-8(%ebp) +.LC145: +cmpl $-1,-8(%ebp) +jne .LC142 +movl $0,-4(%ebp) +jmp .LC143 +.LC142: +movl yytchar,%edi +movl %edi,-4(%ebp) +.LC143: +movl -4(%ebp),%eax +.LC137: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf150: +.size yyinput,.Lf150-yyinput +.globl yyoutput +.align 16 +.type yyoutput,@function +yyoutput: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl yyout,%edi +movl 20(%edi),%esi +movl 24(%edi),%edi +cmpl %edi,%esi +jb .LC153 +movl 20(%ebp),%edi +movl %edi,%ebx +movzbl %bl,%edi +pushl %edi +pushl yyout +call __overflow +addl $8,%esp +jmp .LC154 +.LC153: +movl yyout,%edi +leal 20(%edi),%edi +movl (,%edi),%esi +leal 1(%esi),%ebx +movl %ebx,(,%edi) +movl 20(%ebp),%edi +movl %edi,%ebx +movb %bl,(,%esi) +.LC154: +movl $0,%eax +.LC151: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf155: +.size yyoutput,.Lf155-yyoutput +.globl yyunput +.align 16 +.type yyunput,@function +yyunput: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl 20(%ebp),%edi +movl %edi,yytchar +cmpl $10,yytchar +jne .LC157 +decl yylineno +.LC157: +movl yysptr,%edi +leal 1(%edi),%esi +movl %esi,yysptr +movl yytchar,%esi +movl %esi,%ebx +movb %bl,(,%edi) +movl $0,%eax +.LC156: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf159: +.size yyunput,.Lf159-yyunput +.globl main +.align 16 +.type main,@function +main: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +call yyparse +movl $0,%eax +.LC160: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf161: +.size main,.Lf161-main +.globl yyerror +.align 16 +.type yyerror,@function +yyerror: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +pushl 20(%ebp) +pushl $.LC163 +call printf +addl $8,%esp +movl $0,%eax +.LC162: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf164: +.size yyerror,.Lf164-yyerror +.data +.globl yyexca +.align 2 +.type yyexca,@object +yyexca: +.word -1 +.word 1 +.word 0 +.word -1 +.word -2 +.word 0 +.size yyexca,12 +.globl yyact +.align 2 +.type yyact,@object +yyact: +.word 12 +.word 2 +.word 9 +.word 8 +.word 17 +.word 11 +.word 25 +.word 17 +.word 15 +.word 18 +.word 16 +.word 10 +.word 18 +.word 17 +.word 15 +.word 7 +.word 16 +.word 13 +.word 18 +.word 5 +.word 3 +.word 1 +.word 0 +.word 19 +.word 20 +.word 0 +.word 0 +.word 21 +.word 22 +.word 23 +.word 24 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 6 +.word 14 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 4 +.word 6 +.size yyact,498 +.globl yypact +.align 2 +.type yypact,@object +yypact: +.word -1000 +.word -9 +.word -1000 +.word 5 +.word -7 +.word -59 +.word -1000 +.word -1000 +.word -1000 +.word -40 +.word -29 +.word -40 +.word -40 +.word -1000 +.word -1000 +.word -40 +.word -40 +.word -40 +.word -40 +.word -38 +.word -35 +.word -38 +.word -38 +.word -1000 +.word -1000 +.word -1000 +.size yypact,52 +.globl yypgo +.align 2 +.type yypgo,@object +yypgo: +.word 0 +.word 21 +.word 20 +.word 17 +.word 11 +.size yypgo,10 +.globl yyr1 +.align 2 +.type yyr1,@object +yyr1: +.word 0 +.word 1 +.word 1 +.word 1 +.word 1 +.word 2 +.word 4 +.word 4 +.word 4 +.word 4 +.word 4 +.word 4 +.word 4 +.word 4 +.word 3 +.size yyr1,30 +.globl yyr2 +.align 2 +.type yyr2,@object +yyr2: +.word 0 +.word 0 +.word 2 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 2 +.word 3 +.word 1 +.word 1 +.word 1 +.size yyr2,30 +.globl yychk +.align 2 +.type yychk,@object +yychk: +.word -1000 +.word -1 +.word 10 +.word -2 +.word 256 +.word -3 +.word 257 +.word 10 +.word 10 +.word 61 +.word -4 +.word 45 +.word 40 +.word -3 +.word 258 +.word 43 +.word 45 +.word 42 +.word 47 +.word -4 +.word -4 +.word -4 +.word -4 +.word -4 +.word -4 +.word 41 +.size yychk,52 +.globl yydef +.align 2 +.type yydef,@object +yydef: +.word 1 +.word -2 +.word 2 +.word 0 +.word 0 +.word 0 +.word 14 +.word 3 +.word 4 +.word 0 +.word 5 +.word 0 +.word 0 +.word 12 +.word 13 +.word 0 +.word 0 +.word 0 +.word 0 +.word 10 +.word 0 +.word 6 +.word 7 +.word 8 +.word 9 +.word 11 +.size yydef,52 +.globl yychar +.align 4 +.type yychar,@object +.size yychar,4 +yychar: +.long -1 +.globl yynerrs +.align 4 +.type yynerrs,@object +.size yynerrs,4 +yynerrs: +.long 0 +.globl yyerrflag +.align 2 +.type yyerrflag,@object +.size yyerrflag,2 +yyerrflag: +.word 0 +.globl yyparse +.text +.align 16 +.type yyparse,@function +yyparse: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +subl $332,%esp +movw $0,-6(%ebp) +movl $-1,yychar +movl $0,yynerrs +movw $0,yyerrflag +leal -328(%ebp),%edi +movl %edi,-12(%ebp) +leal yyv-4,%edi +movl %edi,-20(%ebp) +.LC168: +movl -12(%ebp),%edi +leal 2(%edi),%edi +movl %edi,-12(%ebp) +leal -26(%ebp),%esi +cmpl %esi,%edi +jbe .LC169 +pushl $.LC172 +call yyerror +addl $4,%esp +movl $1,%eax +jmp .LC165 +.LC169: +movl -12(%ebp),%edi +movw -6(%ebp),%si +movw %si,(,%edi) +movl -20(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-20(%ebp) +movl -20(%ebp),%edi +movl yyval,%esi +movl %esi,(,%edi) +.LC173: +movswl -6(%ebp),%edi +movw yypact(,%edi,2),%di +movw %di,-14(%ebp) +movswl -14(%ebp),%edi +cmpl $-1000,%edi +jg .LC174 +jmp .LC176 +.LC174: +cmpl $0,yychar +jge .LC177 +call yylex +movl %eax,yychar +cmpl $0,%eax +jge .LC179 +movl $0,yychar +.LC179: +.LC177: +movswl -14(%ebp),%edi +movl yychar,%esi +leal (%esi,%edi),%edi +movw %di,-14(%ebp) +movswl %di,%edi +cmpl $0,%edi +jl .LC183 +movswl -14(%ebp),%edi +cmpl $249,%edi +jl .LC181 +.LC183: +jmp .LC176 +.LC181: +movswl -14(%ebp),%edi +movw yyact(,%edi,2),%di +movw %di,-14(%ebp) +movswl %di,%edi +movswl yychk(,%edi,2),%edi +cmpl yychar,%edi +jne .LC184 +movl $-1,yychar +movl yylval,%edi +movl %edi,yyval +movw -14(%ebp),%di +movw %di,-6(%ebp) +movswl yyerrflag,%edi +cmpl $0,%edi +jle .LC168 +movswl yyerrflag,%edi +subl $1,%edi +movw %di,yyerrflag +jmp .LC168 +.LC184: +.LC176: +movswl -6(%ebp),%edi +movw yydef(,%edi,2),%di +movw %di,-14(%ebp) +movswl %di,%edi +cmpl $-2,%edi +jne .LC188 +cmpl $0,yychar +jge .LC190 +call yylex +movl %eax,yychar +cmpl $0,%eax +jge .LC192 +movl $0,yychar +.LC192: +.LC190: +leal yyexca,%edi +movl %edi,-24(%ebp) +jmp .LC197 +.LC194: +.LC195: +movl -24(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-24(%ebp) +.LC197: +movl -24(%ebp),%edi +movswl (,%edi),%esi +cmpl $-1,%esi +jne .LC194 +movswl 2(%edi),%edi +movswl -6(%ebp),%esi +cmpl %esi,%edi +jne .LC194 +jmp .LC199 +.LC198: +movl -24(%ebp),%edi +movswl (,%edi),%edi +cmpl yychar,%edi +jne .LC201 +jmp .LC200 +.LC201: +.LC199: +movl -24(%ebp),%edi +leal 4(%edi),%edi +movl %edi,-24(%ebp) +movswl (,%edi),%edi +cmpl $0,%edi +jge .LC198 +.LC200: +movl -24(%ebp),%edi +movw 2(%edi),%di +movw %di,-14(%ebp) +movswl %di,%edi +cmpl $0,%edi +jge .LC203 +movl $0,%eax +jmp .LC165 +.LC203: +.LC188: +movswl -14(%ebp),%edi +cmpl $0,%edi +jne .LC205 +movswl yyerrflag,%edi +movl %edi,-332(%ebp) +movl -332(%ebp),%edi +cmpl $0,%edi +jl .LC207 +cmpl $3,%edi +jg .LC207 +jmp *.LC223(,%edi,4) +.data +.align 4 +.LC223: +.long .LC210 +.long .LC213 +.long .LC213 +.long .LC220 +.text +.LC210: +pushl $.LC211 +call yyerror +addl $4,%esp +.LC212: +incl yynerrs +.LC213: +movw $3,yyerrflag +jmp .LC215 +.LC214: +movl -12(%ebp),%edi +movswl (,%edi),%edi +movswl yypact(,%edi,2),%edi +leal 256(%edi),%edi +movw %di,-14(%ebp) +movswl -14(%ebp),%edi +cmpl $0,%edi +jl .LC217 +cmpl $249,%edi +jge .LC217 +movswl yyact(,%edi,2),%edi +movswl yychk(,%edi,2),%edi +cmpl $256,%edi +jne .LC217 +movswl -14(%ebp),%edi +movw yyact(,%edi,2),%di +movw %di,-6(%ebp) +jmp .LC168 +.LC217: +movl -12(%ebp),%edi +movswl (,%edi),%esi +movw yypact(,%esi,2),%si +movw %si,-14(%ebp) +leal -2(%edi),%edi +movl %edi,-12(%ebp) +movl -20(%ebp),%edi +leal -4(%edi),%edi +movl %edi,-20(%ebp) +.LC215: +movl -12(%ebp),%edi +leal -326(%ebp),%esi +cmpl %esi,%edi +jae .LC214 +.LC219: +movl $1,%eax +jmp .LC165 +.LC220: +cmpl $0,yychar +jne .LC221 +jmp .LC219 +.LC221: +movl $-1,yychar +jmp .LC173 +.LC207: +.LC205: +movw -14(%ebp),%di +movswl %di,%esi +leal (,%esi,2),%esi +leal yyr2(%esi),%ebx +movl -12(%ebp),%edx +movswl (,%ebx),%ecx +leal (,%ecx,2),%ecx +subl %ecx,%edx +movl %edx,-12(%ebp) +movl -20(%ebp),%edx +movl %edx,-4(%ebp) +movswl (,%ebx),%ebx +leal (,%ebx,4),%ebx +subl %ebx,%edx +movl %edx,-20(%ebp) +movl -20(%ebp),%ebx +movl 4(%ebx),%ebx +movl %ebx,yyval +movw %di,-328(%ebp) +movw yyr1(%esi),%di +movw %di,-14(%ebp) +movswl -14(%ebp),%edi +movswl yypgo(,%edi,2),%edi +movl -12(%ebp),%esi +movswl (,%esi),%esi +leal (%esi,%edi),%edi +leal 1(%edi),%edi +movw %di,-26(%ebp) +movswl -26(%ebp),%edi +cmpl $249,%edi +jge .LC226 +movw yyact(,%edi,2),%di +movw %di,-6(%ebp) +movswl %di,%edi +movswl yychk(,%edi,2),%edi +movswl -14(%ebp),%esi +negl %esi +cmpl %esi,%edi +je .LC224 +.LC226: +movswl -14(%ebp),%edi +movswl yypgo(,%edi,2),%edi +movw yyact(,%edi,2),%di +movw %di,-6(%ebp) +.LC224: +movswl -328(%ebp),%edi +movl %edi,-332(%ebp) +movl -332(%ebp),%edi +cmpl $4,%edi +jl .LC168 +cmpl $14,%edi +jg .LC168 +jmp *.LC248-16(,%edi,4) +.data +.align 4 +.LC248: +.long .LC230 +.long .LC231 +.long .LC233 +.long .LC235 +.long .LC237 +.long .LC239 +.long .LC241 +.long .LC168 +.long .LC243 +.long .LC245 +.long .LC247 +.text +.LC230: +movw $0,yyerrflag +jmp .LC168 +.LC231: +pushl $.LC232 +call printf +addl $4,%esp +jmp .LC168 +.LC233: +pushl $.LC234 +call printf +addl $4,%esp +jmp .LC168 +.LC235: +pushl $.LC236 +call printf +addl $4,%esp +jmp .LC168 +.LC237: +pushl $.LC238 +call printf +addl $4,%esp +jmp .LC168 +.LC239: +pushl $.LC240 +call printf +addl $4,%esp +jmp .LC168 +.LC241: +pushl $.LC242 +call printf +addl $4,%esp +jmp .LC168 +.LC243: +pushl $.LC244 +call printf +addl $4,%esp +jmp .LC168 +.LC245: +pushl $yytext +pushl $.LC246 +call printf +addl $8,%esp +jmp .LC168 +.LC247: +pushl $yytext +pushl $.LC163 +call printf +addl $8,%esp +jmp .LC168 +.LC165: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf250: +.size yyparse,.Lf250-yyparse +.globl yywrap +.align 16 +.type yywrap,@function +yywrap: +pushl %ebp +pushl %ebx +pushl %esi +pushl %edi +movl %esp,%ebp +movl $1,%eax +.LC251: +movl %ebp,%esp +popl %edi +popl %esi +popl %ebx +popl %ebp +ret +.Lf252: +.size yywrap,.Lf252-yywrap +.bss +.globl yyv +.align 4 +.type yyv,@object +.size yyv,600 +.comm yyv,600 +.globl yyfnd +.align 4 +.type yyfnd,@object +.size yyfnd,4 +.comm yyfnd,4 +.globl yyolsp +.align 4 +.type yyolsp,@object +.size yyolsp,4 +.comm yyolsp,4 +.globl yylsp +.align 4 +.type yylsp,@object +.size yylsp,4 +.comm yylsp,4 +.globl yylstate +.align 4 +.type yylstate,@object +.size yylstate,800 +.comm yylstate,800 +.globl yyestate +.align 4 +.type yyestate,@object +.size yyestate,4 +.comm yyestate,4 +.globl yytchar +.align 4 +.type yytchar,@object +.size yytchar,4 +.comm yytchar,4 +.globl yysbuf +.align 1 +.type yysbuf,@object +.size yysbuf,200 +.comm yysbuf,200 +.globl yymorfg +.align 4 +.type yymorfg,@object +.size yymorfg,4 +.comm yymorfg,4 +.globl yytext +.align 1 +.type yytext,@object +.size yytext,200 +.comm yytext,200 +.globl yyleng +.align 4 +.type yyleng,@object +.size yyleng,4 +.comm yyleng,4 +.globl yyval +.align 4 +.type yyval,@object +.size yyval,4 +.comm yyval,4 +.globl yylval +.align 4 +.type yylval,@object +.size yylval,4 +.comm yylval,4 +.data +.align 1 +.LC246: +.byte 112 +.byte 117 +.byte 115 +.byte 104 +.byte 32 +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC244: +.byte 108 +.byte 111 +.byte 97 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC242: +.byte 110 +.byte 101 +.byte 103 +.byte 97 +.byte 116 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC240: +.byte 100 +.byte 105 +.byte 118 +.byte 105 +.byte 100 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC238: +.byte 109 +.byte 117 +.byte 108 +.byte 116 +.byte 105 +.byte 112 +.byte 108 +.byte 121 +.byte 10 +.byte 0 +.align 1 +.LC236: +.byte 110 +.byte 101 +.byte 103 +.byte 97 +.byte 116 +.byte 101 +.byte 10 +.byte 97 +.byte 100 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC234: +.byte 97 +.byte 100 +.byte 100 +.byte 10 +.byte 0 +.align 1 +.LC232: +.byte 115 +.byte 116 +.byte 111 +.byte 114 +.byte 101 +.byte 10 +.byte 0 +.align 1 +.LC211: +.byte 115 +.byte 121 +.byte 110 +.byte 116 +.byte 97 +.byte 120 +.byte 32 +.byte 101 +.byte 114 +.byte 114 +.byte 111 +.byte 114 +.byte 0 +.align 1 +.LC172: +.byte 121 +.byte 97 +.byte 99 +.byte 99 +.byte 32 +.byte 115 +.byte 116 +.byte 97 +.byte 99 +.byte 107 +.byte 32 +.byte 111 +.byte 118 +.byte 101 +.byte 114 +.byte 102 +.byte 108 +.byte 111 +.byte 119 +.byte 0 +.align 1 +.LC163: +.byte 37 +.byte 115 +.byte 10 +.byte 0 +.align 1 +.LC16: +.byte 98 +.byte 97 +.byte 100 +.byte 32 +.byte 115 +.byte 119 +.byte 105 +.byte 116 +.byte 99 +.byte 104 +.byte 32 +.byte 121 +.byte 121 +.byte 108 +.byte 111 +.byte 111 +.byte 107 +.byte 32 +.byte 37 +.byte 100 +.byte 0 +.text +.ident "LCC: 4.1" diff --git a/quake3/source/lcc/x86/win32/tst/8q.1bk b/quake3/source/lcc/x86/win32/tst/8q.1bk new file mode 100644 index 0000000..c66df8e --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/8q.1bk @@ -0,0 +1,92 @@ +1 5 8 6 3 7 2 4 +1 6 8 3 7 4 2 5 +1 7 4 6 8 2 5 3 +1 7 5 8 2 4 6 3 +2 4 6 8 3 1 7 5 +2 5 7 1 3 8 6 4 +2 5 7 4 1 8 6 3 +2 6 1 7 4 8 3 5 +2 6 8 3 1 4 7 5 +2 7 3 6 8 5 1 4 +2 7 5 8 1 4 6 3 +2 8 6 1 3 5 7 4 +3 1 7 5 8 2 4 6 +3 5 2 8 1 7 4 6 +3 5 2 8 6 4 7 1 +3 5 7 1 4 2 8 6 +3 5 8 4 1 7 2 6 +3 6 2 5 8 1 7 4 +3 6 2 7 1 4 8 5 +3 6 2 7 5 1 8 4 +3 6 4 1 8 5 7 2 +3 6 4 2 8 5 7 1 +3 6 8 1 4 7 5 2 +3 6 8 1 5 7 2 4 +3 6 8 2 4 1 7 5 +3 7 2 8 5 1 4 6 +3 7 2 8 6 4 1 5 +3 8 4 7 1 6 2 5 +4 1 5 8 2 7 3 6 +4 1 5 8 6 3 7 2 +4 2 5 8 6 1 3 7 +4 2 7 3 6 8 1 5 +4 2 7 3 6 8 5 1 +4 2 7 5 1 8 6 3 +4 2 8 5 7 1 3 6 +4 2 8 6 1 3 5 7 +4 6 1 5 2 8 3 7 +4 6 8 2 7 1 3 5 +4 6 8 3 1 7 5 2 +4 7 1 8 5 2 6 3 +4 7 3 8 2 5 1 6 +4 7 5 2 6 1 3 8 +4 7 5 3 1 6 8 2 +4 8 1 3 6 2 7 5 +4 8 1 5 7 2 6 3 +4 8 5 3 1 7 2 6 +5 1 4 6 8 2 7 3 +5 1 8 4 2 7 3 6 +5 1 8 6 3 7 2 4 +5 2 4 6 8 3 1 7 +5 2 4 7 3 8 6 1 +5 2 6 1 7 4 8 3 +5 2 8 1 4 7 3 6 +5 3 1 6 8 2 4 7 +5 3 1 7 2 8 6 4 +5 3 8 4 7 1 6 2 +5 7 1 3 8 6 4 2 +5 7 1 4 2 8 6 3 +5 7 2 4 8 1 3 6 +5 7 2 6 3 1 4 8 +5 7 2 6 3 1 8 4 +5 7 4 1 3 8 6 2 +5 8 4 1 3 6 2 7 +5 8 4 1 7 2 6 3 +6 1 5 2 8 3 7 4 +6 2 7 1 3 5 8 4 +6 2 7 1 4 8 5 3 +6 3 1 7 5 8 2 4 +6 3 1 8 4 2 7 5 +6 3 1 8 5 2 4 7 +6 3 5 7 1 4 2 8 +6 3 5 8 1 4 2 7 +6 3 7 2 4 8 1 5 +6 3 7 2 8 5 1 4 +6 3 7 4 1 8 2 5 +6 4 1 5 8 2 7 3 +6 4 2 8 5 7 1 3 +6 4 7 1 3 5 2 8 +6 4 7 1 8 2 5 3 +6 8 2 4 1 7 5 3 +7 1 3 8 6 4 2 5 +7 2 4 1 8 5 3 6 +7 2 6 3 1 4 8 5 +7 3 1 6 8 5 2 4 +7 3 8 2 5 1 6 4 +7 4 2 5 8 1 3 6 +7 4 2 8 6 1 3 5 +7 5 3 1 6 8 2 4 +8 2 4 1 7 5 3 6 +8 2 5 3 1 7 4 6 +8 3 1 6 2 5 7 4 +8 4 1 3 6 2 7 5 diff --git a/quake3/source/lcc/x86/win32/tst/8q.2bk b/quake3/source/lcc/x86/win32/tst/8q.2bk new file mode 100644 index 0000000..fb28350 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/8q.2bk @@ -0,0 +1,2 @@ +tst/8q.c:30: warning: missing return value +tst/8q.c:39: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/8q.sbk b/quake3/source/lcc/x86/win32/tst/8q.sbk new file mode 100644 index 0000000..85cce1a --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/8q.sbk @@ -0,0 +1,176 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],0 +L2: +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*4] +mov dword ptr (_down)[edi],1 +mov dword ptr (_up)[edi],1 +L3: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],15 +jl L2 +mov dword ptr (-4)[ebp],0 +L6: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (_rows)[edi*4],1 +L7: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],8 +jl L6 +push 0 +call _queens +add esp,4 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _queens +_queens: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],0 +L11: +mov edi,dword ptr (-4)[ebp] +cmp dword ptr (_rows)[edi*4],0 +je L15 +mov esi,dword ptr (20)[ebp] +mov ebx,edi +sub ebx,esi +cmp dword ptr (_up+28)[ebx*4],0 +je L15 +lea edi,[esi][edi] +cmp dword ptr (_down)[edi*4],0 +je L15 +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (20)[ebp] +lea ebx,[esi][edi] +mov dword ptr (_down)[ebx*4],0 +mov ebx,edi +sub ebx,esi +mov dword ptr (_up+28)[ebx*4],0 +mov dword ptr (_rows)[edi*4],0 +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr (-4)[ebp] +mov dword ptr (_x)[edi*4],esi +cmp dword ptr (20)[ebp],7 +jne L19 +call _print +add esp,0 +jmp L20 +L19: +mov edi,dword ptr (20)[ebp] +lea edi,(1)[edi] +push edi +call _queens +add esp,4 +L20: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (20)[ebp] +lea ebx,[esi][edi] +mov dword ptr (_down)[ebx*4],1 +mov ebx,edi +sub ebx,esi +mov dword ptr (_up+28)[ebx*4],1 +mov dword ptr (_rows)[edi*4],1 +L15: +L12: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],8 +jl L11 +mov eax,0 +L10: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _print +_print: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],0 +L23: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr (_x)[edi*4] +lea edi,(49)[edi] +push edi +lea edi,(L27) +push edi +call _printf +add esp,8 +L24: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],8 +jl L23 +lea edi,(L28) +push edi +call _printf +add esp,4 +mov eax,0 +L22: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_DATA segment +public _x +align 4 +_x label byte +db 32 dup (0) +public _rows +align 4 +_rows label byte +db 32 dup (0) +public _down +align 4 +_down label byte +db 60 dup (0) +public _up +align 4 +_up label byte +db 60 dup (0) +_DATA ends +_TEXT segment +align 1 +L28 label byte +db 10 +db 0 +align 1 +L27 label byte +db 37 +db 99 +db 32 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/array.1bk b/quake3/source/lcc/x86/win32/tst/array.1bk new file mode 100644 index 0000000..e188568 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/array.1bk @@ -0,0 +1,4 @@ + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 + 0 1 2 3 1000 1001 1002 1003 2000 2001 2002 2003 diff --git a/quake3/source/lcc/x86/win32/tst/array.2bk b/quake3/source/lcc/x86/win32/tst/array.2bk new file mode 100644 index 0000000..0a9b206 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/array.2bk @@ -0,0 +1,2 @@ +tst/array.c:33: warning: missing return value +tst/array.c:48: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/array.sbk b/quake3/source/lcc/x86/win32/tst/array.sbk new file mode 100644 index 0000000..a89f3c7 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/array.sbk @@ -0,0 +1,240 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,60 +mov dword ptr (-8)[ebp],0 +L2: +mov dword ptr (-4)[ebp],0 +L6: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +mov ebx,esi +sal ebx,4 +imul esi,esi,1000 +lea esi,[edi][esi] +mov dword ptr (_x)[ebx][edi*4],esi +L7: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],4 +jl L6 +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sal esi,4 +lea esi,(_x)[esi] +mov dword ptr (_y)[edi*4],esi +L3: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L2 +call _f +add esp,0 +mov dword ptr (-8)[ebp],0 +L10: +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sal esi,4 +lea esi,(-60)[ebp][esi] +mov dword ptr (-12)[ebp],esi +mov dword ptr (_y)[edi*4],esi +mov dword ptr (-4)[ebp],0 +L14: +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*4] +mov esi,dword ptr (-12)[ebp] +mov ebx,dword ptr (-8)[ebp] +sal ebx,4 +mov ebx,dword ptr (_x)[ebx][edi] +mov dword ptr [esi][edi],ebx +L15: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],4 +jl L14 +L11: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L10 +lea edi,(_y) +push edi +lea edi,(-60)[ebp] +push edi +call _g +add esp,8 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f +_f: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov dword ptr (-8)[ebp],0 +L19: +mov dword ptr (-4)[ebp],0 +L23: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +sal esi,4 +mov edi,dword ptr (_x)[esi][edi*4] +push edi +lea edi,(L27) +push edi +call _printf +add esp,8 +L24: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],4 +jl L23 +L20: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L19 +lea edi,(L28) +push edi +call _printf +add esp,4 +mov dword ptr (-8)[ebp],0 +L29: +mov dword ptr (-4)[ebp],0 +L33: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +mov esi,dword ptr (_y)[esi*4] +mov edi,dword ptr [esi][edi*4] +push edi +lea edi,(L27) +push edi +call _printf +add esp,8 +L34: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],4 +jl L33 +L30: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L29 +lea edi,(L28) +push edi +call _printf +add esp,4 +mov eax,0 +L18: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _g +_g: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov dword ptr (-8)[ebp],0 +L38: +mov dword ptr (-4)[ebp],0 +L42: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +sal esi,4 +mov ebx,dword ptr (20)[ebp] +lea esi,[ebx][esi] +mov edi,dword ptr [esi][edi*4] +push edi +lea edi,(L27) +push edi +call _printf +add esp,8 +L43: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],4 +jl L42 +L39: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L38 +lea edi,(L28) +push edi +call _printf +add esp,4 +mov dword ptr (-8)[ebp],0 +L46: +mov dword ptr (-4)[ebp],0 +L50: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +mov ebx,dword ptr (24)[ebp] +mov esi,dword ptr [ebx][esi*4] +mov edi,dword ptr [esi][edi*4] +push edi +lea edi,(L27) +push edi +call _printf +add esp,8 +L51: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],4 +jl L50 +L47: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L46 +lea edi,(L28) +push edi +call _printf +add esp,4 +mov eax,0 +L37: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_DATA segment +public _y +align 4 +_y label byte +db 12 dup (0) +public _x +align 4 +_x label byte +db 48 dup (0) +_DATA ends +_TEXT segment +align 1 +L28 label byte +db 10 +db 0 +align 1 +L27 label byte +db 32 +db 37 +db 100 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/cf.1bk b/quake3/source/lcc/x86/win32/tst/cf.1bk new file mode 100644 index 0000000..24e21ba --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cf.1bk @@ -0,0 +1,51 @@ +char freq +011 8.1 +012 6.1 +040 11.9 +! 0.2 +" 1.5 +% 0.6 +& 0.4 +' 0.4 +( 2.9 +) 2.9 +* 0.8 ++ 1.3 +, 1.3 +- 0.4 +. 0.6 +/ 1.0 +0 2.5 +1 1.9 +2 0.6 +3 0.2 +7 0.4 +8 0.2 +; 3.8 +< 0.8 += 2.7 +> 0.2 +[ 1.5 +\ 0.8 +] 1.5 +a 3.1 +c 4.4 +e 2.3 +f 6.0 +g 1.3 +h 1.0 +i 5.0 +l 1.0 +m 0.2 +n 3.3 +o 2.1 +p 1.0 +q 0.4 +r 4.2 +s 0.6 +t 3.8 +u 1.2 +v 0.6 +w 0.2 +{ 0.6 +} 0.6 diff --git a/quake3/source/lcc/x86/win32/tst/cf.2bk b/quake3/source/lcc/x86/win32/tst/cf.2bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/win32/tst/cf.sbk b/quake3/source/lcc/x86/win32/tst/cf.sbk new file mode 100644 index 0000000..6fd654d --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cf.sbk @@ -0,0 +1,185 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,24 +cmp dword ptr (20)[ebp],1 +jg L2 +fld dword ptr (L4) +fstp dword ptr (-16)[ebp] +jmp L3 +L2: +mov edi,dword ptr (24)[ebp] +mov edi,dword ptr (4)[edi] +push edi +call _atof +add esp,4 +fstp dword ptr (-20)[ebp] +fld dword ptr (-20)[ebp] +fdiv dword ptr (L5) +fstp dword ptr (-16)[ebp] +L3: +mov dword ptr (-4)[ebp],0 +L6: +mov edi,dword ptr (-4)[ebp] +lea esi,(1)[edi] +mov dword ptr (-4)[ebp],esi +fld dword ptr (L4) +fstp dword ptr (_f)[edi*4] +L7: +cmp dword ptr (-4)[ebp],127 +jle L6 +mov dword ptr (-8)[ebp],0 +jmp L11 +L10: +mov edi,dword ptr (-12)[ebp] +lea edi,(_f)[edi*4] +fld dword ptr [edi] +fadd dword ptr (L13) +fstp dword ptr [edi] +inc dword ptr (-8)[ebp] +L11: +call _getchar +add esp,0 +mov dword ptr (-12)[ebp],eax +cmp eax,-1 +jne L10 +lea edi,(L14) +push edi +call _printf +add esp,4 +mov dword ptr (-4)[ebp],0 +L15: +mov edi,dword ptr (-4)[ebp] +fld dword ptr (_f)[edi*4] +fstp dword ptr (-24)[ebp] +fld dword ptr (L4) +fcomp dword ptr (-24)[ebp] +fstsw ax +sahf +je L19 +fld dword ptr (-24)[ebp] +mov edi,dword ptr (-8)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fld dword ptr (-16)[ebp] +fcompp +fstsw ax +sahf +ja L19 +cmp dword ptr (-4)[ebp],32 +jg L21 +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L23) +push edi +call _printf +add esp,8 +jmp L22 +L21: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L24) +push edi +call _printf +add esp,8 +L22: +fld dword ptr (L5) +mov edi,dword ptr (-4)[ebp] +fmul dword ptr (_f)[edi*4] +mov edi,dword ptr (-8)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +sub esp,8 +fstp qword ptr [esp] +lea edi,(L25) +push edi +call _printf +add esp,12 +L19: +L16: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],127 +jle L15 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +extrn _getchar:near +_TEXT segment +_TEXT ends +extrn _atof:near +_TEXT segment +_TEXT ends +_DATA segment +public _f +align 4 +_f label byte +db 512 dup (0) +_DATA ends +_TEXT segment +align 1 +L25 label byte +db 9 +db 37 +db 46 +db 49 +db 102 +db 10 +db 0 +align 1 +L24 label byte +db 37 +db 99 +db 0 +align 1 +L23 label byte +db 37 +db 48 +db 51 +db 111 +db 0 +align 1 +L14 label byte +db 99 +db 104 +db 97 +db 114 +db 9 +db 102 +db 114 +db 101 +db 113 +db 10 +db 0 +align 4 +L13 label byte +dd 03f800000H +align 4 +L5 label byte +dd 042c80000H +align 4 +L4 label byte +dd 00H +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/cq.1bk b/quake3/source/lcc/x86/win32/tst/cq.1bk new file mode 100644 index 0000000..9ea7979 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cq.1bk @@ -0,0 +1,48 @@ +Section s22 returned 0. +Decimal and octal/hex constants sometimes give + different results when assigned to longs. +Decimal and octal/hex constants sometimes give + different results when assigned to longs. +Section s241 returned 0. +Section s243 returned 0. +Section s244 returned 0. +Section s25 returned 0. + 8 bits in chars. + 32 bits in ints. + 16 bits in shorts. + 32 bits in longs. + 32 bits in unsigneds. + 32 bits in floats. + 64 bits in doubles. +1.192093e-007 is the least number that can be added to 1. (float). +2.220446e-016 is the least number that can be added to 1. (double). +Section s26 returned 0. +Section s4 returned 0. +Section s61 returned 0. +Section s626 returned 0. +Section s71 returned 0. +Section s72 returned 0. +Section s757 returned 0. +Section s7813 returned 0. +Section s714 returned 0. +Section s715 returned 0. +Register count for char is unreliable. +Register count for pointer is unreliable. +Register count for int is unreliable. +Section s81 returned 0. +Section s84 returned 0. +char alignment: 1 +short alignment: 2 +int alignment: 4 +long alignment: 4 +unsigned alignment: 4 +float alignment: 4 +double alignment: 4 +Sign extension in fields +Be especially careful with 1-bit fields! +Section s85 returned 0. +Section s86 returned 0. +Section s88 returned 0. +Section s9 returned 0. + +No errors detected. diff --git a/quake3/source/lcc/x86/win32/tst/cq.2bk b/quake3/source/lcc/x86/win32/tst/cq.2bk new file mode 100644 index 0000000..295f5b6 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cq.2bk @@ -0,0 +1,25 @@ +tst/cq.c:394: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:394: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:394: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:395: warning: overflow in constant `4294967296' +tst/cq.c:395: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:395: warning: overflow in constant `040000000000' +tst/cq.c:395: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:395: warning: overflow in constant `0x100000000' +tst/cq.c:395: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:396: warning: overflow in constant `68719476735' +tst/cq.c:396: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:396: warning: overflow in constant `0777777777777' +tst/cq.c:396: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:396: warning: overflow in constant `0xfffffffff' +tst/cq.c:396: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:397: warning: overflow in constant `68719476736' +tst/cq.c:397: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:397: warning: overflow in constant `01000000000000' +tst/cq.c:397: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:397: warning: overflow in constant `0x1000000000' +tst/cq.c:397: warning: overflow in converting constant expression from `unsigned long' to `long int' +tst/cq.c:533: warning: missing return value +tst/cq.c:1169: warning: missing return value +tst/cq.c:5294: warning: unreachable code +tst/cq.c:5303: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/cq.sbk b/quake3/source/lcc/x86/win32/tst/cq.sbk new file mode 100644 index 0000000..a9726b9 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cq.sbk @@ -0,0 +1,16642 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +align 4 +L2 label byte +dd _s22 +dd _s241 +dd _s243 +dd _s244 +dd _s25 +dd _s26 +dd _s4 +dd _s61 +dd _s626 +dd _s71 +dd _s72 +dd _s757 +dd _s7813 +dd _s714 +dd _s715 +dd _s81 +dd _s84 +dd _s85 +dd _s86 +dd _s88 +dd _s9 +_DATA ends +_DATA segment +align 4 +L3 label byte +db 68 dup (0) +align 4 +L4 label byte +db 4 dup (0) +public _main +_DATA ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (L3+36),1 +mov dword ptr (L3+40),1 +mov dword ptr (L3+44),1 +mov dword ptr (L3+48),1 +lea edi,(L3) +mov dword ptr (L4),edi +mov dword ptr (-4)[ebp],0 +jmp L12 +L9: +mov edi,dword ptr (L4) +push edi +mov edi,dword ptr (-4)[ebp] +call dword ptr (L2)[edi*4] +add esp,4 +mov dword ptr (L3+52),eax +mov edi,dword ptr (L3+56) +mov esi,dword ptr (L3+52) +lea edi,[esi][edi] +mov dword ptr (L3+56),edi +cmp dword ptr (L3+36),0 +je L17 +mov edi,dword ptr (L3+52) +push edi +lea edi,(L3+60) +push edi +lea edi,(L20) +push edi +call _printf +add esp,12 +L17: +L10: +inc dword ptr (-4)[ebp] +L12: +mov edi,dword ptr (-4)[ebp] +cmp edi,21 +jb L9 +cmp dword ptr (L3+56),0 +jne L23 +lea edi,(L26) +push edi +call _printf +add esp,4 +jmp L24 +L23: +lea edi,(L27) +push edi +call _printf +add esp,4 +L24: +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L29 label byte +db 115 +db 50 +db 50 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L30 label byte +db 115 +db 50 +db 50 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s22 +_DATA ends +_TEXT segment +_s22: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,32 +mov dword ptr (-12)[ebp],0 +lea edi,(L30) +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-8)[ebp],edi +L31: +L32: +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-4)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-4)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L31 +mov dword ptr (-16)[ebp],1 +mov dword ptr (-24)[ebp],2 +mov dword ptr (-28)[ebp],3 +mov dword ptr (-20)[ebp],4 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-24)[ebp] +lea edi,[esi][edi] +mov esi,dword ptr (-28)[ebp] +lea edi,[esi][edi] +mov esi,dword ptr (-20)[ebp] +lea edi,[esi][edi] +cmp edi,10 +je L34 +inc dword ptr (-12)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L36 +push 1 +lea edi,(L29) +push edi +call _printf +add esp,8 +L36: +L34: +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-16)[ebp] +cmp dword ptr (-32)[ebp],edi +jne L38 +add dword ptr (-12)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L40 +push 4 +lea edi,(L29) +push edi +call _printf +add esp,8 +L40: +L38: +mov eax,dword ptr (-12)[ebp] +L28: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L43 label byte +db 115 +db 50 +db 52 +db 49 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L44 label byte +db 115 +db 50 +db 52 +db 49 +db 32 +db 32 +db 32 +db 0 +align 4 +L45 label byte +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 0 +dd 6 +dd 0 +dd 8 +dd 0 +dd 12 +dd 0 +dd 16 +dd 0 +dd 18 +dd 0 +dd 20 +dd 0 +dd 24 +dd 0 +dd 28 +dd 0 +dd 30 +dd 0 +dd 32 +dd 0 +dd 36 +public _s241 +_DATA ends +_TEXT segment +_s241: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,488 +mov dword ptr (-484)[ebp],0 +mov dword ptr (-488)[ebp],0 +lea edi,(L44) +mov dword ptr (-476)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-480)[ebp],edi +L46: +L47: +mov edi,dword ptr (-480)[ebp] +lea esi,(1)[edi] +mov dword ptr (-480)[ebp],esi +mov esi,dword ptr (-476)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-476)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L46 +jmp L49 +inc dword ptr (-484)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L51 +push 1 +lea edi,(L43) +push edi +call _printf +add esp,8 +L51: +L49: +jmp L53 +add dword ptr (-484)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L55 +push 2 +lea edi,(L43) +push edi +call _printf +add esp,8 +L55: +L53: +jmp L57 +add dword ptr (-484)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L59 +push 4 +lea edi,(L43) +push edi +call _printf +add esp,8 +L59: +L57: +jmp L61 +add dword ptr (-484)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L63 +push 8 +lea edi,(L43) +push edi +call _printf +add esp,8 +L63: +L61: +mov dword ptr (-4)[ebp],0 +L65: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (L45)[edi*4],edi +L66: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],17 +jl L65 +mov dword ptr (-4)[ebp],18 +L69: +mov edi,dword ptr (-4)[ebp] +lea edi,(L45)[edi*4] +mov esi,dword ptr [edi] +push esi +call _pow2 +add esp,4 +mov dword ptr [edi],eax +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*4] +mov esi,dword ptr (L45)[edi] +sub esi,1 +mov dword ptr (L45-4)[edi],esi +add dword ptr (-4)[ebp],2 +L70: +cmp dword ptr (-4)[ebp],39 +jl L69 +mov dword ptr (-160)[ebp],0 +mov dword ptr (-316)[ebp],0 +mov dword ptr (-472)[ebp],0 +mov dword ptr (-156)[ebp],1 +mov dword ptr (-312)[ebp],1 +mov dword ptr (-468)[ebp],1 +mov dword ptr (-152)[ebp],2 +mov dword ptr (-308)[ebp],2 +mov dword ptr (-464)[ebp],2 +mov dword ptr (-148)[ebp],3 +mov dword ptr (-304)[ebp],3 +mov dword ptr (-460)[ebp],3 +mov dword ptr (-144)[ebp],4 +mov dword ptr (-300)[ebp],4 +mov dword ptr (-456)[ebp],4 +mov dword ptr (-140)[ebp],5 +mov dword ptr (-296)[ebp],5 +mov dword ptr (-452)[ebp],5 +mov dword ptr (-136)[ebp],6 +mov dword ptr (-292)[ebp],6 +mov dword ptr (-448)[ebp],6 +mov dword ptr (-132)[ebp],7 +mov dword ptr (-288)[ebp],7 +mov dword ptr (-444)[ebp],7 +mov dword ptr (-128)[ebp],8 +mov dword ptr (-284)[ebp],8 +mov dword ptr (-440)[ebp],8 +mov dword ptr (-124)[ebp],9 +mov dword ptr (-280)[ebp],9 +mov dword ptr (-436)[ebp],9 +mov dword ptr (-120)[ebp],10 +mov dword ptr (-276)[ebp],10 +mov dword ptr (-432)[ebp],10 +mov dword ptr (-116)[ebp],11 +mov dword ptr (-272)[ebp],11 +mov dword ptr (-428)[ebp],11 +mov dword ptr (-112)[ebp],12 +mov dword ptr (-268)[ebp],12 +mov dword ptr (-424)[ebp],12 +mov dword ptr (-108)[ebp],13 +mov dword ptr (-264)[ebp],13 +mov dword ptr (-420)[ebp],13 +mov dword ptr (-104)[ebp],14 +mov dword ptr (-260)[ebp],14 +mov dword ptr (-416)[ebp],14 +mov dword ptr (-100)[ebp],15 +mov dword ptr (-256)[ebp],15 +mov dword ptr (-412)[ebp],15 +mov dword ptr (-96)[ebp],16 +mov dword ptr (-252)[ebp],16 +mov dword ptr (-408)[ebp],16 +mov dword ptr (-92)[ebp],63 +mov dword ptr (-248)[ebp],63 +mov dword ptr (-404)[ebp],63 +mov dword ptr (-88)[ebp],64 +mov dword ptr (-244)[ebp],64 +mov dword ptr (-400)[ebp],64 +mov dword ptr (-84)[ebp],255 +mov dword ptr (-240)[ebp],255 +mov dword ptr (-396)[ebp],255 +mov dword ptr (-80)[ebp],256 +mov dword ptr (-236)[ebp],256 +mov dword ptr (-392)[ebp],256 +mov dword ptr (-76)[ebp],4095 +mov dword ptr (-232)[ebp],4095 +mov dword ptr (-388)[ebp],4095 +mov dword ptr (-72)[ebp],4096 +mov dword ptr (-228)[ebp],4096 +mov dword ptr (-384)[ebp],4096 +mov dword ptr (-68)[ebp],65535 +mov dword ptr (-224)[ebp],65535 +mov dword ptr (-380)[ebp],65535 +mov dword ptr (-64)[ebp],65536 +mov dword ptr (-220)[ebp],65536 +mov dword ptr (-376)[ebp],65536 +mov dword ptr (-60)[ebp],262143 +mov dword ptr (-216)[ebp],262143 +mov dword ptr (-372)[ebp],262143 +mov dword ptr (-56)[ebp],262144 +mov dword ptr (-212)[ebp],262144 +mov dword ptr (-368)[ebp],262144 +mov dword ptr (-52)[ebp],1048575 +mov dword ptr (-208)[ebp],1048575 +mov dword ptr (-364)[ebp],1048575 +mov dword ptr (-48)[ebp],1048576 +mov dword ptr (-204)[ebp],1048576 +mov dword ptr (-360)[ebp],1048576 +mov dword ptr (-44)[ebp],16777215 +mov dword ptr (-200)[ebp],16777215 +mov dword ptr (-356)[ebp],16777215 +mov dword ptr (-40)[ebp],16777216 +mov dword ptr (-196)[ebp],16777216 +mov dword ptr (-352)[ebp],16777216 +mov dword ptr (-36)[ebp],268435455 +mov dword ptr (-192)[ebp],268435455 +mov dword ptr (-348)[ebp],268435455 +mov dword ptr (-32)[ebp],268435456 +mov dword ptr (-188)[ebp],268435456 +mov dword ptr (-344)[ebp],268435456 +mov dword ptr (-28)[ebp],1073741823 +mov dword ptr (-184)[ebp],1073741823 +mov dword ptr (-340)[ebp],1073741823 +mov dword ptr (-24)[ebp],1073741824 +mov dword ptr (-180)[ebp],1073741824 +mov dword ptr (-336)[ebp],1073741824 +mov edi,0ffffffffH +mov dword ptr (-20)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-176)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-332)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-16)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-172)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-328)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-12)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-168)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-324)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-8)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-164)[ebp],edi +mov edi,0ffffffffH +mov dword ptr (-320)[ebp],edi +mov dword ptr (-4)[ebp],0 +L188: +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*4] +mov esi,dword ptr (-160)[ebp][edi] +cmp dword ptr (L45)[edi],esi +jne L195 +mov ebx,dword ptr (-316)[ebp][edi] +cmp esi,ebx +jne L195 +cmp ebx,dword ptr (-472)[ebp][edi] +je L192 +L195: +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L196 +lea edi,(L198) +push edi +call _printf +add esp,4 +lea edi,(L199) +push edi +call _printf +add esp,4 +L196: +L192: +L189: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],39 +jl L188 +cmp dword ptr (-488)[ebp],0 +je L200 +mov dword ptr (-484)[ebp],16 +L200: +mov eax,dword ptr (-484)[ebp] +L42: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _pow2 +_pow2: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],1 +jmp L204 +L203: +sal dword ptr (-4)[ebp],1 +L204: +mov edi,dword ptr (20)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (20)[ebp],esi +cmp edi,0 +jne L203 +mov eax,dword ptr (-4)[ebp] +L202: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L207 label byte +db 115 +db 50 +db 52 +db 51 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L208 label byte +db 115 +db 50 +db 52 +db 51 +db 32 +db 32 +db 32 +db 0 +public _s243 +_DATA ends +_TEXT segment +_s243: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,268 +mov dword ptr (-268)[ebp],0 +lea edi,(L208) +mov dword ptr (-260)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-264)[ebp],edi +L209: +L210: +mov edi,dword ptr (-264)[ebp] +lea esi,(1)[edi] +mov dword ptr (-264)[ebp],esi +mov esi,dword ptr (-260)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-260)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L209 +lea edi,(-256)[ebp] +push edi +call _zerofill +add esp,4 +mov byte ptr (-159)[ebp],1 +mov byte ptr (-191)[ebp],1 +mov byte ptr (-130)[ebp],1 +mov byte ptr (-208)[ebp],1 +mov byte ptr (-158)[ebp],1 +mov byte ptr (-190)[ebp],1 +mov byte ptr (-223)[ebp],1 +mov byte ptr (-207)[ebp],1 +mov byte ptr (-157)[ebp],1 +mov byte ptr (-189)[ebp],1 +mov byte ptr (-222)[ebp],1 +mov byte ptr (-206)[ebp],1 +mov byte ptr (-156)[ebp],1 +mov byte ptr (-188)[ebp],1 +mov byte ptr (-221)[ebp],1 +mov byte ptr (-205)[ebp],1 +mov byte ptr (-155)[ebp],1 +mov byte ptr (-187)[ebp],1 +mov byte ptr (-219)[ebp],1 +mov byte ptr (-204)[ebp],1 +mov byte ptr (-154)[ebp],1 +mov byte ptr (-186)[ebp],1 +mov byte ptr (-218)[ebp],1 +mov byte ptr (-203)[ebp],1 +mov byte ptr (-153)[ebp],1 +mov byte ptr (-185)[ebp],1 +mov byte ptr (-216)[ebp],1 +mov byte ptr (-202)[ebp],1 +mov byte ptr (-152)[ebp],1 +mov byte ptr (-184)[ebp],1 +mov byte ptr (-215)[ebp],1 +mov byte ptr (-201)[ebp],1 +mov byte ptr (-151)[ebp],1 +mov byte ptr (-183)[ebp],1 +mov byte ptr (-161)[ebp],1 +mov byte ptr (-200)[ebp],1 +mov byte ptr (-150)[ebp],1 +mov byte ptr (-182)[ebp],1 +mov byte ptr (-195)[ebp],1 +mov byte ptr (-199)[ebp],1 +mov byte ptr (-149)[ebp],1 +mov byte ptr (-181)[ebp],1 +mov byte ptr (-211)[ebp],1 +mov byte ptr (-148)[ebp],1 +mov byte ptr (-180)[ebp],1 +mov byte ptr (-162)[ebp],1 +mov byte ptr (-147)[ebp],1 +mov byte ptr (-179)[ebp],1 +mov byte ptr (-132)[ebp],1 +mov byte ptr (-246)[ebp],1 +mov byte ptr (-146)[ebp],1 +mov byte ptr (-178)[ebp],1 +mov byte ptr (-247)[ebp],1 +mov byte ptr (-145)[ebp],1 +mov byte ptr (-177)[ebp],1 +mov byte ptr (-133)[ebp],1 +mov byte ptr (-248)[ebp],1 +mov byte ptr (-144)[ebp],1 +mov byte ptr (-176)[ebp],1 +mov byte ptr (-131)[ebp],1 +mov byte ptr (-243)[ebp],1 +mov byte ptr (-143)[ebp],1 +mov byte ptr (-175)[ebp],1 +mov byte ptr (-165)[ebp],1 +mov byte ptr (-244)[ebp],1 +mov byte ptr (-142)[ebp],1 +mov byte ptr (-174)[ebp],1 +mov byte ptr (-163)[ebp],1 +mov byte ptr (-141)[ebp],1 +mov byte ptr (-173)[ebp],1 +mov byte ptr (-213)[ebp],1 +mov byte ptr (-164)[ebp],1 +mov byte ptr (-140)[ebp],1 +mov byte ptr (-172)[ebp],1 +mov byte ptr (-197)[ebp],1 +mov byte ptr (-217)[ebp],1 +mov byte ptr (-139)[ebp],1 +mov byte ptr (-171)[ebp],1 +mov byte ptr (-214)[ebp],1 +mov byte ptr (-138)[ebp],1 +mov byte ptr (-170)[ebp],1 +mov byte ptr (-198)[ebp],1 +mov byte ptr (-256)[ebp],1 +mov byte ptr (-137)[ebp],1 +mov byte ptr (-169)[ebp],1 +mov byte ptr (-196)[ebp],1 +mov byte ptr (-224)[ebp],1 +mov byte ptr (-136)[ebp],1 +mov byte ptr (-168)[ebp],1 +mov byte ptr (-194)[ebp],1 +mov byte ptr (-135)[ebp],1 +mov byte ptr (-167)[ebp],1 +mov byte ptr (-212)[ebp],1 +mov byte ptr (-134)[ebp],1 +mov byte ptr (-166)[ebp],1 +mov byte ptr (-210)[ebp],1 +mov byte ptr (-193)[ebp],1 +mov byte ptr (-209)[ebp],1 +lea edi,(-256)[ebp] +push edi +call _sumof +add esp,4 +cmp eax,98 +je L309 +inc dword ptr (-268)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L311 +push 1 +lea edi,(L207) +push edi +call _printf +add esp,8 +L311: +L309: +jmp L313 +add dword ptr (-268)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L315 +push 8 +lea edi,(L207) +push edi +call _printf +add esp,8 +L315: +L313: +mov eax,dword ptr (-268)[ebp] +L206: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _zerofill +_zerofill: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],0 +L318: +mov edi,dword ptr (20)[ebp] +lea esi,(1)[edi] +mov dword ptr (20)[ebp],esi +mov byte ptr [edi],0 +L319: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],256 +jl L318 +mov eax,0 +L317: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _sumof +_sumof: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,12 +mov edi,dword ptr (20)[ebp] +mov dword ptr (-12)[ebp],edi +mov dword ptr (-4)[ebp],0 +mov dword ptr (-8)[ebp],0 +L323: +mov edi,dword ptr (-12)[ebp] +lea esi,(1)[edi] +mov dword ptr (-12)[ebp],esi +movsx edi,byte ptr [edi] +add dword ptr (-4)[ebp],edi +L324: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],256 +jl L323 +mov eax,dword ptr (-4)[ebp] +L322: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L328 label byte +db 115 +db 50 +db 52 +db 52 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L329 label byte +db 115 +db 50 +db 52 +db 52 +db 32 +db 32 +db 32 +db 0 +public _s244 +_DATA ends +_TEXT segment +_s244: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,92 +lea edi,(L329) +mov dword ptr (-72)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-76)[ebp],edi +L330: +L331: +mov edi,dword ptr (-76)[ebp] +lea esi,(1)[edi] +mov dword ptr (-76)[ebp],esi +mov esi,dword ptr (-72)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-72)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L330 +mov dword ptr (-84)[ebp],0 +mov dword ptr (-80)[ebp],0 +fld qword ptr (L333) +fstp qword ptr (-68)[ebp] +fld qword ptr (L333) +fstp qword ptr (-60)[ebp] +fld qword ptr (L333) +fstp qword ptr (-52)[ebp] +fld qword ptr (L333) +fstp qword ptr (-44)[ebp] +fld qword ptr (L333) +fstp qword ptr (-36)[ebp] +fld qword ptr (L333) +fstp qword ptr (-28)[ebp] +fld qword ptr (L333) +fstp qword ptr (-20)[ebp] +fld qword ptr (L333) +fstp qword ptr (-12)[ebp] +mov dword ptr (-80)[ebp],0 +mov dword ptr (-4)[ebp],0 +L341: +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*8] +fld qword ptr (-60)[ebp][edi] +fcomp qword ptr (-68)[ebp][edi] +fstsw ax +sahf +je L345 +mov dword ptr (-80)[ebp],1 +L345: +L342: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],7 +jl L341 +cmp dword ptr (-80)[ebp],0 +je L348 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L350 +push 1 +lea edi,(L328) +push edi +call _printf +add esp,8 +L350: +inc dword ptr (-84)[ebp] +L348: +jmp L352 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L354 +push 2 +lea edi,(L328) +push edi +call _printf +add esp,8 +L354: +add dword ptr (-84)[ebp],2 +L352: +mov eax,dword ptr (-84)[ebp] +L327: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L357 label byte +db 115 +db 50 +db 53 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L358 label byte +db 115 +db 50 +db 53 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s25 +_DATA ends +_TEXT segment +_s25: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,28 +lea edi,(L358) +mov dword ptr (-16)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-20)[ebp],edi +L359: +L360: +mov edi,dword ptr (-20)[ebp] +lea esi,(1)[edi] +mov dword ptr (-20)[ebp],esi +mov esi,dword ptr (-16)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-16)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L359 +mov dword ptr (-24)[ebp],0 +lea edi,(L362) +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (-8)[ebp] +movsx esi,byte ptr (1)[edi] +movsx ebx,byte ptr [edi] +cmp ebx,esi +jne L366 +movsx edi,byte ptr (2)[edi] +cmp esi,edi +jne L366 +cmp edi,46 +je L363 +L366: +inc dword ptr (-24)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L367 +push 1 +lea edi,(L357) +push edi +call _printf +add esp,8 +L367: +L363: +mov edi,dword ptr (-8)[ebp] +movsx edi,byte ptr (3)[edi] +cmp edi,0 +je L369 +add dword ptr (-24)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L371 +push 4 +lea edi,(L357) +push edi +call _printf +add esp,8 +L371: +L369: +movsx edi,byte ptr (L375+1) +cmp edi,34 +je L373 +add dword ptr (-24)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L377 +push 8 +lea edi,(L357) +push edi +call _printf +add esp,8 +L377: +L373: +lea edi,(L379) +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (-8)[ebp] +movsx esi,byte ptr [edi] +cmp esi,10 +jne L387 +movsx esi,byte ptr (1)[edi] +cmp esi,9 +jne L387 +movsx esi,byte ptr (2)[edi] +cmp esi,8 +jne L387 +movsx esi,byte ptr (3)[edi] +cmp esi,13 +jne L387 +movsx esi,byte ptr (4)[edi] +cmp esi,12 +jne L387 +movsx esi,byte ptr (5)[edi] +cmp esi,92 +jne L387 +movsx edi,byte ptr (6)[edi] +cmp edi,39 +je L380 +L387: +add dword ptr (-24)[ebp],16 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L388 +push 16 +lea edi,(L357) +push edi +call _printf +add esp,8 +L388: +L380: +lea edi,(L390) +mov dword ptr (-12)[ebp],edi +mov dword ptr (-8)[ebp],edi +mov dword ptr (-28)[ebp],0 +mov dword ptr (-4)[ebp],0 +jmp L394 +L391: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +movsx esi,byte ptr [esi][edi] +mov ebx,dword ptr (-12)[ebp] +movsx edi,byte ptr [ebx][edi] +cmp esi,edi +je L395 +mov dword ptr (-28)[ebp],1 +L395: +L392: +inc dword ptr (-4)[ebp] +L394: +mov edi,dword ptr (-4)[ebp] +cmp edi,7 +jb L391 +cmp dword ptr (-28)[ebp],0 +je L397 +add dword ptr (-24)[ebp],32 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L399 +push 32 +lea edi,(L357) +push edi +call _printf +add esp,8 +L399: +L397: +mov eax,dword ptr (-24)[ebp] +L356: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L402 label byte +db 115 +db 50 +db 54 +db 32 +db 32 +db 32 +db 32 +db 0 +align 1 +L403 label byte +db 37 +db 51 +db 100 +db 32 +db 98 +db 105 +db 116 +db 115 +db 32 +db 105 +db 110 +db 32 +db 37 +db 115 +db 115 +db 46 +db 10 +db 0 +align 1 +L404 label byte +db 37 +db 101 +db 32 +db 105 +db 115 +db 32 +db 116 +db 104 +db 101 +db 32 +db 108 +db 101 +db 97 +db 115 +db 116 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 99 +db 97 +db 110 +db 32 +db 98 +db 101 +db 32 +db 97 +db 100 +db 100 +db 101 +db 100 +db 32 +db 116 +db 111 +db 32 +db 49 +db 46 +db 32 +db 40 +db 37 +db 115 +db 41 +db 46 +db 10 +db 0 +public _s26 +_DATA ends +_TEXT segment +_s26: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,56 +lea edi,(L402) +mov dword ptr (-36)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-40)[ebp],edi +L405: +L406: +mov edi,dword ptr (-40)[ebp] +lea esi,(1)[edi] +mov dword ptr (-40)[ebp],esi +mov esi,dword ptr (-36)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-36)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L405 +mov edi,dword ptr (20)[ebp] +mov dword ptr [edi],0 +mov byte ptr (-41)[ebp],0 +mov byte ptr (-5)[ebp],1 +jmp L409 +L408: +movsx edi,byte ptr (-5)[ebp] +lea edi,[edi*2] +mov ebx,edi +mov byte ptr (-5)[ebp],bl +mov edi,dword ptr (20)[ebp] +inc dword ptr [edi] +L409: +movsx edi,byte ptr (-41)[ebp] +movsx esi,byte ptr (-5)[ebp] +cmp edi,esi +jne L408 +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +lea esi,[esi*4] +mov dword ptr (4)[edi],esi +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +lea esi,[esi*2] +mov dword ptr (8)[edi],esi +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +lea esi,[esi*4] +mov dword ptr (12)[edi],esi +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +lea esi,[esi*4] +mov dword ptr (16)[edi],esi +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +lea esi,[esi*4] +mov dword ptr (20)[edi],esi +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +lea esi,[esi*8] +mov dword ptr (24)[edi],esi +fld dword ptr (L411) +fstp dword ptr (-16)[ebp] +fld dword ptr (L411) +fstp dword ptr (-4)[ebp] +fld dword ptr (L412) +fstp dword ptr (-12)[ebp] +jmp L414 +L413: +fld dword ptr (-16)[ebp] +fadd dword ptr (-4)[ebp] +fstp dword ptr (-12)[ebp] +fld dword ptr (-4)[ebp] +fdiv qword ptr (L416) +fstp dword ptr (-4)[ebp] +L414: +fld dword ptr (-16)[ebp] +fcomp dword ptr (-12)[ebp] +fstsw ax +sahf +jne L413 +mov edi,dword ptr (20)[ebp] +fld qword ptr (L417) +fmul dword ptr (-4)[ebp] +fstp dword ptr (28)[edi] +fld qword ptr (L418) +fstp qword ptr (-32)[ebp] +fld dword ptr (L411) +fstp dword ptr (-4)[ebp] +fld qword ptr (L419) +fstp qword ptr (-24)[ebp] +jmp L421 +L420: +fld dword ptr (-4)[ebp] +fstp qword ptr (-56)[ebp] +fld qword ptr (-32)[ebp] +fadd qword ptr (-56)[ebp] +fstp qword ptr (-24)[ebp] +fld qword ptr (-56)[ebp] +fdiv qword ptr (L416) +fstp dword ptr (-4)[ebp] +L421: +fld qword ptr (-32)[ebp] +fcomp qword ptr (-24)[ebp] +fstsw ax +sahf +jne L420 +mov edi,dword ptr (20)[ebp] +fld qword ptr (L417) +fmul dword ptr (-4)[ebp] +fstp dword ptr (32)[edi] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L423 +lea edi,(L425) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr [edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L426) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (4)[edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L427) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (8)[edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L428) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (12)[edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L429) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (16)[edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L430) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (20)[edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L431) +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (24)[edi] +push edi +lea edi,(L403) +push edi +call _printf +add esp,12 +lea edi,(L430) +push edi +mov edi,dword ptr (20)[ebp] +fld dword ptr (28)[edi] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L404) +push edi +call _printf +add esp,16 +lea edi,(L431) +push edi +mov edi,dword ptr (20)[ebp] +fld dword ptr (32)[edi] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L404) +push edi +call _printf +add esp,16 +L423: +mov eax,0 +L401: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L433 label byte +db 115 +db 52 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L434 label byte +db 115 +db 52 +db 32 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s4 +_DATA ends +_TEXT segment +_s4: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,36 +mov dword ptr (-24)[ebp],0 +lea edi,(L434) +mov dword ptr (-16)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-20)[ebp],edi +L435: +L436: +mov edi,dword ptr (-20)[ebp] +lea esi,(1)[edi] +mov dword ptr (-20)[ebp],esi +mov esi,dword ptr (-16)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-16)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L435 +mov dword ptr (-4)[ebp],0 +L438: +mov edi,dword ptr (-4)[ebp] +push edi +call _svtest +add esp,4 +mov edi,eax +call _zero +add esp,0 +cmp edi,eax +je L442 +mov dword ptr (-24)[ebp],1 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L444 +push 1 +lea edi,(L433) +push edi +call _printf +add esp,8 +L444: +L442: +L439: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],3 +jl L438 +call _setev +add esp,0 +call _testev +add esp,0 +cmp eax,0 +je L446 +add dword ptr (-24)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L448 +push 2 +lea edi,(L433) +push edi +call _printf +add esp,8 +L448: +L446: +jmp L450 +add dword ptr (-24)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L452 +push 4 +lea edi,(L433) +push edi +call _printf +add esp,8 +L452: +L450: +mov dword ptr (-8)[ebp],0ffffffffH +mov dword ptr (-12)[ebp],1 +mov dword ptr (-4)[ebp],0 +jmp L457 +L454: +mov edi,dword ptr (-8)[ebp] +and dword ptr (-12)[ebp],edi +shr edi,1 +mov dword ptr (-8)[ebp],edi +L455: +inc dword ptr (-4)[ebp] +L457: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (20)[ebp] +mov esi,dword ptr [esi] +lea esi,[esi*4] +cmp edi,esi +jb L454 +mov edi,dword ptr (-12)[ebp] +cmp edi,1 +jne L460 +mov edi,dword ptr (-8)[ebp] +cmp edi,0 +je L458 +L460: +add dword ptr (-24)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L461 +push 8 +lea edi,(L433) +push edi +call _printf +add esp,8 +L461: +L458: +mov eax,dword ptr (-24)[ebp] +L432: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L464 label byte +db 4 dup (0) +public _svtest +_DATA ends +_TEXT segment +_svtest: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov edi,dword ptr (20)[ebp] +cmp edi,0 +je L467 +cmp edi,1 +je L468 +cmp edi,2 +je L471 +jmp L465 +L467: +mov dword ptr (L464),1978 +mov dword ptr (-4)[ebp],0 +jmp L466 +L468: +cmp dword ptr (L464),1978 +je L469 +mov dword ptr (-4)[ebp],1 +jmp L466 +L469: +mov dword ptr (L464),1929 +mov dword ptr (-4)[ebp],0 +jmp L466 +L471: +cmp dword ptr (L464),1929 +je L472 +mov dword ptr (-4)[ebp],1 +jmp L466 +L472: +mov dword ptr (-4)[ebp],0 +L465: +L466: +mov eax,dword ptr (-4)[ebp] +L463: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L475 label byte +db 4 dup (0) +public _zero +_DATA ends +_TEXT segment +_zero: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (L475),2 +mov dword ptr (-4)[ebp],0 +mov eax,dword ptr (-4)[ebp] +L474: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _testev +_testev: +push ebx +push esi +push edi +push ebp +mov ebp,esp +cmp dword ptr (_extvar),1066 +je L477 +mov eax,1 +jmp L476 +L477: +mov eax,0 +L476: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L480 label byte +db 115 +db 54 +db 49 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L481 label byte +db 115 +db 54 +db 49 +db 32 +db 32 +db 32 +db 32 +db 0 +align 1 +L482 label byte +db 65 +db 66 +db 67 +db 68 +db 69 +db 70 +db 71 +db 72 +db 73 +db 74 +db 75 +db 76 +db 77 +db 78 +db 79 +db 80 +db 81 +db 82 +db 83 +db 84 +db 85 +db 86 +db 87 +db 88 +db 89 +db 90 +db 0 +align 1 +L483 label byte +db 97 +db 98 +db 99 +db 100 +db 101 +db 102 +db 103 +db 104 +db 105 +db 106 +db 107 +db 108 +db 109 +db 110 +db 111 +db 112 +db 113 +db 114 +db 115 +db 116 +db 117 +db 118 +db 119 +db 120 +db 121 +db 122 +db 0 +align 1 +L484 label byte +db 48 +db 49 +db 50 +db 51 +db 52 +db 53 +db 54 +db 55 +db 56 +db 57 +db 0 +align 1 +L485 label byte +db 126 +db 33 +db 34 +db 35 +db 37 +db 38 +db 40 +db 41 +db 95 +db 61 +db 45 +db 94 +db 124 +db 123 +db 125 +db 91 +db 93 +db 43 +db 59 +db 42 +db 58 +db 60 +db 62 +db 44 +db 46 +db 63 +db 47 +db 0 +align 1 +L486 label byte +db 10 +db 9 +db 8 +db 13 +db 12 +db 92 +db 39 +db 0 +align 1 +L487 label byte +db 32 +db 0 +db 0 +public _s61 +_DATA ends +_TEXT segment +_s61: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,60 +lea edi,(L481) +mov dword ptr (-36)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-40)[ebp],edi +mov dword ptr (-48)[ebp],0 +L488: +L489: +mov edi,dword ptr (-40)[ebp] +lea esi,(1)[edi] +mov dword ptr (-40)[ebp],esi +mov esi,dword ptr (-36)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-36)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L488 +mov word ptr (-54)[ebp],-19 +movsx edi,word ptr (-54)[ebp] +mov dword ptr (-60)[ebp],edi +cmp dword ptr (-60)[ebp],-19 +je L491 +inc dword ptr (-48)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L493 +push 1 +lea edi,(L480) +push edi +call _printf +add esp,8 +L493: +L491: +lea edi,(L482) +mov dword ptr (-28)[ebp],edi +lea edi,(L483) +mov dword ptr (-24)[ebp],edi +lea edi,(L484) +mov dword ptr (-20)[ebp],edi +lea edi,(L485) +mov dword ptr (-16)[ebp],edi +lea edi,(L486) +mov dword ptr (-12)[ebp],edi +lea edi,(L487) +mov dword ptr (-8)[ebp],edi +mov dword ptr (-32)[ebp],0 +mov dword ptr (-4)[ebp],0 +jmp L505 +L504: +mov edi,dword ptr (-4)[ebp] +lea edi,(-28)[ebp][edi*4] +mov esi,dword ptr [edi] +lea ebx,(1)[esi] +mov dword ptr [edi],ebx +movsx edi,byte ptr [esi] +cmp edi,0 +jge L507 +mov dword ptr (-32)[ebp],1 +L507: +L505: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr (-28)[ebp][edi*4] +movsx edi,byte ptr [edi] +cmp edi,0 +jne L504 +L501: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],6 +jl L505 +cmp dword ptr (-32)[ebp],0 +je L509 +add dword ptr (-48)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L511 +push 2 +lea edi,(L480) +push edi +call _printf +add esp,8 +L511: +L509: +mov dword ptr (-44)[ebp],1048579 +mov edi,dword ptr (-44)[ebp] +mov esi,edi +mov word ptr (-50)[ebp],si +mov ebx,edi +mov byte ptr (-51)[ebp],bl +movsx edi,word ptr (-50)[ebp] +cmp edi,dword ptr (-44)[ebp] +je L516 +cmp edi,3 +jne L515 +L516: +movsx edi,byte ptr (-51)[ebp] +cmp edi,dword ptr (-44)[ebp] +je L513 +cmp edi,3 +je L513 +L515: +add dword ptr (-48)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L517 +push 8 +lea edi,(L480) +push edi +call _printf +add esp,8 +L517: +L513: +mov eax,dword ptr (-48)[ebp] +L479: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L520 label byte +db 115 +db 54 +db 50 +db 54 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L521 label byte +db 115 +db 54 +db 50 +db 54 +db 32 +db 32 +db 32 +db 0 +public _s626 +_DATA ends +_TEXT segment +_s626: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,128 +lea edi,(L521) +mov dword ptr (-56)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-60)[ebp],edi +mov dword ptr (-104)[ebp],0 +L522: +L523: +mov edi,dword ptr (-60)[ebp] +lea esi,(1)[edi] +mov dword ptr (-60)[ebp],esi +mov esi,dword ptr (-56)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-56)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L522 +fld dword ptr (L411) +fstp dword ptr (-36)[ebp] +mov dword ptr (-64)[ebp],1 +mov dword ptr (-40)[ebp],1 +mov dword ptr (-4)[ebp],0 +jmp L528 +L525: +fld dword ptr (L529) +fmul dword ptr (-36)[ebp] +fstp dword ptr (-36)[ebp] +mov edi,dword ptr (-40)[ebp] +lea edi,[edi*2] +or edi,dword ptr (-64)[ebp] +mov dword ptr (-40)[ebp],edi +L526: +inc dword ptr (-4)[ebp] +L528: +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (12)[edi] +sub edi,2 +cmp dword ptr (-4)[ebp],edi +jl L525 +mov edi,dword ptr (-40)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (-112)[ebp] +fld dword ptr (-36)[ebp] +fsub dword ptr (-112)[ebp] +fdiv dword ptr (-36)[ebp] +fstp dword ptr (-36)[ebp] +fld qword ptr (L416) +mov edi,dword ptr (20)[ebp] +fmul dword ptr (28)[edi] +fcomp dword ptr (-36)[ebp] +fstsw ax +sahf +jae L530 +add dword ptr (-104)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L532 +push 2 +lea edi,(L520) +push edi +call _printf +add esp,8 +L532: +L530: +mov byte ptr (-73)[ebp],125 +mov word ptr (-76)[ebp],125 +mov dword ptr (-80)[ebp],125 +mov dword ptr (-96)[ebp],15625 +mov dword ptr (-84)[ebp],125 +mov dword ptr (-100)[ebp],15625 +mov dword ptr (-68)[ebp],125 +mov dword ptr (-108)[ebp],15625 +fld dword ptr (L534) +fstp dword ptr (-72)[ebp] +fld qword ptr (L535) +fstp qword ptr (-92)[ebp] +fld qword ptr (L536) +fstp qword ptr (-52)[ebp] +mov dword ptr (-4)[ebp],0 +L537: +mov edi,dword ptr (-4)[ebp] +mov byte ptr (-32)[ebp][edi],0 +L538: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],28 +jl L537 +movsx edi,byte ptr (-73)[ebp] +mov esi,edi +imul esi,edi +cmp esi,dword ptr (-96)[ebp] +je L541 +mov byte ptr (-32)[ebp],1 +L541: +movsx edi,word ptr (-76)[ebp] +movsx esi,byte ptr (-73)[ebp] +imul edi,esi +cmp edi,dword ptr (-96)[ebp] +je L543 +mov byte ptr (-31)[ebp],1 +L543: +movsx edi,word ptr (-76)[ebp] +mov esi,edi +imul esi,edi +cmp esi,dword ptr (-96)[ebp] +je L546 +mov byte ptr (-30)[ebp],1 +L546: +mov edi,dword ptr (-80)[ebp] +movsx esi,byte ptr (-73)[ebp] +imul edi,esi +cmp edi,dword ptr (-96)[ebp] +je L549 +mov byte ptr (-29)[ebp],1 +L549: +mov edi,dword ptr (-80)[ebp] +movsx esi,word ptr (-76)[ebp] +imul edi,esi +cmp edi,dword ptr (-96)[ebp] +je L552 +mov byte ptr (-28)[ebp],1 +L552: +mov edi,dword ptr (-80)[ebp] +mov esi,edi +imul esi,edi +cmp esi,dword ptr (-96)[ebp] +je L555 +mov byte ptr (-27)[ebp],1 +L555: +mov eax,dword ptr (-84)[ebp] +movsx edi,byte ptr (-73)[ebp] +mul edi +cmp eax,dword ptr (-100)[ebp] +je L558 +mov byte ptr (-26)[ebp],1 +L558: +mov eax,dword ptr (-84)[ebp] +movsx edi,word ptr (-76)[ebp] +mul edi +cmp eax,dword ptr (-100)[ebp] +je L561 +mov byte ptr (-25)[ebp],1 +L561: +mov eax,dword ptr (-84)[ebp] +mov edi,dword ptr (-80)[ebp] +mul edi +cmp eax,dword ptr (-100)[ebp] +je L564 +mov byte ptr (-24)[ebp],1 +L564: +mov edi,dword ptr (-84)[ebp] +mov eax,edi +mul edi +cmp eax,dword ptr (-100)[ebp] +je L567 +mov byte ptr (-23)[ebp],1 +L567: +mov edi,dword ptr (-68)[ebp] +movsx esi,byte ptr (-73)[ebp] +imul edi,esi +cmp edi,dword ptr (-108)[ebp] +je L570 +mov byte ptr (-22)[ebp],1 +L570: +mov edi,dword ptr (-68)[ebp] +movsx esi,word ptr (-76)[ebp] +imul edi,esi +cmp edi,dword ptr (-108)[ebp] +je L573 +mov byte ptr (-21)[ebp],1 +L573: +mov edi,dword ptr (-68)[ebp] +mov esi,dword ptr (-80)[ebp] +imul edi,esi +cmp edi,dword ptr (-108)[ebp] +je L576 +mov byte ptr (-20)[ebp],1 +L576: +mov edi,dword ptr (-68)[ebp] +mov eax,edi +mul dword ptr (-84)[ebp] +cmp eax,dword ptr (-100)[ebp] +je L579 +mov byte ptr (-19)[ebp],1 +L579: +mov edi,dword ptr (-68)[ebp] +mov esi,edi +imul esi,edi +cmp esi,dword ptr (-108)[ebp] +je L582 +mov byte ptr (-18)[ebp],1 +L582: +fld dword ptr (-72)[ebp] +movsx edi,byte ptr (-73)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L585 +mov byte ptr (-17)[ebp],1 +L585: +fld dword ptr (-72)[ebp] +movsx edi,word ptr (-76)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L588 +mov byte ptr (-16)[ebp],1 +L588: +fld dword ptr (-72)[ebp] +mov edi,dword ptr (-80)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L591 +mov byte ptr (-15)[ebp],1 +L591: +mov edi,dword ptr (-84)[ebp] +fld dword ptr (-72)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L594 +mov byte ptr (-14)[ebp],1 +L594: +fld dword ptr (-72)[ebp] +mov edi,dword ptr (-68)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L598 +mov byte ptr (-13)[ebp],1 +L598: +fld dword ptr (-72)[ebp] +fmul dword ptr (-72)[ebp] +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L601 +mov byte ptr (-12)[ebp],1 +L601: +fld qword ptr (-92)[ebp] +movsx edi,byte ptr (-73)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L604 +mov byte ptr (-11)[ebp],1 +L604: +fld qword ptr (-92)[ebp] +movsx edi,word ptr (-76)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L607 +mov byte ptr (-10)[ebp],1 +L607: +fld qword ptr (-92)[ebp] +fild dword ptr (-80)[ebp] +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L610 +mov byte ptr (-9)[ebp],1 +L610: +mov edi,dword ptr (-84)[ebp] +fld qword ptr (-92)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L613 +mov byte ptr (-8)[ebp],1 +L613: +fld qword ptr (-92)[ebp] +fild dword ptr (-68)[ebp] +fmulp st(1),st +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L616 +mov byte ptr (-7)[ebp],1 +L616: +fld qword ptr (-92)[ebp] +fmul dword ptr (-72)[ebp] +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L619 +mov byte ptr (-6)[ebp],1 +L619: +fld qword ptr (-92)[ebp] +fmul qword ptr (-92)[ebp] +fld qword ptr (-52)[ebp] +fcompp +fstsw ax +sahf +je L622 +mov byte ptr (-5)[ebp],1 +L622: +mov byte ptr (-41)[ebp],0 +mov dword ptr (-4)[ebp],0 +L625: +movsx edi,byte ptr (-41)[ebp] +mov esi,dword ptr (-4)[ebp] +movsx esi,byte ptr (-32)[ebp][esi] +lea edi,[esi][edi] +mov ebx,edi +mov byte ptr (-41)[ebp],bl +L626: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],28 +jl L625 +movsx edi,byte ptr (-41)[ebp] +cmp edi,0 +je L629 +add dword ptr (-104)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L631 +push 4 +lea edi,(L520) +push edi +call _printf +add esp,8 +lea edi,(L633) +push edi +call _printf +add esp,4 +mov dword ptr (-4)[ebp],0 +L634: +mov edi,dword ptr (-4)[ebp] +movsx edi,byte ptr (-32)[ebp][edi] +push edi +lea edi,(L638) +push edi +call _printf +add esp,8 +L635: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],28 +jl L634 +lea edi,(L639) +push edi +call _printf +add esp,4 +L631: +L629: +mov dword ptr (-68)[ebp],32768 +mov edi,dword ptr (-68)[ebp] +cmp edi,08000H +jbe L640 +add dword ptr (-104)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L642 +push 8 +lea edi,(L520) +push edi +call _printf +add esp,8 +L642: +L640: +mov eax,dword ptr (-104)[ebp] +L519: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L645 label byte +db 115 +db 55 +db 49 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L646 label byte +db 115 +db 55 +db 49 +db 32 +db 32 +db 32 +db 32 +db 0 +align 1 +L647 label byte +db 113 +public _s71 +_DATA ends +_TEXT segment +_s71: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,68 +lea edi,(L646) +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-8)[ebp],edi +mov dword ptr (-12)[ebp],0 +L648: +L649: +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-4)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-4)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L648 +movsx edi,byte ptr (L653) +movsx esi,byte ptr (L647) +cmp edi,esi +je L651 +inc dword ptr (-12)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L654 +push 1 +lea edi,(L645) +push edi +call _printf +add esp,8 +L654: +L651: +jmp L656 +add dword ptr (-12)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L658 +push 2 +lea edi,(L645) +push edi +call _printf +add esp,8 +L658: +L656: +mov dword ptr (-32)[ebp],1942 +cmp dword ptr (-32)[ebp],1942 +jne L666 +mov edi,dword ptr (-32)[ebp] +cmp dword ptr (-32)[ebp],edi +je L661 +L666: +add dword ptr (-12)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L667 +push 4 +lea edi,(L645) +push edi +call _printf +add esp,8 +L667: +L661: +push -5 +call _McCarthy +add esp,4 +cmp eax,91 +je L669 +add dword ptr (-12)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L671 +push 8 +lea edi,(L645) +push edi +call _printf +add esp,8 +L671: +L669: +mov dword ptr (-56)[ebp],2 +mov dword ptr (-60)[ebp],3 +lea edi,(-60)[ebp] +mov dword ptr (-64)[ebp],edi +mov edi,dword ptr (-64)[ebp] +push edi +mov edi,dword ptr (-56)[ebp] +push edi +call _clobber +add esp,8 +cmp dword ptr (-56)[ebp],2 +jne L675 +cmp dword ptr (-60)[ebp],2 +je L673 +L675: +add dword ptr (-12)[ebp],16 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L676 +push 16 +lea edi,(L645) +push edi +call _printf +add esp,8 +L676: +L673: +mov edi,dword ptr (20)[ebp] +fld dword ptr (32)[edi] +fstp dword ptr (-68)[ebp] +fld dword ptr (-68)[ebp] +fcomp dword ptr (-68)[ebp] +fstsw ax +sahf +je L678 +add dword ptr (-12)[ebp],32 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L680 +push 32 +lea edi,(L645) +push edi +call _printf +add esp,8 +L680: +L678: +mov eax,dword ptr (-12)[ebp] +L644: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _McCarthy +_McCarthy: +push ebx +push esi +push edi +push ebp +mov ebp,esp +cmp dword ptr (20)[ebp],100 +jle L683 +mov edi,dword ptr (20)[ebp] +mov eax,edi +sub eax,10 +jmp L682 +L683: +mov edi,dword ptr (20)[ebp] +lea edi,(11)[edi] +push edi +call _McCarthy +add esp,4 +mov edi,eax +push edi +call _McCarthy +add esp,4 +mov edi,eax +L682: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _clobber +_clobber: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov dword ptr (20)[ebp],3 +mov edi,dword ptr (24)[ebp] +mov dword ptr [edi],2 +mov eax,0 +L685: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L687 label byte +db 76 +db 111 +db 99 +db 97 +db 108 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 32 +db 37 +db 100 +db 46 +db 10 +db 0 +align 1 +L688 label byte +db 115 +db 55 +db 49 +db 52 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L689 label byte +db 115 +db 55 +db 49 +db 52 +db 32 +db 32 +db 32 +db 0 +public _s714 +_DATA ends +_TEXT segment +_s714: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,248 +lea edi,(L689) +mov dword ptr (-68)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea esi,(60)[edi] +mov dword ptr (-72)[ebp],esi +mov dword ptr (-76)[ebp],0 +mov dword ptr (-8)[ebp],0 +mov edi,dword ptr (48)[edi] +mov dword ptr (-4)[ebp],edi +L690: +L691: +mov edi,dword ptr (-72)[ebp] +lea esi,(1)[edi] +mov dword ptr (-72)[ebp],esi +mov esi,dword ptr (-68)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-68)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L690 +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov bl,byte ptr (-25)[ebp] +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L693 +mov dword ptr (-8)[ebp],1 +cmp dword ptr (-4)[ebp],0 +je L695 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L695: +L693: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L697 +mov dword ptr (-8)[ebp],2 +cmp dword ptr (-4)[ebp],0 +je L699 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L699: +L697: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L701 +mov dword ptr (-8)[ebp],3 +cmp dword ptr (-4)[ebp],0 +je L703 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L703: +L701: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L705 +mov dword ptr (-8)[ebp],4 +cmp dword ptr (-4)[ebp],0 +je L707 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L707: +L705: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L709 +mov dword ptr (-8)[ebp],5 +cmp dword ptr (-4)[ebp],0 +je L711 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L711: +L709: +mov byte ptr (-9)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-56)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L713 +mov dword ptr (-8)[ebp],6 +cmp dword ptr (-4)[ebp],0 +je L715 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L715: +L713: +mov byte ptr (-9)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L717 +mov dword ptr (-8)[ebp],7 +cmp dword ptr (-4)[ebp],0 +je L719 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L719: +L717: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L721 +mov dword ptr (-8)[ebp],8 +cmp dword ptr (-4)[ebp],0 +je L723 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L723: +L721: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +mov di,word ptr (-28)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L725 +mov dword ptr (-8)[ebp],9 +cmp dword ptr (-4)[ebp],0 +je L727 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L727: +L725: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L729 +mov dword ptr (-8)[ebp],10 +cmp dword ptr (-4)[ebp],0 +je L731 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L731: +L729: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L733 +mov dword ptr (-8)[ebp],11 +cmp dword ptr (-4)[ebp],0 +je L735 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L735: +L733: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L737 +mov dword ptr (-8)[ebp],12 +cmp dword ptr (-4)[ebp],0 +je L739 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L739: +L737: +mov word ptr (-12)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-56)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L741 +mov dword ptr (-8)[ebp],13 +cmp dword ptr (-4)[ebp],0 +je L743 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L743: +L741: +mov word ptr (-12)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L745 +mov dword ptr (-8)[ebp],14 +cmp dword ptr (-4)[ebp],0 +je L747 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L747: +L745: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],2 +je L749 +mov dword ptr (-8)[ebp],15 +cmp dword ptr (-4)[ebp],0 +je L751 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L751: +L749: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],2 +je L753 +mov dword ptr (-8)[ebp],16 +cmp dword ptr (-4)[ebp],0 +je L755 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L755: +L753: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],2 +je L757 +mov dword ptr (-8)[ebp],17 +cmp dword ptr (-4)[ebp],0 +je L759 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L759: +L757: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],2 +je L761 +mov dword ptr (-8)[ebp],18 +cmp dword ptr (-4)[ebp],0 +je L763 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L763: +L761: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],2 +je L765 +mov dword ptr (-8)[ebp],19 +cmp dword ptr (-4)[ebp],0 +je L767 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L767: +L765: +mov dword ptr (-16)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L769 +mov dword ptr (-8)[ebp],20 +cmp dword ptr (-4)[ebp],0 +je L771 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L771: +L769: +mov dword ptr (-16)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L773 +mov dword ptr (-8)[ebp],21 +cmp dword ptr (-4)[ebp],0 +je L775 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L775: +L773: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],2 +je L777 +mov dword ptr (-8)[ebp],22 +cmp dword ptr (-4)[ebp],0 +je L779 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L779: +L777: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],2 +je L781 +mov dword ptr (-8)[ebp],23 +cmp dword ptr (-4)[ebp],0 +je L783 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L783: +L781: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],2 +je L785 +mov dword ptr (-8)[ebp],24 +cmp dword ptr (-4)[ebp],0 +je L787 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L787: +L785: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],2 +je L789 +mov dword ptr (-8)[ebp],25 +cmp dword ptr (-4)[ebp],0 +je L791 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L791: +L789: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],2 +je L793 +mov dword ptr (-8)[ebp],26 +cmp dword ptr (-4)[ebp],0 +je L795 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L795: +L793: +mov dword ptr (-20)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L797 +mov dword ptr (-8)[ebp],27 +cmp dword ptr (-4)[ebp],0 +je L799 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L799: +L797: +mov dword ptr (-20)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L801 +mov dword ptr (-8)[ebp],28 +cmp dword ptr (-4)[ebp],0 +je L803 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L803: +L801: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L805 +mov dword ptr (-8)[ebp],29 +cmp dword ptr (-4)[ebp],0 +je L807 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L807: +L805: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L809 +mov dword ptr (-8)[ebp],30 +cmp dword ptr (-4)[ebp],0 +je L811 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L811: +L809: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L813 +mov dword ptr (-8)[ebp],31 +cmp dword ptr (-4)[ebp],0 +je L815 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L815: +L813: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L817 +mov dword ptr (-8)[ebp],32 +cmp dword ptr (-4)[ebp],0 +je L819 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L819: +L817: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L821 +mov dword ptr (-8)[ebp],33 +cmp dword ptr (-4)[ebp],0 +je L823 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L823: +L821: +mov dword ptr (-24)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (L828) +fcomp dword ptr (-56)[ebp] +fstsw ax +sahf +ja L826 +fld dword ptr (-56)[ebp] +fsub dword ptr (L828) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-80)[ebp],edi +jmp L827 +L826: +fld dword ptr (-56)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-80)[ebp],edi +L827: +mov edi,dword ptr (-80)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L829 +mov dword ptr (-8)[ebp],34 +cmp dword ptr (-4)[ebp],0 +je L831 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L831: +L829: +mov dword ptr (-24)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (L836) +fcomp qword ptr (-64)[ebp] +fstsw ax +sahf +ja L834 +fld qword ptr (-64)[ebp] +fsub qword ptr (L836) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-92)[ebp],edi +jmp L835 +L834: +fld qword ptr (-64)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-92)[ebp],edi +L835: +mov edi,dword ptr (-92)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L837 +mov dword ptr (-8)[ebp],35 +cmp dword ptr (-4)[ebp],0 +je L839 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L839: +L837: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L842 +mov dword ptr (-8)[ebp],36 +cmp dword ptr (-4)[ebp],0 +je L844 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L844: +L842: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L846 +mov dword ptr (-8)[ebp],37 +cmp dword ptr (-4)[ebp],0 +je L848 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L848: +L846: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L850 +mov dword ptr (-8)[ebp],38 +cmp dword ptr (-4)[ebp],0 +je L852 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L852: +L850: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L854 +mov dword ptr (-8)[ebp],39 +cmp dword ptr (-4)[ebp],0 +je L856 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L856: +L854: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L858 +mov dword ptr (-8)[ebp],40 +cmp dword ptr (-4)[ebp],0 +je L860 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L860: +L858: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-56)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L862 +mov dword ptr (-8)[ebp],41 +cmp dword ptr (-4)[ebp],0 +je L864 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L864: +L862: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L866 +mov dword ptr (-8)[ebp],42 +cmp dword ptr (-4)[ebp],0 +je L868 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L868: +L866: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L871 +mov dword ptr (-8)[ebp],43 +cmp dword ptr (-4)[ebp],0 +je L873 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L873: +L871: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L875 +mov dword ptr (-8)[ebp],44 +cmp dword ptr (-4)[ebp],0 +je L877 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L877: +L875: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-32)[ebp],2 +fild dword ptr (-32)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L879 +mov dword ptr (-8)[ebp],45 +cmp dword ptr (-4)[ebp],0 +je L881 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L881: +L879: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-36)[ebp],2 +fild dword ptr (-36)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L883 +mov dword ptr (-8)[ebp],46 +cmp dword ptr (-4)[ebp],0 +je L885 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L885: +L883: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L887 +mov dword ptr (-8)[ebp],47 +cmp dword ptr (-4)[ebp],0 +je L889 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L889: +L887: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-56)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L891 +mov dword ptr (-8)[ebp],48 +cmp dword ptr (-4)[ebp],0 +je L893 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L893: +L891: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L895 +mov dword ptr (-8)[ebp],49 +cmp dword ptr (-4)[ebp],0 +je L897 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L897: +L895: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +lea edi,[esi][edi] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L899 +mov dword ptr (-8)[ebp],50 +cmp dword ptr (-4)[ebp],0 +je L901 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L901: +L899: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +lea edi,[esi][edi] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L903 +mov dword ptr (-8)[ebp],51 +cmp dword ptr (-4)[ebp],0 +je L905 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L905: +L903: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-32)[ebp] +lea edi,[esi][edi] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L907 +mov dword ptr (-8)[ebp],52 +cmp dword ptr (-4)[ebp],0 +je L909 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L909: +L907: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-36)[ebp] +lea edi,[esi][edi] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L911 +mov dword ptr (-8)[ebp],53 +cmp dword ptr (-4)[ebp],0 +je L913 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L913: +L911: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-40)[ebp] +lea edi,[esi][edi] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L915 +mov dword ptr (-8)[ebp],54 +cmp dword ptr (-4)[ebp],0 +je L917 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L917: +L915: +mov byte ptr (-9)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fadd dword ptr (-56)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L919 +mov dword ptr (-8)[ebp],55 +cmp dword ptr (-4)[ebp],0 +je L921 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L921: +L919: +mov byte ptr (-9)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fadd qword ptr (-64)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,7 +je L923 +mov dword ptr (-8)[ebp],56 +cmp dword ptr (-4)[ebp],0 +je L925 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L925: +L923: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +lea edi,[esi][edi] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L927 +mov dword ptr (-8)[ebp],57 +cmp dword ptr (-4)[ebp],0 +je L929 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L929: +L927: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +lea edi,[esi][edi] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L931 +mov dword ptr (-8)[ebp],58 +cmp dword ptr (-4)[ebp],0 +je L933 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L933: +L931: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-32)[ebp] +lea edi,[esi][edi] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L935 +mov dword ptr (-8)[ebp],59 +cmp dword ptr (-4)[ebp],0 +je L937 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L937: +L935: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-36)[ebp] +lea edi,[esi][edi] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L939 +mov dword ptr (-8)[ebp],60 +cmp dword ptr (-4)[ebp],0 +je L941 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L941: +L939: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-40)[ebp] +lea edi,[esi][edi] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L943 +mov dword ptr (-8)[ebp],61 +cmp dword ptr (-4)[ebp],0 +je L945 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L945: +L943: +mov word ptr (-12)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fadd dword ptr (-56)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L947 +mov dword ptr (-8)[ebp],62 +cmp dword ptr (-4)[ebp],0 +je L949 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L949: +L947: +mov word ptr (-12)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fadd qword ptr (-64)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,7 +je L951 +mov dword ptr (-8)[ebp],63 +cmp dword ptr (-4)[ebp],0 +je L953 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L953: +L951: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +add dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],7 +je L955 +mov dword ptr (-8)[ebp],64 +cmp dword ptr (-4)[ebp],0 +je L957 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L957: +L955: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +add dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],7 +je L959 +mov dword ptr (-8)[ebp],65 +cmp dword ptr (-4)[ebp],0 +je L961 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L961: +L959: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +add dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],7 +je L963 +mov dword ptr (-8)[ebp],66 +cmp dword ptr (-4)[ebp],0 +je L965 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L965: +L963: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +add dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],7 +je L967 +mov dword ptr (-8)[ebp],67 +cmp dword ptr (-4)[ebp],0 +je L969 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L969: +L967: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-40)[ebp] +lea edi,[esi][edi] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],7 +je L971 +mov dword ptr (-8)[ebp],68 +cmp dword ptr (-4)[ebp],0 +je L973 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L973: +L971: +mov dword ptr (-16)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-16)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fadd dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],7 +je L975 +mov dword ptr (-8)[ebp],69 +cmp dword ptr (-4)[ebp],0 +je L977 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L977: +L975: +mov dword ptr (-16)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-16)[ebp] +fadd qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],7 +je L979 +mov dword ptr (-8)[ebp],70 +cmp dword ptr (-4)[ebp],0 +je L981 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L981: +L979: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +add dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],7 +je L983 +mov dword ptr (-8)[ebp],71 +cmp dword ptr (-4)[ebp],0 +je L985 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L985: +L983: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +add dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],7 +je L987 +mov dword ptr (-8)[ebp],72 +cmp dword ptr (-4)[ebp],0 +je L989 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L989: +L987: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +add dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],7 +je L991 +mov dword ptr (-8)[ebp],73 +cmp dword ptr (-4)[ebp],0 +je L993 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L993: +L991: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +add dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],7 +je L995 +mov dword ptr (-8)[ebp],74 +cmp dword ptr (-4)[ebp],0 +je L997 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L997: +L995: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-40)[ebp] +lea edi,[esi][edi] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],7 +je L999 +mov dword ptr (-8)[ebp],75 +cmp dword ptr (-4)[ebp],0 +je L1001 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1001: +L999: +mov dword ptr (-20)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-20)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fadd dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],7 +je L1003 +mov dword ptr (-8)[ebp],76 +cmp dword ptr (-4)[ebp],0 +je L1005 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1005: +L1003: +mov dword ptr (-20)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-20)[ebp] +fadd qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],7 +je L1007 +mov dword ptr (-8)[ebp],77 +cmp dword ptr (-4)[ebp],0 +je L1009 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1009: +L1007: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +add dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1011 +mov dword ptr (-8)[ebp],78 +cmp dword ptr (-4)[ebp],0 +je L1013 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1013: +L1011: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +add dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1015 +mov dword ptr (-8)[ebp],79 +cmp dword ptr (-4)[ebp],0 +je L1017 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1017: +L1015: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +add dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1019 +mov dword ptr (-8)[ebp],80 +cmp dword ptr (-4)[ebp],0 +je L1021 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1021: +L1019: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +add dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1023 +mov dword ptr (-8)[ebp],81 +cmp dword ptr (-4)[ebp],0 +je L1025 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1025: +L1023: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +add dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1027 +mov dword ptr (-8)[ebp],82 +cmp dword ptr (-4)[ebp],0 +je L1029 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1029: +L1027: +mov dword ptr (-24)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fadd dword ptr (-56)[ebp] +fstp dword ptr (-128)[ebp] +fld dword ptr (L828) +fcomp dword ptr (-128)[ebp] +fstsw ax +sahf +ja L1032 +fld dword ptr (-128)[ebp] +fsub dword ptr (L828) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-124)[ebp],edi +jmp L1033 +L1032: +fld dword ptr (-128)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-124)[ebp],edi +L1033: +mov edi,dword ptr (-124)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1034 +mov dword ptr (-8)[ebp],83 +cmp dword ptr (-4)[ebp],0 +je L1036 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1036: +L1034: +mov dword ptr (-24)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fadd qword ptr (-64)[ebp] +fstp qword ptr (-144)[ebp] +fld qword ptr (L836) +fcomp qword ptr (-144)[ebp] +fstsw ax +sahf +ja L1039 +fld qword ptr (-144)[ebp] +fsub qword ptr (L836) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-136)[ebp],edi +jmp L1040 +L1039: +fld qword ptr (-144)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-136)[ebp],edi +L1040: +mov edi,dword ptr (-136)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,7 +je L1041 +mov dword ptr (-8)[ebp],84 +cmp dword ptr (-4)[ebp],0 +je L1043 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1043: +L1041: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov byte ptr (-25)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1045 +mov dword ptr (-8)[ebp],85 +cmp dword ptr (-4)[ebp],0 +je L1048 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1048: +L1045: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov word ptr (-28)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1050 +mov dword ptr (-8)[ebp],86 +cmp dword ptr (-4)[ebp],0 +je L1052 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1052: +L1050: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-32)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1054 +mov dword ptr (-8)[ebp],87 +cmp dword ptr (-4)[ebp],0 +je L1056 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1056: +L1054: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-36)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-36)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1058 +mov dword ptr (-8)[ebp],88 +cmp dword ptr (-4)[ebp],0 +je L1060 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1060: +L1058: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld dword ptr (-44)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1062 +mov dword ptr (-8)[ebp],89 +cmp dword ptr (-4)[ebp],0 +je L1064 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1064: +L1062: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-44)[ebp] +fadd dword ptr (-56)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1066 +mov dword ptr (-8)[ebp],90 +cmp dword ptr (-4)[ebp],0 +je L1068 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1068: +L1066: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld dword ptr (-44)[ebp] +fadd qword ptr (-64)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L1047) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1070 +mov dword ptr (-8)[ebp],91 +cmp dword ptr (-4)[ebp],0 +je L1072 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1072: +L1070: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov byte ptr (-25)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1074 +mov dword ptr (-8)[ebp],92 +cmp dword ptr (-4)[ebp],0 +je L1077 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1077: +L1074: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov word ptr (-28)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1079 +mov dword ptr (-8)[ebp],93 +cmp dword ptr (-4)[ebp],0 +je L1081 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1081: +L1079: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-32)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-32)[ebp] +faddp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1083 +mov dword ptr (-8)[ebp],94 +cmp dword ptr (-4)[ebp],0 +je L1085 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1085: +L1083: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-36)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-36)[ebp] +faddp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1087 +mov dword ptr (-8)[ebp],95 +cmp dword ptr (-4)[ebp],0 +je L1089 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1089: +L1087: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (-52)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +faddp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1091 +mov dword ptr (-8)[ebp],96 +cmp dword ptr (-4)[ebp],0 +je L1093 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1093: +L1091: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld qword ptr (-52)[ebp] +fadd dword ptr (-56)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1095 +mov dword ptr (-8)[ebp],97 +cmp dword ptr (-4)[ebp],0 +je L1097 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1097: +L1095: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-52)[ebp] +fadd qword ptr (-64)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1076) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1099 +mov dword ptr (-8)[ebp],98 +cmp dword ptr (-4)[ebp],0 +je L1101 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1101: +L1099: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +sub edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1103 +mov dword ptr (-8)[ebp],99 +cmp dword ptr (-4)[ebp],0 +je L1105 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1105: +L1103: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +sub edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1107 +mov dword ptr (-8)[ebp],100 +cmp dword ptr (-4)[ebp],0 +je L1109 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1109: +L1107: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +sub edi,dword ptr (-32)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1111 +mov dword ptr (-8)[ebp],101 +cmp dword ptr (-4)[ebp],0 +je L1113 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1113: +L1111: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +sub edi,dword ptr (-36)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1115 +mov dword ptr (-8)[ebp],102 +cmp dword ptr (-4)[ebp],0 +je L1117 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1117: +L1115: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +sub edi,dword ptr (-40)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1119 +mov dword ptr (-8)[ebp],103 +cmp dword ptr (-4)[ebp],0 +je L1121 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1121: +L1119: +mov byte ptr (-9)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsub dword ptr (-56)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1123 +mov dword ptr (-8)[ebp],104 +cmp dword ptr (-4)[ebp],0 +je L1125 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1125: +L1123: +mov byte ptr (-9)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsub qword ptr (-64)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,3 +je L1127 +mov dword ptr (-8)[ebp],105 +cmp dword ptr (-4)[ebp],0 +je L1129 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1129: +L1127: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +sub edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1131 +mov dword ptr (-8)[ebp],106 +cmp dword ptr (-4)[ebp],0 +je L1133 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1133: +L1131: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +sub edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1135 +mov dword ptr (-8)[ebp],107 +cmp dword ptr (-4)[ebp],0 +je L1137 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1137: +L1135: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,word ptr (-12)[ebp] +sub edi,dword ptr (-32)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1139 +mov dword ptr (-8)[ebp],108 +cmp dword ptr (-4)[ebp],0 +je L1141 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1141: +L1139: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,word ptr (-12)[ebp] +sub edi,dword ptr (-36)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1143 +mov dword ptr (-8)[ebp],109 +cmp dword ptr (-4)[ebp],0 +je L1145 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1145: +L1143: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +sub edi,dword ptr (-40)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1147 +mov dword ptr (-8)[ebp],110 +cmp dword ptr (-4)[ebp],0 +je L1149 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1149: +L1147: +mov word ptr (-12)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsub dword ptr (-56)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1151 +mov dword ptr (-8)[ebp],111 +cmp dword ptr (-4)[ebp],0 +je L1153 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1153: +L1151: +mov word ptr (-12)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsub qword ptr (-64)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,3 +je L1155 +mov dword ptr (-8)[ebp],112 +cmp dword ptr (-4)[ebp],0 +je L1157 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1157: +L1155: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +sub dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],3 +je L1159 +mov dword ptr (-8)[ebp],113 +cmp dword ptr (-4)[ebp],0 +je L1161 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1161: +L1159: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +sub dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],3 +je L1163 +mov dword ptr (-8)[ebp],114 +cmp dword ptr (-4)[ebp],0 +je L1165 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1165: +L1163: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +sub dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],3 +je L1167 +mov dword ptr (-8)[ebp],115 +cmp dword ptr (-4)[ebp],0 +je L1169 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1169: +L1167: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +sub dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],3 +je L1171 +mov dword ptr (-8)[ebp],116 +cmp dword ptr (-4)[ebp],0 +je L1173 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1173: +L1171: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +sub edi,dword ptr (-40)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],3 +je L1175 +mov dword ptr (-8)[ebp],117 +cmp dword ptr (-4)[ebp],0 +je L1177 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1177: +L1175: +mov dword ptr (-16)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-16)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsub dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],3 +je L1179 +mov dword ptr (-8)[ebp],118 +cmp dword ptr (-4)[ebp],0 +je L1181 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1181: +L1179: +mov dword ptr (-16)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-16)[ebp] +fsub qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],3 +je L1183 +mov dword ptr (-8)[ebp],119 +cmp dword ptr (-4)[ebp],0 +je L1185 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1185: +L1183: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +sub dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],3 +je L1187 +mov dword ptr (-8)[ebp],120 +cmp dword ptr (-4)[ebp],0 +je L1189 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1189: +L1187: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +sub dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],3 +je L1191 +mov dword ptr (-8)[ebp],121 +cmp dword ptr (-4)[ebp],0 +je L1193 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1193: +L1191: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +sub dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],3 +je L1195 +mov dword ptr (-8)[ebp],122 +cmp dword ptr (-4)[ebp],0 +je L1197 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1197: +L1195: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +sub dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],3 +je L1199 +mov dword ptr (-8)[ebp],123 +cmp dword ptr (-4)[ebp],0 +je L1201 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1201: +L1199: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +sub edi,dword ptr (-40)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],3 +je L1203 +mov dword ptr (-8)[ebp],124 +cmp dword ptr (-4)[ebp],0 +je L1205 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1205: +L1203: +mov dword ptr (-20)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-20)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsub dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],3 +je L1207 +mov dword ptr (-8)[ebp],125 +cmp dword ptr (-4)[ebp],0 +je L1209 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1209: +L1207: +mov dword ptr (-20)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-20)[ebp] +fsub qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],3 +je L1211 +mov dword ptr (-8)[ebp],126 +cmp dword ptr (-4)[ebp],0 +je L1213 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1213: +L1211: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-25)[ebp] +sub dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1215 +mov dword ptr (-8)[ebp],127 +cmp dword ptr (-4)[ebp],0 +je L1217 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1217: +L1215: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-28)[ebp] +sub dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1219 +mov dword ptr (-8)[ebp],128 +cmp dword ptr (-4)[ebp],0 +je L1221 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1221: +L1219: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-32)[ebp] +sub dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1223 +mov dword ptr (-8)[ebp],129 +cmp dword ptr (-4)[ebp],0 +je L1225 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1225: +L1223: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-36)[ebp] +sub dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1227 +mov dword ptr (-8)[ebp],130 +cmp dword ptr (-4)[ebp],0 +je L1229 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1229: +L1227: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +sub dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1231 +mov dword ptr (-8)[ebp],131 +cmp dword ptr (-4)[ebp],0 +je L1233 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1233: +L1231: +mov dword ptr (-24)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fsub dword ptr (-56)[ebp] +fstp dword ptr (-160)[ebp] +fld dword ptr (L828) +fcomp dword ptr (-160)[ebp] +fstsw ax +sahf +ja L1236 +fld dword ptr (-160)[ebp] +fsub dword ptr (L828) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-156)[ebp],edi +jmp L1237 +L1236: +fld dword ptr (-160)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-156)[ebp],edi +L1237: +mov edi,dword ptr (-156)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1238 +mov dword ptr (-8)[ebp],132 +cmp dword ptr (-4)[ebp],0 +je L1240 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1240: +L1238: +mov dword ptr (-24)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fsub qword ptr (-64)[ebp] +fstp qword ptr (-176)[ebp] +fld qword ptr (L836) +fcomp qword ptr (-176)[ebp] +fstsw ax +sahf +ja L1243 +fld qword ptr (-176)[ebp] +fsub qword ptr (L836) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-168)[ebp],edi +jmp L1244 +L1243: +fld qword ptr (-176)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-168)[ebp],edi +L1244: +mov edi,dword ptr (-168)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,3 +je L1245 +mov dword ptr (-8)[ebp],133 +cmp dword ptr (-4)[ebp],0 +je L1247 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1247: +L1245: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov byte ptr (-25)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1249 +mov dword ptr (-8)[ebp],134 +cmp dword ptr (-4)[ebp],0 +je L1252 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1252: +L1249: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov word ptr (-28)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1254 +mov dword ptr (-8)[ebp],135 +cmp dword ptr (-4)[ebp],0 +je L1256 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1256: +L1254: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-32)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1258 +mov dword ptr (-8)[ebp],136 +cmp dword ptr (-4)[ebp],0 +je L1260 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1260: +L1258: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-36)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-36)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1262 +mov dword ptr (-8)[ebp],137 +cmp dword ptr (-4)[ebp],0 +je L1264 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1264: +L1262: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld dword ptr (-44)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1266 +mov dword ptr (-8)[ebp],138 +cmp dword ptr (-4)[ebp],0 +je L1268 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1268: +L1266: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-44)[ebp] +fsub dword ptr (-56)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1270 +mov dword ptr (-8)[ebp],139 +cmp dword ptr (-4)[ebp],0 +je L1272 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1272: +L1270: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld dword ptr (-44)[ebp] +fsub qword ptr (-64)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L1251) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1274 +mov dword ptr (-8)[ebp],140 +cmp dword ptr (-4)[ebp],0 +je L1276 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1276: +L1274: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov byte ptr (-25)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1278 +mov dword ptr (-8)[ebp],141 +cmp dword ptr (-4)[ebp],0 +je L1281 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1281: +L1278: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov word ptr (-28)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fsubp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1283 +mov dword ptr (-8)[ebp],142 +cmp dword ptr (-4)[ebp],0 +je L1285 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1285: +L1283: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-32)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-32)[ebp] +fsubp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1287 +mov dword ptr (-8)[ebp],143 +cmp dword ptr (-4)[ebp],0 +je L1289 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1289: +L1287: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-36)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-36)[ebp] +fsubp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1291 +mov dword ptr (-8)[ebp],144 +cmp dword ptr (-4)[ebp],0 +je L1293 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1293: +L1291: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (-52)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fsubp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1295 +mov dword ptr (-8)[ebp],145 +cmp dword ptr (-4)[ebp],0 +je L1297 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1297: +L1295: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld qword ptr (-52)[ebp] +fsub dword ptr (-56)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1299 +mov dword ptr (-8)[ebp],146 +cmp dword ptr (-4)[ebp],0 +je L1301 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1301: +L1299: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-52)[ebp] +fsub qword ptr (-64)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1280) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1303 +mov dword ptr (-8)[ebp],147 +cmp dword ptr (-4)[ebp],0 +je L1305 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1305: +L1303: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +imul edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1307 +mov dword ptr (-8)[ebp],148 +cmp dword ptr (-4)[ebp],0 +je L1309 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1309: +L1307: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +imul edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1311 +mov dword ptr (-8)[ebp],149 +cmp dword ptr (-4)[ebp],0 +je L1313 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1313: +L1311: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-32)[ebp] +imul edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1315 +mov dword ptr (-8)[ebp],150 +cmp dword ptr (-4)[ebp],0 +je L1317 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1317: +L1315: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-36)[ebp] +imul edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1319 +mov dword ptr (-8)[ebp],151 +cmp dword ptr (-4)[ebp],0 +je L1321 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1321: +L1319: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov eax,edi +mul dword ptr (-40)[ebp] +mov edi,eax +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1323 +mov dword ptr (-8)[ebp],152 +cmp dword ptr (-4)[ebp],0 +je L1325 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1325: +L1323: +mov byte ptr (-9)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmul dword ptr (-56)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1327 +mov dword ptr (-8)[ebp],153 +cmp dword ptr (-4)[ebp],0 +je L1329 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1329: +L1327: +mov byte ptr (-9)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmul qword ptr (-64)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,10 +je L1331 +mov dword ptr (-8)[ebp],154 +cmp dword ptr (-4)[ebp],0 +je L1333 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1333: +L1331: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +imul edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1335 +mov dword ptr (-8)[ebp],155 +cmp dword ptr (-4)[ebp],0 +je L1337 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1337: +L1335: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +imul edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1339 +mov dword ptr (-8)[ebp],156 +cmp dword ptr (-4)[ebp],0 +je L1341 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1341: +L1339: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-32)[ebp] +imul edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1343 +mov dword ptr (-8)[ebp],157 +cmp dword ptr (-4)[ebp],0 +je L1345 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1345: +L1343: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-36)[ebp] +imul edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1347 +mov dword ptr (-8)[ebp],158 +cmp dword ptr (-4)[ebp],0 +je L1349 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1349: +L1347: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov eax,edi +mul dword ptr (-40)[ebp] +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1351 +mov dword ptr (-8)[ebp],159 +cmp dword ptr (-4)[ebp],0 +je L1353 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1353: +L1351: +mov word ptr (-12)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmul dword ptr (-56)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1355 +mov dword ptr (-8)[ebp],160 +cmp dword ptr (-4)[ebp],0 +je L1357 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1357: +L1355: +mov word ptr (-12)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmul qword ptr (-64)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,10 +je L1359 +mov dword ptr (-8)[ebp],161 +cmp dword ptr (-4)[ebp],0 +je L1361 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1361: +L1359: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-16)[ebp] +movsx esi,byte ptr (-25)[ebp] +imul edi,esi +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],10 +je L1363 +mov dword ptr (-8)[ebp],162 +cmp dword ptr (-4)[ebp],0 +je L1365 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1365: +L1363: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-16)[ebp] +movsx esi,word ptr (-28)[ebp] +imul edi,esi +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],10 +je L1367 +mov dword ptr (-8)[ebp],163 +cmp dword ptr (-4)[ebp],0 +je L1369 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1369: +L1367: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-32)[ebp] +imul edi,esi +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],10 +je L1371 +mov dword ptr (-8)[ebp],164 +cmp dword ptr (-4)[ebp],0 +je L1373 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1373: +L1371: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-36)[ebp] +imul edi,esi +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],10 +je L1375 +mov dword ptr (-8)[ebp],165 +cmp dword ptr (-4)[ebp],0 +je L1377 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1377: +L1375: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov eax,edi +mul dword ptr (-40)[ebp] +mov edi,eax +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],10 +je L1379 +mov dword ptr (-8)[ebp],166 +cmp dword ptr (-4)[ebp],0 +je L1381 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1381: +L1379: +mov dword ptr (-16)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-16)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmul dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],10 +je L1383 +mov dword ptr (-8)[ebp],167 +cmp dword ptr (-4)[ebp],0 +je L1385 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1385: +L1383: +mov dword ptr (-16)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-16)[ebp] +fmul qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],10 +je L1387 +mov dword ptr (-8)[ebp],168 +cmp dword ptr (-4)[ebp],0 +je L1389 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1389: +L1387: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-20)[ebp] +movsx esi,byte ptr (-25)[ebp] +imul edi,esi +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],10 +je L1391 +mov dword ptr (-8)[ebp],169 +cmp dword ptr (-4)[ebp],0 +je L1393 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1393: +L1391: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-20)[ebp] +movsx esi,word ptr (-28)[ebp] +imul edi,esi +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],10 +je L1395 +mov dword ptr (-8)[ebp],170 +cmp dword ptr (-4)[ebp],0 +je L1397 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1397: +L1395: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-32)[ebp] +imul edi,esi +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],10 +je L1399 +mov dword ptr (-8)[ebp],171 +cmp dword ptr (-4)[ebp],0 +je L1401 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1401: +L1399: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-36)[ebp] +imul edi,esi +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],10 +je L1403 +mov dword ptr (-8)[ebp],172 +cmp dword ptr (-4)[ebp],0 +je L1405 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1405: +L1403: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov eax,edi +mul dword ptr (-40)[ebp] +mov edi,eax +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],10 +je L1407 +mov dword ptr (-8)[ebp],173 +cmp dword ptr (-4)[ebp],0 +je L1409 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1409: +L1407: +mov dword ptr (-20)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-20)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmul dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],10 +je L1411 +mov dword ptr (-8)[ebp],174 +cmp dword ptr (-4)[ebp],0 +je L1413 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1413: +L1411: +mov dword ptr (-20)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-20)[ebp] +fmul qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],10 +je L1415 +mov dword ptr (-8)[ebp],175 +cmp dword ptr (-4)[ebp],0 +je L1417 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1417: +L1415: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-24)[ebp] +movsx edi,byte ptr (-25)[ebp] +mul edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1419 +mov dword ptr (-8)[ebp],176 +cmp dword ptr (-4)[ebp],0 +je L1421 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1421: +L1419: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-24)[ebp] +movsx edi,word ptr (-28)[ebp] +mul edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1423 +mov dword ptr (-8)[ebp],177 +cmp dword ptr (-4)[ebp],0 +je L1425 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1425: +L1423: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-32)[ebp] +mul edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1427 +mov dword ptr (-8)[ebp],178 +cmp dword ptr (-4)[ebp],0 +je L1429 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1429: +L1427: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-36)[ebp] +mul edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1431 +mov dword ptr (-8)[ebp],179 +cmp dword ptr (-4)[ebp],0 +je L1433 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1433: +L1431: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mul dword ptr (-40)[ebp] +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1435 +mov dword ptr (-8)[ebp],180 +cmp dword ptr (-4)[ebp],0 +je L1437 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1437: +L1435: +mov dword ptr (-24)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fmul dword ptr (-56)[ebp] +fstp dword ptr (-192)[ebp] +fld dword ptr (L828) +fcomp dword ptr (-192)[ebp] +fstsw ax +sahf +ja L1440 +fld dword ptr (-192)[ebp] +fsub dword ptr (L828) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-188)[ebp],edi +jmp L1441 +L1440: +fld dword ptr (-192)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-188)[ebp],edi +L1441: +mov edi,dword ptr (-188)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1442 +mov dword ptr (-8)[ebp],181 +cmp dword ptr (-4)[ebp],0 +je L1444 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1444: +L1442: +mov dword ptr (-24)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fmul qword ptr (-64)[ebp] +fstp qword ptr (-208)[ebp] +fld qword ptr (L836) +fcomp qword ptr (-208)[ebp] +fstsw ax +sahf +ja L1447 +fld qword ptr (-208)[ebp] +fsub qword ptr (L836) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-200)[ebp],edi +jmp L1448 +L1447: +fld qword ptr (-208)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-200)[ebp],edi +L1448: +mov edi,dword ptr (-200)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,10 +je L1449 +mov dword ptr (-8)[ebp],182 +cmp dword ptr (-4)[ebp],0 +je L1451 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1451: +L1449: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov byte ptr (-25)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1453 +mov dword ptr (-8)[ebp],183 +cmp dword ptr (-4)[ebp],0 +je L1456 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1456: +L1453: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov word ptr (-28)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1458 +mov dword ptr (-8)[ebp],184 +cmp dword ptr (-4)[ebp],0 +je L1460 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1460: +L1458: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-32)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1462 +mov dword ptr (-8)[ebp],185 +cmp dword ptr (-4)[ebp],0 +je L1464 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1464: +L1462: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-36)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-36)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1466 +mov dword ptr (-8)[ebp],186 +cmp dword ptr (-4)[ebp],0 +je L1468 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1468: +L1466: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld dword ptr (-44)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1470 +mov dword ptr (-8)[ebp],187 +cmp dword ptr (-4)[ebp],0 +je L1472 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1472: +L1470: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-44)[ebp] +fmul dword ptr (-56)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1474 +mov dword ptr (-8)[ebp],188 +cmp dword ptr (-4)[ebp],0 +je L1476 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1476: +L1474: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld dword ptr (-44)[ebp] +fmul qword ptr (-64)[ebp] +fstp dword ptr (-44)[ebp] +fld dword ptr (L1455) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1478 +mov dword ptr (-8)[ebp],189 +cmp dword ptr (-4)[ebp],0 +je L1480 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1480: +L1478: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov byte ptr (-25)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1482 +mov dword ptr (-8)[ebp],190 +cmp dword ptr (-4)[ebp],0 +je L1485 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1485: +L1482: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov word ptr (-28)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1487 +mov dword ptr (-8)[ebp],191 +cmp dword ptr (-4)[ebp],0 +je L1489 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1489: +L1487: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-32)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-32)[ebp] +fmulp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1491 +mov dword ptr (-8)[ebp],192 +cmp dword ptr (-4)[ebp],0 +je L1493 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1493: +L1491: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-36)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-36)[ebp] +fmulp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1495 +mov dword ptr (-8)[ebp],193 +cmp dword ptr (-4)[ebp],0 +je L1497 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1497: +L1495: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (-52)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fmulp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1499 +mov dword ptr (-8)[ebp],194 +cmp dword ptr (-4)[ebp],0 +je L1501 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1501: +L1499: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld qword ptr (-52)[ebp] +fmul dword ptr (-56)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1503 +mov dword ptr (-8)[ebp],195 +cmp dword ptr (-4)[ebp],0 +je L1505 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1505: +L1503: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-52)[ebp] +fmul qword ptr (-64)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1484) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1507 +mov dword ptr (-8)[ebp],196 +cmp dword ptr (-4)[ebp],0 +je L1509 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1509: +L1507: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1511 +mov dword ptr (-8)[ebp],197 +cmp dword ptr (-4)[ebp],0 +je L1513 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1513: +L1511: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1515 +mov dword ptr (-8)[ebp],198 +cmp dword ptr (-4)[ebp],0 +je L1517 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1517: +L1515: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1519 +mov dword ptr (-8)[ebp],199 +cmp dword ptr (-4)[ebp],0 +je L1521 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1521: +L1519: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1523 +mov dword ptr (-8)[ebp],200 +cmp dword ptr (-4)[ebp],0 +je L1525 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1525: +L1523: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,eax +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1527 +mov dword ptr (-8)[ebp],201 +cmp dword ptr (-4)[ebp],0 +je L1529 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1529: +L1527: +mov byte ptr (-9)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdiv dword ptr (-56)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1531 +mov dword ptr (-8)[ebp],202 +cmp dword ptr (-4)[ebp],0 +je L1533 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1533: +L1531: +mov byte ptr (-9)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,byte ptr (-9)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdiv qword ptr (-64)[ebp] +call __ftol +mov ebx,eax +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,2 +je L1535 +mov dword ptr (-8)[ebp],203 +cmp dword ptr (-4)[ebp],0 +je L1537 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1537: +L1535: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx eax,word ptr (-12)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1539 +mov dword ptr (-8)[ebp],204 +cmp dword ptr (-4)[ebp],0 +je L1541 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1541: +L1539: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx eax,word ptr (-12)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1543 +mov dword ptr (-8)[ebp],205 +cmp dword ptr (-4)[ebp],0 +je L1545 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1545: +L1543: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx eax,word ptr (-12)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1547 +mov dword ptr (-8)[ebp],206 +cmp dword ptr (-4)[ebp],0 +je L1549 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1549: +L1547: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx eax,word ptr (-12)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1551 +mov dword ptr (-8)[ebp],207 +cmp dword ptr (-4)[ebp],0 +je L1553 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1553: +L1551: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1555 +mov dword ptr (-8)[ebp],208 +cmp dword ptr (-4)[ebp],0 +je L1557 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1557: +L1555: +mov word ptr (-12)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdiv dword ptr (-56)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1559 +mov dword ptr (-8)[ebp],209 +cmp dword ptr (-4)[ebp],0 +je L1561 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1561: +L1559: +mov word ptr (-12)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +movsx edi,word ptr (-12)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdiv qword ptr (-64)[ebp] +call __ftol +mov edi,eax +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,2 +je L1563 +mov dword ptr (-8)[ebp],210 +cmp dword ptr (-4)[ebp],0 +je L1565 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1565: +L1563: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-16)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L1567 +mov dword ptr (-8)[ebp],211 +cmp dword ptr (-4)[ebp],0 +je L1569 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1569: +L1567: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-16)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L1571 +mov dword ptr (-8)[ebp],212 +cmp dword ptr (-4)[ebp],0 +je L1573 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1573: +L1571: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-16)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L1575 +mov dword ptr (-8)[ebp],213 +cmp dword ptr (-4)[ebp],0 +je L1577 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1577: +L1575: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-16)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L1579 +mov dword ptr (-8)[ebp],214 +cmp dword ptr (-4)[ebp],0 +je L1581 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1581: +L1579: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,eax +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],2 +je L1583 +mov dword ptr (-8)[ebp],215 +cmp dword ptr (-4)[ebp],0 +je L1585 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1585: +L1583: +mov dword ptr (-16)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-16)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdiv dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L1587 +mov dword ptr (-8)[ebp],216 +cmp dword ptr (-4)[ebp],0 +je L1589 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1589: +L1587: +mov dword ptr (-16)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-16)[ebp] +fdiv qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-16)[ebp],eax +cmp dword ptr (-16)[ebp],2 +je L1591 +mov dword ptr (-8)[ebp],217 +cmp dword ptr (-4)[ebp],0 +je L1593 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1593: +L1591: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-20)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L1595 +mov dword ptr (-8)[ebp],218 +cmp dword ptr (-4)[ebp],0 +je L1597 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1597: +L1595: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-20)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L1599 +mov dword ptr (-8)[ebp],219 +cmp dword ptr (-4)[ebp],0 +je L1601 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1601: +L1599: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-20)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L1603 +mov dword ptr (-8)[ebp],220 +cmp dword ptr (-4)[ebp],0 +je L1605 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1605: +L1603: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-20)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L1607 +mov dword ptr (-8)[ebp],221 +cmp dword ptr (-4)[ebp],0 +je L1609 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1609: +L1607: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,eax +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],2 +je L1611 +mov dword ptr (-8)[ebp],222 +cmp dword ptr (-4)[ebp],0 +je L1613 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1613: +L1611: +mov dword ptr (-20)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-20)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdiv dword ptr (-56)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L1615 +mov dword ptr (-8)[ebp],223 +cmp dword ptr (-4)[ebp],0 +je L1617 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1617: +L1615: +mov dword ptr (-20)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fild dword ptr (-20)[ebp] +fdiv qword ptr (-64)[ebp] +call __ftol +mov dword ptr (-20)[ebp],eax +cmp dword ptr (-20)[ebp],2 +je L1619 +mov dword ptr (-8)[ebp],224 +cmp dword ptr (-4)[ebp],0 +je L1621 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1621: +L1619: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-24)[ebp] +movsx edi,byte ptr (-25)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1623 +mov dword ptr (-8)[ebp],225 +cmp dword ptr (-4)[ebp],0 +je L1625 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1625: +L1623: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-24)[ebp] +movsx edi,word ptr (-28)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1627 +mov dword ptr (-8)[ebp],226 +cmp dword ptr (-4)[ebp],0 +je L1629 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1629: +L1627: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-32)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1631 +mov dword ptr (-8)[ebp],227 +cmp dword ptr (-4)[ebp],0 +je L1633 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1633: +L1631: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-36)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1635 +mov dword ptr (-8)[ebp],228 +cmp dword ptr (-4)[ebp],0 +je L1637 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1637: +L1635: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],eax +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1639 +mov dword ptr (-8)[ebp],229 +cmp dword ptr (-4)[ebp],0 +je L1641 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1641: +L1639: +mov dword ptr (-24)[ebp],5 +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fdiv dword ptr (-56)[ebp] +fstp dword ptr (-224)[ebp] +fld dword ptr (L828) +fcomp dword ptr (-224)[ebp] +fstsw ax +sahf +ja L1644 +fld dword ptr (-224)[ebp] +fsub dword ptr (L828) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-220)[ebp],edi +jmp L1645 +L1644: +fld dword ptr (-224)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-220)[ebp],edi +L1645: +mov edi,dword ptr (-220)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1646 +mov dword ptr (-8)[ebp],230 +cmp dword ptr (-4)[ebp],0 +je L1648 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1648: +L1646: +mov dword ptr (-24)[ebp],5 +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +mov edi,dword ptr (-24)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fdiv qword ptr (-64)[ebp] +fstp qword ptr (-240)[ebp] +fld qword ptr (L836) +fcomp qword ptr (-240)[ebp] +fstsw ax +sahf +ja L1651 +fld qword ptr (-240)[ebp] +fsub qword ptr (L836) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-232)[ebp],edi +jmp L1652 +L1651: +fld qword ptr (-240)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-232)[ebp],edi +L1652: +mov edi,dword ptr (-232)[ebp] +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,2 +je L1653 +mov dword ptr (-8)[ebp],231 +cmp dword ptr (-4)[ebp],0 +je L1655 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1655: +L1653: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov byte ptr (-25)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1657 +mov dword ptr (-8)[ebp],232 +cmp dword ptr (-4)[ebp],0 +je L1660 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1660: +L1657: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov word ptr (-28)[ebp],2 +fld dword ptr (-44)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1662 +mov dword ptr (-8)[ebp],233 +cmp dword ptr (-4)[ebp],0 +je L1664 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1664: +L1662: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-32)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1666 +mov dword ptr (-8)[ebp],234 +cmp dword ptr (-4)[ebp],0 +je L1668 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1668: +L1666: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-36)[ebp],2 +fld dword ptr (-44)[ebp] +mov edi,dword ptr (-36)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1670 +mov dword ptr (-8)[ebp],235 +cmp dword ptr (-4)[ebp],0 +je L1672 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1672: +L1670: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld dword ptr (-44)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1674 +mov dword ptr (-8)[ebp],236 +cmp dword ptr (-4)[ebp],0 +je L1676 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1676: +L1674: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld dword ptr (-44)[ebp] +fdiv dword ptr (-56)[ebp] +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1678 +mov dword ptr (-8)[ebp],237 +cmp dword ptr (-4)[ebp],0 +je L1680 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1680: +L1678: +fld dword ptr (L841) +fstp dword ptr (-44)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld dword ptr (-44)[ebp] +fdiv qword ptr (-64)[ebp] +fstp dword ptr (-44)[ebp] +fld qword ptr (L1659) +fcomp dword ptr (-44)[ebp] +fstsw ax +sahf +je L1682 +mov dword ptr (-8)[ebp],238 +cmp dword ptr (-4)[ebp],0 +je L1684 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1684: +L1682: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov byte ptr (-25)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,byte ptr (-25)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1686 +mov dword ptr (-8)[ebp],239 +cmp dword ptr (-4)[ebp],0 +je L1688 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1688: +L1686: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov word ptr (-28)[ebp],2 +fld qword ptr (-52)[ebp] +movsx edi,word ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1690 +mov dword ptr (-8)[ebp],240 +cmp dword ptr (-4)[ebp],0 +je L1692 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1692: +L1690: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-32)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-32)[ebp] +fdivp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1694 +mov dword ptr (-8)[ebp],241 +cmp dword ptr (-4)[ebp],0 +je L1696 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1696: +L1694: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-36)[ebp],2 +fld qword ptr (-52)[ebp] +fild dword ptr (-36)[ebp] +fdivp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1698 +mov dword ptr (-8)[ebp],242 +cmp dword ptr (-4)[ebp],0 +je L1700 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1700: +L1698: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (-52)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fdivp st(1),st +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1702 +mov dword ptr (-8)[ebp],243 +cmp dword ptr (-4)[ebp],0 +je L1704 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1704: +L1702: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld dword ptr (L529) +fstp dword ptr (-56)[ebp] +fld qword ptr (-52)[ebp] +fdiv dword ptr (-56)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1706 +mov dword ptr (-8)[ebp],244 +cmp dword ptr (-4)[ebp],0 +je L1708 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1708: +L1706: +fld qword ptr (L870) +fstp qword ptr (-52)[ebp] +fld qword ptr (L416) +fstp qword ptr (-64)[ebp] +fld qword ptr (-52)[ebp] +fdiv qword ptr (-64)[ebp] +fstp qword ptr (-52)[ebp] +fld qword ptr (L1659) +fcomp qword ptr (-52)[ebp] +fstsw ax +sahf +je L1710 +mov dword ptr (-8)[ebp],245 +cmp dword ptr (-4)[ebp],0 +je L1712 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1712: +L1710: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov ebx,edx +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1714 +mov dword ptr (-8)[ebp],246 +cmp dword ptr (-4)[ebp],0 +je L1716 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1716: +L1714: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov ebx,edx +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1718 +mov dword ptr (-8)[ebp],247 +cmp dword ptr (-4)[ebp],0 +je L1720 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1720: +L1718: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov ebx,edx +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1722 +mov dword ptr (-8)[ebp],248 +cmp dword ptr (-4)[ebp],0 +je L1724 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1724: +L1722: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx eax,byte ptr (-9)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov ebx,edx +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1726 +mov dword ptr (-8)[ebp],249 +cmp dword ptr (-4)[ebp],0 +je L1728 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1728: +L1726: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,edx +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1730 +mov dword ptr (-8)[ebp],250 +cmp dword ptr (-4)[ebp],0 +je L1732 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1732: +L1730: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx eax,word ptr (-12)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov edi,edx +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1734 +mov dword ptr (-8)[ebp],251 +cmp dword ptr (-4)[ebp],0 +je L1736 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1736: +L1734: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx eax,word ptr (-12)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov edi,edx +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1738 +mov dword ptr (-8)[ebp],252 +cmp dword ptr (-4)[ebp],0 +je L1740 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1740: +L1738: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx eax,word ptr (-12)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov edi,edx +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1742 +mov dword ptr (-8)[ebp],253 +cmp dword ptr (-4)[ebp],0 +je L1744 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1744: +L1742: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx eax,word ptr (-12)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov edi,edx +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1746 +mov dword ptr (-8)[ebp],254 +cmp dword ptr (-4)[ebp],0 +je L1748 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1748: +L1746: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,edx +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1750 +mov dword ptr (-8)[ebp],255 +cmp dword ptr (-4)[ebp],0 +je L1752 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1752: +L1750: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-16)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],edx +cmp dword ptr (-16)[ebp],1 +je L1754 +mov dword ptr (-8)[ebp],256 +cmp dword ptr (-4)[ebp],0 +je L1756 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1756: +L1754: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-16)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],edx +cmp dword ptr (-16)[ebp],1 +je L1758 +mov dword ptr (-8)[ebp],257 +cmp dword ptr (-4)[ebp],0 +je L1760 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1760: +L1758: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-16)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],edx +cmp dword ptr (-16)[ebp],1 +je L1762 +mov dword ptr (-8)[ebp],258 +cmp dword ptr (-4)[ebp],0 +je L1764 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1764: +L1762: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-16)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov dword ptr (-16)[ebp],edx +cmp dword ptr (-16)[ebp],1 +je L1766 +mov dword ptr (-8)[ebp],259 +cmp dword ptr (-4)[ebp],0 +je L1768 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1768: +L1766: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,edx +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],1 +je L1770 +mov dword ptr (-8)[ebp],260 +cmp dword ptr (-4)[ebp],0 +je L1772 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1772: +L1770: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-20)[ebp] +movsx edi,byte ptr (-25)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],edx +cmp dword ptr (-20)[ebp],1 +je L1774 +mov dword ptr (-8)[ebp],261 +cmp dword ptr (-4)[ebp],0 +je L1776 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1776: +L1774: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-20)[ebp] +movsx edi,word ptr (-28)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],edx +cmp dword ptr (-20)[ebp],1 +je L1778 +mov dword ptr (-8)[ebp],262 +cmp dword ptr (-4)[ebp],0 +je L1780 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1780: +L1778: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-20)[ebp] +mov edi,dword ptr (-32)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],edx +cmp dword ptr (-20)[ebp],1 +je L1782 +mov dword ptr (-8)[ebp],263 +cmp dword ptr (-4)[ebp],0 +je L1784 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1784: +L1782: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-20)[ebp] +mov edi,dword ptr (-36)[ebp] +cdq +idiv edi +mov dword ptr (-20)[ebp],edx +cmp dword ptr (-20)[ebp],1 +je L1786 +mov dword ptr (-8)[ebp],264 +cmp dword ptr (-4)[ebp],0 +je L1788 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1788: +L1786: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov eax,edi +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov edi,edx +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],1 +je L1790 +mov dword ptr (-8)[ebp],265 +cmp dword ptr (-4)[ebp],0 +je L1792 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1792: +L1790: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov eax,dword ptr (-24)[ebp] +movsx edi,byte ptr (-25)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],edx +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1794 +mov dword ptr (-8)[ebp],266 +cmp dword ptr (-4)[ebp],0 +je L1796 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1796: +L1794: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +mov eax,dword ptr (-24)[ebp] +movsx edi,word ptr (-28)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],edx +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1798 +mov dword ptr (-8)[ebp],267 +cmp dword ptr (-4)[ebp],0 +je L1800 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1800: +L1798: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-32)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],edx +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1802 +mov dword ptr (-8)[ebp],268 +cmp dword ptr (-4)[ebp],0 +je L1804 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1804: +L1802: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-36)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],edx +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1806 +mov dword ptr (-8)[ebp],269 +cmp dword ptr (-4)[ebp],0 +je L1808 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1808: +L1806: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov eax,dword ptr (-24)[ebp] +mov edi,dword ptr (-40)[ebp] +xor edx,edx +div edi +mov dword ptr (-24)[ebp],edx +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1810 +mov dword ptr (-8)[ebp],270 +cmp dword ptr (-4)[ebp],0 +je L1812 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1812: +L1810: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sar edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1814 +mov dword ptr (-8)[ebp],271 +cmp dword ptr (-4)[ebp],0 +je L1816 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1816: +L1814: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sar edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1818 +mov dword ptr (-8)[ebp],272 +cmp dword ptr (-4)[ebp],0 +je L1820 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1820: +L1818: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sar edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1822 +mov dword ptr (-8)[ebp],273 +cmp dword ptr (-4)[ebp],0 +je L1824 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1824: +L1822: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sar edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1826 +mov dword ptr (-8)[ebp],274 +cmp dword ptr (-4)[ebp],0 +je L1828 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1828: +L1826: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sar edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,1 +je L1830 +mov dword ptr (-8)[ebp],275 +cmp dword ptr (-4)[ebp],0 +je L1832 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1832: +L1830: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sar edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1834 +mov dword ptr (-8)[ebp],276 +cmp dword ptr (-4)[ebp],0 +je L1836 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1836: +L1834: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sar edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1838 +mov dword ptr (-8)[ebp],277 +cmp dword ptr (-4)[ebp],0 +je L1840 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1840: +L1838: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sar edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1842 +mov dword ptr (-8)[ebp],278 +cmp dword ptr (-4)[ebp],0 +je L1844 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1844: +L1842: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sar edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1846 +mov dword ptr (-8)[ebp],279 +cmp dword ptr (-4)[ebp],0 +je L1848 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1848: +L1846: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sar edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,1 +je L1850 +mov dword ptr (-8)[ebp],280 +cmp dword ptr (-4)[ebp],0 +je L1852 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1852: +L1850: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-16)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],1 +je L1854 +mov dword ptr (-8)[ebp],281 +cmp dword ptr (-4)[ebp],0 +je L1856 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1856: +L1854: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-16)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],1 +je L1858 +mov dword ptr (-8)[ebp],282 +cmp dword ptr (-4)[ebp],0 +je L1860 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1860: +L1858: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],1 +je L1862 +mov dword ptr (-8)[ebp],283 +cmp dword ptr (-4)[ebp],0 +je L1864 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1864: +L1862: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],1 +je L1866 +mov dword ptr (-8)[ebp],284 +cmp dword ptr (-4)[ebp],0 +je L1868 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1868: +L1866: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],1 +je L1870 +mov dword ptr (-8)[ebp],285 +cmp dword ptr (-4)[ebp],0 +je L1872 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1872: +L1870: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-20)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],1 +je L1874 +mov dword ptr (-8)[ebp],286 +cmp dword ptr (-4)[ebp],0 +je L1876 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1876: +L1874: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-20)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],1 +je L1878 +mov dword ptr (-8)[ebp],287 +cmp dword ptr (-4)[ebp],0 +je L1880 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1880: +L1878: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],1 +je L1882 +mov dword ptr (-8)[ebp],288 +cmp dword ptr (-4)[ebp],0 +je L1884 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1884: +L1882: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],1 +je L1886 +mov dword ptr (-8)[ebp],289 +cmp dword ptr (-4)[ebp],0 +je L1888 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1888: +L1886: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sar edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],1 +je L1890 +mov dword ptr (-8)[ebp],290 +cmp dword ptr (-4)[ebp],0 +je L1892 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1892: +L1890: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-24)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +shr edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1894 +mov dword ptr (-8)[ebp],291 +cmp dword ptr (-4)[ebp],0 +je L1896 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1896: +L1894: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-24)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +shr edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1898 +mov dword ptr (-8)[ebp],292 +cmp dword ptr (-4)[ebp],0 +je L1900 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1900: +L1898: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-24)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +shr edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1902 +mov dword ptr (-8)[ebp],293 +cmp dword ptr (-4)[ebp],0 +je L1904 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1904: +L1902: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-24)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +shr edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1906 +mov dword ptr (-8)[ebp],294 +cmp dword ptr (-4)[ebp],0 +je L1908 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1908: +L1906: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-24)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +shr edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,1 +je L1910 +mov dword ptr (-8)[ebp],295 +cmp dword ptr (-4)[ebp],0 +je L1912 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1912: +L1910: +mov byte ptr (-9)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sal edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,20 +je L1914 +mov dword ptr (-8)[ebp],296 +cmp dword ptr (-4)[ebp],0 +je L1916 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1916: +L1914: +mov byte ptr (-9)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sal edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,20 +je L1918 +mov dword ptr (-8)[ebp],297 +cmp dword ptr (-4)[ebp],0 +je L1920 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1920: +L1918: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sal edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,20 +je L1922 +mov dword ptr (-8)[ebp],298 +cmp dword ptr (-4)[ebp],0 +je L1924 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1924: +L1922: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sal edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,20 +je L1926 +mov dword ptr (-8)[ebp],299 +cmp dword ptr (-4)[ebp],0 +je L1928 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1928: +L1926: +mov byte ptr (-9)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,byte ptr (-9)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sal edi,cl +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,20 +je L1930 +mov dword ptr (-8)[ebp],300 +cmp dword ptr (-4)[ebp],0 +je L1932 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1932: +L1930: +mov word ptr (-12)[ebp],5 +mov byte ptr (-25)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sal edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,20 +je L1934 +mov dword ptr (-8)[ebp],301 +cmp dword ptr (-4)[ebp],0 +je L1936 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1936: +L1934: +mov word ptr (-12)[ebp],5 +mov word ptr (-28)[ebp],2 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sal edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,20 +je L1938 +mov dword ptr (-8)[ebp],302 +cmp dword ptr (-4)[ebp],0 +je L1940 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1940: +L1938: +mov word ptr (-12)[ebp],5 +mov dword ptr (-32)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sal edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,20 +je L1942 +mov dword ptr (-8)[ebp],303 +cmp dword ptr (-4)[ebp],0 +je L1944 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1944: +L1942: +mov word ptr (-12)[ebp],5 +mov dword ptr (-36)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sal edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,20 +je L1946 +mov dword ptr (-8)[ebp],304 +cmp dword ptr (-4)[ebp],0 +je L1948 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1948: +L1946: +mov word ptr (-12)[ebp],5 +mov dword ptr (-40)[ebp],2 +movsx edi,word ptr (-12)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sal edi,cl +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,20 +je L1950 +mov dword ptr (-8)[ebp],305 +cmp dword ptr (-4)[ebp],0 +je L1952 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1952: +L1950: +mov dword ptr (-16)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-16)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],20 +je L1954 +mov dword ptr (-8)[ebp],306 +cmp dword ptr (-4)[ebp],0 +je L1956 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1956: +L1954: +mov dword ptr (-16)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-16)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],20 +je L1958 +mov dword ptr (-8)[ebp],307 +cmp dword ptr (-4)[ebp],0 +je L1960 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1960: +L1958: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],20 +je L1962 +mov dword ptr (-8)[ebp],308 +cmp dword ptr (-4)[ebp],0 +je L1964 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1964: +L1962: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],20 +je L1966 +mov dword ptr (-8)[ebp],309 +cmp dword ptr (-4)[ebp],0 +je L1968 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1968: +L1966: +mov dword ptr (-16)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],20 +je L1970 +mov dword ptr (-8)[ebp],310 +cmp dword ptr (-4)[ebp],0 +je L1972 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1972: +L1970: +mov dword ptr (-20)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-20)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],20 +je L1974 +mov dword ptr (-8)[ebp],311 +cmp dword ptr (-4)[ebp],0 +je L1976 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1976: +L1974: +mov dword ptr (-20)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-20)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],20 +je L1978 +mov dword ptr (-8)[ebp],312 +cmp dword ptr (-4)[ebp],0 +je L1980 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1980: +L1978: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],20 +je L1982 +mov dword ptr (-8)[ebp],313 +cmp dword ptr (-4)[ebp],0 +je L1984 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1984: +L1982: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],20 +je L1986 +mov dword ptr (-8)[ebp],314 +cmp dword ptr (-4)[ebp],0 +je L1988 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1988: +L1986: +mov dword ptr (-20)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +sal edi,cl +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],20 +je L1990 +mov dword ptr (-8)[ebp],315 +cmp dword ptr (-4)[ebp],0 +je L1992 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1992: +L1990: +mov dword ptr (-24)[ebp],5 +mov byte ptr (-25)[ebp],2 +mov edi,dword ptr (-24)[ebp] +movsx esi,byte ptr (-25)[ebp] +mov ecx,esi +shl edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,20 +je L1994 +mov dword ptr (-8)[ebp],316 +cmp dword ptr (-4)[ebp],0 +je L1996 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L1996: +L1994: +mov dword ptr (-24)[ebp],5 +mov word ptr (-28)[ebp],2 +mov edi,dword ptr (-24)[ebp] +movsx esi,word ptr (-28)[ebp] +mov ecx,esi +shl edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,20 +je L1998 +mov dword ptr (-8)[ebp],317 +cmp dword ptr (-4)[ebp],0 +je L2000 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2000: +L1998: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (-24)[ebp] +mov esi,dword ptr (-32)[ebp] +mov ecx,esi +shl edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,20 +je L2002 +mov dword ptr (-8)[ebp],318 +cmp dword ptr (-4)[ebp],0 +je L2004 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2004: +L2002: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-36)[ebp],2 +mov edi,dword ptr (-24)[ebp] +mov esi,dword ptr (-36)[ebp] +mov ecx,esi +shl edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,20 +je L2006 +mov dword ptr (-8)[ebp],319 +cmp dword ptr (-4)[ebp],0 +je L2008 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2008: +L2006: +mov dword ptr (-24)[ebp],5 +mov dword ptr (-40)[ebp],2 +mov edi,dword ptr (-24)[ebp] +mov esi,dword ptr (-40)[ebp] +mov ecx,esi +shl edi,cl +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,20 +je L2010 +mov dword ptr (-8)[ebp],320 +cmp dword ptr (-4)[ebp],0 +je L2012 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2012: +L2010: +mov byte ptr (-9)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +and edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,8 +je L2014 +mov dword ptr (-8)[ebp],321 +cmp dword ptr (-4)[ebp],0 +je L2016 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2016: +L2014: +mov byte ptr (-9)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +and edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,8 +je L2018 +mov dword ptr (-8)[ebp],322 +cmp dword ptr (-4)[ebp],0 +je L2020 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2020: +L2018: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-32)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +and edi,dword ptr (-32)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,8 +je L2022 +mov dword ptr (-8)[ebp],323 +cmp dword ptr (-4)[ebp],0 +je L2024 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2024: +L2022: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-36)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +and edi,dword ptr (-36)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,8 +je L2026 +mov dword ptr (-8)[ebp],324 +cmp dword ptr (-4)[ebp],0 +je L2028 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2028: +L2026: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-40)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +and edi,dword ptr (-40)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,8 +je L2030 +mov dword ptr (-8)[ebp],325 +cmp dword ptr (-4)[ebp],0 +je L2032 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2032: +L2030: +mov word ptr (-12)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +and edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,8 +je L2034 +mov dword ptr (-8)[ebp],326 +cmp dword ptr (-4)[ebp],0 +je L2036 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2036: +L2034: +mov word ptr (-12)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +and edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,8 +je L2038 +mov dword ptr (-8)[ebp],327 +cmp dword ptr (-4)[ebp],0 +je L2040 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2040: +L2038: +mov word ptr (-12)[ebp],12 +mov dword ptr (-32)[ebp],10 +movsx edi,word ptr (-12)[ebp] +and edi,dword ptr (-32)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,8 +je L2042 +mov dword ptr (-8)[ebp],328 +cmp dword ptr (-4)[ebp],0 +je L2044 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2044: +L2042: +mov word ptr (-12)[ebp],12 +mov dword ptr (-36)[ebp],10 +movsx edi,word ptr (-12)[ebp] +and edi,dword ptr (-36)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,8 +je L2046 +mov dword ptr (-8)[ebp],329 +cmp dword ptr (-4)[ebp],0 +je L2048 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2048: +L2046: +mov word ptr (-12)[ebp],12 +mov dword ptr (-40)[ebp],10 +movsx edi,word ptr (-12)[ebp] +and edi,dword ptr (-40)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,8 +je L2050 +mov dword ptr (-8)[ebp],330 +cmp dword ptr (-4)[ebp],0 +je L2052 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2052: +L2050: +mov dword ptr (-16)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +and dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],8 +je L2054 +mov dword ptr (-8)[ebp],331 +cmp dword ptr (-4)[ebp],0 +je L2056 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2056: +L2054: +mov dword ptr (-16)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +and dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],8 +je L2058 +mov dword ptr (-8)[ebp],332 +cmp dword ptr (-4)[ebp],0 +je L2060 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2060: +L2058: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +and dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],8 +je L2062 +mov dword ptr (-8)[ebp],333 +cmp dword ptr (-4)[ebp],0 +je L2064 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2064: +L2062: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +and dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],8 +je L2066 +mov dword ptr (-8)[ebp],334 +cmp dword ptr (-4)[ebp],0 +je L2068 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2068: +L2066: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-16)[ebp] +and edi,dword ptr (-40)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],8 +je L2070 +mov dword ptr (-8)[ebp],335 +cmp dword ptr (-4)[ebp],0 +je L2072 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2072: +L2070: +mov dword ptr (-20)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +and dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],8 +je L2074 +mov dword ptr (-8)[ebp],336 +cmp dword ptr (-4)[ebp],0 +je L2076 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2076: +L2074: +mov dword ptr (-20)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +and dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],8 +je L2078 +mov dword ptr (-8)[ebp],337 +cmp dword ptr (-4)[ebp],0 +je L2080 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2080: +L2078: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +and dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],8 +je L2082 +mov dword ptr (-8)[ebp],338 +cmp dword ptr (-4)[ebp],0 +je L2084 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2084: +L2082: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +and dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],8 +je L2086 +mov dword ptr (-8)[ebp],339 +cmp dword ptr (-4)[ebp],0 +je L2088 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2088: +L2086: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-20)[ebp] +and edi,dword ptr (-40)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],8 +je L2090 +mov dword ptr (-8)[ebp],340 +cmp dword ptr (-4)[ebp],0 +je L2092 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2092: +L2090: +mov dword ptr (-24)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +and dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,8 +je L2094 +mov dword ptr (-8)[ebp],341 +cmp dword ptr (-4)[ebp],0 +je L2096 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2096: +L2094: +mov dword ptr (-24)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +and dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,8 +je L2098 +mov dword ptr (-8)[ebp],342 +cmp dword ptr (-4)[ebp],0 +je L2100 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2100: +L2098: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +and dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,8 +je L2102 +mov dword ptr (-8)[ebp],343 +cmp dword ptr (-4)[ebp],0 +je L2104 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2104: +L2102: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +and dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,8 +je L2106 +mov dword ptr (-8)[ebp],344 +cmp dword ptr (-4)[ebp],0 +je L2108 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2108: +L2106: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-40)[ebp] +and dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,8 +je L2110 +mov dword ptr (-8)[ebp],345 +cmp dword ptr (-4)[ebp],0 +je L2112 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2112: +L2110: +mov byte ptr (-9)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +xor edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,6 +je L2114 +mov dword ptr (-8)[ebp],346 +cmp dword ptr (-4)[ebp],0 +je L2116 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2116: +L2114: +mov byte ptr (-9)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +xor edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,6 +je L2118 +mov dword ptr (-8)[ebp],347 +cmp dword ptr (-4)[ebp],0 +je L2120 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2120: +L2118: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-32)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +xor edi,dword ptr (-32)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,6 +je L2122 +mov dword ptr (-8)[ebp],348 +cmp dword ptr (-4)[ebp],0 +je L2124 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2124: +L2122: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-36)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +xor edi,dword ptr (-36)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,6 +je L2126 +mov dword ptr (-8)[ebp],349 +cmp dword ptr (-4)[ebp],0 +je L2128 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2128: +L2126: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-40)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +xor edi,dword ptr (-40)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,6 +je L2130 +mov dword ptr (-8)[ebp],350 +cmp dword ptr (-4)[ebp],0 +je L2132 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2132: +L2130: +mov word ptr (-12)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +xor edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,6 +je L2134 +mov dword ptr (-8)[ebp],351 +cmp dword ptr (-4)[ebp],0 +je L2136 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2136: +L2134: +mov word ptr (-12)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +xor edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,6 +je L2138 +mov dword ptr (-8)[ebp],352 +cmp dword ptr (-4)[ebp],0 +je L2140 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2140: +L2138: +mov word ptr (-12)[ebp],12 +mov dword ptr (-32)[ebp],10 +movsx edi,word ptr (-12)[ebp] +xor edi,dword ptr (-32)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,6 +je L2142 +mov dword ptr (-8)[ebp],353 +cmp dword ptr (-4)[ebp],0 +je L2144 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2144: +L2142: +mov word ptr (-12)[ebp],12 +mov dword ptr (-36)[ebp],10 +movsx edi,word ptr (-12)[ebp] +xor edi,dword ptr (-36)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,6 +je L2146 +mov dword ptr (-8)[ebp],354 +cmp dword ptr (-4)[ebp],0 +je L2148 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2148: +L2146: +mov word ptr (-12)[ebp],12 +mov dword ptr (-40)[ebp],10 +movsx edi,word ptr (-12)[ebp] +xor edi,dword ptr (-40)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,6 +je L2150 +mov dword ptr (-8)[ebp],355 +cmp dword ptr (-4)[ebp],0 +je L2152 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2152: +L2150: +mov dword ptr (-16)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +xor dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],6 +je L2154 +mov dword ptr (-8)[ebp],356 +cmp dword ptr (-4)[ebp],0 +je L2156 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2156: +L2154: +mov dword ptr (-16)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +xor dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],6 +je L2158 +mov dword ptr (-8)[ebp],357 +cmp dword ptr (-4)[ebp],0 +je L2160 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2160: +L2158: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +xor dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],6 +je L2162 +mov dword ptr (-8)[ebp],358 +cmp dword ptr (-4)[ebp],0 +je L2164 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2164: +L2162: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +xor dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],6 +je L2166 +mov dword ptr (-8)[ebp],359 +cmp dword ptr (-4)[ebp],0 +je L2168 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2168: +L2166: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-16)[ebp] +xor edi,dword ptr (-40)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],6 +je L2170 +mov dword ptr (-8)[ebp],360 +cmp dword ptr (-4)[ebp],0 +je L2172 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2172: +L2170: +mov dword ptr (-20)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +xor dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],6 +je L2174 +mov dword ptr (-8)[ebp],361 +cmp dword ptr (-4)[ebp],0 +je L2176 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2176: +L2174: +mov dword ptr (-20)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +xor dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],6 +je L2178 +mov dword ptr (-8)[ebp],362 +cmp dword ptr (-4)[ebp],0 +je L2180 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2180: +L2178: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +xor dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],6 +je L2182 +mov dword ptr (-8)[ebp],363 +cmp dword ptr (-4)[ebp],0 +je L2184 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2184: +L2182: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +xor dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],6 +je L2186 +mov dword ptr (-8)[ebp],364 +cmp dword ptr (-4)[ebp],0 +je L2188 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2188: +L2186: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-20)[ebp] +xor edi,dword ptr (-40)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],6 +je L2190 +mov dword ptr (-8)[ebp],365 +cmp dword ptr (-4)[ebp],0 +je L2192 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2192: +L2190: +mov dword ptr (-24)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +xor dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,6 +je L2194 +mov dword ptr (-8)[ebp],366 +cmp dword ptr (-4)[ebp],0 +je L2196 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2196: +L2194: +mov dword ptr (-24)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +xor dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,6 +je L2198 +mov dword ptr (-8)[ebp],367 +cmp dword ptr (-4)[ebp],0 +je L2200 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2200: +L2198: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +xor dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,6 +je L2202 +mov dword ptr (-8)[ebp],368 +cmp dword ptr (-4)[ebp],0 +je L2204 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2204: +L2202: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +xor dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,6 +je L2206 +mov dword ptr (-8)[ebp],369 +cmp dword ptr (-4)[ebp],0 +je L2208 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2208: +L2206: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-40)[ebp] +xor dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,6 +je L2210 +mov dword ptr (-8)[ebp],370 +cmp dword ptr (-4)[ebp],0 +je L2212 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2212: +L2210: +mov byte ptr (-9)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +movsx esi,byte ptr (-25)[ebp] +or edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,14 +je L2214 +mov dword ptr (-8)[ebp],371 +cmp dword ptr (-4)[ebp],0 +je L2216 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2216: +L2214: +mov byte ptr (-9)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +movsx esi,word ptr (-28)[ebp] +or edi,esi +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,14 +je L2218 +mov dword ptr (-8)[ebp],372 +cmp dword ptr (-4)[ebp],0 +je L2220 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2220: +L2218: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-32)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +or edi,dword ptr (-32)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,14 +je L2222 +mov dword ptr (-8)[ebp],373 +cmp dword ptr (-4)[ebp],0 +je L2224 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2224: +L2222: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-36)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +or edi,dword ptr (-36)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,14 +je L2226 +mov dword ptr (-8)[ebp],374 +cmp dword ptr (-4)[ebp],0 +je L2228 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2228: +L2226: +mov byte ptr (-9)[ebp],12 +mov dword ptr (-40)[ebp],10 +movsx edi,byte ptr (-9)[ebp] +or edi,dword ptr (-40)[ebp] +mov ebx,edi +mov byte ptr (-9)[ebp],bl +movsx edi,byte ptr (-9)[ebp] +cmp edi,14 +je L2230 +mov dword ptr (-8)[ebp],375 +cmp dword ptr (-4)[ebp],0 +je L2232 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2232: +L2230: +mov word ptr (-12)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,word ptr (-12)[ebp] +movsx esi,byte ptr (-25)[ebp] +or edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,14 +je L2234 +mov dword ptr (-8)[ebp],376 +cmp dword ptr (-4)[ebp],0 +je L2236 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2236: +L2234: +mov word ptr (-12)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-12)[ebp] +movsx esi,word ptr (-28)[ebp] +or edi,esi +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,14 +je L2238 +mov dword ptr (-8)[ebp],377 +cmp dword ptr (-4)[ebp],0 +je L2240 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2240: +L2238: +mov word ptr (-12)[ebp],12 +mov dword ptr (-32)[ebp],10 +movsx edi,word ptr (-12)[ebp] +or edi,dword ptr (-32)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,14 +je L2242 +mov dword ptr (-8)[ebp],378 +cmp dword ptr (-4)[ebp],0 +je L2244 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2244: +L2242: +mov word ptr (-12)[ebp],12 +mov dword ptr (-36)[ebp],10 +movsx edi,word ptr (-12)[ebp] +or edi,dword ptr (-36)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,14 +je L2246 +mov dword ptr (-8)[ebp],379 +cmp dword ptr (-4)[ebp],0 +je L2248 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2248: +L2246: +mov word ptr (-12)[ebp],12 +mov dword ptr (-40)[ebp],10 +movsx edi,word ptr (-12)[ebp] +or edi,dword ptr (-40)[ebp] +mov word ptr (-12)[ebp],di +movsx edi,word ptr (-12)[ebp] +cmp edi,14 +je L2250 +mov dword ptr (-8)[ebp],380 +cmp dword ptr (-4)[ebp],0 +je L2252 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2252: +L2250: +mov dword ptr (-16)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +or dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],14 +je L2254 +mov dword ptr (-8)[ebp],381 +cmp dword ptr (-4)[ebp],0 +je L2256 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2256: +L2254: +mov dword ptr (-16)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +or dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],14 +je L2258 +mov dword ptr (-8)[ebp],382 +cmp dword ptr (-4)[ebp],0 +je L2260 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2260: +L2258: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +or dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],14 +je L2262 +mov dword ptr (-8)[ebp],383 +cmp dword ptr (-4)[ebp],0 +je L2264 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2264: +L2262: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +or dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],14 +je L2266 +mov dword ptr (-8)[ebp],384 +cmp dword ptr (-4)[ebp],0 +je L2268 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2268: +L2266: +mov dword ptr (-16)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-16)[ebp] +or edi,dword ptr (-40)[ebp] +mov dword ptr (-16)[ebp],edi +cmp dword ptr (-16)[ebp],14 +je L2270 +mov dword ptr (-8)[ebp],385 +cmp dword ptr (-4)[ebp],0 +je L2272 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2272: +L2270: +mov dword ptr (-20)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +or dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],14 +je L2274 +mov dword ptr (-8)[ebp],386 +cmp dword ptr (-4)[ebp],0 +je L2276 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2276: +L2274: +mov dword ptr (-20)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +or dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],14 +je L2278 +mov dword ptr (-8)[ebp],387 +cmp dword ptr (-4)[ebp],0 +je L2280 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2280: +L2278: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +or dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],14 +je L2282 +mov dword ptr (-8)[ebp],388 +cmp dword ptr (-4)[ebp],0 +je L2284 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2284: +L2282: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +or dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],14 +je L2286 +mov dword ptr (-8)[ebp],389 +cmp dword ptr (-4)[ebp],0 +je L2288 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2288: +L2286: +mov dword ptr (-20)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-20)[ebp] +or edi,dword ptr (-40)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],14 +je L2290 +mov dword ptr (-8)[ebp],390 +cmp dword ptr (-4)[ebp],0 +je L2292 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2292: +L2290: +mov dword ptr (-24)[ebp],12 +mov byte ptr (-25)[ebp],10 +movsx edi,byte ptr (-25)[ebp] +or dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,14 +je L2294 +mov dword ptr (-8)[ebp],391 +cmp dword ptr (-4)[ebp],0 +je L2296 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2296: +L2294: +mov dword ptr (-24)[ebp],12 +mov word ptr (-28)[ebp],10 +movsx edi,word ptr (-28)[ebp] +or dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,14 +je L2298 +mov dword ptr (-8)[ebp],392 +cmp dword ptr (-4)[ebp],0 +je L2300 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2300: +L2298: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-32)[ebp],10 +mov edi,dword ptr (-32)[ebp] +or dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,14 +je L2302 +mov dword ptr (-8)[ebp],393 +cmp dword ptr (-4)[ebp],0 +je L2304 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2304: +L2302: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-36)[ebp],10 +mov edi,dword ptr (-36)[ebp] +or dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,14 +je L2306 +mov dword ptr (-8)[ebp],394 +cmp dword ptr (-4)[ebp],0 +je L2308 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2308: +L2306: +mov dword ptr (-24)[ebp],12 +mov dword ptr (-40)[ebp],10 +mov edi,dword ptr (-40)[ebp] +or dword ptr (-24)[ebp],edi +mov edi,dword ptr (-24)[ebp] +cmp edi,14 +je L2310 +mov dword ptr (-8)[ebp],395 +cmp dword ptr (-4)[ebp],0 +je L2312 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L687) +push edi +call _printf +add esp,8 +L2312: +L2310: +cmp dword ptr (-8)[ebp],0 +je L2314 +mov dword ptr (-76)[ebp],1 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2316 +push 1 +lea edi,(L688) +push edi +call _printf +add esp,8 +L2316: +L2314: +mov eax,dword ptr (-76)[ebp] +L686: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L2319 label byte +db 115 +db 55 +db 49 +db 53 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L2320 label byte +db 115 +db 55 +db 49 +db 53 +db 32 +db 32 +db 32 +db 0 +public _s715 +_DATA ends +_TEXT segment +_s715: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,28 +mov dword ptr (-28)[ebp],0 +mov dword ptr (-20)[ebp],0 +lea edi,(L2320) +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-8)[ebp],edi +mov dword ptr (-16)[ebp],0 +L2321: +L2322: +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-4)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-4)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L2321 +mov dword ptr (-12)[ebp],1 +inc dword ptr (-12)[ebp] +inc dword ptr (-12)[ebp] +inc dword ptr (-12)[ebp] +inc dword ptr (-12)[ebp] +mov edi,dword ptr (-12)[ebp] +lea edi,(1)[edi] +mov dword ptr (-12)[ebp],edi +cmp edi,6 +je L2324 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2326 +push 1 +lea edi,(L2319) +push edi +call _printf +add esp,8 +L2326: +inc dword ptr (-16)[ebp] +L2324: +mov edi,dword ptr (-28)[ebp] +push edi +mov dword ptr (-24)[ebp],3 +mov edi,dword ptr (-24)[ebp] +lea edi,(2)[edi] +push edi +mov edi,dword ptr (-20)[ebp] +push edi +call _s715f +add esp,12 +cmp eax,5 +je L2328 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2330 +push 2 +lea edi,(L2319) +push edi +call _printf +add esp,8 +L2330: +add dword ptr (-16)[ebp],2 +L2328: +mov eax,dword ptr (-16)[ebp] +L2318: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _s715f +_s715f: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov eax,dword ptr (24)[ebp] +L2332: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L2334 label byte +db 115 +db 55 +db 50 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L2335 label byte +db 115 +db 55 +db 50 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s72 +_DATA ends +_TEXT segment +_s72: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,100 +lea edi,(L2335) +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-16)[ebp],edi +mov dword ptr (-24)[ebp],0 +L2336: +L2337: +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +mov esi,dword ptr (-12)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-12)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L2336 +mov dword ptr (-4)[ebp],2 +cmp dword ptr (-4)[ebp],2 +je L2339 +inc dword ptr (-24)[ebp] +push 1 +lea edi,(L2334) +push edi +call _printf +add esp,8 +L2339: +mov edi,dword ptr (-4)[ebp] +mov esi,edi +neg esi +lea edi,[esi][edi] +cmp edi,0 +je L2341 +add dword ptr (-24)[ebp],2 +push 2 +lea edi,(L2334) +push edi +call _printf +add esp,8 +L2341: +mov dword ptr (-4)[ebp],0 +mov dword ptr (-8)[ebp],0 +jmp L2346 +L2343: +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*2] +or edi,1 +mov dword ptr (-4)[ebp],edi +L2344: +inc dword ptr (-8)[ebp] +L2346: +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (4)[edi] +cmp dword ptr (-8)[ebp],edi +jl L2343 +mov edi,dword ptr (-4)[ebp] +not edi +cmp edi,0 +je L2347 +add dword ptr (-24)[ebp],4 +push 4 +lea edi,(L2334) +push edi +call _printf +add esp,8 +L2347: +mov dword ptr (-4)[ebp],5 +mov edi,dword ptr (-4)[ebp] +lea edi,(1)[edi] +mov dword ptr (-4)[ebp],edi +cmp edi,6 +jne L2354 +mov edi,dword ptr (-4)[ebp] +sub edi,1 +mov dword ptr (-4)[ebp],edi +cmp edi,5 +jne L2354 +mov edi,dword ptr (-4)[ebp] +lea esi,(1)[edi] +mov dword ptr (-4)[ebp],esi +cmp edi,5 +jne L2354 +mov edi,dword ptr (-4)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (-4)[ebp],esi +cmp edi,6 +jne L2354 +cmp dword ptr (-4)[ebp],5 +je L2349 +L2354: +add dword ptr (-24)[ebp],8 +push 8 +lea edi,(L2334) +push edi +call _printf +add esp,8 +L2349: +mov byte ptr (-29)[ebp],26 +mov dword ptr (-36)[ebp],26 +fld qword ptr (L2355) +fstp qword ptr (-48)[ebp] +mov word ptr (-32)[ebp],26 +mov dword ptr (-40)[ebp],26 +mov dword ptr (-28)[ebp],26 +fld dword ptr (L2356) +fstp dword ptr (-52)[ebp] +mov dword ptr (-20)[ebp],0 +movsx edi,word ptr (-32)[ebp] +mov ebx,edi +movsx edi,bl +cmp edi,26 +jne L2363 +mov edi,dword ptr (-28)[ebp] +mov ebx,edi +movsx edi,bl +cmp edi,26 +jne L2363 +mov edi,dword ptr (-36)[ebp] +mov ebx,edi +movsx edi,bl +cmp edi,26 +jne L2363 +mov edi,dword ptr (-40)[ebp] +mov ebx,edi +movsx edi,bl +cmp edi,26 +jne L2363 +fld dword ptr (-52)[ebp] +call __ftol +mov ebx,eax +movsx edi,bl +cmp edi,26 +jne L2363 +fld qword ptr (-48)[ebp] +call __ftol +mov ebx,eax +movsx edi,bl +cmp edi,26 +je L2357 +L2363: +inc dword ptr (-20)[ebp] +L2357: +movsx edi,byte ptr (-29)[ebp] +movsx edi,di +cmp edi,26 +jne L2370 +mov edi,dword ptr (-28)[ebp] +movsx edi,di +cmp edi,26 +jne L2370 +mov edi,dword ptr (-36)[ebp] +movsx edi,di +cmp edi,26 +jne L2370 +mov edi,dword ptr (-40)[ebp] +movsx edi,di +cmp edi,26 +jne L2370 +fld dword ptr (-52)[ebp] +call __ftol +mov edi,eax +movsx edi,di +cmp edi,26 +jne L2370 +fld qword ptr (-48)[ebp] +call __ftol +mov edi,eax +movsx edi,di +cmp edi,26 +je L2364 +L2370: +add dword ptr (-20)[ebp],2 +L2364: +movsx edi,byte ptr (-29)[ebp] +cmp edi,26 +jne L2377 +movsx edi,word ptr (-32)[ebp] +cmp edi,26 +jne L2377 +cmp dword ptr (-36)[ebp],26 +jne L2377 +mov edi,dword ptr (-40)[ebp] +cmp edi,26 +jne L2377 +fld dword ptr (-52)[ebp] +call __ftol +cmp eax,26 +jne L2377 +fld qword ptr (-48)[ebp] +call __ftol +cmp eax,26 +je L2371 +L2377: +add dword ptr (-20)[ebp],4 +L2371: +movsx edi,byte ptr (-29)[ebp] +cmp edi,26 +jne L2384 +movsx edi,word ptr (-32)[ebp] +cmp edi,26 +jne L2384 +cmp dword ptr (-28)[ebp],26 +jne L2384 +mov edi,dword ptr (-40)[ebp] +cmp edi,26 +jne L2384 +fld dword ptr (-52)[ebp] +call __ftol +cmp eax,26 +jne L2384 +fld qword ptr (-48)[ebp] +call __ftol +cmp eax,26 +je L2378 +L2384: +add dword ptr (-20)[ebp],8 +L2378: +movsx edi,byte ptr (-29)[ebp] +cmp edi,26 +jne L2393 +movsx edi,word ptr (-32)[ebp] +cmp edi,26 +jne L2393 +mov edi,dword ptr (-28)[ebp] +cmp edi,26 +jne L2393 +mov edi,dword ptr (-36)[ebp] +cmp edi,26 +jne L2393 +fld dword ptr (L828) +fcomp dword ptr (-52)[ebp] +fstsw ax +sahf +ja L2394 +fld dword ptr (-52)[ebp] +fsub dword ptr (L828) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-56)[ebp],edi +jmp L2395 +L2394: +fld dword ptr (-52)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-56)[ebp],edi +L2395: +mov edi,dword ptr (-56)[ebp] +cmp edi,26 +jne L2393 +fld qword ptr (L836) +fcomp qword ptr (-48)[ebp] +fstsw ax +sahf +ja L2396 +fld qword ptr (-48)[ebp] +fsub qword ptr (L836) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-60)[ebp],edi +jmp L2397 +L2396: +fld qword ptr (-48)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-60)[ebp],edi +L2397: +mov edi,dword ptr (-60)[ebp] +cmp edi,26 +je L2385 +L2393: +add dword ptr (-20)[ebp],16 +L2385: +movsx edi,byte ptr (-29)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2404 +movsx edi,word ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2404 +mov edi,dword ptr (-28)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2404 +mov edi,dword ptr (-36)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2404 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2404 +fld qword ptr (-48)[ebp] +sub esp,4 +fstp dword ptr 0[esp] +fld dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +je L2398 +L2404: +add dword ptr (-20)[ebp],32 +L2398: +movsx edi,byte ptr (-29)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2411 +movsx edi,word ptr (-32)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2411 +fild dword ptr (-28)[ebp] +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2411 +fild dword ptr (-36)[ebp] +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2411 +mov edi,dword ptr (-40)[ebp] +fld qword ptr (L596) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fld qword ptr (L2355) +fcompp +fstsw ax +sahf +jne L2411 +fld qword ptr (L2355) +fcomp dword ptr (-52)[ebp] +fstsw ax +sahf +je L2405 +L2411: +add dword ptr (-20)[ebp],64 +L2405: +cmp dword ptr (-20)[ebp],0 +je L2412 +add dword ptr (-24)[ebp],16 +push 16 +lea edi,(L2334) +push edi +call _printf +add esp,8 +L2412: +mov eax,dword ptr (-24)[ebp] +L2333: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L2415 label byte +db 115 +db 55 +db 53 +db 55 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L2416 label byte +db 115 +db 55 +db 53 +db 55 +db 32 +db 32 +db 32 +db 0 +public _s757 +_DATA ends +_TEXT segment +_s757: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,148 +lea edi,(L2416) +mov dword ptr (-112)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-116)[ebp],edi +mov dword ptr (-120)[ebp],0 +L2417: +L2418: +mov edi,dword ptr (-116)[ebp] +lea esi,(1)[edi] +mov dword ptr (-116)[ebp],esi +mov esi,dword ptr (-112)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-112)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L2417 +mov dword ptr (-124)[ebp],40 +mov edi,dword ptr (-124)[ebp] +lea esi,[edi*8] +lea esi,[esi*4] +cmp esi,1280 +jne L2422 +sar edi,3 +sar edi,2 +cmp edi,1 +je L2420 +L2422: +inc dword ptr (-120)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2423 +push 1 +lea edi,(L2415) +push edi +call _printf +add esp,8 +L2423: +L2420: +mov dword ptr (-84)[ebp],0 +mov dword ptr (-100)[ebp],0 +jmp L2428 +L2425: +mov dword ptr (-92)[ebp],1 +mov edi,dword ptr (-92)[ebp] +mov esi,dword ptr (20)[ebp] +mov esi,dword ptr (16)[esi] +sub esi,1 +mov ecx,esi +shl edi,cl +mov dword ptr (-96)[ebp],edi +mov dword ptr (-104)[ebp],0 +mov edi,dword ptr (-104)[ebp] +not edi +mov esi,dword ptr (-100)[ebp] +mov ebx,edi +mov ecx,esi +shr ebx,cl +mov dword ptr (-108)[ebp],ebx +mov ecx,esi +shl edi,cl +mov dword ptr (-104)[ebp],edi +mov dword ptr (-88)[ebp],0 +jmp L2432 +L2429: +mov edi,dword ptr (-100)[ebp] +cmp dword ptr (-88)[ebp],edi +jge L2440 +mov dword ptr (-132)[ebp],1 +jmp L2441 +L2440: +mov dword ptr (-132)[ebp],0 +L2441: +mov edi,dword ptr (-92)[ebp] +and edi,dword ptr (-104)[ebp] +cmp edi,0 +jne L2442 +mov dword ptr (-136)[ebp],1 +jmp L2443 +L2442: +mov dword ptr (-136)[ebp],0 +L2443: +mov edi,dword ptr (-136)[ebp] +cmp dword ptr (-132)[ebp],edi +jne L2439 +mov edi,dword ptr (-100)[ebp] +cmp dword ptr (-88)[ebp],edi +jge L2444 +mov dword ptr (-140)[ebp],1 +jmp L2445 +L2444: +mov dword ptr (-140)[ebp],0 +L2445: +mov edi,dword ptr (-96)[ebp] +and edi,dword ptr (-108)[ebp] +cmp edi,0 +jne L2446 +mov dword ptr (-144)[ebp],1 +jmp L2447 +L2446: +mov dword ptr (-144)[ebp],0 +L2447: +mov edi,dword ptr (-144)[ebp] +cmp dword ptr (-140)[ebp],edi +je L2433 +L2439: +mov dword ptr (-84)[ebp],1 +L2433: +mov edi,dword ptr (-92)[ebp] +lea edi,[edi*2] +mov dword ptr (-92)[ebp],edi +mov edi,dword ptr (-96)[ebp] +shr edi,1 +mov dword ptr (-96)[ebp],edi +L2430: +inc dword ptr (-88)[ebp] +L2432: +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (16)[edi] +cmp dword ptr (-88)[ebp],edi +jl L2429 +L2426: +inc dword ptr (-100)[ebp] +L2428: +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (16)[edi] +cmp dword ptr (-100)[ebp],edi +jl L2425 +cmp dword ptr (-84)[ebp],0 +je L2448 +add dword ptr (-120)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2450 +push 2 +lea edi,(L2415) +push edi +call _printf +add esp,8 +L2450: +L2448: +mov dword ptr (-16)[ebp],3 +mov dword ptr (-12)[ebp],2 +mov dword ptr (-8)[ebp],1 +mov edi,dword ptr (-12)[ebp] +cmp dword ptr (-16)[ebp],edi +jge L2458 +mov dword ptr (-136)[ebp],1 +jmp L2459 +L2458: +mov dword ptr (-136)[ebp],0 +L2459: +mov edi,dword ptr (-8)[ebp] +cmp dword ptr (-136)[ebp],edi +jge L2456 +mov dword ptr (-132)[ebp],1 +jmp L2457 +L2456: +mov dword ptr (-132)[ebp],0 +L2457: +cmp dword ptr (-132)[ebp],1 +je L2452 +add dword ptr (-120)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2460 +push 4 +lea edi,(L2415) +push edi +call _printf +add esp,8 +L2460: +L2452: +lea edi,(-76)[ebp] +lea esi,(-80)[ebp] +cmp edi,esi +jne L2462 +add dword ptr (-120)[ebp],8 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2465 +push 8 +lea edi,(L2415) +push edi +call _printf +add esp,8 +L2465: +L2462: +lea edi,(-76)[ebp] +lea esi,(-80)[ebp] +cmp edi,esi +jae L2467 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L2470 +lea edi,(L2472) +push edi +call _printf +add esp,4 +L2470: +L2467: +mov dword ptr (-84)[ebp],0 +mov dword ptr (-88)[ebp],0 +L2473: +mov edi,dword ptr (-88)[ebp] +mov dword ptr (-80)[ebp][edi*4],1 +L2474: +inc dword ptr (-88)[ebp] +cmp dword ptr (-88)[ebp],16 +jl L2473 +mov dword ptr (-76)[ebp],0 +mov dword ptr (-64)[ebp],0 +mov dword ptr (-56)[ebp],0 +mov dword ptr (-52)[ebp],0 +mov dword ptr (-44)[ebp],0 +mov dword ptr (-28)[ebp],0 +mov dword ptr (-16)[ebp],0 +L2483: +mov dword ptr (-12)[ebp],0 +L2487: +mov dword ptr (-8)[ebp],0 +L2491: +mov dword ptr (-4)[ebp],0 +L2495: +mov edi,dword ptr (-12)[ebp] +cmp dword ptr (-16)[ebp],edi +jge L2506 +mov dword ptr (-144)[ebp],1 +jmp L2507 +L2506: +mov dword ptr (-144)[ebp],0 +L2507: +mov edi,dword ptr (-4)[ebp] +cmp dword ptr (-8)[ebp],edi +jge L2508 +mov dword ptr (-148)[ebp],1 +jmp L2509 +L2508: +mov dword ptr (-148)[ebp],0 +L2509: +mov edi,dword ptr (-148)[ebp] +cmp dword ptr (-144)[ebp],edi +jne L2504 +mov dword ptr (-140)[ebp],1 +jmp L2505 +L2504: +mov dword ptr (-140)[ebp],0 +L2505: +mov edi,dword ptr (-16)[ebp] +mov esi,dword ptr (-12)[ebp] +lea esi,[esi*4] +lea edi,[esi][edi*8] +mov esi,dword ptr (-8)[ebp] +lea esi,[esi*2] +lea edi,[esi][edi] +mov esi,dword ptr (-4)[ebp] +lea edi,[esi][edi] +mov edi,dword ptr (-80)[ebp][edi*4] +cmp dword ptr (-140)[ebp],edi +je L2499 +mov dword ptr (-84)[ebp],1 +L2499: +L2496: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],2 +jl L2495 +L2492: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],2 +jl L2491 +L2488: +inc dword ptr (-12)[ebp] +cmp dword ptr (-12)[ebp],2 +jl L2487 +L2484: +inc dword ptr (-16)[ebp] +cmp dword ptr (-16)[ebp],2 +jl L2483 +cmp dword ptr (-84)[ebp],0 +je L2510 +add dword ptr (-120)[ebp],16 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2512 +push 16 +lea edi,(L2415) +push edi +call _printf +add esp,8 +L2512: +L2510: +mov dword ptr (-128)[ebp],0 +mov edi,dword ptr (-128)[ebp] +cmp edi,0 +je L2514 +add dword ptr (-120)[ebp],32 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2516 +push 32 +lea edi,(L2415) +push edi +call _printf +add esp,8 +L2516: +L2514: +mov eax,dword ptr (-120)[ebp] +L2414: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L2519 label byte +db 76 +db 111 +db 99 +db 97 +db 108 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 32 +db 37 +db 100 +db 46 +db 10 +db 0 +align 1 +L2520 label byte +db 115 +db 55 +db 56 +db 49 +db 51 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L2521 label byte +db 115 +db 55 +db 56 +db 49 +db 51 +db 32 +db 32 +db 0 +public _s7813 +_DATA ends +_TEXT segment +_s7813: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,88 +lea edi,(L2521) +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea esi,(60)[edi] +mov dword ptr (-28)[ebp],esi +mov dword ptr (-8)[ebp],0 +mov dword ptr (-32)[ebp],0 +mov edi,dword ptr (48)[edi] +mov dword ptr (-4)[ebp],edi +L2522: +L2523: +mov edi,dword ptr (-28)[ebp] +lea esi,(1)[edi] +mov dword ptr (-28)[ebp],esi +mov esi,dword ptr (-24)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-24)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L2522 +jmp L2525 +mov dword ptr (-8)[ebp],1 +cmp dword ptr (-4)[ebp],0 +je L2527 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2527: +L2525: +jmp L2529 +mov dword ptr (-8)[ebp],2 +cmp dword ptr (-4)[ebp],0 +je L2531 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2531: +L2529: +jmp L2533 +mov dword ptr (-8)[ebp],3 +cmp dword ptr (-4)[ebp],0 +je L2535 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2535: +L2533: +jmp L2537 +mov dword ptr (-8)[ebp],4 +cmp dword ptr (-4)[ebp],0 +je L2539 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2539: +L2537: +jmp L2541 +mov dword ptr (-8)[ebp],5 +cmp dword ptr (-4)[ebp],0 +je L2543 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2543: +L2541: +jmp L2545 +mov dword ptr (-8)[ebp],6 +cmp dword ptr (-4)[ebp],0 +je L2547 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2547: +L2545: +jmp L2549 +mov dword ptr (-8)[ebp],7 +cmp dword ptr (-4)[ebp],0 +je L2551 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2551: +L2549: +jmp L2553 +mov dword ptr (-8)[ebp],8 +cmp dword ptr (-4)[ebp],0 +je L2555 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2555: +L2553: +jmp L2557 +mov dword ptr (-8)[ebp],9 +cmp dword ptr (-4)[ebp],0 +je L2559 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2559: +L2557: +jmp L2561 +mov dword ptr (-8)[ebp],10 +cmp dword ptr (-4)[ebp],0 +je L2563 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2563: +L2561: +jmp L2565 +mov dword ptr (-8)[ebp],11 +cmp dword ptr (-4)[ebp],0 +je L2567 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2567: +L2565: +jmp L2569 +mov dword ptr (-8)[ebp],12 +cmp dword ptr (-4)[ebp],0 +je L2571 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2571: +L2569: +jmp L2573 +mov dword ptr (-8)[ebp],13 +cmp dword ptr (-4)[ebp],0 +je L2575 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2575: +L2573: +jmp L2577 +mov dword ptr (-8)[ebp],14 +cmp dword ptr (-4)[ebp],0 +je L2579 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2579: +L2577: +jmp L2581 +mov dword ptr (-8)[ebp],15 +cmp dword ptr (-4)[ebp],0 +je L2583 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2583: +L2581: +jmp L2585 +mov dword ptr (-8)[ebp],16 +cmp dword ptr (-4)[ebp],0 +je L2587 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2587: +L2585: +jmp L2589 +mov dword ptr (-8)[ebp],17 +cmp dword ptr (-4)[ebp],0 +je L2591 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2591: +L2589: +jmp L2593 +mov dword ptr (-8)[ebp],18 +cmp dword ptr (-4)[ebp],0 +je L2595 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2595: +L2593: +jmp L2597 +mov dword ptr (-8)[ebp],16 +cmp dword ptr (-4)[ebp],0 +je L2599 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2599: +L2597: +jmp L2601 +mov dword ptr (-8)[ebp],20 +cmp dword ptr (-4)[ebp],0 +je L2603 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2603: +L2601: +jmp L2605 +mov dword ptr (-8)[ebp],21 +cmp dword ptr (-4)[ebp],0 +je L2607 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2607: +L2605: +jmp L2609 +mov dword ptr (-8)[ebp],22 +cmp dword ptr (-4)[ebp],0 +je L2611 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2611: +L2609: +jmp L2613 +mov dword ptr (-8)[ebp],23 +cmp dword ptr (-4)[ebp],0 +je L2615 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2615: +L2613: +jmp L2617 +mov dword ptr (-8)[ebp],24 +cmp dword ptr (-4)[ebp],0 +je L2619 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2619: +L2617: +jmp L2621 +mov dword ptr (-8)[ebp],25 +cmp dword ptr (-4)[ebp],0 +je L2623 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2623: +L2621: +jmp L2625 +mov dword ptr (-8)[ebp],26 +cmp dword ptr (-4)[ebp],0 +je L2627 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2627: +L2625: +jmp L2629 +mov dword ptr (-8)[ebp],27 +cmp dword ptr (-4)[ebp],0 +je L2631 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2631: +L2629: +jmp L2633 +mov dword ptr (-8)[ebp],28 +cmp dword ptr (-4)[ebp],0 +je L2635 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2635: +L2633: +jmp L2637 +mov dword ptr (-8)[ebp],26 +cmp dword ptr (-4)[ebp],0 +je L2639 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2639: +L2637: +jmp L2641 +mov dword ptr (-8)[ebp],30 +cmp dword ptr (-4)[ebp],0 +je L2643 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2643: +L2641: +jmp L2645 +mov dword ptr (-8)[ebp],31 +cmp dword ptr (-4)[ebp],0 +je L2647 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2647: +L2645: +jmp L2649 +mov dword ptr (-8)[ebp],32 +cmp dword ptr (-4)[ebp],0 +je L2651 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2651: +L2649: +jmp L2653 +mov dword ptr (-8)[ebp],33 +cmp dword ptr (-4)[ebp],0 +je L2655 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2655: +L2653: +jmp L2657 +mov dword ptr (-8)[ebp],34 +cmp dword ptr (-4)[ebp],0 +je L2659 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2659: +L2657: +jmp L2661 +mov dword ptr (-8)[ebp],35 +cmp dword ptr (-4)[ebp],0 +je L2663 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2663: +L2661: +jmp L2665 +mov dword ptr (-8)[ebp],36 +cmp dword ptr (-4)[ebp],0 +je L2667 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2667: +L2665: +jmp L2669 +mov dword ptr (-8)[ebp],37 +cmp dword ptr (-4)[ebp],0 +je L2671 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2671: +L2669: +jmp L2673 +mov dword ptr (-8)[ebp],38 +cmp dword ptr (-4)[ebp],0 +je L2675 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2675: +L2673: +jmp L2677 +mov dword ptr (-8)[ebp],39 +cmp dword ptr (-4)[ebp],0 +je L2679 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2679: +L2677: +jmp L2681 +mov dword ptr (-8)[ebp],40 +cmp dword ptr (-4)[ebp],0 +je L2683 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2683: +L2681: +jmp L2685 +mov dword ptr (-8)[ebp],41 +cmp dword ptr (-4)[ebp],0 +je L2687 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2687: +L2685: +jmp L2689 +mov dword ptr (-8)[ebp],42 +cmp dword ptr (-4)[ebp],0 +je L2691 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2691: +L2689: +jmp L2693 +mov dword ptr (-8)[ebp],43 +cmp dword ptr (-4)[ebp],0 +je L2695 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2695: +L2693: +jmp L2697 +mov dword ptr (-8)[ebp],44 +cmp dword ptr (-4)[ebp],0 +je L2699 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2699: +L2697: +jmp L2701 +mov dword ptr (-8)[ebp],45 +cmp dword ptr (-4)[ebp],0 +je L2703 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2703: +L2701: +jmp L2705 +mov dword ptr (-8)[ebp],46 +cmp dword ptr (-4)[ebp],0 +je L2707 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2707: +L2705: +jmp L2709 +mov dword ptr (-8)[ebp],47 +cmp dword ptr (-4)[ebp],0 +je L2711 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2711: +L2709: +jmp L2713 +mov dword ptr (-8)[ebp],48 +cmp dword ptr (-4)[ebp],0 +je L2715 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2715: +L2713: +jmp L2717 +mov dword ptr (-8)[ebp],49 +cmp dword ptr (-4)[ebp],0 +je L2719 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2719: +L2717: +jmp L2721 +mov dword ptr (-8)[ebp],50 +cmp dword ptr (-4)[ebp],0 +je L2723 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2723: +L2721: +jmp L2725 +mov dword ptr (-8)[ebp],51 +cmp dword ptr (-4)[ebp],0 +je L2727 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2727: +L2725: +jmp L2729 +mov dword ptr (-8)[ebp],52 +cmp dword ptr (-4)[ebp],0 +je L2731 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2731: +L2729: +jmp L2733 +mov dword ptr (-8)[ebp],53 +cmp dword ptr (-4)[ebp],0 +je L2735 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2735: +L2733: +jmp L2737 +mov dword ptr (-8)[ebp],54 +cmp dword ptr (-4)[ebp],0 +je L2739 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2739: +L2737: +jmp L2741 +mov dword ptr (-8)[ebp],55 +cmp dword ptr (-4)[ebp],0 +je L2743 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2743: +L2741: +jmp L2745 +mov dword ptr (-8)[ebp],56 +cmp dword ptr (-4)[ebp],0 +je L2747 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2747: +L2745: +jmp L2749 +mov dword ptr (-8)[ebp],57 +cmp dword ptr (-4)[ebp],0 +je L2751 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2751: +L2749: +jmp L2753 +mov dword ptr (-8)[ebp],58 +cmp dword ptr (-4)[ebp],0 +je L2755 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2755: +L2753: +jmp L2757 +mov dword ptr (-8)[ebp],56 +cmp dword ptr (-4)[ebp],0 +je L2759 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2759: +L2757: +jmp L2761 +mov dword ptr (-8)[ebp],60 +cmp dword ptr (-4)[ebp],0 +je L2763 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2763: +L2761: +jmp L2765 +mov dword ptr (-8)[ebp],61 +cmp dword ptr (-4)[ebp],0 +je L2767 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2767: +L2765: +jmp L2769 +mov dword ptr (-8)[ebp],62 +cmp dword ptr (-4)[ebp],0 +je L2771 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2771: +L2769: +jmp L2773 +mov dword ptr (-8)[ebp],63 +cmp dword ptr (-4)[ebp],0 +je L2775 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2775: +L2773: +jmp L2777 +mov dword ptr (-8)[ebp],64 +cmp dword ptr (-4)[ebp],0 +je L2779 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2779: +L2777: +jmp L2781 +mov dword ptr (-8)[ebp],65 +cmp dword ptr (-4)[ebp],0 +je L2783 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2783: +L2781: +jmp L2785 +mov dword ptr (-8)[ebp],66 +cmp dword ptr (-4)[ebp],0 +je L2787 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2787: +L2785: +jmp L2789 +mov dword ptr (-8)[ebp],67 +cmp dword ptr (-4)[ebp],0 +je L2791 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2791: +L2789: +jmp L2793 +mov dword ptr (-8)[ebp],68 +cmp dword ptr (-4)[ebp],0 +je L2795 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2795: +L2793: +jmp L2797 +mov dword ptr (-8)[ebp],69 +cmp dword ptr (-4)[ebp],0 +je L2799 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2799: +L2797: +jmp L2801 +mov dword ptr (-8)[ebp],70 +cmp dword ptr (-4)[ebp],0 +je L2803 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2803: +L2801: +jmp L2805 +mov dword ptr (-8)[ebp],71 +cmp dword ptr (-4)[ebp],0 +je L2807 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2807: +L2805: +jmp L2809 +mov dword ptr (-8)[ebp],72 +cmp dword ptr (-4)[ebp],0 +je L2811 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2811: +L2809: +jmp L2813 +mov dword ptr (-8)[ebp],73 +cmp dword ptr (-4)[ebp],0 +je L2815 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2815: +L2813: +jmp L2817 +mov dword ptr (-8)[ebp],74 +cmp dword ptr (-4)[ebp],0 +je L2819 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2819: +L2817: +jmp L2821 +mov dword ptr (-8)[ebp],75 +cmp dword ptr (-4)[ebp],0 +je L2823 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2823: +L2821: +cmp dword ptr (-8)[ebp],0 +je L2825 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2827 +push 1 +lea edi,(L2520) +push edi +call _printf +add esp,8 +L2827: +inc dword ptr (-32)[ebp] +L2825: +mov dword ptr (-8)[ebp],0 +mov dword ptr (-16)[ebp],0 +mov dword ptr (-12)[ebp],0 +mov edi,dword ptr (-12)[ebp] +lea esi,(1)[edi] +mov dword ptr (-12)[ebp],esi +cmp edi,0 +je L2830 +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +cmp edi,0 +je L2830 +mov dword ptr (-44)[ebp],1 +jmp L2831 +L2830: +mov dword ptr (-44)[ebp],0 +L2831: +mov edi,dword ptr (-44)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],1 +je L2832 +mov dword ptr (-8)[ebp],1 +cmp dword ptr (-4)[ebp],0 +je L2834 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2834: +L2832: +cmp dword ptr (-16)[ebp],0 +je L2836 +mov dword ptr (-8)[ebp],2 +cmp dword ptr (-4)[ebp],0 +je L2838 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2838: +L2836: +cmp dword ptr (-20)[ebp],0 +je L2840 +mov dword ptr (-8)[ebp],3 +cmp dword ptr (-4)[ebp],0 +je L2842 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2842: +L2840: +cmp dword ptr (-12)[ebp],0 +je L2845 +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +cmp edi,0 +je L2845 +mov dword ptr (-48)[ebp],1 +jmp L2846 +L2845: +mov dword ptr (-48)[ebp],0 +L2846: +mov edi,dword ptr (-48)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],1 +je L2847 +mov dword ptr (-8)[ebp],4 +cmp dword ptr (-4)[ebp],0 +je L2849 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2849: +L2847: +cmp dword ptr (-16)[ebp],1 +je L2851 +mov dword ptr (-8)[ebp],5 +cmp dword ptr (-4)[ebp],0 +je L2853 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2853: +L2851: +cmp dword ptr (-20)[ebp],0 +je L2855 +mov dword ptr (-8)[ebp],6 +cmp dword ptr (-4)[ebp],0 +je L2857 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2857: +L2855: +mov edi,dword ptr (-12)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (-12)[ebp],esi +cmp edi,0 +je L2860 +cmp dword ptr (-16)[ebp],0 +je L2860 +mov dword ptr (-52)[ebp],1 +jmp L2861 +L2860: +mov dword ptr (-52)[ebp],0 +L2861: +mov edi,dword ptr (-52)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],0 +je L2862 +mov dword ptr (-8)[ebp],7 +cmp dword ptr (-4)[ebp],0 +je L2864 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2864: +L2862: +cmp dword ptr (-16)[ebp],1 +je L2866 +mov dword ptr (-8)[ebp],8 +cmp dword ptr (-4)[ebp],0 +je L2868 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2868: +L2866: +cmp dword ptr (-20)[ebp],1 +je L2870 +mov dword ptr (-8)[ebp],9 +cmp dword ptr (-4)[ebp],0 +je L2872 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2872: +L2870: +cmp dword ptr (-12)[ebp],0 +je L2875 +mov edi,dword ptr (-16)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (-16)[ebp],esi +cmp edi,0 +je L2875 +mov dword ptr (-56)[ebp],1 +jmp L2876 +L2875: +mov dword ptr (-56)[ebp],0 +L2876: +mov edi,dword ptr (-56)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],0 +je L2877 +mov dword ptr (-8)[ebp],10 +cmp dword ptr (-4)[ebp],0 +je L2879 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2879: +L2877: +cmp dword ptr (-16)[ebp],1 +je L2881 +mov dword ptr (-8)[ebp],11 +cmp dword ptr (-4)[ebp],0 +je L2883 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2883: +L2881: +cmp dword ptr (-20)[ebp],0 +je L2885 +mov dword ptr (-8)[ebp],12 +cmp dword ptr (-4)[ebp],0 +je L2887 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2887: +L2885: +cmp dword ptr (-8)[ebp],0 +je L2889 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2891 +push 2 +lea edi,(L2520) +push edi +call _printf +add esp,8 +L2891: +add dword ptr (-32)[ebp],2 +L2889: +mov dword ptr (-8)[ebp],0 +mov dword ptr (-16)[ebp],0 +mov dword ptr (-12)[ebp],0 +mov edi,dword ptr (-12)[ebp] +lea esi,(1)[edi] +mov dword ptr (-12)[ebp],esi +cmp edi,0 +jne L2896 +cmp dword ptr (-16)[ebp],0 +je L2894 +L2896: +mov dword ptr (-60)[ebp],1 +jmp L2895 +L2894: +mov dword ptr (-60)[ebp],0 +L2895: +mov edi,dword ptr (-60)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],1 +je L2897 +mov dword ptr (-8)[ebp],1 +cmp dword ptr (-4)[ebp],0 +je L2899 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2899: +L2897: +cmp dword ptr (-16)[ebp],0 +je L2901 +mov dword ptr (-8)[ebp],2 +cmp dword ptr (-4)[ebp],0 +je L2903 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2903: +L2901: +cmp dword ptr (-20)[ebp],0 +je L2905 +mov dword ptr (-8)[ebp],3 +cmp dword ptr (-4)[ebp],0 +je L2907 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2907: +L2905: +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +cmp edi,0 +jne L2912 +cmp dword ptr (-12)[ebp],0 +je L2910 +L2912: +mov dword ptr (-64)[ebp],1 +jmp L2911 +L2910: +mov dword ptr (-64)[ebp],0 +L2911: +mov edi,dword ptr (-64)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],1 +je L2913 +mov dword ptr (-8)[ebp],4 +cmp dword ptr (-4)[ebp],0 +je L2915 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2915: +L2913: +cmp dword ptr (-16)[ebp],1 +je L2917 +mov dword ptr (-8)[ebp],5 +cmp dword ptr (-4)[ebp],0 +je L2919 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2919: +L2917: +cmp dword ptr (-20)[ebp],1 +je L2921 +mov dword ptr (-8)[ebp],6 +cmp dword ptr (-4)[ebp],0 +je L2923 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2923: +L2921: +mov edi,dword ptr (-12)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (-12)[ebp],esi +cmp edi,0 +jne L2928 +mov edi,dword ptr (-16)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (-16)[ebp],esi +cmp edi,0 +je L2926 +L2928: +mov dword ptr (-68)[ebp],1 +jmp L2927 +L2926: +mov dword ptr (-68)[ebp],0 +L2927: +mov edi,dword ptr (-68)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],0 +je L2929 +mov dword ptr (-8)[ebp],7 +cmp dword ptr (-4)[ebp],0 +je L2931 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2931: +L2929: +cmp dword ptr (-16)[ebp],1 +je L2933 +mov dword ptr (-8)[ebp],8 +cmp dword ptr (-4)[ebp],0 +je L2935 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2935: +L2933: +cmp dword ptr (-20)[ebp],1 +je L2937 +mov dword ptr (-8)[ebp],9 +cmp dword ptr (-4)[ebp],0 +je L2939 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2939: +L2937: +cmp dword ptr (-12)[ebp],0 +jne L2944 +mov edi,dword ptr (-16)[ebp] +mov esi,edi +sub esi,1 +mov dword ptr (-16)[ebp],esi +cmp edi,0 +je L2942 +L2944: +mov dword ptr (-72)[ebp],1 +jmp L2943 +L2942: +mov dword ptr (-72)[ebp],0 +L2943: +mov edi,dword ptr (-72)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-12)[ebp],0 +je L2945 +mov dword ptr (-8)[ebp],10 +cmp dword ptr (-4)[ebp],0 +je L2947 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2947: +L2945: +cmp dword ptr (-16)[ebp],0 +je L2949 +mov dword ptr (-8)[ebp],11 +cmp dword ptr (-4)[ebp],0 +je L2951 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2951: +L2949: +cmp dword ptr (-20)[ebp],1 +je L2953 +mov dword ptr (-8)[ebp],12 +cmp dword ptr (-4)[ebp],0 +je L2955 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L2519) +push edi +call _printf +add esp,8 +L2955: +L2953: +cmp dword ptr (-8)[ebp],0 +je L2957 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2959 +push 4 +lea edi,(L2520) +push edi +call _printf +add esp,8 +L2959: +add dword ptr (-32)[ebp],4 +L2957: +mov dword ptr (-16)[ebp],0 +mov dword ptr (-12)[ebp],0 +mov dword ptr (-36)[ebp],0 +mov dword ptr (-40)[ebp],1 +cmp dword ptr (-40)[ebp],0 +je L2963 +mov edi,dword ptr (-36)[ebp] +mov dword ptr (-76)[ebp],edi +jmp L2964 +L2963: +cmp dword ptr (-40)[ebp],0 +je L2965 +mov edi,dword ptr (-12)[ebp] +lea esi,(1)[edi] +mov dword ptr (-12)[ebp],esi +mov dword ptr (-80)[ebp],edi +jmp L2966 +L2965: +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +mov dword ptr (-80)[ebp],edi +L2966: +mov edi,dword ptr (-80)[ebp] +mov dword ptr (-76)[ebp],edi +L2964: +mov edi,dword ptr (-76)[ebp] +mov dword ptr (-20)[ebp],edi +cmp dword ptr (-20)[ebp],0 +jne L2970 +cmp dword ptr (-12)[ebp],0 +jne L2970 +cmp dword ptr (-16)[ebp],0 +je L2967 +L2970: +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2971 +push 8 +lea edi,(L2520) +push edi +call _printf +add esp,8 +L2971: +add dword ptr (-32)[ebp],8 +L2967: +cmp dword ptr (-40)[ebp],0 +je L2978 +mov edi,dword ptr (-36)[ebp] +mov dword ptr (-84)[ebp],edi +jmp L2979 +L2978: +mov dword ptr (-84)[ebp],1 +L2979: +cmp dword ptr (-84)[ebp],0 +jne L2977 +cmp dword ptr (-36)[ebp],0 +je L2980 +mov dword ptr (-88)[ebp],1 +jmp L2981 +L2980: +mov edi,dword ptr (-36)[ebp] +mov dword ptr (-88)[ebp],edi +L2981: +cmp dword ptr (-88)[ebp],0 +je L2973 +L2977: +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L2982 +push 16 +lea edi,(L2520) +push edi +call _printf +add esp,8 +L2982: +add dword ptr (-32)[ebp],16 +L2973: +mov eax,dword ptr (-32)[ebp] +L2518: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L2985 label byte +db 115 +db 56 +db 49 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L2986 label byte +db 115 +db 56 +db 49 +db 32 +db 32 +db 32 +db 32 +db 0 +align 1 +L2987 label byte +db 82 +db 101 +db 103 +db 105 +db 115 +db 116 +db 101 +db 114 +db 32 +db 99 +db 111 +db 117 +db 110 +db 116 +db 32 +db 102 +db 111 +db 114 +db 32 +db 37 +db 115 +db 32 +db 105 +db 115 +db 32 +db 117 +db 110 +db 114 +db 101 +db 108 +db 105 +db 97 +db 98 +db 108 +db 101 +db 46 +db 10 +db 0 +align 1 +L2988 label byte +db 37 +db 100 +db 32 +db 114 +db 101 +db 103 +db 105 +db 115 +db 116 +db 101 +db 114 +db 115 +db 32 +db 97 +db 115 +db 115 +db 105 +db 103 +db 110 +db 101 +db 100 +db 32 +db 116 +db 111 +db 32 +db 37 +db 115 +db 32 +db 118 +db 97 +db 114 +db 105 +db 97 +db 98 +db 108 +db 101 +db 115 +db 46 +db 10 +db 0 +public _s81 +_DATA ends +_TEXT segment +_s81: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,56 +mov dword ptr (-56)[ebp],0 +mov dword ptr (-44)[ebp],0 +mov dword ptr (-48)[ebp],0 +mov dword ptr (-52)[ebp],0 +lea edi,(L2986) +mov dword ptr (-36)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-40)[ebp],edi +L2989: +L2990: +mov edi,dword ptr (-40)[ebp] +lea esi,(1)[edi] +mov dword ptr (-40)[ebp],esi +mov esi,dword ptr (-36)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-36)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L2989 +mov dword ptr (-16)[ebp],1 +mov dword ptr (-20)[ebp],0 +L2992: +mov edi,dword ptr (-16)[ebp] +mov ebx,edi +mov byte ptr (-1)[ebp],bl +mov byte ptr (-21)[ebp],bl +lea esi,(-16)[ebp] +mov dword ptr (-8)[ebp],esi +lea esi,(-16)[ebp] +mov dword ptr (-28)[ebp],esi +mov dword ptr (-12)[ebp],edi +mov dword ptr (-32)[ebp],edi +movsx edi,byte ptr (-1)[ebp] +movsx esi,byte ptr (-21)[ebp] +cmp edi,esi +je L2996 +mov dword ptr (-44)[ebp],1 +L2996: +mov edi,dword ptr (-8)[ebp] +mov esi,dword ptr (-28)[ebp] +cmp edi,esi +je L2998 +mov dword ptr (-48)[ebp],1 +L2998: +mov edi,dword ptr (-32)[ebp] +cmp dword ptr (-12)[ebp],edi +je L3000 +mov dword ptr (-52)[ebp],1 +L3000: +sal dword ptr (-16)[ebp],1 +L2993: +inc dword ptr (-20)[ebp] +cmp dword ptr (-20)[ebp],50 +jl L2992 +cmp dword ptr (-44)[ebp],0 +je L3002 +inc dword ptr (-56)[ebp] +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3004 +push 1 +lea edi,(L2985) +push edi +call _printf +add esp,8 +L3004: +L3002: +cmp dword ptr (-48)[ebp],0 +je L3006 +add dword ptr (-56)[ebp],2 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3008 +push 2 +lea edi,(L2985) +push edi +call _printf +add esp,8 +L3008: +L3006: +cmp dword ptr (-52)[ebp],0 +je L3010 +add dword ptr (-56)[ebp],4 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3012 +push 4 +lea edi,(L2985) +push edi +call _printf +add esp,8 +L3012: +L3010: +call _regc +add esp,0 +mov dword ptr (-16)[ebp],eax +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L3014 +cmp dword ptr (-16)[ebp],0 +jge L3016 +lea edi,(L425) +push edi +lea edi,(L2987) +push edi +call _printf +add esp,8 +jmp L3017 +L3016: +lea edi,(L425) +push edi +mov edi,dword ptr (-16)[ebp] +push edi +lea edi,(L2988) +push edi +call _printf +add esp,12 +L3017: +L3014: +call _regp +add esp,0 +mov dword ptr (-16)[ebp],eax +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L3018 +cmp dword ptr (-16)[ebp],0 +jge L3020 +lea edi,(L3022) +push edi +lea edi,(L2987) +push edi +call _printf +add esp,8 +jmp L3021 +L3020: +lea edi,(L3022) +push edi +mov edi,dword ptr (-16)[ebp] +push edi +lea edi,(L2988) +push edi +call _printf +add esp,12 +L3021: +L3018: +call _regi +add esp,0 +mov dword ptr (-16)[ebp],eax +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L3023 +cmp dword ptr (-16)[ebp],0 +jge L3025 +lea edi,(L426) +push edi +lea edi,(L2987) +push edi +call _printf +add esp,8 +jmp L3026 +L3025: +lea edi,(L426) +push edi +mov edi,dword ptr (-16)[ebp] +push edi +lea edi,(L2988) +push edi +call _printf +add esp,12 +L3026: +L3023: +mov eax,dword ptr (-56)[ebp] +L2984: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _regc +_regc: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,148 +mov byte ptr (-138)[ebp],0 +mov byte ptr (-117)[ebp],1 +mov byte ptr (-118)[ebp],2 +mov byte ptr (-119)[ebp],3 +mov byte ptr (-1)[ebp],4 +mov byte ptr (-120)[ebp],5 +mov byte ptr (-2)[ebp],6 +mov byte ptr (-121)[ebp],7 +mov byte ptr (-3)[ebp],8 +mov byte ptr (-122)[ebp],9 +mov byte ptr (-4)[ebp],10 +mov byte ptr (-123)[ebp],11 +mov byte ptr (-5)[ebp],12 +mov byte ptr (-124)[ebp],13 +mov byte ptr (-6)[ebp],14 +mov byte ptr (-125)[ebp],15 +mov byte ptr (-7)[ebp],16 +mov byte ptr (-126)[ebp],17 +mov byte ptr (-8)[ebp],18 +mov byte ptr (-127)[ebp],19 +mov byte ptr (-9)[ebp],20 +mov byte ptr (-128)[ebp],21 +mov byte ptr (-10)[ebp],22 +mov byte ptr (-129)[ebp],23 +mov byte ptr (-11)[ebp],24 +mov byte ptr (-130)[ebp],25 +mov byte ptr (-12)[ebp],26 +mov byte ptr (-131)[ebp],27 +mov byte ptr (-13)[ebp],28 +mov byte ptr (-132)[ebp],29 +mov byte ptr (-14)[ebp],30 +mov byte ptr (-133)[ebp],31 +mov byte ptr (-15)[ebp],32 +mov byte ptr (-134)[ebp],33 +mov byte ptr (-16)[ebp],34 +mov byte ptr (-135)[ebp],35 +mov byte ptr (-136)[ebp],36 +mov byte ptr (-137)[ebp],37 +mov byte ptr (-139)[ebp],38 +lea edi,(-117)[ebp] +lea esi,(-138)[ebp] +mov ebx,edi +sub ebx,esi +mov esi,ebx +mov dword ptr (-104)[ebp],esi +lea esi,(-118)[ebp] +sub esi,edi +mov edi,esi +mov dword ptr (-100)[ebp],edi +lea edi,(-119)[ebp] +lea esi,(-118)[ebp] +sub edi,esi +mov dword ptr (-96)[ebp],edi +lea edi,(-120)[ebp] +lea esi,(-119)[ebp] +sub edi,esi +mov dword ptr (-92)[ebp],edi +lea edi,(-121)[ebp] +lea esi,(-120)[ebp] +sub edi,esi +mov dword ptr (-88)[ebp],edi +lea edi,(-122)[ebp] +lea esi,(-121)[ebp] +sub edi,esi +mov dword ptr (-84)[ebp],edi +lea edi,(-123)[ebp] +lea esi,(-122)[ebp] +sub edi,esi +mov dword ptr (-80)[ebp],edi +lea edi,(-124)[ebp] +lea esi,(-123)[ebp] +sub edi,esi +mov dword ptr (-76)[ebp],edi +lea edi,(-125)[ebp] +lea esi,(-124)[ebp] +sub edi,esi +mov dword ptr (-72)[ebp],edi +lea edi,(-126)[ebp] +lea esi,(-125)[ebp] +sub edi,esi +mov dword ptr (-68)[ebp],edi +lea edi,(-127)[ebp] +lea esi,(-126)[ebp] +sub edi,esi +mov dword ptr (-64)[ebp],edi +lea edi,(-128)[ebp] +lea esi,(-127)[ebp] +sub edi,esi +mov dword ptr (-60)[ebp],edi +lea edi,(-129)[ebp] +lea esi,(-128)[ebp] +sub edi,esi +mov dword ptr (-56)[ebp],edi +lea edi,(-130)[ebp] +lea esi,(-129)[ebp] +sub edi,esi +mov dword ptr (-52)[ebp],edi +lea edi,(-131)[ebp] +lea esi,(-130)[ebp] +sub edi,esi +mov dword ptr (-48)[ebp],edi +lea edi,(-132)[ebp] +lea esi,(-131)[ebp] +sub edi,esi +mov dword ptr (-44)[ebp],edi +lea edi,(-133)[ebp] +lea esi,(-132)[ebp] +sub edi,esi +mov dword ptr (-40)[ebp],edi +lea edi,(-134)[ebp] +lea esi,(-133)[ebp] +sub edi,esi +mov dword ptr (-36)[ebp],edi +lea edi,(-135)[ebp] +lea esi,(-134)[ebp] +sub edi,esi +mov dword ptr (-32)[ebp],edi +lea edi,(-136)[ebp] +lea esi,(-135)[ebp] +sub edi,esi +mov dword ptr (-28)[ebp],edi +lea edi,(-137)[ebp] +lea esi,(-136)[ebp] +sub edi,esi +mov dword ptr (-24)[ebp],edi +lea edi,(-139)[ebp] +lea esi,(-137)[ebp] +sub edi,esi +mov dword ptr (-20)[ebp],edi +mov edi,dword ptr (-104)[ebp] +mov dword ptr (-116)[ebp],edi +mov dword ptr (-112)[ebp],1 +mov dword ptr (-108)[ebp],0 +L3049: +mov edi,dword ptr (-112)[ebp] +cmp edi,1 +je L3055 +cmp edi,2 +je L3058 +cmp edi,3 +je L3063 +jmp L3053 +L3055: +mov edi,dword ptr (-108)[ebp] +mov esi,dword ptr (-116)[ebp] +cmp dword ptr (-104)[ebp][edi*4],esi +je L3054 +mov edi,dword ptr (-108)[ebp] +mov edi,dword ptr (-104)[ebp][edi*4] +mov dword ptr (-148)[ebp],edi +mov dword ptr (-112)[ebp],2 +mov dword ptr (-144)[ebp],1 +jmp L3054 +L3058: +mov edi,dword ptr (-108)[ebp] +mov esi,dword ptr (-116)[ebp] +cmp dword ptr (-104)[ebp][edi*4],esi +jne L3059 +mov dword ptr (-112)[ebp],3 +jmp L3054 +L3059: +mov edi,dword ptr (-108)[ebp] +mov esi,dword ptr (-148)[ebp] +cmp dword ptr (-104)[ebp][edi*4],esi +jne L3061 +inc dword ptr (-144)[ebp] +jmp L3054 +L3061: +mov dword ptr (-112)[ebp],4 +jmp L3054 +L3063: +mov edi,dword ptr (-108)[ebp] +mov esi,dword ptr (-116)[ebp] +cmp dword ptr (-104)[ebp][edi*4],esi +je L3054 +mov dword ptr (-112)[ebp],4 +L3053: +L3054: +L3050: +inc dword ptr (-108)[ebp] +cmp dword ptr (-108)[ebp],22 +jl L3049 +cmp dword ptr (-112)[ebp],3 +jne L3066 +mov edi,16 +mov eax,edi +sub eax,dword ptr (-144)[ebp] +jmp L3027 +L3066: +mov eax,-1 +L3027: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _regi +_regi: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,264 +mov dword ptr (-252)[ebp],0 +mov dword ptr (-168)[ebp],1 +mov dword ptr (-172)[ebp],2 +mov dword ptr (-176)[ebp],3 +mov dword ptr (-4)[ebp],4 +mov dword ptr (-180)[ebp],5 +mov dword ptr (-8)[ebp],6 +mov dword ptr (-184)[ebp],7 +mov dword ptr (-12)[ebp],8 +mov dword ptr (-188)[ebp],9 +mov dword ptr (-16)[ebp],10 +mov dword ptr (-192)[ebp],11 +mov dword ptr (-20)[ebp],12 +mov dword ptr (-196)[ebp],13 +mov dword ptr (-24)[ebp],14 +mov dword ptr (-200)[ebp],15 +mov dword ptr (-28)[ebp],16 +mov dword ptr (-204)[ebp],17 +mov dword ptr (-32)[ebp],18 +mov dword ptr (-208)[ebp],19 +mov dword ptr (-36)[ebp],20 +mov dword ptr (-212)[ebp],21 +mov dword ptr (-40)[ebp],22 +mov dword ptr (-216)[ebp],23 +mov dword ptr (-44)[ebp],24 +mov dword ptr (-220)[ebp],25 +mov dword ptr (-48)[ebp],26 +mov dword ptr (-224)[ebp],27 +mov dword ptr (-52)[ebp],28 +mov dword ptr (-228)[ebp],29 +mov dword ptr (-56)[ebp],30 +mov dword ptr (-232)[ebp],31 +mov dword ptr (-60)[ebp],32 +mov dword ptr (-236)[ebp],33 +mov dword ptr (-64)[ebp],34 +mov dword ptr (-240)[ebp],35 +mov dword ptr (-244)[ebp],36 +mov dword ptr (-248)[ebp],37 +mov dword ptr (-256)[ebp],38 +lea edi,(-168)[ebp] +mov esi,4 +lea ebx,(-252)[ebp] +mov edx,edi +sub edx,ebx +mov eax,edx +cdq +idiv esi +mov dword ptr (-152)[ebp],eax +lea ebx,(-172)[ebp] +sub ebx,edi +mov eax,ebx +cdq +idiv esi +mov dword ptr (-148)[ebp],eax +lea edi,(-176)[ebp] +lea esi,(-172)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-144)[ebp],eax +lea edi,(-180)[ebp] +lea esi,(-176)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-140)[ebp],eax +lea edi,(-184)[ebp] +lea esi,(-180)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-136)[ebp],eax +lea edi,(-188)[ebp] +lea esi,(-184)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-132)[ebp],eax +lea edi,(-192)[ebp] +lea esi,(-188)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-128)[ebp],eax +lea edi,(-196)[ebp] +lea esi,(-192)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-124)[ebp],eax +lea edi,(-200)[ebp] +lea esi,(-196)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-120)[ebp],eax +lea edi,(-204)[ebp] +lea esi,(-200)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-116)[ebp],eax +lea edi,(-208)[ebp] +lea esi,(-204)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-112)[ebp],eax +lea edi,(-212)[ebp] +lea esi,(-208)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-108)[ebp],eax +lea edi,(-216)[ebp] +lea esi,(-212)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-104)[ebp],eax +lea edi,(-220)[ebp] +lea esi,(-216)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-100)[ebp],eax +lea edi,(-224)[ebp] +lea esi,(-220)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-96)[ebp],eax +lea edi,(-228)[ebp] +lea esi,(-224)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-92)[ebp],eax +lea edi,(-232)[ebp] +lea esi,(-228)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-88)[ebp],eax +lea edi,(-236)[ebp] +lea esi,(-232)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-84)[ebp],eax +lea edi,(-240)[ebp] +lea esi,(-236)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-80)[ebp],eax +lea edi,(-244)[ebp] +lea esi,(-240)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-76)[ebp],eax +lea edi,(-248)[ebp] +lea esi,(-244)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-72)[ebp],eax +lea edi,(-256)[ebp] +lea esi,(-248)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-68)[ebp],eax +mov edi,dword ptr (-152)[ebp] +mov dword ptr (-164)[ebp],edi +mov dword ptr (-160)[ebp],1 +mov dword ptr (-156)[ebp],0 +L3090: +mov edi,dword ptr (-160)[ebp] +cmp edi,1 +je L3096 +cmp edi,2 +je L3099 +cmp edi,3 +je L3104 +jmp L3094 +L3096: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-164)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +je L3095 +mov edi,dword ptr (-156)[ebp] +mov edi,dword ptr (-152)[ebp][edi*4] +mov dword ptr (-264)[ebp],edi +mov dword ptr (-160)[ebp],2 +mov dword ptr (-260)[ebp],1 +jmp L3095 +L3099: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-164)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +jne L3100 +mov dword ptr (-160)[ebp],3 +jmp L3095 +L3100: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-264)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +jne L3102 +inc dword ptr (-260)[ebp] +jmp L3095 +L3102: +mov dword ptr (-160)[ebp],4 +jmp L3095 +L3104: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-164)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +je L3095 +mov dword ptr (-160)[ebp],4 +L3094: +L3095: +L3091: +inc dword ptr (-156)[ebp] +cmp dword ptr (-156)[ebp],22 +jl L3090 +cmp dword ptr (-160)[ebp],3 +jne L3107 +mov edi,16 +mov eax,edi +sub eax,dword ptr (-260)[ebp] +jmp L3068 +L3107: +mov eax,-1 +L3068: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _regp +_regp: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,264 +lea edi,(-252)[ebp] +mov dword ptr (-252)[ebp],edi +lea edi,(-228)[ebp] +mov dword ptr (-228)[ebp],edi +lea edi,(-232)[ebp] +mov dword ptr (-232)[ebp],edi +lea edi,(-236)[ebp] +mov dword ptr (-236)[ebp],edi +lea edi,(-164)[ebp] +mov dword ptr (-4)[ebp],edi +lea edi,(-164)[ebp] +mov dword ptr (-164)[ebp],edi +lea edi,(-168)[ebp] +mov dword ptr (-8)[ebp],edi +lea edi,(-168)[ebp] +mov dword ptr (-168)[ebp],edi +lea edi,(-172)[ebp] +mov dword ptr (-12)[ebp],edi +lea edi,(-172)[ebp] +mov dword ptr (-172)[ebp],edi +lea edi,(-176)[ebp] +mov dword ptr (-16)[ebp],edi +lea edi,(-176)[ebp] +mov dword ptr (-176)[ebp],edi +lea edi,(-180)[ebp] +mov dword ptr (-20)[ebp],edi +lea edi,(-180)[ebp] +mov dword ptr (-180)[ebp],edi +lea edi,(-184)[ebp] +mov dword ptr (-24)[ebp],edi +lea edi,(-184)[ebp] +mov dword ptr (-184)[ebp],edi +lea edi,(-188)[ebp] +mov dword ptr (-28)[ebp],edi +lea edi,(-188)[ebp] +mov dword ptr (-188)[ebp],edi +lea edi,(-192)[ebp] +mov dword ptr (-32)[ebp],edi +lea edi,(-192)[ebp] +mov dword ptr (-192)[ebp],edi +lea edi,(-196)[ebp] +mov dword ptr (-36)[ebp],edi +lea edi,(-196)[ebp] +mov dword ptr (-196)[ebp],edi +lea edi,(-200)[ebp] +mov dword ptr (-40)[ebp],edi +lea edi,(-200)[ebp] +mov dword ptr (-200)[ebp],edi +lea edi,(-204)[ebp] +mov dword ptr (-44)[ebp],edi +lea edi,(-204)[ebp] +mov dword ptr (-204)[ebp],edi +lea edi,(-208)[ebp] +mov dword ptr (-48)[ebp],edi +lea edi,(-208)[ebp] +mov dword ptr (-208)[ebp],edi +lea edi,(-212)[ebp] +mov dword ptr (-52)[ebp],edi +lea edi,(-212)[ebp] +mov dword ptr (-212)[ebp],edi +lea edi,(-216)[ebp] +mov dword ptr (-56)[ebp],edi +lea edi,(-216)[ebp] +mov dword ptr (-216)[ebp],edi +lea edi,(-220)[ebp] +mov dword ptr (-60)[ebp],edi +lea edi,(-220)[ebp] +mov dword ptr (-220)[ebp],edi +lea edi,(-224)[ebp] +mov dword ptr (-64)[ebp],edi +lea edi,(-224)[ebp] +mov dword ptr (-224)[ebp],edi +lea edi,(-240)[ebp] +mov dword ptr (-240)[ebp],edi +lea edi,(-244)[ebp] +mov dword ptr (-244)[ebp],edi +lea edi,(-256)[ebp] +mov dword ptr (-256)[ebp],edi +lea edi,(-228)[ebp] +mov esi,4 +lea ebx,(-252)[ebp] +mov edx,edi +sub edx,ebx +mov eax,edx +cdq +idiv esi +mov dword ptr (-152)[ebp],eax +lea ebx,(-232)[ebp] +sub ebx,edi +mov eax,ebx +cdq +idiv esi +mov dword ptr (-148)[ebp],eax +lea edi,(-236)[ebp] +lea esi,(-232)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-144)[ebp],eax +lea edi,(-164)[ebp] +lea esi,(-236)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-140)[ebp],eax +lea edi,(-168)[ebp] +lea esi,(-164)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-136)[ebp],eax +lea edi,(-172)[ebp] +lea esi,(-168)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-132)[ebp],eax +lea edi,(-176)[ebp] +lea esi,(-172)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-128)[ebp],eax +lea edi,(-180)[ebp] +lea esi,(-176)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-124)[ebp],eax +lea edi,(-184)[ebp] +lea esi,(-180)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-120)[ebp],eax +lea edi,(-188)[ebp] +lea esi,(-184)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-116)[ebp],eax +lea edi,(-192)[ebp] +lea esi,(-188)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-112)[ebp],eax +lea edi,(-196)[ebp] +lea esi,(-192)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-108)[ebp],eax +lea edi,(-200)[ebp] +lea esi,(-196)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-104)[ebp],eax +lea edi,(-204)[ebp] +lea esi,(-200)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-100)[ebp],eax +lea edi,(-208)[ebp] +lea esi,(-204)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-96)[ebp],eax +lea edi,(-212)[ebp] +lea esi,(-208)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-92)[ebp],eax +lea edi,(-216)[ebp] +lea esi,(-212)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-88)[ebp],eax +lea edi,(-220)[ebp] +lea esi,(-216)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-84)[ebp],eax +lea edi,(-224)[ebp] +lea esi,(-220)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-80)[ebp],eax +lea edi,(-240)[ebp] +lea esi,(-224)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-76)[ebp],eax +lea edi,(-244)[ebp] +lea esi,(-240)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-72)[ebp],eax +lea edi,(-256)[ebp] +lea esi,(-244)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +mov dword ptr (-68)[ebp],eax +mov edi,dword ptr (-152)[ebp] +mov dword ptr (-248)[ebp],edi +mov dword ptr (-160)[ebp],1 +mov dword ptr (-156)[ebp],0 +L3131: +mov edi,dword ptr (-160)[ebp] +cmp edi,1 +je L3137 +cmp edi,2 +je L3140 +cmp edi,3 +je L3145 +jmp L3135 +L3137: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-248)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +je L3136 +mov edi,dword ptr (-156)[ebp] +mov edi,dword ptr (-152)[ebp][edi*4] +mov dword ptr (-264)[ebp],edi +mov dword ptr (-160)[ebp],2 +mov dword ptr (-260)[ebp],1 +jmp L3136 +L3140: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-248)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +jne L3141 +mov dword ptr (-160)[ebp],3 +jmp L3136 +L3141: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-264)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +jne L3143 +inc dword ptr (-260)[ebp] +jmp L3136 +L3143: +mov dword ptr (-160)[ebp],4 +jmp L3136 +L3145: +mov edi,dword ptr (-156)[ebp] +mov esi,dword ptr (-248)[ebp] +cmp dword ptr (-152)[ebp][edi*4],esi +je L3136 +mov dword ptr (-160)[ebp],4 +L3135: +L3136: +L3132: +inc dword ptr (-156)[ebp] +cmp dword ptr (-156)[ebp],22 +jl L3131 +cmp dword ptr (-160)[ebp],3 +jne L3148 +mov edi,16 +mov eax,edi +sub eax,dword ptr (-260)[ebp] +jmp L3109 +L3148: +mov eax,-1 +L3109: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L3151 label byte +db 420 dup (0) +_DATA ends +_DATA segment +align 1 +L3152 label byte +db 115 +db 56 +db 52 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L3153 label byte +db 115 +db 56 +db 52 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s84 +_DATA ends +_TEXT segment +_s84: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,172 +lea edi,(L3153) +mov dword ptr (-156)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-160)[ebp],edi +mov dword ptr (-164)[ebp],0 +L3154: +L3155: +mov edi,dword ptr (-160)[ebp] +lea esi,(1)[edi] +mov dword ptr (-160)[ebp],esi +mov esi,dword ptr (-156)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-156)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L3154 +push 3 +call _fip +add esp,4 +mov dword ptr (-168)[ebp],eax +mov edi,dword ptr (-168)[ebp] +cmp dword ptr [edi],3 +je L3157 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3159 +push 1 +lea edi,(L3152) +push edi +call _printf +add esp,8 +L3159: +inc dword ptr (-164)[ebp] +L3157: +lea edi,(_glork) +mov dword ptr (-172)[ebp],edi +push 4 +call dword ptr (-172)[ebp] +add esp,4 +cmp eax,4 +je L3161 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3163 +push 2 +lea edi,(L3152) +push edi +call _printf +add esp,8 +L3163: +add dword ptr (-164)[ebp],2 +L3161: +mov dword ptr (-8)[ebp],0 +L3165: +mov edi,dword ptr (-8)[ebp] +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (-80)[ebp][edi*4] +mov edi,dword ptr (-8)[ebp] +lea edi,[edi*4] +lea esi,(-80)[ebp][edi] +mov dword ptr (-148)[ebp][edi],esi +L3166: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],17 +jl L3165 +fld dword ptr (L412) +fstp dword ptr (-152)[ebp] +mov dword ptr (-8)[ebp],0 +L3169: +fld dword ptr (-152)[ebp] +mov edi,dword ptr (-8)[ebp] +mov edi,dword ptr (-148)[ebp][edi*4] +fadd dword ptr [edi] +fstp dword ptr (-152)[ebp] +L3170: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],17 +jl L3169 +fld dword ptr (L3175) +fcomp dword ptr (-152)[ebp] +fstsw ax +sahf +je L3173 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3176 +push 4 +lea edi,(L3152) +push edi +call _printf +add esp,8 +L3176: +add dword ptr (-164)[ebp],4 +L3173: +mov dword ptr (-12)[ebp],0 +L3178: +mov dword ptr (-8)[ebp],0 +L3182: +mov dword ptr (-4)[ebp],0 +L3186: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +mov ebx,dword ptr (-12)[ebp] +imul edx,esi,28 +imul ecx,ebx,140 +lea edx,(L3151)[ecx][edx] +imul ebx,ebx,35 +imul esi,esi,7 +lea esi,[esi][ebx] +lea esi,[edi][esi] +mov dword ptr [edx][edi*4],esi +L3187: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],7 +jl L3186 +L3183: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],5 +jl L3182 +L3179: +inc dword ptr (-12)[ebp] +cmp dword ptr (-12)[ebp],3 +jl L3178 +mov dword ptr (-12)[ebp],1 +mov dword ptr (-8)[ebp],2 +mov dword ptr (-4)[ebp],3 +push 0 +push 105 +lea edi,(L3151) +push edi +call _array +add esp,12 +mov edi,eax +push 35 +push 35 +imul esi,dword ptr (-12)[ebp],140 +lea esi,(L3151)[esi] +push esi +call _array +add esp,12 +mov esi,eax +push 49 +push 7 +imul ebx,dword ptr (-8)[ebp],28 +imul edx,dword ptr (-12)[ebp],140 +lea ebx,(L3151)[edx][ebx] +push ebx +call _array +add esp,12 +lea edi,[esi][edi] +lea edi,[eax][edi] +mov esi,dword ptr (-4)[ebp] +imul ebx,dword ptr (-8)[ebp],28 +imul edx,dword ptr (-12)[ebp],140 +lea ebx,(L3151)[edx][ebx] +mov esi,dword ptr [ebx][esi*4] +lea edi,[esi][edi] +sub edi,52 +cmp edi,0 +je L3190 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3192 +push 8 +lea edi,(L3152) +push edi +call _printf +add esp,8 +L3192: +add dword ptr (-164)[ebp],8 +L3190: +mov eax,dword ptr (-164)[ebp] +L3150: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _array +_array: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],0 +jmp L3198 +L3195: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (20)[ebp] +mov ebx,dword ptr (28)[ebp] +lea ebx,[ebx][edi] +cmp dword ptr [esi][edi*4],ebx +je L3199 +mov eax,1 +jmp L3194 +L3199: +L3196: +inc dword ptr (-4)[ebp] +L3198: +mov edi,dword ptr (24)[ebp] +cmp dword ptr (-4)[ebp],edi +jl L3195 +mov eax,0 +L3194: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L3202 label byte +db 4 dup (0) +public _fip +_DATA ends +_TEXT segment +_fip: +push ebx +push esi +push edi +push ebp +mov ebp,esp +lea edi,(L3202) +mov esi,dword ptr (20)[ebp] +mov dword ptr (L3202),esi +mov eax,edi +L3201: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _glork +_glork: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov eax,dword ptr (20)[ebp] +L3203: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L3205 label byte +db 115 +db 56 +db 53 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L3206 label byte +db 115 +db 56 +db 53 +db 32 +db 32 +db 32 +db 32 +db 0 +align 4 +L3214 label byte +dd L425 +dd L427 +dd L426 +dd L428 +dd L429 +dd L430 +dd L431 +align 1 +L3215 label byte +db 32 +db 97 +db 108 +db 105 +db 103 +db 110 +db 109 +db 101 +db 110 +db 116 +db 58 +db 32 +db 0 +public _s85 +_DATA ends +_TEXT segment +_s85: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,404 +lea edi,(L3206) +mov dword ptr (-276)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-280)[ebp],edi +mov dword ptr (-320)[ebp],0 +L3219: +L3220: +mov edi,dword ptr (-280)[ebp] +lea esi,(1)[edi] +mov dword ptr (-280)[ebp],esi +mov esi,dword ptr (-276)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-276)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L3219 +lea edi,(-296)[ebp] +lea esi,(-316)[ebp] +sub edi,esi +cmp edi,0 +jle L3230 +lea edi,(-292)[ebp] +lea esi,(-296)[ebp] +sub edi,esi +cmp edi,0 +jle L3230 +lea edi,(-288)[ebp] +lea esi,(-292)[ebp] +sub edi,esi +cmp edi,0 +jg L3222 +L3230: +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3231 +push 1 +lea edi,(L3205) +push edi +call _printf +add esp,8 +L3231: +inc dword ptr (-320)[ebp] +L3222: +lea edi,(-355)[ebp] +lea esi,(-356)[ebp] +sub edi,esi +mov dword ptr (-272)[ebp],edi +lea edi,(-358)[ebp] +lea esi,(-360)[ebp] +sub edi,esi +mov dword ptr (-268)[ebp],edi +lea edi,(-364)[ebp] +lea esi,(-368)[ebp] +sub edi,esi +mov dword ptr (-264)[ebp],edi +lea edi,(-372)[ebp] +lea esi,(-376)[ebp] +sub edi,esi +mov dword ptr (-260)[ebp],edi +lea edi,(-380)[ebp] +lea esi,(-384)[ebp] +sub edi,esi +mov dword ptr (-256)[ebp],edi +lea edi,(-388)[ebp] +lea esi,(-392)[ebp] +sub edi,esi +mov dword ptr (-252)[ebp],edi +lea edi,(-400)[ebp] +lea esi,(-404)[ebp] +sub edi,esi +mov dword ptr (-248)[ebp],edi +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L3246 +mov dword ptr (-244)[ebp],0 +L3248: +mov edi,dword ptr (-244)[ebp] +lea edi,[edi*4] +mov esi,dword ptr (-272)[ebp][edi] +push esi +lea esi,(L3215) +push esi +mov edi,dword ptr (L3214)[edi] +push edi +lea edi,(L3252) +push edi +call _printf +add esp,16 +L3249: +inc dword ptr (-244)[ebp] +cmp dword ptr (-244)[ebp],7 +jl L3248 +L3246: +mov edi,dword ptr (-284)[ebp] +or edi,56 +mov dword ptr (-284)[ebp],edi +mov edi,dword ptr (-284)[ebp] +mov esi,edi +and esi,0fffffffcH +sal edi,26 +sar edi,29 +sal edi,30 +sar edi,30 +and edi,3 +or esi,edi +mov dword ptr (-284)[ebp],esi +mov edi,dword ptr (-284)[ebp] +mov esi,edi +and esi,0ffffffc7H +sal edi,30 +sar edi,30 +sal edi,29 +sar edi,29 +lea edi,[edi*8] +and edi,56 +or esi,edi +mov dword ptr (-284)[ebp],esi +mov edi,dword ptr (-284)[ebp] +sal edi,26 +sar edi,29 +cmp edi,3 +je L3253 +mov edi,dword ptr (-284)[ebp] +sal edi,26 +sar edi,29 +cmp edi,-1 +jne L3255 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L3256 +lea edi,(L3259) +push edi +call _printf +add esp,4 +jmp L3256 +L3255: +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3260 +push 2 +lea edi,(L3205) +push edi +call _printf +add esp,8 +L3260: +add dword ptr (-320)[ebp],2 +L3256: +L3253: +mov edi,dword ptr (-284)[ebp] +or edi,64 +mov dword ptr (-284)[ebp],edi +mov edi,dword ptr (-284)[ebp] +sal edi,25 +sar edi,31 +cmp edi,1 +je L3262 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (40)[edi],0 +je L3264 +lea edi,(L3266) +push edi +call _printf +add esp,4 +L3264: +L3262: +lea edi,(-240)[ebp] +mov esi,edi +sub esi,edi +cmp esi,0 +jne L3274 +cmp esi,0 +jne L3274 +cmp esi,0 +jne L3274 +cmp esi,0 +jne L3274 +cmp esi,0 +jne L3274 +cmp esi,0 +jne L3274 +cmp esi,0 +je L3267 +L3274: +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3275 +push 4 +lea edi,(L3205) +push edi +call _printf +add esp,8 +L3275: +add dword ptr (-320)[ebp],4 +L3267: +jmp L3277 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3279 +push 8 +lea edi,(L3205) +push edi +call _printf +add esp,8 +L3279: +add dword ptr (-320)[ebp],8 +L3277: +lea edi,(-352)[ebp] +mov dword ptr (-288)[ebp],edi +mov byte ptr (-352)[ebp],2 +mov edi,dword ptr (-288)[ebp] +movsx esi,byte ptr [edi] +lea esi,(1)[esi] +mov ebx,esi +mov byte ptr [edi],bl +movsx edi,byte ptr (-352)[ebp] +cmp edi,3 +je L3283 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3285 +push 16 +lea edi,(L3205) +push edi +call _printf +add esp,8 +L3285: +add dword ptr (-320)[ebp],16 +L3283: +mov eax,dword ptr (-320)[ebp] +L3204: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L3288 label byte +db 115 +db 56 +db 54 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L3289 label byte +db 115 +db 56 +db 54 +db 32 +db 32 +db 32 +db 32 +db 0 +align 4 +L3290 label byte +dd 1 +dd 3 +dd 5 +align 4 +L3291 label byte +dd L3290+8 +_DATA ends +_DATA segment +align 4 +L3293 label byte +db 40 dup (0) +_DATA ends +_DATA segment +align 4 +L3294 label byte +dd 03f800000H +dd 040400000H +dd 040a00000H +dd 040000000H +dd 040800000H +dd 040c00000H +dd 040400000H +dd 040a00000H +dd 040e00000H +dd 00H +dd 00H +dd 00H +align 4 +L3295 label byte +dd 03f800000H +dd 040400000H +dd 040a00000H +dd 040000000H +dd 040800000H +dd 040c00000H +dd 040400000H +dd 040a00000H +dd 040e00000H +db 12 dup (0) +align 4 +L3296 label byte +dd 03f800000H +dd 040400000H +dd 040a00000H +dd 040000000H +dd 040800000H +dd 040c00000H +dd 040400000H +dd 040a00000H +dd 040e00000H +db 12 dup (0) +align 4 +L3297 label byte +dd 03f800000H +db 8 dup (0) +dd 040000000H +db 8 dup (0) +dd 040400000H +db 8 dup (0) +dd 040800000H +db 8 dup (0) +public _s86 +_DATA ends +_TEXT segment +_s86: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,40 +mov edi,dword ptr (L3291) +lea edi,(-4)[edi] +mov dword ptr (-36)[ebp],edi +call _one +add esp,0 +mov esi,dword ptr (-36)[ebp] +lea edi,[esi][eax*4] +mov dword ptr (-4)[ebp],edi +lea edi,(L3289) +mov dword ptr (-24)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-28)[ebp],edi +mov dword ptr (-32)[ebp],0 +L3298: +L3299: +mov edi,dword ptr (-28)[ebp] +lea esi,(1)[edi] +mov dword ptr (-28)[ebp],esi +mov esi,dword ptr (-24)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-24)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L3298 +mov edi,dword ptr (L3291) +cmp dword ptr [edi],5 +je L3301 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3303 +push 1 +lea edi,(L3288) +push edi +call _printf +add esp,8 +L3303: +inc dword ptr (-32)[ebp] +L3301: +mov edi,dword ptr (-36)[ebp] +cmp dword ptr [edi],3 +je L3305 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3307 +push 2 +lea edi,(L3288) +push edi +call _printf +add esp,8 +L3307: +add dword ptr (-32)[ebp],2 +L3305: +mov edi,dword ptr (-4)[ebp] +cmp dword ptr [edi],5 +je L3309 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3311 +push 4 +lea edi,(L3288) +push edi +call _printf +add esp,8 +L3311: +add dword ptr (-32)[ebp],4 +L3309: +mov dword ptr (-20)[ebp],0 +mov dword ptr (-8)[ebp],0 +L3313: +mov edi,dword ptr (-8)[ebp] +cmp dword ptr (L3293)[edi*4],0 +je L3317 +mov dword ptr (-20)[ebp],1 +L3317: +L3314: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],10 +jl L3313 +cmp dword ptr (-20)[ebp],0 +je L3319 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3321 +push 8 +lea edi,(L3288) +push edi +call _printf +add esp,8 +L3321: +add dword ptr (-32)[ebp],8 +L3319: +mov dword ptr (-20)[ebp],0 +mov dword ptr (-12)[ebp],0 +L3323: +mov dword ptr (-8)[ebp],0 +L3327: +imul edi,dword ptr (-12)[ebp],3 +mov esi,dword ptr (-8)[ebp] +lea edi,[esi][edi] +mov dword ptr (-16)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea edi,[edi*4] +imul esi,dword ptr (-12)[ebp],12 +fld dword ptr (L3295)[esi][edi] +fstp dword ptr (-40)[ebp] +fld dword ptr (L3296)[esi][edi] +fcomp dword ptr (-40)[ebp] +fstsw ax +sahf +jne L3333 +mov edi,dword ptr (-16)[ebp] +fld dword ptr (L3294)[edi*4] +fcomp dword ptr (-40)[ebp] +fstsw ax +sahf +je L3331 +L3333: +mov dword ptr (-20)[ebp],1 +L3331: +L3328: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],3 +jl L3327 +L3324: +inc dword ptr (-12)[ebp] +cmp dword ptr (-12)[ebp],4 +jl L3323 +cmp dword ptr (-20)[ebp],0 +je L3334 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3336 +push 16 +lea edi,(L3288) +push edi +call _printf +add esp,8 +L3336: +add dword ptr (-32)[ebp],16 +L3334: +mov dword ptr (-20)[ebp],0 +mov dword ptr (-8)[ebp],0 +L3338: +mov edi,dword ptr (-8)[ebp] +imul esi,edi,12 +lea edi,(1)[edi] +push edi +fild dword ptr 0[esp] +add esp,4 +fcomp dword ptr (L3297)[esi] +fstsw ax +sahf +je L3342 +mov dword ptr (-20)[ebp],1 +L3342: +L3339: +inc dword ptr (-8)[ebp] +cmp dword ptr (-8)[ebp],4 +jl L3338 +cmp dword ptr (-20)[ebp],0 +je L3344 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3346 +push 32 +lea edi,(L3288) +push edi +call _printf +add esp,8 +L3346: +add dword ptr (-32)[ebp],32 +L3344: +mov eax,dword ptr (-32)[ebp] +L3287: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _one +_one: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov eax,1 +L3348: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L3350 label byte +db 115 +db 56 +db 56 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L3351 label byte +db 115 +db 56 +db 56 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s88 +_DATA ends +_TEXT segment +_s88: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,44 +lea edi,(L3351) +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-8)[ebp],edi +mov dword ptr (-12)[ebp],0 +L3353: +L3354: +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-4)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-4)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L3353 +jmp L3356 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3358 +push 1 +lea edi,(L3350) +push edi +call _printf +add esp,8 +L3358: +inc dword ptr (-12)[ebp] +L3356: +lea edi,(-32)[ebp] +mov dword ptr (_metricp),edi +mov dword ptr (-32)[ebp],2 +mov edi,dword ptr (_metricp) +mov dword ptr [edi],3 +cmp dword ptr (-32)[ebp],3 +je L3360 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3362 +push 2 +lea edi,(L3350) +push edi +call _printf +add esp,8 +L3362: +add dword ptr (-12)[ebp],2 +L3360: +fld qword ptr (L419) +fstp qword ptr (-28)[ebp] +fld qword ptr (L419) +fstp qword ptr (-20)[ebp] +lea edi,(-28)[ebp] +mov dword ptr (-36)[ebp],edi +mov edi,dword ptr (-36)[ebp] +fld qword ptr (L418) +fstp qword ptr [edi] +mov edi,dword ptr (-36)[ebp] +fld qword ptr (L418) +fstp qword ptr (8)[edi] +fld qword ptr (-28)[ebp] +fadd qword ptr (-20)[ebp] +fld qword ptr (L416) +fcompp +fstsw ax +sahf +je L3365 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3368 +push 4 +lea edi,(L3350) +push edi +call _printf +add esp,8 +L3368: +add dword ptr (-12)[ebp],4 +L3365: +mov eax,dword ptr (-12)[ebp] +L3349: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 1 +L3371 label byte +db 115 +db 57 +db 44 +db 101 +db 114 +db 37 +db 100 +db 10 +db 0 +align 1 +L3372 label byte +db 115 +db 57 +db 32 +db 32 +db 32 +db 32 +db 32 +db 0 +public _s9 +_DATA ends +_TEXT segment +_s9: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,36 +lea edi,(L3372) +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea edi,(60)[edi] +mov dword ptr (-16)[ebp],edi +mov dword ptr (-20)[ebp],0 +L3373: +L3374: +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +mov esi,dword ptr (-12)[ebp] +lea ebx,(1)[esi] +mov dword ptr (-12)[ebp],ebx +mov bl,byte ptr [esi] +mov byte ptr [edi],bl +movsx edi,bl +cmp edi,0 +jne L3373 +mov dword ptr (-8)[ebp],0 +mov dword ptr (-4)[ebp],0 +L3376: +mov dword ptr (-24)[ebp],2 +mov dword ptr (-28)[ebp],2 +mov dword ptr (-32)[ebp],3 +mov dword ptr (-36)[ebp],3 +cmp dword ptr (-36)[ebp],3 +jne L3382 +cmp dword ptr (-32)[ebp],3 +je L3380 +L3382: +mov dword ptr (-8)[ebp],1 +L3380: +cmp dword ptr (-28)[ebp],2 +jne L3385 +cmp dword ptr (-24)[ebp],2 +je L3383 +L3385: +mov dword ptr (-8)[ebp],1 +L3383: +L3377: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],2 +jl L3376 +cmp dword ptr (-8)[ebp],0 +je L3390 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3388 +push 1 +lea edi,(L3371) +push edi +call _printf +add esp,8 +L3388: +inc dword ptr (-20)[ebp] +jmp L3390 +mov edi,dword ptr (20)[ebp] +cmp dword ptr (44)[edi],0 +je L3391 +push 2 +lea edi,(L3371) +push edi +call _printf +add esp,8 +L3391: +add dword ptr (-20)[ebp],2 +L3390: +mov eax,dword ptr (-20)[ebp] +L3370: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _setev +_setev: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov dword ptr (_extvar),1066 +mov eax,0 +L3393: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_DATA segment +public _rfs +align 1 +_rfs label byte +db 8 dup (0) +public _crc +align 4 +_crc label byte +db 4 dup (0) +public _rrc +align 4 +_rrc label byte +db 4 dup (0) +public _flgl +align 4 +_flgl label byte +db 4 dup (0) +public _flgd +align 4 +_flgd label byte +db 4 dup (0) +public _flgm +align 4 +_flgm label byte +db 4 dup (0) +public _flgs +align 4 +_flgs label byte +db 4 dup (0) +public _dprec +align 4 +_dprec label byte +db 4 dup (0) +public _fprec +align 4 +_fprec label byte +db 4 dup (0) +public _dbits +align 4 +_dbits label byte +db 4 dup (0) +public _fbits +align 4 +_fbits label byte +db 4 dup (0) +public _ubits +align 4 +_ubits label byte +db 4 dup (0) +public _lbits +align 4 +_lbits label byte +db 4 dup (0) +public _metricp +align 4 +_metricp label byte +db 4 dup (0) +public _extvar +align 4 +_extvar label byte +db 4 dup (0) +_DATA ends +_TEXT segment +align 1 +L3266 label byte +db 66 +db 101 +db 32 +db 101 +db 115 +db 112 +db 101 +db 99 +db 105 +db 97 +db 108 +db 108 +db 121 +db 32 +db 99 +db 97 +db 114 +db 101 +db 102 +db 117 +db 108 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 49 +db 45 +db 98 +db 105 +db 116 +db 32 +db 102 +db 105 +db 101 +db 108 +db 100 +db 115 +db 33 +db 10 +db 0 +align 1 +L3259 label byte +db 83 +db 105 +db 103 +db 110 +db 32 +db 101 +db 120 +db 116 +db 101 +db 110 +db 115 +db 105 +db 111 +db 110 +db 32 +db 105 +db 110 +db 32 +db 102 +db 105 +db 101 +db 108 +db 100 +db 115 +db 10 +db 0 +align 1 +L3252 label byte +db 37 +db 115 +db 37 +db 115 +db 37 +db 100 +db 10 +db 0 +align 4 +L3175 label byte +dd 043080000H +align 1 +L3022 label byte +db 112 +db 111 +db 105 +db 110 +db 116 +db 101 +db 114 +db 0 +align 1 +L2472 label byte +db 73 +db 110 +db 99 +db 114 +db 101 +db 97 +db 115 +db 105 +db 110 +db 103 +db 32 +db 97 +db 114 +db 114 +db 97 +db 121 +db 32 +db 101 +db 108 +db 101 +db 109 +db 101 +db 110 +db 116 +db 115 +db 32 +db 97 +db 115 +db 115 +db 105 +db 103 +db 110 +db 101 +db 100 +db 32 +db 116 +db 111 +db 32 +db 100 +db 101 +db 99 +db 114 +db 101 +db 97 +db 115 +db 105 +db 110 +db 103 +db 32 +db 108 +db 111 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 115 +db 10 +db 0 +align 4 +L2356 label byte +dd 041d00000H +align 4 +L2355 label byte +dd 00H +dd 0403a0000H +align 4 +L1659 label byte +dd 00H +dd 040040000H +align 4 +L1484 label byte +dd 00H +dd 040240000H +align 4 +L1455 label byte +dd 041200000H +align 4 +L1280 label byte +dd 00H +dd 040080000H +align 4 +L1251 label byte +dd 040400000H +align 4 +L1076 label byte +dd 00H +dd 0401c0000H +align 4 +L1047 label byte +dd 040e00000H +align 4 +L870 label byte +dd 00H +dd 040140000H +align 4 +L841 label byte +dd 040a00000H +align 4 +L836 label byte +dd 00H +dd 041e00000H +align 4 +L828 label byte +dd 04f000000H +align 1 +L653 label byte +db 113 +db 117 +db 101 +db 101 +db 112 +db 0 +align 1 +L639 label byte +db 10 +db 0 +align 1 +L638 label byte +db 37 +db 100 +db 0 +align 1 +L633 label byte +db 32 +db 32 +db 32 +db 107 +db 101 +db 121 +db 61 +db 0 +align 4 +L596 label byte +dd 00H +dd 040000000H +align 4 +L536 label byte +dd 00H +dd 040ce8480H +align 4 +L535 label byte +dd 00H +dd 0405f4000H +align 4 +L534 label byte +dd 042fa0000H +align 4 +L529 label byte +dd 040000000H +align 1 +L431 label byte +db 100 +db 111 +db 117 +db 98 +db 108 +db 101 +db 0 +align 1 +L430 label byte +db 102 +db 108 +db 111 +db 97 +db 116 +db 0 +align 1 +L429 label byte +db 117 +db 110 +db 115 +db 105 +db 103 +db 110 +db 101 +db 100 +db 0 +align 1 +L428 label byte +db 108 +db 111 +db 110 +db 103 +db 0 +align 1 +L427 label byte +db 115 +db 104 +db 111 +db 114 +db 116 +db 0 +align 1 +L426 label byte +db 105 +db 110 +db 116 +db 0 +align 1 +L425 label byte +db 99 +db 104 +db 97 +db 114 +db 0 +align 4 +L419 label byte +dd 00H +dd 00H +align 4 +L418 label byte +dd 00H +dd 03ff00000H +align 4 +L417 label byte +dd 00H +dd 040100000H +align 4 +L416 label byte +dd 00H +dd 040000000H +align 4 +L412 label byte +dd 00H +align 4 +L411 label byte +dd 03f800000H +align 1 +L390 label byte +db 113 +db 117 +db 101 +db 101 +db 112 +db 33 +db 0 +align 1 +L379 label byte +db 10 +db 9 +db 8 +db 13 +db 12 +db 92 +db 39 +db 0 +align 1 +L375 label byte +db 46 +db 34 +db 46 +db 0 +align 1 +L362 label byte +db 46 +db 46 +db 46 +db 0 +align 4 +L333 label byte +dd 00H +dd 040938800H +align 1 +L199 label byte +db 32 +db 32 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 101 +db 110 +db 116 +db 32 +db 114 +db 101 +db 115 +db 117 +db 108 +db 116 +db 115 +db 32 +db 119 +db 104 +db 101 +db 110 +db 32 +db 97 +db 115 +db 115 +db 105 +db 103 +db 110 +db 101 +db 100 +db 32 +db 116 +db 111 +db 32 +db 108 +db 111 +db 110 +db 103 +db 115 +db 46 +db 10 +db 0 +align 1 +L198 label byte +db 68 +db 101 +db 99 +db 105 +db 109 +db 97 +db 108 +db 32 +db 97 +db 110 +db 100 +db 32 +db 111 +db 99 +db 116 +db 97 +db 108 +db 47 +db 104 +db 101 +db 120 +db 32 +db 99 +db 111 +db 110 +db 115 +db 116 +db 97 +db 110 +db 116 +db 115 +db 32 +db 115 +db 111 +db 109 +db 101 +db 116 +db 105 +db 109 +db 101 +db 115 +db 32 +db 103 +db 105 +db 118 +db 101 +db 10 +db 0 +align 1 +L27 label byte +db 10 +db 70 +db 97 +db 105 +db 108 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L26 label byte +db 10 +db 78 +db 111 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 115 +db 32 +db 100 +db 101 +db 116 +db 101 +db 99 +db 116 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L20 label byte +db 83 +db 101 +db 99 +db 116 +db 105 +db 111 +db 110 +db 32 +db 37 +db 115 +db 32 +db 114 +db 101 +db 116 +db 117 +db 114 +db 110 +db 101 +db 100 +db 32 +db 37 +db 100 +db 46 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/cvt.1bk b/quake3/source/lcc/x86/win32/tst/cvt.1bk new file mode 100644 index 0000000..74c79f1 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cvt.1bk @@ -0,0 +1,11 @@ +1 1 1 1 1 1 1 1 1.000000 1.000000 1.000000 +2 2 2 2 2 2 2 2 2.000000 2.000000 2.000000 +3 3 3 3 3 3 3 3 3.000000 3.000000 3.000000 +4 4 4 4 4 4 4 4 4.000000 4.000000 4.000000 +5 5 5 5 5 5 5 5 5.000000 5.000000 5.000000 +6 6 6 6 6 6 6 6 6.000000 6.000000 6.000000 +7 7 7 7 7 7 7 7 7.000000 7.000000 7.000000 +8 8 8 8 8 8 8 8 8.000000 8.000000 8.000000 +9 9 9 9 9 9 9 9 9.000000 9.000000 9.000000 +10 10 10 10 10 10 10 10 10.000000 10.000000 10.000000 +11 11 11 11 11 11 11 11 11.000000 11.000000 11.000000 diff --git a/quake3/source/lcc/x86/win32/tst/cvt.2bk b/quake3/source/lcc/x86/win32/tst/cvt.2bk new file mode 100644 index 0000000..b3ab360 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cvt.2bk @@ -0,0 +1,2 @@ +tst/cvt.c:32: warning: conversion from `pointer to void function(void)' to `pointer to void' is compiler dependent +tst/cvt.c:33: warning: conversion from `pointer to void' to `pointer to void function(void)' is compiler dependent diff --git a/quake3/source/lcc/x86/win32/tst/cvt.sbk b/quake3/source/lcc/x86/win32/tst/cvt.sbk new file mode 100644 index 0000000..341cfaf --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/cvt.sbk @@ -0,0 +1,742 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _print +_TEXT segment +_print: +push ebx +push esi +push edi +push ebp +mov ebp,esp +fld qword ptr (_D) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_d) +sub esp,8 +fstp qword ptr [esp] +fld dword ptr (_f) +sub esp,8 +fstp qword ptr [esp] +mov edi,dword ptr (_L) +push edi +mov edi,dword ptr (_I) +push edi +mov di,word ptr (_S) +movzx edi,di +push edi +mov bl,byte ptr (_C) +movzx edi,bl +push edi +mov edi,dword ptr (_l) +push edi +mov edi,dword ptr (_i) +push edi +movsx edi,word ptr (_s) +push edi +movsx edi,byte ptr (_c) +push edi +lea edi,(L2) +push edi +call _printf +add esp,60 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _main +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,296 +mov byte ptr (_c),1 +movsx edi,byte ptr (_c) +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov dword ptr (_l),edi +mov esi,edi +mov ebx,esi +mov byte ptr (_C),bl +mov ebx,esi +mov word ptr (_S),bx +mov dword ptr (_I),esi +mov dword ptr (_L),esi +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (_f) +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-8)[ebp] +fld qword ptr (-8)[ebp] +fstp qword ptr (_d) +fld qword ptr (-8)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov word ptr (_s),2 +movsx edi,word ptr (_s) +mov ebx,edi +mov byte ptr (_c),bl +mov dword ptr (_i),edi +mov dword ptr (_l),edi +mov esi,edi +mov ebx,esi +mov byte ptr (_C),bl +mov ebx,esi +mov word ptr (_S),bx +mov dword ptr (_I),esi +mov dword ptr (_L),esi +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (_f) +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-16)[ebp] +fld qword ptr (-16)[ebp] +fstp qword ptr (_d) +fld qword ptr (-16)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov dword ptr (_i),3 +mov edi,dword ptr (_i) +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_l),edi +mov esi,edi +mov ebx,esi +mov byte ptr (_C),bl +mov ebx,esi +mov word ptr (_S),bx +mov dword ptr (_I),esi +mov dword ptr (_L),esi +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (_f) +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-24)[ebp] +fld qword ptr (-24)[ebp] +fstp qword ptr (_d) +fld qword ptr (-24)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov dword ptr (_l),4 +mov edi,dword ptr (_l) +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov esi,edi +mov ebx,esi +mov byte ptr (_C),bl +mov ebx,esi +mov word ptr (_S),bx +mov dword ptr (_I),esi +mov dword ptr (_L),esi +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (_f) +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-32)[ebp] +fld qword ptr (-32)[ebp] +fstp qword ptr (_d) +fld qword ptr (-32)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov byte ptr (_C),5 +mov bl,byte ptr (_C) +movzx edi,bl +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov dword ptr (_l),edi +mov esi,edi +mov ebx,esi +mov word ptr (_S),bx +mov dword ptr (_I),esi +mov dword ptr (_L),esi +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (_f) +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-40)[ebp] +fld qword ptr (-40)[ebp] +fstp qword ptr (_d) +fld qword ptr (-40)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov word ptr (_S),6 +mov di,word ptr (_S) +movzx edi,di +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov dword ptr (_l),edi +mov esi,edi +mov ebx,esi +mov byte ptr (_C),bl +mov dword ptr (_I),esi +mov dword ptr (_L),esi +push edi +fild dword ptr 0[esp] +add esp,4 +fstp dword ptr (_f) +push edi +fild dword ptr 0[esp] +add esp,4 +fstp qword ptr (-48)[ebp] +fld qword ptr (-48)[ebp] +fstp qword ptr (_d) +fld qword ptr (-48)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov dword ptr (_I),7 +mov edi,dword ptr (_I) +mov ebx,edi +mov byte ptr (_c),bl +mov ebx,edi +mov word ptr (_s),bx +mov dword ptr (_i),edi +mov dword ptr (_l),edi +mov ebx,edi +mov byte ptr (_C),bl +mov esi,edi +mov word ptr (_S),si +mov dword ptr (_L),edi +fld qword ptr (L4) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp qword ptr (-56)[ebp] +fld qword ptr (-56)[ebp] +fstp dword ptr (_f) +fld qword ptr (-56)[ebp] +fstp qword ptr (_d) +fld qword ptr (-56)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +mov dword ptr (_L),8 +mov edi,dword ptr (_L) +mov ebx,edi +mov byte ptr (_c),bl +mov ebx,edi +mov word ptr (_s),bx +mov dword ptr (_i),edi +mov dword ptr (_l),edi +mov ebx,edi +mov byte ptr (_C),bl +mov esi,edi +mov word ptr (_S),si +mov si,word ptr (_S) +movzx esi,si +mov dword ptr (_I),esi +fld qword ptr (L4) +mov esi,edi +shr esi,1 +push esi +fild dword ptr 0[esp] +add esp,4 +fmulp st(1),st +and edi,1 +push edi +fild dword ptr 0[esp] +add esp,4 +faddp st(1),st +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +fstp dword ptr (_f) +fld qword ptr (-64)[ebp] +fstp qword ptr (_d) +fld qword ptr (-64)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +fld dword ptr (L5) +fstp dword ptr (_f) +fld dword ptr (_f) +fstp dword ptr (-84)[ebp] +fld dword ptr (-84)[ebp] +call __ftol +mov edi,eax +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov dword ptr (_l),edi +fld dword ptr (L9) +fcomp dword ptr (-84)[ebp] +fstsw ax +sahf +ja L7 +fld dword ptr (-84)[ebp] +fsub dword ptr (L9) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-68)[ebp],edi +jmp L8 +L7: +fld dword ptr (-84)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-68)[ebp],edi +L8: +mov edi,dword ptr (-68)[ebp] +mov ebx,edi +mov byte ptr (_C),bl +fld dword ptr (L9) +fcomp dword ptr (_f) +fstsw ax +sahf +ja L11 +fld dword ptr (_f) +fsub dword ptr (L9) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-72)[ebp],edi +jmp L12 +L11: +fld dword ptr (_f) +call __ftol +mov edi,eax +mov dword ptr (-72)[ebp],edi +L12: +mov edi,dword ptr (-72)[ebp] +mov word ptr (_S),di +fld dword ptr (L9) +fcomp dword ptr (_f) +fstsw ax +sahf +ja L14 +fld dword ptr (_f) +fsub dword ptr (L9) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-76)[ebp],edi +jmp L15 +L14: +fld dword ptr (_f) +call __ftol +mov edi,eax +mov dword ptr (-76)[ebp],edi +L15: +mov edi,dword ptr (-76)[ebp] +mov dword ptr (_I),edi +fld dword ptr (L9) +fcomp dword ptr (_f) +fstsw ax +sahf +ja L17 +fld dword ptr (_f) +fsub dword ptr (L9) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-80)[ebp],edi +jmp L18 +L17: +fld dword ptr (_f) +call __ftol +mov edi,eax +mov dword ptr (-80)[ebp],edi +L18: +mov edi,dword ptr (-80)[ebp] +mov dword ptr (_L),edi +fld dword ptr (_f) +fstp qword ptr (-120)[ebp] +fld qword ptr (-120)[ebp] +fstp qword ptr (_d) +fld qword ptr (-120)[ebp] +fstp qword ptr (_D) +call _print +add esp,0 +fld qword ptr (L19) +fstp qword ptr (_d) +fld qword ptr (_d) +fstp qword ptr (-144)[ebp] +fld qword ptr (-144)[ebp] +call __ftol +mov edi,eax +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov dword ptr (_l),edi +fld qword ptr (L23) +fcomp qword ptr (-144)[ebp] +fstsw ax +sahf +ja L21 +fld qword ptr (-144)[ebp] +fsub qword ptr (L23) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-124)[ebp],edi +jmp L22 +L21: +fld qword ptr (-144)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-124)[ebp],edi +L22: +mov edi,dword ptr (-124)[ebp] +mov ebx,edi +mov byte ptr (_C),bl +fld qword ptr (L23) +fcomp qword ptr (_d) +fstsw ax +sahf +ja L25 +fld qword ptr (_d) +fsub qword ptr (L23) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-128)[ebp],edi +jmp L26 +L25: +fld qword ptr (_d) +call __ftol +mov edi,eax +mov dword ptr (-128)[ebp],edi +L26: +mov edi,dword ptr (-128)[ebp] +mov word ptr (_S),di +fld qword ptr (L23) +fcomp qword ptr (_d) +fstsw ax +sahf +ja L28 +fld qword ptr (_d) +fsub qword ptr (L23) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-132)[ebp],edi +jmp L29 +L28: +fld qword ptr (_d) +call __ftol +mov edi,eax +mov dword ptr (-132)[ebp],edi +L29: +mov edi,dword ptr (-132)[ebp] +mov dword ptr (_I),edi +fld qword ptr (L23) +fcomp qword ptr (_d) +fstsw ax +sahf +ja L31 +fld qword ptr (_d) +fsub qword ptr (L23) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-136)[ebp],edi +jmp L32 +L31: +fld qword ptr (_d) +call __ftol +mov edi,eax +mov dword ptr (-136)[ebp],edi +L32: +mov edi,dword ptr (-136)[ebp] +mov dword ptr (_L),edi +fld qword ptr (_d) +fstp dword ptr (_f) +fld qword ptr (_d) +fstp qword ptr (_D) +call _print +add esp,0 +fld qword ptr (L33) +fstp qword ptr (_D) +fld qword ptr (_D) +fstp qword ptr (-232)[ebp] +fld qword ptr (-232)[ebp] +call __ftol +mov edi,eax +mov ebx,edi +mov byte ptr (_c),bl +mov esi,edi +mov word ptr (_s),si +mov dword ptr (_i),edi +mov dword ptr (_l),edi +fld qword ptr (L37) +fcomp qword ptr (-232)[ebp] +fstsw ax +sahf +ja L35 +fld qword ptr (-232)[ebp] +fsub qword ptr (L37) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-212)[ebp],edi +jmp L36 +L35: +fld qword ptr (-232)[ebp] +call __ftol +mov edi,eax +mov dword ptr (-212)[ebp],edi +L36: +mov edi,dword ptr (-212)[ebp] +mov ebx,edi +mov byte ptr (_C),bl +fld qword ptr (L37) +fcomp qword ptr (_D) +fstsw ax +sahf +ja L39 +fld qword ptr (_D) +fsub qword ptr (L37) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-216)[ebp],edi +jmp L40 +L39: +fld qword ptr (_D) +call __ftol +mov edi,eax +mov dword ptr (-216)[ebp],edi +L40: +mov edi,dword ptr (-216)[ebp] +mov word ptr (_S),di +fld qword ptr (L37) +fcomp qword ptr (_D) +fstsw ax +sahf +ja L42 +fld qword ptr (_D) +fsub qword ptr (L37) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-220)[ebp],edi +jmp L43 +L42: +fld qword ptr (_D) +call __ftol +mov edi,eax +mov dword ptr (-220)[ebp],edi +L43: +mov edi,dword ptr (-220)[ebp] +mov dword ptr (_I),edi +fld qword ptr (L37) +fcomp qword ptr (_D) +fstsw ax +sahf +ja L45 +fld qword ptr (_D) +fsub qword ptr (L37) +call __ftol +mov edi,eax +lea edi,(080000000H)[edi] +mov dword ptr (-224)[ebp],edi +jmp L46 +L45: +fld qword ptr (_D) +call __ftol +mov edi,eax +mov dword ptr (-224)[ebp],edi +L46: +mov edi,dword ptr (-224)[ebp] +mov dword ptr (_L),edi +fld qword ptr (_D) +fstp dword ptr (_f) +fld qword ptr (_D) +fstp qword ptr (_d) +call _print +add esp,0 +mov dword ptr (_p),0 +mov dword ptr (_p),0 +mov dword ptr (_p),0 +mov dword ptr (_p),0 +mov edi,dword ptr (_P) +mov dword ptr (_p),edi +mov dword ptr (_P),0 +mov dword ptr (_P),0 +mov dword ptr (_P),0 +mov dword ptr (_P),0 +mov edi,dword ptr (_p) +mov dword ptr (_P),edi +mov eax,0 +L3: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_DATA segment +public _P +align 4 +_P label byte +db 4 dup (0) +public _p +align 4 +_p label byte +db 4 dup (0) +public _D +align 4 +_D label byte +db 8 dup (0) +public _d +align 4 +_d label byte +db 8 dup (0) +public _f +align 4 +_f label byte +db 4 dup (0) +public _L +align 4 +_L label byte +db 4 dup (0) +public _I +align 4 +_I label byte +db 4 dup (0) +public _S +align 2 +_S label byte +db 2 dup (0) +public _C +align 1 +_C label byte +db 1 dup (0) +public _l +align 4 +_l label byte +db 4 dup (0) +public _i +align 4 +_i label byte +db 4 dup (0) +public _s +align 2 +_s label byte +db 2 dup (0) +public _c +align 1 +_c label byte +db 1 dup (0) +_DATA ends +_TEXT segment +align 4 +L37 label byte +dd 00H +dd 041e00000H +align 4 +L33 label byte +dd 00H +dd 040260000H +align 4 +L23 label byte +dd 00H +dd 041e00000H +align 4 +L19 label byte +dd 00H +dd 040240000H +align 4 +L9 label byte +dd 04f000000H +align 4 +L5 label byte +dd 041100000H +align 4 +L4 label byte +dd 00H +dd 040000000H +align 1 +L2 label byte +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 108 +db 100 +db 32 +db 37 +db 117 +db 32 +db 37 +db 117 +db 32 +db 37 +db 117 +db 32 +db 37 +db 108 +db 117 +db 32 +db 37 +db 102 +db 32 +db 37 +db 102 +db 32 +db 37 +db 108 +db 102 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/fields.1bk b/quake3/source/lcc/x86/win32/tst/fields.1bk new file mode 100644 index 0000000..f30b13f --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/fields.1bk @@ -0,0 +1,5 @@ +x = 1 2 3 4 -3 6 +y = 3 8 9 +x = 1 2 3 0 0 6 +y = 2 8 16 +p->a = 0x3, p->b = 0xf diff --git a/quake3/source/lcc/x86/win32/tst/fields.2bk b/quake3/source/lcc/x86/win32/tst/fields.2bk new file mode 100644 index 0000000..e689d78 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/fields.2bk @@ -0,0 +1,4 @@ +tst/fields.c:6: warning: initializer exceeds bit-field width +tst/fields.c:8: warning: initializer exceeds bit-field width +tst/fields.c:30: warning: missing return value +tst/fields.c:34: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/fields.sbk b/quake3/source/lcc/x86/win32/tst/fields.sbk new file mode 100644 index 0000000..0e5e059 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/fields.sbk @@ -0,0 +1,323 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +public _x +align 4 +_x label byte +dd 1 +db 2 +db 3 dup (0) +db 03H +db 040H +db 2 dup (0) +db 050H +db 6 +db 2 dup (0) +public _i +align 4 +_i label byte +dd 16 +public _y +align 4 +_y label byte +db 023H +db 3 dup (0) +db 09H +db 00H +db 00H +db 00H +public _main +_DATA ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +movsx edi,byte ptr (_x+13) +push edi +mov edi,dword ptr (_x+12) +sal edi,25 +sar edi,29 +push edi +mov edi,dword ptr (_x+8) +sal edi,16 +sar edi,28 +push edi +mov edi,dword ptr (_x+8) +sal edi,20 +sar edi,20 +push edi +movsx edi,byte ptr (_x+4) +push edi +mov edi,dword ptr (_x) +push edi +lea edi,(L4) +push edi +call _printf +add esp,28 +mov edi,dword ptr (_y+4) +push edi +mov edi,dword ptr (_y) +mov esi,edi +shr esi,2 +and esi,15 +push esi +and edi,3 +push edi +lea edi,(L10) +push edi +call _printf +add esp,16 +mov edi,dword ptr (_x+8) +and edi,0ffff0fffH +mov esi,dword ptr (_i) +sal esi,28 +sar esi,28 +shl esi,12 +and esi,0f000H +or edi,esi +mov dword ptr (_x+8),edi +mov edi,dword ptr (_x+12) +and edi,0ffffff8fH +mov dword ptr (_x+12),edi +movsx edi,byte ptr (_x+13) +push edi +mov edi,dword ptr (_x+12) +sal edi,25 +sar edi,29 +push edi +mov edi,dword ptr (_x+8) +sal edi,16 +sar edi,28 +push edi +mov edi,dword ptr (_x+8) +sal edi,20 +sar edi,20 +push edi +movsx edi,byte ptr (_x+4) +push edi +mov edi,dword ptr (_x) +push edi +lea edi,(L4) +push edi +call _printf +add esp,28 +mov edi,dword ptr (_y) +and edi,0fffffffcH +or edi,2 +mov dword ptr (_y),edi +mov edi,dword ptr (_i) +mov dword ptr (_y+4),edi +mov edi,dword ptr (_y+4) +push edi +mov edi,dword ptr (_y) +mov esi,edi +shr esi,2 +and esi,15 +push esi +and edi,3 +push edi +lea edi,(L10) +push edi +call _printf +add esp,16 +lea edi,(_x) +push edi +call _f2 +add esp,4 +mov eax,0 +L3: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f1 +_f1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +and dword ptr [edi],0ffffffc3H +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +and esi,0fffffffcH +mov ebx,0 +and ebx,3 +and ebx,3 +or esi,ebx +mov dword ptr [edi],esi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr [edi] +and edi,60 +cmp edi,0 +je L22 +lea edi,(L24) +push edi +call _printf +add esp,4 +L22: +mov edi,dword ptr (20)[ebp] +or dword ptr [edi],3 +mov edi,dword ptr (20)[ebp] +or dword ptr [edi],60 +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr [edi] +mov esi,edi +shr esi,2 +and esi,15 +push esi +and edi,3 +push edi +lea edi,(L25) +push edi +call _printf +add esp,12 +mov eax,0 +L21: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f2 +_f2: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +cmp dword ptr (_i),0 +jne L28 +mov dword ptr (-4)[ebp],1 +jmp L29 +L28: +mov dword ptr (-4)[ebp],0 +L29: +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +and esi,0fffffffcH +mov ebx,dword ptr (-4)[ebp] +and ebx,3 +and ebx,3 +or esi,ebx +mov dword ptr [edi],esi +mov edi,dword ptr (20)[ebp] +push edi +call _f1 +add esp,4 +mov esi,dword ptr [edi] +and esi,0ffffffc3H +mov ebx,0 +and ebx,15 +lea ebx,[ebx*4] +and ebx,60 +or esi,ebx +mov dword ptr [edi],esi +mov eax,0 +L26: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_TEXT segment +align 1 +L25 label byte +db 112 +db 45 +db 62 +db 97 +db 32 +db 61 +db 32 +db 48 +db 120 +db 37 +db 120 +db 44 +db 32 +db 112 +db 45 +db 62 +db 98 +db 32 +db 61 +db 32 +db 48 +db 120 +db 37 +db 120 +db 10 +db 0 +align 1 +L24 label byte +db 112 +db 45 +db 62 +db 98 +db 32 +db 33 +db 61 +db 32 +db 48 +db 33 +db 10 +db 0 +align 1 +L10 label byte +db 121 +db 32 +db 61 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L4 label byte +db 120 +db 32 +db 61 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/front.2bk b/quake3/source/lcc/x86/win32/tst/front.2bk new file mode 100644 index 0000000..841e6a5 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/front.2bk @@ -0,0 +1,29 @@ +tst/front.c:3: warning: missing return value +tst/front.c:10: warning: missing return value +tst/front.c:20: type error in argument 1 to `s'; found `pointer to struct D' expected `pointer to incomplete struct D defined at tst/front.c:14' +tst/front.c:21: warning: missing return value +tst/front.c:32: warning: missing return value +tst/front.c:36: operands of = have illegal types `pointer to int' and `pointer to const int' +tst/front.c:38: warning: missing return value +tst/front.c:62: operands of = have illegal types `pointer to char' and `pointer to const void' +tst/front.c:63: warning: missing return value +tst/front.c:68: warning: missing return value +tst/front.c:69: warning: inconsistent linkage for `yy' previously declared at tst/front.c:68 +tst/front.c:69: warning: missing return value +tst/front.c:71: invalid storage class `static' for `int function goo' +tst/front.c:71: warning: declaration of `goo' does not match previous declaration at tst/front.c:70 +tst/front.c:71: warning: missing return value +tst/front.c:74: warning: declaration of `xr' does not match previous declaration at tst/front.c:72 +tst/front.c:74: warning: missing return value +tst/front.c:81: warning: missing return value +tst/front.c:82: warning: declaration of `ss2' does not match previous declaration at tst/front.c:81 +tst/front.c:84: warning: inconsistent linkage for `ss5' previously declared at tst/front.c:80 +tst/front.c:92: type error in argument 1 to `gx1'; found `pointer to double' expected `double' +tst/front.c:92: warning: missing return value +tst/front.c:95: redeclaration of `hx1' previously declared at tst/front.c:94 +tst/front.c:98: warning: missing return value +tst/front.c:101: conflicting argument declarations for function `gg1' +tst/front.c:101: warning: missing return value +tst/front.c:112: type error in argument 4 to `qsort'; found `pointer to int function(pointer to pointer to char,pointer to pointer to char)' expected `pointer to int function(pointer to const void,pointer to const void)' +tst/front.c:113: warning: missing return value +tst/front.c:120: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/front.sbk b/quake3/source/lcc/x86/win32/tst/front.sbk new file mode 100644 index 0000000..b3a6945 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/front.sbk @@ -0,0 +1,436 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +push 0 +call _exit +add esp,4 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _nested +_nested: +push ebx +push esi +push edi +push ebp +mov ebp,esp +cmp dword ptr (20)[ebp],4 +jge L6 +cmp dword ptr (24)[ebp],114 +je L9 +L6: +cmp dword ptr (20)[ebp],1 +jne L8 +mov edi,dword ptr (24)[ebp] +cmp edi,104 +je L9 +cmp edi,105 +je L9 +L8: +cmp dword ptr (20)[ebp],2 +jne L3 +mov edi,dword ptr (24)[ebp] +cmp edi,111 +je L9 +cmp edi,121 +jne L3 +L9: +mov edi,dword ptr (24)[ebp] +mov dword ptr (20)[ebp],edi +L3: +mov eax,0 +L2: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _s +_s: +push ebx +push esi +push edi +push ebp +mov ebp,esp +L10: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +public _Dy +align 4 +_Dy label byte +dd 0 +db 4 dup (0) +public _Dz +align 4 +_Dz label byte +dd 1 +db 4 dup (0) +public _Dfunc +_DATA ends +_TEXT segment +_Dfunc: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f +_f: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f1 +_f1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f2 +_f2: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _g +_g: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _h +_h: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _h1 +_h1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _h2 +_h2: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L21 label byte +dd 1 +public _set1 +_DATA ends +_TEXT segment +_set1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L23 label byte +dd 2 +public _set2 +_DATA ends +_TEXT segment +_set2: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_goo: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _sss +_sss: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L27 label byte +db 4 dup (0) +public _rrr +_DATA ends +_TEXT segment +_rrr: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _setstatic +_setstatic: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _gx1 +_gx1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _ff1 +_ff1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _gg1 +_gg1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _hh1 +_hh1: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _cmp +_cmp: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _sort +_sort: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _onearg +_onearg: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _exit:near +_TEXT segment +_TEXT ends +extrn _qsort:near +_TEXT segment +_TEXT ends +extrn _strcmp:near +_TEXT segment +_TEXT ends +_DATA segment +public _ss4 +align 4 +_ss4 label byte +db 4 dup (0) +align 4 +_ss2 label byte +db 4 dup (0) +align 4 +_ss5 label byte +db 4 dup (0) +public _ss3 +align 4 +_ss3 label byte +db 4 dup (0) +align 4 +_ss1 label byte +db 4 dup (0) +align 4 +_yy label byte +db 4 dup (0) +public _z +align 4 +_z label byte +db 4 dup (0) +public _y +align 4 +_y label byte +db 4 dup (0) +public _x +align 4 +_x label byte +db 4 dup (0) +public _b +align 4 +_b label byte +db 4 dup (0) +public _a +align 4 +_a label byte +db 4 dup (0) +_DATA ends +end diff --git a/quake3/source/lcc/x86/win32/tst/incr.1bk b/quake3/source/lcc/x86/win32/tst/incr.1bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/win32/tst/incr.2bk b/quake3/source/lcc/x86/win32/tst/incr.2bk new file mode 100644 index 0000000..b86c400 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/incr.2bk @@ -0,0 +1,9 @@ +tst/incr.c:1: warning: missing return value +tst/incr.c:6: warning: expression with no effect elided +tst/incr.c:6: warning: expression with no effect elided +tst/incr.c:11: warning: missing return value +tst/incr.c:16: warning: expression with no effect elided +tst/incr.c:16: warning: expression with no effect elided +tst/incr.c:21: warning: missing return value +tst/incr.c:30: warning: missing return value +tst/incr.c:39: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/incr.sbk b/quake3/source/lcc/x86/win32/tst/incr.sbk new file mode 100644 index 0000000..222ce32 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/incr.sbk @@ -0,0 +1,166 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _memchar +_memchar: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov edi,dword ptr (-8)[ebp] +lea edi,(1)[edi] +mov dword ptr (-8)[ebp],edi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov edi,dword ptr (-8)[ebp] +lea esi,(-1)[edi] +mov dword ptr (-8)[ebp],esi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov edi,dword ptr (-8)[ebp] +lea edi,(-1)[edi] +mov dword ptr (-8)[ebp],edi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov eax,0 +L2: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _memint +_memint: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov edi,dword ptr (-8)[ebp] +lea esi,(4)[edi] +mov dword ptr (-8)[ebp],esi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea edi,(4)[edi] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea esi,(-4)[edi] +mov dword ptr (-8)[ebp],esi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea edi,(-4)[edi] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov eax,0 +L3: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _regchar +_regchar: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov edi,dword ptr (-8)[ebp] +lea edi,(1)[edi] +mov dword ptr (-8)[ebp],edi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov edi,dword ptr (-8)[ebp] +lea esi,(-1)[edi] +mov dword ptr (-8)[ebp],esi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov edi,dword ptr (-8)[ebp] +lea edi,(-1)[edi] +mov dword ptr (-8)[ebp],edi +mov bl,byte ptr [edi] +mov byte ptr (-1)[ebp],bl +mov eax,0 +L4: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _regint +_regint: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov edi,dword ptr (-8)[ebp] +lea esi,(4)[edi] +mov dword ptr (-8)[ebp],esi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea edi,(4)[edi] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea esi,(-4)[edi] +mov dword ptr (-8)[ebp],esi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-8)[ebp] +lea edi,(-4)[edi] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr [edi] +mov dword ptr (-4)[ebp],edi +mov eax,0 +L5: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/init.1bk b/quake3/source/lcc/x86/win32/tst/init.1bk new file mode 100644 index 0000000..042f3bb --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/init.1bk @@ -0,0 +1,16 @@ + 1 2 3 4 + 5 6 + 7 +if +for +else +while +1 2 3 if +4 5 0 for +6 7 8 else +9 10 11 while +1 2 3 if +4 5 0 for +6 7 8 else +9 10 11 while +0 0 0 diff --git a/quake3/source/lcc/x86/win32/tst/init.2bk b/quake3/source/lcc/x86/win32/tst/init.2bk new file mode 100644 index 0000000..da08062 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/init.2bk @@ -0,0 +1,3 @@ +tst/init.c:36: warning: missing return value +tst/init.c:49: warning: missing return value +tst/init.c:59: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/init.sbk b/quake3/source/lcc/x86/win32/tst/init.sbk new file mode 100644 index 0000000..be83cbd --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/init.sbk @@ -0,0 +1,336 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +public _words +align 4 +_words label byte +dd 1 +dd 2 +dd 3 +db 105 +db 102 +db 0 +db 3 dup (0) +db 2 dup (0) +dd 4 +dd 5 +db 4 dup (0) +db 102 +db 111 +db 114 +db 3 dup (0) +db 2 dup (0) +dd 6 +dd 7 +dd 8 +db 101 +db 108 +db 115 +db 101 +db 0 +db 1 dup (0) +db 2 dup (0) +dd 9 +dd 10 +dd 11 +db 119 +db 104 +db 105 +db 108 +db 101 +db 1 dup (0) +db 2 dup (0) +dd 0 +db 8 dup (0) +db 8 dup (0) +public _wordlist +align 4 +_wordlist label byte +dd _words +public _x +align 4 +_x label byte +dd 1 +dd 2 +dd 3 +dd 4 +dd 0 +dd 5 +dd 6 +db 12 dup (0) +dd 7 +db 16 dup (0) +public _y +align 4 +_y label byte +dd _x +dd _x+20 +dd _x+40 +dd 00H +public _main +_DATA ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov dword ptr (-8)[ebp],0 +jmp L8 +L5: +mov dword ptr (-4)[ebp],0 +jmp L12 +L9: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +mov esi,dword ptr (_y)[esi*4] +mov edi,dword ptr [esi][edi*4] +push edi +lea edi,(L13) +push edi +call _printf +add esp,8 +L10: +inc dword ptr (-4)[ebp] +L12: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (-8)[ebp] +mov esi,dword ptr (_y)[esi*4] +cmp dword ptr [esi][edi*4],0 +jne L9 +lea edi,(L14) +push edi +call _printf +add esp,4 +L6: +inc dword ptr (-8)[ebp] +L8: +mov edi,dword ptr (-8)[ebp] +mov edi,dword ptr (_y)[edi*4] +cmp edi,0 +jne L5 +call _f +add esp,0 +mov edi,dword ptr (_wordlist) +push edi +call _g +add esp,4 +mov eax,0 +L4: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L16 label byte +dd L17 +dd L18 +dd L19 +dd L20 +dd 00H +public _f +_DATA ends +_TEXT segment +_f: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +lea edi,(L16) +mov dword ptr (-4)[ebp],edi +jmp L24 +L21: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr [edi] +push edi +lea edi,(L25) +push edi +call _printf +add esp,8 +L22: +mov edi,dword ptr (-4)[ebp] +lea edi,(4)[edi] +mov dword ptr (-4)[ebp],edi +L24: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr [edi] +cmp edi,0 +jne L21 +mov eax,0 +L15: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _g +_g: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +jmp L30 +L27: +mov dword ptr (-4)[ebp],0 +jmp L34 +L31: +mov edi,dword ptr (-4)[ebp] +mov esi,dword ptr (20)[ebp] +mov edi,dword ptr [esi][edi*4] +push edi +lea edi,(L35) +push edi +call _printf +add esp,8 +L32: +inc dword ptr (-4)[ebp] +L34: +mov edi,dword ptr (-4)[ebp] +cmp edi,3 +jb L31 +mov edi,dword ptr (20)[ebp] +lea edi,(12)[edi] +push edi +lea edi,(L25) +push edi +call _printf +add esp,8 +L28: +mov edi,dword ptr (20)[ebp] +lea edi,(20)[edi] +mov dword ptr (20)[ebp],edi +L30: +mov edi,dword ptr (20)[ebp] +cmp dword ptr [edi],0 +jne L27 +call _h +add esp,0 +mov eax,0 +L26: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _h +_h: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],0 +jmp L40 +L37: +imul edi,dword ptr (-4)[ebp],20 +lea esi,(_words+12)[edi] +push esi +mov esi,dword ptr (_words+8)[edi] +push esi +mov esi,dword ptr (_words+4)[edi] +push esi +mov edi,dword ptr (_words)[edi] +push edi +lea edi,(L41) +push edi +call _printf +add esp,20 +L38: +inc dword ptr (-4)[ebp] +L40: +mov edi,dword ptr (-4)[ebp] +cmp edi,5 +jb L37 +mov eax,0 +L36: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_TEXT segment +align 1 +L41 label byte +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 115 +db 10 +db 0 +align 1 +L35 label byte +db 37 +db 100 +db 32 +db 0 +align 1 +L25 label byte +db 37 +db 115 +db 10 +db 0 +align 1 +L20 label byte +db 119 +db 104 +db 105 +db 108 +db 101 +db 0 +align 1 +L19 label byte +db 101 +db 108 +db 115 +db 101 +db 0 +align 1 +L18 label byte +db 102 +db 111 +db 114 +db 0 +align 1 +L17 label byte +db 105 +db 102 +db 0 +align 1 +L14 label byte +db 10 +db 0 +align 1 +L13 label byte +db 32 +db 37 +db 100 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/limits.1bk b/quake3/source/lcc/x86/win32/tst/limits.1bk new file mode 100644 index 0000000..f0c1dc8 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/limits.1bk @@ -0,0 +1,14 @@ +UCHAR_MAX: 000000ff=255 +USHRT_MAX: 0000ffff=65535 +UINT_MAX: ffffffff=-1 +ULONG_MAX: ffffffff=-1 +CHAR_MAX: 0000007f=127 +SCHAR_MAX: 0000007f=127 +SHRT_MAX: 00007fff=32767 +INT_MAX: 7fffffff=2147483647 +LONG_MAX: 7fffffff=2147483647 +CHAR_MIN: ffffff80=-128 +SCHAR_MIN: ffffff80=-128 +SHRT_MIN: ffff8000=-32768 +INT_MIN: 80000000=-2147483648 +LONG_MIN: 80000000=-2147483648 diff --git a/quake3/source/lcc/x86/win32/tst/limits.2bk b/quake3/source/lcc/x86/win32/tst/limits.2bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/win32/tst/limits.sbk b/quake3/source/lcc/x86/win32/tst/limits.sbk new file mode 100644 index 0000000..f041121 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/limits.sbk @@ -0,0 +1,414 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +push 255 +push 255 +lea edi,(L2) +push edi +call _printf +add esp,12 +push 65535 +push 65535 +lea edi,(L3) +push edi +call _printf +add esp,12 +push 0ffffffffH +push 0ffffffffH +lea edi,(L4) +push edi +call _printf +add esp,12 +push 0ffffffffH +push 0ffffffffH +lea edi,(L5) +push edi +call _printf +add esp,12 +push 127 +push 127 +lea edi,(L6) +push edi +call _printf +add esp,12 +push 127 +push 127 +lea edi,(L7) +push edi +call _printf +add esp,12 +push 32767 +push 32767 +lea edi,(L8) +push edi +call _printf +add esp,12 +push 2147483647 +push 2147483647 +lea edi,(L9) +push edi +call _printf +add esp,12 +push 2147483647 +push 2147483647 +lea edi,(L10) +push edi +call _printf +add esp,12 +push -128 +push -128 +lea edi,(L11) +push edi +call _printf +add esp,12 +push -128 +push -128 +lea edi,(L12) +push edi +call _printf +add esp,12 +push -32768 +push -32768 +lea edi,(L13) +push edi +call _printf +add esp,12 +push -2147483648 +push -2147483648 +lea edi,(L14) +push edi +call _printf +add esp,12 +push -2147483648 +push -2147483648 +lea edi,(L15) +push edi +call _printf +add esp,12 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_TEXT segment +align 1 +L15 label byte +db 76 +db 79 +db 78 +db 71 +db 95 +db 77 +db 73 +db 78 +db 58 +db 9 +db 37 +db 48 +db 56 +db 108 +db 120 +db 61 +db 37 +db 108 +db 100 +db 10 +db 0 +align 1 +L14 label byte +db 73 +db 78 +db 84 +db 95 +db 77 +db 73 +db 78 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L13 label byte +db 83 +db 72 +db 82 +db 84 +db 95 +db 77 +db 73 +db 78 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L12 label byte +db 83 +db 67 +db 72 +db 65 +db 82 +db 95 +db 77 +db 73 +db 78 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L11 label byte +db 67 +db 72 +db 65 +db 82 +db 95 +db 77 +db 73 +db 78 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L10 label byte +db 76 +db 79 +db 78 +db 71 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 108 +db 120 +db 61 +db 37 +db 108 +db 100 +db 10 +db 0 +align 1 +L9 label byte +db 73 +db 78 +db 84 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L8 label byte +db 83 +db 72 +db 82 +db 84 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L7 label byte +db 83 +db 67 +db 72 +db 65 +db 82 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L6 label byte +db 67 +db 72 +db 65 +db 82 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L5 label byte +db 85 +db 76 +db 79 +db 78 +db 71 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 108 +db 120 +db 61 +db 37 +db 108 +db 100 +db 10 +db 0 +align 1 +L4 label byte +db 85 +db 73 +db 78 +db 84 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L3 label byte +db 85 +db 83 +db 72 +db 82 +db 84 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +align 1 +L2 label byte +db 85 +db 67 +db 72 +db 65 +db 82 +db 95 +db 77 +db 65 +db 88 +db 58 +db 9 +db 37 +db 48 +db 56 +db 120 +db 61 +db 37 +db 100 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/paranoia.1bk b/quake3/source/lcc/x86/win32/tst/paranoia.1bk new file mode 100644 index 0000000..e25ef14 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/paranoia.1bk @@ -0,0 +1,179 @@ +Lest this program stop prematurely, i.e. before displaying + + `END OF TEST', + +try to persuade the computer NOT to terminate execution when an +error like Over/Underflow or Division by Zero occurs, but rather +to persevere with a surrogate value after, perhaps, displaying some +warning. If persuasion avails naught, don't despair but run this +program anyway to see how many milestones it passes, and then +amend it to make further progress. + +Answer questions with Y, y, N or n (unless otherwise indicated). + + +Diagnosis resumes after milestone Number 0 Page: 1 + +Users are invited to help debug and augment this program so it will +cope with unanticipated and newly uncovered arithmetic pathologies. + +Please send suggestions and interesting results to + Richard Karpinski + Computer Center U-76 + University of California + San Francisco, CA 94143-0704, USA + +In doing so, please include the following information: + Precision: double; + Version: 10 February 1989; + Computer: + + Compiler: + + Optimization level: + + Other relevant compiler options: + +Diagnosis resumes after milestone Number 1 Page: 2 + +Running this program should reveal these characteristics: + Radix = 1, 2, 4, 8, 10, 16, 100, 256 ... + Precision = number of significant digits carried. + U2 = Radix/Radix^Precision = One Ulp + (OneUlpnit in the Last Place) of 1.000xxx . + U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 . + Adequacy of guard digits for Mult., Div. and Subt. + Whether arithmetic is chopped, correctly rounded, or something else + for Mult., Div., Add/Subt. and Sqrt. + Whether a Sticky Bit used correctly for rounding. + UnderflowThreshold = an underflow threshold. + E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy. + V = an overflow threshold, roughly. + V0 tells, roughly, whether Infinity is represented. + Comparisions are checked for consistency with subtraction + and for contamination with pseudo-zeros. + Sqrt is tested. Y^X is not tested. + Extra-precise subexpressions are revealed but NOT YET tested. + Decimal-Binary conversion is NOT YET tested for accuracy. + +Diagnosis resumes after milestone Number 2 Page: 3 + +The program attempts to discriminate among + FLAWs, like lack of a sticky bit, + Serious DEFECTs, like lack of a guard digit, and + FAILUREs, like 2+2 == 5 . +Failures may confound subsequent diagnoses. + +The diagnostic capabilities of this program go beyond an earlier +program called `MACHAR', which can be found at the end of the +book `Software Manual for the Elementary Functions' (1980) by +W. J. Cody and W. Waite. Although both programs try to discover +the Radix, Precision and range (over/underflow thresholds) +of the arithmetic, this program tries to cope with a wider variety +of pathologies, and to say how well the arithmetic is implemented. + +The program is based upon a conventional radix representation for +floating-point numbers, but also allows logarithmic encoding +as used by certain early WANG machines. + +BASIC version of this program (C) 1983 by Prof. W. M. Kahan; +see source comments for more history. + +Diagnosis resumes after milestone Number 3 Page: 4 + +Program is now RUNNING tests on small integers: +-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K. + +Searching for Radix and Precision. +Radix = 2.000000 . +Closest relative separation found is U1 = 1.1102230e-016 . + +Recalculating radix and precision + confirms closest relative separation U1 . +Radix confirmed. +The number of significant digits of the Radix is 53.000000 . + +Diagnosis resumes after milestone Number 30 Page: 5 + +Subtraction appears to be normalized, as it should be. +Checking for guard digit in *, /, and -. + *, /, and - appear to have guard digits, as they should. + +Diagnosis resumes after milestone Number 40 Page: 6 + +Checking rounding on multiply, divide and add/subtract. +Multiplication appears to round correctly. +Division appears to round correctly. +Addition/Subtraction appears to round correctly. +Checking for sticky bit. +Sticky bit apparently used correctly. + +Does Multiplication commute? Testing on 20 random pairs. + No failures found in 20 integer pairs. + +Running test of square root(x). +Testing if sqrt(X * X) == X for 20 Integers X. +Test for sqrt monotonicity. +sqrt has passed a test for Monotonicity. +Testing whether sqrt is rounded or chopped. +Square root appears to be correctly rounded. + +Diagnosis resumes after milestone Number 90 Page: 7 + +Testing powers Z^i for small Integers Z and i. +... no discrepancis found. + +Seeking Underflow thresholds UfThold and E0. +Smallest strictly positive number found is E0 = 4.94066e-324 . +Since comparison denies Z = 0, evaluating (Z + Z) / Z should be safe. +What the machine gets for (Z + Z) / Z is 2.00000000000000000e+000 . +This is O.K., provided Over/Underflow has NOT just been signaled. +Underflow is gradual; it incurs Absolute Error = +(roundoff in UfThold) < E0. +The Underflow threshold is 2.22507385850720190e-308, below which +calculation may suffer larger Relative error than merely roundoff. +Since underflow occurs below the threshold +UfThold = (2.00000000000000000e+000) ^ (-1.02200000000000000e+003) +only underflow should afflict the expression + (2.00000000000000000e+000) ^ (-1.02200000000000000e+003); +actually calculating yields: 0.00000000000000000e+000 . +This computed value is O.K. + +Testing X^((X + 1) / (X - 1)) vs. exp(2) = 7.38905609893065220e+000 as X -> 1. +Accuracy seems adequate. +Testing powers Z^Q at four nearly extreme values. + ... no discrepancies found. + + +Diagnosis resumes after milestone Number 160 Page: 8 + +Searching for Overflow threshold: +This may generate an error. +Can `Z = -Y' overflow? +Trying it on Y = -1.#INF0000000000000e+000 . +Seems O.K. +Overflow threshold is V = 1.79769313486231570e+308 . +Overflow saturates at V0 = 1.#INF0000000000000e+000 . +No Overflow should be signaled for V * 1 = 1.79769313486231570e+308 + nor for V / 1 = 1.79769313486231570e+308 . +Any overflow signal separating this * from the one +above is a DEFECT. + + +Diagnosis resumes after milestone Number 190 Page: 9 + + +What message and/or values does Division by Zero produce? + Trying to compute 1 / 0 produces ... 1.#INF000e+000 . + + Trying to compute 0 / 0 produces ... -1.#IND000e+000 . + +Diagnosis resumes after milestone Number 220 Page: 10 + + + +No failures, defects nor flaws have been discovered. +Rounding appears to conform to the proposed IEEE standard P754, +except for possibly Double Rounding during Gradual Underflow. +The arithmetic diagnosed appears to be Excellent! +END OF TEST. diff --git a/quake3/source/lcc/x86/win32/tst/paranoia.2bk b/quake3/source/lcc/x86/win32/tst/paranoia.2bk new file mode 100644 index 0000000..f6ddf16 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/paranoia.2bk @@ -0,0 +1,16 @@ +tst/paranoia.c:1867: warning: missing return value +tst/paranoia.c:1874: warning: missing return value +tst/paranoia.c:1884: warning: missing return value +tst/paranoia.c:1924: warning: missing return value +tst/paranoia.c:1939: warning: missing return value +tst/paranoia.c:1956: warning: missing return value +tst/paranoia.c:1975: warning: missing return value +tst/paranoia.c:1988: warning: missing return value +tst/paranoia.c:1995: warning: missing return value +tst/paranoia.c:2055: warning: missing return value +tst/paranoia.c:2062: warning: missing return value +tst/paranoia.c:2070: warning: missing return value +tst/paranoia.c:2087: warning: missing return value +tst/paranoia.c:2115: warning: missing return value +tst/paranoia.c:2144: warning: missing return value +tst/paranoia.c:2173: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/paranoia.sbk b/quake3/source/lcc/x86/win32/tst/paranoia.sbk new file mode 100644 index 0000000..bcce8d3 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/paranoia.sbk @@ -0,0 +1,20480 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +public _Zero +align 4 +_Zero label byte +dd 00H +dd 00H +public _Half +align 4 +_Half label byte +dd 00H +dd 03fe00000H +public _One +align 4 +_One label byte +dd 00H +dd 03ff00000H +public _Two +align 4 +_Two label byte +dd 00H +dd 040000000H +public _Three +align 4 +_Three label byte +dd 00H +dd 040080000H +public _Four +align 4 +_Four label byte +dd 00H +dd 040100000H +public _Five +align 4 +_Five label byte +dd 00H +dd 040140000H +public _Eight +align 4 +_Eight label byte +dd 00H +dd 040200000H +public _Nine +align 4 +_Nine label byte +dd 00H +dd 040220000H +public _TwentySeven +align 4 +_TwentySeven label byte +dd 00H +dd 0403b0000H +public _ThirtyTwo +align 4 +_ThirtyTwo label byte +dd 00H +dd 040400000H +public _TwoForty +align 4 +_TwoForty label byte +dd 00H +dd 0406e0000H +public _MinusOne +align 4 +_MinusOne label byte +dd 00H +dd 0bff00000H +public _OneAndHalf +align 4 +_OneAndHalf label byte +dd 00H +dd 03ff80000H +public _NoTrials +align 4 +_NoTrials label byte +dd 20 +public _sigfpe +_DATA ends +_TEXT segment +_sigfpe: +push ebx +push esi +push edi +push ebp +mov ebp,esp +inc dword ptr (_fpecount) +lea edi,(L2) +push edi +call _printf +add esp,4 +lea edi,(__iob+32) +push edi +call _fflush +add esp,4 +mov edi,dword ptr (_sigsave) +cmp edi,0 +je L4 +mov edi,dword ptr (_sigsave) +push edi +push 8 +call _signal +add esp,8 +mov dword ptr (_sigsave),0 +push 1 +lea edi,(_ovfl_buf) +push edi +call _longjmp +add esp,8 +L4: +call _abort +add esp,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L757 label byte +dd L758 +dd L759 +dd L760 +dd L761 +public _main +_DATA ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,1684 +fld qword ptr (L7) +fstp qword ptr (_Zero) +fld qword ptr (L8) +fstp qword ptr (_One) +fld qword ptr (_One) +fstp qword ptr (-8)[ebp] +fld qword ptr (-8)[ebp] +fadd qword ptr (-8)[ebp] +fstp qword ptr (_Two) +fld qword ptr (_Two) +fstp qword ptr (-16)[ebp] +fld qword ptr (-16)[ebp] +fadd qword ptr (-8)[ebp] +fstp qword ptr (_Three) +fld qword ptr (_Three) +fstp qword ptr (-24)[ebp] +fld qword ptr (-24)[ebp] +fadd qword ptr (-8)[ebp] +fstp qword ptr (_Four) +fld qword ptr (_Four) +fstp qword ptr (-32)[ebp] +fld qword ptr (-32)[ebp] +fadd qword ptr (-8)[ebp] +fstp qword ptr (_Five) +fld qword ptr (-32)[ebp] +fadd qword ptr (-32)[ebp] +fstp qword ptr (_Eight) +fld qword ptr (-24)[ebp] +fmul qword ptr (-24)[ebp] +fstp qword ptr (_Nine) +fld qword ptr (_Nine) +fmul qword ptr (-24)[ebp] +fstp qword ptr (_TwentySeven) +fld qword ptr (-32)[ebp] +fmul qword ptr (_Eight) +fstp qword ptr (_ThirtyTwo) +fld qword ptr (-32)[ebp] +fmul qword ptr (_Five) +fmul qword ptr (-24)[ebp] +fmul qword ptr (-32)[ebp] +fstp qword ptr (_TwoForty) +fld qword ptr (-8)[ebp] +fchs +fstp qword ptr (_MinusOne) +fld qword ptr (-8)[ebp] +fdiv qword ptr (-16)[ebp] +fstp qword ptr (_Half) +fld qword ptr (-8)[ebp] +fadd qword ptr (_Half) +fstp qword ptr (_OneAndHalf) +mov dword ptr (_ErrCnt),0 +mov dword ptr (_ErrCnt+4),0 +mov dword ptr (_ErrCnt+8),0 +mov dword ptr (_ErrCnt+12),0 +mov dword ptr (_PageNo),1 +mov dword ptr (_Milestone),0 +lea edi,(_sigfpe) +push edi +push 8 +call _signal +add esp,8 +call _Instructions +add esp,0 +call _Pause +add esp,0 +call _Heading +add esp,0 +call _Pause +add esp,0 +call _Characteristics +add esp,0 +call _Pause +add esp,0 +call _History +add esp,0 +call _Pause +add esp,0 +mov dword ptr (_Milestone),7 +lea edi,(L12) +push edi +call _printf +add esp,4 +lea edi,(L14) +push edi +fld qword ptr (_Zero) +fadd qword ptr (_Zero) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L15 +fld qword ptr (_One) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L15 +fld qword ptr (_Zero) +fcomp qword ptr (_One) +fstsw ax +sahf +jae L15 +fld qword ptr (_One) +fadd qword ptr (_One) +fld qword ptr (_Two) +fcompp +fstsw ax +sahf +jne L15 +mov dword ptr (-36)[ebp],1 +jmp L16 +L15: +mov dword ptr (-36)[ebp],0 +L16: +mov edi,dword ptr (-36)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_Zero) +fchs +fstp qword ptr (_Z) +fld qword ptr (L7) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L17 +inc dword ptr (_ErrCnt) +lea edi,(L19) +push edi +call _printf +add esp,4 +fld qword ptr (L20) +fstp qword ptr (_U1) +fld qword ptr (L8) +fstp qword ptr (_Radix) +call _TstPtUf +add esp,0 +L17: +lea edi,(L22) +push edi +fld qword ptr (_Two) +fadd qword ptr (_One) +fcomp qword ptr (_Three) +fstsw ax +sahf +jne L23 +fld qword ptr (_Three) +fadd qword ptr (_One) +fcomp qword ptr (_Four) +fstsw ax +sahf +jne L23 +fld qword ptr (_Four) +fld qword ptr (_Two) +fld qword ptr (_Two) +fchs +fmulp st(1),st +faddp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L23 +fld qword ptr (_Four) +fsub qword ptr (_Three) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L23 +mov dword ptr (-56)[ebp],1 +jmp L24 +L23: +mov dword ptr (-56)[ebp],0 +L24: +mov edi,dword ptr (-56)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (L7) +fsub qword ptr (_One) +fcomp qword ptr (_MinusOne) +fstsw ax +sahf +jne L27 +fld qword ptr (_MinusOne) +fadd qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L27 +fld qword ptr (_One) +fadd qword ptr (_MinusOne) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L27 +fld qword ptr (_One) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-132)[ebp] +fld qword ptr (_MinusOne) +fadd qword ptr (-132)[ebp] +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L27 +fld qword ptr (_MinusOne) +fld qword ptr (_MinusOne) +fmul qword ptr (_MinusOne) +faddp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L27 +mov dword ptr (-100)[ebp],1 +jmp L28 +L27: +mov dword ptr (-100)[ebp],0 +L28: +lea edi,(L26) +push edi +mov edi,dword ptr (-100)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +lea edi,(L30) +push edi +fld qword ptr (_Half) +fadd qword ptr (_MinusOne) +fadd qword ptr (_Half) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L31 +mov dword ptr (-152)[ebp],1 +jmp L32 +L31: +mov dword ptr (-152)[ebp],0 +L32: +mov edi,dword ptr (-152)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +mov dword ptr (_Milestone),10 +lea edi,(L34) +push edi +fld qword ptr (_Three) +fmul qword ptr (_Three) +fcomp qword ptr (_Nine) +fstsw ax +sahf +jne L35 +fld qword ptr (_Nine) +fmul qword ptr (_Three) +fcomp qword ptr (_TwentySeven) +fstsw ax +sahf +jne L35 +fld qword ptr (_Four) +fadd qword ptr (_Four) +fcomp qword ptr (_Eight) +fstsw ax +sahf +jne L35 +fld qword ptr (_Eight) +fmul qword ptr (_Four) +fcomp qword ptr (_ThirtyTwo) +fstsw ax +sahf +jne L35 +fld qword ptr (_ThirtyTwo) +fsub qword ptr (_TwentySeven) +fsub qword ptr (_Four) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L35 +mov dword ptr (-164)[ebp],1 +jmp L36 +L35: +mov dword ptr (-164)[ebp],0 +L36: +mov edi,dword ptr (-164)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +lea edi,(L38) +push edi +fld qword ptr (_Four) +fadd qword ptr (_One) +fcomp qword ptr (_Five) +fstsw ax +sahf +jne L39 +fld qword ptr (_Four) +fmul qword ptr (_Five) +fmul qword ptr (_Three) +fmul qword ptr (_Four) +fcomp qword ptr (_TwoForty) +fstsw ax +sahf +jne L39 +fld qword ptr (_TwoForty) +fdiv qword ptr (_Three) +fld qword ptr (_Four) +fmul qword ptr (_Four) +fmul qword ptr (_Five) +fsubp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L39 +fld qword ptr (_TwoForty) +fdiv qword ptr (_Four) +fld qword ptr (_Five) +fmul qword ptr (_Three) +fmul qword ptr (_Four) +fsubp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L39 +fld qword ptr (_TwoForty) +fdiv qword ptr (_Five) +fld qword ptr (_Four) +fmul qword ptr (_Three) +fmul qword ptr (_Four) +fsubp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L39 +mov dword ptr (-216)[ebp],1 +jmp L40 +L39: +mov dword ptr (-216)[ebp],0 +L40: +mov edi,dword ptr (-216)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +cmp dword ptr (_ErrCnt),0 +jne L41 +lea edi,(L43) +push edi +call _printf +add esp,4 +lea edi,(L44) +push edi +call _printf +add esp,4 +L41: +lea edi,(L45) +push edi +call _printf +add esp,4 +fld qword ptr (_One) +fstp qword ptr (_W) +L46: +fld qword ptr (_W) +fstp qword ptr (-264)[ebp] +fld qword ptr (-264)[ebp] +fadd qword ptr (-264)[ebp] +fstp qword ptr (_W) +fld qword ptr (_W) +fstp qword ptr (-272)[ebp] +fld qword ptr (-272)[ebp] +fadd qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (-272)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_Z) +fsub qword ptr (_One) +fstp qword ptr (_Y) +L47: +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-264)[ebp] +fld qword ptr (_MinusOne) +fadd qword ptr (-264)[ebp] +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +ja L46 +fld qword ptr (_Zero) +fstp qword ptr (_Precision) +fld qword ptr (_One) +fstp qword ptr (_Y) +L49: +fld qword ptr (_Y) +fstp qword ptr (-280)[ebp] +fld qword ptr (_W) +fadd qword ptr (-280)[ebp] +fstp qword ptr (_Radix) +fld qword ptr (-280)[ebp] +fadd qword ptr (-280)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Radix) +fsub qword ptr (_W) +fstp qword ptr (_Radix) +L50: +fld qword ptr (_Zero) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L49 +fld qword ptr (_Two) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jbe L52 +fld qword ptr (_One) +fstp qword ptr (_Radix) +L52: +fld qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L54) +push edi +call _printf +add esp,12 +fld qword ptr (L8) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L55 +fld qword ptr (_One) +fstp qword ptr (_W) +L57: +fld qword ptr (_Precision) +fadd qword ptr (_One) +fstp qword ptr (_Precision) +fld qword ptr (_W) +fmul qword ptr (_Radix) +fstp qword ptr (_W) +fld qword ptr (_W) +fadd qword ptr (_One) +fstp qword ptr (_Y) +L58: +fld qword ptr (_Y) +fsub qword ptr (_W) +fld qword ptr (_One) +fcompp +fstsw ax +sahf +je L57 +L55: +fld qword ptr (_One) +fdiv qword ptr (_W) +fstp qword ptr (_U1) +fld qword ptr (_U1) +fstp qword ptr (-272)[ebp] +fld qword ptr (_Radix) +fmul qword ptr (-272)[ebp] +fstp qword ptr (_U2) +fld qword ptr (-272)[ebp] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L60) +push edi +call _printf +add esp,12 +lea edi,(L61) +push edi +call _printf +add esp,4 +fld qword ptr (_Radix) +fstp qword ptr (_E0) +fld qword ptr (_U1) +fstp qword ptr (_E1) +fld qword ptr (_U2) +fstp qword ptr (_E9) +fld qword ptr (_Precision) +fstp qword ptr (_E3) +fld qword ptr (_Four) +fdiv qword ptr (_Three) +fstp qword ptr (_X) +fld qword ptr (_X) +fsub qword ptr (_One) +fstp qword ptr (_Third) +fld qword ptr (_Third) +fstp qword ptr (-280)[ebp] +fld qword ptr (_Half) +fsub qword ptr (-280)[ebp] +fstp qword ptr (_F6) +fld qword ptr (_F6) +fstp qword ptr (-288)[ebp] +fld qword ptr (-288)[ebp] +fadd qword ptr (-288)[ebp] +fstp qword ptr (_X) +fld qword ptr (_X) +fsub qword ptr (-280)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-296)[ebp] +fld qword ptr (-296)[ebp] +fstp qword ptr (_X) +fld qword ptr (_U2) +fcomp qword ptr (_X) +fstsw ax +sahf +jbe L62 +fld qword ptr (_U2) +fstp qword ptr (_X) +L62: +L64: +fld qword ptr (_X) +fstp qword ptr (_U2) +fld qword ptr (_U2) +fstp qword ptr (-304)[ebp] +fld qword ptr (_Half) +fmul qword ptr (-304)[ebp] +fld qword ptr (_ThirtyTwo) +fmul qword ptr (-304)[ebp] +fmul qword ptr (-304)[ebp] +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_One) +fadd qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (_One) +fstp qword ptr (_X) +L65: +fld qword ptr (_X) +fcomp qword ptr (_U2) +fstsw ax +sahf +jae L67 +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L64 +L67: +fld qword ptr (_Two) +fdiv qword ptr (_Three) +fstp qword ptr (_X) +fld qword ptr (_X) +fsub qword ptr (_Half) +fstp qword ptr (_F6) +fld qword ptr (_F6) +fstp qword ptr (-320)[ebp] +fld qword ptr (-320)[ebp] +fadd qword ptr (-320)[ebp] +fstp qword ptr (_Third) +fld qword ptr (_Third) +fsub qword ptr (_Half) +fstp qword ptr (_X) +fld qword ptr (_X) +fadd qword ptr (-320)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-328)[ebp] +fld qword ptr (-328)[ebp] +fstp qword ptr (_X) +fld qword ptr (_U1) +fcomp qword ptr (_X) +fstsw ax +sahf +jbe L68 +fld qword ptr (_U1) +fstp qword ptr (_X) +L68: +L70: +fld qword ptr (_X) +fstp qword ptr (_U1) +fld qword ptr (_U1) +fstp qword ptr (-344)[ebp] +fld qword ptr (_Half) +fmul qword ptr (-344)[ebp] +fld qword ptr (_ThirtyTwo) +fmul qword ptr (-344)[ebp] +fmul qword ptr (-344)[ebp] +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_Half) +fsub qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_Half) +fadd qword ptr (_Y) +fstp qword ptr (_X) +fld qword ptr (_Half) +fsub qword ptr (_X) +fstp qword ptr (_Y) +fld qword ptr (_Half) +fadd qword ptr (_Y) +fstp qword ptr (_X) +L71: +fld qword ptr (_X) +fcomp qword ptr (_U1) +fstsw ax +sahf +jae L73 +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L70 +L73: +fld qword ptr (_E1) +fcomp qword ptr (_U1) +fstsw ax +sahf +jne L74 +lea edi,(L76) +push edi +call _printf +add esp,4 +jmp L75 +L74: +fld qword ptr (_U1) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L77) +push edi +call _printf +add esp,12 +L75: +fld qword ptr (_One) +fdiv qword ptr (_U1) +fstp qword ptr (_W) +fld qword ptr (_Half) +fsub qword ptr (_U1) +fadd qword ptr (_Half) +fstp qword ptr (_F9) +fld qword ptr (_U2) +fdiv qword ptr (_U1) +fadd qword ptr (L78) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-360)[ebp] +fld qword ptr (-360)[ebp] +fstp qword ptr (_Radix) +fld qword ptr (_E0) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jne L79 +lea edi,(L81) +push edi +call _printf +add esp,4 +jmp L80 +L79: +fld qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L82) +push edi +call _printf +add esp,12 +L80: +lea edi,(L84) +push edi +fld qword ptr (_Eight) +fadd qword ptr (_Eight) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jb L85 +mov dword ptr (-364)[ebp],1 +jmp L86 +L85: +mov dword ptr (-364)[ebp],0 +L86: +mov edi,dword ptr (-364)[ebp] +push edi +push 2 +call _TstCond +add esp,12 +lea edi,(L88) +push edi +fld qword ptr (_Two) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L92 +fld qword ptr (L93) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L92 +fld qword ptr (_One) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jne L89 +L92: +mov dword ptr (-376)[ebp],1 +jmp L90 +L89: +mov dword ptr (-376)[ebp],0 +L90: +mov edi,dword ptr (-376)[ebp] +push edi +push 3 +call _TstCond +add esp,12 +mov dword ptr (_Milestone),20 +lea edi,(L95) +push edi +fld qword ptr (_F9) +fsub qword ptr (_Half) +fld qword ptr (_Half) +fcompp +fstsw ax +sahf +jbe L96 +mov dword ptr (-388)[ebp],1 +jmp L97 +L96: +mov dword ptr (-388)[ebp],0 +L97: +mov edi,dword ptr (-388)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_F9) +fstp qword ptr (_X) +mov dword ptr (_I),1 +fld qword ptr (_X) +fsub qword ptr (_Half) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (_Half) +fstp qword ptr (_Z) +lea edi,(L99) +push edi +fld qword ptr (_One) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L102 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L100 +L102: +mov dword ptr (-400)[ebp],1 +jmp L101 +L100: +mov dword ptr (-400)[ebp],0 +L101: +mov edi,dword ptr (-400)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_X) +mov dword ptr (_I),0 +mov dword ptr (_Milestone),25 +fld qword ptr (_Radix) +fsub qword ptr (_One) +fstp qword ptr (_BMinusU2) +fld qword ptr (_BMinusU2) +fsub qword ptr (_U2) +fadd qword ptr (_One) +fstp qword ptr (_BMinusU2) +fld qword ptr (_One) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L103 +fld qword ptr (_U1) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-440)[ebp] +fld qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-448)[ebp] +fld qword ptr (_TwoForty) +fchs +fmul qword ptr (-440)[ebp] +fdiv qword ptr (-448)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Half) +fadd qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-456)[ebp] +fld qword ptr (-456)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_X) +fsub qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-464)[ebp] +fld qword ptr (-464)[ebp] +fmul qword ptr (_Four) +fld qword ptr (_One) +fcompp +fstsw ax +sahf +jbe L105 +fld qword ptr (_Y) +fstp qword ptr (_X) +L105: +fld qword ptr (_X) +fdiv qword ptr (_TwoForty) +fstp qword ptr (_Precision) +fld qword ptr (_Half) +fadd qword ptr (_Precision) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-472)[ebp] +fld qword ptr (-472)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Precision) +fsub qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-480)[ebp] +fld qword ptr (-480)[ebp] +fmul qword ptr (_TwoForty) +fld qword ptr (_Half) +fcompp +fstsw ax +sahf +jbe L107 +fld qword ptr (_Y) +fstp qword ptr (_Precision) +L107: +L103: +fld qword ptr (_Precision) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-448)[ebp] +fld qword ptr (-448)[ebp] +fcomp qword ptr (_Precision) +fstsw ax +sahf +jne L111 +fld qword ptr (_One) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jne L109 +L111: +lea edi,(L112) +push edi +call _printf +add esp,4 +lea edi,(L113) +push edi +call _printf +add esp,4 +L109: +fld qword ptr (_One) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jne L114 +lea edi,(L116) +push edi +call _printf +add esp,4 +jmp L115 +L114: +fld qword ptr (_Precision) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L117) +push edi +call _printf +add esp,12 +L115: +lea edi,(L119) +push edi +fld qword ptr (_U2) +fmul qword ptr (_Nine) +fmul qword ptr (_Nine) +fmul qword ptr (_TwoForty) +fld qword ptr (_One) +fcompp +fstsw ax +sahf +jbe L120 +mov dword ptr (-452)[ebp],1 +jmp L121 +L120: +mov dword ptr (-452)[ebp],0 +L121: +mov edi,dword ptr (-452)[ebp] +push edi +push 1 +call _TstCond +add esp,12 +mov dword ptr (_Milestone),30 +fld qword ptr (_One) +fdiv qword ptr (_Four) +fstp qword ptr (-492)[ebp] +fld qword ptr (_Four) +fdiv qword ptr (_Three) +fsub qword ptr (_One) +fsub qword ptr (-492)[ebp] +fmul qword ptr (_Three) +fsub qword ptr (-492)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-500)[ebp] +fld qword ptr (-500)[ebp] +fstp qword ptr (_X) +L122: +fld qword ptr (_X) +fstp qword ptr (_Z2) +fld qword ptr (_Z2) +fstp qword ptr (-516)[ebp] +fld qword ptr (_One) +fld qword ptr (_Half) +fmul qword ptr (-516)[ebp] +fld qword ptr (_ThirtyTwo) +fmul qword ptr (-516)[ebp] +fmul qword ptr (-516)[ebp] +faddp st(1),st +faddp st(1),st +fsub qword ptr (_One) +fstp qword ptr (_X) +L123: +fld qword ptr (_X) +fcomp qword ptr (_Z2) +fstsw ax +sahf +jae L125 +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L122 +L125: +fld qword ptr (_Three) +fdiv qword ptr (_Four) +fld qword ptr (_Two) +fdiv qword ptr (_Three) +fsubp st(1),st +fmul qword ptr (_Three) +fld qword ptr (_One) +fdiv qword ptr (_Four) +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-532)[ebp] +fld qword ptr (-532)[ebp] +fstp qword ptr (_Z) +fld qword ptr (-532)[ebp] +fstp qword ptr (_Y) +fld qword ptr (-532)[ebp] +fstp qword ptr (_X) +L126: +fld qword ptr (_Z) +fstp qword ptr (_Z1) +fld qword ptr (_One) +fdiv qword ptr (_Two) +fstp qword ptr (-540)[ebp] +fld qword ptr (_Z1) +fstp qword ptr (-548)[ebp] +fld qword ptr (-540)[ebp] +fld qword ptr (-540)[ebp] +fld qword ptr (_Half) +fmul qword ptr (-548)[ebp] +fld qword ptr (_ThirtyTwo) +fmul qword ptr (-548)[ebp] +fmul qword ptr (-548)[ebp] +faddp st(1),st +fsubp st(1),st +fadd qword ptr (-540)[ebp] +fsubp st(1),st +fadd qword ptr (-540)[ebp] +fstp qword ptr (_Z) +L127: +fld qword ptr (_Z) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jae L129 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jb L126 +L129: +L130: +L133: +fld qword ptr (_Y) +fstp qword ptr (_Y1) +fld qword ptr (_Y1) +fstp qword ptr (-556)[ebp] +fld qword ptr (_Half) +fld qword ptr (_Half) +fld qword ptr (_Half) +fmul qword ptr (-556)[ebp] +fld qword ptr (_ThirtyTwo) +fmul qword ptr (-556)[ebp] +fmul qword ptr (-556)[ebp] +faddp st(1),st +fsubp st(1),st +fadd qword ptr (_Half) +fsubp st(1),st +fadd qword ptr (_Half) +fstp qword ptr (_Y) +L134: +fld qword ptr (_Y) +fcomp qword ptr (_Y1) +fstsw ax +sahf +jae L136 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jb L133 +L136: +fld qword ptr (_X) +fstp qword ptr (_X1) +fld qword ptr (_X1) +fstp qword ptr (-556)[ebp] +fld qword ptr (_Half) +fmul qword ptr (-556)[ebp] +fld qword ptr (_ThirtyTwo) +fmul qword ptr (-556)[ebp] +fmul qword ptr (-556)[ebp] +faddp st(1),st +fsub qword ptr (_F9) +fadd qword ptr (_F9) +fstp qword ptr (_X) +L131: +fld qword ptr (_X) +fcomp qword ptr (_X1) +fstsw ax +sahf +jae L137 +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L130 +L137: +fld qword ptr (_Y1) +fcomp qword ptr (_X1) +fstsw ax +sahf +jne L140 +fld qword ptr (_Z1) +fcomp qword ptr (_X1) +fstsw ax +sahf +je L138 +L140: +lea edi,(L141) +push edi +push 1 +call _BadCond +add esp,8 +fld qword ptr (_Z1) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Y1) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_X1) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L142) +push edi +call _printf +add esp,28 +lea edi,(L143) +push edi +call _printf +add esp,4 +lea edi,(L144) +push edi +call _printf +add esp,4 +lea edi,(L145) +push edi +call _notify +add esp,4 +fld qword ptr (_U1) +fcomp qword ptr (_X1) +fstsw ax +sahf +je L149 +fld qword ptr (_U1) +fcomp qword ptr (_Y1) +fstsw ax +sahf +je L149 +fld qword ptr (_U1) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jne L139 +L149: +lea edi,(L150) +push edi +call _printf +add esp,4 +jmp L139 +L138: +fld qword ptr (_U1) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jne L153 +fld qword ptr (_U2) +fcomp qword ptr (_Z2) +fstsw ax +sahf +je L151 +L153: +fld qword ptr (_U1) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jbe L156 +fld qword ptr (_U2) +fcomp qword ptr (_Z2) +fstsw ax +sahf +ja L154 +L156: +lea edi,(L157) +push edi +push 0 +call _BadCond +add esp,8 +lea edi,(L158) +push edi +call _notify +add esp,4 +fld qword ptr (_Z1) +fsub qword ptr (_U1) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_U1) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L159) +push edi +call _printf +add esp,20 +fld qword ptr (_Z2) +fsub qword ptr (_U2) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_U2) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L160) +push edi +call _printf +add esp,20 +jmp L155 +L154: +fld qword ptr (_Zero) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jae L163 +fld qword ptr (_Zero) +fcomp qword ptr (_Z2) +fstsw ax +sahf +jb L161 +L163: +fld qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L164) +push edi +call _printf +add esp,12 +lea edi,(L165) +push edi +call _printf +add esp,4 +fld qword ptr (_Z2) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Z1) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L166) +push edi +call _printf +add esp,20 +lea edi,(L167) +push edi +call _notify +add esp,4 +L161: +fld qword ptr (_Z2) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jne L170 +fld qword ptr (_Zero) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jae L168 +L170: +fld qword ptr (_Z1) +fdiv qword ptr (_U1) +fstp qword ptr (_X) +fld qword ptr (_Z2) +fdiv qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_X) +fcomp qword ptr (_Y) +fstsw ax +sahf +jae L171 +fld qword ptr (_Y) +fstp qword ptr (_X) +L171: +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-580)[ebp] +fld qword ptr (-580)[ebp] +fchs +fstp qword ptr (_Q) +lea edi,(L173) +push edi +call _printf +add esp,4 +fld qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-588)[ebp] +fld qword ptr (_Q) +fdiv qword ptr (-588)[ebp] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L174) +push edi +call _printf +add esp,12 +fld qword ptr (L93) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-596)[ebp] +fld qword ptr (_Q) +fdiv qword ptr (-596)[ebp] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L175) +push edi +call _printf +add esp,12 +L168: +lea edi,(L150) +push edi +call _printf +add esp,4 +L155: +L151: +L139: +call _Pause +add esp,0 +mov dword ptr (_Milestone),35 +fld qword ptr (_Two) +fcomp qword ptr (_Radix) +fstsw ax +sahf +ja L176 +fld qword ptr (_W) +fld qword ptr (_Radix) +fmul qword ptr (_Radix) +fdivp st(1),st +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-576)[ebp] +fld qword ptr (-576)[ebp] +fadd qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (-576)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_Z) +fstp qword ptr (-584)[ebp] +fld qword ptr (-584)[ebp] +fadd qword ptr (_U2) +fstp qword ptr (_T) +fld qword ptr (_T) +fsub qword ptr (-584)[ebp] +fstp qword ptr (_X) +lea edi,(L179) +push edi +fld qword ptr (_U2) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L180 +mov dword ptr (-560)[ebp],1 +jmp L181 +L180: +mov dword ptr (-560)[ebp],0 +L181: +mov edi,dword ptr (-560)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_U2) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L182 +lea edi,(L184) +push edi +call _printf +add esp,4 +L182: +L176: +lea edi,(L185) +push edi +call _printf +add esp,4 +fld qword ptr (_F9) +fmul qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_One) +fmul qword ptr (_F9) +fstp qword ptr (_Z) +fld qword ptr (_F9) +fsub qword ptr (_Half) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-588)[ebp] +fld qword ptr (_Y) +fsub qword ptr (_Half) +fsub qword ptr (-588)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Z) +fsub qword ptr (_Half) +fsub qword ptr (-588)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-604)[ebp] +fld qword ptr (-604)[ebp] +fmul qword ptr (_Radix) +fstp qword ptr (_T) +fld qword ptr (_Radix) +fmul qword ptr (-604)[ebp] +fstp qword ptr (_R) +fld qword ptr (_T) +fsub qword ptr (_Radix) +fstp qword ptr (_X) +fld qword ptr (_Radix) +fmul qword ptr (_U2) +fstp qword ptr (-620)[ebp] +fld qword ptr (_X) +fsub qword ptr (-620)[ebp] +fstp qword ptr (_X) +fld qword ptr (_R) +fsub qword ptr (_Radix) +fstp qword ptr (_T) +fld qword ptr (_T) +fsub qword ptr (-620)[ebp] +fstp qword ptr (_T) +fld qword ptr (_Radix) +fsub qword ptr (_One) +fstp qword ptr (-628)[ebp] +fld qword ptr (_X) +fmul qword ptr (-628)[ebp] +fstp qword ptr (_X) +fld qword ptr (_T) +fmul qword ptr (-628)[ebp] +fstp qword ptr (_T) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L186 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L186 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L186 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jne L186 +mov dword ptr (_GMult),1 +jmp L187 +L186: +mov dword ptr (_GMult),0 +lea edi,(L188) +push edi +push 0 +push 1 +call _TstCond +add esp,12 +L187: +fld qword ptr (_Radix) +fmul qword ptr (_U2) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fstp qword ptr (-648)[ebp] +fld qword ptr (_One) +fadd qword ptr (-648)[ebp] +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-656)[ebp] +fld qword ptr (-656)[ebp] +fadd qword ptr (-648)[ebp] +fld qword ptr (-656)[ebp] +fmul qword ptr (-656)[ebp] +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-664)[ebp] +fld qword ptr (-664)[ebp] +fsub qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_One) +fsub qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-680)[ebp] +fld qword ptr (-680)[ebp] +fsub qword ptr (_U2) +fld qword ptr (-680)[ebp] +fmul qword ptr (-680)[ebp] +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-688)[ebp] +fld qword ptr (-688)[ebp] +fsub qword ptr (_U1) +fstp qword ptr (_Z) +lea edi,(L190) +push edi +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jb L191 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jb L191 +mov dword ptr (-640)[ebp],1 +jmp L192 +L191: +mov dword ptr (-640)[ebp],0 +L192: +mov edi,dword ptr (-640)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_One) +fsub qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_One) +fdiv qword ptr (_Y) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fsub qword ptr (_X) +fstp qword ptr (_Y) +fld qword ptr (_One) +fdiv qword ptr (_Three) +fstp qword ptr (_X) +fld qword ptr (_Three) +fdiv qword ptr (_Nine) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fstp qword ptr (-740)[ebp] +fld qword ptr (_X) +fsub qword ptr (-740)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Nine) +fdiv qword ptr (_TwentySeven) +fstp qword ptr (_T) +fld qword ptr (-740)[ebp] +fsub qword ptr (_T) +fstp qword ptr (_Z) +lea edi,(L194) +push edi +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L195 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L195 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L195 +mov dword ptr (-700)[ebp],1 +jmp L196 +L195: +mov dword ptr (-700)[ebp],0 +L196: +mov edi,dword ptr (-700)[ebp] +push edi +push 2 +call _TstCond +add esp,12 +fld qword ptr (_F9) +fdiv qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_F9) +fsub qword ptr (_Half) +fstp qword ptr (_X) +fld qword ptr (_Y) +fsub qword ptr (_Half) +fsub qword ptr (_X) +fstp qword ptr (_Y) +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-780)[ebp] +fld qword ptr (-780)[ebp] +fdiv qword ptr (_One) +fstp qword ptr (_T) +fld qword ptr (_T) +fsub qword ptr (-780)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L197 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L197 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L197 +mov dword ptr (_GDiv),1 +jmp L198 +L197: +mov dword ptr (_GDiv),0 +lea edi,(L199) +push edi +push 0 +push 1 +call _TstCond +add esp,12 +L198: +fld qword ptr (_One) +fld qword ptr (_One) +fadd qword ptr (_U2) +fdivp st(1),st +fstp qword ptr (_X) +fld qword ptr (_X) +fsub qword ptr (_Half) +fsub qword ptr (_Half) +fstp qword ptr (_Y) +lea edi,(L201) +push edi +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jbe L202 +mov dword ptr (-792)[ebp],1 +jmp L203 +L202: +mov dword ptr (-792)[ebp],0 +L203: +mov edi,dword ptr (-792)[ebp] +push edi +push 1 +call _TstCond +add esp,12 +fld qword ptr (_One) +fsub qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_One) +fld qword ptr (_Radix) +fmul qword ptr (_U2) +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_X) +fstp qword ptr (-844)[ebp] +fld qword ptr (-844)[ebp] +fmul qword ptr (_Radix) +fstp qword ptr (_Z) +fld qword ptr (_Y) +fstp qword ptr (-852)[ebp] +fld qword ptr (-852)[ebp] +fmul qword ptr (_Radix) +fstp qword ptr (_T) +fld qword ptr (_Z) +fdiv qword ptr (_Radix) +fstp qword ptr (_R) +fld qword ptr (_T) +fdiv qword ptr (_Radix) +fstp qword ptr (_StickyBit) +fld qword ptr (_R) +fsub qword ptr (-844)[ebp] +fstp qword ptr (_X) +fld qword ptr (_StickyBit) +fsub qword ptr (-852)[ebp] +fstp qword ptr (_Y) +lea edi,(L205) +push edi +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L206 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L206 +mov dword ptr (-812)[ebp],1 +jmp L207 +L206: +mov dword ptr (-812)[ebp],0 +L207: +mov edi,dword ptr (-812)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_One) +fsub qword ptr (_U1) +fstp qword ptr (_Y) +fld qword ptr (_One) +fsub qword ptr (_F9) +fstp qword ptr (_X) +fld qword ptr (_One) +fsub qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_Radix) +fsub qword ptr (_U2) +fstp qword ptr (_T) +fld qword ptr (_Radix) +fsub qword ptr (_BMinusU2) +fstp qword ptr (_Z) +fld qword ptr (_Radix) +fsub qword ptr (_T) +fstp qword ptr (_T) +fld qword ptr (_U1) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L208 +fld qword ptr (_U1) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L208 +fld qword ptr (_U2) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L208 +fld qword ptr (_U2) +fcomp qword ptr (_T) +fstsw ax +sahf +jne L208 +mov dword ptr (_GAddSub),1 +jmp L209 +L208: +mov dword ptr (_GAddSub),0 +lea edi,(L210) +push edi +push 0 +push 1 +call _TstCond +add esp,12 +L209: +fld qword ptr (_One) +fcomp qword ptr (_F9) +fstsw ax +sahf +je L211 +fld qword ptr (_F9) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +ja L211 +lea edi,(L213) +push edi +push 1 +call _BadCond +add esp,8 +lea edi,(L214) +push edi +call _printf +add esp,4 +lea edi,(L215) +push edi +call _printf +add esp,4 +lea edi,(L216) +push edi +call _printf +add esp,4 +L211: +cmp dword ptr (_GMult),1 +jne L217 +cmp dword ptr (_GDiv),1 +jne L217 +cmp dword ptr (_GAddSub),1 +jne L217 +lea edi,(L219) +push edi +call _printf +add esp,4 +L217: +mov dword ptr (_Milestone),40 +call _Pause +add esp,0 +lea edi,(L220) +push edi +call _printf +add esp,4 +mov dword ptr (_RMult),0 +mov dword ptr (_RDiv),0 +mov dword ptr (_RAddSub),0 +fld qword ptr (_Radix) +fdiv qword ptr (_Two) +fstp qword ptr (_RadixD2) +fld qword ptr (_Two) +fstp qword ptr (_A1) +mov dword ptr (_Done),0 +L221: +fld qword ptr (_Radix) +fstp qword ptr (_AInvrse) +L224: +fld qword ptr (_AInvrse) +fstp qword ptr (-924)[ebp] +fld qword ptr (-924)[ebp] +fstp qword ptr (_X) +fld qword ptr (-924)[ebp] +fdiv qword ptr (_A1) +fstp qword ptr (_AInvrse) +L225: +fld qword ptr (_AInvrse) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-924)[ebp] +fld qword ptr (_AInvrse) +fcomp qword ptr (-924)[ebp] +fstsw ax +sahf +je L224 +fld qword ptr (_One) +fcomp qword ptr (_X) +fstsw ax +sahf +je L230 +fld qword ptr (_Three) +fcomp qword ptr (_A1) +fstsw ax +sahf +jae L228 +L230: +mov dword ptr (-928)[ebp],1 +jmp L229 +L228: +mov dword ptr (-928)[ebp],0 +L229: +mov edi,dword ptr (-928)[ebp] +mov dword ptr (_Done),edi +cmp dword ptr (_Done),0 +jne L231 +fld qword ptr (_Nine) +fadd qword ptr (_One) +fstp qword ptr (_A1) +L231: +L222: +cmp dword ptr (_Done),0 +je L221 +fld qword ptr (_One) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L233 +fld qword ptr (_Radix) +fstp qword ptr (_A1) +L233: +fld qword ptr (_One) +fdiv qword ptr (_A1) +fstp qword ptr (_AInvrse) +fld qword ptr (_A1) +fstp qword ptr (_X) +fld qword ptr (_AInvrse) +fstp qword ptr (_Y) +mov dword ptr (_Done),0 +L235: +fld qword ptr (_X) +fmul qword ptr (_Y) +fsub qword ptr (_Half) +fstp qword ptr (_Z) +lea edi,(L239) +push edi +fld qword ptr (_Half) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L240 +mov dword ptr (-928)[ebp],1 +jmp L241 +L240: +mov dword ptr (-928)[ebp],0 +L241: +mov edi,dword ptr (-928)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_Radix) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L243 +mov dword ptr (-940)[ebp],1 +jmp L244 +L243: +mov dword ptr (-940)[ebp],0 +L244: +mov edi,dword ptr (-940)[ebp] +mov dword ptr (_Done),edi +fld qword ptr (_Radix) +fstp qword ptr (_X) +fld qword ptr (_One) +fdiv qword ptr (_X) +fstp qword ptr (_Y) +L236: +cmp dword ptr (_Done),0 +je L235 +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_Y2) +fld qword ptr (_One) +fsub qword ptr (_U2) +fstp qword ptr (_Y1) +fld qword ptr (_OneAndHalf) +fsub qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_OneAndHalf) +fadd qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_X) +fstp qword ptr (-956)[ebp] +fld qword ptr (_Y2) +fstp qword ptr (-964)[ebp] +fld qword ptr (-956)[ebp] +fsub qword ptr (_U2) +fmul qword ptr (-964)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_Y) +fstp qword ptr (-972)[ebp] +fld qword ptr (_Y1) +fstp qword ptr (-980)[ebp] +fld qword ptr (-972)[ebp] +fmul qword ptr (-980)[ebp] +fstp qword ptr (_T) +fld qword ptr (_Z) +fsub qword ptr (-956)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_T) +fsub qword ptr (-956)[ebp] +fstp qword ptr (_T) +fld qword ptr (-956)[ebp] +fmul qword ptr (-964)[ebp] +fstp qword ptr (_X) +fld qword ptr (-972)[ebp] +fadd qword ptr (_U2) +fmul qword ptr (-980)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_X) +fsub qword ptr (_OneAndHalf) +fstp qword ptr (_X) +fld qword ptr (_Y) +fsub qword ptr (_OneAndHalf) +fstp qword ptr (_Y) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L245 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L245 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L245 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jb L245 +fld qword ptr (_OneAndHalf) +fadd qword ptr (_U2) +fstp qword ptr (-1012)[ebp] +fld qword ptr (-1012)[ebp] +fmul qword ptr (_Y2) +fstp qword ptr (_X) +fld qword ptr (_OneAndHalf) +fsub qword ptr (_U2) +fstp qword ptr (-1028)[ebp] +fld qword ptr (-1028)[ebp] +fsub qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (-1012)[ebp] +fadd qword ptr (_U2) +fstp qword ptr (_Z) +fld qword ptr (_Y1) +fstp qword ptr (-1036)[ebp] +fld qword ptr (-1028)[ebp] +fmul qword ptr (-1036)[ebp] +fstp qword ptr (_T) +fld qword ptr (_Z) +fstp qword ptr (-1044)[ebp] +fld qword ptr (-1044)[ebp] +fadd qword ptr (_U2) +fstp qword ptr (-1052)[ebp] +fld qword ptr (_X) +fsub qword ptr (-1052)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Y) +fstp qword ptr (-1060)[ebp] +fld qword ptr (-1060)[ebp] +fmul qword ptr (-1036)[ebp] +fstp qword ptr (_StickyBit) +fld qword ptr (-1044)[ebp] +fmul qword ptr (_Y2) +fstp qword ptr (_S) +fld qword ptr (_T) +fsub qword ptr (-1060)[ebp] +fstp qword ptr (_T) +fld qword ptr (_U2) +fsub qword ptr (-1060)[ebp] +fadd qword ptr (_StickyBit) +fstp qword ptr (_Y) +fld qword ptr (_S) +fld qword ptr (-1052)[ebp] +fadd qword ptr (_U2) +fsubp st(1),st +fstp qword ptr (_Z) +fld qword ptr (_Y2) +fadd qword ptr (_U2) +fmul qword ptr (-1036)[ebp] +fstp qword ptr (_StickyBit) +fld qword ptr (_Y2) +fmul qword ptr (-1036)[ebp] +fstp qword ptr (_Y1) +fld qword ptr (_StickyBit) +fsub qword ptr (_Y2) +fstp qword ptr (_StickyBit) +fld qword ptr (_Y1) +fsub qword ptr (_Half) +fstp qword ptr (_Y1) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L247 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L247 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L247 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jne L247 +fld qword ptr (_Zero) +fcomp qword ptr (_StickyBit) +fstsw ax +sahf +jne L247 +fld qword ptr (_Half) +fcomp qword ptr (_Y1) +fstsw ax +sahf +jne L247 +mov dword ptr (_RMult),1 +lea edi,(L249) +push edi +call _printf +add esp,4 +jmp L248 +L247: +fld qword ptr (_X) +fadd qword ptr (_U2) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L250 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jbe L250 +fld qword ptr (_Z) +fadd qword ptr (_U2) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L250 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jbe L250 +fld qword ptr (_StickyBit) +fadd qword ptr (_U2) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L250 +fld qword ptr (_Half) +fcomp qword ptr (_Y1) +fstsw ax +sahf +jbe L250 +mov dword ptr (_RMult),2 +lea edi,(L252) +push edi +call _printf +add esp,4 +jmp L251 +L250: +lea edi,(L253) +push edi +call _printf +add esp,4 +L251: +L248: +cmp dword ptr (_RMult),1 +jne L246 +cmp dword ptr (_GMult),0 +jne L246 +lea edi,(L256) +push edi +call _notify +add esp,4 +jmp L246 +L245: +lea edi,(L253) +push edi +call _printf +add esp,4 +L246: +mov dword ptr (_Milestone),45 +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_Y2) +fld qword ptr (_One) +fsub qword ptr (_U2) +fstp qword ptr (_Y1) +fld qword ptr (_OneAndHalf) +fadd qword ptr (_U2) +fstp qword ptr (-1020)[ebp] +fld qword ptr (-1020)[ebp] +fadd qword ptr (_U2) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fstp qword ptr (-1028)[ebp] +fld qword ptr (_Y2) +fstp qword ptr (-1036)[ebp] +fld qword ptr (-1028)[ebp] +fdiv qword ptr (-1036)[ebp] +fstp qword ptr (_X) +fld qword ptr (_OneAndHalf) +fsub qword ptr (_U2) +fsub qword ptr (_U2) +fstp qword ptr (_T) +fld qword ptr (_T) +fstp qword ptr (-1044)[ebp] +fld qword ptr (_Y1) +fstp qword ptr (-1052)[ebp] +fld qword ptr (-1044)[ebp] +fsub qword ptr (_U2) +fdiv qword ptr (-1052)[ebp] +fstp qword ptr (_Y) +fld qword ptr (-1028)[ebp] +fadd qword ptr (_U2) +fdiv qword ptr (-1036)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_X) +fsub qword ptr (_OneAndHalf) +fstp qword ptr (_X) +fld qword ptr (_Y) +fsub qword ptr (-1044)[ebp] +fstp qword ptr (_Y) +fld qword ptr (-1044)[ebp] +fdiv qword ptr (-1052)[ebp] +fstp qword ptr (_T) +fld qword ptr (_Z) +fsub qword ptr (-1020)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_U2) +fsub qword ptr (_OneAndHalf) +fadd qword ptr (_T) +fstp qword ptr (_T) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L257 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jb L257 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jb L257 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jb L257 +fld qword ptr (_Y2) +fstp qword ptr (-1076)[ebp] +fld qword ptr (_OneAndHalf) +fdiv qword ptr (-1076)[ebp] +fstp qword ptr (_X) +fld qword ptr (_OneAndHalf) +fsub qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_OneAndHalf) +fadd qword ptr (_U2) +fstp qword ptr (_Z) +fld qword ptr (_Y) +fstp qword ptr (-1092)[ebp] +fld qword ptr (_X) +fsub qword ptr (-1092)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Y1) +fstp qword ptr (-1100)[ebp] +fld qword ptr (_OneAndHalf) +fdiv qword ptr (-1100)[ebp] +fstp qword ptr (_T) +fld qword ptr (-1092)[ebp] +fdiv qword ptr (-1100)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Z) +fstp qword ptr (-1108)[ebp] +fld qword ptr (_T) +fld qword ptr (-1108)[ebp] +fadd qword ptr (_U2) +fsubp st(1),st +fstp qword ptr (_T) +fld qword ptr (_Y) +fsub qword ptr (-1108)[ebp] +fstp qword ptr (_Y) +fld qword ptr (-1108)[ebp] +fdiv qword ptr (-1076)[ebp] +fstp qword ptr (_Z) +fld qword ptr (-1076)[ebp] +fadd qword ptr (_U2) +fdiv qword ptr (-1076)[ebp] +fstp qword ptr (_Y1) +fld qword ptr (_Z) +fsub qword ptr (_OneAndHalf) +fstp qword ptr (_Z) +fld qword ptr (_Y1) +fsub qword ptr (-1076)[ebp] +fstp qword ptr (_Y2) +fld qword ptr (_F9) +fsub qword ptr (_U1) +fdiv qword ptr (_F9) +fstp qword ptr (_Y1) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L259 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L259 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L259 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jne L259 +fld qword ptr (_Zero) +fcomp qword ptr (_Y2) +fstsw ax +sahf +jne L259 +fld qword ptr (_Zero) +fcomp qword ptr (_Y2) +fstsw ax +sahf +jne L259 +fld qword ptr (_Y1) +fsub qword ptr (_Half) +fld qword ptr (_F9) +fsub qword ptr (_Half) +fcompp +fstsw ax +sahf +jne L259 +mov dword ptr (_RDiv),1 +lea edi,(L261) +push edi +call _printf +add esp,4 +cmp dword ptr (_GDiv),0 +jne L260 +lea edi,(L264) +push edi +call _notify +add esp,4 +jmp L260 +L259: +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jbe L265 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jbe L265 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jbe L265 +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jbe L265 +fld qword ptr (_Zero) +fcomp qword ptr (_Y2) +fstsw ax +sahf +jbe L265 +fld qword ptr (_Y1) +fsub qword ptr (_Half) +fld qword ptr (_F9) +fsub qword ptr (_Half) +fcompp +fstsw ax +sahf +jbe L265 +mov dword ptr (_RDiv),2 +lea edi,(L267) +push edi +call _printf +add esp,4 +L265: +L260: +L257: +cmp dword ptr (_RDiv),0 +jne L268 +lea edi,(L270) +push edi +call _printf +add esp,4 +L268: +fld qword ptr (_One) +fdiv qword ptr (_Radix) +fstp qword ptr (_BInvrse) +lea edi,(L272) +push edi +fld qword ptr (_BInvrse) +fmul qword ptr (_Radix) +fsub qword ptr (_Half) +fld qword ptr (_Half) +fcompp +fstsw ax +sahf +jne L273 +mov dword ptr (-1064)[ebp],1 +jmp L274 +L273: +mov dword ptr (-1064)[ebp],0 +L274: +mov edi,dword ptr (-1064)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +mov dword ptr (_Milestone),50 +lea edi,(L276) +push edi +fld qword ptr (_F9) +fadd qword ptr (_U1) +fsub qword ptr (_Half) +fld qword ptr (_Half) +fcompp +fstsw ax +sahf +jne L277 +fld qword ptr (_BMinusU2) +fadd qword ptr (_U2) +fsub qword ptr (_One) +fld qword ptr (_Radix) +fsub qword ptr (_One) +fcompp +fstsw ax +sahf +jne L277 +mov dword ptr (-1084)[ebp],1 +jmp L278 +L277: +mov dword ptr (-1084)[ebp],0 +L278: +mov edi,dword ptr (-1084)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_One) +fld qword ptr (_U1) +fmul qword ptr (_U1) +fsubp st(1),st +fstp qword ptr (_X) +fld qword ptr (_One) +fld qword ptr (_U2) +fld qword ptr (_One) +fsub qword ptr (_U2) +fmulp st(1),st +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_F9) +fsub qword ptr (_Half) +fstp qword ptr (_Z) +fld qword ptr (_X) +fsub qword ptr (_Half) +fsub qword ptr (_Z) +fstp qword ptr (_X) +fld qword ptr (_Y) +fsub qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L279 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L279 +mov dword ptr (_RAddSub),2 +lea edi,(L281) +push edi +call _printf +add esp,4 +L279: +cmp dword ptr (_GAddSub),1 +jne L282 +fld qword ptr (_Half) +fadd qword ptr (_U2) +fmul qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_Half) +fsub qword ptr (_U2) +fmul qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_One) +fadd qword ptr (_X) +fstp qword ptr (_X) +fld qword ptr (_One) +fadd qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_One) +fadd qword ptr (_U2) +fsub qword ptr (_X) +fstp qword ptr (_X) +fld qword ptr (_One) +fsub qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L284 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L284 +fld qword ptr (_Half) +fadd qword ptr (_U2) +fmul qword ptr (_U1) +fstp qword ptr (_X) +fld qword ptr (_Half) +fsub qword ptr (_U2) +fmul qword ptr (_U1) +fstp qword ptr (_Y) +fld qword ptr (_One) +fsub qword ptr (_X) +fstp qword ptr (_X) +fld qword ptr (_One) +fsub qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_F9) +fsub qword ptr (_X) +fstp qword ptr (_X) +fld qword ptr (_One) +fsub qword ptr (_Y) +fstp qword ptr (_Y) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L286 +fld qword ptr (_Zero) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L286 +mov dword ptr (_RAddSub),1 +lea edi,(L288) +push edi +call _printf +add esp,4 +cmp dword ptr (_GAddSub),0 +jne L283 +lea edi,(L291) +push edi +call _notify +add esp,4 +jmp L283 +L286: +lea edi,(L292) +push edi +call _printf +add esp,4 +jmp L283 +L284: +lea edi,(L292) +push edi +call _printf +add esp,4 +jmp L283 +L282: +lea edi,(L292) +push edi +call _printf +add esp,4 +L283: +fld qword ptr (_One) +fstp qword ptr (_S) +fld qword ptr (_One) +fld qword ptr (_Half) +fld qword ptr (_One) +fadd qword ptr (_Half) +fmulp st(1),st +faddp st(1),st +fstp qword ptr (_X) +fld qword ptr (_One) +fadd qword ptr (_U2) +fmul qword ptr (_Half) +fstp qword ptr (_Y) +fld qword ptr (_X) +fstp qword ptr (-1164)[ebp] +fld qword ptr (_Y) +fstp qword ptr (-1172)[ebp] +fld qword ptr (-1164)[ebp] +fsub qword ptr (-1172)[ebp] +fstp qword ptr (_Z) +fld qword ptr (-1172)[ebp] +fsub qword ptr (-1164)[ebp] +fstp qword ptr (_T) +fld qword ptr (_Z) +fadd qword ptr (_T) +fstp qword ptr (_StickyBit) +fld qword ptr (_Zero) +fcomp qword ptr (_StickyBit) +fstsw ax +sahf +je L293 +fld qword ptr (_Zero) +fstp qword ptr (_S) +lea edi,(L295) +push edi +push 3 +call _BadCond +add esp,8 +L293: +fld qword ptr (_Zero) +fstp qword ptr (_StickyBit) +cmp dword ptr (_GMult),1 +jne L296 +cmp dword ptr (_GDiv),1 +jne L296 +cmp dword ptr (_GAddSub),1 +jne L296 +cmp dword ptr (_RMult),1 +jne L296 +cmp dword ptr (_RDiv),1 +jne L296 +cmp dword ptr (_RAddSub),1 +jne L296 +fld qword ptr (_RadixD2) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1180)[ebp] +fld qword ptr (_RadixD2) +fcomp qword ptr (-1180)[ebp] +fstsw ax +sahf +jne L296 +lea edi,(L298) +push edi +call _printf +add esp,4 +fld qword ptr (_Half) +fadd qword ptr (_U1) +fmul qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_Half) +fmul qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_One) +fadd qword ptr (_Y) +fstp qword ptr (_Z) +fld qword ptr (_One) +fadd qword ptr (_X) +fstp qword ptr (_T) +fld qword ptr (_Z) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jb L299 +fld qword ptr (_T) +fsub qword ptr (_One) +fld qword ptr (_U2) +fcompp +fstsw ax +sahf +ja L299 +fld qword ptr (_T) +fadd qword ptr (_Y) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fsub qword ptr (_X) +fstp qword ptr (_Y) +fld qword ptr (_Z) +fsub qword ptr (_T) +fld qword ptr (_U2) +fcompp +fstsw ax +sahf +ja L301 +fld qword ptr (_Y) +fsub qword ptr (_T) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L301 +fld qword ptr (_Half) +fadd qword ptr (_U1) +fmul qword ptr (_U1) +fstp qword ptr (_X) +fld qword ptr (_Half) +fmul qword ptr (_U1) +fstp qword ptr (_Y) +fld qword ptr (_One) +fsub qword ptr (_Y) +fstp qword ptr (_Z) +fld qword ptr (_One) +fsub qword ptr (_X) +fstp qword ptr (_T) +fld qword ptr (_Z) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L303 +fld qword ptr (_T) +fsub qword ptr (_F9) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L303 +fld qword ptr (_Half) +fsub qword ptr (_U1) +fmul qword ptr (_U1) +fstp qword ptr (_Z) +fld qword ptr (_F9) +fsub qword ptr (_Z) +fstp qword ptr (_T) +fld qword ptr (_F9) +fsub qword ptr (_Y) +fstp qword ptr (_Q) +fld qword ptr (_T) +fsub qword ptr (_F9) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L305 +fld qword ptr (_F9) +fsub qword ptr (_U1) +fsub qword ptr (_Q) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L305 +fld qword ptr (_One) +fadd qword ptr (_U2) +fmul qword ptr (_OneAndHalf) +fstp qword ptr (_Z) +fld qword ptr (_OneAndHalf) +fadd qword ptr (_U2) +fsub qword ptr (_Z) +fadd qword ptr (_U2) +fstp qword ptr (_T) +fld qword ptr (_One) +fld qword ptr (_Half) +fdiv qword ptr (_Radix) +faddp st(1),st +fstp qword ptr (_X) +fld qword ptr (_One) +fld qword ptr (_Radix) +fmul qword ptr (_U2) +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_X) +fmul qword ptr (_Y) +fstp qword ptr (_Z) +fld qword ptr (_Zero) +fcomp qword ptr (_T) +fstsw ax +sahf +jne L307 +fld qword ptr (_X) +fld qword ptr (_Radix) +fmul qword ptr (_U2) +faddp st(1),st +fsub qword ptr (_Z) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L307 +fld qword ptr (_Two) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L309 +fld qword ptr (_Two) +fadd qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_X) +fdiv qword ptr (_Two) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (_One) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L310 +fld qword ptr (_S) +fstp qword ptr (_StickyBit) +jmp L310 +L309: +fld qword ptr (_S) +fstp qword ptr (_StickyBit) +L310: +L307: +L305: +L303: +L301: +L299: +L296: +fld qword ptr (_One) +fcomp qword ptr (_StickyBit) +fstsw ax +sahf +jne L313 +lea edi,(L315) +push edi +call _printf +add esp,4 +jmp L314 +L313: +lea edi,(L316) +push edi +call _printf +add esp,4 +L314: +lea edi,(L318) +push edi +cmp dword ptr (_GMult),0 +je L319 +cmp dword ptr (_GDiv),0 +je L319 +cmp dword ptr (_GAddSub),0 +je L319 +cmp dword ptr (_RMult),0 +je L319 +cmp dword ptr (_RDiv),0 +je L319 +cmp dword ptr (_RAddSub),0 +je L319 +mov dword ptr (-1184)[ebp],1 +jmp L320 +L319: +mov dword ptr (-1184)[ebp],0 +L320: +mov edi,dword ptr (-1184)[ebp] +push edi +push 3 +call _TstCond +add esp,12 +mov dword ptr (_Milestone),60 +lea edi,(L44) +push edi +call _printf +add esp,4 +lea edi,(L321) +push edi +call _printf +add esp,4 +mov edi,dword ptr (_NoTrials) +push edi +lea edi,(L322) +push edi +call _printf +add esp,8 +fld qword ptr (L323) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1192)[ebp] +fld qword ptr (-1192)[ebp] +fstp qword ptr (_Random9) +fld qword ptr (_Third) +fstp qword ptr (_Random1) +mov dword ptr (_I),1 +L324: +call _Random +add esp,0 +fstp qword ptr (-1200)[ebp] +fld qword ptr (-1200)[ebp] +fstp qword ptr (_X) +call _Random +add esp,0 +fstp qword ptr (-1208)[ebp] +fld qword ptr (-1208)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Y) +fmul qword ptr (_X) +fstp qword ptr (_Z9) +fld qword ptr (_X) +fmul qword ptr (_Y) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fsub qword ptr (_Z9) +fstp qword ptr (_Z9) +inc dword ptr (_I) +L325: +mov edi,dword ptr (_NoTrials) +cmp dword ptr (_I),edi +jg L327 +fld qword ptr (_Zero) +fcomp qword ptr (_Z9) +fstsw ax +sahf +je L324 +L327: +mov edi,dword ptr (_NoTrials) +cmp dword ptr (_I),edi +jne L328 +fld qword ptr (_One) +fld qword ptr (_Half) +fdiv qword ptr (_Three) +faddp st(1),st +fstp qword ptr (-1208)[ebp] +fld qword ptr (-1208)[ebp] +fstp qword ptr (_Random1) +fld qword ptr (_U2) +fadd qword ptr (_U1) +fadd qword ptr (_One) +fstp qword ptr (-1216)[ebp] +fld qword ptr (-1216)[ebp] +fstp qword ptr (_Random2) +fld qword ptr (_Random1) +fstp qword ptr (-1224)[ebp] +fld qword ptr (_Random2) +fstp qword ptr (-1232)[ebp] +fld qword ptr (-1224)[ebp] +fmul qword ptr (-1232)[ebp] +fstp qword ptr (_Z) +fld qword ptr (-1232)[ebp] +fmul qword ptr (-1224)[ebp] +fstp qword ptr (_Y) +fld qword ptr (-1208)[ebp] +fmul qword ptr (-1216)[ebp] +fstp qword ptr (-1240)[ebp] +fld qword ptr (-1240)[ebp] +fsub qword ptr (-1240)[ebp] +fstp qword ptr (_Z9) +L328: +mov edi,dword ptr (_NoTrials) +cmp dword ptr (_I),edi +je L330 +fld qword ptr (_Zero) +fcomp qword ptr (_Z9) +fstsw ax +sahf +je L330 +lea edi,(L332) +push edi +push 2 +call _BadCond +add esp,8 +jmp L331 +L330: +mov edi,dword ptr (_NoTrials) +push edi +lea edi,(L333) +push edi +call _printf +add esp,8 +L331: +mov dword ptr (_Milestone),70 +lea edi,(L334) +push edi +call _printf +add esp,4 +fld qword ptr (_Zero) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1212)[ebp] +fld qword ptr (-1212)[ebp] +fcomp qword ptr (_Zero) +fstsw ax +sahf +jne L337 +fld qword ptr (_Zero) +fchs +fstp qword ptr (-1220)[ebp] +fld qword ptr (-1220)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1228)[ebp] +fld qword ptr (-1228)[ebp] +fcomp qword ptr (-1220)[ebp] +fstsw ax +sahf +jne L337 +fld qword ptr (_One) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1244)[ebp] +fld qword ptr (-1244)[ebp] +fcomp qword ptr (_One) +fstsw ax +sahf +jne L337 +mov dword ptr (-1196)[ebp],1 +jmp L338 +L337: +mov dword ptr (-1196)[ebp],0 +L338: +lea edi,(L336) +push edi +mov edi,dword ptr (-1196)[ebp] +push edi +push 0 +call _TstCond +add esp,12 +fld qword ptr (_Zero) +fstp qword ptr (_MinSqEr) +fld qword ptr (_Zero) +fstp qword ptr (_MaxSqEr) +fld qword ptr (_Zero) +fstp qword ptr (_J) +fld qword ptr (_Radix) +fstp qword ptr (_X) +fld qword ptr (_U2) +fstp qword ptr (_OneUlp) +push 1 +call _SqXMinX +add esp,4 +fld qword ptr (_BInvrse) +fstp qword ptr (_X) +fld qword ptr (_BInvrse) +fmul qword ptr (_U1) +fstp qword ptr (_OneUlp) +push 1 +call _SqXMinX +add esp,4 +fld qword ptr (_U1) +fstp qword ptr (_X) +fld qword ptr (_U1) +fmul qword ptr (_U1) +fstp qword ptr (_OneUlp) +push 1 +call _SqXMinX +add esp,4 +fld qword ptr (_Zero) +fcomp qword ptr (_J) +fstsw ax +sahf +je L339 +call _Pause +add esp,0 +L339: +mov edi,dword ptr (_NoTrials) +push edi +lea edi,(L341) +push edi +call _printf +add esp,8 +fld qword ptr (_Zero) +fstp qword ptr (_J) +fld qword ptr (_Two) +fstp qword ptr (_X) +fld qword ptr (_Radix) +fstp qword ptr (_Y) +fld qword ptr (_One) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L342 +L344: +fld qword ptr (_Y) +fstp qword ptr (-1284)[ebp] +fld qword ptr (-1284)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Radix) +fmul qword ptr (-1284)[ebp] +fstp qword ptr (_Y) +L345: +fld qword ptr (_Y) +fsub qword ptr (_X) +fild dword ptr (_NoTrials) +fcompp +fstsw ax +sahf +ja L344 +L342: +fld qword ptr (_X) +fmul qword ptr (_U2) +fstp qword ptr (_OneUlp) +mov dword ptr (_I),1 +jmp L348 +L347: +fld qword ptr (_X) +fadd qword ptr (_One) +fstp qword ptr (_X) +push 2 +call _SqXMinX +add esp,4 +fld qword ptr (_Zero) +fcomp qword ptr (_J) +fstsw ax +sahf +jae L350 +jmp L349 +L350: +inc dword ptr (_I) +L348: +mov edi,dword ptr (_NoTrials) +cmp dword ptr (_I),edi +jle L347 +L349: +lea edi,(L352) +push edi +call _printf +add esp,4 +mov dword ptr (_I),-1 +fld qword ptr (_BMinusU2) +fstp qword ptr (_X) +fld qword ptr (_Radix) +fstp qword ptr (_Y) +fld qword ptr (_Radix) +fld qword ptr (_Radix) +fmul qword ptr (_U2) +faddp st(1),st +fstp qword ptr (_Z) +mov dword ptr (_NotMonot),0 +mov dword ptr (_Monot),0 +jmp L354 +L353: +inc dword ptr (_I) +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1292)[ebp] +fld qword ptr (-1292)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1300)[ebp] +fld qword ptr (-1300)[ebp] +fstp qword ptr (_Q) +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1308)[ebp] +fld qword ptr (-1308)[ebp] +fstp qword ptr (_Z) +fld qword ptr (_Q) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L358 +fld qword ptr (_Z) +fcomp qword ptr (_Q) +fstsw ax +sahf +jae L356 +L358: +mov dword ptr (_NotMonot),1 +jmp L357 +L356: +fld qword ptr (_Q) +fadd qword ptr (_Half) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1324)[ebp] +fld qword ptr (-1324)[ebp] +fstp qword ptr (_Q) +cmp dword ptr (_I),0 +jg L361 +fld qword ptr (_Q) +fmul qword ptr (_Q) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jne L359 +L361: +mov dword ptr (_Monot),1 +jmp L360 +L359: +cmp dword ptr (_I),0 +jle L362 +cmp dword ptr (_I),1 +jle L364 +mov dword ptr (_Monot),1 +jmp L363 +L364: +fld qword ptr (_Y) +fmul qword ptr (_BInvrse) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fstp qword ptr (-1340)[ebp] +fld qword ptr (-1340)[ebp] +fsub qword ptr (_U1) +fstp qword ptr (_X) +fld qword ptr (-1340)[ebp] +fadd qword ptr (_U1) +fstp qword ptr (_Z) +jmp L363 +L362: +fld qword ptr (_Q) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fstp qword ptr (-1340)[ebp] +fld qword ptr (-1340)[ebp] +fsub qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (-1340)[ebp] +fadd qword ptr (_U2) +fstp qword ptr (_Z) +L363: +L360: +L357: +L354: +cmp dword ptr (_NotMonot),0 +jne L366 +cmp dword ptr (_Monot),0 +je L353 +L366: +cmp dword ptr (_Monot),0 +je L367 +lea edi,(L369) +push edi +call _printf +add esp,4 +jmp L368 +L367: +lea edi,(L157) +push edi +push 2 +call _BadCond +add esp,8 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L370) +push edi +call _printf +add esp,12 +L368: +mov dword ptr (_Milestone),80 +fld qword ptr (_MinSqEr) +fadd qword ptr (_Half) +fstp qword ptr (_MinSqEr) +fld qword ptr (_MaxSqEr) +fsub qword ptr (_Half) +fstp qword ptr (_MaxSqEr) +fld qword ptr (_One) +fadd qword ptr (_U2) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1300)[ebp] +fld qword ptr (-1300)[ebp] +fsub qword ptr (_One) +fdiv qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (_One) +fld qword ptr (_U2) +fdiv qword ptr (_Eight) +faddp st(1),st +fstp qword ptr (_SqEr) +fld qword ptr (_MaxSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jae L371 +fld qword ptr (_SqEr) +fstp qword ptr (_MaxSqEr) +L371: +fld qword ptr (_Y) +fld qword ptr (_U2) +fdiv qword ptr (_Eight) +faddp st(1),st +fstp qword ptr (_SqEr) +fld qword ptr (_MinSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jbe L373 +fld qword ptr (_SqEr) +fstp qword ptr (_MinSqEr) +L373: +fld qword ptr (_F9) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1324)[ebp] +fld qword ptr (-1324)[ebp] +fsub qword ptr (_U2) +fld qword ptr (_One) +fsub qword ptr (_U2) +fsubp st(1),st +fdiv qword ptr (_U1) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fld qword ptr (_U1) +fdiv qword ptr (_Eight) +faddp st(1),st +fstp qword ptr (_SqEr) +fld qword ptr (_MaxSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jae L375 +fld qword ptr (_SqEr) +fstp qword ptr (_MaxSqEr) +L375: +fld qword ptr (_Y) +fadd qword ptr (_One) +fld qword ptr (_U1) +fdiv qword ptr (_Eight) +faddp st(1),st +fstp qword ptr (_SqEr) +fld qword ptr (_MinSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jbe L377 +fld qword ptr (_SqEr) +fstp qword ptr (_MinSqEr) +L377: +fld qword ptr (_U2) +fstp qword ptr (_OneUlp) +fld qword ptr (_OneUlp) +fstp qword ptr (_X) +mov dword ptr (_Indx),1 +L379: +fld qword ptr (_X) +fadd qword ptr (_U1) +fadd qword ptr (_X) +fadd qword ptr (_F9) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1356)[ebp] +fld qword ptr (-1356)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Y) +fsub qword ptr (_U2) +fld qword ptr (_One) +fsub qword ptr (_U2) +fadd qword ptr (_X) +fsubp st(1),st +fdiv qword ptr (_OneUlp) +fstp qword ptr (_Y) +fld qword ptr (_U1) +fsub qword ptr (_X) +fadd qword ptr (_F9) +fmul qword ptr (_Half) +fmul qword ptr (_X) +fmul qword ptr (_X) +fdiv qword ptr (_OneUlp) +fstp qword ptr (_Z) +fld qword ptr (_Y) +fadd qword ptr (_Half) +fadd qword ptr (_Z) +fstp qword ptr (_SqEr) +fld qword ptr (_MinSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jbe L383 +fld qword ptr (_SqEr) +fstp qword ptr (_MinSqEr) +L383: +fld qword ptr (_Y) +fsub qword ptr (_Half) +fadd qword ptr (_Z) +fstp qword ptr (_SqEr) +fld qword ptr (_MaxSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jae L385 +fld qword ptr (_SqEr) +fstp qword ptr (_MaxSqEr) +L385: +mov edi,dword ptr (_Indx) +cmp edi,1 +je L389 +cmp edi,3 +jne L387 +L389: +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _Sign +add esp,8 +fstp qword ptr (-1396)[ebp] +fld qword ptr (_OneUlp) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1404)[ebp] +fld qword ptr (_Eight) +fld qword ptr (_Nine) +fmul qword ptr (-1404)[ebp] +fdivp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1412)[ebp] +fld qword ptr (_OneUlp) +fmul qword ptr (-1396)[ebp] +fmul qword ptr (-1412)[ebp] +fstp qword ptr (_X) +jmp L388 +L387: +fld qword ptr (_U1) +fstp qword ptr (_OneUlp) +fld qword ptr (_OneUlp) +fchs +fstp qword ptr (_X) +L388: +L380: +inc dword ptr (_Indx) +cmp dword ptr (_Indx),3 +jle L379 +mov dword ptr (_Milestone),85 +mov dword ptr (_SqRWrng),0 +mov dword ptr (_Anomaly),0 +mov dword ptr (_RSqrt),0 +fld qword ptr (_One) +fcomp qword ptr (_Radix) +fstsw ax +sahf +je L390 +lea edi,(L392) +push edi +call _printf +add esp,4 +fld qword ptr (_Precision) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1356)[ebp] +fld qword ptr (_One) +fadd qword ptr (_Precision) +fsub qword ptr (-1356)[ebp] +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-1364)[ebp] +fld qword ptr (_Half) +fadd qword ptr (-1364)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1372)[ebp] +fld qword ptr (-1372)[ebp] +fstp qword ptr (_D) +fld qword ptr (_D) +fdiv qword ptr (_Radix) +fstp qword ptr (_X) +fld qword ptr (_D) +fdiv qword ptr (_A1) +fstp qword ptr (_Y) +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1396)[ebp] +fld qword ptr (-1396)[ebp] +fcomp qword ptr (_X) +fstsw ax +sahf +jne L395 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1412)[ebp] +fld qword ptr (-1412)[ebp] +fcomp qword ptr (_Y) +fstsw ax +sahf +je L393 +L395: +mov dword ptr (_Anomaly),1 +jmp L394 +L393: +fld qword ptr (_Zero) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (_Z2) +fld qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fstp qword ptr (_Y2) +fld qword ptr (_Radix) +fsub qword ptr (_One) +fstp qword ptr (_Z1) +fld qword ptr (_Four) +fmul qword ptr (_D) +fstp qword ptr (_FourD) +L396: +fld qword ptr (_Z2) +fcomp qword ptr (_Y2) +fstsw ax +sahf +jae L399 +fld qword ptr (_Radix) +fstp qword ptr (_Q) +fld qword ptr (_Y) +fstp qword ptr (_Y1) +L401: +fld qword ptr (_Half) +fld qword ptr (_Q) +fdiv qword ptr (_Y1) +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1436)[ebp] +fld qword ptr (_Q) +fld qword ptr (-1436)[ebp] +fmul qword ptr (_Y1) +faddp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-1444)[ebp] +fld qword ptr (-1444)[ebp] +fstp qword ptr (_X1) +fld qword ptr (_Y1) +fstp qword ptr (_Q) +fld qword ptr (_X1) +fstp qword ptr (_Y1) +L402: +fld qword ptr (_Zero) +fcomp qword ptr (_X1) +fstsw ax +sahf +jb L401 +fld qword ptr (_One) +fcomp qword ptr (_Q) +fstsw ax +sahf +jb L404 +fld qword ptr (_Y2) +fstp qword ptr (_Z2) +fld qword ptr (_Y) +fstp qword ptr (_Z) +L404: +L399: +fld qword ptr (_Y) +fadd qword ptr (_Two) +fstp qword ptr (_Y) +fld qword ptr (_X) +fadd qword ptr (_Eight) +fstp qword ptr (_X) +fld qword ptr (_Y2) +fadd qword ptr (_X) +fstp qword ptr (_Y2) +fld qword ptr (_FourD) +fcomp qword ptr (_Y2) +fstsw ax +sahf +ja L406 +fld qword ptr (_Y2) +fsub qword ptr (_FourD) +fstp qword ptr (_Y2) +L406: +L397: +fld qword ptr (_D) +fcomp qword ptr (_Y) +fstsw ax +sahf +ja L396 +fld qword ptr (_FourD) +fsub qword ptr (_Z2) +fstp qword ptr (_X8) +fld qword ptr (_X8) +fstp qword ptr (-1436)[ebp] +fld qword ptr (-1436)[ebp] +fld qword ptr (_Z) +fmul qword ptr (_Z) +faddp st(1),st +fdiv qword ptr (_FourD) +fstp qword ptr (_Q) +fld qword ptr (-1436)[ebp] +fdiv qword ptr (_Eight) +fstp qword ptr (_X8) +fld qword ptr (_Q) +fstp qword ptr (-1452)[ebp] +fld qword ptr (-1452)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1460)[ebp] +fld qword ptr (-1460)[ebp] +fcomp qword ptr (-1452)[ebp] +fstsw ax +sahf +je L408 +mov dword ptr (_Anomaly),1 +jmp L409 +L408: +mov dword ptr (_Break),0 +L410: +fld qword ptr (_Z1) +fmul qword ptr (_Z) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-1468)[ebp] +fld qword ptr (-1468)[ebp] +fdiv qword ptr (_Radix) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1476)[ebp] +fld qword ptr (-1468)[ebp] +fld qword ptr (-1476)[ebp] +fmul qword ptr (_Radix) +fsubp st(1),st +fstp qword ptr (_X) +fld qword ptr (_One) +fcomp qword ptr (_X) +fstsw ax +sahf +jne L413 +mov dword ptr (_Break),1 +jmp L414 +L413: +fld qword ptr (_Z1) +fsub qword ptr (_One) +fstp qword ptr (_Z1) +L414: +L411: +cmp dword ptr (_Break),0 +jne L415 +fld qword ptr (_Zero) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jb L410 +L415: +fld qword ptr (_Zero) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jb L416 +cmp dword ptr (_Break),0 +jne L416 +mov dword ptr (_Anomaly),1 +jmp L417 +L416: +fld qword ptr (_RadixD2) +fcomp qword ptr (_Z1) +fstsw ax +sahf +jae L418 +fld qword ptr (_Z1) +fsub qword ptr (_Radix) +fstp qword ptr (_Z1) +L418: +L420: +call _NewD +add esp,0 +L421: +fld qword ptr (_U2) +fmul qword ptr (_D) +fld qword ptr (_F9) +fcompp +fstsw ax +sahf +ja L420 +fld qword ptr (_D) +fmul qword ptr (_Radix) +fsub qword ptr (_D) +fld qword ptr (_W) +fsub qword ptr (_D) +fcompp +fstsw ax +sahf +je L423 +mov dword ptr (_Anomaly),1 +jmp L424 +L423: +fld qword ptr (_D) +fstp qword ptr (_Z2) +mov dword ptr (_I),0 +fld qword ptr (_D) +fld qword ptr (_One) +fadd qword ptr (_Z) +fmul qword ptr (_Half) +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_D) +fadd qword ptr (_Z) +fadd qword ptr (_Q) +fstp qword ptr (_X) +call _SR3750 +add esp,0 +fld qword ptr (_D) +fld qword ptr (_One) +fsub qword ptr (_Z) +fmul qword ptr (_Half) +faddp st(1),st +fadd qword ptr (_D) +fstp qword ptr (_Y) +fld qword ptr (_D) +fsub qword ptr (_Z) +fadd qword ptr (_D) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-1508)[ebp] +fld qword ptr (-1508)[ebp] +fadd qword ptr (_Q) +fadd qword ptr (-1508)[ebp] +fstp qword ptr (_X) +call _SR3750 +add esp,0 +call _NewD +add esp,0 +fld qword ptr (_D) +fsub qword ptr (_Z2) +fld qword ptr (_W) +fsub qword ptr (_Z2) +fcompp +fstsw ax +sahf +je L425 +mov dword ptr (_Anomaly),1 +jmp L426 +L425: +fld qword ptr (_D) +fsub qword ptr (_Z2) +fstp qword ptr (-1532)[ebp] +fld qword ptr (-1532)[ebp] +fld qword ptr (_Z2) +fld qword ptr (_One) +fsub qword ptr (_Z) +fmul qword ptr (_Half) +faddp st(1),st +faddp st(1),st +fstp qword ptr (_Y) +fld qword ptr (-1532)[ebp] +fld qword ptr (_Z2) +fsub qword ptr (_Z) +fadd qword ptr (_Q) +faddp st(1),st +fstp qword ptr (_X) +call _SR3750 +add esp,0 +fld qword ptr (_One) +fadd qword ptr (_Z) +fmul qword ptr (_Half) +fstp qword ptr (_Y) +fld qword ptr (_Q) +fstp qword ptr (_X) +call _SR3750 +add esp,0 +cmp dword ptr (_I),0 +jne L427 +mov dword ptr (_Anomaly),1 +L427: +L426: +L424: +L417: +L409: +L394: +cmp dword ptr (_I),0 +je L431 +cmp dword ptr (_Anomaly),0 +je L429 +L431: +lea edi,(L432) +push edi +push 0 +call _BadCond +add esp,8 +fld qword ptr (_W) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L433) +push edi +call _printf +add esp,12 +lea edi,(L434) +push edi +call _printf +add esp,4 +mov dword ptr (_SqRWrng),1 +L429: +L390: +cmp dword ptr (_Anomaly),0 +jne L435 +fld qword ptr (_Zero) +fcomp qword ptr (_MinSqEr) +fstsw ax +sahf +ja L437 +fld qword ptr (_Zero) +fcomp qword ptr (_MaxSqEr) +fstsw ax +sahf +jb L437 +mov dword ptr (_RSqrt),1 +lea edi,(L439) +push edi +call _printf +add esp,4 +jmp L438 +L437: +fld qword ptr (_MaxSqEr) +fadd qword ptr (_U2) +fld qword ptr (_U2) +fsub qword ptr (_Half) +fcompp +fstsw ax +sahf +jb L443 +fld qword ptr (_Half) +fcomp qword ptr (_MinSqEr) +fstsw ax +sahf +jb L443 +fld qword ptr (_MinSqEr) +fadd qword ptr (_Radix) +fld qword ptr (_Half) +fcompp +fstsw ax +sahf +jbe L440 +L443: +mov dword ptr (_SqRWrng),1 +jmp L441 +L440: +mov dword ptr (_RSqrt),2 +lea edi,(L444) +push edi +call _printf +add esp,4 +L441: +L438: +L435: +cmp dword ptr (_SqRWrng),0 +je L445 +lea edi,(L447) +push edi +call _printf +add esp,4 +fld qword ptr (_MinSqEr) +fsub qword ptr (_Half) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L448) +push edi +call _printf +add esp,12 +fld qword ptr (_Half) +fadd qword ptr (_MaxSqEr) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L449) +push edi +call _printf +add esp,12 +lea edi,(L451) +push edi +fld qword ptr (_MaxSqEr) +fsub qword ptr (_MinSqEr) +fld qword ptr (_Radix) +fmul qword ptr (_Radix) +fcompp +fstsw ax +sahf +jbe L452 +mov dword ptr (-1344)[ebp],1 +jmp L453 +L452: +mov dword ptr (-1344)[ebp],0 +L453: +mov edi,dword ptr (-1344)[ebp] +push edi +push 1 +call _TstCond +add esp,12 +L445: +mov dword ptr (_Milestone),90 +call _Pause +add esp,0 +lea edi,(L454) +push edi +call _printf +add esp,4 +mov dword ptr (_N),0 +mov dword ptr (_I),0 +fld qword ptr (_Zero) +fchs +fstp qword ptr (_Z) +mov dword ptr (_M),3 +mov dword ptr (_Break),0 +L455: +fld qword ptr (_One) +fstp qword ptr (_X) +call _SR3980 +add esp,0 +cmp dword ptr (_I),10 +jg L458 +mov dword ptr (_I),1023 +call _SR3980 +add esp,0 +L458: +fld qword ptr (_MinusOne) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L460 +mov dword ptr (_Break),1 +jmp L461 +L460: +fld qword ptr (_MinusOne) +fstp qword ptr (_Z) +call _PrintIfNPositive +add esp,0 +mov dword ptr (_N),0 +mov dword ptr (_I),-4 +L461: +L456: +cmp dword ptr (_Break),0 +je L455 +call _PrintIfNPositive +add esp,0 +mov edi,dword ptr (_N) +mov dword ptr (_N1),edi +mov dword ptr (_N),0 +fld qword ptr (_A1) +fstp qword ptr (_Z) +fld qword ptr (_W) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-1348)[ebp] +fld qword ptr (_A1) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-1356)[ebp] +fld qword ptr (_Two) +fmul qword ptr (-1348)[ebp] +fdiv qword ptr (-1356)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1364)[ebp] +fld qword ptr (-1364)[ebp] +call __ftol +mov dword ptr (_M),eax +mov dword ptr (_Break),0 +L462: +fld qword ptr (_Z) +fstp qword ptr (_X) +mov dword ptr (_I),1 +call _SR3980 +add esp,0 +fld qword ptr (_AInvrse) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L465 +mov dword ptr (_Break),1 +jmp L466 +L465: +fld qword ptr (_AInvrse) +fstp qword ptr (_Z) +L466: +L463: +cmp dword ptr (_Break),0 +je L462 +mov dword ptr (_Milestone),100 +mov edi,dword ptr (_NoTrials) +mov dword ptr (_M),edi +fld qword ptr (_Three) +fstp qword ptr (_Z) +L467: +fld qword ptr (_Z) +fstp qword ptr (_X) +mov dword ptr (_I),1 +call _SR3980 +add esp,0 +L470: +fld qword ptr (_Z) +fadd qword ptr (_Two) +fstp qword ptr (_Z) +L471: +fld qword ptr (_Z) +fdiv qword ptr (_Three) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1380)[ebp] +fld qword ptr (_Three) +fmul qword ptr (-1380)[ebp] +fld qword ptr (_Z) +fcompp +fstsw ax +sahf +je L470 +L468: +fld qword ptr (_Eight) +fmul qword ptr (_Three) +fcomp qword ptr (_Z) +fstsw ax +sahf +ja L467 +cmp dword ptr (_N),0 +jle L473 +lea edi,(L475) +push edi +call _printf +add esp,4 +lea edi,(L476) +push edi +call _printf +add esp,4 +L473: +call _PrintIfNPositive +add esp,0 +mov edi,dword ptr (_N1) +add dword ptr (_N),edi +cmp dword ptr (_N),0 +jne L477 +lea edi,(L479) +push edi +call _printf +add esp,4 +L477: +cmp dword ptr (_N),0 +jle L480 +call _Pause +add esp,0 +jmp L481 +L480: +lea edi,(L44) +push edi +call _printf +add esp,4 +L481: +mov dword ptr (_Milestone),110 +lea edi,(L482) +push edi +call _printf +add esp,4 +fld qword ptr (_U1) +fstp qword ptr (_D) +fld qword ptr (_Precision) +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1380)[ebp] +fld qword ptr (-1380)[ebp] +fcomp qword ptr (_Precision) +fstsw ax +sahf +je L483 +fld qword ptr (_BInvrse) +fstp qword ptr (_D) +fld qword ptr (_Precision) +fstp qword ptr (_X) +L485: +fld qword ptr (_D) +fmul qword ptr (_BInvrse) +fstp qword ptr (_D) +fld qword ptr (_X) +fsub qword ptr (_One) +fstp qword ptr (_X) +L486: +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L485 +L483: +fld qword ptr (_One) +fstp qword ptr (_Y) +fld qword ptr (_D) +fstp qword ptr (_Z) +L488: +fld qword ptr (_Y) +fstp qword ptr (_C) +fld qword ptr (_Z) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fstp qword ptr (-1388)[ebp] +fld qword ptr (-1388)[ebp] +fmul qword ptr (-1388)[ebp] +fstp qword ptr (_Z) +L489: +fld qword ptr (_Z) +fcomp qword ptr (_Y) +fstsw ax +sahf +jae L491 +fld qword ptr (_Z) +fadd qword ptr (_Z) +fld qword ptr (_Z) +fcompp +fstsw ax +sahf +jb L488 +L491: +fld qword ptr (_C) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fmul qword ptr (_D) +fstp qword ptr (_Z) +L492: +fld qword ptr (_Y) +fstp qword ptr (_C) +fld qword ptr (_Z) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fmul qword ptr (_D) +fstp qword ptr (_Z) +L493: +fld qword ptr (_Z) +fcomp qword ptr (_Y) +fstsw ax +sahf +jae L495 +fld qword ptr (_Z) +fadd qword ptr (_Z) +fld qword ptr (_Z) +fcompp +fstsw ax +sahf +jb L492 +L495: +fld qword ptr (_Two) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jbe L496 +fld qword ptr (_Two) +fstp qword ptr (_HInvrse) +jmp L497 +L496: +fld qword ptr (_Radix) +fstp qword ptr (_HInvrse) +L497: +fld qword ptr (_One) +fdiv qword ptr (_HInvrse) +fstp qword ptr (_H) +fld qword ptr (_One) +fdiv qword ptr (_C) +fstp qword ptr (_CInvrse) +fld qword ptr (_C) +fstp qword ptr (_E0) +fld qword ptr (_E0) +fmul qword ptr (_H) +fstp qword ptr (_Z) +L498: +fld qword ptr (_E0) +fstp qword ptr (_Y) +fld qword ptr (_Z) +fstp qword ptr (_E0) +fld qword ptr (_E0) +fmul qword ptr (_H) +fstp qword ptr (_Z) +L499: +fld qword ptr (_Z) +fcomp qword ptr (_E0) +fstsw ax +sahf +jae L501 +fld qword ptr (_Z) +fadd qword ptr (_Z) +fld qword ptr (_Z) +fcompp +fstsw ax +sahf +jb L498 +L501: +fld qword ptr (_E0) +fstp qword ptr (_UfThold) +fld qword ptr (_Zero) +fstp qword ptr (_E1) +fld qword ptr (_Zero) +fstp qword ptr (_Q) +fld qword ptr (_U2) +fstp qword ptr (_E9) +fld qword ptr (_One) +fadd qword ptr (_E9) +fstp qword ptr (_S) +fld qword ptr (_C) +fmul qword ptr (_S) +fstp qword ptr (_D) +fld qword ptr (_C) +fcomp qword ptr (_D) +fstsw ax +sahf +jb L502 +fld qword ptr (_Radix) +fmul qword ptr (_U2) +fstp qword ptr (_E9) +fld qword ptr (_One) +fadd qword ptr (_E9) +fstp qword ptr (_S) +fld qword ptr (_C) +fmul qword ptr (_S) +fstp qword ptr (_D) +fld qword ptr (_C) +fcomp qword ptr (_D) +fstsw ax +sahf +jb L503 +lea edi,(L506) +push edi +push 0 +call _BadCond +add esp,8 +fld qword ptr (_E0) +fstp qword ptr (_Underflow) +fld qword ptr (_Zero) +fstp qword ptr (_Y1) +fld qword ptr (_Z) +fstp qword ptr (_PseudoZero) +call _Pause +add esp,0 +jmp L503 +L502: +fld qword ptr (_D) +fstp qword ptr (_Underflow) +fld qword ptr (_Underflow) +fmul qword ptr (_H) +fstp qword ptr (_PseudoZero) +fld qword ptr (_Zero) +fstp qword ptr (_UfThold) +L507: +fld qword ptr (_Underflow) +fstp qword ptr (_Y1) +fld qword ptr (_PseudoZero) +fstp qword ptr (_Underflow) +fld qword ptr (_E1) +fadd qword ptr (_E1) +fld qword ptr (_E1) +fcompp +fstsw ax +sahf +jb L510 +fld qword ptr (_Underflow) +fmul qword ptr (_HInvrse) +fstp qword ptr (_Y2) +fld qword ptr (_Y1) +fsub qword ptr (_Y2) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-1452)[ebp] +fld qword ptr (-1452)[ebp] +fstp qword ptr (_E1) +fld qword ptr (_Y1) +fstp qword ptr (_Q) +fld qword ptr (_Zero) +fcomp qword ptr (_UfThold) +fstsw ax +sahf +jne L512 +fld qword ptr (_Y2) +fcomp qword ptr (_Y1) +fstsw ax +sahf +je L512 +fld qword ptr (_Y1) +fstp qword ptr (_UfThold) +L512: +L510: +fld qword ptr (_PseudoZero) +fmul qword ptr (_H) +fstp qword ptr (_PseudoZero) +L508: +fld qword ptr (_PseudoZero) +fcomp qword ptr (_Underflow) +fstsw ax +sahf +jae L514 +fld qword ptr (_PseudoZero) +fadd qword ptr (_PseudoZero) +fld qword ptr (_PseudoZero) +fcompp +fstsw ax +sahf +jb L507 +L514: +L503: +fld qword ptr (_Zero) +fcomp qword ptr (_PseudoZero) +fstsw ax +sahf +je L515 +lea edi,(L44) +push edi +call _printf +add esp,4 +fld qword ptr (_PseudoZero) +fstp qword ptr (_Z) +fld qword ptr (_Zero) +fcomp qword ptr (_PseudoZero) +fstsw ax +sahf +jb L517 +lea edi,(L519) +push edi +push 0 +call _BadCond +add esp,8 +lea edi,(L520) +push edi +call _printf +add esp,4 +fld qword ptr (_PseudoZero) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L521) +push edi +call _printf +add esp,12 +fld qword ptr (_PseudoZero) +fchs +fstp qword ptr (_X) +fld qword ptr (_Zero) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L518 +lea edi,(L524) +push edi +call _printf +add esp,4 +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L525) +push edi +call _printf +add esp,12 +jmp L518 +L517: +lea edi,(L526) +push edi +push 3 +call _BadCond +add esp,8 +fld qword ptr (_PseudoZero) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L527) +push edi +call _printf +add esp,12 +L518: +call _TstPtUf +add esp,0 +L515: +mov dword ptr (_Milestone),120 +fld qword ptr (_CInvrse) +fmul qword ptr (_Y) +fld qword ptr (_CInvrse) +fmul qword ptr (_Y1) +fcompp +fstsw ax +sahf +jae L528 +fld qword ptr (_H) +fmul qword ptr (_S) +fstp qword ptr (_S) +fld qword ptr (_Underflow) +fstp qword ptr (_E0) +L528: +fld qword ptr (_Zero) +fcomp qword ptr (_E1) +fstsw ax +sahf +je L530 +fld qword ptr (_E0) +fcomp qword ptr (_E1) +fstsw ax +sahf +je L530 +lea edi,(L157) +push edi +push 2 +call _BadCond +add esp,8 +fld qword ptr (_E0) +fcomp qword ptr (_E1) +fstsw ax +sahf +jbe L532 +lea edi,(L534) +push edi +call _printf +add esp,4 +lea edi,(L535) +push edi +call _printf +add esp,4 +fld qword ptr (_Zero) +fcomp qword ptr (_PseudoZero) +fstsw ax +sahf +jne L533 +fld qword ptr (_E1) +fstp qword ptr (_E0) +jmp L533 +L532: +lea edi,(L538) +push edi +call _printf +add esp,4 +lea edi,(L539) +push edi +call _printf +add esp,4 +L533: +L530: +fld qword ptr (_E0) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L540) +push edi +call _printf +add esp,12 +fld qword ptr (_E0) +fstp qword ptr (_Z) +call _TstPtUf +add esp,0 +fld qword ptr (_E0) +fstp qword ptr (_Underflow) +cmp dword ptr (_N),1 +jne L541 +fld qword ptr (_Y) +fstp qword ptr (_Underflow) +L541: +mov dword ptr (_I),4 +fld qword ptr (_Zero) +fcomp qword ptr (_E1) +fstsw ax +sahf +jne L543 +mov dword ptr (_I),3 +L543: +fld qword ptr (_Zero) +fcomp qword ptr (_UfThold) +fstsw ax +sahf +jne L545 +sub dword ptr (_I),2 +L545: +mov dword ptr (_UfNGrad),1 +mov edi,dword ptr (_I) +cmp edi,1 +jl L547 +cmp edi,4 +jg L547 +jmp dword ptr (L570-4)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L570 label byte +dd L549 +dd L556 +dd L561 +dd L562 +_TEXT ends +_TEXT segment +L549: +fld qword ptr (_Underflow) +fstp qword ptr (_UfThold) +fld qword ptr (_CInvrse) +fmul qword ptr (_Q) +fld qword ptr (_CInvrse) +fmul qword ptr (_Y) +fmul qword ptr (_S) +fcompp +fstsw ax +sahf +je L550 +fld qword ptr (_Y) +fstp qword ptr (_UfThold) +lea edi,(L552) +push edi +push 0 +call _BadCond +add esp,8 +fld qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L553) +push edi +call _printf +add esp,12 +fld qword ptr (_C) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L554) +push edi +call _printf +add esp,12 +lea edi,(L555) +push edi +call _printf +add esp,4 +L550: +call _Pause +add esp,0 +jmp L548 +L556: +lea edi,(L557) +push edi +push 0 +call _BadCond +add esp,8 +lea edi,(L558) +push edi +call _printf +add esp,4 +fld qword ptr (_Y2) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L559) +push edi +call _printf +add esp,20 +fld qword ptr (_Q) +fsub qword ptr (_Y2) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-1468)[ebp] +fld qword ptr (-1468)[ebp] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L560) +push edi +call _printf +add esp,12 +fld qword ptr (_Q) +fstp qword ptr (_UfThold) +jmp L548 +L561: +fld qword ptr (_X) +fstp qword ptr (_X) +jmp L548 +L562: +fld qword ptr (_UfThold) +fcomp qword ptr (_Q) +fstsw ax +sahf +jne L563 +fld qword ptr (_E0) +fcomp qword ptr (_E1) +fstsw ax +sahf +jne L563 +fld qword ptr (_UfThold) +fld qword ptr (_E1) +fdiv qword ptr (_E9) +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-1492)[ebp] +fld qword ptr (_E1) +fcomp qword ptr (-1492)[ebp] +fstsw ax +sahf +jb L563 +mov dword ptr (_UfNGrad),0 +lea edi,(L565) +push edi +call _printf +add esp,4 +lea edi,(L566) +push edi +call _printf +add esp,4 +fld qword ptr (_E0) +fmul qword ptr (_CInvrse) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fld qword ptr (_OneAndHalf) +fadd qword ptr (_U2) +fmulp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_CInvrse) +fld qword ptr (_One) +fadd qword ptr (_U2) +fmulp st(1),st +fstp qword ptr (_X) +fld qword ptr (_Y) +fdiv qword ptr (_X) +fstp qword ptr (_Y) +fld qword ptr (_E0) +fcomp qword ptr (_Y) +fstsw ax +sahf +jne L568 +mov dword ptr (-1496)[ebp],1 +jmp L569 +L568: +mov dword ptr (-1496)[ebp],0 +L569: +mov edi,dword ptr (-1496)[ebp] +mov dword ptr (_IEEE),edi +L563: +L547: +L548: +cmp dword ptr (_UfNGrad),0 +je L572 +lea edi,(L44) +push edi +call _printf +add esp,4 +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +je L574 +lea edi,(L576) +push edi +call _printf +add esp,4 +fld qword ptr (_H) +fadd qword ptr (_H) +fstp qword ptr (_R) +jmp L575 +L574: +fld qword ptr (_Underflow) +fdiv qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1460)[ebp] +fld qword ptr (-1460)[ebp] +fstp qword ptr (_R) +L575: +mov dword ptr (_sigsave),0 +fld qword ptr (_H) +fcomp qword ptr (_R) +fstsw ax +sahf +jb L577 +fld qword ptr (_R) +fmul qword ptr (_UfThold) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fld qword ptr (_One) +fld qword ptr (_R) +fmul qword ptr (_H) +fld qword ptr (_One) +fadd qword ptr (_H) +fmulp st(1),st +faddp st(1),st +fmulp st(1),st +fstp qword ptr (_X) +jmp L578 +L577: +fld qword ptr (_UfThold) +fstp qword ptr (_Z) +fld qword ptr (_Z) +fld qword ptr (_One) +fld qword ptr (_H) +fmul qword ptr (_H) +fld qword ptr (_One) +fadd qword ptr (_H) +fmulp st(1),st +faddp st(1),st +fmulp st(1),st +fstp qword ptr (_X) +L578: +fld qword ptr (_Z) +fcomp qword ptr (_X) +fstsw ax +sahf +je L579 +fld qword ptr (_X) +fsub qword ptr (_Z) +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L579 +lea edi,(L157) +push edi +push 3 +call _BadCond +add esp,8 +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L581) +push edi +call _printf +add esp,20 +fld qword ptr (_X) +fsub qword ptr (_Z) +fstp qword ptr (_Z9) +fld qword ptr (_Z9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L582) +push edi +call _printf +add esp,12 +lea edi,(L583) +push edi +call _printf +add esp,4 +lea edi,(L584) +push edi +call _printf +add esp,4 +lea edi,(L585) +push edi +call _printf +add esp,4 +lea edi,(L586) +push edi +call _printf +add esp,4 +lea edi,(L587) +push edi +call _printf +add esp,4 +lea edi,(L588) +push edi +call _printf +add esp,4 +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +je L589 +lea edi,(L591) +push edi +call _printf +add esp,4 +jmp L590 +L589: +fld qword ptr (_X) +fdiv qword ptr (_Z) +fsub qword ptr (_Half) +fsub qword ptr (_Half) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L592) +push edi +call _printf +add esp,12 +L590: +mov dword ptr (_sigsave),0 +L579: +L572: +lea edi,(L594) +push edi +fld qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L593) +push edi +call _printf +add esp,16 +lea edi,(L595) +push edi +call _printf +add esp,4 +lea edi,(L596) +push edi +call _printf +add esp,4 +fld qword ptr (_U1) +fmul qword ptr (_U1) +fstp qword ptr (_Y2) +fld qword ptr (_Y2) +fstp qword ptr (-1468)[ebp] +fld qword ptr (-1468)[ebp] +fmul qword ptr (-1468)[ebp] +fstp qword ptr (_Y) +fld qword ptr (_Y) +fmul qword ptr (_U1) +fstp qword ptr (_Y2) +fld qword ptr (_UfThold) +fcomp qword ptr (_Y2) +fstsw ax +sahf +jb L597 +fld qword ptr (_E0) +fcomp qword ptr (_Y) +fstsw ax +sahf +jae L599 +lea edi,(L157) +push edi +push 2 +call _BadCond +add esp,8 +mov dword ptr (_I),5 +jmp L600 +L599: +lea edi,(L157) +push edi +push 1 +call _BadCond +add esp,8 +mov dword ptr (_I),4 +L600: +mov edi,dword ptr (_I) +push edi +lea edi,(L601) +push edi +call _printf +add esp,8 +L597: +mov dword ptr (_Milestone),130 +fld qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-1476)[ebp] +fld qword ptr (_HInvrse) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-1484)[ebp] +fld qword ptr (_Half) +fld qword ptr (_TwoForty) +fmul qword ptr (-1476)[ebp] +fdiv qword ptr (-1484)[ebp] +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1492)[ebp] +fld qword ptr (-1492)[ebp] +fchs +fdiv qword ptr (_TwoForty) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fadd qword ptr (_Y) +fstp qword ptr (_Y2) +lea edi,(L602) +push edi +call _printf +add esp,4 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_HInvrse) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L603) +push edi +call _printf +add esp,20 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_HInvrse) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L604) +push edi +call _printf +add esp,20 +fld qword ptr (_Y2) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_HInvrse) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-1508)[ebp] +fld qword ptr (-1508)[ebp] +fstp qword ptr (_V9) +fld qword ptr (_V9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L605) +push edi +call _printf +add esp,12 +fld qword ptr (_Zero) +fcomp qword ptr (_V9) +fstsw ax +sahf +ja L608 +fld qword ptr (_Radix) +fadd qword ptr (_Radix) +fadd qword ptr (_E9) +fmul qword ptr (_UfThold) +fcomp qword ptr (_V9) +fstsw ax +sahf +jae L606 +L608: +lea edi,(L609) +push edi +push 1 +call _BadCond +add esp,8 +fld qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L610) +push edi +call _printf +add esp,12 +jmp L607 +L606: +fld qword ptr (_UfThold) +fld qword ptr (_One) +fadd qword ptr (_E9) +fmulp st(1),st +fcomp qword ptr (_V9) +fstsw ax +sahf +jb L611 +lea edi,(L613) +push edi +call _printf +add esp,4 +jmp L612 +L611: +lea edi,(L609) +push edi +push 2 +call _BadCond +add esp,8 +fld qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L610) +push edi +call _printf +add esp,12 +L612: +L607: +mov dword ptr (_Milestone),140 +lea edi,(L44) +push edi +call _printf +add esp,4 +fld qword ptr (_Zero) +fstp qword ptr (_X) +mov dword ptr (_I),2 +fld qword ptr (_Two) +fmul qword ptr (_Three) +fstp qword ptr (_Y) +fld qword ptr (_Zero) +fstp qword ptr (_Q) +mov dword ptr (_N),0 +L614: +fld qword ptr (_X) +fstp qword ptr (_Z) +inc dword ptr (_I) +mov edi,dword ptr (_I) +fld qword ptr (_Y) +lea edi,[edi][edi] +push edi +fild dword ptr 0[esp] +add esp,4 +fdivp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_Y) +fadd qword ptr (_Q) +fstp qword ptr (_R) +fld qword ptr (_Z) +fstp qword ptr (-1540)[ebp] +fld qword ptr (_R) +fstp qword ptr (-1548)[ebp] +fld qword ptr (-1540)[ebp] +fadd qword ptr (-1548)[ebp] +fstp qword ptr (_X) +fld qword ptr (-1540)[ebp] +fsub qword ptr (_X) +fadd qword ptr (-1548)[ebp] +fstp qword ptr (_Q) +L615: +fld qword ptr (_Z) +fcomp qword ptr (_X) +fstsw ax +sahf +jb L614 +fld qword ptr (_OneAndHalf) +fld qword ptr (_One) +fdiv qword ptr (_Eight) +faddp st(1),st +fld qword ptr (_X) +fld qword ptr (_OneAndHalf) +fmul qword ptr (_ThirtyTwo) +fdivp st(1),st +faddp st(1),st +fstp qword ptr (_Z) +fld qword ptr (_Z) +fstp qword ptr (-1548)[ebp] +fld qword ptr (-1548)[ebp] +fmul qword ptr (-1548)[ebp] +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-1556)[ebp] +fld qword ptr (-1556)[ebp] +fmul qword ptr (-1556)[ebp] +fstp qword ptr (_Exp2) +fld qword ptr (_F9) +fstp qword ptr (_X) +fld qword ptr (_X) +fsub qword ptr (_U1) +fstp qword ptr (_Y) +fld qword ptr (_Exp2) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L617) +push edi +call _printf +add esp,12 +mov dword ptr (_I),1 +L618: +fld qword ptr (_X) +fsub qword ptr (_BInvrse) +fstp qword ptr (_Z) +fld qword ptr (_X) +fadd qword ptr (_One) +fld qword ptr (_Z) +fld qword ptr (_One) +fsub qword ptr (_BInvrse) +fsubp st(1),st +fdivp st(1),st +fstp qword ptr (_Z) +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-1588)[ebp] +fld qword ptr (-1588)[ebp] +fsub qword ptr (_Exp2) +fstp qword ptr (_Q) +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-1596)[ebp] +fld qword ptr (_TwoForty) +fmul qword ptr (_U2) +fcomp qword ptr (-1596)[ebp] +fstsw ax +sahf +jae L622 +mov dword ptr (_N),1 +fld qword ptr (_X) +fsub qword ptr (_BInvrse) +fld qword ptr (_One) +fsub qword ptr (_BInvrse) +fsubp st(1),st +fstp qword ptr (_V9) +lea edi,(L624) +push edi +push 2 +call _BadCond +add esp,8 +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-1612)[ebp] +fld qword ptr (-1612)[ebp] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L625) +push edi +call _printf +add esp,12 +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_V9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L626) +push edi +call _printf +add esp,20 +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L627) +push edi +call _printf +add esp,12 +lea edi,(L628) +push edi +call _printf +add esp,4 +lea edi,(L629) +push edi +call _printf +add esp,4 +jmp L620 +L622: +fld qword ptr (_Y) +fstp qword ptr (-1604)[ebp] +fld qword ptr (-1604)[ebp] +fsub qword ptr (_X) +fmul qword ptr (_Two) +fadd qword ptr (-1604)[ebp] +fstp qword ptr (_Z) +fld qword ptr (-1604)[ebp] +fstp qword ptr (_X) +fld qword ptr (_Z) +fstp qword ptr (_Y) +fld qword ptr (_X) +fsub qword ptr (_F9) +fstp qword ptr (-1612)[ebp] +fld qword ptr (_One) +fld qword ptr (-1612)[ebp] +fmul qword ptr (-1612)[ebp] +faddp st(1),st +fstp qword ptr (_Z) +fld qword ptr (_One) +fcomp qword ptr (_Z) +fstsw ax +sahf +jae L630 +mov edi,dword ptr (_NoTrials) +cmp dword ptr (_I),edi +jge L630 +inc dword ptr (_I) +jmp L618 +L630: +fld qword ptr (_One) +fcomp qword ptr (_X) +fstsw ax +sahf +jae L632 +cmp dword ptr (_N),0 +jne L620 +lea edi,(L636) +push edi +call _printf +add esp,4 +jmp L620 +L632: +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_X) +fld qword ptr (_U2) +fadd qword ptr (_U2) +fstp qword ptr (_Y) +fld qword ptr (_Y) +fadd qword ptr (_X) +fstp qword ptr (_Y) +mov dword ptr (_I),1 +jmp L618 +L620: +mov dword ptr (_Milestone),150 +lea edi,(L637) +push edi +call _printf +add esp,4 +mov dword ptr (_N),0 +fld qword ptr (_A1) +fstp qword ptr (_Z) +fld qword ptr (_C) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-1564)[ebp] +fld qword ptr (_A1) +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-1572)[ebp] +fld qword ptr (_Half) +fld qword ptr (-1564)[ebp] +fdiv qword ptr (-1572)[ebp] +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-1580)[ebp] +fld qword ptr (-1580)[ebp] +fstp qword ptr (_Q) +mov dword ptr (_Break),0 +L638: +fld qword ptr (_CInvrse) +fstp qword ptr (_X) +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-1588)[ebp] +fld qword ptr (-1588)[ebp] +fstp qword ptr (_Y) +call _IsYeqX +add esp,0 +fld qword ptr (_Q) +fchs +fstp qword ptr (_Q) +fld qword ptr (_C) +fstp qword ptr (_X) +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-1596)[ebp] +fld qword ptr (-1596)[ebp] +fstp qword ptr (_Y) +call _IsYeqX +add esp,0 +fld qword ptr (_One) +fcomp qword ptr (_Z) +fstsw ax +sahf +jbe L641 +mov dword ptr (_Break),1 +jmp L642 +L641: +fld qword ptr (_AInvrse) +fstp qword ptr (_Z) +L642: +L639: +cmp dword ptr (_Break),0 +je L638 +call _PrintIfNPositive +add esp,0 +cmp dword ptr (_N),0 +jne L643 +lea edi,(L645) +push edi +call _printf +add esp,4 +L643: +lea edi,(L44) +push edi +call _printf +add esp,4 +mov dword ptr (_Milestone),160 +call _Pause +add esp,0 +lea edi,(L646) +push edi +call _printf +add esp,4 +lea edi,(L647) +push edi +call _printf +add esp,4 +fld qword ptr (_CInvrse) +fchs +fstp qword ptr (_Y) +fld qword ptr (_HInvrse) +fmul qword ptr (_Y) +fstp qword ptr (_V9) +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +je L648 +mov dword ptr (_I),0 +fld qword ptr (_Y) +fstp qword ptr (_V9) +jmp L650 +L648: +L651: +fld qword ptr (_Y) +fstp qword ptr (_V) +fld qword ptr (_V9) +fstp qword ptr (_Y) +fld qword ptr (_HInvrse) +fmul qword ptr (_Y) +fstp qword ptr (_V9) +L652: +fld qword ptr (_Y) +fcomp qword ptr (_V9) +fstsw ax +sahf +ja L651 +mov dword ptr (_I),1 +L650: +mov dword ptr (_sigsave),0 +fld qword ptr (_V9) +fstp qword ptr (_Z) +lea edi,(L654) +push edi +call _printf +add esp,4 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L655) +push edi +call _printf +add esp,12 +fld qword ptr (_Y) +fchs +fstp qword ptr (_V9) +fld qword ptr (_V9) +fstp qword ptr (_V0) +fld qword ptr (_V) +fsub qword ptr (_Y) +fld qword ptr (_V) +fadd qword ptr (_V0) +fcompp +fstsw ax +sahf +jne L656 +lea edi,(L658) +push edi +call _printf +add esp,4 +jmp L657 +L656: +lea edi,(L659) +push edi +call _printf +add esp,4 +lea edi,(L660) +push edi +push 3 +call _BadCond +add esp,8 +L657: +fld qword ptr (_Y) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L661 +lea edi,(L157) +push edi +push 1 +call _BadCond +add esp,8 +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L663) +push edi +call _printf +add esp,20 +L661: +cmp dword ptr (_I),0 +je L664 +fld qword ptr (_V) +fld qword ptr (_HInvrse) +fmul qword ptr (_U2) +fsub qword ptr (_HInvrse) +fmulp st(1),st +fstp qword ptr (_Y) +fld qword ptr (_Y) +fld qword ptr (_One) +fsub qword ptr (_HInvrse) +fmul qword ptr (_U2) +fmul qword ptr (_V) +faddp st(1),st +fstp qword ptr (_Z) +fld qword ptr (_V0) +fcomp qword ptr (_Z) +fstsw ax +sahf +jbe L666 +fld qword ptr (_Z) +fstp qword ptr (_Y) +L666: +fld qword ptr (_V0) +fcomp qword ptr (_Y) +fstsw ax +sahf +jbe L668 +fld qword ptr (_Y) +fstp qword ptr (_V) +L668: +fld qword ptr (_V0) +fsub qword ptr (_V) +fld qword ptr (_V0) +fcompp +fstsw ax +sahf +jbe L665 +fld qword ptr (_V0) +fstp qword ptr (_V) +jmp L665 +L664: +fld qword ptr (_Y) +fld qword ptr (_HInvrse) +fmul qword ptr (_U2) +fsub qword ptr (_HInvrse) +fmulp st(1),st +fstp qword ptr (_V) +fld qword ptr (_V) +fld qword ptr (_One) +fsub qword ptr (_HInvrse) +fmul qword ptr (_U2) +fmul qword ptr (_Y) +faddp st(1),st +fstp qword ptr (_V) +L665: +fld qword ptr (_V) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L672) +push edi +call _printf +add esp,12 +cmp dword ptr (_I),0 +je L673 +fld qword ptr (_V0) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L675) +push edi +call _printf +add esp,12 +jmp L674 +L673: +lea edi,(L676) +push edi +call _printf +add esp,4 +L674: +fld qword ptr (_V) +fmul qword ptr (_One) +fstp qword ptr (_V9) +fld qword ptr (_V9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L677) +push edi +call _printf +add esp,12 +fld qword ptr (_V) +fdiv qword ptr (_One) +fstp qword ptr (_V9) +fld qword ptr (_V9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L678) +push edi +call _printf +add esp,12 +lea edi,(L679) +push edi +call _printf +add esp,4 +lea edi,(L680) +push edi +call _printf +add esp,4 +mov dword ptr (_Milestone),170 +fld qword ptr (_V) +fchs +fld qword ptr (_V) +fcompp +fstsw ax +sahf +jbe L685 +fld qword ptr (_V0) +fchs +fld qword ptr (_V0) +fcompp +fstsw ax +sahf +jbe L685 +fld qword ptr (_UfThold) +fchs +fld qword ptr (_V) +fcompp +fstsw ax +sahf +jbe L685 +fld qword ptr (_V) +fcomp qword ptr (_UfThold) +fstsw ax +sahf +ja L681 +L685: +lea edi,(L686) +push edi +push 0 +call _BadCond +add esp,8 +fld qword ptr (_UfThold) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_V0) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_V) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L687) +push edi +call _printf +add esp,28 +L681: +mov dword ptr (_Milestone),175 +lea edi,(L44) +push edi +call _printf +add esp,4 +mov dword ptr (_Indx),1 +L688: +mov edi,dword ptr (_Indx) +cmp edi,1 +je L694 +cmp edi,2 +je L695 +cmp edi,3 +je L696 +jmp L692 +L694: +fld qword ptr (_UfThold) +fstp qword ptr (_Z) +jmp L693 +L695: +fld qword ptr (_E0) +fstp qword ptr (_Z) +jmp L693 +L696: +fld qword ptr (_PseudoZero) +fstp qword ptr (_Z) +L692: +L693: +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L697 +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1628)[ebp] +fld qword ptr (-1628)[ebp] +fstp qword ptr (_V9) +fld qword ptr (_V9) +fmul qword ptr (_V9) +fstp qword ptr (_Y) +fld qword ptr (_Radix) +fmul qword ptr (_E9) +fstp qword ptr (-1660)[ebp] +fld qword ptr (_Y) +fld qword ptr (_One) +fsub qword ptr (-1660)[ebp] +fdivp st(1),st +fld qword ptr (_Z) +fcompp +fstsw ax +sahf +ja L701 +fld qword ptr (_One) +fadd qword ptr (-1660)[ebp] +fmul qword ptr (_Z) +fcomp qword ptr (_Y) +fstsw ax +sahf +jae L699 +L701: +fld qword ptr (_U1) +fcomp qword ptr (_V9) +fstsw ax +sahf +jae L702 +lea edi,(L157) +push edi +push 1 +call _BadCond +add esp,8 +jmp L703 +L702: +lea edi,(L157) +push edi +push 2 +call _BadCond +add esp,8 +L703: +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L704) +push edi +call _printf +add esp,12 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L705) +push edi +call _printf +add esp,12 +L699: +L697: +L689: +inc dword ptr (_Indx) +cmp dword ptr (_Indx),3 +jle L688 +mov dword ptr (_Milestone),180 +mov dword ptr (_Indx),1 +L706: +cmp dword ptr (_Indx),1 +jne L710 +fld qword ptr (_V) +fstp qword ptr (_Z) +jmp L711 +L710: +fld qword ptr (_V0) +fstp qword ptr (_Z) +L711: +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-1628)[ebp] +fld qword ptr (-1628)[ebp] +fstp qword ptr (_V9) +fld qword ptr (_V9) +fstp qword ptr (-1636)[ebp] +fld qword ptr (_One) +fld qword ptr (_Radix) +fmul qword ptr (_E9) +fsubp st(1),st +fmul qword ptr (-1636)[ebp] +fstp qword ptr (_X) +fld qword ptr (-1636)[ebp] +fmul qword ptr (_X) +fstp qword ptr (_V9) +fld qword ptr (_One) +fld qword ptr (_Two) +fmul qword ptr (_Radix) +fmul qword ptr (_E9) +fsubp st(1),st +fmul qword ptr (_Z) +fcomp qword ptr (_V9) +fstsw ax +sahf +ja L714 +fld qword ptr (_Z) +fcomp qword ptr (_V9) +fstsw ax +sahf +jae L712 +L714: +fld qword ptr (_V9) +fstp qword ptr (_Y) +fld qword ptr (_W) +fcomp qword ptr (_X) +fstsw ax +sahf +jbe L715 +lea edi,(L157) +push edi +push 1 +call _BadCond +add esp,8 +jmp L716 +L715: +lea edi,(L157) +push edi +push 2 +call _BadCond +add esp,8 +L716: +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L717) +push edi +call _printf +add esp,12 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L718) +push edi +call _printf +add esp,12 +L712: +L707: +inc dword ptr (_Indx) +cmp dword ptr (_Indx),2 +jle L706 +mov dword ptr (_Milestone),190 +call _Pause +add esp,0 +fld qword ptr (_UfThold) +fmul qword ptr (_V) +fstp qword ptr (_X) +fld qword ptr (_Radix) +fmul qword ptr (_Radix) +fstp qword ptr (_Y) +fld qword ptr (_X) +fmul qword ptr (_Y) +fld qword ptr (_One) +fcompp +fstsw ax +sahf +ja L721 +fld qword ptr (_Y) +fcomp qword ptr (_X) +fstsw ax +sahf +jae L719 +L721: +fld qword ptr (_X) +fmul qword ptr (_Y) +fld qword ptr (_U1) +fcompp +fstsw ax +sahf +ja L724 +fld qword ptr (_Y) +fdiv qword ptr (_U1) +fcomp qword ptr (_X) +fstsw ax +sahf +jae L722 +L724: +lea edi,(L725) +push edi +push 2 +call _BadCond +add esp,8 +jmp L723 +L722: +lea edi,(L157) +push edi +push 3 +call _BadCond +add esp,8 +L723: +lea edi,(L727) +push edi +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L726) +push edi +call _printf +add esp,16 +L719: +mov dword ptr (_Milestone),200 +mov dword ptr (_Indx),1 +L728: +fld qword ptr (_F9) +fstp qword ptr (_X) +mov edi,dword ptr (_Indx) +cmp edi,2 +jl L732 +cmp edi,5 +jg L732 +jmp dword ptr (L738-8)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L738 label byte +dd L734 +dd L735 +dd L736 +dd L737 +_TEXT ends +_TEXT segment +L734: +fld qword ptr (_One) +fadd qword ptr (_U2) +fstp qword ptr (_X) +jmp L733 +L735: +fld qword ptr (_V) +fstp qword ptr (_X) +jmp L733 +L736: +fld qword ptr (_UfThold) +fstp qword ptr (_X) +jmp L733 +L737: +fld qword ptr (_Radix) +fstp qword ptr (_X) +L732: +L733: +fld qword ptr (_X) +fstp qword ptr (_Y) +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +je L740 +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L742) +push edi +call _printf +add esp,12 +jmp L741 +L740: +fld qword ptr (_Y) +fdiv qword ptr (_X) +fsub qword ptr (_Half) +fsub qword ptr (_Half) +fstp qword ptr (_V9) +fld qword ptr (_Zero) +fcomp qword ptr (_V9) +fstsw ax +sahf +jne L743 +jmp L729 +L743: +fld qword ptr (_U1) +fchs +fcomp qword ptr (_V9) +fstsw ax +sahf +jne L745 +cmp dword ptr (_Indx),5 +jge L745 +lea edi,(L157) +push edi +push 3 +call _BadCond +add esp,8 +jmp L746 +L745: +lea edi,(L157) +push edi +push 1 +call _BadCond +add esp,8 +L746: +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L747) +push edi +call _printf +add esp,12 +fld qword ptr (_V9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L748) +push edi +call _printf +add esp,12 +L741: +mov dword ptr (_sigsave),0 +L729: +inc dword ptr (_Indx) +cmp dword ptr (_Indx),5 +jle L728 +mov dword ptr (_Milestone),210 +fld qword ptr (_Zero) +fstp qword ptr (_MyZero) +lea edi,(L44) +push edi +call _printf +add esp,4 +lea edi,(L749) +push edi +call _printf +add esp,4 +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(L750) +push edi +call _printf +add esp,4 +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +jne L751 +fld qword ptr (_One) +fdiv qword ptr (_MyZero) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L753) +push edi +call _printf +add esp,12 +L751: +mov dword ptr (_sigsave),0 +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(L754) +push edi +call _printf +add esp,4 +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +jne L755 +fld qword ptr (_Zero) +fdiv qword ptr (_MyZero) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L753) +push edi +call _printf +add esp,12 +L755: +mov dword ptr (_sigsave),0 +mov dword ptr (_Milestone),220 +call _Pause +add esp,0 +lea edi,(L44) +push edi +call _printf +add esp,4 +mov dword ptr (-1648)[ebp],0 +L762: +mov edi,dword ptr (-1648)[ebp] +cmp dword ptr (_ErrCnt)[edi*4],0 +je L766 +mov edi,dword ptr (-1648)[ebp] +lea edi,[edi*4] +mov esi,dword ptr (_ErrCnt)[edi] +push esi +mov edi,dword ptr (L757)[edi] +push edi +lea edi,(L768) +push edi +call _printf +add esp,12 +L766: +L763: +inc dword ptr (-1648)[ebp] +cmp dword ptr (-1648)[ebp],4 +jl L762 +lea edi,(L44) +push edi +call _printf +add esp,4 +mov edi,dword ptr (_ErrCnt) +mov esi,dword ptr (_ErrCnt+4) +lea edi,[esi][edi] +mov esi,dword ptr (_ErrCnt+8) +lea edi,[esi][edi] +mov esi,dword ptr (_ErrCnt+12) +lea edi,[esi][edi] +cmp edi,0 +jle L769 +mov edi,dword ptr (_ErrCnt) +mov esi,dword ptr (_ErrCnt+4) +lea edi,[esi][edi] +mov esi,dword ptr (_ErrCnt+8) +lea edi,[esi][edi] +cmp edi,0 +jne L774 +cmp dword ptr (_ErrCnt+12),0 +jle L774 +lea edi,(L779) +push edi +call _printf +add esp,4 +lea edi,(L780) +push edi +call _printf +add esp,4 +L774: +mov edi,dword ptr (_ErrCnt) +mov esi,dword ptr (_ErrCnt+4) +lea edi,[esi][edi] +cmp edi,0 +jne L781 +cmp dword ptr (_ErrCnt+8),0 +jle L781 +lea edi,(L785) +push edi +call _printf +add esp,4 +lea edi,(L786) +push edi +call _printf +add esp,4 +L781: +mov edi,dword ptr (_ErrCnt) +mov esi,dword ptr (_ErrCnt+4) +lea edi,[esi][edi] +cmp edi,0 +jle L787 +lea edi,(L790) +push edi +call _printf +add esp,4 +lea edi,(L791) +push edi +call _printf +add esp,4 +L787: +cmp dword ptr (_ErrCnt),0 +jle L770 +lea edi,(L794) +push edi +call _printf +add esp,4 +lea edi,(L795) +push edi +call _printf +add esp,4 +jmp L770 +L769: +lea edi,(L796) +push edi +call _printf +add esp,4 +cmp dword ptr (_RMult),1 +jne L801 +cmp dword ptr (_RDiv),1 +jne L801 +cmp dword ptr (_RAddSub),1 +jne L801 +cmp dword ptr (_RSqrt),1 +je L797 +L801: +lea edi,(L802) +push edi +call _printf +add esp,4 +jmp L798 +L797: +fld qword ptr (_One) +fcomp qword ptr (_StickyBit) +fstsw ax +sahf +ja L803 +fld qword ptr (_Radix) +fsub qword ptr (_Two) +fld qword ptr (_Radix) +fsub qword ptr (_Nine) +fsub qword ptr (_One) +fmulp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L803 +lea edi,(L805) +push edi +call _printf +add esp,4 +lea edi,(L806) +push edi +call _printf +add esp,4 +fld qword ptr (_Two) +fcomp qword ptr (_Radix) +fstsw ax +sahf +jne L807 +fld qword ptr (_Precision) +fld qword ptr (_Four) +fmul qword ptr (_Three) +fmul qword ptr (_Two) +fsubp st(1),st +fld qword ptr (_Precision) +fsub qword ptr (_TwentySeven) +fsub qword ptr (_TwentySeven) +fadd qword ptr (_One) +fmulp st(1),st +fld qword ptr (_Zero) +fcompp +fstsw ax +sahf +jne L807 +lea edi,(L809) +push edi +call _printf +add esp,4 +jmp L808 +L807: +lea edi,(L810) +push edi +call _printf +add esp,4 +L808: +cmp dword ptr (_IEEE),0 +je L811 +lea edi,(L813) +push edi +call _printf +add esp,4 +jmp L812 +L811: +lea edi,(L814) +push edi +call _printf +add esp,4 +lea edi,(L815) +push edi +call _printf +add esp,4 +L812: +L803: +lea edi,(L816) +push edi +call _printf +add esp,4 +L798: +L770: +cmp dword ptr (_fpecount),0 +je L817 +mov edi,dword ptr (_fpecount) +push edi +lea edi,(L819) +push edi +call _printf +add esp,8 +L817: +lea edi,(L820) +push edi +call _printf +add esp,4 +mov eax,0 +L6: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _Sign +_Sign: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +fld qword ptr (L7) +fcomp qword ptr (20)[ebp] +fstsw ax +sahf +ja L823 +fld qword ptr (L8) +fstp qword ptr (-8)[ebp] +jmp L824 +L823: +fld qword ptr (L825) +fstp qword ptr (-8)[ebp] +L824: +fld qword ptr (-8)[ebp] +L821: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _Pause +_Pause: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (_Milestone) +push edi +lea edi,(L827) +push edi +call _printf +add esp,8 +mov edi,dword ptr (_PageNo) +push edi +lea edi,(L828) +push edi +call _printf +add esp,8 +inc dword ptr (_Milestone) +inc dword ptr (_PageNo) +mov eax,0 +L826: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _TstCond +_TstCond: +push ebx +push esi +push edi +push ebp +mov ebp,esp +cmp dword ptr (24)[ebp],0 +jne L830 +mov edi,dword ptr (28)[ebp] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _BadCond +add esp,8 +lea edi,(L813) +push edi +call _printf +add esp,4 +L830: +mov eax,0 +L829: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L833 label byte +dd L834 +dd L835 +dd L836 +dd L837 +public _BadCond +_DATA ends +_TEXT segment +_BadCond: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +lea edi,(_ErrCnt)[edi*4] +inc dword ptr [edi] +mov edi,dword ptr (24)[ebp] +push edi +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (L833)[edi*4] +push edi +lea edi,(L838) +push edi +call _printf +add esp,12 +mov eax,0 +L832: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _Random +_Random: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,48 +fld qword ptr (_Random1) +fadd qword ptr (_Random9) +fstp qword ptr (-8)[ebp] +fld qword ptr (-8)[ebp] +fmul qword ptr (-8)[ebp] +fstp qword ptr (-16)[ebp] +fld qword ptr (-16)[ebp] +fmul qword ptr (-16)[ebp] +fstp qword ptr (-16)[ebp] +fld qword ptr (-8)[ebp] +fmul qword ptr (-16)[ebp] +fstp qword ptr (-8)[ebp] +fld qword ptr (-8)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-48)[ebp] +fld qword ptr (-8)[ebp] +fsub qword ptr (-48)[ebp] +fstp qword ptr (-16)[ebp] +fld qword ptr (-16)[ebp] +fld qword ptr (L840) +fmul qword ptr (-8)[ebp] +faddp st(1),st +fstp qword ptr (_Random1) +fld qword ptr (_Random1) +L839: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _SqXMinX +_SqXMinX: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,40 +fld qword ptr (_X) +fmul qword ptr (_BInvrse) +fstp qword ptr (-8)[ebp] +fld qword ptr (_X) +fsub qword ptr (-8)[ebp] +fstp qword ptr (-16)[ebp] +fld qword ptr (_X) +fmul qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-32)[ebp] +fld qword ptr (-32)[ebp] +fsub qword ptr (-8)[ebp] +fsub qword ptr (-16)[ebp] +fdiv qword ptr (_OneUlp) +fstp qword ptr (_SqEr) +fld qword ptr (_Zero) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +je L842 +fld qword ptr (_MinSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jbe L844 +fld qword ptr (_SqEr) +fstp qword ptr (_MinSqEr) +L844: +fld qword ptr (_MaxSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jae L846 +fld qword ptr (_SqEr) +fstp qword ptr (_MaxSqEr) +L846: +fld qword ptr (_J) +fadd qword ptr (L8) +fstp qword ptr (_J) +lea edi,(L44) +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _BadCond +add esp,8 +fld qword ptr (_OneUlp) +fmul qword ptr (_SqEr) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_X) +fmul qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L848) +push edi +call _printf +add esp,28 +lea edi,(L849) +push edi +call _printf +add esp,4 +L842: +mov eax,0 +L841: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _NewD +_NewD: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,40 +fld qword ptr (_Z1) +fmul qword ptr (_Q) +fstp qword ptr (_X) +fld qword ptr (_Half) +fld qword ptr (_X) +fdiv qword ptr (_Radix) +fsubp st(1),st +sub esp,8 +fstp qword ptr [esp] +call _floor +add esp,8 +fstp qword ptr (-8)[ebp] +fld qword ptr (-8)[ebp] +fmul qword ptr (_Radix) +fadd qword ptr (_X) +fstp qword ptr (_X) +fld qword ptr (_X) +fstp qword ptr (-24)[ebp] +fld qword ptr (_Z) +fstp qword ptr (-32)[ebp] +fld qword ptr (_Q) +fld qword ptr (-24)[ebp] +fmul qword ptr (-32)[ebp] +fsubp st(1),st +fdiv qword ptr (_Radix) +fld qword ptr (-24)[ebp] +fmul qword ptr (-24)[ebp] +fld qword ptr (_D) +fdiv qword ptr (_Radix) +fmulp st(1),st +faddp st(1),st +fstp qword ptr (_Q) +fld qword ptr (-32)[ebp] +fld qword ptr (_Two) +fmul qword ptr (-24)[ebp] +fmul qword ptr (_D) +fsubp st(1),st +fstp qword ptr (_Z) +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jb L851 +fld qword ptr (_Z) +fchs +fstp qword ptr (_Z) +fld qword ptr (_Z1) +fchs +fstp qword ptr (_Z1) +L851: +fld qword ptr (_Radix) +fmul qword ptr (_D) +fstp qword ptr (_D) +mov eax,0 +L850: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _SR3750 +_SR3750: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,64 +fld qword ptr (_X) +fsub qword ptr (_Radix) +fld qword ptr (_Z2) +fsub qword ptr (_Radix) +fcompp +fstsw ax +sahf +ja L854 +fld qword ptr (_X) +fsub qword ptr (_Z2) +fld qword ptr (_W) +fsub qword ptr (_Z2) +fcompp +fstsw ax +sahf +jb L854 +inc dword ptr (_I) +fld qword ptr (_X) +fmul qword ptr (_D) +sub esp,8 +fstp qword ptr [esp] +call _sqrt +add esp,8 +fstp qword ptr (-32)[ebp] +fld qword ptr (-32)[ebp] +fstp qword ptr (_X2) +fld qword ptr (_X2) +fsub qword ptr (_Z2) +fld qword ptr (_Y) +fsub qword ptr (_Z2) +fsubp st(1),st +fstp qword ptr (_Y2) +fld qword ptr (_X8) +fld qword ptr (_Y) +fsub qword ptr (_Half) +fdivp st(1),st +fstp qword ptr (_X2) +fld qword ptr (_X2) +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +fld qword ptr (_Half) +fmul qword ptr (-64)[ebp] +fmul qword ptr (-64)[ebp] +fsubp st(1),st +fstp qword ptr (_X2) +fld qword ptr (_Y2) +fadd qword ptr (_Half) +fld qword ptr (_Half) +fsub qword ptr (_X2) +faddp st(1),st +fstp qword ptr (_SqEr) +fld qword ptr (_MinSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jbe L856 +fld qword ptr (_SqEr) +fstp qword ptr (_MinSqEr) +L856: +fld qword ptr (_Y2) +fsub qword ptr (_X2) +fstp qword ptr (_SqEr) +fld qword ptr (_MaxSqEr) +fcomp qword ptr (_SqEr) +fstsw ax +sahf +jae L858 +fld qword ptr (_SqEr) +fstp qword ptr (_MaxSqEr) +L858: +L854: +mov eax,0 +L853: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _IsYeqX +_IsYeqX: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +fld qword ptr (_X) +fcomp qword ptr (_Y) +fstsw ax +sahf +je L861 +cmp dword ptr (_N),0 +jg L863 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L865 +fld qword ptr (_Zero) +fcomp qword ptr (_Q) +fstsw ax +sahf +jb L865 +lea edi,(L867) +push edi +call _printf +add esp,4 +jmp L866 +L865: +lea edi,(L868) +push edi +push 2 +call _BadCond +add esp,8 +L866: +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L869) +push edi +call _printf +add esp,20 +fld qword ptr (_Y) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L870) +push edi +call _printf +add esp,12 +fld qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L871) +push edi +call _printf +add esp,12 +fld qword ptr (_Y) +fsub qword ptr (_X) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L872) +push edi +call _printf +add esp,12 +L863: +inc dword ptr (_N) +L861: +mov eax,0 +L860: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _SR3980 +_SR3980: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +L874: +fild dword ptr (_I) +fstp qword ptr (_Q) +fld qword ptr (_Q) +sub esp,8 +fstp qword ptr [esp] +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +call _pow +add esp,16 +fstp qword ptr (-8)[ebp] +fld qword ptr (-8)[ebp] +fstp qword ptr (_Y) +call _IsYeqX +add esp,0 +mov edi,dword ptr (_I) +lea edi,(1)[edi] +mov dword ptr (_I),edi +cmp edi,dword ptr (_M) +jle L877 +jmp L876 +L877: +fld qword ptr (_Z) +fmul qword ptr (_X) +fstp qword ptr (_X) +L875: +fld qword ptr (_W) +fcomp qword ptr (_X) +fstsw ax +sahf +ja L874 +L876: +mov eax,0 +L873: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _PrintIfNPositive +_PrintIfNPositive: +push ebx +push esi +push edi +push ebp +mov ebp,esp +cmp dword ptr (_N),0 +jle L880 +mov edi,dword ptr (_N) +push edi +lea edi,(L882) +push edi +call _printf +add esp,8 +L880: +mov eax,0 +L879: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _TstPtUf +_TstPtUf: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,48 +mov dword ptr (_N),0 +fld qword ptr (_Zero) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L884 +lea edi,(L886) +push edi +call _printf +add esp,4 +lea edi,(L887) +push edi +call _printf +add esp,4 +lea edi,(_sigfpe) +mov dword ptr (_sigsave),edi +lea edi,(_ovfl_buf) +push edi +call __setjmp +add esp,4 +cmp eax,0 +je L888 +jmp L890 +L888: +fld qword ptr (_Z) +fadd qword ptr (_Z) +fdiv qword ptr (_Z) +fstp qword ptr (_Q9) +fld qword ptr (_Q9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L891) +push edi +call _printf +add esp,12 +fld qword ptr (_Q9) +fsub qword ptr (_Two) +sub esp,8 +fstp qword ptr [esp] +call _fabs +add esp,8 +fstp qword ptr (-16)[ebp] +fld qword ptr (_Radix) +fmul qword ptr (_U2) +fcomp qword ptr (-16)[ebp] +fstsw ax +sahf +jbe L892 +lea edi,(L894) +push edi +call _printf +add esp,4 +lea edi,(L895) +push edi +call _printf +add esp,4 +jmp L893 +L892: +fld qword ptr (_One) +fcomp qword ptr (_Q9) +fstsw ax +sahf +ja L898 +fld qword ptr (_Two) +fcomp qword ptr (_Q9) +fstsw ax +sahf +jae L896 +L898: +L890: +mov dword ptr (_N),1 +mov edi,dword ptr (_ErrCnt+4) +lea edi,(1)[edi] +mov dword ptr (_ErrCnt+4),edi +lea edi,(L901) +push edi +call _printf +add esp,4 +jmp L897 +L896: +mov dword ptr (_N),1 +mov edi,dword ptr (_ErrCnt+8) +lea edi,(1)[edi] +mov dword ptr (_ErrCnt+8),edi +lea edi,(L904) +push edi +call _printf +add esp,4 +L897: +L893: +mov dword ptr (_sigsave),0 +fld qword ptr (_Z) +fmul qword ptr (_One) +fstp qword ptr (_V9) +fld qword ptr (_V9) +fstp qword ptr (_Random1) +fld qword ptr (_One) +fmul qword ptr (_Z) +fstp qword ptr (_V9) +fld qword ptr (_V9) +fstp qword ptr (_Random2) +fld qword ptr (_Z) +fdiv qword ptr (_One) +fstp qword ptr (_V9) +fld qword ptr (_Random1) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L905 +fld qword ptr (_Random2) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L905 +fld qword ptr (_V9) +fcomp qword ptr (_Z) +fstsw ax +sahf +jne L905 +cmp dword ptr (_N),0 +jle L906 +call _Pause +add esp,0 +jmp L906 +L905: +mov dword ptr (_N),1 +lea edi,(L909) +push edi +push 2 +call _BadCond +add esp,8 +fld qword ptr (_Z) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L910) +push edi +call _printf +add esp,12 +fld qword ptr (_Random1) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L911 +fld qword ptr (_Random1) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L913) +push edi +call _printf +add esp,12 +L911: +fld qword ptr (_Random2) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L914 +fld qword ptr (_Random1) +fcomp qword ptr (_Random2) +fstsw ax +sahf +je L914 +fld qword ptr (_Random2) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L916) +push edi +call _printf +add esp,12 +L914: +fld qword ptr (_V9) +fcomp qword ptr (_Z) +fstsw ax +sahf +je L917 +fld qword ptr (_V9) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L919) +push edi +call _printf +add esp,12 +L917: +fld qword ptr (_Random1) +fcomp qword ptr (_Random2) +fstsw ax +sahf +je L920 +mov edi,dword ptr (_ErrCnt+8) +lea edi,(1)[edi] +mov dword ptr (_ErrCnt+8),edi +lea edi,(L924) +push edi +push 2 +call _BadCond +add esp,8 +fld qword ptr (_Random2) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L925) +push edi +call _printf +add esp,12 +fld qword ptr (_Random1) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L926) +push edi +call _printf +add esp,12 +L920: +call _Pause +add esp,0 +L906: +L884: +mov eax,0 +L883: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _notify +_notify: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L928) +push edi +call _printf +add esp,8 +lea edi,(L929) +push edi +call _printf +add esp,4 +mov eax,0 +L927: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _msglist +_msglist: +push ebx +push esi +push edi +push ebp +mov ebp,esp +jmp L932 +L931: +mov edi,dword ptr (20)[ebp] +lea esi,(4)[edi] +mov dword ptr (20)[ebp],esi +mov edi,dword ptr [edi] +push edi +lea edi,(L934) +push edi +call _printf +add esp,8 +L932: +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr [edi] +cmp edi,0 +jne L931 +mov eax,0 +L930: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L936 label byte +dd L937 +dd L938 +dd L939 +dd L940 +dd L941 +dd L942 +dd L943 +dd L944 +dd L945 +dd 00H +public _Instructions +_DATA ends +_TEXT segment +_Instructions: +push ebx +push esi +push edi +push ebp +mov ebp,esp +lea edi,(L936) +push edi +call _msglist +add esp,4 +mov eax,0 +L935: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L947 label byte +dd L948 +dd L949 +dd L950 +dd L951 +dd L952 +dd L953 +dd L954 +dd L955 +dd L956 +dd L957 +dd L958 +dd L959 +dd L960 +dd L961 +dd 00H +public _Heading +_DATA ends +_TEXT segment +_Heading: +push ebx +push esi +push edi +push ebp +mov ebp,esp +lea edi,(L947) +push edi +call _msglist +add esp,4 +mov eax,0 +L946: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L963 label byte +dd L964 +dd L965 +dd L966 +dd L967 +dd L968 +dd L969 +dd L970 +dd L971 +dd L972 +dd L973 +dd L974 +dd L975 +dd L976 +dd L977 +dd L978 +dd L979 +dd L980 +dd L981 +dd L982 +dd 00H +public _Characteristics +_DATA ends +_TEXT segment +_Characteristics: +push ebx +push esi +push edi +push ebp +mov ebp,esp +lea edi,(L963) +push edi +call _msglist +add esp,4 +mov eax,0 +L962: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +align 4 +L984 label byte +dd L985 +dd L986 +dd L987 +dd L988 +dd L989 +dd L990 +dd L991 +dd L992 +dd L993 +dd L994 +dd L995 +dd L996 +dd L997 +dd L998 +dd L999 +dd L1000 +dd L1001 +dd 00H +public _History +_DATA ends +_TEXT segment +_History: +push ebx +push esi +push edi +push ebp +mov ebp,esp +lea edi,(L984) +push edi +call _msglist +add esp,4 +mov eax,0 +L983: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _pow +_pow: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,96 +mov dword ptr (-20)[ebp],0 +mov dword ptr (-24)[ebp],0 +fld qword ptr (L7) +fcomp qword ptr (28)[ebp] +fstsw ax +sahf +jne L1003 +fld qword ptr (L8) +jmp L1002 +L1003: +fld qword ptr (L1008) +fcomp qword ptr (28)[ebp] +fstsw ax +sahf +ja L1007 +fld qword ptr (L1009) +fcomp qword ptr (28)[ebp] +fstsw ax +sahf +jae L1005 +L1007: +fld qword ptr (L825) +fcomp qword ptr (20)[ebp] +fstsw ax +sahf +je L1005 +fld qword ptr (20)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-48)[ebp] +fld qword ptr (28)[ebp] +fmul qword ptr (-48)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _exp +add esp,8 +fstp qword ptr (-56)[ebp] +fld qword ptr (-56)[ebp] +jmp L1002 +L1005: +fld qword ptr (L7) +fcomp qword ptr (28)[ebp] +fstsw ax +sahf +jbe L1010 +fld qword ptr (28)[ebp] +fchs +fstp qword ptr (28)[ebp] +mov dword ptr (-24)[ebp],1 +L1010: +lea edi,(-32)[ebp] +push edi +fld qword ptr (28)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _modf +add esp,12 +fstp qword ptr (-64)[ebp] +fld qword ptr (-64)[ebp] +fstp qword ptr (28)[ebp] +fld qword ptr (L7) +fcomp qword ptr (28)[ebp] +fstsw ax +sahf +je L1012 +fld qword ptr (20)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _log +add esp,8 +fstp qword ptr (-72)[ebp] +fld qword ptr (28)[ebp] +fmul qword ptr (-72)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _exp +add esp,8 +fstp qword ptr (-80)[ebp] +fld qword ptr (-80)[ebp] +fstp qword ptr (-16)[ebp] +jmp L1013 +L1012: +fld qword ptr (L8) +fstp qword ptr (-16)[ebp] +L1013: +lea edi,(-8)[ebp] +push edi +fld qword ptr (20)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _frexp +add esp,12 +fstp qword ptr (-88)[ebp] +fld qword ptr (-88)[ebp] +fstp qword ptr (20)[ebp] +fld qword ptr (-32)[ebp] +call __ftol +mov dword ptr (-4)[ebp],eax +cmp eax,0 +je L1014 +L1016: +mov edi,dword ptr (-4)[ebp] +and edi,1 +cmp edi,0 +je L1020 +fld qword ptr (-16)[ebp] +fmul qword ptr (20)[ebp] +fstp qword ptr (-16)[ebp] +mov edi,dword ptr (-8)[ebp] +add dword ptr (-20)[ebp],edi +L1020: +mov edi,dword ptr (-4)[ebp] +sar edi,1 +mov dword ptr (-4)[ebp],edi +cmp edi,0 +jne L1022 +jmp L1018 +L1022: +fld qword ptr (20)[ebp] +fmul qword ptr (20)[ebp] +fstp qword ptr (20)[ebp] +sal dword ptr (-8)[ebp],1 +fld qword ptr (L1026) +fcomp qword ptr (20)[ebp] +fstsw ax +sahf +jbe L1016 +fld qword ptr (L1027) +fmul qword ptr (20)[ebp] +fstp qword ptr (20)[ebp] +dec dword ptr (-8)[ebp] +jmp L1016 +L1018: +L1014: +cmp dword ptr (-24)[ebp],0 +je L1028 +fld qword ptr (L8) +fdiv qword ptr (-16)[ebp] +fstp qword ptr (-16)[ebp] +neg dword ptr (-20)[ebp] +L1028: +mov edi,dword ptr (-20)[ebp] +push edi +fld qword ptr (-16)[ebp] +sub esp,8 +fstp qword ptr [esp] +call _ldexp +add esp,12 +fstp qword ptr (-96)[ebp] +fld qword ptr (-96)[ebp] +L1002: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _modf:near +_TEXT segment +_TEXT ends +extrn _ldexp:near +_TEXT segment +_TEXT ends +extrn _frexp:near +_TEXT segment +_TEXT ends +extrn _exp:near +_TEXT segment +_TEXT ends +extrn _abort:near +_TEXT segment +_TEXT ends +_DATA segment +public _UfNGrad +align 4 +_UfNGrad label byte +db 4 dup (0) +public _SqRWrng +align 4 +_SqRWrng label byte +db 4 dup (0) +public _IEEE +align 4 +_IEEE label byte +db 4 dup (0) +public _Anomaly +align 4 +_Anomaly label byte +db 4 dup (0) +public _Monot +align 4 +_Monot label byte +db 4 dup (0) +public _NotMonot +align 4 +_NotMonot label byte +db 4 dup (0) +public _Done +align 4 +_Done label byte +db 4 dup (0) +public _Break +align 4 +_Break label byte +db 4 dup (0) +public _RSqrt +align 4 +_RSqrt label byte +db 4 dup (0) +public _RAddSub +align 4 +_RAddSub label byte +db 4 dup (0) +public _RDiv +align 4 +_RDiv label byte +db 4 dup (0) +public _RMult +align 4 +_RMult label byte +db 4 dup (0) +public _GAddSub +align 4 +_GAddSub label byte +db 4 dup (0) +public _GDiv +align 4 +_GDiv label byte +db 4 dup (0) +public _GMult +align 4 +_GMult label byte +db 4 dup (0) +public _N1 +align 4 +_N1 label byte +db 4 dup (0) +public _N +align 4 +_N label byte +db 4 dup (0) +public _M +align 4 +_M label byte +db 4 dup (0) +public _PageNo +align 4 +_PageNo label byte +db 4 dup (0) +public _Milestone +align 4 +_Milestone label byte +db 4 dup (0) +public _fpecount +align 4 +_fpecount label byte +db 4 dup (0) +public _ErrCnt +align 4 +_ErrCnt label byte +db 16 dup (0) +public _Z9 +align 4 +_Z9 label byte +db 8 dup (0) +public _Z2 +align 4 +_Z2 label byte +db 8 dup (0) +public _Z1 +align 4 +_Z1 label byte +db 8 dup (0) +public _PseudoZero +align 4 +_PseudoZero label byte +db 8 dup (0) +public _Z +align 4 +_Z label byte +db 8 dup (0) +public _Random2 +align 4 +_Random2 label byte +db 8 dup (0) +public _Y2 +align 4 +_Y2 label byte +db 8 dup (0) +public _Y1 +align 4 +_Y1 label byte +db 8 dup (0) +public _Y +align 4 +_Y label byte +db 8 dup (0) +public _Random1 +align 4 +_Random1 label byte +db 8 dup (0) +public _X8 +align 4 +_X8 label byte +db 8 dup (0) +public _X2 +align 4 +_X2 label byte +db 8 dup (0) +public _X1 +align 4 +_X1 label byte +db 8 dup (0) +public _X +align 4 +_X label byte +db 8 dup (0) +public _W +align 4 +_W label byte +db 8 dup (0) +public _V9 +align 4 +_V9 label byte +db 8 dup (0) +public _V0 +align 4 +_V0 label byte +db 8 dup (0) +public _V +align 4 +_V label byte +db 8 dup (0) +public _U2 +align 4 +_U2 label byte +db 8 dup (0) +public _U1 +align 4 +_U1 label byte +db 8 dup (0) +public _UfThold +align 4 +_UfThold label byte +db 8 dup (0) +public _OneUlp +align 4 +_OneUlp label byte +db 8 dup (0) +public _S +align 4 +_S label byte +db 8 dup (0) +public _Underflow +align 4 +_Underflow label byte +db 8 dup (0) +public _T +align 4 +_T label byte +db 8 dup (0) +public _Random9 +align 4 +_Random9 label byte +db 8 dup (0) +public _R +align 4 +_R label byte +db 8 dup (0) +public _Q9 +align 4 +_Q9 label byte +db 8 dup (0) +public _Q +align 4 +_Q label byte +db 8 dup (0) +public _Precision +align 4 +_Precision label byte +db 8 dup (0) +public _MyZero +align 4 +_MyZero label byte +db 8 dup (0) +public _J +align 4 +_J label byte +db 8 dup (0) +public _StickyBit +align 4 +_StickyBit label byte +db 8 dup (0) +public _I +align 4 +_I label byte +db 4 dup (0) +public _HInvrse +align 4 +_HInvrse label byte +db 8 dup (0) +public _H +align 4 +_H label byte +db 8 dup (0) +public _F9 +align 4 +_F9 label byte +db 8 dup (0) +public _F6 +align 4 +_F6 label byte +db 8 dup (0) +public _Third +align 4 +_Third label byte +db 8 dup (0) +public _E9 +align 4 +_E9 label byte +db 8 dup (0) +public _MaxSqEr +align 4 +_MaxSqEr label byte +db 8 dup (0) +public _SqEr +align 4 +_SqEr label byte +db 8 dup (0) +public _MinSqEr +align 4 +_MinSqEr label byte +db 8 dup (0) +public _E3 +align 4 +_E3 label byte +db 8 dup (0) +public _Exp2 +align 4 +_Exp2 label byte +db 8 dup (0) +public _E1 +align 4 +_E1 label byte +db 8 dup (0) +public _E0 +align 4 +_E0 label byte +db 8 dup (0) +public _FourD +align 4 +_FourD label byte +db 8 dup (0) +public _D +align 4 +_D label byte +db 8 dup (0) +public _CInvrse +align 4 +_CInvrse label byte +db 8 dup (0) +public _C +align 4 +_C label byte +db 8 dup (0) +public _A1 +align 4 +_A1 label byte +db 8 dup (0) +public _AInvrse +align 4 +_AInvrse label byte +db 8 dup (0) +public _ch +align 1 +_ch label byte +db 8 dup (0) +public _Indx +align 4 +_Indx label byte +db 4 dup (0) +public _BMinusU2 +align 4 +_BMinusU2 label byte +db 8 dup (0) +public _RadixD2 +align 4 +_RadixD2 label byte +db 8 dup (0) +public _BInvrse +align 4 +_BInvrse label byte +db 8 dup (0) +public _Radix +align 4 +_Radix label byte +db 8 dup (0) +public _sigsave +align 4 +_sigsave label byte +db 4 dup (0) +public _ovfl_buf +align 4 +_ovfl_buf label byte +db 64 dup (0) +_DATA ends +extrn _sqrt:near +_DATA segment +_DATA ends +extrn _log:near +_DATA segment +_DATA ends +extrn _floor:near +_DATA segment +_DATA ends +extrn _fabs:near +_DATA segment +_DATA ends +extrn _longjmp:near +_DATA segment +_DATA ends +extrn __setjmp:near +_DATA segment +_DATA ends +extrn _signal:near +_DATA segment +_DATA ends +extrn _printf:near +_DATA segment +_DATA ends +extrn _fflush:near +_DATA segment +_DATA ends +extrn __iob:near +_DATA segment +_DATA ends +_TEXT segment +align 4 +L1027 label byte +dd 00H +dd 040000000H +align 4 +L1026 label byte +dd 00H +dd 03fe00000H +align 4 +L1009 label byte +dd 00H +dd 040913000H +align 4 +L1008 label byte +dd 00H +dd 0c0913000H +align 1 +L1001 label byte +db 115 +db 101 +db 101 +db 32 +db 115 +db 111 +db 117 +db 114 +db 99 +db 101 +db 32 +db 99 +db 111 +db 109 +db 109 +db 101 +db 110 +db 116 +db 115 +db 32 +db 102 +db 111 +db 114 +db 32 +db 109 +db 111 +db 114 +db 101 +db 32 +db 104 +db 105 +db 115 +db 116 +db 111 +db 114 +db 121 +db 46 +db 0 +align 1 +L1000 label byte +db 66 +db 65 +db 83 +db 73 +db 67 +db 32 +db 118 +db 101 +db 114 +db 115 +db 105 +db 111 +db 110 +db 32 +db 111 +db 102 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 40 +db 67 +db 41 +db 32 +db 49 +db 57 +db 56 +db 51 +db 32 +db 98 +db 121 +db 32 +db 80 +db 114 +db 111 +db 102 +db 46 +db 32 +db 87 +db 46 +db 32 +db 77 +db 46 +db 32 +db 75 +db 97 +db 104 +db 97 +db 110 +db 59 +db 0 +align 1 +L999 label byte +db 97 +db 115 +db 32 +db 117 +db 115 +db 101 +db 100 +db 32 +db 98 +db 121 +db 32 +db 99 +db 101 +db 114 +db 116 +db 97 +db 105 +db 110 +db 32 +db 101 +db 97 +db 114 +db 108 +db 121 +db 32 +db 87 +db 65 +db 78 +db 71 +db 32 +db 109 +db 97 +db 99 +db 104 +db 105 +db 110 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L998 label byte +db 102 +db 108 +db 111 +db 97 +db 116 +db 105 +db 110 +db 103 +db 45 +db 112 +db 111 +db 105 +db 110 +db 116 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 115 +db 44 +db 32 +db 98 +db 117 +db 116 +db 32 +db 97 +db 108 +db 115 +db 111 +db 32 +db 97 +db 108 +db 108 +db 111 +db 119 +db 115 +db 32 +db 108 +db 111 +db 103 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 105 +db 99 +db 32 +db 101 +db 110 +db 99 +db 111 +db 100 +db 105 +db 110 +db 103 +db 0 +align 1 +L997 label byte +db 10 +db 84 +db 104 +db 101 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 105 +db 115 +db 32 +db 98 +db 97 +db 115 +db 101 +db 100 +db 32 +db 117 +db 112 +db 111 +db 110 +db 32 +db 97 +db 32 +db 99 +db 111 +db 110 +db 118 +db 101 +db 110 +db 116 +db 105 +db 111 +db 110 +db 97 +db 108 +db 32 +db 114 +db 97 +db 100 +db 105 +db 120 +db 32 +db 114 +db 101 +db 112 +db 114 +db 101 +db 115 +db 101 +db 110 +db 116 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 102 +db 111 +db 114 +db 0 +align 1 +L996 label byte +db 111 +db 102 +db 32 +db 112 +db 97 +db 116 +db 104 +db 111 +db 108 +db 111 +db 103 +db 105 +db 101 +db 115 +db 44 +db 32 +db 97 +db 110 +db 100 +db 32 +db 116 +db 111 +db 32 +db 115 +db 97 +db 121 +db 32 +db 104 +db 111 +db 119 +db 32 +db 119 +db 101 +db 108 +db 108 +db 32 +db 116 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 105 +db 115 +db 32 +db 105 +db 109 +db 112 +db 108 +db 101 +db 109 +db 101 +db 110 +db 116 +db 101 +db 100 +db 46 +db 0 +align 1 +L995 label byte +db 111 +db 102 +db 32 +db 116 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 44 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 116 +db 114 +db 105 +db 101 +db 115 +db 32 +db 116 +db 111 +db 32 +db 99 +db 111 +db 112 +db 101 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 97 +db 32 +db 119 +db 105 +db 100 +db 101 +db 114 +db 32 +db 118 +db 97 +db 114 +db 105 +db 101 +db 116 +db 121 +db 0 +align 1 +L994 label byte +db 116 +db 104 +db 101 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 44 +db 32 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 97 +db 110 +db 100 +db 32 +db 114 +db 97 +db 110 +db 103 +db 101 +db 32 +db 40 +db 111 +db 118 +db 101 +db 114 +db 47 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 115 +db 41 +db 0 +align 1 +L993 label byte +db 87 +db 46 +db 32 +db 74 +db 46 +db 32 +db 67 +db 111 +db 100 +db 121 +db 32 +db 97 +db 110 +db 100 +db 32 +db 87 +db 46 +db 32 +db 87 +db 97 +db 105 +db 116 +db 101 +db 46 +db 32 +db 65 +db 108 +db 116 +db 104 +db 111 +db 117 +db 103 +db 104 +db 32 +db 98 +db 111 +db 116 +db 104 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 115 +db 32 +db 116 +db 114 +db 121 +db 32 +db 116 +db 111 +db 32 +db 100 +db 105 +db 115 +db 99 +db 111 +db 118 +db 101 +db 114 +db 0 +align 1 +L992 label byte +db 98 +db 111 +db 111 +db 107 +db 32 +db 32 +db 96 +db 83 +db 111 +db 102 +db 116 +db 119 +db 97 +db 114 +db 101 +db 32 +db 77 +db 97 +db 110 +db 117 +db 97 +db 108 +db 32 +db 102 +db 111 +db 114 +db 32 +db 116 +db 104 +db 101 +db 32 +db 69 +db 108 +db 101 +db 109 +db 101 +db 110 +db 116 +db 97 +db 114 +db 121 +db 32 +db 70 +db 117 +db 110 +db 99 +db 116 +db 105 +db 111 +db 110 +db 115 +db 39 +db 32 +db 40 +db 49 +db 57 +db 56 +db 48 +db 41 +db 32 +db 98 +db 121 +db 0 +align 1 +L991 label byte +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 99 +db 97 +db 108 +db 108 +db 101 +db 100 +db 32 +db 96 +db 77 +db 65 +db 67 +db 72 +db 65 +db 82 +db 39 +db 44 +db 32 +db 119 +db 104 +db 105 +db 99 +db 104 +db 32 +db 99 +db 97 +db 110 +db 32 +db 98 +db 101 +db 32 +db 102 +db 111 +db 117 +db 110 +db 100 +db 32 +db 97 +db 116 +db 32 +db 116 +db 104 +db 101 +db 32 +db 101 +db 110 +db 100 +db 32 +db 111 +db 102 +db 32 +db 116 +db 104 +db 101 +db 0 +align 1 +L990 label byte +db 84 +db 104 +db 101 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 116 +db 105 +db 99 +db 32 +db 99 +db 97 +db 112 +db 97 +db 98 +db 105 +db 108 +db 105 +db 116 +db 105 +db 101 +db 115 +db 32 +db 111 +db 102 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 103 +db 111 +db 32 +db 98 +db 101 +db 121 +db 111 +db 110 +db 100 +db 32 +db 97 +db 110 +db 32 +db 101 +db 97 +db 114 +db 108 +db 105 +db 101 +db 114 +db 0 +align 1 +L989 label byte +db 70 +db 97 +db 105 +db 108 +db 117 +db 114 +db 101 +db 115 +db 32 +db 109 +db 97 +db 121 +db 32 +db 99 +db 111 +db 110 +db 102 +db 111 +db 117 +db 110 +db 100 +db 32 +db 115 +db 117 +db 98 +db 115 +db 101 +db 113 +db 117 +db 101 +db 110 +db 116 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L988 label byte +db 32 +db 32 +db 32 +db 70 +db 65 +db 73 +db 76 +db 85 +db 82 +db 69 +db 115 +db 44 +db 32 +db 108 +db 105 +db 107 +db 101 +db 32 +db 50 +db 43 +db 50 +db 32 +db 61 +db 61 +db 32 +db 53 +db 32 +db 46 +db 0 +align 1 +L987 label byte +db 32 +db 32 +db 32 +db 83 +db 101 +db 114 +db 105 +db 111 +db 117 +db 115 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 115 +db 44 +db 32 +db 108 +db 105 +db 107 +db 101 +db 32 +db 108 +db 97 +db 99 +db 107 +db 32 +db 111 +db 102 +db 32 +db 97 +db 32 +db 103 +db 117 +db 97 +db 114 +db 100 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 44 +db 32 +db 97 +db 110 +db 100 +db 0 +align 1 +L986 label byte +db 32 +db 32 +db 32 +db 70 +db 76 +db 65 +db 87 +db 115 +db 44 +db 32 +db 108 +db 105 +db 107 +db 101 +db 32 +db 108 +db 97 +db 99 +db 107 +db 32 +db 111 +db 102 +db 32 +db 97 +db 32 +db 115 +db 116 +db 105 +db 99 +db 107 +db 121 +db 32 +db 98 +db 105 +db 116 +db 44 +db 0 +align 1 +L985 label byte +db 84 +db 104 +db 101 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 97 +db 116 +db 116 +db 101 +db 109 +db 112 +db 116 +db 115 +db 32 +db 116 +db 111 +db 32 +db 100 +db 105 +db 115 +db 99 +db 114 +db 105 +db 109 +db 105 +db 110 +db 97 +db 116 +db 101 +db 32 +db 97 +db 109 +db 111 +db 110 +db 103 +db 0 +align 1 +L982 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 68 +db 101 +db 99 +db 105 +db 109 +db 97 +db 108 +db 45 +db 66 +db 105 +db 110 +db 97 +db 114 +db 121 +db 32 +db 99 +db 111 +db 110 +db 118 +db 101 +db 114 +db 115 +db 105 +db 111 +db 110 +db 32 +db 105 +db 115 +db 32 +db 78 +db 79 +db 84 +db 32 +db 89 +db 69 +db 84 +db 32 +db 116 +db 101 +db 115 +db 116 +db 101 +db 100 +db 32 +db 102 +db 111 +db 114 +db 32 +db 97 +db 99 +db 99 +db 117 +db 114 +db 97 +db 99 +db 121 +db 46 +db 0 +align 1 +L981 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 69 +db 120 +db 116 +db 114 +db 97 +db 45 +db 112 +db 114 +db 101 +db 99 +db 105 +db 115 +db 101 +db 32 +db 115 +db 117 +db 98 +db 101 +db 120 +db 112 +db 114 +db 101 +db 115 +db 115 +db 105 +db 111 +db 110 +db 115 +db 32 +db 97 +db 114 +db 101 +db 32 +db 114 +db 101 +db 118 +db 101 +db 97 +db 108 +db 101 +db 100 +db 32 +db 98 +db 117 +db 116 +db 32 +db 78 +db 79 +db 84 +db 32 +db 89 +db 69 +db 84 +db 32 +db 116 +db 101 +db 115 +db 116 +db 101 +db 100 +db 46 +db 0 +align 1 +L980 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 83 +db 113 +db 114 +db 116 +db 32 +db 105 +db 115 +db 32 +db 116 +db 101 +db 115 +db 116 +db 101 +db 100 +db 46 +db 32 +db 32 +db 89 +db 94 +db 88 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 116 +db 101 +db 115 +db 116 +db 101 +db 100 +db 46 +db 0 +align 1 +L979 label byte +db 9 +db 97 +db 110 +db 100 +db 32 +db 102 +db 111 +db 114 +db 32 +db 99 +db 111 +db 110 +db 116 +db 97 +db 109 +db 105 +db 110 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 112 +db 115 +db 101 +db 117 +db 100 +db 111 +db 45 +db 122 +db 101 +db 114 +db 111 +db 115 +db 46 +db 0 +align 1 +L978 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 105 +db 111 +db 110 +db 115 +db 32 +db 97 +db 114 +db 101 +db 32 +db 99 +db 104 +db 101 +db 99 +db 107 +db 101 +db 100 +db 32 +db 102 +db 111 +db 114 +db 32 +db 99 +db 111 +db 110 +db 115 +db 105 +db 115 +db 116 +db 101 +db 110 +db 99 +db 121 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 115 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 105 +db 111 +db 110 +db 0 +align 1 +L977 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 86 +db 48 +db 32 +db 32 +db 116 +db 101 +db 108 +db 108 +db 115 +db 44 +db 32 +db 114 +db 111 +db 117 +db 103 +db 104 +db 108 +db 121 +db 44 +db 32 +db 119 +db 104 +db 101 +db 116 +db 104 +db 101 +db 114 +db 32 +db 32 +db 73 +db 110 +db 102 +db 105 +db 110 +db 105 +db 116 +db 121 +db 32 +db 32 +db 105 +db 115 +db 32 +db 114 +db 101 +db 112 +db 114 +db 101 +db 115 +db 101 +db 110 +db 116 +db 101 +db 100 +db 46 +db 0 +align 1 +L976 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 86 +db 32 +db 61 +db 32 +db 97 +db 110 +db 32 +db 111 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 44 +db 32 +db 114 +db 111 +db 117 +db 103 +db 104 +db 108 +db 121 +db 46 +db 0 +align 1 +L975 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 69 +db 48 +db 32 +db 97 +db 110 +db 100 +db 32 +db 80 +db 115 +db 101 +db 117 +db 100 +db 111 +db 90 +db 101 +db 114 +db 111 +db 32 +db 116 +db 101 +db 108 +db 108 +db 32 +db 119 +db 104 +db 101 +db 116 +db 104 +db 101 +db 114 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 105 +db 115 +db 32 +db 97 +db 98 +db 114 +db 117 +db 112 +db 116 +db 44 +db 32 +db 103 +db 114 +db 97 +db 100 +db 117 +db 97 +db 108 +db 44 +db 32 +db 111 +db 114 +db 32 +db 102 +db 117 +db 122 +db 122 +db 121 +db 46 +db 0 +align 1 +L974 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 84 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 61 +db 32 +db 97 +db 110 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 46 +db 0 +align 1 +L973 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 87 +db 104 +db 101 +db 116 +db 104 +db 101 +db 114 +db 32 +db 97 +db 32 +db 83 +db 116 +db 105 +db 99 +db 107 +db 121 +db 32 +db 66 +db 105 +db 116 +db 32 +db 117 +db 115 +db 101 +db 100 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 102 +db 111 +db 114 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 105 +db 110 +db 103 +db 46 +db 0 +align 1 +L972 label byte +db 9 +db 102 +db 111 +db 114 +db 32 +db 77 +db 117 +db 108 +db 116 +db 46 +db 44 +db 32 +db 68 +db 105 +db 118 +db 46 +db 44 +db 32 +db 65 +db 100 +db 100 +db 47 +db 83 +db 117 +db 98 +db 116 +db 46 +db 32 +db 97 +db 110 +db 100 +db 32 +db 83 +db 113 +db 114 +db 116 +db 46 +db 0 +align 1 +L971 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 87 +db 104 +db 101 +db 116 +db 104 +db 101 +db 114 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 105 +db 115 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 44 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 101 +db 100 +db 44 +db 32 +db 111 +db 114 +db 32 +db 115 +db 111 +db 109 +db 101 +db 116 +db 104 +db 105 +db 110 +db 103 +db 32 +db 101 +db 108 +db 115 +db 101 +db 0 +align 1 +L970 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 65 +db 100 +db 101 +db 113 +db 117 +db 97 +db 99 +db 121 +db 32 +db 111 +db 102 +db 32 +db 103 +db 117 +db 97 +db 114 +db 100 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 102 +db 111 +db 114 +db 32 +db 77 +db 117 +db 108 +db 116 +db 46 +db 44 +db 32 +db 68 +db 105 +db 118 +db 46 +db 32 +db 97 +db 110 +db 100 +db 32 +db 83 +db 117 +db 98 +db 116 +db 46 +db 0 +align 1 +L969 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 85 +db 49 +db 32 +db 61 +db 32 +db 49 +db 47 +db 82 +db 97 +db 100 +db 105 +db 120 +db 94 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 61 +db 32 +db 79 +db 110 +db 101 +db 32 +db 85 +db 108 +db 112 +db 32 +db 111 +db 102 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 115 +db 32 +db 97 +db 32 +db 108 +db 105 +db 116 +db 116 +db 108 +db 101 +db 32 +db 108 +db 101 +db 115 +db 115 +db 32 +db 116 +db 104 +db 97 +db 110 +db 32 +db 49 +db 46 +db 48 +db 32 +db 46 +db 0 +align 1 +L968 label byte +db 9 +db 40 +db 79 +db 110 +db 101 +db 85 +db 108 +db 112 +db 110 +db 105 +db 116 +db 32 +db 105 +db 110 +db 32 +db 116 +db 104 +db 101 +db 32 +db 76 +db 97 +db 115 +db 116 +db 32 +db 80 +db 108 +db 97 +db 99 +db 101 +db 41 +db 32 +db 111 +db 102 +db 32 +db 49 +db 46 +db 48 +db 48 +db 48 +db 120 +db 120 +db 120 +db 32 +db 46 +db 0 +align 1 +L967 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 85 +db 50 +db 32 +db 61 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 47 +db 82 +db 97 +db 100 +db 105 +db 120 +db 94 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 61 +db 32 +db 79 +db 110 +db 101 +db 32 +db 85 +db 108 +db 112 +db 0 +align 1 +L966 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 61 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 32 +db 111 +db 102 +db 32 +db 115 +db 105 +db 103 +db 110 +db 105 +db 102 +db 105 +db 99 +db 97 +db 110 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 99 +db 97 +db 114 +db 114 +db 105 +db 101 +db 100 +db 46 +db 0 +align 1 +L965 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 61 +db 32 +db 49 +db 44 +db 32 +db 50 +db 44 +db 32 +db 52 +db 44 +db 32 +db 56 +db 44 +db 32 +db 49 +db 48 +db 44 +db 32 +db 49 +db 54 +db 44 +db 32 +db 49 +db 48 +db 48 +db 44 +db 32 +db 50 +db 53 +db 54 +db 32 +db 46 +db 46 +db 46 +db 0 +align 1 +L964 label byte +db 82 +db 117 +db 110 +db 110 +db 105 +db 110 +db 103 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 114 +db 101 +db 118 +db 101 +db 97 +db 108 +db 32 +db 116 +db 104 +db 101 +db 115 +db 101 +db 32 +db 99 +db 104 +db 97 +db 114 +db 97 +db 99 +db 116 +db 101 +db 114 +db 105 +db 115 +db 116 +db 105 +db 99 +db 115 +db 58 +db 0 +align 1 +L961 label byte +db 9 +db 79 +db 116 +db 104 +db 101 +db 114 +db 32 +db 114 +db 101 +db 108 +db 101 +db 118 +db 97 +db 110 +db 116 +db 32 +db 99 +db 111 +db 109 +db 112 +db 105 +db 108 +db 101 +db 114 +db 32 +db 111 +db 112 +db 116 +db 105 +db 111 +db 110 +db 115 +db 58 +db 0 +align 1 +L960 label byte +db 9 +db 79 +db 112 +db 116 +db 105 +db 109 +db 105 +db 122 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 108 +db 101 +db 118 +db 101 +db 108 +db 58 +db 10 +db 0 +align 1 +L959 label byte +db 9 +db 67 +db 111 +db 109 +db 112 +db 105 +db 108 +db 101 +db 114 +db 58 +db 10 +db 0 +align 1 +L958 label byte +db 9 +db 67 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 114 +db 58 +db 10 +db 0 +align 1 +L957 label byte +db 9 +db 86 +db 101 +db 114 +db 115 +db 105 +db 111 +db 110 +db 58 +db 9 +db 49 +db 48 +db 32 +db 70 +db 101 +db 98 +db 114 +db 117 +db 97 +db 114 +db 121 +db 32 +db 49 +db 57 +db 56 +db 57 +db 59 +db 0 +align 1 +L956 label byte +db 9 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 58 +db 9 +db 100 +db 111 +db 117 +db 98 +db 108 +db 101 +db 59 +db 0 +align 1 +L955 label byte +db 73 +db 110 +db 32 +db 100 +db 111 +db 105 +db 110 +db 103 +db 32 +db 115 +db 111 +db 44 +db 32 +db 112 +db 108 +db 101 +db 97 +db 115 +db 101 +db 32 +db 105 +db 110 +db 99 +db 108 +db 117 +db 100 +db 101 +db 32 +db 116 +db 104 +db 101 +db 32 +db 102 +db 111 +db 108 +db 108 +db 111 +db 119 +db 105 +db 110 +db 103 +db 32 +db 105 +db 110 +db 102 +db 111 +db 114 +db 109 +db 97 +db 116 +db 105 +db 111 +db 110 +db 58 +db 0 +align 1 +L954 label byte +db 9 +db 83 +db 97 +db 110 +db 32 +db 70 +db 114 +db 97 +db 110 +db 99 +db 105 +db 115 +db 99 +db 111 +db 44 +db 32 +db 67 +db 65 +db 32 +db 57 +db 52 +db 49 +db 52 +db 51 +db 45 +db 48 +db 55 +db 48 +db 52 +db 44 +db 32 +db 85 +db 83 +db 65 +db 10 +db 0 +align 1 +L953 label byte +db 9 +db 85 +db 110 +db 105 +db 118 +db 101 +db 114 +db 115 +db 105 +db 116 +db 121 +db 32 +db 111 +db 102 +db 32 +db 67 +db 97 +db 108 +db 105 +db 102 +db 111 +db 114 +db 110 +db 105 +db 97 +db 0 +align 1 +L952 label byte +db 9 +db 67 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 114 +db 32 +db 67 +db 101 +db 110 +db 116 +db 101 +db 114 +db 32 +db 85 +db 45 +db 55 +db 54 +db 0 +align 1 +L951 label byte +db 9 +db 82 +db 105 +db 99 +db 104 +db 97 +db 114 +db 100 +db 32 +db 75 +db 97 +db 114 +db 112 +db 105 +db 110 +db 115 +db 107 +db 105 +db 0 +align 1 +L950 label byte +db 80 +db 108 +db 101 +db 97 +db 115 +db 101 +db 32 +db 115 +db 101 +db 110 +db 100 +db 32 +db 115 +db 117 +db 103 +db 103 +db 101 +db 115 +db 116 +db 105 +db 111 +db 110 +db 115 +db 32 +db 97 +db 110 +db 100 +db 32 +db 105 +db 110 +db 116 +db 101 +db 114 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 114 +db 101 +db 115 +db 117 +db 108 +db 116 +db 115 +db 32 +db 116 +db 111 +db 0 +align 1 +L949 label byte +db 99 +db 111 +db 112 +db 101 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 117 +db 110 +db 97 +db 110 +db 116 +db 105 +db 99 +db 105 +db 112 +db 97 +db 116 +db 101 +db 100 +db 32 +db 97 +db 110 +db 100 +db 32 +db 110 +db 101 +db 119 +db 108 +db 121 +db 32 +db 117 +db 110 +db 99 +db 111 +db 118 +db 101 +db 114 +db 101 +db 100 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 112 +db 97 +db 116 +db 104 +db 111 +db 108 +db 111 +db 103 +db 105 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L948 label byte +db 85 +db 115 +db 101 +db 114 +db 115 +db 32 +db 97 +db 114 +db 101 +db 32 +db 105 +db 110 +db 118 +db 105 +db 116 +db 101 +db 100 +db 32 +db 116 +db 111 +db 32 +db 104 +db 101 +db 108 +db 112 +db 32 +db 100 +db 101 +db 98 +db 117 +db 103 +db 32 +db 97 +db 110 +db 100 +db 32 +db 97 +db 117 +db 103 +db 109 +db 101 +db 110 +db 116 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 115 +db 111 +db 32 +db 105 +db 116 +db 32 +db 119 +db 105 +db 108 +db 108 +db 0 +align 1 +L945 label byte +db 65 +db 110 +db 115 +db 119 +db 101 +db 114 +db 32 +db 113 +db 117 +db 101 +db 115 +db 116 +db 105 +db 111 +db 110 +db 115 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 89 +db 44 +db 32 +db 121 +db 44 +db 32 +db 78 +db 32 +db 111 +db 114 +db 32 +db 110 +db 32 +db 40 +db 117 +db 110 +db 108 +db 101 +db 115 +db 115 +db 32 +db 111 +db 116 +db 104 +db 101 +db 114 +db 119 +db 105 +db 115 +db 101 +db 32 +db 105 +db 110 +db 100 +db 105 +db 99 +db 97 +db 116 +db 101 +db 100 +db 41 +db 46 +db 10 +db 0 +align 1 +L944 label byte +db 97 +db 109 +db 101 +db 110 +db 100 +db 32 +db 105 +db 116 +db 32 +db 116 +db 111 +db 32 +db 109 +db 97 +db 107 +db 101 +db 32 +db 102 +db 117 +db 114 +db 116 +db 104 +db 101 +db 114 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 101 +db 115 +db 115 +db 46 +db 10 +db 0 +align 1 +L943 label byte +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 97 +db 110 +db 121 +db 119 +db 97 +db 121 +db 32 +db 116 +db 111 +db 32 +db 115 +db 101 +db 101 +db 32 +db 104 +db 111 +db 119 +db 32 +db 109 +db 97 +db 110 +db 121 +db 32 +db 109 +db 105 +db 108 +db 101 +db 115 +db 116 +db 111 +db 110 +db 101 +db 115 +db 32 +db 105 +db 116 +db 32 +db 112 +db 97 +db 115 +db 115 +db 101 +db 115 +db 44 +db 32 +db 97 +db 110 +db 100 +db 32 +db 116 +db 104 +db 101 +db 110 +db 0 +align 1 +L942 label byte +db 119 +db 97 +db 114 +db 110 +db 105 +db 110 +db 103 +db 46 +db 32 +db 32 +db 73 +db 102 +db 32 +db 112 +db 101 +db 114 +db 115 +db 117 +db 97 +db 115 +db 105 +db 111 +db 110 +db 32 +db 97 +db 118 +db 97 +db 105 +db 108 +db 115 +db 32 +db 110 +db 97 +db 117 +db 103 +db 104 +db 116 +db 44 +db 32 +db 100 +db 111 +db 110 +db 39 +db 116 +db 32 +db 100 +db 101 +db 115 +db 112 +db 97 +db 105 +db 114 +db 32 +db 98 +db 117 +db 116 +db 32 +db 114 +db 117 +db 110 +db 32 +db 116 +db 104 +db 105 +db 115 +db 0 +align 1 +L941 label byte +db 116 +db 111 +db 32 +db 112 +db 101 +db 114 +db 115 +db 101 +db 118 +db 101 +db 114 +db 101 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 97 +db 32 +db 115 +db 117 +db 114 +db 114 +db 111 +db 103 +db 97 +db 116 +db 101 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 97 +db 102 +db 116 +db 101 +db 114 +db 44 +db 32 +db 112 +db 101 +db 114 +db 104 +db 97 +db 112 +db 115 +db 44 +db 32 +db 100 +db 105 +db 115 +db 112 +db 108 +db 97 +db 121 +db 105 +db 110 +db 103 +db 32 +db 115 +db 111 +db 109 +db 101 +db 0 +align 1 +L940 label byte +db 101 +db 114 +db 114 +db 111 +db 114 +db 32 +db 108 +db 105 +db 107 +db 101 +db 32 +db 79 +db 118 +db 101 +db 114 +db 47 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 111 +db 114 +db 32 +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 98 +db 121 +db 32 +db 90 +db 101 +db 114 +db 111 +db 32 +db 111 +db 99 +db 99 +db 117 +db 114 +db 115 +db 44 +db 32 +db 98 +db 117 +db 116 +db 32 +db 114 +db 97 +db 116 +db 104 +db 101 +db 114 +db 0 +align 1 +L939 label byte +db 116 +db 114 +db 121 +db 32 +db 116 +db 111 +db 32 +db 112 +db 101 +db 114 +db 115 +db 117 +db 97 +db 100 +db 101 +db 32 +db 116 +db 104 +db 101 +db 32 +db 99 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 114 +db 32 +db 78 +db 79 +db 84 +db 32 +db 116 +db 111 +db 32 +db 116 +db 101 +db 114 +db 109 +db 105 +db 110 +db 97 +db 116 +db 101 +db 32 +db 101 +db 120 +db 101 +db 99 +db 117 +db 116 +db 105 +db 111 +db 110 +db 32 +db 119 +db 104 +db 101 +db 110 +db 32 +db 97 +db 110 +db 0 +align 1 +L938 label byte +db 32 +db 32 +db 32 +db 32 +db 96 +db 69 +db 78 +db 68 +db 32 +db 79 +db 70 +db 32 +db 84 +db 69 +db 83 +db 84 +db 39 +db 44 +db 10 +db 0 +align 1 +L937 label byte +db 76 +db 101 +db 115 +db 116 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 115 +db 116 +db 111 +db 112 +db 32 +db 112 +db 114 +db 101 +db 109 +db 97 +db 116 +db 117 +db 114 +db 101 +db 108 +db 121 +db 44 +db 32 +db 105 +db 46 +db 101 +db 46 +db 32 +db 98 +db 101 +db 102 +db 111 +db 114 +db 101 +db 32 +db 100 +db 105 +db 115 +db 112 +db 108 +db 97 +db 121 +db 105 +db 110 +db 103 +db 10 +db 0 +align 1 +L934 label byte +db 37 +db 115 +db 10 +db 0 +align 1 +L929 label byte +db 32 +db 32 +db 32 +db 80 +db 76 +db 69 +db 65 +db 83 +db 69 +db 32 +db 78 +db 79 +db 84 +db 73 +db 70 +db 89 +db 32 +db 75 +db 65 +db 82 +db 80 +db 73 +db 78 +db 75 +db 83 +db 73 +db 33 +db 10 +db 0 +align 1 +L928 label byte +db 37 +db 115 +db 32 +db 116 +db 101 +db 115 +db 116 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 105 +db 110 +db 99 +db 111 +db 110 +db 115 +db 105 +db 115 +db 116 +db 101 +db 110 +db 116 +db 46 +db 46 +db 46 +db 10 +db 0 +align 1 +L926 label byte +db 9 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 115 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 90 +db 32 +db 42 +db 32 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L925 label byte +db 9 +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 115 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 49 +db 32 +db 42 +db 32 +db 90 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L924 label byte +db 77 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 100 +db 111 +db 101 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 99 +db 111 +db 109 +db 109 +db 117 +db 116 +db 101 +db 33 +db 10 +db 0 +align 1 +L919 label byte +db 90 +db 32 +db 47 +db 32 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L916 label byte +db 49 +db 32 +db 42 +db 32 +db 90 +db 32 +db 61 +db 61 +db 32 +db 37 +db 103 +db 10 +db 0 +align 1 +L913 label byte +db 90 +db 32 +db 42 +db 32 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 0 +align 1 +L910 label byte +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 9 +db 99 +db 111 +db 109 +db 112 +db 97 +db 114 +db 101 +db 115 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 101 +db 110 +db 116 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 32 +db 0 +align 1 +L909 label byte +db 87 +db 104 +db 97 +db 116 +db 32 +db 112 +db 114 +db 105 +db 110 +db 116 +db 115 +db 32 +db 97 +db 115 +db 32 +db 90 +db 32 +db 61 +db 32 +db 0 +align 1 +L904 label byte +db 84 +db 104 +db 105 +db 115 +db 32 +db 105 +db 115 +db 32 +db 97 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 33 +db 10 +db 0 +align 1 +L901 label byte +db 84 +db 104 +db 105 +db 115 +db 32 +db 105 +db 115 +db 32 +db 97 +db 32 +db 86 +db 69 +db 82 +db 89 +db 32 +db 83 +db 69 +db 82 +db 73 +db 79 +db 85 +db 83 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 33 +db 10 +db 0 +align 1 +L895 label byte +db 32 +db 104 +db 97 +db 115 +db 32 +db 78 +db 79 +db 84 +db 32 +db 106 +db 117 +db 115 +db 116 +db 32 +db 98 +db 101 +db 101 +db 110 +db 32 +db 115 +db 105 +db 103 +db 110 +db 97 +db 108 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L894 label byte +db 84 +db 104 +db 105 +db 115 +db 32 +db 105 +db 115 +db 32 +db 79 +db 46 +db 75 +db 46 +db 44 +db 32 +db 112 +db 114 +db 111 +db 118 +db 105 +db 100 +db 101 +db 100 +db 32 +db 79 +db 118 +db 101 +db 114 +db 47 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 0 +align 1 +L891 label byte +db 87 +db 104 +db 97 +db 116 +db 32 +db 116 +db 104 +db 101 +db 32 +db 109 +db 97 +db 99 +db 104 +db 105 +db 110 +db 101 +db 32 +db 103 +db 101 +db 116 +db 115 +db 32 +db 102 +db 111 +db 114 +db 32 +db 40 +db 90 +db 32 +db 43 +db 32 +db 90 +db 41 +db 32 +db 47 +db 32 +db 90 +db 32 +db 105 +db 115 +db 32 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L887 label byte +db 40 +db 90 +db 32 +db 43 +db 32 +db 90 +db 41 +db 32 +db 47 +db 32 +db 90 +db 32 +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 98 +db 101 +db 32 +db 115 +db 97 +db 102 +db 101 +db 46 +db 10 +db 0 +align 1 +L886 label byte +db 83 +db 105 +db 110 +db 99 +db 101 +db 32 +db 99 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 100 +db 101 +db 110 +db 105 +db 101 +db 115 +db 32 +db 90 +db 32 +db 61 +db 32 +db 48 +db 44 +db 32 +db 101 +db 118 +db 97 +db 108 +db 117 +db 97 +db 116 +db 105 +db 110 +db 103 +db 32 +db 0 +align 1 +L882 label byte +db 83 +db 105 +db 109 +db 105 +db 108 +db 97 +db 114 +db 32 +db 100 +db 105 +db 115 +db 99 +db 114 +db 101 +db 112 +db 97 +db 110 +db 99 +db 105 +db 101 +db 115 +db 32 +db 104 +db 97 +db 118 +db 101 +db 32 +db 111 +db 99 +db 99 +db 117 +db 114 +db 114 +db 101 +db 100 +db 32 +db 37 +db 100 +db 32 +db 116 +db 105 +db 109 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L872 label byte +db 9 +db 9 +db 116 +db 104 +db 101 +db 121 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 32 +db 98 +db 121 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L871 label byte +db 9 +db 119 +db 104 +db 105 +db 99 +db 104 +db 32 +db 99 +db 111 +db 109 +db 112 +db 97 +db 114 +db 101 +db 100 +db 32 +db 117 +db 110 +db 101 +db 113 +db 117 +db 97 +db 108 +db 32 +db 116 +db 111 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 59 +db 10 +db 0 +align 1 +L870 label byte +db 9 +db 121 +db 105 +db 101 +db 108 +db 100 +db 101 +db 100 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 59 +db 10 +db 0 +align 1 +L869 label byte +db 9 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 32 +db 94 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 10 +db 0 +align 1 +L868 label byte +db 99 +db 111 +db 109 +db 112 +db 117 +db 116 +db 105 +db 110 +db 103 +db 10 +db 0 +align 1 +L867 label byte +db 87 +db 65 +db 82 +db 78 +db 73 +db 78 +db 71 +db 58 +db 32 +db 32 +db 99 +db 111 +db 109 +db 112 +db 117 +db 116 +db 105 +db 110 +db 103 +db 10 +db 0 +align 1 +L849 label byte +db 9 +db 105 +db 110 +db 115 +db 116 +db 101 +db 97 +db 100 +db 32 +db 111 +db 102 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 48 +db 32 +db 46 +db 10 +db 0 +align 1 +L848 label byte +db 115 +db 113 +db 114 +db 116 +db 40 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 32 +db 45 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 4 +L840 label byte +dd 088e368f1H +dd 03ed4f8b5H +align 1 +L838 label byte +db 37 +db 115 +db 58 +db 32 +db 32 +db 37 +db 115 +db 0 +align 1 +L837 label byte +db 70 +db 76 +db 65 +db 87 +db 0 +align 1 +L836 label byte +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 0 +align 1 +L835 label byte +db 83 +db 69 +db 82 +db 73 +db 79 +db 85 +db 83 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 0 +align 1 +L834 label byte +db 70 +db 65 +db 73 +db 76 +db 85 +db 82 +db 69 +db 0 +align 1 +L828 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 80 +db 97 +db 103 +db 101 +db 58 +db 32 +db 37 +db 100 +db 10 +db 10 +db 0 +align 1 +L827 label byte +db 10 +db 68 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 105 +db 115 +db 32 +db 114 +db 101 +db 115 +db 117 +db 109 +db 101 +db 115 +db 32 +db 97 +db 102 +db 116 +db 101 +db 114 +db 32 +db 109 +db 105 +db 108 +db 101 +db 115 +db 116 +db 111 +db 110 +db 101 +db 32 +db 78 +db 117 +db 109 +db 98 +db 101 +db 114 +db 32 +db 37 +db 100 +db 0 +align 4 +L825 label byte +dd 00H +dd 0bff00000H +align 1 +L820 label byte +db 69 +db 78 +db 68 +db 32 +db 79 +db 70 +db 32 +db 84 +db 69 +db 83 +db 84 +db 46 +db 10 +db 0 +align 1 +L819 label byte +db 10 +db 65 +db 32 +db 116 +db 111 +db 116 +db 97 +db 108 +db 32 +db 111 +db 102 +db 32 +db 37 +db 100 +db 32 +db 102 +db 108 +db 111 +db 97 +db 116 +db 105 +db 110 +db 103 +db 32 +db 112 +db 111 +db 105 +db 110 +db 116 +db 32 +db 101 +db 120 +db 99 +db 101 +db 112 +db 116 +db 105 +db 111 +db 110 +db 115 +db 32 +db 119 +db 101 +db 114 +db 101 +db 32 +db 114 +db 101 +db 103 +db 105 +db 115 +db 116 +db 101 +db 114 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L816 label byte +db 84 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 100 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 69 +db 120 +db 99 +db 101 +db 108 +db 108 +db 101 +db 110 +db 116 +db 33 +db 10 +db 0 +align 1 +L815 label byte +db 32 +db 100 +db 117 +db 114 +db 105 +db 110 +db 103 +db 32 +db 71 +db 114 +db 97 +db 100 +db 117 +db 97 +db 108 +db 32 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 46 +db 10 +db 0 +align 1 +L814 label byte +db 44 +db 10 +db 101 +db 120 +db 99 +db 101 +db 112 +db 116 +db 32 +db 102 +db 111 +db 114 +db 32 +db 112 +db 111 +db 115 +db 115 +db 105 +db 98 +db 108 +db 121 +db 32 +db 68 +db 111 +db 117 +db 98 +db 108 +db 101 +db 32 +db 82 +db 111 +db 117 +db 110 +db 100 +db 105 +db 110 +db 103 +db 0 +align 1 +L813 label byte +db 46 +db 10 +db 0 +align 1 +L810 label byte +db 56 +db 53 +db 52 +db 0 +align 1 +L809 label byte +db 55 +db 53 +db 52 +db 0 +align 1 +L806 label byte +db 116 +db 104 +db 101 +db 32 +db 112 +db 114 +db 111 +db 112 +db 111 +db 115 +db 101 +db 100 +db 32 +db 73 +db 69 +db 69 +db 69 +db 32 +db 115 +db 116 +db 97 +db 110 +db 100 +db 97 +db 114 +db 100 +db 32 +db 80 +db 0 +align 1 +L805 label byte +db 82 +db 111 +db 117 +db 110 +db 100 +db 105 +db 110 +db 103 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 99 +db 111 +db 110 +db 102 +db 111 +db 114 +db 109 +db 32 +db 116 +db 111 +db 32 +db 0 +align 1 +L802 label byte +db 84 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 100 +db 32 +db 115 +db 101 +db 101 +db 109 +db 115 +db 32 +db 83 +db 97 +db 116 +db 105 +db 115 +db 102 +db 97 +db 99 +db 116 +db 111 +db 114 +db 121 +db 46 +db 10 +db 0 +align 1 +L796 label byte +db 78 +db 111 +db 32 +db 102 +db 97 +db 105 +db 108 +db 117 +db 114 +db 101 +db 115 +db 44 +db 32 +db 100 +db 101 +db 102 +db 101 +db 99 +db 116 +db 115 +db 32 +db 110 +db 111 +db 114 +db 32 +db 102 +db 108 +db 97 +db 119 +db 115 +db 32 +db 104 +db 97 +db 118 +db 101 +db 32 +db 98 +db 101 +db 101 +db 110 +db 32 +db 100 +db 105 +db 115 +db 99 +db 111 +db 118 +db 101 +db 114 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L795 label byte +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 39 +db 115 +db 32 +db 115 +db 117 +db 98 +db 115 +db 101 +db 113 +db 117 +db 101 +db 110 +db 116 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L794 label byte +db 80 +db 111 +db 116 +db 101 +db 110 +db 116 +db 105 +db 97 +db 108 +db 108 +db 121 +db 32 +db 102 +db 97 +db 116 +db 97 +db 108 +db 32 +db 70 +db 65 +db 73 +db 76 +db 85 +db 82 +db 69 +db 32 +db 109 +db 97 +db 121 +db 32 +db 104 +db 97 +db 118 +db 101 +db 32 +db 115 +db 112 +db 111 +db 105 +db 108 +db 101 +db 100 +db 32 +db 116 +db 104 +db 105 +db 115 +db 0 +align 1 +L791 label byte +db 117 +db 110 +db 97 +db 99 +db 99 +db 101 +db 112 +db 116 +db 97 +db 98 +db 108 +db 101 +db 32 +db 83 +db 101 +db 114 +db 105 +db 111 +db 117 +db 115 +db 32 +db 68 +db 101 +db 102 +db 101 +db 99 +db 116 +db 115 +db 46 +db 10 +db 0 +align 1 +L790 label byte +db 84 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 100 +db 32 +db 104 +db 97 +db 115 +db 32 +db 0 +align 1 +L786 label byte +db 100 +db 101 +db 115 +db 112 +db 105 +db 116 +db 101 +db 32 +db 105 +db 110 +db 99 +db 111 +db 110 +db 118 +db 101 +db 110 +db 105 +db 101 +db 110 +db 116 +db 32 +db 68 +db 101 +db 102 +db 101 +db 99 +db 116 +db 115 +db 46 +db 10 +db 0 +align 1 +L785 label byte +db 84 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 100 +db 32 +db 109 +db 97 +db 121 +db 32 +db 98 +db 101 +db 32 +db 65 +db 99 +db 99 +db 101 +db 112 +db 116 +db 97 +db 98 +db 108 +db 101 +db 10 +db 0 +align 1 +L780 label byte +db 83 +db 97 +db 116 +db 105 +db 115 +db 102 +db 97 +db 99 +db 116 +db 111 +db 114 +db 121 +db 32 +db 116 +db 104 +db 111 +db 117 +db 103 +db 104 +db 32 +db 102 +db 108 +db 97 +db 119 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L779 label byte +db 84 +db 104 +db 101 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 100 +db 105 +db 97 +db 103 +db 110 +db 111 +db 115 +db 101 +db 100 +db 32 +db 115 +db 101 +db 101 +db 109 +db 115 +db 32 +db 0 +align 1 +L768 label byte +db 84 +db 104 +db 101 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 32 +db 111 +db 102 +db 32 +db 32 +db 37 +db 45 +db 50 +db 57 +db 115 +db 32 +db 37 +db 100 +db 46 +db 10 +db 0 +align 1 +L761 label byte +db 70 +db 76 +db 65 +db 87 +db 115 +db 32 +db 32 +db 100 +db 105 +db 115 +db 99 +db 111 +db 118 +db 101 +db 114 +db 101 +db 100 +db 32 +db 61 +db 0 +align 1 +L760 label byte +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 115 +db 32 +db 32 +db 100 +db 105 +db 115 +db 99 +db 111 +db 118 +db 101 +db 114 +db 101 +db 100 +db 32 +db 61 +db 0 +align 1 +L759 label byte +db 83 +db 69 +db 82 +db 73 +db 79 +db 85 +db 83 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 115 +db 32 +db 32 +db 100 +db 105 +db 115 +db 99 +db 111 +db 118 +db 101 +db 114 +db 101 +db 100 +db 32 +db 61 +db 0 +align 1 +L758 label byte +db 70 +db 65 +db 73 +db 76 +db 85 +db 82 +db 69 +db 115 +db 32 +db 32 +db 101 +db 110 +db 99 +db 111 +db 117 +db 110 +db 116 +db 101 +db 114 +db 101 +db 100 +db 32 +db 61 +db 0 +align 1 +L754 label byte +db 10 +db 32 +db 32 +db 32 +db 32 +db 84 +db 114 +db 121 +db 105 +db 110 +db 103 +db 32 +db 116 +db 111 +db 32 +db 99 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 32 +db 48 +db 32 +db 47 +db 32 +db 48 +db 32 +db 112 +db 114 +db 111 +db 100 +db 117 +db 99 +db 101 +db 115 +db 32 +db 46 +db 46 +db 46 +db 0 +align 1 +L753 label byte +db 32 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L750 label byte +db 32 +db 32 +db 32 +db 32 +db 84 +db 114 +db 121 +db 105 +db 110 +db 103 +db 32 +db 116 +db 111 +db 32 +db 99 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 32 +db 49 +db 32 +db 47 +db 32 +db 48 +db 32 +db 112 +db 114 +db 111 +db 100 +db 117 +db 99 +db 101 +db 115 +db 32 +db 46 +db 46 +db 46 +db 0 +align 1 +L749 label byte +db 87 +db 104 +db 97 +db 116 +db 32 +db 109 +db 101 +db 115 +db 115 +db 97 +db 103 +db 101 +db 32 +db 97 +db 110 +db 100 +db 47 +db 111 +db 114 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 115 +db 32 +db 100 +db 111 +db 101 +db 115 +db 32 +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 98 +db 121 +db 32 +db 90 +db 101 +db 114 +db 111 +db 32 +db 112 +db 114 +db 111 +db 100 +db 117 +db 99 +db 101 +db 63 +db 10 +db 0 +align 1 +L748 label byte +db 32 +db 32 +db 105 +db 110 +db 115 +db 116 +db 101 +db 97 +db 100 +db 44 +db 32 +db 88 +db 32 +db 47 +db 32 +db 88 +db 32 +db 45 +db 32 +db 49 +db 47 +db 50 +db 32 +db 45 +db 32 +db 49 +db 47 +db 50 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L747 label byte +db 32 +db 32 +db 88 +db 32 +db 47 +db 32 +db 88 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 115 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 49 +db 32 +db 119 +db 104 +db 101 +db 110 +db 32 +db 88 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L742 label byte +db 32 +db 32 +db 88 +db 32 +db 47 +db 32 +db 88 +db 32 +db 32 +db 116 +db 114 +db 97 +db 112 +db 115 +db 32 +db 119 +db 104 +db 101 +db 110 +db 32 +db 88 +db 32 +db 61 +db 32 +db 37 +db 103 +db 10 +db 0 +align 1 +L727 label byte +db 105 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 102 +db 97 +db 114 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 49 +db 46 +db 10 +db 0 +align 1 +L726 label byte +db 32 +db 117 +db 110 +db 98 +db 97 +db 108 +db 97 +db 110 +db 99 +db 101 +db 100 +db 32 +db 114 +db 97 +db 110 +db 103 +db 101 +db 59 +db 32 +db 85 +db 102 +db 84 +db 104 +db 111 +db 108 +db 100 +db 32 +db 42 +db 32 +db 86 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 9 +db 37 +db 115 +db 10 +db 0 +align 1 +L725 label byte +db 66 +db 97 +db 100 +db 108 +db 121 +db 0 +align 1 +L718 label byte +db 32 +db 105 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 102 +db 97 +db 114 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 115 +db 113 +db 114 +db 116 +db 40 +db 90 +db 41 +db 32 +db 94 +db 32 +db 50 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 32 +db 46 +db 10 +db 0 +align 1 +L717 label byte +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 115 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 90 +db 32 +db 61 +db 32 +db 37 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L705 label byte +db 32 +db 105 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 102 +db 97 +db 114 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 115 +db 113 +db 114 +db 116 +db 40 +db 90 +db 41 +db 32 +db 94 +db 32 +db 50 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L704 label byte +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 115 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 119 +db 104 +db 97 +db 116 +db 32 +db 112 +db 114 +db 105 +db 110 +db 116 +db 115 +db 32 +db 97 +db 115 +db 32 +db 90 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L687 label byte +db 43 +db 45 +db 37 +db 103 +db 44 +db 32 +db 43 +db 45 +db 37 +db 103 +db 10 +db 97 +db 110 +db 100 +db 32 +db 43 +db 45 +db 37 +db 103 +db 32 +db 97 +db 114 +db 101 +db 32 +db 99 +db 111 +db 110 +db 102 +db 117 +db 115 +db 101 +db 100 +db 32 +db 98 +db 121 +db 32 +db 79 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 46 +db 0 +align 1 +L686 label byte +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 115 +db 32 +db 105 +db 110 +db 118 +db 111 +db 108 +db 118 +db 105 +db 110 +db 103 +db 32 +db 0 +align 1 +L680 label byte +db 97 +db 98 +db 111 +db 118 +db 101 +db 32 +db 105 +db 115 +db 32 +db 97 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 46 +db 10 +db 0 +align 1 +L679 label byte +db 65 +db 110 +db 121 +db 32 +db 111 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 115 +db 105 +db 103 +db 110 +db 97 +db 108 +db 32 +db 115 +db 101 +db 112 +db 97 +db 114 +db 97 +db 116 +db 105 +db 110 +db 103 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 42 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 116 +db 104 +db 101 +db 32 +db 111 +db 110 +db 101 +db 10 +db 0 +align 1 +L678 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 32 +db 110 +db 111 +db 114 +db 32 +db 102 +db 111 +db 114 +db 32 +db 86 +db 32 +db 47 +db 32 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L677 label byte +db 78 +db 111 +db 32 +db 79 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 98 +db 101 +db 32 +db 115 +db 105 +db 103 +db 110 +db 97 +db 108 +db 101 +db 100 +db 32 +db 102 +db 111 +db 114 +db 32 +db 86 +db 32 +db 42 +db 32 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L676 label byte +db 84 +db 104 +db 101 +db 114 +db 101 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 32 +db 115 +db 97 +db 116 +db 117 +db 114 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 98 +db 101 +db 99 +db 97 +db 117 +db 115 +db 101 +db 32 +db 116 +db 104 +db 101 +db 32 +db 115 +db 121 +db 115 +db 116 +db 101 +db 109 +db 32 +db 116 +db 114 +db 97 +db 112 +db 115 +db 32 +db 111 +db 110 +db 32 +db 111 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 46 +db 10 +db 0 +align 1 +L675 label byte +db 79 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 115 +db 97 +db 116 +db 117 +db 114 +db 97 +db 116 +db 101 +db 115 +db 32 +db 97 +db 116 +db 32 +db 86 +db 48 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L672 label byte +db 79 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 105 +db 115 +db 32 +db 86 +db 32 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L663 label byte +db 111 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 112 +db 97 +db 115 +db 116 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 9 +db 115 +db 104 +db 114 +db 105 +db 110 +db 107 +db 115 +db 32 +db 116 +db 111 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L660 label byte +db 45 +db 40 +db 45 +db 89 +db 41 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 115 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 89 +db 46 +db 10 +db 0 +align 1 +L659 label byte +db 102 +db 105 +db 110 +db 100 +db 115 +db 32 +db 97 +db 32 +db 0 +align 1 +L658 label byte +db 83 +db 101 +db 101 +db 109 +db 115 +db 32 +db 79 +db 46 +db 75 +db 46 +db 10 +db 0 +align 1 +L655 label byte +db 84 +db 114 +db 121 +db 105 +db 110 +db 103 +db 32 +db 105 +db 116 +db 32 +db 111 +db 110 +db 32 +db 89 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L654 label byte +db 67 +db 97 +db 110 +db 32 +db 96 +db 90 +db 32 +db 61 +db 32 +db 45 +db 89 +db 39 +db 32 +db 111 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 63 +db 10 +db 0 +align 1 +L647 label byte +db 84 +db 104 +db 105 +db 115 +db 32 +db 109 +db 97 +db 121 +db 32 +db 103 +db 101 +db 110 +db 101 +db 114 +db 97 +db 116 +db 101 +db 32 +db 97 +db 110 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 46 +db 10 +db 0 +align 1 +L646 label byte +db 83 +db 101 +db 97 +db 114 +db 99 +db 104 +db 105 +db 110 +db 103 +db 32 +db 102 +db 111 +db 114 +db 32 +db 79 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 58 +db 10 +db 0 +align 1 +L645 label byte +db 32 +db 46 +db 46 +db 46 +db 32 +db 110 +db 111 +db 32 +db 100 +db 105 +db 115 +db 99 +db 114 +db 101 +db 112 +db 97 +db 110 +db 99 +db 105 +db 101 +db 115 +db 32 +db 102 +db 111 +db 117 +db 110 +db 100 +db 46 +db 10 +db 0 +align 1 +L637 label byte +db 84 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 112 +db 111 +db 119 +db 101 +db 114 +db 115 +db 32 +db 90 +db 94 +db 81 +db 32 +db 97 +db 116 +db 32 +db 102 +db 111 +db 117 +db 114 +db 32 +db 110 +db 101 +db 97 +db 114 +db 108 +db 121 +db 32 +db 101 +db 120 +db 116 +db 114 +db 101 +db 109 +db 101 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L636 label byte +db 65 +db 99 +db 99 +db 117 +db 114 +db 97 +db 99 +db 121 +db 32 +db 115 +db 101 +db 101 +db 109 +db 115 +db 32 +db 97 +db 100 +db 101 +db 113 +db 117 +db 97 +db 116 +db 101 +db 46 +db 10 +db 0 +align 1 +L629 label byte +db 9 +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 105 +db 111 +db 110 +db 115 +db 32 +db 105 +db 110 +db 118 +db 111 +db 108 +db 118 +db 105 +db 110 +db 103 +db 32 +db 116 +db 105 +db 110 +db 121 +db 32 +db 105 +db 110 +db 116 +db 101 +db 114 +db 101 +db 115 +db 116 +db 32 +db 114 +db 97 +db 116 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L628 label byte +db 9 +db 84 +db 104 +db 105 +db 115 +db 32 +db 109 +db 117 +db 99 +db 104 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 32 +db 109 +db 97 +db 121 +db 32 +db 115 +db 112 +db 111 +db 105 +db 108 +db 32 +db 102 +db 105 +db 110 +db 97 +db 110 +db 99 +db 105 +db 97 +db 108 +db 10 +db 0 +align 1 +L627 label byte +db 9 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 115 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 98 +db 121 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L626 label byte +db 9 +db 40 +db 49 +db 32 +db 43 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 32 +db 94 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 59 +db 10 +db 0 +align 1 +L625 label byte +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 102 +db 111 +db 114 +db 10 +db 0 +align 1 +L624 label byte +db 67 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 101 +db 100 +db 0 +align 1 +L617 label byte +db 84 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 88 +db 94 +db 40 +db 40 +db 88 +db 32 +db 43 +db 32 +db 49 +db 41 +db 32 +db 47 +db 32 +db 40 +db 88 +db 32 +db 45 +db 32 +db 49 +db 41 +db 41 +db 32 +db 118 +db 115 +db 46 +db 32 +db 101 +db 120 +db 112 +db 40 +db 50 +db 41 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 97 +db 115 +db 32 +db 88 +db 32 +db 45 +db 62 +db 32 +db 49 +db 46 +db 10 +db 0 +align 1 +L613 label byte +db 84 +db 104 +db 105 +db 115 +db 32 +db 99 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 100 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 105 +db 115 +db 32 +db 79 +db 46 +db 75 +db 46 +db 10 +db 0 +align 1 +L610 label byte +db 32 +db 32 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L609 label byte +db 116 +db 104 +db 105 +db 115 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 98 +db 101 +db 116 +db 119 +db 101 +db 101 +db 110 +db 32 +db 48 +db 32 +db 97 +db 110 +db 100 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 10 +db 0 +align 1 +L605 label byte +db 97 +db 99 +db 116 +db 117 +db 97 +db 108 +db 108 +db 121 +db 32 +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 105 +db 110 +db 103 +db 32 +db 121 +db 105 +db 101 +db 108 +db 100 +db 115 +db 58 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L604 label byte +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 97 +db 102 +db 102 +db 108 +db 105 +db 99 +db 116 +db 32 +db 116 +db 104 +db 101 +db 32 +db 101 +db 120 +db 112 +db 114 +db 101 +db 115 +db 115 +db 105 +db 111 +db 110 +db 10 +db 9 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 32 +db 94 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 59 +db 10 +db 0 +align 1 +L603 label byte +db 85 +db 102 +db 84 +db 104 +db 111 +db 108 +db 100 +db 32 +db 61 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 32 +db 94 +db 32 +db 40 +db 37 +db 46 +db 49 +db 55 +db 101 +db 41 +db 10 +db 111 +db 110 +db 108 +db 121 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 0 +align 1 +L602 label byte +db 83 +db 105 +db 110 +db 99 +db 101 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 111 +db 99 +db 99 +db 117 +db 114 +db 115 +db 32 +db 98 +db 101 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 101 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 10 +db 0 +align 1 +L601 label byte +db 82 +db 97 +db 110 +db 103 +db 101 +db 32 +db 105 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 110 +db 97 +db 114 +db 114 +db 111 +db 119 +db 59 +db 32 +db 85 +db 49 +db 94 +db 37 +db 100 +db 32 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 115 +db 46 +db 10 +db 0 +align 1 +L596 label byte +db 109 +db 101 +db 114 +db 101 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 111 +db 102 +db 102 +db 46 +db 10 +db 0 +align 1 +L595 label byte +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 109 +db 97 +db 121 +db 32 +db 115 +db 117 +db 102 +db 102 +db 101 +db 114 +db 32 +db 108 +db 97 +db 114 +db 103 +db 101 +db 114 +db 32 +db 82 +db 101 +db 108 +db 97 +db 116 +db 105 +db 118 +db 101 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 32 +db 116 +db 104 +db 97 +db 110 +db 32 +db 0 +align 1 +L594 label byte +db 32 +db 98 +db 101 +db 108 +db 111 +db 119 +db 32 +db 119 +db 104 +db 105 +db 99 +db 104 +db 0 +align 1 +L593 label byte +db 84 +db 104 +db 101 +db 32 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 105 +db 115 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 44 +db 32 +db 37 +db 115 +db 10 +db 0 +align 1 +L592 label byte +db 88 +db 32 +db 47 +db 32 +db 90 +db 32 +db 61 +db 32 +db 49 +db 32 +db 43 +db 32 +db 37 +db 103 +db 32 +db 46 +db 10 +db 0 +align 1 +L591 label byte +db 88 +db 32 +db 47 +db 32 +db 90 +db 32 +db 102 +db 97 +db 105 +db 108 +db 115 +db 33 +db 10 +db 0 +align 1 +L588 label byte +db 101 +db 110 +db 99 +db 111 +db 117 +db 110 +db 116 +db 101 +db 114 +db 32 +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 98 +db 121 +db 32 +db 90 +db 101 +db 114 +db 111 +db 32 +db 97 +db 108 +db 116 +db 104 +db 111 +db 117 +db 103 +db 104 +db 32 +db 97 +db 99 +db 116 +db 117 +db 97 +db 108 +db 108 +db 121 +db 10 +db 0 +align 1 +L587 label byte +db 32 +db 32 +db 46 +db 46 +db 46 +db 32 +db 40 +db 102 +db 40 +db 88 +db 41 +db 32 +db 45 +db 32 +db 102 +db 40 +db 90 +db 41 +db 41 +db 32 +db 47 +db 32 +db 40 +db 88 +db 32 +db 45 +db 32 +db 90 +db 41 +db 32 +db 46 +db 46 +db 46 +db 10 +db 0 +align 1 +L586 label byte +db 32 +db 32 +db 32 +db 32 +db 105 +db 102 +db 32 +db 40 +db 88 +db 32 +db 61 +db 61 +db 32 +db 90 +db 41 +db 32 +db 32 +db 46 +db 46 +db 46 +db 32 +db 32 +db 101 +db 108 +db 115 +db 101 +db 0 +align 1 +L585 label byte +db 99 +db 111 +db 110 +db 102 +db 117 +db 115 +db 105 +db 111 +db 110 +db 32 +db 119 +db 104 +db 101 +db 110 +db 32 +db 105 +db 110 +db 110 +db 111 +db 99 +db 101 +db 110 +db 116 +db 32 +db 115 +db 116 +db 97 +db 116 +db 101 +db 109 +db 101 +db 110 +db 116 +db 115 +db 32 +db 108 +db 105 +db 107 +db 101 +db 10 +db 0 +align 1 +L584 label byte +db 116 +db 104 +db 105 +db 115 +db 32 +db 105 +db 115 +db 32 +db 97 +db 32 +db 83 +db 69 +db 82 +db 73 +db 79 +db 85 +db 83 +db 32 +db 68 +db 69 +db 70 +db 69 +db 67 +db 84 +db 10 +db 116 +db 104 +db 97 +db 116 +db 32 +db 99 +db 97 +db 117 +db 115 +db 101 +db 115 +db 32 +db 0 +align 1 +L583 label byte +db 32 +db 32 +db 32 +db 32 +db 83 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 78 +db 79 +db 84 +db 32 +db 115 +db 105 +db 103 +db 110 +db 97 +db 108 +db 32 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 44 +db 32 +db 0 +align 1 +L582 label byte +db 121 +db 101 +db 116 +db 32 +db 88 +db 32 +db 45 +db 32 +db 90 +db 32 +db 121 +db 105 +db 101 +db 108 +db 100 +db 115 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L581 label byte +db 88 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 9 +db 105 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 101 +db 113 +db 117 +db 97 +db 108 +db 32 +db 116 +db 111 +db 32 +db 90 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L576 label byte +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 47 +db 32 +db 85 +db 102 +db 84 +db 104 +db 111 +db 108 +db 100 +db 32 +db 102 +db 97 +db 105 +db 108 +db 101 +db 100 +db 33 +db 10 +db 0 +align 1 +L566 label byte +db 40 +db 114 +db 111 +db 117 +db 110 +db 100 +db 111 +db 102 +db 102 +db 32 +db 105 +db 110 +db 32 +db 85 +db 102 +db 84 +db 104 +db 111 +db 108 +db 100 +db 41 +db 32 +db 60 +db 32 +db 69 +db 48 +db 46 +db 10 +db 0 +align 1 +L565 label byte +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 105 +db 115 +db 32 +db 103 +db 114 +db 97 +db 100 +db 117 +db 97 +db 108 +db 59 +db 32 +db 105 +db 116 +db 32 +db 105 +db 110 +db 99 +db 117 +db 114 +db 115 +db 32 +db 65 +db 98 +db 115 +db 111 +db 108 +db 117 +db 116 +db 101 +db 32 +db 69 +db 114 +db 114 +db 111 +db 114 +db 32 +db 61 +db 10 +db 0 +align 1 +L560 label byte +db 124 +db 81 +db 32 +db 45 +db 32 +db 89 +db 124 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L559 label byte +db 112 +db 114 +db 105 +db 110 +db 116 +db 32 +db 111 +db 117 +db 116 +db 32 +db 97 +db 115 +db 32 +db 81 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 44 +db 32 +db 89 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L558 label byte +db 81 +db 32 +db 61 +db 61 +db 32 +db 89 +db 32 +db 119 +db 104 +db 105 +db 108 +db 101 +db 32 +db 100 +db 101 +db 110 +db 121 +db 105 +db 110 +db 103 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 124 +db 81 +db 32 +db 45 +db 32 +db 89 +db 124 +db 32 +db 61 +db 61 +db 32 +db 48 +db 59 +db 32 +db 116 +db 104 +db 101 +db 115 +db 101 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 115 +db 10 +db 0 +align 1 +L557 label byte +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 99 +db 111 +db 110 +db 102 +db 117 +db 115 +db 101 +db 115 +db 32 +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 44 +db 32 +db 119 +db 104 +db 105 +db 99 +db 104 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 115 +db 32 +db 116 +db 104 +db 97 +db 116 +db 10 +db 0 +align 1 +L555 label byte +db 32 +db 111 +db 114 +db 32 +db 101 +db 108 +db 115 +db 101 +db 32 +db 109 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 103 +db 101 +db 116 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 109 +db 97 +db 110 +db 121 +db 32 +db 108 +db 97 +db 115 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 119 +db 114 +db 111 +db 110 +db 103 +db 46 +db 10 +db 0 +align 1 +L554 label byte +db 32 +db 99 +db 111 +db 109 +db 105 +db 110 +db 103 +db 32 +db 100 +db 111 +db 119 +db 110 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L553 label byte +db 97 +db 112 +db 112 +db 114 +db 111 +db 97 +db 99 +db 104 +db 32 +db 97 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 61 +db 32 +db 37 +db 46 +db 49 +db 55 +db 101 +db 10 +db 0 +align 1 +L552 label byte +db 69 +db 105 +db 116 +db 104 +db 101 +db 114 +db 32 +db 97 +db 99 +db 99 +db 117 +db 114 +db 97 +db 99 +db 121 +db 32 +db 100 +db 101 +db 116 +db 101 +db 114 +db 105 +db 111 +db 114 +db 97 +db 116 +db 101 +db 115 +db 32 +db 97 +db 115 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 115 +db 10 +db 0 +align 1 +L540 label byte +db 83 +db 109 +db 97 +db 108 +db 108 +db 101 +db 115 +db 116 +db 32 +db 115 +db 116 +db 114 +db 105 +db 99 +db 116 +db 108 +db 121 +db 32 +db 112 +db 111 +db 115 +db 105 +db 116 +db 105 +db 118 +db 101 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 32 +db 102 +db 111 +db 117 +db 110 +db 100 +db 32 +db 105 +db 115 +db 32 +db 69 +db 48 +db 32 +db 61 +db 32 +db 37 +db 103 +db 32 +db 46 +db 10 +db 0 +align 1 +L539 label byte +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 116 +db 104 +db 97 +db 110 +db 32 +db 112 +db 114 +db 111 +db 100 +db 117 +db 99 +db 116 +db 115 +db 46 +db 10 +db 0 +align 1 +L538 label byte +db 68 +db 105 +db 102 +db 102 +db 101 +db 114 +db 101 +db 110 +db 99 +db 101 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 115 +db 32 +db 97 +db 116 +db 32 +db 97 +db 32 +db 104 +db 105 +db 103 +db 104 +db 101 +db 114 +db 0 +align 1 +L535 label byte +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 32 +db 116 +db 104 +db 97 +db 110 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 101 +db 110 +db 99 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L534 label byte +db 80 +db 114 +db 111 +db 100 +db 117 +db 99 +db 116 +db 115 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 97 +db 116 +db 32 +db 97 +db 32 +db 104 +db 105 +db 103 +db 104 +db 101 +db 114 +db 0 +align 1 +L527 label byte +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 80 +db 115 +db 101 +db 117 +db 100 +db 111 +db 90 +db 101 +db 114 +db 111 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 112 +db 114 +db 105 +db 110 +db 116 +db 115 +db 32 +db 111 +db 117 +db 116 +db 32 +db 97 +db 115 +db 32 +db 37 +db 103 +db 32 +db 46 +db 10 +db 0 +align 1 +L526 label byte +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 99 +db 97 +db 110 +db 32 +db 115 +db 116 +db 105 +db 99 +db 107 +db 32 +db 97 +db 116 +db 32 +db 97 +db 110 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 100 +db 108 +db 121 +db 32 +db 112 +db 111 +db 115 +db 105 +db 116 +db 105 +db 118 +db 101 +db 10 +db 0 +align 1 +L525 label byte +db 112 +db 111 +db 115 +db 105 +db 116 +db 105 +db 118 +db 101 +db 44 +db 32 +db 105 +db 115 +db 110 +db 39 +db 116 +db 59 +db 32 +db 105 +db 116 +db 32 +db 112 +db 114 +db 105 +db 110 +db 116 +db 115 +db 32 +db 111 +db 117 +db 116 +db 32 +db 97 +db 115 +db 32 +db 32 +db 37 +db 103 +db 32 +db 46 +db 10 +db 0 +align 1 +L524 label byte +db 66 +db 117 +db 116 +db 32 +db 45 +db 80 +db 115 +db 101 +db 117 +db 100 +db 111 +db 90 +db 101 +db 114 +db 111 +db 44 +db 32 +db 119 +db 104 +db 105 +db 99 +db 104 +db 32 +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 98 +db 101 +db 10 +db 0 +align 1 +L521 label byte +db 80 +db 115 +db 101 +db 117 +db 100 +db 111 +db 90 +db 101 +db 114 +db 111 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 112 +db 114 +db 105 +db 110 +db 116 +db 115 +db 32 +db 111 +db 117 +db 116 +db 32 +db 97 +db 115 +db 58 +db 32 +db 37 +db 103 +db 32 +db 46 +db 10 +db 0 +align 1 +L520 label byte +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 100 +db 108 +db 121 +db 32 +db 110 +db 101 +db 103 +db 97 +db 116 +db 105 +db 118 +db 101 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 10 +db 0 +align 1 +L519 label byte +db 80 +db 111 +db 115 +db 105 +db 116 +db 105 +db 118 +db 101 +db 32 +db 101 +db 120 +db 112 +db 114 +db 101 +db 115 +db 115 +db 105 +db 111 +db 110 +db 115 +db 32 +db 99 +db 97 +db 110 +db 32 +db 117 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 111 +db 32 +db 97 +db 110 +db 10 +db 0 +align 1 +L506 label byte +db 109 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 103 +db 101 +db 116 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 109 +db 97 +db 110 +db 121 +db 32 +db 108 +db 97 +db 115 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 119 +db 114 +db 111 +db 110 +db 103 +db 46 +db 10 +db 0 +align 1 +L482 label byte +db 83 +db 101 +db 101 +db 107 +db 105 +db 110 +db 103 +db 32 +db 85 +db 110 +db 100 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 32 +db 116 +db 104 +db 114 +db 101 +db 115 +db 104 +db 111 +db 108 +db 100 +db 115 +db 32 +db 85 +db 102 +db 84 +db 104 +db 111 +db 108 +db 100 +db 32 +db 97 +db 110 +db 100 +db 32 +db 69 +db 48 +db 46 +db 10 +db 0 +align 1 +L479 label byte +db 46 +db 46 +db 46 +db 32 +db 110 +db 111 +db 32 +db 100 +db 105 +db 115 +db 99 +db 114 +db 101 +db 112 +db 97 +db 110 +db 99 +db 105 +db 115 +db 32 +db 102 +db 111 +db 117 +db 110 +db 100 +db 46 +db 10 +db 0 +align 1 +L476 label byte +db 9 +db 105 +db 110 +db 118 +db 111 +db 108 +db 118 +db 105 +db 110 +db 103 +db 32 +db 105 +db 110 +db 116 +db 101 +db 114 +db 101 +db 115 +db 116 +db 32 +db 114 +db 97 +db 116 +db 101 +db 115 +db 46 +db 10 +db 0 +align 1 +L475 label byte +db 69 +db 114 +db 114 +db 111 +db 114 +db 115 +db 32 +db 108 +db 105 +db 107 +db 101 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 109 +db 97 +db 121 +db 32 +db 105 +db 110 +db 118 +db 97 +db 108 +db 105 +db 100 +db 97 +db 116 +db 101 +db 32 +db 102 +db 105 +db 110 +db 97 +db 110 +db 99 +db 105 +db 97 +db 108 +db 32 +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 105 +db 111 +db 110 +db 115 +db 10 +db 0 +align 1 +L454 label byte +db 84 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 112 +db 111 +db 119 +db 101 +db 114 +db 115 +db 32 +db 90 +db 94 +db 105 +db 32 +db 102 +db 111 +db 114 +db 32 +db 115 +db 109 +db 97 +db 108 +db 108 +db 32 +db 73 +db 110 +db 116 +db 101 +db 103 +db 101 +db 114 +db 115 +db 32 +db 90 +db 32 +db 97 +db 110 +db 100 +db 32 +db 105 +db 46 +db 10 +db 0 +align 1 +L451 label byte +db 115 +db 113 +db 114 +db 116 +db 32 +db 103 +db 101 +db 116 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 109 +db 97 +db 110 +db 121 +db 32 +db 108 +db 97 +db 115 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 119 +db 114 +db 111 +db 110 +db 103 +db 0 +align 1 +L449 label byte +db 116 +db 111 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 117 +db 108 +db 112 +db 115 +db 46 +db 10 +db 0 +align 1 +L448 label byte +db 79 +db 98 +db 115 +db 101 +db 114 +db 118 +db 101 +db 100 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 115 +db 32 +db 114 +db 117 +db 110 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 0 +align 1 +L447 label byte +db 83 +db 113 +db 117 +db 97 +db 114 +db 101 +db 32 +db 114 +db 111 +db 111 +db 116 +db 32 +db 105 +db 115 +db 32 +db 110 +db 101 +db 105 +db 116 +db 104 +db 101 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 32 +db 110 +db 111 +db 114 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L444 label byte +db 83 +db 113 +db 117 +db 97 +db 114 +db 101 +db 32 +db 114 +db 111 +db 111 +db 116 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L439 label byte +db 83 +db 113 +db 117 +db 97 +db 114 +db 101 +db 32 +db 114 +db 111 +db 111 +db 116 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L434 label byte +db 32 +db 102 +db 97 +db 105 +db 108 +db 115 +db 32 +db 116 +db 101 +db 115 +db 116 +db 32 +db 119 +db 104 +db 101 +db 116 +db 104 +db 101 +db 114 +db 32 +db 115 +db 113 +db 114 +db 116 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 115 +db 32 +db 111 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 115 +db 46 +db 10 +db 0 +align 1 +L433 label byte +db 82 +db 97 +db 100 +db 105 +db 120 +db 94 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 10 +db 0 +align 1 +L432 label byte +db 65 +db 110 +db 111 +db 109 +db 97 +db 108 +db 111 +db 117 +db 115 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 73 +db 110 +db 116 +db 101 +db 103 +db 101 +db 114 +db 32 +db 60 +db 32 +db 0 +align 1 +L392 label byte +db 84 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 119 +db 104 +db 101 +db 116 +db 104 +db 101 +db 114 +db 32 +db 115 +db 113 +db 114 +db 116 +db 32 +db 105 +db 115 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 101 +db 100 +db 32 +db 111 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L370 label byte +db 115 +db 113 +db 114 +db 116 +db 40 +db 88 +db 41 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 110 +db 45 +db 109 +db 111 +db 110 +db 111 +db 116 +db 111 +db 110 +db 105 +db 99 +db 32 +db 102 +db 111 +db 114 +db 32 +db 88 +db 32 +db 110 +db 101 +db 97 +db 114 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L369 label byte +db 115 +db 113 +db 114 +db 116 +db 32 +db 104 +db 97 +db 115 +db 32 +db 112 +db 97 +db 115 +db 115 +db 101 +db 100 +db 32 +db 97 +db 32 +db 116 +db 101 +db 115 +db 116 +db 32 +db 102 +db 111 +db 114 +db 32 +db 77 +db 111 +db 110 +db 111 +db 116 +db 111 +db 110 +db 105 +db 99 +db 105 +db 116 +db 121 +db 46 +db 10 +db 0 +align 1 +L352 label byte +db 84 +db 101 +db 115 +db 116 +db 32 +db 102 +db 111 +db 114 +db 32 +db 115 +db 113 +db 114 +db 116 +db 32 +db 109 +db 111 +db 110 +db 111 +db 116 +db 111 +db 110 +db 105 +db 99 +db 105 +db 116 +db 121 +db 46 +db 10 +db 0 +align 1 +L341 label byte +db 84 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 105 +db 102 +db 32 +db 115 +db 113 +db 114 +db 116 +db 40 +db 88 +db 32 +db 42 +db 32 +db 88 +db 41 +db 32 +db 61 +db 61 +db 32 +db 88 +db 32 +db 102 +db 111 +db 114 +db 32 +db 37 +db 100 +db 32 +db 73 +db 110 +db 116 +db 101 +db 103 +db 101 +db 114 +db 115 +db 32 +db 88 +db 46 +db 10 +db 0 +align 1 +L336 label byte +db 83 +db 113 +db 117 +db 97 +db 114 +db 101 +db 32 +db 114 +db 111 +db 111 +db 116 +db 32 +db 111 +db 102 +db 32 +db 48 +db 46 +db 48 +db 44 +db 32 +db 45 +db 48 +db 46 +db 48 +db 32 +db 111 +db 114 +db 32 +db 49 +db 46 +db 48 +db 32 +db 119 +db 114 +db 111 +db 110 +db 103 +db 0 +align 1 +L334 label byte +db 10 +db 82 +db 117 +db 110 +db 110 +db 105 +db 110 +db 103 +db 32 +db 116 +db 101 +db 115 +db 116 +db 32 +db 111 +db 102 +db 32 +db 115 +db 113 +db 117 +db 97 +db 114 +db 101 +db 32 +db 114 +db 111 +db 111 +db 116 +db 40 +db 120 +db 41 +db 46 +db 10 +db 0 +align 1 +L333 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 78 +db 111 +db 32 +db 102 +db 97 +db 105 +db 108 +db 117 +db 114 +db 101 +db 115 +db 32 +db 102 +db 111 +db 117 +db 110 +db 100 +db 32 +db 105 +db 110 +db 32 +db 37 +db 100 +db 32 +db 105 +db 110 +db 116 +db 101 +db 103 +db 101 +db 114 +db 32 +db 112 +db 97 +db 105 +db 114 +db 115 +db 46 +db 10 +db 0 +align 1 +L332 label byte +db 88 +db 32 +db 42 +db 32 +db 89 +db 32 +db 61 +db 61 +db 32 +db 89 +db 32 +db 42 +db 32 +db 88 +db 32 +db 116 +db 114 +db 105 +db 97 +db 108 +db 32 +db 102 +db 97 +db 105 +db 108 +db 115 +db 46 +db 10 +db 0 +align 4 +L323 label byte +dd 00H +dd 040080000H +align 1 +L322 label byte +db 84 +db 101 +db 115 +db 116 +db 105 +db 110 +db 103 +db 32 +db 111 +db 110 +db 32 +db 37 +db 100 +db 32 +db 114 +db 97 +db 110 +db 100 +db 111 +db 109 +db 32 +db 112 +db 97 +db 105 +db 114 +db 115 +db 46 +db 10 +db 0 +align 1 +L321 label byte +db 68 +db 111 +db 101 +db 115 +db 32 +db 77 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 99 +db 111 +db 109 +db 109 +db 117 +db 116 +db 101 +db 63 +db 32 +db 32 +db 0 +align 1 +L318 label byte +db 108 +db 97 +db 99 +db 107 +db 40 +db 115 +db 41 +db 32 +db 111 +db 102 +db 32 +db 103 +db 117 +db 97 +db 114 +db 100 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 111 +db 114 +db 32 +db 102 +db 97 +db 105 +db 108 +db 117 +db 114 +db 101 +db 40 +db 115 +db 41 +db 32 +db 116 +db 111 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 32 +db 111 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 10 +db 40 +db 110 +db 111 +db 116 +db 101 +db 100 +db 32 +db 97 +db 98 +db 111 +db 118 +db 101 +db 41 +db 32 +db 99 +db 111 +db 117 +db 110 +db 116 +db 32 +db 97 +db 115 +db 32 +db 111 +db 110 +db 101 +db 32 +db 102 +db 108 +db 97 +db 119 +db 32 +db 105 +db 110 +db 32 +db 116 +db 104 +db 101 +db 32 +db 102 +db 105 +db 110 +db 97 +db 108 +db 32 +db 116 +db 97 +db 108 +db 108 +db 121 +db 32 +db 98 +db 101 +db 108 +db 111 +db 119 +db 0 +align 1 +L316 label byte +db 83 +db 116 +db 105 +db 99 +db 107 +db 121 +db 32 +db 98 +db 105 +db 116 +db 32 +db 117 +db 115 +db 101 +db 100 +db 32 +db 105 +db 110 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 111 +db 114 +db 32 +db 110 +db 111 +db 116 +db 32 +db 97 +db 116 +db 32 +db 97 +db 108 +db 108 +db 46 +db 10 +db 0 +align 1 +L315 label byte +db 83 +db 116 +db 105 +db 99 +db 107 +db 121 +db 32 +db 98 +db 105 +db 116 +db 32 +db 97 +db 112 +db 112 +db 97 +db 114 +db 101 +db 110 +db 116 +db 108 +db 121 +db 32 +db 117 +db 115 +db 101 +db 100 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 46 +db 10 +db 0 +align 1 +L298 label byte +db 67 +db 104 +db 101 +db 99 +db 107 +db 105 +db 110 +db 103 +db 32 +db 102 +db 111 +db 114 +db 32 +db 115 +db 116 +db 105 +db 99 +db 107 +db 121 +db 32 +db 98 +db 105 +db 116 +db 46 +db 10 +db 0 +align 1 +L295 label byte +db 40 +db 88 +db 32 +db 45 +db 32 +db 89 +db 41 +db 32 +db 43 +db 32 +db 40 +db 89 +db 32 +db 45 +db 32 +db 88 +db 41 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 110 +db 32 +db 122 +db 101 +db 114 +db 111 +db 33 +db 10 +db 0 +align 1 +L292 label byte +db 65 +db 100 +db 100 +db 105 +db 116 +db 105 +db 111 +db 110 +db 47 +db 83 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 105 +db 111 +db 110 +db 32 +db 110 +db 101 +db 105 +db 116 +db 104 +db 101 +db 114 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 115 +db 32 +db 110 +db 111 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 115 +db 46 +db 10 +db 0 +align 1 +L291 label byte +db 65 +db 100 +db 100 +db 47 +db 83 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 0 +align 1 +L288 label byte +db 65 +db 100 +db 100 +db 105 +db 116 +db 105 +db 111 +db 110 +db 47 +db 83 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 105 +db 111 +db 110 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 46 +db 10 +db 0 +align 1 +L281 label byte +db 65 +db 100 +db 100 +db 47 +db 83 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L276 label byte +db 73 +db 110 +db 99 +db 111 +db 109 +db 112 +db 108 +db 101 +db 116 +db 101 +db 32 +db 99 +db 97 +db 114 +db 114 +db 121 +db 45 +db 112 +db 114 +db 111 +db 112 +db 97 +db 103 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 105 +db 110 +db 32 +db 65 +db 100 +db 100 +db 105 +db 116 +db 105 +db 111 +db 110 +db 0 +align 1 +L272 label byte +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 42 +db 32 +db 40 +db 32 +db 49 +db 32 +db 47 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 41 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 115 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 49 +db 0 +align 1 +L270 label byte +db 47 +db 32 +db 105 +db 115 +db 32 +db 110 +db 101 +db 105 +db 116 +db 104 +db 101 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 32 +db 110 +db 111 +db 114 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L267 label byte +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 99 +db 104 +db 111 +db 112 +db 46 +db 10 +db 0 +align 1 +L264 label byte +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 0 +align 1 +L261 label byte +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 46 +db 10 +db 0 +align 1 +L256 label byte +db 77 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 0 +align 1 +L253 label byte +db 42 +db 32 +db 105 +db 115 +db 32 +db 110 +db 101 +db 105 +db 116 +db 104 +db 101 +db 114 +db 32 +db 99 +db 104 +db 111 +db 112 +db 112 +db 101 +db 100 +db 32 +db 110 +db 111 +db 114 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 101 +db 100 +db 46 +db 10 +db 0 +align 1 +L252 label byte +db 77 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 99 +db 104 +db 111 +db 112 +db 46 +db 10 +db 0 +align 1 +L249 label byte +db 77 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 105 +db 99 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 32 +db 99 +db 111 +db 114 +db 114 +db 101 +db 99 +db 116 +db 108 +db 121 +db 46 +db 10 +db 0 +align 1 +L239 label byte +db 88 +db 32 +db 42 +db 32 +db 40 +db 49 +db 47 +db 88 +db 41 +db 32 +db 100 +db 105 +db 102 +db 102 +db 101 +db 114 +db 115 +db 32 +db 102 +db 114 +db 111 +db 109 +db 32 +db 49 +db 0 +align 1 +L220 label byte +db 67 +db 104 +db 101 +db 99 +db 107 +db 105 +db 110 +db 103 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 105 +db 110 +db 103 +db 32 +db 111 +db 110 +db 32 +db 109 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 121 +db 44 +db 32 +db 100 +db 105 +db 118 +db 105 +db 100 +db 101 +db 32 +db 97 +db 110 +db 100 +db 32 +db 97 +db 100 +db 100 +db 47 +db 115 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 46 +db 10 +db 0 +align 1 +L219 label byte +db 32 +db 32 +db 32 +db 32 +db 32 +db 42 +db 44 +db 32 +db 47 +db 44 +db 32 +db 97 +db 110 +db 100 +db 32 +db 45 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 32 +db 116 +db 111 +db 32 +db 104 +db 97 +db 118 +db 101 +db 32 +db 103 +db 117 +db 97 +db 114 +db 100 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 44 +db 32 +db 97 +db 115 +db 32 +db 116 +db 104 +db 101 +db 121 +db 32 +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 46 +db 10 +db 0 +align 1 +L216 label byte +db 32 +db 32 +db 46 +db 46 +db 46 +db 32 +db 32 +db 105 +db 102 +db 32 +db 40 +db 88 +db 32 +db 61 +db 61 +db 32 +db 49 +db 46 +db 48 +db 41 +db 32 +db 123 +db 46 +db 46 +db 46 +db 46 +db 46 +db 125 +db 32 +db 101 +db 108 +db 115 +db 101 +db 32 +db 123 +db 46 +db 46 +db 46 +db 47 +db 40 +db 88 +db 45 +db 49 +db 46 +db 48 +db 41 +db 46 +db 46 +db 46 +db 125 +db 10 +db 0 +align 1 +L215 label byte +db 32 +db 32 +db 115 +db 117 +db 99 +db 104 +db 32 +db 112 +db 114 +db 101 +db 99 +db 97 +db 117 +db 116 +db 105 +db 111 +db 110 +db 115 +db 32 +db 97 +db 103 +db 97 +db 105 +db 110 +db 115 +db 116 +db 32 +db 100 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 98 +db 121 +db 32 +db 122 +db 101 +db 114 +db 111 +db 32 +db 97 +db 115 +db 10 +db 0 +align 1 +L214 label byte +db 32 +db 32 +db 115 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 105 +db 111 +db 110 +db 32 +db 121 +db 105 +db 101 +db 108 +db 100 +db 115 +db 32 +db 32 +db 40 +db 49 +db 45 +db 85 +db 49 +db 41 +db 32 +db 45 +db 32 +db 49 +db 32 +db 61 +db 32 +db 48 +db 32 +db 44 +db 32 +db 116 +db 104 +db 101 +db 114 +db 101 +db 98 +db 121 +db 32 +db 118 +db 105 +db 116 +db 105 +db 97 +db 116 +db 105 +db 110 +db 103 +db 10 +db 0 +align 1 +L213 label byte +db 99 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 115 +db 32 +db 32 +db 40 +db 49 +db 45 +db 85 +db 49 +db 41 +db 32 +db 60 +db 32 +db 49 +db 32 +db 32 +db 97 +db 108 +db 116 +db 104 +db 111 +db 117 +db 103 +db 104 +db 10 +db 0 +align 1 +L210 label byte +db 45 +db 32 +db 108 +db 97 +db 99 +db 107 +db 115 +db 32 +db 71 +db 117 +db 97 +db 114 +db 100 +db 32 +db 68 +db 105 +db 103 +db 105 +db 116 +db 44 +db 32 +db 115 +db 111 +db 32 +db 99 +db 97 +db 110 +db 99 +db 101 +db 108 +db 108 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 105 +db 115 +db 32 +db 111 +db 98 +db 115 +db 99 +db 117 +db 114 +db 101 +db 100 +db 0 +align 1 +L205 label byte +db 42 +db 32 +db 97 +db 110 +db 100 +db 47 +db 111 +db 114 +db 32 +db 47 +db 32 +db 103 +db 101 +db 116 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 109 +db 97 +db 110 +db 121 +db 32 +db 108 +db 97 +db 115 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 119 +db 114 +db 111 +db 110 +db 103 +db 0 +align 1 +L201 label byte +db 67 +db 111 +db 109 +db 112 +db 117 +db 116 +db 101 +db 100 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 32 +db 111 +db 102 +db 32 +db 49 +db 47 +db 49 +db 46 +db 48 +db 48 +db 48 +db 46 +db 46 +db 49 +db 32 +db 62 +db 61 +db 32 +db 49 +db 0 +align 1 +L199 label byte +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 108 +db 97 +db 99 +db 107 +db 115 +db 32 +db 97 +db 32 +db 71 +db 117 +db 97 +db 114 +db 100 +db 32 +db 68 +db 105 +db 103 +db 105 +db 116 +db 44 +db 32 +db 115 +db 111 +db 32 +db 88 +db 47 +db 49 +db 32 +db 33 +db 61 +db 32 +db 88 +db 0 +align 1 +L194 label byte +db 68 +db 105 +db 118 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 108 +db 97 +db 99 +db 107 +db 115 +db 32 +db 97 +db 32 +db 71 +db 117 +db 97 +db 114 +db 100 +db 32 +db 68 +db 105 +db 103 +db 105 +db 116 +db 44 +db 32 +db 115 +db 111 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 32 +db 99 +db 97 +db 110 +db 32 +db 101 +db 120 +db 99 +db 101 +db 101 +db 100 +db 32 +db 49 +db 32 +db 117 +db 108 +db 112 +db 10 +db 111 +db 114 +db 32 +db 32 +db 49 +db 47 +db 51 +db 32 +db 32 +db 97 +db 110 +db 100 +db 32 +db 32 +db 51 +db 47 +db 57 +db 32 +db 32 +db 97 +db 110 +db 100 +db 32 +db 32 +db 57 +db 47 +db 50 +db 55 +db 32 +db 109 +db 97 +db 121 +db 32 +db 100 +db 105 +db 115 +db 97 +db 103 +db 114 +db 101 +db 101 +db 0 +align 1 +L190 label byte +db 42 +db 32 +db 103 +db 101 +db 116 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 109 +db 97 +db 110 +db 121 +db 32 +db 102 +db 105 +db 110 +db 97 +db 108 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 119 +db 114 +db 111 +db 110 +db 103 +db 46 +db 10 +db 0 +align 1 +L188 label byte +db 42 +db 32 +db 108 +db 97 +db 99 +db 107 +db 115 +db 32 +db 97 +db 32 +db 71 +db 117 +db 97 +db 114 +db 100 +db 32 +db 68 +db 105 +db 103 +db 105 +db 116 +db 44 +db 32 +db 115 +db 111 +db 32 +db 49 +db 42 +db 88 +db 32 +db 33 +db 61 +db 32 +db 88 +db 0 +align 1 +L185 label byte +db 10 +db 67 +db 104 +db 101 +db 99 +db 107 +db 105 +db 110 +db 103 +db 32 +db 102 +db 111 +db 114 +db 32 +db 103 +db 117 +db 97 +db 114 +db 100 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 32 +db 105 +db 110 +db 32 +db 42 +db 44 +db 32 +db 47 +db 44 +db 32 +db 97 +db 110 +db 100 +db 32 +db 45 +db 46 +db 10 +db 0 +align 1 +L184 label byte +db 83 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 105 +db 111 +db 110 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 115 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 110 +db 111 +db 114 +db 109 +db 97 +db 108 +db 105 +db 122 +db 101 +db 100 +db 44 +db 32 +db 97 +db 115 +db 32 +db 105 +db 116 +db 32 +db 115 +db 104 +db 111 +db 117 +db 108 +db 100 +db 32 +db 98 +db 101 +db 46 +db 0 +align 1 +L179 label byte +db 83 +db 117 +db 98 +db 116 +db 114 +db 97 +db 99 +db 116 +db 105 +db 111 +db 110 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 110 +db 111 +db 114 +db 109 +db 97 +db 108 +db 105 +db 122 +db 101 +db 100 +db 32 +db 88 +db 61 +db 89 +db 44 +db 88 +db 43 +db 90 +db 32 +db 33 +db 61 +db 32 +db 89 +db 43 +db 90 +db 33 +db 0 +align 1 +L175 label byte +db 114 +db 111 +db 117 +db 103 +db 104 +db 108 +db 121 +db 32 +db 37 +db 103 +db 32 +db 101 +db 120 +db 116 +db 114 +db 97 +db 32 +db 115 +db 105 +db 103 +db 110 +db 105 +db 102 +db 105 +db 99 +db 97 +db 110 +db 116 +db 32 +db 100 +db 101 +db 99 +db 105 +db 109 +db 97 +db 108 +db 115 +db 46 +db 10 +db 0 +align 1 +L174 label byte +db 112 +db 114 +db 101 +db 99 +db 105 +db 115 +db 101 +db 108 +db 121 +db 32 +db 119 +db 105 +db 116 +db 104 +db 32 +db 97 +db 98 +db 111 +db 117 +db 116 +db 32 +db 37 +db 103 +db 32 +db 101 +db 120 +db 116 +db 114 +db 97 +db 32 +db 66 +db 45 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 44 +db 32 +db 105 +db 46 +db 101 +db 46 +db 10 +db 0 +align 1 +L173 label byte +db 83 +db 111 +db 109 +db 101 +db 32 +db 115 +db 117 +db 98 +db 101 +db 120 +db 112 +db 114 +db 101 +db 115 +db 115 +db 105 +db 111 +db 110 +db 115 +db 32 +db 97 +db 112 +db 112 +db 101 +db 97 +db 114 +db 32 +db 116 +db 111 +db 32 +db 98 +db 101 +db 32 +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 101 +db 100 +db 32 +db 101 +db 120 +db 116 +db 114 +db 97 +db 10 +db 0 +align 1 +L167 label byte +db 111 +db 102 +db 32 +db 97 +db 110 +db 10 +db 101 +db 120 +db 116 +db 114 +db 97 +db 45 +db 112 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 0 +align 1 +L166 label byte +db 90 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 44 +db 32 +db 111 +db 114 +db 32 +db 90 +db 50 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 0 +align 1 +L165 label byte +db 44 +db 32 +db 111 +db 114 +db 32 +db 101 +db 120 +db 97 +db 99 +db 116 +db 32 +db 114 +db 97 +db 116 +db 105 +db 111 +db 110 +db 97 +db 108 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 97 +db 32 +db 114 +db 101 +db 115 +db 117 +db 108 +db 116 +db 10 +db 0 +align 1 +L164 label byte +db 66 +db 101 +db 99 +db 97 +db 117 +db 115 +db 101 +db 32 +db 111 +db 102 +db 32 +db 117 +db 110 +db 117 +db 115 +db 117 +db 97 +db 108 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 61 +db 32 +db 37 +db 102 +db 0 +align 1 +L160 label byte +db 9 +db 85 +db 50 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 44 +db 32 +db 90 +db 50 +db 32 +db 45 +db 32 +db 85 +db 50 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 10 +db 0 +align 1 +L159 label byte +db 9 +db 85 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 44 +db 32 +db 90 +db 49 +db 32 +db 45 +db 32 +db 85 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 10 +db 0 +align 1 +L158 label byte +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 0 +align 1 +L157 label byte +db 0 +align 1 +L150 label byte +db 84 +db 104 +db 97 +db 116 +db 32 +db 102 +db 101 +db 97 +db 116 +db 117 +db 114 +db 101 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 116 +db 101 +db 115 +db 116 +db 101 +db 100 +db 32 +db 102 +db 117 +db 114 +db 116 +db 104 +db 101 +db 114 +db 32 +db 98 +db 121 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 112 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 46 +db 10 +db 0 +align 1 +L145 label byte +db 80 +db 111 +db 115 +db 115 +db 105 +db 98 +db 108 +db 121 +db 32 +db 115 +db 111 +db 109 +db 101 +db 32 +db 112 +db 97 +db 114 +db 116 +db 32 +db 111 +db 102 +db 32 +db 116 +db 104 +db 105 +db 115 +db 0 +align 1 +L144 label byte +db 98 +db 121 +db 32 +db 101 +db 120 +db 116 +db 114 +db 97 +db 45 +db 112 +db 114 +db 101 +db 99 +db 105 +db 115 +db 101 +db 32 +db 101 +db 118 +db 97 +db 108 +db 117 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 111 +db 102 +db 32 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 101 +db 116 +db 105 +db 99 +db 32 +db 115 +db 117 +db 98 +db 101 +db 120 +db 112 +db 114 +db 101 +db 115 +db 115 +db 105 +db 111 +db 110 +db 115 +db 46 +db 10 +db 0 +align 1 +L143 label byte +db 97 +db 114 +db 101 +db 32 +db 115 +db 121 +db 109 +db 112 +db 116 +db 111 +db 109 +db 115 +db 32 +db 111 +db 102 +db 32 +db 105 +db 110 +db 99 +db 111 +db 110 +db 115 +db 105 +db 115 +db 116 +db 101 +db 110 +db 99 +db 105 +db 101 +db 115 +db 32 +db 105 +db 110 +db 116 +db 114 +db 111 +db 100 +db 117 +db 99 +db 101 +db 100 +db 10 +db 0 +align 1 +L142 label byte +db 114 +db 101 +db 115 +db 112 +db 101 +db 99 +db 116 +db 105 +db 118 +db 101 +db 108 +db 121 +db 32 +db 32 +db 37 +db 46 +db 55 +db 101 +db 44 +db 32 +db 32 +db 37 +db 46 +db 55 +db 101 +db 44 +db 32 +db 32 +db 37 +db 46 +db 55 +db 101 +db 44 +db 10 +db 0 +align 1 +L141 label byte +db 68 +db 105 +db 115 +db 97 +db 103 +db 114 +db 101 +db 101 +db 109 +db 101 +db 110 +db 116 +db 115 +db 32 +db 97 +db 109 +db 111 +db 110 +db 103 +db 32 +db 116 +db 104 +db 101 +db 32 +db 118 +db 97 +db 108 +db 117 +db 101 +db 115 +db 32 +db 88 +db 49 +db 44 +db 32 +db 89 +db 49 +db 44 +db 32 +db 90 +db 49 +db 44 +db 10 +db 0 +align 1 +L119 label byte +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 119 +db 111 +db 114 +db 115 +db 101 +db 32 +db 116 +db 104 +db 97 +db 110 +db 32 +db 53 +db 32 +db 100 +db 101 +db 99 +db 105 +db 109 +db 97 +db 108 +db 32 +db 102 +db 105 +db 103 +db 117 +db 114 +db 101 +db 115 +db 32 +db 32 +db 0 +align 1 +L117 label byte +db 84 +db 104 +db 101 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 32 +db 111 +db 102 +db 32 +db 115 +db 105 +db 103 +db 110 +db 105 +db 102 +db 105 +db 99 +db 97 +db 110 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 111 +db 102 +db 32 +db 116 +db 104 +db 101 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 105 +db 115 +db 32 +db 37 +db 102 +db 32 +db 46 +db 10 +db 0 +align 1 +L116 label byte +db 108 +db 111 +db 103 +db 97 +db 114 +db 105 +db 116 +db 104 +db 109 +db 105 +db 99 +db 32 +db 101 +db 110 +db 99 +db 111 +db 100 +db 105 +db 110 +db 103 +db 32 +db 104 +db 97 +db 115 +db 32 +db 112 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 99 +db 104 +db 97 +db 114 +db 97 +db 99 +db 116 +db 101 +db 114 +db 105 +db 122 +db 101 +db 100 +db 32 +db 115 +db 111 +db 108 +db 101 +db 108 +db 121 +db 32 +db 98 +db 121 +db 32 +db 85 +db 49 +db 46 +db 10 +db 0 +align 1 +L113 label byte +db 111 +db 102 +db 32 +db 115 +db 105 +db 103 +db 110 +db 105 +db 102 +db 105 +db 99 +db 97 +db 110 +db 116 +db 32 +db 100 +db 105 +db 103 +db 105 +db 116 +db 115 +db 32 +db 98 +db 117 +db 116 +db 44 +db 32 +db 98 +db 121 +db 32 +db 105 +db 116 +db 115 +db 101 +db 108 +db 102 +db 44 +db 32 +db 116 +db 104 +db 105 +db 115 +db 32 +db 105 +db 115 +db 32 +db 97 +db 32 +db 109 +db 105 +db 110 +db 111 +db 114 +db 32 +db 102 +db 108 +db 97 +db 119 +db 46 +db 10 +db 0 +align 1 +L112 label byte +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 32 +db 99 +db 97 +db 110 +db 110 +db 111 +db 116 +db 32 +db 98 +db 101 +db 32 +db 99 +db 104 +db 97 +db 114 +db 97 +db 99 +db 116 +db 101 +db 114 +db 105 +db 122 +db 101 +db 100 +db 32 +db 98 +db 121 +db 32 +db 97 +db 110 +db 32 +db 73 +db 110 +db 116 +db 101 +db 103 +db 101 +db 114 +db 32 +db 110 +db 117 +db 109 +db 98 +db 101 +db 114 +db 10 +db 0 +align 1 +L99 label byte +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 105 +db 115 +db 32 +db 102 +db 117 +db 122 +db 122 +db 121 +db 44 +db 88 +db 61 +db 49 +db 32 +db 98 +db 117 +db 116 +db 32 +db 88 +db 45 +db 49 +db 47 +db 50 +db 45 +db 49 +db 47 +db 50 +db 32 +db 33 +db 61 +db 32 +db 48 +db 0 +align 1 +L95 label byte +db 40 +db 49 +db 45 +db 85 +db 49 +db 41 +db 45 +db 49 +db 47 +db 50 +db 32 +db 60 +db 32 +db 49 +db 47 +db 50 +db 32 +db 105 +db 115 +db 32 +db 70 +db 65 +db 76 +db 83 +db 69 +db 44 +db 32 +db 112 +db 114 +db 111 +db 103 +db 46 +db 32 +db 102 +db 97 +db 105 +db 108 +db 115 +db 63 +db 0 +align 4 +L93 label byte +dd 00H +dd 040240000H +align 1 +L88 label byte +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 116 +db 32 +db 97 +db 115 +db 32 +db 103 +db 111 +db 111 +db 100 +db 32 +db 97 +db 115 +db 32 +db 50 +db 32 +db 111 +db 114 +db 32 +db 49 +db 48 +db 0 +align 1 +L84 label byte +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 105 +db 115 +db 32 +db 116 +db 111 +db 111 +db 32 +db 98 +db 105 +db 103 +db 58 +db 32 +db 114 +db 111 +db 117 +db 110 +db 100 +db 111 +db 102 +db 102 +db 32 +db 112 +db 114 +db 111 +db 98 +db 108 +db 101 +db 109 +db 115 +db 0 +align 1 +L82 label byte +db 77 +db 89 +db 83 +db 84 +db 69 +db 82 +db 89 +db 58 +db 32 +db 114 +db 101 +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 101 +db 100 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L81 label byte +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 99 +db 111 +db 110 +db 102 +db 105 +db 114 +db 109 +db 101 +db 100 +db 46 +db 10 +db 0 +align 4 +L78 label byte +dd 047ae147bH +dd 03f847ae1H +align 1 +L77 label byte +db 103 +db 101 +db 116 +db 115 +db 32 +db 98 +db 101 +db 116 +db 116 +db 101 +db 114 +db 32 +db 99 +db 108 +db 111 +db 115 +db 101 +db 115 +db 116 +db 32 +db 114 +db 101 +db 108 +db 97 +db 116 +db 105 +db 118 +db 101 +db 32 +db 115 +db 101 +db 112 +db 97 +db 114 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 85 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 46 +db 10 +db 0 +align 1 +L76 label byte +db 99 +db 111 +db 110 +db 102 +db 105 +db 114 +db 109 +db 115 +db 32 +db 99 +db 108 +db 111 +db 115 +db 101 +db 115 +db 116 +db 32 +db 114 +db 101 +db 108 +db 97 +db 116 +db 105 +db 118 +db 101 +db 32 +db 115 +db 101 +db 112 +db 97 +db 114 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 85 +db 49 +db 32 +db 46 +db 10 +db 0 +align 1 +L61 label byte +db 82 +db 101 +db 99 +db 97 +db 108 +db 99 +db 117 +db 108 +db 97 +db 116 +db 105 +db 110 +db 103 +db 32 +db 114 +db 97 +db 100 +db 105 +db 120 +db 32 +db 97 +db 110 +db 100 +db 32 +db 112 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 10 +db 32 +db 0 +align 1 +L60 label byte +db 67 +db 108 +db 111 +db 115 +db 101 +db 115 +db 116 +db 32 +db 114 +db 101 +db 108 +db 97 +db 116 +db 105 +db 118 +db 101 +db 32 +db 115 +db 101 +db 112 +db 97 +db 114 +db 97 +db 116 +db 105 +db 111 +db 110 +db 32 +db 102 +db 111 +db 117 +db 110 +db 100 +db 32 +db 105 +db 115 +db 32 +db 85 +db 49 +db 32 +db 61 +db 32 +db 37 +db 46 +db 55 +db 101 +db 32 +db 46 +db 10 +db 10 +db 0 +align 1 +L54 label byte +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 61 +db 32 +db 37 +db 102 +db 32 +db 46 +db 10 +db 0 +align 1 +L45 label byte +db 83 +db 101 +db 97 +db 114 +db 99 +db 104 +db 105 +db 110 +db 103 +db 32 +db 102 +db 111 +db 114 +db 32 +db 82 +db 97 +db 100 +db 105 +db 120 +db 32 +db 97 +db 110 +db 100 +db 32 +db 80 +db 114 +db 101 +db 99 +db 105 +db 115 +db 105 +db 111 +db 110 +db 46 +db 10 +db 0 +align 1 +L44 label byte +db 10 +db 0 +align 1 +L43 label byte +db 45 +db 49 +db 44 +db 32 +db 48 +db 44 +db 32 +db 49 +db 47 +db 50 +db 44 +db 32 +db 49 +db 44 +db 32 +db 50 +db 44 +db 32 +db 51 +db 44 +db 32 +db 52 +db 44 +db 32 +db 53 +db 44 +db 32 +db 57 +db 44 +db 32 +db 50 +db 55 +db 44 +db 32 +db 51 +db 50 +db 32 +db 38 +db 32 +db 50 +db 52 +db 48 +db 32 +db 97 +db 114 +db 101 +db 32 +db 79 +db 46 +db 75 +db 46 +db 10 +db 0 +align 1 +L38 label byte +db 53 +db 32 +db 33 +db 61 +db 32 +db 52 +db 43 +db 49 +db 44 +db 32 +db 50 +db 52 +db 48 +db 47 +db 51 +db 32 +db 33 +db 61 +db 32 +db 56 +db 48 +db 44 +db 32 +db 50 +db 52 +db 48 +db 47 +db 52 +db 32 +db 33 +db 61 +db 32 +db 54 +db 48 +db 44 +db 32 +db 111 +db 114 +db 32 +db 50 +db 52 +db 48 +db 47 +db 53 +db 32 +db 33 +db 61 +db 32 +db 52 +db 56 +db 0 +align 1 +L34 label byte +db 57 +db 32 +db 33 +db 61 +db 32 +db 51 +db 42 +db 51 +db 44 +db 32 +db 50 +db 55 +db 32 +db 33 +db 61 +db 32 +db 57 +db 42 +db 51 +db 44 +db 32 +db 51 +db 50 +db 32 +db 33 +db 61 +db 32 +db 56 +db 42 +db 52 +db 44 +db 32 +db 111 +db 114 +db 32 +db 51 +db 50 +db 45 +db 50 +db 55 +db 45 +db 52 +db 45 +db 49 +db 32 +db 33 +db 61 +db 32 +db 48 +db 0 +align 1 +L30 label byte +db 49 +db 47 +db 50 +db 32 +db 43 +db 32 +db 40 +db 45 +db 49 +db 41 +db 32 +db 43 +db 32 +db 49 +db 47 +db 50 +db 32 +db 33 +db 61 +db 32 +db 48 +db 0 +align 1 +L26 label byte +db 45 +db 49 +db 43 +db 49 +db 32 +db 33 +db 61 +db 32 +db 48 +db 44 +db 32 +db 40 +db 45 +db 49 +db 41 +db 43 +db 97 +db 98 +db 115 +db 40 +db 49 +db 41 +db 32 +db 33 +db 61 +db 32 +db 48 +db 44 +db 32 +db 111 +db 114 +db 32 +db 45 +db 49 +db 43 +db 40 +db 45 +db 49 +db 41 +db 42 +db 40 +db 45 +db 49 +db 41 +db 32 +db 33 +db 61 +db 32 +db 48 +db 0 +align 1 +L22 label byte +db 51 +db 32 +db 33 +db 61 +db 32 +db 50 +db 43 +db 49 +db 44 +db 32 +db 52 +db 32 +db 33 +db 61 +db 32 +db 51 +db 43 +db 49 +db 44 +db 32 +db 52 +db 43 +db 50 +db 42 +db 40 +db 45 +db 50 +db 41 +db 32 +db 33 +db 61 +db 32 +db 48 +db 44 +db 32 +db 111 +db 114 +db 32 +db 52 +db 45 +db 51 +db 45 +db 49 +db 32 +db 33 +db 61 +db 32 +db 48 +db 0 +align 4 +L20 label byte +dd 0d2f1a9fcH +dd 03f50624dH +align 1 +L19 label byte +db 67 +db 111 +db 109 +db 112 +db 97 +db 114 +db 105 +db 115 +db 111 +db 110 +db 32 +db 97 +db 108 +db 108 +db 101 +db 103 +db 101 +db 115 +db 32 +db 116 +db 104 +db 97 +db 116 +db 32 +db 45 +db 48 +db 46 +db 48 +db 32 +db 105 +db 115 +db 32 +db 78 +db 111 +db 110 +db 45 +db 122 +db 101 +db 114 +db 111 +db 33 +db 10 +db 0 +align 1 +L14 label byte +db 48 +db 43 +db 48 +db 32 +db 33 +db 61 +db 32 +db 48 +db 44 +db 32 +db 49 +db 45 +db 49 +db 32 +db 33 +db 61 +db 32 +db 48 +db 44 +db 32 +db 49 +db 32 +db 60 +db 61 +db 32 +db 48 +db 44 +db 32 +db 111 +db 114 +db 32 +db 49 +db 43 +db 49 +db 32 +db 33 +db 61 +db 32 +db 50 +db 0 +align 1 +L12 label byte +db 80 +db 114 +db 111 +db 103 +db 114 +db 97 +db 109 +db 32 +db 105 +db 115 +db 32 +db 110 +db 111 +db 119 +db 32 +db 82 +db 85 +db 78 +db 78 +db 73 +db 78 +db 71 +db 32 +db 116 +db 101 +db 115 +db 116 +db 115 +db 32 +db 111 +db 110 +db 32 +db 115 +db 109 +db 97 +db 108 +db 108 +db 32 +db 105 +db 110 +db 116 +db 101 +db 103 +db 101 +db 114 +db 115 +db 58 +db 10 +db 0 +align 4 +L8 label byte +dd 00H +dd 03ff00000H +align 4 +L7 label byte +dd 00H +dd 00H +align 1 +L2 label byte +db 10 +db 42 +db 32 +db 42 +db 32 +db 42 +db 32 +db 70 +db 76 +db 79 +db 65 +db 84 +db 73 +db 78 +db 71 +db 45 +db 80 +db 79 +db 73 +db 78 +db 84 +db 32 +db 69 +db 82 +db 82 +db 79 +db 82 +db 32 +db 42 +db 32 +db 42 +db 32 +db 42 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/sort.1bk b/quake3/source/lcc/x86/win32/tst/sort.1bk new file mode 100644 index 0000000..380d529 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/sort.1bk @@ -0,0 +1,20 @@ +exchange(1,9) +exchange(3,7) +exchange(5,6) +exchange(0,5) +exchange(0,3) +exchange(0,0) +exchange(1,2) +exchange(6,6) +exchange(8,9) +exchange(7,8) +-51 +-1 +0 +1 +3 +10 +18 +32 +567 +789 diff --git a/quake3/source/lcc/x86/win32/tst/sort.2bk b/quake3/source/lcc/x86/win32/tst/sort.2bk new file mode 100644 index 0000000..27488a1 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/sort.2bk @@ -0,0 +1,5 @@ +tst/sort.c:23: warning: missing return value +tst/sort.c:30: warning: missing return value +tst/sort.c:37: warning: missing return value +tst/sort.c:41: warning: missing return value +tst/sort.c:65: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/sort.sbk b/quake3/source/lcc/x86/win32/tst/sort.sbk new file mode 100644 index 0000000..cdedc1c --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/sort.sbk @@ -0,0 +1,324 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +public _in +align 4 +_in label byte +dd 10 +dd 32 +dd -1 +dd 567 +dd 3 +dd 18 +dd 1 +dd -51 +dd 789 +dd 0 +public _main +_DATA ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +push 10 +lea edi,(_in) +push edi +call _sort +add esp,8 +mov dword ptr (-4)[ebp],0 +jmp L5 +L2: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr (_in)[edi*4] +push edi +call _putd +add esp,4 +push 10 +call _putchar +add esp,4 +L3: +inc dword ptr (-4)[ebp] +L5: +mov edi,dword ptr (-4)[ebp] +cmp edi,10 +jb L2 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _putd +_putd: +push ebx +push esi +push edi +push ebp +mov ebp,esp +cmp dword ptr (20)[ebp],0 +jge L7 +push 45 +call _putchar +add esp,4 +neg dword ptr (20)[ebp] +L7: +mov eax,dword ptr (20)[ebp] +mov edi,10 +cdq +idiv edi +cmp eax,0 +je L9 +mov eax,dword ptr (20)[ebp] +mov edi,10 +cdq +idiv edi +push eax +call _putd +add esp,4 +L9: +mov eax,dword ptr (20)[ebp] +mov edi,10 +cdq +idiv edi +lea edi,(48)[edx] +push edi +call _putchar +add esp,4 +mov eax,0 +L6: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _sort +_sort: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (24)[ebp] +sub edi,1 +mov dword ptr (24)[ebp],edi +push edi +push 0 +mov edi,dword ptr (20)[ebp] +mov dword ptr (_xx),edi +push edi +call _quick +add esp,12 +mov eax,0 +L11: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _quick +_quick: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov edi,dword ptr (28)[ebp] +cmp dword ptr (24)[ebp],edi +jl L13 +jmp L12 +L13: +mov edi,dword ptr (28)[ebp] +push edi +mov edi,dword ptr (24)[ebp] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _partition +add esp,12 +mov dword ptr (-4)[ebp],eax +mov edi,dword ptr (-4)[ebp] +sub edi,1 +push edi +mov edi,dword ptr (24)[ebp] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _quick +add esp,12 +mov edi,dword ptr (28)[ebp] +push edi +mov edi,dword ptr (-4)[ebp] +lea edi,(1)[edi] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _quick +add esp,12 +mov eax,0 +L12: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _partition +_partition: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +inc dword ptr (28)[ebp] +mov edi,dword ptr (24)[ebp] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (-8)[ebp] +mov esi,dword ptr (20)[ebp] +mov edi,dword ptr [esi][edi*4] +mov dword ptr (-4)[ebp],edi +jmp L17 +L16: +inc dword ptr (24)[ebp] +jmp L20 +L19: +inc dword ptr (24)[ebp] +L20: +mov edi,dword ptr (24)[ebp] +mov esi,dword ptr (20)[ebp] +mov ebx,dword ptr (-4)[ebp] +cmp dword ptr [esi][edi*4],ebx +jl L19 +dec dword ptr (28)[ebp] +jmp L23 +L22: +dec dword ptr (28)[ebp] +L23: +mov edi,dword ptr (28)[ebp] +mov esi,dword ptr (20)[ebp] +mov ebx,dword ptr (-4)[ebp] +cmp dword ptr [esi][edi*4],ebx +jg L22 +mov edi,dword ptr (28)[ebp] +cmp dword ptr (24)[ebp],edi +jge L25 +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr (28)[ebp] +lea esi,[edi][esi*4] +push esi +mov esi,dword ptr (24)[ebp] +lea edi,[edi][esi*4] +push edi +call _exchange +add esp,8 +L25: +L17: +mov edi,dword ptr (28)[ebp] +cmp dword ptr (24)[ebp],edi +jl L16 +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr (28)[ebp] +lea esi,[edi][esi*4] +push esi +mov esi,dword ptr (-8)[ebp] +lea edi,[edi][esi*4] +push edi +call _exchange +add esp,8 +mov eax,dword ptr (28)[ebp] +L15: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _exchange +_exchange: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov edi,dword ptr (_xx) +mov esi,4 +mov ebx,dword ptr (24)[ebp] +sub ebx,edi +mov eax,ebx +cdq +idiv esi +push eax +mov ebx,dword ptr (20)[ebp] +sub ebx,edi +mov eax,ebx +cdq +idiv esi +push eax +lea edi,(L28) +push edi +call _printf +add esp,12 +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr [edi] +mov dword ptr (-4)[ebp],esi +mov esi,dword ptr (24)[ebp] +mov esi,dword ptr [esi] +mov dword ptr [edi],esi +mov edi,dword ptr (24)[ebp] +mov esi,dword ptr (-4)[ebp] +mov dword ptr [edi],esi +mov eax,0 +L27: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +extrn _putchar:near +_TEXT segment +_TEXT ends +_DATA segment +public _xx +align 4 +_xx label byte +db 4 dup (0) +_DATA ends +_TEXT segment +align 1 +L28 label byte +db 101 +db 120 +db 99 +db 104 +db 97 +db 110 +db 103 +db 101 +db 40 +db 37 +db 100 +db 44 +db 37 +db 100 +db 41 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/spill.1bk b/quake3/source/lcc/x86/win32/tst/spill.1bk new file mode 100644 index 0000000..e69de29 diff --git a/quake3/source/lcc/x86/win32/tst/spill.2bk b/quake3/source/lcc/x86/win32/tst/spill.2bk new file mode 100644 index 0000000..f7e3521 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/spill.2bk @@ -0,0 +1,6 @@ +tst/spill.c:1: warning: missing return value +tst/spill.c:3: warning: missing return value +tst/spill.c:5: warning: missing return value +tst/spill.c:7: warning: missing return value +tst/spill.c:9: warning: missing return value +tst/spill.c:17: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/spill.sbk b/quake3/source/lcc/x86/win32/tst/spill.sbk new file mode 100644 index 0000000..51cf7be --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/spill.sbk @@ -0,0 +1,259 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f +_f: +push ebx +push esi +push edi +push ebp +mov ebp,esp +call _f +add esp,0 +mov edi,eax +call _f +add esp,0 +lea edi,[eax][edi] +mov dword ptr (20)[ebp],edi +mov eax,0 +L2: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f2 +_f2: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +call _f +add esp,0 +mov edi,eax +cmp dword ptr (20)[ebp],0 +je L5 +call _f +add esp,0 +mov esi,eax +mov dword ptr (-4)[ebp],esi +jmp L6 +L5: +mov dword ptr (-4)[ebp],1 +L6: +mov esi,dword ptr (-4)[ebp] +lea edi,[esi][edi] +mov dword ptr (20)[ebp],edi +mov eax,0 +L3: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f3 +_f3: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,44 +mov dword ptr (-4)[ebp],0 +mov dword ptr (-8)[ebp],0 +mov dword ptr (-12)[ebp],0 +mov dword ptr (-16)[ebp],0 +mov dword ptr (-20)[ebp],0 +mov dword ptr (-24)[ebp],0 +mov dword ptr (-28)[ebp],0 +mov dword ptr (-32)[ebp],0 +mov dword ptr (-36)[ebp],0 +mov dword ptr (-40)[ebp],0 +mov edi,dword ptr (24)[ebp] +lea esi,(4)[edi] +mov dword ptr (24)[ebp],esi +cmp dword ptr (20)[ebp],0 +je L9 +call _f +add esp,0 +mov esi,eax +mov dword ptr (-44)[ebp],esi +jmp L10 +L9: +mov dword ptr (-44)[ebp],0 +L10: +mov esi,dword ptr (-44)[ebp] +mov dword ptr [edi],esi +mov eax,0 +L7: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f4 +_f4: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,52 +mov dword ptr (-4)[ebp],0 +mov dword ptr (-8)[ebp],0 +mov dword ptr (-12)[ebp],0 +mov dword ptr (-16)[ebp],0 +mov dword ptr (-20)[ebp],0 +mov dword ptr (-24)[ebp],0 +mov edi,dword ptr (_i) +lea esi,[edi*8] +fld qword ptr (_a)[esi] +fstp qword ptr (-36)[ebp] +fld qword ptr (_b)[esi] +fstp qword ptr (-44)[ebp] +fld qword ptr (-36)[ebp] +fadd qword ptr (-44)[ebp] +fld qword ptr (L15) +fcompp +fstsw ax +sahf +je L13 +cmp edi,0 +je L13 +fld qword ptr (-36)[ebp] +fsub qword ptr (-44)[ebp] +fld qword ptr (L15) +fcompp +fstsw ax +sahf +je L13 +mov dword ptr (-28)[ebp],1 +jmp L14 +L13: +mov dword ptr (-28)[ebp],0 +L14: +mov edi,dword ptr (-28)[ebp] +mov dword ptr (_i),edi +mov eax,0 +L11: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f5 +_f5: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (_k) +mov esi,dword ptr (_m) +mov ebx,dword ptr (_A) +mov edx,edi +imul edx,esi +lea edx,[ebx][edx*8] +mov ecx,dword ptr (_j) +mov eax,ecx +imul eax,esi +lea esi,[ebx][eax*8] +mov ebx,dword ptr (_n) +mov eax,dword ptr (_B) +imul edi,ebx +lea edi,[eax][edi*8] +imul ecx,ebx +lea ebx,[eax][ecx*8] +fld qword ptr [edx] +fmul qword ptr [esi] +fld qword ptr [edi] +fmul qword ptr [ebx] +faddp st(1),st +fstp qword ptr (_x) +fld qword ptr [edx] +fmul qword ptr [ebx] +fld qword ptr [edi] +fmul qword ptr [esi] +fsubp st(1),st +fstp qword ptr (_x) +mov eax,0 +L16: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +public _x +align 4 +_x label byte +db 8 dup (0) +public _B +align 4 +_B label byte +db 4 dup (0) +public _A +align 4 +_A label byte +db 4 dup (0) +public _n +align 4 +_n label byte +db 4 dup (0) +public _m +align 4 +_m label byte +db 4 dup (0) +public _k +align 4 +_k label byte +db 4 dup (0) +public _j +align 4 +_j label byte +db 4 dup (0) +public _i +align 4 +_i label byte +db 4 dup (0) +public _b +align 4 +_b label byte +db 80 dup (0) +public _a +align 4 +_a label byte +db 80 dup (0) +_DATA ends +_TEXT segment +align 4 +L15 label byte +dd 00H +dd 00H +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/stdarg.1bk b/quake3/source/lcc/x86/win32/tst/stdarg.1bk new file mode 100644 index 0000000..097aef7 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/stdarg.1bk @@ -0,0 +1,6 @@ +test 1 +test 2 +test 3 +test 4 +test 5.000000 +{1 2 3 4} {1 2 3 4} {1 2 3 4} {1 2 3 4} {1 2 3 4} {1 2 3 4} diff --git a/quake3/source/lcc/x86/win32/tst/stdarg.2bk b/quake3/source/lcc/x86/win32/tst/stdarg.2bk new file mode 100644 index 0000000..a832cf9 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/stdarg.2bk @@ -0,0 +1 @@ +tst/stdarg.c:51: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/stdarg.sbk b/quake3/source/lcc/x86/win32/tst/stdarg.sbk new file mode 100644 index 0000000..35c2f66 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/stdarg.sbk @@ -0,0 +1,415 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +public _x +align 4 +_x label byte +dd 1 +dd 2 +dd 3 +dd 4 +public _main +_DATA ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +lea edi,(L2) +push edi +call _print +add esp,4 +lea edi,(L4) +push edi +lea edi,(L3) +push edi +call _print +add esp,8 +push 10 +push 3 +lea edi,(L5) +push edi +call _print +add esp,12 +push 10 +push 4 +lea edi,(L8) +push edi +lea edi,(L7) +push edi +lea edi,(L6) +push edi +call _print +add esp,20 +push 10 +fld qword ptr (L10) +sub esp,8 +fstp qword ptr [esp] +lea edi,(L8) +push edi +lea edi,(L7) +push edi +lea edi,(L9) +push edi +call _print +add esp,24 +lea edi,(_x) +mov dword ptr (-8)[ebp],edi +mov esi,edi +mov dword ptr (-4)[ebp],esi +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +mov edi,dword ptr (-8)[ebp] +mov esi,edi +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +lea edi,(L11) +push edi +call _print +add esp,100 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _print +_print: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,28 +lea edi,(24)[ebp] +mov dword ptr (-4)[ebp],edi +jmp L17 +L14: +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +cmp edi,37 +jne L18 +mov edi,dword ptr (20)[ebp] +lea edi,(1)[edi] +mov dword ptr (20)[ebp],edi +movsx edi,byte ptr [edi] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (-8)[ebp] +cmp edi,115 +je L34 +cmp edi,115 +jg L39 +L38: +mov edi,dword ptr (-8)[ebp] +cmp edi,98 +jl L20 +cmp edi,102 +jg L20 +jmp dword ptr (L40-392)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L40 label byte +dd L23 +dd L28 +dd L30 +dd L20 +dd L36 +_TEXT ends +_TEXT segment +L39: +cmp dword ptr (-8)[ebp],119 +je L32 +jmp L20 +L23: +mov edi,dword ptr (-4)[ebp] +lea edi,(16)[edi] +mov dword ptr (-28)[ebp],edi +mov dword ptr (-4)[ebp],edi +lea edi,(-24)[ebp] +mov esi,dword ptr (-28)[ebp] +lea esi,(-16)[esi] +mov ecx,16 +rep movsb +mov edi,dword ptr (-12)[ebp] +push edi +mov edi,dword ptr (-16)[ebp] +push edi +mov edi,dword ptr (-20)[ebp] +push edi +mov edi,dword ptr (-24)[ebp] +push edi +lea edi,(L24) +push edi +call _printf +add esp,20 +jmp L19 +L28: +mov edi,dword ptr (-4)[ebp] +lea edi,(4)[edi] +mov dword ptr (-4)[ebp],edi +movsx edi,byte ptr (-4)[edi] +push edi +lea edi,(L29) +push edi +call _printf +add esp,8 +jmp L19 +L30: +mov edi,dword ptr (-4)[ebp] +lea edi,(4)[edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-4)[edi] +push edi +lea edi,(L31) +push edi +call _printf +add esp,8 +jmp L19 +L32: +mov edi,dword ptr (-4)[ebp] +lea edi,(4)[edi] +mov dword ptr (-4)[ebp],edi +movsx edi,word ptr (-4)[edi] +push edi +lea edi,(L33) +push edi +call _printf +add esp,8 +jmp L19 +L34: +mov edi,dword ptr (-4)[ebp] +lea edi,(4)[edi] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-4)[edi] +push edi +lea edi,(L35) +push edi +call _printf +add esp,8 +jmp L19 +L36: +mov edi,dword ptr (-4)[ebp] +lea edi,(8)[edi] +mov dword ptr (-4)[ebp],edi +fld qword ptr (-8)[edi] +sub esp,8 +fstp qword ptr [esp] +lea edi,(L37) +push edi +call _printf +add esp,12 +jmp L19 +L20: +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +push edi +lea edi,(L29) +push edi +call _printf +add esp,8 +jmp L19 +L18: +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +push edi +lea edi,(L29) +push edi +call _printf +add esp,8 +L19: +L15: +inc dword ptr (20)[ebp] +L17: +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +cmp edi,0 +jne L14 +mov dword ptr (-4)[ebp],0 +mov eax,0 +L12: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_TEXT segment +align 1 +L37 label byte +db 37 +db 102 +db 0 +align 1 +L35 label byte +db 37 +db 115 +db 0 +align 1 +L33 label byte +db 37 +db 120 +db 0 +align 1 +L31 label byte +db 37 +db 100 +db 0 +align 1 +L29 label byte +db 37 +db 99 +db 0 +align 1 +L24 label byte +db 123 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 32 +db 37 +db 100 +db 125 +db 0 +align 1 +L11 label byte +db 37 +db 98 +db 32 +db 37 +db 98 +db 32 +db 37 +db 98 +db 32 +db 37 +db 98 +db 32 +db 37 +db 98 +db 32 +db 37 +db 98 +db 10 +db 0 +align 4 +L10 label byte +dd 00H +dd 040140000H +align 1 +L9 label byte +db 37 +db 115 +db 37 +db 115 +db 32 +db 37 +db 102 +db 37 +db 99 +db 0 +align 1 +L8 label byte +db 115 +db 116 +db 0 +align 1 +L7 label byte +db 116 +db 101 +db 0 +align 1 +L6 label byte +db 37 +db 115 +db 37 +db 115 +db 32 +db 37 +db 119 +db 37 +db 99 +db 0 +align 1 +L5 label byte +db 116 +db 101 +db 115 +db 116 +db 32 +db 37 +db 100 +db 37 +db 99 +db 0 +align 1 +L4 label byte +db 50 +db 0 +align 1 +L3 label byte +db 116 +db 101 +db 115 +db 116 +db 32 +db 37 +db 115 +db 10 +db 0 +align 1 +L2 label byte +db 116 +db 101 +db 115 +db 116 +db 32 +db 49 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/struct.1bk b/quake3/source/lcc/x86/win32/tst/struct.1bk new file mode 100644 index 0000000..2358779 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/struct.1bk @@ -0,0 +1,5 @@ +(-1,-1) is not within [10,10; 310,310] +(1,1) is not within [10,10; 310,310] +(20,300) is within [10,10; 310,310] +(500,400) is not within [10,10; 310,310] +ab diff --git a/quake3/source/lcc/x86/win32/tst/struct.2bk b/quake3/source/lcc/x86/win32/tst/struct.2bk new file mode 100644 index 0000000..8a01bb1 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/struct.2bk @@ -0,0 +1,2 @@ +tst/struct.c:49: warning: missing return value +tst/struct.c:68: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/struct.sbk b/quake3/source/lcc/x86/win32/tst/struct.sbk new file mode 100644 index 0000000..09775a9 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/struct.sbk @@ -0,0 +1,453 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _addpoint +_TEXT segment +_addpoint: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (32)[ebp] +add dword ptr (24)[ebp],edi +mov edi,dword ptr (36)[ebp] +add dword ptr (28)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea esi,(24)[ebp] +mov ecx,8 +rep movsb +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _canonrect +_canonrect: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,32 +mov edi,dword ptr (32)[ebp] +cmp dword ptr (24)[ebp],edi +jge L10 +mov edi,dword ptr (24)[ebp] +mov dword ptr (-20)[ebp],edi +jmp L11 +L10: +mov edi,dword ptr (32)[ebp] +mov dword ptr (-20)[ebp],edi +L11: +mov edi,dword ptr (-20)[ebp] +mov dword ptr (-16)[ebp],edi +mov edi,dword ptr (36)[ebp] +cmp dword ptr (28)[ebp],edi +jge L20 +mov edi,dword ptr (28)[ebp] +mov dword ptr (-24)[ebp],edi +jmp L21 +L20: +mov edi,dword ptr (36)[ebp] +mov dword ptr (-24)[ebp],edi +L21: +mov edi,dword ptr (-24)[ebp] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (32)[ebp] +cmp dword ptr (24)[ebp],edi +jle L26 +mov edi,dword ptr (24)[ebp] +mov dword ptr (-28)[ebp],edi +jmp L27 +L26: +mov edi,dword ptr (32)[ebp] +mov dword ptr (-28)[ebp],edi +L27: +mov edi,dword ptr (-28)[ebp] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (36)[ebp] +cmp dword ptr (28)[ebp],edi +jle L37 +mov edi,dword ptr (28)[ebp] +mov dword ptr (-32)[ebp],edi +jmp L38 +L37: +mov edi,dword ptr (36)[ebp] +mov dword ptr (-32)[ebp],edi +L38: +mov edi,dword ptr (-32)[ebp] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea esi,(-16)[ebp] +mov ecx,16 +rep movsb +L5: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _makepoint +_makepoint: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov edi,dword ptr (24)[ebp] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (28)[ebp] +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (20)[ebp] +lea esi,(-8)[ebp] +mov ecx,8 +rep movsb +L39: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _makerect +_makerect: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,16 +lea edi,(-16)[ebp] +lea esi,(24)[ebp] +mov ecx,8 +rep movsb +lea edi,(-8)[ebp] +lea esi,(32)[ebp] +mov ecx,8 +rep movsb +lea esi,(-16)[ebp] +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +mov edi,dword ptr (20)[ebp] +push edi +call _canonrect +add esp,20 +L42: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _ptinrect +_ptinrect: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov edi,dword ptr (20)[ebp] +cmp edi,dword ptr (28)[ebp] +jl L53 +cmp edi,dword ptr (36)[ebp] +jge L53 +mov edi,dword ptr (32)[ebp] +cmp dword ptr (24)[ebp],edi +jl L53 +mov edi,dword ptr (40)[ebp] +cmp dword ptr (24)[ebp],edi +jge L53 +mov dword ptr (-4)[ebp],1 +jmp L54 +L53: +mov dword ptr (-4)[ebp],0 +L54: +mov eax,dword ptr (-4)[ebp] +L45: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +public _y +align 4 +_y label byte +db 97 +db 98 +db 0 +db 1 dup (0) +public _odd +_DATA ends +_TEXT segment +_odd: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +lea edi,(-4)[ebp] +lea esi,(20)[ebp] +mov ecx,4 +rep movsb +lea edi,(-4)[ebp] +push edi +lea edi,(L56) +push edi +call _printf +add esp,8 +mov eax,0 +L55: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_TEXT segment +align 4 +L58 label byte +dd 0 +dd 0 +align 4 +L59 label byte +dd 320 +dd 320 +align 4 +L60 label byte +dd -1 +dd -1 +dd 1 +dd 1 +dd 20 +dd 300 +dd 500 +dd 400 +public _main +_TEXT ends +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,108 +lea edi,(-68)[ebp] +lea esi,(L58) +mov ecx,8 +rep movsb +lea edi,(-76)[ebp] +lea esi,(L59) +mov ecx,8 +rep movsb +lea edi,(-36)[ebp] +lea esi,(L60) +mov ecx,32 +rep movsb +push -10 +push -10 +lea edi,(-84)[ebp] +push edi +call _makepoint +add esp,12 +lea esi,(-84)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +lea esi,(-76)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +lea edi,(-92)[ebp] +push edi +call _addpoint +add esp,20 +push 10 +push 10 +lea edi,(-100)[ebp] +push edi +call _makepoint +add esp,12 +lea esi,(-100)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +lea esi,(-68)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +lea edi,(-108)[ebp] +push edi +call _addpoint +add esp,20 +lea esi,(-108)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +lea esi,(-92)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +lea edi,(-52)[ebp] +push edi +call _makerect +add esp,20 +mov dword ptr (-4)[ebp],0 +jmp L64 +L61: +mov edi,dword ptr (-4)[ebp] +lea edi,[edi*8] +mov esi,dword ptr (-32)[ebp][edi] +push esi +mov edi,dword ptr (-36)[ebp][edi] +push edi +lea edi,(-60)[ebp] +push edi +call _makepoint +add esp,12 +mov edi,dword ptr (-56)[ebp] +push edi +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr (-36)[ebp][edi*8] +push edi +lea edi,(L65) +push edi +call _printf +add esp,12 +lea esi,(-52)[ebp] +sub esp,16 +mov edi,esp +mov ecx,16 +rep movsb +lea esi,(-60)[ebp] +sub esp,8 +mov edi,esp +mov ecx,8 +rep movsb +call _ptinrect +add esp,24 +cmp eax,0 +jne L68 +lea edi,(L70) +push edi +call _printf +add esp,4 +L68: +mov edi,dword ptr (-40)[ebp] +push edi +mov edi,dword ptr (-44)[ebp] +push edi +mov edi,dword ptr (-48)[ebp] +push edi +mov edi,dword ptr (-52)[ebp] +push edi +lea edi,(L71) +push edi +call _printf +add esp,20 +L62: +inc dword ptr (-4)[ebp] +L64: +mov edi,dword ptr (-4)[ebp] +cmp edi,4 +jb L61 +lea esi,(_y) +sub esp,4 +mov edi,esp +mov ecx,4 +rep movsb +call _odd +add esp,4 +push 0 +call _exit +add esp,4 +mov eax,0 +L57: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _exit:near +_TEXT segment +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_TEXT segment +align 1 +L71 label byte +db 119 +db 105 +db 116 +db 104 +db 105 +db 110 +db 32 +db 91 +db 37 +db 100 +db 44 +db 37 +db 100 +db 59 +db 32 +db 37 +db 100 +db 44 +db 37 +db 100 +db 93 +db 10 +db 0 +align 1 +L70 label byte +db 110 +db 111 +db 116 +db 32 +db 0 +align 1 +L65 label byte +db 40 +db 37 +db 100 +db 44 +db 37 +db 100 +db 41 +db 32 +db 105 +db 115 +db 32 +db 0 +align 1 +L56 label byte +db 37 +db 115 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/switch.1bk b/quake3/source/lcc/x86/win32/tst/switch.1bk new file mode 100644 index 0000000..559e8e3 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/switch.1bk @@ -0,0 +1,76 @@ +b = 0x8 +f = 0xc +n = 0xa +r = 0xd +t = 0x9 +v = 0xb +x = 0x78 +f: +x = 0 +x = 1 +x = 2 +x = 2 +x = 2 +x = 2 +x = 2 +x = 7 +x = 8 +x = 9 +x = 9 +x = 9 +x = 9 +x = 9 +x = 9 +x = 9 +x = 16 +x = 17 +x = 18 +x = 19 +x = 20 +g: +1 1 +1 2 +2 3 +2 4 +2 5 +3 6 +d 6 +3 7 +d 7 +3 8 +d 8 +d 9 +d 10 +h: +i = 8 +i = 16 +i = 120 +i = 128 +i = 248 +i = 264 +i = 272 +i = 280 +i = 288 +i = 296 +i = 304 +i = 312 +488 defaults +x = 0x1000000 +x = 0x2000000 +x = 0x3000000 +x = 0x4000000 +x = 0x5000000 +x = 0x6000000 (default) +x = 0x7000000 (default) +0 +1 +2 +3 +4 +5 +0 +1 +2 +3 +4 +5 diff --git a/quake3/source/lcc/x86/win32/tst/switch.2bk b/quake3/source/lcc/x86/win32/tst/switch.2bk new file mode 100644 index 0000000..76387b3 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/switch.2bk @@ -0,0 +1,5 @@ +tst/switch.c:55: warning: missing return value +tst/switch.c:73: warning: missing return value +tst/switch.c:97: warning: missing return value +tst/switch.c:112: warning: missing return value +tst/switch.c:137: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/switch.sbk b/quake3/source/lcc/x86/win32/tst/switch.sbk new file mode 100644 index 0000000..d81a0ea --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/switch.sbk @@ -0,0 +1,960 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +lea edi,(L6) +mov dword ptr (-4)[ebp],edi +jmp L5 +L2: +mov edi,dword ptr (-4)[ebp] +movsx edi,byte ptr [edi] +push edi +call _backslash +add esp,4 +push eax +mov edi,dword ptr (-4)[ebp] +movsx edi,byte ptr [edi] +push edi +lea edi,(L7) +push edi +call _printf +add esp,12 +L3: +inc dword ptr (-4)[ebp] +L5: +mov edi,dword ptr (-4)[ebp] +movsx edi,byte ptr [edi] +cmp edi,0 +jne L2 +call _f +add esp,0 +call _g +add esp,0 +call _h +add esp,0 +mov dword ptr (-8)[ebp],16777216 +jmp L11 +L8: +mov edi,dword ptr (-8)[ebp] +push edi +call _big +add esp,4 +L9: +add dword ptr (-8)[ebp],16777216 +L11: +mov edi,dword ptr (-8)[ebp] +and edi,117440512 +cmp edi,0 +jne L8 +call _limit +add esp,0 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _backslash +_backslash: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +cmp edi,102 +je L16 +cmp edi,102 +jg L22 +L21: +cmp dword ptr (20)[ebp],98 +je L15 +jmp L13 +L22: +mov edi,dword ptr (20)[ebp] +cmp edi,110 +je L17 +cmp edi,110 +jl L13 +L23: +mov edi,dword ptr (20)[ebp] +cmp edi,114 +je L18 +cmp edi,116 +je L19 +cmp edi,118 +je L20 +jmp L13 +L15: +mov eax,8 +jmp L12 +L16: +mov eax,12 +jmp L12 +L17: +mov eax,10 +jmp L12 +L18: +mov eax,13 +jmp L12 +L19: +mov eax,9 +jmp L12 +L20: +mov eax,11 +jmp L12 +L13: +mov eax,dword ptr (20)[ebp] +L12: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _f +_f: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,12 +mov dword ptr (-8)[ebp],0 +lea edi,(L25) +push edi +call _printf +add esp,4 +mov dword ptr (-4)[ebp],0 +L26: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-4)[ebp] +cmp edi,1 +jl L30 +cmp edi,20 +jg L30 +jmp dword ptr (L42-4)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L42 label byte +dd L32 +dd L33 +dd L30 +dd L30 +dd L30 +dd L30 +dd L34 +dd L35 +dd L36 +dd L30 +dd L30 +dd L30 +dd L30 +dd L30 +dd L30 +dd L37 +dd L38 +dd L39 +dd L40 +dd L41 +_TEXT ends +_TEXT segment +L32: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L33: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L34: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L35: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L36: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L37: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L38: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L39: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L40: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L31 +L41: +mov edi,dword ptr (-4)[ebp] +mov dword ptr (-8)[ebp],edi +L30: +L31: +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L44) +push edi +call _printf +add esp,8 +L27: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],20 +jle L26 +mov eax,0 +L24: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _g +_g: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +lea edi,(L46) +push edi +call _printf +add esp,4 +mov dword ptr (-4)[ebp],1 +L47: +mov edi,dword ptr (-4)[ebp] +cmp edi,1001 +jl L64 +cmp edi,1004 +jg L65 +jmp dword ptr (L66-4004)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L66 label byte +dd L60 +dd L60 +dd L60 +dd L60 +_TEXT ends +_TEXT segment +L64: +mov edi,dword ptr (-4)[ebp] +cmp edi,1 +jl L51 +cmp edi,8 +jg L51 +jmp dword ptr (L68-4)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L68 label byte +dd L53 +dd L53 +dd L55 +dd L55 +dd L55 +dd L57 +dd L57 +dd L57 +_TEXT ends +_TEXT segment +L65: +mov edi,dword ptr (-4)[ebp] +cmp edi,3001 +jl L51 +cmp edi,3004 +jg L51 +jmp dword ptr (L70-12004)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L70 label byte +dd L62 +dd L62 +dd L62 +dd L62 +_TEXT ends +_TEXT segment +L53: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L54) +push edi +call _printf +add esp,8 +jmp L52 +L55: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L56) +push edi +call _printf +add esp,8 +jmp L52 +L57: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L58) +push edi +call _printf +add esp,8 +L51: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L59) +push edi +call _printf +add esp,8 +jmp L52 +L60: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L61) +push edi +call _printf +add esp,8 +jmp L52 +L62: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L63) +push edi +call _printf +add esp,8 +L52: +L48: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],10 +jle L47 +mov eax,0 +L45: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _h +_h: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +mov dword ptr (-8)[ebp],0 +lea edi,(L73) +push edi +call _printf +add esp,4 +mov dword ptr (-4)[ebp],1 +L74: +mov edi,dword ptr (-4)[ebp] +cmp edi,264 +je L86 +cmp edi,264 +jg L94 +L93: +mov edi,dword ptr (-4)[ebp] +cmp edi,120 +je L84 +cmp edi,120 +jg L96 +L95: +mov edi,dword ptr (-4)[ebp] +cmp edi,8 +je L83 +cmp edi,8 +jl L78 +L97: +cmp dword ptr (-4)[ebp],16 +je L82 +jmp L78 +L96: +mov edi,dword ptr (-4)[ebp] +cmp edi,128 +je L80 +cmp edi,128 +jl L78 +L98: +cmp dword ptr (-4)[ebp],248 +je L87 +jmp L78 +L94: +mov edi,dword ptr (-4)[ebp] +cmp edi,288 +je L91 +cmp edi,288 +jg L100 +L99: +mov edi,dword ptr (-4)[ebp] +cmp edi,272 +je L88 +cmp edi,272 +jl L78 +L101: +cmp dword ptr (-4)[ebp],280 +je L85 +jmp L78 +L100: +mov edi,dword ptr (-4)[ebp] +cmp edi,304 +je L89 +cmp edi,304 +jg L103 +L102: +cmp dword ptr (-4)[ebp],296 +je L90 +jmp L78 +L103: +cmp dword ptr (-4)[ebp],312 +je L92 +jmp L78 +L78: +inc dword ptr (-8)[ebp] +jmp L75 +L80: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L82: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L83: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L84: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L85: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L86: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L87: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L88: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L89: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L90: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L91: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +jmp L79 +L92: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L81) +push edi +call _printf +add esp,8 +L79: +L75: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],500 +jle L74 +mov edi,dword ptr (-8)[ebp] +push edi +lea edi,(L104) +push edi +call _printf +add esp,8 +mov eax,0 +L72: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _big +_big: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov edi,dword ptr (20)[ebp] +and edi,06000000H +mov dword ptr (-4)[ebp],edi +mov edi,dword ptr (-4)[ebp] +cmp edi,33554432 +je L111 +cmp edi,33554432 +jg L115 +L114: +mov edi,dword ptr (-4)[ebp] +cmp edi,-2 +je L109 +cmp edi,-1 +je L109 +cmp edi,0 +je L109 +jmp L106 +L115: +mov edi,dword ptr (-4)[ebp] +cmp edi,67108864 +je L112 +jmp L106 +L109: +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L110) +push edi +call _printf +add esp,8 +jmp L107 +L111: +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L110) +push edi +call _printf +add esp,8 +jmp L107 +L112: +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L110) +push edi +call _printf +add esp,8 +jmp L107 +L106: +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L113) +push edi +call _printf +add esp,8 +L107: +mov eax,0 +L105: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _limit +_limit: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov dword ptr (-4)[ebp],-2147483648 +L117: +mov edi,dword ptr (-4)[ebp] +mov esi,-2147483648 +cmp edi,-2147483648 +jl L121 +cmp edi,-2147483644 +jg L121 +lea edi,[edi*4] +lea esi,[esi*4] +sub edi,esi +jmp dword ptr (L134)[edi] +_TEXT ends +_TEXT segment +align 4 +L134 label byte +dd L123 +dd L125 +dd L127 +dd L129 +dd L131 +_TEXT ends +_TEXT segment +L123: +lea edi,(L124) +push edi +call _printf +add esp,4 +jmp L122 +L125: +lea edi,(L126) +push edi +call _printf +add esp,4 +jmp L122 +L127: +lea edi,(L128) +push edi +call _printf +add esp,4 +jmp L122 +L129: +lea edi,(L130) +push edi +call _printf +add esp,4 +jmp L122 +L131: +lea edi,(L132) +push edi +call _printf +add esp,4 +jmp L122 +L121: +lea edi,(L133) +push edi +call _printf +add esp,4 +L122: +L118: +inc dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],-2147483643 +jle L117 +mov dword ptr (-4)[ebp],2147483647 +L135: +mov edi,dword ptr (-4)[ebp] +mov esi,2147483643 +cmp edi,2147483643 +jl L139 +cmp edi,2147483647 +jg L139 +lea edi,[edi*4] +lea esi,[esi*4] +sub edi,esi +jmp dword ptr (L146)[edi] +_TEXT ends +_TEXT segment +align 4 +L146 label byte +dd L145 +dd L144 +dd L143 +dd L142 +dd L141 +_TEXT ends +_TEXT segment +L141: +lea edi,(L124) +push edi +call _printf +add esp,4 +jmp L140 +L142: +lea edi,(L126) +push edi +call _printf +add esp,4 +jmp L140 +L143: +lea edi,(L128) +push edi +call _printf +add esp,4 +jmp L140 +L144: +lea edi,(L130) +push edi +call _printf +add esp,4 +jmp L140 +L145: +lea edi,(L132) +push edi +call _printf +add esp,4 +jmp L140 +L139: +lea edi,(L133) +push edi +call _printf +add esp,4 +L140: +L136: +dec dword ptr (-4)[ebp] +cmp dword ptr (-4)[ebp],2147483642 +jge L135 +mov eax,0 +L116: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_TEXT segment +align 1 +L133 label byte +db 53 +db 10 +db 0 +align 1 +L132 label byte +db 52 +db 10 +db 0 +align 1 +L130 label byte +db 51 +db 10 +db 0 +align 1 +L128 label byte +db 50 +db 10 +db 0 +align 1 +L126 label byte +db 49 +db 10 +db 0 +align 1 +L124 label byte +db 48 +db 10 +db 0 +align 1 +L113 label byte +db 120 +db 32 +db 61 +db 32 +db 48 +db 120 +db 37 +db 120 +db 32 +db 40 +db 100 +db 101 +db 102 +db 97 +db 117 +db 108 +db 116 +db 41 +db 10 +db 0 +align 1 +L110 label byte +db 120 +db 32 +db 61 +db 32 +db 48 +db 120 +db 37 +db 120 +db 10 +db 0 +align 1 +L104 label byte +db 37 +db 100 +db 32 +db 100 +db 101 +db 102 +db 97 +db 117 +db 108 +db 116 +db 115 +db 10 +db 0 +align 1 +L81 label byte +db 105 +db 32 +db 61 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L73 label byte +db 104 +db 58 +db 10 +db 0 +align 1 +L63 label byte +db 54 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L61 label byte +db 53 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L59 label byte +db 100 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L58 label byte +db 51 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L56 label byte +db 50 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L54 label byte +db 49 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L46 label byte +db 103 +db 58 +db 10 +db 0 +align 1 +L44 label byte +db 120 +db 32 +db 61 +db 32 +db 37 +db 100 +db 10 +db 0 +align 1 +L25 label byte +db 102 +db 58 +db 10 +db 0 +align 1 +L7 label byte +db 37 +db 99 +db 32 +db 61 +db 32 +db 48 +db 120 +db 37 +db 120 +db 10 +db 0 +align 1 +L6 label byte +db 98 +db 102 +db 110 +db 114 +db 116 +db 118 +db 120 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/wf1.1bk b/quake3/source/lcc/x86/win32/tst/wf1.1bk new file mode 100644 index 0000000..095e087 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/wf1.1bk @@ -0,0 +1,74 @@ +5 a +2 and +5 buf +16 c +8 char +1 compare +4 cond +5 count +1 d +1 die +3 else +1 entry +1 eof +4 err +1 error +1 exit +1 folded +1 for +1 free +1 frequencies +1 frequency +1 get +2 getchar +3 getword +14 if +2 in +1 index +1 input +1 install +8 int +1 into +1 is +4 isletter +1 it +1 itself +5 left +1 letter +7 lookup +1 main +2 malloc +1 message +2 n +1 necessary +12 next +9 node +4 of +1 on +1 or +1 otherwise +2 out +8 p +3 print +2 printf +16 return +5 right +4 root +25 s +2 storage +3 strcmp +1 strcpy +1 strlen +8 struct +1 structures +2 subtree +1 t +5 tprint +9 tree +1 uses +1 version +1 wf +3 while +21 word +9 words +2 z diff --git a/quake3/source/lcc/x86/win32/tst/wf1.2bk b/quake3/source/lcc/x86/win32/tst/wf1.2bk new file mode 100644 index 0000000..0e7a8a6 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/wf1.2bk @@ -0,0 +1,2 @@ +tst/wf1.c:29: warning: missing return value +tst/wf1.c:87: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/wf1.sbk b/quake3/source/lcc/x86/win32/tst/wf1.sbk new file mode 100644 index 0000000..df5688a --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/wf1.sbk @@ -0,0 +1,451 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +public _main +_TEXT segment +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,24 +mov dword ptr (-24)[ebp],0 +mov dword ptr (_next),0 +jmp L3 +L2: +lea edi,(-24)[ebp] +push edi +lea edi,(-20)[ebp] +push edi +call _lookup +add esp,8 +inc dword ptr [eax] +L3: +lea edi,(-20)[ebp] +push edi +call _getword +add esp,4 +cmp eax,0 +jne L2 +mov edi,dword ptr (-24)[ebp] +push edi +call _tprint +add esp,4 +mov eax,0 +L1: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _err +_err: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L6) +push edi +call _printf +add esp,8 +push 1 +call _exit +add esp,4 +mov eax,0 +L5: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _getword +_getword: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,8 +L8: +L9: +call _getchar +add esp,0 +mov dword ptr (-4)[ebp],eax +cmp eax,-1 +je L11 +mov edi,dword ptr (-4)[ebp] +push edi +call _isletter +add esp,4 +cmp eax,0 +je L8 +L11: +mov edi,dword ptr (20)[ebp] +mov dword ptr (-8)[ebp],edi +jmp L15 +L12: +mov edi,dword ptr (-8)[ebp] +lea esi,(1)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-4)[ebp] +mov ebx,esi +mov byte ptr [edi],bl +L13: +call _getchar +add esp,0 +mov dword ptr (-4)[ebp],eax +L15: +mov edi,dword ptr (-4)[ebp] +push edi +call _isletter +add esp,4 +mov dword ptr (-4)[ebp],eax +cmp eax,0 +jne L12 +mov edi,dword ptr (-8)[ebp] +mov byte ptr [edi],0 +mov edi,dword ptr (-8)[ebp] +mov esi,dword ptr (20)[ebp] +cmp edi,esi +jbe L16 +mov eax,1 +jmp L7 +L16: +mov eax,0 +L7: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _isletter +_isletter: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +cmp edi,65 +jl L19 +cmp edi,90 +jg L19 +add dword ptr (20)[ebp],32 +L19: +mov edi,dword ptr (20)[ebp] +cmp edi,97 +jl L21 +cmp edi,122 +jg L21 +mov eax,dword ptr (20)[ebp] +jmp L18 +L21: +mov eax,0 +L18: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _lookup +_lookup: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +mov edi,dword ptr (24)[ebp] +mov edi,dword ptr [edi] +cmp edi,0 +je L24 +mov edi,dword ptr (24)[ebp] +mov edi,dword ptr [edi] +mov edi,dword ptr (12)[edi] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _strcmp +add esp,8 +mov dword ptr (-4)[ebp],eax +cmp dword ptr (-4)[ebp],0 +jge L26 +mov edi,dword ptr (24)[ebp] +mov edi,dword ptr [edi] +lea edi,(4)[edi] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _lookup +add esp,8 +mov edi,eax +jmp L23 +L26: +cmp dword ptr (-4)[ebp],0 +jle L28 +mov edi,dword ptr (24)[ebp] +mov edi,dword ptr [edi] +lea edi,(8)[edi] +push edi +mov edi,dword ptr (20)[ebp] +push edi +call _lookup +add esp,8 +mov edi,eax +jmp L23 +L28: +mov edi,dword ptr (24)[ebp] +mov eax,dword ptr [edi] +jmp L23 +L24: +cmp dword ptr (_next),2000 +jl L30 +lea edi,(L32) +push edi +call _err +add esp,4 +L30: +mov edi,dword ptr (_next) +sal edi,4 +mov dword ptr (_words)[edi],0 +mov edi,dword ptr (_next) +sal edi,4 +mov dword ptr (_words+8)[edi],0 +mov dword ptr (_words+4)[edi],0 +mov edi,dword ptr (20)[ebp] +push edi +call _strlen +add esp,4 +lea edi,(1)[eax] +push edi +call _malloc +add esp,4 +mov esi,dword ptr (_next) +sal esi,4 +mov dword ptr (_words+12)[esi],eax +mov edi,dword ptr (_next) +sal edi,4 +mov edi,dword ptr (_words+12)[edi] +cmp edi,0 +jne L36 +lea edi,(L39) +push edi +call _err +add esp,4 +L36: +mov edi,dword ptr (20)[ebp] +push edi +mov edi,dword ptr (_next) +sal edi,4 +mov edi,dword ptr (_words+12)[edi] +push edi +call _strcpy +add esp,8 +mov edi,dword ptr (_next) +lea esi,(1)[edi] +mov dword ptr (_next),esi +sal edi,4 +lea edi,(_words)[edi] +mov esi,dword ptr (24)[ebp] +mov dword ptr [esi],edi +mov eax,edi +L23: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _tprint +_tprint: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +cmp edi,0 +je L42 +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (4)[edi] +push edi +call _tprint +add esp,4 +mov edi,dword ptr (20)[ebp] +mov esi,dword ptr (12)[edi] +push esi +mov edi,dword ptr [edi] +push edi +lea edi,(L44) +push edi +call _printf +add esp,12 +mov edi,dword ptr (20)[ebp] +mov edi,dword ptr (8)[edi] +push edi +call _tprint +add esp,4 +L42: +mov eax,0 +L41: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _strcmp +_strcmp: +push ebx +push esi +push edi +push ebp +mov ebp,esp +jmp L47 +L46: +mov edi,dword ptr (20)[ebp] +lea esi,(1)[edi] +mov dword ptr (20)[ebp],esi +movsx edi,byte ptr [edi] +cmp edi,0 +jne L49 +mov eax,0 +jmp L45 +L49: +inc dword ptr (24)[ebp] +L47: +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +mov esi,dword ptr (24)[ebp] +movsx esi,byte ptr [esi] +cmp edi,esi +je L46 +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +cmp edi,0 +jne L51 +mov eax,-1 +jmp L45 +L51: +mov edi,dword ptr (24)[ebp] +movsx edi,byte ptr [edi] +cmp edi,0 +jne L53 +mov eax,1 +jmp L45 +L53: +mov edi,dword ptr (20)[ebp] +movsx edi,byte ptr [edi] +mov esi,dword ptr (24)[ebp] +movsx esi,byte ptr [esi] +mov eax,edi +sub eax,esi +L45: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +extrn _strcpy:near +_TEXT segment +_TEXT ends +extrn _strlen:near +_TEXT segment +_TEXT ends +extrn _malloc:near +_TEXT segment +_TEXT ends +extrn _getchar:near +_TEXT segment +_TEXT ends +extrn _exit:near +_TEXT segment +_TEXT ends +extrn _printf:near +_TEXT segment +_TEXT ends +_DATA segment +public _next +align 4 +_next label byte +db 4 dup (0) +public _words +align 4 +_words label byte +db 32000 dup (0) +_DATA ends +_TEXT segment +align 1 +L44 label byte +db 37 +db 100 +db 9 +db 37 +db 115 +db 10 +db 0 +align 1 +L39 label byte +db 111 +db 117 +db 116 +db 32 +db 111 +db 102 +db 32 +db 119 +db 111 +db 114 +db 100 +db 32 +db 115 +db 116 +db 111 +db 114 +db 97 +db 103 +db 101 +db 0 +align 1 +L32 label byte +db 111 +db 117 +db 116 +db 32 +db 111 +db 102 +db 32 +db 110 +db 111 +db 100 +db 101 +db 32 +db 115 +db 116 +db 111 +db 114 +db 97 +db 103 +db 101 +db 0 +align 1 +L6 label byte +db 63 +db 32 +db 37 +db 115 +db 10 +db 0 +_TEXT ends +end diff --git a/quake3/source/lcc/x86/win32/tst/yacc.1bk b/quake3/source/lcc/x86/win32/tst/yacc.1bk new file mode 100644 index 0000000..b08a02f --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/yacc.1bk @@ -0,0 +1,10 @@ +a +b +load +negate +push 5 +c +load +multiply +add +store diff --git a/quake3/source/lcc/x86/win32/tst/yacc.2bk b/quake3/source/lcc/x86/win32/tst/yacc.2bk new file mode 100644 index 0000000..a84aa5b --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/yacc.2bk @@ -0,0 +1,3 @@ +tst/yacc.c:345: warning: missing return value +tst/yacc.c:349: warning: missing return value +tst/yacc.c:359: warning: missing return value diff --git a/quake3/source/lcc/x86/win32/tst/yacc.sbk b/quake3/source/lcc/x86/win32/tst/yacc.sbk new file mode 100644 index 0000000..432c9a4 --- /dev/null +++ b/quake3/source/lcc/x86/win32/tst/yacc.sbk @@ -0,0 +1,2489 @@ +.486 +.model flat +extrn __fltused:near +extrn __ftol:near +_DATA segment +public _yyin +align 4 +_yyin label byte +dd __iob +public _yyout +align 4 +_yyout label byte +dd __iob+32 +public _yylex +_DATA ends +_TEXT segment +_yylex: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,4 +jmp L4 +L3: +L6: +mov edi,dword ptr (-4)[ebp] +cmp edi,-1 +jl L7 +cmp edi,4 +jg L7 +jmp dword ptr (L18+4)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L18 label byte +dd L8 +dd L9 +dd L12 +dd L13 +dd L8 +dd L15 +_TEXT ends +_TEXT segment +L9: +call _yywrap +add esp,0 +cmp eax,0 +je L8 +mov eax,0 +jmp L2 +L12: +mov eax,257 +jmp L2 +L13: +mov eax,258 +jmp L2 +L15: +movsx eax,byte ptr (_yytext) +jmp L2 +L7: +mov edi,dword ptr (-4)[ebp] +push edi +lea edi,(L17) +push edi +mov edi,dword ptr (_yyout) +push edi +call _fprintf +add esp,12 +L8: +L4: +call _yylook +add esp,0 +mov dword ptr (-4)[ebp],eax +cmp eax,0 +jge L3 +mov eax,0 +L2: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +public _yyvstop +align 4 +_yyvstop label byte +dd 0 +dd 4 +dd 0 +dd 3 +dd 4 +dd 0 +dd 2 +dd 4 +dd 0 +dd 1 +dd 4 +dd 0 +dd 2 +dd 0 +dd 1 +dd 0 +dd 0 +public _yycrank +align 4 +_yycrank label byte +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 1 +db 3 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 1 +db 4 +db 2 dup (0) +db 1 +db 3 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 1 +db 5 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 5 +db 7 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 1 +db 6 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 6 +db 8 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +db 0 +db 0 +db 2 dup (0) +public _yysvec +align 4 +_yysvec label byte +dd 00H +dd 00H +dd 00H +dd _yycrank-4 +dd 00H +dd 00H +dd _yycrank +dd _yysvec+12 +dd 00H +dd _yycrank +dd 00H +dd _yyvstop+4 +dd _yycrank +dd 00H +dd _yyvstop+12 +dd _yycrank+8 +dd 00H +dd _yyvstop+24 +dd _yycrank+76 +dd 00H +dd _yyvstop+36 +dd _yycrank +dd _yysvec+60 +dd _yyvstop+48 +dd _yycrank +dd _yysvec+72 +dd _yyvstop+56 +dd 00H +dd 00H +dd 00H +public _yytop +align 4 +_yytop label byte +dd _yycrank+564 +public _yybgin +align 4 +_yybgin label byte +dd _yysvec+12 +public _yymatch +align 1 +_yymatch label byte +db 0 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 9 +db 10 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 9 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 48 +db 48 +db 48 +db 48 +db 48 +db 48 +db 48 +db 48 +db 48 +db 48 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 1 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 1 +db 1 +db 1 +db 1 +db 65 +db 1 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 65 +db 1 +db 1 +db 1 +db 1 +db 1 +db 0 +public _yyextra +align 1 +_yyextra label byte +db 0 +db 0 +db 0 +db 0 +db 0 +db 0 +db 0 +db 0 +db 0 +public _yylineno +align 4 +_yylineno label byte +dd 1 +public _yysptr +align 4 +_yysptr label byte +dd _yysbuf +public _yyprevious +align 4 +_yyprevious label byte +dd 10 +public _yylook +_DATA ends +_TEXT segment +_yylook: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,44 +cmp dword ptr (_yymorfg),0 +jne L35 +lea edi,(_yytext) +mov dword ptr (-16)[ebp],edi +jmp L36 +L35: +mov dword ptr (_yymorfg),0 +mov edi,dword ptr (_yyleng) +lea edi,(_yytext)[edi] +mov dword ptr (-16)[ebp],edi +L36: +L37: +lea edi,(_yylstate) +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (_yybgin) +mov dword ptr (-4)[ebp],edi +mov dword ptr (_yyestate),edi +cmp dword ptr (_yyprevious),10 +jne L41 +mov edi,dword ptr (-4)[ebp] +lea edi,(12)[edi] +mov dword ptr (-4)[ebp],edi +L41: +L43: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr [edi] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-12)[ebp] +lea esi,(_yycrank) +cmp edi,esi +jne L47 +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr (4)[edi] +mov dword ptr (-28)[ebp],edi +mov edi,dword ptr (-28)[ebp] +cmp edi,0 +jne L49 +jmp L94 +L49: +mov edi,dword ptr (-28)[ebp] +mov edi,dword ptr [edi] +lea esi,(_yycrank) +cmp edi,esi +jne L51 +jmp L94 +L51: +L47: +mov edi,dword ptr (-16)[ebp] +lea esi,(1)[edi] +mov dword ptr (-16)[ebp],esi +mov esi,dword ptr (_yysptr) +lea ebx,(_yysbuf) +cmp esi,ebx +jbe L61 +mov esi,dword ptr (_yysptr) +lea esi,(-1)[esi] +mov dword ptr (_yysptr),esi +movsx esi,byte ptr [esi] +mov dword ptr (-40)[ebp],esi +jmp L62 +L61: +mov esi,dword ptr (_yyin) +lea esi,(4)[esi] +mov ebx,dword ptr [esi] +sub ebx,1 +mov dword ptr [esi],ebx +cmp ebx,0 +jl L63 +mov esi,dword ptr (_yyin) +mov ebx,dword ptr [esi] +lea edx,(1)[ebx] +mov dword ptr [esi],edx +movsx esi,byte ptr [ebx] +and esi,255 +mov dword ptr (-44)[ebp],esi +jmp L64 +L63: +mov esi,dword ptr (_yyin) +push esi +call __filbuf +add esp,4 +mov esi,eax +mov dword ptr (-44)[ebp],esi +L64: +mov esi,dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],esi +L62: +mov esi,dword ptr (-40)[ebp] +mov dword ptr (_yytchar),esi +cmp esi,10 +jne L59 +inc dword ptr (_yylineno) +mov esi,dword ptr (_yytchar) +mov dword ptr (-36)[ebp],esi +jmp L60 +L59: +mov esi,dword ptr (_yytchar) +mov dword ptr (-36)[ebp],esi +L60: +cmp dword ptr (-36)[ebp],-1 +jne L57 +mov dword ptr (-32)[ebp],0 +jmp L58 +L57: +mov esi,dword ptr (_yytchar) +mov dword ptr (-32)[ebp],esi +L58: +mov esi,dword ptr (-32)[ebp] +mov dword ptr (-20)[ebp],esi +mov ebx,esi +mov byte ptr [edi],bl +L65: +mov edi,dword ptr (-12)[ebp] +mov dword ptr (-24)[ebp],edi +lea esi,(_yycrank) +cmp edi,esi +jbe L66 +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-24)[ebp] +lea edi,[esi][edi*4] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-12)[ebp] +mov esi,edi +mov ebx,dword ptr (_yytop) +cmp esi,ebx +ja L67 +movsx edi,byte ptr [edi] +imul edi,edi,12 +lea edi,(_yysvec)[edi] +mov esi,dword ptr (-4)[ebp] +cmp edi,esi +jne L67 +lea edi,(_yysvec) +mov esi,dword ptr (-12)[ebp] +movsx esi,byte ptr (1)[esi] +imul esi,esi,12 +lea esi,(_yysvec)[esi] +cmp esi,edi +jne L70 +mov edi,dword ptr (-16)[ebp] +lea edi,(-1)[edi] +mov dword ptr (-16)[ebp],edi +movsx edi,byte ptr [edi] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L72 +dec dword ptr (_yylineno) +L72: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +jmp L94 +L70: +mov edi,dword ptr (-8)[ebp] +lea esi,(4)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-12)[ebp] +movsx esi,byte ptr (1)[esi] +imul esi,esi,12 +lea esi,(_yysvec)[esi] +mov dword ptr (-4)[ebp],esi +mov dword ptr [edi],esi +jmp L43 +L66: +mov edi,dword ptr (-12)[ebp] +lea esi,(_yycrank) +cmp edi,esi +jae L75 +lea edi,(_yycrank) +mov esi,dword ptr (-12)[ebp] +sub edi,esi +mov eax,edi +mov edi,4 +cdq +idiv edi +lea edi,(_yycrank)[eax*4] +mov dword ptr (-24)[ebp],edi +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (-12)[ebp] +lea edi,[esi][edi*4] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-12)[ebp] +mov esi,edi +mov ebx,dword ptr (_yytop) +cmp esi,ebx +ja L77 +movsx edi,byte ptr [edi] +imul edi,edi,12 +lea edi,(_yysvec)[edi] +mov esi,dword ptr (-4)[ebp] +cmp edi,esi +jne L77 +lea edi,(_yysvec) +mov esi,dword ptr (-12)[ebp] +movsx esi,byte ptr (1)[esi] +imul esi,esi,12 +lea esi,(_yysvec)[esi] +cmp esi,edi +jne L79 +mov edi,dword ptr (-16)[ebp] +lea edi,(-1)[edi] +mov dword ptr (-16)[ebp],edi +movsx edi,byte ptr [edi] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L81 +dec dword ptr (_yylineno) +L81: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +jmp L94 +L79: +mov edi,dword ptr (-8)[ebp] +lea esi,(4)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-12)[ebp] +movsx esi,byte ptr (1)[esi] +imul esi,esi,12 +lea esi,(_yysvec)[esi] +mov dword ptr (-4)[ebp],esi +mov dword ptr [edi],esi +jmp L43 +L77: +mov edi,dword ptr (-20)[ebp] +movsx edi,byte ptr (_yymatch)[edi] +mov esi,dword ptr (-24)[ebp] +lea edi,[esi][edi*4] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-12)[ebp] +mov esi,edi +mov ebx,dword ptr (_yytop) +cmp esi,ebx +ja L83 +movsx edi,byte ptr [edi] +imul edi,edi,12 +lea edi,(_yysvec)[edi] +mov esi,dword ptr (-4)[ebp] +cmp edi,esi +jne L83 +lea edi,(_yysvec) +mov esi,dword ptr (-12)[ebp] +movsx esi,byte ptr (1)[esi] +imul esi,esi,12 +lea esi,(_yysvec)[esi] +cmp esi,edi +jne L85 +mov edi,dword ptr (-16)[ebp] +lea edi,(-1)[edi] +mov dword ptr (-16)[ebp],edi +movsx edi,byte ptr [edi] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L87 +dec dword ptr (_yylineno) +L87: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +jmp L94 +L85: +mov edi,dword ptr (-8)[ebp] +lea esi,(4)[edi] +mov dword ptr (-8)[ebp],esi +mov esi,dword ptr (-12)[ebp] +movsx esi,byte ptr (1)[esi] +imul esi,esi,12 +lea esi,(_yysvec)[esi] +mov dword ptr (-4)[ebp],esi +mov dword ptr [edi],esi +jmp L43 +L83: +L75: +L67: +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr (4)[edi] +mov dword ptr (-4)[ebp],edi +cmp edi,0 +je L89 +mov edi,dword ptr (-4)[ebp] +mov edi,dword ptr [edi] +mov dword ptr (-12)[ebp],edi +lea esi,(_yycrank) +cmp edi,esi +je L89 +jmp L65 +L89: +mov edi,dword ptr (-16)[ebp] +lea edi,(-1)[edi] +mov dword ptr (-16)[ebp],edi +movsx edi,byte ptr [edi] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L91 +dec dword ptr (_yylineno) +L91: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +jmp L94 +L93: +mov edi,dword ptr (-16)[ebp] +lea esi,(-1)[edi] +mov dword ptr (-16)[ebp],esi +mov byte ptr [edi],0 +mov edi,dword ptr (-8)[ebp] +mov edi,dword ptr [edi] +mov esi,edi +cmp esi,0 +je L96 +mov edi,dword ptr (8)[edi] +mov dword ptr (_yyfnd),edi +cmp edi,0 +je L96 +mov edi,dword ptr (_yyfnd) +cmp dword ptr [edi],0 +jle L96 +mov edi,dword ptr (-8)[ebp] +mov dword ptr (_yyolsp),edi +mov edi,dword ptr (_yyfnd) +mov edi,dword ptr [edi] +movsx edi,byte ptr (_yyextra)[edi] +cmp edi,0 +je L98 +jmp L101 +L100: +mov edi,dword ptr (-8)[ebp] +lea edi,(-4)[edi] +mov dword ptr (-8)[ebp],edi +mov edi,dword ptr (-16)[ebp] +lea esi,(-1)[edi] +mov dword ptr (-16)[ebp],esi +movsx edi,byte ptr [edi] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L103 +dec dword ptr (_yylineno) +L103: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +L101: +mov edi,dword ptr (_yyfnd) +mov edi,dword ptr [edi] +neg edi +push edi +mov edi,dword ptr (-8)[ebp] +mov edi,dword ptr [edi] +mov edi,dword ptr (8)[edi] +push edi +call _yyback +add esp,8 +cmp eax,1 +je L105 +mov edi,dword ptr (-8)[ebp] +lea esi,(_yylstate) +cmp edi,esi +ja L100 +L105: +L98: +mov edi,dword ptr (-16)[ebp] +movsx esi,byte ptr [edi] +mov dword ptr (_yyprevious),esi +mov esi,dword ptr (-8)[ebp] +mov dword ptr (_yylsp),esi +lea esi,(_yytext) +sub edi,esi +lea edi,(1)[edi] +mov dword ptr (_yyleng),edi +mov edi,dword ptr (_yyleng) +mov byte ptr (_yytext)[edi],0 +mov edi,dword ptr (_yyfnd) +lea esi,(4)[edi] +mov dword ptr (_yyfnd),esi +mov eax,dword ptr [edi] +jmp L34 +L96: +mov edi,dword ptr (-16)[ebp] +movsx edi,byte ptr [edi] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L106 +dec dword ptr (_yylineno) +L106: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +L94: +mov edi,dword ptr (-8)[ebp] +lea esi,(-4)[edi] +mov dword ptr (-8)[ebp],esi +lea esi,(_yylstate) +cmp edi,esi +ja L93 +movsx edi,byte ptr (_yytext) +cmp edi,0 +jne L108 +lea edi,(_yysbuf) +mov dword ptr (_yysptr),edi +mov eax,0 +jmp L34 +L108: +mov edi,dword ptr (_yysptr) +lea esi,(_yysbuf) +cmp edi,esi +jbe L118 +mov edi,dword ptr (_yysptr) +lea edi,(-1)[edi] +mov dword ptr (_yysptr),edi +movsx edi,byte ptr [edi] +mov dword ptr (-40)[ebp],edi +jmp L119 +L118: +mov edi,dword ptr (_yyin) +lea edi,(4)[edi] +mov esi,dword ptr [edi] +sub esi,1 +mov dword ptr [edi],esi +cmp esi,0 +jl L120 +mov edi,dword ptr (_yyin) +mov esi,dword ptr [edi] +lea ebx,(1)[esi] +mov dword ptr [edi],ebx +movsx edi,byte ptr [esi] +and edi,255 +mov dword ptr (-44)[ebp],edi +jmp L121 +L120: +mov edi,dword ptr (_yyin) +push edi +call __filbuf +add esp,4 +mov edi,eax +mov dword ptr (-44)[ebp],edi +L121: +mov edi,dword ptr (-44)[ebp] +mov dword ptr (-40)[ebp],edi +L119: +mov edi,dword ptr (-40)[ebp] +mov dword ptr (_yytchar),edi +cmp edi,10 +jne L116 +inc dword ptr (_yylineno) +mov edi,dword ptr (_yytchar) +mov dword ptr (-36)[ebp],edi +jmp L117 +L116: +mov edi,dword ptr (_yytchar) +mov dword ptr (-36)[ebp],edi +L117: +cmp dword ptr (-36)[ebp],-1 +jne L114 +mov dword ptr (-32)[ebp],0 +jmp L115 +L114: +mov edi,dword ptr (_yytchar) +mov dword ptr (-32)[ebp],edi +L115: +mov edi,dword ptr (-32)[ebp] +mov ebx,edi +mov byte ptr (_yytext),bl +movsx edi,bl +mov dword ptr (_yyprevious),edi +cmp dword ptr (_yyprevious),0 +jle L122 +mov edi,dword ptr (_yyout) +lea edi,(4)[edi] +mov esi,dword ptr [edi] +sub esi,1 +mov dword ptr [edi],esi +cmp esi,0 +jl L125 +mov edi,dword ptr (_yyout) +mov esi,dword ptr [edi] +lea ebx,(1)[esi] +mov dword ptr [edi],ebx +mov edi,dword ptr (_yyprevious) +mov ebx,edi +mov byte ptr [esi],bl +jmp L126 +L125: +mov edi,dword ptr (_yyout) +push edi +mov edi,dword ptr (_yyprevious) +push edi +call __flsbuf +add esp,8 +L126: +L122: +lea edi,(_yytext) +mov dword ptr (-16)[ebp],edi +jmp L37 +L34: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _yyback +_yyback: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +cmp edi,0 +jne L131 +mov eax,0 +jmp L127 +L130: +mov edi,dword ptr (20)[ebp] +lea esi,(4)[edi] +mov dword ptr (20)[ebp],esi +mov esi,dword ptr (24)[ebp] +cmp dword ptr [edi],esi +jne L133 +mov eax,1 +jmp L127 +L133: +L131: +mov edi,dword ptr (20)[ebp] +cmp dword ptr [edi],0 +jne L130 +mov eax,0 +L127: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _yyinput +_yyinput: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,16 +mov edi,dword ptr (_yysptr) +lea esi,(_yysbuf) +cmp edi,esi +jbe L144 +mov edi,dword ptr (_yysptr) +lea edi,(-1)[edi] +mov dword ptr (_yysptr),edi +movsx edi,byte ptr [edi] +mov dword ptr (-12)[ebp],edi +jmp L145 +L144: +mov edi,dword ptr (_yyin) +lea edi,(4)[edi] +mov esi,dword ptr [edi] +sub esi,1 +mov dword ptr [edi],esi +cmp esi,0 +jl L146 +mov edi,dword ptr (_yyin) +mov esi,dword ptr [edi] +lea ebx,(1)[esi] +mov dword ptr [edi],ebx +movsx edi,byte ptr [esi] +and edi,255 +mov dword ptr (-16)[ebp],edi +jmp L147 +L146: +mov edi,dword ptr (_yyin) +push edi +call __filbuf +add esp,4 +mov edi,eax +mov dword ptr (-16)[ebp],edi +L147: +mov edi,dword ptr (-16)[ebp] +mov dword ptr (-12)[ebp],edi +L145: +mov edi,dword ptr (-12)[ebp] +mov dword ptr (_yytchar),edi +cmp edi,10 +jne L142 +inc dword ptr (_yylineno) +mov edi,dword ptr (_yytchar) +mov dword ptr (-8)[ebp],edi +jmp L143 +L142: +mov edi,dword ptr (_yytchar) +mov dword ptr (-8)[ebp],edi +L143: +cmp dword ptr (-8)[ebp],-1 +jne L140 +mov dword ptr (-4)[ebp],0 +jmp L141 +L140: +mov edi,dword ptr (_yytchar) +mov dword ptr (-4)[ebp],edi +L141: +mov eax,dword ptr (-4)[ebp] +L135: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _yyoutput +_yyoutput: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (_yyout) +lea edi,(4)[edi] +mov esi,dword ptr [edi] +sub esi,1 +mov dword ptr [edi],esi +cmp esi,0 +jl L150 +mov edi,dword ptr (_yyout) +mov esi,dword ptr [edi] +lea ebx,(1)[esi] +mov dword ptr [edi],ebx +mov edi,dword ptr (20)[ebp] +mov ebx,edi +mov byte ptr [esi],bl +jmp L151 +L150: +mov edi,dword ptr (_yyout) +push edi +mov edi,dword ptr (20)[ebp] +push edi +call __flsbuf +add esp,8 +L151: +mov eax,0 +L148: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _yyunput +_yyunput: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +mov dword ptr (_yytchar),edi +cmp dword ptr (_yytchar),10 +jne L153 +dec dword ptr (_yylineno) +L153: +mov edi,dword ptr (_yysptr) +lea esi,(1)[edi] +mov dword ptr (_yysptr),esi +mov esi,dword ptr (_yytchar) +mov ebx,esi +mov byte ptr [edi],bl +mov eax,0 +L152: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _main +_main: +push ebx +push esi +push edi +push ebp +mov ebp,esp +call _yyparse +add esp,0 +mov eax,0 +L155: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _yyerror +_yyerror: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov edi,dword ptr (20)[ebp] +push edi +lea edi,(L157) +push edi +call _printf +add esp,8 +mov eax,0 +L156: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +public _yyexca +align 2 +_yyexca label byte +dw -1 +dw 1 +dw 0 +dw -1 +dw -2 +dw 0 +public _yyact +align 2 +_yyact label byte +dw 12 +dw 2 +dw 9 +dw 8 +dw 17 +dw 11 +dw 25 +dw 17 +dw 15 +dw 18 +dw 16 +dw 10 +dw 18 +dw 17 +dw 15 +dw 7 +dw 16 +dw 13 +dw 18 +dw 5 +dw 3 +dw 1 +dw 0 +dw 19 +dw 20 +dw 0 +dw 0 +dw 21 +dw 22 +dw 23 +dw 24 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 6 +dw 14 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 0 +dw 4 +dw 6 +public _yypact +align 2 +_yypact label byte +dw -1000 +dw -9 +dw -1000 +dw 5 +dw -7 +dw -59 +dw -1000 +dw -1000 +dw -1000 +dw -40 +dw -29 +dw -40 +dw -40 +dw -1000 +dw -1000 +dw -40 +dw -40 +dw -40 +dw -40 +dw -38 +dw -35 +dw -38 +dw -38 +dw -1000 +dw -1000 +dw -1000 +public _yypgo +align 2 +_yypgo label byte +dw 0 +dw 21 +dw 20 +dw 17 +dw 11 +public _yyr1 +align 2 +_yyr1 label byte +dw 0 +dw 1 +dw 1 +dw 1 +dw 1 +dw 2 +dw 4 +dw 4 +dw 4 +dw 4 +dw 4 +dw 4 +dw 4 +dw 4 +dw 3 +public _yyr2 +align 2 +_yyr2 label byte +dw 0 +dw 0 +dw 2 +dw 3 +dw 3 +dw 3 +dw 3 +dw 3 +dw 3 +dw 3 +dw 2 +dw 3 +dw 1 +dw 1 +dw 1 +public _yychk +align 2 +_yychk label byte +dw -1000 +dw -1 +dw 10 +dw -2 +dw 256 +dw -3 +dw 257 +dw 10 +dw 10 +dw 61 +dw -4 +dw 45 +dw 40 +dw -3 +dw 258 +dw 43 +dw 45 +dw 42 +dw 47 +dw -4 +dw -4 +dw -4 +dw -4 +dw -4 +dw -4 +dw 41 +public _yydef +align 2 +_yydef label byte +dw 1 +dw -2 +dw 2 +dw 0 +dw 0 +dw 0 +dw 14 +dw 3 +dw 4 +dw 0 +dw 5 +dw 0 +dw 0 +dw 12 +dw 13 +dw 0 +dw 0 +dw 0 +dw 0 +dw 10 +dw 0 +dw 6 +dw 7 +dw 8 +dw 9 +dw 11 +public _yychar +align 4 +_yychar label byte +dd -1 +public _yynerrs +align 4 +_yynerrs label byte +dd 0 +public _yyerrflag +align 2 +_yyerrflag label byte +dw 0 +public _yyparse +_DATA ends +_TEXT segment +_yyparse: +push ebx +push esi +push edi +push ebp +mov ebp,esp +sub esp,332 +mov word ptr (-6)[ebp],0 +mov dword ptr (_yychar),-1 +mov dword ptr (_yynerrs),0 +mov word ptr (_yyerrflag),0 +lea edi,(-328)[ebp] +mov dword ptr (-12)[ebp],edi +lea edi,(_yyv-4) +mov dword ptr (-20)[ebp],edi +L161: +mov edi,dword ptr (-12)[ebp] +lea edi,(2)[edi] +mov dword ptr (-12)[ebp],edi +lea esi,(-26)[ebp] +cmp edi,esi +jbe L162 +lea edi,(L165) +push edi +call _yyerror +add esp,4 +mov eax,1 +jmp L158 +L162: +mov edi,dword ptr (-12)[ebp] +mov si,word ptr (-6)[ebp] +mov word ptr [edi],si +mov edi,dword ptr (-20)[ebp] +lea edi,(4)[edi] +mov dword ptr (-20)[ebp],edi +mov edi,dword ptr (-20)[ebp] +mov esi,dword ptr (_yyval) +mov dword ptr [edi],esi +L166: +movsx edi,word ptr (-6)[ebp] +mov di,word ptr (_yypact)[edi*2] +mov word ptr (-14)[ebp],di +movsx edi,word ptr (-14)[ebp] +cmp edi,-1000 +jg L167 +jmp L169 +L167: +cmp dword ptr (_yychar),0 +jge L170 +call _yylex +add esp,0 +mov dword ptr (_yychar),eax +cmp eax,0 +jge L172 +mov dword ptr (_yychar),0 +L172: +L170: +movsx edi,word ptr (-14)[ebp] +mov esi,dword ptr (_yychar) +lea edi,[esi][edi] +mov word ptr (-14)[ebp],di +movsx edi,di +cmp edi,0 +jl L176 +movsx edi,word ptr (-14)[ebp] +cmp edi,249 +jl L174 +L176: +jmp L169 +L174: +movsx edi,word ptr (-14)[ebp] +mov di,word ptr (_yyact)[edi*2] +mov word ptr (-14)[ebp],di +movsx edi,di +movsx edi,word ptr (_yychk)[edi*2] +cmp edi,dword ptr (_yychar) +jne L177 +mov dword ptr (_yychar),-1 +mov edi,dword ptr (_yylval) +mov dword ptr (_yyval),edi +mov di,word ptr (-14)[ebp] +mov word ptr (-6)[ebp],di +movsx edi,word ptr (_yyerrflag) +cmp edi,0 +jle L161 +movsx edi,word ptr (_yyerrflag) +sub edi,1 +mov word ptr (_yyerrflag),di +jmp L161 +L177: +L169: +movsx edi,word ptr (-6)[ebp] +mov di,word ptr (_yydef)[edi*2] +mov word ptr (-14)[ebp],di +movsx edi,di +cmp edi,-2 +jne L181 +cmp dword ptr (_yychar),0 +jge L183 +call _yylex +add esp,0 +mov dword ptr (_yychar),eax +cmp eax,0 +jge L185 +mov dword ptr (_yychar),0 +L185: +L183: +lea edi,(_yyexca) +mov dword ptr (-24)[ebp],edi +jmp L190 +L187: +L188: +mov edi,dword ptr (-24)[ebp] +lea edi,(4)[edi] +mov dword ptr (-24)[ebp],edi +L190: +mov edi,dword ptr (-24)[ebp] +movsx esi,word ptr [edi] +cmp esi,-1 +jne L187 +movsx edi,word ptr (2)[edi] +movsx esi,word ptr (-6)[ebp] +cmp edi,esi +jne L187 +jmp L192 +L191: +mov edi,dword ptr (-24)[ebp] +movsx edi,word ptr [edi] +cmp edi,dword ptr (_yychar) +jne L194 +jmp L193 +L194: +L192: +mov edi,dword ptr (-24)[ebp] +lea edi,(4)[edi] +mov dword ptr (-24)[ebp],edi +movsx edi,word ptr [edi] +cmp edi,0 +jge L191 +L193: +mov edi,dword ptr (-24)[ebp] +mov di,word ptr (2)[edi] +mov word ptr (-14)[ebp],di +movsx edi,di +cmp edi,0 +jge L196 +mov eax,0 +jmp L158 +L196: +L181: +movsx edi,word ptr (-14)[ebp] +cmp edi,0 +jne L198 +movsx edi,word ptr (_yyerrflag) +mov dword ptr (-332)[ebp],edi +mov edi,dword ptr (-332)[ebp] +cmp edi,0 +jl L200 +cmp edi,3 +jg L200 +jmp dword ptr (L216)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L216 label byte +dd L203 +dd L206 +dd L206 +dd L213 +_TEXT ends +_TEXT segment +L203: +lea edi,(L204) +push edi +call _yyerror +add esp,4 +L205: +inc dword ptr (_yynerrs) +L206: +mov word ptr (_yyerrflag),3 +jmp L208 +L207: +mov edi,dword ptr (-12)[ebp] +movsx edi,word ptr [edi] +movsx edi,word ptr (_yypact)[edi*2] +lea edi,(256)[edi] +mov word ptr (-14)[ebp],di +movsx edi,word ptr (-14)[ebp] +cmp edi,0 +jl L210 +cmp edi,249 +jge L210 +movsx edi,word ptr (_yyact)[edi*2] +movsx edi,word ptr (_yychk)[edi*2] +cmp edi,256 +jne L210 +movsx edi,word ptr (-14)[ebp] +mov di,word ptr (_yyact)[edi*2] +mov word ptr (-6)[ebp],di +jmp L161 +L210: +mov edi,dword ptr (-12)[ebp] +movsx esi,word ptr [edi] +mov si,word ptr (_yypact)[esi*2] +mov word ptr (-14)[ebp],si +lea edi,(-2)[edi] +mov dword ptr (-12)[ebp],edi +mov edi,dword ptr (-20)[ebp] +lea edi,(-4)[edi] +mov dword ptr (-20)[ebp],edi +L208: +mov edi,dword ptr (-12)[ebp] +lea esi,(-326)[ebp] +cmp edi,esi +jae L207 +L212: +mov eax,1 +jmp L158 +L213: +cmp dword ptr (_yychar),0 +jne L214 +jmp L212 +L214: +mov dword ptr (_yychar),-1 +jmp L166 +L200: +L198: +mov di,word ptr (-14)[ebp] +movsx esi,di +lea esi,[esi*2] +lea ebx,(_yyr2)[esi] +mov edx,dword ptr (-12)[ebp] +movsx ecx,word ptr [ebx] +lea ecx,[ecx*2] +sub edx,ecx +mov dword ptr (-12)[ebp],edx +mov edx,dword ptr (-20)[ebp] +mov dword ptr (-4)[ebp],edx +movsx ebx,word ptr [ebx] +lea ebx,[ebx*4] +sub edx,ebx +mov dword ptr (-20)[ebp],edx +mov ebx,dword ptr (-20)[ebp] +mov ebx,dword ptr (4)[ebx] +mov dword ptr (_yyval),ebx +mov word ptr (-328)[ebp],di +mov di,word ptr (_yyr1)[esi] +mov word ptr (-14)[ebp],di +movsx edi,word ptr (-14)[ebp] +movsx edi,word ptr (_yypgo)[edi*2] +mov esi,dword ptr (-12)[ebp] +movsx esi,word ptr [esi] +lea edi,[esi][edi] +lea edi,(1)[edi] +mov word ptr (-26)[ebp],di +movsx edi,word ptr (-26)[ebp] +cmp edi,249 +jge L219 +mov di,word ptr (_yyact)[edi*2] +mov word ptr (-6)[ebp],di +movsx edi,di +movsx edi,word ptr (_yychk)[edi*2] +movsx esi,word ptr (-14)[ebp] +neg esi +cmp edi,esi +je L217 +L219: +movsx edi,word ptr (-14)[ebp] +movsx edi,word ptr (_yypgo)[edi*2] +mov di,word ptr (_yyact)[edi*2] +mov word ptr (-6)[ebp],di +L217: +movsx edi,word ptr (-328)[ebp] +mov dword ptr (-332)[ebp],edi +mov edi,dword ptr (-332)[ebp] +cmp edi,4 +jl L161 +cmp edi,14 +jg L161 +jmp dword ptr (L241-16)[edi*4] +_TEXT ends +_TEXT segment +align 4 +L241 label byte +dd L223 +dd L224 +dd L226 +dd L228 +dd L230 +dd L232 +dd L234 +dd L161 +dd L236 +dd L238 +dd L240 +_TEXT ends +_TEXT segment +L223: +mov word ptr (_yyerrflag),0 +jmp L161 +L224: +lea edi,(L225) +push edi +call _printf +add esp,4 +jmp L161 +L226: +lea edi,(L227) +push edi +call _printf +add esp,4 +jmp L161 +L228: +lea edi,(L229) +push edi +call _printf +add esp,4 +jmp L161 +L230: +lea edi,(L231) +push edi +call _printf +add esp,4 +jmp L161 +L232: +lea edi,(L233) +push edi +call _printf +add esp,4 +jmp L161 +L234: +lea edi,(L235) +push edi +call _printf +add esp,4 +jmp L161 +L236: +lea edi,(L237) +push edi +call _printf +add esp,4 +jmp L161 +L238: +lea edi,(_yytext) +push edi +lea edi,(L239) +push edi +call _printf +add esp,8 +jmp L161 +L240: +lea edi,(_yytext) +push edi +lea edi,(L157) +push edi +call _printf +add esp,8 +jmp L161 +L158: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +public _yywrap +_yywrap: +push ebx +push esi +push edi +push ebp +mov ebp,esp +mov eax,1 +L243: +mov esp,ebp +pop ebp +pop edi +pop esi +pop ebx +ret +_TEXT ends +_DATA segment +public _yyv +align 4 +_yyv label byte +db 600 dup (0) +public _yyfnd +align 4 +_yyfnd label byte +db 4 dup (0) +public _yyolsp +align 4 +_yyolsp label byte +db 4 dup (0) +public _yylsp +align 4 +_yylsp label byte +db 4 dup (0) +public _yylstate +align 4 +_yylstate label byte +db 800 dup (0) +public _yyestate +align 4 +_yyestate label byte +db 4 dup (0) +public _yytchar +align 4 +_yytchar label byte +db 4 dup (0) +public _yysbuf +align 1 +_yysbuf label byte +db 200 dup (0) +public _yymorfg +align 4 +_yymorfg label byte +db 4 dup (0) +public _yytext +align 1 +_yytext label byte +db 200 dup (0) +public _yyleng +align 4 +_yyleng label byte +db 4 dup (0) +_DATA ends +extrn _printf:near +_DATA segment +_DATA ends +extrn _fprintf:near +_DATA segment +_DATA ends +extrn __flsbuf:near +_DATA segment +_DATA ends +extrn __filbuf:near +_DATA segment +_DATA ends +extrn __iob:near +_DATA segment +public _yyval +align 4 +_yyval label byte +db 4 dup (0) +public _yylval +align 4 +_yylval label byte +db 4 dup (0) +_DATA ends +_TEXT segment +align 1 +L239 label byte +db 112 +db 117 +db 115 +db 104 +db 32 +db 37 +db 115 +db 10 +db 0 +align 1 +L237 label byte +db 108 +db 111 +db 97 +db 100 +db 10 +db 0 +align 1 +L235 label byte +db 110 +db 101 +db 103 +db 97 +db 116 +db 101 +db 10 +db 0 +align 1 +L233 label byte +db 100 +db 105 +db 118 +db 105 +db 100 +db 101 +db 10 +db 0 +align 1 +L231 label byte +db 109 +db 117 +db 108 +db 116 +db 105 +db 112 +db 108 +db 121 +db 10 +db 0 +align 1 +L229 label byte +db 110 +db 101 +db 103 +db 97 +db 116 +db 101 +db 10 +db 97 +db 100 +db 100 +db 10 +db 0 +align 1 +L227 label byte +db 97 +db 100 +db 100 +db 10 +db 0 +align 1 +L225 label byte +db 115 +db 116 +db 111 +db 114 +db 101 +db 10 +db 0 +align 1 +L204 label byte +db 115 +db 121 +db 110 +db 116 +db 97 +db 120 +db 32 +db 101 +db 114 +db 114 +db 111 +db 114 +db 0 +align 1 +L165 label byte +db 121 +db 97 +db 99 +db 99 +db 32 +db 115 +db 116 +db 97 +db 99 +db 107 +db 32 +db 111 +db 118 +db 101 +db 114 +db 102 +db 108 +db 111 +db 119 +db 0 +align 1 +L157 label byte +db 37 +db 115 +db 10 +db 0 +align 1 +L17 label byte +db 98 +db 97 +db 100 +db 32 +db 115 +db 119 +db 105 +db 116 +db 99 +db 104 +db 32 +db 121 +db 121 +db 108 +db 111 +db 111 +db 107 +db 32 +db 37 +db 100 +db 0 +_TEXT ends +end diff --git a/quake3/source/q3asm/Makefile b/quake3/source/q3asm/Makefile new file mode 100644 index 0000000..b53640a --- /dev/null +++ b/quake3/source/q3asm/Makefile @@ -0,0 +1,13 @@ +# yeah, couldn't do more simple really + +CC=gcc +CFLAGS=-g -Wall + +default: q3asm + +q3asm: q3asm.c cmdlib.c + $(CC) $(CFLAGS) -o $@ $^ + +clean: + rm -f q3asm *~ *.o + diff --git a/quake3/source/q3asm/README.Id b/quake3/source/q3asm/README.Id new file mode 100644 index 0000000..30f44b2 --- /dev/null +++ b/quake3/source/q3asm/README.Id @@ -0,0 +1,10 @@ +2002-10-25 Timothee Besset +If you are looking for a faster version of the q3asm tool, try: +http://www.icculus.org/~phaethon/q3/q3asm-turbo/q3asm-turbo.html + +2001-10-31 Timothee Besset +updated from the $/source/q3asm code +modified for portability and use with >= 1.31 mod source release + +the cmdlib.c cmdlib.h mathlib.h qfiles.h have been copied from +$/source/common diff --git a/quake3/source/q3asm/cmdlib.c b/quake3/source/q3asm/cmdlib.c new file mode 100644 index 0000000..f1d4f88 --- /dev/null +++ b/quake3/source/q3asm/cmdlib.c @@ -0,0 +1,1185 @@ +// cmdlib.c + +#include "cmdlib.h" +#include +#include + +#ifdef WIN32 +#include +#include +#endif + +#ifdef __linux +#include +#endif + +#ifdef NeXT +#include +#endif + +#define BASEDIRNAME "quake" // assumed to have a 2 or 3 following +#define PATHSEPERATOR '/' + +// set these before calling CheckParm +int myargc; +char **myargv; + +char com_token[1024]; +qboolean com_eof; + +qboolean archive; +char archivedir[1024]; + + +/* +=================== +ExpandWildcards + +Mimic unix command line expansion +=================== +*/ +#define MAX_EX_ARGC 1024 +int ex_argc; +char *ex_argv[MAX_EX_ARGC]; +#ifdef _WIN32 +#include "io.h" +void ExpandWildcards( int *argc, char ***argv ) +{ + struct _finddata_t fileinfo; + int handle; + int i; + char filename[1024]; + char filebase[1024]; + char *path; + + ex_argc = 0; + for (i=0 ; i<*argc ; i++) + { + path = (*argv)[i]; + if ( path[0] == '-' + || ( !strstr(path, "*") && !strstr(path, "?") ) ) + { + ex_argv[ex_argc++] = path; + continue; + } + + handle = _findfirst (path, &fileinfo); + if (handle == -1) + return; + + ExtractFilePath (path, filebase); + + do + { + sprintf (filename, "%s%s", filebase, fileinfo.name); + ex_argv[ex_argc++] = copystring (filename); + } while (_findnext( handle, &fileinfo ) != -1); + + _findclose (handle); + } + + *argc = ex_argc; + *argv = ex_argv; +} +#else +void ExpandWildcards (int *argc, char ***argv) +{ +} +#endif + +#ifdef WIN_ERROR +#include +/* +================= +Error + +For abnormal program terminations in windowed apps +================= +*/ +void Error( const char *error, ... ) +{ + va_list argptr; + char text[1024]; + char text2[1024]; + int err; + + err = GetLastError (); + + va_start (argptr,error); + vsprintf (text, error,argptr); + va_end (argptr); + + sprintf (text2, "%s\nGetLastError() = %i", text, err); + MessageBox(NULL, text2, "Error", 0 /* MB_OK */ ); + + exit (1); +} + +#else +/* +================= +Error + +For abnormal program terminations in console apps +================= +*/ +void Error( const char *error, ...) +{ + va_list argptr; + + _printf ("\n************ ERROR ************\n"); + + va_start (argptr,error); + vprintf (error,argptr); + va_end (argptr); + _printf ("\r\n"); + + exit (1); +} +#endif + +// only printf if in verbose mode +qboolean verbose = qfalse; +void qprintf( const char *format, ... ) { + va_list argptr; + + if (!verbose) + return; + + va_start (argptr,format); + vprintf (format,argptr); + va_end (argptr); + +} + +#ifdef WIN32 +HWND hwndOut = NULL; +qboolean lookedForServer = qfalse; +UINT wm_BroadcastCommand = -1; +#endif + +void _printf( const char *format, ... ) { + va_list argptr; + char text[4096]; +#ifdef WIN32 + ATOM a; +#endif + va_start (argptr,format); + vsprintf (text, format, argptr); + va_end (argptr); + + printf(text); + +#ifdef WIN32 + if (!lookedForServer) { + lookedForServer = qtrue; + hwndOut = FindWindow(NULL, "Q3Map Process Server"); + if (hwndOut) { + wm_BroadcastCommand = RegisterWindowMessage( "Q3MPS_BroadcastCommand" ); + } + } + if (hwndOut) { + a = GlobalAddAtom(text); + PostMessage(hwndOut, wm_BroadcastCommand, 0, (LPARAM)a); + } +#endif +} + + +/* + +qdir will hold the path up to the quake directory, including the slash + + f:\quake\ + /raid/quake/ + +gamedir will hold qdir + the game directory (id1, id2, etc) + + */ + +char qdir[1024]; +char gamedir[1024]; +char writedir[1024]; + +void SetQdirFromPath( const char *path ) +{ + char temp[1024]; + const char *c; + const char *sep; + int len, count; + + if (!(path[0] == '/' || path[0] == '\\' || path[1] == ':')) + { // path is partial + Q_getwd (temp); + strcat (temp, path); + path = temp; + } + + // search for "quake2" in path + + len = strlen(BASEDIRNAME); + for (c=path+strlen(path)-1 ; c != path ; c--) + { + int i; + + if (!Q_strncasecmp (c, BASEDIRNAME, len)) + { + // + //strncpy (qdir, path, c+len+2-path); + // the +2 assumes a 2 or 3 following quake which is not the + // case with a retail install + // so we need to add up how much to the next separator + sep = c + len; + count = 1; + while (*sep && *sep != '/' && *sep != '\\') + { + sep++; + count++; + } + strncpy (qdir, path, c+len+count-path); + qprintf ("qdir: %s\n", qdir); + for ( i = 0; i < strlen( qdir ); i++ ) + { + if ( qdir[i] == '\\' ) + qdir[i] = '/'; + } + + c += len+count; + while (*c) + { + if (*c == '/' || *c == '\\') + { + strncpy (gamedir, path, c+1-path); + + for ( i = 0; i < strlen( gamedir ); i++ ) + { + if ( gamedir[i] == '\\' ) + gamedir[i] = '/'; + } + + qprintf ("gamedir: %s\n", gamedir); + + if ( !writedir[0] ) + strcpy( writedir, gamedir ); + else if ( writedir[strlen( writedir )-1] != '/' ) + { + writedir[strlen( writedir )] = '/'; + writedir[strlen( writedir )+1] = 0; + } + + return; + } + c++; + } + Error ("No gamedir in %s", path); + return; + } + } + Error ("SetQdirFromPath: no '%s' in %s", BASEDIRNAME, path); +} + +char *ExpandArg (const char *path) +{ + static char full[1024]; + + if (path[0] != '/' && path[0] != '\\' && path[1] != ':') + { + Q_getwd (full); + strcat (full, path); + } + else + strcpy (full, path); + return full; +} + +char *ExpandPath (const char *path) +{ + static char full[1024]; + if (!qdir) + Error ("ExpandPath called without qdir set"); + if (path[0] == '/' || path[0] == '\\' || path[1] == ':') { + strcpy( full, path ); + return full; + } + sprintf (full, "%s%s", qdir, path); + return full; +} + +char *ExpandGamePath (const char *path) +{ + static char full[1024]; + if (!qdir) + Error ("ExpandGamePath called without qdir set"); + if (path[0] == '/' || path[0] == '\\' || path[1] == ':') { + strcpy( full, path ); + return full; + } + sprintf (full, "%s%s", gamedir, path); + return full; +} + +char *ExpandPathAndArchive (const char *path) +{ + char *expanded; + char archivename[1024]; + + expanded = ExpandPath (path); + + if (archive) + { + sprintf (archivename, "%s/%s", archivedir, path); + QCopyFile (expanded, archivename); + } + return expanded; +} + + +char *copystring(const char *s) +{ + char *b; + b = malloc(strlen(s)+1); + strcpy (b, s); + return b; +} + + + +/* +================ +I_FloatTime +================ +*/ +double I_FloatTime (void) +{ + time_t t; + + time (&t); + + return t; +#if 0 +// more precise, less portable + struct timeval tp; + struct timezone tzp; + static int secbase; + + gettimeofday(&tp, &tzp); + + if (!secbase) + { + secbase = tp.tv_sec; + return tp.tv_usec/1000000.0; + } + + return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0; +#endif +} + +void Q_getwd (char *out) +{ + int i = 0; + +#ifdef WIN32 + _getcwd (out, 256); + strcat (out, "\\"); +#else + getcwd (out, 256); + strcat (out, "/"); +#endif + + while ( out[i] != 0 ) + { + if ( out[i] == '\\' ) + out[i] = '/'; + i++; + } +} + + +void Q_mkdir (const char *path) +{ +#ifdef WIN32 + if (_mkdir (path) != -1) + return; +#else + if (mkdir (path, 0777) != -1) + return; +#endif + if (errno != EEXIST) + Error ("mkdir %s: %s",path, strerror(errno)); +} + +/* +============ +FileTime + +returns -1 if not present +============ +*/ +int FileTime (const char *path) +{ + struct stat buf; + + if (stat (path,&buf) == -1) + return -1; + + return buf.st_mtime; +} + + + +/* +============== +COM_Parse + +Parse a token out of a string +============== +*/ +char *COM_Parse (char *data) +{ + int c; + int len; + + len = 0; + com_token[0] = 0; + + if (!data) + return NULL; + +// skip whitespace +skipwhite: + while ( (c = *data) <= ' ') + { + if (c == 0) + { + com_eof = qtrue; + return NULL; // end of file; + } + data++; + } + +// skip // comments + if (c=='/' && data[1] == '/') + { + while (*data && *data != '\n') + data++; + goto skipwhite; + } + + +// handle quoted strings specially + if (c == '\"') + { + data++; + do + { + c = *data++; + if (c=='\"') + { + com_token[len] = 0; + return data; + } + com_token[len] = c; + len++; + } while (1); + } + +// parse single characters + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':') + { + com_token[len] = c; + len++; + com_token[len] = 0; + return data+1; + } + +// parse a regular word + do + { + com_token[len] = c; + data++; + len++; + c = *data; + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':') + break; + } while (c>32); + + com_token[len] = 0; + return data; +} + + +int Q_strncasecmp (const char *s1, const char *s2, int n) +{ + int c1, c2; + + do + { + c1 = *s1++; + c2 = *s2++; + + if (!n--) + return 0; // strings are equal until end point + + if (c1 != c2) + { + if (c1 >= 'a' && c1 <= 'z') + c1 -= ('a' - 'A'); + if (c2 >= 'a' && c2 <= 'z') + c2 -= ('a' - 'A'); + if (c1 != c2) + return -1; // strings not equal + } + } while (c1); + + return 0; // strings are equal +} + +int Q_stricmp (const char *s1, const char *s2) +{ + return Q_strncasecmp (s1, s2, 99999); +} + + +char *strupr (char *start) +{ + char *in; + in = start; + while (*in) + { + *in = toupper(*in); + in++; + } + return start; +} + +char *strlower (char *start) +{ + char *in; + in = start; + while (*in) + { + *in = tolower(*in); + in++; + } + return start; +} + + +/* +============================================================================= + + MISC FUNCTIONS + +============================================================================= +*/ + + +/* +================= +CheckParm + +Checks for the given parameter in the program's command line arguments +Returns the argument number (1 to argc-1) or 0 if not present +================= +*/ +int CheckParm (const char *check) +{ + int i; + + for (i = 1;i 0) { + nAllocSize += MEM_BLOCKSIZE - nBlock; + } + buffer = malloc (nAllocSize+1); + memset(buffer, 0, nAllocSize+1); + SafeRead (f, buffer, length); + fclose (f); + + *bufferptr = buffer; + return length; +} + + +/* +============== +TryLoadFile + +Allows failure +============== +*/ +int TryLoadFile (const char *filename, void **bufferptr) +{ + FILE *f; + int length; + void *buffer; + + *bufferptr = NULL; + + f = fopen (filename, "rb"); + if (!f) + return -1; + length = Q_filelength (f); + buffer = malloc (length+1); + ((char *)buffer)[length] = 0; + SafeRead (f, buffer, length); + fclose (f); + + *bufferptr = buffer; + return length; +} + + +/* +============== +SaveFile +============== +*/ +void SaveFile (const char *filename, const void *buffer, int count) +{ + FILE *f; + + f = SafeOpenWrite (filename); + SafeWrite (f, buffer, count); + fclose (f); +} + + + +void DefaultExtension (char *path, const char *extension) +{ + char *src; +// +// if path doesnt have a .EXT, append extension +// (extension should include the .) +// + src = path + strlen(path) - 1; + + while (*src != '/' && *src != '\\' && src != path) + { + if (*src == '.') + return; // it has an extension + src--; + } + + strcat (path, extension); +} + + +void DefaultPath (char *path, const char *basepath) +{ + char temp[128]; + + if (path[0] == PATHSEPERATOR) + return; // absolute path location + strcpy (temp,path); + strcpy (path,basepath); + strcat (path,temp); +} + + +void StripFilename (char *path) +{ + int length; + + length = strlen(path)-1; + while (length > 0 && path[length] != PATHSEPERATOR) + length--; + path[length] = 0; +} + +void StripExtension (char *path) +{ + int length; + + length = strlen(path)-1; + while (length > 0 && path[length] != '.') + { + length--; + if (path[length] == '/') + return; // no extension + } + if (length) + path[length] = 0; +} + + +/* +==================== +Extract file parts +==================== +*/ +// FIXME: should include the slash, otherwise +// backing to an empty path will be wrong when appending a slash +void ExtractFilePath (const char *path, char *dest) +{ + const char *src; + + src = path + strlen(path) - 1; + +// +// back up until a \ or the start +// + while (src != path && *(src-1) != '\\' && *(src-1) != '/') + src--; + + memcpy (dest, path, src-path); + dest[src-path] = 0; +} + +void ExtractFileBase (const char *path, char *dest) +{ + const char *src; + + src = path + strlen(path) - 1; + +// +// back up until a \ or the start +// + while (src != path && *(src-1) != PATHSEPERATOR) + src--; + + while (*src && *src != '.') + { + *dest++ = *src++; + } + *dest = 0; +} + +void ExtractFileExtension (const char *path, char *dest) +{ + const char *src; + + src = path + strlen(path) - 1; + +// +// back up until a . or the start +// + while (src != path && *(src-1) != '.') + src--; + if (src == path) + { + *dest = 0; // no extension + return; + } + + strcpy (dest,src); +} + + +/* +============== +ParseNum / ParseHex +============== +*/ +int ParseHex (const char *hex) +{ + const char *str; + int num; + + num = 0; + str = hex; + + while (*str) + { + num <<= 4; + if (*str >= '0' && *str <= '9') + num += *str-'0'; + else if (*str >= 'a' && *str <= 'f') + num += 10 + *str-'a'; + else if (*str >= 'A' && *str <= 'F') + num += 10 + *str-'A'; + else + Error ("Bad hex number: %s",hex); + str++; + } + + return num; +} + + +int ParseNum (const char *str) +{ + if (str[0] == '$') + return ParseHex (str+1); + if (str[0] == '0' && str[1] == 'x') + return ParseHex (str+2); + return atol (str); +} + + + +/* +============================================================================ + + BYTE ORDER FUNCTIONS + +============================================================================ +*/ + +#ifdef _SGI_SOURCE +#define __BIG_ENDIAN__ +#endif + +#ifdef __BIG_ENDIAN__ + +short LittleShort (short l) +{ + byte b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; +} + +short BigShort (short l) +{ + return l; +} + + +int LittleLong (int l) +{ + byte b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; +} + +int BigLong (int l) +{ + return l; +} + + +float LittleFloat (float l) +{ + union {byte b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; +} + +float BigFloat (float l) +{ + return l; +} + + +#else + + +short BigShort (short l) +{ + byte b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; +} + +short LittleShort (short l) +{ + return l; +} + + +int BigLong (int l) +{ + byte b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; +} + +int LittleLong (int l) +{ + return l; +} + +float BigFloat (float l) +{ + union {byte b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; +} + +float LittleFloat (float l) +{ + return l; +} + + +#endif + + +//======================================================= + + +// FIXME: byte swap? + +// this is a 16 bit, non-reflected CRC using the polynomial 0x1021 +// and the initial and final xor values shown below... in other words, the +// CCITT standard CRC used by XMODEM + +#define CRC_INIT_VALUE 0xffff +#define CRC_XOR_VALUE 0x0000 + +static unsigned short crctable[256] = +{ + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +void CRC_Init(unsigned short *crcvalue) +{ + *crcvalue = CRC_INIT_VALUE; +} + +void CRC_ProcessByte(unsigned short *crcvalue, byte data) +{ + *crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data]; +} + +unsigned short CRC_Value(unsigned short crcvalue) +{ + return crcvalue ^ CRC_XOR_VALUE; +} +//============================================================================= + +/* +============ +CreatePath +============ +*/ +void CreatePath (const char *path) +{ + const char *ofs; + char c; + char dir[1024]; + +#ifdef _WIN32 + int olddrive = -1; + + if ( path[1] == ':' ) + { + olddrive = _getdrive(); + _chdrive( toupper( path[0] ) - 'A' + 1 ); + } +#endif + + if (path[1] == ':') + path += 2; + + for (ofs = path+1 ; *ofs ; ofs++) + { + c = *ofs; + if (c == '/' || c == '\\') + { // create the directory + memcpy( dir, path, ofs - path ); + dir[ ofs - path ] = 0; + Q_mkdir( dir ); + } + } + +#ifdef _WIN32 + if ( olddrive != -1 ) + { + _chdrive( olddrive ); + } +#endif +} + + +/* +============ +QCopyFile + + Used to archive source files +============ +*/ +void QCopyFile (const char *from, const char *to) +{ + void *buffer; + int length; + + length = LoadFile (from, &buffer); + CreatePath (to); + SaveFile (to, buffer, length); + free (buffer); +} diff --git a/quake3/source/q3asm/cmdlib.h b/quake3/source/q3asm/cmdlib.h new file mode 100644 index 0000000..2cfd0dd --- /dev/null +++ b/quake3/source/q3asm/cmdlib.h @@ -0,0 +1,139 @@ +// cmdlib.h + +#ifndef __CMDLIB__ +#define __CMDLIB__ + +#ifdef _WIN32 +#pragma warning(disable : 4244) // MIPS +#pragma warning(disable : 4136) // X86 +#pragma warning(disable : 4051) // ALPHA + +#pragma warning(disable : 4018) // signed/unsigned mismatch +#pragma warning(disable : 4305) // truncate from double to float + +#pragma check_stack(off) + +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 + +#pragma intrinsic( memset, memcpy ) + +#endif + +#ifndef __BYTEBOOL__ +#define __BYTEBOOL__ +typedef enum { qfalse, qtrue } qboolean; +typedef unsigned char byte; +#endif + +#define MAX_OS_PATH 1024 +#define MEM_BLOCKSIZE 4096 + +// the dec offsetof macro doesnt work very well... +#define myoffsetof(type,identifier) ((size_t)&((type *)0)->identifier) + + +// set these before calling CheckParm +extern int myargc; +extern char **myargv; + +char *strupr (char *in); +char *strlower (char *in); +int Q_strncasecmp( const char *s1, const char *s2, int n ); +int Q_stricmp( const char *s1, const char *s2 ); +void Q_getwd( char *out ); + +int Q_filelength (FILE *f); +int FileTime( const char *path ); + +void Q_mkdir( const char *path ); + +extern char qdir[1024]; +extern char gamedir[1024]; +extern char writedir[1024]; +void SetQdirFromPath( const char *path ); +char *ExpandArg( const char *path ); // from cmd line +char *ExpandPath( const char *path ); // from scripts +char *ExpandGamePath (const char *path); +char *ExpandPathAndArchive( const char *path ); + + +double I_FloatTime( void ); + +void Error( const char *error, ... ); +int CheckParm( const char *check ); + +FILE *SafeOpenWrite( const char *filename ); +FILE *SafeOpenRead( const char *filename ); +void SafeRead (FILE *f, void *buffer, int count); +void SafeWrite (FILE *f, const void *buffer, int count); + +int LoadFile( const char *filename, void **bufferptr ); +int LoadFileBlock( const char *filename, void **bufferptr ); +int TryLoadFile( const char *filename, void **bufferptr ); +void SaveFile( const char *filename, const void *buffer, int count ); +qboolean FileExists( const char *filename ); + +void DefaultExtension( char *path, const char *extension ); +void DefaultPath( char *path, const char *basepath ); +void StripFilename( char *path ); +void StripExtension( char *path ); + +void ExtractFilePath( const char *path, char *dest ); +void ExtractFileBase( const char *path, char *dest ); +void ExtractFileExtension( const char *path, char *dest ); + +int ParseNum (const char *str); + +short BigShort (short l); +short LittleShort (short l); +int BigLong (int l); +int LittleLong (int l); +float BigFloat (float l); +float LittleFloat (float l); + + +char *COM_Parse (char *data); + +extern char com_token[1024]; +extern qboolean com_eof; + +char *copystring(const char *s); + + +void CRC_Init(unsigned short *crcvalue); +void CRC_ProcessByte(unsigned short *crcvalue, byte data); +unsigned short CRC_Value(unsigned short crcvalue); + +void CreatePath( const char *path ); +void QCopyFile( const char *from, const char *to ); + +extern qboolean archive; +extern char archivedir[1024]; + + +extern qboolean verbose; +void qprintf( const char *format, ... ); +void _printf( const char *format, ... ); + +void ExpandWildcards( int *argc, char ***argv ); + + +// for compression routines +typedef struct +{ + void *data; + int count, width, height; +} cblock_t; + + +#endif diff --git a/quake3/source/q3asm/lib.txt b/quake3/source/q3asm/lib.txt new file mode 100644 index 0000000..7abf270 --- /dev/null +++ b/quake3/source/q3asm/lib.txt @@ -0,0 +1,31 @@ + +strlen +strcasecmp +tolower +strcat +strncpy +strcmp +strcpy +strchr + +vsprintf + +memcpy +memset +rand + +atoi +atof + +abs + +floor +fabs +tan +atan +sqrt +log +cos +sin +atan2 + diff --git a/quake3/source/q3asm/mathlib.h b/quake3/source/q3asm/mathlib.h new file mode 100644 index 0000000..903eae3 --- /dev/null +++ b/quake3/source/q3asm/mathlib.h @@ -0,0 +1,73 @@ +#ifndef __MATHLIB__ +#define __MATHLIB__ + +// mathlib.h + +#include + +#ifdef DOUBLEVEC_T +typedef double vec_t; +#else +typedef float vec_t; +#endif +typedef vec_t vec2_t[3]; +typedef vec_t vec3_t[3]; +typedef vec_t vec4_t[4]; + +#define SIDE_FRONT 0 +#define SIDE_ON 2 +#define SIDE_BACK 1 +#define SIDE_CROSS -2 + +#define Q_PI 3.14159265358979323846 +#define DEG2RAD( a ) ( ( (a) * Q_PI ) / 180.0F ) +#define RAD2DEG( a ) ( ( (a) * 180.0f ) / Q_PI ) + +extern vec3_t vec3_origin; + +#define EQUAL_EPSILON 0.001 + +// plane types are used to speed some tests +// 0-2 are axial planes +#define PLANE_X 0 +#define PLANE_Y 1 +#define PLANE_Z 2 +#define PLANE_NON_AXIAL 3 + +qboolean VectorCompare( const vec3_t v1, const vec3_t v2 ); + +#define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2]) +#define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];} +#define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];} +#define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];} +#define VectorScale(a,b,c) {c[0]=b*a[0];c[1]=b*a[1];c[2]=b*a[2];} +#define VectorClear(x) {x[0] = x[1] = x[2] = 0;} +#define VectorNegate(x) {x[0]=-x[0];x[1]=-x[1];x[2]=-x[2];} +void Vec10Copy( vec_t *in, vec_t *out ); + +vec_t Q_rint (vec_t in); +vec_t _DotProduct (vec3_t v1, vec3_t v2); +void _VectorSubtract (vec3_t va, vec3_t vb, vec3_t out); +void _VectorAdd (vec3_t va, vec3_t vb, vec3_t out); +void _VectorCopy (vec3_t in, vec3_t out); +void _VectorScale (vec3_t v, vec_t scale, vec3_t out); + +double VectorLength( const vec3_t v ); + +void VectorMA( const vec3_t va, double scale, const vec3_t vb, vec3_t vc ); + +void CrossProduct( const vec3_t v1, const vec3_t v2, vec3_t cross ); +vec_t VectorNormalize( const vec3_t in, vec3_t out ); +vec_t ColorNormalize( const vec3_t in, vec3_t out ); +void VectorInverse (vec3_t v); + +void ClearBounds (vec3_t mins, vec3_t maxs); +void AddPointToBounds( const vec3_t v, vec3_t mins, vec3_t maxs ); + +qboolean PlaneFromPoints( vec4_t plane, const vec3_t a, const vec3_t b, const vec3_t c ); + +void NormalToLatLong( const vec3_t normal, byte bytes[2] ); + +int PlaneTypeForNormal (vec3_t normal); + +#endif diff --git a/quake3/source/q3asm/notes.txt b/quake3/source/q3asm/notes.txt new file mode 100644 index 0000000..4a016f0 --- /dev/null +++ b/quake3/source/q3asm/notes.txt @@ -0,0 +1,16 @@ + +don't do any paramter conversion (double to float, etc) + + + +Why? + +Security. +Portability. + +It may be more aproachable. + +can still use regular dlls for development purposes + +lcc +q3asm diff --git a/quake3/source/q3asm/ops.txt b/quake3/source/q3asm/ops.txt new file mode 100644 index 0000000..992e288 --- /dev/null +++ b/quake3/source/q3asm/ops.txt @@ -0,0 +1,132 @@ +CNSTF, +CNSTI, +CNSTP, +CNSTU, + +ARGB, +ARGF, +ARGI, +ARGP, +ARGU, + +ASGNB, +ASGNF, +ASGNI, +ASGNP, +ASGNU, + +INDIRB, +INDIRF, +INDIRI, +INDIRP, +INDIRU, + +CVFF, +CVFI, + +CVIF, +CVII, +CVIU, + +CVPU, + +CVUI, +CVUP, +CVUU, + +NEGF, +NEGI, + +CALLB, +CALLF, +CALLI, +CALLP, +CALLU, +CALLV, + +RETF, +RETI, +RETP, +RETU, +RETV, + +ADDRGP, + +ADDRFP, + +ADDRLP, + +ADDF, +ADDI, +ADDP, +ADDU, + +SUBF, +SUBI, +SUBP, +SUBU, + +LSHI, +LSHU, + +MODI, +MODU, + +RSHI, +RSHU, + +BANDI, +BANDU, + +BCOMI, +BCOMU, + +BORI, +BORU, + +BXORI, +BXORU, + +DIVF, +DIVI, +DIVU, + +MULF, +MULI, +MULU, + +EQF, +EQI, +EQU, + +GEF, +GEI, +GEU, + +GTF, +GTI, +GTU, + +LEF, +LEI, +LEU, + +LTF, +LTI, +LTU, + +NEF, +NEI, +NEU, + +JUMPV, + +LABELV, + +LOADB, +LOADF, +LOADI, +LOADP, +LOADU, + + diff --git a/quake3/source/q3asm/opstrings.h b/quake3/source/q3asm/opstrings.h new file mode 100644 index 0000000..06698af --- /dev/null +++ b/quake3/source/q3asm/opstrings.h @@ -0,0 +1,154 @@ +{ "BREAK", OP_BREAK }, + +{ "CNSTF4", OP_CONST }, +{ "CNSTI4", OP_CONST }, +{ "CNSTP4", OP_CONST }, +{ "CNSTU4", OP_CONST }, + +{ "CNSTI2", OP_CONST }, +{ "CNSTU2", OP_CONST }, + +{ "CNSTI1", OP_CONST }, +{ "CNSTU1", OP_CONST }, + +//{ "ARGB", OP_ARG }, +//{ "ARGF", OP_ARG }, +//{ "ARGI", OP_ARG }, +//{ "ARGP", OP_ARG }, +//{ "ARGU", OP_ARG }, + +{ "ASGNB", OP_BLOCK_COPY }, +{ "ASGNF4", OP_STORE4 }, +{ "ASGNI4", OP_STORE4 }, +{ "ASGNP4", OP_STORE4 }, +{ "ASGNU4", OP_STORE4 }, + +{ "ASGNI2", OP_STORE2 }, +{ "ASGNU2", OP_STORE2 }, + +{ "ASGNI1", OP_STORE1 }, +{ "ASGNU1", OP_STORE1 }, + +{ "INDIRB", OP_IGNORE }, // block copy deals with this +{ "INDIRF4", OP_LOAD4 }, +{ "INDIRI4", OP_LOAD4 }, +{ "INDIRP4", OP_LOAD4 }, +{ "INDIRU4", OP_LOAD4 }, + +{ "INDIRI2", OP_LOAD2 }, +{ "INDIRU2", OP_LOAD2 }, + +{ "INDIRI1", OP_LOAD1 }, +{ "INDIRU1", OP_LOAD1 }, + +{ "CVFF4", OP_UNDEF }, +{ "CVFI4", OP_CVFI }, + +{ "CVIF4", OP_CVIF }, +{ "CVII4", OP_SEX8 }, // will be either SEX8 or SEX16 +{ "CVII1", OP_IGNORE }, +{ "CVII2", OP_IGNORE }, +{ "CVIU4", OP_IGNORE }, + +{ "CVPU4", OP_IGNORE }, + +{ "CVUI4", OP_IGNORE }, +{ "CVUP4", OP_IGNORE }, +{ "CVUU4", OP_IGNORE }, + +{ "CVUU1", OP_IGNORE }, + +{ "NEGF4", OP_NEGF }, +{ "NEGI4", OP_NEGI }, + +//{ "CALLB", OP_UNDEF }, +//{ "CALLF", OP_UNDEF }, +//{ "CALLI", OP_UNDEF }, +//{ "CALLP", OP_UNDEF }, +//{ "CALLU", OP_UNDEF }, +//{ "CALLV", OP_CALL }, + +//{ "RETF", OP_UNDEF }, +//{ "RETI", OP_UNDEF }, +//{ "RETP", OP_UNDEF }, +//{ "RETU", OP_UNDEF }, +//{ "RETV", OP_UNDEF }, + +{ "ADDRGP4", OP_CONST }, + +//{ "ADDRFP", OP_PARM }, +//{ "ADDRLP", OP_LOCAL }, + +{ "ADDF4", OP_ADDF }, +{ "ADDI4", OP_ADD }, +{ "ADDP4", OP_ADD }, +{ "ADDP", OP_ADD }, +{ "ADDU4", OP_ADD }, + +{ "SUBF4", OP_SUBF }, +{ "SUBI4", OP_SUB }, +{ "SUBP4", OP_SUB }, +{ "SUBU4", OP_SUB }, + +{ "LSHI4", OP_LSH }, +{ "LSHU4", OP_LSH }, + +{ "MODI4", OP_MODI }, +{ "MODU4", OP_MODU }, + +{ "RSHI4", OP_RSHI }, +{ "RSHU4", OP_RSHU }, + +{ "BANDI4", OP_BAND }, +{ "BANDU4", OP_BAND }, + +{ "BCOMI4", OP_BCOM }, +{ "BCOMU4", OP_BCOM }, + +{ "BORI4", OP_BOR }, +{ "BORU4", OP_BOR }, + +{ "BXORI4", OP_BXOR }, +{ "BXORU4", OP_BXOR }, + +{ "DIVF4", OP_DIVF }, +{ "DIVI4", OP_DIVI }, +{ "DIVU4", OP_DIVU }, + +{ "MULF4", OP_MULF }, +{ "MULI4", OP_MULI }, +{ "MULU4", OP_MULU }, + +{ "EQF4", OP_EQF }, +{ "EQI4", OP_EQ }, +{ "EQU4", OP_EQ }, + +{ "GEF4", OP_GEF }, +{ "GEI4", OP_GEI }, +{ "GEU4", OP_GEU }, + +{ "GTF4", OP_GTF }, +{ "GTI4", OP_GTI }, +{ "GTU4", OP_GTU }, + +{ "LEF4", OP_LEF }, +{ "LEI4", OP_LEI }, +{ "LEU4", OP_LEU }, + +{ "LTF4", OP_LTF }, +{ "LTI4", OP_LTI }, +{ "LTU4", OP_LTU }, + +{ "NEF4", OP_NEF }, +{ "NEI4", OP_NE }, +{ "NEU4", OP_NE }, + +{ "JUMPV", OP_JUMP }, + +{ "LOADB4", OP_UNDEF }, +{ "LOADF4", OP_UNDEF }, +{ "LOADI4", OP_UNDEF }, +{ "LOADP4", OP_UNDEF }, +{ "LOADU4", OP_UNDEF }, + + diff --git a/quake3/source/q3asm/q3asm.c b/quake3/source/q3asm/q3asm.c new file mode 100644 index 0000000..e5af262 --- /dev/null +++ b/quake3/source/q3asm/q3asm.c @@ -0,0 +1,1026 @@ + +#include "cmdlib.h" +#include "mathlib.h" +#include "qfiles.h" + +/* MSVC-ism fix. */ +#define atoi(s) strtoul(s,NULL,10) + +char outputFilename[MAX_OS_PATH]; + +// the zero page size is just used for detecting run time faults +#define ZERO_PAGE_SIZE 0 // 256 + +typedef enum { + OP_UNDEF, + + OP_IGNORE, + + OP_BREAK, + + OP_ENTER, + OP_LEAVE, + OP_CALL, + OP_PUSH, + OP_POP, + + OP_CONST, + OP_LOCAL, + + OP_JUMP, + + //------------------- + + OP_EQ, + OP_NE, + + OP_LTI, + OP_LEI, + OP_GTI, + OP_GEI, + + OP_LTU, + OP_LEU, + OP_GTU, + OP_GEU, + + OP_EQF, + OP_NEF, + + OP_LTF, + OP_LEF, + OP_GTF, + OP_GEF, + + //------------------- + + OP_LOAD1, + OP_LOAD2, + OP_LOAD4, + OP_STORE1, + OP_STORE2, + OP_STORE4, // *(stack[top-1]) = stack[yop + OP_ARG, + OP_BLOCK_COPY, + + //------------------- + + OP_SEX8, + OP_SEX16, + + OP_NEGI, + OP_ADD, + OP_SUB, + OP_DIVI, + OP_DIVU, + OP_MODI, + OP_MODU, + OP_MULI, + OP_MULU, + + OP_BAND, + OP_BOR, + OP_BXOR, + OP_BCOM, + + OP_LSH, + OP_RSHI, + OP_RSHU, + + OP_NEGF, + OP_ADDF, + OP_SUBF, + OP_DIVF, + OP_MULF, + + OP_CVIF, + OP_CVFI +} opcode_t; + +typedef struct { + int imageBytes; // after decompression + int entryPoint; + int stackBase; + int stackSize; +} executableHeader_t; + +typedef enum { + CODESEG, + DATASEG, // initialized 32 bit data, will be byte swapped + LITSEG, // strings + BSSSEG, // 0 filled + NUM_SEGMENTS +} segmentName_t; + +#define MAX_IMAGE 0x400000 + +typedef struct { + byte image[MAX_IMAGE]; + int imageUsed; + int segmentBase; // only valid on second pass +} segment_t; + +typedef struct symbol_s { + struct symbol_s *next; + int hash; + segment_t *segment; + char *name; + int value; +} symbol_t; + + +segment_t segment[NUM_SEGMENTS]; +segment_t *currentSegment; + +int passNumber; + +int numSymbols; +int errorCount; + +symbol_t *symbols; +symbol_t *lastSymbol; + + +#define MAX_ASM_FILES 256 +int numAsmFiles; +char *asmFiles[MAX_ASM_FILES]; +char *asmFileNames[MAX_ASM_FILES]; + +int currentFileIndex; +char *currentFileName; +int currentFileLine; + +//int stackSize = 16384; +int stackSize = 0x10000; + +// we need to convert arg and ret instructions to +// stores to the local stack frame, so we need to track the +// characteristics of the current functions stack frame +int currentLocals; // bytes of locals needed by this function +int currentArgs; // bytes of largest argument list called from this function +int currentArgOffset; // byte offset in currentArgs to store next arg, reset each call + +#define MAX_LINE_LENGTH 1024 +char lineBuffer[MAX_LINE_LENGTH]; +int lineParseOffset; +char token[MAX_LINE_LENGTH]; + +int instructionCount; + +typedef struct { + char *name; + int opcode; +} sourceOps_t; + +sourceOps_t sourceOps[] = { +#include "opstrings.h" +}; + +#define NUM_SOURCE_OPS ( sizeof( sourceOps ) / sizeof( sourceOps[0] ) ) + +int opcodesHash[ NUM_SOURCE_OPS ]; + + +/* +============= +HashString +============= +*/ +int HashString( char *s ) { + int v = 0; + + while ( *s ) { + v += *s; + s++; + } + return v; +} + + +/* +============ +CodeError +============ +*/ +void CodeError( char *fmt, ... ) { + va_list argptr; + + errorCount++; + + printf( "%s:%i ", currentFileName, currentFileLine ); + + va_start( argptr,fmt ); + vprintf( fmt,argptr ); + va_end( argptr ); +} + +/* +============ +EmitByte +============ +*/ +void EmitByte( segment_t *seg, int v ) { + if ( seg->imageUsed >= MAX_IMAGE ) { + Error( "MAX_IMAGE" ); + } + seg->image[ seg->imageUsed ] = v; + seg->imageUsed++; +} + +/* +============ +EmitInt +============ +*/ +void EmitInt( segment_t *seg, int v ) { + if ( seg->imageUsed >= MAX_IMAGE - 4) { + Error( "MAX_IMAGE" ); + } + seg->image[ seg->imageUsed ] = v & 255; + seg->image[ seg->imageUsed + 1 ] = ( v >> 8 ) & 255; + seg->image[ seg->imageUsed + 2 ] = ( v >> 16 ) & 255; + seg->image[ seg->imageUsed + 3 ] = ( v >> 24 ) & 255; + seg->imageUsed += 4; +} + +/* +============ +DefineSymbol + +Symbols can only be defined on pass 0 +============ +*/ +void DefineSymbol( char *sym, int value ) { + symbol_t *s, *after; + char expanded[MAX_LINE_LENGTH]; + int hash; + + if ( passNumber == 1 ) { + return; + } + + // TTimo + // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=381 + // as a security, bail out if vmMain entry point is not first + if (!Q_stricmp(sym, "vmMain")) + if (value) + Error( "vmMain must be the first symbol in the qvm (got offset %d)\n", value ); + + // add the file prefix to local symbols to guarantee unique + if ( sym[0] == '$' ) { + sprintf( expanded, "%s_%i", sym, currentFileIndex ); + sym = expanded; + } + + hash = HashString( sym ); + + for ( s = symbols ; s ; s = s->next ) { + if ( hash == s->hash && !strcmp( sym, s->name ) ) { + CodeError( "Multiple definitions for %s\n", sym ); + return; + } + } + + s = malloc( sizeof( *s ) ); + s->name = copystring( sym ); + s->hash = hash; + s->value = value; + s->segment = currentSegment; + + lastSymbol = s; /* for the move-to-lit-segment byteswap hack */ + + // insert it in order + if ( !symbols || s->value < symbols->value ) { + s->next = symbols; + symbols = s; + return; + } + + for ( after = symbols ; after->next && after->next->value < value ; after = after->next ) { + } + s->next = after->next; + after->next = s; +} + + +/* +============ +LookupSymbol + +Symbols can only be evaluated on pass 1 +============ +*/ +int LookupSymbol( char *sym ) { + symbol_t *s; + char expanded[MAX_LINE_LENGTH]; + int hash; + + if ( passNumber == 0 ) { + return 0; + } + + // add the file prefix to local symbols to guarantee unique + if ( sym[0] == '$' ) { + sprintf( expanded, "%s_%i", sym, currentFileIndex ); + sym = expanded; + } + + hash = HashString( sym ); + for ( s = symbols ; s ; s = s->next ) { + if ( hash == s->hash && !strcmp( sym, s->name ) ) { + return s->segment->segmentBase + s->value; + } + } + + CodeError( "ERROR: symbol %s undefined\n", sym ); + passNumber = 0; + DefineSymbol( sym, 0 ); // so more errors aren't printed + passNumber = 1; + return 0; +} + + +/* +============== +ExtractLine + +Extracts the next line from the given text block. +If a full line isn't parsed, returns NULL +Otherwise returns the updated parse pointer +=============== +*/ +char *ExtractLine( char *data ) { + int i; + + currentFileLine++; + lineParseOffset = 0; + token[0] = 0; + + if ( data[0] == 0 ) { + lineBuffer[0] = 0; + return NULL; + } + + for ( i = 0 ; i < MAX_LINE_LENGTH ; i++ ) { + if ( data[i] == 0 || data[i] == '\n' ) { + break; + } + } + if ( i == MAX_LINE_LENGTH ) { + CodeError( "MAX_LINE_LENGTH" ); + return data; + } + memcpy( lineBuffer, data, i ); + lineBuffer[i] = 0; + data += i; + if ( data[0] == '\n' ) { + data++; + } + return data; +} + + +/* +============== +Parse + +Parse a token out of linebuffer +============== +*/ +qboolean Parse( void ) { + int c; + int len; + + len = 0; + token[0] = 0; + + // skip whitespace + while ( lineBuffer[ lineParseOffset ] <= ' ' ) { + if ( lineBuffer[ lineParseOffset ] == 0 ) { + return qfalse; + } + lineParseOffset++; + } + + // skip ; comments + c = lineBuffer[ lineParseOffset ]; + if ( c == ';' ) { + return qfalse; + } + + + // parse a regular word + do { + token[len] = c; + len++; + lineParseOffset++; + c = lineBuffer[ lineParseOffset ]; + } while (c>32); + + token[len] = 0; + return qtrue; +} + + +/* +============== +ParseValue +============== +*/ +int ParseValue( void ) { + Parse(); + return atoi( token ); +} + + +/* +============== +ParseExpression +============== +*/ +int ParseExpression(void) { + int i, j; + char sym[MAX_LINE_LENGTH]; + int v; + + if ( token[0] == '-' ) { + i = 1; + } else { + i = 0; + } + + for ( ; i < MAX_LINE_LENGTH ; i++ ) { + if ( token[i] == '+' || token[i] == '-' || token[i] == 0 ) { + break; + } + } + + memcpy( sym, token, i ); + sym[i] = 0; + + if ( ( sym[0] >= '0' && sym[0] <= '9' ) || sym[0] == '-' ) { + v = atoi( sym ); + } else { + v = LookupSymbol( sym ); + } + + // parse add / subtract offsets + while ( token[i] != 0 ) { + for ( j = i + 1 ; j < MAX_LINE_LENGTH ; j++ ) { + if ( token[j] == '+' || token[j] == '-' || token[j] == 0 ) { + break; + } + } + + memcpy( sym, token+i+1, j-i-1 ); + sym[j-i-1] = 0; + + if ( token[i] == '+' ) { + v += atoi( sym ); + } + if ( token[i] == '-' ) { + v -= atoi( sym ); + } + i = j; + } + + return v; +} + + +/* +============== +HackToSegment + +BIG HACK: I want to put all 32 bit values in the data +segment so they can be byte swapped, and all char data in the lit +segment, but switch jump tables are emited in the lit segment and +initialized strng variables are put in the data segment. + +I can change segments here, but I also need to fixup the +label that was just defined + +Note that the lit segment is read-write in the VM, so strings +aren't read only as in some architectures. +============== +*/ +void HackToSegment( segmentName_t seg ) { + if ( currentSegment == &segment[seg] ) { + return; + } + + currentSegment = &segment[seg]; + if ( passNumber == 0 ) { + lastSymbol->segment = currentSegment; + lastSymbol->value = currentSegment->imageUsed; + } +} + +/* +============== +AssembleLine + +============== +*/ +void AssembleLine( void ) { + int v, v2; + int i; + int hash; + + Parse(); + if ( !token[0] ) { + return; + } + + hash = HashString( token ); + + for ( i = 0 ; i < NUM_SOURCE_OPS ; i++ ) { + if ( hash == opcodesHash[i] && !strcmp( token, sourceOps[i].name ) ) { + int opcode; + int expression; + + if ( sourceOps[i].opcode == OP_UNDEF ) { + CodeError( "Undefined opcode: %s\n", token ); + } + if ( sourceOps[i].opcode == OP_IGNORE ) { + return; // we ignore most conversions + } + + // sign extensions need to check next parm + opcode = sourceOps[i].opcode; + if ( opcode == OP_SEX8 ) { + Parse(); + if ( token[0] == '1' ) { + opcode = OP_SEX8; + } else if ( token[0] == '2' ) { + opcode = OP_SEX16; + } else { + CodeError( "Bad sign extension: %s\n", token ); + return; + } + } + + // check for expression + Parse(); + if ( token[0] && sourceOps[i].opcode != OP_CVIF + && sourceOps[i].opcode != OP_CVFI ) { + expression = ParseExpression(); + + // code like this can generate non-dword block copies: + // auto char buf[2] = " "; + // we are just going to round up. This might conceivably + // be incorrect if other initialized chars follow. + if ( opcode == OP_BLOCK_COPY ) { + expression = ( expression + 3 ) & ~3; + } + + EmitByte( &segment[CODESEG], opcode ); + EmitInt( &segment[CODESEG], expression ); + } else { + EmitByte( &segment[CODESEG], opcode ); + } + + instructionCount++; + return; + } + } + + // call instructions reset currentArgOffset + if ( !strncmp( token, "CALL", 4 ) ) { + EmitByte( &segment[CODESEG], OP_CALL ); + instructionCount++; + currentArgOffset = 0; + return; + } + + // arg is converted to a reversed store + if ( !strncmp( token, "ARG", 3 ) ) { + EmitByte( &segment[CODESEG], OP_ARG ); + instructionCount++; + if ( 8 + currentArgOffset >= 256 ) { + CodeError( "currentArgOffset >= 256" ); + return; + } + EmitByte( &segment[CODESEG], 8 + currentArgOffset ); + currentArgOffset += 4; + return; + } + + // ret just leaves something on the op stack + if ( !strncmp( token, "RET", 3 ) ) { + EmitByte( &segment[CODESEG], OP_LEAVE ); + instructionCount++; + EmitInt( &segment[CODESEG], 8 + currentLocals + currentArgs ); + return; + } + + // pop is needed to discard the return value of + // a function + if ( !strncmp( token, "pop", 3 ) ) { + EmitByte( &segment[CODESEG], OP_POP ); + instructionCount++; + return; + } + + // address of a parameter is converted to OP_LOCAL + if ( !strncmp( token, "ADDRF", 5 ) ) { + instructionCount++; + Parse(); + v = ParseExpression(); + v = 16 + currentArgs + currentLocals + v; + EmitByte( &segment[CODESEG], OP_LOCAL ); + EmitInt( &segment[CODESEG], v ); + return; + } + + // address of a local is converted to OP_LOCAL + if ( !strncmp( token, "ADDRL", 5 ) ) { + instructionCount++; + Parse(); + v = ParseExpression(); + v = 8 + currentArgs + v; + EmitByte( &segment[CODESEG], OP_LOCAL ); + EmitInt( &segment[CODESEG], v ); + return; + } + + if ( !strcmp( token, "proc" ) ) { + char name[1024]; + + Parse(); // function name + strcpy( name, token ); + + DefineSymbol( token, instructionCount ); // segment[CODESEG].imageUsed ); + + currentLocals = ParseValue(); // locals + currentLocals = ( currentLocals + 3 ) & ~3; + currentArgs = ParseValue(); // arg marshalling + currentArgs = ( currentArgs + 3 ) & ~3; + + if ( 8 + currentLocals + currentArgs >= 32767 ) { + CodeError( "Locals > 32k in %s\n", name ); + } + + instructionCount++; + EmitByte( &segment[CODESEG], OP_ENTER ); + EmitInt( &segment[CODESEG], 8 + currentLocals + currentArgs ); + return; + } + if ( !strcmp( token, "endproc" ) ) { + Parse(); // skip the function name + v = ParseValue(); // locals + v2 = ParseValue(); // arg marshalling + + // all functions must leave something on the opstack + instructionCount++; + EmitByte( &segment[CODESEG], OP_PUSH ); + + instructionCount++; + EmitByte( &segment[CODESEG], OP_LEAVE ); + EmitInt( &segment[CODESEG], 8 + currentLocals + currentArgs ); + + return; + } + + + if ( !strcmp( token, "address" ) ) { + Parse(); + v = ParseExpression(); + + HackToSegment( DATASEG ); + EmitInt( currentSegment, v ); + return; + } + if ( !strcmp( token, "export" ) ) { + return; + } + if ( !strcmp( token, "import" ) ) { + return; + } + if ( !strcmp( token, "code" ) ) { + currentSegment = &segment[CODESEG]; + return; + } + if ( !strcmp( token, "bss" ) ) { + currentSegment = &segment[BSSSEG]; + return; + } + if ( !strcmp( token, "data" ) ) { + currentSegment = &segment[DATASEG]; + return; + } + if ( !strcmp( token, "lit" ) ) { + currentSegment = &segment[LITSEG]; + return; + } + if ( !strcmp( token, "line" ) ) { + return; + } + if ( !strcmp( token, "file" ) ) { + return; + } + + if ( !strcmp( token, "equ" ) ) { + char name[1024]; + + Parse(); + strcpy( name, token ); + Parse(); + DefineSymbol( name, atoi(token) ); + return; + } + + if ( !strcmp( token, "align" ) ) { + v = ParseValue(); + currentSegment->imageUsed = (currentSegment->imageUsed + v - 1 ) & ~( v - 1 ); + return; + } + + if ( !strcmp( token, "skip" ) ) { + v = ParseValue(); + currentSegment->imageUsed += v; + return; + } + + if ( !strcmp( token, "byte" ) ) { + v = ParseValue(); + v2 = ParseValue(); + + if ( v == 1 ) { + HackToSegment( LITSEG ); + } else if ( v == 4 ) { + HackToSegment( DATASEG ); + } else if ( v == 2 ) { + CodeError( "16 bit initialized data not supported" ); + } + + // emit little endien + for ( i = 0 ; i < v ; i++ ) { + EmitByte( currentSegment, v2 ); + v2 >>= 8; + } + return; + } + + // code labels are emited as instruction counts, not byte offsets, + // because the physical size of the code will change with + // different run time compilers and we want to minimize the + // size of the required translation table + if ( !strncmp( token, "LABEL", 5 ) ) { + Parse(); + if ( currentSegment == &segment[CODESEG] ) { + DefineSymbol( token, instructionCount ); + } else { + DefineSymbol( token, currentSegment->imageUsed ); + } + return; + } + + CodeError( "Unknown token: %s\n", token ); +} + +/* +============== +InitTables +============== +*/ +void InitTables( void ) { + int i; + + for ( i = 0 ; i < NUM_SOURCE_OPS ; i++ ) { + opcodesHash[i] = HashString( sourceOps[i].name ); + } +} + + +/* +============== +WriteMapFile +============== +*/ +void WriteMapFile( void ) { + FILE *f; + symbol_t *s; + char imageName[MAX_OS_PATH]; + int seg; + + strcpy( imageName, outputFilename ); + StripExtension( imageName ); + strcat( imageName, ".map" ); + + printf( "Writing %s...\n", imageName ); + f = SafeOpenWrite( imageName ); + for ( seg = CODESEG ; seg <= BSSSEG ; seg++ ) { + for ( s = symbols ; s ; s = s->next ) { + if ( s->name[0] == '$' ) { + continue; // skip locals + } + if ( &segment[seg] != s->segment ) { + continue; + } + fprintf( f, "%i %8x %s\n", seg, s->value, s->name ); + } + } + fclose( f ); +} + +/* +=============== +WriteVmFile +=============== +*/ +void WriteVmFile( void ) { + char imageName[MAX_OS_PATH]; + vmHeader_t header; + FILE *f; + + printf( "%i total errors\n", errorCount ); + strcpy( imageName, outputFilename ); + StripExtension( imageName ); + strcat( imageName, ".qvm" ); + + remove( imageName ); + + printf( "code segment: %7i\n", segment[CODESEG].imageUsed ); + printf( "data segment: %7i\n", segment[DATASEG].imageUsed ); + printf( "lit segment: %7i\n", segment[LITSEG].imageUsed ); + printf( "bss segment: %7i\n", segment[BSSSEG].imageUsed ); + printf( "instruction count: %i\n", instructionCount ); + if ( errorCount != 0 ) { + printf( "Not writing a file due to errors\n" ); + return; + } + + header.vmMagic = VM_MAGIC; + header.instructionCount = instructionCount; + header.codeOffset = sizeof( header ); + header.codeLength = segment[CODESEG].imageUsed; + header.dataOffset = header.codeOffset + segment[CODESEG].imageUsed; + header.dataLength = segment[DATASEG].imageUsed; + header.litLength = segment[LITSEG].imageUsed; + header.bssLength = segment[BSSSEG].imageUsed; + + printf( "Writing to %s\n", imageName ); + + CreatePath( imageName ); + f = SafeOpenWrite( imageName ); + SafeWrite( f, &header, sizeof( header ) ); + SafeWrite( f, &segment[CODESEG].image, segment[CODESEG].imageUsed ); + SafeWrite( f, &segment[DATASEG].image, segment[DATASEG].imageUsed ); + SafeWrite( f, &segment[LITSEG].image, segment[LITSEG].imageUsed ); + fclose( f ); +} + +/* +=============== +Assemble +=============== +*/ +void Assemble( void ) { + int i; + char filename[MAX_OS_PATH]; + char *ptr; + + printf( "outputFilename: %s\n", outputFilename ); + + for ( i = 0 ; i < numAsmFiles ; i++ ) { + strcpy( filename, asmFileNames[ i ] ); + DefaultExtension( filename, ".asm" ); + LoadFile( filename, (void **)&asmFiles[i] ); + } + + // assemble + for ( passNumber = 0 ; passNumber < 2 ; passNumber++ ) { + segment[LITSEG].segmentBase = segment[DATASEG].imageUsed; + segment[BSSSEG].segmentBase = segment[LITSEG].segmentBase + segment[LITSEG].imageUsed; + for ( i = 0 ; i < NUM_SEGMENTS ; i++ ) { + segment[i].imageUsed = 0; + } + segment[DATASEG].imageUsed = 4; // skip the 0 byte, so NULL pointers are fixed up properly + instructionCount = 0; + + for ( i = 0 ; i < numAsmFiles ; i++ ) { + currentFileIndex = i; + currentFileName = asmFileNames[ i ]; + currentFileLine = 0; + printf("pass %i: %s\n", passNumber, currentFileName ); + ptr = asmFiles[i]; + while ( ptr ) { + ptr = ExtractLine( ptr ); + AssembleLine(); + } + } + + // align all segment + for ( i = 0 ; i < NUM_SEGMENTS ; i++ ) { + segment[i].imageUsed = (segment[i].imageUsed + 3) & ~3; + } + } + + // reserve the stack in bss + DefineSymbol( "_stackStart", segment[BSSSEG].imageUsed ); + segment[BSSSEG].imageUsed += stackSize; + DefineSymbol( "_stackEnd", segment[BSSSEG].imageUsed ); + + // write the image + WriteVmFile(); + + // write the map file even if there were errors + WriteMapFile(); +} + + +/* +============= +ParseOptionFile + +============= +*/ +void ParseOptionFile( const char *filename ) { + char expanded[MAX_OS_PATH]; + char *text, *text_p; + + strcpy( expanded, filename ); + DefaultExtension( expanded, ".q3asm" ); + LoadFile( expanded, (void **)&text ); + if ( !text ) { + return; + } + + text_p = text; + + while( ( text_p = COM_Parse( text_p ) ) != 0 ) { + if ( !strcmp( com_token, "-o" ) ) { + // allow output override in option file + text_p = COM_Parse( text_p ); + if ( text_p ) { + strcpy( outputFilename, com_token ); + } + continue; + } + + asmFileNames[ numAsmFiles ] = copystring( com_token ); + numAsmFiles++; + } +} + +/* +============== +main +============== +*/ +int main( int argc, char **argv ) { + int i; + double start, end; + +// _chdir( "/quake3/jccode/cgame/lccout" ); // hack for vc profiler + + if ( argc < 2 ) { + Error( "usage: q3asm [-o output] or q3asm -f \n" ); + } + + start = I_FloatTime (); + InitTables(); + + // default filename is "q3asm" + strcpy( outputFilename, "q3asm" ); + numAsmFiles = 0; + + for ( i = 1 ; i < argc ; i++ ) { + if ( argv[i][0] != '-' ) { + break; + } + if ( !strcmp( argv[i], "-o" ) ) { + if ( i == argc - 1 ) { + Error( "-o must preceed a filename" ); + } + strcpy( outputFilename, argv[ i+1 ] ); + i++; + continue; + } + + if ( !strcmp( argv[i], "-f" ) ) { + if ( i == argc - 1 ) { + Error( "-f must preceed a filename" ); + } + ParseOptionFile( argv[ i+1 ] ); + i++; + continue; + } + Error( "Unknown option: %s", argv[i] ); + } + + // the rest of the command line args are asm files + for ( ; i < argc ; i++ ) { + asmFileNames[ numAsmFiles ] = copystring( argv[ i ] ); + numAsmFiles++; + } + + Assemble(); + + end = I_FloatTime (); + printf ("%5.0f seconds elapsed\n", end-start); + + return 0; +} + diff --git a/quake3/source/q3asm/q3asm.dsp b/quake3/source/q3asm/q3asm.dsp new file mode 100644 index 0000000..9e8e936 --- /dev/null +++ b/quake3/source/q3asm/q3asm.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="q3asm" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=q3asm - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "q3asm.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "q3asm.mak" CFG="q3asm - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "q3asm - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "q3asm - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/source/q3asm", YUCAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "q3asm - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "q3asm - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /profile /debug /machine:I386 + +!ENDIF + +# Begin Target + +# Name "q3asm - Win32 Release" +# Name "q3asm - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cmdlib.c +# End Source File +# Begin Source File + +SOURCE=.\q3asm.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\common\cmdlib.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/quake3/source/q3asm/q3asm.dsw b/quake3/source/q3asm/q3asm.dsw new file mode 100644 index 0000000..ed95d56 --- /dev/null +++ b/quake3/source/q3asm/q3asm.dsw @@ -0,0 +1,37 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "q3asm"=.\q3asm.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/source/q3asm", YUCAAAAA + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ + begin source code control + "$/source/q3asm", YUCAAAAA + . + end source code control +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/quake3/source/q3asm/qfiles.h b/quake3/source/q3asm/qfiles.h new file mode 100644 index 0000000..74bfee4 --- /dev/null +++ b/quake3/source/q3asm/qfiles.h @@ -0,0 +1,464 @@ +#ifndef __QFILES_H__ +#define __QFILES_H__ + +// +// qfiles.h: quake file formats +// This file must be identical in the quake and utils directories +// + +// surface geometry should not exceed these limits +#define SHADER_MAX_VERTEXES 1000 +#define SHADER_MAX_INDEXES (6*SHADER_MAX_VERTEXES) + + +// the maximum size of game reletive pathnames +#define MAX_QPATH 64 + +/* +======================================================================== + +QVM files + +======================================================================== +*/ + +#define VM_MAGIC 0x12721444 +typedef struct { + int vmMagic; + + int instructionCount; + + int codeOffset; + int codeLength; + + int dataOffset; + int dataLength; + int litLength; // ( dataLength - litLength ) should be byteswapped on load + int bssLength; // zero filled memory appended to datalength +} vmHeader_t; + + +/* +======================================================================== + +PCX files are used for 8 bit images + +======================================================================== +*/ + +typedef struct { + char manufacturer; + char version; + char encoding; + char bits_per_pixel; + unsigned short xmin,ymin,xmax,ymax; + unsigned short hres,vres; + unsigned char palette[48]; + char reserved; + char color_planes; + unsigned short bytes_per_line; + unsigned short palette_type; + char filler[58]; + unsigned char data; // unbounded +} pcx_t; + + +/* +======================================================================== + +TGA files are used for 24/32 bit images + +======================================================================== +*/ + +typedef struct _TargaHeader { + unsigned char id_length, colormap_type, image_type; + unsigned short colormap_index, colormap_length; + unsigned char colormap_size; + unsigned short x_origin, y_origin, width, height; + unsigned char pixel_size, attributes; +} TargaHeader; + + + +/* +======================================================================== + +.MD3 triangle model file format + +======================================================================== +*/ + +#define MD3_IDENT (('3'<<24)+('P'<<16)+('D'<<8)+'I') +#define MD3_VERSION 15 + +// limits +#define MD3_MAX_LODS 3 +#define MD3_MAX_TRIANGLES 8192 // per surface +#define MD3_MAX_VERTS 4096 // per surface +#define MD3_MAX_SHADERS 256 // per surface +#define MD3_MAX_FRAMES 1024 // per model +#define MD3_MAX_SURFACES 32 // per model +#define MD3_MAX_TAGS 16 // per frame + +// vertex scales +#define MD3_XYZ_SCALE (1.0/64) + +typedef struct md3Frame_s { + vec3_t bounds[2]; + vec3_t localOrigin; + float radius; + char name[16]; +} md3Frame_t; + +typedef struct md3Tag_s { + char name[MAX_QPATH]; // tag name + vec3_t origin; + vec3_t axis[3]; +} md3Tag_t; + +/* +** md3Surface_t +** +** CHUNK SIZE +** header sizeof( md3Surface_t ) +** shaders sizeof( md3Shader_t ) * numShaders +** triangles[0] sizeof( md3Triangle_t ) * numTriangles +** st sizeof( md3St_t ) * numVerts +** XyzNormals sizeof( md3XyzNormal_t ) * numVerts * numFrames +*/ +typedef struct { + int ident; // + + char name[MAX_QPATH]; // polyset name + + int flags; + int numFrames; // all surfaces in a model should have the same + + int numShaders; // all surfaces in a model should have the same + int numVerts; + + int numTriangles; + int ofsTriangles; + + int ofsShaders; // offset from start of md3Surface_t + int ofsSt; // texture coords are common for all frames + int ofsXyzNormals; // numVerts * numFrames + + int ofsEnd; // next surface follows +} md3Surface_t; + +typedef struct { + char name[MAX_QPATH]; + int shaderIndex; // for in-game use +} md3Shader_t; + +typedef struct { + int indexes[3]; +} md3Triangle_t; + +typedef struct { + float st[2]; +} md3St_t; + +typedef struct { + short xyz[3]; + short normal; +} md3XyzNormal_t; + +typedef struct { + int ident; + int version; + + char name[MAX_QPATH]; // model name + + int flags; + + int numFrames; + int numTags; + int numSurfaces; + + int numSkins; + + int ofsFrames; // offset for first frame + int ofsTags; // numFrames * numTags + int ofsSurfaces; // first surface, others follow + + int ofsEnd; // end of file +} md3Header_t; + +/* +============================================================================== + +MD4 file format + +============================================================================== +*/ + +#define MD4_IDENT (('4'<<24)+('P'<<16)+('D'<<8)+'I') +#define MD4_VERSION 1 +#define MD4_MAX_BONES 128 + +typedef struct { + int boneIndex; // these are indexes into the boneReferences, + float boneWeight; // not the global per-frame bone list + vec3_t offset; +} md4Weight_t; + +typedef struct { + vec3_t normal; + vec2_t texCoords; + int numWeights; + md4Weight_t weights[1]; // variable sized +} md4Vertex_t; + +typedef struct { + int indexes[3]; +} md4Triangle_t; + +typedef struct { + int ident; + + char name[MAX_QPATH]; // polyset name + char shader[MAX_QPATH]; + int shaderIndex; // for in-game use + + int ofsHeader; // this will be a negative number + + int numVerts; + int ofsVerts; + + int numTriangles; + int ofsTriangles; + + // Bone references are a set of ints representing all the bones + // present in any vertex weights for this surface. This is + // needed because a model may have surfaces that need to be + // drawn at different sort times, and we don't want to have + // to re-interpolate all the bones for each surface. + int numBoneReferences; + int ofsBoneReferences; + + int ofsEnd; // next surface follows +} md4Surface_t; + +typedef struct { + float matrix[3][4]; +} md4Bone_t; + +typedef struct { + vec3_t bounds[2]; // bounds of all surfaces of all LOD's for this frame + vec3_t localOrigin; // midpoint of bounds, used for sphere cull + float radius; // dist from localOrigin to corner + char name[16]; + md4Bone_t bones[1]; // [numBones] +} md4Frame_t; + +typedef struct { + int numSurfaces; + int ofsSurfaces; // first surface, others follow + int ofsEnd; // next lod follows +} md4LOD_t; + +typedef struct { + int ident; + int version; + + char name[MAX_QPATH]; // model name + + // frames and bones are shared by all levels of detail + int numFrames; + int numBones; + int ofsFrames; // md4Frame_t[numFrames] + + // each level of detail has completely separate sets of surfaces + int numLODs; + int ofsLODs; + + int ofsEnd; // end of file +} md4Header_t; + + +/* +============================================================================== + + .BSP file format + +============================================================================== +*/ + + +#define BSP_IDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I') + // little-endian "IBSP" + +#define BSP_VERSION 46 + + +// there shouldn't be any problem with increasing these values at the +// expense of more memory allocation in the utilities +#define MAX_MAP_MODELS 0x400 +#define MAX_MAP_BRUSHES 0x8000 +#define MAX_MAP_ENTITIES 0x800 +#define MAX_MAP_ENTSTRING 0x40000 +#define MAX_MAP_SHADERS 0x400 + +#define MAX_MAP_AREAS 0x100 // MAX_MAP_AREA_BYTES in q_shared must match! +#define MAX_MAP_FOGS 0x100 +#define MAX_MAP_PLANES 0x20000 +#define MAX_MAP_NODES 0x20000 +#define MAX_MAP_BRUSHSIDES 0x20000 +#define MAX_MAP_LEAFS 0x20000 +#define MAX_MAP_LEAFFACES 0x20000 +#define MAX_MAP_LEAFBRUSHES 0x40000 +#define MAX_MAP_PORTALS 0x20000 +#define MAX_MAP_LIGHTING 0x800000 +#define MAX_MAP_LIGHTGRID 0x800000 +#define MAX_MAP_VISIBILITY 0x200000 + +#define MAX_MAP_DRAW_SURFS 0x20000 +#define MAX_MAP_DRAW_VERTS 0x80000 +#define MAX_MAP_DRAW_INDEXES 0x80000 + + +// key / value pair sizes in the entities lump +#define MAX_KEY 32 +#define MAX_VALUE 1024 + +// the editor uses these predefined yaw angles to orient entities up or down +#define ANGLE_UP -1 +#define ANGLE_DOWN -2 + +#define LIGHTMAP_WIDTH 128 +#define LIGHTMAP_HEIGHT 128 + + +//============================================================================= + + +typedef struct { + int fileofs, filelen; +} lump_t; + +#define LUMP_ENTITIES 0 +#define LUMP_SHADERS 1 +#define LUMP_PLANES 2 +#define LUMP_NODES 3 +#define LUMP_LEAFS 4 +#define LUMP_LEAFSURFACES 5 +#define LUMP_LEAFBRUSHES 6 +#define LUMP_MODELS 7 +#define LUMP_BRUSHES 8 +#define LUMP_BRUSHSIDES 9 +#define LUMP_DRAWVERTS 10 +#define LUMP_DRAWINDEXES 11 +#define LUMP_FOGS 12 +#define LUMP_SURFACES 13 +#define LUMP_LIGHTMAPS 14 +#define LUMP_LIGHTGRID 15 +#define LUMP_VISIBILITY 16 +#define HEADER_LUMPS 17 + +typedef struct { + int ident; + int version; + + lump_t lumps[HEADER_LUMPS]; +} dheader_t; + +typedef struct { + float mins[3], maxs[3]; + int firstSurface, numSurfaces; + int firstBrush, numBrushes; +} dmodel_t; + +typedef struct { + char shader[MAX_QPATH]; + int surfaceFlags; + int contentFlags; +} dshader_t; + +// planes x^1 is allways the opposite of plane x + +typedef struct { + float normal[3]; + float dist; +} dplane_t; + +typedef struct { + int planeNum; + int children[2]; // negative numbers are -(leafs+1), not nodes + int mins[3]; // for frustom culling + int maxs[3]; +} dnode_t; + +typedef struct { + int cluster; // -1 = opaque cluster (do I still store these?) + int area; + + int mins[3]; // for frustum culling + int maxs[3]; + + int firstLeafSurface; + int numLeafSurfaces; + + int firstLeafBrush; + int numLeafBrushes; +} dleaf_t; + +typedef struct { + int planeNum; // positive plane side faces out of the leaf + int shaderNum; +} dbrushside_t; + +typedef struct { + int firstSide; + int numSides; + int shaderNum; // the shader that determines the contents flags +} dbrush_t; + +typedef struct { + char shader[MAX_QPATH]; + int brushNum; + int visibleSide; // the brush side that ray tests need to clip against (-1 == none) +} dfog_t; + +typedef struct { + vec3_t xyz; + float st[2]; + float lightmap[2]; + vec3_t normal; + byte color[4]; +} drawVert_t; + +typedef enum { + MST_BAD, + MST_PLANAR, + MST_PATCH, + MST_TRIANGLE_SOUP, + MST_FLARE +} mapSurfaceType_t; + +typedef struct { + int shaderNum; + int fogNum; + int surfaceType; + + int firstVert; + int numVerts; + + int firstIndex; + int numIndexes; + + int lightmapNum; + int lightmapX, lightmapY; + int lightmapWidth, lightmapHeight; + + vec3_t lightmapOrigin; + vec3_t lightmapVecs[3]; // for patches, [0] and [1] are lodbounds + + int patchWidth; + int patchHeight; +} dsurface_t; + + +#endif diff --git a/quake3/source/ui/addfilter.menu b/quake3/source/ui/addfilter.menu new file mode 100644 index 0000000..a268ba9 --- /dev/null +++ b/quake3/source/ui/addfilter.menu @@ -0,0 +1,323 @@ +#include "ui/menudef.h" + +{ +\\ ADD FILTER POPUP MENU \\ + +menuDef { + name "addfilter_popmenu" + visible 0 + fullscreen 0 + rect 190 200 256 256 + outOfBoundsClick + focusColor 1 .75 0 1 + style 1 + border 1 + onopen { hide grpFilter ; show add } + +itemDef { + name window + rect 0 0 256 256 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .5 1 + visible 1 + decoration + } + +itemDef { + name window + rect 0 220 256 1 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .5 1 + visible 1 + decoration + } + + +// BUTTONS // + +itemDef { + name filter_add + text "Add" + type 1 + textscale .25 + group grpFilterbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 10 5 75 20 + textalign 1 + textalignx 37 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { hide grpFilter ; show add } + } + +itemDef { + name filter_edit + text "Edit" + type 1 + textscale .25 + group grpFilterbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 90 5 75 20 + textalign 1 + textalignx 37 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { hide grpFilter ; show edit } + } + +itemDef { + name filter_delete + text "Delete" + type 1 + textscale .25 + group grpFilterbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 170 5 75 20 + textalign 1 + textalignx 37 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { hide grpFilter ; show delete } + } + + + + + // ADD FILTER // + + +itemDef { + name add + group grpFilter + text "Description:" + style 0 + textscale .25 + type ITEM_TYPE_EDITFIELD + rect 20 30 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + } +itemDef { + name add + group grpFilter + text "Filter Name:" + style 0 + textscale .25 + type ITEM_TYPE_EDITFIELD + rect 20 50 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name add + group grpFilter + rect 20 80 216 105 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_LISTBOX + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_PLAYER_LIST + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 0 + mouseEnter { fadein message_arena ; setitemcolor add bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor add bordercolor .5 .5 .5 1 } + } + +itemDef { + name add + text "Add" + group grpFilter + type 1 + textscale .25 + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 190 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 0 + action { } + } + + + + + +// EDIT // + + +itemDef { + name edit + group grpFilter + text "Description:" + style 0 + textscale .25 + type ITEM_TYPE_EDITFIELD + rect 20 30 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + } +itemDef { + name edit + group grpFilter + text "Filter Name:" + style 0 + textscale .25 + type ITEM_TYPE_EDITFIELD + rect 20 50 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name edit + group grpFilter + rect 20 80 216 105 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_LISTBOX + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_PLAYER_LIST + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 0 + mouseEnter { fadein message_arena ; setitemcolor edit bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor edit bordercolor .5 .5 .5 1 } + } + +itemDef { + name edit + text "Accept" + group grpFilter + type 1 + textscale .25 + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 190 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 0 + action { } + } + + + +// DELETE // + +itemDef { + name delete + group grpFilter + text "Filter Name:" + textscale .25 + rect 20 30 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + action { } + } +itemDef { + name delete + group grpFilter + rect 20 80 216 105 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_LISTBOX + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_PLAYER_LIST + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 0 + mouseEnter { fadein message_arena ; setitemcolor delete bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor delete bordercolor .5 .5 .5 1 } + } + +itemDef { + name delete + text "Delete" + group grpFilter + type 1 + textscale .25 + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 190 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 0 + action { } + } + + + + + +// OK // + +itemDef { + name type + text "Exit" + textscale .25 + type 1 + group grpFilterbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 230 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 1 + action { close addfilter_popmenu ; close joinserver ; open joinserver } +} + + +} + + + +} diff --git a/quake3/source/ui/botselection.menu b/quake3/source/ui/botselection.menu new file mode 100644 index 0000000..5f0cff9 --- /dev/null +++ b/quake3/source/ui/botselection.menu @@ -0,0 +1,306 @@ +#include "ui/menudef.h" + +// botselection menu +{ + menuDef { + name "BotSelection" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 200 80 132 + style WINDOW_STYLE_FILLED + backcolor 0 0 0.8 .25 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 1 1 + + itemDef { + name "Possess" + text "Possess" + textaligny 10 + textalign ITEM_ALIGN_LEFT + rect 5 5 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show pbar } + + } + itemDef { + name "pbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 5 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Follow" + text "Follow" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 17 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show fbar } + } + itemDef { + name "fbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 17 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Go To" + text "Go To" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 29 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show gbar } + } + itemDef { + name "gbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 29 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Get" + text "Get" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 41 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show g2bar } + action { open getMenu } + } + itemDef { + name "g2bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 41 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Patrol From" + text "Patrol From" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 53 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show p2bar } + } + itemDef { + name "p2bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 53 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Patrol To" + text "Patrol To" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 65 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show p3bar } + } + itemDef { + name "p3bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 65 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Camp Near" + text "Camp Near" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 77 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show cbar } + } + itemDef { + name "cbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 75 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Defend" + text "Defend" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 89 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show dbar } + } + itemDef { + name "dbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 89 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Attack" + text "Attack" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 101 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show abar } + } + itemDef { + name "abar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 101 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Drop Command" + text "Drop Command" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 113 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show dcbar } + } + itemDef { + name "dcbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 113 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + } + + menuDef { + name "getMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 86 238 85 35 + style WINDOW_STYLE_FILLED + backcolor 0 0 0.8 .25 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 1 1 + + itemDef { + name "Enemy Flag" + text "Enemy Flag" + textaligny 10 + textalign ITEM_ALIGN_LEFT + rect 5 3 80 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight2 ; show efbar } + action { close getMenu ; close teamMenu ; orders get flag } + + } + itemDef { + name "efbar" + group "highlight2" + style WINDOW_STYLE_FILLED + rect 0 3 84 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Rocket Launcher" + text "Rocket Launcher" + textaligny 10 + textalign ITEM_ALIGN_LEFT + rect 5 17 80 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight2 ; show rlbar } + action { close getMenu ; close teamMenu ; orders get rocketlauncher } + + } + itemDef { + name "rlbar" + group "highlight2" + style WINDOW_STYLE_FILLED + rect 0 17 84 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + } + + menuDef { + name "voiceMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 25 40 40 + style WINDOW_STYLE_SHADER + background "console" + //backcolor 0 0 0.5 0.5 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 .5 1 + + itemDef { + name "b" + rect 2 2 33 33 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_HEAD + } + + } + + menuDef { + name "voteMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 25 40 40 + style WINDOW_STYLE_SHADER + background "textures/base_wall/comp3" + backcolor 0 0 0.5 0.5 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor 0 1 0 1 + + } + + + + +} + + diff --git a/quake3/source/ui/cdkey.menu b/quake3/source/ui/cdkey.menu new file mode 100644 index 0000000..27143b5 --- /dev/null +++ b/quake3/source/ui/cdkey.menu @@ -0,0 +1,312 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "cdkey_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onClose { + uiScript verifyCDKey + } + onOpen { + setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + hide grpfinish ; + uiScript getCDKey + } + onEsc { close cdkey_menu ; close setup_menu ; open main } + + +itemDef { + name window + group grpSystembutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration + } + + +/* +// DEMO ONLY OPTION // + + itemDef { + name demo_only + group grpcdkey + rect 0 145 454 30 + text"This Option is Not Available in Demo." + textalign 1 + textstyle 1 + textscale .333 + textalignx 217 + textaligny 23 + forecolor 1 1 1 1 + visible 1 + decoration + } +*/ + + + + + + itemDef { + name data + group grpcdkey + rect 0 145 454 30 + text"Enter your encryption code in the field below." + textalign 1 + textscale .333 + textalignx 217 + textaligny 23 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + itemDef { + name datafield + group grpcdkey + style 0 + text "Code:" + maxchars 4 + rect 60 192 50 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + decoration + backcolor 1 0 0 .25 + forecolor 1 1 1 1 + visible 1 + } + + + itemDef { + name datafield + group grpcdkey + type ITEM_TYPE_EDITFIELD + style 1 + text "" + cvar "cdkey1" + maxchars 4 + rect 107 192 50 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + border 1 + bordercolor .5 .5 .5 1 + backcolor 1 0 0 .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { setcolor bordercolor 1 .75 0 1 } + mouseexit { setcolor bordercolor .5 .5 .5 1 } + } +itemDef { + name datafield + group grpcdkey + type ITEM_TYPE_EDITFIELD + style 1 + text "" + cvar "cdkey2" + maxchars 4 + rect 162 192 50 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + border 1 + bordercolor .5 .5 .5 1 + backcolor 1 0 0 .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { setcolor bordercolor 1 .75 0 1 } + mouseexit { setcolor bordercolor .5 .5 .5 1 } + + } + itemDef { + name datafield + group grpcdkey + type ITEM_TYPE_EDITFIELD + style 1 + text "" + cvar "cdkey3" + maxchars 4 + rect 217 192 50 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + border 1 + bordercolor .5 .5 .5 1 + backcolor 1 0 0 .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { setcolor bordercolor 1 .75 0 1 } + mouseexit { setcolor bordercolor .5 .5 .5 1 } + + } + itemDef { + name datafield + group grpcdkey + type ITEM_TYPE_EDITFIELD + style 1 + text"" + cvar "cdkey4" + maxchars 4 + rect 272 192 50 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + border 1 + bordercolor .5 .5 .5 1 + backcolor 1 0 0 .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { setcolor bordercolor 1 .75 0 1 } + mouseexit { setcolor bordercolor .5 .5 .5 1 } + } + itemDef { + name datafield + group grpcdkey + style 0 + text "-" + maxchars 2 + rect 327 192 60 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + backcolor 0 0 0 0 + decoration + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name datafield + group grpcdkey + type ITEM_TYPE_EDITFIELD + style 1 + text "" + cvar "cdkeychecksum" + maxchars 2 + rect 335 192 40 30 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 23 + textscale .333 + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 1 0 0 .25 + visible 1 + mouseenter { setcolor bordercolor 1 .75 0 1 } + mouseexit { setcolor bordercolor .5 .5 .5 1 } + } +itemDef { + name accept + text "Verify" + type 1 + group grpcdkey + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 161 247 100 26 + textalign 1 + textalignx 50 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { + play "sound/misc/nomenu.wav" ; + uiScript verifyCDKey ; + show finish_message + } + mouseEnter { setitemcolor accept backcolor .1 .37 .1 1 } + mouseExit { setitemcolor accept backcolor .37 .1 .1 1 } + } + + itemDef { + name accept + group grpcdkey + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 161 247 100 26 + visible 1 + decoration + } + + itemDef { + name accept + group grpcdkey + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 149 247 13 26 + visible 1 + decoration + } + + itemDef { + name accept + group grpcdkey + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 260 247 13 26 + visible 1 + decoration + } + + + itemDef { + name finish_message + group grpfinish + style 0 + type ITEM_TYPE_EDITFIELD + text "" + cvar ui_cdkeyvalid + rect 0 290 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + +} +} + + + + diff --git a/quake3/source/ui/chip.menu b/quake3/source/ui/chip.menu new file mode 100644 index 0000000..1204071 --- /dev/null +++ b/quake3/source/ui/chip.menu @@ -0,0 +1,39 @@ +#include "ui/menudef.h" + + itemDef { + name "f" + rect 5 7 24 24 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/bluechip.tga" + } + + + itemDef { + name "f" + rect 5 7 24 24 + visible 1 + decoration + ownerdraw CG_BLUE_FLAGSTATUS + } + + itemDef { + name "f" + rect 67 7 24 24 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/redchip.tga" + } + + itemDef { + name "f" + rect 67 7 24 24 + visible 1 + decoration + ownerdraw CG_RED_FLAGSTATUS + } + diff --git a/quake3/source/ui/cinematic.menu b/quake3/source/ui/cinematic.menu new file mode 100644 index 0000000..80ce27e --- /dev/null +++ b/quake3/source/ui/cinematic.menu @@ -0,0 +1,16 @@ +#include "ui/menudef.h" + +{ +\\ Cinematic \\ + + menuDef { + name "cinematic" + visible 0 + fullscreen 1 + rect 0 0 640 480 + focusColor 1 .67 0 1 + style 1 + border 1 + onopen { exec "cinematic idlogo.RoQ" ; open credit } +} +} \ No newline at end of file diff --git a/quake3/source/ui/cinematicmenu.menu b/quake3/source/ui/cinematicmenu.menu new file mode 100644 index 0000000..9614439 --- /dev/null +++ b/quake3/source/ui/cinematicmenu.menu @@ -0,0 +1,308 @@ +#include "ui/menudef.h" + +{ +\\ CINEMATIC \\ + + menuDef { + name "cinematicMenu" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .67 0 1 + style 1 + border 1 + onEsc { close cinematicMenu ; open main } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + play "sound/misc/kcswish.wav" ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + transition mappreview 0 0 640 480 54 144 256 192 20 10 ; + uiScript loadMovies ; + hide lightning ; + hide accept_alt ; + show accept ; + hide back_alt ; + show back ; + hide grpmessage } + + + + +itemDef { + name menuback_e + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + background "menuback_e" + visible 1 + decoration + } + + + +itemDef { + name menuback_b + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + visible 1 + background "menuback_b" + bordercolor 0.5 0.5 0.5 .7 + decoration + } + +itemDef { + name windowscreen + rect 0 0 640 240 + style 3 + background levelshotdetail + forecolor 0 0 0 0 + visible 1 + decoration + } +itemDef { + name windowscreen + rect 0 240 640 240 + style 3 + background levelshotdetail + forecolor 0 0 0 0 + visible 1 + decoration + } + + + +// LEVEL SELECTION BAR // + + + itemDef { + name levelbar + text "TEAM ARENA CINEMATICS" + textstyle 6 + style 2 + rect 0 16 640 40 + textscale 0.416 + textalign 1 // center + textalignx 320 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 27 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + decoration + } + + + + + + +itemDef { + name cinematiclist + rect 330 144 256 192 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_CINEMATICS + doubleclick { uiScript playMovie } + textalign 3 + textaligny 14 + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .1 1 + outlinecolor .1 .1 .7 .5 + visible 1 + mouseEnter { fadein message_cinematic ; setitemcolor cinematiclist bordercolor .7 0 0 1 } + mouseExit { fadeout message_cinematic ; setitemcolor cinematiclist bordercolor .5 .5 .5 .5 } + } + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close cinematicMenu ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close cinematicMenu ; open main } + } + +itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { playlooped "sound/misc/loop_electricity_05.wav" ; show lightning ; hide accept ; show accept_alt ; fadein message_accept } + action { close cinematicMenu ; uiScript playMovie } + } + +itemDef { + name accept_alt + style 3 + rect 572 422 54 54 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { close cinematicMenu ; uiScript playMovie } + mouseExit { hide lightning ; hide accept_alt ; show accept ; fadeout message_accept ; playlooped "music/fla_mp03.wav" } + } +itemDef { + name lightning + style 3 + background lightningkc + rect 46 385 174 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 417 385 174 128 + visible 0 + decoration + } + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_cinematic + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select Cinematic to Play" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select to Play Fullscreen" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name mappreview + ownerdraw UI_PREVIEWCINEMATIC + rect 54 144 256 192 + backcolor 1 1 1 .25 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + decoration + visible 1 + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + +} + + + + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/connect.menu b/quake3/source/ui/connect.menu new file mode 100644 index 0000000..5fc93c7 --- /dev/null +++ b/quake3/source/ui/connect.menu @@ -0,0 +1,15 @@ +#include "ui/menudef.h" + + +{ + +menuDef { + name "Connect" + background "ui/assets/backscreen" + rect 0 0 640 480 + fullScreen MENU_FALSE + visible MENU_FALSE + style WINDOW_STYLE_SHADER + } + +} \ No newline at end of file diff --git a/quake3/source/ui/controls.menu b/quake3/source/ui/controls.menu new file mode 100644 index 0000000..f04e257 --- /dev/null +++ b/quake3/source/ui/controls.menu @@ -0,0 +1,1417 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "control_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onClose { + uiScript saveControls + } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + hide grpControls ; + show look ; + uiScript loadControls } + onEsc { close control_menu ; close setup_menu ; open main } + + +itemDef { + name controls_shader + group grpControls + style WINDOW_STYLE_SHADER + rect 0 45 640 60 + visible 0 + background "ui/assets/controls_shader1" + decoration + } + +itemDef { + name window + group grpControlbutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration + } + +itemDef { + name keyBindStatus + rect 0 15 640 30 + ownerdraw UI_KEYBINDSTATUS + text " " + forecolor 1 .75 0 1 + textscale .25 + textalignx 221 + textalign 1 + textaligny 20 + visible 0 + decoration + } + + +itemDef { + name ctr_look + text "Look" + type 1 + textscale .3 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 17 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpControls ; show look } + mouseEnter { show message_look ; setitemcolor ctr_look backcolor .1 .37 .1 1 } + mouseExit { hide message_look ; setitemcolor ctr_look backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_look + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 17 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_look + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 5 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_look + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 61 395 13 26 + visible 1 + decoration + } + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Lookup:" + cvar "+lookup" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Look Down:" + cvar "+lookdown" + rect 99 80 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Mouse Look:" + cvar "+mlook" + rect 99 110 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Centerview:" + cvar "centerview" + rect 99 140 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "ZoomView:" + cvar "+zoom" + rect 99 170 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_YESNO + text "Free Look:" + cvar "cl_freelook" + rect 99 200 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + +itemDef { + name ctr_move + text "Move" + type 1 + textscale .3 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 90 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpControls ; show move } + mouseEnter { show message_move ; setitemcolor ctr_move backcolor .1 .37 .1 1 } + mouseExit { hide message_move ; setitemcolor ctr_move backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_move + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 90 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_move + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 78 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_move + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 134 395 13 26 + visible 1 + decoration + } + + + itemDef { + name move + group grpControls + type ITEM_TYPE_YESNO + text "Always Run:" + cvar "cl_run" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Run / Walk:" + cvar "+speed" + rect 99 75 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Forward:" + cvar "+forward" + rect 99 100 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Backpedal:" + cvar "+back" + rect 99 125 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Move Left:" + cvar "+moveleft" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Move Right:" + cvar "+moveright" + rect 99 175 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Jump:" + cvar "+moveup" + rect 99 200 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Crouch:" + cvar "+movedown" + rect 99 225 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Turn Left:" + cvar "+left" + rect 99 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Turn Right:" + cvar "+right" + rect 99 275 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Strafe:" + cvar "+strafe" + rect 99 300 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + + +itemDef { + name ctr_shoot + text "Shoot" + type 1 + textscale .3 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 163 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpControls ; show shoot } + mouseEnter { show message_shoot ; setitemcolor ctr_shoot backcolor .1 .37 .1 1 } + mouseExit { hide message_shoot ; setitemcolor ctr_shoot backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_shoot + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 163 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_shoot + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 151 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_shoot + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 207 395 13 26 + visible 1 + decoration + } + + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Attack:" + cvar "+attack" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Previous Weapon:" + cvar "weapprev" + rect 99 70 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Next Weapon:" + cvar "weapnext" + rect 99 90 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_YESNO + text "Autoswitch:" + cvar "cg_autoswitch" + rect 99 110 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Gauntlet:" + cvar "weapon 1" + rect 99 130 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Machinegun:" + cvar "weapon 2" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Shotgun:" + cvar "weapon 3" + rect 99 170 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Grenade Launcher:" + cvar "weapon 4" + rect 99 190 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Rocket Launcher:" + cvar "weapon 5" + rect 99 210 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Lightning Gun:" + cvar "weapon 6" + rect 99 230 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Railgun:" + cvar "Weapon 7" + rect 99 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Plasma Gun:" + cvar "weapon 8" + rect 99 270 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "BFG:" + cvar "weapon 9" + rect 99 290 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Nail Gun:" + cvar "weapon 11" + rect 99 310 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Proximity Mine:" + cvar "weapon 12" + rect 99 330 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Chain Gun:" + cvar "weapon 13" + rect 99 350 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + +itemDef { + name ctr_miscellaneous + text "Misc" + type 1 + textscale .3 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 236 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpControls ; show misc } + mouseEnter { show message_misc ; setitemcolor ctr_miscellaneous backcolor .1 .37 .1 1 } + mouseExit { hide message_misc ; setitemcolor ctr_miscellaneous backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_miscellaneous + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 236 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_miscellaneous + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 224 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_miscellaneous + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 280 395 13 26 + visible 1 + decoration + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Show Scores:" + cvar "+scores" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Scroll Scores Up:" + cvar "scoresUp" + rect 99 80 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Scroll Scores Down:" + cvar "scoresDown" + rect 99 110 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Use Item:" + cvar "+button2" + rect 99 140 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + + itemDef { + name misc + group grpControls + type ITEM_TYPE_SLIDER + text "Sensitivity:" + cvarfloat "sensitivity" 5 1 30 + rect 99 170 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show slider_message } + mouseexit { hide slider_message } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_YESNO + text "Invert Mouse:" + cvar "ui_mousePitch" + rect 99 200 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript update ui_mousePitch } + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_YESNO + text "Smooth Mouse:" + cvar "m_filter" + rect 99 230 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + + +itemDef { + name ctr_orders + text "Orders" + type 1 + textscale .3 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 309 395 47 26 + textalign 1 + textalignx 23 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpControls ; show orders} + mouseEnter { show message_misc ; setitemcolor ctr_orders backcolor .1 .37 .1 1 } + mouseExit { hide message_misc ; setitemcolor ctr_orders backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_orders + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 309 395 47 26 + visible 1 + decoration + } + +itemDef { + name ctr_orders + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 297 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_orders + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 355 395 13 26 + visible 1 + decoration + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Next Team Member:" + cvar "nextTeamMember" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Next Team Order:" + cvar "nextOrder" + rect 99 75 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Confirm Order:" + cvar "confirmOrder" + rect 99 100 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Deny Order:" + cvar "denyOrder" + rect 99 125 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Offense:" + cvar "taskOffense" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Defense:" + cvar "taskDefense" + rect 99 175 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Patrol:" + cvar "taskPatrol" + rect 99 200 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Camp:" + cvar "taskCamp" + rect 99 225 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Follow:" + cvar "taskFollow" + rect 99 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Retrieve:" + cvar "taskRetrieve" + rect 99 275 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Escort:" + cvar "taskEscort" + rect 99 300 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "I Have the Flag!:" + cvar "taskOwnFlag" + rect 99 325 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Target Suicide" + cvar "taskSuicide" + rect 99 350 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + +itemDef { + name ctr_chat + text "Chat" + type 1 + textscale .3 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 382 395 45 26 + textalign 1 + textalignx 23 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpControls ; show chat} + mouseEnter { show message_misc ; setitemcolor ctr_chat backcolor .1 .37 .1 1 } + mouseExit { hide message_misc ; setitemcolor ctr_chat backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_chat + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 382 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_chat + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 370 395 13 26 + visible 1 + decoration + } +itemDef { + name ctr_chat + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 426 395 13 26 + visible 1 + decoration + } + +itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Gesture:" + cvar "+button3" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Chat:" + cvar "messagemode" + rect 99 75 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Team Chat:" + cvar "messagemode2" + rect 99 100 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Target Chat:" + cvar "messagemode3" + rect 99 125 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Attack Chat:" + cvar "messagemode4" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Voice Taunt:" + cvar "tauntTaunt" + rect 99 175 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + + +// TOOLS MESSAGE // + +itemDef { + name yesno_message + rect 0 15 640 30 + text "Select the Item to Toggle to Yes or No" + forecolor 1 .75 0 1 + textscale .25 + textalignx 221 + textalign 1 + textaligny 20 + visible 0 + decoration + } +itemDef { + name slider_message + rect 0 15 640 30 + text "Drag the Slider to Increase and Decrease" + forecolor 1 .75 0 1 + textscale .25 + textalignx 221 + textalign 1 + textaligny 20 + visible 0 + decoration + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + + + + + + + + +} + +} + +} diff --git a/quake3/source/ui/controls2.menu b/quake3/source/ui/controls2.menu new file mode 100644 index 0000000..29d9e9a --- /dev/null +++ b/quake3/source/ui/controls2.menu @@ -0,0 +1,911 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "control_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onopen { hide grpControls ; show look } + + +itemDef { + name controls_shader + group grpControls + style WINDOW_STYLE_SHADER + rect 0 45 640 60 + visible 0 + background "ui/assets/controls_shader1" + decoration + } + +itemDef { + name window + group grpControlbutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration + } + +itemDef { + name keyBindStatus + rect 0 15 640 30 + ownerdraw UI_KEYBINDSTATUS + text " " + forecolor 1 .75 0 1 + textscale .25 + textalignx 100 + textalign 1 + textaligny 20 + visible 1 + decoration + } + +itemDef { + name ctr_look + text "Look" + type 1 + textscale .3 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 37 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show look } + mouseEnter { show message_look ; setitemcolor ctr_look backcolor .1 .37 .1 1 } + mouseExit { hide message_look ; setitemcolor ctr_look backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_look + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 37 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_look + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 25 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_look + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 81 395 13 26 + visible 1 + decoration + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Look Down:" + cvar "+lookdown" + //rect 99 140 256 20 + rect 99 135 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Mouse Look:" + cvar "+mlook" + rect 99 160 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Centerview:" + cvar "centerview" + rect 99 185 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "ZoomView:" + cvar "+zoom" + rect 99 210 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_YESNO + text "Free Look:" + cvar "cl_freelook" + rect 99 235 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name ctr_move + text "Move" + type 1 + textscale .3 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 116 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show move } + mouseEnter { show message_move ; setitemcolor ctr_move backcolor .1 .37 .1 1 } + mouseExit { hide message_move ; setitemcolor ctr_move backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_move + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 116 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_move + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 104 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_move + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 160 395 13 26 + visible 1 + decoration + } + + +itemDef { + name move + group grpControls + type ITEM_TYPE_YESNO + text "Always Run:" + cvar "+speed" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Forward:" + cvar "+forward" + rect 99 75 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Backpedal:" + cvar "+back" + rect 99 100 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Move Left:" + cvar "+moveleft" + rect 99 125 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Move Right:" + cvar "+moveright" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Jump:" + cvar "+moveup" + rect 99 175 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Crouch:" + cvar "+movedown" + rect 99 200 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Turn Left:" + cvar "+left" + rect 99 225 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Turn Right:" + cvar "+right" + rect 99 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Strafe:" + cvar "+strafe" + rect 99 275 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + + +itemDef { + name ctr_shoot + text "Shoot" + type 1 + textscale .3 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 197 395 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show shoot } + mouseEnter { show message_shoot ; setitemcolor ctr_shoot backcolor .1 .37 .1 1 } + mouseExit { hide message_shoot ; setitemcolor ctr_shoot backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_shoot + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 197 395 45 26 + visible 1 + decoration + } + +itemDef { + name ctr_shoot + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 185 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_shoot + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 241 395 13 26 + visible 1 + decoration + } + + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Attack:" + cvar "+attack" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Previous Weapon:" + cvar "weapprev" + rect 99 70 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Next Weapon:" + cvar "weapnext" + rect 99 90 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_YESNO + text "Autoswitch:" + cvar "cg_autoswitch" + rect 99 110 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Gauntlet:" + cvar "weapon 1" + rect 99 130 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Machinegun:" + cvar "weapon 2" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Shotgun:" + cvar "weapon 3" + rect 99 170 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Grenade Launcher:" + cvar "weapon 4" + rect 99 190 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Rocket Launcher:" + cvar "weapon 5" + rect 99 210 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Lightning Gun:" + cvar "weapon 6" + rect 99 230 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Railgun:" + cvar "Weapon 7" + rect 99 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Plasma Gun:" + cvar "weapon 8" + rect 99 270 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "BFG:" + cvar "weapon 9" + rect 99 290 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Nail Gun:" + cvar "weapon 11" + rect 99 310 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Proximity Mine:" + cvar "weapon 12" + rect 99 330 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Chain Gun:" + cvar "weapon 13" + rect 99 350 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name ctr_miscellaneous + text "Miscellaneous" + type 1 + textscale .3 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 282 395 140 26 + textalign 1 + textalignx 70 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show misc } + mouseEnter { show message_misc ; setitemcolor ctr_miscellaneous backcolor .1 .37 .1 1 } + mouseExit { hide message_misc ; setitemcolor ctr_miscellaneous backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_miscellaneous + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 282 395 140 26 + visible 1 + decoration + } + +itemDef { + name ctr_miscellaneous + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 270 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_miscellaneous + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 421 395 13 26 + visible 1 + decoration + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Show Scores:" + cvar "+scores" + rect 99 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Use Item:" + cvar "+button2" + rect 99 75 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Gesture:" + cvar "+button3" + rect 99 100 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Chat:" + cvar "messagemode" + rect 99 125 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Team Chat:" + cvar "messagemode2" + rect 99 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Target Chat:" + cvar "messagemode3" + rect 99 175 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Attack Chat:" + cvar "messagemode4" + rect 99 200 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_SLIDER + text "Senstivity:" + cvarfloat "sensitivity" 5 1 30 + rect 99 225 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_YESNO + text "Invert Mouse:" + cvar "ui_mousePitch" + rect 99 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + action { uiScript update mousePitch } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_YESNO + text "Smooth Mouse:" + cvar "m_filter" + rect 99 275 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Next Team Member:" + cvar "nextTeamMember" + rect 99 300 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Next Team Order:" + cvar "nextOrder" + rect 99 325 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 0 + } + + + + + + + + + +} + +} + +} diff --git a/quake3/source/ui/createfavorite.menu b/quake3/source/ui/createfavorite.menu new file mode 100644 index 0000000..a175ae7 --- /dev/null +++ b/quake3/source/ui/createfavorite.menu @@ -0,0 +1,199 @@ +#include "ui/menudef.h" + +{ +\\ CREATE FAVORITE POPUP MENU \\ + +menuDef { + name "createfavorite_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close createfavorite_popmenu ; open joinserver } + + + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + + + + + + // ENTER NAME AND ADDRESS // + +itemDef { + name name + text "Name" + style 0 + decoration + textscale .3 + rect 1 62 110 20 + textalign 1 + textalignx 117 + textaligny 16 + forecolor 0 0 0 1 + visible 1 + + } +itemDef { + name name + text "Name" + style 0 + decoration + textscale .3 + rect 0 61 110 20 + textalign 1 + textalignx 117 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name nameEntry + style 1 + maxchars 15 + text ":" + textscale .25 + TYPE 4 + cvar "ui_favoriteName" + rect 60 81 120 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + backcolor 0 0 0 .5 + visible 1 + mouseenter { setitemcolor nameentry backcolor 0 0 0 .75 } + mouseexit { setitemcolor nameentry backcolor 0 0 0 .5 } + } + + + + + +itemDef { + name address + text "IP Address" + style 0 + decoration + textscale .3 + rect 1 112 110 20 + textalign 1 + textalignx 117 + textaligny 16 + forecolor 0 0 0 1 + visible 1 + + } +itemDef { + name address + text "IP Address" + style 0 + decoration + textscale .3 + rect 0 111 110 20 + textalign 1 + textalignx 117 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name addressEntry + style 1 + maxchars 20 + maxPaintChars 12 + text ":" + textscale .25 + TYPE 4 + maxchars 21 + cvar "ui_favoriteAddress" + rect 60 131 120 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + mouseenter { setitemcolor addressEntry backcolor 0 0 0 .75 } + mouseexit { setitemcolor addressEntry backcolor 0 0 0 .25 } + } + + + + +itemDef { + name yes + text "Ok" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 103 158 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript CreateFavorite ; + close createfavorite_popmenu ; + open joinserver } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 103 158 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 97 158 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 132 158 7 26 + visible 1 + decoration + } + + + + + + +} +} +} \ No newline at end of file diff --git a/quake3/source/ui/createserver.menu b/quake3/source/ui/createserver.menu new file mode 100644 index 0000000..8594e0a --- /dev/null +++ b/quake3/source/ui/createserver.menu @@ -0,0 +1,1331 @@ +#include "ui/menudef.h" + +{ +\\ Server Creation \\ + + menuDef { + name "createserver" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + outOfBoundsClick + focusColor 1 .75 0 1 + style 1 + border 1 + onEsc { close createserver ; open main } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + transition mappreview 7 127 190 1 7 57 190 141 20 10 ; + uiScript loadArenas ; + hide lightning ; + hide accept_alt ; + show accept ; + hide back_alt ; + show back ; + hide grpmessage } + + +itemDef { + name window + rect 2 50 200 370 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 .25 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + +itemDef { + name window + rect 204 50 227 113 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 .25 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + +itemDef { + name window + rect 204 165 227 270 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 .25 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + +itemDef { + name window + rect 433 50 200 183 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 .25 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + decoration +} + +itemDef { + name window + rect 433 235 200 185 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 .25 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + decoration +} +itemDef { + name window + rect 433 50 200 370 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 .25 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + decoration +} + + + +// top bar // + itemDef { + name topbar + style 2 + rect 0 5 640 40 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 .5 + visible 1 + decoration + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + } + + +// GLOBAL SETTINGS + + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_NETGAMETYPE + text "Type:" + textstyle 6 + rect 0 10 320 31 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 26 + textscale .416 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { fadein message_gametype } + mouseExit { fadeout message_gametype } + } + +itemDef { + name gametypefield + style 0 + ownerdraw UI_SKILL + textstyle 6 + text "Skill:" + rect 320 10 320 31 + textalign ITEM_ALIGN_LEFT + textalignx 90 + textaligny 26 + textscale .416 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { fadein message_skill } + mouseExit { fadeout message_skill } + } + + +// map selection + +itemDef { + name mappreview + style 0 + ownerdraw UI_STARTMAPCINEMATIC + rect 7 57 190 141 + border 1 + bordercolor .5 .5 .5 .5 + visible 1 + } + +itemDef { + name mappreview + style WINDOW_STYLE_FILLED + rect 6 56 192 143 + border 1 + bordercolor .5 .5 .5 .5 + visible 1 + } + + itemDef { + name maplist + rect 6 205 192 211 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_ALLMAPS + textstyle 6 + textalign 3 + textaligny 14 + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 1 + columns 1 2 190 25 + mouseEnter { fadein message_arena ; setitemcolor maplist bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor maplist bordercolor .5 .5 .5 .5 } + } + +// SETTINGS // + + + +// NORMAL // + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Capture Limit:" + cvar "capturelimit" + ownerdrawflag UI_SHOW_NETANYTEAMGAME + rect 260 60 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + maxchars 4 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Frag Limit:" + cvar "fraglimit" + ownerdrawflag UI_SHOW_NETANYNONTEAMGAME + rect 260 60 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + maxchars 4 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Time Limit:" + cvar "timelimit" + rect 260 77 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + maxchars 4 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_YESNO + text "Friendly Fire:" + cvar "g_friendlyfire" + rect 260 94 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_YESNO + text "Pure Server:" + cvar "sv_pure" + rect 260 111 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_MULTI + text "Dedicated:" + // syntax for this is cvar name followed by a semicolan separated list of choices first choice equals 0 + // dedicated is a special cvar in that as soon as it is set, the game goes to console only so the ui catches this one specifically + cvar "ui_dedicated" + cvarFloatList { "No" 0 "LAN" 1 "Internet" 2 } + rect 260 128 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_MULTI + text "Punkbuster:" + cvar "sv_punkbuster" + cvarFloatList { "No" 0 "Yes" 1 } + rect 260 145 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + +// EXPERT // + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_EDITFIELD + text "Host Name:" + cvar "sv_hostname" + maxChars 32 + maxPaintChars 10 + rect 260 175 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Auto Download:" + cvar "sv_allowdownload" + rect 260 190 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Enable Voting:" + cvar "g_allowvote" + rect 260 205 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Maximum Players:" + cvar "sv_maxclients" + rect 260 220 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + maxchars 4 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Minimum Ping:" + cvar "sv_minping" + rect 260 235 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + maxchars 4 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Maximum Ping:" + cvar "sv_maxping" + rect 260 250 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + maxchars 4 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Force Join:" + cvar "g_teamautojoin" + rect 260 265 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Even Teams:" + cvar "g_teamforcebalance" + rect 260 280 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Do Warmup:" + cvar "g_dowarmup" + rect 260 295 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Warmup time:" + cvar "g_warmup" + rect 260 310 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + maxchars 4 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Synchronous Client:" + cvar "g_synchronousclients" + rect 260 325 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Max Rate:" + cvar "sv_maxrate" + rect 260 340 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + maxchars 4 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Zombie Time:" + cvar "sv_zombietime" + rect 260 355 128 12 + maxchars 4 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Reconnect Limit:" + cvar "sv_reconnectlimit" + maxchars 4 + rect 260 370 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name expert + group grpsettings + type ITEM_TYPE_YESNO + text "Require Password:" + cvar "g_needpassword" + rect 260 385 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name expert + group grpsettings + type 4 + text "Password:" + cvar "g_password" + rect 260 400 128 12 + maxchars 10 + maxPaintChars 10 + textalign ITEM_ALIGN_RIGHT + textalignx 65 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + + +// BOT LIST FOR TEAM GAMES + +itemDef { + name gametypefield + style 0 + ownerdraw UI_BLUETEAMNAME + rect 450 70 128 28 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 26 + textscale .333 + forecolor 0 0 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_clan } + mouseExit { fadeout message_clan } + } + + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_BLUETEAM1 + rect 450 100 128 20 + text "1." + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + ownerdraw UI_BLUETEAM2 + rect 450 122 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + text "2." + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "3." + ownerdraw UI_BLUETEAM3 + rect 450 144 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "4." + ownerdraw UI_BLUETEAM4 + rect 450 166 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "5." + ownerdraw UI_BLUETEAM5 + rect 450 188 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + + + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_REDTEAMNAME + rect 450 250 128 28 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 26 + textscale .333 + forecolor 1 0 0 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_clan } + mouseExit { fadeout message_clan } + } + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_REDTEAM1 + text "1." + rect 450 280 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "2." + ownerdraw UI_REDTEAM2 + rect 450 302 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "3." + ownerdraw UI_REDTEAM3 + rect 450 324 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "4." + ownerdraw UI_REDTEAM4 + rect 450 346 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "5." + ownerdraw UI_REDTEAM5 + rect 450 368 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +// BOT LIST FOR NONTEAMGAMES + + +itemDef { + name gametypefield + style 0 + text "1." + ownerdraw UI_BLUETEAM1 + rect 450 100 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "2." + ownerdraw UI_REDTEAM1 + rect 450 125 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "3." + ownerdraw UI_BLUETEAM2 + rect 450 150 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "4." + ownerdraw UI_REDTEAM2 + rect 450 175 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "5." + ownerdraw UI_BLUETEAM3 + rect 450 200 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + + + + + + + +itemDef { + name gametypefield + style 0 + text "6." + ownerdraw UI_REDTEAM3 + rect 450 225 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "7." + ownerdraw UI_BLUETEAM4 + rect 450 250 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "8." + ownerdraw UI_REDTEAM4 + rect 450 275 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "9." + ownerdraw UI_BLUETEAM5 + rect 450 300 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + +itemDef { + name gametypefield + style 0 + text "10." + ownerdraw UI_REDTEAM5 + rect 443 325 128 20 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 18 + textscale .333 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + cvarTest "ui_actualNetGameType" + showCvar { "0" ; "1" ; "2" } + action { play "sound/misc/nomenu.wav" } + mouseEnter { fadein message_slot } + mouseExit { fadeout message_slot } + } + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.75 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close createserver ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close createserver ; open main } + } + + + + itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { playlooped "sound/misc/loop_electricity_05.wav" ; show lightning ; hide accept ; show accept_alt ; fadein message_accept } + action { close fight ; uiScript StartServer } +/* + // demo_only + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" } +*/ + } + + itemDef { + name accept_alt + style 3 + rect 572 422 54 54 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { close fight ; uiScript StartServer } + mouseExit { hide lightning ; hide accept_alt ; show accept ; fadeout message_accept ; playlooped "music/fla_mp03.wav" } +/* + // demo_only + cvarTest "ui_actualNetGameType" + hideCvar { "0" ; "1" } +*/ + } +itemDef { + name lightning + style 3 + background lightningkc + rect 46 385 236 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 355 385 236 128 + visible 0 + decoration + } + + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textalignx 0 + textstyle 1 + textaligny 25 + textscale .416 + text "Start Server" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_gametype + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Set GameType" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_skill + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Set Skill Level" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_arena + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Choose Your Arena" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_clan + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Click to toggle through clan list" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_slot + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Click to toggle botnames, human, or closed slots" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_normal + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select to Modify Normal Server Settings" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_expert + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select to Modify Expert Server Settings" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + +} +} + +} diff --git a/quake3/source/ui/credit.menu b/quake3/source/ui/credit.menu new file mode 100644 index 0000000..b8f4450 --- /dev/null +++ b/quake3/source/ui/credit.menu @@ -0,0 +1,459 @@ +#include "ui/menudef.h" + +{ +\\ CREDIT \\ + + menuDef { + name "credit" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .67 0 1 + style 1 + border 1 + soundloop "" + onEsc { close credit ; open menu } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + show grpidcredit ; + hide grpoutcredit ; + transition programming 0 0 640 30 0 80 640 30 20 10 ; + transition artist 0 0 640 30 0 110 640 30 20 10 ; + transition levelDesign 0 0 640 30 0 140 640 30 20 10 ; + transition gameDesign 0 0 640 30 0 170 640 30 20 10 ; + transition ceo 0 0 640 30 0 200 640 30 20 10 ; + transition bizdev 0 0 640 30 0 230 640 30 20 10 ; + transition idMom 0 0 640 30 0 260 640 30 20 10 ; + transition devAssist 0 0 640 30 0 290 640 30 20 10 ; + transition progAssist 0 0 640 30 0 340 640 30 20 10 ; + hide back_alt ; + show back ; + hide grpmessage } + + + + +// LEVEL SELECTION BAR // + + +itemDef { + name mappreview + style 5 + cinematic "idlogo.roq" + rect 0 0 640 480 + backcolor 1 1 1 .25 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + decoration + visible 1 + } + + +itemDef { + name idcredit + group grpidcredit + rect 0 50 620 20 + style 1 + textalign 1 + textalignx 320 + textaligny 10 + textstyle 6 + textscale .4 + text "id Software is:" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name programming + group grpidcredit + style 0 + rect 0 80 640 30 + textalign 1 + textstyle 6 + textalignx 320 + textaligny 10 + textscale .333 + text "PROGRAMMING: John Carmack, Robert Duffy, Jim Dose'" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name artist + group grpidcredit + style 0 + rect 0 110 640 30 + textstyle 6 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "ART: Adrian Carmack, Kevin Cloud, Kenneth Scott, Seneca Menard, Fred Nilsson " + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name levelDesign + group grpidcredit + style 0 + rect 0 140 640 30 + textalign 1 + textalignx 320 + textstyle 6 + textaligny 10 + textscale .333 + text "LEVEL DESIGN: Tim Willits, Christian Antkow, Paul Jaquays" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name gameDesign + group grpidcredit + style 0 + rect 0 170 640 30 + textalign 1 + textalignx 320 + textstyle 6 + textaligny 10 + textscale .333 + text "GAME DESIGN: Graeme Devine" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name ceo + group grpidcredit + style 0 + rect 0 200 640 30 + textstyle 6 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "CEO: Todd Hollenshead" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name bizDev + group grpidcredit + style 0 + rect 0 230 640 30 + textalign 1 + textalignx 320 + textstyle 6 + textaligny 10 + textscale .333 + text "BUSINESS DEVELOPMENT: Marty Stratton" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name idMom + group grpidcredit + style 0 + rect 0 260 640 30 + textalign 1 + textalignx 320 + textstyle 6 + textaligny 10 + textscale .333 + text "OFFICE MANAGER AND ID MOM: Donna Jackson" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name devAssist + group grpidcredit + style 0 + rect 0 290 640 30 + textalign 1 + textalignx 320 + textstyle 6 + textaligny 10 + textscale .333 + text "DEVELOPMENT ASSISTANCE: Eric Webb" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name progAssist + group grpidcredit + style 0 + rect 0 340 640 30 + textalign 1 + textalignx 320 + textstyle 6 + textaligny 10 + textscale .333 + text "BOT AI & PROGRAMMING ASSISTANCE: Jan Paul van Waveren" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name outcreditbttn + group grpidcredit + rect 255 400 130 26 + type 1 + text "Additional Credit" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 65 + textaligny 20 + visible 0 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + action { play "sound/misc/kcaction.wav" ; + hide grpidcredit ; + show grpoutcredit } + mouseEnter { setitemcolor outcreditbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor outcreditbttn backcolor .37 .1 .1 1 } + } +itemDef { + name idcreditbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 255 400 130 26 + visible 0 + decoration + } + +itemDef { + name idcreditbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 243 400 13 26 + visible 0 + decoration + } + +itemDef { + name idcreditbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 384 400 13 26 + visible 0 + decoration + } + +// OUTSIDE CREDIT // + +itemDef { + name outcredit + group grpoutcredit + rect 0 50 620 20 + style 1 + textalign 1 + textalignx 320 + textaligny 10 + textstyle 6 + textscale .4 + text "Additional Assistance" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name outcredit + group grpoutcredit + style 1 + rect 75 100 620 15 + textalign 0 + textstyle 3 + textalignx 5 + textaligny 10 + textscale .25 + wrapped + text"Additional Map Work by Ka'ai Cluney\r" + "Additional Progamming by John Cash\r" + "Character Models and Animation by Paul Steed\r" + "Additional Model Work by Beau Anderson\r" + "Motion Capture by Pyros Pictures, House of Moves, and LocoMotion Studios\r\r\r" + "Sound Design by Soundelux Showorks\r" + "Music by Sonic Mayhem (www.sonicmayhem.com)\r" + "Music by Front Line Assembly\r\r\r" + "Manual by William W. Connors\r" + "Manual & Package Design by Focus2\r" + "Portions of Team Arena based in part on the work of the Independent JPEG Group\r" + "Font rendering performed by FreeType ( www.freetype.org )" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name idcreditbttn + group grpoutcredit + type 1 + rect 260 400 120 26 + text "id Credit" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 60 + textaligny 20 + visible 0 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + action { play "sound/misc/kcaction.wav" ; + hide grpoutcredit ; + show grpidcredit } + mouseEnter { setitemcolor idcreditbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor idcreditbttn backcolor .37 .1 .1 1 } + } +itemDef { + name outcredit + group grpoutcredit + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 260 400 120 26 + visible 0 + decoration + } + +itemDef { + name outcredit + group grpoutcredit + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 248 400 13 26 + visible 0 + decoration + } + +itemDef { + name outcredit + group grpoutcredit + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 379 400 13 26 + visible 0 + decoration + } + + + + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close credit ; open main } + mouseEnter { hide back ; show back_alt ; show message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; hide message_back } + action { close credit ; open main } + } + + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + +} + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/default.menu b/quake3/source/ui/default.menu new file mode 100644 index 0000000..1ddd85a --- /dev/null +++ b/quake3/source/ui/default.menu @@ -0,0 +1,255 @@ +#include "ui/menudef.h" + +{ +\\ DEFAULT MENU \\ + +menuDef { + name "default_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + show grpdefault ; + hide grpfinish } + onEsc { close default_menu ; close setup_menu ; open main } + + + + +itemDef { + name window + group grpControlbutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + + itemDef { + name default + group grpdefault + style 0 + text "This will set your Controls," + rect 0 140 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name default + group grpdefault + style 0 + text "Graphics and game Options" + rect 0 160 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name default + group grpdefault + style 0 + text "to their original defaults." + rect 0 180 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name default + group grpdefault + style 0 + text "Are you sure?" + rect 0 220 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + +itemDef { + name yes + text "YES" + group grpdefault + type 1 + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 135 250 70 26 + textalign 1 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + hide grpdefault ; + show grpfinish ; + uiScript resetDefaults } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 135 250 70 26 + visible 1 + decoration + } + + itemDef { + name yes + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 123 250 13 26 + visible 1 + decoration + } + + itemDef { + name yes + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 204 250 13 26 + visible 1 + decoration + } + +itemDef { + name no + text "No" + group grpdefault + type 1 + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 235 250 70 26 + textalign 1 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close default_menu ; open control_menu } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + + itemDef { + name no + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 235 250 70 26 + visible 1 + decoration + } + + itemDef { + name no + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 223 250 13 26 + visible 1 + decoration + } + + itemDef { + name no + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 304 250 13 26 + visible 1 + decoration + } + +itemDef { + name finish_message + group grpfinish + style 0 + text "Your settings are now set" + rect 0 160 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + decoration + } + itemDef { + name finish_message + group grpfinish + style 0 + text "to their original default values." + rect 0 180 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + decoration + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + + + + + + + +} diff --git a/quake3/source/ui/demo.menu b/quake3/source/ui/demo.menu new file mode 100644 index 0000000..bce3fbd --- /dev/null +++ b/quake3/source/ui/demo.menu @@ -0,0 +1,266 @@ +#include "ui/menudef.h" + +{ +\\ Fight \\ + + menuDef { + name "demo" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .67 0 1 + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; uiScript LoadDemos ; + hide lightning ; + hide accept_alt ; + show accept ; + hide back_alt ; + show back ; + hide grpmessage } + onEsc { close demo ; open main } + + + + + + + +// LEVEL SELECTION BAR // + + + itemDef { + name levelbar + style 2 + text "TEAM ARENA DEMOS" + rect 0 16 640 40 + textstyle 6 + textscale 0.416 + textalign 1 // center + textalignx 320 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 27 + forecolor 1 1 1 1 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + decoration + } + + itemDef { + name teamarenaimage + style 3 + background "ui/assets/teamarenaimage.tga" + rect 0 80 220 115 + visible 1 + } + + +itemDef { + name mappreview + style 5 + cinematic "mpintro.roq" + rect 20 195 200 150 + backcolor 1 1 1 .25 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + decoration + visible 1 + } + + +itemDef { + name demolist + rect 240 100 360 300 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_DEMOS + textalign 3 + textaligny 14 + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 1 + mouseEnter { fadein message_demos ; setitemcolor demolist bordercolor .7 0 0 1 } + mouseExit { fadeout message_demos ; setitemcolor demolist bordercolor .5 .5 .5 .5 } + } + + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close demo ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close demo ; open main } + } + + + + +itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show lightning ; hide accept ; show accept_alt ; show message_accept ; playlooped "sound/misc/loop_electricity_05.wav" } + action { close demo } + } + +itemDef { + name accept_alt + style 3 + rect 572 422 54 54 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { close demo ; uiScript RunDemo } + mouseExit { hide lightning ; hide accept_alt ; show accept ; hide message_accept ; playlooped "music/fla_mp03.wav" } + } + + itemDef { + name lightning + style 3 + background lightningkc + rect 44 385 246 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 345 385 246 128 + visible 0 + decoration + } + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "View Demo" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_demos + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select Recorded Game To View" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + +} + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/demo_quit.menu b/quake3/source/ui/demo_quit.menu new file mode 100644 index 0000000..074c9e5 --- /dev/null +++ b/quake3/source/ui/demo_quit.menu @@ -0,0 +1,252 @@ +#include "ui/menudef.h" + +{ +\\ DEMO QUIT \\ + + menuDef { + name "demo_quit" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .67 0 1 + style 1 + border 1 + onEsc { uiScript "quit" } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox } + + +itemDef { + name actionback + style WINDOW_STYLE_EMPTY + rect 0 0 640 480 + type 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript "quit" } + } + + +// LEVEL SELECTION BAR // + +itemDef { + name teamarenaart + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/teamarenaimage2.tga" + rect 64 0 512 150 + visible 1 + decoration + } + + + + + +itemDef { + name demo + group grpidcredit + style 0 + rect 0 160 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .5 + text "" + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name artist + group grpidcredit + style 0 + rect 0 190 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "Thanks for playing the Quake III: Team Arena DEMO." + forecolor 1 1 1 1 + decoration + visible 1 + } + + +itemDef { + name levelDesign + group grpidcredit + style 0 + rect 0 220 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "For more information about Team Arena" + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name gameDesign + group grpidcredit + style 0 + rect 0 250 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "check out the official Quake III website at" + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name ceo + group grpidcredit + style 0 + rect 0 280 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "www.quake3world.com." + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name bizDev + group grpidcredit + style 0 + rect 0 310 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "" + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name idMom + group grpidcredit + style 0 + rect 0 340 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "Christmas 2000." + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name devAssist + group grpidcredit + style 0 + rect 0 380 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .333 + text "Full Version of Quake III is Required." + forecolor 1 1 1 1 + decoration + visible 1 + } + + +itemDef { + name exitbttn + group grpidcredit + rect 255 420 130 26 + type 1 + text "Click to Exit" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 65 + textaligny 20 + visible 1 + decoration + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + action { play "sound/misc/nomenu.wav" } + mouseEnter { setitemcolor exitbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor exitbttn backcolor .37 .1 .1 1 } + } +itemDef { + name exitbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 255 420 130 26 + visible 1 + decoration + } + +itemDef { + name exitbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 243 420 13 26 + visible 1 + decoration + } + +itemDef { + name exitbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 384 420 13 26 + visible 1 + decoration + } + +itemDef { + name copyright + text "Quake III: Team Arena Copyright 2000 Id Software, Inc. All rights reserved" + style 0 + textscale .25 + rect 0 440 640 40 + textalign 1 + textaligny 32 + textalignx 320 + forecolor .75 0 0 .75 + visible 1 + decoration + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/endofgame.menu b/quake3/source/ui/endofgame.menu new file mode 100644 index 0000000..ed4b706 --- /dev/null +++ b/quake3/source/ui/endofgame.menu @@ -0,0 +1,1331 @@ +#include "ui/menudef.h" + +{ +\\ END OF GAME \\ + +menuDef { + name "endOfGame" + visible 0 + fullscreen 1 + rect 0 0 640 480 + backcolor 0 0 0 1 + background "menuback_a" + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.05 + focusColor 1 .75 0 1 + onClose { uiScript updateSPMenu } + onESC { close endOfGame ; open skirmish } + onOpen { close ingame ; + play "sound/misc/kcswish.wav" ; + playlooped "music/win.wav" ; + setitemcolor fadebox backcolor 0 0 0 1 ; + transition mappreview 0 0 640 480 120 111 400 300 20 10 ; + transition playerlogo 250 160 160 160 110 30 80 80 20 10 ; + transition opposinglogo 250 160 160 160 450 30 80 80 20 10 ; + fadeout fadebox } + + + + + + +itemDef { + name window + rect 0 0 640 480 + style 1 + backcolor 0 0 0 0 + forecolor 0 0 0 0 + visible 1 + decoration + } +itemDef { + name menuback_e + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + background "menuback_e" + visible 1 + decoration + } + + + +itemDef { + name menuback_b + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + visible 1 + background "menuback_b" + bordercolor 0.5 0.5 0.5 .7 + decoration + } + +itemDef { + name mappreview + ownerdraw UI_MAPCINEMATIC + rect 120 111 400 300 + backcolor 1 1 1 1 + border 1 + bordercolor .5 .5 .5 1 + bordersize 1 + decoration + visible 1 + } + + + +itemDef { + name windowscreen + rect 0 0 640 240 + style 3 + background levelshotdetail + forecolor 0 0 0 0 + visible 1 + decoration + } +itemDef { + name windowscreen + rect 0 240 640 240 + style 3 + background levelshotdetail + forecolor 0 0 0 0 + visible 1 + decoration + } + + +itemDef { + name gametypebar + style 2 + rect 0 50 640 40 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + decoration + } + + itemDef { + name opposingteamfield + text "GAME STATS" + rect 0 70 128 12 + textstyle 6 + textalign ITEM_ALIGN_CENTER + textalignx 320 + textaligny 12 + textscale .416 + forecolor 1 1 1 1 + decoration + visible 1 + } + + + + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO_METAL + rect 110 30 80 80 + visible 1 + forecolor 1 .7 .7 1 + decoration + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + rect 450 30 80 80 + visible 1 + forecolor .7 .7 1 1 + decoration + } + + + + + + + + + + +// AWARDS TEAM GAME // + + +itemdef { + name medal_assist_team_shadow + rect 187 362 30 30 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + forecolor 0 0 0 .5 + visible 1 + decoration + } + + +itemdef { + name medal_assist_team + rect 185 360 30 30 + type ITEM_TYPE_EDITFIELD + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + cvar "ui_scoreAssists2" + ownerdrawflag UI_SHOW_ANYTEAMGAME + textscale .22 + textalign 1 + text "" + textalignx 15 + textaligny 40 + visible 1 + decoration + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_assist } + mouseexit { hide message_assist } + } +itemdef { + name medal_accuracy_team_shadow + style WINDOW_STYLE_SHADER + rect 227 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + } + +itemdef { + name medal_accuracy_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreAccuracy2" + rect 225 360 30 30 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_accuracy } + mouseexit { hide message_accuracy } + } +itemdef { + name medal_excellent_team_shadow + style WINDOW_STYLE_SHADER + rect 267 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + } + +itemdef { + name medal_excellent_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreExcellents2" + rect 265 360 30 30 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_excellent } + mouseexit { hide message_excellent } + } + + + +itemdef { + name medal_gauntlet_team_shadow + style WINDOW_STYLE_SHADER + rect 307 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + } + +itemdef { + name medal_gauntlet_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreGauntlets2" + rect 305 360 30 30 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_gauntlet } + mouseexit { hide message_gauntlet } + } + + +itemdef { + name medal_impressive_team_shadow + style WINDOW_STYLE_SHADER + rect 347 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + } + + +itemdef { + name medal_impressive_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreImpressives2" + rect 345 360 30 30 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_impressive } + mouseexit { hide message_impressive } + } + + + +itemdef { + name medal_defend_team_shadow + style WINDOW_STYLE_SHADER + rect 387 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + } + + +itemdef { + name medal_defend_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreDefends2" + rect 385 360 30 30 + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_defend } + mouseexit { hide message_defend } + } + + +itemdef { + name medal_capture_team_shadow + style WINDOW_STYLE_SHADER + rect 427 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + } + + + +itemdef { + name medal_capture_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreCaptures2" + rect 425 360 30 30 + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_capture } + mouseexit { hide message_capture } + } + + + + + +// AWARDS NONTEAM GAME // + +itemdef { + name medal_perfect_nonteam_shadow + rect 232 362 30 30 + forecolor 0 0 0 .5 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + } + + + +itemdef { + name medal_perfect_nonteam + rect 230 360 30 30 + type ITEM_TYPE_EDITFIELD + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + cvar "ui_scorePerfect2" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + textscale .22 + textalign 1 + text "" + textalignx 15 + textaligny 40 + visible 1 + decoration + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_perfect } + mouseexit { hide message_perfect } + } + +itemdef { + name medal_accuracy_nonteam_shadow + style WINDOW_STYLE_SHADER + rect 272 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + } + +itemdef { + name medal_accuracy_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreAccuracy2" + rect 270 360 30 30 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_accuracy } + mouseexit { hide message_accuracy } + } + + +itemdef { + name medal_excellent_nonteam_shadow + style WINDOW_STYLE_SHADER + rect 312 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + } + + + +itemdef { + name medal_excellent_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreExcellents2" + rect 310 360 30 30 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_excellent } + mouseexit { hide message_excellent } + } + +itemdef { + name medal_gauntlet_nonteam_shadow + style WINDOW_STYLE_SHADER + rect 352 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + } + + +itemdef { + name medal_gauntlet_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreGauntlets2" + rect 350 360 30 30 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_gauntlet } + mouseexit { hide message_gauntlet } + } + + + +itemdef { + name medal_impressive_nonteam_shadow + style WINDOW_STYLE_SHADER + rect 392 362 30 30 + forecolor 0 0 0 .5 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + } + + +itemdef { + name medal_impressive_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreImpressives2" + rect 390 360 30 30 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_impressive } + mouseexit { hide message_impressive } + } + + + +// SOUND BUTTON // + + +itemdef { + name medal_assist_window + rect 183 358 34 34 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + type 1 + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_assist_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_assist_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_assist.wav" } + } + +itemdef { + name medal_accuracy_window + rect 223 358 34 34 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + type 1 + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_accuracy_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_accuracy_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_accuracy.wav" } + } +itemdef { + name medal_excellent_window + rect 263 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_excellent_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_excellent_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_excellent.wav" } + } +itemdef { + name medal_gauntlet_window + rect 303 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_gauntlet_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_gauntlet_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_gauntlet.wav" } + } +itemdef { + name medal_impressive_window + rect 343 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_impressive_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_impressive_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_impressive.wav" } + } +itemdef { + name medal_defend_window + rect 383 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_defend_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_defend_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_defense.wav" } + } +itemdef { + name medal_capture_window + rect 423 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_capture_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_capture_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_captures.wav" } + } + + + + + + + + +itemdef { + name medal_perfect_window + rect 228 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_perfect_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_perfect_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/perfect.wav" } + } + +itemdef { + name medal_accuracy_window + rect 268 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_accuracy_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_accuracy_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_accuracy.wav" } + } + + + +itemdef { + name medal_excellent_window + rect 308 358 34 34 + type 1 + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + style WINDOW_STYLE_SHADER + background "ui/assets/medal_excellent.tga" + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_excellent_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_excellent_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_excellent.wav" } + } + + +itemdef { + name medal_gauntlet_window + rect 348 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_gauntlet_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_gauntlet_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_gauntlet.wav" } + } + + +itemdef { + name medal_impressive_window + rect 388 358 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_impressive_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_impressive_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_impressive.wav" } + } + + + + + +// SCORE // + + + // MAP SETTINGS // + + + + itemDef { + name mapname + type 4 + text "Map:" + cvar "ui_scoremap" + rect 0 140 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + decoration + visible 1 + } + + + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Frag limit:" + cvar "ui_fraglimit" + textstyle 3 + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + rect 0 155 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Capture limit:" + cvar "ui_capturelimit" + ownerdrawflag UI_SHOW_ANYTEAMGAME + rect 0 155 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + ownerdraw UI_MAP_TIMETOBEAT + text "Time to Beat:" + rect 0 170 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Skill Multiplier:" + cvar "g_spSkill" + rect 0 185 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name recordDemo + type ITEM_TYPE_YESNO + text "Record Game:" + cvar "ui_recordSPDemo" + rect 0 200 640 12 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textstyle 3 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + forecolor 1 1 1 1 + visible 1 + action { } + } + + + + + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Game Score:" + cvar "ui_scoreTeam2" + rect 0 225 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Completion Time:" + cvar "ui_scoreTime2" + rect 0 240 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Base Score:" + cvar "ui_scoreBase2" + rect 0 265 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Time Bonus:" + cvar "ui_scoreTimeBonus2" + rect 0 280 128 12 + textstyle 3 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Shutout Bonus:" + cvar "ui_scoreShutoutBonus2" + rect 0 295 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textstyle 3 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Skill Bonus:" + cvar "ui_scoreSkillBonus2" + rect 0 310 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + textstyle 3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Total Score:" + cvar "ui_scoreScore2" + rect 0 325 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 320 + textaligny 12 + textscale .25 + textstyle 3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + + + + + +itemDef { + name level_info + group grplevelinfo2 + textstyle ITEM_TEXTSTYLE_BLINK + textscale .333 + text "New High Score" + textstyle 3 + rect 0 345 320 20 + ownerdrawflag UI_SHOW_NEWHIGHSCORE + textalign 1 + textalignx 320 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 12 + backcolor 0 0 0 0 + forecolor 1 0 0 1 + decoration + visible 1 + } + + +// BUTTON // + + +itemDef { + name replay + text "Replay" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 178 430 45 26 + textalign 1 + textalignx 23 + textaligny 19 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close endofgame ; + close skirmish ; + uiScript skirmishStart } + mouseEnter { setitemcolor replay backcolor .1 .37 .1 1 } + mouseExit { setitemcolor replay backcolor .37 .1 .1 1 } + } +itemDef { + name replay + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 178 430 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name replay + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 166 430 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name replay + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 221 430 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } +itemDef { + name demo + text "Demo" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 257 430 45 26 + textalign 1 + textalignx 23 + textaligny 19 + forecolor .5 .5 .5 1 + backcolor .37 .1 .1 1 + decoration + visible 1 + } + +itemDef { + name demo + text "Demo" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 257 430 45 26 + textalign 1 + textalignx 23 + textaligny 19 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + ownerdrawflag UI_SHOW_DEMOAVAILABLE + action { play "sound/misc/nomenu.wav" ; + close endofgame ; + uiScript RunSPDemo } + mouseEnter { setitemcolor demo backcolor .1 .37 .1 1 } + mouseExit { setitemcolor demo backcolor .37 .1 .1 1 } + } +itemDef { + name demo + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 257 430 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name demo + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 245 430 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name demo + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 301 430 13 26 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +itemDef { + name main + text "Menu" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 338 430 45 26 + textalign 1 + textalignx 23 + textaligny 19 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close endofgame ; + open skirmish } + mouseEnter { setitemcolor main backcolor .1 .37 .1 1 } + mouseExit { setitemcolor main backcolor .37 .1 .1 1 } + } + +itemDef { + name main + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 338 430 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name main + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 326 430 13 26 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name main + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 382 430 13 26 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name next + text "Next" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 419 430 45 26 + textalign 1 + textalignx 23 + textaligny 19 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript nextSkirmish ; + close endofgame } + mouseEnter { setitemcolor next backcolor .1 .37 .1 1 } + mouseExit { setitemcolor next backcolor .37 .1 .1 1 } + } + +itemDef { + name next + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 419 430 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name next + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 407 430 13 26 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name next + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 463 430 13 26 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 .5 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + +} + + +} + + diff --git a/quake3/source/ui/endofgame2.menu b/quake3/source/ui/endofgame2.menu new file mode 100644 index 0000000..cc39ade --- /dev/null +++ b/quake3/source/ui/endofgame2.menu @@ -0,0 +1,1034 @@ +#include "ui/menudef.h" + +{ +\\ END OF GAME \\ + +menuDef { + name "endOfGame" + visible 0 + fullscreen 0 + rect 158 80 320 340 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onClose { uiScript updateSPMenu } + onESC { close endOfGame ; open skirmish } + exec "play music/win.wav" + +itemDef { + name window + rect 10 15 320 340 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } +itemDef { + name window + rect 10 15 310 330 + style 1 + backcolor 0 0 0 .5 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + + +itemDef { + name window + rect 10 15 300 320 + style 1 + backcolor 0 0 0 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 184 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 274 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 274 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 192 16 96 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 304 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 192 16 96 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 330 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 172 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + itemDef { + name teamarenaimage + style 3 + background "ui/assets/teamarenaimage.tga" + rect 70 20 180 90 + visible 1 + } + +itemDef { + name window + rect 20 81 280 40 + style 1 + backcolor 0 0 0 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO_METAL + rect 20 25 60 60 + visible 1 + forecolor 1 .7 .7 1 + decoration + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + rect 240 25 60 60 + visible 1 + forecolor .7 .7 1 1 + decoration +} + + + + + + + +// AWARDS TEAM GAME // + +itemdef { + name medal_assist_team + rect 25 250 30 30 + type ITEM_TYPE_EDITFIELD + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + cvar "ui_scoreAssists" + ownerdrawflag UI_SHOW_ANYTEAMGAME + textscale .22 + textalign 1 + text "" + textalignx 15 + textaligny 40 + visible 1 + decoration + border 1 + bordersize 1 + bordercolor 1 1 1 0 + + } + + + +itemdef { + name medal_accuracy_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreAccuracy" + rect 65 250 30 30 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + } + + +itemdef { + name medal_excellent_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreExcellents" + rect 105 250 30 30 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + } + + +itemdef { + name medal_gauntlet_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreGauntlets" + rect 145 250 30 30 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + } + + +itemdef { + name medal_impressive_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreImpressives" + rect 185 250 30 30 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + } + +itemdef { + name medal_defend_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreDefends" + rect 225 250 30 30 + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + } + +itemdef { + name medal_capture_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreCaptures" + rect 265 250 30 30 + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + } + + + + + +// AWARDS NONTEAM GAME // + + +itemdef { + name medal_perfect_nonteam + rect 60 250 30 30 + type ITEM_TYPE_EDITFIELD + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + cvar "ui_scorePerfect" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + textscale .22 + textalign 1 + text "" + textalignx 15 + textaligny 40 + visible 1 + decoration + border 1 + bordersize 1 + } + +itemdef { + name medal_accuracy_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreAccuracy" + rect 100 250 30 30 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + } + + +itemdef { + name medal_excellent_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreExcellents" + rect 140 250 30 30 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + } + + + + +itemdef { + name medal_gauntlet_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreGauntlets" + rect 180 250 30 30 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + } + + +itemdef { + name medal_impressive_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreImpressives" + rect 220 250 30 30 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + } + + +// SOUND BUTTON // + + +itemdef { + name medal_assist_window + rect 23 248 34 34 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + type 1 + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_assist_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_assist_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/assist.wav" } + } + +itemdef { + name medal_accuracy_window + rect 63 248 34 34 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + type 1 + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_accuracy_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_accuracy_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/accuracy.wav" } + } +itemdef { + name medal_excellent_window + rect 103 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_excellent_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_excellent_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/excellent.wav" } + } +itemdef { + name medal_gauntlet_window + rect 143 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_gauntlet_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_gauntlet_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/gauntlet.wav" } + } +itemdef { + name medal_impressive_window + rect 183 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_impressive_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_impressive_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/impressive.wav" } + } +itemdef { + name medal_defend_window + rect 223 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_defend_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_defend_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/defense.wav" } + } +itemdef { + name medal_capture_window + rect 263 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_capture_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_capture_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_captures.wav" } + } + + + + + + + +itemdef { + name medal_perfect_window + rect 58 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_perfect_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_perfect_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/perfect.wav" } + } + +itemdef { + name medal_accuracy_window + rect 98 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_accuracy_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_accuracy_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/accuracy.wav" } + } + + + +itemdef { + name medal_excellent_window + rect 138 248 34 34 + type 1 + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + style WINDOW_STYLE_SHADER + background "ui/assets/medal_excellent.tga" + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_excellent_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_excellent_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/excellent.wav" } + } + + +itemdef { + name medal_gauntlet_window + rect 178 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_gauntlet_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_gauntlet_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/gauntlet.wav" } + } + + +itemdef { + name medal_impressive_window + rect 218 248 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_impressive_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_impressive_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/impressive.wav" } + } + + + + +// SCORE // + + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Game Score:" + cvar "ui_scoreTeam" + rect 160 95 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Completion Time:" + cvar "ui_scoreTime" + rect 160 115 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Base Score:" + cvar "ui_scoreBase" + rect 160 135 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Time Bonus:" + cvar "ui_scoreTimeBonus" + rect 160 155 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Shutout Bonus:" + cvar "ui_scoreShutoutBonus" + rect 160 175 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Skill Bonus:" + cvar "ui_scoreSkillBonus" + rect 160 195 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Total Score:" + cvar "ui_scoreScore" + rect 160 215 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .3 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + +itemDef { + name level_info + group grplevelinfo2 + textstyle ITEM_TEXTSTYLE_BLINK + textscale .3 + text "New High Score" + rect 0 235 320 20 + ownerdrawflag UI_SHOW_NEWHIGHSCORE + textalign 1 + textalignx 160 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 12 + backcolor 0 0 0 0 + forecolor 1 0 0 1 + decoration + visible 1 + } + + +// BUTTON // + + +itemDef { + name replay + text "Replay" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 57 305 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { close endofgame ; close skirmish ; uiScript skirmishStart } + mouseEnter { setitemcolor replay backcolor .1 .37 .1 1 } + mouseExit { setitemcolor replay backcolor .37 .1 .1 1 } + } +itemDef { + name replay + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 57 305 45 26 + visible 1 + forecolor .5 .5 .5 1 + decoration + } + +itemDef { + name replay + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 45 305 13 26 + visible 1 + forecolor .5 .5 .5 1 + decoration + } + +itemDef { + name replay + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 101 305 13 26 + visible 1 + forecolor .5 .5 .5 1 + decoration + } + + +itemDef { + name demo + text "Demo" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 136 305 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + ownerdrawflag UI_SHOW_DEMOAVAILABLE + action { close endofgame ; uiScript RunSPDemo } + mouseEnter { setitemcolor demo backcolor .1 .37 .1 1 } + mouseExit { setitemcolor demo backcolor .37 .1 .1 1 } + } +itemDef { + name demo + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 136 305 45 26 + visible 1 + forecolor .5 .5 .5 1 + ownerdrawflag UI_SHOW_DEMOAVAILABLE + decoration + } + +itemDef { + name demo + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 124 305 13 26 + visible 1 + forecolor .5 .5 .5 1 + ownerdrawflag UI_SHOW_DEMOAVAILABLE + decoration + } + +itemDef { + name demo + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 180 305 13 26 + forecolor .5 .5 .5 1 + visible 1 + ownerdrawflag UI_SHOW_DEMOAVAILABLE + decoration + } + + +itemDef { + name main + text "Esc" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 217 305 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { close endofgame ; open skirmish } + mouseEnter { setitemcolor main backcolor .1 .37 .1 1 } + mouseExit { setitemcolor main backcolor .37 .1 .1 1 } + } + +itemDef { + name main + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 217 305 45 26 + visible 1 + forecolor .5 .5 .5 1 + decoration + } + +itemDef { + name main + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 205 305 13 26 + forecolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name main + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 261 305 13 26 + forecolor .5 .5 .5 1 + visible 1 + decoration + } + + + + + +} + + +} + + diff --git a/quake3/source/ui/error.menu b/quake3/source/ui/error.menu new file mode 100644 index 0000000..3281e5f --- /dev/null +++ b/quake3/source/ui/error.menu @@ -0,0 +1,318 @@ +#include "ui/menudef.h" + +{ +\\ END OF GAME \\ + +menuDef { + name "error_popmenu" + visible 0 + fullscreen 0 + rect 158 80 320 320 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onClose { uiScript clearError } + onOpen { } + onESC { close error_popmenu ; open main } + + + +itemDef { + name window + rect 10 15 300 320 + style 1 + backcolor .8 .66 .15 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + +itemDef { + name window + rect 10 15 300 320 + style 3 + background "warning" + forecolor 0 0 0 1 + visible 1 + decoration + } +itemDef { + name window + rect 10 15 300 10 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + +itemDef { + name window + rect 30 35 250 270 + style 1 + backcolor .5 .41 .09 1 + forecolor 0 0 0 1 + border 1 + bordercolor 0 0 0 1 + bordersize 5 + visible 1 + decoration + } + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 184 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 274 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 274 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 192 16 96 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 304 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 192 16 96 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 330 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 172 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + + + itemDef { + name errorinfo + rect 0 50 320 20 + text "Error:" + textalign 1 + textstyle 6 + textscale .333 + textalignx 160 + textaligny 23 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name errorinfo + rect 60 80 200 270 + type ITEM_TYPE_TEXT + style 1 + textstyle 3 + autowrapped + cvar "com_errorMessage" + textalign ITEM_ALIGN_CENTER + textalignx 100 + textaligny 23 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + + + + + + +// BUTTON // + + +itemDef { + name exit + text "Exit" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 138 295 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close error_popmenu ; + open main } + mouseEnter { setitemcolor exit backcolor .1 .37 .1 1 } + mouseExit { setitemcolor exit backcolor .37 .1 .1 1 } + } +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 138 295 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 126 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 182 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + + + + + + +} + + +} + + diff --git a/quake3/source/ui/fight.menu b/quake3/source/ui/fight.menu new file mode 100644 index 0000000..57bc6f5 --- /dev/null +++ b/quake3/source/ui/fight.menu @@ -0,0 +1,770 @@ +#include "ui/menudef.h" + +{ +\\ Fight \\ + + menuDef { + name "fight" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background uibackground4 + focusColor 1 .67 0 1 + style 1 + border 1 + + itemDef { + name fight + style WINDOW_STYLE_SHADER + rect 0 45 512 128 + visible 1 + background "fight" + decoration + } + + + itemDef { + name leftgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradleft.tga" + rect 64 249 256 102 + forecolor .75 0 0 0.5 + visible 1 + decoration + } + +itemDef { + name rightgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradright.tga" + rect 320 249 256 102 + forecolor 0 0 .75 0.5 + visible 1 + decoration + } + + + itemDef { + name leftvertgrad + style WINDOW_STYLE_SHADER + background "ui/assets/verticalgradient.tga" + rect 16 249 128 102 + forecolor .75 0 0 0.5 + visible 1 + decoration + } + + itemDef { + name rightvertgrad + style WINDOW_STYLE_SHADER + background "ui/assets/verticalgradient.tga" + rect 496 249 128 102 + forecolor 0 0 .75 0.5 + textscale 0.4 + visible 1 + decoration + } + + + + + + + + +// LEVEL SELECTION BAR // + + +// GAMETYPE BAR // + + +itemDef { + name gametypebar + style 2 + rect 0 5 640 40 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration +} + + +itemDef { + name gametypefield + style 0 + name tier + ownerdraw UI_TIER + rect 0 10 320 31 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 26 + textscale .4 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + mouseEnter { fadein message_tier } + mouseExit { fadeout message_tier } + } + +itemDef { + name gametypefield + style 0 + ownerdraw UI_SKILL + text "Skill:" + rect 320 10 320 31 + textalign ITEM_ALIGN_LEFT + textalignx 90 + textaligny 26 + textscale .4 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + mouseEnter { fadein message_skill } + mouseExit { fadeout message_skill } + } + + +// TEAM LOGO // + + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO_METAL + rect 28 250 100 100 + visible 1 + forecolor 1 .7 .7 1 + decoration + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + rect 488 250 100 100 + visible 1 + forecolor .7 .7 1 1 + decoration +} + +// MAP INFO // + +itemDef { + name window + rect 14 247 612 105 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + +itemDef { + name location + text "VS" + textscale 1 + rect 192 325 256 30 + textalign 1 // center + textalignx 128 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + backcolor 0 0 0 0 + forecolor 1 1 1 .5 + decoration + visible 1 + } + + +itemDef { + name level_info + group grplevelinfo2 + ownerdraw UI_TIER_MAPNAME + textscale .35 + rect 14 220 222 20 + textalign 0 + textalignx 3 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 18 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name level_info + group grplevelinfo2 + ownerdraw UI_TIER_GAMETYPE + textscale .35 + rect 236 220 122 20 + textalign 0 + textalignx 3 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 18 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + +itemDef { + name level_info + group grplevelinfo2 + type ITEM_TYPE_NUMERICFIELD + text "Captures " + cvar "capturelimit" + rect 358 220 122 20 + textalign 0 + textalignx 3 + textaligny 18 + textscale .35 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name level_info + group grplevelinfo2 + type ITEM_TYPE_NUMERICFIELD + text "Time " + cvar "timelimit" + rect 480 220 72 20 + textalign 0 + textalignx 3 + textaligny 18 + textscale .35 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name level_info + group grplevelinfo2 + type ITEM_TYPE_NUMERICFIELD + text "Frags " + cvar "fraglimit" + rect 552 220 72 20 + textalign 0 + textalignx 3 + textaligny 18 + textscale .35 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +// TEAM NAME // + +itemDef { + name playerteamname + ownerdraw UI_PLAYERLOGO_NAME + rect 128 295 128 64 + decoration + visible 1 +} + +itemDef { + name opposingteamname + ownerdraw UI_OPPONENTLOGO_NAME + rect 388 295 128 64 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 +} + + + + + + + +// PLAYER STATS // + +itemDef { + name window + rect 14 354 612 34 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + +itemDef { + name name + type ITEM_TYPE_EDITFIELD + style 0 + text "Name:" + cvar "name" + textscale .35 + style 0 + rect 0 363 128 30 + textalign 1 // center + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 17 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + + + + +itemDef { + name score + text "Score:" + textscale .35 + style 0 + rect 246 363 128 30 + textalign 3 // center + textalignx 16 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 17 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + + +itemDef { + name wins + text "Wins:" + textscale .35 + style 0 + rect 404 363 128 30 + textalign 1 // center + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 17 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + + +// AWARDS // + + +itemDef { + name window + rect 14 390 612 38 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + +itemdef { + name medal_accuracy + style WINDOW_STYLE_SHADER + rect 48 394 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .25 + visible 1 + decoration +} + +itemdef { + name medal_assist + style WINDOW_STYLE_SHADER + rect 112 394 32 32 + background "ui/assets/medal_assist.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_accuracy + style WINDOW_STYLE_SHADER + rect 176 394 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_defend + style WINDOW_STYLE_SHADER + rect 240 394 32 32 + background "ui/assets/medal_defend.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_excellent + style WINDOW_STYLE_SHADER + rect 304 394 32 32 + background "ui/assets/medal_excellent.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_frags + style WINDOW_STYLE_SHADER + rect 368 394 32 32 + background "ui/assets/medal_frags.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_gauntlet + style WINDOW_STYLE_SHADER + rect 432 394 32 32 + background "ui/assets/medal_gauntlet.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_impressive + style WINDOW_STYLE_SHADER + rect 496 394 32 32 + background "ui/assets/medal_impressive.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_victory + style WINDOW_STYLE_SHADER + rect 560 394 32 32 + background "ui/assets/medal_victory.tga" + forecolor 1 1 1 .25 + visible 1 + decoration +} + + + + +// SCREEN SHOT // + +itemDef { + name mapwindow + rect 14 52 612 158 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration + mouseenter { setitemcolor mapwindow bordercolor .7 0 0 1 ; fadein message_arena } + mouseexit { setitemcolor mapwindow bordercolor .5 .5 .5 .5 ; fadeout message_arena } +} + +itemdef { + name screen1 + rect 19 57 198 148 + ownerdraw UI_TIERMAP1 + visible 1 + mouseenter { setitemcolor borderscreen1 backcolor .25 .25 .25 .25 } + mouseexit { setitemcolor borderscreen1 backcolor 0 0 0 0 } + action { setcvar ui_currentMap 0 ; setitemcolor grpborderscreen bordercolor .5 .5 .5 1 ; setitemcolor borderscreen1 bordercolor 1 0 0 1 } +} + + +itemdef { + name screen2 + rect 221 57 198 148 + ownerdraw UI_TIERMAP2 + visible 1 + mouseenter { setitemcolor borderscreen2 backcolor .25 .25 .25 .25 } + mouseexit { setitemcolor borderscreen2 backcolor 0 0 0 0 } + action { setcvar ui_currentMap 1 ; setitemcolor grpborderscreen bordercolor .5 .5 .5 1 ; setitemcolor borderscreen2 bordercolor 1 0 0 1 } +} + + +itemdef { + name screen3 + ownerdraw UI_TIERMAP3 + rect 423 57 198 148 + visible 1 + mouseenter { setitemcolor borderscreen3 backcolor .25 .25 .25 .25 } + mouseexit { setitemcolor borderscreen3 backcolor 0 0 0 0 } + action { setcvar ui_currentMap 2 ; setitemcolor grpborderscreen bordercolor .5 .5 .5 1 ; setitemcolor borderscreen3 bordercolor 1 0 0 1 } +} + +itemdef { + name borderscreen1 + group grpborderscreen + rect 18 56 200 150 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordercolor .5 .5 .5 1 + decoration + visible 1 +} + +itemdef { + name borderscreen2 + group grpborderscreen + rect 220 56 200 150 + style WINDOW_STYLE_FILLED + decoration + border 1 + backcolor 0 0 0 0 + bordercolor .5 .5 .5 1 + visible 1 + +} + + +itemdef { + name borderscreen3 + group grpborderscreen + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 0 0 + decoration + rect 422 56 200 150 + visible 1 +} + + + + + + + + + + + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close fight ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 16 424 50 50 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close fight ; open main } + } + + + + +itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show lightning ; hide accept ; show accept_alt ; fadein message_accept } + action { close fight ; uiScript SinglePlayerStart } + } + +itemDef { + name accept_alt + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { close fight ; uiScript SinglePlayerStart } + mouseExit { hide lightning ; hide accept_alt ; show accept ; fadeout message_accept } + } + + itemDef { + name lightning + style 3 + background lightningkc + rect 46 385 246 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 345 385 246 128 + visible 0 + decoration + } + +// MESSAGES // + +itemDef { + name message_back + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Enter Arena" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_tier + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Choose Tier" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_skill + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Set Skill Level" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_arena + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Choose Your Arena" + forecolor 1 1 1 1 + decoration + visible 0 + } + + + +} + + + + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/filter.menu b/quake3/source/ui/filter.menu new file mode 100644 index 0000000..033240d --- /dev/null +++ b/quake3/source/ui/filter.menu @@ -0,0 +1,119 @@ +#include "ui/menudef.h" + +{ + +menuDef { + name "filter_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close filter_popmenu ; open joinserver } + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + +// settings + +itemDef { + name viewEmpty + type ITEM_TYPE_YESNO + text "View Empty:" + cvar "ui_browserShowEmpty" + textscale .25 + rect 107 81 110 20 + textalign ITEM_ALIGN_CENTER + textalignx 0 + textaligny 17 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript RefreshFilter } + mouseEnter { show message_viewEmpty } + mouseExit { hide message_viewEmpty } + } +itemDef { + name viewEmpty + type 11 + text "View Full:" + cvar "ui_browserShowFull" + textscale .25 + rect 107 112 110 20 + textalign ITEM_ALIGN_CENTER + textalignx 0 + textaligny 17 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript RefreshFilter } + mouseEnter { show message_viewFull } + mouseExit { hide message_viewFull } +} + +// ok button + +itemDef { + name yes + text "Ok" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 103 158 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close filter_popmenu ; + open joinserver } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 103 158 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 97 158 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 132 158 7 26 + visible 1 + decoration + } +} +} diff --git a/quake3/source/ui/findplayer.menu b/quake3/source/ui/findplayer.menu new file mode 100644 index 0000000..87c93ce --- /dev/null +++ b/quake3/source/ui/findplayer.menu @@ -0,0 +1,514 @@ +#include "ui/menudef.h" + +{ +\\ Server Information Popup Menu \\ + +menuDef { + name "findplayer_popmenu" + visible 0 + fullscreen 0 + rect 158 80 320 340 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onClose { } + onOpen { uiScript FindPlayer ; setfocus namefield } + onESC { close findplayer_popmenu ; open joinserver } + +itemDef { + name window + rect 10 15 310 330 + style 1 + backcolor 0 0 0 .5 + forecolor 0 0 0 1 + visible 1 + decoration + } +itemDef { + name window + rect 10 15 320 340 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + +itemDef { + name window + rect 10 15 300 320 + style 1 + backcolor .1 .1 .37 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + +itemDef { + name window + rect 10 15 300 10 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 184 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 274 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 274 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 192 16 96 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 304 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 192 16 96 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 330 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 172 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + + itemDef { + name findplayer + rect 0 20 320 20 + text "Find a Friend" + textalign 1 + textstyle 3 + textscale .333 + textalignx 155 + textaligny 23 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name window + rect 61 53 239 20 + style 1 + backcolor 0 0 0 .5 + forecolor 0 0 0 1 + visible 1 + decoration + } + + +itemDef { + name namefield + group "playersettinggroup" + type ITEM_TYPE_EDITFIELD + style 0 + text "Name:" + cvar "ui_findplayer" + maxChars 20 + rect 20 48 215 32 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 21 + textscale .3 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + action { ui_script FindPlayer } + visible 1 + } + + + itemDef { + name serverNameList //LIST OF SERVER NAMES// + rect 20 75 280 80 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 16 + textscale .225 + backcolor 0 0 0 1 + outlinecolor .1 .1 .7 .5 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + elementtype LISTBOX_TEXT + feeder FEEDER_FINDPLAYER + visible 1 + mouseenter { setitemcolor serverNamewindow bordercolor .7 0 0 1 } + mouseexit { setitemcolor serverNamewindow bordercolor .5 .5 .5 1 } + } + + itemDef { + name serverNamewindow + rect 20 75 264 80 + style 1 + backcolor 0 0 0 0 + forecolor 0 0 0 0 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + itemDef { + name serverInfoList //LIST OF SERVER STATUS INFORMATION// + rect 20 175 280 110 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 16 + textscale .225 + backcolor 0 0 0 1 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + elementtype LISTBOX_TEXT + feeder FEEDER_SERVERSTATUS + notselectable + visible 1 + columns 4 2 40 20 + 40 40 10 + 90 40 10 + 135 40 20 + mouseenter { setitemcolor serverInfowindow bordercolor .7 0 0 1 } + mouseexit { setitemcolor serverInfowindow bordercolor .5 .5 .5 1 } + + } + + itemDef { + name serverInfowindow + rect 20 175 264 110 + style 1 + backcolor 0 0 0 0 + forecolor 0 0 0 0 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + + + + + + + + + +// BUTTON // + + +itemDef { + name exit + text "Exit" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 38 295 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action {play "sound/misc/nomenu.wav" ; + close findplayer_popmenu ; + open joinserver } + mouseEnter { setitemcolor exit backcolor .1 .37 .1 1 } + mouseExit { setitemcolor exit backcolor .37 .1 .1 1 } + } +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 38 295 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 26 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 82 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name search + text "Search" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 131 295 60 26 + textalign 1 + textalignx 30 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + ui_script FindPlayer } + mouseEnter { setitemcolor search backcolor .1 .37 .1 1 } + mouseExit { setitemcolor search backcolor .37 .1 .1 1 } + } +itemDef { + name search + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 131 295 60 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name search + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 119 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name search + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 190 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + + + +itemDef { + name join + text "Join" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 238 295 45 26 + textalign 1 + textalignx 22 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { ui_script FoundPlayerJoinServer } + mouseEnter { setitemcolor join backcolor .1 .37 .1 1 } + mouseExit { setitemcolor join backcolor .37 .1 .1 1 } + } +itemDef { + name join + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 238 295 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name join + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 226 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name join + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 282 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + + + + + + +} + + +} + + diff --git a/quake3/source/ui/help.menu b/quake3/source/ui/help.menu new file mode 100644 index 0000000..768b2df --- /dev/null +++ b/quake3/source/ui/help.menu @@ -0,0 +1,660 @@ +#include "ui/menudef.h" + +{ +\\ Help\\ + + menuDef { + name "help_menu" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .75 0 1 + style 1 + border 1 + onEsc { close help_menu ; close powerup_menu ; close ordersHelp_menu ; open main } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + hide grphelptext ; + show grpbttn ; + show ctf ; + hide back_alt ; + show back ; + hide grpmessage } + + + +// BAR // + + +itemDef { + name gametypebar + style 2 + rect 0 16 640 40 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 ; fadein message_help } + mouseExit { setcolor backcolor 0 0 .75 .5 ; fadeout message_help } + decoration + } + + +itemDef { + name bar + style 0 + text "Gametypes" + type 1 + rect 0 16 213 40 + textstyle 6 + textalign 1 + textalignx 106 + textaligny 31 + textscale .35 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grphelptext ; + show grpbttn ; + close powerup_menu ; + close ordersHelp_menu ; + show ctf } + } +itemDef { + name bar + style 0 + type 1 + text "Power-Ups" + rect 213 16 213 40 + textstyle 6 + textalign 1 + textalignx 106 + textaligny 31 + textscale .35 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grphelptext ; + hide grpbttn ; + close powerup_menu ; + close ordersHelp_menu ; + open powerup_menu } + } +itemDef { + name bar + style 0 + text "Orders" + textstyle 6 + type 1 + rect 426 16 213 40 + textalign 1 + textalignx 106 + textaligny 31 + textscale .35 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grphelptext ; + hide grpbttn ; + close powerup_menu ; + close ordersHelp_menu ; + open ordersHelp_menu } + } + +// GAMETYPES BUTTONS // + +itemDef { + name ctfbttn + group grpbttn + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + text "Capture the Flag" + rect 23 97 120 26 + textalign 1 + textalignx 60 + textaligny 20 + textscale .30 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { hide grphelptext ; show ctf ; play "sound/misc/kcaction.wav" } + mouseEnter { setitemcolor ctfbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctfbttn backcolor .37 .1 .1 1 } + } + +itemDef { + name ctfbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 23 97 120 26 + visible 1 + decoration + } + +itemDef { + name ctfbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 11 97 13 26 + visible 1 + decoration + } + +itemDef { + name ctfbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 142 97 13 26 + visible 1 + decoration + } + +itemDef { + name oneflagbttn + group grpbttn + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + text "One Flag" + rect 183 97 120 26 + textalign 1 + textalignx 60 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { hide grphelptext ; show oneflag ; play "sound/misc/kcaction.wav" } + mouseEnter { setitemcolor oneflagbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor oneflagbttn backcolor .37 .1 .1 1 } + } + +itemDef { + name oneflagbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 183 97 120 26 + visible 1 + decoration + } + +itemDef { + name oneflagbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 171 97 13 26 + visible 1 + decoration + } + +itemDef { + name oneflagbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 302 97 13 26 + visible 1 + decoration + } + +itemDef { + name overloadbttn + group grpbttn + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + text "Overload" + rect 343 97 120 26 + textalign 1 + textalignx 60 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { hide grphelptext ; show overload ; play "sound/misc/kcaction.wav" } + mouseEnter { setitemcolor overloadbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor overloadbttn backcolor .37 .1 .1 1 } + } + +itemDef { + name overloadbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 343 97 120 26 + visible 1 + decoration + } + +itemDef { + name overloadbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 331 97 13 26 + visible 1 + decoration + } + +itemDef { + name overloadbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 462 97 13 26 + visible 1 + decoration + } + + +itemDef { + name harvesterbttn + type 1 + group grpbttn + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + text "Harvester" + rect 503 97 120 26 + textalign 1 + textalignx 60 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { hide grphelptext ; show harvester ; play "sound/misc/kcaction.wav"} + mouseEnter { setitemcolor harvesterbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor harvesterbttn backcolor .37 .1 .1 1 } + } + +itemDef { + name harvesterbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 503 97 120 26 + visible 1 + decoration + } + +itemDef { + name harvesterbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 491 97 13 26 + visible 1 + decoration + } + +itemDef { + name harvesterbttn + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 622 97 13 26 + visible 1 + decoration + } + + + +// HELP TEXT // + +// CTF // + + +itemDef { + name ctf + group grphelptext + style 0 + text "Capture the Flag" + rect 280 154 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 0 + wrapped + rect 280 184 500 20 + text "To score a team point (often called a capture), the team \r" + "must invade the opposing team's base, run through (grab) \r" + "the other team's flag, and carry it back to their own flag.\r" + "For the capture to take place, the team's own flag must still \r" + "be in the base. The flag carrier drops the flag when he or \r" + "she is fragged. If the flag is not over void or death fog,\r" + "it stays in play. A player picks up a dropped flag when he \r" + "or she runs through it. This returns the player's own flag \r" + "to base. If the player runs through the opposing team's flag,\r" + "the player picks it up and runs with it." + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name ctf + group grphelptext + style 5 + cinematic "ctf.RoQ" + rect 10 154 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + + +// ONE FLAG CTF // + +itemDef { + name oneflag + group grphelptext + style 0 + text "One Flag Capture the Flag" + rect 280 154 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + decoration + bordercolor 0 0 0 0 + visible 0 + } +itemDef { + name oneflag + group grphelptext + style 0 + wrapped + text "The team must run through or grab the white flag at the \r" + "center of the arena and carry it to the opposing team's \r" + "flag. A team point, called a capture, is scored each time \r" + "a player successfully carries the flag to the opposing base. \r" + "The flag carrier drops the flag when he or she is fragged. \r" + "If the flag is not over a void or death fog, it stays in play \r" + "and may be picked up by a player from either team. A flag \r" + "dropped over a void or death fog returns to the center of \r" + "the arena." + rect 280 184 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name oneflag + group grphelptext + style 5 + cinematic "oneflag.RoQ" + rect 10 154 256 192 + border 1 + bordercolor .5 .5 .5 11 + visible 0 + decoration + } + + +// OVERLOAD // + +itemDef { + name overload + group grphelptext + style 0 + text "Overload" + rect 280 154 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + decoration + visible 0 + } +itemDef { + name overload + group grphelptext + style 0 + wrapped + text "To score a team point, the players must invade \r" + "their opponent's base and attack the skull portion of \r" + "the goal obelisk until it explodes. It slowly turns red \r" + "as the attacker chews through its 2500 points of damage. \r" + "The skull constantly regenerates at a rate of 15 hit \r" + "points a second." + rect 280 184 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 5 + cinematic "overload.RoQ" + rect 10 154 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + +// HARVESTER // +itemDef { + name harvester + group grphelptext + style 0 + text "Harvester" + rect 280 154 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 0 + wrapped + text "To score team points, the team must frag opposing team \r" + "members. Each time a player on either team is fragged, a \r" + "crystal skull of their team color pops out of the skull \r" + "generator in the center of the arena. Players harvest skulls \r" + "of the opposing team's color by running through them. Skulls \r" + "of their own team's color are removed from play in the same \r" + "manner. Players must carry the skulls to the goal, a skull \r" + "receptacle in the opposing team's base. When a player is \r" + "fragged, any carried skulls are lost." + rect 280 184 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 5 + cinematic "harvester.RoQ" + rect 10 154 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close help_menu ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close help_menu ; + close powerup_menu ; + close ordersHelp_menu ; + //play "sound/misc/tim_pump.wav" ; + open main } + } + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_help + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select for Description" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + +} + + + +} + + + diff --git a/quake3/source/ui/help2.menu b/quake3/source/ui/help2.menu new file mode 100644 index 0000000..b80b747 --- /dev/null +++ b/quake3/source/ui/help2.menu @@ -0,0 +1,721 @@ +#include "ui/menudef.h" + +{ +\\ Help\\ + + menuDef { + name "help_menu" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .75 0 1 + outOfBoundsClick + style 1 + border 1 + onopen { hide grphelptext ; show help } + + + +// GAMETYPE BAR // + + +itemDef { + name gametypebar + style 2 + rect 0 16 640 40 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 ; fadein message_help } + mouseExit { setcolor backcolor 0 0 .75 .5 ; fadeout message_help } + decoration + } + +itemDef { + name bar + style 0 + text "CTF" + rect 0 16 106 40 + textalign 1 + textalignx 53 + textaligny 31 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { hide grphelptext ; show ctf } + } + +itemDef { + name bar + style 0 + text "One Flag" + rect 106 16 128 40 + textalign 1 + textalignx 53 + textaligny 31 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { hide grphelptext ; show onectf } + } +itemDef { + name bar + style 0 + text "Overload" + rect 212 16 106 40 + textalign 1 + textalignx 50 + textaligny 31 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { hide grphelptext ; show overload } + } +itemDef { + name bar + style 0 + text "Harvester" + rect 318 16 106 40 + textalign 1 + textalignx 50 + textaligny 31 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { hide grphelptext ; show harvester } + } +itemDef { + name bar + style 0 + text "Power-Ups" + rect 424 16 106 40 + textalign 1 + textalignx 50 + textaligny 31 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { hide grphelptext ; open powerup_menu } + } +itemDef { + name bar + style 0 + text "Orders" + rect 530 16 106 40 + textalign 1 + textalignx 50 + textaligny 31 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { hide grphelptext ; open ordersHelp_menu } + } + + +// HELP TEXT // + +// CTF // +itemDef { + name help + group grphelptext + style 0 + wrapped + text " For game rules, select one of the \r" + " game types from the above menu bar, \r" + " or select Power-ups for information \r" + " about team power-ups and \r" + " new useable items." + rect 160 140 600 40 + textalign 0 + textalignx 0 + textaligny 31 + textscale .3 + forecolor 1 .67 0 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name ctf + group grphelptext + style 0 + text "Capture the Flag" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 31 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 0 + wrapped + rect 280 124 500 20 + text "To score a team point (often called a capture), the team must invade the \r" + "opposing team's base, run through (grab) the other team's flag, and carry \r" + "it back to their own flag. For the capture to take place, the team's own \r" + "flag must still be in the base. The flag carrier drops the flag when he or \r" + "she is fragged. If the flag is not over void or death fog, it stays in play. \r" + "A player picks up a dropped flag when he or she runs through it. \r" + "This returns the player's own flag to base. If the player runs through \r" + "the opposing team's flag, the player picks it up and runs with it." + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name ctf + group grphelptext + style 3 + background "ui/assets/helpscreens/ctf/team_base.tga" + rect 80 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 0 + text "Team Base" + rect 80 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 3 + background "ui/assets/helpscreens/ctf/flag_carrier.tga" + rect 248 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 0 + text "Flag Carrier" + rect 248 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 3 + background "ui/assets/helpscreens/ctf/scoring_with_flag.tga" + rect 416 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name ctf + group grphelptext + style 0 + text "Scoring with the Flag" + rect 416 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } + + +// ONE FLAG CTF // + +itemDef { + name onectf + group grphelptext + style 0 + text "One Flag Capture the Flag" + rect 70 64 500 40 + textalign 0 + textalignx 0 + textaligny 31 + textscale .25 + forecolor 1 1 1 1 + border 0 + decoration + bordercolor 0 0 0 0 + visible 0 + } +itemDef { + name onectf + group grphelptext + style 0 + wrapped + text "The team must run through (grab) the white flag at the center of the \r" + "arena and carry it to the opposing team's flag. A team point, called a \r" + "capture, is scored each time a player successfully carries the flag \r" + "to the opposing base. The flag carrier drops the flag when he or she \r" + "is fragged. If the flag is not over a void or death fog, it stays in play \r" + "and may be picked up by a player from either team. A flag dropped \r" + "over a void or death fog returns to the center of the arena." + rect 70 104 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name onectf + group grphelptext + style 3 + background "ui/assets/helpscreens/oneflag/white_flag.tga" + rect 80 270 128 128 + border 1 + bordercolor .5 .5 .5 11 + visible 0 + decoration + } +itemDef { + name onectf + group grphelptext + style 0 + text "White Flag" + rect 80 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name onectf + group grphelptext + style 3 + background "ui/assets/helpscreens/oneflag/flag_carrier.tga" + rect 248 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name onectf + group grphelptext + style 0 + text "Flag Carrier" + rect 248 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name onectf + group grphelptext + style 3 + background "ui/assets/helpscreens/oneflag/scoring_with_flag.tga" + rect 416 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name onectf + group grphelptext + style 0 + text "Scoring with the Flag" + rect 416 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } + + + +// OVERLOAD // + +itemDef { + name overload + group grphelptext + style 0 + text "Overload" + rect 70 64 500 40 + textalign 0 + textalignx 0 + textaligny 31 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + decoration + visible 0 + } +itemDef { + name overload + group grphelptext + style 0 + wrapped + text "To score a team point, the players must invade their opponent's base \r" + "and attack the skull portion of the goal obelisk until it explodes. \r" + "As the skull takes damage, it slowly turns bright red. The skull \r" + "constantly regenerates and slowly heals itself." + rect 70 104 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 3 + background "ui/assets/helpscreens/overload/obelisk.tga" + rect 80 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 0 + text "Obelisk" + rect 80 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 3 + background "ui/assets/helpscreens/overload/damaged_obelisk.tga" + rect 248 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 0 + text "Damaged Obelisk" + rect 248 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 3 + background "ui/assets/helpscreens/overload/exploded_obelisk_1.tga" + rect 416 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name overload + group grphelptext + style 0 + text "Exploded Obelisk" + rect 416 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } + +// HARVESTER // +itemDef { + name harvester + group grphelptext + style 0 + text "Harvester" + rect 70 64 500 40 + textalign 0 + textalignx 0 + textaligny 31 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 0 + wrapped + text "To score team points, the team must frag opposing team members. \r" + "Each time a player on either team is fragged, a crystal skull of their \r" + "team color pops out of the skull generator in the center of the arena. \r" + "Players harvest skulls of the opposing team's color by running \r" + "through them. Skulls of their own team's color are removed from play \r" + "in the same manner. Players must carry the skulls to the goal, \r" + "a skull receptacle in the opposing team's base. When a player is \r" + "fragged, any carried skulls are lost." + rect 70 104 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 3 + background "ui/assets/helpscreens/harvester/skull_and_obelisk.tga" + rect 80 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 0 + text "Skull Generator" + rect 80 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 3 + background "ui/assets/helpscreens/harvester/carrying_skulls.tga" + rect 248 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 0 + text "Carrying Skulls" + rect 248 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 3 + background "ui/assets/helpscreens/harvester/scoring.tga" + rect 416 270 128 128 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } +itemDef { + name harvester + group grphelptext + style 0 + text "Scoring with the Skulls" + rect 416 405 128 30 + textalign 1 + textalignx 64 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + visible 0 + decoration + } + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close help_menu ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 16 424 50 50 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close help_menu ; open main } + } + + +// MESSAGES // + +itemDef { + name message_back + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_help + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select for Description" + forecolor 1 1 1 1 + decoration + visible 0 + } + + + +} + + + +} + + + diff --git a/quake3/source/ui/hud.menu b/quake3/source/ui/hud.menu new file mode 100644 index 0000000..afe4fb0 --- /dev/null +++ b/quake3/source/ui/hud.menu @@ -0,0 +1,803 @@ +#include "ui/menudef.h" + +// team menu +// +// defines from ui_shared.h + +{ + assetGlobalDef { + cursor "ui/assets/3_cursor2" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowX 5 // x amount for shadow offset + shadowY 5 // y amount for shadow offset + shadowColor 0.1 0.1 0.1 0.25 // shadow color + + font "fonts/font" 16 // font + smallFont "fonts/smallfont" 12 // font + bigFont "fonts/bigfont" 20 // font + + + } + + +// POWERUP AREA // + +menuDef { + name "powerup area" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 570 220 50 100 + + itemDef { + name "powerupArea" + rect 0 0 40 40 + visible 1 + decoration + ownerdraw CG_AREA_POWERUP + special 4 // spacing + align HUD_VERTICAL + } + + +} + + + +// SELECTED PLAYER // + +menuDef { + name "SelectedPlayer" + fullScreen MENU_FALSE + visible 1 + rect 2 363 180 64 + ownerdrawflag CG_SHOW_ANYTEAMGAME + + + itemDef { + name "b" + rect 2 4 170 57 + style 4 + visible 1 + } + + itemDef { + name "b" + rect 2 4 172 60 + visible 1 + textscale .17 + textaligny 10 + textalignx 0 + forecolor 1 1 1 1 + ownerdrawflag CG_SHOW_TEAMINFO + ownerdraw CG_TEAMINFO + } + + itemDef { + name "b" + rect 4 3 32 32 + visible 1 + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_HEAD + } + + +itemDef { + name "b" + rect 75 35 22 11 + visible 1 + style 1 + textscale .25 + decoration + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_HEALTH + } + + itemDef { + name "b" + rect 50 48 22 11 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedarmor.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_ARMOR + } + + itemDef { + name "b" + rect 75 48 22 11 + visible 1 + textstyle 3 + style 1 + textscale .25 + decoration + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_ARMOR + } + + + itemDef { + name "b" + rect 35 3 35 15 + textscale 0.25 + textstyle 3 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_NAME + } + + + + itemDef { + name "b" + rect 35 15 45 15 + textstyle 3 + textscale 0.25 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_LOCATION + } + + itemDef { + name "b" + rect 7 40 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_STATUS + } + + itemDef { + name "b" + rect 30 40 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_POWERUP + } + + itemDef { + name "b" + rect 100 33 24 24 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_WEAPON + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 4 170 57 + } + +itemDef { + name "sback" + rect 0 0 256 64 + visible 1 + style 3 + decoration + background "ui/assets/selectedstatus.tga" + } + + } + + + +// PLAYER STATUS // + +menuDef { + name "playerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 0 416 128 64 + + itemDef { + name "playerStatusRect" + style 4 + rect 12 13 116 48 + visible 1 + } + itemDef { + name "playerRect" + rect 12 13 116 48 + style 3 + background hudalert_good + visible 1 + ownerdrawflag CG_SHOW_IF_PLAYER_HAS_FLAG + } + + itemDef { + name "playeritem" + rect 27 25 22 22 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + itemDef { + name "CTFPOWERUP" + rect 54 25 22 22 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + } + + itemDef { + name "flag" + rect 85 15 40 40 + visible 1 + decoration + ownerdraw CG_PLAYER_HASFLAG + } + + itemDef { + name "skulls" + rect 72 10 48 34 + visible 1 + decoration + textaligny 12 + textalignx 0 + textscale 0.333 + textstyle 3 + ownerdraw CG_HARVESTER_SKULLS + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 12 13 116 48 + } + } + + +// AMMO // + +menuDef { + name "Ammo" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 128 416 128 64 + + + itemDef { + name "ammoRect" + visible 1 + style 4 + rect 3 13 122 48 + } + + itemDef { + name "a" + rect 85 25 30 30 + visible 1 + decoration + ownerdraw CG_PLAYER_AMMO_ICON2D + } + + + itemDef { + name "a" + rect 10 43 63 12 + visible 1 + textstyle 3 + decoration + textscale .75 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 1 .75 0 1 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 3 13 122 48 + } + } + + + + + + +// PLAYER // + +menuDef { + name "Player" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 256 416 128 64 + + + itemDef { + name "playerRect" + rect 0 2 128 60 + style 4 + visible 1 + } + + itemDef { + name "playerRect" + rect 0 2 128 60 + style 3 + background hudalert + visible 1 + ownerdrawflag CG_SHOW_HEALTHCRITICAL + } + + + itemDef { + name "healthok" + rect 12 42 63 12 + visible 1 + decoration + textstyle 3 + forecolor 1 1 1 1 + textscale .75 + ownerdraw CG_PLAYER_HEALTH + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 0 2 128 60 + } + + itemDef { + name "b" + rect 70 10 45 45 + visible 1 + decoration + ownerdraw CG_PLAYER_HEAD + } + } + + + + + + + +// ARMOR // + +menuDef { + name "Armor" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 384 416 128 64 + + + itemDef { + name "armorRect" + rect 0 13 125 48 + visible 1 + style 4 + } + + itemDef { + name "armor" + rect 10 7 30 30 + visible 1 + decoration + ownerdraw CG_PLAYER_ARMOR_ICON2D + } + + + itemDef { + name "armor2" + rect 55 43 63 12 + visible 1 + decoration + textstyle 3 + textscale .75 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 .67 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 .75 .75 .75 1 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 0 13 125 48 + } + } + + +// PLAYERSCORE // + +menuDef { + name "PlayerScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 512 416 128 64 + ownerdrawflag CG_SHOW_ANYTEAMGAME + + + itemDef { + name "playerScoreRect" + visible 1 + rect 0 13 126 48 + style 4 + } + + itemDef { + name "playerRect" + rect 0 13 63 48 + style 3 + background hudalert_blue + visible 1 + ownerdrawflag CG_SHOW_BLUE_TEAM_HAS_REDFLAG + } + +itemDef { + name "playerRect" + rect 63 13 63 48 + style 3 + background hudalert_red + visible 1 + ownerdrawflag CG_SHOW_RED_TEAM_HAS_BLUEFLAG + } + + + itemDef { + name "f" + rect 30 22 16 16 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/bluechip.tga" + } +itemDef { + name "f" + rect 30 22 16 16 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + ownerdrawflag CG_SHOW_HARVESTER + background "icons/skull_blue.tga" + } + + itemDef { + name "blueflag" + rect 30 22 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_CTF + ownerdraw CG_BLUE_FLAGSTATUS + } + + +itemDef { + name "oneflagstatus" + rect 30 40 16 16 + visible 1 + decoration + ownerdraw CG_ONEFLAG_STATUS + } + + + itemDef { + name "r" + rect 35 21 30 15 + textstyle 3 + visible 1 + decoration + forecolor .25 .25 1 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + + itemDef { + name "f" + rect 77 22 16 16 + visible 1 + bordercolor 1 1 1 1 + decoration + style 3 + background "ui/assets/redchip.tga" + } + + itemDef { + name "f" + rect 77 22 16 16 + visible 1 + bordercolor 1 1 1 1 + decoration + style 3 + ownerdrawflag CG_SHOW_HARVESTER + background "icons/skull_red.tga" + } + + itemDef { + name "f" + rect 77 22 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_CTF + ownerdraw CG_RED_FLAGSTATUS + } + + itemDef { + name "r" + rect 87 21 30 15 + textstyle 3 + visible 1 + decoration + forecolor 1 0 0 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 0 13 126 48 + } + + itemDef { + name "playerScore" + type 4 + rect 8 36 40 12 + visible 1 + textstyle 3 + decoration + forecolor 1 1 1 1 + textscale .25 + ownerdraw CG_CAPFRAGLIMIT + } + + + + itemDef { + name "playerScore" + style 0 + rect 60 43 65 12 + visible 1 + textstyle 3 + decoration + forecolor 1 1 1 1 + textscale .25 + ownerdraw CG_PLAYER_SCORE + } + } + + +// PLAYERSCORE // + +menuDef { + name "PlayerScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 512 416 128 64 + ownerdrawflag CG_SHOW_ANYNONTEAMGAME + + itemDef { + name "playerScoreRect" + visible 1 + rect 0 13 126 48 + style 4 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 0 13 126 48 + } + + itemDef { + name "playerScore" + rect 8 32 40 12 + visible 1 + textstyle 3 + decoration + forecolor 1 1 1 1 + textscale .25 + text "FragLimit:" + ownerdraw CG_CAPFRAGLIMIT + } + itemDef { + name "playerScore" + style 0 + rect 10 45 65 12 + visible 1 + textstyle 3 + text "1st:" + ownerdraw CG_1STPLACE + decoration + forecolor .25 .25 1 1 + textscale .25 + } + itemDef { + name "playerScore" + style 0 + rect 70 45 65 12 + visible 1 + textstyle 3 + text "2nd:" + ownerdraw CG_2NDPLACE + decoration + forecolor 1 0 0 1 + textscale .25 + } + + + itemDef { + name "playerScore" + style 0 + rect 10 58 40 0 + visible 1 + textstyle 3 + text "Score:" + decoration + forecolor 1 1 1 1 + textscale .25 + ownerdraw CG_PLAYER_SCORE + } + } + + +// LOCATION // + +menuDef { + name "location" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 463 395 256 32 + ownerdrawflag CG_SHOW_ANYTEAMGAME + + + itemDef { + name "locationRect" + visible MENU_TRUE + rect 2 6 170 26 + style 4 + } +itemDef { + name "playerStatus" + rect 16 10 16 16 + visible 1 + decoration + ownerdraw CG_PLAYER_STATUS + } + + itemDef { + name "playerlocation" + rect 37 7 16 16 + visible 1 + textstyle 3 + decoration + textscale .25 + ownerdraw CG_PLAYER_LOCATION + } +itemDef { + name "lback" + rect 0 0 256 32 + visible 1 + style 3 + decoration + background "ui/assets/locationstatus.tga" + } + } + + + +// STATUSBAR // + +menuDef { + name "statusbar" + fullScreen 0 + visible 1 + rect 0 416 640 64 + + +itemDef { + name "statusbar" + rect 0 0 640 64 + style 3 + background "ui/assets/statusbar_full.tga" + visible 1 + decoration + forecolor 1 1 1 1 + backcolor 1 1 1 1 + } + } + + + + + + + menuDef { + name "voiceMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 5 100 100 + + + itemDef { + name "voiceMenuRect" + style 4 + rect 2 2 50 50 + visible 1 + } + + itemDef { + name "b" + rect 2 2 50 50 + visible 1 + decoration + ownerdraw CG_VOICE_HEAD + } + + itemDef { + name "b" + rect 2 2 50 50 + style WINDOW_STYLE_SHADER + background "menuscreen2" + visible 1 + decoration + } + + itemDef { + name "voiceWindow" + visible 1 + style 3 + background "ui/assets/voice_window.tga" + rect 0 0 54 54 + } + + + itemDef { + name "b" + rect 2 55 50 12 + visible 1 + decoration + textscale .25 + textalign 0 + textalignx 0 + textaligny 12 + ownerdraw CG_VOICE_NAME + } + + + } + + diff --git a/quake3/source/ui/hud.txt b/quake3/source/ui/hud.txt new file mode 100644 index 0000000..8ef8dd6 --- /dev/null +++ b/quake3/source/ui/hud.txt @@ -0,0 +1,7 @@ +// hud menu defs +// +{ + loadMenu { "ui/hud.menu" } + loadMenu { "ui/score.menu" } + loadMenu { "ui/teamscore.menu" } +} diff --git a/quake3/source/ui/hud2.txt b/quake3/source/ui/hud2.txt new file mode 100644 index 0000000..904f0e5 --- /dev/null +++ b/quake3/source/ui/hud2.txt @@ -0,0 +1,7 @@ +// hud menu defs +// +{ + loadMenu { "ui/min_hud.menu" } + loadMenu { "ui/score.menu" } + loadMenu { "ui/teamscore.menu" } +} diff --git a/quake3/source/ui/hud_old.menu b/quake3/source/ui/hud_old.menu new file mode 100644 index 0000000..8869d20 --- /dev/null +++ b/quake3/source/ui/hud_old.menu @@ -0,0 +1,1091 @@ +#include "ui/menudef.h" + +// team menu +// +// defines from ui_shared.h + +{ + assetGlobalDef { + font "fonts/impact.ttf" // font + cursor "menu/art/3_cursor2" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowX 5 // x amount for shadow offset + shadowY 5 // y amount for shadow offset + shadowColor 0.1 0.1 0.1 0.25 // shadow color + + hudShader "ui/assets/hudbar.tga" // + + } + + +// POWERUP AREA // + +menuDef { + name "powerup area" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 570 220 50 100 + + ownerdrawflag CG_SHOW_CTF + itemDef { + name "powerupArea" + rect 0 0 40 40 + visible 1 + decoration + ownerdraw CG_AREA_POWERUP + special 4 // spacing + align HUD_VERTICAL + } + + +} + + + +// SELECTED PLAYER // + +menuDef { + name "SelectedPlayer" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 2 340 128 75 + + + + itemDef { + name "b" + rect 0 0 125 75 + style 4 + visible 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { setcolor bordercolor 1 1 1 .5 ; setteamcolor ; show altSelectedPlayerRect } + mouseExit { setcolor backcolor 0 0 0 0 ; setcolor bordercolor 0 0 0 0 ; hide altSelectedPlayerRect } + action { open teamMenu } + } + + + + itemDef { + name "altSelectedPlayerRect" + rect 0 0 125 75 + style 4 + border 1 + bordersize 1 + visible 0 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "b" + rect 2 3 32 32 + visible 1 + action { open teamMenu } + ownerdraw CG_SELECTEDPLAYER_HEAD + } + + itemDef { + name "b" + rect 65 5 22 11 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedhealth.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_HEALTH + } + + itemDef { + name "b" + rect 65 18 22 11 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedarmor.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 .3 .65 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_ARMOR + } + + + + itemDef { + name "b" + rect 5 40 35 15 + textscale 0.25 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_NAME + } + + itemDef { + name "b" + rect 5 52 45 15 + textscale 0.25 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_LOCATION + } + + itemDef { + name "b" + rect 38 5 16 16 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_STATUS + } + + itemDef { + name "b" + rect 93 5 24 24 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_WEAPON + } + + itemDef { + name "b" + rect 38 22 16 16 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_POWERUP + } + +} + + + +// PLAYER STATUS // + +menuDef { + name "playerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 0 416 128 64 + + itemDef { + name "playerStatusRect" + rect 12 13 112 48 + visible 1 + style 4 + //background "ui/assets/hudback.tga" + border 1 + bordersize 1 + mouseEnter { show playerStatusRectAlt } + mouseExit { hide playerStatusRectAlt } + +} + + itemDef { + name "playerStatusRectAlt" + rect 12 13 112 48 + visible 0 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 .0 +} + + itemDef { + name "playeritem" + rect 27 19 24 24 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + itemDef { + name "CTFPOWERUP" + rect 55 19 24 24 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + + + } + + itemDef { + name "flag" + rect 85 15 40 40 + visible 1 + decoration + ownerdraw CG_PLAYER_HASFLAG + } + + itemDef { + name "skulls" + rect 75 8 45 40 + visible 1 + decoration + textscale 0.5 + ownerdraw CG_HARVESTER_SKULLS + } + + + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 12 13 112 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar1.tga" + } + + } + + + + + +// AMMO // + +menuDef { + name "Ammo" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 129 416 128 64 + + + itemDef { + name "ammoRect" + visible 1 + style 4 + //background "ui/assets/hudback.tga" + rect 2 13 122 48 + border 1 + bordersize 1 + mouseEnter { show ammoRectAlt } + mouseExit { hide ammoRectAlt } + } + + itemDef { + name "ammoRectAlt" + visible 0 + style 1 + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "a" + rect 85 22 32 32 + visible 1 + decoration + ownerdraw CG_PLAYER_AMMO_ICON + } + + itemDef { + name "a" + rect 10 40 63 12 + visible 1 + decoration + textscale .75 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 .3 .65 0 1 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar2.tga" + } + +} + + + + + + +// PLAYER // + +menuDef { + name "Player" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 257 416 128 64 + + + itemDef { + name "playerRect" + rect 2 2 122 60 + style 4 + //background "ui/assets/hudback.tga" + visible 1 + border 1 + bordersize 1 + mouseEnter { show playerRectAlt } + mouseExit { hide playerRectAlt } + } + + itemDef { + name "playerRectAlt" + rect 2 2 122 60 + style 1 + visible 0 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "b" + rect 10 40 63 12 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .75 + ownerdraw CG_PLAYER_HEALTH + ownerdrawflag CG_SHOW_HEALTHOK + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 .3 .65 0 1 + addColorRange 101 999 1 1 1 1 + } + + itemDef { + name "b" + rect 10 40 63 12 + visible 1 + decoration + forecolor 1 0 0 1 + textscale .75 + textstyle ITEM_TEXTSTYLE_BLINK + ownerdraw CG_PLAYER_HEALTH + ownerdrawflag CG_SHOW_HEALTHCRITICAL + } + + + itemDef { + name "b" + rect 75 10 50 50 + visible 1 + decoration + ownerdraw CG_PLAYER_HEAD + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar3.tga" + } + } + + + + +// ARMOR // + +menuDef { + name "Armor" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 385 416 128 64 + + + itemDef { + name "armorRect" + rect 2 13 122 48 + visible 1 + style 4 + //background "ui/assets/hudback.tga" + border 1 + bordersize 1 + mouseEnter { show armorRectAlt } + mouseExit { hide armorRectAlt } + } + + itemDef { + name "armorRectAlt" + rect 2 13 122 48 + visible 0 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + itemDef { + name "armor" + rect 75 -4 40 40 + visible 1 + decoration + ownerdraw CG_PLAYER_ARMOR_ICON2D + } + + itemDef { + name "armor2" + rect 10 40 63 12 + visible 1 + decoration + textscale .75 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 .67 0 0 1 + addColorRange 26 100 .3 .65 0 1 + addColorRange 101 999 .75 .75 .75 1 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar4.tga" + } + } + + +// LOCATION // + +menuDef { + name "location" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 380 128 22 + + + + itemDef { + name "locationRect" + visible MENU_TRUE + rect 0 0 128 22 + style 4 + } + + + itemDef { + name "playerlocation" + rect 10 2 16 16 + visible 1 + decoration + textscale .25 + ownerdraw CG_PLAYER_LOCATION + } +} + + + +// FLAGSTATUS // + +menuDef { + name "FlagStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 405 128 22 + + + + itemDef { + name "flagStatusRect" + visible MENU_TRUE + rect 0 0 128 22 + style 4 + //border 1 + //bordersize 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { setcolor bordercolor 1 1 1 1 } + mouseExit { setcolor bordercolor 0 0 0 0 } + } + + itemDef { + name "f" + rect 30 4 16 16 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/bluechip.tga" + } + + itemDef { + name "f" + rect 4 4 16 16 + visible 1 + decoration + ownerdraw CG_ONEFLAG_STATUS + } + + itemDef { + name "f" + rect 30 4 16 16 + visible 1 + decoration + ownerdraw CG_BLUE_FLAGSTATUS + } + + + itemDef { + name "r" + rect 40 3 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + + itemDef { + name "f" + rect 72 4 16 16 + visible 1 + bordercolor 1 1 1 1 + decoration + style 3 + background "ui/assets/redchip.tga" + } + + itemDef { + name "f" + rect 72 4 16 16 + visible 1 + decoration + ownerdraw CG_RED_FLAGSTATUS + } + + itemDef { + name "r" + rect 87 3 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + +} + + +// GAMETYPE // + +menuDef { + name "GameType" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 354 128 22 + + + itemDef { + name "gameTypeRect" + visible 1 + rect 0 0 125 22 + style 4 + //background "ui/assets/hudback.tga" + visible 1 + decoration + mouseEnter { show gameTypeRectAlt } + mouseExit { hide gameTypeRectAlt } + } + + itemDef { + name "gameTypeRectAlt" + visible 0 + rect 0 0 125 22 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + itemDef { + name "gameTypeName" + visible 1 + rect 5 2 125 16 + textscale .25 + ownerdraw CG_GAME_TYPE + style 1 + } + + +} + +// PLAYERSCORE // + +menuDef { + name "PlayerScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 416 128 64 + + + itemDef { + name "playerScoreRect" + visible 1 + rect 2 13 110 48 + style 4 + border 1 + bordersize 1 + mouseEnter { show playerScoreRectAlt } + mouseExit { hide playerScoreRectAlt } + + } + + itemDef { + name "playerScoreRectAlt" + visible 0 + rect 2 13 110 48 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "playerStatus" + rect 10 30 16 16 + visible 1 + decoration + ownerdraw CG_PLAYER_STATUS + } + + itemDef { + name "playerScore" + rect 10 32 125 12 + visible 1 + decoration + forecolor .3 .65 0 1 + textscale .35 + ownerdraw CG_PLAYER_SCORE + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 110 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar5.tga" + } + + } +} + +// SCORESTATUS // + +menuDef { + name "ScoreStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 428 125 50 + style 4 + //background "ui/assets/hudback.tga" + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "r" + rect 5 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + +itemDef { + name "r" + rect 42 5 30 15 + visible 1 + decoration + forecolor 0 0 1 1 + textscale 0.25 + ownerdraw CG_BLUE_NAME + } + + +itemDef { + name "r" + rect 5 25 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + + itemDef { + name "r" + rect 42 25 30 15 + visible 1 + decoration + forecolor 1 0 0 1 + textscale 0.25 + ownerdraw CG_RED_NAME + } + } + + + +} + +// Close off other menu options // + +// CROSSHAIR STATUS BAR // + +menuDef { + name "crosshairStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 256 176 128 128 + style 0 + +itemDef { + name "crosshairHealth" + rect 0 0 128 64 + visible 1 + decoration + forecolor 0 0 0 0 + style 3 + ownerdraw CG_PLAYER_HEALTH_VALUE + background "ui/assets/crosshair_health.tga" + addColorRange -999 25 1 0 0 .5 + addColorRange 26 100 1 .75 0 .25 + addColorRange 101 999 1 1 1 .1 + } + + +itemDef { + name "crosshairAmmo" + rect 0 64 64 64 + visible 1 + decoration + style 3 + forecolor 0 0 0 0 + ownerdraw CG_PLAYER_AMMO_VALUE + background "ui/assets/crosshair_ammo.tga" + addColorRange -999 5 1 0 0 .5 + addColorRange 6 999 1 .75 0 .25 + } + +itemDef { + name "crosshairArmor" + rect 64 64 64 64 + visible 1 + decoration + style 3 + forecolor 1 1 1 .25 + forecolor 0 0 0 0 + ownerdraw CG_PLAYER_ARMOR_VALUE + background "ui/assets/crosshair_armor.tga" + addColorRange -999 25 1 0 0 .5 + addColorRange 26 100 1 .75 0 .25 + addColorRange 101 999 1 1 1 .1 + } +} + + + + + + +// MINI_STATUS // + +menuDef { + name "miniPlayerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 1 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + +itemDef { + name "miniAmmoValue" + rect 5 5 25 15 + visible 1 + decoration + textscale .33 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 1 .75 0 1 + } + + +itemDef { + name "miniHealthValue" + rect 45 5 25 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .33 + ownerdraw CG_PLAYER_HEALTH + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } + +itemDef { + name "MiniArmorValue" + rect 90 5 25 15 + visible 1 + decoration + textscale .33 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } +} + +// MINI_CTF_STATUS // + +menuDef { + name "miniCTFStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 129 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + +itemDef { + name "miniFlagBlue" + rect 5 5 16 16 + visible 1 + decoration + ownerdraw CG_BLUE_FLAGSTATUS + } + +itemDef { + name "miniBlueScore" + rect 10 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.33 + ownerdraw CG_BLUE_SCORE + } + +itemDef { + name "miniFlagRed" + rect 65 5 16 16 + visible 1 + decoration + ownerdraw CG_RED_FLAGSTATUS + } + +itemDef { + name "miniRedScore" + rect 70 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.33 + ownerdraw CG_RED_SCORE + } + +} + + +// MINI_SCORE // + +menuDef { + name "miniScore" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 257 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "b" + rect 5 5 16 16 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_STATUS + } + +itemDef { + name "b" + rect 30 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .33 + ownerdraw CG_PLAYER_SCORE + } + +} + + + +// MINI_LOCATION // + + +menuDef { + name "miniLocation" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 385 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "b" + rect 5 5 30 15 + visible 1 + decoration + textscale .33 + ownerdraw CG_PLAYER_LOCATION + } + } + + + +// MINI_ITEM // + + +menuDef { + name "miniItem" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 513 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "b" + rect 5 5 30 30 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + +itemDef { + name "b" + rect 5 50 30 30 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + } + + + } + + + } + + +} + diff --git a/quake3/source/ui/ingame.menu b/quake3/source/ui/ingame.menu new file mode 100644 index 0000000..602a1f8 --- /dev/null +++ b/quake3/source/ui/ingame.menu @@ -0,0 +1,382 @@ +#include "ui/menudef.h" +{ + + assetGlobalDef { + font "fonts/font" 16 // font + smallFont "fonts/smallfont" 12 // font + bigFont "fonts/bigfont" 20 // font + cursor "ui/assets/3_cursor3" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + itemFocusSound "sound/misc/menu2.wav" // sound for item getting focus (via keyboard or mouse ) + + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowColor 0.1 0.1 0.1 0.25 // shadow color + } + + +\\ INGAME MENU \\ + + menuDef { + name "ingame" + visible 0 + fullScreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 0 0 640 480 + focusColor 1 .75 0 1 + disableColor .5 .5 .5 1 + +itemDef { + name "ingameRect" + visible 1 + rect 0 0 620 26 + style 0 + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 .75 .5 + visible 1 + decoration + } +itemdef + { + name about + text "About" + rect 5 0 53 30 + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textalignx 27 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor .0 .17 .0 1 + visible 1 + action { open ingame_about } + mouseEnter { setitemcolor about backcolor .1 .37 .1 1 } + mouseExit { setitemcolor about backcolor .0 .17 .0 1 } + } +itemdef + { + name aboutframe + style 3 + rect 0 0 58 32 + background "ui/assets/ingameframea.tga" + visible 1 + decoration + } + + itemDef { + name join + text "Join" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + cvarTest "ui_singleplayeractive" + disableCvar { "1" } + rect 58 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_join } + mouseEnter { setitemcolor join backcolor .1 .37 .1 1 } + mouseExit { setitemcolor join backcolor 0 .17 0 1 } + } + +itemdef + { + name joinframe + style 3 + rect 58 0 58 32 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + + + itemDef { + name orders + text "Orders" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 116 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + cvarTest "g_gametype" + disableCvar { "0" ; "1" ; "2" ; "3" ; "8" } + visible 1 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + action { open ingame_orders } + mouseEnter { setitemcolor orders backcolor .1 .37 .1 1 } + mouseExit { setitemcolor orders backcolor 0 .17 0 1 } + } + +itemdef + { + name ordersframe + style 3 + rect 116 0 58 32 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + + itemDef { + name addBot + text "Add Bot" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 174 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + cvarTest "ui_singleplayeractive" + disableCvar { "1" } + + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_addbot } + mouseEnter { setitemcolor addBot backcolor .1 .37 .1 1 } + mouseExit { setitemcolor addBot backcolor 0 .17 0 1 } + } +itemdef + { + name addBotframe + style 3 + rect 174 0 58 32 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + +itemDef { + name player + text "Player" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 232 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_player } + mouseEnter { setitemcolor player backcolor .1 .37 .1 1 } + mouseExit { setitemcolor player backcolor 0 .17 0 1 } + } +itemdef + { + name playerframe + style 3 + rect 232 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + +itemDef { + name controls + text "Controls" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 290 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_controls } + mouseEnter { setitemcolor controls backcolor .1 .37 .1 1 } + mouseExit { setitemcolor controls backcolor 0 .17 0 1 } + } + +itemdef + { + name controlsframe + style 3 + rect 290 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + +itemDef { + name options + text "Options" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 348 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_options } + mouseEnter { setitemcolor options backcolor .1 .37 .1 1 } + mouseExit { setitemcolor options backcolor 0 .17 0 1 } + } + +itemdef + { + name optionsframe + style 3 + rect 348 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + +itemDef { + name system + text "System" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 406 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_system } + mouseEnter { setitemcolor system backcolor .1 .37 .1 1 } + mouseExit { setitemcolor system backcolor 0 .17 0 1 } + } + +itemdef + { + name systemframe + style 3 + rect 406 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + +itemDef { + name vote + text "Vote" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + cvarTest "ui_singleplayeractive" + disableCvar { "1" } + + rect 464 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_vote } + mouseEnter { setitemcolor vote backcolor .1 .37 .1 1 } + mouseExit { setitemcolor vote backcolor 0 .17 0 1 } + } +itemdef + { + name voteframe + style 3 + rect 464 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + +itemDef { + name callvote + text "CallVote" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + cvarTest "ui_singleplayeractive" + disableCvar { "1" } + + rect 522 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_callvote } + mouseEnter { setitemcolor callvote backcolor .1 .37 .1 1 } + mouseExit { setitemcolor callvote backcolor 0 .17 0 1 } + } +itemdef + { + name callvoteframe + style 3 + rect 522 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } +itemDef { + name leave + text "Exit" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 580 0 58 30 + textalign 1 + textalignx 29 + textaligny 22 + textscale .25 + forecolor 1 1 1 1 + backcolor 0 .17 0 1 + visible 1 + action { open ingame_leave } + mouseEnter { setitemcolor leave backcolor .1 .37 .1 1 } + mouseExit { setitemcolor leave backcolor 0 .17 0 1 } + } + +itemdef + { + name leave + style 3 + rect 580 0 58 32 + textalign 1 + background "ui/assets/ingameframe.tga" + visible 1 + decoration + } + + + +} + +} \ No newline at end of file diff --git a/quake3/source/ui/ingame.txt b/quake3/source/ui/ingame.txt new file mode 100644 index 0000000..6ead515 --- /dev/null +++ b/quake3/source/ui/ingame.txt @@ -0,0 +1,16 @@ +// menu defs +// +{ + loadMenu { "ui/ingame.menu" } + loadMenu { "ui/ingame_vote.menu" } + loadMenu { "ui/ingame_about.menu" } + loadMenu { "ui/ingame_controls.menu" } + loadMenu { "ui/ingame_join.menu" } + loadMenu { "ui/ingame_options.menu" } + loadMenu { "ui/ingame_system.menu" } + loadMenu { "ui/ingame_leave.menu" } + loadMenu { "ui/ingame_player.menu" } + loadMenu { "ui/ingame_addbot.menu" } + loadMenu { "ui/ingame_callvote.menu" } + loadMenu { "ui/ingame_orders.menu" } +} diff --git a/quake3/source/ui/ingame_about.menu b/quake3/source/ui/ingame_about.menu new file mode 100644 index 0000000..bb73d61 --- /dev/null +++ b/quake3/source/ui/ingame_about.menu @@ -0,0 +1,400 @@ +#include "ui/menudef.h" + +{ +\\ INGAME ABOUT BOX \\ + +menuDef { + name "ingame_about" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 0 30 256 295 + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name window + rect 10 15 256 280 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + + +// FRAME // + + + +itemDef { + name window + rect 0 10 16 128 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 3 0 65 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 67 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 131 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 138 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 202 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 233 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 212 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 212 233 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 64 289 66 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 289 96 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 260 74 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 260 138 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 260 202 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name about + rect 0 25 256 20 + name gametypefield + type 4 + style 0 + text "Map Name:" + cvar mapname + maxPaintChars 12 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + +itemDef { + name about + rect 0 40 256 20 + style 0 + //type 4 + textalign ITEM_ALIGN_RIGHT + text "GameType:" + type ITEM_TYPE_MULTI + cvar "G_GAMETYPE" + cvarFloatList { "Free For All" 0 "Tournament" 1 "Free For All" 2 "Team Deathmatch" 3 "Capture the Flag" 4 "One Flag CTF" 5 "Overload" 6 "Harvester" 7 "Team Tournament" 8 } + + textalignx 128 + textaligny 12 + textscale .25 + backcolor 0 0 .75 .25 + visible 1 + decoration + } +itemDef { + name about + rect 0 70 256 20 + type 4 + style 0 + text "Capture Limit:" + cvarTest "G_GAMETYPE" + hideCvar { "0" ; "1" ; "2" ; "3" } + maxPaintChars 12 + cvar capturelimit + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name about + rect 0 70 256 20 + type 4 + style 0 + text "Frag Limit:" + cvarTest "G_GAMETYPE" + showCvar { "0" ; "1" ; "2" ; "3" } + maxPaintChars 12 + cvar fraglimit + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name about + rect 0 85 256 20 + type 4 + style 0 + text "Time Limit:" + maxPaintChars 12 + cvar timelimit + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +itemDef { + name about + rect 20 100 256 20 + type 4 + style 0 + text "Red Team:" + maxPaintChars 12 + cvar g_redTeam + textalign ITEM_ALIGN_RIGHT + textalignx 108 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name about + rect 20 115 256 20 + type 4 + style 0 + text "Blue Team:" + maxPaintChars 12 + cvar g_blueTeam + textalign ITEM_ALIGN_RIGHT + textalignx 108 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name about + rect 0 140 256 20 + type 4 + style 0 + text "Protocol:" + cvar protocol + maxPaintChars 12 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name about + rect 0 155 256 20 + type 4 + style 0 + text "Max Clients:" + cvar sv_maxclients + maxPaintChars 12 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name about + rect 0 170 256 20 + type 4 + style 0 + text "Host Name:" + cvar sv_hostname + maxPaintChars 12 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name about + rect 0 205 256 20 + type 11 + style 0 + text "Password Required:" + cvar g_needpass + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name about + rect 0 220 256 20 + type 11 + style 0 + text "DM Flags:" + cvar g_dmflags + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name about + rect 0 235 256 20 + type 11 + style 0 + text "Bot/Min Players:" + cvar bot_minplayers + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +itemDef { + name about + rect 0 265 256 20 + type 4 + style 0 + text "Version:" + cvar version + maxPaintChars 32 + textalign ITEM_ALIGN_LEFT + textalignx 128 + textaligny 12 + textalign 1 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + +} + + +} diff --git a/quake3/source/ui/ingame_addbot.menu b/quake3/source/ui/ingame_addbot.menu new file mode 100644 index 0000000..3c9ee2e --- /dev/null +++ b/quake3/source/ui/ingame_addbot.menu @@ -0,0 +1,162 @@ +#include "ui/menudef.h" + +{ +\\ ADDBOT MENU \\ + +menuDef { + name "ingame_addbot" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 106 30 192 123 + disableColor .5 .5 .5 1 + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name window + rect 10 15 172 108 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + + + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 64 0 65 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 129 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 129 64 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 120 66 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + +itemDef { + name gametypefield + style 0 + text "Name:" + ownerdraw UI_BOTNAME + rect 0 20 128 20 + textalign ITEM_ALIGN_RIGHT + textalignx 86 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + } + +itemDef { + name gametypefield + style 0 + text "Team:" + ownerdraw UI_REDBLUE + rect 0 40 128 20 + textalign ITEM_ALIGN_RIGHT + textalignx 86 + textaligny 18 + textscale .25 + cvarTest "g_gametype" + disableCvar { "0" ; "1" } + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + } + +itemDef { + name gametypefield + style 0 + text "Skill:" + ownerdraw UI_BOTSKILL + rect 0 60 128 20 + textalign ITEM_ALIGN_RIGHT + textalignx 86 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + } + + +itemDef { + name ok + text "Add Bot" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 65 95 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { uiScript addBot ; uiScript closeingame } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + + + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_callvote.menu b/quake3/source/ui/ingame_callvote.menu new file mode 100644 index 0000000..65a2acf --- /dev/null +++ b/quake3/source/ui/ingame_callvote.menu @@ -0,0 +1,491 @@ +#include "ui/menudef.h" + +{ +\\ CALL VOTE MENU \\ + +menuDef { + name "ingame_callvote" + visible 0 + fullscreen 0 + rect 347 30 290 190 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + focusColor 1 .75 0 1 + style 1 + border 1 + onopen { hide grpcallVote ; show misc ; uiScript loadArenas } + +itemDef { + name window + rect 10 15 270 175 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 226 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 168 0 64 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 128 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 226 128 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 274 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 184 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 184 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + +// BUTTONS // +itemDef { + name ctr_misc + text "Misc" + textscale .25 + group grpbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 20 25 45 20 + type 1 + textalign 1 + textalignx 22 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpCallVote ; show misc } + mouseEnter { setitemcolor ctr_misc backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_misc backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_gametype + text "Type" + textscale .25 + group grpbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 71 25 45 20 + type 1 + textalign 1 + textalignx 22 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpCallVote ; show type } + mouseEnter { setitemcolor ctr_gametype backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_gametype backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_kickplayer + text "Kick" + textscale .25 + group grpbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 122 25 45 20 + type 1 + textalign 1 + textalignx 22 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpCallVote ; show kick } + mouseEnter { setitemcolor ctr_kickplayer backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_kickplayer backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_changemap + text "Map" + textscale .25 + group grpbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 173 25 45 20 + type 1 + textalign 1 + textalignx 22 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpCallVote ; show map } + mouseEnter { setitemcolor ctr_changemap backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_changemap backcolor .37 .1 .1 1 } + } +itemDef { + name ctr_changeleader + text "Leader" + textscale .25 + group grpbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 225 25 45 20 + type 1 + textalign 1 + textalignx 22 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpCallVote ; show leader } + mouseEnter { setitemcolor ctr_changeleader backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_changeleader backcolor .37 .1 .1 1 } + } + + +// MISC // + +itemDef { + name misc + text "Restart Map" + group grpCallVote + textscale .25 + rect 0 70 290 20 + type 1 + textalign 1 + textalignx 145 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + action { exec "cmd callvote map_restart" ; uiScript closeingame } + } + + +itemDef { + name misc + group grpCallVote + text "Next Map" + textscale .25 + rect 0 90 290 20 + type 1 + textalign 1 + textalignx 145 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + action { exec "cmd callvote nextmap" ; uiScript closeingame } + } +itemDef { + name misc + group grpCallVote + text "Do Warmup" + textscale .25 + rect 0 110 290 20 + type 1 + textalign 1 + textalignx 145 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + action { exec "cmd callvote g_doWarmup 1" ; uiScript closeingame } + } + + + +// Game Type // + +itemDef { + name type + group grpCallVote + text "Gametype:" + style 0 + textscale .25 + ownerdraw UI_NETGAMETYPE + rect 60 90 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + } +itemDef { + name type + text "OK" + type 1 + textscale .25 + group grpCallVote + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 123 160 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { uiScript voteGame ; uiScript closeingame } + mouseEnter { setcolor backcolor .1 .37 .1 1 } + mouseExit { setcolor backcolor .37 .1 .1 1 } + } + + +// KICK PLAYER // + +itemDef { + name kick + group grpCallVote + text "Kick Player:" + textscale .25 + rect 20 50 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + decoration + action { } + } +itemDef { + name kick + group grpCallVote + rect 20 70 250 85 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_LISTBOX + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_PLAYER_LIST + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 0 + mouseEnter { fadein message_arena ; setitemcolor kick bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor kick bordercolor .5 .5 .5 1 } + } + +itemDef { + name kick + text "OK" + type 1 + textscale .25 + group grpCallVote + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 123 160 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { uiScript voteKick ; uiScript closeingame } + mouseEnter { setcolor backcolor .1 .37 .1 1 } + mouseExit { setcolor backcolor .37 .1 .1 1 } + } + +// NEW MAP // + +itemDef { + name map + group grpCallVote + text "New Map:" + ownerdraw UI_ALLMAPS_SELECTION + textscale .25 + rect 20 50 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + decoration + visible 0 + action { } + } +itemDef { + name map + group grpCallVote + rect 20 70 250 85 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_ALLMAPS + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 0 + mouseEnter { fadein message_arena ; setitemcolor map bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor map bordercolor .5 .5 .5 .5 } + } + + +itemDef { + name map + text "OK" + type 1 + textscale .25 + group grpCallVote + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 123 160 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { uiScript voteMap ; uiScript closeingame } + mouseEnter { setcolor backcolor .1 .37 .1 1 } + mouseExit { setcolor backcolor .37 .1 .1 1 } + } + +// CHANGE LEADER // + +itemDef { + name leader + group grpCallVote + text "New Leader:" + textscale .25 + rect 20 50 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 0 + decoration + action { } + } +itemDef { + name leader + group grpCallVote + rect 20 70 250 85 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_LISTBOX + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_TEAM_LIST + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 0 + mouseEnter { fadein message_arena ; setitemcolor leader bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor leader bordercolor .5 .5 .5 1 } + } + +itemDef { + name leader + text "OK" + type 1 + textscale .25 + group grpCallVote + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 123 160 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { uiScript voteLeader ; uiScript closeingame } + mouseEnter { setcolor backcolor .1 .37 .1 1 } + mouseExit { setcolor backcolor .37 .1 .1 1 } + } + + + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_callvote2.menu b/quake3/source/ui/ingame_callvote2.menu new file mode 100644 index 0000000..c4ae366 --- /dev/null +++ b/quake3/source/ui/ingame_callvote2.menu @@ -0,0 +1,192 @@ +#include "ui/menudef.h" + +{ +\\ CALL VOTE MENU \\ + +menuDef { + name "ingame_callvote" + visible 0 + fullscreen 0 + rect 374 30 255 350 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + focusColor 1 .75 0 1 + style 1 + border 1 + + onOpen { uiScript loadArenas } + + +itemDef { + name window + rect 0 0 255 350 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .75 .25 + visible 1 + decoration + } + + + + +itemDef { + name maprestart + text "Map Restart:" + type 11 + textscale .25 + cvar "map_restart" + rect 20 10 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name maprestart + text "Next Map:" + type 11 + textscale .25 + cvar "nextmap" + rect 20 30 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { } + } +itemDef { + name maprestart + text "Do Warmup:" + type 11 + textscale .25 + rect 20 50 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { } + } + +itemDef { + name gametype + text "Gametype:" + style 0 + textscale .25 + ownerdraw UI_NETGAMETYPE + rect 20 70 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name window + rect 0 92 255 120 + style 0 + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name maprestart + text "Kick Player:" + textscale .25 + rect 20 95 110 20 + //ownerdraw UI_ALLMAPS_SELECTION + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { } + } +itemDef { + name playerlist + rect 20 115 225 85 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_LISTBOX + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 1 + mouseEnter { fadein message_arena ; setitemcolor playerlist bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor playerlist bordercolor .5 .5 .5 1 } + } + +itemDef { + name maprestart + text "New Map:" + ownerdraw UI_ALLMAPS_SELECTION + textscale .25 + rect 20 215 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { } + } +itemDef { + name maplist + rect 20 235 225 85 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 15 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_MAPS + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 1 + mouseEnter { fadein message_arena ; setitemcolor maplist bordercolor .7 0 0 1 } + mouseExit { fadeout message_arena ; setitemcolor maplist bordercolor .5 .5 .5 .5 } + } + + + +itemDef { + name ok + text "OK" + textscale .25 + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 325 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 1 + action { close ingame_callvote ; close ingame ; open ingame } + } + + + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_controls.menu b/quake3/source/ui/ingame_controls.menu new file mode 100644 index 0000000..6dd0e78 --- /dev/null +++ b/quake3/source/ui/ingame_controls.menu @@ -0,0 +1,1412 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "ingame_controls" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 131 30 375 335 + focusColor 1 .75 0 1 + style 1 + border 1 + onClose { + uiScript saveControls + } + onopen { hide grpControls ; show look ; uiScript loadControls } + +itemDef { + name window + rect 10 15 355 320 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 219 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 311 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 155 0 64 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 274 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 311 274 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 192 16 96 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 359 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 359 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 359 192 16 96 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 330 96 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 160 330 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 224 330 87 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + + + + + + + + + + + + + + + +itemDef { + name keyBindStatus + rect 0 55 300 15 + ownerdraw UI_KEYBINDSTATUS + text " " + forecolor 1 .75 0 1 + textscale .20 + textalignx 187 + textalign 1 + textaligny 10 + visible 0 + decoration + } + + +itemDef { + name ctr_look + text "Look" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 25 25 50 20 + textalign 1 + textalignx 25 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show look } + mouseEnter { setitemcolor ctr_look backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_look backcolor .37 .1 .1 1 } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Lookup:" + cvar "+lookup" + rect 0 85 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Look Down:" + cvar "+lookdown" + rect 0 100 320 12 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Mouse Look:" + cvar "+mlook" + rect 0 115 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "Centerview:" + cvar "centerview" + rect 0 130 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_BIND + text "ZoomView:" + cvar "+zoom" + rect 0 145 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name look + group grpControls + type ITEM_TYPE_YESNO + text "Free Look:" + cvar "cl_freelook" + rect 0 160 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + +itemDef { + name ctr_move + text "Move" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 80 25 50 20 + textalign 1 + textalignx 25 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show move } + mouseEnter { setitemcolor ctr_move backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_move backcolor .37 .1 .1 1 } + } + + + itemDef { + name move + group grpControls + type ITEM_TYPE_YESNO + text "Always Run:" + cvar "cl_run" + rect 0 85 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Run / Walk:" + cvar "+speed" + rect 0 100 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Forward:" + cvar "+forward" + rect 0 115 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Backpedal:" + cvar "+back" + rect 0 130 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Move Left:" + cvar "+moveleft" + rect 0 145 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Move Right:" + cvar "+moveright" + rect 0 160 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Jump:" + cvar "+moveup" + rect 0 175 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Crouch:" + cvar "+movedown" + rect 0 190 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Turn Left:" + cvar "+left" + rect 0 205 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Turn Right:" + cvar "+right" + rect 0 220 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name move + group grpControls + type ITEM_TYPE_BIND + text "Strafe:" + cvar "+strafe" + rect 0 235 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + +itemDef { + name ctr_shoot + text "Shoot" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 135 25 50 20 + textalign 1 + textalignx 25 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show shoot } + mouseEnter { setitemcolor ctr_shoot backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_shoot backcolor .37 .1 .1 1 } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Attack:" + cvar "+attack" + rect 0 75 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Previous Weapon:" + cvar "weapprev" + rect 0 90 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Next Weapon:" + cvar "weapnext" + rect 0 105 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_YESNO + text "Autoswitch:" + cvar "cg_autoswitch" + rect 0 120 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Gauntlet:" + cvar "weapon 1" + rect 0 135 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Machinegun:" + cvar "weapon 2" + rect 0 150 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Shotgun:" + cvar "weapon 3" + rect 0 165 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Grenade Launcher:" + cvar "weapon 4" + rect 0 180 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Rocket Launcher:" + cvar "weapon 5" + rect 0 195 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Lightning Gun:" + cvar "weapon 6" + rect 0 210 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Railgun:" + cvar "Weapon 7" + rect 0 225 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Plasma Gun:" + cvar "weapon 8" + rect 0 240 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "BFG:" + cvar "weapon 9" + rect 0 255 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Nail Gun:" + cvar "weapon 11" + rect 0 270 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Proximity Mine:" + cvar "weapon 12" + rect 0 285 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name shoot + group grpControls + type ITEM_TYPE_BIND + text "Chain Gun:" + cvar "weapon 13" + rect 0 300 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + +itemDef { + name ctr_miscellaneous + text "Misc" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 190 25 50 20 + textalign 1 + textalignx 25 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show misc } + mouseEnter { setitemcolor ctr_miscellaneous backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_miscellaneous backcolor .37 .1 .1 1 } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Show Scores:" + cvar "+scores" + rect 0 75 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Scroll Scores Up:" + cvar "scoresUp" + rect 0 90 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Scroll Scores Down:" + cvar "scoresDown" + rect 0 105 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_BIND + text "Use Item:" + cvar "+button2" + rect 0 120 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + + itemDef { + name misc + group grpControls + type ITEM_TYPE_SLIDER + text "Sensitivity:" + cvarfloat "sensitivity" 5 1 30 + rect 0 135 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show slider_message } + mouseexit { hide slider_message } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_YESNO + text "Invert Mouse:" + cvar "ui_mousePitch" + rect 0 150 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript update ui_mousePitch } + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + itemDef { + name misc + group grpControls + type ITEM_TYPE_YESNO + text "Smooth Mouse:" + cvar "m_filter" + rect 0 165 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show yesno_message } + mouseexit { hide yesno_message } + } + + + +itemDef { + name ctr_orders + text "Orders" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 245 25 50 20 + textalign 1 + textalignx 25 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show orders } + mouseEnter { setitemcolor ctr_orders backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_orders backcolor .37 .1 .1 1 } + } + + + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Next Team Member:" + cvar "nextTeamMember" + rect 0 85 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Next Team Order:" + cvar "nextOrder" + rect 0 100 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Confirm Order:" + cvar "confirmOrder" + rect 0 115 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Deny Order:" + cvar "denyOrder" + rect 0 130 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Offense:" + cvar "taskOffense" + rect 0 145 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Defense:" + cvar "taskDefense" + rect 0 160 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Patrol:" + cvar "taskPatrol" + rect 0 175 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Camp:" + cvar "taskCamp" + rect 0 190 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Follow:" + cvar "taskFollow" + rect 0 205 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Retrieve:" + cvar "taskRetrieve" + rect 0 220 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Escort:" + cvar "taskEscort" + rect 0 235 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + textaligny 12 + maxPaintChars 20 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "I Have the Flag!" + cvar "taskOwnFlag" + rect 0 250 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + itemDef { + name orders + group grpControls + type ITEM_TYPE_BIND + text "Target Suicide" + cvar "taskSuicide" + rect 0 265 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + +itemDef { + name ctr_chat + text "Chat" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 300 25 50 20 + textalign 1 + textalignx 25 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpControls ; show chat } + mouseEnter { setitemcolor ctr_chat backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_chat backcolor .37 .1 .1 1 } + } + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Gesture:" + cvar "+button3" + rect 0 75 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Chat:" + cvar "messagemode" + rect 0 90 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Team Chat:" + cvar "messagemode2" + rect 0 105 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Target Chat:" + cvar "messagemode3" + rect 0 120 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Attack Chat:" + cvar "messagemode4" + rect 0 135 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + +itemDef { + name chat + group grpControls + type ITEM_TYPE_BIND + text "Voice Taunt:" + cvar "tauntTaunt" + rect 0 150 320 15 + textalign ITEM_ALIGN_RIGHT + textalignx 187 + maxPaintChars 20 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 0 + mouseenter { show keyBindStatus } + mouseexit { hide keyBindStatus } + } + +itemDef { + name yesno_message + rect 0 55 300 15 + text "Select the Item to Toggle to Yes or No" + forecolor 1 .75 0 1 + textscale .20 + textalignx 187 + textalign 1 + textaligny 10 + visible 0 + decoration + } + +itemDef { + name slider_message + rect 0 55 300 15 + text "Drag the Slider to Increase and Decrease" + forecolor 1 .75 0 1 + textscale .20 + textalignx 187 + textalign 1 + textaligny 10 + visible 0 + decoration + } + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_join.menu b/quake3/source/ui/ingame_join.menu new file mode 100644 index 0000000..bf49c27 --- /dev/null +++ b/quake3/source/ui/ingame_join.menu @@ -0,0 +1,144 @@ +#include "ui/menudef.h" + + +{ +\\ INGAME_JOIN MENU \\ + + menuDef { + name "ingame_join" + visible 1 + fullScreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 23 30 128 128 + focusColor 1 .75 0 1 + + +itemDef { + name team + style WINDOW_STYLE_FILLED + rect 10 15 108 113 + + forecolor 1 1 1 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + + + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 30 0 65 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 64 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 64 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + + + + + +itemDef { + name team + text "Team RED" + type 1 + style 2 + rect 0 20 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { exec "cmd team red" ; uiScript closeingame } + } + + itemDef { + name team + text "Team BLUE" + type 1 + style 2 + rect 0 40 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { exec "cmd team blue" ; uiScript closeingame } + } + + + itemDef { + name team + text "Auto TEAM" + type 1 + style 2 + rect 0 60 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { exec "cmd team free" ; uiScript closeingame } + } + + + itemDef { + name team + text "Spectate" + type 1 + style 2 + rect 0 80 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { exec "cmd team s" ; uiScript closeingame } + } + + +} + +} \ No newline at end of file diff --git a/quake3/source/ui/ingame_leave.menu b/quake3/source/ui/ingame_leave.menu new file mode 100644 index 0000000..38fd7b6 --- /dev/null +++ b/quake3/source/ui/ingame_leave.menu @@ -0,0 +1,344 @@ +#include "ui/menudef.h" + + +{ +\\ INGAME_LEAVE MENU \\ + + menuDef { + name "ingame_leave" + visible 1 + fullScreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 511 30 128 125 + focusColor 1 .75 0 1 + onOpen { show grpMenu ; hide grpConfirm } + + + +itemDef { + name leave + style WINDOW_STYLE_FILLED + rect 10 15 108 110 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 112 10 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 0 63 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 64 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + + + +itemDef { + name leave + text "Main Menu" + group grpMenu + style 2 + rect 0 30 128 20 + type 1 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { hide grpMenu ; show leaveConfirm } + } + + itemDef { + name leave + group grpMenu + text "Restart" + style 2 + type 1 + rect 0 50 128 20 + textalign 1 + textalignx 65 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { hide grpMenu ; show restartConfirm } + } + + itemDef { + name leave + group grpMenu + type 1 + text "Quit" + style 2 + rect 0 70 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { hide grpMenu ; show quitConfirm } + } + + +// CONFIRMS // + + +itemDef { + name leaveConfirm + text "Exit to" + group grpConfirm + style 2 + rect 0 33 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + decoration + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name leaveConfirm + text "Main Menu?" + group grpConfirm + style 2 + rect 0 50 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + decoration + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name leaveConfirm + text "Yes" + group grpConfirm + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 18 80 40 20 + textalign 1 + textalignx 20 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { uiScript leave } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + +itemDef { + name leaveConfirm + text "No" + group grpConfirm + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 70 80 40 20 + textalign 1 + textalignx 20 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpConfirm ; show grpMenu } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + + +itemDef { + name restartConfirm + text "Want to" + group grpConfirm + style 2 + rect 0 33 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + decoration + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name restartConfirm + text "Restart Map?" + group grpConfirm + style 2 + rect 0 50 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + decoration + forecolor 1 1 1 1 + visible 1 + } + + + +itemDef { + name restartConfirm + text "Yes" + group grpConfirm + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 18 80 40 20 + textalign 1 + textalignx 20 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { exec "map_restart" ; close ingame_leave ; close ingame } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + +itemDef { + name restartConfirm + text "No" + group grpConfirm + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 70 80 40 20 + textalign 1 + textalignx 20 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpConfirm ; show grpMenu } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + +itemDef { + name quitConfirm + text "Want to" + group grpConfirm + style 2 + rect 0 33 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + decoration + visible 1 + } +itemDef { + name quitConfirm + text "Quit Game?" + group grpConfirm + style 2 + rect 0 50 128 20 + textalign 1 + textalignx 64 + textaligny 18 + textscale .25 + forecolor 1 1 1 1 + decoration + visible 1 + } + + +itemDef { + name quitConfirm + text "Yes" + group grpConfirm + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 18 80 40 20 + textalign 1 + textalignx 20 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { uiScript quit } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + +itemDef { + name quitConfirm + text "No" + group grpConfirm + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 70 80 40 20 + textalign 1 + textalignx 20 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpConfirm ; show grpMenu } + mouseEnter { setitemcolor ok backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ok backcolor .37 .1 .1 1 } + } + + + +} + +} \ No newline at end of file diff --git a/quake3/source/ui/ingame_options.menu b/quake3/source/ui/ingame_options.menu new file mode 100644 index 0000000..6a95431 --- /dev/null +++ b/quake3/source/ui/ingame_options.menu @@ -0,0 +1,469 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "ingame_options" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 265 30 210 375 + focusColor 1 .75 0 1 + style 1 + border 1 + disableColor .5 .5 .5 0 + +itemDef { + name window + rect 10 15 200 360 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 32 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 144 10 32 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 157 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 74 0 73 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 314 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 157 314 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 84 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 148 16 84 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 232 16 84 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 205 64 16 84 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 205 148 16 84 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 205 232 16 84 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 64 370 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 370 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + +itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Simple Items:" + cvar "cg_simpleItems" + rect 0 20 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Marks On Walls:" + cvar "cg_marks" + rect 0 37 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Show Floating Scores:" + cvar "cg_scorePlums" + rect 0 54 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_MULTI + text "Ejecting Brass:" + cvar "cg_brassTime" + cvarFloatList { "High" 2500 "Med" 1250 "Off" 0 } + rect 0 71 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Dynamic Lights:" + cvar "r_dynamiclight" + rect 0 88 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Identify Target:" + cvar "cg_drawCrosshairNames" + rect 0 105 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Draw Gun:" + cvar "cg_drawGun" + rect 0 122 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Low Quality Sky:" + cvar "r_fastsky" + rect 0 139 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Sync Every Frame:" + cvar "weapon 5" + rect 0 156 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Force Player Models:" + cvar "cg_forceModel" + rect 0 173 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Draw Team Overlay:" + cvar "cg_drawTeamOverlay" + rect 0 190 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Auto Download:" + cvar "cl_allowDownload" + rect 0 207 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Show Time:" + cvar "cg_drawTimer" + rect 0 224 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Voices Off:" + cvar "cg_NoVoiceChats" + rect 0 241 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Taunts Off:" + cvar "cg_noTaunt" + rect 0 258 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Voice Text Off:" + cvar "cg_noVoiceText" + rect 0 275 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Team Chats Only:" + cvar "cg_teamChatsOnly" + rect 0 292 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name options + group grpOptions + type ITEM_TYPE_MULTI + text "Statusbar:" + cvar "cg_hudfiles" + cvarStrList { Normal "ui/hud.txt" Small "ui/hud2.txt" } + rect 0 309 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + action { exec "loadhud" } + } + +itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "In Game Videos:" + cvar "r_inGameVideo" + rect 0 326 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 143 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name options + group grpOptions + text "Crosshair:" + ownerdraw UI_CROSSHAIR + rect 143 343 20 17 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + + + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_orders.menu b/quake3/source/ui/ingame_orders.menu new file mode 100644 index 0000000..82ce1b0 --- /dev/null +++ b/quake3/source/ui/ingame_orders.menu @@ -0,0 +1,481 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "ingame_orders" + visible 0 + fullscreen 0 + rect 45 30 200 240 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + focusColor 1 .75 0 1 + style 1 + border 1 + disableColor .5 .5 .5 1 + onopen { hide grpicon ; show attack } + +itemDef { + name window + rect 10 15 180 225 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 136 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 0 72 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 177 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 136 177 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 184 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 184 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 233 96 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + +itemDef { + name orders + group grporders + text "Name:" + style 0 + ownerdraw UI_SELECTEDPLAYER + // As cycle through playerlist selected player in HUD cycles // + rect 10 20 200 20 + textalign 0 + textalignx 10 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + +// COMMAND ICONS // + + itemDef { + name attack + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/assault.tga" + visible 0 + } + itemDef { + name defend + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/defend.tga" + visible 0 + } + itemDef { + name patrol + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/patrol.tga" + visible 0 + } + itemDef { + name follow + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/follow.tga" + visible 0 + } + itemDef { + name camp + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/camp.tga" + visible 0 + } + itemDef { + name leader + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/team_leader.tga" + visible 0 + } +itemDef { + name retrieve + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/retrieve.tga" + visible 0 + } +itemDef { + name escort + group grpicon + style 3 + rect 84 45 32 32 + background "ui/assets/statusbar/escort.tga" + visible 0 + } + + + + + +// GIVE ORDERS TO OTHERS // + + + + itemDef { + name orders + group grporders + text "Attack Enemy Base" + rect 0 80 200 20 + type 1 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show attack } + action { + uiScript voiceOrders "cmd vtell %d offense; +button7; wait; -button7" + uiScript voiceOrdersTeam "cmd vsay_team offense; +button7; wait; -button7" + } + ownerdrawflag UI_SHOW_LEADER + } + + itemDef { + name orders + group grporders + type 1 + text "Defend Our Base" + rect 0 100 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show defend } + action { + uiScript voiceOrders "cmd vtell %d defend; +button8; wait; -button8" + uiScript voiceOrdersTeam "cmd vsay_team defend; +button8; wait; -button8" + } + ownerdrawflag UI_SHOW_LEADER + } + + itemDef { + name orders + group grporders + type 1 + text "Patrol" + rect 0 120 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show patrol } + action { + uiScript voiceOrders "cmd vtell %d patrol; +button9; wait; -button9" + uiScript voiceOrdersTeam "cmd vsay_team patrol; +button9; wait; -button9" + } + ownerdrawflag UI_SHOW_LEADER + } + + itemDef { + name orders + group grporders + type 1 + text "Follow Me" + rect 0 140 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show follow } + action { + uiScript voiceOrders "cmd vtell %d followme; +button10; wait; -button10" + uiScript voiceOrdersTeam "cmd vsay_team followme; +button10; wait; -button10" + } + ownerdrawflag UI_SHOW_LEADER + } + itemDef { + name orders + group grporders + text "Camp Here" + type 1 + rect 0 160 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show camp } + action { + uiScript voiceOrders "cmd vtell %d camp" + uiScript voiceOrdersTeam "cmd vsay_team camp" + } + ownerdrawflag UI_SHOW_LEADER + } + itemDef { + name orders + group grporders + type 1 + text "Escort the Carrier" + rect 0 180 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + cvarTest "g_gametype" + hideCvar { "6" ; "7" } + mouseenter { hide grpicon ; show escort } + action { + uiScript voiceOrders "cmd vtell %d followflagcarrier" + uiScript voiceOrdersTeam "cmd vsay_team followflagcarrier" + } + ownerdrawflag UI_SHOW_LEADER + } + itemDef { + name orders + group grporders + type 1 + text "Retrieve Our Flag" + rect 0 200 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + cvarTest "g_gametype" + hideCvar { "5" ; "6" ; "7" } + mouseenter { hide grpicon ; show retrieve } + action { + uiScript voiceOrders "cmd vtell %d returnflag" + uiScript voiceOrdersTeam "cmd vsay_team returnflag" + } + ownerdrawflag UI_SHOW_LEADER + } + + +// CHANGE YOUR STATUS // + + + + itemDef { + name orders + group grporders + text "I'M ATTACKING" + rect 0 80 200 20 + textalign 1 + textalignx 100 + type 1 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show attack } + action { exec "teamtask 1 ; cmd vsay_team onoffense" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + + itemDef { + name orders + group grporders + text "I'M DEFENDING" + type 1 + rect 0 100 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show defend } + action { exec "teamtask 2 ; cmd vsay_team ondefense" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + + itemDef { + name orders + group grporders + type 1 + text "I'M PATROLLING" + rect 0 120 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show patrol } + action { exec "teamtask 3 ; cmd vsay_team onpatrol" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + + itemDef { + name orders + group grporders + text "I'M FOLLOWING" + type 1 + rect 0 140 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show follow } + action { exec "teamtask 4 ; cmd vsay_team onfollow" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + itemDef { + name orders + group grporders + text "I'M CAMPING" + rect 0 160 200 20 + type 1 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + mouseenter { hide grpicon ; show camp } + action { exec "teamtask 7 ; cmd vsay_team oncamp" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + itemDef { + name orders + group grporders + text "I'M ESCORTING" + type 1 + rect 0 180 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + cvarTest "g_gametype" + hideCvar { "6" ; "7" } + visible 1 + mouseenter { hide grpicon ; show retrieve } + action { exec "teamtask 6 ; cmd vsay_team onfollowcarrier" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + itemDef { + name orders + group grporders + text "I'M RETRIEVING" + type 1 + rect 0 200 200 20 + textalign 1 + textalignx 100 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + cvarTest "g_gametype" + hideCvar { "5" ; "6" ; "7" } + mouseenter { hide grpicon ; show escort } + action { exec "teamtask 5 ; cmd vsay_team onreturnflag" ; uiScript closeingame } + ownerdrawflag UI_SHOW_NOTLEADER + } + + + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_orders2.menu b/quake3/source/ui/ingame_orders2.menu new file mode 100644 index 0000000..0033332 --- /dev/null +++ b/quake3/source/ui/ingame_orders2.menu @@ -0,0 +1,199 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "ingame_orders" + visible 0 + fullscreen 0 + rect 45 30 200 240 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name window + rect 0 0 200 240 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .75 .25 + visible 1 + decoration + } + + +itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Name:" + cvar "+weapprev" + rect 0 5 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Follow:" + cvar "weapnext" + rect 0 25 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Go To:" + cvar "cg_autoswitch" + rect 0 45 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Get:" + cvar "weapon 1" + rect 0 65 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Patrol From:" + cvar "weapon 2" + rect 0 85 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Patrol To:" + cvar "weapon 3" + rect 0 105 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Camp Near:" + cvar "weapon 4" + rect 0 125 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Defend:" + cvar "weapon 5" + rect 0 145 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Attack:" + cvar "weapon 6" + rect 0 165 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name orders + group grporders + type ITEM_TYPE_YESNO + text "Leader:" + cvar "Weapon 7" + rect 0 185 200 20 + textalign ITEM_ALIGN_RIGHT + textalignx 80 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name ok + text "OK" + textscale .25 + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 75 215 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 1 + action { close ingame_orders ; close ingame ; open ingame } + } + + +} + + +} diff --git a/quake3/source/ui/ingame_player.menu b/quake3/source/ui/ingame_player.menu new file mode 100644 index 0000000..27e8583 --- /dev/null +++ b/quake3/source/ui/ingame_player.menu @@ -0,0 +1,259 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "ingame_player" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 125 30 290 170 + focusColor 1 .75 0 1 + style 1 + border 1 + onOpen { uiScript update "ui_GetName" } + onClose { uiScript update "ui_SetName" } + + +itemDef { + name window + rect 10 15 270 155 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 168 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 226 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 104 0 64 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 108 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 226 108 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 274 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 164 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 164 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + +itemDef { + name namefield + group "playersettinggroup" + type ITEM_TYPE_EDITFIELD + style 0 + text "Name:" + cvar "ui_Name" + maxchars 26 + rect 20 25 256 20 + textalign ITEM_ALIGN_LEFT + textalignx 10 + textaligny 18 + textscale .25 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 +} + +itemDef { + name handicapfield + group "playersettinggroup" + style 0 + text "Handicap:" + ownerdraw UI_HANDICAP + rect 20 45 256 20 + textalign ITEM_ALIGN_LEFT + textalignx 10 + textaligny 18 + textscale .25 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + } + +itemDef { + name effectentry + group "playersettinggroup" + text "Effect:" + type 1 + style 0 + rect 20 65 256 20 + textalign ITEM_ALIGN_LEFT + textalignx 10 + textaligny 18 + textscale .25 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + decoration + mouseEnterText { setitemcolor effectentry forecolor 1 .75 0 1 ; setfocus effectfield ; show message_effect } + mouseExitText { setitemcolor playersettinggroup forecolor 1 1 1 1 ; hide message_effect } + } + +itemDef { + name effectfield + group "playersettinggroup" + style 0 + ownerdraw UI_EFFECTS + rect 20 65 256 20 + textalign ITEM_ALIGN_LEFT + textalignx 50 + textaligny 25 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + } + +itemDef { + name headlist + rect 15 100 260 50 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 32 + elementheight 32 + elementtype LISTBOX_IMAGE + feeder FEEDER_HEADS + horizontalscroll + backcolor 0 0 0 1 + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + visible 1 + cvarTest "g_gametype" + showCvar { "3" ; "4" ; "5" ; "6" ; "7" ; "8" } + mouseenter { setitemcolor headlist bordercolor 1 0 0 1 } + mouseexit { setitemcolor headlist bordercolor .5 .5 .5 1 } + } + +itemDef { + name headlist + rect 15 100 260 50 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 32 + elementheight 32 + elementtype LISTBOX_IMAGE + feeder FEEDER_Q3HEADS + horizontalscroll + backcolor 0 0 0 1 + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + visible 1 + cvarTest "g_gametype" + showCvar { "0" ; "1" } + mouseenter { setitemcolor headlist bordercolor 1 0 0 1 } + mouseexit { setitemcolor headlist bordercolor .5 .5 .5 1 } + } + + + + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_scoreffa.menu b/quake3/source/ui/ingame_scoreffa.menu new file mode 100644 index 0000000..426f509 --- /dev/null +++ b/quake3/source/ui/ingame_scoreffa.menu @@ -0,0 +1,452 @@ +#include "ui/menudef.h" + +{ +\\ score_menu \\ + + menuDef { + name "teamscore_menu" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background uibackground4 + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name leftteambar + rect 14 102 306 35 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 1 0 0 1 + visible 1 + decoration +} + +itemDef { + name rightteambar + rect 320 102 306 35 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 1 1 + visible 1 + decoration +} + +itemDef { + name leftteamheadings + text "Status Name Score Time Ping" + textscale .25 + style 0 + rect 25 102 128 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 23 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + +itemDef { + name leftgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradleft.tga" + rect 14 140 306 222 + forecolor .75 0 0 0.5 + visible 1 + decoration +} + +itemDef { + name leftgrad + rect 16 142 302 218 + orecolor .75 .75 .75 .75 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 135 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_REDTEAM_LIST + columns 5 2 20 20 60 75 75 165 20 20 205 20 20 235 20 20 +} + + + +itemDef { + name rightgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradright.tga" + rect 320 140 296 222 + forecolor 0 0 .75 0.5 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 135 + elementheight 20 + textscale .28 + elementtype LISTBOX_TEXT + feeder FEEDER_BLUETEAM_LIST + columns 5 2 20 20 60 75 75 165 20 20 205 20 20 235 20 20 +} + +itemDef { + name rightteamheadings + text "Status Name Score Time Ping" + textscale .25 + style 0 + rect 336 102 128 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 23 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + + + + + + +itemDef { + name window + rect 14 141 612 221 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .75 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + + + +// GAMETYPE BAR // + + +itemDef { + name gametypebar + style 2 + rect 0 16 640 35 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 1 1 1 1 + bordersize 1 + backcolor 0 0 .75 0.5 + visible 1 + decoration +} + + +itemDef { + name score + text " " + ownerdraw CG_GAME_STATUS + textscale .5 + style 0 + rect 320 16 210 25 + textalignx 0 + textaligny 21 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration +} + + +itemDef { + name score + text "" + ownerdraw CG_KILLER + textscale .4 + style 0 + rect 320 40 210 40 + textalignx 0 + textaligny 24 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration +} + + + + +// PLAYER STATS // + +itemDef { + name window + rect 14 364 612 24 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 0 0 0 0 + backcolor 0 0 0 .25 + //outlinecolor 1 1 1 .5 + visible 1 + decoration +} + +itemDef { + name name + text "Name:" + textscale .35 + style 0 + rect 0 363 128 30 + textalign 1 // center + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + +itemDef { + name score + text "Score:" + textscale .35 + style 0 + rect 246 363 128 30 + textalign 3 // center + textalignx 16 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + +itemDef { + name wins + text "Wins:" + textscale .35 + style 0 + rect 404 363 128 30 + textalign 1 // center + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + + +// AWARDS // + + +itemDef { + name window + rect 14 390 612 38 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + +itemdef { + name medal_accuracy + style WINDOW_STYLE_SHADER + rect 48 394 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .25 + visible 1 + decoration +} + +itemdef { + name medal_assist + style WINDOW_STYLE_SHADER + rect 112 394 32 32 + background "ui/assets/medal_assist.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_accuracy + style WINDOW_STYLE_SHADER + rect 176 394 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_defend + style WINDOW_STYLE_SHADER + rect 240 394 32 32 + background "ui/assets/medal_defend.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_excellent + style WINDOW_STYLE_SHADER + rect 304 394 32 32 + background "ui/assets/medal_excellent.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_frags + style WINDOW_STYLE_SHADER + rect 368 394 32 32 + background "ui/assets/medal_frags.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_gauntlet + style WINDOW_STYLE_SHADER + rect 432 394 32 32 + background "ui/assets/medal_gauntlet.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_impressive + style WINDOW_STYLE_SHADER + rect 496 394 32 32 + background "ui/assets/medal_impressive.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + +} + +itemdef { + name medal_victory + style WINDOW_STYLE_SHADER + rect 560 394 32 32 + background "ui/assets/medal_victory.tga" + forecolor 1 1 1 .25 + visible 1 + decoration +} + + + +// TEAM LOGO // + + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO + rect 71 157 180 180 + visible 1 + forecolor .5 0 0 .5 + decoration + } + +itemDef { + ownerdraw UI_OPPONENTLOGO + name opposinglogo + rect 397 157 180 180 + visible 1 + forecolor 0 0 .5 .5 + decoration +} + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO_METAL + rect 14 6 96 96 + visible 1 + forecolor 1 .7 .7 1 + decoration + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + rect 530 6 96 96 + visible 1 + forecolor .7 .7 1 1 + decoration +} + + + + +// TEAM NAME // + +itemDef { + name playerteamname + ownerdraw UI_PLAYERLOGO_NAME + rect 120 54 120 60 + decoration + visible 1 +} + +itemDef { + name opposingteamname + ownerdraw UI_OPPONENTLOGO_NAME + rect 392 54 120 60 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 +} + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_serverinfo.menu b/quake3/source/ui/ingame_serverinfo.menu new file mode 100644 index 0000000..71fdaed --- /dev/null +++ b/quake3/source/ui/ingame_serverinfo.menu @@ -0,0 +1,63 @@ +#include "ui/menudef.h" + +{ +\\ SERVER INFO MENU \\ + +menuDef { + name "ingame_serverinfo" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 352 30 256 300 + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name window + rect 0 0 256 300 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .75 .25 + visible 1 + decoration + } + + +itemDef { + name serverinfo + group serverinfo + rect 0 100 256 256 + text "Server Information" + textalign 1 + textscale .25 + textalignx 128 + textaligny 17 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name ok + text "OK" + textscale .25 + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 275 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 1 + action { close ingame_serverinfo ; close ingame ; open ingame } + } + + + + +} + + +} diff --git a/quake3/source/ui/ingame_system.menu b/quake3/source/ui/ingame_system.menu new file mode 100644 index 0000000..89209be --- /dev/null +++ b/quake3/source/ui/ingame_system.menu @@ -0,0 +1,619 @@ +#include "ui/menudef.h" + +{ +\\ SYSTEM MENU \\ + +menuDef { + name "ingame_system" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 298 30 276 325 + focusColor 1 .75 0 1 + style 1 + border 1 + onopen { hide grpsystem ; show graphics } + +itemDef { + name window + rect 10 15 256 310 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 167 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 213 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 103 0 64 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 264 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 213 264 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 192 16 74 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 261 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 261 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } +itemDef { + name window + rect 261 192 16 74 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 64 320 74 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 138 320 74 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + +itemDef { + name ctr_graphics + text "Graphics" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 30 25 65 20 + textalign 1 + textalignx 32 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpSystem ; show graphics } + mouseEnter { setitemcolor ctr_graphics backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_graphics backcolor .37 .1 .1 1 } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Quality:" + cvar "ui_glCustom" + cvarFloatList { "High Quality" 0 "Normal" 1 "Fast" 2 "Fastest" 3 "Custom" 4 } + rect 0 50 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript update "ui_glCustom" } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_EDITFIELD + text "GL Driver:" + cvar "r_gldriver" + //cvarFloatList { } + rect 0 70 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + decoration + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_YESNO + text "GL Extensions:" + cvar "r_allowExtensions" + rect 0 90 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Video Mode:" + cvar "r_mode" + cvarFloatList { "320x240" 0 "400x300" 1 "512x384" 2 "640x480" 3 "800x600" 4 "960x720" 5 "1024x768" 6 "1152x864" 7 "1280x1024" 8 "1600x1200" 9 "2048x1536" 10 "856x480 wide screen" 11 } + rect 0 110 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Color Depth:" + cvar "r_colorbits" + cvarFloatList { "Default" 0 "16 bit" 16 "32 bit" 32 } + rect 0 130 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom ; uiScript update "r_colorbits" } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_YESNO + text "Fullscreen:" + cvar "r_fullscreen" + rect 0 150 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Lighting:" + cvar "r_vertexlight" + cvarFloatList { "Light Map (high)" 0 "Vertex (low)" 1 } + rect 0 170 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Geometric Detail:" + cvar "r_lodbias" + cvarFloatList { "High" 0 "Medium" 1 "Low" 2 } + rect 0 190 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom ; uiScript update "r_lodbias" } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Texture Detail:" + cvar "r_picmip" + cvarFloatList { "Low" 2 "Normal" 1 "High" 0 } + rect 0 210 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Texture Quality:" + cvar "r_texturebits" + cvarFloatList { "Default" 0 "16 bit" 16 "32 bit" 32 } + rect 0 230 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Texture Filter:" + cvar "r_texturemode" + cvarStrList { "Bilinear", "GL_LINEAR_MIPMAP_NEAREST", "Trilinear", "GL_LINEAR_MIPMAP_LINEAR" } + rect 0 250 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_YESNO + text "Compress Textures:" + cvar "r_ext_compressed_textures " + rect 0 270 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 133 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + +//here + +itemDef { + name ctr_driver + text "Driver Info" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 105 25 65 20 + textalign 1 + textalignx 32 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpSystem ; show driver } + mouseEnter { setitemcolor ctr_driver backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_driver backcolor .37 .1 .1 1 } + } + + + + itemDef { + name driver + group grpSystem + rect 15 55 230 230 + ownerdraw UI_GLINFO + textalign 1 + textscale .15 + textalignx 0 + textaligny 17 + forecolor 1 1 1 1 + visible 0 + decoration + } + +itemDef { + name ctr_other + text "Other" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 180 25 65 20 + textalign 1 + textalignx 32 + textaligny 16 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grpSystem ; show other } + mouseEnter { setitemcolor ctr_other backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ctr_other backcolor .37 .1 .1 1 } + } + + +itemDef { + name other + group grpSystem + style 1 + text "Display" + rect 0 45 128 20 + textalign ITEM_ALIGN_CENTER + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + decoration + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Brightness:" + cvarfloat "r_gamma" 1 .5 2 + rect 0 65 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Screen Size:" + cvarfloat "cg_viewsize" 100 30 100 + //cvarFloatList { } + rect 0 85 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name other + group grpSystem + style 1 + text "Sound" + rect 0 125 128 20 + textalign ITEM_ALIGN_CENTER + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + decoration + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Effects Volume:" + cvarfloat "s_volume" 0.7 0 1 + rect 0 145 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Music Volume:" + cvarfloat "s_musicvolume" 0.25 0 1 + rect 0 165 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_MULTI + text "Sound Quality:" + cvar "s_khz" + cvarFloatList { "22 khz (high)" 22 "11 khz (low)" 11 } + rect 0 185 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_YESNO + text "Doppler Sound:" + cvar "s_doppler" + rect 0 205 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + + +itemDef { + name other + group grpSystem + style 1 + text "Network" + rect 0 245 128 20 + textalign ITEM_ALIGN_CENTER + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + decoration + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_MULTI + text "Net Data Rate:" + cvar "rate" + cvarFloatList { "<=28.8k" 2500 "33.6k" 3000 "56k" 4000 "ISDN" 5000 "LAN/CABLE/xDSl" 25000 } + rect 0 265 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name graphics + text "Apply" + type 1 + textscale .25 + group grpsystem + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 101 295 75 20 + textalign 1 + textalignx 37 + textaligny 15 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 0 + action { exec "vid_restart" } + mouseEnter { setcolor backcolor .1 .37 .1 1 } + mouseExit { setcolor backcolor .37 .1 .1 1 } + } + + +} + + +} diff --git a/quake3/source/ui/ingame_vote.menu b/quake3/source/ui/ingame_vote.menu new file mode 100644 index 0000000..f3ef203 --- /dev/null +++ b/quake3/source/ui/ingame_vote.menu @@ -0,0 +1,141 @@ +#include "ui/menudef.h" + +{ +\\ SERVER INFO MENU \\ + +menuDef { + name "ingame_vote" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 430 30 128 125 + focusColor 1 .75 0 1 + style 1 + border 1 + + itemDef { + name window + rect 10 15 108 110 + style 1 + backcolor 0 .1 0 1 + visible 1 + decoration + } + + + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 30 0 65 16 + style 3 + background "ui/assets/ingameconnection.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 64 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 64 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + + + + itemDef { + name yes + text "Yes" + type 1 + textscale .25 + rect 0 30 128 20 + textalign 1 + textalignx 64 + textaligny 10 + forecolor 1 1 1 1 + visible 1 + action { exec "vote yes" ; uiScript closeingame } + } + + itemDef { + name no + text "No" + type 1 + textscale .25 + rect 0 50 128 20 + textalign 1 + textalignx 64 + textaligny 10 + forecolor 1 1 1 1 + visible 1 + action { exec "vote no" ; uiScript closeingame } + } +itemDef { + name yes + text "TeamYes" + type 1 + ownerdrawflag UI_SHOW_ANYTEAMGAME + textscale .25 + rect 0 70 128 20 + textalign 1 + textalignx 64 + textaligny 10 + forecolor 1 1 1 1 + visible 1 + action { exec "teamvote yes" ; uiScript closeingame } + } + + itemDef { + name no + text "TeamNo" + type 1 + ownerdrawflag UI_SHOW_ANYTEAMGAME + textscale .25 + rect 0 90 128 20 + textalign 1 + textalignx 64 + textaligny 10 + forecolor 1 1 1 1 + visible 1 + action { exec "teamvote no" ; uiScript closeingame } + } + + +} + + + + + +} + + +} diff --git a/quake3/source/ui/ingame_vote2.menu b/quake3/source/ui/ingame_vote2.menu new file mode 100644 index 0000000..a566f6a --- /dev/null +++ b/quake3/source/ui/ingame_vote2.menu @@ -0,0 +1,71 @@ +#include "ui/menudef.h" + +{ +\\ SERVER INFO MENU \\ + +menuDef { + name "ingame_vote" + visible 0 + fullscreen 0 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + rect 387 30 210 64 + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name window + rect 0 0 210 64 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .75 .25 + visible 1 + decoration + } + + +itemDef { + name yes + text "Vote Yes" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 20 20 75 20 + textalign 1 + textalignx 37 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { exec "cmd vote yes" ; close ingame_vote } + } + + +itemDef { + name no + text "Vote No" + type 1 + textscale .25 + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 115 20 75 20 + textalign 1 + textalignx 37 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + action { exec "cmd vote no" ; close ingame_vote } + } +} + + + + + +} + + +} diff --git a/quake3/source/ui/joinserver.menu b/quake3/source/ui/joinserver.menu new file mode 100644 index 0000000..5c6414b --- /dev/null +++ b/quake3/source/ui/joinserver.menu @@ -0,0 +1,1375 @@ +#include "ui/menudef.h" + +{ +\\ Server Join \\ + + menuDef { + name "joinserver" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .75 0 1 + outOfBoundsClick + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + uiScript UpdateFilter ; + hide lightning ; + hide accept_alt ; + show accept ; + hide back_alt ; + show back ; + hide grpmessage } + onEsc { uiScript closeJoin } + + +// top bar // + + + itemDef { + name sourcebar + style 2 + rect 0 20 640 40 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + +// DATE AND MESSAGE OF THE DAY // + +itemDef { + name datewindow + rect 10 365 265 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 0 .15 + visible 1 + } +itemDef { + name messagewindow + rect 275 365 355 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 0 .15 + visible 1 + } + +itemDef { + name refreshdate + ownerdraw UI_SERVERREFRESHDATE + textscale .22 + rect 10 365 265 25 + textalign 0 + textalignx 10 + textaligny 20 + forecolor 1 1 1 1 + visible 1 + decoration + } +itemDef { + name messageoftheday + ownerdraw UI_SERVERMOTD + textscale .3 + rect 280 365 345 25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + +// map selection + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_NETSOURCE + rect 10 20 134 40 + textstyle 6 + textalign ITEM_ALIGN_LEFT + textalignx 2 + textaligny 30 + textscale .32 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { show message_source } + mouseExit { hide message_source } + } + +itemDef { + name gametypefield + style 0 + textstyle 6 + ownerdraw UI_NETFILTER + rect 149 20 181 40 + textalign ITEM_ALIGN_LEFT + textalignx 2 + textaligny 30 + textscale .32 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { show message_gamefilter } + mouseExit { hide message_gamefilter } + } + +itemDef { + name gametypefield + style 0 + textstyle 6 + text "Type:" + ownerdraw UI_JOINGAMETYPE + rect 330 20 160 40 + textalign ITEM_ALIGN_LEFT + textalignx 2 + textaligny 30 + textscale .32 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { show message_typefilter } + mouseExit { hide message_typefilter } + } + +itemDef { + name mappreview + style 0 + ownerdraw UI_NETMAPCINEMATIC + rect 505 5 128 96 + border 1 + bordercolor 0 .5 0 .5 + visible 1 + } + +itemDef { + name mappreview + style WINDOW_STYLE_FILLED + rect 505 5 128 96 + border 1 + bordercolor .5 .5 .5 .5 + visible 1 + } + + + +itemDef { + name horizontoalseparators + rect 10 132 604 20 + style WINDOW_STYLE_FILLED + border 0 + backcolor 0 0 .5 .25 + visible 1 + decoration + } + +itemDef { + name horizontoalseparators + rect 10 172 604 20 + style WINDOW_STYLE_FILLED + border 0 + backcolor 0 0 .5 .25 + visible 1 + decoration + } +itemDef { + name horizontoalseparators + rect 10 212 604 20 + style WINDOW_STYLE_FILLED + border 0 + backcolor 0 0 .5 .25 + visible 1 + decoration + } +itemDef { + name horizontoalseparators + rect 10 252 604 20 + style WINDOW_STYLE_FILLED + border 0 + backcolor 0 0 .5 .25 + visible 1 + decoration + } +itemDef { + name horizontoalseparators + rect 10 292 604 20 + style WINDOW_STYLE_FILLED + border 0 + backcolor 0 0 .5 .25 + visible 1 + decoration + } +itemDef { + name horizontoalseparators + rect 10 332 604 20 + style WINDOW_STYLE_FILLED + border 0 + backcolor 0 0 .5 .25 + visible 1 + decoration + } + +// COLUMNS // + + + +itemDef { + name serverColumn + group grpColumn + rect 10 128 233 235 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } +itemDef { + name mapColumn + group grpColumn + rect 243 128 125 235 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } +itemDef { + name playerColumn + group grpColumn + rect 368 128 60 235 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } +itemDef { + name typeColumn + group grpColumn + rect 428 128 100 235 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } +itemDef { + name pingColumn + group grpColumn + rect 528 128 52 235 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } +itemDef { + name pbColumn + group grpColumn + rect 580 128 32 235 + style WINDOW_STYLE_FILLED + border 1 + backcolor 0 0 0 0 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + + + itemDef { + name serverlist + rect 10 128 620 235 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_SERVERS + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 .7 .25 + outlinecolor 0 1 0 .25 + visible 1 + // numcols [ xpos xwitdth textlen ], [ xpos xwidth textlen ] .. + columns + 6 + 2 40 40 + 243 40 20 + 368 5 10 + 428 20 10 + 528 20 20 + 572 20 10 + mouseenter { setitemcolor serverlist bordercolor .7 0 0 1 } + mouseexit { setitemcolor serverlist bordercolor .5 .5 .5 .5 } + doubleClick { uiScript JoinServer } + } + + + + + +// SORT TABS // + + + itemDef { + name server + group grpTabs + text "Server Name" + type ITEM_TYPE_BUTTON + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/sorttab.tga" + rect 10 103 110 26 + textalign 1 + textalignx 59 // center + textaligny 21 + forecolor 1 1 1 1 + backcolor .1 .1 .37 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript ServerSort 0 ; + setitemcolor grpTabs backcolor .1 .1 .37 1 ; + setitemcolor server backcolor .1 .37 .1 1 ; + setitemcolor grpColumn backcolor 0 0 0 0 ; + setitemcolor serverColumn backcolor 0 1 0 .25 } + mouseEnter { show message_sort ; setitemcolor serverColumn bordercolor 1 0 0 1 } + mouseExit { hide message_sort ; setitemcolor serverColumn bordercolor .5 .5 .5 1 } + } + + + + itemDef { + name map + group grpTabs + type ITEM_TYPE_BUTTON + text "Map Name" + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/sorttab.tga" + rect 243 103 100 26 + textalign 1 + textalignx 50 // center + textaligny 21 + backcolor .1 .1 .37 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript ServerSort 1 ; + setitemcolor grpTabs backcolor .1 .1 .37 1 ; + setitemcolor map backcolor .1 .37 .1 1 ; + setitemcolor grpColumn backcolor 0 0 0 0 ; + setitemcolor mapColumn backcolor 0 1 0 .25 } + mouseEnter { show message_sort ; setitemcolor mapColumn bordercolor 1 0 0 1 } + mouseExit { hide message_sort ; setitemcolor mapColumn bordercolor .5 .5 .5 1 } + } + + + + itemDef { + name Players + group grpTabs + text "#Plyrs" + type ITEM_TYPE_BUTTON + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/sorttab.tga" + rect 368 103 50 26 + textalign 1 + textalignx 25 // center + textaligny 21 + forecolor 1 1 1 1 + backcolor .1 .1 .37 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript ServerSort 2 ; + setitemcolor grpTabs backcolor .1 .1 .37 1 ; + setitemcolor Players backcolor .1 .37 .1 1 ; + setitemcolor grpColumn backcolor 0 0 0 0 ; + setitemcolor playerColumn backcolor 0 1 0 .25 } + mouseEnter { show message_sort ; setitemcolor playerColumn bordercolor 1 0 0 1 } + mouseExit { hide message_sort ; setitemcolor playerColumn bordercolor .5 .5 .5 1 } + } + + +itemDef { + name Type + group grpTabs + text "Type" + textscale .25 + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/sorttab.tga" + rect 428 103 60 26 + textalign 1 + textalignx 30 // center + textaligny 21 + backcolor .1 .1 .37 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript ServerSort 3 ; + setitemcolor grpTabs backcolor .1 .1 .37 1 ; + setitemcolor Type backcolor .1 .37 .1 1 ; + setitemcolor grpColumn backcolor 0 0 0 0 ; + setitemcolor typeColumn backcolor 0 1 0 .25 } + mouseEnter { show message_sort ; setitemcolor typeColumn bordercolor 1 0 0 1 } + mouseExit { hide message_sort ; setitemcolor typeColumn bordercolor .5 .5 .5 1 } + } + + +itemDef { + name Ping + group grpTabs + text "Ping" + type ITEM_TYPE_BUTTON + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/sorttab.tga" + rect 528 103 46 26 + textalign 1 + textalignx 23 // center + textaligny 21 + backcolor .1 .1 .37 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript ServerSort 4 ; + setitemcolor grpTabs backcolor .1 .1 .37 1 ; + setitemcolor Ping backcolor .1 .37 .1 1 ; + setitemcolor grpColumn backcolor 0 0 0 0 ; + setitemcolor pingColumn backcolor 0 1 0 .25 } + mouseEnter { show message_sort ; setitemcolor pingColumn bordercolor 1 0 0 1 } + mouseExit { hide message_sort ; setitemcolor pingColumn bordercolor .5 .5 .5 1 } + } + +itemDef { + name Punkbuster + group grpTabs + text "PB" + type ITEM_TYPE_BUTTON + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/sorttab.tga" + rect 580 103 32 26 + textalign 1 + textalignx 16 // center + textaligny 21 + backcolor .1 .1 .37 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript ServerSort 5 ; + setitemcolor grpTabs backcolor .1 .1 .37 1 ; + setitemcolor Punkbuster backcolor .1 .37 .1 1 ; + setitemcolor grpColumn backcolor 0 0 0 0 ; + setitemcolor pbColumn backcolor 0 1 0 .25 } + mouseEnter { show message_sort ; setitemcolor pbColumn bordercolor 1 0 0 1 } + mouseExit { hide message_sort ; setitemcolor pbColumn bordercolor .5 .5 .5 1 } + } + + + + +// BUTTONS // + +itemDef { + name refreshSource + text "Get New List" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + //background "ui/assets/button_red.tga" + background "ui/assets/button_back.tga" + rect 16 67 105 26 + textalign 1 + textalignx 52 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show message_refreshSOurce ; setitemcolor refreshSource backcolor .1 .37 .1 1 } + mouseExit { hide message_refreshSource ; setitemcolor refreshSource backcolor .37 .1 .1 1 } + action { play "sound/misc/nomenu.wav" ; + uiScript RefreshServers } + } + + + +itemDef { + name refreshSource + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 16 67 105 26 + visible 1 + decoration + } + +itemDef { + name refreshSource + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 4 67 13 26 + visible 1 + decoration + } +itemDef { + name refreshSource + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 120 67 13 26 + visible 1 + decoration + } + +// refresh list -------------------- + +itemDef { + name refreshFilter + text "Refresh List" + textscale .3 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_BUTTON + background "ui/assets/button_back.tga" + rect 149 67 94 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show message_refreshFilter ; setitemcolor refreshFilter backcolor .1 .37 .1 1 } + mouseExit { hide message_refreshFilter ; setitemcolor refreshFilter backcolor .37 .1 .1 1 } + action { play "sound/misc/nomenu.wav" ; + uiScript RefreshFilter } + } + + + +itemDef { + name refreshFilter + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 149 67 94 26 + visible 1 + decoration + } + + +itemDef { + name refreshFilter + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 137 67 13 26 + visible 1 + decoration + } + +itemDef { + name refreshFilter + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 242 67 13 26 + visible 1 + decoration + } + +// filter settings -------------------- + +itemDef { + name viewSettings + text "View Settings" + textscale .3 + style WINDOW_STYLE_FILLED + type ITEM_TYPE_BUTTON + background "ui/assets/button_back.tga" + rect 271 67 94 26 + textalign 1 + textalignx 48 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show message_viewSettings ; setitemcolor viewSettings backcolor .1 .37 .1 1 } + mouseExit { hide message_viewSettings ; setitemcolor viewSettings backcolor .37 .1 .1 1 } + action { play "sound/misc/nomenu.wav" ; + open filter_popmenu } + } + +itemDef { + name viewSettings + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 271 67 94 26 + visible 1 + decoration + } + +itemDef { + name viewSettings + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 259 67 13 26 + visible 1 + decoration + } + +itemDef { + name viewSettings + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 364 67 13 26 + visible 1 + decoration + } + + + + + + + + + +itemDef { + name password + text "Password" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 20 395 92 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + open password_popmenu } + mouseEnter { show message_password ; setitemcolor password backcolor .1 .37 .1 1 } + mouseExit { hide message_password ; setitemcolor password backcolor .37 .1 .1 1 } + } + +itemDef { + name password + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 20 395 92 26 + visible 1 + decoration + } + +itemDef { + name password + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 14 395 7 26 + visible 1 + decoration + } + +itemDef { + name password + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 111 395 7 26 + visible 1 + decoration + } + + +itemDef { + name createFavorite + text "New Favorite" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 148 395 92 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + open createfavorite_popmenu } + mouseEnter { show message_createFavorite ; setitemcolor createFavorite backcolor .1 .37 .1 1 } + mouseExit { hide message_createFavorite ; setitemcolor createFavorite backcolor .37 .1 .1 1 } + } +itemDef { + name createFavorite + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 148 395 92 26 + visible 1 + decoration + } + +itemDef { + name createFavorite + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 142 395 7 26 + visible 1 + decoration + } + +itemDef { + name createFavorite + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 239 395 7 26 + visible 1 + decoration + } + + + + + +itemDef { + name addFavorite + text "Add Favorite" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + ownerdrawFlag UI_SHOW_NOTFAVORITESERVERS + rect 276 395 92 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript addFavorite } + mouseEnter { show message_addFavorite ; setitemcolor addFavorite backcolor .1 .37 .1 1 } + mouseExit { hide message_addFavorite ; setitemcolor addFavorite backcolor .37 .1 .1 1 } + } + + +itemDef { + name addFavorite + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 276 395 92 26 + visible 1 + decoration + } + +itemDef { + name addFavorite + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 270 395 7 26 + visible 1 + decoration + } + +itemDef { + name addFavorite + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 367 395 7 26 + visible 1 + decoration + } + + +itemDef { + name delfavorite + text "Del. Favorite" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + ownerdrawFlag UI_SHOW_FAVORITESERVERS + background "ui/assets/button_back.tga" + rect 276 395 92 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript DeleteFavorite ; uiScript UpdateFilter } + mouseEnter { show message_delFavorite ; setitemcolor delfavorite backcolor .1 .37 .1 1 } + mouseExit { hide message_delFavorite ; setitemcolor delfavorite backcolor .37 .1 .1 1 } + } +itemDef { + name delfavorite + style WINDOW_STYLE_SHADER + ownerdrawFlag UI_SHOW_FAVORITESERVERS + background "ui/assets/framebutton.tga" + rect 276 395 92 26 + visible 1 + decoration + } + +itemDef { + name delfavorite + style WINDOW_STYLE_SHADER + ownerdrawFlag UI_SHOW_FAVORITESERVERS + background "ui/assets/leftbutton.tga" + rect 270 395 7 26 + visible 1 + decoration + } + +itemDef { + name delfavorite + style WINDOW_STYLE_SHADER + ownerdrawFlag UI_SHOW_FAVORITESERVERS + background "ui/assets/rightbutton.tga" + rect 367 395 7 26 + visible 1 + decoration + } + + + + + +itemDef { + name serverinfo + text "Server Info" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 404 395 92 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + open serverinfo_popmenu } + mouseEnter { show message_serverinfo ; setitemcolor serverinfo backcolor .1 .37 .1 1 } + mouseExit { hide message_serverinfo ; setitemcolor serverinfo backcolor .37 .1 .1 1 } + } +itemDef { + name serverinfo + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 404 395 92 26 + visible 1 + decoration + } + +itemDef { + name serverinfo + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 398 395 7 26 + visible 1 + decoration + } + +itemDef { + name serverinfo + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 495 395 7 26 + visible 1 + decoration + } + +itemDef { + name findplayer + text "Find Friend" + type ITEM_TYPE_BUTTON + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 532 395 92 26 + textalign 1 + textalignx 46 // center + textaligny 20 + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + open findplayer_popmenu } + mouseEnter { show message_findplayer ; setitemcolor findplayer backcolor .1 .37 .1 1 } + mouseExit { hide message_findplayer ; setitemcolor findplayer backcolor .37 .1 .1 1 } + } +itemDef { + name serverinfo + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 532 395 92 26 + visible 1 + decoration + } + +itemDef { + name serverinfo + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 526 395 7 26 + visible 1 + decoration + } + +itemDef { + name serverinfo + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 623 395 7 26 + visible 1 + decoration + } + +// PunkBuster // + + +itemDef { + name PunkBusterInfo + group pbgrp + text "PunkBuster" + type ITEM_TYPE_BUTTON + textscale .25 + style WINDOW_STYLE_FILLED + rect 392 71 140 15 + textalign 1 + textalignx 28 // center + textaligny 11 + forecolor 1 1 1 1 + visible 1 + action { + play "sound/misc/kcaction.wav" ; + conditionalopen cl_punkbuster pbdisable_popmenu pbenable_popmenu + } +} + +itemDef { + name pbstatus + group pbgrp + type ITEM_TYPE_MULTI + text "" + cvar "cl_punkbuster" + cvarFloatList { "Off" 0 "On" 1 } + rect 437 71 100 15 + textalign ITEM_ALIGN_CENTER + textalignx 21 + textaligny 13 + textscale .25 + forecolor 1 1 1 1 + style WINDOW_STYLE_FILLED + backcolor 0 0 0 0 + visible 1 + decoration + } + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close joinserver ; open main } + mouseEnter { hide back ; show back_alt ; show message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; hide message_back } + action { close joinserver ; open main } + } + + + + + itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show lightning ; hide accept ; show accept_alt ; show message_accept ; playlooped "sound/misc/loop_electricity_05.wav" } + action { uiScript JoinServer } + } + + itemDef { + name accept_alt + style WINDOW_STYLE_SHADER + rect 572 422 54 54 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + type ITEM_TYPE_BUTTON + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide lightning ; hide accept_alt ; show accept ; hide message_accept ; playlooped "music/fla_mp03.wav" } + action { uiScript JoinServer } + + } + + itemDef { + name lightning + style 3 + background lightningkc + rect 46 385 246 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 345 385 246 128 + visible 0 + decoration + } + + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textalignx 0 + textstyle 1 + textaligny 25 + textscale .416 + text "Join Arena" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_source + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Set Source" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_gamefilter + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Set to Filter for Specific Game Mods" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_typefilter + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Set to Filter for Specific Game Types" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_sort + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Sort Column" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_refreshSource + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Get Updated Server List from Current Source" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_refreshFilter + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Refresh All Currently Filtered Servers" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_addFavorite + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Add Selected Server to Favorites" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_delFavorite + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Delete Selected Server from Favorites" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_createFavorite + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Enter IP Address of Favorite Server" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_addfilter + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Enter Four Letter Filter and Description" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_password + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Enter Password for Protected Servers" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_serverinfo + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Display Server Information" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_findplayer + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Search Current Server List for Friends" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_punkbuster + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Enable or Disable PunkBuster client" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_viewSettings + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Configure Server Filtering" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + +} + + +} + + diff --git a/quake3/source/ui/main.menu b/quake3/source/ui/main.menu new file mode 100644 index 0000000..1eeb588 --- /dev/null +++ b/quake3/source/ui/main.menu @@ -0,0 +1,559 @@ +#include "ui/menudef.h" + +{ + assetGlobalDef { + font "fonts/font" 16 // font + smallFont "fonts/smallfont" 12 // font + bigFont "fonts/bigfont" 20 // font + cursor "ui/assets/3_cursor3" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + itemFocusSound "sound/misc/menu2.wav" // sound for item getting focus (via keyboard or mouse ) + + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowColor 0.1 0.1 0.1 0.25 // shadow color + } + + + + + +menuDef { + name "main" + background "menuback_a" // Spinning Circle Background + fullScreen MENU_TRUE + rect 0 0 640 480 // Size and position of the menu + visible MENU_TRUE // Visible on open + focusColor 1 .75 0 1 // Menu focus color for text and items + + + onOpen { + setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/sonic1.wav" ; + fadeout fadebox ; + transition cinematic 390 198 250 1 390 163 250 155 20 12 ; + transition menuback_d 0 198 250 1 0 163 255 155 20 12 ; + transition menuback_b 0 198 640 1 0 163 640 155 20 12 ; + transition teamArenaBar 80 55 520 1 80 40 520 30 20 10 ; + transition singlebar 0 95 640 1 0 80 640 30 20 10 ; + transition optionbar 0 375 640 1 0 360 640 30 20 10 ; + transition quitbar 0 419 640 1 0 404 640 30 20 10 ; + play "sound/misc/tim_pump.wav" ; + uiScript stopRefresh ; + } + + onESC { open quit_popmenu } + + + +itemDef { + name modelselection //Precache player model + ownerdraw UI_PLAYERMODEL //Ownerdraw for player models + rect 0 0 0 0 + style 1 + decoration + visible 1 + } + + +itemDef { + name menuback_e // Flashing and rotating light + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + background "menuback_e" + visible 1 + decoration + } + + + +itemDef { + name menuback_b // Transparent Blue Effect + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + visible 1 + background "menuback_b" + bordercolor 0.5 0.5 0.5 .7 + decoration + } + + + + + +itemDef { + name cinematic + style 5 // Style for cinematic + cinematic "mpintro.roq" + rect 390 163 250 155 + backcolor 1 1 1 .25 + decoration + visible 1 + } + + + + +itemDef { + name menuback_d // Team arena text + style WINDOW_STYLE_SHADER + rect 0 163 255 155 + background "menuback_d" + visible 1 + decoration + } + +itemDef { + name windowscreen // Vertical Line Image + rect 0 0 640 240 + style 3 + background levelshotdetail + forecolor 0 0 0 0 + visible 1 + decoration + } +itemDef { + name windowscreen // Vertical Line Image + rect 0 240 640 240 + style 3 + background levelshotdetail + forecolor 0 0 0 0 + visible 1 + decoration + } + + +itemDef { + name menuback_c // Center medal image + style WINDOW_STYLE_SHADER + rect 205 123 235 235 + background "menuback_c" + visible 1 + decoration + } + + + + + + + + +// GAMETYPE // + +itemDef { + name teamArenaBar + style 2 + rect 80 40 520 30 + backcolor 0 0 .75 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + mouseEnter { hide gametype ; show teamarena ; setcolor backcolor .75 0 0 .25 } + mouseExit { show gametype ; hide teamarena ; setcolor backcolor 0 0 .75 .25 } + decoration + } + + + +itemDef { + name gametype + type 1 + text "TEAM ARENA" + style 0 + textstyle 6 + rect 0 40 640 30 + forecolor 1 1 1 1 + textalignx 320 + textaligny 24 + textalign 1 + textscale .416 + visible 1 + } + + + + + +itemDef { + name teamarena + type 1 + text "Quake3" + style 0 + textstyle 6 + rect 120 40 80 30 + textscale .333 + textalign 1 + textalignx 40 + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + open quake3_popmenu } +} + +itemDef { + name teamarena + text "Rules" + type 1 + style 0 + textstyle 6 + rect 200 40 80 30 + textscale .333 + textalignx 40 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open help_menu } + } + +itemDef { + name teamarena + text "Credits" + type 1 + textstyle 6 + textscale .333 + style 0 + rect 280 40 80 30 + textalignx 40 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open credit } + } + + +itemDef { + name teamarena + text "Mods" + type 1 + style 0 + textstyle 6 + textscale .333 + rect 360 40 80 30 + textalignx 40 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open mod } + } +itemDef { + name teamarena + text "Cinematics" + type 1 + style 0 + textstyle 6 + textscale .333 + rect 440 40 80 30 + textalignx 40 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open cinematicMenu } + } + + + + + + +// SINGLEPLAYER // + +itemDef { + name singlebar + style 2 + rect 0 80 640 30 + backcolor 0 0 .75 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .25 ; hide play ; show playselection } + mouseExit { setcolor backcolor 0 0 .75 .25 ; show play ; hide playselection } + decoration + } + + +itemDef { + name play + text "PLAY" + type 1 + style 0 + textstyle 6 + rect 0 80 640 30 + textalign 1 + textscale .416 + textalignx 320 + textaligny 24 + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name playselection + text "SinglePlayer" + type 1 + textstyle 6 + rect 170 80 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open Skirmish } + } + + +itemDef { + name playselection + text "MultiPlayer" + type 1 + style 0 + textstyle 6 + rect 270 80 100 30 + textalign 1 // center + textalignx 50 + textaligny 22 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open joinserver } + } + + + +itemDef { + name playselection + text "StartServer" + type 1 + style 0 + textstyle 6 + rect 370 80 100 30 + textalign 1 // center + textalignx 50 + textaligny 22 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open createserver } + } + + + +// OPTIONS // +itemDef { + name optionbar + style 2 + rect 0 360 640 30 + backcolor 0 0 1 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .25 ; hide options ; show optionselection } + mouseExit { setcolor backcolor 0 0 .75 .25 ; show options ; hide optionselection } + decoration + } + + +itemDef { + name options + text "OPTIONS" + style 0 + type 1 + textstyle 6 + rect 0 360 640 30 + textalignx 320 + textaligny 24 + textscale .416 + textalign 1 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name optionselection + text "Player" + style 0 + type 1 + textstyle 6 + rect 170 360 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open player_menu } + } + + +itemDef { + name optionselection + text "Setup" + type 1 + style 0 + textstyle 6 + rect 270 360 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open setup_menu ; + open control_menu } + } + +itemDef { + name optionselection + text "Demos" + type 1 + style 0 + textstyle 6 + rect 370 360 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + action { play "sound/misc/kcaction.wav" ; + close main ; + open demo } + } + + + +// QUIT // + +itemDef { + name quitbar + style 2 + rect 0 404 640 30 + backcolor 0 0 1 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + decoration + } + + + +itemDef { + name quit + text "QUIT" + style 0 + type 1 + textstyle 6 + rect 0 404 640 30 + textalignx 320 + textaligny 24 + textscale .416 + textalign 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + open quit_popmenu } + mouseEnter { setitemcolor quitbar backcolor .75 0 0 .25 } + mouseExit { setitemcolor quitbar backcolor 0 0 .75 .25 } + } + +/* + +// DEMO ONLY OPTION // + +itemDef { + name copyright + // demo_only + text "Demo Version Only. Content Warning: Contains Depictions of Violence." + style 0 + textscale .25 + rect 0 425 640 40 + textalign 1 + textaligny 32 + textalignx 320 + forecolor 1 .75 0 1 + visible 1 + decoration + } +*/ + + + +itemDef { + name copyright + text "Quake III: Team Arena Copyright 2000 Id Software, Inc. All rights reserved" + style 0 + textscale .25 + rect 0 440 640 40 + textalign 1 + textaligny 32 + textalignx 320 + forecolor .75 0 0 .75 + visible 1 + decoration + } + +itemDef { + name fadebox // Box for fading in menus + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + + + +} +} +} + + } + + + + } + +} \ No newline at end of file diff --git a/quake3/source/ui/main2.menu b/quake3/source/ui/main2.menu new file mode 100644 index 0000000..953e74a --- /dev/null +++ b/quake3/source/ui/main2.menu @@ -0,0 +1,686 @@ +#include "ui/menudef.h" + +{ + assetGlobalDef { + font "fonts/impact.ttf" 16 // font + smallFont "fonts/impact.ttf" 12 // font + bigFont "fonts/impact.ttf" 20 // font + cursor "menu/art/3_cursor3" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + //menuEnterSound "sound/misc/menu1.wav" // sound for menu loading + //menuExitSound "sound/misc/menu3.wav" // sound for menu exiting + itemFocusSound "sound/misc/menu2.wav" // sound for item getting focus (via keyboard or mouse ) + //menuBuzzSound "sound/misc/menu4.wav" // sound for menu buzzing + + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + //shadowX 5 // x amount for shadow offset + //shadowY 5 // y amount for shadow offset + shadowColor 0.1 0.1 0.1 0.25 // shadow color + } + + + + + +menuDef { + name "main" + background "menuback_a" + fullScreen MENU_TRUE + rect 0 0 640 480 + visible MENU_TRUE + focusColor 1 .75 0 1 + soundLoop "music/fla_mp03.wav" + onESC { open quit_popmenu } + + + + + +itemDef { + name menuback_e + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + background "menuback_e" + visible 1 + decoration + } + + + +itemDef { + name menuback_b + style WINDOW_STYLE_SHADER + rect 0 163 640 155 + visible 1 + background "menuback_b" + bordercolor 0.5 0.5 0.5 .7 + decoration + } + + + + + +itemDef { + name cinematic + style 5 + cinematic "mpintro.roq" + rect 390 163 250 155 + backcolor 1 1 1 .25 + decoration + visible 1 + } + + + + +itemDef { + name menuback_d + style WINDOW_STYLE_SHADER + rect 0 163 255 155 + background "menuback_d" + visible 1 + decoration + } + + +itemDef { + name menuback_c + style WINDOW_STYLE_SHADER + rect 205 123 235 235 + background "menuback_c" + visible 1 + decoration + } + +itemDef { + name selection + style WINDOW_STYLE_SHADER + rect 205 123 235 235 + background "ui/assets/mainpop.tga" + forecolor 1 1 1 .75 + visible 0 + decoration + } + +itemDef { + name selection + rect 252 170 144 144 + style 3 + background "centerconsole2" + visible 0 + decoration + } + + + + + + + +// GAMETYPE // + +itemDef { + name gametypebar + style 2 + rect 80 40 520 30 + backcolor 0 0 .75 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + mouseEnter { hide gametype ; show teamarena ; setcolor backcolor .75 0 0 .25 ; show selection } + mouseExit { show gametype ; hide teamarena ; setcolor backcolor 0 0 .75 .25 ; hide selection ; hide grpMessage } + decoration + } + + + +itemDef { + name gametype + type 1 + text "TEAM ARENA" + style 0 + textstyle 6 + rect 0 40 640 30 + forecolor 1 1 1 1 + textalignx 320 + textaligny 23 + textalign 1 + textscale .416 + visible 1 + } + +itemDef { + name teamarena + type 1 + text "Quake3" + style 0 + textstyle 6 + rect 200 40 60 30 + textscale .333 + textalign 1 + textalignx 30 + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_quake } + mouseexit { fadeout message_quake } + action { open quake3_popmenu } +} + +itemDef { + name teamarena + text "Rules" + type 1 + style 0 + textstyle 6 + rect 260 40 60 30 + textscale .333 + textalignx 30 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_help } + mouseexit { fadeout message_help } + action { close main ; open help_menu } + } + +itemDef { + name teamarena + text "Credits" + type 1 + textstyle 6 + textscale .333 + style 0 + rect 320 40 60 30 + textalignx 30 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_credits } + mouseexit { fadeout message_credits } + action { close main ; open credit } + } + + +itemDef { + name teamarena + text "Mods" + type 1 + style 0 + textstyle 6 + textscale .333 + rect 380 40 60 30 + textalignx 30 + textaligny 22 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_mods } + mouseexit { fadeout message_mods } + action { close main ; open mod } + } + + + + + + +// SINGLEPLAYER // + +itemDef { + name singlebar + style 2 + rect 0 80 640 30 + backcolor 0 0 .75 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .25 ; hide play ; show playselection ; show selection } + mouseExit { setcolor backcolor 0 0 .75 .25 ; show play ; hide playselection ; hide selection ; hide grpMessage } + decoration + } + + +itemDef { + name play + text "PLAY" + type 1 + style 0 + textstyle 6 + rect 0 80 640 30 + textalign 1 + textscale .416 + textalignx 320 + textaligny 23 + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name playselection + text "SinglePlayer" + type 1 + textstyle 6 + rect 170 80 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_singleplayer } + mouseexit { fadeout message_singleplayer } + action { close main ; open Skirmish } + } + + +itemDef { + name playselection + text "MultiPlayer" + type 1 + style 0 + textstyle 6 + rect 270 80 100 30 + textalign 1 // center + textalignx 50 + textaligny 22 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_multiplayer } + mouseexit { fadeout message_multiplayer } + action { close main ; open joinserver } + } + + + +itemDef { + name playselection + text "StartServer" + type 1 + style 0 + textstyle 6 + rect 370 80 100 30 + textalign 1 // center + textalignx 50 + textaligny 22 + textscale .333 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_startserver } + mouseexit { fadeout message_startserver } + action { close main ; open createserver } + } + + + +// OPTIONS // +itemDef { + name optionbar + style 2 + rect 0 360 640 30 + backcolor 0 0 1 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .25 ; hide options ; show optionselection ; show selection } + mouseExit { setcolor backcolor 0 0 .75 .25 ; show options ; hide optionselection ; hide selection ; hide grpMessage } + decoration + } + + +itemDef { + name options + text "OPTIONS" + style 0 + type 1 + textstyle 6 + rect 0 360 640 30 + textalignx 320 + textaligny 23 + textscale .416 + textalign 1 + forecolor 1 1 1 1 + visible 1 + mouseenter { fadein message_options } + mouseexit { fadeout message_options } + } + +itemDef { + name optionselection + text "Player" + style 0 + type 1 + textstyle 6 + rect 170 360 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_player } + mouseexit { fadeout message_player } + action { close main ; open player_menu } + } + + +itemDef { + name optionselection + text "Setup" + type 1 + style 0 + textstyle 6 + rect 270 360 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_setup } + mouseexit { fadeout message_setup } + action { close main ; open setup_menu ; open control_menu } + } + +itemDef { + name optionselection + text "Demos" + type 1 + style 0 + textstyle 6 + rect 370 360 100 30 + textalignx 50 + textaligny 22 + textscale .333 + textalign 1 + forecolor 1 1 1 1 + visible 0 + mouseenter { fadein message_demos } + mouseexit { fadeout message_demos } + action { close main ; open demo } + } + +// QUIT // + +itemDef { + name quitbar + style 2 + rect 0 404 640 30 + backcolor 0 0 1 .25 + border 4 + bordercolor 0.5 0.5 0.5 1 + bordersize 1 + visible 1 + decoration + } + + + +itemDef { + name quit + text "QUIT" + style 0 + type 1 + textstyle 6 + rect 0 404 640 30 + textalignx 320 + textaligny 23 + textscale .416 + textalign 1 + forecolor 1 1 1 1 + visible 1 + action { open quit_popmenu } + mouseEnter { setitemcolor quitbar backcolor .75 0 0 .25 ; show selection ; show message_quit } + mouseExit { setitemcolor quitbar backcolor 0 0 .75 .25 ; hide selection ; fadeout message_quit ; hide grpMessage } + } + + + +itemDef { + name copyright + text "Quake III Copyright 2000 id software, inc. All rights reserved" + style 0 + textscale .25 + rect 0 440 640 40 + textalign 1 + textaligny 32 + textalignx 320 + forecolor .75 0 0 .75 + visible 1 + decoration + } + +// MESSAGES // + +itemDef { + name message_quake + group grpMessage + style 0 + rect 265 210 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text "Play the Original \r" + "Quake III Game." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_help + group grpMessage + style 0 + rect 261 195 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Rules for \r" + "New Gametytpes,\r" + " Powerups, and\r" + " Team Orders." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_credits + group grpMessage + style 0 + rect 272 220 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " About Us." + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_mods + group grpMessage + style 0 + rect 256 210 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Modifications of\r" + "Quake III by other \r" + " Developers." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_singleplayer + group grpMessage + style 0 + rect 260 205 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Challenge Your\r" + "Skills Against the\r" + " Computer." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_multiplayer + group grpMessage + style 0 + rect 265 205 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text "Join other Team \r" + "Arena Games on\r" + " LAN or Internet." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_startserver + group grpMessage + style 0 + rect 272 205 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Start a Game\r" + " Server for\r" + "Others to Join." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_player + group grpMessage + style 0 + rect 275 205 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Select Your\r" + "Player Model\r" + " and Clan." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_setup + group grpMessage + style 0 + rect 257 205 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Set Controls,\r" + "Game Options, and \r" + " System Settings." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_demos + group grpMessage + style 0 + rect 258 210 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " View Recorded\r" + "Team Arena Game." + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_quit + group grpMessage + style 0 + rect 258 225 235 20 + textalign 0 + textstyle 1 + textalignx 0 + textaligny 25 + wrapped + textscale .333 + text " Get to Work!" + forecolor 1 1 1 1 + decoration + visible 0 + } + + + + + + } + +} + + + + +} +} +} + + } + + + + } + +} \ No newline at end of file diff --git a/quake3/source/ui/menudef.h b/quake3/source/ui/menudef.h new file mode 100644 index 0000000..bfa918a --- /dev/null +++ b/quake3/source/ui/menudef.h @@ -0,0 +1,343 @@ + +#define ITEM_TYPE_TEXT 0 // simple text +#define ITEM_TYPE_BUTTON 1 // button, basically text with a border +#define ITEM_TYPE_RADIOBUTTON 2 // toggle button, may be grouped +#define ITEM_TYPE_CHECKBOX 3 // check box +#define ITEM_TYPE_EDITFIELD 4 // editable text, associated with a cvar +#define ITEM_TYPE_COMBO 5 // drop down list +#define ITEM_TYPE_LISTBOX 6 // scrollable list +#define ITEM_TYPE_MODEL 7 // model +#define ITEM_TYPE_OWNERDRAW 8 // owner draw, name specs what it is +#define ITEM_TYPE_NUMERICFIELD 9 // editable text, associated with a cvar +#define ITEM_TYPE_SLIDER 10 // mouse speed, volume, etc. +#define ITEM_TYPE_YESNO 11 // yes no cvar setting +#define ITEM_TYPE_MULTI 12 // multiple list setting, enumerated +#define ITEM_TYPE_BIND 13 // multiple list setting, enumerated + +#define ITEM_ALIGN_LEFT 0 // left alignment +#define ITEM_ALIGN_CENTER 1 // center alignment +#define ITEM_ALIGN_RIGHT 2 // right alignment + +#define ITEM_TEXTSTYLE_NORMAL 0 // normal text +#define ITEM_TEXTSTYLE_BLINK 1 // fast blinking +#define ITEM_TEXTSTYLE_PULSE 2 // slow pulsing +#define ITEM_TEXTSTYLE_SHADOWED 3 // drop shadow ( need a color for this ) +#define ITEM_TEXTSTYLE_OUTLINED 4 // drop shadow ( need a color for this ) +#define ITEM_TEXTSTYLE_OUTLINESHADOWED 5 // drop shadow ( need a color for this ) +#define ITEM_TEXTSTYLE_SHADOWEDMORE 6 // drop shadow ( need a color for this ) + +#define WINDOW_BORDER_NONE 0 // no border +#define WINDOW_BORDER_FULL 1 // full border based on border color ( single pixel ) +#define WINDOW_BORDER_HORZ 2 // horizontal borders only +#define WINDOW_BORDER_VERT 3 // vertical borders only +#define WINDOW_BORDER_KCGRADIENT 4 // horizontal border using the gradient bars + +#define WINDOW_STYLE_EMPTY 0 // no background +#define WINDOW_STYLE_FILLED 1 // filled with background color +#define WINDOW_STYLE_GRADIENT 2 // gradient bar based on background color +#define WINDOW_STYLE_SHADER 3 // gradient bar based on background color +#define WINDOW_STYLE_TEAMCOLOR 4 // team color +#define WINDOW_STYLE_CINEMATIC 5 // cinematic + +#define MENU_TRUE 1 // uh.. true +#define MENU_FALSE 0 // and false + +#define HUD_VERTICAL 0x00 +#define HUD_HORIZONTAL 0x01 + +// list box element types +#define LISTBOX_TEXT 0x00 +#define LISTBOX_IMAGE 0x01 + +// list feeders +#define FEEDER_HEADS 0x00 // model heads +#define FEEDER_MAPS 0x01 // text maps based on game type +#define FEEDER_SERVERS 0x02 // servers +#define FEEDER_CLANS 0x03 // clan names +#define FEEDER_ALLMAPS 0x04 // all maps available, in graphic format +#define FEEDER_REDTEAM_LIST 0x05 // red team members +#define FEEDER_BLUETEAM_LIST 0x06 // blue team members +#define FEEDER_PLAYER_LIST 0x07 // players +#define FEEDER_TEAM_LIST 0x08 // team members for team voting +#define FEEDER_MODS 0x09 // team members for team voting +#define FEEDER_DEMOS 0x0a // team members for team voting +#define FEEDER_SCOREBOARD 0x0b // team members for team voting +#define FEEDER_Q3HEADS 0x0c // model heads +#define FEEDER_SERVERSTATUS 0x0d // server status +#define FEEDER_FINDPLAYER 0x0e // find player +#define FEEDER_CINEMATICS 0x0f // cinematics + +// display flags +#define CG_SHOW_BLUE_TEAM_HAS_REDFLAG 0x00000001 +#define CG_SHOW_RED_TEAM_HAS_BLUEFLAG 0x00000002 +#define CG_SHOW_ANYTEAMGAME 0x00000004 +#define CG_SHOW_HARVESTER 0x00000008 +#define CG_SHOW_ONEFLAG 0x00000010 +#define CG_SHOW_CTF 0x00000020 +#define CG_SHOW_OBELISK 0x00000040 +#define CG_SHOW_HEALTHCRITICAL 0x00000080 +#define CG_SHOW_SINGLEPLAYER 0x00000100 +#define CG_SHOW_TOURNAMENT 0x00000200 +#define CG_SHOW_DURINGINCOMINGVOICE 0x00000400 +#define CG_SHOW_IF_PLAYER_HAS_FLAG 0x00000800 +#define CG_SHOW_LANPLAYONLY 0x00001000 +#define CG_SHOW_MINED 0x00002000 +#define CG_SHOW_HEALTHOK 0x00004000 +#define CG_SHOW_TEAMINFO 0x00008000 +#define CG_SHOW_NOTEAMINFO 0x00010000 +#define CG_SHOW_OTHERTEAMHASFLAG 0x00020000 +#define CG_SHOW_YOURTEAMHASENEMYFLAG 0x00040000 +#define CG_SHOW_ANYNONTEAMGAME 0x00080000 +#define CG_SHOW_2DONLY 0x10000000 + + +#define UI_SHOW_LEADER 0x00000001 +#define UI_SHOW_NOTLEADER 0x00000002 +#define UI_SHOW_FAVORITESERVERS 0x00000004 +#define UI_SHOW_ANYNONTEAMGAME 0x00000008 +#define UI_SHOW_ANYTEAMGAME 0x00000010 +#define UI_SHOW_NEWHIGHSCORE 0x00000020 +#define UI_SHOW_DEMOAVAILABLE 0x00000040 +#define UI_SHOW_NEWBESTTIME 0x00000080 +#define UI_SHOW_FFA 0x00000100 +#define UI_SHOW_NOTFFA 0x00000200 +#define UI_SHOW_NETANYNONTEAMGAME 0x00000400 +#define UI_SHOW_NETANYTEAMGAME 0x00000800 +#define UI_SHOW_NOTFAVORITESERVERS 0x00001000 + + + + +// owner draw types +// ideally these should be done outside of this file but +// this makes it much easier for the macro expansion to +// convert them for the designers ( from the .menu files ) +#define CG_OWNERDRAW_BASE 1 +#define CG_PLAYER_ARMOR_ICON 1 +#define CG_PLAYER_ARMOR_VALUE 2 +#define CG_PLAYER_HEAD 3 +#define CG_PLAYER_HEALTH 4 +#define CG_PLAYER_AMMO_ICON 5 +#define CG_PLAYER_AMMO_VALUE 6 +#define CG_SELECTEDPLAYER_HEAD 7 +#define CG_SELECTEDPLAYER_NAME 8 +#define CG_SELECTEDPLAYER_LOCATION 9 +#define CG_SELECTEDPLAYER_STATUS 10 +#define CG_SELECTEDPLAYER_WEAPON 11 +#define CG_SELECTEDPLAYER_POWERUP 12 + +#define CG_FLAGCARRIER_HEAD 13 +#define CG_FLAGCARRIER_NAME 14 +#define CG_FLAGCARRIER_LOCATION 15 +#define CG_FLAGCARRIER_STATUS 16 +#define CG_FLAGCARRIER_WEAPON 17 +#define CG_FLAGCARRIER_POWERUP 18 + +#define CG_PLAYER_ITEM 19 +#define CG_PLAYER_SCORE 20 + +#define CG_BLUE_FLAGHEAD 21 +#define CG_BLUE_FLAGSTATUS 22 +#define CG_BLUE_FLAGNAME 23 +#define CG_RED_FLAGHEAD 24 +#define CG_RED_FLAGSTATUS 25 +#define CG_RED_FLAGNAME 26 + +#define CG_BLUE_SCORE 27 +#define CG_RED_SCORE 28 +#define CG_RED_NAME 29 +#define CG_BLUE_NAME 30 +#define CG_HARVESTER_SKULLS 31 // only shows in harvester +#define CG_ONEFLAG_STATUS 32 // only shows in one flag +#define CG_PLAYER_LOCATION 33 +#define CG_TEAM_COLOR 34 +#define CG_CTF_POWERUP 35 + +#define CG_AREA_POWERUP 36 +#define CG_AREA_LAGOMETER 37 // painted with old system +#define CG_PLAYER_HASFLAG 38 +#define CG_GAME_TYPE 39 // not done + +#define CG_SELECTEDPLAYER_ARMOR 40 +#define CG_SELECTEDPLAYER_HEALTH 41 +#define CG_PLAYER_STATUS 42 +#define CG_FRAGGED_MSG 43 // painted with old system +#define CG_PROXMINED_MSG 44 // painted with old system +#define CG_AREA_FPSINFO 45 // painted with old system +#define CG_AREA_SYSTEMCHAT 46 // painted with old system +#define CG_AREA_TEAMCHAT 47 // painted with old system +#define CG_AREA_CHAT 48 // painted with old system +#define CG_GAME_STATUS 49 +#define CG_KILLER 50 +#define CG_PLAYER_ARMOR_ICON2D 51 +#define CG_PLAYER_AMMO_ICON2D 52 +#define CG_ACCURACY 53 +#define CG_ASSISTS 54 +#define CG_DEFEND 55 +#define CG_EXCELLENT 56 +#define CG_IMPRESSIVE 57 +#define CG_PERFECT 58 +#define CG_GAUNTLET 59 +#define CG_SPECTATORS 60 +#define CG_TEAMINFO 61 +#define CG_VOICE_HEAD 62 +#define CG_VOICE_NAME 63 +#define CG_PLAYER_HASFLAG2D 64 +#define CG_HARVESTER_SKULLS2D 65 // only shows in harvester +#define CG_CAPFRAGLIMIT 66 +#define CG_1STPLACE 67 +#define CG_2NDPLACE 68 +#define CG_CAPTURES 69 + +//PKMOD - Ergodic 04/22/02 - add PKA User Interface functions +#define UI_UPDATEPREVIEW 150 +#define UI_MAPNAMETITLE 151 +//PKMOD - Ergodic 04/24/02 - add PKA User Interface functions +#define UI_BOTHEAD0 152 +#define UI_BOTHEAD1 153 +#define UI_BOTHEAD2 154 +#define UI_BOTHEAD3 155 +#define UI_BOTHEAD4 156 +#define UI_BOTHEAD5 157 +#define UI_BOTHEAD6 158 +#define UI_BOTHEAD7 159 +//PKMOD - Ergodic 04/26/02 - add PKA User Interface functions +#define UI_MAPFRAGLIMIT 160 +#define UI_MAPTIMELIMIT 161 +#define UI_BOTTEXT0 162 +#define UI_BOTTEXT1 163 +#define UI_BOTTEXT2 164 +#define UI_BOTTEXT3 165 +#define UI_BOTTEXT4 166 +#define UI_BOTTEXT5 167 +#define UI_BOTTEXT6 168 +#define UI_BOTTEXT7 169 +//PKMOD - Ergodic 05/04/02 - add PKA User Interface functions +#define UI_MAPNAMETITLENET 170 +//PKMOD - Ergodic 11/08/02 - Draw botname that is selected for removal +#define UI_BOTNAME2REMOVE 171 +//PKMOD - Ergodic 11/27/02 - display of the map levelshot after game completes +#define UI_MAPPOSTVIEW 172 +//PKMOD - Ergodic 11/30/02 - Add functionality to assign and display headmodels +#define FEEDER_Q3HEADMODELS 173 +//PKMOD - Ergodic 12/06/02 - Add functionality to select and play music in the UI menu +#define FEEDER_MUSIC 174 +//PKMOD - Ergodic 09/11/03 - Add functionality for Server Hosted maps to be referenced +// in the HUB +#define FEEDER_HUBALTS 175 +//PKMOD - Ergodic 12/22/03 - Add functionality to set private bot skill in the UI +#define UI_PRIVATEBOTSKILL 176 +//PKMOD - Ergodic 12/23/03 - Add functionality to set HUB Alternate maps in the UI +#define UI_HUBALT1 177 +#define UI_HUBALT2 178 +#define UI_HUBALT3 179 +#define UI_HUBALT4 180 +//PKMOD - Ergodic 12/24/03 - display of the Hub Alt map levelshot +#define UI_HUBALTPREVIEW1 181 +#define UI_HUBALTPREVIEW2 182 +#define UI_HUBALTPREVIEW3 183 +#define UI_HUBALTPREVIEW4 184 +//PKMOD - Ergodic 02/08/04 - add horizontal meters for ammo +#define CG_PLAYER_AMMO_METER_HR2L 185 //Meter: Horizontal Right to Left fill +#define CG_PLAYER_AMMO_METER_HL2R 186 //Meter: Horizontal Left to Right fill +//PKMOD - Ergodic 02/08/04 - add horizontal meters for armor +#define CG_PLAYER_ARMOR_METER_HR2L 187 //Meter: Horizontal Right to Left fill +#define CG_PLAYER_ARMOR_METER_HL2R 188 //Meter: Horizontal Left to Right fill +//PKMOD - Ergodic 02/08/04 - add relative score value to the HUD's gauges +#define CG_PLAYER_RELATIVE_SCORE 189 +//PKMOD - Ergodic 02/28/04 - add ownerdrawn filed for painkiller medal award +#define CG_PAINKILLER 190 + +#define UI_OWNERDRAW_BASE 200 +#define UI_HANDICAP 200 +#define UI_EFFECTS 201 +#define UI_PLAYERMODEL 202 +#define UI_CLANNAME 203 +#define UI_CLANLOGO 204 +#define UI_GAMETYPE 205 +#define UI_MAPPREVIEW 206 +#define UI_SKILL 207 +#define UI_BLUETEAMNAME 208 +#define UI_REDTEAMNAME 209 +#define UI_BLUETEAM1 210 +#define UI_BLUETEAM2 211 +#define UI_BLUETEAM3 212 +#define UI_BLUETEAM4 213 +#define UI_BLUETEAM5 214 +#define UI_REDTEAM1 215 +#define UI_REDTEAM2 216 +#define UI_REDTEAM3 217 +#define UI_REDTEAM4 218 +#define UI_REDTEAM5 219 +#define UI_NETSOURCE 220 +#define UI_NETMAPPREVIEW 221 +#define UI_NETFILTER 222 +#define UI_TIER 223 +#define UI_OPPONENTMODEL 224 +#define UI_TIERMAP1 225 +#define UI_TIERMAP2 226 +#define UI_TIERMAP3 227 +#define UI_PLAYERLOGO 228 +#define UI_OPPONENTLOGO 229 +#define UI_PLAYERLOGO_METAL 230 +#define UI_OPPONENTLOGO_METAL 231 +#define UI_PLAYERLOGO_NAME 232 +#define UI_OPPONENTLOGO_NAME 233 +#define UI_TIER_MAPNAME 234 +#define UI_TIER_GAMETYPE 235 +#define UI_ALLMAPS_SELECTION 236 +#define UI_OPPONENT_NAME 237 +#define UI_VOTE_KICK 238 +#define UI_BOTNAME 239 +#define UI_BOTSKILL 240 +#define UI_REDBLUE 241 +#define UI_CROSSHAIR 242 +#define UI_SELECTEDPLAYER 243 +#define UI_MAPCINEMATIC 244 +#define UI_NETGAMETYPE 245 +#define UI_NETMAPCINEMATIC 246 +#define UI_SERVERREFRESHDATE 247 +#define UI_SERVERMOTD 248 +#define UI_GLINFO 249 +#define UI_KEYBINDSTATUS 250 +#define UI_CLANCINEMATIC 251 +#define UI_MAP_TIMETOBEAT 252 +#define UI_JOINGAMETYPE 253 +#define UI_PREVIEWCINEMATIC 254 +#define UI_STARTMAPCINEMATIC 255 +#define UI_MAPS_SELECTION 256 + +#define VOICECHAT_GETFLAG "getflag" // command someone to get the flag +#define VOICECHAT_OFFENSE "offense" // command someone to go on offense +#define VOICECHAT_DEFEND "defend" // command someone to go on defense +#define VOICECHAT_DEFENDFLAG "defendflag" // command someone to defend the flag +#define VOICECHAT_PATROL "patrol" // command someone to go on patrol (roam) +#define VOICECHAT_CAMP "camp" // command someone to camp (we don't have sounds for this one) +#define VOICECHAT_FOLLOWME "followme" // command someone to follow you +#define VOICECHAT_RETURNFLAG "returnflag" // command someone to return our flag +#define VOICECHAT_FOLLOWFLAGCARRIER "followflagcarrier" // command someone to follow the flag carrier +#define VOICECHAT_YES "yes" // yes, affirmative, etc. +#define VOICECHAT_NO "no" // no, negative, etc. +#define VOICECHAT_ONGETFLAG "ongetflag" // I'm getting the flag +#define VOICECHAT_ONOFFENSE "onoffense" // I'm on offense +#define VOICECHAT_ONDEFENSE "ondefense" // I'm on defense +#define VOICECHAT_ONPATROL "onpatrol" // I'm on patrol (roaming) +#define VOICECHAT_ONCAMPING "oncamp" // I'm camping somewhere +#define VOICECHAT_ONFOLLOW "onfollow" // I'm following +#define VOICECHAT_ONFOLLOWCARRIER "onfollowcarrier" // I'm following the flag carrier +#define VOICECHAT_ONRETURNFLAG "onreturnflag" // I'm returning our flag +#define VOICECHAT_INPOSITION "inposition" // I'm in position +#define VOICECHAT_IHAVEFLAG "ihaveflag" // I have the flag +#define VOICECHAT_BASEATTACK "baseattack" // the base is under attack +#define VOICECHAT_ENEMYHASFLAG "enemyhasflag" // the enemy has our flag (CTF) +#define VOICECHAT_STARTLEADER "startleader" // I'm the leader +#define VOICECHAT_STOPLEADER "stopleader" // I resign leadership +#define VOICECHAT_TRASH "trash" // lots of trash talk +#define VOICECHAT_WHOISLEADER "whoisleader" // who is the team leader +#define VOICECHAT_WANTONDEFENSE "wantondefense" // I want to be on defense +#define VOICECHAT_WANTONOFFENSE "wantonoffense" // I want to be on offense +#define VOICECHAT_KILLINSULT "kill_insult" // I just killed you +#define VOICECHAT_TAUNT "taunt" // I want to taunt you +#define VOICECHAT_DEATHINSULT "death_insult" // you just killed me +#define VOICECHAT_KILLGAUNTLET "kill_gauntlet" // I just killed you with the gauntlet +#define VOICECHAT_PRAISE "praise" // you did something good diff --git a/quake3/source/ui/menus.txt b/quake3/source/ui/menus.txt new file mode 100644 index 0000000..e4bcdc3 --- /dev/null +++ b/quake3/source/ui/menus.txt @@ -0,0 +1,39 @@ +// menu defs +// +{ + loadMenu { "ui/main.menu" } + loadMenu { "ui/joinserver.menu" } + loadMenu { "ui/filter.menu" } + loadMenu { "ui/punkbuster.menu" } + loadMenu { "ui/player.menu" } + loadMenu { "ui/setup.menu" } + loadMenu { "ui/fight.menu" } + loadMenu { "ui/skirmish.menu" } + loadMenu { "ui/createserver.menu" } + loadMenu { "ui/controls.menu" } + loadMenu { "ui/cdkey.menu" } + loadMenu { "ui/system.menu" } + loadMenu { "ui/options.menu" } + loadMenu { "ui/help.menu" } + loadMenu { "ui/ordershelp.menu" } + loadMenu { "ui/mod.menu" } + loadMenu { "ui/demo.menu" } + loadMenu { "ui/cinematicmenu.menu" } + loadMenu { "ui/credit.menu" } + loadMenu { "ui/demo_quit.menu" } + loadMenu { "ui/connect.menu" } + loadMenu { "ui/powerup.menu" } + loadMenu { "ui/password.menu" } + loadMenu { "ui/quake3.menu" } + loadMenu { "ui/quit.menu" } + loadMenu { "ui/vid_restart.menu" } + loadMenu { "ui/default.menu" } + loadMenu { "ui/addfilter.menu" } + loadMenu { "ui/error.menu" } + loadMenu { "ui/serverinfo.menu" } + loadMenu { "ui/findplayer.menu" } + loadMenu { "ui/endofgame.menu" } + loadMenu { "ui/quitcredit.menu" } + loadMenu { "ui/resetscore.menu" } + loadMenu { "ui/createfavorite.menu" } +} diff --git a/quake3/source/ui/min_hud.menu b/quake3/source/ui/min_hud.menu new file mode 100644 index 0000000..02e619c --- /dev/null +++ b/quake3/source/ui/min_hud.menu @@ -0,0 +1,674 @@ +#include "ui/menudef.h" + +// team menu +// +// defines from ui_shared.h + +{ + assetGlobalDef { + cursor "ui/assets/3_cursor2" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowX 5 // x amount for shadow offset + shadowY 5 // y amount for shadow offset + shadowColor 0.1 0.1 0.1 0.25 // shadow color + + font "fonts/impact.ttf" 16 // font + smallFont "fonts/impact.ttf" 12 // font + bigFont "fonts/impact.ttf" 20 // font + + + } + + + + + + +// SELECTED PLAYER // + +menuDef { + name "SelectedPlayer" + fullScreen MENU_FALSE + visible 1 + rect 0 390 222 64 + ownerdrawflag CG_SHOW_ANYTEAMGAME + + + itemDef { + name "b" + rect 0 0 222 64 + style 4 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + ownerdrawflag CG_SHOW_TEAMINFO + } + itemDef { + name "b" + rect 0 40 222 24 + style 4 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + ownerdrawflag CG_SHOW_NOTEAMINFO + } + + + itemDef { + name "b" + rect 0 4 221 64 + visible 1 + textscale .2 + textaligny 10 + textalignx 0 + forecolor 1 1 1 1 + ownerdrawflag CG_SHOW_TEAMINFO + ownerdraw CG_TEAMINFO + } + + + itemDef { + name "b" + rect 2 41 20 20 + visible 1 + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_HEAD + } +itemDef { + name "b" + rect 21 44 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_STATUS + } + + + itemDef { + name "b" + rect 41 43 35 15 + textscale 0.2125 + textstyle 3 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_NAME + } + +/* +itemDef { + name "b" + rect 90 43 45 15 + textscale 0.2125 + textstyle 3 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdrawflag CG_SHOW_NOTEAMINFO + ownerdraw CG_SELECTEDPLAYER_LOCATION + } + +*/ + + + } + + +// PLAYER STATUS // + +menuDef { + name "playerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 142 455 80 24 + + itemDef { + name "playerRect" + rect 1 1 78 22 + style 3 + background hudalert_good + visible 1 + ownerdrawflag CG_SHOW_IF_PLAYER_HAS_FLAG + } + + itemDef { + name "playerStatusRect" + style 4 + rect 0 0 80 24 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + } + + + itemDef { + name "playeritem" + rect 5 4 16 16 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + itemDef { + name "CTFPOWERUP" + rect 25 4 16 16 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + } + + itemDef { + name "flag" + rect 45 4 16 16 + visible 1 + decoration + ownerdraw CG_PLAYER_HASFLAG2D + ownerdrawflag CG_SHOW_IF_PLAYER_HAS_FLAG + + } + + itemDef { + name "skulls" + rect 39 -14 40 32 + textaligny 4 + textalignx 0 + visible 1 + textscale .25 + decoration + textstyle 3 + ownerdraw CG_HARVESTER_SKULLS2D + } + + } + +// POWERUP AREA // + +menuDef { + name "powerup area" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 0 455 141 24 + + +itemDef { + name "powerRect" + visible 1 + style 4 + rect 0 0 35 24 + } +itemDef { + name "powerRect" + visible 1 + style 4 + rect 70 0 35 24 + } + +itemDef { + name "powerRect" + visible 1 + style 4 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + rect 0 0 141 24 + } + + + + itemDef { + name "powerupArea" + rect 2 3 18 18 + textscale .25 + visible 1 + decoration + ownerdraw CG_AREA_POWERUP + special 18 // spacing + align HUD_HORIZONTAL + } + + +} + + + +// AMMO // + +menuDef { + name "Ammo" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 223 455 64 24 + + + itemDef { + name "ammoRect" + visible 1 + style 4 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + rect 0 0 64 24 + } + + + itemDef { + name "a" + rect 30 1 24 19 + visible 1 + textstyle 3 + decoration + textscale .333 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 1 .75 0 1 + } + + itemDef { + name "a" + rect 5 2 20 20 + visible 1 + decoration + ownerdraw CG_PLAYER_AMMO_ICON2D + } + + } + + + + + + +// PLAYER // + +menuDef { + name "Player" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 288 455 64 24 + + itemDef { + name "playerRect" + rect 1 1 62 23 + style 3 + background hudalert + visible 1 + ownerdrawflag CG_SHOW_HEALTHCRITICAL + } + + itemDef { + name "playerRect" + rect 0 0 64 24 + style 4 + visible 1 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + } + + + itemDef { + name "healthok" + rect 30 1 24 19 + visible 1 + textstyle 3 + decoration + forecolor 1 1 1 1 + textscale .333 + ownerdraw CG_PLAYER_HEALTH + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } + + itemDef { + name "b" + rect 2 1 22 22 + visible 1 + decoration + ownerdraw CG_PLAYER_HEAD + } + } + + + + + + + +// ARMOR // + +menuDef { + name "Armor" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 353 455 64 24 + + + itemDef { + name "armorRect" + rect 0 0 64 24 + visible 1 + style 4 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + } + + itemDef { + name "armor" + rect 5 -8 20 20 + visible 1 + decoration + ownerdraw CG_PLAYER_ARMOR_ICON2D + } + + itemDef { + name "armor2" + textstyle 3 + rect 30 1 24 19 + visible 1 + decoration + textscale .333 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 .67 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 .75 .75 .75 1 + } + } + + + + + + +// TEAMSCORE // + +menuDef { + name "teamScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 418 455 150 24 + ownerdrawflag CG_SHOW_ANYTEAMGAME + + itemDef { + name "teamRect" + rect 53 1 47 22 + style 3 + background hudalert_blue + visible 1 + ownerdrawflag CG_SHOW_BLUE_TEAM_HAS_REDFLAG + } + +itemDef { + name "teamRect" + rect 100 1 50 22 + style 3 + background hudalert_red + visible 1 + ownerdrawflag CG_SHOW_RED_TEAM_HAS_BLUEFLAG + } + + itemDef { + name "teamScoreRect" + visible 1 + rect 0 0 150 24 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + style 4 + } + + itemDef { + name "f" + rect 55 5 16 16 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/bluechip.tga" + } +itemDef { + name "f" + rect 55 5 16 16 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + ownerdrawflag CG_SHOW_HARVESTER + background "icons/skull_blue.tga" + } + + itemDef { + name "blueflag" + rect 55 5 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_CTF + ownerdraw CG_BLUE_FLAGSTATUS + } +itemDef { + name "playerScore" + rect 5 18 40 12 + visible 1 + textstyle 3 + decoration + forecolor 1 1 1 1 + textscale .25 + text "" + ownerdraw CG_CAPFRAGLIMIT + } + +itemDef { + name "oneflagstatus" + rect 34 5 16 16 + visible 1 + decoration + ownerdraw CG_ONEFLAG_STATUS + } + + itemDef { + name "r" + rect 71 6 18 12 + textstyle 3 + visible 1 + decoration + forecolor .25 .25 1 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + + itemDef { + name "f" + rect 110 5 16 16 + visible 1 + bordercolor 1 1 1 1 + decoration + style 3 + background "ui/assets/redchip.tga" + } + + itemDef { + name "f" + rect 110 5 16 16 + visible 1 + bordercolor 1 1 1 1 + decoration + style 3 + ownerdrawflag CG_SHOW_HARVESTER + background "icons/skull_red.tga" + } + + itemDef { + name "f" + rect 110 5 16 16 + visible 1 + decoration + ownerdrawflag CG_SHOW_CTF + ownerdraw CG_RED_FLAGSTATUS + } + + + itemDef { + name "r" + rect 126 6 18 12 + textstyle 3 + visible 1 + decoration + forecolor 1 0 0 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + } + +// TEAMSCORE // + +menuDef { + name "teamScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 418 455 150 24 + ownerdrawflag CG_SHOW_ANYNONTEAMGAME + + + itemDef { + name "teamScoreRect" + visible 1 + rect 0 0 150 24 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + style 4 + } + + + itemDef { + name "playerScore" + rect 8 18 40 0 + visible 1 + textstyle 3 + decoration + forecolor 1 1 1 1 + textscale .25 + text "" + ownerdraw CG_CAPFRAGLIMIT + } + + + + + itemDef { + name "r" + rect 40 18 18 12 + textstyle 3 + text "1st:" + visible 1 + decoration + forecolor .25 .25 1 1 + textscale 0.25 + ownerdraw CG_1STPLACE + } + + + itemDef { + name "r" + rect 105 18 18 12 + textstyle 3 + text "2nd:" + visible 1 + decoration + forecolor 1 0 0 1 + textscale 0.25 + ownerdraw CG_2NDPLACE + } + } + +// PLAYERSCORE // + +menuDef { + name "playerScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 569 455 70 24 + + itemDef { + name "playerScoreRect" + visible 1 + rect 0 0 70 24 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + style 4 + } + + + itemDef { + name "playerScore" + rect 4 6 75 12 + textstyle 3 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .25 + ownerdraw CG_PLAYER_SCORE + } + +} + + + + + + + + + menuDef { + name "voiceMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 5 100 100 + + + itemDef { + name "voiceMenuRect" + style 4 + rect 2 2 50 50 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + } + + itemDef { + name "b" + rect 2 2 50 50 + visible 1 + decoration + ownerdraw CG_VOICE_HEAD + } + + + itemDef { + name "b" + rect 2 55 50 12 + visible 1 + decoration + textscale .25 + textalign 0 + textalignx 0 + textaligny 12 + ownerdraw CG_VOICE_NAME + } + + + } + + diff --git a/quake3/source/ui/mod.menu b/quake3/source/ui/mod.menu new file mode 100644 index 0000000..a184bc7 --- /dev/null +++ b/quake3/source/ui/mod.menu @@ -0,0 +1,303 @@ +#include "ui/menudef.h" + +{ +\\ MOD \\ + + menuDef { + name "mod" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .67 0 1 + style 1 + border 1 + onEsc { close mod ; open main } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + uiScript loadMods ; + hide lightning ; + hide accept_alt ; + show accept ; + hide back_alt ; + show back ; + hide grpmessage } + + + + + + + +// LEVEL SELECTION BAR // + + + itemDef { + name levelbar + text "TEAM ARENA MODS" + textstyle 6 + style 2 + rect 0 16 640 40 + textscale 0.416 + textalign 1 // center + textalignx 320 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 27 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + decoration + } + + itemDef { + name teamarenaimage + style 3 + background "ui/assets/teamarenaimage.tga" + rect 0 80 220 115 + visible 1 + } + + +itemDef { + name mappreview + style 5 + cinematic "mpintro.roq" + rect 20 195 200 150 + backcolor 1 1 1 .25 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + decoration + visible 1 + } +/* + +// DEMO ONLY // +itemDef { + name demo_only + style 0 + rect 240 250 360 20 + textstyle 1 + textalign 1 + textalignx 180 + textaligny 25 + textscale .333 + text "This Option is Not Available in Demo." + forecolor 1 1 1 1 + decoration + visible 1 + } + +*/ + + + +itemDef { + name modlist + rect 240 100 360 300 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_MODS + textalign 3 + textaligny 14 + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 .5 .25 + outlinecolor .1 .1 .7 .5 + visible 1 + doubleClick { uiScript RunMod } + mouseEnter { fadein message_mod ; setitemcolor modlist bordercolor .7 0 0 1 } + mouseExit { fadeout message_mod ; setitemcolor modlist bordercolor .5 .5 .5 .5 } + } + + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close mod ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close mod ; open main } + } + + + + + +itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show lightning ; hide accept ; show accept_alt ; show message_accept ; playlooped "sound/misc/loop_electricity_05.wav" } + action { close mod ; uiScript RunMod } + } + +itemDef { + name accept_alt + style 3 + rect 572 422 54 54 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { close mod ; uiScript RunMod } + mouseExit { hide lightning ; hide accept_alt ; show accept ; hide message_accept ; playlooped "music/fla_mp03.wav" } + } + + + itemDef { + name lightning + style 3 + background lightningkc + rect 46 385 250 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 341 385 250 128 + visible 0 + decoration + } + + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Play Mod" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_mod + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select Mod Name to Play" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + + +} + + + + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/newleague.menu b/quake3/source/ui/newleague.menu new file mode 100644 index 0000000..1351389 --- /dev/null +++ b/quake3/source/ui/newleague.menu @@ -0,0 +1,67 @@ +#include "ui/menudef.h" + +{ +\\ NEW LEAGUE POPUP MENU \\ + +menuDef { + name "newleague_popmenu" + visible 0 + fullscreen 0 + rect 190 200 255 75 + outOfBoundsClick // this closes the window if it gets a click out of the rectangle + focusColor 1 .75 0 1 + style 1 + border 1 + +itemDef { + name window + rect 0 0 255 75 + style 1 + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 .5 1 + visible 1 + decoration + } + + + // ENTER NEW LEAGUE NAME // + + +itemDef { + name newleague + group grpsettings + text "Name:" + style 0 + textscale .3 + ITEM_TYPE_EDITFIELD + rect 20 20 110 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name type + text "OK" + textscale .25 + group grpsettings + style WINDOW_STYLE_SHADER + background "ui/assets/button_red.tga" + rect 103 50 50 20 + textalign 1 + textalignx 25 + textaligny 15 + forecolor 1 1 1 1 + visible 1 + action { close newLeague_popmenu ; close createserver ; open createserver } +} + + +} + + + +} diff --git a/quake3/source/ui/options.menu b/quake3/source/ui/options.menu new file mode 100644 index 0000000..f618836 --- /dev/null +++ b/quake3/source/ui/options.menu @@ -0,0 +1,351 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "options_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox } + onEsc { close options_menu ; close setup_menu ; open main } + + + + +itemDef { + name window + group grpControlbutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + + + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Simple Items:" + cvar "cg_simpleItems" + rect 99 15 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Marks On Walls:" + cvar "cg_marks" + rect 99 35 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Show Floating Scores:" + cvar "cg_scorePlums" + rect 99 55 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + text "Ejecting Brass:" + type ITEM_TYPE_MULTI + cvar "cg_brassTime" + cvarFloatList { "High" 2500 "Med" 1250 "Off" 0 } + rect 99 75 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Dynamic Lights:" + cvar "r_dynamiclight" + rect 99 95 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Identify Target:" + cvar "cg_drawCrosshairNames" + rect 99 115 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Draw Gun:" + cvar "cg_drawGun" + rect 99 135 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Low Quality Sky:" + cvar "r_fastsky" + rect 99 155 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Sync Every Frame:" + cvar "weapon 5" + rect 99 175 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Force Player Models:" + cvar "cg_forceModel" + rect 99 195 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Draw Team Overlay:" + cvar "cg_drawTeamOverlay" + rect 99 215 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Auto Download:" + cvar "cl_allowDownload" + rect 99 235 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Show Time:" + cvar "cg_drawTimer" + rect 99 255 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Voices Off:" + cvar "cg_NoVoiceChats" + rect 99 275 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Taunts Off:" + cvar "cg_noTaunt" + rect 99 295 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Voice Text Off:" + cvar "cg_noVoiceText" + rect 99 315 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "Team Chats Only:" + cvar "cg_teamChatsOnly" + rect 99 335 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type ITEM_TYPE_YESNO + text "In Game Video:" + cvar "r_inGameVideo" + rect 99 355 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name options + group grpOptions + type ITEM_TYPE_MULTI + text "Statusbar:" + cvar "cg_hudfiles" + cvarStrList { Normal "ui/hud.txt" Small "ui/hud2.txt" } + rect 99 375 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name options + group grpOptions + text "Crosshair:" + rect 227 395 20 20 + ownerdraw UI_CROSSHAIR + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + +} diff --git a/quake3/source/ui/ordershelp.menu b/quake3/source/ui/ordershelp.menu new file mode 100644 index 0000000..8e074ee --- /dev/null +++ b/quake3/source/ui/ordershelp.menu @@ -0,0 +1,1020 @@ +#include "ui/menudef.h" + +{ +\\ ordersHelp \\ + + menuDef { + name "ordersHelp_menu" + visible 0 + fullscreen 0 + rect 0 90 640 340 + focusColor 1 .67 0 1 + border 1 + style 1 + soundLoop "music/fla_mp03.wav" + onEsc { close help_menu ; close powerup_menu ; close ordersHelp_menu ; open main } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + hide grphelptext ; + show helptext ; + hide grpIconAlt ; + hide grpVoiceHead } + + + +// ORDERS ICONS // + + +itemDef { + name helpIcon + style WINDOW_STYLE_SHADER + rect 37 2 32 32 + visible 1 + background "ui/assets/help.tga" + decoration + } + +itemDef { + name attackIcon + style WINDOW_STYLE_SHADER + rect 113 2 32 32 + visible 1 + background "ui/assets/assault.tga" + decoration + } + +itemDef { + name campIcon + style WINDOW_STYLE_SHADER + rect 189 2 32 32 + visible 1 + background "ui/assets/camp.tga" + decoration + } + + +itemDef { + name defendIcon + style WINDOW_STYLE_SHADER + rect 265 2 32 32 + visible 1 + background "ui/assets/defend.tga" + decoration + } + + +itemDef { + name followIcon + style WINDOW_STYLE_SHADER + rect 341 2 32 32 + visible 1 + background "ui/assets/follow.tga" + decoration + } + + +itemDef { + name patrolIcon + style WINDOW_STYLE_SHADER + rect 415 2 32 32 + visible 1 + background "ui/assets/patrol.tga" + decoration + } + +itemDef { + name retrieveIcon + style WINDOW_STYLE_SHADER + rect 489 2 32 32 + visible 1 + background "ui/assets/retrieve.tga" + decoration + } + +itemDef { + name escortIcon + style WINDOW_STYLE_SHADER + rect 563 2 32 32 + visible 1 + background "ui/assets/escort.tga" + decoration + } + + + +// ORDERS ICONS ALT // + + +itemDef { + name helpIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 35 0 34 34 + visible 1 + background "ui/assets/help.tga" + decoration + } + +itemDef { + name attackIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 111 0 34 34 + visible 1 + background "ui/assets/assault.tga" + decoration + } + +itemDef { + name campIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 187 0 34 34 + visible 1 + background "ui/assets/camp.tga" + decoration + } + + +itemDef { + name defendIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 263 0 34 34 + visible 1 + background "ui/assets/defend.tga" + decoration + } + + +itemDef { + name followIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 339 0 34 34 + visible 1 + background "ui/assets/follow.tga" + decoration + } + + +itemDef { + name patrolIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 413 0 34 34 + visible 1 + background "ui/assets/patrol.tga" + decoration + } + +itemDef { + name retrieveIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 487 0 34 34 + visible 1 + background "ui/assets/retrieve.tga" + decoration + } + +itemDef { + name escortIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 561 0 34 34 + visible 1 + background "ui/assets/escort.tga" + decoration + } + + + +// Leader // + + + + +itemDef { + name Help + rect 28 37 50 26 + type 1 + text "Help" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show helptext ; play "sound/misc/kcaction.wav" } + mouseEnter { setitemcolor help backcolor .1 .37 .1 1 ; hide helpIcon ; show helpIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor help backcolor .37 .1 .1 1 ; hide helpIconAlt ; show helpIcon } + } +itemDef { + name help + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 28 37 50 26 + visible 1 + decoration + } + +itemDef { + name help + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 22 37 7 26 + visible 1 + decoration + } + +itemDef { + name help + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 77 37 7 26 + visible 1 + decoration + } + + + + +// Attack // + + + +itemDef { + name attack + style 0 + rect 104 37 50 26 + text "Attack" + style WINDOW_STYLE_FILLED + type 1 + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show attacktext ; exec "play sound/voices/male1/or_03.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor attack backcolor .1 .37 .1 1 ; hide attackIcon ; show attackIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor attack backcolor .37 .1 .1 1 ; hide attackIconAlt ; show attackIcon } + } +itemDef { + name attack + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 104 37 50 26 + visible 1 + decoration + } + +itemDef { + name attack + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 98 37 7 26 + visible 1 + decoration + } + +itemDef { + name attack + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 153 37 7 26 + visible 1 + decoration + } + + + +// CAMP // + + + +itemDef { + name camp + style 0 + rect 180 37 50 26 + type 1 + text "Camp" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show camptext ; exec "play sound/voices/male1/voc_01.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor camp backcolor .1 .37 .1 1 ; hide campIcon ; show campIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor camp backcolor .37 .1 .1 1 ; hide campIconAlt ; show campIcon } + } +itemDef { + name camp + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 180 37 50 26 + visible 1 + decoration + } + +itemDef { + name camp + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 174 37 7 26 + visible 1 + decoration + } + +itemDef { + name camp + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 229 37 7 26 + visible 1 + decoration + } + + + +// DEFEND // + + + +itemDef { + name defend + style 0 + rect 256 37 50 26 + type 1 + text "Defend" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show defendtext ; exec "play sound/voices/male1/or_05.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor defend backcolor .1 .37 .1 1 ; hide defendIcon ; show defendIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor defend backcolor .37 .1 .1 1 ; hide defendIconAlt ; show defendIcon } + } +itemDef { + name defend + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 256 37 50 26 + visible 1 + decoration + } + +itemDef { + name defend + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 250 37 7 26 + visible 1 + decoration + } + +itemDef { + name defend + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 305 37 7 26 + visible 1 + decoration + } + + + +// FOLLOW // + + + +itemDef { + name follow + type 1 + rect 332 37 50 26 + text "Follow" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show followtext ; exec "play sound/voices/male1/or_11.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor follow backcolor .1 .37 .1 1 ; hide followIcon ; show followIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor follow backcolor .37 .1 .1 1 ; hide followIconAlt ; show followIcon } + } + +itemDef { + name follow + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 332 37 50 26 + visible 1 + decoration + } + +itemDef { + name follow + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 326 37 7 26 + visible 1 + decoration + } + +itemDef { + name follow + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 381 37 7 26 + visible 1 + decoration + } + + + + +// PATROL // + + +itemDef { + name patrol + rect 406 37 50 26 + type 1 + text "Patrol" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show patroltext ; exec "play sound/voices/male1/or_10.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor patrol backcolor .1 .37 .1 1 ; hide patrolIcon ; show patrolIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor patrol backcolor .37 .1 .1 1 ; hide patrolIconAlt ; show patrolIcon } + } +itemDef { + name patrol + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 406 37 50 26 + visible 1 + decoration + } + +itemDef { + name patrol + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 400 37 7 26 + visible 1 + decoration + } + +itemDef { + name patrol + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 455 37 7 26 + visible 1 + decoration + } + + + +// RETRIEVE // + + + +itemDef { + name retrieve + rect 480 37 50 26 + type 1 + text "Retrieve" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show retrievetext ; exec "play sound/voices/male1/voc_05.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor retrieve backcolor .1 .37 .1 1 ; hide retrieveIcon ; show retrieveIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor retrieve backcolor .37 .1 .1 1 ; hide retrieveIconAlt ; show retrieveIcon } + } +itemDef { + name retrieve + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 480 37 50 26 + visible 1 + decoration + } + +itemDef { + name retrieve + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 474 37 7 26 + visible 1 + decoration + } + +itemDef { + name retrieve + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 529 37 7 26 + visible 1 + decoration + } + +// ESCORT // + + + +itemDef { + name escort + rect 554 37 50 26 + type 1 + text "Escort" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 25 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show escorttext ; exec "play sound/voices/male1/voc_11.wav" ; show grpVoiceHead } + mouseEnter { setitemcolor escort backcolor .1 .37 .1 1 ; hide escortIcon ; show escortIconAlt ; hide grpVoiceHead } + mouseExit { setitemcolor escort backcolor .37 .1 .1 1 ; hide escortIconAlt ; show escortIcon } + } +itemDef { + name escort + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 554 37 50 26 + visible 1 + decoration + } + +itemDef { + name escort + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 548 37 7 26 + visible 1 + decoration + } + +itemDef { + name escort + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 603 37 7 26 + visible 1 + decoration + } + +// VOICE HEAD // + + + + + itemDef { + name "b" + group grpVoiceHead + rect 40 102 50 50 + visible 1 + style WINDOW_STYLE_SHADER + background "ui/assets/head5.tga" + decoration + } + + itemDef { + name "b" + group grpVoiceHead + rect 40 102 50 50 + style WINDOW_STYLE_SHADER + background "menuscreen2" + visible 1 + decoration + } + + itemDef { + name "voiceWindow" + group grpVoiceHead + visible 1 + style 3 + background "ui/assets/voice_window.tga" + rect 38 100 54 54 + } + + + + +// TEXT MESSAGES // + + +// LEADER // + +itemDef { + name helptext + group grphelptext + style 0 + wrapped + text "Help" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name helptext + group grphelptext + style 0 + wrapped + text "Only Leaders can give orders to someone else on the team. \r" + "Any player can change their own status. Orders are given through \r" + "the ingame Orders menu or the HUD system using the Next Team Member \r" + "and Next Orders commands. If you receive an order, you can either \r" + "Confirm or Deny that order. You must have keys bound to those two \r" + "commands. If you confirm the order, your status will automatically \r" + "update to reflect your new status." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + + +// Attack // + +itemDef { + name attacktext + group grphelptext + style 0 + wrapped + text "Attack" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name attacktext + group grphelptext + style 0 + wrapped + text "Command your team member to assault the enemy and the enemy Base.\r" + "In Capture the Flag and One Flag CTF, it orders the team member to get the \r" + "opposing team's flag (CTF), or the white flag (One Flag CTF)." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + + + + +// CAMP // + + +itemDef { + name camptext + group grphelptext + style 0 + wrapped + text "Camp" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name camptext + group grphelptext + style 0 + wrapped + text "Command your team member to stay at YOUR current location." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + + +// Defend // + +itemDef { + name defendtext + group grphelptext + style 0 + wrapped + text "Defend" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name defendtext + group grphelptext + style 0 + wrapped + text "Command your team member to guard your team's Base." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + + +// Follow // + + +itemDef { + name followtext + group grphelptext + style 0 + wrapped + text "Follow" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name followtext + group grphelptext + style 0 + wrapped + text "Command your team member to follow you." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + + + +// Patrol // + +itemDef { + name patroltext + group grphelptext + style 0 + wrapped + text "Patrol" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name patroltext + group grphelptext + style 0 + wrapped + text "Command your team member to patrol between Bases and \r" + "determine their own actions based upon the situation. \r" + "Basically, this command frees the team member \r" + "to act independently of your orders." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +// Retrieve // + +itemDef { + name retrievetext + group grphelptext + style 0 + wrapped + text "Retrieve" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name retrievetext + group grphelptext + style 0 + wrapped + text "If your flag is taken from the base in Capture the Flag, this orders \r" + "your team member to find the stolen flag and return it. In One Flag CTF, \r" + "it orders the team member to take the white flag from the opposition. \r" + "This status can only occur in Capture the Flag or One Flag CTF matches." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + + +// ESCORT // + +itemDef { + name escorttext + group grphelptext + style 0 + wrapped + text "Escort" + rect 140 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name escorttext + group grphelptext + style 0 + wrapped + text "This will command your team member to escort the flag \r" + "carrier to the enemy Base. This command can only be given \r" + "Capture the Flag and One Flag CTF matches." + rect 140 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/password.menu b/quake3/source/ui/password.menu new file mode 100644 index 0000000..d387833 --- /dev/null +++ b/quake3/source/ui/password.menu @@ -0,0 +1,147 @@ +#include "ui/menudef.h" + +{ +\\ PASSWORD POPUP MENU \\ + +menuDef { + name "password_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close password_popmenu ; open joinserver } + + + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + + + + + + // PASSWORD // + +itemDef { + name password + text "Password" + style 0 + decoration + textscale .3 + rect 1 87 110 20 + textalign 1 + textalignx 117 + textaligny 16 + forecolor 0 0 0 1 + visible 1 + + } +itemDef { + name password + text "Password" + style 0 + decoration + textscale .3 + rect 0 86 110 20 + textalign 1 + textalignx 117 + textaligny 16 + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name passwordEntry + style 1 + text ":" + maxchars 15 + textscale .25 + TYPE 4 + cvar "password" + rect 50 106 130 20 + textalign 0 + textalignx 0 + textaligny 16 + forecolor 1 1 1 1 + backcolor 0 0 0 .5 + visible 1 + mouseenter { setitemcolor passwordEntry backcolor 0 0 0 .75 } + mouseexit { setitemcolor passwordEntry backcolor 0 0 0 .5 } + } + + + +itemDef { + name yes + text "Ok" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 103 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close password_popmenu ; open joinserver } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 103 140 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 97 140 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 132 140 7 26 + visible 1 + decoration + } + + + + + + + +} + + + +} diff --git a/quake3/source/ui/player.menu b/quake3/source/ui/player.menu new file mode 100644 index 0000000..204dd34 --- /dev/null +++ b/quake3/source/ui/player.menu @@ -0,0 +1,612 @@ +#include "ui/menudef.h" + +{ +\\ PLATER SELECTION MENU \\ + +menuDef { + name "player_menu" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + style 1 + focusColor 1 .75 0 1 + + onOpen { play "sound/misc/kcswish.wav" ; + playlooped "music/fla_mp03.wav" ; + setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + uiScript update "ui_GetName" ; + transition menuback_g 0 0 640 480 195 120 255 202 20 10 ; + transition clancinematic 107 82 426 316 238 153 170 133 20 10 ; + hide back_alt ; + show back ; + hide grpmessage } + onClose { uiScript update "ui_SetName" } + onEsc { close player_menu ; open main } + + + + + + +itemDef { + name gametypebar + style 2 + rect 0 5 640 40 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 .5 + visible 1 + decoration + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } +} + + +itemDef { + name arenatype + type ITEM_TYPE_MULTI + cvar "ui_q3model" + cvarFloatList { "Team Arena" 0 "Quake III" 1 } + text "Model Type:" + textstyle 6 + rect 0 10 320 31 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 26 + textscale .35 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show message_type } + mouseExit { hide message_type } + action { play "sound/misc/kcaction.wav" } + } + +itemDef { + name quakeimage + style WINDOW_STYLE_SHADER + group grpquaketype + cvarTest "ui_q3model" + showCVar { "1" } + background "ui/assets/playerpatriot.tga" + rect 60 24 128 256 + forecolor .25 .25 .25 1 + decoration + } + +itemDef { + name quakeimage + group grpquaketype + cvarTest "ui_q3model" + showCVar { "1" } + style WINDOW_STYLE_SHADER + background "ui/assets/playerpi.tga" + rect 100 24 128 256 + visible 1 + decoration + } +itemDef { + name quakeimage + group grpquaketype + cvarTest "ui_q3model" + showCVar { "1" } + style WINDOW_STYLE_SHADER + background "ui/assets/playerklesk.tga" + rect 440 24 128 256 + forecolor .5 .5 .5 1 + visible 1 + decoration + } + + +itemDef { + name quakeimage + group grpquaketype + cvarTest "ui_q3model" + showCVar { "1" } + style WINDOW_STYLE_SHADER + background "ui/assets/playerbiker.tga" + rect 384 24 128 256 + visible 1 + decoration + } + + + +itemDef { + name clanlogo1 + style WINDOW_STYLE_SHADER + group grparenatype + cvarTest "ui_q3model" + showCVar { "0" } + background "ui/assets/pagans.tga" + rect 0 150 128 128 + forecolor .5 .5 .5 .25 + visible 1 + decoration + } + +itemDef { + name clanlogo1 + group grparenatype + cvarTest "ui_q3model" + showCVar { "0" } + style WINDOW_STYLE_SHADER + background "ui/assets/crusaders.tga" + rect 128 150 128 128 + forecolor .5 .5 .5 .25 + visible 1 + decoration + } + + +itemDef { + name clanlogo1 + group grparenatype + cvarTest "ui_q3model" + showCVar { "0" } + style WINDOW_STYLE_SHADER + background "ui/assets/stroggs.tga" + rect 384 150 128 128 + forecolor .5 .5 .5 .25 + visible 1 + decoration + } + + +itemDef { + name clanlogo1 + group grparenatype + cvarTest "ui_q3model" + showCVar { "0" } + style WINDOW_STYLE_SHADER + background "ui/assets/intruders.tga" + rect 512 150 128 128 + forecolor .5 .5 .5 .25 + visible 1 + decoration + } + +itemDef { + name window + style WINDOW_STYLE_FILLED + rect 238 153 170 133 + forecolor 0 0 0 1 + backcolor 0 0 0 1 + visible 1 + decoration + } + + + +itemDef { + name playerbar + style 2 + rect 0 130 640 170 + backcolor 0 0 .75 0 + forecolor 1 1 1 1 + border 4 + bordercolor 0.5 0.5 0.5 .75 + bordersize 2 + visible 1 + decoration + } + +itemDef { + name window + rect 10 50 620 60 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 0 + visible 1 + decoration + } + +itemDef { + name window + rect 10 112 205 216 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 0 + visible 1 + decoration + } +itemDef { + name window + rect 217 112 205 216 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 0 + visible 1 + decoration + } + +itemDef { + name window + rect 424 112 206 216 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 0 + visible 1 + decoration + } + +itemDef { + name modelselection + ownerdraw UI_PLAYERMODEL + rect 424 80 260 260 + style 1 + decoration + visible 1 + } + +itemDef { + name namefield + group "playersettinggroup" + type ITEM_TYPE_EDITFIELD + style 0 + text "Name:" + cvar "ui_Name" + textstyle 6 + maxChars 32 + rect 0 70 215 32 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 21 + textscale .333 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + mouseEnter { show message_name } + mouseExit { hide message_name } + } + +itemDef { + name handicapfield + group "playersettinggroup" + style 0 + text "Handicap:" + ownerdraw UI_HANDICAP + textstyle 6 + rect 0 175 215 32 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 21 + textscale .333 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + mouseEnter { show message_handicap } + mouseExit { hide message_handicap } + } + +itemDef { + name effectfield + group "playersettinggroup" + style 0 + text "Effect:" + ownerdraw UI_EFFECTS + rect 0 205 215 32 + textstyle 6 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 21 + textscale .333 + outlinecolor 1 .5 .5 .5 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + mouseEnter { show message_effect } + mouseExit { hide message_effect } + } + +itemDef { + name clanfield + group grparenatype + ownerdraw UI_CLANNAME + text "Clan:" + textstyle 6 + rect 20 235 215 31 + textalign ITEM_ALIGN_LEFT + textalignx 0 + textaligny 21 + textscale .333 + forecolor 1 1 1 1 + cvarTest "ui_q3model" + showCVar { "0" } + visible 1 + action { play "sound/misc/nomenu.wav" } + mouseEnter { show message_clan } + mouseExit { hide message_clan } + } + + + + +itemDef { + name headlist + rect 10 330 620 80 + group grparenatype + cvarTest "ui_q3model" + hideCvar { "1" } + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 61.75 + elementheight 61.75 + elementtype LISTBOX_IMAGE + feeder FEEDER_HEADS + horizontalscroll + border 1 + bordersize 1 + backcolor 0 0 0 .25 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + visible 1 + mouseenter { setitemcolor headlist bordercolor .7 0 0 1 ; show message_model } + mouseexit { setitemcolor headlist bordercolor .5 .5 .5 .5 ; hide message_model } + } +itemDef { + name headlist + rect 10 330 620 80 + group grpquaketype + cvarTest "ui_q3model" + showCVar { "1" } + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 61.75 + elementheight 61.75 + elementtype LISTBOX_IMAGE + feeder FEEDER_Q3HEADS + horizontalscroll + border 1 + bordersize 1 + backcolor 0 0 0 .25 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + visible 1 + mouseenter { setitemcolor headlist bordercolor .7 0 0 1 ; show message_model } + mouseexit { setitemcolor headlist bordercolor .5 .5 .5 .5 ; hide message_model} + } + + + +// BACK BAR // + +itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + +itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close player_menu ; open main } + mouseEnter { hide back ; show back_alt ; show message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; hide message_back } + action { close player_menu ; open main } + } + +// MESSAGES // +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Return to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_name + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Enter Player Name" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_handicap + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Click to Change Handicap" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_effect + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select Bar to Change Effect Color" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_clan + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Click to Cycle Clan Selection" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_type + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Click to View Team Arena or Quake III Models" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_model + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Click to Change Player Model" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name clancinematic + rect 238 157 170 133 + group grparenatype + cvarTest "ui_q3model" + showCVar { "0" } + ownerdraw UI_CLANCINEMATIC + visible 1 + decoration + } +itemDef { + name clancinematic + group grpquaketype + cvarTest "ui_q3model" + showCVar { "1" } + style 3 + background "ui/assets/q3imagepage.tga" + rect 238 157 170 133 + visible 1 + decoration + } + +itemDef { + name clancinematic + style 3 + background "menuscreen" + rect 238 153 170 133 + visible 1 + decoration + } + +itemDef { + name menuback_g + style WINDOW_STYLE_SHADER + rect 195 120 255 202 + background "menuback_g" + visible 1 + decoration + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + +} + + +} + diff --git a/quake3/source/ui/powerup.menu b/quake3/source/ui/powerup.menu new file mode 100644 index 0000000..76e6038 --- /dev/null +++ b/quake3/source/ui/powerup.menu @@ -0,0 +1,768 @@ +#include "ui/menudef.h" + +{ +\\ powerup \\ + + menuDef { + name "powerup_menu" + visible 0 + fullscreen 0 + rect 0 90 640 340 + focusColor 1 .67 0 1 + border 1 + style 1 + onEsc { close help_menu ; close powerup_menu ; close ordersHelp_menu ; open main } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + hide grphelptext ; + show scouttext ; + hide grpiconalt } + +// SCOUT // + +itemDef { + name scoutIcon + group grpScout + style WINDOW_STYLE_SHADER + rect 32 2 32 32 + visible 1 + type ITEM_TYPE_BUTTON + background "icons/scout.tga" + } +itemDef { + name scoutIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 30 0 34 34 + visible 1 + type ITEM_TYPE_BUTTON + background "icons/scout.tga" + } +itemDef { + name scout + group grpScout + rect 15 37 70 26 + text "Scout" + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grphelptext ; show scouttext ; exec "play sound/items/cl_scout.wav" } + mouseEnter { setitemcolor scout backcolor .1 .37 .1 1 ; hide scoutIcon ; show scoutIconAlt } + mouseExit { setitemcolor scout backcolor .37 .1 .1 1 ; hide scoutIconAlt ; show scoutIcon } + } +itemDef { + name scout + group grpScout + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 15 37 70 26 + visible 1 + decoration + } + +itemDef { + name scout + group grpScout + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 8 37 8 26 + visible 1 + decoration + } + +itemDef { + name scout + group grpScout + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 84 37 8 26 + visible 1 + decoration + } + +// GUARD // + +itemDef { + name guardIcon + style WINDOW_STYLE_SHADER + rect 128 2 32 32 + visible 1 + background "icons/guard.tga" + decoration + } +itemDef { + name guardIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 126 0 34 34 + visible 1 + background "icons/guard.tga" + decoration + } +itemDef { + name guard + rect 111 37 70 26 + type 1 + text "Guard" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grphelptext ; show guardtext ; exec "play sound/items/cl_guard.wav" } + mouseEnter { setitemcolor guard backcolor .1 .37 .1 1 ; hide guardIcon ; show guardIconAlt } + mouseExit { setitemcolor guard backcolor .37 .1 .1 1 ; hide guardIconAlt ; show guardIcon } + } + +itemDef { + name guard + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 111 37 70 26 + visible 1 + decoration + } + +itemDef { + name guard + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 104 37 8 26 + visible 1 + decoration + } + +itemDef { + name guard + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 180 37 8 26 + visible 1 + decoration + } + +// DOUBLER // + +itemDef { + name doublerIcon + style WINDOW_STYLE_SHADER + rect 222 2 32 32 + visible 1 + background "icons/doubler.tga" + decoration + } +itemDef { + name doublerIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 220 0 34 34 + visible 1 + background "icons/doubler.tga" + decoration + } +itemDef { + name doubler + rect 207 37 70 26 + type 1 + text "Doubler" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 35 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show doublertext ; exec "play sound/items/cl_doubler.wav" } + mouseEnter { setitemcolor doubler backcolor .1 .37 .1 1 ; hide doublerIcon ; show doublerIconAlt } + mouseExit { setitemcolor doubler backcolor .37 .1 .1 1 ; hide doublerIconAlt ; show doublerIcon } + } +itemDef { + name doubler + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 207 37 70 26 + visible 1 + decoration + } + +itemDef { + name doubler + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 200 37 8 26 + visible 1 + decoration + } + +itemDef { + name doubler + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 276 37 8 26 + visible 1 + decoration + } + +// AMMO_REGEN // + +itemDef { + name ammo_regenIcon + style WINDOW_STYLE_SHADER + rect 331 2 32 32 + visible 1 + background "icons/ammo_regen.tga" + decoration + } +itemDef { + name ammo_regenIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 329 0 34 34 + visible 1 + background "icons/ammo_regen.tga" + decoration + } +itemDef { + name ammo_regen + rect 302 37 87 26 + type 1 + text "Ammo-Regen" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 43 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show ammo_regentext ; exec "play sound/items/cl_ammoregen.wav" } + mouseEnter { setitemcolor ammo_regen backcolor .1 .37 .1 1 ; hide ammo_regenIcon ; show ammo_regenIconAlt } + mouseExit { setitemcolor ammo_regen backcolor .37 .1 .1 1 ; hide ammo_regenIconAlt ; show ammo_regenIcon } + } +itemDef { + name ammo_regen + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 302 37 87 26 + visible 1 + decoration + } + +itemDef { + name ammo_regen + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 295 37 8 26 + visible 1 + decoration + } + +itemDef { + name ammo_regen + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 388 37 8 26 + visible 1 + decoration + } + +// KAMIKAZE // + +itemDef { + name kamikazeIcon + style WINDOW_STYLE_SHADER + rect 439 2 32 32 + visible 1 + background "icons/kamikaze.tga" + decoration + } +itemDef { + name kamikazeIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 437 0 34 34 + visible 1 + background "icons/kamikaze.tga" + decoration + } +itemDef { + name kamikaze + rect 415 37 87 26 + type 1 + text "Kamikaze" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 43 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show kamikazetext ; exec "play sound/items/kamikaze_full.wav" } + mouseEnter { setitemcolor kamikaze backcolor .1 .37 .1 1 ; hide kamikazeIcon ; show kamikazeIconAlt } + mouseExit { setitemcolor kamikaze backcolor .37 .1 .1 1 ; hide kamikazeIconAlt ; show kamikazeIcon } + } +itemDef { + name kamikaze + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 415 37 87 26 + visible 1 + decoration + } + +itemDef { + name kamikaze + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 408 37 8 26 + visible 1 + decoration + } + +itemDef { + name kamikaze + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 501 37 8 26 + visible 1 + decoration + } + + +// INVULNERABILITY // + +itemDef { + name invulnerabilityIcon + style WINDOW_STYLE_SHADER + rect 561 2 32 32 + visible 1 + background "icons/invulnerability.tga" + decoration + } +itemDef { + name invulnerabilityIconAlt + group grpIconAlt + style WINDOW_STYLE_SHADER + rect 559 0 34 34 + visible 1 + background "icons/invulnerability.tga" + decoration + } +itemDef { + name invulnerability + rect 526 37 102 26 + type 1 + text "Invulnerability" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .29 + textalignx 49 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show invulnerabilitytext ; exec "play sound/items/invul_activate.wav" } + mouseEnter { setitemcolor invulnerability backcolor .1 .37 .1 1 ; hide invulnerabilityIcon ; show invulnerabilityIconAlt } + mouseExit { setitemcolor invulnerability backcolor .37 .1 .1 1 ; hide invulnerabilityIconAlt ; show invulnerabilityIcon } + } +itemDef { + name invulnerability + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 526 37 102 26 + visible 1 + decoration + } + +itemDef { + name invulnerability + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 519 37 8 26 + visible 1 + decoration + } + +itemDef { + name invulnerability + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 626 37 8 26 + visible 1 + decoration + } + +// SCOUT // +itemDef { + name scouttext + group grphelptext + style 0 + wrapped + text "Scout : Team Power-Up" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name scouttext + group grphelptext + style 0 + wrapped + text "The Scout power-up drastically increases the player's rate \r" + "of movement and attack. It also prevents the player from \r" + "wearing any armor and discards any armor points that the \r" + "player may already have. As with the other persistent team \r" + "power-ups, the player keeps the Scout until he or she \r" + "is fragged. " + rect 280 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name scouttext + group grphelptext + style 5 + cinematic "scout.RoQ" + rect 10 94 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +// Guard // +itemDef { + name guardtext + group grphelptext + style 0 + wrapped + text "Guard : Team Power-Up" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name guardtext + group grphelptext + style 0 + wrapped + text "The Guard power-up gives the player an instant health \r" + "and armor boost up to 200 points. The player's health \r" + "points will regenerate to keep them at 200 points. The \r" + "player may replenish lost armor points back up to 200 \r" + "points. As with the other persistent team power-ups, \r" + "the player keeps the Guard until he or she is fragged." + rect 280 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } + +itemDef { + name guardtext + group grphelptext + style WINDOW_STYLE_CINEMATIC + cinematic "guard.RoQ" + rect 10 94 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + + +// Doubler // +itemDef { + name doublertext + group grphelptext + style 0 + wrapped + text "Doubler : Team Power-Up" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name doublertext + group grphelptext + style 0 + wrapped + text "The Doubler power-up doubles the amount of damage done \r" + "by each hit the player scores. The doubling effect is also \r" + "modified further by the damage boosting effects of the Quad \r" + "Damage. As with the other persistent team power-ups, the \r" + "player keeps the Doubler until he or she is fragged." + rect 280 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name doublertext + group grphelptext + style 5 + cinematic "doubler.RoQ" + rect 10 94 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +// Ammo-Regen // +itemDef { + name ammo_regentext + group grphelptext + style 0 + wrapped + text "Ammo-Regen : Team Power-Up" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name ammo_regentext + group grphelptext + style 0 + wrapped + text "The Ammo-Regen power-up slowly replenishes the \r" + "ammunition used by each weapon in the player's \r" + "possession up to a full basic load (the amount that \r" + "comes with the weapon). The player can shoot faster \r" + "than the ammo can regenerate. The Ammo-Regen also \r" + "significantly increases the player's rate of fire for \r" + "all attack types. As with the other persistent team \r" + "power-ups, the player keeps the Ammo-Regen until he or \r" + "she is fragged." + rect 280 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name ammo_regentext + group grphelptext + style 5 + cinematic "ammo_regen.RoQ" + rect 10 94 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +// Kamikaze // +itemDef { + name kamikazetext + group grphelptext + style 0 + wrapped + text "Kamikaze : Useable Item" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name kamikazetext + group grphelptext + style 0 + wrapped + text "When carried by a player, the Kamikaze appears as \r" + "skulls swirling about the body. Pressing the Use Item \r" + "key activates the bomb, fragging the player and severely \r" + "punishing all others within the range of the explosion. \r" + "The blast's powerful shockwave shakes the entire arena." + rect 280 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name kamikazetext + group grphelptext + style 5 + cinematic "kamikaze.RoQ" + rect 10 94 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + +// Invulnerability // +itemDef { + name invulnerabilitytext + group grphelptext + style 0 + wrapped + text "Invulnerability : Useable Item" + rect 280 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name invulnerabilitytext + group grphelptext + style 0 + wrapped + text "When activated, the Invulnerability power-up freezes the \r" + "player in place and surrounds him or her with a mostly \r" + "impenetrable, crackling shield of magenta energy. Mostly \r" + "impenetrable, because the player can fire out and prox \r" + "mines can be lobbed in." + rect 280 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .25 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name invulnerabilitytext + group grphelptext + style 5 + cinematic "invulnerability.RoQ" + rect 10 94 256 192 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + + + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/powerup2.menu b/quake3/source/ui/powerup2.menu new file mode 100644 index 0000000..08e626e --- /dev/null +++ b/quake3/source/ui/powerup2.menu @@ -0,0 +1,694 @@ +#include "ui/menudef.h" + +{ +\\ powerup \\ + + menuDef { + name "powerup_menu" + visible 0 + fullscreen 0 + rect 0 90 640 340 + focusColor 1 .67 0 1 + border 1 + outOfBoundsClick + style 1 + onopen { hide grphelptext ; show scouttext } + +// SCOUT // + +itemDef { + name scout + style WINDOW_STYLE_SHADER + rect 32 0 32 32 + visible 1 + type ITEM_TYPE_BUTTON + background "icons/scout.tga" + } +itemDef { + name scout + rect 15 37 70 26 + text "Scout" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grphelptext ; show scouttext } + mouseEnter { setitemcolor scout backcolor .1 .37 .1 1 } + mouseExit { setitemcolor scout backcolor .37 .1 .1 1 } + } +itemDef { + name scout + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 15 37 70 26 + visible 1 + decoration + } + +itemDef { + name scout + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 8 37 8 26 + visible 1 + decoration + } + +itemDef { + name scout + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 84 37 8 26 + visible 1 + decoration + } + +// GUARD // + +itemDef { + name guard + style WINDOW_STYLE_SHADER + rect 128 0 32 32 + visible 1 + background "icons/guard.tga" + decoration + } +itemDef { + name guard + style 0 + rect 111 37 70 26 + text "Guard" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { hide grphelptext ; show guardtext } + mouseEnter { setitemcolor guard backcolor .1 .37 .1 1 } + mouseExit { setitemcolor guard backcolor .37 .1 .1 1 } + } + +itemDef { + name guard + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 111 37 70 26 + visible 1 + decoration + } + +itemDef { + name guard + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 104 37 8 26 + visible 1 + decoration + } + +itemDef { + name guard + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 180 37 8 26 + visible 1 + decoration + } + +// DOUBLER // + +itemDef { + name doubler + style WINDOW_STYLE_SHADER + rect 222 0 32 32 + visible 1 + background "icons/doubler.tga" + decoration + } +itemDef { + name doubler + style 0 + rect 207 37 70 26 + text "Doubler" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 35 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show doublertext } + mouseEnter { setitemcolor doubler backcolor .1 .37 .1 1 } + mouseExit { setitemcolor doubler backcolor .37 .1 .1 1 } + } +itemDef { + name doubler + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 207 37 70 26 + visible 1 + decoration + } + +itemDef { + name doubler + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 200 37 8 26 + visible 1 + decoration + } + +itemDef { + name doubler + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 276 37 8 26 + visible 1 + decoration + } + +// AMMO_REGEN // + +itemDef { + name ammo_regen + style WINDOW_STYLE_SHADER + rect 331 0 32 32 + visible 1 + background "icons/ammo_regen.tga" + decoration + } +itemDef { + name ammo_regen + style 0 + rect 302 37 87 26 + text "Ammo-Regen" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 43 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show ammo_regentext } + mouseEnter { setitemcolor ammo_regen backcolor .1 .37 .1 1 } + mouseExit { setitemcolor ammo_regen backcolor .37 .1 .1 1 } + } +itemDef { + name ammo_regen + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 302 37 87 26 + visible 1 + decoration + } + +itemDef { + name ammo_regen + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 295 37 8 26 + visible 1 + decoration + } + +itemDef { + name ammo_regen + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 388 37 8 26 + visible 1 + decoration + } + +// KAMIKAZE // + +itemDef { + name kamikaze + style WINDOW_STYLE_SHADER + rect 439 0 32 32 + visible 1 + background "icons/kamikaze.tga" + decoration + } +itemDef { + name kamikaze + style 0 + rect 415 37 87 26 + text "Kamikaze" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 43 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show kamikazetext } + mouseEnter { setitemcolor kamikaze backcolor .1 .37 .1 1 } + mouseExit { setitemcolor kamikaze backcolor .37 .1 .1 1 } + } +itemDef { + name kamikaze + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 415 37 87 26 + visible 1 + decoration + } + +itemDef { + name kamikaze + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 408 37 8 26 + visible 1 + decoration + } + +itemDef { + name kamikaze + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 501 37 8 26 + visible 1 + decoration + } + + +// INVULNERABILITY // + +itemDef { + name invulnerability + style WINDOW_STYLE_SHADER + rect 561 0 32 32 + visible 1 + background "icons/invulnerability.tga" + decoration + } +itemDef { + name invulnerability + style 0 + rect 526 37 102 26 + text "Invulnerability" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .3 + textalignx 47 + textaligny 20 + visible 1 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + action { hide grphelptext ; show invulnerabilitytext } + mouseEnter { setitemcolor invulnerability backcolor .1 .37 .1 1 } + mouseExit { setitemcolor invulnerability backcolor .37 .1 .1 1 } + } +itemDef { + name invulnerability + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 526 37 102 26 + visible 1 + decoration + } + +itemDef { + name invulnerability + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 519 37 8 26 + visible 1 + decoration + } + +itemDef { + name invulnerability + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 626 37 8 26 + visible 1 + decoration + } + +// SCOUT // +itemDef { + name scouttext + group grphelptext + style 0 + wrapped + text "Scout : Team Power-Up" + rect 180 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name scouttext + group grphelptext + style 0 + wrapped + text "The Scout power-up drastically increases the player's rate \r" + "of movement and attack. It also prevents the player from \r" + "wearing any armor and discards any armor points that the \r" + "player may already have. As with the other persistent team \r" + "power-ups, the player keeps the Scout until he or she \r" + "is fragged. " + rect 180 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name scouttext + group grphelptext + style 3 + background "ui/assets/helpscreens/powerups/scout.tga" + rect 30 94 128 96 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +// Guard // +itemDef { + name guardtext + group grphelptext + style 0 + wrapped + text "Guard : Team Power-Up" + rect 180 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name guardtext + group grphelptext + style 0 + wrapped + text "The Guard power-up gives the player an instant health \r" + "and armor boost up to 200 points. The player's health \r" + "points will regenerate to keep them at 200 points. The \r" + "player may replenish lost armor points back up to 200 \r" + "points. As with the other persistent team power-ups, \r" + "the player keeps the Guard until he or she is fragged." + rect 180 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name guardtext + group grphelptext + style 3 + background "ui/assets/helpscreens/powerups/guard.tga" + rect 30 94 128 96 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + + +// Doubler // +itemDef { + name doublertext + group grphelptext + style 0 + wrapped + text "Doubler : Team Power-Up" + rect 180 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name doublertext + group grphelptext + style 0 + wrapped + text "The Doubler power-up doubles the amount of damage done \r" + "by each hit the player scores. The doubling effect is also \r" + "modified further by the damage boosting effects of the Quad \r" + "Damage. As with the other persistent team power-ups, the \r" + "player keeps the Doubler until he or she is fragged." + rect 180 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name doublertext + group grphelptext + style 3 + background "ui/assets/helpscreens/powerups/doubler.tga" + rect 30 94 128 96 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +// Ammo-Regen // +itemDef { + name ammo_regentext + group grphelptext + style 0 + wrapped + text "Ammo-Regen : Team Power-Up" + rect 180 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name ammo_regentext + group grphelptext + style 0 + wrapped + text "The Ammo-Regen power-up slowly replenishes the ammunition \r" + "used by each weapon in the player's possession up to a full \r" + "basic load (the amount that comes with the weapon). The player \r" + "can shoot faster than the ammo can regenerate. The Ammo-Regen \r" + "also significantly increases the player's rate of fire for all \r" + "attack types. As with the other persistent team power-ups, the\r" + " playerkeeps the Ammo-Regen until he or she is fragged." + rect 180 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name ammo_regentext + group grphelptext + style 3 + background "ui/assets/helpscreens/powerups/ammo.tga" + rect 30 94 128 96 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + +// Kamikaze // +itemDef { + name kamikazetext + group grphelptext + style 0 + wrapped + text "Kamikaze : Useable Item" + rect 180 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name kamikazetext + group grphelptext + style 0 + wrapped + text "When carried by a player, the Kamikaze appears as \r" + "skulls swirling about the body. Pressing the Use Item \r" + "key activates the bomb, fragging the player and severely \r" + "punishing all others within the range of the explosion. \r" + "The blast's powerful shockwave shakes the entire arena." + rect 180 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name kamikazetext + group grphelptext + style 3 + background "ui/assets/helpscreens/powerups/kamikaze.tga" + rect 30 94 128 96 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + +// Invulnerability // +itemDef { + name invulnerabilitytext + group grphelptext + style 0 + wrapped + text "Invulnerability : Useable Item" + rect 180 94 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name invulnerabilitytext + group grphelptext + style 0 + wrapped + text "When activated, the Invulnerability power-up freezes the \r" + "player in place and surrounds him or her with a mostly \r" + "impenetrable, crackling shield of magenta energy. Mostly \r" + "impenetrable, because the player can fire out and prox \r" + "mines can be lobbed in." + rect 180 124 500 20 + textalign 0 + textalignx 0 + textaligny 17 + textscale .3 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 0 + decoration + } +itemDef { + name invulnerabilitytext + group grphelptext + style 3 + background "ui/assets/helpscreens/powerups/invulnerable.tga" + rect 30 94 128 96 + border 1 + bordercolor .5 .5 .5 1 + visible 0 + decoration + } + + + + + + + + + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/punkbuster.menu b/quake3/source/ui/punkbuster.menu new file mode 100644 index 0000000..ca53012 --- /dev/null +++ b/quake3/source/ui/punkbuster.menu @@ -0,0 +1,410 @@ +#include "ui/menudef.h" + +{ + +// PB enable ---------------- + +menuDef { + name "pbenable_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close pbenable_popmenu ; open joinserver } + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + +itemDef { + name confirm + text "Enable Punkbuster?" + style 0 + textscale .25 + textstyle 3 + rect 0 85 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } + +// yes/no button + +itemDef { + name yes + text "YES" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 75 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript setPbClStatus 1 ; + close pbenable_popmenu ; + open joinserver } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + +itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 75 140 30 26 + visible 1 + decoration + } +itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 69 140 7 26 + visible 1 + decoration + } +itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 104 140 7 26 + visible 1 + decoration + } + +itemDef { + name no + text "NO" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 128 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close pbenable_popmenu ; + open joinserver } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + +itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 128 140 30 26 + visible 1 + decoration + } +itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 122 140 7 26 + visible 1 + decoration + } +itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 157 140 7 26 + visible 1 + decoration + } +} + +// PB disable --------------- + +menuDef { + name "pbdisable_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close pbdisable_popmenu ; open joinserver } + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + +itemDef { + name confirm + text "Disable Punkbuster?" + style 0 + textscale .25 + textstyle 3 + rect 0 85 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } + +// yes/no button + +itemDef { + name yes + text "YES" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 75 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close pbdisable_popmenu ; + open pbmsg_popmenu } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + +itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 75 140 30 26 + visible 1 + decoration + } +itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 69 140 7 26 + visible 1 + decoration + } +itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 104 140 7 26 + visible 1 + decoration + } + +itemDef { + name no + text "NO" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 128 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close pbdisable_popmenu ; + open joinserver } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + +itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 128 140 30 26 + visible 1 + decoration + } +itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 122 140 7 26 + visible 1 + decoration + } +itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 157 140 7 26 + visible 1 + decoration + } +} + +// disable msg -------------- + +menuDef { + name "pbmsg_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close pbmsg_popmenu ; open joinserver } + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + +itemDef { + name confirm + text "PunkBuster will be disabled" + style 0 + textscale .25 + textstyle 3 + rect 0 85 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name confirm + text "next time you start" + style 0 + textscale .25 + textstyle 3 + rect 0 100 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name confirm + text "Quake III: Team Arena" + style 0 + textscale .25 + textstyle 3 + rect 0 115 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } + +// ok button + +itemDef { + name yes + text "Ok" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 103 158 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript setPbClStatus 0 ; + close pbmsg_popmenu ; + open joinserver } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 103 158 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 97 158 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 132 158 7 26 + visible 1 + decoration + } +} + +} diff --git a/quake3/source/ui/quake3.menu b/quake3/source/ui/quake3.menu new file mode 100644 index 0000000..40b67c8 --- /dev/null +++ b/quake3/source/ui/quake3.menu @@ -0,0 +1,222 @@ +#include "ui/menudef.h" + +{ +\\ QUAKE3 POPUP MENU \\ + +menuDef { + name "quake3_popmenu" + visible 0 + fullscreen 0 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close quake3_popmenu ; open main } + + + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + +/* +// DEMO ONLY OPTION // + +itemDef { + name demo_only + text "Not Available." + style 0 + textscale .3 + textstyle 3 + rect 1 90 110 20 + textalign 1 + textalignx 117 + textaligny 16 + decoration + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name demo_only + text "in DEMO." + style 0 + textscale .3 + textstyle 3 + rect 1 110 110 20 + textalign 1 + textalignx 117 + textaligny 16 + decoration + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name demo_only + text "Press ESC key." + style 0 + textscale .3 + textstyle 3 + rect 0 135 110 20 + textalign 1 + textalignx 117 + textaligny 16 + decoration + forecolor 1 1 1 1 + visible 1 + } + +*/ + + // Quake 3 // + +itemDef { + name confirm + text "Launch Quake3?" + style 0 + textscale .3 + rect 1 91 110 20 + textalign 1 + textalignx 117 + textaligny 16 + decoration + forecolor 0 0 0 1 + visible 1 + } + +itemDef { + name confirm + text "Launch Quake3?" + style 0 + textscale .3 + rect 0 90 110 20 + textalign 1 + textalignx 117 + textaligny 16 + decoration + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name yes + text "YES" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 75 120 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript "Quake3" } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 75 120 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 69 120 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 104 120 7 26 + visible 1 + decoration + } + + + + + +itemDef { + name no + text "NO" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 128 120 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close quake3_popmenu ; open main } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 128 120 30 26 + visible 1 + decoration + } + + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 122 120 7 26 + visible 1 + decoration + } + + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 157 120 7 26 + visible 1 + decoration + } + + + +} + + +} + + + +} diff --git a/quake3/source/ui/quit.menu b/quake3/source/ui/quit.menu new file mode 100644 index 0000000..a66d175 --- /dev/null +++ b/quake3/source/ui/quit.menu @@ -0,0 +1,163 @@ +#include "ui/menudef.h" + +{ +\\ QUIT POPUP MENU \\ + +menuDef { + name "quit_popmenu" + visible 0 + fullscreen 0 + //rect 217 200 210 85 + rect 204 122 235 235 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close quit_popmenu ; open main } + + + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + + + + + + // QUIT // + +itemDef { + name confirm + text "Quit Team Arena?" + style 0 + textscale .3 + textstyle 3 + rect 0 90 110 20 + textalign 1 + textalignx 117 + textaligny 16 + decoration + forecolor 1 1 1 1 + visible 1 + } + + +itemDef { + name yes + text "YES" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 75 120 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav"; + close main ; + close quit_popmenu ; + open quitCredit } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 75 120 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 69 120 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 104 120 7 26 + visible 1 + decoration + } + + + + + +itemDef { + name no + text "NO" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 128 120 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close quit_popmenu ; open main } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 128 120 30 26 + visible 1 + decoration + } + + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 122 120 7 26 + visible 1 + decoration + } + + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 157 120 7 26 + visible 1 + decoration + } + +} + + +} + + diff --git a/quake3/source/ui/quitcredit.menu b/quake3/source/ui/quitcredit.menu new file mode 100644 index 0000000..88a7c18 --- /dev/null +++ b/quake3/source/ui/quitcredit.menu @@ -0,0 +1,258 @@ +#include "ui/menudef.h" + +{ +\\ QUIT CREDIT \\ + + menuDef { + name "quitCredit" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .67 0 1 + style 1 + border 1 + onEsc { uiScript "quit" } + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + show grpidcredit } + + + + + +itemDef { + name demo_only + style WINDOW_STYLE_EMPTY + rect 0 0 640 480 + type 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close quitCredit ; + uiScript "quit" } + } + + + +// LEVEL SELECTION BAR // + +itemDef { + name teamarenaart + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/teamarenaimage2.tga" + rect 64 0 512 150 + visible 0 + decoration + } + + + + + +itemDef { + name programming + group grpidcredit + style 0 + rect 0 160 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "PROGRAMMING: John Carmack, Robert Duffy, Jim Dose'" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name artist + group grpidcredit + style 0 + rect 0 190 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "ART: Adrian Carmack, Kevin Cloud, Kenneth Scott, Seneca Menard, Fred Nilsson " + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name levelDesign + group grpidcredit + style 0 + rect 0 220 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "LEVEL DESIGN: Tim Willits, Christian Antkow, Paul Jaquays" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name gameDesign + group grpidcredit + style 0 + rect 0 250 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "GAME DESIGN: Graeme Devine" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name ceo + group grpidcredit + style 0 + rect 0 280 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "CEO: Todd Hollenshead" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name bizDev + group grpidcredit + style 0 + rect 0 310 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "BUSINESS DEVELOPMENT: Marty Stratton" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name idMom + group grpidcredit + style 0 + rect 0 340 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "OFFICE MANAGER AND ID MOM: Donna Jackson" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name devAssist + group grpidcredit + style 0 + rect 0 370 640 30 + textalign 1 + textalignx 320 + textaligny 10 + textscale .35 + text "DEVELOPMENT ASSISTANCE: Eric Webb" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name exitbttn + group grpidcredit + rect 255 420 130 26 + type 1 + text "Click to Exit" + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + textalign 1 + textscale .25 + textalignx 65 + textaligny 20 + visible 0 + decoration + backcolor .37 .1 .1 1 + forecolor 1 1 1 1 + action { play "sound/misc/nomenu.wav" } + mouseEnter { setitemcolor exitbttn backcolor .1 .37 .1 1 } + mouseExit { setitemcolor exitbttn backcolor .37 .1 .1 1 } + } +itemDef { + name exitbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 255 420 130 26 + visible 0 + decoration + } + +itemDef { + name exitbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 243 420 13 26 + visible 0 + decoration + } + +itemDef { + name exitbttn + group grpidcredit + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 384 420 13 26 + visible 0 + decoration + } + +itemDef { + name copyright + text "Quake III: Team Arena Copyright 2000 Id Software, Inc. All rights reserved" + style 0 + textscale .25 + rect 0 440 640 40 + textalign 1 + textaligny 32 + textalignx 320 + forecolor .75 0 0 .75 + visible 1 + decoration + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + +} + +} +} \ No newline at end of file diff --git a/quake3/source/ui/rankings.menu b/quake3/source/ui/rankings.menu new file mode 100644 index 0000000..91e0929 --- /dev/null +++ b/quake3/source/ui/rankings.menu @@ -0,0 +1,93 @@ +#include "ui/menudef.h" + +{ +\\ RANKINGS MENU \\ + +menuDef { + name "rankings_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + + + +itemDef { + name window + group grpControlbutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + + + + itemDef { + name rankings + group grprankings + type 4 + text "Name:" + rect 99 80 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name rankings + group rankings + type 4 + text "Password:" + rect 99 110 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type 4 + text "Verify Password:" + rect 99 140 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + itemDef { + name options + group grpOptions + type 4 + text "Email (Optional):" + rect 99 170 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .3 + forecolor 1 1 1 1 + visible 1 + } + + + +} diff --git a/quake3/source/ui/resetscore.menu b/quake3/source/ui/resetscore.menu new file mode 100644 index 0000000..cb83a68 --- /dev/null +++ b/quake3/source/ui/resetscore.menu @@ -0,0 +1,223 @@ +#include "ui/menudef.h" + +{ +\\ RESET SCORE MENU \\ + +menuDef { + name "resetscore_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + fadeout fadebox ; + show grpdefault ; + hide grpfinish } + onEsc { close resetscore_menu ; close setup_menu ; open main } + + + +itemDef { + name window + group grpControlbutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + + itemDef { + name default + group grpdefault + style 0 + text "This will set all of your map scores" + rect 0 140 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name default + group grpdefault + style 0 + text "and completion times to zero." + rect 0 160 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name default + group grpdefault + style 0 + text "Are you sure?" + rect 0 220 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 1 + decoration + } + +itemDef { + name yes + text "YES" + group grpdefault + type 1 + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 135 250 70 26 + textalign 1 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + uiScript resetScores ; + show grpfinish ; + hide grpdefault } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 135 250 70 26 + visible 1 + decoration + } + + itemDef { + name yes + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 123 250 13 26 + visible 1 + decoration + } + + itemDef { + name yes + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 204 250 13 26 + visible 1 + decoration + } + +itemDef { + name no + text "No" + group grpdefault + type 1 + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 235 250 70 26 + textalign 1 + textalignx 35 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close resetscore_menu ; open control_menu } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + + itemDef { + name no + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 235 250 70 26 + visible 1 + decoration + } + + itemDef { + name no + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 223 250 13 26 + visible 1 + decoration + } + + itemDef { + name no + group grpdefault + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 304 250 13 26 + visible 1 + decoration + } + + + + + + + + itemDef { + name finish_message + group grpfinish + style 0 + text "Your values are now set to zero." + rect 0 160 443 20 + textalign ITEM_ALIGN_CENTER + textalignx 221 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + decoration + } + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + + + +} diff --git a/quake3/source/ui/score.menu b/quake3/source/ui/score.menu new file mode 100644 index 0000000..8d46c38 --- /dev/null +++ b/quake3/source/ui/score.menu @@ -0,0 +1,452 @@ +#include "ui/menudef.h" + +{ +\\ score_menu \\ + + menuDef { + name "score_menu" + visible 0 + fullscreen 0 + rect 0 0 640 480 + focusColor 1 .75 0 1 + style 0 + border 1 + + + + + +itemDef { + name scorebar + rect 14 28 610 35 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } + + + +itemDef { + name score + text " " + ownerdraw CG_GAME_STATUS + textscale .4 + style 0 + rect 0 20 640 35 + textalignx 320 + textaligny 0 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +itemDef { + name score + ownerdraw CG_KILLER + textscale .4 + style 0 + rect 0 2 640 25 + textalignx 320 + textaligny 0 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + + + +// TEAM BARS // + +itemDef { + name teambar + rect 14 65 610 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } + + +// PLAYER LIST BORDER // + + + +itemDef { + name window + rect 14 89 610 291 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } + + + +itemDef { + name window + rect 605 90 1 290 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + + +// TEAM HEADINGS // + +itemDef { + name teamheadings + text "Skill" + textscale .35 + style 0 + rect 25 65 30 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + +itemDef { + name columnWindow + rect 14 65 61 315 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name teamheadings + text "Status" + textscale .35 + style 0 + rect 85 65 64 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + +itemDef { + name columnWindow + rect 75 65 89 315 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name teamheadings + text "Name" + textscale .35 + style 0 + rect 170 65 64 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + +itemDef { + name columnWindow + rect 164 65 216 315 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name teamheadings + text "Score" + textscale .35 + style 0 + rect 385 65 64 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + +itemDef { + name columnWindow + rect 380 65 105 315 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name teamheadings + text "Time" + textscale .35 + style 0 + rect 490 65 64 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + +itemDef { + name columnWindow + rect 485 65 70 315 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name teamheadings + text "Ping" + textscale .35 + style 0 + rect 560 65 64 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 22 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + +itemDef { + name columnWindow + rect 555 65 70 315 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + + + + +// LIST // + +itemDef { + name playerlist + rect 14 90 610 290 + forecolor .75 .75 .75 1 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 592 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_SCOREBOARD + notselectable + columns 7 5 20 20 5 20 20 65 50 50 150 100 40 365 20 20 463 20 20 532 20 20 + } + + + +// PLAYER INFO // + + +itemDef { + name window + rect 14 384 612 65 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } +itemDef { + name window + rect 250 384 1 65 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name gametype + ownerdraw CG_GAME_TYPE + text "" + textalign 0 + textscale .25 + rect 30 382 50 17 + forecolor 1 1 1 1 + textaligny 10 + textalignx 0 + decoration + visible 1 + } + + +itemdef { + name playerscore + type 4 + text "Fraglimit:" + rect 30 405 40 10 + textalignx 0 + textaligny 10 + visible 1 + textalign 0 + forecolor 1 1 1 1 + textscale .25 + cvar "fraglimit" + decoration + } + + + +itemdef { + name playerscore + text "Score:" + rect 30 420 40 10 + textalignx 0 + textaligny 10 + visible 1 + textalign 0 + forecolor 1 1 1 1 + textscale .25 + ownerdraw CG_PLAYER_SCORE + decoration + } + + +itemdef { + name playername + text "Use Score Scroll Keys" + rect 30 435 256 20 + forecolor 1 .75 0 1 + textalignx 0 + textaligny 10 + visible 1 + textalign 0 + decoration + textscale 0.25 + } + + +// AWARDS // + + +itemdef { + name medal_accuracy + ownerdraw CG_ACCURACY + rect 276 388 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + + +itemdef { + name medal_excellent + ownerdraw CG_EXCELLENT + rect 376 388 32 32 + background "ui/assets/medal_excellent.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_gauntlet + ownerdraw CG_GAUNTLET + rect 476 388 32 32 + background "ui/assets/medal_gauntlet.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_impressive + ownerdraw CG_IMPRESSIVE + rect 576 388 32 32 + background "ui/assets/medal_impressive.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + + + + + + + + + + + + + + + + + + +} + + +} diff --git a/quake3/source/ui/score_results.menu b/quake3/source/ui/score_results.menu new file mode 100644 index 0000000..e78c15f --- /dev/null +++ b/quake3/source/ui/score_results.menu @@ -0,0 +1,417 @@ +#include "ui/menudef.h" + +{ +\\ score_menu \\ + + menuDef { + name "score_results" + visible 0 + fullscreen 0 + rect 0 0 640 480 + focusColor 1 .75 0 1 + style 0 + border 1 + + +// TEAM BARS // + +itemDef { + name leftteambar + rect 14 112 307 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 1 + forecolor 1 1 1 1 + backcolor 1 0 0 1 + visible 1 + decoration +} + +itemDef { + name rightteambar + rect 320 112 306 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 1 + forecolor 1 1 1 1 + backcolor 0 0 1 1 + visible 1 + decoration +} + +// TEAM HEADINGS // + +itemDef { + name leftteamheadings + text "Status Name Score Time Ping" + textscale .25 + style 0 + rect 25 112 128 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 18 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } +itemDef { + name rightteamheadings + text "Status Name Score Time Ping" + textscale .25 + style 0 + rect 336 112 128 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 18 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + + + +// GRADIENT BACKGROUNDS // + + +itemDef { + name window + rect 320 142 1 220 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 1 + visible 1 + decoration +} +itemDef { + name window + rect 300 142 1 220 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration +} +itemDef { + name window + rect 606 142 1 220 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration +} +itemDef { + name leftgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradleft.tga" + rect 14 142 306 222 + forecolor .75 0 0 0.5 + visible 1 + decoration + } +itemDef { + name rightgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradleft.tga" + rect 320 142 306 222 + forecolor 0 0 .75 0.5 + visible 1 + decoration + } +itemDef { + name playerlogo + style 3 + background "ui/assets/stroggs.tga" + rect 71 157 180 180 + visible 1 + forecolor .5 0 0 .5 + decoration + } + +itemDef { + name opponentlogo + style 3 + background "ui/assets/pagans.tga" + rect 397 157 180 180 + visible 1 + forecolor 0 0 .5 .5 + decoration +} + + + + +// LIST // + +itemDef { + name leftlist + rect 14 142 306 222 + forecolor .75 .75 .75 1 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 135 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_REDTEAM_LIST + columns 6 2 12 18 20 78 75 183 20 221 20 251 20 +} + + + +itemDef { + name rightlist + rect 320 142 306 222 + forecolor .75 .75 .75 1 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 135 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_BLUETEAM_LIST + columns 6 2 12 18 20 78 75 183 20 221 20 251 20 +} + + + + +// PLAYER LIST BORDER // + + + +itemDef { + name window + rect 14 141 612 221 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + + + +// GAMETYPE BAR // + + +itemDef { + name gametypebar + style 2 + rect 0 50 640 35 + // use it to offset left/right text from the edge + // or to center the text on a different point + style 2 + border 4 + bordercolor 1 1 1 1 + bordersize 1 + backcolor 0 0 .75 0.5 + visible 1 + decoration +} + + +itemDef { + name score + text " " + ownerdraw CG_GAME_STATUS + textscale .4 + style 0 + rect 0 42 640 35 + textalignx 320 + textaligny 0 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration +} + + +itemDef { + name score + ownerdraw CG_KILLER + textscale .4 + style 0 + rect 0 10 640 35 + textalignx 320 + textaligny 0 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration +} + + + + +// spectators // + +itemDef { + name window + text "Spectating:" + textaligny 20 + rect 14 414 82 24 + style WINDOW_STYLE_FILLED + border 0 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 .7 + backcolor .30 .30 .30 .25 + textscale .33 + visible 1 + decoration +} + +itemDef { + name window + rect 96 414 530 24 + style WINDOW_STYLE_FILLED + border 0 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 .7 + backcolor .30 .30 .30 .25 + textscale .33 + visible 1 + ownerdraw CG_SPECTATORS + decoration +} + + + + +// AWARDS // + + +itemDef { + name window + rect 14 364 612 48 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor .30 .30 .30 .15 + visible 1 + decoration +} + +itemdef { + name medal_accuracy + ownerdraw CG_ACCURACY + rect 56 368 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + textscale 0.25 +} + +itemdef { + name medal_assist + ownerdraw CG_ASSISTS + rect 156 368 32 32 + background "ui/assets/medal_assist.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + textscale 0.25 + +} + +itemdef { + name medal_defend + ownerdraw CG_DEFEND + rect 256 368 32 32 + background "ui/assets/medal_defend.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + textscale 0.25 +} + +itemdef { + name medal_excellent + ownerdraw CG_EXCELLENT + rect 356 368 32 32 + background "ui/assets/medal_excellent.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + textscale 0.25 + +} + +itemdef { + name medal_gauntlet + ownerdraw CG_GAUNTLET + rect 456 368 32 32 + background "ui/assets/medal_gauntlet.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + textscale 0.25 + +} + +itemdef { + name medal_impressive + ownerdraw CG_IMPRESSIVE + rect 556 368 32 32 + background "ui/assets/medal_impressive.tga" + forecolor 1 1 1 .25 + visible 1 + decoration + textscale 0.25 + +} + + + + + +// TEAM NAME // + +itemDef { + name redteamname + ownerdraw CG_RED_NAME + textalign 1 + textscale .4 + rect 14 84 306 25 + forecolor 1 0 0 1 + decoration + visible 1 +} + +itemDef { + name blueteamname + ownerdraw CG_BLUE_NAME + textalign 1 + textscale .4 + rect 320 84 306 25 + forecolor 0 0 1 1 + decoration + visible 1 +} + + + + + +} + + +} diff --git a/quake3/source/ui/serverinfo.menu b/quake3/source/ui/serverinfo.menu new file mode 100644 index 0000000..5c32fbe --- /dev/null +++ b/quake3/source/ui/serverinfo.menu @@ -0,0 +1,396 @@ +#include "ui/menudef.h" + +{ +\\ Server Information Popup Menu \\ + +menuDef { + name "serverinfo_popmenu" + visible 0 + fullscreen 0 + rect 158 80 320 340 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onClose { } + onOpen { uiScript ServerStatus } + onESC { close serverinfo_popmenu ; open joinserver } + + itemDef { + name window + rect 10 15 310 330 + style 1 + backcolor 0 0 0 .5 + forecolor 0 0 0 1 + visible 1 + decoration + } + + itemDef { + name window + rect 10 15 320 340 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + itemDef { + name window + rect 10 15 300 320 + style 1 + backcolor .1 .1 .37 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + itemDef { + name window + rect 10 15 300 10 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + itemDef { + name serverinfo + rect 0 20 320 20 + text "Server Information" + textstyle 3 + textalign 1 + textscale .333 + textalignx 160 + textaligny 20 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + + +// FRAME // + + + itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 184 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + itemDef { + name window + rect 256 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 128 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 0 274 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 256 274 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + + itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 0 192 16 96 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 304 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + itemDef { + name window + rect 304 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 304 192 16 96 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + + itemDef { + name window + rect 64 330 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 128 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + itemDef { + name window + rect 172 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + + + + itemDef { + name serverinfo + rect 20 55 280 230 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 16 + textscale .225 + backcolor 0 0 0 1 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + elementtype LISTBOX_TEXT + feeder FEEDER_SERVERSTATUS + notselectable + visible 1 + columns 4 2 40 20 + 40 40 10 + 90 40 10 + 135 40 20 + } + + itemDef { + name window + rect 20 55 264 230 + style 1 + backcolor 0 0 0 0 + forecolor 0 0 0 0 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + + + + + + + + + +// BUTTON // + + itemDef { + name exit + text "Exit" + type 1 + textscale .23 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 95 295 45 26 + textalign 1 + textalignx 23 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close serverinfo_popmenu ; + open joinserver } + mouseEnter { setitemcolor exit backcolor .1 .37 .1 1 } + mouseExit { setitemcolor exit backcolor .37 .1 .1 1 } + } + + itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 95 295 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 83 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 139 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + + itemDef { + name refresh + text "Refresh" + type 1 + textscale .23 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 180 295 45 26 + textalign 1 + textalignx 23 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { uiScript ServerStatus } + mouseEnter { setitemcolor refresh backcolor .1 .37 .1 1 } + mouseExit { setitemcolor refresh backcolor .37 .1 .1 1 } + } + + itemDef { + name refresh + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 180 295 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + itemDef { + name refresh + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 168 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + itemDef { + name refresh + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 224 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + + +} + + +} + + diff --git a/quake3/source/ui/serverinfo_old.menu b/quake3/source/ui/serverinfo_old.menu new file mode 100644 index 0000000..c82ea9f --- /dev/null +++ b/quake3/source/ui/serverinfo_old.menu @@ -0,0 +1,340 @@ +#include "ui/menudef.h" + +{ +\\ Server Information Popup Menu \\ + +menuDef { + name "serverinfo_popmenu" + visible 0 + fullscreen 0 + rect 158 80 320 340 + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onClose { } + onOpen { uiScript ServerStatus } + onESC { close serverinfo_popmenu ; open joinserver } + +itemDef { + name window + rect 10 15 310 330 + style 1 + backcolor 0 0 0 .5 + forecolor 0 0 0 1 + visible 1 + decoration + } +itemDef { + name window + rect 10 15 320 340 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + +itemDef { + name window + rect 10 15 300 320 + style 1 + backcolor .1 .1 .37 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + + + +itemDef { + name window + rect 10 15 300 10 + style 1 + backcolor 0 0 0 .25 + forecolor 0 0 0 1 + visible 1 + decoration + } + + itemDef { + name serverinfo + rect 0 20 320 20 + text "Server Information" + textstyle 3 + textalign 1 + textscale .333 + textalignx 160 + textaligny 20 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + + + +// FRAME // + + +itemDef { + name window + rect 0 10 64 64 + style 3 + background "ui/assets/ingameleftcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 64 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 184 10 96 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 10 64 64 + style 3 + background "ui/assets/ingamerightcorner.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 10 64 8 + style 3 + background "ui/assets/ingametop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 0 274 64 64 + style 3 + background "ui/assets/ingameleftcornerb.tga" + visible 1 + decoration + } +itemDef { + name window + rect 256 274 64 64 + style 3 + background "ui/assets/ingamerightcornerb.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 64 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 0 128 16 64 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 0 192 16 96 + style 3 + background "ui/assets/ingameleft.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 64 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + +itemDef { + name window + rect 304 128 16 64 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + +itemDef { + name window + rect 304 192 16 96 + style 3 + background "ui/assets/ingameright.tga" + visible 1 + decoration + } + + + +itemDef { + name window + rect 64 330 64 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 128 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } +itemDef { + name window + rect 172 330 98 8 + style 3 + background "ui/assets/ingamebottom.tga" + visible 1 + decoration + } + + + + + + itemDef { + name serverinfo + rect 20 55 280 230 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 120 + elementheight 16 + textscale .225 + backcolor 0 0 0 1 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + elementtype LISTBOX_TEXT + feeder FEEDER_SERVERSTATUS + notselectable + visible 1 + columns 4 2 40 20 + 40 40 10 + 90 40 10 + 135 40 20 + } + + itemDef { + name window + rect 20 55 264 230 + style 1 + backcolor 0 0 0 0 + forecolor 0 0 0 0 + border 1 + bordersize 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + + + + + + + + + + +// BUTTON // + + +itemDef { + name exit + text "Exit" + type 1 + textscale .25 + group grpControlbutton + type ITEM_TYPE_BUTTON + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 138 295 45 26 + textalign 1 + textalignx 23 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close serverinfo_popmenu ; + open joinserver } + mouseEnter { setitemcolor exit backcolor .1 .37 .1 1 } + mouseExit { setitemcolor exit backcolor .37 .1 .1 1 } + } +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 138 295 45 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 126 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + +itemDef { + name exit + group grpControlbutton + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 182 295 13 26 + visible 1 + forecolor 1 1 1 1 + decoration + } + + + + + + + +} + + +} + + diff --git a/quake3/source/ui/setup.menu b/quake3/source/ui/setup.menu new file mode 100644 index 0000000..e2ae899 --- /dev/null +++ b/quake3/source/ui/setup.menu @@ -0,0 +1,513 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "setup_menu" + visible 0 + fullscreen 1 + rect 186 0 454 480 + background "menuback_a" + focusColor 1 .75 0 1 + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + hide back_alt ; + show back ; + hide grpmessage } + onEsc { close setup_menu ; open main } + + + + +itemDef { + name solid_box + style 1 + rect 4 2 178 426 + border 1 + bordersize 1 + bordercolor .5 .5 .5 .5 + backcolor 0 0 .75 .25 + visible 1 + decoration + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .25 } + } + + + + + +// Control // + + + + +itemDef { + name controls + text "Controls" + textscale .5 + style 0 + type 1 + textstyle 6 + rect 0 75 200 40 + textalign 3 + textalignx 20 + textaligny 32 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + close control_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open control_menu } + mouseenter { show message_controls } + mouseexit { hide message_controls } + } + + + + + + +// System // + +itemDef { + name system + text "System" + style 0 + type 1 + textstyle 6 + textscale .5 + rect 0 125 200 40 + textalign 3 // center + textalignx 20 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 32 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + close control_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open system_menu } + mouseenter { show message_system } + mouseexit { hide message_system } + } + + + +// Game Options // + +itemDef { + name gameoptions + text "Game Options" + style 0 + type 1 + textstyle 6 + textscale .5 + rect 0 175 200 40 + textalign 3 // center + textalignx 20 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 32 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + close control_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open options_menu } + mouseenter { show message_gameoptions } + mouseexit { hide message_gameoptions } + } + + + + +// CD Key // + +itemDef { + name cdkey + text "Enter CD Key" + style 0 + type 1 + textscale .5 + textstyle 6 + rect 0 225 200 40 + textalign 3 // center + textalignx 20 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 32 + forecolor 1 1 1 1 + visible 1 + mouseenter { show message_cdkey } + mouseexit { hide message_cdkey } + action { play "sound/misc/kcaction.wav" ; + close control_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open cdkey_menu } + } + + + +// Reset Defaults // + +itemDef { + name defaults + text "Defaults" + style 0 + type 1 + textstyle 6 + textscale .5 + rect 0 275 200 40 + textalign 3 // center + textalignx 20 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 32 + forecolor 1 1 1 1 + visible 1 + mouseenter { show message_default } + mouseexit { hide message_default } + action { play "sound/misc/kcaction.wav" ; + close control_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open default_menu } + } + +// Reset Score // + + +itemDef { + name scores + text "Clear Scores" + style 0 + type 1 + textstyle 6 + textscale .5 + rect 0 325 200 40 + textalign 3 // center + textalignx 20 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 32 + forecolor 1 1 1 1 + visible 1 + mouseenter { show message_scores } + mouseexit { hide message_scores } + action { play "sound/misc/kcaction.wav" ; + close control_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open resetscore_menu } + } + + + +// BACK BAR // + + +itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close setup_menu ; open main } + mouseEnter { hide back ; show back_alt ; show message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { hide grpControls ; + close control_menu ; + close setup_menu ; + close system_menu ; + close options_menu ; + close cdkey_menu ; + close default_menu ; + close resetscore_menu ; + open main } + mouseExit { hide back_alt ; show back ; hide message_back } + } + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Refresh Video" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_controls + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select to Edit Game Controls" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_nowork + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Selection Isn't Implemented" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_look + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select to Edit View Controls" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_move + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select to Edit Movement Controls" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_shoot + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select to Edit Firing and Weapon Selection" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_misc + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Select to Edit Chat and Mouse Functions" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_system + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Edit System Settings" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_gameoptions + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Edit Game Options" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_cdkey + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Enter Encryption Key" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_default + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Reset to Default Settings" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_scores + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .4 + text "Clear High Scores to Zero" + forecolor 1 1 1 1 + decoration + visible 0 + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + +} + + +} diff --git a/quake3/source/ui/skirmish.menu b/quake3/source/ui/skirmish.menu new file mode 100644 index 0000000..10b5a87 --- /dev/null +++ b/quake3/source/ui/skirmish.menu @@ -0,0 +1,1655 @@ +#include "ui/menudef.h" + +{ +\\ skirmish\\ + + menuDef { + name "skirmish" + visible 0 + fullscreen 1 + rect 0 0 640 480 + background "menuback_a" + focusColor 1 .75 0 1 + style 1 + fadeClamp 1.0 + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 + onEsc { close skirmish ; open main } + onOpen { + setitemcolor fadebox backcolor 0 0 0 1 ; + playlooped "music/fla_mp03.wav" ; + fadeout fadebox ; + uiScript loadGameInfo ; + uiScript updateSPMenu ; + hide lightning ; + hide accept_alt ; + show accept ; + hide back_alt ; + show back ; + hide grpmessage } + + + + + + + + + + + + + +// GAMETYPE BAR // + + + +itemDef { + name gametypebar + style 2 + rect 0 5 640 40 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_GAMETYPE + textstyle 6 + text "Type:" + rect 0 10 213 31 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 26 + textscale .35 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { fadein message_type } + mouseExit { fadeout message_type } + } + + itemDef { + name opposingteamfield + text "Opponent: " + ownerdraw UI_OPPONENT_NAME + textstyle 6 + rect 213 10 213 31 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 26 + textscale .35 + forecolor 1 1 1 1 + visible 1 + cvarTest "ui_gametype" + hideCvar { "1" } + action { play "sound/misc/kcaction.wav" } + mouseenter { show message_opponent } + mouseexit { hide message_opponent } + } + + +itemDef { + name gametypefield + style 0 + ownerdraw UI_SKILL + textstyle 6 + text "Skill:" + rect 426 10 213 31 + textalign ITEM_ALIGN_LEFT + textalignx 20 + textaligny 26 + textscale .35 + forecolor 1 1 1 1 + border 0 + bordercolor 0 0 0 0 + visible 1 + action { play "sound/misc/kcaction.wav" } + mouseEnter { fadein message_skill } + mouseExit { fadeout message_skill } + } + +// DECORATIVE // + + +itemDef { + name mappreview + ownerdraw UI_MAPCINEMATIC + rect 320 170 320 192 + backcolor 1 1 1 .25 + decoration + visible 1 + } + +itemDef { + name mappscreen + style 3 + background "menuscreen" + rect 320 170 320 192 + visible 1 + decoration + } + + + + +itemDef { + name window + rect 0 170 640 192 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration + } + +// MAP INFORMATION BARS // + +itemDef { + name mapinfo + style WINDOW_STYLE_SHADER + rect 0 172 20 82 + background "ui/assets/mapinfo.tga" + forecolor .5 .5 .5 .5 + visible 1 + decoration + } + +itemDef { + name score + style WINDOW_STYLE_SHADER + rect 0 260 20 100 + background "ui/assets/score.tga" + forecolor .5 .5 .5 .5 + visible 1 + decoration + } + +itemDef { + name window + rect 0 255 320 5 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration + } + +// CENTER IMAGE AND INFORMATION // + +itemDef { + name menuback_e + style WINDOW_STYLE_SHADER + rect 254 194 140 140 + background "centerconsole" + visible 1 + decoration + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + rect 264 200 120 120 + cvarTest "ui_gametype" + hideCvar { "1" } + visible 1 + forecolor .7 .7 1 .25 + decoration + } + +itemDef { + name mappscreen + style 3 + background menuscreen + rect 254 194 140 140 + visible 1 + decoration + } + +itemDef { + name menuback_e + group grpCenter + style WINDOW_STYLE_SHADER + rect 254 194 140 140 + background "centerconsole" + visible 1 + decoration + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + cvarTest "ui_gametype" + hideCvar { "1" } + rect 264 200 120 120 + visible 1 + forecolor .7 .7 1 .25 + decoration + } + +itemDef { + name mappscreen + group grpCenter + style 3 + background menuscreen + rect 254 194 140 140 + visible 1 + decoration + } + +itemDef { + name level_info + group grplevelinfo2 + textscale .35 + text "Best Score" + rect 258 250 128 20 + textalign 1 + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 12 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + +// CENTER INFORMATION FOR NEW HIGH SCORE // + + +itemDef { + name backwindow + style WINDOW_STYLE_FILLED + rect 254 194 140 140 + ownerdrawflag UI_SHOW_NEWHIGHSCORE + backcolor 0 0 0 1 + forecolor 0 0 0 1 + visible 1 + decoration + } + +itemDef { + name menuback_e + style WINDOW_STYLE_SHADER + ownerdrawflag UI_SHOW_NEWHIGHSCORE + rect 254 194 140 140 + background "centerconsole" + visible 1 + decoration + } + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO_METAL + cvarTest "ui_gametype" + hideCvar { "1" } + rect 264 200 120 120 + ownerdrawflag UI_SHOW_NEWHIGHSCORE + visible 1 + forecolor .7 .7 1 .25 + decoration + } + +itemDef { + name mappscreen + style 3 + background menuscreen + ownerdrawflag UI_SHOW_NEWHIGHSCORE + rect 254 190 140 150 + visible 1 + decoration + } + +itemDef { + name level_info + group grplevelinfo2 + textstyle ITEM_TEXTSTYLE_BLINK + textscale .35 + text "New High Score" + rect 258 248 128 20 + ownerdrawflag UI_SHOW_NEWHIGHSCORE + textalign 1 + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 12 + backcolor 0 0 0 0 + forecolor 1 0 0 1 + decoration + visible 1 + } + +itemDef { + name menuback_g + style WINDOW_STYLE_SHADER + rect 215 160 215 212 + background "menuback_g" + visible 1 + decoration + } + + +// SCORE INFORMATION // + + +itemDef { + name level_info + group grplevelinfo2 + textscale .3 + text "" + type ITEM_TYPE_EDITFIELD + cvar "ui_scoreScore" + rect 258 265 128 20 + textalign 1 + textalignx 64 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 12 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + decoration + visible 1 + } + + + +// AWARDS TEAM GAME // + +itemdef { + name medal_assist_team + rect 185 380 30 30 + type ITEM_TYPE_EDITFIELD + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + cvar "ui_scoreAssists" + ownerdrawflag UI_SHOW_ANYTEAMGAME + textscale .22 + textalign 1 + text "" + textalignx 15 + textaligny 40 + visible 1 + decoration + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_assist } + mouseexit { hide message_assist } + } + + +itemdef { + name medal_accuracy_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreAccuracy" + rect 225 380 30 30 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_accuracy } + mouseexit { hide message_accuracy } + } + + +itemdef { + name medal_excellent_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreExcellents" + rect 265 380 30 30 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_excellent } + mouseexit { hide message_excellent } + } + + +itemdef { + name medal_gauntlet_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreGauntlets" + rect 305 380 30 30 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_gauntlet } + mouseexit { hide message_gauntlet } + } + + +itemdef { + name medal_impressive_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreImpressives" + rect 345 380 30 30 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_impressive } + mouseexit { hide message_impressive } + } + +itemdef { + name medal_defend_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreDefends" + rect 385 380 30 30 + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_defend } + mouseexit { hide message_defend } + } + +itemdef { + name medal_capture_team + style WINDOW_STYLE_SHADER + cvar "ui_scoreCaptures" + rect 425 380 30 30 + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + textscale .22 + mouseenter { show message_capture } + mouseexit { hide message_capture } + } + + + + + +// AWARDS NONTEAM GAME // + + +itemdef { + name medal_perfect_nonteam + rect 230 380 30 30 + type ITEM_TYPE_EDITFIELD + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + cvar "ui_scorePerfect" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + textscale .22 + textalign 1 + text "" + textalignx 15 + textaligny 40 + visible 1 + decoration + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_perfect } + mouseexit { hide message_perfect } + } + +itemdef { + name medal_accuracy_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreAccuracy" + rect 270 380 30 30 + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_accuracy } + mouseexit { hide message_accuracy } + } + + +itemdef { + name medal_excellent_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreExcellents" + rect 310 380 30 30 + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_excellent } + mouseexit { hide message_excellent } + } + + + + +itemdef { + name medal_gauntlet_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreGauntlets" + rect 350 380 30 30 + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_gauntlet } + mouseexit { hide message_gauntlet } + } + + +itemdef { + name medal_impressive_nonteam + style WINDOW_STYLE_SHADER + cvar "ui_scoreImpressives" + rect 390 380 30 30 + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + visible 1 + decoration + type ITEM_TYPE_EDITFIELD + textalign 1 + text "" + textalignx 15 + textaligny 40 + textscale .22 + border 1 + bordersize 1 + bordercolor 1 1 1 0 + mouseenter { show message_impressive } + mouseexit { hide message_impressive } + } + + + +// SOUND BUTTON // + + +itemdef { + name medal_assist_window + rect 183 378 34 34 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_assist.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + type 1 + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_assist_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_assist_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_assist.wav" } + } + +itemdef { + name medal_accuracy_window + rect 223 378 34 34 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + type 1 + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_accuracy_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_accuracy_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_accuracy.wav" } + } +itemdef { + name medal_excellent_window + rect 263 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_excellent.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_excellent_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_excellent_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_excellent.wav" } + } +itemdef { + name medal_gauntlet_window + rect 303 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_gauntlet_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_gauntlet_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_gauntlet.wav" } + } +itemdef { + name medal_impressive_window + rect 343 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_impressive_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_impressive_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_impressive.wav" } + } +itemdef { + name medal_defend_window + rect 383 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_defend.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_defend_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_defend_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_defense.wav" } + } +itemdef { + name medal_capture_window + rect 423 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_capture.tga" + ownerdrawflag UI_SHOW_ANYTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_capture_team forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_capture_team forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_captures.wav" } + } + + + + + + + + +itemdef { + name medal_perfect_window + rect 228 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_perfect.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_perfect_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_perfect_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/perfect.wav" } + } + +itemdef { + name medal_accuracy_window + rect 268 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_accuracy.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_accuracy_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_accuracy_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_accuracy.wav" } + } + + + +itemdef { + name medal_excellent_window + rect 308 378 34 34 + type 1 + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + style WINDOW_STYLE_SHADER + background "ui/assets/medal_excellent.tga" + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_excellent_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_excellent_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_excellent.wav" } + } + + +itemdef { + name medal_gauntlet_window + rect 348 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_gauntlet.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_gauntlet_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_gauntlet_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_gauntlet.wav" } + } + + +itemdef { + name medal_impressive_window + rect 388 378 34 34 + type 1 + style WINDOW_STYLE_SHADER + background "ui/assets/medal_impressive.tga" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + border 1 + bordercolor .5 .5 .5 0 + forecolor 1 1 1 0 + backcolor 1 1 1 0 + visible 1 + mouseenter { setitemcolor medal_impressive_nonteam forecolor 0 0 0 0 ; setcolor forecolor 1 1 1 1 } + mouseexit { setitemcolor medal_impressive_nonteam forecolor 1 1 1 1 ; setcolor forecolor 1 1 1 0 } + action { exec "play sound/feedback/voc_menu_impressive.wav" } + } + + + + +// MAP SETTINGS // + + itemDef { + name opposingteamfield + text "Map:" + ownerdraw UI_MAPS_SELECTION + rect 120 185 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + decoration + visible 1 + } + + + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Frag limit:" + cvar "ui_fraglimit" + ownerdrawflag UI_SHOW_ANYNONTEAMGAME + rect 120 200 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Capture limit:" + cvar "ui_capturelimit" + ownerdrawflag UI_SHOW_ANYTEAMGAME + rect 120 200 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + ownerdraw UI_MAP_TIMETOBEAT + text "Time to Beat:" + rect 120 215 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Skill Multiplier:" + cvar "g_spSkill" + rect 120 230 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Game Score:" + cvar "ui_scoreTeam" + rect 120 265 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Completion Time:" + cvar "ui_scoreTime" + rect 120 278 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Base Score:" + cvar "ui_scoreBase" + rect 120 291 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + + itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Time Bonus:" + cvar "ui_scoreTimeBonus" + rect 120 304 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Shutout Bonus:" + cvar "ui_scoreShutoutBonus" + rect 120 317 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Skill Bonus:" + cvar "ui_scoreSkillBonus" + rect 120 330 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } +itemDef { + name normal + group grpsettings + type ITEM_TYPE_NUMERICFIELD + text "Total Score:" + cvar "ui_scoreScore" + rect 120 343 128 12 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 12 + textscale .25 + forecolor 1 1 1 1 + visible 1 + decoration + mouseenter { } + mouseexit { } + } + +itemDef { + name recordDemo + type ITEM_TYPE_YESNO + text "Record Game:" + cvar "ui_recordSPDemo" + rect 120 380 64 30 + textalign ITEM_ALIGN_RIGHT + textalignx 0 + textaligny 22 + textscale .333 + forecolor 1 1 1 1 + forecolor 1 1 1 1 + visible 1 + action { play "sound/misc/nomenu.wav" } + mouseEnter { show message_recordDemo } + mouseExit { hide message_recordDemo} + } + + + + + + +// LEVEL SELECTION // + + + +itemDef { + name maplist + rect 119 60 403 91 + type ITEM_TYPE_LISTBOX + style WINDOW_STYLE_FILLED + elementwidth 100 + elementheight 75 + elementtype LISTBOX_IMAGE + feeder FEEDER_MAPS + horizontalscroll + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + visible 1 + mouseenter { setitemcolor maplist bordercolor .7 0 0 1 ; show message_arena } + mouseexit { setitemcolor maplist bordercolor .5 .5 .5 .5 ; hide message_arena } +/* + // demo_only + cvarTest "ui_gametype" + hideCvar { "1" } +*/ + } + +/* + +// DEMO ONLY OPTION // + +itemDef { + name demo_only + text "Opponent: " + text "Tournament Maps are Not Available in Demo." + textstyle 3 + rect 119 60 403 91 + textalign ITEM_ALIGN_CENTER + textalignx 200 + textaligny 26 + textscale .35 + forecolor 1 1 1 1 + visible 1 + decoration + cvarTest "ui_gametype" + showCvar { "1" } + } +*/ + + + + +// TEAM LOGOS // + +itemDef { + name playerlogo + ownerdraw UI_PLAYERLOGO_METAL + cvarTest "ui_gametype" + hideCvar { "1" } + rect 30 60 80 80 + visible 1 + forecolor 1 .7 .7 1 + decoration + } + +itemDef { + name modelselection + ownerdraw UI_PLAYERMODEL + cvarTest "ui_gametype" + showCvar { "1" } + rect 10 40 140 140 + style 1 + decoration + visible 1 + } + +itemDef { + name opposinglogo + ownerdraw UI_OPPONENTLOGO_METAL + cvarTest "ui_gametype" + hideCvar { "1" } + rect 530 60 80 80 + visible 1 + forecolor .7 .7 1 1 + decoration + } +itemDef { + name modelselection + ownerdraw UI_OPPONENTMODEL + cvarTest "ui_gametype" + showCvar { "1" } + rect 510 40 140 140 + style 1 + decoration + visible 1 + } + +itemDef { + name playDemobttn + group grpbttn + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + text "No Demo" + rect 500 385 100 26 + textalign 1 + textalignx 50 + textaligny 20 + textscale .25 + decoration + forecolor .5 .5 .5 1 + backcolor .17 .05 .05 1 + visible 1 + } + + +itemDef { + name playDemobttn + group grpbttn + type 1 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + text "View Last Game" + rect 500 385 100 26 + textalign 1 + textalignx 50 + textaligny 20 + textscale .25 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + ownerdrawflag UI_SHOW_DEMOAVAILABLE + action { play "sound/misc/kcaction.wav" ; + hide grphelptext ; uiScript RunSPDemo } + mouseEnter { setitemcolor playDemobttn backcolor .1 .37 .1 1 ; show demo_message } + mouseExit { setitemcolor playDemobttn backcolor .37 .1 .1 1 ; hide demo_message } + } + +itemDef { + name playDemo + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 500 385 100 26 + visible 1 + decoration + } + +itemDef { + name playDemo + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 488 385 13 26 + visible 1 + decoration + } + +itemDef { + name playDemo + group grpbttn + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 599 385 13 26 + visible 1 + decoration + } + + + + + + + + +// BACK BAR // + + + itemDef { + name gotobar + style 2 + rect 0 430 640 30 + textscale 0.4 + textalign 0 // center + textalignx 60 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 21 + style 2 + border 4 + bordercolor 0.5 0.5 0.5 0.5 + bordersize 2 + backcolor 0 0 .75 0.5 + visible 1 + mouseEnter { setcolor backcolor .75 0 0 .5 } + mouseExit { setcolor backcolor 0 0 .75 .5 } + decoration + } + + itemDef { + name back + style 3 + background "ui/assets/backarrow.tga" + rect 16 424 50 50 + visible 1 + action { close skirmish ; open main } + mouseEnter { hide back ; show back_alt ; fadein message_back } + } + +itemDef { + name back_alt + style WINDOW_STYLE_SHADER + background "ui/assets/backarrow_alt.tga" + rect 14 422 54 54 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + mouseExit { hide back_alt ; show back ; fadeout message_back } + action { close skirmish ; open main } + } + +itemDef { + name accept + style 3 + rect 574 424 50 50 + background "ui/assets/forwardarrow.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + mouseEnter { show lightning ; hide accept ; show accept_alt ; fadein message_accept ; playlooped "sound/misc/loop_electricity_05.wav" } + action { uiScript skirmishStart } +/* + // demo_only + cvarTest "ui_gametype" + hideCvar { "1" } +*/ + } + +itemDef { + name accept_alt + style 3 + rect 572 422 54 54 + background "ui/assets/forwardarrow_alt.tga" + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 0 + type ITEM_TYPE_BUTTON + action { uiScript skirmishStart } + mouseExit { hide lightning ; hide accept_alt ; show accept ; fadeout message_accept ; playlooped "music/fla_mp03.wav" } +/* + // demo_only + cvarTest "ui_gametype" + hideCvar { "1" } +*/ + } + + + itemDef { + name lightning + style 3 + background lightningkc + rect 46 385 236 128 + visible 0 + decoration + } +itemDef { + name lightning + style 3 + background lightningkc + rect 355 385 236 128 + visible 0 + decoration + } + + + +// MESSAGES // + +itemDef { + name message_back + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Exit to Main Menu" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_accept + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Enter Arena" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_type + group grpmessage + style 0 + rect 320 430 128 30 + textalign 1 + textstyle 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Select Gametype" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_skill + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Set Skill Level" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_arena + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Choose Your Arena" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name message_assist + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Assist" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_perfect + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Perfect" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_accuracy + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Accuracy" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_defend + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Defense" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_excellent + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Excellent" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_gauntlet + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Gauntlet" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_impressive + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Impressive" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_capture + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Captures" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_opponent + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Cycle through Opponent Clans" + forecolor 1 1 1 1 + decoration + visible 0 + } +itemDef { + name message_recordDemo + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "Record Next Game" + forecolor 1 1 1 1 + decoration + visible 0 + } + +itemDef { + name demo_message + group grpmessage + style 0 + rect 320 430 128 30 + textstyle 1 + textalign 1 + textalignx 0 + textaligny 25 + textscale .416 + text "View Last Recorded Game for this Map" + forecolor 1 1 1 1 + decoration + visible 0 + } + + + + + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + +} + +} + + + + + + + diff --git a/quake3/source/ui/small.menu b/quake3/source/ui/small.menu new file mode 100644 index 0000000..1624f60 --- /dev/null +++ b/quake3/source/ui/small.menu @@ -0,0 +1,796 @@ +#include "ui/menudef.h" + +// team menu +// +// defines from ui_shared.h +/* +#define ITEM_TYPE_TEXT 0 // simple text +#define ITEM_TYPE_BUTTON 1 // button, basically text with a border +#define ITEM_TYPE_RADIOBUTTON 2 // toggle button, may be grouped +#define ITEM_TYPE_CHECKBOX 3 // check box +#define ITEM_TYPE_TEXTFIELD 4 // editable text, associated with a cvar +#define ITEM_TYPE_COMBO 5 // drop down list +#define ITEM_TYPE_LISTBOX 6 // scrollable list +#define ITEM_TYPE_MODEL 7 // model +#define ITEM_TYPE_OWNERDRAW 8 // owner draw, name specs what it is + +#define ITEM_ALIGN_LEFT 0 // left alignment +#define ITEM_ALIGN_CENTER 1 // center alignment +#define ITEM_ALIGN_RIGHT 2 // right alignment + +#define ITEM_TEXTSTYLE_NORMAL 0 // normal text +#define ITEM_TEXTSTYLE_BLINK 1 // fast blinking +#define ITEM_TEXTSTYLE_PULSE 2 // slow pulsing +#define ITEM_TEXTSTYLE_SHADOWED 3 // drop shadow ( need a color for this ) +#define ITEM_TEXTSTYLE_OUTLINED 4 // drop shadow ( need a color for this ) +#define ITEM_TEXTSTYLE_OUTLINEDSHADOWED 5 // drop shadow ( need a color for this ) + +#define WINDOW_BORDER_NONE 0 // no border +#define WINDOW_BORDER_FULL 1 // full border based on border color ( single pixel ) +#define WINDOW_BORDER_HORZ 2 // horizontal borders only +#define WINDOW_BORDER_VERT 3 // vertical borders only +#define WINDOW_BORDER_KCGRADIENT 4 // horizontal border using the gradient bars + +#define WINDOW_STYLE_EMPTY 0 // no background +#define WINDOW_STYLE_FILLED 1 // filled with background color +#define WINDOW_STYLE_GRADIENT 2 // gradient bar based on background color +#define WINDOW_STYLE_SHADER 3 // gradient bar based on background color + +#define MENU_TRUE 1 // uh.. true +#define MENU_FALSE 0 // and false + +#define WINDOW_MOUSEOVER 0x00000001 // mouse is over it, non exclusive +#define WINDOW_HASFOCUS 0x00000002 // has cursor focus, exclusive +#define WINDOW_VISIBLE 0x00000004 // is visible +#define WINDOW_GREY 0x00000008 // is visible but grey ( non-active ) +#define WINDOW_DECORATION 0x00000010 // for decoration only, no mouse, keyboard, etc.. +#define WINDOW_FADINGOUT 0x00000020 // fading out, non-active +#define WINDOW_FADINGIN 0x00000040 // fading in +#define WINDOW_MOUSEOVERTEXT 0x00000080 // mouse is over it, non exclusive +#define WINDOW_INTRANSITION 0x00000100 // window is in transition +#define WINDOW_FORECOLORSET 0x00000200 // forecolor was explicitly set ( used to color alpha images or not ) + +// cg owner draw types +// ideally these should be done outside of this file but +// this makes it much easier for the macro expansion to +// convert them for the designers ( from the .menu files ) +// cg owner draw types +// ideally these should be done outside of this file but +// this makes it much easier for the macro expansion to +// convert them for the designers ( from the .menu files ) + +#define CG_PLAYER_ARMOR_ICON 1 +#define CG_PLAYER_ARMOR_VALUE 2 +#define CG_PLAYER_HEAD 3 +#define CG_PLAYER_HEALTH 4 +#define CG_PLAYER_AMMO_ICON 5 +#define CG_PLAYER_AMMO_VALUE 6 + +#define CG_SELECTEDPLAYER_HEAD 7 +#define CG_SELECTEDPLAYER_NAME 8 +#define CG_SELECTEDPLAYER_LOCATION 9 +#define CG_SELECTEDPLAYER_STATUS 10 +#define CG_SELECTEDPLAYER_WEAPON 11 +#define CG_SELECTEDPLAYER_POWERUP 12 + +#define CG_FLAGCARRIER_HEAD 13 +#define CG_FLAGCARRIER_NAME 14 +#define CG_FLAGCARRIER_LOCATION 15 +#define CG_FLAGCARRIER_STATUS 16 +#define CG_FLAGCARRIER_WEAPON 17 +#define CG_FLAGCARRIER_POWERUP 18 + +#define CG_PLAYER_ITEM 19 +#define CG_PLAYER_SCORE 20 + +#define CG_BLUE_FLAGHEAD 21 +#define CG_BLUE_FLAGSTATUS 22 +#define CG_BLUE_FLAGNAME 23 +#define CG_RED_FLAGHEAD 24 +#define CG_RED_FLAGSTATUS 25 +#define CG_RED_FLAGNAME 26 + +#define CG_BLUE_SCORE 27 +#define CG_RED_SCORE 28 +#define CG_RED_NAME 29 +#define CG_BLUE_NAME 30 +#define CG_HARVESTER_SKULLS 31 +#define CG_ONEFLAG_STATUS 32 +#define CG_PLAYER_LOCATION 33 +#define CG_TEAM_COLOR 34 +#define CG_CTF_POWERUP 35 + +#define CG_AREA_POWERUP 36 +#define CG_AREA_LAGOMETER 37 + +#define CG_PLAYER_HASFLAG 38 +#define CG_TEAM_COLOR 39 + + +// display flags +#define CG_SHOW_BLUE_TEAM_HAS_REDFLAG 0x00000001 +#define CG_SHOW_RED_TEAM_HAS_BLUEFLAG 0x00000002 +#define CG_SHOW_ANYTEAMGAME 0x00000004 +#define CG_SHOW_HARVESTER 0x00000008 +#define CG_SHOW_ONEFLAG 0x00000010 +#define CG_SHOW_CTF 0x00000020 +#define CG_SHOW_OBELISK 0x00000040 +#define CG_SHOW_HEALTHCRITICAL 0x00000080 +#define CG_SHOW_SINGLEPLAYER 0x00000100 +#define CG_SHOW_TOURNAMENT 0x00000200 +#define CG_SHOW_DURINGINCOMINGVOICE 0x00000400 +#define CG_SHOW_IF_PLAYER_HAS_FLAG 0x00000800 +#define CG_SHOW_LANPLAYONLY 0x00001000 +#define CG_SHOW_2DONLY 0x10000000 + + + +*/ + + +{ + assetGlobalDef { + font "fonts/impact.ttf" // font + cursor "menu/art/3_cursor2" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowX 5 // x amount for shadow offset + shadowY 5 // y amount for shadow offset + shadowColor 0.1 0.1 0.1 0.25 // shadow color + + hudShader "ui/assets/hudbar.tga" // + + } + + + +// POWERUP AREA // + +menuDef { + name "powerup area" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 570 220 50 100 + + itemDef { + name "powerupArea" + rect 0 0 40 40 + visible 1 + decoration + ownerdraw CG_AREA_POWERUP + special 4 + align HUD_VERTICAL + } + +} + + + +// MINI_SELECTPLAYER // + + +menuDef { + name "miniSelectPlayer" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 3 447 155 30 + + itemDef { + name "miniSelectPlayerRect" + fullScreen MENU_FALSE + visible 1 + rect 0 0 155 30 + style 4 + border 1 + bordersize 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { show miniSelectPlayerRectAlt } + mouseExit { hide miniSelectPlayerRectAlt } + } + + itemDef { + name "miniSelectPlayerRectAlt" + fullScreen MENU_FALSE + visible 0 + rect 0 0 155 30 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + itemDef { + name "b" + rect 3 4 25 25 + visible 1 + ownerdraw CG_SELECTEDPLAYER_HEAD + action { open altteamMenu } + } + + itemDef { + name "b" + rect 33 7 20 20 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_STATUS + } + + itemDef { + name "b" + rect 65 4 20 10 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedhealth.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_HEALTH + } + + itemDef { + name "b" + rect 65 17 20 10 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedarmor.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_ARMOR + } + + + itemDef { + name "b" + rect 90 7 20 20 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_WEAPON + } + + itemDef { + name "b" + rect 125 7 20 20 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_POWERUP + } +} + + + + +// MINI_STATUS // + +menuDef { + name "miniPlayerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 162 447 155 30 + + + itemDef { + name "miniPlayerStatusRect" + fullScreen MENU_FALSE + visible 1 + rect 0 0 155 30 + style 4 + border 1 + bordersize 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { show miniPlayerStatusRectAlt } + mouseExit { hide miniPlayerStatusRectAlt } + } + + itemDef { + name "miniPlayerStatusRectAlt" + fullScreen MENU_FALSE + visible 0 + rect 0 0 155 30 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + itemDef { + name "miniAmmoValue" + rect 10 7 25 15 + visible 1 + decoration + textscale .33 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 1 .75 0 1 + } + + +itemDef { + name "miniHealthValue" + rect 60 7 25 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .33 + ownerdraw CG_PLAYER_HEALTH + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } + +itemDef { + name "MiniArmorValue" + rect 110 7 25 15 + visible 1 + decoration + textscale .33 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } +} + + + + +// MINI_ITEMS // + +menuDef { + name "miniItems" + fullScreen MENU_FALSE + visible MENU_TRUE + style 4 + rect 321 447 155 30 + + itemDef { + name "miniItemRect" + fullScreen MENU_FALSE + visible 1 + rect 0 0 155 30 + style 4 + border 1 + bordersize 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { show miniItemRectAlt } + mouseExit { hide miniItemRectAlt } + } + + itemDef { + name "miniITemRectAlt" + fullScreen MENU_FALSE + visible 0 + rect 0 0 155 30 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + itemDef { + name "b" + rect 5 6 20 20 + visible 1 + decoration + ownerdraw CG_PLAYER_STATUS + } + + itemDef { + name "b" + rect 45 6 20 20 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + + itemDef { + name "b" + rect 80 6 20 20 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + } + + itemDef { + name "flag" + rect 120 4 25 25 + visible 1 + decoration + ownerdraw CG_PLAYER_HASFLAG + } + + + +} + +// MINI_CTF_STATUS // + +menuDef { + name "miniCTFStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + style 4 + rect 480 447 155 30 + + itemDef { + name "miniCTFStatusRect" + fullScreen MENU_FALSE + visible 1 + rect 0 0 155 30 + style 4 + border 1 + bordersize 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { show miniCTFStatusRectAlt } + mouseExit { hide miniCTFStatusRectAlt } + } + + itemDef { + name "miniCTFStatusRectAlt" + fullScreen MENU_FALSE + visible 0 + rect 0 0 155 30 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "f" + rect 8 6 20 20 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/bluechip.tga" + } + +itemDef { + name "miniFlagBlue" + rect 8 6 20 20 + visible 1 + decoration + ownerdraw CG_BLUE_FLAGSTATUS + } + +itemDef { + name "miniBlueScore" + rect 25 7 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.33 + ownerdraw CG_BLUE_SCORE + } + +itemDef { + name "f" + rect 85 6 20 20 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/redchip.tga" + } + +itemDef { + name "miniFlagRed" + rect 85 6 20 20 + visible 1 + decoration + ownerdraw CG_RED_FLAGSTATUS + } + +itemDef { + name "miniRedScore" + rect 100 7 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.33 + ownerdraw CG_RED_SCORE + } + +} + +{ + menuDef { + name "altTeamMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 300 80 132 + style WINDOW_STYLE_FILLED + backcolor 0 0 0.8 .25 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 1 1 + + itemDef { + name "Possess" + text "Possess" + textaligny 10 + textalign ITEM_ALIGN_LEFT + rect 5 5 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show pbar } + } + + itemDef { + name "pbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 5 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Follow" + text "Follow" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 17 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show fbar } + } + + itemDef { + name "fbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 17 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Go To" + text "Go To" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 29 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show gbar } + } + + itemDef { + name "gbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 29 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Get" + text "Get" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 41 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show g2bar } + action { open altGetMenu } + } + + itemDef { + name "g2bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 41 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Patrol From" + text "Patrol From" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 53 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show p2bar } + } + + itemDef { + name "p2bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 53 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Patrol To" + text "Patrol To" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 65 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show p3bar } + } + + itemDef { + name "p3bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 65 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Camp Near" + text "Camp Near" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 77 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show cbar } + } + + itemDef { + name "cbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 75 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Defend" + text "Defend" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 89 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show dbar } + } + + itemDef { + name "dbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 89 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Attack" + text "Attack" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 101 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show abar } + } + + itemDef { + name "abar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 101 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Drop Command" + text "Drop Command" + textaligny 10 + textalign ITEM_ALIGN_Left + rect 5 113 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show dcbar } + } + + itemDef { + name "dcbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 113 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + } + + +menuDef { + name "altGetMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 86 338 85 35 + style WINDOW_STYLE_FILLED + backcolor 0 0 0.8 .25 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 1 1 + + itemDef { + name "Enemy Flag" + text "Enemy Flag" + textaligny 10 + textalign ITEM_ALIGN_LEFT + rect 5 3 80 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight2 ; show efbar } + action { close altGetMenu ; close altTeamMenu ; orders get flag } + + } + itemDef { + name "efbar" + group "highlight2" + style WINDOW_STYLE_FILLED + rect 0 3 84 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + itemDef { + name "Rocket Launcher" + text "Rocket Launcher" + textaligny 10 + textalign ITEM_ALIGN_LEFT + rect 5 17 80 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight2 ; show rlbar } + action { close altGetMenu ; close altTeamMenu ; orders get rocketlauncher } + + } + itemDef { + name "rlbar" + group "highlight2" + style WINDOW_STYLE_FILLED + rect 0 17 84 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + + } + +} + diff --git a/quake3/source/ui/system.menu b/quake3/source/ui/system.menu new file mode 100644 index 0000000..5cb9622 --- /dev/null +++ b/quake3/source/ui/system.menu @@ -0,0 +1,676 @@ +#include "ui/menudef.h" + +{ +\\ SETUP MENU \\ + +menuDef { + name "system_menu" + visible 0 + fullscreen 0 + rect 186 0 443 426 + focusColor 1 .75 0 1 + style 1 + border 1 + onOpen { setitemcolor fadebox backcolor 0 0 0 1 ; fadeout fadebox ; hide grpSystem ; show graphics } + onEsc { close system_menu ; close setup_menu ; open main } + + +itemDef { + name window + group grpSystembutton + rect 0 2 443 426 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 1 + decoration +} + + + + +// System // + +itemDef { + name ctr_graphics + text "Graphics" + type 1 + textscale .3 + group grpSystembutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 56 395 100 26 + textalign 1 + textalignx 50 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpSystem ; show graphics } + mouseEnter { show message_graphics ; setitemcolor ctr_graphics backcolor .1 .37 .1 1 } + mouseExit { hide message_graphics ; setitemcolor ctr_graphics backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_graphics + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 56 395 100 26 + visible 1 + decoration + } + +itemDef { + name ctr_graphics + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 44 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_graphics + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 155 395 13 26 + visible 1 + decoration + } + + + itemDef { + name graphics + group grpSystem + text "Quality:" + type ITEM_TYPE_MULTI + cvar "ui_glCustom" + cvarFloatList { "High Quality" 0 "Normal" 1 "Fast" 2 "Fastest" 3 "Custom" 4 } + rect 99 42 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript update "ui_glCustom" } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_EDITFIELD + text "GL Driver:" + cvar "r_gldriver" + rect 99 67 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + decoration + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_YESNO + text "GL Extensions:" + cvar "r_allowExtensions" + rect 99 92 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Video Mode:" + cvar "r_mode" + cvarFloatList { "320*240" 0 "400*300" 1 "512*384" 2 "640*480" 3 "800*600" 4 "960*720" 5 "1024*768" 6 "1152*864" 7 "1280*1024" 8 "1600*1200" 9 "2048*1536" 10 "856*480 Wide Screen" 11 } + rect 99 117 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Color Depth:" + cvar "r_colorbits" + cvarFloatList { "Desktop Default" 0 "16-bit" 16 "32-bit" 32 } + rect 99 142 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom ; uiScript update "r_colorbits" } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_YESNO + text "Fullscreen:" + cvar "r_fullscreen" + rect 99 167 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Lighting:" + cvar "r_vertexlight" + cvarFloatList { "Light Map (high)" 0 "Vertex (low)" 1 } + rect 99 192 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Geometric Detail:" + cvar "r_lodbias" + cvarFloatList { "High" 0 "Medium" 1 "Low" 2 } + rect 99 217 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom ; uiScript update "r_lodbias" } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Texture Detail:" + cvar "r_picmip" + cvarFloatList { "Low" 2 "Normal" 1 "High" 0 } + rect 99 242 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Texture Quality:" + cvar "r_texturebits" + cvarFloatList { "Default" 0 "16 bit" 16 "32 bit" 32 } + rect 99 269 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_MULTI + text "Texture Filter:" + cvar "r_texturemode" + cvarStrList { "Bilinear", "GL_LINEAR_MIPMAP_NEAREST", "Trilinear", "GL_LINEAR_MIPMAP_LINEAR" } + rect 99 294 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + itemDef { + name graphics + group grpSystem + type ITEM_TYPE_YESNO + text "Compress Textures:" + cvar "r_ext_compressed_textures" + rect 99 319 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript glCustom } + } + +itemDef { + name graphics + text "Apply" + type 1 + group grpSystem + textscale .3 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 181 357 100 26 + textalign 1 + textalignx 50 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + open vid_restart_popmenu } + mouseEnter { setitemcolor graphics backcolor .1 .37 .1 1 } + mouseExit { setitemcolor graphics backcolor .37 .1 .1 1 } + } + + itemDef { + name graphics + group grpSystem + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 181 357 100 26 + visible 1 + decoration + } + + itemDef { + name graphics + group grpSystem + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 169 357 13 26 + visible 1 + decoration + } + + itemDef { + name graphics + group grpSystem + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 280 357 13 26 + visible 1 + decoration + } + + + + + +itemDef { + name ctr_driver + text "Driver Info" + type 1 + textscale .3 + group grpSystembutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 181 395 100 26 + textalign 1 + textalignx 50 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpSystem ; show driver } + mouseEnter { show message_driver ; setitemcolor ctr_driver backcolor .1 .37 .1 1 } + mouseExit { hide message_driver ; setitemcolor ctr_driver backcolor .37 .1 .1 1 } + } + +itemDef { + name ctr_driver + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 181 395 100 26 + visible 1 + decoration + } + +itemDef { + name ctr_driver + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 169 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_driver + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 280 395 13 26 + visible 1 + decoration + } + + itemDef { + name driver + group grpSystem + rect 0 32 454 256 + text "Driver Information" + textalign 1 + textscale .333 + textalignx 227 + textaligny 23 + forecolor 1 1 1 1 + visible 0 + decoration + } + + itemDef { + name driver + group grpSystem + rect 10 70 400 300 + ownerdraw UI_GLINFO + textalign 0 + textalignx 0 + textaligny 23 + textscale .25 + forecolor 1 1 1 1 + visible 0 + decoration + style 1 + + } + + + +itemDef { + name ctr_other + text "Other" + type 1 + textscale .3 + group grpSystembutton + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 306 395 100 26 + textalign 1 + textalignx 50 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/kcaction.wav" ; + hide grpSystem ; show other } + mouseEnter { show message_other ; setitemcolor ctr_other backcolor .1 .37 .1 1 } + mouseExit { hide message_other ; setitemcolor ctr_other backcolor .37 .1 .1 1} + } + +itemDef { + name ctr_other + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 306 395 100 26 + visible 1 + decoration + } + +itemDef { + name ctr_other + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 294 395 13 26 + visible 1 + decoration + } + +itemDef { + name ctr_other + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 405 395 13 26 + visible 1 + decoration + } + +itemDef { + name other + group grpSystem + rect 2 4 439 125 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 0 + decoration +} + +itemDef { + name other + group grpSystem + rect 2 131 439 150 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 0 + decoration +} +itemDef { + name other + group grpSystem + rect 2 283 439 100 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 .5 + forecolor 1 1 1 1 + backcolor 0 0 0 .25 + visible 0 + decoration +} +itemDef { + name other + group grpSystem + style 1 + text "Display" + rect 163 8 128 20 + textalign ITEM_ALIGN_CENTER + textalignx 64 + textaligny 20 + textscale .3 + forecolor .4 .4 .65 1 + visible 0 + decoration + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Brightness:" + cvarfloat "r_gamma" 1 0.5 2 + rect 99 52 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Screen Size:" + cvarfloat "cg_viewsize" 100 30 100 + rect 99 79 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + +itemDef { + name other + group grpSystem + style 1 + text "Sound" + rect 163 135 128 20 + textalign ITEM_ALIGN_CENTER + textalignx 64 + textaligny 20 + textscale .333 + forecolor .4 .4 .65 1 + visible 0 + decoration + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Effects Volume:" + cvarfloat "s_volume" 0.7 0 1 + rect 99 160 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_SLIDER + text "Music Volume:" + cvarfloat "s_musicvolume" 0.25 0 1 + rect 99 187 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_MULTI + text "Sound Quality:" + cvar "s_khz" + cvarFloatList { "22 khz (high)" 22 "11 khz (low)" 11 } + rect 99 214 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_YESNO + text "Doppler Sound:" + cvar "s_doppler" + rect 99 241 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + } + + + +itemDef { + name other + group grpSystem + style 1 + text "Network" + rect 163 285 128 20 + textalign 1 + textalignx 64 + textaligny 20 + textscale .333 + forecolor .4 .4 .65 1 + visible 0 + decoration + } + + itemDef { + name other + group grpSystem + type ITEM_TYPE_MULTI + text "Net Data Rate:" + cvar "rate" + cvarFloatList { "<=28.8k" 2500 "33.6k" 3000 "56k" 4000 "ISDN" 5000 "LAN/CABLE/xDSl" 25000 } + rect 99 327 256 20 + textalign ITEM_ALIGN_RIGHT + textalignx 128 + textaligny 20 + textscale .333 + forecolor 1 1 1 1 + visible 0 + action { uiScript update ui_setRate } + } + + +itemDef { + name fadebox + style WINDOW_STYLE_FILLED + background "ui/assets/fadebox.tga" + forecolor 0 0 0 1 + backcolor 0 0 0 1 + rect 0 0 640 480 + visible 1 + decoration + } + + + + +} + + +} diff --git a/quake3/source/ui/team.menu b/quake3/source/ui/team.menu new file mode 100644 index 0000000..464b7c2 --- /dev/null +++ b/quake3/source/ui/team.menu @@ -0,0 +1,306 @@ +#include "ui/menudef.h" + +// botselection menu +{ + menuDef { + name "teamMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 200 80 132 + style WINDOW_STYLE_FILLED + backcolor 0 0 0.8 .25 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 1 1 + + itemDef { + name Possess + text "Possess" + textaligny 10 + textalign 0 + rect 5 5 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show pbar } + + } + itemDef { + name "pbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 5 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name Follow + text "Follow" + textaligny 10 + textalign 0 + rect 5 17 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show fbar } + } + itemDef { + name "fbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 17 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Go To" + text "Go To" + textaligny 10 + textalign 0 + rect 5 29 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show gbar } + } + itemDef { + name "gbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 29 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Get" + text "Get" + textaligny 10 + textalign 0 + rect 5 41 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show g2bar } + action { open getMenu } + } + itemDef { + name "g2bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 41 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Patrol From" + text "Patrol From" + textaligny 10 + textalign 0 + rect 5 53 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show p2bar } + } + itemDef { + name "p2bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 53 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Patrol To" + text "Patrol To" + textaligny 10 + textalign 0 + rect 5 65 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show p3bar } + } + itemDef { + name "p3bar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 65 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Camp Near" + text "Camp Near" + textaligny 10 + textalign 0 + rect 5 77 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show cbar } + } + itemDef { + name "cbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 75 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Defend" + text "Defend" + textaligny 10 + textalign 0 + rect 5 89 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show dbar } + } + itemDef { + name "dbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 89 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Attack" + text "Attack" + textaligny 10 + textalign 0 + rect 5 101 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show abar } + } + itemDef { + name "abar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 101 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Drop Command" + text "Drop Command" + textaligny 10 + textalign 0 + rect 5 113 75 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight ; show dcbar } + } + itemDef { + name "dcbar" + group "highlight" + style WINDOW_STYLE_FILLED + rect 0 113 79 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + } + + menuDef { + name "getMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 86 238 85 35 + style WINDOW_STYLE_FILLED + backcolor 0 0 0.8 .25 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 1 1 + + itemDef { + name "Enemy Flag" + text "Enemy Flag" + textaligny 10 + textalign 0 + rect 5 3 80 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight2 ; show efbar } + action { close getMenu ; close teamMenu ; orders get flag } + + } + itemDef { + name "efbar" + group "highlight2" + style WINDOW_STYLE_FILLED + rect 0 3 84 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + itemDef { + name "Rocket Launcher" + text "Rocket Launcher" + textaligny 10 + textalign 0 + rect 5 17 80 10 + visible 1 + textscale 0.22 + mouseEnter { hide highlight2 ; show rlbar } + action { close getMenu ; close teamMenu ; orders get rocketlauncher } + + } + itemDef { + name "rlbar" + group "highlight2" + style WINDOW_STYLE_FILLED + rect 0 17 84 13 + visible 0 + backcolor 0.8 0.8 0.8 0.3 + decoration + } + } + + menuDef { + name "voiceMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 25 40 40 + style WINDOW_STYLE_SHADER + background "console" + //backcolor 0 0 0.5 0.5 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor .5 .5 .5 1 + + itemDef { + name "b" + rect 2 2 33 33 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_HEAD + } + + } + + menuDef { + name "voteMenu" + fullScreen MENU_FALSE + visible MENU_FALSE + rect 5 25 40 40 + style WINDOW_STYLE_SHADER + background "textures/base_wall/comp3" + backcolor 0 0 0.5 0.5 + border WINDOW_BORDER_FULL + bordersize 1 + bordercolor 0 1 0 1 + + } + + + + +} + + diff --git a/quake3/source/ui/teamscore.menu b/quake3/source/ui/teamscore.menu new file mode 100644 index 0000000..fe2bb92 --- /dev/null +++ b/quake3/source/ui/teamscore.menu @@ -0,0 +1,512 @@ +#include "ui/menudef.h" + +{ +\\ score_menu \\ + + menuDef { + name "teamscore_menu" + visible 0 + fullscreen 0 + rect 0 0 640 480 + focusColor 1 .75 0 1 + style 0 + border 1 + + +// GAMETYPE BAR // + + +itemDef { + name gameStatusWindow + style 4 + rect 14 40 612 35 + border 1 + bordercolor 1 1 1 1 + visible 1 + decoration + } + + + + +itemDef { + name score + ownerdraw CG_KILLER + textscale .4 + style 0 + rect 0 40 640 27 + textalignx 0 + textaligny 27 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration + } + + + +// TEAM NAME // + +itemDef { + name teamNameWindow + rect 14 78 612 30 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } +itemDef { + name score + text " " + ownerdraw CG_GAME_STATUS + textscale .3 + style 0 + rect 0 78 640 23 + textalignx 320 + textaligny 0 + textalign 1 + backcolor 0 0 0 0 + forecolor 1 1 1 1 + visible 1 + decoration + } + + +itemDef { + name redteamname + ownerdraw CG_RED_NAME + textalign 0 + textscale .3 + rect 20 78 306 23 + forecolor 1 0 0 1 + decoration + visible 1 + } + +itemDef { + name blueteamname + ownerdraw CG_BLUE_NAME + text " " + textalign 2 + textscale .3 + rect 600 78 0 23 + forecolor 0 0 1 1 + decoration + visible 1 + } + + +// TEAM BARS // + +itemDef { + name leftteambar + rect 14 112 307 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 1 + forecolor 1 1 1 1 + backcolor 1 0 0 1 + visible 1 + decoration + } + +itemDef { + name rightteambar + rect 320 112 306 25 + style WINDOW_STYLE_FILLED + border 1 + bordercolor 1 1 1 1 + forecolor 1 1 1 1 + backcolor 0 0 1 1 + visible 1 + decoration + } + +// TEAM HEADINGS // + +itemDef { + name leftteamheadings + text "Status Name Score Time Ping" + textscale .25 + style 0 + rect 25 112 128 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 18 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } +itemDef { + name rightteamheadings + text "Status Name Score Time Ping" + textscale .25 + style 0 + rect 331 112 128 30 + textalign 0 + textalignx 0 // x alignment point for text + // use it to offset left/right text from the edge + // or to center the text on a different point + textaligny 18 + backcolor 0 0 0 0 + forecolor 1 .75 0 1 + decoration + visible 1 + } + + + + +// GRADIENT BACKGROUNDS // + + +itemDef { + name window + rect 320 142 1 220 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 1 + visible 1 + decoration + } + +itemDef { + name window + rect 300 142 1 220 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name window + rect 606 142 1 220 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } +itemDef { + name redlogo + style WINDOW_STYLE_SHADER + background "textures/ctf2/redteam01.tga" + rect 110 189 128 128 + forecolor .75 0 0 0.5 + visible 1 + decoration + } +itemDef { + name bluelogo + style WINDOW_STYLE_SHADER + background "textures/ctf2/blueteam01" + rect 416 189 128 128 + forecolor 0 0 .75 0.5 + visible 1 + decoration + } + +itemDef { + name leftgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradleft.tga" + rect 14 142 306 222 + forecolor .75 0 0 0.5 + visible 1 + decoration + } + +itemDef { + name rightgrad + style WINDOW_STYLE_SHADER + background "ui/assets/halfgradright.tga" + rect 320 142 306 222 + forecolor 0 0 .75 0.5 + visible 1 + decoration + } + + +// LIST // + +itemDef { + name leftlist + rect 14 142 306 222 + forecolor .75 .75 .75 1 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 135 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_REDTEAM_LIST + notselectable + columns 7 2 12 12 18 12 12 34 20 20 78 75 16 183 20 20 221 20 20 251 10 10 + } + + + +itemDef { + name rightlist + rect 320 142 306 222 + forecolor 1 1 1 1 + visible 1 + type ITEM_TYPE_LISTBOX + elementwidth 135 + elementheight 20 + textscale .25 + elementtype LISTBOX_TEXT + feeder FEEDER_BLUETEAM_LIST + notselectable + columns 7 2 12 12 18 12 12 34 20 20 78 75 16 183 20 20 221 20 20 251 10 10 + } + + + + +// PLAYER LIST BORDER // + + + +itemDef { + name window + rect 14 141 612 221 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } + + + + + + + + + +// spectators // + + +itemDef { + name window + rect 14 414 612 24 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 .7 + backcolor 0 0 0 .5 + textscale .33 + visible 1 + decoration + } + +itemDef { + name window + text "Spectating:" + textaligny 20 + rect 19 414 82 24 + style WINDOW_STYLE_FILLED + forecolor 1 1 1 1 + textscale .33 + textalignx 3 + visible 1 + decoration + } + +itemDef { + name window + rect 100 414 520 24 + style WINDOW_STYLE_FILLED + forecolor 1 1 1 1 + textscale .33 + visible 1 + ownerdraw CG_SPECTATORS + decoration + } + + + + + +// AWARDS // + + +itemDef { + name window + rect 14 364 612 48 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 1 + backcolor 0 0 0 .5 + visible 1 + decoration + } + +itemdef { + name medal_accuracy + ownerdraw CG_ACCURACY + rect 43 368 32 32 + background "ui/assets/medal_accuracy.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_assist + ownerdraw CG_ASSISTS + rect 130 368 32 32 + background "ui/assets/medal_assist.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_defend + ownerdraw CG_DEFEND + rect 227 368 32 32 + background "ui/assets/medal_defend.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_excellent + ownerdraw CG_EXCELLENT + rect 314 368 32 32 + background "ui/assets/medal_excellent.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_gauntlet + ownerdraw CG_GAUNTLET + rect 391 368 32 32 + background "ui/assets/medal_gauntlet.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_impressive + ownerdraw CG_IMPRESSIVE + rect 478 368 32 32 + background "ui/assets/medal_impressive.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +itemdef { + name medal_capture_team + ownerdraw CG_CAPTURES + rect 565 368 32 32 + background "ui/assets/medal_capture.tga" + forecolor 1 1 1 .5 + visible 1 + decoration + textscale 0.25 + } + +// GAMETYPE // + +itemDef { + name window + rect 14 440 612 24 + style WINDOW_STYLE_FILLED + border 1 + bordercolor .5 .5 .5 1 + forecolor 1 1 1 .7 + backcolor 0 0 0 .5 + visible 1 + decoration + } + +itemDef { + name window + rect 220 440 200 24 + style WINDOW_STYLE_EMPTY + border 1 + bordercolor .5 .5 .5 1 + visible 1 + decoration + } + +itemDef { + name gametype + ownerdraw CG_GAME_TYPE + textalign 0 + textscale .3 + rect 18 440 50 20 + forecolor 1 1 1 1 + textaligny 0 + textalignx 0 + decoration + visible 1 + } + +itemdef { + name playername + text "Use Score Scroll Keys" + rect 225 440 256 24 + forecolor 1 .75 0 1 + textalignx 10 + textaligny 20 + visible 1 + textalign 0 + decoration + textscale 0.333 + } + + +itemdef { + name playerscore + text "Score:" + rect 430 440 40 21 + textalignx 0 + textaligny 21 + visible 1 + textalign 0 + forecolor 1 1 1 1 + textscale .3 + ownerdraw CG_PLAYER_SCORE + decoration + } + + + + + + + +} + + +} diff --git a/quake3/source/ui/testhud.menu b/quake3/source/ui/testhud.menu new file mode 100644 index 0000000..119ae53 --- /dev/null +++ b/quake3/source/ui/testhud.menu @@ -0,0 +1,1052 @@ +#include "ui/menudef.h" + +// team menu +// +// defines from ui_shared.h + +{ + assetGlobalDef { + font "fonts/impact.ttf" // font + cursor "menu/art/3_cursor2" // cursor + gradientBar "ui/assets/gradientbar2.tga" // gradient bar + fadeClamp 1.0 // sets the fadeup alpha + fadeCycle 1 // how often fade happens in milliseconds + fadeAmount 0.1 // amount to adjust alpha per cycle + + shadowX 5 // x amount for shadow offset + shadowY 5 // y amount for shadow offset + shadowColor 0.1 0.1 0.1 0.25 // shadow color + + //hudShader "ui/assets/hudbar.tga" // + + } + + +// POWERUP AREA // + +menuDef { + name "powerup area" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 570 220 50 100 + + itemDef { + name "powerupArea" + rect 0 0 40 40 + visible 1 + decoration + ownerdraw CG_AREA_POWERUP + special 4 // spacing + align HUD_VERTICAL + } + + +} + + + +// SELECTED PLAYER // + +menuDef { + name "SelectedPlayer" + fullScreen MENU_FALSE + visible 1 + rect 2 363 180 64 + + + itemDef { + name "b" + rect 3 4 162 57 + style 4 + visible 1 + bordercolor 0 0 0 0 + backcolor 0 0 0 0 + mouseEnter { setcolor bordercolor 1 1 1 .5 ; setteamcolor ; show altSelectedPlayerRect } + mouseExit { setcolor backcolor 0 0 0 0 ; setcolor bordercolor 0 0 0 0 ; hide altSelectedPlayerRect } + action { open teamMenu } + } + + + + itemDef { + name "altSelectedPlayerRect" + rect 3 4 162 57 + style 4 + border 1 + bordersize 1 + visible 0 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "b" + rect 4 3 32 32 + visible 1 + action { open teamMenu } + ownerdraw CG_SELECTEDPLAYER_HEAD + } + + itemDef { + name "b" + rect 50 35 22 11 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedhealth.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_HEALTH + } + + itemDef { + name "b" + rect 50 48 22 11 + visible 1 + style 3 + decoration + background "ui/assets/statusbar/selectedarmor.tga" + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 .3 .65 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_ARMOR + } + + itemDef { + name "b" + rect 75 48 22 11 + visible 1 + style 1 + textscale .25 + decoration + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 .3 .65 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_ARMOR + } +itemDef { + name "b" + rect 75 35 22 11 + visible 1 + style 1 + textscale .25 + decoration + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + ownerdraw CG_SELECTEDPLAYER_HEALTH + } + + + + itemDef { + name "b" + rect 35 3 35 15 + textscale 0.25 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_NAME + } + + itemDef { + name "b" + rect 35 15 45 15 + textscale 0.25 + forecolor 1 1 1 1 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_LOCATION + } + + itemDef { + name "b" + rect 7 40 16 16 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_STATUS + } + + itemDef { + name "b" + rect 30 40 16 16 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_POWERUP + } + + itemDef { + name "b" + rect 100 33 24 24 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_WEAPON + } +itemDef { + name "sback" + rect 0 0 180 64 + visible 1 + style 3 + forecolor 1 1 1 .25 + decoration + background "ui/assets/statusbar6b.tga" + } + + +} + + + +// PLAYER STATUS // + +menuDef { + name "playerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 0 416 128 64 + + itemDef { + name "playerStatusRect" + rect 12 13 112 48 + visible 1 + style 4 + //background "ui/assets/hudback.tga" + border 1 + bordersize 1 + mouseEnter { show playerStatusRectAlt } + mouseExit { hide playerStatusRectAlt } + +} + + itemDef { + name "playerStatusRectAlt" + rect 12 13 112 48 + visible 0 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 .0 +} + + itemDef { + name "playeritem" + rect 27 23 24 24 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + itemDef { + name "CTFPOWERUP" + rect 55 23 24 24 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + + + } + + itemDef { + name "flag" + rect 85 15 40 40 + visible 1 + decoration + ownerdraw CG_PLAYER_HASFLAG + } + + itemDef { + name "skulls" + rect 75 8 45 40 + visible 1 + decoration + textscale 0.5 + ownerdraw CG_HARVESTER_SKULLS + } + + + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 12 13 112 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar1b.tga" + } + + } + + + + + +// AMMO // + +menuDef { + name "Ammo" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 129 416 128 64 + + + itemDef { + name "ammoRect" + visible 1 + style 4 + rect 2 13 122 48 + border 1 + bordersize 1 + mouseEnter { show ammoRectAlt } + mouseExit { hide ammoRectAlt } + } + + itemDef { + name "ammoRectAlt" + visible 0 + style 1 + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "a" + rect 85 25 30 30 + visible 1 + decoration + ownerdraw CG_PLAYER_AMMO_ICON2D + } + + itemDef { + name "a" + rect 10 43 63 12 + visible 1 + decoration + textscale .75 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 .3 .75 0 .75 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar2b.tga" + } + +} + + + + + + +// PLAYER // + +menuDef { + name "Player" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 257 416 128 64 + + + itemDef { + name "playerRect" + rect 2 2 122 60 + style 4 + visible 1 + border 1 + bordersize 1 + mouseEnter { show playerRectAlt } + mouseExit { hide playerRectAlt } + } + + itemDef { + name "playerRectAlt" + rect 2 2 122 60 + style 1 + visible 0 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "b" + rect 12 42 63 12 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .8 + ownerdraw CG_PLAYER_HEALTH + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 .3 .75 0 .75 + addColorRange 101 999 1 1 1 .75 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 2 122 60 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar3b.tga" + } + + itemDef { + name "b" + rect 70 10 45 45 + visible 1 + decoration + ownerdraw CG_PLAYER_HEAD + } + } + + + + + + + +// ARMOR // + +menuDef { + name "Armor" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 385 416 128 64 + + + itemDef { + name "armorRect" + rect 2 13 122 48 + visible 1 + style 4 + border 1 + bordersize 1 + mouseEnter { show armorRectAlt } + mouseExit { hide armorRectAlt } + } + + itemDef { + name "armorRectAlt" + rect 2 13 122 48 + visible 0 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + itemDef { + name "armor" + rect 10 7 30 30 + visible 1 + decoration + ownerdraw CG_PLAYER_ARMOR_ICON2D + } + + itemDef { + name "armor2" + rect 55 43 63 12 + visible 1 + decoration + textscale .75 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 .67 0 0 1 + addColorRange 26 100 .3 .75 0 .75 + addColorRange 101 999 .75 .75 .75 .75 + } + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 122 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar4b.tga" + } + } + + + + + + + +// LOCATION // + +menuDef { + name "location" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 405 128 22 + + + itemDef { + name "locationRect" + visible MENU_TRUE + rect 0 0 128 22 + style 4 + } + + + itemDef { + name "playerlocation" + rect 10 2 16 16 + visible 1 + decoration + textscale .25 + ownerdraw CG_PLAYER_LOCATION + } +} + +// PLAYERSCORE // + +menuDef { + name "PlayerScore" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 416 128 64 + + + itemDef { + name "playerScoreRect" + visible 1 + rect 2 13 124 48 + style 4 + border 1 + bordersize 1 + mouseEnter { show playerScoreRectAlt } + mouseExit { hide playerScoreRectAlt } + + } + + itemDef { + name "playerScoreRectAlt" + visible 0 + rect 2 13 124 48 + style 1 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + + itemDef { + name "playerStatus" + rect 10 42 16 16 + visible 1 + decoration + ownerdraw CG_PLAYER_STATUS + } + + itemDef { + name "playerScore" + rect 0 44 125 12 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .30 + ownerdraw CG_PLAYER_SCORE + } + + itemDef { + name "f" + rect 10 22 16 16 + visible 1 + bordercolor 1 1 1 .75 + decoration + style 3 + background "ui/assets/bluechip.tga" + } + + itemDef { + name "f" + rect 10 22 16 16 + visible 1 + decoration + ownerdraw CG_BLUE_FLAGSTATUS + } +itemDef { + name "r" + rect 16 22 30 15 + visible 1 + decoration + forecolor 0 0 0 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + + itemDef { + name "r" + rect 15 21 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + + itemDef { + name "f" + rect 72 22 16 16 + visible 1 + bordercolor 1 1 1 1 + decoration + style 3 + background "ui/assets/redchip.tga" + } + + itemDef { + name "f" + rect 72 22 16 16 + visible 1 + decoration + ownerdraw CG_RED_FLAGSTATUS + } +itemDef { + name "r" + rect 83 22 30 15 + visible 1 + decoration + forecolor 0 0 0 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + + itemDef { + name "r" + rect 82 21 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + + + itemDef { + name "statusscreen" + visible 1 + style 3 + background "menuscreen2" + rect 2 13 124 48 + border 1 + bordersize 1 + bordercolor 1 1 1 1 + backcolor 0 0 0 0 + } + + +itemDef { + name "sback" + rect 0 0 128 64 + visible 1 + decoration + style 3 + background "ui/assets/statusbar5b.tga" + } + + } +} + +// SCORESTATUS // + +menuDef { + name "ScoreStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 513 428 125 50 + style 4 + //background "ui/assets/hudback.tga" + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "r" + rect 5 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_BLUE_SCORE + } + +itemDef { + name "r" + rect 42 5 30 15 + visible 1 + decoration + forecolor 0 0 1 1 + textscale 0.25 + ownerdraw CG_BLUE_NAME + } + + +itemDef { + name "r" + rect 5 25 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.25 + ownerdraw CG_RED_SCORE + } + + itemDef { + name "r" + rect 42 25 30 15 + visible 1 + decoration + forecolor 1 0 0 1 + textscale 0.25 + ownerdraw CG_RED_NAME + } + } + + + +} + +// Close off other menu options // + +// CROSSHAIR STATUS BAR // + +menuDef { + name "crosshairStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + rect 256 176 128 128 + style 0 + +itemDef { + name "crosshairHealth" + rect 0 0 128 64 + visible 1 + decoration + forecolor 0 0 0 0 + style 3 + ownerdraw CG_PLAYER_HEALTH_VALUE + background "ui/assets/crosshair_health.tga" + addColorRange -999 25 1 0 0 .5 + addColorRange 26 100 1 .75 0 .25 + addColorRange 101 999 1 1 1 .1 + } + + +itemDef { + name "crosshairAmmo" + rect 0 64 64 64 + visible 1 + decoration + style 3 + forecolor 0 0 0 0 + ownerdraw CG_PLAYER_AMMO_VALUE + background "ui/assets/crosshair_ammo.tga" + addColorRange -999 5 1 0 0 .5 + addColorRange 6 999 1 .75 0 .25 + } + +itemDef { + name "crosshairArmor" + rect 64 64 64 64 + visible 1 + decoration + style 3 + forecolor 1 1 1 .25 + forecolor 0 0 0 0 + ownerdraw CG_PLAYER_ARMOR_VALUE + background "ui/assets/crosshair_armor.tga" + addColorRange -999 25 1 0 0 .5 + addColorRange 26 100 1 .75 0 .25 + addColorRange 101 999 1 1 1 .1 + } +} + + + + + + +// MINI_STATUS // + +menuDef { + name "miniPlayerStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 1 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + +itemDef { + name "miniAmmoValue" + rect 5 5 25 15 + visible 1 + decoration + textscale .33 + forecolor 1 1 1 1 + ownerdraw CG_PLAYER_AMMO_VALUE + addColorRange -999 5 1 0 0 1 + addColorRange 6 999 1 .75 0 1 + } + + +itemDef { + name "miniHealthValue" + rect 45 5 25 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .33 + ownerdraw CG_PLAYER_HEALTH + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } + +itemDef { + name "MiniArmorValue" + rect 90 5 25 15 + visible 1 + decoration + textscale .33 + ownerdraw CG_PLAYER_ARMOR_VALUE + addColorRange -999 25 1 0 0 1 + addColorRange 26 100 1 .75 0 1 + addColorRange 101 999 1 1 1 1 + } +} + +// MINI_CTF_STATUS // + +menuDef { + name "miniCTFStatus" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 129 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + +itemDef { + name "miniFlagBlue" + rect 5 5 16 16 + visible 1 + decoration + ownerdraw CG_BLUE_FLAGSTATUS + } + +itemDef { + name "miniBlueScore" + rect 10 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.33 + ownerdraw CG_BLUE_SCORE + } + +itemDef { + name "miniFlagRed" + rect 65 5 16 16 + visible 1 + decoration + ownerdraw CG_RED_FLAGSTATUS + } + +itemDef { + name "miniRedScore" + rect 70 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale 0.33 + ownerdraw CG_RED_SCORE + } + +} + + +// MINI_SCORE // + +menuDef { + name "miniScore" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 257 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "b" + rect 5 5 16 16 + visible 1 + decoration + ownerdraw CG_SELECTEDPLAYER_STATUS + } + +itemDef { + name "b" + rect 30 5 30 15 + visible 1 + decoration + forecolor 1 1 1 1 + textscale .33 + ownerdraw CG_PLAYER_SCORE + } + +} + + + +// MINI_LOCATION // + + +menuDef { + name "miniLocation" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 385 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "b" + rect 5 5 30 15 + visible 1 + decoration + textscale .33 + ownerdraw CG_PLAYER_LOCATION + } + } + + + +// MINI_ITEM // + + +menuDef { + name "miniItem" + fullScreen MENU_FALSE + visible MENU_TRUE + style 0 + rect 513 10 125 30 + style 1 + border 1 + bordersize 1 + bordercolor .5 .5 1 1 + backcolor 0 0 1 .25 + + +itemDef { + name "b" + rect 5 5 30 30 + visible 1 + decoration + ownerdraw CG_PLAYER_ITEM + } + + +itemDef { + name "b" + rect 5 50 30 30 + visible 1 + decoration + ownerdraw CG_CTF_POWERUP + } + + + } + + + } + + +} + diff --git a/quake3/source/ui/vid_restart.menu b/quake3/source/ui/vid_restart.menu new file mode 100644 index 0000000..ede2715 --- /dev/null +++ b/quake3/source/ui/vid_restart.menu @@ -0,0 +1,194 @@ +#include "ui/menudef.h" + +{ +\\ VID_RESTART POPUP MENU \\ + +menuDef { + name "vid_restart_popmenu" + visible 0 + fullscreen 0 + //rect 217 200 210 85 + rect 204 122 235 235 + //outOfBoundsClick // this closes the window if it gets a click out of the rectangle + focusColor 1 .75 0 1 + style 1 + border 1 + popup + onESC { close vid_restart_popmenu ; + open setup_menu ; + open system_menu } + + + +itemDef { + name window + rect 0 0 235 235 + style 3 + background "ui/assets/mainpop.tga" + visible 1 + decoration + } +itemDef { + name window + rect 47 47 144 144 + style 3 + background "centerconsole2" + visible 1 + decoration + } + + + + + + // VID_RESTART // + +itemDef { + name confirm + text "This will apply video" + style 0 + textscale .25 + textstyle 3 + rect 0 85 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name confirm + text "settings and return" + style 0 + textscale .25 + textstyle 3 + rect 0 100 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } +itemDef { + name confirm + text "to the Main Menu." + style 0 + textscale .25 + textstyle 3 + rect 0 115 110 20 + textalign 1 + textalignx 117 + textaligny 15 + decoration + forecolor 1 1 1 1 + visible 1 + } + +itemDef { + name yes + text "YES" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 75 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close vid_restart_popmenu ; + exec "vid_restart" } + mouseEnter { setitemcolor yes backcolor .1 .37 .1 1 } + mouseExit { setitemcolor yes backcolor .37 .1 .1 1 } + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 75 140 30 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 69 140 7 26 + visible 1 + decoration + } + + itemDef { + name yes + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 104 140 7 26 + visible 1 + decoration + } + + + + + +itemDef { + name no + text "NO" + type 1 + textscale .25 + style WINDOW_STYLE_FILLED + background "ui/assets/button_back.tga" + rect 128 140 30 26 + textalign 1 + textalignx 15 + textaligny 20 + forecolor 1 1 1 1 + backcolor .37 .1 .1 1 + visible 1 + action { play "sound/misc/nomenu.wav" ; + close vid_restart_popmenu ; + open setup_menu ; + open system_menu } + mouseEnter { setitemcolor no backcolor .1 .37 .1 1 } + mouseExit { setitemcolor no backcolor .37 .1 .1 1 } + } + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/framebutton.tga" + rect 128 140 30 26 + visible 1 + decoration + } + + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/leftbutton.tga" + rect 122 140 7 26 + visible 1 + decoration + } + + itemDef { + name no + style WINDOW_STYLE_SHADER + background "ui/assets/rightbutton.tga" + rect 157 140 7 26 + visible 1 + decoration + } + +} + + +} + +

WH?cVtrR=N~LUh>f7;a8ZsUg z80kxsXo?^)Q{VL@ni7#f5?3~|hIH~B_tmUaQ!>$JQe83=ls3y_0+s1PfCR5V8X|~~ z*`!s71FIByH?362S?#AWfHLZWvl2!=(36IRQFye_F^h_~FuM%1uyDr1NEB~jL?AQO zFv5*1Ya37(BT!iOx~S|gJ+E09CBiI1^upn412faGSElum9y|2-Vqs(tt+Xuc#pwyi z)i~~=#wd@SIOgtZT*aa%GqcN#1~97wJtFB1$OtKV-BD?7MH^{dWb_)NtXR}eZFn|j z{-L)Uy{x!uLk}vhOmU@UKH9|9Bo=0bXQ7t}GsiN5oLP$)vBXs`uIe!|jJws2L{ds-@xZ%+gbH>dQ3Mx^i{7u3TNNi$+T8s;@26jq4lcmQlsawDE>otN+)i zw5RcK8NcFnvr1VQFQ0KF%3qq@|8Fqw|2G}-|1>&`jc=@VnE$^Mm}UJw7jFh;{{J1o zj1%qz4&(ZMxqeu%^QKEb5}5h@L%_@{5*EBr@HKLMnc#L{=Ko&<`~mL^d>DAM;2pqS zINmLIui*WH4+As*zw?$$H&Sp&a9Hp{!Pf|0Cb(Vj8o}!YZx*~m@NU6-1@9MpSg`Z9 zyZ_fn!QB5Z>|E|FIg0uJ`PjBt4*V$`p#1NE{9W?}SN_)kvout?cnL7&ekZ(!IjvbkM)ifTrIdk@DjmG1-A%ZC3v0Sje@rUA3}XQ1+NDm z8zB8x_9Fk6pCA+_=I;N2+u33{U^!qpU^!qpU^!qpU^!qpU^!qpU^!qpU^!qpU^!qp YU^!qpU^!qpU^!qpU^!qp(1Qd22mbQJ$p8QV literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/ai_chat.c b/quake3/source/code/game/ai_chat.c new file mode 100644 index 0000000..94fa703 --- /dev/null +++ b/quake3/source/code/game/ai_chat.c @@ -0,0 +1,1391 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_chat.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_chat.c $ + * + *****************************************************************************/ + +#include "g_local.h" +#include "botlib.h" +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +// +#include "chars.h" //characteristics +#include "inv.h" //indexes into the inventory +#include "syn.h" //synonyms +#include "match.h" //string matching types and vars + +// for the voice chats +#ifdef MISSIONPACK // bk001205 +#include "../../ui/menudef.h" +#endif + +#define TIME_BETWEENCHATTING 25 + + +/* +================== +BotNumActivePlayers +================== +*/ +int BotNumActivePlayers(void) { + int i, num; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + num = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + num++; + } + return num; +} + +/* +================== +BotIsFirstInRankings +================== +*/ +int BotIsFirstInRankings(bot_state_t *bs) { + int i, score; + char buf[MAX_INFO_STRING]; + static int maxclients; + playerState_t ps; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + score = bs->cur_ps.persistant[PERS_SCORE]; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + BotAI_GetClientState(i, &ps); + if (score < ps.persistant[PERS_SCORE]) return qfalse; + } + return qtrue; +} + +/* +================== +BotIsLastInRankings +================== +*/ +int BotIsLastInRankings(bot_state_t *bs) { + int i, score; + char buf[MAX_INFO_STRING]; + static int maxclients; + playerState_t ps; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + score = bs->cur_ps.persistant[PERS_SCORE]; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + BotAI_GetClientState(i, &ps); + if (score > ps.persistant[PERS_SCORE]) return qfalse; + } + return qtrue; +} + +/* +================== +BotFirstClientInRankings +================== +*/ +char *BotFirstClientInRankings(void) { + int i, bestscore, bestclient; + char buf[MAX_INFO_STRING]; + static char name[32]; + static int maxclients; + playerState_t ps; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + bestscore = -999999; + bestclient = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + BotAI_GetClientState(i, &ps); + if (ps.persistant[PERS_SCORE] > bestscore) { + bestscore = ps.persistant[PERS_SCORE]; + bestclient = i; + } + } + EasyClientName(bestclient, name, 32); + return name; +} + +/* +================== +BotLastClientInRankings +================== +*/ +char *BotLastClientInRankings(void) { + int i, worstscore, bestclient; + char buf[MAX_INFO_STRING]; + static char name[32]; + static int maxclients; + playerState_t ps; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + worstscore = 999999; + bestclient = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + BotAI_GetClientState(i, &ps); + if (ps.persistant[PERS_SCORE] < worstscore) { + worstscore = ps.persistant[PERS_SCORE]; + bestclient = i; + } + } + EasyClientName(bestclient, name, 32); + return name; +} + +/* +================== +BotRandomOpponentName +================== +*/ +char *BotRandomOpponentName(bot_state_t *bs) { + int i, count; + char buf[MAX_INFO_STRING]; + int opponents[MAX_CLIENTS], numopponents; + static int maxclients; + static char name[32]; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + numopponents = 0; + opponents[0] = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) continue; + // + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + //skip team mates + if (BotSameTeam(bs, i)) continue; + // + opponents[numopponents] = i; + numopponents++; + } + count = random() * numopponents; + for (i = 0; i < numopponents; i++) { + count--; + if (count <= 0) { + EasyClientName(opponents[i], name, sizeof(name)); + return name; + } + } + EasyClientName(opponents[0], name, sizeof(name)); + return name; +} + +/* +================== +PrivateBotOwner + +PKMOD - Ergodic 12/15/01 - return Private Bot's owner +================== +*/ +char *PrivateBotOwner(bot_state_t *bs) { + int i; + static char name[32]; + + //PKMOD - Ergodic 03/18/02 - is calling BOT a Private Bot? + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + i = g_entities[bs->entitynum].parent->client->ps.clientNum; + EasyClientName( i, name, sizeof(name)); + } + else { + strcpy( name, "[invalid var]" ); + } + return name; +} + +/* +================== +BotMapTitle +================== +*/ + +char *BotMapTitle(void) { + char info[1024]; + static char mapname[128]; + + trap_GetServerinfo(info, sizeof(info)); + + strncpy(mapname, Info_ValueForKey( info, "mapname" ), sizeof(mapname)-1); + mapname[sizeof(mapname)-1] = '\0'; + + return mapname; +} + + +/* +================== +BotWeaponNameForMeansOfDeath +================== +*/ + +char *BotWeaponNameForMeansOfDeath(int mod) { + switch(mod) { +//PKMOD - Ergodic 03/22/01 - change shotgun name to boomstick + case MOD_SHOTGUN: return "Boomstick"; + case MOD_GAUNTLET: return "Gauntlet"; + case MOD_MACHINEGUN: return "Machinegun"; + case MOD_GRENADE: + case MOD_GRENADE_SPLASH: return "Grenade Launcher"; + case MOD_ROCKET: + case MOD_ROCKET_SPLASH: return "Rocket Launcher"; + case MOD_PLASMA: + case MOD_PLASMA_SPLASH: return "Plasmagun"; +//PKMOD - Ergodic 07/12/01 - change railgun name to magnum + case MOD_RAILGUN: return "Magnum"; +//PKMOD - Ergodic 12/19/03 - change Lightning Gun name to Chain Lightning Gun + case MOD_LIGHTNING: return "Chain Lightning Gun"; + case MOD_BFG: + case MOD_BFG_SPLASH: return "BFG10K"; +#ifdef MISSIONPACK + case MOD_NAIL: return "Nailgun"; + case MOD_CHAINGUN: return "Chaingun"; + case MOD_PROXIMITY_MINE: return "Proximity Launcher"; + case MOD_KAMIKAZE: return "Kamikaze"; + case MOD_JUICED: return "Prox mine"; +#endif + case MOD_GRAPPLE: return "Grapple"; + //PKMOD - Ergodic 07/02/01 - add reverse damage on lightning from autosentry + case MOD_REVERSE_LIGHTNING: + switch ( rand() % 3 ) { + case 0: + return "Lightning Shield"; + break; + case 1: + return "Zap Mirror"; + break; + default: + return "Sizzle Reflector"; + break; + } + default: + //PKMOD - Ergodic 03/28/01 - fix "[unknown weapon]" with a bandaide patch +// return "[unknown weapon]"; + switch ( rand() % 3 ) { + case 0: + return "PainKeep Weapon"; + break; + case 1: + return "Evolved Weapon"; + break; + default: + return "Smelly New Weapon"; + break; + } + + } +} + +/* +================== +BotRandomWeaponName +================== +*/ +char *BotRandomWeaponName(void) { + int rnd; + +#ifdef MISSIONPACK + rnd = random() * 11.9; +#else + rnd = random() * 8.9; +#endif + switch(rnd) { + case 0: return "Gauntlet"; +//PKMOD - Ergodic 03/22/01 - change shotgun name to boomstick + case 1: return "Boomstick"; + case 2: return "Machinegun"; + case 3: return "Grenade Launcher"; + case 4: return "Rocket Launcher"; + case 5: return "Plasmagun"; +//PKMOD - Ergodic 07/12/01 - change railgun name to magnum + case 6: return "Magnum"; +//PKMOD - Ergodic 12/19/03 - change Lightning Gun name to Chain Lightning Gun + case 7: return "Chain Lightning Gun"; +#ifdef MISSIONPACK + case 8: return "Nailgun"; + case 9: return "Chaingun"; + case 10: return "Proximity Launcher"; +#endif + default: return "BFG10K"; + } +} + +/* +================== +BotVisibleEnemies +================== +*/ +int BotVisibleEnemies(bot_state_t *bs) { + float vis; + int i; + aas_entityinfo_t entinfo; + + for (i = 0; i < MAX_CLIENTS; i++) { + + if (i == bs->client) continue; + // + BotEntityInfo(i, &entinfo); + // + if (!entinfo.valid) continue; + //if the enemy isn't dead and the enemy isn't the bot self + if (EntityIsDead(&entinfo) || entinfo.number == bs->entitynum) continue; + //if the enemy is invisible and not shooting + if (EntityIsInvisible(&entinfo) && !EntityIsShooting(&entinfo)) { + //PKMOD - Ergodic 10/31/02 - check if enemy has a beartrap attached + // attached beartraps will make the player visible to the bots + entityState_t state; + BotAI_GetEntityState(i, &state); + if ( ( state.time2 & 3 ) == 0 ) //if no beartraps are attached + continue; + } + //if on the same team + if (BotSameTeam(bs, i)) continue; + //check if the enemy is visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, i); + if (vis > 0) return qtrue; + } + return qfalse; +} + +/* +================== +BotValidChatPosition +================== +*/ +int BotValidChatPosition(bot_state_t *bs) { + vec3_t point, start, end, mins, maxs; + bsp_trace_t trace; + + //if the bot is dead all positions are valid + if (BotIsDead(bs)) return qtrue; + //never start chatting with a powerup + if (bs->inventory[INVENTORY_QUAD] || + bs->inventory[INVENTORY_HASTE] || + bs->inventory[INVENTORY_INVISIBILITY] || + bs->inventory[INVENTORY_REGEN] || + bs->inventory[INVENTORY_FLIGHT]) return qfalse; + //must be on the ground + //if (bs->cur_ps.groundEntityNum != ENTITYNUM_NONE) return qfalse; + //do not chat if in lava or slime + VectorCopy(bs->origin, point); + point[2] -= 24; + if (trap_PointContents(point,bs->entitynum) & (CONTENTS_LAVA|CONTENTS_SLIME)) return qfalse; + //do not chat if under water + VectorCopy(bs->origin, point); + point[2] += 32; + if (trap_PointContents(point,bs->entitynum) & MASK_WATER) return qfalse; + //must be standing on the world entity + VectorCopy(bs->origin, start); + VectorCopy(bs->origin, end); + start[2] += 1; + end[2] -= 10; + trap_AAS_PresenceTypeBoundingBox(PRESENCE_CROUCH, mins, maxs); + BotAI_Trace(&trace, start, mins, maxs, end, bs->client, MASK_SOLID); + if (trace.ent != ENTITYNUM_WORLD) return qfalse; + //the bot is in a position where it can chat + return qtrue; +} + +/* +================== +BotChat_EnterGame +================== +*/ +int BotChat_EnterGame(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + //don't chat in teamplay + if (TeamPlayIsOn()) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_ENTEREXITGAME, 0, 1); + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (BotNumActivePlayers() <= 1) return qfalse; + if (!BotValidChatPosition(bs)) return qfalse; + BotAI_BotInitialChat(bs, "game_enter", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 12/13/01 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_ExitGame +================== +*/ +int BotChat_ExitGame(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + //don't chat in teamplay + if (TeamPlayIsOn()) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_ENTEREXITGAME, 0, 1); + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (BotNumActivePlayers() <= 1) return qfalse; + // + BotAI_BotInitialChat(bs, "game_exit", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/14/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_StartLevel +================== +*/ +int BotChat_StartLevel(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (BotIsObserver(bs)) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + //don't chat in teamplay + if (TeamPlayIsOn()) { + trap_EA_Command(bs->client, "vtaunt"); + return qfalse; + } + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_STARTENDLEVEL, 0, 1); + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (BotNumActivePlayers() <= 1) return qfalse; + BotAI_BotInitialChat(bs, "level_start", + EasyClientName(bs->client, name, 32), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_EndLevel +================== +*/ +int BotChat_EndLevel(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (BotIsObserver(bs)) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + // teamplay + if (TeamPlayIsOn()) + { + if (BotIsFirstInRankings(bs)) { + trap_EA_Command(bs->client, "vtaunt"); + } + return qtrue; + } + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_STARTENDLEVEL, 0, 1); + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (BotNumActivePlayers() <= 1) return qfalse; + // + if (BotIsFirstInRankings(bs)) { + BotAI_BotInitialChat(bs, "level_end_victory", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + "[invalid var]", // 2 + BotLastClientInRankings(), // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } + else if (BotIsLastInRankings(bs)) { + BotAI_BotInitialChat(bs, "level_end_lose", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + BotFirstClientInRankings(), // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } + else { + BotAI_BotInitialChat(bs, "level_end", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + BotFirstClientInRankings(), // 2 + BotLastClientInRankings(), // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_Death +================== +*/ +int BotChat_Death(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_DEATH, 0, 1); + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //if fast chatting is off + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (BotNumActivePlayers() <= 1) return qfalse; + // + if (bs->lastkilledby >= 0 && bs->lastkilledby < MAX_CLIENTS) + EasyClientName(bs->lastkilledby, name, 32); + else + strcpy(name, "[world]"); + // + if (TeamPlayIsOn() && BotSameTeam(bs, bs->lastkilledby)) { + if (bs->lastkilledby == bs->client) return qfalse; + BotAI_BotInitialChat(bs, "death_teammate", name, NULL); + bs->chatto = CHAT_TEAM; + } + else + { + //teamplay + if (TeamPlayIsOn()) { + trap_EA_Command(bs->client, "vtaunt"); + return qtrue; + } + // + if (bs->botdeathtype == MOD_WATER) + BotAI_BotInitialChat(bs, "death_drown", + BotRandomOpponentName(bs), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else if (bs->botdeathtype == MOD_SLIME) + BotAI_BotInitialChat(bs, "death_slime", + BotRandomOpponentName(bs), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else if (bs->botdeathtype == MOD_LAVA) + BotAI_BotInitialChat(bs, "death_lava", + BotRandomOpponentName(bs), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else if (bs->botdeathtype == MOD_FALLING) + BotAI_BotInitialChat(bs, "death_cratered", + BotRandomOpponentName(bs), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else if (bs->botsuicide || //all other suicides by own weapon + bs->botdeathtype == MOD_CRUSH || + bs->botdeathtype == MOD_SUICIDE || + bs->botdeathtype == MOD_TARGET_LASER || + bs->botdeathtype == MOD_TRIGGER_HURT || + bs->botdeathtype == MOD_UNKNOWN) + BotAI_BotInitialChat(bs, "death_suicide", + BotRandomOpponentName(bs), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else if (bs->botdeathtype == MOD_TELEFRAG) + BotAI_BotInitialChat(bs, "death_telefrag", + name, // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); +#ifdef MISSIONPACK + else if (bs->botdeathtype == MOD_KAMIKAZE && trap_BotNumInitialChats(bs->cs, "death_kamikaze")) + BotAI_BotInitialChat(bs, "death_kamikaze", name, NULL); +#endif + else { + if ((bs->botdeathtype == MOD_GAUNTLET || + bs->botdeathtype == MOD_RAILGUN || + bs->botdeathtype == MOD_BFG || + bs->botdeathtype == MOD_BFG_SPLASH) && random() < 0.5) { + + if (bs->botdeathtype == MOD_GAUNTLET) + BotAI_BotInitialChat(bs, "death_gauntlet", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else if (bs->botdeathtype == MOD_RAILGUN) + BotAI_BotInitialChat(bs, "death_rail", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + else + BotAI_BotInitialChat(bs, "death_bfg", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } + //choose between insult and praise + else if (random() < trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_INSULT, 0, 1)) { + BotAI_BotInitialChat(bs, "death_insult", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + } + else { + BotAI_BotInitialChat(bs, "death_praise", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + } + } + bs->chatto = CHAT_ALL; + } + bs->lastchat_time = FloatTime(); + return qtrue; +} + +/* +================== +BotChat_Kill +================== +*/ +int BotChat_Kill(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_KILL, 0, 1); + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //if fast chat is off + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (bs->lastkilledplayer == bs->client) return qfalse; + if (BotNumActivePlayers() <= 1) return qfalse; + if (!BotValidChatPosition(bs)) return qfalse; + // + if (BotVisibleEnemies(bs)) return qfalse; + // + EasyClientName(bs->lastkilledplayer, name, 32); + // + bs->chatto = CHAT_ALL; + if (TeamPlayIsOn() && BotSameTeam(bs, bs->lastkilledplayer)) { + BotAI_BotInitialChat(bs, "kill_teammate", name, NULL); + bs->chatto = CHAT_TEAM; + } + else + { + //don't chat in teamplay + if (TeamPlayIsOn()) { + trap_EA_Command(bs->client, "vtaunt"); + return qfalse; // don't wait + } + // + if (bs->enemydeathtype == MOD_GAUNTLET) { + BotAI_BotInitialChat(bs, "kill_gauntlet", + name, // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } + else if (bs->enemydeathtype == MOD_RAILGUN) { + BotAI_BotInitialChat(bs, "kill_rail", + name, // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } + else if (bs->enemydeathtype == MOD_TELEFRAG) { + BotAI_BotInitialChat(bs, "kill_telefrag", + name, // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + } +#ifdef MISSIONPACK + else if (bs->botdeathtype == MOD_KAMIKAZE && trap_BotNumInitialChats(bs->cs, "kill_kamikaze")) + BotAI_BotInitialChat(bs, "kill_kamikaze", name, NULL); +#endif + //choose between insult and praise + else if (random() < trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_INSULT, 0, 1)) { + BotAI_BotInitialChat(bs, "kill_insult", name, NULL); + } + else { + BotAI_BotInitialChat(bs, "kill_praise", name, NULL); + } + } + bs->lastchat_time = FloatTime(); + return qtrue; +} + +/* +================== +BotChat_EnemySuicide +================== +*/ +int BotChat_EnemySuicide(bot_state_t *bs) { + char name[32]; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + if (BotNumActivePlayers() <= 1) return qfalse; + // + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_KILL, 0, 1); + //don't chat in teamplay + if (TeamPlayIsOn()) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //if fast chat is off + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + } + if (!BotValidChatPosition(bs)) return qfalse; + // + if (BotVisibleEnemies(bs)) return qfalse; + // + if (bs->enemy >= 0) EasyClientName(bs->enemy, name, 32); + else strcpy(name, ""); + BotAI_BotInitialChat(bs, "enemy_suicide", name, NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_HitTalking +================== +*/ +int BotChat_HitTalking(bot_state_t *bs) { + char name[32], *weap; + int lasthurt_client; + float rnd; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + if (BotNumActivePlayers() <= 1) return qfalse; + lasthurt_client = g_entities[bs->client].client->lasthurt_client; + if (!lasthurt_client) return qfalse; + if (lasthurt_client == bs->client) return qfalse; + // + if (lasthurt_client < 0 || lasthurt_client >= MAX_CLIENTS) return qfalse; + // + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_HITTALKING, 0, 1); + //don't chat in teamplay + if (TeamPlayIsOn()) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //if fast chat is off + if (!bot_fastchat.integer) { + if (random() > rnd * 0.5) return qfalse; + } + if (!BotValidChatPosition(bs)) return qfalse; + // + ClientName(g_entities[bs->client].client->lasthurt_client, name, sizeof(name)); + weap = BotWeaponNameForMeansOfDeath(g_entities[bs->client].client->lasthurt_client); + // + BotAI_BotInitialChat(bs, "hit_talking", name, weap, NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_HitNoDeath +================== +*/ +int BotChat_HitNoDeath(bot_state_t *bs) { + char name[32], *weap; + float rnd; + int lasthurt_client; + aas_entityinfo_t entinfo; + + lasthurt_client = g_entities[bs->client].client->lasthurt_client; + if (!lasthurt_client) return qfalse; + if (lasthurt_client == bs->client) return qfalse; + // + if (lasthurt_client < 0 || lasthurt_client >= MAX_CLIENTS) return qfalse; + // + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + if (BotNumActivePlayers() <= 1) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_HITNODEATH, 0, 1); + //don't chat in teamplay + if (TeamPlayIsOn()) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //if fast chat is off + if (!bot_fastchat.integer) { + if (random() > rnd * 0.5) return qfalse; + } + if (!BotValidChatPosition(bs)) return qfalse; + // + if (BotVisibleEnemies(bs)) return qfalse; + // + BotEntityInfo(bs->enemy, &entinfo); + if (EntityIsShooting(&entinfo)) return qfalse; + // + ClientName(lasthurt_client, name, sizeof(name)); + weap = BotWeaponNameForMeansOfDeath(g_entities[bs->client].client->lasthurt_mod); + // + BotAI_BotInitialChat(bs, "hit_nodeath", name, weap, NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_HitNoKill +================== +*/ +int BotChat_HitNoKill(bot_state_t *bs) { + char name[32], *weap; + float rnd; + aas_entityinfo_t entinfo; + + if (bot_nochat.integer) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + if (BotNumActivePlayers() <= 1) return qfalse; + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_HITNOKILL, 0, 1); + //don't chat in teamplay + if (TeamPlayIsOn()) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //if fast chat is off + if (!bot_fastchat.integer) { + if (random() > rnd * 0.5) return qfalse; + } + if (!BotValidChatPosition(bs)) return qfalse; + // + if (BotVisibleEnemies(bs)) return qfalse; + // + BotEntityInfo(bs->enemy, &entinfo); + if (EntityIsShooting(&entinfo)) return qfalse; + // + ClientName(bs->enemy, name, sizeof(name)); + weap = BotWeaponNameForMeansOfDeath(g_entities[bs->enemy].client->lasthurt_mod); + // + BotAI_BotInitialChat(bs, "hit_nokill", name, weap, NULL); + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChat_Random +================== +*/ +int BotChat_Random(bot_state_t *bs) { + float rnd; + char name[32]; + + if (bot_nochat.integer) return qfalse; + if (BotIsObserver(bs)) return qfalse; + if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; + // don't chat in tournament mode + if (gametype == GT_TOURNAMENT) return qfalse; + //don't chat when doing something important :) + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_RUSHBASE) return qfalse; + // + rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_RANDOM, 0, 1); + if (random() > bs->thinktime * 0.1) return qfalse; + if (!bot_fastchat.integer) { + if (random() > rnd) return qfalse; + if (random() > 0.25) return qfalse; + } + if (BotNumActivePlayers() <= 1) return qfalse; + // + if (!BotValidChatPosition(bs)) return qfalse; + // + if (BotVisibleEnemies(bs)) return qfalse; + // + if (bs->lastkilledplayer == bs->client) { + strcpy(name, BotRandomOpponentName(bs)); + } + else { + EasyClientName(bs->lastkilledplayer, name, sizeof(name)); + } + if (TeamPlayIsOn()) { + trap_EA_Command(bs->client, "vtaunt"); + return qfalse; // don't wait + } + // + if (random() < trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_MISC, 0, 1)) { + BotAI_BotInitialChat(bs, "random_misc", + BotRandomOpponentName(bs), // 0 + name, // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + BotRandomWeaponName(), // 5 + NULL); + } + else { + BotAI_BotInitialChat(bs, "random_insult", + BotRandomOpponentName(bs), // 0 + name, // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + BotRandomWeaponName(), // 5 + NULL); + } + bs->lastchat_time = FloatTime(); + bs->chatto = CHAT_ALL; + return qtrue; +} + +/* +================== +BotChatTime +================== +*/ +float BotChatTime(bot_state_t *bs) { + int cpm; + + cpm = trap_Characteristic_BInteger(bs->character, CHARACTERISTIC_CHAT_CPM, 1, 4000); + + return 2.0; //(float) trap_BotChatLength(bs->cs) * 30 / cpm; +} + +/* +================== +BotChatTest +================== +*/ +void BotChatTest(bot_state_t *bs) { + + char name[32]; + char *weap; + int num, i; + + num = trap_BotNumInitialChats(bs->cs, "game_enter"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "game_enter", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "game_exit"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "game_exit", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "level_start"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "level_start", + EasyClientName(bs->client, name, 32), // 0 + "[invalid var]", // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + "[invalid var]", // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "level_end_victory"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "level_end_victory", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + BotFirstClientInRankings(), // 2 + BotLastClientInRankings(), // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "level_end_lose"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "level_end_lose", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + BotFirstClientInRankings(), // 2 + BotLastClientInRankings(), // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "level_end"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "level_end", + EasyClientName(bs->client, name, 32), // 0 + BotRandomOpponentName(bs), // 1 + BotFirstClientInRankings(), // 2 + BotLastClientInRankings(), // 3 + BotMapTitle(), // 4 + //PKMOD - Ergodic 01/16/02 - add new variable for Private Bot's Owner + PrivateBotOwner(bs), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + EasyClientName(bs->lastkilledby, name, sizeof(name)); + num = trap_BotNumInitialChats(bs->cs, "death_drown"); + for (i = 0; i < num; i++) + { + // + BotAI_BotInitialChat(bs, "death_drown", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_slime"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_slime", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_lava"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_lava", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_cratered"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_cratered", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_suicide"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_suicide", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_telefrag"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_telefrag", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_gauntlet"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_gauntlet", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_rail"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_rail", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_bfg"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_bfg", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_insult"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_insult", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "death_praise"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "death_praise", + name, // 0 + BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + // + EasyClientName(bs->lastkilledplayer, name, 32); + // + num = trap_BotNumInitialChats(bs->cs, "kill_gauntlet"); + for (i = 0; i < num; i++) + { + // + BotAI_BotInitialChat(bs, "kill_gauntlet", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "kill_rail"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "kill_rail", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "kill_telefrag"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "kill_telefrag", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "kill_insult"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "kill_insult", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "kill_praise"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "kill_praise", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "enemy_suicide"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "enemy_suicide", name, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + ClientName(g_entities[bs->client].client->lasthurt_client, name, sizeof(name)); + weap = BotWeaponNameForMeansOfDeath(g_entities[bs->client].client->lasthurt_client); + num = trap_BotNumInitialChats(bs->cs, "hit_talking"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "hit_talking", name, weap, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "hit_nodeath"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "hit_nodeath", name, weap, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "hit_nokill"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "hit_nokill", name, weap, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + // + if (bs->lastkilledplayer == bs->client) { + strcpy(name, BotRandomOpponentName(bs)); + } + else { + EasyClientName(bs->lastkilledplayer, name, sizeof(name)); + } + // + num = trap_BotNumInitialChats(bs->cs, "random_misc"); + for (i = 0; i < num; i++) + { + // + BotAI_BotInitialChat(bs, "random_misc", + BotRandomOpponentName(bs), // 0 + name, // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + BotRandomWeaponName(), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } + num = trap_BotNumInitialChats(bs->cs, "random_insult"); + for (i = 0; i < num; i++) + { + BotAI_BotInitialChat(bs, "random_insult", + BotRandomOpponentName(bs), // 0 + name, // 1 + "[invalid var]", // 2 + "[invalid var]", // 3 + BotMapTitle(), // 4 + BotRandomWeaponName(), // 5 + NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_ALL); + } +} diff --git a/quake3/source/code/game/ai_chat.h b/quake3/source/code/game/ai_chat.h new file mode 100644 index 0000000..7c5a642 --- /dev/null +++ b/quake3/source/code/game/ai_chat.h @@ -0,0 +1,41 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_chat.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_chat.c $ + * + *****************************************************************************/ + +// +int BotChat_EnterGame(bot_state_t *bs); +// +int BotChat_ExitGame(bot_state_t *bs); +// +int BotChat_StartLevel(bot_state_t *bs); +// +int BotChat_EndLevel(bot_state_t *bs); +// +int BotChat_HitTalking(bot_state_t *bs); +// +int BotChat_HitNoDeath(bot_state_t *bs); +// +int BotChat_HitNoKill(bot_state_t *bs); +// +int BotChat_Death(bot_state_t *bs); +// +int BotChat_Kill(bot_state_t *bs); +// +int BotChat_EnemySuicide(bot_state_t *bs); +// +int BotChat_Random(bot_state_t *bs); +// time the selected chat takes to type in +float BotChatTime(bot_state_t *bs); +// returns true if the bot can chat at the current position +int BotValidChatPosition(bot_state_t *bs); +// test the initial bot chats +void BotChatTest(bot_state_t *bs); + diff --git a/quake3/source/code/game/ai_cmd.c b/quake3/source/code/game/ai_cmd.c new file mode 100644 index 0000000..e17dbc3 --- /dev/null +++ b/quake3/source/code/game/ai_cmd.c @@ -0,0 +1,2085 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_cmd.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_cmd.c $ + * + *****************************************************************************/ + +#include "g_local.h" +#include "botlib.h" +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +#include "ai_team.h" +// +#include "chars.h" //characteristics +#include "inv.h" //indexes into the inventory +#include "syn.h" //synonyms +#include "match.h" //string matching types and vars + +// for the voice chats +#include "../../ui/menudef.h" + +int notleader[MAX_CLIENTS]; + +#ifdef DEBUG +/* +================== +BotPrintTeamGoal +================== +*/ +void BotPrintTeamGoal(bot_state_t *bs) { + char netname[MAX_NETNAME]; + float t; + + ClientName(bs->client, netname, sizeof(netname)); + t = bs->teamgoal_time - FloatTime(); + switch(bs->ltgtype) { + case LTG_TEAMHELP: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna help a team mate for %1.0f secs\n", netname, t); + break; + } + case LTG_TEAMACCOMPANY: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna accompany a team mate for %1.0f secs\n", netname, t); + break; + } + case LTG_GETFLAG: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna get the flag for %1.0f secs\n", netname, t); + break; + } + case LTG_RUSHBASE: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna rush to the base for %1.0f secs\n", netname, t); + break; + } + case LTG_RETURNFLAG: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna try to return the flag for %1.0f secs\n", netname, t); + break; + } +#ifdef MISSIONPACK + case LTG_ATTACKENEMYBASE: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna attack the enemy base for %1.0f secs\n", netname, t); + break; + } + case LTG_HARVEST: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna harvest for %1.0f secs\n", netname, t); + break; + } +#endif + case LTG_DEFENDKEYAREA: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna defend a key area for %1.0f secs\n", netname, t); + break; + } + case LTG_GETITEM: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna get an item for %1.0f secs\n", netname, t); + break; + } + case LTG_KILL: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna kill someone for %1.0f secs\n", netname, t); + break; + } + case LTG_CAMP: + case LTG_CAMPORDER: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna camp for %1.0f secs\n", netname, t); + break; + } + case LTG_PATROL: + { + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna patrol for %1.0f secs\n", netname, t); + break; + } + default: + { + if (bs->ctfroam_time > FloatTime()) { + t = bs->ctfroam_time - FloatTime(); + BotAI_Print(PRT_MESSAGE, "%s: I'm gonna roam for %1.0f secs\n", netname, t); + } + else { + BotAI_Print(PRT_MESSAGE, "%s: I've got a regular goal\n", netname); + } + } + } +} +#endif //DEBUG + +/* +================== +BotGetItemTeamGoal + +FIXME: add stuff like "upper rocket launcher" +"the rl near the railgun", "lower grenade launcher" etc. +================== +*/ +int BotGetItemTeamGoal(char *goalname, bot_goal_t *goal) { + int i; + + if (!strlen(goalname)) return qfalse; + i = -1; + do { + i = trap_BotGetLevelItemGoal(i, goalname, goal); + if (i > 0) { + //do NOT defend dropped items + if (goal->flags & GFL_DROPPED) + continue; + return qtrue; + } + } while(i > 0); + return qfalse; +} + +/* +================== +BotGetMessageTeamGoal +================== +*/ +int BotGetMessageTeamGoal(bot_state_t *bs, char *goalname, bot_goal_t *goal) { + bot_waypoint_t *cp; + + if (BotGetItemTeamGoal(goalname, goal)) return qtrue; + + cp = BotFindWayPoint(bs->checkpoints, goalname); + if (cp) { + memcpy(goal, &cp->goal, sizeof(bot_goal_t)); + return qtrue; + } + return qfalse; +} + +/* +================== +BotGetTime +================== +*/ +float BotGetTime(bot_match_t *match) { + bot_match_t timematch; + char timestring[MAX_MESSAGE_SIZE]; + float t; + + //if the matched string has a time + if (match->subtype & ST_TIME) { + //get the time string + trap_BotMatchVariable(match, TIME, timestring, MAX_MESSAGE_SIZE); + //match it to find out if the time is in seconds or minutes + if (trap_BotFindMatch(timestring, &timematch, MTCONTEXT_TIME)) { + if (timematch.type == MSG_FOREVER) { + t = 99999999.0f; + } + else if (timematch.type == MSG_FORAWHILE) { + t = 10 * 60; // 10 minutes + } + else if (timematch.type == MSG_FORALONGTIME) { + t = 30 * 60; // 30 minutes + } + else { + trap_BotMatchVariable(&timematch, TIME, timestring, MAX_MESSAGE_SIZE); + if (timematch.type == MSG_MINUTES) t = atof(timestring) * 60; + else if (timematch.type == MSG_SECONDS) t = atof(timestring); + else t = 0; + } + //if there's a valid time + if (t > 0) return FloatTime() + t; + } + } + return 0; +} + +/* +================== +FindClientByName +================== +*/ +int FindClientByName(char *name) { + int i; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + ClientName(i, buf, sizeof(buf)); + if (!Q_stricmp(buf, name)) return i; + } + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + ClientName(i, buf, sizeof(buf)); + if (stristr(buf, name)) return i; + } + return -1; +} + +/* +================== +FindEnemyByName +================== +*/ +int FindEnemyByName(bot_state_t *bs, char *name) { + int i; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (BotSameTeam(bs, i)) continue; + ClientName(i, buf, sizeof(buf)); + if (!Q_stricmp(buf, name)) return i; + } + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (BotSameTeam(bs, i)) continue; + ClientName(i, buf, sizeof(buf)); + if (stristr(buf, name)) return i; + } + return -1; +} + +/* +================== +NumPlayersOnSameTeam +================== +*/ +int NumPlayersOnSameTeam(bot_state_t *bs) { + int i, num; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + num = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, MAX_INFO_STRING); + if (strlen(buf)) { + if (BotSameTeam(bs, i+1)) num++; + } + } + return num; +} + +/* +================== +TeamPlayIsOn +================== +*/ +int BotGetPatrolWaypoints(bot_state_t *bs, bot_match_t *match) { + char keyarea[MAX_MESSAGE_SIZE]; + int patrolflags; + bot_waypoint_t *wp, *newwp, *newpatrolpoints; + bot_match_t keyareamatch; + bot_goal_t goal; + + newpatrolpoints = NULL; + patrolflags = 0; + // + trap_BotMatchVariable(match, KEYAREA, keyarea, MAX_MESSAGE_SIZE); + // + while(1) { + if (!trap_BotFindMatch(keyarea, &keyareamatch, MTCONTEXT_PATROLKEYAREA)) { + trap_EA_SayTeam(bs->client, "what do you say?"); + BotFreeWaypoints(newpatrolpoints); + bs->patrolpoints = NULL; + return qfalse; + } + trap_BotMatchVariable(&keyareamatch, KEYAREA, keyarea, MAX_MESSAGE_SIZE); + if (!BotGetMessageTeamGoal(bs, keyarea, &goal)) { + //BotAI_BotInitialChat(bs, "cannotfind", keyarea, NULL); + //trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotFreeWaypoints(newpatrolpoints); + bs->patrolpoints = NULL; + return qfalse; + } + //create a new waypoint + newwp = BotCreateWayPoint(keyarea, goal.origin, goal.areanum); + if (!newwp) + break; + //add the waypoint to the patrol points + newwp->next = NULL; + for (wp = newpatrolpoints; wp && wp->next; wp = wp->next); + if (!wp) { + newpatrolpoints = newwp; + newwp->prev = NULL; + } + else { + wp->next = newwp; + newwp->prev = wp; + } + // + if (keyareamatch.subtype & ST_BACK) { + patrolflags = PATROL_LOOP; + break; + } + else if (keyareamatch.subtype & ST_REVERSE) { + patrolflags = PATROL_REVERSE; + break; + } + else if (keyareamatch.subtype & ST_MORE) { + trap_BotMatchVariable(&keyareamatch, MORE, keyarea, MAX_MESSAGE_SIZE); + } + else { + break; + } + } + // + if (!newpatrolpoints || !newpatrolpoints->next) { + trap_EA_SayTeam(bs->client, "I need more key points to patrol\n"); + BotFreeWaypoints(newpatrolpoints); + newpatrolpoints = NULL; + return qfalse; + } + // + BotFreeWaypoints(bs->patrolpoints); + bs->patrolpoints = newpatrolpoints; + // + bs->curpatrolpoint = bs->patrolpoints; + bs->patrolflags = patrolflags; + // + return qtrue; +} + +/* +================== +BotAddressedToBot +================== +*/ +int BotAddressedToBot(bot_state_t *bs, bot_match_t *match) { + char addressedto[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + char name[MAX_MESSAGE_SIZE]; + char botname[128]; + int client; + bot_match_t addresseematch; + + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = ClientOnSameTeamFromName(bs, netname); + if (client < 0) return qfalse; + //if the message is addressed to someone + if (match->subtype & ST_ADDRESSED) { + trap_BotMatchVariable(match, ADDRESSEE, addressedto, sizeof(addressedto)); + //the name of this bot + ClientName(bs->client, botname, 128); + // + while(trap_BotFindMatch(addressedto, &addresseematch, MTCONTEXT_ADDRESSEE)) { + if (addresseematch.type == MSG_EVERYONE) { + return qtrue; + } + else if (addresseematch.type == MSG_MULTIPLENAMES) { + trap_BotMatchVariable(&addresseematch, TEAMMATE, name, sizeof(name)); + if (strlen(name)) { + if (stristr(botname, name)) return qtrue; + if (stristr(bs->subteam, name)) return qtrue; + } + trap_BotMatchVariable(&addresseematch, MORE, addressedto, MAX_MESSAGE_SIZE); + } + else { + trap_BotMatchVariable(&addresseematch, TEAMMATE, name, MAX_MESSAGE_SIZE); + if (strlen(name)) { + if (stristr(botname, name)) return qtrue; + if (stristr(bs->subteam, name)) return qtrue; + } + break; + } + } + //Com_sprintf(buf, sizeof(buf), "not addressed to me but %s", addressedto); + //trap_EA_Say(bs->client, buf); + return qfalse; + } + else { + bot_match_t tellmatch; + + tellmatch.type = 0; + //if this message wasn't directed solely to this bot + if (!trap_BotFindMatch(match->string, &tellmatch, MTCONTEXT_REPLYCHAT) || + tellmatch.type != MSG_CHATTELL) { + //make sure not everyone reacts to this message + if (random() > (float ) 1.0 / (NumPlayersOnSameTeam(bs)-1)) return qfalse; + } + } + return qtrue; +} + +/* +================== +BotGPSToPosition +================== +*/ +int BotGPSToPosition(char *buf, vec3_t position) { + int i, j = 0; + int num, sign; + + for (i = 0; i < 3; i++) { + num = 0; + while(buf[j] == ' ') j++; + if (buf[j] == '-') { + j++; + sign = -1; + } + else { + sign = 1; + } + while (buf[j]) { + if (buf[j] >= '0' && buf[j] <= '9') { + num = num * 10 + buf[j] - '0'; + j++; + } + else { + j++; + break; + } + } + BotAI_Print(PRT_MESSAGE, "%d\n", sign * num); + position[i] = (float) sign * num; + } + return qtrue; +} + +/* +================== +BotMatch_HelpAccompany +================== +*/ +void BotMatch_HelpAccompany(bot_state_t *bs, bot_match_t *match) { + int client, other, areanum; + char teammate[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + char itemname[MAX_MESSAGE_SIZE]; + bot_match_t teammatematch; + aas_entityinfo_t entinfo; + + //PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + //get the netname + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + //get the team mate name + trap_BotMatchVariable(match, TEAMMATE, teammate, sizeof(teammate)); + //get the client to help + if (trap_BotFindMatch(teammate, &teammatematch, MTCONTEXT_TEAMMATE) && + //if someone asks for him or herself + teammatematch.type == MSG_ME) { + client = ClientFromName(netname); + other = qfalse; + } + else { + //asked for someone else + client = FindClientByName(teammate); + //if this is the bot self + if (client == bs->client) { + other = qfalse; + } + else if (!BotSameTeam(bs, client)) { + //FIXME: say "I don't help the enemy" + return; + } + else { + other = qtrue; + } + } + //if the bot doesn't know who to help (FindClientByName returned -1) + if (client < 0) { + if (other) BotAI_BotInitialChat(bs, "whois", teammate, NULL); + else BotAI_BotInitialChat(bs, "whois", netname, NULL); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + return; + } + //don't help or accompany yourself + if (client == bs->client) { + return; + } + // + bs->teamgoal.entitynum = -1; + BotEntityInfo(client, &entinfo); + //if info is valid (in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum) {// && trap_AAS_AreaReachability(areanum)) { + bs->teamgoal.entitynum = client; + bs->teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + } + } + //if no teamgoal yet + if (bs->teamgoal.entitynum < 0) { + //if near an item + if (match->subtype & ST_NEARITEM) { + //get the match variable + trap_BotMatchVariable(match, ITEM, itemname, sizeof(itemname)); + // + if (!BotGetMessageTeamGoal(bs, itemname, &bs->teamgoal)) { + //BotAI_BotInitialChat(bs, "cannotfind", itemname, NULL); + //trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); + return; + } + } + } + // + if (bs->teamgoal.entitynum < 0) { + if (other) BotAI_BotInitialChat(bs, "whereis", teammate, NULL); + else BotAI_BotInitialChat(bs, "whereareyou", netname, NULL); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TEAM); + return; + } + //the team mate + bs->teammate = client; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = ClientFromName(netname); + //the team mate who ordered + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //last time the team mate was assumed visible + bs->teammatevisible_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //get the team goal time + bs->teamgoal_time = BotGetTime(match); + //set the ltg type + if (match->type == MSG_HELP) { + bs->ltgtype = LTG_TEAMHELP; + if (!bs->teamgoal_time) bs->teamgoal_time = FloatTime() + TEAM_HELP_TIME; + } + else { + bs->ltgtype = LTG_TEAMACCOMPANY; + if (!bs->teamgoal_time) bs->teamgoal_time = FloatTime() + TEAM_ACCOMPANY_TIME; + bs->formation_dist = 3.5 * 32; //3.5 meter + bs->arrive_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); + } +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_DefendKeyArea +================== +*/ +void BotMatch_DefendKeyArea(bot_state_t *bs, bot_match_t *match) { + char itemname[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + //get the match variable + trap_BotMatchVariable(match, KEYAREA, itemname, sizeof(itemname)); + // + if (!BotGetMessageTeamGoal(bs, itemname, &bs->teamgoal)) { + //BotAI_BotInitialChat(bs, "cannotfind", itemname, NULL); + //trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); + return; + } + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = ClientFromName(netname); + //the team mate who ordered + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //get the team goal time + bs->teamgoal_time = BotGetTime(match); + //set the team goal time + if (!bs->teamgoal_time) bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + //away from defending + bs->defendaway_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_GetItem +================== +*/ +void BotMatch_GetItem(bot_state_t *bs, bot_match_t *match) { + char itemname[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + int client; + +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + //get the match variable + trap_BotMatchVariable(match, ITEM, itemname, sizeof(itemname)); + // + if (!BotGetMessageTeamGoal(bs, itemname, &bs->teamgoal)) { + //BotAI_BotInitialChat(bs, "cannotfind", itemname, NULL); + //trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); + return; + } + // + client = ClientOnSameTeamFromName(bs, netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_GETITEM; + //set the team goal time + bs->teamgoal_time = FloatTime() + TEAM_GETITEM_TIME; + // + BotSetTeamStatus(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_Camp +================== +*/ +void BotMatch_Camp(bot_state_t *bs, bot_match_t *match) { + int client, areanum; + char netname[MAX_MESSAGE_SIZE]; + char itemname[MAX_MESSAGE_SIZE]; + aas_entityinfo_t entinfo; + +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + + //asked for someone else + client = FindClientByName(netname); + //if there's no valid client with this name + if (client < 0) { + BotAI_BotInitialChat(bs, "whois", netname, NULL); + trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); + return; + } + //get the match variable + trap_BotMatchVariable(match, KEYAREA, itemname, sizeof(itemname)); + //in CTF it could be the base + if (match->subtype & ST_THERE) { + //camp at the spot the bot is currently standing + bs->teamgoal.entitynum = bs->entitynum; + bs->teamgoal.areanum = bs->areanum; + VectorCopy(bs->origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + } + else if (match->subtype & ST_HERE) { + //if this is the bot self + if (client == bs->client) return; + // + bs->teamgoal.entitynum = -1; + BotEntityInfo(client, &entinfo); + //if info is valid (in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum) {// && trap_AAS_AreaReachability(areanum)) { + //NOTE: just assume the bot knows where the person is + //if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, client)) { + bs->teamgoal.entitynum = client; + bs->teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + //} + } + } + //if the other is not visible + if (bs->teamgoal.entitynum < 0) { + BotAI_BotInitialChat(bs, "whereareyou", netname, NULL); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + return; + } + } + else if (!BotGetMessageTeamGoal(bs, itemname, &bs->teamgoal)) { + //BotAI_BotInitialChat(bs, "cannotfind", itemname, NULL); + //client = ClientFromName(netname); + //trap_BotEnterChat(bs->cs, client, CHAT_TELL); + return; + } + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_CAMPORDER; + //get the team goal time + bs->teamgoal_time = BotGetTime(match); + //set the team goal time + if (!bs->teamgoal_time) bs->teamgoal_time = FloatTime() + TEAM_CAMP_TIME; + //not arrived yet + bs->arrive_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_Patrol +================== +*/ +void BotMatch_Patrol(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + + //get the patrol waypoints + if (!BotGetPatrolWaypoints(bs, match)) return; + // + client = FindClientByName(netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_PATROL; + //get the team goal time + bs->teamgoal_time = BotGetTime(match); + //set the team goal time if not set already + if (!bs->teamgoal_time) bs->teamgoal_time = FloatTime() + TEAM_PATROL_TIME; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_GetFlag +================== +*/ +void BotMatch_GetFlag(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (gametype == GT_CTF) { + if (!ctf_redflag.areanum || !ctf_blueflag.areanum) + return; + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (!ctf_neutralflag.areanum || !ctf_redflag.areanum || !ctf_blueflag.areanum) + return; + } +#endif + else { + return; + } + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = FindClientByName(netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_GETFLAG; + //set the team goal time + bs->teamgoal_time = FloatTime() + CTF_GETFLAG_TIME; + // get an alternate route in ctf + if (gametype == GT_CTF) { + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + } + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_AttackEnemyBase +================== +*/ +void BotMatch_AttackEnemyBase(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (gametype == GT_CTF) { + BotMatch_GetFlag(bs, match); + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF || gametype == GT_OBELISK || gametype == GT_HARVESTER) { + if (!redobelisk.areanum || !blueobelisk.areanum) + return; + } +#endif + else { + return; + } + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = FindClientByName(netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_ATTACKENEMYBASE; + //set the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ATTACKENEMYBASE_TIME; + bs->attackaway_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +#ifdef MISSIONPACK +/* +================== +BotMatch_Harvest +================== +*/ +void BotMatch_Harvest(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (gametype == GT_HARVESTER) { + if (!neutralobelisk.areanum || !redobelisk.areanum || !blueobelisk.areanum) + return; + } + else { + return; + } + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = FindClientByName(netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_HARVEST; + //set the team goal time + bs->teamgoal_time = FloatTime() + TEAM_HARVEST_TIME; + bs->harvestaway_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} +#endif + +/* +================== +BotMatch_RushBase +================== +*/ +void BotMatch_RushBase(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (gametype == GT_CTF) { + if (!ctf_redflag.areanum || !ctf_blueflag.areanum) + return; + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF || gametype == GT_HARVESTER) { + if (!redobelisk.areanum || !blueobelisk.areanum) + return; + } +#endif + else { + return; + } + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = FindClientByName(netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_RUSHBASE; + //set the team goal time + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + // + BotSetTeamStatus(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_TaskPreference +================== +*/ +void BotMatch_TaskPreference(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_NETNAME]; + char teammatename[MAX_MESSAGE_SIZE]; + int teammate, preference; + + ClientName(bs->client, netname, sizeof(netname)); + if (Q_stricmp(netname, bs->teamleader) != 0) return; + + trap_BotMatchVariable(match, NETNAME, teammatename, sizeof(teammatename)); + teammate = ClientFromName(teammatename); + if (teammate < 0) return; + + preference = BotGetTeamMateTaskPreference(bs, teammate); + switch(match->subtype) + { + case ST_DEFENDER: + { + preference &= ~TEAMTP_ATTACKER; + preference |= TEAMTP_DEFENDER; + break; + } + case ST_ATTACKER: + { + preference &= ~TEAMTP_DEFENDER; + preference |= TEAMTP_ATTACKER; + break; + } + case ST_ROAMER: + { + preference &= ~(TEAMTP_ATTACKER|TEAMTP_DEFENDER); + break; + } + } + BotSetTeamMateTaskPreference(bs, teammate, preference); + // + EasyClientName(teammate, teammatename, sizeof(teammatename)); + BotAI_BotInitialChat(bs, "keepinmind", teammatename, NULL); + trap_BotEnterChat(bs->cs, teammate, CHAT_TELL); + BotVoiceChatOnly(bs, teammate, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); +} + +/* +================== +BotMatch_ReturnFlag +================== +*/ +void BotMatch_ReturnFlag(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + //if not in CTF mode + if ( + gametype != GT_CTF +#ifdef MISSIONPACK + && gametype != GT_1FCTF +#endif + ) + return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) + return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + // + client = FindClientByName(netname); + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_RETURNFLAG; + //set the team goal time + bs->teamgoal_time = FloatTime() + CTF_RETURNFLAG_TIME; + bs->rushbaseaway_time = 0; + // + BotSetTeamStatus(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_JoinSubteam +================== +*/ +void BotMatch_JoinSubteam(bot_state_t *bs, bot_match_t *match) { + char teammate[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + //get the sub team name + trap_BotMatchVariable(match, TEAMNAME, teammate, sizeof(teammate)); + //set the sub team name + strncpy(bs->subteam, teammate, 32); + bs->subteam[31] = '\0'; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + BotAI_BotInitialChat(bs, "joinedteam", teammate, NULL); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); +} + +/* +================== +BotMatch_LeaveSubteam +================== +*/ +void BotMatch_LeaveSubteam(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + if (strlen(bs->subteam)) + { + BotAI_BotInitialChat(bs, "leftteam", bs->subteam, NULL); + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + } //end if + strcpy(bs->subteam, ""); +} + +/* +================== +BotMatch_LeaveSubteam +================== +*/ +void BotMatch_WhichTeam(bot_state_t *bs, bot_match_t *match) { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + if (strlen(bs->subteam)) { + BotAI_BotInitialChat(bs, "inteam", bs->subteam, NULL); + } + else { + BotAI_BotInitialChat(bs, "noteam", NULL); + } + trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); +} + +/* +================== +BotMatch_CheckPoint +================== +*/ +void BotMatch_CheckPoint(bot_state_t *bs, bot_match_t *match) { + int areanum, client; + char buf[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + vec3_t position; + bot_waypoint_t *cp; + + if (!TeamPlayIsOn()) return; + // + trap_BotMatchVariable(match, POSITION, buf, MAX_MESSAGE_SIZE); + VectorClear(position); + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = ClientFromName(netname); + //BotGPSToPosition(buf, position); + sscanf(buf, "%f %f %f", &position[0], &position[1], &position[2]); + position[2] += 0.5; + areanum = BotPointAreaNum(position); + if (!areanum) { + if (BotAddressedToBot(bs, match)) { + BotAI_BotInitialChat(bs, "checkpoint_invalid", NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + } + return; + } + // + trap_BotMatchVariable(match, NAME, buf, MAX_MESSAGE_SIZE); + //check if there already exists a checkpoint with this name + cp = BotFindWayPoint(bs->checkpoints, buf); + if (cp) { + if (cp->next) cp->next->prev = cp->prev; + if (cp->prev) cp->prev->next = cp->next; + else bs->checkpoints = cp->next; + cp->inuse = qfalse; + } + //create a new check point + cp = BotCreateWayPoint(buf, position, areanum); + //add the check point to the bot's known chech points + cp->next = bs->checkpoints; + if (bs->checkpoints) bs->checkpoints->prev = cp; + bs->checkpoints = cp; + // + if (BotAddressedToBot(bs, match)) { + Com_sprintf(buf, sizeof(buf), "%1.0f %1.0f %1.0f", cp->goal.origin[0], + cp->goal.origin[1], + cp->goal.origin[2]); + + BotAI_BotInitialChat(bs, "checkpoint_confirm", cp->name, buf, NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + } +} + +/* +================== +BotMatch_FormationSpace +================== +*/ +void BotMatch_FormationSpace(bot_state_t *bs, bot_match_t *match) { + char buf[MAX_MESSAGE_SIZE]; + float space; + + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NUMBER, buf, MAX_MESSAGE_SIZE); + //if it's the distance in feet + if (match->subtype & ST_FEET) space = 0.3048 * 32 * atof(buf); + //else it's in meters + else space = 32 * atof(buf); + //check if the formation intervening space is valid + if (space < 48 || space > 500) space = 100; + bs->formation_dist = space; +} + +/* +================== +BotMatch_Dismiss +================== +*/ +void BotMatch_Dismiss(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + client = ClientFromName(netname); + // + bs->decisionmaker = client; + // + bs->ltgtype = 0; + bs->lead_time = 0; + bs->lastgoal_ltgtype = 0; + // + BotAI_BotInitialChat(bs, "dismissed", NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); +} + +/* +================== +BotMatch_Suicide +================== +*/ +void BotMatch_Suicide(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + int client; + + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_EA_Command(bs->client, "kill"); + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = ClientFromName(netname); + // + BotVoiceChat(bs, client, VOICECHAT_TAUNT); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); +} + +/* +================== +BotMatch_StartTeamLeaderShip +================== +*/ +void BotMatch_StartTeamLeaderShip(bot_state_t *bs, bot_match_t *match) { + int client; + char teammate[MAX_MESSAGE_SIZE]; + + if (!TeamPlayIsOn()) return; + //if chats for him or herself + if (match->subtype & ST_I) { + //get the team mate that will be the team leader + trap_BotMatchVariable(match, NETNAME, teammate, sizeof(teammate)); + strncpy(bs->teamleader, teammate, sizeof(bs->teamleader)); + bs->teamleader[sizeof(bs->teamleader)] = '\0'; + } + //chats for someone else + else { + //get the team mate that will be the team leader + trap_BotMatchVariable(match, TEAMMATE, teammate, sizeof(teammate)); + client = FindClientByName(teammate); + if (client >= 0) ClientName(client, bs->teamleader, sizeof(bs->teamleader)); + } +} + +/* +================== +BotMatch_StopTeamLeaderShip +================== +*/ +void BotMatch_StopTeamLeaderShip(bot_state_t *bs, bot_match_t *match) { + int client; + char teammate[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + + if (!TeamPlayIsOn()) return; + //get the team mate that stops being the team leader + trap_BotMatchVariable(match, TEAMMATE, teammate, sizeof(teammate)); + //if chats for him or herself + if (match->subtype & ST_I) { + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = FindClientByName(netname); + } + //chats for someone else + else { + client = FindClientByName(teammate); + } //end else + if (client >= 0) { + if (!Q_stricmp(bs->teamleader, ClientName(client, netname, sizeof(netname)))) { + bs->teamleader[0] = '\0'; + notleader[client] = qtrue; + } + } +} + +/* +================== +BotMatch_WhoIsTeamLeader +================== +*/ +void BotMatch_WhoIsTeamLeader(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + + if (!TeamPlayIsOn()) return; + + ClientName(bs->client, netname, sizeof(netname)); + //if this bot IS the team leader + if (!Q_stricmp(netname, bs->teamleader)) { + trap_EA_SayTeam(bs->client, "I'm the team leader\n"); + } +} + +/* +================== +BotMatch_WhatAreYouDoing +================== +*/ +void BotMatch_WhatAreYouDoing(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_MESSAGE_SIZE]; + char goalname[MAX_MESSAGE_SIZE]; + int client; + +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + // + switch(bs->ltgtype) { + case LTG_TEAMHELP: + { + EasyClientName(bs->teammate, netname, sizeof(netname)); + BotAI_BotInitialChat(bs, "helping", netname, NULL); + break; + } + case LTG_TEAMACCOMPANY: + { + EasyClientName(bs->teammate, netname, sizeof(netname)); + BotAI_BotInitialChat(bs, "accompanying", netname, NULL); + break; + } + case LTG_DEFENDKEYAREA: + { + trap_BotGoalName(bs->teamgoal.number, goalname, sizeof(goalname)); + BotAI_BotInitialChat(bs, "defending", goalname, NULL); + break; + } + case LTG_GETITEM: + { + trap_BotGoalName(bs->teamgoal.number, goalname, sizeof(goalname)); + BotAI_BotInitialChat(bs, "gettingitem", goalname, NULL); + break; + } + case LTG_KILL: + { + ClientName(bs->teamgoal.entitynum, netname, sizeof(netname)); + BotAI_BotInitialChat(bs, "killing", netname, NULL); + break; + } + case LTG_CAMP: + case LTG_CAMPORDER: + { + BotAI_BotInitialChat(bs, "camping", NULL); + break; + } + case LTG_PATROL: + { + BotAI_BotInitialChat(bs, "patrolling", NULL); + break; + } + case LTG_GETFLAG: + { + BotAI_BotInitialChat(bs, "capturingflag", NULL); + break; + } + case LTG_RUSHBASE: + { + BotAI_BotInitialChat(bs, "rushingbase", NULL); + break; + } + case LTG_RETURNFLAG: + { + BotAI_BotInitialChat(bs, "returningflag", NULL); + break; + } +#ifdef MISSIONPACK + case LTG_ATTACKENEMYBASE: + { + BotAI_BotInitialChat(bs, "attackingenemybase", NULL); + break; + } + case LTG_HARVEST: + { + BotAI_BotInitialChat(bs, "harvesting", NULL); + break; + } +#endif + default: + { + BotAI_BotInitialChat(bs, "roaming", NULL); + break; + } + } + //chat what the bot is doing + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); +} + +/* +================== +BotMatch_WhatIsMyCommand +================== +*/ +void BotMatch_WhatIsMyCommand(bot_state_t *bs, bot_match_t *match) { + char netname[MAX_NETNAME]; + + ClientName(bs->client, netname, sizeof(netname)); + if (Q_stricmp(netname, bs->teamleader) != 0) return; + bs->forceorders = qtrue; +} + +/* +================== +BotNearestVisibleItem +================== +*/ +float BotNearestVisibleItem(bot_state_t *bs, char *itemname, bot_goal_t *goal) { + int i; + char name[64]; + bot_goal_t tmpgoal; + float dist, bestdist; + vec3_t dir; + bsp_trace_t trace; + + bestdist = 999999; + i = -1; + do { + i = trap_BotGetLevelItemGoal(i, itemname, &tmpgoal); + trap_BotGoalName(tmpgoal.number, name, sizeof(name)); + if (Q_stricmp(itemname, name) != 0) + continue; + VectorSubtract(tmpgoal.origin, bs->origin, dir); + dist = VectorLength(dir); + if (dist < bestdist) { + //trace from start to end + BotAI_Trace(&trace, bs->eye, NULL, NULL, tmpgoal.origin, bs->client, CONTENTS_SOLID|CONTENTS_PLAYERCLIP); + if (trace.fraction >= 1.0) { + bestdist = dist; + memcpy(goal, &tmpgoal, sizeof(bot_goal_t)); + } + } + } while(i > 0); + return bestdist; +} + +/* +================== +BotMatch_WhereAreYou +================== +*/ +void BotMatch_WhereAreYou(bot_state_t *bs, bot_match_t *match) { + float dist, bestdist; + int i, bestitem, redtt, bluett, client; + bot_goal_t goal; + char netname[MAX_MESSAGE_SIZE]; + char *nearbyitems[] = { +//PKMOD - Ergodic 03/22/01 - change shotgun name to boomstick + "Boomstick", + "Grenade Launcher", + "Rocket Launcher", + "Plasmagun", +//PKMOD - Ergodic 07/12/01 - change railgun name to magnum + "Magnum", +//PKMOD - Ergodic 12/19/03 - change Lightning Gun name to Chain Lightning Gun + "Chain Lightning Gun", + "BFG10K", + "Quad Damage", + "Regeneration", + "Battle Suit", + "Speed", + "Invisibility", + "Flight", + "Armor", + "Heavy Armor", + "Red Flag", + "Blue Flag", +//PKMOD - Ergodic 04/02/02 - add more PKA items + "Personal Sentry", + "Radiate", + "Private Bot (Legs)", + "Private Bot (Torso)", + "Private Bot (Head)", + "Gravity Well", + "Air Fist", + "Nail Gun", + "Dragon", +#ifdef MISSIONPACK + "Nailgun", + "Prox Launcher", + "Chaingun", + "Scout", + "Guard", + "Doubler", + "Ammo Regen", + "Neutral Flag", + "Red Obelisk", + "Blue Obelisk", + "Neutral Obelisk", +#endif + NULL + }; + // +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + + bestitem = -1; + bestdist = 999999; + for (i = 0; nearbyitems[i]; i++) { + dist = BotNearestVisibleItem(bs, nearbyitems[i], &goal); + if (dist < bestdist) { + bestdist = dist; + bestitem = i; + } + } + if (bestitem != -1) { + if (gametype == GT_CTF +#ifdef MISSIONPACK + || gametype == GT_1FCTF +#endif + ) { + redtt = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, ctf_redflag.areanum, TFL_DEFAULT); + bluett = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, ctf_blueflag.areanum, TFL_DEFAULT); + if (redtt < (redtt + bluett) * 0.4) { + BotAI_BotInitialChat(bs, "teamlocation", nearbyitems[bestitem], "red", NULL); + } + else if (bluett < (redtt + bluett) * 0.4) { + BotAI_BotInitialChat(bs, "teamlocation", nearbyitems[bestitem], "blue", NULL); + } + else { + BotAI_BotInitialChat(bs, "location", nearbyitems[bestitem], NULL); + } + } +#ifdef MISSIONPACK + else if (gametype == GT_OBELISK || gametype == GT_HARVESTER) { + redtt = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, redobelisk.areanum, TFL_DEFAULT); + bluett = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, blueobelisk.areanum, TFL_DEFAULT); + if (redtt < (redtt + bluett) * 0.4) { + BotAI_BotInitialChat(bs, "teamlocation", nearbyitems[bestitem], "red", NULL); + } + else if (bluett < (redtt + bluett) * 0.4) { + BotAI_BotInitialChat(bs, "teamlocation", nearbyitems[bestitem], "blue", NULL); + } + else { + BotAI_BotInitialChat(bs, "location", nearbyitems[bestitem], NULL); + } + } +#endif + else { + BotAI_BotInitialChat(bs, "location", nearbyitems[bestitem], NULL); + } + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + } +} + +/* +================== +BotMatch_LeadTheWay +================== +*/ +void BotMatch_LeadTheWay(bot_state_t *bs, bot_match_t *match) { + aas_entityinfo_t entinfo; + char netname[MAX_MESSAGE_SIZE], teammate[MAX_MESSAGE_SIZE]; + int client, areanum, other; + + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + //if someone asks for someone else + if (match->subtype & ST_SOMEONE) { + //get the team mate name + trap_BotMatchVariable(match, TEAMMATE, teammate, sizeof(teammate)); + client = FindClientByName(teammate); + //if this is the bot self + if (client == bs->client) { + other = qfalse; + } + else if (!BotSameTeam(bs, client)) { + //FIXME: say "I don't help the enemy" + return; + } + else { + other = qtrue; + } + } + else { + //get the netname + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = ClientFromName(netname); + other = qfalse; + } + //if the bot doesn't know who to help (FindClientByName returned -1) + if (client < 0) { + BotAI_BotInitialChat(bs, "whois", netname, NULL); + trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); + return; + } + // + bs->lead_teamgoal.entitynum = -1; + BotEntityInfo(client, &entinfo); + //if info is valid (in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum) { // && trap_AAS_AreaReachability(areanum)) { + bs->lead_teamgoal.entitynum = client; + bs->lead_teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->lead_teamgoal.origin); + VectorSet(bs->lead_teamgoal.mins, -8, -8, -8); + VectorSet(bs->lead_teamgoal.maxs, 8, 8, 8); + } + } + + if (bs->teamgoal.entitynum < 0) { + if (other) BotAI_BotInitialChat(bs, "whereis", teammate, NULL); + else BotAI_BotInitialChat(bs, "whereareyou", netname, NULL); + trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); + return; + } + bs->lead_teammate = client; + bs->lead_time = FloatTime() + TEAM_LEAD_TIME; + bs->leadvisible_time = 0; + bs->leadmessage_time = -(FloatTime() + 2 * random()); +} + +/* +================== +BotMatch_Kill +================== +*/ +void BotMatch_Kill(bot_state_t *bs, bot_match_t *match) { + char enemy[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + int client; + +//PKMOD - Ergodic 04/02/02 - check if bot is a Private Bot + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //get message originator + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + //PKMOD - Ergodic 04/02/02 - check if message is from Private bot's owner + if ( strcmp( bs->teamleader, netname) ) + //don't do anything if command is not coming from the teamleader + return; + } + else { + if (!TeamPlayIsOn()) return; + //if not addressed to this bot + if (!BotAddressedToBot(bs, match)) return; + // + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + } + + trap_BotMatchVariable(match, ENEMY, enemy, sizeof(enemy)); + // + client = FindEnemyByName(bs, enemy); + if (client < 0) { + BotAI_BotInitialChat(bs, "whois", enemy, NULL); + client = ClientFromName(netname); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + return; + } + bs->teamgoal.entitynum = client; + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_KILL; + //set the team goal time + bs->teamgoal_time = FloatTime() + TEAM_KILL_SOMEONE; + // + BotSetTeamStatus(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotMatch_CTF +================== +*/ +void BotMatch_CTF(bot_state_t *bs, bot_match_t *match) { + + char flag[128], netname[MAX_NETNAME]; + + if (gametype == GT_CTF) { + trap_BotMatchVariable(match, FLAG, flag, sizeof(flag)); + if (match->subtype & ST_GOTFLAG) { + if (!Q_stricmp(flag, "red")) { + bs->redflagstatus = 1; + if (BotTeam(bs) == TEAM_BLUE) { + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + bs->flagcarrier = ClientFromName(netname); + } + } + else { + bs->blueflagstatus = 1; + if (BotTeam(bs) == TEAM_RED) { + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + bs->flagcarrier = ClientFromName(netname); + } + } + bs->flagstatuschanged = 1; + bs->lastflagcapture_time = FloatTime(); + } + else if (match->subtype & ST_CAPTUREDFLAG) { + bs->redflagstatus = 0; + bs->blueflagstatus = 0; + bs->flagcarrier = 0; + bs->flagstatuschanged = 1; + } + else if (match->subtype & ST_RETURNEDFLAG) { + if (!Q_stricmp(flag, "red")) bs->redflagstatus = 0; + else bs->blueflagstatus = 0; + bs->flagstatuschanged = 1; + } + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (match->subtype & ST_1FCTFGOTFLAG) { + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + bs->flagcarrier = ClientFromName(netname); + } + } +#endif +} + +void BotMatch_EnterGame(bot_state_t *bs, bot_match_t *match) { + int client; + char netname[MAX_NETNAME]; + + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = FindClientByName(netname); + if (client >= 0) { + notleader[client] = qfalse; + } + //NOTE: eliza chats will catch this + //Com_sprintf(buf, sizeof(buf), "heya %s", netname); + //EA_Say(bs->client, buf); +} + +void BotMatch_NewLeader(bot_state_t *bs, bot_match_t *match) { + int client; + char netname[MAX_NETNAME]; + + trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); + client = FindClientByName(netname); + if (!BotSameTeam(bs, client)) + return; + Q_strncpyz(bs->teamleader, netname, sizeof(bs->teamleader)); +} + +/* +================== +BotMatchMessage +================== +*/ +int BotMatchMessage(bot_state_t *bs, char *message) { + bot_match_t match; + + match.type = 0; + //if it is an unknown message + if (!trap_BotFindMatch(message, &match, MTCONTEXT_MISC + |MTCONTEXT_INITIALTEAMCHAT + |MTCONTEXT_CTF)) { + return qfalse; + } + + //react to the found message + switch(match.type) + { + case MSG_HELP: //someone calling for help + case MSG_ACCOMPANY: //someone calling for company + { + BotMatch_HelpAccompany(bs, &match); + break; + } + case MSG_DEFENDKEYAREA: //teamplay defend a key area + { + BotMatch_DefendKeyArea(bs, &match); + break; + } + case MSG_CAMP: //camp somewhere + { + BotMatch_Camp(bs, &match); + break; + } + case MSG_PATROL: //patrol between several key areas + { + BotMatch_Patrol(bs, &match); + break; + } + //CTF & 1FCTF + case MSG_GETFLAG: //ctf get the enemy flag + { + BotMatch_GetFlag(bs, &match); + break; + } +#ifdef MISSIONPACK + //CTF & 1FCTF & Obelisk & Harvester + case MSG_ATTACKENEMYBASE: + { + BotMatch_AttackEnemyBase(bs, &match); + break; + } + //Harvester + case MSG_HARVEST: + { + BotMatch_Harvest(bs, &match); + break; + } +#endif + //CTF & 1FCTF & Harvester + case MSG_RUSHBASE: //ctf rush to the base + { + BotMatch_RushBase(bs, &match); + break; + } + //CTF & 1FCTF + case MSG_RETURNFLAG: + { + BotMatch_ReturnFlag(bs, &match); + break; + } + //CTF & 1FCTF & Obelisk & Harvester + case MSG_TASKPREFERENCE: + { + BotMatch_TaskPreference(bs, &match); + break; + } + //CTF & 1FCTF + case MSG_CTF: + { + BotMatch_CTF(bs, &match); + break; + } + case MSG_GETITEM: + { + BotMatch_GetItem(bs, &match); + break; + } + case MSG_JOINSUBTEAM: //join a sub team + { + BotMatch_JoinSubteam(bs, &match); + break; + } + case MSG_LEAVESUBTEAM: //leave a sub team + { + BotMatch_LeaveSubteam(bs, &match); + break; + } + case MSG_WHICHTEAM: + { + BotMatch_WhichTeam(bs, &match); + break; + } + case MSG_CHECKPOINT: //remember a check point + { + BotMatch_CheckPoint(bs, &match); + break; + } + case MSG_CREATENEWFORMATION: //start the creation of a new formation + { + trap_EA_SayTeam(bs->client, "the part of my brain to create formations has been damaged"); + break; + } + case MSG_FORMATIONPOSITION: //tell someone his/her position in the formation + { + trap_EA_SayTeam(bs->client, "the part of my brain to create formations has been damaged"); + break; + } + case MSG_FORMATIONSPACE: //set the formation space + { + BotMatch_FormationSpace(bs, &match); + break; + } + case MSG_DOFORMATION: //form a certain formation + { + break; + } + case MSG_DISMISS: //dismiss someone + { + BotMatch_Dismiss(bs, &match); + break; + } + case MSG_STARTTEAMLEADERSHIP: //someone will become the team leader + { + BotMatch_StartTeamLeaderShip(bs, &match); + break; + } + case MSG_STOPTEAMLEADERSHIP: //someone will stop being the team leader + { + BotMatch_StopTeamLeaderShip(bs, &match); + break; + } + case MSG_WHOISTEAMLAEDER: + { + BotMatch_WhoIsTeamLeader(bs, &match); + break; + } + case MSG_WHATAREYOUDOING: //ask a bot what he/she is doing + { + BotMatch_WhatAreYouDoing(bs, &match); + break; + } + case MSG_WHATISMYCOMMAND: + { + BotMatch_WhatIsMyCommand(bs, &match); + break; + } + case MSG_WHEREAREYOU: + { + BotMatch_WhereAreYou(bs, &match); + break; + } + case MSG_LEADTHEWAY: + { + BotMatch_LeadTheWay(bs, &match); + break; + } + case MSG_KILL: + { + BotMatch_Kill(bs, &match); + break; + } + case MSG_ENTERGAME: //someone entered the game + { + BotMatch_EnterGame(bs, &match); + break; + } + case MSG_NEWLEADER: + { + BotMatch_NewLeader(bs, &match); + break; + } + case MSG_WAIT: + { + break; + } + case MSG_SUICIDE: + { + BotMatch_Suicide(bs, &match); + break; + } + default: + { + BotAI_Print(PRT_MESSAGE, "unknown match type\n"); + break; + } + } + return qtrue; +} diff --git a/quake3/source/code/game/ai_cmd.h b/quake3/source/code/game/ai_cmd.h new file mode 100644 index 0000000..1689e30 --- /dev/null +++ b/quake3/source/code/game/ai_cmd.h @@ -0,0 +1,17 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_cmd.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_chat.c $ + * + *****************************************************************************/ + +extern int notleader[MAX_CLIENTS]; + +int BotMatchMessage(bot_state_t *bs, char *message); +void BotPrintTeamGoal(bot_state_t *bs); + diff --git a/quake3/source/code/game/ai_dmnet.c b/quake3/source/code/game/ai_dmnet.c new file mode 100644 index 0000000..6d0f60a --- /dev/null +++ b/quake3/source/code/game/ai_dmnet.c @@ -0,0 +1,2586 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_dmnet.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_dmnet.c $ + * + *****************************************************************************/ + +#include "g_local.h" +#include "botlib.h" +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +#include "ai_team.h" +//data file headers +#include "chars.h" //characteristics +#include "inv.h" //indexes into the inventory +#include "syn.h" //synonyms +#include "match.h" //string matching types and vars + +// for the voice chats +#include "../../ui/menudef.h" + +//goal flag, see be_ai_goal.h for the other GFL_* +#define GFL_AIR 128 + +int numnodeswitches; +char nodeswitch[MAX_NODESWITCHES+1][144]; + +#define LOOKAHEAD_DISTANCE 300 + +/* +================== +BotResetNodeSwitches +================== +*/ +void BotResetNodeSwitches(void) { + numnodeswitches = 0; +} + +/* +================== +BotDumpNodeSwitches +================== +*/ +void BotDumpNodeSwitches(bot_state_t *bs) { + int i; + char netname[MAX_NETNAME]; + + ClientName(bs->client, netname, sizeof(netname)); + BotAI_Print(PRT_MESSAGE, "%s at %1.1f switched more than %d AI nodes\n", netname, FloatTime(), MAX_NODESWITCHES); + for (i = 0; i < numnodeswitches; i++) { + BotAI_Print(PRT_MESSAGE, nodeswitch[i]); + } + BotAI_Print(PRT_FATAL, ""); +} + +/* +================== +BotRecordNodeSwitch +================== +*/ +void BotRecordNodeSwitch(bot_state_t *bs, char *node, char *str, char *s) { + char netname[MAX_NETNAME]; + + ClientName(bs->client, netname, sizeof(netname)); + Com_sprintf(nodeswitch[numnodeswitches], 144, "%s at %2.1f entered %s: %s from %s\n", netname, FloatTime(), node, str, s); +#ifdef DEBUG + if (0) { + BotAI_Print(PRT_MESSAGE, nodeswitch[numnodeswitches]); + } +#endif //DEBUG + numnodeswitches++; +} + +/* +================== +BotGetAirGoal +================== +*/ +int BotGetAirGoal(bot_state_t *bs, bot_goal_t *goal) { + bsp_trace_t bsptrace; + vec3_t end, mins = {-15, -15, -2}, maxs = {15, 15, 2}; + int areanum; + + //trace up until we hit solid + VectorCopy(bs->origin, end); + end[2] += 1000; + BotAI_Trace(&bsptrace, bs->origin, mins, maxs, end, bs->entitynum, CONTENTS_SOLID|CONTENTS_PLAYERCLIP); + //trace down until we hit water + VectorCopy(bsptrace.endpos, end); + BotAI_Trace(&bsptrace, end, mins, maxs, bs->origin, bs->entitynum, CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA); + //if we found the water surface + if (bsptrace.fraction > 0) { + areanum = BotPointAreaNum(bsptrace.endpos); + if (areanum) { + VectorCopy(bsptrace.endpos, goal->origin); + goal->origin[2] -= 2; + goal->areanum = areanum; + goal->mins[0] = -15; + goal->mins[1] = -15; + goal->mins[2] = -1; + goal->maxs[0] = 15; + goal->maxs[1] = 15; + goal->maxs[2] = 1; + goal->flags = GFL_AIR; + goal->number = 0; + goal->iteminfo = 0; + goal->entitynum = 0; + return qtrue; + } + } + return qfalse; +} + +/* +================== +BotGoForAir +================== +*/ +int BotGoForAir(bot_state_t *bs, int tfl, bot_goal_t *ltg, float range) { + bot_goal_t goal; + + //if the bot needs air + if (bs->lastair_time < FloatTime() - 6) { + // +#ifdef DEBUG + //BotAI_Print(PRT_MESSAGE, "going for air\n"); +#endif //DEBUG + //if we can find an air goal + if (BotGetAirGoal(bs, &goal)) { + trap_BotPushGoal(bs->gs, &goal); + return qtrue; + } + else { + //get a nearby goal outside the water + while(trap_BotChooseNBGItem(bs->gs, bs->origin, bs->inventory, tfl, ltg, range)) { + trap_BotGetTopGoal(bs->gs, &goal); + //if the goal is not in water + if (!(trap_AAS_PointContents(goal.origin) & (CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA))) { + return qtrue; + } + trap_BotPopGoal(bs->gs); + } + trap_BotResetAvoidGoals(bs->gs); + } + } + return qfalse; +} + +/* +================== +BotNearbyGoal +================== +*/ +int BotNearbyGoal(bot_state_t *bs, int tfl, bot_goal_t *ltg, float range) { + int ret; + + //check if the bot should go for air + if (BotGoForAir(bs, tfl, ltg, range)) return qtrue; + //if the bot is carrying the enemy flag + if (BotCTFCarryingFlag(bs)) { + //if the bot is just a few secs away from the base + if (trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, + bs->teamgoal.areanum, TFL_DEFAULT) < 300) { + //make the range really small + range = 50; + } + } + // + ret = trap_BotChooseNBGItem(bs->gs, bs->origin, bs->inventory, tfl, ltg, range); + /* + if (ret) + { + char buf[128]; + //get the goal at the top of the stack + trap_BotGetTopGoal(bs->gs, &goal); + trap_BotGoalName(goal.number, buf, sizeof(buf)); + BotAI_Print(PRT_MESSAGE, "%1.1f: new nearby goal %s\n", FloatTime(), buf); + } + */ + return ret; +} + +/* +================== +BotReachedGoal +================== +*/ +int BotReachedGoal(bot_state_t *bs, bot_goal_t *goal) { + if (goal->flags & GFL_ITEM) { + //if touching the goal + if (trap_BotTouchingGoal(bs->origin, goal)) { + if (!(goal->flags & GFL_DROPPED)) { + trap_BotSetAvoidGoalTime(bs->gs, goal->number, -1); + } + return qtrue; + } + //if the goal isn't there + if (trap_BotItemGoalInVisButNotVisible(bs->entitynum, bs->eye, bs->viewangles, goal)) { + /* + float avoidtime; + int t; + + avoidtime = trap_BotAvoidGoalTime(bs->gs, goal->number); + if (avoidtime > 0) { + t = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, goal->areanum, bs->tfl); + if ((float) t * 0.009 < avoidtime) + return qtrue; + } + */ + return qtrue; + } + //if in the goal area and below or above the goal and not swimming + if (bs->areanum == goal->areanum) { + if (bs->origin[0] > goal->origin[0] + goal->mins[0] && bs->origin[0] < goal->origin[0] + goal->maxs[0]) { + if (bs->origin[1] > goal->origin[1] + goal->mins[1] && bs->origin[1] < goal->origin[1] + goal->maxs[1]) { + if (!trap_AAS_Swimming(bs->origin)) { + return qtrue; + } + } + } + } + } + else if (goal->flags & GFL_AIR) { + //if touching the goal + if (trap_BotTouchingGoal(bs->origin, goal)) return qtrue; + //if the bot got air + if (bs->lastair_time > FloatTime() - 1) return qtrue; + } + else { + //if touching the goal + if (trap_BotTouchingGoal(bs->origin, goal)) return qtrue; + } + return qfalse; +} + +/* +================== +BotGetItemLongTermGoal +================== +*/ +int BotGetItemLongTermGoal(bot_state_t *bs, int tfl, bot_goal_t *goal) { + //if the bot has no goal + if (!trap_BotGetTopGoal(bs->gs, goal)) { + //BotAI_Print(PRT_MESSAGE, "no ltg on stack\n"); + bs->ltg_time = 0; + } + //if the bot touches the current goal + else if (BotReachedGoal(bs, goal)) { + BotChooseWeapon(bs); + bs->ltg_time = 0; + } + //if it is time to find a new long term goal + if (bs->ltg_time < FloatTime()) { + //pop the current goal from the stack + trap_BotPopGoal(bs->gs); + //BotAI_Print(PRT_MESSAGE, "%s: choosing new ltg\n", ClientName(bs->client, netname, sizeof(netname))); + //choose a new goal + //BotAI_Print(PRT_MESSAGE, "%6.1f client %d: BotChooseLTGItem\n", FloatTime(), bs->client); + if (trap_BotChooseLTGItem(bs->gs, bs->origin, bs->inventory, tfl)) { + /* + char buf[128]; + //get the goal at the top of the stack + trap_BotGetTopGoal(bs->gs, goal); + trap_BotGoalName(goal->number, buf, sizeof(buf)); + BotAI_Print(PRT_MESSAGE, "%1.1f: new long term goal %s\n", FloatTime(), buf); + */ + bs->ltg_time = FloatTime() + 20; + } + else {//the bot gets sorta stuck with all the avoid timings, shouldn't happen though + // +#ifdef DEBUG + char netname[128]; + + BotAI_Print(PRT_MESSAGE, "%s: no valid ltg (probably stuck)\n", ClientName(bs->client, netname, sizeof(netname))); +#endif + //trap_BotDumpAvoidGoals(bs->gs); + //reset the avoid goals and the avoid reach + trap_BotResetAvoidGoals(bs->gs); + trap_BotResetAvoidReach(bs->ms); + } + //get the goal at the top of the stack + return trap_BotGetTopGoal(bs->gs, goal); + } + return qtrue; +} + +/* +================== +BotGetLongTermGoal + +we could also create a seperate AI node for every long term goal type +however this saves us a lot of code +================== +*/ +int BotGetLongTermGoal(bot_state_t *bs, int tfl, int retreat, bot_goal_t *goal) { + vec3_t target, dir, dir2; + char netname[MAX_NETNAME]; + char buf[MAX_MESSAGE_SIZE]; + int areanum; + float croucher; + aas_entityinfo_t entinfo, botinfo; + bot_waypoint_t *wp; + + if (bs->ltgtype == LTG_TEAMHELP && !retreat) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "help_start", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + BotVoiceChatOnly(bs, bs->decisionmaker, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); + bs->teammessage_time = 0; + } + //if trying to help the team mate for more than a minute + if (bs->teamgoal_time < FloatTime()) + bs->ltgtype = 0; + //if the team mate IS visible for quite some time + if (bs->teammatevisible_time < FloatTime() - 10) bs->ltgtype = 0; + //get entity information of the companion + BotEntityInfo(bs->teammate, &entinfo); + //if the team mate is visible + if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->teammate)) { + //if close just stand still there + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(100)) { + trap_BotResetAvoidReach(bs->ms); + return qfalse; + } + } + else { + //last time the bot was NOT visible + bs->teammatevisible_time = FloatTime(); + } + //if the entity information is valid (entity in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum && trap_AAS_AreaReachability(areanum)) { + //update team goal + bs->teamgoal.entitynum = bs->teammate; + bs->teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + } + } + memcpy(goal, &bs->teamgoal, sizeof(bot_goal_t)); + return qtrue; + } + //if the bot accompanies someone + if (bs->ltgtype == LTG_TEAMACCOMPANY && !retreat) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "accompany_start", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + BotVoiceChatOnly(bs, bs->decisionmaker, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); + bs->teammessage_time = 0; + } + //if accompanying the companion for 3 minutes + if (bs->teamgoal_time < FloatTime()) { + BotAI_BotInitialChat(bs, "accompany_stop", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->ltgtype = 0; + } + //get entity information of the companion + BotEntityInfo(bs->teammate, &entinfo); + //if the companion is visible + if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->teammate)) { + //update visible time + bs->teammatevisible_time = FloatTime(); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(bs->formation_dist)) { + // + // if the client being followed bumps into this bot then + // the bot should back up + BotEntityInfo(bs->entitynum, &botinfo); + // if the followed client is not standing ontop of the bot + if (botinfo.origin[2] + botinfo.maxs[2] > entinfo.origin[2] + entinfo.mins[2]) { + // if the bounding boxes touch each other + if (botinfo.origin[0] + botinfo.maxs[0] > entinfo.origin[0] + entinfo.mins[0] - 4&& + botinfo.origin[0] + botinfo.mins[0] < entinfo.origin[0] + entinfo.maxs[0] + 4) { + if (botinfo.origin[1] + botinfo.maxs[1] > entinfo.origin[1] + entinfo.mins[1] - 4 && + botinfo.origin[1] + botinfo.mins[1] < entinfo.origin[1] + entinfo.maxs[1] + 4) { + if (botinfo.origin[2] + botinfo.maxs[2] > entinfo.origin[2] + entinfo.mins[2] - 4 && + botinfo.origin[2] + botinfo.mins[2] < entinfo.origin[2] + entinfo.maxs[2] + 4) { + // if the followed client looks in the direction of this bot + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors(entinfo.angles, dir, NULL, NULL); + AngleVectorsForward( entinfo.angles, dir ); + dir[2] = 0; + VectorNormalize(dir); + //VectorSubtract(entinfo.origin, entinfo.lastvisorigin, dir); + VectorSubtract(bs->origin, entinfo.origin, dir2); + VectorNormalize(dir2); + if (DotProduct(dir, dir2) > 0.7) { + // back up + BotSetupForMovement(bs); + trap_BotMoveInDirection(bs->ms, dir2, 400, MOVE_WALK); + } + } + } + } + } + //check if the bot wants to crouch + //don't crouch if crouched less than 5 seconds ago + if (bs->attackcrouch_time < FloatTime() - 5) { + croucher = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CROUCHER, 0, 1); + if (random() < bs->thinktime * croucher) { + bs->attackcrouch_time = FloatTime() + 5 + croucher * 15; + } + } + //don't crouch when swimming + if (trap_AAS_Swimming(bs->origin)) bs->attackcrouch_time = FloatTime() - 1; + //if not arrived yet or arived some time ago + if (bs->arrive_time < FloatTime() - 2) { + //if not arrived yet + if (!bs->arrive_time) { + trap_EA_Gesture(bs->client); + BotAI_BotInitialChat(bs, "accompany_arrive", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->arrive_time = FloatTime(); + } + //if the bot wants to crouch + else if (bs->attackcrouch_time > FloatTime()) { + trap_EA_Crouch(bs->client); + } + //else do some model taunts + else if (random() < bs->thinktime * 0.05) { + //do a gesture :) + trap_EA_Gesture(bs->client); + } + } + //if just arrived look at the companion + if (bs->arrive_time > FloatTime() - 2) { + VectorSubtract(entinfo.origin, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + //else look strategically around for enemies + else if (random() < bs->thinktime * 0.8) { + BotRoamGoal(bs, target); + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + //check if the bot wants to go for air + if (BotGoForAir(bs, bs->tfl, &bs->teamgoal, 400)) { + trap_BotResetLastAvoidReach(bs->ms); + //get the goal at the top of the stack + //trap_BotGetTopGoal(bs->gs, &tmpgoal); + //trap_BotGoalName(tmpgoal.number, buf, 144); + //BotAI_Print(PRT_MESSAGE, "new nearby goal %s\n", buf); + //time the bot gets to pick up the nearby goal item + bs->nbg_time = FloatTime() + 8; + AIEnter_Seek_NBG(bs, "BotLongTermGoal: go for air"); + return qfalse; + } + // + trap_BotResetAvoidReach(bs->ms); + return qfalse; + } + } + //if the entity information is valid (entity in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum && trap_AAS_AreaReachability(areanum)) { + //update team goal + bs->teamgoal.entitynum = bs->teammate; + bs->teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + } + } + //the goal the bot should go for + memcpy(goal, &bs->teamgoal, sizeof(bot_goal_t)); + //if the companion is NOT visible for too long + if (bs->teammatevisible_time < FloatTime() - 60) { + BotAI_BotInitialChat(bs, "accompany_cannotfind", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->ltgtype = 0; + // just to make sure the bot won't spam this message + bs->teammatevisible_time = FloatTime(); + } + return qtrue; + } + // + if (bs->ltgtype == LTG_DEFENDKEYAREA) { + if (trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, + bs->teamgoal.areanum, TFL_DEFAULT) > bs->defendaway_range) { + bs->defendaway_time = 0; + } + } + //if defending a key area + if (bs->ltgtype == LTG_DEFENDKEYAREA && !retreat && + bs->defendaway_time < FloatTime()) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + trap_BotGoalName(bs->teamgoal.number, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "defend_start", buf, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONDEFENSE); + bs->teammessage_time = 0; + } + //set the bot goal + memcpy(goal, &bs->teamgoal, sizeof(bot_goal_t)); + //stop after 2 minutes + if (bs->teamgoal_time < FloatTime()) { + trap_BotGoalName(bs->teamgoal.number, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "defend_stop", buf, NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + bs->ltgtype = 0; + } + //if very close... go away for some time + VectorSubtract(goal->origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(70)) { + trap_BotResetAvoidReach(bs->ms); + bs->defendaway_time = FloatTime() + 3 + 3 * random(); + if (BotHasPersistantPowerupAndWeapon(bs)) { + bs->defendaway_range = 100; + } + else { + bs->defendaway_range = 350; + } + } + return qtrue; + } + //going to kill someone + if (bs->ltgtype == LTG_KILL && !retreat) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + EasyClientName(bs->teamgoal.entitynum, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "kill_start", buf, NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + bs->teammessage_time = 0; + } + // + if (bs->lastkilledplayer == bs->teamgoal.entitynum) { + EasyClientName(bs->teamgoal.entitynum, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "kill_done", buf, NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + bs->lastkilledplayer = -1; + bs->ltgtype = 0; + } + // + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + //just roam around + return BotGetItemLongTermGoal(bs, tfl, goal); + } + //get an item + if (bs->ltgtype == LTG_GETITEM && !retreat) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + trap_BotGoalName(bs->teamgoal.number, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "getitem_start", buf, NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + BotVoiceChatOnly(bs, bs->decisionmaker, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); + bs->teammessage_time = 0; + } + //set the bot goal + memcpy(goal, &bs->teamgoal, sizeof(bot_goal_t)); + //stop after some time + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + // + if (trap_BotItemGoalInVisButNotVisible(bs->entitynum, bs->eye, bs->viewangles, goal)) { + trap_BotGoalName(bs->teamgoal.number, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "getitem_notthere", buf, NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + bs->ltgtype = 0; + } + else if (BotReachedGoal(bs, goal)) { + trap_BotGoalName(bs->teamgoal.number, buf, sizeof(buf)); + BotAI_BotInitialChat(bs, "getitem_gotit", buf, NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + bs->ltgtype = 0; + } + return qtrue; + } + //if camping somewhere + if ((bs->ltgtype == LTG_CAMP || bs->ltgtype == LTG_CAMPORDER) && !retreat) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + if (bs->ltgtype == LTG_CAMPORDER) { + BotAI_BotInitialChat(bs, "camp_start", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + BotVoiceChatOnly(bs, bs->decisionmaker, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); + } + bs->teammessage_time = 0; + } + //set the bot goal + memcpy(goal, &bs->teamgoal, sizeof(bot_goal_t)); + // + if (bs->teamgoal_time < FloatTime()) { + if (bs->ltgtype == LTG_CAMPORDER) { + BotAI_BotInitialChat(bs, "camp_stop", NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + } + bs->ltgtype = 0; + } + //if really near the camp spot + VectorSubtract(goal->origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(60)) + { + //if not arrived yet + if (!bs->arrive_time) { + if (bs->ltgtype == LTG_CAMPORDER) { + BotAI_BotInitialChat(bs, "camp_arrive", EasyClientName(bs->teammate, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + BotVoiceChatOnly(bs, bs->decisionmaker, VOICECHAT_INPOSITION); + } + bs->arrive_time = FloatTime(); + } + //look strategically around for enemies + if (random() < bs->thinktime * 0.8) { + BotRoamGoal(bs, target); + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + //check if the bot wants to crouch + //don't crouch if crouched less than 5 seconds ago + if (bs->attackcrouch_time < FloatTime() - 5) { + croucher = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CROUCHER, 0, 1); + if (random() < bs->thinktime * croucher) { + bs->attackcrouch_time = FloatTime() + 5 + croucher * 15; + } + } + //if the bot wants to crouch + if (bs->attackcrouch_time > FloatTime()) { + trap_EA_Crouch(bs->client); + } + //don't crouch when swimming + if (trap_AAS_Swimming(bs->origin)) bs->attackcrouch_time = FloatTime() - 1; + //make sure the bot is not gonna drown + if (trap_PointContents(bs->eye,bs->entitynum) & (CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA)) { + if (bs->ltgtype == LTG_CAMPORDER) { + BotAI_BotInitialChat(bs, "camp_stop", NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + // + if (bs->lastgoal_ltgtype == LTG_CAMPORDER) { + bs->lastgoal_ltgtype = 0; + } + } + bs->ltgtype = 0; + } + // + if (bs->camp_range > 0) { + //FIXME: move around a bit + } + // + trap_BotResetAvoidReach(bs->ms); + return qfalse; + } + return qtrue; + } + //patrolling along several waypoints + if (bs->ltgtype == LTG_PATROL && !retreat) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + strcpy(buf, ""); + for (wp = bs->patrolpoints; wp; wp = wp->next) { + strcat(buf, wp->name); + if (wp->next) strcat(buf, " to "); + } + BotAI_BotInitialChat(bs, "patrol_start", buf, NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + BotVoiceChatOnly(bs, bs->decisionmaker, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); + bs->teammessage_time = 0; + } + // + if (!bs->curpatrolpoint) { + bs->ltgtype = 0; + return qfalse; + } + //if the bot touches the current goal + if (trap_BotTouchingGoal(bs->origin, &bs->curpatrolpoint->goal)) { + if (bs->patrolflags & PATROL_BACK) { + if (bs->curpatrolpoint->prev) { + bs->curpatrolpoint = bs->curpatrolpoint->prev; + } + else { + bs->curpatrolpoint = bs->curpatrolpoint->next; + bs->patrolflags &= ~PATROL_BACK; + } + } + else { + if (bs->curpatrolpoint->next) { + bs->curpatrolpoint = bs->curpatrolpoint->next; + } + else { + bs->curpatrolpoint = bs->curpatrolpoint->prev; + bs->patrolflags |= PATROL_BACK; + } + } + } + //stop after 5 minutes + if (bs->teamgoal_time < FloatTime()) { + BotAI_BotInitialChat(bs, "patrol_stop", NULL); + trap_BotEnterChat(bs->cs, bs->decisionmaker, CHAT_TELL); + bs->ltgtype = 0; + } + if (!bs->curpatrolpoint) { + bs->ltgtype = 0; + return qfalse; + } + memcpy(goal, &bs->curpatrolpoint->goal, sizeof(bot_goal_t)); + return qtrue; + } +#ifdef CTF + if (gametype == GT_CTF) { + //if going for enemy flag + if (bs->ltgtype == LTG_GETFLAG) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "captureflag_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONGETFLAG); + bs->teammessage_time = 0; + } + // + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &ctf_blueflag, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &ctf_redflag, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //if touching the flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + // make sure the bot knows the flag isn't there anymore + switch(BotTeam(bs)) { + case TEAM_RED: bs->blueflagstatus = 1; break; + case TEAM_BLUE: bs->redflagstatus = 1; break; + } + bs->ltgtype = 0; + } + //stop after 3 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + BotAlternateRoute(bs, goal); + return qtrue; + } + //if rushing to the base + if (bs->ltgtype == LTG_RUSHBASE && bs->rushbaseaway_time < FloatTime()) { + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &ctf_redflag, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &ctf_blueflag, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //if not carrying the flag anymore + if (!BotCTFCarryingFlag(bs)) bs->ltgtype = 0; + //quit rushing after 2 minutes + if (bs->teamgoal_time < FloatTime()) bs->ltgtype = 0; + //if touching the base flag the bot should loose the enemy flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + //if the bot is still carrying the enemy flag then the + //base flag is gone, now just walk near the base a bit + if (BotCTFCarryingFlag(bs)) { + trap_BotResetAvoidReach(bs->ms); + bs->rushbaseaway_time = FloatTime() + 5 + 10 * random(); + //FIXME: add chat to tell the others to get back the flag + } + else { + bs->ltgtype = 0; + } + } + BotAlternateRoute(bs, goal); + return qtrue; + } + //returning flag + if (bs->ltgtype == LTG_RETURNFLAG) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "returnflag_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONRETURNFLAG); + bs->teammessage_time = 0; + } + // + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &ctf_blueflag, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &ctf_redflag, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //if touching the flag + if (trap_BotTouchingGoal(bs->origin, goal)) bs->ltgtype = 0; + //stop after 3 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + BotAlternateRoute(bs, goal); + return qtrue; + } + } +#endif //CTF +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (bs->ltgtype == LTG_GETFLAG) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "captureflag_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONGETFLAG); + bs->teammessage_time = 0; + } + memcpy(goal, &ctf_neutralflag, sizeof(bot_goal_t)); + //if touching the flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + bs->ltgtype = 0; + } + //stop after 3 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + return qtrue; + } + //if rushing to the base + if (bs->ltgtype == LTG_RUSHBASE) { + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &ctf_blueflag, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &ctf_redflag, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //if not carrying the flag anymore + if (!Bot1FCTFCarryingFlag(bs)) { + bs->ltgtype = 0; + } + //quit rushing after 2 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + //if touching the base flag the bot should loose the enemy flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + bs->ltgtype = 0; + } + BotAlternateRoute(bs, goal); + return qtrue; + } + //attack the enemy base + if (bs->ltgtype == LTG_ATTACKENEMYBASE && + bs->attackaway_time < FloatTime()) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "attackenemybase_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONOFFENSE); + bs->teammessage_time = 0; + } + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &ctf_blueflag, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &ctf_redflag, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //quit rushing after 2 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + //if touching the base flag the bot should loose the enemy flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + bs->attackaway_time = FloatTime() + 2 + 5 * random(); + } + return qtrue; + } + //returning flag + if (bs->ltgtype == LTG_RETURNFLAG) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "returnflag_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONRETURNFLAG); + bs->teammessage_time = 0; + } + // + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + //just roam around + return BotGetItemLongTermGoal(bs, tfl, goal); + } + } + else if (gametype == GT_OBELISK) { + if (bs->ltgtype == LTG_ATTACKENEMYBASE && + bs->attackaway_time < FloatTime()) { + + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "attackenemybase_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONOFFENSE); + bs->teammessage_time = 0; + } + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &blueobelisk, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &redobelisk, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //if the bot no longer wants to attack the obelisk + if (BotFeelingBad(bs) > 50) { + return BotGetItemLongTermGoal(bs, tfl, goal); + } + //if touching the obelisk + if (trap_BotTouchingGoal(bs->origin, goal)) { + bs->attackaway_time = FloatTime() + 3 + 5 * random(); + } + // or very close to the obelisk + VectorSubtract(bs->origin, goal->origin, dir); + if (VectorLengthSquared(dir) < Square(60)) { + bs->attackaway_time = FloatTime() + 3 + 5 * random(); + } + //quit rushing after 2 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + BotAlternateRoute(bs, goal); + //just move towards the obelisk + return qtrue; + } + } + else if (gametype == GT_HARVESTER) { + //if rushing to the base + if (bs->ltgtype == LTG_RUSHBASE) { + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &blueobelisk, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &redobelisk, sizeof(bot_goal_t)); break; + default: BotGoHarvest(bs); return qfalse; + } + //if not carrying any cubes + if (!BotHarvesterCarryingCubes(bs)) { + BotGoHarvest(bs); + return qfalse; + } + //quit rushing after 2 minutes + if (bs->teamgoal_time < FloatTime()) { + BotGoHarvest(bs); + return qfalse; + } + //if touching the base flag the bot should loose the enemy flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + BotGoHarvest(bs); + return qfalse; + } + BotAlternateRoute(bs, goal); + return qtrue; + } + //attack the enemy base + if (bs->ltgtype == LTG_ATTACKENEMYBASE && + bs->attackaway_time < FloatTime()) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "attackenemybase_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONOFFENSE); + bs->teammessage_time = 0; + } + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(goal, &blueobelisk, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(goal, &redobelisk, sizeof(bot_goal_t)); break; + default: bs->ltgtype = 0; return qfalse; + } + //quit rushing after 2 minutes + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + //if touching the base flag the bot should loose the enemy flag + if (trap_BotTouchingGoal(bs->origin, goal)) { + bs->attackaway_time = FloatTime() + 2 + 5 * random(); + } + return qtrue; + } + //harvest cubes + if (bs->ltgtype == LTG_HARVEST && + bs->harvestaway_time < FloatTime()) { + //check for bot typing status message + if (bs->teammessage_time && bs->teammessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "harvest_start", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONOFFENSE); + bs->teammessage_time = 0; + } + memcpy(goal, &neutralobelisk, sizeof(bot_goal_t)); + // + if (bs->teamgoal_time < FloatTime()) { + bs->ltgtype = 0; + } + // + if (trap_BotTouchingGoal(bs->origin, goal)) { + bs->harvestaway_time = FloatTime() + 4 + 3 * random(); + } + return qtrue; + } + } +#endif + //normal goal stuff + return BotGetItemLongTermGoal(bs, tfl, goal); +} + +/* +================== +BotLongTermGoal +================== +*/ +int BotLongTermGoal(bot_state_t *bs, int tfl, int retreat, bot_goal_t *goal) { + aas_entityinfo_t entinfo; + char teammate[MAX_MESSAGE_SIZE]; + float squaredist; + int areanum; + vec3_t dir; + + //FIXME: also have air long term goals? + // + //if the bot is leading someone and not retreating + if (bs->lead_time > 0 && !retreat) { + if (bs->lead_time < FloatTime()) { + BotAI_BotInitialChat(bs, "lead_stop", EasyClientName(bs->lead_teammate, teammate, sizeof(teammate)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->lead_time = 0; + return BotGetLongTermGoal(bs, tfl, retreat, goal); + } + // + if (bs->leadmessage_time < 0 && -bs->leadmessage_time < FloatTime()) { + BotAI_BotInitialChat(bs, "followme", EasyClientName(bs->lead_teammate, teammate, sizeof(teammate)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->leadmessage_time = FloatTime(); + } + //get entity information of the companion + BotEntityInfo(bs->lead_teammate, &entinfo); + // + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum && trap_AAS_AreaReachability(areanum)) { + //update team goal + bs->lead_teamgoal.entitynum = bs->lead_teammate; + bs->lead_teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->lead_teamgoal.origin); + VectorSet(bs->lead_teamgoal.mins, -8, -8, -8); + VectorSet(bs->lead_teamgoal.maxs, 8, 8, 8); + } + } + //if the team mate is visible + if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->lead_teammate)) { + bs->leadvisible_time = FloatTime(); + } + //if the team mate is not visible for 1 seconds + if (bs->leadvisible_time < FloatTime() - 1) { + bs->leadbackup_time = FloatTime() + 2; + } + //distance towards the team mate + VectorSubtract(bs->origin, bs->lead_teamgoal.origin, dir); + squaredist = VectorLengthSquared(dir); + //if backing up towards the team mate + if (bs->leadbackup_time > FloatTime()) { + if (bs->leadmessage_time < FloatTime() - 20) { + BotAI_BotInitialChat(bs, "followme", EasyClientName(bs->lead_teammate, teammate, sizeof(teammate)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->leadmessage_time = FloatTime(); + } + //if very close to the team mate + if (squaredist < Square(100)) { + bs->leadbackup_time = 0; + } + //the bot should go back to the team mate + memcpy(goal, &bs->lead_teamgoal, sizeof(bot_goal_t)); + return qtrue; + } + else { + //if quite distant from the team mate + if (squaredist > Square(500)) { + if (bs->leadmessage_time < FloatTime() - 20) { + BotAI_BotInitialChat(bs, "followme", EasyClientName(bs->lead_teammate, teammate, sizeof(teammate)), NULL); + trap_BotEnterChat(bs->cs, bs->teammate, CHAT_TELL); + bs->leadmessage_time = FloatTime(); + } + //look at the team mate + VectorSubtract(entinfo.origin, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + //just wait for the team mate + return qfalse; + } + } + } + return BotGetLongTermGoal(bs, tfl, retreat, goal); +} + +/* +================== +AIEnter_Intermission +================== +*/ +void AIEnter_Intermission(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "intermission", "", s); + //reset the bot state + BotResetState(bs); + //check for end level chat + if (BotChat_EndLevel(bs)) { + trap_BotEnterChat(bs->cs, 0, bs->chatto); + } + bs->ainode = AINode_Intermission; +} + +/* +================== +AINode_Intermission +================== +*/ +int AINode_Intermission(bot_state_t *bs) { + //if the intermission ended + if (!BotIntermission(bs)) { + if (BotChat_StartLevel(bs)) { + bs->stand_time = FloatTime() + BotChatTime(bs); + } + else { + bs->stand_time = FloatTime() + 2; + } + AIEnter_Stand(bs, "intermission: chat"); + } + return qtrue; +} + +/* +================== +AIEnter_Observer +================== +*/ +void AIEnter_Observer(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "observer", "", s); + //reset the bot state + BotResetState(bs); + bs->ainode = AINode_Observer; +} + +/* +================== +AINode_Observer +================== +*/ +int AINode_Observer(bot_state_t *bs) { + //if the bot left observer mode + if (!BotIsObserver(bs)) { + AIEnter_Stand(bs, "observer: left observer"); + } + return qtrue; +} + +/* +================== +AIEnter_Stand +================== +*/ +void AIEnter_Stand(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "stand", "", s); + bs->standfindenemy_time = FloatTime() + 1; + bs->ainode = AINode_Stand; +} + +/* +================== +AINode_Stand +================== +*/ +int AINode_Stand(bot_state_t *bs) { + + //if the bot's health decreased + if (bs->lastframe_health > bs->inventory[INVENTORY_HEALTH]) { + if (BotChat_HitTalking(bs)) { + bs->standfindenemy_time = FloatTime() + BotChatTime(bs) + 0.1; + bs->stand_time = FloatTime() + BotChatTime(bs) + 0.1; + } + } + if (bs->standfindenemy_time < FloatTime()) { + if (BotFindEnemy(bs, -1)) { + AIEnter_Battle_Fight(bs, "stand: found enemy"); + return qfalse; + } + bs->standfindenemy_time = FloatTime() + 1; + } + // put up chat icon + trap_EA_Talk(bs->client); + // when done standing + if (bs->stand_time < FloatTime()) { + trap_BotEnterChat(bs->cs, 0, bs->chatto); + AIEnter_Seek_LTG(bs, "stand: time out"); + return qfalse; + } + // + return qtrue; +} + +/* +================== +AIEnter_Respawn +================== +*/ +void AIEnter_Respawn(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "respawn", "", s); + //reset some states + trap_BotResetMoveState(bs->ms); + trap_BotResetGoalState(bs->gs); + trap_BotResetAvoidGoals(bs->gs); + trap_BotResetAvoidReach(bs->ms); + //if the bot wants to chat + if (BotChat_Death(bs)) { + bs->respawn_time = FloatTime() + BotChatTime(bs); + bs->respawnchat_time = FloatTime(); + } + else { + bs->respawn_time = FloatTime() + 1 + random(); + bs->respawnchat_time = 0; + } + //set respawn state + bs->respawn_wait = qfalse; + bs->ainode = AINode_Respawn; +} + +/* +================== +AINode_Respawn +================== +*/ +int AINode_Respawn(bot_state_t *bs) { + // if waiting for the actual respawn + if (bs->respawn_wait) { + if (!BotIsDead(bs)) { + AIEnter_Seek_LTG(bs, "respawn: respawned"); + } + else { + trap_EA_Respawn(bs->client); + } + } + else if (bs->respawn_time < FloatTime()) { + // wait until respawned + bs->respawn_wait = qtrue; + // elementary action respawn + trap_EA_Respawn(bs->client); + // + if (bs->respawnchat_time) { + trap_BotEnterChat(bs->cs, 0, bs->chatto); + bs->enemy = -1; + } + } + if (bs->respawnchat_time && bs->respawnchat_time < FloatTime() - 0.5) { + trap_EA_Talk(bs->client); + } + // + return qtrue; +} + +/* +================== +BotSelectActivateWeapon +================== +*/ +int BotSelectActivateWeapon(bot_state_t *bs) { + // + if (bs->inventory[INVENTORY_MACHINEGUN] > 0 && bs->inventory[INVENTORY_BULLETS] > 0) + return WEAPONINDEX_MACHINEGUN; + else if (bs->inventory[INVENTORY_SHOTGUN] > 0 && bs->inventory[INVENTORY_SHELLS] > 0) + return WEAPONINDEX_SHOTGUN; + //PKMOD - Ergodic 04/14/01 - remove plasma gun from PKA +// else if (bs->inventory[INVENTORY_PLASMAGUN] > 0 && bs->inventory[INVENTORY_CELLS] > 0) +// return WEAPONINDEX_PLASMAGUN; + else if (bs->inventory[INVENTORY_LIGHTNING] > 0 && bs->inventory[INVENTORY_LIGHTNINGAMMO] > 0) + return WEAPONINDEX_LIGHTNING; +#ifdef MISSIONPACK + else if (bs->inventory[INVENTORY_CHAINGUN] > 0 && bs->inventory[INVENTORY_BELT] > 0) + return WEAPONINDEX_CHAINGUN; + else if (bs->inventory[INVENTORY_NAILGUN] > 0 && bs->inventory[INVENTORY_NAILS] > 0) + return WEAPONINDEX_NAILGUN; +#endif + else if (bs->inventory[INVENTORY_RAILGUN] > 0 && bs->inventory[INVENTORY_SLUGS] > 0) + return WEAPONINDEX_RAILGUN; + else if (bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && bs->inventory[INVENTORY_ROCKETS] > 0) + return WEAPONINDEX_ROCKET_LAUNCHER; + //PKMOD - Ergodic 04/14/01 - remove BFG from PKA +// else if (bs->inventory[INVENTORY_BFG10K] > 0 && bs->inventory[INVENTORY_BFGAMMO] > 0) +// return WEAPONINDEX_BFG; + else { + return -1; + } +} + +/* +================== +BotClearPath + + try to deactivate obstacles like proximity mines on the bot's path + + PKMOD - Ergodic 04/14/01 - change logic to clear beartraps and + autosentrys that are on the bot's path + +================== +*/ +void BotClearPath(bot_state_t *bs, bot_moveresult_t *moveresult) { + int i, bestbeartrap; + float dist, bestdist; + vec3_t target, dir; + bsp_trace_t bsptrace; + entityState_t state; + +//PKMOD - Ergodic 04/14/01 - remove previous kamakazi code + if (moveresult->flags & MOVERESULT_BLOCKEDBYAVOIDSPOT) { + bs->blockedbyavoidspot_time = FloatTime() + 5; + } + // if blocked by an avoid spot and the view angles and weapon are used for movement + if (bs->blockedbyavoidspot_time > FloatTime() && + !(moveresult->flags & (MOVERESULT_MOVEMENTVIEW | MOVERESULT_MOVEMENTWEAPON)) ) { + bestdist = 300; + bestbeartrap = -1; + for (i = 0; i < bs->numbeartraps; i++) { + BotAI_GetEntityState(bs->beartraps[i], &state); + VectorSubtract(state.pos.trBase, bs->origin, dir); + dist = VectorLength(dir); + if (dist < bestdist) { + bestdist = dist; + bestbeartrap = i; + } + } + if (bestbeartrap != -1) { + // + // state->generic1 == TEAM_RED || state->generic1 == TEAM_BLUE + // + // deactivate prox mines in the bot's path by shooting + // rockets or plasma cells etc. at them + BotAI_GetEntityState(bs->beartraps[bestbeartrap], &state); + VectorCopy(state.pos.trBase, target); + target[2] += 2; + VectorSubtract(target, bs->eye, dir); + vectoangles(dir, moveresult->ideal_viewangles); + // if the bot has a weapon that does splash damage + //PKMOD - Ergodic 04/14/01 - modify the weapons pick + if (bs->inventory[INVENTORY_EXPLOSIVESHOTGUN] > 0 && bs->inventory[INVENTORY_EXPLOSIVESHELLS] > 0) + moveresult->weapon = WEAPONINDEX_EXPLODING_SHELLS; + else if (bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && bs->inventory[INVENTORY_ROCKETS] > 0) + moveresult->weapon = WEAPONINDEX_ROCKET_LAUNCHER; + else { + moveresult->weapon = 0; + } + if (moveresult->weapon) { + // + moveresult->flags |= MOVERESULT_MOVEMENTWEAPON | MOVERESULT_MOVEMENTVIEW; + // if holding the right weapon + if (bs->cur_ps.weapon == moveresult->weapon) { + // if the bot is pretty close with it's aim + if (InFieldOfVision(bs->viewangles, 20, moveresult->ideal_viewangles)) { + // + BotAI_Trace(&bsptrace, bs->eye, NULL, NULL, target, bs->entitynum, MASK_SHOT); + // if the mine is visible from the current position + if (bsptrace.fraction >= 1.0 || bsptrace.ent == state.number) { + // shoot at the mine + trap_EA_Attack(bs->client); + } + } + } + } + } + } +} + +/* +================== +AIEnter_Seek_ActivateEntity +================== +*/ +void AIEnter_Seek_ActivateEntity(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "activate entity", "", s); + bs->ainode = AINode_Seek_ActivateEntity; +} + +/* +================== +AINode_Seek_Activate_Entity +================== +*/ +int AINode_Seek_ActivateEntity(bot_state_t *bs) { + bot_goal_t *goal; + vec3_t target, dir, ideal_viewangles; + bot_moveresult_t moveresult; + int targetvisible; + bsp_trace_t bsptrace; + aas_entityinfo_t entinfo; + + if (BotIsObserver(bs)) { + BotClearActivateGoalStack(bs); + AIEnter_Observer(bs, "active entity: observer"); + return qfalse; + } + //if in the intermission + if (BotIntermission(bs)) { + BotClearActivateGoalStack(bs); + AIEnter_Intermission(bs, "activate entity: intermission"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + BotClearActivateGoalStack(bs); + AIEnter_Respawn(bs, "activate entity: bot dead"); + return qfalse; + } + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + // if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + // map specific code + BotMapScripts(bs); + // no enemy + bs->enemy = -1; + // if the bot has no activate goal + if (!bs->activatestack) { + BotClearActivateGoalStack(bs); + AIEnter_Seek_NBG(bs, "activate entity: no goal"); + return qfalse; + } + // + goal = &bs->activatestack->goal; + // initialize target being visible to false + targetvisible = qfalse; + // if the bot has to shoot at a target to activate something + if (bs->activatestack->shoot) { + // + BotAI_Trace(&bsptrace, bs->eye, NULL, NULL, bs->activatestack->target, bs->entitynum, MASK_SHOT); + // if the shootable entity is visible from the current position + if (bsptrace.fraction >= 1.0 || bsptrace.ent == goal->entitynum) { + targetvisible = qtrue; + // if holding the right weapon + if (bs->cur_ps.weapon == bs->activatestack->weapon) { + VectorSubtract(bs->activatestack->target, bs->eye, dir); + vectoangles(dir, ideal_viewangles); + // if the bot is pretty close with it's aim + if (InFieldOfVision(bs->viewangles, 20, ideal_viewangles)) { + trap_EA_Attack(bs->client); + } + } + } + } + // if the shoot target is visible + if (targetvisible) { + // get the entity info of the entity the bot is shooting at + BotEntityInfo(goal->entitynum, &entinfo); + // if the entity the bot shoots at moved + if (!VectorCompare(bs->activatestack->origin, entinfo.origin)) { +#ifdef DEBUG + BotAI_Print(PRT_MESSAGE, "hit shootable button or trigger\n"); +#endif //DEBUG + bs->activatestack->time = 0; + } + // if the activate goal has been activated or the bot takes too long + if (bs->activatestack->time < FloatTime()) { + BotPopFromActivateGoalStack(bs); + // if there are more activate goals on the stack + if (bs->activatestack) { + bs->activatestack->time = FloatTime() + 10; + return qfalse; + } + AIEnter_Seek_NBG(bs, "activate entity: time out"); + return qfalse; + } + memset(&moveresult, 0, sizeof(bot_moveresult_t)); + } + else { + // if the bot has no goal + if (!goal) { + bs->activatestack->time = 0; + } + // if the bot does not have a shoot goal + else if (!bs->activatestack->shoot) { + //if the bot touches the current goal + if (trap_BotTouchingGoal(bs->origin, goal)) { +#ifdef DEBUG + BotAI_Print(PRT_MESSAGE, "touched button or trigger\n"); +#endif //DEBUG + bs->activatestack->time = 0; + } + } + // if the activate goal has been activated or the bot takes too long + if (bs->activatestack->time < FloatTime()) { + BotPopFromActivateGoalStack(bs); + // if there are more activate goals on the stack + if (bs->activatestack) { + bs->activatestack->time = FloatTime() + 10; + return qfalse; + } + AIEnter_Seek_NBG(bs, "activate entity: activated"); + return qfalse; + } + //predict obstacles + if (BotAIPredictObstacles(bs, goal)) + return qfalse; + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, goal, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + // + bs->activatestack->time = 0; + } + //check if the bot is blocked + BotAIBlocked(bs, &moveresult, qtrue); + } + // + BotClearPath(bs, &moveresult); + // if the bot has to shoot to activate + if (bs->activatestack->shoot) { + // if the view angles aren't yet used for the movement + if (!(moveresult.flags & MOVERESULT_MOVEMENTVIEW)) { + VectorSubtract(bs->activatestack->target, bs->eye, dir); + vectoangles(dir, moveresult.ideal_viewangles); + moveresult.flags |= MOVERESULT_MOVEMENTVIEW; + } + // if there's no weapon yet used for the movement + if (!(moveresult.flags & MOVERESULT_MOVEMENTWEAPON)) { + moveresult.flags |= MOVERESULT_MOVEMENTWEAPON; + // + bs->activatestack->weapon = BotSelectActivateWeapon(bs); + if (bs->activatestack->weapon == -1) { + //FIXME: find a decent weapon first + bs->activatestack->weapon = 0; + } + moveresult.weapon = bs->activatestack->weapon; + } + } + // if the ideal view angles are set for movement + if (moveresult.flags & (MOVERESULT_MOVEMENTVIEWSET|MOVERESULT_MOVEMENTVIEW|MOVERESULT_SWIMVIEW)) { + VectorCopy(moveresult.ideal_viewangles, bs->ideal_viewangles); + } + // if waiting for something + else if (moveresult.flags & MOVERESULT_WAITING) { + if (random() < bs->thinktime * 0.8) { + BotRoamGoal(bs, target); + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + } + else if (!(bs->flags & BFL_IDEALVIEWSET)) { + if (trap_BotMovementViewTarget(bs->ms, goal, bs->tfl, 300, target)) { + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + } + else { + vectoangles(moveresult.movedir, bs->ideal_viewangles); + } + bs->ideal_viewangles[2] *= 0.5; + } + // if the weapon is used for the bot movement + if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) + bs->weaponnum = moveresult.weapon; + // if there is an enemy + if (BotFindEnemy(bs, -1)) { + if (BotWantsToRetreat(bs)) { + //keep the current long term goal and retreat + AIEnter_Battle_NBG(bs, "activate entity: found enemy"); + } + else { + trap_BotResetLastAvoidReach(bs->ms); + //empty the goal stack + trap_BotEmptyGoalStack(bs->gs); + //go fight + AIEnter_Battle_Fight(bs, "activate entity: found enemy"); + } + BotClearActivateGoalStack(bs); + } + return qtrue; +} + +/* +================== +AIEnter_Seek_NBG +================== +*/ +void AIEnter_Seek_NBG(bot_state_t *bs, char *s) { + bot_goal_t goal; + char buf[144]; + + if (trap_BotGetTopGoal(bs->gs, &goal)) { + trap_BotGoalName(goal.number, buf, 144); + BotRecordNodeSwitch(bs, "seek NBG", buf, s); + } + else { + BotRecordNodeSwitch(bs, "seek NBG", "no goal", s); + } + bs->ainode = AINode_Seek_NBG; +} + +/* +================== +AINode_Seek_NBG +================== +*/ +int AINode_Seek_NBG(bot_state_t *bs) { + bot_goal_t goal; + vec3_t target, dir; + bot_moveresult_t moveresult; + + if (BotIsObserver(bs)) { + AIEnter_Observer(bs, "seek nbg: observer"); + return qfalse; + } + //if in the intermission + if (BotIntermission(bs)) { + AIEnter_Intermission(bs, "seek nbg: intermision"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + AIEnter_Respawn(bs, "seek nbg: bot dead"); + return qfalse; + } + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + //if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + // + if (BotCanAndWantsToRocketJump(bs)) { + bs->tfl |= TFL_ROCKETJUMP; + } + //map specific code + BotMapScripts(bs); + //no enemy + bs->enemy = -1; + //if the bot has no goal + if (!trap_BotGetTopGoal(bs->gs, &goal)) bs->nbg_time = 0; + //if the bot touches the current goal + else if (BotReachedGoal(bs, &goal)) { + BotChooseWeapon(bs); + bs->nbg_time = 0; + } + // + if (bs->nbg_time < FloatTime()) { + //pop the current goal from the stack + trap_BotPopGoal(bs->gs); + //check for new nearby items right away + //NOTE: we canNOT reset the check_time to zero because it would create an endless loop of node switches + bs->check_time = FloatTime() + 0.05; + //go back to seek ltg + AIEnter_Seek_LTG(bs, "seek nbg: time out"); + return qfalse; + } + //predict obstacles + if (BotAIPredictObstacles(bs, &goal)) + return qfalse; + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, &goal, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + bs->nbg_time = 0; + } + //check if the bot is blocked + BotAIBlocked(bs, &moveresult, qtrue); + // + BotClearPath(bs, &moveresult); + //if the viewangles are used for the movement + if (moveresult.flags & (MOVERESULT_MOVEMENTVIEWSET|MOVERESULT_MOVEMENTVIEW|MOVERESULT_SWIMVIEW)) { + VectorCopy(moveresult.ideal_viewangles, bs->ideal_viewangles); + } + //if waiting for something + else if (moveresult.flags & MOVERESULT_WAITING) { + if (random() < bs->thinktime * 0.8) { + BotRoamGoal(bs, target); + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + } + else if (!(bs->flags & BFL_IDEALVIEWSET)) { + if (!trap_BotGetSecondGoal(bs->gs, &goal)) trap_BotGetTopGoal(bs->gs, &goal); + if (trap_BotMovementViewTarget(bs->ms, &goal, bs->tfl, 300, target)) { + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + } + //FIXME: look at cluster portals? + else vectoangles(moveresult.movedir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + //if the weapon is used for the bot movement + if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs->weaponnum = moveresult.weapon; + //if there is an enemy + if (BotFindEnemy(bs, -1)) { + if (BotWantsToRetreat(bs)) { + //keep the current long term goal and retreat + AIEnter_Battle_NBG(bs, "seek nbg: found enemy"); + } + else { + trap_BotResetLastAvoidReach(bs->ms); + //empty the goal stack + trap_BotEmptyGoalStack(bs->gs); + //go fight + AIEnter_Battle_Fight(bs, "seek nbg: found enemy"); + } + } + return qtrue; +} + +/* +================== +AIEnter_Seek_LTG +================== +*/ +void AIEnter_Seek_LTG(bot_state_t *bs, char *s) { + bot_goal_t goal; + char buf[144]; + + if (trap_BotGetTopGoal(bs->gs, &goal)) { + trap_BotGoalName(goal.number, buf, 144); + BotRecordNodeSwitch(bs, "seek LTG", buf, s); + } + else { + BotRecordNodeSwitch(bs, "seek LTG", "no goal", s); + } + bs->ainode = AINode_Seek_LTG; +} + +/* +================== +AINode_Seek_LTG +================== +*/ +int AINode_Seek_LTG(bot_state_t *bs) +{ + bot_goal_t goal; + vec3_t target, dir; + bot_moveresult_t moveresult; + int range; + //char buf[128]; + //bot_goal_t tmpgoal; + + if (BotIsObserver(bs)) { + AIEnter_Observer(bs, "seek ltg: observer"); + return qfalse; + } + //if in the intermission + if (BotIntermission(bs)) { + AIEnter_Intermission(bs, "seek ltg: intermission"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + AIEnter_Respawn(bs, "seek ltg: bot dead"); + return qfalse; + } + // + if (BotChat_Random(bs)) { + bs->stand_time = FloatTime() + BotChatTime(bs); + AIEnter_Stand(bs, "seek ltg: random chat"); + return qfalse; + } + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + //if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + // + if (BotCanAndWantsToRocketJump(bs)) { + bs->tfl |= TFL_ROCKETJUMP; + } + //map specific code + BotMapScripts(bs); + //no enemy + bs->enemy = -1; + // + if (bs->killedenemy_time > FloatTime() - 2) { + if (random() < bs->thinktime * 1) { + trap_EA_Gesture(bs->client); + } + } + //if there is an enemy + if (BotFindEnemy(bs, -1)) { + if (BotWantsToRetreat(bs)) { + //keep the current long term goal and retreat + AIEnter_Battle_Retreat(bs, "seek ltg: found enemy"); + return qfalse; + } + else { + trap_BotResetLastAvoidReach(bs->ms); + //empty the goal stack + trap_BotEmptyGoalStack(bs->gs); + //go fight + AIEnter_Battle_Fight(bs, "seek ltg: found enemy"); + return qfalse; + } + } + // + BotTeamGoals(bs, qfalse); + //get the current long term goal + if (!BotLongTermGoal(bs, bs->tfl, qfalse, &goal)) { + return qtrue; + } + //check for nearby goals periodicly + if (bs->check_time < FloatTime()) { + bs->check_time = FloatTime() + 0.5; + //check if the bot wants to camp + BotWantsToCamp(bs); + // + if (bs->ltgtype == LTG_DEFENDKEYAREA) range = 400; + else range = 150; + // +#ifdef CTF + if (gametype == GT_CTF) { + //if carrying a flag the bot shouldn't be distracted too much + if (BotCTFCarryingFlag(bs)) + range = 50; + } +#endif //CTF +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (Bot1FCTFCarryingFlag(bs)) + range = 50; + } + else if (gametype == GT_HARVESTER) { + if (BotHarvesterCarryingCubes(bs)) + range = 80; + } +#endif + // + if (BotNearbyGoal(bs, bs->tfl, &goal, range)) { + trap_BotResetLastAvoidReach(bs->ms); + //get the goal at the top of the stack + //trap_BotGetTopGoal(bs->gs, &tmpgoal); + //trap_BotGoalName(tmpgoal.number, buf, 144); + //BotAI_Print(PRT_MESSAGE, "new nearby goal %s\n", buf); + //time the bot gets to pick up the nearby goal item + bs->nbg_time = FloatTime() + 4 + range * 0.01; + AIEnter_Seek_NBG(bs, "ltg seek: nbg"); + return qfalse; + } + } + //predict obstacles + if (BotAIPredictObstacles(bs, &goal)) + return qfalse; + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, &goal, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + bs->ltg_time = 0; + } + // + BotAIBlocked(bs, &moveresult, qtrue); + // + BotClearPath(bs, &moveresult); + //if the viewangles are used for the movement + if (moveresult.flags & (MOVERESULT_MOVEMENTVIEWSET|MOVERESULT_MOVEMENTVIEW|MOVERESULT_SWIMVIEW)) { + VectorCopy(moveresult.ideal_viewangles, bs->ideal_viewangles); + } + //if waiting for something + else if (moveresult.flags & MOVERESULT_WAITING) { + if (random() < bs->thinktime * 0.8) { + BotRoamGoal(bs, target); + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + } + else if (!(bs->flags & BFL_IDEALVIEWSET)) { + if (trap_BotMovementViewTarget(bs->ms, &goal, bs->tfl, 300, target)) { + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + } + //FIXME: look at cluster portals? + else if (VectorLengthSquared(moveresult.movedir)) { + vectoangles(moveresult.movedir, bs->ideal_viewangles); + } + else if (random() < bs->thinktime * 0.8) { + BotRoamGoal(bs, target); + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + bs->ideal_viewangles[2] *= 0.5; + } + bs->ideal_viewangles[2] *= 0.5; + } + //if the weapon is used for the bot movement + if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs->weaponnum = moveresult.weapon; + // + return qtrue; +} + +/* +================== +AIEnter_Battle_Fight +================== +*/ +void AIEnter_Battle_Fight(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "battle fight", "", s); + trap_BotResetLastAvoidReach(bs->ms); + bs->ainode = AINode_Battle_Fight; +} + +/* +================== +AIEnter_Battle_Fight +================== +*/ +void AIEnter_Battle_SuicidalFight(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "battle fight", "", s); + trap_BotResetLastAvoidReach(bs->ms); + bs->ainode = AINode_Battle_Fight; + bs->flags |= BFL_FIGHTSUICIDAL; +} + +/* +================== +AINode_Battle_Fight +================== +*/ +int AINode_Battle_Fight(bot_state_t *bs) { + int areanum; + vec3_t target; + aas_entityinfo_t entinfo; + bot_moveresult_t moveresult; + + if (BotIsObserver(bs)) { + AIEnter_Observer(bs, "battle fight: observer"); + return qfalse; + } + + //if in the intermission + if (BotIntermission(bs)) { + AIEnter_Intermission(bs, "battle fight: intermission"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + AIEnter_Respawn(bs, "battle fight: bot dead"); + return qfalse; + } + //if there is another better enemy + if (BotFindEnemy(bs, bs->enemy)) { +#ifdef DEBUG + BotAI_Print(PRT_MESSAGE, "found new better enemy\n"); +#endif + } + //if no enemy + if (bs->enemy < 0) { + AIEnter_Seek_LTG(bs, "battle fight: no enemy"); + return qfalse; + } + // + BotEntityInfo(bs->enemy, &entinfo); + //if the enemy is dead + if (bs->enemydeath_time) { + if (bs->enemydeath_time < FloatTime() - 1.0) { + bs->enemydeath_time = 0; + if (bs->enemysuicide) { + BotChat_EnemySuicide(bs); + } + if (bs->lastkilledplayer == bs->enemy && BotChat_Kill(bs)) { + bs->stand_time = FloatTime() + BotChatTime(bs); + AIEnter_Stand(bs, "battle fight: enemy dead"); + } + else { + bs->ltg_time = 0; + AIEnter_Seek_LTG(bs, "battle fight: enemy dead"); + } + return qfalse; + } + } + else { + if (EntityIsDead(&entinfo)) { + bs->enemydeath_time = FloatTime(); + } + } + //if the enemy is invisible and not shooting the bot looses track easily + if (EntityIsInvisible(&entinfo) && !EntityIsShooting(&entinfo)) { + //PKMOD - Ergodic 10/31/02 - check if enemy has a beartrap attached + // attached beartraps will make the player visible to the bots + entityState_t state; + BotAI_GetEntityState(bs->enemy, &state); + if ( ( state.time2 & 3 ) == 0 ) //if no beartraps are attached + if (random() < 0.2) { + AIEnter_Seek_LTG(bs, "battle fight: invisible"); + return qfalse; + } + } + // + VectorCopy(entinfo.origin, target); + // if not a player enemy + if (bs->enemy >= MAX_CLIENTS) { +#ifdef MISSIONPACK + // if attacking an obelisk + if ( bs->enemy == redobelisk.entitynum || + bs->enemy == blueobelisk.entitynum ) { + target[2] += 16; + } +#endif + } + //update the reachability area and origin if possible + areanum = BotPointAreaNum(target); + if (areanum && trap_AAS_AreaReachability(areanum)) { + VectorCopy(target, bs->lastenemyorigin); + bs->lastenemyareanum = areanum; + } + //update the attack inventory values + BotUpdateBattleInventory(bs, bs->enemy); + //if the bot's health decreased + if (bs->lastframe_health > bs->inventory[INVENTORY_HEALTH]) { + if (BotChat_HitNoDeath(bs)) { + bs->stand_time = FloatTime() + BotChatTime(bs); + AIEnter_Stand(bs, "battle fight: chat health decreased"); + return qfalse; + } + } + //if the bot hit someone + if (bs->cur_ps.persistant[PERS_HITS] > bs->lasthitcount) { + if (BotChat_HitNoKill(bs)) { + bs->stand_time = FloatTime() + BotChatTime(bs); + AIEnter_Stand(bs, "battle fight: chat hit someone"); + return qfalse; + } + } + //if the enemy is not visible + if (!BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy)) { + if (BotWantsToChase(bs)) { + AIEnter_Battle_Chase(bs, "battle fight: enemy out of sight"); + return qfalse; + } + else { + AIEnter_Seek_LTG(bs, "battle fight: enemy out of sight"); + return qfalse; + } + } + //use holdable items + BotBattleUseItems(bs); + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + //if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + // + if (BotCanAndWantsToRocketJump(bs)) { + bs->tfl |= TFL_ROCKETJUMP; + } + //PKMOD - Ergodic 04/15/01 - use beans if needed + BotEatBeans(bs); + //choose the best weapon to fight with + BotChooseWeapon(bs); + //do attack movements + moveresult = BotAttackMove(bs, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + bs->ltg_time = 0; + } + // + BotAIBlocked(bs, &moveresult, qfalse); + //aim at the enemy + BotAimAtEnemy(bs); + //attack the enemy if possible + BotCheckAttack(bs); + //if the bot wants to retreat + if (!(bs->flags & BFL_FIGHTSUICIDAL)) { + if (BotWantsToRetreat(bs)) { + AIEnter_Battle_Retreat(bs, "battle fight: wants to retreat"); + return qtrue; + } + } + return qtrue; +} + +/* +================== +AIEnter_Battle_Chase +================== +*/ +void AIEnter_Battle_Chase(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "battle chase", "", s); + bs->chase_time = FloatTime(); + bs->ainode = AINode_Battle_Chase; +} + +/* +================== +AINode_Battle_Chase +================== +*/ +int AINode_Battle_Chase(bot_state_t *bs) +{ + bot_goal_t goal; + vec3_t target, dir; + bot_moveresult_t moveresult; + float range; + + if (BotIsObserver(bs)) { + AIEnter_Observer(bs, "battle chase: observer"); + return qfalse; + } + //if in the intermission + if (BotIntermission(bs)) { + AIEnter_Intermission(bs, "battle chase: intermission"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + AIEnter_Respawn(bs, "battle chase: bot dead"); + return qfalse; + } + //if no enemy + if (bs->enemy < 0) { + AIEnter_Seek_LTG(bs, "battle chase: no enemy"); + return qfalse; + } + //if the enemy is visible + if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy)) { + AIEnter_Battle_Fight(bs, "battle chase"); + return qfalse; + } + //if there is another enemy + if (BotFindEnemy(bs, -1)) { + AIEnter_Battle_Fight(bs, "battle chase: better enemy"); + return qfalse; + } + //there is no last enemy area + if (!bs->lastenemyareanum) { + AIEnter_Seek_LTG(bs, "battle chase: no enemy area"); + return qfalse; + } + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + //if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + // + if (BotCanAndWantsToRocketJump(bs)) { + bs->tfl |= TFL_ROCKETJUMP; + } + //map specific code + BotMapScripts(bs); + //create the chase goal + goal.entitynum = bs->enemy; + goal.areanum = bs->lastenemyareanum; + VectorCopy(bs->lastenemyorigin, goal.origin); + VectorSet(goal.mins, -8, -8, -8); + VectorSet(goal.maxs, 8, 8, 8); + //if the last seen enemy spot is reached the enemy could not be found + if (trap_BotTouchingGoal(bs->origin, &goal)) bs->chase_time = 0; + //if there's no chase time left + if (!bs->chase_time || bs->chase_time < FloatTime() - 10) { + AIEnter_Seek_LTG(bs, "battle chase: time out"); + return qfalse; + } + //check for nearby goals periodicly + if (bs->check_time < FloatTime()) { + bs->check_time = FloatTime() + 1; + range = 150; + // + if (BotNearbyGoal(bs, bs->tfl, &goal, range)) { + //the bot gets 5 seconds to pick up the nearby goal item + bs->nbg_time = FloatTime() + 0.1 * range + 1; + trap_BotResetLastAvoidReach(bs->ms); + AIEnter_Battle_NBG(bs, "battle chase: nbg"); + return qfalse; + } + } + // + BotUpdateBattleInventory(bs, bs->enemy); + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, &goal, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + bs->ltg_time = 0; + } + // + BotAIBlocked(bs, &moveresult, qfalse); + // + if (moveresult.flags & (MOVERESULT_MOVEMENTVIEWSET|MOVERESULT_MOVEMENTVIEW|MOVERESULT_SWIMVIEW)) { + VectorCopy(moveresult.ideal_viewangles, bs->ideal_viewangles); + } + else if (!(bs->flags & BFL_IDEALVIEWSET)) { + if (bs->chase_time > FloatTime() - 2) { + BotAimAtEnemy(bs); + } + else { + if (trap_BotMovementViewTarget(bs->ms, &goal, bs->tfl, 300, target)) { + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + } + else { + vectoangles(moveresult.movedir, bs->ideal_viewangles); + } + } + bs->ideal_viewangles[2] *= 0.5; + } + //if the weapon is used for the bot movement + if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs->weaponnum = moveresult.weapon; + //if the bot is in the area the enemy was last seen in + if (bs->areanum == bs->lastenemyareanum) bs->chase_time = 0; + //if the bot wants to retreat (the bot could have been damage during the chase) + if (BotWantsToRetreat(bs)) { + AIEnter_Battle_Retreat(bs, "battle chase: wants to retreat"); + return qtrue; + } + return qtrue; +} + +/* +================== +AIEnter_Battle_Retreat +================== +*/ +void AIEnter_Battle_Retreat(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "battle retreat", "", s); + bs->ainode = AINode_Battle_Retreat; +} + +/* +================== +AINode_Battle_Retreat +================== +*/ +int AINode_Battle_Retreat(bot_state_t *bs) { + bot_goal_t goal; + aas_entityinfo_t entinfo; + bot_moveresult_t moveresult; + vec3_t target, dir; + float attack_skill, range; + int areanum; + + if (BotIsObserver(bs)) { + AIEnter_Observer(bs, "battle retreat: observer"); + return qfalse; + } + //if in the intermission + if (BotIntermission(bs)) { + AIEnter_Intermission(bs, "battle retreat: intermission"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + AIEnter_Respawn(bs, "battle retreat: bot dead"); + return qfalse; + } + //if no enemy + if (bs->enemy < 0) { + AIEnter_Seek_LTG(bs, "battle retreat: no enemy"); + return qfalse; + } + // + BotEntityInfo(bs->enemy, &entinfo); + if (EntityIsDead(&entinfo)) { + AIEnter_Seek_LTG(bs, "battle retreat: enemy dead"); + return qfalse; + } + //if there is another better enemy + if (BotFindEnemy(bs, bs->enemy)) { +#ifdef DEBUG + BotAI_Print(PRT_MESSAGE, "found new better enemy\n"); +#endif + } + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + //if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + //map specific code + BotMapScripts(bs); + //update the attack inventory values + BotUpdateBattleInventory(bs, bs->enemy); + //if the bot doesn't want to retreat anymore... probably picked up some nice items + if (BotWantsToChase(bs)) { + //empty the goal stack, when chasing, only the enemy is the goal + trap_BotEmptyGoalStack(bs->gs); + //go chase the enemy + AIEnter_Battle_Chase(bs, "battle retreat: wants to chase"); + return qfalse; + } + //update the last time the enemy was visible + if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy)) { + bs->enemyvisible_time = FloatTime(); + VectorCopy(entinfo.origin, target); + // if not a player enemy + if (bs->enemy >= MAX_CLIENTS) { +#ifdef MISSIONPACK + // if attacking an obelisk + if ( bs->enemy == redobelisk.entitynum || + bs->enemy == blueobelisk.entitynum ) { + target[2] += 16; + } +#endif + } + //update the reachability area and origin if possible + areanum = BotPointAreaNum(target); + if (areanum && trap_AAS_AreaReachability(areanum)) { + VectorCopy(target, bs->lastenemyorigin); + bs->lastenemyareanum = areanum; + } + } + //if the enemy is NOT visible for 4 seconds + if (bs->enemyvisible_time < FloatTime() - 4) { + AIEnter_Seek_LTG(bs, "battle retreat: lost enemy"); + return qfalse; + } + //else if the enemy is NOT visible + else if (bs->enemyvisible_time < FloatTime()) { + //if there is another enemy + if (BotFindEnemy(bs, -1)) { + AIEnter_Battle_Fight(bs, "battle retreat: another enemy"); + return qfalse; + } + } + // + BotTeamGoals(bs, qtrue); + //use holdable items + BotBattleUseItems(bs); + //get the current long term goal while retreating + if (!BotLongTermGoal(bs, bs->tfl, qtrue, &goal)) { + AIEnter_Battle_SuicidalFight(bs, "battle retreat: no way out"); + return qfalse; + } + //check for nearby goals periodicly + if (bs->check_time < FloatTime()) { + bs->check_time = FloatTime() + 1; + range = 150; +#ifdef CTF + if (gametype == GT_CTF) { + //if carrying a flag the bot shouldn't be distracted too much + if (BotCTFCarryingFlag(bs)) + range = 50; + } +#endif //CTF +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (Bot1FCTFCarryingFlag(bs)) + range = 50; + } + else if (gametype == GT_HARVESTER) { + if (BotHarvesterCarryingCubes(bs)) + range = 80; + } +#endif + // + if (BotNearbyGoal(bs, bs->tfl, &goal, range)) { + trap_BotResetLastAvoidReach(bs->ms); + //time the bot gets to pick up the nearby goal item + bs->nbg_time = FloatTime() + range / 100 + 1; + AIEnter_Battle_NBG(bs, "battle retreat: nbg"); + return qfalse; + } + } + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, &goal, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + bs->ltg_time = 0; + } + // + BotAIBlocked(bs, &moveresult, qfalse); + //PKMOD - Ergodic 04/15/01 - use beans if needed + BotEatBeans(bs); + //choose the best weapon to fight with + BotChooseWeapon(bs); + //if the view is fixed for the movement + if (moveresult.flags & (MOVERESULT_MOVEMENTVIEW|MOVERESULT_SWIMVIEW)) { + VectorCopy(moveresult.ideal_viewangles, bs->ideal_viewangles); + } + else if (!(moveresult.flags & MOVERESULT_MOVEMENTVIEWSET) + && !(bs->flags & BFL_IDEALVIEWSET) ) { + attack_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_ATTACK_SKILL, 0, 1); + //if the bot is skilled anough + if (attack_skill > 0.3) { + BotAimAtEnemy(bs); + } + else { + if (trap_BotMovementViewTarget(bs->ms, &goal, bs->tfl, 300, target)) { + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + } + else { + vectoangles(moveresult.movedir, bs->ideal_viewangles); + } + bs->ideal_viewangles[2] *= 0.5; + } + } + //if the weapon is used for the bot movement + if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs->weaponnum = moveresult.weapon; + //attack the enemy if possible + BotCheckAttack(bs); + // + return qtrue; +} + +/* +================== +AIEnter_Battle_NBG +================== +*/ +void AIEnter_Battle_NBG(bot_state_t *bs, char *s) { + BotRecordNodeSwitch(bs, "battle NBG", "", s); + bs->ainode = AINode_Battle_NBG; +} + +/* +================== +AINode_Battle_NBG +================== +*/ +int AINode_Battle_NBG(bot_state_t *bs) { + int areanum; + bot_goal_t goal; + aas_entityinfo_t entinfo; + bot_moveresult_t moveresult; + float attack_skill; + vec3_t target, dir; + + if (BotIsObserver(bs)) { + AIEnter_Observer(bs, "battle nbg: observer"); + return qfalse; + } + //if in the intermission + if (BotIntermission(bs)) { + AIEnter_Intermission(bs, "battle nbg: intermission"); + return qfalse; + } + //respawn if dead + if (BotIsDead(bs)) { + AIEnter_Respawn(bs, "battle nbg: bot dead"); + return qfalse; + } + //if no enemy + if (bs->enemy < 0) { + AIEnter_Seek_NBG(bs, "battle nbg: no enemy"); + return qfalse; + } + // + BotEntityInfo(bs->enemy, &entinfo); + if (EntityIsDead(&entinfo)) { + AIEnter_Seek_NBG(bs, "battle nbg: enemy dead"); + return qfalse; + } + // + bs->tfl = TFL_DEFAULT; + //PKMOD - Ergodic 02/11/02 - change grapple cvar name from "bot_grapple" to "bot_dragon" +// if (bot_grapple.integer) bs->tfl |= TFL_GRAPPLEHOOK; + if (bot_dragon.integer) bs->tfl |= TFL_GRAPPLEHOOK; + //if in lava or slime the bot should be able to get out + if (BotInLavaOrSlime(bs)) bs->tfl |= TFL_LAVA|TFL_SLIME; + // + if (BotCanAndWantsToRocketJump(bs)) { + bs->tfl |= TFL_ROCKETJUMP; + } + //map specific code + BotMapScripts(bs); + //update the last time the enemy was visible + if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy)) { + bs->enemyvisible_time = FloatTime(); + VectorCopy(entinfo.origin, target); + // if not a player enemy + if (bs->enemy >= MAX_CLIENTS) { +#ifdef MISSIONPACK + // if attacking an obelisk + if ( bs->enemy == redobelisk.entitynum || + bs->enemy == blueobelisk.entitynum ) { + target[2] += 16; + } +#endif + } + //update the reachability area and origin if possible + areanum = BotPointAreaNum(target); + if (areanum && trap_AAS_AreaReachability(areanum)) { + VectorCopy(target, bs->lastenemyorigin); + bs->lastenemyareanum = areanum; + } + } + //if the bot has no goal or touches the current goal + if (!trap_BotGetTopGoal(bs->gs, &goal)) { + bs->nbg_time = 0; + } + else if (BotReachedGoal(bs, &goal)) { + bs->nbg_time = 0; + } + // + if (bs->nbg_time < FloatTime()) { + //pop the current goal from the stack + trap_BotPopGoal(bs->gs); + //if the bot still has a goal + if (trap_BotGetTopGoal(bs->gs, &goal)) + AIEnter_Battle_Retreat(bs, "battle nbg: time out"); + else + AIEnter_Battle_Fight(bs, "battle nbg: time out"); + // + return qfalse; + } + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, &goal, bs->tfl); + //if the movement failed + if (moveresult.failure) { + //reset the avoid reach, otherwise bot is stuck in current area + trap_BotResetAvoidReach(bs->ms); + //BotAI_Print(PRT_MESSAGE, "movement failure %d\n", moveresult.traveltype); + bs->nbg_time = 0; + } + // + BotAIBlocked(bs, &moveresult, qfalse); + //update the attack inventory values + BotUpdateBattleInventory(bs, bs->enemy); + //choose the best weapon to fight with + BotChooseWeapon(bs); + //if the view is fixed for the movement + if (moveresult.flags & (MOVERESULT_MOVEMENTVIEW|MOVERESULT_SWIMVIEW)) { + VectorCopy(moveresult.ideal_viewangles, bs->ideal_viewangles); + } + else if (!(moveresult.flags & MOVERESULT_MOVEMENTVIEWSET) + && !(bs->flags & BFL_IDEALVIEWSET)) { + attack_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_ATTACK_SKILL, 0, 1); + //if the bot is skilled anough and the enemy is visible + if (attack_skill > 0.3) { + //&& BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy) + BotAimAtEnemy(bs); + } + else { + if (trap_BotMovementViewTarget(bs->ms, &goal, bs->tfl, 300, target)) { + VectorSubtract(target, bs->origin, dir); + vectoangles(dir, bs->ideal_viewangles); + } + else { + vectoangles(moveresult.movedir, bs->ideal_viewangles); + } + bs->ideal_viewangles[2] *= 0.5; + } + } + //if the weapon is used for the bot movement + if (moveresult.flags & MOVERESULT_MOVEMENTWEAPON) bs->weaponnum = moveresult.weapon; + //attack the enemy if possible + BotCheckAttack(bs); + // + return qtrue; +} + diff --git a/quake3/source/code/game/ai_dmnet.h b/quake3/source/code/game/ai_dmnet.h new file mode 100644 index 0000000..87f8cf2 --- /dev/null +++ b/quake3/source/code/game/ai_dmnet.h @@ -0,0 +1,41 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_dmnet.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_chat.c $ + * + *****************************************************************************/ + +#define MAX_NODESWITCHES 50 + +void AIEnter_Intermission(bot_state_t *bs, char *s); +void AIEnter_Observer(bot_state_t *bs, char *s); +void AIEnter_Respawn(bot_state_t *bs, char *s); +void AIEnter_Stand(bot_state_t *bs, char *s); +void AIEnter_Seek_ActivateEntity(bot_state_t *bs, char *s); +void AIEnter_Seek_NBG(bot_state_t *bs, char *s); +void AIEnter_Seek_LTG(bot_state_t *bs, char *s); +void AIEnter_Seek_Camp(bot_state_t *bs, char *s); +void AIEnter_Battle_Fight(bot_state_t *bs, char *s); +void AIEnter_Battle_Chase(bot_state_t *bs, char *s); +void AIEnter_Battle_Retreat(bot_state_t *bs, char *s); +void AIEnter_Battle_NBG(bot_state_t *bs, char *s); +int AINode_Intermission(bot_state_t *bs); +int AINode_Observer(bot_state_t *bs); +int AINode_Respawn(bot_state_t *bs); +int AINode_Stand(bot_state_t *bs); +int AINode_Seek_ActivateEntity(bot_state_t *bs); +int AINode_Seek_NBG(bot_state_t *bs); +int AINode_Seek_LTG(bot_state_t *bs); +int AINode_Battle_Fight(bot_state_t *bs); +int AINode_Battle_Chase(bot_state_t *bs); +int AINode_Battle_Retreat(bot_state_t *bs); +int AINode_Battle_NBG(bot_state_t *bs); + +void BotResetNodeSwitches(void); +void BotDumpNodeSwitches(bot_state_t *bs); + diff --git a/quake3/source/code/game/ai_dmq3.c b/quake3/source/code/game/ai_dmq3.c new file mode 100644 index 0000000..32aca4f --- /dev/null +++ b/quake3/source/code/game/ai_dmq3.c @@ -0,0 +1,5799 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_dmq3.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_dmq3.c $ + * + *****************************************************************************/ + + +#include "g_local.h" +#include "botlib.h" +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +#include "ai_team.h" +// +#include "chars.h" //characteristics +#include "inv.h" //indexes into the inventory +#include "syn.h" //synonyms +#include "match.h" //string matching types and vars + +// for the voice chats +#include "../../ui/menudef.h" // sos001205 - for q3_ui also + +// from aasfile.h +#define AREACONTENTS_MOVER 1024 +#define AREACONTENTS_MODELNUMSHIFT 24 +#define AREACONTENTS_MAXMODELNUM 0xFF +#define AREACONTENTS_MODELNUM (AREACONTENTS_MAXMODELNUM << AREACONTENTS_MODELNUMSHIFT) + +#define IDEAL_ATTACKDIST 140 + +#define MAX_WAYPOINTS 128 +// +bot_waypoint_t botai_waypoints[MAX_WAYPOINTS]; +bot_waypoint_t *botai_freewaypoints; + +//NOTE: not using a cvars which can be updated because the game should be reloaded anyway +int gametype; //game type +int maxclients; //maximum number of clients + +vmCvar_t bot_grapple; +vmCvar_t bot_rocketjump; +vmCvar_t bot_fastchat; +vmCvar_t bot_nochat; +vmCvar_t bot_testrchat; +vmCvar_t bot_challenge; +vmCvar_t bot_predictobstacles; +vmCvar_t g_spSkill; + +//PKMOD - Ergodic 02/11/02 - add dragon cvar +vmCvar_t bot_dragon; + +extern vmCvar_t bot_developer; + +vec3_t lastteleport_origin; //last teleport event origin +float lastteleport_time; //last teleport event time +int max_bspmodelindex; //maximum BSP model index + +//CTF flag goals +bot_goal_t ctf_redflag; +bot_goal_t ctf_blueflag; +#ifdef MISSIONPACK +bot_goal_t ctf_neutralflag; +bot_goal_t redobelisk; +bot_goal_t blueobelisk; +bot_goal_t neutralobelisk; +#endif + +#define MAX_ALTROUTEGOALS 32 + +int altroutegoals_setup; +aas_altroutegoal_t red_altroutegoals[MAX_ALTROUTEGOALS]; +int red_numaltroutegoals; +aas_altroutegoal_t blue_altroutegoals[MAX_ALTROUTEGOALS]; +int blue_numaltroutegoals; + + +/* +================== +BotSetUserInfo +================== +*/ +void BotSetUserInfo(bot_state_t *bs, char *key, char *value) { + char userinfo[MAX_INFO_STRING]; + + trap_GetUserinfo(bs->client, userinfo, sizeof(userinfo)); + Info_SetValueForKey(userinfo, key, value); + trap_SetUserinfo(bs->client, userinfo); + ClientUserinfoChanged( bs->client ); +} + +/* +================== +BotCTFCarryingFlag +================== +*/ +int BotCTFCarryingFlag(bot_state_t *bs) { + if (gametype != GT_CTF) return CTF_FLAG_NONE; + + if (bs->inventory[INVENTORY_REDFLAG] > 0) return CTF_FLAG_RED; + else if (bs->inventory[INVENTORY_BLUEFLAG] > 0) return CTF_FLAG_BLUE; + return CTF_FLAG_NONE; +} + +/* +================== +BotTeam +================== +*/ +int BotTeam(bot_state_t *bs) { + char info[1024]; + + if (bs->client < 0 || bs->client >= MAX_CLIENTS) { + //BotAI_Print(PRT_ERROR, "BotCTFTeam: client out of range\n"); + return qfalse; + } + trap_GetConfigstring(CS_PLAYERS+bs->client, info, sizeof(info)); + // + if (atoi(Info_ValueForKey(info, "t")) == TEAM_RED) return TEAM_RED; + else if (atoi(Info_ValueForKey(info, "t")) == TEAM_BLUE) return TEAM_BLUE; + return TEAM_FREE; +} + +/* +================== +BotOppositeTeam +================== +*/ +int BotOppositeTeam(bot_state_t *bs) { + switch(BotTeam(bs)) { + case TEAM_RED: return TEAM_BLUE; + case TEAM_BLUE: return TEAM_RED; + default: return TEAM_FREE; + } +} + +/* +================== +BotEnemyFlag +================== +*/ +bot_goal_t *BotEnemyFlag(bot_state_t *bs) { + if (BotTeam(bs) == TEAM_RED) { + return &ctf_blueflag; + } + else { + return &ctf_redflag; + } +} + +/* +================== +BotTeamFlag +================== +*/ +bot_goal_t *BotTeamFlag(bot_state_t *bs) { + if (BotTeam(bs) == TEAM_RED) { + return &ctf_redflag; + } + else { + return &ctf_blueflag; + } +} + + +/* +================== +EntityIsDead +================== +*/ +qboolean EntityIsDead(aas_entityinfo_t *entinfo) { + playerState_t ps; + + if (entinfo->number >= 0 && entinfo->number < MAX_CLIENTS) { + //retrieve the current client state + BotAI_GetClientState( entinfo->number, &ps ); + if (ps.pm_type != PM_NORMAL) return qtrue; + } + return qfalse; +} + +/* +================== +EntityCarriesFlag +================== +*/ +qboolean EntityCarriesFlag(aas_entityinfo_t *entinfo) { + if ( entinfo->powerups & ( 1 << PW_REDFLAG ) ) + return qtrue; + if ( entinfo->powerups & ( 1 << PW_BLUEFLAG ) ) + return qtrue; +#ifdef MISSIONPACK + if ( entinfo->powerups & ( 1 << PW_NEUTRALFLAG ) ) + return qtrue; +#endif + return qfalse; +} + +/* +================== +EntityIsInvisible +================== +*/ +qboolean EntityIsInvisible(aas_entityinfo_t *entinfo) { + // the flag is always visible + if (EntityCarriesFlag(entinfo)) { + return qfalse; + } + if (entinfo->powerups & (1 << PW_INVIS)) { + return qtrue; + } + return qfalse; +} + +/* +================== +EntityIsShooting +================== +*/ +qboolean EntityIsShooting(aas_entityinfo_t *entinfo) { + if (entinfo->flags & EF_FIRING) { + return qtrue; + } + return qfalse; +} + +/* +================== +EntityIsChatting +================== +*/ +qboolean EntityIsChatting(aas_entityinfo_t *entinfo) { + if (entinfo->flags & EF_TALK) { + return qtrue; + } + return qfalse; +} + +/* +================== +EntityHasQuad +================== +*/ +qboolean EntityHasQuad(aas_entityinfo_t *entinfo) { + if (entinfo->powerups & (1 << PW_QUAD)) { + return qtrue; + } + return qfalse; +} + +#ifdef MISSIONPACK +/* +================== +EntityHasKamikze +================== +*/ +qboolean EntityHasKamikaze(aas_entityinfo_t *entinfo) { + if (entinfo->flags & EF_KAMIKAZE) { + return qtrue; + } + return qfalse; +} + +/* +================== +EntityCarriesCubes +================== +*/ +qboolean EntityCarriesCubes(aas_entityinfo_t *entinfo) { + entityState_t state; + + if (gametype != GT_HARVESTER) + return qfalse; + //FIXME: get this info from the aas_entityinfo_t ? + BotAI_GetEntityState(entinfo->number, &state); + if (state.generic1 > 0) + return qtrue; + return qfalse; +} + +/* +================== +Bot1FCTFCarryingFlag +================== +*/ +int Bot1FCTFCarryingFlag(bot_state_t *bs) { + if (gametype != GT_1FCTF) return qfalse; + + if (bs->inventory[INVENTORY_NEUTRALFLAG] > 0) return qtrue; + return qfalse; +} + +/* +================== +BotHarvesterCarryingCubes +================== +*/ +int BotHarvesterCarryingCubes(bot_state_t *bs) { + if (gametype != GT_HARVESTER) return qfalse; + + if (bs->inventory[INVENTORY_REDCUBE] > 0) return qtrue; + if (bs->inventory[INVENTORY_BLUECUBE] > 0) return qtrue; + return qfalse; +} +#endif + +/* +================== +BotRememberLastOrderedTask +================== +*/ +void BotRememberLastOrderedTask(bot_state_t *bs) { + if (!bs->ordered) { + return; + } + bs->lastgoal_decisionmaker = bs->decisionmaker; + bs->lastgoal_ltgtype = bs->ltgtype; + memcpy(&bs->lastgoal_teamgoal, &bs->teamgoal, sizeof(bot_goal_t)); + bs->lastgoal_teammate = bs->teammate; +} + +/* +================== +BotSetTeamStatus +================== +*/ +void BotSetTeamStatus(bot_state_t *bs) { +#ifdef MISSIONPACK + int teamtask; + aas_entityinfo_t entinfo; + + teamtask = TEAMTASK_PATROL; + + switch(bs->ltgtype) { + case LTG_TEAMHELP: + break; + case LTG_TEAMACCOMPANY: + BotEntityInfo(bs->teammate, &entinfo); + if ( ( (gametype == GT_CTF || gametype == GT_1FCTF) && EntityCarriesFlag(&entinfo)) + || ( gametype == GT_HARVESTER && EntityCarriesCubes(&entinfo)) ) { + teamtask = TEAMTASK_ESCORT; + } + else { + teamtask = TEAMTASK_FOLLOW; + } + break; + case LTG_DEFENDKEYAREA: + teamtask = TEAMTASK_DEFENSE; + break; + case LTG_GETFLAG: + teamtask = TEAMTASK_OFFENSE; + break; + case LTG_RUSHBASE: + teamtask = TEAMTASK_DEFENSE; + break; + case LTG_RETURNFLAG: + teamtask = TEAMTASK_RETRIEVE; + break; + case LTG_CAMP: + case LTG_CAMPORDER: + teamtask = TEAMTASK_CAMP; + break; + case LTG_PATROL: + teamtask = TEAMTASK_PATROL; + break; + case LTG_GETITEM: + teamtask = TEAMTASK_PATROL; + break; + case LTG_KILL: + teamtask = TEAMTASK_PATROL; + break; + case LTG_HARVEST: + teamtask = TEAMTASK_OFFENSE; + break; + case LTG_ATTACKENEMYBASE: + teamtask = TEAMTASK_OFFENSE; + break; + default: + teamtask = TEAMTASK_PATROL; + break; + } + BotSetUserInfo(bs, "teamtask", va("%d", teamtask)); +#endif +} + +/* +================== +BotSetLastOrderedTask +================== +*/ +int BotSetLastOrderedTask(bot_state_t *bs) { + + if (gametype == GT_CTF) { + // don't go back to returning the flag if it's at the base + if ( bs->lastgoal_ltgtype == LTG_RETURNFLAG ) { + if ( BotTeam(bs) == TEAM_RED ) { + if ( bs->redflagstatus == 0 ) { + bs->lastgoal_ltgtype = 0; + } + } + else { + if ( bs->blueflagstatus == 0 ) { + bs->lastgoal_ltgtype = 0; + } + } + } + } + + if ( bs->lastgoal_ltgtype ) { + bs->decisionmaker = bs->lastgoal_decisionmaker; + bs->ordered = qtrue; + bs->ltgtype = bs->lastgoal_ltgtype; + memcpy(&bs->teamgoal, &bs->lastgoal_teamgoal, sizeof(bot_goal_t)); + bs->teammate = bs->lastgoal_teammate; + bs->teamgoal_time = FloatTime() + 300; + BotSetTeamStatus(bs); + // + if ( gametype == GT_CTF ) { + if ( bs->ltgtype == LTG_GETFLAG ) { + bot_goal_t *tb, *eb; + int tt, et; + + tb = BotTeamFlag(bs); + eb = BotEnemyFlag(bs); + tt = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, tb->areanum, TFL_DEFAULT); + et = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, eb->areanum, TFL_DEFAULT); + // if the travel time towards the enemy base is larger than towards our base + if (et > tt) { + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + } + } + } + return qtrue; + } + return qfalse; +} + +/* +================== +BotRefuseOrder +================== +*/ +void BotRefuseOrder(bot_state_t *bs) { + if (!bs->ordered) + return; + // if the bot was ordered to do something + if ( bs->order_time && bs->order_time > FloatTime() - 10 ) { + trap_EA_Action(bs->client, ACTION_NEGATIVE); + BotVoiceChat(bs, bs->decisionmaker, VOICECHAT_NO); + bs->order_time = 0; + } +} + +/* +================== +BotCTFSeekGoals +================== +*/ +void BotCTFSeekGoals(bot_state_t *bs) { + float rnd, l1, l2; + int flagstatus, c; + vec3_t dir; + aas_entityinfo_t entinfo; + + //when carrying a flag in ctf the bot should rush to the base + if (BotCTFCarryingFlag(bs)) { + //if not already rushing to the base + if (bs->ltgtype != LTG_RUSHBASE) { + BotRefuseOrder(bs); + bs->ltgtype = LTG_RUSHBASE; + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + switch(BotTeam(bs)) { + case TEAM_RED: VectorSubtract(bs->origin, ctf_blueflag.origin, dir); break; + case TEAM_BLUE: VectorSubtract(bs->origin, ctf_redflag.origin, dir); break; + default: VectorSet(dir, 999, 999, 999); break; + } + // if the bot picked up the flag very close to the enemy base + if ( VectorLength(dir) < 128 ) { + // get an alternative route goal through the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + } else { + // don't use any alt route goal, just get the hell out of the base + bs->altroutegoal.areanum = 0; + } + BotSetUserInfo(bs, "teamtask", va("%d", TEAMTASK_OFFENSE)); + BotVoiceChat(bs, -1, VOICECHAT_IHAVEFLAG); + } + else if (bs->rushbaseaway_time > FloatTime()) { + if (BotTeam(bs) == TEAM_RED) flagstatus = bs->redflagstatus; + else flagstatus = bs->blueflagstatus; + //if the flag is back + if (flagstatus == 0) { + bs->rushbaseaway_time = 0; + } + } + return; + } + // if the bot decided to follow someone + if ( bs->ltgtype == LTG_TEAMACCOMPANY && !bs->ordered ) { + // if the team mate being accompanied no longer carries the flag + BotEntityInfo(bs->teammate, &entinfo); + if (!EntityCarriesFlag(&entinfo)) { + bs->ltgtype = 0; + } + } + // + if (BotTeam(bs) == TEAM_RED) flagstatus = bs->redflagstatus * 2 + bs->blueflagstatus; + else flagstatus = bs->blueflagstatus * 2 + bs->redflagstatus; + //if our team has the enemy flag and our flag is at the base + if (flagstatus == 1) { + // + if (bs->owndecision_time < FloatTime()) { + //if Not defending the base already + if (!(bs->ltgtype == LTG_DEFENDKEYAREA && + (bs->teamgoal.number == ctf_redflag.number || + bs->teamgoal.number == ctf_blueflag.number))) { + //if there is a visible team mate flag carrier + c = BotTeamFlagCarrierVisible(bs); + if (c >= 0 && + // and not already following the team mate flag carrier + (bs->ltgtype != LTG_TEAMACCOMPANY || bs->teammate != c)) { + // + BotRefuseOrder(bs); + //follow the flag carrier + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //the team mate + bs->teammate = c; + //last time the team mate was visible + bs->teammatevisible_time = FloatTime(); + //no message + bs->teammessage_time = 0; + //no arrive message + bs->arrive_time = 1; + // + BotVoiceChat(bs, bs->teammate, VOICECHAT_ONFOLLOW); + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ACCOMPANY_TIME; + bs->ltgtype = LTG_TEAMACCOMPANY; + bs->formation_dist = 3.5 * 32; //3.5 meter + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + } + } + } + return; + } + //if the enemy has our flag + else if (flagstatus == 2) { + // + if (bs->owndecision_time < FloatTime()) { + //if enemy flag carrier is visible + c = BotEnemyFlagCarrierVisible(bs); + if (c >= 0) { + //FIXME: fight enemy flag carrier + } + //if not already doing something important + if (bs->ltgtype != LTG_GETFLAG && + bs->ltgtype != LTG_RETURNFLAG && + bs->ltgtype != LTG_TEAMHELP && + bs->ltgtype != LTG_TEAMACCOMPANY && + bs->ltgtype != LTG_CAMPORDER && + bs->ltgtype != LTG_PATROL && + bs->ltgtype != LTG_GETITEM) { + + BotRefuseOrder(bs); + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (random() < 0.5) { + //go for the enemy flag + bs->ltgtype = LTG_GETFLAG; + } + else { + bs->ltgtype = LTG_RETURNFLAG; + } + //no team message + bs->teammessage_time = 0; + //set the time the bot will stop getting the flag + bs->teamgoal_time = FloatTime() + CTF_GETFLAG_TIME; + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + // + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + } + } + return; + } + //if both flags Not at their bases + else if (flagstatus == 3) { + // + if (bs->owndecision_time < FloatTime()) { + // if not trying to return the flag and not following the team flag carrier + if ( bs->ltgtype != LTG_RETURNFLAG && bs->ltgtype != LTG_TEAMACCOMPANY ) { + // + c = BotTeamFlagCarrierVisible(bs); + // if there is a visible team mate flag carrier + if (c >= 0) { + BotRefuseOrder(bs); + //follow the flag carrier + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //the team mate + bs->teammate = c; + //last time the team mate was visible + bs->teammatevisible_time = FloatTime(); + //no message + bs->teammessage_time = 0; + //no arrive message + bs->arrive_time = 1; + // + BotVoiceChat(bs, bs->teammate, VOICECHAT_ONFOLLOW); + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ACCOMPANY_TIME; + bs->ltgtype = LTG_TEAMACCOMPANY; + bs->formation_dist = 3.5 * 32; //3.5 meter + // + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + } + else { + BotRefuseOrder(bs); + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //get the enemy flag + bs->teammessage_time = FloatTime() + 2 * random(); + //get the flag + bs->ltgtype = LTG_RETURNFLAG; + //set the time the bot will stop getting the flag + bs->teamgoal_time = FloatTime() + CTF_RETURNFLAG_TIME; + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + // + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + } + } + } + return; + } + // don't just do something wait for the bot team leader to give orders + if (BotTeamLeader(bs)) { + return; + } + // if the bot is ordered to do something + if ( bs->lastgoal_ltgtype ) { + bs->teamgoal_time += 60; + } + // if the bot decided to do something on it's own and has a last ordered goal + if ( !bs->ordered && bs->lastgoal_ltgtype ) { + bs->ltgtype = 0; + } + //if already a CTF or team goal + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_DEFENDKEYAREA || + bs->ltgtype == LTG_GETFLAG || + bs->ltgtype == LTG_RUSHBASE || + bs->ltgtype == LTG_RETURNFLAG || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL || + bs->ltgtype == LTG_GETITEM || + bs->ltgtype == LTG_MAKELOVE_UNDER || + bs->ltgtype == LTG_MAKELOVE_ONTOP) { + return; + } + // + if (BotSetLastOrderedTask(bs)) + return; + // + if (bs->owndecision_time > FloatTime()) + return;; + //if the bot is roaming + if (bs->ctfroam_time > FloatTime()) + return; + //if the bot has anough aggression to decide what to do + if (BotAggression(bs) < 50) + return; + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + // + if (bs->teamtaskpreference & (TEAMTP_ATTACKER|TEAMTP_DEFENDER)) { + if (bs->teamtaskpreference & TEAMTP_ATTACKER) { + l1 = 0.7f; + } + else { + l1 = 0.2f; + } + l2 = 0.9f; + } + else { + l1 = 0.4f; + l2 = 0.7f; + } + //get the flag or defend the base + rnd = random(); + if (rnd < l1 && ctf_redflag.areanum && ctf_blueflag.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + bs->ltgtype = LTG_GETFLAG; + //set the time the bot will stop getting the flag + bs->teamgoal_time = FloatTime() + CTF_GETFLAG_TIME; + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + BotSetTeamStatus(bs); + } + else if (rnd < l2 && ctf_redflag.areanum && ctf_blueflag.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &ctf_redflag, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &ctf_blueflag, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //set the time the bot stops defending the base + bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + bs->defendaway_time = 0; + BotSetTeamStatus(bs); + } + else { + bs->ltgtype = 0; + //set the time the bot will stop roaming + bs->ctfroam_time = FloatTime() + CTF_ROAM_TIME; + BotSetTeamStatus(bs); + } + bs->owndecision_time = FloatTime() + 5; +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotCTFRetreatGoals +================== +*/ +void BotCTFRetreatGoals(bot_state_t *bs) { + //when carrying a flag in ctf the bot should rush to the base + if (BotCTFCarryingFlag(bs)) { + //if not already rushing to the base + if (bs->ltgtype != LTG_RUSHBASE) { + BotRefuseOrder(bs); + bs->ltgtype = LTG_RUSHBASE; + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + BotSetTeamStatus(bs); + } + } +} + +#ifdef MISSIONPACK +/* +================== +Bot1FCTFSeekGoals +================== +*/ +void Bot1FCTFSeekGoals(bot_state_t *bs) { + aas_entityinfo_t entinfo; + float rnd, l1, l2; + int c; + + //when carrying a flag in ctf the bot should rush to the base + if (Bot1FCTFCarryingFlag(bs)) { + //if not already rushing to the base + if (bs->ltgtype != LTG_RUSHBASE) { + BotRefuseOrder(bs); + bs->ltgtype = LTG_RUSHBASE; + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + // + BotSetTeamStatus(bs); + BotVoiceChat(bs, -1, VOICECHAT_IHAVEFLAG); + } + return; + } + // if the bot decided to follow someone + if ( bs->ltgtype == LTG_TEAMACCOMPANY && !bs->ordered ) { + // if the team mate being accompanied no longer carries the flag + BotEntityInfo(bs->teammate, &entinfo); + if (!EntityCarriesFlag(&entinfo)) { + bs->ltgtype = 0; + } + } + //our team has the flag + if (bs->neutralflagstatus == 1) { + if (bs->owndecision_time < FloatTime()) { + // if not already following someone + if (bs->ltgtype != LTG_TEAMACCOMPANY) { + //if there is a visible team mate flag carrier + c = BotTeamFlagCarrierVisible(bs); + if (c >= 0) { + BotRefuseOrder(bs); + //follow the flag carrier + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //the team mate + bs->teammate = c; + //last time the team mate was visible + bs->teammatevisible_time = FloatTime(); + //no message + bs->teammessage_time = 0; + //no arrive message + bs->arrive_time = 1; + // + BotVoiceChat(bs, bs->teammate, VOICECHAT_ONFOLLOW); + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ACCOMPANY_TIME; + bs->ltgtype = LTG_TEAMACCOMPANY; + bs->formation_dist = 3.5 * 32; //3.5 meter + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + return; + } + } + //if already a CTF or team goal + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_DEFENDKEYAREA || + bs->ltgtype == LTG_GETFLAG || + bs->ltgtype == LTG_RUSHBASE || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL || + bs->ltgtype == LTG_ATTACKENEMYBASE || + bs->ltgtype == LTG_GETITEM || + bs->ltgtype == LTG_MAKELOVE_UNDER || + bs->ltgtype == LTG_MAKELOVE_ONTOP) { + return; + } + //if not already attacking the enemy base + if (bs->ltgtype != LTG_ATTACKENEMYBASE) { + BotRefuseOrder(bs); + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &ctf_blueflag, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &ctf_redflag, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_ATTACKENEMYBASE; + //set the time the bot will stop getting the flag + bs->teamgoal_time = FloatTime() + TEAM_ATTACKENEMYBASE_TIME; + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + } + } + return; + } + //enemy team has the flag + else if (bs->neutralflagstatus == 2) { + if (bs->owndecision_time < FloatTime()) { + c = BotEnemyFlagCarrierVisible(bs); + if (c >= 0) { + //FIXME: attack enemy flag carrier + } + //if already a CTF or team goal + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL || + bs->ltgtype == LTG_GETITEM) { + return; + } + // if not already defending the base + if (bs->ltgtype != LTG_DEFENDKEYAREA) { + BotRefuseOrder(bs); + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &ctf_redflag, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &ctf_blueflag, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //set the time the bot stops defending the base + bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + bs->defendaway_time = 0; + BotSetTeamStatus(bs); + bs->owndecision_time = FloatTime() + 5; + } + } + return; + } + // don't just do something wait for the bot team leader to give orders + if (BotTeamLeader(bs)) { + return; + } + // if the bot is ordered to do something + if ( bs->lastgoal_ltgtype ) { + bs->teamgoal_time += 60; + } + // if the bot decided to do something on it's own and has a last ordered goal + if ( !bs->ordered && bs->lastgoal_ltgtype ) { + bs->ltgtype = 0; + } + //if already a CTF or team goal + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_DEFENDKEYAREA || + bs->ltgtype == LTG_GETFLAG || + bs->ltgtype == LTG_RUSHBASE || + bs->ltgtype == LTG_RETURNFLAG || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL || + bs->ltgtype == LTG_ATTACKENEMYBASE || + bs->ltgtype == LTG_GETITEM || + bs->ltgtype == LTG_MAKELOVE_UNDER || + bs->ltgtype == LTG_MAKELOVE_ONTOP) { + return; + } + // + if (BotSetLastOrderedTask(bs)) + return; + // + if (bs->owndecision_time > FloatTime()) + return;; + //if the bot is roaming + if (bs->ctfroam_time > FloatTime()) + return; + //if the bot has anough aggression to decide what to do + if (BotAggression(bs) < 50) + return; + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + // + if (bs->teamtaskpreference & (TEAMTP_ATTACKER|TEAMTP_DEFENDER)) { + if (bs->teamtaskpreference & TEAMTP_ATTACKER) { + l1 = 0.7f; + } + else { + l1 = 0.2f; + } + l2 = 0.9f; + } + else { + l1 = 0.4f; + l2 = 0.7f; + } + //get the flag or defend the base + rnd = random(); + if (rnd < l1 && ctf_neutralflag.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + bs->ltgtype = LTG_GETFLAG; + //set the time the bot will stop getting the flag + bs->teamgoal_time = FloatTime() + CTF_GETFLAG_TIME; + BotSetTeamStatus(bs); + } + else if (rnd < l2 && ctf_redflag.areanum && ctf_blueflag.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &ctf_redflag, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &ctf_blueflag, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //set the time the bot stops defending the base + bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + bs->defendaway_time = 0; + BotSetTeamStatus(bs); + } + else { + bs->ltgtype = 0; + //set the time the bot will stop roaming + bs->ctfroam_time = FloatTime() + CTF_ROAM_TIME; + BotSetTeamStatus(bs); + } + bs->owndecision_time = FloatTime() + 5; +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +Bot1FCTFRetreatGoals +================== +*/ +void Bot1FCTFRetreatGoals(bot_state_t *bs) { + //when carrying a flag in ctf the bot should rush to the enemy base + if (Bot1FCTFCarryingFlag(bs)) { + //if not already rushing to the base + if (bs->ltgtype != LTG_RUSHBASE) { + BotRefuseOrder(bs); + bs->ltgtype = LTG_RUSHBASE; + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + BotSetTeamStatus(bs); + } + } +} + +/* +================== +BotObeliskSeekGoals +================== +*/ +void BotObeliskSeekGoals(bot_state_t *bs) { + float rnd, l1, l2; + + // don't just do something wait for the bot team leader to give orders + if (BotTeamLeader(bs)) { + return; + } + // if the bot is ordered to do something + if ( bs->lastgoal_ltgtype ) { + bs->teamgoal_time += 60; + } + //if already a team goal + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_DEFENDKEYAREA || + bs->ltgtype == LTG_GETFLAG || + bs->ltgtype == LTG_RUSHBASE || + bs->ltgtype == LTG_RETURNFLAG || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL || + bs->ltgtype == LTG_ATTACKENEMYBASE || + bs->ltgtype == LTG_GETITEM || + bs->ltgtype == LTG_MAKELOVE_UNDER || + bs->ltgtype == LTG_MAKELOVE_ONTOP) { + return; + } + // + if (BotSetLastOrderedTask(bs)) + return; + //if the bot is roaming + if (bs->ctfroam_time > FloatTime()) + return; + //if the bot has anough aggression to decide what to do + if (BotAggression(bs) < 50) + return; + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + // + if (bs->teamtaskpreference & (TEAMTP_ATTACKER|TEAMTP_DEFENDER)) { + if (bs->teamtaskpreference & TEAMTP_ATTACKER) { + l1 = 0.7f; + } + else { + l1 = 0.2f; + } + l2 = 0.9f; + } + else { + l1 = 0.4f; + l2 = 0.7f; + } + //get the flag or defend the base + rnd = random(); + if (rnd < l1 && redobelisk.areanum && blueobelisk.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &blueobelisk, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &redobelisk, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_ATTACKENEMYBASE; + //set the time the bot will stop attacking the enemy base + bs->teamgoal_time = FloatTime() + TEAM_ATTACKENEMYBASE_TIME; + //get an alternate route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + BotSetTeamStatus(bs); + } + else if (rnd < l2 && redobelisk.areanum && blueobelisk.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &redobelisk, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &blueobelisk, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //set the time the bot stops defending the base + bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + bs->defendaway_time = 0; + BotSetTeamStatus(bs); + } + else { + bs->ltgtype = 0; + //set the time the bot will stop roaming + bs->ctfroam_time = FloatTime() + CTF_ROAM_TIME; + BotSetTeamStatus(bs); + } +} + +/* +================== +BotGoHarvest +================== +*/ +void BotGoHarvest(bot_state_t *bs) { + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &blueobelisk, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &redobelisk, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_HARVEST; + //set the time the bot will stop harvesting + bs->teamgoal_time = FloatTime() + TEAM_HARVEST_TIME; + bs->harvestaway_time = 0; + BotSetTeamStatus(bs); +} + +/* +================== +BotObeliskRetreatGoals +================== +*/ +void BotObeliskRetreatGoals(bot_state_t *bs) { + //nothing special +} + +/* +================== +BotHarvesterSeekGoals +================== +*/ +void BotHarvesterSeekGoals(bot_state_t *bs) { + aas_entityinfo_t entinfo; + float rnd, l1, l2; + int c; + + //when carrying cubes in harvester the bot should rush to the base + if (BotHarvesterCarryingCubes(bs)) { + //if not already rushing to the base + if (bs->ltgtype != LTG_RUSHBASE) { + BotRefuseOrder(bs); + bs->ltgtype = LTG_RUSHBASE; + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + // + BotSetTeamStatus(bs); + } + return; + } + // don't just do something wait for the bot team leader to give orders + if (BotTeamLeader(bs)) { + return; + } + // if the bot decided to follow someone + if ( bs->ltgtype == LTG_TEAMACCOMPANY && !bs->ordered ) { + // if the team mate being accompanied no longer carries the flag + BotEntityInfo(bs->teammate, &entinfo); + if (!EntityCarriesCubes(&entinfo)) { + bs->ltgtype = 0; + } + } + // if the bot is ordered to do something + if ( bs->lastgoal_ltgtype ) { + bs->teamgoal_time += 60; + } + //if not yet doing something + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_DEFENDKEYAREA || + bs->ltgtype == LTG_GETFLAG || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL || + bs->ltgtype == LTG_ATTACKENEMYBASE || + bs->ltgtype == LTG_HARVEST || + bs->ltgtype == LTG_GETITEM || + bs->ltgtype == LTG_MAKELOVE_UNDER || + bs->ltgtype == LTG_MAKELOVE_ONTOP) { + return; + } + // + if (BotSetLastOrderedTask(bs)) + return; + //if the bot is roaming + if (bs->ctfroam_time > FloatTime()) + return; + //if the bot has anough aggression to decide what to do + if (BotAggression(bs) < 50) + return; + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + // + c = BotEnemyCubeCarrierVisible(bs); + if (c >= 0) { + //FIXME: attack enemy cube carrier + } + if (bs->ltgtype != LTG_TEAMACCOMPANY) { + //if there is a visible team mate carrying cubes + c = BotTeamCubeCarrierVisible(bs); + if (c >= 0) { + //follow the team mate carrying cubes + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + //the team mate + bs->teammate = c; + //last time the team mate was visible + bs->teammatevisible_time = FloatTime(); + //no message + bs->teammessage_time = 0; + //no arrive message + bs->arrive_time = 1; + // + BotVoiceChat(bs, bs->teammate, VOICECHAT_ONFOLLOW); + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ACCOMPANY_TIME; + bs->ltgtype = LTG_TEAMACCOMPANY; + bs->formation_dist = 3.5 * 32; //3.5 meter + BotSetTeamStatus(bs); + return; + } + } + // + if (bs->teamtaskpreference & (TEAMTP_ATTACKER|TEAMTP_DEFENDER)) { + if (bs->teamtaskpreference & TEAMTP_ATTACKER) { + l1 = 0.7f; + } + else { + l1 = 0.2f; + } + l2 = 0.9f; + } + else { + l1 = 0.4f; + l2 = 0.7f; + } + // + rnd = random(); + if (rnd < l1 && redobelisk.areanum && blueobelisk.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + BotGoHarvest(bs); + } + else if (rnd < l2 && redobelisk.areanum && blueobelisk.areanum) { + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + // + if (BotTeam(bs) == TEAM_RED) memcpy(&bs->teamgoal, &redobelisk, sizeof(bot_goal_t)); + else memcpy(&bs->teamgoal, &blueobelisk, sizeof(bot_goal_t)); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //set the time the bot stops defending the base + bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + bs->defendaway_time = 0; + BotSetTeamStatus(bs); + } + else { + bs->ltgtype = 0; + //set the time the bot will stop roaming + bs->ctfroam_time = FloatTime() + CTF_ROAM_TIME; + BotSetTeamStatus(bs); + } +} + +/* +================== +BotHarvesterRetreatGoals +================== +*/ +void BotHarvesterRetreatGoals(bot_state_t *bs) { + //when carrying cubes in harvester the bot should rush to the base + if (BotHarvesterCarryingCubes(bs)) { + //if not already rushing to the base + if (bs->ltgtype != LTG_RUSHBASE) { + BotRefuseOrder(bs); + bs->ltgtype = LTG_RUSHBASE; + bs->teamgoal_time = FloatTime() + CTF_RUSHBASE_TIME; + bs->rushbaseaway_time = 0; + bs->decisionmaker = bs->client; + bs->ordered = qfalse; + BotSetTeamStatus(bs); + } + return; + } +} +#endif + +/* +================== +BotTeamGoals +================== +*/ +void BotTeamGoals(bot_state_t *bs, int retreat) { + + if ( retreat ) { + if (gametype == GT_CTF) { + BotCTFRetreatGoals(bs); + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + Bot1FCTFRetreatGoals(bs); + } + else if (gametype == GT_OBELISK) { + BotObeliskRetreatGoals(bs); + } + else if (gametype == GT_HARVESTER) { + BotHarvesterRetreatGoals(bs); + } +#endif + } + else { + if (gametype == GT_CTF) { + //decide what to do in CTF mode + BotCTFSeekGoals(bs); + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + Bot1FCTFSeekGoals(bs); + } + else if (gametype == GT_OBELISK) { + BotObeliskSeekGoals(bs); + } + else if (gametype == GT_HARVESTER) { + BotHarvesterSeekGoals(bs); + } +#endif + } + // reset the order time which is used to see if + // we decided to refuse an order + bs->order_time = 0; +} + +/* +================== +BotPointAreaNum +================== +*/ +int BotPointAreaNum(vec3_t origin) { + int areanum, numareas, areas[10]; + vec3_t end; + + areanum = trap_AAS_PointAreaNum(origin); + if (areanum) return areanum; + VectorCopy(origin, end); + end[2] += 10; + numareas = trap_AAS_TraceAreas(origin, end, areas, NULL, 10); + if (numareas > 0) return areas[0]; + return 0; +} + +/* +================== +ClientName +================== +*/ +char *ClientName(int client, char *name, int size) { + char buf[MAX_INFO_STRING]; + + if (client < 0 || client >= MAX_CLIENTS) { + //PKMOD - Ergodic 01/07/02 - modify message to display client for error with /addbot doom + BotAI_Print(PRT_ERROR, "ClientName: client out of range: Client Number:%d\n", client); + return "[client out of range]"; + } + trap_GetConfigstring(CS_PLAYERS+client, buf, sizeof(buf)); + strncpy(name, Info_ValueForKey(buf, "n"), size-1); + name[size-1] = '\0'; + Q_CleanStr( name ); + return name; +} + +/* +================== +ClientSkin +================== +*/ +char *ClientSkin(int client, char *skin, int size) { + char buf[MAX_INFO_STRING]; + + if (client < 0 || client >= MAX_CLIENTS) { + BotAI_Print(PRT_ERROR, "ClientSkin: client out of range\n"); + return "[client out of range]"; + } + trap_GetConfigstring(CS_PLAYERS+client, buf, sizeof(buf)); + strncpy(skin, Info_ValueForKey(buf, "model"), size-1); + skin[size-1] = '\0'; + return skin; +} + +/* +================== +ClientFromName +================== +*/ +int ClientFromName(char *name) { + int i; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + Q_CleanStr( buf ); + if (!Q_stricmp(Info_ValueForKey(buf, "n"), name)) return i; + } + return -1; +} + +/* +================== +ClientOnSameTeamFromName +================== +*/ +int ClientOnSameTeamFromName(bot_state_t *bs, char *name) { + int i; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (!BotSameTeam(bs, i)) + continue; + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + Q_CleanStr( buf ); + if (!Q_stricmp(Info_ValueForKey(buf, "n"), name)) return i; + } + return -1; +} + +/* +================== +stristr +================== +*/ +char *stristr(char *str, char *charset) { + int i; + + while(*str) { + for (i = 0; charset[i] && str[i]; i++) { + if (toupper(charset[i]) != toupper(str[i])) break; + } + if (!charset[i]) return str; + str++; + } + return NULL; +} + +/* +================== +EasyClientName +================== +*/ +char *EasyClientName(int client, char *buf, int size) { + int i; + char *str1, *str2, *ptr, c; + char name[128]; + + strcpy(name, ClientName(client, name, sizeof(name))); + for (i = 0; name[i]; i++) name[i] &= 127; + //remove all spaces + for (ptr = strstr(name, " "); ptr; ptr = strstr(name, " ")) { + memmove(ptr, ptr+1, strlen(ptr+1)+1); + } + //check for [x] and ]x[ clan names + str1 = strstr(name, "["); + str2 = strstr(name, "]"); + if (str1 && str2) { + if (str2 > str1) memmove(str1, str2+1, strlen(str2+1)+1); + else memmove(str2, str1+1, strlen(str1+1)+1); + } + //remove Mr prefix + if ((name[0] == 'm' || name[0] == 'M') && + (name[1] == 'r' || name[1] == 'R')) { + memmove(name, name+2, strlen(name+2)+1); + } + //only allow lower case alphabet characters + ptr = name; + while(*ptr) { + c = *ptr; + if ((c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || c == '_') { + ptr++; + } + else if (c >= 'A' && c <= 'Z') { + *ptr += 'a' - 'A'; + ptr++; + } + else { + memmove(ptr, ptr+1, strlen(ptr + 1)+1); + } + } + strncpy(buf, name, size-1); + buf[size-1] = '\0'; + return buf; +} + +/* +================== +BotSynonymContext +================== +*/ +int BotSynonymContext(bot_state_t *bs) { + int context; + + context = CONTEXT_NORMAL|CONTEXT_NEARBYITEM|CONTEXT_NAMES; + // + if (gametype == GT_CTF +#ifdef MISSIONPACK + || gametype == GT_1FCTF +#endif + ) { + if (BotTeam(bs) == TEAM_RED) context |= CONTEXT_CTFREDTEAM; + else context |= CONTEXT_CTFBLUETEAM; + } +#ifdef MISSIONPACK + else if (gametype == GT_OBELISK) { + if (BotTeam(bs) == TEAM_RED) context |= CONTEXT_OBELISKREDTEAM; + else context |= CONTEXT_OBELISKBLUETEAM; + } + else if (gametype == GT_HARVESTER) { + if (BotTeam(bs) == TEAM_RED) context |= CONTEXT_HARVESTERREDTEAM; + else context |= CONTEXT_HARVESTERBLUETEAM; + } +#endif + return context; +} + +/* +================== +BotEatBeans +PKMOD - Ergodic 04/15/01 - bots will select beans at low health times +================== +*/ +void BotEatBeans(bot_state_t *bs) { + //PKMOD - Ergodic 04/15/01 - debug bot name + char netname[MAX_NETNAME]; + + //PKMOD - Ergodic 04/15/01 - debug bot name + ClientName(bs->client, netname, sizeof(netname)); + + + if (bs->inventory[INVENTORY_HEALTH] < 70) { + //PKMOD - Ergodic 04/15/01 - debug beans eating (inactive) +// Com_Printf("BotEatBeans - health>%d<, beans>%d<\n", bs->inventory[INVENTORY_HEALTH], bs->inventory[INVENTORY_BEANS]); + + if (bs->inventory[INVENTORY_BEANS] > 0) { + //PKMOD - Ergodic 04/15/01 - debug beans eating (inactive) +// Com_Printf("BotEatBeans - beans in inventory\n"); + if (bs->weaponnum != WP_BEANS) { + + bs->weaponchange_time = FloatTime(); + bs->weaponnum = WP_BEANS; + trap_EA_SelectWeapon(bs->client, bs->weaponnum); + + //co-op method for rocket jump (hack) [NOPE - it does not work] +// bs->tfl |= TFL_ROCKETJUMP; + + //if bot has an enemy then use beans + if (bs->enemy >= 0) { + //PKMOD - Ergodic 04/15/01 - debug beans eating (inactive) +// Com_Printf("BotEatBeans - %s: Eating my beans\n", netname); + trap_EA_Attack(bs->client); + } + } + } + } +} + +/* +================== +BotChooseWeapon +================== +*/ +void BotChooseWeapon(bot_state_t *bs) { + int newweaponnum; + + if (bs->cur_ps.weaponstate == WEAPON_RAISING || + bs->cur_ps.weaponstate == WEAPON_DROPPING) { + trap_EA_SelectWeapon(bs->client, bs->weaponnum); + } + else { + newweaponnum = trap_BotChooseBestFightWeapon(bs->ws, bs->inventory); + if (bs->weaponnum != newweaponnum) bs->weaponchange_time = FloatTime(); + bs->weaponnum = newweaponnum; + //BotAI_Print(PRT_MESSAGE, "bs->weaponnum = %d\n", bs->weaponnum); + trap_EA_SelectWeapon(bs->client, bs->weaponnum); + } +} + +/* +================== +BotSetupForMovement +================== +*/ +void BotSetupForMovement(bot_state_t *bs) { + bot_initmove_t initmove; + + memset(&initmove, 0, sizeof(bot_initmove_t)); + VectorCopy(bs->cur_ps.origin, initmove.origin); + VectorCopy(bs->cur_ps.velocity, initmove.velocity); + VectorClear(initmove.viewoffset); + initmove.viewoffset[2] += bs->cur_ps.viewheight; + initmove.entitynum = bs->entitynum; + initmove.client = bs->client; + initmove.thinktime = bs->thinktime; + //set the onground flag + if (bs->cur_ps.groundEntityNum != ENTITYNUM_NONE) initmove.or_moveflags |= MFL_ONGROUND; + //set the teleported flag + if ((bs->cur_ps.pm_flags & PMF_TIME_KNOCKBACK) && (bs->cur_ps.pm_time > 0)) { + initmove.or_moveflags |= MFL_TELEPORTED; + } + //set the waterjump flag + if ((bs->cur_ps.pm_flags & PMF_TIME_WATERJUMP) && (bs->cur_ps.pm_time > 0)) { + initmove.or_moveflags |= MFL_WATERJUMP; + } + //set presence type + if (bs->cur_ps.pm_flags & PMF_DUCKED) initmove.presencetype = PRESENCE_CROUCH; + else initmove.presencetype = PRESENCE_NORMAL; + // + if (bs->walker > 0.5) initmove.or_moveflags |= MFL_WALK; + // + VectorCopy(bs->viewangles, initmove.viewangles); + // + trap_BotInitMoveState(bs->ms, &initmove); +} + +/* +================== +BotCheckItemPickup +================== +*/ +void BotCheckItemPickup(bot_state_t *bs, int *oldinventory) { +#ifdef MISSIONPACK + int offence, leader; + + if (gametype <= GT_TEAM) + return; + + offence = -1; + // go into offence if picked up the kamikaze or invulnerability + if (!oldinventory[INVENTORY_KAMIKAZE] && bs->inventory[INVENTORY_KAMIKAZE] >= 1) { + offence = qtrue; + } + if (!oldinventory[INVENTORY_INVULNERABILITY] && bs->inventory[INVENTORY_INVULNERABILITY] >= 1) { + offence = qtrue; + } + // if not already wearing the kamikaze or invulnerability + if (!bs->inventory[INVENTORY_KAMIKAZE] && !bs->inventory[INVENTORY_INVULNERABILITY]) { + if (!oldinventory[INVENTORY_SCOUT] && bs->inventory[INVENTORY_SCOUT] >= 1) { + offence = qtrue; + } + if (!oldinventory[INVENTORY_GUARD] && bs->inventory[INVENTORY_GUARD] >= 1) { + offence = qtrue; + } + if (!oldinventory[INVENTORY_DOUBLER] && bs->inventory[INVENTORY_DOUBLER] >= 1) { + offence = qfalse; + } + if (!oldinventory[INVENTORY_AMMOREGEN] && bs->inventory[INVENTORY_AMMOREGEN] >= 1) { + offence = qfalse; + } + } + + if (offence >= 0) { + leader = ClientFromName(bs->teamleader); + if (offence) { + if (!(bs->teamtaskpreference & TEAMTP_ATTACKER)) { + // if we have a bot team leader + if (BotTeamLeader(bs)) { + // tell the leader we want to be on offence + BotVoiceChat(bs, leader, VOICECHAT_WANTONOFFENSE); + //BotAI_BotInitialChat(bs, "wantoffence", NULL); + //trap_BotEnterChat(bs->cs, leader, CHAT_TELL); + } + else if (g_spSkill.integer <= 3) { + if ( bs->ltgtype != LTG_GETFLAG && + bs->ltgtype != LTG_ATTACKENEMYBASE && + bs->ltgtype != LTG_HARVEST ) { + // + if ((gametype != GT_CTF || (bs->redflagstatus == 0 && bs->blueflagstatus == 0)) && + (gametype != GT_1FCTF || bs->neutralflagstatus == 0) ) { + // tell the leader we want to be on offence + BotVoiceChat(bs, leader, VOICECHAT_WANTONOFFENSE); + //BotAI_BotInitialChat(bs, "wantoffence", NULL); + //trap_BotEnterChat(bs->cs, leader, CHAT_TELL); + } + } + bs->teamtaskpreference |= TEAMTP_ATTACKER; + } + } + bs->teamtaskpreference &= ~TEAMTP_DEFENDER; + } + else { + if (!(bs->teamtaskpreference & TEAMTP_DEFENDER)) { + // if we have a bot team leader + if (BotTeamLeader(bs)) { + // tell the leader we want to be on defense + BotVoiceChat(bs, -1, VOICECHAT_WANTONDEFENSE); + //BotAI_BotInitialChat(bs, "wantdefence", NULL); + //trap_BotEnterChat(bs->cs, leader, CHAT_TELL); + } + else if (g_spSkill.integer <= 3) { + if ( bs->ltgtype != LTG_DEFENDKEYAREA ) { + // + if ((gametype != GT_CTF || (bs->redflagstatus == 0 && bs->blueflagstatus == 0)) && + (gametype != GT_1FCTF || bs->neutralflagstatus == 0) ) { + // tell the leader we want to be on defense + BotVoiceChat(bs, -1, VOICECHAT_WANTONDEFENSE); + //BotAI_BotInitialChat(bs, "wantdefence", NULL); + //trap_BotEnterChat(bs->cs, leader, CHAT_TELL); + } + } + } + bs->teamtaskpreference |= TEAMTP_DEFENDER; + } + bs->teamtaskpreference &= ~TEAMTP_ATTACKER; + } + } +#endif +} + +/* +================== +BotUpdateInventory +================== +*/ +void BotUpdateInventory(bot_state_t *bs) { + int oldinventory[MAX_ITEMS]; + + memcpy(oldinventory, bs->inventory, sizeof(oldinventory)); + //armor + bs->inventory[INVENTORY_ARMOR] = bs->cur_ps.stats[STAT_ARMOR]; + //weapons + bs->inventory[INVENTORY_GAUNTLET] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_GAUNTLET)) != 0; + bs->inventory[INVENTORY_SHOTGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_SHOTGUN)) != 0; + bs->inventory[INVENTORY_MACHINEGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_MACHINEGUN)) != 0; + bs->inventory[INVENTORY_GRENADELAUNCHER] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_GRENADE_LAUNCHER)) != 0; + bs->inventory[INVENTORY_ROCKETLAUNCHER] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_ROCKET_LAUNCHER)) != 0; + bs->inventory[INVENTORY_LIGHTNING] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_LIGHTNING)) != 0; + bs->inventory[INVENTORY_RAILGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_RAILGUN)) != 0; + + //PKMOD - Ergodic 09/07/00 add PainKeepArena weapons + bs->inventory[INVENTORY_GRAVITY] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_GRAVITY)) != 0; + bs->inventory[INVENTORY_SENTRY] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_SENTRY)) != 0; + bs->inventory[INVENTORY_TRAP] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_BEARTRAP)) != 0; + bs->inventory[INVENTORY_BEANS] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_BEANS)) != 0; + bs->inventory[INVENTORY_AIRFIST] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_AIRFIST)) != 0; + //PKMOD - Ergodic - 12/17/00 rename NAILGUN to PKA_NAILGUN to resolve 1.27g conflict + bs->inventory[INVENTORY_PKA_NAILGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_NAILGUN)) != 0; + + + //PKMOD - Ergodic 09/07/00 remove plasma gun from PKA +// bs->inventory[INVENTORY_PLASMAGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_PLASMAGUN)) != 0; + //PKMOD - Ergodic 09/07/00 remove BFG gun from PKA +// bs->inventory[INVENTORY_BFG10K] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_BFG)) != 0; + + bs->inventory[INVENTORY_GRAPPLINGHOOK] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_GRAPPLING_HOOK)) != 0; +#ifdef MISSIONPACK + bs->inventory[INVENTORY_NAILGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_NAILGUN)) != 0;; + bs->inventory[INVENTORY_PROXLAUNCHER] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_PROX_LAUNCHER)) != 0;; + bs->inventory[INVENTORY_CHAINGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_CHAINGUN)) != 0;; +#endif + //ammo + bs->inventory[INVENTORY_SHELLS] = bs->cur_ps.ammo[WP_SHOTGUN]; + bs->inventory[INVENTORY_BULLETS] = bs->cur_ps.ammo[WP_MACHINEGUN]; + bs->inventory[INVENTORY_GRENADES] = bs->cur_ps.ammo[WP_GRENADE_LAUNCHER]; + //PKMOD - Ergodic 04/14/01 remove cells from PKA +// bs->inventory[INVENTORY_CELLS] = bs->cur_ps.ammo[WP_PLASMAGUN]; + bs->inventory[INVENTORY_LIGHTNINGAMMO] = bs->cur_ps.ammo[WP_LIGHTNING]; + bs->inventory[INVENTORY_ROCKETS] = bs->cur_ps.ammo[WP_ROCKET_LAUNCHER]; + bs->inventory[INVENTORY_SLUGS] = bs->cur_ps.ammo[WP_RAILGUN]; + //PKMOD - Ergodic 04/14/01 remove bfg ammo from PKA +// bs->inventory[INVENTORY_BFGAMMO] = bs->cur_ps.ammo[WP_BFG]; + + //PKMOD - Ergodic 09/07/00 add PainKeepArena ammo + bs->inventory[INVENTORY_GRAVITY_AMMO] = bs->cur_ps.ammo[WP_GRAVITY]; + bs->inventory[INVENTORY_SENTRY_AMMO] = bs->cur_ps.ammo[WP_SENTRY]; + bs->inventory[INVENTORY_TRAP_AMMO] = bs->cur_ps.ammo[WP_BEARTRAP]; + //PKMOD - Ergodic - 12/17/00 rename NAILS to PKA_NAILS to resolve 1.27g conflict + bs->inventory[INVENTORY_PKA_NAILS] = bs->cur_ps.ammo[WP_NAILGUN]; + + //PKMOD - Ergodic - 04/14/01 - add explosive shells - duh + bs->inventory[INVENTORY_EXPLOSIVESHOTGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_EXPLODING_SHELLS)) != 0; + bs->inventory[INVENTORY_EXPLOSIVESHELLS] = bs->cur_ps.ammo[WP_EXPLODING_SHELLS]; + +#ifdef MISSIONPACK + bs->inventory[INVENTORY_NAILS] = bs->cur_ps.ammo[WP_NAILGUN]; + bs->inventory[INVENTORY_MINES] = bs->cur_ps.ammo[WP_PROX_LAUNCHER]; + bs->inventory[INVENTORY_BELT] = bs->cur_ps.ammo[WP_CHAINGUN]; +#endif + //powerups + bs->inventory[INVENTORY_HEALTH] = bs->cur_ps.stats[STAT_HEALTH]; + //PKMOD - Ergodic 05/11/01 - allow holding of more than 1 type of + // holdable but only 1 of each kind +// bs->inventory[INVENTORY_TELEPORTER] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_TELEPORTER; + bs->inventory[INVENTORY_TELEPORTER] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_TELEPORTER) ); +// bs->inventory[INVENTORY_MEDKIT] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_MEDKIT; + bs->inventory[INVENTORY_MEDKIT] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_MEDKIT) ); + //PKMOD - Ergodic 11/10/01 - new holdables + bs->inventory[INVENTORY_RADIATE] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_RADIATE) ); + //PKMOD - Ergodic 11/23/01 - new holdables + bs->inventory[INVENTORY_PERSENTRY] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_PERSENTRY) ); + //PKMOD - Ergodic 12/03/01 - New Holdables - Private Bot pieces (Legs, Torso, Head) + bs->inventory[INVENTORY_PRIBOTLEGS] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_BOTLEGS) ); + bs->inventory[INVENTORY_PRIBOTTORSO] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_BOTTORSO) ); + bs->inventory[INVENTORY_PRIBOTHEAD] = 0 < ( bs->cur_ps.stats[STAT_HOLDABLE_ITEM] & (1 << HI_BOTHEAD) ); + +#ifdef MISSIONPACK + bs->inventory[INVENTORY_KAMIKAZE] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_KAMIKAZE; + bs->inventory[INVENTORY_PORTAL] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_PORTAL; + bs->inventory[INVENTORY_INVULNERABILITY] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_INVULNERABILITY; +#endif + bs->inventory[INVENTORY_QUAD] = bs->cur_ps.powerups[PW_QUAD] != 0; + bs->inventory[INVENTORY_ENVIRONMENTSUIT] = bs->cur_ps.powerups[PW_BATTLESUIT] != 0; + bs->inventory[INVENTORY_HASTE] = bs->cur_ps.powerups[PW_HASTE] != 0; + bs->inventory[INVENTORY_INVISIBILITY] = bs->cur_ps.powerups[PW_INVIS] != 0; + bs->inventory[INVENTORY_REGEN] = bs->cur_ps.powerups[PW_REGEN] != 0; + bs->inventory[INVENTORY_FLIGHT] = bs->cur_ps.powerups[PW_FLIGHT] != 0; +#ifdef MISSIONPACK + bs->inventory[INVENTORY_SCOUT] = bs->cur_ps.stats[STAT_PERSISTANT_POWERUP] == MODELINDEX_SCOUT; + bs->inventory[INVENTORY_GUARD] = bs->cur_ps.stats[STAT_PERSISTANT_POWERUP] == MODELINDEX_GUARD; + bs->inventory[INVENTORY_DOUBLER] = bs->cur_ps.stats[STAT_PERSISTANT_POWERUP] == MODELINDEX_DOUBLER; + bs->inventory[INVENTORY_AMMOREGEN] = bs->cur_ps.stats[STAT_PERSISTANT_POWERUP] == MODELINDEX_AMMOREGEN; +#endif + bs->inventory[INVENTORY_REDFLAG] = bs->cur_ps.powerups[PW_REDFLAG] != 0; + bs->inventory[INVENTORY_BLUEFLAG] = bs->cur_ps.powerups[PW_BLUEFLAG] != 0; +#ifdef MISSIONPACK + bs->inventory[INVENTORY_NEUTRALFLAG] = bs->cur_ps.powerups[PW_NEUTRALFLAG] != 0; + if (BotTeam(bs) == TEAM_RED) { + bs->inventory[INVENTORY_REDCUBE] = bs->cur_ps.generic1; + bs->inventory[INVENTORY_BLUECUBE] = 0; + } + else { + bs->inventory[INVENTORY_REDCUBE] = 0; + bs->inventory[INVENTORY_BLUECUBE] = bs->cur_ps.generic1; + } +#endif + + // + //PKMOD - Ergodic 07/09/00 try to get bots to display the attached beartrap + bs->inventory[INVENTORY_BEARTRAPS_ATTACHED] = bs->cur_ps.stats[STAT_BEARTRAPS_ATTACHED]; + + //PKMOD - Ergodic 12/20/00 Debug bot state for attached beartraps (inactive) +// if (bs->inventory[INVENTORY_BEARTRAPS_ATTACHED] > 0) { +// Com_Printf("BotUpdateInventory - bot has beartrap attached\n" ); +// } + + BotCheckItemPickup(bs, oldinventory); +} + +/* +================== +BotUpdateBattleInventory +================== +*/ +void BotUpdateBattleInventory(bot_state_t *bs, int enemy) { + vec3_t dir; + aas_entityinfo_t entinfo; + + BotEntityInfo(enemy, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + bs->inventory[ENEMY_HEIGHT] = (int) dir[2]; + dir[2] = 0; + bs->inventory[ENEMY_HORIZONTAL_DIST] = (int) VectorLength(dir); + //FIXME: add num visible enemies and num visible team mates to the inventory +} + +#ifdef MISSIONPACK +/* +================== +BotUseKamikaze +================== +*/ +#define KAMIKAZE_DIST 1024 + +void BotUseKamikaze(bot_state_t *bs) { + int c, teammates, enemies; + aas_entityinfo_t entinfo; + vec3_t dir, target; + bot_goal_t *goal; + bsp_trace_t trace; + + //if the bot has no kamikaze + if (bs->inventory[INVENTORY_KAMIKAZE] <= 0) + return; + if (bs->kamikaze_time > FloatTime()) + return; + bs->kamikaze_time = FloatTime() + 0.2; + if (gametype == GT_CTF) { + //never use kamikaze if the team flag carrier is visible + if (BotCTFCarryingFlag(bs)) + return; + c = BotTeamFlagCarrierVisible(bs); + if (c >= 0) { + BotEntityInfo(c, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST)) + return; + } + c = BotEnemyFlagCarrierVisible(bs); + if (c >= 0) { + BotEntityInfo(c, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST)) { + trap_EA_Use(bs->client); + return; + } + } + } + else if (gametype == GT_1FCTF) { + //never use kamikaze if the team flag carrier is visible + if (Bot1FCTFCarryingFlag(bs)) + return; + c = BotTeamFlagCarrierVisible(bs); + if (c >= 0) { + BotEntityInfo(c, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST)) + return; + } + c = BotEnemyFlagCarrierVisible(bs); + if (c >= 0) { + BotEntityInfo(c, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST)) { + trap_EA_Use(bs->client); + return; + } + } + } + else if (gametype == GT_OBELISK) { + switch(BotTeam(bs)) { + case TEAM_RED: goal = &blueobelisk; break; + default: goal = &redobelisk; break; + } + //if the obelisk is visible + VectorCopy(goal->origin, target); + target[2] += 1; + VectorSubtract(bs->origin, target, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST * 0.9)) { + BotAI_Trace(&trace, bs->eye, NULL, NULL, target, bs->client, CONTENTS_SOLID); + if (trace.fraction >= 1 || trace.ent == goal->entitynum) { + trap_EA_Use(bs->client); + return; + } + } + } + else if (gametype == GT_HARVESTER) { + // + if (BotHarvesterCarryingCubes(bs)) + return; + //never use kamikaze if a team mate carrying cubes is visible + c = BotTeamCubeCarrierVisible(bs); + if (c >= 0) { + BotEntityInfo(c, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST)) + return; + } + c = BotEnemyCubeCarrierVisible(bs); + if (c >= 0) { + BotEntityInfo(c, &entinfo); + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) < Square(KAMIKAZE_DIST)) { + trap_EA_Use(bs->client); + return; + } + } + } + // + BotVisibleTeamMatesAndEnemies(bs, &teammates, &enemies, KAMIKAZE_DIST); + // + if (enemies > 2 && enemies > teammates+1) { + trap_EA_Use(bs->client); + return; + } +} + +/* +================== +BotUseInvulnerability +================== +*/ +void BotUseInvulnerability(bot_state_t *bs) { + int c; + vec3_t dir, target; + bot_goal_t *goal; + bsp_trace_t trace; + + //if the bot has no invulnerability + if (bs->inventory[INVENTORY_INVULNERABILITY] <= 0) + return; + if (bs->invulnerability_time > FloatTime()) + return; + bs->invulnerability_time = FloatTime() + 0.2; + if (gametype == GT_CTF) { + //never use kamikaze if the team flag carrier is visible + if (BotCTFCarryingFlag(bs)) + return; + c = BotEnemyFlagCarrierVisible(bs); + if (c >= 0) + return; + //if near enemy flag and the flag is visible + switch(BotTeam(bs)) { + case TEAM_RED: goal = &ctf_blueflag; break; + default: goal = &ctf_redflag; break; + } + //if the obelisk is visible + VectorCopy(goal->origin, target); + target[2] += 1; + VectorSubtract(bs->origin, target, dir); + if (VectorLengthSquared(dir) < Square(200)) { + BotAI_Trace(&trace, bs->eye, NULL, NULL, target, bs->client, CONTENTS_SOLID); + if (trace.fraction >= 1 || trace.ent == goal->entitynum) { + trap_EA_Use(bs->client); + return; + } + } + } + else if (gametype == GT_1FCTF) { + //never use kamikaze if the team flag carrier is visible + if (Bot1FCTFCarryingFlag(bs)) + return; + c = BotEnemyFlagCarrierVisible(bs); + if (c >= 0) + return; + //if near enemy flag and the flag is visible + switch(BotTeam(bs)) { + case TEAM_RED: goal = &ctf_blueflag; break; + default: goal = &ctf_redflag; break; + } + //if the obelisk is visible + VectorCopy(goal->origin, target); + target[2] += 1; + VectorSubtract(bs->origin, target, dir); + if (VectorLengthSquared(dir) < Square(200)) { + BotAI_Trace(&trace, bs->eye, NULL, NULL, target, bs->client, CONTENTS_SOLID); + if (trace.fraction >= 1 || trace.ent == goal->entitynum) { + trap_EA_Use(bs->client); + return; + } + } + } + else if (gametype == GT_OBELISK) { + switch(BotTeam(bs)) { + case TEAM_RED: goal = &blueobelisk; break; + default: goal = &redobelisk; break; + } + //if the obelisk is visible + VectorCopy(goal->origin, target); + target[2] += 1; + VectorSubtract(bs->origin, target, dir); + if (VectorLengthSquared(dir) < Square(300)) { + BotAI_Trace(&trace, bs->eye, NULL, NULL, target, bs->client, CONTENTS_SOLID); + if (trace.fraction >= 1 || trace.ent == goal->entitynum) { + trap_EA_Use(bs->client); + return; + } + } + } + else if (gametype == GT_HARVESTER) { + // + if (BotHarvesterCarryingCubes(bs)) + return; + c = BotEnemyCubeCarrierVisible(bs); + if (c >= 0) + return; + //if near enemy base and enemy base is visible + switch(BotTeam(bs)) { + case TEAM_RED: goal = &blueobelisk; break; + default: goal = &redobelisk; break; + } + //if the obelisk is visible + VectorCopy(goal->origin, target); + target[2] += 1; + VectorSubtract(bs->origin, target, dir); + if (VectorLengthSquared(dir) < Square(200)) { + BotAI_Trace(&trace, bs->eye, NULL, NULL, target, bs->client, CONTENTS_SOLID); + if (trace.fraction >= 1 || trace.ent == goal->entitynum) { + trap_EA_Use(bs->client); + return; + } + } + } +} +#endif + +/* +================== +BotBattleUseItems +================== +*/ +void BotBattleUseItems(bot_state_t *bs) { + //PKMOD - Ergodic 11/01/01 - add radiate holdable logic + if ( ( bs->inventory[INVENTORY_HEALTH] + bs->inventory[INVENTORY_ARMOR] ) > 75) { + if (bs->inventory[INVENTORY_RADIATE] > 0) { + //PKMOD - Ergodic 03/17/04 - set the active holdable item for the BOT + g_entities[bs->entitynum].client->ps.stats[STAT_ACTIVE_HOLDABLE] = HI_RADIATE; + trap_EA_Use(bs->client); + } + } + + //PKMOD - Ergodic 11/23/01 - add personal sentry holdable logic + if (bs->inventory[INVENTORY_PERSENTRY] > 0) { + //PKMOD - Ergodic 03/17/04 - set the active holdable item for the BOT + g_entities[bs->entitynum].client->ps.stats[STAT_ACTIVE_HOLDABLE] = HI_PERSENTRY; + trap_EA_Use(bs->client); + } + + //PKMOD - Ergodic 02/12/02 - add private bot holdable logic (must have all the parts) + if ( ( bs->inventory[INVENTORY_PRIBOTLEGS] + bs->inventory[INVENTORY_PRIBOTTORSO] + bs->inventory[INVENTORY_PRIBOTHEAD] ) == 3 ) { + //PKMOD - Ergodic 03/17/04 - set the active holdable item for the BOT + g_entities[bs->entitynum].client->ps.stats[STAT_ACTIVE_HOLDABLE] = HI_BOTHEAD; + trap_EA_Use(bs->client); + } + + if (bs->inventory[INVENTORY_HEALTH] < 40) { + if (bs->inventory[INVENTORY_TELEPORTER] > 0) { + if (!BotCTFCarryingFlag(bs) +#ifdef MISSIONPACK + && !Bot1FCTFCarryingFlag(bs) + && !BotHarvesterCarryingCubes(bs) +#endif + ) { + //PKMOD - Ergodic 03/17/04 - set the active holdable item for the BOT + g_entities[bs->entitynum].client->ps.stats[STAT_ACTIVE_HOLDABLE] = HI_TELEPORTER; + trap_EA_Use(bs->client); + } + } + } + if (bs->inventory[INVENTORY_HEALTH] < 60) { + if (bs->inventory[INVENTORY_MEDKIT] > 0) { + //PKMOD - Ergodic 03/17/04 - set the active holdable item for the BOT + g_entities[bs->entitynum].client->ps.stats[STAT_ACTIVE_HOLDABLE] = HI_MEDKIT; + trap_EA_Use(bs->client); + } + } +#ifdef MISSIONPACK + BotUseKamikaze(bs); + BotUseInvulnerability(bs); +#endif +} + +/* +================== +BotSetTeleportTime +================== +*/ +void BotSetTeleportTime(bot_state_t *bs) { + if ((bs->cur_ps.eFlags ^ bs->last_eFlags) & EF_TELEPORT_BIT) { + bs->teleport_time = FloatTime(); + } + bs->last_eFlags = bs->cur_ps.eFlags; +} + +/* +================== +BotIsDead +================== +*/ +qboolean BotIsDead(bot_state_t *bs) { + return (bs->cur_ps.pm_type == PM_DEAD); +} + +/* +================== +BotIsObserver +================== +*/ +qboolean BotIsObserver(bot_state_t *bs) { + char buf[MAX_INFO_STRING]; + if (bs->cur_ps.pm_type == PM_SPECTATOR) return qtrue; + trap_GetConfigstring(CS_PLAYERS+bs->client, buf, sizeof(buf)); + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) return qtrue; + return qfalse; +} + +/* +================== +BotIntermission +================== +*/ +qboolean BotIntermission(bot_state_t *bs) { + //NOTE: we shouldn't be looking at the game code... + if (level.intermissiontime) return qtrue; + return (bs->cur_ps.pm_type == PM_FREEZE || bs->cur_ps.pm_type == PM_INTERMISSION); +} + +/* +================== +BotInLavaOrSlime +================== +*/ +qboolean BotInLavaOrSlime(bot_state_t *bs) { + vec3_t feet; + + VectorCopy(bs->origin, feet); + feet[2] -= 23; + return (trap_AAS_PointContents(feet) & (CONTENTS_LAVA|CONTENTS_SLIME)); +} + +/* +================== +BotCreateWayPoint +================== +*/ +bot_waypoint_t *BotCreateWayPoint(char *name, vec3_t origin, int areanum) { + bot_waypoint_t *wp; + vec3_t waypointmins = {-8, -8, -8}, waypointmaxs = {8, 8, 8}; + + wp = botai_freewaypoints; + if ( !wp ) { + BotAI_Print( PRT_WARNING, "BotCreateWayPoint: Out of waypoints\n" ); + return NULL; + } + botai_freewaypoints = botai_freewaypoints->next; + + Q_strncpyz( wp->name, name, sizeof(wp->name) ); + VectorCopy(origin, wp->goal.origin); + VectorCopy(waypointmins, wp->goal.mins); + VectorCopy(waypointmaxs, wp->goal.maxs); + wp->goal.areanum = areanum; + wp->next = NULL; + wp->prev = NULL; + return wp; +} + +/* +================== +BotFindWayPoint +================== +*/ +bot_waypoint_t *BotFindWayPoint(bot_waypoint_t *waypoints, char *name) { + bot_waypoint_t *wp; + + for (wp = waypoints; wp; wp = wp->next) { + if (!Q_stricmp(wp->name, name)) return wp; + } + return NULL; +} + +/* +================== +BotFreeWaypoints +================== +*/ +void BotFreeWaypoints(bot_waypoint_t *wp) { + bot_waypoint_t *nextwp; + + for (; wp; wp = nextwp) { + nextwp = wp->next; + wp->next = botai_freewaypoints; + botai_freewaypoints = wp; + } +} + +/* +================== +BotInitWaypoints +================== +*/ +void BotInitWaypoints(void) { + int i; + + botai_freewaypoints = NULL; + for (i = 0; i < MAX_WAYPOINTS; i++) { + botai_waypoints[i].next = botai_freewaypoints; + botai_freewaypoints = &botai_waypoints[i]; + } +} + +/* +================== +TeamPlayIsOn +================== +*/ +int TeamPlayIsOn(void) { + return ( gametype >= GT_TEAM ); +} + +/* +================== +BotAggression +================== +*/ +float BotAggression(bot_state_t *bs) { + //if the bot has quad + if (bs->inventory[INVENTORY_QUAD]) { + //if the bot is not holding the gauntlet or the enemy is really nearby + if (bs->weaponnum != WP_GAUNTLET || + bs->inventory[ENEMY_HORIZONTAL_DIST] < 80) { + return 70; + } + } + //if the enemy is located way higher than the bot + if (bs->inventory[ENEMY_HEIGHT] > 200) return 0; + //if the bot is very low on health + if (bs->inventory[INVENTORY_HEALTH] < 60) return 0; + //if the bot is low on health + if (bs->inventory[INVENTORY_HEALTH] < 80) { + //if the bot has insufficient armor + if (bs->inventory[INVENTORY_ARMOR] < 40) return 0; + } + //PKMOD - Ergodic 09/07/00 remove the usage of the BFG + //if the bot can use the bfg +// if (bs->inventory[INVENTORY_BFG10K] > 0 && +// bs->inventory[INVENTORY_BFGAMMO] > 7) return 100; + + //PKMOD - Ergodic 09/07/00 switch the priorities of the rail and lightninggun + //if the bot can use the lightning gun + if (bs->inventory[INVENTORY_LIGHTNING] > 0 && + bs->inventory[INVENTORY_LIGHTNINGAMMO] > 50) return 95; + //if the bot can use the railgun + if (bs->inventory[INVENTORY_RAILGUN] > 0 && + bs->inventory[INVENTORY_SLUGS] > 5) return 90; + //if the bot can use the rocketlauncher + if (bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && + bs->inventory[INVENTORY_ROCKETS] > 5) return 90; + //PKMOD - Ergodic 09/07/00 bot is aggressive if it has the airfist + //if the bot can use the airfist + if (bs->inventory[INVENTORY_AIRFIST] > 0) return 85; + + //PKMOD - Ergodic 09/07/00 remove the usage of the plasmagun + //if the bot can use the plasmagun +// if (bs->inventory[INVENTORY_PLASMAGUN] > 0 && +// bs->inventory[INVENTORY_CELLS] > 40) return 85; + + //PKMOD - Ergodic 09/07/00 bot is aggressive if it has the nailgun + //if the bot can use the nailgun + //PKMOD - Ergodic - 12/17/00 rename NAILGUN to PKA_NAILGUN to resolve 1.27g conflict + if (bs->inventory[INVENTORY_PKA_NAILGUN] > 0 && + //PKMOD - Ergodic - 12/17/00 rename NAIL to PKA_NAILS to resolve 1.27g conflict + bs->inventory[INVENTORY_PKA_NAILS] > 20) return 75; + + //if the bot can use the grenade launcher + if (bs->inventory[INVENTORY_GRENADELAUNCHER] > 0 && + bs->inventory[INVENTORY_GRENADES] > 10) return 70; + + //PKMOD - Ergodic 09/07/00 bot is aggressive if it has the explosive shells shotgun + //if the bot can use the explosive shells shotgun + if (bs->inventory[INVENTORY_SHOTGUN] > 0 && + bs->inventory[INVENTORY_EXPLOSIVESHELLS] > 4) return 50; + + //if the bot can use the shotgun + if (bs->inventory[INVENTORY_SHOTGUN] > 0 && + bs->inventory[INVENTORY_SHELLS] > 10) return 40; + + //PKMOD - Ergodic 09/07/00 bot is aggressive if it has a gravity well + //if the bot can use the gravity well + if (bs->inventory[INVENTORY_GRAVITY] > 0) return 30; + + //PKMOD - Ergodic 09/07/00 bot is aggressive if it has more than one autosentries + //if the bot can use the autosentry + if (bs->inventory[INVENTORY_SENTRY] > 0 && + bs->inventory[INVENTORY_SENTRY_AMMO] > 1) return 20; + + //PKMOD - Ergodic 09/07/00 bot is aggressive if it has is closeby and has beartraps (grin) + if (bs->inventory[INVENTORY_TRAP] > 0 && + ( bs->inventory[INVENTORY_TRAP_AMMO] > 0 ) && + ( bs->inventory[ENEMY_HORIZONTAL_DIST] < 200 ) ) return 25; + + //otherwise the bot is not feeling too good + return 0; +} + +/* +================== +BotFeelingBad +================== +*/ +float BotFeelingBad(bot_state_t *bs) { + if (bs->weaponnum == WP_GAUNTLET) { + return 100; + } + if (bs->inventory[INVENTORY_HEALTH] < 40) { + return 100; + } + if (bs->weaponnum == WP_MACHINEGUN) { + return 90; + } + if (bs->inventory[INVENTORY_HEALTH] < 60) { + return 80; + } + return 0; +} + +/* +================== +BotWantsToRetreat +================== +*/ +int BotWantsToRetreat(bot_state_t *bs) { + aas_entityinfo_t entinfo; + + if (gametype == GT_CTF) { + //always retreat when carrying a CTF flag + if (BotCTFCarryingFlag(bs)) + return qtrue; + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + //if carrying the flag then always retreat + if (Bot1FCTFCarryingFlag(bs)) + return qtrue; + } + else if (gametype == GT_OBELISK) { + //the bots should be dedicated to attacking the enemy obelisk + if (bs->ltgtype == LTG_ATTACKENEMYBASE) { + if (bs->enemy != redobelisk.entitynum || + bs->enemy != blueobelisk.entitynum) { + return qtrue; + } + } + if (BotFeelingBad(bs) > 50) { + return qtrue; + } + return qfalse; + } + else if (gametype == GT_HARVESTER) { + //if carrying cubes then always retreat + if (BotHarvesterCarryingCubes(bs)) return qtrue; + } +#endif + // + if (bs->enemy >= 0) { + //if the enemy is carrying a flag + BotEntityInfo(bs->enemy, &entinfo); + if (EntityCarriesFlag(&entinfo)) + return qfalse; + } + //if the bot is getting the flag + if (bs->ltgtype == LTG_GETFLAG) + return qtrue; + // + if (BotAggression(bs) < 50) + return qtrue; + return qfalse; +} + +/* +================== +BotWantsToChase +================== +*/ +int BotWantsToChase(bot_state_t *bs) { + aas_entityinfo_t entinfo; + + if (gametype == GT_CTF) { + //never chase when carrying a CTF flag + if (BotCTFCarryingFlag(bs)) + return qfalse; + //always chase if the enemy is carrying a flag + BotEntityInfo(bs->enemy, &entinfo); + if (EntityCarriesFlag(&entinfo)) + return qtrue; + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + //never chase if carrying the flag + if (Bot1FCTFCarryingFlag(bs)) + return qfalse; + //always chase if the enemy is carrying a flag + BotEntityInfo(bs->enemy, &entinfo); + if (EntityCarriesFlag(&entinfo)) + return qtrue; + } + else if (gametype == GT_OBELISK) { + //the bots should be dedicated to attacking the enemy obelisk + if (bs->ltgtype == LTG_ATTACKENEMYBASE) { + if (bs->enemy != redobelisk.entitynum || + bs->enemy != blueobelisk.entitynum) { + return qfalse; + } + } + } + else if (gametype == GT_HARVESTER) { + //never chase if carrying cubes + if (BotHarvesterCarryingCubes(bs)) + return qfalse; + } +#endif + //if the bot is getting the flag + if (bs->ltgtype == LTG_GETFLAG) + return qfalse; + // + if (BotAggression(bs) > 50) + return qtrue; + return qfalse; +} + +/* +================== +BotWantsToHelp +================== +*/ +int BotWantsToHelp(bot_state_t *bs) { + return qtrue; +} + +/* +================== +BotCanAndWantsToRocketJump +================== +*/ +int BotCanAndWantsToRocketJump(bot_state_t *bs) { + float rocketjumper; + + //if rocket jumping is disabled + if (!bot_rocketjump.integer) return qfalse; + //if no rocket launcher + if (bs->inventory[INVENTORY_ROCKETLAUNCHER] <= 0) return qfalse; + //if low on rockets + if (bs->inventory[INVENTORY_ROCKETS] < 3) return qfalse; + //never rocket jump with the Quad + if (bs->inventory[INVENTORY_QUAD]) return qfalse; + //if low on health + if (bs->inventory[INVENTORY_HEALTH] < 60) return qfalse; + //if not full health + if (bs->inventory[INVENTORY_HEALTH] < 90) { + //if the bot has insufficient armor + if (bs->inventory[INVENTORY_ARMOR] < 40) return qfalse; + } + rocketjumper = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_WEAPONJUMPING, 0, 1); + if (rocketjumper < 0.5) return qfalse; + return qtrue; +} + +/* +================== +BotHasPersistantPowerupAndWeapon +================== +*/ +int BotHasPersistantPowerupAndWeapon(bot_state_t *bs) { +#ifdef MISSIONPACK + // if the bot does not have a persistant powerup + if (!bs->inventory[INVENTORY_SCOUT] && + !bs->inventory[INVENTORY_GUARD] && + !bs->inventory[INVENTORY_DOUBLER] && + !bs->inventory[INVENTORY_AMMOREGEN] ) { + return qfalse; + } +#endif + //if the bot is very low on health + if (bs->inventory[INVENTORY_HEALTH] < 60) return qfalse; + //if the bot is low on health + if (bs->inventory[INVENTORY_HEALTH] < 80) { + //if the bot has insufficient armor + if (bs->inventory[INVENTORY_ARMOR] < 40) return qfalse; + } + //PKMOD - Ergodic 12/18/00 - remove from PKA Inventory + //if the bot can use the bfg +// if (bs->inventory[INVENTORY_BFG10K] > 0 && +// bs->inventory[INVENTORY_BFGAMMO] > 7) return qtrue; + //if the bot can use the railgun + if (bs->inventory[INVENTORY_RAILGUN] > 0 && + bs->inventory[INVENTORY_SLUGS] > 5) return qtrue; + //if the bot can use the lightning gun + if (bs->inventory[INVENTORY_LIGHTNING] > 0 && + bs->inventory[INVENTORY_LIGHTNINGAMMO] > 50) return qtrue; + //if the bot can use the rocketlauncher + if (bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && + bs->inventory[INVENTORY_ROCKETS] > 5) return qtrue; + // + //PKMOD - Ergodic 12/18/00 - remove from PKA Inventory +// if (bs->inventory[INVENTORY_NAILGUN] > 0 && +// bs->inventory[INVENTORY_NAILS] > 5) return qtrue; + // + //PKMOD - Ergodic 12/18/00 - remove from PKA Inventory +// if (bs->inventory[INVENTORY_PROXLAUNCHER] > 0 && +// bs->inventory[INVENTORY_MINES] > 5) return qtrue; + // + //PKMOD - Ergodic 12/18/00 - remove from PKA Inventory +// if (bs->inventory[INVENTORY_CHAINGUN] > 0 && +// bs->inventory[INVENTORY_BELT] > 40) return qtrue; + // + if (bs->inventory[INVENTORY_CHAINGUN] > 0 && + bs->inventory[INVENTORY_BELT] > 40) return qtrue; + //if the bot can use the plasmagun + if (bs->inventory[INVENTORY_PLASMAGUN] > 0 && + bs->inventory[INVENTORY_CELLS] > 20) return qtrue; + return qfalse; +} + +/* +================== +BotGoCamp +================== +*/ +void BotGoCamp(bot_state_t *bs, bot_goal_t *goal) { + float camper; + + bs->decisionmaker = bs->client; + //set message time to zero so bot will NOT show any message + bs->teammessage_time = 0; + //set the ltg type + bs->ltgtype = LTG_CAMP; + //set the team goal + memcpy(&bs->teamgoal, goal, sizeof(bot_goal_t)); + //get the team goal time + camper = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CAMPER, 0, 1); + if (camper > 0.99) bs->teamgoal_time = FloatTime() + 99999; + else bs->teamgoal_time = FloatTime() + 120 + 180 * camper + random() * 15; + //set the last time the bot started camping + bs->camp_time = FloatTime(); + //the teammate that requested the camping + bs->teammate = 0; + //do NOT type arrive message + bs->arrive_time = 1; +} + +/* +================== +BotWantsToCamp +================== +*/ +int BotWantsToCamp(bot_state_t *bs) { + float camper; + int cs, traveltime, besttraveltime; + bot_goal_t goal, bestgoal; + + camper = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CAMPER, 0, 1); + if (camper < 0.1) return qfalse; + //if the bot has a team goal + if (bs->ltgtype == LTG_TEAMHELP || + bs->ltgtype == LTG_TEAMACCOMPANY || + bs->ltgtype == LTG_DEFENDKEYAREA || + bs->ltgtype == LTG_GETFLAG || + bs->ltgtype == LTG_RUSHBASE || + bs->ltgtype == LTG_CAMP || + bs->ltgtype == LTG_CAMPORDER || + bs->ltgtype == LTG_PATROL) { + return qfalse; + } + //if camped recently + if (bs->camp_time > FloatTime() - 60 + 300 * (1-camper)) return qfalse; + // + if (random() > camper) { + bs->camp_time = FloatTime(); + return qfalse; + } + //if the bot isn't healthy anough + if (BotAggression(bs) < 50) return qfalse; + //the bot should have at least have the rocket launcher, the railgun or the bfg10k with some ammo + if ((bs->inventory[INVENTORY_ROCKETLAUNCHER] <= 0 || bs->inventory[INVENTORY_ROCKETS < 10]) && + (bs->inventory[INVENTORY_RAILGUN] <= 0 || bs->inventory[INVENTORY_SLUGS] < 10) && + (bs->inventory[INVENTORY_BFG10K] <= 0 || bs->inventory[INVENTORY_BFGAMMO] < 10)) { + return qfalse; + } + //find the closest camp spot + besttraveltime = 99999; + for (cs = trap_BotGetNextCampSpotGoal(0, &goal); cs; cs = trap_BotGetNextCampSpotGoal(cs, &goal)) { + traveltime = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, goal.areanum, TFL_DEFAULT); + if (traveltime && traveltime < besttraveltime) { + besttraveltime = traveltime; + memcpy(&bestgoal, &goal, sizeof(bot_goal_t)); + } + } + if (besttraveltime > 150) return qfalse; + //ok found a camp spot, go camp there + BotGoCamp(bs, &bestgoal); + bs->ordered = qfalse; + // + return qtrue; +} + +/* +================== +BotDontAvoid +================== +*/ +void BotDontAvoid(bot_state_t *bs, char *itemname) { + bot_goal_t goal; + int num; + + num = trap_BotGetLevelItemGoal(-1, itemname, &goal); + while(num >= 0) { + trap_BotRemoveFromAvoidGoals(bs->gs, goal.number); + num = trap_BotGetLevelItemGoal(num, itemname, &goal); + } +} + +/* +================== +BotGoForPowerups +================== +*/ +void BotGoForPowerups(bot_state_t *bs) { + + //don't avoid any of the powerups anymore + BotDontAvoid(bs, "Quad Damage"); + BotDontAvoid(bs, "Regeneration"); + BotDontAvoid(bs, "Battle Suit"); + BotDontAvoid(bs, "Speed"); + BotDontAvoid(bs, "Invisibility"); + //BotDontAvoid(bs, "Flight"); + //reset the long term goal time so the bot will go for the powerup + //NOTE: the long term goal type doesn't change + bs->ltg_time = 0; +} + +/* +================== +BotRoamGoal +================== +*/ +void BotRoamGoal(bot_state_t *bs, vec3_t goal) { + int pc, i; + float len, rnd; + vec3_t dir, bestorg, belowbestorg; + bsp_trace_t trace; + + for (i = 0; i < 10; i++) { + //start at the bot origin + VectorCopy(bs->origin, bestorg); + rnd = random(); + if (rnd > 0.25) { + //add a random value to the x-coordinate + if (random() < 0.5) bestorg[0] -= 800 * random() + 100; + else bestorg[0] += 800 * random() + 100; + } + if (rnd < 0.75) { + //add a random value to the y-coordinate + if (random() < 0.5) bestorg[1] -= 800 * random() + 100; + else bestorg[1] += 800 * random() + 100; + } + //add a random value to the z-coordinate (NOTE: 48 = maxjump?) + bestorg[2] += 2 * 48 * crandom(); + //trace a line from the origin to the roam target + BotAI_Trace(&trace, bs->origin, NULL, NULL, bestorg, bs->entitynum, MASK_SOLID); + //direction and length towards the roam target + VectorSubtract(trace.endpos, bs->origin, dir); + len = VectorNormalize(dir); + //if the roam target is far away anough + if (len > 200) { + //the roam target is in the given direction before walls + VectorScale(dir, len * trace.fraction - 40, dir); + VectorAdd(bs->origin, dir, bestorg); + //get the coordinates of the floor below the roam target + belowbestorg[0] = bestorg[0]; + belowbestorg[1] = bestorg[1]; + belowbestorg[2] = bestorg[2] - 800; + BotAI_Trace(&trace, bestorg, NULL, NULL, belowbestorg, bs->entitynum, MASK_SOLID); + // + if (!trace.startsolid) { + trace.endpos[2]++; + pc = trap_PointContents(trace.endpos, bs->entitynum); + if (!(pc & (CONTENTS_LAVA | CONTENTS_SLIME))) { + VectorCopy(bestorg, goal); + return; + } + } + } + } + VectorCopy(bestorg, goal); +} + +/* +================== +BotAttackMove +================== +*/ +bot_moveresult_t BotAttackMove(bot_state_t *bs, int tfl) { + int movetype, i, attackentity; + float attack_skill, jumper, croucher, dist, strafechange_time; + float attack_dist, attack_range; + vec3_t forward, backward, sideward, hordir, up = {0, 0, 1}; + aas_entityinfo_t entinfo; + bot_moveresult_t moveresult; + bot_goal_t goal; + + attackentity = bs->enemy; + // + if (bs->attackchase_time > FloatTime()) { + //create the chase goal + goal.entitynum = attackentity; + goal.areanum = bs->lastenemyareanum; + VectorCopy(bs->lastenemyorigin, goal.origin); + VectorSet(goal.mins, -8, -8, -8); + VectorSet(goal.maxs, 8, 8, 8); + //initialize the movement state + BotSetupForMovement(bs); + //move towards the goal + trap_BotMoveToGoal(&moveresult, bs->ms, &goal, tfl); + return moveresult; + } + // + memset(&moveresult, 0, sizeof(bot_moveresult_t)); + // + attack_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_ATTACK_SKILL, 0, 1); + jumper = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_JUMPER, 0, 1); + croucher = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CROUCHER, 0, 1); + //if the bot is really stupid + if (attack_skill < 0.2) return moveresult; + //initialize the movement state + BotSetupForMovement(bs); + //get the enemy entity info + BotEntityInfo(attackentity, &entinfo); + //direction towards the enemy + VectorSubtract(entinfo.origin, bs->origin, forward); + //the distance towards the enemy + dist = VectorNormalize(forward); + VectorNegate(forward, backward); + //walk, crouch or jump + movetype = MOVE_WALK; + // + if (bs->attackcrouch_time < FloatTime() - 1) { + if (random() < jumper) { + movetype = MOVE_JUMP; + } + //wait at least one second before crouching again + else if (bs->attackcrouch_time < FloatTime() - 1 && random() < croucher) { + bs->attackcrouch_time = FloatTime() + croucher * 5; + } + } + if (bs->attackcrouch_time > FloatTime()) movetype = MOVE_CROUCH; + //if the bot should jump + if (movetype == MOVE_JUMP) { + //if jumped last frame + if (bs->attackjump_time > FloatTime()) { + movetype = MOVE_WALK; + } + else { + bs->attackjump_time = FloatTime() + 1; + } + } + if (bs->cur_ps.weapon == WP_GAUNTLET) { + attack_dist = 0; + attack_range = 0; + } + else { + attack_dist = IDEAL_ATTACKDIST; + attack_range = 40; + } + //if the bot is stupid + if (attack_skill <= 0.4) { + //just walk to or away from the enemy + if (dist > attack_dist + attack_range) { + if (trap_BotMoveInDirection(bs->ms, forward, 400, movetype)) return moveresult; + } + if (dist < attack_dist - attack_range) { + if (trap_BotMoveInDirection(bs->ms, backward, 400, movetype)) return moveresult; + } + return moveresult; + } + //increase the strafe time + bs->attackstrafe_time += bs->thinktime; + //get the strafe change time + strafechange_time = 0.4 + (1 - attack_skill) * 0.2; + if (attack_skill > 0.7) strafechange_time += crandom() * 0.2; + //if the strafe direction should be changed + if (bs->attackstrafe_time > strafechange_time) { + //some magic number :) + if (random() > 0.935) { + //flip the strafe direction + bs->flags ^= BFL_STRAFERIGHT; + bs->attackstrafe_time = 0; + } + } + // + for (i = 0; i < 2; i++) { + hordir[0] = forward[0]; + hordir[1] = forward[1]; + hordir[2] = 0; + VectorNormalize(hordir); + //get the sideward vector + CrossProduct(hordir, up, sideward); + //reverse the vector depending on the strafe direction + if (bs->flags & BFL_STRAFERIGHT) VectorNegate(sideward, sideward); + //randomly go back a little + if (random() > 0.9) { + VectorAdd(sideward, backward, sideward); + } + else { + //walk forward or backward to get at the ideal attack distance + if (dist > attack_dist + attack_range) { + VectorAdd(sideward, forward, sideward); + } + else if (dist < attack_dist - attack_range) { + VectorAdd(sideward, backward, sideward); + } + } + //perform the movement + if (trap_BotMoveInDirection(bs->ms, sideward, 400, movetype)) + return moveresult; + //movement failed, flip the strafe direction + bs->flags ^= BFL_STRAFERIGHT; + bs->attackstrafe_time = 0; + } + //bot couldn't do any usefull movement +// bs->attackchase_time = AAS_Time() + 6; + return moveresult; +} + +/* +================== +BotSameTeam +================== +*/ +int BotSameTeam(bot_state_t *bs, int entnum) { + char info1[1024], info2[1024]; + + if (bs->client < 0 || bs->client >= MAX_CLIENTS) { + //BotAI_Print(PRT_ERROR, "BotSameTeam: client out of range\n"); + return qfalse; + } + if (entnum < 0 || entnum >= MAX_CLIENTS) { + //BotAI_Print(PRT_ERROR, "BotSameTeam: client out of range\n"); + return qfalse; + } + //PKMOD - Ergodic 01/07/02 - Check if Private Bot's owner (don't target PB's owner) + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + if ( g_entities[bs->entitynum].parent->client->ps.clientNum == entnum ) { + //PKMOD - Ergodic 01/07/02 - Private Bot's team owner (inactive) +// Com_Printf("BotSameTeam - Team member detected, entnum>%d<\n", entnum ); + return qtrue; + } + } + + //PKMOD - Ergodic 03/18/02 - Check if Private Bot's brother (don't target PB's owned by same parent) + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + if ( g_entities[entnum].r.svFlags & SVF_PRIVATEBOT ) { + if ( g_entities[bs->entitynum].parent->client->ps.clientNum == g_entities[entnum].parent->client->ps.clientNum ) { + //PKMOD - Ergodic 01/07/02 - Private Bot's team owner (inactive) +// Com_Printf("BotSameTeam - Team member detected, entnum>%d<\n", entnum ); + return qtrue; + } + } + } + + + if ( gametype >= GT_TEAM ) { + trap_GetConfigstring(CS_PLAYERS+bs->client, info1, sizeof(info1)); + trap_GetConfigstring(CS_PLAYERS+entnum, info2, sizeof(info2)); + // + if (atoi(Info_ValueForKey(info1, "t")) == atoi(Info_ValueForKey(info2, "t"))) return qtrue; + } + return qfalse; +} + +/* +================== +InFieldOfVision +================== +*/ +qboolean InFieldOfVision(vec3_t viewangles, float fov, vec3_t angles) +{ + int i; + float diff, angle; + + for (i = 0; i < 2; i++) { + angle = AngleMod(viewangles[i]); + angles[i] = AngleMod(angles[i]); + diff = angles[i] - angle; + if (angles[i] > angle) { + if (diff > 180.0) diff -= 360.0; + } + else { + if (diff < -180.0) diff += 360.0; + } + if (diff > 0) { + if (diff > fov * 0.5) return qfalse; + } + else { + if (diff < -fov * 0.5) return qfalse; + } + } + return qtrue; +} + +/* +================== +BotEntityVisible + +returns visibility in the range [0, 1] taking fog and water surfaces into account +================== +*/ +float BotEntityVisible(int viewer, vec3_t eye, vec3_t viewangles, float fov, int ent) { + int i, contents_mask, passent, hitent, infog, inwater, otherinfog, pc; + float squaredfogdist, waterfactor, vis, bestvis; + bsp_trace_t trace; + aas_entityinfo_t entinfo; + vec3_t dir, entangles, start, end, middle; + + //calculate middle of bounding box + BotEntityInfo(ent, &entinfo); + VectorAdd(entinfo.mins, entinfo.maxs, middle); + VectorScale(middle, 0.5, middle); + VectorAdd(entinfo.origin, middle, middle); + //check if entity is within field of vision + VectorSubtract(middle, eye, dir); + vectoangles(dir, entangles); + if (!InFieldOfVision(viewangles, fov, entangles)) return 0; + // + pc = trap_AAS_PointContents(eye); + infog = (pc & CONTENTS_FOG); + inwater = (pc & (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER)); + // + bestvis = 0; + for (i = 0; i < 3; i++) { + //if the point is not in potential visible sight + //if (!AAS_inPVS(eye, middle)) continue; + // + contents_mask = CONTENTS_SOLID|CONTENTS_PLAYERCLIP; + passent = viewer; + hitent = ent; + VectorCopy(eye, start); + VectorCopy(middle, end); + //if the entity is in water, lava or slime + if (trap_AAS_PointContents(middle) & (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER)) { + contents_mask |= (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER); + } + //if eye is in water, lava or slime + if (inwater) { + if (!(contents_mask & (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER))) { + passent = ent; + hitent = viewer; + VectorCopy(middle, start); + VectorCopy(eye, end); + } + contents_mask ^= (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER); + } + //trace from start to end + BotAI_Trace(&trace, start, NULL, NULL, end, passent, contents_mask); + //if water was hit + waterfactor = 1.0; + if (trace.contents & (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER)) { + //if the water surface is translucent + if (1) { + //trace through the water + contents_mask &= ~(CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER); + BotAI_Trace(&trace, trace.endpos, NULL, NULL, end, passent, contents_mask); + waterfactor = 0.5; + } + } + //if a full trace or the hitent was hit + if (trace.fraction >= 1 || trace.ent == hitent) { + //check for fog, assuming there's only one fog brush where + //either the viewer or the entity is in or both are in + otherinfog = (trap_AAS_PointContents(middle) & CONTENTS_FOG); + if (infog && otherinfog) { + VectorSubtract(trace.endpos, eye, dir); + squaredfogdist = VectorLengthSquared(dir); + } + else if (infog) { + VectorCopy(trace.endpos, start); + BotAI_Trace(&trace, start, NULL, NULL, eye, viewer, CONTENTS_FOG); + VectorSubtract(eye, trace.endpos, dir); + squaredfogdist = VectorLengthSquared(dir); + } + else if (otherinfog) { + VectorCopy(trace.endpos, end); + BotAI_Trace(&trace, eye, NULL, NULL, end, viewer, CONTENTS_FOG); + VectorSubtract(end, trace.endpos, dir); + squaredfogdist = VectorLengthSquared(dir); + } + else { + //if the entity and the viewer are not in fog assume there's no fog in between + squaredfogdist = 0; + } + //decrease visibility with the view distance through fog + vis = 1 / ((squaredfogdist * 0.001) < 1 ? 1 : (squaredfogdist * 0.001)); + //if entering water visibility is reduced + vis *= waterfactor; + // + if (vis > bestvis) bestvis = vis; + //if pretty much no fog + if (bestvis >= 0.95) return bestvis; + } + //check bottom and top of bounding box as well + if (i == 0) middle[2] += entinfo.mins[2]; + else if (i == 1) middle[2] += entinfo.maxs[2] - entinfo.mins[2]; + } + return bestvis; +} + +/* +================== +BotFindEnemy +================== +*/ +int BotFindEnemy(bot_state_t *bs, int curenemy) { + int i, healthdecrease; + float f, alertness, easyfragger, vis; + float squaredist, cursquaredist; + aas_entityinfo_t entinfo, curenemyinfo; + vec3_t dir, angles; + + alertness = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_ALERTNESS, 0, 1); + easyfragger = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_EASY_FRAGGER, 0, 1); + //check if the health decreased + healthdecrease = bs->lasthealth > bs->inventory[INVENTORY_HEALTH]; + //remember the current health value + bs->lasthealth = bs->inventory[INVENTORY_HEALTH]; + // + if (curenemy >= 0) { + BotEntityInfo(curenemy, &curenemyinfo); + if (EntityCarriesFlag(&curenemyinfo)) return qfalse; + VectorSubtract(curenemyinfo.origin, bs->origin, dir); + cursquaredist = VectorLengthSquared(dir); + } + else { + cursquaredist = 0; + } +#ifdef MISSIONPACK + if (gametype == GT_OBELISK) { + vec3_t target; + bot_goal_t *goal; + bsp_trace_t trace; + + if (BotTeam(bs) == TEAM_RED) + goal = &blueobelisk; + else + goal = &redobelisk; + //if the obelisk is visible + VectorCopy(goal->origin, target); + target[2] += 1; + BotAI_Trace(&trace, bs->eye, NULL, NULL, target, bs->client, CONTENTS_SOLID); + if (trace.fraction >= 1 || trace.ent == goal->entitynum) { + if (goal->entitynum == bs->enemy) { + return qfalse; + } + bs->enemy = goal->entitynum; + bs->enemysight_time = FloatTime(); + bs->enemysuicide = qfalse; + bs->enemydeath_time = 0; + bs->enemyvisible_time = FloatTime(); + return qtrue; + } + } +#endif + // + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + + if (i == bs->client) continue; + //if it's the current enemy + if (i == curenemy) continue; + // + BotEntityInfo(i, &entinfo); + // + if (!entinfo.valid) continue; + //if the enemy isn't dead and the enemy isn't the bot self + if (EntityIsDead(&entinfo) || entinfo.number == bs->entitynum) continue; + //if the enemy is invisible and not shooting + if (EntityIsInvisible(&entinfo) && !EntityIsShooting(&entinfo)) { + //PKMOD - Ergodic 10/31/02 - check if enemy has a beartrap attached + // attached beartraps will make the player visible to the bots + entityState_t state; + BotAI_GetEntityState(i, &state); + if ( ( state.time2 & 3 ) == 0 ) //if no beartraps are attached + continue; + } + //if not an easy fragger don't shoot at chatting players + if (easyfragger < 0.5 && EntityIsChatting(&entinfo)) continue; + // + if (lastteleport_time > FloatTime() - 3) { + VectorSubtract(entinfo.origin, lastteleport_origin, dir); + if (VectorLengthSquared(dir) < Square(70)) continue; + } + //calculate the distance towards the enemy + VectorSubtract(entinfo.origin, bs->origin, dir); + squaredist = VectorLengthSquared(dir); + //if this entity is not carrying a flag + if (!EntityCarriesFlag(&entinfo)) + { + //if this enemy is further away than the current one + if (curenemy >= 0 && squaredist > cursquaredist) continue; + } //end if + //if the bot has no + if (squaredist > Square(900.0 + alertness * 4000.0)) continue; + //if on the same team + if (BotSameTeam(bs, i)) continue; + //if the bot's health decreased or the enemy is shooting + if (curenemy < 0 && (healthdecrease || EntityIsShooting(&entinfo))) + f = 360; + else + f = 90 + 90 - (90 - (squaredist > Square(810) ? Square(810) : squaredist) / (810 * 9)); + //check if the enemy is visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, f, i); + if (vis <= 0) continue; + //if the enemy is quite far away, not shooting and the bot is not damaged + if (curenemy < 0 && squaredist > Square(100) && !healthdecrease && !EntityIsShooting(&entinfo)) + { + //check if we can avoid this enemy + VectorSubtract(bs->origin, entinfo.origin, dir); + vectoangles(dir, angles); + //if the bot isn't in the fov of the enemy + if (!InFieldOfVision(entinfo.angles, 90, angles)) { + //update some stuff for this enemy + BotUpdateBattleInventory(bs, i); + //if the bot doesn't really want to fight + if (BotWantsToRetreat(bs)) continue; + } + } + //found an enemy + bs->enemy = entinfo.number; + if (curenemy >= 0) bs->enemysight_time = FloatTime() - 2; + else bs->enemysight_time = FloatTime(); + bs->enemysuicide = qfalse; + bs->enemydeath_time = 0; + bs->enemyvisible_time = FloatTime(); + return qtrue; + } + return qfalse; +} + +/* +================== +BotTeamFlagCarrierVisible +================== +*/ +int BotTeamFlagCarrierVisible(bot_state_t *bs) { + int i; + float vis; + aas_entityinfo_t entinfo; + + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) + continue; + // + BotEntityInfo(i, &entinfo); + //if this player is active + if (!entinfo.valid) + continue; + //if this player is carrying a flag + if (!EntityCarriesFlag(&entinfo)) + continue; + //if the flag carrier is not on the same team + if (!BotSameTeam(bs, i)) + continue; + //if the flag carrier is not visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, i); + if (vis <= 0) + continue; + // + return i; + } + return -1; +} + +/* +================== +BotTeamFlagCarrier +================== +*/ +int BotTeamFlagCarrier(bot_state_t *bs) { + int i; + aas_entityinfo_t entinfo; + + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) + continue; + // + BotEntityInfo(i, &entinfo); + //if this player is active + if (!entinfo.valid) + continue; + //if this player is carrying a flag + if (!EntityCarriesFlag(&entinfo)) + continue; + //if the flag carrier is not on the same team + if (!BotSameTeam(bs, i)) + continue; + // + return i; + } + return -1; +} + +/* +================== +BotEnemyFlagCarrierVisible +================== +*/ +int BotEnemyFlagCarrierVisible(bot_state_t *bs) { + int i; + float vis; + aas_entityinfo_t entinfo; + + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) + continue; + // + BotEntityInfo(i, &entinfo); + //if this player is active + if (!entinfo.valid) + continue; + //if this player is carrying a flag + if (!EntityCarriesFlag(&entinfo)) + continue; + //if the flag carrier is on the same team + if (BotSameTeam(bs, i)) + continue; + //if the flag carrier is not visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, i); + if (vis <= 0) + continue; + // + return i; + } + return -1; +} + +/* +================== +BotVisibleTeamMatesAndEnemies +================== +*/ +void BotVisibleTeamMatesAndEnemies(bot_state_t *bs, int *teammates, int *enemies, float range) { + int i; + float vis; + aas_entityinfo_t entinfo; + vec3_t dir; + + if (teammates) + *teammates = 0; + if (enemies) + *enemies = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) + continue; + // + BotEntityInfo(i, &entinfo); + //if this player is active + if (!entinfo.valid) + continue; + //if this player is carrying a flag + if (!EntityCarriesFlag(&entinfo)) + continue; + //if not within range + VectorSubtract(entinfo.origin, bs->origin, dir); + if (VectorLengthSquared(dir) > Square(range)) + continue; + //if the flag carrier is not visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, i); + if (vis <= 0) + continue; + //if the flag carrier is on the same team + if (BotSameTeam(bs, i)) { + if (teammates) + (*teammates)++; + } + else { + if (enemies) + (*enemies)++; + } + } +} + +#ifdef MISSIONPACK +/* +================== +BotTeamCubeCarrierVisible +================== +*/ +int BotTeamCubeCarrierVisible(bot_state_t *bs) { + int i; + float vis; + aas_entityinfo_t entinfo; + + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) continue; + // + BotEntityInfo(i, &entinfo); + //if this player is active + if (!entinfo.valid) continue; + //if this player is carrying a flag + if (!EntityCarriesCubes(&entinfo)) continue; + //if the flag carrier is not on the same team + if (!BotSameTeam(bs, i)) continue; + //if the flag carrier is not visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, i); + if (vis <= 0) continue; + // + return i; + } + return -1; +} + +/* +================== +BotEnemyCubeCarrierVisible +================== +*/ +int BotEnemyCubeCarrierVisible(bot_state_t *bs) { + int i; + float vis; + aas_entityinfo_t entinfo; + + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + if (i == bs->client) + continue; + // + BotEntityInfo(i, &entinfo); + //if this player is active + if (!entinfo.valid) + continue; + //if this player is carrying a flag + if (!EntityCarriesCubes(&entinfo)) continue; + //if the flag carrier is on the same team + if (BotSameTeam(bs, i)) + continue; + //if the flag carrier is not visible + vis = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, i); + if (vis <= 0) + continue; + // + return i; + } + return -1; +} +#endif + +/* +================== +BotAimAtEnemy +================== +*/ +void BotAimAtEnemy(bot_state_t *bs) { + int i, enemyvisible; + float dist, f, aim_skill, aim_accuracy, speed, reactiontime; + vec3_t dir, bestorigin, end, start, groundtarget, cmdmove, enemyvelocity; + vec3_t mins = {-4,-4,-4}, maxs = {4, 4, 4}; + weaponinfo_t wi; + aas_entityinfo_t entinfo; + bot_goal_t goal; + bsp_trace_t trace; + vec3_t target; + + //if the bot has no enemy + if (bs->enemy < 0) { + return; + } + //get the enemy entity information + BotEntityInfo(bs->enemy, &entinfo); + //if this is not a player (should be an obelisk) + if (bs->enemy >= MAX_CLIENTS) { + //if the obelisk is visible + VectorCopy(entinfo.origin, target); +#ifdef MISSIONPACK + // if attacking an obelisk + if ( bs->enemy == redobelisk.entitynum || + bs->enemy == blueobelisk.entitynum ) { + target[2] += 32; + } +#endif + //aim at the obelisk + VectorSubtract(target, bs->eye, dir); + vectoangles(dir, bs->ideal_viewangles); + //set the aim target before trying to attack + VectorCopy(target, bs->aimtarget); + return; + } + // + //BotAI_Print(PRT_MESSAGE, "client %d: aiming at client %d\n", bs->entitynum, bs->enemy); + // + aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL, 0, 1); + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY, 0, 1); + // + if (aim_skill > 0.95) { + //don't aim too early + reactiontime = 0.5 * trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1); + if (bs->enemysight_time > FloatTime() - reactiontime) return; + if (bs->teleport_time > FloatTime() - reactiontime) return; + } + + //get the weapon information + trap_BotGetWeaponInfo(bs->ws, bs->weaponnum, &wi); + //get the weapon specific aim accuracy and or aim skill + if (wi.number == WP_MACHINEGUN) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN, 0, 1); + } + else if (wi.number == WP_SHOTGUN) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_SHOTGUN, 0, 1); + } + else if (wi.number == WP_GRENADE_LAUNCHER) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER, 0, 1); + aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER, 0, 1); + } + else if (wi.number == WP_ROCKET_LAUNCHER) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER, 0, 1); + aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER, 0, 1); + } + else if (wi.number == WP_LIGHTNING) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_LIGHTNING, 0, 1); + } + else if (wi.number == WP_RAILGUN) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_RAILGUN, 0, 1); + } + + //PKMOD - Ergodic - 09/07/00 Add PKA weapon specific definitions + if (wi.number == WP_AIRFIST) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_AIRFIST, 0, 1); + aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_AIRFIST, 0, 1); + } + if (wi.number == WP_NAILGUN) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_NAILGUN, 0, 1); + aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_NAILGUN, 0, 1); + } + if (wi.number == WP_BEARTRAP) { + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_BEARTRAP, 0, 1); + aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_BEARTRAP, 0, 1); + } + + //PKMOD - Ergodic - 09/07/00 Remove plasmagun definition +// if (wi.number == WP_PLASMAGUN) { +// aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN, 0, 1); +// aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_PLASMAGUN, 0, 1); +// } + //PKMOD - Ergodic - 09/07/00 Remove bfg definition +// if (wi.number == WP_BFG) { +// aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY_BFG10K, 0, 1); +// aim_skill = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_SKILL_BFG10K, 0, 1); +// } + // + if (aim_accuracy <= 0) aim_accuracy = 0.0001f; + //get the enemy entity information + BotEntityInfo(bs->enemy, &entinfo); + //if the enemy is invisible then shoot crappy most of the time + if (EntityIsInvisible(&entinfo)) { + //PKMOD - Ergodic 10/31/02 - check if enemy has a beartrap attached + // attached beartraps will make the player visible to the bots + entityState_t state; + BotAI_GetEntityState(bs->enemy, &state); + if ( ( state.time2 & 3 ) == 0 ) //if no beartraps are attached + if (random() > 0.1) aim_accuracy *= 0.4f; + } + // + VectorSubtract(entinfo.origin, entinfo.lastvisorigin, enemyvelocity); + VectorScale(enemyvelocity, 1 / entinfo.update_time, enemyvelocity); + //enemy origin and velocity is remembered every 0.5 seconds + if (bs->enemyposition_time < FloatTime()) { + // + bs->enemyposition_time = FloatTime() + 0.5; + VectorCopy(enemyvelocity, bs->enemyvelocity); + VectorCopy(entinfo.origin, bs->enemyorigin); + } + //if not extremely skilled + if (aim_skill < 0.9) { + VectorSubtract(entinfo.origin, bs->enemyorigin, dir); + //if the enemy moved a bit + if (VectorLengthSquared(dir) > Square(48)) { + //if the enemy changed direction + if (DotProduct(bs->enemyvelocity, enemyvelocity) < 0) { + //aim accuracy should be worse now + aim_accuracy *= 0.7f; + } + } + } + //check visibility of enemy + enemyvisible = BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, bs->enemy); + //if the enemy is visible + if (enemyvisible) { + // + VectorCopy(entinfo.origin, bestorigin); + bestorigin[2] += 8; + //get the start point shooting from + //NOTE: the x and y projectile start offsets are ignored + VectorCopy(bs->origin, start); + start[2] += bs->cur_ps.viewheight; + start[2] += wi.offset[2]; + // + BotAI_Trace(&trace, start, mins, maxs, bestorigin, bs->entitynum, MASK_SHOT); + //if the enemy is NOT hit + if (trace.fraction <= 1 && trace.ent != entinfo.number) { + bestorigin[2] += 16; + } + //if it is not an instant hit weapon the bot might want to predict the enemy + if (wi.speed) { + // + VectorSubtract(bestorigin, bs->origin, dir); + dist = VectorLength(dir); + VectorSubtract(entinfo.origin, bs->enemyorigin, dir); + //if the enemy is NOT pretty far away and strafing just small steps left and right + if (!(dist > 100 && VectorLengthSquared(dir) < Square(32))) { + //if skilled anough do exact prediction + if (aim_skill > 0.8 && + //if the weapon is ready to fire + bs->cur_ps.weaponstate == WEAPON_READY) { + aas_clientmove_t move; + vec3_t origin; + + VectorSubtract(entinfo.origin, bs->origin, dir); + //distance towards the enemy + dist = VectorLength(dir); + //direction the enemy is moving in + VectorSubtract(entinfo.origin, entinfo.lastvisorigin, dir); + // + VectorScale(dir, 1 / entinfo.update_time, dir); + // + VectorCopy(entinfo.origin, origin); + origin[2] += 1; + // + VectorClear(cmdmove); + //AAS_ClearShownDebugLines(); + trap_AAS_PredictClientMovement(&move, bs->enemy, origin, + PRESENCE_CROUCH, qfalse, + dir, cmdmove, 0, + dist * 10 / wi.speed, 0.1f, 0, 0, qfalse); + VectorCopy(move.endpos, bestorigin); + //BotAI_Print(PRT_MESSAGE, "%1.1f predicted speed = %f, frames = %f\n", FloatTime(), VectorLength(dir), dist * 10 / wi.speed); + } + //if not that skilled do linear prediction + else if (aim_skill > 0.4) { + VectorSubtract(entinfo.origin, bs->origin, dir); + //distance towards the enemy + dist = VectorLength(dir); + //direction the enemy is moving in + VectorSubtract(entinfo.origin, entinfo.lastvisorigin, dir); + dir[2] = 0; + // + speed = VectorNormalize(dir) / entinfo.update_time; + //botimport.Print(PRT_MESSAGE, "speed = %f, wi->speed = %f\n", speed, wi->speed); + //best spot to aim at + VectorMA(entinfo.origin, (dist / wi.speed) * speed, dir, bestorigin); + } + } + } + //if the projectile does radial damage + if (aim_skill > 0.6 && wi.proj.damagetype & DAMAGETYPE_RADIAL) { + //if the enemy isn't standing significantly higher than the bot + if (entinfo.origin[2] < bs->origin[2] + 16) { + //try to aim at the ground in front of the enemy + VectorCopy(entinfo.origin, end); + end[2] -= 64; + BotAI_Trace(&trace, entinfo.origin, NULL, NULL, end, entinfo.number, MASK_SHOT); + // + VectorCopy(bestorigin, groundtarget); + if (trace.startsolid) groundtarget[2] = entinfo.origin[2] - 16; + else groundtarget[2] = trace.endpos[2] - 8; + //trace a line from projectile start to ground target + BotAI_Trace(&trace, start, NULL, NULL, groundtarget, bs->entitynum, MASK_SHOT); + //if hitpoint is not vertically too far from the ground target + if (fabs(trace.endpos[2] - groundtarget[2]) < 50) { + VectorSubtract(trace.endpos, groundtarget, dir); + //if the hitpoint is near anough the ground target + if (VectorLengthSquared(dir) < Square(60)) { + VectorSubtract(trace.endpos, start, dir); + //if the hitpoint is far anough from the bot + if (VectorLengthSquared(dir) > Square(100)) { + //check if the bot is visible from the ground target + trace.endpos[2] += 1; + BotAI_Trace(&trace, trace.endpos, NULL, NULL, entinfo.origin, entinfo.number, MASK_SHOT); + if (trace.fraction >= 1) { + //botimport.Print(PRT_MESSAGE, "%1.1f aiming at ground\n", AAS_Time()); + VectorCopy(groundtarget, bestorigin); + } + } + } + } + } + } + bestorigin[0] += 20 * crandom() * (1 - aim_accuracy); + bestorigin[1] += 20 * crandom() * (1 - aim_accuracy); + bestorigin[2] += 10 * crandom() * (1 - aim_accuracy); + } + else { + // + VectorCopy(bs->lastenemyorigin, bestorigin); + bestorigin[2] += 8; + //if the bot is skilled anough + if (aim_skill > 0.5) { + //do prediction shots around corners + if (wi.number == WP_BFG || + wi.number == WP_ROCKET_LAUNCHER || + wi.number == WP_GRENADE_LAUNCHER) { + //create the chase goal + goal.entitynum = bs->client; + goal.areanum = bs->areanum; + VectorCopy(bs->eye, goal.origin); + VectorSet(goal.mins, -8, -8, -8); + VectorSet(goal.maxs, 8, 8, 8); + // + if (trap_BotPredictVisiblePosition(bs->lastenemyorigin, bs->lastenemyareanum, &goal, TFL_DEFAULT, target)) { + VectorSubtract(target, bs->eye, dir); + if (VectorLengthSquared(dir) > Square(80)) { + VectorCopy(target, bestorigin); + bestorigin[2] -= 20; + } + } + aim_accuracy = 1; + } + } + } + // + if (enemyvisible) { + BotAI_Trace(&trace, bs->eye, NULL, NULL, bestorigin, bs->entitynum, MASK_SHOT); + VectorCopy(trace.endpos, bs->aimtarget); + } + else { + VectorCopy(bestorigin, bs->aimtarget); + } + //get aim direction + VectorSubtract(bestorigin, bs->eye, dir); + // + if (wi.number == WP_MACHINEGUN || + wi.number == WP_SHOTGUN || + wi.number == WP_LIGHTNING || + wi.number == WP_RAILGUN) { + //distance towards the enemy + dist = VectorLength(dir); + if (dist > 150) dist = 150; + f = 0.6 + dist / 150 * 0.4; + aim_accuracy *= f; + } + //add some random stuff to the aim direction depending on the aim accuracy + if (aim_accuracy < 0.8) { + VectorNormalize(dir); + for (i = 0; i < 3; i++) dir[i] += 0.3 * crandom() * (1 - aim_accuracy); + } + //set the ideal view angles + vectoangles(dir, bs->ideal_viewangles); + //take the weapon spread into account for lower skilled bots + bs->ideal_viewangles[PITCH] += 6 * wi.vspread * crandom() * (1 - aim_accuracy); + bs->ideal_viewangles[PITCH] = AngleMod(bs->ideal_viewangles[PITCH]); + bs->ideal_viewangles[YAW] += 6 * wi.hspread * crandom() * (1 - aim_accuracy); + bs->ideal_viewangles[YAW] = AngleMod(bs->ideal_viewangles[YAW]); + //if the bots should be really challenging + if (bot_challenge.integer) { + //if the bot is really accurate and has the enemy in view for some time + if (aim_accuracy > 0.9 && bs->enemysight_time < FloatTime() - 1) { + //set the view angles directly + if (bs->ideal_viewangles[PITCH] > 180) bs->ideal_viewangles[PITCH] -= 360; + VectorCopy(bs->ideal_viewangles, bs->viewangles); + trap_EA_View(bs->client, bs->viewangles); + } + } +} + +/* +================== +BotCheckAttack +================== +*/ +void BotCheckAttack(bot_state_t *bs) { + float points, reactiontime, fov, firethrottle; + int attackentity; + bsp_trace_t bsptrace; + //float selfpreservation; + vec3_t forward, right, start, end, dir, angles; + weaponinfo_t wi; + bsp_trace_t trace; + aas_entityinfo_t entinfo; + vec3_t mins = {-8, -8, -8}, maxs = {8, 8, 8}; + + attackentity = bs->enemy; + // + BotEntityInfo(attackentity, &entinfo); + // if not attacking a player + if (attackentity >= MAX_CLIENTS) { +#ifdef MISSIONPACK + // if attacking an obelisk + if ( entinfo.number == redobelisk.entitynum || + entinfo.number == blueobelisk.entitynum ) { + // if obelisk is respawning return + if ( g_entities[entinfo.number].activator && + g_entities[entinfo.number].activator->s.frame == 2 ) { + return; + } + } +#endif + } + // + reactiontime = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_REACTIONTIME, 0, 1); + if (bs->enemysight_time > FloatTime() - reactiontime) return; + if (bs->teleport_time > FloatTime() - reactiontime) return; + //if changing weapons + if (bs->weaponchange_time > FloatTime() - 0.1) return; + //check fire throttle characteristic + if (bs->firethrottlewait_time > FloatTime()) return; + firethrottle = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_FIRETHROTTLE, 0, 1); + if (bs->firethrottleshoot_time < FloatTime()) { + if (random() > firethrottle) { + bs->firethrottlewait_time = FloatTime() + firethrottle; + bs->firethrottleshoot_time = 0; + } + else { + bs->firethrottleshoot_time = FloatTime() + 1 - firethrottle; + bs->firethrottlewait_time = 0; + } + } + // + // + VectorSubtract(bs->aimtarget, bs->eye, dir); + // + if (bs->weaponnum == WP_GAUNTLET) { + if (VectorLengthSquared(dir) > Square(60)) { + return; + } + } + if (VectorLengthSquared(dir) < Square(100)) + fov = 120; + else + fov = 50; + // + vectoangles(dir, angles); + if (!InFieldOfVision(bs->viewangles, fov, angles)) + return; + BotAI_Trace(&bsptrace, bs->eye, NULL, NULL, bs->aimtarget, bs->client, CONTENTS_SOLID|CONTENTS_PLAYERCLIP); + if (bsptrace.fraction < 1 && bsptrace.ent != attackentity) + return; + + //get the weapon info + trap_BotGetWeaponInfo(bs->ws, bs->weaponnum, &wi); + //get the start point shooting from + VectorCopy(bs->origin, start); + start[2] += bs->cur_ps.viewheight; + AngleVectors(bs->viewangles, forward, right, NULL); + start[0] += forward[0] * wi.offset[0] + right[0] * wi.offset[1]; + start[1] += forward[1] * wi.offset[0] + right[1] * wi.offset[1]; + start[2] += forward[2] * wi.offset[0] + right[2] * wi.offset[1] + wi.offset[2]; + //end point aiming at + VectorMA(start, 1000, forward, end); + //a little back to make sure not inside a very close enemy + VectorMA(start, -12, forward, start); + BotAI_Trace(&trace, start, mins, maxs, end, bs->entitynum, MASK_SHOT); + //if the entity is a client + if (trace.ent > 0 && trace.ent <= MAX_CLIENTS) { + if (trace.ent != attackentity) { + //if a teammate is hit + if (BotSameTeam(bs, trace.ent)) + return; + } + } + //if won't hit the enemy or not attacking a player (obelisk) + if (trace.ent != attackentity || attackentity >= MAX_CLIENTS) { + //if the projectile does radial damage + if (wi.proj.damagetype & DAMAGETYPE_RADIAL) { + if (trace.fraction * 1000 < wi.proj.radius) { + points = (wi.proj.damage - 0.5 * trace.fraction * 1000) * 0.5; + if (points > 0) { + return; + } + } + //FIXME: check if a teammate gets radial damage + } + } + //if fire has to be release to activate weapon + if (wi.flags & WFL_FIRERELEASED) { + if (bs->flags & BFL_ATTACKED) { + trap_EA_Attack(bs->client); + } + } + else { + trap_EA_Attack(bs->client); + } + bs->flags ^= BFL_ATTACKED; +} + +/* +================== +BotMapScripts +================== +*/ +void BotMapScripts(bot_state_t *bs) { + char info[1024]; + char mapname[128]; + int i, shootbutton; + float aim_accuracy; + aas_entityinfo_t entinfo; + vec3_t dir; + + trap_GetServerinfo(info, sizeof(info)); + + strncpy(mapname, Info_ValueForKey( info, "mapname" ), sizeof(mapname)-1); + mapname[sizeof(mapname)-1] = '\0'; + + if (!Q_stricmp(mapname, "q3tourney6")) { + vec3_t mins = {700, 204, 672}, maxs = {964, 468, 680}; + vec3_t buttonorg = {304, 352, 920}; + //NOTE: NEVER use the func_bobbing in q3tourney6 + bs->tfl &= ~TFL_FUNCBOB; + //if the bot is below the bounding box + if (bs->origin[0] > mins[0] && bs->origin[0] < maxs[0]) { + if (bs->origin[1] > mins[1] && bs->origin[1] < maxs[1]) { + if (bs->origin[2] < mins[2]) { + return; + } + } + } + shootbutton = qfalse; + //if an enemy is below this bounding box then shoot the button + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + + if (i == bs->client) continue; + // + BotEntityInfo(i, &entinfo); + // + if (!entinfo.valid) continue; + //if the enemy isn't dead and the enemy isn't the bot self + if (EntityIsDead(&entinfo) || entinfo.number == bs->entitynum) continue; + // + if (entinfo.origin[0] > mins[0] && entinfo.origin[0] < maxs[0]) { + if (entinfo.origin[1] > mins[1] && entinfo.origin[1] < maxs[1]) { + if (entinfo.origin[2] < mins[2]) { + //if there's a team mate below the crusher + if (BotSameTeam(bs, i)) { + shootbutton = qfalse; + break; + } + else { + shootbutton = qtrue; + } + } + } + } + } + if (shootbutton) { + bs->flags |= BFL_IDEALVIEWSET; + VectorSubtract(buttonorg, bs->eye, dir); + vectoangles(dir, bs->ideal_viewangles); + aim_accuracy = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_AIM_ACCURACY, 0, 1); + bs->ideal_viewangles[PITCH] += 8 * crandom() * (1 - aim_accuracy); + bs->ideal_viewangles[PITCH] = AngleMod(bs->ideal_viewangles[PITCH]); + bs->ideal_viewangles[YAW] += 8 * crandom() * (1 - aim_accuracy); + bs->ideal_viewangles[YAW] = AngleMod(bs->ideal_viewangles[YAW]); + // + if (InFieldOfVision(bs->viewangles, 20, bs->ideal_viewangles)) { + trap_EA_Attack(bs->client); + } + } + } + else if (!Q_stricmp(mapname, "mpq3tourney6")) { + //NOTE: NEVER use the func_bobbing in mpq3tourney6 + bs->tfl &= ~TFL_FUNCBOB; + } +} + +/* +================== +BotSetMovedir +================== +*/ +// bk001205 - made these static +static vec3_t VEC_UP = {0, -1, 0}; +static vec3_t MOVEDIR_UP = {0, 0, 1}; +static vec3_t VEC_DOWN = {0, -2, 0}; +static vec3_t MOVEDIR_DOWN = {0, 0, -1}; + +void BotSetMovedir(vec3_t angles, vec3_t movedir) { + if (VectorCompare(angles, VEC_UP)) { + VectorCopy(MOVEDIR_UP, movedir); + } + else if (VectorCompare(angles, VEC_DOWN)) { + VectorCopy(MOVEDIR_DOWN, movedir); + } + else { + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors(angles, movedir, NULL, NULL); + AngleVectorsForward( angles, movedir ); + } +} + +/* +================== +BotModelMinsMaxs + +this is ugly +================== +*/ +int BotModelMinsMaxs(int modelindex, int eType, int contents, vec3_t mins, vec3_t maxs) { + gentity_t *ent; + int i; + + ent = &g_entities[0]; + for (i = 0; i < level.num_entities; i++, ent++) { + if ( !ent->inuse ) { + continue; + } + if ( eType && ent->s.eType != eType) { + continue; + } + if ( contents && ent->r.contents != contents) { + continue; + } + if (ent->s.modelindex == modelindex) { + if (mins) + VectorAdd(ent->r.currentOrigin, ent->r.mins, mins); + if (maxs) + VectorAdd(ent->r.currentOrigin, ent->r.maxs, maxs); + return i; + } + } + if (mins) + VectorClear(mins); + if (maxs) + VectorClear(maxs); + return 0; +} + +/* +================== +BotFuncButtonGoal +================== +*/ +int BotFuncButtonActivateGoal(bot_state_t *bs, int bspent, bot_activategoal_t *activategoal) { + int i, areas[10], numareas, modelindex, entitynum; + char model[128]; + float lip, dist, health, angle; + vec3_t size, start, end, mins, maxs, angles, points[10]; + vec3_t movedir, origin, goalorigin, bboxmins, bboxmaxs; + vec3_t extramins = {1, 1, 1}, extramaxs = {-1, -1, -1}; + bsp_trace_t bsptrace; + + activategoal->shoot = qfalse; + VectorClear(activategoal->target); + //create a bot goal towards the button + trap_AAS_ValueForBSPEpairKey(bspent, "model", model, sizeof(model)); + if (!*model) + return qfalse; + modelindex = atoi(model+1); + if (!modelindex) + return qfalse; + VectorClear(angles); + entitynum = BotModelMinsMaxs(modelindex, ET_MOVER, 0, mins, maxs); + //get the lip of the button + trap_AAS_FloatForBSPEpairKey(bspent, "lip", &lip); + if (!lip) lip = 4; + //get the move direction from the angle + trap_AAS_FloatForBSPEpairKey(bspent, "angle", &angle); + VectorSet(angles, 0, angle, 0); + BotSetMovedir(angles, movedir); + //button size + VectorSubtract(maxs, mins, size); + //button origin + VectorAdd(mins, maxs, origin); + VectorScale(origin, 0.5, origin); + //touch distance of the button + dist = fabs(movedir[0]) * size[0] + fabs(movedir[1]) * size[1] + fabs(movedir[2]) * size[2]; + dist *= 0.5; + // + trap_AAS_FloatForBSPEpairKey(bspent, "health", &health); + //if the button is shootable + if (health) { + //calculate the shoot target + VectorMA(origin, -dist, movedir, goalorigin); + // + VectorCopy(goalorigin, activategoal->target); + activategoal->shoot = qtrue; + // + BotAI_Trace(&bsptrace, bs->eye, NULL, NULL, goalorigin, bs->entitynum, MASK_SHOT); + // if the button is visible from the current position + if (bsptrace.fraction >= 1.0 || bsptrace.ent == entitynum) { + // + activategoal->goal.entitynum = entitynum; //NOTE: this is the entity number of the shootable button + activategoal->goal.number = 0; + activategoal->goal.flags = 0; + VectorCopy(bs->origin, activategoal->goal.origin); + activategoal->goal.areanum = bs->areanum; + VectorSet(activategoal->goal.mins, -8, -8, -8); + VectorSet(activategoal->goal.maxs, 8, 8, 8); + // + return qtrue; + } + else { + //create a goal from where the button is visible and shoot at the button from there + //add bounding box size to the dist + trap_AAS_PresenceTypeBoundingBox(PRESENCE_CROUCH, bboxmins, bboxmaxs); + for (i = 0; i < 3; i++) { + if (movedir[i] < 0) dist += fabs(movedir[i]) * fabs(bboxmaxs[i]); + else dist += fabs(movedir[i]) * fabs(bboxmins[i]); + } + //calculate the goal origin + VectorMA(origin, -dist, movedir, goalorigin); + // + VectorCopy(goalorigin, start); + start[2] += 24; + VectorCopy(start, end); + end[2] -= 512; + numareas = trap_AAS_TraceAreas(start, end, areas, points, 10); + // + for (i = numareas-1; i >= 0; i--) { + if (trap_AAS_AreaReachability(areas[i])) { + break; + } + } + if (i < 0) { + // FIXME: trace forward and maybe in other directions to find a valid area + } + if (i >= 0) { + // + VectorCopy(points[i], activategoal->goal.origin); + activategoal->goal.areanum = areas[i]; + VectorSet(activategoal->goal.mins, 8, 8, 8); + VectorSet(activategoal->goal.maxs, -8, -8, -8); + // + for (i = 0; i < 3; i++) + { + if (movedir[i] < 0) activategoal->goal.maxs[i] += fabs(movedir[i]) * fabs(extramaxs[i]); + else activategoal->goal.mins[i] += fabs(movedir[i]) * fabs(extramins[i]); + } //end for + // + activategoal->goal.entitynum = entitynum; + activategoal->goal.number = 0; + activategoal->goal.flags = 0; + return qtrue; + } + } + return qfalse; + } + else { + //add bounding box size to the dist + trap_AAS_PresenceTypeBoundingBox(PRESENCE_CROUCH, bboxmins, bboxmaxs); + for (i = 0; i < 3; i++) { + if (movedir[i] < 0) dist += fabs(movedir[i]) * fabs(bboxmaxs[i]); + else dist += fabs(movedir[i]) * fabs(bboxmins[i]); + } + //calculate the goal origin + VectorMA(origin, -dist, movedir, goalorigin); + // + VectorCopy(goalorigin, start); + start[2] += 24; + VectorCopy(start, end); + end[2] -= 100; + numareas = trap_AAS_TraceAreas(start, end, areas, NULL, 10); + // + for (i = 0; i < numareas; i++) { + if (trap_AAS_AreaReachability(areas[i])) { + break; + } + } + if (i < numareas) { + // + VectorCopy(origin, activategoal->goal.origin); + activategoal->goal.areanum = areas[i]; + VectorSubtract(mins, origin, activategoal->goal.mins); + VectorSubtract(maxs, origin, activategoal->goal.maxs); + // + for (i = 0; i < 3; i++) + { + if (movedir[i] < 0) activategoal->goal.maxs[i] += fabs(movedir[i]) * fabs(extramaxs[i]); + else activategoal->goal.mins[i] += fabs(movedir[i]) * fabs(extramins[i]); + } //end for + // + activategoal->goal.entitynum = entitynum; + activategoal->goal.number = 0; + activategoal->goal.flags = 0; + return qtrue; + } + } + return qfalse; +} + +/* +================== +BotFuncDoorGoal +================== +*/ +int BotFuncDoorActivateGoal(bot_state_t *bs, int bspent, bot_activategoal_t *activategoal) { + int modelindex, entitynum; + char model[MAX_INFO_STRING]; + vec3_t mins, maxs, origin, angles; + + //shoot at the shootable door + trap_AAS_ValueForBSPEpairKey(bspent, "model", model, sizeof(model)); + if (!*model) + return qfalse; + modelindex = atoi(model+1); + if (!modelindex) + return qfalse; + VectorClear(angles); + entitynum = BotModelMinsMaxs(modelindex, ET_MOVER, 0, mins, maxs); + //door origin + VectorAdd(mins, maxs, origin); + VectorScale(origin, 0.5, origin); + VectorCopy(origin, activategoal->target); + activategoal->shoot = qtrue; + // + activategoal->goal.entitynum = entitynum; //NOTE: this is the entity number of the shootable door + activategoal->goal.number = 0; + activategoal->goal.flags = 0; + VectorCopy(bs->origin, activategoal->goal.origin); + activategoal->goal.areanum = bs->areanum; + VectorSet(activategoal->goal.mins, -8, -8, -8); + VectorSet(activategoal->goal.maxs, 8, 8, 8); + return qtrue; +} + +/* +================== +BotTriggerMultipleGoal +================== +*/ +int BotTriggerMultipleActivateGoal(bot_state_t *bs, int bspent, bot_activategoal_t *activategoal) { + int i, areas[10], numareas, modelindex, entitynum; + char model[128]; + vec3_t start, end, mins, maxs, angles; + vec3_t origin, goalorigin; + + activategoal->shoot = qfalse; + VectorClear(activategoal->target); + //create a bot goal towards the trigger + trap_AAS_ValueForBSPEpairKey(bspent, "model", model, sizeof(model)); + if (!*model) + return qfalse; + modelindex = atoi(model+1); + if (!modelindex) + return qfalse; + VectorClear(angles); + entitynum = BotModelMinsMaxs(modelindex, 0, CONTENTS_TRIGGER, mins, maxs); + //trigger origin + VectorAdd(mins, maxs, origin); + VectorScale(origin, 0.5, origin); + VectorCopy(origin, goalorigin); + // + VectorCopy(goalorigin, start); + start[2] += 24; + VectorCopy(start, end); + end[2] -= 100; + numareas = trap_AAS_TraceAreas(start, end, areas, NULL, 10); + // + for (i = 0; i < numareas; i++) { + if (trap_AAS_AreaReachability(areas[i])) { + break; + } + } + if (i < numareas) { + VectorCopy(origin, activategoal->goal.origin); + activategoal->goal.areanum = areas[i]; + VectorSubtract(mins, origin, activategoal->goal.mins); + VectorSubtract(maxs, origin, activategoal->goal.maxs); + // + activategoal->goal.entitynum = entitynum; + activategoal->goal.number = 0; + activategoal->goal.flags = 0; + return qtrue; + } + return qfalse; +} + +/* +================== +BotPopFromActivateGoalStack +================== +*/ +int BotPopFromActivateGoalStack(bot_state_t *bs) { + if (!bs->activatestack) + return qfalse; + BotEnableActivateGoalAreas(bs->activatestack, qtrue); + bs->activatestack->inuse = qfalse; + bs->activatestack->justused_time = FloatTime(); + bs->activatestack = bs->activatestack->next; + return qtrue; +} + +/* +================== +BotPushOntoActivateGoalStack +================== +*/ +int BotPushOntoActivateGoalStack(bot_state_t *bs, bot_activategoal_t *activategoal) { + int i, best; + float besttime; + + best = -1; + besttime = FloatTime() + 9999; + // + for (i = 0; i < MAX_ACTIVATESTACK; i++) { + if (!bs->activategoalheap[i].inuse) { + if (bs->activategoalheap[i].justused_time < besttime) { + besttime = bs->activategoalheap[i].justused_time; + best = i; + } + } + } + if (best != -1) { + memcpy(&bs->activategoalheap[best], activategoal, sizeof(bot_activategoal_t)); + bs->activategoalheap[best].inuse = qtrue; + bs->activategoalheap[best].next = bs->activatestack; + bs->activatestack = &bs->activategoalheap[best]; + return qtrue; + } + return qfalse; +} + +/* +================== +BotClearActivateGoalStack +================== +*/ +void BotClearActivateGoalStack(bot_state_t *bs) { + while(bs->activatestack) + BotPopFromActivateGoalStack(bs); +} + +/* +================== +BotEnableActivateGoalAreas +================== +*/ +void BotEnableActivateGoalAreas(bot_activategoal_t *activategoal, int enable) { + int i; + + if (activategoal->areasdisabled == !enable) + return; + for (i = 0; i < activategoal->numareas; i++) + trap_AAS_EnableRoutingArea( activategoal->areas[i], enable ); + activategoal->areasdisabled = !enable; +} + +/* +================== +BotIsGoingToActivateEntity +================== +*/ +int BotIsGoingToActivateEntity(bot_state_t *bs, int entitynum) { + bot_activategoal_t *a; + int i; + + for (a = bs->activatestack; a; a = a->next) { + if (a->time < FloatTime()) + continue; + if (a->goal.entitynum == entitynum) + return qtrue; + } + for (i = 0; i < MAX_ACTIVATESTACK; i++) { + if (bs->activategoalheap[i].inuse) + continue; + // + if (bs->activategoalheap[i].goal.entitynum == entitynum) { + // if the bot went for this goal less than 2 seconds ago + if (bs->activategoalheap[i].justused_time > FloatTime() - 2) + return qtrue; + } + } + return qfalse; +} + +/* +================== +BotGetActivateGoal + + returns the number of the bsp entity to activate + goal->entitynum will be set to the game entity to activate +================== +*/ +//#define OBSTACLEDEBUG + +int BotGetActivateGoal(bot_state_t *bs, int entitynum, bot_activategoal_t *activategoal) { + int i, ent, cur_entities[10], spawnflags, modelindex, areas[MAX_ACTIVATEAREAS*2], numareas, t; + char model[MAX_INFO_STRING], tmpmodel[128]; + char target[128], classname[128]; + float health; + char targetname[10][128]; + aas_entityinfo_t entinfo; + aas_areainfo_t areainfo; + vec3_t origin, angles, absmins, absmaxs; + + memset(activategoal, 0, sizeof(bot_activategoal_t)); + BotEntityInfo(entitynum, &entinfo); + Com_sprintf(model, sizeof( model ), "*%d", entinfo.modelindex); + for (ent = trap_AAS_NextBSPEntity(0); ent; ent = trap_AAS_NextBSPEntity(ent)) { + if (!trap_AAS_ValueForBSPEpairKey(ent, "model", tmpmodel, sizeof(tmpmodel))) continue; + if (!strcmp(model, tmpmodel)) break; + } + if (!ent) { + BotAI_Print(PRT_ERROR, "BotGetActivateGoal: no entity found with model %s\n", model); + return 0; + } + trap_AAS_ValueForBSPEpairKey(ent, "classname", classname, sizeof(classname)); + if (!classname) { + BotAI_Print(PRT_ERROR, "BotGetActivateGoal: entity with model %s has no classname\n", model); + return 0; + } + //if it is a door + if (!strcmp(classname, "func_door")) { + if (trap_AAS_FloatForBSPEpairKey(ent, "health", &health)) { + //if the door has health then the door must be shot to open + if (health) { + BotFuncDoorActivateGoal(bs, ent, activategoal); + return ent; + } + } + // + trap_AAS_IntForBSPEpairKey(ent, "spawnflags", &spawnflags); + // if the door starts open then just wait for the door to return + if ( spawnflags & 1 ) + return 0; + //get the door origin + if (!trap_AAS_VectorForBSPEpairKey(ent, "origin", origin)) { + VectorClear(origin); + } + //if the door is open or opening already + if (!VectorCompare(origin, entinfo.origin)) + return 0; + // store all the areas the door is in + trap_AAS_ValueForBSPEpairKey(ent, "model", model, sizeof(model)); + if (*model) { + modelindex = atoi(model+1); + if (modelindex) { + VectorClear(angles); + BotModelMinsMaxs(modelindex, ET_MOVER, 0, absmins, absmaxs); + // + numareas = trap_AAS_BBoxAreas(absmins, absmaxs, areas, MAX_ACTIVATEAREAS*2); + // store the areas with reachabilities first + for (i = 0; i < numareas; i++) { + if (activategoal->numareas >= MAX_ACTIVATEAREAS) + break; + if ( !trap_AAS_AreaReachability(areas[i]) ) { + continue; + } + trap_AAS_AreaInfo(areas[i], &areainfo); + if (areainfo.contents & AREACONTENTS_MOVER) { + activategoal->areas[activategoal->numareas++] = areas[i]; + } + } + // store any remaining areas + for (i = 0; i < numareas; i++) { + if (activategoal->numareas >= MAX_ACTIVATEAREAS) + break; + if ( trap_AAS_AreaReachability(areas[i]) ) { + continue; + } + trap_AAS_AreaInfo(areas[i], &areainfo); + if (areainfo.contents & AREACONTENTS_MOVER) { + activategoal->areas[activategoal->numareas++] = areas[i]; + } + } + } + } + } + // if the bot is blocked by or standing on top of a button + if (!strcmp(classname, "func_button")) { + return 0; + } + // get the targetname so we can find an entity with a matching target + if (!trap_AAS_ValueForBSPEpairKey(ent, "targetname", targetname[0], sizeof(targetname[0]))) { + if (bot_developer.integer) { + BotAI_Print(PRT_ERROR, "BotGetActivateGoal: entity with model \"%s\" has no targetname\n", model); + } + return 0; + } + // allow tree-like activation + cur_entities[0] = trap_AAS_NextBSPEntity(0); + for (i = 0; i >= 0 && i < 10;) { + for (ent = cur_entities[i]; ent; ent = trap_AAS_NextBSPEntity(ent)) { + if (!trap_AAS_ValueForBSPEpairKey(ent, "target", target, sizeof(target))) continue; + if (!strcmp(targetname[i], target)) { + cur_entities[i] = trap_AAS_NextBSPEntity(ent); + break; + } + } + if (!ent) { + if (bot_developer.integer) { + BotAI_Print(PRT_ERROR, "BotGetActivateGoal: no entity with target \"%s\"\n", targetname[i]); + } + i--; + continue; + } + if (!trap_AAS_ValueForBSPEpairKey(ent, "classname", classname, sizeof(classname))) { + if (bot_developer.integer) { + BotAI_Print(PRT_ERROR, "BotGetActivateGoal: entity with target \"%s\" has no classname\n", targetname[i]); + } + continue; + } + // BSP button model + if (!strcmp(classname, "func_button")) { + // + if (!BotFuncButtonActivateGoal(bs, ent, activategoal)) + continue; + // if the bot tries to activate this button already + if ( bs->activatestack && bs->activatestack->inuse && + bs->activatestack->goal.entitynum == activategoal->goal.entitynum && + bs->activatestack->time > FloatTime() && + bs->activatestack->start_time < FloatTime() - 2) + continue; + // if the bot is in a reachability area + if ( trap_AAS_AreaReachability(bs->areanum) ) { + // disable all areas the blocking entity is in + BotEnableActivateGoalAreas( activategoal, qfalse ); + // + t = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, activategoal->goal.areanum, bs->tfl); + // if the button is not reachable + if (!t) { + continue; + } + activategoal->time = FloatTime() + t * 0.01 + 5; + } + return ent; + } + // invisible trigger multiple box + else if (!strcmp(classname, "trigger_multiple")) { + // + if (!BotTriggerMultipleActivateGoal(bs, ent, activategoal)) + continue; + // if the bot tries to activate this trigger already + if ( bs->activatestack && bs->activatestack->inuse && + bs->activatestack->goal.entitynum == activategoal->goal.entitynum && + bs->activatestack->time > FloatTime() && + bs->activatestack->start_time < FloatTime() - 2) + continue; + // if the bot is in a reachability area + if ( trap_AAS_AreaReachability(bs->areanum) ) { + // disable all areas the blocking entity is in + BotEnableActivateGoalAreas( activategoal, qfalse ); + // + t = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, activategoal->goal.areanum, bs->tfl); + // if the trigger is not reachable + if (!t) { + continue; + } + activategoal->time = FloatTime() + t * 0.01 + 5; + } + return ent; + } + else if (!strcmp(classname, "func_timer")) { + // just skip the func_timer + continue; + } + // the actual button or trigger might be linked through a target_relay or target_delay + else if (!strcmp(classname, "target_relay") || !strcmp(classname, "target_delay")) { + if (trap_AAS_ValueForBSPEpairKey(ent, "targetname", targetname[i+1], sizeof(targetname[0]))) { + i++; + cur_entities[i] = trap_AAS_NextBSPEntity(0); + } + } + } +#ifdef OBSTACLEDEBUG + BotAI_Print(PRT_ERROR, "BotGetActivateGoal: no valid activator for entity with target \"%s\"\n", targetname[0]); +#endif + return 0; +} + +/* +================== +BotGoForActivateGoal +================== +*/ +int BotGoForActivateGoal(bot_state_t *bs, bot_activategoal_t *activategoal) { + aas_entityinfo_t activateinfo; + + activategoal->inuse = qtrue; + if (!activategoal->time) + activategoal->time = FloatTime() + 10; + activategoal->start_time = FloatTime(); + BotEntityInfo(activategoal->goal.entitynum, &activateinfo); + VectorCopy(activateinfo.origin, activategoal->origin); + // + if (BotPushOntoActivateGoalStack(bs, activategoal)) { + // enter the activate entity AI node + AIEnter_Seek_ActivateEntity(bs, "BotGoForActivateGoal"); + return qtrue; + } + else { + // enable any routing areas that were disabled + BotEnableActivateGoalAreas(activategoal, qtrue); + return qfalse; + } +} + +/* +================== +BotPrintActivateGoalInfo +================== +*/ +void BotPrintActivateGoalInfo(bot_state_t *bs, bot_activategoal_t *activategoal, int bspent) { + char netname[MAX_NETNAME]; + char classname[128]; + char buf[128]; + + ClientName(bs->client, netname, sizeof(netname)); + trap_AAS_ValueForBSPEpairKey(bspent, "classname", classname, sizeof(classname)); + if (activategoal->shoot) { + Com_sprintf(buf, sizeof(buf), "%s: I have to shoot at a %s from %1.1f %1.1f %1.1f in area %d\n", + netname, classname, + activategoal->goal.origin[0], + activategoal->goal.origin[1], + activategoal->goal.origin[2], + activategoal->goal.areanum); + } + else { + Com_sprintf(buf, sizeof(buf), "%s: I have to activate a %s at %1.1f %1.1f %1.1f in area %d\n", + netname, classname, + activategoal->goal.origin[0], + activategoal->goal.origin[1], + activategoal->goal.origin[2], + activategoal->goal.areanum); + } + trap_EA_Say(bs->client, buf); +} + +/* +================== +BotRandomMove +================== +*/ +void BotRandomMove(bot_state_t *bs, bot_moveresult_t *moveresult) { + vec3_t dir, angles; + + angles[0] = 0; + angles[1] = random() * 360; + angles[2] = 0; + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors(angles, dir, NULL, NULL); + AngleVectorsForward( angles, dir ); + + trap_BotMoveInDirection(bs->ms, dir, 400, MOVE_WALK); + + moveresult->failure = qfalse; + VectorCopy(dir, moveresult->movedir); +} + +/* +================== +BotAIBlocked + +Very basic handling of bots being blocked by other entities. +Check what kind of entity is blocking the bot and try to activate +it. If that's not an option then try to walk around or over the entity. +Before the bot ends in this part of the AI it should predict which doors to +open, which buttons to activate etc. +================== +*/ +void BotAIBlocked(bot_state_t *bs, bot_moveresult_t *moveresult, int activate) { + int movetype, bspent; + vec3_t hordir, start, end, mins, maxs, sideward, angles, up = {0, 0, 1}; + aas_entityinfo_t entinfo; + bot_activategoal_t activategoal; + + // if the bot is not blocked by anything + if (!moveresult->blocked) { + bs->notblocked_time = FloatTime(); + return; + } + // if stuck in a solid area + if ( moveresult->type == RESULTTYPE_INSOLIDAREA ) { + // move in a random direction in the hope to get out + BotRandomMove(bs, moveresult); + // + return; + } + // get info for the entity that is blocking the bot + BotEntityInfo(moveresult->blockentity, &entinfo); +#ifdef OBSTACLEDEBUG + ClientName(bs->client, netname, sizeof(netname)); + BotAI_Print(PRT_MESSAGE, "%s: I'm blocked by model %d\n", netname, entinfo.modelindex); +#endif OBSTACLEDEBUG + // if blocked by a bsp model and the bot wants to activate it + if (activate && entinfo.modelindex > 0 && entinfo.modelindex <= max_bspmodelindex) { + // find the bsp entity which should be activated in order to get the blocking entity out of the way + bspent = BotGetActivateGoal(bs, entinfo.number, &activategoal); + if (bspent) { + // + if (bs->activatestack && !bs->activatestack->inuse) + bs->activatestack = NULL; + // if not already trying to activate this entity + if (!BotIsGoingToActivateEntity(bs, activategoal.goal.entitynum)) { + // + BotGoForActivateGoal(bs, &activategoal); + } + // if ontop of an obstacle or + // if the bot is not in a reachability area it'll still + // need some dynamic obstacle avoidance, otherwise return + if (!(moveresult->flags & MOVERESULT_ONTOPOFOBSTACLE) && + trap_AAS_AreaReachability(bs->areanum)) + return; + } + else { + // enable any routing areas that were disabled + BotEnableActivateGoalAreas(&activategoal, qtrue); + } + } + // just some basic dynamic obstacle avoidance code + hordir[0] = moveresult->movedir[0]; + hordir[1] = moveresult->movedir[1]; + hordir[2] = 0; + // if no direction just take a random direction + if (VectorNormalize(hordir) < 0.1) { + VectorSet(angles, 0, 360 * random(), 0); + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors(angles, hordir, NULL, NULL); + AngleVectorsForward( angles, hordir ); + } + // + //if (moveresult->flags & MOVERESULT_ONTOPOFOBSTACLE) movetype = MOVE_JUMP; + //else + movetype = MOVE_WALK; + // if there's an obstacle at the bot's feet and head then + // the bot might be able to crouch through + VectorCopy(bs->origin, start); + start[2] += 18; + VectorMA(start, 5, hordir, end); + VectorSet(mins, -16, -16, -24); + VectorSet(maxs, 16, 16, 4); + // + //bsptrace = AAS_Trace(start, mins, maxs, end, bs->entitynum, MASK_PLAYERSOLID); + //if (bsptrace.fraction >= 1) movetype = MOVE_CROUCH; + // get the sideward vector + CrossProduct(hordir, up, sideward); + // + if (bs->flags & BFL_AVOIDRIGHT) VectorNegate(sideward, sideward); + // try to crouch straight forward? + if (movetype != MOVE_CROUCH || !trap_BotMoveInDirection(bs->ms, hordir, 400, movetype)) { + // perform the movement + if (!trap_BotMoveInDirection(bs->ms, sideward, 400, movetype)) { + // flip the avoid direction flag + bs->flags ^= BFL_AVOIDRIGHT; + // flip the direction + // VectorNegate(sideward, sideward); + VectorMA(sideward, -1, hordir, sideward); + // move in the other direction + trap_BotMoveInDirection(bs->ms, sideward, 400, movetype); + } + } + // + if (bs->notblocked_time < FloatTime() - 0.4) { + // just reset goals and hope the bot will go into another direction? + // is this still needed?? + if (bs->ainode == AINode_Seek_NBG) bs->nbg_time = 0; + else if (bs->ainode == AINode_Seek_LTG) bs->ltg_time = 0; + } +} + +/* +================== +BotAIPredictObstacles + +Predict the route towards the goal and check if the bot +will be blocked by certain obstacles. When the bot has obstacles +on it's path the bot should figure out if they can be removed +by activating certain entities. +================== +*/ +int BotAIPredictObstacles(bot_state_t *bs, bot_goal_t *goal) { + int modelnum, entitynum, bspent; + bot_activategoal_t activategoal; + aas_predictroute_t route; + + if (!bot_predictobstacles.integer) + return qfalse; + + // always predict when the goal change or at regular intervals + if (bs->predictobstacles_goalareanum == goal->areanum && + bs->predictobstacles_time > FloatTime() - 6) { + return qfalse; + } + bs->predictobstacles_goalareanum = goal->areanum; + bs->predictobstacles_time = FloatTime(); + + // predict at most 100 areas or 10 seconds ahead + trap_AAS_PredictRoute(&route, bs->areanum, bs->origin, + goal->areanum, bs->tfl, 100, 1000, + RSE_USETRAVELTYPE|RSE_ENTERCONTENTS, + AREACONTENTS_MOVER, TFL_BRIDGE, 0); + // if bot has to travel through an area with a mover + if (route.stopevent & RSE_ENTERCONTENTS) { + // if the bot will run into a mover + if (route.endcontents & AREACONTENTS_MOVER) { + //NOTE: this only works with bspc 2.1 or higher + modelnum = (route.endcontents & AREACONTENTS_MODELNUM) >> AREACONTENTS_MODELNUMSHIFT; + if (modelnum) { + // + entitynum = BotModelMinsMaxs(modelnum, ET_MOVER, 0, NULL, NULL); + if (entitynum) { + //NOTE: BotGetActivateGoal already checks if the door is open or not + bspent = BotGetActivateGoal(bs, entitynum, &activategoal); + if (bspent) { + // + if (bs->activatestack && !bs->activatestack->inuse) + bs->activatestack = NULL; + // if not already trying to activate this entity + if (!BotIsGoingToActivateEntity(bs, activategoal.goal.entitynum)) { + // + //BotAI_Print(PRT_MESSAGE, "blocked by mover model %d, entity %d ?\n", modelnum, entitynum); + // + BotGoForActivateGoal(bs, &activategoal); + return qtrue; + } + else { + // enable any routing areas that were disabled + BotEnableActivateGoalAreas(&activategoal, qtrue); + } + } + } + } + } + } + else if (route.stopevent & RSE_USETRAVELTYPE) { + if (route.endtravelflags & TFL_BRIDGE) { + //FIXME: check if the bridge is available to travel over + } + } + return qfalse; +} + +/* +================== +BotCheckConsoleMessages +================== +*/ +void BotCheckConsoleMessages(bot_state_t *bs) { + char botname[MAX_NETNAME], message[MAX_MESSAGE_SIZE], netname[MAX_NETNAME], *ptr; + float chat_reply; + int context, handle; + bot_consolemessage_t m; + bot_match_t match; + + //the name of this bot + ClientName(bs->client, botname, sizeof(botname)); + // + while((handle = trap_BotNextConsoleMessage(bs->cs, &m)) != 0) { + //if the chat state is flooded with messages the bot will read them quickly + if (trap_BotNumConsoleMessages(bs->cs) < 10) { + //if it is a chat message the bot needs some time to read it + if (m.type == CMS_CHAT && m.time > FloatTime() - (1 + random())) break; + } + // + ptr = m.message; + //if it is a chat message then don't unify white spaces and don't + //replace synonyms in the netname + if (m.type == CMS_CHAT) { + // + if (trap_BotFindMatch(m.message, &match, MTCONTEXT_REPLYCHAT)) { + ptr = m.message + match.variables[MESSAGE].offset; + } + } + //unify the white spaces in the message + trap_UnifyWhiteSpaces(ptr); + //replace synonyms in the right context + context = BotSynonymContext(bs); + trap_BotReplaceSynonyms(ptr, context); + //if there's no match + if (!BotMatchMessage(bs, m.message)) { + //if it is a chat message + if (m.type == CMS_CHAT && !bot_nochat.integer) { + // + if (!trap_BotFindMatch(m.message, &match, MTCONTEXT_REPLYCHAT)) { + trap_BotRemoveConsoleMessage(bs->cs, handle); + continue; + } + //don't use eliza chats with team messages + if (match.subtype & ST_TEAM) { + trap_BotRemoveConsoleMessage(bs->cs, handle); + continue; + } + // + trap_BotMatchVariable(&match, NETNAME, netname, sizeof(netname)); + trap_BotMatchVariable(&match, MESSAGE, message, sizeof(message)); + //if this is a message from the bot self + if (bs->client == ClientFromName(netname)) { + trap_BotRemoveConsoleMessage(bs->cs, handle); + continue; + } + //unify the message + trap_UnifyWhiteSpaces(message); + // + trap_Cvar_Update(&bot_testrchat); + if (bot_testrchat.integer) { + // + trap_BotLibVarSet("bot_testrchat", "1"); + //if bot replies with a chat message + if (trap_BotReplyChat(bs->cs, message, context, CONTEXT_REPLY, + NULL, NULL, + NULL, NULL, + NULL, NULL, + botname, netname)) { + BotAI_Print(PRT_MESSAGE, "------------------------\n"); + } + else { + BotAI_Print(PRT_MESSAGE, "**** no valid reply ****\n"); + } + } + //if at a valid chat position and not chatting already and not in teamplay + else if (bs->ainode != AINode_Stand && BotValidChatPosition(bs) && !TeamPlayIsOn()) { + chat_reply = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_REPLY, 0, 1); + if (random() < 1.5 / (NumBots()+1) && random() < chat_reply) { + //if bot replies with a chat message + if (trap_BotReplyChat(bs->cs, message, context, CONTEXT_REPLY, + NULL, NULL, + NULL, NULL, + NULL, NULL, + botname, netname)) { + //remove the console message + trap_BotRemoveConsoleMessage(bs->cs, handle); + bs->stand_time = FloatTime() + BotChatTime(bs); + AIEnter_Stand(bs, "BotCheckConsoleMessages: reply chat"); + //EA_Say(bs->client, bs->cs.chatmessage); + break; + } + } + } + } + } + //remove the console message + trap_BotRemoveConsoleMessage(bs->cs, handle); + } +} + +/* +================== +BotCheckEvents +================== +*/ +void BotCheckForGrenades(bot_state_t *bs, entityState_t *state) { + // if this is not a grenade + if (state->eType != ET_MISSILE || state->weapon != WP_GRENADE_LAUNCHER) { + //PKMOD - Ergodic 03/15/01 - avoid beartraps too + //PKMOD - Ergodic 04/14/01 - remove avoid beartraps +// if (state->eType != ET_BEARTRAP || state->weapon != WP_BEARTRAP) { + //PKMOD - Ergodic 03/15/01 - avoid nails too + //PKMOD - Ergodic 04/14/01 - remove avoid nails +// if (state->eType != ET_NAIL || state->weapon != WP_NAILGUN) + return; + } + // try to avoid the grenade + trap_BotAddAvoidSpot(bs->ms, state->pos.trBase, 160, AVOID_ALWAYS); +} + +/* +================== +BotCheckForBeartraps +//PKMOD - Ergodic 04/14/01 - new code for bots to avoid/target enemy beartraps +================== +*/ +void BotCheckForBeartraps(bot_state_t *bs, entityState_t *state) { + // if this is not a Beartrap + if (state->eType != ET_BEARTRAP || state->weapon != WP_BEARTRAP) + return; + // if this beartrap is from someone on our own team + //PKMOD - Ergodic 10/10/03 - BOT AI will use modelindex instead of generic1 in order to free generic1 for "cell damages" + // if (state->generic1 == BotTeam(bs)) + if (state->modelindex == BotTeam(bs)) + + return; + // if the bot doesn't have a weapon to destroy the beartrap + //PKMOD - Ergodic - 04/14/01 - add explosive shells - duh + bs->inventory[INVENTORY_EXPLOSIVESHOTGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_EXPLODING_SHELLS)) != 0; + bs->inventory[INVENTORY_EXPLOSIVESHELLS] = bs->cur_ps.ammo[WP_EXPLODING_SHELLS]; + + if (!(bs->inventory[INVENTORY_PKA_NAILGUN] > 0 && bs->inventory[INVENTORY_NAILS] > 0) && + !(bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && bs->inventory[INVENTORY_ROCKETS] > 0) && + !(bs->inventory[INVENTORY_EXPLOSIVESHOTGUN] > 0 && bs->inventory[INVENTORY_EXPLOSIVESHELLS] > 0) ) { + return; + } + // try to avoid the beartrap + //PKMOD - Ergodic - 08/30/01 - reduce avoid spot size from 160 to 120 + trap_BotAddAvoidSpot(bs->ms, state->pos.trBase, 120, AVOID_ALWAYS); + // + if (bs->numbeartraps >= MAX_BEARTRAPS) + return; + bs->beartraps[bs->numbeartraps] = state->number; + bs->numbeartraps++; +} + +/* +================== +BotCheckForAutosentrys +//PKMOD - Ergodic 08/30/01 - new code for bots to avoid/target enemy sentrys +================== +*/ +void BotCheckForAutosentrys(bot_state_t *bs, entityState_t *state) { + // if this is not an autosentry + if ( state->eType != ET_AUTOSENTRY_BASE || state->weapon != WP_SENTRY ) + return; + // if this autosentry is from someone on our own team + //PKMOD - Ergodic 10/10/03 - BOT AI will use modelindex instead of generic1 in order to free generic1 for "cell damages" + // if ( state->generic1 == BotTeam(bs) ) + if ( state->modelindex == BotTeam(bs) ) + return; + // if the bot doesn't have a weapon to destroy the beartrap + //PKMOD - Ergodic - 04/14/01 - add explosive shells - duh +// bs->inventory[INVENTORY_EXPLOSIVESHOTGUN] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_EXPLODING_SHELLS)) != 0; +// bs->inventory[INVENTORY_EXPLOSIVESHELLS] = bs->cur_ps.ammo[WP_EXPLODING_SHELLS]; + + if (!(bs->inventory[INVENTORY_PKA_NAILGUN] > 0 && bs->inventory[INVENTORY_NAILS] > 0) && + !(bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && bs->inventory[INVENTORY_ROCKETS] > 0) && + !(bs->inventory[INVENTORY_EXPLOSIVESHOTGUN] > 0 && bs->inventory[INVENTORY_EXPLOSIVESHELLS] > 0) && + !(bs->inventory[INVENTORY_SHOTGUN] > 0 && bs->inventory[INVENTORY_SHELLS] > 0) && + !(bs->inventory[INVENTORY_RAILGUN] > 0 && bs->inventory[INVENTORY_SLUGS] > 0) ) { + return; + } + // try to avoid the autosentry + //PKMOD - Ergodic - 08/30/01 - set avoid spot size to 400 + trap_BotAddAvoidSpot(bs->ms, state->pos.trBase, 400, AVOID_ALWAYS); + // + if ( bs->numautosentrys >= MAX_AUTOSENTRYS ) + return; + bs->autosentrys[bs->numautosentrys] = state->number; + bs->numautosentrys++; +} + + +/* +================== +BotCheckForGravityWells +//PKMOD - Ergodic 08/30/01 - new code for bots to avoid Gravity Wells +================== +*/ +void BotCheckForGravityWells(bot_state_t *bs, entityState_t *state) { + // if this is not a Beartrap + if ( state->eType != ET_GRAVITY_WELL || state->weapon != WP_SENTRY ) + return; + + // try to avoid the Gravity Well + //PKMOD - Ergodic - 08/30/01 - set avoid spot size to 1000 [Note: gw radius is 1200 - grin] + trap_BotAddAvoidSpot(bs->ms, state->pos.trBase, 1000, AVOID_ALWAYS); + // + if ( bs->numgravitywells >= MAX_GRAVITYWELLS ) + return; + bs->gravitywells[bs->numgravitywells] = state->number; + bs->numgravitywells++; +} + +#ifdef MISSIONPACK +/* +================== +BotCheckForProxMines +================== +*/ +void BotCheckForProxMines(bot_state_t *bs, entityState_t *state) { + // if this is not a prox mine + if (state->eType != ET_MISSILE || state->weapon != WP_PROX_LAUNCHER) + return; + // if this prox mine is from someone on our own team + if (state->generic1 == BotTeam(bs)) + return; + // if the bot doesn't have a weapon to deactivate the mine + if (!(bs->inventory[INVENTORY_PLASMAGUN] > 0 && bs->inventory[INVENTORY_CELLS] > 0) && + !(bs->inventory[INVENTORY_ROCKETLAUNCHER] > 0 && bs->inventory[INVENTORY_ROCKETS] > 0) && + !(bs->inventory[INVENTORY_BFG10K] > 0 && bs->inventory[INVENTORY_BFGAMMO] > 0) ) { + return; + } + // try to avoid the prox mine + trap_BotAddAvoidSpot(bs->ms, state->pos.trBase, 160, AVOID_ALWAYS); + // + if (bs->numproxmines >= MAX_PROXMINES) + return; + bs->proxmines[bs->numproxmines] = state->number; + bs->numproxmines++; +} + +/* +================== +BotCheckForKamikazeBody +================== +*/ +void BotCheckForKamikazeBody(bot_state_t *bs, entityState_t *state) { + // if this entity is not wearing the kamikaze + if (!(state->eFlags & EF_KAMIKAZE)) + return; + // if this entity isn't dead + if (!(state->eFlags & EF_DEAD)) + return; + //remember this kamikaze body + bs->kamikazebody = state->number; +} +#endif + +/* +================== +BotCheckEvents +================== +*/ +void BotCheckEvents(bot_state_t *bs, entityState_t *state) { + int event; + char buf[128]; +#ifdef MISSIONPACK + aas_entityinfo_t entinfo; +#endif + + //NOTE: this sucks, we're accessing the gentity_t directly + //but there's no other fast way to do it right now + if (bs->entityeventTime[state->number] == g_entities[state->number].eventTime) { + return; + } + bs->entityeventTime[state->number] = g_entities[state->number].eventTime; + //if it's an event only entity + if (state->eType > ET_EVENTS) { + event = (state->eType - ET_EVENTS) & ~EV_EVENT_BITS; + } + else { + event = state->event & ~EV_EVENT_BITS; + } + // + switch(event) { + //client obituary event + case EV_OBITUARY: + { + int target, attacker, mod; + + target = state->otherEntityNum; + attacker = state->otherEntityNum2; + mod = state->eventParm; + // + if (target == bs->client) { + bs->botdeathtype = mod; + bs->lastkilledby = attacker; + // + if (target == attacker || + target == ENTITYNUM_NONE || + target == ENTITYNUM_WORLD) bs->botsuicide = qtrue; + else bs->botsuicide = qfalse; + // + bs->num_deaths++; + } + //else if this client was killed by the bot + else if (attacker == bs->client) { + bs->enemydeathtype = mod; + bs->lastkilledplayer = target; + bs->killedenemy_time = FloatTime(); + // + bs->num_kills++; + } + else if (attacker == bs->enemy && target == attacker) { + bs->enemysuicide = qtrue; + } + // +#ifdef MISSIONPACK + if (gametype == GT_1FCTF) { + // + BotEntityInfo(target, &entinfo); + if ( entinfo.powerups & ( 1 << PW_NEUTRALFLAG ) ) { + if (!BotSameTeam(bs, target)) { + bs->neutralflagstatus = 3; //enemy dropped the flag + bs->flagstatuschanged = qtrue; + } + } + } +#endif + break; + } + case EV_GLOBAL_SOUND: + { + if (state->eventParm < 0 || state->eventParm > MAX_SOUNDS) { + BotAI_Print(PRT_ERROR, "EV_GLOBAL_SOUND: eventParm (%d) out of range\n", state->eventParm); + break; + } + trap_GetConfigstring(CS_SOUNDS + state->eventParm, buf, sizeof(buf)); + /* + if (!strcmp(buf, "sound/teamplay/flagret_red.wav")) { + //red flag is returned + bs->redflagstatus = 0; + bs->flagstatuschanged = qtrue; + } + else if (!strcmp(buf, "sound/teamplay/flagret_blu.wav")) { + //blue flag is returned + bs->blueflagstatus = 0; + bs->flagstatuschanged = qtrue; + } + else*/ +#ifdef MISSIONPACK + if (!strcmp(buf, "sound/items/kamikazerespawn.wav" )) { + //the kamikaze respawned so dont avoid it + BotDontAvoid(bs, "Kamikaze"); + } + else +#endif + if (!strcmp(buf, "sound/items/poweruprespawn.wav")) { + //powerup respawned... go get it + BotGoForPowerups(bs); + } + break; + } + case EV_GLOBAL_TEAM_SOUND: + { + if (gametype == GT_CTF) { + switch(state->eventParm) { + case GTS_RED_CAPTURE: + bs->blueflagstatus = 0; + bs->redflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; //see BotMatch_CTF + case GTS_BLUE_CAPTURE: + bs->blueflagstatus = 0; + bs->redflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; //see BotMatch_CTF + case GTS_RED_RETURN: + //blue flag is returned + bs->blueflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; + case GTS_BLUE_RETURN: + //red flag is returned + bs->redflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; + case GTS_RED_TAKEN: + //blue flag is taken + bs->blueflagstatus = 1; + bs->flagstatuschanged = qtrue; + break; //see BotMatch_CTF + case GTS_BLUE_TAKEN: + //red flag is taken + bs->redflagstatus = 1; + bs->flagstatuschanged = qtrue; + break; //see BotMatch_CTF + } + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + switch(state->eventParm) { + case GTS_RED_CAPTURE: + bs->neutralflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; + case GTS_BLUE_CAPTURE: + bs->neutralflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; + case GTS_RED_RETURN: + //flag has returned + bs->neutralflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; + case GTS_BLUE_RETURN: + //flag has returned + bs->neutralflagstatus = 0; + bs->flagstatuschanged = qtrue; + break; + case GTS_RED_TAKEN: + bs->neutralflagstatus = BotTeam(bs) == TEAM_RED ? 2 : 1; //FIXME: check Team_TakeFlagSound in g_team.c + bs->flagstatuschanged = qtrue; + break; + case GTS_BLUE_TAKEN: + bs->neutralflagstatus = BotTeam(bs) == TEAM_BLUE ? 2 : 1; //FIXME: check Team_TakeFlagSound in g_team.c + bs->flagstatuschanged = qtrue; + break; + } + } +#endif + break; + } + case EV_PLAYER_TELEPORT_IN: + { + VectorCopy(state->origin, lastteleport_origin); + lastteleport_time = FloatTime(); + break; + } + case EV_GENERAL_SOUND: + { + //if this sound is played on the bot + if (state->number == bs->client) { + if (state->eventParm < 0 || state->eventParm > MAX_SOUNDS) { + BotAI_Print(PRT_ERROR, "EV_GENERAL_SOUND: eventParm (%d) out of range\n", state->eventParm); + break; + } + //check out the sound + trap_GetConfigstring(CS_SOUNDS + state->eventParm, buf, sizeof(buf)); + //if falling into a death pit + if (!strcmp(buf, "*falling1.wav")) { + //if the bot has a personal teleporter + if (bs->inventory[INVENTORY_TELEPORTER] > 0) { + //PKMOD - Ergodic 03/17/04 - set the active holdable item for the BOT + g_entities[bs->entitynum].client->ps.stats[STAT_ACTIVE_HOLDABLE] = HI_TELEPORTER; + //use the holdable item + trap_EA_Use(bs->client); + } + } + } + break; + } + case EV_FOOTSTEP: + case EV_FOOTSTEP_METAL: + case EV_FOOTSPLASH: + case EV_FOOTWADE: + case EV_SWIM: + case EV_FALL_SHORT: + case EV_FALL_MEDIUM: + case EV_FALL_FAR: + case EV_STEP_4: + case EV_STEP_8: + case EV_STEP_12: + case EV_STEP_16: + case EV_JUMP_PAD: + case EV_JUMP: + case EV_TAUNT: + case EV_WATER_TOUCH: + case EV_WATER_LEAVE: + case EV_WATER_UNDER: + case EV_WATER_CLEAR: + case EV_ITEM_PICKUP: + case EV_GLOBAL_ITEM_PICKUP: + case EV_NOAMMO: + case EV_CHANGE_WEAPON: + case EV_FIRE_WEAPON: + //FIXME: either add to sound queue or mark player as someone making noise + break; + case EV_USE_ITEM0: + case EV_USE_ITEM1: + case EV_USE_ITEM2: + case EV_USE_ITEM3: + case EV_USE_ITEM4: + case EV_USE_ITEM5: + case EV_USE_ITEM6: + case EV_USE_ITEM7: + case EV_USE_ITEM8: + case EV_USE_ITEM9: + case EV_USE_ITEM10: + case EV_USE_ITEM11: + case EV_USE_ITEM12: + case EV_USE_ITEM13: + case EV_USE_ITEM14: + break; + } +} + +/* +================== +BotCheckSnapshot +================== +*/ +void BotCheckSnapshot(bot_state_t *bs) { + int ent; + entityState_t state; + + //remove all avoid spots + trap_BotAddAvoidSpot(bs->ms, vec3_origin, 0, AVOID_CLEAR); + + //PKMOD - Ergodic 08/30/01 - remove these fields in PKA + /*++++ + //reset kamikaze body + bs->kamikazebody = 0; + //reset number of proxmines + bs->numproxmines = 0; + ----*/ + + //PKMOD - Ergodic 04/14/01 - reset number of beartraps + bs->numbeartraps = 0; + //PKMOD - Ergodic 08/30/01 - reset number of autosentrys + bs->numautosentrys = 0; + //PKMOD - Ergodic 08/30/01 - reset number of gravitywells + bs->numgravitywells = 0; + + // + ent = 0; + while( ( ent = BotAI_GetSnapshotEntity( bs->client, ent, &state ) ) != -1 ) { + //check the entity state for events + BotCheckEvents(bs, &state); + //check for grenades the bot should avoid + BotCheckForGrenades(bs, &state); + //PKMOD - Ergodic 04/14/01 - check for beartraps which the bot should destroy + BotCheckForAutosentrys(bs, &state); + //PKMOD - Ergodic 04/14/01 - check for beartraps which the bot should destroy + BotCheckForBeartraps(bs, &state); + // +#ifdef MISSIONPACK + //check for proximity mines which the bot should deactivate + BotCheckForProxMines(bs, &state); + //check for dead bodies with the kamikaze effect which should be gibbed + BotCheckForKamikazeBody(bs, &state); +#endif + } + //check the player state for events + BotAI_GetEntityState(bs->client, &state); + //copy the player state events to the entity state + state.event = bs->cur_ps.externalEvent; + state.eventParm = bs->cur_ps.externalEventParm; + // + BotCheckEvents(bs, &state); +} + +/* +================== +BotCheckAir +================== +*/ +void BotCheckAir(bot_state_t *bs) { + if (bs->inventory[INVENTORY_ENVIRONMENTSUIT] <= 0) { + if (trap_AAS_PointContents(bs->eye) & (CONTENTS_WATER|CONTENTS_SLIME|CONTENTS_LAVA)) { + return; + } + } + bs->lastair_time = FloatTime(); +} + +/* +================== +BotAlternateRoute +================== +*/ +bot_goal_t *BotAlternateRoute(bot_state_t *bs, bot_goal_t *goal) { + int t; + + // if the bot has an alternative route goal + if (bs->altroutegoal.areanum) { + // + if (bs->reachedaltroutegoal_time) + return goal; + // travel time towards alternative route goal + t = trap_AAS_AreaTravelTimeToGoalArea(bs->areanum, bs->origin, bs->altroutegoal.areanum, bs->tfl); + if (t && t < 20) { + //BotAI_Print(PRT_MESSAGE, "reached alternate route goal\n"); + bs->reachedaltroutegoal_time = FloatTime(); + } + memcpy(goal, &bs->altroutegoal, sizeof(bot_goal_t)); + return &bs->altroutegoal; + } + return goal; +} + +/* +================== +BotGetAlternateRouteGoal +================== +*/ +int BotGetAlternateRouteGoal(bot_state_t *bs, int base) { + aas_altroutegoal_t *altroutegoals; + bot_goal_t *goal; + int numaltroutegoals, rnd; + + if (base == TEAM_RED) { + altroutegoals = red_altroutegoals; + numaltroutegoals = red_numaltroutegoals; + } + else { + altroutegoals = blue_altroutegoals; + numaltroutegoals = blue_numaltroutegoals; + } + if (!numaltroutegoals) + return qfalse; + rnd = (float) random() * numaltroutegoals; + if (rnd >= numaltroutegoals) + rnd = numaltroutegoals-1; + goal = &bs->altroutegoal; + goal->areanum = altroutegoals[rnd].areanum; + VectorCopy(altroutegoals[rnd].origin, goal->origin); + VectorSet(goal->mins, -8, -8, -8); + VectorSet(goal->maxs, 8, 8, 8); + goal->entitynum = 0; + goal->iteminfo = 0; + goal->number = 0; + goal->flags = 0; + // + bs->reachedaltroutegoal_time = 0; + return qtrue; +} + +/* +================== +BotSetupAlternateRouteGoals +================== +*/ +void BotSetupAlternativeRouteGoals(void) { + + if (altroutegoals_setup) + return; +#ifdef MISSIONPACK + if (gametype == GT_CTF) { + if (trap_BotGetLevelItemGoal(-1, "Neutral Flag", &ctf_neutralflag) < 0) + BotAI_Print(PRT_WARNING, "no alt routes without Neutral Flag\n"); + if (ctf_neutralflag.areanum) { + // + red_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + ctf_neutralflag.origin, ctf_neutralflag.areanum, + ctf_redflag.origin, ctf_redflag.areanum, TFL_DEFAULT, + red_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + blue_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + ctf_neutralflag.origin, ctf_neutralflag.areanum, + ctf_blueflag.origin, ctf_blueflag.areanum, TFL_DEFAULT, + blue_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + } + } + else if (gametype == GT_1FCTF) { + // + red_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + ctf_neutralflag.origin, ctf_neutralflag.areanum, + ctf_redflag.origin, ctf_redflag.areanum, TFL_DEFAULT, + red_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + blue_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + ctf_neutralflag.origin, ctf_neutralflag.areanum, + ctf_blueflag.origin, ctf_blueflag.areanum, TFL_DEFAULT, + blue_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + } + else if (gametype == GT_OBELISK) { + if (trap_BotGetLevelItemGoal(-1, "Neutral Obelisk", &neutralobelisk) < 0) + BotAI_Print(PRT_WARNING, "Harvester without neutral obelisk\n"); + // + red_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + neutralobelisk.origin, neutralobelisk.areanum, + redobelisk.origin, redobelisk.areanum, TFL_DEFAULT, + red_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + blue_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + neutralobelisk.origin, neutralobelisk.areanum, + blueobelisk.origin, blueobelisk.areanum, TFL_DEFAULT, + blue_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + } + else if (gametype == GT_HARVESTER) { + // + red_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + neutralobelisk.origin, neutralobelisk.areanum, + redobelisk.origin, redobelisk.areanum, TFL_DEFAULT, + red_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + blue_numaltroutegoals = trap_AAS_AlternativeRouteGoals( + neutralobelisk.origin, neutralobelisk.areanum, + blueobelisk.origin, blueobelisk.areanum, TFL_DEFAULT, + blue_altroutegoals, MAX_ALTROUTEGOALS, + ALTROUTEGOAL_CLUSTERPORTALS| + ALTROUTEGOAL_VIEWPORTALS); + } +#endif + altroutegoals_setup = qtrue; +} + +/* +================== +BotDeathmatchAI +================== +*/ +void BotDeathmatchAI(bot_state_t *bs, float thinktime) { + char gender[144], name[144], buf[144]; + char userinfo[MAX_INFO_STRING]; + int i; + + //if the bot has just been setup + if (bs->setupcount > 0) { + bs->setupcount--; + if (bs->setupcount > 0) return; + //get the gender characteristic + trap_Characteristic_String(bs->character, CHARACTERISTIC_GENDER, gender, sizeof(gender)); + //set the bot gender + trap_GetUserinfo(bs->client, userinfo, sizeof(userinfo)); + Info_SetValueForKey(userinfo, "sex", gender); + trap_SetUserinfo(bs->client, userinfo); + //set the team + if ( !bs->map_restart && g_gametype.integer != GT_TOURNAMENT ) { + Com_sprintf(buf, sizeof(buf), "team %s", bs->settings.team); + trap_EA_Command(bs->client, buf); + } + //set the chat gender + if (gender[0] == 'm') trap_BotSetChatGender(bs->cs, CHAT_GENDERMALE); + else if (gender[0] == 'f') trap_BotSetChatGender(bs->cs, CHAT_GENDERFEMALE); + else trap_BotSetChatGender(bs->cs, CHAT_GENDERLESS); + //set the chat name + ClientName(bs->client, name, sizeof(name)); + trap_BotSetChatName(bs->cs, name, bs->client); + // + bs->lastframe_health = bs->inventory[INVENTORY_HEALTH]; + bs->lasthitcount = bs->cur_ps.persistant[PERS_HITS]; + // + bs->setupcount = 0; + // + BotSetupAlternativeRouteGoals(); + } + //no ideal view set + bs->flags &= ~BFL_IDEALVIEWSET; + // + if (!BotIntermission(bs)) { + //set the teleport time + BotSetTeleportTime(bs); + //update some inventory values + BotUpdateInventory(bs); + //check out the snapshot + BotCheckSnapshot(bs); + //check for air + BotCheckAir(bs); + } + //check the console messages + BotCheckConsoleMessages(bs); + //if not in the intermission and not in observer mode + if (!BotIntermission(bs) && !BotIsObserver(bs)) { + //do team AI + BotTeamAI(bs); + } + //if the bot has no ai node + if (!bs->ainode) { + AIEnter_Seek_LTG(bs, "BotDeathmatchAI: no ai node"); + } + //if the bot entered the game less than 8 seconds ago + if (!bs->entergamechat && bs->entergame_time > FloatTime() - 8) { + if (BotChat_EnterGame(bs)) { + bs->stand_time = FloatTime() + BotChatTime(bs); + AIEnter_Stand(bs, "BotDeathmatchAI: chat enter game"); + } + bs->entergamechat = qtrue; + } + //reset the node switches from the previous frame + BotResetNodeSwitches(); + //execute AI nodes + for (i = 0; i < MAX_NODESWITCHES; i++) { + if (bs->ainode(bs)) break; + } + //if the bot removed itself :) + if (!bs->inuse) return; + //if the bot executed too many AI nodes + if (i >= MAX_NODESWITCHES) { + trap_BotDumpGoalStack(bs->gs); + trap_BotDumpAvoidGoals(bs->gs); + BotDumpNodeSwitches(bs); + ClientName(bs->client, name, sizeof(name)); + BotAI_Print(PRT_ERROR, "%s at %1.1f switched more than %d AI nodes\n", name, FloatTime(), MAX_NODESWITCHES); + } + // + bs->lastframe_health = bs->inventory[INVENTORY_HEALTH]; + bs->lasthitcount = bs->cur_ps.persistant[PERS_HITS]; +} + +/* +================== +BotSetEntityNumForGoalWithModel +================== +*/ +void BotSetEntityNumForGoalWithModel(bot_goal_t *goal, int eType, char *modelname) { + gentity_t *ent; + int i, modelindex; + vec3_t dir; + + modelindex = G_ModelIndex( modelname ); + ent = &g_entities[0]; + for (i = 0; i < level.num_entities; i++, ent++) { + if ( !ent->inuse ) { + continue; + } + if ( eType && ent->s.eType != eType) { + continue; + } + if (ent->s.modelindex != modelindex) { + continue; + } + VectorSubtract(goal->origin, ent->s.origin, dir); + if (VectorLengthSquared(dir) < Square(10)) { + goal->entitynum = i; + return; + } + } +} + +/* +================== +BotSetEntityNumForGoal +================== +*/ +void BotSetEntityNumForGoal(bot_goal_t *goal, char *classname) { + gentity_t *ent; + int i; + vec3_t dir; + + ent = &g_entities[0]; + for (i = 0; i < level.num_entities; i++, ent++) { + if ( !ent->inuse ) { + continue; + } + if ( !Q_stricmp(ent->classname, classname) ) { + continue; + } + VectorSubtract(goal->origin, ent->s.origin, dir); + if (VectorLengthSquared(dir) < Square(10)) { + goal->entitynum = i; + return; + } + } +} + +/* +================== +BotGoalForBSPEntity +================== +*/ +int BotGoalForBSPEntity( char *classname, bot_goal_t *goal ) { + char value[MAX_INFO_STRING]; + vec3_t origin, start, end; + int ent, numareas, areas[10]; + + memset(goal, 0, sizeof(bot_goal_t)); + for (ent = trap_AAS_NextBSPEntity(0); ent; ent = trap_AAS_NextBSPEntity(ent)) { + if (!trap_AAS_ValueForBSPEpairKey(ent, "classname", value, sizeof(value))) + continue; + if (!strcmp(value, classname)) { + if (!trap_AAS_VectorForBSPEpairKey(ent, "origin", origin)) + return qfalse; + VectorCopy(origin, goal->origin); + VectorCopy(origin, start); + start[2] -= 32; + VectorCopy(origin, end); + end[2] += 32; + numareas = trap_AAS_TraceAreas(start, end, areas, NULL, 10); + if (!numareas) + return qfalse; + goal->areanum = areas[0]; + return qtrue; + } + } + return qfalse; +} + +/* +================== +BotSetupDeathmatchAI +================== +*/ +void BotSetupDeathmatchAI(void) { + int ent, modelnum; + char model[128]; + + gametype = trap_Cvar_VariableIntegerValue("g_gametype"); + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + trap_Cvar_Register(&bot_rocketjump, "bot_rocketjump", "1", 0); + + //PKMOD - Ergodic 12/02/01 - debug: setting bot_dragon to 1 (inactive) +// Com_Printf("BotSetupDeathmatchAI - setting bot_dragon to 1\n" ); + +//PKMOD - Ergodic 12/02/01 - set default to "1" so that bots will use grapple +// trap_Cvar_Register(&bot_grapple, "bot_grapple", "1", 0); +//PKMOD - Ergodic 02/11/02 - change the cvar flags +//PKMOD - Ergodic 02/11/02 - move bot_grapple to g_bot.c:G_InitBots +// trap_Cvar_Register(&bot_grapple, "bot_grapple", "1", CVAR_SERVERINFO | CVAR_USERINFO | CVAR_LATCH); + trap_Cvar_Register(&bot_grapple, "bot_grapple", "0", 0); + trap_Cvar_Register(&bot_fastchat, "bot_fastchat", "0", 0); + trap_Cvar_Register(&bot_nochat, "bot_nochat", "0", 0); + trap_Cvar_Register(&bot_testrchat, "bot_testrchat", "0", 0); + trap_Cvar_Register(&bot_challenge, "bot_challenge", "0", 0); + trap_Cvar_Register(&bot_predictobstacles, "bot_predictobstacles", "1", 0); + trap_Cvar_Register(&g_spSkill, "g_spSkill", "2", 0); + + //PKMOD - Ergodic 12/02/01 - set default to "1" so that bots will use grapple + trap_Cvar_Register(&g_spSkill, "bot_dragon", "1", CVAR_SERVERINFO | CVAR_USERINFO | CVAR_LATCH); + + // + if (gametype == GT_CTF) { + if (trap_BotGetLevelItemGoal(-1, "Red Flag", &ctf_redflag) < 0) + BotAI_Print(PRT_WARNING, "CTF without Red Flag\n"); + if (trap_BotGetLevelItemGoal(-1, "Blue Flag", &ctf_blueflag) < 0) + BotAI_Print(PRT_WARNING, "CTF without Blue Flag\n"); + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (trap_BotGetLevelItemGoal(-1, "Neutral Flag", &ctf_neutralflag) < 0) + BotAI_Print(PRT_WARNING, "One Flag CTF without Neutral Flag\n"); + if (trap_BotGetLevelItemGoal(-1, "Red Flag", &ctf_redflag) < 0) + BotAI_Print(PRT_WARNING, "CTF without Red Flag\n"); + if (trap_BotGetLevelItemGoal(-1, "Blue Flag", &ctf_blueflag) < 0) + BotAI_Print(PRT_WARNING, "CTF without Blue Flag\n"); + } + else if (gametype == GT_OBELISK) { + if (trap_BotGetLevelItemGoal(-1, "Red Obelisk", &redobelisk) < 0) + BotAI_Print(PRT_WARNING, "Obelisk without red obelisk\n"); + BotSetEntityNumForGoal(&redobelisk, "team_redobelisk"); + if (trap_BotGetLevelItemGoal(-1, "Blue Obelisk", &blueobelisk) < 0) + BotAI_Print(PRT_WARNING, "Obelisk without blue obelisk\n"); + BotSetEntityNumForGoal(&blueobelisk, "team_blueobelisk"); + } + else if (gametype == GT_HARVESTER) { + if (trap_BotGetLevelItemGoal(-1, "Red Obelisk", &redobelisk) < 0) + BotAI_Print(PRT_WARNING, "Harvester without red obelisk\n"); + BotSetEntityNumForGoal(&redobelisk, "team_redobelisk"); + if (trap_BotGetLevelItemGoal(-1, "Blue Obelisk", &blueobelisk) < 0) + BotAI_Print(PRT_WARNING, "Harvester without blue obelisk\n"); + BotSetEntityNumForGoal(&blueobelisk, "team_blueobelisk"); + if (trap_BotGetLevelItemGoal(-1, "Neutral Obelisk", &neutralobelisk) < 0) + BotAI_Print(PRT_WARNING, "Harvester without neutral obelisk\n"); + BotSetEntityNumForGoal(&neutralobelisk, "team_neutralobelisk"); + } +#endif + + max_bspmodelindex = 0; + for (ent = trap_AAS_NextBSPEntity(0); ent; ent = trap_AAS_NextBSPEntity(ent)) { + if (!trap_AAS_ValueForBSPEpairKey(ent, "model", model, sizeof(model))) continue; + if (model[0] == '*') { + modelnum = atoi(model+1); + if (modelnum > max_bspmodelindex) + max_bspmodelindex = modelnum; + } + } + //initialize the waypoint heap + BotInitWaypoints(); +} + +/* +================== +BotShutdownDeathmatchAI +================== +*/ +void BotShutdownDeathmatchAI(void) { + altroutegoals_setup = qfalse; +} + diff --git a/quake3/source/code/game/ai_dmq3.h b/quake3/source/code/game/ai_dmq3.h new file mode 100644 index 0000000..0860c18 --- /dev/null +++ b/quake3/source/code/game/ai_dmq3.h @@ -0,0 +1,197 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_dmq3.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_chat.c $ + * + *****************************************************************************/ + +//setup the deathmatch AI +void BotSetupDeathmatchAI(void); +//shutdown the deathmatch AI +void BotShutdownDeathmatchAI(void); +//let the bot live within it's deathmatch AI net +void BotDeathmatchAI(bot_state_t *bs, float thinktime); +//free waypoints +void BotFreeWaypoints(bot_waypoint_t *wp); + +//PKMOD - Ergodic 04/15/01 - bots will select beans at low health times +void BotEatBeans(bot_state_t *bs); + +//choose a weapon +void BotChooseWeapon(bot_state_t *bs); +//setup movement stuff +void BotSetupForMovement(bot_state_t *bs); +//update the inventory +void BotUpdateInventory(bot_state_t *bs); +//update the inventory during battle +void BotUpdateBattleInventory(bot_state_t *bs, int enemy); +//use holdable items during battle +void BotBattleUseItems(bot_state_t *bs); +//return true if the bot is dead +qboolean BotIsDead(bot_state_t *bs); +//returns true if the bot is in observer mode +qboolean BotIsObserver(bot_state_t *bs); +//returns true if the bot is in the intermission +qboolean BotIntermission(bot_state_t *bs); +//returns true if the bot is in lava or slime +qboolean BotInLavaOrSlime(bot_state_t *bs); +//returns true if the entity is dead +qboolean EntityIsDead(aas_entityinfo_t *entinfo); +//returns true if the entity is invisible +qboolean EntityIsInvisible(aas_entityinfo_t *entinfo); +//returns true if the entity is shooting +qboolean EntityIsShooting(aas_entityinfo_t *entinfo); +#ifdef MISSIONPACK +//returns true if this entity has the kamikaze +qboolean EntityHasKamikaze(aas_entityinfo_t *entinfo); +#endif +// set a user info key/value pair +void BotSetUserInfo(bot_state_t *bs, char *key, char *value); +// set the team status (offense, defense etc.) +void BotSetTeamStatus(bot_state_t *bs); + +//returns the name of the client +char *ClientName(int client, char *name, int size); + +//returns an simplyfied client name +char *EasyClientName(int client, char *name, int size); + +//returns the skin used by the client +char *ClientSkin(int client, char *skin, int size); +// returns the appropriate synonym context for the current game type and situation +int BotSynonymContext(bot_state_t *bs); +// set last ordered task +int BotSetLastOrderedTask(bot_state_t *bs); +// selection of goals for teamplay +void BotTeamGoals(bot_state_t *bs, int retreat); +//returns the aggression of the bot in the range [0, 100] +float BotAggression(bot_state_t *bs); +//returns how bad the bot feels +float BotFeelingBad(bot_state_t *bs); +//returns true if the bot wants to retreat +int BotWantsToRetreat(bot_state_t *bs); +//returns true if the bot wants to chase +int BotWantsToChase(bot_state_t *bs); +//returns true if the bot wants to help +int BotWantsToHelp(bot_state_t *bs); +//returns true if the bot can and wants to rocketjump +int BotCanAndWantsToRocketJump(bot_state_t *bs); +// returns true if the bot has a persistant powerup and a weapon +int BotHasPersistantPowerupAndWeapon(bot_state_t *bs); +//returns true if the bot wants to and goes camping +int BotWantsToCamp(bot_state_t *bs); +//the bot will perform attack movements +bot_moveresult_t BotAttackMove(bot_state_t *bs, int tfl); +//returns true if the bot and the entity are in the same team +int BotSameTeam(bot_state_t *bs, int entnum); +//returns true if teamplay is on +int TeamPlayIsOn(void); +// returns the client number of the team mate flag carrier (-1 if none) +int BotTeamFlagCarrier(bot_state_t *bs); +//returns visible team mate flag carrier if available +int BotTeamFlagCarrierVisible(bot_state_t *bs); +//returns visible enemy flag carrier if available +int BotEnemyFlagCarrierVisible(bot_state_t *bs); +//get the number of visible teammates and enemies +void BotVisibleTeamMatesAndEnemies(bot_state_t *bs, int *teammates, int *enemies, float range); +//returns true if within the field of vision for the given angles +qboolean InFieldOfVision(vec3_t viewangles, float fov, vec3_t angles); +//returns true and sets the .enemy field when an enemy is found +int BotFindEnemy(bot_state_t *bs, int curenemy); +//returns a roam goal +void BotRoamGoal(bot_state_t *bs, vec3_t goal); +//returns entity visibility in the range [0, 1] +float BotEntityVisible(int viewer, vec3_t eye, vec3_t viewangles, float fov, int ent); +//the bot will aim at the current enemy +void BotAimAtEnemy(bot_state_t *bs); +//check if the bot should attack +void BotCheckAttack(bot_state_t *bs); +//AI when the bot is blocked +void BotAIBlocked(bot_state_t *bs, bot_moveresult_t *moveresult, int activate); +//AI to predict obstacles +int BotAIPredictObstacles(bot_state_t *bs, bot_goal_t *goal); +//enable or disable the areas the blocking entity is in +void BotEnableActivateGoalAreas(bot_activategoal_t *activategoal, int enable); +//pop an activate goal from the stack +int BotPopFromActivateGoalStack(bot_state_t *bs); +//clear the activate goal stack +void BotClearActivateGoalStack(bot_state_t *bs); +//returns the team the bot is in +int BotTeam(bot_state_t *bs); +//retuns the opposite team of the bot +int BotOppositeTeam(bot_state_t *bs); +//returns the flag the bot is carrying (CTFFLAG_?) +int BotCTFCarryingFlag(bot_state_t *bs); +//remember the last ordered task +void BotRememberLastOrderedTask(bot_state_t *bs); +//set ctf goals (defend base, get enemy flag) during seek +void BotCTFSeekGoals(bot_state_t *bs); +//set ctf goals (defend base, get enemy flag) during retreat +void BotCTFRetreatGoals(bot_state_t *bs); +// +#ifdef MISSIONPACK +int Bot1FCTFCarryingFlag(bot_state_t *bs); +int BotHarvesterCarryingCubes(bot_state_t *bs); +void Bot1FCTFSeekGoals(bot_state_t *bs); +void Bot1FCTFRetreatGoals(bot_state_t *bs); +void BotObeliskSeekGoals(bot_state_t *bs); +void BotObeliskRetreatGoals(bot_state_t *bs); +void BotGoHarvest(bot_state_t *bs); +void BotHarvesterSeekGoals(bot_state_t *bs); +void BotHarvesterRetreatGoals(bot_state_t *bs); +int BotTeamCubeCarrierVisible(bot_state_t *bs); +int BotEnemyCubeCarrierVisible(bot_state_t *bs); +#endif +//get a random alternate route goal towards the given base +int BotGetAlternateRouteGoal(bot_state_t *bs, int base); +//returns either the alternate route goal or the given goal +bot_goal_t *BotAlternateRoute(bot_state_t *bs, bot_goal_t *goal); +//create a new waypoint +bot_waypoint_t *BotCreateWayPoint(char *name, vec3_t origin, int areanum); +//find a waypoint with the given name +bot_waypoint_t *BotFindWayPoint(bot_waypoint_t *waypoints, char *name); +//strstr but case insensitive +char *stristr(char *str, char *charset); +//returns the number of the client with the given name +int ClientFromName(char *name); +int ClientOnSameTeamFromName(bot_state_t *bs, char *name); +// +int BotPointAreaNum(vec3_t origin); +// +void BotMapScripts(bot_state_t *bs); + +//ctf flags +#define CTF_FLAG_NONE 0 +#define CTF_FLAG_RED 1 +#define CTF_FLAG_BLUE 2 +//CTF skins +#define CTF_SKIN_REDTEAM "red" +#define CTF_SKIN_BLUETEAM "blue" + +extern int gametype; //game type +extern int maxclients; //maximum number of clients + +extern vmCvar_t bot_grapple; +extern vmCvar_t bot_rocketjump; +extern vmCvar_t bot_fastchat; +extern vmCvar_t bot_nochat; +extern vmCvar_t bot_testrchat; +extern vmCvar_t bot_challenge; + +//PKMOD - Ergodic 02/11/02 - add dragon cvar +extern vmCvar_t bot_dragon; + + +extern bot_goal_t ctf_redflag; +extern bot_goal_t ctf_blueflag; +#ifdef MISSIONPACK +extern bot_goal_t ctf_neutralflag; +extern bot_goal_t redobelisk; +extern bot_goal_t blueobelisk; +extern bot_goal_t neutralobelisk; +#endif diff --git a/quake3/source/code/game/ai_main.c b/quake3/source/code/game/ai_main.c new file mode 100644 index 0000000..3579e95 --- /dev/null +++ b/quake3/source/code/game/ai_main.c @@ -0,0 +1,1703 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_main.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_main.c $ + * + *****************************************************************************/ + + +#include "g_local.h" +#include "q_shared.h" +#include "botlib.h" //bot lib interface +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +#include "ai_vcmd.h" + +// +#include "chars.h" +#include "inv.h" +#include "syn.h" + +#define MAX_PATH 144 + + +//bot states +bot_state_t *botstates[MAX_CLIENTS]; +//number of bots +int numbots; +//floating point time +float floattime; +//time to do a regular update +float regularupdate_time; +// +int bot_interbreed; +int bot_interbreedmatchcount; +// +vmCvar_t bot_thinktime; +vmCvar_t bot_memorydump; +vmCvar_t bot_saveroutingcache; +vmCvar_t bot_pause; +vmCvar_t bot_report; +vmCvar_t bot_testsolid; +vmCvar_t bot_testclusters; +vmCvar_t bot_developer; +vmCvar_t bot_interbreedchar; +vmCvar_t bot_interbreedbots; +vmCvar_t bot_interbreedcycle; +vmCvar_t bot_interbreedwrite; + + +void ExitLevel( void ); + + +/* +================== +BotAI_Print +================== +*/ +void QDECL BotAI_Print(int type, char *fmt, ...) { + char str[2048]; + va_list ap; + + va_start(ap, fmt); + vsprintf(str, fmt, ap); + va_end(ap); + + switch(type) { + case PRT_MESSAGE: { + G_Printf("%s", str); + break; + } + case PRT_WARNING: { + G_Printf( S_COLOR_YELLOW "Warning: %s", str ); + break; + } + case PRT_ERROR: { + G_Printf( S_COLOR_RED "Error: %s", str ); + break; + } + case PRT_FATAL: { + G_Printf( S_COLOR_RED "Fatal: %s", str ); + break; + } + case PRT_EXIT: { + G_Error( S_COLOR_RED "Exit: %s", str ); + break; + } + default: { + G_Printf( "unknown print type\n" ); + break; + } + } +} + + +/* +================== +BotAI_Trace +================== +*/ +void BotAI_Trace(bsp_trace_t *bsptrace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask) { + trace_t trace; + + trap_Trace(&trace, start, mins, maxs, end, passent, contentmask); + //copy the trace information + bsptrace->allsolid = trace.allsolid; + bsptrace->startsolid = trace.startsolid; + bsptrace->fraction = trace.fraction; + VectorCopy(trace.endpos, bsptrace->endpos); + bsptrace->plane.dist = trace.plane.dist; + VectorCopy(trace.plane.normal, bsptrace->plane.normal); + bsptrace->plane.signbits = trace.plane.signbits; + bsptrace->plane.type = trace.plane.type; + bsptrace->surface.value = trace.surfaceFlags; + bsptrace->ent = trace.entityNum; + bsptrace->exp_dist = 0; + bsptrace->sidenum = 0; + bsptrace->contents = 0; +} + +/* +================== +BotAI_GetClientState +================== +*/ +int BotAI_GetClientState( int clientNum, playerState_t *state ) { + gentity_t *ent; + + ent = &g_entities[clientNum]; + if ( !ent->inuse ) { + return qfalse; + } + if ( !ent->client ) { + return qfalse; + } + + memcpy( state, &ent->client->ps, sizeof(playerState_t) ); + return qtrue; +} + +/* +================== +BotAI_GetEntityState +================== +*/ +int BotAI_GetEntityState( int entityNum, entityState_t *state ) { + gentity_t *ent; + + ent = &g_entities[entityNum]; + memset( state, 0, sizeof(entityState_t) ); + if (!ent->inuse) return qfalse; + if (!ent->r.linked) return qfalse; + if (ent->r.svFlags & SVF_NOCLIENT) return qfalse; + memcpy( state, &ent->s, sizeof(entityState_t) ); + return qtrue; +} + +/* +================== +BotAI_GetSnapshotEntity +================== +*/ +int BotAI_GetSnapshotEntity( int clientNum, int sequence, entityState_t *state ) { + int entNum; + + entNum = trap_BotGetSnapshotEntity( clientNum, sequence ); + if ( entNum == -1 ) { + memset(state, 0, sizeof(entityState_t)); + return -1; + } + + BotAI_GetEntityState( entNum, state ); + + return sequence + 1; +} + +/* +================== +BotAI_BotInitialChat +================== +*/ +void QDECL BotAI_BotInitialChat( bot_state_t *bs, char *type, ... ) { + int i, mcontext; + va_list ap; + char *p; + char *vars[MAX_MATCHVARIABLES]; + + memset(vars, 0, sizeof(vars)); + va_start(ap, type); + p = va_arg(ap, char *); + for (i = 0; i < MAX_MATCHVARIABLES; i++) { + if( !p ) { + break; + } + vars[i] = p; + p = va_arg(ap, char *); + } + va_end(ap); + + mcontext = BotSynonymContext(bs); + + trap_BotInitialChat( bs->cs, type, mcontext, vars[0], vars[1], vars[2], vars[3], vars[4], vars[5], vars[6], vars[7] ); +} + + +/* +================== +BotTestAAS +================== +*/ +void BotTestAAS(vec3_t origin) { + int areanum; + aas_areainfo_t info; + + trap_Cvar_Update(&bot_testsolid); + trap_Cvar_Update(&bot_testclusters); + if (bot_testsolid.integer) { + if (!trap_AAS_Initialized()) return; + areanum = BotPointAreaNum(origin); + if (areanum) BotAI_Print(PRT_MESSAGE, "\remtpy area"); + else BotAI_Print(PRT_MESSAGE, "\r^1SOLID area"); + } + else if (bot_testclusters.integer) { + if (!trap_AAS_Initialized()) return; + areanum = BotPointAreaNum(origin); + if (!areanum) + BotAI_Print(PRT_MESSAGE, "\r^1Solid! "); + else { + trap_AAS_AreaInfo(areanum, &info); + BotAI_Print(PRT_MESSAGE, "\rarea %d, cluster %d ", areanum, info.cluster); + } + } +} + +/* +================== +BotReportStatus +================== +*/ +void BotReportStatus(bot_state_t *bs) { + char goalname[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + char *leader, flagstatus[32]; + // + ClientName(bs->client, netname, sizeof(netname)); + if (Q_stricmp(netname, bs->teamleader) == 0) leader = "L"; + else leader = " "; + + strcpy(flagstatus, " "); + if (gametype == GT_CTF) { + if (BotCTFCarryingFlag(bs)) { + if (BotTeam(bs) == TEAM_RED) strcpy(flagstatus, S_COLOR_RED"F "); + else strcpy(flagstatus, S_COLOR_BLUE"F "); + } + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (Bot1FCTFCarryingFlag(bs)) { + if (BotTeam(bs) == TEAM_RED) strcpy(flagstatus, S_COLOR_RED"F "); + else strcpy(flagstatus, S_COLOR_BLUE"F "); + } + } + else if (gametype == GT_HARVESTER) { + if (BotHarvesterCarryingCubes(bs)) { + if (BotTeam(bs) == TEAM_RED) Com_sprintf(flagstatus, sizeof(flagstatus), S_COLOR_RED"%2d", bs->inventory[INVENTORY_REDCUBE]); + else Com_sprintf(flagstatus, sizeof(flagstatus), S_COLOR_BLUE"%2d", bs->inventory[INVENTORY_BLUECUBE]); + } + } +#endif + + switch(bs->ltgtype) { + case LTG_TEAMHELP: + { + EasyClientName(bs->teammate, goalname, sizeof(goalname)); + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: helping %s\n", netname, leader, flagstatus, goalname); + break; + } + case LTG_TEAMACCOMPANY: + { + EasyClientName(bs->teammate, goalname, sizeof(goalname)); + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: accompanying %s\n", netname, leader, flagstatus, goalname); + break; + } + case LTG_DEFENDKEYAREA: + { + trap_BotGoalName(bs->teamgoal.number, goalname, sizeof(goalname)); + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: defending %s\n", netname, leader, flagstatus, goalname); + break; + } + case LTG_GETITEM: + { + trap_BotGoalName(bs->teamgoal.number, goalname, sizeof(goalname)); + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: getting item %s\n", netname, leader, flagstatus, goalname); + break; + } + case LTG_KILL: + { + ClientName(bs->teamgoal.entitynum, goalname, sizeof(goalname)); + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: killing %s\n", netname, leader, flagstatus, goalname); + break; + } + case LTG_CAMP: + case LTG_CAMPORDER: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: camping\n", netname, leader, flagstatus); + break; + } + case LTG_PATROL: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: patrolling\n", netname, leader, flagstatus); + break; + } + case LTG_GETFLAG: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: capturing flag\n", netname, leader, flagstatus); + break; + } + case LTG_RUSHBASE: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: rushing base\n", netname, leader, flagstatus); + break; + } + case LTG_RETURNFLAG: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: returning flag\n", netname, leader, flagstatus); + break; + } + case LTG_ATTACKENEMYBASE: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: attacking the enemy base\n", netname, leader, flagstatus); + break; + } + case LTG_HARVEST: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: harvesting\n", netname, leader, flagstatus); + break; + } + default: + { + BotAI_Print(PRT_MESSAGE, "%-20s%s%s: roaming\n", netname, leader, flagstatus); + break; + } + } +} + +/* +================== +BotTeamplayReport +================== +*/ +void BotTeamplayReport(void) { + int i; + char buf[MAX_INFO_STRING]; + + BotAI_Print(PRT_MESSAGE, S_COLOR_RED"RED\n"); + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + // + if ( !botstates[i] || !botstates[i]->inuse ) continue; + // + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_RED) { + BotReportStatus(botstates[i]); + } + } + BotAI_Print(PRT_MESSAGE, S_COLOR_BLUE"BLUE\n"); + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + // + if ( !botstates[i] || !botstates[i]->inuse ) continue; + // + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_BLUE) { + BotReportStatus(botstates[i]); + } + } +} + +/* +================== +BotSetInfoConfigString +================== +*/ +void BotSetInfoConfigString(bot_state_t *bs) { + char goalname[MAX_MESSAGE_SIZE]; + char netname[MAX_MESSAGE_SIZE]; + char action[MAX_MESSAGE_SIZE]; + char *leader, carrying[32], *cs; + bot_goal_t goal; + // + ClientName(bs->client, netname, sizeof(netname)); + if (Q_stricmp(netname, bs->teamleader) == 0) leader = "L"; + else leader = " "; + + strcpy(carrying, " "); + if (gametype == GT_CTF) { + if (BotCTFCarryingFlag(bs)) { + strcpy(carrying, "F "); + } + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (Bot1FCTFCarryingFlag(bs)) { + strcpy(carrying, "F "); + } + } + else if (gametype == GT_HARVESTER) { + if (BotHarvesterCarryingCubes(bs)) { + if (BotTeam(bs) == TEAM_RED) Com_sprintf(carrying, sizeof(carrying), "%2d", bs->inventory[INVENTORY_REDCUBE]); + else Com_sprintf(carrying, sizeof(carrying), "%2d", bs->inventory[INVENTORY_BLUECUBE]); + } + } +#endif + + switch(bs->ltgtype) { + case LTG_TEAMHELP: + { + EasyClientName(bs->teammate, goalname, sizeof(goalname)); + Com_sprintf(action, sizeof(action), "helping %s", goalname); + break; + } + case LTG_TEAMACCOMPANY: + { + EasyClientName(bs->teammate, goalname, sizeof(goalname)); + Com_sprintf(action, sizeof(action), "accompanying %s", goalname); + break; + } + case LTG_DEFENDKEYAREA: + { + trap_BotGoalName(bs->teamgoal.number, goalname, sizeof(goalname)); + Com_sprintf(action, sizeof(action), "defending %s", goalname); + break; + } + case LTG_GETITEM: + { + trap_BotGoalName(bs->teamgoal.number, goalname, sizeof(goalname)); + Com_sprintf(action, sizeof(action), "getting item %s", goalname); + break; + } + case LTG_KILL: + { + ClientName(bs->teamgoal.entitynum, goalname, sizeof(goalname)); + Com_sprintf(action, sizeof(action), "killing %s", goalname); + break; + } + case LTG_CAMP: + case LTG_CAMPORDER: + { + Com_sprintf(action, sizeof(action), "camping"); + break; + } + case LTG_PATROL: + { + Com_sprintf(action, sizeof(action), "patrolling"); + break; + } + case LTG_GETFLAG: + { + Com_sprintf(action, sizeof(action), "capturing flag"); + break; + } + case LTG_RUSHBASE: + { + Com_sprintf(action, sizeof(action), "rushing base"); + break; + } + case LTG_RETURNFLAG: + { + Com_sprintf(action, sizeof(action), "returning flag"); + break; + } + case LTG_ATTACKENEMYBASE: + { + Com_sprintf(action, sizeof(action), "attacking the enemy base"); + break; + } + case LTG_HARVEST: + { + Com_sprintf(action, sizeof(action), "harvesting"); + break; + } + default: + { + trap_BotGetTopGoal(bs->gs, &goal); + trap_BotGoalName(goal.number, goalname, sizeof(goalname)); + Com_sprintf(action, sizeof(action), "roaming %s", goalname); + break; + } + } + cs = va("l\\%s\\c\\%s\\a\\%s", + leader, + carrying, + action); + trap_SetConfigstring (CS_BOTINFO + bs->client, cs); +} + +/* +============== +BotUpdateInfoConfigStrings +============== +*/ +void BotUpdateInfoConfigStrings(void) { + int i; + char buf[MAX_INFO_STRING]; + + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + // + if ( !botstates[i] || !botstates[i]->inuse ) + continue; + // + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) + continue; + BotSetInfoConfigString(botstates[i]); + } +} + +/* +============== +BotInterbreedBots +============== +*/ +void BotInterbreedBots(void) { + float ranks[MAX_CLIENTS]; + int parent1, parent2, child; + int i; + + // get rankings for all the bots + for (i = 0; i < MAX_CLIENTS; i++) { + if ( botstates[i] && botstates[i]->inuse ) { + ranks[i] = botstates[i]->num_kills * 2 - botstates[i]->num_deaths; + } + else { + ranks[i] = -1; + } + } + + if (trap_GeneticParentsAndChildSelection(MAX_CLIENTS, ranks, &parent1, &parent2, &child)) { + trap_BotInterbreedGoalFuzzyLogic(botstates[parent1]->gs, botstates[parent2]->gs, botstates[child]->gs); + trap_BotMutateGoalFuzzyLogic(botstates[child]->gs, 1); + } + // reset the kills and deaths + for (i = 0; i < MAX_CLIENTS; i++) { + if (botstates[i] && botstates[i]->inuse) { + botstates[i]->num_kills = 0; + botstates[i]->num_deaths = 0; + } + } +} + +/* +============== +BotWriteInterbreeded +============== +*/ +void BotWriteInterbreeded(char *filename) { + float rank, bestrank; + int i, bestbot; + + bestrank = 0; + bestbot = -1; + // get the best bot + for (i = 0; i < MAX_CLIENTS; i++) { + if ( botstates[i] && botstates[i]->inuse ) { + rank = botstates[i]->num_kills * 2 - botstates[i]->num_deaths; + } + else { + rank = -1; + } + if (rank > bestrank) { + bestrank = rank; + bestbot = i; + } + } + if (bestbot >= 0) { + //write out the new goal fuzzy logic + trap_BotSaveGoalFuzzyLogic(botstates[bestbot]->gs, filename); + } +} + +/* +============== +BotInterbreedEndMatch + +add link back into ExitLevel? +============== +*/ +void BotInterbreedEndMatch(void) { + + if (!bot_interbreed) return; + bot_interbreedmatchcount++; + if (bot_interbreedmatchcount >= bot_interbreedcycle.integer) { + bot_interbreedmatchcount = 0; + // + trap_Cvar_Update(&bot_interbreedwrite); + if (strlen(bot_interbreedwrite.string)) { + BotWriteInterbreeded(bot_interbreedwrite.string); + trap_Cvar_Set("bot_interbreedwrite", ""); + } + BotInterbreedBots(); + } +} + +/* +============== +BotInterbreeding +============== +*/ +void BotInterbreeding(void) { + int i; + + trap_Cvar_Update(&bot_interbreedchar); + if (!strlen(bot_interbreedchar.string)) return; + //make sure we are in tournament mode + if (gametype != GT_TOURNAMENT) { + trap_Cvar_Set("g_gametype", va("%d", GT_TOURNAMENT)); + ExitLevel(); + return; + } + //shutdown all the bots + for (i = 0; i < MAX_CLIENTS; i++) { + if (botstates[i] && botstates[i]->inuse) { + BotAIShutdownClient(botstates[i]->client, qfalse); + } + } + //make sure all item weight configs are reloaded and Not shared + trap_BotLibVarSet("bot_reloadcharacters", "1"); + //add a number of bots using the desired bot character + for (i = 0; i < bot_interbreedbots.integer; i++) { + trap_SendConsoleCommand( EXEC_INSERT, va("addbot %s 4 free %i %s%d\n", + bot_interbreedchar.string, i * 50, bot_interbreedchar.string, i) ); + } + // + trap_Cvar_Set("bot_interbreedchar", ""); + bot_interbreed = qtrue; +} + +/* +============== +BotEntityInfo +============== +*/ +void BotEntityInfo(int entnum, aas_entityinfo_t *info) { + trap_AAS_EntityInfo(entnum, info); +} + +/* +============== +NumBots +============== +*/ +int NumBots(void) { + return numbots; +} + +/* +============== +BotTeamLeader +============== +*/ +int BotTeamLeader(bot_state_t *bs) { + int leader; + + leader = ClientFromName(bs->teamleader); + if (leader < 0) return qfalse; + if (!botstates[leader] || !botstates[leader]->inuse) return qfalse; + return qtrue; +} + +/* +============== +AngleDifference +============== +*/ +float AngleDifference(float ang1, float ang2) { + float diff; + + diff = ang1 - ang2; + if (ang1 > ang2) { + if (diff > 180.0) diff -= 360.0; + } + else { + if (diff < -180.0) diff += 360.0; + } + return diff; +} + +/* +============== +BotChangeViewAngle +============== +*/ +float BotChangeViewAngle(float angle, float ideal_angle, float speed) { + float move; + + angle = AngleMod(angle); + ideal_angle = AngleMod(ideal_angle); + if (angle == ideal_angle) return angle; + move = ideal_angle - angle; + if (ideal_angle > angle) { + if (move > 180.0) move -= 360.0; + } + else { + if (move < -180.0) move += 360.0; + } + if (move > 0) { + if (move > speed) move = speed; + } + else { + if (move < -speed) move = -speed; + } + return AngleMod(angle + move); +} + +/* +============== +BotChangeViewAngles +============== +*/ +void BotChangeViewAngles(bot_state_t *bs, float thinktime) { + float diff, factor, maxchange, anglespeed, disired_speed; + int i; + + if (bs->ideal_viewangles[PITCH] > 180) bs->ideal_viewangles[PITCH] -= 360; + // + if (bs->enemy >= 0) { + factor = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_VIEW_FACTOR, 0.01f, 1); + maxchange = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_VIEW_MAXCHANGE, 1, 1800); + } + else { + factor = 0.05f; + maxchange = 360; + } + if (maxchange < 240) maxchange = 240; + maxchange *= thinktime; + for (i = 0; i < 2; i++) { + // + if (bot_challenge.integer) { + //smooth slowdown view model + diff = abs(AngleDifference(bs->viewangles[i], bs->ideal_viewangles[i])); + anglespeed = diff * factor; + if (anglespeed > maxchange) anglespeed = maxchange; + bs->viewangles[i] = BotChangeViewAngle(bs->viewangles[i], + bs->ideal_viewangles[i], anglespeed); + } + else { + //over reaction view model + bs->viewangles[i] = AngleMod(bs->viewangles[i]); + bs->ideal_viewangles[i] = AngleMod(bs->ideal_viewangles[i]); + diff = AngleDifference(bs->viewangles[i], bs->ideal_viewangles[i]); + disired_speed = diff * factor; + bs->viewanglespeed[i] += (bs->viewanglespeed[i] - disired_speed); + if (bs->viewanglespeed[i] > 180) bs->viewanglespeed[i] = maxchange; + if (bs->viewanglespeed[i] < -180) bs->viewanglespeed[i] = -maxchange; + anglespeed = bs->viewanglespeed[i]; + if (anglespeed > maxchange) anglespeed = maxchange; + if (anglespeed < -maxchange) anglespeed = -maxchange; + bs->viewangles[i] += anglespeed; + bs->viewangles[i] = AngleMod(bs->viewangles[i]); + //demping + bs->viewanglespeed[i] *= 0.45 * (1 - factor); + } + //BotAI_Print(PRT_MESSAGE, "ideal_angles %f %f\n", bs->ideal_viewangles[0], bs->ideal_viewangles[1], bs->ideal_viewangles[2]);` + //bs->viewangles[i] = bs->ideal_viewangles[i]; + } + //bs->viewangles[PITCH] = 0; + if (bs->viewangles[PITCH] > 180) bs->viewangles[PITCH] -= 360; + //elementary action: view + trap_EA_View(bs->client, bs->viewangles); +} + +/* +============== +BotInputToUserCommand +============== +*/ +void BotInputToUserCommand(bot_input_t *bi, usercmd_t *ucmd, int delta_angles[3], int time) { + vec3_t angles, forward, right; + short temp; + int j; + + //clear the whole structure + memset(ucmd, 0, sizeof(usercmd_t)); + // + //Com_Printf("dir = %f %f %f speed = %f\n", bi->dir[0], bi->dir[1], bi->dir[2], bi->speed); + //the duration for the user command in milli seconds + ucmd->serverTime = time; + // + if (bi->actionflags & ACTION_DELAYEDJUMP) { + bi->actionflags |= ACTION_JUMP; + bi->actionflags &= ~ACTION_DELAYEDJUMP; + } + //set the buttons + if (bi->actionflags & ACTION_RESPAWN) ucmd->buttons = BUTTON_ATTACK; + if (bi->actionflags & ACTION_ATTACK) ucmd->buttons |= BUTTON_ATTACK; + if (bi->actionflags & ACTION_TALK) ucmd->buttons |= BUTTON_TALK; + if (bi->actionflags & ACTION_GESTURE) ucmd->buttons |= BUTTON_GESTURE; + if (bi->actionflags & ACTION_USE) ucmd->buttons |= BUTTON_USE_HOLDABLE; + if (bi->actionflags & ACTION_WALK) ucmd->buttons |= BUTTON_WALKING; + if (bi->actionflags & ACTION_AFFIRMATIVE) ucmd->buttons |= BUTTON_AFFIRMATIVE; + if (bi->actionflags & ACTION_NEGATIVE) ucmd->buttons |= BUTTON_NEGATIVE; + if (bi->actionflags & ACTION_GETFLAG) ucmd->buttons |= BUTTON_GETFLAG; + if (bi->actionflags & ACTION_GUARDBASE) ucmd->buttons |= BUTTON_GUARDBASE; + if (bi->actionflags & ACTION_PATROL) ucmd->buttons |= BUTTON_PATROL; + if (bi->actionflags & ACTION_FOLLOWME) ucmd->buttons |= BUTTON_FOLLOWME; + // + ucmd->weapon = bi->weapon; + //set the view angles + //NOTE: the ucmd->angles are the angles WITHOUT the delta angles + ucmd->angles[PITCH] = ANGLE2SHORT(bi->viewangles[PITCH]); + ucmd->angles[YAW] = ANGLE2SHORT(bi->viewangles[YAW]); + ucmd->angles[ROLL] = ANGLE2SHORT(bi->viewangles[ROLL]); + //subtract the delta angles + for (j = 0; j < 3; j++) { + temp = ucmd->angles[j] - delta_angles[j]; + /*NOTE: disabled because temp should be mod first + if ( j == PITCH ) { + // don't let the player look up or down more than 90 degrees + if ( temp > 16000 ) temp = 16000; + else if ( temp < -16000 ) temp = -16000; + } + */ + ucmd->angles[j] = temp; + } + //NOTE: movement is relative to the REAL view angles + //get the horizontal forward and right vector + //get the pitch in the range [-180, 180] + if (bi->dir[2]) angles[PITCH] = bi->viewangles[PITCH]; + else angles[PITCH] = 0; + angles[YAW] = bi->viewangles[YAW]; + angles[ROLL] = 0; + AngleVectors(angles, forward, right, NULL); + //bot input speed is in the range [0, 400] + bi->speed = bi->speed * 127 / 400; + //set the view independent movement + ucmd->forwardmove = DotProduct(forward, bi->dir) * bi->speed; + ucmd->rightmove = DotProduct(right, bi->dir) * bi->speed; + ucmd->upmove = abs(forward[2]) * bi->dir[2] * bi->speed; + //normal keyboard movement + if (bi->actionflags & ACTION_MOVEFORWARD) ucmd->forwardmove += 127; + if (bi->actionflags & ACTION_MOVEBACK) ucmd->forwardmove -= 127; + if (bi->actionflags & ACTION_MOVELEFT) ucmd->rightmove -= 127; + if (bi->actionflags & ACTION_MOVERIGHT) ucmd->rightmove += 127; + //jump/moveup + if (bi->actionflags & ACTION_JUMP) ucmd->upmove += 127; + //crouch/movedown + if (bi->actionflags & ACTION_CROUCH) ucmd->upmove -= 127; + // + //Com_Printf("forward = %d right = %d up = %d\n", ucmd.forwardmove, ucmd.rightmove, ucmd.upmove); + //Com_Printf("ucmd->serverTime = %d\n", ucmd->serverTime); +} + +/* +============== +BotUpdateInput +============== +*/ +void BotUpdateInput(bot_state_t *bs, int time, int elapsed_time) { + bot_input_t bi; + int j; + + //add the delta angles to the bot's current view angles + for (j = 0; j < 3; j++) { + bs->viewangles[j] = AngleMod(bs->viewangles[j] + SHORT2ANGLE(bs->cur_ps.delta_angles[j])); + } + //change the bot view angles + BotChangeViewAngles(bs, (float) elapsed_time / 1000); + //retrieve the bot input + trap_EA_GetInput(bs->client, (float) time / 1000, &bi); + //respawn hack + if (bi.actionflags & ACTION_RESPAWN) { + if (bs->lastucmd.buttons & BUTTON_ATTACK) bi.actionflags &= ~(ACTION_RESPAWN|ACTION_ATTACK); + } + //convert the bot input to a usercmd + BotInputToUserCommand(&bi, &bs->lastucmd, bs->cur_ps.delta_angles, time); + //subtract the delta angles + for (j = 0; j < 3; j++) { + bs->viewangles[j] = AngleMod(bs->viewangles[j] - SHORT2ANGLE(bs->cur_ps.delta_angles[j])); + } +} + +/* +============== +BotAIRegularUpdate +============== +*/ +void BotAIRegularUpdate(void) { + if (regularupdate_time < FloatTime()) { + trap_BotUpdateEntityItems(); + regularupdate_time = FloatTime() + 0.3; + } +} + +/* +============== +RemoveColorEscapeSequences +============== +*/ +void RemoveColorEscapeSequences( char *text ) { + int i, l; + + l = 0; + for ( i = 0; text[i]; i++ ) { + if (Q_IsColorString(&text[i])) { + i++; + continue; + } + if (text[i] > 0x7E) + continue; + text[l++] = text[i]; + } + text[l] = '\0'; +} + +/* +============== +BotAI +============== +*/ +int BotAI(int client, float thinktime) { + bot_state_t *bs; + char buf[1024], *args; + int j; + + trap_EA_ResetInput(client); + // + bs = botstates[client]; + if (!bs || !bs->inuse) { + BotAI_Print(PRT_FATAL, "BotAI: client %d is not setup\n", client); + return qfalse; + } + + //retrieve the current client state + BotAI_GetClientState( client, &bs->cur_ps ); + + //retrieve any waiting server commands + while( trap_BotGetServerCommand(client, buf, sizeof(buf)) ) { + //have buf point to the command and args to the command arguments + args = strchr( buf, ' '); + if (!args) continue; + *args++ = '\0'; + + //remove color espace sequences from the arguments + RemoveColorEscapeSequences( args ); + + if (!Q_stricmp(buf, "cp ")) + { /*CenterPrintf*/ } + else if (!Q_stricmp(buf, "cs")) + { /*ConfigStringModified*/ } + else if (!Q_stricmp(buf, "print")) { + //remove first and last quote from the chat message + memmove(args, args+1, strlen(args)); + args[strlen(args)-1] = '\0'; + trap_BotQueueConsoleMessage(bs->cs, CMS_NORMAL, args); + } + else if (!Q_stricmp(buf, "chat")) { + //remove first and last quote from the chat message + memmove(args, args+1, strlen(args)); + args[strlen(args)-1] = '\0'; + trap_BotQueueConsoleMessage(bs->cs, CMS_CHAT, args); + } + else if (!Q_stricmp(buf, "tchat")) { + //remove first and last quote from the chat message + memmove(args, args+1, strlen(args)); + args[strlen(args)-1] = '\0'; + trap_BotQueueConsoleMessage(bs->cs, CMS_CHAT, args); + } +#ifdef MISSIONPACK + else if (!Q_stricmp(buf, "vchat")) { + BotVoiceChatCommand(bs, SAY_ALL, args); + } + else if (!Q_stricmp(buf, "vtchat")) { + BotVoiceChatCommand(bs, SAY_TEAM, args); + } + else if (!Q_stricmp(buf, "vtell")) { + BotVoiceChatCommand(bs, SAY_TELL, args); + } +#endif + else if (!Q_stricmp(buf, "scores")) + { /*FIXME: parse scores?*/ } + else if (!Q_stricmp(buf, "clientLevelShot")) + { /*ignore*/ } + } + //add the delta angles to the bot's current view angles + for (j = 0; j < 3; j++) { + bs->viewangles[j] = AngleMod(bs->viewangles[j] + SHORT2ANGLE(bs->cur_ps.delta_angles[j])); + } + //increase the local time of the bot + bs->ltime += thinktime; + // + bs->thinktime = thinktime; + //origin of the bot + VectorCopy(bs->cur_ps.origin, bs->origin); + //eye coordinates of the bot + VectorCopy(bs->cur_ps.origin, bs->eye); + bs->eye[2] += bs->cur_ps.viewheight; + //get the area the bot is in + bs->areanum = BotPointAreaNum(bs->origin); + //the real AI + BotDeathmatchAI(bs, thinktime); + //set the weapon selection every AI frame + trap_EA_SelectWeapon(bs->client, bs->weaponnum); + //subtract the delta angles + for (j = 0; j < 3; j++) { + bs->viewangles[j] = AngleMod(bs->viewangles[j] - SHORT2ANGLE(bs->cur_ps.delta_angles[j])); + } + //everything was ok + return qtrue; +} + +/* +================== +BotScheduleBotThink +================== +*/ +void BotScheduleBotThink(void) { + int i, botnum; + + botnum = 0; + + for( i = 0; i < MAX_CLIENTS; i++ ) { + if( !botstates[i] || !botstates[i]->inuse ) { + continue; + } + //initialize the bot think residual time + botstates[i]->botthink_residual = bot_thinktime.integer * botnum / numbots; + botnum++; + } +} + +/* +============== +BotWriteSessionData +============== +*/ +void BotWriteSessionData(bot_state_t *bs) { + const char *s; + const char *var; + + s = va( + "%i %i %i %i %i %i %i %i" + " %f %f %f" + " %f %f %f" + " %f %f %f", + bs->lastgoal_decisionmaker, + bs->lastgoal_ltgtype, + bs->lastgoal_teammate, + bs->lastgoal_teamgoal.areanum, + bs->lastgoal_teamgoal.entitynum, + bs->lastgoal_teamgoal.flags, + bs->lastgoal_teamgoal.iteminfo, + bs->lastgoal_teamgoal.number, + bs->lastgoal_teamgoal.origin[0], + bs->lastgoal_teamgoal.origin[1], + bs->lastgoal_teamgoal.origin[2], + bs->lastgoal_teamgoal.mins[0], + bs->lastgoal_teamgoal.mins[1], + bs->lastgoal_teamgoal.mins[2], + bs->lastgoal_teamgoal.maxs[0], + bs->lastgoal_teamgoal.maxs[1], + bs->lastgoal_teamgoal.maxs[2] + ); + + var = va( "botsession%i", bs->client ); + + trap_Cvar_Set( var, s ); +} + +/* +============== +BotReadSessionData +============== +*/ +void BotReadSessionData(bot_state_t *bs) { + char s[MAX_STRING_CHARS]; + const char *var; + + var = va( "botsession%i", bs->client ); + trap_Cvar_VariableStringBuffer( var, s, sizeof(s) ); + + sscanf(s, + "%i %i %i %i %i %i %i %i" + " %f %f %f" + " %f %f %f" + " %f %f %f", + &bs->lastgoal_decisionmaker, + &bs->lastgoal_ltgtype, + &bs->lastgoal_teammate, + &bs->lastgoal_teamgoal.areanum, + &bs->lastgoal_teamgoal.entitynum, + &bs->lastgoal_teamgoal.flags, + &bs->lastgoal_teamgoal.iteminfo, + &bs->lastgoal_teamgoal.number, + &bs->lastgoal_teamgoal.origin[0], + &bs->lastgoal_teamgoal.origin[1], + &bs->lastgoal_teamgoal.origin[2], + &bs->lastgoal_teamgoal.mins[0], + &bs->lastgoal_teamgoal.mins[1], + &bs->lastgoal_teamgoal.mins[2], + &bs->lastgoal_teamgoal.maxs[0], + &bs->lastgoal_teamgoal.maxs[1], + &bs->lastgoal_teamgoal.maxs[2] + ); +} + +/* +============== +BotAISetupClient +============== +*/ +int BotAISetupClient(int client, struct bot_settings_s *settings, qboolean restart) { + char filename[MAX_PATH], name[MAX_PATH], gender[MAX_PATH]; + bot_state_t *bs; + int errnum; + + if (!botstates[client]) botstates[client] = G_Alloc(sizeof(bot_state_t)); + bs = botstates[client]; + + if (bs && bs->inuse) { + BotAI_Print(PRT_FATAL, "BotAISetupClient: client %d already setup\n", client); + return qfalse; + } + + if (!trap_AAS_Initialized()) { + BotAI_Print(PRT_FATAL, "AAS not initialized\n"); + return qfalse; + } + + //load the bot character + bs->character = trap_BotLoadCharacter(settings->characterfile, settings->skill); + if (!bs->character) { + BotAI_Print(PRT_FATAL, "couldn't load skill %f from %s\n", settings->skill, settings->characterfile); + return qfalse; + } + //copy the settings + memcpy(&bs->settings, settings, sizeof(bot_settings_t)); + //allocate a goal state + bs->gs = trap_BotAllocGoalState(client); + //load the item weights + trap_Characteristic_String(bs->character, CHARACTERISTIC_ITEMWEIGHTS, filename, MAX_PATH); + errnum = trap_BotLoadItemWeights(bs->gs, filename); + if (errnum != BLERR_NOERROR) { + trap_BotFreeGoalState(bs->gs); + return qfalse; + } + //allocate a weapon state + bs->ws = trap_BotAllocWeaponState(); + //load the weapon weights + trap_Characteristic_String(bs->character, CHARACTERISTIC_WEAPONWEIGHTS, filename, MAX_PATH); + errnum = trap_BotLoadWeaponWeights(bs->ws, filename); + if (errnum != BLERR_NOERROR) { + trap_BotFreeGoalState(bs->gs); + trap_BotFreeWeaponState(bs->ws); + return qfalse; + } + //allocate a chat state + bs->cs = trap_BotAllocChatState(); + //load the chat file + trap_Characteristic_String(bs->character, CHARACTERISTIC_CHAT_FILE, filename, MAX_PATH); + trap_Characteristic_String(bs->character, CHARACTERISTIC_CHAT_NAME, name, MAX_PATH); + errnum = trap_BotLoadChatFile(bs->cs, filename, name); + if (errnum != BLERR_NOERROR) { + trap_BotFreeChatState(bs->cs); + trap_BotFreeGoalState(bs->gs); + trap_BotFreeWeaponState(bs->ws); + return qfalse; + } + //get the gender characteristic + trap_Characteristic_String(bs->character, CHARACTERISTIC_GENDER, gender, MAX_PATH); + //set the chat gender + if (*gender == 'f' || *gender == 'F') trap_BotSetChatGender(bs->cs, CHAT_GENDERFEMALE); + else if (*gender == 'm' || *gender == 'M') trap_BotSetChatGender(bs->cs, CHAT_GENDERMALE); + else trap_BotSetChatGender(bs->cs, CHAT_GENDERLESS); + + bs->inuse = qtrue; + bs->client = client; + bs->entitynum = client; + bs->setupcount = 4; + bs->entergame_time = FloatTime(); + bs->ms = trap_BotAllocMoveState(); + bs->walker = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_WALKER, 0, 1); + numbots++; + + if (trap_Cvar_VariableIntegerValue("bot_testichat")) { + trap_BotLibVarSet("bot_testichat", "1"); + BotChatTest(bs); + } + //NOTE: reschedule the bot thinking + BotScheduleBotThink(); + //if interbreeding start with a mutation + if (bot_interbreed) { + trap_BotMutateGoalFuzzyLogic(bs->gs, 1); + } + // if we kept the bot client + if (restart) { + BotReadSessionData(bs); + } + //bot has been setup succesfully + return qtrue; +} + +/* +============== +BotAIShutdownClient +============== +*/ +int BotAIShutdownClient(int client, qboolean restart) { + bot_state_t *bs; + + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("BotAIShutdownClient - attempting to shutdown bot client>%d<\n", client ); + + bs = botstates[client]; + if (!bs || !bs->inuse) { + //BotAI_Print(PRT_ERROR, "BotAIShutdownClient: client %d already shutdown\n", client); + //PKMOD - Ergodic 02/13/04 - debug bot's restart (inactive) + //Com_Printf("BotAIShutdownClient - client>%d< already shutdown\n", client ); + return qfalse; + } + + if (restart) { + //PKMOD - Ergodic 01/14/02 - debug bot's restart (inactive) +// Com_Printf("BotAIShutdownClient - restarting client>%d<\n", client ); + BotWriteSessionData(bs); + } + + if (BotChat_ExitGame(bs)) { + trap_BotEnterChat(bs->cs, bs->client, CHAT_ALL); + } + + trap_BotFreeMoveState(bs->ms); + //free the goal state` + trap_BotFreeGoalState(bs->gs); + //free the chat file + trap_BotFreeChatState(bs->cs); + //free the weapon weights + trap_BotFreeWeaponState(bs->ws); + //free the bot character + trap_BotFreeCharacter(bs->character); + // + BotFreeWaypoints(bs->checkpoints); + BotFreeWaypoints(bs->patrolpoints); + //clear activate goal stack + BotClearActivateGoalStack(bs); + //clear the bot state + memset(bs, 0, sizeof(bot_state_t)); + //set the inuse flag to qfalse + bs->inuse = qfalse; + //there's one bot less + numbots--; + //everything went ok + return qtrue; +} + +/* +============== +BotResetState + +called when a bot enters the intermission or observer mode and +when the level is changed +============== +*/ +void BotResetState(bot_state_t *bs) { + int client, entitynum, inuse; + int movestate, goalstate, chatstate, weaponstate; + bot_settings_t settings; + int character; + playerState_t ps; //current player state + float entergame_time; + + //save some things that should not be reset here + memcpy(&settings, &bs->settings, sizeof(bot_settings_t)); + memcpy(&ps, &bs->cur_ps, sizeof(playerState_t)); + inuse = bs->inuse; + client = bs->client; + entitynum = bs->entitynum; + character = bs->character; + movestate = bs->ms; + goalstate = bs->gs; + chatstate = bs->cs; + weaponstate = bs->ws; + entergame_time = bs->entergame_time; + //free checkpoints and patrol points + BotFreeWaypoints(bs->checkpoints); + BotFreeWaypoints(bs->patrolpoints); + //reset the whole state + memset(bs, 0, sizeof(bot_state_t)); + //copy back some state stuff that should not be reset + bs->ms = movestate; + bs->gs = goalstate; + bs->cs = chatstate; + bs->ws = weaponstate; + memcpy(&bs->cur_ps, &ps, sizeof(playerState_t)); + memcpy(&bs->settings, &settings, sizeof(bot_settings_t)); + bs->inuse = inuse; + bs->client = client; + bs->entitynum = entitynum; + bs->character = character; + bs->entergame_time = entergame_time; + //reset several states + if (bs->ms) trap_BotResetMoveState(bs->ms); + if (bs->gs) trap_BotResetGoalState(bs->gs); + if (bs->ws) trap_BotResetWeaponState(bs->ws); + if (bs->gs) trap_BotResetAvoidGoals(bs->gs); + if (bs->ms) trap_BotResetAvoidReach(bs->ms); +} + +/* +============== +BotAILoadMap +============== +*/ +int BotAILoadMap( int restart ) { + int i; + vmCvar_t mapname; + + if (!restart) { + trap_Cvar_Register( &mapname, "mapname", "", CVAR_SERVERINFO | CVAR_ROM ); + trap_BotLibLoadMap( mapname.string ); + } + + for (i = 0; i < MAX_CLIENTS; i++) { + if (botstates[i] && botstates[i]->inuse) { + BotResetState( botstates[i] ); + botstates[i]->setupcount = 4; + } + } + + BotSetupDeathmatchAI(); + + return qtrue; +} + +#ifdef MISSIONPACK +void ProximityMine_Trigger( gentity_t *trigger, gentity_t *other, trace_t *trace ); +#endif + +/* +================== +BotAIStartFrame +================== +*/ +int BotAIStartFrame(int time) { + int i; + gentity_t *ent; + bot_entitystate_t state; + int elapsed_time, thinktime; + static int local_time; + static int botlib_residual; + static int lastbotthink_time; + + G_CheckBotSpawn(); + + trap_Cvar_Update(&bot_rocketjump); + trap_Cvar_Update(&bot_grapple); + trap_Cvar_Update(&bot_fastchat); + trap_Cvar_Update(&bot_nochat); + trap_Cvar_Update(&bot_testrchat); + trap_Cvar_Update(&bot_thinktime); + trap_Cvar_Update(&bot_memorydump); + trap_Cvar_Update(&bot_saveroutingcache); + trap_Cvar_Update(&bot_pause); + trap_Cvar_Update(&bot_report); + + if (bot_report.integer) { +// BotTeamplayReport(); +// trap_Cvar_Set("bot_report", "0"); + BotUpdateInfoConfigStrings(); + } + + if (bot_pause.integer) { + // execute bot user commands every frame + for( i = 0; i < MAX_CLIENTS; i++ ) { + if( !botstates[i] || !botstates[i]->inuse ) { + continue; + } + if( g_entities[i].client->pers.connected != CON_CONNECTED ) { + continue; + } + botstates[i]->lastucmd.forwardmove = 0; + botstates[i]->lastucmd.rightmove = 0; + botstates[i]->lastucmd.upmove = 0; + botstates[i]->lastucmd.buttons = 0; + botstates[i]->lastucmd.serverTime = time; + trap_BotUserCommand(botstates[i]->client, &botstates[i]->lastucmd); + } + return qtrue; + } + + if (bot_memorydump.integer) { + trap_BotLibVarSet("memorydump", "1"); + trap_Cvar_Set("bot_memorydump", "0"); + } + if (bot_saveroutingcache.integer) { + trap_BotLibVarSet("saveroutingcache", "1"); + trap_Cvar_Set("bot_saveroutingcache", "0"); + } + //check if bot interbreeding is activated + BotInterbreeding(); + //cap the bot think time + if (bot_thinktime.integer > 200) { + trap_Cvar_Set("bot_thinktime", "200"); + } + //if the bot think time changed we should reschedule the bots + if (bot_thinktime.integer != lastbotthink_time) { + lastbotthink_time = bot_thinktime.integer; + BotScheduleBotThink(); + } + + elapsed_time = time - local_time; + local_time = time; + + botlib_residual += elapsed_time; + + if (elapsed_time > bot_thinktime.integer) thinktime = elapsed_time; + else thinktime = bot_thinktime.integer; + + // update the bot library + if ( botlib_residual >= thinktime ) { + botlib_residual -= thinktime; + + trap_BotLibStartFrame((float) time / 1000); + + if (!trap_AAS_Initialized()) return qfalse; + + //update entities in the botlib + for (i = 0; i < MAX_GENTITIES; i++) { + ent = &g_entities[i]; + if (!ent->inuse) { + trap_BotLibUpdateEntity(i, NULL); + continue; + } + if (!ent->r.linked) { + trap_BotLibUpdateEntity(i, NULL); + continue; + } + if (ent->r.svFlags & SVF_NOCLIENT) { + trap_BotLibUpdateEntity(i, NULL); + continue; + } + // do not update missiles + if (ent->s.eType == ET_MISSILE && ent->s.weapon != WP_GRAPPLING_HOOK) { + trap_BotLibUpdateEntity(i, NULL); + continue; + } + // do not update event only entities + if (ent->s.eType > ET_EVENTS) { + trap_BotLibUpdateEntity(i, NULL); + continue; + } +#ifdef MISSIONPACK + // never link prox mine triggers + if (ent->r.contents == CONTENTS_TRIGGER) { + if (ent->touch == ProximityMine_Trigger) { + trap_BotLibUpdateEntity(i, NULL); + continue; + } + } +#endif + // + memset(&state, 0, sizeof(bot_entitystate_t)); + // + VectorCopy(ent->r.currentOrigin, state.origin); + if (i < MAX_CLIENTS) { + VectorCopy(ent->s.apos.trBase, state.angles); + } else { + VectorCopy(ent->r.currentAngles, state.angles); + } + VectorCopy(ent->s.origin2, state.old_origin); + VectorCopy(ent->r.mins, state.mins); + VectorCopy(ent->r.maxs, state.maxs); + state.type = ent->s.eType; + state.flags = ent->s.eFlags; + if (ent->r.bmodel) state.solid = SOLID_BSP; + else state.solid = SOLID_BBOX; + state.groundent = ent->s.groundEntityNum; + state.modelindex = ent->s.modelindex; + state.modelindex2 = ent->s.modelindex2; + state.frame = ent->s.frame; + state.event = ent->s.event; + state.eventParm = ent->s.eventParm; + state.powerups = ent->s.powerups; + state.legsAnim = ent->s.legsAnim; + state.torsoAnim = ent->s.torsoAnim; + state.weapon = ent->s.weapon; + // + trap_BotLibUpdateEntity(i, &state); + } + + BotAIRegularUpdate(); + } + + floattime = trap_AAS_Time(); + + // execute scheduled bot AI + for( i = 0; i < MAX_CLIENTS; i++ ) { + if( !botstates[i] || !botstates[i]->inuse ) { + continue; + } + // + botstates[i]->botthink_residual += elapsed_time; + // + if ( botstates[i]->botthink_residual >= thinktime ) { + botstates[i]->botthink_residual -= thinktime; + + if (!trap_AAS_Initialized()) return qfalse; + + if (g_entities[i].client->pers.connected == CON_CONNECTED) { + BotAI(i, (float) thinktime / 1000); + } + } + } + + + // execute bot user commands every frame + for( i = 0; i < MAX_CLIENTS; i++ ) { + if( !botstates[i] || !botstates[i]->inuse ) { + continue; + } + if( g_entities[i].client->pers.connected != CON_CONNECTED ) { + continue; + } + + BotUpdateInput(botstates[i], time, elapsed_time); + trap_BotUserCommand(botstates[i]->client, &botstates[i]->lastucmd); + } + + return qtrue; +} + +/* +============== +BotInitLibrary +============== +*/ +int BotInitLibrary(void) { + char buf[144]; + int hold_maxclients; + + //set the maxclients and maxentities library variables before calling BotSetupLibrary + trap_Cvar_VariableStringBuffer("sv_maxclients", buf, sizeof(buf)); + if (!strlen(buf)) strcpy(buf, "8"); + + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + hold_maxclients = atoi( buf ) + MAX_PRIVATE_BOTS; + trap_BotLibVarSet("maxclients", va( "%i", hold_maxclients ) ); + + Com_sprintf(buf, sizeof(buf), "%d", MAX_GENTITIES); + trap_BotLibVarSet("maxentities", buf); + //bsp checksum + trap_Cvar_VariableStringBuffer("sv_mapChecksum", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("sv_mapChecksum", buf); + //maximum number of aas links + trap_Cvar_VariableStringBuffer("max_aaslinks", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("max_aaslinks", buf); + //maximum number of items in a level + trap_Cvar_VariableStringBuffer("max_levelitems", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("max_levelitems", buf); + //game type + trap_Cvar_VariableStringBuffer("g_gametype", buf, sizeof(buf)); + if (!strlen(buf)) strcpy(buf, "0"); + trap_BotLibVarSet("g_gametype", buf); + //bot developer mode and log file + trap_BotLibVarSet("bot_developer", bot_developer.string); + trap_BotLibVarSet("log", buf); + //no chatting + trap_Cvar_VariableStringBuffer("bot_nochat", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("nochat", "0"); + //visualize jump pads + trap_Cvar_VariableStringBuffer("bot_visualizejumppads", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("bot_visualizejumppads", buf); + //forced clustering calculations + trap_Cvar_VariableStringBuffer("bot_forceclustering", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("forceclustering", buf); + //forced reachability calculations + trap_Cvar_VariableStringBuffer("bot_forcereachability", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("forcereachability", buf); + //force writing of AAS to file + trap_Cvar_VariableStringBuffer("bot_forcewrite", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("forcewrite", buf); + //no AAS optimization + trap_Cvar_VariableStringBuffer("bot_aasoptimize", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("aasoptimize", buf); + // + trap_Cvar_VariableStringBuffer("bot_saveroutingcache", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("saveroutingcache", buf); + //reload instead of cache bot character files + trap_Cvar_VariableStringBuffer("bot_reloadcharacters", buf, sizeof(buf)); + if (!strlen(buf)) strcpy(buf, "0"); + trap_BotLibVarSet("bot_reloadcharacters", buf); + //base directory + trap_Cvar_VariableStringBuffer("fs_basepath", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("basedir", buf); + //game directory + trap_Cvar_VariableStringBuffer("fs_game", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("gamedir", buf); + //cd directory + trap_Cvar_VariableStringBuffer("fs_cdpath", buf, sizeof(buf)); + if (strlen(buf)) trap_BotLibVarSet("cddir", buf); + // +#ifdef MISSIONPACK + trap_BotLibDefine("MISSIONPACK"); +#endif + + //PKMOD - Ergodic 12/02/01 - initialize varibables for bots to use grapple + trap_BotLibVarSet("weapindex_grapple", va("%d", WP_GRAPPLING_HOOK)); + trap_BotLibVarSet("entitytypemissile", va("%d", ET_MISSILE)); + + //setup the bot library + return trap_BotLibSetup(); +} + +/* +============== +BotAISetup +============== +*/ +int BotAISetup( int restart ) { + int errnum; + + trap_Cvar_Register(&bot_thinktime, "bot_thinktime", "100", CVAR_CHEAT); + trap_Cvar_Register(&bot_memorydump, "bot_memorydump", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_saveroutingcache, "bot_saveroutingcache", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_pause, "bot_pause", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_report, "bot_report", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_testsolid, "bot_testsolid", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_testclusters, "bot_testclusters", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_developer, "bot_developer", "0", CVAR_CHEAT); + trap_Cvar_Register(&bot_interbreedchar, "bot_interbreedchar", "", 0); + trap_Cvar_Register(&bot_interbreedbots, "bot_interbreedbots", "10", 0); + trap_Cvar_Register(&bot_interbreedcycle, "bot_interbreedcycle", "20", 0); + trap_Cvar_Register(&bot_interbreedwrite, "bot_interbreedwrite", "", 0); + + //if the game is restarted for a tournament + if (restart) { + return qtrue; + } + + //initialize the bot states + memset( botstates, 0, sizeof(botstates) ); + + errnum = BotInitLibrary(); + if (errnum != BLERR_NOERROR) return qfalse; + return qtrue; +} + +/* +============== +BotAIShutdown +============== +*/ +int BotAIShutdown( int restart ) { + + int i; + + //PKMOD - Ergodic 02/13/04 - debug bot's userinfo (inactive) + //char netname[MAX_MESSAGE_SIZE]; + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("+-+-+-BotAIShutdown-+-+-+\n" ); + + //if the game is restarted for a tournament + if ( restart ) { + //shutdown all the bots in the botlib + for (i = 0; i < MAX_CLIENTS; i++) { + if (botstates[i] && botstates[i]->inuse) { + + //PKMOD - Ergodic 02/13/04 - debug bot's userinfo (inactive) + //ClientName(botstates[i]->client, netname, sizeof(netname)); + //Com_Printf("BotAIShutdown - clientnum>%d<, entitynum>%d<, name>%s<, flags>%d<\n", botstates[i]->client, botstates[i]->entitynum, netname, g_entities[botstates[i]->entitynum].r.svFlags ); + BotAIShutdownClient(botstates[i]->client, restart); + } + } + //don't shutdown the bot library + } + else { + trap_BotLibShutdown(); + } + return qtrue; +} + diff --git a/quake3/source/code/game/ai_main.h b/quake3/source/code/game/ai_main.h new file mode 100644 index 0000000..7a8ee0f --- /dev/null +++ b/quake3/source/code/game/ai_main.h @@ -0,0 +1,310 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_main.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_chat.c $ + * + *****************************************************************************/ + +//#define DEBUG +#define CTF + +#define MAX_ITEMS 256 +//bot flags +#define BFL_STRAFERIGHT 1 //strafe to the right +#define BFL_ATTACKED 2 //bot has attacked last ai frame +#define BFL_ATTACKJUMPED 4 //bot jumped during attack last frame +#define BFL_AIMATENEMY 8 //bot aimed at the enemy this frame +#define BFL_AVOIDRIGHT 16 //avoid obstacles by going to the right +#define BFL_IDEALVIEWSET 32 //bot has ideal view angles set +#define BFL_FIGHTSUICIDAL 64 //bot is in a suicidal fight +//long term goal types +#define LTG_TEAMHELP 1 //help a team mate +#define LTG_TEAMACCOMPANY 2 //accompany a team mate +#define LTG_DEFENDKEYAREA 3 //defend a key area +#define LTG_GETFLAG 4 //get the enemy flag +#define LTG_RUSHBASE 5 //rush to the base +#define LTG_RETURNFLAG 6 //return the flag +#define LTG_CAMP 7 //camp somewhere +#define LTG_CAMPORDER 8 //ordered to camp somewhere +#define LTG_PATROL 9 //patrol +#define LTG_GETITEM 10 //get an item +#define LTG_KILL 11 //kill someone +#define LTG_HARVEST 12 //harvest skulls +#define LTG_ATTACKENEMYBASE 13 //attack the enemy base +#define LTG_MAKELOVE_UNDER 14 +#define LTG_MAKELOVE_ONTOP 15 +//some goal dedication times +#define TEAM_HELP_TIME 60 //1 minute teamplay help time +#define TEAM_ACCOMPANY_TIME 600 //10 minutes teamplay accompany time +#define TEAM_DEFENDKEYAREA_TIME 600 //10 minutes ctf defend base time +#define TEAM_CAMP_TIME 600 //10 minutes camping time +#define TEAM_PATROL_TIME 600 //10 minutes patrolling time +#define TEAM_LEAD_TIME 600 //10 minutes taking the lead +#define TEAM_GETITEM_TIME 60 //1 minute +#define TEAM_KILL_SOMEONE 180 //3 minute to kill someone +#define TEAM_ATTACKENEMYBASE_TIME 600 //10 minutes +#define TEAM_HARVEST_TIME 120 //2 minutes +#define CTF_GETFLAG_TIME 600 //10 minutes ctf get flag time +#define CTF_RUSHBASE_TIME 120 //2 minutes ctf rush base time +#define CTF_RETURNFLAG_TIME 180 //3 minutes to return the flag +#define CTF_ROAM_TIME 60 //1 minute ctf roam time +//patrol flags +#define PATROL_LOOP 1 +#define PATROL_REVERSE 2 +#define PATROL_BACK 4 +//teamplay task preference +#define TEAMTP_DEFENDER 1 +#define TEAMTP_ATTACKER 2 +//CTF strategy +#define CTFS_AGRESSIVE 1 +//copied from the aas file header +#define PRESENCE_NONE 1 +#define PRESENCE_NORMAL 2 +#define PRESENCE_CROUCH 4 +// + +//PKMOD - Ergodic 08/30/01 - remove these fields in PKA +/*++++ +#define MAX_PROXMINES 64 +----*/ + +//PKMOD - Ergodic 04/14/01 - new code for bots to target enemy beartraps +//PKMOD - Ergodic 08/30/01 - reduce from 64 to 32 (practical) +#define MAX_BEARTRAPS 32 + +//PKMOD - Ergodic 08/30/01 - code for bots to target enemy autosentrys +#define MAX_AUTOSENTRYS 32 + +//PKMOD - Ergodic 08/30/01 - code for bots to avoid gravity wells +#define MAX_GRAVITYWELLS 8 + +//check points +typedef struct bot_waypoint_s +{ + int inuse; + char name[32]; + bot_goal_t goal; + struct bot_waypoint_s *next, *prev; +} bot_waypoint_t; + +#define MAX_ACTIVATESTACK 8 +#define MAX_ACTIVATEAREAS 32 + +typedef struct bot_activategoal_s +{ + int inuse; + bot_goal_t goal; //goal to activate (buttons etc.) + float time; //time to activate something + float start_time; //time starting to activate something + float justused_time; //time the goal was used + int shoot; //true if bot has to shoot to activate + int weapon; //weapon to be used for activation + vec3_t target; //target to shoot at to activate something + vec3_t origin; //origin of the blocking entity to activate + int areas[MAX_ACTIVATEAREAS]; //routing areas disabled by blocking entity + int numareas; //number of disabled routing areas + int areasdisabled; //true if the areas are disabled for the routing + struct bot_activategoal_s *next; //next activate goal on stack +} bot_activategoal_t; + +//bot state +typedef struct bot_state_s +{ + int inuse; //true if this state is used by a bot client + int botthink_residual; //residual for the bot thinks + int client; //client number of the bot + int entitynum; //entity number of the bot + playerState_t cur_ps; //current player state + int last_eFlags; //last ps flags + usercmd_t lastucmd; //usercmd from last frame + int entityeventTime[1024]; //last entity event time + // + bot_settings_t settings; //several bot settings + int (*ainode)(struct bot_state_s *bs); //current AI node + float thinktime; //time the bot thinks this frame + vec3_t origin; //origin of the bot + vec3_t velocity; //velocity of the bot + int presencetype; //presence type of the bot + vec3_t eye; //eye coordinates of the bot + int areanum; //the number of the area the bot is in + int inventory[MAX_ITEMS]; //string with items amounts the bot has + int tfl; //the travel flags the bot uses + int flags; //several flags + int respawn_wait; //wait until respawned + int lasthealth; //health value previous frame + int lastkilledplayer; //last killed player + int lastkilledby; //player that last killed this bot + int botdeathtype; //the death type of the bot + int enemydeathtype; //the death type of the enemy + int botsuicide; //true when the bot suicides + int enemysuicide; //true when the enemy of the bot suicides + int setupcount; //true when the bot has just been setup + int map_restart; //true when the map is being restarted + int entergamechat; //true when the bot used an enter game chat + int num_deaths; //number of time this bot died + int num_kills; //number of kills of this bot + int revenge_enemy; //the revenge enemy + int revenge_kills; //number of kills the enemy made + int lastframe_health; //health value the last frame + int lasthitcount; //number of hits last frame + int chatto; //chat to all or team + float walker; //walker charactertic + float ltime; //local bot time + float entergame_time; //time the bot entered the game + float ltg_time; //long term goal time + float nbg_time; //nearby goal time + float respawn_time; //time the bot takes to respawn + float respawnchat_time; //time the bot started a chat during respawn + float chase_time; //time the bot will chase the enemy + float enemyvisible_time; //time the enemy was last visible + float check_time; //time to check for nearby items + float stand_time; //time the bot is standing still + float lastchat_time; //time the bot last selected a chat + float kamikaze_time; //time to check for kamikaze usage + float invulnerability_time; //time to check for invulnerability usage + float standfindenemy_time; //time to find enemy while standing + float attackstrafe_time; //time the bot is strafing in one dir + float attackcrouch_time; //time the bot will stop crouching + float attackchase_time; //time the bot chases during actual attack + float attackjump_time; //time the bot jumped during attack + float enemysight_time; //time before reacting to enemy + float enemydeath_time; //time the enemy died + float enemyposition_time; //time the position and velocity of the enemy were stored + float defendaway_time; //time away while defending + float defendaway_range; //max travel time away from defend area + float rushbaseaway_time; //time away from rushing to the base + float attackaway_time; //time away from attacking the enemy base + float harvestaway_time; //time away from harvesting + float ctfroam_time; //time the bot is roaming in ctf + float killedenemy_time; //time the bot killed the enemy + float arrive_time; //time arrived (at companion) + float lastair_time; //last time the bot had air + float teleport_time; //last time the bot teleported + float camp_time; //last time camped + float camp_range; //camp range + float weaponchange_time; //time the bot started changing weapons + float firethrottlewait_time; //amount of time to wait + float firethrottleshoot_time; //amount of time to shoot + float notblocked_time; //last time the bot was not blocked + float blockedbyavoidspot_time; //time blocked by an avoid spot + float predictobstacles_time; //last time the bot predicted obstacles + int predictobstacles_goalareanum; //last goal areanum the bot predicted obstacles for + vec3_t aimtarget; + vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle + vec3_t enemyorigin; //enemy origin 0.5 secs ago during battle + // + + //PKMOD - Ergodic 08/30/01 - remove these fields in PKA + /*++++ + int kamikazebody; //kamikaze body + int proxmines[MAX_PROXMINES]; + int numproxmines; + ----*/ + + //PKMOD - Ergodic 04/14/01 - new code for bots to target enemy beartraps + int beartraps[MAX_BEARTRAPS]; + int numbeartraps; + +//PKMOD - Ergodic 08/30/01 - code for bots to target enemy autosentrys + int autosentrys[MAX_AUTOSENTRYS]; + int numautosentrys; + +//PKMOD - Ergodic 08/30/01 - code for bots to target enemy autosentrys + int gravitywells[MAX_GRAVITYWELLS]; + int numgravitywells; + + // + int character; //the bot character + int ms; //move state of the bot + int gs; //goal state of the bot + int cs; //chat state of the bot + int ws; //weapon state of the bot + // + int enemy; //enemy entity number + int lastenemyareanum; //last reachability area the enemy was in + vec3_t lastenemyorigin; //last origin of the enemy in the reachability area + int weaponnum; //current weapon number + vec3_t viewangles; //current view angles + vec3_t ideal_viewangles; //ideal view angles + vec3_t viewanglespeed; + // + int ltgtype; //long term goal type + // team goals + int teammate; //team mate involved in this team goal + int decisionmaker; //player who decided to go for this goal + int ordered; //true if ordered to do something + float order_time; //time ordered to do something + int owndecision_time; //time the bot made it's own decision + bot_goal_t teamgoal; //the team goal + bot_goal_t altroutegoal; //alternative route goal + float reachedaltroutegoal_time; //time the bot reached the alt route goal + float teammessage_time; //time to message team mates what the bot is doing + float teamgoal_time; //time to stop helping team mate + float teammatevisible_time; //last time the team mate was NOT visible + int teamtaskpreference; //team task preference + // last ordered team goal + int lastgoal_decisionmaker; + int lastgoal_ltgtype; + int lastgoal_teammate; + bot_goal_t lastgoal_teamgoal; + // for leading team mates + int lead_teammate; //team mate the bot is leading + bot_goal_t lead_teamgoal; //team goal while leading + float lead_time; //time leading someone + float leadvisible_time; //last time the team mate was visible + float leadmessage_time; //last time a messaged was sent to the team mate + float leadbackup_time; //time backing up towards team mate + // + char teamleader[32]; //netname of the team leader + float askteamleader_time; //time asked for team leader + float becometeamleader_time; //time the bot will become the team leader + float teamgiveorders_time; //time to give team orders + float lastflagcapture_time; //last time a flag was captured + int numteammates; //number of team mates + int redflagstatus; //0 = at base, 1 = not at base + int blueflagstatus; //0 = at base, 1 = not at base + int neutralflagstatus; //0 = at base, 1 = our team has flag, 2 = enemy team has flag, 3 = enemy team dropped the flag + int flagstatuschanged; //flag status changed + int forceorders; //true if forced to give orders + int flagcarrier; //team mate carrying the enemy flag + int ctfstrategy; //ctf strategy + char subteam[32]; //sub team name + float formation_dist; //formation team mate intervening space + char formation_teammate[16]; //netname of the team mate the bot uses for relative positioning + float formation_angle; //angle relative to the formation team mate + vec3_t formation_dir; //the direction the formation is moving in + vec3_t formation_origin; //origin the bot uses for relative positioning + bot_goal_t formation_goal; //formation goal + + bot_activategoal_t *activatestack; //first activate goal on the stack + bot_activategoal_t activategoalheap[MAX_ACTIVATESTACK]; //activate goal heap + + bot_waypoint_t *checkpoints; //check points + bot_waypoint_t *patrolpoints; //patrol points + bot_waypoint_t *curpatrolpoint; //current patrol point the bot is going for + int patrolflags; //patrol flags +} bot_state_t; + +//resets the whole bot state +void BotResetState(bot_state_t *bs); +//returns the number of bots in the game +int NumBots(void); +//returns info about the entity +void BotEntityInfo(int entnum, aas_entityinfo_t *info); + +extern float floattime; +#define FloatTime() floattime + +// from the game source +void QDECL BotAI_Print(int type, char *fmt, ...); +void QDECL QDECL BotAI_BotInitialChat( bot_state_t *bs, char *type, ... ); +void BotAI_Trace(bsp_trace_t *bsptrace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask); +int BotAI_GetClientState( int clientNum, playerState_t *state ); +int BotAI_GetEntityState( int entityNum, entityState_t *state ); +int BotAI_GetSnapshotEntity( int clientNum, int sequence, entityState_t *state ); +int BotTeamLeader(bot_state_t *bs); diff --git a/quake3/source/code/game/ai_team.c b/quake3/source/code/game/ai_team.c new file mode 100644 index 0000000..6f01ccc --- /dev/null +++ b/quake3/source/code/game/ai_team.c @@ -0,0 +1,2071 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_team.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_team.c $ + * + *****************************************************************************/ + +#include "g_local.h" +#include "botlib.h" +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +#include "ai_team.h" +#include "ai_vcmd.h" + +#include "match.h" + +// for the voice chats +#include "../../ui/menudef.h" + +//ctf task preferences for a client +typedef struct bot_ctftaskpreference_s +{ + char name[36]; + int preference; +} bot_ctftaskpreference_t; + +bot_ctftaskpreference_t ctftaskpreferences[MAX_CLIENTS]; + + +/* +================== +BotValidTeamLeader +================== +*/ +int BotValidTeamLeader(bot_state_t *bs) { + if (!strlen(bs->teamleader)) return qfalse; + if (ClientFromName(bs->teamleader) == -1) return qfalse; + return qtrue; +} + +/* +================== +BotNumTeamMates +================== +*/ +int BotNumTeamMates(bot_state_t *bs) { + int i, numplayers; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + //PKMOD - Ergodic 12/12/01 - include a player buffer for Private_Bots + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients") + MAX_PRIVATE_BOTS; + + numplayers = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + if (BotSameTeam(bs, i)) { + numplayers++; + } + } + return numplayers; +} + +/* +================== +BotClientTravelTimeToGoal +================== +*/ +int BotClientTravelTimeToGoal(int client, bot_goal_t *goal) { + playerState_t ps; + int areanum; + + BotAI_GetClientState(client, &ps); + areanum = BotPointAreaNum(ps.origin); + if (!areanum) return 1; + return trap_AAS_AreaTravelTimeToGoalArea(areanum, ps.origin, goal->areanum, TFL_DEFAULT); +} + +/* +================== +BotSortTeamMatesByBaseTravelTime +================== +*/ +int BotSortTeamMatesByBaseTravelTime(bot_state_t *bs, int *teammates, int maxteammates) { + + int i, j, k, numteammates, traveltime; + char buf[MAX_INFO_STRING]; + static int maxclients; + int traveltimes[MAX_CLIENTS]; + bot_goal_t *goal = NULL; + + if (gametype == GT_CTF || gametype == GT_1FCTF) { + if (BotTeam(bs) == TEAM_RED) + goal = &ctf_redflag; + else + goal = &ctf_blueflag; + } +#ifdef MISSIONPACK + else { + if (BotTeam(bs) == TEAM_RED) + goal = &redobelisk; + else + goal = &blueobelisk; + } +#endif + if (!maxclients) + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients"); + + numteammates = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + if (BotSameTeam(bs, i)) { + // + traveltime = BotClientTravelTimeToGoal(i, goal); + // + for (j = 0; j < numteammates; j++) { + if (traveltime < traveltimes[j]) { + for (k = numteammates; k > j; k--) { + traveltimes[k] = traveltimes[k-1]; + teammates[k] = teammates[k-1]; + } + break; + } + } + traveltimes[j] = traveltime; + teammates[j] = i; + numteammates++; + if (numteammates >= maxteammates) break; + } + } + return numteammates; +} + +/* +================== +BotSetTeamMateTaskPreference +================== +*/ +void BotSetTeamMateTaskPreference(bot_state_t *bs, int teammate, int preference) { + char teammatename[MAX_NETNAME]; + + ctftaskpreferences[teammate].preference = preference; + ClientName(teammate, teammatename, sizeof(teammatename)); + strcpy(ctftaskpreferences[teammate].name, teammatename); +} + +/* +================== +BotGetTeamMateTaskPreference +================== +*/ +int BotGetTeamMateTaskPreference(bot_state_t *bs, int teammate) { + char teammatename[MAX_NETNAME]; + + if (!ctftaskpreferences[teammate].preference) return 0; + ClientName(teammate, teammatename, sizeof(teammatename)); + if (Q_stricmp(teammatename, ctftaskpreferences[teammate].name)) return 0; + return ctftaskpreferences[teammate].preference; +} + +/* +================== +BotSortTeamMatesByTaskPreference +================== +*/ +int BotSortTeamMatesByTaskPreference(bot_state_t *bs, int *teammates, int numteammates) { + int defenders[MAX_CLIENTS], numdefenders; + int attackers[MAX_CLIENTS], numattackers; + int roamers[MAX_CLIENTS], numroamers; + int i, preference; + + numdefenders = numattackers = numroamers = 0; + for (i = 0; i < numteammates; i++) { + preference = BotGetTeamMateTaskPreference(bs, teammates[i]); + if (preference & TEAMTP_DEFENDER) { + defenders[numdefenders++] = teammates[i]; + } + else if (preference & TEAMTP_ATTACKER) { + attackers[numattackers++] = teammates[i]; + } + else { + roamers[numroamers++] = teammates[i]; + } + } + numteammates = 0; + //defenders at the front of the list + memcpy(&teammates[numteammates], defenders, numdefenders * sizeof(int)); + numteammates += numdefenders; + //roamers in the middle + memcpy(&teammates[numteammates], roamers, numroamers * sizeof(int)); + numteammates += numroamers; + //attacker in the back of the list + memcpy(&teammates[numteammates], attackers, numattackers * sizeof(int)); + numteammates += numattackers; + + return numteammates; +} + +/* +================== +BotSayTeamOrders +================== +*/ +void BotSayTeamOrderAlways(bot_state_t *bs, int toclient) { + char teamchat[MAX_MESSAGE_SIZE]; + char buf[MAX_MESSAGE_SIZE]; + char name[MAX_NETNAME]; + + //if the bot is talking to itself + if (bs->client == toclient) { + //don't show the message just put it in the console message queue + trap_BotGetChatMessage(bs->cs, buf, sizeof(buf)); + ClientName(bs->client, name, sizeof(name)); + Com_sprintf(teamchat, sizeof(teamchat), EC"(%s"EC")"EC": %s", name, buf); + trap_BotQueueConsoleMessage(bs->cs, CMS_CHAT, teamchat); + } + else { + trap_BotEnterChat(bs->cs, toclient, CHAT_TELL); + } +} + +/* +================== +BotSayTeamOrders +================== +*/ +void BotSayTeamOrder(bot_state_t *bs, int toclient) { +#ifdef MISSIONPACK + // voice chats only + char buf[MAX_MESSAGE_SIZE]; + + trap_BotGetChatMessage(bs->cs, buf, sizeof(buf)); +#else + BotSayTeamOrderAlways(bs, toclient); +#endif +} + +/* +================== +BotVoiceChat +================== +*/ +void BotVoiceChat(bot_state_t *bs, int toclient, char *voicechat) { +#ifdef MISSIONPACK + if (toclient == -1) + // voice only say team + trap_EA_Command(bs->client, va("vsay_team %s", voicechat)); + else + // voice only tell single player + trap_EA_Command(bs->client, va("vtell %d %s", toclient, voicechat)); +#endif +} + +/* +================== +BotVoiceChatOnly +================== +*/ +void BotVoiceChatOnly(bot_state_t *bs, int toclient, char *voicechat) { +#ifdef MISSIONPACK + if (toclient == -1) + // voice only say team + trap_EA_Command(bs->client, va("vosay_team %s", voicechat)); + else + // voice only tell single player + trap_EA_Command(bs->client, va("votell %d %s", toclient, voicechat)); +#endif +} + +/* +================== +BotSayVoiceTeamOrder +================== +*/ +void BotSayVoiceTeamOrder(bot_state_t *bs, int toclient, char *voicechat) { +#ifdef MISSIONPACK + BotVoiceChat(bs, toclient, voicechat); +#endif +} + +/* +================== +BotCTFOrders +================== +*/ +void BotCTFOrders_BothFlagsNotAtBase(bot_state_t *bs) { + int numteammates, defenders, attackers, i, other; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME], carriername[MAX_NETNAME]; + + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //different orders based on the number of team mates + switch(bs->numteammates) { + case 1: break; + case 2: + { + //tell the one not carrying the flag to attack the enemy base + if (teammates[0] != bs->flagcarrier) other = teammates[0]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_GETFLAG); + break; + } + case 3: + { + //tell the one closest to the base not carrying the flag to accompany the flag carrier + if (teammates[0] != bs->flagcarrier) other = teammates[0]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + if ( bs->flagcarrier != -1 ) { + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_FOLLOWFLAGCARRIER); + } + } + else { + // + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_GETFLAG); + } + BotSayTeamOrder(bs, other); + //tell the one furthest from the the base not carrying the flag to get the enemy flag + if (teammates[2] != bs->flagcarrier) other = teammates[2]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_RETURNFLAG); + break; + } + default: + { + defenders = (int) (float) numteammates * 0.4 + 0.5; + if (defenders > 4) defenders = 4; + attackers = (int) (float) numteammates * 0.5 + 0.5; + if (attackers > 5) attackers = 5; + if (bs->flagcarrier != -1) { + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + for (i = 0; i < defenders; i++) { + // + if (teammates[i] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[i], name, sizeof(name)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_FOLLOWFLAGCARRIER); + } + BotSayTeamOrder(bs, teammates[i]); + } + } + else { + for (i = 0; i < defenders; i++) { + // + if (teammates[i] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_GETFLAG); + BotSayTeamOrder(bs, teammates[i]); + } + } + for (i = 0; i < attackers; i++) { + // + if (teammates[numteammates - i - 1] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_RETURNFLAG); + } + // + break; + } + } +} + +/* +================== +BotCTFOrders +================== +*/ +void BotCTFOrders_FlagNotAtBase(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(bs->numteammates) { + case 1: break; + case 2: + { + //both will go for the enemy flag + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_GETFLAG); + // + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //keep one near the base for when the flag is returned + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other two get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //keep some people near the base for when the flag is returned + defenders = (int) (float) numteammates * 0.3 + 0.5; + if (defenders > 3) defenders = 3; + attackers = (int) (float) numteammates * 0.7 + 0.5; + if (attackers > 6) attackers = 6; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_GETFLAG); + } + // + break; + } + } + } + else { + //different orders based on the number of team mates + switch(bs->numteammates) { + case 1: break; + case 2: + { + //both will go for the enemy flag + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_GETFLAG); + // + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //everyone go for the flag + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_GETFLAG); + // + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //keep some people near the base for when the flag is returned + defenders = (int) (float) numteammates * 0.2 + 0.5; + if (defenders > 2) defenders = 2; + attackers = (int) (float) numteammates * 0.7 + 0.5; + if (attackers > 7) attackers = 7; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } +} + +/* +================== +BotCTFOrders +================== +*/ +void BotCTFOrders_EnemyFlagNotAtBase(bot_state_t *bs) { + int numteammates, defenders, attackers, i, other; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME], carriername[MAX_NETNAME]; + + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //tell the one not carrying the flag to defend the base + if (teammates[0] == bs->flagcarrier) other = teammates[1]; + else other = teammates[0]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_DEFEND); + break; + } + case 3: + { + //tell the one closest to the base not carrying the flag to defend the base + if (teammates[0] != bs->flagcarrier) other = teammates[0]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_DEFEND); + //tell the other also to defend the base + if (teammates[2] != bs->flagcarrier) other = teammates[2]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_DEFEND); + break; + } + default: + { + //60% will defend the base + defenders = (int) (float) numteammates * 0.6 + 0.5; + if (defenders > 6) defenders = 6; + //30% accompanies the flag carrier + attackers = (int) (float) numteammates * 0.3 + 0.5; + if (attackers > 3) attackers = 3; + for (i = 0; i < defenders; i++) { + // + if (teammates[i] == bs->flagcarrier) { + continue; + } + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + // if we have a flag carrier + if ( bs->flagcarrier != -1 ) { + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + for (i = 0; i < attackers; i++) { + // + if (teammates[numteammates - i - 1] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_FOLLOWFLAGCARRIER); + } + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + } + } + else { + for (i = 0; i < attackers; i++) { + // + if (teammates[numteammates - i - 1] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + } + } + // + break; + } + } +} + + +/* +================== +BotCTFOrders +================== +*/ +void BotCTFOrders_BothFlagsAtBase(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the second one closest to the base will defend the base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + defenders = (int) (float) numteammates * 0.5 + 0.5; + if (defenders > 5) defenders = 5; + attackers = (int) (float) numteammates * 0.4 + 0.5; + if (attackers > 4) attackers = 4; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } + else { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the others should go for the enemy flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + defenders = (int) (float) numteammates * 0.4 + 0.5; + if (defenders > 4) defenders = 4; + attackers = (int) (float) numteammates * 0.5 + 0.5; + if (attackers > 5) attackers = 5; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } +} + +/* +================== +BotCTFOrders +================== +*/ +void BotCTFOrders(bot_state_t *bs) { + int flagstatus; + + // + if (BotTeam(bs) == TEAM_RED) flagstatus = bs->redflagstatus * 2 + bs->blueflagstatus; + else flagstatus = bs->blueflagstatus * 2 + bs->redflagstatus; + // + switch(flagstatus) { + case 0: BotCTFOrders_BothFlagsAtBase(bs); break; + case 1: BotCTFOrders_EnemyFlagNotAtBase(bs); break; + case 2: BotCTFOrders_FlagNotAtBase(bs); break; + case 3: BotCTFOrders_BothFlagsNotAtBase(bs); break; + } +} + + +/* +================== +BotCreateGroup +================== +*/ +void BotCreateGroup(bot_state_t *bs, int *teammates, int groupsize) { + char name[MAX_NETNAME], leadername[MAX_NETNAME]; + int i; + + // the others in the group will follow the teammates[0] + ClientName(teammates[0], leadername, sizeof(leadername)); + for (i = 1; i < groupsize; i++) + { + ClientName(teammates[i], name, sizeof(name)); + if (teammates[0] == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, leadername, NULL); + } + BotSayTeamOrderAlways(bs, teammates[i]); + } +} + +/* +================== +BotTeamOrders + + FIXME: defend key areas? +================== +*/ +void BotTeamOrders(bot_state_t *bs) { + int teammates[MAX_CLIENTS]; + int numteammates, i; + char buf[MAX_INFO_STRING]; + static int maxclients; + + if (!maxclients) + maxclients = trap_Cvar_VariableIntegerValue("sv_maxclients"); + + numteammates = 0; + for (i = 0; i < maxclients && i < MAX_CLIENTS; i++) { + trap_GetConfigstring(CS_PLAYERS+i, buf, sizeof(buf)); + //if no config string or no name + if (!strlen(buf) || !strlen(Info_ValueForKey(buf, "n"))) continue; + //skip spectators + if (atoi(Info_ValueForKey(buf, "t")) == TEAM_SPECTATOR) continue; + // + if (BotSameTeam(bs, i)) { + teammates[numteammates] = i; + numteammates++; + } + } + // + switch(numteammates) { + case 1: break; + case 2: + { + //nothing special + break; + } + case 3: + { + //have one follow another and one free roaming + BotCreateGroup(bs, teammates, 2); + break; + } + case 4: + { + BotCreateGroup(bs, teammates, 2); //a group of 2 + BotCreateGroup(bs, &teammates[2], 2); //a group of 2 + break; + } + case 5: + { + BotCreateGroup(bs, teammates, 2); //a group of 2 + BotCreateGroup(bs, &teammates[2], 3); //a group of 3 + break; + } + default: + { + if (numteammates <= 10) { + for (i = 0; i < numteammates / 2; i++) { + BotCreateGroup(bs, &teammates[i*2], 2); //groups of 2 + } + } + break; + } + } +} + +#ifdef MISSIONPACK + +/* +================== +Bot1FCTFOrders_FlagAtCenter + + X% defend the base, Y% get the flag +================== +*/ +void Bot1FCTFOrders_FlagAtCenter(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the second one closest to the base will defend the base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //50% defend the base + defenders = (int) (float) numteammates * 0.5 + 0.5; + if (defenders > 5) defenders = 5; + //40% get the flag + attackers = (int) (float) numteammates * 0.4 + 0.5; + if (attackers > 4) attackers = 4; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } + else { //agressive + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the others should go for the enemy flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //30% defend the base + defenders = (int) (float) numteammates * 0.3 + 0.5; + if (defenders > 3) defenders = 3; + //60% get the flag + attackers = (int) (float) numteammates * 0.6 + 0.5; + if (attackers > 6) attackers = 6; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } +} + +/* +================== +Bot1FCTFOrders_TeamHasFlag + + X% towards neutral flag, Y% go towards enemy base and accompany flag carrier if visible +================== +*/ +void Bot1FCTFOrders_TeamHasFlag(bot_state_t *bs) { + int numteammates, defenders, attackers, i, other; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME], carriername[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //tell the one not carrying the flag to attack the enemy base + if (teammates[0] == bs->flagcarrier) other = teammates[1]; + else other = teammates[0]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_OFFENSE); + break; + } + case 3: + { + //tell the one closest to the base not carrying the flag to defend the base + if (teammates[0] != bs->flagcarrier) other = teammates[0]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_DEFEND); + //tell the one furthest from the base not carrying the flag to accompany the flag carrier + if (teammates[2] != bs->flagcarrier) other = teammates[2]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + if ( bs->flagcarrier != -1 ) { + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_FOLLOWFLAGCARRIER); + } + } + else { + // + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_GETFLAG); + } + BotSayTeamOrder(bs, other); + break; + } + default: + { + //30% will defend the base + defenders = (int) (float) numteammates * 0.3 + 0.5; + if (defenders > 3) defenders = 3; + //70% accompanies the flag carrier + attackers = (int) (float) numteammates * 0.7 + 0.5; + if (attackers > 7) attackers = 7; + for (i = 0; i < defenders; i++) { + // + if (teammates[i] == bs->flagcarrier) { + continue; + } + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + if (bs->flagcarrier != -1) { + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + for (i = 0; i < attackers; i++) { + // + if (teammates[numteammates - i - 1] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_FOLLOWFLAGCARRIER); + } + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + } + } + else { + for (i = 0; i < attackers; i++) { + // + if (teammates[numteammates - i - 1] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + } + // + break; + } + } + } + else { //agressive + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //tell the one not carrying the flag to defend the base + if (teammates[0] == bs->flagcarrier) other = teammates[1]; + else other = teammates[0]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_DEFEND); + break; + } + case 3: + { + //tell the one closest to the base not carrying the flag to defend the base + if (teammates[0] != bs->flagcarrier) other = teammates[0]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, other); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_DEFEND); + //tell the one furthest from the base not carrying the flag to accompany the flag carrier + if (teammates[2] != bs->flagcarrier) other = teammates[2]; + else other = teammates[1]; + ClientName(other, name, sizeof(name)); + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, other, VOICECHAT_FOLLOWFLAGCARRIER); + } + BotSayTeamOrder(bs, other); + break; + } + default: + { + //20% will defend the base + defenders = (int) (float) numteammates * 0.2 + 0.5; + if (defenders > 2) defenders = 2; + //80% accompanies the flag carrier + attackers = (int) (float) numteammates * 0.8 + 0.5; + if (attackers > 8) attackers = 8; + for (i = 0; i < defenders; i++) { + // + if (teammates[i] == bs->flagcarrier) { + continue; + } + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + ClientName(bs->flagcarrier, carriername, sizeof(carriername)); + for (i = 0; i < attackers; i++) { + // + if (teammates[numteammates - i - 1] == bs->flagcarrier) { + continue; + } + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + if (bs->flagcarrier == bs->client) { + BotAI_BotInitialChat(bs, "cmd_accompanyme", name, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_FOLLOWME); + } + else { + BotAI_BotInitialChat(bs, "cmd_accompany", name, carriername, NULL); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_FOLLOWFLAGCARRIER); + } + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + } + // + break; + } + } + } +} + +/* +================== +Bot1FCTFOrders_EnemyHasFlag + + X% defend the base, Y% towards neutral flag +================== +*/ +void Bot1FCTFOrders_EnemyHasFlag(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //both defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + // + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the second one closest to the base will defend the base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + //the other will also defend the base + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_DEFEND); + break; + } + default: + { + //80% will defend the base + defenders = (int) (float) numteammates * 0.8 + 0.5; + if (defenders > 8) defenders = 8; + //10% will try to return the flag + attackers = (int) (float) numteammates * 0.1 + 0.5; + if (attackers > 2) attackers = 2; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_returnflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } + else { //agressive + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the others should go for the enemy flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_returnflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //70% defend the base + defenders = (int) (float) numteammates * 0.7 + 0.5; + if (defenders > 8) defenders = 8; + //20% try to return the flag + attackers = (int) (float) numteammates * 0.2 + 0.5; + if (attackers > 2) attackers = 2; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_returnflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } +} + +/* +================== +Bot1FCTFOrders_EnemyDroppedFlag + + X% defend the base, Y% get the flag +================== +*/ +void Bot1FCTFOrders_EnemyDroppedFlag(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the second one closest to the base will defend the base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //50% defend the base + defenders = (int) (float) numteammates * 0.5 + 0.5; + if (defenders > 5) defenders = 5; + //40% get the flag + attackers = (int) (float) numteammates * 0.4 + 0.5; + if (attackers > 4) attackers = 4; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_GETFLAG); + } + // + break; + } + } + } + else { //agressive + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will get the flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the others should go for the enemy flag + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_GETFLAG); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_GETFLAG); + break; + } + default: + { + //30% defend the base + defenders = (int) (float) numteammates * 0.3 + 0.5; + if (defenders > 3) defenders = 3; + //60% get the flag + attackers = (int) (float) numteammates * 0.6 + 0.5; + if (attackers > 6) attackers = 6; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_getflag", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_DEFEND); + } + // + break; + } + } + } +} + +/* +================== +Bot1FCTFOrders +================== +*/ +void Bot1FCTFOrders(bot_state_t *bs) { + switch(bs->neutralflagstatus) { + case 0: Bot1FCTFOrders_FlagAtCenter(bs); break; + case 1: Bot1FCTFOrders_TeamHasFlag(bs); break; + case 2: Bot1FCTFOrders_EnemyHasFlag(bs); break; + case 3: Bot1FCTFOrders_EnemyDroppedFlag(bs); break; + } +} + +/* +================== +BotObeliskOrders + + X% in defence Y% in offence +================== +*/ +void BotObeliskOrders(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will attack the enemy base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_OFFENSE); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the one second closest to the base also defends the base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + //the other one attacks the enemy base + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_OFFENSE); + break; + } + default: + { + //50% defend the base + defenders = (int) (float) numteammates * 0.5 + 0.5; + if (defenders > 5) defenders = 5; + //40% attack the enemy base + attackers = (int) (float) numteammates * 0.4 + 0.5; + if (attackers > 4) attackers = 4; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_OFFENSE); + } + // + break; + } + } + } + else { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will attack the enemy base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_OFFENSE); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the others attack the enemy base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_OFFENSE); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_OFFENSE); + break; + } + default: + { + //30% defend the base + defenders = (int) (float) numteammates * 0.3 + 0.5; + if (defenders > 3) defenders = 3; + //70% attack the enemy base + attackers = (int) (float) numteammates * 0.7 + 0.5; + if (attackers > 7) attackers = 7; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_attackenemybase", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_OFFENSE); + } + // + break; + } + } + } +} + +/* +================== +BotHarvesterOrders + + X% defend the base, Y% harvest +================== +*/ +void BotHarvesterOrders(bot_state_t *bs) { + int numteammates, defenders, attackers, i; + int teammates[MAX_CLIENTS]; + char name[MAX_NETNAME]; + + //sort team mates by travel time to base + numteammates = BotSortTeamMatesByBaseTravelTime(bs, teammates, sizeof(teammates)); + //sort team mates by CTF preference + BotSortTeamMatesByTaskPreference(bs, teammates, numteammates); + //passive strategy + if (!(bs->ctfstrategy & CTFS_AGRESSIVE)) { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will harvest + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_OFFENSE); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the one second closest to the base also defends the base + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_DEFEND); + //the other one goes harvesting + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_OFFENSE); + break; + } + default: + { + //50% defend the base + defenders = (int) (float) numteammates * 0.5 + 0.5; + if (defenders > 5) defenders = 5; + //40% goes harvesting + attackers = (int) (float) numteammates * 0.4 + 0.5; + if (attackers > 4) attackers = 4; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_OFFENSE); + } + // + break; + } + } + } + else { + //different orders based on the number of team mates + switch(numteammates) { + case 1: break; + case 2: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the other will harvest + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_OFFENSE); + break; + } + case 3: + { + //the one closest to the base will defend the base + ClientName(teammates[0], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[0]); + BotSayVoiceTeamOrder(bs, teammates[0], VOICECHAT_DEFEND); + //the others go harvesting + ClientName(teammates[1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[1]); + BotSayVoiceTeamOrder(bs, teammates[1], VOICECHAT_OFFENSE); + // + ClientName(teammates[2], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[2]); + BotSayVoiceTeamOrder(bs, teammates[2], VOICECHAT_OFFENSE); + break; + } + default: + { + //30% defend the base + defenders = (int) (float) numteammates * 0.3 + 0.5; + if (defenders > 3) defenders = 3; + //70% go harvesting + attackers = (int) (float) numteammates * 0.7 + 0.5; + if (attackers > 7) attackers = 7; + for (i = 0; i < defenders; i++) { + // + ClientName(teammates[i], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_defendbase", name, NULL); + BotSayTeamOrder(bs, teammates[i]); + BotSayVoiceTeamOrder(bs, teammates[i], VOICECHAT_DEFEND); + } + for (i = 0; i < attackers; i++) { + // + ClientName(teammates[numteammates - i - 1], name, sizeof(name)); + BotAI_BotInitialChat(bs, "cmd_harvest", name, NULL); + BotSayTeamOrder(bs, teammates[numteammates - i - 1]); + BotSayVoiceTeamOrder(bs, teammates[numteammates - i - 1], VOICECHAT_OFFENSE); + } + // + break; + } + } + } +} +#endif + +/* +================== +FindHumanTeamLeader +================== +*/ +int FindHumanTeamLeader(bot_state_t *bs) { + int i; + + for (i = 0; i < MAX_CLIENTS; i++) { + if ( g_entities[i].inuse ) { + // if this player is not a bot + if ( !(g_entities[i].r.svFlags & SVF_BOT) ) { + // if this player is ok with being the leader + if (!notleader[i]) { + // if this player is on the same team + if ( BotSameTeam(bs, i) ) { + ClientName(i, bs->teamleader, sizeof(bs->teamleader)); + // if not yet ordered to do anything + if ( !BotSetLastOrderedTask(bs) ) { + // go on defense by default + BotVoiceChat_Defend(bs, i, SAY_TELL); + } + return qtrue; + } + } + } + } + } + return qfalse; +} + +/* +================== +BotTeamAI +================== +*/ +void BotTeamAI(bot_state_t *bs) { + int numteammates; + char netname[MAX_NETNAME]; + + // + if ( gametype < GT_TEAM ) { + //PKMOD - Ergodic 03/30/02 - in a non-team game Private Bot will act as a team follower + if ( g_entities[bs->entitynum].r.svFlags & SVF_PRIVATEBOT ) { + //Does private bot have a teamleader set? + if ( !BotValidTeamLeader(bs) ) { + //Set owner as Private Bot leader + ClientName(g_entities[bs->entitynum].parent->client->ps.clientNum, bs->teamleader, sizeof(bs->teamleader)); + return; + } + } + return; + } + // make sure we've got a valid team leader + if (!BotValidTeamLeader(bs)) { + // + if (!FindHumanTeamLeader(bs)) { + // + if (!bs->askteamleader_time && !bs->becometeamleader_time) { + if (bs->entergame_time + 10 > FloatTime()) { + bs->askteamleader_time = FloatTime() + 5 + random() * 10; + } + else { + bs->becometeamleader_time = FloatTime() + 5 + random() * 10; + } + } + if (bs->askteamleader_time && bs->askteamleader_time < FloatTime()) { + // if asked for a team leader and no response + BotAI_BotInitialChat(bs, "whoisteamleader", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + bs->askteamleader_time = 0; + bs->becometeamleader_time = FloatTime() + 8 + random() * 10; + } + if (bs->becometeamleader_time && bs->becometeamleader_time < FloatTime()) { + BotAI_BotInitialChat(bs, "iamteamleader", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotSayVoiceTeamOrder(bs, -1, VOICECHAT_STARTLEADER); + ClientName(bs->client, netname, sizeof(netname)); + strncpy(bs->teamleader, netname, sizeof(bs->teamleader)); + bs->teamleader[sizeof(bs->teamleader)] = '\0'; + bs->becometeamleader_time = 0; + } + return; + } + } + bs->askteamleader_time = 0; + bs->becometeamleader_time = 0; + + //return if this bot is NOT the team leader + ClientName(bs->client, netname, sizeof(netname)); + if (Q_stricmp(netname, bs->teamleader) != 0) return; + // + numteammates = BotNumTeamMates(bs); + //give orders + switch(gametype) { + case GT_TEAM: + { + if (bs->numteammates != numteammates || bs->forceorders) { + bs->teamgiveorders_time = FloatTime(); + bs->numteammates = numteammates; + bs->forceorders = qfalse; + } + //if it's time to give orders + if (bs->teamgiveorders_time && bs->teamgiveorders_time < FloatTime() - 5) { + BotTeamOrders(bs); + //give orders again after 120 seconds + bs->teamgiveorders_time = FloatTime() + 120; + } + break; + } + case GT_CTF: + { + //if the number of team mates changed or the flag status changed + //or someone wants to know what to do + if (bs->numteammates != numteammates || bs->flagstatuschanged || bs->forceorders) { + bs->teamgiveorders_time = FloatTime(); + bs->numteammates = numteammates; + bs->flagstatuschanged = qfalse; + bs->forceorders = qfalse; + } + //if there were no flag captures the last 3 minutes + if (bs->lastflagcapture_time < FloatTime() - 240) { + bs->lastflagcapture_time = FloatTime(); + //randomly change the CTF strategy + if (random() < 0.4) { + bs->ctfstrategy ^= CTFS_AGRESSIVE; + bs->teamgiveorders_time = FloatTime(); + } + } + //if it's time to give orders + if (bs->teamgiveorders_time && bs->teamgiveorders_time < FloatTime() - 3) { + BotCTFOrders(bs); + // + bs->teamgiveorders_time = 0; + } + break; + } +#ifdef MISSIONPACK + case GT_1FCTF: + { + if (bs->numteammates != numteammates || bs->flagstatuschanged || bs->forceorders) { + bs->teamgiveorders_time = FloatTime(); + bs->numteammates = numteammates; + bs->flagstatuschanged = qfalse; + bs->forceorders = qfalse; + } + //if there were no flag captures the last 4 minutes + if (bs->lastflagcapture_time < FloatTime() - 240) { + bs->lastflagcapture_time = FloatTime(); + //randomly change the CTF strategy + if (random() < 0.4) { + bs->ctfstrategy ^= CTFS_AGRESSIVE; + bs->teamgiveorders_time = FloatTime(); + } + } + //if it's time to give orders + if (bs->teamgiveorders_time && bs->teamgiveorders_time < FloatTime() - 2) { + Bot1FCTFOrders(bs); + // + bs->teamgiveorders_time = 0; + } + break; + } + case GT_OBELISK: + { + if (bs->numteammates != numteammates || bs->forceorders) { + bs->teamgiveorders_time = FloatTime(); + bs->numteammates = numteammates; + bs->forceorders = qfalse; + } + //if it's time to give orders + if (bs->teamgiveorders_time && bs->teamgiveorders_time < FloatTime() - 5) { + BotObeliskOrders(bs); + //give orders again after 30 seconds + bs->teamgiveorders_time = FloatTime() + 30; + } + break; + } + case GT_HARVESTER: + { + if (bs->numteammates != numteammates || bs->forceorders) { + bs->teamgiveorders_time = FloatTime(); + bs->numteammates = numteammates; + bs->forceorders = qfalse; + } + //if it's time to give orders + if (bs->teamgiveorders_time && bs->teamgiveorders_time < FloatTime() - 5) { + BotHarvesterOrders(bs); + //give orders again after 30 seconds + bs->teamgiveorders_time = FloatTime() + 30; + } + break; + } +#endif + } +} + diff --git a/quake3/source/code/game/ai_team.h b/quake3/source/code/game/ai_team.h new file mode 100644 index 0000000..4c3e8f1 --- /dev/null +++ b/quake3/source/code/game/ai_team.h @@ -0,0 +1,19 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_team.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_chat.c $ + * + *****************************************************************************/ + +void BotTeamAI(bot_state_t *bs); +int BotGetTeamMateTaskPreference(bot_state_t *bs, int teammate); +void BotSetTeamMateTaskPreference(bot_state_t *bs, int teammate, int preference); +void BotVoiceChat(bot_state_t *bs, int toclient, char *voicechat); +void BotVoiceChatOnly(bot_state_t *bs, int toclient, char *voicechat); + + diff --git a/quake3/source/code/game/ai_vcmd.c b/quake3/source/code/game/ai_vcmd.c new file mode 100644 index 0000000..48b095e --- /dev/null +++ b/quake3/source/code/game/ai_vcmd.c @@ -0,0 +1,530 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_vcmd.c + * + * desc: Quake3 bot AI + * + * $Archive: /MissionPack/code/game/ai_vcmd.c $ + * + *****************************************************************************/ + +#include "g_local.h" +#include "botlib.h" +#include "be_aas.h" +#include "be_ea.h" +#include "be_ai_char.h" +#include "be_ai_chat.h" +#include "be_ai_gen.h" +#include "be_ai_goal.h" +#include "be_ai_move.h" +#include "be_ai_weap.h" +// +#include "ai_main.h" +#include "ai_dmq3.h" +#include "ai_chat.h" +#include "ai_cmd.h" +#include "ai_dmnet.h" +#include "ai_team.h" +#include "ai_vcmd.h" +// +#include "chars.h" //characteristics +#include "inv.h" //indexes into the inventory +#include "syn.h" //synonyms +#include "match.h" //string matching types and vars + +// for the voice chats +#include "../../ui/menudef.h" + + +typedef struct voiceCommand_s +{ + char *cmd; + void (*func)(bot_state_t *bs, int client, int mode); +} voiceCommand_t; + +/* +================== +BotVoiceChat_GetFlag +================== +*/ +void BotVoiceChat_GetFlag(bot_state_t *bs, int client, int mode) { + // + if (gametype == GT_CTF) { + if (!ctf_redflag.areanum || !ctf_blueflag.areanum) + return; + } +#ifdef MISSIONPACK + else if (gametype == GT_1FCTF) { + if (!ctf_neutralflag.areanum || !ctf_redflag.areanum || !ctf_blueflag.areanum) + return; + } +#endif + else { + return; + } + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_GETFLAG; + //set the team goal time + bs->teamgoal_time = FloatTime() + CTF_GETFLAG_TIME; + // get an alternate route in ctf + if (gametype == GT_CTF) { + //get an alternative route goal towards the enemy base + BotGetAlternateRouteGoal(bs, BotOppositeTeam(bs)); + } + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_Offense +================== +*/ +void BotVoiceChat_Offense(bot_state_t *bs, int client, int mode) { + if ( gametype == GT_CTF +#ifdef MISSIONPACK + || gametype == GT_1FCTF +#endif + ) { + BotVoiceChat_GetFlag(bs, client, mode); + return; + } +#ifdef MISSIONPACK + if (gametype == GT_HARVESTER) { + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_HARVEST; + //set the team goal time + bs->teamgoal_time = FloatTime() + TEAM_HARVEST_TIME; + bs->harvestaway_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); + } + else +#endif + { + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_ATTACKENEMYBASE; + //set the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ATTACKENEMYBASE_TIME; + bs->attackaway_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); + } +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_Defend +================== +*/ +void BotVoiceChat_Defend(bot_state_t *bs, int client, int mode) { +#ifdef MISSIONPACK + if ( gametype == GT_OBELISK || gametype == GT_HARVESTER) { + // + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(&bs->teamgoal, &redobelisk, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(&bs->teamgoal, &blueobelisk, sizeof(bot_goal_t)); break; + default: return; + } + } + else +#endif + if (gametype == GT_CTF +#ifdef MISSIONPACK + || gametype == GT_1FCTF +#endif + ) { + // + switch(BotTeam(bs)) { + case TEAM_RED: memcpy(&bs->teamgoal, &ctf_redflag, sizeof(bot_goal_t)); break; + case TEAM_BLUE: memcpy(&bs->teamgoal, &ctf_blueflag, sizeof(bot_goal_t)); break; + default: return; + } + } + else { + return; + } + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_DEFENDKEYAREA; + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_DEFENDKEYAREA_TIME; + //away from defending + bs->defendaway_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_DefendFlag +================== +*/ +void BotVoiceChat_DefendFlag(bot_state_t *bs, int client, int mode) { + BotVoiceChat_Defend(bs, client, mode); +} + +/* +================== +BotVoiceChat_Patrol +================== +*/ +void BotVoiceChat_Patrol(bot_state_t *bs, int client, int mode) { + // + bs->decisionmaker = client; + // + bs->ltgtype = 0; + bs->lead_time = 0; + bs->lastgoal_ltgtype = 0; + // + BotAI_BotInitialChat(bs, "dismissed", NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + BotVoiceChatOnly(bs, -1, VOICECHAT_ONPATROL); + // + BotSetTeamStatus(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_Camp +================== +*/ +void BotVoiceChat_Camp(bot_state_t *bs, int client, int mode) { + int areanum; + aas_entityinfo_t entinfo; + char netname[MAX_NETNAME]; + + // + bs->teamgoal.entitynum = -1; + BotEntityInfo(client, &entinfo); + //if info is valid (in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum) { // && trap_AAS_AreaReachability(areanum)) { + //NOTE: just assume the bot knows where the person is + //if (BotEntityVisible(bs->entitynum, bs->eye, bs->viewangles, 360, client)) { + bs->teamgoal.entitynum = client; + bs->teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + //} + } + } + //if the other is not visible + if (bs->teamgoal.entitynum < 0) { + BotAI_BotInitialChat(bs, "whereareyou", EasyClientName(client, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + return; + } + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_CAMPORDER; + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_CAMP_TIME; + //the teammate that requested the camping + bs->teammate = client; + //not arrived yet + bs->arrive_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_FollowMe +================== +*/ +void BotVoiceChat_FollowMe(bot_state_t *bs, int client, int mode) { + int areanum; + aas_entityinfo_t entinfo; + char netname[MAX_NETNAME]; + + bs->teamgoal.entitynum = -1; + BotEntityInfo(client, &entinfo); + //if info is valid (in PVS) + if (entinfo.valid) { + areanum = BotPointAreaNum(entinfo.origin); + if (areanum) { // && trap_AAS_AreaReachability(areanum)) { + bs->teamgoal.entitynum = client; + bs->teamgoal.areanum = areanum; + VectorCopy(entinfo.origin, bs->teamgoal.origin); + VectorSet(bs->teamgoal.mins, -8, -8, -8); + VectorSet(bs->teamgoal.maxs, 8, 8, 8); + } + } + //if the other is not visible + if (bs->teamgoal.entitynum < 0) { + BotAI_BotInitialChat(bs, "whereareyou", EasyClientName(client, netname, sizeof(netname)), NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + return; + } + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //the team mate + bs->teammate = client; + //last time the team mate was assumed visible + bs->teammatevisible_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //get the team goal time + bs->teamgoal_time = FloatTime() + TEAM_ACCOMPANY_TIME; + //set the ltg type + bs->ltgtype = LTG_TEAMACCOMPANY; + bs->formation_dist = 3.5 * 32; //3.5 meter + bs->arrive_time = 0; + // + BotSetTeamStatus(bs); + // remember last ordered task + BotRememberLastOrderedTask(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_FollowFlagCarrier +================== +*/ +void BotVoiceChat_FollowFlagCarrier(bot_state_t *bs, int client, int mode) { + int carrier; + + carrier = BotTeamFlagCarrier(bs); + if (carrier >= 0) + BotVoiceChat_FollowMe(bs, carrier, mode); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_ReturnFlag +================== +*/ +void BotVoiceChat_ReturnFlag(bot_state_t *bs, int client, int mode) { + //if not in CTF mode + if ( + gametype != GT_CTF +#ifdef MISSIONPACK + && gametype != GT_1FCTF +#endif + ) { + return; + } + // + bs->decisionmaker = client; + bs->ordered = qtrue; + bs->order_time = FloatTime(); + //set the time to send a message to the team mates + bs->teammessage_time = FloatTime() + 2 * random(); + //set the ltg type + bs->ltgtype = LTG_RETURNFLAG; + //set the team goal time + bs->teamgoal_time = FloatTime() + CTF_RETURNFLAG_TIME; + bs->rushbaseaway_time = 0; + BotSetTeamStatus(bs); +#ifdef DEBUG + BotPrintTeamGoal(bs); +#endif //DEBUG +} + +/* +================== +BotVoiceChat_StartLeader +================== +*/ +void BotVoiceChat_StartLeader(bot_state_t *bs, int client, int mode) { + ClientName(client, bs->teamleader, sizeof(bs->teamleader)); +} + +/* +================== +BotVoiceChat_StopLeader +================== +*/ +void BotVoiceChat_StopLeader(bot_state_t *bs, int client, int mode) { + char netname[MAX_MESSAGE_SIZE]; + + if (!Q_stricmp(bs->teamleader, ClientName(client, netname, sizeof(netname)))) { + bs->teamleader[0] = '\0'; + notleader[client] = qtrue; + } +} + +/* +================== +BotVoiceChat_WhoIsLeader +================== +*/ +void BotVoiceChat_WhoIsLeader(bot_state_t *bs, int client, int mode) { + char netname[MAX_MESSAGE_SIZE]; + + if (!TeamPlayIsOn()) return; + + ClientName(bs->client, netname, sizeof(netname)); + //if this bot IS the team leader + if (!Q_stricmp(netname, bs->teamleader)) { + BotAI_BotInitialChat(bs, "iamteamleader", NULL); + trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); + BotVoiceChatOnly(bs, -1, VOICECHAT_STARTLEADER); + } +} + +/* +================== +BotVoiceChat_WantOnDefense +================== +*/ +void BotVoiceChat_WantOnDefense(bot_state_t *bs, int client, int mode) { + char netname[MAX_NETNAME]; + int preference; + + preference = BotGetTeamMateTaskPreference(bs, client); + preference &= ~TEAMTP_ATTACKER; + preference |= TEAMTP_DEFENDER; + BotSetTeamMateTaskPreference(bs, client, preference); + // + EasyClientName(client, netname, sizeof(netname)); + BotAI_BotInitialChat(bs, "keepinmind", netname, NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + BotVoiceChatOnly(bs, client, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); +} + +/* +================== +BotVoiceChat_WantOnOffense +================== +*/ +void BotVoiceChat_WantOnOffense(bot_state_t *bs, int client, int mode) { + char netname[MAX_NETNAME]; + int preference; + + preference = BotGetTeamMateTaskPreference(bs, client); + preference &= ~TEAMTP_DEFENDER; + preference |= TEAMTP_ATTACKER; + BotSetTeamMateTaskPreference(bs, client, preference); + // + EasyClientName(client, netname, sizeof(netname)); + BotAI_BotInitialChat(bs, "keepinmind", netname, NULL); + trap_BotEnterChat(bs->cs, client, CHAT_TELL); + BotVoiceChatOnly(bs, client, VOICECHAT_YES); + trap_EA_Action(bs->client, ACTION_AFFIRMATIVE); +} + +void BotVoiceChat_Dummy(bot_state_t *bs, int client, int mode) { +} + +voiceCommand_t voiceCommands[] = { + {VOICECHAT_GETFLAG, BotVoiceChat_GetFlag}, + {VOICECHAT_OFFENSE, BotVoiceChat_Offense }, + {VOICECHAT_DEFEND, BotVoiceChat_Defend }, + {VOICECHAT_DEFENDFLAG, BotVoiceChat_DefendFlag }, + {VOICECHAT_PATROL, BotVoiceChat_Patrol }, + {VOICECHAT_CAMP, BotVoiceChat_Camp }, + {VOICECHAT_FOLLOWME, BotVoiceChat_FollowMe }, + {VOICECHAT_FOLLOWFLAGCARRIER, BotVoiceChat_FollowFlagCarrier }, + {VOICECHAT_RETURNFLAG, BotVoiceChat_ReturnFlag }, + {VOICECHAT_STARTLEADER, BotVoiceChat_StartLeader }, + {VOICECHAT_STOPLEADER, BotVoiceChat_StopLeader }, + {VOICECHAT_WHOISLEADER, BotVoiceChat_WhoIsLeader }, + {VOICECHAT_WANTONDEFENSE, BotVoiceChat_WantOnDefense }, + {VOICECHAT_WANTONOFFENSE, BotVoiceChat_WantOnOffense }, + {NULL, BotVoiceChat_Dummy} +}; + +int BotVoiceChatCommand(bot_state_t *bs, int mode, char *voiceChat) { + int i, voiceOnly, clientNum, color; + char *ptr, buf[MAX_MESSAGE_SIZE], *cmd; + + if (!TeamPlayIsOn()) { + return qfalse; + } + + if ( mode == SAY_ALL ) { + return qfalse; // don't do anything with voice chats to everyone + } + + Q_strncpyz(buf, voiceChat, sizeof(buf)); + cmd = buf; + for (ptr = cmd; *cmd && *cmd > ' '; cmd++); + while (*cmd && *cmd <= ' ') *cmd++ = '\0'; + voiceOnly = atoi(ptr); + for (ptr = cmd; *cmd && *cmd > ' '; cmd++); + while (*cmd && *cmd <= ' ') *cmd++ = '\0'; + clientNum = atoi(ptr); + for (ptr = cmd; *cmd && *cmd > ' '; cmd++); + while (*cmd && *cmd <= ' ') *cmd++ = '\0'; + color = atoi(ptr); + + if (!BotSameTeam(bs, clientNum)) { + return qfalse; + } + + for (i = 0; voiceCommands[i].cmd; i++) { + if (!Q_stricmp(cmd, voiceCommands[i].cmd)) { + voiceCommands[i].func(bs, clientNum, mode); + return qtrue; + } + } + return qfalse; +} diff --git a/quake3/source/code/game/ai_vcmd.h b/quake3/source/code/game/ai_vcmd.h new file mode 100644 index 0000000..e392a80 --- /dev/null +++ b/quake3/source/code/game/ai_vcmd.h @@ -0,0 +1,16 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: ai_vcmd.h + * + * desc: Quake3 bot AI + * + * $Archive: /source/code/botai/ai_vcmd.c $ + * + *****************************************************************************/ + +int BotVoiceChatCommand(bot_state_t *bs, int mode, char *voicechat); +void BotVoiceChat_Defend(bot_state_t *bs, int client, int mode); + + diff --git a/quake3/source/code/game/be_aas.h b/quake3/source/code/game/be_aas.h new file mode 100644 index 0000000..4676588 --- /dev/null +++ b/quake3/source/code/game/be_aas.h @@ -0,0 +1,201 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: be_aas.h + * + * desc: Area Awareness System, stuff exported to the AI + * + * $Archive: /source/code/botlib/be_aas.h $ + * + *****************************************************************************/ + +#ifndef MAX_STRINGFIELD +#define MAX_STRINGFIELD 80 +#endif + +//travel flags +#define TFL_INVALID 0x00000001 //traveling temporary not possible +#define TFL_WALK 0x00000002 //walking +#define TFL_CROUCH 0x00000004 //crouching +#define TFL_BARRIERJUMP 0x00000008 //jumping onto a barrier +#define TFL_JUMP 0x00000010 //jumping +#define TFL_LADDER 0x00000020 //climbing a ladder +#define TFL_WALKOFFLEDGE 0x00000080 //walking of a ledge +#define TFL_SWIM 0x00000100 //swimming +#define TFL_WATERJUMP 0x00000200 //jumping out of the water +#define TFL_TELEPORT 0x00000400 //teleporting +#define TFL_ELEVATOR 0x00000800 //elevator +#define TFL_ROCKETJUMP 0x00001000 //rocket jumping +#define TFL_BFGJUMP 0x00002000 //bfg jumping +#define TFL_GRAPPLEHOOK 0x00004000 //grappling hook +#define TFL_DOUBLEJUMP 0x00008000 //double jump +#define TFL_RAMPJUMP 0x00010000 //ramp jump +#define TFL_STRAFEJUMP 0x00020000 //strafe jump +#define TFL_JUMPPAD 0x00040000 //jump pad +#define TFL_AIR 0x00080000 //travel through air +#define TFL_WATER 0x00100000 //travel through water +#define TFL_SLIME 0x00200000 //travel through slime +#define TFL_LAVA 0x00400000 //travel through lava +#define TFL_DONOTENTER 0x00800000 //travel through donotenter area +#define TFL_FUNCBOB 0x01000000 //func bobbing +#define TFL_FLIGHT 0x02000000 //flight +#define TFL_BRIDGE 0x04000000 //move over a bridge +// +#define TFL_NOTTEAM1 0x08000000 //not team 1 +#define TFL_NOTTEAM2 0x10000000 //not team 2 + +//default travel flags +#define TFL_DEFAULT TFL_WALK|TFL_CROUCH|TFL_BARRIERJUMP|\ + TFL_JUMP|TFL_LADDER|\ + TFL_WALKOFFLEDGE|TFL_SWIM|TFL_WATERJUMP|\ + TFL_TELEPORT|TFL_ELEVATOR|\ + TFL_AIR|TFL_WATER|TFL_JUMPPAD|TFL_FUNCBOB + +typedef enum +{ + SOLID_NOT, // no interaction with other objects + SOLID_TRIGGER, // only touch when inside, after moving + SOLID_BBOX, // touch on edge + SOLID_BSP // bsp clip, touch on edge +} solid_t; + +//a trace is returned when a box is swept through the AAS world +typedef struct aas_trace_s +{ + qboolean startsolid; // if true, the initial point was in a solid area + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + int ent; // entity blocking the trace + int lastarea; // last area the trace was in (zero if none) + int area; // area blocking the trace (zero if none) + int planenum; // number of the plane that was hit +} aas_trace_t; + +/* Defined in botlib.h + +//bsp_trace_t hit surface +typedef struct bsp_surface_s +{ + char name[16]; + int flags; + int value; +} bsp_surface_t; + +//a trace is returned when a box is swept through the BSP world +typedef struct bsp_trace_s +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + cplane_t plane; // surface normal at impact + float exp_dist; // expanded plane distance + int sidenum; // number of the brush side hit + bsp_surface_t surface; // hit surface + int contents; // contents on other side of surface hit + int ent; // number of entity hit +} bsp_trace_t; +// +*/ + +//entity info +typedef struct aas_entityinfo_s +{ + int valid; // true if updated this frame + int type; // entity type + int flags; // entity flags + float ltime; // local time + float update_time; // time between last and current update + int number; // number of the entity + vec3_t origin; // origin of the entity + vec3_t angles; // angles of the model + vec3_t old_origin; // for lerping + vec3_t lastvisorigin; // last visible origin + vec3_t mins; // bounding box minimums + vec3_t maxs; // bounding box maximums + int groundent; // ground entity + int solid; // solid type + int modelindex; // model used + int modelindex2; // weapons, CTF flags, etc + int frame; // model frame number + int event; // impulse events -- muzzle flashes, footsteps, etc + int eventParm; // even parameter + int powerups; // bit flags + int weapon; // determines weapon and flash model, etc + int legsAnim; // mask off ANIM_TOGGLEBIT + int torsoAnim; // mask off ANIM_TOGGLEBIT +} aas_entityinfo_t; + +// area info +typedef struct aas_areainfo_s +{ + int contents; + int flags; + int presencetype; + int cluster; + vec3_t mins; + vec3_t maxs; + vec3_t center; +} aas_areainfo_t; + +// client movement prediction stop events, stop as soon as: +#define SE_NONE 0 +#define SE_HITGROUND 1 // the ground is hit +#define SE_LEAVEGROUND 2 // there's no ground +#define SE_ENTERWATER 4 // water is entered +#define SE_ENTERSLIME 8 // slime is entered +#define SE_ENTERLAVA 16 // lava is entered +#define SE_HITGROUNDDAMAGE 32 // the ground is hit with damage +#define SE_GAP 64 // there's a gap +#define SE_TOUCHJUMPPAD 128 // touching a jump pad area +#define SE_TOUCHTELEPORTER 256 // touching teleporter +#define SE_ENTERAREA 512 // the given stoparea is entered +#define SE_HITGROUNDAREA 1024 // a ground face in the area is hit +#define SE_HITBOUNDINGBOX 2048 // hit the specified bounding box +#define SE_TOUCHCLUSTERPORTAL 4096 // touching a cluster portal + +typedef struct aas_clientmove_s +{ + vec3_t endpos; //position at the end of movement prediction + int endarea; //area at end of movement prediction + vec3_t velocity; //velocity at the end of movement prediction + aas_trace_t trace; //last trace + int presencetype; //presence type at end of movement prediction + int stopevent; //event that made the prediction stop + int endcontents; //contents at the end of movement prediction + float time; //time predicted ahead + int frames; //number of frames predicted ahead +} aas_clientmove_t; + +// alternate route goals +#define ALTROUTEGOAL_ALL 1 +#define ALTROUTEGOAL_CLUSTERPORTALS 2 +#define ALTROUTEGOAL_VIEWPORTALS 4 + +typedef struct aas_altroutegoal_s +{ + vec3_t origin; + int areanum; + unsigned short starttraveltime; + unsigned short goaltraveltime; + unsigned short extratraveltime; +} aas_altroutegoal_t; + +// route prediction stop events +#define RSE_NONE 0 +#define RSE_NOROUTE 1 //no route to goal +#define RSE_USETRAVELTYPE 2 //stop as soon as on of the given travel types is used +#define RSE_ENTERCONTENTS 4 //stop when entering the given contents +#define RSE_ENTERAREA 8 //stop when entering the given area + +typedef struct aas_predictroute_s +{ + vec3_t endpos; //position at the end of movement prediction + int endarea; //area at end of movement prediction + int stopevent; //event that made the prediction stop + int endcontents; //contents at the end of movement prediction + int endtravelflags; //end travel flags + int numareas; //number of areas predicted ahead + int time; //time predicted ahead (in hundreth of a sec) +} aas_predictroute_t; diff --git a/quake3/source/code/game/be_ai_char.h b/quake3/source/code/game/be_ai_char.h new file mode 100644 index 0000000..693c0bb --- /dev/null +++ b/quake3/source/code/game/be_ai_char.h @@ -0,0 +1,28 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: be_ai_char.h + * + * desc: bot characters + * + * $Archive: /source/code/botlib/be_ai_char.h $ + * + *****************************************************************************/ + +//loads a bot character from a file +int BotLoadCharacter(char *charfile, float skill); +//frees a bot character +void BotFreeCharacter(int character); +//returns a float characteristic +float Characteristic_Float(int character, int index); +//returns a bounded float characteristic +float Characteristic_BFloat(int character, int index, float min, float max); +//returns an integer characteristic +int Characteristic_Integer(int character, int index); +//returns a bounded integer characteristic +int Characteristic_BInteger(int character, int index, int min, int max); +//returns a string characteristic +void Characteristic_String(int character, int index, char *buf, int size); +//free cached bot characters +void BotShutdownCharacters(void); diff --git a/quake3/source/code/game/be_ai_chat.h b/quake3/source/code/game/be_ai_chat.h new file mode 100644 index 0000000..f5231ad --- /dev/null +++ b/quake3/source/code/game/be_ai_chat.h @@ -0,0 +1,93 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +/***************************************************************************** + * name: be_ai_chat.h + * + * desc: char AI + * + * $Archive: /source/code/botlib/be_ai_chat.h $ + * + *****************************************************************************/ + +#define MAX_MESSAGE_SIZE 256 +#define MAX_CHATTYPE_NAME 32 +#define MAX_MATCHVARIABLES 8 + +#define CHAT_GENDERLESS 0 +#define CHAT_GENDERFEMALE 1 +#define CHAT_GENDERMALE 2 + +#define CHAT_ALL 0 +#define CHAT_TEAM 1 +#define CHAT_TELL 2 + +//a console message +typedef struct bot_consolemessage_s +{ + int handle; + float time; //message time + int type; //message type + char message[MAX_MESSAGE_SIZE]; //message + struct bot_consolemessage_s *prev, *next; //prev and next in list +} bot_consolemessage_t; + +//match variable +typedef struct bot_matchvariable_s +{ + char offset; + int length; +} bot_matchvariable_t; +//returned to AI when a match is found +typedef struct bot_match_s +{ + char string[MAX_MESSAGE_SIZE]; + int type; + int subtype; + bot_matchvariable_t variables[MAX_MATCHVARIABLES]; +} bot_match_t; + +//setup the chat AI +int BotSetupChatAI(void); +//shutdown the chat AI +void BotShutdownChatAI(void); +//returns the handle to a newly allocated chat state +int BotAllocChatState(void); +//frees the chatstate +void BotFreeChatState(int handle); +//adds a console message to the chat state +void BotQueueConsoleMessage(int chatstate, int type, char *message); +//removes the console message from the chat state +void BotRemoveConsoleMessage(int chatstate, int handle); +//returns the next console message from the state +int BotNextConsoleMessage(int chatstate, bot_consolemessage_t *cm); +//returns the number of console messages currently stored in the state +int BotNumConsoleMessages(int chatstate); +//selects a chat message of the given type +void BotInitialChat(int chatstate, char *type, int mcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7); +//returns the number of initial chat messages of the given type +int BotNumInitialChats(int chatstate, char *type); +//find and select a reply for the given message +int BotReplyChat(int chatstate, char *message, int mcontext, int vcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7); +//returns the length of the currently selected chat message +int BotChatLength(int chatstate); +//enters the selected chat message +void BotEnterChat(int chatstate, int clientto, int sendto); +//get the chat message ready to be output +void BotGetChatMessage(int chatstate, char *buf, int size); +//checks if the first string contains the second one, returns index into first string or -1 if not found +int StringContains(char *str1, char *str2, int casesensitive); +//finds a match for the given string using the match templates +int BotFindMatch(char *str, bot_match_t *match, unsigned long int context); +//returns a variable from a match +void BotMatchVariable(bot_match_t *match, int variable, char *buf, int size); +//unify all the white spaces in the string +void UnifyWhiteSpaces(char *string); +//replace all the context related synonyms in the string +void BotReplaceSynonyms(char *string, unsigned long int context); +//loads a chat file for the chat state +int BotLoadChatFile(int chatstate, char *chatfile, char *chatname); +//store the gender of the bot in the chat state +void BotSetChatGender(int chatstate, int gender); +//store the bot name in the chat state +void BotSetChatName(int chatstate, char *name, int client); + diff --git a/quake3/source/code/game/be_ai_gen.h b/quake3/source/code/game/be_ai_gen.h new file mode 100644 index 0000000..d7791ad --- /dev/null +++ b/quake3/source/code/game/be_ai_gen.h @@ -0,0 +1,13 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: be_ai_gen.h + * + * desc: genetic selection + * + * $Archive: /source/code/botlib/be_ai_gen.h $ + * + *****************************************************************************/ + +int GeneticParentsAndChildSelection(int numranks, float *ranks, int *parent1, int *parent2, int *child); diff --git a/quake3/source/code/game/be_ai_goal.h b/quake3/source/code/game/be_ai_goal.h new file mode 100644 index 0000000..2af416a --- /dev/null +++ b/quake3/source/code/game/be_ai_goal.h @@ -0,0 +1,98 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +/***************************************************************************** + * name: be_ai_goal.h + * + * desc: goal AI + * + * $Archive: /source/code/botlib/be_ai_goal.h $ + * + *****************************************************************************/ + +#define MAX_AVOIDGOALS 256 +#define MAX_GOALSTACK 8 + +#define GFL_NONE 0 +#define GFL_ITEM 1 +#define GFL_ROAM 2 +#define GFL_DROPPED 4 + +//a bot goal +typedef struct bot_goal_s +{ + vec3_t origin; //origin of the goal + int areanum; //area number of the goal + vec3_t mins, maxs; //mins and maxs of the goal + int entitynum; //number of the goal entity + int number; //goal number + int flags; //goal flags + int iteminfo; //item information +} bot_goal_t; + +//reset the whole goal state, but keep the item weights +void BotResetGoalState(int goalstate); +//reset avoid goals +void BotResetAvoidGoals(int goalstate); +//remove the goal with the given number from the avoid goals +void BotRemoveFromAvoidGoals(int goalstate, int number); +//push a goal onto the goal stack +void BotPushGoal(int goalstate, bot_goal_t *goal); +//pop a goal from the goal stack +void BotPopGoal(int goalstate); +//empty the bot's goal stack +void BotEmptyGoalStack(int goalstate); +//dump the avoid goals +void BotDumpAvoidGoals(int goalstate); +//dump the goal stack +void BotDumpGoalStack(int goalstate); +//get the name name of the goal with the given number +void BotGoalName(int number, char *name, int size); +//get the top goal from the stack +int BotGetTopGoal(int goalstate, bot_goal_t *goal); +//get the second goal on the stack +int BotGetSecondGoal(int goalstate, bot_goal_t *goal); +//choose the best long term goal item for the bot +int BotChooseLTGItem(int goalstate, vec3_t origin, int *inventory, int travelflags); +//choose the best nearby goal item for the bot +//the item may not be further away from the current bot position than maxtime +//also the travel time from the nearby goal towards the long term goal may not +//be larger than the travel time towards the long term goal from the current bot position +int BotChooseNBGItem(int goalstate, vec3_t origin, int *inventory, int travelflags, + bot_goal_t *ltg, float maxtime); +//returns true if the bot touches the goal +int BotTouchingGoal(vec3_t origin, bot_goal_t *goal); +//returns true if the goal should be visible but isn't +int BotItemGoalInVisButNotVisible(int viewer, vec3_t eye, vec3_t viewangles, bot_goal_t *goal); +//search for a goal for the given classname, the index can be used +//as a start point for the search when multiple goals are available with that same classname +int BotGetLevelItemGoal(int index, char *classname, bot_goal_t *goal); +//get the next camp spot in the map +int BotGetNextCampSpotGoal(int num, bot_goal_t *goal); +//get the map location with the given name +int BotGetMapLocationGoal(char *name, bot_goal_t *goal); +//returns the avoid goal time +float BotAvoidGoalTime(int goalstate, int number); +//set the avoid goal time +void BotSetAvoidGoalTime(int goalstate, int number, float avoidtime); +//initializes the items in the level +void BotInitLevelItems(void); +//regularly update dynamic entity items (dropped weapons, flags etc.) +void BotUpdateEntityItems(void); +//interbreed the goal fuzzy logic +void BotInterbreedGoalFuzzyLogic(int parent1, int parent2, int child); +//save the goal fuzzy logic to disk +void BotSaveGoalFuzzyLogic(int goalstate, char *filename); +//mutate the goal fuzzy logic +void BotMutateGoalFuzzyLogic(int goalstate, float range); +//loads item weights for the bot +int BotLoadItemWeights(int goalstate, char *filename); +//frees the item weights of the bot +void BotFreeItemWeights(int goalstate); +//returns the handle of a newly allocated goal state +int BotAllocGoalState(int client); +//free the given goal state +void BotFreeGoalState(int handle); +//setup the goal AI +int BotSetupGoalAI(void); +//shut down the goal AI +void BotShutdownGoalAI(void); diff --git a/quake3/source/code/game/be_ai_move.h b/quake3/source/code/game/be_ai_move.h new file mode 100644 index 0000000..7d14ac8 --- /dev/null +++ b/quake3/source/code/game/be_ai_move.h @@ -0,0 +1,122 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: be_ai_move.h + * + * desc: movement AI + * + * $Archive: /source/code/botlib/be_ai_move.h $ + * + *****************************************************************************/ + +//movement types +#define MOVE_WALK 1 +#define MOVE_CROUCH 2 +#define MOVE_JUMP 4 +#define MOVE_GRAPPLE 8 +#define MOVE_ROCKETJUMP 16 +#define MOVE_BFGJUMP 32 +//move flags +#define MFL_BARRIERJUMP 1 //bot is performing a barrier jump +#define MFL_ONGROUND 2 //bot is in the ground +#define MFL_SWIMMING 4 //bot is swimming +#define MFL_AGAINSTLADDER 8 //bot is against a ladder +#define MFL_WATERJUMP 16 //bot is waterjumping +#define MFL_TELEPORTED 32 //bot is being teleported +#define MFL_GRAPPLEPULL 64 //bot is being pulled by the grapple +#define MFL_ACTIVEGRAPPLE 128 //bot is using the grapple hook +#define MFL_GRAPPLERESET 256 //bot has reset the grapple +#define MFL_WALK 512 //bot should walk slowly +// move result flags +#define MOVERESULT_MOVEMENTVIEW 1 //bot uses view for movement +#define MOVERESULT_SWIMVIEW 2 //bot uses view for swimming +#define MOVERESULT_WAITING 4 //bot is waiting for something +#define MOVERESULT_MOVEMENTVIEWSET 8 //bot has set the view in movement code +#define MOVERESULT_MOVEMENTWEAPON 16 //bot uses weapon for movement +#define MOVERESULT_ONTOPOFOBSTACLE 32 //bot is ontop of obstacle +#define MOVERESULT_ONTOPOF_FUNCBOB 64 //bot is ontop of a func_bobbing +#define MOVERESULT_ONTOPOF_ELEVATOR 128 //bot is ontop of an elevator (func_plat) +#define MOVERESULT_BLOCKEDBYAVOIDSPOT 256 //bot is blocked by an avoid spot +// +#define MAX_AVOIDREACH 1 +#define MAX_AVOIDSPOTS 32 +// avoid spot types +#define AVOID_CLEAR 0 //clear all avoid spots +#define AVOID_ALWAYS 1 //avoid always +#define AVOID_DONTBLOCK 2 //never totally block +// restult types +#define RESULTTYPE_ELEVATORUP 1 //elevator is up +#define RESULTTYPE_WAITFORFUNCBOBBING 2 //waiting for func bobbing to arrive +#define RESULTTYPE_BADGRAPPLEPATH 4 //grapple path is obstructed +#define RESULTTYPE_INSOLIDAREA 8 //stuck in solid area, this is bad + +//structure used to initialize the movement state +//the or_moveflags MFL_ONGROUND, MFL_TELEPORTED and MFL_WATERJUMP come from the playerstate +typedef struct bot_initmove_s +{ + vec3_t origin; //origin of the bot + vec3_t velocity; //velocity of the bot + vec3_t viewoffset; //view offset + int entitynum; //entity number of the bot + int client; //client number of the bot + float thinktime; //time the bot thinks + int presencetype; //presencetype of the bot + vec3_t viewangles; //view angles of the bot + int or_moveflags; //values ored to the movement flags +} bot_initmove_t; + +//NOTE: the ideal_viewangles are only valid if MFL_MOVEMENTVIEW is set +typedef struct bot_moveresult_s +{ + int failure; //true if movement failed all together + int type; //failure or blocked type + int blocked; //true if blocked by an entity + int blockentity; //entity blocking the bot + int traveltype; //last executed travel type + int flags; //result flags + int weapon; //weapon used for movement + vec3_t movedir; //movement direction + vec3_t ideal_viewangles; //ideal viewangles for the movement +} bot_moveresult_t; + +// bk001204: from code/botlib/be_ai_move.c +// TTimo 04/12/2001 was moved here to avoid dup defines +typedef struct bot_avoidspot_s +{ + vec3_t origin; + float radius; + int type; +} bot_avoidspot_t; + +//resets the whole move state +void BotResetMoveState(int movestate); +//moves the bot to the given goal +void BotMoveToGoal(bot_moveresult_t *result, int movestate, bot_goal_t *goal, int travelflags); +//moves the bot in the specified direction using the specified type of movement +int BotMoveInDirection(int movestate, vec3_t dir, float speed, int type); +//reset avoid reachability +void BotResetAvoidReach(int movestate); +//resets the last avoid reachability +void BotResetLastAvoidReach(int movestate); +//returns a reachability area if the origin is in one +int BotReachabilityArea(vec3_t origin, int client); +//view target based on movement +int BotMovementViewTarget(int movestate, bot_goal_t *goal, int travelflags, float lookahead, vec3_t target); +//predict the position of a player based on movement towards a goal +int BotPredictVisiblePosition(vec3_t origin, int areanum, bot_goal_t *goal, int travelflags, vec3_t target); +//returns the handle of a newly allocated movestate +int BotAllocMoveState(void); +//frees the movestate with the given handle +void BotFreeMoveState(int handle); +//initialize movement state before performing any movement +void BotInitMoveState(int handle, bot_initmove_t *initmove); +//add a spot to avoid (if type == AVOID_CLEAR all spots are removed) +void BotAddAvoidSpot(int movestate, vec3_t origin, float radius, int type); +//must be called every map change +void BotSetBrushModelTypes(void); +//setup movement AI +int BotSetupMoveAI(void); +//shutdown movement AI +void BotShutdownMoveAI(void); + diff --git a/quake3/source/code/game/be_ai_weap.h b/quake3/source/code/game/be_ai_weap.h new file mode 100644 index 0000000..bd2cc33 --- /dev/null +++ b/quake3/source/code/game/be_ai_weap.h @@ -0,0 +1,84 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: be_ai_weap.h + * + * desc: weapon AI + * + * $Archive: /source/code/botlib/be_ai_weap.h $ + * + *****************************************************************************/ + +//projectile flags +#define PFL_WINDOWDAMAGE 1 //projectile damages through window +#define PFL_RETURN 2 //set when projectile returns to owner +//weapon flags +#define WFL_FIRERELEASED 1 //set when projectile is fired with key-up event +//damage types +#define DAMAGETYPE_IMPACT 1 //damage on impact +#define DAMAGETYPE_RADIAL 2 //radial damage +#define DAMAGETYPE_VISIBLE 4 //damage to all entities visible to the projectile + +typedef struct projectileinfo_s +{ + char name[MAX_STRINGFIELD]; + char model[MAX_STRINGFIELD]; + int flags; + float gravity; + int damage; + float radius; + int visdamage; + int damagetype; + int healthinc; + float push; + float detonation; + float bounce; + float bouncefric; + float bouncestop; +} projectileinfo_t; + +typedef struct weaponinfo_s +{ + int valid; //true if the weapon info is valid + int number; //number of the weapon + char name[MAX_STRINGFIELD]; + char model[MAX_STRINGFIELD]; + int level; + int weaponindex; + int flags; + char projectile[MAX_STRINGFIELD]; + int numprojectiles; + float hspread; + float vspread; + float speed; + float acceleration; + vec3_t recoil; + vec3_t offset; + vec3_t angleoffset; + float extrazvelocity; + int ammoamount; + int ammoindex; + float activate; + float reload; + float spinup; + float spindown; + projectileinfo_t proj; //pointer to the used projectile +} weaponinfo_t; + +//setup the weapon AI +int BotSetupWeaponAI(void); +//shut down the weapon AI +void BotShutdownWeaponAI(void); +//returns the best weapon to fight with +int BotChooseBestFightWeapon(int weaponstate, int *inventory); +//returns the information of the current weapon +void BotGetWeaponInfo(int weaponstate, int weapon, weaponinfo_t *weaponinfo); +//loads the weapon weights +int BotLoadWeaponWeights(int weaponstate, char *filename); +//returns a handle to a newly allocated weapon state +int BotAllocWeaponState(void); +//frees the weapon state +void BotFreeWeaponState(int weaponstate); +//resets the whole weapon state +void BotResetWeaponState(int weaponstate); diff --git a/quake3/source/code/game/be_ea.h b/quake3/source/code/game/be_ea.h new file mode 100644 index 0000000..a9e0319 --- /dev/null +++ b/quake3/source/code/game/be_ea.h @@ -0,0 +1,46 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +/***************************************************************************** + * name: be_ea.h + * + * desc: elementary actions + * + * $Archive: /source/code/botlib/be_ea.h $ + * + *****************************************************************************/ + +//ClientCommand elementary actions +void EA_Say(int client, char *str); +void EA_SayTeam(int client, char *str); +void EA_Command(int client, char *command ); + +void EA_Action(int client, int action); +void EA_Crouch(int client); +void EA_Walk(int client); +void EA_MoveUp(int client); +void EA_MoveDown(int client); +void EA_MoveForward(int client); +void EA_MoveBack(int client); +void EA_MoveLeft(int client); +void EA_MoveRight(int client); +void EA_Attack(int client); +void EA_Respawn(int client); +void EA_Talk(int client); +void EA_Gesture(int client); +void EA_Use(int client); + +//regular elementary actions +void EA_SelectWeapon(int client, int weapon); +void EA_Jump(int client); +void EA_DelayedJump(int client); +void EA_Move(int client, vec3_t dir, float speed); +void EA_View(int client, vec3_t viewangles); + +//send regular input to the server +void EA_EndRegular(int client, float thinktime); +void EA_GetInput(int client, float thinktime, bot_input_t *input); +void EA_ResetInput(int client); +//setup and shutdown routines +int EA_Setup(void); +void EA_Shutdown(void); diff --git a/quake3/source/code/game/bg_lib.c b/quake3/source/code/game/bg_lib.c new file mode 100644 index 0000000..8a3853d --- /dev/null +++ b/quake3/source/code/game/bg_lib.c @@ -0,0 +1,1327 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// Copyright (C) 1999-2000 Id Software, Inc. +// +// bg_lib,c -- standard C library replacement routines used by code +// compiled for the virtual machine + +#include "q_shared.h" + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. 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 acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)qsort.c 8.1 (Berkeley) 6/4/93"; +#endif +static const char rcsid[] = +#endif /* LIBC_SCCS and not lint */ + +// bk001127 - needed for DLL's +#if !defined( Q3_VM ) +typedef int cmp_t(const void *, const void *); +#endif + +static char* med3(char *, char *, char *, cmp_t *); +static void swapfunc(char *, char *, int, int); + +#ifndef min +#define min(a, b) (a) < (b) ? a : b +#endif + +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + register TYPE *pi = (TYPE *) (parmi); \ + register TYPE *pj = (TYPE *) (parmj); \ + do { \ + register TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} + +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; + +static void +swapfunc(a, b, n, swaptype) + char *a, *b; + int n, swaptype; +{ + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) +} + +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) + +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) + +static char * +med3(a, b, c, cmp) + char *a, *b, *c; + cmp_t *cmp; +{ + return cmp(a, b) < 0 ? + (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) + :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); +} + +void +qsort(a, n, es, cmp) + void *a; + size_t n, es; + cmp_t *cmp; +{ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + int d, r, swaptype, swap_cnt; + +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) { + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pm = (char *)a + (n / 2) * es; + if (n > 7) { + pl = a; + pn = (char *)a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp); + pm = med3(pm - d, pm, pm + d, cmp); + pn = med3(pn - 2 * d, pn - d, pn, cmp); + } + pm = med3(pl, pm, pn, cmp); + } + swap(a, pm); + pa = pb = (char *)a + es; + + pc = pd = (char *)a + (n - 1) * es; + for (;;) { + while (pb <= pc && (r = cmp(pb, a)) <= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (r = cmp(pc, a)) >= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + + pn = (char *)a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - es); + vecswap(pb, pn - r, r); + if ((r = pb - pa) > es) + qsort(a, r / es, es, cmp); + if ((r = pd - pc) > es) { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ +} + +//================================================================================== + + +// this file is excluded from release builds because of intrinsics + +// bk001211 - gcc errors on compiling strcpy: parse error before `__extension__' +#if defined ( Q3_VM ) + +size_t strlen( const char *string ) { + const char *s; + + s = string; + while ( *s ) { + s++; + } + return s - string; +} + + +char *strcat( char *strDestination, const char *strSource ) { + char *s; + + s = strDestination; + while ( *s ) { + s++; + } + while ( *strSource ) { + *s++ = *strSource++; + } + *s = 0; + return strDestination; +} + +char *strcpy( char *strDestination, const char *strSource ) { + char *s; + + s = strDestination; + while ( *strSource ) { + *s++ = *strSource++; + } + *s = 0; + return strDestination; +} + + +int strcmp( const char *string1, const char *string2 ) { + while ( *string1 == *string2 && *string1 && *string2 ) { + string1++; + string2++; + } + return *string1 - *string2; +} + + +char *strchr( const char *string, int c ) { + while ( *string ) { + if ( *string == c ) { + return ( char * )string; + } + string++; + } + return (char *)0; +} + +char *strstr( const char *string, const char *strCharSet ) { + while ( *string ) { + int i; + + for ( i = 0 ; strCharSet[i] ; i++ ) { + if ( string[i] != strCharSet[i] ) { + break; + } + } + if ( !strCharSet[i] ) { + return (char *)string; + } + string++; + } + return (char *)0; +} +#endif // bk001211 + +// bk001120 - presumably needed for Mac +//#if !defined(_MSC_VER) && !defined(__linux__) +// bk001127 - undid undo +#if defined ( Q3_VM ) +int tolower( int c ) { + if ( c >= 'A' && c <= 'Z' ) { + c += 'a' - 'A'; + } + return c; +} + + +int toupper( int c ) { + if ( c >= 'a' && c <= 'z' ) { + c += 'A' - 'a'; + } + return c; +} + +#endif +//#ifndef _MSC_VER + +void *memmove( void *dest, const void *src, size_t count ) { + int i; + + if ( dest > src ) { + for ( i = count-1 ; i >= 0 ; i-- ) { + ((char *)dest)[i] = ((char *)src)[i]; + } + } else { + for ( i = 0 ; i < count ; i++ ) { + ((char *)dest)[i] = ((char *)src)[i]; + } + } + return dest; +} + + +#if 0 + +double floor( double x ) { + return (int)(x + 0x40000000) - 0x40000000; +} + +void *memset( void *dest, int c, size_t count ) { + while ( count-- ) { + ((char *)dest)[count] = c; + } + return dest; +} + +void *memcpy( void *dest, const void *src, size_t count ) { + while ( count-- ) { + ((char *)dest)[count] = ((char *)src)[count]; + } + return dest; +} + +char *strncpy( char *strDest, const char *strSource, size_t count ) { + char *s; + + s = strDest; + while ( *strSource && count ) { + *s++ = *strSource++; + count--; + } + while ( count-- ) { + *s++ = 0; + } + return strDest; +} + +double sqrt( double x ) { + float y; + float delta; + float maxError; + + if ( x <= 0 ) { + return 0; + } + + // initial guess + y = x / 2; + + // refine + maxError = x * 0.001; + + do { + delta = ( y * y ) - x; + y -= delta / ( 2 * y ); + } while ( delta > maxError || delta < -maxError ); + + return y; +} + + +float sintable[1024] = { +0.000000,0.001534,0.003068,0.004602,0.006136,0.007670,0.009204,0.010738, +0.012272,0.013805,0.015339,0.016873,0.018407,0.019940,0.021474,0.023008, +0.024541,0.026075,0.027608,0.029142,0.030675,0.032208,0.033741,0.035274, +0.036807,0.038340,0.039873,0.041406,0.042938,0.044471,0.046003,0.047535, +0.049068,0.050600,0.052132,0.053664,0.055195,0.056727,0.058258,0.059790, +0.061321,0.062852,0.064383,0.065913,0.067444,0.068974,0.070505,0.072035, +0.073565,0.075094,0.076624,0.078153,0.079682,0.081211,0.082740,0.084269, +0.085797,0.087326,0.088854,0.090381,0.091909,0.093436,0.094963,0.096490, +0.098017,0.099544,0.101070,0.102596,0.104122,0.105647,0.107172,0.108697, +0.110222,0.111747,0.113271,0.114795,0.116319,0.117842,0.119365,0.120888, +0.122411,0.123933,0.125455,0.126977,0.128498,0.130019,0.131540,0.133061, +0.134581,0.136101,0.137620,0.139139,0.140658,0.142177,0.143695,0.145213, +0.146730,0.148248,0.149765,0.151281,0.152797,0.154313,0.155828,0.157343, +0.158858,0.160372,0.161886,0.163400,0.164913,0.166426,0.167938,0.169450, +0.170962,0.172473,0.173984,0.175494,0.177004,0.178514,0.180023,0.181532, +0.183040,0.184548,0.186055,0.187562,0.189069,0.190575,0.192080,0.193586, +0.195090,0.196595,0.198098,0.199602,0.201105,0.202607,0.204109,0.205610, +0.207111,0.208612,0.210112,0.211611,0.213110,0.214609,0.216107,0.217604, +0.219101,0.220598,0.222094,0.223589,0.225084,0.226578,0.228072,0.229565, +0.231058,0.232550,0.234042,0.235533,0.237024,0.238514,0.240003,0.241492, +0.242980,0.244468,0.245955,0.247442,0.248928,0.250413,0.251898,0.253382, +0.254866,0.256349,0.257831,0.259313,0.260794,0.262275,0.263755,0.265234, +0.266713,0.268191,0.269668,0.271145,0.272621,0.274097,0.275572,0.277046, +0.278520,0.279993,0.281465,0.282937,0.284408,0.285878,0.287347,0.288816, +0.290285,0.291752,0.293219,0.294685,0.296151,0.297616,0.299080,0.300543, +0.302006,0.303468,0.304929,0.306390,0.307850,0.309309,0.310767,0.312225, +0.313682,0.315138,0.316593,0.318048,0.319502,0.320955,0.322408,0.323859, +0.325310,0.326760,0.328210,0.329658,0.331106,0.332553,0.334000,0.335445, +0.336890,0.338334,0.339777,0.341219,0.342661,0.344101,0.345541,0.346980, +0.348419,0.349856,0.351293,0.352729,0.354164,0.355598,0.357031,0.358463, +0.359895,0.361326,0.362756,0.364185,0.365613,0.367040,0.368467,0.369892, +0.371317,0.372741,0.374164,0.375586,0.377007,0.378428,0.379847,0.381266, +0.382683,0.384100,0.385516,0.386931,0.388345,0.389758,0.391170,0.392582, +0.393992,0.395401,0.396810,0.398218,0.399624,0.401030,0.402435,0.403838, +0.405241,0.406643,0.408044,0.409444,0.410843,0.412241,0.413638,0.415034, +0.416430,0.417824,0.419217,0.420609,0.422000,0.423390,0.424780,0.426168, +0.427555,0.428941,0.430326,0.431711,0.433094,0.434476,0.435857,0.437237, +0.438616,0.439994,0.441371,0.442747,0.444122,0.445496,0.446869,0.448241, +0.449611,0.450981,0.452350,0.453717,0.455084,0.456449,0.457813,0.459177, +0.460539,0.461900,0.463260,0.464619,0.465976,0.467333,0.468689,0.470043, +0.471397,0.472749,0.474100,0.475450,0.476799,0.478147,0.479494,0.480839, +0.482184,0.483527,0.484869,0.486210,0.487550,0.488889,0.490226,0.491563, +0.492898,0.494232,0.495565,0.496897,0.498228,0.499557,0.500885,0.502212, +0.503538,0.504863,0.506187,0.507509,0.508830,0.510150,0.511469,0.512786, +0.514103,0.515418,0.516732,0.518045,0.519356,0.520666,0.521975,0.523283, +0.524590,0.525895,0.527199,0.528502,0.529804,0.531104,0.532403,0.533701, +0.534998,0.536293,0.537587,0.538880,0.540171,0.541462,0.542751,0.544039, +0.545325,0.546610,0.547894,0.549177,0.550458,0.551738,0.553017,0.554294, +0.555570,0.556845,0.558119,0.559391,0.560662,0.561931,0.563199,0.564466, +0.565732,0.566996,0.568259,0.569521,0.570781,0.572040,0.573297,0.574553, +0.575808,0.577062,0.578314,0.579565,0.580814,0.582062,0.583309,0.584554, +0.585798,0.587040,0.588282,0.589521,0.590760,0.591997,0.593232,0.594466, +0.595699,0.596931,0.598161,0.599389,0.600616,0.601842,0.603067,0.604290, +0.605511,0.606731,0.607950,0.609167,0.610383,0.611597,0.612810,0.614022, +0.615232,0.616440,0.617647,0.618853,0.620057,0.621260,0.622461,0.623661, +0.624859,0.626056,0.627252,0.628446,0.629638,0.630829,0.632019,0.633207, +0.634393,0.635578,0.636762,0.637944,0.639124,0.640303,0.641481,0.642657, +0.643832,0.645005,0.646176,0.647346,0.648514,0.649681,0.650847,0.652011, +0.653173,0.654334,0.655493,0.656651,0.657807,0.658961,0.660114,0.661266, +0.662416,0.663564,0.664711,0.665856,0.667000,0.668142,0.669283,0.670422, +0.671559,0.672695,0.673829,0.674962,0.676093,0.677222,0.678350,0.679476, +0.680601,0.681724,0.682846,0.683965,0.685084,0.686200,0.687315,0.688429, +0.689541,0.690651,0.691759,0.692866,0.693971,0.695075,0.696177,0.697278, +0.698376,0.699473,0.700569,0.701663,0.702755,0.703845,0.704934,0.706021, +0.707107,0.708191,0.709273,0.710353,0.711432,0.712509,0.713585,0.714659, +0.715731,0.716801,0.717870,0.718937,0.720003,0.721066,0.722128,0.723188, +0.724247,0.725304,0.726359,0.727413,0.728464,0.729514,0.730563,0.731609, +0.732654,0.733697,0.734739,0.735779,0.736817,0.737853,0.738887,0.739920, +0.740951,0.741980,0.743008,0.744034,0.745058,0.746080,0.747101,0.748119, +0.749136,0.750152,0.751165,0.752177,0.753187,0.754195,0.755201,0.756206, +0.757209,0.758210,0.759209,0.760207,0.761202,0.762196,0.763188,0.764179, +0.765167,0.766154,0.767139,0.768122,0.769103,0.770083,0.771061,0.772036, +0.773010,0.773983,0.774953,0.775922,0.776888,0.777853,0.778817,0.779778, +0.780737,0.781695,0.782651,0.783605,0.784557,0.785507,0.786455,0.787402, +0.788346,0.789289,0.790230,0.791169,0.792107,0.793042,0.793975,0.794907, +0.795837,0.796765,0.797691,0.798615,0.799537,0.800458,0.801376,0.802293, +0.803208,0.804120,0.805031,0.805940,0.806848,0.807753,0.808656,0.809558, +0.810457,0.811355,0.812251,0.813144,0.814036,0.814926,0.815814,0.816701, +0.817585,0.818467,0.819348,0.820226,0.821103,0.821977,0.822850,0.823721, +0.824589,0.825456,0.826321,0.827184,0.828045,0.828904,0.829761,0.830616, +0.831470,0.832321,0.833170,0.834018,0.834863,0.835706,0.836548,0.837387, +0.838225,0.839060,0.839894,0.840725,0.841555,0.842383,0.843208,0.844032, +0.844854,0.845673,0.846491,0.847307,0.848120,0.848932,0.849742,0.850549, +0.851355,0.852159,0.852961,0.853760,0.854558,0.855354,0.856147,0.856939, +0.857729,0.858516,0.859302,0.860085,0.860867,0.861646,0.862424,0.863199, +0.863973,0.864744,0.865514,0.866281,0.867046,0.867809,0.868571,0.869330, +0.870087,0.870842,0.871595,0.872346,0.873095,0.873842,0.874587,0.875329, +0.876070,0.876809,0.877545,0.878280,0.879012,0.879743,0.880471,0.881197, +0.881921,0.882643,0.883363,0.884081,0.884797,0.885511,0.886223,0.886932, +0.887640,0.888345,0.889048,0.889750,0.890449,0.891146,0.891841,0.892534, +0.893224,0.893913,0.894599,0.895284,0.895966,0.896646,0.897325,0.898001, +0.898674,0.899346,0.900016,0.900683,0.901349,0.902012,0.902673,0.903332, +0.903989,0.904644,0.905297,0.905947,0.906596,0.907242,0.907886,0.908528, +0.909168,0.909806,0.910441,0.911075,0.911706,0.912335,0.912962,0.913587, +0.914210,0.914830,0.915449,0.916065,0.916679,0.917291,0.917901,0.918508, +0.919114,0.919717,0.920318,0.920917,0.921514,0.922109,0.922701,0.923291, +0.923880,0.924465,0.925049,0.925631,0.926210,0.926787,0.927363,0.927935, +0.928506,0.929075,0.929641,0.930205,0.930767,0.931327,0.931884,0.932440, +0.932993,0.933544,0.934093,0.934639,0.935184,0.935726,0.936266,0.936803, +0.937339,0.937872,0.938404,0.938932,0.939459,0.939984,0.940506,0.941026, +0.941544,0.942060,0.942573,0.943084,0.943593,0.944100,0.944605,0.945107, +0.945607,0.946105,0.946601,0.947094,0.947586,0.948075,0.948561,0.949046, +0.949528,0.950008,0.950486,0.950962,0.951435,0.951906,0.952375,0.952842, +0.953306,0.953768,0.954228,0.954686,0.955141,0.955594,0.956045,0.956494, +0.956940,0.957385,0.957826,0.958266,0.958703,0.959139,0.959572,0.960002, +0.960431,0.960857,0.961280,0.961702,0.962121,0.962538,0.962953,0.963366, +0.963776,0.964184,0.964590,0.964993,0.965394,0.965793,0.966190,0.966584, +0.966976,0.967366,0.967754,0.968139,0.968522,0.968903,0.969281,0.969657, +0.970031,0.970403,0.970772,0.971139,0.971504,0.971866,0.972226,0.972584, +0.972940,0.973293,0.973644,0.973993,0.974339,0.974684,0.975025,0.975365, +0.975702,0.976037,0.976370,0.976700,0.977028,0.977354,0.977677,0.977999, +0.978317,0.978634,0.978948,0.979260,0.979570,0.979877,0.980182,0.980485, +0.980785,0.981083,0.981379,0.981673,0.981964,0.982253,0.982539,0.982824, +0.983105,0.983385,0.983662,0.983937,0.984210,0.984480,0.984749,0.985014, +0.985278,0.985539,0.985798,0.986054,0.986308,0.986560,0.986809,0.987057, +0.987301,0.987544,0.987784,0.988022,0.988258,0.988491,0.988722,0.988950, +0.989177,0.989400,0.989622,0.989841,0.990058,0.990273,0.990485,0.990695, +0.990903,0.991108,0.991311,0.991511,0.991710,0.991906,0.992099,0.992291, +0.992480,0.992666,0.992850,0.993032,0.993212,0.993389,0.993564,0.993737, +0.993907,0.994075,0.994240,0.994404,0.994565,0.994723,0.994879,0.995033, +0.995185,0.995334,0.995481,0.995625,0.995767,0.995907,0.996045,0.996180, +0.996313,0.996443,0.996571,0.996697,0.996820,0.996941,0.997060,0.997176, +0.997290,0.997402,0.997511,0.997618,0.997723,0.997825,0.997925,0.998023, +0.998118,0.998211,0.998302,0.998390,0.998476,0.998559,0.998640,0.998719, +0.998795,0.998870,0.998941,0.999011,0.999078,0.999142,0.999205,0.999265, +0.999322,0.999378,0.999431,0.999481,0.999529,0.999575,0.999619,0.999660, +0.999699,0.999735,0.999769,0.999801,0.999831,0.999858,0.999882,0.999905, +0.999925,0.999942,0.999958,0.999971,0.999981,0.999989,0.999995,0.999999 +}; + +double sin( double x ) { + int index; + int quad; + + index = 1024 * x / (M_PI * 0.5); + quad = ( index >> 10 ) & 3; + index &= 1023; + switch ( quad ) { + case 0: + return sintable[index]; + case 1: + return sintable[1023-index]; + case 2: + return -sintable[index]; + case 3: + return -sintable[1023-index]; + } + return 0; +} + + +double cos( double x ) { + int index; + int quad; + + index = 1024 * x / (M_PI * 0.5); + quad = ( index >> 10 ) & 3; + index &= 1023; + switch ( quad ) { + case 3: + return sintable[index]; + case 0: + return sintable[1023-index]; + case 1: + return -sintable[index]; + case 2: + return -sintable[1023-index]; + } + return 0; +} + + +/* +void create_acostable( void ) { + int i; + FILE *fp; + float a; + + fp = fopen("c:\\acostable.txt", "w"); + fprintf(fp, "float acostable[] = {"); + for (i = 0; i < 1024; i++) { + if (!(i & 7)) + fprintf(fp, "\n"); + a = acos( (float) -1 + i / 512 ); + fprintf(fp, "%1.8f,", a); + } + fprintf(fp, "\n}\n"); + fclose(fp); +} +*/ + +float acostable[] = { +3.14159265,3.07908248,3.05317551,3.03328655,3.01651113,3.00172442,2.98834964,2.97604422, +2.96458497,2.95381690,2.94362719,2.93393068,2.92466119,2.91576615,2.90720289,2.89893629, +2.89093699,2.88318015,2.87564455,2.86831188,2.86116621,2.85419358,2.84738169,2.84071962, +2.83419760,2.82780691,2.82153967,2.81538876,2.80934770,2.80341062,2.79757211,2.79182724, +2.78617145,2.78060056,2.77511069,2.76969824,2.76435988,2.75909250,2.75389319,2.74875926, +2.74368816,2.73867752,2.73372510,2.72882880,2.72398665,2.71919677,2.71445741,2.70976688, +2.70512362,2.70052613,2.69597298,2.69146283,2.68699438,2.68256642,2.67817778,2.67382735, +2.66951407,2.66523692,2.66099493,2.65678719,2.65261279,2.64847088,2.64436066,2.64028133, +2.63623214,2.63221238,2.62822133,2.62425835,2.62032277,2.61641398,2.61253138,2.60867440, +2.60484248,2.60103507,2.59725167,2.59349176,2.58975488,2.58604053,2.58234828,2.57867769, +2.57502832,2.57139977,2.56779164,2.56420354,2.56063509,2.55708594,2.55355572,2.55004409, +2.54655073,2.54307530,2.53961750,2.53617701,2.53275354,2.52934680,2.52595650,2.52258238, +2.51922417,2.51588159,2.51255441,2.50924238,2.50594525,2.50266278,2.49939476,2.49614096, +2.49290115,2.48967513,2.48646269,2.48326362,2.48007773,2.47690482,2.47374472,2.47059722, +2.46746215,2.46433933,2.46122860,2.45812977,2.45504269,2.45196720,2.44890314,2.44585034, +2.44280867,2.43977797,2.43675809,2.43374890,2.43075025,2.42776201,2.42478404,2.42181622, +2.41885841,2.41591048,2.41297232,2.41004380,2.40712480,2.40421521,2.40131491,2.39842379, +2.39554173,2.39266863,2.38980439,2.38694889,2.38410204,2.38126374,2.37843388,2.37561237, +2.37279910,2.36999400,2.36719697,2.36440790,2.36162673,2.35885335,2.35608768,2.35332964, +2.35057914,2.34783610,2.34510044,2.34237208,2.33965094,2.33693695,2.33423003,2.33153010, +2.32883709,2.32615093,2.32347155,2.32079888,2.31813284,2.31547337,2.31282041,2.31017388, +2.30753373,2.30489988,2.30227228,2.29965086,2.29703556,2.29442632,2.29182309,2.28922580, +2.28663439,2.28404881,2.28146900,2.27889490,2.27632647,2.27376364,2.27120637,2.26865460, +2.26610827,2.26356735,2.26103177,2.25850149,2.25597646,2.25345663,2.25094195,2.24843238, +2.24592786,2.24342836,2.24093382,2.23844420,2.23595946,2.23347956,2.23100444,2.22853408, +2.22606842,2.22360742,2.22115104,2.21869925,2.21625199,2.21380924,2.21137096,2.20893709, +2.20650761,2.20408248,2.20166166,2.19924511,2.19683280,2.19442469,2.19202074,2.18962092, +2.18722520,2.18483354,2.18244590,2.18006225,2.17768257,2.17530680,2.17293493,2.17056692, +2.16820274,2.16584236,2.16348574,2.16113285,2.15878367,2.15643816,2.15409630,2.15175805, +2.14942338,2.14709226,2.14476468,2.14244059,2.14011997,2.13780279,2.13548903,2.13317865, +2.13087163,2.12856795,2.12626757,2.12397047,2.12167662,2.11938600,2.11709859,2.11481435, +2.11253326,2.11025530,2.10798044,2.10570867,2.10343994,2.10117424,2.09891156,2.09665185, +2.09439510,2.09214129,2.08989040,2.08764239,2.08539725,2.08315496,2.08091550,2.07867884, +2.07644495,2.07421383,2.07198545,2.06975978,2.06753681,2.06531651,2.06309887,2.06088387, +2.05867147,2.05646168,2.05425445,2.05204979,2.04984765,2.04764804,2.04545092,2.04325628, +2.04106409,2.03887435,2.03668703,2.03450211,2.03231957,2.03013941,2.02796159,2.02578610, +2.02361292,2.02144204,2.01927344,2.01710710,2.01494300,2.01278113,2.01062146,2.00846399, +2.00630870,2.00415556,2.00200457,1.99985570,1.99770895,1.99556429,1.99342171,1.99128119, +1.98914271,1.98700627,1.98487185,1.98273942,1.98060898,1.97848051,1.97635399,1.97422942, +1.97210676,1.96998602,1.96786718,1.96575021,1.96363511,1.96152187,1.95941046,1.95730088, +1.95519310,1.95308712,1.95098292,1.94888050,1.94677982,1.94468089,1.94258368,1.94048818, +1.93839439,1.93630228,1.93421185,1.93212308,1.93003595,1.92795046,1.92586659,1.92378433, +1.92170367,1.91962459,1.91754708,1.91547113,1.91339673,1.91132385,1.90925250,1.90718266, +1.90511432,1.90304746,1.90098208,1.89891815,1.89685568,1.89479464,1.89273503,1.89067683, +1.88862003,1.88656463,1.88451060,1.88245794,1.88040664,1.87835668,1.87630806,1.87426076, +1.87221477,1.87017008,1.86812668,1.86608457,1.86404371,1.86200412,1.85996577,1.85792866, +1.85589277,1.85385809,1.85182462,1.84979234,1.84776125,1.84573132,1.84370256,1.84167495, +1.83964848,1.83762314,1.83559892,1.83357582,1.83155381,1.82953289,1.82751305,1.82549429, +1.82347658,1.82145993,1.81944431,1.81742973,1.81541617,1.81340362,1.81139207,1.80938151, +1.80737194,1.80536334,1.80335570,1.80134902,1.79934328,1.79733848,1.79533460,1.79333164, +1.79132959,1.78932843,1.78732817,1.78532878,1.78333027,1.78133261,1.77933581,1.77733985, +1.77534473,1.77335043,1.77135695,1.76936428,1.76737240,1.76538132,1.76339101,1.76140148, +1.75941271,1.75742470,1.75543743,1.75345090,1.75146510,1.74948002,1.74749565,1.74551198, +1.74352900,1.74154672,1.73956511,1.73758417,1.73560389,1.73362426,1.73164527,1.72966692, +1.72768920,1.72571209,1.72373560,1.72175971,1.71978441,1.71780969,1.71583556,1.71386199, +1.71188899,1.70991653,1.70794462,1.70597325,1.70400241,1.70203209,1.70006228,1.69809297, +1.69612416,1.69415584,1.69218799,1.69022062,1.68825372,1.68628727,1.68432127,1.68235571, +1.68039058,1.67842588,1.67646160,1.67449772,1.67253424,1.67057116,1.66860847,1.66664615, +1.66468420,1.66272262,1.66076139,1.65880050,1.65683996,1.65487975,1.65291986,1.65096028, +1.64900102,1.64704205,1.64508338,1.64312500,1.64116689,1.63920905,1.63725148,1.63529416, +1.63333709,1.63138026,1.62942366,1.62746728,1.62551112,1.62355517,1.62159943,1.61964388, +1.61768851,1.61573332,1.61377831,1.61182346,1.60986877,1.60791422,1.60595982,1.60400556, +1.60205142,1.60009739,1.59814349,1.59618968,1.59423597,1.59228235,1.59032882,1.58837536, +1.58642196,1.58446863,1.58251535,1.58056211,1.57860891,1.57665574,1.57470259,1.57274945, +1.57079633,1.56884320,1.56689007,1.56493692,1.56298375,1.56103055,1.55907731,1.55712403, +1.55517069,1.55321730,1.55126383,1.54931030,1.54735668,1.54540297,1.54344917,1.54149526, +1.53954124,1.53758710,1.53563283,1.53367843,1.53172389,1.52976919,1.52781434,1.52585933, +1.52390414,1.52194878,1.51999323,1.51803748,1.51608153,1.51412537,1.51216900,1.51021240, +1.50825556,1.50629849,1.50434117,1.50238360,1.50042576,1.49846765,1.49650927,1.49455060, +1.49259163,1.49063237,1.48867280,1.48671291,1.48475270,1.48279215,1.48083127,1.47887004, +1.47690845,1.47494650,1.47298419,1.47102149,1.46905841,1.46709493,1.46513106,1.46316677, +1.46120207,1.45923694,1.45727138,1.45530538,1.45333893,1.45137203,1.44940466,1.44743682, +1.44546850,1.44349969,1.44153038,1.43956057,1.43759024,1.43561940,1.43364803,1.43167612, +1.42970367,1.42773066,1.42575709,1.42378296,1.42180825,1.41983295,1.41785705,1.41588056, +1.41390346,1.41192573,1.40994738,1.40796840,1.40598877,1.40400849,1.40202755,1.40004594, +1.39806365,1.39608068,1.39409701,1.39211264,1.39012756,1.38814175,1.38615522,1.38416795, +1.38217994,1.38019117,1.37820164,1.37621134,1.37422025,1.37222837,1.37023570,1.36824222, +1.36624792,1.36425280,1.36225684,1.36026004,1.35826239,1.35626387,1.35426449,1.35226422, +1.35026307,1.34826101,1.34625805,1.34425418,1.34224937,1.34024364,1.33823695,1.33622932, +1.33422072,1.33221114,1.33020059,1.32818904,1.32617649,1.32416292,1.32214834,1.32013273, +1.31811607,1.31609837,1.31407960,1.31205976,1.31003885,1.30801684,1.30599373,1.30396951, +1.30194417,1.29991770,1.29789009,1.29586133,1.29383141,1.29180031,1.28976803,1.28773456, +1.28569989,1.28366400,1.28162688,1.27958854,1.27754894,1.27550809,1.27346597,1.27142257, +1.26937788,1.26733189,1.26528459,1.26323597,1.26118602,1.25913471,1.25708205,1.25502803, +1.25297262,1.25091583,1.24885763,1.24679802,1.24473698,1.24267450,1.24061058,1.23854519, +1.23647833,1.23440999,1.23234015,1.23026880,1.22819593,1.22612152,1.22404557,1.22196806, +1.21988898,1.21780832,1.21572606,1.21364219,1.21155670,1.20946958,1.20738080,1.20529037, +1.20319826,1.20110447,1.19900898,1.19691177,1.19481283,1.19271216,1.19060973,1.18850553, +1.18639955,1.18429178,1.18218219,1.18007079,1.17795754,1.17584244,1.17372548,1.17160663, +1.16948589,1.16736324,1.16523866,1.16311215,1.16098368,1.15885323,1.15672081,1.15458638, +1.15244994,1.15031147,1.14817095,1.14602836,1.14388370,1.14173695,1.13958808,1.13743709, +1.13528396,1.13312866,1.13097119,1.12881153,1.12664966,1.12448556,1.12231921,1.12015061, +1.11797973,1.11580656,1.11363107,1.11145325,1.10927308,1.10709055,1.10490563,1.10271831, +1.10052856,1.09833638,1.09614174,1.09394462,1.09174500,1.08954287,1.08733820,1.08513098, +1.08292118,1.08070879,1.07849378,1.07627614,1.07405585,1.07183287,1.06960721,1.06737882, +1.06514770,1.06291382,1.06067715,1.05843769,1.05619540,1.05395026,1.05170226,1.04945136, +1.04719755,1.04494080,1.04268110,1.04041841,1.03815271,1.03588399,1.03361221,1.03133735, +1.02905939,1.02677830,1.02449407,1.02220665,1.01991603,1.01762219,1.01532509,1.01302471, +1.01072102,1.00841400,1.00610363,1.00378986,1.00147268,0.99915206,0.99682798,0.99450039, +0.99216928,0.98983461,0.98749636,0.98515449,0.98280898,0.98045980,0.97810691,0.97575030, +0.97338991,0.97102573,0.96865772,0.96628585,0.96391009,0.96153040,0.95914675,0.95675912, +0.95436745,0.95197173,0.94957191,0.94716796,0.94475985,0.94234754,0.93993099,0.93751017, +0.93508504,0.93265556,0.93022170,0.92778341,0.92534066,0.92289341,0.92044161,0.91798524, +0.91552424,0.91305858,0.91058821,0.90811309,0.90563319,0.90314845,0.90065884,0.89816430, +0.89566479,0.89316028,0.89065070,0.88813602,0.88561619,0.88309116,0.88056088,0.87802531, +0.87548438,0.87293806,0.87038629,0.86782901,0.86526619,0.86269775,0.86012366,0.85754385, +0.85495827,0.85236686,0.84976956,0.84716633,0.84455709,0.84194179,0.83932037,0.83669277, +0.83405893,0.83141877,0.82877225,0.82611928,0.82345981,0.82079378,0.81812110,0.81544172, +0.81275556,0.81006255,0.80736262,0.80465570,0.80194171,0.79922057,0.79649221,0.79375655, +0.79101352,0.78826302,0.78550497,0.78273931,0.77996593,0.77718475,0.77439569,0.77159865, +0.76879355,0.76598029,0.76315878,0.76032891,0.75749061,0.75464376,0.75178826,0.74892402, +0.74605092,0.74316887,0.74027775,0.73737744,0.73446785,0.73154885,0.72862033,0.72568217, +0.72273425,0.71977644,0.71680861,0.71383064,0.71084240,0.70784376,0.70483456,0.70181469, +0.69878398,0.69574231,0.69268952,0.68962545,0.68654996,0.68346288,0.68036406,0.67725332, +0.67413051,0.67099544,0.66784794,0.66468783,0.66151492,0.65832903,0.65512997,0.65191753, +0.64869151,0.64545170,0.64219789,0.63892987,0.63564741,0.63235028,0.62903824,0.62571106, +0.62236849,0.61901027,0.61563615,0.61224585,0.60883911,0.60541564,0.60197515,0.59851735, +0.59504192,0.59154856,0.58803694,0.58450672,0.58095756,0.57738911,0.57380101,0.57019288, +0.56656433,0.56291496,0.55924437,0.55555212,0.55183778,0.54810089,0.54434099,0.54055758, +0.53675018,0.53291825,0.52906127,0.52517867,0.52126988,0.51733431,0.51337132,0.50938028, +0.50536051,0.50131132,0.49723200,0.49312177,0.48897987,0.48480547,0.48059772,0.47635573, +0.47207859,0.46776530,0.46341487,0.45902623,0.45459827,0.45012983,0.44561967,0.44106652, +0.43646903,0.43182577,0.42713525,0.42239588,0.41760600,0.41276385,0.40786755,0.40291513, +0.39790449,0.39283339,0.38769946,0.38250016,0.37723277,0.37189441,0.36648196,0.36099209, +0.35542120,0.34976542,0.34402054,0.33818204,0.33224495,0.32620390,0.32005298,0.31378574, +0.30739505,0.30087304,0.29421096,0.28739907,0.28042645,0.27328078,0.26594810,0.25841250, +0.25065566,0.24265636,0.23438976,0.22582651,0.21693146,0.20766198,0.19796546,0.18777575, +0.17700769,0.16554844,0.15324301,0.13986823,0.12508152,0.10830610,0.08841715,0.06251018, +} + +double acos( double x ) { + int index; + + if (x < -1) + x = -1; + if (x > 1) + x = 1; + index = (float) (1.0 + x) * 511.9; + return acostable[index]; +} + +double atan2( double y, double x ) { + float base; + float temp; + float dir; + float test; + int i; + + if ( x < 0 ) { + if ( y >= 0 ) { + // quad 1 + base = M_PI / 2; + temp = x; + x = y; + y = -temp; + } else { + // quad 2 + base = M_PI; + x = -x; + y = -y; + } + } else { + if ( y < 0 ) { + // quad 3 + base = 3 * M_PI / 2; + temp = x; + x = -y; + y = temp; + } + } + + if ( y > x ) { + base += M_PI/2; + temp = x; + x = y; + y = temp; + dir = -1; + } else { + dir = 1; + } + + // calcualte angle in octant 0 + if ( x == 0 ) { + return base; + } + y /= x; + + for ( i = 0 ; i < 512 ; i++ ) { + test = sintable[i] / sintable[1023-i]; + if ( test > y ) { + break; + } + } + + return base + dir * i * ( M_PI/2048); +} + + +#endif + +#ifdef Q3_VM +// bk001127 - guarded this tan replacement +// ld: undefined versioned symbol name tan@@GLIBC_2.0 +double tan( double x ) { + return sin(x) / cos(x); +} +#endif + + +static int randSeed = 0; + +void srand( unsigned seed ) { + randSeed = seed; +} + +int rand( void ) { + randSeed = (69069 * randSeed + 1); + return randSeed & 0x7fff; +} + +double atof( const char *string ) { + float sign; + float value; + int c; + + + // skip whitespace + while ( *string <= ' ' ) { + if ( !*string ) { + return 0; + } + string++; + } + + // check sign + switch ( *string ) { + case '+': + string++; + sign = 1; + break; + case '-': + string++; + sign = -1; + break; + default: + sign = 1; + break; + } + + // read digits + value = 0; + c = string[0]; + if ( c != '.' ) { + do { + c = *string++; + if ( c < '0' || c > '9' ) { + break; + } + c -= '0'; + value = value * 10 + c; + } while ( 1 ); + } else { + string++; + } + + // check for decimal point + if ( c == '.' ) { + double fraction; + + fraction = 0.1; + do { + c = *string++; + if ( c < '0' || c > '9' ) { + break; + } + c -= '0'; + value += c * fraction; + fraction *= 0.1; + } while ( 1 ); + + } + + // not handling 10e10 notation... + + return value * sign; +} + +double _atof( const char **stringPtr ) { + const char *string; + float sign; + float value; + int c = '0'; // bk001211 - uninitialized use possible + + string = *stringPtr; + + // skip whitespace + while ( *string <= ' ' ) { + if ( !*string ) { + *stringPtr = string; + return 0; + } + string++; + } + + // check sign + switch ( *string ) { + case '+': + string++; + sign = 1; + break; + case '-': + string++; + sign = -1; + break; + default: + sign = 1; + break; + } + + // read digits + value = 0; + if ( string[0] != '.' ) { + do { + c = *string++; + if ( c < '0' || c > '9' ) { + break; + } + c -= '0'; + value = value * 10 + c; + } while ( 1 ); + } + + // check for decimal point + if ( c == '.' ) { + double fraction; + + fraction = 0.1; + do { + c = *string++; + if ( c < '0' || c > '9' ) { + break; + } + c -= '0'; + value += c * fraction; + fraction *= 0.1; + } while ( 1 ); + + } + + // not handling 10e10 notation... + *stringPtr = string; + + return value * sign; +} + + +// bk001120 - presumably needed for Mac +//#if !defined ( _MSC_VER ) && ! defined ( __linux__ ) + +// bk001127 - undid undo +#if defined ( Q3_VM ) +int atoi( const char *string ) { + int sign; + int value; + int c; + + + // skip whitespace + while ( *string <= ' ' ) { + if ( !*string ) { + return 0; + } + string++; + } + + // check sign + switch ( *string ) { + case '+': + string++; + sign = 1; + break; + case '-': + string++; + sign = -1; + break; + default: + sign = 1; + break; + } + + // read digits + value = 0; + do { + c = *string++; + if ( c < '0' || c > '9' ) { + break; + } + c -= '0'; + value = value * 10 + c; + } while ( 1 ); + + // not handling 10e10 notation... + + return value * sign; +} + + +int _atoi( const char **stringPtr ) { + int sign; + int value; + int c; + const char *string; + + string = *stringPtr; + + // skip whitespace + while ( *string <= ' ' ) { + if ( !*string ) { + return 0; + } + string++; + } + + // check sign + switch ( *string ) { + case '+': + string++; + sign = 1; + break; + case '-': + string++; + sign = -1; + break; + default: + sign = 1; + break; + } + + // read digits + value = 0; + do { + c = *string++; + if ( c < '0' || c > '9' ) { + break; + } + c -= '0'; + value = value * 10 + c; + } while ( 1 ); + + // not handling 10e10 notation... + + *stringPtr = string; + + return value * sign; +} + +int abs( int n ) { + return n < 0 ? -n : n; +} + +double fabs( double x ) { + return x < 0 ? -x : x; +} + + + +//========================================================= + + +#define ALT 0x00000001 /* alternate form */ +#define HEXPREFIX 0x00000002 /* add 0x or 0X prefix */ +#define LADJUST 0x00000004 /* left adjustment */ +#define LONGDBL 0x00000008 /* long double */ +#define LONGINT 0x00000010 /* long integer */ +#define QUADINT 0x00000020 /* quad integer */ +#define SHORTINT 0x00000040 /* short integer */ +#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ +#define FPT 0x00000100 /* floating point number */ + +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit(c) <= 9) +#define to_char(n) ((n) + '0') + +void AddInt( char **buf_p, int val, int width, int flags ) { + char text[32]; + int digits; + int signedVal; + char *buf; + + digits = 0; + signedVal = val; + if ( val < 0 ) { + val = -val; + } + do { + text[digits++] = '0' + val % 10; + val /= 10; + } while ( val ); + + if ( signedVal < 0 ) { + text[digits++] = '-'; + } + + buf = *buf_p; + + if( !( flags & LADJUST ) ) { + while ( digits < width ) { + *buf++ = ( flags & ZEROPAD ) ? '0' : ' '; + width--; + } + } + + while ( digits-- ) { + *buf++ = text[digits]; + width--; + } + + if( flags & LADJUST ) { + while ( width-- ) { + *buf++ = ( flags & ZEROPAD ) ? '0' : ' '; + } + } + + *buf_p = buf; +} + +void AddFloat( char **buf_p, float fval, int width, int prec ) { + char text[32]; + int digits; + float signedVal; + char *buf; + int val; + + // get the sign + signedVal = fval; + if ( fval < 0 ) { + fval = -fval; + } + + // write the float number + digits = 0; + val = (int)fval; + do { + text[digits++] = '0' + val % 10; + val /= 10; + } while ( val ); + + if ( signedVal < 0 ) { + text[digits++] = '-'; + } + + buf = *buf_p; + + while ( digits < width ) { + *buf++ = ' '; + width--; + } + + while ( digits-- ) { + *buf++ = text[digits]; + } + + *buf_p = buf; + + if (prec < 0) + prec = 6; + // write the fraction + digits = 0; + while (digits < prec) { + fval -= (int) fval; + fval *= 10.0; + val = (int) fval; + text[digits++] = '0' + val % 10; + } + + if (digits > 0) { + buf = *buf_p; + *buf++ = '.'; + for (prec = 0; prec < digits; prec++) { + *buf++ = text[prec]; + } + *buf_p = buf; + } +} + + +void AddString( char **buf_p, char *string, int width, int prec ) { + int size; + char *buf; + + buf = *buf_p; + + if ( string == NULL ) { + string = "(null)"; + prec = -1; + } + + if ( prec >= 0 ) { + for( size = 0; size < prec; size++ ) { + if( string[size] == '\0' ) { + break; + } + } + } + else { + size = strlen( string ); + } + + width -= size; + + while( size-- ) { + *buf++ = *string++; + } + + while( width-- > 0 ) { + *buf++ = ' '; + } + + *buf_p = buf; +} + +/* +vsprintf + +I'm not going to support a bunch of the more arcane stuff in here +just to keep it simpler. For example, the '*' and '$' are not +currently supported. I've tried to make it so that it will just +parse and ignore formats we don't support. +*/ +int vsprintf( char *buffer, const char *fmt, va_list argptr ) { + int *arg; + char *buf_p; + char ch; + int flags; + int width; + int prec; + int n; + char sign; + + buf_p = buffer; + arg = (int *)argptr; + + while( qtrue ) { + // run through the format string until we hit a '%' or '\0' + for ( ch = *fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++ ) { + *buf_p++ = ch; + } + if ( ch == '\0' ) { + goto done; + } + + // skip over the '%' + fmt++; + + // reset formatting state + flags = 0; + width = 0; + prec = -1; + sign = '\0'; + +rflag: + ch = *fmt++; +reswitch: + switch( ch ) { + case '-': + flags |= LADJUST; + goto rflag; + case '.': + n = 0; + while( is_digit( ( ch = *fmt++ ) ) ) { + n = 10 * n + ( ch - '0' ); + } + prec = n < 0 ? -1 : n; + goto reswitch; + case '0': + flags |= ZEROPAD; + goto rflag; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + n = 0; + do { + n = 10 * n + ( ch - '0' ); + ch = *fmt++; + } while( is_digit( ch ) ); + width = n; + goto reswitch; + case 'c': + *buf_p++ = (char)*arg; + arg++; + break; + case 'd': + case 'i': + AddInt( &buf_p, *arg, width, flags ); + arg++; + break; + case 'f': + AddFloat( &buf_p, *(double *)arg, width, prec ); +#ifdef __LCC__ + arg += 1; // everything is 32 bit in my compiler +#else + arg += 2; +#endif + break; + case 's': + AddString( &buf_p, (char *)*arg, width, prec ); + arg++; + break; + case '%': + *buf_p++ = ch; + break; + default: + *buf_p++ = (char)*arg; + arg++; + break; + } + } + +done: + *buf_p = 0; + return buf_p - buffer; +} + + +/* this is really crappy */ +int sscanf( const char *buffer, const char *fmt, ... ) { + int cmd; + int **arg; + int count; + + arg = (int **)&fmt + 1; + count = 0; + + while ( *fmt ) { + if ( fmt[0] != '%' ) { + fmt++; + continue; + } + + cmd = fmt[1]; + fmt += 2; + + switch ( cmd ) { + case 'i': + case 'd': + case 'u': + **arg = _atoi( &buffer ); + break; + case 'f': + *(float *)*arg = _atof( &buffer ); + break; + } + arg++; + } + + return count; +} + +#endif diff --git a/quake3/source/code/game/bg_lib.h b/quake3/source/code/game/bg_lib.h new file mode 100644 index 0000000..41f3fc1 --- /dev/null +++ b/quake3/source/code/game/bg_lib.h @@ -0,0 +1,70 @@ +// bg_lib.h -- standard C library replacement routines used by code +// compiled for the virtual machine + +// This file is NOT included on native builds + +typedef int size_t; + +typedef char * va_list; +#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) +#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) +#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) +#define va_end(ap) ( ap = (va_list)0 ) + +#define CHAR_BIT 8 /* number of bits in a char */ +#define SCHAR_MIN (-128) /* minimum signed char value */ +#define SCHAR_MAX 127 /* maximum signed char value */ +#define UCHAR_MAX 0xff /* maximum unsigned char value */ + +#define SHRT_MIN (-32768) /* minimum (signed) short value */ +#define SHRT_MAX 32767 /* maximum (signed) short value */ +#define USHRT_MAX 0xffff /* maximum unsigned short value */ +#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ +#define INT_MAX 2147483647 /* maximum (signed) int value */ +#define UINT_MAX 0xffffffff /* maximum unsigned int value */ +#define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */ +#define LONG_MAX 2147483647L /* maximum (signed) long value */ +#define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ + +// Misc functions +typedef int cmp_t(const void *, const void *); +void qsort(void *a, size_t n, size_t es, cmp_t *cmp); +void srand( unsigned seed ); +int rand( void ); + +// String functions +size_t strlen( const char *string ); +char *strcat( char *strDestination, const char *strSource ); +char *strcpy( char *strDestination, const char *strSource ); +int strcmp( const char *string1, const char *string2 ); +char *strchr( const char *string, int c ); +char *strstr( const char *string, const char *strCharSet ); +char *strncpy( char *strDest, const char *strSource, size_t count ); +int tolower( int c ); +int toupper( int c ); + +double atof( const char *string ); +double _atof( const char **stringPtr ); +int atoi( const char *string ); +int _atoi( const char **stringPtr ); + +int vsprintf( char *buffer, const char *fmt, va_list argptr ); +int sscanf( const char *buffer, const char *fmt, ... ); + +// Memory functions +void *memmove( void *dest, const void *src, size_t count ); +void *memset( void *dest, int c, size_t count ); +void *memcpy( void *dest, const void *src, size_t count ); + +// Math functions +double ceil( double x ); +double floor( double x ); +double sqrt( double x ); +double sin( double x ); +double cos( double x ); +double atan2( double y, double x ); +double tan( double x ); +int abs( int n ); +double fabs( double x ); +double acos( double x ); + diff --git a/quake3/source/code/game/bg_local.h b/quake3/source/code/game/bg_local.h new file mode 100644 index 0000000..8ba4e62 --- /dev/null +++ b/quake3/source/code/game/bg_local.h @@ -0,0 +1,63 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// bg_local.h -- local definitions for the bg (both games) files + +#define MIN_WALK_NORMAL 0.7f // can't walk on very steep slopes + +#define STEPSIZE 18 + +#define JUMP_VELOCITY 270 + +#define TIMER_LAND 130 +#define TIMER_GESTURE (34*66+50) + +#define OVERCLIP 1.001f + +// all of the locals will be zeroed before each +// pmove, just to make damn sure we don't have +// any differences when running on client or server +typedef struct { + vec3_t forward, right, up; + float frametime; + + int msec; + + qboolean walking; + qboolean groundPlane; + trace_t groundTrace; + + float impactSpeed; + + vec3_t previous_origin; + vec3_t previous_velocity; + int previous_waterlevel; +} pml_t; + +extern pmove_t *pm; +extern pml_t pml; + +// movement parameters +extern float pm_stopspeed; +extern float pm_duckScale; +extern float pm_swimScale; +extern float pm_wadeScale; + +extern float pm_accelerate; +extern float pm_airaccelerate; +extern float pm_wateraccelerate; +extern float pm_flyaccelerate; + +extern float pm_friction; +extern float pm_waterfriction; +extern float pm_flightfriction; + +extern int c_pmove; + +void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ); +void PM_AddTouchEnt( int entityNum ); +void PM_AddEvent( int newEvent ); + +qboolean PM_SlideMove( qboolean gravity ); +void PM_StepSlideMove( qboolean gravity ); + + diff --git a/quake3/source/code/game/bg_misc.c b/quake3/source/code/game/bg_misc.c new file mode 100644 index 0000000..51baf43 --- /dev/null +++ b/quake3/source/code/game/bg_misc.c @@ -0,0 +1,2052 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// bg_misc.c -- both games misc functions, all completely stateless + +#include "q_shared.h" +#include "bg_public.h" + +/*QUAKED item_***** ( 0 0 0 ) (-16 -16 -16) (16 16 16) suspended +DO NOT USE THIS CLASS, IT JUST HOLDS GENERAL INFORMATION. +The suspended flag will allow items to hang in the air, otherwise they are dropped to the next surface. + +If an item is the target of another entity, it will not spawn in until fired. + +An item fires all of its targets when it is picked up. If the toucher can't carry it, the targets won't be fired. + +"notfree" if set to 1, don't spawn in free for all games +"notteam" if set to 1, don't spawn in team games +"notsingle" if set to 1, don't spawn in single player games +"wait" override the default wait before respawning. -1 = never respawn automatically, which can be used with targeted spawning. +"random" random number of plus or minus seconds varied from the respawn time +"count" override quantity or duration on most items. +*/ + +gitem_t bg_itemlist[] = +{ + { + NULL, + NULL, + { NULL, + NULL, + 0, 0} , +/* icon */ NULL, +/* pickup */ NULL, + 0, + 0, + 0, +/* precache */ "", +/* sounds */ "" + }, // leave index 0 alone + + // + // ARMOR + // + +/*QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_armor_shard", + "sound/misc/ar1_pkup.wav", + { "models/powerups/armor/shard.md3", + "models/powerups/armor/shard_sphere.md3", + 0, 0} , +/* icon */ "icons/iconr_shard", +/* pickup */ "Armor Shard", + 5, + IT_ARMOR, + 0, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_armor_combat", + "sound/misc/ar2_pkup.wav", + { "models/powerups/armor/armor_yel.md3", + 0, 0, 0}, +/* icon */ "icons/iconr_yellow", +/* pickup */ "Armor", + 50, + IT_ARMOR, + 0, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_armor_body", + "sound/misc/ar2_pkup.wav", + { "models/powerups/armor/armor_red.md3", + 0, 0, 0}, +/* icon */ "icons/iconr_red", +/* pickup */ "Heavy Armor", + 100, + IT_ARMOR, + 0, +/* precache */ "", +/* sounds */ "" + }, + + // + // health + // +/*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_health_small", + "sound/items/s_health.wav", + { "models/powerups/health/small_cross.md3", + "models/powerups/health/small_sphere.md3", + 0, 0 }, +/* icon */ "icons/iconh_green", +/* pickup */ "5 Health", + 5, + IT_HEALTH, + 0, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_health", + "sound/items/n_health.wav", + { "models/powerups/health/medium_cross.md3", + "models/powerups/health/medium_sphere.md3", + 0, 0 }, +/* icon */ "icons/iconh_yellow", +/* pickup */ "25 Health", + 25, + IT_HEALTH, + 0, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_health_large", + "sound/items/l_health.wav", + { "models/powerups/health/large_cross.md3", + "models/powerups/health/large_sphere.md3", + 0, 0 }, +/* icon */ "icons/iconh_red", +/* pickup */ "50 Health", + 50, + IT_HEALTH, + 0, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_health_mega", + "sound/items/m_health.wav", + { "models/powerups/health/mega_cross.md3", + "models/powerups/health/mega_sphere.md3", + 0, 0 }, +/* icon */ "icons/iconh_mega", +/* pickup */ "Mega Health", + 100, + IT_HEALTH, + 0, +/* precache */ "", +/* sounds */ "" + }, + + + // + // WEAPONS + // + +/*QUAKED weapon_gauntlet (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_gauntlet", + "sound/misc/w_pkup.wav", + { "models/weapons2/gauntlet/gauntlet.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_gauntlet", +/* pickup */ "Gauntlet", + 0, + IT_WEAPON, + WP_GAUNTLET, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_shotgun", + "sound/misc/w_pkup.wav", + { "models/weapons2/shotgun/shotgun.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_shotgun", +//PKMOD - Ergodic 03/22/01 - change shotgun name to boomstick +/* pickup */ "Boomstick", + 10, + IT_WEAPON, + WP_SHOTGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_machinegun", + "sound/misc/w_pkup.wav", + { "models/weapons2/machinegun/machinegun.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_machinegun", +/* pickup */ "Machinegun", + 40, + IT_WEAPON, + WP_MACHINEGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_grenadelauncher", + "sound/misc/w_pkup.wav", + { "models/weapons2/grenadel/grenadel.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_grenade", +/* pickup */ "Grenade Launcher", + 10, + IT_WEAPON, + WP_GRENADE_LAUNCHER, +/* precache */ "", +/* sounds */ "sound/weapons/grenade/hgrenb1a.wav sound/weapons/grenade/hgrenb2a.wav" + }, + +/*QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_rocketlauncher", + "sound/misc/w_pkup.wav", + { "models/weapons2/rocketl/rocketl.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_rocket", +/* pickup */ "Rocket Launcher", + 10, + IT_WEAPON, + WP_ROCKET_LAUNCHER, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_lightning (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_lightning", + "sound/misc/w_pkup.wav", + { + //PKMOD - Ergodic 03/05/01 - Lightning hand hold model is different than the pickup model (inactive) + //PKMOD - Ergodic 03/27/01 - code was inactivated due to CLG will not have a rotating barrel + //PKMOD - Ergodic 05/15/03 - re-add lightning gun to barrel list for Uber's clg model + //"models/weapons2/lightning/lightning_pickup.md3", + "models/weapons2/lightning/lightning.md3", + //PKMOD - Ergodic 03/04/01 - Lightning pickup model is different than the hand hold model (inactive) + //PKMOD - Ergodic 03/27/01 - code was inactivated due to CLG will not have a rotating barrel +// "models/weapons2/lightning/lightning_pickup.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_lightning", +//PKMOD - Ergodic 12/19/03 - change Lightning Gun name to Chain Lightning Gun +/* pickup */ "Chain Lightning Gun", + //PKMOD - Ergodic 07/03/01 - Reduce Lightning Gun ammo, was 100 + 75, + IT_WEAPON, + WP_LIGHTNING, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_railgun", + "sound/misc/w_pkup.wav", + { "models/weapons2/railgun/railgun.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_railgun", +//PKMOD - Ergodic 07/12/01 - change railgun name to magnum +/* pickup */ "Magnum", + 10, + IT_WEAPON, + WP_RAILGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_plasmagun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_plasmagun", + "sound/misc/w_pkup.wav", + { "models/weapons2/plasma/plasma.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_plasma", +/* pickup */ "Plasma Gun", + 50, + IT_WEAPON, + WP_PLASMAGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_bfg", + "sound/misc/w_pkup.wav", + { "models/weapons2/bfg/bfg.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_bfg", +/* pickup */ "BFG10K", + 20, + IT_WEAPON, + WP_BFG, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_grapplinghook (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_grapplinghook", + "sound/misc/w_pkup.wav", + { "models/weapons2/dragon/dragon.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_grapple", +/* pickup */ "Dragon", //PKMOD - Ergodic 09/05/00 - was "Grappling Hook" + 0, + IT_WEAPON, + WP_GRAPPLING_HOOK, +/* precache */ "", +/* sounds */ "" + }, + + // + // AMMO ITEMS + // + +/*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_shells", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/shotgunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_shotgun", +/* pickup */ "Shells", + 10, + IT_AMMO, + WP_SHOTGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_bullets", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/machinegunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_machinegun", +/* pickup */ "Bullets", + 50, + IT_AMMO, + WP_MACHINEGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_grenades", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/grenadeam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_grenade", +/* pickup */ "Grenades", + 5, + IT_AMMO, + WP_GRENADE_LAUNCHER, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_cells", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/plasmaam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_plasma", +/* pickup */ "Cells", + 30, + IT_AMMO, + WP_PLASMAGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_lightning (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_lightning", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/lightningam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_lightning", +/* pickup */ "Lightning", + //PKMOD - Ergodic 07/03/01 - Reduce Lightning Gun ammo, was 60 + 40, + IT_AMMO, + WP_LIGHTNING, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_rockets", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/rocketam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_rocket", +/* pickup */ "Rockets", + 5, + IT_AMMO, + WP_ROCKET_LAUNCHER, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_slugs", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/railgunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_railgun", +//PKMOD - Ergodic 07/12/01 - change railgun name to magnum +/* pickup */ "Magnum Slugs", + 10, + IT_AMMO, + WP_RAILGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_bfg", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/bfgam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_bfg", +/* pickup */ "Bfg Ammo", + 15, + IT_AMMO, + WP_BFG, +/* precache */ "", +/* sounds */ "" + }, + + // + // HOLDABLE ITEMS + // +/*QUAKED holdable_teleporter (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_teleporter", + "sound/items/holdable.wav", + { "models/powerups/holdable/teleporter.md3", + 0, 0, 0}, +/* icon */ "icons/teleporter", +/* pickup */ "Personal Teleporter", + 60, + IT_HOLDABLE, + HI_TELEPORTER, +/* precache */ "", +/* sounds */ "" + }, +/*QUAKED holdable_medkit (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_medkit", + "sound/items/holdable.wav", + { + "models/powerups/holdable/medkit.md3", + "models/powerups/holdable/medkit_sphere.md3", + 0, 0}, +/* icon */ "icons/medkit", +/* pickup */ "Medkit", + 60, + IT_HOLDABLE, + HI_MEDKIT, +/* precache */ "", +/* sounds */ "sound/items/use_medkit.wav" + }, +//PKMOD - Ergodic 10/06/01 - add new holdable +/*QUAKED holdable_radiate (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_radiate", + "sound/items/holdable.wav", + { + "models/powerups/holdable/radiate.md3", + "models/powerups/holdable/radiate_sphere.md3", + 0, 0}, +/* icon */ "icons/radiate", +/* pickup */ "Radiate", + 60, + IT_HOLDABLE, + HI_RADIATE, +/* precache */ "", +/* sounds */ "sound/items/use_medkit.wav" + }, +//PKMOD - Ergodic 11/23/01 - add new holdable +/*QUAKED holdable_sentry (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_sentry", + "sound/items/holdable.wav", + { + "models/powerups/holdable/persentry.md3", + "models/powerups/holdable/persentry_sphere.md3", + 0, 0}, +/* icon */ "icons/persentry", +/* pickup */ "Personal Sentry", + 60, + IT_HOLDABLE, + HI_PERSENTRY, +/* precache */ "", +/* sounds */ "sound/items/use_medkit.wav" + }, + +//PKMOD - Ergodic 12/01/01 - add new holdable +/*QUAKED holdable_botlegs (.3 .3 1) (-16 -16 -20) (16 16 20) suspended +*/ + { + "holdable_botlegs", + "sound/items/holdable.wav", + { + "models/players/tankjr/lower.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_pribot_100", +/* pickup */ "Private Bot (Legs)", + 60, + IT_HOLDABLE, + HI_BOTLEGS, +/* precache */ "", +/* sounds */ "sound/items/use_medkit.wav" + }, + +//PKMOD - Ergodic 12/01/01 - add new holdable +/*QUAKED holdable_bottorso (.3 .3 1) (-24 -24 -16) (24 24 16) suspended +*/ + { + "holdable_bottorso", + "sound/items/holdable.wav", + { + "models/players/doom/upper.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_pribot_010", +/* pickup */ "Private Bot (Torso)", + 60, + IT_HOLDABLE, + HI_BOTTORSO, +/* precache */ "", +/* sounds */ "sound/items/use_medkit.wav" + }, + +//PKMOD - Ergodic 12/01/01 - add new holdable +/*QUAKED holdable_bothead (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_bothead", + "sound/items/holdable.wav", + { + "models/players/visor/head.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_pribot_001", +/* pickup */ "Private Bot (Head)", + 60, + IT_HOLDABLE, + HI_BOTHEAD, +/* precache */ "", +/* sounds */ "sound/items/use_medkit.wav" + }, + + + // + // POWERUP ITEMS + // +/*QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_quad", + "sound/items/quaddamage.wav", + { "models/powerups/instant/quad.md3", + "models/powerups/instant/quad_ring.md3", + 0, 0 }, +/* icon */ "icons/quad", +/* pickup */ "Quad Damage", + 30, + IT_POWERUP, + PW_QUAD, +/* precache */ "", +/* sounds */ "sound/items/damage2.wav sound/items/damage3.wav" + }, + +/*QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_enviro", + "sound/items/protect.wav", + { "models/powerups/instant/enviro.md3", + "models/powerups/instant/enviro_ring.md3", + 0, 0 }, +/* icon */ "icons/envirosuit", +/* pickup */ "Battle Suit", + 30, + IT_POWERUP, + PW_BATTLESUIT, +/* precache */ "", +/* sounds */ "sound/items/airout.wav sound/items/protect3.wav" + }, + +/*QUAKED item_haste (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_haste", + "sound/items/haste.wav", + { "models/powerups/instant/haste.md3", + "models/powerups/instant/haste_ring.md3", + 0, 0 }, +/* icon */ "icons/haste", +/* pickup */ "Speed", + 30, + IT_POWERUP, + PW_HASTE, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_invis (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_invis", + "sound/items/invisibility.wav", + { "models/powerups/instant/invis.md3", + "models/powerups/instant/invis_ring.md3", + 0, 0 }, +/* icon */ "icons/invis", +/* pickup */ "Invisibility", + 30, + IT_POWERUP, + PW_INVIS, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_regen (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_regen", + "sound/items/regeneration.wav", + { "models/powerups/instant/regen.md3", + "models/powerups/instant/regen_ring.md3", + 0, 0 }, +/* icon */ "icons/regen", +/* pickup */ "Regeneration", + 30, + IT_POWERUP, + PW_REGEN, +/* precache */ "", +/* sounds */ "sound/items/regen.wav" + }, + +/*QUAKED item_flight (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "item_flight", + "sound/items/flight.wav", + { "models/powerups/instant/flight.md3", + "models/powerups/instant/flight_ring.md3", + 0, 0 }, +/* icon */ "icons/flight", +/* pickup */ "Flight", + 60, + IT_POWERUP, + PW_FLIGHT, +/* precache */ "", +/* sounds */ "sound/items/flight.wav" + }, + +/*QUAKED team_CTF_redflag (1 0 0) (-16 -16 -16) (16 16 16) +Only in CTF games +*/ + { + "team_CTF_redflag", + NULL, + { "models/flags/r_flag.md3", + 0, 0, 0 }, +/* icon */ "icons/iconf_red1", +/* pickup */ "Red Flag", + 0, + IT_TEAM, + PW_REDFLAG, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED team_CTF_blueflag (0 0 1) (-16 -16 -16) (16 16 16) +Only in CTF games +*/ + { + "team_CTF_blueflag", + NULL, + { "models/flags/b_flag.md3", + 0, 0, 0 }, +/* icon */ "icons/iconf_blu1", +/* pickup */ "Blue Flag", + 0, + IT_TEAM, + PW_BLUEFLAG, +/* precache */ "", +/* sounds */ "" + }, + +#ifdef MISSIONPACK +/*QUAKED holdable_kamikaze (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_kamikaze", + "sound/items/holdable.wav", + { "models/powerups/kamikazi.md3", + 0, 0, 0}, +/* icon */ "icons/kamikaze", +/* pickup */ "Kamikaze", + 60, + IT_HOLDABLE, + HI_KAMIKAZE, +/* precache */ "", +/* sounds */ "sound/items/kamikazerespawn.wav" + }, + +/*QUAKED holdable_portal (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_portal", + "sound/items/holdable.wav", + { "models/powerups/holdable/porter.md3", + 0, 0, 0}, +/* icon */ "icons/portal", +/* pickup */ "Portal", + 60, + IT_HOLDABLE, + HI_PORTAL, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED holdable_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "holdable_invulnerability", + "sound/items/holdable.wav", + { "models/powerups/holdable/invulnerability.md3", + 0, 0, 0}, +/* icon */ "icons/invulnerability", +/* pickup */ "Invulnerability", + 60, + IT_HOLDABLE, + HI_INVULNERABILITY, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_nails (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_nails", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/nailgunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_nailgun", +/* pickup */ "Nails", + 20, + IT_AMMO, + WP_NAILGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_mines (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_mines", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/proxmineam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_proxlauncher", +/* pickup */ "Proximity Mines", + 10, + IT_AMMO, + WP_PROX_LAUNCHER, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_belt (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_belt", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/chaingunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_chaingun", +/* pickup */ "Chaingun Belt", + 100, + IT_AMMO, + WP_CHAINGUN, +/* precache */ "", +/* sounds */ "" + }, + + // + // PERSISTANT POWERUP ITEMS + // +/*QUAKED item_scout (.3 .3 1) (-16 -16 -16) (16 16 16) suspended redTeam blueTeam +*/ + { + "item_scout", + "sound/items/scout.wav", + { "models/powerups/scout.md3", + 0, 0, 0 }, +/* icon */ "icons/scout", +/* pickup */ "Scout", + 30, + IT_PERSISTANT_POWERUP, + PW_SCOUT, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_guard (.3 .3 1) (-16 -16 -16) (16 16 16) suspended redTeam blueTeam +*/ + { + "item_guard", + "sound/items/guard.wav", + { "models/powerups/guard.md3", + 0, 0, 0 }, +/* icon */ "icons/guard", +/* pickup */ "Guard", + 30, + IT_PERSISTANT_POWERUP, + PW_GUARD, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_doubler (.3 .3 1) (-16 -16 -16) (16 16 16) suspended redTeam blueTeam +*/ + { + "item_doubler", + "sound/items/doubler.wav", + { "models/powerups/doubler.md3", + 0, 0, 0 }, +/* icon */ "icons/doubler", +/* pickup */ "Doubler", + 30, + IT_PERSISTANT_POWERUP, + PW_DOUBLER, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED item_doubler (.3 .3 1) (-16 -16 -16) (16 16 16) suspended redTeam blueTeam +*/ + { + "item_ammoregen", + "sound/items/ammoregen.wav", + { "models/powerups/ammo.md3", + 0, 0, 0 }, +/* icon */ "icons/ammo_regen", +/* pickup */ "Ammo Regen", + 30, + IT_PERSISTANT_POWERUP, + PW_AMMOREGEN, +/* precache */ "", +/* sounds */ "" + }, + + /*QUAKED team_CTF_neutralflag (0 0 1) (-16 -16 -16) (16 16 16) +Only in One Flag CTF games +*/ + { + "team_CTF_neutralflag", + NULL, + { "models/flags/n_flag.md3", + 0, 0, 0 }, +/* icon */ "icons/iconf_neutral1", +/* pickup */ "Neutral Flag", + 0, + IT_TEAM, + PW_NEUTRALFLAG, +/* precache */ "", +/* sounds */ "" + }, + + { + "item_redcube", + "sound/misc/am_pkup.wav", + { "models/powerups/orb/r_orb.md3", + 0, 0, 0 }, +/* icon */ "icons/iconh_rorb", +/* pickup */ "Red Cube", + 0, + IT_TEAM, + 0, +/* precache */ "", +/* sounds */ "" + }, + + { + "item_bluecube", + "sound/misc/am_pkup.wav", + { "models/powerups/orb/b_orb.md3", + 0, 0, 0 }, +/* icon */ "icons/iconh_borb", +/* pickup */ "Blue Cube", + 0, + IT_TEAM, + 0, +/* precache */ "", +/* sounds */ "" + }, +/*QUAKED weapon_nailgun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_nailgun", + "sound/misc/w_pkup.wav", + { "models/weapons/nailgun/nailgun.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_nailgun", +/* pickup */ "Nailgun", + 10, + IT_WEAPON, + WP_NAILGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_prox_launcher (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_prox_launcher", + "sound/misc/w_pkup.wav", + { "models/weapons/proxmine/proxmine.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_proxlauncher", +/* pickup */ "Prox Launcher", + 5, + IT_WEAPON, + WP_PROX_LAUNCHER, +/* precache */ "", +/* sounds */ "sound/weapons/proxmine/wstbtick.wav " + "sound/weapons/proxmine/wstbactv.wav " + "sound/weapons/proxmine/wstbimpl.wav " + "sound/weapons/proxmine/wstbimpm.wav " + "sound/weapons/proxmine/wstbimpd.wav " + "sound/weapons/proxmine/wstbactv.wav" + }, + +/*QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_chaingun", + "sound/misc/w_pkup.wav", + { "models/weapons/vulcan/vulcan.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_chaingun", +/* pickup */ "Chaingun", + 80, + IT_WEAPON, + WP_CHAINGUN, +/* precache */ "", +/* sounds */ "sound/weapons/vulcan/wvulwind.wav" + }, +#endif + + +/*PKMOD -Add Weapons. + WP_HARPOON, + WP_GRAVITY, + WP_SENTRY, + WP_BEARTRAP, + WP_CHAINLG, + WP_A2K, + WP_EMPNUKE, + WP_AIRFIST, + WP_NAILGUN, + PKMOD -Add Weapons. */ + +//PKMOD - Ergodic - 05/14/00 added new gw model +/*QUAKED weapon_gravity (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +//PKMOD - Ergodic 03/17/01 new PKA gravity well weapon to the "hold" model + */ + { + "weapon_gravity", + "sound/misc/w_pkup.wav", + { "models/weapons2/gwell/gwp.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_gravity", +/* pickup */ "Gravity Well", + 1, + IT_WEAPON, + WP_GRAVITY, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_sentry(.3 .3 1) (-16 -16 -16) (16 16 16) suspended + */ + { + "weapon_sentry", + "sound/misc/w_pkup.wav", + //PKMOD - Ergodic 05/31/02 - add animated autosentry model + { "models/weapons2/autosentry/autosentry.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_autosentry", +/* pickup */ "Auto Sentry", + 1, + IT_WEAPON, + WP_SENTRY, +/* precache */ "", +/* sounds */ "" + }, + /*QUAKED weapon_beartrap (.3 .3 1) (-16 -16 -16) (16 16 16) suspended + */ + { + "weapon_beartrap", + "sound/misc/w_pkup.wav", + { "models/weapons2/beartrap/bearpick.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_beartrap", +/* pickup */ "Bear Trap", + 1, + IT_WEAPON, + WP_BEARTRAP, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_airfist (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_airfist", + "sound/misc/w_pkup.wav", + { "models/weapons2/airfist/airfist.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_airfist", +/* pickup */ "Air Fist", +//PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level + 4, //05/18/01 - was 0 + IT_WEAPON, + WP_AIRFIST, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_nailgun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_nailgun", + "sound/misc/w_pkup.wav", + { "models/weapons2/nailgun/nailgun.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_nailgun", +/* pickup */ "Nail Gun", + 50, + IT_WEAPON, + WP_NAILGUN, +/* precache */ "", +/* sounds */ "" + }, + +//PKMOD +/*QUAKED ammo_nails (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_nails", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/nailgunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_nailgun", +/* pickup */ "Nails", + 50, + IT_AMMO, + WP_NAILGUN, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED weapon_beans (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_beans", + "sound/misc/w_pkup.wav", + { "models/weapons2/beans/beans.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_beans", +/* pickup */ "Can of Pork-N-Beans", + 1, + IT_WEAPON, + WP_BEANS, +/* precache */ "", +/* sounds */ "" + }, + + /*QUAKED weapon_expshotgun (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_expgun", + "sound/misc/w_pkup.wav", + { "models/weapons2/explgun/explgun.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_explgun", +/* pickup */ "Exploding Shells Shotgun", + 10, + IT_WEAPON, + WP_EXPLODING_SHELLS, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED ammo_expshell (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_expshells", + "sound/misc/am_pkup.wav", + { "models/powerups/ammo/explgunam.md3", + 0, 0, 0}, +/* icon */ "icons/icona_explgun", +/* pickup */ "Explosive Shells", + 10, + IT_AMMO, + WP_EXPLODING_SHELLS, +/* precache */ "", +/* sounds */ "" + }, + +/*QUAKED voting_image (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +"voting_mapname" "map name of voting entity" // <= 20 bytes +"voting_maptitle" "map title of voting entity" // <= 124 bytes "MAX_FILE_PATH==144" +"voting_shader" "index of the voting shader" +*/ + { + "voting_image", //classname + "sound/misc/am_pkup.wav", + { "models/voting/voting.md3", + 0, 0, 0}, +/* icon */ "icons/iconw_beans", +/* pickup */ "Voting Image", //can not pick this item up + 3, + IT_VOTING, +// PW_VOTING, //12/17/00 remove the PW_VOTING definition due to lack of space + 0, //12/17/00 +/* precache */ "", +/* sounds */ "" + }, + + //PKMOD + + // end of list marker + {NULL} +}; + +int bg_numItems = sizeof(bg_itemlist) / sizeof(bg_itemlist[0]) - 1; + +//PKMOD - Ergodic 09/27/2000, included in both the game dll and the client +int Hub_Index; //points to last Hub element (Game Code only) +ghubInfo_t hubInfo[MAX_HUB_INDEX]; + +//PKMOD - Ergodic 01/13/02 - PRIVATE BOT definitions +int active_private_bots; //number of active Private Bots + + +/* +============== +BG_FindItemForPowerup +============== +*/ +gitem_t *BG_FindItemForPowerup( powerup_t pw ) { + int i; + + for ( i = 0 ; i < bg_numItems ; i++ ) { + if ( (bg_itemlist[i].giType == IT_POWERUP || + bg_itemlist[i].giType == IT_TEAM || + bg_itemlist[i].giType == IT_PERSISTANT_POWERUP) && + bg_itemlist[i].giTag == pw ) { + return &bg_itemlist[i]; + } + } + + return NULL; +} + + +/* +============== +BG_FindItemForHoldable +============== +*/ +gitem_t *BG_FindItemForHoldable( holdable_t pw ) { + int i; + + for ( i = 0 ; i < bg_numItems ; i++ ) { + if ( bg_itemlist[i].giType == IT_HOLDABLE && bg_itemlist[i].giTag == pw ) { + return &bg_itemlist[i]; + } + } + + Com_Error( ERR_DROP, "HoldableItem not found" ); + + return NULL; +} + + +/* +=============== +BG_FindItemForWeapon + +=============== +*/ +gitem_t *BG_FindItemForWeapon( weapon_t weapon ) { + gitem_t *it; + + for ( it = bg_itemlist + 1 ; it->classname ; it++) { + if ( it->giType == IT_WEAPON && it->giTag == weapon ) { + return it; + } + } + + Com_Error( ERR_DROP, "Couldn't find item for weapon %i", weapon); + return NULL; +} + +/* +=============== +BG_FindItem + +=============== +*/ +gitem_t *BG_FindItem( const char *pickupName ) { + gitem_t *it; + + for ( it = bg_itemlist + 1 ; it->classname ; it++ ) { + if ( !Q_stricmp( it->pickup_name, pickupName ) ) + return it; + } + + return NULL; +} + +/* +============ +BG_PlayerTouchesItem + +Items can be picked up without actually touching their physical bounds to make +grabbing them easier +============ +*/ +qboolean BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime ) { + vec3_t origin; + + BG_EvaluateTrajectory( &item->pos, atTime, origin ); + + // we are ignoring ducked differences here + if ( ps->origin[0] - origin[0] > 44 + || ps->origin[0] - origin[0] < -50 + || ps->origin[1] - origin[1] > 36 + || ps->origin[1] - origin[1] < -36 + || ps->origin[2] - origin[2] > 36 + || ps->origin[2] - origin[2] < -36 ) { + return qfalse; + } + + return qtrue; +} + + + +/* +================ +BG_CanItemBeGrabbed + +Returns false if the item should not be picked up. +This needs to be the same for client side prediction and server use. +//PKMOD - Ergodic 07/06/00 - do not pick up PKA Items if at max inventory +================ +*/ +qboolean BG_CanItemBeGrabbed( int gametype, const entityState_t *ent, const playerState_t *ps ) { + gitem_t *item; +#ifdef MISSIONPACK + int upperBound; +#endif + + if ( ent->modelindex < 1 || ent->modelindex >= bg_numItems ) { +//Ergodic - Debug + Com_Printf("BG_CanItemBeGrabbed: index out of range - modelindex>%d<, eType>%d<\n", ent->modelindex, ent->eType); + + + Com_Error( ERR_DROP, "BG_CanItemBeGrabbed: index out of range" ); + } + + item = &bg_itemlist[ent->modelindex]; + + switch( item->giType ) { + case IT_WEAPON: + switch (item->giTag) { + case WP_BEARTRAP: + if ( ps->ammo[ item->giTag ] >= 3 ) + return qfalse; + break; + case WP_SENTRY: + if ( ps->ammo[ item->giTag ] >= 3 ) + return qfalse; + break; + case WP_GRAVITY: + if ( ps->ammo[ item->giTag ] >= 1 ) + return qfalse; + break; + case WP_BEANS: + if ( ps->ammo[ item->giTag ] >= 1 ) + return qfalse; + break; + } + return qtrue; // weapons are always picked up. 07/06 Ergodic - except PKA weapons + + case IT_AMMO: + //PKMOD - Ergodic 01/25/01 - can only hold 10 exploding shells at a time + if ( item->giTag == WP_EXPLODING_SHELLS ) { + if ( ps->ammo[ item->giTag ] >= 10 ) { + return qfalse; // can't hold any more + } + } + else { + if ( ps->ammo[ item->giTag ] >= 200 ) { + return qfalse; // can't hold any more + } + } + return qtrue; + + case IT_ARMOR: + if ( ps->stats[STAT_ARMOR] >= ps->stats[STAT_MAX_HEALTH] * 2 ) { + return qfalse; + } + return qtrue; + + case IT_HEALTH: + // small and mega healths will go over the max, otherwise + // don't pick up if already at max +#ifdef MISSIONPACK + if( bg_itemlist[ps->stats[STAT_PERSISTANT_POWERUP]].giTag == PW_GUARD ) { + upperBound = ps->stats[STAT_MAX_HEALTH]; + } + else +#endif + if ( item->quantity == 5 || item->quantity == 100 ) { + if ( ps->stats[STAT_HEALTH] >= ps->stats[STAT_MAX_HEALTH] * 2 ) { + return qfalse; + } + return qtrue; + } + + if ( ps->stats[STAT_HEALTH] >= ps->stats[STAT_MAX_HEALTH] ) { + return qfalse; + } + return qtrue; + + case IT_POWERUP: + return qtrue; // powerups are always picked up + +#ifdef MISSIONPACK + case IT_PERSISTANT_POWERUP: + // can only hold one item at a time + if ( ps->stats[STAT_PERSISTANT_POWERUP] ) { + return qfalse; + } + + // check team only + if( ( ent->generic1 & 2 ) && ( ps->persistant[PERS_TEAM] != TEAM_RED ) ) { + return qfalse; + } + if( ( ent->generic1 & 4 ) && ( ps->persistant[PERS_TEAM] != TEAM_BLUE ) ) { + return qfalse; + } + + return qtrue; +#endif + + case IT_TEAM: // team items, such as flags +#ifdef MISSIONPACK + if( gametype == GT_1FCTF ) { + // neutral flag can always be picked up + if( item->giTag == PW_NEUTRALFLAG ) { + return qtrue; + } + if (ps->persistant[PERS_TEAM] == TEAM_RED) { + if (item->giTag == PW_BLUEFLAG && ps->powerups[PW_NEUTRALFLAG] ) { + return qtrue; + } + } else if (ps->persistant[PERS_TEAM] == TEAM_BLUE) { + if (item->giTag == PW_REDFLAG && ps->powerups[PW_NEUTRALFLAG] ) { + return qtrue; + } + } + } +#endif + if( gametype == GT_CTF ) { + // ent->modelindex2 is non-zero on items if they are dropped + // we need to know this because we can pick up our dropped flag (and return it) + // but we can't pick up our flag at base + if (ps->persistant[PERS_TEAM] == TEAM_RED) { + if (item->giTag == PW_BLUEFLAG || + (item->giTag == PW_REDFLAG && ent->modelindex2) || + (item->giTag == PW_REDFLAG && ps->powerups[PW_BLUEFLAG]) ) + return qtrue; + } else if (ps->persistant[PERS_TEAM] == TEAM_BLUE) { + if (item->giTag == PW_REDFLAG || + (item->giTag == PW_BLUEFLAG && ent->modelindex2) || + (item->giTag == PW_BLUEFLAG && ps->powerups[PW_REDFLAG]) ) + return qtrue; + } + } + +#ifdef MISSIONPACK + if( gametype == GT_HARVESTER ) { + return qtrue; + } +#endif + return qfalse; + + case IT_HOLDABLE: + //PKMOD - Ergodic 05/11/01 - allow holding of more than 1 type of + // holdable but only 1 of each kind + if ( ps->stats[STAT_HOLDABLE_ITEM] & (1 << item->giTag)) { + return qfalse; + } + return qtrue; + + //PKMOD - Ergodic 09/21/00 - make voting entity touchable + case IT_VOTING: + return qtrue; + + case IT_BAD: + Com_Error( ERR_DROP, "BG_CanItemBeGrabbed: IT_BAD" ); + default: +#ifndef Q3_VM +#ifndef NDEBUG // bk0001204 + Com_Printf("BG_CanItemBeGrabbed: unknown enum %d\n", item->giType ); +#endif +#endif + break; + } + + return qfalse; +} + +//====================================================================== + +/* +================ +BG_EvaluateTrajectory + +================ +*/ +void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) { + float deltaTime; + float phase; + + switch( tr->trType ) { + case TR_STATIONARY: + case TR_INTERPOLATE: + VectorCopy( tr->trBase, result ); + break; + case TR_LINEAR: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + break; + case TR_SINE: + deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration; + phase = sin( deltaTime * M_PI * 2 ); + VectorMA( tr->trBase, phase, tr->trDelta, result ); + break; + case TR_LINEAR_STOP: + if ( atTime > tr->trTime + tr->trDuration ) { + atTime = tr->trTime + tr->trDuration; + } + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + if ( deltaTime < 0 ) { + deltaTime = 0; + } + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + break; + case TR_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + result[2] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... + break; + //PKMOD - Ergodic 04/17/01 - add local gravity + // trDuration has been co-opted to hold "gravity" + case TR_LOCAL_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + result[2] -= 0.5 * tr->trDuration * deltaTime * deltaTime; + break; + default: + Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trTime ); + break; + } +} + +/* +================ +BG_EvaluateTrajectoryDelta + +For determining velocity at a given time +================ +*/ +void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ) { + float deltaTime; + float phase; + + switch( tr->trType ) { + case TR_STATIONARY: + case TR_INTERPOLATE: + VectorClear( result ); + break; + case TR_LINEAR: + VectorCopy( tr->trDelta, result ); + break; + case TR_SINE: + deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration; + phase = cos( deltaTime * M_PI * 2 ); // derivative of sin = cos + phase *= 0.5; + VectorScale( tr->trDelta, phase, result ); + break; + case TR_LINEAR_STOP: + if ( atTime > tr->trTime + tr->trDuration ) { + VectorClear( result ); + return; + } + VectorCopy( tr->trDelta, result ); + break; + case TR_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorCopy( tr->trDelta, result ); + result[2] -= DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity... + break; + //PKMOD - Ergodic 04/17/01 - add local gravity + // trDuration has been co-opted to hold "gravity" + case TR_LOCAL_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorCopy( tr->trDelta, result ); + result[2] -= tr->trDuration * deltaTime; // FIXME: local gravity... + break; + default: + Com_Error( ERR_DROP, "BG_EvaluateTrajectoryDelta: unknown trType: %i", tr->trTime ); + break; + } +} + +char *eventnames[] = { + "EV_NONE", + + "EV_FOOTSTEP", + "EV_FOOTSTEP_METAL", + "EV_FOOTSPLASH", + "EV_FOOTWADE", + "EV_SWIM", + + "EV_STEP_4", + "EV_STEP_8", + "EV_STEP_12", + "EV_STEP_16", + + "EV_FALL_SHORT", + "EV_FALL_MEDIUM", + "EV_FALL_FAR", + + "EV_JUMP_PAD", // boing sound at origin", jump sound on player + + "EV_JUMP", + "EV_WATER_TOUCH", // foot touches + "EV_WATER_LEAVE", // foot leaves + "EV_WATER_UNDER", // head touches + "EV_WATER_CLEAR", // head leaves + + "EV_ITEM_PICKUP", // normal item pickups are predictable + "EV_GLOBAL_ITEM_PICKUP", // powerup / team sounds are broadcast to everyone + + "EV_NOAMMO", + "EV_CHANGE_WEAPON", + "EV_FIRE_WEAPON", + + "EV_USE_ITEM0", + "EV_USE_ITEM1", + "EV_USE_ITEM2", + "EV_USE_ITEM3", + "EV_USE_ITEM4", + "EV_USE_ITEM5", + "EV_USE_ITEM6", + "EV_USE_ITEM7", + "EV_USE_ITEM8", + "EV_USE_ITEM9", + "EV_USE_ITEM10", + "EV_USE_ITEM11", + "EV_USE_ITEM12", + "EV_USE_ITEM13", + "EV_USE_ITEM14", + "EV_USE_ITEM15", + + "EV_ITEM_RESPAWN", + "EV_ITEM_POP", + "EV_PLAYER_TELEPORT_IN", + "EV_PLAYER_TELEPORT_OUT", + + "EV_GRENADE_BOUNCE", // eventParm will be the soundindex + + "EV_GENERAL_SOUND", + "EV_GLOBAL_SOUND", // no attenuation + "EV_GLOBAL_TEAM_SOUND", + + "EV_BULLET_HIT_FLESH", + "EV_BULLET_HIT_WALL", + + "EV_MISSILE_HIT", + "EV_MISSILE_MISS", + "EV_MISSILE_MISS_METAL", + "EV_RAILTRAIL", + "EV_SHOTGUN", + "EV_BULLET", // otherEntity is the shooter + + "EV_PAIN", + "EV_DEATH1", + "EV_DEATH2", + "EV_DEATH3", + "EV_OBITUARY", + + "EV_POWERUP_QUAD", + "EV_POWERUP_BATTLESUIT", + "EV_POWERUP_REGEN", + + "EV_GIB_PLAYER", // gib a previously living player + "EV_SCOREPLUM", // score plum + +//#ifdef MISSIONPACK + "EV_PROXIMITY_MINE_STICK", + "EV_PROXIMITY_MINE_TRIGGER", + "EV_KAMIKAZE", // kamikaze explodes + "EV_OBELISKEXPLODE", // obelisk explodes + "EV_INVUL_IMPACT", // invulnerability sphere impact + "EV_JUICED", // invulnerability juiced effect + "EV_LIGHTNINGBOLT", // lightning bolt bounced of invulnerability sphere +//#endif + + "EV_DEBUG_LINE", + "EV_STOPLOOPINGSOUND", + "EV_TAUNT" + +}; + +/* +=============== +BG_AddPredictableEventToPlayerstate + +Handles the sequence numbers +=============== +*/ + +void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ); + +void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps ) { + +#ifdef _DEBUG + { + char buf[256]; + trap_Cvar_VariableStringBuffer("showevents", buf, sizeof(buf)); + if ( atof(buf) != 0 ) { +#ifdef QAGAME + Com_Printf(" game event svt %5d -> %5d: num = %20s parm %d\n", ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence, eventnames[newEvent], eventParm); +#else + Com_Printf("Cgame event svt %5d -> %5d: num = %20s parm %d\n", ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence, eventnames[newEvent], eventParm); +#endif + } + } +#endif + ps->events[ps->eventSequence & (MAX_PS_EVENTS-1)] = newEvent; + ps->eventParms[ps->eventSequence & (MAX_PS_EVENTS-1)] = eventParm; + ps->eventSequence++; +} + +/* +======================== +BG_TouchJumpPad +======================== +*/ +void BG_TouchJumpPad( playerState_t *ps, entityState_t *jumppad ) { + vec3_t angles; + float p; + int effectNum; + + // spectators don't use jump pads + if ( ps->pm_type != PM_NORMAL ) { + return; + } + + // flying characters don't hit bounce pads + if ( ps->powerups[PW_FLIGHT] ) { + return; + } + + // if we didn't hit this same jumppad the previous frame + // then don't play the event sound again if we are in a fat trigger + if ( ps->jumppad_ent != jumppad->number ) { + + vectoangles( jumppad->origin2, angles); + p = fabs( AngleNormalize180( angles[PITCH] ) ); + if( p < 45 ) { + effectNum = 0; + } else { + effectNum = 1; + } + + //PKMOD - Ergodic 11/15/00 add functionality to make trigger_push silent + if ( jumppad->eType != ET_QUIET_TRIGGER ) + BG_AddPredictableEventToPlayerstate( EV_JUMP_PAD, effectNum, ps ); + } + // remember hitting this jumppad this frame + ps->jumppad_ent = jumppad->number; + ps->jumppad_frame = ps->pmove_framecount; + // give the player the velocity from the jumppad + VectorCopy( jumppad->origin2, ps->velocity ); +} + +/* +======================== +BG_PlayerStateToEntityState + +This is done after each set of usercmd_t on the server, +and after local prediction on the client +======================== +*/ +void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap ) { + int i; + + if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR ) { + s->eType = ET_INVISIBLE; + } else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) { + s->eType = ET_INVISIBLE; + } else { + s->eType = ET_PLAYER; + } + + s->number = ps->clientNum; + + s->pos.trType = TR_INTERPOLATE; + VectorCopy( ps->origin, s->pos.trBase ); + if ( snap ) { + SnapVector( s->pos.trBase ); + } + // set the trDelta for flag direction + VectorCopy( ps->velocity, s->pos.trDelta ); + + s->apos.trType = TR_INTERPOLATE; + VectorCopy( ps->viewangles, s->apos.trBase ); + if ( snap ) { + SnapVector( s->apos.trBase ); + } + + //PKMOD - Ergodic 07/07/01 - movementDir is now packed into time2 +// s->angles2[YAW] = ps->movementDir; + s->legsAnim = ps->legsAnim; + s->torsoAnim = ps->torsoAnim; + s->clientNum = ps->clientNum; // ET_PLAYER looks here instead of at number + // so corpses can also reference the proper config + s->eFlags = ps->eFlags; + if ( ps->stats[STAT_HEALTH] <= 0 ) { + s->eFlags |= EF_DEAD; + } else { + s->eFlags &= ~EF_DEAD; + } + + if ( ps->externalEvent ) { + s->event = ps->externalEvent; + s->eventParm = ps->externalEventParm; + } else if ( ps->entityEventSequence < ps->eventSequence ) { + int seq; + + if ( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS) { + ps->entityEventSequence = ps->eventSequence - MAX_PS_EVENTS; + } + seq = ps->entityEventSequence & (MAX_PS_EVENTS-1); + s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 ); + s->eventParm = ps->eventParms[ seq ]; + ps->entityEventSequence++; + } + + s->weapon = ps->weapon; + s->groundEntityNum = ps->groundEntityNum; + + s->powerups = 0; + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { + if ( ps->powerups[ i ] ) { + s->powerups |= 1 << i; + } + } + + //PKMOD Ergodic 08/22/00 - set the target's playerstate shafted flag - for cgame + if ( ps->stats[STAT_PKA_ITEMS] & ( 1 << PKA_SHAFTED ) ) { //is client currently being shafted + s->powerups |= 1 << PW_CLGPLAYERHIT; + } + + +//PKMOD - Ergodic 07/10/00 add definition for beartraps attached constant for the +// angles2 co-opt hack. the entitystate_t angles2[beartraps_attached] +// variable will link the beartrap info from the game to the client +// Update - 07/10/00 pack in the variable for viewheight and offset it by 50 units +// so that it will always be positive +//PKMOD - Ergodic 12/19/00 use time2 instead of angles2 +// if ( ps->stats[STAT_BEARTRAPS_ATTACHED] > 0 ) +// s->angles2[BEARTRAPS_ATTACHED] = ps->stats[STAT_BEARTRAPS_ATTACHED] + 100 * (ps->viewheight + 50); +// else +// s->angles2[BEARTRAPS_ATTACHED] = 0; + +//PKMOD - Ergodic 07/07/01 - time2 bits : 33332221100 +// bits 00 [0-1] = # of attached beartraps (values: 0 - 3) +// bits 11 [2-3] = encoded viewheight (values: 0 - 2) +// bits 222 [4-6] = airfist level (values: 0 - 4) +// bits 333 [7-9] = ps->movementDir (values: 0 - 7) + +//PKMOD - Ergodic 12/01/01 - always store the encoded viewheight into co-opted time2 +//PKMOD - Ergodic 07/07/01 - encode viewheight to save space.. +// viewheight has 3 settings found in bg_public.h: +// #define DEFAULT_VIEWHEIGHT 26 [Encoded as 0] +// #define CROUCH_VIEWHEIGHT 12 [Encoded as 1] +// #define DEAD_VIEWHEIGHT -16 [Encoded as 2] + if ( ps->viewheight == DEFAULT_VIEWHEIGHT ) + i = 0; + else if ( ps->viewheight == CROUCH_VIEWHEIGHT ) + i = 1; + else + i = 2; + s->time2 = i << 2; + +//PKMOD - Ergodic 11/13/00 - pack beartraps into time2 + if ( ps->stats[STAT_BEARTRAPS_ATTACHED] > 0 ) { + i = ps->stats[STAT_BEARTRAPS_ATTACHED]; + if ( i > 3 ) + s->time2 |= 3; + else + s->time2 |= i; + } + +//PKMOD - Ergodic 11/16/00 - pack airfist level into time2 +//PKMOD - Ergodic 07/07/01 - change packing of airfist level from 9 to 4 + if ( s->weapon == WP_AIRFIST ) { + s->time2 |= ps->stats[STAT_PRIOR_AIRFIST_LEVEL] << 4; + } + + //PKMOD - Ergodic 10/18/01 - store pkaitems into modelindex2 + s->modelindex2 = ps->stats[STAT_PKA_ITEMS]; + + //PKMOD - Ergodic 07/07/01 - pack in movementdir + s->time2 |= ps->movementDir << 7; + + //PKMOD - Ergodic 07/07/01 - build angles2 + //PKMOD - Ergodic - 12/16/03 Removed angles2 because it is unused + //s->angles2[YAW] = ps->stats[STAT_CLG_SHAFT_YAW] / 1000; + //s->angles2[PITCH] = ps->stats[STAT_CLG_SHAFT_PITCH] / 1000; + //s->angles2[ROLL] = ps->viewangles[ROLL]; + + s->loopSound = ps->loopSound; + s->generic1 = ps->generic1; + + //PKMOD - Ergodic 12/16/03 - copy over otherEntityNum2 to entitystate. + // I thought this was done, but perhaps not. This is used in + // Chainshaft mechanism to store shaftee + //PKMOD - Ergodic - 12/16/03 Use stat location to store shaftee entity number + s->otherEntityNum2 = ps->stats[STAT_CLG_SHAFTEE_NUM]; +} + +/* +======================== +BG_PlayerStateToEntityStateExtraPolate + +This is done after each set of usercmd_t on the server, +and after local prediction on the client +======================== +*/ +void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap ) { + int i; + + if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR ) { + s->eType = ET_INVISIBLE; + } else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) { + s->eType = ET_INVISIBLE; + } else { + s->eType = ET_PLAYER; + } + + s->number = ps->clientNum; + + s->pos.trType = TR_LINEAR_STOP; + VectorCopy( ps->origin, s->pos.trBase ); + if ( snap ) { + SnapVector( s->pos.trBase ); + } + // set the trDelta for flag direction and linear prediction + VectorCopy( ps->velocity, s->pos.trDelta ); + // set the time for linear prediction + s->pos.trTime = time; + // set maximum extra polation time + s->pos.trDuration = 50; // 1000 / sv_fps (default = 20) + + s->apos.trType = TR_INTERPOLATE; + VectorCopy( ps->viewangles, s->apos.trBase ); + if ( snap ) { + SnapVector( s->apos.trBase ); + } + + //PKMOD - Ergodic 07/07/01 - movementDir is now packed into time2 +// s->angles2[YAW] = ps->movementDir; + s->legsAnim = ps->legsAnim; + s->torsoAnim = ps->torsoAnim; + s->clientNum = ps->clientNum; // ET_PLAYER looks here instead of at number + // so corpses can also reference the proper config + s->eFlags = ps->eFlags; + if ( ps->stats[STAT_HEALTH] <= 0 ) { + s->eFlags |= EF_DEAD; + } else { + s->eFlags &= ~EF_DEAD; + } + + if ( ps->externalEvent ) { + s->event = ps->externalEvent; + s->eventParm = ps->externalEventParm; + } else if ( ps->entityEventSequence < ps->eventSequence ) { + int seq; + + if ( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS) { + ps->entityEventSequence = ps->eventSequence - MAX_PS_EVENTS; + } + seq = ps->entityEventSequence & (MAX_PS_EVENTS-1); + s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 ); + s->eventParm = ps->eventParms[ seq ]; + ps->entityEventSequence++; + } + + s->weapon = ps->weapon; + s->groundEntityNum = ps->groundEntityNum; + + s->powerups = 0; + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { + if ( ps->powerups[ i ] ) { + s->powerups |= 1 << i; + } + } + + //PKMOD Ergodic 08/22/00 - set the target's playerstate shafted flag - for cgame + if ( ps->stats[STAT_PKA_ITEMS] & ( 1 << PKA_SHAFTED ) ) { //is client currently being shafted + s->powerups |= 1 << PW_CLGPLAYERHIT; + } + + +//PKMOD - Ergodic 07/10/00 add definition for beartraps attached constant for the +// angles2 co-opt hack. the entitystate_t angles2[beartraps_attached] +// variable will link the beartrap info from the game to the client +// Update - 07/10/00 pack in the variable for viewheight and offset it by 50 units +// so that it will always be positive +//PKMOD - Ergodic 12/19/00 use time2 instead of angles2 +// if ( ps->stats[STAT_BEARTRAPS_ATTACHED] > 0 ) +// s->angles2[BEARTRAPS_ATTACHED] = ps->stats[STAT_BEARTRAPS_ATTACHED] + 100 * (ps->viewheight + 50); +// else +// s->angles2[BEARTRAPS_ATTACHED] = 0; + +//PKMOD - Ergodic 07/07/01 - time2 bits : 3332221100 +// bits 00 [0-1] = # of attached beartraps +// bits 11 [2-3] = encoded viewheight +// bits 222 [4-6] = airfist level +// bits 333 [7-9] = ps->movementDir (0 - 7) + +//PKMOD - Ergodic 12/01/01 - always store the encoded viewheight into co-opted time2 +//PKMOD - Ergodic 07/07/01 - encode viewheight to save space.. +// viewheight has 3 settings found in bg_public.h: +// #define DEFAULT_VIEWHEIGHT 26 [Encoded as 0] +// #define CROUCH_VIEWHEIGHT 12 [Encoded as 1] +// #define DEAD_VIEWHEIGHT -16 [Encoded as 2] + if ( ps->viewheight == DEFAULT_VIEWHEIGHT ) + i = 0; + else if ( ps->viewheight == CROUCH_VIEWHEIGHT ) + i = 1; + else + i = 2; + s->time2 = i << 2; + +//PKMOD - Ergodic 11/13/00 - pack beartraps into time2 + if ( ps->stats[STAT_BEARTRAPS_ATTACHED] > 0 ) { + i = ps->stats[STAT_BEARTRAPS_ATTACHED]; + if ( i > 3 ) + s->time2 |= 3; + else + s->time2 |= i; + } + + +//PKMOD - Ergodic 11/16/00 - pack airfist level into time2 +//PKMOD - Ergodic 07/07/01 - change packing of airfist level from 9 to 4 + if ( s->weapon == WP_AIRFIST ) { + s->time2 |= ps->stats[STAT_PRIOR_AIRFIST_LEVEL] << 4; + } + + //PKMOD - Ergodic 10/18/01 - store pkaitems into modelindex2 + s->modelindex2 = ps->stats[STAT_PKA_ITEMS]; + + //PKMOD - Ergodic 07/07/01 - pack in movementdir + s->time2 |= ps->movementDir << 7; + + s->loopSound = ps->loopSound; + s->generic1 = ps->generic1; + + //PKMOD - Ergodic 12/16/03 - copy over otherEntityNum2 to entitystate. + // I thought this was done, but perhaps not. This is used in + // Chainshaft mechanism to store shaftee + //PKMOD - Ergodic - 12/16/03 Use stat location to store shaftee entity number + s->otherEntityNum2 = ps->stats[STAT_CLG_SHAFTEE_NUM]; + +} diff --git a/quake3/source/code/game/bg_pmove.c b/quake3/source/code/game/bg_pmove.c new file mode 100644 index 0000000..ecebdef --- /dev/null +++ b/quake3/source/code/game/bg_pmove.c @@ -0,0 +1,2354 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// bg_pmove.c -- both games player movement code +// takes a playerstate and a usercmd as input and returns a modifed playerstate + +#include "q_shared.h" +#include "bg_public.h" +#include "bg_local.h" + +pmove_t *pm; +pml_t pml; + +// movement parameters +float pm_stopspeed = 100.0f; +float pm_duckScale = 0.25f; +float pm_swimScale = 0.50f; +float pm_wadeScale = 0.70f; + +float pm_accelerate = 10.0f; +float pm_airaccelerate = 1.0f; +float pm_wateraccelerate = 4.0f; +float pm_flyaccelerate = 8.0f; + +float pm_friction = 6.0f; +float pm_waterfriction = 1.0f; +float pm_flightfriction = 3.0f; +float pm_spectatorfriction = 5.0f; + +int c_pmove = 0; + + +/* +=============== +PM_AddEvent + +=============== +*/ +void PM_AddEvent( int newEvent ) { + BG_AddPredictableEventToPlayerstate( newEvent, 0, pm->ps ); +} + +/* +=============== +PM_AddTouchEnt +=============== +*/ +void PM_AddTouchEnt( int entityNum ) { + int i; + + if ( entityNum == ENTITYNUM_WORLD ) { + return; + } + if ( pm->numtouch == MAXTOUCH ) { + return; + } + + // see if it is already added + for ( i = 0 ; i < pm->numtouch ; i++ ) { + if ( pm->touchents[ i ] == entityNum ) { + return; + } + } + + // add it + pm->touchents[pm->numtouch] = entityNum; + pm->numtouch++; +} + +/* +=================== +PM_StartTorsoAnim +=================== +*/ +static void PM_StartTorsoAnim( int anim ) { + if ( pm->ps->pm_type >= PM_DEAD ) { + return; + } + pm->ps->torsoAnim = ( ( pm->ps->torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) + | anim; +} +static void PM_StartLegsAnim( int anim ) { + if ( pm->ps->pm_type >= PM_DEAD ) { + return; + } + if ( pm->ps->legsTimer > 0 ) { + return; // a high priority animation is running + } + pm->ps->legsAnim = ( ( pm->ps->legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) + | anim; +} + +static void PM_ContinueLegsAnim( int anim ) { + if ( ( pm->ps->legsAnim & ~ANIM_TOGGLEBIT ) == anim ) { + return; + } + if ( pm->ps->legsTimer > 0 ) { + return; // a high priority animation is running + } + PM_StartLegsAnim( anim ); +} + +static void PM_ContinueTorsoAnim( int anim ) { + if ( ( pm->ps->torsoAnim & ~ANIM_TOGGLEBIT ) == anim ) { + return; + } + if ( pm->ps->torsoTimer > 0 ) { + return; // a high priority animation is running + } + PM_StartTorsoAnim( anim ); +} + +static void PM_ForceLegsAnim( int anim ) { + pm->ps->legsTimer = 0; + PM_StartLegsAnim( anim ); +} + + +/* +================== +PM_ClipVelocity + +Slide off of the impacting surface +================== +*/ +void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) { + float backoff; + float change; + int i; + + backoff = DotProduct (in, normal); + + if ( backoff < 0 ) { + backoff *= overbounce; + } else { + backoff /= overbounce; + } + + for ( i=0 ; i<3 ; i++ ) { + change = normal[i]*backoff; + out[i] = in[i] - change; + } +} + + +/* +================== +PM_Friction + +Handles both ground friction and water friction +================== +*/ +static void PM_Friction( void ) { + vec3_t vec; + float *vel; + float speed, newspeed, control; + float drop; + + vel = pm->ps->velocity; + + VectorCopy( vel, vec ); + if ( pml.walking ) { + vec[2] = 0; // ignore slope movement + } + + speed = VectorLength(vec); + if (speed < 1) { + vel[0] = 0; + vel[1] = 0; // allow sinking underwater + // FIXME: still have z friction underwater? + return; + } + + drop = 0; + + // apply ground friction + if ( pm->waterlevel <= 1 ) { + if ( pml.walking && !(pml.groundTrace.surfaceFlags & SURF_SLICK) ) { + // if getting knocked back, no friction + if ( ! (pm->ps->pm_flags & PMF_TIME_KNOCKBACK) ) { + control = speed < pm_stopspeed ? pm_stopspeed : speed; + drop += control*pm_friction*pml.frametime; + } + } + } + + // apply water friction even if just wading + if ( pm->waterlevel ) { + drop += speed*pm_waterfriction*pm->waterlevel*pml.frametime; + } + + // apply flying friction + if ( pm->ps->powerups[PW_FLIGHT]) { + drop += speed*pm_flightfriction*pml.frametime; + } + + if ( pm->ps->pm_type == PM_SPECTATOR) { + drop += speed*pm_spectatorfriction*pml.frametime; + } + + // scale the velocity + newspeed = speed - drop; + if (newspeed < 0) { + newspeed = 0; + } + newspeed /= speed; + + vel[0] = vel[0] * newspeed; + vel[1] = vel[1] * newspeed; + vel[2] = vel[2] * newspeed; +} + + +/* +============== +PM_Accelerate + +Handles user intended acceleration +============== +*/ +static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) { +#if 1 + // q2 style + int i; + float addspeed, accelspeed, currentspeed; + + currentspeed = DotProduct (pm->ps->velocity, wishdir); + addspeed = wishspeed - currentspeed; + if (addspeed <= 0) { + return; + } + accelspeed = accel*pml.frametime*wishspeed; + if (accelspeed > addspeed) { + accelspeed = addspeed; + } + + for (i=0 ; i<3 ; i++) { + pm->ps->velocity[i] += accelspeed*wishdir[i]; + } +#else + // proper way (avoids strafe jump maxspeed bug), but feels bad + vec3_t wishVelocity; + vec3_t pushDir; + float pushLen; + float canPush; + + VectorScale( wishdir, wishspeed, wishVelocity ); + VectorSubtract( wishVelocity, pm->ps->velocity, pushDir ); + pushLen = VectorNormalize( pushDir ); + + canPush = accel*pml.frametime*wishspeed; + if (canPush > pushLen) { + canPush = pushLen; + } + + VectorMA( pm->ps->velocity, canPush, pushDir, pm->ps->velocity ); +#endif +} + + + +/* +============ +PM_CmdScale + +Returns the scale factor to apply to cmd movements +This allows the clients to use axial -127 to 127 values for all directions +without getting a sqrt(2) distortion in speed. +============ +*/ +static float PM_CmdScale( usercmd_t *cmd ) { + int max; + float total; + float scale; + + max = abs( cmd->forwardmove ); + if ( abs( cmd->rightmove ) > max ) { + max = abs( cmd->rightmove ); + } + if ( abs( cmd->upmove ) > max ) { + max = abs( cmd->upmove ); + } + if ( !max ) { + return 0; + } + + total = sqrt( cmd->forwardmove * cmd->forwardmove + + cmd->rightmove * cmd->rightmove + cmd->upmove * cmd->upmove ); + scale = (float)pm->ps->speed * max / ( 127.0 * total ); + + return scale; +} + + +/* +================ +PM_SetMovementDir + +Determine the rotation of the legs reletive +to the facing dir +================ +*/ +static void PM_SetMovementDir( void ) { + if ( pm->cmd.forwardmove || pm->cmd.rightmove ) { + if ( pm->cmd.rightmove == 0 && pm->cmd.forwardmove > 0 ) { + pm->ps->movementDir = 0; + } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove > 0 ) { + pm->ps->movementDir = 1; + } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove == 0 ) { + pm->ps->movementDir = 2; + } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove < 0 ) { + pm->ps->movementDir = 3; + } else if ( pm->cmd.rightmove == 0 && pm->cmd.forwardmove < 0 ) { + pm->ps->movementDir = 4; + } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove < 0 ) { + pm->ps->movementDir = 5; + } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove == 0 ) { + pm->ps->movementDir = 6; + } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove > 0 ) { + pm->ps->movementDir = 7; + } + } else { + // if they aren't actively going directly sideways, + // change the animation to the diagonal so they + // don't stop too crooked + if ( pm->ps->movementDir == 2 ) { + pm->ps->movementDir = 1; + } else if ( pm->ps->movementDir == 6 ) { + pm->ps->movementDir = 7; + } + } +} + + +/* +============= +PM_CheckJump +============= +*/ +static qboolean PM_CheckJump( void ) { + if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + return qfalse; // don't allow jump until all buttons are up + } + + if ( pm->cmd.upmove < 10 ) { + // not holding jump + return qfalse; + } + + // must wait for jump to be released + if ( pm->ps->pm_flags & PMF_JUMP_HELD ) { + // clear upmove so cmdscale doesn't lower running speed + pm->cmd.upmove = 0; + return qfalse; + } + + pml.groundPlane = qfalse; // jumping away + pml.walking = qfalse; + pm->ps->pm_flags |= PMF_JUMP_HELD; + + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pm->ps->velocity[2] = JUMP_VELOCITY; + PM_AddEvent( EV_JUMP ); + + if ( pm->cmd.forwardmove >= 0 ) { + PM_ForceLegsAnim( LEGS_JUMP ); + pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; + } else { + PM_ForceLegsAnim( LEGS_JUMPB ); + pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; + } + + return qtrue; +} + +/* +============= +PM_CheckWaterJump +============= +*/ +static qboolean PM_CheckWaterJump( void ) { + vec3_t spot; + int cont; + vec3_t flatforward; + + if (pm->ps->pm_time) { + return qfalse; + } + + // check for water jump + if ( pm->waterlevel != 2 ) { + return qfalse; + } + + flatforward[0] = pml.forward[0]; + flatforward[1] = pml.forward[1]; + flatforward[2] = 0; + VectorNormalize (flatforward); + + VectorMA (pm->ps->origin, 30, flatforward, spot); + spot[2] += 4; + cont = pm->pointcontents (spot, pm->ps->clientNum ); + if ( !(cont & CONTENTS_SOLID) ) { + return qfalse; + } + + spot[2] += 16; + cont = pm->pointcontents (spot, pm->ps->clientNum ); + if ( cont ) { + return qfalse; + } + + // jump out of water + VectorScale (pml.forward, 200, pm->ps->velocity); + pm->ps->velocity[2] = 350; + + pm->ps->pm_flags |= PMF_TIME_WATERJUMP; + pm->ps->pm_time = 2000; + + return qtrue; +} + +//============================================================================ + + +/* +=================== +PM_WaterJumpMove + +Flying out of the water +=================== +*/ +static void PM_WaterJumpMove( void ) { + // waterjump has no control, but falls + + PM_StepSlideMove( qtrue ); + + pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; + if (pm->ps->velocity[2] < 0) { + // cancel as soon as we are falling down again + pm->ps->pm_flags &= ~PMF_ALL_TIMES; + pm->ps->pm_time = 0; + } +} + +/* +=================== +PM_WaterMove + +=================== +*/ +static void PM_WaterMove( void ) { + int i; + vec3_t wishvel; + float wishspeed; + vec3_t wishdir; + float scale; + float vel; + + if ( PM_CheckWaterJump() ) { + PM_WaterJumpMove(); + return; + } +#if 0 + // jump = head for surface + if ( pm->cmd.upmove >= 10 ) { + if (pm->ps->velocity[2] > -300) { + if ( pm->watertype == CONTENTS_WATER ) { + pm->ps->velocity[2] = 100; + } else if (pm->watertype == CONTENTS_SLIME) { + pm->ps->velocity[2] = 80; + } else { + pm->ps->velocity[2] = 50; + } + } + } +#endif + PM_Friction (); + + scale = PM_CmdScale( &pm->cmd ); + // + // user intentions + // + if ( !scale ) { + wishvel[0] = 0; + wishvel[1] = 0; + wishvel[2] = -60; // sink towards bottom + } else { + for (i=0 ; i<3 ; i++) + wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; + + wishvel[2] += scale * pm->cmd.upmove; + } + + VectorCopy (wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + + if ( wishspeed > pm->ps->speed * pm_swimScale ) { + wishspeed = pm->ps->speed * pm_swimScale; + } + + PM_Accelerate (wishdir, wishspeed, pm_wateraccelerate); + + // make sure we can go up slopes easily under water + if ( pml.groundPlane && DotProduct( pm->ps->velocity, pml.groundTrace.plane.normal ) < 0 ) { + vel = VectorLength(pm->ps->velocity); + // slide along the ground plane + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP ); + + VectorNormalize(pm->ps->velocity); + VectorScale(pm->ps->velocity, vel, pm->ps->velocity); + } + + PM_SlideMove( qfalse ); +} + +#ifdef MISSIONPACK +/* +=================== +PM_InvulnerabilityMove + +Only with the invulnerability powerup +=================== +*/ +static void PM_InvulnerabilityMove( void ) { + pm->cmd.forwardmove = 0; + pm->cmd.rightmove = 0; + pm->cmd.upmove = 0; + VectorClear(pm->ps->velocity); +} +#endif + +/* +=================== +PM_FlyMove + +Only with the flight powerup +=================== +*/ +static void PM_FlyMove( void ) { + int i; + vec3_t wishvel; + float wishspeed; + vec3_t wishdir; + float scale; + + // normal slowdown + PM_Friction (); + + scale = PM_CmdScale( &pm->cmd ); + // + // user intentions + // + if ( !scale ) { + wishvel[0] = 0; + wishvel[1] = 0; + wishvel[2] = 0; + } else { + for (i=0 ; i<3 ; i++) { + wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; + } + + wishvel[2] += scale * pm->cmd.upmove; + } + + VectorCopy (wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + + PM_Accelerate (wishdir, wishspeed, pm_flyaccelerate); + + PM_StepSlideMove( qfalse ); +} + + +/* +=================== +PM_AirMove + +=================== +*/ +static void PM_AirMove( void ) { + int i; + vec3_t wishvel; + float fmove, smove; + vec3_t wishdir; + float wishspeed; + float scale; + usercmd_t cmd; + + PM_Friction(); + + fmove = pm->cmd.forwardmove; + smove = pm->cmd.rightmove; + + cmd = pm->cmd; + scale = PM_CmdScale( &cmd ); + + // set the movementDir so clients can rotate the legs for strafing + PM_SetMovementDir(); + + // project moves down to flat plane + pml.forward[2] = 0; + pml.right[2] = 0; + VectorNormalize (pml.forward); + VectorNormalize (pml.right); + + for ( i = 0 ; i < 2 ; i++ ) { + wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + } + wishvel[2] = 0; + + VectorCopy (wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + wishspeed *= scale; + + // not on ground, so little effect on velocity + PM_Accelerate (wishdir, wishspeed, pm_airaccelerate); + + // we may have a ground plane that is very steep, even + // though we don't have a groundentity + // slide along the steep plane + if ( pml.groundPlane ) { + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP ); + } + +#if 0 + //ZOID: If we are on the grapple, try stair-stepping + //this allows a player to use the grapple to pull himself + //over a ledge + if (pm->ps->pm_flags & PMF_GRAPPLE_PULL) + PM_StepSlideMove ( qtrue ); + else + PM_SlideMove ( qtrue ); +#endif + + PM_StepSlideMove ( qtrue ); +} + +//PKMOD - Ergodic 07/04/01 - Create separate dragon tongue speeds +#define DRAGON_TONGUE_PLAYER_PULL_SPEED 800 + +/* +=================== +PM_GrappleMove + +=================== +*/ +static void PM_GrappleMove( void ) { + vec3_t vel, v; + float vlen; + + VectorScale(pml.forward, -16, v); + VectorAdd(pm->ps->grapplePoint, v, v); + VectorSubtract(v, pm->ps->origin, vel); + vlen = VectorLength(vel); + VectorNormalize( vel ); + + if (vlen <= 100) + VectorScale(vel, 10 * vlen, vel); + else + VectorScale(vel, DRAGON_TONGUE_PLAYER_PULL_SPEED, vel); + + VectorCopy(vel, pm->ps->velocity); + + pml.groundPlane = qfalse; +} + +/* +=================== +PM_WalkMove + +=================== +*/ +static void PM_WalkMove( void ) { + int i; + vec3_t wishvel; + float fmove, smove; + vec3_t wishdir; + float wishspeed; + float scale; + usercmd_t cmd; + float accelerate; + float vel; + + if ( pm->waterlevel > 2 && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) { + // begin swimming + PM_WaterMove(); + return; + } + + + if ( PM_CheckJump () ) { + // jumped away + if ( pm->waterlevel > 1 ) { + PM_WaterMove(); + } else { + PM_AirMove(); + } + return; + } + + PM_Friction (); + + fmove = pm->cmd.forwardmove; + smove = pm->cmd.rightmove; + + cmd = pm->cmd; + scale = PM_CmdScale( &cmd ); + + // set the movementDir so clients can rotate the legs for strafing + PM_SetMovementDir(); + + // project moves down to flat plane + pml.forward[2] = 0; + pml.right[2] = 0; + + // project the forward and right directions onto the ground plane + PM_ClipVelocity (pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP ); + PM_ClipVelocity (pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP ); + // + VectorNormalize (pml.forward); + VectorNormalize (pml.right); + + for ( i = 0 ; i < 3 ; i++ ) { + wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + } + // when going up or down slopes the wish velocity should Not be zero +// wishvel[2] = 0; + + VectorCopy (wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + wishspeed *= scale; + + // clamp the speed lower if ducking + if ( pm->ps->pm_flags & PMF_DUCKED ) { + if ( wishspeed > pm->ps->speed * pm_duckScale ) { + wishspeed = pm->ps->speed * pm_duckScale; + } + } + + // clamp the speed lower if wading or walking on the bottom + if ( pm->waterlevel ) { + float waterScale; + + waterScale = pm->waterlevel / 3.0; + waterScale = 1.0 - ( 1.0 - pm_swimScale ) * waterScale; + if ( wishspeed > pm->ps->speed * waterScale ) { + wishspeed = pm->ps->speed * waterScale; + } + } + + // when a player gets hit, they temporarily lose + // full control, which allows them to be moved a bit + if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) { + accelerate = pm_airaccelerate; + } else { + accelerate = pm_accelerate; + } + + PM_Accelerate (wishdir, wishspeed, accelerate); + + //Com_Printf("velocity = %1.1f %1.1f %1.1f\n", pm->ps->velocity[0], pm->ps->velocity[1], pm->ps->velocity[2]); + //Com_Printf("velocity1 = %1.1f\n", VectorLength(pm->ps->velocity)); + + if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) { + pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; + } else { + // don't reset the z velocity for slopes +// pm->ps->velocity[2] = 0; + } + + vel = VectorLength(pm->ps->velocity); + + // slide along the ground plane + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP ); + + // don't decrease velocity when going up or down a slope + VectorNormalize(pm->ps->velocity); + VectorScale(pm->ps->velocity, vel, pm->ps->velocity); + + // don't do anything if standing still + if (!pm->ps->velocity[0] && !pm->ps->velocity[1]) { + return; + } + + PM_StepSlideMove( qfalse ); + + //Com_Printf("velocity2 = %1.1f\n", VectorLength(pm->ps->velocity)); + +} + + +/* +============== +PM_DeadMove +============== +*/ +static void PM_DeadMove( void ) { + float forward; + + if ( !pml.walking ) { + return; + } + + // extra friction + + forward = VectorLength (pm->ps->velocity); + forward -= 20; + if ( forward <= 0 ) { + VectorClear (pm->ps->velocity); + } else { + VectorNormalize (pm->ps->velocity); + VectorScale (pm->ps->velocity, forward, pm->ps->velocity); + } +} + + +/* +=============== +PM_NoclipMove +=============== +*/ +static void PM_NoclipMove( void ) { + float speed, drop, friction, control, newspeed; + int i; + vec3_t wishvel; + float fmove, smove; + vec3_t wishdir; + float wishspeed; + float scale; + + pm->ps->viewheight = DEFAULT_VIEWHEIGHT; + + // friction + + speed = VectorLength (pm->ps->velocity); + if (speed < 1) + { + VectorCopy (vec3_origin, pm->ps->velocity); + } + else + { + drop = 0; + + friction = pm_friction*1.5; // extra friction + control = speed < pm_stopspeed ? pm_stopspeed : speed; + drop += control*friction*pml.frametime; + + // scale the velocity + newspeed = speed - drop; + if (newspeed < 0) + newspeed = 0; + newspeed /= speed; + + VectorScale (pm->ps->velocity, newspeed, pm->ps->velocity); + } + + // accelerate + scale = PM_CmdScale( &pm->cmd ); + + fmove = pm->cmd.forwardmove; + smove = pm->cmd.rightmove; + + for (i=0 ; i<3 ; i++) + wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; + wishvel[2] += pm->cmd.upmove; + + VectorCopy (wishvel, wishdir); + wishspeed = VectorNormalize(wishdir); + wishspeed *= scale; + + PM_Accelerate( wishdir, wishspeed, pm_accelerate ); + + // move + VectorMA (pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin); +} + +//============================================================================ + +/* +================ +PM_FootstepForSurface + +Returns an event number apropriate for the groundsurface +================ +*/ +static int PM_FootstepForSurface( void ) { + if ( pml.groundTrace.surfaceFlags & SURF_NOSTEPS ) { + return 0; + } + if ( pml.groundTrace.surfaceFlags & SURF_METALSTEPS ) { + return EV_FOOTSTEP_METAL; + } + return EV_FOOTSTEP; +} + + +/* +================= +PM_CrashLand + +Check for hard landings that generate sound events +================= +*/ +static void PM_CrashLand( void ) { + float delta; + float dist; + float vel, acc; + float t; + float a, b, c, den; + + // decide which landing animation to use + if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP ) { + PM_ForceLegsAnim( LEGS_LANDB ); + } else { + PM_ForceLegsAnim( LEGS_LAND ); + } + + pm->ps->legsTimer = TIMER_LAND; + + // calculate the exact velocity on landing + dist = pm->ps->origin[2] - pml.previous_origin[2]; + vel = pml.previous_velocity[2]; + acc = -pm->ps->gravity; + + a = acc / 2; + b = vel; + c = -dist; + + den = b * b - 4 * a * c; + if ( den < 0 ) { + return; + } + t = (-b - sqrt( den ) ) / ( 2 * a ); + + delta = vel + t * acc; + delta = delta*delta * 0.0001; + + // ducking while falling doubles damage + if ( pm->ps->pm_flags & PMF_DUCKED ) { + delta *= 2; + } + + // never take falling damage if completely underwater + if ( pm->waterlevel == 3 ) { + return; + } + + // reduce falling damage if there is standing water + if ( pm->waterlevel == 2 ) { + delta *= 0.25; + } + if ( pm->waterlevel == 1 ) { + delta *= 0.5; + } + + if ( delta < 1 ) { + return; + } + + //PKMOD - Ergodic 12/29/00 - debug surface flags +// Com_Printf("PM_CrashLand - surfaceFlags>%d<\n", pml.groundTrace.surfaceFlags ); + + // create a local entity event to play the sound + + // SURF_NODAMAGE is used for bounce pads where you don't ever + // want to take damage or play a crunch sound + if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) { + if ( delta > 60 ) { + PM_AddEvent( EV_FALL_FAR ); + } else if ( delta > 40 ) { + // this is a pain grunt, so don't play it if dead + if ( pm->ps->stats[STAT_HEALTH] > 0 ) { + PM_AddEvent( EV_FALL_MEDIUM ); + } + } else if ( delta > 7 ) { + PM_AddEvent( EV_FALL_SHORT ); + } else { + PM_AddEvent( PM_FootstepForSurface() ); + } + } + + // start footstep cycle over + pm->ps->bobCycle = 0; +} + +/* +============= +PM_CheckStuck +============= +*/ +/* +void PM_CheckStuck(void) { + trace_t trace; + + pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask); + if (trace.allsolid) { + //int shit = qtrue; + } +} +*/ + +/* +============= +PM_CorrectAllSolid +============= +*/ +static int PM_CorrectAllSolid( trace_t *trace ) { + int i, j, k; + vec3_t point; + + if ( pm->debugLevel ) { + Com_Printf("%i:allsolid\n", c_pmove); + } + + // jitter around + for (i = -1; i <= 1; i++) { + for (j = -1; j <= 1; j++) { + for (k = -1; k <= 1; k++) { + VectorCopy(pm->ps->origin, point); + point[0] += (float) i; + point[1] += (float) j; + point[2] += (float) k; + pm->trace (trace, point, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); + if ( !trace->allsolid ) { + point[0] = pm->ps->origin[0]; + point[1] = pm->ps->origin[1]; + point[2] = pm->ps->origin[2] - 0.25; + + pm->trace (trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); + pml.groundTrace = *trace; + return qtrue; + } + } + } + } + + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qfalse; + pml.walking = qfalse; + + return qfalse; +} + + +/* +============= +PM_GroundTraceMissed + +The ground trace didn't hit a surface, so we are in freefall +============= +*/ +static void PM_GroundTraceMissed( void ) { + trace_t trace; + vec3_t point; + + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) { + // we just transitioned into freefall + if ( pm->debugLevel ) { + Com_Printf("%i:lift\n", c_pmove); + } + + // if they aren't in a jumping animation and the ground is a ways away, force into it + // if we didn't do the trace, the player would be backflipping down staircases + VectorCopy( pm->ps->origin, point ); + point[2] -= 64; + + pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); + if ( trace.fraction == 1.0 ) { + if ( pm->cmd.forwardmove >= 0 ) { + PM_ForceLegsAnim( LEGS_JUMP ); + pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; + } else { + PM_ForceLegsAnim( LEGS_JUMPB ); + pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; + } + } + } + + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qfalse; + pml.walking = qfalse; +} + + +/* +============= +PM_GroundTrace +============= +*/ +static void PM_GroundTrace( void ) { + vec3_t point; + trace_t trace; + + point[0] = pm->ps->origin[0]; + point[1] = pm->ps->origin[1]; + point[2] = pm->ps->origin[2] - 0.25; + + pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); + pml.groundTrace = trace; + + // do something corrective if the trace starts in a solid... + if ( trace.allsolid ) { + if ( !PM_CorrectAllSolid(&trace) ) + return; + } + + // if the trace didn't hit anything, we are in free fall + if ( trace.fraction == 1.0 ) { + PM_GroundTraceMissed(); + pml.groundPlane = qfalse; + pml.walking = qfalse; + return; + } + + // check if getting thrown off the ground + if ( pm->ps->velocity[2] > 0 && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 ) { + if ( pm->debugLevel ) { + Com_Printf("%i:kickoff\n", c_pmove); + } + // go into jump animation + if ( pm->cmd.forwardmove >= 0 ) { + PM_ForceLegsAnim( LEGS_JUMP ); + pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; + } else { + PM_ForceLegsAnim( LEGS_JUMPB ); + pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; + } + + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qfalse; + pml.walking = qfalse; + return; + } + + // slopes that are too steep will not be considered onground + if ( trace.plane.normal[2] < MIN_WALK_NORMAL ) { + if ( pm->debugLevel ) { + Com_Printf("%i:steep\n", c_pmove); + } + // FIXME: if they can't slide down the slope, let them + // walk (sharp crevices) + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qtrue; + pml.walking = qfalse; + return; + } + + pml.groundPlane = qtrue; + pml.walking = qtrue; + + // hitting solid ground will end a waterjump + if (pm->ps->pm_flags & PMF_TIME_WATERJUMP) + { + pm->ps->pm_flags &= ~(PMF_TIME_WATERJUMP | PMF_TIME_LAND); + pm->ps->pm_time = 0; + } + + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) { + // just hit the ground + if ( pm->debugLevel ) { + Com_Printf("%i:Land\n", c_pmove); + } + + PM_CrashLand(); + + // don't do landing time if we were just going down a slope + if ( pml.previous_velocity[2] < -200 ) { + // don't allow another jump for a little while + pm->ps->pm_flags |= PMF_TIME_LAND; + pm->ps->pm_time = 250; + } + } + + pm->ps->groundEntityNum = trace.entityNum; + + // don't reset the z velocity for slopes +// pm->ps->velocity[2] = 0; + + PM_AddTouchEnt( trace.entityNum ); +} + + +/* +============= +PM_SetWaterLevel FIXME: avoid this twice? certainly if not moving +============= +*/ +static void PM_SetWaterLevel( void ) { + vec3_t point; + int cont; + int sample1; + int sample2; + + // + // get waterlevel, accounting for ducking + // + pm->waterlevel = 0; + pm->watertype = 0; + + point[0] = pm->ps->origin[0]; + point[1] = pm->ps->origin[1]; + point[2] = pm->ps->origin[2] + MINS_Z + 1; + cont = pm->pointcontents( point, pm->ps->clientNum ); + + if ( cont & MASK_WATER ) { + sample2 = pm->ps->viewheight - MINS_Z; + sample1 = sample2 / 2; + + pm->watertype = cont; + pm->waterlevel = 1; + point[2] = pm->ps->origin[2] + MINS_Z + sample1; + cont = pm->pointcontents (point, pm->ps->clientNum ); + if ( cont & MASK_WATER ) { + pm->waterlevel = 2; + point[2] = pm->ps->origin[2] + MINS_Z + sample2; + cont = pm->pointcontents (point, pm->ps->clientNum ); + if ( cont & MASK_WATER ){ + pm->waterlevel = 3; + } + } + } + +} + +/* +============== +PM_CheckDuck + +Sets mins, maxs, and pm->ps->viewheight +============== +*/ +static void PM_CheckDuck (void) +{ + trace_t trace; + + if ( pm->ps->powerups[PW_INVULNERABILITY] ) { + if ( pm->ps->pm_flags & PMF_INVULEXPAND ) { + // invulnerability sphere has a 42 units radius + VectorSet( pm->mins, -42, -42, -42 ); + VectorSet( pm->maxs, 42, 42, 42 ); + } + else { + VectorSet( pm->mins, -15, -15, MINS_Z ); + VectorSet( pm->maxs, 15, 15, 16 ); + } + pm->ps->pm_flags |= PMF_DUCKED; + pm->ps->viewheight = CROUCH_VIEWHEIGHT; + return; + } + pm->ps->pm_flags &= ~PMF_INVULEXPAND; + + pm->mins[0] = -15; + pm->mins[1] = -15; + + pm->maxs[0] = 15; + pm->maxs[1] = 15; + + pm->mins[2] = MINS_Z; + + if (pm->ps->pm_type == PM_DEAD) + { + pm->maxs[2] = -8; + pm->ps->viewheight = DEAD_VIEWHEIGHT; + return; + } + + if (pm->cmd.upmove < 0) + { // duck + pm->ps->pm_flags |= PMF_DUCKED; + } + else + { // stand up if possible + if (pm->ps->pm_flags & PMF_DUCKED) + { + // try to stand up + pm->maxs[2] = 32; + pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask ); + if (!trace.allsolid) + pm->ps->pm_flags &= ~PMF_DUCKED; + } + } + + if (pm->ps->pm_flags & PMF_DUCKED) + { + pm->maxs[2] = 16; + pm->ps->viewheight = CROUCH_VIEWHEIGHT; + } + else + { + pm->maxs[2] = 32; + pm->ps->viewheight = DEFAULT_VIEWHEIGHT; + } +} + + + +//=================================================================== + + +/* +=============== +PM_Footsteps +=============== +*/ +static void PM_Footsteps( void ) { + float bobmove; + int old; + qboolean footstep; + + // + // calculate speed and cycle to be used for + // all cyclic walking effects + // + pm->xyspeed = sqrt( pm->ps->velocity[0] * pm->ps->velocity[0] + + pm->ps->velocity[1] * pm->ps->velocity[1] ); + + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) { + + if ( pm->ps->powerups[PW_INVULNERABILITY] ) { + PM_ContinueLegsAnim( LEGS_IDLECR ); + } + // airborne leaves position in cycle intact, but doesn't advance + if ( pm->waterlevel > 1 ) { + PM_ContinueLegsAnim( LEGS_SWIM ); + } + return; + } + + // if not trying to move + if ( !pm->cmd.forwardmove && !pm->cmd.rightmove ) { + if ( pm->xyspeed < 5 ) { + pm->ps->bobCycle = 0; // start at beginning of cycle again + if ( pm->ps->pm_flags & PMF_DUCKED ) { + PM_ContinueLegsAnim( LEGS_IDLECR ); + } else { + PM_ContinueLegsAnim( LEGS_IDLE ); + } + } + return; + } + + + footstep = qfalse; + + if ( pm->ps->pm_flags & PMF_DUCKED ) { + bobmove = 0.5; // ducked characters bob much faster + if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + PM_ContinueLegsAnim( LEGS_BACKCR ); + } + else { + PM_ContinueLegsAnim( LEGS_WALKCR ); + } + // ducked characters never play footsteps + /* + } else if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) { + bobmove = 0.4; // faster speeds bob faster + footstep = qtrue; + } else { + bobmove = 0.3; + } + PM_ContinueLegsAnim( LEGS_BACK ); + */ + } else { + if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) { + bobmove = 0.4f; // faster speeds bob faster + if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + PM_ContinueLegsAnim( LEGS_BACK ); + } + else { + PM_ContinueLegsAnim( LEGS_RUN ); + } + footstep = qtrue; + } else { + bobmove = 0.3f; // walking bobs slow + if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + PM_ContinueLegsAnim( LEGS_BACKWALK ); + } + else { + PM_ContinueLegsAnim( LEGS_WALK ); + } + } + } + + // check for footstep / splash sounds + old = pm->ps->bobCycle; + pm->ps->bobCycle = (int)( old + bobmove * pml.msec ) & 255; + + // if we just crossed a cycle boundary, play an apropriate footstep event + if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) { + if ( pm->waterlevel == 0 ) { + // on ground will only play sounds if running + if ( footstep && !pm->noFootsteps ) { + PM_AddEvent( PM_FootstepForSurface() ); + } + } else if ( pm->waterlevel == 1 ) { + // splashing + PM_AddEvent( EV_FOOTSPLASH ); + } else if ( pm->waterlevel == 2 ) { + // wading / swimming at surface + PM_AddEvent( EV_SWIM ); + } else if ( pm->waterlevel == 3 ) { + // no sound when completely underwater + + } + } +} + +/* +============== +PM_WaterEvents + +Generate sound events for entering and leaving water +============== +*/ +static void PM_WaterEvents( void ) { // FIXME? + // + // if just entered a water volume, play a sound + // + if (!pml.previous_waterlevel && pm->waterlevel) { + PM_AddEvent( EV_WATER_TOUCH ); + } + + // + // if just completely exited a water volume, play a sound + // + if (pml.previous_waterlevel && !pm->waterlevel) { + PM_AddEvent( EV_WATER_LEAVE ); + } + + // + // check for head just going under water + // + if (pml.previous_waterlevel != 3 && pm->waterlevel == 3) { + PM_AddEvent( EV_WATER_UNDER ); + } + + // + // check for head just coming out of water + // + if (pml.previous_waterlevel == 3 && pm->waterlevel != 3) { + PM_AddEvent( EV_WATER_CLEAR ); + } +} + + +/* +=============== +PM_BeginWeaponChange +=============== +*/ +static void PM_BeginWeaponChange( int weapon ) { + if ( weapon <= WP_NONE || weapon >= WP_NUM_WEAPONS ) { + return; + } + + if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { + return; + } + + if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + return; + } + + //PKMOD - Ergodic 04/04/01, save the current weapon +// if ( pm->ps->stats[ STAT_LAST_WEAPON ] != weapon ) + pm->ps->stats[ STAT_LAST_WEAPON ] = pm->ps->weapon; + + //PKMOD - Ergodic 08/23/01 - debug infinite ammo (inactive) +// Com_Printf( "PM_BeginWeaponChange - current>%d<, new>%d<, last>%d<, BT ammo>%d<, generic1>%d<\n", pm->ps->weapon, weapon, pm->ps->stats[ STAT_LAST_WEAPON ], pm->ps->ammo[ WP_BEARTRAP ], pm->ps->generic1 ); + + //PKMOD - Ergodic 03/14/01 - Dragon Deploy:if changing a weapon then remove alternate firing mechanism + if ( pm->ps->generic1 != 0 ) { + int hold_deploy_weapon; + + hold_deploy_weapon = pm->ps->generic1 & 15; + //PKMOD - Ergodic 08/23/01 - check for zero ammo + // if ammo is less then 1 then remove alternate fire + //PKMOD - Ergodic 12/14/01 - don't check deployed gauntlet for out of ammo state + //PKMOD - Ergodic 02/21/04 - don't check for RED or BLUE flags for out of ammo state + if ( ( hold_deploy_weapon != WP_GAUNTLET ) && ( hold_deploy_weapon != PW_REDFLAG ) && ( hold_deploy_weapon != PW_BLUEFLAG ) ) { + + if ( pm->ps->ammo[ hold_deploy_weapon ] < 1 ) + //turn off the alternate fire + pm->ps->generic1 = 0; + } + else { + if ( pm->ps->generic1 & 64 ) //mask all bits off except the toggle bit + //here if toggle bit is set + //turn off the alternate fire + pm->ps->generic1 = 0; + else + //set the toggle bit + pm->ps->generic1 |= 64; + } + } + + PM_AddEvent( EV_CHANGE_WEAPON ); + pm->ps->weaponstate = WEAPON_DROPPING; + //PKMOD changed from 200 to 50 + pm->ps->weaponTime += 50; + //PKMOD + PM_StartTorsoAnim( TORSO_DROP ); +} + + +/* +=============== +PM_FinishWeaponChange +=============== +*/ +static void PM_FinishWeaponChange( void ) { + int weapon; + + weapon = pm->cmd.weapon; + if ( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) { + weapon = WP_NONE; + } + + if ( !( pm->ps->stats[STAT_WEAPONS] & ( 1 << weapon ) ) ) { + weapon = WP_NONE; + } + + pm->ps->weapon = weapon; + pm->ps->weaponstate = WEAPON_RAISING; + //PKMOD changed from 250 to 50 + pm->ps->weaponTime += 50; + //PKMOD + PM_StartTorsoAnim( TORSO_RAISE ); + + //PKMOD - Ergodic 08/23/01 - debug infinite ammo (inactive) +// Com_Printf( "PM_FinishWeaponChange - current>%d<, new>%d<, last>%d<, BT ammo>%d<, generic1>%d<\n", pm->ps->weapon, weapon, pm->ps->stats[ STAT_LAST_WEAPON ], pm->ps->ammo[ WP_BEARTRAP ], pm->ps->generic1 ); + +} + + +/* +============== +PM_TorsoAnimation + +============== +*/ +static void PM_TorsoAnimation( void ) { + if ( pm->ps->weaponstate == WEAPON_READY ) { + //PKMOD - Ergodic 09/05/00 use alternate stance for the dragon + if ( ( pm->ps->weapon == WP_GAUNTLET ) || ( pm->ps->weapon == WP_GRAPPLING_HOOK ) ) { + PM_ContinueTorsoAnim( TORSO_STAND2 ); + } else { + PM_ContinueTorsoAnim( TORSO_STAND ); + } + return; + } +} + +/* +============== +PM_Weapon + +Generates weapon events and modifes the weapon counter +============== +*/ +static void PM_Weapon( void ) { + int addTime; +//PKMOD Erodgic 06/27/00 add hold_weapon as temporary variable + int hold_weapon; + + //PKMOD - Ergodic 05/11/01 - allow holding of more than 1 type of + // holdable but only 1 of each kind + // add variables for holdable cycling + int i; + int holdable_index; + + + // don't allow attack until all buttons are up + if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + return; + } + + // ignore if spectator + if ( pm->ps->persistant[PERS_TEAM] == TEAM_SPECTATOR ) { + return; + } + + // check for dead player + if ( pm->ps->stats[STAT_HEALTH] <= 0 ) { + pm->ps->weapon = WP_NONE; + return; + } + + // check for item using + if ( pm->cmd.buttons & BUTTON_USE_HOLDABLE ) { + if ( ! ( pm->ps->pm_flags & PMF_USE_ITEM_HELD ) ) { + //PKMOD - Ergodic 05/11/01 - allow holding of more than 1 type of + // holdable but only 1 of each kind + //PKMOD - Ergodic 05/11/01 - modify logic +// if ( bg_itemlist[pm->ps->stats[STAT_HOLDABLE_ITEM]].giTag == HI_MEDKIT + if ( pm->ps->stats[STAT_ACTIVE_HOLDABLE] == HI_MEDKIT + && pm->ps->stats[STAT_HEALTH] >= (pm->ps->stats[STAT_MAX_HEALTH] + 25) ) { + // don't use medkit if at max health + } else { + //PKMOD - Ergodic 02/26/04 - move this confirmation flag elsewhere to fix multiple Private Bots + //pm->ps->pm_flags |= PMF_USE_ITEM_HELD; + + //PKMOD - Ergodic 05/11/01 - modify logic +// PM_AddEvent( EV_USE_ITEM0 + bg_itemlist[pm->ps->stats[STAT_HOLDABLE_ITEM]].giTag ); + //PKMOD - Ergodic 12/07/01 - if active item is a bot piece then check for all parts + if ( ( pm->ps->stats[STAT_ACTIVE_HOLDABLE] >= HI_BOTLEGS ) && ( pm->ps->stats[STAT_ACTIVE_HOLDABLE] <= HI_BOTHEAD ) ) { + //check for all bot pieces + if ( ( pm->ps->stats[STAT_HOLDABLE_ITEM] & ( 7 << HI_BOTLEGS ) ) != ( 7 << HI_BOTLEGS ) ) { + //PKMOD - Ergodic 01/07/02 - send message to client if not all Private Bot parts are held + PM_AddEvent( EV_INCOMPLETE_PRIVATEBOT ); + return; //if we don't have all the pieces + } + //PKMOD - Ergodic 03/18/02 - check if room for another Private Bot + if ( active_private_bots < MAX_PRIVATE_BOTS ) { + //set the Private Bot event to be handled in g_active + PM_AddEvent( EV_USE_ITEM0 + HI_BOTHEAD ); + pm->ps->stats[STAT_HOLDABLE_ITEM] &= ~( 7 << HI_BOTLEGS ); //remove all Private Bot items + //PKMOD - Ergodic 02/27/04 - do not increment active Private Bot count here + // move increment to g_active + //active_private_bots++; + //PKMOD - Ergodic 02/26/04 - debug Private Bot availability message (inactive) + //Com_Printf("PM_Weapon LT - active_private_bots>%d<, MAX_PRIVATE_BOTS>%d<\n", active_private_bots, MAX_PRIVATE_BOTS ); + + } + else { + //PKMOD - Ergodic 02/26/04 - debug Private Bot availability message (inactive) + //Com_Printf("PM_Weapon GE - active_private_bots>%d<, MAX_PRIVATE_BOTS>%d<\n", active_private_bots, MAX_PRIVATE_BOTS ); + //PKMOD - Ergodic 03/18/02 - send message to client that no more Private Bots are available + PM_AddEvent( EV_NOAVAILABLE_PRIVATEBOTS ); + return; //02/26/04 - exit if at maximum private bots + } + } + else { + //not a bot holdable + PM_AddEvent( EV_USE_ITEM0 + pm->ps->stats[STAT_ACTIVE_HOLDABLE] ); + //PKMOD - Ergodic 05/11/01 - remove the used holdable item +// pm->ps->stats[STAT_HOLDABLE_ITEM] = 0; + pm->ps->stats[STAT_HOLDABLE_ITEM] &= ~(1 << pm->ps->stats[STAT_ACTIVE_HOLDABLE]); + + //PKMOD - Ergodic 02/26/04 - debug Private Bot availability message (inactive) + //Com_Printf("PM_Weapon GE - Non private_bot holdable>%d<, MAX_PRIVATE_BOTS>%d<\n", pm->ps->stats[STAT_ACTIVE_HOLDABLE] ); + } + + //PKMOD - Ergodic 02/26/04 - set confirmation flag here to fix multiple Private Bots message + pm->ps->pm_flags |= PMF_USE_ITEM_HELD; + + //reset the active holdable + if ( pm->ps->stats[STAT_HOLDABLE_ITEM] ) { //do we have any more holdables + holdable_index = pm->ps->stats[STAT_ACTIVE_HOLDABLE]; + for (i = 0; i < HI_NUM_HOLDABLE; i++) { + if ( pm->ps->stats[STAT_HOLDABLE_ITEM] & ( 1 << holdable_index ) ) { + pm->ps->stats[STAT_ACTIVE_HOLDABLE] = holdable_index; + break; + } + //set next index, wrap around if at the end of the list + holdable_index += 1; + if ( holdable_index >= HI_NUM_HOLDABLE ) + holdable_index = 1; + } + } + else + pm->ps->stats[STAT_ACTIVE_HOLDABLE] = 0; + + } + return; + } + } else { + pm->ps->pm_flags &= ~PMF_USE_ITEM_HELD; + } + + + // make weapon function + if ( pm->ps->weaponTime > 0 ) { + pm->ps->weaponTime -= pml.msec; + } + + // check for weapon change + // can't change if weapon is firing, but can change + // again if lowering or raising + if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING ) { + if ( pm->ps->weapon != pm->cmd.weapon ) { + PM_BeginWeaponChange( pm->cmd.weapon ); + } + } + + if ( pm->ps->weaponTime > 0 ) { + return; + } + + // change weapon if time + if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + PM_FinishWeaponChange(); + return; + } + + if ( pm->ps->weaponstate == WEAPON_RAISING ) { + pm->ps->weaponstate = WEAPON_READY; + //PKMOD - Ergodic 09/05/00 use alternate stance for the dragon + if ( ( pm->ps->weapon == WP_GAUNTLET ) || ( pm->ps->weapon == WP_GRAPPLING_HOOK ) ) { + PM_StartTorsoAnim( TORSO_STAND2 ); + } else { + PM_StartTorsoAnim( TORSO_STAND ); + } + return; + } + + //PKMOD - Ergodic 07/06/00 - recheck out of ammo for PKA Items + // check for out of ammo + if ( ! pm->ps->ammo[ pm->ps->weapon ] ) { + //PKMOD Ergodic 05/30/00 switch to gauntlet for PK Items noammo state + //PKMOD Ergodic 08/24/01 - change from "switch" to "if" logic + hold_weapon = pm->ps->weapon; + if ( ( hold_weapon == WP_BEARTRAP ) || ( hold_weapon == WP_BEANS ) || ( hold_weapon == WP_SENTRY ) || ( hold_weapon == WP_GRAVITY ) ) { + PM_AddEvent( EV_PKA_NOAMMO ); + //PKMOD - Ergodic 06/27/00 physically remove the weapon from inventory + pm->ps->stats[STAT_WEAPONS] &= ~( 1 << hold_weapon ); + //PKMOD Ergodic 06/10/00 cycle to no weapon (empty handed) + pm->ps->weapon = WP_GAUNTLET; + pm->ps->weaponTime += 500; + return; + } + + } + + // check for fire + if ( ! (pm->cmd.buttons & BUTTON_ATTACK) ) { + pm->ps->weaponTime = 0; + pm->ps->weaponstate = WEAPON_READY; + return; + } + + // start the animation even if out of ammo + if ( pm->ps->weapon == WP_GAUNTLET ) { + // the guantlet only "fires" when it actually hits something + if ( !pm->gauntletHit ) { + pm->ps->weaponTime = 0; + pm->ps->weaponstate = WEAPON_READY; + return; + } + PM_StartTorsoAnim( TORSO_ATTACK2 ); + } else { + //PKMOD - Ergodic 09/05/00 use alternate stance for the dragon + if ( pm->ps->weapon == WP_GRAPPLING_HOOK ) { + PM_StartTorsoAnim( TORSO_ATTACK2 ); + } + else { + PM_StartTorsoAnim( TORSO_ATTACK ); + } + } + + pm->ps->weaponstate = WEAPON_FIRING; + + //PKMOD - Ergodic 03/13/01 - if firing weapon then remove alternate firing mechanism +// pm->ps->generic1 = 0; + + // check for out of ammo +//PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level +// airfist may have "useable" zero ammo + if ( ( ! pm->ps->ammo[ pm->ps->weapon ] ) && ( pm->ps->weapon != WP_AIRFIST ) ) { + //PKMOD Ergodic 05/30/00 switch to gauntlet for PK Items noammo state + //PKMOD Ergodic 08/24/01 - change from "switch" to "if" logic + hold_weapon = pm->ps->weapon; + if ( ( hold_weapon == WP_BEARTRAP ) || ( hold_weapon == WP_BEANS ) || ( hold_weapon == WP_SENTRY ) || ( hold_weapon == WP_GRAVITY ) ) { + PM_AddEvent( EV_PKA_NOAMMO ); + //PKMOD - Ergodic 06/27/00 physically remove the weapon from inventory + pm->ps->stats[STAT_WEAPONS] &= ~( 1 << hold_weapon ); + //PKMOD Ergodic 06/10/00 cycle to no weapon (empty handed) + pm->ps->weapon = WP_NONE; + } + else { + PM_AddEvent( EV_NOAMMO ); + } + pm->ps->weaponTime += 500; + return; + } + + // take an ammo away if not infinite + if ( pm->ps->ammo[ pm->ps->weapon ] != -1 ) { + pm->ps->ammo[ pm->ps->weapon ]--; + //PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level + // do not decrement ammo past zero + if ( ( pm->ps->weapon == WP_AIRFIST ) && ( pm->ps->ammo[ pm->ps->weapon ] < 0 ) ) + pm->ps->ammo[ pm->ps->weapon ] = 0; + } + + //PKMOD - Ergodic 08/21/01 - debug infinite ammo bug (inactive) +// Com_Printf("PM_Weapon - before PM_AddEvent( EV_FIRE_WEAPON )\n" ); + + + // fire weapon + PM_AddEvent( EV_FIRE_WEAPON ); + + //PKMOD - Ergodic 08/21/01 - debug infinite ammo bug (inactive) +// Com_Printf("PM_Weapon - after PM_AddEvent( EV_FIRE_WEAPON )\n" ); + + + //PKMOD - Ergodic 08/21/01 - decrement ammo in client for pka items + // Note: this code was added to fix int infinite ammo bug + /* + if ( ( pm->ps->weapon == WP_BEARTRAP ) || ( pm->ps->weapon == WP_SENTRY ) || ( pm->ps->weapon == WP_BEANS ) || ( pm->ps->weapon == WP_GRAVITY ) ) { + if ( ! pm->ps->ammo[ pm->ps->weapon ] ) { + //PKMOD Ergodic 05/30/00 switch to gauntlet for PK Items noammo state + hold_weapon = pm->ps->weapon; + PM_AddEvent( EV_PKA_NOAMMO ); + //PKMOD - Ergodic 06/27/00 physically remove the weapon from inventory + pm->ps->stats[STAT_WEAPONS] &= ~( 1 << hold_weapon ); + //PKMOD Ergodic 06/10/00 cycle to no weapon (empty handed) + pm->ps->weapon = WP_GAUNTLET; + pm->ps->weaponTime += 500; + return; + } + } + */ + + + switch( pm->ps->weapon ) { + default: + case WP_GAUNTLET: + addTime = 400; + break; + case WP_LIGHTNING: + addTime = 50; + break; + case WP_SHOTGUN: + addTime = 1000; + break; + case WP_MACHINEGUN: + addTime = 100; + break; + case WP_GRENADE_LAUNCHER: + addTime = 800; + break; + case WP_ROCKET_LAUNCHER: + addTime = 800; + break; + case WP_PLASMAGUN: + addTime = 100; + break; + case WP_RAILGUN: + addTime = 1500; + break; + case WP_BFG: + addTime = 200; + break; + case WP_GRAPPLING_HOOK: + addTime = 400; + break; + //PKMOD + //PKMOD Ergodic - 03/29/01 - reduce GW firing time so it can be fisted more quickly (was 1000) + case WP_GRAVITY: + addTime = 100; + break; + //This is NOT the rate of fire of the Sentry itself + case WP_SENTRY: + addTime = 800; + break; + case WP_BEARTRAP: + addTime = 800; + break; + case WP_BEANS: + addTime = 800; + break; + case WP_CHAINLG: + addTime = 50; + break; +//PKMOD Ergodic - 03/25/2000, reset AirFist firing rates from 50 to 600 +//PKMOD Ergodic - 02/02/04, reset AirFist firing rates from 600 to 500 + case WP_AIRFIST: + addTime = 500; + break; +//PKMOD Ergodic - 07/28/2000, reset nailgun rate 500 to 150 + case WP_NAILGUN: + addTime = 150; + break; +//PKMOD Ergodic - 01/22/2001 add firing delay to exploding shells gun +// before this fix expl shells would fire way too fast + case WP_EXPLODING_SHELLS: + addTime = 500; + break; + //PKMOD + +#ifdef MISSIONPACK + case WP_NAILGUN: + addTime = 1000; + break; + case WP_PROX_LAUNCHER: + addTime = 800; + break; + case WP_CHAINGUN: + addTime = 30; + break; +#endif + + } + +#ifdef MISSIONPACK + if( bg_itemlist[pm->ps->stats[STAT_PERSISTANT_POWERUP]].giTag == PW_SCOUT ) { + addTime /= 1.5; + } + else + if( bg_itemlist[pm->ps->stats[STAT_PERSISTANT_POWERUP]].giTag == PW_AMMOREGEN ) { + addTime /= 1.3; + } + else +#endif + if ( pm->ps->powerups[PW_HASTE] ) { + addTime /= 1.3; + } + + pm->ps->weaponTime += addTime; +} + +/* +================ +PM_Animate +================ +*/ + +static void PM_Animate( void ) { + if ( pm->cmd.buttons & BUTTON_GESTURE ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_GESTURE ); + pm->ps->torsoTimer = TIMER_GESTURE; + PM_AddEvent( EV_TAUNT ); + } +#ifdef MISSIONPACK + } else if ( pm->cmd.buttons & BUTTON_GETFLAG ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_GETFLAG ); + pm->ps->torsoTimer = 600; //TIMER_GESTURE; + } + } else if ( pm->cmd.buttons & BUTTON_GUARDBASE ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_GUARDBASE ); + pm->ps->torsoTimer = 600; //TIMER_GESTURE; + } + } else if ( pm->cmd.buttons & BUTTON_PATROL ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_PATROL ); + pm->ps->torsoTimer = 600; //TIMER_GESTURE; + } + } else if ( pm->cmd.buttons & BUTTON_FOLLOWME ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_FOLLOWME ); + pm->ps->torsoTimer = 600; //TIMER_GESTURE; + } + } else if ( pm->cmd.buttons & BUTTON_AFFIRMATIVE ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_AFFIRMATIVE); + pm->ps->torsoTimer = 600; //TIMER_GESTURE; + } + } else if ( pm->cmd.buttons & BUTTON_NEGATIVE ) { + if ( pm->ps->torsoTimer == 0 ) { + PM_StartTorsoAnim( TORSO_NEGATIVE ); + pm->ps->torsoTimer = 600; //TIMER_GESTURE; + } +#endif + } +} + + +/* +================ +PM_DropTimers +================ +*/ +static void PM_DropTimers( void ) { + // drop misc timing counter + if ( pm->ps->pm_time ) { + if ( pml.msec >= pm->ps->pm_time ) { + pm->ps->pm_flags &= ~PMF_ALL_TIMES; + pm->ps->pm_time = 0; + } else { + pm->ps->pm_time -= pml.msec; + } + } + + // drop animation counter + if ( pm->ps->legsTimer > 0 ) { + pm->ps->legsTimer -= pml.msec; + if ( pm->ps->legsTimer < 0 ) { + pm->ps->legsTimer = 0; + } + } + + if ( pm->ps->torsoTimer > 0 ) { + pm->ps->torsoTimer -= pml.msec; + if ( pm->ps->torsoTimer < 0 ) { + pm->ps->torsoTimer = 0; + } + } +} + +/* +================ +PM_UpdateViewAngles + +This can be used as another entry point when only the viewangles +are being updated isntead of a full move +================ +*/ +void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd ) { + short temp; + int i; + + if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPINTERMISSION) { + return; // no view changes at all + } + + if ( ps->pm_type != PM_SPECTATOR && ps->stats[STAT_HEALTH] <= 0 ) { + return; // no view changes at all + } + + // circularly clamp the angles with deltas + for (i=0 ; i<3 ; i++) { + temp = cmd->angles[i] + ps->delta_angles[i]; + if ( i == PITCH ) { + // don't let the player look up or down more than 90 degrees + if ( temp > 16000 ) { + ps->delta_angles[i] = 16000 - cmd->angles[i]; + temp = 16000; + } else if ( temp < -16000 ) { + ps->delta_angles[i] = -16000 - cmd->angles[i]; + temp = -16000; + } + } + ps->viewangles[i] = SHORT2ANGLE(temp); + } + +} + +/* +=============== +PM_NextHoldable + +PKMOD - Ergodic - 05/12/01 +=============== +*/ +void PM_NextHoldable( void ) { + int i; + int holdable_index; + + //PKMOD - Ergodic 05/12/01 - debug non working next holdable (inactive) +// Com_Printf("PM_NextHoldable - start, active>%d<, items>%d<\n", pm->ps->stats[STAT_ACTIVE_HOLDABLE], pm->ps->stats[STAT_HOLDABLE_ITEM] ); + + if ( pm->ps->pm_flags & PMF_FOLLOW ) { + //PKMOD - Ergodic 05/12/01 - debug non working next holdable (inactive) +// Com_Printf("PM_NextHoldable_f - PMF_FOLLOW, return\n" ); + return; + } + + //if no holdable in inventory then exit + if ( !pm->ps->stats[STAT_HOLDABLE_ITEM] ) { + //PKMOD - Ergodic 05/12/01 - debug non working next holdable (inactive) +// Com_Printf("PM_NextHoldable_f - no holdable\n" ); + return; + } + + holdable_index = pm->ps->stats[STAT_ACTIVE_HOLDABLE]; + + for (i = 1; i < HI_NUM_HOLDABLE; i++) { + //set next index, wrap around if at the end of the list + holdable_index = holdable_index + 1; + if ( holdable_index >= HI_NUM_HOLDABLE ) + holdable_index = 1; + + //PKMOD - Ergodic 12/07/01 - Private Bot navigation - always set index to HI_BOTHEAD + if ( ( holdable_index >= HI_BOTLEGS ) && ( holdable_index <= HI_BOTHEAD )) { + if ( pm->ps->stats[STAT_HOLDABLE_ITEM] & ( 7 << HI_BOTLEGS ) ) { + pm->ps->stats[STAT_ACTIVE_HOLDABLE] = HI_BOTHEAD; + break; + } + //PKMOD - Ergodic 12/07/01 - yes, yes, I know - we are wasting 2 cycles on the if statement + } + else if ( pm->ps->stats[STAT_HOLDABLE_ITEM] & ( 1 << holdable_index ) ) { + pm->ps->stats[STAT_ACTIVE_HOLDABLE] = holdable_index; + //PKMOD - Ergodic 05/12/01 - debug non working next holdable (inactive) +// Com_Printf("PM_NextHoldable_f - found holdable, setting>%d<, active>%d<\n", holdable_index, pm->ps->stats[STAT_ACTIVE_HOLDABLE] ); + break; + } + } + +} + + +/* +================ +PmoveSingle + +================ +*/ +void trap_SnapVector( float *v ); + +void PmoveSingle (pmove_t *pmove) { + pm = pmove; + + // this counter lets us debug movement problems with a journal + // by setting a conditional breakpoint fot the previous frame + c_pmove++; + + // clear results + pm->numtouch = 0; + pm->watertype = 0; + pm->waterlevel = 0; + + //PKMOD - Ergodic 05/12/01 - debug buttons (inactive) +// Com_Printf("PmoveSingle - commands>%d<\n", pm->cmd.buttons ); + + if ( pm->ps->stats[STAT_HEALTH] <= 0 ) { + pm->tracemask &= ~CONTENTS_BODY; // corpses can fly through bodies + } + + // make sure walking button is clear if they are running, to avoid + // proxy no-footsteps cheats + if ( abs( pm->cmd.forwardmove ) > 64 || abs( pm->cmd.rightmove ) > 64 ) { + pm->cmd.buttons &= ~BUTTON_WALKING; + } + + // set the talk balloon flag + if ( pm->cmd.buttons & BUTTON_TALK ) { + pm->ps->eFlags |= EF_TALK; + } else { + pm->ps->eFlags &= ~EF_TALK; + } + + // set the firing flag for continuous beam weapons + if ( !(pm->ps->pm_flags & PMF_RESPAWNED) && pm->ps->pm_type != PM_INTERMISSION + && ( pm->cmd.buttons & BUTTON_ATTACK ) && pm->ps->ammo[ pm->ps->weapon ] ) { + pm->ps->eFlags |= EF_FIRING; + } else { + pm->ps->eFlags &= ~EF_FIRING; + } + + // clear the respawned flag if attack and use are cleared + if ( pm->ps->stats[STAT_HEALTH] > 0 && + !( pm->cmd.buttons & (BUTTON_ATTACK | BUTTON_USE_HOLDABLE) ) ) { + pm->ps->pm_flags &= ~PMF_RESPAWNED; + } + + // if talk button is down, dissallow all other input + // this is to prevent any possible intercept proxy from + // adding fake talk balloons + if ( pmove->cmd.buttons & BUTTON_TALK ) { + // keep the talk button set tho for when the cmd.serverTime > 66 msec + // and the same cmd is used multiple times in Pmove + pmove->cmd.buttons = BUTTON_TALK; + pmove->cmd.forwardmove = 0; + pmove->cmd.rightmove = 0; + pmove->cmd.upmove = 0; + } + + //PKMOD - Ergodic 05/12/01 - cycle holdables + if ( pm->cmd.buttons & BUTTON_NEXT_HOLDABLE ) { + if ( !( pm->ps->pm_flags & PMF_NEXTHOLD_HELD ) ) { + //PKMOD - Ergodic 05/12/01 - debug buttons (inactive) +// Com_Printf("PmoveSingle - pm>%d<, pmove>%d<\n", pm->cmd.buttons, pmove->cmd.buttons ); + + PM_NextHoldable(); +// pm->cmd.buttons &= ~BUTTON_NEXT_HOLDABLE; + pm->ps->pm_flags |= PMF_NEXTHOLD_HELD; + } + } + else { + pm->ps->pm_flags &= ~PMF_NEXTHOLD_HELD; + } + + // clear all pmove local vars + memset (&pml, 0, sizeof(pml)); + + // determine the time + pml.msec = pmove->cmd.serverTime - pm->ps->commandTime; + if ( pml.msec < 1 ) { + pml.msec = 1; + } else if ( pml.msec > 200 ) { + pml.msec = 200; + } + pm->ps->commandTime = pmove->cmd.serverTime; + + // save old org in case we get stuck + VectorCopy (pm->ps->origin, pml.previous_origin); + + // save old velocity for crashlanding + VectorCopy (pm->ps->velocity, pml.previous_velocity); + + pml.frametime = pml.msec * 0.001; + + // update the viewangles + PM_UpdateViewAngles( pm->ps, &pm->cmd ); + + AngleVectors (pm->ps->viewangles, pml.forward, pml.right, pml.up); + + if ( pm->cmd.upmove < 10 ) { + // not holding jump + pm->ps->pm_flags &= ~PMF_JUMP_HELD; + } + + // decide if backpedaling animations should be used + if ( pm->cmd.forwardmove < 0 ) { + pm->ps->pm_flags |= PMF_BACKWARDS_RUN; + } else if ( pm->cmd.forwardmove > 0 || ( pm->cmd.forwardmove == 0 && pm->cmd.rightmove ) ) { + pm->ps->pm_flags &= ~PMF_BACKWARDS_RUN; + } + + if ( pm->ps->pm_type >= PM_DEAD ) { + pm->cmd.forwardmove = 0; + pm->cmd.rightmove = 0; + pm->cmd.upmove = 0; + } + + if ( pm->ps->pm_type == PM_SPECTATOR ) { + PM_CheckDuck (); + PM_FlyMove (); + PM_DropTimers (); + return; + } + + if ( pm->ps->pm_type == PM_NOCLIP ) { + PM_NoclipMove (); + PM_DropTimers (); + return; + } + + if (pm->ps->pm_type == PM_FREEZE) { + return; // no movement at all + } + + if ( pm->ps->pm_type == PM_INTERMISSION || pm->ps->pm_type == PM_SPINTERMISSION) { + return; // no movement at all + } + + // set watertype, and waterlevel + PM_SetWaterLevel(); + pml.previous_waterlevel = pmove->waterlevel; + + // set mins, maxs, and viewheight + PM_CheckDuck (); + + // set groundentity + PM_GroundTrace(); + + if ( pm->ps->pm_type == PM_DEAD ) { + PM_DeadMove (); + } + + PM_DropTimers(); + +#ifdef MISSIONPACK + if ( pm->ps->powerups[PW_INVULNERABILITY] ) { + PM_InvulnerabilityMove(); + } else +#endif + if ( pm->ps->powerups[PW_FLIGHT] ) { + // flight powerup doesn't allow jump and has different friction + PM_FlyMove(); + } else if (pm->ps->pm_flags & PMF_GRAPPLE_PULL) { + PM_GrappleMove(); + // We can wiggle a bit + PM_AirMove(); + } else if (pm->ps->pm_flags & PMF_TIME_WATERJUMP) { + PM_WaterJumpMove(); + } else if ( pm->waterlevel > 1 ) { + // swimming + PM_WaterMove(); + } else if ( pml.walking ) { + // walking on ground + PM_WalkMove(); + } else { + // airborne + PM_AirMove(); + } + + PM_Animate(); + + // set groundentity, watertype, and waterlevel + PM_GroundTrace(); + PM_SetWaterLevel(); + + // weapons + PM_Weapon(); + + //PKMOD - Ergodic 04/04/01 - debug "last weapon" (inactive) +// if ( ( rand() % 100 ) > 95 ) +// Com_Printf( "pmove - current>%d<, last>%d<\n", pm->ps->weapon, pm->ps->stats[ STAT_LAST_WEAPON ] ); + + + // torso animation + PM_TorsoAnimation(); + + // footstep events / legs animations + PM_Footsteps(); + + // entering / leaving water splashes + PM_WaterEvents(); + + // snap some parts of playerstate to save network bandwidth + trap_SnapVector( pm->ps->velocity ); +} + + +/* +================ +Pmove + +Can be called by either the server or the client +================ +*/ +void Pmove (pmove_t *pmove) { + int finalTime; + + finalTime = pmove->cmd.serverTime; + + if ( finalTime < pmove->ps->commandTime ) { + return; // should not happen + } + + if ( finalTime > pmove->ps->commandTime + 1000 ) { + pmove->ps->commandTime = finalTime - 1000; + } + + pmove->ps->pmove_framecount = (pmove->ps->pmove_framecount+1) & ((1<ps->commandTime != finalTime ) { + int msec; + + msec = finalTime - pmove->ps->commandTime; + + if ( pmove->pmove_fixed ) { + if ( msec > pmove->pmove_msec ) { + msec = pmove->pmove_msec; + } + } + else { + if ( msec > 66 ) { + msec = 66; + } + } + pmove->cmd.serverTime = pmove->ps->commandTime + msec; + PmoveSingle( pmove ); + + if ( pmove->ps->pm_flags & PMF_JUMP_HELD ) { + pmove->cmd.upmove = 20; + } + } + + //PM_CheckStuck(); + +} + diff --git a/quake3/source/code/game/bg_public.h b/quake3/source/code/game/bg_public.h new file mode 100644 index 0000000..f027b43 --- /dev/null +++ b/quake3/source/code/game/bg_public.h @@ -0,0 +1,1102 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// bg_public.h -- definitions shared by both the server game and client game modules + +// because games can change separately from the main system version, we need a +// second version that must match between game and cgame + +#define GAME_VERSION "baseq3-1" + +//PKMOD - Ergodic 02/01/01 - add variable for PKARENA game version +//PKMOD - Ergodic 03/27/01 - re-version from 2.1b to 2.2 +//PKMOD - Ergodic 04/21/01 - re-version from 2.2 to 2.3 +//PKMOD - Ergodic 04/25/01 - re-version from 2.3 to 2.4 +//PKMOD - Ergodic 06/03/01 - re-version from 2.4 to 2.5 +//PKMOD - Ergodic 07/11/01 - re-version from 2.5 to 2.6 +//PKMOD - Ergodic 07/14/01 - re-version from 2.6 to 2.7 +//PKMOD - Ergodic 07/25/01 - re-version from 2.7 to 2.7t +//PKMOD - Ergodic 07/31/01 - re-version from 2.7t to 2.7 +//PKMOD - Ergodic 08/14/01 - re-version from 2.7 to 2.7F +//PKMOD - Ergodic 08/16/01 - re-version from 2.7F to 2.7G +//PKMOD - Ergodic 08/24/01 - re-version from 2.7G to 2.7H +//PKMOD - Ergodic 08/26/01 - re-version from 2.7H to 2.8 +//PKMOD - Ergodic 09/30/01 - re-version from 2.8 to 2.9a +//PKMOD - Ergodic 11/23/01 - re-version from 2.9a to 2.9b +//PKMOD - Ergodic 12/07/01 - re-version from 2.9b to 2.9c +//PKMOD - Ergodic 01/20/02 - re-version from 2.9c to 2.9d +//PKMOD - Ergodic 02/14/02 - re-version from 2.9d to 2.9e +//PKMOD - Ergodic 05/24/02 - re-version from 2.9e to 2.9f +//PKMOD - Ergodic 08/02/02 - re-version from 2.9f to 2.9g +//PKMOD - Ergodic 09/24/02 - re-version from 2.9g to 2.9h +//PKMOD - Ergodic 10/18/02 - re-version from 2.9h to 2.9i +//PKMOD - Ergodic 10/24/02 - re-version from 2.9i to 2.9j +//PKMOD - Ergodic 11/03/02 - re-version from 2.9j to 2.9k +//PKMOD - Ergodic 11/28/02 - re-version from 2.9k to 2.9L +//PKMOD - Ergodic 12/07/02 - re-version from 2.9L to 2.9m +//PKMOD - Ergodic 12/07/02 - re-version from 2.9m to 2.9n +//PKMOD - Ergodic 12/07/02 - re-version from 2.9n to 3.0 +//PKMOD - Ergodic 05/15/03 - re-version from 3.0 to 3.0a +//PKMOD - Ergodic 09/23/03 - re-version from 3.0a to 3.0b +//PKMOD - Ergodic 09/25/03 - re-version from 3.0b to 3.0c +//PKMOD - Ergodic 12/13/03 - re-version from 3.0c to 3.0d +//PKMOD - Ergodic 12/18/03 - re-version from 3.0d to 3.0e +//PKMOD - Ergodic 01/03/04 - re-version from 3.0e to 3.0f +//PKMOD - Ergodic 01/03/04 - re-version from 3.0f to 3.0g +//PKMOD - Ergodic 02/06/04 - re-version from 3.0g to 3.0h +//PKMOD - Ergodic 02/11/04 - re-version from 3.0h to 3.0i +//PKMOD - Ergodic 02/24/04 - re-version from 3.0i to 3.0j +//PKMOD - Ergodic 02/27/04 - re-version from 3.0j to 3.0k +//PKMOD - Ergodic 03/15/04 - re-version from 3.0k to 3.0m (skip l) +//PKMOD - Ergodic 03/29/04 - re-version from 3.0m to 3.0n +#define PKARENA_VERSION "pkarena 3.0n" + +#define DEFAULT_GRAVITY 800 +#define GIB_HEALTH -40 +#define ARMOR_PROTECTION 0.66 + +#define MAX_ITEMS 256 + +#define RANK_TIED_FLAG 0x4000 + +#define DEFAULT_SHOTGUN_SPREAD 700 +#define DEFAULT_SHOTGUN_COUNT 11 + +#define ITEM_RADIUS 15 // item sizes are needed for client side pickup detection + +#define LIGHTNING_RANGE 768 + +#define SCORE_NOT_PRESENT -9999 // for the CS_SCORES[12] when only one player is present + +#define VOTE_TIME 30000 // 30 seconds before vote times out + +#define MINS_Z -24 +#define DEFAULT_VIEWHEIGHT 26 +#define CROUCH_VIEWHEIGHT 12 +#define DEAD_VIEWHEIGHT -16 + +// +// config strings are a general means of communicating variable length strings +// from the server to all connected clients. +// + +// CS_SERVERINFO and CS_SYSTEMINFO are defined in q_shared.h +#define CS_MUSIC 2 +#define CS_MESSAGE 3 // from the map worldspawn's message field +#define CS_MOTD 4 // g_motd string for server message of the day +#define CS_WARMUP 5 // server time when the match will be restarted +#define CS_SCORES1 6 +#define CS_SCORES2 7 +#define CS_VOTE_TIME 8 +#define CS_VOTE_STRING 9 +#define CS_VOTE_YES 10 +#define CS_VOTE_NO 11 + +#define CS_TEAMVOTE_TIME 12 +#define CS_TEAMVOTE_STRING 14 +#define CS_TEAMVOTE_YES 16 +#define CS_TEAMVOTE_NO 18 + +#define CS_GAME_VERSION 20 +#define CS_LEVEL_START_TIME 21 // so the timer only shows the current level +#define CS_INTERMISSION 22 // when 1, fraglimit/timelimit has been hit and intermission will start in a second or two +#define CS_FLAGSTATUS 23 // string indicating flag status in CTF +#define CS_SHADERSTATE 24 +#define CS_BOTINFO 25 + +#define CS_ITEMS 27 // string of 0's and 1's that tell which items are present +//PKMOD - Ergodic 10/13/00 - add alternate music to hub +#define CS_POSTVOTE_MUSIC 32 +//PKMOD - Ergodic 02/01/01 - add variable for PKARENA game version +#define CS_PKARENA_VERSION 33 + +#define CS_MODELS 34 //PKMOD was 32 +#define CS_SOUNDS (CS_MODELS+MAX_MODELS) +#define CS_PLAYERS (CS_SOUNDS+MAX_SOUNDS) +#define CS_LOCATIONS (CS_PLAYERS+MAX_CLIENTS) +#define CS_PARTICLES (CS_LOCATIONS+MAX_LOCATIONS) + +#define CS_MAX (CS_PARTICLES+MAX_LOCATIONS) + +#if (CS_MAX) > MAX_CONFIGSTRINGS +#error overflow: (CS_MAX) > MAX_CONFIGSTRINGS +#endif + +typedef enum { + GT_FFA, // free for all + GT_TOURNAMENT, // one on one tournament + GT_SINGLE_PLAYER, // single player ffa + + //-- team games go after this -- + + GT_TEAM, // team deathmatch + GT_CTF, // capture the flag + GT_1FCTF, + GT_OBELISK, + GT_HARVESTER, + GT_MAX_GAME_TYPE +} gametype_t; + +typedef enum { GENDER_MALE, GENDER_FEMALE, GENDER_NEUTER } gender_t; + +/* +=================================================================================== + +PMOVE MODULE + +The pmove code takes a player_state_t and a usercmd_t and generates a new player_state_t +and some other output data. Used for local prediction on the client game and true +movement on the server game. +=================================================================================== +*/ + +typedef enum { + PM_NORMAL, // can accelerate and turn + PM_NOCLIP, // noclip movement + PM_SPECTATOR, // still run into walls + PM_DEAD, // no acceleration or turning, but free falling + PM_FREEZE, // stuck in place with no control + PM_INTERMISSION, // no movement or status bar + PM_SPINTERMISSION // no movement or status bar +} pmtype_t; + +typedef enum { + WEAPON_READY, + WEAPON_RAISING, + WEAPON_DROPPING, + WEAPON_FIRING +} weaponstate_t; + +// pmove->pm_flags +#define PMF_DUCKED 1 +#define PMF_JUMP_HELD 2 + +//PKMOD - Ergodic 05/12/01 - add flag for next_holdable button being held +#define PMF_NEXTHOLD_HELD 4 + +#define PMF_BACKWARDS_JUMP 8 // go into backwards land +#define PMF_BACKWARDS_RUN 16 // coast down to backwards run +#define PMF_TIME_LAND 32 // pm_time is time before rejump +#define PMF_TIME_KNOCKBACK 64 // pm_time is an air-accelerate only time +#define PMF_TIME_WATERJUMP 256 // pm_time is waterjump +#define PMF_RESPAWNED 512 // clear after attack and jump buttons come up +#define PMF_USE_ITEM_HELD 1024 +#define PMF_GRAPPLE_PULL 2048 // pull towards grapple location +#define PMF_FOLLOW 4096 // spectate following another player +#define PMF_SCOREBOARD 8192 // spectate as a scoreboard +#define PMF_INVULEXPAND 16384 // invulnerability sphere set to full size + +#define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK) + +#define MAXTOUCH 32 +typedef struct { + // state (in / out) + playerState_t *ps; + + // command (in) + usercmd_t cmd; + int tracemask; // collide against these types of surfaces + int debugLevel; // if set, diagnostic output will be printed + qboolean noFootsteps; // if the game is setup for no footsteps by the server + qboolean gauntletHit; // true if a gauntlet attack would actually hit something + + int framecount; + + // results (out) + int numtouch; + int touchents[MAXTOUCH]; + + vec3_t mins, maxs; // bounding box size + + int watertype; + int waterlevel; + + float xyspeed; + + // for fixed msec Pmove + int pmove_fixed; + int pmove_msec; + + // callbacks to test the world + // these will be different functions during game and cgame + void (*trace)( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentMask ); + + int (*pointcontents)( const vec3_t point, int passEntityNum ); +} pmove_t; + +// if a full pmove isn't done on the client, you can just update the angles +void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd ); +void Pmove (pmove_t *pmove); + +//=================================================================================== +//PKMOD - Ergodic 07/10/00 add definition for beartraps attached constant for the +// angles2 co-opt hack. the entitystate_t angles2[beartraps_attached] +// variable will link the beartrap info from the game to the client +#define BEARTRAPS_ATTACHED 0 //this will coop the pitch of angles2 + +//PKMOD - Ergodic 06/18/00 add PKA items status area +// player_state->stats[] indexes +// NOTE: may not have more than 16 +typedef enum { + STAT_HEALTH, + STAT_HOLDABLE_ITEM, +#ifdef MISSIONPACK + STAT_PERSISTANT_POWERUP, +#endif + STAT_WEAPONS, // 16 bit fields + STAT_PKA_ITEMS, // 16 bit fields + STAT_ARMOR, + STAT_DEAD_YAW, // look this direction when dead (FIXME: get rid of?) + STAT_CLIENTS_READY, // bit mask of clients wishing to exit the intermission (FIXME: configstring?) + STAT_MAX_HEALTH, // health / armor limit, changable by handicap + STAT_BEARTRAPS_ATTACHED, //PKMOD - Ergodic 06/30/00, beartraps attached to player + //PKMOD - Ergodic 01/19/02 - reuse STAT_VOTING_MODE field for other purposes +// STAT_VOTING_MODE, //PKMOD - Ergodic 09/24/00, add player voting mode state + STAT_PKA_BITS, //PKMOD - Ergodic 01/19/02, add PKA miscellaneos bits to playerstate + STAT_AIRFIST_LEVEL, //PKMOD - Ergodic 11/15/00, add af_lev to player state + // values (4,3,2,1,0) + STAT_PRIOR_AIRFIST_LEVEL, //PKMOD - Ergodic 11/15/00, holds af level at time of blast + // values (4,3,2,1,0) + STAT_LAST_WEAPON, //PKMOD - Ergodic 04/04/01, holds last weapon + STAT_ACTIVE_HOLDABLE, //PKMOD - Ergodic 05/11/01 - allow holding of more than 1 type of + // holdable but only 1 of each kind + STAT_CLG_SHAFTEE_NUM //PKMOD - Ergodic 12/16/03, hold enitynumber for prime shafted target +} statIndex_t; + + +// player_state->persistant[] indexes +// these fields are the only part of player_state that isn't +// cleared on respawn +// NOTE: may not have more than 16 +typedef enum { + PERS_SCORE, // !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!! + PERS_HITS, // total points damage inflicted so damage beeps can sound on change + PERS_RANK, // player rank or team rank + PERS_TEAM, // player team + PERS_SPAWN_COUNT, // incremented every respawn + PERS_PLAYEREVENTS, // 16 bits that can be flipped for events + PERS_ATTACKER, // clientnum of last damage inflicter + PERS_ATTACKEE_ARMOR, // health/armor of last person we attacked + PERS_KILLED, // count of the number of times you died + // player awards tracking + PERS_IMPRESSIVE_COUNT, // two railgun hits in a row + PERS_EXCELLENT_COUNT, // two successive kills in a short amount of time + PERS_DEFEND_COUNT, // defend awards + PERS_ASSIST_COUNT, // assist awards + PERS_GAUNTLET_FRAG_COUNT, // kills with the guantlet + PERS_CAPTURES, // captures +//PKMOD - Ergodic 08/08/00 add PKA Medal - packed variable + PERS_PAINKILLER_COUNT +//PKMOD - Ergodic 10/11/00 add PKA HUB Flag - packed variable + //PKMOD - Ergodic 12/16/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + // +} persEnum_t; + + +// entityState_t->eFlags +#define EF_DEAD 0x00000001 // don't draw a foe marker over players with EF_DEAD +#ifdef MISSIONPACK +#define EF_TICKING 0x00000002 // used to make players play the prox mine ticking sound +#endif +#define EF_TELEPORT_BIT 0x00000004 // toggled every time the origin abruptly changes +#define EF_AWARD_EXCELLENT 0x00000008 // draw an excellent sprite +#define EF_PLAYER_EVENT 0x00000010 +#define EF_BOUNCE 0x00000010 // for missiles +#define EF_BOUNCE_HALF 0x00000020 // for missiles +#define EF_AWARD_GAUNTLET 0x00000040 // draw a gauntlet sprite +#define EF_NODRAW 0x00000080 // may have an event, but no model (unspawned items) +#define EF_FIRING 0x00000100 // for lightning gun +//PKMOD Ergodic - 07/08/01, remove kamizaki and add lightningstrike to EF_ area +//#define EF_KAMIKAZE 0x00000200 +#define EF_LIGHTNINGSTRIKE 0x00000200 //player shooting the clg has struck an enemy + +#define EF_MOVER_STOP 0x00000400 // will push otherwise +#define EF_AWARD_CAP 0x00000800 // draw the capture sprite +#define EF_TALK 0x00001000 // draw a talk balloon +#define EF_CONNECTION 0x00002000 // draw a connection trouble sprite +#define EF_VOTED 0x00004000 // already cast a vote +#define EF_AWARD_IMPRESSIVE 0x00008000 // draw an impressive sprite +#define EF_AWARD_DEFEND 0x00010000 // draw a defend sprite +#define EF_AWARD_ASSIST 0x00020000 // draw a assist sprite +#define EF_AWARD_DENIED 0x00040000 // denied +#define EF_TEAMVOTED 0x00080000 // already cast a team vote +//PKMOD - Ergodic 08/08/00 - PK Medals +//PKMOD - Ergodic 12/16/00 - was EF_AWARD_PAINKILLER 0x00000800 +#define EF_AWARD_PAINKILLER 0x00100000 // draw a painkiller sprite + +//PKMOD Ergodic - 12/28/00, add general PainKeepArena entity flags +//PKMOD Ergodic - 07/08/01, move lightningstrike to EF_ area +//#define PKAEF_LIGHTNINGSTRIKE 0x00000001 //player shooting the clg has struck an enemy +#define PKAEF_AUTOSENTRYFIRING 0x00000002 //autosentry is firing the guns +//PKMOD Ergodic - 01/11/01, add flag for trap door that causes death will credit +// the activating player +#define PKAEF_DOORADDFRAG 0x00000004 //Activating player will be credited the frag(s) +//PKMOD Ergodic - 01/23/01, add flag for setting the turret portion of the autosentry to die +#define PKAEF_AUTOSENTRYDEATH 0x00000008 //autosentry is set to die +//PKMOD Ergodic - 01/30/01, add flag for setting the turret portion of the autosentry to Free +#define PKAEF_AUTOSENTRYFREE 0x00000010 //autosentry is set to Free (don't die twice) +//PKMOD Ergodic - 08/05/01, add flag for setting the BearTrap to die (used in g_mover) +#define PKAEF_BEARTRAPDIE 0x00000020 //Beartrap is set to die (don't die twice) +//PKMOD Ergodic - 10/25/01, add flag for setting the entity irradiated +#define PKAEF_IRRADIATED 0x00000040 //Entity is irradiated +//PKMOD Ergodic - 11/21/03, add flag for Gravity Well Earthquake sound +#define PKAEF_EARTHQUAKE 0x00000080 //Set when Earthquake Sound is issued +//PKMOD Ergodic - 01/05/04, add flag for beanstoot ent, when it is quaded +#define PKAEF_QUADFART 0x00000100 //Set when Quad Farting is enabled + +//PKMOD - Ergodic 01/19/02 - STAT_PKA_BITS +//PKMOD - Ergodic 02/05/02 - change STAT_PKA_BITS settings from enum type to definition +#define PKA_BITS_PRIVATEBOT 0x00000001 //1 - flag for private bot +//PKMOD - Ergodic 02/05/02 - Add ATTACK Bits for hit sounds +#define PKA_BITS_DEFAULTATTACK 0x00000000 //0 - regular hit sound, 2 - beartrap hit sound, 3 - autosentry hit sound +#define PKA_BITS_BEARTRAPATTACK 0x00000002 //2 - beartrap hit sound +#define PKA_BITS_RADIATEATTACK 0x00000004 //4 - radiate hit sound +#define PKA_BITS_SENTRYATTACK 0x0000000E //E - autosentry hit sound [NOTE: this bitfield should be a complete mask] + + +// NOTE: may not have more than 16 +typedef enum { + PW_NONE, //0 - powerup + + PW_QUAD, //1 - powerup + PW_BATTLESUIT, //2 - powerup + PW_HASTE, //3 - powerup + PW_INVIS, //4 - powerup + PW_REGEN, //5 - powerup + PW_FLIGHT, //6 - powerup + + PW_REDFLAG, //7 - powerup + PW_BLUEFLAG, //8 - powerup + PW_NEUTRALFLAG, //9 - powerup + +//PKMOD - Ergodic 10/13/01 - add powerup timer for radiate effect +// This will redefine the PW_SCOUT area + PW_RADIATE, //10 - powerup +// PW_SCOUT, //10 - powerup +//PKMOD - Ergodic 05/07/02 - add powerup timer for Active Personal Sentry +// This will redefine the PW_GUARD area + PW_PERSENTRY, //11 - powerup +// PW_GUARD, //11 - powerup + PW_DOUBLER, //12 - powerup +// PW_AMMOREGEN, +//PKMOD - Ergodic 06/03/01 - add bean powerup timer for armor countdown immunity + PW_BEANS, //13 - powerup + PW_INVULNERABILITY, //14 - powerup +//PKMOD - Ergodic 08/22/00 - use powerup as vehicle to communicate clg shaft player hit info to cgame + PW_CLGPLAYERHIT, //15 - powerup +//PKMOD - Ergodic 09/20/00 - voting item +//PKMOD - Ergodic 12/16/00 - removed and need to NULL bg_misc entry. field is unused +// PW_VOTING, + + PW_NUM_POWERUPS + +} powerup_t; + +typedef enum { + HI_NONE, + + HI_TELEPORTER, + HI_MEDKIT, + //PKMOD - Ergodic 10/06/01 - add new holdable + HI_RADIATE, + //PKMOD - Ergodic 11/23/01 - add new holdable + HI_PERSENTRY, + //PKMOD - Ergodic 12/01/01 - add new Private Bot holdables + HI_BOTLEGS, + HI_BOTTORSO, + HI_BOTHEAD, + HI_KAMIKAZE, + HI_PORTAL, + HI_INVULNERABILITY, + + HI_NUM_HOLDABLE +} holdable_t; + +//PKMOD - Ergodic 05/14/00 - modify for PK weapons order (later: need to fix weapon 1 cycling) +//PKMOD - Ergodic 06/08/00 - modify for PK weapons order using 2 byte STAT_WEAPONS +//PKMOD - Ergodic 06/09/00 - Currently only 15 weapons means may not need to add expansion byte, just yet +typedef enum { + WP_NONE, + + WP_GAUNTLET, //1 + WP_MACHINEGUN, //2 + WP_SHOTGUN, //3 + WP_AIRFIST, //4 PKMOD -Add Weapons. + WP_NAILGUN, //5 + WP_GRENADE_LAUNCHER, //6 + WP_ROCKET_LAUNCHER, //7 + WP_LIGHTNING, //8 + WP_RAILGUN, //9 + WP_GRAPPLING_HOOK, //10 - this is the last weapon before special PK items + WP_GRAVITY, //11 + WP_SENTRY, //12 + WP_BEARTRAP, //13 PKMOD - Ergodic 06/08/00 Weapon enum #16 + WP_BEANS, //14 - this is the last special PK item + WP_EXPLODING_SHELLS, //15 - 2002-Aug-18: this is the last weapon due to cg_weapons.c weapon cycling rules + + WP_NUM_WEAPONS, + WP_CHAINLG, //never select the chainlg + WP_PLASMAGUN, //never select the plasmagun + WP_BFG //never select the bgf + +} weapon_t; + +//PKMOD - Ergodic 06/18/00 - PKA Items Status +typedef enum { + PKA_NONE, + PKA_BEANS, //1 - flag for active beans + PKA_SHAFTED, //2 - flag for client currently being shafted + PKA_IRRADIATED, //3 - flag for radiated "infected" client + //PKMOD - Ergodic 02/05/02 - Add Bits for activated Personal Sentry + PKA_PERSENTRY_ACTIVE, //4 - Personal Sentry is active on player + //PKMOD - Ergodic 09/14/03 - Add Bits for state when clint is voting for the alternate hub maps + PKA_HUBALT_VOTING //5 - Personal Sentry is active on player +} pka_items_t; + +// reward sounds +typedef enum { + REWARD_BAD, + + REWARD_IMPRESSIVE, + REWARD_EXCELLENT, + REWARD_DENIED, + REWARD_GAUNTLET, + REWARD_PAINKILLER +} reward_t; + +// reward sounds (stored in ps->persistant[PERS_PLAYEREVENTS]) +#define PLAYEREVENT_DENIEDREWARD 0x0001 +#define PLAYEREVENT_GAUNTLETREWARD 0x0002 +#define PLAYEREVENT_HOLYSHIT 0x0004 + +// entityState_t->event values +// entity events are for effects that take place reletive +// to an existing entities origin. Very network efficient. + +// two bits at the top of the entityState->event field +// will be incremented with each change in the event so +// that an identical event started twice in a row can +// be distinguished. And off the value with ~EV_EVENT_BITS +// to retrieve the actual event number +#define EV_EVENT_BIT1 0x00000100 +#define EV_EVENT_BIT2 0x00000200 +#define EV_EVENT_BITS (EV_EVENT_BIT1|EV_EVENT_BIT2) + +#define EVENT_VALID_MSEC 300 + +typedef enum { + EV_NONE, + + EV_FOOTSTEP, + EV_FOOTSTEP_METAL, + EV_FOOTSPLASH, + EV_FOOTWADE, + EV_SWIM, + + EV_STEP_4, + EV_STEP_8, + EV_STEP_12, + EV_STEP_16, + + EV_FALL_SHORT, + EV_FALL_MEDIUM, + EV_FALL_FAR, + + EV_JUMP_PAD, // boing sound at origin, jump sound on player + + EV_JUMP, + EV_WATER_TOUCH, // foot touches + EV_WATER_LEAVE, // foot leaves + EV_WATER_UNDER, // head touches + EV_WATER_CLEAR, // head leaves + + EV_ITEM_PICKUP, // normal item pickups are predictable + EV_GLOBAL_ITEM_PICKUP, // powerup / team sounds are broadcast to everyone + + EV_NOAMMO, + EV_CHANGE_WEAPON, + EV_FIRE_WEAPON, + + EV_USE_ITEM0, + EV_USE_ITEM1, + EV_USE_ITEM2, + EV_USE_ITEM3, + EV_USE_ITEM4, + EV_USE_ITEM5, + EV_USE_ITEM6, + EV_USE_ITEM7, + EV_USE_ITEM8, + EV_USE_ITEM9, + EV_USE_ITEM10, + EV_USE_ITEM11, + EV_USE_ITEM12, + EV_USE_ITEM13, + EV_USE_ITEM14, + EV_USE_ITEM15, + + EV_ITEM_RESPAWN, + EV_ITEM_POP, + EV_PLAYER_TELEPORT_IN, + EV_PLAYER_TELEPORT_OUT, + + EV_GRENADE_BOUNCE, // eventParm will be the soundindex + + EV_GENERAL_SOUND, + EV_GLOBAL_SOUND, // no attenuation + EV_GLOBAL_TEAM_SOUND, + + EV_BULLET_HIT_FLESH, + EV_BULLET_HIT_WALL, + + EV_MISSILE_HIT, + EV_MISSILE_MISS, + EV_MISSILE_MISS_METAL, + EV_RAILTRAIL, + EV_SHOTGUN, + EV_BULLET, // otherEntity is the shooter + + EV_PAIN, + EV_DEATH1, + EV_DEATH2, + EV_DEATH3, + EV_OBITUARY, + + EV_POWERUP_QUAD, + EV_POWERUP_BATTLESUIT, + EV_POWERUP_REGEN, + + EV_GIB_PLAYER, // gib a previously living player + EV_SCOREPLUM, // score plum + +//#ifdef MISSIONPACK + EV_PROXIMITY_MINE_STICK, + EV_PROXIMITY_MINE_TRIGGER, + EV_KAMIKAZE, // kamikaze explodes + EV_OBELISKEXPLODE, // obelisk explodes + EV_OBELISKPAIN, // obelisk is in pain + EV_INVUL_IMPACT, // invulnerability sphere impact + EV_JUICED, // invulnerability juiced effect + EV_LIGHTNINGBOLT, // lightning bolt bounced of invulnerability sphere +//#endif + + EV_DEBUG_LINE, + EV_STOPLOOPINGSOUND, + EV_TAUNT, + EV_TAUNT_YES, + EV_TAUNT_NO, + EV_TAUNT_FOLLOWME, + EV_TAUNT_GETFLAG, + EV_TAUNT_GUARDBASE, + EV_TAUNT_PATROL, + // + // PKMOD - Ergodic 05/22/00 Events + // + EV_BEARTRAP_DIE, + EV_BEARTRAP_SNAP, //PKMOD - Ergodic 07/01/00 + EV_CHAINLIGHTNING_STRIKE, //PKMOD - Ergodic 08/22/00 + EV_GRAVITY_RELEASED, //PKMOD - Ergodic 07/11/00 + EV_LIGHTNING_FX, //PKMOD - Ergodic 07/19/00 + EV_BEARTRAP_DROP, //PKMOD - Ergodic 08/07/00 + EV_GRAVITYWELL_SUCK, //PKMOD - Ergodic 09/06/00 gravity well item suck sounds from Mongusta + + EV_PKA_NOAMMO, //PKMOD - Ergodic 05/30/00 + EV_ITEM_REMOVE, //PKMOD - Ergodic 11/16/00 - add target_remove code + EV_GLOBAL_ITEM_REMOVE, //PKMOD - Ergodic 11/20/00 - add target_remove code (powerups) + + EV_AUTOSENTRY_DROP, //PKMOD - Ergodic 11/22/00 + EV_AUTOSENTRY_DIE, //PKMOD - Ergodic 11/22/00 + EV_SHOOTER_LIGHTNING, //PKMOD - Ergodic 12/06/00 - special lightning shooter event + + //PKMOD - Ergodic 12/14/00 - add autosentry code for greater tracability + EV_AUTOSENTRY_HIT_WALL, + EV_AUTOSENTRY_HIT_FLESH, + + //PKMOD - Ergodic 12/26/00 add Beans fart noises from Mongusta + EV_BEANS_TOOT, + //PKMOD - Ergodic 01/13/01 - add autosentry fire sounds from mongusta + EV_AUTOSENTRY_FIRE, + //PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water + EV_LIGHTNING_WATER_DISCHARGE, + //PKMOD - Ergodic 01/21/01 - exploding shells debug model + EV_COORD, + //PKMOD - Ergodic 03/26/01 - add autosentry ping sound + EV_AUTOSENTRY_PING, + //PKMOD - Ergodic 07/03/01 ChainLightning reflect sounds + EV_CHAINLIGHTNING_REFLECT, + //PKMOD - Ergodic 12/05/01 - Radiate Item & Radiate Player events + EV_ITEM_RADIATE, + EV_PLAYER_RADIATE, + //PKMOD - Ergodic 01/07/02 - send message to client if not all Private Bot parts are held + EV_INCOMPLETE_PRIVATEBOT, + //PKMOD - Ergodic 02/07/02 - send message to client if Private Bot is completed + EV_COMPLETED_PRIVATEBOT, + //PKMOD - Ergodic 02/10/02 - send FRAG message to Private Bot's owner + EV_PRIVATEBOT_FRAG, + //PKMOD - Ergodic 03/18/02 - send message to client that no more Private Bots are available + EV_NOAVAILABLE_PRIVATEBOTS, + //PKMOD - Ergodic 06/09/02 - create the teleport flash for the personal sentry (teleport in sound) + EV_TELE_IN_PERSONALSENTRY, + //PKMOD - Ergodic 06/12/02 - generate sound effect for firing Personal Sentry + EV_FIRE_PERSONALSENTRY, + //PKMOD - Ergodic 08/03/02 - create the teleport flash for the personal sentry (teleport out sound) + EV_TELE_OUT_PERSONALSENTRY, + //PKMOD - Ergodic 11/20/03 - create earthquake sound for out of range gravity well + //EV_EARTHQUAKE, + //PKMOD - Ergodic 12/06/03 - create charge up sound for CLG striking Beartrap or Autosentry + EV_CHAINLIGHTNING_CHARGE_UP, + //PKMOD - Ergodic 01/05/04 - add quad farting logic for differing CG graphic sequence + EV_QUADBEANS_TOOT +} entity_event_t; + + +typedef enum { + GTS_RED_CAPTURE, + GTS_BLUE_CAPTURE, + GTS_RED_RETURN, + GTS_BLUE_RETURN, + GTS_RED_TAKEN, + GTS_BLUE_TAKEN, + GTS_REDOBELISK_ATTACKED, + GTS_BLUEOBELISK_ATTACKED, + GTS_REDTEAM_SCORED, + GTS_BLUETEAM_SCORED, + GTS_REDTEAM_TOOK_LEAD, + GTS_BLUETEAM_TOOK_LEAD, + GTS_TEAMS_ARE_TIED, + GTS_KAMIKAZE +} global_team_sound_t; + +// animations +typedef enum { + BOTH_DEATH1, + BOTH_DEAD1, + BOTH_DEATH2, + BOTH_DEAD2, + BOTH_DEATH3, + BOTH_DEAD3, + + TORSO_GESTURE, + + TORSO_ATTACK, + TORSO_ATTACK2, + + TORSO_DROP, + TORSO_RAISE, + + TORSO_STAND, + TORSO_STAND2, + + LEGS_WALKCR, + LEGS_WALK, + LEGS_RUN, + LEGS_BACK, + LEGS_SWIM, + + LEGS_JUMP, + LEGS_LAND, + + LEGS_JUMPB, + LEGS_LANDB, + + LEGS_IDLE, + LEGS_IDLECR, + + LEGS_TURN, + + TORSO_GETFLAG, + TORSO_GUARDBASE, + TORSO_PATROL, + TORSO_FOLLOWME, + TORSO_AFFIRMATIVE, + TORSO_NEGATIVE, + + MAX_ANIMATIONS, + + LEGS_BACKCR, + LEGS_BACKWALK, + FLAG_RUN, + FLAG_STAND, + FLAG_STAND2RUN, + + MAX_TOTALANIMATIONS +} animNumber_t; + + +typedef struct animation_s { + int firstFrame; + int numFrames; + int loopFrames; // 0 to numFrames + int frameLerp; // msec between frames + int initialLerp; // msec to get to first frame + int reversed; // true if animation is reversed + int flipflop; // true if animation should flipflop back to base +} animation_t; + + +// flip the togglebit every time an animation +// changes so a restart of the same anim can be detected +#define ANIM_TOGGLEBIT 128 + + +typedef enum { + TEAM_FREE, + TEAM_RED, + TEAM_BLUE, + TEAM_SPECTATOR, + + TEAM_NUM_TEAMS +} team_t; + +// Time between location updates +#define TEAM_LOCATION_UPDATE_TIME 1000 + +// How many players on the overlay +#define TEAM_MAXOVERLAY 32 + +//team task +typedef enum { + TEAMTASK_NONE, + TEAMTASK_OFFENSE, + TEAMTASK_DEFENSE, + TEAMTASK_PATROL, + TEAMTASK_FOLLOW, + TEAMTASK_RETRIEVE, + TEAMTASK_ESCORT, + TEAMTASK_CAMP +} teamtask_t; + +//PKMOD - Ergodic 06/05/03 - list order must match modNames in g_combat.c +/*PKMOD - Ergodic 06/05/03 - removed: + MOD_A2K, + MOD_EMPNUKE, + MOD_HARPOON, + MOD_CHAINLG, +*/ +// means of death +typedef enum { + MOD_UNKNOWN, + MOD_SHOTGUN, + MOD_GAUNTLET, + MOD_MACHINEGUN, + MOD_GRENADE, + MOD_GRENADE_SPLASH, + MOD_ROCKET, + MOD_ROCKET_SPLASH, + MOD_PLASMA, + MOD_PLASMA_SPLASH, + MOD_RAILGUN, + MOD_LIGHTNING, + MOD_BFG, + MOD_BFG_SPLASH, + MOD_WATER, + MOD_SLIME, + MOD_LAVA, + MOD_CRUSH, + MOD_TELEFRAG, + MOD_FALLING, + MOD_SUICIDE, + MOD_TARGET_LASER, + MOD_TRIGGER_HURT, + MOD_GRAPPLE, + //PKMOD -Add Weapons. + MOD_GRAVITY, + MOD_SENTRY, + MOD_BEARTRAP, + MOD_AIRFIST, + MOD_NAILGUN, + MOD_NAIL, //PKMOD - Ergodic 08/01/00 + MOD_EXPLODING_SHELLS, + MOD_EXPLODING_SHELLS_SPLASH, + //PKMOD - Ergodic 12/05/00 - add new types of PKA shooters + MOD_SHOOTER_LIGHTNING, + //PKMOD - Ergodic 01/11/01 - give frag credit to activator of CRUSH Death + MOD_CRUSH_CREDIT, + //PKMOD - Ergodic 01/13/01 - exploding autosentry will produce splash damage + MOD_SENTRY_SPLASH, + //PKMOD - Ergodic 01/15/01 - add Lightning Discharge in water + MOD_LIGHTNING_WATER_DISCHARGE, + //PKMOD - Ergodic 02/01/01 - add can of beans toot damage + MOD_BEANS_BLAST, + //PKMOD - Ergodic 07/02/01 - add reverse damage on lightning from autosentry + MOD_REVERSE_LIGHTNING, + //PKMOD - Ergodic 10/29/01 - add holdable radiation death + MOD_RADIATION, + //PKMOD - Ergodic 06/08/02 - add personal sentry death + MOD_PERSONALSENTRY, + //PKMOD - Ergodic 10/23/02 - Create new Means of Death for the Dragon Blade + MOD_DRAGONBLADE, + //PKMOD - Ergodic 06/06/03 - Create new Means of Death for the Private Bot for logging use in games.log + MOD_PRIVATEBOT, + //PKMOD - Ergodic 01/05/04 - add QUAD FART beans toot damage + MOD_QUADBEANS_BLAST +} meansOfDeath_t; + + +//--------------------------------------------------------- + +// gitem_t->type +typedef enum { + IT_BAD, + IT_WEAPON, // EFX: rotate + upscale + minlight + IT_AMMO, // EFX: rotate + IT_ARMOR, // EFX: rotate + minlight + IT_HEALTH, // EFX: static external sphere + rotating internal + IT_POWERUP, // instant on, timer based + // EFX: rotate + external ring that rotates + IT_HOLDABLE, // single use, holdable item + // EFX: rotate + bob + IT_PERSISTANT_POWERUP, + IT_TEAM, + IT_VOTING, //PKMOD - Ergodic 09/20/00 - Voting Entity + IT_PKARENA_ACTIVE // EFX: No Rotation +} itemType_t; + +#define MAX_ITEM_MODELS 4 + +typedef struct gitem_s { + char *classname; // spawning name + char *pickup_sound; + char *world_model[MAX_ITEM_MODELS]; + + char *icon; + char *pickup_name; // for printing on pickup + + int quantity; // for ammo how much, or duration of powerup + itemType_t giType; // IT_* flags + + int giTag; + + char *precaches; // string of all models and images this item will use + char *sounds; // string of all sounds this item will use +} gitem_t; + +// included in both the game dll and the client +extern gitem_t bg_itemlist[]; +extern int bg_numItems; + +gitem_t *BG_FindItem( const char *pickupName ); +gitem_t *BG_FindItemForWeapon( weapon_t weapon ); +gitem_t *BG_FindItemForPowerup( powerup_t pw ); +gitem_t *BG_FindItemForHoldable( holdable_t pw ); +#define ITEM_INDEX(x) ((x)-bg_itemlist) + +qboolean BG_CanItemBeGrabbed( int gametype, const entityState_t *ent, const playerState_t *ps ); + + +// g_dmflags->integer flags +#define DF_NO_FALLING 8 +#define DF_FIXED_FOV 16 +#define DF_NO_FOOTSTEPS 32 + +// content masks +#define MASK_ALL (-1) +#define MASK_SOLID (CONTENTS_SOLID) +#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_BODY) +#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP) +#define MASK_WATER (CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME) +#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA) +#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE) + + +// +// entityState_t->eType +// +typedef enum { + ET_GENERAL, // 0 + ET_PLAYER, // 1 + ET_ITEM, // 2 + ET_MISSILE, // 3 + ET_MOVER, // 4 + ET_BEAM, // 5 + ET_PORTAL, // 6 + ET_SPEAKER, // 7 + ET_PUSH_TRIGGER, // 8 + ET_TELEPORT_TRIGGER, // 9 + ET_INVISIBLE, // 10 + ET_GRAPPLE, // 11 - grapple hooked on wall + ET_TEAM, // 12 + + //PKMOD Ergodic - 05/29/2000, add PKMOD's event type + ET_BEARTRAP, // 13 + //PKMOD Ergodic - 06/11/2000, add PKMOD's event type + ET_BEARTRAP_FOLLOW, // 14 + //PKMOD Ergodic - 07/01/2000, add PKMOD's event type + ET_GRAVITY_WELL, // 15 + //PKMOD Ergodic - 07/12/2000, add chain lightning event type + ET_CHAIN_LIGHTNING, // 16 + //PKMOD - Ergodic 07/16/00 special spawn functions (lightning_fx) + ET_LIGHTNING_FX, // 17 + //PKMOD - Ergodic 08/03/00 event type for nail entities + ET_NAIL, // 18 + //PKMOD - Ergodic 11/15/00 add functionality to make trigger_push silent + ET_QUIET_TRIGGER, // 19 + //PKMOD - Ergodic 01/29/01 autosentry entries must be contiguous and in order + // Do not change the order of ET_AUTOSENTRY, ET_AUTOSENTRY_DEPLOY, ET_AUTOSENTRY_DEPLOY, + // and ET_AUTOSENTRY_TURRET this will effect missile and hitscan weapons + // //g_weapons: shotgun, railgun, machinegun, and bullets + //PKMOD - Ergodic 11/22/00 add autosentry launch event type + ET_AUTOSENTRY_LAUNCH, // 20 + //PKMOD Ergodic - 11/26/2000, add deploy autosentry entity type + ET_AUTOSENTRY_DEPLOY, // 21 + //PKMOD Ergodic - 12/02/2000, add split autosentry entity types + ET_AUTOSENTRY_BASE, // 22 + ET_AUTOSENTRY_TURRET, // 23 + //PKMOD - Ergodic 03/14/01 - add dragon deployable weapon fire + ET_DRAGON_DEPLOY, // 24 + //PKMOD - Ergodic 06/07/01 - add ZOMBIE entity type + ET_ZOMBIE, // 25 + //PKMOD - Ergodic 08/02/01 - create a new entity type for door_trigger + // fixes the bug of dragon deploy hitting doors + ET_DOOR_TRIGGER, // 26 + //PKMOD - Ergodic 08/02/01 - create a new entity type for trigger_multiple + // fixes the bug of dragon deploy hitting doors + ET_TRIGGER_MULTIPLE, // 27 + //PKMOD - Ergodic 06/09/02 - create a new entity type for the active personal sentry + ET_PERSONALSENTRY, //28 + //PKMOD - Ergodic 08/20/03 - After a new shader beam was added to the CLG, we want to + // differentiate between shooter_Lightning(green) and CLG lightning(red) + ET_SHOOTER_LIGHTNING, //29 + + + ET_EVENTS, // 30 - any of the EV_* events can be added freestanding + // by setting eType to ET_EVENTS + eventNum + // this avoids having to set eFlags and eventNum + //PKMOD Ergodic - 03/29/2000, add airfist event type + ET_AIRFIST // 31 + +} entityType_t; + + + +void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ); +void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ); + +void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps ); + +void BG_TouchJumpPad( playerState_t *ps, entityState_t *jumppad ); + +void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap ); +void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap ); + +qboolean BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime ); + + +#define ARENAS_PER_TIER 4 +#define MAX_ARENAS 1024 +#define MAX_ARENAS_TEXT 8192 + +#define MAX_BOTS 1024 +#define MAX_BOTS_TEXT 8192 + +//PKMOD - Ergodic 03/18/01 - Gravity Well visual paramters +//PKMOD - Ergodic 03/25/01 - add Gravity Well micro contractions + //++++++++++++++++++++++ + // First Expansion + //++++++++++++++++++++++ +#define GWELL_EXPAND_STARTTIME_1 500 +#define GWELL_EXPAND_ENDTIME_1 2000 +#define GWELL_EXPAND_FADETIME_1 1500 +#define GWELL_ORB_RADIUS_1 6 + + //++++++++++++++++++++++ + // First Contraction + //++++++++++++++++++++++ +#define GWELL_CONTRACTION_STARTTIME_1 2000 +#define GWELL_CONTRACTION_ENDTIME_1 2500 +#define GWELL_CONTRACTION_FADETIME_1 2250 + + //++++++++++++++++++++++ + // Second Expansion + //++++++++++++++++++++++ +#define GWELL_EXPAND_STARTTIME_2 2500 +#define GWELL_EXPAND_ENDTIME_2 4000 +#define GWELL_EXPAND_FADETIME_2 3500 +#define GWELL_ORB_RADIUS_2 6 + + //++++++++++++++++++++++ + // Second Contraction + //++++++++++++++++++++++ +#define GWELL_CONTRACTION_STARTTIME_2 4000 +#define GWELL_CONTRACTION_ENDTIME_2 4500 +#define GWELL_CONTRACTION_FADETIME_2 4250 + + //++++++++++++++++++++++ + // Third Expansion + //++++++++++++++++++++++ +#define GWELL_EXPAND_STARTTIME_3 4500 +#define GWELL_EXPAND_ENDTIME_3 6000 +#define GWELL_EXPAND_FADETIME_3 5500 +#define GWELL_ORB_RADIUS_3 6 + + //++++++++++++++++++++++ + // Third Contraction + //++++++++++++++++++++++ +#define GWELL_CONTRACTION_STARTTIME_3 6000 +#define GWELL_CONTRACTION_ENDTIME_3 8000 +#define GWELL_CONTRACTION_FADETIME_3 7500 + +#define GWELL_SHOCKWAVE_MAXRADIUS 1000 +#define GWELL_SHOCKWAVE2_MAXRADIUS 1000 + +// Kamikaze + +// 1st shockwave times +#define KAMI_SHOCKWAVE_STARTTIME 0 +#define KAMI_SHOCKWAVEFADE_STARTTIME 1500 +#define KAMI_SHOCKWAVE_ENDTIME 2000 +// explosion/implosion times +#define KAMI_EXPLODE_STARTTIME 250 +#define KAMI_IMPLODE_STARTTIME 2000 +#define KAMI_IMPLODE_ENDTIME 2250 +// 2nd shockwave times +#define KAMI_SHOCKWAVE2_STARTTIME 2000 +#define KAMI_SHOCKWAVE2FADE_STARTTIME 2500 +#define KAMI_SHOCKWAVE2_ENDTIME 3000 +// radius of the models without scaling +#define KAMI_SHOCKWAVEMODEL_RADIUS 88 +#define KAMI_BOOMSPHEREMODEL_RADIUS 72 +// maximum radius of the models during the effect +#define KAMI_SHOCKWAVE_MAXRADIUS 1320 +#define KAMI_BOOMSPHERE_MAXRADIUS 720 +#define KAMI_SHOCKWAVE2_MAXRADIUS 704 + +//PKMOD - Ergodic 09/26/2000, hub voting entities +//PKMOD - Ergodic 09/15/2003, increase Index from 25 - 35, and increase name NAME from 50 to 70 +#define MAX_HUB_INDEX 35 //maximum voting_images in the HUB +#define MAX_HUB_NAME 70 //maximum size of mapname and maptitle + +#define MAX_HUB_DISPLAY_NAME 40 //03/29/04 - maximum name size that is displayed in voting UI menu + +typedef struct ghubInfo_s { + int map_votes; + char map_name[MAX_HUB_NAME]; + char map_title[MAX_HUB_NAME]; + int map_shader_index; +} ghubInfo_t; + +//PKMOD - Ergodic 09/27/2000, included in both the game dll and the client +extern int Hub_Index; //points to last Hub element +extern ghubInfo_t hubInfo[]; + +//PKMOD - Ergodic 09/27/2000, included in both the game dll and the client +typedef struct ghubsort_s { + int map_votes; + int hub_index; +} ghubsort_t; + +//PKMOD - Ergodic 10/13/01 - define constants for new holdables +#define PLAYER_RADIATE_TIME 25 + +//PKMOD - Ergodic 05/07/02 - define constants for new holdables +#define PLAYER_PERSENTRY_TIME 25 + +//PKMOD - Ergodic 12/12/01 - PRIVATE BOT definitions +#define MAX_PRIVATE_BOTS 5 //augment sv_maxclients +//PKMOD - Ergodic 01/13/02 - PRIVATE BOT definitions +extern int active_private_bots; //number of active Private Bots + +//PKMOD - Ergodic 10/10/03 - Maximum charge to the Beartrap or Autosentry to make it invisible +//PKMOD - Ergodic 12/13/03 - change value from 70 to 50 +//PKMOD - Ergodic 03/17/04 - change value from 50 to 25 +#define MAX_INVISIBILITY_CHARGE 25 + + diff --git a/quake3/source/code/game/bg_slidemove.c b/quake3/source/code/game/bg_slidemove.c new file mode 100644 index 0000000..1f09492 --- /dev/null +++ b/quake3/source/code/game/bg_slidemove.c @@ -0,0 +1,305 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// bg_slidemove.c -- part of bg_pmove functionality + +#include "q_shared.h" +#include "bg_public.h" +#include "bg_local.h" + +/* + +input: origin, velocity, bounds, groundPlane, trace function + +output: origin, velocity, impacts, stairup boolean + +*/ + +/* +================== +PM_SlideMove + +Returns qtrue if the velocity was clipped in some way +================== +*/ +#define MAX_CLIP_PLANES 5 +qboolean PM_SlideMove( qboolean gravity ) { + int bumpcount, numbumps; + vec3_t dir; + float d; + int numplanes; + vec3_t planes[MAX_CLIP_PLANES]; + vec3_t primal_velocity; + vec3_t clipVelocity; + int i, j, k; + trace_t trace; + vec3_t end; + float time_left; + float into; + vec3_t endVelocity; + vec3_t endClipVelocity; + + numbumps = 4; + + VectorCopy (pm->ps->velocity, primal_velocity); + + if ( gravity ) { + VectorCopy( pm->ps->velocity, endVelocity ); + endVelocity[2] -= pm->ps->gravity * pml.frametime; + pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5; + primal_velocity[2] = endVelocity[2]; + if ( pml.groundPlane ) { + // slide along the ground plane + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP ); + } + } + + time_left = pml.frametime; + + // never turn against the ground plane + if ( pml.groundPlane ) { + numplanes = 1; + VectorCopy( pml.groundTrace.plane.normal, planes[0] ); + } else { + numplanes = 0; + } + + // never turn against original velocity + VectorNormalize2( pm->ps->velocity, planes[numplanes] ); + numplanes++; + + for ( bumpcount=0 ; bumpcount < numbumps ; bumpcount++ ) { + + // calculate position we are trying to move to + VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end ); + + // see if we can make it there + pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask); + + if (trace.allsolid) { + // entity is completely trapped in another solid + pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration + return qtrue; + } + + if (trace.fraction > 0) { + // actually covered some distance + VectorCopy (trace.endpos, pm->ps->origin); + } + + if (trace.fraction == 1) { + break; // moved the entire distance + } + + // save entity for contact + PM_AddTouchEnt( trace.entityNum ); + + time_left -= time_left * trace.fraction; + + if (numplanes >= MAX_CLIP_PLANES) { + // this shouldn't really happen + VectorClear( pm->ps->velocity ); + return qtrue; + } + + // + // if this is the same plane we hit before, nudge velocity + // out along it, which fixes some epsilon issues with + // non-axial planes + // + for ( i = 0 ; i < numplanes ; i++ ) { + if ( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) { + VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity ); + break; + } + } + if ( i < numplanes ) { + continue; + } + VectorCopy (trace.plane.normal, planes[numplanes]); + numplanes++; + + // + // modify velocity so it parallels all of the clip planes + // + + // find a plane that it enters + for ( i = 0 ; i < numplanes ; i++ ) { + into = DotProduct( pm->ps->velocity, planes[i] ); + if ( into >= 0.1 ) { + continue; // move doesn't interact with the plane + } + + // see how hard we are hitting things + if ( -into > pml.impactSpeed ) { + pml.impactSpeed = -into; + } + + // slide along the plane + PM_ClipVelocity (pm->ps->velocity, planes[i], clipVelocity, OVERCLIP ); + + // slide along the plane + PM_ClipVelocity (endVelocity, planes[i], endClipVelocity, OVERCLIP ); + + // see if there is a second plane that the new move enters + for ( j = 0 ; j < numplanes ; j++ ) { + if ( j == i ) { + continue; + } + if ( DotProduct( clipVelocity, planes[j] ) >= 0.1 ) { + continue; // move doesn't interact with the plane + } + + // try clipping the move to the plane + PM_ClipVelocity( clipVelocity, planes[j], clipVelocity, OVERCLIP ); + PM_ClipVelocity( endClipVelocity, planes[j], endClipVelocity, OVERCLIP ); + + // see if it goes back into the first clip plane + if ( DotProduct( clipVelocity, planes[i] ) >= 0 ) { + continue; + } + + // slide the original velocity along the crease + CrossProduct (planes[i], planes[j], dir); + VectorNormalize( dir ); + d = DotProduct( dir, pm->ps->velocity ); + VectorScale( dir, d, clipVelocity ); + + CrossProduct (planes[i], planes[j], dir); + VectorNormalize( dir ); + d = DotProduct( dir, endVelocity ); + VectorScale( dir, d, endClipVelocity ); + + // see if there is a third plane the the new move enters + for ( k = 0 ; k < numplanes ; k++ ) { + if ( k == i || k == j ) { + continue; + } + if ( DotProduct( clipVelocity, planes[k] ) >= 0.1 ) { + continue; // move doesn't interact with the plane + } + + // stop dead at a tripple plane interaction + VectorClear( pm->ps->velocity ); + return qtrue; + } + } + + // if we have fixed all interactions, try another move + VectorCopy( clipVelocity, pm->ps->velocity ); + VectorCopy( endClipVelocity, endVelocity ); + break; + } + } + + if ( gravity ) { + VectorCopy( endVelocity, pm->ps->velocity ); + } + + // don't change velocity if in a timer (FIXME: is this correct?) + if ( pm->ps->pm_time ) { + VectorCopy( primal_velocity, pm->ps->velocity ); + } + + return ( bumpcount != 0 ); +} + +/* +================== +PM_StepSlideMove + +================== +*/ +void PM_StepSlideMove( qboolean gravity ) { + vec3_t start_o, start_v; + vec3_t down_o, down_v; + trace_t trace; +// float down_dist, up_dist; +// vec3_t delta, delta2; + vec3_t up, down; + float stepSize; + + VectorCopy (pm->ps->origin, start_o); + VectorCopy (pm->ps->velocity, start_v); + + if ( PM_SlideMove( gravity ) == 0 ) { + return; // we got exactly where we wanted to go first try + } + + VectorCopy(start_o, down); + down[2] -= STEPSIZE; + pm->trace (&trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask); + VectorSet(up, 0, 0, 1); + // never step up when you still have up velocity + if ( pm->ps->velocity[2] > 0 && (trace.fraction == 1.0 || + DotProduct(trace.plane.normal, up) < 0.7)) { + return; + } + + VectorCopy (pm->ps->origin, down_o); + VectorCopy (pm->ps->velocity, down_v); + + VectorCopy (start_o, up); + up[2] += STEPSIZE; + + // test the player position if they were a stepheight higher + pm->trace (&trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask); + if ( trace.allsolid ) { + if ( pm->debugLevel ) { + Com_Printf("%i:bend can't step\n", c_pmove); + } + return; // can't step up + } + + stepSize = trace.endpos[2] - start_o[2]; + // try slidemove from this position + VectorCopy (trace.endpos, pm->ps->origin); + VectorCopy (start_v, pm->ps->velocity); + + PM_SlideMove( gravity ); + + // push down the final amount + VectorCopy (pm->ps->origin, down); + down[2] -= stepSize; + pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask); + if ( !trace.allsolid ) { + VectorCopy (trace.endpos, pm->ps->origin); + } + if ( trace.fraction < 1.0 ) { + PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP ); + } + +#if 0 + // if the down trace can trace back to the original position directly, don't step + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, start_o, pm->ps->clientNum, pm->tracemask); + if ( trace.fraction == 1.0 ) { + // use the original move + VectorCopy (down_o, pm->ps->origin); + VectorCopy (down_v, pm->ps->velocity); + if ( pm->debugLevel ) { + Com_Printf("%i:bend\n", c_pmove); + } + } else +#endif + { + // use the step move + float delta; + + delta = pm->ps->origin[2] - start_o[2]; + if ( delta > 2 ) { + if ( delta < 7 ) { + PM_AddEvent( EV_STEP_4 ); + } else if ( delta < 11 ) { + PM_AddEvent( EV_STEP_8 ); + } else if ( delta < 15 ) { + PM_AddEvent( EV_STEP_12 ); + } else { + PM_AddEvent( EV_STEP_16 ); + } + } + if ( pm->debugLevel ) { + Com_Printf("%i:stepped\n", c_pmove); + } + } +} + diff --git a/quake3/source/code/game/botlib.h b/quake3/source/code/game/botlib.h new file mode 100644 index 0000000..39c92fe --- /dev/null +++ b/quake3/source/code/game/botlib.h @@ -0,0 +1,496 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +/***************************************************************************** + * name: botlib.h + * + * desc: bot AI library + * + * $Archive: /source/code/game/botai.h $ + * + *****************************************************************************/ + +#define BOTLIB_API_VERSION 2 + +struct aas_clientmove_s; +struct aas_entityinfo_s; +struct aas_areainfo_s; +struct aas_altroutegoal_s; +struct aas_predictroute_s; +struct bot_consolemessage_s; +struct bot_match_s; +struct bot_goal_s; +struct bot_moveresult_s; +struct bot_initmove_s; +struct weaponinfo_s; + +#define BOTFILESBASEFOLDER "botfiles" +//debug line colors +#define LINECOLOR_NONE -1 +#define LINECOLOR_RED 1//0xf2f2f0f0L +#define LINECOLOR_GREEN 2//0xd0d1d2d3L +#define LINECOLOR_BLUE 3//0xf3f3f1f1L +#define LINECOLOR_YELLOW 4//0xdcdddedfL +#define LINECOLOR_ORANGE 5//0xe0e1e2e3L + +//Print types +#define PRT_MESSAGE 1 +#define PRT_WARNING 2 +#define PRT_ERROR 3 +#define PRT_FATAL 4 +#define PRT_EXIT 5 + +//console message types +#define CMS_NORMAL 0 +#define CMS_CHAT 1 + +//botlib error codes +#define BLERR_NOERROR 0 //no error +#define BLERR_LIBRARYNOTSETUP 1 //library not setup +#define BLERR_INVALIDENTITYNUMBER 2 //invalid entity number +#define BLERR_NOAASFILE 3 //no AAS file available +#define BLERR_CANNOTOPENAASFILE 4 //cannot open AAS file +#define BLERR_WRONGAASFILEID 5 //incorrect AAS file id +#define BLERR_WRONGAASFILEVERSION 6 //incorrect AAS file version +#define BLERR_CANNOTREADAASLUMP 7 //cannot read AAS file lump +#define BLERR_CANNOTLOADICHAT 8 //cannot load initial chats +#define BLERR_CANNOTLOADITEMWEIGHTS 9 //cannot load item weights +#define BLERR_CANNOTLOADITEMCONFIG 10 //cannot load item config +#define BLERR_CANNOTLOADWEAPONWEIGHTS 11 //cannot load weapon weights +#define BLERR_CANNOTLOADWEAPONCONFIG 12 //cannot load weapon config + +//action flags +#define ACTION_ATTACK 0x0000001 +#define ACTION_USE 0x0000002 +#define ACTION_RESPAWN 0x0000008 +#define ACTION_JUMP 0x0000010 +#define ACTION_MOVEUP 0x0000020 +#define ACTION_CROUCH 0x0000080 +#define ACTION_MOVEDOWN 0x0000100 +#define ACTION_MOVEFORWARD 0x0000200 +#define ACTION_MOVEBACK 0x0000800 +#define ACTION_MOVELEFT 0x0001000 +#define ACTION_MOVERIGHT 0x0002000 +#define ACTION_DELAYEDJUMP 0x0008000 +#define ACTION_TALK 0x0010000 +#define ACTION_GESTURE 0x0020000 +#define ACTION_WALK 0x0080000 +#define ACTION_AFFIRMATIVE 0x0100000 +#define ACTION_NEGATIVE 0x0200000 +#define ACTION_GETFLAG 0x0800000 +#define ACTION_GUARDBASE 0x1000000 +#define ACTION_PATROL 0x2000000 +#define ACTION_FOLLOWME 0x8000000 + +//the bot input, will be converted to an usercmd_t +typedef struct bot_input_s +{ + float thinktime; //time since last output (in seconds) + vec3_t dir; //movement direction + float speed; //speed in the range [0, 400] + vec3_t viewangles; //the view angles + int actionflags; //one of the ACTION_? flags + int weapon; //weapon to use +} bot_input_t; + +#ifndef BSPTRACE + +#define BSPTRACE + +//bsp_trace_t hit surface +typedef struct bsp_surface_s +{ + char name[16]; + int flags; + int value; +} bsp_surface_t; + +//remove the bsp_trace_s structure definition l8r on +//a trace is returned when a box is swept through the world +typedef struct bsp_trace_s +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + cplane_t plane; // surface normal at impact + float exp_dist; // expanded plane distance + int sidenum; // number of the brush side hit + bsp_surface_t surface; // the hit point surface + int contents; // contents on other side of surface hit + int ent; // number of entity hit +} bsp_trace_t; + +#endif // BSPTRACE + +//entity state +typedef struct bot_entitystate_s +{ + int type; // entity type + int flags; // entity flags + vec3_t origin; // origin of the entity + vec3_t angles; // angles of the model + vec3_t old_origin; // for lerping + vec3_t mins; // bounding box minimums + vec3_t maxs; // bounding box maximums + int groundent; // ground entity + int solid; // solid type + int modelindex; // model used + int modelindex2; // weapons, CTF flags, etc + int frame; // model frame number + int event; // impulse events -- muzzle flashes, footsteps, etc + int eventParm; // even parameter + int powerups; // bit flags + int weapon; // determines weapon and flash model, etc + int legsAnim; // mask off ANIM_TOGGLEBIT + int torsoAnim; // mask off ANIM_TOGGLEBIT +} bot_entitystate_t; + +//bot AI library exported functions +typedef struct botlib_import_s +{ + //print messages from the bot library + void (QDECL *Print)(int type, char *fmt, ...); + //trace a bbox through the world + void (*Trace)(bsp_trace_t *trace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask); + //trace a bbox against a specific entity + void (*EntityTrace)(bsp_trace_t *trace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int entnum, int contentmask); + //retrieve the contents at the given point + int (*PointContents)(vec3_t point); + //check if the point is in potential visible sight + int (*inPVS)(vec3_t p1, vec3_t p2); + //retrieve the BSP entity data lump + char *(*BSPEntityData)(void); + // + void (*BSPModelMinsMaxsOrigin)(int modelnum, vec3_t angles, vec3_t mins, vec3_t maxs, vec3_t origin); + //send a bot client command + void (*BotClientCommand)(int client, char *command); + //memory allocation + void *(*GetMemory)(int size); // allocate from Zone + void (*FreeMemory)(void *ptr); // free memory from Zone + int (*AvailableMemory)(void); // available Zone memory + void *(*HunkAlloc)(int size); // allocate from hunk + //file system access + int (*FS_FOpenFile)( const char *qpath, fileHandle_t *file, fsMode_t mode ); + int (*FS_Read)( void *buffer, int len, fileHandle_t f ); + int (*FS_Write)( const void *buffer, int len, fileHandle_t f ); + void (*FS_FCloseFile)( fileHandle_t f ); + int (*FS_Seek)( fileHandle_t f, long offset, int origin ); + //debug visualisation stuff + int (*DebugLineCreate)(void); + void (*DebugLineDelete)(int line); + void (*DebugLineShow)(int line, vec3_t start, vec3_t end, int color); + // + int (*DebugPolygonCreate)(int color, int numPoints, vec3_t *points); + void (*DebugPolygonDelete)(int id); +} botlib_import_t; + +typedef struct aas_export_s +{ + //----------------------------------- + // be_aas_entity.h + //----------------------------------- + void (*AAS_EntityInfo)(int entnum, struct aas_entityinfo_s *info); + //----------------------------------- + // be_aas_main.h + //----------------------------------- + int (*AAS_Initialized)(void); + void (*AAS_PresenceTypeBoundingBox)(int presencetype, vec3_t mins, vec3_t maxs); + float (*AAS_Time)(void); + //-------------------------------------------- + // be_aas_sample.c + //-------------------------------------------- + int (*AAS_PointAreaNum)(vec3_t point); + int (*AAS_PointReachabilityAreaIndex)( vec3_t point ); + int (*AAS_TraceAreas)(vec3_t start, vec3_t end, int *areas, vec3_t *points, int maxareas); + int (*AAS_BBoxAreas)(vec3_t absmins, vec3_t absmaxs, int *areas, int maxareas); + int (*AAS_AreaInfo)( int areanum, struct aas_areainfo_s *info ); + //-------------------------------------------- + // be_aas_bspq3.c + //-------------------------------------------- + int (*AAS_PointContents)(vec3_t point); + int (*AAS_NextBSPEntity)(int ent); + int (*AAS_ValueForBSPEpairKey)(int ent, char *key, char *value, int size); + int (*AAS_VectorForBSPEpairKey)(int ent, char *key, vec3_t v); + int (*AAS_FloatForBSPEpairKey)(int ent, char *key, float *value); + int (*AAS_IntForBSPEpairKey)(int ent, char *key, int *value); + //-------------------------------------------- + // be_aas_reach.c + //-------------------------------------------- + int (*AAS_AreaReachability)(int areanum); + //-------------------------------------------- + // be_aas_route.c + //-------------------------------------------- + int (*AAS_AreaTravelTimeToGoalArea)(int areanum, vec3_t origin, int goalareanum, int travelflags); + int (*AAS_EnableRoutingArea)(int areanum, int enable); + int (*AAS_PredictRoute)(struct aas_predictroute_s *route, int areanum, vec3_t origin, + int goalareanum, int travelflags, int maxareas, int maxtime, + int stopevent, int stopcontents, int stoptfl, int stopareanum); + //-------------------------------------------- + // be_aas_altroute.c + //-------------------------------------------- + int (*AAS_AlternativeRouteGoals)(vec3_t start, int startareanum, vec3_t goal, int goalareanum, int travelflags, + struct aas_altroutegoal_s *altroutegoals, int maxaltroutegoals, + int type); + //-------------------------------------------- + // be_aas_move.c + //-------------------------------------------- + int (*AAS_Swimming)(vec3_t origin); + int (*AAS_PredictClientMovement)(struct aas_clientmove_s *move, + int entnum, vec3_t origin, + int presencetype, int onground, + vec3_t velocity, vec3_t cmdmove, + int cmdframes, + int maxframes, float frametime, + int stopevent, int stopareanum, int visualize); +} aas_export_t; + +typedef struct ea_export_s +{ + //ClientCommand elementary actions + void (*EA_Command)(int client, char *command ); + void (*EA_Say)(int client, char *str); + void (*EA_SayTeam)(int client, char *str); + // + void (*EA_Action)(int client, int action); + void (*EA_Gesture)(int client); + void (*EA_Talk)(int client); + void (*EA_Attack)(int client); + void (*EA_Use)(int client); + void (*EA_Respawn)(int client); + void (*EA_MoveUp)(int client); + void (*EA_MoveDown)(int client); + void (*EA_MoveForward)(int client); + void (*EA_MoveBack)(int client); + void (*EA_MoveLeft)(int client); + void (*EA_MoveRight)(int client); + void (*EA_Crouch)(int client); + + void (*EA_SelectWeapon)(int client, int weapon); + void (*EA_Jump)(int client); + void (*EA_DelayedJump)(int client); + void (*EA_Move)(int client, vec3_t dir, float speed); + void (*EA_View)(int client, vec3_t viewangles); + //send regular input to the server + void (*EA_EndRegular)(int client, float thinktime); + void (*EA_GetInput)(int client, float thinktime, bot_input_t *input); + void (*EA_ResetInput)(int client); +} ea_export_t; + +typedef struct ai_export_s +{ + //----------------------------------- + // be_ai_char.h + //----------------------------------- + int (*BotLoadCharacter)(char *charfile, float skill); + void (*BotFreeCharacter)(int character); + float (*Characteristic_Float)(int character, int index); + float (*Characteristic_BFloat)(int character, int index, float min, float max); + int (*Characteristic_Integer)(int character, int index); + int (*Characteristic_BInteger)(int character, int index, int min, int max); + void (*Characteristic_String)(int character, int index, char *buf, int size); + //----------------------------------- + // be_ai_chat.h + //----------------------------------- + int (*BotAllocChatState)(void); + void (*BotFreeChatState)(int handle); + void (*BotQueueConsoleMessage)(int chatstate, int type, char *message); + void (*BotRemoveConsoleMessage)(int chatstate, int handle); + int (*BotNextConsoleMessage)(int chatstate, struct bot_consolemessage_s *cm); + int (*BotNumConsoleMessages)(int chatstate); + void (*BotInitialChat)(int chatstate, char *type, int mcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7); + int (*BotNumInitialChats)(int chatstate, char *type); + int (*BotReplyChat)(int chatstate, char *message, int mcontext, int vcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7); + int (*BotChatLength)(int chatstate); + void (*BotEnterChat)(int chatstate, int client, int sendto); + void (*BotGetChatMessage)(int chatstate, char *buf, int size); + int (*StringContains)(char *str1, char *str2, int casesensitive); + int (*BotFindMatch)(char *str, struct bot_match_s *match, unsigned long int context); + void (*BotMatchVariable)(struct bot_match_s *match, int variable, char *buf, int size); + void (*UnifyWhiteSpaces)(char *string); + void (*BotReplaceSynonyms)(char *string, unsigned long int context); + int (*BotLoadChatFile)(int chatstate, char *chatfile, char *chatname); + void (*BotSetChatGender)(int chatstate, int gender); + void (*BotSetChatName)(int chatstate, char *name, int client); + //----------------------------------- + // be_ai_goal.h + //----------------------------------- + void (*BotResetGoalState)(int goalstate); + void (*BotResetAvoidGoals)(int goalstate); + void (*BotRemoveFromAvoidGoals)(int goalstate, int number); + void (*BotPushGoal)(int goalstate, struct bot_goal_s *goal); + void (*BotPopGoal)(int goalstate); + void (*BotEmptyGoalStack)(int goalstate); + void (*BotDumpAvoidGoals)(int goalstate); + void (*BotDumpGoalStack)(int goalstate); + void (*BotGoalName)(int number, char *name, int size); + int (*BotGetTopGoal)(int goalstate, struct bot_goal_s *goal); + int (*BotGetSecondGoal)(int goalstate, struct bot_goal_s *goal); + int (*BotChooseLTGItem)(int goalstate, vec3_t origin, int *inventory, int travelflags); + int (*BotChooseNBGItem)(int goalstate, vec3_t origin, int *inventory, int travelflags, + struct bot_goal_s *ltg, float maxtime); + int (*BotTouchingGoal)(vec3_t origin, struct bot_goal_s *goal); + int (*BotItemGoalInVisButNotVisible)(int viewer, vec3_t eye, vec3_t viewangles, struct bot_goal_s *goal); + int (*BotGetLevelItemGoal)(int index, char *classname, struct bot_goal_s *goal); + int (*BotGetNextCampSpotGoal)(int num, struct bot_goal_s *goal); + int (*BotGetMapLocationGoal)(char *name, struct bot_goal_s *goal); + float (*BotAvoidGoalTime)(int goalstate, int number); + void (*BotSetAvoidGoalTime)(int goalstate, int number, float avoidtime); + void (*BotInitLevelItems)(void); + void (*BotUpdateEntityItems)(void); + int (*BotLoadItemWeights)(int goalstate, char *filename); + void (*BotFreeItemWeights)(int goalstate); + void (*BotInterbreedGoalFuzzyLogic)(int parent1, int parent2, int child); + void (*BotSaveGoalFuzzyLogic)(int goalstate, char *filename); + void (*BotMutateGoalFuzzyLogic)(int goalstate, float range); + int (*BotAllocGoalState)(int client); + void (*BotFreeGoalState)(int handle); + //----------------------------------- + // be_ai_move.h + //----------------------------------- + void (*BotResetMoveState)(int movestate); + void (*BotMoveToGoal)(struct bot_moveresult_s *result, int movestate, struct bot_goal_s *goal, int travelflags); + int (*BotMoveInDirection)(int movestate, vec3_t dir, float speed, int type); + void (*BotResetAvoidReach)(int movestate); + void (*BotResetLastAvoidReach)(int movestate); + int (*BotReachabilityArea)(vec3_t origin, int testground); + int (*BotMovementViewTarget)(int movestate, struct bot_goal_s *goal, int travelflags, float lookahead, vec3_t target); + int (*BotPredictVisiblePosition)(vec3_t origin, int areanum, struct bot_goal_s *goal, int travelflags, vec3_t target); + int (*BotAllocMoveState)(void); + void (*BotFreeMoveState)(int handle); + void (*BotInitMoveState)(int handle, struct bot_initmove_s *initmove); + void (*BotAddAvoidSpot)(int movestate, vec3_t origin, float radius, int type); + //----------------------------------- + // be_ai_weap.h + //----------------------------------- + int (*BotChooseBestFightWeapon)(int weaponstate, int *inventory); + void (*BotGetWeaponInfo)(int weaponstate, int weapon, struct weaponinfo_s *weaponinfo); + int (*BotLoadWeaponWeights)(int weaponstate, char *filename); + int (*BotAllocWeaponState)(void); + void (*BotFreeWeaponState)(int weaponstate); + void (*BotResetWeaponState)(int weaponstate); + //----------------------------------- + // be_ai_gen.h + //----------------------------------- + int (*GeneticParentsAndChildSelection)(int numranks, float *ranks, int *parent1, int *parent2, int *child); +} ai_export_t; + +//bot AI library imported functions +typedef struct botlib_export_s +{ + //Area Awareness System functions + aas_export_t aas; + //Elementary Action functions + ea_export_t ea; + //AI functions + ai_export_t ai; + //setup the bot library, returns BLERR_ + int (*BotLibSetup)(void); + //shutdown the bot library, returns BLERR_ + int (*BotLibShutdown)(void); + //sets a library variable returns BLERR_ + int (*BotLibVarSet)(char *var_name, char *value); + //gets a library variable returns BLERR_ + int (*BotLibVarGet)(char *var_name, char *value, int size); + + //sets a C-like define returns BLERR_ + int (*PC_AddGlobalDefine)(char *string); + int (*PC_LoadSourceHandle)(const char *filename); + int (*PC_FreeSourceHandle)(int handle); + int (*PC_ReadTokenHandle)(int handle, pc_token_t *pc_token); + int (*PC_SourceFileAndLine)(int handle, char *filename, int *line); + + //start a frame in the bot library + int (*BotLibStartFrame)(float time); + //load a new map in the bot library + int (*BotLibLoadMap)(const char *mapname); + //entity updates + int (*BotLibUpdateEntity)(int ent, bot_entitystate_t *state); + //just for testing + int (*Test)(int parm0, char *parm1, vec3_t parm2, vec3_t parm3); +} botlib_export_t; + +//linking of bot library +botlib_export_t *GetBotLibAPI( int apiVersion, botlib_import_t *import ); + +/* Library variables: + +name: default: module(s): description: + +"basedir" "" l_utils.c base directory +"gamedir" "" l_utils.c game directory +"cddir" "" l_utils.c CD directory + +"log" "0" l_log.c enable/disable creating a log file +"maxclients" "4" be_interface.c maximum number of clients +"maxentities" "1024" be_interface.c maximum number of entities +"bot_developer" "0" be_interface.c bot developer mode + +"phys_friction" "6" be_aas_move.c ground friction +"phys_stopspeed" "100" be_aas_move.c stop speed +"phys_gravity" "800" be_aas_move.c gravity value +"phys_waterfriction" "1" be_aas_move.c water friction +"phys_watergravity" "400" be_aas_move.c gravity in water +"phys_maxvelocity" "320" be_aas_move.c maximum velocity +"phys_maxwalkvelocity" "320" be_aas_move.c maximum walk velocity +"phys_maxcrouchvelocity" "100" be_aas_move.c maximum crouch velocity +"phys_maxswimvelocity" "150" be_aas_move.c maximum swim velocity +"phys_walkaccelerate" "10" be_aas_move.c walk acceleration +"phys_airaccelerate" "1" be_aas_move.c air acceleration +"phys_swimaccelerate" "4" be_aas_move.c swim acceleration +"phys_maxstep" "18" be_aas_move.c maximum step height +"phys_maxsteepness" "0.7" be_aas_move.c maximum floor steepness +"phys_maxbarrier" "32" be_aas_move.c maximum barrier height +"phys_maxwaterjump" "19" be_aas_move.c maximum waterjump height +"phys_jumpvel" "270" be_aas_move.c jump z velocity +"phys_falldelta5" "40" be_aas_move.c +"phys_falldelta10" "60" be_aas_move.c +"rs_waterjump" "400" be_aas_move.c +"rs_teleport" "50" be_aas_move.c +"rs_barrierjump" "100" be_aas_move.c +"rs_startcrouch" "300" be_aas_move.c +"rs_startgrapple" "500" be_aas_move.c +"rs_startwalkoffledge" "70" be_aas_move.c +"rs_startjump" "300" be_aas_move.c +"rs_rocketjump" "500" be_aas_move.c +"rs_bfgjump" "500" be_aas_move.c +"rs_jumppad" "250" be_aas_move.c +"rs_aircontrolledjumppad" "300" be_aas_move.c +"rs_funcbob" "300" be_aas_move.c +"rs_startelevator" "50" be_aas_move.c +"rs_falldamage5" "300" be_aas_move.c +"rs_falldamage10" "500" be_aas_move.c +"rs_maxjumpfallheight" "450" be_aas_move.c + +"max_aaslinks" "4096" be_aas_sample.c maximum links in the AAS +"max_routingcache" "4096" be_aas_route.c maximum routing cache size in KB +"forceclustering" "0" be_aas_main.c force recalculation of clusters +"forcereachability" "0" be_aas_main.c force recalculation of reachabilities +"forcewrite" "0" be_aas_main.c force writing of aas file +"aasoptimize" "0" be_aas_main.c enable aas optimization +"sv_mapChecksum" "0" be_aas_main.c BSP file checksum +"bot_visualizejumppads" "0" be_aas_reach.c visualize jump pads + +"bot_reloadcharacters" "0" - reload bot character files +"ai_gametype" "0" be_ai_goal.c game type +"droppedweight" "1000" be_ai_goal.c additional dropped item weight +"weapindex_rocketlauncher" "5" be_ai_move.c rl weapon index for rocket jumping +"weapindex_bfg10k" "9" be_ai_move.c bfg weapon index for bfg jumping +"weapindex_grapple" "10" be_ai_move.c grapple weapon index for grappling +"entitytypemissile" "3" be_ai_move.c ET_MISSILE +"offhandgrapple" "0" be_ai_move.c enable off hand grapple hook +"cmd_grappleon" "grappleon" be_ai_move.c command to activate off hand grapple +"cmd_grappleoff" "grappleoff" be_ai_move.c command to deactivate off hand grapple +"itemconfig" "items.c" be_ai_goal.c item configuration file +"weaponconfig" "weapons.c" be_ai_weap.c weapon configuration file +"synfile" "syn.c" be_ai_chat.c file with synonyms +"rndfile" "rnd.c" be_ai_chat.c file with random strings +"matchfile" "match.c" be_ai_chat.c file with match strings +"nochat" "0" be_ai_chat.c disable chats +"max_messages" "1024" be_ai_chat.c console message heap size +"max_weaponinfo" "32" be_ai_weap.c maximum number of weapon info +"max_projectileinfo" "32" be_ai_weap.c maximum number of projectile info +"max_iteminfo" "256" be_ai_goal.c maximum number of item info +"max_levelitems" "256" be_ai_goal.c maximum number of level items + +*/ + diff --git a/quake3/source/code/game/chars.h b/quake3/source/code/game/chars.h new file mode 100644 index 0000000..d4a877b --- /dev/null +++ b/quake3/source/code/game/chars.h @@ -0,0 +1,135 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +//=========================================================================== +// +// Name: chars.h +// Function: bot characteristics +// Programmer: Mr Elusive (MrElusive@idsoftware.com) +// Last update: 1999-09-08 +// Last update: 2000-09-07 PKMOD Ergodic - PainkeepArena Integration +// 2000-10-16 PKMOD Ergodic, fixed characteristic 48, af and walker bug +// Tab Size: 4 (real tabs) +//=========================================================================== + + +//======================================================== +//======================================================== +//name +#define CHARACTERISTIC_NAME 0 //string +//gender of the bot +#define CHARACTERISTIC_GENDER 1 //string ("male", "female", "it") +//attack skill +// > 0.0 && < 0.2 = don't move +// > 0.3 && < 1.0 = aim at enemy during retreat +// > 0.0 && < 0.4 = only move forward/backward +// >= 0.4 && < 1.0 = circle strafing +// > 0.7 && < 1.0 = random strafe direction change +#define CHARACTERISTIC_ATTACK_SKILL 2 //float [0, 1] +//weapon weight file +#define CHARACTERISTIC_WEAPONWEIGHTS 3 //string +//view angle difference to angle change factor +#define CHARACTERISTIC_VIEW_FACTOR 4 //float <0, 1] +//maximum view angle change +#define CHARACTERISTIC_VIEW_MAXCHANGE 5 //float [1, 360] +//reaction time in seconds +#define CHARACTERISTIC_REACTIONTIME 6 //float [0, 5] +//accuracy when aiming +#define CHARACTERISTIC_AIM_ACCURACY 7 //float [0, 1] +//weapon specific aim accuracy +#define CHARACTERISTIC_AIM_ACCURACY_MACHINEGUN 8 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_SHOTGUN 9 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_ROCKETLAUNCHER 10 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_GRENADELAUNCHER 11 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_LIGHTNING 12 +#define CHARACTERISTIC_AIM_ACCURACY_PLASMAGUN 13 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_RAILGUN 14 +#define CHARACTERISTIC_AIM_ACCURACY_BFG10K 15 //float [0, 1] +//skill when aiming +// > 0.0 && < 0.9 = aim is affected by enemy movement +// > 0.4 && <= 0.8 = enemy linear leading +// > 0.8 && <= 1.0 = enemy exact movement leading +// > 0.5 && <= 1.0 = prediction shots when enemy is not visible +// > 0.6 && <= 1.0 = splash damage by shooting nearby geometry +#define CHARACTERISTIC_AIM_SKILL 16 //float [0, 1] +//weapon specific aim skill +#define CHARACTERISTIC_AIM_SKILL_ROCKETLAUNCHER 17 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_GRENADELAUNCHER 18 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_PLASMAGUN 19 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_BFG10K 20 //float [0, 1] +//======================================================== +//chat +//======================================================== +//file with chats +#define CHARACTERISTIC_CHAT_FILE 21 //string +//name of the chat character +#define CHARACTERISTIC_CHAT_NAME 22 //string +//characters per minute type speed +#define CHARACTERISTIC_CHAT_CPM 23 //integer [1, 4000] +//tendency to insult/praise +#define CHARACTERISTIC_CHAT_INSULT 24 //float [0, 1] +//tendency to chat misc +#define CHARACTERISTIC_CHAT_MISC 25 //float [0, 1] +//tendency to chat at start or end of level +#define CHARACTERISTIC_CHAT_STARTENDLEVEL 26 //float [0, 1] +//tendency to chat entering or exiting the game +#define CHARACTERISTIC_CHAT_ENTEREXITGAME 27 //float [0, 1] +//tendency to chat when killed someone +#define CHARACTERISTIC_CHAT_KILL 28 //float [0, 1] +//tendency to chat when died +#define CHARACTERISTIC_CHAT_DEATH 29 //float [0, 1] +//tendency to chat when enemy suicides +#define CHARACTERISTIC_CHAT_ENEMYSUICIDE 30 //float [0, 1] +//tendency to chat when hit while talking +#define CHARACTERISTIC_CHAT_HITTALKING 31 //float [0, 1] +//tendency to chat when bot was hit but didn't dye +#define CHARACTERISTIC_CHAT_HITNODEATH 32 //float [0, 1] +//tendency to chat when bot hit the enemy but enemy didn't dye +#define CHARACTERISTIC_CHAT_HITNOKILL 33 //float [0, 1] +//tendency to randomly chat +#define CHARACTERISTIC_CHAT_RANDOM 34 //float [0, 1] +//tendency to reply +#define CHARACTERISTIC_CHAT_REPLY 35 //float [0, 1] +//======================================================== +//movement +//======================================================== +//tendency to crouch +#define CHARACTERISTIC_CROUCHER 36 //float [0, 1] +//tendency to jump +#define CHARACTERISTIC_JUMPER 37 //float [0, 1] +//tendency to walk +#define CHARACTERISTIC_WALKER 48 //float [0, 1] +//tendency to jump using a weapon +#define CHARACTERISTIC_WEAPONJUMPING 38 //float [0, 1] +//tendency to use the grapple hook when available +#define CHARACTERISTIC_GRAPPLE_USER 39 //float [0, 1] //use this!! +//======================================================== +//goal +//======================================================== +//item weight file +#define CHARACTERISTIC_ITEMWEIGHTS 40 //string +//the aggression of the bot +#define CHARACTERISTIC_AGGRESSION 41 //float [0, 1] +//the self preservation of the bot (rockets near walls etc.) +#define CHARACTERISTIC_SELFPRESERVATION 42 //float [0, 1] +//how likely the bot is to take revenge +#define CHARACTERISTIC_VENGEFULNESS 43 //float [0, 1] //use this!! +//tendency to camp +#define CHARACTERISTIC_CAMPER 44 //float [0, 1] +//======================================================== +//======================================================== +//tendency to get easy frags +#define CHARACTERISTIC_EASY_FRAGGER 45 //float [0, 1] +//how alert the bot is (view distance) +#define CHARACTERISTIC_ALERTNESS 46 //float [0, 1] +//how much the bot fires it's weapon +#define CHARACTERISTIC_FIRETHROTTLE 47 //float [0, 1] + +//PKMOD - Ergodic - 09/07/00 Add PKA weapon specific definitions +#define CHARACTERISTIC_AIM_ACCURACY_AIRFIST 49 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_AIRFIST 50 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_NAILGUN 51 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_NAILGUN 52 //float [0, 1] +#define CHARACTERISTIC_AIM_ACCURACY_BEARTRAP 53 //float [0, 1] +#define CHARACTERISTIC_AIM_SKILL_BEARTRAP 54 //float [0, 1] + + diff --git a/quake3/source/code/game/g_active.c b/quake3/source/code/game/g_active.c new file mode 100644 index 0000000..6bad263 --- /dev/null +++ b/quake3/source/code/game/g_active.c @@ -0,0 +1,1272 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// + +#include "g_local.h" + + +/* +=============== +G_DamageFeedback + +Called just before a snapshot is sent to the given player. +Totals up all damage and generates both the player_state_t +damage values to that client for pain blends and kicks, and +global pain sound events for all clients. +=============== +*/ +void P_DamageFeedback( gentity_t *player ) { + gclient_t *client; + float count; + vec3_t angles; + + client = player->client; + if ( client->ps.pm_type == PM_DEAD ) { + return; + } + + // total points of damage shot at the player this frame + count = client->damage_blood + client->damage_armor; + if ( count == 0 ) { + return; // didn't take any damage + } + + if ( count > 255 ) { + count = 255; + } + + // send the information to the client + + // world damage (falling, slime, etc) uses a special code + // to make the blend blob centered instead of positional + if ( client->damage_fromWorld ) { + client->ps.damagePitch = 255; + client->ps.damageYaw = 255; + + client->damage_fromWorld = qfalse; + } else { + vectoangles( client->damage_from, angles ); + client->ps.damagePitch = angles[PITCH]/360.0 * 256; + client->ps.damageYaw = angles[YAW]/360.0 * 256; + } + + // play an apropriate pain sound + if ( (level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) ) { + player->pain_debounce_time = level.time + 700; + G_AddEvent( player, EV_PAIN, player->health ); + client->ps.damageEvent++; + } + + + client->ps.damageCount = count; + + // + // clear totals + // + client->damage_blood = 0; + client->damage_armor = 0; + client->damage_knockback = 0; +} + + + +/* +============= +P_WorldEffects + +Check for lava / slime contents and drowning +============= +*/ +void P_WorldEffects( gentity_t *ent ) { + qboolean envirosuit; + int waterlevel; + + if ( ent->client->noclip ) { + ent->client->airOutTime = level.time + 12000; // don't need air + return; + } + + waterlevel = ent->waterlevel; + + envirosuit = ent->client->ps.powerups[PW_BATTLESUIT] > level.time; + + // + // check for drowning + // + if ( waterlevel == 3 ) { + // envirosuit give air + if ( envirosuit ) { + ent->client->airOutTime = level.time + 10000; + } + + // if out of air, start drowning + if ( ent->client->airOutTime < level.time) { + // drown! + ent->client->airOutTime += 1000; + if ( ent->health > 0 ) { + // take more damage the longer underwater + ent->damage += 2; + if (ent->damage > 15) + ent->damage = 15; + + // play a gurp sound instead of a normal pain sound + if (ent->health <= ent->damage) { + G_Sound(ent, CHAN_VOICE, G_SoundIndex("*drown.wav")); + } else if (rand()&1) { + G_Sound(ent, CHAN_VOICE, G_SoundIndex("sound/player/gurp1.wav")); + } else { + G_Sound(ent, CHAN_VOICE, G_SoundIndex("sound/player/gurp2.wav")); + } + + // don't play a normal pain sound + ent->pain_debounce_time = level.time + 200; + + G_Damage (ent, NULL, NULL, NULL, NULL, + ent->damage, DAMAGE_NO_ARMOR, MOD_WATER); + } + } + } else { + ent->client->airOutTime = level.time + 12000; + ent->damage = 2; + } + + // + // check for sizzle damage (move to pmove?) + // + if (waterlevel && + (ent->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) { + if (ent->health > 0 + && ent->pain_debounce_time <= level.time ) { + + if ( envirosuit ) { + G_AddEvent( ent, EV_POWERUP_BATTLESUIT, 0 ); + } else { + if (ent->watertype & CONTENTS_LAVA) { + G_Damage (ent, NULL, NULL, NULL, NULL, + 30*waterlevel, 0, MOD_LAVA); + } + + if (ent->watertype & CONTENTS_SLIME) { + G_Damage (ent, NULL, NULL, NULL, NULL, + 10*waterlevel, 0, MOD_SLIME); + } + } + } + } +} + + + +/* +=============== +G_SetClientSound +=============== +*/ +void G_SetClientSound( gentity_t *ent ) { +#ifdef MISSIONPACK + if( ent->s.eFlags & EF_TICKING ) { + ent->client->ps.loopSound = G_SoundIndex( "sound/weapons/proxmine/wstbtick.wav"); + } + else +#endif + if (ent->waterlevel && (ent->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) { + ent->client->ps.loopSound = level.snd_fry; + } else { + ent->client->ps.loopSound = 0; + } +} + + + +//============================================================== + +/* +============== +ClientImpacts +============== +*/ +void ClientImpacts( gentity_t *ent, pmove_t *pm ) { + int i, j; + trace_t trace; + gentity_t *other; + + memset( &trace, 0, sizeof( trace ) ); + for (i=0 ; inumtouch ; i++) { + for (j=0 ; jtouchents[j] == pm->touchents[i] ) { + break; + } + } + if (j != i) { + continue; // duplicated + } + other = &g_entities[ pm->touchents[i] ]; + + //PKMOD - Ergodic 01/24/01 - debug inactive +// Com_Printf("ClientImpacts - other->classname>%s<\n", other->classname ); + + + if ( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) ) { + ent->touch( ent, other, &trace ); + } + + if ( !other->touch ) { + continue; + } + + other->touch( other, ent, &trace ); + } + +} + +/* +============ +G_TouchTriggers + +Find all trigger entities that ent's current position touches. +Spectators will only interact with teleporters. +============ +*/ +void G_TouchTriggers( gentity_t *ent ) { + int i, num; + int touch[MAX_GENTITIES]; + gentity_t *hit; + trace_t trace; + vec3_t mins, maxs; + static vec3_t range = { 40, 40, 52 }; + + if ( !ent->client ) { + return; + } + + // dead clients don't activate triggers! + if ( ent->client->ps.stats[STAT_HEALTH] <= 0 ) { + return; + } + + VectorSubtract( ent->client->ps.origin, range, mins ); + VectorAdd( ent->client->ps.origin, range, maxs ); + + num = trap_EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); + + // can't use ent->absmin, because that has a one unit pad + VectorAdd( ent->client->ps.origin, ent->r.mins, mins ); + VectorAdd( ent->client->ps.origin, ent->r.maxs, maxs ); + + for ( i=0 ; itouch && !ent->touch ) { + continue; + } + if ( !( hit->r.contents & CONTENTS_TRIGGER ) ) { + continue; + } + + // ignore most entities if a spectator + if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + if ( hit->s.eType != ET_TELEPORT_TRIGGER && + // this is ugly but adding a new ET_? type will + // most likely cause network incompatibilities + hit->touch != Touch_DoorTrigger) { + continue; + } + } + + // use seperate code for determining if an item is picked up + // so you don't have to actually contact its bounding box + //PKA - Ergodic 05/30/00, modify for touching an active beartrap + if ( hit->s.eType == ET_ITEM || hit->s.eType == ET_BEARTRAP) { + if ( !BG_PlayerTouchesItem( &ent->client->ps, &hit->s, level.time ) ) { + continue; + } + } else { + if ( !trap_EntityContact( mins, maxs, hit ) ) { + continue; + } + } + + memset( &trace, 0, sizeof(trace) ); + + if ( hit->touch ) { + hit->touch (hit, ent, &trace); + } + + if ( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) ) { + ent->touch( ent, hit, &trace ); + } + } + + // if we didn't touch a jump pad this pmove frame + if ( ent->client->ps.jumppad_frame != ent->client->ps.pmove_framecount ) { + ent->client->ps.jumppad_frame = 0; + ent->client->ps.jumppad_ent = 0; + } +} + +/* +================= +SpectatorThink +================= +*/ +void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) { + pmove_t pm; + gclient_t *client; + + client = ent->client; + + if ( client->sess.spectatorState != SPECTATOR_FOLLOW ) { + client->ps.pm_type = PM_SPECTATOR; + client->ps.speed = 400; // faster than normal + + // set up for pmove + memset (&pm, 0, sizeof(pm)); + pm.ps = &client->ps; + pm.cmd = *ucmd; + pm.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; // spectators can fly through bodies + pm.trace = trap_Trace; + pm.pointcontents = trap_PointContents; + + // perform a pmove + Pmove (&pm); + // save results of pmove + VectorCopy( client->ps.origin, ent->s.origin ); + + G_TouchTriggers( ent ); + trap_UnlinkEntity( ent ); + } + + client->oldbuttons = client->buttons; + client->buttons = ucmd->buttons; + + // attack button cycles through spectators + if ( ( client->buttons & BUTTON_ATTACK ) && ! ( client->oldbuttons & BUTTON_ATTACK ) ) { + Cmd_FollowCycle_f( ent, 1 ); + } +} + + + +/* +================= +ClientInactivityTimer + +Returns qfalse if the client is dropped +================= +*/ +qboolean ClientInactivityTimer( gclient_t *client ) { + if ( ! g_inactivity.integer ) { + // give everyone some time, so if the operator sets g_inactivity during + // gameplay, everyone isn't kicked + client->inactivityTime = level.time + 60 * 1000; + client->inactivityWarning = qfalse; + } else if ( client->pers.cmd.forwardmove || + client->pers.cmd.rightmove || + client->pers.cmd.upmove || + (client->pers.cmd.buttons & BUTTON_ATTACK) ) { + client->inactivityTime = level.time + g_inactivity.integer * 1000; + client->inactivityWarning = qfalse; + } else if ( !client->pers.localClient ) { + if ( level.time > client->inactivityTime ) { + trap_DropClient( client - level.clients, "Dropped due to inactivity" ); + return qfalse; + } + if ( level.time > client->inactivityTime - 10000 && !client->inactivityWarning ) { + client->inactivityWarning = qtrue; + trap_SendServerCommand( client - level.clients, "cp \"Ten seconds until inactivity drop!\n\"" ); + } + } + return qtrue; +} + +/* +================== +ClientTimerActions + +Actions that happen once a second +================== +*/ +void ClientTimerActions( gentity_t *ent, int msec ) { + gclient_t *client; +#ifdef MISSIONPACK + int maxHealth; +#endif + + client = ent->client; + client->timeResidual += msec; + + while ( client->timeResidual >= 1000 ) { + client->timeResidual -= 1000; + + // regenerate +#ifdef MISSIONPACK + if( bg_itemlist[client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_GUARD ) { + maxHealth = client->ps.stats[STAT_MAX_HEALTH] / 2; + } + else if ( client->ps.powerups[PW_REGEN] ) { + maxHealth = client->ps.stats[STAT_MAX_HEALTH]; + } + else { + maxHealth = 0; + } + if( maxHealth ) { + if ( ent->health < maxHealth ) { + ent->health += 15; + if ( ent->health > maxHealth * 1.1 ) { + ent->health = maxHealth * 1.1; + } + G_AddEvent( ent, EV_POWERUP_REGEN, 0 ); + } else if ( ent->health < maxHealth * 2) { + ent->health += 5; + if ( ent->health > maxHealth * 2 ) { + ent->health = maxHealth * 2; + } + G_AddEvent( ent, EV_POWERUP_REGEN, 0 ); + } +#else + if ( client->ps.powerups[PW_REGEN] ) { + if ( ent->health < client->ps.stats[STAT_MAX_HEALTH]) { + ent->health += 15; + if ( ent->health > client->ps.stats[STAT_MAX_HEALTH] * 1.1 ) { + ent->health = client->ps.stats[STAT_MAX_HEALTH] * 1.1; + } + G_AddEvent( ent, EV_POWERUP_REGEN, 0 ); + } else if ( ent->health < client->ps.stats[STAT_MAX_HEALTH] * 2) { + ent->health += 5; + if ( ent->health > client->ps.stats[STAT_MAX_HEALTH] * 2 ) { + ent->health = client->ps.stats[STAT_MAX_HEALTH] * 2; + } + G_AddEvent( ent, EV_POWERUP_REGEN, 0 ); + } +#endif + //PKMOD - Ergodic 06/19/00 REGEN will turn off the beans status flag + ent->client->ps.stats[STAT_PKA_ITEMS] &= ~( 1 << PKA_BEANS ); + } else { + // count down health when over max + if ( ent->health > client->ps.stats[STAT_MAX_HEALTH] ) { + //PKMOD - Ergodic 06/19/00 only count down health if beans flag is off + if (! ( ent->client->ps.stats[STAT_PKA_ITEMS] & ( 1 << PKA_BEANS ) ) ) { + ent->health--; + } + } + else { + //PKMOD - Ergodic 01/07/04 - add quad farting logic... + // if quaded do not turn off beans fart effect until toot_think is over + if ( !( ent->client->ps.powerups[PW_QUAD] > 0 ) ) { + //PKMOD - Ergodic 06/19/00 Health not at max will turn off the beans status flag + ent->client->ps.stats[STAT_PKA_ITEMS] &= ~( 1 << PKA_BEANS ); + } + } + } + + // count down armor when over max + if ( client->ps.stats[STAT_ARMOR] > client->ps.stats[STAT_MAX_HEALTH] ) { + //PKMOD - Ergodic 06/03/01 - add bean powerup timer for armor countdown immunity, + // only decrement armor if bean powerup is not active + if ( !client->ps.powerups[PW_BEANS] ) + client->ps.stats[STAT_ARMOR]--; + } + } +#ifdef MISSIONPACK + if( bg_itemlist[client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_AMMOREGEN ) { + int w, max, inc, t, i; + int weapList[]={WP_MACHINEGUN,WP_SHOTGUN,WP_GRENADE_LAUNCHER,WP_ROCKET_LAUNCHER,WP_LIGHTNING,WP_RAILGUN,WP_PLASMAGUN,WP_BFG,WP_NAILGUN,WP_PROX_LAUNCHER,WP_CHAINGUN}; + int weapCount = sizeof(weapList) / sizeof(int); + // + for (i = 0; i < weapCount; i++) { + w = weapList[i]; + + switch(w) { + case WP_MACHINEGUN: max = 50; inc = 4; t = 1000; break; + case WP_SHOTGUN: max = 10; inc = 1; t = 1500; break; + case WP_GRENADE_LAUNCHER: max = 10; inc = 1; t = 2000; break; + case WP_ROCKET_LAUNCHER: max = 10; inc = 1; t = 1750; break; + case WP_LIGHTNING: max = 50; inc = 5; t = 1500; break; + case WP_RAILGUN: max = 10; inc = 1; t = 1750; break; + case WP_PLASMAGUN: max = 50; inc = 5; t = 1500; break; + case WP_BFG: max = 10; inc = 1; t = 4000; break; + case WP_NAILGUN: max = 10; inc = 1; t = 1250; break; + case WP_PROX_LAUNCHER: max = 5; inc = 1; t = 2000; break; + case WP_CHAINGUN: max = 100; inc = 5; t = 1000; break; + default: max = 0; inc = 0; t = 1000; break; + } + client->ammoTimes[w] += msec; + if ( client->ps.ammo[w] >= max ) { + client->ammoTimes[w] = 0; + } + if ( client->ammoTimes[w] >= t ) { + while ( client->ammoTimes[w] >= t ) + client->ammoTimes[w] -= t; + client->ps.ammo[w] += inc; + if ( client->ps.ammo[w] > max ) { + client->ps.ammo[w] = max; + } + } + } + } +#endif +} + +/* +==================== +ClientIntermissionThink +==================== +*/ +void ClientIntermissionThink( gclient_t *client ) { + client->ps.eFlags &= ~EF_TALK; + client->ps.eFlags &= ~EF_FIRING; + + // the level will exit when everyone wants to or after timeouts + + // swap and latch button actions + client->oldbuttons = client->buttons; + client->buttons = client->pers.cmd.buttons; + if ( client->buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) & ( client->oldbuttons ^ client->buttons ) ) { + // this used to be an ^1 but once a player says ready, it should stick + client->readyToExit = 1; + } +} + + +/* +================ +ClientEvents + +Events will be passed on to the clients for presentation, +but any server game effects are handled here +================ +*/ +void ClientEvents( gentity_t *ent, int oldEventSequence ) { + int i, j; + int event; + gclient_t *client; + int damage; + vec3_t dir; + vec3_t origin, angles; +// qboolean fired; + gitem_t *item; + gentity_t *drop; + + client = ent->client; + + if ( oldEventSequence < client->ps.eventSequence - MAX_PS_EVENTS ) { + oldEventSequence = client->ps.eventSequence - MAX_PS_EVENTS; + } + for ( i = oldEventSequence ; i < client->ps.eventSequence ; i++ ) { + event = client->ps.events[ i & (MAX_PS_EVENTS-1) ]; + + switch ( event ) { + case EV_FALL_MEDIUM: + case EV_FALL_FAR: + if ( ent->s.eType != ET_PLAYER ) { + break; // not in the player model + } + if ( g_dmflags.integer & DF_NO_FALLING ) { + break; + } + if ( event == EV_FALL_FAR ) { + damage = 10; + } else { + damage = 5; + } + VectorSet (dir, 0, 0, 1); + ent->pain_debounce_time = level.time + 200; // no normal pain sound + G_Damage (ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING); + break; + + case EV_FIRE_WEAPON: + FireWeapon( ent ); + break; + + case EV_USE_ITEM1: // teleporter + // drop flags in CTF + item = NULL; + j = 0; + + if ( ent->client->ps.powerups[ PW_REDFLAG ] ) { + item = BG_FindItemForPowerup( PW_REDFLAG ); + j = PW_REDFLAG; + } else if ( ent->client->ps.powerups[ PW_BLUEFLAG ] ) { + item = BG_FindItemForPowerup( PW_BLUEFLAG ); + j = PW_BLUEFLAG; + } else if ( ent->client->ps.powerups[ PW_NEUTRALFLAG ] ) { + item = BG_FindItemForPowerup( PW_NEUTRALFLAG ); + j = PW_NEUTRALFLAG; + } + + if ( item ) { + drop = Drop_Item( ent, item, 0 ); + // decide how many seconds it has left + drop->count = ( ent->client->ps.powerups[ j ] - level.time ) / 1000; + if ( drop->count < 1 ) { + drop->count = 1; + } + + ent->client->ps.powerups[ j ] = 0; + } + +#ifdef MISSIONPACK + if ( g_gametype.integer == GT_HARVESTER ) { + if ( ent->client->ps.generic1 > 0 ) { + if ( ent->client->sess.sessionTeam == TEAM_RED ) { + item = BG_FindItem( "Blue Cube" ); + } else { + item = BG_FindItem( "Red Cube" ); + } + if ( item ) { + for ( j = 0; j < ent->client->ps.generic1; j++ ) { + drop = Drop_Item( ent, item, 0 ); + if ( ent->client->sess.sessionTeam == TEAM_RED ) { + drop->spawnflags = TEAM_BLUE; + } else { + drop->spawnflags = TEAM_RED; + } + } + } + ent->client->ps.generic1 = 0; + } + } +#endif + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + SelectSpawnPoint( ent->client->ps.origin, origin, angles, ( client->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) ); + //PKMOD - Ergodic 06/29/01 - debug where Personal Teleport occurs (inactive) +// Com_Printf( "ClientEvents - Personal teleport activated\n" ); + + TeleportPlayer( ent, origin, angles ); + break; + + case EV_USE_ITEM2: // medkit + ent->health = ent->client->ps.stats[STAT_MAX_HEALTH] + 25; + + break; + + //PKMOD - Ergodic 10/13/01 - add new holdable + // radiate holdable will act like a powerup + case EV_USE_ITEM3: // radiate + if ( !ent->client->ps.powerups[ PW_RADIATE ] ) { + // round timing to seconds to make multiple powerup timers + // count in sync + ent->client->ps.powerups[ PW_RADIATE ] = level.time - ( level.time % 1000 ); + } + + ent->client->ps.powerups[ PW_RADIATE ] += PLAYER_RADIATE_TIME * 1000; + + break; + + //PKMOD - Ergodic 05/07/02 - add new holdable + // Personal Sentry will act like a powerup + case EV_USE_ITEM4: // radiate + + if ( !ent->client->ps.powerups[ PW_PERSENTRY ] ) { + // round timing to seconds to make multiple powerup timers + // count in sync + ent->client->ps.powerups[ PW_PERSENTRY ] = level.time - ( level.time % 1000 ); + //PKMOD - Ergodic 06/08/02 - setup personal sentry driver + G_AddPersonalSentry( ent ); + } + + ent->client->ps.powerups[ PW_PERSENTRY ] += PLAYER_PERSENTRY_TIME * 1000; + +// G_ActivatePersentry( ent ); + + break; + + + //PKMOD - Ergodic 12/07/01 - add new holdable + // Private Bot holdable + case EV_USE_ITEM7: //BOT HEAD + //PKMOD - Ergodic 02/26/04 - debug Private Bot (inactive) + //Com_Printf( "ClientEvents - EV_USE_ITEM7 - Private Bot (Head), active_private_bots>%d<\n", active_private_bots ); + //PKMOD - Ergodic 02/27/042 - check if room for another Private Bot + if ( active_private_bots < MAX_PRIVATE_BOTS ) { + //PKMOD - Ergodic 02/27/04 - increment active Private Bot counter + active_private_bots++; + //PKMOD - Ergodic 01/06/02 - create private bot + G_AddPrivateBot( ent ); + } + break; + + default: + break; + } + } + +} + +#ifdef MISSIONPACK +/* +============== +StuckInOtherClient +============== +*/ +static int StuckInOtherClient(gentity_t *ent) { + int i; + gentity_t *ent2; + + ent2 = &g_entities[0]; + for ( i = 0; i < MAX_CLIENTS; i++, ent2++ ) { + if ( ent2 == ent ) { + continue; + } + if ( !ent2->inuse ) { + continue; + } + if ( !ent2->client ) { + continue; + } + if ( ent2->health <= 0 ) { + continue; + } + // + if (ent2->r.absmin[0] > ent->r.absmax[0]) + continue; + if (ent2->r.absmin[1] > ent->r.absmax[1]) + continue; + if (ent2->r.absmin[2] > ent->r.absmax[2]) + continue; + if (ent2->r.absmax[0] < ent->r.absmin[0]) + continue; + if (ent2->r.absmax[1] < ent->r.absmin[1]) + continue; + if (ent2->r.absmax[2] < ent->r.absmin[2]) + continue; + return qtrue; + } + return qfalse; +} +#endif + +void BotTestSolid(vec3_t origin); + +/* +============== +SendPendingPredictableEvents +============== +*/ +void SendPendingPredictableEvents( playerState_t *ps ) { + gentity_t *t; + int event, seq; + int extEvent, number; + + // if there are still events pending + if ( ps->entityEventSequence < ps->eventSequence ) { + // create a temporary entity for this event which is sent to everyone + // except the client who generated the event + seq = ps->entityEventSequence & (MAX_PS_EVENTS-1); + event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 ); + // set external event to zero before calling BG_PlayerStateToEntityState + extEvent = ps->externalEvent; + ps->externalEvent = 0; + // create temporary entity for event + t = G_TempEntity( ps->origin, event ); + number = t->s.number; + BG_PlayerStateToEntityState( ps, &t->s, qtrue ); + t->s.number = number; + t->s.eType = ET_EVENTS + event; + t->s.eFlags |= EF_PLAYER_EVENT; + t->s.otherEntityNum = ps->clientNum; + // send to everyone except the client who generated the event + t->r.svFlags |= SVF_NOTSINGLECLIENT; + t->r.singleClient = ps->clientNum; + // set back external event + ps->externalEvent = extEvent; + } +} + +/* +============== +ClientThink + +This will be called once for each client frame, which will +usually be a couple times for each server frame on fast clients. + +If "g_synchronousClients 1" is set, this will be called exactly +once for each server frame, which makes for smooth demo recording. +============== +*/ +void ClientThink_real( gentity_t *ent ) { + gclient_t *client; + pmove_t pm; + int oldEventSequence; + int msec; + usercmd_t *ucmd; + + client = ent->client; + + // don't think if the client is not yet connected (and thus not yet spawned in) + if (client->pers.connected != CON_CONNECTED) { + return; + } + // mark the time, so the connection sprite can be removed + ucmd = &ent->client->pers.cmd; + + // sanity check the command time to prevent speedup cheating + if ( ucmd->serverTime > level.time + 200 ) { + ucmd->serverTime = level.time + 200; +// G_Printf("serverTime <<<<<\n" ); + } + if ( ucmd->serverTime < level.time - 1000 ) { + ucmd->serverTime = level.time - 1000; +// G_Printf("serverTime >>>>>\n" ); + } + + msec = ucmd->serverTime - client->ps.commandTime; + // following others may result in bad times, but we still want + // to check for follow toggles + if ( msec < 1 && client->sess.spectatorState != SPECTATOR_FOLLOW ) { + return; + } + if ( msec > 200 ) { + msec = 200; + } + + if ( pmove_msec.integer < 8 ) { + trap_Cvar_Set("pmove_msec", "8"); + } + else if (pmove_msec.integer > 33) { + trap_Cvar_Set("pmove_msec", "33"); + } + + if ( pmove_fixed.integer || client->pers.pmoveFixed ) { + ucmd->serverTime = ((ucmd->serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer; + //if (ucmd->serverTime - client->ps.commandTime <= 0) + // return; + } + + // + // check for exiting intermission + // + if ( level.intermissiontime ) { + ClientIntermissionThink( client ); + return; + } + + // spectators don't do much + if ( client->sess.sessionTeam == TEAM_SPECTATOR ) { + if ( client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { + return; + } + SpectatorThink( ent, ucmd ); + return; + } + + // check for inactivity timer, but never drop the local client of a non-dedicated server + if ( !ClientInactivityTimer( client ) ) { + return; + } + + // clear the rewards if time + if ( level.time > client->rewardTime ) { + //PKMOD - Ergodic 08/08/00 add reset for PAINKILLER awarded + client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_PAINKILLER ); + } + + if ( client->noclip ) { + client->ps.pm_type = PM_NOCLIP; + } else if ( client->ps.stats[STAT_HEALTH] <= 0 ) { + client->ps.pm_type = PM_DEAD; + } else { + client->ps.pm_type = PM_NORMAL; + } + + //PKMOD - Ergodic 04/16/01 - check for special gravity + if ( ent->pka_gravity_time > level.time ) { + client->ps.gravity = ent->pka_gravity; + //PKMOD - Ergodic 04/17/01 - add local gravity trtype + ent->s.pos.trType = TR_LOCAL_GRAVITY; + ent->s.pos.trDuration = ent->pka_gravity; + } + else { + client->ps.gravity = g_gravity.value; + //PKMOD - Ergodic 04/17/01 - restore regular gravity trtype + ent->s.pos.trType = TR_GRAVITY; + } + + // set speed + client->ps.speed = g_speed.value; + +#ifdef MISSIONPACK + if( bg_itemlist[client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_SCOUT ) { + client->ps.speed *= 1.5; + } + else +#endif + if ( client->ps.powerups[PW_HASTE] ) { + client->ps.speed *= 1.3; + } + + // Let go of the hook if we aren't firing + if ( client->ps.weapon == WP_GRAPPLING_HOOK && + client->hook && !( ucmd->buttons & BUTTON_ATTACK ) ) { + //PKMOD - Ergodic 03/01/01 - debug (inactive) +// Com_Printf( "ClientThink_real - calling activate_dragon_deploy, weapon:%d\n", client->hook->s.generic1 & 15 ); + + //PKMOD - Ergodic 03/25/01 - add dragon deployable weapon fire + //PKMOD - Ergodic 03/28/01 - remove this logic (for beta 2.2) + //PKMOD - Ergodic 06/22/01 - re-add the logic + if ( client->hook->s.generic1 != 0 ) { + //PKMOD - Ergodic 12/20/01 - modify activate_dragon_deploy call to add struck entity + //PKMOD - Ergodic 01/26/02 - modify activate_dragon_deploy call to add bytedir for gauntlet + activate_dragon_deploy ( client->hook, NULL, 0 ); + //PKMOD - Ergodic 06/22/01 - do not return yet - need Weapon_HookFree? +// return; + } + Weapon_HookFree(client->hook); + } + + // set up for pmove + oldEventSequence = client->ps.eventSequence; + + memset (&pm, 0, sizeof(pm)); + + // check for the hit-scan gauntlet, don't let the action + // go through as an attack unless it actually hits something + if ( client->ps.weapon == WP_GAUNTLET && !( ucmd->buttons & BUTTON_TALK ) && + ( ucmd->buttons & BUTTON_ATTACK ) && client->ps.weaponTime <= 0 ) { + pm.gauntletHit = CheckGauntletAttack( ent ); + } + + if ( ent->flags & FL_FORCE_GESTURE ) { + ent->flags &= ~FL_FORCE_GESTURE; + ent->client->pers.cmd.buttons |= BUTTON_GESTURE; + } + +#ifdef MISSIONPACK + // check for invulnerability expansion before doing the Pmove + if (client->ps.powerups[PW_INVULNERABILITY] ) { + if ( !(client->ps.pm_flags & PMF_INVULEXPAND) ) { + vec3_t mins = { -42, -42, -42 }; + vec3_t maxs = { 42, 42, 42 }; + vec3_t oldmins, oldmaxs; + + VectorCopy (ent->r.mins, oldmins); + VectorCopy (ent->r.maxs, oldmaxs); + // expand + VectorCopy (mins, ent->r.mins); + VectorCopy (maxs, ent->r.maxs); + trap_LinkEntity(ent); + // check if this would get anyone stuck in this player + if ( !StuckInOtherClient(ent) ) { + // set flag so the expanded size will be set in PM_CheckDuck + client->ps.pm_flags |= PMF_INVULEXPAND; + } + // set back + VectorCopy (oldmins, ent->r.mins); + VectorCopy (oldmaxs, ent->r.maxs); + trap_LinkEntity(ent); + } + } +#endif + + pm.ps = &client->ps; + + //PKMOD - Ergodic 05/12/01 - debug buttons (inactive) +// Com_Printf( "ClientThink_real - button: was>%d<, now>%d<\n", pm.cmd.buttons, ucmd->buttons ); + pm.cmd = *ucmd; + + if ( pm.ps->pm_type == PM_DEAD ) { + pm.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; + } + else if ( ent->r.svFlags & SVF_BOT ) { + pm.tracemask = MASK_PLAYERSOLID | CONTENTS_BOTCLIP; + } + else { + pm.tracemask = MASK_PLAYERSOLID; + } + pm.trace = trap_Trace; + pm.pointcontents = trap_PointContents; + pm.debugLevel = g_debugMove.integer; + pm.noFootsteps = ( g_dmflags.integer & DF_NO_FOOTSTEPS ) > 0; + + pm.pmove_fixed = pmove_fixed.integer | client->pers.pmoveFixed; + pm.pmove_msec = pmove_msec.integer; + + VectorCopy( client->ps.origin, client->oldOrigin ); + +#ifdef MISSIONPACK + if (level.intermissionQueued != 0 && g_singlePlayer.integer) { + if ( level.time - level.intermissionQueued >= 1000 ) { + pm.cmd.buttons = 0; + pm.cmd.forwardmove = 0; + pm.cmd.rightmove = 0; + pm.cmd.upmove = 0; + if ( level.time - level.intermissionQueued >= 2000 && level.time - level.intermissionQueued <= 2500 ) { + trap_SendConsoleCommand( EXEC_APPEND, "centerview\n"); + } + ent->client->ps.pm_type = PM_SPINTERMISSION; + } + } + Pmove (&pm); +#else + //PKMOD - Ergodic 04/05/01 - debug (inactive) +// Com_Printf( "ClientThink_real - calling pmove\n" ); + Pmove (&pm); +#endif + + // save results of pmove + if ( ent->client->ps.eventSequence != oldEventSequence ) { + ent->eventTime = level.time; + } + if (g_smoothClients.integer) { + BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue ); + } + else { + BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue ); + } + SendPendingPredictableEvents( &ent->client->ps ); + + if ( !( ent->client->ps.eFlags & EF_FIRING ) ) { + client->fireHeld = qfalse; // for grapple + //PKMOD - Ergodic 03/09/01 - if not firing then turn off the clg shafting flag + //PKMOD - Ergodic 07/08/01 - should be the client flag and not the entity flag +// ent->s.eFlags &= ~EF_LIGHTNINGSTRIKE; + client->ps.eFlags &= ~EF_LIGHTNINGSTRIKE; + } + + //PKMOD - Ergodic 03/29/2000, reset set the AirFist_Level + //PKMOD - Ergodic 11/15/00, move airfist level to playerstate + // airfist levels will be (4,3,2,1,0) + //PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level + if ( ent->client->ps.stats[STAT_AIRFIST_LEVEL] < 4 ) { + if (ent->AirFist_ResetTime < level.time) { + ent->client->ps.stats[STAT_AIRFIST_LEVEL]++; + ent->AirFist_ResetTime = level.time + AIRFIST_RESET_WAIT; + //PKMOD - Ergodic 05/18/01 - Airfist has displayable ammo corresponding to airfist_level + if ( ent->client->ps.ammo[WP_AIRFIST] < 4 ) { + ent->client->ps.ammo[WP_AIRFIST]++; + } + } + } + + // use the snapped origin for linking so it matches client predicted versions + VectorCopy( ent->s.pos.trBase, ent->r.currentOrigin ); + + VectorCopy (pm.mins, ent->r.mins); + VectorCopy (pm.maxs, ent->r.maxs); + + ent->waterlevel = pm.waterlevel; + ent->watertype = pm.watertype; + + // execute client events + ClientEvents( ent, oldEventSequence ); + + // link entity now, after any personal teleporters have been used + trap_LinkEntity (ent); + if ( !ent->client->noclip ) { + G_TouchTriggers( ent ); + } + + // NOTE: now copy the exact origin over otherwise clients can be snapped into solid + VectorCopy( ent->client->ps.origin, ent->r.currentOrigin ); + + //test for solid areas in the AAS file + BotTestAAS(ent->r.currentOrigin); + + // touch other objects + ClientImpacts( ent, &pm ); + + // save results of triggers and client events + if (ent->client->ps.eventSequence != oldEventSequence) { + ent->eventTime = level.time; + } + + // swap and latch button actions + client->oldbuttons = client->buttons; + client->buttons = ucmd->buttons; + client->latched_buttons |= client->buttons & ~client->oldbuttons; + + // check for respawning + if ( client->ps.stats[STAT_HEALTH] <= 0 ) { + // wait for the attack button to be pressed + if ( level.time > client->respawnTime ) { + // forcerespawn is to prevent users from waiting out powerups + if ( g_forcerespawn.integer > 0 && + ( level.time - client->respawnTime ) > g_forcerespawn.integer * 1000 ) { + respawn( ent ); + return; + } + + // pressing attack or use is the normal respawn method + if ( ucmd->buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) ) { + respawn( ent ); + } + } + return; + } + + // perform once-a-second actions + ClientTimerActions( ent, msec ); +} + +/* +================== +ClientThink + +A new command has arrived from the client +================== +*/ +void ClientThink( int clientNum ) { + gentity_t *ent; + + ent = g_entities + clientNum; + trap_GetUsercmd( clientNum, &ent->client->pers.cmd ); + + // mark the time we got info, so we can display the + // phone jack if they don't get any for a while + ent->client->lastCmdTime = level.time; + + if ( !(ent->r.svFlags & SVF_BOT) && !g_synchronousClients.integer ) { + ClientThink_real( ent ); + } +} + + +void G_RunClient( gentity_t *ent ) { + if ( !(ent->r.svFlags & SVF_BOT) && !g_synchronousClients.integer ) { + return; + } + ent->client->pers.cmd.serverTime = level.time; + ClientThink_real( ent ); +} + + +/* +================== +SpectatorClientEndFrame + +================== +*/ +void SpectatorClientEndFrame( gentity_t *ent ) { + gclient_t *cl; + + // if we are doing a chase cam or a remote view, grab the latest info + if ( ent->client->sess.spectatorState == SPECTATOR_FOLLOW ) { + int clientNum, flags; + + clientNum = ent->client->sess.spectatorClient; + + // team follow1 and team follow2 go to whatever clients are playing + if ( clientNum == -1 ) { + clientNum = level.follow1; + } else if ( clientNum == -2 ) { + clientNum = level.follow2; + } + if ( clientNum >= 0 ) { + cl = &level.clients[ clientNum ]; + if ( cl->pers.connected == CON_CONNECTED && cl->sess.sessionTeam != TEAM_SPECTATOR ) { + flags = (cl->ps.eFlags & ~(EF_VOTED | EF_TEAMVOTED)) | (ent->client->ps.eFlags & (EF_VOTED | EF_TEAMVOTED)); + ent->client->ps = cl->ps; + ent->client->ps.pm_flags |= PMF_FOLLOW; + ent->client->ps.eFlags = flags; + return; + } else { + // drop them to free spectators unless they are dedicated camera followers + if ( ent->client->sess.spectatorClient >= 0 ) { + ent->client->sess.spectatorState = SPECTATOR_FREE; + ClientBegin( ent->client - level.clients ); + } + } + } + } + + if ( ent->client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { + ent->client->ps.pm_flags |= PMF_SCOREBOARD; + } else { + ent->client->ps.pm_flags &= ~PMF_SCOREBOARD; + } +} + +/* +============== +ClientEndFrame + +Called at the end of each server frame for each connected client +A fast client will have multiple ClientThink for each ClientEdFrame, +while a slow client may have multiple ClientEndFrame between ClientThink. +============== +*/ +void ClientEndFrame( gentity_t *ent ) { + int i; + clientPersistant_t *pers; + + if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + SpectatorClientEndFrame( ent ); + return; + } + + pers = &ent->client->pers; + + // turn off any expired powerups + for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { + if ( ent->client->ps.powerups[ i ] < level.time ) { + ent->client->ps.powerups[ i ] = 0; + } + } + +#ifdef MISSIONPACK + // set powerup for player animation + if( bg_itemlist[ent->client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_GUARD ) { + ent->client->ps.powerups[PW_GUARD] = level.time; + } + if( bg_itemlist[ent->client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_SCOUT ) { + ent->client->ps.powerups[PW_SCOUT] = level.time; + } + if( bg_itemlist[ent->client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_DOUBLER ) { + ent->client->ps.powerups[PW_DOUBLER] = level.time; + } + if( bg_itemlist[ent->client->ps.stats[STAT_PERSISTANT_POWERUP]].giTag == PW_AMMOREGEN ) { + ent->client->ps.powerups[PW_AMMOREGEN] = level.time; + } + if ( ent->client->invulnerabilityTime > level.time ) { + ent->client->ps.powerups[PW_INVULNERABILITY] = level.time; + } +#endif + + // save network bandwidth +#if 0 + if ( !g_synchronousClients->integer && ent->client->ps.pm_type == PM_NORMAL ) { + // FIXME: this must change eventually for non-sync demo recording + VectorClear( ent->client->ps.viewangles ); + } +#endif + + // + // If the end of unit layout is displayed, don't give + // the player any normal movement attributes + // + if ( level.intermissiontime ) { + return; + } + + // burn from lava, etc + P_WorldEffects (ent); + + // apply all the damage taken this frame + P_DamageFeedback (ent); + + // add the EF_CONNECTION flag if we haven't gotten commands recently + if ( level.time - ent->client->lastCmdTime > 1000 ) { + ent->s.eFlags |= EF_CONNECTION; + } else { + ent->s.eFlags &= ~EF_CONNECTION; + } + + ent->client->ps.stats[STAT_HEALTH] = ent->health; // FIXME: get rid of ent->health... + + G_SetClientSound (ent); + + // set the latest infor + if (g_smoothClients.integer) { + BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue ); + } + else { + BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue ); + } + SendPendingPredictableEvents( &ent->client->ps ); + + // set the bit for the reachability area the client is currently in +// i = trap_AAS_PointReachabilityAreaIndex( ent->client->ps.origin ); +// ent->client->areabits[i >> 3] |= 1 << (i & 7); +} + + diff --git a/quake3/source/code/game/g_arenas.c b/quake3/source/code/game/g_arenas.c new file mode 100644 index 0000000..d3c412d --- /dev/null +++ b/quake3/source/code/game/g_arenas.c @@ -0,0 +1,380 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// +// g_arenas.c +// + +#include "g_local.h" + + +gentity_t *podium1; +gentity_t *podium2; +gentity_t *podium3; + + +/* +================== +UpdateTournamentInfo +================== +*/ +void UpdateTournamentInfo( void ) { + int i; + gentity_t *player; + int playerClientNum; + int n, accuracy, perfect, msglen; + int buflen; +#ifdef MISSIONPACK // bk001205 + int score1, score2; + qboolean won; +#endif + char buf[32]; + char msg[MAX_STRING_CHARS]; + //PKMOD - Ergodic 02/02/04 - hold Winner Flag + int winner; + + // find the real player + player = NULL; + for (i = 0; i < level.maxclients; i++ ) { + player = &g_entities[i]; + if ( !player->inuse ) { + continue; + } + if ( !( player->r.svFlags & SVF_BOT ) ) { + break; + } + } + // this should never happen! + if ( !player || i == level.maxclients ) { + return; + } + playerClientNum = i; + + CalculateRanks(); + + if ( level.clients[playerClientNum].sess.sessionTeam == TEAM_SPECTATOR ) { +#ifdef MISSIONPACK + Com_sprintf( msg, sizeof(msg), "postgame %i %i 0 0 0 0 0 0 0 0 0 0 0", level.numNonSpectatorClients, playerClientNum ); +#else + Com_sprintf( msg, sizeof(msg), "postgame %i %i 0 0 0 0 0 0", level.numNonSpectatorClients, playerClientNum ); +#endif + } + else { + if( player->client->accuracy_shots ) { + accuracy = player->client->accuracy_hits * 100 / player->client->accuracy_shots; + } + else { + accuracy = 0; + } +#ifdef MISSIONPACK + won = qfalse; + if (g_gametype.integer >= GT_CTF) { + score1 = level.teamScores[TEAM_RED]; + score2 = level.teamScores[TEAM_BLUE]; + if (level.clients[playerClientNum].sess.sessionTeam == TEAM_RED) { + won = (level.teamScores[TEAM_RED] > level.teamScores[TEAM_BLUE]); + } else { + won = (level.teamScores[TEAM_BLUE] > level.teamScores[TEAM_RED]); + } + } else { + if (&level.clients[playerClientNum] == &level.clients[ level.sortedClients[0] ]) { + won = qtrue; + score1 = level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE]; + score2 = level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE]; + } else { + score2 = level.clients[ level.sortedClients[0] ].ps.persistant[PERS_SCORE]; + score1 = level.clients[ level.sortedClients[1] ].ps.persistant[PERS_SCORE]; + } + } + if (won && player->client->ps.persistant[PERS_KILLED] == 0) { + perfect = 1; + } else { + perfect = 0; + } + + if (&level.clients[playerClientNum] == &level.clients[ level.sortedClients[0] ]) { + + Com_sprintf( msg, sizeof(msg), "postgame %i %i %i %i %i %i %i %i %i %i %i %i %i %i", level.numNonSpectatorClients, playerClientNum, accuracy, + player->client->ps.persistant[PERS_IMPRESSIVE_COUNT], player->client->ps.persistant[PERS_EXCELLENT_COUNT],player->client->ps.persistant[PERS_DEFEND_COUNT], + player->client->ps.persistant[PERS_ASSIST_COUNT], player->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], player->client->ps.persistant[PERS_SCORE], + perfect, score1, score2, level.time, player->client->ps.persistant[PERS_CAPTURES] ); + +#else + //PKMOD - Ergodic 02/02/04 - calculate winner + if (&level.clients[playerClientNum] == &level.clients[ level.sortedClients[0] ]) { + winner = 1; + } else { + winner = 0; + } + + perfect = ( level.clients[playerClientNum].ps.persistant[PERS_RANK] == 0 && player->client->ps.persistant[PERS_KILLED] == 0 ) ? 1 : 0; + //PKMOD - Ergodic 08/08/00 PAINKILLER awarded after every 10 PKitem kills + //PKMOD - Ergodic 09/04/00 move painkiller to end of parameters + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + // remove the lowest bit of PERS_PAINKILLER_COUNT + //PKMOD - Ergodic 02/02/04 - modify SP postgame argument list to sync with ui_atoms.c + Com_sprintf( msg, sizeof(msg), "postgame %i %i %i %i %i %i %i %i %i %i %i", level.numNonSpectatorClients, playerClientNum, accuracy, + player->client->ps.persistant[PERS_IMPRESSIVE_COUNT], player->client->ps.persistant[PERS_EXCELLENT_COUNT], + player->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], perfect, + (player->client->ps.persistant[PERS_PAINKILLER_COUNT] >> 1) / 10, player->client->ps.persistant[PERS_SCORE], + level.time, winner ); +#endif + } + + msglen = strlen( msg ); + for( i = 0; i < level.numNonSpectatorClients; i++ ) { + n = level.sortedClients[i]; + Com_sprintf( buf, sizeof(buf), " %i %i %i", n, level.clients[n].ps.persistant[PERS_RANK], level.clients[n].ps.persistant[PERS_SCORE] ); + buflen = strlen( buf ); + if( msglen + buflen + 1 >= sizeof(msg) ) { + break; + } + strcat( msg, buf ); + } + trap_SendConsoleCommand( EXEC_APPEND, msg ); +} + + +static gentity_t *SpawnModelOnVictoryPad( gentity_t *pad, vec3_t offset, gentity_t *ent, int place ) { + gentity_t *body; + vec3_t vec; + vec3_t f, r, u; + + body = G_Spawn(); + if ( !body ) { + G_Printf( S_COLOR_RED "ERROR: out of gentities\n" ); + return NULL; + } + + body->classname = ent->client->pers.netname; + body->client = ent->client; + body->s = ent->s; + body->s.eType = ET_PLAYER; // could be ET_INVISIBLE + body->s.eFlags = 0; // clear EF_TALK, etc + body->s.powerups = 0; // clear powerups + body->s.loopSound = 0; // clear lava burning + body->s.number = body - g_entities; + body->timestamp = level.time; + body->physicsObject = qtrue; + body->physicsBounce = 0; // don't bounce + body->s.event = 0; + body->s.pos.trType = TR_STATIONARY; + body->s.groundEntityNum = ENTITYNUM_WORLD; + body->s.legsAnim = LEGS_IDLE; + body->s.torsoAnim = TORSO_STAND; + if( body->s.weapon == WP_NONE ) { + body->s.weapon = WP_MACHINEGUN; + } + //PKMOD - Ergodic 09/20/00 - add proper stance for dragon carrier + if ( ( body->s.weapon == WP_GAUNTLET) || ( body->s.weapon == WP_GRAPPLING_HOOK ) ){ + body->s.torsoAnim = TORSO_STAND2; + } + body->s.event = 0; + body->r.svFlags = ent->r.svFlags; + VectorCopy (ent->r.mins, body->r.mins); + VectorCopy (ent->r.maxs, body->r.maxs); + VectorCopy (ent->r.absmin, body->r.absmin); + VectorCopy (ent->r.absmax, body->r.absmax); + body->clipmask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP; + body->r.contents = CONTENTS_BODY; + body->r.ownerNum = ent->r.ownerNum; + body->takedamage = qfalse; + + VectorSubtract( level.intermission_origin, pad->r.currentOrigin, vec ); + vectoangles( vec, body->s.apos.trBase ); + body->s.apos.trBase[PITCH] = 0; + body->s.apos.trBase[ROLL] = 0; + + AngleVectors( body->s.apos.trBase, f, r, u ); + VectorMA( pad->r.currentOrigin, offset[0], f, vec ); + VectorMA( vec, offset[1], r, vec ); + VectorMA( vec, offset[2], u, vec ); + + G_SetOrigin( body, vec ); + + trap_LinkEntity (body); + + body->count = place; + + return body; +} + + +static void CelebrateStop( gentity_t *player ) { + int anim; + + //PKMOD - Ergodic 09/20/00 - add proper stance for dragon carrier + if ( ( player->s.weapon == WP_GAUNTLET) || ( player->s.weapon == WP_GRAPPLING_HOOK ) ){ + anim = TORSO_STAND2; + } + else { + anim = TORSO_STAND; + } + player->s.torsoAnim = ( ( player->s.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; +} + + +#define TIMER_GESTURE (34*66+50) +static void CelebrateStart( gentity_t *player ) { + player->s.torsoAnim = ( ( player->s.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | TORSO_GESTURE; + player->nextthink = level.time + TIMER_GESTURE; + player->think = CelebrateStop; + + /* + player->client->ps.events[player->client->ps.eventSequence & (MAX_PS_EVENTS-1)] = EV_TAUNT; + player->client->ps.eventParms[player->client->ps.eventSequence & (MAX_PS_EVENTS-1)] = 0; + player->client->ps.eventSequence++; + */ + G_AddEvent(player, EV_TAUNT, 0); +} + + +static vec3_t offsetFirst = {0, 0, 74}; +static vec3_t offsetSecond = {-10, 60, 54}; +static vec3_t offsetThird = {-19, -60, 45}; + +static void PodiumPlacementThink( gentity_t *podium ) { + vec3_t vec; + vec3_t origin; + vec3_t f, r, u; + + podium->nextthink = level.time + 100; + + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( level.intermission_angle, vec, NULL, NULL ); + AngleVectorsForward( level.intermission_angle, vec ); + VectorMA( level.intermission_origin, trap_Cvar_VariableIntegerValue( "g_podiumDist" ), vec, origin ); + origin[2] -= trap_Cvar_VariableIntegerValue( "g_podiumDrop" ); + G_SetOrigin( podium, origin ); + + if( podium1 ) { + VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec ); + vectoangles( vec, podium1->s.apos.trBase ); + podium1->s.apos.trBase[PITCH] = 0; + podium1->s.apos.trBase[ROLL] = 0; + + AngleVectors( podium1->s.apos.trBase, f, r, u ); + VectorMA( podium->r.currentOrigin, offsetFirst[0], f, vec ); + VectorMA( vec, offsetFirst[1], r, vec ); + VectorMA( vec, offsetFirst[2], u, vec ); + + G_SetOrigin( podium1, vec ); + } + + if( podium2 ) { + VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec ); + vectoangles( vec, podium2->s.apos.trBase ); + podium2->s.apos.trBase[PITCH] = 0; + podium2->s.apos.trBase[ROLL] = 0; + + AngleVectors( podium2->s.apos.trBase, f, r, u ); + VectorMA( podium->r.currentOrigin, offsetSecond[0], f, vec ); + VectorMA( vec, offsetSecond[1], r, vec ); + VectorMA( vec, offsetSecond[2], u, vec ); + + G_SetOrigin( podium2, vec ); + } + + if( podium3 ) { + VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec ); + vectoangles( vec, podium3->s.apos.trBase ); + podium3->s.apos.trBase[PITCH] = 0; + podium3->s.apos.trBase[ROLL] = 0; + + AngleVectors( podium3->s.apos.trBase, f, r, u ); + VectorMA( podium->r.currentOrigin, offsetThird[0], f, vec ); + VectorMA( vec, offsetThird[1], r, vec ); + VectorMA( vec, offsetThird[2], u, vec ); + + G_SetOrigin( podium3, vec ); + } +} + + +static gentity_t *SpawnPodium( void ) { + gentity_t *podium; + vec3_t vec; + vec3_t origin; + + podium = G_Spawn(); + if ( !podium ) { + return NULL; + } + + podium->classname = "podium"; + podium->s.eType = ET_GENERAL; + podium->s.number = podium - g_entities; + podium->clipmask = CONTENTS_SOLID; + podium->r.contents = CONTENTS_SOLID; + podium->s.modelindex = G_ModelIndex( SP_PODIUM_MODEL ); + + //PKMOD - Ergodic 02/14/02 - optimize AngeVectors call when only "FORWARD" is needed +// AngleVectors( level.intermission_angle, vec, NULL, NULL ); + AngleVectorsForward( level.intermission_angle, vec ); + VectorMA( level.intermission_origin, trap_Cvar_VariableIntegerValue( "g_podiumDist" ), vec, origin ); + origin[2] -= trap_Cvar_VariableIntegerValue( "g_podiumDrop" ); + G_SetOrigin( podium, origin ); + + VectorSubtract( level.intermission_origin, podium->r.currentOrigin, vec ); + podium->s.apos.trBase[YAW] = vectoyaw( vec ); + trap_LinkEntity (podium); + + podium->think = PodiumPlacementThink; + podium->nextthink = level.time + 100; + return podium; +} + + +/* +================== +SpawnModelsOnVictoryPads +================== +*/ +void SpawnModelsOnVictoryPads( void ) { + gentity_t *player; + gentity_t *podium; + + podium1 = NULL; + podium2 = NULL; + podium3 = NULL; + + podium = SpawnPodium(); + + player = SpawnModelOnVictoryPad( podium, offsetFirst, &g_entities[level.sortedClients[0]], + level.clients[ level.sortedClients[0] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG ); + if ( player ) { + player->nextthink = level.time + 2000; + player->think = CelebrateStart; + podium1 = player; + } + + player = SpawnModelOnVictoryPad( podium, offsetSecond, &g_entities[level.sortedClients[1]], + level.clients[ level.sortedClients[1] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG ); + if ( player ) { + podium2 = player; + } + + if ( level.numNonSpectatorClients > 2 ) { + player = SpawnModelOnVictoryPad( podium, offsetThird, &g_entities[level.sortedClients[2]], + level.clients[ level.sortedClients[2] ].ps.persistant[PERS_RANK] &~ RANK_TIED_FLAG ); + if ( player ) { + podium3 = player; + } + } +} + + +/* +=============== +Svcmd_AbortPodium_f +=============== +*/ +void Svcmd_AbortPodium_f( void ) { + if( g_gametype.integer != GT_SINGLE_PLAYER ) { + return; + } + + if( podium1 ) { + podium1->nextthink = level.time; + podium1->think = CelebrateStop; + } +} diff --git a/quake3/source/code/game/g_bot.c b/quake3/source/code/game/g_bot.c new file mode 100644 index 0000000..98ee615 --- /dev/null +++ b/quake3/source/code/game/g_bot.c @@ -0,0 +1,1329 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +// g_bot.c + +#include "g_local.h" + + +static int g_numBots; +static char *g_botInfos[MAX_BOTS]; + + +int g_numArenas; +static char *g_arenaInfos[MAX_ARENAS]; + + +#define BOT_BEGIN_DELAY_BASE 2000 +#define BOT_BEGIN_DELAY_INCREMENT 1500 + +#define BOT_SPAWN_QUEUE_DEPTH 16 + +typedef struct { + int clientNum; + int spawnTime; +} botSpawnQueue_t; + +//static int botBeginDelay = 0; // bk001206 - unused, init +static botSpawnQueue_t botSpawnQueue[BOT_SPAWN_QUEUE_DEPTH]; + +vmCvar_t bot_minplayers; + +extern gentity_t *podium1; +extern gentity_t *podium2; +extern gentity_t *podium3; + +float trap_Cvar_VariableValue( const char *var_name ) { + char buf[128]; + + trap_Cvar_VariableStringBuffer(var_name, buf, sizeof(buf)); + return atof(buf); +} + + + +/* +=============== +G_ParseInfos +=============== +*/ +int G_ParseInfos( char *buf, int max, char *infos[] ) { + char *token; + int count; + char key[MAX_TOKEN_CHARS]; + char info[MAX_INFO_STRING]; + + count = 0; + + while ( 1 ) { + token = COM_Parse( &buf ); + if ( !token[0] ) { + break; + } + if ( strcmp( token, "{" ) ) { + Com_Printf( "Missing { in info file\n" ); + break; + } + + if ( count == max ) { + Com_Printf( "Max infos exceeded\n" ); + break; + } + + info[0] = '\0'; + while ( 1 ) { + token = COM_ParseExt( &buf, qtrue ); + if ( !token[0] ) { + Com_Printf( "Unexpected end of info file\n" ); + break; + } + if ( !strcmp( token, "}" ) ) { + break; + } + Q_strncpyz( key, token, sizeof( key ) ); + + token = COM_ParseExt( &buf, qfalse ); + if ( !token[0] ) { + strcpy( token, "" ); + } + Info_SetValueForKey( info, key, token ); + } + //NOTE: extra space for arena number + infos[count] = G_Alloc(strlen(info) + strlen("\\num\\") + strlen(va("%d", MAX_ARENAS)) + 1); + if (infos[count]) { + strcpy(infos[count], info); + count++; + } + } + return count; +} + +/* +=============== +G_LoadArenasFromFile +=============== +*/ +static void G_LoadArenasFromFile( char *filename ) { + int len; + fileHandle_t f; + char buf[MAX_ARENAS_TEXT]; + + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + if ( !f ) { + trap_Printf( va( S_COLOR_RED "file not found: %s\n", filename ) ); + return; + } + if ( len >= MAX_ARENAS_TEXT ) { + trap_Printf( va( S_COLOR_RED "file too large: %s is %i, max allowed is %i", filename, len, MAX_ARENAS_TEXT ) ); + trap_FS_FCloseFile( f ); + return; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + g_numArenas += G_ParseInfos( buf, MAX_ARENAS - g_numArenas, &g_arenaInfos[g_numArenas] ); +} + +/* +=============== +G_LoadArenas +=============== +*/ +static void G_LoadArenas( void ) { + int numdirs; + vmCvar_t arenasFile; + char filename[128]; + char dirlist[1024]; + char* dirptr; + int i, n; + int dirlen; + + g_numArenas = 0; + + trap_Cvar_Register( &arenasFile, "g_arenasFile", "", CVAR_INIT|CVAR_ROM ); + if( *arenasFile.string ) { + G_LoadArenasFromFile(arenasFile.string); + } + else { + G_LoadArenasFromFile("scripts/arenas.txt"); + } + + // get all arenas from .arena files + numdirs = trap_FS_GetFileList("scripts", ".arena", dirlist, 1024 ); + dirptr = dirlist; + for (i = 0; i < numdirs; i++, dirptr += dirlen+1) { + dirlen = strlen(dirptr); + strcpy(filename, "scripts/"); + strcat(filename, dirptr); + G_LoadArenasFromFile(filename); + } + trap_Printf( va( "%i arenas parsed\n", g_numArenas ) ); + + for( n = 0; n < g_numArenas; n++ ) { + Info_SetValueForKey( g_arenaInfos[n], "num", va( "%i", n ) ); + } +} + + +/* +=============== +G_GetArenaInfoByNumber +=============== +*/ +const char *G_GetArenaInfoByMap( const char *map ) { + int n; + + for( n = 0; n < g_numArenas; n++ ) { + if( Q_stricmp( Info_ValueForKey( g_arenaInfos[n], "map" ), map ) == 0 ) { + return g_arenaInfos[n]; + } + } + + return NULL; +} + + +/* +================= +PlayerIntroSound +================= +*/ +static void PlayerIntroSound( const char *modelAndSkin ) { + char model[MAX_QPATH]; + char *skin; + + Q_strncpyz( model, modelAndSkin, sizeof(model) ); + skin = Q_strrchr( model, '/' ); + if ( skin ) { + *skin++ = '\0'; + } + else { + skin = model; + } + + if( Q_stricmp( skin, "default" ) == 0 ) { + skin = model; + } + + trap_SendConsoleCommand( EXEC_APPEND, va( "play sound/player/announce/%s.wav\n", skin ) ); +} + +/* +=============== +G_AddRandomBot +=============== +*/ +void G_AddRandomBot( int team ) { + int i, n, num; + float skill; + char *value, netname[36], *teamstr; + gclient_t *cl; + + num = 0; + for ( n = 0; n < g_numBots ; n++ ) { + value = Info_ValueForKey( g_botInfos[n], "name" ); + // + for ( i=0 ; i< g_maxclients.integer ; i++ ) { + cl = level.clients + i; + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { + continue; + } + if ( team >= 0 && cl->sess.sessionTeam != team ) { + continue; + } + if ( !Q_stricmp( value, cl->pers.netname ) ) { + break; + } + } + if (i >= g_maxclients.integer) { + num++; + } + } + num = random() * num; + for ( n = 0; n < g_numBots ; n++ ) { + value = Info_ValueForKey( g_botInfos[n], "name" ); + // + for ( i=0 ; i< g_maxclients.integer ; i++ ) { + cl = level.clients + i; + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { + continue; + } + if ( team >= 0 && cl->sess.sessionTeam != team ) { + continue; + } + if ( !Q_stricmp( value, cl->pers.netname ) ) { + break; + } + } + if (i >= g_maxclients.integer) { + num--; + if (num <= 0) { + skill = trap_Cvar_VariableValue( "g_spSkill" ); + if (team == TEAM_RED) teamstr = "red"; + else if (team == TEAM_BLUE) teamstr = "blue"; + else teamstr = ""; + strncpy(netname, value, sizeof(netname)-1); + netname[sizeof(netname)-1] = '\0'; + Q_CleanStr(netname); + + //PKMOD - Ergodic 01/14/02 - debug bot's restart (inactive) +// Com_Printf("G_AddRandomBot - >%s<\n", netname ); + + trap_SendConsoleCommand( EXEC_INSERT, va("addbot %s %f %s %i\n", netname, skill, teamstr, 0) ); + return; + } + } + } +} + +/* +=============== +G_RemoveRandomBot +=============== +*/ +int G_RemoveRandomBot( int team ) { + int i; + char netname[36]; + gclient_t *cl; + + for ( i=0 ; i< g_maxclients.integer ; i++ ) { + cl = level.clients + i; + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { + continue; + } + if ( team >= 0 && cl->sess.sessionTeam != team ) { + continue; + } + + //PKMOD - Ergodic 12/16/02 - Never remove a Private Bot + // 02/29/04 - NOTE: this works for SP games but not Client/Server games + if ( g_entities[cl->ps.clientNum].r.svFlags & SVF_PRIVATEBOT ) { + continue; + } + + strcpy(netname, cl->pers.netname); + Q_CleanStr(netname); + + //PKMOD - Ergodic 02/29/04 - debug PB removal on client/server games (inactive) + //Com_Printf( "G_RemoveRandomBot - removing i>%d<, i_flags>%d<, cl->ps.clientNum>%d<, clientNum_flags>%d<, netname>%s<\n", i, g_entities[i].r.svFlags, cl->ps.clientNum, g_entities[cl->ps.clientNum].r.svFlags, netname ); + //G_LogPrintf( "G_RemoveRandomBot - removing i>%d<, i_flags>%d<, cl->ps.clientNum>%d<, clientNum_flags>%d<, netname>%s<\n", i, g_entities[i].r.svFlags, cl->ps.clientNum, g_entities[cl->ps.clientNum].r.svFlags, netname ); + + trap_SendConsoleCommand( EXEC_INSERT, va("kick %s\n", netname) ); + return qtrue; + } + return qfalse; +} + +/* +=============== +G_CountHumanPlayers +=============== +*/ +int G_CountHumanPlayers( int team ) { + int i, num; + gclient_t *cl; + + num = 0; + for ( i=0 ; i< g_maxclients.integer ; i++ ) { + cl = level.clients + i; + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + if ( g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT ) { + continue; + } + if ( team >= 0 && cl->sess.sessionTeam != team ) { + continue; + } + num++; + } + return num; +} + +/* +=============== +G_CountBotPlayers +=============== +*/ +int G_CountBotPlayers( int team ) { + int i, n, num; + gclient_t *cl; + + num = 0; + for ( i=0 ; i< g_maxclients.integer ; i++ ) { + cl = level.clients + i; + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { + continue; + } + if ( team >= 0 && cl->sess.sessionTeam != team ) { + continue; + } + //PKMOD - Ergodic 01/21/02 - don't count Private Bots (inactive) + //PKMOD - Ergodic 07/21/02 - don't count Private Bots, now active + if ( g_entities[cl->ps.clientNum].r.svFlags & SVF_PRIVATEBOT ) { + continue; + } + num++; + } + for( n = 0; n < BOT_SPAWN_QUEUE_DEPTH; n++ ) { + if( !botSpawnQueue[n].spawnTime ) { + continue; + } + if ( botSpawnQueue[n].spawnTime > level.time ) { + continue; + } + num++; + } + + return num; +} + +/* +=============== +G_CheckMinimumPlayers +=============== +*/ +void G_CheckMinimumPlayers( void ) { + int minplayers; + int humanplayers, botplayers; + static int checkminimumplayers_time; + + if (level.intermissiontime) return; + //only check once each 10 seconds + if (checkminimumplayers_time > level.time - 10000) { + return; + } + checkminimumplayers_time = level.time; + trap_Cvar_Update(&bot_minplayers); + minplayers = bot_minplayers.integer; + if (minplayers <= 0) return; + + if (g_gametype.integer >= GT_TEAM) { + if (minplayers >= g_maxclients.integer / 2) { + minplayers = (g_maxclients.integer / 2) -1; + } + + humanplayers = G_CountHumanPlayers( TEAM_RED ); + botplayers = G_CountBotPlayers( TEAM_RED ); + // + if (humanplayers + botplayers < minplayers) { + G_AddRandomBot( TEAM_RED ); + } else if (humanplayers + botplayers > minplayers && botplayers) { + G_RemoveRandomBot( TEAM_RED ); + } + // + humanplayers = G_CountHumanPlayers( TEAM_BLUE ); + botplayers = G_CountBotPlayers( TEAM_BLUE ); + // + if (humanplayers + botplayers < minplayers) { + G_AddRandomBot( TEAM_BLUE ); + } else if (humanplayers + botplayers > minplayers && botplayers) { + G_RemoveRandomBot( TEAM_BLUE ); + } + } + else if (g_gametype.integer == GT_TOURNAMENT ) { + if (minplayers >= g_maxclients.integer) { + minplayers = g_maxclients.integer-1; + } + humanplayers = G_CountHumanPlayers( -1 ); + botplayers = G_CountBotPlayers( -1 ); + // + if (humanplayers + botplayers < minplayers) { + G_AddRandomBot( TEAM_FREE ); + } else if (humanplayers + botplayers > minplayers && botplayers) { + // try to remove spectators first + if (!G_RemoveRandomBot( TEAM_SPECTATOR )) { + // just remove the bot that is playing + G_RemoveRandomBot( -1 ); + } + } + } + else if (g_gametype.integer == GT_FFA) { + if (minplayers >= g_maxclients.integer) { + minplayers = g_maxclients.integer-1; + } + humanplayers = G_CountHumanPlayers( TEAM_FREE ); + botplayers = G_CountBotPlayers( TEAM_FREE ); + // + if (humanplayers + botplayers < minplayers) { + G_AddRandomBot( TEAM_FREE ); + } else if (humanplayers + botplayers > minplayers && botplayers) { + G_RemoveRandomBot( TEAM_FREE ); + } + } +} + +/* +=============== +G_CheckBotSpawn +=============== +*/ +void G_CheckBotSpawn( void ) { + int n; + char userinfo[MAX_INFO_VALUE]; + + G_CheckMinimumPlayers(); + + for( n = 0; n < BOT_SPAWN_QUEUE_DEPTH; n++ ) { + if( !botSpawnQueue[n].spawnTime ) { + continue; + } + if ( botSpawnQueue[n].spawnTime > level.time ) { + continue; + } + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("G_CheckBotSpawn - before client begin\n" ); + + ClientBegin( botSpawnQueue[n].clientNum ); + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("G_CheckBotSpawn - after client begin\n" ); + + botSpawnQueue[n].spawnTime = 0; + + if( g_gametype.integer == GT_SINGLE_PLAYER ) { + trap_GetUserinfo( botSpawnQueue[n].clientNum, userinfo, sizeof(userinfo) ); + PlayerIntroSound( Info_ValueForKey (userinfo, "model") ); + } + } +} + + +/* +=============== +AddBotToSpawnQueue +=============== +*/ +static void AddBotToSpawnQueue( int clientNum, int delay ) { + int n; + + for( n = 0; n < BOT_SPAWN_QUEUE_DEPTH; n++ ) { + if( !botSpawnQueue[n].spawnTime ) { + botSpawnQueue[n].spawnTime = level.time + delay; + botSpawnQueue[n].clientNum = clientNum; + return; + } + } + + G_Printf( S_COLOR_YELLOW "Unable to delay spawn\n" ); + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("AddBotToSpawnQueue - before client begin\n" ); + + ClientBegin( clientNum ); + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("AddBotToSpawnQueue - after client begin\n" ); + +} + + +/* +=============== +G_RemoveQueuedBotBegin + +Called on client disconnect to make sure the delayed spawn +doesn't happen on a freed index +=============== +*/ +void G_RemoveQueuedBotBegin( int clientNum ) { + int n; + + for( n = 0; n < BOT_SPAWN_QUEUE_DEPTH; n++ ) { + if( botSpawnQueue[n].clientNum == clientNum ) { + botSpawnQueue[n].spawnTime = 0; + return; + } + } +} + + +/* +=============== +G_BotConnect +=============== +*/ +qboolean G_BotConnect( int clientNum, qboolean restart ) { + bot_settings_t settings; + char userinfo[MAX_INFO_STRING]; + + trap_GetUserinfo( clientNum, userinfo, sizeof(userinfo) ); + + Q_strncpyz( settings.characterfile, Info_ValueForKey( userinfo, "characterfile" ), sizeof(settings.characterfile) ); + settings.skill = atof( Info_ValueForKey( userinfo, "skill" ) ); + Q_strncpyz( settings.team, Info_ValueForKey( userinfo, "team" ), sizeof(settings.team) ); + + if (!BotAISetupClient( clientNum, &settings, restart )) { + trap_DropClient( clientNum, "BotAISetupClient failed" ); + return qfalse; + } + + return qtrue; +} + + +/* +=============== +G_AddBot +=============== +*/ +static void G_AddBot( const char *name, float skill, const char *team, int delay, char *altname) { + int clientNum; + char *botinfo; + gentity_t *bot; + char *key; + char *s; + char *botname; + char *model; + char *headmodel; + char userinfo[MAX_INFO_STRING]; + + //PKMOD - Ergodic 02/19/04 - debug bot's userinfo (inactive) + //Com_Printf("G_AddBot - >%s<\n", name ); + + // get the botinfo from bots.txt + botinfo = G_GetBotInfoByName( name ); + if ( !botinfo ) { + G_Printf( S_COLOR_RED "Error: Bot '%s' not defined\n", name ); + return; + } + + // create the bot's userinfo + userinfo[0] = '\0'; + + botname = Info_ValueForKey( botinfo, "funname" ); + if( !botname[0] ) { + botname = Info_ValueForKey( botinfo, "name" ); + } + // check for an alternative name + if (altname && altname[0]) { + botname = altname; + } + Info_SetValueForKey( userinfo, "name", botname ); + Info_SetValueForKey( userinfo, "rate", "25000" ); + Info_SetValueForKey( userinfo, "snaps", "20" ); + Info_SetValueForKey( userinfo, "skill", va("%1.2f", skill) ); + + if ( skill >= 1 && skill < 2 ) { + Info_SetValueForKey( userinfo, "handicap", "50" ); + } + else if ( skill >= 2 && skill < 3 ) { + Info_SetValueForKey( userinfo, "handicap", "70" ); + } + else if ( skill >= 3 && skill < 4 ) { + Info_SetValueForKey( userinfo, "handicap", "90" ); + } + + key = "model"; + model = Info_ValueForKey( botinfo, key ); + if ( !*model ) { + model = "visor/default"; + } + Info_SetValueForKey( userinfo, key, model ); + key = "team_model"; + Info_SetValueForKey( userinfo, key, model ); + + key = "headmodel"; + headmodel = Info_ValueForKey( botinfo, key ); + if ( !*headmodel ) { + headmodel = model; + } + Info_SetValueForKey( userinfo, key, headmodel ); + key = "team_headmodel"; + Info_SetValueForKey( userinfo, key, headmodel ); + + key = "gender"; + s = Info_ValueForKey( botinfo, key ); + if ( !*s ) { + s = "male"; + } + Info_SetValueForKey( userinfo, "sex", s ); + + key = "color1"; + s = Info_ValueForKey( botinfo, key ); + if ( !*s ) { + s = "4"; + } + Info_SetValueForKey( userinfo, key, s ); + + key = "color2"; + s = Info_ValueForKey( botinfo, key ); + if ( !*s ) { + s = "5"; + } + Info_SetValueForKey( userinfo, key, s ); + + s = Info_ValueForKey(botinfo, "aifile"); + if (!*s ) { + trap_Printf( S_COLOR_RED "Error: bot has no aifile specified\n" ); + return; + } + + // have the server allocate a client slot + clientNum = trap_BotAllocateClient(); + if ( clientNum == -1 ) { + G_Printf( S_COLOR_RED "Unable to add bot. All player slots are in use.\n" ); + G_Printf( S_COLOR_RED "Start server with more 'open' slots (or check setting of sv_maxclients cvar).\n" ); + return; + } + + // initialize the bot settings + if( !team || !*team ) { + if( g_gametype.integer >= GT_TEAM ) { + if( PickTeam(clientNum) == TEAM_RED) { + team = "red"; + } + else { + team = "blue"; + } + } + else { + team = "red"; + } + } + Info_SetValueForKey( userinfo, "characterfile", Info_ValueForKey( botinfo, "aifile" ) ); + Info_SetValueForKey( userinfo, "skill", va( "%5.2f", skill ) ); + Info_SetValueForKey( userinfo, "team", team ); + + bot = &g_entities[ clientNum ]; + bot->r.svFlags |= SVF_BOT; + //PKMOD - Ergodic 03/07/02 - clear Private Bot flag + bot->r.svFlags &= ~SVF_PRIVATEBOT; + + bot->inuse = qtrue; + + //PKMOD - Ergodic 01/06/02 - debug bot's userinfo +// Com_Printf("G_AddBot - clientNum is>%d<\n", clientNum ); +// Com_Printf("G_AddBot - g_PrivateBotSkill.integer>%d<\n", g_PrivateBotSkill.integer ); +// Com_Printf("G_AddBot - g_PrivateBotSkill.value>%1.2f<\n", g_PrivateBotSkill.value ); +// Com_Printf("G_AddBot - aifile>%s<\n", Info_ValueForKey( botinfo, "aifile" )); +// Com_Printf("G_AddBot - userinfo>%s<\n", userinfo); +// Info_SetValueForKey( userinfo, "legsmodel", "hunter/default" ); +// Info_SetValueForKey( userinfo, "headmodel", "visor/painkiller" ); +// Com_Printf("G_AddBot - userinfo>%s<\n", userinfo); + + // register the userinfo + trap_SetUserinfo( clientNum, userinfo ); + + // have it connect to the game as a normal client + if ( ClientConnect( clientNum, qtrue, qtrue ) ) { + return; + } + + if( delay == 0 ) { + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("G_AddBot - before client begin\n" ); + + ClientBegin( clientNum ); + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("G_AddBot - after client begin\n" ); + + return; + } + + AddBotToSpawnQueue( clientNum, delay ); +} + + +/* +=============== +Svcmd_AddBot_f +=============== +*/ +void Svcmd_AddBot_f( void ) { + float skill; + int delay; + char name[MAX_TOKEN_CHARS]; + char altname[MAX_TOKEN_CHARS]; + char string[MAX_TOKEN_CHARS]; + char team[MAX_TOKEN_CHARS]; + + // are bots enabled? + if ( !trap_Cvar_VariableIntegerValue( "bot_enable" ) ) { + return; + } + + // name + trap_Argv( 1, name, sizeof( name ) ); + if ( !name[0] ) { + trap_Printf( "Usage: Addbot [skill 1-5] [team] [msec delay] [altname]\n" ); + return; + } + + // skill + trap_Argv( 2, string, sizeof( string ) ); + if ( !string[0] ) { + skill = 4; + } + else { + skill = atof( string ); + } + + // team + trap_Argv( 3, team, sizeof( team ) ); + + // delay + trap_Argv( 4, string, sizeof( string ) ); + if ( !string[0] ) { + delay = 0; + } + else { + delay = atoi( string ); + } + + // alternative name + trap_Argv( 5, altname, sizeof( altname ) ); + + G_AddBot( name, skill, team, delay, altname ); + + // if this was issued during gameplay and we are playing locally, + // go ahead and load the bot's media immediately + if ( level.time - level.startTime > 1000 && + trap_Cvar_VariableIntegerValue( "cl_running" ) ) { + trap_SendServerCommand( -1, "loaddefered\n" ); // FIXME: spelled wrong, but not changing for demo + } +} + +/* +====================================================================== + +PKMOD - Ergodic 01/13/02 - Private Bot Driver entity + - verifys the status of client owner + - extinguish private bot at end of duration + +Note: ent->parent = Private Bot + ent->parent->parent = owner of Private Bot + +====================================================================== +*/ +void botdriverThink (gentity_t *ent) { + + //remove driver entity if Private Bot is disconnected + if (!strcmp( ent->parent->classname,"disconnected" ) || ( ent->parent->client->pers.connected == CON_DISCONNECTED )) { + G_FreeEntity( ent ); + return; + } + + //remove Private Bot if owner has disconnected + if (!strcmp( ent->parent->parent->classname,"disconnected" ) || ( ent->parent->parent->client->pers.connected == CON_DISCONNECTED )) { +// trap_SendConsoleCommand( EXEC_APPEND, va("clientkick %i\n", ent->parent->client->ps.clientNum ) ); + + //PKMOD - Ergodic 02/27/04 - Reset the Private Bot flag + // This flag may cause next clients that start in the same area to be unable to join + // in the server + ent->parent->r.svFlags &= ~SVF_PRIVATEBOT; + + //PKMOD - Ergodic 01/19/02 - use trap_DropClient instead of clientkick + trap_DropClient( ent->parent->client->ps.clientNum, "has lost faith in his Leader" ); + //PKMOD - Ergodic 03/18/02 - decrement the Private Bot Counter + active_private_bots--; + G_FreeEntity( ent ); + return; + } + + //remove Private Bot if owner's status has changed + if ( ent->s.modelindex != ent->parent->parent->client->sess.sessionTeam ) { +// trap_SendConsoleCommand( EXEC_APPEND, va("clientkick %i\n", ent->parent->client->ps.clientNum ) ); + + //PKMOD - Ergodic 02/27/04 - Reset the Private Bot flag + // This flag may cause next clients that start in the same area to be unable to join + // in the server + ent->parent->r.svFlags &= ~SVF_PRIVATEBOT; + + //PKMOD - Ergodic 01/19/02 - use trap_DropClient instead of clientkick + trap_DropClient( ent->parent->client->ps.clientNum, "was Betrayed by his Leader" ); + //PKMOD - Ergodic 03/18/02 - decrement the Private Bot Counter + active_private_bots--; + G_FreeEntity( ent ); + return; + } + + if ( ent->wait > level.time ) { + ent->eventTime = level.time; + ent->nextthink = level.time + 300; + trap_LinkEntity( ent ); + } + else { +// trap_SendConsoleCommand( EXEC_APPEND, va("clientkick %i\n", ent->parent->client->ps.clientNum ) ); + + //PKMOD - Ergodic 02/27/04 - Reset the Private Bot flag + // This flag may cause next clients that start in the same area to be unable to join + // in the server + ent->parent->r.svFlags &= ~SVF_PRIVATEBOT; + + //PKMOD - Ergodic 01/19/02 - use trap_DropClient instead of clientkick + trap_DropClient( ent->parent->client->ps.clientNum, "has completed his mission!" ); + //PKMOD - Ergodic 03/18/02 - decrement the Private Bot Counter + active_private_bots--; + G_FreeEntity( ent ); + } +} + +#define PRIVATE_BOT_DURATION 40000 //40 seconds + +/* +=============== +G_AddPrivateBot + +PKMOD - Ergodic 01/06/02 - add "Private Bot" to the game +=============== +*/ +void G_AddPrivateBot( gentity_t *owner ) { + int clientNum; +// char *botinfo; + gentity_t *bot; + char userinfo[MAX_INFO_STRING]; + float skill; + char *team; + char model[MAX_INFO_STRING]; + char headmodel[MAX_INFO_STRING]; + char sex[MAX_INFO_STRING]; + char ownerinfo[MAX_INFO_STRING]; + //PKMOD - Ergodic 01/13/02 - add driver entity for "Private Bot" + gentity_t *bot_driver; + //PKMOD - Ergodic 04/02/02 - owner's cells will add to Private Bot's duration + int cells; + + // create the bot's userinfo + userinfo[0] = '\0'; + + Info_SetValueForKey( userinfo, "name", "PrivateBot" ); + Info_SetValueForKey( userinfo, "rate", "25000" ); + Info_SetValueForKey( userinfo, "snaps", "20" ); + + skill = g_PrivateBotSkill.value; + + //PKMOD - Ergodic 01/10/02 - debug bot's skill (inactive) +// Com_Printf("G_AddPrivateBot - skill>%5.2f<\n", skill ); + + Info_SetValueForKey( userinfo, "skill", va("%1.2f", skill) ); + + if ( skill >= 1 && skill < 2 ) { + Info_SetValueForKey( userinfo, "handicap", "50" ); + } + else if ( skill >= 2 && skill < 3 ) { + Info_SetValueForKey( userinfo, "handicap", "70" ); + } + else if ( skill >= 3 && skill < 4 ) { + Info_SetValueForKey( userinfo, "handicap", "90" ); + } + + //PKMOD - Ergodic 03/06/02 - get owner info + trap_GetConfigstring(CS_PLAYERS+owner->client->ps.clientNum, ownerinfo, sizeof(ownerinfo)); + +// Info_SetValueForKey( userinfo, "model", "visor/painkeep" ); + //PKMOD - Ergodic 03/06/02 - set Private Bot's model and skin to mimic owners + //model + strcpy(model, Info_ValueForKey( ownerinfo, "model" )); + if ( !*model ) { + strcpy(model, "visor/default"); + } + Info_SetValueForKey( userinfo, "model", model ); + +// Info_SetValueForKey( userinfo, "headmodel", "visor/painkeep" ); + //PKMOD - Ergodic 03/07/02 - set Private Bot's model and skin to mimic owners + //headmodel + strcpy(headmodel, Info_ValueForKey( ownerinfo, "headmodel" )); + if ( !*headmodel ) { //if headmodel is not set then default to model + strcpy(headmodel, model); + } + Info_SetValueForKey( userinfo, "headmodel", headmodel ); + + //PKMOD - Ergodic 03/07/02 - set Private Bot's model and skin to mimic owners + //headmodel +// Info_SetValueForKey( userinfo, "sex", "male" ); + strcpy(sex, Info_ValueForKey( ownerinfo, "sex" )); + if ( !*sex ) { //if sex is not set then default to male (Biased?... hmmmm) + strcpy(sex, "male"); + } + Info_SetValueForKey( userinfo, "sex", sex ); + + Info_SetValueForKey( userinfo, "color1", "3" ); + Info_SetValueForKey( userinfo, "color2", "3" ); + + //PKMOD - Ergodic 01/09/02 - add info to structure so Private Bot will not appear in scoreboard + Info_SetValueForKey( userinfo, "privateBot", "1" ); + + // have the server allocate a client slot + clientNum = trap_BotAllocateClient(); + if ( clientNum == -1 ) { + G_Printf( S_COLOR_RED "Unable to add bot. All player slots are in use.\n" ); + G_Printf( S_COLOR_RED "Start server with more 'open' slots (or check setting of sv_maxclients cvar).\n" ); + return; + } + + // initialize the bot team settings + if( g_gametype.integer >= GT_TEAM ) { + // same team, if the flag at base, check to he has the enemy flag + if (owner->client->sess.sessionTeam == TEAM_RED) + team = "red"; + else + team = "blue"; + } + + Info_SetValueForKey( userinfo, "characterfile", "bots/privatebot_c.c" ); + Info_SetValueForKey( userinfo, "team", team ); + + bot = &g_entities[ clientNum ]; + bot->r.svFlags |= SVF_BOT; + bot->r.svFlags |= SVF_PRIVATEBOT; + bot->inuse = qtrue; + + //set the owner + //PKMOD - Ergodic 01/10/02 - if owner is a Private Bot then set owner to the originating player + if ( owner->r.svFlags & SVF_PRIVATEBOT ) + bot->parent = owner->parent; + else + bot->parent = owner; + + //PKMOD - Ergodic 01/09/02 - debug bot's userinfo (inactive) +// Com_Printf("G_AddPrivateBot - userinfo>%s<\n", userinfo); + + // register the userinfo + trap_SetUserinfo( clientNum, userinfo ); + + //PKMOD - Ergodic 04/02/02 - calculate cells + cells = owner->client->ps.ammo[ WP_LIGHTNING ] / 10; + //update lightning ammo + owner->client->ps.ammo[ WP_LIGHTNING ] -= cells * 10; + + //PKMOD - Ergodic 01/13/02 - establish driver entity parameters for "Private Bot" + bot_driver = G_Spawn(); + bot_driver->classname = "PrivateBotDriver"; + bot_driver->s.eType = ET_GENERAL; + bot_driver->r.ownerNum = bot->s.number; + bot_driver->parent = bot; + bot_driver->s.modelindex = bot->parent->client->sess.sessionTeam; + bot_driver->think = botdriverThink; + //PKMOD - Ergodic 04/03/02 - add "cell" time to Private Bot duration + bot_driver->wait = level.time + PRIVATE_BOT_DURATION + 4000 * random() + 1000 * cells; + bot_driver->nextthink = level.time + 300; + bot_driver->eventTime = level.time; + + //PKMOD - Ergodic 03/15/04 - debug bot's restart (inactive) +// Com_Printf("G_AddPrivateBot - before client connect\n" ); +// G_LogPrintf( "G_AddPrivateBot - before client connect\n" ); + + // have it connect to the game as a normal client + if ( ClientConnect( clientNum, qtrue, qtrue ) ) { + //PKMOD - Ergodic 03/15/04 - debug bot's restart (inactive) +// Com_Printf("G_AddPrivateBot - premature leaving of procedure\n" ); +// G_LogPrintf("G_AddPrivateBot - premature leaving of procedure\n" ); + return; + } + + //PKMOD - Ergodic 03/15/04 - debug bot's restart (inactive) +// Com_Printf("G_AddPrivateBot - before client begin\n" ); +// G_LogPrintf("G_AddPrivateBot - before client begin\n" ); + + ClientBegin( clientNum ); + + //PKMOD - Ergodic 01/19/02 - set bot's playerstate for use on cgame side + //PKMOD - Ergodic 02/05/02 - change STAT_PKA_BITS settings from enum type to definition + bot->client->ps.stats[STAT_PKA_BITS] = PKA_BITS_PRIVATEBOT; + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("G_AddPrivateBot - after client begin\n" ); + +} + + +/* +=============== +Svcmd_BotList_f +=============== +*/ +void Svcmd_BotList_f( void ) { + int i; + char name[MAX_TOKEN_CHARS]; + char funname[MAX_TOKEN_CHARS]; + char model[MAX_TOKEN_CHARS]; + char aifile[MAX_TOKEN_CHARS]; + + trap_Printf("^1name model aifile funname\n"); + for (i = 0; i < g_numBots; i++) { + strcpy(name, Info_ValueForKey( g_botInfos[i], "name" )); + if ( !*name ) { + strcpy(name, "UnnamedPlayer"); + } + strcpy(funname, Info_ValueForKey( g_botInfos[i], "funname" )); + if ( !*funname ) { + strcpy(funname, ""); + } + strcpy(model, Info_ValueForKey( g_botInfos[i], "model" )); + if ( !*model ) { + strcpy(model, "visor/default"); + } + strcpy(aifile, Info_ValueForKey( g_botInfos[i], "aifile")); + if (!*aifile ) { + strcpy(aifile, "bots/default_c.c"); + } + trap_Printf(va("%-16s %-16s %-20s %-20s\n", name, model, aifile, funname)); + } +} + + +/* +=============== +G_SpawnBots +=============== +*/ +static void G_SpawnBots( char *botList, int baseDelay ) { + char *bot; + char *p; + float skill; + int delay; + char bots[MAX_INFO_VALUE]; + + podium1 = NULL; + podium2 = NULL; + podium3 = NULL; + + skill = trap_Cvar_VariableValue( "g_spSkill" ); + if( skill < 1 ) { + trap_Cvar_Set( "g_spSkill", "1" ); + skill = 1; + } + else if ( skill > 5 ) { + trap_Cvar_Set( "g_spSkill", "5" ); + skill = 5; + } + + Q_strncpyz( bots, botList, sizeof(bots) ); + p = &bots[0]; + delay = baseDelay; + while( *p ) { + //skip spaces + while( *p && *p == ' ' ) { + p++; + } + if( !p ) { + break; + } + + // mark start of bot name + bot = p; + + // skip until space of null + while( *p && *p != ' ' ) { + p++; + } + if( *p ) { + *p++ = 0; + } + + // we must add the bot this way, calling G_AddBot directly at this stage + // does "Bad Things" + + //PKMOD - Ergodic 01/14/02 - debug bot's restart (inactive) +// Com_Printf("G_SpawnBots - >%s<\n", bot ); + + trap_SendConsoleCommand( EXEC_INSERT, va("addbot %s %f free %i\n", bot, skill, delay) ); + + delay += BOT_BEGIN_DELAY_INCREMENT; + } +} + + +/* +=============== +G_LoadBotsFromFile +=============== +*/ +static void G_LoadBotsFromFile( char *filename ) { + int len; + fileHandle_t f; + char buf[MAX_BOTS_TEXT]; + + len = trap_FS_FOpenFile( filename, &f, FS_READ ); + if ( !f ) { + trap_Printf( va( S_COLOR_RED "file not found: %s\n", filename ) ); + return; + } + if ( len >= MAX_BOTS_TEXT ) { + trap_Printf( va( S_COLOR_RED "file too large: %s is %i, max allowed is %i", filename, len, MAX_BOTS_TEXT ) ); + trap_FS_FCloseFile( f ); + return; + } + + trap_FS_Read( buf, len, f ); + buf[len] = 0; + trap_FS_FCloseFile( f ); + + g_numBots += G_ParseInfos( buf, MAX_BOTS - g_numBots, &g_botInfos[g_numBots] ); +} + +/* +=============== +G_LoadBots +=============== +*/ +static void G_LoadBots( void ) { + vmCvar_t botsFile; + int numdirs; + char filename[128]; + char dirlist[1024]; + char* dirptr; + int i; + int dirlen; + + if ( !trap_Cvar_VariableIntegerValue( "bot_enable" ) ) { + return; + } + + g_numBots = 0; + + trap_Cvar_Register( &botsFile, "g_botsFile", "", CVAR_INIT|CVAR_ROM ); + if( *botsFile.string ) { + //PKMOD - Ergodic 01/14/02 - debug bot's restart (inactive) +// Com_Printf("G_LoadBots - botsFile>%s<\n", botsFile.string ); + + G_LoadBotsFromFile(botsFile.string); + } + else { + G_LoadBotsFromFile("scripts/bots.txt"); + } + + // get all bots from .bot files + numdirs = trap_FS_GetFileList("scripts", ".bot", dirlist, 1024 ); + dirptr = dirlist; + for (i = 0; i < numdirs; i++, dirptr += dirlen+1) { + dirlen = strlen(dirptr); + strcpy(filename, "scripts/"); + strcat(filename, dirptr); + G_LoadBotsFromFile(filename); + } + trap_Printf( va( "%i bots parsed\n", g_numBots ) ); +} + + + +/* +=============== +G_GetBotInfoByNumber +=============== +*/ +char *G_GetBotInfoByNumber( int num ) { + if( num < 0 || num >= g_numBots ) { + trap_Printf( va( S_COLOR_RED "Invalid bot number: %i\n", num ) ); + return NULL; + } + return g_botInfos[num]; +} + + +/* +=============== +G_GetBotInfoByName +=============== +*/ +char *G_GetBotInfoByName( const char *name ) { + int n; + char *value; + + for ( n = 0; n < g_numBots ; n++ ) { + value = Info_ValueForKey( g_botInfos[n], "name" ); + if ( !Q_stricmp( value, name ) ) { + return g_botInfos[n]; + } + } + + return NULL; +} + +/* +=============== +G_InitBots +=============== +*/ +void G_InitBots( qboolean restart ) { + int fragLimit; + int timeLimit; + const char *arenainfo; + char *strValue; + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + char *hub_flagValue; + int basedelay; + char map[MAX_QPATH]; + char serverinfo[MAX_INFO_STRING]; + + G_LoadBots(); + G_LoadArenas(); + + trap_Cvar_Register( &bot_minplayers, "bot_minplayers", "0", CVAR_SERVERINFO ); + + if( g_gametype.integer == GT_SINGLE_PLAYER ) { + trap_GetServerinfo( serverinfo, sizeof(serverinfo) ); + Q_strncpyz( map, Info_ValueForKey( serverinfo, "mapname" ), sizeof(map) ); + arenainfo = G_GetArenaInfoByMap( map ); + if ( !arenainfo ) { + return; + } + + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + hub_flagValue = Info_ValueForKey( arenainfo, "hub_flag" ); + + if ( ! strcmp( hub_flagValue, "1" ) ) { + strValue = Info_ValueForKey( arenainfo, "hub_fraglimit" ); + } + else { + strValue = Info_ValueForKey( arenainfo, "fraglimit" ); + } + + fragLimit = atoi( strValue ); + if ( fragLimit ) { + trap_Cvar_Set( "fraglimit", strValue ); + } + else { + trap_Cvar_Set( "fraglimit", "0" ); + } + + + //PKMOD - Ergodic 11/07/00 - add logic to enable hub limits + if ( ! strcmp( hub_flagValue, "1" ) ) { + strValue = Info_ValueForKey( arenainfo, "hub_timelimit" ); + } + else { + strValue = Info_ValueForKey( arenainfo, "timelimit" ); + } + + timeLimit = atoi( strValue ); + if ( timeLimit ) { + trap_Cvar_Set( "timelimit", strValue ); + } + else { + trap_Cvar_Set( "timelimit", "0" ); + } + + if ( !fragLimit && !timeLimit ) { + trap_Cvar_Set( "fraglimit", "10" ); + trap_Cvar_Set( "timelimit", "0" ); + } + + basedelay = BOT_BEGIN_DELAY_BASE; + strValue = Info_ValueForKey( arenainfo, "special" ); + if( Q_stricmp( strValue, "training" ) == 0 ) { + basedelay += 10000; + } + + //PKMOD - Ergodic 01/14/02 - debug bot's restart (inactive) +// Com_Printf("G_InitBots - spawning bots>%s<\n", Info_ValueForKey( arenainfo, "bots" ) ); + + if( !restart ) { + G_SpawnBots( Info_ValueForKey( arenainfo, "bots" ), basedelay ); + } + } +} diff --git a/quake3/source/code/game/g_client.c b/quake3/source/code/game/g_client.c new file mode 100644 index 0000000..9f60384 --- /dev/null +++ b/quake3/source/code/game/g_client.c @@ -0,0 +1,2008 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +#include "g_local.h" + +// g_client.c -- client functions that don't happen every frame + +static vec3_t playerMins = {-15, -15, -24}; +static vec3_t playerMaxs = {15, 15, 32}; + +//PKMOD - Ergodic 10/14/00 - qsort primative for hub votes +/* +============= +SortHub + +============= +*/ +int QDECL SortHub( const void *a, const void *b ) { + ghubsort_t *ca, *cb; + + ca = (ghubsort_t *)a; + cb = (ghubsort_t *)b; + + // then sort by score + if ( ca->map_votes > cb->map_votes ) { + return -1; + } + if ( ca->map_votes < cb->map_votes ) { + return 1; + } + return 0; +} + + +//PKMOD - Ergodic 10/12/00 - tally and broadcast hub vote poll +void func_hubvote_think( gentity_t *self ) { + ghubsort_t temp_hubInfo[MAX_HUB_INDEX]; + int indx; + int winner; + + gentity_t *ent; + char entry[1024]; + char string[1400]; + int stringlength; + int j; + int cnt; + char *s; + int mins, seconds, tens; + int msec; + + //PKMOD - Ergodic 10/12/00 - copy hub info to temp hub info + //PKMOD - Ergodic 09/16/03 - add 4 to Hub_Index for alternate Hub Maps cvars + for ( indx = 0; indx < ( Hub_Index + 4 ); indx++) { + temp_hubInfo[indx].map_votes = hubInfo[indx].map_votes; + temp_hubInfo[indx].hub_index = indx; + } + + //10/14/00 employ qsort function + //PKMOD - Ergodic 09/16/03 - add 4 to Hub_Index for alternate Hub Maps cvars + qsort( temp_hubInfo, Hub_Index + 4, sizeof(temp_hubInfo[0]), SortHub ); + + //PKMOD - Ergodic 10/12/00 - debug - hub temp dump inactive +// for ( indx = 0; indx < Hub_Index; indx++) { +// Com_Printf("func_hubvote_think - temphub: indx:%d, votes:%d\n", indx, temp_hubInfo[indx].map_votes ); +// } + + //add logic for hubinfo_overlay + string[0] = 0; + stringlength = 0; + cnt = 0; + + //determine first, second, third places in the hub voting + //PKMOD - Ergodic 09/16/03 - add 4 to Hub_Index for alternate Hub Maps cvars + for ( indx = 0; indx < ( Hub_Index + 4 ) && indx < 3; indx++) { + if ( temp_hubInfo[indx].map_votes > 0 ) { + Com_sprintf (entry, sizeof(entry), " %i %s ", temp_hubInfo[indx].map_votes, hubInfo[temp_hubInfo[indx].hub_index].map_name ); + j = strlen(entry); + strcpy (string + stringlength, entry); + stringlength += j; + cnt++; + } + } + + //11/01/00 add HUB timelimit limit message + if ( g_hub_timelimit.integer > 0 ) { + msec = g_hub_timelimit.integer * 60 * 1000 - (level.time - level.startTime); + seconds = msec / 1000; + mins = seconds / 60; + seconds -= mins * 60; + tens = seconds / 10; + seconds -= tens * 10; + s = va( "%i:%i%i", mins, tens, seconds ); + + Com_sprintf (entry, sizeof(entry), " Time: %s ", s ); + } + else { + Com_sprintf (entry, sizeof(entry), " Time: N/A " ); + } + j = strlen(entry); + strcpy (string + stringlength, entry); + stringlength += j; + cnt++; + + //add logic for hubinfo_overlay 10/13/00 + for (indx = 0; indx < g_maxclients.integer; indx++) { + ent = g_entities + indx; + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + if ( ( ent->client->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) == 1 ) { + //PKMOD - Ergodic 10/12/00 - debug inactive +// Com_Printf("func_hubvote_think:>hubinfo_pka %i %s<\n", cnt, string ); + + trap_SendServerCommand( ent-g_entities, va("hubinfo_pka %2i - %s", cnt, string) ); + } + } + + //10/14/00 - set the nextmap to leading map + //Determine if there are any ties + cnt = 1; + winner = 0; + if ( Hub_Index != 1 ) { + //PKMOD - Ergodic 09/16/03 - add 4 to Hub_Index for alternate Hub Maps cvars + //PKMOD - Ergodic 01/05/04 - upon ties only pick the standard hub maps so ... + // DO NOT add 4 to Hub_Index + for ( indx = 1; indx < Hub_Index; indx++ ) { + if ( temp_hubInfo[0].map_votes != temp_hubInfo[indx].map_votes ) + break; + cnt++; + } + + if ( cnt > 1 ) + winner = rand() % cnt; + } + + //PKMOD - Ergodic 10/12/00 - debug inactive +// Com_Printf("func_hubvote_think - winner:%d\n", winner ); + //PKMOD - Ergodic 12/07/00 - add return to hub functionality + //PKMOD - Ergodic 12/08/00 - fix hub return functionality +// trap_Cvar_Set( "nextmap", va("map %s; set nextmap vstr hub", hubInfo[temp_hubInfo[winner].hub_index].map_name ) ); + //PKMOD - Ergodic 01/04/04 - Change hub map name from "pkahub" to hub_30 + trap_Cvar_Set( "hubmap", va("map %s; set nextmap map hub_30", hubInfo[temp_hubInfo[winner].hub_index].map_name ) ); + trap_Cvar_Set( "nextmap", va("vstr hubmap" ) ); + + // set time before next firing + self->nextthink = level.time + 3000; //every 3 seconds +} + +//PKMOD - Ergodic 10/12/00 - spawn tally and broadcast entity +void spawn_hubvote ( void ) { + gentity_t *hubvote; + + hubvote = G_Spawn(); + hubvote->classname = "func_hubvote"; + hubvote->nextthink = level.time + 5000; //first schedule is 5 seconds + hubvote->think = func_hubvote_think; + hubvote->r.svFlags = SVF_NOCLIENT; +//PKMOD - Ergodic 10/14/00 - add limit rules... +// Hub detected so set the fraglimits and timelimits, +// the cvars hub_fraglimit and hub_timelimit will override +// the standard cvars fraglimit and timelimit +// g_fraglimit.integer = g_hub_fraglimit.integer; +// g_timelimit.integer = g_hub_timelimit.integer; + //PKMOD - Ergodic 11/07/00 - use hub flag to determine whether in hub or not + //PKMOD - Ergodic 11/07/00 - set hub flag to one + //PKMOD - Ergodic 12/25/00 - name change "g_hub_flag" to "hub_flag" + trap_Cvar_Set( "hub_flag", "1" ); + +} + + +//PKMOD - Ergodic 10/12/00 - add post vote hub deathmath spawn function +/*QUAKED info_player_postvote (1 0 1) (-16 -16 -24) (16 16 32) initial +potential spawning position for deathmatch games. +The first time a player enters the game, they will be at an 'initial' spot. +Targets will be fired when someone spawns in on them. +"nobots" will prevent bots from using this spot. +"nohumans" will prevent non-bots from using this spot. +*/ +void SP_info_player_postvote( gentity_t *ent ) { + int i; + + G_SpawnInt( "nobots", "0", &i); + if ( i ) { + ent->flags |= FL_NO_BOTS; + } + G_SpawnInt( "nohumans", "0", &i ); + if ( i ) { + ent->flags |= FL_NO_HUMANS; + } + +} + + +/*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 32) initial +potential spawning position for deathmatch games. +The first time a player enters the game, they will be at an 'initial' spot. +Targets will be fired when someone spawns in on them. +"nobots" will prevent bots from using this spot. +"nohumans" will prevent non-bots from using this spot. +*/ +void SP_info_player_deathmatch( gentity_t *ent ) { + int i; + + G_SpawnInt( "nobots", "0", &i); + if ( i ) { + ent->flags |= FL_NO_BOTS; + } + G_SpawnInt( "nohumans", "0", &i ); + if ( i ) { + ent->flags |= FL_NO_HUMANS; + } + + //PKMOD - Ergodic 07/25/01 - store the entity into the Respawn Position structure + Respawn_Positions[ Respawn_Position_Index ] = ent; + Respawn_Position_Index++; + if ( Respawn_Position_Index > MAX_RESPAWN_POSITION_INDEX ) + Respawn_Position_Index = MAX_RESPAWN_POSITION_INDEX; +} + +/*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32) +equivelant to info_player_deathmatch +*/ +void SP_info_player_start(gentity_t *ent) { + ent->classname = "info_player_deathmatch"; + SP_info_player_deathmatch( ent ); +} + +/*QUAKED info_player_intermission (1 0 1) (-16 -16 -24) (16 16 32) +The intermission will be viewed from this point. Target an info_notnull for the view direction. +*/ +void SP_info_player_intermission( gentity_t *ent ) { + +} + + + +/* +======================================================================= + + SelectSpawnPoint + +======================================================================= +*/ + +/* +================ +SpotWouldTelefrag + +================ +*/ +qboolean SpotWouldTelefrag( gentity_t *spot ) { + int i, num; + int touch[MAX_GENTITIES]; + gentity_t *hit; + vec3_t mins, maxs; + + VectorAdd( spot->s.origin, playerMins, mins ); + VectorAdd( spot->s.origin, playerMaxs, maxs ); + num = trap_EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); + + for (i=0 ; iclient && hit->client->ps.stats[STAT_HEALTH] > 0 ) { + if ( hit->client) { + return qtrue; + } + + } + + return qfalse; +} + +//PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted +/* +================ +SelectNearestDeathmatchSpawnPoint + +Find the spot that we DON'T want to use +================ +*/ +#define MAX_SPAWN_POINTS 128 +gentity_t *SelectNearestDeathmatchSpawnPoint( vec3_t from, int client_hub_flag ) { + gentity_t *spot; + vec3_t delta; + float dist, nearestDist; + gentity_t *nearestSpot; + + nearestDist = 999999; + nearestSpot = NULL; + spot = NULL; + + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + if ( client_hub_flag ) { + //if client has voted... + while ((spot = G_Find (spot, FOFS(classname), "info_player_postvote")) != NULL) { + VectorSubtract( spot->s.origin, from, delta ); + dist = VectorLength( delta ); + if ( dist < nearestDist ) { + nearestDist = dist; + nearestSpot = spot; + } + } + } + else { + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { + VectorSubtract( spot->s.origin, from, delta ); + dist = VectorLength( delta ); + if ( dist < nearestDist ) { + nearestDist = dist; + nearestSpot = spot; + } + } + } + + return nearestSpot; +} + + +//PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted +/* +================ +SelectRandomDeathmatchSpawnPoint + +go to a random point that doesn't telefrag +================ +*/ +#define MAX_SPAWN_POINTS 128 +gentity_t *SelectRandomDeathmatchSpawnPoint( int client_hub_flag ) { + gentity_t *spot; + int count; + int selection; + gentity_t *spots[MAX_SPAWN_POINTS]; + + count = 0; + spot = NULL; + + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + if ( client_hub_flag ) { + //if client has voted... + while ((spot = G_Find (spot, FOFS(classname), "info_player_postvote")) != NULL) { + if ( SpotWouldTelefrag( spot ) ) { + continue; + } + spots[ count ] = spot; + count++; + } + } else { + //if client default respawn or not voted... + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { + if ( SpotWouldTelefrag( spot ) ) { + continue; + } + spots[ count ] = spot; + count++; + } + } + + if ( !count ) { // no spots that won't telefrag + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + if ( client_hub_flag ) { + return G_Find( NULL, FOFS(classname), "info_player_postvote"); + } + else { + return G_Find( NULL, FOFS(classname), "info_player_deathmatch"); + } + } + + selection = rand() % count; + return spots[ selection ]; +} + +/* +=========== +SelectRandomDistantSpawnPoint + +Chooses a player start, deathmatch start, etc + +PKMOD - Ergodic 05/09/01 - add to reduce spawn fragging +============ +*/ +#define DISTANTSPAWNPOINTS 6 +gentity_t *SelectRandomDistantSpawnPoint ( vec3_t origin ) { + gentity_t *spot; + vec3_t delta; + float dist; + float list_dist[DISTANTSPAWNPOINTS]; + gentity_t *list_spot[DISTANTSPAWNPOINTS]; + int numSpots, rnd, i, j; + + numSpots = 0; + spot = NULL; + + for (i = 0; i < DISTANTSPAWNPOINTS; i++) + list_dist[DISTANTSPAWNPOINTS] = 0; + + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { + if ( SpotWouldTelefrag( spot ) ) { + continue; + } + + //store the first location + if ( !numSpots ) { + //insert new entry into slot + list_dist[numSpots] = dist; + list_spot[numSpots] = spot; + numSpots++; + continue; + } + + VectorSubtract( spot->s.origin, origin, delta ); + dist = VectorLength( delta ); + + for (i = 0; i < numSpots; i++) { + if ( dist > list_dist[i] ) { + // found a distant spawn point + + //open a slot, move subordinate list down + //m + for (j = i + 1; j < numSpots; j++) { + list_dist[j] = list_dist[j - 1]; + list_spot[j] = list_spot[j - 1]; + } + + //insert new entry into slot + list_dist[i] = dist; + list_spot[i] = spot; + + numSpots++; + if (numSpots > DISTANTSPAWNPOINTS) + numSpots = DISTANTSPAWNPOINTS; + + break; //exit from "for (i" loop + } + } + } + + if (!numSpots) { + spot = G_Find( NULL, FOFS(classname), "info_player_deathmatch"); + //PKMOD - Ergodic 05/09/01 - debug respawning in same place (inactive) +// Com_Printf("SelectRandomDistantSpawnPoint:!numSpots - location>%s<\n", vtos(spot->s.origin) ); + if (!spot) + G_Error( "Couldn't find a distant spawn point" ); +// VectorCopy (spot->s.origin, origin); +// origin[2] += 9; +// VectorCopy (spot->s.angles, angles); + return spot; + } + + // select a random spot from the spawn points furthest away + rnd = random() * numSpots; + + //PKMOD - Ergodic 05/09/01 - debug respawning in same place (inactive) +// Com_Printf("SelectRandomDistantSpawnPoint - rnd>%d<, location>%s<\n", rnd, vtos(list_spot[rnd]->s.origin) ); +// Com_Printf("SelectRandomDistantSpawnPoint - rnd>%d<\n", rnd ); + +// VectorCopy (list_spot[rnd]->s.origin, origin); +// origin[2] += 9; +// VectorCopy (list_spot[rnd]->s.angles, angles); + + return list_spot[rnd]; +} + +/* +=========== +SelectClosestSpawnPoint + +Chooses a player start, deathmatch start, etc + +Note: Respawn spot will be selected regardless of telefrag potential + Respawn spot will be selected regardles of spawn point flags (FL_NO_BOTS, FL_NO_HUMANS) + +PKMOD - Ergodic 01/10/02 - add for Prvate Bot spawninng in DM play only +============ +*/ +gentity_t *SelectClosestSpawnPoint ( vec3_t target_origin, vec3_t origin, vec3_t angles ) { + gentity_t *spot; + vec3_t delta; + float dist; + float hold_dist; + gentity_t *hold_spot; + int i; + qboolean firstspot = qtrue; + + for ( i = 0; i < Respawn_Position_Index; i++ ) { + + spot = Respawn_Positions[i]; + + VectorSubtract( Respawn_Positions[i]->s.origin, target_origin, delta ); + dist = VectorLengthSquared( delta ); + //store the first location + if ( firstspot ) { + //insert new entry into slot + hold_dist = dist; + hold_spot = Respawn_Positions[i]; + firstspot = qfalse; + continue; + } + + if ( dist < hold_dist ) { + // found a closer spawn point + hold_dist = dist; + hold_spot = Respawn_Positions[i]; + } + } + + VectorCopy (hold_spot->s.origin, origin); + origin[2] += 9; + VectorCopy (hold_spot->s.angles, angles); + + return hold_spot; +} + +/* +=========== +SelectRandomFurthestSpawnPoint + +Chooses a player start, deathmatch start, etc +============ +*/ +gentity_t *SelectRandomFurthestSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles ) { + gentity_t *spot; + vec3_t delta; + float dist; + float list_dist[64]; + gentity_t *list_spot[64]; + int numSpots, rnd, i, j; + + numSpots = 0; + spot = NULL; + + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { + if ( SpotWouldTelefrag( spot ) ) { + continue; + } + VectorSubtract( spot->s.origin, avoidPoint, delta ); + dist = VectorLength( delta ); + for (i = 0; i < numSpots; i++) { + if ( dist > list_dist[i] ) { + if ( numSpots >= 64 ) + numSpots = 64-1; + for (j = numSpots; j > i; j--) { + list_dist[j] = list_dist[j-1]; + list_spot[j] = list_spot[j-1]; + } + list_dist[i] = dist; + list_spot[i] = spot; + numSpots++; + if (numSpots > 64) + numSpots = 64; + break; + } + } + if (i >= numSpots && numSpots < 64) { + list_dist[numSpots] = dist; + list_spot[numSpots] = spot; + numSpots++; + } + } + if (!numSpots) { + spot = G_Find( NULL, FOFS(classname), "info_player_deathmatch"); + if (!spot) + G_Error( "Couldn't find a spawn point" ); + VectorCopy (spot->s.origin, origin); + origin[2] += 9; + VectorCopy (spot->s.angles, angles); + return spot; + } + + // select a random spot from the spawn points furthest away + rnd = random() * (numSpots / 2); + + VectorCopy (list_spot[rnd]->s.origin, origin); + origin[2] += 9; + VectorCopy (list_spot[rnd]->s.angles, angles); + + return list_spot[rnd]; +} + +/* +=========== +SelectRandomDistantSpawnPoint2 + +Chooses a player start, deathmatch start, etc + +PKMOD - Ergodic 07/25/01 - add to reduce spawn fragging +============ +*/ +#define DISTANTSPAWNPOINTS2 6 +gentity_t *SelectRandomDistantSpawnPoint2 ( vec3_t origin ) { + gentity_t *spot; + vec3_t delta; + float dist; + float list_dist[DISTANTSPAWNPOINTS2 + 1]; + gentity_t *list_spot[DISTANTSPAWNPOINTS2 + 1]; + int numSpots, rnd, i, j, k; + + numSpots = 0; + spot = NULL; + + for (i = 0; i < DISTANTSPAWNPOINTS2; i++) + list_dist[DISTANTSPAWNPOINTS2] = 0; + + for ( i = 0; i < Respawn_Position_Index; i++ ) { + + spot = Respawn_Positions[i]; + + if ( SpotWouldTelefrag( Respawn_Positions[i] ) ) { + continue; + } + + VectorSubtract( Respawn_Positions[i]->s.origin, origin, delta ); + dist = VectorLengthSquared( delta ); + //store the first location + if ( !numSpots ) { + //insert new entry into slot + list_dist[numSpots] = dist; + list_spot[numSpots] = Respawn_Positions[i]; + numSpots++; + continue; + } + + for (j = 0; j < numSpots; j++) { + if ( dist > list_dist[j] ) { + // found a distant spawn point + + numSpots++; + if (numSpots > DISTANTSPAWNPOINTS) + numSpots = DISTANTSPAWNPOINTS; + + //open a slot, move subordinate list down + // move from end of list to start + for (k = numSpots; k > j; k--) { + if ( k <= numSpots ) { + list_dist[k] = list_dist[k - 1]; + list_spot[k] = list_spot[k - 1]; + } + } + + //insert new entry into slot + list_dist[j] = dist; + list_spot[j] = Respawn_Positions[i]; + + + break; //exit from "for (j" loop + } + } + } + + if (!numSpots) { + spot = G_Find( NULL, FOFS(classname), "info_player_deathmatch"); + //PKMOD - Ergodic 05/09/01 - debug respawning in same place (inactive) +// Com_Printf("SelectRandomDistantSpawnPoint:!numSpots - location>%s<\n", vtos(spot->s.origin) ); + if (!spot) + G_Error( "Couldn't find a distant spawn point" ); +// VectorCopy (spot->s.origin, origin); +// origin[2] += 9; +// VectorCopy (spot->s.angles, angles); + return spot; + } + + // select a random spot from the spawn points furthest away + rnd = random() * numSpots; + + //PKMOD - Ergodic 05/09/01 - debug respawning in same place (inactive) +// Com_Printf("SelectRandomDistantSpawnPoint - rnd>%d<, location>%s<\n", rnd, vtos(list_spot[rnd]->s.origin) ); +// Com_Printf("SelectRandomDistantSpawnPoint - rnd>%d<\n", rnd ); + +// VectorCopy (list_spot[rnd]->s.origin, origin); +// origin[2] += 9; +// VectorCopy (list_spot[rnd]->s.angles, angles); + + return list_spot[rnd]; +} + + +//PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted +/* +=========== +SelectSpawnPoint + +Chooses a player start, deathmatch start, etc +============ +*/ +gentity_t *SelectSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles, int client_hub_flag ) { + gentity_t *spot; + gentity_t *nearestSpot; + + //PKMOD - Ergodic 05/10/01 - add failsafe for initial spawns + int spawn_count; + + //PKMOD - Ergodic 05/10/01 - debug initial spawn logic (inactive) +// Com_Printf("SelectSpawnPoint - avoidPoint>%s<, origin>%s<, client_hub_flag>%d<\n", vtos(avoidPoint), vtos(origin), client_hub_flag ); + + //PKMOD - Ergodic 05/09/01 - add distant spawn logic + if ( client_hub_flag ) { + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + nearestSpot = SelectNearestDeathmatchSpawnPoint( avoidPoint, client_hub_flag ); + + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + spot = SelectRandomDeathmatchSpawnPoint ( client_hub_flag ); + if ( spot == nearestSpot ) { + // roll again if it would be real close to point of death + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + spot = SelectRandomDeathmatchSpawnPoint ( client_hub_flag ); + if ( spot == nearestSpot ) { + // last try + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + spot = SelectRandomDeathmatchSpawnPoint ( client_hub_flag ); + } + } + } + else { + //PKMOD - Ergodic 07/24/01 - DEBUG the quake3 acess violation failure + // do not call distant respawn code +// spot = SelectRandomDistantSpawnPoint ( avoidPoint ); + //PKMOD - Ergodic 07/25/01 - try new optimized distant respawn code +// spot = SelectRandomDeathmatchSpawnPoint ( client_hub_flag ); + spot = SelectRandomDistantSpawnPoint2 ( avoidPoint ); + + //PKMOD - Ergodic 05/10/01 - add failsafe for initial spawns + if ( !spot ) { + spawn_count = 3; + while ( ( !spot ) && (spawn_count > 0) ) { + spot = SelectRandomDeathmatchSpawnPoint ( client_hub_flag ); + spawn_count--; + } + } + } + + // find a single player start spot + if (!spot) { + G_Error( "SelectSpawnPoint: Couldn't find a spawn point" ); + } + + VectorCopy (spot->s.origin, origin); + origin[2] += 9; + VectorCopy (spot->s.angles, angles); + + return spot; +} + +//PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted +/* +=========== +SelectInitialSpawnPoint + +Try to find a spawn point marked 'initial', otherwise +use normal spawn selection. +============ +*/ +gentity_t *SelectInitialSpawnPoint( vec3_t origin, vec3_t angles, int client_hub_flag ) { + gentity_t *spot; + + spot = NULL; + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + if ( client_hub_flag ) { + //if client has voted... + while ((spot = G_Find (spot, FOFS(classname), "info_player_postvote")) != NULL) { + if ( spot->spawnflags & 1 ) { + break; + } + } + } else { + //if client default respawn or not voted... + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { + if ( spot->spawnflags & 1 ) { + break; + } + } + } + + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + if ( !spot || SpotWouldTelefrag( spot ) ) { + return SelectSpawnPoint( vec3_origin, origin, angles, client_hub_flag ); + } + + VectorCopy (spot->s.origin, origin); + origin[2] += 9; + VectorCopy (spot->s.angles, angles); + + return spot; +} + +/* +=========== +SelectSpectatorSpawnPoint + +============ +*/ +gentity_t *SelectSpectatorSpawnPoint( vec3_t origin, vec3_t angles ) { + FindIntermissionPoint(); + + VectorCopy( level.intermission_origin, origin ); + VectorCopy( level.intermission_angle, angles ); + + return NULL; +} + +/* +======================================================================= + +BODYQUE + +======================================================================= +*/ + +/* +=============== +InitBodyQue +=============== +*/ +void InitBodyQue (void) { + int i; + gentity_t *ent; + + level.bodyQueIndex = 0; + for (i=0; iclassname = "bodyque"; + ent->neverFree = qtrue; + level.bodyQue[i] = ent; + } +} + +/* +============= +BodySink + +After sitting around for five seconds, fall into the ground and dissapear +============= +*/ +void BodySink( gentity_t *ent ) { + if ( level.time - ent->timestamp > 6500 ) { + // the body ques are never actually freed, they are just unlinked + trap_UnlinkEntity( ent ); + ent->physicsObject = qfalse; + return; + } + ent->nextthink = level.time + 100; + ent->s.pos.trBase[2] -= 1; +} + +/* +============= +CopyToBodyQue + +A player is respawning, so make an entity that looks +just like the existing corpse to leave behind. +============= +*/ +void CopyToBodyQue( gentity_t *ent ) { +#ifdef MISSIONPACK + gentity_t *e; + int i; +#endif + gentity_t *body; + int contents; + + trap_UnlinkEntity (ent); + + // if client is in a nodrop area, don't leave the body + contents = trap_PointContents( ent->s.origin, -1 ); + //PKMOD - Ergodic 12/29/00 - debug surface flags inactive +// Com_Printf("CopyToBodyQue - contents>%d<\n", contents ); + + if ( contents & CONTENTS_NODROP ) { + return; + } + + // grab a body que and cycle to the next one + body = level.bodyQue[ level.bodyQueIndex ]; + level.bodyQueIndex = (level.bodyQueIndex + 1) % BODY_QUEUE_SIZE; + + trap_UnlinkEntity (body); + + body->s = ent->s; + body->s.eFlags = EF_DEAD; // clear EF_TALK, etc +#ifdef MISSIONPACK + if ( ent->s.eFlags & EF_KAMIKAZE ) { + body->s.eFlags |= EF_KAMIKAZE; + + // check if there is a kamikaze timer around for this owner + for (i = 0; i < MAX_GENTITIES; i++) { + e = &g_entities[i]; + if (!e->inuse) + continue; + if (e->activator != ent) + continue; + if (strcmp(e->classname, "kamikaze timer")) + continue; + e->activator = body; + break; + } + } +#endif + body->s.powerups = 0; // clear powerups + body->s.loopSound = 0; // clear lava burning + body->s.number = body - g_entities; + body->timestamp = level.time; + body->physicsObject = qtrue; + body->physicsBounce = 0; // don't bounce + if ( body->s.groundEntityNum == ENTITYNUM_NONE ) { + body->s.pos.trType = TR_GRAVITY; + body->s.pos.trTime = level.time; + VectorCopy( ent->client->ps.velocity, body->s.pos.trDelta ); + } else { + body->s.pos.trType = TR_STATIONARY; + } + body->s.event = 0; + + // change the animation to the last-frame only, so the sequence + // doesn't repeat anew for the body + switch ( body->s.legsAnim & ~ANIM_TOGGLEBIT ) { + case BOTH_DEATH1: + case BOTH_DEAD1: + body->s.torsoAnim = body->s.legsAnim = BOTH_DEAD1; + break; + case BOTH_DEATH2: + case BOTH_DEAD2: + body->s.torsoAnim = body->s.legsAnim = BOTH_DEAD2; + break; + case BOTH_DEATH3: + case BOTH_DEAD3: + default: + body->s.torsoAnim = body->s.legsAnim = BOTH_DEAD3; + break; + } + + body->r.svFlags = ent->r.svFlags; + VectorCopy (ent->r.mins, body->r.mins); + VectorCopy (ent->r.maxs, body->r.maxs); + VectorCopy (ent->r.absmin, body->r.absmin); + VectorCopy (ent->r.absmax, body->r.absmax); + + body->clipmask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP; + body->r.contents = CONTENTS_CORPSE; + body->r.ownerNum = ent->s.number; + + body->nextthink = level.time + 5000; + body->think = BodySink; + + body->die = body_die; + + // don't take more damage if already gibbed + if ( ent->health <= GIB_HEALTH ) { + body->takedamage = qfalse; + } else { + body->takedamage = qtrue; + } + + + VectorCopy ( body->s.pos.trBase, body->r.currentOrigin ); + trap_LinkEntity (body); +} + +//====================================================================== + + +/* +================== +SetClientViewAngle + +================== +*/ +void SetClientViewAngle( gentity_t *ent, vec3_t angle ) { + int i; + + // set the delta angle + for (i=0 ; i<3 ; i++) { + int cmdAngle; + + cmdAngle = ANGLE2SHORT(angle[i]); + ent->client->ps.delta_angles[i] = cmdAngle - ent->client->pers.cmd.angles[i]; + } + VectorCopy( angle, ent->s.angles ); + VectorCopy (ent->s.angles, ent->client->ps.viewangles); +} + +/* +================ +respawn +================ +*/ +void respawn( gentity_t *ent ) { + gentity_t *tent; + + CopyToBodyQue (ent); + ClientSpawn(ent); + + // add a teleportation effect + tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_IN ); + tent->s.clientNum = ent->s.clientNum; +} + +/* +================ +TeamCount + +Returns number of players on a team +================ +*/ +team_t TeamCount( int ignoreClientNum, int team ) { + int i; + int count = 0; + + for ( i = 0 ; i < level.maxclients ; i++ ) { + if ( i == ignoreClientNum ) { + continue; + } + if ( level.clients[i].pers.connected == CON_DISCONNECTED ) { + continue; + } + if ( level.clients[i].sess.sessionTeam == team ) { + count++; + } + } + + return count; +} + +/* +================ +TeamLeader + +Returns the client number of the team leader +================ +*/ +int TeamLeader( int team ) { + int i; + + for ( i = 0 ; i < level.maxclients ; i++ ) { + if ( level.clients[i].pers.connected == CON_DISCONNECTED ) { + continue; + } + if ( level.clients[i].sess.sessionTeam == team ) { + if ( level.clients[i].sess.teamLeader ) + return i; + } + } + + return -1; +} + + +/* +================ +PickTeam + +================ +*/ +team_t PickTeam( int ignoreClientNum ) { + int counts[TEAM_NUM_TEAMS]; + + counts[TEAM_BLUE] = TeamCount( ignoreClientNum, TEAM_BLUE ); + counts[TEAM_RED] = TeamCount( ignoreClientNum, TEAM_RED ); + + if ( counts[TEAM_BLUE] > counts[TEAM_RED] ) { + return TEAM_RED; + } + if ( counts[TEAM_RED] > counts[TEAM_BLUE] ) { + return TEAM_BLUE; + } + // equal team count, so join the team with the lowest score + if ( level.teamScores[TEAM_BLUE] > level.teamScores[TEAM_RED] ) { + return TEAM_RED; + } + return TEAM_BLUE; +} + +/* +=========== +ForceClientSkin + +Forces a client's skin (for teamplay) +=========== +*/ +/* +static void ForceClientSkin( gclient_t *client, char *model, const char *skin ) { + char *p; + + if ((p = Q_strrchr(model, '/')) != 0) { + *p = 0; + } + + Q_strcat(model, MAX_QPATH, "/"); + Q_strcat(model, MAX_QPATH, skin); +} +*/ + +/* +=========== +ClientCheckName +============ +*/ +static void ClientCleanName( const char *in, char *out, int outSize ) { + int len, colorlessLen; + char ch; + char *p; + int spaces; + + //save room for trailing null byte + outSize--; + + len = 0; + colorlessLen = 0; + p = out; + *p = 0; + spaces = 0; + + while( 1 ) { + ch = *in++; + if( !ch ) { + break; + } + + // don't allow leading spaces + if( !*p && ch == ' ' ) { + continue; + } + + // check colors + if( ch == Q_COLOR_ESCAPE ) { + // solo trailing carat is not a color prefix + if( !*in ) { + break; + } + + // don't allow black in a name, period + if( ColorIndex(*in) == 0 ) { + in++; + continue; + } + + // make sure room in dest for both chars + if( len > outSize - 2 ) { + break; + } + + *out++ = ch; + *out++ = *in++; + len += 2; + continue; + } + + // don't allow too many consecutive spaces + if( ch == ' ' ) { + spaces++; + if( spaces > 3 ) { + continue; + } + } + else { + spaces = 0; + } + + if( len > outSize - 1 ) { + break; + } + + *out++ = ch; + colorlessLen++; + len++; + } + *out = 0; + + // don't allow empty names + if( *p == 0 || colorlessLen == 0 ) { + Q_strncpyz( p, "UnnamedPlayer", outSize ); + } +} + + +/* +=========== +ClientUserInfoChanged + +Called from ClientConnect when the player first connects and +directly by the server system when the player updates a userinfo variable. + +The game can override any of the settings and call trap_SetUserinfo +if desired. +============ +*/ +void ClientUserinfoChanged( int clientNum ) { + gentity_t *ent; + int teamTask, teamLeader, team, health; + char *s; + char model[MAX_QPATH]; + char headModel[MAX_QPATH]; + char oldname[MAX_STRING_CHARS]; + gclient_t *client; + char c1[MAX_INFO_STRING]; + char c2[MAX_INFO_STRING]; + char redTeam[MAX_INFO_STRING]; + char blueTeam[MAX_INFO_STRING]; + char userinfo[MAX_INFO_STRING]; + //PKMOD - Ergodic 01/09/02 - create a holder for private bot + char pb[MAX_INFO_STRING]; + + ent = g_entities + clientNum; + client = ent->client; + + trap_GetUserinfo( clientNum, userinfo, sizeof( userinfo ) ); + + // check for malformed or illegal info strings + if ( !Info_Validate(userinfo) ) { + strcpy (userinfo, "\\name\\badinfo"); + } + + // check for local client + s = Info_ValueForKey( userinfo, "ip" ); + if ( !strcmp( s, "localhost" ) ) { + client->pers.localClient = qtrue; + } + + // check the item prediction + s = Info_ValueForKey( userinfo, "cg_predictItems" ); + if ( !atoi( s ) ) { + client->pers.predictItemPickup = qfalse; + } else { + client->pers.predictItemPickup = qtrue; + } + + // set name + Q_strncpyz ( oldname, client->pers.netname, sizeof( oldname ) ); + s = Info_ValueForKey (userinfo, "name"); + ClientCleanName( s, client->pers.netname, sizeof(client->pers.netname) ); + + if ( client->sess.sessionTeam == TEAM_SPECTATOR ) { + if ( client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { + Q_strncpyz( client->pers.netname, "scoreboard", sizeof(client->pers.netname) ); + } + } + + if ( client->pers.connected == CON_CONNECTED ) { + if ( strcmp( oldname, client->pers.netname ) ) { + trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " renamed to %s\n\"", oldname, + client->pers.netname) ); + } + } + + // set max health +#ifdef MISSIONPACK + if (client->ps.powerups[PW_GUARD]) { + client->pers.maxHealth = 200; + } else { + health = atoi( Info_ValueForKey( userinfo, "handicap" ) ); + client->pers.maxHealth = health; + if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) { + client->pers.maxHealth = 100; + } + } +#else + health = atoi( Info_ValueForKey( userinfo, "handicap" ) ); + client->pers.maxHealth = health; + if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) { + client->pers.maxHealth = 100; + } +#endif + client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth; + + // set model + if( g_gametype.integer >= GT_TEAM ) { + Q_strncpyz( model, Info_ValueForKey (userinfo, "team_model"), sizeof( model ) ); + Q_strncpyz( headModel, Info_ValueForKey (userinfo, "team_headmodel"), sizeof( headModel ) ); + } else { + Q_strncpyz( model, Info_ValueForKey (userinfo, "model"), sizeof( model ) ); + Q_strncpyz( headModel, Info_ValueForKey (userinfo, "headmodel"), sizeof( headModel ) ); + } + + // bots set their team a few frames later + if (g_gametype.integer >= GT_TEAM && g_entities[clientNum].r.svFlags & SVF_BOT) { + s = Info_ValueForKey( userinfo, "team" ); + if ( !Q_stricmp( s, "red" ) || !Q_stricmp( s, "r" ) ) { + team = TEAM_RED; + } else if ( !Q_stricmp( s, "blue" ) || !Q_stricmp( s, "b" ) ) { + team = TEAM_BLUE; + } else { + // pick the team with the least number of players + team = PickTeam( clientNum ); + } + } + else { + team = client->sess.sessionTeam; + } + +/* NOTE: all client side now + + // team + switch( team ) { + case TEAM_RED: + ForceClientSkin(client, model, "red"); +// ForceClientSkin(client, headModel, "red"); + break; + case TEAM_BLUE: + ForceClientSkin(client, model, "blue"); +// ForceClientSkin(client, headModel, "blue"); + break; + } + // don't ever use a default skin in teamplay, it would just waste memory + // however bots will always join a team but they spawn in as spectator + if ( g_gametype.integer >= GT_TEAM && team == TEAM_SPECTATOR) { + ForceClientSkin(client, model, "red"); +// ForceClientSkin(client, headModel, "red"); + } +*/ + +#ifdef MISSIONPACK + if (g_gametype.integer >= GT_TEAM) { + client->pers.teamInfo = qtrue; + } else { + s = Info_ValueForKey( userinfo, "teamoverlay" ); + if ( ! *s || atoi( s ) != 0 ) { + client->pers.teamInfo = qtrue; + } else { + client->pers.teamInfo = qfalse; + } + } +#else + // teamInfo + s = Info_ValueForKey( userinfo, "teamoverlay" ); + if ( ! *s || atoi( s ) != 0 ) { + client->pers.teamInfo = qtrue; + } else { + client->pers.teamInfo = qfalse; + } +#endif + /* + s = Info_ValueForKey( userinfo, "cg_pmove_fixed" ); + if ( !*s || atoi( s ) == 0 ) { + client->pers.pmoveFixed = qfalse; + } + else { + client->pers.pmoveFixed = qtrue; + } + */ + + // team task (0 = none, 1 = offence, 2 = defence) + teamTask = atoi(Info_ValueForKey(userinfo, "teamtask")); + // team Leader (1 = leader, 0 is normal player) + teamLeader = client->sess.teamLeader; + + // colors + strcpy(c1, Info_ValueForKey( userinfo, "color1" )); + strcpy(c2, Info_ValueForKey( userinfo, "color2" )); + + strcpy(redTeam, Info_ValueForKey( userinfo, "g_redteam" )); + strcpy(blueTeam, Info_ValueForKey( userinfo, "g_blueteam" )); + + //PKMOD - Ergodic 01/09/02 - set holder for private bot + strcpy(pb, Info_ValueForKey( userinfo, "privateBot" )); + + // send over a subset of the userinfo keys so other clients can + // print scoreboards, display models, and play custom sounds + if ( ent->r.svFlags & SVF_BOT ) { + //PKMOD - Ergodic 01/09/02 - update for Private Bot (pb) value + s = va("n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\skill\\%s\\tt\\%d\\tl\\%d\\pb\\%s", + client->pers.netname, team, model, headModel, c1, c2, + client->pers.maxHealth, client->sess.wins, client->sess.losses, + Info_ValueForKey( userinfo, "skill" ), teamTask, teamLeader, pb ); + + //PKMOD - Ergodic 01/10/02 - debug bot's userinfo (inactive) +// Com_Printf("ClientUserinfoChanged - userinfo>%s<\n", userinfo); +// Com_Printf("ClientUserinfoChanged - s>%s<\n", s); + } else { + //PKMOD - Ergodic 01/09/02 - update for Private Bot (pb) value + s = va("n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\g_redteam\\%s\\g_blueteam\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\tt\\%d\\tl\\%d\\pb\\0", + client->pers.netname, client->sess.sessionTeam, model, headModel, redTeam, blueTeam, c1, c2, + client->pers.maxHealth, client->sess.wins, client->sess.losses, teamTask, teamLeader); + } + + trap_SetConfigstring( CS_PLAYERS+clientNum, s ); + + // this is not the userinfo, more like the configstring actually + G_LogPrintf( "ClientUserinfoChanged: %i %s\n", clientNum, s ); +} + + +/* +=========== +ClientConnect + +Called when a player begins connecting to the server. +Called again for every map change or tournement restart. + +The session information will be valid after exit. + +Return NULL if the client should be allowed, otherwise return +a string with the reason for denial. + +Otherwise, the client will be sent the current gamestate +and will eventually get to ClientBegin. + +firstTime will be qtrue the very first time a client connects +to the server machine, but qfalse on map changes and tournement +restarts. +============ +*/ +char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) { + char *value; +// char *areabits; + gclient_t *client; + char userinfo[MAX_INFO_STRING]; + gentity_t *ent; + + ent = &g_entities[ clientNum ]; + + trap_GetUserinfo( clientNum, userinfo, sizeof( userinfo ) ); + + // IP filtering + // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=500 + // recommanding PB based IP / GUID banning, the builtin system is pretty limited + // check to see if they are on the banned IP list + //PKMOD - Ergodic 01/09/02 - debug bot's userinfo (inactive) +// Com_Printf("ClientConnect - userinfo>%s<\n", userinfo); + + // check to see if they are on the banned IP list + value = Info_ValueForKey (userinfo, "ip"); + if ( G_FilterPacket( value ) ) { + return "You are banned from this server."; + } + + // we don't check password for bots and local client + // NOTE: local client <-> "ip" "localhost" + // this means this client is not running in our current process + if ( !( ent->r.svFlags & SVF_BOT ) && (strcmp(value, "localhost") != 0)) { + // check for a password + value = Info_ValueForKey (userinfo, "password"); + if ( g_password.string[0] && Q_stricmp( g_password.string, "none" ) && + strcmp( g_password.string, value) != 0) { + return "Invalid password"; + } + } + + //PKMOD - Ergodic 10/21/02 - prevent client connecting as a Private Bot + if ( !isBot ) { + ent->r.svFlags &= ~SVF_BOT; + //PKMOD - Ergodic 10/27/02 - do both BOT settings, now SVF_PRIVATEBOT... + ent->r.svFlags &= ~SVF_PRIVATEBOT; + } + + // they can connect + ent->client = level.clients + clientNum; + client = ent->client; + +// areabits = client->areabits; + + memset( client, 0, sizeof(*client) ); + + client->pers.connected = CON_CONNECTING; + + // read or initialize the session data + if ( firstTime || level.newSession ) { + //PKMOD - Ergodic 01/21/02 - modify call to pass in Private Bot status + G_InitSessionData( client, userinfo, ent->r.svFlags & SVF_PRIVATEBOT ); + } + + G_ReadSessionData( client ); + + /* + //PKMOD - Ergodic 02/13/04 - test private bot re-entry into map + if ( client->sess.sessionPrivateBot ) { + //PKMOD - Ergodic 02/19/04 - no need to drop the client - just returning with text will remove Private Bot + // NOTE: This code is here for failsafe and will not execute since Private Bot + // is removed in g_main.c : G_ShutdownGame. +//PKMOD - Ergodic 03/15/04 - debug bot's restart +Com_Printf("ClientConnect - (2) returned after private bot session detected\n" ); + return "Private Bot is removed for Basic Training"; //02/20/04 + } + */ + + if( isBot ) { + ent->r.svFlags |= SVF_BOT; + ent->inuse = qtrue; + if( !G_BotConnect( clientNum, !firstTime ) ) { + return "BotConnectfailed"; + } + } + + // get and distribute relevent paramters + G_LogPrintf( "ClientConnect: %i\n", clientNum ); + ClientUserinfoChanged( clientNum ); + + // don't do the "xxx connected" messages if they were caried over from previous level + if ( firstTime ) { + trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname) ); + } + + if ( g_gametype.integer >= GT_TEAM && + client->sess.sessionTeam != TEAM_SPECTATOR ) { + BroadcastTeamChange( client, -1 ); + } + + //PKMOD - Ergodic 01/24/02 - debug bot's status bits (inactive) +// Com_Printf("ClientConnect - before CalculateRanks\n" ); + + // count current clients and rank for scoreboard + CalculateRanks(); + + //PKMOD - Ergodic 01/24/02 - debug bot's status bits (inactive) +// Com_Printf("ClientConnect - after CalculateRanks\n" ); + + // for statistics +// client->areabits = areabits; +// if ( !client->areabits ) +// client->areabits = G_Alloc( (trap_AAS_PointReachabilityAreaIndex( NULL ) + 7) / 8 ); + + return NULL; +} + +//PKMOD - Ergodic 10/11/00 - update client PERS with voting information (set to zero) +/* +=========== +ClientBegin + +called when a client has finished connecting, and is ready +to be placed into the level. This will happen every level load, +and on transition between teams, but doesn't happen on respawns +============ +*/ +void ClientBegin( int clientNum ) { + gentity_t *ent; + gclient_t *client; + gentity_t *tent; + int flags; + + //PKMOD - Ergodic 02/19/04 - debug bot's restart (inactive) + //Com_Printf("ClientBegin - client>%d<, svFlags>%d<, PrivateBot?>%d<\n", clientNum, g_entities[clientNum].r.svFlags, g_entities[clientNum].r.svFlags & SVF_PRIVATEBOT ); + + + ent = g_entities + clientNum; + + client = level.clients + clientNum; + + if ( ent->r.linked ) { + trap_UnlinkEntity( ent ); + } + G_InitGentity( ent ); + ent->touch = 0; + ent->pain = 0; + ent->client = client; + + //PKMOD - Ergodic 01/15/02 - debug bot's restart (inactive) +// Com_Printf("ClientBegin - persistant[PERS_KILLED]>%d<\n", client->ps.persistant[PERS_KILLED] ); + + client->pers.connected = CON_CONNECTED; + client->pers.enterTime = level.time; + client->pers.teamState.state = TEAM_BEGIN; + + // save eflags around this, because changing teams will + // cause this to happen with a valid entity, and we + // want to make sure the teleport bit is set right + // so the viewpoint doesn't interpolate through the + // world to the new position + flags = client->ps.eFlags; + memset( &client->ps, 0, sizeof( client->ps ) ); + client->ps.eFlags = flags; + + // locate ent at a spawn point + ClientSpawn( ent ); + + if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { + // send event + tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_IN ); + tent->s.clientNum = ent->s.clientNum; + + if ( g_gametype.integer != GT_TOURNAMENT ) { + trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " entered the game\n\"", client->pers.netname) ); + } + } + G_LogPrintf( "ClientBegin: %i\n", clientNum ); + + // count current clients and rank for scoreboard + CalculateRanks(); + + //PKMOD - Ergodic 10/11/00 - set the hub voting flag + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + // Mask off lowest bit + client->ps.persistant[PERS_PAINKILLER_COUNT] &= 0x7FFFFFFE; + + //PKMOD - Ergodic 01/18/02 - drop Private Bot upon entry + //PKMOD - Ergodic 12/19/02 - emove this code - code will cause PB to not initialize + // properly in Online game. + // This removal code will be executed int he shutdown function + //if ( client->sess.sessionPrivateBot ) { + //PKMOD - Ergodic 01/09/02 - debug bot's userinfo (inactive) +// Com_Printf("ClientBegin - dropping client>%d<\n", clientNum ); + // trap_DropClient( clientNum, "Private Bot returning to base" ); + //} + +} + +//PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted +/* +=========== +ClientSpawn + +Called every time a client is placed fresh in the world: +after the first ClientBegin, and after each respawn +Initializes all non-persistant parts of playerState +============ +*/ +void ClientSpawn(gentity_t *ent) { + int index; + vec3_t spawn_origin, spawn_angles; + gclient_t *client; + int i; + clientPersistant_t saved; + clientSession_t savedSess; + int persistant[MAX_PERSISTANT]; + gentity_t *spawnPoint; + int flags; + int savedPing; +// char *savedAreaBits; + int accuracy_hits, accuracy_shots; +// int savedEvents[MAX_PS_EVENTS]; //PKMOD -Ergodic 12/19/02 - unsed variable - Unlagged? + int eventSequence; + char userinfo[MAX_INFO_STRING]; + + index = ent - g_entities; + client = ent->client; + + //PKMOD - Ergodic 01/17/00 - if Bot in HUB then force postvote respawn + // Bots do not navigate the hub very well, bots usually fight instead of vote + // we will just place them in the postvote area as a default and leave the voting + // to the human players + if ( ( ent->r.svFlags & SVF_BOT ) && ( hub_flag.integer == 1 ) ) { + client->ps.persistant[PERS_PAINKILLER_COUNT] |= 1; + } + + // find a spawn point + // do it before setting health back up, so farthest + // ranging doesn't count this client + if ( client->sess.sessionTeam == TEAM_SPECTATOR ) { + spawnPoint = SelectSpectatorSpawnPoint ( + spawn_origin, spawn_angles); + } else if (g_gametype.integer == GT_CTF) { + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + spawnPoint = SelectCTFSpawnPoint ( + client->sess.sessionTeam, + client->pers.teamState.state, + spawn_origin, spawn_angles, ( client->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) ); + } else { + do { + //PKMOD - Ergodic 01/10/02 - spawn Private Bot close to owner (DM only feature) + if ( ent->r.svFlags & SVF_PRIVATEBOT ) { + spawnPoint = SelectClosestSpawnPoint( ent->parent->r.currentOrigin, spawn_origin, spawn_angles ); + break; + } + else { + // the first spawn should be at a good looking spot + if ( !client->pers.initialSpawn && client->pers.localClient ) { + client->pers.initialSpawn = qtrue; + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + spawnPoint = SelectInitialSpawnPoint( spawn_origin, spawn_angles, ( client->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) ); + } else { + // don't spawn near existing origin if possible + //PKMOD - Ergodic 10/12/00 - add "client_hub_flag" argument - 1:voted, 0:default/not-voted + //PKMOD - Ergodic 12/17/00 - place PERS_HUB_FLAG as first bit of PERS_PAINKILLER_COUNT + spawnPoint = SelectSpawnPoint ( client->ps.origin, spawn_origin, spawn_angles, ( client->ps.persistant[PERS_PAINKILLER_COUNT] & 1 ) ); + } + } + // Tim needs to prevent bots from spawning at the initial point + // on q3dm0... + if ( ( spawnPoint->flags & FL_NO_BOTS ) && ( ent->r.svFlags & SVF_BOT ) ) { + continue; // try again + } + // just to be symetric, we have a nohumans option... + if ( ( spawnPoint->flags & FL_NO_HUMANS ) && !( ent->r.svFlags & SVF_BOT ) ) { + continue; // try again + } + + break; + + } while ( 1 ); + } + client->pers.teamState.state = TEAM_ACTIVE; + + //PKMOD Ergodic - 07/08/01, remove kamizaki entity flag + // always clear the kamikaze flag +// ent->s.eFlags &= ~EF_KAMIKAZE; + + // toggle the teleport bit so the client knows to not lerp + // and never clear the voted flag + flags = ent->client->ps.eFlags & (EF_TELEPORT_BIT | EF_VOTED | EF_TEAMVOTED); + flags ^= EF_TELEPORT_BIT; + + // clear everything but the persistant data + + saved = client->pers; + savedSess = client->sess; + savedPing = client->ps.ping; +// savedAreaBits = client->areabits; + accuracy_hits = client->accuracy_hits; + accuracy_shots = client->accuracy_shots; + for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) { + persistant[i] = client->ps.persistant[i]; + } + eventSequence = client->ps.eventSequence; + + memset (client, 0, sizeof(*client)); // bk FIXME: Com_Memset? + + client->pers = saved; + client->sess = savedSess; + client->ps.ping = savedPing; +// client->areabits = savedAreaBits; + client->accuracy_hits = accuracy_hits; + client->accuracy_shots = accuracy_shots; + client->lastkilled_client = -1; + + for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) { + client->ps.persistant[i] = persistant[i]; + } + client->ps.eventSequence = eventSequence; + // increment the spawncount so the client will detect the respawn + client->ps.persistant[PERS_SPAWN_COUNT]++; + client->ps.persistant[PERS_TEAM] = client->sess.sessionTeam; + + client->airOutTime = level.time + 12000; + + trap_GetUserinfo( index, userinfo, sizeof(userinfo) ); + + //PKMOD - Ergodic 01/09/02 - debug bot's userinfo (inactive) +// Com_Printf("ClientSpawn - userinfo>%s<\n", userinfo); + + // set max health + client->pers.maxHealth = atoi( Info_ValueForKey( userinfo, "handicap" ) ); + if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) { + client->pers.maxHealth = 100; + } + // clear entity values + client->ps.stats[STAT_MAX_HEALTH] = client->pers.maxHealth; + client->ps.eFlags = flags; + + ent->s.groundEntityNum = ENTITYNUM_NONE; + ent->client = &level.clients[index]; + ent->takedamage = qtrue; + ent->inuse = qtrue; + ent->classname = "player"; + ent->r.contents = CONTENTS_BODY; + ent->clipmask = MASK_PLAYERSOLID; + ent->die = player_die; + ent->waterlevel = 0; + ent->watertype = 0; + ent->flags = 0; + + //PKMOD - Ergodic - 03/29/2000, set the respawn values for AirFist +// ent->AirFist_Level = 100; + //PKMOD - Ergodic 11/15/00, move airfist level to playerstate + // airfist levels will be (4,3,2,1,0) + ent->client->ps.stats[STAT_AIRFIST_LEVEL] = 4; + + //PKMOD - Ergodic - 09/09/2000, set the respawn values for Lightning_Strike + //PKMOD - Ergodic - 12/28/2000, created new structure for PKA flags + // set all flags to zero +// ent->Lightning_Strike = 0; + ent->pka_flags = 0; + + //PKMOD - Ergodic - 05/26/2000, set the respawn values for BearTrap + //PKMOD Ergodic - 04/07/01 - rename variable to add autosentry + ent->BearTrap_Autosentry_ImmuneTime = level.time + 2000; // 2 seconds of immunity, quick run! + + //PKMOD - Ergodic 06/19/00 set the pka_items flag to 0 + ent->client->ps.stats[STAT_PKA_ITEMS] = 0; + + //PKMOD - Ergodic 06/30/00 - reset counter variable for number of beartraps attached to the player + ent->client->ps.stats[STAT_BEARTRAPS_ATTACHED] = 0; + + //PKMOD - Ergodic 03/13/01 - clear the dragon deploy variable + ent->client->ps.generic1 = 0; + + //PKMOD - Ergodic 04/16/01 - reset special gravity + ent->pka_gravity_time = 0; + ent->pka_gravity = g_gravity.value; + + + VectorCopy (playerMins, ent->r.mins); + VectorCopy (playerMaxs, ent->r.maxs); + + client->ps.clientNum = index; + + client->ps.stats[STAT_WEAPONS] = ( 1 << WP_MACHINEGUN ); + + //PKMOD - Ergodic 12/02/01 - test bots using grapple - TO BE REMOVED LATER + //PKMOD - Ergodic 08/06/02 - remove automatic Dragon from strtup inventory +// client->ps.stats[STAT_WEAPONS] = ( 1 << WP_MACHINEGUN ) | ( 1 << WP_GRAPPLING_HOOK ); + + if ( g_gametype.integer == GT_TEAM ) { + client->ps.ammo[WP_MACHINEGUN] = 50; + } else { + client->ps.ammo[WP_MACHINEGUN] = 100; + } + + client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_GAUNTLET ); + +//PKMOD -Enable Grapple. This version automatically gives you the grapple (disabled 07/05/00) +// client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_GRAPPLING_HOOK); +//PKMOD - Ergodic 05/17/00 - remove automatic gravity well (disabled 07/05/00) +// client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_GRAVITY); + //PKMOD + + client->ps.ammo[WP_GAUNTLET] = -1; + client->ps.ammo[WP_GRAPPLING_HOOK] = -1; + + // health will count down towards max_health + ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH] + 25; + + //PKMOD - Ergodic 01/07/02 - Private Bot will be enhanced + if ( ent->r.svFlags & SVF_PRIVATEBOT ) { + //max out health + ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH] * 2; + //max out armor + client->ps.stats[STAT_ARMOR] = client->ps.stats[STAT_MAX_HEALTH] * 2; + //give some weapon(s) + //PKMOD - Ergodic 01/24/02 - add to inventory with |= not set with = + client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_GRAPPLING_HOOK ); + + //give 1 high-powered weapon + //PKMOD - Ergodic 01/05/03 - remove rail from PB selection + // Scale selection so that HIGH powered weapons are less frequently + // obtained than lower powered weapons + // Nailgun ~50% + // Rocket Launcher ~30% + // Lightning Gun ~20% + i = rand() % 100; //0,1,2...97,98,99 + if ( i < 50 ) { + //Give a Nail Gun + client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_NAILGUN ); + client->ps.ammo[WP_NAILGUN] = 135; + } else if ( i < 80 ) { + //Give a Rocket Launcher + client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_ROCKET_LAUNCHER ); + client->ps.ammo[WP_ROCKET_LAUNCHER] = 25; + } else { + //Give a Lightning Gun + client->ps.stats[STAT_WEAPONS] |= ( 1 << WP_LIGHTNING ); + client->ps.ammo[WP_LIGHTNING] = 180; + } + } + + G_SetOrigin( ent, spawn_origin ); + VectorCopy( spawn_origin, client->ps.origin ); + + // the respawned flag will be cleared after the attack and jump keys come up + client->ps.pm_flags |= PMF_RESPAWNED; + + trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd ); + SetClientViewAngle( ent, spawn_angles ); + + if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + + } else { + G_KillBox( ent ); + trap_LinkEntity (ent); + + // force the base weapon up + client->ps.weapon = WP_MACHINEGUN; + client->ps.weaponstate = WEAPON_READY; + + } + + // don't allow full run speed for a bit + client->ps.pm_flags |= PMF_TIME_KNOCKBACK; + client->ps.pm_time = 100; + + client->respawnTime = level.time; + client->inactivityTime = level.time + g_inactivity.integer * 1000; + client->latched_buttons = 0; + + // set default animations + client->ps.torsoAnim = TORSO_STAND; + client->ps.legsAnim = LEGS_IDLE; + + if ( level.intermissiontime ) { + MoveClientToIntermission( ent ); + } else { + // fire the targets of the spawn point + G_UseTargets( spawnPoint, ent ); + + // select the highest weapon number available, after any + // spawn given items have fired + client->ps.weapon = 1; + //PKMOD -Enable Grapple. This version automatically gives you the grapple + // -1 changed to -2 in "for ( i = WP_NUM_WEAPONS - 1 ; i > 0 ; i-- ) {" + for ( i = WP_NUM_WEAPONS - 1 ; i > 0 ; i-- ) { + if ( client->ps.stats[STAT_WEAPONS] & ( 1 << i ) ) { + client->ps.weapon = i; + break; + } + } + } + + // run a client frame to drop exactly to the floor, + // initialize animations and other things + client->ps.commandTime = level.time - 100; + ent->client->pers.cmd.serverTime = level.time; + ClientThink( ent-g_entities ); + + // positively link the client, even if the command times are weird + if ( ent->client->sess.sessionTeam != TEAM_SPECTATOR ) { + BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue ); + VectorCopy( ent->client->ps.origin, ent->r.currentOrigin ); + trap_LinkEntity( ent ); + } + + // run the presend to set anything else + ClientEndFrame( ent ); + + // clear entity state values + BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue ); +} + + +/* +=========== +ClientDisconnect + +Called when a player drops from the server. +Will not be called between levels. + +This should NOT be called directly by any game logic, +call trap_DropClient(), which will call this and do +server system housekeeping. +============ +*/ +void ClientDisconnect( int clientNum ) { + gentity_t *ent; + gentity_t *tent; + int i; + + // cleanup if we are kicking a bot that + // hasn't spawned yet + G_RemoveQueuedBotBegin( clientNum ); + + ent = g_entities + clientNum; + if ( !ent->client ) { + return; + } + + // stop any following clients + for ( i = 0 ; i < level.maxclients ; i++ ) { + if ( level.clients[i].sess.sessionTeam == TEAM_SPECTATOR + && level.clients[i].sess.spectatorState == SPECTATOR_FOLLOW + && level.clients[i].sess.spectatorClient == clientNum ) { + StopFollowing( &g_entities[i] ); + } + } + + // send effect if they were completely connected + if ( ent->client->pers.connected == CON_CONNECTED + && ent->client->sess.sessionTeam != TEAM_SPECTATOR ) { + tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_OUT ); + tent->s.clientNum = ent->s.clientNum; + + // They don't get to take powerups with them! + // Especially important for stuff like CTF flags + TossClientItems( ent ); +#ifdef MISSIONPACK + TossClientPersistantPowerups( ent ); + if( g_gametype.integer == GT_HARVESTER ) { + TossClientCubes( ent ); + } +#endif + + } + + G_LogPrintf( "ClientDisconnect: %i\n", clientNum ); + + //PKMOD - Ergodic 01/22/02 - debug disconnecting private bot in tournament game (inactive) +// Com_Printf( "ClientDisconnect: clientNum>%d<, svFlags>%d<\n", clientNum, ent->r.svFlags ); +// if ( ent->r.svFlags & SVF_PRIVATEBOT ) +// Com_Printf( "ClientDisconnect: private bot disconnecting clientNum>%d<\n", clientNum ); +// else +// Com_Printf( "ClientDisconnect: NOT private bot disconnecting clientNum>%d<\n", clientNum ); + + + + //PKMOD - Ergodic 02/11/04 - if cvar is set then do not count leaving the game as a win for the + // other player + if ( g_pkatourneyrules.integer == 0 ) { + // if we are playing in tourney mode and losing, give a win to the other player + if ( (g_gametype.integer == GT_TOURNAMENT ) + && !level.intermissiontime + && !level.warmupTime && ( level.sortedClients[1] == clientNum ) && + //PKMOD - Ergodic 01/22/02 - disregard Private Bot disconnects in tournament play + !( ent->r.svFlags & SVF_PRIVATEBOT ) ) { + level.clients[ level.sortedClients[0] ].sess.wins++; + ClientUserinfoChanged( level.sortedClients[0] ); + } + } + + trap_UnlinkEntity (ent); + ent->s.modelindex = 0; + ent->inuse = qfalse; + ent->classname = "disconnected"; + ent->client->pers.connected = CON_DISCONNECTED; + ent->client->ps.persistant[PERS_TEAM] = TEAM_FREE; + ent->client->sess.sessionTeam = TEAM_FREE; + + trap_SetConfigstring( CS_PLAYERS + clientNum, ""); + + CalculateRanks(); + + if ( ent->r.svFlags & SVF_BOT ) { + BotAIShutdownClient( clientNum, qfalse ); + } +} + diff --git a/quake3/source/code/game/g_cmds.c b/quake3/source/code/game/g_cmds.c new file mode 100644 index 0000000..94bf5b3 --- /dev/null +++ b/quake3/source/code/game/g_cmds.c @@ -0,0 +1,1953 @@ +// Copyright (C) 1999-2000 Id Software, Inc. +// +#include "g_local.h" + +#include "../../ui/menudef.h" // for the voice chats + +/* +================== +DeathmatchScoreboardMessage + +================== +*/ +void DeathmatchScoreboardMessage( gentity_t *ent ) { + char entry[1024]; + char string[1400]; + int stringlength; + int i, j; + gclient_t *cl; + int numSorted, scoreFlags, accuracy, perfect; + + // send the latest information on all clients + string[0] = 0; + stringlength = 0; + scoreFlags = 0; + + numSorted = level.numConnectedClients; + + for (i=0 ; i < numSorted ; i++) { + int ping; + + cl = &level.clients[level.sortedClients[i]]; + + if ( cl->pers.connected == CON_CONNECTING ) { + ping = -1; + } else { + ping = cl->ps.ping < 999 ? cl->ps.ping : 999; + } + + if( cl->accuracy_shots ) { + accuracy = cl->accuracy_hits * 100 / cl->accuracy_shots; + } + else { + accuracy = 0; + } + perfect = ( cl->ps.persistant[PERS_RANK] == 0 && cl->ps.persistant[PERS_KILLED] == 0 ) ? 1 : 0; + + //PKMOD - Ergodic 02/28/04 - add PainKiller medal awards count after per_captures + //PKMOD - Ergodic 03/16/04 - fix painkiller medal error: add another "%i" for painkiller argument + Com_sprintf (entry, sizeof(entry), + " %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", level.sortedClients[i], + cl->ps.persistant[PERS_SCORE], ping, (level.time - cl->pers.enterTime)/60000, + scoreFlags, g_entities[level.sortedClients[i]].s.powerups, accuracy, + cl->ps.persistant[PERS_IMPRESSIVE_COUNT], + cl->ps.persistant[PERS_EXCELLENT_COUNT], + cl->ps.persistant[PERS_GAUNTLET_FRAG_COUNT], + cl->ps.persistant[PERS_DEFEND_COUNT], + cl->ps.persistant[PERS_ASSIST_COUNT], + perfect, + cl->ps.persistant[PERS_CAPTURES], + //PKMOD - Ergodic 03/16/04 - fix painkiller medal count, painkiller is packed so take only the count + //cl->ps.persistant[PERS_PAINKILLER_COUNT]); + (cl->ps.persistant[PERS_PAINKILLER_COUNT] >> 1) / 10 ); + j = strlen(entry); + if (stringlength + j > 1024) + break; + strcpy (string + stringlength, entry); + stringlength += j; + } + + trap_SendServerCommand( ent-g_entities, va("scores %i %i %i%s", i, + level.teamScores[TEAM_RED], level.teamScores[TEAM_BLUE], + string ) ); +} + + +/* +================== +Cmd_Score_f + +Request current scoreboard information +================== +*/ +void Cmd_Score_f( gentity_t *ent ) { + DeathmatchScoreboardMessage( ent ); +} + + + +/* +================== +CheatsOk +================== +*/ +qboolean CheatsOk( gentity_t *ent ) { + if ( !g_cheats.integer ) { + trap_SendServerCommand( ent-g_entities, va("print \"Cheats are not enabled on this server.\n\"")); + return qfalse; + } + if ( ent->health <= 0 ) { + trap_SendServerCommand( ent-g_entities, va("print \"You must be alive to use this command.\n\"")); + return qfalse; + } + return qtrue; +} + + +/* +================== +ConcatArgs +================== +*/ +char *ConcatArgs( int start ) { + int i, c, tlen; + static char line[MAX_STRING_CHARS]; + int len; + char arg[MAX_STRING_CHARS]; + + len = 0; + c = trap_Argc(); + for ( i = start ; i < c ; i++ ) { + trap_Argv( i, arg, sizeof( arg ) ); + tlen = strlen( arg ); + if ( len + tlen >= MAX_STRING_CHARS - 1 ) { + break; + } + memcpy( line + len, arg, tlen ); + len += tlen; + if ( i != c - 1 ) { + line[len] = ' '; + len++; + } + } + + line[len] = 0; + + return line; +} + +/* +================== +SanitizeString + +Remove case and control characters +================== +*/ +void SanitizeString( char *in, char *out ) { + while ( *in ) { + if ( *in == 27 ) { + in += 2; // skip color code + continue; + } + if ( *in < 32 ) { + in++; + continue; + } + *out++ = tolower( *in++ ); + } + + *out = 0; +} + +/* +================== +ClientNumberFromString + +Returns a player number for either a number or name string +Returns -1 if invalid +================== +*/ +int ClientNumberFromString( gentity_t *to, char *s ) { + gclient_t *cl; + int idnum; + char s2[MAX_STRING_CHARS]; + char n2[MAX_STRING_CHARS]; + + // numeric values are just slot numbers + if (s[0] >= '0' && s[0] <= '9') { + idnum = atoi( s ); + if ( idnum < 0 || idnum >= level.maxclients ) { + trap_SendServerCommand( to-g_entities, va("print \"Bad client slot: %i\n\"", idnum)); + return -1; + } + + cl = &level.clients[idnum]; + if ( cl->pers.connected != CON_CONNECTED ) { + trap_SendServerCommand( to-g_entities, va("print \"Client %i is not active\n\"", idnum)); + return -1; + } + return idnum; + } + + // check for a name match + SanitizeString( s, s2 ); + for ( idnum=0,cl=level.clients ; idnum < level.maxclients ; idnum++,cl++ ) { + if ( cl->pers.connected != CON_CONNECTED ) { + continue; + } + SanitizeString( cl->pers.netname, n2 ); + if ( !strcmp( n2, s2 ) ) { + return idnum; + } + } + + trap_SendServerCommand( to-g_entities, va("print \"User %s is not on the server\n\"", s)); + return -1; +} + +/* +================== +Cmd_Give_f + +Give items to a client +================== +*/ +void Cmd_Give_f (gentity_t *ent) +{ + char *name; + gitem_t *it; + int i; + qboolean give_all; + gentity_t *it_ent; + trace_t trace; + + if ( !CheatsOk( ent ) ) { + return; + } + + name = ConcatArgs( 1 ); + + if (Q_stricmp(name, "all") == 0) + give_all = qtrue; + else + give_all = qfalse; + + if (give_all || Q_stricmp( name, "health") == 0) + { + ent->health = ent->client->ps.stats[STAT_MAX_HEALTH]; + if (!give_all) + return; + } + + if (give_all || Q_stricmp(name, "weapons") == 0) + { + ent->client->ps.stats[STAT_WEAPONS] = (1 << WP_NUM_WEAPONS) - 1 - ( 1 << WP_NONE ); + //PKMOD - Ergodic 06/13/00 Give the grapple hook when asked +// ( 1 << WP_GRAPPLING_HOOK ) - ( 1 << WP_NONE ); + if (!give_all) + return; + } + + if (give_all || Q_stricmp(name, "ammo") == 0) + { + for ( i = 0 ; i < MAX_WEAPONS ; i++ ) { + //PKMOD - Ergodic 07/07/01 - don't max out on PKA weapons + // fire the specific weapon + switch( i ) { + case WP_GAUNTLET: + ent->client->ps.ammo[i] = -1; + break; + case WP_GRAPPLING_HOOK: + ent->client->ps.ammo[i] = -1; + break; + + case WP_GRAVITY : + ent->client->ps.ammo[i] = 1; + break; + case WP_SENTRY : + ent->client->ps.ammo[i] = 3; + break; + case WP_BEARTRAP : + ent->client->ps.ammo[i] = 3; + break; + case WP_AIRFIST : + ent->client->ps.ammo[i] = 4; + break; + case WP_EXPLODING_SHELLS: + ent->client->ps.ammo[i] = 10; + break; + case WP_BEANS: + ent->client->ps.ammo[i] = 1; + break; + + default: + ent->client->ps.ammo[i] = 200; + break; + } + + } + if (!give_all) + return; + } + + if (give_all || Q_stricmp(name, "armor") == 0) + { + ent->client->ps.stats[STAT_ARMOR] = 200; + + if (!give_all) + return; + } + + if (Q_stricmp(name, "excellent") == 0) { + ent->client->ps.persistant[PERS_EXCELLENT_COUNT]++; + return; + } + if (Q_stricmp(name, "impressive") == 0) { + ent->client->ps.persistant[PERS_IMPRESSIVE_COUNT]++; + return; + } + if (Q_stricmp(name, "gauntletaward") == 0) { + ent->client->ps.persistant[PERS_GAUNTLET_FRAG_COUNT]++; + return; + } + if (Q_stricmp(name, "defend") == 0) { + ent->client->ps.persistant[PERS_DEFEND_COUNT]++; + return; + } + if (Q_stricmp(name, "assist") == 0) { + ent->client->ps.persistant[PERS_ASSIST_COUNT]++; + return; + } + + // spawn a specific item right on the player + if ( !give_all ) { + it = BG_FindItem (name); + if (!it) { + return; + } + + it_ent = G_Spawn(); + VectorCopy( ent->r.currentOrigin, it_ent->s.origin ); + it_ent->classname = it->classname; + G_SpawnItem (it_ent, it); + FinishSpawningItem(it_ent ); + memset( &trace, 0, sizeof( trace ) ); + Touch_Item (it_ent, ent, &trace); + if (it_ent->inuse) { + G_FreeEntity( it_ent ); + } + } +} + + +/* +================== +Cmd_God_f + +Sets client to godmode + +argv(0) god +================== +*/ +void Cmd_God_f (gentity_t *ent) +{ + char *msg; + + if ( !CheatsOk( ent ) ) { + return; + } + + ent->flags ^= FL_GODMODE; + if (!(ent->flags & FL_GODMODE) ) + msg = "godmode OFF\n"; + else + msg = "godmode ON\n"; + + trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg)); +} + + +/* +================== +Cmd_Notarget_f + +Sets client to notarget + +argv(0) notarget +================== +*/ +void Cmd_Notarget_f( gentity_t *ent ) { + char *msg; + + if ( !CheatsOk( ent ) ) { + return; + } + + ent->flags ^= FL_NOTARGET; + if (!(ent->flags & FL_NOTARGET) ) + msg = "notarget OFF\n"; + else + msg = "notarget ON\n"; + + trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg)); +} + + +/* +================== +Cmd_Noclip_f + +argv(0) noclip +================== +*/ +void Cmd_Noclip_f( gentity_t *ent ) { + char *msg; + + if ( !CheatsOk( ent ) ) { + return; + } + + if ( ent->client->noclip ) { + msg = "noclip OFF\n"; + } else { + msg = "noclip ON\n"; + } + ent->client->noclip = !ent->client->noclip; + + trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg)); +} + + +/* +================== +Cmd_LevelShot_f + +This is just to help generate the level pictures +for the menus. It goes to the intermission immediately +and sends over a command to the client to resize the view, +hide the scoreboard, and take a special screenshot +================== +*/ +void Cmd_LevelShot_f( gentity_t *ent ) { + if ( !CheatsOk( ent ) ) { + return; + } + + // doesn't work in single player + if ( g_gametype.integer != 0 ) { + trap_SendServerCommand( ent-g_entities, + "print \"Must be in g_gametype 0 for levelshot\n\"" ); + return; + } + + BeginIntermission(); + trap_SendServerCommand( ent-g_entities, "clientLevelShot" ); +} + + +/* +================== +Cmd_LevelShot_f + +This is just to help generate the level pictures +for the menus. It goes to the intermission immediately +and sends over a command to the client to resize the view, +hide the scoreboard, and take a special screenshot +================== +*/ +void Cmd_TeamTask_f( gentity_t *ent ) { + char userinfo[MAX_INFO_STRING]; + char arg[MAX_TOKEN_CHARS]; + int task; + int client = ent->client - level.clients; + + if ( trap_Argc() != 2 ) { + return; + } + trap_Argv( 1, arg, sizeof( arg ) ); + task = atoi( arg ); + + trap_GetUserinfo(client, userinfo, sizeof(userinfo)); + Info_SetValueForKey(userinfo, "teamtask", va("%d", task)); + trap_SetUserinfo(client, userinfo); + ClientUserinfoChanged(client); +} + + + +/* +================= +Cmd_Kill_f +================= +*/ +void Cmd_Kill_f( gentity_t *ent ) { + if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + return; + } + if (ent->health <= 0) { + return; + } + ent->flags &= ~FL_GODMODE; + ent->client->ps.stats[STAT_HEALTH] = ent->health = -999; + player_die (ent, ent, ent, 100000, MOD_SUICIDE); +} + +/* +================= +BroadCastTeamChange + +Let everyone know about a team change +================= +*/ +void BroadcastTeamChange( gclient_t *client, int oldTeam ) +{ + if ( client->sess.sessionTeam == TEAM_RED ) { + trap_SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " joined the red team.\n\"", + client->pers.netname) ); + } else if ( client->sess.sessionTeam == TEAM_BLUE ) { + trap_SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " joined the blue team.\n\"", + client->pers.netname)); + } else if ( client->sess.sessionTeam == TEAM_SPECTATOR && oldTeam != TEAM_SPECTATOR ) { + trap_SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " joined the spectators.\n\"", + client->pers.netname)); + } else if ( client->sess.sessionTeam == TEAM_FREE ) { + trap_SendServerCommand( -1, va("cp \"%s" S_COLOR_WHITE " joined the battle.\n\"", + client->pers.netname)); + } +} + +/* +================= +SetTeam +================= +*/ +void SetTeam( gentity_t *ent, char *s ) { + int team, oldTeam; + gclient_t *client; + int clientNum; + spectatorState_t specState; + int specClient; + int teamLeader; + + // + // see what change is requested + // + client = ent->client; + + clientNum = client - level.clients; + specClient = 0; + specState = SPECTATOR_NOT; + if ( !Q_stricmp( s, "scoreboard" ) || !Q_stricmp( s, "score" ) ) { + team = TEAM_SPECTATOR; + specState = SPECTATOR_SCOREBOARD; + } else if ( !Q_stricmp( s, "follow1" ) ) { + team = TEAM_SPECTATOR; + specState = SPECTATOR_FOLLOW; + specClient = -1; + } else if ( !Q_stricmp( s, "follow2" ) ) { + team = TEAM_SPECTATOR; + specState = SPECTATOR_FOLLOW; + specClient = -2; + } else if ( !Q_stricmp( s, "spectator" ) || !Q_stricmp( s, "s" ) ) { + team = TEAM_SPECTATOR; + specState = SPECTATOR_FREE; + } else if ( g_gametype.integer >= GT_TEAM ) { + // if running a team game, assign player to one of the teams + specState = SPECTATOR_NOT; + if ( !Q_stricmp( s, "red" ) || !Q_stricmp( s, "r" ) ) { + team = TEAM_RED; + } else if ( !Q_stricmp( s, "blue" ) || !Q_stricmp( s, "b" ) ) { + team = TEAM_BLUE; + } else { + // pick the team with the least number of players + team = PickTeam( clientNum ); + } + + if ( g_teamForceBalance.integer ) { + int counts[TEAM_NUM_TEAMS]; + + counts[TEAM_BLUE] = TeamCount( ent->client->ps.clientNum, TEAM_BLUE ); + counts[TEAM_RED] = TeamCount( ent->client->ps.clientNum, TEAM_RED ); + + // We allow a spread of two + if ( team == TEAM_RED && counts[TEAM_RED] - counts[TEAM_BLUE] > 1 ) { + trap_SendServerCommand( ent->client->ps.clientNum, + "cp \"Red team has too many players.\n\"" ); + return; // ignore the request + } + if ( team == TEAM_BLUE && counts[TEAM_BLUE] - counts[TEAM_RED] > 1 ) { + trap_SendServerCommand( ent->client->ps.clientNum, + "cp \"Blue team has too many players.\n\"" ); + return; // ignore the request + } + + // It's ok, the team we are switching to has less or same number of players + } + + } else { + // force them to spectators if there aren't any spots free + team = TEAM_FREE; + } + + // override decision if limiting the players + if ( (g_gametype.integer == GT_TOURNAMENT) + && level.numNonSpectatorClients >= 2 ) { + team = TEAM_SPECTATOR; + } else if ( g_maxGameClients.integer > 0 && + level.numNonSpectatorClients >= g_maxGameClients.integer ) { + team = TEAM_SPECTATOR; + } + + // + // decide if we will allow the change + // + oldTeam = client->sess.sessionTeam; + if ( team == oldTeam && team != TEAM_SPECTATOR ) { + return; + } + + // + // execute the team change + // + + // if the player was dead leave the body + if ( client->ps.stats[STAT_HEALTH] <= 0 ) { + CopyToBodyQue(ent); + } + + // he starts at 'base' + client->pers.teamState.state = TEAM_BEGIN; + if ( oldTeam != TEAM_SPECTATOR ) { + // Kill him (makes sure he loses flags, etc) + ent->flags &= ~FL_GODMODE; + ent->client->ps.stats[STAT_HEALTH] = ent->health = 0; + player_die (ent, ent, ent, 100000, MOD_SUICIDE); + + } + // they go to the end of the line for tournements + if ( team == TEAM_SPECTATOR ) { + client->sess.spectatorTime = level.time; + } + + client->sess.sessionTeam = team; + client->sess.spectatorState = specState; + client->sess.spectatorClient = specClient; + + client->sess.teamLeader = qfalse; + if ( team == TEAM_RED || team == TEAM_BLUE ) { + teamLeader = TeamLeader( team ); + // if there is no team leader or the team leader is a bot and this client is not a bot + if ( teamLeader == -1 || ( !(g_entities[clientNum].r.svFlags & SVF_BOT) && (g_entities[teamLeader].r.svFlags & SVF_BOT) ) ) { + SetLeader( team, clientNum ); + } + } + // make sure there is a team leader on the team the player came from + if ( oldTeam == TEAM_RED || oldTeam == TEAM_BLUE ) { + CheckTeamLeader( oldTeam ); + } + + BroadcastTeamChange( client, oldTeam ); + + // get and distribute relevent paramters + ClientUserinfoChanged( clientNum ); + + ClientBegin( clientNum ); +} + +/* +================= +StopFollowing + +If the client being followed leaves the game, or you just want to drop +to free floating spectator mode +================= +*/ +void StopFollowing( gentity_t *ent ) { + ent->client->ps.persistant[ PERS_TEAM ] = TEAM_SPECTATOR; + ent->client->sess.sessionTeam = TEAM_SPECTATOR; + ent->client->sess.spectatorState = SPECTATOR_FREE; + ent->client->ps.pm_flags &= ~PMF_FOLLOW; + ent->r.svFlags &= ~SVF_BOT; + ent->client->ps.clientNum = ent - g_entities; +} + +/* +================= +Cmd_Team_f +================= +*/ +void Cmd_Team_f( gentity_t *ent ) { + int oldTeam; + char s[MAX_TOKEN_CHARS]; + + if ( trap_Argc() != 2 ) { + oldTeam = ent->client->sess.sessionTeam; + switch ( oldTeam ) { + case TEAM_BLUE: + trap_SendServerCommand( ent-g_entities, "print \"Blue team\n\"" ); + break; + case TEAM_RED: + trap_SendServerCommand( ent-g_entities, "print \"Red team\n\"" ); + break; + case TEAM_FREE: + trap_SendServerCommand( ent-g_entities, "print \"Free team\n\"" ); + break; + case TEAM_SPECTATOR: + trap_SendServerCommand( ent-g_entities, "print \"Spectator team\n\"" ); + break; + } + return; + } + + if ( ent->client->switchTeamTime > level.time ) { + trap_SendServerCommand( ent-g_entities, "print \"May not switch teams more than once per 5 seconds.\n\"" ); + return; + } + + + //PKMOD - Ergodic 02/11/04 - if cvar is set then do not count joining spectators as a loss + if ( g_pkatourneyrules.integer == 0 ) { + // if they are playing a tournement game, count as a loss + if ( (g_gametype.integer == GT_TOURNAMENT ) + && ent->client->sess.sessionTeam == TEAM_FREE ) { + ent->client->sess.losses++; + } + } + + trap_Argv( 1, s, sizeof( s ) ); + + SetTeam( ent, s ); + + ent->client->switchTeamTime = level.time + 5000; +} + + +/* +================= +Cmd_Follow_f +================= +*/ +void Cmd_Follow_f( gentity_t *ent ) { + int i; + char arg[MAX_TOKEN_CHARS]; + + if ( trap_Argc() != 2 ) { + if ( ent->client->sess.spectatorState == SPECTATOR_FOLLOW ) { + StopFollowing( ent ); + } + return; + } + + trap_Argv( 1, arg, sizeof( arg ) ); + i = ClientNumberFromString( ent, arg ); + if ( i == -1 ) { + return; + } + + // can't follow self + if ( &level.clients[ i ] == ent->client ) { + return; + } + + // can't follow another spectator + if ( level.clients[ i ].sess.sessionTeam == TEAM_SPECTATOR ) { + return; + } + + + //PKMOD - Ergodic 02/11/04 - if cvar is set then do not count joining spectators as a loss + if ( g_pkatourneyrules.integer == 0 ) { + // if they are playing a tournement game, count as a loss + if ( (g_gametype.integer == GT_TOURNAMENT ) + && ent->client->sess.sessionTeam == TEAM_FREE ) { + ent->client->sess.losses++; + } + } + + // first set them to spectator + if ( ent->client->sess.sessionTeam != TEAM_SPECTATOR ) { + SetTeam( ent, "spectator" ); + } + + ent->client->sess.spectatorState = SPECTATOR_FOLLOW; + ent->client->sess.spectatorClient = i; +} + +/* +================= +Cmd_FollowCycle_f +================= +*/ +void Cmd_FollowCycle_f( gentity_t *ent, int dir ) { + int clientnum; + int original; + + //PKMOD - Ergodic 02/11/04 - if cvar is set then do not count joining spectators as a loss + if ( g_pkatourneyrules.integer == 0 ) { + // if they are playing a tournement game, count as a loss + if ( (g_gametype.integer == GT_TOURNAMENT ) + && ent->client->sess.sessionTeam == TEAM_FREE ) { + ent->client->sess.losses++; + } + } + + // first set them to spectator + if ( ent->client->sess.spectatorState == SPECTATOR_NOT ) { + SetTeam( ent, "spectator" ); + } + + if ( dir != 1 && dir != -1 ) { + G_Error( "Cmd_FollowCycle_f: bad dir %i", dir ); + } + + clientnum = ent->client->sess.spectatorClient; + original = clientnum; + do { + clientnum += dir; + if ( clientnum >= level.maxclients ) { + clientnum = 0; + } + if ( clientnum < 0 ) { + clientnum = level.maxclients - 1; + } + + // can only follow connected clients + if ( level.clients[ clientnum ].pers.connected != CON_CONNECTED ) { + continue; + } + + // can't follow another spectator + if ( level.clients[ clientnum ].sess.sessionTeam == TEAM_SPECTATOR ) { + continue; + } + + // this is good, we can use it + ent->client->sess.spectatorClient = clientnum; + ent->client->sess.spectatorState = SPECTATOR_FOLLOW; + return; + } while ( clientnum != original ); + + // leave it where it was +} + + +/* +================== +G_Say +================== +*/ + +static void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, const char *name, const char *message ) { + if (!other) { + return; + } + if (!other->inuse) { + return; + } + if (!other->client) { + return; + } + if ( other->client->pers.connected != CON_CONNECTED ) { + return; + } + + //PKMOD - Ergodic 03/29/02 - permit say_team from owner to Private Bot + //PKMOD - Ergodic 11/13/02 - add SAY_TEAMBYID for PKA UI Orders + //PKMOD - Ergodic 12/16/02 - change logic around to Private Bot can receive orders +// if ( ( mode != SAY_TEAM && mode != SAY_TEAMBYID ) || !PrivateBotOwnerTeam( ent, other ) ) { + if ( ( mode == SAY_TEAM ) || ( mode == SAY_TEAMBYID ) ) { + if ( !PrivateBotOwnerTeam( ent, other ) ) { + //here if not a Private Bot, Check for teammate + //PKMOD - Ergodic 11/13/02 - debug command (inactive) + //Com_Printf("G_SayTo - in IF if clause\n" ); + if ( !OnSameTeam(ent, other) ) { + return; + } + } + + //PKMOD - Ergodic 02/11/04 - if cvar is set then allow for spectators chatting to be + // seen by the players + if ( g_pkatourneychat.integer == 0 ) { + // no chatting to players in tournements + if ( (g_gametype.integer == GT_TOURNAMENT ) + && other->client->sess.sessionTeam == TEAM_FREE + && ent->client->sess.sessionTeam != TEAM_FREE ) { + return; + } + } + } + + trap_SendServerCommand( other-g_entities, va("%s \"%s%c%c%s\"", + ( mode == SAY_TEAM || mode == SAY_TEAMBYID ) ? "tchat" : "chat", + name, Q_COLOR_ESCAPE, color, message)); + + //PKMOD - Ergodic 11/13/02 - debug command (inactive) + //Com_Printf("G_SayTo - server command >%s \"%s%c%c%s\"<\n", + // ( mode == SAY_TEAM || mode == SAY_TEAMBYID ) ? "tchat" : "chat", + // name, Q_COLOR_ESCAPE, color, message ); +} + +#define EC "\x19" + +void G_Say( gentity_t *ent, gentity_t *target, int mode, const char *chatText ) { + int j; + gentity_t *other; + int color; + char name[64]; + // don't let text be too long for malicious reasons + char text[MAX_SAY_TEXT]; + char location[64]; + + //PKMOD - Ergodic 12/16/02 - Let's not do this since Private Bot will wuse SAY_TEAM COMMANDS +// if ( g_gametype.integer < GT_TEAM && mode == SAY_TEAM ) { +// mode = SAY_ALL; +// } + + switch ( mode ) { + default: + case SAY_ALL: + G_LogPrintf( "say: %s: %s\n", ent->client->pers.netname, chatText ); + Com_sprintf (name, sizeof(name), "%s%c%c"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE ); + color = COLOR_GREEN; + break; + case SAY_TEAMBYID: + //PKMOD - Ergodic 11/13/02 - debug say_teambyid (inactive) + //Com_Printf( "G_Say - say_teambyid: %s: %s\n", ent->client->pers.netname, chatText ); + G_LogPrintf( "say_teambyid: %s: %s\n", ent->client->pers.netname, chatText ); + if (Team_GetLocationMsg(ent, location, sizeof(location))) + Com_sprintf (name, sizeof(name), EC"(%s%c%c"EC") (%s)"EC": ", + ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE, location); + else + Com_sprintf (name, sizeof(name), EC"(%s%c%c"EC")"EC": ", + ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE ); + color = COLOR_CYAN; + break; + case SAY_TEAM: + G_LogPrintf( "sayteam: %s: %s\n", ent->client->pers.netname, chatText ); + if (Team_GetLocationMsg(ent, location, sizeof(location))) + Com_sprintf (name, sizeof(name), EC"(%s%c%c"EC") (%s)"EC": ", + ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE, location); + else + Com_sprintf (name, sizeof(name), EC"(%s%c%c"EC")"EC": ", + ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE ); + color = COLOR_CYAN; + break; + case SAY_TELL: + if (target && g_gametype.integer >= GT_TEAM && + target->client->sess.sessionTeam == ent->client->sess.sessionTeam && + Team_GetLocationMsg(ent, location, sizeof(location))) + Com_sprintf (name, sizeof(name), EC"[%s%c%c"EC"] (%s)"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE, location ); + else + Com_sprintf (name, sizeof(name), EC"[%s%c%c"EC"]"EC": ", ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE ); + color = COLOR_MAGENTA; + break; + } + + Q_strncpyz( text, chatText, sizeof(text) ); + + if ( target ) { + G_SayTo( ent, target, mode, color, name, text ); + return; + } + + // echo the text to the console + if ( g_dedicated.integer ) { + G_Printf( "%s%s\n", name, text); + } + + // send it to all the apropriate clients + for (j = 0; j < level.maxclients; j++) { + other = &g_entities[j]; + G_SayTo( ent, other, mode, color, name, text ); + } +} + + +/* +================== +Cmd_Say_f +================== +*/ +static void Cmd_Say_f( gentity_t *ent, int mode, qboolean arg0 ) { + char *p; + + if ( trap_Argc () < 2 && !arg0 ) { + return; + } + + if (arg0) + { + p = ConcatArgs( 0 ); + } + else + { + p = ConcatArgs( 1 ); + } + + G_Say( ent, NULL, mode, p ); +} + +/* +================== +Cmd_Tell_f +PKMOD - Ergodic 11/13/02 - add ClientNum addressing to say_team +================== +*/ +static void Cmd_say_teambyid_f( gentity_t *ent ) { + int targetNum; + gentity_t *target; + char *p; + char arg[MAX_TOKEN_CHARS]; + char nameandtext[MAX_STRING_TOKENS]; + + if ( trap_Argc () < 2 ) { + return; + } + + trap_Argv( 1, arg, sizeof( arg ) ); + + //PKMOD - Ergodic 11/13/02 - debug say_teambyid (inactive) + //Com_Printf( "Cmd_say_teambyid_f - arg(1)>%s<\n", arg[0] ); + + targetNum = atoi( arg ); + if ( targetNum < 0 || targetNum >= level.maxclients ) { + return; + } + + target = &g_entities[targetNum]; + if ( !target || !target->inuse || !target->client ) { + return; + } + + //store the target's name + Q_strncpyz( nameandtext, target->client->pers.netname, sizeof( nameandtext ) ); + + //store the message text + p = ConcatArgs( 2 ); + + //bui,d the name and message pair + strcat( nameandtext, " " ); + strcat( nameandtext, p ); + + + //PKMOD - Ergodic 11/13/02 - debug say_teambyid (inactive) + //Com_Printf( "Cmd_say_teambyid_f - %s to %s: %s\n", ent->client->pers.netname, target->client->pers.netname, nameandtext ); + + //PKMOD - Ergodic 11/13/02 - logging is done in G_Say + //G_LogPrintf( "say_teambyid: %s to %s: %s\n", ent->client->pers.netname, target->client->pers.netname, nameandtext ); + G_Say( ent, target, SAY_TEAMBYID, nameandtext ); + // don't tell to the player self if it was already directed to this player + // also don't send the chat back to a bot + if ( ent != target && !(ent->r.svFlags & SVF_BOT)) { + G_Say( ent, ent, SAY_TEAMBYID, nameandtext ); + } +} + + + +/* +================== +Cmd_Tell_f +================== +*/ +static void Cmd_Tell_f( gentity_t *ent ) { + int targetNum; + gentity_t *target; + char *p; + char arg[MAX_TOKEN_CHARS]; + + if ( trap_Argc () < 2 ) { + return; + } + + trap_Argv( 1, arg, sizeof( arg ) ); + targetNum = atoi( arg ); + if ( targetNum < 0 || targetNum >= level.maxclients ) { + return; + } + + target = &g_entities[targetNum]; + if ( !target || !target->inuse || !target->client ) { + return; + } + + p = ConcatArgs( 2 ); + + G_LogPrintf( "tell: %s to %s: %s\n", ent->client->pers.netname, target->client->pers.netname, p ); + G_Say( ent, target, SAY_TELL, p ); + // don't tell to the player self if it was already directed to this player + // also don't send the chat back to a bot + if ( ent != target && !(ent->r.svFlags & SVF_BOT)) { + G_Say( ent, ent, SAY_TELL, p ); + } +} + + +static void G_VoiceTo( gentity_t *ent, gentity_t *other, int mode, const char *id, qboolean voiceonly ) { + int color; + char *cmd; + + if (!other) { + return; + } + if (!other->inuse) { + return; + } + if (!other->client) { + return; + } + if ( mode == SAY_TEAM && !OnSameTeam(ent, other) ) { + return; + } + // no chatting to players in tournements + if ( (g_gametype.integer == GT_TOURNAMENT )) { + return; + } + + if (mode == SAY_TEAM) { + color = COLOR_CYAN; + cmd = "vtchat"; + } + else if (mode == SAY_TELL) { + color = COLOR_MAGENTA; + cmd = "vtell"; + } + else { + color = COLOR_GREEN; + cmd = "vchat"; + } + + trap_SendServerCommand( other-g_entities, va("%s %d %d %d %s", cmd, voiceonly, ent->s.number, color, id)); +} + +void G_Voice( gentity_t *ent, gentity_t *target, int mode, const char *id, qboolean voiceonly ) { + int j; + gentity_t *other; + + if ( g_gametype.integer < GT_TEAM && mode == SAY_TEAM ) { + mode = SAY_ALL; + } + + if ( target ) { + G_VoiceTo( ent, target, mode, id, voiceonly ); + return; + } + + // echo the text to the console + if ( g_dedicated.integer ) { + G_Printf( "voice: %s %s\n", ent->client->pers.netname, id); + } + + // send it to all the apropriate clients + for (j = 0; j < level.maxclients; j++) { + other = &g_entities[j]; + G_VoiceTo( ent, other, mode, id, voiceonly ); + } +} + +/* +================== +Cmd_Voice_f +================== +*/ +static void Cmd_Voice_f( gentity_t *ent, int mode, qboolean arg0, qboolean voiceonly ) { + char *p; + + if ( trap_Argc () < 2 && !arg0 ) { + return; + } + + if (arg0) + { + p = ConcatArgs( 0 ); + } + else + { + p = ConcatArgs( 1 ); + } + + G_Voice( ent, NULL, mode, p, voiceonly ); +} + +/* +================== +Cmd_VoiceTell_f +================== +*/ +static void Cmd_VoiceTell_f( gentity_t *ent, qboolean voiceonly ) { + int targetNum; + gentity_t *target; + char *id; + char arg[MAX_TOKEN_CHARS]; + + if ( trap_Argc () < 2 ) { + return; + } + + trap_Argv( 1, arg, sizeof( arg ) ); + targetNum = atoi( arg ); + if ( targetNum < 0 || targetNum >= level.maxclients ) { + return; + } + + target = &g_entities[targetNum]; + if ( !target || !target->inuse || !target->client ) { + return; + } + + id = ConcatArgs( 2 ); + + G_LogPrintf( "vtell: %s to %s: %s\n", ent->client->pers.netname, target->client->pers.netname, id ); + G_Voice( ent, target, SAY_TELL, id, voiceonly ); + // don't tell to the player self if it was already directed to this player + // also don't send the chat back to a bot + if ( ent != target && !(ent->r.svFlags & SVF_BOT)) { + G_Voice( ent, ent, SAY_TELL, id, voiceonly ); + } +} + + +/* +================== +Cmd_VoiceTaunt_f +================== +*/ +static void Cmd_VoiceTaunt_f( gentity_t *ent ) { + gentity_t *who; + int i; + + if (!ent->client) { + return; + } + + // insult someone who just killed you + if (ent->enemy && ent->enemy->client && ent->enemy->client->lastkilled_client == ent->s.number) { + // i am a dead corpse + if (!(ent->enemy->r.svFlags & SVF_BOT)) { + G_Voice( ent, ent->enemy, SAY_TELL, VOICECHAT_DEATHINSULT, qfalse ); + } + if (!(ent->r.svFlags & SVF_BOT)) { + G_Voice( ent, ent, SAY_TELL, VOICECHAT_DEATHINSULT, qfalse ); + } + ent->enemy = NULL; + return; + } + // insult someone you just killed + if (ent->client->lastkilled_client >= 0 && ent->client->lastkilled_client != ent->s.number) { + who = g_entities + ent->client->lastkilled_client; + if (who->client) { + // who is the person I just killed + if (who->client->lasthurt_mod == MOD_GAUNTLET) { + if (!(who->r.svFlags & SVF_BOT)) { + G_Voice( ent, who, SAY_TELL, VOICECHAT_KILLGAUNTLET, qfalse ); // and I killed them with a gauntlet + } + if (!(ent->r.svFlags & SVF_BOT)) { + G_Voice( ent, ent, SAY_TELL, VOICECHAT_KILLGAUNTLET, qfalse ); + } + } else { + if (!(who->r.svFlags & SVF_BOT)) { + G_Voice( ent, who, SAY_TELL, VOICECHAT_KILLINSULT, qfalse ); // and I killed them with something else + } + if (!(ent->r.svFlags & SVF_BOT)) { + G_Voice( ent, ent, SAY_TELL, VOICECHAT_KILLINSULT, qfalse ); + } + } + ent->client->lastkilled_client = -1; + return; + } + } + + if (g_gametype.integer >= GT_TEAM) { + // praise a team mate who just got a reward + for(i = 0; i < MAX_CLIENTS; i++) { + who = g_entities + i; + if (who->client && who != ent && who->client->sess.sessionTeam == ent->client->sess.sessionTeam) { + if (who->client->rewardTime > level.time) { + if (!(who->r.svFlags & SVF_BOT)) { + G_Voice( ent, who, SAY_TELL, VOICECHAT_PRAISE, qfalse ); + } + if (!(ent->r.svFlags & SVF_BOT)) { + G_Voice( ent, ent, SAY_TELL, VOICECHAT_PRAISE, qfalse ); + } + return; + } + } + } + } + + // just say something + G_Voice( ent, NULL, SAY_ALL, VOICECHAT_TAUNT, qfalse ); +} + + + +static char *gc_orders[] = { + "hold your position", + "hold this position", + "come here", + "cover me", + "guard location", + "search and destroy", + "report" +}; + +void Cmd_GameCommand_f( gentity_t *ent ) { + int player; + int order; + char str[MAX_TOKEN_CHARS]; + + trap_Argv( 1, str, sizeof( str ) ); + player = atoi( str ); + trap_Argv( 2, str, sizeof( str ) ); + order = atoi( str ); + + if ( player < 0 || player >= MAX_CLIENTS ) { + return; + } + if ( order < 0 || order > sizeof(gc_orders)/sizeof(char *) ) { + return; + } + G_Say( ent, &g_entities[player], SAY_TELL, gc_orders[order] ); + G_Say( ent, ent, SAY_TELL, gc_orders[order] ); +} + +/* +================== +Cmd_Where_f +================== +*/ +void Cmd_Where_f( gentity_t *ent ) { + trap_SendServerCommand( ent-g_entities, va("print \"%s\n\"", vtos( ent->s.origin ) ) ); +} + +static const char *gameNames[] = { + "Free For All", + "Tournament", + "Single Player", + "Team Deathmatch", + "Capture the Flag", + "One Flag CTF", + "Overload", + "Harvester" +}; + +/* +================== +Cmd_CallVote_f +================== +*/ +void Cmd_CallVote_f( gentity_t *ent ) { + int i; + char arg1[MAX_STRING_TOKENS]; + char arg2[MAX_STRING_TOKENS]; + + if ( !g_allowVote.integer ) { + trap_SendServerCommand( ent-g_entities, "print \"Voting not allowed here.\n\"" ); + return; + } + + if ( level.voteTime ) { + trap_SendServerCommand( ent-g_entities, "print \"A vote is already in progress.\n\"" ); + return; + } + if ( ent->client->pers.voteCount >= MAX_VOTE_COUNT ) { + trap_SendServerCommand( ent-g_entities, "print \"You have called the maximum number of votes.\n\"" ); + return; + } + if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + trap_SendServerCommand( ent-g_entities, "print \"Not allowed to call a vote as spectator.\n\"" ); + return; + } + + // make sure it is a valid command to vote on + trap_Argv( 1, arg1, sizeof( arg1 ) ); + trap_Argv( 2, arg2, sizeof( arg2 ) ); + + if( strchr( arg1, ';' ) || strchr( arg2, ';' ) ) { + trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string.\n\"" ); + return; + } + + if ( !Q_stricmp( arg1, "map_restart" ) ) { + } else if ( !Q_stricmp( arg1, "nextmap" ) ) { + } else if ( !Q_stricmp( arg1, "map" ) ) { + } else if ( !Q_stricmp( arg1, "g_gametype" ) ) { + } else if ( !Q_stricmp( arg1, "kick" ) ) { + } else if ( !Q_stricmp( arg1, "clientkick" ) ) { + } else if ( !Q_stricmp( arg1, "g_doWarmup" ) ) { + } else if ( !Q_stricmp( arg1, "timelimit" ) ) { + } else if ( !Q_stricmp( arg1, "fraglimit" ) ) { + } else { + trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string.\n\"" ); + trap_SendServerCommand( ent-g_entities, "print \"Vote commands are: map_restart, nextmap, map , g_gametype , kick , clientkick , g_doWarmup, timelimit _je#|5Fq0|uhbo*H;h0E;&`OO{+=v?9x_JxT%LI?k9UwM z!3k!UUJCIn8}k#*_og(p6zny-E6dQM(B-knE^2n`l_j1P^7sh*lXw-h9BpF^|8Zu2 zl1)DeE@}2Nm8Y_-?<&IiN^}n}UpZa)h0HF}iYA^5@xkTzj)5%G^Po`}oh888aQy6X z;RVxR9`8w-gfI${Pk}O=XM~lh%!XWEwB0~o15K-`NMi?oZ5=~_T0@5$0XNq6E7oT2 z578ftqqV)&+6VkHO=S%KXd2E9k4iKS28g-=Q;szoQo88 zPYb-ZBUG*_he!4xPYIgC7~y@XBY+cViuf-YQ4anS>5PQ; zIicf+I-^9spSf=~h1v=J4l9pn@2Dzc(75*Ho24Or-g&F6PJr?Wa*u6^; z9NzVqPqDs2_*H49gxAgNQm#&CB|eiPpFsL*QjDZ$Y2-TKtEjQ)+ldusv@Z0$$ajq# z3;xwKRl;AcKSuu6r!vehqwUh3Yw$iBQl^pD_M4uIz>Vov#$~lV-?IVu8tN!`f@d~x zbJ}I(QGOzJA%9xZJi%2WssXpAB%U9D|3g*@$hV~>oSuGUXPe!mH_$LiUlD4L_t$|w zm-vmdwjuqU=vBrTkKSO70`5U=S^xFu@0MS|JZ)d+=@0#>^or=4ZFaw6MPKw4 z)(;`QgJ_K4`Fas>CM|(~9)Hw`sE_#GNn-_D5ru*8GHn}w6EfhBzYqMa;5O|(6k=}6 zjv>6KGo5EH?^5(d_-B8Y;)VKr%?;=&AfBQ6yPSNz09~%`z-Ph!&Y@(jLAryVe~mP< z|DOZWI{8`W*-kv?y{%gVc&_~Hc324uh=c1V@cDLxcXNh6%)mT<4t{G#aqAIFOJ7F$ zh(mi6ITlais4HXC=Y^iWc%Sj~!FmUGv0g!WDoGm|d&sVCH2_YaS|Xq1;oFT9Ddr_d zemi{u{mIls@L{Zd@QH+9);avO*bl+=y`u2H###y2_p^+Tki8dsSGa!PFX5lig%Ms= z8pZte_`YLj2cHOdm2oQBZL!maPh{*9JPxbANG0`T{~O7^Q9p&!RF^6<-hlfP^!30E zXar;ETd5BMH>IZ}yb_id;WeYL1aGrG1a3|bOZ?-^e&klvox>|c_F1f@@D6T^^8@iY zX6{$NfyxV3o?^(K4zyYPS1_j~ZlWo`T%Vl#-EXEbf}Q&wI?`Vf{%6)V2){EO6903| zZuu_x$`sczE@RE`-ud0PMc7>S`1uI@o(9K!SI(_l!Fcdw^t?sZmAMp6c^)MO@#_oy zcfm1se?NnKVf;9#``e`~a==eA}b!gAxj0kYiQFl9e` z)j#si5dN$6ddwNAxkgbyedXwA9_Cmu3#f+2ly&$qu@Q> zPk?J%Zwday`zdf8>qEhxdOriMYYmtDIqm%w_-gBF8NXIZsfPTkXZa+*@G61pTiYam z%chhAZeXn{@1*y2?;G&n(8?6N!TSnuBWtAKSG*g68(WhFZ}h$j+{BtC_*L&~z)h`% zf?xB#4t$OEf#A*Ft-#k>+XQd&ZU$~ttNkSQv7x_VaXlQ7<E|U z9U;&5f-;}ae=+|w+?8YkdG-KBHQ`t{>-n{$qbE>iJf1%Q$1?Nao`PEr_X6BTxIkG~ z569;l%!i+V3yjl|CjPkJUexLTyY@diF)r=D59s~+$p2T!u8h4Y{3hONivLqFA0E9J z;|GfdLzfz%ZD+kMhDI}PsO_I3PDh|uM3os&()Rli9|D)8fsKJZ+HU1}9N#N1{lysX z`|XJB;FqJ~EPs`@cSO7gT#0r!a`>yPm+^h7Ldyl;XUznzNv{ch*jfQxo8}3gXiWyL zPa_2nwZ;NBrS7aBpzjvC`oN;D`UjR8(A9oCThnxM%!OT9DsaR zYRKs)jPIj5qkQ(F(?*``+ao`M{2jEuf#cs&r6HC|UNgSa_U+i4%l+L8nBQUj*O>E8 zS@fRBm&FcC-jCCm@eFOhO9znOBdLq{e*}9kd4Elo;IY`b%O@?fS^j{wzr$`%e1Ykx zw_b=oB!91QGf%+ih|N5AQiA+X$@Q?q0i|_!;_`fOHyCXiw`;qZK z>Qlb)|Dd4pKgOfaMZX69GX6*TTYw2j%oksJ{Ezr_jqVP48UI5*-}pa+>@m^vz*lMj zmuK`Zt44PK_NaPNeoA<1pngWG)r=e9_@x<-MX6RS4}42hWyqIOdzjw@>w^(5BR)y$ z1oLyqUJ<<#e6K3T<xX#?oIX^*q_Y%dzMK1QW|}6)PHr5aXQw=u{R6R zR(n|=(!V5nIrNoR6BrN2{=MisfGemPraYo!g1z`?FVx3eAJP7ljqHK^zDjL2>A`-j zh?@|<+A0;(a7b8OjG2$CqsBTI^KqpRUS0Jl;^%oA>rYUF@4Mo5mA@045HJ4S34FJG zeFk6jslcH;cV)*QUX$TmUG8%iv+gTB3+4sJ<5GSD`GH~lPd#6Vve<`_w#6K{f0_EL2bEzvAC=*;Z%=cdT?SD;ZVG2I# z!*!?+iq12R#&&m#Mt!iTLrY-Dm%-@|v=8)=$iIX03cSB}rr>m}|(lt<|jqFf)}#F+=~iIg?^ah_L|f*4kHA;qpOYO_nfhtA;Ni|}kU+^fP1 z2C@e{tM?oI0w)sbALae{#R**`WeCNU+s`RikdJ+f2|Wu29BW%hOh1I zW`9s&+F|&F@!9L($5O471?IcOG7IlxucZJQZA2@$6*jX?0(jvhz z=GKc8dRuT2v;I|@N{zRadxbKUNQ=c#bHaQDH@gL?+lE5MiY&wkjgKs-JZhk(O>;T-s1kprgw^Y@r6lb#Z7ocg;O=RWy+KTPU# zGn^kZ_1|E!&tq>iukTec@?>wpSt!1#W}C==g0TvJ-!p)@zBVwoCdHfj#&ae-y5zc7 z4E?4lkeLg&1a1u+&$%#<>mBny72W~RpN0RwBJ;zE21{%gxTLTgLAexED1^ekSe{VBA6c_r`u>#)-JriTQuiMT2V#Rydo>{1-7zgbxdL#(swNsZ8Cw zhNJ%>>tX1>Q>P1l*qQ}=m;P(LBma^92=ZC_&eIOwrndnP)0iQk+(b+@NE6VUPt~X>nF(1(`|(B!Jm&F*RjGsh5g<>dQ#65eHW|?z>9Tl z;h(ln13#^|3jd;Y5%?M1M(|%aujr#^^<R;_ zdiN~621WY~*0xf0fN^d~aID$y=Ak7b-wC!Q zGhQf6kCrjv#g)U{KhGC%dH)46Ox^zZ3nd-wQujHpJwH<#-ok(390=#Yzm)@*`hM_t zBXF&Af$i)ST8+Lw?-_C_*HOL~&;6EF!r3MMW(H&T8@4~!smCt8+;f-DG+0+KW*r@p z6g3{8r~@3Q$JNU;uusC@cN^=?mwFz`v+HnXC9VW!C*jy1uRjO(1A_Ja6L$L^qmh<> zk`3m&euLBcpOm{)zJ1$UnfHIG@Gm8QDY=3^3r1F#fCluJk^bSJ3bS=`95%OM zZ}wCFBEvk_-E|+)Hq?6;2U8BCoW#+koFBpA{u6ffa-O*^*bmDDw>P1TJ9uouV~^nW zn$y5Me$VdjONAZS&Tu{NeVI1(a?d&bfjYQ6J$4x#!LlCgp9p?-skX*_b}QZq%e$1{ zV<2{)w@7u$7k}S^^OoiLPS-39Tv|s5lnHs3fN|fY@`?R%*<$KC{#NjB9`gnJ;rGq; z6G4k3Z<(Jr>{ejrFx@4t~e1*I^&F$Tu_dd*~ksZjHU>{P&9BHrTt$e>sA$GwX|3 z17{pbc602-;lDA$zn-o)_;JPq$!_>G9Cy z0S^9E{|X#MHwr$XPXNczFu|wwY2d^ENi?eeO;LTRC|ME+0Q#K!xRT|AK{0@u#NX0MA*&GZt+b<`6Q7&)%}CGf^bKRAw4?3_+?Oh*IsB=5DsX>_ zlk`s16M@sIvfxR25^yGcC+|PXih}+us(O{*7g(Te8p_a75;nrJ@Dr`>wl>4?)jf?y%Bx~vUeE$njY;1Tv^*=%=ui4iZH)B z#`mfe{ClW|k=J%Ny%acto?&^?_S0s)Kavtf-p2lCu77tk?t=XUx-ZgKn7$PGN@jms z5n3mB2kr{u`Zv(XYx@gxi)<`4W86dAtMyjsD@MCSzJ%Ft7l-?vIDE2uo7>roQ)9vX zXaL?qJPi^>CE4P-nsE=2rfabdTU+=KhBSN)cSo+&^B5P77XzJ2Lq^0v}6P-LSt2 zw`6kt=eCyj88GE#fo2dJ-lIZEkc{H^8s zgW56x|36N>q`i6x_rbDdg?Pa)suzKmP;Y6krdfQ8^m3Xbc(U1lyOL7Te_(x6tSR6> zN4tc7pSe$GEqyEae(Qel*V87!Q?04M8>o@sN!BFbSLxeSN8d?(67k(ci_jn8_Qt|p zrm(J&hpVgVz*`;c)%K_KDPr+f9)A=3q6b8C*+0H_dvGTzP8&NI-&ch{SW|H@^uKQA zD|hALs;VmZAJ8=RkIjd>arPAVMK~Dpl~rZ%KXx$o55J1I<35Ny{zc4x^ZC@x@_kCh zUSZt#KM`pqIH)LKyF$+`*p3agfaJDBsm zMO9DjCILSG4W>JBITug&e~2}()sjliL_!jFH@awBng1cGWfE%j#G$;P|>-!O(ChB#0KWFt>;A_=`g8$He z0Jl&p1~~HH>+gYEsRdG=`V$1HjoKvTqqbEW`rD}kg6mjyfZMA9^8Q}M9nUz`rM6FV z^nGB??{-wjBtD<(&!NAoN|5~I^%eBD1Z#V`o(0@XEf)TV`a|Gb1#A0d{VMS7sLZ ze5YW(`Q?4!A!><~?=SQhz&UDx_#dms0_Un%1mCUi1|Frh2_CP<1CLdyg74M$0^h4X z6nu}q2Y9l2R`57I4tT1{=KMtcUyHU3{WaCwsqUEuhBs1}0xu5jGiq$Uc+9cSP#PR zM)3W8tML6`eAGH&F`gm#P3ujA?-TsI^_s!A_jKfQB1RkkC!XkgzbJF0K zgn!EV)5Nc&@P9V{%}#zB6uisAf2`KzLl#T!@)KDRup(NE-O?}750bf47_-GR@Op@U`JbHjV^PR4h~?M*_N=jL~5 z#Hkzd_%^r!aKYHk{}agHGjM#3n8q0TYPf6RI4-QOEZ$}fxN#^CF3!Sl#w=e{Wcjym zFj4>dxSa%k+5b0?sff7MhkG54{Rd*s56(9(Tc4r5IRf_~{J6g__nhBhY2;Ts_~-B{ zz)#@shQO`hI>B+6KIG-tOpN;B81otX8?NxX)s6Y(7;}BzieW0hAExY|NAHIi@n19_nqK4%&qa?FM{*#BNzSg>*-=O0Un{9@dl!}A?81y_KD51wzV zC3qdi5}b3*<~aTbL{-9DOrQp{9Q?4kKOu=?gkLJERTNq{)dl)$&`+Z8q~|>RUquxK-)_c# zb?G;W?{w4Ot4|$;zuEc@;Wwh~!r#M}Y~noTlgy7Idzfc3^fjZuIDF*K;mBeLuQ?qP zyvW=~-HKimeGht`fP7o3F7fLYbvxwSQwiZ$v$`X^n`oNg8$5SHz7yRc_y==ePFJcX z`kR~Yb$4nj_|}LVq`wy>3a%c}1o$?}VgIejPBQla^`)`Qznbi65hua#PmeH;Ci}OD zbHHh|hcVJuF>*d?;y`*=!hhPc2Jy+HRM9^wVj|>+&~t*7Ie(f%yQRF;HunV&r<)}I z_8NP7J{m0e6vkdC%`{qYA=p#k`NehckAUndmJO2F} z%gS?>3C8S)+YZ++%iN6o=eEh!8UF3$&wnZ(IKMe>x1n6{yK(jM`|1<$t^$9*f%nLk zVsKxC?hxVZ_gjX!8Qd44zlwA)+l}#2Iej~(Ie0%HN)E8CO9&o@v&cT&PrOh3KMOk) zKB}N|gg+W(3-?Xv8w8I)*~5JkI#Kkm!d#D!D(h{i&8$BYclY>kpYc0U4t@{&$#EZr zZo@dOh5aVxYJ5~p*AhP4vhh)MeO|&}VfHW9(C=!;|3k2%HLtEV~7nQ~bR>|+Mw;J#)scICP3j!ezpFRq-9ej8j@ zI1cxVa`>tha>_aPH+kP};lX~)dvJrFT@8Nl^CkU}2I%DePZ#{|3pWIA9301k`IXVX z?1K1k-)JVn;&}481dhjV4>j4v4TnlRHj=(n;Q-{x~AdZXxb{kxR?vz}cDm*e5~ zJtquy^sNMaHRw0re8h1)dWq+*4)#AAj^#KF96#3&hnL#QIUB|DJjVDqARk`Dr-9E! zt&wMcBkk@xWciQqjbQq-Q0`m1eQAEq?zc3Ik>NbZbIupHzs%zk_czNuhCVa*ubFZ` zna5h(cMhcPbEbiETrOO{t}dp0|KSVBPv*0q!0_%uoW{esWh$_IF^~5;F#lmV*2R2& z=E?{9=X@MB4PSY=tN9#aPEa`)X_>N)#kKTKW6awD(B%-)O6Gk0%>dmqXl zrEqI99Lu{rcP~EkuJru%R43jXhU-{9aNmF6@6ja`-3!Mufxk0LI?r6%LS#(XwVb@* zy2yEQq^2Uidxqz^&L=v*`Ft|-cwc3pJ93L6b{w}a;D0H8SL^Tiaqq8Ty@emaIOPe< zJ3ueH`j9IN$8#HD_rE(2xIDRKm&?#U-DfniGG?veroqjITL8!9G+h6kHXvO8|997y z|84Ezf3^Mx+y6866K)~fv7g|4NAP*VZW?q*aDM1s^iR+oje9VfZ>C`!hR& zi=giXy-)DdkxPKr>eGUkL@ot>QU5J?Y2Lk9aMw=^mKlW%)0Ry|vf%SixULeF^@Xx}V^^QG0>6>9IW>d0(^-`mhEocv$o> z;9WXhaBg%i@CSOf;1TA2t50+r!Na46ga4V{aQnqGYONFh?-_e? z#jMg2zXMSRz%Oo15&!$6_5&waI|P3d^$l>cRY&9xMjZq$W1SQJw^82$m$y#d;)K^D zx(DK4!D=bEZFF1U%GNWIzvH9F16Q*Wh2J8&1#k`PR5!2PwXDs;?;PD3xVCkl z;11?KudA&{DL=iUdx77;dQWg#bQ*9&E4cn+$sPHj?G2^AEyd^kT>GDqrDHKtvmE=M zJ%a3iKJl;iKgXAP3H~o{|FdLbH!Ki{{m(?g{=~KDg^2x6=$jg3|Fe7IT*zO>{^tO! zvO_3s5*YP3_C5z_>{PuQe82tAc_r5( zyn@^R{2}=&%)W^I&mJ1HiDRJ8Z~wDY>1$BlE@S_50PGWmV*eB6wL_5o&vS|AQJ%#9 zC-Nho{m)!&PYksGsk9wz|Ff}oF5>@h+W$<${Z@hYKcPRL{m;SL&S(D<_LlP5|GWkE zm_o7tiSVvy{}buWXa5uB^@{dCp>Ip%JNRCS{m*P|4+^yZ3IA8L{|W#3?0=&C=Cl7f z8ux!*$^IwaS4j3h5nev~p9n9X{ZHVK?0-Vv743hbe&)0PSswP^0_}eShh+Z~`tsTT zME(Zb|9qw75!64w{m-WpwqgO)Z~wDw!c)M0`=4(m@GfMr|5-t!CXYq^6Z@a2@4@yz zV-gbJU+jOP{s-Ite4@nfXdlG>C+q`U70az@*C0H< z{m+K+9T8u#|B3YFv;T?u9+Le}r00tEKk@$FkNq6sU&j6?%KH`Ve-_jBf7<@%XNh~! z-u|2RKT%%t+5bfQcSZZ3HMJd*{ZHiQyu^19Ke7Lr7G(c38RrRt?0+6BRUGnS{}bP@ zN%)8UV4nTYcN6!3@3;T?RpNeNvHywio=#qk@+0;?@jmj|{{;Wx6CVy7)IyzQq1#6zpLZn}Si2*#AWQgYAD_OjP*Z`|W@BiK_|!V*fKX$o?nt^K8i| z)PJ%6iT;6eK1u9<=4cAG|9PzB8MH^2vHuDGA=&>#dmn87^Y7RQq)+UBrUu#nME~ob z?0=3d@d(;0vHywujxN?7`o#Wc`5^nB;I}NDgZ_x${^!(U2O%%^KNGb5ZQ@zHU$Os* z@{`a0C;b1Iasls4?0;rxJ0$y`@PDY-Z5S!~?SFoqatQkT_CFI7O5^>A{ZE|Fc_nr$ z>c8LqXXkjfiXiqsVJO%P%|5L#}QlR}$tnCEb|GYZoE##ly{^$0T4}tymKNotJpnoU!KO=(df1>}N z&;I9RZRfN9X$9H;Y=HLK*!%R`|D2ipFyea|`=96!=Cl6^oX`Fz%EJ}yf8u+1Mf;!d zACmn~$mg^F37pUVC+1-Kl^B5fw8gRiNo1#&$Ohi(*#AU)>_GdUleC@B{wMM?*#76= zC8E%N{G0Ya^X9Mo_CFnag70hB{-Hli~)3HD4xBvN`cNgO0xBt1z*st{4|6JyM z27JH$&u6?Vfc^GA9ebO8`=8~EeOJHzPsbjt-~Q(cWAD>%|8u2xHT3!Ie>(O({q{dg zq?APa;kW-;(%Ad-+y6{3_9OlFKOOs*V*eBA54Qj5*cb8J|8(qo`t5%@_C5XfKOK7` ze*2$}Jxjm+Psg5%-~Q+O#(s+5{--tYy}d{q{c{ z`>s}={m&XHwU9r4`=3=(ssj7%e^xd2Q~dTn9ebdD`=1AmeNVsrPshHe-~Oj#-_vjZ z)3NXAxBuzb@AcdNbnN%~?SDGzx~g`DY3wQ`=5nU3IqG? ze|n95Prv<7$G(r>{-|L1FC@5gWd$FWcBxBuhV_wn2RaqRo}?f*FT zef;)+9Q!_g`#+9-AHV${$G(r>{*SZ2!f*e_*?-};|Kr%p_1ph(?A!Y7|2Xzs{q}zx z`@??wKbyR7BE5e5KaPDLzx^M_zK`Gjk7M7*Z~w=!ALO_H_z+S|2X!5 z{Pus|H1>eR{txPNu>Bv$92;__NIYhAEUO@gHmK8<(ZFLml~HY8d2g+ARFL)!o1qDP@eq z_bDH6WojdQoO}bWL9b7A`1h;(fosxo34f$HUsa1f8R76psZrp=ULfns<(aq9zzt}c z$mgnD;6}7=q9Z?5O$Ba3*RVW(J)xe!|JTxX;ZHO6N}JJb*^c}OH3IzW>0nU@Kd2rA zZcZCS{}?p}xHWyk7{3;%1^B-``6PZb)C}MoDN@q=fO-Je zsu+2`2bT3!Q$q}{C;a8+{OK6ep75Qzf%nJqKBDmbf6l(B;Crfge^B`TKgUj;yO)#i z@8Wz3%q#c)t-xoOk}K%5VEw^3P>;(CyqoWGzxjK5xjV1}bzaVY;Bz-zS7$H|)aS}v z>e;{R?@I53d6x>yJ@4n9=X1~dx##uV^L}MuYlHvHc|S$Admhl7_rr(MJukRv3Hl3| zUv$sYx##`d^L_4lKlePJd*07I&xd0QrvKrd=X1~dx##)Jc|Y_AOX1tjf9`od_q?Hd z-p@ThXwLiL{GogP&z$!IcF*s*=l$ICfbMy}3RJ=9e+#W9CQkFtE1L6uJ#n53eF6U4 z@{IXD*sqxT5G-1~+`-RT5gzXEw0IWyddyEobco>o&3NV`|EA;qYCiwBUigC|Ct+5z zFr8rjMY8Ymybb@wXfyNsk^MmAGvF7evWzibyUTM9{F3x2<2$fFAtDz1QnXRf$kRkv^j5R(`>=(aNdURANy;mu^hXS{vT)`vE{SvL|OZE?a?L6roKL7Wf#P1>v!s8pLo`mO#s1w2WiM`13 z9_+{PBt!m2@`%1iZ~+1LXVx)Bd{&zMC!Odt>zhyZP}BeEOkarp?~J{hu9U*^ct0_k zYiT#?EAbg>?zibl?L~hJ-3$EQ^p5atPjiHS8~x(sFH+VD`FT6768Xh?3FQ0Gt(h~0tk{h$8(K>z=K|EKx>J%WRu*z3oC>pwz!gZ5++e~9ty z8NuB!R^yhY`EG~*jXD6aNIEL~*=D>KO{vWP2H#s<5(*1ZC&5S5F~}F8&sqK;;XbV+ z&=*T}MBi?;2mCnd`mv+GHoi6d<(y?i?{`Z;tVw%xT=3~A;Lt)^F zHu_b;cc?Vr7W56{6{NVF8W%iKH#^ZeT=_A|G>AA*fV_eF%>$y$291WIp@#UziCy+n+S(Ki){o($1Vh%r0 zzZ;(`(Li}O-j~wj%C*J!uQyy49OoV59Z}Br&&30aIJ|YBJf^M};n4My{bwxRs_g%L zrLzgmYdLapRUBHfcES8zNhk9vNq?Xo$}Z23>=)eJ^iMMBCdOM}KNoXR*uOy8!f%YS z&GRK=7;obGgO3mTjJFBD5&DA29hxKf8ua~mK4psFrhJzy>hyJtHc6F!_WD*%Rj%IXaeRXgP*(4T4QRI?}_1a_`8-lcf_#leHa)F1m@pka0c}hx>WA- zm3YpW{joitDDlVPm&NZx$>`m8bM6>Ah2IVFtR)P2D94kZ1v>W2IGDQ6IKD2ApYbjc*FQgJokO78Ji{w={V`>~OtX=f zTrb8Hc5qC4r))Amu>1w%K%V>ilO;|buq@}rHeA!_Il=eG@c8oqI)q`0=S{Nf!L~c^ z7hcL3<)yYMAJge2!F9~{V+O6+!hCIK<8DOkFQnH6e-B&Td_QiE!DRP@?RK03Cb4H^ zN0?c&StRy{>=qcCV0N6u{*c|$)Q>q-sWRGMgny38fGp0-JCk2X!=>m3$zzwY440F@ zJB%2+cNDog_?df0k^5{f;(rv*E!%-OP(JXt>z8RSo)1LK-!q9u&eu+vAa0=}PqXZ=`D7-;sR-*3)B zj>y7!ayU1gT#wz~eBY95%ZtmH`YlG=e%mqrG%;qrE4u@8 z^se19<}v1RoO`yKpK;i1V~peL`ep1s=Vz`BGFOhn=X_;9{F~G5{^s<$zrPRo9WQyp z^6qcWGgpRx^K%~SxZ$xL_c_PIy(5c%GmrD`TIgfSdYSIR=fuS`0(ePiv)%w^zwURP z>5H%Y>$6~)g5otdpe;x7FR1)K$<+(c_ z|FP&6p*gW<(OP_!HLd>9!4Xsh*hAHMe7+I$-=6;Hc16+v8L!XvybK&o6?r@!jr--S z?G}&!eKH<*?k6ikSIc-k2Yq!O|F_RF>-qMhdKGG399_@)u;2E1#rHGE(>ReIX*~#i zC8@RG4(MU<_`jFnS8%sBT0j~kxQ=RxWO(ttf_}v3WzF^!Qs{S1AI9rrJu?vBaW?^eqPd@U^$ephqfbaUD!;U$^zP%C;xa2&5fVEo@&NMAeZEx4Z= z4BVcMiu_yEj{6n4I6!I*WsV{rF77>HeYcdo&WQy{&Rd~kTKe-1D3 zw;LwYEaX)ncEb+VRSPRyei-+m@p{Kfk?+NZDKH^a(vWkGl5-M}C|PpOxXB_>GAO8^VnVX0fFcqMfTEy+N-%&RASfUrC?-^VtGa8L zEm!~Hd-s0#-S;^Bn%QfrI?hZ_Pj~gIV7-j(g&2?e2KN(=m33tu!@0+{I?VjrG4vNN zZ+AGgP7Rz)AEt5kJ*jjm;I!25Z6_b6#{s8Mo3|VuqsIVepe=hG9*Xs%82X1&yBz*d ze+Zn}t-m3E=3kG&{>QGj0k;J|WDFdqcD)Ul`QE{o=hoYR+nIL2dE9y%a0k-?IG1Y^EX)~l$2X#iX>ST7>x#|OV1wZhno>;IGb31%wA=sszWD&U(3e;qCT*2%Ym zFB5!ow120=%x4e2IVz6!<@hyqP2h@@@sg8o*V}w9v0XOI~vE+5Zms->8UO5B9ec!#8d}k+Z*^7}nR;3uga5G2DMUq&(S7HsB_- zT;$GQ?`^b6Ai)o|C6LlhRZz}M;OOO3A#qf+J%k`~(3%4-zf<}Yx0abj#>DMx~5dVH` z7gJ`bUm;Tn@+GuopNr4_24dI+bWv~_QwI1k z@}xd>bREQhnl4Csd2}A&6;xZUkHH`O7t?-uUUGtu9{!7I36BqOe_T?R&_3&^h{VsU z^Fsa{<(BqHFbRmif%Zy!oYW^F-$)hZ{;aKQ18<>KQa<)S6{BrbTCPVOQwR7JdSCRj zo9w`^QA@c#f2co@{|?F`{ZS9y1L^Ie_V2p#J%aV`7+6a7Nqs<J!yb#6L;5iu}Af5BV8-T<}G85%?TUl;?x}O~l|| zXN|U)1v2`yo4?R`~x)-{d_tf@Xw?qKlW!5 z!<^F=dH&hoLkvE+M@o7J^a0@CXr|zU`XKN%+VF}?KS3t|Yn55byG3sSPEdcy{lWg( zVmvc->hixshKg^@rS_8FU87lhqk{|FAy@ypI&g^UwYr@IF!{r2l(YzYCl}4V3o8 zsxFH>olXawU8R%qVyF$AL$%=fP7H)kt21ctoT`uDGxmDqQr9GY zicW!kZZ%5Uhy87Uk5wI$`oSFl>Qg`+6*>FA!23u&D)%Eybs;aN3e9x(fg9j^hX1k& zu1G5_&IpXDZ9hM3LHI9Gc7l$N%gPDt`Q5UY7?B$NvpYL)1SU{}(U?fWz^>8()Uwe>eUP$N#^>-%|Ye z-+lju<9|1P56Ay*yc>@H-FP<~|GV*ZIR1Cz$pwFUzPT5R|9)pYE{gFH>?fa!yb$4$ z$yofaFdoR4um>{(iS!<0*uxx1xCWd|iL8(Lt!ShSBq?NAj`^qWyk9Y_$v|77#rp4f z9|32g`HWw{{G7K7I13$TjPyVE&I4zo6PzCA>%NK%$1hkVCj$GJzl$3D%1ec%JP8Sz z5wjp|VSU8kYW+nNp{6*Cg#5MMGdL8bae|+-^OeP@kl?Je0`lTilQHVM%3BLug7PCh zj$bbFAaW{6ZAJeX>%XBC1^jVOM4o`WoShGP9C4mOV4DzLubPMO2*Qg9JYRGQN46We z`WJXP(ocu;eEa}`kI%~SdmK4Fr~4byPm30a$Gle0=QvN+`8)d*UMCA|QJ8zUi=^8g zzqu9I&vkCheIO+&^t`QqN*?loYfve{KITH$e(Cr1XzwK4518v9s%^`|b`b^f9mQqi zHKs23-5-I^jhFK;%aPZ>xx5@Few~)f$g<$b>w|1xYS+4uCLaUe+VSyty^r&?0lzu^ zpnhO7L&%5te4g_P(q()GWw|2dnJYSc{!P@4*DUxq&jT(5?t{Q_IpjcF1c7Z8xczFE zxAz}SO`M7|?bOb)4o^><4%|hx6#2BoX}~?zT#-AzzdowE;JXv=hJ3KfBzRKdB;a8x zoy4D#I0bmLDk*qY;w<2asvoxbs2;G4NSp&aUA=jWl*jUO%~12uj%YeM8aawqpQRSa z_e4ZT(0`RwBV>NY_0MJ0a+z;(@0;=pZY6B|%BC{ zTjdqZ{)}Vre^^$&=iK|SzM3uRJ+GgKys>&y>g&cAO;rZ@e$1k?K;B%vDc@`C9}@Fb zYNgD2Q?O(}M zLjAg{PEsDY!-Kr1+I`u{U(v4s_g04mzp7sa?yLImb@G_TKk$9k+~#myT^D$`I*R(> zHl*h8C&~CqqQlI`%D5%wds$vu)xi5@xT-BUmnv*=n>{YQg?b^<8>OCm+u^x-F7P<@ zhsYP`1;F>HLQCy6 z(VwH|054YAMczmE0e)1?6+BQ61b#}zM1PT91iV6}5qWRj8+eU+Nbn$d-T=FyDlNFL z?hCv@t-|wyE-z)3S&jDEsCEfnW7Yz{ppFZE#;gN=QC$`Mta%Q2lX_9`YO@CTCH21G zwdNV%&FX8x>&&yjFRSPfm)~<{1Mn8LbcgF-mz!0@^8oN3Wh8!g(;IlN8Z70T0sp@-dPjAa^hTR8!0)QfqCeOS0e(*%6Fkfe z2i~Wa3GQwB0Pj~7B>qTq7x4S4rR2ZFJPiDS>Mr- zRYLU9+Q46`{emZ&dw{=Ebwqy}_RGZRtZFHEI{4Kvzo@LeAL=v23uB3AQa(b#h=+7>yBZ7OVp1|L#or1fm9>AB>&eTqS z81{Q(zEX`&c6bu@8^`E7wNvmktdC*-Qk_G8$^L^{sn)<(R9#80qv{0wgX$!>lj;oo zqgo)ii|PvelUgabtLg^)vl=P5Gwi!D->JTp^4x{}<(ThOM)Hqg|9FgkRWXqd!hT-N zf2sw72dg2#zpJN3e=_z%V?I@Uanx(@cg1^fH$dJ4wl8`VL) zrgX5L;-|s-9rsKn-?Z-of3V#@AEjF?)_z~!xQv;?;f%rWv`#$_oQ@t7c?9cuynpR} z!5_hCHuz8I4)=Zr-*{%?{rSTg=Jxn3gAVeLP2&}6}7?0%(FZ~M|(YrwFTbK&tugJ7^}t~ zdF=XI>Tn#(GG42`hOta0j32hv#@Kqkli#>b9=~=S#QUow=fUUytB+hawozu^I6;2F zdOm*>upgn|Jo6J@D~h|eDBH6vMEgvjPZ{?ne}UzLznk_I;k%lA_P>SkGhJdFBYzT2 z2EK9YQUk&L@H}JvM5htlNA(3ZI)n6AZB#p8Pw$ZarI~60oS;jJyq)R@9MQjtytQfr z9M!W0H&Ts(6LkaWuO@;&Ax25Mr{H_Qzku}^Jwf#At46@7^;*GARWsmZ-Brpr5dJb_ z;O|@~cnJ6zFn_2Y5&g!hDR4TSQPLj`z7NbN>XL%TgAXD`>2-IE&iTpegMW-KVu^_R z`y*H@!+fKTVm!_GIGqH}s0#=_NvDA`>1l$`qW{7CqrQM`L9D-n*uPyCtU5XTDAq=? z9;7|b;WfD4G2FR_CBH-HuP{HU-;wyQ(d)ps=z}O9r|10J<#r`C-YW55!P+JJ|EncJV+`5P>9-9O*~tZlOY zKkFY5^?3_xrI1lWtS z|G&ULAU`kc|1a%Xk3j6;H`~!~0+C2OJ3;Y8vq6dI0T=x&SlGxv3 z#q0h7-=p_|D_!>wxX$`VtbE-+p!3&Q<+^`B=2v6?e}R9%d(juL|G&UL;576V?Ef$D z5BL@QYq0;nm2&@`$J#9W{|o#Ber@e}YF_sbc$&U~yq0_a!yjy5|F;jX5p<(|wuHV3 z%;%HaegFB#5?V&U*G5}do<#n~UV6x*w3y}Bpr2GCiQoT|1mB;S0-Ty!OZ*9u?osS$ zaP~au$?qS{pUC5b{G1*-urb!&F1^Es{Njl-AV6 zN5&}cu!N6Lp4_xr@GkEI$n#Nu#^^8SdK-ZY&?1p<^|k{SbM`}+pDdEDLOP!BJGck> ziv0SHKbPKOjP$Fes{wfhIwg2cy0?L=&?Uy`-#>6>q6p`Y_Ih32VqoPI*eCe;O)He=4yrHp8=iVaGVf1c5Y#8l6KUDr zZ;IfFX{M!t7ZR$+>G$B7-bCcr-C^XPJ55o@d(y2UcjJ-14nv-lCJW>P$*!N{{^v5cOX`GC$&PNLHxd17zn%aKBbg8jJETA(XV{4m%nFkE5C7-%m4Vlg%zyY7(&oke^eoBzhrcQ1AmVQzng8%xWgLg{ zZ6=xj@XMxYhw^MAng8(Tr91=u*GT3+{3#h%Lw^^^{D<$Q&xiZ(Evh8-FO<47ZooZu zE|$k|$8aA7wZtY0_Dq3ofw~jeX>^=@4G@YRmwlan*>~xVxr&K8vtB_nu`3Y(ZHqY zKEczx`+&<)U%|z__P`ZM?6rK)^1DMOVh=9AH4l&&J;UxL2}g;@@~ud0YVhiL-&JM?`8 z$nk#v4EBszF{M?kkNg_w+o6A$CQAGoSiixl7v+%n1p8%p6Q<@YNBn%cEaWHXh~PW* z0N_*9t}^7{Z?Eaq#`Qcyd2Z$OvECg?!u@}q?q}Se{K3{g+67u)1-Lxgh zsi+V65cnrbz8&M$>@`p1g}f|8p@xCmRpSRVbW_D zpXH_2oW9bSf8qAdPrW3+6}Y!}K5(Ak0cIiYkHYl)KwO_nfbK zqddiFoampXk8!`0q$!gA3Eds>OVbjOKWwf5m!+j#9>o79F%8O7p4PA&{*$tJrBUCC z^mr~{%>U)FdmV(D#{ZS$@qbab1M=WB zgX6!F_P<(&c)d-i=U#-<2v-qU_E+crQU1Z$2JHo#4Yt~7roOLl+Yj~~Y~j&dJyzD? zdlT(-^pBbHr@`mgGCn6_MpIPqt$NdmI|2ay#`{R&(|10{#)z80{ zfUin2^l2H$>tTLV<-z?LC6DC;z}Mle0ZybLrCj`a*o(pQ0iTz1cuw?9tgi!?!b^3ZF7YezdF{k-&x z;Jwi-sDD8kC*?1Z&=37j36ksOKa#KmxJ+QL;qOY!hv%^Z?G*hz3BN*Kjao^1y(4pw zUriGG4ZlFrZP2ezV!z=JNLUR0Mr7?b&>r7=#eiFowco(}!+P&B+NTwX{f3_{u_4OW zfy92pZ<06$xEopf4P1{2i93M%(qPGdUgQOYdo3cfAU z6Y^2?f#5FDS&)yRThRU}h(Eyc4~?bwN;;eleKYejoEMyeSwx;cXD$cUPmi%1&z}#I z_=B+C#Qy#Y<93ydC4CuSzkA_mSTxq|j zEze|noiW~jBkcG76e=(2*T#Aq&#yO<^mx9Pzvt%*cKp24=!rk!>9p!P9tQn;X`Nul z-#df;U|b6Cf3GO2Ig>X1Nj{6VU&nY+V}5-T%Hv^utBbl5cn;NLjQ+Jf*8g~Z{kULW zU*!3Np@MmRkNHQqAL5WYzdL@5^ta;GoD*N?eEwIoe;_Z0d+`FUUl6A&+KzwE!trs0 zjR?CC4j~*zIFG>T{D5Nvq?w4kS)a#|fvr@0f5&4_{?=g~&Wmv~96KZQMi`F3GA>_l z^r4#sa~kn+Kf-y&fzBD=??pFAH$IQ<7?W^XL7iDAC|98WSLKM;i!W2al@aje{C|~k z`oZ_>J!to!zVZ3S|K>8+fF6&fIbLyG%g=HB_!=@l6Sq5`V>$ok@HC$4RyeohhQQ~8 zbGvcf+8|s)7>|G(Gv(WaOWeQcN`)Q1nD8xdW8H{x21>b*@C|Si-A?4+BwPe;s_!Z8 z^qWPRqZGF}+=EhXjZ_70rk9AkYNQ%)bBAkEO7ln?;1+tRr1yQo6{L5&-YWQqgdc%h z>NSF|B>Vu}N^dTT{187!Bq!px)}uv!IpI6V+vpDqx$>M&I0M{Pe4F>| z^-UkifcRKrmH1yJoQ1r-PA~Xu!a3j$dNapwNGYchz5wp1FG>8Ikz9!1NtY|)($m-= zhdW!JV11;2CgDrychQ9kiYfxGIRBL5=cH1M5zvdAwbTn6r@?S5OtKcDb5aCa^H zZBtGroC5Bl?S5OxYeaaw+*7~F?ThxV9;pG`OTS#u<$o~Y5cGTNJ(B)U2|okFF&dW_ z`oAXp2HaQQEA`0|$%^>>^meIFsz_?!{(4y<=&z@g6A34wKS0-DIqrvR34Z_&)J;Vn z2>OF`8^NHf10Jl$_-=o1!2fT*2fzmqj0f`Mb?@)dsg_|rR#S@LpA&`vC(sXw&*RHQ z3GX1kC>>>t@n^$?>A*>}L2wPafM!okM&ci`?U$D3+4$^l93N(Q2Yq0%_J8o|B7O$j z{{(#lAK%RB`lNHv<31%gz9N`)7G!gLGOOdxmA3ZC6Lb-|-^)bGqW*X52c&(o+3&T9 zdOXI{e1BAkREGQ>y-MV_L~;O6(nSlo>-S^APblAH{j;Q3D^eTsDc5nsNF(5>I+53F z(^E>LNK@cx4kP{AkvhQBbvKD$IZ_4q-s`w&X^U-=_&jkl#$*l`)>LBMC== zXX&cNfEA_qk-X5Ktrv^_=LshupQEqH{dLujXXff><@zT@QbB*7-X!@~i*PSBU!M}( zAkq+c!F60SQVaM#eTMTx`HM$N0N<}03CVuS1^59y ztB{L-JmGVc??GKr+BZWaBjgY1H3i*xVz-)utNW1dEb>f|%#bhEw+YS|$ppMa+x2}6 zUUEfp13#?o`aa6{b;1Rt|A?0L{gkv3wyJ(q+x30O(?pmrd8xMR`zUX6Bn|Lm+OF?I zUNlk+_;GF5_kjyXiU2>MWqm)TNTew6liIHDL+(WqfS=NKeLo|mL?Th(W!kRqL!JENCn{Kx{zEC6XE%R722-vLq5#-)eTCLDl#jov8jH`3bYuhE;Pqdgnq%hURkSfj_Mxb}Z4vJCOpUbp|jc0l64H{Ny6 z`!2()ScblQ$KkV>d*J825o3IBHlW79iEjM~@BXYRE5dP)Su;5vELw}GxY1x4-)^$$Tp>QgRS7xlS|*4p@ZUtqr(f6p{!Iqrx0 z(H4-8qu+5o5z%*i@Z%{D?gtO$%St}3@&vj9ITUdxX0f;&;(MO<%S6lIG`?pT7u0^~ zXldYy_8k+<$8rz32I=v8hwYEn_i(>i&a!Qg?L+t!p)ktHdVws6_f5+`$K!cm)?r;v zZ#d!x`NXI9SLcHCbApVQ%A zJG)B0e>w0o@mFiFd_J(h4D@b12KS*&cPmDi2>cz%`7K447VMDq5tUF z3-~`A-$%&*;rKp6{*UUWI_#@M{*MB>0QOIW{2z|rB;@}nX-Yyr--;%FC*mt$f0vUKji;#{1zeqhi~~!LjDiOe-QG2oUnW{A^(TtQwjM$ zikspnU&#Ma+w!r5{2z|*CglHc{462=M|a&Fg9@Y;7hx{Lok0<2+aC{db|A*t3 z3Hd)9KSjv@;rKK{{tw5867qi(w0tZf|A*u22>Cz0R$s%uG35Vnd>|qJhui-Z@_(FD z=b#_*e>lF7kpJVXK8yN={2z{wB;@~ad?X?NhvWMQ`9F&5;)oyee>nb@kpIK+#f1DH zj^88X|8V?HA^(Tt0}1&*9N$mK|M9YZ8Tp0$9~bpS;OKS!k6b1fu7Ak?kzS{VJmmjy zd>`1{w1>wpn3vJxArJXK-2StW|HJL)3i&@8>&DOz`9B;VQ^^0}_+&!G&AkRd+zJ(co(GUCw1^$5oe?Znh5cC88 zKY=|&GS)KrZz0Ejn%Cp7aD~5*p0U^8&u72?G;J2V5Ds5?!sg_{6+M2Y%lqv$ahC>$9UJL4kE7!+d=-GIwSIO zcKx9Mb(8$A@w0>PtLlQkqMx8&jGho&N|l4W6m639R>78y?J1@T9%$|3D^V)Z-$^GR zuS&Vrx$=*WW=_Q0l-f!Dow47D*Iyb){POtrVtdMA5AThL{ap~>f{arkJufZnP4TVA-%I@deG}LGKkLZv>RuQZc=v^A7JC9;Zm1W_ zIIj;;h9JM-T!4dPYt-xSe%~D@I%WuHNiggN2Sj~?_x+9I zfhjy5c#!8KecN7kd;tAm{AB$D0_UZ?R{jZId+IybzpM1 zCA1s*$@GZe_rU#!XbiOv$gyybuOX}I8S zmLIkNZ4`VMV|&bcP_m>y(E86UK?MZQQS*>q8LA=p0qbwL0u2?sN$rBX3e6V0SA7hO z_qE_<>N()r)C~FI#fzLu;Q!k6GUOiW{~7oQdA>7vpD-u=1;~Q;55F_{-2d%(H|qS~ z`PVs(8&A9a8(8rb9IOX)#C!tpxA_+Qti1kr7?%-0u)lW$4%i>Wa-aM+)jr?|yKQrzDz8-r&rK4pczf=5sFXZ$wUwqzNPU2bH z0gNBjz5*X6uOCbjc{zOyRhkr@Tt@HS}2d|g(!+sV#n{02CrU-D&U_Yi$3km}lCciJ{vf2LVL6#Q> zKN04ddHnocG2l(u-(vl#BbEdAz}_Gp?~6Tx-_w4NlqYMC@Eq*fVf)MWRu-fDd#t@zMY8q?D9>Kn2YDrj zdx9SddtG?F#o8mFefv>=;3{P85zt-(u-Ay!U#vX>_PytC6)wC`Nv7 z?C<3M%Gx8qzP6LKSF1tR9$`EAUBDg2-y7B*0p*!a_X5}AOF-TW<7VfM2_V^>x28}4y+Zi zzd37RbF4R_6VpyxMd)3OV%C%`Mdqm?Wl{~zivPD9aJ9AFQ>N;`zLw*sTALz z(0|D8_wPVYvpz8I=j8RMDCb|0{HCaj<*%3PkDb@Ro#_j{ez^XFX$Wu^O62En5&67d z6ZRkUJExE9xq?;#-%05hqka!y?vvNE@(6yA9s=%8A8~pk;g1itd9eSWoLpYqFR#!J zVECiw^nrPQFRy>)VvO;_DsUUa{)4PN0@7biYk>QZ*dzG7-<0kDtUUtyqvv2d&+BEw zIDgzlfQOQ`PiW1w&@TcHa~Rj-EqWVxI9dAyl<#(HpFD!Pa{Konza`cd z*&fl_C&1o(G4{ss`kl2;!2Q(DuHS+|gWC_+Z-}*L9!1tZ0r!X7zdo9*eZr&U^L}Ms z?>i;!$@{6X%hF-=zr4Sf*Z;&m!GD^T1CJ+bp8)w1><8xcKWm?W{&*J62ELp7PJ6#h z#ol~g@3Zy^&~J;iPu~A;?GrTly#JQ%6|Fr2`q!D*D@Zh%tUUtiGXu7Rn4Ncg186_q z56t$7VvivF1JfMe0OIq0YS@1`z5%r76zH;jqP0iB{W%$F@%}_>kAU^fWtb~x`$Vxv z5dMK#j&C4J{!_FJ^4X4W0O>h?fjN$E0PQ;tZNc`5VvpdDMO(3b;%e>oi$93_8+=-r zB@OUm;5uMca+vRb@N4NQjnNwok1|aZ)31$DVd@Vf#+(pk(4o|`T4E{^~gvg(vb-;J(<&ysU z*ee4*GCf-GJK!D%ADQkUcrW(WfG=O)f%c8!PU($*jEC>Q^MVhPrDnMSUzrwvc`4mY zci>+73c3;2U!Xo$jGIXOj_6AnXH9bH{f=Q8<5GgP%3$$EJjM#~9Y5><-GTc%{VG279(&F-&58$M-r!5B$#IH}o60_eSW~FFCwZ?*tyD7hiUGhu#4^ zPUjH(I`+54XrlfC-7KefR38PtM@OW5Khm!#|2=x|5hqXOC4(kprq1!H!-r*3@Dd<@M5h(`Wpf$w$Mj-J?+^0_@Kd^! z$iFw=125A%MUF;7{FS=C;NQ$|kgwL$ME@uA6YyGHQslpyUxC-@M@0U!`5E{*UGbHMOf#!CbFK0Qk0KbRjN->+X4{EPVo_>k@_ z`TuTy2mVx#6@1NH13spE9(MU3GzWoC=(&OqnM1%|=ypw=e6!gMd|Hneyv1w*{z`Wf z{IYo&_-lRFX{SHZ8;SB=(#4KDT+yotd|77|d2jfW2fvdZb;ikudBcFO=qg`2%=`pc zuhR8Ca`;p8DboK@|8~mZ&R%E8f6wFNe&f#7!7 z?}YUyv*o0Vf4g@(aI$${a7(Wxa9XoWa0{;maEe(g`PG7ddGL>z94B1-x?Wx2Y-ZFk zhf8^-fNwE%r2dt>O29cyC#la7?8gH?h^Zp&(Z}lpxo@U_;o^6PzbEj2n0Zp4;oflI z0;ZL;5Az*>-^08m<*AMRa^UMQ&r1C|d7XeunUjJ$dL4nwn%#mscpZQ%m?Xh%yf(m< z&B>2l{uj&zl&_k3TkzNBYv7vZM`@4NUTf&rF+WQAMtP%v8<;a9Z{@WDZeprQeY$#G zft#AAMSp}h0=T(3F6~pzs|MWBJSO@*ydJ<^&1@-Od+Y~A|7UVZdCr(KC{J(GQt(&i zE8xE7O=;hg<|J@Gb6D^xa|*b>DJ}Y6nlFI|ni+!6nRCFyOfSJ_%~{})Cbi(x<}~nV zb57Fx!h8Wd&fG57yQEhV<-6Ogl>4Ef*ARHJ87%eb=5+&}W&-|C=Px1T|8)LpLjF(Z zpQikE{!hnWS>ZbWr}I}6@_#yiE+PM?;|mS>KkHimCn5i*;{y%(Kb=33kpFYFUXA`Z ztJLQ&;QxXv_kqJ|L3>xy%Ep zXUPBQ_(MbfPsbk`@_#!1(2)Q0S=gV(^M5`Ke{u2rpN`)%sx>Ay#NqtPGCFm0v3sOQxKo@>_1`(Oa}%fmmAnI*Wt z*B|&HlS}%~A>I(+rRJ*iFTK28z)zSbq(8mYyA^nuc|&kjuPX3z(@owN)xGM#tIR^_ zubX?#f!CNjB>kb@P~hiHOyteHX22Uwdr7adR~h&v^MjOcus0ZZiKa1<}9FyAAjQvs2O^=nVuuVA6@aiPr@9koi>P zgJ3TU{!i0Fa6j0`g74D|koF$ujRQVnK9~0D>GcFYW-oxm5&Re4{0W4^)t^{shP-VbHGGLT;}=LMJZ$^rjk z9uZs`_PXGgH2VdY^~wVOVbV!^miNj7d*1s^-1~Wl*@5(vyb3b@+GTbDCwut??=(As z(|Y?4I{i1y8^9@Ez@NU`>;}%{Sw3;Xy1020IEyz?-fzdvao}6Lm4ZJvp9AOgdLDA= zy=~qG&f}eu@n~i*Gs>6G%l?^@XY;ZF7w`^Am#8&AnZMGk6(*TYB3?KcANmxQ&-AIIEWxxSdx-aCR>{aC`5X;6h#@ z;7;CQ8LxkAKF0Ov=D`J({hs>7d;;9ddqM7(O=c5tA1~)^PX3B{1-PF#UGA5yW-IU@ zZ-U$}ubNkZhkJWOzRhd{j(Mde{%htn;IZCSk#9HKf$#RF%JVkCn}G67^`0)E;nA^IPf4}e#C!$ki@%jdh=Ya{i2 z9ef%wdd8a}<=JEQ06*vbCV0Qu54^#9T<~7A7x+c*6T$D9_kcHh^O9ZtCwddnK3lwF z(*M=*>HxpurIYf!Z{COgo8B1df9iYnA%DwzL*yTsk09UUS%0H=epl+1ct5}A&Ai~! ze_B5c{DEivi$eaSeiHbQ*Y={5m)50$Kk)_&E~m=@AMqx2bn-H~4De^3KAs9grKr-= z(ke}nS9)81l&3VxQU;-r(nstBPYTgmMT?5gH*hMz{^33Bs)i z6%gto)JCX-P!gdtLRN&<2zMZ~M`(l47NH$NbA+-86%jfiG(gCP&_!u|CyteI^l_}B zg7xiSzn}Q$^s7)?TqTd@Z9^krJ~yY`zZ0b=1-AfSJKL|lBKWwuYS>;){1y7$y-5+a zKl8TR>*p87_Xn@96=i(_AFJil^{I#8YkV0fAB~mt5;0!p^|8xao&Fd#8_|l8^{0mN zq(xf1o^?R<75Y z_UAX+k#jj4+~V@$bkD`5abq2VeE1ljM^NUis0;JDu}=}+ClTo1C`ZHj-`V@69*I9X ze`n-l+%FC3&7JOgmoYtUd$z}V3Z^76r<6z}rdq`ei-0B?(_Y))NOI|5mhghr1u{q#nSnN%;Ex zs@Utr>s!Lt@7J*V)!LHq_4}2vR>}LR5+(j^;BrJOlJNDz9ws+%dlJ5WzYs4p!iJ;R zt1iC`mLIz#34g!e1h$L3zGeCQeez4f){@t^EPwwF@=Jh=hS#?&e?R;=7q|8oU2!A3 z^z!4`;`J>}1@PdNKq!pR3jIPJ99!Vn630>qwKIBiobwzKX1mnRq#$pFGCt)=PBxbJ~3G^YLxu-REVu*CNO>o>y+& zw@#0rD}FXP9{=XD*k|o)vU@x@F7MUgBZqtCHy^L!{^sMTm$0K3AzmKTDLBT*V?92< z5#h zo3d^Y{#oC~@p$h_uy2L&%LiOpdB0U6%8?m?(|Zs{ZZq~R#K(Z!BFK~FLB4$b-q}ZV z1cA@}qdt_|CcX@;+vPr&M<@K|cB_cA<8?SqE-PPm-pf<}d)J@VN4p1{>Rbla3$9&o zE&th(_ZS|3!o_9X;GT?+mk0M>afG0(LBGpoYBT_0KUO&r;_(B(Tpmt`?}2z(&l_|( zZlKG@L-oKq_Kj-`E)U-a@$&ex1$*pR&LLaJc78~MrEMGnDei{$+aoB^U4>UUZ8ssGXBlaEcX$?`9~x^ z*K--#m(MTh1|~bKGx2XOb6-g-XbV0cAA&Lmd$)pqq0u>~_g5VET;AY%aa!^3_IS)X z!JaWb|Icus^LIy1i}(2jdEEFe=W=mbzR2#zCEfS9whhkp#&wL>Vf@c{KmRIDd>TAX z`FHS*>BaZo@#);C_s=kwqiUi5+K?9S|NrVd{@wKXIf@T+la=j<&oe{jE@|+th~k@%?PDHz*4qIjsQmZw{O$$LS>P@f?ov>G1XEb^E`1#`zr<+#fgg5&XuN8;`#GMd))}4#Bz4|=a++L@-pH>zF!Q($ z!SQZ{IS3CUEI@s>BCNr0PG=N;bDiSL&*hzp^Q`+A!gB~5hue|UPS+aO5rN}#yx`ge z?ay_72=i1yy@R^ki#qa{jN=98_+1rTpNWUvJ^mz)YY|wFWh?N(I{=>-{F_EW9&^WG?c6aKhXpuDH^5v*j>qY;@5rDHi{X>4 z;nNt$Nu79X82sijXz-iU3x0E6%@&1eFkZVNtSjqrUYsX?<0OCSFt;10&v~<)1D9`0 zT-n}5I^Us;e;}kr-LoR(M<|U@4WSW28w8H~>KEX{L^zDVZ8Q(}_Y#C|2tirrdrtP* zZSKf=92$J=j*D@83gJ0~ZE}w9s|oV^SKNc~_gsKEjXuXvAABe9Z*JFZxHj(~Ft+Vq z&Hc7*kKbHozJ>!4;;#YUfBfFfi+17rkM)+~9G~ZU1ou%qu7WmeEbYd5F}Gb%j;$z5 z@H;qiyK=g$%jftWK zjcfL=TvOX_NQdhhl$VbI4vxY7Z1tsWgK`A(e}Vmfnm641OFHt2?fo+g&S&Qf4CNDC zhz)}=Ggf6V|F5xsHXU#RWf7bVu20?%5PTPMxj1m!{JIOGn}0W3;ARW_x3@rXybt)f z%9nbGpelK3=jd=kC)(_4_ktX|Hj@OHqb6SCJ z(8u$+*A8MPG>X}Fj6u4fkK}U!4&Mq$6zoEM*G`QApDL2d5FMy&TL-cNkw zckswV?l;%v^3m`&%lTZ5G5_&gAiKEiKg#%AX|zS46C8tgRe=9@k36;s(un`fV~61U zjYodRb9?lti|dR~D4nA3G2Y{Ehu~aBX&at@~r?K#e39M>Xj6MP@8&GbH)`@oUg zn{^LE_60%^hmX}UhG>ky@=3$7=JPwV17MqvG*9X6nz1=727oNw@( z)8qNapxit^82tWJ+VHVtm+ob}&wocqlIQC~JTEPfPtf-F;y348XN60H#|80a=DC#k zIh}umn`FavL3u|Zw7=+{hfz54HzE5*4E+C0PI)4Q{VCKfj`uhAFF1dI^PRsz>^~TR zy&L>hYWWEB5%`VUBZd2%zd?^={o#J+Z?Ht*A911cH%Ng$!bQ&CAn-c)f?$71y-K+8 z!be!U#7r(t6x`OP{}9>ro??XEKDa>GW3#&e^rPg183TARS$ptQ;ID)IJ4Uc%?ZJDn z|I4Mo4^x4HZv1i!*5<&MNK1XRb4hm{c-}S*!Z*^s+{WjS{xt-?wtNr#m5$XzI(!TQ z>y<^QCh5h;V-Cx{Xx-qu`G3;!4V3*~DQ_)Yw?HqYQ20AI_dor}yP3~RTQH|4*JlXo z9P|}I{TLUAyfQ*y#2jpY3OOe>$@&vwRTzL-S7J ztqBefh5u&E=F@z}NPh_Ybu+)`alwPFf0t}@g3}v}_Wj7%yuVqW?P+*FZDCFy znD+zl{@5*&KijvkJwQ{WhsQak0_^$Gs?<6e`Y6vS{Nw$ty99qhUjUb)ajfrCN<-Ms z^M2Obr(taw`j6=k&`PDLi{OLU|G~JBq|g4oc|Uwj!R!y4?F}AdeWW}C_G^qwFh+sT zsF{dgmR_Ff(w|`WizyqoVZeGKDj zBA=rlvFRJZv(-}MT9(>M`6|NRk@w%uW;yCt-}3*Iqw%62F*Oa#FG_jRsQidujvTZid;*<4h{OFsfcxU! zpzU<`WX`^XT+MP7U|Lgt# z5q!Jz-_ZJK{|n6IjY{CJP-7Q=ZFDW-zf096|NA2MA;NxoCky20hbBiR10SN@U7Ws- zYUqFD{39Wqospf8e@x>f{sWN*fR6_LlIRu7H}#qGmjwM+Bdo|K<3%M{kGxD%B9>IXO zH@b{|m*vf(&49%p6L7CcFO*j);YXkzksiQWjp*$3i$se+->A_jz zWfr_Rx)?Z<@&rE=eF!*<8Y}hd6zu|>Oa0!(rRPO4YNLGWpkNa<2EXvf#bQ?K3xVE}pc~Dy`K2*T}Dsmr+LYYaVTm^vbKuf?HVr-->Eo zWf%XA$Q#hFq^e5%lxPa{E33MkKhj?xSr2(bbwKntM>YdDR!gM3+oRi|-$a?bPXE;Z zrT%~Z+4DcGk*&Y~5cYfWeBd1ofTwEs|M?uv=uu6^nE$J)9s*8q{lj2_Wsk@->jd9JRS9u^e(8(z$tV9{ST<^V4pP)S1mog z!MK(7OTpHOdoJoW2dD(k7BBItb=0R6Ed=KGbt%}(GJXvCdC2b;YadzqhW@)Wjc2*iu%AT7i}4K8 zoOs|5?}+`oJbswM=|NHmJF^+D;{5QvS3y?jy>umgp_O1@u0_xuUs%3+kexpEsHpxRCxui=gPdI5CjH^2XHe*fb(xcU9hV}}1fzW>YpAL9RK1nlUr za_`p#Uta2xgP^3lJz$ZJ-1&znLdPlE%!&MbSlWxQopxd{Be35 za0<0~%i%G43~&b8vd7_}dMI!vDz(dD#}A*GYOi+q4s!>}mz6dNZfn{CXQvCRoV-28 z*D;KlUl(~h(+)TfP@{-d}Ytll$78Tj*a5|F?xDNFbd1{jyxB;yfoW`U9 zZbUnzJkB3N6Iw3v!}>7FcN=XIc~+AZ`pu~o%Q3&1Y?6U*rzfR7eo?=GZ=f~J-|X^t zd=YJ_3f9}Wz9+1|hIX`Xlf&=p_mO^k8X@|Z^=06WH2zH|->5eNcc!(1H|Pz(U1_@1 z-}wXRLD{5z9RGb!+9-0z2hp1feDBixN`Hm;eJNS4kMqwkkTT2tc8|UX^1<{Y*4DVZ z6?6sQ;k0_A!;MTM)ORGMdBb7n9|JpdMPAqPUyLCwxVH5-F_vmcd7OWValw8%a{el& z(le4@FpLJe;1+uk4x$j?w`>Ahw~p1`u|8U3CKV6|8Y{EMEarskJ`F6aOnS| zged|2(EmprQwKQo|B>Bf2M+yzIDZYH|BoKJ2ht1ue>gsn(Eo??XA=7V$glH5KlJ}m zNml|6{eN7-dNm{`w0DiIDa0Y z{|`*hBK^?+$9Z)g?Hl_4aQ;L>{~zb{Ip~M}Kb-%T(Eo??R}%XFD5*pLJ{~)3N565Q{`v2IXw;+D#|HJuL!A!Nmug5!Op?0!}B4^4Cv;L!hv z^WPEr|G?B5g8PCCk^j01e%&CE@SFe#u&prYGU=@^7{KDKpdfJ8*q|CV#G)k8UAJC;M~-kaT53$?fR2X3q`(AJpg$jsxNqwngU#eb~JPG@3s7oW$3ctxv*_uKG`I} zBfwRORbP4!wkwDTe%V35)v0cCho7{3zV+#{$cI>d)CSa(<6}M(p0Ar9P zRX*TFbg8wApHt-qevn=lc?netcro28xQHqS{0K$bI{gZ&67Xa6j^Jjh1@Pl^O>kRv z2k?`$UT|a86nGgOXN>FB((VsmPLGPbzV%PJf-FD7cjV{A+$~nuDStbcUkB^&do^_t z++FoVdTXhPVCNrv9gP>h-A zeEj#glqVxUYv`2v2u_Q!H)evV8Zg`YrndGt2{cXGtG23(^b%>f;Of>Nd}o;nP;MdUC^LqJmF8@*H)9(dbObP#w z-wxlxuo_YorN6DBs-itgE8+9;V`?;TS+z~--v?s{%5jMu3;yH zo(L@eyYpLc|7WU=J(=jcST7z2c9|1I#_}6&FwY~e?-5oZo%IMDpUYYaeOFV2&Ikh$ z#vn{ZU>WZty^4?)@$w^Zx_p1~k?*@;k0;}7&?|*d9ieJPXJ`I*N7jD^c`$#-F4 zN+$z9OgT=t{ymFkt;b0CkNvmQ9`uJ#knkV-U#hdfPm%B+!@mIc|4){oN$|$Np#f zIPhLNbJFG4TDJw>N5X&XPuDYm_fx?C>-@il{J%e|pE3Us^8aqr+c19+^8Y$M-;n?J zQ~fFAA^-1>;LD1EUo882n?F@CRWRQW^8Y%%-;n>ezNrs+$p2f|6b26Yf7j?WNI&HN zb$q|Iuk-&p|EnSYZyu8e@k9RK=V4zI&;OgGlYm41-z+){aLE7LNH+ow`G4!_dcYz7 zZv)M~4MP6kM`2%t`Ds-PuW{U1l#Kfk^U>-F!I^X>;E?~<@h6A;zs_H5$p7p3enbA> zSM{riAM*dkaKFU!|2lr+;p!-+sPJk4lXYv1;)8l zVT%L)U&p5#^8e1&bCF-j|GPjh01o+o9e;1g|Lgd7L;hdKCmizsj?g0zKji=I4?a1} zH>-6rzvlRcL;hdK*BkQxIzHc!|926dPs|^yG<#k9JHFtM|96lc1bN8+>-dU8{$I!6 z8}k1;{@#%P*YWp;{J+nd=g__(|F7c<4*7o_UvS9(>-d60{@>@!2E^Z@mhRy1X-Zjc z`G>bE;S)=lYNkOR^8emzW&nr$zm6X`UX zD9ay){KuK`z&n-Y4+9<#`!~#IE6X1SJl2c@enSa=Sc>Blep5aBsw@8>*z?C|x4Q6} z!;>vP@ms32)b9cFAmneWe1aF52Y~k|Bk{YN-oSg+;MZOJ8D=K%JF2^+H`9C)8vCb&23C!L!V4;3MjYV8_>dR9%qthGTyQ_%PMV5ta`xWrNuWd`xW?ywUQ7 z9#=J`eh--?kbkb)Ncl#Y(ZDCvEJ=T%Sp2f4tx$ zR%1nffw>R(j4C1eXl>vx)qcSf%{{?gqY~UKD({nF#!ix&kvy_LtIA^+A7jQ5_N71M_p>KUO;hcT+upFR7iW zo&GR20{F5T4K5pwKS@mn{!Z-_JPqsPSiex`&|k8=73K@UpRDRidL1zz2>%eOli*IO zGw_dUf#5ExEAUThrQoir8}QF+q~Ok~3-B-MTPe?7Dh7O28Ofi&=ipC5#Y8?x4F>*A zEf73d4FUdLJuUi^;m;BNCe#5bZwu85_z(55=#Nmy0TX=11ou__fR%0_xF6;xW2AK& z!F@1)34awjgOs<8Y6tA;9g;rJw_<%omlSzB)e$(Ne-n9Y_@{)wbv;{fBh?rPOaApZmOCAC+n_KzJY2Ga2mZ%@DMc&IIVs}^m)EF zM(K1$Nq@8&51gV)3LdW}0;kvA@%HBTVITZsd=X1Te7%oguL0~0bQIGLjE`fjEJhi1 z0l_CR|AF-$Jx%agIuD##U%<8(*584>7T~ki-)e_>zarLyw1;U8ma~5_`0LPzCBH*- z1US2XN8-PRu^;%a^+A-6_3r}0dXauy@G#8vW4%a!g2e)s&%pW(>>2b{iT?`LF0o#u zYYAq5TCi`>O~6yc`p;sl3V$E^sK{TZ9l&{YXGw1oO$N@VGYaPQ3#>QkBNBf-=1X7? zp@)lnGS&)U51|_g=JgQx2hmw2eV%{8dX(NJ<>&R580=AZOZ|EN2z=bSzTmeomc@FN zE+Kd~_O8NyLjNxLZ@}0(MkVyy+SO+Ryj>xX|5eL>{xk1a;!^ff8(Xc`AxUQd+#*xy$SRshdQeD)^?dksBL%KIL6 zv|@a$f0FCH4)a6sZ=zq3@;?uDDvXygN^$wKzd($a_3M&9`yYdShh8Ok8rEJgUe-h9 ze)|e@aTqV_m4eS>Z5HEY{fgkPtvydo-9qqb?0td#2fS*y{BHXHy6OMxrvI=1_xyha z>who@z*`SS3S{|+Ubfn{JS+R~LV?Elit zPs8i?&E0+je@)^qiM$_YiIro&PMX$`XQ9**f1&ppK6|nU`w{($QMN?B#qAedkM-76 zOJFsYle)9M*8b*%_mE$1w|`HQUt0IW{002&c7!}Z%lt|KlKpbNN=n3RQ$Z>u`Mu{2 zLHr_gtONA1e<+n*uP#PSSYBTH3lex2XbC#Y>7jlxZ#K$Tnq)tlpCP#bW}YgL-OrW= z`;}6q0__uwCq9MtsY9~g%zrZJ z8I-p!4VU;^tiSLEl$+Z#5&nszg`wY&@~|BB-vxeU%r?@8j1~D+;co@I3TdN_5C6fM z_Y=3E5|UmSj2D@|`UkFmvi4i!{m6XPE&2M)1V2OaPSmFzm15ja`y-QA0C%SJj0b7I zQZnym?M{`YJ;x?YM|<_6ZY*y>{=wuzxW4`9D$AqVpAvll^&LQV{|sNRq_U{rK(hO1 z2EadN(u2T*$nKw62!EVObAShv-9PgN`CF3G;rb6D*+1i_Ps#}SP_p}H4#8h+(iq@j zWcSY;Ccj=%1K{Cg_s=wgKh~rnz#~ZZ&-m?=I{q*A-UCjHB6%OL?wL)n!0wV+!jN;$ zL2}MHOAe9*VMzj#5fo4qQNRG4sDPXbh>|2KK?MUK5)?2iNkvoy{6E!Q&HLV-;qH4s zFZ_Mq{q*)cQ=O(~I#zWR@JKS}XObyMj>`o+isbxEP&KYPFlHRxx%}X_#PtOpO>%xF zXc5;6cnrz;nP76qIj43?{HX zeYRhHm)XnQfjVQEV?Lwrbip#_9nATlEra80*0s0`_08wSkHWvJ9M1m3XIdZR%X_`N z$GTeX@t!N|wq-gyPM`JTu+O+U$`-Nzhxdn;5V8LkvHyqt-#?xGKcoMzyOq~RGjQ_y zK_X<`c_&Wf)q?^?zATCwUNr3`7zO)pMk@egj6Y?uUk?7clZOuS>B7K?PF^{9M!kq; zmgMA-VL$u{q@RVJI&agf1zQE+E;;$+V7oeq@VT74anM8c1));<$LFy^EqH2KKMW`B=7x8<;ejM8m5&7DnmEn(+cJj4BU#$Q6 z{ObydpQ4r{emVMF^1H*x?^UEDLVsVK1HB405_}Z)X3)b@C4|R7jPte`fNM}4!5L6D z&@x6vfH6?wGzB_!V6lf2Xd_=yhr}LE&=~tkY;Q#D;RHEV5#R=8i4 zFjnw*!Dn8%uV;N#XHm9rUH%U9xWRgY!}aVluaI@Xt=(vKxV?h3Ii1K!FOKBw!# zavH23pXtA)yFL%z!7u5o|1I6}{vMl88?rd;orNL&_4Q8 z@T0;k6Y_u6UbF3Kp85>mTeLf`5@a*>O5*7iZcpexikki*BdKqI5tHq`a{D$I-~aF^ z)(n)L>M$MnX)_;BcIR0j&vG|%&qa?g{jU@>h`9~TA|Fka@IOY^1%_1=#wcG8pCuBC z*z+2|D`V?m=2MIgb9s<{Wz4O4{{HFL7H5OKR_KeMN#6nwr649v4K%olbUS0r_YcN# z1FTG?1viVEiS%kv8^Lqq_5#l=B`grWm^8EWvdA=nvQAn=?c}%ZKL37OAA>~19r2Lz`Q&^yNp;rZe z2z$6ZKR+V)0_-V68k;&u{cVX_fmYpi9PRN z4ftu$vPH(8H|qO7y%f(gofh28A1{h#(0g1TSkK1BRzrbi(esS4J{cS{2jAChs>t;* z68Y(Mh<^`VV>;gFt+9g;elAUu`Z}kdL4NZ|3!bd!BK-X~`&!rMHbnc`R6EoMhua=- zwqv*t<+=JV(Xt?awu`~(guaUK!T1Jm0!wF)-$DSG14s zIT!V2+?#?E>LQ*#4=tAbkH=j^{&{JNK?WSm@g_z6M;C z$_rkRaU*aII7PbYte9_@6Gf*@~=bNn2z>bCAuN#_2>kqp^Wz@yph2D z`3|lx)X(#=yHQ_F=mUwrB=aRaZ*#gJ^)V&Q9E=yO=mkzsp?{Aqi}bL+BI&)Ga02PI zr#@0YP15yEhp&l}vF*b7J!bmL&h)i=U-4J4ztWW^2ws;qquFoiD*3gK>x265L#u_J zBmN=K`_l(p-o+Fgh{@qoE_gLuMhGI&TQq5_jxh(VhRtvWCjl6V4(zoM%0cynM!I+*8f4o1CTgq$a2SsQpWjz6A%jug6` z-;|)8l3ot*9$A0hr;JfFJKrfoc{zVP05lVWUXJdQ^5i!A9~J1N;D7?qE72Cgc0N>v ze8G19QjOk|{?^X7YS1pm%edr)5dW5&ed_W-q5kzhdHqMtm)zLFe&qL`tAR6iJ%W?l zb5ICPi+KHqtGW2&k$;BZdyPJTXnJrN=+$`TFcS1Mw3cyI=A5Pg-(0Wa- zmB;PCvR*yNCpDP=EbCQ#1D)}AbG?cy+kR!e3OogWH`lAUnuWic>s4IMz~9aFD*BYR z_~TT}`V{3Gfj?f=$ofzEvx08@M|a|nS3zd|mz`({{+K@?>pzq{5xA6H@8Qb!k7e9? z536ZjPnWmry|rxV038YT7tQ((&({ZkyuWDHcPP(L{Be7i^&L3*O@V9K^&RT#HvI8^ zqgmf!jrS=2cztTtcet|sVIz8cIqDzjFEaWAn$q^gz{vkTqtBo@U6J=|^^LcrABDbv z79f?@^bupkzaM{GYa4j|h<&8?_~ZZ2A#eU3isFyguTKcJ{a0tYn=#_s{&`rfN!G&i9d~|0S~5lULRNGtHHp-s2*d~M_2suS5QO3*QffxBdNIH%6K>Y z6`$e#5nNToAM^8vtgzUwXUEfnwr zH|F}#I7@{;oDQQ8qa2sR9Z;n53lc){n zkEXT^f2>cTG-HIXhCkMy(2Fs~s^$3O^HS9qW4x`6KRzFIKVw|ofvGi?9bjp6eIy<8l14z6Up6 zhmWtk-{Eiv%tw|j3+;pW_l5RGT$m!LbB@Eba;R^h2HrQ>UiT^=iWg36fbW!Psl#%;w!ruH zTRz*b;&;tFWzI7iZNS-I`6Zv}&T)7bhwpLzY&UBv$`koTYT(aa1J3>@)Q_2}aQc4| z&Hj5x|BtorDf)jD%g?4m_$bGx*d({~&D?KH@Z*d_bpOQ$Q3$Cl`gPxJJgl~xR zKj_Km%VRctK2-oX7u6R!pYI_GD80~q6%Cx97D;;5R1M(5R7&Wv3I~rM53p0{HC1ik z5>#JsDOCoz6it`#SyVRQGE`FN#Z(F4a!wvH$f0rqSD=a~Z25YqUchy!rPdR>Dn00JDZhm8it}7Ne;zIL1eFQ618ozWTLr+~sGH0Ack_Su{fUMaW{^Jud>*#chb>3!FGQy@#dW2 zZKUJo6nyevul8)WE-?297-&-oAaBDec|%2eCKXGuu%KZ>v1t z=X;S~qy{22@V{FFD`b9lSRcjw>TUW!=7(3+HB19e(W4)k{vlYX7lD3;=A5;7upSEh zDdl?4;*W97`T$!CK1X0G;tc#AnJ*rOu2EQCq9cNj;e0#m3oI?+`Mf-KY-pC?%doA- z_W1e=z64!?Y;P~E;M0VHKnKznlHN(2&xe&|YIVw%XP2>GNowV3iwl|aR=yf4&odYL zYan^Aa?AYoH1wr|pP|}I_#8SXa0azX=EocKM&L|pw&3TDd}wx+OX_crehu_I>Z+vw zsD2zcpL$&C^BZ*;^;uBu7JLQzm9TzMJ!QUp1478)PpSoHY?=KNcC zHAw3FoW1~h5A~tc*CWP0TW^&lc#56|dVh6X%7>Hxz_+QN1eelffT089tgWvB&>w{J zfU2#;pRMl!9-*$v_ku+fo_~~DFW<*o>M-y)^`+qB>LlHe%Cx@^fA9dK})lre!p`1n46mY^as?zcTwK`6tp$`m4(Xa zXMUZ6j)wpBh?*qdv(+#8s9Gu5>YsdE^*N0ANWYiiCoNZJWxaX38iDdWsj{E6^>L?~ z2>g_KN9cpi`Oj6VzR+i>*`TjctG+YggCmj|z(xv1MYJ@hp#@W=aq z=NRAMlRfQ#+tY0bAA_rGMn1YdEf8D;dy!0^Bsiau|7mafIPS+rp?~8(jQwRua|_00 zzR$di%HX+FJ8kK#AJv6({hY(EKM4)Xi2pNOTEx!^mmjV)Ty?lcaP8n+ew&fz0ZEth z7>sL|rVCRDWpUTe=X_kA8&EAyHk8Zm%E$VJxy&vOhvBl#LH@s2K9}|-DI2HDyd_?P za(YZ>|7)am9WGA7ah{RiZ`Z&;`QGjRo|W%?8gsM_aJ%5%g8Kk2@{80!qz3-~R|C(3 zjlkop9q%+<{?U$KcD#?GzKrqMmGH;%ekp>h~wG~_eygKIp z)fa5#i;7bf!DZOiHDrjgbAE-~cwL5SOa6BLQGp(k@U^Kn!dInxgl^|6HE5(@JD;dU zKS=*s1bOrMvU7s1Ja2tEEZE8)H=>=4k%yI6ZbHuqJ)i*bn^AX3-_9ReQWWFIm;!~} zm|wih7%!x!v1ibZ&I<00v%Nf@m?`D2Ni~5xQE{Q$`C4Zq7ZKB)B`!RgC*Bsv6ch{UgmyhG{dX6!>ZCLZ~hdTnt>4eJ&g{Q%~<6Rk9zQtWTpToLq&c|K< zogbDChbu1mayZVP>&>NwO8&3@)xU=C2_>}hyis)JCyT9oYBa?P-OBIAQg*>so;EFw zmhio(7g9-}7J{ujV`h3yu$5;`rjvrLd}dx+C)mpK6`k?P<5eO zdB0-RUdm(TkBie_!B!r(1dSJLv^JJ8h5y^CEnA{EqouyKkHQV#tT@b67qboEPCZEQjlcJor9;6Rs_V<0{zWYYgYU z9hQxAVZ-lpJLU8^?l1YSTqu6z7pZ}Ns0LbHx9#1I4~nixd$HrcPkn`M$H!>OAlQya zX{efDyZ%i_V+7mrD+9eP>Dlo*fzArH<9Q;j2j=#c#jJl5X^-F{rafAD0{*T)Mf>2f zh`)QjcK$V-au1NF3*-8D4ijk)|IjB83G^qffdkTB?S8#SWp1E9$jO>GG1x)AZ#&b` z=B&I=EFETyIjcRtmxji2c!ad)KjLYTU^^eqKrIB@^9hOcq+olVBr^>cZ0EySX%=HR zJ6}$wv_iN1gCu|?+<^=5DGWPH9aX-m4Cu1KTp6@-6 z{9G94yZMX5|EkY>mM)F(Ywo*UAMNO=eU|-p_x{Aq^bdPIs|A@2Sdll@J zV-`y11>61oIQk~u((V3wT1tS}Ah*{VWJ=JXK1yg82r{bGVkoBjAqlq9&UIZu?C9+LQl&3Zfw zy(qY-+kaq;^EJiHenmFAAoNn^d{K7FE$Njr`};ZQUZEE-`cabUK46}&BvD@cxBN?| z+lY0q^0#^&KI>@B3-=Wl)*(&07tKk7K&$S+a@|F3Ic#~dEpDZ!5C zL=M~WErjj(AHr7NH-zo{A%yLC8Nzn_3Sm3`hOiyaL)ebzA#BHgoEZGs_CJrRM=>mW zG#;4S<7Q+3*rNvoXEF9KJ?bQQk~#0{QCY$5&3QqO9%qdHYrI-)(iE9x_ zuQ`wFQ8U3q&G}Q0W(mFm*&q(T1^5lP6L67Vqz3-mYv9yL)1HFW>REihYgO7)7H?E9 z13#~>VV;SLU?l7j;XJO&E%eQ5EAU43mc)NbJp=r*`daW`jXwOX>Tbb{)FYt3qWTD) zukHulp+*UQKrIB`r5+Ky#I)}{YL(!})iTguQ|$!bqvitdQ#GVKuc#fs2UG>2Pg661 z-%uN+{C!kE;6rMcU|7-ven)MQ@GI1lz(-WP;4x|(@O!F=;JaWCieR7XhTwH-1Mo?8 z2`kdwVLp*#nsIG>WbPY^iqbOaaEP(_>c#yNwx8*-B4GBUe54Cw4MguEeaZ3(%)d# z5v$jU{Mb;Vk0D;K>}cusymAKp1=Eu#7-#e$Bp`ZSZ|a1$YbVHMRfNLpd-H@ z^i`C%m~JBYvc3XbLfE6*&DFHCr(BongMN#i#n1O91^vwV^4j_uBktO{I?nX0uA*s37=y0 zKQz(K{_;V{(t>NFPko5+c%CHKe}vSG&cNlv`<_D6K<}h;Fh+gNF#0Td>anM7_}n@` z_}+TAgkNs-AN18ccT8=+neVZV%Fn^4$%ge(0ra>k*#gvUB%N%00$>pKaj&lHVR> z36@-sh#Z{9t(dlo)>%{(U#>+Z3hQcjn3gigYH;xo)oz+VN&;h0tw zi73SY@#wmp{e2!Cr_K8U z;W9=g@f}u!<7Z$wO7o0=83~nvlX1T}T(geBw3Ey4#cjhps;bdd^n#;Z!?}lZy7@PX9Zm&(<(ir|EdJ|Ef%xsW;@!&+f{@zQfLU-?IrXb?eH(ykA%T zOVVEWS;FPh`1##)a#;R`*)}@2aVMkv|4PQ0(|-kHp0gSMOE%=0&UMUTIDEJ*dA`p! z13I^`{UFn~;k$I@9*OaeuerbYf3*i$TKbppy-D|ty1f2XKYZUY{F?iWUrU?!9=Sex z*Twe<_c{9YZ{fI~clR=)Zc<}T&)KH`3iB~eV-fsSaGM3+hj%ceKlJ9nA13eN2xuR{ zxj5|C!2GT;9H$uzKb-zF`nuF|dK`}XQXX?Qb+l!3*Gvn)=I?M?8k=_NIL>A~KbyPe z_)h<}!gr7nt^iyWxYls|ob0%*vj2Lu5S}adOgly!+A8?{x{&XO1~CeeoDGOTSCDtA}JanJoe(%@^h6VGX-mI-~kIiz;$hTh*yTyy?)p0x3PkIsFL zs|Uz0Mb7`AKUSFEM$Z2ozv5N0;n>vGbt-9KH z+<)@;#{IS1|K@w#Ufumqy8nG1oEE1Y?)YAK88{y|FXwPy1UCHcUnsLnuX7$7hVyoI z25R4G=Z2hyOD|v8J&w!anLY^j$HGmAsPjaeI9crx$l{vRnwjB1Ja4e2SJLzHJ66=obw!81Alo=B&Jp2ygKx{J~xKHDQ& zO{-Df$@JnT!(R?EL4t&63gs618d?K9l_sD(cu_$TzFo|gX#_B)>lAJDSx+-#29F(V zxAS(4fjnl6z&m9dIc|Jl+c`Io58vBV8)M8oOXK_Q9*1={cEbJXXa?icO1em6Djbi& zoZr&G`iyx_%wcs&d(Cs{^KhK5o3sBjKHG9*du-34{`mP=_uk6&7`Jer?=kIRlz%zg z^Kg9M)k8}>zbl*bT{)b6(?+OgzL#@LsIFZ3To|UgdUNqP9}dU$%>G>{%N#hSGtI?i z?5;VSyJr7kyhBHK*Dg$WU2@pe*p=fwd~}>2`}|Gtnm@As|G&u~Mb`iJd;CwV|3&`= zjq%6$DKyJ#f7tXqZ0?c&R7)FQ_l< zQK!)3p6I`zs(w}A<(}xjplW_K;JsiZ@T5w}IaP zc&8`&FX$Hk7T|-P=)a(5ely^=JkftagZ;t4?|7pBf|~eEfDe13|AL12Lx7KZqW^*h z`U8QFd7}S<#{1)ek9(s3g8KM^BDf+!Os5 z)Y0z<{FNvAFQ|v#1NfXL`Y-6bciu~(i=ODepfY|L&@X$U|ANZ-<$!!frIN#{M0N&;80*?3dH?{S>)7uH0-Z%O$ zK;P}{22Sve{tMt&y;p%V`PZMb;rDoZfV23b4}(7NJ^;?)i#`nc(EAWLr*HIOApTx& zFK`}T^kGnDKQqdg&li0dl+DiuT)-E77?ct7uM{fmi#`lW_LG5&`oa%K$O6E{ec^{w z5x)pEC|MTZGQRM`5wj?81z-5#l;6(}T*()HI2H5@0$1~eAC8jd0j}W-Kb&&; zxqxf>!Vjn1es18}zVO3gpf>=n>kB`e^7?s!>-)kFM@{4eZs-d?oQnCyfE)Y54@b@A z0B-6FKb#W%MBo;_@WUy|PXcc33qKq+mk+p|FZ^)I>SqP+;0r&TvisSAJNd#7r$T-q z;I6*mhvR*`=e>vb(bG5laNuL!G2p(w@V{w;w*k1nZ}{J!Z}qkU5A=oqO`E(;z(aiD zf73Q^8}JBU_}{eI+YFrI8~!)qzv8_DJkA&XH(L4@;EBHQziEO$0p*+K8~!)KAMg%< zKFb&WH=XoO0?+Xc{~Po-y*Gj9`ojOF6W$5n`+URy2K{yKb>Ihm!~X_;+j|>$k#G3l z!0&kP05A3p{~P#-cLaE;Z}{K9uX(QlFZX5ri=OL6;1#~%UxWUZ_ZIL+K%~m3a$2MVc!)~5ZdSM177PJel_qx?;!B=zTsB`@AvitulEhV8u$(G4d9Kw z@T+MO)^q4Dec@MA9ls9nR^RZe5&n>O2;ukmV^7=s>ihLUf6X`iY0!^)M?v4`XBnnU zc~=Y4uYi70^q+n)!B6NXfDij(?--o?(!j@jv3E@6bUEPTzSujaGSK&v zLMMIwK^kcCiBWobda%*cD&5;x`r-}JwZA33Ia=v?p3*0x;4VYg?00ZKkcQqU4SUQw z+eP>n;LgKo#AjAK8@i2$`w921!KK6XCHOxh#EgK!q!%?r zdFr7&IdQ)T%9D)pG*`NId8Ie!M|n!4EM?#dDSbR2TtS4p6|TC{*{Z?M1y>HPDO@AC z#&FHxn!r_ss{mIQt~Oj9xRP+);IhKCh3g2{39cPnd$`{|D#>qYq66jJS*7A4}LA!$s@8E5-y*UA51UU$q(id?BoYa2zK&=$0R)`ueeLF zlW!a=;jKLdtP_Opfv%G0fCHTtw z3F}d@r_!5(c<*Civ8RIP%aSw>k16(4fFt%lBlbTb_2BHo1b>wM&qc48{f&fi-gxxi zJJoE#OU|`;;f~dwP9=_p71XZTOkqEZ_sGm!vn^8w32h+9=_Ncte5TP^Sdn?hOZi zQ!N+V*Xsv-P*srlcX%U#52@CY|03^U;I~vS!4G>&fZtZbCHxp~Ebu$3k>F8Y3h=us zgW!SQZNP_>7CgWk2z*5C6+Fqi3;3w|Udl7Vy94+=wM?FGmUlPsG4-n8+1?!B_to=) z@AhT`A6Lf(&++a7KB3M@dc(aDz$ewpI~4CvB|HcF*H}NOje?)|)&YN@YRdC1^cDes zsM<;SQoPZ?r`2pp|9)=)@ELVO@V(w#;Iry`34fb682BTVQPO+RTL}EI8YkiBdGmok zQ6(h&NDnnepQ?j`Cwh~BKT~xi{4{Sm@aL+v;OX8B;4joJdA_0EFyJrMM-u-oZ!+*# z>Mw%t^d#Vu}f2X<%?xMN^Us3Y~ zcY{9o6#8DR6x?0)0RBOZ6x>yH1O8E6l=6&Jqkyj}Px2q7Mg#w(QiMKO4FSHU<_jJI z{eCHQU9FJtlhrif8|ob?Zwu8L_-FN=gdd?G(Tf49nBe|u0I<>x1P@SyfVEC1xS#3| z?CB&aZ(G$K*w;HG{bs5KaFi}7bhZbOLect~(Az*?ehS6tIf5IiM!>PUfs}WmngkrD z`v{(-?gCDuCrJ2usv&S%y-IKs)eJaZ-zw!Bqy_`0(`y6|Rks7D*NY{5Bh>^rgU%@F zk5=P>6Ld+zlPCWD zel~>)>8z6e3$U+*^|#(7kEDrwvJ%EK$j4_2lkM#KG)YJ z|L5oh;1YVT)GymhNTHH?s^s@FZ2~T(3rKnHqzS;Kbw$Awz$?IdUN7-%eXM{js}w4$ z&k6k=*uP7`s^o^0cQkknDUdgwB>61>zYObty;kBs343QLR8h~B^1e<7fh+0n<$bRP ze<6h`>#b7$wXlVi0{P@2lHUC|uLACd-Y)sipqaqc^izVT(G1|~`gZx=KBdoqYv`4N zzkoj76v#7g75pWg1ForC3jPTCdQ+&Dep>Qldv(}v&@bJ@4*}QF4+wt1(Cg}{^8B|! zemsTh>Gkq_ham5a{RsWFJpWVR-=$Cktl4aR4g{|U`x82=q&Ju50XKqHS4*D<+Yi{U z&>aQe2ip%R)I@8+_hKP{{R>@3@O;Rdr$D~?b4h;`Y+0mGb3I4$UrsB4Tj)0O{@FfP z3boWr1aE>ZuoTE+4-)(m&ii2hLl+gi9`?XesEsB`ZwW00ZmX*Zehl`uus@>P3w|8( z?J3k=j}rU@EeGzPlLRk?{k|0HsEY`G6t>i`f5J;y(_Yy=SPFI4Sp@HdZLk#TqIXI7 zmGl&FS6I=o;UA{Oz}<8c`JSGkRlwc#J@S1_0k0~BZq<(qeHHj!Dbz#%MbbY=hk$$P zF@pEg>%hHqZ^8R$KX7l|5%tUbuDUKgAIR3A42$Hdhjn!~^YC47P($P}B@30TRSnS| zy&LSz{tUcQ*MHyU_Y>Be*e}x4A7If&dK-bi(qjLH?(pwG`7UX(e}kRc3cz1$v411{if^^pzY%`JWi9q^gg^3~7W+4{ zpLs=#{Tu9jc13zWYO#MK{DYtLzE5oVNBN^bzoGM-wYZ(%4%qV=2yXAU2TtRO{TpiO zw*-#&4xO>#TluYk(|gMWTmDFbx9USnuj$tWJ(HJw+G4wZm(3e}%HooKNzik6bw04T zqF)g>r`PqU#qWFXqrP%`RfONu&+i9%;LZ5R(tG+nf%AED<#~qt!+{HUZ9cX1vHn=# zLf&gqo?3n_;9}mh@_b$VF2JR{GlDz&oq@}GuL|x2{yfG{FHUe}0O{z_9%^xtD= zc?9S!JkftI{HZRU=)b34elO5(_2x+VEWf3XC;IQfnfVyy>F0_5d-~M-6nKCq`tRwq zcN%!0C;IQf**ODznW+rD|z1~{1PbdL~o^h50<|*#S{Ja!XKLMIsV^he>B2}_rMWj<;R8i zf0g`7h#%trS^isy|7ZDwA^xA`*M<0hc0W7B|Fita5dY8e3q$-r%MT6l|13W)#Q(GW z!4Us%fIk4`3-SNP`Qv~?{J-9QZ{QIBubbZuIK=;J=r;ro@&7D85Z{P=j~)CDpojQ> zxB9mNhxmWzymR9}MyTEWa`=$N>=}Dl9gu#-RkGfWaU|bt$yAtPF_{?4`p}q zs<6gh8KIJ$d@4@IR{_pr}bF#eOZ^>J-4B#)xNjkYl=W{y0B zD(ue@Wujw}-rd+AWPRe#8#)D}jJ>05)CqK!@2+P0uk6$SnD?6soBks^O+a|2zfY%e zHwVoUe3r0qM1QkD@Mo}9h8AnuKexH5NaySY+aLVeb?R`8*|D5-exzFwE_E0#-?Ml$ z=a6aS7pZ}NTMd}@uPKNztpx3)q}gu?GQeUD@4U8TT%Up*lpi>TzyLD+K^iZ;$K!t< z!3ka_;I#CS!4y=6{4BTUS%MdNkAj{=D+RBGe45c}nZ)Vw`5vBMpgjxys279y+3CJa zmVU(l05~_z7y1+4O2iK+KD#aNaHGGg5PgqgbAMG|K@bi0ff51*YA&=~mUL(jS z!;%hNmh@^t{uk2gv_R6kr1-o_J*sZ74%Vp?NUtePl=MpK0id^~N|N40|8B(ZOvi-2 zN`DP{4|>sH9Sk$}wfoZ;34h3c7vTp}F~LKzKZuhA)KlWmHvQWjbVACP1?zFv(*BLm zwHJ%$8ATn0Ue{|6Jcfn~{bBI0pjmYu-bMbKD9_zg+Lh0%j`ZhHU7^qM?*;u{IwbV;eg@#VI7ox{ z8AU-A%*encpq3JTo_`kuTC!mjxw1u zC%X`z&z{6VS}OxwTjWtGtBvRMDLC42r9lWA@ip#ru$V)^ZqhRlxOvdtB;c9B7k;&hLw#o#*RZHjaOb8GWmpmYCT z(C7n>r`LdazMkF8H{wm(bZxW<;_`L){F~c)qd~R}bKJ-;QUj41_{VF&t^aWz!bGZ^ z#kT({s=8_aho!yO!VVv|_dG%`uF8NOMVEx$oVtP@ORwL5RRP;7ujOP>0dQsEk(!NVz$DP~%^MV^0ecCZtLvjD1p+9vr=&{rT%Qm#i;3Prt z1nv2id*g7A^NRc;HSlMy0oVTB_+Ks?+9USg%NYI5n)))v z{@`OqUyM(47^6L769-;26*QRJXDL);8pzbBD4GDd#!u(-qfh1`CdAWiniiSODv>y~BRiS@AVXS&0gk#uRCD3H&*|1uZU`t_pq= z^3puscO8pe1JHlgIk6ucM-!QzT?Ye$*}xg8i(n7(v#cd*mEimQjwo+dO3xVO84h_#-c`sW_)Ex7 zGr#W^!9PMCnfZOgq&)e(M!>mff#8-n@5lUy&*XV`=~q$SfVN9{Gwa)d^U`X@o(>*T z>45Xo0aG3dhD6_v@)V$hV|bT@OP&+|3(yh4xy^n@0Xl|0j{D0u=}piJ(k@^QKOOS; zjL#yxkHg!C=rV92@=-n?^Rp}HwVBJ=4Eb~XnmCir`p=38E}+T+7X?4V(#xwFz{TjI z>t3jK9c9%~QP&AYhIW#{%~oX`8PtpC{g9ENR^HHUL?oFAT6 z_&m<-)4Oo&yY%^bahy%7Y7gx5qfU~Lc1M)mOXax!BEMg+fz<84b~3k53i{JfL{e1J zU>y`S_PRAC3(jHY=RSGB{C%c3kg_ZhCg;P{bWqy{22@W<4E8~@W7`3Xpv&R$Za%<% zc$?>Nkzb?+A~o>utpV5mqtSNx*9y~q9{=;2{X9(%(jtoz>0!I#SJ!^ zS_%FEdeL~iZzACnG`H|Hbb;yUKOR@R;iaeJf@c`}e+jfl@E9Y%n?z4Z{K1zA5{k0(iauIaQWPciZZpVXHTzBpx(_;0GOkbWr|C%B>R z0(u$hDmc(Jfy+@9JP-H3Rv%k=$|5)$o}Eu&)VoQ~3tW+oN`IXZb!qgM3%2{Sm1)1= zB)kh)dZBd&lkDeKrH_T48FdefVRW4__K&j|`O)go_&~;X7w^H&L0Oju(0~2B)ep@! zXIOrt67KWY!g6~zP(Nvaui|Oh#tZu{9ES~eoYsQ~A3mm-YaH#kc~7o6kJ^$Cr@?#0 zW8m_kEH}eS8Jr$(F0TnI{!hDX{tKRiW^=gkvhel);?K2zH~-%+-(Lk)2{n)RCAb}A zL;1_vBzO*$06mK47_5T^)C}|(N)cQMva~$EKPusCs>TSPhI#<=dLXyq=cS<`!2G?I zg6@2l2XgO%=LXM!=CIojaz3XM`9*3VQUm{54Y>C2=Klo(9v?Nvr;bS2qpE^?&}m?w zdNYot;74e1;r8Fc&?)%LjF+&A0L<;XfSLbCQx0Iif(|Mhc>z2B51;qD_RaAkzeo*4 zYT(~n1E&24q5Z#GAhw5=2>#Mh6hu)=!KdhBV8{cMu=C4%p`VKThe?9>LZ1{9e*y=0|oC3|&&dNwhey>9@gIAYQMm7TlKF181UP5`Hv+L4`T?7{Ozq zKaSTc?+cz{=2uzi6TwrVzY8-{`daWbZ~%Gza$WFr=zrt&OPo9(>xW~0W@f=Njl5P) z$}4yl%?3ReO_liLXgqLknk#s`vG<*a9u~~{@lb8FLNM#cu0j_g%{yGfpg4YPu3jOao zE`M=6UuC%3a82Oa!gYh|2R96E4BTY6*>DTsmcm7Tks659z<*~AxcR?Z|9^t} zroYy7RPb0cUU;U(X>~>H#XyM9AzzF)BAzuBiS_M8_ehL&!Ixn z(nAQ(^M#V=YZ*@$oQ%Go@sq&3KTr-DLU=r%FW8G)qrXLngX2MH<`RG?YR^+2KMM1gDL24_WOPMP;hHAen*j482tnIfp3`o z|7h9-I=A<1-~jUe{$5}{pHj%k6a6~>kK;vtks659z`wT!-1zU-|A|F-{Kt7Ywbso4 zI~YvCbLPAstf6vy2fe$x4RoKj2;OAQ^T$waiGM*ogIRejy)E>Ugo9bw|NBI6pgI7j zqrV7#me%3H(^FxIzd?NldIm}ndN-qwAc5``{4ne*F+Xk~hc8LNHoXV=B~g9Qd47=y z-WK!YIs}5q|&XdIb0Rn)Q!xUXfp<2L6|7 zz_ouLt%iSHi*ftLd4D~~V}AVi(jI3S`PVd*wWw|XE9hB-PDjlJU!oY(Uh7Hxarz;& zibRStSO+&$KH!XW7vn$&_ZWM)Stz&Ai|JcIPo~c#y+_o`NH0H?5_*3<0`$U^uDC5< z5C3%(xHNsl^z;-o^E(2Uqs>y@!0@9hQV&TlgUXBas?mJGMa}uwTC~=r4?{P8J;bj| zw@H3?c+>Fw4e31z-_^(~H>Fs?3t_*Hs0BSMxIXL~5_B9F6}$oV#RxJ0R~bXU@eXwb z^lnsD=)28%id*R~C@=R{*!e{G9`u~xY!m?ZG<}QHljw9ozJoAM=K){4v#_bJ`TQ;4 zb3XGxUdMjuLOdh)SxlP+wQY~Ut%19F52Bk3;huoo0Jj_N5S*j4e)N^eA)FuYqzqh5 zxYlre;KsqZ@K?j~`xtrh{SCQblN@d|>fU%JQT8ju=)DrPC(MDh% z|8pAs!kK8V(90Y7#LRSFa3v#u45@Xzdv~^eF7B@_zqo22(IzO~*&<(fy3Ep6^HtL64>vB>XRczKwxf<1&#jaIO+tN_yCMi5 zODCWf6#WNw4|)GEjl;nVqfacJ-m>)IP9r~>-eGElKOXOspr!^12T^8!Ac?*+;aPv+ z4bU^uexav{&WPDzRw^a=*4K3;I>gcfJ@S=@_bv&en@GD#XeG5 z+AQ=Xv;ogk-eFi8s0Un;-j(`2qN35WRdyID<8T~gpw`IyDPhh}Rd*QYE1yNR-9jHr z{PpS}aBYXN`^x&+>QQbf?_>T^talpFQd=HKbFn;EBZq@N-XyGln$Q}l{~6vQgm3OJ zQm&2gtth8FPj9^#Wf&uR2UO`ttO&x&uKAd~%;;B037IEngj`1BMM zF#GR!Q7xfceR`8=mEg?gyyp~3VhsMCwVyDR0->kD*h`Q>ZzVV#_U2d%RT;r)F_$OE zpf6?&{y`?RO|}n_EaeT*wg@ulcbM=xNWk2k?L|y5;dy@!i%7_%-@_Q^MUzbYIaFBU z=cT-$-$N|~=SSOQdlJl@O<5Krhab5tn=&loJkwu*bjFuUbTwY4HD<>IiJJ-S$?}tnDYvh=qJJ+ zXlsAVNsIIPd4b#c@q)AXS%5qEMFeN_vjKPVZwM~v7Xw)|GIdN>5>07)lzytjmV!!)k?`7a2{)BfeeXF+>c!a-C=$pJv zz$t!diNDR;20YHcD)i0XX5fkbv`=mPJN-LRzG?ot!xr!N_JcmlU)j;(6W$5nIsO+y zf5UqNc&8h!`@-wrT%$& zo>#qBftUN+q&_xy8-Q2%B_#YI?-1}xf4GES=dA;N+HWV%`-=Ap@M?dSlxMHE7kI6I zP4JuEo50Wej|txA?E_x#9~1n#_d4)Ke=fRluK$VtMAXmA{;3ZwuI<+b-s)$N@*IS{ zrWD%ak3DVa^{`)>La+I|g?_|40{T8b%P=$Fq9^r}I)&cw?>=Y4FW1X~-|~wIeq28e zeAsV)!O~0VQozUjp@PfmvcSjv$z3eHv@Q*N($_=MC_N-bX-W^577n8a=7zfVx1={m zD?QIsdTtc%T_){)M|$=Tq=#N1-TiygBQC;SAYJM_W~drrSk(oz-BLW5DnD+^Z-~H?Q{&_5!in2Nze7q;XaU;J-4Mb|-|6T*8{SyUl|Nm)j z&%njadR)1`j>hvwzRz)({~q~8Y9LYr|6C2Y_V4!p zi&nMmze;pt>~~?URoRaJ*D(*_@xN>pi%Vku&F%k);934>*w%=pmJ+^((LWtWD+RaI z52K}~qtgacuw1_coSv==-l=iQAN;=pjIkeZp1#9_B+%!Q{zd;gq@PF`P5GeTDyj_1 zmqa&&e%(*R{#zzmAo*p|yvoi@eGHv~Y*^3mdHZ>StN4R}v(W^>Mg20sIjFIux6?}i zPNr;vGxIfNIw_#5Zp|4L;d8YEfRj5KN<0HeqQhhe++Owsv-5;I=UUo zpP$~SX#2a>go!!u31Gj64vy0Mzy&A<>GS@`$HqQ!K^hOWOx%B-GWJvoQ5K995&jNGTe!tm2u0V5{j``^{qu-z+J;vB){SNaHsuGQt_*1ZV z#rvl(N&JWCF9tUfdPk$*p$c^t+|%d}s7iYz{7QNT;j5bQCAIzL)MF9jO?VG`;ogN~ z%#P&<+;#YPXdzU*Kw}_F#GOaYM;kO=8rj_uiwMh z%6^1zhSwbVMQY$rS_7%a|A%CJtxB~~BbuHU+}P;%^GH>*^Mld~j5GA)7i2ukrwRi{ z(S8Zv&hYo3zlSmGcg-Xi!oYsO-N4-cmo?}4)6iI8?%xB99n3G}zR&e{t{-GSeC^M1 zBELutL~7t)uL0No-TvPOY2W!xdseiBaV+?mM&GZdfrhSwTjad&RKZiQAIt0iioo2y zbD8yf40RM-(dYw>rFy{J-t&S(%b^Bkk~ydjpY_BQ@}!tAW(*e-+xgilShZ;qNKBi!sLYGG_ko(*p)m(3V!9 z&{4Ea@D{@_jHcUxdHgSG_=PdlSa6b&XM#OoU>^T-L6$Cj{12bsbDzWEB76G(x$h#9 z^Pi&zO#43_;{T7SVcYu zLGWqyC2%^bFX8Vo_Ak;?B4dRAM*RSKB6Trz9c+N$2Jhz&llU{udArQiPVjIw3E{I* z35l=uH1rbL=|iC(P{%;eNvj2~Q7-`Jp?Q-3`;hO!w1#ps9sN^V)dTc=6eYNsY7Ly9 zsxq#qgI;PNa3Q)^(tAYx1-K|}l=^spcA!3r(VL7b>0qDP?=D4OFvfoQ$5apDOVdQj z|4qmP@qTzc(7AuK`jE>~6~R4>{^4@eoiX;$tv=lHlve0njlSXv^po_Tm5lzi3Us^B z`_d4Ury>myZ1v|>qGF73UgK7rE#&?1>_WHtjjK>A!B!u$-S55^N4uut{sK6bkz?%E zY1~h{^B3XQO#dzX&(Om6e>k3#`AD5cQE*h)W(dzuUHQWIzPYZ#vAae^M1E2OZv1!a z|FN}g`#7MEi< z2%nZp3eKoT1IJUG;LDKZV*X!0iGQCtPnbkg1V2s?tOb9svEV+CC1&~mDN>%ZYB;{Y zZ1gSK8@I2jghQg}AC@3Ij=_5*W!%tisihwOj;T3g`wkzb?+A~o>G z)PQUMZv5|I+OH0(ne+1={VeUdv|{<6C|WJ_sm7iJ#(SYZMr%;OIJ#fxDMnv-Jbfj2 zy|EXTj&=*apB_T^3^Yb?M`N!ciCP15|4`YS56(!nfq8t+YtHLuG-Kva+&hNjMBHb% zxnJtJVK`1bw(|Uy(~bNhHSlMz0oVSW{NJlsw(|P;DI=e!>AAWV_og|hDxZ$mw|JJn z7PHuBQVr~Qzbi{?ljS%`ioL@nYK|@S=A%75E z5At_8sh$as^NYF~dXrrAu{`e?tip)`$|UKPRegZ-(IKI~W90J+(hb4!3d(38Z&!-L z*U-UWBOh3lwhDa#9YFmRqmd15eLWJh6x~`0N@pa)4J3Y=m`sRYfgTb1yy(@SSEBBcUe=iVL9aqvg}yF&3+UD9J;A%9-vF*jMI`*y zXpQi7sJzfsbOPx0X`8S4!zB#>w@JxRg=Yd$C(rm^zbTD1d25w26kRQ{V;cPLVHy$9k zozXARnnnw5Z{!Et(9@FM0;7MbEj=vw9(^CuYiH#L@nLl`d`F{~=orHA-oiY5;XEd}^Pu5#TE2G9>9bgZw0=e!exQ$4A%v& zILgWnsj7p^P8?+I5Q*G1uHhfBhBM);ZFYT>#D{LFB-C|$ay;y!0}TcVwCcfmve zV0zDVo(Q$$n7{{4M-&*{|TG&z6v z_ad+U*m_(Vgz`-3hd#MC^ya~>xoGdRe!83}AIIZsE+hLRzQV30wjMdHjglr`&y;KS zucEtSfAovchyWK(PyMXn@i-jQoz4N5r@PPoB8X*$V-A!2R~v83RyG=K%gA-gVV&c;xv|OC#T>kg^Q|E>UmNv{x*0Uj#?vK< z)?o}i569`e^o}iSoxRvuMmaLWae52kbDf3T2j}}PPo}$k`TZSuljt}c-{WtC%i_vV z64$lin8tMzUIq@^{XUylS6p+wRYcn1VK^R_mESwR=lb7bmXrfN>Ybm9>0Ac(-Miy_ zTz>sX2bmhG53%NgXYlrYY$%Xg#*tm?@xqgs+?x#3!PUEv=TZWSuXWdxI;}(}| z1jdZ1a4yZ%{%zACWguhb*mQp%hx2f8xQ{G@FpN3>`WtNiT+b`lhsw&&asf0B$743n z9b6iVB|e8)j{cSJKim^G#xB`wF7p6M%hd^o33sl{oHm!q%?lcRVZ&8G+FUPOE|)Kt zm(z34^UgX;OYL)*>6rVB$9&1f{VnXm{F={kC+`pC<;L($7`q!`yyJ3l89vHx$JAc? z{`Ou!yvOh`j2jL8+j~3~rw;R5ICc2n!>P*x+MaKEoag)_^Kkor z(b&u5U$16%f9iR{OT|uLb%S+K!szqxsin|cn)8uSG+gjzLP3#68DQS8NjCcFVyGZ6 zrjL;H!3TmX{?6FBy#t3iT;vz2fk+Mfduzb8|J3^b_v%NmUmioZ4?urVRtHabPXou% zM8;^}e>L)SiPk>A^T0-4IMYr000+!@_N+JU17uTBNQXYa*azrJ!3w<{y+E?H4^Rm9 zfpl}=T-H7S($D1Ija4Az^`QG*71Tj{eK+U@t$lzP)~A0O>6N@`AK*T{1oW~u?E}O| zjmQ3SRcjvr3H|8%z%_5$2gq;q71gODcvsDMT0X!qtXr0@oI<8(crQ zVQ^#MCd18!TL8Bd&W*R5ut(7^7dS-t%rMOi-1(n-TG;WwKfWy<|N9%v_P1{V_Gt`b zoae1?<(x(>ppqkMuZDrU&1 zr}qq|prh^%dIrkF`7NVhi@uKjC&6M<5+sjV#U&1p_Sjc%K=>ru&RFZ9iEas;nR-b2 zL)1p3pM?$}J)V!GQCSRLD$h5TUdP?6lwZo93Hl9DTT}&fp3h`5?JYYsllXaze&p=* zvf%U34afakX9-{2*gMQYe-(U^&LI6{`jl~d=r1wnDRa_kp=VRs5kD9Gz!>ts$*Kgf zl`rIXmU_Ol6wl@4aNRpi9md^v{x8v4o{*o3`7it|TtBf$JM#N;)Ie{1@7x~J8ht8% zj%SWMWuyioHDGIC0op&0|8D)Cbq0^36r{u0%)jrZTO0-1KmI)};hntj7Qyk5<>8;` z4@+367Ge-V+R$x{i-hluJs;2M^G~=!R}eai&SDs5dNo!og8hRnIV^6k+5^YXi^&#u zRb7E&N#-XBtJP}YI6L1!{8efda2nbV**;t(R50?2X=!vDgXx;ShEWvqMg=TAx5|xR z8ECQKoGK@9A~h47M*q8D4O^2>YlybJHoLX z9AS?zL=>RaaN{^z`&}sG_%pUO*K9Juf{c*jGMqemW?)pehJl(D^S2 zABXK&{+<#41>qm)2jJq)e?j<1!lVxDaf$ze@KLj$qO|i@5I$w>qm^_13c|-=vzEVq z8n&?deQ)f6RdoIf!au=gE$XX3rC{^$&eG0e%>B zp8#&?{1b%F7=P1^oxg$bFUEf4b($?R`M{g|qz0=IDMzrv5H$ADY9@vm?b^F7##)@3#2NptiZ=+~NF5&W3>-fTk$ zvf1)3qsxHa(b;zkKV$$>Ds3(BCP{(8|?`DNT zQtC<#1rJmMfxA&}!MCVefVt1b0V*ZD!8Nhc-!e44+vA9wx^ z>6AJJ{-U%9!3;Ld8&szfHroa;67$Q=xORN`bBgE@_wNaMXf&X z=y!n6(oKTj)^7u!qvfK{A$h}l=@p#7X>}D@&%XBC4jT23KE~~tK)sA zR!I3IcnN4PlTvm{4x6(iyX#H==6E`>}*s51XR8 zRY(7~_4B~js7{if z{dzxeBh^gmPf3M=U)aKLCgoF57X-bD3L}5~y}C(%VzBtz35OJqzg(-t-%dD#$_RX& z5`R14%qkJMsS^J>;fyL1@byak>x46@%)rf*_}2-?s|4WYO8o1D6I2G^7OD;U$DIDF zX1{w2wGriqfue906$ZVfGX8gf!zwFqD-}ffF}<3u4t-mz7la?np+Rq>#6M5?g7I(F zRt*)pRvzf>l=$lj2Nmz4Yp=Qs9X4`-JE#eQJrw}%sEj`!q<0o=54`y*@#hmhhqec! zgG&7QgfGIs0s13K{P~2>!=C|WozHk1>8kt0iE;zA$^ShT~t}Y zJJFUi-Y??`)9ERLKSle>{0nHY!CQqs#@K7^q5=~CEi?YsMdcCv2|Esfyq|^tRkMG$ zi>e{?gLK5ue-Qf9cvmz3o1k-fC#o#ax2rlM{2SE?gT=p4IIF^q!Ma89FBHzE(6OTK z%J>&T{3L}3i+ZTG*P8wY_0T`!p6gCv6oAgb<_p1vicE+7`XW(hd`CsXvI{?p6&i_h3-4FO7<@~So*1dse zDd&HszwQtGxN`ni`shBu^OW*>G?)I}+u33>wX zLUma1c(eZg6;%?=2OZw23? zZvl?eYXlF}1A#+&vc$hl-v*qZUllx54+YMsgTg;t4+l=vp=MV8o%&ATta_2urx|(% za5lYP@FQlwN3vdVo#h{3$za{jC^h3b8^*J=l+#X$k5faAD@!8JpMSk*eHKIEU z_Nf4Himr~&_CRwAUuEnS=F#6XJwjp3Jc6EA?-pFz_~*-~i!gsn3YRzI|M_*2#4l&| zOZ%D_x1exYWAC(peh=*zr{5TRXD~jX%i#UTxCxB`E~F!(Pm1yXR#?{&Z0#!+(Paha z!Po=rmFR{n|5^%H#NHtEZ*+UXmCXLh;`&kF%D4X4O6ZpaTmNe%^+4uF`jw48y;552 zA%v67d`W37_7K836dHCaqs1OVIHwsuDXWJ`{Hn&EUOD}_;8dy$eah=Yg6mQ};0pRD z!S#%Ng{$-h!SyjVfZ0i%Am!1(_=ByalLcR6)}vI`1q3%V{wAyFu@c|fcc`kT3a)PU zlUCES1Yd3JLsZxE1=qk>2l`8Tq2QWkzN>~_F1VKQPg_%O5M0~%ORS|o5?qH;5x=&6 ziSI{!3Kuo@t?KB0a(@a?LC{n6Fu?`Qd~IDlUT`7fudkk-&KS;y3S(>t{U`l|(2Kwp z4f;>|L&m6oCC&PpYxH`-#j&@HS79$>JdeV~FqVY=ls+W)*ZP-ltP@0DZZn_NME}fm zq?gOA&$(8wWUMHh9dl>sKk1Jpelo_w(0|fD%uh+)k9x!?ns1MCdFO++t zu|D${|5j*^Z?d`&&pdqYjtLluWIGwhv*ODY!CiNLKNxQl{?~Ejxl=wKm-8$6>0=*! zZp}Q$VLm65X)L!T`VIU=;{5b6&qxHO@im@H(LtINm^KriyAf%_KPiu#i`)|qPy2@p8PddGvzD~v* zA9dgryQieYRs0q~Im*3adqx*A#*zV;%Qbe71M{U1EbAfgyE1o2zE6D4^}3tfzh(n* zpAfnt%#|{A{G5Jjy83db)CtFPC*<56Qy1KIF7HBEn@}F1HbM&oUWaifj?BaKvnBsg zN3M^2|2a=w{>wUCXpO&1t89 zp3(>cQwYGAYe+~NEENL$M-_|YwkV{hCZ>pe4Vc`|K(_BK}&|b5(v!e3Y}8~Xl?N6L}UUAtH|3H1o!2;!eWcn)zEBXC@{8OQY?{gLB8 z0bV}xv&D5d1$^bC&XlN&6)))TGo8zWk0;T8=OdRf?`QfD_)6=e{_J&UON)oCy2Z(nA_*ydckfz!yU|DhJ5RP9erxi$E{x&EAsMT?H&JS2=>W0c#`1!#=ikZ z^d7*sPHytM2X4Uv2~GVOYx3I$Za}LZpcD54Cy+lv=frq?kiKG^LVh(f{t-`!%wLxL zVcrbTGtkRSNBM77hjGY6s~IPe|D(!?RxpvOFhB4b?-2OI)P(W%Bpa_0NKAVrvd5BVRM^$msTR*8R; zncpfxvlyd1o>gxnnPPO0(8s8`z$K_DW0bG2+5?xO@{H$^e};Ixx{P^OY($#er{E*M z^Zpe_?whBV&DY#@K61Ja$Lhe>cyF-d!Hw|WjeLN&Zw@c6m-)W---)~noYNaG__N4P z;9TBd!8;vv(4LIV>7Q8d^IdF=1li=-<9l&|KV?C_=m_(;+TR zzLUl2$DTipx4Of8bot~X2iCO-nzvl!bg`^cg~n)a-2?59t&}dmBV%5r0kRCx*og7m)}#aj<`0#9r>9!h7gN+ zPwXGTtPjUO`~~=*z?cJ$l@NYGNZf^)zlt`WpUlCm$j-ELj>p${f3%Ck*Dio3)909R z!*Ndxe|VnNr~kw>IrEX;2z*Pv27Zpq!Cl)e*BJA4wo`JsV;ktmGFgwFNUtj}?_(c` z<0yp52(u9$Kz`mtcmd}u=XRW@*PrzrhwIGyIKn~%j>F~1va__peMR8-oSwUPuKYRA zkL*axx68{t$Rpci;dt&E?^SpAXY_XaOg)L?iwMleG&fen=doi)jC&olIjyk9*1yc$m2o{=VN?V^2D}b+&Pcq zx^tH2&N;2752ndr{Ngidd1XFMi_>HqN1491n9GgjbJ|Sj!1^tZ(QOmt9EXmV5Hcd~ zIS~pWltZY2&@o-0ILlVwj*#kPeuKnh0q1T>B{!&n6~>md*pKt*L-G=GjW`U zun=K|T;qB*QqIqz4#w6whgn9iJ;=|iRt}fz3f!9y5SV7lzlJ?GWsh^#neSnLgxGt) z^^e<_0w@>fH+K%M@paCJt4Fc88p^D(lpCkjvqG94Z$cN=!PQSba=CK)%*!;cqx{S| z`LVLx{o{D758rDSCo$$;xw^$N`QEa8F7K; zboJTrOW8U-8qCA@6Or#_U4akqVKnzCi;E=JPlgo<+Wxr3Wi!;vfR>Hg3;(*T+rfV~ zofG=>43C38mexE9{+Z-=G5)p3Q~UWgez_ctb6`~mot|xRbyWw+-bcR(e_UMlIJBB{ zfHCwL9=M3onMzAV{^^8bkpBQJ#(iM=)A28&g_%xenXbtHCjLj@8T2I6yOBRT{&C=k z=w89&;wJzcD3N@uQ@nb#jz zV)`ud7a02$`)RM_e|4s9nb6~)je;M~^ak)DN@Dq_PkG|%;r<+^@lyVM!;hf+k5WYH zN6XL+7$yFZLV`aIUJLvaHD%n7{H>uX$o~nd#aNTyEA#>Arzn%?cOg?@=y#U(NqugT zVL0y3c^V;jZo&r%=y}m(!CMnP1t!&3aKD6Ez*@CreY252Hf|d94XARAFOYvjTwmaL z)s=A=_b=`_;Ed{O#;3_26gL7mi<-_jgz=-eZ-KL^kEA^FsG=x_WYt%&?B7>!F@6-| zb!L5BZna40o>_01qMi`^vsqu5SEVwZNB#;k9+Y2=V2t#48UODE)Ktb8|NGADS1F{L z%l&vTUvN_FKi#{Ia;tmnB}ee#HmRzlDlfQ-S^v{OUBl_)d1wjSxxC)DFJqKPd*i>Tp?X^M>tO8(tFnTdV{ZlX;~y zu5{hSbH`(K(q#Qr=O(1BDNIU0iP0-GTW6H^uiOVDR z-(&lTx1yZ5ugBN9yd2*fxW?)KfOd~{VA&BoqmEu1>2O+C!d0L{Ed7lbo%!Cmc+BJS z;*Lz?{&*~(qq(Dt&)>OU+$|juM3Xuz}hsC+~7cu5Ucf!QX!FTgmao(yqa? z!{1Sk*L_d$y}ll8!T;sR-%tE(aCy7&9M&QBd<5Dwz81vMjivn7k)Nlp(5^GT3(W82 z@-xWiPG+op&Le;Sjzyl&-A%vy`z<}LM007orQnf2A-U%)0RSDQ7n{ryH*=Xt%I8)3Ptc3A!SnH;h$EiXUqN;`M?t98deUUM|}UB%@Pd#xPG z!eMuGW7Q7-Uyt0kb24JjdG5enPk-b-DwjvMdbrOBMX@#V#CF^7b=R^<*(||e0mpZ1 zY5(f=x2(tWUt_EsVLigf2zwDYO`b#H`}k%%tD8G#TI@OBzi}8nyIh>@he3hkA^_{H`2g*F$r=zQSR2m2g`4C`Tcg|l2m9>Zjw62; zJe%hqKL?!szv%kAZoHpS`^$3d%fai}3Rkr_m?sgjJ?h#HxGmPFnfM`<{ z=tdr|Z#&l2@{i8(8sf*(eN4yrO%tyL=n0fbDkraRyM^gF$$w10f>KYU1tRZW zZyxx=R6_XMF1-TSznAF zms72vMnPK5I4k)#n)PI*=(v%O@ul3ap!a$edEG&WzDsf+2ChMinZG*uZH)b)hV(vT zjAzZm25hz;bH>Qie!%SS?ntvmekN50Vmi}joxmT_e%VkJv{GH@5M$_HJyaLC8y#a@ zQ2W<}t_SWxN4i-0+ewE|+j>#`n}Aca|9+-Js7?K-17pPhCevx)ffPT$(vQa{VSM-& z+SLXaTQx`HkL`mR4F1II)3T%0qhU9K-c$Q;#UDZIeH%R|<(nZ_W7M3X^fJfC*5#4- zL+fpEJMAA$>YR<}PI`ywkT)~?E08zB;_ezVL!-byikft`^u8I#qD2}*<3(S}oE78W z6X+^qpGEsea+itVYk}@yd2Kajnua6(WQ!p`N1m%u-=@$nH&}TmLT6AuGpH)--(CAN z;`yyIliulX>G=~XBL8!!A=456nfMn#pGPIRKB2x^dyvo27|HM1oEK1^UZO`jfR6Hb zFz_;-xw>9qb6)TKj{8Q-eI;v3U?M()%UA^JiaEBGZ9W;wk`tM^7?FdKcodgZ~)a zDD`iD@N3{x)C_keNn!qvkUV~^YV&xj_N&D;MtqOf*RkWTx0~_~(I%mvjmwGn8R+_2 zmVaen4fIW<Gd-U~kjx zCrzP8YXE!NzeT-<=czC$#?Y^jvBy$|R!RI%;*LY#auiIp@?VVKiu+NK8c6!X^d>y7 zmFWwEvEDgQ8TwYC_Zefps-u?^xEj4~^uzNA+bR6~R}y(U<6puXrxp#9^g719hxF>v zZIb_Y14j}6S_+x+(*A(pPUNQ<^%Xoi^bqPVM!^La4&4Uah8|#y{2dHsg}&`+iO^Hx z`vG^P(TvM#e{N_e_-~-I65ok(K6Tr z`Mrl)qx`_=$C>ro6U}?9Za%bZ;Ny4NUg*zb;?Cy*)4mYee#FfH`CSm0w>Z+SiooXs zaU6@ldnNciJQqj4&hdHtF1=l2mUTJX#?0$%A3Gjr>o?Z^G0WvXK?tRm9c5Smfz#tS zeB{7-xU}7Mj_356hj~*hKhPCzrQaJH{--<-J>TyC42<`=9jp@9z@$pDTgYeenF_O*0OCFaCYV7{{sf zu)%v7qph2XwI}@RDfB$#8$3vGL1UkQzxQqY;&}J+Z=&GJX8srLx8NI%zi;%|1P{Wy zh<`6K#+z$2jWPJ|e}9+2-zD&`D}nU=1J{S(Bli)wKbC?}lY{gd9L*ga595>I3!=Z1 zg1~Du%i~xZfoa@tc^LhfK9I|Ei!hR6j@irpv3b!e%}4$>UH=Si*O4MNKd<7*eMl}h zH^$_2U5M3XhhhSk50Cpi*v6I>pO2RFk=NPy%){egypNyH)343uHKv?S&UT<7T!qjI z{A{D62F`ClaO+U{=xkYp@nxR_A(rmOsCaD3jZ@u;ajOFec@cQbmvwM!g?XH{H^L}{ zhY{u@ypHe=g3Ei62u2VjzLUu^ek-jfP&Z!YIN)>f-8GJTIU5AAW5t)VH^A}S_}=Bl zIhp=vYznY$9H&cbjG!R!{pS0`-Wo;Akw%>HkOf@W<}yzkQ<8X2$pIJgI?U!?LfUhr=4 zBVeuaGsbwr+Th#3A=QA#X9j7%PiP#v4GC%~V~lrg4t)lkNxdiIH=l_ zcL7&dPYSM_P#?IqS}*ce2i}If`s#be;Qu0U3iw*JMerwqoxm;BK-Q;#_P-4tgFbE5 zLczI0g`s~ZHC*&P9=r&8XZ4ui451vLcUP5UJgs%c-WX5ot?pww$`_qB(EF)8| zXWWGJMyr?2_^QU2{XL-HZ87qjkem#8W7Vx9|FLYRvSEBrjpp&oJlZdl#1!I%p79+oR;}7GHYAWXs<9(F^bx~hlR!Ji7#Y`)a z-&fSVa{oWfco6wps?G_Xn(2Aam#a2X|0jeVM16Qut>E-=|28M?K>90`C-hdKwxF+6 zxf$bm>lo?|{Fb_s{r?1v)$=dC{eNfg-`W4q+}HXK2$`=2JhAF4B2k?k`1UStffVKCY<`3XI^&RMG{s4}sBfx3? z0B%>e1E=`|xIJ(?$~(;;fVE$q<`1Byf^n!Ae*o4WL7G2+R%SjS%^yHtg@V9-dFKzH zox(%_<|v#$fVK)1A;up-d$WH%%^yG!RRr`je*gtk0pK)$0M>s%nm+*RpCHX2fVF3x z<`1BdDunoH{s4UC1E=`|D69$tr}+aYYSw?J`2(>24buDpyslmcf0{plm1-q$nm>Sb zY8`NzKY+1;u_)gR0l!7hSW8vpXeIyR=aV4KQ`P3 zoY2U?NXTmxwden?dKZ@)NA3B4s6GU461C^QOYH)N)q?A+yvb@Z@O4pp{&@m z=d1a^-JB@Tk52d1gLuWYpfj^|vr8YVW^B zpa$|cI%@C#>cG{&cSY^}&oK5eCPeN1&-7+O{$w{F6P{-FqfCw3`=8`Z0{y|Lz5n~X z`+#Rh?fqN(tUy0iLf5dwPcv;lm|D)cc zz$@uF;h*YF1zsDq|3BHA4E#>i{{LKWF7Ufi`~U3&?UCR2qxS#X1=;~`irW7l5Euab zVbuPAk3bLLtx@~`HwA72{xoX;zjL57@OIiO_q$u58*rLGfWCpgz-j&fI-2qQG=BhH z0$o5)^9Rr=&v zpb_M0<@^gY3^WAxl=Cmp&+NAgsLW_)A(*P^YWPaX6!kA)?YC!*`WINLmVzxQ>R(`m zS^=Cb>R;dq?+K)zJ?dXzty&9ua@4=TgWiLn=Tts=K_G-5_8tb#9rZ8pxc4}4O4Pr= zxWG8*nEUQe$<~pbu*t{B6^;56C>SURdBvjs1PTNS z02fye+x{Iao1^27{X)*az-!)XkY6h5U*Ki$W#H0L{{joV1;AyZ{sk6!i-5~U{R=Gg z76O-x`WIMk?CX?Q&cDE$-kYFTi24^;?X3o`81*l(##;kiDe7O~mcT90w{q0Kz`(#j z;3`r70+r4DWL4$-3seeJ0=-()zrX=?0QsvP^)E2Tn*;eZqW%SX26}?OcGSPXG;bQ{ zsZsv|6VwF6uN(C*FkX!ZuBQ^D{JI%`F%6>r26_j2LtewEzkzYyILK=h^*1moFbed> zQGWw1C>AIN`7NXV21*2Ybfi_(-$3y|ap2Zbe*?V&y@1aU=#st4R9>aU=N zstMdR>aU=t@n_Oa%@=*1($Anh=oa-~a2%7)jGg}i?9@Vh^a{#ZeXdb3{0RH^&VRu( zroHT`7K^;+^fJWn8TDsSO;rbfFXj9hlxG9L_+EAX3@WQCzWf5V5~hrrK9{WrYty$}3C)PKWfZ!_=$RS09boS*l+_kb5h z{Wom#HUYmH_22M;_W|&0QU48Zdv6239`)a_!`lJ;M$~`9r{1T)E2I7!KJz{UUK{n_ zu+7^ByivLJe;M&@%)hP`O?&6pHtmg~_wiWq_{9*c1>uz)iv)KkeCVTQP8Zz9?5E8@ zmjq9zM?ud_DMp_5pEC1@iPS{!X1wb#9!Nu&KVJLw%zo4`9g_HW!!`h~?-PGP{%YC? zoSnLW&g=iK#@ZY9?|UsUKOcq7e$!+#&dTGXvA%Bq$T`PxA(o%zyD|I!SB`&$pXmQp z`|W>~jdmWZcQ(k+qNe{9w%WOVrnlGL6z%5?2>-0TcIUrkr?(UB!Fy5vE!(~Az?-A~ zTjB%pXfL-!{kI(Vj)T56>c8bD?%5< z=!_x{?xcW=Y3E-i6bJzq*UrDpJKj5xS3*1gG8?^(z@@bFFSF0v2V6lr|1x{My}*^V z^Dnc<+XGxxJO47fz1_gowDT|XmG>2JJ$=5VeLo)X4gfdQ@SS4rSB5|a=yPq<|IFv! z=b$%@`k&e5?E-EV^*{54_XThZJ*$GowUxVI5zbo-G2G~Ap>Jgg^pt@2LNp z9Dy9beWU(s4tfU>zhBgUP4+-`&~MhoTHF5lU1t1bpf1qQzW;`MBf&pV=M?%dZ#eKR zIv+5lE2^78qYroMywEl6H zP}rvez(cHm9CXL5f1KN_e;nWW#~Et<;{aR#IJaB>IN-PbafVs{IAtkp{o}xgRzakf z)%nM{Q$Ne;_oA@1S25iB%NgqY<&3cYauB}>#&*#kwEl7yQrP;-8D;(D+zkJw#$NAe zZT#iDM`7zP=Ptd3^ACB}9>v{yEn~>D_9({aJ&f<5a3_q_qF14xW;}$#)}F{XolE#z zV{90^G_>)*gZx?lI}@z`9boH!=N{{SXCsBJ|DB1}|4wW88$;g)yBPHAoZrI~Zi=yJ z%$MmREFbz^Z|r$Y((N#8%lagu?}YJB-G^}-_@6WOlc(sm%#ZY}{gSCVS5M$E6z+_* z!kAyvIytfcNThA>IOVrZ)JJ6QP|o`nUT&v(1TI`K-Ve^ zw9`XT|3KF%IQpZ9qyB-Kn)#GR^h}o5kHT%uda#+g0%PRI+9#Q%dohOpnU)xP$9S#& z0mI6y?IKpda~rFJM{qlaeYAY(;H*mnE%r) zxqJsucrf83i{|Q2nU4JR!q_-gYv6{eQhm^c{+|)R-UCg*ZO+zZrWq@I9cjF&<0derEmKb6V{EhWi?ONzZFz z-xuT2+49p*DvF{tc6=U=Gp3ug=Zx0IJfVl+B zCu%MExe;>-_`XQzpJ`D#|4fV1`Dc2?`ezzUVe6miRqLM#&trXR0C`KSe!0a0 z>z@hbYyC4Vwf>nvxBi)4Pv@U$SvvnrZ>00jv^<@ErZ?01XIhcYKhw%|{+ZrN=bven z9>Vnp&sQt>a>h?=^ZTm)GqS?uNM&d@t$sa{q^!@1J$nzf%F{-)X%z z{+$+4xB&JRVKuk)?}YZz`ghuB{X2o*`geNU`ga1h{+-^j{+)oWf2Vh?e<$DhcY4qI zcLLq|cY5FYcLLq|cfwb=4}GUn*!p+cq>X)+`k zZTvfRps@Atv?c1_={YkV`muKYovu<9@jP$+pZD+dzxI9LzKPAZ2PXE}$5DD;Np2n4 zf6||m^GlN6*OI&L{FVHXe6&J?o!*C2Y-;zU z-jUO09^Mm`o|mu1hV*oYxvp`#|Ejg5EdOtRQ~!B?Q+yxTN0jl)gl~Lz&)xMAxHb{t zL4-$R=xmpPeP#WXeyNl~Qh?Z^M4 z>tp|{k1I}t*D}Z2gDZz`@v<17sELr?_m#sO@1<7Q8H}(KfpM%)EY|-RK5h8fjrEPy z1>+1u5SYJ2U5w;3v*(QY9`W&VzOpK|R>Wff|7~N}{|&yk{@rEbe0^=jmjeI#o?KIl z2eVqIVk8Oo)UKG!VQA5RcsE9W;Qg2WWjh3!N??*cH84h8^=;*NMlMwO>3`3dOlfmEiTq zS+u_@)4RCs>(uvHM#JbB>ALGt}{SuXY?&{+IozS3gw&&>HY^v$B@@_Lxu7U1 zN9wAQ-*z8zM&TmNj*JYW20m8D{tcQaB zt-N-qt>yF#(dSZ51$!SA^vx3g#&9Xbuc*K4kNAn&uadbP?r&B7IOiAkKqlZ1Z#9ci zzGt$BlCl0*k74>?P2=&0-mAr2KG{!WK(oGnO!QCAToLjb>Ems{5Bkc?tAMYy81nDJ zAJ+Tmora(Mw=-`6y@gKZ{S-a5f6?Rl{Z_iD=zBgf4*6@VJ7c^}bwhpwcY)qsoApas zVJ}(N!yB=qUV&wRoZiKZNhrV0x=vS%hh=*R`xUzAN+K^lOJm6Es%wjWb@L3)gY_^L z7tk2}xdZz3)b)k`-YomU-&+sj@=VtLzMN-pfBWk093S=RPBUKK&tjziUCKq=ul{;4 z=ckv3{fP?D_hx-S^y`;tGV~jwKNMU#Q$652bazSbK$cEntbfqW` zZRRJJ=zTeXD`|gf?)#zNYx;Y}NdNxa(}0)iQRtf)eT=>B*Y)7az)Jgl&3N%LeVF9| ze{be5-_Z98e^sguEtl(DsBavyP!)Za&P<0bhpjC}QWoT9cm*z7DZ|S|7IK?|z|_!nnVi?R*#X z`zdl9_xD3P-vzuZ@&@oncD@U^KuSUIZ_#Ubeg*iO$YIbw)|&($j(iKeRqqu1ZR7~> zC;E`!Ba!cbKh?(te-}9lyiH#cd^GYs@OC?&2KjG9mILo_^J)J3#vkBkc0LXCjghxO z-)ZO5fHy=o0)Ou2)8Iewec&(bd>ZK1f8Z`Vp9cJPp=+xax$d@1>nzdd&T40vB; zKj?ey{2B0)$ZNp+?ED$<(#SI4FYWvp@N1E!!29j|8St6NFTh{f`7_{OB4>dQ*!i;* z^3O%i10S^WXQ2NaIRku1AH@43(3AWJ;j07he>Vqjr7`^!zD4@b`9p4fw~%G4TIj z=huK=h`b2=qn%#^elfBD_?VuD{sq^Eq?Bxk|C3%II9p0~;NyCk;Or^Mz$f%N!O1B( zflulaqEF$JBEYBg_mcmIjJ<`^ZvM_c9yx*Zezx;>Nbh3g67U%}f9C@s{x5d^4s%+L9yQz{@m?V0&G@SlpD2EXT-`8nW{DWyRVcvj*KQ1K*oXs=yhoEOkNdnI9nfXKDgp>@x$)1@%1P-Lc z0q5{!{?N~pk{39qC-aAXVoDa^T%MUf1b@bqMBv;}f1w#tG6F}U{y`%t{1uQA^$(ge zB^Pj>sDIGBDfxi&dT#xnCN#hJJ%MJG-`8O?AFZjE;7qXX#c$3U!2CYQV7?0DsI6VU z=r_h*E8efyMX>chk%45rrr*cxf5?O-7FK>+v;Qp{$$Cw{o7ta{OtN0nAE@x)po+_S zP5%b7pCd1o!B`aQH;?8cy~31Ba0@eET#PI;$@2l$clF+Ns)u7iTS+D6A#oj#L?^X?+1=gpMd4JcV3yXo#|0rv| z{~FK|NiRa^PGUb>9xPK(<;m}A<`)~&1WB)rnGbJDBR{qBdYbv@mh_&`JDByAZAsQ^ zp?}aH@;cI4q2Flc_dC-(jGM7OrOkTju5?k#XB+JRe|I`8_+$D6xEGbQ>y7-~v=_J^ z9cyLN--*3HydUgS;ope8OX#ms55cd%HXc69>4P?w|2_Hu_*QyA=x@<#;32eF=*wvZ z@KCBH^p|04kL?ML5WLi^4;@K+g?}@A3-Nxi7lpo-)&t*7vR=#2qw*n}$UvCswnUjnj!Rfl>vA>oAz%P@m z*YfeH3cQG9y%zi#pM|`|BO>?#N7OGwsh`6uZ#=*vjfYx%iU1oY)3>$UviswD86 zBOeB^_F1r@^BA_#sZvmXB~x>0aVRU4OAQxn0}%=-MbG(vEy*>A9c<_m6M_6NL6 zvi?i@U+OtpD;S!1ovLPm}du{uuMUyq#qImp{sU|Lq`I|K&eyzAwHc zS^wqFHvRvDWY&Krl0Vd}e>hCDo7?={4BK{i|I@dE?R@@GTEn<3q5nDr^dCspfB8ey zP~`VGO>Sx9PlazWyr1b+!PCwA?KH{yFTaJ^?|X)VBL4;0j^zDavi{3&s+vLGMG7^u z@}7Y&Fq|n_|K;2D?^-RA=d--ouMklC1&=WMFN10Yw-2~KkJDVl52?3=K1|(-%NdOS z8=imU@!ng|w$w*(W8VKS%;8+lwzIRN8*8_N&-oL9^T~1e$k(31%Xc7-JZH$5ue-7S z%h~eavYCeX6Cmp;962t>`7`!CnBUEV@Ocv2Om~gtaT;t7r4FuNCp5P8!8{z;hKGyK zygXmQ!P)kRr8|DM|H0>M_k)ic(GGIl|CKo$&T9>n0Uw=R8@BQ2@YEO@+jD$N%FES- zf9JeUF3k7*x6S)-BQoJTtT@AXP(eIOy!ZUi{xINl*&nL5{f)`u&i=r0jCa1#FLhWi z?|bxwenfB7#Jc7W#QhbE|10z>a3zg@#gq=5$^UX_otcMe0i8ylV5TC)PH8I2cpuyM$Ovwa$}-0LDxsXp!{ARmO(?h4 z+{Ya#uk#2PV8agv$^OFMm^c4Soi_=OnONTHm3Weje@kA8$$R_%Bfq`3Ub=MQ(j6@_ zHKHXItX>tN*9e3}qfnuLiCX*Fywo51dDQzVtJf^(ly?C}2~0e6dj6BY@?PM4Wvka) z&}-+*80|3npd<1h{P{jn*D6-8{m`rPDK{_r$CQ%w!+!3R2*v~Qd1n1Ep6BzC3lZ3> z@nrq5e<5-a*!PCvvxT4ck0M)u3wWOk{w%T+xS)4P@XpBRz=gb@1b-g+0=TeuLGTxm zUBE@W1k7i!yj_vqz(u`e!Mh`SfQxwr1n-IL11|23mH1mC9|M>0rV9QzvK6?bH%su= z$S1(1y!nDZiF^uN+FL02)5td9GTw5*+alY6%X%9GZ;$K%F6VtDct_+j;PReXKMZ|O zMos}&@MQh4Up%EG%I_-AtRDtlr+B~>J+poo*iR_{T*-T>fX(l!$ZEu|?3wk$pf8WS z30%b+CiFKWD}bwd;{~sXtOTy+O&7c}@)mG)?+L+gMOFb{?R_YCU1S4r4R5{RHIa3| zHN9nmS4Y+W*YeKGc%J>^ZE{BmRwa0Bmqo-e`t*HE**{TlBK=3{w0X?k!5UO)}K z@|X{0+&k0dE()TL;S5b|NtS5CYSAJtOOK zC7xKC-(68D1Sf~r*Rq^g9=Fz%d1fNaMR*QjF#_B6i{*84Sf9O^4?BtwtJ9%sX?hJo z^Oc1AwssaIFluADcD&`4T7rx+wuCm6df;zmzSk4! zRly_G(?})@eb4FjBa9#1kMy(CFrjBQ<10DnHKULAZ!r5oa?!htYiqxknO}<#Th(Lv zKY6^rDi3uOJlX6Q%S$B$=l9BcXdkJ8=)WYi3Hs-!kl-V6+=24xjHI8UYaqV`sJ_I% z(;I{M1&OWdae66nW0Ai?wA<*f{Xu4Yq6k%x__JW!2kjvx3jcj({;?R%72F^&7y1^b zNrLkQY66#_{SrTu&WiL)(kP=J#{WY_ai>dBW#O;p4TL_W=|SNyWA^8lp@l+!F7Q6& zm8JQt-viojVf^!!C-y?Y`ZqEDgs-B!lK+HYHsrq|wUYF<8~ct`D6hzyuX7^3sWB7>%8C3u!4W9$8nj;I2NSR$h-%Suf-A(INB-(i zJ6wh0ejX}<@=K+=aW$~f^@|exc7Ig^Dkt)C6Pho! zPbS#zmuN`rb%puu{)j`udEM?_v`)4OUy>?I_SiunNewqg5Z>xCZXrwn`8 zeh_T;XEddJEN>j-^N{?Aa6Rer3iuSXKw4qKeADdN5%j3N`_wl~D-1R?mtrq62oy}a1$L|%_ z&d2T(h)p}a{PdW0<7;;!FX?H&hh5y*^#1B=mn*k@Sj)oq|8i+vj{kCefArd)DFesr ze1~wkT+ouuzOO8cc`nypa~_z+aoqXk(vGbQ{G4~VLYsP}>#TpQ z4AyJb6=bC64Pd=r`fHbKYuvStxF^i-j(i_uvAdp%Zw1aXzvt4IE%WpEJ&*Ofy-2aw zlJV-kTsbih*DXG}!0!q^zi^rNB;Rj-UZz3kKXRTv%~?y(qs*$PGD7S*r^nBod#{#2 zTflMonR3r}3n^E(rzy66aD4Zy@p&6O*S|XA*SZ!xbLB#vCL}+0`oeWdj~V^x2~_mJ$GqvIvf~tALez0^yjhr-(t^sUmEke zquV>i*9MlhWx?N}TqbOrhrd0`O+g*NT0lPMy%0>}{#9%^gtcxQSg+3z|7n~TN1MlS z-1jTXb^hMn_5apAAOG(C7XJ(B{S~&Jo|`SV4e3ApQvcz~ zKVFzHrZL59HVSX_L0<9Y#j7oRd`S^{^8Xm+3Rk+0IAG>unnEZ34z)82Ez)r#fh+t{ zuW%igrxz|fDSk%$QvscITs)?p{BTl%x|0gm)f4V(pvN^%8WRtNuk;&tZJktPgx-Tr zVSE;1U;#fA-miXFj-UD~zF&bqQaIr&F+G?eQw`Ru0CYNsdB`$GbV>97%lyAe=idne zNp<^}@~Q#FJK!AwcX{~zcD?`O3XUn5jyDj#uY=A`W5)Otj&Gn_l~hfdJlMF9pU}8q zt4R;`#Oi1H72n;~=+zrK&B*QMM@KmFKXpv~omgi64^Och-`nsB9u7PytFcyxAKr{O z;1^#X91zG3>e7_U@?fV0vZkvAA?x41p34UE?*8X>N2 zNz??G$CE3V^?2E6u;8oA`uXhUz0L2>6r{5*CtLW!`yY99{ed^Y&+l=@PxZqN3Bi0V zHnhfdeurc9m#)6lF_jCgg^zE70-S69C7J(!;$Qj)_)kQQvKH^&DSA#_mv%6Em4!}~ z3p%~fX#Ba~U!fOLY%zA8Z3?Jsm*ZyMwlQ>i3jI)2ef(@|A#Kare}8k4O1Y9eQ(jLN z#{4L%;{!&o=gfcKHwRjK>C)Zy?BDf2l^QOx_wiX2Q6K1K-`n>a1^hHM#+>^Dnz{LZ zxBfTrD4s7o@6%!Ho}d2(cx)NRnf1N_DuH2X6;FQOz_X|aLF&$UHTjy|WB7^kd*PSWiwK#AKohOozO|X8tFU8uNZ7;4k!#czVKAo8wE;m_IFH_Acn8OLG&glVsGQ6I)(_V-;EVj^b!3(GsJM_~Lpg-%KS)&#af zzx?!t>+RUx8j_yo~&> zjs3xjv|i{(jeWnW^c-X8KiAj`uR%`;eWtOOUWe9mdV>h#y%<12Tk?jaZ^wrlP<`QV ztnd+s^~4HN{?BGSh~|G_L!c2x%6V? z$DXr}E`I}2RA0Ab0{<7 zhn>H2`Y`w*;%BGrLeCV+1bPmdfxZ><-yOUg^b}f!7YpO>g5LobpnQcazB+U@_zO}; zw6RQY6Kn%|VY(j6uNe0+^V3CXUOtPD1do7ToQmYN_%`F;yCe-0{w|>|kXM>c3V*jy zH{h~VN9gTB?SRYER*ciJ{0^ZGz!hm5UWSaDgqi?XrK0sL-WJ@3^s3PojAt>uU$7r= zby|+aMU3N(f3Q?KDCPfB@Fmb2&;ZHr@!)abhIFmq9-$tP-+W5;t%Yd&n{TG(E zFSrleut$|xn5?<&m@9EIf zkl&h?O8O^*CqZvZ+e=$|*I-xRcFtcsZ3%7x?nwDj89DxHsxtGgm_kMoUuc|^tqwAz~f2bgrskPw2dI)f4y3ozWZ>Bo}hpA6bi`N7WKz=ff7yPyHpO=gBO8gsjSMcYd zb6qX}D#e=Sr+AU~w%P(*fRY4nHU7m4(|Z#CQ=Jv>`{GfYZ0zx(a*4bj=@jl-IeM=P zqXN) zX-^d-{mjZo`kiQ&(9Z>O$6+-Xr3$^2@u$$8YKpwi)KT#Fri`3E`ZME=f4{!8Q|Kjh z8KmEzvWUEU0`~`a|Ie|Tz>o47fxS7{fk0aFcQ>95-Vd}v;%C#v5Pt|IN%;kgz5d&2 zrRXzSO@){{X|mu{;~!`=y&(7RQRA=TZu&;zj}DAO`r|2C%5ReCjZdU`jN4*As`=i$ zkLnBE?%$Y9?F8HPO;agVzB0sZe zj_`Lg{+Ax3Hv|s|41&D5v|jM7#=qQC)JETtxlalbR6 zFOE@en#wpIuZKV@fc-@M83%ZMLKfgRXf|WW&t}$3ET>e7Z~Xk;|>gi+h~FF z&ImUnj6`5vm|g^WwSY{H`!ntxA0I>>S+{Eg_UNv=<0j$nRu3LO5LgzM>(&^#ua?E` zb~ByG1NagAH~+!~ z%=1V4gZohnHc~$6@3s%N2Y#2PV;)RFr(VHc!0#LTMvPw!y@>w9CaRgs(x(Ndf&LMF z!2KJP+nC@O;BEBwjh3!M8vHwGaW#wA1=oT884Z{C4;gzCyXZclzZHB7^xafh@T%Y{ z;61d2`$K!svkUeG-b)#;w(?d6R|0=YGpbtrdhm7NuPC$huiF~`rw3_5M@!Eb$_RbF zp%JKuoS$-`O28+mu=G!#2|WXRk`5HK^y;DNz^ACD@Rtdd0X|I+N`H7oa0Sx)nb^t% z%WEEL4*FTDCAdYX1@L*|UG+?F8fprBk)D$B?GfyO_(~m?{%^NnH(;%9y}|Mq4;2T$ zr+Ae#$8Q;G2^>^QC4ap_y?_(cSAzS8`U7WDU(~exp9epOyv*t*F29jzgM!_Gv#1UY zE&b)t%is^I!jj)vp;^F5Dp~N%&`jX$Dj@ig&?CS()SZ&QPN5rt^QsFsT6u6609;Ug zD%cBoz{OQ}&Mz|1GuRX9ms0PGejgeC(q&YRt8Dx!@x0QloJy4Zp9`J?e|g2LsyYAH zhpvabii)i)Fm4uV23%P!ko&(OxB>iC)YTF{914S8Rn?R7UL0HudPDVz@GlE418%Hl ziM}gCE5YAHc?GQeuYzBJ-c+4vVDU?4{p$7Varqv-C;lGj+ft=UeYiLNUf{NBozN%6 zPXfMCwGjG!@jPqRT}=`CxcG6vy;M!XW8=pH->k9=o)A9)c#z5>@h8Sl1Rkc!2);l5 ze&ErH#{;=Mrp2@UtqE$Q)R%ih_aZ+N)l}c=|7Gw?!b z{Z7P}U9cVS6N>GUvA)wo(~O#oi3^2_s_ zA(R35H8qy&cUJUlgS{btsoE-Ze7b%KOIPjlla=NenwO-Wc2nd_dhS z?ep~Dbl^j(WP3{=92^Y%wW=!k*5Iwc->5!-_*-?C;Gw~xz(-UH zW7LO1!9l>^siwGhoc@yF65t=z2ZCP-z5;wk-5_{Pa1F4ha|nJl_$qKnmlJ(wnEeFt zdXd!M9l_5)59`i#t^C(RucJJ&>36t3)`n-j;7y=s*K-P3Q!go*&?(_DM}FG9~B$`4#j_Yiva zP+f8VZded zBl3Kn4xR>vy}8`Bd>;uu0$f=SnqcSWX5m|a@v}wD_e1!TxKHEIUh6p2$51x*uQ-49BfvHE zEu}2|x?oe_no(RWSRJ^QzO|^O?~dC8`L*?E!F%HN0@u-f1@DU64V+0Hd z)y1~1h-K})VDB9i>>|SdckVrR8UYg5Z+E}%zXLDt{q8yU-gEo8=iYZ;vGj0yze?W( zJWEby{AK!Az_aBn!r7wRhV+fVC2|4NH>Q6He4spr(_8AAgYXa1*e$wEb?pmWDlcIA zzOMa%=V*KYzBi)mb#vt<9NstS-y*zu@*c+DrGF1xCa+`sZTfe>^W_>!Km6yp`XRh> z*~IkC>0g6hA)gR5awv!QSvua} z!1;g=GW~<}4}lMptC+qieKT;Ce3ZlgJpBvcW%7FFe^0%?;+8LPeok{8fcUEA!-SFF z`@5zAd*oe%b^I@;zXbm^@-Ytohx8wTy%HuX#s72qR^VEBBFERu)f@ingfxy39RxpO@2<(?j7+Wq0+#n~QKTPW> zx;>r#Jp2dbRZP!xWq}@)8ACuv{=J<33g{u(hvn<$>JIt}nF0Nn=&z)&2R$r5;Pm~J zz6CfUGdX`oyT*V&Du3bjFv>L=xKVZ`yj^tL!?h=HliZW(d%7IpX88(-_hb4`2ydnA zNAe=Rd{+_ZEpifvKh8BC_z2mb@fg=w;3MTQ#$#RMfRB>rviyBqeSwdbw9ZT6O>|8G zK1N>4^judS@bBdCAv(VA(|xl1Uxs)*4*X!wT0I!z&QvP5Qlj9ly z{!`@n%>PdMyP%&czvcYeqRvY_P2R-indRyL{?p~19RGf<{ejPr?=voP6$76c!w0yg z1D_>7;_}$rH4^yuau(wOu7SY#J`m*>27InuJw&JH?eupb-+6Kp z=Wn)pf9MbLy1{yUc*HtY;yfOCDARkoa^U}bc@X0suAaab$ZdqtzxQ|T0eqo+jp<*g z^J6cPPjh;^xVnOVvE0PCv#Sg6CGt(ekhhboGw`KyJ*Q{5YXtBgbdx`qK?Cf6|@ z<{A!sx%6^)X|8nOE941;dx&l>R|fEvvXSZOE*J1svVikvJ%3MJ9bO=pEz-)yJ38Uq*giE7vi9M^`8C|5@J5^ykxG0R1}o7vKzxtl{*>6u$EW z;9{&yTM-P?*U2L=zoqc5a9s)i*Q@WjP|4F}>?Ii;w2i~To$Niw;ZC%Rvf_8L|Cn`5 zq9tBLGuZescvpABYwpBLt-7{TJiJu@w=<3I6fe!9NaprjG*hB*FGU!Q?&aPIOCrI> zu*bW^6Rg3XI(Gy8t?~o|k)Yq}X{d>e_J}b7PxY9FU`?anJEm~oB`bE}u_o+pZoiLc zFz9b*MBdt3uP54GPl0y(Xz~W4?Msj^P#bKY4}Z|(_9LElrl!H|3$!ny26uRQJ0l5r zn`gGWOhbNmi#OcPnAlU)9rd;^RiUuA#^>36DXsaF*5Ajf?`5Zn`GkMOo9ya*stj=y z;|c2fPaVYBj3-(X(Vuh?KVPl=k5S*_#wr4bH%@*3J6D`=jiwK`hJ(Mq82@LD2U~-I z_Y}7?eUkeA_W*GN#@Z5LI;VpAw+L)YgcmbjsP+R56hB_2`?tN7 zJcGnZpg(*%ER~RJW18+GPK2Gc7FhLR=+ib$kGo$Fcft~O&^s|V&tQMlKkR|$4=|rG zHvLU_o&>jiTtq+oB#d~FpPngB3g6tRKT7CSRG+eyeV)p<7=Onc0`k$__he9d_)?hJd$yG1N4yn9!zTH&L{?Uo#$}UUx$qVo>}4o`4}jpt9n3_tUC5mz&w;UfEeH!+{_AJdkm z)6S!(DLxoN%j~-lUr%v2$3NVj2%IBEGJl`6;fSxd$ht$z_bAp5>4dL+80+&|^Tg)c zb$GWa`(l4Fi0N;Ncfh}=_>u6P!dY)^MYPZlIKBnu!j1dRtR*8zJr?YzwDI zoku)Uyw3C^ttUVqEf%u>1LbAt)y9g!jML=-z!OCyigXD#0TvE905g!&yz6wT}f}EK6`&JEQh#? z5I4OqLGF!sUX6?BhA-8h!S%;uC6alKTWfbZL#`X-qc2y`+BjkJd=2u2@I|DPbhyL_ZV<$xpI;2|x4>?UlH0!$tGsTEt~!Ujts!@90i`Xzwqr<(u_HK2R`7ySrAeRU%~&275=uEzoNwBN6o>7(Q{_{TeUgtPE|fb|{d-NgpxKht^vI9t5V z*lV2(+*3Tt_#o>r;9g<@^eqaWv}p0Fk4@lg=N~?t%Y-LK4RJJ6h7t1l~*J5dQ(f z87ti2A120d`ufSiNZ$x?C(%0yXP`9`(T)_aDY|s_OIrc|W5f|0{{!kgpK;<8_Wzme zkM=%ZJWd$$_eq-o{t05ut-8JH^J6B8Yk_IL(-VCk^(S8vy(gV-L;b@faUuCf|FpMV zkMO356WD(z_@Mp4hcM1WSyBJ9lJFOFUL%YhIA5oX=^5zD>3kh^-XrW`d!VnR{z;wp zh=SZxIKb1)d5_&3+Of1BKnVE4QDPVI-< z7WEmcnzbMDXWEvzUxMiAJO%ZB7Q&>vdAB~%ADsnD{?&zN@=x#XH{lux|Kv__nQ#ez z1X;dic}`;A7PL3a(zMzy}W zHmO4~e{I$Q<37BB#&*V0>+||+_B%n>uQGK$?Dg_n#%rv*k;B)^V#Z6vGL-N2@^@pY zeu{3Vs{I)^$Y+>-m31xnZ;%%<-h{m~gpXtVf%sJ6(+Gp}b9G+&4YGyl&x-dHy^?W* zIuHB?xpttI?|ac*h5ybd;I1ee@s#3sb%#8iMYn6!`vy14N4jbGE_YplT6L3L#^D{S z#>1QBVz%E7bPWRiW?92{kZUk7zK2fyJ&;oCM#OiEJnkeNe|@GOC47s#iNot<4O8?_ z2p40Fu|ee#F{HT|`W*MR>n`Fjjvea3p= zb&|iwAflO3g!i!I?=grK%HI5>tic{bia(MW0sU#o-(wJsnT^0N%9%_LXVS@WFUz&1 zntw~iR)qhS%wqg~#`nPQ$fsD|Z!^9Heoq$6(foF%3;sWoo0-UaS%^Yr z+rWKo{yu|vFXKJn{x*M~LA;ak4)6ebV}*`yLFNLaf1sVuxG1v-c(8p9=kL*(M*|PD zdoz7T<_zEwHh-T%?4P+m@JRasrq9cq2Rzz7k#R|83Gg`E#r0=V<|5#UHh-@{crrb} zlk9Cw_hx#5r`Y_x22q_^4LsH6?=gs)%o^bRZ2rE0SeCgAcz>I}FCd=Dcn0a4X7l#| z#6L3r0X*I2?*WL>nWMp9Wb^j`#K_E%z$NyBWja4bWsU-#YcFFwEOQuenLU^B(9EI0 z^X-@BYyR<>6Mzr3hn8zRDRVM#wY{GC^?7J@_6hSeyz3IK_$2#8#@#c!1D|G(V%#;eEASb% zi__CPvp4YX?U$I|E3+5yAM8S=_sQ%7e4)+XBM@COy8vHef6VQtLuLoyD{THgf#{pr z7x+s13J$MhW=G(w?YkLgXJ!LmYhTUn^~;PeQNGvN6^uX0_yqU{dlJ{DLoyEm|IM~J zpRPHx8TeM4zi%KmtMdVGvu{30r~k;zBSF8@KAmw(W()8d`%=b7WF7&0xBVdZzb)3K zXtsCTG)@oCkB|Ac_KZIhjjoP^;%;jX(Q8WiP@jzM{x6jEUaDYind*CcE;_ zxX6#W$ZZ|=e$m?8E4Uvs9;?Z?6P?Zr?TRqcax^yaE{2RmH|a6%Cd{k*Xu0VOAhZ5Q zen_{W?+=rnbQ$i%pL({=0ieyrW#(hVGoAD3ti}5IGTg~M3w$KsgHU1n_1Mvk&Q5JD z4l0iaaJ5Dw+0JE}kv);moDYESIGTQq>*Te=dKYp^?AR8VR^tsZmUOQ6&)At z_g{xA@f`?y=ixiJ72%#aM)Q-O#EVWvHuG|NCYrgMbDAjsj33i}2vdG6=5nBVx+X8q zXU+j5KB`M}|BTa2^_1E)`JwkO&cj9Lr;+~$a1k$^ooVQ%?UEaXW!yhnqIpd{GI5c- zX6{06lpYfXJ-1e$&6!s1Ip>Ye@S^bPqB5njG??P4>5uv`E>1Uc6VEGfCv12=0{(`1 zM=)&}>K6GoZJOLoA7gk*;dUsl8eAb<6m}wCq8z3^4&XZb&(JPGS^k;J)1;sBo!&Xw zfQ#JjMEW1c^&ze;xOV17?y2pH+$ewOPIZp%^sWr$7uDy~dLD+`vAE8{br~+xFTJ;~ z_D}sgg+Z68hYxWZGI>fgIya8)9@In1p8(fK8!_@xTt?IeU+gn-YNg-Olo?shR&lVnkjQ~qj7-fAK^+ouiEgKeu{X{ z$CY{pc5C5N9CsC9tiom9M>-MD=i|Bt7tv{a{A@-%O*hX%I&e{2ejN7~aV4hX*E}b- zX|i2h!(+ec8>s)MGs7tlXb%+G9sajn54BP5=_7U8x^WtNVhs4-me!rgOXu``&iO!l zv8YZ`+0&ga2^wuB&kU71yJB@Apo`Q2Si|8)cZ+E+ z^Zk6>ujl7pDC@m&nY^O!e^EH}Z7}ltbpnmBk-x3qxuWr=C;GVSFh6cQNr!nPo+&K4 zOdo6XjL+v|yvLRJjRBHvayfRD<2n@A;kf9%)8lXvZ6m_lf~yPs4Z=m?QvIMimAlzD zqv8bLXk7c_qVa?5#5=na{|$)aL0s!`5&k2G{~+HzDJ9*fis@MlN_(` zr87alQ#!fWYenl10bufh?U(|m*K#1P1THm)mi-GPhTl5F&Z6E31ZiSi+T z#kdk_CY~&Wo#;+}jGjYd_Z#qMbo$oD@-L7EI%oAHT;0I`SKu9gGyY@G{}TPnXOPkI zno+;e`Cl-1ne#vV52Bxn2n~SA;su*8XuU}lt$}=&oI5o{uJ~y zv5x7JGG?F}rHigizciipU%NDh4Pz7jQBA94{_*KYrqh0cKQaEqMb)r_xRY^)df&E_ zXkt7_z2DVYoW%Gd_5NKKF%)@Xg@kjq`d&u1m`fPxxl~>wX+Oc{tF`>csq-`N)p+(l zDyRq$7voLA^)BlW52{x))It2NX+2y z9!Yx_;SCXckbf_}C$GN8I$X@<@Q$}GLwF;^euTrq30g-2<9o#veuTbM`X$02r7`lq zI>SP5Fh)Gh;g@6_jQkmgP6qs=@unR9(fXmnNUv9}hCGwRVMIs#*H{lD{K=w}{ePA= z82P=A*iLkW-#KkB$h)ujJ=5=VJ%sX_CRPz0@_jGUQN9O=^O?Vsod-N!%)MXtA30d7 zrS(5AVJVzm>J-0xaX5!}T>9CF58vBh|3BL{;wuyvGyMtmK5DUenCVmPJc@-2Z^@{*CG9)7PwSwA&mT}6ZODz#2tiD zzSU~~+FbE0;b!5~2ruaK#217;!l@N?z-1x>#ZLb9d1~{;C2NsB)Q7{=dT_az^ngzP zzF0fO`%S{bcpCBwr$&h$jHe*4>3pM1@{jyJ2(n?Pfp~`VufJN)T_g_pyQU9O>#2*y z2%=kbK1UAt4;Gs^yb`3H&U-nZ`A1WXEID`+7LXWj*we+1eRomVr9@ldSYL(388vV4W22sj{Y#*@_dyMrQ&@no!}(|I;s z$$uKHZw~@qAtZ-4K&^j=#XlI2rM8G&$v=?%IRDQP1AwFA3J$MG6azPkM;Ol%7{qX< z%WaH{X&@HO;&sNeQP=5woDG~mdi}jcT(bi85$$m~(uUP^v4*i<1c8qfdF+25to1`1 z7sD7&Mcc-Dgg9WW&cAs$iwjm{QNi*L!-=U_pAf5=zW{Ahh*e@6;{(yQV8IYSF#kk# zKH+hq$66g;DcTmD&$E*Gr=u@`rBjR~{=0>+@Jo68X%(ANCsH{U%Yy zcz<=e@@lb;)89|&GpC3T*#CIy>+p@~s~L|*--z`RaR=iu*o%eto5am)5x<|luk;D< z8R9;|5$Sxc`tLJEh;X%V7K+0_KTCZ1H(<2SbQ*qeUKg(yJ2ON+@Y#abi=BM*WzZzW zUPzX;L^wZ-JuIxJBDwx^0$61-onN; z=g(RvO2mo$iO-3$5WfkB?q=VT3D4Y#X1=X!cu4-zbF_b=lOEQL@**9UFkQq$wyMOv zRAvtRYwi;fep~!?X(L}-!up@&G2aKEIKD;QGjUN~?(W-kO{jan!?haM*|;vjRhf?Z z`zGFBOq+t5GG3f=yw>Ln?fEw0BM7^pnc346{_;3Y?_>=`{T(lQGylEnytVP-I#hdV z3HOV)@prse}hJF2Y48E)e~F+#7IhX$4=6 z{2@)0?$6<(`%QeOH_FLBg-g2`XvH)U(|nBFC{E&8jEmwiJdeQ-m7Brly*2Z0+IWOd z^gEHpo&C0LpDw;^(dWz`cP8RO`hq~KMT4H%@1B=T&48C zj^aAT6V-U$NnFZ!n9@Hwix;6rT5n3{BI|m{+eMs0bc^(>{s^zD$R;}G&-+;Wf!q5v!qco7;O`;cWqAi%BY}I0a;BGBbAfY&B>a?gCRme! zdx^13FR+S$dy931kC#r3+Hc%PT*UMxYCmLOaVz6xRyFu@g@5HvHfcuLBNj`*sk9ZX6-9zk480on|?XTQZtl|8cfxX5;IAR6UUlkt$4-iWj zKPFxV9w>fd{$nuK)BL9^(T|hP$rx*4`4FQC!`|>maV_v*F^K)2gR?Gae)OL5Pnw+% zc&PXm@}_OV`SVsb>dP?k0WkGf_gH^}{KG^L{Ap8gkUq)|78s3DQ1#0H2-Wry#~*5o z|0&lmNXs#hpRP9ls2R2PTh&#Zz~6n?cr#{pw@~Y%AG-Z^{EqNhsz1(9`3ai><5R_r zDwI0trwa9 zGy5~(H!Kg~QCNesKLmcqGW(N0SLbKHYn@5-zSwhNe**e@mfD|$b*7K)kAXk1rm_DI z><@rHv5w&IKe9gp{@gPAm%gyS0N!9-&-71~z2Zx2=z&`PU+iB%|JpjH1Q<`>+27&s zw^lXNtuzZ6yTv-2=#ck&`+Ly0TYn+E04IN`^Sy2PIHe!?@~!zl(^r6!1_mXK6^kLHM z_j=HN5cJ{F?Du-WegJrHY4&@)uD+i-PMZB*ui3AGK1rJWUF+@jz*D5z-}S2fD)2t? zCD?N*eQ()s0T)QKU+Zo4enPP{`?b>3(jm`*Qtj6Q|4a5u;4hVCf7UDZE5LK5*`M{Y z{W5TwH2brY_Isdvq}gAE*ZV=Qk+*RErs0SAuY8Yj_q6W7_0sH*ddGeT{(bUq zOz*1R@9@i^6`22_qO{mYf!-ho_;mY?+D!`gX8H;{3LKDo07ESi+hkDTpRtXW@O~0! ztAOs{nNlc)jd1CZ5ZYLog^`tZh|^a~=}Vxn!%IRVo&nz>}&l2 z*_5u&2ONm=?bH4QF*C%m#VY@t59KDr*GU}C_^<-$T65{O2isv8U+4@$IkdfqjIF z!iT);mA$O5;PcO%I_dmiQ~TdTM;u|V1A-WXK z4XQqm()Ryfc4PlXP9)j?zu1laAL&oB|Kt6G|JwhNiM#rtHty=T>UUV{oIGR(Rh}m> zk0ZNGqw;V?lD8S6ThAniRse!fKTI|BZ~J!RWL(;Q?<3^l71Nbm>(@bJdx*4d`su%p zdj5^uKN`a2>iZyVZ2#a-YX7L8yKMiUC$)dP|CZGLZRsSnf3(M4w*N20uG>H2OKShX z9n;Q>w|~T+)c%p4r1n1$^P|M}kM@?-{?Xo(+CTiatNqudw13E#wEnj}W&IEIr1p>a zcG>;|!ukJi{ZBOv^(R>cSM6rio=|arU8{7g!+!c+ivFFg_s@W?_s{gu`)7~`T7T{#)c%>+_}MdM|4dK4e<>N15z${~zc{^MA}YlJx%# zDf&O=M@jmB`fl`pr0@S{{U6!e+HdV@SZwHb;dc+H@0S+L#EJ&&LwhOL@#^o6e`2%x z9ZAZ?*@=6boRhx)cjhIFl%BHyGSNBvSt^L+#fSfh_K*6N)c(<4lIH(7e`eI zLjI)okNioR|6_`qwEs7C{-0s=nej@WG5c~8^_u_v`+wWi-rBzWtl++qZ4kKXw24e?|MZQrdq; zO8ZCsO|t)?e($pVqd!Tq|D*rdW&3xvHvV50AOEvb#{by-qmA}|wD+X(AL;q0+CS2t z)c#Y)|J}8J)SsmG4|$Tt|AGJa+JDoT=8NN4+}*`*#x7{T1?gYC|K~rl{iA&*jsNNY zWcx>ZOd9{upCq+^)bCxkf3%k*{U5kvT0;BB_`OU0AN^I5{*U;Q#(&^;wSV+CN$>w) zyiU^p+q?dU_>;zeROF=gpE~~E`G2qdi%qtZ+*#zn?xI5<4a^J)r%6`g}<2=%)2(te^eCz8ZQ8j*H^;^UJJv zpuMDt0~n{S|6iYWD>9JR|1iGoa{V9iCF%eFZU4I-|Nqr{@!KSR*Hu2Jf-&M zrir5#X?(k!h5o@MHZ9ZqXZ3mn{xijDrkB`dpko$F;pa$aNbefF9otC+h+ZX}i{)*| z;V$Av=0DlK0{q>?aF(aG_qE{977Nt=Ch6cy;Sjcmcy0mwd+5!PlY#q*k2wB{US}Zw zJ;c>4?-;c|cA)q><0b0-yS>HNDtzHQ(05&5+K+BmBfLuCJluB+@P6V}=C4%yXN$$- zjIY3^R(e0|N5YlTNt0874;B|Py^}Qx*|b!=ify-)pQAG-W7b?HK4LsIBOll;HZd+z z-?Q|H&#N^5tJy!GSiGX}FpVGY^ie0;CA*k#7wLS`>3iS?k+~eWLONe(X2ZM_5N}i} ze!S^(H1Z>4u;cW+5(~^>(X<3~%xC_V`8j5q5pgZ&Z@)f=U{_^S+{FHmRQt1=40g6< z2QlES6pw1Ub6wAM2=54k@utyHi0>#-vQ)+I)OS3#qY$ga@hrdS+#Ms!31WO7P2bvg zdM-}a5zQQ5i)exWQw?^8^(#evJ5Bs_sOJAhodYtp8^7)fk#p&(Trz_HXgZRT@9o{)&Q- z`#tdOBAw|!sr{072@lDiE1Z(tYa#zV!prg9lKEG}cfZ)q{JqlY`|A&icZd#q>nT}l zAm5{6D$~2F{eDl1@05Jf*`)T5J|~tiJul5c{4a|qIQ&&vC&T~i;=_Zrydf98_3(~( zDyZ>KX+06&$D#|<^U}uwe<3bs{7X80FKLrl!u9Pv*T=x$i4u;lM_OORw?z~&{W;fL zpl=gn8UI6lpH*6WGG6O?1oRARCYMiL#&M|6S=OD5pHk;hcCsF0{949`pm(+2WBjo? z|1I0<&gs+VNA|YrIX#c1JqvmIS&hv9r;OX+e^2XV#RK`8&zFn{iRrF~C!;%Nb9~Dg-{j zTF2r2J?#;MS7>cy{Ce7Vzz15-GJYX#J#d-T!18>izK^=Vx|wmGjJ+WLAyy0FMQFdS zZIE}VburUBsP9WwTNAlGRdlRHd#bfoGhJk4!hgNBn)|!Qd;Wm-c)0Zf<2!O*%t8NP z-OPAw&TYV9>r`&PFXzlh|JZ0SS~9&~veK&J_>S-RB;q^Tx{3N%i~}d)AFNgeJ9#-n z5#F)Z3JTwm&P_cs5dR6*(cFJc&z^z)>m=(bZvVG;z7y?#wbg~fA0VCS9p@wb)2&Gy z{wlEw;h$l!)0BM!{GVyP!S$i2Qyu!d^Q_A`{J&)15Bdex6)f+^9k(F7ORVR)y+5z^ zmtSi2W&W?abc6-&kJewAewFF0KANA!XE1UD{`cC&Dy|-B>bNZg{_#x7Fr}Z=A(>whc^t-J}uKy=w zoP+vsk99A{|8|#85&ylG&Gd5h{pd`jzj*=dW^}(H38uaE?dpw-uu;%T)@QmVQB}bJOp*7|U<)Fk@$7 zIEe(5Wc;^%`oP*LYTf4q$aD?r!$3tmB+k;tr=3kbD~x~4LEHXYWpADJliK%YZ^WGX zE7I2JSJd_(G^ew34?B~1=RWXe#hy21==xO#nU4Mjbxg7UUj1FQE3a*(p=Iylx2jdz zrtQ-w-@8@i*BOwB?2~BF_~~40)z7bR{7-HF?Mw=ExlD1w7;UF{1^KlV7dmMCD22b> zZ`D2Rsq-q{RVR(ra&`F@8u3*$E1=(#>hHh&&)X}uZ~tX`b6KZZ;`VV`t_hHfzN@C| z*P#Cqk=`TqvQ0l*)Q;D3T>zQ--)P=zOYD5x6wq(WG}cbrI!Vj*H^{aACYl}74{GGU z@#i=~EMxoRdys4CcVu;I`)@2*EwzKE5~q_a6pQdd?}Kr!$f5Y2-cp>2P$iaOmP)6k z&b7U*M8u<;w!o(=YUv zI{p65{TI$xIi2M?6*9fCjoucAg@Wgk!!q_pw{gEUoaZ0+clrnB7Y|w+dH#EE*3(GF zbJiNBFYbIR=5sGwTbTZAhiM&gI=VHO@%9Y*s_yI7L2PgNr1$5r-@R!y^L!_#({P0U zu2sPHiJR5;;6Ju%8Gow2-@L)PlW`wc9U8)B>nO%wsqb0;U_Hh7a905It=3l@{*3f; z*gq_}H_zWDrcVQQ$x+O|ApHj5j&e55&!oiL%*P@(I%|yi+jYHPg}hzmWjtS8Y@dkv zVs{zj`P@&v27%tgU}*iM_vgqdl-|YCd9C+{p!b%Car!s*{tCFi9NY)=eCgcL_kO4+ z17r=)$Ii>R3i&@!<`5n6U)lFI(1*wX=l74DwjsYp$Z3O!E}VDsK0)#AEuZB1>ciR3 zq56-K^EkaryPgk4Wwbnxh}EACI$tgqUHl^Ha}E&|!U8Qqh=lg*V)EFb_G3t9SbL4u(FPuj@KMQ)9%wc=VHk;nREtf-B-Y#8xBYg|x z(vX(-ptNH^UnH|Qz5B}o49^G4dwIURtz$OwZ>gNVO!KeqaZL}{W938+FSqL<2ydA@ zfbAm{{f>j8U9EAx#JJXs^wr2h;_r>~Bf5SA{#qI2^4;9K1M;(8R+Ik^Bu2rN;P+{a z{QM=a8^SwWhB!TYrHzBUe)$2(*H1dWPNzb?uzZ^39oeY>xLH=SeBX8Tqa$jObGiJ# z%=-@Ie}ue%(=$A0H1hjMc?!?}AMf%a)VZVN8OlG-OUn+Te19iTWBatQGEj|9lFJEq z5zYp&8SFvSAAL`KBKyBcTm*cj!OpP0)4=~HS;+K@#l@gst8t!iD&-j{-|OVN zD*uHuyYKnnzd`15eCNsYLBG*paRL6pz9Ky%Y1L9Xg?TR{|8AB?GhUzfF7Pc$aja_NVrNmm-oFA_)d8guV;)?=at}lKa(_nJ+v#lMJhk#@HVRVh3}FlGyfFq zy@vfq_CbB4_?JRcgZ)P~FnzQ-kL+GKp6Rvf{JZ<4B-~v(hp1V|-{iB*e~>!Q?S7et z@qofR+jTDb)4$6WmM5gr_kjEZ^G_8s5Z_v9qyCY;xuQoD?P;y-1x)$X)ZXEQO62FmvIWIV{ZE&keS6|7vGObSKNotb5Rb{f zF)mQ&qdjikhsSw?sGi~p$?v~AJ@BSF=2-Gmua;+0-ei>TQ*wq!V>>Sm_-Q$BfX0vI zK92H!Mn22@6Y?g4{;Yfe>p_&BpK`Z={+xW0@s`}5fuEP_8ULKS75D}D5#z17zW~1| zzh?YP?l$0;D&ESGZpkLNxC{ED19P{;R1?wi1`%8g8aCHGa}_3}-|FXz4j z{F)rh{IBJ{0sOkmX1qT4HQ+ZSeI}dae>HbK@SE})PT$zPaY)}=auoU#qHoUq2K2XO zE{Fec?jykO$mxt9&3z2`T{)WZBe{I6|7Px6i0@Omi1AywZv%fOFLJd1 zHMw^Ie=cued{^$hz+cGMIlU9}CLz2H@~@1?<&6j4Clojcdq40dc?I+fl6SAX!QkI4Z)7|;ZwT<$at-4lc|(D}kq}2Y~Y_{G2`sK9>81VQpP>< zdIJ9}pXcy8<#h($DjPWe-p+j&>G?&T&-Bc^EYP>fag1f24ZK}?8K>vDfQ9`Q%X>D? zzC%m3zr^@U`EfvAA?VURiTN|~GJ$RTU8e7!cK~pj-L+Qp?~^wbINct^cxv9hz%F|` z=g*Y9eSkCUm7M?I^m6$nEMlOXZuvnubjMIh_8$N0pr}fJm9YOe3oZK-rm67>~&1|kIWkloM+EuJUnj%a6kJ(#$)ov0{6EMW4w3XNZ>u} zOH)cpXYu7JjmY6_>0^P zzF9%>I@{8jE|;9>T$?Ek&o_koAor!#&( z_XFS&_63YT$o&v_Z~H37ALf1pJkq|I@khBI1CO%rX8dvPC%~iahZuj7`zi1k`x(Zc z=6(h|)(&(2xbiZPALHzCRDYq5?3=eg@OV4Q`PDNo2Y7;C=0<8NZnO zGVp%(I>yiEz6iX(y@v5~xz7Vnv$t}4K2Pa$2iToBeHfh}?{xbk?oZd|J_!C9b{6|z zm-{eqzWoE!AIx0`TwveF`2O6#0~gxQG5&k*THu-XM$(tCA2JGi5p4hVkC=~y$RE`|QmIDf{a@rF_}hb7I{v{#tX}ng2xhRR5_sQO4HdFmAur->%AoXsyNnudx54 z8ZFe{QUF3RU`L0CG+geE6_XbbfKo(&Mds=bm*ks*Xq0- zmH=Ei>KocHqx}ZIRlh!r(5L%qd;GVM=|AZ=c0VmwZ(*tPul9yrH7edr>oy~k<_P>t z$Zgoi#f%w-u*3a|eZ&>#OsV={`}VJlgjvTE=l3-Z`9@=?ykIWpbCl#X_!r zbHNOVB&Kw=L<_FCEW7miKSp$P$jge;^uB|WAk$_XcZ(qkKNzI`g};8tNf-tl^Zk#( zE6M&MoR>Pkj+U4%o`BhtaHq~gfHTA&mjfRG%~#o%vNQ<c-@rJBo`MG=GIUueOUg zg#6!u?@x64TPHf-ZxCVFpHA*{8F02}AUst#4|RGUxTiRq@n@a30_TX6As@;Mlb!y^ zm0s$-N$k9JJiY2+;OQ-XIu`zqg#5j_0OyJ&jlgc4ADi_M_Uq+|J&yy1{}H_=gT9A& ziTHuH9U-la)rUKzR1{m_6(c@y+*NVi*qck3$Jq7gHVj9YZ=p(w* zXmXIKAnX>-)b9DfbHzSK05W>4i%;orQ@BUZNFBP*neRpKv4gZ&mt%Q-kKWArw|0>ay{derq7x)_S zFo(ag`?2tUoj8_pW%s4PH;VHaFYE3DzC|2P81IkF>^>j(FJjGU$?gBC=Rrq#<*4&& zq&SW6x5Albx#659E@1j{>jYqzxSH|V);+)-#5;ulE}XHFzK7FMY-9SLMDQ6M zejl}quba4y>5p2SK<_SA6MZtimxI$ssQpi6{&Z!}?JNGsc!cVI`U}_7Dm>o5x~Dkq zDUJ1h^Z{ZhW4#}KkQlDx6Kn8~+IKbMC)IwOp`sUur}w`P7xnC4um9ltJdE{z^-kjR|L9G`|7yB??fn6DxpNq}6YkClE3G;C=i0DsJOY;L4iJmNP zqdKi}me|Pg>-CHhVKH6L*AEhXxx8)@x557$v5Mu<>p}CxZH)gY{s{Vf@jm0r)b|1^ z#FK>oPBr^-&=-gc2|qzK|5D&Z;&IBa2Lx7oE(ShWboFC>3Qv!z`TwC})5D+xKa79W z|14#EwYVC%O1#1N5%CDHTS(l9{~`RN{^%g4Uxl_r?^is@c%4`WTqmY7zEWHX>=XAg zepH>8zFd6I`EiCi-@HNG$@mn!%Rv3rHH=q_)xayn^yhT^XXD!;^uEQ%Og~+nXWJ;; zOg~rIznjHe#^)&eYKwS<`A@^U5Y(SVnSP$K7auLgF#bLI9<1+)`COkL5XeOIZ>N!e zv@HF8%<-ZF^Pefs1pP$uFwv1gr{W)RBai^OcT zo{62x_($(|9KinX!MhjO&n=E*e!V~aa#6@wug7007BSZA(^rc+#(F*b8nH=-=hUh7 zy=%o?sQ>hRiz1AjSZ@>$0H>ipoP+&O_@c15k?45Z2W^S)3ykZqCyMY&gqMc??>R96 zxpbYfKhbwn$ZkR3P1yoh^Bt90K8)xGYIma3ypQhWJ`3RDG5YH%ujV= zZBshzEIffq2MZ1tR_S)gJ_C`AWO8? zI3t=`Z&)M=T-y*8P3|hc4{30R>q3w_67jeL@RXP?_Bz_ZKT){vk`;~a<=zQPBEiP6 z$GgN6tnn_Xb2oUGRM%BC_#&Rs9x)J)p~h;z&ojDypaAeiy$uwNsH3Nij9^)-2`ki;f; z)LT^@j7CJktg2#PpoYRL4u;Eu&E9Zh$V50ogtP;K3pJ2Pl{V@2s%9y4qW#$W#o`mXMbvNeu>=DXqi_ zA&XG68X-ny*nPOy6Agx2m^~VEP!gh^GilTZq`01*O;%`+X z8Vp53UepTJWsp-%qi1;q{CO3<+1C&Q&F&g+47fcWuiqOc$>7QD3nx1?gOK7>>u*Ws zsSTq{d}t~NK=CI!)cSpO_0dEZ$cZ9EWs5m_s#K~(*_!##$2ph zfrtVMqx{2>V157=1?oKA^k7J(-nxjQz@ab*pMgeiYi{u%z=&?dlg#D!g%)~||7e}2 z3HSo$DG&@dpbO`w5o|OaHcBX59c&DEyd+Ms$sRoC$8(!~HTxp=pt*3c*CBC8r3XuSLyXe=OD@kRO*=siMZ>%p5;{6V_*@Lqj8A=@nCQm^*;k!<5!?2kR>`@+T*olz*{_Zqm!?O$%5XL{W==6P<=gPb&|IEd~$>J1^g zD;mSKZkF$Nc0P^b#psbP@ z;2Ntqt#m6D$8T^Wsy zUC4+~RRwyUg{tf38Z^Rb5@ii2*9s^ms`2Al4>RPdX}jrrBFJ$saijl%v=szZ*_k2C zsSCTCs7VkN1sUgPy;Jijb-`0tMJdA|h>9Dbz6~z1zHQ*>(PJ8Y_+J%)cIB<1{ti{T zvBDD!d#i))aE*d9y|vW)6{16j2IGwu1{)esXR2z+sRBdAf>8WQiu9@A)fk!;yAgW`E-$YjvbtJUN$MHr&rNM|-M_cLj z`?b( z6h)Aa(Kw#h94LnFYaAK_(Sv+`e@TF}jReQCu-g}x3tW|M{7GOyrxUH;!P_k2@_S>9 zk>wSQJ`ZZO_Nm5_dEsgwF>n<%^@Y-&1e#yx|xNd#up)d4IxBPc&f$=qEpe%!`K4aoM4Tw*5^^(Odu|@qQMLNbZVJ3o^&DBBkDon;ll`u_N3*YG*CIl z71ml(bjHs#!IHMy7%6avRru^b=12|Ga8ms$K#x_Y245vgv-)d_#O)8&yA5|N2;*S7 zFoS9Miqr>H>8s2wt1u)rJ{o}P#ueYVkRZk>HY_3MP?KV?F%;4zO+hapP;ROkx#+Ik z1jzHpSXP(P^f8IQOil3AT#mCy@sxUNWAc+!YBFoei|3b#p2{%nV`l6QM9q|ynajP+ zG|C~jgP7H!!;Z$ENlNI(rG{1<#tg~Clt?f+s%R0;UN!y`Fo~UsX?rjbfZ||WVj+`5 zA?lVlTt@Z;Rz^J9;sINOu6}^JwX^Kn2OB1gTR0fOSPqpG4$xi$(Dw?B8}2IF*Hi zD^r{R8(>&4@j`E_AvGZ;X1pC?x)Kg}TXqyBUzsliy4bKcsLBpSq7i8(CTyffiPEac zC26RL!j?cP6okrG9aV8S*f4qGSng{^IHubi;h2tdgkyT55l%gMEXD|1PE|nn*t)kG z!JQzdwgQ8s=~&f7+~h(qR1l0tgAGP>6%Z5AP>i$c$f^I~u9_Y_Dt6TZl_9GLLqxI& zP`?UQR~&1~s>4cgL*1$g>fVQ{Cyyf(LxX!IMI0-k0$&|h&7{F;N4k!|q#ctxe{z+s zh&v^-M#Fxus$`WuXaX?vgbRWzDHCE?cntqcSx};ez5+M8jIhp;@uC$+azg_OLAyYkb93hDj)K{DB%5KHs+XSQ z#>Yh}SJK5(!;P`-G}PVcTVANRo+vk=g2rl?lrWX_#b)!WRLtP&#iW##jF8*Iy+uVs zaJjb(1}vfGFuFsdxrwf0JT8ZlAx%SdNMU!44}Ay&zSr@+n(uDD*EGUHL){n^jS@|n z1qs!nPL%{=(C?+;TGi}|kh?ihq|#{;5)7-3j)ov~@!^(47F3l|8Xl=PEC~9e1*m*f zX%BKY_?Ekm@N!6SnOE(FZFhOm%8(y=4DqlF>23s5Ob8_n$Tc<6q!12-7LIv4e5fw7 z%nyBr(xkN;omiT05yu?ZpjC{jJLlXb%SpVp)N6Go?m#^RGyn>+ff`t>JMl#-U`p15 zNr9j2W{9B_vjk85EMK+BEfkiv{3H_d{piF4G?9lZn63Z)V1+7)nLe)xBkmXv2Za$v{R}0r8K*c?Qxr4Y@hKHfrOcFTRq#W(erU#QrAWDWZ*v7PZj4Wa`-dZw_A%65d9$rb|8co$ys}*5)U^(&3gIS}|jg_4p z@>tit1re{QS#&Q~hCh{P^p6dc0hCZY>gkV)7UiZar37>mV^A4b6+%jPojM;32uK{( zIBPKEAT8)QOHdTrp25x(^A3)2UM#}IruK(Av}#y7FMnpqT;vUm9Yy6;C57|mRzSH) z32x{9N-B%y#C#!rq^FV{5F(Nss{9zobwk4dVJS}-7OF`)IZz-pBg1-u>T`FKGfJUA zc~S3XY@{lmeNe`ev<)a|I?;vsrBy|9D@!U%iYU48rI$=gY3->6g`Ac#S}d=@^br4Y4frACr7yQSh{QtZhbmB16%Esz4vvKHMLDMcO;X`La? zs3SD`5yzFH;>2|y1du|Dt3RM2sj8S%mQiG+_$ZAC(IkwzRfwM!Np$4#tfs25n`+g7 zc8eN?YKSEhvOwWaiWL!|Qt7MqkCi5Lfpff(h`Y{fdP42Uw$2LgibgLjbHQ6hePa~U zF&M5I=8zgl-6oq()iV@`vF2f%dBAR9uz@teJWMnXlgz_p^DxCc>|-9Lnul@mpvR$F zQ_aSl5^69m^;Cr#2XzN|6d!?g)0vgrYV-39% z4L#C~9tr9JbXPFxxiF=-s?LW^C%D(3&!MQX2SkHn7}xmGScwdtP^0@cCMSVJBMH-E zRvhC$=Ai92%%%-mN*Ju2Xj>31(U7m0!{Q`#a1!EqE(ZrY3qO&ffVmS8t@*|>p~hR? zSf>_!iI0F8b(KeQ;E@S*Z#Wzb&-8kr_W%Wg*jz(<3pCIJ3z5H#*5D%jN!d&AOa(EkF+iT{8nG@!raJ>xng=BXk&hskD6MLSq3uxP ziea{|8*-^PPzNgj$Zkv{P#?Gw`RcGRt-M8i4OpC|A(TaLBJLxCL2Q^&kI{NxxQ1qf zm|9XaaagX_Jd@p&eVO>Q<*LF91zC@0aEqBOiGh+Fv-OgP7R;=|!9cJvq6bAKPn66X zSX(feW-wcFR77rU^ua@QqtA~nG3*Pe5{h?WL=3sHR;rpoH7U5tNtb3U>Cl;A&{Qgh z3Qsi-L~l&U2!%QMFPwYv8GjU=GpG*MEL?TD#1^irb)cTxqBZfeb*XzirRaaHt zSOYT~bvwv}SdUJi0rjZfWQN|=QR`cYWawu#Uj<(>@}TO3-PCtefEuZVs}zW>IJ#a_ zClfIvT@j}t(Jj_^Vw_4;vU3$<{fR)eug*LMf@;ByTmwOva%k5OlBcH>aD=(LoRn~W z3}R_h1p#+tex$)olxP@RG0coqc>GnNBnG78YVG&1GI%`Cav$pP(hfM4hbi6v*8x5*p7fnL`B(5D9FT> zh)p~}Z5YA&F_~UsgsnP0CXLd=|+y!&0X3r~~nO{&^MA{nmJXMlNG*+4C_>&re z61Yqs+N8|Is_&=eU9>6A~>QMAFUhg@GvBdgs&Lad<>W)NX zO&D0M2GokCps&W6KeMQ?G-1YpiE%?jMP5X`s(^Y>rJrbc_j_qBujg1EJ&o4IO>7)2 zBFGQdHJR}|F&)%~l|rZzV^X)H3r&XWeV#UGLFllxVy#tV>cO!&t0f{D_(`h_q#L(J zgM|+pA6xOndcvIi@`I|%=9L~yiU9Fdl1-PAM5Irx z@kvhuh?ql@nJZ})%d3b zhi@LqBurH)fo4caT%3lo{PN0@!cskp^V5deIJXb=Cyqi*7zWjnp|*yKP?KH&4K+b? z3>#utJJQ}*bi>rmQ(37sin5rry7UaL3|2r##Ta8EQ}ZB%NxEq=t7??SUqv9;TBqsIx5nG&WaZ?lmv9|MW< z#d1@oV4uYDcsmMlw$D?>a^p|W6yvK338KPqM|wVWrkD>$>Wh>Sb8d3JRL%4GO<0MU zLGIX~g)MIg(LA%6XQ3N=yVU%=3=4|H5C=*JRRxbcNf1VH6#9dWDnCq&SV+w=w;}|5d!t9q$7|HMi{17HL9?AhH@=o zk2DvyTF+I+Dz*2i4Ei0E1oob+UZ~L>;bH+UnV`8z6QNC3@u5?5(Ppf;8;Pq?J}uMH z3=5WNkKWyb{+^!WHH4JT__A_>KNJ{xWR)aDS)n$j=p{h4%x4PVP-miAyu)7-G9hxT zc&oT~aMd9vIb-^z%9y+-r<^Bd%$-bA=~G#wW@)q4&YO6DpoPaKF(X*AZ=TvE$&u`q z%&!V3HXK1a(bk9^MJ7v$w!J0hN2+Ub;JkS=Ss1e*70*=CP+Ct-$_|g@&=a#)7jbg7 zmU}Vd;ngpStN=xyw} zqZ3x6!@PhBJlR`eWwFYf1@Vm))P&8VHKm6-Qo}70s7-ik*B#b>X=9%5!=ci@rb6>3|eE zabjMncloO-K(2GVHM+oJ`K`KwScy>yDdst_66p6kDE8UdfkFY&mK(wqu*D=|WzkWc z4ENs$d0Uj53Vpd3stCV$<0$hag3z;W44<@V#125sit?XbPg&TvJOmVO)MB{t_V??rxJyVBD<7KNuoB8EqX_1+7!8?Yc(w?CVA&3 z6_<;OPm7fpcRgH{#5;ybqzV%o5^N@!I+;YFY)E!hK?Nw!s6?pWqT0mGEJ?m5qw0E0 z??&rGI&9UTQ~;rtxQhxqwJc~2GSw{_q}Z{PL3`^|5up*p!%;+1gkk&&dsCuBlTPL& zsSK;``&4;DouUOybWRQNDkRXCX(y#2`fF8dgIX4=WGcrR12M0Os-aqYQTawYrQ$5A zmp8Q(?Gqc@iAxI;51H6#hFlk!$6IkViuGJXqFt&KvJwmn_w=ezoL#{fzd|t&l%r%^ zSLRNmQDGY#_U0wdn3Vy(5*xoURY4c6drglY8{tzO(POB0F=8DNUL2(exWmGozt--RASQ<7E!4PVaS8oqE@Z0>EKvhQq|5x z05e2U#21(n-6gC!dMF<8+wev7>v2BqrS|5uwS#b1&JFJ;U zXomuYsqB{vv52FSf~lSc*bLA@PpVa5^-On}T5R%%5eBmp)%oj5-0s%wAT^AZDqcO? zQF9hrlTqd4Zot}HF(!xAsO~CPTc9YmKuF4AwQdwcHHw*~AOj^ms^GLhDiU5G(b1A} zp*LjU^}-l8lp4&CY5{xPq2`o=$oRkx97t8{awgY76e}*y<&oW z2FbC6h@>kJmb6q#TM#y-q9nfKC9#BJJzE`K8;ti_>h(?CW9(WTQcELh^EOJ+PwVe` zXrd@dchpEveiW~2U+O8=>hYekGZY zCIBXg_{MnX2&hW6zB)A%Q=w|(sA|C6VURz~rL`nzIoN#wyB6HhCszh3PBUY|7G?C6 zs!ga#J-Jgh&;*~JsaXNXl)8n6kjfNE^}~&P;k=Tp90~H3ze9&{NjEqJc-#`I6J?xU_o(lQMsPDP?r&x zy*1CsDkCQ`>u3^WP*n?+Wd{OPqFB&sRMCx@mP%tCfl8xVxuqh|9fs~-IhW{->coHu zXj5q+a<2$0sUfO;SZmR_O7mXgsZfoBcg2uH(MqqUG3temokZd;1*2*NwnVdeW;a~| zzr>@5f2Ba^E}7zq514T`G)6Ls!aNe&=8?pi=n7u4U6PYdtGmWv^QW*EFeic+t^2ib^^7C~ckJM3Ok zm?jwdF}aC>cgN`?HW#?@o~r8m62jDLtO*Xt?9|Z6nyaM1>Zd36q}M@p``}$3hKYqP zuBa-W7xD&noaU|w(K0s8#Eo45NvRdJ5t>wDoNJ&Kp+Z9#<)r7MRn&k-N2f9!Q}^T$ zYGXbYscrMR(Ik5`VHRU;AmUYm8K(-bcR7ajK%EoBTm!j4CCe+6iU)h(p%^Bb{#wxtbq7@)h9<96NFzMU81sZ?gVPS;Q6~nN zN^8|GEn}N~oUu8SN`TRCSP91YIHZoIxQ2M|3BMA9(UkqNFXcxM5~?V`5RZ-4%neeC zWUbkgs*j^liLTH`jHtPZ3Ia+VdVRbB#d*&R@fnQbVir=DIT*FlS{e+7Fx}^wPHaG0 zj^2nmMP|jomdMCel9LpB8zs(+=Ic-L5R*KJa|hxvn(%e~*CR!2YaIK*z=ECwg9dHT z<0#!Q`e8gL3j?)SU!WNySJ;GR>|r{KlA2EhRuI@2W9jq+8?e7l9nujK5z`$qx#%~E zD^VMlCpSUF7{*SUL=&DLY0|Nmt7f|>81`cWUd+u%q}y1M*LZ6#k9GFSTA}1gaMO#` zt-8()&hhOKm);tcC}k}sRjPNQJW~}>ZP+2_m|>NGNr|c;dcmEeO|($N*5XwZ$tDWy z@{9YREiB2*tr#Pc+3|`_QoPEl0hLg-B~uAh3Jh>JRFi>NF&Z~)D}k-wi4_V%j9)~G`$KL(n`zQ}#*BX^mn$0*?^ZB5gz;E6Yjti+ zsH&Wngq4YwtCKMlh3l%_MnIZoVqW4!Bd7OQHA`e1KhXIHq%4%-hjBzBz2v#I%!)w zM{MF@Sqq_aXp^)dEPyY#s`yDG(Nrv6#ZG8ygtLwnHIUi0ny4bBEYXmwo2vUhI$B4Y z$Z4LS_A->PLB@w;IM}I}c4%?+Wc>_h!Qc!x=tD3klW|!IiuJIn5_Q^*5)><90W&xe z38h=;Mx{6XI=NAE`G4%ad7PwKRp+R1s& zPiseidaJkG-Qq|=N|D$xF*gNS$)M7%m-Pb!#f*|oT%eRWOD>)}a;PL$(;-*=m8D%N zldX#rkm)=HNug6aa3-=;Vw@A?+_ipli+yAXvVv({wW0Qq=7MElU!M9jYC&yIr%6f& zY9o`9&5Ykhc(~7{MCH1lKDdgNWH6}~$-Yiw4XbLiYPS+74^AKJ;EXkOSk5`4>9U!J zU6*G#y2#ggZ!8tV1$ZK7;)2`S$ewCB7lOvAbz*VS zprJJ|scBT5VMxU-l^->w`ra*)>qWvjmygzb&G&tlOPJ8xFPISuN8 z-MEA4ns3~D%`~SuNhOVk9JtdnliTMO#IrO`Oi*0kUPTLV*?i!k}BY9JZkp2q>_ zRU~BGrtf}F)6mj5SQ~ikkyF0DUw9@{(${DYDi9iJ4!O;eN>;)$Ru@jQ)A2q#G>c2P z{GQv}omT>k<{$`wFZ( z1}G5e!gdqoS5g`EOA{J63Qc!%Bf7p24VQ~StF+=q`F)!>OO%Gr?97epu=EWj>dJzs zN$JB%xZn-*cmxQ|PMk%Rf!$p;jy^uQ_F~6pG5sRCN~8$PVQxMp$(qb18pK+pGx&N> zX_ubhByM}Ixp;Q(kw>`ZVW(F~95<8_cAH=uU!JNjk19pprkZi>Rn|L6v@d!HyZ_w{ zc%>yD8Z7OS5ptvgOeOU_vniNQV6b&bcpQwev|=ZM#hiaI$k0Ot6^cOndI9aoS+;$j zeFvuZ@f~dF3mcn=()M{~mqa9qk?z^m`upT1`{rJZLYB;BZWMwIJw9KmWe$ni zx#dmF=XSW1f{(bxna?>lcmC{@9d6vego?)nT;y`uAUg(2l>52DM;KoZGH*FXV2ckw zp(t|y7R`ToM4GsKJg7sf2^p>82{>v2XVaYLR`?{qMHYRZK2m@apEK91s47mu9a5`b zj+D4&D+ec)-D*K)jVs(tWA_fLX_;xjhVXxlP2t*VN7AWd8IPR926|`!+t|gP9i!`? z#h$jcCQxzFh1L~vcz3nO$+gldkoQ!%oJLtOYcPhykjDn8wLQb4(>GIvM$4(wi-ufo zf-9AKov>u4%om%tOKOT$TE+Jit7{h-X2Xc!v{ZmTlRp`!!Dc`acYC2GY-D{|CdbDr zTcA)FOflLk{bOni|LXM%@3^5bB0V{b#w%_h;<}g>c~0m1+7y&^40pP6^y1CtRT|O! zq3SH|JaqhWLuAGk2an^elNy6LJJ@_UiopOLK12_D%~@k)WOV3%TMt+J>*G3n}!B;BQTB*ojYl9|Z$Ys41 zc7Psz$OfukEpfMYWlI*gPkCx3=Pr9g4e8K{*szFi#0u+fW{)dOymxYKqqj1AyjpUK zvs2BXK?{yd2rz}8o|Tnq>12+zRz>+1xqiBQC~W!XBT1&66Z(ZKQc2GJj6v zz6?WEXLEu53THtW!61zeJYKW?h68R&Ox(uBvNnYO;d2)%?&KMFjA}3>(pNWG`x-~6 zre&3i)d{X(xi(3B4Gz9d(`tdty1s2n&1I9fV-S*Re5oBp9V=)-UngnYmhotN*G4*s zpVFDY$&7C=TtOM^OxynLY&rg1&qB^{1Z5xM-dmNxBIMqCEbJiy@4ct;pAPbn$nL!- z2$xPt?IM={z>cyt(BgTyyqk66W+4#^{kJPCyw-l9Y;o@SGv}5#BR?-Y0+FzQ4#N%? zNU92?c-qFCQO_%I0VTS!6;_%XSEE^wDLI5UC^hfV4$h^!JUEd<{4g|HpHT&OtOGIW zFwK!V*2D}B1z3cGT1nN?5^e;$Lr%Drv6oXafYkgYeIsj5%d@bBsA(6Y)^ziht3$bf z+70F;P+Fwk_f%zpqC*M!rjzTF*>k7nmbkBn&ledPP=BW5%7&{wqTEyw{|c%TJ6b%B zEyU^qcl)H6@SSQPJSz=9`#hlDK_cmWtdn?CDQw`vqX^5aH2iEc*QUDbeB;0abJB6z` zJ9vMJTS3H8dLQ$Lpg5_yhMd36@u_0iH%wBdIg@=vAFVF({sKoOJKWc|cIKwLj!uBh zX|b;I`+F%+D#T3l&T_+ntIzyvsmHWBJ9F*}HxDCAF?uXT zXLBrb!y&~VzHEnPwT0|~$jJ2iT)pn}V8 z(4kB+>DOgOA+d~aYbkvz>sd242*Bsa=XRVgHi`m;H-`6W2Fo(6UY|vPO@g2!>dqq@b$Sl6%eRUMyWQd8NMxJL`h;Z$X(m>=%jcK%mIV>vc2{jn& zQIiUxZjcBz&n1zzS}FV7TOIfHPQg}JDs)1tI%>r$H}NQM#iIh4wc9|6Zz!)+b|K&E zvu;mkD<7K~m(Ej_6!rA}3KDdh zt8QOoKKJ0mn&57CkoBWBhbG~mUY40+^>mwphQ5TIOsV>KnHKEzB zN+VFdcAO;3 zEH7`wGFz>JYRG~P4O}VLK?RFC>MmaT*07sJ?Dl37q{0QLywf**rA0{ofE#G#W2GpJ z7>jz>Gf-b*>1eOhq}119x{283RkO$!?P1&>@RZFrPLXI#jkJ+j*-sJOiB63tdKm?qHd+srVSJ%AoFN$c>7B{<;m z2(emdXV|I@P8X$s*O+;5vuhb@W^4NASs3$1)JmIG7s2>pY9t>HmPkS`ZZISA^PVmiU-m2kba zSa+VGy64NLg$U57Vl5fu$;hUNJ&#enU~PD=HyYJ;`YbGPNb;9_6@1PEG&R*HC-zOY zj9N)MAelwvC92NfGSqEclh%q%z0-0x%9(1GA6WwW8ddaaCa``niU=tC%kY*J!rXv! zewQu-!-;eQfv}8gp^-9#(cg zePzycK5`1AkKY2}L(~!44cMWCOnX*j2F-hownwlb?ZMh=2iDtJX9_8T>1K0eBh}K( zXdFsCfxOLPiVkucK_>0ng2{zwvU>#^4qPvl(fF3FQAROq0+pvIS_ZotQqnNUbOtk| zw9-LI?q}nx4I#%d$E_9#f4ovCwai9fT<7NX)p%sb*aT(m#z6nzU_SG_|q&HIqwxNY^-rofYV+Ae_=x3;(nP zXkicWQ&>%B;hA@f1XjU}<_Akztc|24+KaGz7R2TMWDz{iuxw6HWbXO4Zgu zTWi?x5T!=iy^tD|jcdOM#;StHsJ3NEIEF z7|2bzI(9U`4;pH$WUGS6A3v&t(f#A_Yb2!|9`v*Gd$S9uiLW?2E0WWx?KqZWw#`Q* z({BxH0ma+bT=&!|lFK&C#5wI4x?sA|J3h$A2uD&~>GAXc2kAB4vR$tmLzteern(#+ zLu!n#7-adcl3=QSP0 zqNb4kc@(Wg-D0~)bp=9HtQf-8Ij#114w#ov3Nwt5{DDU$fj9t z%3-9Kr_4~ZrWFnafl2&LtWl2OySf5HkDX_px=`wc$OFyp;MeJJexQa=E0`0bWtf2F zh~&x$;Rf=ap*B+wJ>R+Ru*ndOkB-uqZmz*xrAT`I%nL5eoj+;%q)>;cv@Cww=-a23 zjkJ>6!sDejBY7A9|;vauBm-9^ny$jyCaR-jH`v5l$7g>&1fp2 z>OGV1B`_YurrI*pD^xJjwS6srIy7e>*T& z%-RldTCN_@0(ZHk!o4-V`&iM;U?HJTH!9>SIkV-{V=DAg*BzqsJ+N2o_+XWmR|TBE zqID%>GX^&=%lKble1Mb3MOViKU~&cDx{Mz`yMF(DTQADYt=s#aglIsheff+R<|Ds^ z%#X=8-<4-8Lx|qWBYxVa*l%<34y?A2V~Z3chZ zmYv-j`V(-bVvtr>FZDTgrQB%s3Brr<+IEVd`v4mF$>=A}`ZUY!MkzV65MJWM$n9}~ z*}Ir8gL>-{hiQtWA~CT&Ecw%mma!Yn?x-U9?n*P9mO7mD{lFJ&=qTBxj~Io7yDt1 zVsA8JdzqG&){$4Q)KNUY_3F&#F7Fw8Mf}^!?w?*@pJyInt9mZB(c%l%2KX;rn#Zqj z`1)DKn5A*uyIR5OLaJ-J*G3ylsn{`2#JC&i-y7JJa2c_>Z*S+49|_`ackf~qcq}U9 zbj%(Hi8;L0#XEZ1wCjGl4Qy>PibSdf76y(%*&jy}tCcR}IMC~({g)01;d8JbjAVi~ zJ~5b}CV0{36wyDPoj#7;%a=`nq1m(n)k6TaTob0hFmC9sV2I*PxT5pX5mPvXp9xr$ zm{ch%Il2uqm*Un^zLL+!oJ~g+K?Vc0*}^hvum;1#3fKI?L#l0rOBDcj4fh7?n6}sn zpe9i=_!FC0(K67y^xV9Y$m7wh8|+kBxaYh7E)g|wK1CI~-bN%v5Ms1oW)Ovr)Ty~{A23~I$S zkW_UqFMY3WKXiBcwsID}V2OAt~*NWXenxNcUTapYOVqhuGaabT^%{wJbyFNWrjIh2QsRKA5rYRyB)%j;YgnL}L&cJGzHTx% zeP$LHXR_`gWi#i}$@OW5u@Hz$+KptC#vTLZBEhx;UuOIWu;HVRh!hV+<#?WyRX|Z} zpjsUJs_c}^Mpr11BOl8{f!3-K#>kE_J-4$!S1Oap7V}e%8!mLYWXV!tV*&ZfoejwD zSjNt~r{@2tJ^ z*U1i0$FP`qVk+4nbccX;hbHI3?4;9BoZ-ivlhKT4Phig?WkfLvJX@Pt%7FYCgbN!u zP^hW70DHBt3md)JVI5dUy1<;KU-096l0w?#@~jjvJ3PCOD4^4F#W;s|Q4WfNTWC}# z`9oVD8)>;P7r2$Q<_XuCsnm-bSTYr(Bh6ONb$ansP2ONN9xnS>pMNQ*m?xF=z zYS&oFd?{F|5Vm(XHo$!-;}_0X1D>8w@N+mPTevX0IDH?_NPJr7m>J6+yGP#ODFp_u zczq(3g_H`&lgNXkI1WG2g4ftoWM!JZk&2WigPm)2nT7NiF~G*gch|RU&B;7tYu9>B zowK~3qHyJ!3autE=9;A1MILc4&<&J?LtHj6O>LSt!lq`eJ7nKgKLbBCtLlv6oN#X0 z@6uL5RKQNaU}juJXaYQlHZ_l$5tu+)#_8?+7=1ZNhT1P(jF3GVLklFKREmZs7K(&u}3D+OBP z9u$G~7tR;06od)a$PUJ4z1k$Lu?^y)evzgy2QQT-f30X_vRYor%ZEB6L3D-Brwdar zn4g>VCDSA5L6=14B2|K9pDRgKdryS!hh6>RG}xH;$TI zu+z(*TrJzhB0K{4;FhHh0+a-MENK^d%R|g^^~e~WP5W56Bbq3fQz$Nd`lm!0%#8+S zg}ciknr+TQ3n0tfjMMH}uoNH>6W6;W<%?dAj6AhXKjxS z!Ir_$$BS5%Xwr9(B#`&(IUe0zQ;NeSSQ83nVlFlC6@q#Lllx}s%;NdE2Nq{e&-s-_ zMTJW?V=MbcboxW6F~Sp?u;!`5^d*2W_~|Y$+OXE7Wi~CC5_J(avovB$yAi4Ry@ify zt}BA!8MVw?ym7E3Se4ccv1!{Pge-x4S5BvV5pNqYx!V|Ljwvm)0QL@8M4BB=Gg{2b z$SKf>-@iw88OjfqHgcKXTXsqM*r^Fs4iN=^C(#y}oXzT*3@WuNn3Ka&%xn-=RBc*P zHHTB`wMIuwAUnUd&bHFx8e?2MC4X^Z`4)-N#I(;SD`JDlFr#F1{v2C_@N}<`wt`?Z zUao8-X2y<^tB$#7W|1nn5s{S(rP@7de-ocf&V2D{sBfppRwxeEGHwol31GyRuV%mp zI6T{}X1c?08*iDYiT8JUJNuZN`bh?u8Llg7Yh`WASQ)09-`*j6eeJziZ%~)oB5DGl zWTklUS!*l`!!2xEq{?TXuaw+;S2t}(P|kqs07YNZ2FYR#*YfC7BD_7lb9rw|&z&!C zZfQva>nSLVLZorC7(6R&h++;wK0C|{wV-mfH~38Va(7PFh_M6IvLcDjZHHAngv2hK zKzVE9k;9gm#Wh=}5fWg9lAjt#W7{!KYl5y$Hfth{6zyXu@{V$wy2#yJztE+;*Tifu zo?xy5T|gDgb=w$h1%~PEn}?v#CPu;2U7Sczc#meQ%V%qKAqW;AmnL?lnhi47kM_9d z8ZIS7aJrZFG7&$4CmBam(q1|hLnWeH6P)kGwh{fA^vGg)BJ`b(+5IfjhNW<$;JkyI z#ee16*6Q54By^UlNJbuI%qk@*-!N!VycuJbA@UVJtW_sy?`ReT4gEJ>*&+Ai|lXDl&Wt;)( z3|Y`#Mv%zOsO}P|Bqacx#n2wpVXs3W64=a^642XM949v5vN1iex4YZhNpi3Fqmdz1 zKxHC?Y%!!A(x@@1w?rs+C3CXJP9g{`5%7!dZ#^#Du8juI_jsA2=c+K0S1gtw>`;h0 z&(3-dj#b9VfhLkq3~_twGDs}mTf_}6l=$rMw6>(&k&goVfVFy4Y1mtE8SR!v>U7$+ zOe09s&6Jc$C~+l`O)&DEn#JW1(xf|T=td$c(bOzT1IdW6$dD1i+PGnbzzzOd>_%gC zSX;To6vuUh-03uM@;#yxrv_4%$Xr;(1xEv2xHD zl{I^MO9<^PRlO~?c09_lc3uLcFlyNbvL1NBH5ujhC&6BhxwkeX73lkzFI&SC;IY{$mNhy)wiG}$XG@jXB zzfmF~>1Zo$YJjcg-vr zc18Axg9T`hw6euhC9H8H*-KCwK@oq9%I+^I;kw{g%+WD#>ePziso8KUtyB>Q*133c zLX*tB)>QB|f4SSZ8IYa5*!1t~OcTB*p2?|*IHmd5_2`URm;7KwjN`_U3;9@2MNW|V z0CCbBKTVMsJ<4a89E>{=|4JIc!z&U5$46cV+olqYe@M6i(h>>qTJ37a7{uV(Z3fX*=HNV-Nda0sd4nVnUZRBmlIu#5~LypqNYwJ)SG z;jP*@S;On2Vt%HaRQ}Mxne&8`o9juB>Sue%8ioH1Y{SJOWo{>*SQaH%0mgAGRfPEQ z#RySUw7;v67eR3*qWr2l}<^nSbiv%6Q-~*3$NcphF4_^XiX$|f?d(siq)U0t! zADii@bD8Q4UDHsD*2nKzukG6MQ9KaLJ7v*BlmNF<8FjvT=C-!wv zP?K4!qP|h_;k}*~y_h1593-d@5~)S4E2(yc+gv5$csVAd%<_>Ew*k4(-B)t9)t}m8 zH{}x4Zg0gZs~k%b!4IZqDH6kCGqSP<^D@?(L+w!qk8Ze}jnY7aU|9~A05&AbbE%6> zN;+bx!xeUwAd|We2+v7RNY@Hs`%b@@s#do<0cK84%v@Y+CR1iaiIwBjuD>v&WXdqb zVrwUo(I6}BL18BcJzX@K5LZcsV#LcJ#C_>m&p>H!bst)`9hIRz;1C4YIanMq8N|FF z@RW=5NG24SZtn#~~zSemvvpZHimXbxe zUac-Vzp*re^*EsgPf-;%N7tyY_DDnO+vgRdz3pRlC5{H_c>La7`C@HvK_TtCEhYuU zA*k&e=D1j8_A~Qne#*A!1BYrO?8L-4XhY6mr_qP8zU^YCgPC;!G2SYtHUp0M#^Vjw zumhlJ2CLP)6?|T)sZictjqHuU3+lv0q0wN~rKZ_6sh6fOW=FrI29Z0^iN=Ix#ltPb zo-A|hMK$JyjxNARqI1tbX)AJK&g>M7jx9G$4kh}!o$fg8)cKinQ?hCxC2QUL_twzy zo3f#XM?+bj$z*9^e(J)xrTZV4d0=MgY z8{Fw{gaUSF1WMw>K6;#{(bqNz`Ux|vS>3HPBi|7U z>1ohDnSR*}OkG1j(~`VPi6zGD;EjKKxqSxI&)+Nnol+lTrX1bJc$so(Ta0?#bCvWWN@He7L~O6bF5=K z<`{35IYVu^x4Vj|(b~XAv76Xt+oQ&$vfB3!Lp&qTw)v(4PJ2`*RbDAbm)=a$K}Z^au;!xg^uYN&QdMAgDPTVnQAp6ODu*B-^Q zFWTk7812_aVz_uef}~07Bl(3s`;p!rkLAJA@U6@v1BKW>B((A~^swfr6(81RuEq~G zxh^*m>abw&)OBfH;*qD|Q($5O4FXq`7s-35T@2#kF11i2TNe3?TzwE^>85Z05)Cc?B#&L@Naw6A`&(b$>zoK>0wFg_NV& zBlsFvZ+fFqeZR|2P4%uM;u)*3cIILuw+uWY!`(tddeQNbh-3AZa@C)6R{!+&cJ02D z$JB0F!^}6-X}wPzBAe2#%Qw50=-Rq=bI2r$9Gtm$idOf))1>f|U^eGv{K9sL7jT*L zoMwgBa3za%(mKK#Zw4b(B-qm{F;iRdI%QLGfpaP113TkU3tSQT;F-U@D(RvatGdo% zFIFZ4qG?uKyZNBC7AI-D!#Q>84sP0bP0Y7eG5xq`vy0{Q0-IqnSbPjWUb?y6WC3fdwDC@U&HPYmFuD;yo$ zurj5KjVq2DZS2I(wUU(MBDgA$(u=e_paIwgGB6rzI?JH1*?W#WCzMRDEU>|Kyjsm= zh*qPNdhbu|j-!h8dKl6Q&x}%8wc;&8GR%Y5>xiZ50v3_9b#h`eUlSc6Itwl@&`6lVH6rowlD(y?I5~&>sSvez5jq0W z6=Dr60TG+M&2IYUx=eO3u3+2Gr=7&X1HHGsY*yMMw!+r^<*O^bPM zZ%Yy}pjzw=aZYS@%XWYq_9n5XErQ*Kp(YWxt z(8V6c+vf6&>8@-9N~Qt1469wjsh8o(3vCrg2Ht7uGz533tf<;Y#eQ; zfcxMg=8%A)v1CtXiyio3L?mU{_zv5=fbif}S@ul$(;%P_77nsFIYcQf!Dse!FC?s|5*it}`OIGa&|ml&IZQ2ECMMQAi1{plwA z3@n+NjiQT;(zfvYjPKXx=N4ucXXnmwmFwip=UBGc_U_`+>b8&Zi%SwK?G6~_+GX~n z@3`Naz;(>6@DsVu&Up<=9oop_2%kHgYzgGEu<0|vcyX#LuCY08WdtY^N8R>|*`J185lmSX=N^#=67zF6GdbsA_Li7GbT@1hGx(Kd6)E)+MYND%G+@({K)C(wT05;K@3G(HzXgsh1ne6SGPz_&O z5Nw{SUMll7urpzIjcC9jt)^&zgqt9S|Fo0o*m)2Nr*ke%^ewb>sEs4Hq zW+Nz%)9L*l2YGMBC5TeW#+aiP_hoS5LvXQY>!of#$Z$#O@DkzsI@^$xXli(-cQG1? zFEyR7<0X}0t+3pHu=mlm(%1Fy7&e_ODK#mZ#H41nP7yBlVHvg<2BqevUwx%Icr{ql zL6~hCKDQ&Uw&BGCEsJp+A4goolxd(VW;8lLND@3q2}tv;kaW@xtmr;X0(Q89UIRUD zLObl&qmwycj0++uEtrd2Hsj$yUa=M5@Me;M>s)bWH2%6Soq}Wt&7p4GD;z~rBoVVg zm4i(<*oeI60-Aj6u)_)p4f;*I6c;EZJM{Qr_+4W97=mnDi4qNFfwI6sN2|h}L}b)? zO+ZwPWx@Q|IEJBt;>EvbjQbSiXba`duqeQAgFQxxu-$M$U`_09;Ok;9)BbXcT4Q#! ziN03<4q;AovAxJ;#nhJxx0F$P1}{9a){?#MCEcKe!?T)M9JA{w_5K#>&4g&46h~ko zif{p6SBjftYQZKZi`Gqaq-T#~pl=K|T8&eVAg$4BD#eQ;)kw?=C8(HS=cny! zvN7b@AnCQrJgoe&Iq*>S7IL~HE?6XJ`=H22%n>gQYLZ4CrmU;uh-`5*!)U{J&!r~z zVLnz7f8i?7sEaWAr#obML*Cln$qTI)g>fZk)lHmLuZeT}%1E*q6iC-LHxlCRIeEh} zH+Qx!R<0xqGZjV)KJM39_IzM?DIF6dV|&G9!c#628iD58MP4xr(>k9t39tcn9@eM6 z4WySKNuKHDFds$<(zdorfGbfl=s6^-zp_P_!xGSQ2;OCdOkB%=<#pclRV(;KmzeE- zPMQm6w_%LRFRQ?{ne6+O3BB;@xWkgrn{40Ytw1|Ri)AdxzWPX3*I-60-UC<>78Y^m zu^jNb^@6EfBvAOJ_o|P{s7!F;Bg0|WQEqyIw4Z5?(%Z7EnlW8K+UJ0rHfsPI*32A= z!~;d5MeIW3J;b+*VbV-XX!5+N2Ag2=V>On_o#s1N$x;ma79{dzwg0UOBz=2#TLgUcI*r#XuEZ za*TaQxx_sr;p~&`V+|nj>A2ml^d1A~QpZ(ZYS`%x_B|Ob*d?sB*h9ipmgj<4wQZE! zXB;4B<@tC}W%Jd~iMZ9N_z@{W>Vd@~X-6%qbsj7oyOE|o-Jm1IH*K}h84(FEyHYH- zr`GywNiUmub>wVp>a;38bz0?({X*;Z%722dqy(J!;AuSc3lmIa zUZj+brVHey<(jq{OQA?W8f$zo1L#?On`?2A&ot$den5jZUO?j3n9Vh|WUed~H zeVi2VtF?fgSY0OozJ+I~N%Zg;EgPfhKNOCIn5CZ~yaP&?eRf)~*}wp#(64 zFEUD)ZTZC3eaHeQ-c-U#qAzh99I6>?(gK@uaR$^6rWLfY9iqua4lN2o?U~u3PymmJ zeulT^ypWEe^J&tW0>Qiyu2I9<)W8j;fiB{t5;uqjBU#%9z0L=gZ!YqSWNfn{sj8q# zZNpl%gwdMR5%huNR1qbtR1*`>5L;)D(KfM)9r}?>Nz_r)$R$qlms(Lq9GvK|9St^> zw-QV14_k6E7*K3nmOiMiocCfKQToQEB)?b@d5z8os~u;sNTF6*5QbR^Lyid)));oN zhyWuv?aQK_a47=z8`3uD#2`R_E-KA(kG{M85sh_?EIREmfEJ0uFmH6b#Njfco*N6(;d#_$s+$wdo13w8 z;O7GO>gwz~1T5eyu+mwNknJgE>A2X$yIQ3{cq@j*gtJ{#chT-y&3iPWn^sS2y|e&+ z+2o@-5E|~wyX}@5jOD1GbV~MpYQanc*%+E>27IYD6VZB>YATiBa=aY2CP!9RHh7TY z^0pKoZuP~7CvPYQgc$n%}4E7E_dL4dX zhntoSOq$fQ*Z@5oi>gMEeM;qzRw8`vc|xibOF^6wm*Zk>B4MLhFj_F(nbc7>6uelV zb*r>Q(RJ!2IEa&&mo>QpM0Mhuh$Or75QMz8L=%>D=(5pOTTQsgX)RAq*vHeGDEdo8 zXm?8-a|60GvowLs0;`Ax1;s4mV5TZ1OhH2zCi{FBWF#My1nE{l5yx3t^c&~rvT0hz zf~6qQ=E^G8=cMA9sgMHlv#SE~%c}zJ&IwTJk$W>KX@!hWE?P~U(U@>tnvshs&Ua=t zaiW;@j8VA6NbcRh6r%ZsGRYxzY)%V>pwJ~274+Zs6mEeb|PTYmttA(1NJQA41=F4WQnR9{Dj}VG^9F?oV zG{RIyRpxxrnsrGOvN&=(LpW>Fi`?ex0|!EybEnJP%hR@7PWHrrro%?9EhYP!&@5wJ#GqN104Ii> zNP)_mp*@i(#NkwETjt3=F2E&p)MW%~cG3tI#l>tJ=+x7%>w1o~n9JrPq$zQGva*>< z^u$W66r{ka(TpA}oS;~)RBE4R#!}=Lo%S{!Imk;b@<2SYBi=bUUeMfKeBV=iKdbn@ zxA^{yTsz8El%XydH&D0sbFnU`Vx@X3LhLst9Z9D)x*ika4P@WKU^m z?><__-WN=zLzvFB7t@EbHq%9* zl3?+a`Fx5m&9Y*qcGVhG2lo0FmWXGz`@7~_juIvQNax7QU6D(o7FyAp#KJVH$#_{D z$;aeG#-Tf|OX*FUn;o2}ndO!0q8lN}RZf!%Pi00GGgQv;d^KZrYsko^K4m>^)KgJ~ znAPJbzpQEsD>tXE>ArQN?BhetwS`7g}Go4s?~V0&`J1NO?h)gpkkled*l(GTD*uJTm69i zkF4bTL;sGsys^1eZ;cj^)IBx=v7tem{S@}7blC;0;4MfM&aaRdU`)ki|8hFmg$Wl%p$6!Fyp5Z!Qq|h^CLe~-p4hk21>%b z>-(LA>yk~xp2YT&f^oo+L!fE}|58C{8vYU?6@LjQg+BI*JC{(q9Nfa_O{DU=^$5yqBGDv9iBN6he zHSXD=UNf|t7~cA|XF54Rs7t^a&K*VkevhK86n2^%7tY188;8-W=sNWdu2HhVSy@XP zEXQCZbfU+DAP78lV)t@^k3PA^R55)8V#ts%i#ixF~eR8Z&!q3_4NrKG49cS|y{b)BW^ zqiW90Yt3@D%D~W0VFHw`ReV~76QK9e`~q==TJbFEI!%N*ri>0EEcVf*TD9j{Ut`|* z`4Uq{Lx0hs$_^T_YsTQmKjQ?_n1{I$i^FOEj?g%`TwCh$?^2WC4E1dXV z@CQ4>OlcI%!Xt6iXHVWN*_$_!xV1vQUFkuMSrSRFBxSMrLP@tYqc}PiHHKp!o}1YU zNdDs3!_0&VgqW9ssmje(C(o*{OM5=Y|70fAN(}wZYfH5RJ1x-ecCpVt;y0i<1vK{bEfljzL@j znhy|oHBJ*kCM&CJ$j-WTz~P?wKms)8lTIk@mC(VvMYD}uJ4NrUmlv&AS$((1@tSTw z`p}5z-i15bH(}_E&lU?sp1mAP^dl-m!yDgjZ=Z)G*h-J45{MU}P zl(fxmevL!fG3A=j5|e^ym9q-YD-$IigYncPAGkj8^pfnuq>+y6)TWY@ExCDTb8Px_ zwyMa~mgAVvIF>C+)%=+gE;aH}3`a6}F*wLN_=??QU@8wA=5V0{V>qw!=Fx91C5UaXE&;eO#tl5qgJckETq{Arwt~hC z)6x-ki7Si}OLVrZE0MIP84;GaFd$52$)<3!5Y&OjgJuG<*psp_E9y~vB=cgo<>h__ zYRnU-G^S<2z+Fuen8!GnY9*+PXXt@TltWzxxMH1xxpW_cM~~s@q_oFFB1%{XZqaZn z2qPXVYIWY+mHKTZf~-6dG>?qNW666vj*Y}*vMiicA!Xe_Ms%1MMuu#g?_=}PNLUC> ziqwjNefh>pUxP~)(7HQ}=Hw!$zk0Em-ljKlsAQ!}Tv;h*ASXAM?K%K9bR}uEn4{BCxOKJO8be37MQg2@3AJLG?KhV;)!~cSvwMYujPbXF zH#M|=Q6$-FkG6attH5R-vb*LHjXgB6``k~V@`L1II9*%RCAhs|G@*0xRd3Hkv9Q4i zxWKkMc%iMKDKH|!+TfwP340Lp&{HUAv3R`i01gxHrCf_9Ug5!MJuH&JDW}lbo^Vy+ z;I#dLpKB2Li$L;UQFt0QP^S*HcT_`}7{_{QyIJ%1&~dL12Nz_QrRDs6f# ziN~UNYKLOT^&b0IdtGYO4WIjKXPMQ;IA~pX(f&ISD~DZrAB4sb(!`6T7cOypD@z^dlOKNg3{1ZGGG^pBf+*2UwS&G%hY-*qg3)sb zRpsFX_z8y%%M(hEXvE=z=*Q0;z)GM=o++KEz?f6CTK7-5su-GnAe)y$nOx?>jMa`1 zHc-N+-Hi7Qb#UcA1huvvps9f$)3-x0s%i(-(6R&51UXZ43_3{Cu@Vp0OtotQa>kf?PnyVRTlMXT3ZBSW<*x70eDgV?Tn96vR}V~RI?=y_ z5MXVf?^==Wkh`Z6iAbC3^NdKEauBv9VLeMRq*c)O1U0y4kTuRJ21OWCemm)?-WzOg zEmL`epp(aN8n8JVYu0g{Hc`b+CaR~E?6}?;>_n9__)*0;C{5;4Ck|>vCmlp;hCCvS zYY5Zi8iBdyVAI$Mp0!CE1cP6O33Rnm$%Bt`C)3KDg*xXfAoSOwSJXlM3XXqjM2N0b zV}r89tP@;=olqmnYeRQeN^6*u;E0YI%Bv`#2^rBngHcmA>Z1Oy5zADkZVfyC3Ei_& zD|Pw6bU)_BMweY>xt%pV!d7B4z9l5a;z|rkj01pXg{ydw5R7Y zOgw~iQw+W?$e4p)H8R#1@nwb>@ttfi0yOiB_%_Rn_&#sjQ-IhK@+gt^!)S&R47<(csrlKIVhTKJvO>4N`5^mPDO^W#)Qq*v52_|?MbB~` zL{c}`UFB=w+w@<$*i`QyYhM`|$Ho5GT@Ih~oCYwcJOEW1LNjet5Qd&`=ug%r(`=kI zmqeS=s+Wk`A$^flp`b0WJLrf8nx|!aSK}5`e(ib`al8?SH0*r1pfdfFEwu%59m1(~ z)=pPB6(M_O%sV-(zp>9#+F3U9FM~)x$V)qgG~!>4s>L zu-eP@-v!bU5>cLVwDZ)?Q#vV3C!|BnH9Jo&(_k};-m1PPO=siz#Gc(aD2=BzlEsI~ z+Mt=PE9(DelXzMum?vemuV$i}+5huNmJJa4hu%nOvB>2j#Q|;BtS@>fT|pUip4O3a z*tI^*qRJuGN1q_Fh5Owi#YS-_X5_iThMHNb65J_vH&pIiKcz*lu5axx*^Iq92|7ua zR>vY^-XOP8MRL0wGlsUSz>Z^voV^VK|!A2CNdlklef8)f)ckOT&10ACc% zkXtMexVNci{7!F^^C}GQIL9f_cHmdQSU}*@rli;`Pop)V*~-fL)m=#zQF(CY6q=(Y z+u)TcqyQ7CMysIf^Kj(;(p2_Bur#~9y|**g68%fva39*;f<^mfz#@Nzk1emYZdi(q zOKV7hdKqdYS~`H3j2;`n%4y(U%sk9x36v&&$p%3Kj=O@KrmJ5rt?AU*%?k{36*MtD zt++j#VR==cadCT^QCi3BC3=ssgyfUHp7R_YAu1tamoSzB4H&+?it9&n_fSN`0T(NM z8BvpZdVAG7vChqJS~rr!uiOMIceS-ZEKLX^LYy`gC2$siH*2}%8^?!Rt-2sVU$_n% z3$q)3<4Fl^*O<#}x~8+&p{Z^*6_Gq(1t!S(PNUvAWCK4`WfV1?>|Ln6muWQ6j-(F= zf<>262EJ7q?TXqP+SNmFS!S+liV6*QPHr&PuN@9D+rkHu;EwBl%)*fnrPsM(K55}RB2PHR-tkTG>*UUE{eZ2h6A zrN#48vu8#!*IQ1c5U66)j3AK>4ROSI}&)p}o{Y}0Q6@=rRHG2cffYNuNxi)ei zifmkIRNGU>p_1LQjw5i3iGCMXOm-xWy3kN|Cu!#G-D_$JV(Pb90pyLr#{oS2d%W+3go`2;w(H7J0KDsZHWeq*n%{aL3 zZf;A6l~!rmtUhWkSs+#ax|K;W<``|@Z|+bKi|q$}{*AKWly1>*gpc11$JtJOn4b07 zt=O$Vno-peO!dHQIK?+2POUkO_HC~OWqO&H#YTxp(n&@lOF=a;fB`}r z?XiZVX+6-N7(;5Xi2-Is*5i2&PL*|Rg|&*8lf54ICPpyFN3%muqZHQEEF2Gw6$eLQ zS1NlLz)Pzxwy$Gm6=|PiiE82$8F6CE;#?rq{8t$zbqDVD%@OthQ4{vuBhQs;F7(ZC5+;5wqg`~ngyf) zOq>)XcjRW5DL@T@nTqBFDl2L5|-B>(oYecIGMY52Um64*4%?4Gh*ZA^?KrU=XIFT7;0xshYkh<<| z>L+xtSS)Qv0}#armTeMs?Tx5sd+cHhwAYDOA_#R8lH8+yM8vbLYFp@d3!Apwu&z-tB{-z`az36e2xHOW({_4~amWg0 ziBD#Xc{s1EURv9S8`-ZqBG^v@R&LWL=@1bt<>_9dSedz^yQ%jdp=y$=p@fX-FC|Ko zAT@EFT%MO1)r_%ztx38(*qk4;V>Bl{eu$w_y)Y7<$g%A?s@GkD^BPRO#x1}oMPGK-tv zev<6S$&mSbi*G5tl%qCNna)aZaY{-ja~dVut{@ZZ5S(x*?KKzDRmvdn^*umL#UWnu zWn_x(3oNY4VWW3N6c6$UanBOs4F+o}G!4x_PaMfmcU@0MP4JMGKB*K99lh$rz`Us7 z!=b<^L+eV9lG<-!9tTPseYu34ptBrv@I-`3d>YrvPNVQzqm_{cC1ce;wi9P@5M_rF zlFfp4RpOW>Xoc$Nb;1&!Ga`!;Xl+uujd6kj?TMR@dc)w2E0B^AP`Wk4F=X=JB5?P-xuc0>{=S2I2vlN?t=QqPd~FxOR-b0@dJ(L;`#N`tuWM|#IKj~d zTtD75d|1N>p%P^=2(fioN(!-yBqn|e(j`|xYeUnc7`?cnKFTG%5zxph@mEnO?^^qp zFxRRM2G~;5Q6oLFYtBuFRUn&k;5br6Ip^_%)XI<>U_w|b@PweeFpP&?s}lJBlE6wO z;!AyPy%TU1oYnuo7+G4ZIF)m?JwE(Uq0-Dzx{;C{{zh#G%R?C)BiYq6V$q zMz!;fG6f_@<0{sf-^sZQiL%J=TceUyi^zIKo4v#!qD&wGUhg~XG*JQzwDz9v+ zIvj*a)o!GMy|L;@O6>~8p3=4`7@L`yxv$b~B<(UlXT(JC>r*#jpa(OQjv(A+gvlz&2R9R3<8QQ^jok$dHw>nTWNTsjHDyYsb0Unp(;r z>7TsNX`pypkH@I1n<({b3&vI&Ct5wQ6Ny0)C!3e?3lq(lF6pAy3d|M1Us{YlZ3wge zi?!lvx5BcZ;Qc#{v&_tK62kajlg7>(S7-)=;Z3W79?WEK(bLXE0To64t|30sG+h6>Gsx z7l$0Q=n1?*6<_x3!_qUG;4#lw?&LyqYsFgK+z!yxxx85?Uugb)1rr{r@lo?G?Q@B^ zCqDxM- zwi>fRPL^9GabOuA!($1t`w-EB?+A;IPj(M1=qwHKb;KyCSL=wXT8dVLk3~>oDr~0T zsutB$xfa%N81r|QJ-|~~A+s%sA5O^0L4u7d)Je?Sr$stZWBt>x$~@=6y;3eN!T56a z7!3*b0z}|w5ez;{Ix=K1w%6*TaodMzwmY41Z z90}nmzMQ5n#u3A^uL~losg#-*Ev{Hwd{w$xgrOBHopsRMb=gC;uZFdhoQqszhlKAF zDk~KSe8T}L)RchBUlWj8Wc}uCB2|;{t+hIqc%_;{F<(V}=)7<|E@W2?Di1wJvMlUD zMndW>>3C++ol?JM73!VXNJ=)m#uB;Ksv31HS~^TH+~11f;6n-*mK)i~iD z2@{wbX+oF;C>vGd$)-At#L8<-6MxORnet{6p^EY13LpV_(^R0eXR5*K6c;ZgY;yFp zx{BW?>5goOdA$mRTEpjVO(dK#v>H{{Amc>!(bd4t9o;BAq$e+`Y`YTzZQ3O?lbT@| zmeRs%W!rH32XEwFTDu$Wu(cYR85W$KOUu}4;F7_k6^L!TWx-;3^A~nV<5;P8kmCS$ zwI1>7nnw$f#)4OBO%>?~z>8bGW%StwE1gCv;i~BLnYj~FXBKA8Kj`mu@KEsHb{Ub% z#M8+KrgLU)dMp{U7xV0u%6jV40~0zm_2At3*~OWWA~ho`IgS~0hFMh4%HBYW&I#NM zA1TGU2{aCacK3_I$v`Mt&J<${4zSgEcwU>m22zI{Gad(y1jk1nOv&q&K4HaprCq>P3sTnAJ)K!8O@VS0I?06dGJK39v z=8$=SA*&nyG$I(k2>nGffR1REhgHEe)bsVMFjhF&ju%1412}WEmw_88JBMhXGLIO; zic5?kjR`ienR}GjkB)!f&cc`_KS}VE9^SQuqpr;Az=l>WRY!yc$`-5wXCWl`|MIH&cX30&< z(xvQb0zVgY!$t)DLUYg+$5bV*ogjzC>%lP8p*loPaJ`^4u(qa^7@P-MEaxprW!b>_ z7-5UoB&{2wq!#hD3vOqy6xn_~eY4qZz>G*aVO;a$ZbnEGQ6ad}RJ#g@PaP@A4eh2b zE9jUNBXBG_?F-lP{@Z=neti=@OVcOq_$J?y0F8Sk0A6eMM>V-?&Ab!OtZ`||MiQk+ za@oRs1Fc}2qZ6W7)oppUF;U0!i6nWooyX3Mj@|3O#M_bp9*~>WRF}z^p zUt<$8>~pEYTgy=}iL0^L01kN|9TUjG)yb2Y3+tsxt^4(5^?sPwKq=FE6sd|&o5ijr2o64pYF z8hUGM+Kdm?*hcTQwh$}5eHG)O4mnj{l(5FHLq=w79iVEC(B=v*%-3}FjLf)eR$FqN zOU0^s4O#maux)sX-H>Ldfdg}^+yswXaZS7qk-@qkYsk&Ptqb>+78xakk_J_k3J`0j zOVAAzCRX02C0$BjJVcp}V~u<3+Mtb>G9~YHt;|I+>XxpNRvT}%o*!R&b6Jf8gGr!N z>a4do(`IMp)s_6)fMv2`;mf$#(ZF(u#cyhhGqTlvceY|`%tER$dj(rvy|tp5LjY>x zG%RAhwY9Ms%7DIlV6#yeEaybYYF!%x0w38!4)QRM=T`Ga99{Ua^9EIYs7* z^CoHCdyT}s|J1rB{=}qiz#6UO?*vK)H@mo;jve4wV10(_1&HR8=rcy^gV+v($HJ0v zaM%`5r1AK2*W=AR7Tu(YtAtUTtA&&*w2?|%16?Ivo(9c0iRCn~S7ADS;cWEjOxe|F z3*#oyNSl4XFk_tCA3-n@40oAKP1#;ii^tH6P95x*Y)55JXhFlv&;Iw?!{a^Ef%k z#;S@~kXu(xtcNwLu4RQnXSANpHaUxVotGs&nv(~|<;~$HdcvagR_EDaqRc5f8%mFs zGz&@-dHT)v>(X;|%C5Ewx}0pV$kbFm65Qr6eal?RzWqHL9Q#;ojXGW6a)|j-Ko71B z*mpak(WNUJmxk#bNutazPn&;0dfsyIL2!+|g_XeDo>VRdJ{N@bs#mja#<4C<@;bi&>-7-Th$F|RmXQfby>V%t@ z#YVzt$TN~p#$$!pIYKXDlbpsQC@3!7&bJTShrc^Nn9dUxC^67-H|EK5DE^aPTlb7KhhIEbVjj@_fN*>RvwMOfVMuJSe)Ds zBeAS64w|}`*7jv%BTssKVsHlMIEWraL|mq??t1#upRuA1(ld5>;erhSiQHw_z0GGp z*WX*lU6kSKT<(&IvzaE39y~Wre6v}uVbig{0b9&Qe9~+)8j}Hn0S)^C!=%G<1N>0E zQiEVnw*qrj3dITYwjnh9c!0BE%E3xi!r5S=L}HLpf@ba!h#d*`Zc|}p_fObNC`!+) z;bPzKXg4r%T+6WMu*jyQJ6Xn1l-*=yw_0r9g(`v9rnLIm{=o#m21Z+pCJpAzLr(No zYiu4tDW(k_z23G{pBo!!0Sma#K=YqtIcz~nz(tWdxW*aDHAYw(Iae8p;o%`11njI` zd0ASXP>!TnOh2lyGDk5v$)yP(m%ci<`WQsLCWFf_p zVyc#g6kA+?5odt63Rx5=;el097Mqj__Dx2xE8?iH@@1^a?d0{>%1*?+O{~9$M82P`*dy4kJ%REPAyJrP;k|8)p%XMT z$qZXa`D6$|tHfEhFSd2uiltW5n6-4YD2`y&@Fp8Iqo`5FqhzcLYN-@DDP@f}`nW3M zD$!cekxu-w$hoe|BN{`TA9`wu1mwxy80wU+GxIjPP9CJ4bRRhDhQ(_TkxVe~cyYln zi3mkVNbHGR9?^Z*ooGFQ;r*&pv2jOXWSf)|`>8?eVLgNq;0M9Dh6*B=LP4ws7s@PI z71M@JLl)hI#7tWgnc^53h@`V2`w;fwz;dfpgqa5;U|W1~3a3j0bvvnlBM#0q7*9j) z#xZ?a6quj-!8PFCMSX0#lwc3H1FB#)SWa!S*~DbHS|S&%@Ai>>NeD~t`{F8~aAhGd z^{d4$y=zPjhluNTBA~E(N++nE(+OjaAH;5#F7VRk268r^Vf1a^dUs1M=?5NUVDWij zb9W;QrflGwi51Mnw{@IW(d`8}Por#8T?(iBPKgQCJx>eXhZa@@D*ZGYWqDJQON@t* zRPc_$bi@)HlR~q$@_nwYCU!S!)h|sOho<}V8@dK-8y_~+DOd)rC`TyDss6H2Ws${A zO|dNk0m2UJg2GDCe@9q0?=?+{&03wE$!s^X(}c)X+v;YEY1saBSH|N!Yee%D+3amT zsLSio9C@Y$3>Oq9*Ji=srAaYds2-8?v?BRdWy0}O!_mL`J;1wYc?MS3< zwLPnYTf#qdxBo`%oyj#&d2LD!45DbHi0H^Vj~eZZNQ!Jnz!9i#Qc}>2SvPG&JCwu| zP~{+-;{or5{ptX;%f}fPJIPv5~k`1o02Q1Oo?kGQ3jNW;H{q4<<3f4bE97peWIPa zva>c&uFjK#DkQ7aSAdOacpe8>GQJM#Y{@Q!t=CcC&?qSRv>19wirJ79xPhLN^nkN- zizXc?0aht#Q)?MO$kS)iVw>xsq%)9IVBiu{w2v)w2;^c2_vB@3;k^+pr8`xYZBHRuZhp|dJOF|wuvssL^CAD z!5DHv0b@)wN%P2PqML)E8J7F5QGFIzKN?W$m=ryfuxk929pc`$ox0fK$wf+y0e!1^ zGJyRyZw#g&^Q|F(1yPeaI*Z{o@XgA+1)30i30FnXsu(WDp%D&mR zAPTJ9{eT#PjqZ>}+u`!ri7p;EB;o}63oQt z4mcxp>)9b@gp#uPMLXpa#tubf>(fM`M;gJz7KB9Az6(XD&9stS2*~wdJR3z~Q0K7- zpk4ZR@d+?iSzaAN^mcW5CX)8Zme5)PJKEW>d7unDB@xYy5M#S-HxAWuMZs*6h z-Oi71yPY53b~|5^T}mf?TS5u2loDV`CBV{3fF-7cY{{cg`AA+RyeQF30xaJl@2htODCn75jlhgbAYzYW#R3!Fo zs+|k;!0TyeW+`&{Y)d;x0n3{g(6*V0B?$E1kl0*E-rV z=O)|*+{x5Ap|iW^`}$kw801GAx5 zQSdg3_N{beo9FLAIzGMWOku7{QtQ>nY0wgCX0oZjs<&Lz-oL2U-lH_#+UJ;3_crv& z&tPqRW=C%wYxbA0f0H^Nx(Kq?vjqTX7vX~eAa#|^1}*_|#be7)h$5MbTlaCYj|(Pa zRTfTj`R$>iwmz21 zWHk_6Rh|EG`&)p2rur_yudF(6yZ!CJZ?67%ANXZe=Z4#ECcU4l9`gmjk5rv+yY1D$ zZ>jE$_^-MBb3zxVUjh8f)#C;4Rh^@^KNI+E)hk~He5C4p$K$@|aaHvj z)jL(*FRVIWa@$vs-aD%QTj7-FKR@oL2>+ext&#p8-2NxT|GnxxqW^-b^VPR~J@kKA zeWKu3RGp8z?UR7tRXtbvb*s*2-u^u3|FoJ9_}|_>1N;}&TEM4oKLh-i)gu9)yL|!p zudA;O_<`GB2>iZkQ}rdi|MRvtk^cLu>lIGTsO@tLk4IhJJ9%uia8rhgu)G;_>ghWefPa)(gG}_)@!b_RjNn zR@Duy*D1ZK-T9XrZ@j6hZft$=0Qjz|^O3`MT~}2%w`g0-|I==K3HjaHI{C1}&v?u| zkEyELTOY6f`@5=h{MLJKt*Rrf^DhUcK2t~Lj#Sm1t+xz;TUFayRUl^@RM5)D8F{qx%V-@LVlmxdbi?J zzi+zk$B6&b)>{SNR&~DMx^D#jwAS6CXFUA=El-2~(_5TNRjp5{I&;@QLVCwqsPd}T zYpc!|UjL=Qceh%*z@+!`8@`nCJ*)L`g1@2ayy}MU0{)EFeS$x&>ipCV?*M*I>t`-I z{f8d?xSOl$xvgg@d{}k9`-Yz&{CTa{D*ZLa-}T>3`ctiqXs=&;%ngsNs_E8C1z)N< zH$C#LRD>#NS!U;nM-_dx3jJz(ndgYBPbSJewz*F|}M;-){Ke?PDFkkTi;XYhYj zEjdj7k3DiH`G0=vy;0xxjZdM!S6iQ;^hxg>*S(AUHd=ob{?7!~A~KhaOc`z1BMg6aOQRsz~pl)^U}G{`{kxK1g|XTQ64lpz8eg4QtR} zX?=5)_f3y}*Q2XyzqKHk^gn#lN#HMNy-G0idHCoz0>8A?6Wpyjryl(f@XK4rRe#cd zbNlVo|COy5Xnd0YkKOuT8J}O=`YV+eel@t^rS#XAwO*t6w=&)y{m;bz^452Vp8Wp& z*1v`Rt6J}j@%{c=KLY%-&?TgLe8H{4VfMx4uZ>pILQ!NA`e!wzZ@5 zfG^!~h4lWf)==T(w{m2g@Skt}u3+MS$B|b9zqR$=fdAu>9|ZoT)?0)A8;^V&@UOOR zi1Iz}j%m{S_10HK{jR&?(ZFwSy*uEi-ElYYZ?}Fa;3wX36!@L3e+>9D?)cw;|Dg5F zN}u_E<;Y7(|BqWwi1cUfI79fmTi>VfHuL?+mlFQxtv3jMfcbvp8-U-_+6w--cxU&{ zs(Np0Q{xGK`+@eO55d1%r}u#2m#@3=ry0+G)A}i;&wBMIcl;^ozpu5_2WC9K>Cmr2 z|97oQ@IzJS;-OvOe{6l9=0EiBdhB~1TU8%ueM9hvcRcowfd9Gm!;#;U4;_R4Bdy<5 zey^xHkG|;#nJ?}3lQsTssyffU_2rDe>)S8ac)o%1U;lN?|C`!huJjnszx>$WB)yy4 z-xTS6+@VhQ*$Kc)Rb<=?70?`{7B z^YLi=U2qM>|A#w1K=`M%->CN4Zg>9d(0eK0r?=mr@?Q`AWB;D=A8Y?+w9h|1_IC2S zxBcErgwr2ibK?)t{?B%pHS-?+hd;M}PT{PXck@5|*T|aJ_Lo!@ z0i92-ooX|-`SyENANbFaTR#DKq5TKSZ>Q?~ z{h<$%-(vfh1aDQHzdrPS;0N1ZBAD^?YlnUZ_;cFdq4epmcis45(tlC=`-1*mhu%&2 z=e7U6VA|)MhyDoo^V>fv{=|B+*6LI2mG)N(ro7K?o#AJ_{p$gLdF$JOH{1UxnDz4Y zt)B(nYCmho>Hn;CnELkG&rbm;e@XjfwD;YIpG~vAs{QE!fAZmD zz+c&ZYOMd?fA}@PU(-IU@RwAbn-AXx{O{Vg3#NXLJN$Uy|GoVIwFlwX9li^%D-K8&L4Uq<$rbiy@DAZFFLdg z{Jrg8ituM0ng{-Y_Qxsya@F~+!{1B%A8P+mr2n$RUkCid?Wd?b@Pk(#`abAi*S=2l zjF)dY{C^Ps`u5*M`M>_~Hvzw~eI)2FA9^|TKiU2(!B=SiLx%|enfA9v`g4b02>j;u zl+ybq+Vk*F0smb4@-8s^>f)oWu)h9$`1gv*9=I zY=45K*Y5n_jX%P8|NZt$V|+cO{ppOyKWx8GF!SMb`}=|4-F`Od9sa_0=XurhNbgVE zzsmZ~LSNl^^Am0sylV5c-FbZVv0(qKeL`@z-T9d6@xXuH{)<;S{4aM@lX9exMx`=0hYBK=Rg`AMYzp7wG0%i$-t@!$S5()-Ky2M9k*`#*H^ zF5&NOzbW$XR8J)QuiAeS;h%c*4&i^@K8$>I`0v`C-J4$y{QtCnA?Tl2eKPca)Bcfw zKe6fnzpwp$qJMhTx$%~pZmFujZNEt{ zf8Xva{88=B$5tN?{15HNfTm)dM;&?W5!S2rU$S2k{FcXE5B!044}PZh{PkOZ>sGq zR{&pk=o^Fn%c@raUw`P!fp36^zq0xggCEbRdo?5DHT=DSzc=$I+&k%qC-D2)x%&6H ztk75$SKrH@X!Q4QpgY5#zF!f)UrCt-pW^Sv+gY{w6Rh+SoM>MAnN{_l`Ac}^p}((X zUMHO5DgL)IS6-p~`F$OKZ|3i9{QVJsscZ@t?YVoHjko#t`6B!m2p8>(Xl?y|KK;{s z;9tN0wH^MyI|ei#)W2!Gr#UwYC%W|eR@SaE-nYT4t`#T69i{sN7nV-_a zC47QYc*3XOgipWMqA$yk;(U9jStqqc3QNC=C!SE2^}l>fO{eda_GlTtlX|9fM#Db# zGCK_Zo)mmZbSa(GC#kNZabJyeQF+}E&XzJSl#F8#h0IYzQW38(s{@?Y&YrI+HW?DMo=316c8FN->S9lt5;ogv?-d}?FG zRhd(osqOWf;*{;2@F||^Dw!(PTQW@gPV$Oq-c#UjN2XEQ!vEqrk~i|qD4fy|t-d7_ zm3<&tPH8Hh!jA9xxA@G5qh0_1_AR+n?NR<}%}9Nwc2v8i_7`oEpVfYnc|Sk;U9<{M z?V5hSBKl6hl3hQ{-!1IJHMbQ19OFy;UVlrm=Kj!0pUZy@kG~x`TjN^k{}|u;)Atu6 z+rR&ahkY{ppbxS4QJPN#uiu2bp8ge_{jJ*n_RrTa8`%@u{s*z>(v(ne@yjB0bi&-7x)R);{u+k z&Hz8D`pd}gSamP((dy45{MW1B27X5MPXYffXL6b!`ot*&Zj&xq%od*3_9 z_ulWWncm(1T9vwL)vDN4GAh`>;>Va`g z>LUq{@$THJ5c~(!Sj!*aJO;m|8enltr#rZ{Dk+%pfwWFha2u7&UkB2tG|IivA!tol-LDjgcD-vp2I%9CH-!uzW)U{A`L-)EFITJ{WoHuL+0zP%R6 zY6a}p;u811etaaIQZnPZh3j7Czmcw=afS0rAXpW+g!kWxO9#SlPdtWjP2q~jq|^fL zFK|g&m9qU;;Wgy_n{jov>5%+A{J748{|uL;m$=zXe8tc3_{NZKnYsLT_tQ$k|C#hi zo`zz6FSCDSw+;E;i%WEz*z@0SA94DQ>#ryjLcdnnQC$k<>8nb0x@N|6{>pxG^GY#} zN}rYadT$hn8QJ2A7@i}a2ixPgF{d{6t7UgOabPyxPe!mQ>kw~ z%>0{kg&4)CX%;^~SrSe2lC^)-E8iK^lorOnuhb;$XH*%|gB=wr;f?oaRU?Jpj`=io z828!KtJc3+&L`N9Q}Z*zZ>d5pbw_e7q~-}9_w7_??B`M0gb(9}lLdYub=A86#rXr{ z5~_mbSJk!Qms8Jp@lm0|-gsnXHOlgv=;rWisF#I5M} zzf~Iuzp=_GnDpzW=7S$lwXOZST57iD>Y&62{&D97@oAw#=?$);s$svSYHIB_(2cO) zO1bbOPBA{{)dsCqR{W2^eF1O0u8q>egNOBX_?n_kGj`va_Z|KfqtB-jpF1M1-LW8gs1rJI>gmLE5%YYl zjINsfCABtHxi2GP-!}{5=cwLE?S=CteSN$AvFEoFw|{D6sCFYWE-CgzrUc8g@Wmfr z&gA|gvObWz$g5!C@2$@aTN7sSKQr#O+51%9XV?*AChv0PWa6{~1>pv&IUtIoY zo|u&+Et1=viC?+P{@Faay?+&_dNR?k@aLPU63vtQ)n$oEkA&LviMa}-b<{6Mja>U? z8Eo2YBpt>5dD2?aa3S|qTw5)kPufpG4=m>{=`D7T!uyuXcO&;|_p|ziOZZXT!}+g# z$IKYlF0MmdUvY`O!evZ8zSYLWP4ZNpg%|!T`8O%$z1kQs(DvGN=z}(~12lDPAN38CB&B2EVRPlA@Va zddoi=Oi#(qq6%1?FRC3lt7>lX)TouYhlo#MHCFg1sqdZE@Jp$}*8lwOAkw3>8tVD4 zLh*q`_+Li7Y~43a(Fylu)u+~e_24VSr<{ticz5Ih61coNW8*h3@)>XiRo(JOyW{b{ zqWabHS46%Azp^@FagN9-;Hv7R4R2kFj|s1uYGd8cbU(s&1ioa`zIn}iBEGi+4{F4P#-C8t)|%UzKyy=cx}{8535kGl!K9W_RjkU0}7}SH7-(L*{k5-v2&PCd>o=qh% zi%LXdQY#9UdRPtN{lTGA?m6E75!C~XAgE*RR~{aWHJR^B`q)w#KXX zjDMkwGJUNksKtVrf6qW!ky*;CRLScr5m(csfe- z)CQc(UHU3AA1Qq+!E*Wf!*55)%Gjn{(hlg)C3b2O9l1+=D{~gUTmK$z9^O{VWZfqZ zL;78^;#k^R;zx46=-wx-TR)8CchTYUF5zK|9r4pQ^Y7tqB`m++C(pw3nc*-Ko$U%t7IliwwNQh!w7s%^vZ-&4$_&nWz}T*8-rp!nh2@!POscOjR|ExgRN zflJ!f$^Gv|-iy4+n5^*RT8G)$uxnN;`Ws3!lE5M=HOA@E$-|+^srFG`9&y&9_N2VW zWh#h-jQ6pc${+IQ4DD+8Ycm81X^Qhm7lUi2k0&RlIUjd6cw?GP#A1dMZT+vAsyY78 zamri&N2Onl{kc9y(kI~mJm=(K0?EBSE--YFES{7475H16Ru7u+rUair zt-R%Iwc&pi{R81|bpn>(BG?-K+fFu%+XuUW-*LSD|5qyHDhdho;ZXcrDc#UqBx69G z$YI{MlhYR*srCp)zdYd8he7of{U%B8Aj0!Wrw{TMk5f;g+?Z*;`K&s}^lU3b;o}NWfz0b<)p7c@^7uOG1dF_;T zAun7)FA#apF6-UeAnzshtD2uwO?%YvZ3OOJ;+6Ar-2oWjv?7-rC8$&+Sy{Nxx3IW>$PY;pz$)ZE~ zy!DR*^tU#CeN)dOe#7*Bi;JbM4IZt#+3>EV9e~yztDD;VzZiFo{2!+m+4m`&sRZf$ zke+GF|K8|NDgO`axt@E*m(vd>f5+?DZRGt`h(*TSrs-0|l2H&!LMvKhZD?_|qm|Wx zmQ+VtOPy&EbyW$f8!e$84FB|EM7s|yqkgJCZJ~i`5T$qsEg=qYQ+#m7`1NSsdn|Ry zL$rM!p-esM={W-VKR|7Y@ASqw_t9tjzlj#4OkGtH_2U1f@k+}W@6L3L^LmMPk51r! zG%;^0KfMkSCmFvj?uGwEcr2>-6h-;+ z(`zJgYMA-|Y`k_Ox5!1vpZ^=)%k+OvtFyedR&ms0@;ylbrw=wGRNJ10UtTqUAEjnm z```0zoYeoz#eNIg4>}wAH?>+We62!1sY~#q)!Tww)BopNHyID8AoiQ_{h0G9{%2Gj zZFpZgDWsNF$E^KZO7vBnN^Qf>q;lgvhbnAwAy0}z>YE<;$NNNj{jYo~j&7Xb=7FBn zf2`sa|GKKs8nqtxMOAvi@RzGq;Nq&Cwg0jA{X%K=gvGxE@>0K)Q>!g5;;qlFsPbS+z)l=XG>VRNJ zg(i9J?MCWd!KCLXH35EObxYEV_&3(=NUvrpQy(zt*+KUJw^n%t!|$bsfFD#bHvFoA zri9-~X^Zm(DuKJG*4F-G`YG&l=%mGy^mK4{Rng*y^aOBEb-!TpbEcjL?ydf?{A_{T z_}5>3YVl2d8~z}*RB#g&+NHk-4^v-Sz7t4^{Sj)f#pm>O_+wOGi#O^W;D=Qgix=rt z;PL9R#i;|Ca6eJKZqsKdelcpM7Tfgf?X@?js%?^9ja4YWE|2@^>Xcy8x0-GUo~h1> zJjCiyCMO@sHb-f25TBk?%lMt6`hul>`L#L?o~s_T_$$Q#pPHvCS^Op6nkwde3flA? z>aF*G!fQABYlsUGwzMPp&{>V)l5thPZCMp*c@@62IoIH)*z?!5_-1wBhqpH$wf=?M z%Z8ugwi@@wT+&DN$LeK1N9KpvSIrxHmoZP7GZH)53Ddue`(C`qIIgK&f|qlz{|}!1 zv3lR0VCjd;Jha4L?&AIoaX8QA-{pNi1p9XhOVUF63?t+zx}kBfL~&N75BH2Jr~AL@%y`bnEQT+`^UM&o`fyo`fgt0{nl{#cX4yj z=G`Tm=f8^_+5D}|vs^_;FF$Yh#~xrnr*dFPZt3r+(1F;4;3|Rr7JnLh6kIj1%i_ba zpMt9eHd}ls_At15;AU&w$EnZ)wGer&5lG$L_;)8(riW?<&V~%$5xW!n@qrZ9{jS(O z;97y-EPrS0E^zI@+ZJz&-43o3IArnm*d5@yfeS^&KfZ_X%IAH7-`gAfnEN==Q7=%6 z{*dr{1$zgPkU+ltlt;z)hw4M(*E%3FB=KHGr+1}bM z#*d=-Uy&=Gt07klt_Qh#a1G@0{gv?kcgAj#kMBr4{c)X8H%Ara^6ki&oQwg5+xcf> zKjC(Le%+ls9*AFFY}m=kMv?z1!8yyZUD0zyF-v-;ww)e!hpChTpF@a8z6CPaOFx zx@t*9lV9QS5;t-s_xEf1VbZ6Uu;sp;eo}Hf!t<~GQ<<-#Z|URYcL^hxjiY~;^hoaK zKf}Jil4kyu+>O}rWyc?*jU*4!b4eOJzx3d=wWEPu%#= zKF`l*2|HXCLX_WjT*=KPtiLk9m)%8w;YV`25%l+yn@Jr0%B($kB0T>t`52CU^LTWH zytCBJ$y-`&eS$WN1KW}_}_^+%x^WFGm#b1y1HhJ!cA>qj7#eux> z*HMSBQy#;bm+^M}O!#wO`itVuzsFlUVm7dtNeij_B~8v!|4H3bayBxM#XOflu7oFR zTEnliEgdD7#Orh1zrb@Lbe_2P>o4(F)&Wd>)|iQTS?uNHs#1U!!T((UU#Ee{lP|j> zL;tKjGm19Nc&-^-k8>^NlJVw3!J7j-S*ya0Pw>PEWiu17GmO6AP@&^3hoR6*je%^fiP3MyM zUsQ+UBU`|CbWuAVUM{ja*ww|Y{nnAI!KriubfAR4GRx=0FO9(gO;2*7qBo(Jq7Nxz zp>~0(^e@xt!PfpCne$>lgTcAAn#3RT5xSy%-{V=%z|W#PTYMqQC2$U%KdTAvf5!j+ zXZ)X@|KC3TznOZ7<_qIx6bEScCq^G^SD%8kO2tj&e~|Myw+OXjvxk|vTn%y@3n;B;!S^>2tbUY1_f0Heql>0@AnH){x%{$y!yKdlUEh{a`COC#fr zQb$Yu8Amw&*u*;C(buVOVqfeCma&XE7K>T<)e>{jzsJ!R5t(%8yf=QhQGZPxFX1oE zwk#X__2>&0FUz(Zyh%SyJsr_b;#YzAyrGAbH}?B5yTXbC{e$?2`wIaUma>1ubg>Vv z=*54F&PrQMa3{v@7^%<$g@J23Xg{I5P}{kvZ^1#i<4 z9gKgEyHE1Q+x1u*pCQcfutGyWW$jm1@!%ag(ADwMduWCc83bnr%Xq}73=_dSb%NOM zqC+8X|Abw-unoV93_h`+MLT)FT8z)?R;1n@J(hNi=;P>&vU2DHeM#K6(xIlzOEEH} z-?8D>X04IzZ&6TitgL^@3jRoE@%XYnCNp@S{-Gy);!{4Z0zIIQb-W$l2*fe!q4w(s zavT1Kv3q0Lzepdn_RGeVgMU!JOTS#){}Fo~{vo~3;_IT6{D1 z7Wh;Bv&FY!Z-bBMI~L!LWrRf?)tzkkdt*NWf2J$vG2xwz{Q~^CzF_&E#eNPxroXWG zXzXX;<2t{!e?0ai_=HYx@v+$BVAjxC{CVs#@E7_e`+lY3O7nhS>i?JK|H#mPN;EpE z6`OjWH;*%yvNn_Y*39Fi|EF&MeHKD^omRz$MtSjCM4Uc~b-W!wWX|EgMVJ3uu97(l zfiI`^=a)_pr}#JrtuAEh1Ml%a{u7cAOZo9?N}P6bk+)C^@AvQd2}!U!{CFK8PQ$Vr z{by>Ozb94`ykMj6&J)fcP6cvtdFECBVWd#95dBwH08F6GJBc}ySZ462F#J1JO=AW> z7qcWYm>HS%5B<3pbAo4hIhUVa6^PSkTqXzUF8ob2!GwFt*Ar)mQ$px(&qt~mq11Qt zaX4|3^&ZkPkh#O;gafJc{@rBbb-AXWkDZ897N*DOz(I5a{|*ZIfd*CWtg}45nwL18 z;WF|?ckAzgZ5@yUWQ2q2i&oeFv2-6KcUZK%6@gYE>&4qplnv_h(~k|6Z0= z5|54hS_6jkNl3~F3-Qkml3KkRha?t#5B}P3HMDG(k$scDV=~jbo+q{J87H&qhe#s* z*;`4YFw?uYgyd->e^0x99K?97^MzLzCQrJugGt3>oV=m5>wPgaes8UrXQ1u#D%Rk2y}f zy8!Yhp-0Uk1l6!YT4SBJb*H^=bl879LF(N_S;!%Q} zDq6Z!nQ~+m=7c<4CGeBfLMP8mC5%WIRK^dH6Vej~sbL(1(~?6o)o^)IBL@xVSlOOE zLc_%jBMz(M$e9KsyVV-t9T_602ytczM=|sq!_frYM}&&kAoBhbY2Q78n3)rHeTPje59NRn=oj2tHFc+>d**Jy8DeB z)W1acAw$HGoH;Ks=+Sb>u)ZTWJz~fJ&OGAeA~}mfj{a!Uvq!>!KcAb?BEdWRa!CIK zPG9gH3?9%!j&n3eec-tyg*geO7J1H@X&epIphcO+67W5FjmxwU9)}n;Nf;w;yu+nN z_e|gry5Y%O4I4OknDx>+3-dCJ`KRzu2o#D@Jxw%wci|n7&0&K$SGo@cDBNJ!NI4`% zPGPdAa1B?_=1N+RF6y6Zbo!3`o|KoCp1&*zYt6SFE7lp_=1fvOB&8qoGtpFv z&qLm2$>9z*=wLC%O-5adFqr4l7qr6VV@=ryA#D-!ahJCTsI_pYgrj~a#*)Dg7;0cF z_A|yS)0cKsM<%CbP)$e6A|h4P`Ad}ulqKd$ZILps}b{rW-A>fImNIO6(3Gl_WPJnzFY?E1V< z_ggG}nZ$4`L(qG3@C>j23Kj+M0kv%S;nPymtt0PS;uxQ{#Irner16dX|R(~k>~32Ogv;^SZ6vL zxfn1>^MIrNC}Z5zh);C;qV4`BnlNmBpNZEM;?VcIa1JtGn+;`{+bTnx29@NK9@0Vv zWlu#j(NHZht)w#{^b+r|p_1|Am5B_2r=ijOFp~*I&E^Hd>GQPV`@efAQ{gn%j@9KL zU+zV+Y4&S0E`6FsITBh&z7BqYO&EEf^28xs4M)ibH#d>Hw8S@*jRlaT$v|lwLV21x z>Mh>c+iTo2F+Vppv6XszrZ46*M8284VPGt7AJdFWzyZJciv->75RAtIjuk$=rb98O9#%U zzGazYLSC{)A{*#op%qIgJII4iJ7)6fPIbat%%WlBCA1NJN4)MuJ6>WlgBxrmgPm;G z_yiF>aV*MFub_KQp(|v=nE{j!p-~BhNnHP!#HZNg>6KXOgQ|{N)jZMf86{*|+fhwO z3nBR+?XRfnoJ7v*7KzWY*f}}1NA|XoUqZ5>#F?rrcwyn9(4dLl&HI^Qgvf;58WV?AA3Uc+nKxkk~AuF8FY9D6IM=}x58Vo1wG%7 zWeVtwCFtJn)K|UG^=WKfFdP34bf+A}h;0@|O+hzU+3dOTAe5C(0(q9%J`t%}oTR62vo`rHuWQyzUaE^J-J%On$%85|jo5&CHb)NE< zoDv>SG-*7SdIouY0(pBAKjok!Ib7*p)c!p_6(GJo)ql!=Lbj&T4sa9kGl!T`K#%WA z%XZ(jIWl8?BF}%4P0WP$En*5Tw~6=5_>*RtF_+&%=b1huTv_9;LeWfhK#hpZssS@EBNEn&qe&Ff9)=tLkb-Un7jYm3wavw zt&hw-%_KI{LOx!?jeO*=mppF08l4{Ls43{mAIW2xXr9{CER-ySKDbSLN@x+~zc{kg z`yllQ>HcjIGca&EpW(~zY|=$G*ON_7`;wQ*=|T;qo`0UYwpk+Q@J}rIdzmz)eibUa z)$q>LroD&WyccbvUAA$a;S?#K)W(CzfqcMoi!vc}lr)eJfQ7PHJ^NKn5B}xPx&RAE zuO_nh_vWK8TVBO>&%d(gayDq;;Y1*zte9p?In3O=b3Z0}Z z$OaUjPzTk@=^3fAyzBh#=6T~pbFY(%IV_9U$(+du}{+A^Kf5nD~_PBUJJi?{@cRtF3oBQcvZzak^BBjR(3p zYW4(Ut=gC7zCEmL7PfLD9N7eU0eLg98gl+4OBTov*|fzcf0Li8w6T1uT+uu~y_-CE zi}cFvbI{`{%=7M)=<_3H!9_pX1(QlLF+Q44V%MQZ8}q3^CGv;CvRt^8MJPR+F!;|z z&XhdV+np#Mloi?NU^P1A!Q-SsMi%e#ojDW3ymio}V_)@|(M?dEQ6a6&gc23FZ9G-2LCNgP8`i^|6@Ap;Ubeu-uOJ zRvu(#O)5w2e-`;b-e0B6^rXCg`89PQ{`V=uhpzNTeJVnpCmf=@-$$Pg`FNG*lDJK4 z>u}#*y^h9B{ngZ6$~-rwz7RSzB+);?vdPc~3~q_-+hyN-}@F%G#@r7(Y=_) zt*6c^mB^n^llLH=6Oj2e2WV#?ueTb|2kJ(iAnP}gVWA*(%nQTJ^JUUu-U;fK5}0M7 z-$+^TX&!FRcI1=37^W`bS$Z@XU0Ka+rgrQIWvDiNW$Fdl2v0~3rs+zU;q>8I$`JiC zIYi{b8p>@n>AsT>0?yC}Yw4&>57Hmpj@b)*+E4sO(|;R}?zw$9+!yoQrW-m7`4S3R zeP9rJJ;8rUdY>O_@Y3bxE}KaO-biXE9LdK|X`At(hfSZl1s%2K5@nls)#^jM2{!}j zE}KwYK)&Q~y#nA})RPa+V?5y(-Vxj;o1o*=Qdx;l1fEbsfmj zDeWDVKO!;o?Z4tjVd}x#xG6*1DvmPTgd<;Q^L<~~r13!bIcXORp)FA6BiafXXj|a# zI?B3i3@eLW<-kWdBfp^Q zMW`tj$2c|MN2;xY9Tl43OaZ&<1;MP>s^^RW2USJSz6woKv@w~PZDQT;R;R(KR3D4a zDf%RQA1o?W)_?W(_J@d3XRP~0&RY2C)R%~ptamHVUREeHuWA!qly7roKQU=43U0(+ znleXs&f;3$da+DuhsA~X_E+{7TLTXA#Li+K_Sf`HB%8jum~@Tb6IIBX%EnBZYhpLt zp1;4Kzdql;OBm(6^Vg>8XF}fkt{AgF$uzy%;`H8p;&lB6Y8EMqX{?YHHACm8X(G6Z zH!Cz#OR*7b_A{BKds}SwKbfstTl>vabKK9-S!q6rec8)_uOW3wi)CjAl!dNmvF!6e z!$fzoxT{J4Kc)|he=#aX_Jly_^*}^Z{41|2f}ha05Cg&Wy!~6A)TvNgg6lh?gBR%R z7B_IvS?Vdh(8f>pnqa_2OVdm2H}&>+S)_Yf+}z8*r}Z?8Wp@gMUC*-dlN~9PdRBic zIE9LlohfK6>gJMu#8-BuV4z2TYWcEv1)Vs(!Mc~-EZ9Lw%W$EDKhXO=c$xmi@@1b3 z8qivrpW>hFf58e+o!8oz-7hH6I)lZ1*$)Gyt0OIzT{7t4>B)jqsuD6hsFyy?NnSybG8QzGJ_vd)!*u$9 zd+6Ur@}X2d>XOpvwEeXA(6O6t(N89$Wi!5X1&Kyojt1?@2YO$ji?E-ZnpCHbqD|7W zWFluXx==QI@@YT%P-w_we7uCdtt|0RM$@h)HOMP60!2g^fBH(AK(BvEJHM!-s@|Z@ zML9oP#!*+O`yTm>Bj|=2yRzZDY$jA9J9Q+5^0oUMwdbIGa!PypJ(gOcYh{bU&)47= z?EyLL;~Fw78|}&l8!K}ef5yFr-cM)3mEZk4(9NWATmsoOi~iSI(x!y5EByLRQ9d8j z*0b@D%~`{#%x?PqMmL8WtLk^it9zJlP>y?P$p>S5R4v*$r0E3W@L_8F<9+48wZh!xBS1L}K@NRzNUQfhG;U;rgkncY6Zi?d zuWSG|c8B4~hDa$+(bo8mx~D7cC}c<|?M~|0jHLAfia70$a(3KDct2BbG@(s8jXuq% z0hID6+AS+k-A|IP)QPe|#USdsXzIE0Z-@&+jiMQQCT_FV(+8%FCWD>_H&}OtX zT02SNX*5slSs`p`ym5dND^m@(U`MbZK$fn2l+SO0P+}Ba_)n zF>Xql3az5t3LQm>@efm5XsZweZ&0dma>c^5MMc9H$!T41?BKM?I1ZY z@iFOB(WY5fA01N*HA!2vQKZ=v!1q_~vKfEf@{||X@jldlg0z$ktAym^xW_3+{eD!c z@oC14NSCST6xqp&*bILzg zU*eh(`MvQRviv(b<|z438CgtuTDl1xh@33ABnPr3hJPRLeJ`4W;r%v`+VT!UxhkVe z(cvR4mW?ok2GLGh`H^`(Od94bM_Zma2sI_&d!vg^=)`c|B<*9qH+=v1hYS7_?dPyK zt-!Bvavw-UvH?Ul@->_`P)_T;Nt!mIElj#kjZ4ZGyYivgYbi0b`gRUG;nds@LR>(#?I=J0R!+)SHvNi^J$(R`a#+MS^`cDnw z6Zvh6(Ux9@K1-nAhF{_Ia1+K0@b90|9@^YK^+K2YLStxRtTFlFXVQbZWOdNDfoxOe z8xm&GRmcW%kp{gg2hjg9k+DL`@W|R`fvmXr6giZSX}&&8ea5>y^#^@G!h4KxWYgJi z>e3v$4}FQ8FN>$DN2mNwe)PhR1>}WKuUH*2nX)T~#ma`Z6VRVsr~_s5G@%*Dk$l|j zJwIjc^85Ps#OIAQncGAU$i~m(Kj4GvR~TQSZ!IK;biYKMFgZZE>&|%PGmKwUr*0X? z_yw|fQp)QgIsOuRJ?Sg;A}we)NaIm9KbV)2`Gi@>?tsMf)bG*XX_y$k|MdDf#z$?v z=9?8muL}K08upt;I_;#6zlKZ{W(%ECj%wT|(O+XT>F>mxj6D~kE-6Ww9>SQ^qs(Rh zL>ZTRWAbJV^Sp$)j=ow)+9=tjF9YptX6_?en!EgdO&Qz)|9--rPI}2kA40d*(ub>? z7?0G)(H+=r)tS7e&iTiqE?h_62|cnDdBxv;U1-MEF=i=e zuq82aO!en7B{(ObLmP57W!>e!_`aSmNCz?FXyFP&|`!qYsJQY7> z?xoV=M@Gs5GF~k~srzE6k1A3(*PuSUk36DX(|t8*g$}6LfpK!mu#g<6>r*UwC?p?= zhSQhSS9xi_-iu^&*F{%pKkdfP(`?CglXfZTBnNf>OddUgygav}I?bzdvFejdzeu&9^i_uDK7vukoZu z&*tdn2TeSSR59*kqy2;AXIaY44&EaZ@+KeLMbDux5n%iS9dQ#m?To*@e`nl@dapcV zOkLoI)5v^`?IDjRslQ*~J*E)Xt;ldy^qq7ng=&pLuTg$|+Dn_f8hS`JqR-AdzlOWE z#gS$FmQ7KF4snx%&WfV5mh!%Zs?rXv$a<75#BC>S-2${{$#>RWseLcf59v&O`yFXf zi1&)eZXe>3iBGG*{cRt>^ElbhIQ)|XTR$m^-nM!(Kkrkz7waRaCw7s3mk37=z!J)A zWlvu*SPr-nI&lCUf&RXent3+t{!YG6M7}P!MvoBx-<#kz9Wro+I%WWEzKf(2dAU1+ zyh0wEK13Y4I%>{Vm1g0&J;(V0=-o3X~x=!?_^|bQz^RNYmwK&$UNmC4fWtC(zycV;R^B=q#d;x zcg+uzm*~ZnVddb&I%I!;(iohf58{)2=y^2(dEdrd%zEn1JdPUL-{=1I{XtkV0P_f8 zb??YHsmp*C%wX!5rey5Kqd zBc4AT<^31)={<6Op7Qi4^`C5{mKO6A$V6+*ilApYXJp`n@)>9Kf8h{%b3FM>ogjxX zgj3#i=nKl@kz2I+$=7t02O-&9U8p``$;RsUqG{A8g=-N<8kWqTlp9`g9ZWEE@<KlCa8Wwl)w{SaS??_Y9AA9Hf8vF$5cm??qI!gWv^+vY~EkNevP!XZ)=!aQd z(NS3$f8R@9p<~CPua1+CS7{qwy@P%vudCai@psV3nQXF0Uvz7EDP9=ElI`M#mcf8eq* zzlF4GmSA`-c=y5JnB2&4SbOYk;+{ck7_oDQq)Gz@ zM*LZkBGI?1mzhE!9Uq@<%u+nT7!7G1OPbZ-Jv)3x{fn%XK@SO)D1uA|%(HB8)oPb< zcV#4UgIwJAxxw=L4E4-9WAx zs*C<29mbVl9IqtfUg+zFRgw3>ly~IsGI{>$yVR%HE5P+L{k0TD9Q7#Io3#IOQNH^r z+7eUHbr*S`l(<87+F-V)D19dC&daQJ+4~coO=t*u%s%1M`1f@S`w&Lv+!bw3)kppBMw#Y~Zixx4w+q_4_k- z>TjfHA=<><9JR3l{o@Yk2+CGvbXVUyj5$=IO?eX8=4y{zO?-5B|TwOr%f1Z;{4rN=1P%)TQ4)_Mtv7O-k7hpy07>+;_D2=@cZ^?`?s*#qeQ zzoI85QU}~e8O=;vdLS}Ny2wUiK9!>_CDf||eSPW@p;a2WCXCFqKV^dl+0-F9J$An_ zdA2qafDz_7xEOgPzhmDdEZSJIIf6_8%175iRa?{FCY@!ggip~OKfHmA9wXh6sr27c z9v6|fq=jr6vY+xknsj=T_nokwHfammsFYdRU|kMs+RXdBLb`;L92h$XeQ^c38PO4W z=w-M?W|{j6+^prAKsv}_wzJ8PbYbO9Y{}tU2PUJ-pQn5y|FVhc$q?(&Rv}woF;;;4 zEu?!4GI2k0U!y2xvIpaTq-mK+lrh^5+>Ct6;g>^^bDwG~W9%lHcO6YQMSW9q_dXsb zyiDYk9MIg5a=(}NYel(@Yn#+=qeAp|4lgMMjL*Hd!joC%YPYTMg)mtmd5`W(LC(N6d;vFb&KW(GU zwwM0RhsaPx(se(5H2gb>Zjs48pGw~`PjB*0Kk@$IB!|Yz!Lq;6rrk|Hq0Ud#6Ugc5 z2OPCJE#uyl`I?lMO}iL}LRZQmin4LFP-D!lH!{!i`&&BN>-Zydq_cNZ&j-k#CXSkn z&XP?gQWC-WJl8*fZsPt5*Xvy8x)}S(e_PIB&JDg#O>ElA0XwOxAV&#?Go&>6(uuw@ z`r+gS`sSqZMapIe-nZaB%0A_!19i&);`2N2Q;2$2CYv9;!FWJNN6BU-r{@{JMw~YH zYRH`&(3bB>>PleH5zAxke(UWIyJrM+G*F|J~Eh47M7>ZOS$W8Y*gF>x*J(hvCZlJEC-V3 z>IHP|MBZK1XUzyYv%}liZ;I}xp6l6-@=jfN7<*grtNIJftx)EQr$z@MTPTRC0T}PJ_opH1+$7E%!_Idg|Z5=h8^5oMR zu@Fu@iE}Ld(MPE7NypRFakA*;HnQrIK1@BI+#O8W^s4+u-*$AHDQAy1O*C(k zoiQI9mvSG|?m_np6-NJ@L1ujVoU)aiN)m_ovc@#e4El*rP$wNB4ZksFFLovmGtuuO zPh?S5ZrU92n1#~}^u_zbar3w_O`l-ykBnh%p(SPU7P>GeYn96~ze%|jlFdM6E5?uS zM^4f6?eN#9o#@L~Y&rDJ3Xo1QA@sp$W71$?qW$ilV>ZN?*QZ`wj9wXxjt`>a526nu zNy{_5`;4xPfzVg~l{(j_*`(327|dP93@0GxDXBNBQ>RhRWD_tsIBPrQXy|6z!wZNj z{mPOHN=&KCqr*pjfs<6DNOPUIm$$|Tuc_UINXQ)#YI zZ<0ROknPWrfr7-lJ861^x@s}d7s$^B%EE2NKbJ69L;e?`&y%SS^$htm8aWo4o`Ukq`<

^1g5|M|?L#f3UQwDy+0ks{G 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%0AueB8QA9cZVS1#tf^k2N1&)VD!MbUj4M02g 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�o+oyu=iN~!`zU0}w7 zM*T)r$fyd;SlFmbwcssPm}qb^g8HmU^G7^5mvjWy~g zs&PhbVeQ8om7S?37}c0+qES7lCK+{~YO+yh5egBTV~SC2nQE$08>prkHG*ooQHxpC z8AgqwnrYNF+^@$H6O39$HOr`I+`>ny*+zZJRCA0vO*Pl38q7G)sM}06->6sdIRc7b zU{nRBT4>aVOtr|Uf=yh;#YXMJCl@GdiBYGhmKyaf%UWjC5LR`$QLU&}81)M?t~9Dx zBe%o{j5@`P4;odTYL!uyS^L#S)uCErR5PlzM%82`)*1DF12?!oWYlG<^+w&K+F;bS zhOYJ-je3A;lTmZ1HXBtCLmC=-i&53t5?hU`#EjdF%1X7}r~*_E8&#j`5u>JYJ3eaE zdN$4uqmr`{JB^yio#`>7ma(kIjoM80gi&dkahFjIsCFAQgc+YSY7e*e9;4E8qdjHR zeXirvMwMY%dyQJcvYs(&5G%3Is65QL->7_C;sK)$af#0w^(56nqrPUVBAlo{4i(@M z4;hu2^*U@+2`=$@qb{&sM~wQ0>II{Ip*m_*9&X1Mjk>`lzGPHd*8Z4LH(C4RMn$t; zFB{c?sZJPGn(CxcUAWq>7`2g=IAv4~*8a3nZK+;0Y7C2i&8R+9uN$?H>WopJa*1yk zb%3efH0lkiw~R_f^|n!uQN3f-KCa_gqp~yAIirTNq2D!X64iS~b*4IRR9~w1jcUft z@qtmTnd(EMdNI`nqh?cmWYlV^kB!@@K&1+&>c>=xjcU!>Co$>_Z<541h33Un77Ar0g~}!^jwul?Jh8-Np*XJ&Gh=e6 z5=)|BFz&%1RSKg%#6>?^BBfDhsZtsB2vusMzN1QG)UQ-&jryD_ol%FV(i`;}RR*JW zQDro0BD;GgqyCBiqhXKkcXgewfN7k6;{Ryl%wgk{H;wZ@F8)tY)6{-(J=be%8P$L) z-l)=4wT;?ORmZ5VRCSG7OI6RPR#f$ks!Y|us1r~aU>b(M??{Z!42+CbIZs28YO z7nH|jD~52FUK_?|{R$yB|J zIz`pns5Vr6j4H>n`WlsksrngJfvUez_o)ULRkfAdLIaJ8;`ziNqf$`~HfjjWMba)mWplQ;jp~CGI)njoQjS zG{LFlZqIoUZIAvq(Ww+pU8kDlR7$7LQ%!a%l~X&ZrZ|<_sq*aGQ=LlV)DhkkpJvo0 zs_91ErJ7;X+f*}+N{riU*vS)&I>}VCjQW9Uwo$j(ICG5J+QpSM*Qi}o^Nf0)YQ9k? zs1_I%e)Rc*PyzHuu6CW`uJ{F^f?g${y-@pwMlGjW6e^5VX6{u~ z)u|;$y-_TziuzQ=xx^)*VqUGs=0I6XjjF^{OGCwds#@#{%Z$2E(`8)lB2cgrOE6er z%voX7HP&mTQA^sn&i8;(xYnp!RO^hI$|XKz z)RRoL-l*eL8;r_Bwb7`Cti&dxx-!*fqXtrKF{&>!ZZ&Eo)i$F-%(&gCSDETzqcU-Y z9xSf*(-(^%6mi15kpWvVPKiPux zZm=2`?>h27@qYsOdJay`Z2X^aNFW>kCma&U#{UV21hVme!Xbe!xXzc+HT2c`uAx6N zY8yZC{Me|8R2PjpNcD+PXQ)0kYB|+sMtwqc$*3|s1blAP93FJOFlr>#mqsmX;Epht zjoL}|l~Kp3zBcOnGVVC^b*KUkU~GwjHC#(vF=`~$H%3jS`qrpcR9B5^Ky}TiE>zzc zwTSAvQCD%u#FvDwhbsDdo#9dRd!sT_{a{p4svnK|4#nfReZ#2jOm)+!l~lKkIzsi6 zQFmC@&ql>C)or6jQQa}>NvdCrYC`p^QPrvL8r7ZZo>4QX?i=+x6x!>4sFH85FQ9OW z@mr{}R~u1#sNan$$g9jhLREaKi#TUWi*YAPR3_IuM$~otM98SCR8dAfNtMW`#JsMJ zHtI8`iZN;(Rbr#2Q6({I9#yPSx2TdDb%-jNQ9Y=V8N+nnGB}mRr7DPyjIl7IQSGQQ z8C91mvr&DhvKUo{DyvarsInO~7Ych$cB9^ARdX11gDaHNsjRN5H)^@6<}&I4Rc@o& zP{kRwoGOn|S>s(Rn(}u zRK<)sO;y~eic}?xDv1?BLzgtFDQ?zdYnL*rGF54#ra)noD`V7Zs8}%Ml4WoXds%cby zED=?$Wz;!dvBn$q4!=WL+o(^d>KJv6s;*HdSXMowUS_KLMm@w-4UF1J)zGNRRE>-} zNY&V=+bq6`QBh3Q)TmTc&5U}esB4L4QSlga*dKo=7glw=3O^FGSyVl*!aw$C7S-6R z&)MCZ8+DAw?G{G8L)Fr#XQ)~k^(a+qqu#>#7dBd(s3v}ipCT1hTcZYYfNAGcwm_zP z9Ld`oHHYVN9gLbt)zPTaRGo}^nyRx=OR2gT^*)!_)u>iX)y=3rRNakAOVz`u%2Yj# z`hvyxGAc1s^)~7)rs`wVHm2%p)bmvRjH*x7->3pqHvUgIB#@2&6AlT)Z_Kmp<<}P@ z!3?kjtO4?)t-lHjbQoW;{{TqH4+-yc4txQA24xVILms8`HeSCBUI#A$c`Q;nEOz+upX=fYrqB|j~$Xn z3d!SyW9O(L=3J4+&`_VRPC8dAv<8&p>i?+39C~N^aFi>gxvWV z>m#9ZdVt(OLhIxK5(-B`0i6R9qDI2>d<`TtkUX+a!r(~A90>~~;eh0EbrSwZ9&;oi zdzxdO7Ni3WfQ0IikU@iig!s9EG!n9B0B8mzgil!@p>ZTEkc9bZ2)coCKtcgY7@w>_ z!VyV09tlTO3Udi1lo!b3GMj>dAUTi_Lvg{Bpi@D!cBgO*8=-UUC;(dc%X&I zFF!z?2u6V^K+2LIlFG0BCV01xy2f4hJ+JP9Af21>6P~z&GFyu;GE; z!QY<&dCb^Za0&bXYHcDlb2fN2AFj(S`weJlb$D2*@MS4kFJ<%wGYg!K*;RM9Jg!BrH^Mlq-)3 zlrjAoyew z^q?U49e@7;WLfz^0P=$SaKC{xc%1`e0eA3s4Ccu|au5qrfZOoVn4gsN*rv%qQjiWv zxJC)Jmli~Wlps0C0^|{CF(4600ulr9jZs#8@HAex0xdyv&>FM>2f;Jp`BRwh2YW#s zPy^Hh4M04QN1_!(8x}{q76B*m_bcEOSOLEhJOGw~rC>Q&1>~2P^2^Cb!Dg@<>;ikh z79hXelwa^Z33h@V;4$z7co#?+ld%j5_0=L#P0-;fHhzX*a|j) zO<*lp4_1L4;4!cnYy{iDIv|hjJdARCfP>&U&Iam`86Cf&45Ih$;1GU(tI!ARl^fuH|r_NIy3B3!o+^O67 z-R;FAq4&IcvY@+5_<~a_T&f4My9>6XM%BvYzOiyNbRHR*DtvAEVkl*3O|aT!+{%nE zg|d6Klj@jJOQ?>A3M17Tm+`eYSFhutB3`9J?Gp#V%SKINs+U7W!>P~)(hfma+%egL zISRqRa>u>$|LNnfqP+Q+yhvavC^g=_iqi7q@k`@F$6X7uc1)P!^RSBM-}wI=Y8oAn z7cpL4QiW9yPfx1CHFS6iKiNy3$EDK)nkt2wApFd(0AH@u>9D3sttQy4Dveh@dO^Hb zCp8s*P!^u*d=_3IT)~E?8b7(s7zDTw4Nr%E4yy)gf=#L#dUZ-wBd?ym9nOd^4u_}n zT6_~VL8DvYR875Ftf`uLwM&b~ch$qwFE_&(@de88lwOyJ+ce?nxGLO}2~YJ^;dX9# znxhK$u)@<=Rk(*0p3dkJ+o=h@Q`O$9i(1tVUKLT*(W@n@@YRp-)Kpg+KcfmyV>DG4 zHNm@DudZHwtd;2I)mlx}-K!m1d=IZ?YuoqqYK*F0UUgB`+pB)6`goNO`&TF)fA;mN zf>xrRSLroXf3NQ7Iu7uvlV%*~)l5w_$g3}Pg$8?-P1O*u&S_PLdbLH{YnWHDnrgUL zCsd8_YQJV2=~b*QagYN)EoUQJas#jDP$rh0WvS7@47|HS{%ruZlR&wnKT5AW>B9lj1g?iO|dJ%Gfx z=>z(KL0||N0pyN_+@%-?;D|N^N+5lNrRv^oeJW{@tE9IvJnZN`f^&AG|&ZX2<%9iEG@@3uRE=(bi4@it8 zsf*mTk*hyh2dT5HUl&jhR01hMb|7~GQiD1`)>GT20bc)4iT}fUU%%nhPQpsh26E3! z?vLGvllx_VU@rH}Bvf_?^WQO-dkk_9Lheb(y?`Yk6(|ml;eEMIkb4kv??Ub&$o+<; zK<-h*6)Wz4@t?gt36 zRc#g@jqo)(^-`5jO)x|iE=I%CR8HRHazV_@z`jw0lsUj6RR2< z6ju=>RaL^PG^$E^l}%MCufosSip8^6b;_fu%Bl&ft19Q!Z`dcWLP>+FUOkOesA|%n znpY*TLg)g?f_kpIh;IUwR-WT5D&$gbrb^)yuWLI|rF2UAT@ciuO63%@lwB=|SQV*$vAoYvwkbC2Tyq62dk2QEL$hm?b%Ub|6 zO%^ywD{17ux1eRn{o4O8v>YizUQ5|hhAe9bUhf35jI2QFBcDTN1WVy{F3Z-ml3&Y` zeB$*z@ro{2mZQ#fl>bZqlW|Ds8&nLMNS~ME|Jxj${!|27(V;xijUVJ<*I^+TmGB?`#{YMrFd`ywr&mwmCC0iatbaA#sq)r+NwsRZWcJzh*3h7Q{%M z#Ha!+E7quInK3qq^BE7T%H!2hRe8NStt!7)&9FqQW6~g^?sAFAjLL+JNR`~EpO`9z zQK^|KrBTsTsf;?$N~8)3_)1(*RnV(XR2A~7vZ}&fRaaHStIwg(gsE{Zp{?2rRmE{O zjZ=7yX)IM*r;r0vZI+c5XBsC5KYxoRdKIwF=Kk1muRZ%R2htV zkQp=JQRkZKS!@pM6B&Y%UTxM?rMwDpH_3>H$!o@Uxj8Z!)tVVI1*Lte_NvNwm4anu z#%Yh1m4qsbQPZKY17tNSC(44#W>j9P>_&Cr60-+oeevm7d=8^}FjbDAoKKaRsd5_i zFjM6W%KKC~nJSl2eVHm(P{F6l&s4dMdYq|pWBk(9F3MDKM(u?{uZ;^T`BbHl5v!fY zsOOO?6c1I|r#hypidQF8RrTtWs%l;hV!iSN)xA2ds)kopkP$n1-XNleGgaQ8rcX6m zRV}aTGh@CWqT;FY8}&F8*0Dek?=!x`vI+#Xz3RY>1&wOXZdJ%Byp3rQ%PMTt!&F6# zn#kgd1a(k6Gj_ua>sZvN`7FMeQ#|jT%8bQ=y2wa1m&F%1Y9><^#~H1r8o=U97}cAq zq*2S5u_VrWHRCX*DrMAMrYeO~VNJDARYR{PGGl2(Cec)5sLB|%2?}jr)~Kpn?Q%}x zJxmWWRe7VHW2y>Hq2VyShE$<=?DdVXM5;GbHTLQiW~_*)kQx_Oj^xP5V>^e@)HuKo z!`aYyAZO-XL0=%>%8+|zIWU(qbU8EEyCHIhF5l?rfw`R3%bC7><3qmbkp{>;JozR_ zTCfz%#ozNldc2m0Gs;y#CXg9ygwKk3c90FM204LzOK~~o4}e@it}5i)LvbKC$OH0$ zykI5hhWA%sJ{)u5Oc?p5$U3}!J^c3@n7;|$0&fHP)cY)utBrTTdGG;{tBwoc8RVBT z4uEHYd=uq4a2Uw9GLC@vknRxXvYbDcsqfh`4Uw3M}Q~VgHG*eA*iXQ_lqMGOwKL#31HOVP{ z4AhuvvQr~m@$X)A-D-+aE2*X$wVrC4Q5~qJ8#Rb(hEe;dW*T*xD#551sb(29Jf zS|SSLgBzwxL|q7#4sF9<*p+^)61F(Cj>F4;*YpbmgTM5f%-w%~{P6o96F$3s?>fW} ze|+|HYFEyWKj2R4AHSdPa%NYDHSPCw**)funIHf0@%y`W9qfXU2k*L@ZBvmLLnMYY zKZWCer|=@sDB&56DuBCi81iiV@AOz7+_I4P-yC&ulE_q- zy}DW6Eio%j_hZ5*!XHs(b4s>-5d2iurONIU54;swmV}v#2_K8k$GLiC4^nznSW~6) z>WZq=Ud84OXH4VO09GOgPUN)_pRMe+c21*qQ{^&h9aV0lwo%0y^#!XMhqwn?{CBF- zdDRqqS#*35hnrlQ>d`E&5_ybTO_kTEXQ=WS)h~z3nBS-lR0WLMo*69>g*&ejjhj2& za;id5vT;P3T3aZ+SeF8&A6`YT& z>RieF;;gDs$*HOtRhX)}QGKau7*&a?rcv3bY8iE}qFbT_u-8h|W2)LlwWO+J)KzAz zYgGEIZnf(fC1X3bc73D1rfOhRQ;bZ>5OK+ce6il%C6R8^{G zMrEgJZd7Wj7Df%jMnmme8r7Gol~D;)t&JK_)yAk!RBer#!5yG&kk7aMLRI;_dW?g6 zTU=M^7P?fy?Q-p$LMvf9flnmRMcX@-+^HlOIYbvCLV zRTrbiQgt<|Dpfb5W>IxFsufiaqgG@5LhtB-;YuG3zF$=#uST*Zdf-zbO*K_j5wG6Y zj77algeAJ-i+T09rYi2$GNi)b))Ti{wD@aG)f2;&s@GJN^y-ePQeJIURobgds>*nE zR8?88y7B6AB6ZagntkIgPvRCW!g;Q1WsyX&m zj7&Z8(UfMaqpF%$i?pojUhPp;!>d)QYI^m8s#;#n(5lMkTHJjLYO2~^-O#Gm@v5Ar zs_Rt>9<6%eLOwapDP$Uj@e5s{w^75{hx#~`(xs}1&WCf*ez+b_hcgeER$v%H#{L+a zRQ1j5`p^KQj>ow@XP{B7p%MkSZfSyysZdf7)Po8|1%sh7hE+R!0EzxM#Hc=0LycO5 z#zCrKM*U7T+^CaOBaC{BYNSy~3%asK8FhiFMjMp{sn8N*@FBfC*hHpBnQE+22dKsw z^&>K(y~Z2$6H`qv>I-)pQ-i3cJC)w4g4o*V?lX)^S<)3h)2R$D)hZ6iGXps;P&L9nfuT0RDP9ZQlVK<- zm<3fB8&{@eaZb&KDiKzXafx$qKq(Q9?~n`!L$udiqpI+Hb)Hk$*D&2;z2-ZGQ61B3 zJilMy6pp)?GIP&aXw)w_rp4f9no&uZYOzuGaR!5}y#%Uh_}dQQ$4M+TYCV>MW6d(7 zrcy08YBbdfqaLSPY1CY*2aGxZg_d~GsJv{6RZj6M7e#Q^fwo`m6ow>B@lqWfsU>Jvt_zzX5m@kG!XJ5v#t zst4+VjJupd=fU(|WmnbRMqQ+O(x@v`dyM*>>M5gMrh3|_TU2|EIz#o0QEyaowclq{ z8FU3yb-z>SJecnBKykn+bRJBp(303Eo;4~9)j^|v!)hbdb4HbBszXLqr#fs@BdX_( zilI7UR3Rv|{R>95qdIC-671{I@xjrc4K@dBzY#NJe9@?v*@s?o3WrZjaU5WdIfd~D z(?=XljvF-x9S#G`%SMf*I$_kqXlSH5Y1D&MuNbwE>QvAcRpk<=QJoIjd36j5wSN_- zx|(V)Q@w^$T~+5fV!rMadL5=ucv^7ADI5+kHRGmz!zrvUree(arc=1s!;};~4cqZ8 zqwZrgf_mGiL`?OLQ5o1p&*FT$Delb6^a=aWIj69%VakD2iG$!>qY6Qx54{_7LPn;# z!K?E3j4G1Zwd#4JhEu(d57;$hDXI@}TBE9D9QKJ&@FC7ln&J~MnFe4Wz!E>i*@>!T zs)l%#Rn<_himMvtRlKUrTZe4*sZ>Hs)kboxqn@8s-{!TsJ?NkmQ%TScjcR4EQ+Vv#qId5QEREL z8a12hno;$k(9qX#Qr0wxcf~K|e*c|QwVkTU_PXv=9j9KyUKkSu-y8K7)elB>;u3!} z>J)4LV=w_rWLX)x(QX)(lj^2X+tASH+qaDRkY(KpCi=3%VM>28DjcTt=U|dgbqAXR zwZ9!q_G$r7eeU3iNLsI}9MXOFCPeAC~I%9YiX z^}A8wkf(nbb)IDfp-5FKU$MqR>>VV_ml$*DzJIQOB4nCNvGH>bX=G zs1k=}K-G6D1DBY@sAE*Ip_x9_S5!%j+Q}s*Gb$XgHMvobafvBH2`H<9TVe&4mC~pN zRH=+wg|spFu7**am@17?Z{h?CsnUjKq4BB6y) zU7VW9bu8*sSEo+rbL&_%v4u8${H2LROO6H zMpfRZajaMQ&@$AEOU#Q@iG!emQNLrq$2wMonj20Pjz3w+sBYYjm7VJ0YCnOhic>wE zDneD&sa{SkmH8kowW^82C z+fy24?oiBV}-R#T%EqCHTrW=5@#bNhX>&xXq8vFP!@Kk7Df$bsurQuK2=XuYrGn(YOPlfvJx#q>%4kj zQ$6I>HchqOtH)Gr@M<_~-y*aLs(&EUn_AXpuNJ7<;?+h~TfN$;YMWONsM_w;%c>ss z>X52Oyn0&Iqh5WCF$a5L%g`>U0j{bQI1IH8J?+(7P}uL=7SfeE zs@_I@OV!7yom72|`jx7mQOBtI8}(8Z*V6_Vb((6RQ5UEN8TAg;V54Gr**wIkdpt-F zHR>YHCvdX54Ey{gX@8WoDD3RI(wT8DaJuo`33EUK|a z?WP)MR5t9ZSfTMoRbqQhFe)7nIuo55=2mDXc1$dBl2Khy{Qtw=dw^R}bzQpq9CDVN zbIv)Z0|Fu-IirAN1SIDi6(y;lWHAsVi6luXC?X<3M3f*1iUMK;1qJlGW6rnsq1xyB z|J%=VyZ^r3?Uvy6SG@&eB7nsjG?h1 z>2r-om1|r`dW+NCc$Wrx#8M2H2`&wCX{4G^Z9mba!7i0Wn&i?Dm!9RsI@zV6E{#K) z;?gje3ewP1LsBNBX(1`O<_YCE-KF6kaV*jdmqxgh6X^+;M!NL7>ZpiMx-`nAGI-5& zX|zk<;`NkEV_a&3*V8VIb*T^1ESJW)R2ONsOXFQy&2gOL(gc^5v5ubW(nOagBh7PZ zl1qom`@H&0NLq~aY)EA8@!1!;arI*GI(B)yCDd`Oyw^g>7qwgX)ll7j6(7sb4# z&NSJJ`mG|W7cP!@J6^iXcbFw1=`PaJkaQhsSx8E#o}*5_JS3gN>&1}Nf#JTwr72#B zTy(jYT$<`qYt|+&homt`uY{yRNUw&Z{zxlBQdOi?A*l<}>X0-QX-!DVh4flTT8p$c zB)x#NE+oxCS|5_iAZ-Xq4YQb?$R`GiBB~9Y8|~vlC5;?6YSyoMo9W+ z|DWhCL8J2ciQ?Y=Kl)WCGv<5oTLS629Mb-fwBHsYv61&By%6j;^buYMLQ*A5J~r}! zq=kXkDIy+>DIT*V^1L0O$YrDtB`po4uSn}qNVIArew^DAo=Nd9gZm#FMUSxM?z9Ul}jgzqakTCUdQ~mkqaaCSb}<$$X|p{%^9s3yoWeo*ejpqYJ`@fJSru=g!Yb?U zWO{xum5^FUA*2y(U)B2r+y6AJFj&4;o(zKRi}0=5^m}21>U~kR?N?xED!*pJVuh_0 zRtPT(>x9+9Mq#<|qOePNO;{r=6KvnQR}^=J@UrldkXLDr6JJqSbdQ8K(nhHqF~S^$ zZ5Hkq>Iij(zl0(Ro1(f+5+(}MgvkL%6qZZKE!f@%wgN^&|R1>dx7x0P)YVV z;jHk5Fjny<3FCwb!gyhe%4b?3@lf$FVYp!B94w3wh6pW%FO+6BvF#UHOQ@AZoNhG6@DrWMi)=>+TN*59q)ZV)c zaa#6g!so&%;VWT~!nO#*gyF&vVUv(RY3CDGo2Ix!g%QHAfM<$rze3wr@@2uETzN|9 zA%AjJIm~9{EY(gesrs6*(%od&&zE_-U!YReK=hkh%*zc6yb^ZN|P)>GPp}a6k@$HF} z9E$gqY@5f%3XP<09Pmyk`kD&!ZQSH6pcXN85reBlLQ zvG9ywdw#AEmI%)Y3j}M+&xLb>?IHTI5Z(7>o&Me?*j_L;e@5B%wfszRKNn63r-hTk z2>G-Vh6cXv#TGxBUPt{sOt5r22*ZW8!YJjvR9Ge)w7RHW7U}P^!eU{xVEfXJk?%NR zyf9IiAdD4k-{u>__ri7I7vU%2lJKKod-TRCUE5pL_F640*uFVEr1cbf3B83rLSNxA zp`T#wYW>5;jg{rH%Fsgbng|aGPYAcA{j>kiKl}gueg7ZZr)jM4v|xKTHBz6Rq5kr_ zV0%H^-c9x-o}IJaQ6JhXl#*X*!S?vIIo8&BKdax_{zl6M+v~{o*0%5$gum~jv6&-6f&TPC*6RZx_?`_Q4d=MSmi}kn7 zAGS}F%^~5vqHN#elfvghc%S3TvTYpNSp7}7DOlTB8`-{4Hg0VnCmXwVzWY_M{m5;9 zay!r2ykTn!n>%g@zY2B^v~!`Ym2J&z549 z{XIj-roZicZF9Ko1ZPi!+PXjb)aGFQZT&Bu*w$pr`lwtHM$ zOx#~=YcMNAYjJ*Yal!VR`AGK5;u}H+{heO;O1LQ4+UsZOYXy5cw32LlQq-OvwI@KM zPk-7IyhW5=F`9$@!BiMP=&Y@?8FNJf$dBM)DI|O@rxT;|Nz}A2EM6Iont^Y>*LL&Wbu zb5NdtmqxU_=4<&Hn}0OjBC-n$mX3u*{Vm+|upNzK98Dvdr^Pi`SoCkJYcxEXPSjqh zuvJ2o%{QEW`0r>O)1q~-Jgn^vR)=U_=40d1*nF&~Blk(y+Xu z<+VKiOZNY1?^jRwU)H?-&}fH{R1m3SNGgxiDI~SX>Jc9fNyCsH2}!B4xmV|qR1dE% zA!#R4*N}7v>Cups1F2g`DvH!SByB+Ifs{aG_$_ilJ5}t|UuyJz*9naNKi00X#($t*u8WeP@iWnxK|RFbSFTcBS=YI zqFEYVaWA%hOXgnh{^(M2_e$>4k;^Wna4CgLN56F`rAsMY+JKbGrBp8ch?Lr;)Gp0J zO5;)*m)d{lY2D`%?V2ActxIX$>k{Qk=TbVCZl3jvgy}=lDWnV`=^G@TswQHhFFc|> zRUOeIHTEfplsP12K*|!54w6>ZkkpZbmd&N~p4QBtyh7Ps%HY!QFa2tN4n54AHh6*~ z*b_dd9#c*mJi!rc?VeN58l?>$o~ZSdUwX}{hmX<*TSex+=xOEBV?~>_36y<;P2279 z;;8h_dH2erXgh_Q#(=F=L`|^sWMS%e^km5FRdVAepO~?uwSK(cIB8~ zm5EAmY8+jJF5prgPkzx#Z^8n~ZD#~&8~whZOL^UEDN-Sq^0{=FURcobqi zS8_?e;?QRzb*$`?uIcNOm&vM%OS+?~&n#w>sxIkffIb6|s<~9grINHnb(hMzR06LW zE|qg>3VoucOS;#fPf`wAEthmRTc5^6tnHG1I;c-7q&Sy!D?^`Mq*ccy-EP+B8e_Yz zOS+M)&vp*&{Vr8?DIHQhm#Vpxf<95-rRpx7ro9@tRKul_NDsJF)1}~9sRtr?)b>a- zncN$?RLi|GQmzMGs_oLx9LGj3#krJ_gVxxkIxc-lT1{N4>(W6ctA|{=-=*t1j*0a{ zt&ns@Qo=Y%wnqqFSBconrFtIm8FFmyQhk>;A+>O+flDorTDtUrOFtmBa;c$9N03^( z^q@-vk=nS_$fZ{`uWDGeb*ZsSf2#XRYUffDm!6?dw0G$tmu?|-aH*+F-_s{Ly41|2 zt@Of9E;V=QNpgJHr4}v~zvwwW;!;bOj#7xuF12!L3vJ)UrPeOh|JEaRb*YU@cS!zG zm)g2i1g~x`wL{`)cXx?3-zo~x!zI>y-SO(_5^KH`q}9u%PM%g>>e$<*hh6H1)W@Yq zTq?oQ?(0%#mln{;A9JaTOOOBH73$|wSC{4^^>^t}mrf!LaH*S1Tag}jsk=+}F&+oH z)WfB1j1bZ4LcbN2s<4E96&Ge>)tAMGJ7b=Me5 zWKWmo(_}T&r4~qYv{u*|;df2THALk#S8Iixdf>!9^N{9gH-VjcZp1ztk)F|R0z37P zh2 zxYzS8jdv*nlfnxwO>n6?r+|enO?0UUqhpavlU%BcwAiJ|E^WNv$uDtfic3Q&{Zf~v zx>N&cnM>1L`b4LIn7GI?J(avO_`%8syq3E(-MyMqp%-16;Zhsc04rR2!lhbBFS+!j zOT#aCxn6c@rc1S%F<)`%DVGKk@l}_ecBwE&Xk|!BiL@#tWkFgUl9s7LIznq)n&oMA zM|#br*)9b?ZhuWHp`F2tv{upfYh9Y_UXzj5xirtEN#wXbBy~gD5RwKVZ45~RsP^kF zJ>zK=rvq$q=~-Md!==S8{m!Xrr%Ov*`ixP#%cZ3*<-XvD zW4BAoT>6DV>~U$iOMN+kz2(x2E}fxq-gaq)OVwB@yyMbKF15el$?tXPWtVcC^MSlC zBrQRDHzYMgdM_lELE0aZMk2i*lC~io2uZ1sJ_t!Okq(BWK1d&iq;^P$LQ*mg?ME)X z;uV@p2RQ7~t1hMB#CpV~l`gH}oAgnaR=Jdnh{s%7?NSjUe(cg3m#*P;+@;rCYJ%4% zF0FOxetPtYkW?P&(~vZgwaH1B)_KIk^uo_vTJKUJq|aU2;Lm$ta{DbiV&wz_ngPX2{U+gz%C!8_AA zm$tifj0&B1=}ng=lh&6m?QkhO5?8Etx|Bngt?c^seqA@T-%i-|^yxx>!QL)o*YNHB z!dCHm!LDm>5bWCeNx^o6v}^dbpS|55uxr^Fh0H=G!R{B>_4ZWq=_a-}(+m^x$!;gM z-4tgFa|Qc7k6o{~YxU;@yS~3zcvZ+H|B>PgLMoxWP*JEPR1mfcwFSG!Fj|~P{G)iY z@P_cUVAn_I2nU2s!bV}9@V@YhVAuPf6YO^>ql9U~JHp$7-FtaboJL$iu=_Zfgv^57 zf3SNyS%i#25BWv!gM6vKw+UB-?!s`Py)Z*qBlH$l3w94?jIdL%Yt5I0Z-nGZZ=v|M za7Xx4xGOv*EE4Scz1=4oE7&E-e~Dwn355hgtWZ!|ZXu75UC1Hi6AB3Vg~CE1A+L~2 z$SGtKvI=%TrMUR=)Z z^*pZ`d(exFdV zvRL}oFYNeP|7;^97Oeja5UkABm#rS-1v`$`=EZ~ug_6QU!eL>t&_Y-vye1qJJ`_d? zcC0E2*2fnK%?0a|uL#yo9|$&YH4`ccM}=X+AmMT0n2<(DC8QKm3r&QELSvzUP+vGC zq!9WDwS~b#GGVA-$Do{0R=6&-6WR)^g>1qeVYiS#Xeu-kmJ4Zx^};gYK4G2kqR>m& zD3lj$ob?u}3N{8G5QYmQgd4(-LSNx0VWD7sy`J!fuu0e|SU)%~Bof{ez81a|z7j48 z*7wE;;{@w>Q-x@MdqRKD5T*+kgycdx;hZp1cwN{pWEWl)Itq^n?S(qRaiOcwUFa-y z5xNPF3OR*XVW|)!GyZUq|+2k#r3 zd7po=|6E}S^&pl=U-N@kiY$ro2y=01k=Vl)U_FdA9!ize!-`^EO6UvZa>`o&ej(`v z3e!I$ znTxvFXJJ)2Dn*jJ6}-{ybGfKCs}-IwE;0wt7ey*~Dg{W-0R5yt_3tK>5b;l}3s8Q< z?9dg&E~>lQZ<7Y^3)zrLl5C>xi%!nnNnNuy#Vh>s^9Zx|G!M zQ_lIII#4Aj3-l7HJf)UU$reN7se2uorvfw$@jWu?k}83|JsC>qKR#OA{9H8n`@fWi zwOhAq!=Gm#*I?1-aAB`C2IZJp#3i+D{HFtw)gbyQg`|4Me_lXRBgTJLBk91#f9fNt zpT~cmq!3Btg-9ePUg~A>pNH{M1IK@UMM@DbXiG^VrVL3t@lr2||NMfN4r}~p0bV-9 z@t@U5I*9R~(L_ueFGM02@Jbhw9z)XDivK)>q|O=td6Tp<#tYhV3rV9f{__!%hI0Jp z0#cTEL67i~eAbY3T-{5@B3nqZ9w$lH8{$8WkaENey4Q=8GbH6l$`z9KBIOQA3y|`J zq!^^UA?Yimd?Bd~QvQ%s8mT}?8je&jB-KPJ6p}V0sXgL9E0NS{@t^5P`hWbVA5yV+ zL2ZXrJS3$-iVkB7Nv{)l-ryu|3uQYQ+ak~wleQqwD%gTElVFQQTQC01Y6MC!nwLoS|}@&5UL3FrJ<-$O(-MS7Y7VRqn~M_Uv9-lW)5%)-jFbLiih1U>S>lw@4tr2Sj?@LW_Z{Vn*5tt zZt2&;mV3L7N+mAx3e>2Zi)o>gqdb+p(1u6d`VMP6)>7zcXgBl`lz+4*wsn`+;jvBL z!TQNcqW*H*3sDLh2(^bkDdk04{D-@|4()}`LpktF0o_LY7d1w{%F7yL*4%+6FK+}Z5-t!PER?2n(<3IUK(m{;H z^*{0Y{~UBxDd+&}fAL8j(_b1HYLR&96cWGxL%oP}?}dO`IZM*ui`LNmGHbfA>CmR2 zR)Sp%F~mjgl=CiZq{9)sL*qxyFPc%3u5t?Aq7l3~BX4#03|^XXGLM%#csa)9ylw?A z!8mchdm5?Di?;OYbZy}sET=4WuvW4}MYWJu?k`t$3SOA;ikHD>Tek>D*N!J9*Zw}pJw#-j&sKCYwAte$pRq)rn2ax>^M!CL|w;}X0L zFn9xCMb0b1%l~R%)q$4Md)7cdX=YGygI|CKzxoV*={W+I`jx%0jO1CWmQ(P{&*0ad zJL|Yhx@lhACS81H7~9#8dt0bD^f_UDu+BmApk&ZWsGfR)^@hll$Rz#jv9A8o__q`8 z-#&>WdH$yS4>7~*ToT;NFMwl$m;I=N#D9Kx(MO7og&ipWba~&0i`5`1oyRMoq-g5n z-gPgHk9cVhUKS~3QE38_{n$4uEk?2*`$nZ;hO!^~)(vLz zV1}?C`_}b?96##q$G&y#TeLpi)i@fM_G90=mbE_Fk?hC5b%S>OP}P=~{n*#u>}Q`5 z@3~|@_N^QIK>V}!U9unh)(u{>l2k=iMEkLCUE5DfpA70=lI+L6_SyjZbRsSLv2Wer z4FNkzD~C&|+-nC@UQU-dxRppNmrELZ`W(e8w@Z9QN=51OxRlnt3M1upiLXdi$uXZx z>D}uRUin?(D^iblyz~WJ;w#b$axCZ)Uy*L?b+1A$@fE2KEm7Ddz9MBH$09D#562O) zs7u+r5En_lm`i*`DuP#Wm-vb_o}!j;DW^xAKv7G&l*^^#d%S;@3Q0{k+NE8}?OxqU zzKlzGT&jpyS(oy<)CjL~F6DFS1X6jI^1HMZse(%dTjm-yCnf{0aJ(pMmTQXy4yshCUkX`JdV6?f?_QVo|%xbz{tu%=5TT?+P! ztEnMXH`oGuoeo-}h+fZmPg;ajJ0uN3iVI0&k?Mq`Cy;E!Mw8E|LL|~kGbDYawwF{d zB)x@HKP0`5)F32XLwX=2l_&XzA?Z219t=tO@M;v2PT|!!B&|Sd5|W-qdMG5-C#|L- z={jD`LQ*VV%|p`Sy*`FoxK!E?$0HgFnnYTLq&`TkLQ;LC)*)$#Bu!gwLQ*rl+J>YV zk~A~5bE%By_#<7ey-Upa->Inb>flm2_xe@GQBp^j%DeR8TYk_wg(Ph)WykU1kTe46 zk&u)@g^*Y0kaUw#+a)Ab#j9&b`jNCA4N1=;bqh%yk-CSZWTe$2B>jn3&yX|)saHt4 zNV$54q_lYT2}y4u^$khckRA(3-yro1Nx3Ok|BzGyX+TJNiHMJfq~1saL(*BKK_O`) z(%_I(328`3dI)J~Ncw?l4+}{J@fseIjw6i-NwtwihNL3&uTd^l@SZb<>2b766=o>ma-3kdeeE`^-Im=T3=|p&n}w$Y zyB#`BSRuSCtQ73_=Zk{flC;~F?+f*W=xx<)`g^+Ym{3<3C9D?g*6c8$zA#uAFZ2^q z2{VPE!jr-fVWeQUd=Cf%gh9d^!sEgNg59>AA-p2ICF~LGHtH^6x3ExnPIy*$Mpz&$ z7Ul|zg!#feVUDmwcwTrx7%tcqvKoS2H8Zv=YITGy!mGl2LVh8GU{~qvN?CfLf>2nn zt901~yV_Pnuv@ulg^YrI#mywx)jGQ}S5mNBVs;y>pkP-Avk2LQbb@^?E+AwTRtX;n z6NHzAzCwSYkMNQ(PB7idYRARe%8sYCowc{MYqX86z3uqgakRMBw)+I@AJ&H~@AiV# zC$A7Kdv*P7^)|mUf?Ykdx|?lfwz^FcQVL@QYrhVH)oGMq^|ta`S*;DN4Xhtj6fBJ@ z!hJ#|!P>Q~U{^A&9a{+Hg>r(mRc^uB&W_h)!LC}45iA{Re`~vrg0-C;Cp$i)g_=S; z!P?b)t?lg?+3`v%R232lNrV(ajF2D%3ri;aoz2&DV~cBu#*LzV-qUjh%<3!W2w4-&iaGgU_?DkXXcwKHtpl@Oa{oC#c zU4>Ivlf!N;+2YpQ$J{!x-K}P4-P*L%txjBw%YVzoSsDDx@-45rffg2bOFx4% zaX#W9#Iz+{T#t2zuys%~s3T$5i2gY=5U~K!58>GWF(LFll#B>xu`)rm5Zgg3py`Aa z#H#y;*C;bBQ8j3Z3SQjDPkLCY9o_`*U@gY#iuLoG9=3|6>;0yh*uNUuH!oH<`u^YT zj!*9Yi~bjxNPfR?}LcJC0u`@a3BSjbA4qRNWrCDz0xWW^wpaK7YV-JnjT!p)i;)S zui&EYy$cnQNN|ByuUClo3NH5Q$>w+|xbUk)ex%i>ykmX4)o=~}*)zvXNBhtsn7Hibt|36`hjZFySWg#*~>rwc>vb!MrG)qJEr zrYo0fl^i#`ac=zX)U&3G=b5bP{pRAqj4rl_a~fR5sUTJrT@h3&qp`X}H*33iA689h z1+)V?4#jdo(Z_%0n9RXI)A(OM>E58TL-9ZObAd~I|5>V&B4hLVh0Sn5oX6jI;y=rCd&I=?LL@Q=iHlq4b%umUtu5z0t3?T~UbWl}mF@h;(oCM0z5_t~k-ssnp#6;xc z7TF%7sP{&HByt+*-ssm0)^d7LGZM%DpP!=M8~vJ&knWBCNTfGXmQcj%NLfQt3nVUX zp{Jz~*+X7KkaC2icd1a$kfa|A+r*J8BvrvHcSveOW^xsrvniK22P z3#ks(=1LY)P9m1V^8c4Wx;JI(6`UNQdsDV9N09uzDO-;Q;>8t^AVG>+K9qbOB);0B ze?r8HA+KMNDutx4kSd3y+!UfpNJ@uPH6$HF;;SusFX~u5AMH>XgmB>V>4-NcBU~Ge`|W()UOYgrtE; z4MWlfqz6M%eG1ViBqc>^9Fp=QH3>9i-tQX%W(hkn{%9$dJ?@ zX;es>j5InVeT+0FBJ>NzWlo4oN>D zO$kYFB25iRuOLkeNfnT$hoqxOGeS}Zq$fhsmq<^Bq||hPnIS0#>8X%(h7Ry_NctFQ zR!I7@fVb-Gkn}`;m*#||`ABm^(o0D5LefU0XF}3$q-R4?AEf6((q5*a`61~r(t?n5 z3hDWfbP4H&kn}Us!jNdq`?QQQr(nH7V+jkW_|w#9LsDg=_d?QdRA_%l>W|m^A?Yck10iWE z(gz_a7fpCDBxRrpKMY9^P@zL1=^zn53Q3*NO}e7L`X`*7nV;$QX!<1A*mVCXCdhpOR~>H(rCO+g{05$IvtYc<8>w^ zZA3a7l6oS25t6DQoeN3tBb^UP(~-UmN#9V23n8fsO?WXR72(i+6_QHRC%z6z-y>ZL zNnap+6OtMteH)TmBV7(jU6HPYq!$_PS3^>M4%&Ai=}KXrbFPJ?wUqw*khH6ad;JiS zhT`>ONScQ9Q%L%gkL(*ELBq6CbQqqvr6De6p8jqAbBsD`y5t9C- zTq#46o~X7ZMyimMj#XOfkW>XJO-TBli1&r0f_SA3Njs6!g`^fp=|fTvBwcik|BOP? zmDl*s93-tr<3BGWsVMQE-MZepN3dJlYlM};QelZ;w^LUO8wI-+I!kz3m@hmd>=ND* z774Eln*_VHIYpQ(Oc$mK(}Y)q*M#N57GZ&~Q+PvID?Bd@5jG1Wh4q5n4jn426NU-P zgdM_gVTAC6@PhE9V7GN&6=n-_g*n1=!n48(VYKj)Fjg2NL~pT<*WVq54njkrfzViJ zE<7kaB(xS<2rY$HLR+DU&`4+}JRmd`+6c{r_QFS%pkOW+9tk_YPu(ghFB= zdYdz;{!S$%7wooX0>N&1#t12evO*c5m{3%(-57on|1A6>To-N#KM3y$`-S&~1HuQw zLE%H;kYKw-oEF=TBuB-^gpY;e!Y9HB;ZxzHV7nGv6<-l-=Z|m2-wC$!$2Vfz`P_Cl zu-zGKhmgb4_6eU0XN7A*PU%O)cLdv=#CD#zt-t>eYR@Ax;x6R z_jh&h2$i9HP%5YqRHwbWybNuGjzeQ`=>lzn?jvk2v=5pB6@)H9C7~+Nuh4Q*$&U3P z)ET-99iOO&tMnKI)?(;!=qaKPg3jokcLLqD>FG_7uY%v#UeUyBG#g6zkXz@mK7eW> z-o!fC*j*}Oox&>A$i>YMIvs$n680F;n?t`N7H^0rVg;xQsnmsz|PbHm7kT??gV4R0-f_ilI{F;+kXR;j+t$>C;=q?>9IyHl;zE7$3#WJlP zh|m*wNMe? z^w9Wk`G>53`%#Jir+?yao!p znq(`uG(wbZZZX6~R_MyLlH5Pl=~-wa;uWkT&{V{ASO>9Q#M%K>rYl~Y;0LvxPFdYOUwos#CF6K}nlIyu7s0>sBmj+N}DA*SJ^#{G2MoRM%b3yQg z%yEY3h9h3FPP#ypHZJnzS5Ez2bsA8}sTos3HC+mlOUctt*;vLD92#R{cV(L-5()O% zPE+6WOVrXmf0^K;ziDP~$nqNYDoe2acCh7k=lt&ZG9xahnpWehAH(U=NDu2ySOLP? zk;8ILIubsu;_dPUbQ$^!dKbC@eFS|z+jBTO)(_5i(BaBnhuIChfU6ndGjvGwZ|6uC zgYCd`XceSvyK%&V4Z)+Efa|J?8YI~4JJ{em*wlNQJxmxIF;aB5^pmRc9^n=b8X75V zz4BChZrG=Vq=v>pXs#$GE^;D+m)=O$FIYyhF5e?nAf+OR^rgpANr$D{T9wY>X(ShW zo-Zks0#fTABir_JQG~0CryM3T`|nTa#cr9_#k#m8k((<20>|pMNW!mp=1Aw(Hmr?W zHz>ceBDqv0`Y}p&3c3jWv;R-zpZ$L#|CjFn_Te=v0Veq;do64zwFO z45ikDCC|^W3SnKqs)E%5>V;UIG#^L&jcnJ_N^e5*Xvp=HGa*yg8IjsE4Gp;-F{?Z^ zhDOnXy(!CKTw<^aKss?)gpVjvCM7Ma zC(T+Xx98pj>It=n%0icj_bN@^m9i8gdbN}uy)HBddK_8^HHKb>+CZJ5UeE~WF_K=D z(F?d8YD`8KXx-x!;tcc^^d|+pLv8Co+3E8Iq4ZE8cV7FP#t7V$7)0&5-Wm^?OcfpyAP`sVS}I!&`BL5d7g&OL6`OQ zB|#)&q=nCk@os$vJ+aGsPxlQ@!4vesQ}c(`xfnb!Kki+h3l6P!@h50KE_+_|lWFjT zd=3)Zxz;^{XXJP6^XTg(s!cwXi<)~Jshq;|Rjg!CO_IJ0b%y@g|0kl0@74?c+5ac< z&;CD=|LObxL>`^$-EF|5{^jte(LSb!ASNH<*6VzGU7>3qnqOY)whY_A;-@HC?zNdIGagmHz?V$QlYV!MM|DVV|`~O6@ zjQT%*|DVo2?6X0`x-dGRF3?`W7Gven1uYGr=~!=LErOas!J8-xPxBFXUC|XG(`!Bq zYkuOhOT^pa$43ao;0Sv%Hyeg4>iu^3*=^(cv1Y>= z9-%Awy-Av@N_j?WHTNjLOc|VdX_k`poSy0w6(hnntYpJoY>$|&f?F>UJtfiikaTuj z1~37x8SSMG-sl;;#WQ$wXYjVp;0>L@TRDR_aVF^Kr5@ML>5~plSD^fe9ie(qX()wA z({^U4GO4tJ#z2Lk=DN78BW9%9zM93GZa(w|G;^Yd^~m92ZK0Pkt1PjRInYSx5ZB61 zyyTvVST9}0s)dyY8iu$VY6Mk)dO(GsSd9jnLl~h;-P-&G9}aj>Z~ifYJ&Y7>AEG|b22@-O(PFGH^mP?-yvRzBN`pb zFS`bp;@z}v6B|iL-wj@fn)0Hrw!czYwDzv0-`#2LowczK?NZPuxBO70U*Rr!54p=1 zx_zt&)oS{#(HFE^oQ~!NJX?^%%9S4Boz)&;Jz*6{<~Hl(mc7)zlZ-for0-OIcKU5Fy^uu_i zs2{4Dzq+_nom~emcsc9_iWIyTHh33o@c!4}ov*cYz>{l-;p-lK84-5==2kBiSBWjf zIsnZehldCo3blu(K?|Y0A9?h_Z+JN`9dm2Wn{NGd(yc2y-0E@Gtxu`Z>o?sxNsWpS zukm*GYvc_5N~I{)7c}y_G;;7V;im~}%pvZt z5vOmaLlBc6_EyTd#dAMFsc)qBG>aYdu;({XYLb4I&Ucee^g5mIIM#35-81GhkC%+& zaF)W4;^5puysERIO5I)OKhafaS4p>?rw~`k?>tpW$uWv$Y+j}%&TaGj@)MShLKLD9 z`SHAiX9RH};ta&HM4yw4qtyBpkQKK-E`M+w?$QSv(<6^lhd2&# zDYlN7+03Ve70{c|cxXPf4qC}EYQh-mG(is%X|%S<-#xVo?fsp0Z3~ zOjl!KY0hBYpczvUhLK8U4%}wKh7h46^frh8Fh}J}tR94YNZmKlJcYE3QJQZI^7?($ z!>M8~r3Jm(_TgN8%jlk{9%PGF@bY%F30tj^F{=m@ls2>18( z{2C8%YVf$z&(MngZtd;k6ocnWSQnuDi1{9Kmj%R2LA-*{GyOblJv0KULWJJXlO)!e z#ClPdG|;1@nQEY?(g4av;ir(pdBi=?FXV6r+ClUKSi6WY7V#$e4I^GV!Uj^7Bb4k0 z;wMBHhq#%NErALXwwP3QlIAJsFU0QT-i}f?!y1K43ZgH>s));GGD-!NC&E$k%YyYC z)+DGX85PGGLn_}AJwk+suxeAI1z0DsUeoo@M0!Cf-6nHyZ|f6S4Y6)RrD>jdYFmji#X6EhjB~EX~N)zb#Y7bkw z*2BK&?o~Mi<;3Mjtm1<`EF)A0Y733f9HM3D20V8`$%!5Zm4v21WmT56agjqRndmB% z3b7?re7A@Fv;R-zzi|H_Z}P-C+335)HO@eT^wlILE;95ZpY`>dayw$D_~y2PDSakk z1vtHI#OjSTid9g>n;w086Hhw5meNY|)^AQFjyjF!Gd&|+`lI5ccRZHtOa3Bv5s+04K~Kv|BEN~G%JX# zjFpMMxj6SBZ_lrPb!*-+r@BO+#5%G)v>4h?rAM&RsY--?tOUxl1bCSG?V^AKu+Csz zVd3&Nl$w)%HgaFXQfwWopigdiS(ebObBPe4v6f%=u%x&o`Pi)o$vr|f-y>`@^;>t) zUD6PJ3(+$XuRZb75^n?D?I!fNeK(AabQUGiZ-e>Dw&H6)a7ih3$(x?^G)ldPMetq1 z($L6du=unY{$?1gV5Y0A52_lgO zXX}K85<^F+g?II&1h4q@~ z)MupkkU6d0GE#(^kGr)K%Ex7x5eYr%ZiutED3h#u!=$b zpfOMrjWx6OD6Bj9{fv0L3 zDPHpyPOYF$_sh~3#-=WIsO%^96i^YUJ5(9U2HmOTp7pSrLEj;6Q)bGx_H?HTqr6?# z&Ty+K2X)&OFZEI=G1n?zp&@4t@y1%HUZ>(7(_|$op}r*QFvzRYgyN>p>Xja&u14!Pr)8f!M;wxUQWUOO~IZ`!9GpF-b}%MOu-&Z!M;nuUQ5CLO2M8=!9GgC-bulJ zNx>dT!M;erUP!_IN5P&)!9GX9-bTTGMw2OZuy0YYS5dG(QLrabun$qN_fW9kP_V~P zu&+?Cmr$^OP_SoEuuo91H&C!2P_PG3glzLb!TvtMo<6}oKEd8S!G1l#9zDUnJi%T( z!TvkJo;$%lJHg&M!G1cy9y-CkIl*2z!TvbGo;bliIKkdG!G1Tv9yh_hHo;yt!TvSD zo;ATfHNoCA!G1Ks9yGzeGr?Xn!TvJAo-)BcGQr+4!G19X^LpjsU4E{Zgqit!Wn#>IW$-7e--2CER15UK`chtfdx>M@)&$!SOw&g5gI9n=(RsinKZ zj5M4Mf9FN|X{OVhh?lIzU60o|#;udkL_OB3nf7bK(qIk1nukk8#7@u-!sbISBM!v# zHdOjA(j;svVoJo_h?x-IyW^hC5BhjNv&oA)9;+aWwo4R#GSQ3u%Oli-enM;pO+$PI z>Ip3(EG^bntUk~_#4n&Dh&QorlWl3rS)C$nr+^zMbvs;o5vC_QZOt$gF*URZ&x$nG z8pH)eXhQuCBHqO_GoJPu0v(lV(3gZ|Wd3|Wrve@6rQdjdEk5)HDGlX@>OlLohE`|j zh}8ocL@J}98gv^Yc{Xq5Ngu!DNtbWweYY~V=#Av^IoWn?<6%Rg1yGkxE-vlh^yqXy zsHZ!+wa>mW#74S5>0(2zh1FO?o^WgJY^N4P&kxmvM(Nz4+8QbMcI}+{XZK2XhbBS8 zq4v;vt>hG8LM~7GNhqfpM2Q(GEZHzGM76d~t8=?&9i4Duw0fHClv-b*6v0RlN}O=d zM_C616}!`1wT+FW!a7X-DvtG2-OpHs2`j)-bKd}Oo@+Nfzda4z`WkAg zn~=&jC7xg3aF;i`#(@iqm{{3OJQ)|DY^qD14GEo=TzNp3x=NOUu*y;kcd73z$KaL^oYT>cZLIbHyzc3s=UDIz zpzcPhd#Rl6@(9!iss{~)szH;X=Ft2czB=3j4W!eKg+4<}AkTzxku_MeWvNf6=UjCS z@k8hq^di(lw?M5gVZ8-)%I60)2eble01YeXVS}+!*h(%o@kQt|`3PqVBOTi>Q~7x%Pim)B&{NQ0=vC-8p4Xrbh;^X~P@j69W;xn3 zjUCOHNQ+oM?roryYDIOvBv6+O-mFIQJjt@@SH@A*q7q{xPBD>6ny-^aB6GD+(h;ki z(Ia%v>@8S_ZnH0sCq11tQ43j?yGVJ}6KV7(s_qdQmGbDR$~h&w=0~$w4G&8NoyPM| zs3PK3tSMMap)!cwv8rPghI+L29Oe?%92yDLf*!)NJ=D5{7a}`h1E6k*hj3X9JrC`I zo`wcN-Jyxl{m}lip7ak-JKehFQ^My@xzzwM*(|quV>OXWBJFIAH5n?4SQ{#fxD6^n z^lVrkob%}85&J>ElixLRUx;TD!oDNIU(hM29~pIoP7vWLsr+lGS~oV5@`@k7R_8sx z+&{b3QrC$R#zlVR40N}mABTAtJ#2rnN+p6#s59$^5Kxt2H2xQCqzY1T-rpQoz@Rlpy#;tWVF_%G)9_SIcX zRmxL2#3?xiztefRho`cYQ9O*=CTi;ujFifFDxK|=M_=B~OFa)-2d&UrSe{18ealGq zjHRDN)L3elr6oMfNS^hXp5A%IJ%6!Fo%(?s^d0mZ%h$KYdRPh7K`wKM-msX*%ihh! z{#~8!*n%K7(u6a5a;C!-TB#<|dx|vSirR27XH6>ak?Ga-RkHCavce9w_f(E`aav8Y zR?|XI*_MFHLm7H_VmGx?RlKuMceS;wpC0iDrRAcem&g(gs^{Y7N!}7ol##MDQqrS1 za1F?|6isdf8EcX_3+9Pm^sZ*;5a2X0NqI!D+K8$9ef*5j|cwE)kz zu(o0)+vH&v6+vUVvn*xQkFe&X`7Tx=JZEFAB9&LM&SDkC%7K*{>uXZUhV>U#MXbtr z*1>9tl@RL?o=36jkb8TqO@w_!{gPmPf|V0%Jf2UG<`-DsK;5Co@En1)7;8P&b>iJ6 z%^z=gBd?`H-!0=u-65be=utpDZi4}Ji;AL3_}_A-wgAxmQdX!9B=#)PGUcHvU3g1cP1>Mmb%__u%KRu(KHC4ITI)AvyD+Qu0x-E%me4|BO89nn*8 zx#8Cg9?wYiYv0tz-$8Y-n7GJ?Wj*@oi%!=N&p^-7BUeD1p|ngMyQ_MdnK@!cN_x@} zPvyQ7P9sS(a|!RCzZZ8(g0;A-7vgStpAx>Po2|aK|BEtc#1X`ZtuZ&|qi{^v^axk$<)Uiu{k;1}J$X^4Npk-8MYrl)kak z-3Oe?681DXO}s16?@-=`9^n@}(~`<{Qb|a> zwpeALf3^XN{Id;EdD2b=N-8}V=C za#4@O{)Ng&C*i(WMzRJ$BcV>oTzmp+E|gg7Xn8h=w(ARA5hNt@3H1wa#F9E& zD(rS(2&}0wS2;JKhHOf-P7Ef z2mP}f&_BBYMI!&V>;}YW+y)I}9KDZ~g|XQVI?5NE;Kk?Pyy^?x-4FSi_QqbfZme>; z!`1VhE!+y;fj(u3kJLNd68VT6I;Zi0x1F19zpwEKGqH~2QnQceutp1H4d!AR^U_an z!KSV*T1ZG;z!wr(pbf8iDs7=Z^Ly9`tfNpFJZnG=p+wL#xSS^UE6@d~uv|0~wT6B~ z{8%$e+PFwFt?pI8StFeKL*t=tv{HW>@>k;R!Wyc}Fsg%*zAD^kqUf=a{!_fR1E)E) z#d>e1TcylJJ4f_)8raS2cji&IMm*^*4d(iFx2Fh8Y1fHjBQ+j%&-t|zUsq*Spb!n`cz!o#J9Q-9la#YVPxpMBnKn}gB^DP+ zqN_%t5x8`NKJVe4rzy+l`g)Z-68R0f3`Hn>E@;CPuWiNd?%4!7Mp?dq-h(bvvO-wp z$zd(2RG;T%DFq$Ia|cb3g&YoHJxvaKDa(FNA$w_%@ud0t3@_5=$xZ{f)cLb29TOK> zP3~o&6eQgaYanH51Qj5oj##f?^}zaq0$#*QOISJzm;mcn!hY9rkBN&sz~LwdjU&H) z)OIWsJIRkqE~pyR7D@vZhaP~sLruxH9kiXK3zN}EDt%$Hx5NZG<_72;=zW@CHa%+% zo^wd$dCuWWNxBi;=3T3ieu56I)~J#-A9{gG=fQI}2d5C$UD_-eNgw3+9p}JJBHR2N zzxnjm!_Z(NWSiu5h}bxai(F$o%p}4_Xc6=t)VRO5{Cp0;%UHcgY$y4Zp=31!qMAD> z*=`CypM!ISF4X~R1|?feV%urK{Ddu`S-aBo6tx_zNu@GoT~dW?h9yop=cNF^<4 zRwDWoJSS4==~KP#Cz*++P_jm?JbGQD*vKSWeg~AFsvN~ifVEB+JCyqg>OPWE7bmgV zKk5JAt6TO`6Y3s{apAdE!>pC=pN`F?`k7jBz zY6&eS=|{0{V(npGszJQUl%+6Kv6~lg9Oe8C&jLa3fnLL<6vyE}kR~m-k`^pRe&3P9 zZRjnX_|#^fa8%Bb*rhIh7Tq}5v;7rX44s3L>O`xFb1zm=tSMO8ux4Qu;O0p?>w~e8 zo=|hSB#A_Z%SDu57wQzYM3=l|jlbo0P>nPYlGk)`n3_CcOk}cAY~&F|*Mj^vRZP~V zp?+~}mq^iW@SI)87W>~rJ~|ygi1p-N%~z~RMV+7Pg$p6d*B*e-d{@6t4R7x zanE+N?o=d*L{{wajP4|kC;eq5PYm1}vuix*jD(F(=3=p=?qZ|}Ww4B7^(^Vv zP4ge|{L(^6p={8S&R*%1I#f!ws7O(JU`@^8@rFVzH~>}K_>umot(T>oND&gW^XNMf z7qs-o>f6l4mn(ZJ&q7Z^*Uoi>GuWT>a%Z^a}Jn^apei+5vqCt%XK5_2@4^ z+n_I?q-tFyT@HE}>P^^_&}wKu^c$1|&j+C%s-_w_wMb163w1<%TQ?UZK7n-(>j?BC zG!*Iy&4BWgN@i#!;&$kHs8J{H6L+DF54+V1D+|^ks08A9XddEs9X-NQ#HNTbSX-c; zh{y4qidYdbE7nKQ_#pZtp5|q&?!&!Zl4bWszMIV{0agZ)I_ zP4F*Hl4o3Gw~@{WguTk`lHgU3!RsA2>7dKAbgcKR*R+gLgdFNUiS^TGk*1kn)U!0k zs=nq)KdLE6VtZ(pqRZNvUh!g`B)FwtgEG^;t}~ZJBPCrlvnMtH`nj5iP0-RoIczEA zF6%$_jJ95Ln!rR|nh43&8I)KTzMWlCTgxhyM|FsaOdIdf9~tFh{(5d1$)${b{2{6U zy*Jpy9;R7GL1WbC`yqcpq7nj!QMVOckQ`d8 zQ5B;t2e3*&aZr2cj{+W{D!u$AEp(OUgc&Y&ga$&NwD5KrQr2CJRQI|X2+CpU!%j1e zVk5IOK}bw9$UR%F@pyAH`2lzW+Ed8IS9LU%$`UGmj%mnS*Z6~E}> zQOwoJ>M(Nv^RKBZ}4*7;Dx-wOL&79?*=d14PLMtyi_-M zk#6wv+~9?|!Ao+pXy#Mz->2^#n$O1TK?GIINaC9+yqa}_otgC$JhhVg{40C|YlzEU zdCTQJ=m0dTu2*_0Cx+i?tTucDTMOM`QaxMKGiuV=nn4~@)mRkItp#EFQ_q*`&e}qx#DTw zPYW6;%^@s6rX!BQx`K5bnxqrEQZZ7544lp~Lv7Sq^skQ=Coyr6IXZdE^V1=Id3Y6P zpsiTRSetgI5EtL}vdpkkR%|2%wOu&Q#kwpjxs+5rq>h9i7eGa)xuDo8& z1GBwP7^$)Dobs^I6TR*=I(qary*%CvJv$NBq@{Zr=>V)>;azGeG!Z%s z&4G49g)4fRe{u!ncr&-oLct5PgO_G^#O1Y~?y{DZ>hsVPD2esm*vN6#pJ|7?r;(bV z4g;tkz4eW;9(G@PZ-TN9`=ryMm5UjPFn~TW7^+X#C^Ow799O%<=oEtZsq&L`0D6rz z-wJ3qVto}*E-$fYd$OcYR{7d^ycg9qG!M?I=v0l#>Y`kf`iU>RA?HDhptevSXfyNy z^fq)Gx(uy`CPTxZdQfGk%r~C<_2BEkJ8u2SFkF+?3;$UqFOre^(uexmqFLi8)Sd${ zN{uYB7xWZ#fPR)Smk+L-(0s;NO1=siskTWbd(v-r_S}E|+UW^m-+&98#)FhZtr3Hv3`PX=@==^=6nf#fce@; z#a-0HkKY>osY?GSOMe+D!YL{}P)#S%NTN|)K(b^q)B8gXR&o3(xnU3`}|D)xDKwR_OLYj~Bdd==ldctgfz&%H@{kLD7ksPER0y zSKO^ZRh@2=`$qDcq?T8NInbyqZuNntLsit)a>=KYw`f2$r^BR~E2~>6KXkfE$x4vz zNunnk=V3Gda5{uIm9k8);z_?jgawFuu@fUV@P?j0D)L&vFPH~Y~Tz&~WGkUztB6X=I@A?SnzSpVqDyIQQoStJI zJgNnc`rvG$pRVO4`!$tQS7xatjKW(-Nia|Vxm5Ib!W4%Jy3s4`zULI0Sf-RttGFgG7a9$fO5tH=@jQ;TH>rz5 zk~y^@`pdZdNmv2G5)f8|u<=k@Tt0!eBR0jlk9gO~=zhXJp)8l6JJ4>ZH7@gs@HjM; z#43_l6|5y#dvSRkDoz3S5>^|r4HOGyh1QYElpu_3PZIAMlm&4E)FX*9a>JJ&Mb8=zL{A#LHNfe9UUCtq!^d^SnZSq)QC*&M+RUoo29vagiBJ zI*sWlMvBvl#pP_~iH^`9s24OI`mmf&LCvw!J>f%pJE<6HywCg8bI&l+X^Dxkktd)X zEYJTR_Rc#zi)w586M7NppkSdRNJpsx3BC6&7(x<~KpH6^3QAEdD5%GRV!?)rii)UM z0l^A_fCa3eA|fb)hz<4ot$ok=e8rxL?pqaG~HAZj8h($aiJAoE(te=b#JYXh04b zS|jZF)&)uFK*(FmyI$U_qJzgOIQUsy(Mpc1Ab3W8g9T^G@c~6&D#sfH zm&@@IrLse?Pq0alqL8x$>lNWMaThAc^>S=3$8QB&1YHEV3b{&fmEd;4R7KyQkoU>4 zsNh-otrfRL++IP79M2O}QuLaFN^<;BTmx}`Dqc;hmHMnJF40f(R9AyL1a0LwNKio# zBe*}`>7R=QXJ1TWMZ90)T~is5bSX8Q0o+wX9o)#Y6cg)RC77duP`irrGoZm8SHv3- z<2u6;dPv1s?`t$bV8jCs&em`$De?QR#P7mkE|pPdxzW*kj|;i6i5v$xNEGZQcZzhH za{uKV$31k=MR+e4F4k)&0Y7}S^XrlBAXczPJ3KElACXEo!Nx|8+ra7!$6@GF+)8|R z$Hi$9o?^8W<0ZFr@R}k#o8q`byIk(Y-gZ#sa|fGsn^Tl#BMs({HI6=1Dp#Q1Q7=zO zahYXmOsqF=hI4E{?iAwu#*Vw{Y$qo=?sHsg(}_4zSVdRmY0}w0Q@wP( z+BqIjB`2#Q@7nH)RB^aVbHoA1br$s1y$=*T(b&xa4OLD9^81MuJFrd-{`3YHeY-kC zzBxavB0 zM-%L(W4t%SHSO*=14>qwiUeAUyGL63HMlSkZYBbdrMvAkz{NAbyO+4nw3aa-hhnwd z0-&TIv$yMY?Mk~;=8Nl2yA%C#DvSHOSEGM}Ahm<@Ga#{SaRzX2NI>*bQwolF41@i@G#5u>$#l0;kD#sq;RtX*!G?rhUxIuyrf<(a>LAeB1 zq_YLh1+he@aLaYm@3nAuJ6L}2PjJ$7KS1Fxz!B(jg}asEg8M&k)q0cQy*QUcS+(>J zc`mWy^Ie3Rqg?cEg7XDs1q(;IkUt^^$zhPV7p`~l8Y;*mBwdsz?ve#LEnS2Lr@7o8 zo8_|I)x%ZY>D`=T5yAIe9oJG^Z^86ST=bQKje^ZQBq-x~N0myAo~~X#6gNUaisML- zed31AaRvNVK|G{sanD<-{H6<@6>JnN6nrXZ*};|UUlPW(Dr@G_;7aF?iqeT5bmgqX zP$TKz8tKNwl>w5yo@tp$@!e7r(lYy}rKIL%re&rKPsmA0&ht{U(v#wo(sJ_>G82=< z<;f>1cxqba6#1wBeU+P)pA*E&&Pkr;xt~$V3E5eh@qg#kGc70C%T3M7$&1g(zvPni zWG^{0Ib%i=&WU+xgv_7jr3b}|Pe{w~E=kDF^>VWla;A7aF3wKRN}{~+!%~ye({l&& zL$Qx@PRPqk&dKzqEAQmLW97P7@sq3!!v_r-9zU{2|3TgQ3?Cz|`-q`&!}|;x=nc=x z${X(P(NAJxazbWqd~!mbmxq`8iO);RNcOsQ7&kRPVM=oAak~9+iCIa><5ChblE+Pr z&q&BiZI<)7*&5Ufqdv-Z3$D5X) z?M<8H9|(-PA2lUsV(X?cmMURvg~_@v~_tPJnsR$g8zDWoQ(Ps+8}-lUv_L@%MG zm(a?a*4j(ROi3r2gH~R0Mp|YrzX=!TdK0ssR=pBNmNfZwUkMPdFcsM3nd&zp*(uxU_88uExn1YykXX124)SLo{;TL zZ0$`v&+DI+nc_RxWt;PyUwXRpXmg(L72h*GD zZXA7?21!cDONgg7vvRCGhD}M!9+jGwmrM_&cblh|nvgp%d3t{rIx~5?Mf0Xd!X%`p zXF1=lImroAsPFtqq?etOm6DT?LAz&jThwb3-6Gd+HJ4jVOCi)GsyKT}@(eXOqcr(q zFUw0!rW5qZoRk$mG&v({T5`YS8S!1yQao}_^9Bs+9zS?!pOJCHdvqN%-0Lwsepqih zc8{U){rmLlJ$zuFfxW!EoV1jbrw|R1^1CBiTy6UYXy1TqKe z;z5*6AVu)CqW>sJRJ@n`G>t3b{UIo?2#1weN+&1ApBL9uNx!Q6-ciVLQq=koos!iQ z#3{ljf;@$+r2Mj!WMNpY_!WKVJLDV3gzu+Z*-GppqH zn3BFm+z#_A;;j=bQOIX>D_aE9bSqyfu}0#)?d-bECkk?#axbN%Z&k>4;%dsTiQp&s zZ6rEvTV2ptaDXD=c(1q{1TPAHmS1sk*@DLeeFYZ?#tSYJJf#9Y4A8;;#F3g9Mb*)X zPPxG?60epnaGJO;2tvqys@)}I3-^qaF$3c5vd$jseIximuoOQkvPe}I#GqJ=*Xm(6 z{|-LSIU3-23rkdPv!9kKrKh**v7#R(!$13))KrKJ6la9t>{e#9*Hf}a(RxR(MUL_xM7 zUW)cHW&758mtVqm2N_>D=#%CWyJ)6MZ0}pn@!ZcH9F}JH9<@s$cB|AaPj|zqqhO4n zpP&u39~0{x&2{&lj3W-cs6iahVF5x#79~GQJ+q2)EHTeTNJlHe@w1Oyw%v9*IQoH; zHaD^8CY38B`PPyqsq7MbSi^BI3J%C|i{PiF&ad>n4*nANsbHVr6B>?e4Yp>hVDCrmqK_x$ygk!AtwBUY#l66XUsdUo48_u&{*2};nH%6Q)A;%*bn6kI9zQLtKYk)WF5Z4)<1@P^=C z!9u~+o~we}Yq^qrRnI~BGo9m;a-4LQbDSl=v+$$TY2xAqxq_P%;RA6?#XTg*P%7`p z?<&C(!7{;(f>#Br1y2Y*X3a;Hp0B0fW`KJ6N{$B!f?r=P8DG=`y-perpS5*8Yf(EF z!sbu@fh+g*s^+IARX1I_&$GYfynvz%%&w#`nhpksFv!{1(@g~CI zXF#@(k!?&Y+kY;VYLguIaEgQV+8ih+>2{DDi14RiiblZeD$+_--L9Q3mHsUV8S7mn zNI&Qt^BL$2iz7J>I*S{r#pNqaT+*%PxVv4d&9doG z+z1VsAE{REsNrY_rwhK6<9XuB3U2S{f=nY7B3vgJr&MO=xguq2gm-D+3K2WsJ^eHw z!b}#Wv_rfgLvW4Y4#CTU&4S&6`!9F1(+h&fJ zT1p!f#j2rdej$5Glx3{oVL`UwSL+j))NJM=^i6VHX|?qH7?<>gUpcr~@ZAu{HR$OE z$#6k8!9+nzL5^T)j?4WDIBM@U6*o~8nMCiQoCXxaK@qQSYnQ`Sl5QVWaeh5IJ2)t5 z+Tt{q=9F>H@n0H1Pu6x7vRJUJjZ4~qq#u3FMYvs%Be+y>mEf_xF5A_r5Ccj!UlYm| z+C(%Uu?-rxizUdm2tE<46zmf$6Z|SzE2wlasTA=>p%alPpn)dEi-Vp2*yert;-Idyaq^GKqJ5+NKS_nSSTxCFzEgJT9bz`M8!yX#$%2MhK z7w`9)4yvwqu<=y~FAJU!>=(3FkbjA*BW{PdrGf>59`ZXZu86pIG+=KV=t}m7Hc&4r z?($0!WDC9@QYk# zu@Ab8UT@{%^_BWMnKdPn{dcOI!e3g%rE&$i6lb9+ZW0{%B?vmTbcHY=LfK;O9v+Y& zyH3!Rr6qm_#3_HR%b}|x7~r_9uFGh(pe~~rExjmWjd(rOug@2Z@8KNF(3-@%P48CC z5j-k*)us^MI$^%0oP$(ZZ8a?JSnG1XZJC2gZ5)h$#Rgf)eC`da6DJ$-nxN4JKknhFi$Zv<_#5?qI5<4tzk6?pt7^498<*A5tL9xUM9ak1kVY|Dadt#)q-h)`vvtBaz0zh z-20Dm%#>prL0`dG!E4HI!?~_w)*a$t`Ai4bi(779xmn6zR%Z>1KB9&mMwRJGGwTnKbnS*vV zxQck6Nww_-M_>bTcuMZvX# z-vze_>I*gs(gouLhxWM2O8eSDsj9B<1{D4bS_Sy%bLUr2+}bP`WIn=*O5XT@gYP#u zIMl_p`zpau!9v05vCglAV2T{a3#tq13U&!D6D$*S6TBg4BRE#YmBoN^HX~`O`(^EU z)Thd6hn>g+{x%7=39^vvTy@bMt)`i|F5X`&9XB7jOOeKBxS{>!QRg>L`8}wls|n5$v=BTdct#K> z=p%Sput6|JFhTH@hDD0F{o)P_-nrD3WuyFd+O1$1S6qi5TyZz(j#}zgwl;FD`GcUZ zAVE-9uvT!3AV%QIu?eOUc2kj*|uaG#rS}>i^h{GJg4nlI( zS>n(DZuBl!mh@>3;+SP{+>0;<_Q~<099L&W1c#?OuAaEh#Z?xUX;8!~p$W`@R0hbe zt)L+@7mfyWqS?yf3e88$#l0!mpmKgY)P?-Dg@cP&@Ds07|G&W!yVezcvErTasjIVP zn#Y!iTOzLCP$%7b%kgDoPfV;g;A+OBGx~Dm3xUf+VFmN`76%O;xs63OXs3Tf}{t>q2mq~AlNRb zKf~3_^vFxQ&vRTCw|eI@Pz!Aik*-dKJ3209po8lfqI9BBQY7w?R{6sF34Li zyF$bWrU|MrdDBsjk_ymX-1qXkNibGWT7G|sn=9C@cooIHET|#aBRE^}nh5TdV~XHo z!3see!2rQ`O1i$dt%5Fs;%dh7f>^1AxB5z{7BR1iyHDIK$&f>{T}3|L*42vvRo-K} ztDa@|J7}QFS~JV}?RYKVZj@FsUr=ANysKo-D205&3c<^JXSjx|Ca5vTCDu#w z>`uA>joP%5+lMaG&XuJvT*X-LQgL^QJ5$_falfG25~P#37V?`U?rZtA5H~`8bHt^J zTO_WlxLk3qX%6bFnc!{J?j4klzh|fhDsp}k7vwtmRgv_5S$>ytN8HW(Rb7Nkqz&9d z{al2}NFtJs*TmOa(aQiN-A>#w7C&&O!I9Cn!EQ{yJIKMOg8hQ^@_SX>VsXm^UkRQS z9957a;!YLZvCdW9(uW*8)W*SGdI^1w;OJa;w_gk1?CuKxDmy&f!)n3X(ne>gU-wr} z-gSkGH`h9J5$|Kf1-DX3{WDSUA`%S8!|L;Y2u7zm#}rl1wbUR%<_OkmL)f4w&w5z( zP>8o%yL!1p@QC1P!TW+&1s^EFb>hyb>QXTvl_%D_d;d)}vAD78>|c*}ephfuG)Jmn zy5JzG(AXuZ0?J}QDtF!Liu>Ws4qAxoE7%~%baDH{{c?*7`G>fw@>?dyIKd*pD8Xh0 zxk^w;jxUL8E$&jm%Yu&tpWNg!`dP5$2FHCV*eSUGZs$1cUk>Wt?qKp=4kpO2#66Ci zbEktp6lAsh-dW-tzZ6Uo%n}R|RJg+h86db~vEw@U87bR2%I{a@FkMNXt!(QkUaI^C z2wDoBQx3POB4-I6kmCnRL?>z7RB#V}@Xapp@XK zf@JE(?pJYlE6oGSC|-{1lwSimt`IjsaE%K1fMC0ziwYm72+hO|mR~tJri=SkIV=$D zmt!?W*r^=8kl!J3w+Y&+l3V$XD)nlG+${K2sk|Y-Cw0@SbhrBjcL=r!N-6hAH@cR- zRxm@bSg=L#oZw#7;PZka>aC~W=A!oylon+BoHA-FI7g0s#T^rOrnslYEfm}%*dTac zaJk?@MVKJ&I}NU11$*V#PB2{1SP`14)UkrHEV&U~D>b-k=>EPF*HqkJ;^M@eA{eZ8 z=&XCcUWw(4nRh0>Jv-k_)(_IC|`~>RhBv0b*RwF3CC|cIk@0GCutiXMv<6rXb$+=Hnn5D zvRAs6{=}acG=+TK+DY2KTDS;%>$o}fnBcIWSY7A%sqZJT-D9px>}-kV+uJ)q-66*1 z-fxWx@xFuQ(tDnJ&~Z;{;l6jfUn?EbCbsK8qV($!Busg-{4Etn~|T5z+Vfl9qwskB$gnhJ)>FdhA6R4N~MJy>!`}-DEbY8igGL_s3gZr#N91; zL(o?6lM-95BHboPm*2I5Rf4lrh$~opUxhzcEj{;dF~uirexW_rxV`IIR|Z zfYcxb1GWhr#CVG}ZqsciikCmMO_9*rMZaOXgT|AbDA^*7bBbPocuEo_dz|yTK>~27 zV5Oj>BE*WDD7aU!NpOqSW7}G}6-qwYa&OC!OO(@~81?~G1$)kRYc2!)wuv)uEx^T;p!@{v8gMDq92m9LFo7N^|Z5F34jI z94tn}QjtF*o+xMSY!{({;9Nlq!TEv?f-ZvYf(0yM$S6hJ#}bvhkgcTIM~FrfP3O6iEf6Ge!ofpL9o$VD5pugm$Bh~t2h`_hZ+AiV-tXX!{SGR(aPXeE za;;qs&E@!`a`>T&OLN(WE@W{v$4xz)V~vKc9UdLyM!=Xj7yX9L4!&vVB+7CLffvqk zT&}n)1b-;VZgI~G1_|Di-x|TYihhfrtQ->*GDTdh;8MXt!D)gfg5iRP1-C2uUZuH7 zTorMR1^MiW?7m#eFYWCC8k~&hJHWKM0O0$QR=N5LaAWIl+3tCP7uf znS%EO9}DUWnh4IV;PPuNu9dj*g7$)a@_QU$ez;6rDfxBPZPuyks^A`VQv>R3qIN4f z?s645=^+PaJm4T-T4jD4$9>k^!I_#E>d+i9vEJHFZlmDynT|Vlv4fihj|yfBhO$vW zgm)DoTaG_5E#X*CkS|U3NU+U(uA3t(snX})OrRN2% zyBSdBM^%xZaSwF#brM~_a7n|h_`pFwn^$7ILyR1tw@Gi#psnuiq0(s%+6fNGvA($H z1w#Z$f{O(U1@{SNXa~8Yy2iZju7Cz)v_PBzTzie9l#%XMI!heBsvSrJ#?kNHT`!nN z1C;T+>4G-|PYA9Pe4vnn#Z44c6tok3p&%v1Z5Fpw+zWypg8G6C!4C?VF9A_gHUGA_ zmaL>G=Sz|y&uP8#m`!}V!wTT{7XLA^-X_6o3ew~>*Bs9%hyf9{D98#qK1eskaZaj( zs|Cpbi48EWh}Ttcm2$_RQx|Mk-RBh`vy)_WnROh*nbE$byz|}1^K9$H$P6oQPtoLT z*0r8ED)->mo_U7J-VqIx9RO@p<+ZS@=M7%rd3L6|ZLpiMjj_$fbx)p{pAtVjZd^iI zd}3-sUbEbZIbIzPq2{&Ve+2(a`TvFgZB)mdXj8xPU#1*(HqlgHLqHy=%HaSFS+uqH zyjS8el6kG?U3rh^J^m8bpkMdALvPUe-{b}TO`f-&|8w5uxIw!AJs)#u*I_gp60h^yaN8Gb^StDQ48MTSA^!ijI;R!V2F~%F za$2H4dg^=g(cbF)G!R_yoRr_RCqp>)rc*)RiMC$>1oNCLCVDk{*x(ZB&i}QdOr>MpQRf$#8Tqg-G5(+x< z_Vj-;OYxspfptQuFUx-)74l0evy;&|G}j5^V0sV z<$dh>{$rg^);0VhA7IV(52fsz-mrDeDPC8WX8+AZ9g@OR<9#a?N-3UA)&C|X7EtcB z_f38ID!CV?WBaq3s_J>RRcps++3`8HaXP9=jAu^{d$YR{CVPSKnw5M-d_&lkML4^V z3ns|TUS>6#XH^%XVSQMQCGfp<5msz**zTMZ^5oLKM|!ngLAQXjk8$klNc(OsrMT9W zfuFrd7$$og!O^prC}y#48)i@Uj)ZuEvKrknC*o%2t<8$hiO9?r2EJ2I=fEuXNXGum z_ms$gd){hfR)@}8>Mq@n9Yb$6ocH9#c=p8YKOy^uFHG<3#k3>!Wz?3mjO+lSp`9Y> z*-F@6l4@Otqr&b|nDB3P*6#M)$tY=PjAsw?x}uy{?-&k6KHo-oJHEi|?V2h0Fxf{+ z&$3cBJE&%BARsg1Y)2NJjO@@$J5j<6*cYHb5B_=3lBzX_-wQ@$PRY!gp4s_iwpxO1 zf|D9_Nr_L-LK-(qJy}YBkEc{GK7I(MO5%q0=pNtO8`2s}JVS?>>74;_qvMD7h#N34 zZa@!9YOu_v)auDxoy*q6v|)MqNoiT*Ms^$5XJEJfBf9q(mynyAoRde+@!f_Fj~m>l zWpL5TUGy0+m?M~67|)0QEL~^5hg8WYen8yt-d=q2#feyNF+(z4@@8Zw$3`4t`S#xI z$V53|JgMdJPOYMxa+32fvQyA8zQ^cpJqDXKqWJDTdiELEqq}FyW_CK?ymYxZHn_HY zXN0*ROnkRN0|xi+F**{v`=9}FeFl2*!^|d3{2(g4Xa7N?y!a6Vy9bxU`wtp6%!?oF zpa&7W9z){>_Uhrq_a4Eo{lt%q>+dB@%=HoyvG|jao0jQe5=TF+uppFc|EV4}m%K?9 zY*I#65|(|qO3zBM|CTMV6*S$mi2SE|7McH4FL!EA9%*Gw;zlieVscu#Hz_?UD+kL) zmR@}7jBKnU#ZPX*KaD&&(@V!h4j$H0$vHV5c@cXC{xk5OL8&NAx+^8WB=JA z<-xB7vSO!Oxyh95{j32J<=09;G*^Ulyw(N%A}oIA74$pLo05jbuAEjr4rIh& z+-Y!pK@&xO5j_>HTWVHXB38?K^q`;85xd6q$I!Nn8D(G_43ksNa+o)`U!3n9KXTA; z>*d2t_w?-^P0PwN!(o#=Ei^OpGbScu>nbZR8Jknt@y-a8UF6x#d-_dfH$T2D){y>S z>#}x400#o~qZY@z1%AOvE9m|R(r6z}wuq8Y9 z0?*4F&35YfFqbgZK@`>@*9QrYoFPkQXZwjG%KI%+x3%?eadZQht{T4i1DiK zQ|PWdQwhipcAK@114|~xc<=b(13$y!)a$`(JkOptEKVc;;+{8~Z3nZYYi4wf>@9Jl z^-RJ6*%|Hj!eTTv+0Hl3Jgl-u{DskNt9X;4u6)c~a+pSUjPcCYZ$S3^)y!H{+M}}p zKB|O5GS~C$b&S?*quaBb(=NqQ2jwlbfmk1-;GuvSHMo~|D+cTOArwy|`+VO%;%!GC zxte_J%|Lsj#OUy8Li_E*K2c$07Lrdy_KmQ8aArp?gvrcP2UM5(wew%2$xb>js`iM` zEc_QnH$BC>0ktAN2mg#*fAWUsPCK?wP3-F?BRc@v$m|#eWRKbHn6QA%s8xTIN~1bs zQSAK(F-0agC--AVVFa}MGF>GXqdy=Q0y0bacFaLQW`WzN2km9_%W@ud6piuhrJJ24 zc+i9LU#|-NEj`9deIAo9MHKEtzh`F!M&eQ#>t*qO1>6H#|$!@nc@ z$Z*a3o@eh77#+$%)-gV}#K(9uIx*e{#dv1_&CUi2XyqL4g?Npr3nTlk#LU8f&N#Pk zMJCgq!*qTk@sm*6AIHW*QO_I4BcXBB=Mo;2*x_kckd7VFVdqsD_3tN){!<8+yxL5j)oeX344D9Vnqv1_F zuX!r>QyFF7e{g5+c0`epeN}A6_{~cH@23~M=Q=&b+h-*9eaV;p*f+CQ9`zfLnMI4H zZ(c_(@`%aE?7teBp>I1#C?I>>W@O)yUW(j58QCMb!pOd3x9^M!BQtYjWCl--7ESWJ z?#a6D$Xu~;yRPlmEO6Vaenxg)mwoPF=Fp6m(YAKV+Y$1yqk1L}K@PFM@6N30!Dluz zkj3-)c!T!%h_SSV1>?*nKn6VYm>jQLUmQns2>Qf~W{zJw| zK=v_#k$oSS^bz*X&h$L9h8U*oF?^GFW{hWNs2SPg-!R#sjYh+mhm6buyFF626UO6w zH+yL;ATtseP4@DJeG@WfTC|V&S1GeSwr+Bev5Z_VjGkg#N0XhC6ecqy6{e%UE@0*) zjqDt*fF{#ljZ#DNi=FIbmNKV4BfsFcI&#Wr?p1*cX-%cSGll|MIzrcXObA?#$6ua4 z-pyRLXCs$e$*(12#VlwA^wUy1p_9#q8ZswlM#~;JmGQzHZg2JXy z-+`Zq>^qee<>Y&vKlbYQ^3@JXvJZvBwB8@fVYl%0#}6a_(BHz8&K#K7RW5dnpKZq3 zQIu!4DHzT|*fBuX6kX=?NBpeS=&qj7mRQm@9I&i`>6#T`*nyzQfL~iY7a7 z!_Hh8jNCP{PthJ`(DnIkJ;WG2ley+(G#)u-wA1gCGthqmN<_cvj(^8AY-5DRo1MP4@Yx^~b79HIwH*{x zrWUf1mnVO0$7?Wu$J&9lg}-TZ?ju}BlCrkSx2}Id1J>y8QEu)VVdmAa&t3_ zT(3}`xDFi5L%$8vk+TZM3;bR{&oZ*_S?oaeSLuISmBTW#hk`+zzx_P(jpu#qr}MWX7sdK<+FnP-8?vhG0?I)eM)r-Jog|TQ0Wyto zW@Lv*6h>wP-VDGS?Lcq4lCk{*|3iG)9FAk3?U)6|fb7+`Fxki3j(UY%eJ94DeZFI4 zp9(aOiKJtPSDr~d+L3GA$uBTk-}&Qb7vcWyqUE+GgY^jx>~i?dH?-mR%rsVsuu_o+8DQR_9d24 z9%JbV*2zW-T45LMZ1l{byoz?4=T1j<9#KE`9%PuzG*dukPB@^e3aPii&oFULm}9MX zZ9)F-%Bn zvI+`Qt~&cp^zks6U8wa_<#tCI<~-Ky_S$<>eNhTb)atSxbU-Tqkohr7`IYU>W;pDO&!lGH<@{Z z>!-iqAo8Sw;Tq2rZx#*gTYe+^mi*5w&a-&f^UN%KJnd+<@gAm4>=fvL?DN5BT7)b= zK)*WRj}n)(#$$5(XS=qF+H?;Yny;x+R7Pm2`_XsqpsbVqar0_Bg)z%1+ZmJP=)Z;0=jcR*(W=vF%UJn5bdJ#Me@By9 zi7AZQ){OCft;d6Z`p$t`o@XbGem0wZDP)a(18i@Tnzg=U{O9{Jv^_dV<`X=aN9NhV z-eyvF%CnKw&0?q7STI_Cy>J2jw$bx?ojaW|_cQ(OogY{mcOd;)3KRUA$rdxfVDt%N zJWNNC%XUOnK=u_!m_|+&XJ1Vi*}>|Uj75haFQcP#*kkkO&w0HlcNg}~R>&{>YsSUR z5Q&|9RiAa+1=P{4>38lBtBf&1AxU)O*2#Ejyn^jq53=%-o^JUblr zb=Il&fu2`cZsA`$0wJ327=f&u!`ktv=h+z?0oe!JVR{g`7N$M4{cp(P9hBkNI@bJ; z^D;_vg)yrR2OkTEj$AKFFPM(`m`St3=mX|`qmg~-^TRmB6j@^?VJm%ru67$bW**NV zTX0AwW5z7bZ2#o=R2rNcaWfn8g^?XiXveV`RY2yMWt+Tv#RtEM7wD?Phs^Kf8PMCl z4s-Ruz@>0peo2fw^W86Lz?JEB5M?KGMc$m$%fb3<=|CH<#nJ1_>qibe6aG%-eO21~w{pfcQ7yFtm zpx;XbSL~P3mp3hq@WGXx_FXcc*G6J@Evf6X?ne(mA1FGCXAsEIfMzFf%nAL#J`-&;!krcd;V+>>1OYgQfhvn~viSz0kOTxNE+MR(>X?%U4XSvHC_6!nx#T3fltXBH?{ ze$8-f_O?U)E$n0OpBt6Qm1_=qel*$1N&hJwqfLzZaerYNSVde1zdpi#?Kg=tvo$yO zW3H*MxOQM)nCfifInRSS-gE_kCKecn$%?*Fsrvy9^FHADwmW0o>nj7 zUv3@Gg#3Q-S2gr+WP3n%;MTeH3p=xAe`C2eWZc+!D=W$KBi}6uZ&vq>Y9J?!%-XJz zo!t`9kx>7tfc*IR+rTG+Ialf0EW4bDYWMa$JK#GY`_RWul)tP#=XaqC+2_=o(XqmG zFa0)}+JQ z7yAKKMHevJd4vAMa3^(P)*n_ZVr~hQF$inebQDV`SD# zRw7r7%33#M#|%ogn#~#l{c24|`bVfQTllmb{!fYVvKR}a2P%bU`zzfF zgb!#{Y;eW%US!IZwIaM-*|ASX$HqJO`)Bnr*6iGik(~`4O?GZfm{zqC_t{LIvkhgP zoJ?NS*#z{#>cb*odm&4Dgyh2~8<}f)PWAwCV!On6&r^3{GAlxMbc~VN=`xdDX1&V{ zd6`WwGw)@VzRc*?MDE{CY`nZX>ooKwGjRS!R68b>V2saEde8rau8-_o!Mtnd=$<}- z=d(>?yeZ5f$*c{Rr}6Q@4xagJLa(CFn(>DD)UBP$6VP+1*Y>uq<-K4^tAuV8Q)Ljxe0yL&VVa-N^}V3>M7`x6(VsTy-x@1RAr1VCa-@-OPK@A zR(C+dnP-e{Xn=+LmdKbR>?gHlf0TNh(n@A2GN!Zd`W??LZbM(0fZoa+Xw>md_C1jG zM-yYbx1#2>cP6_a?#GNkn(^po%V00$T*bAcTa4`ZC_5!=-W5EnI-B`}xo_fN=jDFd zQYR&uo5NI%a;@&=IfGTE2&rb{b45AP9L%*ofIufU? zFH6nz&Z-=_+j+U?(vD#=Ls_3P=4bov?;u}axk#o$%*O5ROJcmv53u&9FOE16j!7S) zKfFSMdP)139 z{F0}OuS*{bXxWzF>cn_;L!QG@rvaHIus5y?IH6f(G_u2A)-lHHa0jDP(Ju-kv*SIX zGVc?NQaCdo&<{DX=sxy5$4AO%M*u`qHQMoop6DmY>h|YFe2>(QT!*jBAQuCDI4Y@atbs z$*o;p#Lupp6s0cf6m$!7-9{8%PvJ1p*PAm~tM*`jyB#_rbBmE3h>YHFN6cPmJ(( zs%${l(^oI=$lNqC#w$;sv9tN?@S(9IJa1QtAQXET==fVNi16!?$3}KSN-}HOGd5pmPA-gIJ3hEKh5jE+--dKuJATYgt$n{e&p_Lv zhoH~f5!kz5K^CFMTsjGviLAft5bszp50|`(d5|&EdIpBn>J?0Re+%L=7N2~EcN1?w zj?_ZOWWK1%J?>$?IY>Td`28l9v2Tat4Mtu+_A~q5jLo8R3#Rux?R_$OjQOh$<^I2= zMf3+V{%G_EGV$(Fk(BI6f;)40hvHQEo1OM$@J4f(uP#8h{D`_R>bZz_;Mx>k4m159 zkeMDnkNYlvX~D2bYsf3K9xKx+h{64_4^*A;X>{9g>eTPQQ!a?{UK*xw%X$l+qAr>v zx9uFnqg`UWyBVj2QDg37W=LPU{!I2p+Vebz@$?GqXVi#(eN$Uq&srsH)<4D@)-1-$ z^XHst=uT#Xv1=3L3)e=cHZGWF(Nox~#wnh;?zXzj8C*|3hy7Oi9_2Bt?1D6wyN-D$qXF-x z`Ex|zV@EJHcsAge7pdzF^uaXl*DTwnQ-3dBA^)^N!mdrxS+RRD zmZ$&xgzPG_Np2(2vlAJ&modfyn%gh9Du`eHfzEc2`}$1o>&FVeK<5cliQ3|B`at+x zBCB+K(e1U+7wLEZx3u;&o`+OW?5E;L zkFu>8jlS9n{SsL+2Kf@uh4<;|-Rcpyz^^cz;>&+KQ>Q$0$p++YG`)U3{hT^AJNb6< zxg8m2$MD%9LMNgn^pAk*(U;yn_xN)3EF;I{6_cMm0>G_5QU0#|^ z|7DH|Xp=wo0{%p32RJ6Z#k%ihg}9jdwF6s>J_z+q<71= z7HNjb&Mq_h$nTTaMa==`*WyZ^_fa=?2F1ax_q34dOUV-BOg z{hY*e8q%|qDjxruXK2((+sirosxp0$^{Smu5K9<4wD+_d=p(I_evt5~ZxD_-dL?q{ z=?%QIFhTx@kZVSEC~DFy%3YSd;qi>+kD1F8BWc|JC-2u4=UHbp-r=II?L53_+J|g- zf&Lm$DfFL*xOXEv1JLMB;u_`B4w=JsJ>qibt zPx3xgdDd1XV!R6(`vKXJH+HW4Z?reIH@#y1Tom{lR=S@(NXErZ!Ukk^>&*h`u|?=g zJ>^=C`Kd6n(@y_WYWXw!+z%_X8HNvNB=c8s>Y>OG>YTY?UMap4L{{0!DCg8>j@nOs z(wDn_&U?(+%vbc=iX*u<&`xgJ!PsbBnYy7LTtIz1${7BAFnSMi$c~w9NLxM3T$Nn~ zeR(Tmj`kcxm^UXd&ZxtmyGHI|H1c>N_ulv~l`hV|@7kd?bx>|QIoD_a{n5^0G#Y~b zR2UsWrp}gnv6l!H!U{^Aqgwgf!|T37KFg zDBR5dE%cegQ+fWwnXe$4+q{(t8G9OUkru};yE=LlX9l~hD&=~Kj(-^y@#9up~_lW6p<*yY#=}pE0eIOt^^ev!U z{5r97cmG=hL?!3=b$=cGYb9eGxf7=UZ-9ud(gOW?X{1*EzX761UD(wL4GbXec`?5 z`F8zmp6&e3_t9WLFQRi7Mx%e@n|k(I01jO2W&f=v zXjGXwBn>%mBI-r?uVb#ynuu(#fV}Uf^e5Gi#F*rd@raA({W%ty86S4h^)~9uXlpF; zvod;R2j1Um$v0vp*dHyvJ^NjgzbZY*0 zwBdcEMv;3~>O5yL85yEn?)hix{lB5O+N`mY6lce$ifQMcw)pJBKor!Iwo__cg$No+D6hmQTV`pcp2UkMPDn7F6w){yPaTTbodFL zC9G!t|CMJwvw23_miNBKIxqKg`U~tmq34eC^`dG;B7Q^txiI2_d}cmbe?Gc?=SZF{ znL`fwbHfwN!(r;5$n)9fm^&KFHDMn5Ec0rZ?38jNJNIob`ekXxKz;huI_9%x%zbyG zhvuSVC9<|%g|5<@`S0USoX1-o9fbZ~mu35y zYhOXvKv%EJ{BP#k&Gh;`lxGNit08k&D*Okm7cXTFs?OScCi?<2@w3CqUZNlE&^G(3E*J*?mA zvOk6F`9ALW_*0P&VX_0?jP_O&zVIdMHOBNl+T7@N z=*_B;JO*5genY)2nZ-UIbv%TAc1=bs?|ik0S?1^S(-Fbfw#o|9|lumi`pbu^PeEe}>s7 zsV_U4X4-nC^E9&5=+~1~kb?gG`#ba91ay9*&*(qxcl_<;+2JcEqI0RUS3W7|+kvt1 zuWBcbV@F@Mq(1~?=UExW(!YApKaB44<;<)8IGETIy_x=M2YbAbt}xNRgGwHs=iYXV zN%Cq?h4=EJ<_wEp1Q}pt$6OkfLstF5TDJyqK10Twh?aHX+cRWmH2se33us2sg7N3| zDac#6@9yC{YR2wY@3LO^$Dz63br#?FFSRT5|I@f*HOzil^W#4K(ny+DFn0_@ z=JkJ-vR8<>E41g;8dT7&5BhY?iCAmzi_G%JWDwSH8?x-`&sm537ICfFjeQ&X^6(Gk zw&sI~U-;@X=95nJsc-3nb7~aKHwb5E5arKd&lS1#?EA{xAe)2f>0;NZ$o{|PMbLt8wvkp z?a1{TjFo-lf6=4tMNo!s`b7NFLUm`Zxkn>@C%Sr&wdh4T$Yf;0*aU^TlzIGQ^dK@l zOjFzOE$)R8x4*defQ}-E%Ay;Fsli#|x-c(I{#V#X*B`UK{(cVn#tilXD)Y_|^6yRh zza667i23m#{nHNPuwzE*_KU>7^C$KKLi1JKBO$Yx$iHi!*^-3$Nautt4<{S8-ECL687->ZsJ<>jrMZ0bL5O( zNEF)d<6KY5V9&>wxuvR74z6$citnVD=j>F&zGKkKvLbm!Vxucl9;0WF%XR{r(ZZIj zIg$T`k)06v*c9}+>hiyiF;}S#^918)ZSP2o2dL-Oub|6h^Um)H#?!sj;n@jF$4*S& zSVHkD6=QwJ^%=;O2~mAAl7p^lrBap$n8)~UOSwmVO8-jYJLwD9XQfZiV%&7x#k%ka za+kUI)U?QbeT2MSh}$W{*rUYX=;BkUEBZk|xB2}o;0r@LU@=USLNc!=dQeg3?j@H+ z@(sdXxHY(nV5g8AG1prvMEruQ(;BcZa5?%gbso?{?$r+e%)5{NH#Kk-zSo;|1AU@? z9{M+9b5b|tKKGv5U;byr6%22j9p)ZT&my|Avq=l1dB3oBMW?khdD}6k&+_|sKjO8U z%pM{AB}{f^-n1#lrxi~hZHhdzgQ>!_vV-{Lw9Vb0=_pY z{a%v&%TW7w=oI5UNZZGZXFf@$&wa^WM1AJl(EiNOiu6Oq?~BAWdZ|Uhw5MH-oNgX* zJDqjhcieZa3A{h`q)HLjBjRr-{mr?Ha#O~d^iey{ZzXb~#~G9Xx%3?}^FN_J$RMNZ z`v~oK(E*-OQC_3k@#v}V^UqvjG?=vSXP>1o8vAZR*MHHM?qWQyU_4cR5E}D+#lcBgV}pRCoS*ys~~(n^3iC& zKR=fLL;NDYej82@e`vNa_-#vFN7K)Y5u^J^;{nQUWaoMtH5@EF(QlWRdA8xpUkkI@ zPs^@9h^i}dGdh366U%rWbS`^%734d#9M1*(^0cXiUg(db7w=;{&^~s^ucO(5eBv6lNfD;`{YG5D z-{|3;_enwj!nn0fBCco6#?}-4JDQ&N_YY#OmXDp=Gl9MtrbhJFFfI6)cNw_%YNy0_ z_jYD~G%f6_>zuyq0TgmS%bH=Qm%eLMu9?D~=r=30o|rW?(td4T=lfh_%!M0|kGX+1 zY&#ygb3N}^tmoN3I_c_I_J(ffy)9o(93P8!6}HOtyfTIP%5B|l;W=e^22=(85V`t( zy4-S*i)S)6;+Zq+M~&ra+;bxJd)nMc+6!u7_HwpzBIF^F)y6SeqIZ7(H!n+H>+$@Oi+HBz%k<-Y*>gbmnl+2H zM|`9`Zu}YBD5cQzsn72zx1D~wnK8KdMWrz67V4y(u1A31j^+8urHcO|_g(u+`t4xk z{%D?EPLTVVet3&D6dkA%`pMhK65&`P@0XpEE)_ zN%c+i17upokI{R4ed3os+z)asOdA=ecAE9;Kk@AJarxB9My5YW**1qmGOv7DkPo<; zC4wvA57hnchZqn4qJEf9iZe&l9in`58x_nyh*>R0?wjc^i)RL|$K!xIk9RYd`w}DR z)`)7)@zh^5HBE|kVLe}$_4tm6`(6J=E?;^?Vc+-Vz>gzUhEB|JQ<-NsHDuoG8cFZm zfsrzr>)s|jCR#|jboowJX63H7@pQDggA`sJ)Q=vT=4PO*FwkL(Xq`om!^ay>s(_ggEWC$?gr z^m5kOQR!QZ3Agc1SY@+?%pN*>E?s&T%p*v(9AoDX_Bb;3BImB*`v|{}uR|uR>luWK z;47iE&{pD&Law%`7V)>MJWxYLAmkJsA-ThMJI=Fgg3GY-PkDj7W z3}lQv?)TBa|9bjKnCuYyfHs{UxenY4!}|UlWPb6!ZXbj@+&8%5Suyt$8yDf*-h;iq zZz6m@>hTZcMF#rA{-bjLv5+y?iZ;Hryvnwmd2ejye^$;Qr)jKb?xGJEeMDS4F1Loi zm$2bOo+BV*>=@mb&tR{GdmF%iFaCR{@ci&~o^hPQ`>*gl*&BLrBJ1_gJzAPi6L0is zcE!9$`^M2{jjEw5866zuz)Qbf82t9#7F@A+Nn6chP4*-DLP^#uXZz#VLJVlAa2fBg z?i)|p+lqgMvIKNTF1m#u=k1O>XXZXPGai3NH`)9dd!eVJi!eVwIE#KrJ~1D#{`p<8 zzxV56=}W9NJJTjP=#PXMg-&s0Y11>1=j2@&aXyGwWx9NhFviNh$k^zF4NK%(ovP@g z%xQly=QZ!dJ3h2?n0_nAoac|Bz5rTjY21<;>6A zUu$2d2!~%eG|cJx+l=GgzM$@h{(8LoiCpZo^U>%Rnca|$tRsKDfc>2eo&mPx{ZR7! zB3Ch=sLV5hNytsw*XV8fn^BE79C&jF3+;Dqe&qVRYOELNv#YxBZXNyg+EXKa*+TXI zE)sUq5^Njp5kKpkNVv;?lG_un3hOgJe%%YYDI}k* zHPY2rl>!&;`)OUzW1I)HiZp*8A?{bocelSsmUsxgnEtnYK@gI5E?Y3Kd$SAj`RIr9 zi=#8H;ydVC>?f8J--I-T|M;V>tA>tY(Gw#Av zlzGOEN8jh~ZJXb#M)?MDdSl5hA{PL#=Zcu`Xa{JzoV`}E#?Om2Jl*~B4H`QDUQeW!J z=s(3dF|I+r?X9Fk#5LBBQW?++pS16uQ9aK-v>BziLW6h>8;Zv%RU`ulhE z3wrLfxPqakcNO0#G**KU&(GmKz(wrw6{3qyE~!wDv<^Z?up#Zf_v}d70-qyka%)VT zZSduW`TbOZe$8INxYlbbStMogco5#6Qv1=KJW+^X1#S9`>L3pTNJ- z245bI>wugrj@;eNS`GQN?_PzE{+-1bpA(W1OOb6x*U_(5B5&8W;S+43FizK!);PaCE!esAzgzNnzIzFC6Z2DwKW{B0 z-9J7nm{9xaypx7p3e!zR!d&F~Lh9e>EZRGuCdkH^@^T-GY$(B6!Dw7l#^P}L-)`)f zQkNCJlzaI1AaxQ=pZMe3+@JL4mlW>r`n!2Ihq3t-`pQD|(+_?56T`Rd)ne(SHN_ zW;HU7dE;f;`^yg~ciq6JAU3PTHz&ydL&FufO9R#LN@HJBB%)iIk1-PmZT;DBIFH%puL$ z=k{e=&kUs(gv><0Gpb5>qn-4FXev$rZOr`90z98IThlgSx&c}88FD9}%Tsus%=jDb z_n$@V)sJBB&}b}u`&0DtA;`IotGMP~YcOUO+!4f%VEd;d*LHQ!$E-neB6&YLO8yPU zGXJHbYtjz`x_wb_#TubLGNKgk8;*?(3VyqRJ`;+~(_Hf4D zuT6ONI$QpG-Uw2O;Jq^nmgSta5kI?X6w;GQGImc!qmU;t$dMG}krjCX^0l2h2h^#my^Z`?)47z(14!IN9X({;E>tfBiDsp z%|*`4Bz~LPygx`iH4T;XEcT`X+K=oA=tfMjl;QTCVT;W8f0{&6OpNk8>4!Bc)0zZ2Q;9Gisd>PJ8Q?2v;AOQ~wOgQk{2B zaqq=Eb}RcPO>U-t`LZ#E{uI#qMSQ20EN(FOy*4VJ#N*S3^r^yTF`$k%IvFmBkvZr29r8JEKoH{J<2HoPX9HurFY2?dp|9R>1#>vM=|S#g zG2?s>^ZLBG=xEemZa2QaWX{_#kNE-YOPe1J&6DBWn*D~}bb6?OzGr>rto;YjlOC4C zF4hcpkyb`i&ZT5N>UV_qw05!oj9y`s=+DcqF)udp^_s3#c-Hum{KLOr`8tWY^;pkb zP5!@CVjYmAa(tf{4qfoNS*-YhgA2M>MYhH-xG-YMy~&^P;ax&HwwDI z;aBAz{BB``ik7Z$5%T*URRB9ZIm z^CQ>ctFrW6qYD1I>sfTQXeu2g+ZMAXj;1wZu*Jq4G3iG6{C*m9Wv_yv9{z>r;WG-> ziG?`q-=AH7(-7NUm)RBVL|^_38Tilz=m*HZJvG@AqWz4P-6FgM89ee4^vvey7)9k4 z{{5ISI2au?Olw(hgsEz6-tVA~8@=t%|91TX_d@IYaX7KM%uI#NAjg;qe`i4=LpLrI5{JX0I>pXP3fVP}Ty|$wt z_QW>bfQY;KZ$PdYy*&;cx)smhiCexa?to__w>FCQJ)U3s zWyGy|sBUj~kG-g3*lNBr;%`@VM^P8ec*lzK)TnVcb^_1YXq$gW!){WD%JhAs7L2DU zv|;C&JkO#H3ZvS?(HW*NHx5Dnr60XokG{4Uy=;O)Pe-?jroGJn+w$c4Fy*@WhUgID zf1h>hQA-g2P2UmB{H?y~) z7dDVfMbfUYJ@6G)W?Y?&N)z`z?r{|I%c%Kk)(oY150$ntTH)85T_?^~n7`Tj?sa=nrHtyP;y*i(snBX!k~zVREn`z>WY(0y;l`cG=9)>)n4R@T1p6#d6 z44fZ{;(byM9i1^`G!6M%w*+?d(eZi>4Fw8izJCIBj*hbv8DGz1k8eWAlgoRM-_dk- zan=o^S$Fxm$|oZg;{Hv-!3U#b6wX&a#yi`mq6d=i-cQg0Yb)GR=DEg;nZrYMVLlsQ zEj%4_U4?Eqt60Rp{!@|boSu>ES<`qYhjiXRXIu1t+B@&)EQ;^p@60?zy7XQ`?}QSh zLm<=;I-yHQBScalg`(0F5fueQrE91nU;|W86c7|px`Kj&fYMPB#Dbu|&oI00lP5vK z_q_kS=Wq|%JAJ3zHg{$pki{DQuFV+~G9>9TK7)45C+~k1yQvxRCVyfBKxa2t%dBAA z5$*FZIadN%pUIr1war{|2J=<)CDy}he-nqDehL10uaRjxM_+zphrVcNSiz(%qK<|s z%3%F`;YaRYz^A#Uv!7*M+mttX)k)uH>jRy#i!wdYkzcW1LCZ}U{S1Nrn^xkRAZ&?8 z(P0`o6=u&_op!x=OsB`#eEiw_*hx$AM>5_Gi8{x?$g!N|7j$ASeg_#p8rqx|${pB6 zZn_ilYiB~gKsyKE`N$9_hwoyc^E%MQUb~E&lR0#)Dc>xzX4CL#4JySqxh=4BdSx!> zozlFPyOwR3gMvf38^$}kMdH)=p5J9a1`PU=vo7fS+a_+!((p<-Th2PEXOIVPHFLYShiLv&Nn(!>rBCs0=hMM?_=PBn!?@o<j$vAN0|5_WX#or?0Fh<*BQCC2END& zLU(7CYSP9aAG+JRw-)QBAuqOthIhKLFH0lN{05@e90V!`})}%gM z$h6bCC*S*2#D|>Zmae^*^O7e`+@G)mFAu=RhhJ|8)%UwOEzu9_;dKW#!gCvtpQDSS zFR?)yzljWDt@^@m4jk~JhjeUV2ilJ2E&=s4{87u`te(lVKWUH2*-0G-7S!fU06S$> zGi){Hz=7wP&jW`|Y$WorYcjHozO6ytc|%AIH}*|#WVXEza8fT}KWHd48Qo~pw~j9g zaK{jZec=tEL)g=<^-eM2$AXcC=%}yqXUv=Yw~61!SbEGuE-uFR?ZwYd=`uF$hMmG^ zge~8LdCd7I<*^gGKY`x}T^Ab7H`&DV9_K8yH2d3f$a7>w6?kkLb5f)}=W#RG=b$&H zvOepf&28|}DQv8>LwPS{tG+k znvs#u2O^6uS+}604^QdDKJ2Fk)#dy$2WR*1@-0&eV;F&LIGa6oBlrLv{i!|IrWNSX zmXqaALSMf)sib@DnbYC_%k=5LU>fpE!#DUIH8i@x9`%0CAn40~!K>BqTk=}zgw4G zKiAX;< zw%6OfXWFT=lyf?4<>K)F=Y65+h3rZ1p%n=f_w(}ObCLo`^8(NXU(Mh&&r;I~8%522408N+Dk z_&xYv!*J3bC0|28J^YC6nD1Qd z3oz$fID3Tu2N1r2T+Y*vJCIA@J8ba%@b%at*e3Mx+E8=_vT7}T+~AKMpudNv;16$L z+W(WflaYmO;Jx90W6wWi(#J9%4pd9zZiAORyhMCHbp29CQ?|h}rzHB~Va{Ej)b|DO zig>YYZ1dDYSB^Ol?3ZpeuK^xc7~Z#f~pze|Q!hCsiI`L+n2)^N3-!EM;j zmVgh=u0{{T6M+TcH{MYY8o3>;XPq6G%Kkya%kbooBj~yd$m;#H_XoNg9%&tq9zo~6 z1OG4m$JF|?v%%ia057^qdD_jH^Pn5{4jqBVr%hykhKz9_xHYstDPLRLOfpWorZj{I42 z_oNl}4z$@1x_PxczF_DkrJbq!Oju{F+*1bY=KxxE9jRJ$gx2W;2Qxy6NP=<&=fDrctfXipONzE?K!W^!~UDKx=P=o;DK+U*EG9q z1?cHu154iy=OZ_tD6Sd=kc$1aUA{Y!fUUrRBQe>}-8m$2In>(J{JGsYiZ zk}>YYTCo2)^BD79)=8m#TbK2zY|@rPgATlioYF9NG)$Em7ha>Q! z17%A%A@nx3iZ^VkYGS*QcbnnGsnpfbKi=S(VFq8!X>eim+}3j3L#=`A-EZnvdysn^ zKJqPh2=}$%0S(m|+Y8vd&+g#7XdHK>hI1zJ0)B%KY*u)qtqp-09% z?^yZE>&y3eFPM_5DMawZf?2#FXJ1D0?2K+hf=1U$U2}!yaf)ZTw0lGry}6Jm3v|hqz^id+}vRq?_)P-%uC7 zZ6`N9%;qbdFKzm6-Pp~a)2Z4^;U@=*`IwE>lPSe z%6LCVp~v4vUTGMG{s~BO$7WK^b6FM6k6Lox-U8do!`T<*WR{_3x5ni_uTNrMvDB1to-NXlAM{bfXV_3FwqLAIQ@0;SA7?D=Ti-@!?g)hz z(V;tzad-b2d@JmaU#9HtCrum9vq1q9DpSZwvE#PhD&iw2GL|y2O)qheI)OcYfQb)R z_`i^&p^cb}2)BPd8TYS#ZVOwWu_=t@%0+C67rB4=EN3pPe=4-Pj5#bGj{TFDKjyR? z@*;#bKY@*`+ebKbYfmF+HVqq+~LntnS1KUtYzPEe;OQ0TFGF1_2>{^INaN$6dLQk^B-jD zamKc;J9}*EZ$U3RaCM6l%8a9jGB=B{BUA8^Kj-Ej^^zMpwR{$Q6TG-SZ%2y`i+NS6)XK=UU^PW5PARN0tp>kI1<4jWBh)GbRUScVk>d z+_+93@GCw#f6idapr4DgUhv&2?A>3W1r2jb8LXcTn5*jh*c0{5*oMwaD6XH#Io{#G zeE2OZsATh?&ihoE5+fcpcsqP^DW?hRXA|~!3-r8>a@*ZUoqCKbkiV8Kp<(*0VN;mF zw|f?|`>6AKb~L4Gj4^l#dO3PAvJ2b$i{DI|eh&HpTaNYm75nb3&+tnOWDkd|nZR6l z!`UyqV_sooMksQtVsHMR*1Y&C!0p+)C$L6}{zT;Bd)mwR$uF5Y1F9nfTVt2myifs~ z!w=g0x|tdOt6sc52KhDBOU^~s=B`RK_tR~iF}E~6l%mo(wqJ=^5xPRV}gi*m&lWG+<%d7Ntw`!D+F z3pd!$Rz~;U4ldW@oAjIb+3c~8xA#0_?KS=9EzUa9`TZHzQp3m4)8F^=9Vc`6A~t}B^G$_$3o+A%;oYfq)~P@x-&Pl7+#sZH#*Z74wf@% z&r-H0f4@UJJNqN2J8)i%j`m=yd&7t5KT*I<83w?rhaJ`T3?9yve37r)58Q zdk%W<5^_EXe$!AI`u_?!SN|F0OJnp^RlaqdWAgN~MGaxa=XU4BgFJQMOLWiE^x+UX z_Q*q~%yM+#_is2QIM134-8XgP=fb#m;xnf!3%dDBy~2L|-SqT!@EkH_=>hioS?El+ zB=$Pb*nv4Y{WZRlJ^17YVE+zA4pFWiJkli|{n1lc zZ~lplX;1o0Yzz2g4Yu2P(!{g>VEe9i~Gzj{w!Jj^-&cH^O+yP-c>qx)J`@*4} zuU;@^^z-vVZd*yvURF@AC;rxn*e7B52U@TXh@kJRRYBHnJZ)Dh1oPc1|3ltdhPoy_cM9_g6BC)qs<0G+54coM!$w0 zLk5kjZrZ;O`f1}sYdU8OHdTuVWIg@59c;y3*eXdC*Y1Y{t20##nkZchjoCM;hkX{WP(xpQ-3?4dF#OpDe-o6SVa?GUN*{S-!0Y zJTMx4kA%0=*v z5InTMDf+LqDX|J2;R|PHxG8>iTW=g@9k5;g3#P+w8rCDTeWB@C?p-o&Z}{>*)?kf2 zcPrUP)jH{23tisi8)^jq_`*?qFAhArAKit_-dhFTG?L#=Kn`@T zk31;M*<}zmKq2gb6HaM^_xCgPzbl5{j=G<~f7kY8ETdyZk#C*5XHM5C4>6}2e&~-b zsHN`};d@NOm&xB>tkdlvPmr7U{0aQD?0<^Y!hWaUL+Hy!a0s?p2>o9Dc;;3@`mmqf z#hpGos~Th7b~SUk&98FCj4b-J0{eLEoOFMDbMXK2<(zTaynd#QTkjfc<-jk<(?}nE zkccdDVC6w4gdLO)ZQPyDQPTS;4v{8Pg*Rb0-lVbs*K2Y4woXGmynWqxk&^XgVuc zxGJku>?ZnjfH`fG+vJ~PZN7(&y0J&{hO5xskDEBNt6@^7HZ!7?XFCIg3SiYKV=-UR`a%RS#feKttWV^tjIXERuU~j58pDyCR8h`){IC_CO;V z9!zl46}rcRY+0MYS=2x`y&Zh8YcKi`8Qqq8tqNfiv4#$$qc1Djv=aZAlj`D7?A1=B zH}vX*o0~Z_<>}06g{JWPwM*Reut%6T=Di?&YsVhOfg;$U4veMG8gfm<)`V6!BCEf& z^}xJu*@GY#S7Q(4EPx$d&9t%qYg1<#eGQ0q+Z~UeAQ2vnXAb=RP5L{>Oxcg}x#diX zd8WXx8ctw$oGF^Q%)wxj?>vKT8QC%vzy6a>YDPREuW6?X^6oq|{?T;yGthPrW7}x+ z%wLc4&f)9>QYiB?zPeKx+whHT$DRl%!1-=tY{E9wh0lwX!54;Y5$VMUJVPGuO8@->ObH=heo1`bH9pqs@dzab`o+8ULOa~ zy<8q&=6HOh?C)ahve!gjYj`G$c{4fq3!gKg2ioHEV(+72F*LNCK0T6%|AP1331YC7 zN><=5c6i2;la6PMFJVm==HmZHh6mcFaOY|$yw5)CPSB&JDe*q`%u`jM3HUF6Nq+ZF zA}{G{I&x3LNn}Y=)@3`g=Mp+AD_Dpwzxg3|f9l|$fHn^x=L-}@NA!nwktIL#cd`x` znX_R%bJ2zUaZSD_M|Vr~#{gu`&3W9h`IT>{He-)a_S?$Xu#9K>H~5Ts|I+#RDB$tO z(PO{OW_`-zJ7Vmi$iEf$32Sweta_F)Z8q}c96mt@ew^uq(CNL{htrNP)I$brW$p7N zp+m79E$VX^x1@*2o zo-+;5f&4v3+g%@G{=96pnBnYQ;`slBc#mXm&gH<4zr*+%!K*vbP1}3BWB7-;)v)L( zYcK_=yruY1XJ4x-ZPF zzmxaANBPqi+%mTdRlCp42^`Bga#Ob*Cua`rR~qc5&o1ZWKm!}m?a=SRy4;bDg1&6o z^nOIMM{OPP^Q}$q8A7fv@JBBItM>W~Q@^>AZp-BS1Ecj<7V|)WX z%*B|pg4qk))C0(_`{AD-D!XYq)D%CJ1Few>eR-#b#`m+P@QgQ%yJBK>c)vGPLGCzk zWRVF?K4kFe4-Eb%AN#q6_&B`Q-KjGy&tN*-Hv{98>q= z!?NG)l>3A6t4O{zKZ+hqbyE5NQLqCXxQ0E^7v1+|GXA4j&c1J8_ur51K=#Z_gZ7bW z>w4g0?Pcn8hsPGCJGJ>w7+6GS^{=_Z!Nxb_`of=DD^C0K`>cej} z)5blx%Ne*QSndgydx8Z=$A1Wxy$F`bl&FA|t=n4gHa@TlPtsdb~W zIX&@7Q4#TX9EF+tQQ;}WBa&mHeTw%;PKr&ANbv6v$6yAxiy7TJH7zi}*!JWGW zhlaIlKR6;KB_=ub?&~E)qz=FPS}Cc#{(q_#ksSNK)MKswr+U$u$t@d`nHrZ6bN9WB zN*y=yf2bB8mk^hFXEHYgl9HA@EFvmqSbRimcB@3*HADaZ#s6kvB4fg1B7D~Db`p-V zhKZB!wt_E%{r4MUV-oM`1+hul78GU(2}z@U3GTmpG$tluWH!6R3?)RwWp@CSj!qcW zF#B!a5~11CFnX;Ld`05z#(AqFi80w-D7ulHT}Fya9G%VarHsq&ydi$0eC6+d3{B5N z_Vf<(a2I;HZr#EBON$$v5R;e|9WyMOwlPWNU@>ODanwn2 zwo9kPq@=_pC1$_;$cQm_QCf3z_9r}LTnbipeD*7(Vu+$8vP-phAuVFVQT$tps* zLSVfk#)W6mJ&RZ0`kmya;E6;kgLR_~Kr?B_ahVddTJT3#EbYd_y=|4jkE>mCA+%c< zT#5P>!NuqwE^BKUFQ^CZNjfe-s|)3|+gvaRJwa_5Upw$d-uD35;(V$TXom?}qp7dQ zIF~<)-ui!_Yk?2aPHC`ymmb4l>V<&A8D|Y}0P)V?v6L$b?nt4!;K}q;&(ROOzb&{f z@5P17Z%^RM1wTdon&5imw*rr2u+6~dDAyP~g!IBxoEc<_;u!?3V0dwr(Lm6(@rC>zW-1Z{0!{{f%Wf`bp=lccL6t|es%B_ z7NG)oIqjALYbfPc+OMo%IluCL{(cqwD*9FOtL)cf%GB};<;miRsrf= zCch?qwn#6?#1;VSqk!t*T+Bri@Eg3p6Ic^wfAB`;YB)HMF^mO2%b2Et^V9B5+RIHl zbBTwMe&TeXHMJsVlV=0184%oD@|#d^C0HMgZUC=jPJ5gQwBDi{m#G&=+@im87=Hn9 zYu45utQo5w_zdsw1g^@Q_Xq27370WX73(Vd};Bd|7icIaGf_eOdbbY2&0D8$&6>)Js@YcP>>R=6>z(tWr#jT-!5q^<=QGRn&WmQF0Rn=5= zRYTQOwN!0YN7YpUs-CK^8mNXUP&HBysK%;^YO0#4=BkBisamPlDoC|aZB?*pr`oFy zs-xLE2k#j6CBsFKu3HA*F`6qTyd)MzzEjaB2+!|DI=REyNh>J_y_Emh0Za!U0)6Uc0)4|ix)7cZ^ z>Ea3XboF%ebocb|^z`)d^!D`egn9aU`g!_$26zT~26+a1p34#LcU9(Ac~oANPvuwl zs{*Q^Dx?alBC4n=ri!Z)s-!BVN~_XKj+Nu&!*Y%MQ(l*! z$s~d02iWzm{|5JUL%3kPGD^xkN6N)8td~Y59ztE}xap z$r*B{ydiJOzvVyj5jjV`C|{B}Rk~a(Ka!i}7CBWuDKE=kzso=55qVU8 zBbUou%2F@OSL7%1Q@KO#l-uRwa*BLHeqe2~KD0ivHd|Y)t=7lZHfy`}iS;SEXs5Ny z`po*=+HLKz_Hv(hzqLyWC6!Vhl|%Wd`}o<9gVq<;m)0Tcu=SPowROZgYJFpUYaO$W zTi;nHtdmHA@A+lc)7Ba5taZ*hZ(Xo1T9>RJt)Hx)t;_uXDp#zl*00tz>o@CnZn^zw zUAO+SZdf<1zqRckgy4n3BXS5oj_7lWTq3u~Bl3#;{Kr)VL_twV6c$B9QBho!;1lpt zqO>R@%8GKrUsMnkMI}*LR1sB0HBnvE5H&?DQCrjzbwz-vC+dp^qM=wO14Se806$CE zL^Ku6M03$Xv=XgFkZ2>?ieS-Bv=<#jN6|@i79paG2o+sLH_=`66um@m(MN=dzM`M# zF9wK#Vvrat9uz}FxELxT#0nWHqC~Wa5yM2R7%t+(Lt=!87YQO!B#Dt?lt>mSB2}b` z(PE4kE5?b3#UtWTF_KE%CfH)|=5MPQz;;?vCu9UCIRdTibN_;Jjh@;{g@vS%}j*IWa32{=K65op- z#A$IxoE7K9d2vBp6qm%0;wSO5xGa7VSHxBEtGFh96Tgc;#Gm52_)FXnH^txLAFe?N zDW#GgnM3-?`(#d;OXik&WL}w1=9l-&0#@A1OIQftqA>(C&Oq5A- zq#PxaWr|FdX>zn2Bm2lO*;n?H{pA2TP!5uV<%4pF43|S?gp8C?GFrySVKNrobr0^% gz`Yr`Hv{)(;NA?}n}K^XaBl|g&A`1G$leV6A79$rzW@LL literal 0 HcmV?d00001 diff --git a/quake3/source/code/game/Debug_TA/game.pch b/quake3/source/code/game/Debug_TA/game.pch new file mode 100644 index 0000000000000000000000000000000000000000..07c80c8e3dc40eb41b0876ff620713c125d98b7c GIT binary patch literal 466244 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