1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
|
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
// Portions Copyright (c) Athena Dev Teams
#ifndef _BATTLE_H_
#define _BATTLE_H_
/**
* Declarations
**/
struct map_session_data;
struct mob_data;
struct block_list;
struct weapon_atk;
struct status_change;
struct status_data;
/**
* Defines
**/
#define MIN_HAIR_STYLE battle_config.min_hair_style
#define MAX_HAIR_STYLE battle_config.max_hair_style
#define MIN_HAIR_COLOR battle_config.min_hair_color
#define MAX_HAIR_COLOR battle_config.max_hair_color
#define MIN_CLOTH_COLOR battle_config.min_cloth_color
#define MAX_CLOTH_COLOR battle_config.max_cloth_color
#define is_boss(bl) (status_get_mode(bl)&MD_BOSS) // Can refine later [Aru]
/**
* Enumerations
**/
enum { // Flag of the final calculation
BF_WEAPON = 0x0001,
BF_MAGIC = 0x0002,
BF_MISC = 0x0004,
BF_SHORT = 0x0010,
BF_LONG = 0x0040,
BF_SKILL = 0x0100,
BF_NORMAL = 0x0200,
BF_WEAPONMASK=0x000f,
BF_RANGEMASK= 0x00f0,
BF_SKILLMASK= 0x0f00,
};
// state of a single attack attempt; used in flee/def penalty calculations when mobbed
typedef enum damage_lv {
ATK_NONE, // not an attack
ATK_LUCKY, // attack was lucky-dodged
ATK_FLEE, // attack was dodged
ATK_MISS, // attack missed because of element/race modifier.
ATK_BLOCK, // attack was blocked by some skills.
ATK_DEF // attack connected
} damage_lv;
enum e_battle_check_target { //New definitions [Skotlex]
BCT_NOONE = 0x000000,
BCT_SELF = 0x010000,
BCT_ENEMY = 0x020000,
BCT_PARTY = 0x040000,
BCT_GUILD = 0x080000,
BCT_NEUTRAL = 0x100000,
BCT_SAMEGUILD = 0x200000, // No Guild Allies
BCT_NOGUILD = 0x170000, // This should be (~BCT_GUILD&BCT_ALL)
BCT_NOPARTY = 0x1b0000, // This should be (~BCT_PARTY&BCT_ALL)
BCT_NOENEMY = 0x1d0000, // This should be (~BCT_ENEMY&BCT_ALL)
BCT_ALL = 0x1f0000, // Sum of BCT_NOONE to BCT_NEUTRAL
};
/**
* Structures
**/
// dammage structure
struct Damage {
int damage,damage2; //right, left dmg
int type,div_; //chk clif_damage for type @TODO add an enum ? ; nb of hit
int amotion,dmotion;
int blewcount; //nb of knockback
int flag; //chk BF_* flag, (enum below)
enum damage_lv dmg_lv; //ATK_LUCKY,ATK_FLEE,ATK_DEF
};
struct Battle_Config {
int warp_point_debug;
int enable_critical;
int mob_critical_rate;
int critical_rate;
int enable_baseatk;
int enable_perfect_flee;
int cast_rate, delay_rate;
int delay_dependon_dex, delay_dependon_agi;
int sdelay_attack_enable;
int left_cardfix_to_right;
int skill_add_range;
int skill_out_range_consume;
int skill_amotion_leniency;
int skillrange_by_distance; //[Skotlex]
int use_weapon_skill_range; //[Skotlex]
int pc_damage_delay_rate;
int defnotenemy;
int vs_traps_bctall;
int traps_setting;
int summon_flora; //[Skotlex]
int clear_unit_ondeath; //[Skotlex]
int clear_unit_onwarp; //[Skotlex]
int random_monster_checklv;
int attr_recover;
int item_auto_get;
int flooritem_lifetime;
int item_first_get_time;
int item_second_get_time;
int item_third_get_time;
int mvp_item_first_get_time;
int mvp_item_second_get_time;
int mvp_item_third_get_time;
int base_exp_rate,job_exp_rate;
int drop_rate0item;
int death_penalty_type;
int death_penalty_base,death_penalty_job;
int pvp_exp; // [MouseJstr]
int gtb_sc_immunity;
int zeny_penalty;
int restart_hp_rate;
int restart_sp_rate;
int mvp_exp_rate;
int mvp_hp_rate;
int monster_hp_rate;
int monster_max_aspd;
int view_range_rate;
int chase_range_rate;
int atc_spawn_quantity_limit;
int atc_slave_clone_limit;
int partial_name_scan;
int skillfree;
int skillup_limit;
int wp_rate;
int pp_rate;
int monster_active_enable;
int monster_damage_delay_rate;
int monster_loot_type;
int mob_skill_rate; //[Skotlex]
int mob_skill_delay; //[Skotlex]
int mob_count_rate;
int no_spawn_on_player; //[Skotlex]
int force_random_spawn; //[Skotlex]
int mob_spawn_delay, plant_spawn_delay, boss_spawn_delay; // [Skotlex]
int slaves_inherit_mode;
int slaves_inherit_speed;
int summons_trigger_autospells;
int pc_walk_delay_rate; //Adjusts can't walk delay after being hit for players. [Skotlex]
int walk_delay_rate; //Adjusts can't walk delay after being hit. [Skotlex]
int multihit_delay; //Adjusts can't walk delay per hit on multi-hitting skills. [Skotlex]
int quest_skill_learn;
int quest_skill_reset;
int basic_skill_check;
int guild_emperium_check;
int guild_exp_limit;
int guild_max_castles;
int guild_skill_relog_delay;
int emergency_call;
int guild_aura;
int pc_invincible_time;
int pet_catch_rate;
int pet_rename;
int pet_friendly_rate;
int pet_hungry_delay_rate;
int pet_hungry_friendly_decrease;
int pet_status_support;
int pet_attack_support;
int pet_damage_support;
int pet_support_min_friendly; //[Skotlex]
int pet_equip_min_friendly;
int pet_support_rate;
int pet_attack_exp_to_master;
int pet_attack_exp_rate;
int pet_lv_rate; //[Skotlex]
int pet_max_stats; //[Skotlex]
int pet_max_atk1; //[Skotlex]
int pet_max_atk2; //[Skotlex]
int pet_no_gvg; //Disables pets in gvg. [Skotlex]
int pet_equip_required;
int skill_min_damage;
int finger_offensive_type;
int heal_exp;
int max_heal_lv;
int max_heal; //Mitternacht
int resurrection_exp;
int shop_exp;
int combo_delay_rate;
int item_check;
int item_use_interval; //[Skotlex]
int cashfood_use_interval;
int wedding_modifydisplay;
int wedding_ignorepalette; //[Skotlex]
int xmas_ignorepalette; // [Valaris]
int summer_ignorepalette; // [Zephyrus]
int hanbok_ignorepalette;
int natural_healhp_interval;
int natural_healsp_interval;
int natural_heal_skill_interval;
int natural_heal_weight_rate;
int arrow_decrement;
int max_aspd;
int max_walk_speed; //Maximum walking speed after buffs [Skotlex]
int max_hp;
int max_sp;
int max_lv, aura_lv;
int max_parameter, max_baby_parameter;
int max_cart_weight;
int skill_log;
int battle_log;
int etc_log;
int save_clothcolor;
int undead_detect_type;
int auto_counter_type;
int min_hitrate; //[Skotlex]
int max_hitrate; //[Skotlex]
int agi_penalty_target;
int agi_penalty_type;
int agi_penalty_count;
int agi_penalty_num;
int vit_penalty_target;
int vit_penalty_type;
int vit_penalty_count;
int vit_penalty_num;
int weapon_defense_type;
int magic_defense_type;
int skill_reiteration;
int skill_nofootset;
int pc_cloak_check_type;
int monster_cloak_check_type;
int estimation_type;
int gvg_flee_penalty;
int mob_changetarget_byskill;
int attack_direction_change;
int land_skill_limit;
int monster_class_change_recover;
int produce_item_name_input;
int display_skill_fail;
int chat_warpportal;
int mob_warp;
int dead_branch_active;
int vending_max_value;
int vending_over_max;
int vending_tax;
int show_steal_in_same_party;
int party_share_type;
int party_hp_mode;
int party_show_share_picker;
int show_picker_item_type;
int attack_attr_none;
int item_rate_mvp, item_rate_common, item_rate_common_boss, item_rate_card, item_rate_card_boss,
item_rate_equip, item_rate_equip_boss, item_rate_heal, item_rate_heal_boss, item_rate_use,
item_rate_use_boss, item_rate_treasure, item_rate_adddrop;
int logarithmic_drops;
int item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^
int item_drop_card_min,item_drop_card_max;
int item_drop_equip_min,item_drop_equip_max;
int item_drop_mvp_min,item_drop_mvp_max; // End Addition
int item_drop_heal_min,item_drop_heal_max; // Added by Valatris
int item_drop_use_min,item_drop_use_max; //End
int item_drop_treasure_min,item_drop_treasure_max; //by [Skotlex]
int item_drop_adddrop_min,item_drop_adddrop_max; //[Skotlex]
int prevent_logout; // Added by RoVeRT
int alchemist_summon_reward; // [Valaris]
int drops_by_luk;
int drops_by_luk2;
int equip_natural_break_rate; //Base Natural break rate for attacks.
int equip_self_break_rate; //Natural & Penalty skills break rate
int equip_skill_break_rate; //Offensive skills break rate
int multi_level_up;
int max_exp_gain_rate; //Max amount of exp bar % you can get in one go.
int pk_mode;
int pk_level_range;
int manner_system; // end additions [Valaris]
int show_mob_info;
int gx_allhit;
int gx_disptype;
int devotion_level_difference;
int player_skill_partner_check;
int invite_request_check;
int skill_removetrap_type;
int disp_experience;
int disp_zeny;
int castle_defense_rate;
int backstab_bow_penalty;
int hp_rate;
int sp_rate;
int bone_drop;
int buyer_name;
int dancing_weaponswitch_fix;
// eAthena additions
int night_at_start; // added by [Yor]
int day_duration; // added by [Yor]
int night_duration; // added by [Yor]
int ban_hack_trade; // added by [Yor]
int min_hair_style; // added by [MouseJstr]
int max_hair_style; // added by [MouseJstr]
int min_hair_color; // added by [MouseJstr]
int max_hair_color; // added by [MouseJstr]
int min_cloth_color; // added by [MouseJstr]
int max_cloth_color; // added by [MouseJstr]
int pet_hair_style; // added by [Skotlex]
int castrate_dex_scale; // added by [MouseJstr]
int area_size; // added by [MouseJstr]
int max_def, over_def_bonus; //added by [Skotlex]
int zeny_from_mobs; // [Valaris]
int mobs_level_up; // [Valaris]
int mobs_level_up_exp_rate; // [Valaris]
int pk_min_level; // [celest]
int skill_steal_max_tries; //max steal skill tries on a mob. if 0, then w/o limit [Lupus]
int finding_ore_rate; // orn
int exp_calc_type;
int exp_bonus_attacker;
int exp_bonus_max_attacker;
int min_skill_delay_limit;
int default_walk_delay;
int no_skill_delay;
int attack_walk_delay;
int require_glory_guild;
int idle_no_share;
int party_update_interval;
int party_even_share_bonus;
int delay_battle_damage;
int hide_woe_damage;
int display_version;
int display_hallucination; // [Skotlex]
int use_statpoint_table; // [Skotlex]
int ignore_items_gender; //[Lupus]
int copyskill_restrict; // [Aru]
int berserk_cancels_buffs; // [Aru]
int mob_ai; //Configures various mob_ai settings to make them smarter or dumber(official). [Skotlex]
int hom_setting; //Configures various homunc settings which make them behave unlike normal characters.. [Skotlex]
int dynamic_mobs; // Dynamic Mobs [Wizputer] - battle.conf flag implemented by [random]
int mob_remove_damaged; // Dynamic Mobs - Remove mobs even if damaged [Wizputer]
int mob_remove_delay; // Dynamic Mobs - delay before removing mobs from a map [Skotlex]
int mob_active_time; //Duration through which mobs execute their Hard AI after players leave their area of sight.
int boss_active_time;
int show_hp_sp_drain, show_hp_sp_gain; //[Skotlex]
int mob_npc_event_type; //Determines on who the npc_event is executed. [Skotlex]
int character_size; // if riders have size=2, and baby class riders size=1 [Lupus]
int rare_drop_announce; // chance <= to show rare drops global announces
int retaliate_to_master; //Whether when a mob is attacked by another mob, it will retaliate versus the mob or the mob's master. [Skotlex]
int duel_allow_pvp; // [LuzZza]
int duel_allow_gvg; // [LuzZza]
int duel_allow_teleport; // [LuzZza]
int duel_autoleave_when_die; // [LuzZza]
int duel_time_interval; // [LuzZza]
int duel_only_on_same_map; // [Toms]
int skip_teleport_lv1_menu; // possibility to disable (skip) Teleport Lv1 menu, that have only two lines `Random` and `Cancel` [LuzZza]
int mob_max_skilllvl;
int allow_skill_without_day; // [Komurka]
int allow_es_magic_pc; // [Skotlex]
int skill_wall_check; // [Skotlex]
int cell_stack_limit; // [Skotlex]
int skill_caster_check; // [Skotlex]
int sc_castcancel; // [Skotlex]
int pc_sc_def_rate; // [Skotlex]
int mob_sc_def_rate;
int pc_max_sc_def;
int mob_max_sc_def;
int sg_angel_skill_ratio;
int sg_miracle_skill_ratio;
int sg_miracle_skill_duration;
int autospell_stacking; //Enables autospell cards to stack. [Skotlex]
int override_mob_names; //Enables overriding spawn mob names with the mob_db names. [Skotlex]
int min_chat_delay; //Minimum time between client messages. [Skotlex]
int friend_auto_add; //When accepting friends, both get friended. [Skotlex]
int hvan_explosion_intimate; // fix [albator]
int hom_rename;
int homunculus_show_growth ; //[orn]
int homunculus_friendly_rate;
int quest_exp_rate;
int autotrade_mapflag;
int at_timeout;
int homunculus_autoloot;
int idle_no_autoloot;
int max_guild_alliance;
int ksprotection;
int auction_feeperhour;
int auction_maximumprice;
int homunculus_auto_vapor; //Keep Homunculus from Vaporizing when master dies. [L0ne_W0lf]
int display_status_timers; //Show or hide skill buff/delay timers in recent clients [Sara]
int skill_add_heal_rate; //skills that bHealPower has effect on [Inkfish]
int eq_single_target_reflectable;
int invincible_nodamage;
int mob_slave_keep_target;
int autospell_check_range; //Enable range check for autospell bonus. [L0ne_W0lf]
int client_reshuffle_dice; // Reshuffle /dice
int client_sort_storage;
int feature_buying_store;
int feature_search_stores;
int searchstore_querydelay;
int searchstore_maxresults;
int display_party_name;
int cashshop_show_points;
int mail_show_status;
int client_limit_unit_lv;
int hom_max_level;
int hom_S_max_level;
// [BattleGround Settings]
int bg_update_interval;
int bg_flee_penalty;
// rAthena
int max_third_parameter;
int max_baby_third_parameter;
int atcommand_max_stat_bypass;
int max_third_aspd;
int vcast_stat_scale;
int mvp_tomb_enabled;
int atcommand_suggestions_enabled;
int min_npc_vendchat_distance;
int atcommand_mobinfo_type;
int mob_size_influence; // Enable modifications on earned experience, drop rates and monster status depending on monster size. [mkbu95]
/** Hercules **/
int skill_trap_type;
int item_restricted_consumption_type;
int max_walk_path;
int item_enabled_npc;
int gm_ignore_warpable_area;
} battle_config;
/**
* Vars
**/
//attribute table
extern int attr_fix_table[4][10][10];
/**
* Battle.c Interface
**/
struct battle_interface {
/* */
struct Battle_Config *bc;
/* init */
void (*init) (void);
/* final */
void (*final) (void);
/* damage calculation */
struct Damage (*calc_attack) (int attack_type, struct block_list *bl, struct block_list *target, uint16 skill_id, uint16 skill_lv, int count);
/* generic final damage calculation */
int (*calc_damage) (struct block_list *src, struct block_list *bl, struct Damage *d, int damage, uint16 skill_id, uint16 skill_lv);
/* gvg final damage calculation */
int (*calc_gvg_damage) (struct block_list *src, struct block_list *bl, int damage, int div_, uint16 skill_id, uint16 skill_lv, int flag);
/* battlegrounds final damage calculation */
int (*calc_bg_damage) (struct block_list *src, struct block_list *bl, int damage, int div_, uint16 skill_id, uint16 skill_lv, int flag);
/* normal weapon attack */
enum damage_lv (*weapon_attack) (struct block_list *bl, struct block_list *target, unsigned int tick, int flag);
/* calculate weapon attack */
struct Damage (*calc_weapon_attack) (struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv,int wflag);
/* delays damage or skills by a timer */
int (*delay_damage) (unsigned int tick, int amotion, struct block_list *src, struct block_list *target, int attack_type, uint16 skill_id, uint16 skill_lv, int damage, enum damage_lv dmg_lv, int ddelay, bool additional_effects);
/* drain damage */
void (*drain) (struct map_session_data *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss);
/* damage return/reflect */
int (*calc_return_damage) (struct block_list *bl, struct block_list *src, int *, int flag, uint16 skill_id, int*);
/* attribute rate */
int (*attr_ratio) (int atk_elem, int def_type, int def_lv);
/* applies attribute modifiers */
int (*attr_fix) (struct block_list *src, struct block_list *target, int damage, int atk_elem, int def_type, int def_lv);
/* applies card modifiers */
int (*calc_cardfix) (int attack_type, struct block_list *src, struct block_list *target, int nk, int s_ele, int s_ele_, int damage, int left, int flag);
/* applies element modifiers */
int (*calc_elefix) (struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int damage, int nk, int n_ele, int s_ele, int s_ele_, bool left, int flag);
/* applies mastery modifiers */
int (*calc_masteryfix) (struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int damage, int div, bool left, bool weapon);
/* applies skill modifiers */
int (*calc_skillratio) (int attack_type, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int skillratio, int flag);
/* applies size modifiers */
int (*calc_sizefix) (struct map_session_data *sd, int damage, int type, int size, bool ignore);
/* get weapon damage */
int (*calc_weapon_damage) (struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, struct weapon_atk *watk, int nk, bool n_ele, short s_ele, short s_ele_, int size, int type, int flag, int flag2);
/* applies defense reductions */
int (*calc_defense) (int attack_type, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int damage, int flag, int pdef);
/* get master (who does this unit respond to?) */
struct block_list *(*get_master) (struct block_list *src);
/* returns a random unit who is targeting this unit */
struct block_list *(*get_targeted) (struct block_list *target);
/* picks a random enemy unit who is in the area of sight */
struct block_list *(*get_enemy) (struct block_list *target, int type, int range);
/* the target id (if any) of this unit */
int (*get_target) (struct block_list *bl);
/* the current skill being processed/casted by this unit */
int (*get_current_skill) (struct block_list *bl);
/* is either this race or element enough to be considered undead? */
int (*check_undead) (int race,int element);
/* check if src and target are part of flag (e.g. enemies or allies) */
int (*check_target) (struct block_list *src, struct block_list *target,int flag);
/* is src and bl within range? */
bool (*check_range) (struct block_list *src,struct block_list *bl,int range);
/* consume amo for this skill and lv */
void (*consume_ammo) (struct map_session_data* sd, int skill, int lv);
int (*get_targeted_sub) (struct block_list *bl, va_list ap);
int (*get_enemy_sub) (struct block_list *bl, va_list ap);
int (*get_enemy_area_sub) (struct block_list *bl, va_list ap);
int (*delay_damage_sub) (int tid, unsigned int tick, int id, intptr_t data);
int (*blewcount_bonus) (struct map_session_data *sd, uint16 skill_id);
/* skill range criteria */
int (*range_type) (struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv);
int (*calc_base_damage)
#ifdef RENEWAL
(struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int nk, bool n_ele, short s_ele, short s_ele_, int type, int flag, int flag2);
#else
(struct status_data *status, struct weapon_atk *wa, struct status_change *sc, unsigned short t_size, struct map_session_data *sd, int flag);
#endif
struct Damage (*calc_misc_attack) (struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv,int mflag);
struct Damage (*calc_magic_attack) (struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv,int mflag);
int (*adjust_skill_damage) (int m, unsigned short skill_id);
int (*add_mastery) (struct map_session_data *sd,struct block_list *target,int dmg,int type);
int (*calc_drain) (int damage, int rate, int per);
/* - battle_config */
int (*config_read) (const char *cfgName);
void (*config_set_defaults) (void);
int (*config_set_value) (const char* w1, const char* w2);
int (*config_get_value) (const char* w1);
void (*config_adjust) (void);
/* ----------------------------------------- */
/* picks a random enemy within the specified range */
struct block_list* (*get_enemy_area) (struct block_list *src, int x, int y, int range, int type, int ignore_id);
/* damages area, originally for royal guard's reflect damage */
int (*damage_area) ( struct block_list *bl, va_list ap);
} battle_s;
struct battle_interface *battle;
void battle_defaults(void);
#endif /* _BATTLE_H_ */
|