471 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			471 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | 
 | |||
|  | SUB_STATE_ICEMAN_0	<- 0 | |||
|  | SUB_STATE_ICEMAN_1	<- 1 | |||
|  | SUB_STATE_ICEMAN_2	<- 2 | |||
|  | SUB_STATE_ICEMAN_3	<- 3 | |||
|  | SUB_STATE_ICEMAN_4	<- 4 | |||
|  | SUB_STATE_ICEMAN_WAIT <- 5 | |||
|  | 
 | |||
|  | function checkExecutableSkill_IceMan(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return false; | |||
|  | 
 | |||
|  | 	local b_useskill = obj.sq_IsUseSkill(SKILL_ICEMAN); | |||
|  | 
 | |||
|  | 	if(b_useskill) { | |||
|  | 		obj.sq_IntVectClear(); | |||
|  | 		obj.sq_IntVectPush(SUB_STATE_ICEMAN_0); // substate撮? | |||
|  | 		obj.sq_AddSetStatePacket(STATE_ICEMAN, STATE_PRIORITY_IGNORE_FORCE, true); | |||
|  | 		return true; | |||
|  | 	}	 | |||
|  | 	 | |||
|  | 	return false; | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function checkCommandEnable_IceMan(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return false; | |||
|  | 
 | |||
|  | 	local state = obj.sq_GetState(); | |||
|  | 
 | |||
|  | 	if(state == STATE_ATTACK) { | |||
|  | 		// 警蜗 蝶鉴 偃? 蒙机濠: 姜霞热 [2012.04.20] | |||
|  | 		return obj.sq_IsCommandEnable(SKILL_ICEMAN); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return true; | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onSetState_IceMan(obj, state, datas, isResetTimer) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | 	local substate = obj.sq_GetVectorData(datas, 0); | |||
|  | 	obj.setSkillSubState(substate); | |||
|  | 	 | |||
|  | 	obj.sq_StopMove(); | |||
|  | 
 | |||
|  | 	local posX = obj.getXPos(); | |||
|  | 	local posY = obj.getYPos(); | |||
|  | 	local posZ = obj.getZPos(); | |||
|  | 	 | |||
|  | 	 | |||
|  | 	obj.getVar("state").clear_ct_vector(); | |||
|  | 	obj.getVar("state").push_ct_vector(); | |||
|  | 	local t = obj.getVar("state").get_ct_vector(0); | |||
|  | 	t.Reset(); | |||
|  | 	t.Start(10000,0); | |||
|  | 	 | |||
|  | 	obj.getVar().clear_vector(); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	obj.getVar().push_vector(0); | |||
|  | 	 | |||
|  | 
 | |||
|  | 	if(substate == SUB_STATE_ICEMAN_0) | |||
|  | 	{ | |||
|  | 		//ICEBLADE_CAST | |||
|  | 		obj.sq_PlaySound("ICEBLADE_CAST"); | |||
|  | 		local offsetX = 100; | |||
|  | 		offsetX = obj.sq_GetDistancePos(posX, obj.sq_GetDirection(), offsetX); | |||
|  | 
 | |||
|  | 		local vX = obj.sq_GetIntData(SKILL_ICEMAN, 0); // 0. 葆彻霞 桧翕楼紫 | |||
|  | 		local vY = 0; | |||
|  | 
 | |||
|  | 		obj.sq_AddAimPointMark(offsetX, posY, vX, vY); | |||
|  | 	 | |||
|  | 		obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICEMAN1); | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_WAIT) | |||
|  | 	{ | |||
|  | 		local dstX = obj.sq_GetVectorData(datas, 1); | |||
|  | 		 | |||
|  | 		obj.getVar("dash").clear_vector(); | |||
|  | 		obj.getVar("dash").push_vector(dstX); // | |||
|  | 		 | |||
|  | 		obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICEMAN6); | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_1) | |||
|  | 	{ | |||
|  | 		// 颤啃? 陛舒晦 | |||
|  | 		print(" sub_state_1"); | |||
|  | 		obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICEMAN2); | |||
|  | 		 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_2) | |||
|  | 	{ | |||
|  | 		// 殖溥陛晦	 | |||
|  | 		 | |||
|  | 		local dstX = obj.getVar("dash").get_vector(0); | |||
|  | 		obj.getVar("dash").push_vector(posX); // ?营 x : i: 1 | |||
|  | 		obj.getVar("dash").push_vector(posY); // ?营 y : i: 2 | |||
|  | 		 | |||
|  | 		local disX = sq_Abs(dstX - posX); | |||
|  | 		local disY = posY; | |||
|  | 		 | |||
|  | 		if(dstX > posX) | |||
|  | 		{ | |||
|  | 			obj.setDirection(ENUM_DIRECTION_RIGHT); | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			obj.setDirection(ENUM_DIRECTION_LEFT); | |||
|  | 		} | |||
|  | 		 | |||
|  | 		disX = disX - 120; | |||
|  | 		 | |||
|  | 		if(disX <= 0) | |||
|  | 			disX = 0; | |||
|  | 		 | |||
|  | 		obj.getVar("dash").push_vector(disX); // x蹴 桧翕剪葬 : i: 3 | |||
|  | 		obj.getVar("dash").push_vector(disY); // y蹴 桧翕剪葬 : i: 4 | |||
|  | 	 | |||
|  | 		obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICEMAN3); | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_3) { | |||
|  | 	// 阳葬晦 | |||
|  | 		obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICEMAN4); | |||
|  | 		obj.sq_SetCurrentAttackInfo(CUSTOM_ATTACK_INFO_ICEMAN); | |||
|  | 		 | |||
|  | 		local multiHitAttackRate = obj.sq_GetBonusRateWithPassive(SKILL_ICEMAN,  | |||
|  | 		STATE_ICEMAN, SKL_LVL_COLUMN_IDX_1, 1.0); //1.陪颤奢问溘(%) | |||
|  | 		 | |||
|  | 		obj.sq_SetCurrentAttackBonusRate(multiHitAttackRate); | |||
|  | 		//CUSTOM_ATTACK_INFO_ICEMAN | |||
|  | 		// 觼煎栖赝 蒙机 翱颤楼紫陛 殖塭韩 热 毡蝗栖棻. | |||
|  | 		local currentAni = sq_GetCurrentAnimation(obj); | |||
|  | 		if(currentAni) | |||
|  | 		{ | |||
|  | 			local multiHitSpeed100Rate = obj.sq_GetIntData(SKILL_ICEMAN, 2); // 2. 翱颤楼紫 | |||
|  | 			currentAni.setSpeedRate(multiHitSpeed100Rate.tofloat()); | |||
|  | 		} | |||
|  | 		//setSpeedRate | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_4) { | |||
|  | 	// ?嫦 | |||
|  | 		obj.sq_SetCurrentAnimation(CUSTOM_ANI_ICEMAN5); | |||
|  | 	} | |||
|  | 	 | |||
|  | 	 | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function prepareDraw_IceMan(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | 	local substate = obj.getSkillSubState(); | |||
|  | } | |||
|  | 
 | |||
