uid = trim(I('uid')); if(!$this->userinfo = M('iptv_users')->where(['uid'=>$this->uid])->find()){ $this->responseError('uid 参数非法'); } $this->act_id = (int)I('act_id'); if(!$this->activityinfo = M('Activity_v2')->where(['id'=>$this->act_id])->find()){ $this->responseError('act_id 参数非法'); } //检查vip鉴权方式 $this->vip_level = I('is_vip') >= 1 ? 1 : 0; } /** * 获取活动状态 * @return [type] [description] */ public function getActStatus() { //开始时间结束时间未作限制 if($this->activityinfo['is_enable'] == 1){ $this->responseSuccess(1, "请求成功!"); }else{ $this->responseSuccess(-1, "请求成功!"); } } /** * 提交用户资料 * @return [type] [description] */ public function setUserInfo() { $phone = trim(I('phone')); if (empty($phone)) { $this->responseError('参数错误!'); } //检测手机号码是否正确 if (!preg_match('/^1[345789]\d{9}$/ims', $phone)) { $this->responseError('手机号填写有误!'); } //更新用户活动手机号码 $where = array( 'uid'=>$this->uid, 'act_id'=>$this->act_id, ); if ($id = M('activity_user_v2')->where($where)->getField('id')){ $update['user_phone']= $phone; $update['updated_at']= date('Y-m-d H:i:s'); if(M('activity_user_v2')->where(['id'=>$id])->save($update)===false){ Writelog(M()->getLastSql(),'sql','activityv2'); $this->responseError("更新失败!"); } }else{ $insert_data = array( 'uid'=>$this->uid, 'act_id'=>$this->act_id, 'user_phone'=>$phone, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s') ); if(!M('activity_user_v2')->add($insert_data)){ Writelog(M()->getLastSql(),'sql','activityv2'); $this->responseError("登记失败!"); } } $this->responseSuccess(0, "登记成功!"); } /** * 提交用户资料 * @return [type] [description] */ public function setUserInfoByphone() { $phone = trim(I('phone')); $address = trim(I('address')); $receiver = trim(I('receiver')); if (!($phone && $address && $receiver)) { $this->responseError('参数错误!'); } //检测手机号码是否正确 if (!preg_match('/^1[345789]\d{9}$/ims', $phone)) { $this->responseError('手机号填写有误!'); } //更新用户活动手机号码 $where = array( 'uid'=>$this->uid, 'act_id'=>$this->act_id, ); if ($id = M('activity_user_v2')->where($where)->getField('id')){ $update['user_phone']= $phone; $update['address'] = $address; $update['receiver'] = $receiver; $update['updated_at'] = date('Y-m-d H:i:s'); if(M('activity_user_v2')->where(['id'=>$id])->save($update)===false){ Writelog(M()->getLastSql(),'sql','activityv2'); $this->responseError("更新失败!"); } }else{ $insert_data = array( 'uid'=>$this->uid, 'act_id'=>$this->act_id, 'user_phone'=>$phone, 'address'=>$address, 'receiver'=>$receiver, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s'), ); if(!M('activity_user_v2')->add($insert_data)){ Writelog(M()->getLastSql(),'sql','activityv2'); $this->responseError("登记失败!"); } } $this->responseSuccess(0, "登记成功!"); } //获取网页二维码 public function getQrcode() { $this->responseSuccess($this->createQrcode()); } /** * 活动规则说明 * @return [type] [description] */ public function getActivityInfo() { //获取中奖信息 $data['rank'] = $this->prizelog('localhost'); unset($data['act']['prize_list']); unset($data['act']['prize_rule']); //获取当前用户中奖信息 $map['act_id'] = $this->act_id; $map['uid'] = $this->uid; $map['rule_id'] = array("neq", 0); //$data['my_prizes'] = M('prize_log_v2')->field('prize_id,prize_name')->where($map)->select(); $my_prizes = M('prize_log_v2')->field('created_at,prize_id')->where($map)->select() ? : array(); if($my_prizes){ foreach ($my_prizes as $k=>$value) { $my_prizes[$k]['prize_name'] = $prizes[$value['prize_id']]['prize_name']; $data['my_prizes'][] = ['prize_id'=>$value['prize_id'],'prize_name'=>$prizes[$value['prize_id']]['prize_name']]; } } $data['collects'] = $this->_getUserCollect(); //获取用户剩余中奖次数 $data['remain_chance'] = $this->_getUserChance(); $this->responseSuccess($data); } //集物 public function collect() { $remain_chance = $this->_getUserChance(); if(!$remain_chance){ $this->responseError('已无游戏机会!', -1); } //消减游戏次数 $this->_useUserChance(); $srand = mt_rand(0,8); if($srand == 0){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } $collect_list = json_decode($this->activityinfo['collect_list'],TRUE); $rand = 0; foreach ($collect_list as $key => $value) { //如果抽中了某个签 if($this->_getRandNum($value['collect_probability'])){ if(($num = $value['collect_num']) > 0){ $counts = M('activity_collect')->where(['act_id'=>$this->act_id,'uid'=>$this->uid,'collect_id'=>$value['collect_id'],'operate'=>1])->count(); if($num > $counts){ $rand = $value['collect_id']; break; } }else{ $rand = $value['collect_id']; break; } } } if($rand == 4){ //四号卡片每个用户顶多给一个 $where = array( 'act_id'=>$this->act_id, 'uid' =>$this->uid, 'collect_id'=>4, 'operate'=>1 ); if(M('activity_collect')->where($where)->find()){ $rand = 0; } } if($rand == 6){ //四号卡片每个用户顶多给一个 $where = array( 'act_id'=>$this->act_id, 'uid' =>$this->uid, 'collect_id'=>4, 'operate'=>1 ); if(M('activity_collect')->where($where)->find()){ $rand = 0; } } if($rand == 0){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } if($uid == 'U04599795' && $value['collect_id'] == 2){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } if($uid == 'U00398811' && $value['collect_id'] == 3){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } if($uid == 'U00419859' && $value['collect_id'] == 3){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } if($uid == 'U00110045' && $value['collect_id'] == 7){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } if($uid == '0108148565841340177' && $value['collect_id'] == 7){ $return_data = ['collect_status'=>'no','collect_list'=>'']; $this->responseSuccess($return_data); } $results[] = array( 'collect_id'=>$value['collect_id'], 'collect_name'=>$value['collect_name'], 'collect_img'=>$value['collect_img'] ? __MY_URL__.$value['collect_img'] : '', ); //写入集物表 foreach ($results as $row) { $insert[] = array( 'act_id'=>$this->act_id, 'uid' =>$this->uid, 'collect_id'=>$row['collect_id'], 'operate' =>1, 'date' =>date('Ymd'), 'created_at'=>date('Y-m-d H:i:s') ); } M('activity_collect')->addAll($insert); $return_data = ['collect_status'=>'yes','collect_list'=>$results]; $this->responseSuccess($return_data); } //获取集物信息 //集物 public function getUserCollects() { $collects = $this->_getUserCollect(); if($collects){ $this->responseSuccess($collects); }else{ $this->responseError('没有抽奖记录!', -3, ['error'=>'error']); } } private function _getUserCollect() { //写入集物表 $where = array( 'act_id'=>$this->act_id, 'uid' =>$this->uid, ); $collects = M('activity_collect')->where($where)->group('collect_id')->getField('collect_id,sum(operate) as num'); $collects = $collects ? : []; // echo M()->getLastSql(); $allCollects = json_decode($this->activityinfo['collect_list'],TRUE); if(!$allCollects){ $this->responseError('没有集物列表!', -3, ['error'=>'error']); } $collect_id_sum = $should_collect_sum = 0 ; foreach ($allCollects as $key => $row) { $return[$key] = array( 'collect_id'=>$row['collect_id'], 'collect_name'=>$row['collect_name'], 'collect_img'=>$row['collect_img'] ? __MY_URL__.$row['collect_img'] : '', 'num'=>$collects[$row['collect_id']] > 0 ? $collects[$row['collect_id']] : 0 ); if($collects[$row['collect_id']] > 0){ $collect_id_sum += $row['collect_id']; } $should_collect_sum += $row['collect_id']; } if($collect_id_sum == $should_collect_sum){ $collect['complate'][] = array( 'exchange_id'=>1, 'collect_ids'=>implode(',',[1,2,3,4,5,6,7]) ); // $collect['complate'][] = array( // 'exchange_id'=>2, // 'collect_ids'=>implode(',',[1,2,3,4,5,6,7,8,9]) // ); $collect['collect'] = $return; }else{ $collect['complate'] = ''; $collect['collect'] = $return; } return $collect; } /** * 获取虚拟道具卡 * @param [type] $uid [description] * @return [type] [description] */ public function getVitualCard() { if($daoju_name = trim(I('daoju_name'))){ if(!in_array($daoju_name, ['reborn_card'])){ $this->responseError('daoju_name 参数非法'); } } else { $this->responseError('daoju_name 参数非法'); } $remain = $this->_getVitualCard($daoju_name); $this->responseSuccess($remain,'剩余道具数量'); } /** * 获取虚拟卡 * @param [type] $uid [description] * @return [type] [description] */ private function _getVitualCard($daoju_name) { $map['uid'] = $this->uid; $map['act_id'] = $this->act_id; $map['date'] = date('Ymd'); $map['name'] = $daoju_name; $daoju = M('activity_daoju')->field('operate,count(*) as total')->where($map)->group('operate')->select(); $daoju = array_column($daoju, 'total', 'operate'); $count = $daoju['add'] - $daoju['reduce']; if($daoju_name == 'reborn_card'){ if($this->vip_level == 2){ $remain_chance = 2 + $count; }elseif($this->vip_level ==1){ $remain_chance = 1 + $count; }else{ $remain_chance = 0 + $count; } } return $remain_chance > 0 ? $remain_chance : 0; } /** * 获取用户当日抽奖次数 * @param [type] $uid [description] * @return [type] [description] */ private function _getUserChance() { $map['uid'] = $this->uid; $map['act_id'] = $this->act_id; $map['date'] = date('Ymd'); $chance = M('activity_take_part')->where($map)->getField('number') ? : 0; // var_dump($chance);die; if($this->activityinfo['is_test'] ==1){ if(I('is_test') ==1){ return $remain_chance = 1000 - $chance; } } if($this->vip_level >=1){ $remain_chance = ($this->vip_level * $this->activityinfo['vip_chance'] + $this->activityinfo['novip_chance'] - $chance); }else{ $remain_chance = $this->activityinfo['novip_chance'] - $chance; } return $remain_chance > 0 ? $remain_chance : 0; } /** * 获取用户当日抽奖次数 * @param [type] $uid [description] * @return [type] [description] */ private function _useUserChance() { $map['uid'] = $this->uid; $map['act_id'] = $this->act_id; $map['date'] = date('Ymd'); $data = M('activity_take_part')->where($map)->find(); // var_dump($chance);die; if($data){ $data['number'] += 1; $bool = M('activity_take_part')->save($data); }else{ $map['number'] = 1; $map['created_at'] = date('Y-m-d H:i:s'); $bool = M('activity_take_part')->add($map); } if(!$bool){ $this->responseError('服务异常',-1); } } /** * 使用虚拟道具 * @param [type] $uid [description] * @return [type] [description] */ public function useVitualCard() { $remain_reborn_card = $this->_getVitualCard('reborn_card'); if($remain_reborn_card >= 1){ $insert = array( 'uid' => $this->uid, 'act_id' => $this->act_id, 'date' => date('Ymd'), 'operate' => 'reduce', 'name' => 'reborn_card' ); if(M('activity_daoju')->add($insert)){ $this->responseSuccess(); }else{ $this->responseError('网络异常!', -1); } }else{ $this->responseError('您没有复活卡拉!', -3); } } /** * 获取用户剩余抽奖次数 * @return [type] [description] */ public function getPrizeNum() { $remain_chance = $this->_getUserChance(); $this->responseSuccess($remain_chance); } /** * 所有中奖记录查询 */ public function prizelog($model = ''){ $error[] = ['error' => 'error']; $where['act_id'] = $this->act_id; $data = M('activity_user_v2')->where($where)->field('id,prize_id,act_id,user_phone,created_at')->select(); $prizes = json_decode($this->activityinfo['prize_list'],TRUE); foreach ($prizes as $value) { $prize_list[$value['prize_id']] = $value; } if($data){ foreach ($data as $key=>$value) { $data[$key]['prize_name'] = $prize_list[$value['prize_id']]['prize_name']; $data[$key]['prize_img'] = __MY_URL__.$prize_list[$value['prize_id']]['prize_img']; } } //增加虚拟中奖信息 $default_data = $this->getPrizeDefault(); if($data || $default_data){ if($data){ foreach ($data as $k=>$v){ if($v['user_phone']){ $data[$k]['user_phone'] = substr_replace($v['user_phone'],'****',3,4); }else { $data[$k]['user_phone'] = substr_replace($v['uid'],'****',6); } unset($data[$k]['uid']); } } if($data && $default_data){ $data = array_merge($default_data,$data); }else{ $data = $data ? : $default_data; } array_multisort(array_column($data,'created_at'),SORT_DESC,$data); if($model == 'localhost'){ return $data; } $this->responseSuccess($data, '查询成功!'); }else{ if($model == 'localhost'){ return array(); } $this->responseError('没有抽奖记录!', -3, $error); } } public function userPrizelog(){ $error[] = ['error' => 'error']; //获取用户 if($user_phone = M('activity_user_v2')->where(['uid'=>$this->uid,'act_id'=>$this->act_id])->getField('user_phone')){ $phone_staus = 1;//填过 }else{ $phone_staus = 2;//填过 } $where = array(); $where['pl.prize_status'] = 1; $where['pl.uid'] = $this->uid; $where['pl.act_id'] = $this->act_id; $data = M('prize_log_v2')->alias('pl') ->where($where) ->order('pl.id desc') ->field('pl.prize_id,pl.created_at') ->select(); // echo M()->getLastSql();die; $prizes = json_decode($this->activityinfo['prize_list'],TRUE); foreach ($prizes as $value) { $prize_list[$value['prize_id']] = $value; } $flag = $data ? 1 : 0; if($flag){ if($data){ foreach ($data as $k => $v){ $data[$k]['prize_name'] = $prize_list[$v['prize_id']]['prize_name']; $data[$k]['prize_object'] = 'real'; $data[$k]['show_image'] = $prize_list[$v['prize_id']]['prize_img'] ? __MY_URL__.$prize_list[$v['prize_id']]['prize_img']:null; unset($data[$k]['prize_id']); } } $return_data = array( 'my_prizes'=>$data, 'user_phone'=>['phone_status'=>$phone_staus,'user_phone'=>$user_phone ? :''], 'prize_status'=>$data ? 'real' : 'vitual' ); $this->responseSuccess($return_data, '查询成功!'); }else{ $this->responseError('没有抽奖记录!', -3, $error); } } /** * 抽奖 */ public function prize(){ $error[] = ['error' => 'error']; //判断是否有完成的集合 $result = $this->_getUserCollect(); if(!$result['complate']){ $this->responseError('没有完成的集合!', -3, $error); } $exchanges = array_column($result['complate'], null, 'exchange_id'); $collect_ids = $exchanges[1]['collect_ids']; $collect_arr = explode(',', $collect_ids); //消耗兑换卡 foreach ($collect_arr as $key => $value) { $datalist[] = ['act_id'=>$this->act_id,'uid'=>$this->uid,'collect_id'=>$value,'operate'=>-1,'date'=>date('Ymd'),'created_at'=>date('Y-m-d H:i:s')]; } M('activity_collect')->addAll($datalist); //开始抽奖 $prize_data = $this->_get_prize(); unset($prize_data['yes']['rule_id']); $this->responseSuccess($prize_data, '抽奖成功!'); } private function _get_prize() { $result = $this->getPrizeSetDeatil(); // var_dump($result);die; $this->_writePrizeLog($result); $res = array(); $res['yes']['prize_name'] = $result['prize_name']; //中奖项 $res['yes']['prize_status'] = $result['prize_object'] ? : 'none'; $res['yes']['prize_img'] = $result['prize_img'] ? __MY_URL__.$result['prize_img'] : ''; $res['yes']['rule_id'] = $result['rule_id']; return $res; } /** * @param desc 写入抽奖日志 * @param type $result */ private function _writePrizeLog(&$result) { $log_data['uid'] = $this->uid; $log_data['prize_id'] = $result['prize_id'] ? :0; $log_data['is_vip'] = $this->vip_level; $log_data['act_id'] = $this->act_id; $log_data['created_at'] = date('Y-m-d H:i:s'); $log_data['date'] = date('Ymd'); $log_data['rule_id'] = $result['rule_id'] ? : 0; $log_data['prize_status'] = $result['prize_status']; if(!M('prize_log_v2')->add($log_data)){ Writelog(M()->getLastSql(),'sql','activityv2'); $this->responseError('系统繁忙抽奖失败', -1); } } /** * 返回中奖的信息 */ private function getPrizeSetDeatil() { $prize_list = json_decode($this->activityinfo['prize_list'],TRUE);//获取奖项设置 if($prize_list){ foreach ($prize_list as $row) { $limit_sales[$row['prize_id']] = $row; if($row['prize_level']== 0){ $impossible_prize = ['prize_id'=>$row['prize_id'],'prize_name'=>$row['prize_name'],'rule_id'=>0,'prize_img'=>'','prize_status'=>0]; } } } //获取所有规则 $rules = json_decode($this->activityinfo['prize_rule'],TRUE); if(!$rules){ return $impossible_prize; } if(I('run')!='complate'){ return $impossible_prize; } $swithc_no = ''; foreach ($rules as $value) { if($value['rule_status'] == 0){ $swithc_no = $swithc_no. 0; continue; } //1.检查是否符合身份 if(FALSE === $this->_checkRuleRole($value['rule_role'])){ $swithc_no = $swithc_no. 1; continue; } //2.检查中奖日期设置 if(FALSE === $this->_checkRuleDate($value['rule_date'])){ $swithc_no = $swithc_no. 2; continue; } //3.检查时段设置 if(FALSE === $this->_checkRuleHour($value['rule_hour'])){ $swithc_no = $swithc_no. 3; continue; } //4.概率摇奖 if(FALSE === $this->_getRandNum($value['rule_probability'])){ $swithc_no = $swithc_no. 4; continue; } //5.查询是否超出当前规则下的出奖数 if(FALSE === $this->_checkCurrentRuleSale($value)){ $swithc_no = $swithc_no. 5; continue; } //6.查询是否超出奖品总数 if(FALSE === $this->_checkGolabRule($value,$limit_sales)){ $swithc_no = $swithc_no. 6; continue; } Writelog('uid: '.$this->uid.'跳出关卡: '.$swithc_no,'switch','activityv2'); $prize = $limit_sales[$value['rule_prize_id']]; $prize['rule_id'] = $value['rule_id']; $prize['prize_status'] = 1; return $prize; } Writelog('uid: '.$this->uid.'跳出关卡: '.$swithc_no,'switch','activityv2'); return $impossible_prize; } /** * 获取转盘信息 */ public function prizeData(){ $error[] = ['error' => 'error']; $data = array(); $data['userp']['prize_num'] = $this->_getUserChance(); $data['userp']['user_phone'] = $this->userinfo['user_phone'] ? :$this->userinfo['uid']; //转盘信息 $turn_data = json_decode($this->activityinfo['prize_list'],TRUE); if($turn_data){ foreach ($turn_data as $k => $v){ if($v['prize_status'] == 0){ unset($turn_data[$k]); continue; } if($v['prize_img']){ $turn_data[$k]['prize_img'] = __MY_URL__.$v['prize_img']; } unset($turn_data[$k]['prize_num']); unset($turn_data[$k]['prize_level']); unset($turn_data[$k]['prize_status']); } $data['prize_data'] = $turn_data; }else{ $this->responseError('获取失败!', -1, $error); } $this->responseSuccess($data, '查询成功!'); } private function getPrizeDefault() { $map['pd.act_id'] = $this->act_id; $prizes = json_decode($this->activityinfo['prize_list'],true); foreach ($prizes as $key=>$v){ $prize_list[$v['prize_id']] = $v; } // var_dump($prize_list);die; $data = M('prize_default_v2')->where(['act_id'=>$this->act_id])->select(); if($data){ foreach ($data as $value) { $return_data[] = array( 'created_at'=>$value['prize_date'], 'prize_name'=>$prize_list[$value['prize_id']]['prize_name'], 'prize_img'=>$prize_list[$value['prize_id']]['prize_img'] ? __MY_URL__.$prize_list[$value['prize_id']]['prize_img']:'', 'user_phone'=>substr_replace($value['phone'],'****',3,4), ); } } return $return_data; } /** * @desc 检查中奖规则关于身份设置 */ private function _checkRuleRole($rule_role) { $role = $this->vip_level ? '会员' : '普通用户'; if(FALSE !== strpos($rule_role, '不限')){ return TRUE; } if($rule_role != '虚拟用户'){ if(in_array($role, explode(',', $rule_role))){ return TRUE; } } return FALSE; } /** * @desc 检查中奖规则关于日期 */ private function _checkRuleDate($rule_date) { if(FALSE !== strpos($rule_date,'每日')){ return TRUE; } //时间段 if(strpos($rule_date,'至')){ $date = explode('至', $rule_date); if((time()>=strtotime($date[0])) && time()< strtotime($date[1])){ return TRUE; }else{ return FALSE; } }else{ if(date('Y-m-d') == $rule_date){ return TRUE; }else{ return FALSE; } } } /** * @desc 检查中奖规则关于时间段 */ private function _checkRuleHour($rule_hour) { $hour = explode('至', $rule_hour); if((date('H:i')>= trim($hour[0])) && (date('H:i')< trim($hour[1]))){ return TRUE; }else{ return FALSE; } } /** * @desc 概率摇奖 * @param type $rule_probability * @return boolean */ private function _getRandNum($rule_probability) { if($rule_probability == 0){ return FALSE; } $tmp = explode('/', $rule_probability); $rand_array = range(1, $tmp[1]); shuffle($rand_array); $get_randnum = array_slice($rand_array, 0, $tmp[0]); Writelog('uid: '.$this->uid.'抽签: '.json_encode($get_randnum),'switch','activityv2'); if(in_array($tmp[0], $get_randnum)){ return TRUE; }else{ return FALSE; } } /** * @desc 查询符合当前规则 */ private function _checkCurrentRuleSale(&$rule) { //查询当前规则下的中奖数,如果为-1则无限制 if($rule['rule_num'] == -1){ return TRUE; } if((FALSE!==strpos($rule['rule_date'],'至')) && ($rule['rule_cycle']=='total')){ $rule_date = explode('至', $rule['rule_date']); $where['rule_id'] = $rule['rule_id']; $where['act_id'] = $this->act_id; $where['date'] = ['between',[date('Ymd', strtotime($rule_date[0])),date('Ymd', strtotime($rule_date[1]))]]; $countNum = M('Prize_log_v2')->where($where)->count(); Writelog('当前1:'.$countNum.'规则:'.$rule['rule_num'],'info','activityv2'); return $countNum >= $rule['rule_num'] ? FALSE : TRUE; }else{ $where['date'] = date('Ymd'); $where['rule_id'] = $rule['rule_id']; $where['act_id'] = $this->act_id; $countNum = M('Prize_log_v2')->where($where)->count(); Writelog('当前2:'.$countNum.'规则:'.$rule['rule_num'],'info','activityv2'); // echo M()->getLastSql();die; return $countNum >= $rule['rule_num'] ? FALSE : TRUE; } } /** * @desc 不能超过奖品总数 */ private function _checkGolabRule(&$rule,&$limit_sales) { if($limit_sales[$rule['rule_prize_id']]['prize_num'] == -1){ return TRUE; } $countNum = M('Prize_log_v2')->where(['prize_id'=>$rule['rule_prize_id'],'act_id'=>$this->act_id])->count(); // echo M()->getLastSql();die; Writelog('当前3:'.$countNum.'总量:'.$limit_sales[$rule['rule_prize_id']]['prize_num'],'info','activityv2'); return $countNum >= $limit_sales[$rule['rule_prize_id']]['prize_num'] ? FALSE : TRUE; } }