|
@@ -36,7 +36,6 @@
|
|
|
#import "SafeForKey.h"
|
|
|
#import "CloudPhoneAPI.h"
|
|
|
|
|
|
-#import "MySetViewController.h"
|
|
|
#import "PhoneTimeInfoModel.h"
|
|
|
#import "connectDeviceManager.h"
|
|
|
#import "commandSendCheckModel.h"
|
|
@@ -409,7 +408,7 @@ UIDocumentPickerDelegate>
|
|
|
{
|
|
|
[super viewDidAppear:animated];
|
|
|
|
|
|
- AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
|
|
|
+ //AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
|
|
|
// app.allowAutoRotate = YES;
|
|
|
|
|
|
[[UIApplication sharedApplication] setStatusBarHidden:YES];
|
|
@@ -479,7 +478,7 @@ UIDocumentPickerDelegate>
|
|
|
/*新内容 完全包含前面的内容 就是删除*/
|
|
|
NSRange newInOld = [hidenTextFieldOldStr rangeOfString:textField.text];
|
|
|
if (newInOld.location == 0 && newInOld.length == textField.text.length){/*删除*/
|
|
|
- NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:nil];
|
|
|
+ //NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:nil];
|
|
|
//[self.businessCommandChannelManager rc_sendData:dataStr];
|
|
|
/*删除以后在输入框前面新增一个字符*/
|
|
|
NSString *tempStr = textField.text;
|
|
@@ -498,7 +497,7 @@ UIDocumentPickerDelegate>
|
|
|
if (oldInNew.location == 0 && oldInNew.length == hidenTextFieldOldStr.length){/*新增*/
|
|
|
NSString *addStr = [textField.text substringWithRange:(NSMakeRange(hidenTextFieldOldStr.length, textField.text.length - hidenTextFieldOldStr.length))];
|
|
|
NSLog(@"键盘透传--@@@@新增内容:%@",addStr);
|
|
|
- NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:addStr];
|
|
|
+ //NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:addStr];
|
|
|
//[self.businessCommandChannelManager rc_sendData:dataStr];
|
|
|
}else{/*部分覆盖*/
|
|
|
/*覆盖分为两部分 1、覆盖的内容更长 2、覆盖的内容更短*/
|
|
@@ -513,14 +512,14 @@ UIDocumentPickerDelegate>
|
|
|
/*需要删除的长度*/
|
|
|
NSInteger needDeleteLength = hidenTextFieldOldStr.length - sameLength;
|
|
|
for (NSInteger nFori = 0; nFori < needDeleteLength; nFori++) {
|
|
|
- NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:nil];
|
|
|
+ //NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:nil];
|
|
|
//[self.businessCommandChannelManager rc_sendData:dataStr];
|
|
|
}
|
|
|
|
|
|
/*需要增加的内容*/
|
|
|
NSInteger needLength = textField.text.length - sameLength;
|
|
|
NSString *addStr = [textField.text substringWithRange:(NSMakeRange(sameLength, needLength))];
|
|
|
- NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:addStr];
|
|
|
+ //NSString *dataStr = [RCCommandHelp commandKeyboadInputStr:addStr];
|
|
|
//[self.businessCommandChannelManager rc_sendData:dataStr];
|
|
|
}
|
|
|
}
|
|
@@ -1231,12 +1230,6 @@ NSDate *lastVideoTome;/*上一帧数据时间*/
|
|
|
HLog(@"云手机推流界面 控制按钮点击手势结束");
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:PlayerViewControlBtnTouchEndNotification object:nil userInfo:nil];
|
|
|
|
|
|
-
|
|
|
-// [[UIApplication sharedApplication] setStatusBarHidden:NO];
|
|
|
-// MySetViewController *nextVC = [[MySetViewController alloc] init];
|
|
|
-// //nextVC.whetherPhoneStatus = phoneTimeInfoDataModel.data.whetherPhoneStatus;
|
|
|
-// [self.navigationController pushViewController:nextVC animated:YES];
|
|
|
-// self.isNeedRecyclResource = NO;
|
|
|
|
|
|
playerSetView *nextVC = [[playerSetView alloc] init];
|
|
|
[ksharedAppDelegate.window addSubview:nextVC];
|
|
@@ -1314,7 +1307,7 @@ NSDate *lastVideoTome;/*上一帧数据时间*/
|
|
|
/*弹窗提示TV投屏*/
|
|
|
ComontAlretViewController *nextVC = [[ComontAlretViewController alloc] initWithTiTle:NSLocalizedString(@"File_upload_Record_clear_Tip_title",nil)
|
|
|
msg:NSLocalizedString(@"cloudPhone_fullscreen_tvshow_tip",nil)
|
|
|
- imageStr:nil
|
|
|
+ imageStr:@""
|
|
|
cancelTitle:NSLocalizedString(@"other_cancel",nil)
|
|
|
okTitle:NSLocalizedString(@"my_set_TVP2P_Open_sure",nil) isOkBtnHighlight:YES
|
|
|
didClickOk:^{
|
|
@@ -1352,8 +1345,8 @@ NSDate *lastVideoTome;/*上一帧数据时间*/
|
|
|
- (void)showCloseTVP2PFun{
|
|
|
/*弹窗提示TV投屏*/
|
|
|
ComontAlretViewController *nextVC = [[ComontAlretViewController alloc] initWithTiTle:NSLocalizedString(@"my_set_no_close_TV_p2p_tip",nil)
|
|
|
- msg:nil
|
|
|
- imageStr:nil
|
|
|
+ msg:@""
|
|
|
+ imageStr:@""
|
|
|
cancelTitle:NSLocalizedString(@"other_cancel",nil)
|
|
|
okTitle:NSLocalizedString(@"my_set_TVP2P_Open_sure",nil) isOkBtnHighlight:YES
|
|
|
didClickOk:^{
|
|
@@ -1395,8 +1388,8 @@ NSDate *lastVideoTome;/*上一帧数据时间*/
|
|
|
KWeakSelf
|
|
|
/*弹窗提示重启*/
|
|
|
ComontAlretViewController *nextVC = [[ComontAlretViewController alloc] initWithTiTle:NSLocalizedString(@"my_set_no_restart_phone_tips",nil)
|
|
|
- msg:nil
|
|
|
- imageStr:nil
|
|
|
+ msg:@""
|
|
|
+ imageStr:@""
|
|
|
cancelTitle:NSLocalizedString(@"other_cancel",nil)
|
|
|
okTitle:NSLocalizedString(@"my_set_no_restart_phone_btn_ok",nil) isOkBtnHighlight:NO
|
|
|
didClickOk:^{
|
|
@@ -1521,21 +1514,21 @@ NSDate *lastVideoTome;/*上一帧数据时间*/
|
|
|
// V1.4这个版本把密钥弹框去掉 军义20240537 下的需求 防盗
|
|
|
return;
|
|
|
|
|
|
- mPlayerView.controlBtn.hidden = YES;
|
|
|
- playerShowSecretkeyView *view = [[playerShowSecretkeyView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H)];
|
|
|
- [self.view addSubview:view];
|
|
|
- [self.view bringSubviewToFront:view];
|
|
|
-
|
|
|
- KWeakSelf
|
|
|
- view.didCloseSecretKeyViewTip = ^{
|
|
|
- [HWDataManager setBoolWithKey:Const_need_show_Secret_key value:NO];
|
|
|
- self->mPlayerView.controlBtn.hidden = NO;
|
|
|
- [weakSelf showControlBtnTipFun];
|
|
|
- };
|
|
|
-
|
|
|
- view.didCopySecretKeyViewTip = ^{
|
|
|
- [weakSelf updateCopydata];
|
|
|
- };
|
|
|
+// mPlayerView.controlBtn.hidden = YES;
|
|
|
+// playerShowSecretkeyView *view = [[playerShowSecretkeyView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_W, SCREEN_H)];
|
|
|
+// [self.view addSubview:view];
|
|
|
+// [self.view bringSubviewToFront:view];
|
|
|
+//
|
|
|
+// KWeakSelf
|
|
|
+// view.didCloseSecretKeyViewTip = ^{
|
|
|
+// [HWDataManager setBoolWithKey:Const_need_show_Secret_key value:NO];
|
|
|
+// self->mPlayerView.controlBtn.hidden = NO;
|
|
|
+// [weakSelf showControlBtnTipFun];
|
|
|
+// };
|
|
|
+//
|
|
|
+// view.didCopySecretKeyViewTip = ^{
|
|
|
+// [weakSelf updateCopydata];
|
|
|
+// };
|
|
|
}
|
|
|
|
|
|
#pragma mark 显示首次浮标引导操作提示
|
|
@@ -2003,132 +1996,132 @@ static int couneeee = 0;
|
|
|
{
|
|
|
return;//功能未用到
|
|
|
|
|
|
- int audio_time = 0;
|
|
|
- NSDate *nowTime = [NSDate date];
|
|
|
- NSString *nowTimeStr = [NSString stringWithFormat:@"%f", (double)[nowTime timeIntervalSince1970]];
|
|
|
- NSString *lastTimeStr = [NSString stringWithFormat:@"%f", (double)[lastVideoTome timeIntervalSince1970]];
|
|
|
- audio_time = ([nowTimeStr doubleValue] - [lastTimeStr doubleValue]) * 1000;
|
|
|
- lastVideoTome = nowTime;
|
|
|
-
|
|
|
- static int frameCount = 200;
|
|
|
-
|
|
|
- if (0 == frameCount)
|
|
|
- {
|
|
|
- frameCount = 200;
|
|
|
-
|
|
|
- if (audio_time > 500 && !haveBack && self->netWorkStates != 0)
|
|
|
- {
|
|
|
- self->netWorkStates = 0;
|
|
|
- mainBlock(^{
|
|
|
- [self->mPlayerView.controlBtn setBackgroundImage:[UIImage imageNamed:@"you_icon"] forState:(UIControlStateNormal)];
|
|
|
- });
|
|
|
- }
|
|
|
- else if (audio_time > 100 && !haveBack && self->netWorkStates != 1)
|
|
|
- {
|
|
|
- self->netWorkStates = 1;
|
|
|
- mainBlock(^{
|
|
|
- [self->mPlayerView.controlBtn setBackgroundImage:[UIImage imageNamed:@"you_icon"] forState:(UIControlStateNormal)];
|
|
|
- });
|
|
|
- }
|
|
|
- else if (!haveBack && self->netWorkStates != 2)
|
|
|
- {
|
|
|
- self->netWorkStates = 2;
|
|
|
- mainBlock(^{
|
|
|
- [self->mPlayerView.controlBtn setBackgroundImage:[UIImage imageNamed:@"you_icon"] forState:(UIControlStateNormal)];
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- frameCount--;
|
|
|
- }
|
|
|
-
|
|
|
- if (delayVideo < audio_time)
|
|
|
- {
|
|
|
- delayVideo = audio_time;
|
|
|
- }
|
|
|
-
|
|
|
- if (delayVideo < 80)
|
|
|
- {
|
|
|
- okdelayVideo++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- okdelayVideo = 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (delayVideo > 120)
|
|
|
- {
|
|
|
- baddelayVideo++;
|
|
|
- }
|
|
|
-
|
|
|
- havedelayVideoCount++;
|
|
|
-
|
|
|
- if (havedelayVideoCount % 1000 == 0)
|
|
|
- {
|
|
|
- baddelayVideo = 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (!haveBack && self->rate == 3) {
|
|
|
-
|
|
|
- if (baddelayVideo > 10)
|
|
|
- {
|
|
|
- /*降低码率*/
|
|
|
- if (self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING/*BITRATE_HD*/ || self->rateForAuto == BITRATE_WIFI_HD)
|
|
|
- {
|
|
|
- if (self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING/*BITRATE_HD*/) {
|
|
|
- self->rateForAuto = BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/;
|
|
|
- } else {
|
|
|
- self->rateForAuto = BITRATE_WIFI_STANDARD_CLEARING;
|
|
|
- }
|
|
|
- }
|
|
|
- else if (self->rateForAuto == BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/ || self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING)
|
|
|
- {
|
|
|
- self->rateForAuto = BITRATE_EXTREME_SPEED;
|
|
|
- }
|
|
|
-// else if (mySelf->rateForAuto == BITRATE_HIGH_SPEED)
|
|
|
+// int audio_time = 0;
|
|
|
+// NSDate *nowTime = [NSDate date];
|
|
|
+// NSString *nowTimeStr = [NSString stringWithFormat:@"%f", (double)[nowTime timeIntervalSince1970]];
|
|
|
+// NSString *lastTimeStr = [NSString stringWithFormat:@"%f", (double)[lastVideoTome timeIntervalSince1970]];
|
|
|
+// audio_time = ([nowTimeStr doubleValue] - [lastTimeStr doubleValue]) * 1000;
|
|
|
+// lastVideoTome = nowTime;
|
|
|
+//
|
|
|
+// static int frameCount = 200;
|
|
|
+//
|
|
|
+// if (0 == frameCount)
|
|
|
+// {
|
|
|
+// frameCount = 200;
|
|
|
+//
|
|
|
+// if (audio_time > 500 && !haveBack && self->netWorkStates != 0)
|
|
|
+// {
|
|
|
+// self->netWorkStates = 0;
|
|
|
+// mainBlock(^{
|
|
|
+// [self->mPlayerView.controlBtn setBackgroundImage:[UIImage imageNamed:@"you_icon"] forState:(UIControlStateNormal)];
|
|
|
+// });
|
|
|
+// }
|
|
|
+// else if (audio_time > 100 && !haveBack && self->netWorkStates != 1)
|
|
|
+// {
|
|
|
+// self->netWorkStates = 1;
|
|
|
+// mainBlock(^{
|
|
|
+// [self->mPlayerView.controlBtn setBackgroundImage:[UIImage imageNamed:@"you_icon"] forState:(UIControlStateNormal)];
|
|
|
+// });
|
|
|
+// }
|
|
|
+// else if (!haveBack && self->netWorkStates != 2)
|
|
|
+// {
|
|
|
+// self->netWorkStates = 2;
|
|
|
+// mainBlock(^{
|
|
|
+// [self->mPlayerView.controlBtn setBackgroundImage:[UIImage imageNamed:@"you_icon"] forState:(UIControlStateNormal)];
|
|
|
+// });
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// frameCount--;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if (delayVideo < audio_time)
|
|
|
+// {
|
|
|
+// delayVideo = audio_time;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if (delayVideo < 80)
|
|
|
+// {
|
|
|
+// okdelayVideo++;
|
|
|
+// }
|
|
|
+// else
|
|
|
+// {
|
|
|
+// okdelayVideo = 0;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if (delayVideo > 120)
|
|
|
+// {
|
|
|
+// baddelayVideo++;
|
|
|
+// }
|
|
|
+//
|
|
|
+// havedelayVideoCount++;
|
|
|
+//
|
|
|
+// if (havedelayVideoCount % 1000 == 0)
|
|
|
+// {
|
|
|
+// baddelayVideo = 0;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if (!haveBack && self->rate == 3) {
|
|
|
+//
|
|
|
+// if (baddelayVideo > 10)
|
|
|
+// {
|
|
|
+// /*降低码率*/
|
|
|
+// if (self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING/*BITRATE_HD*/ || self->rateForAuto == BITRATE_WIFI_HD)
|
|
|
// {
|
|
|
-// mySelf->rateForAuto = BITRATE_EXTREME_SPEED;
|
|
|
-// NSString *dataStr = [RCCommandHelp commondResolution500WithType:mySelf->rateForAuto];
|
|
|
-// int result = send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
+// if (self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING/*BITRATE_HD*/) {
|
|
|
+// self->rateForAuto = BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/;
|
|
|
+// } else {
|
|
|
+// self->rateForAuto = BITRATE_WIFI_STANDARD_CLEARING;
|
|
|
+// }
|
|
|
// }
|
|
|
- NSString *dataStr = [RCCommandHelp commandResolution500WithType:self->rateForAuto];
|
|
|
-// send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
- [self.liveStreamManager rc_sendJsonData:[dataStr UTF8String]];
|
|
|
- baddelayVideo = 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (okdelayVideo > 1000)
|
|
|
- {
|
|
|
- /*上升码率*/
|
|
|
- if (self->rateForAuto == BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/ || self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING)
|
|
|
- {
|
|
|
- if (self->rateForAuto == BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/) {
|
|
|
- self->rateForAuto = BITRATE_WIFI_STANDARD_CLEARING/*BITRATE_HD*/;
|
|
|
- } else {
|
|
|
- self->rateForAuto = BITRATE_WIFI_HD;
|
|
|
- }
|
|
|
- }
|
|
|
-// else if (mySelf->rateForAuto == BITRATE_HIGH_SPEED)
|
|
|
+// else if (self->rateForAuto == BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/ || self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING)
|
|
|
// {
|
|
|
-// mySelf->rateForAuto = BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/;
|
|
|
-// NSString *dataStr = [RCCommandHelp commondResolution500WithType:mySelf->rateForAuto];
|
|
|
-// int result = send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
+// self->rateForAuto = BITRATE_EXTREME_SPEED;
|
|
|
// }
|
|
|
- else if (self->rateForAuto == BITRATE_EXTREME_SPEED)
|
|
|
- {
|
|
|
- if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi) {
|
|
|
- self->rateForAuto = BITRATE_WIFI_STANDARD_CLEARING;
|
|
|
- } else {
|
|
|
- self->rateForAuto = BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/;
|
|
|
- }
|
|
|
- }
|
|
|
- NSString *dataStr = [RCCommandHelp commandResolution500WithType:self->rateForAuto];
|
|
|
-// send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
- [self.liveStreamManager rc_sendJsonData:[dataStr UTF8String]];
|
|
|
- okdelayVideo = 0;
|
|
|
- }
|
|
|
- }
|
|
|
+//// else if (mySelf->rateForAuto == BITRATE_HIGH_SPEED)
|
|
|
+//// {
|
|
|
+//// mySelf->rateForAuto = BITRATE_EXTREME_SPEED;
|
|
|
+//// NSString *dataStr = [RCCommandHelp commondResolution500WithType:mySelf->rateForAuto];
|
|
|
+//// int result = send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
+//// }
|
|
|
+// NSString *dataStr = [RCCommandHelp commandResolution500WithType:self->rateForAuto];
|
|
|
+//// send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
+// [self.liveStreamManager rc_sendJsonData:[dataStr UTF8String]];
|
|
|
+// baddelayVideo = 0;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if (okdelayVideo > 1000)
|
|
|
+// {
|
|
|
+// /*上升码率*/
|
|
|
+// if (self->rateForAuto == BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/ || self->rateForAuto == BITRATE_WIFI_STANDARD_CLEARING)
|
|
|
+// {
|
|
|
+// if (self->rateForAuto == BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/) {
|
|
|
+// self->rateForAuto = BITRATE_WIFI_STANDARD_CLEARING/*BITRATE_HD*/;
|
|
|
+// } else {
|
|
|
+// self->rateForAuto = BITRATE_WIFI_HD;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//// else if (mySelf->rateForAuto == BITRATE_HIGH_SPEED)
|
|
|
+//// {
|
|
|
+//// mySelf->rateForAuto = BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/;
|
|
|
+//// NSString *dataStr = [RCCommandHelp commondResolution500WithType:mySelf->rateForAuto];
|
|
|
+//// int result = send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
+//// }
|
|
|
+// else if (self->rateForAuto == BITRATE_EXTREME_SPEED)
|
|
|
+// {
|
|
|
+// if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi) {
|
|
|
+// self->rateForAuto = BITRATE_WIFI_STANDARD_CLEARING;
|
|
|
+// } else {
|
|
|
+// self->rateForAuto = BITRATE_EXTREME_SPEED/*BITRATE_STANDARD_CLEARING*/;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// NSString *dataStr = [RCCommandHelp commandResolution500WithType:self->rateForAuto];
|
|
|
+//// send_data(mySelf->_ihandle, [dataStr UTF8String], (int)dataStr.length, 10.f);
|
|
|
+// [self.liveStreamManager rc_sendJsonData:[dataStr UTF8String]];
|
|
|
+// okdelayVideo = 0;
|
|
|
+// }
|
|
|
+// }
|
|
|
}
|
|
|
|
|
|
#pragma mark - opengl渲染
|
|
@@ -2437,7 +2430,7 @@ static int couneeee = 0;
|
|
|
|
|
|
- (void)textFieldDidEndEditing:(UITextField *)textField{
|
|
|
HLog(@"\n-----输入法透传 1111111 关闭键盘-------");
|
|
|
- NSString *dataStr = [RCCommandHelp commandClosePhoneKeyboad];
|
|
|
+ //NSString *dataStr = [RCCommandHelp commandClosePhoneKeyboad];
|
|
|
//[self.businessCommandChannelManager rc_sendData:dataStr];
|
|
|
}
|
|
|
|