|  | function onProc_IceMan(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | 	local substate = obj.getSkillSubState(); | |||
|  | 
 | |||
|  | 	local pAni = obj.sq_GetCurrentAni(); | |||
|  | 	local frmIndex = obj.sq_GetCurrentFrameIndex(pAni); | |||
|  | 	local currentT = sq_GetCurrentTime(pAni); | |||
|  | 
 | |||
|  | 	local sq_var = obj.getVar(); | |||
|  | 	local posX = obj.getXPos(); | |||
|  | 	local posY = obj.getYPos(); | |||
|  | 	local posZ = obj.getZPos(); | |||
|  | 	 | |||
|  | 	if(substate == SUB_STATE_ICEMAN_0) | |||
|  | 	{ // 颤啃? 僭仪 | |||
|  | 		if(obj.isMyControlObject()) | |||
|  | 		{ | |||
|  | 			local targetTime = obj.sq_GetIntData(SKILL_ICEMAN, 1); // 1. 葆彻霞戏煎 颤啃陛栋 卫除 | |||
|  | 			 | |||
|  | 			print( " targetTime:" + targetTime); | |||
|  | 			 | |||
|  | 			if(currentT > targetTime) | |||
|  | 			{ | |||
|  | 				local skillLevel = sq_GetSkillLevel(obj, SKILL_ICEMAN); | |||
|  | 
 | |||
|  | 				local value = 0; | |||
|  | 				 | |||
|  | 				local freezeRate = obj.sq_GetLevelData(SKILL_ICEMAN, | |||
|  | 				 SKL_LVL_COLUMN_IDX_0, skillLevel); // 彩念?徽(%) | |||
|  | 				  | |||
|  | 				local multiHitAttackRate = obj.sq_GetBonusRateWithPassive(SKILL_ICEMAN,  | |||
|  | 				STATE_ICEMAN, SKL_LVL_COLUMN_IDX_1, 1.0); //1.陪颤奢问溘(%) | |||
|  | 				 | |||
|  | 				local smashAttackRate = obj.sq_GetBonusRateWithPassive(SKILL_ICEMAN,  | |||
|  | 				STATE_ICEMAN, SKL_LVL_COLUMN_IDX_2, 1.0); //2.鬼颤奢问溘(%) | |||
|  | 				 | |||
|  | 				local expPower = obj.sq_GetPowerWithPassive(SKILL_ICEMAN,  | |||
|  | 				STATE_ICEMAN, SKL_LVL_COLUMN_IDX_3, -1, 1.0); //3.鼠伞虽朝 橡挤晦菅 奢问溘(+)				 | |||
|  | 
 | |||
|  | 				sq_BinaryStartWrite(); | |||
|  | 				sq_BinaryWriteDword(freezeRate); //  | |||
|  | 				sq_BinaryWriteDword(multiHitAttackRate); //  | |||
|  | 				sq_BinaryWriteDword(smashAttackRate); //  | |||
|  | 				sq_BinaryWriteDword(expPower); //  | |||
|  | 				 | |||
|  | 				local aimPosX = obj.sq_GetAimPosX(posX, posY, true); | |||
|  | 				local offsetX = aimPosX - posX; | |||
|  | 
 | |||
|  | 				if (offsetX < 0) | |||
|  | 				{ | |||
|  | 					offsetX = -offsetX; | |||
|  | 				} | |||
|  | 
 | |||
|  | 				local offsetY = -1; | |||
|  | 				obj.sq_SendCreatePassiveObjectPacket(24255, 0, offsetX, offsetY, 0); // 陴彻饵 嬴桧蝶裔 葆彻霞  | |||
|  | 				 | |||
|  | 				 | |||
|  | 				obj.sq_IntVectClear(); | |||
|  | 				obj.sq_IntVectPush(SUB_STATE_ICEMAN_WAIT); // substate撮? | |||
|  | 				obj.sq_IntVectPush(aimPosX); // substate撮? | |||
|  | 				obj.sq_AddSetStatePacket(STATE_ICEMAN, STATE_PRIORITY_IGNORE_FORCE, true); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_WAIT) | |||
|  | 	{ | |||
|  | 		local t = obj.getVar("state").get_ct_vector(0); | |||
|  | 		local currentT = t.Get(); | |||
|  | 		 | |||
|  | 		if(currentT > 620) | |||
|  | 		//if(currentT > 880) | |||
|  | 		{		 | |||
|  | 			if(obj.isMyControlObject()) | |||
|  | 			{ | |||
|  | 				obj.sq_IntVectClear(); | |||
|  | 				obj.sq_IntVectPush(SUB_STATE_ICEMAN_1); // | |||
|  | 				obj.sq_AddSetStatePacket(STATE_ICEMAN, STATE_PRIORITY_IGNORE_FORCE, true); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_1) { | |||
|  | 		// 颤啃? 陛舒晦 | |||
|  | 		if(!obj.getVar().get_vector(0)) | |||
|  | 		{ | |||
|  | 			if(frmIndex >= 4) | |||
|  | 			{ | |||
|  | 				obj.sq_PlaySound("MW_ICEMAN"); | |||
|  | 				obj.getVar().set_vector(0, 1); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_2) | |||
|  | 	{ | |||
|  | 		// 殖溥陛晦 | |||
|  | 		local dash_t = pAni.getDelaySum(false); // | |||
|  | 		local srcX = obj.getVar("dash").get_vector(1); // 卫蒙x | |||
|  | 		local srcY = obj.getVar("dash").get_vector(2); // 卫蒙y | |||
|  |     	    	 | |||
|  |     	local dis_x_len = obj.getVar("dash").get_vector(3); // 识 桧翕剪葬 | |||
|  | 		local dis_y_len = obj.getVar("dash").get_vector(4); // y蹴 桧翕剪葬 | |||
|  | 		 | |||
|  | 		local v = sq_GetAccel(0, dis_x_len, currentT, dash_t, true); | |||
|  | 		 | |||
|  | 		//local my = sq_GetUniformVelocity(0, dis_y_len, currentT, dash_t); | |||
|  | 		 | |||
|  | 		local dstX = sq_GetDistancePos(srcX, obj.getDirection(), v); | |||
|  | 		//local dstY = srcY + my; | |||
|  | 		  | |||
|  | 		sq_setCurrentAxisPos(obj, 0, dstX); | |||
|  | 		//sq_setCurrentAxisPos(obj, 1, dstY); | |||
|  | 		 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_3) | |||
|  | 	{ | |||
|  | 		// 阳葬晦 | |||
|  | 		local isHit = false; | |||
|  | 		 | |||
|  | 			local particleX = sq_GetXPos(obj); | |||
|  | 			local particleY = sq_GetYPos(obj); | |||
|  | 			local particleZ = sq_GetZPos(obj); | |||
|  | 			 | |||
|  | 		local offsetLen = 140; | |||
|  | 			 | |||
|  | 		if(frmIndex >= 1 && !obj.getVar().get_vector(0)) | |||
|  | 		{ | |||
|  | 			isHit = true; | |||
|  | 			offsetLen = 140; | |||
|  | 			obj.getVar().set_vector(0, 1); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		if(frmIndex >= 4 && !obj.getVar().get_vector(1)) | |||
|  | 		{ | |||
|  | 			isHit = true; | |||
|  | 			offsetLen = 114; | |||
|  | 			 | |||
|  | 			obj.getVar().set_vector(1, 1); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		if(frmIndex >= 8 && !obj.getVar().get_vector(2)) | |||
|  | 		{ | |||
|  | 			isHit = true; | |||
|  | 			offsetLen = 90; | |||
|  | 			obj.getVar().set_vector(2, 1); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		if(frmIndex >= 11 && !obj.getVar().get_vector(3)) | |||
|  | 		{ | |||
|  | 			isHit = true; | |||
|  | 			offsetLen = 150; | |||
|  | 			obj.getVar().set_vector(3, 1); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		if(frmIndex >= 16 && !obj.getVar().get_vector(4)) | |||
|  | 		{ | |||
|  | 			isHit = true; | |||
|  | 			offsetLen = 85; | |||
|  | 			obj.getVar().set_vector(4, 1); | |||
|  | 		} | |||
|  | 		 | |||
|  | 		 | |||
|  | 		if(isHit) | |||
|  | 		{		 | |||
|  | 			obj.resetHitObjectList(); | |||
|  | 			particleX = sq_GetDistancePos(posX, obj.getDirection(), offsetLen); | |||
|  | 			sq_SetMyShake(obj,2,100); | |||
|  | 			 | |||
|  | 			local particleCreater = obj.getVar().GetparticleCreaterMap("AtIceManPoleD2",  | |||
|  | 			"PassiveObject/Character/Mage/Particle/ATIceManPoleDestroy.ptl", obj); | |||
|  | 			particleCreater.Restart(0); | |||
|  | 			particleCreater.SetPos(particleX, particleY + 5, particleZ + 65); | |||
|  | 			sq_AddParticleObject(obj, particleCreater); | |||
|  | 		} | |||
|  | 		 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_4) { | |||
|  | 		// ?嫦 | |||
|  | 	} | |||
|  | 	 | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onProcCon_IceMan(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | 	local substate = obj.getSkillSubState(); | |||
|  | 
 | |||
|  | 	local posX = obj.getXPos(); | |||
|  | 	local posY = obj.getYPos(); | |||
|  | 	local posZ = obj.getZPos(); | |||
|  | 	 | |||
|  | 	if(substate == SUB_STATE_ICEMAN_0) | |||
|  | 	{ | |||
|  | 		local disX = sq_GetDistancePos(obj.getXPos(), sq_GetDirection(obj), 50); | |||
|  | 
 | |||
|  | 		local iPX = obj.sq_GetAimPosX(obj.getXPos(), posY, false); | |||
|  | 
 | |||
|  | 		if (sq_GetDirection(obj) == ENUM_DIRECTION_LEFT) | |||
|  | 		{ | |||
|  | 			if (disX < iPX) | |||
|  | 			{ | |||
|  | 				obj.sq_SetAimPointMarkPosition(disX, posY); | |||
|  | 			} | |||
|  | 		} | |||
|  | 
 | |||
|  | 		if (sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) | |||
|  | 		{ | |||
|  | 			if (disX > iPX) | |||
|  | 			{ | |||
|  | 				obj.sq_SetAimPointMarkPosition(disX, posY); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_1) { | |||
|  | 		// SUB_STATE_ICEMAN_1 怃粽蝶才桧? 蒙机 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_2) { | |||
|  | 		// SUB_STATE_ICEMAN_2 怃粽蝶才桧? 蒙机 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_3) { | |||
|  | 		// SUB_STATE_ICEMAN_3 怃粽蝶才桧? 蒙机 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_4) { | |||
|  | 		// SUB_STATE_ICEMAN_4 怃粽蝶才桧? 蒙机 | |||
|  | 	} | |||
|  | 	 | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onEndCurrentAni_IceMan(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | 	local substate = obj.getSkillSubState(); | |||
|  | 	 | |||
|  | 	if(!obj.isMyControlObject()) | |||
|  | 		return; | |||
|  | 	 | |||
|  | 	local posX = obj.getXPos(); | |||
|  | 	local posY = obj.getYPos(); | |||
|  | 	local posZ = obj.getZPos();	 | |||
|  | 
 | |||
|  | 	if(substate == SUB_STATE_ICEMAN_0) | |||
|  | 	{ | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_1) { | |||
|  | 		//obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); | |||
|  | 		obj.sq_IntVectClear(); | |||
|  | 		obj.sq_IntVectPush(SUB_STATE_ICEMAN_2); // substate撮? | |||
|  | 		obj.sq_AddSetStatePacket(STATE_ICEMAN, STATE_PRIORITY_IGNORE_FORCE, true); | |||
|  | 		 | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_2) { | |||
|  | 		obj.sq_IntVectClear(); | |||
|  | 		obj.sq_IntVectPush(SUB_STATE_ICEMAN_3); // substate撮? | |||
|  | 		obj.sq_AddSetStatePacket(STATE_ICEMAN, STATE_PRIORITY_IGNORE_FORCE, true); | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_3) { | |||
|  | 		obj.sq_IntVectClear(); | |||
|  | 		obj.sq_IntVectPush(SUB_STATE_ICEMAN_4); // substate撮? | |||
|  | 		obj.sq_AddSetStatePacket(STATE_ICEMAN, STATE_PRIORITY_IGNORE_FORCE, true); | |||
|  | 	} | |||
|  | 	else if(substate == SUB_STATE_ICEMAN_4) { | |||
|  | 		sq_SimpleMoveToNearMovablePos(obj,200); | |||
|  | 		obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false); | |||
|  | 	} | |||
|  | 	 | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onKeyFrameFlag_IceMan(obj, flagIndex) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return false; | |||
|  | 
 | |||
|  | 	local substate = obj.getSkillSubState(); | |||
|  | 
 | |||
|  | 
 | |||
|  | 	return false; | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onEndState_IceMan(obj, new_state) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | 	local substate = obj.getSkillSubState(); | |||
|  | 	 | |||
|  | 	if(new_state != STATE_ICEMAN) | |||
|  | 		obj.sq_RemoveAimPointMark(); | |||
|  | 
 | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  |  |