|  |  | @ -5916,202 +5916,11 @@ public class PlayerCharacter extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |             // Reset this char's frame time.
 |  |  |  |             // Reset this char's frame time.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.lastUpdateTime = System.currentTimeMillis(); |  |  |  |             this.lastUpdateTime = System.currentTimeMillis(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.lastStamUpdateTime = System.currentTimeMillis(); |  |  |  |             this.lastStamUpdateTime = System.currentTimeMillis(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         //this.updateMovementState();
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         ///boolean updateHealth = this.regenerateHealth();
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //boolean updateMana = this.regenerateMana();
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //boolean updateStamina = this.regenerateStamina();
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //boolean consumeStamina = this.consumeStamina();
 |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         if (this.timestamps.get("SyncClient") + 5000L < System.currentTimeMillis()) { |  |  |  |         if (this.timestamps.get("SyncClient") + 5000L < System.currentTimeMillis()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             //if (updateHealth || updateMana || updateStamina || consumeStamina) {
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 this.syncClient(); |  |  |  |                 this.syncClient(); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 this.timestamps.put("SyncClient", System.currentTimeMillis()); |  |  |  |                 this.timestamps.put("SyncClient", System.currentTimeMillis()); | 
			
		
	
		
		
			
				
					
					|  |  |  |             //}
 |  |  |  |                 InterestManager.setObjectDirty(this); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean regenerateHealth(){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long regenTime; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long currentTime = System.currentTimeMillis(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         regenTime = this.timestamps.getOrDefault("LastRegenHealth", currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float onePercent = this.healthMax * 0.01f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float rate = 1.0f / RecoveryType.getRecoveryType(this).healthRate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         rate *= this.getRegenModifier(ModType.HealthRecoverRate); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         rate *= this.combatStats.healthRegen; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(this.isMoving() && !this.walkMode) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             rate = 0.0f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float healthRegenerated = onePercent * rate * secondsPassed; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //ChatManager.chatSystemInfo(this,"HEALTH REGENERATED: " + healthRegenerated + " SECONDS PASSED: " + secondsPassed);
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         ChatManager.chatSystemInfo(this,"HEALTH : " + Math.round(this.health.get()) + " / " + this.healthMax); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedHealth = false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float old = this.health.get(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float mod = old + healthRegenerated; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         while(!workedHealth) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mod > this.healthMax) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = healthMax; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             else if (mod <= 0) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (this.isAlive.compareAndSet(true, false)) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     killCharacter("Water"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedHealth = this.health.compareAndSet(old, mod); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastRegenHealth",currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return mod > old; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean regenerateMana(){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long regenTime; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long currentTime = System.currentTimeMillis(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         regenTime = this.timestamps.getOrDefault("LastRegenMana", currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float onePercent = this.manaMax * 0.01f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float rate = 1.0f / RecoveryType.getRecoveryType(this).manaRate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         rate *= this.combatStats.manaRegen; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(this.isMoving() && !this.walkMode) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             rate = 0.0f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float manaRegenerated = onePercent * secondsPassed * rate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedMana = false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float  old = this.mana.get(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float mod = old + manaRegenerated; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         while(!workedMana) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mod > this.manaMax) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = manaMax; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             else if (mod < 0) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedMana = this.mana.compareAndSet(old, mod); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastRegenMana",currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return mod > old; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean regenerateStamina(){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long currentTime = System.currentTimeMillis(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(this.isMoving() || this.isFlying() || !this.canBreathe) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.timestamps.put("LastRegenStamina",currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long regenTime; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         regenTime = this.timestamps.getOrDefault("LastRegenStamina", currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsToRecover1 = RecoveryType.getRecoveryType(this).staminaRate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         secondsToRecover1 *= this.combatStats.staminaRegen; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float ratio = secondsPassed / secondsToRecover1; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //rate *= this.getRegenModifier(ModType.StaminaRecoverRate); // Adjust rate with modifiers
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //float staminaRegenerated = secondsPassed / rate; // Stamina regenerates 1 point per `rate` seconds
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float staminaRegenerated = secondsPassed * ratio; // Stamina regenerates 1 point per `rate` seconds
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedStamina = false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float old = this.stamina.get(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float mod = old + staminaRegenerated; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         while (!workedStamina) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mod > this.staminaMax) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = staminaMax; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             else if (mod < 0) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedStamina = this.stamina.compareAndSet(old, mod); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax);
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastRegenStamina", currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return mod > old; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean consumeStamina(){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long regenTime; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Long currentTime = System.currentTimeMillis(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         regenTime = this.timestamps.getOrDefault("LastConsumeStamina", currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float secondsPassed = (currentTime - regenTime) / 1000f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float consumption; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(!this.isMoving() && !this.isFlying() && this.canBreathe) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.timestamps.put("LastConsumeStamina",currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(!this.combat){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             consumption = 0.4f * secondsPassed; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         }else{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             consumption = 0.65f * secondsPassed; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(!this.canBreathe) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             consumption = 1.5f * secondsPassed; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         else if(this.isFlying()) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             consumption = 2.0f * secondsPassed; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedStamina = false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float old = this.stamina.get(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float mod = old - consumption; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         while (!workedStamina) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mod <= 0) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedStamina = this.stamina.compareAndSet(old, mod); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //ChatManager.chatSystemInfo(this, "STAM: " + this.stamina.get() + " / " + this.staminaMax);
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.timestamps.put("LastConsumeStamina",currentTime); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(this.stamina.get() == 0){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return this.consumeHealth(secondsPassed); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return mod < old; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean consumeHealth(float secondsPassed){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float consumption = 2.0f * secondsPassed; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         boolean workedHealth = false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float old = this.health.get(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float mod = old - consumption; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         while(!workedHealth) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mod > this.healthMax) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mod = healthMax; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             else if (mod <= 0) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (this.isAlive.compareAndSet(true, false)) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     killCharacter("Water"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return true; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             workedHealth = this.health.compareAndSet(old, mod); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return mod < old; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     enum RecoveryType{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //Values for health and mana are in terms of the number of seconds it takes to recover 1% of max pool
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //Values for stamina are in terms of the number of seconds it takes to recover 1 point
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         RESTING(3.0f,1.2f,0.5f), //sitting
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         IDLING(15.0f,6.0f,5.0f), //standing not moving
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         WALKING(20.0f,8.0f,0.0f), // moving in walk mode
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         RUNNING(0.0f,0.0f,0.0f); // moving in run mode
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         public float healthRate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         public float manaRate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         public float staminaRate; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         RecoveryType(float health, float mana, float stamina) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.healthRate = health; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.manaRate = mana; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.staminaRate = stamina; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         public static RecoveryType getRecoveryType(PlayerCharacter pc){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (pc.isMoving()) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(pc.walkMode){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     return RecoveryType.WALKING; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 }else{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     return RecoveryType.RUNNING; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             }else if(pc.isSit()){ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return RecoveryType.RESTING; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             }else{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return RecoveryType.IDLING; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |