From 97084dfa71ac606ae5e600d2a14989b30c9e371f Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 28 Mar 2011 09:27:33 +0200 Subject: [PATCH 001/122] add ffmpeg compilation --- .gitmodules | 9 +++++++ README | 1 + submodules/build/builders.d/ffmpeg.mk | 38 +++++++++++++++++++++++++++ submodules/externals/ffmpeg | 1 + submodules/externals/x264 | 1 + submodules/msx264 | 1 + 6 files changed, 51 insertions(+) create mode 100644 submodules/build/builders.d/ffmpeg.mk create mode 160000 submodules/externals/ffmpeg create mode 160000 submodules/externals/x264 create mode 160000 submodules/msx264 diff --git a/.gitmodules b/.gitmodules index adcac5915..2916841b5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,12 @@ [submodule "submodules/msamr"] path = submodules/msamr url = git://git.linphone.org/msamr.git +[submodule "submodules/externals/ffmpeg"] + path = submodules/externals/ffmpeg + url = git://git.videolan.org/ffmpeg +[submodule "submodules/externals/x264"] + path = submodules/externals/x264 + url = git://git.videolan.org/x264.git +[submodule "submodules/msx264"] + path = submodules/msx264 + url = git://git.linphone.org/msx264.git diff --git a/README b/README index c846c7a2a..edf5247c9 100644 --- a/README +++ b/README @@ -8,6 +8,7 @@ Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must inst -intltool -wget -pkgconfig +-gas-preposessor.pl (http://github.com/yuvi/gas-preprocessor/ ) Link macport libtoolize to glibtoolize (sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize) diff --git a/submodules/build/builders.d/ffmpeg.mk b/submodules/build/builders.d/ffmpeg.mk new file mode 100644 index 000000000..7bc7cf12e --- /dev/null +++ b/submodules/build/builders.d/ffmpeg.mk @@ -0,0 +1,38 @@ +ffmpeg_configure_options=\ + --disable-mmx \ + --enable-cross-compile \ + --disable-ffprobe --disable-ffserver --disable-avdevice \ + --disable-avfilter --disable-network \ + --disable-everything --enable-decoder=mpeg4 --enable-encoder=mpeg4 \ + --enable-decoder=h264 --disable-avformat --enable-armv6 --enable-armv6t2 \ + --enable-armvfp --enable-neon \ + --source-path=$(BUILDER_SRC_DIR)/$(ffmpeg_dir) \ + --cross-prefix=$$SDK_BIN_PATH/ \ + --sysroot=$$SYSROOT_PATH --arch=$$ARCH \ + --enable-static --disable-shared --target-os=darwin \ + --cpu=cortex-a8 --extra-cflags="-arch $$ARCH " --extra-ldflags="-arch $$ARCH -Wl,-syslibroot,$$SYSROOT_PATH " \ +# --as=$(BUILDER_SRC_DIR)/externals/x264/extras/gas-preprocessor.pl + +#--sysinclude=PATH location of cross-build system headers + +ffmpeg_dir?=externals/ffmpeg + +$(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/Makefile: $(BUILDER_SRC_DIR)/$(ffmpeg_dir)/configure + mkdir -p $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) + cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/ \ + && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ + && $(BUILDER_SRC_DIR)/$(ffmpeg_dir)/configure --prefix=$(prefix) $(ffmpeg_configure_options) + +build-ffmpeg: $(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/Makefile + cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install + +clean-ffmpeg: + cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && make clean + +veryclean-ffmpeg: + cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && make distclean + cd $(BUILDER_SRC_DIR)/$(ffmpeg_dir) && rm -f configure + +clean-makefile-ffmpeg: + cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && rm -f Makefile + diff --git a/submodules/externals/ffmpeg b/submodules/externals/ffmpeg new file mode 160000 index 000000000..907783f22 --- /dev/null +++ b/submodules/externals/ffmpeg @@ -0,0 +1 @@ +Subproject commit 907783f221ad9594a528681e30777705f11bf0b5 diff --git a/submodules/externals/x264 b/submodules/externals/x264 new file mode 160000 index 000000000..08d04a4d3 --- /dev/null +++ b/submodules/externals/x264 @@ -0,0 +1 @@ +Subproject commit 08d04a4d30b452faed3b763528611737d994b30b diff --git a/submodules/msx264 b/submodules/msx264 new file mode 160000 index 000000000..2e10820e9 --- /dev/null +++ b/submodules/msx264 @@ -0,0 +1 @@ +Subproject commit 2e10820e9c32fe75f049308d69e4164b46bc0d1a From 0bfd3319280bc08652691a01aba58439de7b02f3 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 10 Jun 2011 09:30:41 +0200 Subject: [PATCH 002/122] start video on ios --- .gitmodules | 2 +- Classes/LinphoneUI/LinphoneManager.m | 4 +++- submodules/build/builder-iphone-os.mk | 16 ++++++++-------- submodules/build/builders.d/ffmpeg.mk | 10 ++++++++-- submodules/build/iphone-config.site | 1 + submodules/liblinphone.xcodeproj/project.pbxproj | 6 ++++++ submodules/linphone | 2 +- 7 files changed, 28 insertions(+), 13 deletions(-) diff --git a/.gitmodules b/.gitmodules index 2916841b5..e4e7cdf6f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "submodules/linphone"] path = submodules/linphone - url = git://git.sv.gnu.org/linphone.git + url = gitosis@git.linphone.org:linphone-iphone-private.git [submodule "submodules/externals/osip"] path = submodules/externals/osip url = git://git.savannah.gnu.org/osip.git diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index d97d85b4b..056a48aa2 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -691,7 +691,9 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach otherButtonTitles:nil ,nil]; [error show]; } - + ms_warning("Linphone [%s] started on [%s]" + ,linphone_core_get_version() + ,[[UIDevice currentDevice].model cStringUsingEncoding:[NSString defaultCStringEncoding]] ); } -(void) becomeActive { diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 89565a6ad..0f2847ba2 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -23,14 +23,14 @@ host?=armv6-apple-darwin config_site:=iphone-config.site library_mode:= --disable-shared --enable-static -linphone_configure_controls= --disable-video \ +linphone_configure_controls= \ --with-readline=none \ --enable-gtk_ui=no \ --enable-ssl-hmac=no \ --enable-ssl=yes \ - --enable-macaqsnd=no \ - --enable-macsnd=no \ - --enable-iounit=yes \ + --disable-theora \ + --disable-sdl \ + --disable-x11 \ --with-gsm=$(prefix) \ SPEEX_CFLAGS="-I$(prefix)/include" \ SPEEXDSP_CFLAGS="-I$(prefix)/include" \ @@ -80,17 +80,17 @@ init: veryclean: rm -rf $(BUILDER_BUILD_DIR) -.NOTPARALLEL build-linphone: init build-openssl build-osip2 build-eXosip2 build-speex build-libgsm $(LINPHONE_BUILD_DIR)/Makefile +.NOTPARALLEL build-linphone: init build-openssl build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg $(LINPHONE_BUILD_DIR)/Makefile cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install -clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-msilbc clean-libilbc clean-openssl clean-msamr +clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-msilbc clean-libilbc clean-openssl clean-msamr clean-ffmpeg cd $(LINPHONE_BUILD_DIR) && make clean -veryclean-linphone: clean-linphone veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr +veryclean-linphone: clean-linphone veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr cd $(LINPHONE_BUILD_DIR) && make distclean cd $(LINPHONE_SRC_DIR) && rm -f configure -clean-makefile-linphone: clean-makefile-osip2 clean-makefile-eXosip2 clean-makefile-speex clean-makefile-libilbc clean-makefile-msilbc clean-makefile-openssl clean-makefile-msamr +clean-makefile-linphone: clean-makefile-osip2 clean-makefile-eXosip2 clean-makefile-speex clean-makefile-libilbc clean-makefile-msilbc clean-makefile-openssl clean-makefile-msamr clean-makefile-ffmpeg cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile diff --git a/submodules/build/builders.d/ffmpeg.mk b/submodules/build/builders.d/ffmpeg.mk index 7bc7cf12e..0d00f4177 100644 --- a/submodules/build/builders.d/ffmpeg.mk +++ b/submodules/build/builders.d/ffmpeg.mk @@ -5,16 +5,22 @@ ffmpeg_configure_options=\ --disable-avfilter --disable-network \ --disable-everything --enable-decoder=mpeg4 --enable-encoder=mpeg4 \ --enable-decoder=h264 --disable-avformat --enable-armv6 --enable-armv6t2 \ - --enable-armvfp --enable-neon \ + --enable-armvfp \ --source-path=$(BUILDER_SRC_DIR)/$(ffmpeg_dir) \ --cross-prefix=$$SDK_BIN_PATH/ \ --sysroot=$$SYSROOT_PATH --arch=$$ARCH \ --enable-static --disable-shared --target-os=darwin \ - --cpu=cortex-a8 --extra-cflags="-arch $$ARCH " --extra-ldflags="-arch $$ARCH -Wl,-syslibroot,$$SYSROOT_PATH " \ + --extra-cflags="-arch $$ARCH " --extra-ldflags="-arch $$ARCH -Wl,-syslibroot,$$SYSROOT_PATH " \ # --as=$(BUILDER_SRC_DIR)/externals/x264/extras/gas-preprocessor.pl #--sysinclude=PATH location of cross-build system headers +ifneq (,$(findstring armv6,$(host))) + ffmpeg_configure_options+= --cpu=arm1176jzf-s +endif +ifneq (,$(findstring armv7,$(host))) + ffmpeg_configure_options+= --enable-neon --cpu=cortex-a8 +endif ffmpeg_dir?=externals/ffmpeg $(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/Makefile: $(BUILDER_SRC_DIR)/$(ffmpeg_dir)/configure diff --git a/submodules/build/iphone-config.site b/submodules/build/iphone-config.site index fb13cfd87..62cf28585 100644 --- a/submodules/build/iphone-config.site +++ b/submodules/build/iphone-config.site @@ -24,6 +24,7 @@ SDK_BIN_PATH=/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin for SYSROOT_PATH in $SDK_PATH_LIST ; do echo $SYSROOT_PATH ; done ; echo "Selecting SDK path = ${SYSROOT_PATH}" CC="${SDK_BIN_PATH}/gcc-${GCC_VERSION} -std=c99 -arch ${ARCH} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE" +OBJC="${SDK_BIN_PATH}/gcc-${GCC_VERSION} -std=c99 -arch ${ARCH} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE" CXX="${SDK_BIN_PATH}/g++-${GCC_VERSION} -arch ${ARCH} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE" LD="${SDK_BIN_PATH}/ld-${GCC_VERSION} -arch ${ARCH}" AR=${SDK_BIN_PATH}/ar diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 799c3075f..2ede2b254 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 2203126F139F61990049A2ED /* ioscapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D15AB3139F505400C7713A /* ioscapture.m */; }; 222CA63211F6CF7600621220 /* allfilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5BE11F6CF7600621220 /* allfilters.h */; }; 222CA63311F6CF7600621220 /* dsptools.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5BF11F6CF7600621220 /* dsptools.h */; }; 222CA63411F6CF7600621220 /* dtmfgen.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5C011F6CF7600621220 /* dtmfgen.h */; }; @@ -343,6 +344,8 @@ 22A10B5411F84E2D00373793 /* toast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = toast.h; sourceTree = ""; }; 22A10B5511F84E2D00373793 /* unproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unproto.h; sourceTree = ""; }; 22A10EE711F8920F00373793 /* mswebcam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mswebcam.c; path = linphone/mediastreamer2/src/mswebcam.c; sourceTree = SOURCE_ROOT; }; + 22D15AB3139F505400C7713A /* ioscapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ioscapture.m; sourceTree = ""; }; + 22D15AB5139F579D00C7713A /* qtcapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = qtcapture.m; sourceTree = ""; }; AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblinphone_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -478,6 +481,8 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 22D15AB5139F579D00C7713A /* qtcapture.m */, + 22D15AB3139F505400C7713A /* ioscapture.m */, 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */, 222CA5DD11F6CF7600621220 /* .gitignore */, 222CA5DE11F6CF7600621220 /* _kiss_fft_guts.h */, @@ -909,6 +914,7 @@ 22A10EE811F8920F00373793 /* mswebcam.c in Sources */, 225D355A124B1FF60008581C /* linphonecall.c in Sources */, 2252935B12F6CA4700DD9BFB /* ec-calibrator.c in Sources */, + 2203126F139F61990049A2ED /* ioscapture.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 9a2914c42..04aac71ec 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 9a2914c429330ef06fadecd6691fccf55e3ade0a +Subproject commit 04aac71ecfe6f19aa5d0548fd701d87486c61378 From 09640da0c09b67016f508a0403ddf1f8ee744231 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 8 Jul 2011 18:06:50 +0200 Subject: [PATCH 003/122] start video integration --- Classes/ConsoleViewController.m | 25 +- Classes/LinphoneUI/LinphoneManager.m | 9 + Classes/LinphoneUI/LinphoneUIDelegates.h | 1 + Classes/PhoneViewController.h | 3 +- Classes/PhoneViewController.m | 9 +- Classes/VideoViewController.h | 32 ++ Classes/VideoViewController.m | 75 ++++ Classes/VideoViewController.xib | 281 ++++++++++++ linphone.xcodeproj/project.pbxproj | 45 ++ submodules/build/builders.d/ffmpeg.mk | 5 +- .../liblinphone.xcodeproj/project.pbxproj | 425 +++++++++++++++++- submodules/linphone | 2 +- 12 files changed, 888 insertions(+), 24 deletions(-) create mode 100644 Classes/VideoViewController.h create mode 100644 Classes/VideoViewController.m create mode 100644 Classes/VideoViewController.xib diff --git a/Classes/ConsoleViewController.m b/Classes/ConsoleViewController.m index bf2cbb1e1..36a01a466 100644 --- a/Classes/ConsoleViewController.m +++ b/Classes/ConsoleViewController.m @@ -1,14 +1,21 @@ -/* - * ConsoleViewController.h +/*ConsoleViewController.h * - * Description: + * Copyright (C) 2010 Belledonne Comunications, Grenoble, France * - * - * Belledonne Communications (C) 2010 - * - * Copyright: See COPYING file that comes with this distribution - * - */ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ #import "ConsoleViewController.h" diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 056a48aa2..c23e898ac 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -119,6 +119,15 @@ extern void libmsamr_init(); switch (new_state) { + case LinphoneCallStreamsRunning: + //check video + if (linphone_call_params_video_enabled(linphone_call_get_current_params(currentCall))) { + [callDelegate displayVideoCallFromUI:mCurrentViewController + forUser:lUserName + withDisplayName:lDisplayName]; + } + break; + case LinphoneCallIncomingReceived: [callDelegate displayIncomingCallNotigicationFromUI:mCurrentViewController forUser:lUserName diff --git a/Classes/LinphoneUI/LinphoneUIDelegates.h b/Classes/LinphoneUI/LinphoneUIDelegates.h index 425de9b46..03c7b5461 100644 --- a/Classes/LinphoneUI/LinphoneUIDelegates.h +++ b/Classes/LinphoneUI/LinphoneUIDelegates.h @@ -25,6 +25,7 @@ -(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; -(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; -(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayVideoCallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; //status reporting -(void) displayStatus:(NSString*) message; @end diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 8dd0c49cc..4eb0908bd 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -24,7 +24,7 @@ @class IncallViewController; @class FirstLoginViewController; - +@class VideoViewController; @interface PhoneViewController : UIViewController { @private @@ -66,6 +66,7 @@ UIActionSheet *mIncomingCallActionSheet; FirstLoginViewController* myFirstLoginViewController; + VideoViewController* mVideoViewController; } @property (nonatomic, retain) IBOutlet UIView* dialerView; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index c7da2c342..46667d7cf 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -22,7 +22,7 @@ #import #import #import "LinphoneManager.h" - +#import "VideoViewController.h" @implementation PhoneViewController @@ -121,6 +121,8 @@ [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; [erase initWithAddressField:address]; + mVideoViewController = [[VideoViewController alloc] initWithNibName:@"VideoViewController" + bundle:[NSBundle mainBundle]]; } @@ -210,6 +212,7 @@ [address setHidden:true]; [incallView setHidden:false]; [dialerView setHidden:true]; + } -(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayIncalViewforUser:username @@ -229,6 +232,10 @@ if ([speaker isOn]) [speaker toggle] ; //preset to off; } } + +-(void) displayVideoCallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + [self presentModalViewController:mVideoViewController animated:true]; +} //status reporting -(void) displayStatus:(NSString*) message { [status setText:message]; diff --git a/Classes/VideoViewController.h b/Classes/VideoViewController.h new file mode 100644 index 000000000..117404fce --- /dev/null +++ b/Classes/VideoViewController.h @@ -0,0 +1,32 @@ +/* VideoViewController.h + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#import +#import "UILinphone.h" + +@interface VideoViewController : UIViewController { + UIImageView* mDisplay; + UIMuteButton* mMute; + UIHangUpButton* mHangUp; + +} + +@property (nonatomic, retain) IBOutlet UIImageView* mDisplay; +@property (nonatomic, retain) IBOutlet UIMuteButton* mMute; +@property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUp; +@end \ No newline at end of file diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m new file mode 100644 index 000000000..9b03ae3f1 --- /dev/null +++ b/Classes/VideoViewController.m @@ -0,0 +1,75 @@ +/* VideoViewController.m + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "VideoViewController.h" +#import "LinphoneManager.h" + +@implementation VideoViewController +@synthesize mDisplay; +@synthesize mMute; +@synthesize mHangUp; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)dealloc +{ + [super dealloc]; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; + +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} +-(void) viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +@end diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib new file mode 100644 index 000000000..fa99aba3c --- /dev/null +++ b/Classes/VideoViewController.xib @@ -0,0 +1,281 @@ + + + + 1056 + 10J869 + 1305 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 300 + + + YES + IBUIButton + IBUIImageView + IBUIView + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 274 + {320, 400} + + + NO + IBCocoaTouchFramework + + + + 292 + {{13, 408}, {72, 37}} + + + NO + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + mute + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + + + 292 + {{98, 408}, {129, 37}} + + + NO + IBCocoaTouchFramework + 0 + 0 + + hangup + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + 292 + {{240, 408}, {72, 37}} + + + NO + IBCocoaTouchFramework + 0 + 0 + + 1 + switch + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + 292 + {{210, 278}, {102, 114}} + + + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + + + {{0, 20}, {320, 460}} + + + + 3 + MQA + + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 5 + + + display + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + preview + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 5.IBPluginDependency + 6.CustomClassName + 6.IBPluginDependency + 7.CustomClassName + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + VideoViewController + UIResponder + {{556, 412}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIMuteButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIHangUpButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 9 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 300 + + diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index e2c019e64..da7c60ed8 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -31,6 +31,11 @@ 22226C181181986A000CA27B /* contact-orange.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C161181986A000CA27B /* contact-orange.png */; }; 22226C191181986A000CA27B /* dialer-orange.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C171181986A000CA27B /* dialer-orange.png */; }; 22226C1D11819B34000CA27B /* history-orange.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C1C11819B34000CA27B /* history-orange.png */; }; + 22276E8313C73D3100210156 /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8013C73D3100210156 /* libavcodec.a */; }; + 22276E8413C73D3100210156 /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8113C73D3100210156 /* libavutil.a */; }; + 22276E8513C73D3100210156 /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8213C73D3100210156 /* libswscale.a */; }; + 22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; }; + 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; }; 222A483412F7176F0075F07F /* IncallViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 222A483112F7176F0075F07F /* IncallViewController.xib */; }; 223148E41178A08200637D6A /* libilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E31178A08200637D6A /* libilbc.a */; }; 223148E61178A09900637D6A /* libmsilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E51178A09900637D6A /* libmsilbc.a */; }; @@ -71,6 +76,8 @@ 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */; }; 22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22C7555F1317E59C007BC101 /* UIBluetoothButton.m */; }; 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; + 22E028B713B4CCBD0068A713 /* VideoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E028B513B4CCBD0068A713 /* VideoViewController.m */; }; + 22E028B813B4CCBD0068A713 /* VideoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E028B613B4CCBD0068A713 /* VideoViewController.xib */; }; 22E0A785111C1BA800B04932 /* Speaker-32-on.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A783111C1BA800B04932 /* Speaker-32-on.png */; }; 22E0A786111C1BA800B04932 /* Speaker-32-off.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A784111C1BA800B04932 /* Speaker-32-off.png */; }; 22E0A822111C44E100B04932 /* MoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81C111C44E100B04932 /* MoreViewController.m */; }; @@ -94,6 +101,13 @@ remoteGlobalIDString = D2AAC07E0554694100DB518D; remoteInfo = liblinphone; }; + 22DD19DE13A8D7FB0018ECD4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 22DD19BE13A8D7FA0018ECD4; + remoteInfo = mediastream; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -250,6 +264,11 @@ 22226C161181986A000CA27B /* contact-orange.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "contact-orange.png"; path = "liblinphone-sdk/apple-darwin/share/pixmaps/linphone/contact-orange.png"; sourceTree = ""; }; 22226C171181986A000CA27B /* dialer-orange.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dialer-orange.png"; path = "liblinphone-sdk/apple-darwin/share/pixmaps/linphone/dialer-orange.png"; sourceTree = ""; }; 22226C1C11819B34000CA27B /* history-orange.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "history-orange.png"; path = "liblinphone-sdk/apple-darwin/share/pixmaps/linphone/history-orange.png"; sourceTree = ""; }; + 22276E8013C73D3100210156 /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavcodec.a; path = "liblinphone-sdk/apple-darwin/lib/libavcodec.a"; sourceTree = ""; }; + 22276E8113C73D3100210156 /* libavutil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavutil.a; path = "liblinphone-sdk/apple-darwin/lib/libavutil.a"; sourceTree = ""; }; + 22276E8213C73D3100210156 /* libswscale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libswscale.a; path = "liblinphone-sdk/apple-darwin/lib/libswscale.a"; sourceTree = ""; }; + 22276E8613C73D8A00210156 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + 22276E8813C73DC000210156 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; 222A483112F7176F0075F07F /* IncallViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IncallViewController.xib; sourceTree = ""; }; 222A483212F7176F0075F07F /* IncallViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncallViewController.m; sourceTree = ""; }; 222A483312F7176F0075F07F /* IncallViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncallViewController.h; sourceTree = ""; }; @@ -375,6 +394,9 @@ 22C7564A13265C6A007BC101 /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = ""; }; 22C7564B13265C6A007BC101 /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = ""; }; 22D1B68012A3E0BE001AE361 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; + 22E028B413B4CCBD0068A713 /* VideoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoViewController.h; sourceTree = ""; }; + 22E028B513B4CCBD0068A713 /* VideoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoViewController.m; sourceTree = ""; }; + 22E028B613B4CCBD0068A713 /* VideoViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoViewController.xib; sourceTree = ""; }; 22E0A783111C1BA800B04932 /* Speaker-32-on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Speaker-32-on.png"; path = "Resources/Speaker-32-on.png"; sourceTree = ""; }; 22E0A784111C1BA800B04932 /* Speaker-32-off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Speaker-32-off.png"; path = "Resources/Speaker-32-off.png"; sourceTree = ""; }; 22E0A81B111C44E100B04932 /* MoreViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MoreViewController.xib; sourceTree = ""; }; @@ -402,6 +424,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */, + 22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */, + 22276E8313C73D3100210156 /* libavcodec.a in Frameworks */, + 22276E8413C73D3100210156 /* libavutil.a in Frameworks */, + 22276E8513C73D3100210156 /* libswscale.a in Frameworks */, 22E5B0AF133B5EA20044EA25 /* libssl.a in Frameworks */, 22E5B0B0133B5EA20044EA25 /* libcrypto.a in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, @@ -461,6 +488,9 @@ 227BCDC110D4004600FBFD76 /* CallHistoryTableViewController.xib */, 2242D9C710D691F900E9963F /* GenericTabViewController.h */, 2242D9C810D691F900E9963F /* GenericTabViewController.m */, + 22E028B413B4CCBD0068A713 /* VideoViewController.h */, + 22E028B513B4CCBD0068A713 /* VideoViewController.m */, + 22E028B613B4CCBD0068A713 /* VideoViewController.xib */, ); path = Classes; sourceTree = ""; @@ -697,6 +727,7 @@ isa = PBXGroup; children = ( 22A10DA311F88C1F00373793 /* liblinphone.a */, + 22DD19DF13A8D7FB0018ECD4 /* mediastream.app */, ); name = Products; sourceTree = ""; @@ -782,6 +813,11 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 22276E8813C73DC000210156 /* CoreMedia.framework */, + 22276E8613C73D8A00210156 /* CoreVideo.framework */, + 22276E8013C73D3100210156 /* libavcodec.a */, + 22276E8113C73D3100210156 /* libavutil.a */, + 22276E8213C73D3100210156 /* libswscale.a */, 2214783B1386A2030020F8B8 /* Localizable.strings */, 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */, 223148E51178A09900637D6A /* libmsilbc.a */, @@ -931,6 +967,13 @@ remoteRef = 22A10DA211F88C1F00373793 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 22DD19DF13A8D7FB0018ECD4 /* mediastream.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = mediastream.app; + remoteRef = 22DD19DE13A8D7FB0018ECD4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -970,6 +1013,7 @@ 228B19AF130290C500F154D3 /* iTunesArtwork in Resources */, 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */, 22E19E48138A67A000FBFE87 /* missed_call.png in Resources */, + 22E028B813B4CCBD0068A713 /* VideoViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1000,6 +1044,7 @@ 22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */, 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */, 223963171393CFAF001DE689 /* FastAddressBook.m in Sources */, + 22E028B713B4CCBD0068A713 /* VideoViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/build/builders.d/ffmpeg.mk b/submodules/build/builders.d/ffmpeg.mk index 0d00f4177..4ca60c237 100644 --- a/submodules/build/builders.d/ffmpeg.mk +++ b/submodules/build/builders.d/ffmpeg.mk @@ -3,8 +3,8 @@ ffmpeg_configure_options=\ --enable-cross-compile \ --disable-ffprobe --disable-ffserver --disable-avdevice \ --disable-avfilter --disable-network \ - --disable-everything --enable-decoder=mpeg4 --enable-encoder=mpeg4 \ - --enable-decoder=h264 --disable-avformat --enable-armv6 --enable-armv6t2 \ + --disable-everything --enable-decoder=mjpeg --enable-encoder=mjpeg --enable-decoder=mpeg4 --enable-encoder=mpeg4 \ + --enable-decoder=h264 --disable-avformat --enable-armv5te --enable-armv6 --enable-armv6t2 \ --enable-armvfp \ --source-path=$(BUILDER_SRC_DIR)/$(ffmpeg_dir) \ --cross-prefix=$$SDK_BIN_PATH/ \ @@ -37,7 +37,6 @@ clean-ffmpeg: veryclean-ffmpeg: cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && make distclean - cd $(BUILDER_SRC_DIR)/$(ffmpeg_dir) && rm -f configure clean-makefile-ffmpeg: cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && rm -f Makefile diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 2ede2b254..1a80de476 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -8,6 +8,30 @@ /* Begin PBXBuildFile section */ 2203126F139F61990049A2ED /* ioscapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D15AB3139F505400C7713A /* ioscapture.m */; }; + 2203127213A247B50049A2ED /* iosdisplay.h in Headers */ = {isa = PBXBuildFile; fileRef = 2203127013A247B40049A2ED /* iosdisplay.h */; }; + 2203127313A247B50049A2ED /* iosdisplay.m in Sources */ = {isa = PBXBuildFile; fileRef = 2203127113A247B40049A2ED /* iosdisplay.m */; }; + 2203127613A249F70049A2ED /* filter-template.c in Sources */ = {isa = PBXBuildFile; fileRef = 2203127413A249F70049A2ED /* filter-template.c */; }; + 220ED19A13A8F87700AC21E0 /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED19713A8F87700AC21E0 /* libspeexdsp.a */; }; + 220ED19B13A8F87700AC21E0 /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED19813A8F87700AC21E0 /* libspeex.a */; }; + 220ED19C13A8F87700AC21E0 /* libortp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED19913A8F87700AC21E0 /* libortp.a */; }; + 220ED19D13A9033F00AC21E0 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2AAC07E0554694100DB518D /* liblinphone.a */; }; + 220ED19F13A9038F00AC21E0 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED19E13A9038F00AC21E0 /* CoreVideo.framework */; }; + 220ED1A113A9039600AC21E0 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A013A9039600AC21E0 /* CoreAudio.framework */; }; + 220ED1A313A903BF00AC21E0 /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A213A903BF00AC21E0 /* libgsm.a */; }; + 220ED1A713A9040700AC21E0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A613A9040700AC21E0 /* AudioToolbox.framework */; }; + 220ED1A913A9041800AC21E0 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A813A9041800AC21E0 /* AVFoundation.framework */; }; + 220ED1AC13A9062600AC21E0 /* nowebcam.h in Headers */ = {isa = PBXBuildFile; fileRef = 220ED1AA13A9062500AC21E0 /* nowebcam.h */; }; + 220ED1AD13A9062600AC21E0 /* nowebcam.c in Sources */ = {isa = PBXBuildFile; fileRef = 220ED1AB13A9062500AC21E0 /* nowebcam.c */; }; + 221F589C13AB4FC500D603C9 /* msvideo.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F589B13AB4FC500D603C9 /* msvideo.c */; }; + 221F58A013AB50F800D603C9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 221F589F13AB50F800D603C9 /* CoreMedia.framework */; }; + 221F58A213AB6F8100D603C9 /* pixconv.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58A113AB6F8000D603C9 /* pixconv.c */; }; + 221F58A413AB708C00D603C9 /* alldescs.h in Headers */ = {isa = PBXBuildFile; fileRef = 221F58A313AB708C00D603C9 /* alldescs.h */; }; + 221F58A813AB716400D603C9 /* tonedetector.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58A513AB716300D603C9 /* tonedetector.c */; }; + 221F58A913AB716400D603C9 /* jpegwriter.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58A613AB716300D603C9 /* jpegwriter.c */; }; + 221F58AA13AB716400D603C9 /* h264dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58A713AB716300D603C9 /* h264dec.c */; }; + 221F58AC13AB71A400D603C9 /* sizeconv.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58AB13AB71A400D603C9 /* sizeconv.c */; }; + 221F58AE13ABA42800D603C9 /* scaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58AD13ABA42800D603C9 /* scaler.c */; }; + 221F58E413AF44B300D603C9 /* scaler.h in Headers */ = {isa = PBXBuildFile; fileRef = 221F58E313AF44B300D603C9 /* scaler.h */; }; 222CA63211F6CF7600621220 /* allfilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5BE11F6CF7600621220 /* allfilters.h */; }; 222CA63311F6CF7600621220 /* dsptools.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5BF11F6CF7600621220 /* dsptools.h */; }; 222CA63411F6CF7600621220 /* dtmfgen.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5C011F6CF7600621220 /* dtmfgen.h */; }; @@ -43,8 +67,6 @@ 222CA65511F6CF7600621220 /* chanadapt.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5E511F6CF7600621220 /* chanadapt.c */; }; 222CA65711F6CF7600621220 /* dsptools.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5E711F6CF7600621220 /* dsptools.c */; }; 222CA65811F6CF7600621220 /* dtmfgen.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5E811F6CF7600621220 /* dtmfgen.c */; }; - 222CA65911F6CF7600621220 /* dxfilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5E911F6CF7600621220 /* dxfilter.cpp */; }; - 222CA65A11F6CF7600621220 /* dxfilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA5EA11F6CF7600621220 /* dxfilter.h */; }; 222CA65B11F6CF7600621220 /* equalizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5EB11F6CF7600621220 /* equalizer.c */; }; 222CA65C11F6CF7600621220 /* eventqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5EC11F6CF7600621220 /* eventqueue.c */; }; 222CA65D11F6CF7600621220 /* extdisplay.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA5ED11F6CF7600621220 /* extdisplay.c */; }; @@ -151,6 +173,13 @@ 222CA78511F6CFB100621220 /* sipsetup.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA76311F6CFB100621220 /* sipsetup.c */; }; 222CA78611F6CFB100621220 /* sipsetup.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA76411F6CFB100621220 /* sipsetup.h */; }; 2252935B12F6CA4700DD9BFB /* ec-calibrator.c in Sources */ = {isa = PBXBuildFile; fileRef = 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */; }; + 2258C44113A9377B0087A596 /* swscale.h in Headers */ = {isa = PBXBuildFile; fileRef = 2258C44013A9377B0087A596 /* swscale.h */; }; + 2258C44513A945520087A596 /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2258C44213A945520087A596 /* libswscale.a */; }; + 2258C44613A945520087A596 /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2258C44313A945520087A596 /* libavutil.a */; }; + 2258C44713A945520087A596 /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2258C44413A945520087A596 /* libavcodec.a */; }; + 2258C44B13A946890087A596 /* videostream.c in Sources */ = {isa = PBXBuildFile; fileRef = 2258C44813A946890087A596 /* videostream.c */; }; + 2258C44C13A946890087A596 /* videoenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 2258C44913A946890087A596 /* videoenc.c */; }; + 2258C44D13A946890087A596 /* videodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2258C44A13A946890087A596 /* videodec.c */; }; 225D355A124B1FF60008581C /* linphonecall.c in Sources */ = {isa = PBXBuildFile; fileRef = 225D3559124B1FF60008581C /* linphonecall.c */; }; 229B9D5913043EAB00EFCD1C /* linphonecore_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */; }; 22A10B5611F84E2D00373793 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B4F11F84E2D00373793 /* config.h */; }; @@ -160,11 +189,59 @@ 22A10B5A11F84E2D00373793 /* toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5411F84E2D00373793 /* toast.h */; }; 22A10B5B11F84E2D00373793 /* unproto.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5511F84E2D00373793 /* unproto.h */; }; 22A10EE811F8920F00373793 /* mswebcam.c in Sources */ = {isa = PBXBuildFile; fileRef = 22A10EE711F8920F00373793 /* mswebcam.c */; }; + 22B5106913B060E100CD87DA /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 22B5106813AFD37B00CD87DA /* nowebcamCIF.jpg */; }; + 22DD19C113A8D7FA0018ECD4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22DD19C013A8D7FA0018ECD4 /* UIKit.framework */; }; + 22DD19C213A8D7FA0018ECD4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; + 22DD19C413A8D7FA0018ECD4 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22DD19C313A8D7FA0018ECD4 /* CoreGraphics.framework */; }; + 22DD19F713A8DFA70018ECD4 /* mediastream.c in Sources */ = {isa = PBXBuildFile; fileRef = 22DD19E713A8D82C0018ECD4 /* mediastream.c */; }; + 22DD21AE13A8E3310018ECD4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 22DD21A113A8E3310018ECD4 /* InfoPlist.strings */; }; + 22DD21AF13A8E3310018ECD4 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22DD21A313A8E3310018ECD4 /* MainWindow.xib */; }; + 22DD21B013A8E3310018ECD4 /* mediastreamViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22DD21A513A8E3310018ECD4 /* mediastreamViewController.xib */; }; + 22DD21B213A8E3310018ECD4 /* mediastream-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22DD21A813A8E3310018ECD4 /* mediastream-Info.plist */; }; + 22DD21B313A8E3310018ECD4 /* mediastreamAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AB13A8E3310018ECD4 /* mediastreamAppDelegate.m */; }; + 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; AA747D9F0F9514B9006C5449 /* liblinphone_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */; }; AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 220ED19513A8F82A00AC21E0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2AAC07D0554694100DB518D; + remoteInfo = liblinphone; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ + 2203127013A247B40049A2ED /* iosdisplay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iosdisplay.h; sourceTree = ""; }; + 2203127113A247B40049A2ED /* iosdisplay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iosdisplay.m; sourceTree = ""; }; + 2203127413A249F70049A2ED /* filter-template.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "filter-template.c"; sourceTree = ""; }; + 220ED19713A8F87700AC21E0 /* libspeexdsp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspeexdsp.a; path = "../liblinphone-sdk/apple-darwin/lib/libspeexdsp.a"; sourceTree = ""; }; + 220ED19813A8F87700AC21E0 /* libspeex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspeex.a; path = "../liblinphone-sdk/apple-darwin/lib/libspeex.a"; sourceTree = ""; }; + 220ED19913A8F87700AC21E0 /* libortp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libortp.a; path = "../liblinphone-sdk/apple-darwin/lib/libortp.a"; sourceTree = ""; }; + 220ED19E13A9038F00AC21E0 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + 220ED1A013A9039600AC21E0 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 220ED1A213A903BF00AC21E0 /* libgsm.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgsm.a; path = "../liblinphone-sdk/apple-darwin/lib/libgsm.a"; sourceTree = ""; }; + 220ED1A413A903E100AC21E0 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; + 220ED1A613A9040700AC21E0 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 220ED1A813A9041800AC21E0 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 220ED1AA13A9062500AC21E0 /* nowebcam.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nowebcam.h; sourceTree = ""; }; + 220ED1AB13A9062500AC21E0 /* nowebcam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nowebcam.c; sourceTree = ""; }; + 221F589913AB4EEE00D603C9 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; + 221F589B13AB4FC500D603C9 /* msvideo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msvideo.c; sourceTree = ""; }; + 221F589D13AB503F00D603C9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + 221F589F13AB50F800D603C9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 221F58A113AB6F8000D603C9 /* pixconv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pixconv.c; sourceTree = ""; }; + 221F58A313AB708C00D603C9 /* alldescs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = alldescs.h; path = build/iphone/alldescs.h; sourceTree = ""; }; + 221F58A513AB716300D603C9 /* tonedetector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tonedetector.c; sourceTree = ""; }; + 221F58A613AB716300D603C9 /* jpegwriter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpegwriter.c; sourceTree = ""; }; + 221F58A713AB716300D603C9 /* h264dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = h264dec.c; sourceTree = ""; }; + 221F58AB13AB71A400D603C9 /* sizeconv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sizeconv.c; sourceTree = ""; }; + 221F58AD13ABA42800D603C9 /* scaler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scaler.c; sourceTree = ""; }; + 221F58E313AF44B300D603C9 /* scaler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scaler.h; sourceTree = ""; }; + 22276E7F13C4637100210156 /* msandroidvideo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = msandroidvideo.cpp; path = "../../../../../../workspace-iphone-port/linphone-iphone-tunnel/submodules/linphone/mediastreamer2/src/msandroidvideo.cpp"; sourceTree = ""; }; 222CA5B911F6CF7600621220 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; 222CA5BA11F6CF7600621220 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; 222CA5BB11F6CF7600621220 /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; @@ -207,8 +284,6 @@ 222CA5E511F6CF7600621220 /* chanadapt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = chanadapt.c; sourceTree = ""; }; 222CA5E711F6CF7600621220 /* dsptools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dsptools.c; sourceTree = ""; }; 222CA5E811F6CF7600621220 /* dtmfgen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dtmfgen.c; sourceTree = ""; }; - 222CA5E911F6CF7600621220 /* dxfilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dxfilter.cpp; sourceTree = ""; }; - 222CA5EA11F6CF7600621220 /* dxfilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dxfilter.h; sourceTree = ""; }; 222CA5EB11F6CF7600621220 /* equalizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = equalizer.c; sourceTree = ""; }; 222CA5EC11F6CF7600621220 /* eventqueue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventqueue.c; sourceTree = ""; }; 222CA5ED11F6CF7600621220 /* extdisplay.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = extdisplay.c; sourceTree = ""; }; @@ -334,6 +409,13 @@ 222CA76311F6CFB100621220 /* sipsetup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sipsetup.c; sourceTree = ""; }; 222CA76411F6CFB100621220 /* sipsetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sipsetup.h; sourceTree = ""; }; 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ec-calibrator.c"; path = "linphone/coreapi/ec-calibrator.c"; sourceTree = SOURCE_ROOT; }; + 2258C44013A9377B0087A596 /* swscale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = swscale.h; sourceTree = ""; }; + 2258C44213A945520087A596 /* libswscale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libswscale.a; path = "../liblinphone-sdk/apple-darwin/lib/libswscale.a"; sourceTree = ""; }; + 2258C44313A945520087A596 /* libavutil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavutil.a; path = "../liblinphone-sdk/apple-darwin/lib/libavutil.a"; sourceTree = ""; }; + 2258C44413A945520087A596 /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavcodec.a; path = "../liblinphone-sdk/apple-darwin/lib/libavcodec.a"; sourceTree = ""; }; + 2258C44813A946890087A596 /* videostream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = videostream.c; sourceTree = ""; }; + 2258C44913A946890087A596 /* videoenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = videoenc.c; sourceTree = ""; }; + 2258C44A13A946890087A596 /* videodec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = videodec.c; sourceTree = ""; }; 225D3559124B1FF60008581C /* linphonecall.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linphonecall.c; sourceTree = ""; }; 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphonecore_utils.h; sourceTree = ""; }; 22A10B4F11F84E2D00373793 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; @@ -344,14 +426,51 @@ 22A10B5411F84E2D00373793 /* toast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = toast.h; sourceTree = ""; }; 22A10B5511F84E2D00373793 /* unproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unproto.h; sourceTree = ""; }; 22A10EE711F8920F00373793 /* mswebcam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mswebcam.c; path = linphone/mediastreamer2/src/mswebcam.c; sourceTree = SOURCE_ROOT; }; + 22B5106813AFD37B00CD87DA /* nowebcamCIF.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = nowebcamCIF.jpg; path = src/nowebcamCIF.jpg; sourceTree = ""; }; 22D15AB3139F505400C7713A /* ioscapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ioscapture.m; sourceTree = ""; }; 22D15AB5139F579D00C7713A /* qtcapture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = qtcapture.m; sourceTree = ""; }; + 22DD19BE13A8D7FA0018ECD4 /* mediastream.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mediastream.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 22DD19C013A8D7FA0018ECD4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 22DD19C313A8D7FA0018ECD4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 22DD19E713A8D82C0018ECD4 /* mediastream.c */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; fileEncoding = 4; path = mediastream.c; sourceTree = ""; }; + 22DD21A213A8E3310018ECD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 22DD21A413A8E3310018ECD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = ""; }; + 22DD21A613A8E3310018ECD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/mediastreamViewController.xib; sourceTree = ""; }; + 22DD21A813A8E3310018ECD4 /* mediastream-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "mediastream-Info.plist"; sourceTree = ""; }; + 22DD21A913A8E3310018ECD4 /* mediastream-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mediastream-Prefix.pch"; sourceTree = ""; }; + 22DD21AA13A8E3310018ECD4 /* mediastreamAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mediastreamAppDelegate.h; sourceTree = ""; }; + 22DD21AB13A8E3310018ECD4 /* mediastreamAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamAppDelegate.m; sourceTree = ""; }; + 22DD21AC13A8E3310018ECD4 /* mediastreamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mediastreamViewController.h; sourceTree = ""; }; + 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblinphone_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 22DD19BB13A8D7FA0018ECD4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 221F58A013AB50F800D603C9 /* CoreMedia.framework in Frameworks */, + 2258C44513A945520087A596 /* libswscale.a in Frameworks */, + 2258C44613A945520087A596 /* libavutil.a in Frameworks */, + 2258C44713A945520087A596 /* libavcodec.a in Frameworks */, + 220ED1A913A9041800AC21E0 /* AVFoundation.framework in Frameworks */, + 220ED1A713A9040700AC21E0 /* AudioToolbox.framework in Frameworks */, + 220ED1A313A903BF00AC21E0 /* libgsm.a in Frameworks */, + 220ED19F13A9038F00AC21E0 /* CoreVideo.framework in Frameworks */, + 220ED1A113A9039600AC21E0 /* CoreAudio.framework in Frameworks */, + 220ED19D13A9033F00AC21E0 /* liblinphone.a in Frameworks */, + 220ED19A13A8F87700AC21E0 /* libspeexdsp.a in Frameworks */, + 220ED19B13A8F87700AC21E0 /* libspeex.a in Frameworks */, + 220ED19C13A8F87700AC21E0 /* libortp.a in Frameworks */, + 22DD19C113A8D7FA0018ECD4 /* UIKit.framework in Frameworks */, + 22DD19C213A8D7FA0018ECD4 /* Foundation.framework in Frameworks */, + 22DD19C413A8D7FA0018ECD4 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D2AAC07C0554694100DB518D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -366,7 +485,7 @@ 034768DFFF38A50411DB9C8B /* Products */ = { isa = PBXGroup; children = ( - D2AAC07E0554694100DB518D /* liblinphone.a */, + 22DD19BE13A8D7FA0018ECD4 /* mediastream.app */, ); name = Products; sourceTree = ""; @@ -374,6 +493,22 @@ 0867D691FE84028FC02AAC07 /* liblinphone */ = { isa = PBXGroup; children = ( + 221F589F13AB50F800D603C9 /* CoreMedia.framework */, + 221F589D13AB503F00D603C9 /* CoreVideo.framework */, + 221F589913AB4EEE00D603C9 /* CoreFoundation.framework */, + 2258C44213A945520087A596 /* libswscale.a */, + 2258C44313A945520087A596 /* libavutil.a */, + 2258C44413A945520087A596 /* libavcodec.a */, + 220ED1A813A9041800AC21E0 /* AVFoundation.framework */, + 220ED1A613A9040700AC21E0 /* AudioToolbox.framework */, + 220ED1A413A903E100AC21E0 /* AudioUnit.framework */, + 220ED1A213A903BF00AC21E0 /* libgsm.a */, + 220ED1A013A9039600AC21E0 /* CoreAudio.framework */, + 220ED19E13A9038F00AC21E0 /* CoreVideo.framework */, + D2AAC07E0554694100DB518D /* liblinphone.a */, + 220ED19713A8F87700AC21E0 /* libspeexdsp.a */, + 220ED19813A8F87700AC21E0 /* libspeex.a */, + 220ED19913A8F87700AC21E0 /* libortp.a */, 22A10B4C11F84DE300373793 /* externals */, 222CA4D011F6CF2D00621220 /* linphone */, 222CA4CF11F6CF2000621220 /* mediastreamer2 */, @@ -390,6 +525,8 @@ isa = PBXGroup; children = ( AACBBE490F95108600F1A2B1 /* Foundation.framework */, + 22DD19C013A8D7FA0018ECD4 /* UIKit.framework */, + 22DD19C313A8D7FA0018ECD4 /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; @@ -414,6 +551,9 @@ 222CA4CF11F6CF2000621220 /* mediastreamer2 */ = { isa = PBXGroup; children = ( + 22B5106813AFD37B00CD87DA /* nowebcamCIF.jpg */, + 221F58A313AB708C00D603C9 /* alldescs.h */, + 22DD19E013A8D82C0018ECD4 /* tests */, 222CA5B811F6CF7600621220 /* include */, 222CA5DC11F6CF7600621220 /* src */, ); @@ -481,6 +621,20 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 22276E7F13C4637100210156 /* msandroidvideo.cpp */, + 221F58AD13ABA42800D603C9 /* scaler.c */, + 221F58AB13AB71A400D603C9 /* sizeconv.c */, + 221F58A513AB716300D603C9 /* tonedetector.c */, + 221F58A613AB716300D603C9 /* jpegwriter.c */, + 221F58A713AB716300D603C9 /* h264dec.c */, + 221F58A113AB6F8000D603C9 /* pixconv.c */, + 221F589B13AB4FC500D603C9 /* msvideo.c */, + 2258C44813A946890087A596 /* videostream.c */, + 2258C44913A946890087A596 /* videoenc.c */, + 2258C44A13A946890087A596 /* videodec.c */, + 2258C44013A9377B0087A596 /* swscale.h */, + 220ED1AA13A9062500AC21E0 /* nowebcam.h */, + 220ED1AB13A9062500AC21E0 /* nowebcam.c */, 22D15AB5139F579D00C7713A /* qtcapture.m */, 22D15AB3139F505400C7713A /* ioscapture.m */, 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */, @@ -492,8 +646,6 @@ 222CA5E511F6CF7600621220 /* chanadapt.c */, 222CA5E711F6CF7600621220 /* dsptools.c */, 222CA5E811F6CF7600621220 /* dtmfgen.c */, - 222CA5E911F6CF7600621220 /* dxfilter.cpp */, - 222CA5EA11F6CF7600621220 /* dxfilter.h */, 222CA5EB11F6CF7600621220 /* equalizer.c */, 222CA5EC11F6CF7600621220 /* eventqueue.c */, 222CA5ED11F6CF7600621220 /* extdisplay.c */, @@ -531,6 +683,10 @@ 222CA62311F6CF7600621220 /* ulaw.c */, 222CA62411F6CF7600621220 /* vfw-missing.h */, 222CA62911F6CF7600621220 /* void.c */, + 2203127013A247B40049A2ED /* iosdisplay.h */, + 2203127113A247B40049A2ED /* iosdisplay.m */, + 2203127413A249F70049A2ED /* filter-template.c */, + 221F58E313AF44B300D603C9 /* scaler.h */, ); path = src; sourceTree = ""; @@ -693,6 +849,31 @@ path = externals/gsm/inc; sourceTree = ""; }; + 22DD19E013A8D82C0018ECD4 /* tests */ = { + isa = PBXGroup; + children = ( + 22DD21A013A8E3310018ECD4 /* ios */, + 22DD19E713A8D82C0018ECD4 /* mediastream.c */, + ); + path = tests; + sourceTree = ""; + }; + 22DD21A013A8E3310018ECD4 /* ios */ = { + isa = PBXGroup; + children = ( + 22DD21A113A8E3310018ECD4 /* InfoPlist.strings */, + 22DD21A313A8E3310018ECD4 /* MainWindow.xib */, + 22DD21A513A8E3310018ECD4 /* mediastreamViewController.xib */, + 22DD21A813A8E3310018ECD4 /* mediastream-Info.plist */, + 22DD21A913A8E3310018ECD4 /* mediastream-Prefix.pch */, + 22DD21AA13A8E3310018ECD4 /* mediastreamAppDelegate.h */, + 22DD21AB13A8E3310018ECD4 /* mediastreamAppDelegate.m */, + 22DD21AC13A8E3310018ECD4 /* mediastreamViewController.h */, + 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */, + ); + path = ios; + sourceTree = ""; + }; 32C88DFF0371C24200C91783 /* Other Sources */ = { isa = PBXGroup; children = ( @@ -738,7 +919,6 @@ 222CA64C11F6CF7600621220 /* rfc3984.h in Headers */, 222CA64D11F6CF7600621220 /* waveheader.h in Headers */, 222CA64E11F6CF7600621220 /* _kiss_fft_guts.h in Headers */, - 222CA65A11F6CF7600621220 /* dxfilter.h in Headers */, 222CA65E11F6CF7600621220 /* ffmpeg-priv.h in Headers */, 222CA65F11F6CF7600621220 /* g711common.h in Headers */, 222CA66511F6CF7600621220 /* kiss_fft.h in Headers */, @@ -781,12 +961,35 @@ 22A10B5A11F84E2D00373793 /* toast.h in Headers */, 22A10B5B11F84E2D00373793 /* unproto.h in Headers */, 229B9D5913043EAB00EFCD1C /* linphonecore_utils.h in Headers */, + 2203127213A247B50049A2ED /* iosdisplay.h in Headers */, + 220ED1AC13A9062600AC21E0 /* nowebcam.h in Headers */, + 2258C44113A9377B0087A596 /* swscale.h in Headers */, + 221F58A413AB708C00D603C9 /* alldescs.h in Headers */, + 221F58E413AF44B300D603C9 /* scaler.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 22DD19BD13A8D7FA0018ECD4 /* mediastream */ = { + isa = PBXNativeTarget; + buildConfigurationList = 22DD19DA13A8D7FA0018ECD4 /* Build configuration list for PBXNativeTarget "mediastream" */; + buildPhases = ( + 22DD19BA13A8D7FA0018ECD4 /* Sources */, + 22DD19BB13A8D7FA0018ECD4 /* Frameworks */, + 22DD19BC13A8D7FA0018ECD4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 220ED19613A8F82A00AC21E0 /* PBXTargetDependency */, + ); + name = mediastream; + productName = mediastream; + productReference = 22DD19BE13A8D7FA0018ECD4 /* mediastream.app */; + productType = "com.apple.product-type.application"; + }; D2AAC07D0554694100DB518D /* liblinphone */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "liblinphone" */; @@ -818,6 +1021,7 @@ Japanese, French, German, + en, ); mainGroup = 0867D691FE84028FC02AAC07 /* liblinphone */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; @@ -825,11 +1029,37 @@ projectRoot = ""; targets = ( D2AAC07D0554694100DB518D /* liblinphone */, + 22DD19BD13A8D7FA0018ECD4 /* mediastream */, ); }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 22DD19BC13A8D7FA0018ECD4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 22DD21AE13A8E3310018ECD4 /* InfoPlist.strings in Resources */, + 22DD21AF13A8E3310018ECD4 /* MainWindow.xib in Resources */, + 22DD21B013A8E3310018ECD4 /* mediastreamViewController.xib in Resources */, + 22DD21B213A8E3310018ECD4 /* mediastream-Info.plist in Resources */, + 22B5106913B060E100CD87DA /* nowebcamCIF.jpg in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ + 22DD19BA13A8D7FA0018ECD4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 22DD19F713A8DFA70018ECD4 /* mediastream.c in Sources */, + 22DD21B313A8E3310018ECD4 /* mediastreamAppDelegate.m in Sources */, + 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D2AAC07B0554694100DB518D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -840,7 +1070,6 @@ 222CA65511F6CF7600621220 /* chanadapt.c in Sources */, 222CA65711F6CF7600621220 /* dsptools.c in Sources */, 222CA65811F6CF7600621220 /* dtmfgen.c in Sources */, - 222CA65911F6CF7600621220 /* dxfilter.cpp in Sources */, 222CA65B11F6CF7600621220 /* equalizer.c in Sources */, 222CA65C11F6CF7600621220 /* eventqueue.c in Sources */, 222CA65D11F6CF7600621220 /* extdisplay.c in Sources */, @@ -915,11 +1144,59 @@ 225D355A124B1FF60008581C /* linphonecall.c in Sources */, 2252935B12F6CA4700DD9BFB /* ec-calibrator.c in Sources */, 2203126F139F61990049A2ED /* ioscapture.m in Sources */, + 2203127313A247B50049A2ED /* iosdisplay.m in Sources */, + 2203127613A249F70049A2ED /* filter-template.c in Sources */, + 220ED1AD13A9062600AC21E0 /* nowebcam.c in Sources */, + 2258C44B13A946890087A596 /* videostream.c in Sources */, + 2258C44C13A946890087A596 /* videoenc.c in Sources */, + 2258C44D13A946890087A596 /* videodec.c in Sources */, + 221F589C13AB4FC500D603C9 /* msvideo.c in Sources */, + 221F58A213AB6F8100D603C9 /* pixconv.c in Sources */, + 221F58A813AB716400D603C9 /* tonedetector.c in Sources */, + 221F58A913AB716400D603C9 /* jpegwriter.c in Sources */, + 221F58AA13AB716400D603C9 /* h264dec.c in Sources */, + 221F58AC13AB71A400D603C9 /* sizeconv.c in Sources */, + 221F58AE13ABA42800D603C9 /* scaler.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 220ED19613A8F82A00AC21E0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D2AAC07D0554694100DB518D /* liblinphone */; + targetProxy = 220ED19513A8F82A00AC21E0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 22DD21A113A8E3310018ECD4 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 22DD21A213A8E3310018ECD4 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 22DD21A313A8E3310018ECD4 /* MainWindow.xib */ = { + isa = PBXVariantGroup; + children = ( + 22DD21A413A8E3310018ECD4 /* en */, + ); + name = MainWindow.xib; + sourceTree = ""; + }; + 22DD21A513A8E3310018ECD4 /* mediastreamViewController.xib */ = { + isa = PBXVariantGroup; + children = ( + 22DD21A613A8E3310018ECD4 /* en */, + ); + name = mediastreamViewController.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 1DEB921F08733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; @@ -934,6 +1211,39 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = liblinphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __IOSIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, + MS2_INTERNAL, + VIDEO_ENABLED, + HAVE_LIBAVCODEC_AVCODEC_H, + HAVE_LIBSWSCALE_SWSCALE_H, + ); + HEADER_SEARCH_PATHS = ( + linphone/mediastreamer2/build/iphone, + linphone/mediastreamer2/include, + linphone/oRTP/include, + externals/gsm/, + externals/osip/include, + externals/exosip/include, + externals/speex/include, + externals/ffmpeg, + external/ffmpeg/swscale, + "../liblinphone-sdk/apple-darwin/include", + ); INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = linphone; }; @@ -948,6 +1258,39 @@ GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = liblinphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __IOSIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, + MS2_INTERNAL, + VIDEO_ENABLED, + HAVE_LIBAVCODEC_AVCODEC_H, + HAVE_LIBSWSCALE_SWSCALE_H, + ); + HEADER_SEARCH_PATHS = ( + linphone/mediastreamer2/build/iphone, + linphone/mediastreamer2/include, + linphone/oRTP/include, + externals/gsm/, + externals/osip/include, + externals/exosip/include, + externals/speex/include, + externals/ffmpeg, + external/ffmpeg/swscale, + "../liblinphone-sdk/apple-darwin/include", + ); INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = linphone; }; @@ -1036,6 +1379,61 @@ }; name = Release; }; + 22DD19DB13A8D7FA0018ECD4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + MS2_INTERNAL, + VIDEO_ENABLED, + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + INFOPLIST_FILE = "linphone/mediastreamer2/tests/ios/mediastream-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 22DD19DC13A8D7FA0018ECD4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + MS2_INTERNAL, + VIDEO_ENABLED, + ); + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = ""; + GCC_VERSION = com.apple.compilers.llvmgcc42; + INFOPLIST_FILE = "linphone/mediastreamer2/tests/ios/mediastream-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + ); + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1057,6 +1455,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 22DD19DA13A8D7FA0018ECD4 /* Build configuration list for PBXNativeTarget "mediastream" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 22DD19DB13A8D7FA0018ECD4 /* Debug */, + 22DD19DC13A8D7FA0018ECD4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; diff --git a/submodules/linphone b/submodules/linphone index 04aac71ec..dc8e7fa8e 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 04aac71ecfe6f19aa5d0548fd701d87486c61378 +Subproject commit dc8e7fa8e53c6b79f4909fef01e9425b4f8d78e5 From bbfd7e95726bf90addbcf73238510dcd95988222 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 12 Jul 2011 10:38:17 +0200 Subject: [PATCH 004/122] video integration --- Classes/LinphoneUI/LinphoneManager.m | 10 ++ Classes/PhoneViewController.m | 1 + Classes/VideoViewController.xib | 98 +++++++++++++++- Settings.bundle/Root.plist | 62 ++-------- Settings.bundle/audio.plist | 65 +++++++++++ Settings.bundle/video.plist | 25 ++++ linphone.xcodeproj/project.pbxproj | 108 +++++++++++++++++- linphonerc | 10 +- .../liblinphone.xcodeproj/project.pbxproj | 45 +++++++- submodules/linphone | 2 +- 10 files changed, 360 insertions(+), 66 deletions(-) create mode 100644 Settings.bundle/audio.plist create mode 100644 Settings.bundle/video.plist diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index c23e898ac..fd183eb53 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -503,6 +503,16 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach [self configurePayloadType:"PCMU" fromPrefKey:@"pcmu_preference" withRate:8000]; [self configurePayloadType:"PCMA" fromPrefKey:@"pcma_preference" withRate:8000]; + //get video codecs from linphonerc + const MSList *videoCodecs=linphone_core_get_video_codecs(theLinphoneCore); + //disable video all codecs + for (elem=videoCodecs;elem!=NULL;elem=elem->next){ + pt=(PayloadType*)elem->data; + linphone_core_enable_payload_type(theLinphoneCore,pt,FALSE); + } + [self configurePayloadType:"MP4V-ES" fromPrefKey:@"mp4v-es_preference" withRate:90000]; + + UIDevice* device = [UIDevice currentDevice]; bool backgroundSupported = false; if ([device respondsToSelector:@selector(isMultitaskingSupported)]) diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 46667d7cf..1281e71c6 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -170,6 +170,7 @@ mIncomingCallActionSheet=nil; } } + [self dismissModalViewControllerAnimated:TRUE];//just in case [address setHidden:false]; if (username) { diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index fa99aba3c..5aa3cd0f7 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -2,9 +2,9 @@ 1056 - 10J869 + 10K540 1305 - 1038.35 + 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -48,7 +48,9 @@ 274 {320, 400} + + 1 NO IBCocoaTouchFramework @@ -57,6 +59,7 @@ 292 {{13, 408}, {72, 37}} + NO IBCocoaTouchFramework @@ -86,6 +89,7 @@ 292 {{98, 408}, {129, 37}} + NO IBCocoaTouchFramework @@ -105,6 +109,7 @@ 292 {{240, 408}, {72, 37}} + NO IBCocoaTouchFramework @@ -125,6 +130,7 @@ 292 {{210, 278}, {102, 114}} + 3 @@ -138,6 +144,7 @@ {{0, 20}, {320, 460}} + 3 @@ -159,6 +166,14 @@ 3 + + + mDisplay + + + + 10 + @@ -265,9 +280,84 @@ - 9 + 10 + + + + YES + + UIHangUpButton + UIButton + + IBProjectSource + ./Classes/UIHangUpButton.h + + + + UIMuteButton + UIToggleButton + + IBProjectSource + ./Classes/UIMuteButton.h + + + + UIToggleButton + UIButton + + IBProjectSource + ./Classes/UIToggleButton.h + + + + VideoViewController + UIViewController + + YES + + YES + mDisplay + mHangUp + mMute + + + YES + UIImageView + UIHangUpButton + UIMuteButton + + + + YES + + YES + mDisplay + mHangUp + mMute + + + YES + + mDisplay + UIImageView + + + mHangUp + UIHangUpButton + + + mMute + UIMuteButton + + + + + IBProjectSource + ./Classes/VideoViewController.h + + + - 0 IBCocoaTouchFramework diff --git a/Settings.bundle/Root.plist b/Settings.bundle/Root.plist index 5b703ede8..a1b42969d 100644 --- a/Settings.bundle/Root.plist +++ b/Settings.bundle/Root.plist @@ -94,69 +94,25 @@ Title - Codecs + Media Type PSGroupSpecifier - DefaultValue - - Key - speex_16k_preference + File + audio Title - Speex 16Khz + Audio Type - PSToggleSwitchSpecifier + PSChildPaneSpecifier - DefaultValue - - Key - speex_8k_preference + File + video Title - Speex 8Khz + Video Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - gsm_8k_preference - Title - GSM - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - ilbc_preference - Title - ILBC - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - pcmu_preference - Title - PCMU - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - pcma_preference - Title - PCMA - Type - PSToggleSwitchSpecifier + PSChildPaneSpecifier Title diff --git a/Settings.bundle/audio.plist b/Settings.bundle/audio.plist new file mode 100644 index 000000000..33d5f5ce2 --- /dev/null +++ b/Settings.bundle/audio.plist @@ -0,0 +1,65 @@ + + + + + PreferenceSpecifiers + + + Title + Codecs + Type + PSGroupSpecifier + + + DefaultValue + + Key + speex_16k_preference + Title + Speex 16Khz + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + gsm_8k_preference + Title + GSM + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + ilbc_preference + Title + ILBC + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + pcmu_preference + Title + PCMU + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + pcma_preference + Title + PCMA + Type + PSToggleSwitchSpecifier + + + + diff --git a/Settings.bundle/video.plist b/Settings.bundle/video.plist new file mode 100644 index 000000000..b8f578b92 --- /dev/null +++ b/Settings.bundle/video.plist @@ -0,0 +1,25 @@ + + + + + PreferenceSpecifiers + + + Type + PSGroupSpecifier + Title + Codecs + + + Type + PSToggleSwitchSpecifier + Title + mpeg4 + Key + mp4v-es_preference + DefaultValue + + + + + diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index da7c60ed8..d15fc40af 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -57,6 +57,7 @@ 225CB2EE11ABB65D00628906 /* clavier-01-160px.png in Resources */ = {isa = PBXBuildFile; fileRef = 225CB2ED11ABB65D00628906 /* clavier-01-160px.png */; }; 225CB2FA11ABB76400628906 /* linphone-banner.png in Resources */ = {isa = PBXBuildFile; fileRef = 225CB2F911ABB76400628906 /* linphone-banner.png */; }; 2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2264B6D111200342002C2C53 /* SystemConfiguration.framework */; }; + 226B563F13CAF1CD00921595 /* audio.plist in Resources */ = {isa = PBXBuildFile; fileRef = 226B563E13CAF1CD00921595 /* audio.plist */; }; 226F2ED61344B0EF00F6EF27 /* libopencore-amrwb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */; }; 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */; }; 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; }; @@ -84,6 +85,7 @@ 22E0A823111C44E100B04932 /* ConsoleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A81E111C44E100B04932 /* ConsoleViewController.xib */; }; 22E0A824111C44E100B04932 /* ConsoleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81F111C44E100B04932 /* ConsoleViewController.m */; }; 22E19E48138A67A000FBFE87 /* missed_call.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E19E47138A67A000FBFE87 /* missed_call.png */; }; + 22E1A9E813CAF4AA00219531 /* video.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22E1A9E713CAF4AA00219531 /* video.plist */; }; 22E5B0AF133B5EA20044EA25 /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22E5B0AD133B5EA20044EA25 /* libssl.a */; }; 22E5B0B0133B5EA20044EA25 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22E5B0AE133B5EA20044EA25 /* libcrypto.a */; }; 22F2508E107141E100AC9B3F /* PhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* PhoneViewController.m */; }; @@ -108,6 +110,13 @@ remoteGlobalIDString = 22DD19BE13A8D7FA0018ECD4; remoteInfo = mediastream; }; + 22F3D55713CC3CFE00A0DA02 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D2AAC07D0554694100DB518D; + remoteInfo = liblinphone; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -296,6 +305,7 @@ 225CB2ED11ABB65D00628906 /* clavier-01-160px.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "clavier-01-160px.png"; path = "Resources/clavier-01-160px.png"; sourceTree = ""; }; 225CB2F911ABB76400628906 /* linphone-banner.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "linphone-banner.png"; path = "liblinphone-sdk/apple-darwin/share/pixmaps/linphone/linphone-banner.png"; sourceTree = ""; }; 2264B6D111200342002C2C53 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 226B563E13CAF1CD00921595 /* audio.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = audio.plist; path = Settings.bundle/audio.plist; sourceTree = ""; }; 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libopencore-amrwb.a"; path = "liblinphone-sdk/apple-darwin/lib/libopencore-amrwb.a"; sourceTree = ""; }; 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libopencore-amrnb.a"; path = "liblinphone-sdk/apple-darwin/lib/libopencore-amrnb.a"; sourceTree = ""; }; 226F2ED51344B0EF00F6EF27 /* libmsamr.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsamr.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsamr.a"; sourceTree = ""; }; @@ -406,6 +416,7 @@ 22E0A81F111C44E100B04932 /* ConsoleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConsoleViewController.m; sourceTree = ""; }; 22E0A820111C44E100B04932 /* ConsoleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConsoleViewController.h; sourceTree = ""; }; 22E19E47138A67A000FBFE87 /* missed_call.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = missed_call.png; path = Resources/missed_call.png; sourceTree = ""; }; + 22E1A9E713CAF4AA00219531 /* video.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = video.plist; path = Settings.bundle/video.plist; sourceTree = ""; }; 22E5B0AD133B5EA20044EA25 /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = "liblinphone-sdk/apple-darwin/lib/libssl.a"; sourceTree = ""; }; 22E5B0AE133B5EA20044EA25 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = "liblinphone-sdk/apple-darwin/lib/libcrypto.a"; sourceTree = ""; }; 22F2508B107141E100AC9B3F /* PhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhoneViewController.h; sourceTree = ""; }; @@ -813,6 +824,8 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 22E1A9E713CAF4AA00219531 /* video.plist */, + 226B563E13CAF1CD00921595 /* audio.plist */, 22276E8813C73DC000210156 /* CoreMedia.framework */, 22276E8613C73D8A00210156 /* CoreVideo.framework */, 22276E8013C73D3100210156 /* libavcodec.a */, @@ -922,6 +935,7 @@ buildRules = ( ); dependencies = ( + 22F3D55813CC3CFE00A0DA02 /* PBXTargetDependency */, ); name = linphone; productName = linphone; @@ -1014,6 +1028,8 @@ 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */, 22E19E48138A67A000FBFE87 /* missed_call.png in Resources */, 22E028B813B4CCBD0068A713 /* VideoViewController.xib in Resources */, + 226B563F13CAF1CD00921595 /* audio.plist in Resources */, + 22E1A9E813CAF4AA00219531 /* video.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1050,6 +1066,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 22F3D55813CC3CFE00A0DA02 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = liblinphone; + targetProxy = 22F3D55713CC3CFE00A0DA02 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 2214783B1386A2030020F8B8 /* Localizable.strings */ = { isa = PBXVariantGroup; @@ -1073,7 +1097,10 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = IN_LINPHONE; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, @@ -1132,10 +1159,13 @@ COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; + GCC_OPTIMIZATION_LEVEL = s; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = IN_LINPHONE; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, @@ -1167,6 +1197,69 @@ }; name = DistributionAdhoc; }; + 22F3D55513CC3C9100A0DA02 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 3.1; + LIBRARY_SEARCH_PATHS = ""; + LINK_WITH_STANDARD_LIBRARIES = YES; + PREBINDING = NO; + SDKROOT = iphoneos; + }; + name = Release; + }; + 22F3D55613CC3C9100A0DA02 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = linphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); + HEADER_SEARCH_PATHS = ( + submodules/linphone/coreapi, + submodules/linphone/mediastreamer2/include, + submodules/linphone/mediastreamer2/include, + submodules/linphone/oRTP/include, + submodules/externals/gsm/, + submodules/externals/osip/include, + submodules/externals/exosip/include, + submodules/externals/speex/include, + ); + INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 3.1; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", + ); + OTHER_LDFLAGS = ( + "-l", + linphone, + "-l", + mediastreamer, + ); + PRODUCT_NAME = linphone; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; 22F51EE7107FA53D00F98953 /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1194,10 +1287,13 @@ COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; + GCC_OPTIMIZATION_LEVEL = s; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = IN_LINPHONE; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, @@ -1253,6 +1349,7 @@ isa = XCConfigurationList; buildConfigurations = ( 1D6058940D05DD3E006BFB54 /* Debug */, + 22F3D55613CC3C9100A0DA02 /* Release */, 22F51EE8107FA53D00F98953 /* Distribution */, 228B19A71302902F00F154D3 /* DistributionAdhoc */, ); @@ -1263,6 +1360,7 @@ isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, + 22F3D55513CC3C9100A0DA02 /* Release */, 22F51EE7107FA53D00F98953 /* Distribution */, 228B19A61302902F00F154D3 /* DistributionAdhoc */, ); diff --git a/linphonerc b/linphonerc index 1f719760e..c86bda58b 100644 --- a/linphonerc +++ b/linphonerc @@ -1,6 +1,6 @@ [net] -download_bw=128 -upload_bw=128 +download_bw=380 +upload_bw=380 firewall_policy=0 mtu=0 @@ -32,3 +32,9 @@ echocancellation=0 [misc] history_max_size=30 +[video] +display=1 +capture=1 +show_local=0 +enabled=1 +size=qvga-portrait \ No newline at end of file diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 1a80de476..e8fa530e2 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -200,6 +200,8 @@ 22DD21B213A8E3310018ECD4 /* mediastream-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22DD21A813A8E3310018ECD4 /* mediastream-Info.plist */; }; 22DD21B313A8E3310018ECD4 /* mediastreamAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AB13A8E3310018ECD4 /* mediastreamAppDelegate.m */; }; 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; + 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */; }; + 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */; }; AA747D9F0F9514B9006C5449 /* liblinphone_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */; }; AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; /* End PBXBuildFile section */ @@ -442,6 +444,8 @@ 22DD21AB13A8E3310018ECD4 /* mediastreamAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamAppDelegate.m; sourceTree = ""; }; 22DD21AC13A8E3310018ECD4 /* mediastreamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mediastreamViewController.h; sourceTree = ""; }; 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; + 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qualityindicator.c; sourceTree = ""; }; + 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratecontrol.c; sourceTree = ""; }; AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblinphone_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -621,6 +625,8 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */, + 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */, 22276E7F13C4637100210156 /* msandroidvideo.cpp */, 221F58AD13ABA42800D603C9 /* scaler.c */, 221F58AB13AB71A400D603C9 /* sizeconv.c */, @@ -1157,6 +1163,8 @@ 221F58AA13AB716400D603C9 /* h264dec.c in Sources */, 221F58AC13AB71A400D603C9 /* sizeconv.c in Sources */, 221F58AE13ABA42800D603C9 /* scaler.c in Sources */, + 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */, + 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1232,6 +1240,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, ); + GCC_UNROLL_LOOPS = YES; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1279,6 +1288,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, ); + GCC_UNROLL_LOOPS = YES; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1390,8 +1400,25 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __IOSIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, + HAVE_LIBAVCODEC_AVCODEC_H, + HAVE_LIBSWSCALE_SWSCALE_H, ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; @@ -1416,10 +1443,26 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __IOSIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, + HAVE_LIBAVCODEC_AVCODEC_H, + HAVE_LIBSWSCALE_SWSCALE_H, ); - "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = ""; GCC_VERSION = com.apple.compilers.llvmgcc42; INFOPLIST_FILE = "linphone/mediastreamer2/tests/ios/mediastream-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 4.3; diff --git a/submodules/linphone b/submodules/linphone index dc8e7fa8e..832d66ad9 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit dc8e7fa8e53c6b79f4909fef01e9425b4f8d78e5 +Subproject commit 832d66ad9860349ad11a2fa6958b38893ef7c3c9 From e2d6829fe311d7cb7cccbb1488f2e5ba44196775 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 13 Jul 2011 10:30:49 +0200 Subject: [PATCH 005/122] auto tools port for ios video --- linphone.xcodeproj/project.pbxproj | 40 ++++++++------------------- submodules/build/builder-iphone-os.mk | 1 + submodules/linphone | 2 +- 3 files changed, 14 insertions(+), 29 deletions(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index d15fc40af..b2e7eb85b 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -91,6 +91,7 @@ 22F2508E107141E100AC9B3F /* PhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* PhoneViewController.m */; }; 22F2508F107141E100AC9B3F /* PhoneViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22F2508D107141E100AC9B3F /* PhoneViewController.xib */; }; 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; + 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22F3D57D13CCC89600A0DA02 /* liblinphone.a */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; /* End PBXBuildFile section */ @@ -110,7 +111,7 @@ remoteGlobalIDString = 22DD19BE13A8D7FA0018ECD4; remoteInfo = mediastream; }; - 22F3D55713CC3CFE00A0DA02 /* PBXContainerItemProxy */ = { + 22F3D57B13CCC60500A0DA02 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; proxyType = 1; @@ -423,6 +424,7 @@ 22F2508C107141E100AC9B3F /* PhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneViewController.m; sourceTree = ""; }; 22F2508D107141E100AC9B3F /* PhoneViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneViewController.xib; sourceTree = ""; }; 22F254801073D99800AC9B3F /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringback.wav; path = "liblinphone-sdk/apple-darwin/share/sounds/linphone/ringback.wav"; sourceTree = ""; }; + 22F3D57D13CCC89600A0DA02 /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; 22F51EF5107FA66500F98953 /* untitled.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = untitled.plist; sourceTree = ""; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -435,6 +437,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */, 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */, 22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */, 22276E8313C73D3100210156 /* libavcodec.a in Frameworks */, @@ -824,6 +827,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 22F3D57D13CCC89600A0DA02 /* liblinphone.a */, 22E1A9E713CAF4AA00219531 /* video.plist */, 226B563E13CAF1CD00921595 /* audio.plist */, 22276E8813C73DC000210156 /* CoreMedia.framework */, @@ -935,7 +939,7 @@ buildRules = ( ); dependencies = ( - 22F3D55813CC3CFE00A0DA02 /* PBXTargetDependency */, + 22F3D57C13CCC60500A0DA02 /* PBXTargetDependency */, ); name = linphone; productName = linphone; @@ -1067,10 +1071,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 22F3D55813CC3CFE00A0DA02 /* PBXTargetDependency */ = { + 22F3D57C13CCC60500A0DA02 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = liblinphone; - targetProxy = 22F3D55713CC3CFE00A0DA02 /* PBXContainerItemProxy */; + targetProxy = 22F3D57B13CCC60500A0DA02 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1118,12 +1122,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1183,12 +1182,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1246,12 +1240,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1311,12 +1300,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 0f2847ba2..1fd9d8782 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -26,6 +26,7 @@ library_mode:= --disable-shared --enable-static linphone_configure_controls= \ --with-readline=none \ --enable-gtk_ui=no \ + --enable-console_ui=no \ --enable-ssl-hmac=no \ --enable-ssl=yes \ --disable-theora \ diff --git a/submodules/linphone b/submodules/linphone index 832d66ad9..c22169c22 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 832d66ad9860349ad11a2fa6958b38893ef7c3c9 +Subproject commit c22169c221f91dcf38347410deff544f2786185f From 60dc4634b30b9b7376714a39c37a1d28811500d2 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 13 Jul 2011 10:58:21 +0200 Subject: [PATCH 006/122] fix wrong submodule repo for linphone --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index e4e7cdf6f..58601cfe1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "submodules/linphone"] path = submodules/linphone - url = gitosis@git.linphone.org:linphone-iphone-private.git + url = gitosis@git.linphone.org:linphone-private.git [submodule "submodules/externals/osip"] path = submodules/externals/osip url = git://git.savannah.gnu.org/osip.git From 62513f12c84a202325fccb2e094e13129e096531 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 13 Jul 2011 11:28:20 +0200 Subject: [PATCH 007/122] update ilbc sumodule --- submodules/libilbc-rfc3951 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/libilbc-rfc3951 b/submodules/libilbc-rfc3951 index 2f7640d57..8af11e23e 160000 --- a/submodules/libilbc-rfc3951 +++ b/submodules/libilbc-rfc3951 @@ -1 +1 @@ -Subproject commit 2f7640d571fa12f75d269eda59d91e2037f99c5d +Subproject commit 8af11e23e482c98a40e5661c16974b297a0d0396 From 6c7e64958ae8d4d465fa424af0edf32fa437d4c0 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 13 Jul 2011 18:21:40 +0200 Subject: [PATCH 008/122] enable preview --- Classes/VideoViewController.h | 2 ++ Classes/VideoViewController.m | 2 ++ Classes/VideoViewController.xib | 18 ++++++++++++++++-- submodules/linphone | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Classes/VideoViewController.h b/Classes/VideoViewController.h index 117404fce..4ab762d2c 100644 --- a/Classes/VideoViewController.h +++ b/Classes/VideoViewController.h @@ -21,12 +21,14 @@ @interface VideoViewController : UIViewController { UIImageView* mDisplay; + UIView* mPreview; UIMuteButton* mMute; UIHangUpButton* mHangUp; } @property (nonatomic, retain) IBOutlet UIImageView* mDisplay; +@property (nonatomic, retain) IBOutlet UIView* mPreview; @property (nonatomic, retain) IBOutlet UIMuteButton* mMute; @property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUp; @end \ No newline at end of file diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index 9b03ae3f1..d84e9b731 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -22,6 +22,7 @@ @implementation VideoViewController @synthesize mDisplay; +@synthesize mPreview; @synthesize mMute; @synthesize mHangUp; @@ -64,6 +65,7 @@ -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index 5aa3cd0f7..759671486 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -110,7 +110,6 @@ {{240, 408}, {72, 37}} - NO IBCocoaTouchFramework 0 @@ -174,6 +173,14 @@ 10 + + + mPreview + + + + 11 + @@ -280,7 +287,7 @@ - 10 + 11 @@ -319,12 +326,14 @@ mDisplay mHangUp mMute + mPreview YES UIImageView UIHangUpButton UIMuteButton + UIView @@ -334,6 +343,7 @@ mDisplay mHangUp mMute + mPreview YES @@ -349,6 +359,10 @@ mMute UIMuteButton + + mPreview + UIView + diff --git a/submodules/linphone b/submodules/linphone index c22169c22..8dde32f19 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit c22169c221f91dcf38347410deff544f2786185f +Subproject commit 8dde32f19c1421443f8a6e42ab1efdfb00d97246 From c09512deb542c57d7ad37c4def59e248bec4c6c8 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 15 Jul 2011 15:58:10 +0200 Subject: [PATCH 009/122] clarify readme regarding gas --- README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README b/README index edf5247c9..eadb9a98e 100644 --- a/README +++ b/README @@ -8,7 +8,9 @@ Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must inst -intltool -wget -pkgconfig --gas-preposessor.pl (http://github.com/yuvi/gas-preprocessor/ ) + + +gas-preprosessor.pl (http://github.com/yuvi/gas-preprocessor/ ) to be copied into /opt/local/bin Link macport libtoolize to glibtoolize (sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize) From 915d7bc9edae85f05b825d307f7c20320150c0bb Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 20 Jul 2011 10:37:43 +0200 Subject: [PATCH 010/122] add neon optimization to ms2 --- submodules/liblinphone.xcodeproj/project.pbxproj | 6 ++++-- submodules/linphone | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index e8fa530e2..d3259db2b 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -1240,7 +1240,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, ); - GCC_UNROLL_LOOPS = YES; + GCC_UNROLL_LOOPS = NO; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1288,7 +1288,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, ); - GCC_UNROLL_LOOPS = YES; + GCC_UNROLL_LOOPS = NO; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1371,6 +1371,7 @@ HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( @@ -1463,6 +1464,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; INFOPLIST_FILE = "linphone/mediastreamer2/tests/ios/mediastream-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 4.3; diff --git a/submodules/linphone b/submodules/linphone index 8dde32f19..714c9a529 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 8dde32f19c1421443f8a6e42ab1efdfb00d97246 +Subproject commit 714c9a52908ae8829f559775fccbbc407574c9ab From 6cd52eb0159613e9b99858df897a44db13752611 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 20 Jul 2011 16:36:13 +0200 Subject: [PATCH 011/122] enable x264 --- Classes/LinphoneUI/LinphoneManager.m | 13 ++++-- README | 1 + Settings.bundle/video.plist | 26 +++++++---- linphone.xcodeproj/project.pbxproj | 12 +++++ submodules/build/builder-iphone-os.mk | 6 +-- submodules/build/builders.d/ffmpeg.mk | 6 +-- submodules/build/builders.d/x264.mk | 63 +++++++++++++++++++++++++++ 7 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 submodules/build/builders.d/x264.mk diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index fd183eb53..a67f41362 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -33,6 +33,10 @@ extern void libmsilbc_init(); #ifdef HAVE_AMR extern void libmsamr_init(); #endif +#ifdef HAVE_X264 +extern void libmsx264_init(); +#endif + @implementation LinphoneManager @synthesize callDelegate; @synthesize registrationDelegate; @@ -511,6 +515,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach linphone_core_enable_payload_type(theLinphoneCore,pt,FALSE); } [self configurePayloadType:"MP4V-ES" fromPrefKey:@"mp4v-es_preference" withRate:90000]; + [self configurePayloadType:"H264" fromPrefKey:@"h264_preference" withRate:90000]; UIDevice* device = [UIDevice currentDevice]; @@ -669,9 +674,11 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach #ifdef HAVE_AMR libmsamr_init(); //load amr plugin if present from the liblinphone sdk -#endif /* - * Initialize linphone core - */ +#endif +#ifdef HAVE_X264 + libmsx264_init(); //load x264 plugin if present from the liblinphone sdk +#endif + /* Initialize linphone core*/ theLinphoneCore = linphone_core_new (&linphonec_vtable , [confiFileName cStringUsingEncoding:[NSString defaultCStringEncoding]] diff --git a/README b/README index eadb9a98e..51a95ce31 100644 --- a/README +++ b/README @@ -13,6 +13,7 @@ Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must inst gas-preprosessor.pl (http://github.com/yuvi/gas-preprocessor/ ) to be copied into /opt/local/bin Link macport libtoolize to glibtoolize (sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize) +Link host's strings to simulator SDK (ln -s /usr/bin/strings /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/strings) You may update variable SDK_VERSION from file submodules/build/iphone-config.site according to your iPhone SDK version. Current is 4.0 diff --git a/Settings.bundle/video.plist b/Settings.bundle/video.plist index b8f578b92..9af1c4bb4 100644 --- a/Settings.bundle/video.plist +++ b/Settings.bundle/video.plist @@ -5,20 +5,30 @@ PreferenceSpecifiers - Type - PSGroupSpecifier Title Codecs + Type + PSGroupSpecifier - Type - PSToggleSwitchSpecifier - Title - mpeg4 - Key - mp4v-es_preference DefaultValue + Key + mp4v-es_preference + Title + mpeg4 + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + h264_preference + Title + h264 + Type + PSToggleSwitchSpecifier diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index b2e7eb85b..b88f1b2c5 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -71,6 +71,8 @@ 22968A5F12F875C600588287 /* UISpeakerButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22968A5E12F875C600588287 /* UISpeakerButton.m */; }; 22968A8812F87C2000588287 /* UIDuration.m in Sources */ = {isa = PBXBuildFile; fileRef = 22968A8712F87C2000588287 /* UIDuration.m */; }; 22A10F3B11F8960300373793 /* libortp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2C10765B400068D98F /* libortp.a */; }; + 22AA8AFD13D7125600B30535 /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; }; + 22AA8AFE13D7125600B30535 /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFC13D7125500B30535 /* libmsx264.a */; }; 22B5EFA310CE50BD00777D97 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */; }; 22B5EFE510CE5E5800777D97 /* ContactPickerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22B5EFE410CE5E5800777D97 /* ContactPickerDelegate.m */; }; 22B5F03510CE6B2F00777D97 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5F03410CE6B2F00777D97 /* AddressBook.framework */; }; @@ -325,6 +327,8 @@ 22968A8612F87C2000588287 /* UIDuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIDuration.h; sourceTree = ""; }; 22968A8712F87C2000588287 /* UIDuration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIDuration.m; sourceTree = ""; }; 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = liblinphone.xcodeproj; path = submodules/liblinphone.xcodeproj; sourceTree = ""; }; + 22AA8AFB13D7125500B30535 /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx264.a; path = "liblinphone-sdk/apple-darwin/lib/libx264.a"; sourceTree = ""; }; + 22AA8AFC13D7125500B30535 /* libmsx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsx264.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsx264.a"; sourceTree = ""; }; 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; 22B5EFE310CE5E5800777D97 /* ContactPickerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactPickerDelegate.h; sourceTree = ""; }; 22B5EFE410CE5E5800777D97 /* ContactPickerDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactPickerDelegate.m; sourceTree = ""; }; @@ -468,6 +472,8 @@ 226F2ED61344B0EF00F6EF27 /* libopencore-amrwb.a in Frameworks */, 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */, 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */, + 22AA8AFD13D7125600B30535 /* libx264.a in Frameworks */, + 22AA8AFE13D7125600B30535 /* libmsx264.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -827,6 +833,8 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 22AA8AFB13D7125500B30535 /* libx264.a */, + 22AA8AFC13D7125500B30535 /* libmsx264.a */, 22F3D57D13CCC89600A0DA02 /* liblinphone.a */, 22E1A9E713CAF4AA00219531 /* video.plist */, 226B563E13CAF1CD00921595 /* audio.plist */, @@ -1104,6 +1112,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( IN_LINPHONE, VIDEO_ENABLED, + HAVE_X264, ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, @@ -1164,6 +1173,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( IN_LINPHONE, VIDEO_ENABLED, + HAVE_X264, ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, @@ -1222,6 +1232,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( IN_LINPHONE, VIDEO_ENABLED, + HAVE_X264, ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, @@ -1282,6 +1293,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( IN_LINPHONE, VIDEO_ENABLED, + HAVE_X264, ); HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 1fd9d8782..0ff3366ca 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -70,7 +70,7 @@ endif prefix?=$(BUILDER_SRC_DIR)/../liblinphone-sdk/$(host) -all: build-linphone build-msilbc build-msamr +all: build-linphone build-msilbc build-msamr build-msx264 clean-makefile: clean-makefile-linphone clean: clean-linphone @@ -84,10 +84,10 @@ veryclean: .NOTPARALLEL build-linphone: init build-openssl build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg $(LINPHONE_BUILD_DIR)/Makefile cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install -clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-msilbc clean-libilbc clean-openssl clean-msamr clean-ffmpeg +clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-msilbc clean-libilbc clean-openssl clean-msamr clean-ffmpeg clean-msx264 cd $(LINPHONE_BUILD_DIR) && make clean -veryclean-linphone: clean-linphone veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr +veryclean-linphone: clean-linphone veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr veryclean-msx264 cd $(LINPHONE_BUILD_DIR) && make distclean cd $(LINPHONE_SRC_DIR) && rm -f configure diff --git a/submodules/build/builders.d/ffmpeg.mk b/submodules/build/builders.d/ffmpeg.mk index 4ca60c237..ff9f38e6c 100644 --- a/submodules/build/builders.d/ffmpeg.mk +++ b/submodules/build/builders.d/ffmpeg.mk @@ -23,13 +23,13 @@ ifneq (,$(findstring armv7,$(host))) endif ffmpeg_dir?=externals/ffmpeg -$(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/Makefile: $(BUILDER_SRC_DIR)/$(ffmpeg_dir)/configure +$(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/config.mak: mkdir -p $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/ \ && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ && $(BUILDER_SRC_DIR)/$(ffmpeg_dir)/configure --prefix=$(prefix) $(ffmpeg_configure_options) -build-ffmpeg: $(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/Makefile +build-ffmpeg: $(BUILDER_BUILD_DIR)/$(ffmpeg_dir)/config.mak cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install clean-ffmpeg: @@ -39,5 +39,5 @@ veryclean-ffmpeg: cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && make distclean clean-makefile-ffmpeg: - cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && rm -f Makefile + cd $(BUILDER_BUILD_DIR)/$(ffmpeg_dir) && rm -f config.mak diff --git a/submodules/build/builders.d/x264.mk b/submodules/build/builders.d/x264.mk new file mode 100644 index 000000000..eb6d1d086 --- /dev/null +++ b/submodules/build/builders.d/x264.mk @@ -0,0 +1,63 @@ +############################################################################ +# x264.mk +# Copyright (C) 2011 Belledonne Communications,Grenoble France +# +############################################################################ +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################ +x264-configure-option= \ + --host=$(host)\ + --cross-prefix=$$SDK_BIN_PATH/ \ + --extra-ldflags="-arch $$ARCH -isysroot $$SYSROOT_PATH" + + + +ifneq (,$(findstring i386,$(host))) + x264-configure-option+= --extra-cflags="-arch $$ARCH -isysroot $$SYSROOT_PATH" +endif +ifneq (,$(findstring armv6,$(host))) + x264-configure-option+= --extra-cflags="-arch $$ARCH -mcpu=arm1176jzf-s -marm -isysroot $$SYSROOT_PATH" + x264-configure-option+= --disable-asm +endif + +ifneq (,$(findstring armv7,$(host))) + x264-configure-option+= --extra-cflags="-arch $$ARCH -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -isysroot $$SYSROOT_PATH" +endif + +x264_dir?=externals/x264 +$(BUILDER_BUILD_DIR)/$(x264_dir)/configure: + mkdir -p $(BUILDER_BUILD_DIR)/$(x264_dir) + cd $(BUILDER_BUILD_DIR)/$(x264_dir)/ \ + && rsync -av --exclude ".git" $(BUILDER_SRC_DIR)/$(x264_dir)/* . + +$(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak: $(BUILDER_BUILD_DIR)/$(x264_dir)/configure + cd $(BUILDER_BUILD_DIR)/$(x264_dir)/ \ + && host_alias=$(host) . $(BUILDER_SRC_DIR)/build/$(config_site) \ + && ./configure --prefix=$(prefix) ${x264-configure-option} + +build-x264: $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak + cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install + +clean-x264: + cd $(BUILDER_BUILD_DIR)/$(x264_dir) && make clean + +veryclean-x264: + -cd $(BUILDER_BUILD_DIR)/$(x264_dir) && make distclean + rm -rf $(BUILDER_BUILD_DIR)/$(x264_dir) + +clean-makefile-x264: + cd $(BUILDER_BUILD_DIR)/$(x264_dir) && rm -f config.mak From 9fd2ca3c75eb2734287d47a22a7a8636cdb55b71 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 20 Jul 2011 16:46:02 +0200 Subject: [PATCH 012/122] update msx264 --- submodules/msx264 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/msx264 b/submodules/msx264 index 2e10820e9..fe371be61 160000 --- a/submodules/msx264 +++ b/submodules/msx264 @@ -1 +1 @@ -Subproject commit 2e10820e9c32fe75f049308d69e4164b46bc0d1a +Subproject commit fe371be61909be37bc9692d856eb1f53b4815d02 From d73efa6d9cc1806056ae7e12c1c13ab711333030 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 21 Jul 2011 16:40:54 +0200 Subject: [PATCH 013/122] enable front cam --- Classes/LinphoneUI/LinphoneManager.h | 6 +++ Classes/LinphoneUI/LinphoneManager.m | 20 +++++++ Classes/LinphoneUI/UICamSwitch.h | 31 +++++++++++ Classes/LinphoneUI/UICamSwitch.m | 80 ++++++++++++++++++++++++++++ Classes/LinphoneUI/UILinphone.h | 3 +- Classes/VideoViewController.h | 2 + Classes/VideoViewController.m | 5 +- Classes/VideoViewController.xib | 56 +++++++++++++++++-- linphone.xcodeproj/project.pbxproj | 6 +++ submodules/linphone | 2 +- 10 files changed, 205 insertions(+), 6 deletions(-) create mode 100644 Classes/LinphoneUI/UICamSwitch.h create mode 100644 Classes/LinphoneUI/UICamSwitch.m diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index 9ac87aaee..398355620 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -42,6 +42,8 @@ typedef enum _Connectivity { UIViewController* mCurrentViewController; Connectivity connectivity; FastAddressBook* mFastAddressBook; + const char* frontCamId; + const char* backCamId; } +(LinphoneManager*) instance; @@ -57,9 +59,13 @@ typedef enum _Connectivity { -(void) kickOffNetworkConnection; -(NSString*) getDisplayNameFromAddressBook:(NSString*) number andUpdateCallLog:(LinphoneCallLog*)log; + + @property (nonatomic, retain) id callDelegate; @property (nonatomic, retain) id registrationDelegate; @property Connectivity connectivity; +@property (readonly) const char* frontCamId; +@property (readonly) const char* backCamId; @end diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index d977177d4..c57488173 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -36,11 +36,15 @@ extern void libmsamr_init(); #ifdef HAVE_X264 extern void libmsx264_init(); #endif +#define FRONT_CAM_NAME "AV Capture: Front Camera" +#define BACK_CAM_NAME "AV Capture: Back Camera" @implementation LinphoneManager @synthesize callDelegate; @synthesize registrationDelegate; @synthesize connectivity; +@synthesize frontCamId; +@synthesize backCamId; -(id) init { if ((self= [super init])) { @@ -722,6 +726,21 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach otherButtonTitles:nil ,nil]; [error show]; } + /*DETECT cameras*/ + frontCamId= backCamId=nil; + char** camlist = (char**)linphone_core_get_video_devices(theLinphoneCore); + for (char* cam = *camlist;*camlist!=NULL;cam=*++camlist) { + if (strcmp(FRONT_CAM_NAME, cam)==0) { + frontCamId = cam; + //great set default cam to front + linphone_core_set_video_device(theLinphoneCore, cam); + } + if (strcmp(BACK_CAM_NAME, cam)==0) { + backCamId = cam; + } + + } + if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { //go directly to bg mode @@ -770,4 +789,5 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach mLogView = view; } + @end diff --git a/Classes/LinphoneUI/UICamSwitch.h b/Classes/LinphoneUI/UICamSwitch.h new file mode 100644 index 000000000..beaab07e6 --- /dev/null +++ b/Classes/LinphoneUI/UICamSwitch.h @@ -0,0 +1,31 @@ +/* UICamSwitch.h + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + + +@interface UICamSwitch : UIButton { + +@private + char* currentCamId; + char* nextCamId; + UIView* preview; +} +@property (nonatomic, retain) IBOutlet UIView* preview; +@end diff --git a/Classes/LinphoneUI/UICamSwitch.m b/Classes/LinphoneUI/UICamSwitch.m new file mode 100644 index 000000000..aaa3032e3 --- /dev/null +++ b/Classes/LinphoneUI/UICamSwitch.m @@ -0,0 +1,80 @@ +/* UICamSwitch.m + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UICamSwitch.h" +#include "LinphoneManager.h" + + +@implementation UICamSwitch +@synthesize preview; +-(void) touchUp:(id) sender { + if (nextCamId!=currentCamId) { + ms_message("Swithcing from [%s] to [%s]",currentCamId,nextCamId); + linphone_core_set_video_device([LinphoneManager getLc], nextCamId); + nextCamId=currentCamId; + currentCamId = linphone_core_get_video_device([LinphoneManager getLc]); + linphone_core_update_call([LinphoneManager getLc] + , linphone_core_get_current_call([LinphoneManager getLc]) + ,NULL); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],preview); + } +} + +- (id) init { + [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; + currentCamId = (char*)linphone_core_get_video_device([LinphoneManager getLc]); + if ([LinphoneManager instance].frontCamId !=nil ) { + //ok, we have 2 cameras + if (strcmp(currentCamId,[LinphoneManager instance].frontCamId)==0) { + nextCamId = [LinphoneManager instance].backCamId; + } else { + nextCamId = [LinphoneManager instance].frontCamId; + } + } else { + nextCamId=currentCamId; + } + return self; +} +- (id)initWithFrame:(CGRect)frame { + + self = [super initWithFrame:frame]; + if (self) { + [self init]; + } + return self; +} +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self init]; + } + return self; +} + + +- (void)dealloc { + [super dealloc]; + [preview release]; +} + + + + + +@end diff --git a/Classes/LinphoneUI/UILinphone.h b/Classes/LinphoneUI/UILinphone.h index 6c9ed3840..9820da892 100644 --- a/Classes/LinphoneUI/UILinphone.h +++ b/Classes/LinphoneUI/UILinphone.h @@ -1,4 +1,4 @@ -/* UIHangUpButton.h +/* UILinphone.h * * Copyright (C) 2011 Belledonne Comunications, Grenoble, France * @@ -26,3 +26,4 @@ #import "UIDuration.h" #import "UIEraseButton.h" #import "LinphoneUIDelegates.h" +#import "UICamSwitch.h" diff --git a/Classes/VideoViewController.h b/Classes/VideoViewController.h index 4ab762d2c..569d45b44 100644 --- a/Classes/VideoViewController.h +++ b/Classes/VideoViewController.h @@ -24,6 +24,7 @@ UIView* mPreview; UIMuteButton* mMute; UIHangUpButton* mHangUp; + UICamSwitch* mCamSwitch; } @@ -31,4 +32,5 @@ @property (nonatomic, retain) IBOutlet UIView* mPreview; @property (nonatomic, retain) IBOutlet UIMuteButton* mMute; @property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUp; +@property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitch; @end \ No newline at end of file diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index d84e9b731..2e4df1863 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -25,6 +25,7 @@ @synthesize mPreview; @synthesize mMute; @synthesize mHangUp; +@synthesize mCamSwitch; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { @@ -53,12 +54,14 @@ - (void)viewDidLoad { [super viewDidLoad]; - + [mMute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; + [mCamSwitch setPreview:mPreview]; } - (void)viewDidUnload { [super viewDidUnload]; + // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index 759671486..b2a7f9f62 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -70,7 +70,6 @@ 15 16 - mute 3 MQA @@ -96,13 +95,16 @@ 0 0 - hangup 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + NSImage + stopcall-red.png + @@ -181,6 +183,22 @@ 11 + + + mCamSwitch + + + + 12 + + + + mMute + + + + 13 + @@ -257,6 +275,7 @@ 6.IBPluginDependency 7.CustomClassName 7.IBPluginDependency + 8.CustomClassName 8.IBPluginDependency 9.IBPluginDependency @@ -271,6 +290,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UICamSwitch com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -287,11 +307,30 @@ - 11 + 13 YES + + UICamSwitch + UIButton + + preview + UIView + + + preview + + preview + UIView + + + + IBProjectSource + ./Classes/UICamSwitch.h + + UIHangUpButton UIButton @@ -323,6 +362,7 @@ YES YES + mCamSwitch mDisplay mHangUp mMute @@ -330,6 +370,7 @@ YES + UICamSwitch UIImageView UIHangUpButton UIMuteButton @@ -340,6 +381,7 @@ YES YES + mCamSwitch mDisplay mHangUp mMute @@ -347,6 +389,10 @@ YES + + mCamSwitch + UICamSwitch + mDisplay UIImageView @@ -380,6 +426,10 @@ YES 3 + + stopcall-red.png + {62, 54} + 300 diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index b88f1b2c5..05cd5250c 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -73,6 +73,7 @@ 22A10F3B11F8960300373793 /* libortp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2C10765B400068D98F /* libortp.a */; }; 22AA8AFD13D7125600B30535 /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; }; 22AA8AFE13D7125600B30535 /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFC13D7125500B30535 /* libmsx264.a */; }; + 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 22AA8B0013D83F6300B30535 /* UICamSwitch.m */; }; 22B5EFA310CE50BD00777D97 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */; }; 22B5EFE510CE5E5800777D97 /* ContactPickerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22B5EFE410CE5E5800777D97 /* ContactPickerDelegate.m */; }; 22B5F03510CE6B2F00777D97 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5F03410CE6B2F00777D97 /* AddressBook.framework */; }; @@ -329,6 +330,8 @@ 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = liblinphone.xcodeproj; path = submodules/liblinphone.xcodeproj; sourceTree = ""; }; 22AA8AFB13D7125500B30535 /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx264.a; path = "liblinphone-sdk/apple-darwin/lib/libx264.a"; sourceTree = ""; }; 22AA8AFC13D7125500B30535 /* libmsx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsx264.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsx264.a"; sourceTree = ""; }; + 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICamSwitch.h; sourceTree = ""; }; + 22AA8B0013D83F6300B30535 /* UICamSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICamSwitch.m; sourceTree = ""; }; 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; 22B5EFE310CE5E5800777D97 /* ContactPickerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactPickerDelegate.h; sourceTree = ""; }; 22B5EFE410CE5E5800777D97 /* ContactPickerDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactPickerDelegate.m; sourceTree = ""; }; @@ -739,6 +742,8 @@ 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */, 223963151393CFAE001DE689 /* FastAddressBook.h */, 223963161393CFAF001DE689 /* FastAddressBook.m */, + 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */, + 22AA8B0013D83F6300B30535 /* UICamSwitch.m */, ); path = LinphoneUI; sourceTree = ""; @@ -1073,6 +1078,7 @@ 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */, 223963171393CFAF001DE689 /* FastAddressBook.m in Sources */, 22E028B713B4CCBD0068A713 /* VideoViewController.m in Sources */, + 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 714c9a529..b57946b55 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 714c9a52908ae8829f559775fccbbc407574c9ab +Subproject commit b57946b5518da0a50d62b24b6a06606b6006237c From 4dcafb05001337714e46eb183a0d445c899bb96b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 21 Jul 2011 18:46:35 +0200 Subject: [PATCH 014/122] enhanced video view --- Classes/VideoViewController.xib | 35 +++++++++++++++++++++++---------- submodules/linphone | 2 +- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index b2a7f9f62..61ac5ddd6 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -57,7 +57,7 @@ 292 - {{13, 408}, {72, 37}} + {{0, 398}, {106, 62}} @@ -82,11 +82,15 @@ 3 MC41AA + + NSImage + clavier-01-108px.png + 292 - {{98, 408}, {129, 37}} + {{107, 398}, {106, 63}} @@ -105,13 +109,15 @@ NSImage stopcall-red.png + 292 - {{240, 408}, {72, 37}} + {{213, 398}, {106, 62}} + NO IBCocoaTouchFramework 0 @@ -125,18 +131,19 @@ MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + 292 - {{210, 278}, {102, 114}} + {{216, 263}, {96, 128}} 3 MQA - + 2 @@ -149,8 +156,7 @@ 3 - MQA - + MC42NjY2NjY2NjY3AA IBCocoaTouchFramework @@ -215,10 +221,10 @@ YES + - @@ -427,8 +433,17 @@ YES 3 - stopcall-red.png - {62, 54} + YES + + YES + clavier-01-108px.png + stopcall-red.png + + + YES + {108, 60} + {62, 54} + 300 diff --git a/submodules/linphone b/submodules/linphone index b57946b55..0f67d9106 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit b57946b5518da0a50d62b24b6a06606b6006237c +Subproject commit 0f67d91065f5668b5520efc2d792cfdd8becc8b4 From 2d04319a3188f676608df33f3275da36eeb9b047 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 22 Jul 2011 10:00:46 +0200 Subject: [PATCH 015/122] add msx264.mk --- submodules/build/builders.d/msx264.mk | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 submodules/build/builders.d/msx264.mk diff --git a/submodules/build/builders.d/msx264.mk b/submodules/build/builders.d/msx264.mk new file mode 100644 index 000000000..aaf1e5e00 --- /dev/null +++ b/submodules/build/builders.d/msx264.mk @@ -0,0 +1,43 @@ +############################################################################ +# msx264.mk +# Copyright (C) 2011 Belledonne Communications,Grenoble France +# +############################################################################ +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################ +msx264_dir?=msx264 +$(BUILDER_SRC_DIR)/$(msx264_dir)/configure: + cd $(BUILDER_SRC_DIR)/$(msx264_dir) && ./autogen.sh + +$(BUILDER_BUILD_DIR)/$(msx264_dir)/Makefile: $(BUILDER_SRC_DIR)/$(msx264_dir)/configure + mkdir -p $(BUILDER_BUILD_DIR)/$(msx264_dir) + cd $(BUILDER_BUILD_DIR)/$(msx264_dir)/ \ + && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \ + $(BUILDER_SRC_DIR)/$(msx264_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} + +build-msx264: build-x264 $(BUILDER_BUILD_DIR)/$(msx264_dir)/Makefile + cd $(BUILDER_BUILD_DIR)/$(msx264_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install + +clean-msx264: clean-x264 + cd $(BUILDER_BUILD_DIR)/$(msx264_dir) && make clean + +veryclean-msx264: veryclean-x264 + -cd $(BUILDER_BUILD_DIR)/$(msx264_dir) && make distclean + -cd $(BUILDER_SRC_DIR)/$(msx264_dir) && rm -f configure + +clean-makefile-msx264: clean-makefile-x264 + cd $(BUILDER_BUILD_DIR)/$(msx264_dir) && rm -f Makefile From df166a9a52efbf269115825699e5241a4037c900 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 26 Jul 2011 15:29:40 +0200 Subject: [PATCH 016/122] G722 support added --- Classes/LinphoneUI/LinphoneManager.m | 1 + Settings.bundle/audio.plist | 20 +++++++++++++ .../liblinphone.xcodeproj/project.pbxproj | 30 +++++++++++++++++-- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index c57488173..83b755e1c 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -511,6 +511,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach [self configurePayloadType:"iLBC" fromPrefKey:@"ilbc_preference" withRate:8000]; [self configurePayloadType:"PCMU" fromPrefKey:@"pcmu_preference" withRate:8000]; [self configurePayloadType:"PCMA" fromPrefKey:@"pcma_preference" withRate:8000]; + [self configurePayloadType:"G722" fromPrefKey:@"g722_preference" withRate:8000]; //get video codecs from linphonerc const MSList *videoCodecs=linphone_core_get_video_codecs(theLinphoneCore); diff --git a/Settings.bundle/audio.plist b/Settings.bundle/audio.plist index 33d5f5ce2..49c321430 100644 --- a/Settings.bundle/audio.plist +++ b/Settings.bundle/audio.plist @@ -20,6 +20,26 @@ Type PSToggleSwitchSpecifier + + DefaultValue + + Key + speex_8k_preference + Title + Speex 8Khz + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + g722_preference + Title + G722 + Type + PSToggleSwitchSpecifier + DefaultValue diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index d3259db2b..e6c5aac46 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -181,6 +181,12 @@ 2258C44C13A946890087A596 /* videoenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 2258C44913A946890087A596 /* videoenc.c */; }; 2258C44D13A946890087A596 /* videodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 2258C44A13A946890087A596 /* videodec.c */; }; 225D355A124B1FF60008581C /* linphonecall.c in Sources */ = {isa = PBXBuildFile; fileRef = 225D3559124B1FF60008581C /* linphonecall.c */; }; + 229A614D13DDFE3500090183 /* g722_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 229A614913DDFE3500090183 /* g722_decode.c */; }; + 229A614E13DDFE3500090183 /* g722_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 229A614A13DDFE3500090183 /* g722_encode.c */; }; + 229A614F13DDFE3500090183 /* g722.h in Headers */ = {isa = PBXBuildFile; fileRef = 229A614B13DDFE3500090183 /* g722.h */; }; + 229A615013DDFE3500090183 /* msg722.c in Sources */ = {isa = PBXBuildFile; fileRef = 229A614C13DDFE3500090183 /* msg722.c */; }; + 229A615313DEE8A500090183 /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 229A615113DEE8A400090183 /* libx264.a */; }; + 229A615413DEE8A500090183 /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 229A615213DEE8A400090183 /* libmsx264.a */; }; 229B9D5913043EAB00EFCD1C /* linphonecore_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */; }; 22A10B5611F84E2D00373793 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B4F11F84E2D00373793 /* config.h */; }; 22A10B5711F84E2D00373793 /* gsm.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5011F84E2D00373793 /* gsm.h */; }; @@ -243,7 +249,6 @@ 221F58AB13AB71A400D603C9 /* sizeconv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sizeconv.c; sourceTree = ""; }; 221F58AD13ABA42800D603C9 /* scaler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scaler.c; sourceTree = ""; }; 221F58E313AF44B300D603C9 /* scaler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scaler.h; sourceTree = ""; }; - 22276E7F13C4637100210156 /* msandroidvideo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = msandroidvideo.cpp; path = "../../../../../../workspace-iphone-port/linphone-iphone-tunnel/submodules/linphone/mediastreamer2/src/msandroidvideo.cpp"; sourceTree = ""; }; 222CA5B911F6CF7600621220 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; 222CA5BA11F6CF7600621220 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; 222CA5BB11F6CF7600621220 /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; @@ -419,6 +424,12 @@ 2258C44913A946890087A596 /* videoenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = videoenc.c; sourceTree = ""; }; 2258C44A13A946890087A596 /* videodec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = videodec.c; sourceTree = ""; }; 225D3559124B1FF60008581C /* linphonecall.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linphonecall.c; sourceTree = ""; }; + 229A614913DDFE3500090183 /* g722_decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = g722_decode.c; sourceTree = ""; }; + 229A614A13DDFE3500090183 /* g722_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = g722_encode.c; sourceTree = ""; }; + 229A614B13DDFE3500090183 /* g722.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = g722.h; sourceTree = ""; }; + 229A614C13DDFE3500090183 /* msg722.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msg722.c; sourceTree = ""; }; + 229A615113DEE8A400090183 /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx264.a; path = "../liblinphone-sdk/apple-darwin/lib/libx264.a"; sourceTree = ""; }; + 229A615213DEE8A400090183 /* libmsx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsx264.a; path = "../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsx264.a"; sourceTree = ""; }; 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphonecore_utils.h; sourceTree = ""; }; 22A10B4F11F84E2D00373793 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; 22A10B5011F84E2D00373793 /* gsm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gsm.h; sourceTree = ""; }; @@ -456,6 +467,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 229A615313DEE8A500090183 /* libx264.a in Frameworks */, + 229A615413DEE8A500090183 /* libmsx264.a in Frameworks */, 221F58A013AB50F800D603C9 /* CoreMedia.framework in Frameworks */, 2258C44513A945520087A596 /* libswscale.a in Frameworks */, 2258C44613A945520087A596 /* libavutil.a in Frameworks */, @@ -497,6 +510,8 @@ 0867D691FE84028FC02AAC07 /* liblinphone */ = { isa = PBXGroup; children = ( + 229A615113DEE8A400090183 /* libx264.a */, + 229A615213DEE8A400090183 /* libmsx264.a */, 221F589F13AB50F800D603C9 /* CoreMedia.framework */, 221F589D13AB503F00D603C9 /* CoreVideo.framework */, 221F589913AB4EEE00D603C9 /* CoreFoundation.framework */, @@ -625,9 +640,12 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 229A614913DDFE3500090183 /* g722_decode.c */, + 229A614A13DDFE3500090183 /* g722_encode.c */, + 229A614B13DDFE3500090183 /* g722.h */, + 229A614C13DDFE3500090183 /* msg722.c */, 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */, 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */, - 22276E7F13C4637100210156 /* msandroidvideo.cpp */, 221F58AD13ABA42800D603C9 /* scaler.c */, 221F58AB13AB71A400D603C9 /* sizeconv.c */, 221F58A513AB716300D603C9 /* tonedetector.c */, @@ -972,6 +990,7 @@ 2258C44113A9377B0087A596 /* swscale.h in Headers */, 221F58A413AB708C00D603C9 /* alldescs.h in Headers */, 221F58E413AF44B300D603C9 /* scaler.h in Headers */, + 229A614F13DDFE3500090183 /* g722.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1165,6 +1184,9 @@ 221F58AE13ABA42800D603C9 /* scaler.c in Sources */, 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */, 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */, + 229A614D13DDFE3500090183 /* g722_decode.c in Sources */, + 229A614E13DDFE3500090183 /* g722_encode.c in Sources */, + 229A615013DDFE3500090183 /* msg722.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1420,6 +1442,7 @@ VIDEO_ENABLED, HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, + HAVE_X264, ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; @@ -1428,6 +1451,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; @@ -1463,6 +1487,7 @@ VIDEO_ENABLED, HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, + HAVE_X264, ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; @@ -1471,6 +1496,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", ); OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PRODUCT_NAME = "$(TARGET_NAME)"; From 75c4af57bc213bb5e41c2c11ce7ed36fb634c964 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 26 Jul 2011 15:29:53 +0200 Subject: [PATCH 017/122] update linphone submodule with G722 --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 0f67d9106..a33760883 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 0f67d91065f5668b5520efc2d792cfdd8becc8b4 +Subproject commit a337608838c14894edbac62d67e394cdf0cbb34f From 049d99e80239f52472e1da4557b4674204d6b6a7 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 28 Jul 2011 09:25:09 +0200 Subject: [PATCH 018/122] add adhoc target to xcode for liblinphone --- linphone-Info.plist | 4 +- .../liblinphone.xcodeproj/project.pbxproj | 140 ++++++++++++++++++ submodules/linphone | 2 +- 3 files changed, 143 insertions(+), 3 deletions(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index 44b4788bb..6d492a6b8 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.4.4 + 3.4.5 CFBundleSignature ???? CFBundleVersion - 1.0.6 + 1.0.6.1 NSMainNibFile PhoneMainView UIApplicationExitsOnSuspend diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index e6c5aac46..bc65ac44d 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -1412,6 +1412,143 @@ }; name = Release; }; + 229A615513DF03B200090183 /* DistributionAdhoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __MACIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, + MS2_INTERNAL, + ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + linphone/mediastreamer2/build/iphone, + linphone/mediastreamer2/include, + linphone/oRTP/include, + externals/gsm/, + externals/osip/include, + externals/exosip/include, + externals/speex/include, + ); + OTHER_LDFLAGS = "-ObjC"; + PREBINDING = NO; + SDKROOT = iphoneos; + VALID_ARCHS = "armv6 armv7 i386"; + }; + name = DistributionAdhoc; + }; + 229A615613DF03B200090183 /* DistributionAdhoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + DSTROOT = /tmp/liblinphone.dst; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = liblinphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __IOSIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, + MS2_INTERNAL, + VIDEO_ENABLED, + HAVE_LIBAVCODEC_AVCODEC_H, + HAVE_LIBSWSCALE_SWSCALE_H, + ); + GCC_UNROLL_LOOPS = NO; + HEADER_SEARCH_PATHS = ( + linphone/mediastreamer2/build/iphone, + linphone/mediastreamer2/include, + linphone/oRTP/include, + externals/gsm/, + externals/osip/include, + externals/exosip/include, + externals/speex/include, + externals/ffmpeg, + external/ffmpeg/swscale, + "../liblinphone-sdk/apple-darwin/include", + ); + INSTALL_PATH = /usr/local/lib; + PRODUCT_NAME = linphone; + }; + name = DistributionAdhoc; + }; + 229A615713DF03B200090183 /* DistributionAdhoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_BYTE_ORDER=_LITTLE_ENDIAN", + ORTP_INET6, + ENABLE_TRACE, + "LINPHONE_VERSION=\\\"debug\\\"", + "LINPHONE_PLUGINS_DIR=\\\"\\\\tmp\\\"", + "LOG_DOMAIN=\\\"Linphone\\\"", + "ORTP_MAJOR_VERSION=0", + "ORTP_MICRO_VERSION=0", + "ORTP_MINOR_VERSION=15", + "ORTP_VERSION=\\\"0.15.0\\\"", + "PACKAGE=\\\"ortp\\\"", + "POSIXTIMER_INTERVAL=10000", + IN_LINPHONE, + __IOSIOUNIT_ENABLED__, + HAVE_EXOSIP_GET_SOCKET, + MS2_INTERNAL, + VIDEO_ENABLED, + HAVE_LIBAVCODEC_AVCODEC_H, + HAVE_LIBSWSCALE_SWSCALE_H, + HAVE_X264, + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + INFOPLIST_FILE = "linphone/mediastreamer2/tests/ios/mediastream-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", + ); + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = DistributionAdhoc; + }; 22DD19DB13A8D7FA0018ECD4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1513,6 +1650,7 @@ buildConfigurations = ( 1DEB921F08733DC00010E9CD /* Debug */, 1DEB922008733DC00010E9CD /* Release */, + 229A615613DF03B200090183 /* DistributionAdhoc */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1522,6 +1660,7 @@ buildConfigurations = ( 1DEB922308733DC00010E9CD /* Debug */, 1DEB922408733DC00010E9CD /* Release */, + 229A615513DF03B200090183 /* DistributionAdhoc */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1531,6 +1670,7 @@ buildConfigurations = ( 22DD19DB13A8D7FA0018ECD4 /* Debug */, 22DD19DC13A8D7FA0018ECD4 /* Release */, + 229A615713DF03B200090183 /* DistributionAdhoc */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/submodules/linphone b/submodules/linphone index a33760883..ecfeebfd2 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit a337608838c14894edbac62d67e394cdf0cbb34f +Subproject commit ecfeebfd2eaf0d7ab0ba09c63e4969d44dc7b065 From a738e3a6f6d97d30b380c16656d14f2c4ae33565 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 29 Jul 2011 10:36:17 +0200 Subject: [PATCH 019/122] Updated msx264 version --- submodules/msx264 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/msx264 b/submodules/msx264 index fe371be61..330cd5436 160000 --- a/submodules/msx264 +++ b/submodules/msx264 @@ -1 +1 @@ -Subproject commit fe371be61909be37bc9692d856eb1f53b4815d02 +Subproject commit 330cd54369c7e15134c194ec3d0a7d4f5d56fa40 From 32cb03598856380cd696b6b62add215cda7b7bd9 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 29 Jul 2011 10:58:58 +0200 Subject: [PATCH 020/122] ios: auto-enable speaker when doing a video call --- Classes/VideoViewController.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index 2e4df1863..cb53434ec 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -19,6 +19,7 @@ #import "VideoViewController.h" #import "LinphoneManager.h" +#import @implementation VideoViewController @synthesize mDisplay; @@ -68,7 +69,13 @@ -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); - linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); + + //redirect audio to speaker + UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; + AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute + , sizeof (audioRouteOverride) + , &audioRouteOverride); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation From 06778843177b0b8b0d70e5439e3b789f95b6d18b Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 29 Jul 2011 10:59:36 +0200 Subject: [PATCH 021/122] ios: fix xcode projects --- linphone.xcodeproj/project.pbxproj | 8 +++++++ .../liblinphone.xcodeproj/project.pbxproj | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 05cd5250c..9fea01100 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -97,6 +97,8 @@ 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22F3D57D13CCC89600A0DA02 /* liblinphone.a */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; + 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -436,6 +438,8 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* linphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "linphone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -444,6 +448,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */, + 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */, 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */, 22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */, @@ -838,6 +844,8 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 70E542F413E147EB002BA2C0 /* QuartzCore.framework */, + 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, 22AA8AFB13D7125500B30535 /* libx264.a */, 22AA8AFC13D7125500B30535 /* libmsx264.a */, 22F3D57D13CCC89600A0DA02 /* liblinphone.a */, diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index bc65ac44d..11588ab59 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -208,6 +208,12 @@ 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */; }; 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */; }; + 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */; }; + 70E542F113E147CE002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F013E147CE002BA2C0 /* QuartzCore.framework */; }; + 70E542FA13E14816002BA2C0 /* shaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F613E14816002BA2C0 /* shaders.h */; }; + 70E542FB13E14816002BA2C0 /* shaders.m in Sources */ = {isa = PBXBuildFile; fileRef = 70E542F713E14816002BA2C0 /* shaders.m */; }; + 70E542FC13E14816002BA2C0 /* yuv2rgb.fs.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */; }; + 70E542FD13E14816002BA2C0 /* yuv2rgb.vs.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */; }; AA747D9F0F9514B9006C5449 /* liblinphone_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */; }; AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; /* End PBXBuildFile section */ @@ -457,6 +463,12 @@ 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qualityindicator.c; sourceTree = ""; }; 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratecontrol.c; sourceTree = ""; }; + 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 70E542F013E147CE002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 70E542F613E14816002BA2C0 /* shaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shaders.h; sourceTree = ""; }; + 70E542F713E14816002BA2C0 /* shaders.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = shaders.m; sourceTree = ""; }; + 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv2rgb.fs.h; sourceTree = ""; }; + 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv2rgb.vs.h; sourceTree = ""; }; AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblinphone_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -467,6 +479,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 70E542F113E147CE002BA2C0 /* QuartzCore.framework in Frameworks */, + 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */, 229A615313DEE8A500090183 /* libx264.a in Frameworks */, 229A615413DEE8A500090183 /* libmsx264.a in Frameworks */, 221F58A013AB50F800D603C9 /* CoreMedia.framework in Frameworks */, @@ -510,6 +524,8 @@ 0867D691FE84028FC02AAC07 /* liblinphone */ = { isa = PBXGroup; children = ( + 70E542F013E147CE002BA2C0 /* QuartzCore.framework */, + 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */, 229A615113DEE8A400090183 /* libx264.a */, 229A615213DEE8A400090183 /* libmsx264.a */, 221F589F13AB50F800D603C9 /* CoreMedia.framework */, @@ -640,6 +656,10 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 70E542F613E14816002BA2C0 /* shaders.h */, + 70E542F713E14816002BA2C0 /* shaders.m */, + 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */, + 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */, 229A614913DDFE3500090183 /* g722_decode.c */, 229A614A13DDFE3500090183 /* g722_encode.c */, 229A614B13DDFE3500090183 /* g722.h */, @@ -991,6 +1011,9 @@ 221F58A413AB708C00D603C9 /* alldescs.h in Headers */, 221F58E413AF44B300D603C9 /* scaler.h in Headers */, 229A614F13DDFE3500090183 /* g722.h in Headers */, + 70E542FA13E14816002BA2C0 /* shaders.h in Headers */, + 70E542FC13E14816002BA2C0 /* yuv2rgb.fs.h in Headers */, + 70E542FD13E14816002BA2C0 /* yuv2rgb.vs.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1187,6 +1210,7 @@ 229A614D13DDFE3500090183 /* g722_decode.c in Sources */, 229A614E13DDFE3500090183 /* g722_encode.c in Sources */, 229A615013DDFE3500090183 /* msg722.c in Sources */, + 70E542FB13E14816002BA2C0 /* shaders.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 51835ccac940ec3457d80fd7747f32071853bbc9 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 29 Jul 2011 10:59:53 +0200 Subject: [PATCH 022/122] New linphone version --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index ecfeebfd2..ffc772143 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit ecfeebfd2eaf0d7ab0ba09c63e4969d44dc7b065 +Subproject commit ffc772143363d53b2b5d135b0ba3c3dd8a9b6928 From 2446764ad7bfa41775e3db6dea4f3a22dfb5879e Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 1 Aug 2011 16:45:16 +0200 Subject: [PATCH 023/122] New linphone version --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index ffc772143..a4c2bbcfd 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit ffc772143363d53b2b5d135b0ba3c3dd8a9b6928 +Subproject commit a4c2bbcfde6ee17b69fe5fed64dac2377072e6b2 From 75232a3051b728d4587d5a61d28a5ea81686ce91 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 3 Aug 2011 15:42:47 +0200 Subject: [PATCH 024/122] Bump linphone version --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index a4c2bbcfd..a0557c19a 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit a4c2bbcfde6ee17b69fe5fed64dac2377072e6b2 +Subproject commit a0557c19a535ef89dbd3cab679955b8ec79f42e0 From 8ae28404e16e4a07057782eb10f821e792ae90c9 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 3 Aug 2011 15:51:23 +0200 Subject: [PATCH 025/122] ios: add vp8 compilation scripts --- .gitmodules | 3 ++ linphone.xcodeproj/project.pbxproj | 4 +++ submodules/build/builder-iphone-os.mk | 7 ++-- submodules/build/builders.d/libvpx.mk | 33 +++++++++++++++++++ submodules/externals/libvpx | 1 + .../liblinphone.xcodeproj/project.pbxproj | 8 +++++ 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 submodules/build/builders.d/libvpx.mk create mode 160000 submodules/externals/libvpx diff --git a/.gitmodules b/.gitmodules index 58601cfe1..923aaf877 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,3 +34,6 @@ [submodule "submodules/msx264"] path = submodules/msx264 url = git://git.linphone.org/msx264.git +[submodule "submodules/externals/libvpx"] + path = submodules/externals/libvpx + url = git://review.webmproject.org/libvpx.git diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 9fea01100..6add84603 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -97,6 +97,7 @@ 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22F3D57D13CCC89600A0DA02 /* liblinphone.a */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; /* End PBXBuildFile section */ @@ -438,6 +439,7 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 7066FC0B13E830E400EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* linphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "linphone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; @@ -448,6 +450,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */, 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */, 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */, @@ -844,6 +847,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 7066FC0B13E830E400EFC6DC /* libvpx.a */, 70E542F413E147EB002BA2C0 /* QuartzCore.framework */, 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, 22AA8AFB13D7125500B30535 /* libx264.a */, diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index dea57c805..015c9511e 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -33,6 +33,7 @@ linphone_configure_controls= \ --disable-sdl \ --disable-x11 \ --with-gsm=$(prefix) \ + --enable-vp8 \ SPEEX_CFLAGS="-I$(prefix)/include" \ SPEEXDSP_CFLAGS="-I$(prefix)/include" \ SPEEXDSP_LIBS="-L$(prefix)/lib -lspeexdsp" \ @@ -81,17 +82,17 @@ init: veryclean: veryclean-linphone rm -rf $(BUILDER_BUILD_DIR) -.NOTPARALLEL build-linphone: init build-openssl build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg $(LINPHONE_BUILD_DIR)/Makefile +.NOTPARALLEL build-linphone: init build-openssl build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg build-libvpx $(LINPHONE_BUILD_DIR)/Makefile cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install -clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-msilbc clean-libilbc clean-openssl clean-msamr clean-ffmpeg clean-msx264 +clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-msilbc clean-libilbc clean-openssl clean-msamr clean-ffmpeg clean-libvpx clean-msx264 cd $(LINPHONE_BUILD_DIR) && make clean veryclean-linphone: veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr veryclean-msx264 #-cd $(LINPHONE_BUILD_DIR) && make distclean -cd $(LINPHONE_SRC_DIR) && rm -f configure -clean-makefile-linphone: clean-makefile-osip2 clean-makefile-eXosip2 clean-makefile-speex clean-makefile-libilbc clean-makefile-msilbc clean-makefile-openssl clean-makefile-msamr clean-makefile-ffmpeg +clean-makefile-linphone: clean-makefile-osip2 clean-makefile-eXosip2 clean-makefile-speex clean-makefile-libilbc clean-makefile-msilbc clean-makefile-openssl clean-makefile-msamr clean-makefile-ffmpeg clean-makefile-libvpx cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile diff --git a/submodules/build/builders.d/libvpx.mk b/submodules/build/builders.d/libvpx.mk new file mode 100644 index 000000000..453cea967 --- /dev/null +++ b/submodules/build/builders.d/libvpx.mk @@ -0,0 +1,33 @@ +libvpx_configure_options=\ + --enable-static --disable-shared\ +# --extra-cflags="-arch $$ARCH" +# -Wl,-syslibroot,$$SYSROOT_PATH " \ + --enable-error-concealment --disable-examples + +ifneq (,$(findstring armv6,$(host))) + libvpx_configure_options+= --target=armv6-darwin-gcc --cpu=arm1176jzf-s +else ifneq (,$(findstring armv7,$(host))) + libvpx_configure_options+= --target=armv7-darwin-gcc --cpu=cortex-a8 +else + libvpx_configure_options+= --target=x86_64-darwin10-gcc +endif +libvpx_dir?=externals/libvpx + +$(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak: + mkdir -p $(BUILDER_BUILD_DIR)/$(libvpx_dir) + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir)/ \ + && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ + && $(BUILDER_SRC_DIR)/$(libvpx_dir)/configure --prefix=$(prefix) $(libvpx_configure_options) + +build-libvpx: $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install + +clean-libvpx: + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make clean + +veryclean-libvpx: + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make distclean + +clean-makefile-libvpx: + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && rm -f config.mak + diff --git a/submodules/externals/libvpx b/submodules/externals/libvpx new file mode 160000 index 000000000..6f080f9ce --- /dev/null +++ b/submodules/externals/libvpx @@ -0,0 +1 @@ +Subproject commit 6f080f9cec229bac78f78b5726849793aea91fd5 diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 11588ab59..cb523e691 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -208,6 +208,8 @@ 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */; }; 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */; }; + 7066FC0713E82A3600EFC6DC /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = 7066FC0613E82A3600EFC6DC /* vp8.c */; }; + 7066FC0A13E830B800EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0913E830B800EFC6DC /* libvpx.a */; }; 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */; }; 70E542F113E147CE002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F013E147CE002BA2C0 /* QuartzCore.framework */; }; 70E542FA13E14816002BA2C0 /* shaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F613E14816002BA2C0 /* shaders.h */; }; @@ -463,6 +465,8 @@ 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qualityindicator.c; sourceTree = ""; }; 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratecontrol.c; sourceTree = ""; }; + 7066FC0613E82A3600EFC6DC /* vp8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vp8.c; sourceTree = ""; }; + 7066FC0913E830B800EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "../liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F013E147CE002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 70E542F613E14816002BA2C0 /* shaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shaders.h; sourceTree = ""; }; @@ -479,6 +483,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7066FC0A13E830B800EFC6DC /* libvpx.a in Frameworks */, 70E542F113E147CE002BA2C0 /* QuartzCore.framework in Frameworks */, 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */, 229A615313DEE8A500090183 /* libx264.a in Frameworks */, @@ -524,6 +529,7 @@ 0867D691FE84028FC02AAC07 /* liblinphone */ = { isa = PBXGroup; children = ( + 7066FC0913E830B800EFC6DC /* libvpx.a */, 70E542F013E147CE002BA2C0 /* QuartzCore.framework */, 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */, 229A615113DEE8A400090183 /* libx264.a */, @@ -656,6 +662,7 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 7066FC0613E82A3600EFC6DC /* vp8.c */, 70E542F613E14816002BA2C0 /* shaders.h */, 70E542F713E14816002BA2C0 /* shaders.m */, 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */, @@ -1211,6 +1218,7 @@ 229A614E13DDFE3500090183 /* g722_encode.c in Sources */, 229A615013DDFE3500090183 /* msg722.c in Sources */, 70E542FB13E14816002BA2C0 /* shaders.m in Sources */, + 7066FC0713E82A3600EFC6DC /* vp8.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 3a76a6b3fe6a04f4acf159f207b8ceecf611f31d Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 4 Aug 2011 08:52:57 +0200 Subject: [PATCH 026/122] ios: use --force-target option to enable x86 with darwin10 --- submodules/build/builders.d/libvpx.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/build/builders.d/libvpx.mk b/submodules/build/builders.d/libvpx.mk index 453cea967..2616156c0 100644 --- a/submodules/build/builders.d/libvpx.mk +++ b/submodules/build/builders.d/libvpx.mk @@ -9,7 +9,7 @@ ifneq (,$(findstring armv6,$(host))) else ifneq (,$(findstring armv7,$(host))) libvpx_configure_options+= --target=armv7-darwin-gcc --cpu=cortex-a8 else - libvpx_configure_options+= --target=x86_64-darwin10-gcc + libvpx_configure_options+= --force-target=x86-darwin10-gcc endif libvpx_dir?=externals/libvpx From dbd4b9a0ff813b0ee123af7475d9d20ca99bfcc1 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 16 Aug 2011 13:11:14 +0200 Subject: [PATCH 027/122] ios: enable vp8 video codec --- Classes/LinphoneUI/LinphoneManager.m | 1 + Settings.bundle/video.plist | 10 +++++++ .../liblinphone.xcodeproj/project.pbxproj | 30 ++++++++++++++++--- submodules/linphone | 2 +- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 83b755e1c..b1adb6f96 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -522,6 +522,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } [self configurePayloadType:"MP4V-ES" fromPrefKey:@"mp4v-es_preference" withRate:90000]; [self configurePayloadType:"H264" fromPrefKey:@"h264_preference" withRate:90000]; + [self configurePayloadType:"VP8-DRAFT-0-3-2" fromPrefKey:@"vp8_preference" withRate:90000]; UIDevice* device = [UIDevice currentDevice]; diff --git a/Settings.bundle/video.plist b/Settings.bundle/video.plist index 9af1c4bb4..35f237d00 100644 --- a/Settings.bundle/video.plist +++ b/Settings.bundle/video.plist @@ -30,6 +30,16 @@ Type PSToggleSwitchSpecifier + + DefaultValue + + Key + vp8_preference + Title + VP8 + Type + PSToggleSwitchSpecifier + diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index cb523e691..2e20db1a8 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -208,12 +208,16 @@ 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */; }; 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */; }; + 7014533813FA7AEA00A01D86 /* opengles_display.c in Sources */ = {isa = PBXBuildFile; fileRef = 7014533513FA7AEA00A01D86 /* opengles_display.c */; }; + 7014533913FA7AEA00A01D86 /* opengles_display.h in Headers */ = {isa = PBXBuildFile; fileRef = 7014533613FA7AEA00A01D86 /* opengles_display.h */; }; + 7014533A13FA7AEA00A01D86 /* shaders.c in Sources */ = {isa = PBXBuildFile; fileRef = 7014533713FA7AEA00A01D86 /* shaders.c */; }; + 7014533C13FA7ECA00A01D86 /* zrtp.h in Headers */ = {isa = PBXBuildFile; fileRef = 7014533B13FA7ECA00A01D86 /* zrtp.h */; }; + 7014533E13FA841E00A01D86 /* zrtp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7014533D13FA841E00A01D86 /* zrtp.c */; }; 7066FC0713E82A3600EFC6DC /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = 7066FC0613E82A3600EFC6DC /* vp8.c */; }; 7066FC0A13E830B800EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0913E830B800EFC6DC /* libvpx.a */; }; 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */; }; 70E542F113E147CE002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F013E147CE002BA2C0 /* QuartzCore.framework */; }; 70E542FA13E14816002BA2C0 /* shaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F613E14816002BA2C0 /* shaders.h */; }; - 70E542FB13E14816002BA2C0 /* shaders.m in Sources */ = {isa = PBXBuildFile; fileRef = 70E542F713E14816002BA2C0 /* shaders.m */; }; 70E542FC13E14816002BA2C0 /* yuv2rgb.fs.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */; }; 70E542FD13E14816002BA2C0 /* yuv2rgb.vs.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */; }; AA747D9F0F9514B9006C5449 /* liblinphone_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */; }; @@ -465,12 +469,16 @@ 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qualityindicator.c; sourceTree = ""; }; 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratecontrol.c; sourceTree = ""; }; + 7014533513FA7AEA00A01D86 /* opengles_display.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opengles_display.c; sourceTree = ""; }; + 7014533613FA7AEA00A01D86 /* opengles_display.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opengles_display.h; sourceTree = ""; }; + 7014533713FA7AEA00A01D86 /* shaders.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = shaders.c; sourceTree = ""; }; + 7014533B13FA7ECA00A01D86 /* zrtp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zrtp.h; sourceTree = ""; }; + 7014533D13FA841E00A01D86 /* zrtp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zrtp.c; sourceTree = ""; }; 7066FC0613E82A3600EFC6DC /* vp8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vp8.c; sourceTree = ""; }; 7066FC0913E830B800EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "../liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F013E147CE002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 70E542F613E14816002BA2C0 /* shaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shaders.h; sourceTree = ""; }; - 70E542F713E14816002BA2C0 /* shaders.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = shaders.m; sourceTree = ""; }; 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv2rgb.fs.h; sourceTree = ""; }; 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv2rgb.vs.h; sourceTree = ""; }; AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblinphone_Prefix.pch; sourceTree = SOURCE_ROOT; }; @@ -662,9 +670,11 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 7014533513FA7AEA00A01D86 /* opengles_display.c */, + 7014533613FA7AEA00A01D86 /* opengles_display.h */, + 7014533713FA7AEA00A01D86 /* shaders.c */, 7066FC0613E82A3600EFC6DC /* vp8.c */, 70E542F613E14816002BA2C0 /* shaders.h */, - 70E542F713E14816002BA2C0 /* shaders.m */, 70E542F813E14816002BA2C0 /* yuv2rgb.fs.h */, 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */, 229A614913DDFE3500090183 /* g722_decode.c */, @@ -756,6 +766,7 @@ 222CA6A311F6CF9F00621220 /* ortp */ = { isa = PBXGroup; children = ( + 7014533B13FA7ECA00A01D86 /* zrtp.h */, 222CA6A411F6CF9F00621220 /* .gitignore */, 222CA6A511F6CF9F00621220 /* b64.h */, 222CA6A611F6CF9F00621220 /* event.h */, @@ -781,6 +792,7 @@ 222CA6B611F6CF9F00621220 /* src */ = { isa = PBXGroup; children = ( + 7014533D13FA841E00A01D86 /* zrtp.c */, 222CA6B711F6CF9F00621220 /* .gitignore */, 222CA6B811F6CF9F00621220 /* avprofile.c */, 222CA6B911F6CF9F00621220 /* b64.c */, @@ -1021,6 +1033,8 @@ 70E542FA13E14816002BA2C0 /* shaders.h in Headers */, 70E542FC13E14816002BA2C0 /* yuv2rgb.fs.h in Headers */, 70E542FD13E14816002BA2C0 /* yuv2rgb.vs.h in Headers */, + 7014533913FA7AEA00A01D86 /* opengles_display.h in Headers */, + 7014533C13FA7ECA00A01D86 /* zrtp.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1217,8 +1231,10 @@ 229A614D13DDFE3500090183 /* g722_decode.c in Sources */, 229A614E13DDFE3500090183 /* g722_encode.c in Sources */, 229A615013DDFE3500090183 /* msg722.c in Sources */, - 70E542FB13E14816002BA2C0 /* shaders.m in Sources */, 7066FC0713E82A3600EFC6DC /* vp8.c in Sources */, + 7014533813FA7AEA00A01D86 /* opengles_display.c in Sources */, + 7014533A13FA7AEA00A01D86 /* shaders.c in Sources */, + 7014533E13FA841E00A01D86 /* zrtp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1293,6 +1309,7 @@ VIDEO_ENABLED, HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, + TARGET_OS_IPHONE, ); GCC_UNROLL_LOOPS = NO; HEADER_SEARCH_PATHS = ( @@ -1341,6 +1358,7 @@ VIDEO_ENABLED, HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, + TARGET_OS_IPHONE, ); GCC_UNROLL_LOOPS = NO; HEADER_SEARCH_PATHS = ( @@ -1515,6 +1533,7 @@ VIDEO_ENABLED, HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, + TARGET_OS_IPHONE, ); GCC_UNROLL_LOOPS = NO; HEADER_SEARCH_PATHS = ( @@ -1564,6 +1583,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, HAVE_X264, + "TARGET_OS_IPHONE=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; @@ -1612,6 +1632,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, HAVE_X264, + "TARGET_OS_IPHONE=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; @@ -1657,6 +1678,7 @@ HAVE_LIBAVCODEC_AVCODEC_H, HAVE_LIBSWSCALE_SWSCALE_H, HAVE_X264, + "TARGET_OS_IPHONE=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; diff --git a/submodules/linphone b/submodules/linphone index a0557c19a..be6d716e5 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit a0557c19a535ef89dbd3cab679955b8ec79f42e0 +Subproject commit be6d716e51eea255a95b842f1c5343c46cef4d9d From 39e8d340b04d8a89bccd26418f263ae75707effa Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 16 Aug 2011 16:12:58 +0200 Subject: [PATCH 028/122] ios: new libvpx version and vp8 integration --- linphonerc | 4 ++-- submodules/externals/libvpx | 2 +- submodules/linphone | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/linphonerc b/linphonerc index c86bda58b..8bc16c690 100644 --- a/linphonerc +++ b/linphonerc @@ -1,6 +1,6 @@ [net] -download_bw=380 -upload_bw=380 +download_bw=256 +upload_bw=256 firewall_policy=0 mtu=0 diff --git a/submodules/externals/libvpx b/submodules/externals/libvpx index 6f080f9ce..9cc161158 160000 --- a/submodules/externals/libvpx +++ b/submodules/externals/libvpx @@ -1 +1 @@ -Subproject commit 6f080f9cec229bac78f78b5726849793aea91fd5 +Subproject commit 9cc16115885ee20c81cd0ec5ba9bf4ae46af00de diff --git a/submodules/linphone b/submodules/linphone index be6d716e5..40023c6a4 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit be6d716e51eea255a95b842f1c5343c46cef4d9d +Subproject commit 40023c6a4d5062408604135925d908eaa15dfc5b From 7e05d67379f45f2906b6ebf6f2cce5dfdfbece26 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 17 Aug 2011 09:13:55 +0200 Subject: [PATCH 029/122] ios: enable TLS support --- Classes/LinphoneUI/LinphoneManager.m | 23 ++++++++++++++++------- Settings.bundle/Root.plist | 2 ++ linphone.xcodeproj/project.pbxproj | 4 ++++ submodules/externals/exosip | 2 +- submodules/externals/osip | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index b1adb6f96..22111305f 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -381,6 +381,12 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach else { linphone_core_disable_logs(); } + + NSBundle* myBundle = [NSBundle mainBundle]; + + const char* lRootCa = [[myBundle pathForResource:@"rootca"ofType:@"pem"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; + linphone_core_set_root_ca(theLinphoneCore, lRootCa); + NSString* transport = [[NSUserDefaults standardUserDefaults] stringForKey:@"transport_preference"]; @@ -393,9 +399,15 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach if ([transport isEqualToString:@"tcp"]) { if (transportValue.tcp_port == 0) transportValue.tcp_port=transportValue.udp_port; transportValue.udp_port=0; + transportValue.tls_port=0; } else if ([transport isEqualToString:@"udp"]){ if (transportValue.udp_port == 0) transportValue.udp_port=transportValue.tcp_port; transportValue.tcp_port=0; + transportValue.tls_port=0; + } else if ([transport isEqualToString:@"tls"]){ + if (transportValue.tls_port == 0) transportValue.tls_port=transportValue.udp_port; + transportValue.tcp_port=0; + transportValue.udp_port=0; } else { ms_error("unexpected trasnport [%s]",[transport cStringUsingEncoding:[NSString defaultCStringEncoding]]); } @@ -404,17 +416,14 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } } - - - + + // Set audio assets - NSBundle* myBundle = [NSBundle mainBundle]; const char* lRing = [[myBundle pathForResource:@"oldphone-mono"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; linphone_core_set_ring(theLinphoneCore, lRing ); const char* lRingBack = [[myBundle pathForResource:@"ringback"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; linphone_core_set_ringback(theLinphoneCore, lRingBack); - - + //configure sip account @@ -452,7 +461,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach //possible valid config detected LinphoneProxyConfig* proxyCfg; proxyCfg = linphone_proxy_config_new(); - + // add username password LinphoneAddress *from = linphone_address_new(identity); LinphoneAuthInfo *info; diff --git a/Settings.bundle/Root.plist b/Settings.bundle/Root.plist index a1b42969d..956a67660 100644 --- a/Settings.bundle/Root.plist +++ b/Settings.bundle/Root.plist @@ -169,6 +169,7 @@ udp tcp + tls Type PSMultiValueSpecifier @@ -176,6 +177,7 @@ udp tcp + tls diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 6add84603..05f725a78 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -97,6 +97,7 @@ 22F3D57E13CCC89600A0DA02 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22F3D57D13CCC89600A0DA02 /* liblinphone.a */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; @@ -439,6 +440,7 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 70571E1913FABCB000CDD3C2 /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = ""; }; 7066FC0B13E830E400EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -911,6 +913,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 70571E1913FABCB000CDD3C2 /* rootca.pem */, 22E19E47138A67A000FBFE87 /* missed_call.png */, 228B19AE130290C500F154D3 /* iTunesArtwork */, 2242E312125235120061DDCE /* oldphone-mono-30s.caf */, @@ -1059,6 +1062,7 @@ 22E028B813B4CCBD0068A713 /* VideoViewController.xib in Resources */, 226B563F13CAF1CD00921595 /* audio.plist in Resources */, 22E1A9E813CAF4AA00219531 /* video.plist in Resources */, + 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/externals/exosip b/submodules/externals/exosip index 361a5cfe2..7aba625f1 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit 361a5cfe25a31d503b0d9e46960d6908c6672aad +Subproject commit 7aba625f1c2a16cdac6b41b190cb2d46c8578cfe diff --git a/submodules/externals/osip b/submodules/externals/osip index 5a3da085c..c27b9b670 160000 --- a/submodules/externals/osip +++ b/submodules/externals/osip @@ -1 +1 @@ -Subproject commit 5a3da085ca1dcf82a852cee1e191cab0b98ff1f1 +Subproject commit c27b9b6702f62cdbd2143c1ccc85b8980b83adac From ad69acbe7b57525abd6cfc00ce7e1baf696bc0fd Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 17 Aug 2011 09:20:37 +0200 Subject: [PATCH 030/122] Update exosip version --- submodules/externals/exosip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/externals/exosip b/submodules/externals/exosip index 7aba625f1..ce927e6b8 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit 7aba625f1c2a16cdac6b41b190cb2d46c8578cfe +Subproject commit ce927e6b891a9d9129ab50d0666f6f22f37228a1 From 211e251f5ac47aa2795975b0c6964d0bec9dd8f0 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 17 Aug 2011 16:23:08 +0200 Subject: [PATCH 031/122] ios: fix crashes in video calls caused by invalid memory usage --- Classes/PhoneViewController.h | 1 + Classes/PhoneViewController.m | 19 +++++++++++++++---- Classes/VideoViewController.m | 1 + submodules/linphone | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 4eb0908bd..ca0751e36 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -70,6 +70,7 @@ } @property (nonatomic, retain) IBOutlet UIView* dialerView; +@property (nonatomic, retain) IBOutlet UIViewController* videoViewController; @property (nonatomic, retain) IBOutlet UITextField* address; @property (nonatomic, retain) IBOutlet UIButton* call; @property (nonatomic, retain) IBOutlet UIButton* hangup; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 1281e71c6..789d5ac12 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -55,6 +55,7 @@ @synthesize back; @synthesize myTabBarController; +@synthesize videoViewController; //implements keypad behavior @@ -121,7 +122,7 @@ [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; [erase initWithAddressField:address]; - mVideoViewController = [[VideoViewController alloc] initWithNibName:@"VideoViewController" + self.videoViewController = [[VideoViewController alloc] initWithNibName:@"VideoViewController" bundle:[NSBundle mainBundle]]; } @@ -153,7 +154,7 @@ [address resignFirstResponder]; [mDisplayName setText:@""]; //display name only relefvant - } + } return YES; } @@ -170,7 +171,17 @@ mIncomingCallActionSheet=nil; } } - [self dismissModalViewControllerAnimated:TRUE];//just in case + UIViewController* modalVC = self.modalViewController; + + if (modalVC != nil) { + // clear previous native window ids + if (modalVC == self.videoViewController) { + linphone_core_set_native_video_window_id([LinphoneManager getLc],0); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],0); + } + + [self dismissModalViewControllerAnimated:TRUE];//just in case + } [address setHidden:false]; if (username) { @@ -235,7 +246,7 @@ } -(void) displayVideoCallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [self presentModalViewController:mVideoViewController animated:true]; + [self presentModalViewController:self.videoViewController animated:true]; } //status reporting -(void) displayStatus:(NSString*) message { diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index cb53434ec..6efc48580 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -68,6 +68,7 @@ } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); diff --git a/submodules/linphone b/submodules/linphone index 40023c6a4..bd7e17664 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 40023c6a4d5062408604135925d908eaa15dfc5b +Subproject commit bd7e176640234d606fd4d02ad4f8c99597c940cd From 06e739f03b6e0245b709b0ee496c1bc83f6fe6a3 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 18 Aug 2011 11:02:47 +0200 Subject: [PATCH 032/122] Added missing resource (rootca.pem) --- Resources/rootca.pem | 3965 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3965 insertions(+) create mode 100644 Resources/rootca.pem diff --git a/Resources/rootca.pem b/Resources/rootca.pem new file mode 100644 index 000000000..cb25772cd --- /dev/null +++ b/Resources/rootca.pem @@ -0,0 +1,3965 @@ +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 +MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U +0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI +TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf +RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF +zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh +BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA +AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY +PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn +9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT +Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF +Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX +n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW +H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx +HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh +IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz +NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg +SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M +IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ +7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb +m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY +xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ +YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq +JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx +I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz +kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S +Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM +gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu +rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO +1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu +h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP +yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q +7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT +RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ +ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB +M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ +my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO +AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT +9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 +fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx +EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h +bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy +YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp +Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy +MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG +A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt +YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD +VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA +isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj +Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 +QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt +bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR +yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID +AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 +cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f +BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj +cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 +U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl +YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos +SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ +t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u +mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb +K+9A46sd33oqK8n8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS +BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v +cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 +4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB +Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J +0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ +FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx +bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q +SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb +6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV +m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g +eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG +kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 +6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG +CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc +aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB +gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w +aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 +tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 +nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M +77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV +Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L +ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM +zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU +rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF +YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT +oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu +FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB +0m6lG5kngOcLqagA +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV +BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK +EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq +b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow +djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx +EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG +9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa +F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 +eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV +Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB +k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 +ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV +dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO +txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD +VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD +QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY +S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ +mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR +qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE +TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe +1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG +UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v +U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN +AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw +MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD +VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM +BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m +cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws +ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx +8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ +s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c +9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V +pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ +pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC +aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y +CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ +6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG +A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 +MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF +AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob +sRQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 +MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG +EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT +CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK +8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 +98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb +2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC +ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi +Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB +o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl +ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD +AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL +AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd +foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M +cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq +8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp +hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk +Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf +MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp +Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww +HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES +MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg +MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B +8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY +tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl +HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj +zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU +JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM +ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv +a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p +K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi +puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT +yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO +owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC +jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy +fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo +Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo +M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM +Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed +2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH +/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl +nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE +O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU +9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9 +j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw +OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu +ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h +gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K +5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy +9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE +gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 +eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs +YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp +aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp +dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb +sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB +FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy +f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W ++sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 +uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf +tXncwKJrMiE3lvgOOBITRzcahirLer4c +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa +Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g +eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND +IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu +QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui +me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm +RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ +OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G +O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF +BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI +KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh +c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl +cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw +HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX +hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV +Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw +6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF +6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e +Pr3WHV1wA7EY6oT4zBx+2gT9XBTB +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE +ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE +AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ +BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT +aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl +KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX +GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj +93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ +P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow +ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g +ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN +W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB +IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB +ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA +ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb +MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv +J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW +pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J +HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu +dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD +QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG +A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV +BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln +bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo +VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs +Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI +iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD +VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 +oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey +LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF +BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi +UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg +T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 +b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS +C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw +CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt +iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M +eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 +iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp +ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv +hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ +TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg +U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN +MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G +A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD +ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts +YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO +4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF +KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL +/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw +EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 +dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh +My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB +BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g +IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 +IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 +dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM +GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ +MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq +bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ +xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU +upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk +GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug +5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma +M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ +HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW +Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 +JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x +W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE +82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx +UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan +ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 +2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV +tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw +OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu +ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue +Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA +iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE +OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db +w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC +3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC +AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 +eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 +IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z +aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw +OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy +bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM +ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 +7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG +dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF +JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz +1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw +OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v +LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu +ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks +ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX +REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D +CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU +YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP +l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 +MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz +dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg +Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg +Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt +L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf +BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN +AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI +cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 +CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW +ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB +KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE +ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg +U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX +DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 +IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg +U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd +uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v +LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c +ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w +bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM +MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH +AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr +YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC +ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf +MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO +Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz ++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB +vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE +ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z +dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq +hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 +WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh +bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g +dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE +AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt +YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 +rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL +VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 +I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV +HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ +vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ +bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl +IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe +BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW +iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms +1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD +VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz +MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD +VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx +JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz +MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe +MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 +GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 +fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx +Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u +jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx +ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp +/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ +co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s +zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo ++uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F +TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w +ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm +gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf +U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h +c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN +AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ +BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC +AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC +AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG ++EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV +HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN +BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y +PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M +AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP +qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP +sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v +dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ +O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P ++UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg +g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg +T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa +yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE +o2A= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICqDCCAZACCQCHc5eBqnSyFTANBgkqhkiG9w0BAQUFADAWMRQwEgYDVQQDEwt0 +aGlua3BhZC1wZTAeFw0xMTA3MTExNzU4NTVaFw0yMTA3MDgxNzU4NTVaMBYxFDAS +BgNVBAMTC3RoaW5rcGFkLXBlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtS6SgGwg+IEzl85WsXc2TnfLPZZTjoNGL/tb/fLIyaEx1/YopEyo0zSsenyA +95RFvPs4fK6+onmiRLq3YgYtbxSbv83/no/ggMkhMZw7Il2cguoxaiTpf6Z+zGNA +nX98M7ig5ISPnq+06Sw869NEAsYbiReNgazAJM53RdfSqZsok1A5CyXd3XUERLNm +UoCw917DNhu+N3xed/1t376yW4Bo/kkyrn1CRTG8jxi5xe+tCsDTWSjJzkS0e6WJ +MVK6PJxP0if7lw28Qh0zd9orR26HDbQ6TPpAF2sj7UhPleA4xkKjtiir3nITHkRR +bMvyd22gDAPIhZsF19X+dua8UwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQCm+aKc +dvClUqqhe/wACAHn+NOLGAYK6kLVJaWUzvcSFMU9M6iyJllpxO0BwhdxXrmLtG72 +lermeKh4wTiREP16Qdh0nNbtiB4cOAzBvHNzj6RymGAL50RBugu0zlY3wDUxDGS8 +M/7c4ZAB/BvieA09o2tnUGmL7PijDGPLE5bclIwVAkXaeXKa6bG0kJnr0ndxX68d +AJGNoSFTdxBMPw6gau77w7wQULFKFj4xTEKkYngNDsKERc/u/yrYRfkeehehRNmT +BcKocK4dDPPPzcJ12AjBnYtxitTRlJyXAkNVjLMTSg7lAU36JjNkvXqhSqDQJf04 +yW2ZnchxqK6f0gWO +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp +MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz +c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u +IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa +Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t +V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg +RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV +U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 +toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo +TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy +ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 +XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF +hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm +7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG +MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV +HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp +ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo +LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF +iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y +h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I +k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF +MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU +QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI +MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN +AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla +Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy +ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y +IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 +c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA +dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y +AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw +TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 +/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 +LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ +jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms +Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF +MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU +QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI +MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN +AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla +Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy +ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y +IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 +c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA +dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF +Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw +Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW +w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 +LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE +Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD +2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy +MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl +ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm +BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF +5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv +DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v +zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT +yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj +dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh +MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI +4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz +dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY +aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G +DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH +LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f +zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi +TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW +NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV +Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- From d0fe563edcfe0862e1244d2e7c19c8eb540aec2a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 5 Sep 2011 16:48:48 +0200 Subject: [PATCH 033/122] update libvpx repo --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 923aaf877..5c39ee33a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -36,4 +36,4 @@ url = git://git.linphone.org/msx264.git [submodule "submodules/externals/libvpx"] path = submodules/externals/libvpx - url = git://review.webmproject.org/libvpx.git + url = git://git.linphone.org/libvpx.git From da36fd889b3653b9939a2af5ef7aef622a7186b6 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 13 Sep 2011 17:16:29 +0200 Subject: [PATCH 034/122] remove status bar from video view --- Classes/PhoneViewController.m | 8 ++++++-- Classes/VideoViewController.m | 3 +++ Classes/VideoViewController.xib | 14 +++++++------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 15979f5e4..b36327475 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -147,7 +147,9 @@ // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } +- (void) viewWillAppear:(BOOL)animated { +} - (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == address) { @@ -160,6 +162,7 @@ -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + //cancel local notification, just in case if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground ) { @@ -179,8 +182,8 @@ linphone_core_set_native_video_window_id([LinphoneManager getLc],0); linphone_core_set_native_preview_window_id([LinphoneManager getLc],0); } - - [self dismissModalViewControllerAnimated:TRUE];//just in case + [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; + [self dismissModalViewControllerAnimated:FALSE];//just in case } [address setHidden:false]; @@ -246,6 +249,7 @@ } -(void) displayVideoCallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; [self presentModalViewController:self.videoViewController animated:true]; } //status reporting diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index 6efc48580..e0adcd168 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -65,6 +65,9 @@ // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; +} +-(void) viewWillDisappear:(BOOL)animated { + } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index 61ac5ddd6..299cc07b7 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -2,7 +2,7 @@ 1056 - 10K540 + 10K549 1305 1038.36 461.00 @@ -46,7 +46,7 @@ 274 - {320, 400} + {320, 420} @@ -57,7 +57,7 @@ 292 - {{0, 398}, {106, 62}} + {{1, 418}, {108, 62}} @@ -90,7 +90,7 @@ 292 - {{107, 398}, {106, 63}} + {{106, 418}, {106, 63}} @@ -114,7 +114,7 @@ 292 - {{213, 398}, {106, 62}} + {{211, 418}, {108, 62}} @@ -150,7 +150,7 @@ IBCocoaTouchFramework - {{0, 20}, {320, 460}} + {320, 480} @@ -158,7 +158,6 @@ 3 MC42NjY2NjY2NjY3AA - IBCocoaTouchFramework @@ -227,6 +226,7 @@ + View -1 From 4c210967a75888eb7e1f027b01f5c4f6caf04e0b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Sep 2011 15:24:12 +0200 Subject: [PATCH 035/122] updated repository --- submodules/libilbc-rfc3951 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/libilbc-rfc3951 b/submodules/libilbc-rfc3951 index 8af11e23e..af32518af 160000 --- a/submodules/libilbc-rfc3951 +++ b/submodules/libilbc-rfc3951 @@ -1 +1 @@ -Subproject commit 8af11e23e482c98a40e5661c16974b297a0d0396 +Subproject commit af32518af41f97caee07070234a3475409b9a27d From 5f985c7f9b3f90309201aaf99d53f91e80a5231c Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 14 Sep 2011 16:18:01 +0200 Subject: [PATCH 036/122] update linphone submodule --- submodules/libilbc-rfc3951 | 2 +- submodules/linphone | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/libilbc-rfc3951 b/submodules/libilbc-rfc3951 index af32518af..8af11e23e 160000 --- a/submodules/libilbc-rfc3951 +++ b/submodules/libilbc-rfc3951 @@ -1 +1 @@ -Subproject commit af32518af41f97caee07070234a3475409b9a27d +Subproject commit 8af11e23e482c98a40e5661c16974b297a0d0396 diff --git a/submodules/linphone b/submodules/linphone index bd7e17664..406c3a101 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit bd7e176640234d606fd4d02ad4f8c99597c940cd +Subproject commit 406c3a1019964463a0565488f7bf746fc8bab360 From 0d4dcfd4db5116bcd0a85a5c6db40e0446179e23 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 19 Sep 2011 10:08:45 +0200 Subject: [PATCH 037/122] update to the latest libilbc project --- submodules/libilbc-rfc3951 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/libilbc-rfc3951 b/submodules/libilbc-rfc3951 index 8af11e23e..af32518af 160000 --- a/submodules/libilbc-rfc3951 +++ b/submodules/libilbc-rfc3951 @@ -1 +1 @@ -Subproject commit 8af11e23e482c98a40e5661c16974b297a0d0396 +Subproject commit af32518af41f97caee07070234a3475409b9a27d From edf9cda3a346649238d2b562caaf3f3eac97d225 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 19 Sep 2011 17:13:16 +0200 Subject: [PATCH 038/122] implement lanscape mode for IOS video --- Classes/VideoViewController.h | 21 +- Classes/VideoViewController.m | 45 +++- Classes/VideoViewController.xib | 440 +++++++++++++++++++++----------- submodules/linphone | 2 +- 4 files changed, 356 insertions(+), 152 deletions(-) diff --git a/Classes/VideoViewController.h b/Classes/VideoViewController.h index 569d45b44..d6db828b0 100644 --- a/Classes/VideoViewController.h +++ b/Classes/VideoViewController.h @@ -20,17 +20,34 @@ #import "UILinphone.h" @interface VideoViewController : UIViewController { - UIImageView* mDisplay; + UIView* mPortrait; + UIView* mDisplay; UIView* mPreview; UIMuteButton* mMute; UIHangUpButton* mHangUp; UICamSwitch* mCamSwitch; + + UIView* mLandscape; + UIView* mDisplayLand; + UIView* mPreviewLand; + UIMuteButton* mMuteLand; + UIHangUpButton* mHangUpLand; + UICamSwitch* mCamSwitchLand; + BOOL isFirst; } -@property (nonatomic, retain) IBOutlet UIImageView* mDisplay; +@property (nonatomic, retain) IBOutlet UIView* mPortrait; +@property (nonatomic, retain) IBOutlet UIView* mDisplay; @property (nonatomic, retain) IBOutlet UIView* mPreview; @property (nonatomic, retain) IBOutlet UIMuteButton* mMute; @property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUp; @property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitch; + +@property (nonatomic, retain) IBOutlet UIView* mLandscape; +@property (nonatomic, retain) IBOutlet UIView* mDisplayLand; +@property (nonatomic, retain) IBOutlet UIView* mPreviewLand; +@property (nonatomic, retain) IBOutlet UIMuteButton* mMuteLand; +@property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUpLand; +@property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitchLand; @end \ No newline at end of file diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index e0adcd168..50bb1ecf8 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -22,12 +22,20 @@ #import @implementation VideoViewController +@synthesize mPortrait; @synthesize mDisplay; @synthesize mPreview; @synthesize mMute; @synthesize mHangUp; @synthesize mCamSwitch; +@synthesize mLandscape; +@synthesize mDisplayLand; +@synthesize mPreviewLand; +@synthesize mMuteLand; +@synthesize mHangUpLand; +@synthesize mCamSwitchLand; + - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; @@ -56,9 +64,29 @@ { [super viewDidLoad]; [mMute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; + [mMuteLand initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [mCamSwitch setPreview:mPreview]; + [mCamSwitchLand setPreview:mPreviewLand]; + isFirst=TRUE; } + +-(void) configureOrientation:(UIInterfaceOrientation) oritentation { + + if (oritentation == UIInterfaceOrientationPortrait ) { + [self.view addSubview:mPortrait]; + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); + linphone_core_set_device_rotation([LinphoneManager getLc], 0); + + } else if (oritentation == UIInterfaceOrientationLandscapeRight ) { + [self.view addSubview:mLandscape]; + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplayLand); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreviewLand); + linphone_core_set_device_rotation([LinphoneManager getLc], 270); + } + +} - (void)viewDidUnload { [super viewDidUnload]; @@ -72,8 +100,6 @@ -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); - linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); //redirect audio to speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; @@ -82,10 +108,19 @@ , &audioRouteOverride); } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations - return (interfaceOrientation == UIInterfaceOrientationPortrait); + return interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeRight ; } +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { + [self configureOrientation:self.interfaceOrientation]; + if (fromInterfaceOrientation !=self.interfaceOrientation) { + linphone_core_update_call([LinphoneManager getLc], linphone_core_get_current_call([LinphoneManager getLc]), NULL); + } +} +- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { + [mLandscape removeFromSuperview]; + [mPortrait removeFromSuperview]; +} @end diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index 299cc07b7..e6af95120 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -38,6 +38,17 @@ IBFirstResponder IBCocoaTouchFramework + + + 292 + {320, 460} + + + 1 + MCAwIDAAA + + IBCocoaTouchFramework + 274 @@ -48,7 +59,6 @@ 274 {320, 420} - 1 NO @@ -59,7 +69,6 @@ 292 {{1, 418}, {108, 62}} - NO IBCocoaTouchFramework @@ -92,7 +101,6 @@ 292 {{106, 418}, {106, 63}} - NO IBCocoaTouchFramework @@ -105,7 +113,7 @@ MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - + NSImage stopcall-red.png @@ -116,8 +124,6 @@ 292 {{211, 418}, {108, 62}} - - NO IBCocoaTouchFramework 0 @@ -138,12 +144,11 @@ 292 {{216, 263}, {96, 128}} - 3 MQA - + 2 @@ -152,7 +157,6 @@ {320, 480} - 3 @@ -160,18 +164,121 @@ IBCocoaTouchFramework + + + 292 + + YES + + + 274 + {420, 320} + + + + 3 + MQA + + + IBCocoaTouchFramework + + + + 292 + {{420, 0}, {60, 108}} + + + NO + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + mic_active.png + + + NSImage + clavier-01-106px.png + + + + + 292 + {{420, 107}, {60, 106}} + + + NO + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + + 292 + {{420, 212}, {60, 108}} + + NO + IBCocoaTouchFramework + 0 + 0 + + Switch + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + 274 + {{264, 210}, {142, 96}} + + + + 3 + MQA + + + IBCocoaTouchFramework + + + {480, 320} + + + + 3 + MQA + + + + 3 + 3 + + IBCocoaTouchFramework + YES - - - view - - - - 3 - mDisplay @@ -204,6 +311,78 @@ 13 + + + mPortrait + + + + 21 + + + + mLandscape + + + + 22 + + + + mDisplayLand + + + + 23 + + + + mPreviewLand + + + + 24 + + + + mHangUp + + + + 26 + + + + mMuteLand + + + + 27 + + + + mHangUpLand + + + + 28 + + + + mCamSwitchLand + + + + 29 + + + + view + + + + 32 + @@ -214,20 +393,6 @@ - - 1 - - - YES - - - - - - - - View - -1 @@ -239,12 +404,41 @@ + + 31 + + + YES + + + root + + + 1 + + + YES + + + + + + + + portrait + 5 display + + 9 + + + preview + 6 @@ -254,6 +448,7 @@ 7 + Hang Up Button 8 @@ -261,11 +456,52 @@ - 9 - - + 14 + + + YES + + + + + + + + landscape + + + 19 + + + Cam Switch + + + 18 + + + HangHup + + + 17 + + + Mute + + + 16 + + + YES + + preview + + 15 + + + display + @@ -276,6 +512,16 @@ -2.CustomClassName 1.IBEditorWindowLastContentRect 1.IBPluginDependency + 14.IBPluginDependency + 15.IBPluginDependency + 16.IBPluginDependency + 17.CustomClassName + 17.IBPluginDependency + 18.CustomClassName + 18.IBPluginDependency + 19.CustomClassName + 19.IBPluginDependency + 31.IBPluginDependency 5.IBPluginDependency 6.CustomClassName 6.IBPluginDependency @@ -292,6 +538,16 @@ {{556, 412}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIMuteButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIHangUpButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UICamSwitch + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIHangUpButton @@ -313,117 +569,9 @@ - 13 - - - - YES - - UICamSwitch - UIButton - - preview - UIView - - - preview - - preview - UIView - - - - IBProjectSource - ./Classes/UICamSwitch.h - - - - UIHangUpButton - UIButton - - IBProjectSource - ./Classes/UIHangUpButton.h - - - - UIMuteButton - UIToggleButton - - IBProjectSource - ./Classes/UIMuteButton.h - - - - UIToggleButton - UIButton - - IBProjectSource - ./Classes/UIToggleButton.h - - - - VideoViewController - UIViewController - - YES - - YES - mCamSwitch - mDisplay - mHangUp - mMute - mPreview - - - YES - UICamSwitch - UIImageView - UIHangUpButton - UIMuteButton - UIView - - - - YES - - YES - mCamSwitch - mDisplay - mHangUp - mMute - mPreview - - - YES - - mCamSwitch - UICamSwitch - - - mDisplay - UIImageView - - - mHangUp - UIHangUpButton - - - mMute - UIMuteButton - - - mPreview - UIView - - - - - IBProjectSource - ./Classes/VideoViewController.h - - - + 33 + 0 IBCocoaTouchFramework @@ -436,12 +584,16 @@ YES YES + clavier-01-106px.png clavier-01-108px.png + mic_active.png stopcall-red.png YES + {106, 60} {108, 60} + {32, 32} {62, 54} diff --git a/submodules/linphone b/submodules/linphone index 406c3a101..c51752fe7 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 406c3a1019964463a0565488f7bf746fc8bab360 +Subproject commit c51752fe70f7dd4e892ba87d00284095edda33e2 From cd2152f17eabc07f82ae715c72692134aed967ca Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 19 Sep 2011 18:55:10 +0200 Subject: [PATCH 039/122] add audio and video plist to the default settings --- Classes/LinphoneAppDelegate.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 377144a3b..53f1fb272 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -51,7 +51,9 @@ return; } - NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; + NSMutableDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; + [settings addEntriesFromDictionary:[NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"audio.plist"]]]; + [settings addEntriesFromDictionary:[NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"video.plist"]]]; NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; From 1c82ac2e95156e4156eb9d455315b3e4e8f558ab Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 21 Sep 2011 08:30:02 +0200 Subject: [PATCH 040/122] try to use native IOS resolution. Still not work very well for H264 --- Classes/VideoViewController.m | 2 +- submodules/linphone | 2 +- submodules/msx264 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index 50bb1ecf8..f51341c3b 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -99,7 +99,7 @@ } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - + [[UIApplication sharedApplication] setIdleTimerDisabled:true]; //redirect audio to speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; diff --git a/submodules/linphone b/submodules/linphone index c51752fe7..191084508 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit c51752fe70f7dd4e892ba87d00284095edda33e2 +Subproject commit 191084508f03345f817156c856f692c547766960 diff --git a/submodules/msx264 b/submodules/msx264 index 330cd5436..ca415bd41 160000 --- a/submodules/msx264 +++ b/submodules/msx264 @@ -1 +1 @@ -Subproject commit 330cd54369c7e15134c194ec3d0a7d4f5d56fa40 +Subproject commit ca415bd41ecb88b53ba0f46631d044df2e0ddcdb From 994467113f8e244e2ed631b816065708b7a41f96 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 7 Oct 2011 14:21:43 +0200 Subject: [PATCH 041/122] version 1.0.7.2 with video rotation --- linphone-Info.plist | 4 ++-- linphonerc | 2 +- .../liblinphone.xcodeproj/project.pbxproj | 18 ++++++++++++++++++ submodules/linphone | 2 +- submodules/msx264 | 2 +- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index 6d492a6b8..cb92f08d6 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.4.5 + 3.4.8 CFBundleSignature ???? CFBundleVersion - 1.0.6.1 + 1.0.7.2 NSMainNibFile PhoneMainView UIApplicationExitsOnSuspend diff --git a/linphonerc b/linphonerc index 8bc16c690..41df325bf 100644 --- a/linphonerc +++ b/linphonerc @@ -37,4 +37,4 @@ display=1 capture=1 show_local=0 enabled=1 -size=qvga-portrait \ No newline at end of file +size=ios-medium \ No newline at end of file diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 2e20db1a8..5beb14a67 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -188,6 +188,9 @@ 229A615313DEE8A500090183 /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 229A615113DEE8A400090183 /* libx264.a */; }; 229A615413DEE8A500090183 /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 229A615213DEE8A400090183 /* libmsx264.a */; }; 229B9D5913043EAB00EFCD1C /* linphonecore_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */; }; + 229ECDEB143AEA6300D611B8 /* msvideo_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 229ECDEA143AEA6300D611B8 /* msvideo_neon.c */; }; + 229ECDED143AEBDA00D611B8 /* conference.c in Sources */ = {isa = PBXBuildFile; fileRef = 229ECDEC143AEBDA00D611B8 /* conference.c */; }; + 229ECDEF143AEC2400D611B8 /* audioconference.c in Sources */ = {isa = PBXBuildFile; fileRef = 229ECDEE143AEC2400D611B8 /* audioconference.c */; }; 22A10B5611F84E2D00373793 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B4F11F84E2D00373793 /* config.h */; }; 22A10B5711F84E2D00373793 /* gsm.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5011F84E2D00373793 /* gsm.h */; }; 22A10B5811F84E2D00373793 /* private.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5211F84E2D00373793 /* private.h */; }; @@ -427,6 +430,9 @@ 222CA76211F6CFB100621220 /* siplogin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = siplogin.c; sourceTree = ""; }; 222CA76311F6CFB100621220 /* sipsetup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sipsetup.c; sourceTree = ""; }; 222CA76411F6CFB100621220 /* sipsetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sipsetup.h; sourceTree = ""; }; + 22313679143DED490035C1F4 /* msandroidvideo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = msandroidvideo.cpp; sourceTree = ""; }; + 224AD571143208BB00510FF3 /* android-display.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "android-display.c"; path = "../../../../../../workspace-android/linphone-android/submodules/linphone/mediastreamer2/src/android-display.c"; sourceTree = ""; }; + 224AD57314320EB400510FF3 /* scaler_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = scaler_arm.S; path = "../../../../../../workspace-android/linphone-android/submodules/linphone/mediastreamer2/src/scaler_arm.S"; sourceTree = ""; }; 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ec-calibrator.c"; path = "linphone/coreapi/ec-calibrator.c"; sourceTree = SOURCE_ROOT; }; 2258C44013A9377B0087A596 /* swscale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = swscale.h; sourceTree = ""; }; 2258C44213A945520087A596 /* libswscale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libswscale.a; path = "../liblinphone-sdk/apple-darwin/lib/libswscale.a"; sourceTree = ""; }; @@ -443,6 +449,9 @@ 229A615113DEE8A400090183 /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx264.a; path = "../liblinphone-sdk/apple-darwin/lib/libx264.a"; sourceTree = ""; }; 229A615213DEE8A400090183 /* libmsx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsx264.a; path = "../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsx264.a"; sourceTree = ""; }; 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphonecore_utils.h; sourceTree = ""; }; + 229ECDEA143AEA6300D611B8 /* msvideo_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msvideo_neon.c; sourceTree = ""; }; + 229ECDEC143AEBDA00D611B8 /* conference.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = conference.c; sourceTree = ""; }; + 229ECDEE143AEC2400D611B8 /* audioconference.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = audioconference.c; sourceTree = ""; }; 22A10B4F11F84E2D00373793 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; 22A10B5011F84E2D00373793 /* gsm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gsm.h; sourceTree = ""; }; 22A10B5111F84E2D00373793 /* gsm.h.orig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gsm.h.orig; sourceTree = ""; }; @@ -670,6 +679,11 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 22313679143DED490035C1F4 /* msandroidvideo.cpp */, + 229ECDEE143AEC2400D611B8 /* audioconference.c */, + 229ECDEA143AEA6300D611B8 /* msvideo_neon.c */, + 224AD57314320EB400510FF3 /* scaler_arm.S */, + 224AD571143208BB00510FF3 /* android-display.c */, 7014533513FA7AEA00A01D86 /* opengles_display.c */, 7014533613FA7AEA00A01D86 /* opengles_display.h */, 7014533713FA7AEA00A01D86 /* shaders.c */, @@ -834,6 +848,7 @@ 222CA72D11F6CFB100621220 /* coreapi */ = { isa = PBXGroup; children = ( + 229ECDEC143AEBDA00D611B8 /* conference.c */, 229B9D5813043EAB00EFCD1C /* linphonecore_utils.h */, 225D3559124B1FF60008581C /* linphonecall.c */, 22A10EE711F8920F00373793 /* mswebcam.c */, @@ -1235,6 +1250,9 @@ 7014533813FA7AEA00A01D86 /* opengles_display.c in Sources */, 7014533A13FA7AEA00A01D86 /* shaders.c in Sources */, 7014533E13FA841E00A01D86 /* zrtp.c in Sources */, + 229ECDEB143AEA6300D611B8 /* msvideo_neon.c in Sources */, + 229ECDED143AEBDA00D611B8 /* conference.c in Sources */, + 229ECDEF143AEC2400D611B8 /* audioconference.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 191084508..74f649291 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 191084508f03345f817156c856f692c547766960 +Subproject commit 74f64929191e62f473ddcd232c92c85f7d2a7fb0 diff --git a/submodules/msx264 b/submodules/msx264 index ca415bd41..35e159d42 160000 --- a/submodules/msx264 +++ b/submodules/msx264 @@ -1 +1 @@ -Subproject commit ca415bd41ecb88b53ba0f46631d044df2e0ddcdb +Subproject commit 35e159d4234e8468bea93eb26a84a36cce47d213 From eed3953489659c6411c307416841bcd45ef7e795 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 10 Oct 2011 12:21:13 +0200 Subject: [PATCH 042/122] update libvpx repo, update msx264 --- .gitmodules | 2 +- submodules/build/builders.d/libvpx.mk | 3 ++- submodules/externals/libvpx | 2 +- submodules/msx264 | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 5c39ee33a..c1dd99cd6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -36,4 +36,4 @@ url = git://git.linphone.org/msx264.git [submodule "submodules/externals/libvpx"] path = submodules/externals/libvpx - url = git://git.linphone.org/libvpx.git + url = http://git.chromium.org/webm/libvpx.git diff --git a/submodules/build/builders.d/libvpx.mk b/submodules/build/builders.d/libvpx.mk index 2616156c0..512272031 100644 --- a/submodules/build/builders.d/libvpx.mk +++ b/submodules/build/builders.d/libvpx.mk @@ -26,7 +26,8 @@ clean-libvpx: cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make clean veryclean-libvpx: - cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make distclean + -cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make distclean + rm -rf $(BUILDER_BUILD_DIR)/$(libvpx_dir) clean-makefile-libvpx: cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && rm -f config.mak diff --git a/submodules/externals/libvpx b/submodules/externals/libvpx index 9cc161158..6f9457ec1 160000 --- a/submodules/externals/libvpx +++ b/submodules/externals/libvpx @@ -1 +1 @@ -Subproject commit 9cc16115885ee20c81cd0ec5ba9bf4ae46af00de +Subproject commit 6f9457ec12a98b3aceefbcb79783c084268d0b36 diff --git a/submodules/msx264 b/submodules/msx264 index 35e159d42..2f4b56078 160000 --- a/submodules/msx264 +++ b/submodules/msx264 @@ -1 +1 @@ -Subproject commit 35e159d4234e8468bea93eb26a84a36cce47d213 +Subproject commit 2f4b56078405d960c3201e57c985af167ff03e2e From a8688f5012d10c7a749f20158b4eedfacf87fdf8 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 26 Oct 2011 10:39:23 +0200 Subject: [PATCH 043/122] fix build issue for sdk --- README | 1 + submodules/build/builders.d/x264.mk | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README b/README index 71bf976f5..127db86aa 100644 --- a/README +++ b/README @@ -9,6 +9,7 @@ Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must inst -wget -pkgconfig -cmake (for ZRTP support) +-yasm gas-preprosessor.pl (http://github.com/yuvi/gas-preprocessor/ ) to be copied into /opt/local/bin diff --git a/submodules/build/builders.d/x264.mk b/submodules/build/builders.d/x264.mk index a07f3bf3a..5eaceafff 100644 --- a/submodules/build/builders.d/x264.mk +++ b/submodules/build/builders.d/x264.mk @@ -55,7 +55,7 @@ $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak: $(BUILDER_BUILD_DIR)/$(x264_dir)/co && ./configure --prefix=$(prefix) ${x264-configure-option} build-x264: $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak - cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install + cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install-lib-dev clean-x264: cd $(BUILDER_BUILD_DIR)/$(x264_dir) && make clean From 827bc6bb0e284558a5f9f929aacb1028eeb52628 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 26 Oct 2011 11:26:26 +0200 Subject: [PATCH 044/122] fix x264 lib not installed --- submodules/build/builders.d/x264.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/build/builders.d/x264.mk b/submodules/build/builders.d/x264.mk index 5eaceafff..eebe3f22e 100644 --- a/submodules/build/builders.d/x264.mk +++ b/submodules/build/builders.d/x264.mk @@ -55,7 +55,7 @@ $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak: $(BUILDER_BUILD_DIR)/$(x264_dir)/co && ./configure --prefix=$(prefix) ${x264-configure-option} build-x264: $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak - cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install-lib-dev + cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install-lib-static clean-x264: cd $(BUILDER_BUILD_DIR)/$(x264_dir) && make clean From 1f069c52d4726bc0e23fa0fae21bc7cd87649e63 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 26 Oct 2011 21:31:05 +0200 Subject: [PATCH 045/122] fix default settings --- Classes/LinphoneAppDelegate.m | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 53f1fb272..8540af860 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -51,12 +51,16 @@ return; } - NSMutableDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; - [settings addEntriesFromDictionary:[NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"audio.plist"]]]; - [settings addEntriesFromDictionary:[NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"video.plist"]]]; - NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; - + NSMutableDictionary *rootSettings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; + NSMutableDictionary *audioSettings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"audio.plist"]]; + NSMutableDictionary *videoSettings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"video.plist"]]; + + NSMutableArray *preferences = [rootSettings objectForKey:@"PreferenceSpecifiers"]; + [preferences addObjectsFromArray:[audioSettings objectForKey:@"PreferenceSpecifiers"]]; + [preferences addObjectsFromArray:[videoSettings objectForKey:@"PreferenceSpecifiers"]]; + NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; + for(NSDictionary *prefSpecification in preferences) { NSString *key = [prefSpecification objectForKey:@"Key"]; if(key && [prefSpecification objectForKey:@"DefaultValue"]) { @@ -69,7 +73,8 @@ #ifdef HAVE_AMR @"YES",@"amr_8k_preference", // enable amr by default if compiled with #endif - //@"+33",@"countrycode_preference", + @"NO",@"debugenable_preference", + //@"+33",@"countrycode_preference", nil]; [defaultsToRegister addEntriesFromDictionary:appDefaults]; From f02f9f38f4ee618df318763f1a14e775bc758720 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 28 Oct 2011 22:01:58 +0200 Subject: [PATCH 046/122] - update linphone and ms2 submodules for rate control - fix build issues - fix all black video screen - fix microphone button not restored in initial state - attempt to disable idle timer, but with limited success... --- Classes/VideoViewController.m | 16 +++++- README | 4 +- linphone.xcodeproj/project.pbxproj | 52 +++++++++---------- submodules/build/builders.d/x264.mk | 6 ++- .../liblinphone.xcodeproj/project.pbxproj | 20 +++++-- submodules/linphone | 2 +- 6 files changed, 66 insertions(+), 34 deletions(-) diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index f51341c3b..acb065a57 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -87,6 +87,11 @@ } } + +-(void) configureOrientation { + [self configureOrientation:self.interfaceOrientation]; +} + - (void)viewDidUnload { [super viewDidUnload]; @@ -95,8 +100,9 @@ // e.g. self.myOutlet = nil; } -(void) viewWillDisappear:(BOOL)animated { - + [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; } + -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[UIApplication sharedApplication] setIdleTimerDisabled:true]; @@ -106,6 +112,14 @@ AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute , sizeof (audioRouteOverride) , &audioRouteOverride); + + + [self performSelectorOnMainThread:@selector(configureOrientation) + withObject:nil + waitUntilDone:YES]; + [mMute reset]; + [mMuteLand reset]; + [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { diff --git a/README b/README index 127db86aa..1c31943aa 100644 --- a/README +++ b/README @@ -12,7 +12,9 @@ Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must inst -yasm -gas-preprosessor.pl (http://github.com/yuvi/gas-preprocessor/ ) to be copied into /opt/local/bin +gas-preprosessor.pl (http://github.com/yuvi/gas-preprocessor/ ) to be copied into /opt/local/bin : +$ wget --no-check-certificate https://raw.github.com/yuvi/gas-preprocessor/master/gas-preprocessor.pl +$ sudo mv gas-preprocessor.pl /opt/local/bin/. Link macport libtoolize to glibtoolize (sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize) Link host's strings to simulator SDK (ln -s /usr/bin/strings /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/strings) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 05f725a78..d1140b64d 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -104,23 +104,23 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 22A10DA211F88C1F00373793 /* PBXContainerItemProxy */ = { + F4D9F24C145748E80035B0D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; + containerPortal = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; proxyType = 2; remoteGlobalIDString = D2AAC07E0554694100DB518D; remoteInfo = liblinphone; }; - 22DD19DE13A8D7FB0018ECD4 /* PBXContainerItemProxy */ = { + F4D9F24E145748E80035B0D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; + containerPortal = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; proxyType = 2; remoteGlobalIDString = 22DD19BE13A8D7FA0018ECD4; remoteInfo = mediastream; }; - 22F3D57B13CCC60500A0DA02 /* PBXContainerItemProxy */ = { + F4D9F25C145829200035B0D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; + containerPortal = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; proxyType = 1; remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = liblinphone; @@ -331,7 +331,6 @@ 22968A5E12F875C600588287 /* UISpeakerButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UISpeakerButton.m; sourceTree = ""; }; 22968A8612F87C2000588287 /* UIDuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIDuration.h; sourceTree = ""; }; 22968A8712F87C2000588287 /* UIDuration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIDuration.m; sourceTree = ""; }; - 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = liblinphone.xcodeproj; path = submodules/liblinphone.xcodeproj; sourceTree = ""; }; 22AA8AFB13D7125500B30535 /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx264.a; path = "liblinphone-sdk/apple-darwin/lib/libx264.a"; sourceTree = ""; }; 22AA8AFC13D7125500B30535 /* libmsx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsx264.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsx264.a"; sourceTree = ""; }; 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICamSwitch.h; sourceTree = ""; }; @@ -445,6 +444,7 @@ 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* linphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "linphone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = liblinphone.xcodeproj; path = submodules/liblinphone.xcodeproj; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -759,15 +759,6 @@ path = LinphoneUI; sourceTree = ""; }; - 22A10D9F11F88C1F00373793 /* Products */ = { - isa = PBXGroup; - children = ( - 22A10DA311F88C1F00373793 /* liblinphone.a */, - 22DD19DF13A8D7FB0018ECD4 /* mediastream.app */, - ); - name = Products; - sourceTree = ""; - }; 22C7560413265C6A007BC101 /* openssl */ = { isa = PBXGroup; children = ( @@ -849,6 +840,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */, 7066FC0B13E830E400EFC6DC /* libvpx.a */, 70E542F413E147EB002BA2C0 /* QuartzCore.framework */, 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, @@ -863,7 +855,6 @@ 22276E8113C73D3100210156 /* libavutil.a */, 22276E8213C73D3100210156 /* libswscale.a */, 2214783B1386A2030020F8B8 /* Localizable.strings */, - 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */, 223148E51178A09900637D6A /* libmsilbc.a */, 223148E31178A08200637D6A /* libilbc.a */, 220FAD2810765B400068D98F /* libeXosip2.a */, @@ -952,6 +943,15 @@ name = Frameworks; sourceTree = ""; }; + F4D9F244145748E80035B0D0 /* Products */ = { + isa = PBXGroup; + children = ( + F4D9F24D145748E80035B0D0 /* liblinphone.a */, + F4D9F24F145748E80035B0D0 /* mediastream.app */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -967,7 +967,7 @@ buildRules = ( ); dependencies = ( - 22F3D57C13CCC60500A0DA02 /* PBXTargetDependency */, + F4D9F25D145829200035B0D0 /* PBXTargetDependency */, ); name = linphone; productName = linphone; @@ -994,8 +994,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = 22A10D9F11F88C1F00373793 /* Products */; - ProjectRef = 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */; + ProductGroup = F4D9F244145748E80035B0D0 /* Products */; + ProjectRef = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; }, ); projectRoot = ""; @@ -1006,18 +1006,18 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - 22A10DA311F88C1F00373793 /* liblinphone.a */ = { + F4D9F24D145748E80035B0D0 /* liblinphone.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = liblinphone.a; - remoteRef = 22A10DA211F88C1F00373793 /* PBXContainerItemProxy */; + remoteRef = F4D9F24C145748E80035B0D0 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 22DD19DF13A8D7FB0018ECD4 /* mediastream.app */ = { + F4D9F24F145748E80035B0D0 /* mediastream.app */ = { isa = PBXReferenceProxy; fileType = wrapper.application; path = mediastream.app; - remoteRef = 22DD19DE13A8D7FB0018ECD4 /* PBXContainerItemProxy */; + remoteRef = F4D9F24E145748E80035B0D0 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -1101,10 +1101,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 22F3D57C13CCC60500A0DA02 /* PBXTargetDependency */ = { + F4D9F25D145829200035B0D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = liblinphone; - targetProxy = 22F3D57B13CCC60500A0DA02 /* PBXContainerItemProxy */; + targetProxy = F4D9F25C145829200035B0D0 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ diff --git a/submodules/build/builders.d/x264.mk b/submodules/build/builders.d/x264.mk index eebe3f22e..fbe943686 100644 --- a/submodules/build/builders.d/x264.mk +++ b/submodules/build/builders.d/x264.mk @@ -19,8 +19,12 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################ + +#--enable-static is mandatory otherwise the lib is not installed + x264-configure-option= \ --host=$(host)\ + --enable-static \ --cross-prefix=$$SDK_BIN_PATH/ \ --extra-ldflags="-arch $$ARCH -isysroot $$SYSROOT_PATH" @@ -55,7 +59,7 @@ $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak: $(BUILDER_BUILD_DIR)/$(x264_dir)/co && ./configure --prefix=$(prefix) ${x264-configure-option} build-x264: $(BUILDER_BUILD_DIR)/$(x264_dir)/config.mak - cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install-lib-static + cd $(BUILDER_BUILD_DIR)/$(x264_dir) make && make install clean-x264: cd $(BUILDER_BUILD_DIR)/$(x264_dir) && make clean diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 5beb14a67..125aa3eb7 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -139,7 +139,6 @@ 222CA71711F6CF9F00621220 /* scheduler.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA6CF11F6CF9F00621220 /* scheduler.c */; }; 222CA71811F6CF9F00621220 /* scheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA6D011F6CF9F00621220 /* scheduler.h */; }; 222CA71911F6CF9F00621220 /* sessionset.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA6D111F6CF9F00621220 /* sessionset.c */; }; - 222CA71A11F6CF9F00621220 /* srtp.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA6D211F6CF9F00621220 /* srtp.c */; }; 222CA71B11F6CF9F00621220 /* str_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA6D311F6CF9F00621220 /* str_utils.c */; }; 222CA71C11F6CF9F00621220 /* stun.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA6D411F6CF9F00621220 /* stun.c */; }; 222CA71D11F6CF9F00621220 /* stun_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA6D511F6CF9F00621220 /* stun_udp.c */; }; @@ -225,6 +224,10 @@ 70E542FD13E14816002BA2C0 /* yuv2rgb.vs.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E542F913E14816002BA2C0 /* yuv2rgb.vs.h */; }; AA747D9F0F9514B9006C5449 /* liblinphone_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */; }; AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; + F4D9F23F145710540035B0D0 /* netsim.c in Sources */ = {isa = PBXBuildFile; fileRef = F4D9F23D145710540035B0D0 /* netsim.c */; }; + F4D9F240145710540035B0D0 /* ortp_srtp.c in Sources */ = {isa = PBXBuildFile; fileRef = F4D9F23E145710540035B0D0 /* ortp_srtp.c */; }; + F4D9F26014583B580035B0D0 /* bitratedriver.c in Sources */ = {isa = PBXBuildFile; fileRef = F4D9F25E14583B580035B0D0 /* bitratedriver.c */; }; + F4D9F26114583B580035B0D0 /* qosanalyzer.c in Sources */ = {isa = PBXBuildFile; fileRef = F4D9F25F14583B580035B0D0 /* qosanalyzer.c */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -390,7 +393,6 @@ 222CA6CF11F6CF9F00621220 /* scheduler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scheduler.c; sourceTree = ""; }; 222CA6D011F6CF9F00621220 /* scheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scheduler.h; sourceTree = ""; }; 222CA6D111F6CF9F00621220 /* sessionset.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sessionset.c; sourceTree = ""; }; - 222CA6D211F6CF9F00621220 /* srtp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = srtp.c; sourceTree = ""; }; 222CA6D311F6CF9F00621220 /* str_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = str_utils.c; sourceTree = ""; }; 222CA6D411F6CF9F00621220 /* stun.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stun.c; sourceTree = ""; }; 222CA6D511F6CF9F00621220 /* stun_udp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stun_udp.c; sourceTree = ""; }; @@ -493,6 +495,10 @@ AA747D9E0F9514B9006C5449 /* liblinphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblinphone_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F4D9F23D145710540035B0D0 /* netsim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = netsim.c; sourceTree = ""; }; + F4D9F23E145710540035B0D0 /* ortp_srtp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ortp_srtp.c; sourceTree = ""; }; + F4D9F25E14583B580035B0D0 /* bitratedriver.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratedriver.c; sourceTree = ""; }; + F4D9F25F14583B580035B0D0 /* qosanalyzer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qosanalyzer.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -679,6 +685,8 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + F4D9F25E14583B580035B0D0 /* bitratedriver.c */, + F4D9F25F14583B580035B0D0 /* qosanalyzer.c */, 22313679143DED490035C1F4 /* msandroidvideo.cpp */, 229ECDEE143AEC2400D611B8 /* audioconference.c */, 229ECDEA143AEA6300D611B8 /* msvideo_neon.c */, @@ -806,6 +814,8 @@ 222CA6B611F6CF9F00621220 /* src */ = { isa = PBXGroup; children = ( + F4D9F23D145710540035B0D0 /* netsim.c */, + F4D9F23E145710540035B0D0 /* ortp_srtp.c */, 7014533D13FA841E00A01D86 /* zrtp.c */, 222CA6B711F6CF9F00621220 /* .gitignore */, 222CA6B811F6CF9F00621220 /* avprofile.c */, @@ -833,7 +843,6 @@ 222CA6CF11F6CF9F00621220 /* scheduler.c */, 222CA6D011F6CF9F00621220 /* scheduler.h */, 222CA6D111F6CF9F00621220 /* sessionset.c */, - 222CA6D211F6CF9F00621220 /* srtp.c */, 222CA6D311F6CF9F00621220 /* str_utils.c */, 222CA6D411F6CF9F00621220 /* stun.c */, 222CA6D511F6CF9F00621220 /* stun_udp.c */, @@ -1200,7 +1209,6 @@ 222CA71511F6CF9F00621220 /* rtptimer.c in Sources */, 222CA71711F6CF9F00621220 /* scheduler.c in Sources */, 222CA71911F6CF9F00621220 /* sessionset.c in Sources */, - 222CA71A11F6CF9F00621220 /* srtp.c in Sources */, 222CA71B11F6CF9F00621220 /* str_utils.c in Sources */, 222CA71C11F6CF9F00621220 /* stun.c in Sources */, 222CA71D11F6CF9F00621220 /* stun_udp.c in Sources */, @@ -1253,6 +1261,10 @@ 229ECDEB143AEA6300D611B8 /* msvideo_neon.c in Sources */, 229ECDED143AEBDA00D611B8 /* conference.c in Sources */, 229ECDEF143AEC2400D611B8 /* audioconference.c in Sources */, + F4D9F23F145710540035B0D0 /* netsim.c in Sources */, + F4D9F240145710540035B0D0 /* ortp_srtp.c in Sources */, + F4D9F26014583B580035B0D0 /* bitratedriver.c in Sources */, + F4D9F26114583B580035B0D0 /* qosanalyzer.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 6566c1179..b9394b5b8 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 6566c1179c6c30a4f436e71a6a2d4080f1609098 +Subproject commit b9394b5b868ab9b8d10207c39b8a317076ca2a77 From 6dd872b6a08969b80679733b4d9e9527d2e87714 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 29 Oct 2011 17:22:21 +0200 Subject: [PATCH 047/122] update linphone submodule --- linphone.xcodeproj/project.pbxproj | 4 ++++ submodules/linphone | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index d1140b64d..62e5a2b73 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -1124,6 +1124,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -1155,6 +1156,7 @@ ); OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; + PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1244,6 +1246,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -1275,6 +1278,7 @@ ); OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; + PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; diff --git a/submodules/linphone b/submodules/linphone index b9394b5b8..0a9c0f030 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit b9394b5b868ab9b8d10207c39b8a317076ca2a77 +Subproject commit 0a9c0f0303c59e2702a837cc3a3362db65853911 From 8f3523bdf39ec6b2c237a8ef8aae56ca64c3d87f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 31 Oct 2011 11:47:17 +0100 Subject: [PATCH 048/122] fix and improve project files --- linphone.xcodeproj/project.pbxproj | 11 ++++------- submodules/liblinphone.xcodeproj/project.pbxproj | 6 ++++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 62e5a2b73..2812e7c9f 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -1168,7 +1168,7 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: jehan monnier"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: jehan monnier (E8MYPN2NXL)"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; @@ -1177,7 +1177,7 @@ LIBRARY_SEARCH_PATHS = ""; LINK_WITH_STANDARD_LIBRARIES = YES; PREBINDING = NO; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "5B8A949D-21D7-4FB1-B7C0-6438B7297840"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "DD608A20-B0EC-49C6-BFD1-815C97DF3844"; SDKROOT = iphoneos; }; name = DistributionAdhoc; @@ -1187,7 +1187,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_ENTITLEMENTS = untitled.plist; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; @@ -1246,7 +1246,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -1278,7 +1278,6 @@ ); OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1309,7 +1308,6 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_ENTITLEMENTS = untitled.plist; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; @@ -1340,7 +1338,6 @@ ); OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; TARGETED_DEVICE_FAMILY = 1; diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 125aa3eb7..2d1a6087e 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -1356,6 +1356,7 @@ ); INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = linphone; + SKIP_INSTALL = YES; }; name = Debug; }; @@ -1405,6 +1406,7 @@ ); INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = linphone; + SKIP_INSTALL = YES; }; name = Release; }; @@ -1580,6 +1582,7 @@ ); INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = linphone; + SKIP_INSTALL = YES; }; name = DistributionAdhoc; }; @@ -1626,6 +1629,7 @@ ); OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = app; }; @@ -1674,6 +1678,7 @@ "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", ); PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; WRAPPER_EXTENSION = app; }; name = Debug; @@ -1721,6 +1726,7 @@ ); OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = app; }; From e15cd59f4a742813dfc49b276d16a80bd3fa9e98 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 31 Oct 2011 18:18:50 +0100 Subject: [PATCH 049/122] fix vp8 --- README | 3 +++ submodules/build/builders.d/libvpx.mk | 2 +- submodules/linphone | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README b/README index 1c31943aa..a7411037b 100644 --- a/README +++ b/README @@ -2,6 +2,8 @@ ****************************************** Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must install both xcode with iPhone OS SDK and MacPorts (www.macports.org) with the following ports: +-nawk +-coreutils -automake -autoconf -libtool @@ -10,6 +12,7 @@ Linphone for iPhone depends on liblinphone sdk. To build this sdk, you must inst -pkgconfig -cmake (for ZRTP support) -yasm +-doxygen gas-preprosessor.pl (http://github.com/yuvi/gas-preprocessor/ ) to be copied into /opt/local/bin : diff --git a/submodules/build/builders.d/libvpx.mk b/submodules/build/builders.d/libvpx.mk index b598aab5b..7f8ebd244 100644 --- a/submodules/build/builders.d/libvpx.mk +++ b/submodules/build/builders.d/libvpx.mk @@ -25,7 +25,7 @@ $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak: $(BUILDER_SRC_DIR)/$(libvpx_dir)/ && $(BUILDER_SRC_DIR)/$(libvpx_dir)/configure --prefix=$(prefix) $(libvpx_configure_options) build-libvpx: $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak - cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make -j1 && make -j1 install clean-libvpx: cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make clean diff --git a/submodules/linphone b/submodules/linphone index 0a9c0f030..6982a559d 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 0a9c0f0303c59e2702a837cc3a3362db65853911 +Subproject commit 6982a559db03fd191858856e97264b63e49e80cb From dc11bb43006013028c5def24a10979128ec617a4 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 31 Oct 2011 18:39:02 +0100 Subject: [PATCH 050/122] enable audio queue --- submodules/liblinphone.xcodeproj/project.pbxproj | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 2d1a6087e..8d22b5213 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -171,6 +171,7 @@ 222CA78411F6CFB100621220 /* siplogin.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA76211F6CFB100621220 /* siplogin.c */; }; 222CA78511F6CFB100621220 /* sipsetup.c in Sources */ = {isa = PBXBuildFile; fileRef = 222CA76311F6CFB100621220 /* sipsetup.c */; }; 222CA78611F6CFB100621220 /* sipsetup.h in Headers */ = {isa = PBXBuildFile; fileRef = 222CA76411F6CFB100621220 /* sipsetup.h */; }; + 22512699145F13CE0041FBF2 /* aqsnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 22512698145F13CE0041FBF2 /* aqsnd.c */; }; 2252935B12F6CA4700DD9BFB /* ec-calibrator.c in Sources */ = {isa = PBXBuildFile; fileRef = 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */; }; 2258C44113A9377B0087A596 /* swscale.h in Headers */ = {isa = PBXBuildFile; fileRef = 2258C44013A9377B0087A596 /* swscale.h */; }; 2258C44513A945520087A596 /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2258C44213A945520087A596 /* libswscale.a */; }; @@ -435,6 +436,7 @@ 22313679143DED490035C1F4 /* msandroidvideo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = msandroidvideo.cpp; sourceTree = ""; }; 224AD571143208BB00510FF3 /* android-display.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "android-display.c"; path = "../../../../../../workspace-android/linphone-android/submodules/linphone/mediastreamer2/src/android-display.c"; sourceTree = ""; }; 224AD57314320EB400510FF3 /* scaler_arm.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = scaler_arm.S; path = "../../../../../../workspace-android/linphone-android/submodules/linphone/mediastreamer2/src/scaler_arm.S"; sourceTree = ""; }; + 22512698145F13CE0041FBF2 /* aqsnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aqsnd.c; sourceTree = ""; }; 2252935A12F6CA4700DD9BFB /* ec-calibrator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ec-calibrator.c"; path = "linphone/coreapi/ec-calibrator.c"; sourceTree = SOURCE_ROOT; }; 2258C44013A9377B0087A596 /* swscale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = swscale.h; sourceTree = ""; }; 2258C44213A945520087A596 /* libswscale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libswscale.a; path = "../liblinphone-sdk/apple-darwin/lib/libswscale.a"; sourceTree = ""; }; @@ -685,6 +687,7 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 22512698145F13CE0041FBF2 /* aqsnd.c */, F4D9F25E14583B580035B0D0 /* bitratedriver.c */, F4D9F25F14583B580035B0D0 /* qosanalyzer.c */, 22313679143DED490035C1F4 /* msandroidvideo.cpp */, @@ -1265,6 +1268,7 @@ F4D9F240145710540035B0D0 /* ortp_srtp.c in Sources */, F4D9F26014583B580035B0D0 /* bitratedriver.c in Sources */, F4D9F26114583B580035B0D0 /* qosanalyzer.c in Sources */, + 22512699145F13CE0041FBF2 /* aqsnd.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1333,7 +1337,7 @@ "PACKAGE=\\\"ortp\\\"", "POSIXTIMER_INTERVAL=10000", IN_LINPHONE, - __IOSIOUNIT_ENABLED__, + __MAC_AQ_ENABLED__, HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, @@ -1383,7 +1387,7 @@ "PACKAGE=\\\"ortp\\\"", "POSIXTIMER_INTERVAL=10000", IN_LINPHONE, - __IOSIOUNIT_ENABLED__, + __MAC_AQ_ENABLED__, HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, @@ -1559,7 +1563,7 @@ "PACKAGE=\\\"ortp\\\"", "POSIXTIMER_INTERVAL=10000", IN_LINPHONE, - __IOSIOUNIT_ENABLED__, + __MAC_AQ_ENABLED__, HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, From f70916d8d9dec9888ff509338400d4251ef1c880 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 31 Oct 2011 22:16:14 +0100 Subject: [PATCH 051/122] disable idle timer during video calls (works) --- Classes/PhoneViewController.h | 3 ++- Classes/PhoneViewController.m | 6 ++++-- Classes/VideoViewController.m | 10 ++++++++-- submodules/linphone | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 48687c457..d292500d0 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -67,8 +67,9 @@ UIActionSheet *mIncomingCallActionSheet; FirstLoginViewController* myFirstLoginViewController; VideoViewController* mVideoViewController; - + BOOL mVideoShown; } + @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UIViewController* videoViewController; @property (nonatomic, retain) IBOutlet UITextField* address; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index b36327475..ac68f3042 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -97,7 +97,7 @@ } - (void)viewDidDisappear:(BOOL)animated { - [[UIApplication sharedApplication] setIdleTimerDisabled:false]; + if (!mVideoShown) [[UIApplication sharedApplication] setIdleTimerDisabled:false]; } @@ -124,7 +124,7 @@ [erase initWithAddressField:address]; self.videoViewController = [[VideoViewController alloc] initWithNibName:@"VideoViewController" bundle:[NSBundle mainBundle]]; - + mVideoShown=FALSE; } @@ -179,6 +179,7 @@ if (modalVC != nil) { // clear previous native window ids if (modalVC == self.videoViewController) { + mVideoShown=FALSE; linphone_core_set_native_video_window_id([LinphoneManager getLc],0); linphone_core_set_native_preview_window_id([LinphoneManager getLc],0); } @@ -250,6 +251,7 @@ -(void) displayVideoCallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; + mVideoShown=TRUE; [self presentModalViewController:self.videoViewController animated:true]; } //status reporting diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index acb065a57..55d7eebda 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -99,13 +99,16 @@ // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } + -(void) viewWillDisappear:(BOOL)animated { - [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; +} + +-(void) viewDidDisappear:(BOOL)animated{ + [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [[UIApplication sharedApplication] setIdleTimerDisabled:true]; //redirect audio to speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; @@ -119,6 +122,9 @@ waitUntilDone:YES]; [mMute reset]; [mMuteLand reset]; +} + +- (void) viewDidAppear:(BOOL)animated{ [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; } diff --git a/submodules/linphone b/submodules/linphone index 6982a559d..2063d0201 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 6982a559db03fd191858856e97264b63e49e80cb +Subproject commit 2063d0201e1b2681f4663e73ba96d3f47c58c25a From b6b9f62512957b120acb13f00a19512d8b10d065 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 1 Nov 2011 17:11:32 +0100 Subject: [PATCH 052/122] update linphone submodule --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 2063d0201..2ac5355a9 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 2063d0201e1b2681f4663e73ba96d3f47c58c25a +Subproject commit 2ac5355a9b687dab8cce86e7f5671e2524a10d56 From e187357992cd2a723b11f3b8ca12e7ce53284058 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 2 Nov 2011 08:41:46 +0100 Subject: [PATCH 053/122] fix wrong remote view orientation after call closed in landscape mode --- Classes/VideoViewController.m | 18 ++++++++++-------- linphone.xcodeproj/project.pbxproj | 4 ++++ submodules/build/builder-iphone-os.mk | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index 55d7eebda..888cbd83d 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -72,7 +72,7 @@ -(void) configureOrientation:(UIInterfaceOrientation) oritentation { - + int oldLinphoneOrientation = linphone_core_get_device_rotation([LinphoneManager getLc]); if (oritentation == UIInterfaceOrientationPortrait ) { [self.view addSubview:mPortrait]; linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); @@ -86,6 +86,11 @@ linphone_core_set_device_rotation([LinphoneManager getLc], 270); } + if ((oldLinphoneOrientation != linphone_core_get_device_rotation([LinphoneManager getLc])) + && linphone_core_get_current_call([LinphoneManager getLc])) { + //Orientation has change, must call update call + linphone_core_update_call([LinphoneManager getLc], linphone_core_get_current_call([LinphoneManager getLc]), NULL); + } } -(void) configureOrientation { @@ -100,11 +105,10 @@ // e.g. self.myOutlet = nil; } --(void) viewWillDisappear:(BOOL)animated { -} -(void) viewDidDisappear:(BOOL)animated{ - [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; + [super viewDidDisappear:animated]; + [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; } -(void) viewWillAppear:(BOOL)animated { @@ -125,7 +129,8 @@ } - (void) viewDidAppear:(BOOL)animated{ - [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; + [super viewDidAppear:animated]; + [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -135,9 +140,6 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self configureOrientation:self.interfaceOrientation]; - if (fromInterfaceOrientation !=self.interfaceOrientation) { - linphone_core_update_call([LinphoneManager getLc], linphone_core_get_current_call([LinphoneManager getLc]), NULL); - } } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [mLandscape removeFromSuperview]; diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 2812e7c9f..f87b5f715 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -1137,6 +1137,7 @@ VIDEO_ENABLED, HAVE_X264, ); + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, @@ -1199,6 +1200,7 @@ VIDEO_ENABLED, HAVE_X264, ); + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, @@ -1259,6 +1261,7 @@ VIDEO_ENABLED, HAVE_X264, ); + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, @@ -1319,6 +1322,7 @@ VIDEO_ENABLED, HAVE_X264, ); + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( submodules/linphone/coreapi, submodules/linphone/mediastreamer2/include, diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 816809d7f..c70b077ad 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -98,7 +98,7 @@ veryclean: veryclean-linphone rm -rf $(BUILDER_BUILD_DIR) -.NOTPARALLEL build-linphone: init build-openssl build-srtp build-zrtpcpp build-osip2 build-eXosip2 build-speex build-libgsm buils-silk build-ffmpeg build-libvpx $(LINPHONE_BUILD_DIR)/Makefile +.NOTPARALLEL build-linphone: init build-openssl build-srtp build-zrtpcpp build-osip2 build-eXosip2 build-speex build-libgsm build-silk build-ffmpeg build-libvpx $(LINPHONE_BUILD_DIR)/Makefile cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-srtp clean-zrtpcpp clean-msilbc clean-libilbc clean-openssl clean-msamr clean-silk clean-ffmpeg clean-libvpx clean-msx264 From 4d8a4470a71bffa2edb155e2d0f1837b7e047409 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 2 Nov 2011 16:31:25 +0100 Subject: [PATCH 054/122] private version 1.0.7.3 --- linphone-Info.plist | 4 ++-- linphone.xcodeproj/project.pbxproj | 6 +++--- submodules/build/builders.d/libvpx.mk | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/linphone-Info.plist b/linphone-Info.plist index cb92f08d6..dccfa7f39 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.4.8 + 3.4.9 CFBundleSignature ???? CFBundleVersion - 1.0.7.2 + 1.0.7.3 NSMainNibFile PhoneMainView UIApplicationExitsOnSuspend diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index f87b5f715..70311dace 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -1125,7 +1125,6 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; @@ -1158,7 +1157,6 @@ OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; PROVISIONING_PROFILE = ""; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; TARGETED_DEVICE_FAMILY = 1; @@ -1188,7 +1186,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_ENTITLEMENTS = untitled.plist; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; @@ -1311,6 +1309,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_ENTITLEMENTS = untitled.plist; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; @@ -1342,6 +1341,7 @@ ); OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; TARGETED_DEVICE_FAMILY = 1; diff --git a/submodules/build/builders.d/libvpx.mk b/submodules/build/builders.d/libvpx.mk index 7f8ebd244..7b631f053 100644 --- a/submodules/build/builders.d/libvpx.mk +++ b/submodules/build/builders.d/libvpx.mk @@ -24,8 +24,8 @@ $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak: $(BUILDER_SRC_DIR)/$(libvpx_dir)/ && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ && $(BUILDER_SRC_DIR)/$(libvpx_dir)/configure --prefix=$(prefix) $(libvpx_configure_options) -build-libvpx: $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak - cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make -j1 && make -j1 install +build-libvpx: $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mk + cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install clean-libvpx: cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && make clean From fdf3d42b3110d81e92f92233fe8eecfbd188f8c2 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 3 Nov 2011 08:23:05 +0100 Subject: [PATCH 055/122] fix libvpx build issue --- submodules/build/builders.d/libvpx.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/build/builders.d/libvpx.mk b/submodules/build/builders.d/libvpx.mk index 7b631f053..793c0c33d 100644 --- a/submodules/build/builders.d/libvpx.mk +++ b/submodules/build/builders.d/libvpx.mk @@ -18,7 +18,7 @@ $(BUILDER_SRC_DIR)/$(libvpx_dir)/patched : && git apply $(BUILDER_SRC_DIR)/build/builders.d/libvpx.patch \ && touch $(BUILDER_SRC_DIR)/$(libvpx_dir)/patched -$(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mak: $(BUILDER_SRC_DIR)/$(libvpx_dir)/patched +$(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mk: $(BUILDER_SRC_DIR)/$(libvpx_dir)/patched mkdir -p $(BUILDER_BUILD_DIR)/$(libvpx_dir) cd $(BUILDER_BUILD_DIR)/$(libvpx_dir)/ \ && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ From 8e1fdcb62701d08ca01ca025adf44dad7d72520a Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 3 Nov 2011 11:30:32 +0100 Subject: [PATCH 056/122] Fix various Xcode warnings --- Classes/LinphoneUI/UIBluetoothButton.m | 4 ++-- Classes/LinphoneUI/UISpeakerButton.m | 2 +- Classes/LinphoneUI/UIToggleButton.h | 1 + Classes/LinphoneUI/UIToggleButton.m | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Classes/LinphoneUI/UIBluetoothButton.m b/Classes/LinphoneUI/UIBluetoothButton.m index 539422c2c..4f3248a39 100644 --- a/Classes/LinphoneUI/UIBluetoothButton.m +++ b/Classes/LinphoneUI/UIBluetoothButton.m @@ -23,14 +23,14 @@ @implementation UIBluetoothButton #define check_auresult(au,method) \ -if (au!=0) ms_error("UIBluetoothButton error for %s: ret=%i",method,au) +if (au!=0) ms_error("UIBluetoothButton error for %s: ret=%ld",method,au) -(void) onOn { //redirect audio to bluetooth UInt32 size = sizeof(CFStringRef); CFStringRef route="HeadsetBT"; - OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_AudioRoute, &size, &route); + OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_AudioRoute, size, &route); check_auresult(result,"set kAudioSessionProperty_AudioRoute HeadsetBT"); int allowBluetoothInput = 1; diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index a513d67ce..717025e00 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -40,7 +40,7 @@ static void audioRouteChangeListenerCallback ( AudioSessionInitialize(NULL, NULL, NULL, NULL); OSStatus lStatus = AudioSessionAddPropertyListener(routeChangeID, audioRouteChangeListenerCallback, self); if (lStatus) { - ms_error ("cannot register route change handler [%i]",lStatus); + ms_error ("cannot register route change handler [%ld]",lStatus); } } diff --git a/Classes/LinphoneUI/UIToggleButton.h b/Classes/LinphoneUI/UIToggleButton.h index bd960cee2..61ba8aba7 100644 --- a/Classes/LinphoneUI/UIToggleButton.h +++ b/Classes/LinphoneUI/UIToggleButton.h @@ -24,6 +24,7 @@ -(void) onOff; -(bool) isInitialStateOn; @end + @interface UIToggleButton : UIButton { @private UIImage* mOnImage; diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m index 0f5a81e07..5961a46c1 100644 --- a/Classes/LinphoneUI/UIToggleButton.m +++ b/Classes/LinphoneUI/UIToggleButton.m @@ -69,5 +69,19 @@ [mOffImage release]; } +-(void) onOn { + [NSException raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; +} +-(void) onOff { + [NSException raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; +} +-(bool) isInitialStateOn { + [NSException raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; + return false; +} + @end From 8c8843d035e215f558cd0daac6f40e58655cda1b Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 3 Nov 2011 12:08:47 +0100 Subject: [PATCH 057/122] First multicall working version --- Classes/AdvancedPhoneViewController.m | 20 +- Classes/CallDelegate.h | 27 ++ Classes/CallDelegate.m | 20 + Classes/IncallViewController.h | 8 +- Classes/IncallViewController.m | 196 +++++++- Classes/IncallViewController.xib | 142 +++++- Classes/LinphoneAppDelegate.m | 1 + Classes/LinphoneUI/LinphoneManager.m | 31 +- Classes/LinphoneUI/LinphoneUIDelegates.h | 8 +- Classes/PhoneViewController.h | 7 +- Classes/PhoneViewController.m | 52 +- Classes/PhoneViewController.xib | 523 +++++++------------- PhoneMainView.xib | 581 +++-------------------- linphone.xcodeproj/project.pbxproj | 33 +- linphonerc | 2 +- 15 files changed, 687 insertions(+), 964 deletions(-) create mode 100644 Classes/CallDelegate.h create mode 100644 Classes/CallDelegate.m diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m index d4b3a0392..1328e5ad3 100644 --- a/Classes/AdvancedPhoneViewController.m +++ b/Classes/AdvancedPhoneViewController.m @@ -18,7 +18,7 @@ */ #import "AdvancedPhoneViewController.h" - +#import "IncallViewController.h" @implementation AdvancedPhoneViewController @@ -38,29 +38,29 @@ withDisplayName:displayName]; } --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayCall: (LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { /*[super displayCallInProgressFromUI:viewCtrl forUser:username withDisplayName:displayName];*/ [self presentModalViewController:mIncallViewController animated:true]; - [mIncallViewController displayCallInProgressFromUI:viewCtrl + [mIncallViewController displayCall:call InProgressFromUI:viewCtrl forUser:username withDisplayName:displayName]; } --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - - if (linphone_call_get_dir(currentCall)==LinphoneCallIncoming){ - [self presentModalViewController:mIncallViewController animated:true]; - } - [super displayIncallFromUI:viewCtrl +-(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + if (linphone_call_get_dir(call)==LinphoneCallIncoming){ + [self presentModalViewController:mIncallViewController animated:true]; + } + + [super displayInCall:call FromUI:viewCtrl forUser:username withDisplayName:displayName]; - [mIncallViewController displayIncallFromUI:viewCtrl + [mIncallViewController displayInCall:call FromUI:viewCtrl forUser:username withDisplayName:displayName]; diff --git a/Classes/CallDelegate.h b/Classes/CallDelegate.h new file mode 100644 index 000000000..02b69b026 --- /dev/null +++ b/Classes/CallDelegate.h @@ -0,0 +1,27 @@ +// +// CallDelegate.h +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 03/11/11. +// Copyright (c) 2011 __MyCompanyName__. All rights reserved. +// + +#import +#include "linphonecore.h" + + +@protocol UIActionSheetCustomDelegate +- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void*) datas; +@end + + +@interface CallDelegate : NSObject { + + LinphoneCall* call; + id delegate; +} + +@property (nonatomic) LinphoneCall* call; +@property (nonatomic, retain) id delegate; + +@end diff --git a/Classes/CallDelegate.m b/Classes/CallDelegate.m new file mode 100644 index 000000000..6ae87a25c --- /dev/null +++ b/Classes/CallDelegate.m @@ -0,0 +1,20 @@ +// +// CallDelegate.m +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 03/11/11. +// Copyright (c) 2011 __MyCompanyName__. All rights reserved. +// + +#import "CallDelegate.h" + +@implementation CallDelegate + +@synthesize call; +@synthesize delegate; + +-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { + [delegate actionSheet:actionSheet clickedButtonAtIndex:buttonIndex withUserDatas:call]; +} + +@end diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index fd783733e..9635700c1 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -23,7 +23,7 @@ #include "UILinphone.h" -@interface IncallViewController : UIViewController { +@interface IncallViewController : UIViewController { UIView* controlSubView; @@ -38,6 +38,7 @@ UIPauseResumeButton* pause; UISpeakerButton* speaker; UIButton* contacts; + UITableView* callTableView; //key pad @@ -57,6 +58,10 @@ UIDigitButton* hash; UIHangUpButton* endPad; UIButton* close; + + bool dismissed; + + NSTimer *durationRefreasher; ABPeoplePickerNavigationController* myPeoplePickerController; } @@ -78,6 +83,7 @@ @property (nonatomic, retain) IBOutlet UIButton* pause; @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UIButton* contacts; +@property (nonatomic, retain) IBOutlet UITableView* callTableView; @property (nonatomic, retain) IBOutlet UIButton* one; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index c3a7464e9..5af0c2f89 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -19,8 +19,8 @@ #import "IncallViewController.h" #import #import "linphonecore.h" - - +#include "LinphoneManager.h" +#include "private.h" @implementation IncallViewController @@ -39,6 +39,7 @@ @synthesize dialer; @synthesize speaker; @synthesize contacts; +@synthesize callTableView; @synthesize one; @synthesize two; @@ -71,7 +72,9 @@ [super viewDidLoad]; //Controls [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - [pause initWithOnImage:[UIImage imageNamed:@"resumecall.png"] offImage:[UIImage imageNamed:@"pausecall.png"] ]; + UIImage* rc = [UIImage imageNamed:@"resumecall.png"]; + UIImage* pc = [UIImage imageNamed:@"pausecall.png"]; + [pause initWithOnImage:rc offImage:pc ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; @@ -92,8 +95,29 @@ } +-(void)updateCallsDurations { + [callTableView reloadData]; +} +-(void)viewDidAppear:(BOOL)animated { + if (dismissed) { + [self dismissModalViewControllerAnimated:true]; + } else { + [self updateCallsDurations]; + durationRefreasher = [NSTimer scheduledTimerWithTimeInterval:1 + target:self + selector:@selector(updateCallsDurations) + userInfo:nil + repeats:YES]; + } +} +- (void) viewDidDisappear:(BOOL)animated { + if (durationRefreasher != nil) { + [durationRefreasher invalidate]; + durationRefreasher=nil; + } +} - (void)viewDidUnload { @@ -102,13 +126,15 @@ -(void) displayStatus:(NSString*) message; { [status setText:message]; + + [callTableView reloadData]; } -(void) displayPad:(bool) enable { [controlSubView setHidden:enable]; [padSubView setHidden:!enable]; } --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { //restaure view [self displayPad:false]; @@ -120,18 +146,31 @@ [peerNumber setText:@""]; } [callDuration setText:@"Calling"]; + dismissed = false; + + [callTableView reloadData]; } --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayIncomingCall:(LinphoneCall *)call NotificationFromUI:(UIViewController *)viewCtrl forUser:(NSString *)username withDisplayName:(NSString *)displayName { + +} + +-(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration start]; + dismissed = false; + [callTableView reloadData]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration stop]; [self dismissModalViewControllerAnimated:true]; + dismissed = true; + [callTableView reloadData]; } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; [pause reset]; + + [callTableView reloadData]; } - (IBAction)doAction:(id)sender { @@ -177,5 +216,152 @@ [super dealloc]; } +bool isInConference(LinphoneCall* call) { + return linphone_call_get_current_params(call)->in_conference; +} + +int callCount(LinphoneCore* lc) { + int count = 0; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + if (!isInConference((LinphoneCall*)calls->data)) { + count++; + } + calls = calls->next; + } + return count; +} + +-(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ + const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); + + while (calls != 0 && index > 0) { + if (isInConference((LinphoneCall*)calls->data) == conf) { + index--; + } + calls = calls->next; + } + + if (calls == 0) { + ms_error("Cannot find call with index %d (in conf: %d)", index, conf); + return nil; + } else { + return (LinphoneCall*)calls->data; + } +} + + + +- (void) updateCell:(UITableViewCell*)cell withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ + if (call == NULL) { + ms_error("UpdateCell called with null call"); + [cell.textLabel setText:@"BUG IN APP - call is null"]; + return; + } + const LinphoneAddress* addr = linphone_call_get_remote_address(call); + if (addr) { + NSMutableString* mss = [[NSMutableString alloc] init]; + + const char* n = linphone_address_get_display_name(addr); + if (n) + [mss appendFormat:@"%s", n, nil]; + else + [mss appendFormat:@"%s", linphone_address_get_username(addr), nil]; + [cell.textLabel setText:mss]; + } else + [cell.textLabel setText:@"plop"]; + + NSMutableString* ms = [[NSMutableString alloc] init ]; + if (linphone_call_get_state(call) == LinphoneCallStreamsRunning) { + int duration = linphone_call_get_duration(call); + if (duration >= 60) + [ms appendFormat:@"%02i:%02i", (duration/60), duration - 60*(duration/60), nil]; + else + [ms appendFormat:@"%02i sec", duration, nil]; + } else { + [ms appendFormat:@"%s", linphone_call_state_to_string(linphone_call_get_state(call)), nil]; + } + [cell.detailTextLabel setText:ms]; + + if (linphone_core_get_current_call([LinphoneManager getLc]) == call) + cell.accessoryType = UITableViewCellAccessoryCheckmark; + else if (confActive && isInConference(call)) + cell.accessoryType = UITableViewCellAccessoryCheckmark; + else + cell.accessoryType = UITableViewCellAccessoryNone; +} + + +// UITableViewDataSource (required) +- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [callTableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + } + + ms_message("pouet"); + + LinphoneCore* lc = [LinphoneManager getLc]; + if (indexPath.section == 0 && linphone_core_get_conference_size(lc) > 0) + [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:true] conferenceActive:linphone_core_is_in_conference(lc)]; + else + [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:false] + conferenceActive:linphone_core_is_in_conference(lc)]; + + + /*NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; + UIImage *theImage = [UIImage imageWithContentsOfFile:path]; + cell.imageView.image = theImage;*/ + return cell; +} + + +// UITableViewDataSource (required) +- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + LinphoneCore* lc = [LinphoneManager getLc]; + + if (section == 0 && linphone_core_get_conference_size(lc) > 0) + return linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc); + + return callCount(lc); +} + +// UITableViewDataSource +- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + LinphoneCore* lc = [LinphoneManager getLc]; + int count = 0; + + if (callCount(lc) > 0) + count++; + + if (linphone_core_get_conference_size([LinphoneManager getLc]) > 0) + count ++; + + return count; +} + +// UITableViewDataSource +//- (NSArray*) sectionIndexTitlesForTableView:(UITableView *)tableView { +// return [NSArray arrayWithObjects:@"Conf", @"Calls", nil ]; +//} + +// UITableViewDataSource +- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + if (section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0) + return @"CONF"; + else + return @"CALLS"; +} + +// UITableViewDataSource +- (NSString*) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section +{ + return nil; +} + @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index a2b4e804e..b1930ec64 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -12,6 +12,7 @@ YES + IBUITableView IBUIViewController IBUIButton IBUIView @@ -42,9 +43,89 @@ 274 YES + + + 274 + {320, 182} + + + _NS:418 + + 10 + + 549453824 + {512, 1} + + YES + + YES + + + + TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA +AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA +AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI +AAgACAAIAAEAAQABAAE + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + YES + IBCocoaTouchFramework + YES + NO + 1 + 2 + 0 + YES + 44 + 10 + 10 + - 292 + -2147483356 {320, 55} @@ -74,7 +155,7 @@ - 292 + -2147483356 {{31, 63}, {61, 21}} @@ -93,11 +174,11 @@ - 292 + -2147483356 {{239, 63}, {65, 21}} - + NO YES NO @@ -112,7 +193,7 @@ - 292 + -2147483356 {{31, 347}, {258, 21}} @@ -180,7 +261,7 @@ {{170, 266}, {72, 37}} - + NO NO IBCocoaTouchFramework @@ -531,7 +612,7 @@ {{0, 121}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -559,7 +640,7 @@ {{6, 261}, {258, 52}} - + NO NO IBCocoaTouchFramework @@ -582,7 +663,7 @@ {{90, 115}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -632,7 +713,7 @@ {{181, 61}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -905,6 +986,14 @@ 105 + + + callTableView + + + + 109 + doAction: @@ -932,6 +1021,22 @@ 101 + + + dataSource + + + + 107 + + + + delegate + + + + 108 + @@ -975,6 +1080,7 @@ + @@ -1160,6 +1266,11 @@ pauseresume + + 106 + + + @@ -1173,6 +1284,7 @@ 10.IBPluginDependency 104.CustomClassName 104.IBPluginDependency + 106.IBPluginDependency 11.IBPluginDependency 12.CustomClassName 12.IBPluginDependency @@ -1227,6 +1339,7 @@ UIPauseResumeButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDuration com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton @@ -1283,7 +1396,7 @@ - 105 + 109 @@ -1307,6 +1420,7 @@ YES callDuration + callTableView close contacts controlSubView @@ -1336,6 +1450,7 @@ YES UILabel + UITableView UIButton UIButton UIView @@ -1368,6 +1483,7 @@ YES callDuration + callTableView close contacts controlSubView @@ -1400,6 +1516,10 @@ callDuration UILabel + + callTableView + UITableView + close UIButton diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 5344f5f50..736d06e16 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -24,6 +24,7 @@ #import "ConsoleViewController.h" #import "MoreViewController.h" +#include "CallHistoryTableViewController.h" #include "LinphoneManager.h" diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index fed0660d9..0b02bf203 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -113,31 +113,36 @@ extern void libmssilk_init(); } return; } --(void) onCall:(LinphoneCall*) currentCall StateChanged: (LinphoneCallState) new_state withMessage: (const char *) message { - const char* lUserNameChars=linphone_address_get_username(linphone_call_get_remote_address(currentCall)); +-(void) onCall:(LinphoneCall*) call StateChanged: (LinphoneCallState) new_state withMessage: (const char *) message { + const char* lUserNameChars=linphone_address_get_username(linphone_call_get_remote_address(call)); NSString* lUserName = lUserNameChars?[[NSString alloc] initWithCString:lUserNameChars]:NSLocalizedString(@"Unknown",nil); if (new_state == LinphoneCallIncomingReceived) { - [self updateCallWithAddressBookData:currentCall]; // display name is updated + [self updateCallWithAddressBookData:call]; // display name is updated } - const char* lDisplayNameChars = linphone_address_get_display_name(linphone_call_get_remote_address(currentCall)); + const char* lDisplayNameChars = linphone_address_get_display_name(linphone_call_get_remote_address(call)); NSString* lDisplayName = lDisplayNameChars?[[NSString alloc] initWithCString:lDisplayNameChars]:@""; + + bool canHideInCallView = (linphone_core_get_calls([LinphoneManager getLc]) == NULL); switch (new_state) { case LinphoneCallIncomingReceived: - [callDelegate displayIncomingCallNotigicationFromUI:mCurrentViewController + [callDelegate displayIncomingCall:call + NotificationFromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName]; break; case LinphoneCallOutgoingInit: - [callDelegate displayCallInProgressFromUI:mCurrentViewController + [callDelegate displayCall:call + InProgressFromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName]; break; case LinphoneCallConnected: - [callDelegate displayIncallFromUI:mCurrentViewController + [callDelegate displayInCall: call + FromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName]; break; @@ -170,15 +175,19 @@ extern void libmssilk_init(); cancelButtonTitle:NSLocalizedString(@"Dismiss",nil) otherButtonTitles:nil]; [error show]; - [callDelegate displayDialerFromUI:mCurrentViewController + if (canHideInCallView) { + [callDelegate displayDialerFromUI:mCurrentViewController forUser:@"" withDisplayName:@""]; + } break; } - case LinphoneCallEnd: - [callDelegate displayDialerFromUI:mCurrentViewController + case LinphoneCallEnd: + if (canHideInCallView) { + [callDelegate displayDialerFromUI:mCurrentViewController forUser:@"" withDisplayName:@""]; + } break; default: break; @@ -437,7 +446,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach const char* password = [accountPassword cStringUsingEncoding:[NSString defaultCStringEncoding]]; NSString* proxyAddress = [[NSUserDefaults standardUserDefaults] stringForKey:@"proxy_preference"]; - if ((!proxyAddress | [proxyAddress length] <1 ) && domain) { + if ((!proxyAddress || [proxyAddress length] <1 ) && domain) { proxyAddress = [NSString stringWithFormat:@"sip:%@",domain] ; } else { proxyAddress = [NSString stringWithFormat:@"sip:%@",proxyAddress] ; diff --git a/Classes/LinphoneUI/LinphoneUIDelegates.h b/Classes/LinphoneUI/LinphoneUIDelegates.h index 081139167..a6ced61e7 100644 --- a/Classes/LinphoneUI/LinphoneUIDelegates.h +++ b/Classes/LinphoneUI/LinphoneUIDelegates.h @@ -17,14 +17,14 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import - +#include "linphonecore.h" @protocol LinphoneUICallDelegate // UI changes -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayCall: (LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayIncomingCall: (LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; -(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl; //status reporting -(void) displayStatus:(NSString*) message; diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 886df2a97..07df3c9b5 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -20,12 +20,13 @@ #import #import "linphonecore.h" #import "UILinphone.h" +#import "CallDelegate.h" @class IncallViewController; @class FirstLoginViewController; -@interface PhoneViewController : UIViewController { +@interface PhoneViewController : UIViewController { @private //UI definition @@ -41,7 +42,7 @@ UILabel* peerLabel; - UICallButton* call; + UICallButton* __call; UIHangUpButton* hangup; UILabel* status; @@ -70,7 +71,7 @@ } @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UITextField* address; -@property (nonatomic, retain) IBOutlet UIButton* call; +@property (nonatomic, retain) IBOutlet UIButton* __call; @property (nonatomic, retain) IBOutlet UIButton* hangup; @property (nonatomic, retain) IBOutlet UILabel* status; @property (nonatomic, retain) IBOutlet UIEraseButton* erase; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 6b49a18f0..f460f34db 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -22,13 +22,14 @@ #import #import #import "LinphoneManager.h" +#include "FirstLoginViewController.h" @implementation PhoneViewController @synthesize dialerView ; @synthesize address ; -@synthesize call; +@synthesize __call; @synthesize hangup; @synthesize status; @synthesize erase; @@ -69,21 +70,6 @@ } - - - - -/* - // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. - - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - } - - return self; - } - */ - - - (void)viewDidAppear:(BOOL)animated { [[UIApplication sharedApplication] setIdleTimerDisabled:true]; [mute reset]; @@ -117,7 +103,7 @@ [nine initWithNumber:'9' addressField:address ]; [star initWithNumber:'*' addressField:address ]; [hash initWithNumber:'#' addressField:address ]; - [call initWithAddress:address withDisplayName:mDisplayName]; + [__call initWithAddress:address withDisplayName:mDisplayName]; [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; [erase initWithAddressField:address]; @@ -178,7 +164,7 @@ [incallView setHidden:true]; [dialerView setHidden:false]; - [call setEnabled:true]; + [__call setEnabled:true]; [hangup setEnabled:false]; [callDuration stop]; @@ -194,7 +180,7 @@ [myTabBarController setSelectedIndex:DIALER_TAB_INDEX]; } --(void) displayIncalViewforUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayInCall: (LinphoneCall*) call ViewforUser:(NSString*) username withDisplayName:(NSString*) displayName { UIDevice *device = [UIDevice currentDevice]; device.proximityMonitoringEnabled = YES; if (device.proximityMonitoringEnabled == YES) { @@ -211,20 +197,20 @@ [incallView setHidden:false]; [dialerView setHidden:true]; } --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [self displayIncalViewforUser:username +-(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + [self displayInCall: call ViewforUser:username withDisplayName:displayName]; - [call setEnabled:false]; + [__call setEnabled:false]; [callDuration setText:NSLocalizedString(@"Calling...",nil)]; if ([speaker isOn]) [speaker toggle] ; //preset to off } --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration start]; [callDuration setHidden:false]; if (linphone_call_get_dir(linphone_core_get_current_call([LinphoneManager getLc])) == LinphoneCallIncoming) { - [self displayIncalViewforUser:username + [self displayInCall: call ViewforUser:username withDisplayName:displayName]; if ([speaker isOn]) [speaker toggle] ; //preset to off; } @@ -239,7 +225,7 @@ } --(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayIncomingCall:(LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { @@ -255,22 +241,28 @@ [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; } } else { + CallDelegate* cd = [[CallDelegate alloc] init]; + cd.delegate = self; + cd.call = call; + mIncomingCallActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username] - delegate:self + delegate:cd cancelButtonTitle:NSLocalizedString(@"Decline",nil) destructiveButtonTitle:NSLocalizedString(@"Answer",nil) otherButtonTitles:nil]; + mIncomingCallActionSheet.actionSheetStyle = UIActionSheetStyleDefault; [mIncomingCallActionSheet showInView:self.view]; [mIncomingCallActionSheet release]; } } -- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { +- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas{ + LinphoneCall* call = (LinphoneCall*)datas; if (buttonIndex == 0 ) { - linphone_core_accept_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + linphone_core_accept_call([LinphoneManager getLc],call); } else { - linphone_core_terminate_call ([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + linphone_core_terminate_call ([LinphoneManager getLc], call); } mIncomingCallActionSheet = nil; } @@ -284,7 +276,7 @@ [mute dealloc]; [speaker dealloc]; [peerLabel dealloc]; - [call dealloc]; + [__call dealloc]; [hangup dealloc]; [status dealloc]; [one dealloc]; diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index 2150c0314..9e854ae94 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -2,30 +2,30 @@ 784 - 10J567 - 823 - 1038.35 - 462.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 + 933 - + YES - + IBUITextField + IBUIViewController + IBUIButton + IBUIView + IBUILabel + IBProxyObject YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin - YES - - YES - - - YES - + PluginDependencyRecalculationVersion + YES @@ -53,6 +53,7 @@ 292 {320, 40} + NO YES NO @@ -66,12 +67,22 @@ 1 10 1 + + 1 + 17 + + + Helvetica + 17 + 16 + 292 {{98, 38}, {124, 21}} + NO YES NO @@ -82,22 +93,20 @@ 1 10 1 + + 292 {{239, 14}, {72, 37}} + NO NO IBCocoaTouchFramework 0 0 - - Helvetica-Bold - 15 - 16 - 3 MQA @@ -114,18 +123,29 @@ NSImage Speaker-32-off.png + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + 292 {{0, 14}, {72, 37}} + NO NO IBCocoaTouchFramework 0 0 - 1 @@ -136,10 +156,13 @@ NSImage mic_active.png + + {320, 65} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -157,11 +180,11 @@ 292 {{254, 0}, {66, 65}} + NO IBCocoaTouchFramework 0 0 - <- @@ -173,12 +196,15 @@ NSImage clavier-01-106px.png + + 292 {{5, 0}, {255, 66}} + NO NO IBCocoaTouchFramework @@ -192,11 +218,6 @@ 2 - - Helvetica - 36 - 16 - YES 15 @@ -205,10 +226,22 @@ IBCocoaTouchFramework 1 + + Helvetica + Helvetica + 0 + 36 + + + Helvetica + 36 + 16 + {320, 65} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -220,12 +253,12 @@ 292 {{0, 328}, {160, 66}} + NO NO IBCocoaTouchFramework 0 0 - 1 @@ -240,12 +273,15 @@ NSImage clavier-01-160px.png + + 292 {{9, 390}, {304, 21}} + NO YES NO @@ -255,18 +291,20 @@ 1 10 + + 292 {{213, 64}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 3 @@ -275,18 +313,20 @@ + + 292 {{0, 130}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 4 @@ -295,18 +335,20 @@ + + 292 {{107, 130}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 5 @@ -318,18 +360,20 @@ NSImage clavier-01-108px.png + + 292 {{213, 130}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 6 @@ -338,18 +382,20 @@ + + 292 {{0, 196}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 7 @@ -358,18 +404,20 @@ + + 292 {{213, 196}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 9 @@ -378,18 +426,20 @@ + + 292 {{107, 64}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 2 @@ -398,12 +448,15 @@ + + 292 {{0, 64}, {107, 66}} + 1 MC40MDAwMDAwMSAxIDEgMAA @@ -413,7 +466,6 @@ IBCocoaTouchFramework 0 0 - 1 @@ -422,18 +474,20 @@ + + 292 {{0, 262}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - * @@ -442,18 +496,20 @@ + + 292 {{107, 262}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 0+ @@ -462,18 +518,20 @@ + + 292 {{213, 262}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - # @@ -482,18 +540,20 @@ + + 292 {{107, 196}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 8 @@ -502,19 +562,21 @@ + + 292 {{160, 328}, {160, 66}} + NO NO IBCocoaTouchFramework NO 0 0 - 1 @@ -526,10 +588,13 @@ stopcall-red.png + + - {320, 460} + {{0, 20}, {320, 460}} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -539,6 +604,7 @@ + 1 1 IBCocoaTouchFramework @@ -556,14 +622,6 @@ 12 - - - call - - - - 13 - status @@ -572,14 +630,6 @@ 15 - - - delegate - - - - 19 - view @@ -684,15 +734,6 @@ 54 - - - doKeyPad: - - - 1 - - 92 - hangup @@ -757,13 +798,40 @@ 158 + + + __call + + + + 159 + + + + delegate + + + + 19 + + + + doKeyPad: + + + 1 + + 92 + YES 0 - + + YES + @@ -956,33 +1024,27 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName - 1.IBEditorWindowLastContentRect + -2.IBPluginDependency 1.IBPluginDependency 1.IBUserGuides 107.CustomClassName 107.IBPluginDependency - 114.IBEditorWindowLastContentRect 114.IBPluginDependency 114.IBUserGuides - 114.IBViewBoundsToFrameTransform 115.IBPluginDependency 116.CustomClassName 116.IBPluginDependency - 116.IBViewBoundsToFrameTransform 117.CustomClassName 117.IBPluginDependency - 117.IBViewBoundsToFrameTransform 118.CustomClassName 118.IBPluginDependency - 118.IBViewBoundsToFrameTransform 150.CustomClassName 150.IBPluginDependency - 150.IBViewBoundsToFrameTransform 157.IBPluginDependency 29.CustomClassName 29.IBPluginDependency - 29.IBViewBoundsToFrameTransform 30.CustomClassName 30.IBPluginDependency 31.CustomClassName @@ -997,14 +1059,11 @@ 36.IBPluginDependency 37.CustomClassName 37.IBPluginDependency - 37.IBViewBoundsToFrameTransform 38.CustomClassName 38.IBPluginDependency - 38.IBViewBoundsToFrameTransform 39.CustomClassName 39.IBPluginDependency 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform 40.CustomClassName 40.IBPluginDependency 41.CustomClassName @@ -1012,14 +1071,14 @@ 5.CustomClassName 5.IBPluginDependency 7.IBPluginDependency - 80.IBEditorWindowLastContentRect 80.IBPluginDependency YES PhoneViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder - {{581, 299}, {320, 460}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES @@ -1036,7 +1095,6 @@ UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{32, 282}, {320, 90}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES @@ -1046,34 +1104,18 @@ 1 - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDuration com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCxAAAwoIAAA - UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDcQAAwpIAAA - UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAwpIAAA - UIEraseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNxAAAAAAAAA - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDVQAAwxsAAA - UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1088,18 +1130,11 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABC1gAAwxsAAA - - UIDigitButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAwxsAAA - + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1107,27 +1142,22 @@ UICallButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{60, 553}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES - - YES - + YES - - YES - + - 158 + 159 @@ -1150,9 +1180,9 @@ YES YES + __call address back - call callDuration dialerView eight @@ -1178,8 +1208,8 @@ YES - UITextField UIButton + UITextField UIButton UILabel UIView @@ -1209,9 +1239,9 @@ YES YES + __call address back - call callDuration dialerView eight @@ -1237,6 +1267,10 @@ YES + + __call + UIButton + address UITextField @@ -1245,10 +1279,6 @@ back UIButton - - call - UIButton - callDuration UILabel @@ -1341,15 +1371,7 @@ IBProjectSource - Classes/PhoneViewController.h - - - - PhoneViewController - UIViewController - - IBUserSource - + ./Classes/PhoneViewController.h @@ -1357,7 +1379,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UICallButton.h + ./Classes/UICallButton.h @@ -1365,7 +1387,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UIDigitButton.h + ./Classes/UIDigitButton.h @@ -1373,7 +1395,7 @@ UILabel IBProjectSource - Classes/LinphoneUI/UIDuration.h + ./Classes/UIDuration.h @@ -1381,7 +1403,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UIEraseButton.h + ./Classes/UIEraseButton.h @@ -1389,7 +1411,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UIHangUpButton.h + ./Classes/UIHangUpButton.h @@ -1397,7 +1419,7 @@ UIToggleButton IBProjectSource - Classes/LinphoneUI/UIMuteButton.h + ./Classes/UIMuteButton.h @@ -1405,233 +1427,15 @@ UIToggleButton IBProjectSource - Classes/LinphoneUI/UISpeakerButton.h + ./Classes/UISpeakerButton.h UIToggleButton UIButton - - mActionHandler - id - - - mActionHandler - - mActionHandler - id - - IBProjectSource - Classes/LinphoneUI/UIToggleButton.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITextField - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h + ./Classes/UIToggleButton.h @@ -1644,14 +1448,13 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES - ../linphone.xcodeproj 3 YES @@ -1671,11 +1474,11 @@ {106, 60} {108, 60} {160, 60} - {32, 32} + {20, 20} {60, 52} {62, 54} - 132 + 933 diff --git a/PhoneMainView.xib b/PhoneMainView.xib index dadf43e09..27580eb6f 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -2,30 +2,31 @@ 784 - 10D573 - 762 - 1038.29 - 460.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 87 + 933 - + YES - + IBProxyObject + IBUITabBarItem + IBUIViewController + IBUICustomObject + IBUITabBarController + IBUIWindow + IBUITabBar YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin - YES - - YES - - - YES - + PluginDependencyRecalculationVersion + YES @@ -41,10 +42,12 @@ IBCocoaTouchFramework - + 1316 {320, 480} + + 1 MSAxIDEAA @@ -58,24 +61,25 @@ + 1 1 IBCocoaTouchFramework NO - - History - - History + + + Dialer NSImage - history-orange.png + dialer-orange.png IBCocoaTouchFramework - + PhoneViewController + 1 1 IBCocoaTouchFramework @@ -83,34 +87,34 @@ YES - - - - Dialer + + History + + History NSImage - dialer-orange.png + history-orange.png IBCocoaTouchFramework - - PhoneViewController + 1 1 IBCocoaTouchFramework NO + IBCocoaTouchFramework - 5 + 1 1 IBCocoaTouchFramework @@ -120,12 +124,12 @@ IBCocoaTouchFramework - 0 + 1 1 IBCocoaTouchFramework @@ -133,9 +137,11 @@ - + 266 - {{129, 330}, {163, 49}} + {{0, 431}, {320, 49}} + + 3 MCAwAA @@ -178,7 +184,9 @@ YES 0 - + + YES + @@ -289,52 +297,52 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName + -2.IBPluginDependency 11.IBPluginDependency 12.IBPluginDependency 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect 2.IBPluginDependency - 2.UIWindow.visibleAtLaunch 38.CustomClassName - 38.IBEditorWindowLastContentRect 38.IBPluginDependency + 39.IBPluginDependency 4.CustomClassName 4.IBPluginDependency 41.CustomClassName 41.IBPluginDependency + 42.IBPluginDependency 43.CustomClassName 43.IBPluginDependency - 8.IBEditorWindowLastContentRect + 44.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency YES UIApplication + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES - - YES - + - {{190, 156}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - PhoneViewController - {{343, 544}, {320, 480}} + AdvancedPhoneViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin linphoneAppDelegate com.apple.InterfaceBuilder.IBCocoaTouchPlugin CallHistoryTableViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin MoreViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{623, 298}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -342,490 +350,18 @@ YES - - YES - + YES - - YES - + 47 - - - YES - - CallHistoryTableViewController - GenericTabViewController - - doAction: - id - - - clear - UIButton - - - IBProjectSource - Classes/CallHistoryTableViewController.h - - - - GenericTabViewController - UITableViewController - - YES - - YES - header - linphoneDelegate - phoneControllerDelegate - - - YES - UIView - id - id - - - - IBProjectSource - Classes/GenericTabViewController.h - - - - MoreViewController - UITableViewController - - YES - - YES - console - credit - creditText - web - - - YES - UITableViewCell - UITableViewCell - UITextView - UITableViewCell - - - - IBProjectSource - Classes/MoreViewController.h - - - - PhoneViewController - UIViewController - - YES - - YES - doAction: - doKeyPad: - doKeyPadUp: - - - YES - id - id - id - - - - YES - - YES - address - back - call - callDuration - eight - five - four - hangup - hash - incallView - mute - nine - one - peerLabel - seven - six - speaker - star - status - three - two - zero - - - YES - UITextField - UIButton - UIButton - UILabel - UIButton - UIButton - UIButton - UIButton - UIButton - UIView - UIButton - UIButton - UIButton - UILabel - UIButton - UIButton - UIButton - UIButton - UILabel - UIButton - UIButton - UIButton - - - - IBProjectSource - Classes/PhoneViewController.h - - - - linphoneAppDelegate - NSObject - - YES - - YES - myPeoplePickerController - myPhoneViewController - myTabBarController - window - - - YES - ABPeoplePickerNavigationController - PhoneViewController - UITabBarController - UIWindow - - - - IBProjectSource - Classes/linphoneAppDelegate.h - - - - - YES - - ABPeoplePickerNavigationController - UINavigationController - - IBFrameworkSource - AddressBookUI.framework/Headers/ABPeoplePickerNavigationController.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITabBar.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITabBarItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UITabBarItem.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UITextField - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UITextView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITextView.h - - - - UIView - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - + 0 IBCocoaTouchFramework @@ -834,14 +370,13 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES - linphone.xcodeproj 3 YES @@ -856,6 +391,6 @@ {25, 23} - 87 + 933 diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index a61d67707..e7cd1110c 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -83,8 +83,13 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 346A75C714619F1D005C9D07 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */; }; + 346A75C814619F73005C9D07 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; + 346A75CB14628DC6005C9D07 /* pausecall.png in Resources */ = {isa = PBXBuildFile; fileRef = 346A75C914628DC6005C9D07 /* pausecall.png */; }; + 346A75CC14628DC6005C9D07 /* resumecall.png in Resources */ = {isa = PBXBuildFile; fileRef = 346A75CA14628DC6005C9D07 /* resumecall.png */; }; + 346A75CF14628F02005C9D07 /* UIPauseResumeButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75CE14628F02005C9D07 /* UIPauseResumeButton.m */; }; + 346A75D21462A786005C9D07 /* CallDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75D11462A786005C9D07 /* CallDelegate.m */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; - F0A486D91404FE53009EC0BE /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F0A486D71404FE53009EC0BE /* libsrtp.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -403,9 +408,16 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 346A75C514619F1D005C9D07 /* AdvancedPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedPhoneViewController.h; sourceTree = ""; }; + 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; + 346A75C914628DC6005C9D07 /* pausecall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pausecall.png; path = submodules/linphone/pixmaps/pausecall.png; sourceTree = ""; }; + 346A75CA14628DC6005C9D07 /* resumecall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resumecall.png; path = submodules/linphone/pixmaps/resumecall.png; sourceTree = ""; }; + 346A75CD14628F02005C9D07 /* UIPauseResumeButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIPauseResumeButton.h; sourceTree = ""; }; + 346A75CE14628F02005C9D07 /* UIPauseResumeButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIPauseResumeButton.m; sourceTree = ""; }; + 346A75D01462A786005C9D07 /* CallDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallDelegate.h; sourceTree = ""; }; + 346A75D11462A786005C9D07 /* CallDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallDelegate.m; sourceTree = ""; }; 70571E1913FABCB000CDD3C2 /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = ""; }; 8D1107310486CEB800E47090 /* linphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "linphone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - F0A486D71404FE53009EC0BE /* libsrtp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsrtp.a; path = "liblinphone-sdk/apple-darwin/lib/libsrtp.a"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -437,7 +449,6 @@ 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */, 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */, - F0A486D91404FE53009EC0BE /* libsrtp.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -447,8 +458,8 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( - 22F9D6B51463EBDC00C6FEAF /* AdvancedPhoneViewController.m */, - 22F9D6B61463EBDC00C6FEAF /* AdvancedPhoneViewController.h */, + 346A75C514619F1D005C9D07 /* AdvancedPhoneViewController.h */, + 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */, 2214EB7012F84668002A5394 /* LinphoneUI */, 2218A92212FBE1340088A667 /* FirstLoginViewController.h */, 2218A92312FBE1340088A667 /* FirstLoginViewController.m */, @@ -474,6 +485,8 @@ 227BCDC110D4004600FBFD76 /* CallHistoryTableViewController.xib */, 2242D9C710D691F900E9963F /* GenericTabViewController.h */, 2242D9C810D691F900E9963F /* GenericTabViewController.m */, + 346A75D01462A786005C9D07 /* CallDelegate.h */, + 346A75D11462A786005C9D07 /* CallDelegate.m */, ); path = Classes; sourceTree = ""; @@ -677,6 +690,8 @@ 2214EB7012F84668002A5394 /* LinphoneUI */ = { isa = PBXGroup; children = ( + 346A75CD14628F02005C9D07 /* UIPauseResumeButton.h */, + 346A75CE14628F02005C9D07 /* UIPauseResumeButton.m */, 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */, 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */, 2248E99D12F801C200220D9C /* LinphoneManager.h */, @@ -847,6 +862,8 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 346A75C914628DC6005C9D07 /* pausecall.png */, + 346A75CA14628DC6005C9D07 /* resumecall.png */, 70571E1913FABCB000CDD3C2 /* rootca.pem */, 22E19E47138A67A000FBFE87 /* missed_call.png */, 228B19AE130290C500F154D3 /* iTunesArtwork */, @@ -996,6 +1013,8 @@ 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */, 22E19E48138A67A000FBFE87 /* missed_call.png in Resources */, 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */, + 346A75CB14628DC6005C9D07 /* pausecall.png in Resources */, + 346A75CC14628DC6005C9D07 /* resumecall.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1026,6 +1045,10 @@ 22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */, 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */, 223963171393CFAF001DE689 /* FastAddressBook.m in Sources */, + 346A75C714619F1D005C9D07 /* AdvancedPhoneViewController.m in Sources */, + 346A75C814619F73005C9D07 /* IncallViewController.m in Sources */, + 346A75CF14628F02005C9D07 /* UIPauseResumeButton.m in Sources */, + 346A75D21462A786005C9D07 /* CallDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/linphonerc b/linphonerc index 6f894b055..d5fc9446b 100644 --- a/linphonerc +++ b/linphonerc @@ -31,4 +31,4 @@ echocancellation=0 [misc] history_max_size=30 -max_calls=1 +max_calls=10 From c5de6fff07acccc27a6e57cba918d11e7f93eec8 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 3 Nov 2011 16:49:44 +0100 Subject: [PATCH 058/122] Conference begins to work --- Classes/IncallViewController.h | 5 + Classes/IncallViewController.m | 101 ++- Classes/IncallViewController.xib | 1022 ++++++++++++++++------------- Classes/LinphoneUI/UICallButton.m | 2 +- Classes/PhoneViewController.m | 2 +- 5 files changed, 663 insertions(+), 469 deletions(-) diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 9635700c1..9f5b6e613 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -39,6 +39,7 @@ UISpeakerButton* speaker; UIButton* contacts; UITableView* callTableView; + UIButton* addCall, *mergeCalls; //key pad @@ -64,6 +65,8 @@ NSTimer *durationRefreasher; ABPeoplePickerNavigationController* myPeoplePickerController; + + UITableViewCell* selectedCell; } -(void)displayStatus:(NSString*) message; @@ -84,6 +87,8 @@ @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UIButton* contacts; @property (nonatomic, retain) IBOutlet UITableView* callTableView; +@property (nonatomic, retain) IBOutlet UIButton* addCall; +@property (nonatomic, retain) IBOutlet UIButton* mergeCalls; @property (nonatomic, retain) IBOutlet UIButton* one; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 5af0c2f89..5e46d5aad 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -40,6 +40,8 @@ @synthesize speaker; @synthesize contacts; @synthesize callTableView; +@synthesize addCall; +@synthesize mergeCalls; @synthesize one; @synthesize two; @@ -67,6 +69,23 @@ */ +bool isInConference(LinphoneCall* call) { + return linphone_call_get_current_params(call)->in_conference; +} + +int callCount(LinphoneCore* lc) { + int count = 0; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + if (!isInConference((LinphoneCall*)calls->data)) { + count++; + } + calls = calls->next; + } + return count; +} + // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; @@ -91,8 +110,28 @@ [nine initWithNumber:'9']; [star initWithNumber:'*']; [hash initWithNumber:'#']; - - + + [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchDown]; + [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + + [mergeCalls setHidden:YES]; +} + +-(void) addCallPressed { + [self dismissModalViewControllerAnimated:true]; +} + +-(void) mergeCallsPressed { + LinphoneCore* lc = [LinphoneManager getLc]; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + LinphoneCall* call = (LinphoneCall*)calls->data; + if (!isInConference(call)) { + linphone_core_add_to_conference(lc, call); + } + calls = calls->next; + } } -(void)updateCallsDurations { @@ -109,6 +148,7 @@ selector:@selector(updateCallsDurations) userInfo:nil repeats:YES]; + selectedCell = nil; } } @@ -116,6 +156,7 @@ if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; + selectedCell = nil; } } @@ -156,9 +197,8 @@ } -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [callDuration start]; dismissed = false; - [callTableView reloadData]; + [callTableView reloadData]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration stop]; @@ -170,6 +210,14 @@ [mute reset]; [pause reset]; + if (callCount([LinphoneManager getLc]) > 1) { + [pause setHidden:YES]; + [mergeCalls setHidden:NO]; + } else { + [pause setHidden:NO]; + [mergeCalls setHidden:YES]; + } + [callTableView reloadData]; } @@ -216,23 +264,6 @@ [super dealloc]; } -bool isInConference(LinphoneCall* call) { - return linphone_call_get_current_params(call)->in_conference; -} - -int callCount(LinphoneCore* lc) { - int count = 0; - const MSList* calls = linphone_core_get_calls(lc); - - while (calls != 0) { - if (!isInConference((LinphoneCall*)calls->data)) { - count++; - } - calls = calls->next; - } - return count; -} - -(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); @@ -284,12 +315,19 @@ int callCount(LinphoneCore* lc) { } [cell.detailTextLabel setText:ms]; + if (linphone_core_get_current_call([LinphoneManager getLc]) == call) - cell.accessoryType = UITableViewCellAccessoryCheckmark; + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; else if (confActive && isInConference(call)) + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; + else + cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; + + + /*if (cell == selectedCell) cell.accessoryType = UITableViewCellAccessoryCheckmark; else - cell.accessoryType = UITableViewCellAccessoryNone; + cell.accessoryType = UITableViewCellAccessoryNone;*/ } @@ -301,8 +339,6 @@ int callCount(LinphoneCore* lc) { cell.selectionStyle = UITableViewCellSelectionStyleNone; } - ms_message("pouet"); - LinphoneCore* lc = [LinphoneManager getLc]; if (indexPath.section == 0 && linphone_core_get_conference_size(lc) > 0) [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:true] conferenceActive:linphone_core_is_in_conference(lc)]; @@ -363,5 +399,20 @@ int callCount(LinphoneCore* lc) { return nil; } +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + //selectedCell = [tableView cellForRowAtIndexPath:indexPath]; + + bool inConf = (indexPath.section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0); + + if (inConf) { + linphone_core_enter_conference([LinphoneManager getLc]); + } else { + LinphoneCall* call = [self retrieveCallAtIndex:indexPath.row inConference:NO]; + linphone_core_resume_call([LinphoneManager getLc], call); + } + + [self updateUIFromLinphoneState: nil]; +} @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index b1930ec64..56393e2cd 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -12,9 +12,9 @@ YES - IBUITableView - IBUIViewController IBUIButton + IBUIViewController + IBUITableView IBUIView IBUILabel IBProxyObject @@ -49,6 +49,7 @@ {320, 182} + _NS:418 10 @@ -178,7 +179,7 @@ AAgACAAIAAEAAQABAAE {{239, 63}, {65, 21}} - + NO YES NO @@ -210,6 +211,289 @@ AAgACAAIAAEAAQABAAE + + + 292 + + YES + + + 292 + {{0, 68}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Mute + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + mic_active.png + + + + NSImage + mic_muted.png + + + + 2 + 2 + + + Helvetica-Bold + 18 + 16 + + + + + 292 + {{0, 122}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Add call + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + NSImage + startcall-green.png + + + + + + + + + 292 + {{94, 133}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Pau. Res. + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + NSImage + pausecall.png + + + + + 2 + 10 + + + Helvetica-Bold + 10 + 16 + + + + + 292 + {{90, 122}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Merge + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + + 292 + {{6, 261}, {258, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + stopcall-red.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {{181, 122}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Cont + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + contact-orange.png + + + + + + + 292 + {{91, 68}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + DTMF + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + dialer-orange.png + + + + + + + 292 + {{181, 68}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Spk + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + Speaker-32-off.png + + + + + + {{25, 110}, {270, 317}} + + + + + 3 + MSAwAA + + 2 + + + NO + NO + IBCocoaTouchFramework + -2147483356 @@ -227,33 +511,15 @@ AAgACAAIAAEAAQABAAE IBCocoaTouchFramework 0 0 - - 3 - MQA - + 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - 3 - MC41AA - - - NSImage - stopcall-red.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - + + + + @@ -261,7 +527,7 @@ AAgACAAIAAEAAQABAAE {{170, 266}, {72, 37}} - + NO NO IBCocoaTouchFramework @@ -276,7 +542,7 @@ AAgACAAIAAEAAQABAAE - + @@ -299,7 +565,7 @@ AAgACAAIAAEAAQABAAE - + @@ -322,7 +588,7 @@ AAgACAAIAAEAAQABAAE - + @@ -345,7 +611,7 @@ AAgACAAIAAEAAQABAAE - + @@ -368,7 +634,7 @@ AAgACAAIAAEAAQABAAE - + @@ -391,7 +657,7 @@ AAgACAAIAAEAAQABAAE - + @@ -414,7 +680,7 @@ AAgACAAIAAEAAQABAAE - + @@ -437,7 +703,7 @@ AAgACAAIAAEAAQABAAE - + @@ -460,7 +726,7 @@ AAgACAAIAAEAAQABAAE - + @@ -483,7 +749,7 @@ AAgACAAIAAEAAQABAAE - + @@ -506,7 +772,7 @@ AAgACAAIAAEAAQABAAE - + @@ -529,7 +795,7 @@ AAgACAAIAAEAAQABAAE - + @@ -552,191 +818,13 @@ AAgACAAIAAEAAQABAAE - + {{25, 110}, {270, 317}} - - 3 - MSAwAA - - 2 - - - NO - NO - IBCocoaTouchFramework - - - - 292 - - YES - - - 292 - {{0, 61}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - mic_active.png - - - - NSImage - mic_muted.png - - - - - - - - 292 - {{0, 121}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - NSImage - pausecall.png - - - - - - - - - 292 - {{6, 261}, {258, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{90, 115}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - contact-orange.png - - - - - - - 292 - {{93, 61}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - dialer-orange.png - - - - - - - 292 - {{181, 61}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - Speaker-32-off.png - - - - - - {{25, 110}, {270, 317}} - - - 3 MSAwAA @@ -750,7 +838,7 @@ AAgACAAIAAEAAQABAAE {{0, 20}, {320, 460}} - + 1 MC44MDAwMDAwMTE5IDAuODAwMDAwMDExOSAwLjgwMDAwMDAxMTkAA @@ -778,158 +866,6 @@ AAgACAAIAAEAAQABAAE 23 - - - controlSubView - - - - 44 - - - - padSubView - - - - 45 - - - - dialer - - - - 49 - - - - close - - - - 51 - - - - one - - - - 54 - - - - zero - - - - 55 - - - - star - - - - 56 - - - - hash - - - - 57 - - - - nine - - - - 58 - - - - two - - - - 59 - - - - three - - - - 60 - - - - four - - - - 67 - - - - five - - - - 69 - - - - six - - - - 71 - - - - seven - - - - 73 - - - - eight - - - - 75 - - - - mute - - - - 80 - - - - speaker - - - - 82 - - - - contacts - - - - 84 - peerName @@ -964,11 +900,43 @@ AAgACAAIAAEAAQABAAE - endPad + callTableView - + - 98 + 109 + + + + contacts + + + + 84 + + + + speaker + + + + 82 + + + + dialer + + + + 49 + + + + mute + + + + 80 @@ -980,19 +948,155 @@ AAgACAAIAAEAAQABAAE - pause + controlSubView - + - 105 + 44 - callTableView + nine - + - 109 + 58 + + + + eight + + + + 75 + + + + seven + + + + 73 + + + + six + + + + 71 + + + + five + + + + 69 + + + + four + + + + 67 + + + + three + + + + 60 + + + + one + + + + 54 + + + + zero + + + + 55 + + + + two + + + + 59 + + + + hash + + + + 57 + + + + star + + + + 56 + + + + close + + + + 51 + + + + endPad + + + + 98 + + + + padSubView + + + + 45 + + + + addCall + + + + 112 + + + + mergeCalls + + + + 114 + + + + pause + + + + 115 @@ -1074,12 +1178,12 @@ AAgACAAIAAEAAQABAAE YES - + @@ -1102,21 +1206,52 @@ AAgACAAIAAEAAQABAAE duration + + 93 + + + status + + + 106 + + + 26 YES - - - + + + + + controls + + 111 + + + addcall + + + 104 + + + merge + + + 15 + + + contacts + 13 @@ -1129,12 +1264,6 @@ AAgACAAIAAEAAQABAAE dialer - - 18 - - - end - 16 @@ -1142,10 +1271,10 @@ AAgACAAIAAEAAQABAAE mute - 15 - + 18 + - contacts + end 27 @@ -1164,36 +1293,12 @@ AAgACAAIAAEAAQABAAE - + pad - - 28 - - - end - - - 29 - - - close - - - 30 - - - 1 - - - 31 - - - star - 32 @@ -1213,10 +1318,10 @@ AAgACAAIAAEAAQABAAE 7 - 35 - + 37 + - 4 + 6 36 @@ -1225,10 +1330,10 @@ AAgACAAIAAEAAQABAAE 5 - 37 - + 35 + - 6 + 4 38 @@ -1236,6 +1341,18 @@ AAgACAAIAAEAAQABAAE 3 + + 30 + + + 1 + + + 41 + + + 0 + 39 @@ -1249,28 +1366,29 @@ AAgACAAIAAEAAQABAAE hash - 41 - + 31 + - 0 + star - 93 - - - status + 29 + + + close - 104 - + 28 + + + end + + + 113 + pauseresume - - 106 - - - @@ -1282,10 +1400,12 @@ AAgACAAIAAEAAQABAAE -2.CustomClassName -2.IBPluginDependency 10.IBPluginDependency - 104.CustomClassName 104.IBPluginDependency 106.IBPluginDependency 11.IBPluginDependency + 111.IBPluginDependency + 113.CustomClassName + 113.IBPluginDependency 12.CustomClassName 12.IBPluginDependency 13.CustomClassName @@ -1336,10 +1456,12 @@ AAgACAAIAAEAAQABAAE UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIPauseResumeButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDuration com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton @@ -1396,7 +1518,7 @@ AAgACAAIAAEAAQABAAE - 109 + 115 @@ -1419,6 +1541,7 @@ AAgACAAIAAEAAQABAAE YES YES + addCall callDuration callTableView close @@ -1431,6 +1554,7 @@ AAgACAAIAAEAAQABAAE five four hash + mergeCalls mute nine one @@ -1449,6 +1573,7 @@ AAgACAAIAAEAAQABAAE YES + UIButton UILabel UITableView UIButton @@ -1464,6 +1589,7 @@ AAgACAAIAAEAAQABAAE UIButton UIButton UIButton + UIButton UIView UIButton UILabel @@ -1482,6 +1608,7 @@ AAgACAAIAAEAAQABAAE YES YES + addCall callDuration callTableView close @@ -1494,6 +1621,7 @@ AAgACAAIAAEAAQABAAE five four hash + mergeCalls mute nine one @@ -1512,6 +1640,10 @@ AAgACAAIAAEAAQABAAE YES + + addCall + UIButton + callDuration UILabel @@ -1560,6 +1692,10 @@ AAgACAAIAAEAAQABAAE hash UIButton + + mergeCalls + UIButton + mute UIButton @@ -1711,6 +1847,7 @@ AAgACAAIAAEAAQABAAE mic_active.png mic_muted.png pausecall.png + startcall-green.png stopcall-red.png @@ -1721,6 +1858,7 @@ AAgACAAIAAEAAQABAAE {20, 20} {20, 20} {25, 23} + {60, 52} {62, 54} diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m index 1a12e3e0e..a63167009 100644 --- a/Classes/LinphoneUI/UICallButton.m +++ b/Classes/LinphoneUI/UICallButton.m @@ -32,7 +32,7 @@ [error show]; return; } - if (!linphone_core_in_call([LinphoneManager getLc])) { + if (TRUE /*!linphone_core_in_call([LinphoneManager getLc])*/) { LinphoneProxyConfig* proxyCfg; //get default proxy linphone_core_get_default_proxy([LinphoneManager getLc],&proxyCfg); diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index f460f34db..4073cc1a1 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -200,7 +200,7 @@ -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayInCall: call ViewforUser:username withDisplayName:displayName]; - [__call setEnabled:false]; + //[__call setEnabled:false]; [callDuration setText:NSLocalizedString(@"Calling...",nil)]; if ([speaker isOn]) [speaker toggle] ; //preset to off } From 8c741b0d39f3f0a7098eb10e8f493b0d94337c5a Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 7 Nov 2011 14:29:27 +0100 Subject: [PATCH 059/122] Conferencing integration continued --- Classes/IncallViewController.h | 22 +- Classes/IncallViewController.m | 218 ++- Classes/IncallViewController.xib | 1579 ++++++++++------------ Classes/LinphoneUI/LinphoneManager.m | 2 +- Classes/LinphoneUI/UIHangUpButton.m | 8 +- Classes/LinphoneUI/UIPauseResumeButton.m | 8 +- 6 files changed, 854 insertions(+), 983 deletions(-) diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 9f5b6e613..a7c99288e 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -26,20 +26,16 @@ @interface IncallViewController : UIViewController { - UIView* controlSubView; + UIView* controlSubView, *callControlSubView; - UILabel* peerName; - UILabel* peerNumber; - UIDuration* callDuration; - UILabel* status; - UIHangUpButton* endCtrl; + UIButton* endCtrl; UIButton* dialer; UIMuteButton* mute; UIPauseResumeButton* pause; UISpeakerButton* speaker; UIButton* contacts; UITableView* callTableView; - UIButton* addCall, *mergeCalls; + UIButton* addCall, *mergeCalls, *addToConf; //key pad @@ -57,7 +53,6 @@ UIDigitButton* star; UIDigitButton* zero; UIDigitButton* hash; - UIHangUpButton* endPad; UIButton* close; bool dismissed; @@ -66,20 +61,18 @@ ABPeoplePickerNavigationController* myPeoplePickerController; - UITableViewCell* selectedCell; + LinphoneCall* selectedCall; } -(void)displayStatus:(NSString*) message; - (IBAction)doAction:(id)sender; + @property (nonatomic, retain) IBOutlet UIView* controlSubView; +@property (nonatomic, retain) IBOutlet UIView* callControlSubView; @property (nonatomic, retain) IBOutlet UIView* padSubView; -@property (nonatomic, retain) IBOutlet UILabel* peerName; -@property (nonatomic, retain) IBOutlet UILabel* peerNumber; -@property (nonatomic, retain) IBOutlet UILabel* callDuration; -@property (nonatomic, retain) IBOutlet UILabel* status; @property (nonatomic, retain) IBOutlet UIButton* endCtrl; @property (nonatomic, retain) IBOutlet UIButton* dialer; @property (nonatomic, retain) IBOutlet UIButton* mute; @@ -89,7 +82,7 @@ @property (nonatomic, retain) IBOutlet UITableView* callTableView; @property (nonatomic, retain) IBOutlet UIButton* addCall; @property (nonatomic, retain) IBOutlet UIButton* mergeCalls; - +@property (nonatomic, retain) IBOutlet UIButton* addToConf; @property (nonatomic, retain) IBOutlet UIButton* one; @property (nonatomic, retain) IBOutlet UIButton* two; @@ -104,5 +97,4 @@ @property (nonatomic, retain) IBOutlet UIButton* zero; @property (nonatomic, retain) IBOutlet UIButton* hash; @property (nonatomic, retain) IBOutlet UIButton* close; -@property (nonatomic, retain) IBOutlet UIButton* endPad; @end diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 5e46d5aad..96b339ef2 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -26,12 +26,10 @@ @synthesize controlSubView; +@synthesize callControlSubView; @synthesize padSubView; -@synthesize peerName; -@synthesize peerNumber; -@synthesize callDuration; -@synthesize status; +@synthesize addToConf; @synthesize endCtrl; @synthesize close; @synthesize mute; @@ -55,7 +53,6 @@ @synthesize star; @synthesize zero; @synthesize hash; -@synthesize endPad; /* // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. @@ -112,9 +109,13 @@ int callCount(LinphoneCore* lc) { [hash initWithNumber:'#']; [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchDown]; - [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + [endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [addToConf addTarget:self action:@selector(addToConfCallPressed) forControlEvents:UIControlEventTouchUpInside]; [mergeCalls setHidden:YES]; + + selectedCall = nil; } -(void) addCallPressed { @@ -123,19 +124,20 @@ int callCount(LinphoneCore* lc) { -(void) mergeCallsPressed { LinphoneCore* lc = [LinphoneManager getLc]; - const MSList* calls = linphone_core_get_calls(lc); - while (calls != 0) { - LinphoneCall* call = (LinphoneCall*)calls->data; - if (!isInConference(call)) { - linphone_core_add_to_conference(lc, call); - } - calls = calls->next; - } + linphone_core_add_all_to_conference(lc); } +-(void) addToConfCallPressed { + if (!selectedCall) + return; + linphone_core_add_to_conference([LinphoneManager getLc], selectedCall); +} + + + -(void)updateCallsDurations { - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void)viewDidAppear:(BOOL)animated { @@ -148,7 +150,6 @@ int callCount(LinphoneCore* lc) { selector:@selector(updateCallsDurations) userInfo:nil repeats:YES]; - selectedCell = nil; } } @@ -156,7 +157,7 @@ int callCount(LinphoneCore* lc) { if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; - selectedCell = nil; + selectedCall = nil; } } @@ -166,9 +167,7 @@ int callCount(LinphoneCore* lc) { } -(void) displayStatus:(NSString*) message; { - [status setText:message]; - - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void) displayPad:(bool) enable { @@ -178,18 +177,9 @@ int callCount(LinphoneCore* lc) { -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { //restaure view [self displayPad:false]; - - if (displayName && [displayName length]>0) { - [peerName setText:displayName]; - [peerNumber setText:username]; - } else { - [peerName setText:username]; - [peerNumber setText:@""]; - } - [callDuration setText:@"Calling"]; - dismissed = false; + dismissed = false; - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void) displayIncomingCall:(LinphoneCall *)call NotificationFromUI:(UIViewController *)viewCtrl forUser:(NSString *)username withDisplayName:(NSString *)displayName { @@ -198,27 +188,45 @@ int callCount(LinphoneCore* lc) { -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { dismissed = false; - [callTableView reloadData]; + selectedCall = call; + [self updateUIFromLinphoneState: nil]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [callDuration stop]; [self dismissModalViewControllerAnimated:true]; dismissed = true; - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; [pause reset]; - if (callCount([LinphoneManager getLc]) > 1) { - [pause setHidden:YES]; - [mergeCalls setHidden:NO]; - } else { - [pause setHidden:NO]; - [mergeCalls setHidden:YES]; + LinphoneCore* lc; + + @try { + lc = [LinphoneManager getLc]; + + if (callCount([LinphoneManager getLc]) > 1) { + [pause setHidden:YES]; + [mergeCalls setHidden:NO]; + } else { + [pause setHidden:NO]; + [mergeCalls setHidden:YES]; + } + + [callTableView reloadData]; + } @catch (NSException* exc) { + return; } - [callTableView reloadData]; + // hide call control subview if no call selected + [callControlSubView setHidden:(selectedCall == NULL)]; + // hide add to conf if no conf exist + if (!callControlSubView.hidden) { + [addToConf setHidden:(linphone_core_get_conference_size(lc) == 0 || + isInConference(selectedCall))]; + } + // hide pause/resume if in conference + [pause setHidden:linphone_core_is_in_conference(lc)]; } - (IBAction)doAction:(id)sender { @@ -261,14 +269,19 @@ int callCount(LinphoneCore* lc) { - (void)dealloc { - [super dealloc]; + [super dealloc]; } -(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); - while (calls != 0 && index > 0) { + if (!conf && linphone_core_get_conference_size([LinphoneManager getLc])) + index--; + + while (calls != 0) { if (isInConference((LinphoneCall*)calls->data) == conf) { + if (index == 0) + break; index--; } calls = calls->next; @@ -284,7 +297,7 @@ int callCount(LinphoneCore* lc) { -- (void) updateCell:(UITableViewCell*)cell withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ +- (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ if (call == NULL) { ms_error("UpdateCell called with null call"); [cell.textLabel setText:@"BUG IN APP - call is null"]; @@ -314,20 +327,57 @@ int callCount(LinphoneCore* lc) { [ms appendFormat:@"%s", linphone_call_state_to_string(linphone_call_get_state(call)), nil]; } [cell.detailTextLabel setText:ms]; + - - if (linphone_core_get_current_call([LinphoneManager getLc]) == call) + if (linphone_core_get_current_call([LinphoneManager getLc]) == call) { cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; - else if (confActive && isInConference(call)) - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; - else - cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; - + } else if (confActive && isInConference(call)) { + cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.5]; + } else{ + cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; + } - /*if (cell == selectedCell) + if (call == selectedCall) { + // [cell setSelected:YES animated:NO]; cell.accessoryType = UITableViewCellAccessoryCheckmark; + }else{ + //[cell setSelected:NO animated:NO]; + cell.accessoryType = UITableViewCellAccessoryNone; + } +} + +-(void) updateConferenceCell:(UITableViewCell*) cell at:(NSIndexPath*)indexPath { + [cell.textLabel setText:@"Conference"]; + + LinphoneCore* lc = [LinphoneManager getLc]; + + cell.accessoryType = UITableViewCellAccessoryNone; + + NSMutableString* ms = [[NSMutableString alloc] init ]; + const MSList* calls = linphone_core_get_calls(lc); + while (calls) { + LinphoneCall* call = (LinphoneCall*)calls->data; + if (isInConference(call)) { + const LinphoneAddress* addr = linphone_call_get_remote_address(call); + + const char* n = linphone_address_get_display_name(addr); + if (n) + [ms appendFormat:@"%s ", n, nil]; + else + [ms appendFormat:@"%s ", linphone_address_get_username(addr), nil]; + + + if (call == selectedCall) + cell.accessoryType = UITableViewCellAccessoryCheckmark; + } + calls = calls->next; + } + [cell.detailTextLabel setText:ms]; + + if (linphone_core_is_in_conference(lc)) + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; else - cell.accessoryType = UITableViewCellAccessoryNone;*/ + cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]; } @@ -340,12 +390,17 @@ int callCount(LinphoneCore* lc) { } LinphoneCore* lc = [LinphoneManager getLc]; - if (indexPath.section == 0 && linphone_core_get_conference_size(lc) > 0) - [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:true] conferenceActive:linphone_core_is_in_conference(lc)]; + if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) + [self updateConferenceCell:cell at:indexPath]; else - [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:false] + [self updateCell:cell at:indexPath withCall: [self retrieveCallAtIndex:indexPath.row inConference:NO] conferenceActive:linphone_core_is_in_conference(lc)]; + cell.userInteractionEnabled = YES; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + cell.selectionStyle = UITableViewCellSelectionStyleBlue; + + /*NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; UIImage *theImage = [UIImage imageWithContentsOfFile:path]; @@ -359,6 +414,8 @@ int callCount(LinphoneCore* lc) { { LinphoneCore* lc = [LinphoneManager getLc]; + return callCount(lc) + (int)(linphone_core_get_conference_size(lc) > 0); + if (section == 0 && linphone_core_get_conference_size(lc) > 0) return linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc); @@ -367,6 +424,7 @@ int callCount(LinphoneCore* lc) { // UITableViewDataSource - (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + return 1; LinphoneCore* lc = [LinphoneManager getLc]; int count = 0; @@ -387,10 +445,11 @@ int callCount(LinphoneCore* lc) { // UITableViewDataSource - (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return @"Calls"; if (section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0) - return @"CONF"; + return @"Conference"; else - return @"CALLS"; + return @"Calls"; } // UITableViewDataSource @@ -401,18 +460,51 @@ int callCount(LinphoneCore* lc) { - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - //selectedCell = [tableView cellForRowAtIndexPath:indexPath]; + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + LinphoneCore* lc = [LinphoneManager getLc]; - bool inConf = (indexPath.section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0); + [[callTableView cellForRowAtIndexPath:indexPath] setSelected:YES animated:NO]; + + bool inConf = (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0); + + selectedCall = [self retrieveCallAtIndex:indexPath.row inConference:inConf]; if (inConf) { + if (linphone_core_is_in_conference(lc)) + return; + LinphoneCall* current = linphone_core_get_current_call(lc); + if (current) + linphone_core_pause_call(lc, current); linphone_core_enter_conference([LinphoneManager getLc]); - } else { - LinphoneCall* call = [self retrieveCallAtIndex:indexPath.row inConference:NO]; - linphone_core_resume_call([LinphoneManager getLc], call); + } else if (selectedCall) { + if (linphone_core_is_in_conference(lc)) { + linphone_core_leave_conference(lc); + } + linphone_core_resume_call([LinphoneManager getLc], selectedCall); } [self updateUIFromLinphoneState: nil]; } +-(void) endCallPressed { + if (selectedCall == NULL) { + ms_error("No selected call"); + return; + } + + LinphoneCore* lc = [LinphoneManager getLc]; + if (isInConference(selectedCall)) { + linphone_core_terminate_conference(lc); + /* + linphone_core_remove_from_conference(lc, selectedCall); + if ((linphone_core_get_conference_size(lc) - (int)linphone_core_is_in_conference(lc)) == 0) + linphone_core_terminate_conference(lc); + */ + } else { + linphone_core_terminate_call(lc, selectedCall); + } + selectedCall = NULL; +} + @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index 56393e2cd..ee5b5db69 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -12,11 +12,10 @@ YES - IBUIButton IBUIViewController IBUITableView IBUIView - IBUILabel + IBUIButton IBProxyObject @@ -49,177 +48,513 @@ {320, 182} - + _NS:418 - - 10 - - 549453824 - {512, 1} - - YES - - YES - - - - TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA -AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA -AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI -AAgACAAIAAEAAQABAAE - - - - - - 3 - MCAwAA - - - groupTableViewBackgroundColor + + 3 + MQA YES IBCocoaTouchFramework YES NO - 1 - 2 + 1 0 + YES YES 44 - 10 - 10 + 22 + 22 - + - -2147483356 - {320, 55} - - - - NO - YES - NO - IBCocoaTouchFramework - Caller - - 1 - MCAwIDAAA + 292 + + YES + + + 292 + {{119, -4}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Pau. Res. + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + mic_active.png + + + NSImage + pausecall.png + + + NSImage + mic_muted.png + + + + 2 + 10 + + + Helvetica-Bold + 10 + 16 + + + + + 292 + {{26, -4}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Add to conf + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + + + 2 + 14 + + + Helvetica-Bold + 14 + 16 + + + + + 292 + {{27, 56}, {262, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + stopcall-red.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + - - 1 - 17 - 1 - - 1 - 17 + {{0, 312}, {320, 148}} + + + + _NS:196 + + 3 + MC42NjY2NjY2NjY3AA - - Helvetica - 17 - 16 + NO + NO + IBCocoaTouchFramework + + + + -2147483356 + + YES + + + 292 + {{95, 244}, {82, 37}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + hide + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 184}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 9}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 9}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 2 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 9}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 3 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 69}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 4 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 69}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 5 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 69}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 6 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 124}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 7 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 124}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 8 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 124}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 9 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 184}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + * + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 184}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + # + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + - - - - -2147483356 - {{31, 63}, {61, 21}} + {{24, 72}, {272, 317}} - + + NO - YES - NO + NO IBCocoaTouchFramework - Number - - - 1 - 10 - - - - - - -2147483356 - {{239, 63}, {65, 21}} - - - - NO - YES - NO - IBCocoaTouchFramework - Duration - - - 1 - 10 - - - - - - -2147483356 - {{31, 347}, {258, 21}} - - - - NO - YES - NO - IBCocoaTouchFramework - status - - - 1 - 10 - - 292 YES + + + 292 + {{119, 55}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Merge + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + 292 - {{0, 68}, {82, 52}} + {{25, 0}, {82, 52}} @@ -230,42 +565,30 @@ AAgACAAIAAEAAQABAAE 0 1 Mute - - 3 - MQA - + 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - 3 - MC41AA - - - NSImage - mic_active.png - - - - NSImage - mic_muted.png - - - + + + + + + 2 2 - + Helvetica-Bold 18 16 - + 292 - {{0, 122}, {82, 52}} + {{25, 54}, {82, 52}} @@ -282,128 +605,23 @@ AAgACAAIAAEAAQABAAE MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + NSImage startcall-green.png - - - - - - - - 292 - {{94, 133}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Pau. Res. - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - NSImage - pausecall.png - - - - - 2 - 10 - - - Helvetica-Bold - 10 - 16 - - - - - 292 - {{90, 122}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Merge - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - - - 2 - 17 - - - Helvetica-Bold - 17 - 16 - - - - - 292 - {{6, 261}, {258, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - stopcall-red.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - + + + + 292 - {{181, 122}, {82, 52}} + {{206, 54}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -421,13 +639,13 @@ AAgACAAIAAEAAQABAAE NSImage contact-orange.png - - + + 292 - {{91, 68}, {82, 52}} + {{116, 0}, {82, 52}} @@ -448,16 +666,16 @@ AAgACAAIAAEAAQABAAE NSImage dialer-orange.png - - + + 292 - {{181, 68}, {82, 52}} + {{206, 0}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -475,361 +693,15 @@ AAgACAAIAAEAAQABAAE NSImage Speaker-32-off.png - - + + - {{25, 110}, {270, 317}} + {{0, 191}, {320, 113}} - - 3 - MSAwAA - - 2 - - - NO - NO - IBCocoaTouchFramework - - - - -2147483356 - - YES - - - 292 - {{30, 258}, {80, 65}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{170, 266}, {72, 37}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - close - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 2 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 3 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 4 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 5 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 6 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 7 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 8 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 9 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - * - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - # - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - {{25, 110}, {270, 317}} - - - - - 3 - MSAwAA - - + NO NO IBCocoaTouchFramework @@ -866,38 +738,6 @@ AAgACAAIAAEAAQABAAE 23 - - - peerName - - - - 89 - - - - peerNumber - - - - 90 - - - - callDuration - - - - 91 - - - - status - - - - 94 - callTableView @@ -908,51 +748,11 @@ AAgACAAIAAEAAQABAAE - contacts + eight - + - 84 - - - - speaker - - - - 82 - - - - dialer - - - - 49 - - - - mute - - - - 80 - - - - endCtrl - - - - 99 - - - - controlSubView - - - - 44 + 75 @@ -962,14 +762,6 @@ AAgACAAIAAEAAQABAAE 58 - - - eight - - - - 75 - seven @@ -1058,14 +850,6 @@ AAgACAAIAAEAAQABAAE 51 - - - endPad - - - - 98 - padSubView @@ -1076,11 +860,27 @@ AAgACAAIAAEAAQABAAE - addCall + callControlSubView - + - 112 + 117 + + + + endCtrl + + + + 99 + + + + pause + + + + 115 @@ -1092,11 +892,59 @@ AAgACAAIAAEAAQABAAE - pause + addCall - + - 115 + 112 + + + + contacts + + + + 84 + + + + speaker + + + + 82 + + + + dialer + + + + 49 + + + + mute + + + + 80 + + + + controlSubView + + + + 44 + + + + addToConf + + + + 119 @@ -1178,110 +1026,23 @@ AAgACAAIAAEAAQABAAE YES - - - - - + + - - 10 - - - peerName - - - 11 - - - peerNumber - - - 12 - - - duration - - - 93 - - - status - 106 - - 26 - - - YES - - - - - - - - - - - controls - - - 111 - - - addcall - - - 104 - - - merge - - - 15 - - - contacts - - - 13 - - - speaker - - - 17 - - - dialer - - - 16 - - - mute - - - 18 - - - end - 27 YES - @@ -1299,18 +1060,18 @@ AAgACAAIAAEAAQABAAE pad - - 32 - - - 9 - 33 8 + + 32 + + + 9 + 34 @@ -1378,17 +1139,86 @@ AAgACAAIAAEAAQABAAE close - 28 - - + 116 + + + YES + + + + + + callcontrols + + + 18 + + end 113 - - + + pauseresume + + 118 + + + addtoconf + + + 26 + + + YES + + + + + + + + + controls + + + 104 + + + merge + + + 111 + + + addcall + + + 15 + + + contacts + + + 13 + + + speaker + + + 17 + + + dialer + + + 16 + + + mute + @@ -1399,28 +1229,23 @@ AAgACAAIAAEAAQABAAE -1.IBPluginDependency -2.CustomClassName -2.IBPluginDependency - 10.IBPluginDependency 104.IBPluginDependency 106.IBPluginDependency - 11.IBPluginDependency 111.IBPluginDependency 113.CustomClassName 113.IBPluginDependency - 12.CustomClassName - 12.IBPluginDependency + 116.IBPluginDependency + 118.IBPluginDependency 13.CustomClassName 13.IBPluginDependency 15.IBPluginDependency 16.CustomClassName 16.IBPluginDependency 17.IBPluginDependency - 18.CustomClassName 18.IBPluginDependency 2.IBPluginDependency 26.IBPluginDependency 27.IBPluginDependency - 28.CustomClassName - 28.IBPluginDependency 29.IBPluginDependency 30.CustomClassName 30.IBPluginDependency @@ -1447,7 +1272,6 @@ AAgACAAIAAEAAQABAAE 41.CustomClassName 41.IBPluginDependency 9.IBPluginDependency - 93.IBPluginDependency YES @@ -1458,11 +1282,9 @@ AAgACAAIAAEAAQABAAE com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIPauseResumeButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIDuration + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1470,13 +1292,10 @@ AAgACAAIAAEAAQABAAE UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIHangUpButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1503,7 +1322,6 @@ AAgACAAIAAEAAQABAAE UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1518,7 +1336,7 @@ AAgACAAIAAEAAQABAAE - 115 + 119 @@ -1542,7 +1360,8 @@ AAgACAAIAAEAAQABAAE YES addCall - callDuration + addToConf + callControlSubView callTableView close contacts @@ -1550,7 +1369,6 @@ AAgACAAIAAEAAQABAAE dialer eight endCtrl - endPad five four hash @@ -1560,13 +1378,10 @@ AAgACAAIAAEAAQABAAE one padSubView pause - peerName - peerNumber seven six speaker star - status three two zero @@ -1574,7 +1389,8 @@ AAgACAAIAAEAAQABAAE YES UIButton - UILabel + UIButton + UIView UITableView UIButton UIButton @@ -1589,16 +1405,12 @@ AAgACAAIAAEAAQABAAE UIButton UIButton UIButton - UIButton UIView UIButton - UILabel - UILabel UIButton UIButton UIButton UIButton - UILabel UIButton UIButton UIButton @@ -1609,7 +1421,8 @@ AAgACAAIAAEAAQABAAE YES addCall - callDuration + addToConf + callControlSubView callTableView close contacts @@ -1617,7 +1430,6 @@ AAgACAAIAAEAAQABAAE dialer eight endCtrl - endPad five four hash @@ -1627,13 +1439,10 @@ AAgACAAIAAEAAQABAAE one padSubView pause - peerName - peerNumber seven six speaker star - status three two zero @@ -1645,8 +1454,12 @@ AAgACAAIAAEAAQABAAE UIButton - callDuration - UILabel + addToConf + UIButton + + + callControlSubView + UIView callTableView @@ -1676,10 +1489,6 @@ AAgACAAIAAEAAQABAAE endCtrl UIButton - - endPad - UIButton - five UIButton @@ -1716,14 +1525,6 @@ AAgACAAIAAEAAQABAAE pause UIButton - - peerName - UILabel - - - peerNumber - UILabel - seven UIButton @@ -1740,10 +1541,6 @@ AAgACAAIAAEAAQABAAE star UIButton - - status - UILabel - three UIButton @@ -1771,22 +1568,6 @@ AAgACAAIAAEAAQABAAE ./Classes/UIDigitButton.h - - UIDuration - UILabel - - IBProjectSource - ./Classes/UIDuration.h - - - - UIHangUpButton - UIButton - - IBProjectSource - ./Classes/UIHangUpButton.h - - UIMuteButton UIToggleButton diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 0b02bf203..a5fe0a59c 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -694,7 +694,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach libmsilbc_init(); #if defined (HAVE_SILK) - libmssilk_init(); + //libmssilk_init(); #endif #ifdef HAVE_AMR libmsamr_init(); //load amr plugin if present from the liblinphone sdk diff --git a/Classes/LinphoneUI/UIHangUpButton.m b/Classes/LinphoneUI/UIHangUpButton.m index 879276338..ffb57a87f 100644 --- a/Classes/LinphoneUI/UIHangUpButton.m +++ b/Classes/LinphoneUI/UIHangUpButton.m @@ -23,7 +23,13 @@ @implementation UIHangUpButton -(void) touchUp:(id) sender { - linphone_core_terminate_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + LinphoneCore* lc = [LinphoneManager getLc]; + if (!lc) + return; + LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); + + if (call) + linphone_core_terminate_call(lc,call); } - (id)initWithFrame:(CGRect)frame { diff --git a/Classes/LinphoneUI/UIPauseResumeButton.m b/Classes/LinphoneUI/UIPauseResumeButton.m index 9cd47f8ac..22f7db8b3 100644 --- a/Classes/LinphoneUI/UIPauseResumeButton.m +++ b/Classes/LinphoneUI/UIPauseResumeButton.m @@ -38,13 +38,13 @@ } -(bool) isInitialStateOn { @try { - const MSList* c = linphone_core_get_calls([LinphoneManager getLc]); + LinphoneCall* c = linphone_core_get_current_call([LinphoneManager getLc]); if (c) { - return linphone_call_get_state((LinphoneCall*)c->data) == LinphoneCallPaused; + return linphone_call_get_state(c) == LinphoneCallPaused; } else { - - return false; + /* if current call is paused -> c == null */ + return true; } } @catch(NSException* e) { //not ready yet From 649e245a3a8782e31ef3b58e5fe93b65ec0bc6f7 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 7 Nov 2011 15:09:59 +0100 Subject: [PATCH 060/122] Add back-to-in-call-view button on dialer during call --- Classes/PhoneViewController.h | 2 + Classes/PhoneViewController.m | 14 +- Classes/PhoneViewController.xib | 399 +++++++++++--------------------- PhoneMainView.xib | 2 - 4 files changed, 151 insertions(+), 266 deletions(-) diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 07df3c9b5..8d209d6ee 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -36,6 +36,7 @@ UIEraseButton* erase; UIView* incallView; + UIButton* backToCallView; UIDuration* callDuration; UIMuteButton* mute; UISpeakerButton* speaker; @@ -82,6 +83,7 @@ @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UILabel* peerLabel; +@property (nonatomic, retain) IBOutlet UIButton* backToCallView; @property (nonatomic, retain) IBOutlet UIButton* one; @property (nonatomic, retain) IBOutlet UIButton* two; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 4073cc1a1..8ca16ba45 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -33,7 +33,7 @@ @synthesize hangup; @synthesize status; @synthesize erase; - +@synthesize backToCallView; @synthesize incallView; @synthesize callDuration; @@ -107,7 +107,15 @@ [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; [erase initWithAddressField:address]; - + + [backToCallView addTarget:self action:@selector(backToCallViewPressed) forControlEvents:UIControlEventTouchUpInside]; +} + +-(void) backToCallViewPressed { + [self displayInCall: nil + FromUI:nil + forUser:nil + withDisplayName:nil]; } @@ -193,9 +201,7 @@ } else { [peerLabel setText:username?username:@""]; } - [address setHidden:true]; [incallView setHidden:false]; - [dialerView setHidden:true]; } -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayInCall: call ViewforUser:username diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index 9e854ae94..385db8b02 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -43,133 +43,6 @@ 292 YES - - - -2147483356 - - YES - - - 292 - {320, 40} - - - NO - YES - NO - IBCocoaTouchFramework - who - - 1 - MCAwIDAAA - - - 1 - 10 - 1 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 292 - {{98, 38}, {124, 21}} - - - NO - YES - NO - IBCocoaTouchFramework - how long - - - 1 - 10 - 1 - - - - - - 292 - {{239, 14}, {72, 37}} - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - 3 - MQA - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - 3 - MC41AA - - - NSImage - Speaker-32-off.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{0, 14}, {72, 37}} - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - mic_active.png - - - - - - {320, 65} - - - - 1 - MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA - - NO - IBCocoaTouchFramework - 292 @@ -181,23 +54,39 @@ {{254, 0}, {66, 65}} + NO IBCocoaTouchFramework 0 0 <- - + + 3 + MQA + 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - + + 3 + MC41AA + NSImage clavier-01-106px.png - - + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + @@ -205,6 +94,7 @@ {{5, 0}, {255, 66}} + NO NO IBCocoaTouchFramework @@ -242,6 +132,7 @@ {320, 65} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -254,6 +145,7 @@ {{0, 328}, {160, 66}} + NO NO IBCocoaTouchFramework @@ -274,7 +166,7 @@ clavier-01-160px.png - + @@ -282,17 +174,28 @@ {{9, 390}, {304, 21}} + NO YES NO IBCocoaTouchFramework status - + + 1 + MCAwIDAAA + 1 10 - - + + 1 + 17 + + + Helvetica + 17 + 16 + @@ -300,6 +203,7 @@ {{213, 64}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -314,7 +218,7 @@ - + @@ -322,6 +226,7 @@ {{0, 130}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -336,7 +241,7 @@ - + @@ -344,6 +249,7 @@ {{107, 130}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -361,7 +267,7 @@ clavier-01-108px.png - + @@ -369,6 +275,7 @@ {{213, 130}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -383,7 +290,7 @@ - + @@ -391,6 +298,7 @@ {{0, 196}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -405,7 +313,7 @@ - + @@ -413,6 +321,7 @@ {{213, 196}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -427,7 +336,7 @@ - + @@ -435,6 +344,7 @@ {{107, 64}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -449,7 +359,7 @@ - + @@ -457,6 +367,7 @@ {{0, 64}, {107, 66}} + 1 MC40MDAwMDAwMSAxIDEgMAA @@ -475,7 +386,7 @@ - + @@ -483,6 +394,7 @@ {{0, 262}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -497,7 +409,7 @@ - + @@ -505,6 +417,7 @@ {{107, 262}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -519,7 +432,7 @@ - + @@ -527,6 +440,7 @@ {{213, 262}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -541,7 +455,7 @@ - + @@ -549,6 +463,7 @@ {{107, 196}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -563,7 +478,7 @@ - + @@ -571,6 +486,7 @@ {{160, 328}, {160, 66}} + NO NO IBCocoaTouchFramework @@ -589,12 +505,61 @@ - + + + + + -2147483356 + + YES + + + 292 + {160, 66} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Back + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + 2 + 2 + + + Helvetica-Bold + 18 + 16 + + + + {{160, 328}, {160, 66}} + + + + + 1 + MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA + + NO + IBCocoaTouchFramework {{0, 20}, {320, 460}} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -750,38 +715,6 @@ 119 - - - peerLabel - - - - 120 - - - - callDuration - - - - 121 - - - - speaker - - - - 123 - - - - mute - - - - 125 - erase @@ -806,6 +739,14 @@ 159 + + + backToCallView + + + + 161 + delegate @@ -863,7 +804,6 @@ - @@ -876,6 +816,7 @@ + @@ -900,38 +841,11 @@ YES - - - - + inCall - - 117 - - - speaker - - - 116 - - - duration - - - 118 - - - mute - - - 115 - - - display - 39 @@ -1017,6 +931,12 @@ Address + + 160 + + + back + @@ -1033,16 +953,10 @@ 107.IBPluginDependency 114.IBPluginDependency 114.IBUserGuides - 115.IBPluginDependency - 116.CustomClassName - 116.IBPluginDependency - 117.CustomClassName - 117.IBPluginDependency - 118.CustomClassName - 118.IBPluginDependency 150.CustomClassName 150.IBPluginDependency 157.IBPluginDependency + 160.IBPluginDependency 29.CustomClassName 29.IBPluginDependency 30.CustomClassName @@ -1104,16 +1018,10 @@ 1 - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIDuration - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UISpeakerButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIMuteButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIEraseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1157,7 +1065,7 @@ - 159 + 161 @@ -1183,6 +1091,7 @@ __call address back + backToCallView callDuration dialerView eight @@ -1211,6 +1120,7 @@ UIButton UITextField UIButton + UIButton UILabel UIView UIButton @@ -1242,6 +1152,7 @@ __call address back + backToCallView callDuration dialerView eight @@ -1279,6 +1190,10 @@ back UIButton + + backToCallView + UIButton + callDuration UILabel @@ -1390,14 +1305,6 @@ ./Classes/UIDigitButton.h - - UIDuration - UILabel - - IBProjectSource - ./Classes/UIDuration.h - - UIEraseButton UIButton @@ -1414,30 +1321,6 @@ ./Classes/UIHangUpButton.h - - UIMuteButton - UIToggleButton - - IBProjectSource - ./Classes/UIMuteButton.h - - - - UISpeakerButton - UIToggleButton - - IBProjectSource - ./Classes/UISpeakerButton.h - - - - UIToggleButton - UIButton - - IBProjectSource - ./Classes/UIToggleButton.h - - 0 @@ -1460,21 +1343,17 @@ YES YES - Speaker-32-off.png clavier-01-106px.png clavier-01-108px.png clavier-01-160px.png - mic_active.png startcall-green.png stopcall-red.png YES - {32, 32} {106, 60} {108, 60} {160, 60} - {20, 20} {60, 52} {62, 54} diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 27580eb6f..26cbcfb90 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -47,7 +47,6 @@ {320, 480} - 1 MSAxIDEAA @@ -141,7 +140,6 @@ 266 {{0, 431}, {320, 49}} - 3 MCAwAA From 58e9256f79412fefd5a56f3546f5ee28656ea9ae Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 7 Nov 2011 15:40:18 +0100 Subject: [PATCH 061/122] DTMF fixes --- Classes/IncallViewController.m | 10 +++++----- Classes/LinphoneUI/UIDigitButton.h | 7 ++++++- Classes/LinphoneUI/UIDigitButton.m | 8 +++++--- Classes/PhoneViewController.m | 30 +++++++++++++++++------------- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 96b339ef2..4b2163559 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -115,7 +115,7 @@ int callCount(LinphoneCore* lc) { [mergeCalls setHidden:YES]; - selectedCall = nil; + //selectedCall = nil; } -(void) addCallPressed { @@ -157,7 +157,6 @@ int callCount(LinphoneCore* lc) { if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; - selectedCall = nil; } } @@ -188,7 +187,8 @@ int callCount(LinphoneCore* lc) { -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { dismissed = false; - selectedCall = call; + if (call) + selectedCall = call; [self updateUIFromLinphoneState: nil]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { @@ -299,8 +299,8 @@ int callCount(LinphoneCore* lc) { - (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ if (call == NULL) { - ms_error("UpdateCell called with null call"); - [cell.textLabel setText:@"BUG IN APP - call is null"]; + ms_warning("UpdateCell called with null call"); + [cell.textLabel setText:@""]; return; } const LinphoneAddress* addr = linphone_call_get_remote_address(call); diff --git a/Classes/LinphoneUI/UIDigitButton.h b/Classes/LinphoneUI/UIDigitButton.h index 08b3a813b..70f7aee18 100644 --- a/Classes/LinphoneUI/UIDigitButton.h +++ b/Classes/LinphoneUI/UIDigitButton.h @@ -23,9 +23,14 @@ @private char mDigit; UITextField* mAddress; + + bool_t sendDtmfDuringCall; } -(void) initWithNumber:(char)digit ; --(void) initWithNumber:(char)digit addressField:(UITextField*) address; +-(void) initWithNumber:(char)digit addressField:(UITextField*) address dtmf:(bool_t)send; + + +@property bool_t sendDtmfDuringCall; @end diff --git a/Classes/LinphoneUI/UIDigitButton.m b/Classes/LinphoneUI/UIDigitButton.m index a4660f11a..2a0cad86c 100644 --- a/Classes/LinphoneUI/UIDigitButton.m +++ b/Classes/LinphoneUI/UIDigitButton.m @@ -23,11 +23,12 @@ @implementation UIDigitButton +@synthesize sendDtmfDuringCall; -(void) touchDown:(id) sender { - if (mAddress && !linphone_core_in_call([LinphoneManager getLc])) { + if (mAddress && (!sendDtmfDuringCall || !linphone_core_in_call([LinphoneManager getLc]))) { NSString* newAddress = [NSString stringWithFormat:@"%@%c",mAddress.text,mDigit]; [mAddress setText:newAddress]; linphone_core_play_dtmf([LinphoneManager getLc], mDigit, -1); @@ -60,9 +61,10 @@ } -(void) initWithNumber:(char)digit { - [self initWithNumber:digit addressField:nil]; + [self initWithNumber:digit addressField:nil dtmf:true]; } --(void) initWithNumber:(char)digit addressField:(UITextField*) address{ +-(void) initWithNumber:(char)digit addressField:(UITextField*) address dtmf:(bool_t)sendDtmf{ + sendDtmfDuringCall = sendDtmf; mDigit=digit ; mAddress=address?[address retain]:nil; [self addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown]; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 8ca16ba45..0e09d9a7c 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -91,18 +91,18 @@ [super viewDidLoad]; mDisplayName = [UILabel alloc]; - [zero initWithNumber:'0' addressField:address ]; - [one initWithNumber:'1' addressField:address ]; - [two initWithNumber:'2' addressField:address ]; - [three initWithNumber:'3' addressField:address ]; - [four initWithNumber:'4' addressField:address ]; - [five initWithNumber:'5' addressField:address ]; - [six initWithNumber:'6' addressField:address ]; - [seven initWithNumber:'7' addressField:address ]; - [eight initWithNumber:'8' addressField:address ]; - [nine initWithNumber:'9' addressField:address ]; - [star initWithNumber:'*' addressField:address ]; - [hash initWithNumber:'#' addressField:address ]; + [zero initWithNumber:'0' addressField:address dtmf:false]; + [one initWithNumber:'1' addressField:address dtmf:false]; + [two initWithNumber:'2' addressField:address dtmf:false]; + [three initWithNumber:'3' addressField:address dtmf:false]; + [four initWithNumber:'4' addressField:address dtmf:false]; + [five initWithNumber:'5' addressField:address dtmf:false]; + [six initWithNumber:'6' addressField:address dtmf:false]; + [seven initWithNumber:'7' addressField:address dtmf:false]; + [eight initWithNumber:'8' addressField:address dtmf:false]; + [nine initWithNumber:'9' addressField:address dtmf:false]; + [star initWithNumber:'*' addressField:address dtmf:false]; + [hash initWithNumber:'#' addressField:address dtmf:false]; [__call initWithAddress:address withDisplayName:mDisplayName]; [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; @@ -201,7 +201,7 @@ } else { [peerLabel setText:username?username:@""]; } - [incallView setHidden:false]; + [incallView setHidden:NO]; } -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayInCall: call ViewforUser:username @@ -209,6 +209,8 @@ //[__call setEnabled:false]; [callDuration setText:NSLocalizedString(@"Calling...",nil)]; if ([speaker isOn]) [speaker toggle] ; //preset to off + + [incallView setHidden:NO]; } -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { @@ -220,6 +222,8 @@ withDisplayName:displayName]; if ([speaker isOn]) [speaker toggle] ; //preset to off; } + + [incallView setHidden:NO]; } //status reporting -(void) displayStatus:(NSString*) message { From 2ef541de045dc46c818d7bfc11e23f6ab2132f8c Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 8 Nov 2011 14:33:57 +0100 Subject: [PATCH 062/122] Check LinphoneCore ptr validity before using it --- Classes/LinphoneUI/LinphoneManager.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index a5fe0a59c..6018af979 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -791,6 +791,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } -(void) beginInterruption { + if (!theLinphoneCore) + return; LinphoneCall* c = linphone_core_get_current_call(theLinphoneCore); ms_message("Sound interruption detected!"); if (c) { @@ -799,6 +801,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } -(void) endInterruption { + if (!theLinphoneCore) + return; ms_message("Sound interruption ended!"); const MSList* c = linphone_core_get_calls(theLinphoneCore); From 28f114cf29a53888b81344e9e72645760347064d Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 8 Nov 2011 15:18:10 +0100 Subject: [PATCH 063/122] Fix 'presentModelViewController' crash for iOS 5 with multicall --- Classes/AdvancedPhoneViewController.m | 3 ++- linphone.xcodeproj/project.pbxproj | 3 --- submodules/linphone | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m index 1328e5ad3..39266f9c8 100644 --- a/Classes/AdvancedPhoneViewController.m +++ b/Classes/AdvancedPhoneViewController.m @@ -52,7 +52,8 @@ } -(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - if (linphone_call_get_dir(call)==LinphoneCallIncoming){ + if (self.presentedViewController != mIncallViewController && + linphone_call_get_dir(call)==LinphoneCallIncoming){ [self presentModalViewController:mIncallViewController animated:true]; } diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index e7cd1110c..aa8973b9a 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -403,8 +403,6 @@ 22F2508D107141E100AC9B3F /* PhoneViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneViewController.xib; sourceTree = ""; }; 22F254801073D99800AC9B3F /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringback.wav; path = "liblinphone-sdk/apple-darwin/share/sounds/linphone/ringback.wav"; sourceTree = ""; }; 22F51EF5107FA66500F98953 /* untitled.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = untitled.plist; sourceTree = ""; }; - 22F9D6B51463EBDC00C6FEAF /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; - 22F9D6B61463EBDC00C6FEAF /* AdvancedPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedPhoneViewController.h; sourceTree = ""; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; @@ -811,7 +809,6 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - F0A486D71404FE53009EC0BE /* libsrtp.a */, 2214783B1386A2030020F8B8 /* Localizable.strings */, 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */, 223148E51178A09900637D6A /* libmsilbc.a */, diff --git a/submodules/linphone b/submodules/linphone index f13744a76..9d7b21816 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit f13744a765200961c74617c12295d04640a74f05 +Subproject commit 9d7b218163752f7d76c59b6d873be222b3b97583 From 4e0cba4db9ae038624dd76c3aabacaa986e14292 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 8 Nov 2011 16:12:59 +0100 Subject: [PATCH 064/122] Update xcode project --- linphone.xcodeproj/project.pbxproj | 4 ++++ submodules/liblinphone.xcodeproj/project.pbxproj | 4 ++++ submodules/linphone | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index aa8973b9a..e7f916b11 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -83,6 +83,7 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 3440A549146978BB0076355C /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3440A548146978BB0076355C /* libsrtp.a */; }; 346A75C714619F1D005C9D07 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */; }; 346A75C814619F73005C9D07 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; 346A75CB14628DC6005C9D07 /* pausecall.png in Resources */ = {isa = PBXBuildFile; fileRef = 346A75C914628DC6005C9D07 /* pausecall.png */; }; @@ -406,6 +407,7 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 3440A548146978BB0076355C /* libsrtp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsrtp.a; path = "liblinphone-sdk/apple-darwin/lib/libsrtp.a"; sourceTree = ""; }; 346A75C514619F1D005C9D07 /* AdvancedPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedPhoneViewController.h; sourceTree = ""; }; 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; 346A75C914628DC6005C9D07 /* pausecall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pausecall.png; path = submodules/linphone/pixmaps/pausecall.png; sourceTree = ""; }; @@ -447,6 +449,7 @@ 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */, 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */, + 3440A549146978BB0076355C /* libsrtp.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -812,6 +815,7 @@ 2214783B1386A2030020F8B8 /* Localizable.strings */, 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */, 223148E51178A09900637D6A /* libmsilbc.a */, + 3440A548146978BB0076355C /* libsrtp.a */, 223148E31178A08200637D6A /* libilbc.a */, 220FAD2810765B400068D98F /* libeXosip2.a */, 220FAD2910765B400068D98F /* libgsm.a */, diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 3eb2650c2..ebd7dd53b 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -187,6 +187,7 @@ 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */; }; 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */; }; + 3440A54B14697B570076355C /* l16.c in Sources */ = {isa = PBXBuildFile; fileRef = 3440A54A14697B570076355C /* l16.c */; }; 7014533C13FA7ECA00A01D86 /* zrtp.h in Headers */ = {isa = PBXBuildFile; fileRef = 7014533B13FA7ECA00A01D86 /* zrtp.h */; }; 7014533E13FA841E00A01D86 /* zrtp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7014533D13FA841E00A01D86 /* zrtp.c */; }; 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */; }; @@ -418,6 +419,7 @@ 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qualityindicator.c; sourceTree = ""; }; 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratecontrol.c; sourceTree = ""; }; + 3440A54A14697B570076355C /* l16.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = l16.c; sourceTree = ""; }; 7014533B13FA7ECA00A01D86 /* zrtp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zrtp.h; sourceTree = ""; }; 7014533D13FA841E00A01D86 /* zrtp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zrtp.c; sourceTree = ""; }; 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; @@ -601,6 +603,7 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 3440A54A14697B570076355C /* l16.c */, 22985D9214643BEF005CA0B5 /* aqsnd.c */, 225AA2E2144F1E3400BA809B /* qosanalyzer.c */, 225AA2E0144F1C6600BA809B /* bitratedriver.c */, @@ -1117,6 +1120,7 @@ 225AA2E3144F1E3400BA809B /* qosanalyzer.c in Sources */, 225AA2FD1451A95400BA809B /* conference.c in Sources */, 22985D9314643BEF005CA0B5 /* aqsnd.c in Sources */, + 3440A54B14697B570076355C /* l16.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 9d7b21816..cb3f7eb55 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 9d7b218163752f7d76c59b6d873be222b3b97583 +Subproject commit cb3f7eb5565d36e677145cf969e6d99ee8cb6ce5 From ec261bd518f54a140afa7a09bf0c1ef4ff8406e2 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 9 Nov 2011 16:04:59 +0100 Subject: [PATCH 065/122] Improved graphics/layout for incall view --- Classes/AdvancedPhoneViewController.m | 4 +- Classes/IncallViewController.h | 10 +- Classes/IncallViewController.m | 140 ++- Classes/IncallViewController.xib | 1450 ++++++++++++------------- Classes/LinphoneAppDelegate.m | 8 +- Classes/LinphoneUI/UIToggleButton.m | 6 +- Classes/PhoneViewController.m | 1 + PhoneMainView.xib | 26 +- Resources/Speaker-32-off.png | Bin 615 -> 1798 bytes Resources/Speaker-32-on.png | Bin 569 -> 1782 bytes Resources/addcall-green.png | Bin 0 -> 6261 bytes Resources/conf_merge.png | Bin 0 -> 3135 bytes Resources/contact_orange.png | Bin 0 -> 4771 bytes Resources/mic_active.png | Bin 0 -> 6770 bytes Resources/mic_muted.png | Bin 0 -> 10007 bytes Resources/numpad.png | Bin 0 -> 5314 bytes Resources/pausecall.png | Bin 0 -> 1622 bytes Resources/resumecall.png | Bin 0 -> 3110 bytes linphone.xcodeproj/project.pbxproj | 64 +- 19 files changed, 883 insertions(+), 826 deletions(-) create mode 100644 Resources/addcall-green.png create mode 100644 Resources/conf_merge.png create mode 100644 Resources/contact_orange.png create mode 100644 Resources/mic_active.png create mode 100644 Resources/mic_muted.png create mode 100644 Resources/numpad.png create mode 100644 Resources/pausecall.png create mode 100644 Resources/resumecall.png diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m index 39266f9c8..8ad355a1b 100644 --- a/Classes/AdvancedPhoneViewController.m +++ b/Classes/AdvancedPhoneViewController.m @@ -52,8 +52,8 @@ } -(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - if (self.presentedViewController != mIncallViewController && - linphone_call_get_dir(call)==LinphoneCallIncoming){ + if (self.presentedViewController != mIncallViewController && (call == 0x0 || + linphone_call_get_dir(call)==LinphoneCallIncoming)){ [self presentModalViewController:mIncallViewController animated:true]; } diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index a7c99288e..1efea4006 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -26,12 +26,12 @@ @interface IncallViewController : UIViewController { - UIView* controlSubView, *callControlSubView; + UIView* controlSubView, *callControlSubView, *hangUpView; UIButton* endCtrl; UIButton* dialer; UIMuteButton* mute; - UIPauseResumeButton* pause; + UIButton* pause; UISpeakerButton* speaker; UIButton* contacts; UITableView* callTableView; @@ -58,6 +58,10 @@ bool dismissed; NSTimer *durationRefreasher; + NSTimer * glowingTimer; + + float glow; + NSIndexPath* activePath; ABPeoplePickerNavigationController* myPeoplePickerController; @@ -72,6 +76,8 @@ @property (nonatomic, retain) IBOutlet UIView* controlSubView; @property (nonatomic, retain) IBOutlet UIView* callControlSubView; @property (nonatomic, retain) IBOutlet UIView* padSubView; +@property (nonatomic, retain) IBOutlet UIView* hangUpView; + @property (nonatomic, retain) IBOutlet UIButton* endCtrl; @property (nonatomic, retain) IBOutlet UIButton* dialer; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 4b2163559..8a961044b 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -28,6 +28,7 @@ @synthesize controlSubView; @synthesize callControlSubView; @synthesize padSubView; +@synthesize hangUpView; @synthesize addToConf; @synthesize endCtrl; @@ -67,6 +68,8 @@ bool isInConference(LinphoneCall* call) { + if (!call) + return false; return linphone_call_get_current_params(call)->in_conference; } @@ -88,10 +91,7 @@ int callCount(LinphoneCore* lc) { [super viewDidLoad]; //Controls [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - UIImage* rc = [UIImage imageNamed:@"resumecall.png"]; - UIImage* pc = [UIImage imageNamed:@"pausecall.png"]; - [pause initWithOnImage:rc offImage:pc ]; - [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; + [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; //Dialer init @@ -112,6 +112,8 @@ int callCount(LinphoneCore* lc) { [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; [endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; [addToConf addTarget:self action:@selector(addToConfCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [pause addTarget:self action:@selector(pauseCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [mergeCalls setHidden:YES]; @@ -134,6 +136,14 @@ int callCount(LinphoneCore* lc) { linphone_core_add_to_conference([LinphoneManager getLc], selectedCall); } +-(void) pauseCallPressed { + if (!selectedCall) + return; + if (linphone_call_get_state(selectedCall) == LinphoneCallPaused) + linphone_core_resume_call([LinphoneManager getLc], selectedCall); + else + linphone_core_pause_call([LinphoneManager getLc], selectedCall); +} -(void)updateCallsDurations { @@ -150,6 +160,13 @@ int callCount(LinphoneCore* lc) { selector:@selector(updateCallsDurations) userInfo:nil repeats:YES]; + glowingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 + target:self + selector:@selector(updateGlow) + userInfo:nil + repeats:YES]; + glow = 0; + } } @@ -157,6 +174,8 @@ int callCount(LinphoneCore* lc) { if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; + [glowingTimer invalidate]; + glowingTimer = nil; } } @@ -165,11 +184,15 @@ int callCount(LinphoneCore* lc) { } + + -(void) displayStatus:(NSString*) message; { [self updateUIFromLinphoneState: nil]; } -(void) displayPad:(bool) enable { + [callTableView setHidden:enable]; + [hangUpView setHidden:enable]; [controlSubView setHidden:enable]; [padSubView setHidden:!enable]; } @@ -178,6 +201,8 @@ int callCount(LinphoneCore* lc) { [self displayPad:false]; dismissed = false; + if (call) + selectedCall = call; [self updateUIFromLinphoneState: nil]; } @@ -198,7 +223,10 @@ int callCount(LinphoneCore* lc) { } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; - [pause reset]; + + // if ( + // [pause reset]; + LinphoneCore* lc; @@ -225,8 +253,28 @@ int callCount(LinphoneCore* lc) { [addToConf setHidden:(linphone_core_get_conference_size(lc) == 0 || isInConference(selectedCall))]; } - // hide pause/resume if in conference - [pause setHidden:linphone_core_is_in_conference(lc)]; + int callsCount = linphone_core_get_calls_nb(lc); + // hide pause/resume if in conference + if (selectedCall) { + if (linphone_core_is_in_conference(lc)) + [pause setHidden:YES]; + else if (linphone_call_get_state(selectedCall)==LinphoneCallPaused) { + [pause setHidden:NO]; + //[pause setTitle:@"Resume" forState:UIControlStateNormal]; + pause.selected = YES; + pause.highlighted = NO; + } else if (callCount(lc) == callsCount && callsCount == 1) { + [pause setHidden:NO]; + //[pause setTitle:@"Pause" forState:UIControlStateNormal]; + pause.selected = NO; + pause.highlighted = NO; + } else { + [pause setHidden:YES]; + } + } else { + [pause setHidden:callsCount > 0]; + } + [mergeCalls setHidden:!pause.hidden]; } - (IBAction)doAction:(id)sender { @@ -295,7 +343,42 @@ int callCount(LinphoneCore* lc) { } } +-(void) updateActive:(bool_t)active cell:(UITableViewCell*) cell { + if (!active) { + + cell.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.2]; + + UIColor* c = [[UIColor blackColor] colorWithAlphaComponent:0.5]; + [cell.textLabel setTextColor:c]; + [cell.detailTextLabel setTextColor:c]; + } else { + cell.backgroundColor = [UIColor colorWithRed:0.4 green:0.4 blue:0.4 alpha:(0.7+sin(2*glow)*0.3)]; + [cell.textLabel setTextColor:[UIColor whiteColor]]; + [cell.detailTextLabel setTextColor:[UIColor whiteColor]]; + } + [cell.textLabel setBackgroundColor:[UIColor clearColor]]; + [cell.detailTextLabel setBackgroundColor:[UIColor clearColor]]; + [cell.accessoryView setHidden:YES]; + //[cell.backgroundView setBackgroundColor:cell.backgroundColor]; +} +-(void) updateGlow { + glow += 0.1; + + NSIndexPath* path = [callTableView indexPathForSelectedRow]; + if (path) { + UITableViewCell* cell = [callTableView cellForRowAtIndexPath:path]; + [self updateActive:YES cell:cell]; + [cell.backgroundView setNeedsDisplay]; + [cell setNeedsDisplay]; + [callTableView setNeedsDisplay]; + } +} + +-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { + [self updateActive:(cell.accessoryType == UITableViewCellAccessoryCheckmark) cell:cell]; + //cell.accessoryType = UITableViewCellAccessoryNone; +} - (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ if (call == NULL) { @@ -328,30 +411,39 @@ int callCount(LinphoneCore* lc) { } [cell.detailTextLabel setText:ms]; - + /* if (linphone_core_get_current_call([LinphoneManager getLc]) == call) { - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; } else if (confActive && isInConference(call)) { - cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.5]; + cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1]; } else{ - cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; - } + cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:1]; + }*/ + + + if (call == selectedCall) { - // [cell setSelected:YES animated:NO]; + [cell setSelected:YES animated:NO]; + [callTableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone]; cell.accessoryType = UITableViewCellAccessoryCheckmark; }else{ - //[cell setSelected:NO animated:NO]; + [cell setSelected:NO animated:NO]; + [callTableView deselectRowAtIndexPath:path animated:NO]; cell.accessoryType = UITableViewCellAccessoryNone; } } + -(void) updateConferenceCell:(UITableViewCell*) cell at:(NSIndexPath*)indexPath { [cell.textLabel setText:@"Conference"]; LinphoneCore* lc = [LinphoneManager getLc]; cell.accessoryType = UITableViewCellAccessoryNone; + [self updateActive:NO cell:cell]; + cell.selected = NO; + [callTableView deselectRowAtIndexPath:indexPath animated:NO]; NSMutableString* ms = [[NSMutableString alloc] init ]; const MSList* calls = linphone_core_get_calls(lc); @@ -366,18 +458,23 @@ int callCount(LinphoneCore* lc) { else [ms appendFormat:@"%s ", linphone_address_get_username(addr), nil]; - - if (call == selectedCall) - cell.accessoryType = UITableViewCellAccessoryCheckmark; + //if (call == selectedCall) + // [self updateActive:YES cell:cell]; + if (call == selectedCall) { + [callTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; + cell.selected = YES; + cell.accessoryType = UITableViewCellAccessoryCheckmark; + + } } calls = calls->next; } [cell.detailTextLabel setText:ms]; - if (linphone_core_is_in_conference(lc)) - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; + /*if (linphone_core_is_in_conference(lc)) + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; else - cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]; + cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];*/ } @@ -398,7 +495,7 @@ int callCount(LinphoneCore* lc) { cell.userInteractionEnabled = YES; cell.selectionStyle = UITableViewCellSelectionStyleNone; - cell.selectionStyle = UITableViewCellSelectionStyleBlue; + //cell.selectionStyle = UITableViewCellSelectionStyleBlue; @@ -445,6 +542,7 @@ int callCount(LinphoneCore* lc) { // UITableViewDataSource - (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return nil; return @"Calls"; if (section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0) return @"Conference"; diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index ee5b5db69..a77415f09 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -45,130 +45,58 @@ 274 - {320, 182} + {320, 276} _NS:418 - + 3 - MQA + MC42NjY2NjY2NjY3AA YES IBCocoaTouchFramework YES NO - 1 0 - YES YES 44 22 22 - + 292 YES - - + + 292 - {{119, -4}, {82, 52}} - + {{36, 8}, {248, 52}} + - + + + 1 + MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA + NO NO IBCocoaTouchFramework 0 0 - 1 - Pau. Res. - + + 3 + MQA + 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA 3 MC41AA - - NSImage - mic_active.png - - - NSImage - pausecall.png - - - NSImage - mic_muted.png - - - - 2 - 10 - - - Helvetica-Bold - 10 - 16 - - - - - 292 - {{26, -4}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Add to conf - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - - - 2 - 14 - - - Helvetica-Bold - 14 - 16 - - - - - 292 - {{27, 56}, {262, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - NSImage stopcall-red.png @@ -186,331 +114,15 @@ - {{0, 312}, {320, 148}} + {{0, 392}, {320, 68}} - + _NS:196 - + 3 - MC42NjY2NjY2NjY3AA + MC4zMzMzMzMzMzMzAA - NO - NO - IBCocoaTouchFramework - - - - -2147483356 - - YES - - - 292 - {{95, 244}, {82, 37}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - hide - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 2 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 3 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 4 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 5 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 6 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 7 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 8 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 9 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - * - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - # - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - {{24, 72}, {272, 317}} - - - - - NO - NO IBCocoaTouchFramework @@ -521,31 +133,32 @@ 292 - {{119, 55}, {82, 52}} + {{119, 58}, {82, 52}} - + + NO NO IBCocoaTouchFramework 0 0 - 1 - Merge 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - + + NSImage + conf_merge.png + + + 2 17 - + Helvetica-Bold 17 16 @@ -554,27 +167,26 @@ 292 - {{25, 0}, {82, 52}} + {{36, 5}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 - Mute 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - + + NSImage + mic_active.png + 2 2 @@ -588,53 +200,52 @@ 292 - {{25, 54}, {82, 52}} + {{36, 58}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 - Add call 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - NSImage - startcall-green.png + addcall-green.png - - 292 - {{206, 54}, {82, 52}} + {{202, 58}, {82, 52}} - + + NO NO IBCocoaTouchFramework 0 0 - 1 Cont 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + + 1 + MCAwIDAAA + NSImage contact-orange.png @@ -645,17 +256,16 @@ 292 - {{116, 0}, {82, 52}} + {{119, 5}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 - DTMF 1 @@ -664,7 +274,7 @@ NSImage - dialer-orange.png + numpad.png @@ -672,16 +282,16 @@ 292 - {{206, 0}, {82, 52}} + {{202, 5}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 Spk @@ -689,19 +299,358 @@ MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - NSImage - Speaker-32-off.png - + + + 292 + {{119, 58}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + NSImage + resumecall.png + + + NSImage + pausecall.png + + + + - {{0, 191}, {320, 113}} + {{0, 276}, {320, 115}} - + + NO + NO + IBCocoaTouchFramework + + + + -2147483356 + + YES + + + 292 + {{95, 219}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + Close + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 166}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 7}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 7}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 2 + + + + + + + + + 292 + {{178, 7}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 3 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 60}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 4 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 60}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 5 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{178, 60}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 6 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 113}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 7 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 113}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 8 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{178, 113}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 9 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 166}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + * + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{178, 166}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + # + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + {{24, 115}, {272, 279}} + + + + NO NO IBCocoaTouchFramework @@ -746,126 +695,6 @@ 109 - - - eight - - - - 75 - - - - nine - - - - 58 - - - - seven - - - - 73 - - - - six - - - - 71 - - - - five - - - - 69 - - - - four - - - - 67 - - - - three - - - - 60 - - - - one - - - - 54 - - - - zero - - - - 55 - - - - two - - - - 59 - - - - hash - - - - 57 - - - - star - - - - 56 - - - - close - - - - 51 - - - - padSubView - - - - 45 - - - - callControlSubView - - - - 117 - endCtrl @@ -874,22 +703,6 @@ 99 - - - pause - - - - 115 - - - - mergeCalls - - - - 114 - addCall @@ -900,11 +713,19 @@ - contacts + controlSubView - + - 84 + 44 + + + + mergeCalls + + + + 114 @@ -922,6 +743,14 @@ 49 + + + pause + + + + 115 + mute @@ -932,19 +761,131 @@ - controlSubView + contacts - + - 44 + 84 - addToConf + star - + - 119 + 56 + + + + two + + + + 59 + + + + one + + + + 54 + + + + four + + + + 67 + + + + hash + + + + 57 + + + + nine + + + + 58 + + + + padSubView + + + + 45 + + + + zero + + + + 55 + + + + seven + + + + 73 + + + + three + + + + 60 + + + + close + + + + 51 + + + + eight + + + + 75 + + + + six + + + + 71 + + + + five + + + + 69 + + + + hangUpView + + + + 122 @@ -1026,10 +967,10 @@ YES - + + - @@ -1039,167 +980,41 @@ - 27 - - - YES - - - - - - - - - - - - - - - - pad - - - 33 - - - 8 - - - 32 - - - 9 - - - 34 - - - 7 - - - 37 - - - 6 - - - 36 - - - 5 - - - 35 - - - 4 - - - 38 - - - 3 - - - 30 - - - 1 - - - 41 - - - 0 - - - 39 - - - 2 - - - 40 - - - hash - - - 31 - - - star - - - 29 - - - close - - - 116 - + 120 + YES - - - callcontrols 18 - + end - - 113 - - - pauseresume - - - 118 - - - addtoconf - 26 YES - - + + + controls - 104 - + 113 + - merge - - - 111 - - - addcall - - - 15 - - - contacts + pauseresume 13 @@ -1213,12 +1028,130 @@ dialer + + 15 + + + contacts + + + 111 + + + addcall + 16 mute + + 104 + + + merge + + + 27 + + + YES + + + + + + + + + + + + + + + + pad + + + 31 + + + star + + + 30 + + + 1 + + + 33 + + + 8 + + + 40 + + + hash + + + 36 + + + 5 + + + 29 + + + close + + + 39 + + + 2 + + + 41 + + + 0 + + + 38 + + + 3 + + + 35 + + + 4 + + + 37 + + + 6 + + + 34 + + + 7 + + + 32 + + + 9 + @@ -1230,17 +1163,19 @@ -2.CustomClassName -2.IBPluginDependency 104.IBPluginDependency + 104.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 106.IBPluginDependency 111.IBPluginDependency - 113.CustomClassName + 111.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 113.IBPluginDependency - 116.IBPluginDependency - 118.IBPluginDependency + 113.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 120.IBPluginDependency 13.CustomClassName 13.IBPluginDependency 15.IBPluginDependency 16.CustomClassName 16.IBPluginDependency + 16.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 17.IBPluginDependency 18.IBPluginDependency 2.IBPluginDependency @@ -1280,17 +1215,19 @@ UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIPauseResumeButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1336,7 +1273,7 @@ - 119 + 122 @@ -1371,6 +1308,7 @@ endCtrl five four + hangUpView hash mergeCalls mute @@ -1400,6 +1338,7 @@ UIButton UIButton UIButton + UIView UIButton UIButton UIButton @@ -1432,6 +1371,7 @@ endCtrl five four + hangUpView hash mergeCalls mute @@ -1497,6 +1437,10 @@ four UIButton + + hangUpView + UIView + hash UIButton @@ -1576,14 +1520,6 @@ ./Classes/UIMuteButton.h - - UIPauseResumeButton - UIToggleButton - - IBProjectSource - ./Classes/UIPauseResumeButton.h - - UISpeakerButton UIToggleButton @@ -1608,10 +1544,6 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 @@ -1622,24 +1554,24 @@ YES YES - Speaker-32-off.png + addcall-green.png + conf_merge.png contact-orange.png - dialer-orange.png mic_active.png - mic_muted.png + numpad.png pausecall.png - startcall-green.png + resumecall.png stopcall-red.png YES - {32, 32} + {82, 71} + {82, 75} {25, 23} - {25, 24} - {20, 20} - {20, 20} - {25, 23} - {60, 52} + {82, 82} + {82, 82} + {82, 75} + {82, 75} {62, 54} diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 736d06e16..b73da3f43 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -143,9 +143,13 @@ [super dealloc]; } - - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { - linphone_core_accept_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + LinphoneCall* call = (LinphoneCall*)[notification.userInfo objectForKey:@"call"]; + if (!call) { + ms_warning("Local notification received with nil call"); + return; + } + linphone_core_accept_call([LinphoneManager getLc], call); } diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m index 5961a46c1..04c0b3721 100644 --- a/Classes/LinphoneUI/UIToggleButton.m +++ b/Classes/LinphoneUI/UIToggleButton.m @@ -47,9 +47,9 @@ } -(void) initWithOnImage:(UIImage*) onImage offImage:(UIImage*) offImage { - mOnImage = [onImage retain]; - mOffImage = [offImage retain]; - mIsOn=false; + mOnImage = [onImage retain]; + mOffImage = [offImage retain]; + mIsOn=false; [self reset]; [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 0e09d9a7c..243e5558d 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -247,6 +247,7 @@ notif.alertBody =[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username]; notif.alertAction = @"Answer"; notif.soundName = @"oldphone-mono-30s.caf"; + notif.userInfo = [NSDictionary dictionaryWithObject:call forKey:"call"]; [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; } diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 26cbcfb90..1eb8dfbfc 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -65,18 +65,12 @@ IBCocoaTouchFramework NO - - - Dialer - - NSImage - dialer-orange.png - + + IBCocoaTouchFramework + 5 - PhoneViewController - 1 1 @@ -105,13 +99,18 @@ IBCocoaTouchFramework NO - - - + + + Dialer + + NSImage + dialer-orange.png + IBCocoaTouchFramework - 5 + PhoneViewController + 1 1 @@ -119,6 +118,7 @@ IBCocoaTouchFramework NO + diff --git a/Resources/Speaker-32-off.png b/Resources/Speaker-32-off.png index e93ae232f1f89192f3c27bd09a17e456f51ffb88..3a5b3fd73575527eecd542cbe844da391e6aeb55 100644 GIT binary patch literal 1798 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 Hf;BcaL-hkZ diff --git a/Resources/addcall-green.png b/Resources/addcall-green.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccfe2ba13da0e449690778c3417448c25b2e391 GIT binary patch literal 6261 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 literal 0 HcmV?d00001 diff --git a/Resources/conf_merge.png b/Resources/conf_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..409609c06eab47c987136f6ed249071b4be49d9e GIT binary patch literal 3135 zcmZ`*dpHw}_g}3ynaJysm|Mvute9Jd<`y!Fxf_LzUS?>>bqWou$f~I&^R6tnjV7BW zK*R3G3i?g5KF@6P( zi5pfC3j(2Xh;UdK*(n@Hh(&QFgvu&i$B!{6M27u$u_h@|EG|37$tOAyPCX>MFtO8v z^h`IVsYT+#5Cgy7JOm$o?5}SDy-V@|kz6aUmdf5dzGuea*Cxz0Ua7zNyi4i?aCEP#KXR7N$+xUJ|yA5i7;bTTqaMs7G38HKc?}`MVq` z*R*}hmOHNd͙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 P8UW|co_DOV56SvJ45Rv) literal 0 HcmV?d00001 diff --git a/Resources/contact_orange.png b/Resources/contact_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..cbdf86df8f5dae072cb35dcc42274832b9d1d2d4 GIT binary patch literal 4771 zcmZ`-XEYm(*N<35jn;@QR;e9|TCqoLwfEke8byimXiALmD6L&oZK>KTG&Du2(%Pf; z9`(5T?)Pd0ECDE09y_K zfNTx`01C)!Gm^h6kT~gRssV2QlcLV@%)1O(fR<(OUF(Vej6j7yHyi+XkONawHVL2J z%^R#^g_-ro@QH7SEKGErPL8pMHM=vr(R=}tk)f63dERK<X9Bjtkw8~Mb#SkI_w?lDxS+&xln~c;VAZFs-@AKw2Q_V@w^>Xmro+`R z_CPMK6k-1i27^Yp?IObg;GE&WcQOC+mTi&7qpro3Adg@KP7ObU#}M9h-rNE=xU-J_ z5lX0Ol30*R&kP;^3wR!@u=r8`uM+jf_{mghU-9rv#o*q=SsM=l+jgm}@5@MfC9AoE zYQJ;Hf$1XWfm>&{as22UV2BJc*EYoFV5nHG<0PNc$81tJ=1t8biLlMUbtykw=OCOX z@yoPWeC?=D^*S_A_0Xw1O6GuOQ4u0uV3XbyvUw^Q8@f_+H*2_H~DbgpSjjEO~947eGeYc zsub+s{mf&l0z(ULi+6j_u}}#BUq#Aa2%ejVwDZ+-U72~#gnLOjzI_KB5txL(S##a9$AW`v2?|xa|P5(727dcDV^^EX>L_(*N1S`W(3k;~FZe-RCqvLjkti4}oPAllH z=ZLyO4vtQ;=dt>i^~{W;XbFS0w%9{0cz^3SRnzMxQxsjsb>*!ZSF2e5yZguE^B6~J zsOIu}b2?XVF=l_>f+oEx1&CB8ork#Cp#F)M^HSISm5f?l7@8a{5aDXX9)WDOvOIl1 zgIL-!p#4|F29F6rpPP*rK(w?)(PYoIq4*VePs z=u|oZ(C3;8i-q!woM;<1+-t9^9~Ml_W@P$aRY_kpnfW($%c8t=A_+wwKow;X-$W`8 z$dag%-!~kQ`E8C#p0HXkQ+SQS4#<~PCqa_g8yM%Dkk+0DO|e2K5-m-Pv~piiU1?8_ z(Cc8@A}fk|CpGr?cG6b&AmVTFgZ6?N`f8C0UxCN0Eo#^*65d+JDFMTYi}cNTZ67MN zk@${Wmd?;3+WKnWx+rj%;7>I!KW>S_!CHBRptg!9+9<%f1PgRe)d$@{rGzMon*Qs|F__{*mBOSjB zU2P?ed&$SNzh#Q8tmcIp6Rs0eNw-G=j51`qnx*%ieb=&{%55Eu?)M=Rc->35{Lzaw z1cJOgu10X=Qw_Si9^crx%ViQbQMbYJ7i%&=N)4Pk{7e<>s&aY{mn)f$JS0a~QangOR)?4>lY#s*(Y zj5HwHFmzw)aeN>6PGDf zOQ_5%cBAJV57n6%88o`NQn^buqB)9U6`JxL;p_fCC(N1l)&;s9 z@q=Jd-FX$iHzcQZ)LSBmrmdBSWjg9eW>c)uH;RZKy!vm!GHId5<;gSaJI^ z#Wx9&uAr;t3(TI!c?X>+ya8-W;wgQUlk3#~!9l;@m4_8UMDE~&SFtl2)pT85FWUx= zj*QZr;aA7fLeBQ`Cung7UkbW%*Gx>hO&b%{_Omx;%Nlg^npaw1JUL?29c5ld>N)L0 zh$Dmy6ObrZ=C_p@L39dT$Bg#j<2prk7{=1Wfci$6jJst_{Jq7B3OYD+f`y1cX6hzj zQSmgRO5r}e2#Lnby*IR!jyl*0!@?`N} z+M1b>h)$1Uz73KWa{O*hr<-H6ABMvwnG?3}VPTGa0%MLV>? z+n!Jv&$a^y62t7<)=!B z@Fe96o!q-I2Uc`n2V)-oc~lHxcx6G{%z;=pnAU2BOY25B1jJ1eHf9T-kONqb`1SbB z)hSB08K}5wB0tWNeg4bz!jUN^{MLNA{q}@3fX?v%x^Pjl(8BESX2KV;b9TG)3)p&i zy0D)#w@ig^$8eW6D~F-lUf1Z29j&!TS6$Afej|Hm84<={vnzCIWDtGJb3Qn*Gsg89 zA9lM2>gz0=@{(w#cJc2{G5?BTL1-39qx93mGPqkXI9_S@2SY7HZfjgxD|`8G{_e7+ zQL}LX4OZpZqqZjs_VS`lI-Y?~(qj5dQTZG(b~JzXX2hZ&g4aTj=#){I>}ZfKL7KuM zOGpI8CiEw#XV=*;$5$HeQTpSS3?WB|?*pGv9E;JQ3&4eh(-pF3QY;b2`cX^}4oQe} z;4QX2l#AKAnja}yxNfy#Ub{Tbgi!_?&+n$)-srfjEGiZSKm15yd!SlRi?#g$@qAAM=#iu-mZVguey7_eo5neEFsT}i?C5odA?0x01oy=>aF<2KLj`dP ze3MM1e1u&`w8MYM#$;gj|DvR)KV2ie>f@InKNU(fi|R5T<;;_uqC!#o+-zV)rTH(v zv{U9W1oroHg*Ari-h4Zl)aXk4%6g_S%fV%vZZ>2GhY~`SE}?i18v3W#MA7){%Z@W@ z)QAku<1)LuOQ7kYi?8aZ2!3$78JP=?@EKJB_o|ix7P`TJmsV1YJ1!||PTvEwEp~kw z?|bd2&o|u&meQ-WdPbn5N>kYb+OymK^RSO#Zyi_o=LU+u<>}x5^XnD%JkG+_FiTb5 z?6E05^kuTPxSxKNZ~+vy7dK+(Cc&*K+IMp|)okKq-zNMF6RPwImnue;9;z(Y!T~P? zzpP+0AN5l5l|<3ql@FvOfynp?QfgJn*;PCev$I4j^KGI+?& z>CgQ!Km(_nvkD_R#^xX_#xn4XGkLVd4IFc6zBsr4=mClYPW4dioset)JyYuR5uB-o38Lie8hIYAUK z0(s1N!1Pn6G`KYQ(j9cAZhDxT#;hL6)dsWF;e?D(!JSu{(^FA};JK>4Q??aqT8Ghq z=2D=OK;g0dob_92em!u%ktrEONI&3xPymK1MI}BNc)fZ(t=>uV}Kl^S(4bBP;z+_}F$$=33>dvSo2e24<@3mN~I zQ=HBBc51I^hU>22J+PDg%P`=x8w!NJ6>KXkb9?DkOU7+8qlpJ=wLR(a`?5|F#0TZt z5AJ^A&)X|-RXx{M(a{uVbEV$S7-xNC^I>>mR37)W&!^8`ockFJY0ch7wR5k$tDR`& za^ol`lH4*G>m05$9Gf0tSn@7I&blwJ;8o_4ymFYAL)t>&seiej(e(aK-XuxtfZ5mX zEY;BLXGK(3peJ-GZA{k%PsV=*>zx&p37s5x2)eY3kMST-%Yjn77vwC^uP*1_>XCEF z9yx8F$cI8MFElEh;)BMXypD<$`f}9tVqR**%0WZFTJa>H>^=ITX72NYHf7b0%_&MB z8`p5NE-m3~%k?DT*p~W^k^8Q(lUotL=CYe3_c-|qhjnc7V1HZ98Ei`ASn~H1Z&MPz z)Vor)TQ`9KTjB?9U)^wV9ls7M+d);sUGn}FZZ7d23*$YVsFrF&mMV-T=~DmArYv8~ zO)EuVR8BO~g`qT^*vZ54ZJ6rlUaLEsHAzqjyXF_Gw--r1l@b$H6W&TTt5qUQ^&x_s zW(Y{IZbHQ8MQuc{6R!GxjbTD4;)S)0T@B6dx0Je3(fNRzMVmJj3x_-M-3& zUdj?3#`QtLD2fTnNz=iF`!*z$09Wy-pH8Z#FEs5;=2bFhLVe)HdIP(*2W;Gj7zRfq z%%FU|OVgH_#;++8%wV-zsU9p?hn3O*S*;JpO5V}SM_E65qq+2x?EyK15()(k@XX*4 zaEz>Bxhzsq!LH>4neqMc`a)J(uk>D|DUq1_r77Zq^IfCEZ{%ksdMj*tNxEu2p8w^> zvyY{ro4*B1PHZd_S*hk_f#moa%{$g3@lnkvdTEC-q6&2{Ic|t znQ}GZpWwEGM>FFz#7^$n@559^Wr_yE4ysk5Z?3&Je{agY0@0t5ph7nX-Uv_5Mnm4 z-$hDxv)|WviU!>jznk$~V_=jlN`A36ASr;q(D=UnxMsM)q%84rZe?B?_-Wo!$ud!; zAoV+LL_TVtYkIyx0BLX1G!rJLojmU&`)6su&D>vB!BY?~StGIFu`yZut$A%JlmRnL zAX^@xB?vqk8z`_b+p#q{2Y)hdku^GfhWjZ{(W)&h^C6h>-SC=4>;`?=e1ISCQ}5xa zq^PFKS9}+?%xBvhE literal 0 HcmV?d00001 diff --git a/Resources/mic_active.png b/Resources/mic_active.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b7c6a1b7fbd3f0bdf98a3d709ff48f903aae3b GIT binary patch literal 6770 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 literal 0 HcmV?d00001 diff --git a/Resources/mic_muted.png b/Resources/mic_muted.png new file mode 100644 index 0000000000000000000000000000000000000000..6110a04fc5304e9fb7f61b474bad85fe234972f6 GIT binary patch literal 10007 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 F{{W0a!`uJ> literal 0 HcmV?d00001 diff --git a/Resources/numpad.png b/Resources/numpad.png new file mode 100644 index 0000000000000000000000000000000000000000..966b483486404145b65ed9d20477938e7171d5e1 GIT binary patch literal 5314 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 literal 0 HcmV?d00001 diff --git a/Resources/pausecall.png b/Resources/pausecall.png new file mode 100644 index 0000000000000000000000000000000000000000..ffac25a4725feaa852d873fc05e31ab91901a1bd GIT binary patch literal 1622 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 Date: Thu, 10 Nov 2011 09:26:40 +0100 Subject: [PATCH 066/122] Update ZRTP dependency. --- README | 4 ++++ submodules/externals/zrtpcpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README b/README index a1c5851a9..1429a88d4 100644 --- a/README +++ b/README @@ -32,3 +32,7 @@ As Skype requires that you accept its license, the plugin is not compiled and en - you compile the UI with HAVE_SILK preprocessor macro (xcode). - you compile add libmssilk.so to the list a library (xcode). +ZRTP +liblinphone-sdk depends on the GNU LIBZRTPCPP extension for ZRTP support. +As the license of this library is GPLv3+ it is not enabled unless the enable_zrtp=yes option is passed to the make command. +Note that activiting ZRTP makes the license of the whole application GPLv3+. diff --git a/submodules/externals/zrtpcpp b/submodules/externals/zrtpcpp index 3cbbcf29f..93dbdb315 160000 --- a/submodules/externals/zrtpcpp +++ b/submodules/externals/zrtpcpp @@ -1 +1 @@ -Subproject commit 3cbbcf29f707adaaa00958c6e2c321e79a7b8e83 +Subproject commit 93dbdb3159f55bb35f69c13df1f60ac4901c88fb From 51915a4bac77b7f827c8bdeb7bfdae677b845250 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 14 Nov 2011 15:44:10 +0100 Subject: [PATCH 067/122] fix srtp build --- .gitmodules | 3 +++ submodules/build/builder-iphone-os.mk | 2 -- submodules/build/builders.d/srtp.mk | 27 ++++++++------------------- submodules/externals/srtp | 1 + 4 files changed, 12 insertions(+), 21 deletions(-) create mode 160000 submodules/externals/srtp diff --git a/.gitmodules b/.gitmodules index f064d4d5a..1e5c26cd3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,3 +31,6 @@ [submodule "submodules/mssilk"] path = submodules/mssilk url = git://git.linphone.org/mssilk.git +[submodule "submodules/externals/srtp"] + path = submodules/externals/srtp + url = git://git.linphone.org/srtp.git diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 0f120e320..c95fec29d 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -65,8 +65,6 @@ speex_dir?=externals/speex gsm_dir?=externals/gsm -srtp_dir?=externals/srtp - zrtpcpp_dir?=externals/zrtpcpp MSILBC_SRC_DIR:=$(BUILDER_SRC_DIR)/msilbc diff --git a/submodules/build/builders.d/srtp.mk b/submodules/build/builders.d/srtp.mk index 85e338231..e8b955078 100644 --- a/submodules/build/builders.d/srtp.mk +++ b/submodules/build/builders.d/srtp.mk @@ -1,17 +1,8 @@ -srtp_version?=1.4.4 -#srtp_url?=http://srtp.sourceforge.net/srtp-$(srtp_version).tgz -srtp_url=http://sourceforge.net/projects/srtp/files/srtp/$(srtp_version)/srtp-$(srtp_version).tgz/download -srtp_tgz_file=srtp-$(srtp_version).tgz - -$(BUILDER_SRC_DIR)/externals/$(srtp_tgz_file): - cd $(BUILDER_SRC_DIR)/externals \ - && wget $(srtp_url) -O $(srtp_tgz_file) - -$(BUILDER_SRC_DIR)/$(srtp_dir)/configure: $(BUILDER_SRC_DIR)/externals/$(srtp_tgz_file) - cd $(BUILDER_SRC_DIR)/externals \ - && tar zxvf $(srtp_tgz_file) \ - && cd srtp && patch -p0 < $(BUILDER_SRC_DIR)/build/builders.d/srtp.patch +srtp_dir?=externals/srtp +$(BUILDER_SRC_DIR)/$(srtp_dir)/configure: + cd $(BUILDER_SRC_DIR)/$(srtp_dir) \ + && autoconf $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile: $(BUILDER_SRC_DIR)/$(srtp_dir)/configure mkdir -p $(BUILDER_BUILD_DIR)/$(srtp_dir) cd $(BUILDER_BUILD_DIR)/$(srtp_dir)/\ @@ -19,17 +10,15 @@ $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile: $(BUILDER_SRC_DIR)/$(srtp_dir)/config $(BUILDER_SRC_DIR)/$(srtp_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} build-srtp: $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile - cp -rf $(BUILDER_SRC_DIR)/$(srtp_dir)/include $(BUILDER_BUILD_DIR)/$(srtp_dir) - cp -rf $(BUILDER_SRC_DIR)/$(srtp_dir)/crypto/include $(BUILDER_BUILD_DIR)/$(srtp_dir) - -cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make uninstall && make clean - cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make libsrtp.a && make install + cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make libsrtp.a && make uninstall install clean-srtp: - cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make clean + -cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make clean veryclean-srtp: -cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make distclean + -rm -f $(BUILDER_SRC_DIR)/$(srtp_dir)/configure clean-makefile-srtp: - cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && rm -f Makefile + -cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && rm -f Makefile diff --git a/submodules/externals/srtp b/submodules/externals/srtp new file mode 160000 index 000000000..9d08cb329 --- /dev/null +++ b/submodules/externals/srtp @@ -0,0 +1 @@ +Subproject commit 9d08cb3299af0be8893d898a4cf3358ad26874b7 From 68d395ad8f18122ed6a53f84d64c04c681884f3c Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 14 Nov 2011 15:45:25 +0100 Subject: [PATCH 068/122] Revert "fix for sRTP not installed in multi-arch liblinphone-sdk, due to unidentified archives." This reverts commit b9db786072d1d4c9d328c9d1dfd68c99df81d61a. --- submodules/build/builder-iphone-os.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index c95fec29d..810ff22b1 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -291,7 +291,7 @@ multi-arch: if test -f "$$i386_path"; then \ echo "Mixing $$archive and $$i386_path into $$destpath"; \ mkdir -p `dirname $$destpath` ; \ - lipo -create -arch armv6 $$archive -arch armv7 $$armv7_path -arch i386 $$i386_path -output $$destpath; \ + lipo -create $$archive $$armv7_path $$i386_path -output $$destpath; \ else \ echo "WARNING: archive `basename $$archive` exists in arm tree but does not exists in i386 tree."; \ fi \ From 162aae03914e72980696034343cb581215d44531 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 14 Nov 2011 16:11:32 +0100 Subject: [PATCH 069/122] fix incomming call in bg mode --- Classes/LinphoneAppDelegate.m | 3 ++- Classes/PhoneViewController.m | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index b73da3f43..f4a172a23 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -144,7 +144,8 @@ } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { - LinphoneCall* call = (LinphoneCall*)[notification.userInfo objectForKey:@"call"]; + LinphoneCall* call; + [(NSData*)([notification.userInfo objectForKey:@"call"]) getBytes:&call]; if (!call) { ms_warning("Local notification received with nil call"); return; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 243e5558d..214f9be66 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -247,7 +247,8 @@ notif.alertBody =[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username]; notif.alertAction = @"Answer"; notif.soundName = @"oldphone-mono-30s.caf"; - notif.userInfo = [NSDictionary dictionaryWithObject:call forKey:"call"]; + NSData *callData = [NSData dataWithBytes:&call length:sizeof(call)]; + notif.userInfo = [NSDictionary dictionaryWithObject:callData forKey:@"call"]; [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; } From 9f976eb7bbd1395a9f0334337ce31a164474512b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 14 Nov 2011 16:51:03 +0100 Subject: [PATCH 070/122] fix srtp install --- submodules/build/builders.d/srtp.mk | 1 + submodules/build/builders.d/srtp.patch | 24 ------------------------ submodules/externals/srtp | 2 +- 3 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 submodules/build/builders.d/srtp.patch diff --git a/submodules/build/builders.d/srtp.mk b/submodules/build/builders.d/srtp.mk index e8b955078..2e2c9b1d6 100644 --- a/submodules/build/builders.d/srtp.mk +++ b/submodules/build/builders.d/srtp.mk @@ -17,6 +17,7 @@ clean-srtp: veryclean-srtp: -cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make distclean + -rm -rf $(BUILDER_BUILD_DIR)/$(srtp_dir) -rm -f $(BUILDER_SRC_DIR)/$(srtp_dir)/configure clean-makefile-srtp: diff --git a/submodules/build/builders.d/srtp.patch b/submodules/build/builders.d/srtp.patch deleted file mode 100644 index c3d127b13..000000000 --- a/submodules/build/builders.d/srtp.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -rupN ../srtp_old/crypto/cipher/aes_icm.c ./crypto/cipher/aes_icm.c ---- ../srtp_old/crypto/cipher/aes_icm.c 2006-03-16 18:11:29.000000000 +0100 -+++ ./crypto/cipher/aes_icm.c 2011-09-06 10:19:16.000000000 +0200 -@@ -281,7 +281,7 @@ aes_icm_set_iv(aes_icm_ctx_t *c, void *i - * this is an internal, hopefully inlined function - */ - --inline void -+static void - aes_icm_advance_ismacryp(aes_icm_ctx_t *c, uint8_t forIsmacryp) { - /* fill buffer with new keystream */ - v128_copy(&c->keystream_buffer, &c->counter); -diff -rupN ../srtp_old/crypto/math/datatypes.c ./crypto/math/datatypes.c ---- ../srtp_old/crypto/math/datatypes.c 2005-10-08 18:38:06.000000000 +0200 -+++ ./crypto/math/datatypes.c 2011-09-06 10:02:55.000000000 +0200 -@@ -124,7 +124,7 @@ octet_string_hex_string(const void *s, i - return bit_string; - } - --inline int -+static int - hex_char_to_nibble(uint8_t c) { - switch(c) { - case ('0'): return 0x0; diff --git a/submodules/externals/srtp b/submodules/externals/srtp index 9d08cb329..f21cc2418 160000 --- a/submodules/externals/srtp +++ b/submodules/externals/srtp @@ -1 +1 @@ -Subproject commit 9d08cb3299af0be8893d898a4cf3358ad26874b7 +Subproject commit f21cc24184a285d0b7fec42dba7851a66f7a94ae From cf9f5629861f88de0ca318a6f2f973239c52f3c2 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Mon, 14 Nov 2011 22:37:04 +0100 Subject: [PATCH 071/122] Fix srtp install/uninstall with parallel build. --- submodules/build/builders.d/srtp.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/build/builders.d/srtp.mk b/submodules/build/builders.d/srtp.mk index 2e2c9b1d6..97534a732 100644 --- a/submodules/build/builders.d/srtp.mk +++ b/submodules/build/builders.d/srtp.mk @@ -10,7 +10,7 @@ $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile: $(BUILDER_SRC_DIR)/$(srtp_dir)/config $(BUILDER_SRC_DIR)/$(srtp_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} build-srtp: $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile - cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make libsrtp.a && make uninstall install + cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make libsrtp.a && make uninstall && make install clean-srtp: -cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make clean From c61c15a6f81758f8a9498e1c211189a727339b91 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Mon, 14 Nov 2011 22:38:36 +0100 Subject: [PATCH 072/122] Fix srtp compilation blocking issues. --- submodules/externals/srtp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/externals/srtp b/submodules/externals/srtp index f21cc2418..94599d9fd 160000 --- a/submodules/externals/srtp +++ b/submodules/externals/srtp @@ -1 +1 @@ -Subproject commit f21cc24184a285d0b7fec42dba7851a66f7a94ae +Subproject commit 94599d9fd7ab75b8a9854d3e7c25dab742319e50 From 6a5cd0815aba205879fa97e07a3dc76e3dfab8e8 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Mon, 14 Nov 2011 22:39:30 +0100 Subject: [PATCH 073/122] Improve ZRTP documentation. --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index 1429a88d4..2cbc697cd 100644 --- a/README +++ b/README @@ -35,4 +35,5 @@ As Skype requires that you accept its license, the plugin is not compiled and en ZRTP liblinphone-sdk depends on the GNU LIBZRTPCPP extension for ZRTP support. As the license of this library is GPLv3+ it is not enabled unless the enable_zrtp=yes option is passed to the make command. +Add liblinphone-sdk/lib/libzrtpcpp.a to XCode. Define sip property media_encryption to "zrtp" in linphonerc. Note that activiting ZRTP makes the license of the whole application GPLv3+. From 33ddf4e90f078206d518a513925e3f453bfb3e81 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 15 Nov 2011 10:53:41 +0100 Subject: [PATCH 074/122] don't let srtp redefine PACKAGE_NAME... --- submodules/externals/srtp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/externals/srtp b/submodules/externals/srtp index 94599d9fd..daa25fdba 160000 --- a/submodules/externals/srtp +++ b/submodules/externals/srtp @@ -1 +1 @@ -Subproject commit 94599d9fd7ab75b8a9854d3e7c25dab742319e50 +Subproject commit daa25fdbacb75e2aa99f5fce1bd5836dc616fb42 From 8a1c3000cdb618fb875515bfce1dfa65b400bd5b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 18 Nov 2011 14:23:41 +0100 Subject: [PATCH 075/122] merge vios IOS with master --- .gitmodules | 2 +- Classes/LinphoneUI/LinphoneManager.h | 1 - Classes/LinphoneUI/LinphoneManager.m | 50 +- Classes/PhoneViewController.m | 4 +- README | 43 +- Settings.bundle/Root.plist | 2 +- linphone copy-Info.plist | 44 ++ linphone.xcodeproj/project.pbxproj | 540 +++++++++++++++--- submodules/build/Makefile | 32 +- submodules/build/builder-iphone-os.mk | 50 +- submodules/build/builders.d/mssilk.mk | 1 + submodules/build/builders.d/openssl.mk | 8 +- submodules/build/builders.d/zrtp.mk | 20 +- .../build/builders.d/zrtpcpp.CMakeLists.txt | 169 ------ submodules/build/iphone-config.site | 1 + submodules/build/iphone-toolchain.cmake.i386 | 13 - submodules/externals/zrtpcpp | 2 +- .../liblinphone.xcodeproj/project.pbxproj | 33 +- submodules/linphone | 2 +- 19 files changed, 643 insertions(+), 374 deletions(-) create mode 100644 linphone copy-Info.plist delete mode 100755 submodules/build/builders.d/zrtpcpp.CMakeLists.txt delete mode 100644 submodules/build/iphone-toolchain.cmake.i386 diff --git a/.gitmodules b/.gitmodules index 099648fff..c331201f9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -39,7 +39,7 @@ url = http://git.chromium.org/webm/libvpx.git [submodule "submodules/externals/zrtpcpp"] path = submodules/externals/zrtpcpp - url = git://github.com/wernerd/ZRTPCPP.git + url = git://git.linphone.org/zrtpcpp.git [submodule "submodules/mssilk"] path = submodules/mssilk url = git://git.linphone.org/mssilk.git diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index be7984827..e3bc4ab95 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -33,7 +33,6 @@ typedef enum _Connectivity { @private SCNetworkReachabilityContext proxyReachabilityContext; SCNetworkReachabilityRef proxyReachability; - CFReadStreamRef mReadStream; NSTimer* mIterateTimer; id mLogView; bool isbackgroundModeEnabled; diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 941b2d8bc..fe1609750 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -547,7 +547,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } [self configurePayloadType:"MP4V-ES" fromPrefKey:@"mp4v-es_preference" withRate:90000]; [self configurePayloadType:"H264" fromPrefKey:@"h264_preference" withRate:90000]; - [self configurePayloadType:"VP8-DRAFT-0-3-2" fromPrefKey:@"vp8_preference" withRate:90000]; + [self configurePayloadType:"VP8" fromPrefKey:@"vp8_preference" withRate:90000]; bool enableVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_video_preference"]; linphone_core_enable_video(theLinphoneCore, enableVideo, enableVideo); @@ -564,7 +564,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } else { isbackgroundModeEnabled=false; } - + } - (BOOL)isNotIphone3G { @@ -645,42 +645,11 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach ms_error("cannot get current transport"); } - if (mReadStream == nil && transportValue.udp_port>0) { //only for udp - int sipsock = linphone_core_get_sip_socket(theLinphoneCore); - //disable keepalive handler - linphone_core_enable_keep_alive(theLinphoneCore, false); - const char *port; - addr=linphone_address_new(linphone_proxy_config_get_addr(proxyCfg)); - memset(&hints,0,sizeof(hints)); - hints.ai_family=linphone_core_ipv6_enabled(theLinphoneCore) ? AF_INET6 : AF_INET; - port=linphone_address_get_port(addr); - if (port==NULL) port="5060"; - err=getaddrinfo(linphone_address_get_domain(addr),port,&hints,&res); - if (err!=0){ - ms_error("getaddrinfo() failed for %s: %s",linphone_address_get_domain(addr),gai_strerror(err)); - linphone_address_destroy(addr); - return; - } - err=connect(sipsock,res->ai_addr,res->ai_addrlen); - if (err==-1){ - ms_error("Connect failed: %s",strerror(errno)); - } - freeaddrinfo(res); - - CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)sipsock, &mReadStream,nil); - - if (!CFReadStreamSetProperty(mReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP)) { - ms_error("cannot set service type to voip for read stream"); - } - - - if (!CFReadStreamOpen(mReadStream)) { - ms_error("cannot open read stream"); - } - } } else { ms_warning("Entering lite bg mode"); + AVAudioSession *audioSession = [AVAudioSession sharedInstance]; + [audioSession setDelegate:nil]; [self destroyLibLinphone]; } @@ -821,17 +790,6 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach //enable sip keepalive linphone_core_enable_keep_alive(theLinphoneCore, true); } - if (mReadStream !=nil) { - //unconnect - int socket = linphone_core_get_sip_socket(theLinphoneCore); - struct sockaddr hints; - memset(&hints,0,sizeof(hints)); - hints.sa_family=AF_UNSPEC; - connect(socket,&hints,sizeof(hints)); - CFReadStreamClose(mReadStream); - CFRelease(mReadStream); - mReadStream=nil; - } } -(void) registerLogView:(id) view { mLogView = view; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index c55ab2b9e..3edfb93af 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -265,9 +265,9 @@ -(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - + if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] - && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { + && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) { // Create a new notification UILocalNotification* notif = [[[UILocalNotification alloc] init] autorelease]; if (notif) diff --git a/README b/README index dcbce0eab..8e33ced92 100644 --- a/README +++ b/README @@ -22,28 +22,35 @@ $ sudo mv gas-preprocessor.pl /opt/local/bin/. Link macport libtoolize to glibtoolize (sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize) Link host's strings to simulator SDK (ln -s /usr/bin/strings /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/strings) -You may update variable SDK_VERSION from file submodules/build/iphone-config.site according to your iPhone SDK version. Current is 4.0 - -To generate the liblinphone dual arch sdk, once the above commands have been executed: +******************************************* +*******GPL versus non GPL****************** +******************************************* +This sdk can be generated in 2 flavors. Firt is GPL, it means liblinphone include GPL third parties like FFMPEG or x264. +If you choose this flavor, your final application must comply with GPL. This is the default mode. + +To generate the liblinphone multi arch sdkin GPL mode, once the above commands have been executed: cd submodules/build make all -In case you upgrade your IOS SDK, you may force configure by using make targets and +ALTERNATIVELY, you can force liblinphone to use only non GPL code except for liblinphone, mediastremer2, ortp, exosip, osip. +If you choose this flavor, your final application is still subject to GPL except if you have an alternative license for liblinphone, mediastremer2, ortp, exosip, osip. + +To generate the liblinphone multi arch sdkin non GPL mode, once the above commands have been executed: + cd submodules/build + make all enable_gpl=no + +****************************************** +****Third party, subject to lincense*i**** +****************************************** +The liblinphone-sdk is compiled with third parties code that are subject to license, specially: AMR, SILK and X264. +Linphone activates/de-activates these codecs thanks to the preprocessor macros HAVE_SILK, HAVE_AMR, HAVE_X264 positioned in xcode. +Before embeding these 3 codecs in the final application, make sure to have the right to do so. +****************************************** + + +In case you upgrade your IOS SDK, you may force configure by using make targets Libraries are available from liblinphone-sdk/ -AMR plugin -liblinphone-sdk contains Linphone ARM plugin. As AMR may require to pay for patents, it is not enabled unless Linphone for iphone is compiled with gcc flag HAVE_AMR. +liblinphone xcode subproject: This subproject is just for debuggingi purpose, do not compile it until you know exactly what you are doing. -SILK plugin -liblinphone-sdk contains Linphone SILK plugin. -As Skype requires that you accept its license, the plugin is not compiled and enabled unless: -- you compile the SDK with enable_silk=yes flag (make); -- you compile the UI with HAVE_SILK preprocessor macro (xcode). -- you compile add libmssilk.so to the list a library (xcode). - -ZRTP -liblinphone-sdk depends on the GNU LIBZRTPCPP extension for ZRTP support. -As the license of this library is GPLv3+ it is not enabled unless the enable_zrtp=yes option is passed to the make command. -Add liblinphone-sdk/lib/libzrtpcpp.a to XCode. Define sip property media_encryption to "zrtp" in linphonerc. -Note that activiting ZRTP makes the license of the whole application GPLv3+. diff --git a/Settings.bundle/Root.plist b/Settings.bundle/Root.plist index eae40ec55..5bc0378b6 100644 --- a/Settings.bundle/Root.plist +++ b/Settings.bundle/Root.plist @@ -192,7 +192,7 @@ DefaultValue - + Key backgroundmode_preference Title diff --git a/linphone copy-Info.plist b/linphone copy-Info.plist new file mode 100644 index 000000000..dccfa7f39 --- /dev/null +++ b/linphone copy-Info.plist @@ -0,0 +1,44 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + Linphone + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + icone-linphone-57.png + CFBundleIdentifier + org.linphone.phone + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 3.4.9 + CFBundleSignature + ???? + CFBundleVersion + 1.0.7.3 + NSMainNibFile + PhoneMainView + UIApplicationExitsOnSuspend + + UIBackgroundModes + + voip + audio + + UIRequiredDeviceCapabilities + + wifi + microphone + + UIRequiresPersistentWiFi + + + diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index f28107691..93147ee6e 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -19,6 +19,9 @@ 220FAD3810765B400068D98F /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2F10765B400068D98F /* libspeex.a */; }; 220FAD3910765B400068D98F /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD3010765B400068D98F /* libspeexdsp.a */; }; 220FAE4B10767A6A0068D98F /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 220FAE4A10767A6A0068D98F /* PhoneMainView.xib */; }; + 2211DB90147555C800DEE054 /* libmediastreamer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB8F147555C800DEE054 /* libmediastreamer.a */; }; + 2211DB921475562600DEE054 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB911475562600DEE054 /* liblinphone.a */; }; + 2211DB95147564B400DEE054 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2211DB94147564B400DEE054 /* Settings.bundle */; }; 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2214783B1386A2030020F8B8 /* Localizable.strings */; }; 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB7912F846B1002A5394 /* UICallButton.m */; }; 2214EB8912F84EBB002A5394 /* UIHangUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB8812F84EBB002A5394 /* UIHangUpButton.m */; }; @@ -83,6 +86,101 @@ 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */; }; 22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22C7555F1317E59C007BC101 /* UIBluetoothButton.m */; }; 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; + 22D8F11F147548E2008C97DB /* linphonerc in Resources */ = {isa = PBXBuildFile; fileRef = 2274550710700509006EC466 /* linphonerc */; }; + 22D8F120147548E2008C97DB /* PhoneViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22F2508D107141E100AC9B3F /* PhoneViewController.xib */; }; + 22D8F121147548E2008C97DB /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; + 22D8F122147548E2008C97DB /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 220FAE4A10767A6A0068D98F /* PhoneMainView.xib */; }; + 22D8F124147548E2008C97DB /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; + 22D8F125147548E2008C97DB /* oldphone-mono.wav in Resources */ = {isa = PBXBuildFile; fileRef = 2237D4081084D7A9001383EE /* oldphone-mono.wav */; }; + 22D8F126147548E2008C97DB /* CallHistoryTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 227BCDC110D4004600FBFD76 /* CallHistoryTableViewController.xib */; }; + 22D8F127147548E2008C97DB /* in_call.png in Resources */ = {isa = PBXBuildFile; fileRef = 2242D91410D66BF300E9963F /* in_call.png */; }; + 22D8F128147548E2008C97DB /* out_call.png in Resources */ = {isa = PBXBuildFile; fileRef = 2242D91510D66BF300E9963F /* out_call.png */; }; + 22D8F129147548E2008C97DB /* mic_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 2242D91810D66C2100E9963F /* mic_active.png */; }; + 22D8F12A147548E2008C97DB /* mic_muted.png in Resources */ = {isa = PBXBuildFile; fileRef = 2242D91910D66C2100E9963F /* mic_muted.png */; }; + 22D8F12B147548E2008C97DB /* Speaker-32-on.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A783111C1BA800B04932 /* Speaker-32-on.png */; }; + 22D8F12C147548E2008C97DB /* Speaker-32-off.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A784111C1BA800B04932 /* Speaker-32-off.png */; }; + 22D8F12D147548E2008C97DB /* ConsoleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A81E111C44E100B04932 /* ConsoleViewController.xib */; }; + 22D8F12E147548E2008C97DB /* icone-linphone-57.png in Resources */ = {isa = PBXBuildFile; fileRef = 22058C70116E305000B08DDD /* icone-linphone-57.png */; }; + 22D8F12F147548E2008C97DB /* startcall-green.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C11118197C0000CA27B /* startcall-green.png */; }; + 22D8F130147548E2008C97DB /* stopcall-red.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C13118197EC000CA27B /* stopcall-red.png */; }; + 22D8F131147548E2008C97DB /* contact-orange.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C161181986A000CA27B /* contact-orange.png */; }; + 22D8F132147548E2008C97DB /* dialer-orange.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C171181986A000CA27B /* dialer-orange.png */; }; + 22D8F133147548E2008C97DB /* history-orange.png in Resources */ = {isa = PBXBuildFile; fileRef = 22226C1C11819B34000CA27B /* history-orange.png */; }; + 22D8F134147548E2008C97DB /* clavier-01-106px.png in Resources */ = {isa = PBXBuildFile; fileRef = 225CB2E811ABB51000628906 /* clavier-01-106px.png */; }; + 22D8F135147548E2008C97DB /* clavier-01-108px.png in Resources */ = {isa = PBXBuildFile; fileRef = 225CB2E911ABB51000628906 /* clavier-01-108px.png */; }; + 22D8F136147548E2008C97DB /* clavier-01-160px.png in Resources */ = {isa = PBXBuildFile; fileRef = 225CB2ED11ABB65D00628906 /* clavier-01-160px.png */; }; + 22D8F137147548E2008C97DB /* linphone-banner.png in Resources */ = {isa = PBXBuildFile; fileRef = 225CB2F911ABB76400628906 /* linphone-banner.png */; }; + 22D8F138147548E2008C97DB /* MoreViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A81B111C44E100B04932 /* MoreViewController.xib */; }; + 22D8F139147548E2008C97DB /* oldphone-mono-30s.caf in Resources */ = {isa = PBXBuildFile; fileRef = 2242E312125235120061DDCE /* oldphone-mono-30s.caf */; }; + 22D8F13A147548E2008C97DB /* IncallViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 222A483112F7176F0075F07F /* IncallViewController.xib */; }; + 22D8F13B147548E2008C97DB /* FirstLoginViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2218A92412FBE1340088A667 /* FirstLoginViewController.xib */; }; + 22D8F13C147548E2008C97DB /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 228B19AE130290C500F154D3 /* iTunesArtwork */; }; + 22D8F13D147548E2008C97DB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2214783B1386A2030020F8B8 /* Localizable.strings */; }; + 22D8F13E147548E2008C97DB /* missed_call.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E19E47138A67A000FBFE87 /* missed_call.png */; }; + 22D8F13F147548E2008C97DB /* VideoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E028B613B4CCBD0068A713 /* VideoViewController.xib */; }; + 22D8F140147548E2008C97DB /* audio.plist in Resources */ = {isa = PBXBuildFile; fileRef = 226B563E13CAF1CD00921595 /* audio.plist */; }; + 22D8F141147548E2008C97DB /* video.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22E1A9E713CAF4AA00219531 /* video.plist */; }; + 22D8F142147548E2008C97DB /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; + 22D8F144147548E2008C97DB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; + 22D8F145147548E2008C97DB /* LinphoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */; }; + 22D8F146147548E2008C97DB /* PhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* PhoneViewController.m */; }; + 22D8F147147548E2008C97DB /* ContactPickerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22B5EFE410CE5E5800777D97 /* ContactPickerDelegate.m */; }; + 22D8F148147548E2008C97DB /* CallHistoryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 227BCDC010D4004600FBFD76 /* CallHistoryTableViewController.m */; }; + 22D8F149147548E2008C97DB /* GenericTabViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2242D9C810D691F900E9963F /* GenericTabViewController.m */; }; + 22D8F14A147548E2008C97DB /* MoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81C111C44E100B04932 /* MoreViewController.m */; }; + 22D8F14B147548E2008C97DB /* ConsoleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81F111C44E100B04932 /* ConsoleViewController.m */; }; + 22D8F14C147548E2008C97DB /* UIDigitButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */; }; + 22D8F14D147548E2008C97DB /* LinphoneManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E99E12F801C200220D9C /* LinphoneManager.m */; }; + 22D8F14E147548E2008C97DB /* UICallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB7912F846B1002A5394 /* UICallButton.m */; }; + 22D8F14F147548E2008C97DB /* UIHangUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB8812F84EBB002A5394 /* UIHangUpButton.m */; }; + 22D8F150147548E2008C97DB /* UIToggleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EBD912F8558F002A5394 /* UIToggleButton.m */; }; + 22D8F151147548E2008C97DB /* UIMuteButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EBF212F86360002A5394 /* UIMuteButton.m */; }; + 22D8F152147548E2008C97DB /* UISpeakerButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22968A5E12F875C600588287 /* UISpeakerButton.m */; }; + 22D8F153147548E2008C97DB /* UIDuration.m in Sources */ = {isa = PBXBuildFile; fileRef = 22968A8712F87C2000588287 /* UIDuration.m */; }; + 22D8F154147548E2008C97DB /* FirstLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2218A92312FBE1340088A667 /* FirstLoginViewController.m */; }; + 22D8F155147548E2008C97DB /* UIBluetoothButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22C7555F1317E59C007BC101 /* UIBluetoothButton.m */; }; + 22D8F156147548E2008C97DB /* UIEraseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */; }; + 22D8F157147548E2008C97DB /* FastAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = 223963161393CFAF001DE689 /* FastAddressBook.m */; }; + 22D8F158147548E2008C97DB /* VideoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E028B513B4CCBD0068A713 /* VideoViewController.m */; }; + 22D8F159147548E2008C97DB /* UICamSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 22AA8B0013D83F6300B30535 /* UICamSwitch.m */; }; + 22D8F15B147548E2008C97DB /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; + 22D8F15C147548E2008C97DB /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; + 22D8F15D147548E2008C97DB /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; + 22D8F15E147548E2008C97DB /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; }; + 22D8F15F147548E2008C97DB /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; }; + 22D8F160147548E2008C97DB /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8013C73D3100210156 /* libavcodec.a */; }; + 22D8F161147548E2008C97DB /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8113C73D3100210156 /* libavutil.a */; }; + 22D8F162147548E2008C97DB /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8213C73D3100210156 /* libswscale.a */; }; + 22D8F163147548E2008C97DB /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22E5B0AD133B5EA20044EA25 /* libssl.a */; }; + 22D8F164147548E2008C97DB /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22E5B0AE133B5EA20044EA25 /* libcrypto.a */; }; + 22D8F165147548E2008C97DB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; + 22D8F166147548E2008C97DB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 22D8F167147548E2008C97DB /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 22D8F168147548E2008C97DB /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22744019106F31BD006EC466 /* CoreAudio.framework */; }; + 22D8F169147548E2008C97DB /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2274402E106F335E006EC466 /* AudioToolbox.framework */; }; + 22D8F16A147548E2008C97DB /* libeXosip2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2810765B400068D98F /* libeXosip2.a */; }; + 22D8F16B147548E2008C97DB /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2910765B400068D98F /* libgsm.a */; }; + 22D8F16C147548E2008C97DB /* libosip2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2D10765B400068D98F /* libosip2.a */; }; + 22D8F16D147548E2008C97DB /* libosipparser2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2E10765B400068D98F /* libosipparser2.a */; }; + 22D8F16E147548E2008C97DB /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2F10765B400068D98F /* libspeex.a */; }; + 22D8F16F147548E2008C97DB /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD3010765B400068D98F /* libspeexdsp.a */; }; + 22D8F170147548E2008C97DB /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; }; + 22D8F171147548E2008C97DB /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */; }; + 22D8F172147548E2008C97DB /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5F03410CE6B2F00777D97 /* AddressBook.framework */; }; + 22D8F173147548E2008C97DB /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2264B6D111200342002C2C53 /* SystemConfiguration.framework */; }; + 22D8F174147548E2008C97DB /* libilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E31178A08200637D6A /* libilbc.a */; }; + 22D8F175147548E2008C97DB /* libmsilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E51178A09900637D6A /* libmsilbc.a */; }; + 22D8F176147548E2008C97DB /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 228697C311AC29B800E9E0CA /* CFNetwork.framework */; }; + 22D8F177147548E2008C97DB /* libortp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2C10765B400068D98F /* libortp.a */; }; + 22D8F178147548E2008C97DB /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; + 22D8F179147548E2008C97DB /* libopencore-amrwb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */; }; + 22D8F17A147548E2008C97DB /* libopencore-amrnb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */; }; + 22D8F17B147548E2008C97DB /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; }; + 22D8F17C147548E2008C97DB /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; }; + 22D8F17D147548E2008C97DB /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFC13D7125500B30535 /* libmsx264.a */; }; + 22D8F17E147548E2008C97DB /* libSKP_SILK_SDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AA1472527D0037138E /* libSKP_SILK_SDK.a */; }; + 22D8F17F147548E2008C97DB /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AB1472527D0037138E /* libsrtp.a */; }; + 22D8F180147548E2008C97DB /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AF147259670037138E /* libmssilk.a */; }; 22E028B713B4CCBD0068A713 /* VideoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E028B513B4CCBD0068A713 /* VideoViewController.m */; }; 22E028B813B4CCBD0068A713 /* VideoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E028B613B4CCBD0068A713 /* VideoViewController.xib */; }; 22E0A785111C1BA800B04932 /* Speaker-32-on.png in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A783111C1BA800B04932 /* Speaker-32-on.png */; }; @@ -105,23 +203,6 @@ 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - F4D9F24C145748E80035B0D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = liblinphone; - }; - F4D9F24E145748E80035B0D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 22DD19BE13A8D7FA0018ECD4; - remoteInfo = mediastream; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ 2247673A129C3B9C002B94B4 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -132,6 +213,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 22D8F181147548E2008C97DB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 11; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -256,6 +346,9 @@ 220FAD2F10765B400068D98F /* libspeex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspeex.a; path = "liblinphone-sdk/apple-darwin/lib/libspeex.a"; sourceTree = ""; }; 220FAD3010765B400068D98F /* libspeexdsp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspeexdsp.a; path = "liblinphone-sdk/apple-darwin/lib/libspeexdsp.a"; sourceTree = ""; }; 220FAE4A10767A6A0068D98F /* PhoneMainView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneMainView.xib; sourceTree = ""; }; + 2211DB8F147555C800DEE054 /* libmediastreamer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmediastreamer.a; path = "liblinphone-sdk/apple-darwin/lib/libmediastreamer.a"; sourceTree = ""; }; + 2211DB911475562600DEE054 /* liblinphone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblinphone.a; path = "liblinphone-sdk/apple-darwin/lib/liblinphone.a"; sourceTree = ""; }; + 2211DB94147564B400DEE054 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = nogpl/Settings.bundle; sourceTree = ""; }; 2214783C1386A2030020F8B8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; 2214EB7812F846B1002A5394 /* UICallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICallButton.h; sourceTree = ""; }; 2214EB7912F846B1002A5394 /* UICallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICallButton.m; sourceTree = ""; }; @@ -413,6 +506,8 @@ 22C7564A13265C6A007BC101 /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = ""; }; 22C7564B13265C6A007BC101 /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = ""; }; 22D1B68012A3E0BE001AE361 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; + 22D8F187147548E2008C97DB /* linphone-nogpl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "linphone-nogpl.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 22D8F189147548E3008C97DB /* linphone copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "linphone copy-Info.plist"; path = "/Users/jehanmonnier/workspaces/workspace-iphone-port/linphone-iphone/linphone copy-Info.plist"; sourceTree = ""; }; 22E028B413B4CCBD0068A713 /* VideoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoViewController.h; sourceTree = ""; }; 22E028B513B4CCBD0068A713 /* VideoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoViewController.m; sourceTree = ""; }; 22E028B613B4CCBD0068A713 /* VideoViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoViewController.xib; sourceTree = ""; }; @@ -432,7 +527,6 @@ 22F2508C107141E100AC9B3F /* PhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhoneViewController.m; sourceTree = ""; }; 22F2508D107141E100AC9B3F /* PhoneViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneViewController.xib; sourceTree = ""; }; 22F254801073D99800AC9B3F /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringback.wav; path = "liblinphone-sdk/apple-darwin/share/sounds/linphone/ringback.wav"; sourceTree = ""; }; - 22F3D57D13CCC89600A0DA02 /* liblinphone.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = liblinphone.a; sourceTree = BUILT_PRODUCTS_DIR; }; 22F51EF5107FA66500F98953 /* untitled.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = untitled.plist; sourceTree = ""; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -442,7 +536,6 @@ 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 8D1107310486CEB800E47090 /* linphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "linphone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = liblinphone.xcodeproj; path = submodules/liblinphone.xcodeproj; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -450,6 +543,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 2211DB921475562600DEE054 /* liblinphone.a in Frameworks */, + 2211DB90147555C800DEE054 /* libmediastreamer.a in Frameworks */, 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */, 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */, 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, @@ -491,6 +586,51 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 22D8F15A147548E2008C97DB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 22D8F15B147548E2008C97DB /* libvpx.a in Frameworks */, + 22D8F15C147548E2008C97DB /* QuartzCore.framework in Frameworks */, + 22D8F15D147548E2008C97DB /* OpenGLES.framework in Frameworks */, + 22D8F15E147548E2008C97DB /* CoreMedia.framework in Frameworks */, + 22D8F15F147548E2008C97DB /* CoreVideo.framework in Frameworks */, + 22D8F160147548E2008C97DB /* libavcodec.a in Frameworks */, + 22D8F161147548E2008C97DB /* libavutil.a in Frameworks */, + 22D8F162147548E2008C97DB /* libswscale.a in Frameworks */, + 22D8F163147548E2008C97DB /* libssl.a in Frameworks */, + 22D8F164147548E2008C97DB /* libcrypto.a in Frameworks */, + 22D8F165147548E2008C97DB /* Foundation.framework in Frameworks */, + 22D8F166147548E2008C97DB /* UIKit.framework in Frameworks */, + 22D8F167147548E2008C97DB /* CoreGraphics.framework in Frameworks */, + 22D8F168147548E2008C97DB /* CoreAudio.framework in Frameworks */, + 22D8F169147548E2008C97DB /* AudioToolbox.framework in Frameworks */, + 22D8F16A147548E2008C97DB /* libeXosip2.a in Frameworks */, + 22D8F16B147548E2008C97DB /* libgsm.a in Frameworks */, + 22D8F16C147548E2008C97DB /* libosip2.a in Frameworks */, + 22D8F16D147548E2008C97DB /* libosipparser2.a in Frameworks */, + 22D8F16E147548E2008C97DB /* libspeex.a in Frameworks */, + 22D8F16F147548E2008C97DB /* libspeexdsp.a in Frameworks */, + 22D8F170147548E2008C97DB /* AVFoundation.framework in Frameworks */, + 22D8F171147548E2008C97DB /* AddressBookUI.framework in Frameworks */, + 22D8F172147548E2008C97DB /* AddressBook.framework in Frameworks */, + 22D8F173147548E2008C97DB /* SystemConfiguration.framework in Frameworks */, + 22D8F174147548E2008C97DB /* libilbc.a in Frameworks */, + 22D8F175147548E2008C97DB /* libmsilbc.a in Frameworks */, + 22D8F176147548E2008C97DB /* CFNetwork.framework in Frameworks */, + 22D8F177147548E2008C97DB /* libortp.a in Frameworks */, + 22D8F178147548E2008C97DB /* libresolv.dylib in Frameworks */, + 22D8F179147548E2008C97DB /* libopencore-amrwb.a in Frameworks */, + 22D8F17A147548E2008C97DB /* libopencore-amrnb.a in Frameworks */, + 22D8F17B147548E2008C97DB /* libmsamr.a in Frameworks */, + 22D8F17C147548E2008C97DB /* libx264.a in Frameworks */, + 22D8F17D147548E2008C97DB /* libmsx264.a in Frameworks */, + 22D8F17E147548E2008C97DB /* libSKP_SILK_SDK.a in Frameworks */, + 22D8F17F147548E2008C97DB /* libsrtp.a in Frameworks */, + 22D8F180147548E2008C97DB /* libmssilk.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -533,6 +673,7 @@ isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* linphone.app */, + 22D8F187147548E2008C97DB /* linphone-nogpl.app */, ); name = Products; sourceTree = ""; @@ -725,6 +866,14 @@ path = speex; sourceTree = ""; }; + 2211DB9614764F6B00DEE054 /* nogpl */ = { + isa = PBXGroup; + children = ( + 2211DB94147564B400DEE054 /* Settings.bundle */, + ); + name = nogpl; + sourceTree = ""; + }; 2214EB7012F84668002A5394 /* LinphoneUI */ = { isa = PBXGroup; children = ( @@ -840,16 +989,17 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 2211DB9614764F6B00DEE054 /* nogpl */, + 2211DB911475562600DEE054 /* liblinphone.a */, + 2211DB8F147555C800DEE054 /* libmediastreamer.a */, 226183AF147259670037138E /* libmssilk.a */, 226183AA1472527D0037138E /* libSKP_SILK_SDK.a */, 226183AB1472527D0037138E /* libsrtp.a */, - F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */, 7066FC0B13E830E400EFC6DC /* libvpx.a */, 70E542F413E147EB002BA2C0 /* QuartzCore.framework */, 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, 22AA8AFB13D7125500B30535 /* libx264.a */, 22AA8AFC13D7125500B30535 /* libmsx264.a */, - 22F3D57D13CCC89600A0DA02 /* liblinphone.a */, 22E1A9E713CAF4AA00219531 /* video.plist */, 226B563E13CAF1CD00921595 /* audio.plist */, 22276E8813C73DC000210156 /* CoreMedia.framework */, @@ -891,6 +1041,7 @@ 22D1B68012A3E0BE001AE361 /* libresolv.dylib */, 22E5B0AD133B5EA20044EA25 /* libssl.a */, 22E5B0AE133B5EA20044EA25 /* libcrypto.a */, + 22D8F189147548E3008C97DB /* linphone copy-Info.plist */, ); name = CustomTemplate; sourceTree = ""; @@ -946,15 +1097,6 @@ name = Frameworks; sourceTree = ""; }; - F4D9F244145748E80035B0D0 /* Products */ = { - isa = PBXGroup; - children = ( - F4D9F24D145748E80035B0D0 /* liblinphone.a */, - F4D9F24F145748E80035B0D0 /* mediastream.app */, - ); - name = Products; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -976,6 +1118,24 @@ productReference = 1D6058910D05DD3D006BFB54 /* linphone.app */; productType = "com.apple.product-type.application"; }; + 22D8F11D147548E2008C97DB /* linphone-nogpl */ = { + isa = PBXNativeTarget; + buildConfigurationList = 22D8F182147548E2008C97DB /* Build configuration list for PBXNativeTarget "linphone-nogpl" */; + buildPhases = ( + 22D8F11E147548E2008C97DB /* Resources */, + 22D8F143147548E2008C97DB /* Sources */, + 22D8F15A147548E2008C97DB /* Frameworks */, + 22D8F181147548E2008C97DB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "linphone-nogpl"; + productName = linphone; + productReference = 22D8F187147548E2008C97DB /* linphone-nogpl.app */; + productType = "com.apple.product-type.application"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -994,36 +1154,14 @@ ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = F4D9F244145748E80035B0D0 /* Products */; - ProjectRef = F4D9F243145748E80035B0D0 /* liblinphone.xcodeproj */; - }, - ); projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* linphone */, + 22D8F11D147548E2008C97DB /* linphone-nogpl */, ); }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - F4D9F24D145748E80035B0D0 /* liblinphone.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = liblinphone.a; - remoteRef = F4D9F24C145748E80035B0D0 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - F4D9F24F145748E80035B0D0 /* mediastream.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = mediastream.app; - remoteRef = F4D9F24E145748E80035B0D0 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ 1D60588D0D05DD3D006BFB54 /* Resources */ = { isa = PBXResourcesBuildPhase; @@ -1068,6 +1206,49 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 22D8F11E147548E2008C97DB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 22D8F11F147548E2008C97DB /* linphonerc in Resources */, + 22D8F120147548E2008C97DB /* PhoneViewController.xib in Resources */, + 22D8F121147548E2008C97DB /* ringback.wav in Resources */, + 22D8F122147548E2008C97DB /* PhoneMainView.xib in Resources */, + 22D8F124147548E2008C97DB /* untitled.plist in Resources */, + 22D8F125147548E2008C97DB /* oldphone-mono.wav in Resources */, + 22D8F126147548E2008C97DB /* CallHistoryTableViewController.xib in Resources */, + 22D8F127147548E2008C97DB /* in_call.png in Resources */, + 22D8F128147548E2008C97DB /* out_call.png in Resources */, + 22D8F129147548E2008C97DB /* mic_active.png in Resources */, + 22D8F12A147548E2008C97DB /* mic_muted.png in Resources */, + 22D8F12B147548E2008C97DB /* Speaker-32-on.png in Resources */, + 22D8F12C147548E2008C97DB /* Speaker-32-off.png in Resources */, + 22D8F12D147548E2008C97DB /* ConsoleViewController.xib in Resources */, + 22D8F12E147548E2008C97DB /* icone-linphone-57.png in Resources */, + 22D8F12F147548E2008C97DB /* startcall-green.png in Resources */, + 22D8F130147548E2008C97DB /* stopcall-red.png in Resources */, + 22D8F131147548E2008C97DB /* contact-orange.png in Resources */, + 22D8F132147548E2008C97DB /* dialer-orange.png in Resources */, + 22D8F133147548E2008C97DB /* history-orange.png in Resources */, + 22D8F134147548E2008C97DB /* clavier-01-106px.png in Resources */, + 22D8F135147548E2008C97DB /* clavier-01-108px.png in Resources */, + 22D8F136147548E2008C97DB /* clavier-01-160px.png in Resources */, + 22D8F137147548E2008C97DB /* linphone-banner.png in Resources */, + 22D8F138147548E2008C97DB /* MoreViewController.xib in Resources */, + 22D8F139147548E2008C97DB /* oldphone-mono-30s.caf in Resources */, + 22D8F13A147548E2008C97DB /* IncallViewController.xib in Resources */, + 22D8F13B147548E2008C97DB /* FirstLoginViewController.xib in Resources */, + 22D8F13C147548E2008C97DB /* iTunesArtwork in Resources */, + 22D8F13D147548E2008C97DB /* Localizable.strings in Resources */, + 22D8F13E147548E2008C97DB /* missed_call.png in Resources */, + 22D8F13F147548E2008C97DB /* VideoViewController.xib in Resources */, + 22D8F140147548E2008C97DB /* audio.plist in Resources */, + 22D8F141147548E2008C97DB /* video.plist in Resources */, + 22D8F142147548E2008C97DB /* rootca.pem in Resources */, + 2211DB95147564B400DEE054 /* Settings.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1100,6 +1281,35 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 22D8F143147548E2008C97DB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 22D8F144147548E2008C97DB /* main.m in Sources */, + 22D8F145147548E2008C97DB /* LinphoneAppDelegate.m in Sources */, + 22D8F146147548E2008C97DB /* PhoneViewController.m in Sources */, + 22D8F147147548E2008C97DB /* ContactPickerDelegate.m in Sources */, + 22D8F148147548E2008C97DB /* CallHistoryTableViewController.m in Sources */, + 22D8F149147548E2008C97DB /* GenericTabViewController.m in Sources */, + 22D8F14A147548E2008C97DB /* MoreViewController.m in Sources */, + 22D8F14B147548E2008C97DB /* ConsoleViewController.m in Sources */, + 22D8F14C147548E2008C97DB /* UIDigitButton.m in Sources */, + 22D8F14D147548E2008C97DB /* LinphoneManager.m in Sources */, + 22D8F14E147548E2008C97DB /* UICallButton.m in Sources */, + 22D8F14F147548E2008C97DB /* UIHangUpButton.m in Sources */, + 22D8F150147548E2008C97DB /* UIToggleButton.m in Sources */, + 22D8F151147548E2008C97DB /* UIMuteButton.m in Sources */, + 22D8F152147548E2008C97DB /* UISpeakerButton.m in Sources */, + 22D8F153147548E2008C97DB /* UIDuration.m in Sources */, + 22D8F154147548E2008C97DB /* FirstLoginViewController.m in Sources */, + 22D8F155147548E2008C97DB /* UIBluetoothButton.m in Sources */, + 22D8F156147548E2008C97DB /* UIEraseButton.m in Sources */, + 22D8F157147548E2008C97DB /* FastAddressBook.m in Sources */, + 22D8F158147548E2008C97DB /* VideoViewController.m in Sources */, + 22D8F159147548E2008C97DB /* UICamSwitch.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ @@ -1150,12 +1360,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); ORDER_FILE = ""; - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; @@ -1219,13 +1424,203 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); ORDER_FILE = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = linphone; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + TARGETED_DEVICE_FAMILY = 1; + }; + name = DistributionAdhoc; + }; + 22D8F183147548E2008C97DB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = linphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); + GCC_VERSION = com.apple.compilers.llvmgcc42; + HEADER_SEARCH_PATHS = ( + submodules/linphone/coreapi, + submodules/linphone/mediastreamer2/include, + submodules/linphone/mediastreamer2/include, + submodules/linphone/oRTP/include, + submodules/externals/gsm/, + submodules/externals/osip/include, + submodules/externals/exosip/include, + submodules/externals/speex/include, + ); + INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 3.1; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", + ); + ORDER_FILE = ""; OTHER_LDFLAGS = ( "-l", linphone, "-l", mediastreamer, ); - PRODUCT_NAME = linphone; + PRODUCT_NAME = "linphone-nogpl"; + PROVISIONING_PROFILE = ""; + SDKROOT = iphoneos; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 22D8F184147548E2008C97DB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = linphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); + GCC_VERSION = com.apple.compilers.llvmgcc42; + HEADER_SEARCH_PATHS = ( + submodules/linphone/coreapi, + submodules/linphone/mediastreamer2/include, + submodules/linphone/mediastreamer2/include, + submodules/linphone/oRTP/include, + submodules/externals/gsm/, + submodules/externals/osip/include, + submodules/externals/exosip/include, + submodules/externals/speex/include, + ); + INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 3.1; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", + ); + ORDER_FILE = ""; + OTHER_LDFLAGS = ( + "-l", + linphone, + "-l", + mediastreamer, + ); + PRODUCT_NAME = "linphone-nogpl"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 22D8F185147548E2008C97DB /* Distribution */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_ENTITLEMENTS = untitled.plist; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = linphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); + GCC_VERSION = com.apple.compilers.llvmgcc42; + HEADER_SEARCH_PATHS = ( + submodules/linphone/coreapi, + submodules/linphone/mediastreamer2/include, + submodules/linphone/mediastreamer2/include, + submodules/linphone/oRTP/include, + submodules/externals/gsm/, + submodules/externals/osip/include, + submodules/externals/exosip/include, + submodules/externals/speex/include, + ); + INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 3.1; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", + ); + ORDER_FILE = ""; + OTHER_LDFLAGS = ( + "-l", + linphone, + "-l", + mediastreamer, + ); + PRODUCT_NAME = "linphone-nogpl"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SDKROOT = iphoneos; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Distribution; + }; + 22D8F186147548E2008C97DB /* DistributionAdhoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_ENTITLEMENTS = untitled.plist; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = linphone_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + IN_LINPHONE, + VIDEO_ENABLED, + ); + GCC_VERSION = com.apple.compilers.llvmgcc42; + HEADER_SEARCH_PATHS = ( + submodules/linphone/coreapi, + submodules/linphone/mediastreamer2/include, + submodules/linphone/mediastreamer2/include, + submodules/linphone/oRTP/include, + submodules/externals/gsm/, + submodules/externals/osip/include, + submodules/externals/exosip/include, + submodules/externals/speex/include, + ); + INFOPLIST_FILE = "linphone-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 3.1; + LIBRARY_SEARCH_PATHS = ( + "$(BUILT_PRODUCTS_DIR)", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins\"", + "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", + ); + ORDER_FILE = ""; + OTHER_LDFLAGS = ( + "-l", + linphone, + "-l", + mediastreamer, + ); + PRODUCT_NAME = "linphone-nogpl"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1287,12 +1682,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); ORDER_FILE = ""; - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1356,12 +1746,7 @@ "\"$(SRCROOT)/liblinphone-sdk/apple-darwin/lib\"", ); ORDER_FILE = ""; - OTHER_LDFLAGS = ( - "-l", - linphone, - "-l", - mediastreamer, - ); + OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1401,6 +1786,17 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 22D8F182147548E2008C97DB /* Build configuration list for PBXNativeTarget "linphone-nogpl" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 22D8F183147548E2008C97DB /* Debug */, + 22D8F184147548E2008C97DB /* Release */, + 22D8F185147548E2008C97DB /* Distribution */, + 22D8F186147548E2008C97DB /* DistributionAdhoc */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "linphone" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/submodules/build/Makefile b/submodules/build/Makefile index 53658e4e4..4e2d6de4c 100644 --- a/submodules/build/Makefile +++ b/submodules/build/Makefile @@ -19,11 +19,33 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################ -all: - make -f builder-iphone-os.mk all \ - && make -f builder-iphone-simulator.mk all \ - && make -f builder-iphone-os.mk host=armv7-apple-darwin all \ - && make -f builder-iphone-os.mk delivery-sdk +enable_gpl=yes + +.NOTPARALLEL all: build warning +ifeq ($(enable_gpl),yes) +warning: + @echo + @echo "*****************************************************************" + @echo "*****************************************************************" + @echo "*****CAUTION, this liblinphone SDK is built using GPL code ******" + @echo "*****To disable gpl code, use make enable_gpl=no *************" + @echo "*****************************************************************" + @echo "*****************************************************************" +else +warning: + @echo + @echo "*****************************************************************" + @echo "*****************************************************************" + @echo "*****linphone SDK without GPL code ******" + @echo "*****************************************************************" + @echo "*****************************************************************" +endif + +build: + make -f builder-iphone-os.mk all enable_gpl=$(enable_gpl) \ + && make -f builder-iphone-simulator.mk all enable_gpl=$(enable_gpl)\ + && make -f builder-iphone-os.mk host=armv7-apple-darwin all enable_gpl=$(enable_gpl)\ + && make -f builder-iphone-os.mk delivery-sdk clean: make -f builder-iphone-simulator.mk clean \ && make -f builder-iphone-os.mk clean \ diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index d9fae0fde..03ad7a851 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -21,8 +21,6 @@ ############################################################################ host?=armv6-apple-darwin -enable_zrtp?=no -enable_silk?=no config_site:=iphone-config.site library_mode:= --disable-shared --enable-static linphone_configure_controls= \ @@ -38,21 +36,11 @@ linphone_configure_controls= \ --disable-x11 \ --with-gsm=$(prefix) \ --disable-tests \ - LIBZRTPCPP_CFLAGS="-I$(prefix)/include" \ - LIBZRTPCPP_LIBS="-L$(prefix)/lib -lzrtpcpp -lcrypto" \ - SRTP_LIBS="-L$(prefix)/lib -lsrtp -lcrypto" \ - SRTP_CFLAGS="-I$(prefix)/include" \ - --enable-vp8 \ + --with-srtp=$(prefix) \ SPEEX_CFLAGS="-I$(prefix)/include" \ SPEEXDSP_CFLAGS="-I$(prefix)/include" \ SPEEXDSP_LIBS="-L$(prefix)/lib -lspeexdsp" \ - SPEEX_LIBS="-L$(prefix)/lib -lspeexdsp -lspeex " \ - OPENSSL_CFLAGS="-I$(prefix)/include" \ - OPENSSL_LIBS="-L$(prefix)/lib -lssl -lcrypto" -ifeq ($(enable_zrtp),yes) - linphone_configure_controls+= --with-srtp=$(prefix) --enable-zrtp=yes --disable-tests -endif - + SPEEX_LIBS="-L$(prefix)/lib -lspeexdsp -lspeex " #path BUILDER_SRC_DIR?=$(shell pwd)/../ @@ -61,15 +49,34 @@ BUILDER_BUILD_DIR?=$(shell pwd)/../build-$(host) LINPHONE_SRC_DIR=$(BUILDER_SRC_DIR)/linphone LINPHONE_BUILD_DIR=$(BUILDER_BUILD_DIR)/linphone -osip_dir?=externals/osip +all: build-linphone build-msilbc build-msamr build-msx264 build-mssilk -eXosip_dir?=externals/exosip +$(LINPHONE_BUILD_DIR)/enable_gpl: + mkdir -p $(LINPHONE_BUILD_DIR) + touch $(LINPHONE_BUILD_DIR)/enable_gpl + rm -f $(LINPHONE_BUILD_DIR)/disable_gpl + cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile -speex_dir?=externals/speex +$(LINPHONE_BUILD_DIR)/disable_gpl: + mkdir -p $(LINPHONE_BUILD_DIR) + touch $(LINPHONE_BUILD_DIR)/disable_gpl + rm -f $(LINPHONE_BUILD_DIR)/enable_gpl + cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile -gsm_dir?=externals/gsm +ifeq ($(enable_gpl),yes) +linphone_configure_controls+= --enable-ffmpeg --enable-zrtp +detect_gpl_mode_switch: $(LINPHONE_BUILD_DIR)/enable_gpl + +else +linphone_configure_controls+= --disable-ffmpeg --disable-zrtp +detect_gpl_mode_switch: $(LINPHONE_BUILD_DIR)/disable_gpl + +endif -zrtpcpp_dir?=externals/zrtpcpp +osip_dir=externals/osip +eXosip_dir=externals/exosip +speex_dir=externals/speex +gsm_dir=externals/gsm MSILBC_SRC_DIR:=$(BUILDER_SRC_DIR)/msilbc MSILBC_BUILD_DIR:=$(BUILDER_BUILD_DIR)/msilbc @@ -85,7 +92,6 @@ endif prefix?=$(BUILDER_SRC_DIR)/../liblinphone-sdk/$(host) -all: build-linphone build-msilbc build-msamr build-msx264 build-mssilk clean-makefile: clean-makefile-linphone clean: clean-linphone @@ -97,7 +103,7 @@ veryclean: veryclean-linphone rm -rf $(BUILDER_BUILD_DIR) -.NOTPARALLEL build-linphone: init build-openssl build-srtp build-zrtpcpp build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg build-libvpx $(LINPHONE_BUILD_DIR)/Makefile +.NOTPARALLEL build-linphone: init build-openssl build-srtp build-zrtpcpp build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg build-libvpx detect_gpl_mode_switch $(LINPHONE_BUILD_DIR)/Makefile cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-srtp clean-zrtpcpp clean-msilbc clean-libilbc clean-openssl clean-msamr clean-mssilk clean-ffmpeg clean-libvpx clean-msx264 @@ -166,7 +172,7 @@ $(BUILDER_BUILD_DIR)/$(eXosip_dir)/Makefile: $(BUILDER_SRC_DIR)/$(eXosip_dir)/co mkdir -p $(BUILDER_BUILD_DIR)/$(eXosip_dir) cd $(BUILDER_BUILD_DIR)/$(eXosip_dir)/\ && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \ - $(BUILDER_SRC_DIR)/$(eXosip_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} CFLAGS="-I$(prefix)/include -L$(prefix)/lib -lcrypto" --enable-openssl --disable-tools + $(BUILDER_SRC_DIR)/$(eXosip_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} CFLAGS="-I$(prefix)/include -L$(prefix)/lib -lcrypto -DMULTITASKING_ENABLED" --enable-openssl --disable-tools build-eXosip2: $(BUILDER_BUILD_DIR)/$(eXosip_dir)/Makefile cd $(BUILDER_BUILD_DIR)/$(eXosip_dir) \ diff --git a/submodules/build/builders.d/mssilk.mk b/submodules/build/builders.d/mssilk.mk index 706496c8c..bffd7de26 100644 --- a/submodules/build/builders.d/mssilk.mk +++ b/submodules/build/builders.d/mssilk.mk @@ -20,6 +20,7 @@ # ############################################################################ mssilk_dir?=mssilk +enable_silk?=yes $(BUILDER_SRC_DIR)/$(mssilk_dir)/configure: echo -e "\033[01;32m Running autogen for mssilk in $(BUILDER_SRC_DIR)/$(mssilk_dir) \033[0m" diff --git a/submodules/build/builders.d/openssl.mk b/submodules/build/builders.d/openssl.mk index 0b2e5bf80..076c81563 100644 --- a/submodules/build/builders.d/openssl.mk +++ b/submodules/build/builders.d/openssl.mk @@ -19,13 +19,15 @@ $(OPENSSL_BUILD_DIR)/Configure: $(OPENSSL_BUILD_DIR)/Makefile: $(OPENSSL_BUILD_DIR)/Configure cd $(OPENSSL_BUILD_DIR) \ && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ - && ./Configure -openssldir=$(prefix) --cross-compile-prefix=$$SDK_BIN_PATH/ BSD-generic32 no-asm + && ./Configure --prefix=$(prefix) --cross-compile-prefix=$$SDK_BIN_PATH/ BSD-generic32 no-asm build-openssl: $(OPENSSL_BUILD_DIR)/Makefile cd $(OPENSSL_BUILD_DIR) && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \ - && make CC="$$CC" build_crypto build_ssl \ + && make CC="$$CC" build_crypto build_ssl libcrypto.pc libssl.pc\ && cp -r include $(prefix)/ \ - && cp lib*.a $(prefix)/lib + && cp lib*.a $(prefix)/lib \ + && cp libcrypto.pc $(prefix)/lib/pkgconfig/. \ + && cp libssl.pc $(prefix)/lib/pkgconfig/. \ clean-openssl: cd $(OPENSSL_BUILD_DIR) && make clean diff --git a/submodules/build/builders.d/zrtp.mk b/submodules/build/builders.d/zrtp.mk index 6b988fd6e..6dff4c4d2 100644 --- a/submodules/build/builders.d/zrtp.mk +++ b/submodules/build/builders.d/zrtp.mk @@ -1,36 +1,24 @@ -$(BUILDER_SRC_DIR)/$(zrtpcpp_dir)/CMakeLists.txt.tracker: $(BUILDER_SRC_DIR)/build/builders.d/zrtpcpp.CMakeLists.txt - cp $(BUILDER_SRC_DIR)/build/builders.d/zrtpcpp.CMakeLists.txt $(BUILDER_SRC_DIR)/$(zrtpcpp_dir)/CMakeLists.txt - - -#I coudn't manage to crosscompile using only -D arguments to cmake -#Thus the use of a toolchain file. -$(BUILDER_BUILD_DIR)/$(zrtpcpp_dir)/Makefile: $(BUILDER_SRC_DIR)/$(zrtpcpp_dir)/CMakeLists.txt.tracker +zrtpcpp_dir=externals/zrtpcpp +$(BUILDER_BUILD_DIR)/$(zrtpcpp_dir)/Makefile: mkdir -p $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir) cd $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir)/\ && host_alias=$(host) . $(BUILDER_SRC_DIR)/build/$(config_site) \ && cmake $(BUILDER_SRC_DIR)/$(zrtpcpp_dir) -Denable-ccrtp=false -DCMAKE_TOOLCHAIN_FILE=$(BUILDER_SRC_DIR)build/iphone-toolchain.cmake \ -LH -Wdev -DCMAKE_C_COMPILER=$$SDK_BIN_PATH/gcc -DCMAKE_CXX_COMPILER=$$SDK_BIN_PATH/g++ \ -DCMAKE_SYSTEM_PROCESSOR=$$ARCH -DCMAKE_C_FLAGS="$$COMMON_FLAGS" -DCMAKE_CXX_FLAGS="$$COMMON_FLAGS" \ - -DCMAKE_INSTALL_PREFIX=$(prefix) -DCMAKE_FIND_ROOT_PATH="$(prefix)" + -DCMAKE_INSTALL_PREFIX=$(prefix) -DCMAKE_FIND_ROOT_PATH="$(prefix) -DBUILD_STATIC=ON " # Used toolchain: $(TC) -ifeq ($(enable_zrtp),yes) build-zrtpcpp: $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir)/Makefile - echo "Build ZRTP - prefix $(prefix)" + @echo "Build ZRTP - prefix $(prefix)" cd $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir) && make VERBOSE=1 && make install -else -build-zrtpcpp: - echo "Build of zrtpcpp disabled" -endif - clean-zrtpcpp: -cd $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir) && make clean clean-makefile-zrtpcpp: clean-zrtpcpp -rm -f $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir)/Makefile - -rm -f $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir)/CMakeCache.txt veryclean-zrtpcpp: -rm -rf $(BUILDER_BUILD_DIR)/$(zrtpcpp_dir) diff --git a/submodules/build/builders.d/zrtpcpp.CMakeLists.txt b/submodules/build/builders.d/zrtpcpp.CMakeLists.txt deleted file mode 100755 index 4f20891f6..000000000 --- a/submodules/build/builders.d/zrtpcpp.CMakeLists.txt +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright (C) 2009 Werner Dittman -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -cmake_minimum_required(VERSION 2.6) - -PROJECT(libzrtpcpp) - -SET(CPACK_PACKAGE_VERSION_MAJOR 2) -SET(CPACK_PACKAGE_VERSION_MINOR 0) -SET(CPACK_PACKAGE_VERSION_PATCH 0) - -set (VERSION 2.0.0) -set (SOVERSION 2) -set (PACKAGE libzrtpcpp) - -if(MSVC60) - set(BUILD_STATIC ON CACHE BOOL "static linking only" FORCE) - MARK_AS_ADVANCED(BUILD_STATIC) -else() - option(BUILD_STATIC "Set to OFF to build shared libraries" ON) -endif() - -# set to true for debug and trace during CMakeLists development -set(CMAKE_VERBOSE_MAKEFILE FALSE) - -MESSAGE( STATUS "Configuring GNU ${PROJECT_NAME} ${VERSION}...") - -# include most of the fine stuff we need -include(cmake/Modules/FindGcryptConfig.cmake) -include(FindPkgConfig) -include(CheckLibraryExists) -include(CheckIncludeFiles) -include(cmake/Modules/AutoArgs.cmake) - -if(${PROJECT_NAME} STREQUAL ${CMAKE_PROJECT_NAME}) - include(cmake/Modules/GeneratePackage.cmake) - - GENERATE_PACKAGING(${PACKAGE} ${VERSION}) -endif() - -# check the -Denable-ccrtp setting, defaults to true -enable_arg(ccrtp true "Enable GNU ccRTP support for GNU ZRTP") -args_help() - -# this caused problems in debian where it has to always be lib.... -set(LIBDIRNAME "lib") -if (NOT EXISTS /etc/debian_version) - if ( "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" ) - set(LIBDIRNAME "lib64") - endif() -endif() - -# setup the Thread include and lib -find_package(Threads) -if(CMAKE_HAVE_PTHREAD_H) - set(HAVE_PTHREAD_H TRUE) -endif() -set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) - -if(enable_ccrtp) - if (USES_CCRTP_INCLUDE_DIRS) - message(STATUS " Using local commoncpp dependency") - else() - find_package(PkgConfig) - pkg_check_modules(USES_CCRTP libccrtp>=2.0.0) - endif() - include_directories(${USES_CCRTP_INCLUDE_DIRS}) - link_directories(${USES_CRTP_LIBRARY_DIRS}) - add_definitions(${USES_CCRTP_CFLAGS}) - set (LIBS ${LIBS} ${USES_CCRTP_LDFLAGS} ${USES_CCRTP_LIBRARIES}) -endif() - -if (CMAKE_CROSSCOMPILING) - include_directories(${CMAKE_INSTALL_PREFIX}/include) - link_directories(${CMAKE_INSTALL_PREFIX}/lib) - set(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${CMAKE_INSTALL_PREFIX}/include") -## set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_INSTALL_PREFIX}/lib/*") -endif() - - -# now get info about crypto libraries -gcr_check(GCRYPT gcrypt) -#if(GCRYPT_FOUND) -# check_include_files(gcrypt.h HAVE_GCRYPT_H) -# set(LIBS ${LIBS} ${GCRYPT_LIBRARIES}) -# set(BUILD_REQ "libgcrypt-devel") -# set(CRYPTOBACKEND="") -# set(PACKAGE_REQ "libgcrypt") -#else() - pkg_check_modules(OPENSSL libcrypto>=0.9.8) - if (OPENSSL_FOUND) - check_include_files(openssl/bn.h HAVE_OPENSSL_BN_H) - check_include_files(openssl/aes.h HAVE_OPENSSL_AES_H) - check_include_files(openssl/sha.h HAVE_OPENSSL_SHA_H) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -lcrypto") - check_library_exists(crypto EVP_CipherInit_ex "${CMAKE_INSTALL_PREFIX}/lib" HAVE_SSL_CRYPT) -# don't test HAVE_SSL_CRYPT_FOUND as it doesn't work - if (HAVE_OPENSSL_BN_H_FOUND) -# AND HAVE_OPENSSL_AES_H_FOUND AND HAVE_OPENSSL_SHA_H_FOUND)) - message(FATAL_ERROR "Openssl crypto library not found") - endif() - set(LIBS ${LIBS} -lcrypto) - set(CRYPTOBACKEND "libcrypto >= 0.9.8") - set(BUILD_REQ "libopenssl-devel >= 0.9.8") - set(PACKAGE_REQ "libopenssl >= 0.9.8") - else() - message(FATAL_ERROR "No crypto library found") - endif() -#endif() - -check_include_files(stdlib.h HAVE_STDLIB_H) -check_include_files(string.h HAVE_STRING_H) - -# necessary and required modules checked, ready to generate config.h -configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) - -# the following set(...) commands are only to have backward -# compatibility with autoconf stuff to generate the pc file -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix ${prefix}/bin) -set(libdir ${prefix}/lib) -set(includedir ${prefix}/include) -set(PACKAGE pkgconfig) -configure_file(libzrtpcpp.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libzrtpcpp.pc @ONLY) - -configure_file(libzrtpcpp.spec.cmake ${CMAKE_CURRENT_BINARY_DIR}/libzrtpcpp.spec @ONLY) - -include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) - -add_definitions(-g -O2 -fno-strict-aliasing) -if(CMAKE_COMPILER_IS_GNUCXX) - add_definitions(-Wno-long-long -Wno-char-subscripts) - add_definitions(-Wall -ansi -pedantic) - add_definitions(-DNEW_STDCPP) -# add_definitions(-D__EXPORT=) -endif() - -add_subdirectory(src) - -if (enable_ccrtp) - add_subdirectory(demo) -endif() - -if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/package/) - MESSAGE(STATUS "package dir not found") - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/package/) -endif() - -########### install files ############### -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libzrtpcpp.pc DESTINATION ${LIBDIRNAME}/pkgconfig) - -if(${PROJECT_NAME} STREQUAL ${CMAKE_PROJECT_NAME}) - - ########### Add uninstall target ############### - configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY) - add_custom_target(uninstall - "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") - -endif() diff --git a/submodules/build/iphone-config.site b/submodules/build/iphone-config.site index 6ab8723a3..558ac7c38 100644 --- a/submodules/build/iphone-config.site +++ b/submodules/build/iphone-config.site @@ -38,3 +38,4 @@ RANLIB=${SDK_BIN_PATH}/ranlib CPPFLAGS="-Dasm=__asm" LDFLAGS="-Wl,-syslibroot,${SYSROOT_PATH} -framework CFNetwork" +OBJCFLAGS="-x objective-c -fexceptions -fasm-blocks -gdwarf-2 -fobjc-abi-version=2 -fobjc-legacy-dispatch" diff --git a/submodules/build/iphone-toolchain.cmake.i386 b/submodules/build/iphone-toolchain.cmake.i386 deleted file mode 100644 index 0c7c1a5e5..000000000 --- a/submodules/build/iphone-toolchain.cmake.i386 +++ /dev/null @@ -1,13 +0,0 @@ -SET (CMAKE_SYSTEM_NAME "Generic") -SET (CMAKE_SYSTEM_PROCESSOR "i386") - -SET (SDKVER "4.3") -SET (DEVROOT "/Developer/Platforms/iPhoneOS.platform/Developer") -SET (SDKROOT "${DEVROOT}/SDKs/iPhoneOS${SDKVER}.sdk") - -SET (CMAKE_FIND_ROOT_PATH "${CMAKE_INSTALL_PREFIX}" "${SDKROOT}" "${DEVROOT}") -SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - - diff --git a/submodules/externals/zrtpcpp b/submodules/externals/zrtpcpp index 93dbdb315..9cac07ec1 160000 --- a/submodules/externals/zrtpcpp +++ b/submodules/externals/zrtpcpp @@ -1 +1 @@ -Subproject commit 93dbdb3159f55bb35f69c13df1f60ac4901c88fb +Subproject commit 9cac07ec1a1f57bfd0198c0895fae42a79a62a9f diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 8d22b5213..5d1a72885 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -22,6 +22,9 @@ 220ED1A913A9041800AC21E0 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A813A9041800AC21E0 /* AVFoundation.framework */; }; 220ED1AC13A9062600AC21E0 /* nowebcam.h in Headers */ = {isa = PBXBuildFile; fileRef = 220ED1AA13A9062500AC21E0 /* nowebcam.h */; }; 220ED1AD13A9062600AC21E0 /* nowebcam.c in Sources */ = {isa = PBXBuildFile; fileRef = 220ED1AB13A9062500AC21E0 /* nowebcam.c */; }; + 2211DB9C1476539600DEE054 /* l16.c in Sources */ = {isa = PBXBuildFile; fileRef = 2211DB9B1476539600DEE054 /* l16.c */; }; + 2211DB9F14765CED00DEE054 /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB9E14765CEC00DEE054 /* libmssilk.a */; }; + 2211DBA1147660BB00DEE054 /* libSKP_SILK_SDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DBA0147660BB00DEE054 /* libSKP_SILK_SDK.a */; }; 221F589C13AB4FC500D603C9 /* msvideo.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F589B13AB4FC500D603C9 /* msvideo.c */; }; 221F58A013AB50F800D603C9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 221F589F13AB50F800D603C9 /* CoreMedia.framework */; }; 221F58A213AB6F8100D603C9 /* pixconv.c in Sources */ = {isa = PBXBuildFile; fileRef = 221F58A113AB6F8000D603C9 /* pixconv.c */; }; @@ -256,6 +259,9 @@ 220ED1A813A9041800AC21E0 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 220ED1AA13A9062500AC21E0 /* nowebcam.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nowebcam.h; sourceTree = ""; }; 220ED1AB13A9062500AC21E0 /* nowebcam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nowebcam.c; sourceTree = ""; }; + 2211DB9B1476539600DEE054 /* l16.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = l16.c; sourceTree = ""; }; + 2211DB9E14765CEC00DEE054 /* libmssilk.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmssilk.a; path = "../liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmssilk.a"; sourceTree = ""; }; + 2211DBA0147660BB00DEE054 /* libSKP_SILK_SDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSKP_SILK_SDK.a; path = "../liblinphone-sdk/apple-darwin/lib/libSKP_SILK_SDK.a"; sourceTree = ""; }; 221F589913AB4EEE00D603C9 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 221F589B13AB4FC500D603C9 /* msvideo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msvideo.c; sourceTree = ""; }; 221F589D13AB503F00D603C9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -508,6 +514,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 2211DB9F14765CED00DEE054 /* libmssilk.a in Frameworks */, 7066FC0A13E830B800EFC6DC /* libvpx.a in Frameworks */, 70E542F113E147CE002BA2C0 /* QuartzCore.framework in Frameworks */, 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */, @@ -537,6 +544,7 @@ buildActionMask = 2147483647; files = ( AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, + 2211DBA1147660BB00DEE054 /* libSKP_SILK_SDK.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -554,6 +562,8 @@ 0867D691FE84028FC02AAC07 /* liblinphone */ = { isa = PBXGroup; children = ( + 2211DBA0147660BB00DEE054 /* libSKP_SILK_SDK.a */, + 2211DB9E14765CEC00DEE054 /* libmssilk.a */, 7066FC0913E830B800EFC6DC /* libvpx.a */, 70E542F013E147CE002BA2C0 /* QuartzCore.framework */, 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */, @@ -687,6 +697,7 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 2211DB9B1476539600DEE054 /* l16.c */, 22512698145F13CE0041FBF2 /* aqsnd.c */, F4D9F25E14583B580035B0D0 /* bitratedriver.c */, F4D9F25F14583B580035B0D0 /* qosanalyzer.c */, @@ -1269,6 +1280,7 @@ F4D9F26014583B580035B0D0 /* bitratedriver.c in Sources */, F4D9F26114583B580035B0D0 /* qosanalyzer.c in Sources */, 22512699145F13CE0041FBF2 /* aqsnd.c in Sources */, + 2211DB9C1476539600DEE054 /* l16.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1346,6 +1358,7 @@ TARGET_OS_IPHONE, ); GCC_UNROLL_LOOPS = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1359,6 +1372,10 @@ "../liblinphone-sdk/apple-darwin/include", ); INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + ); PRODUCT_NAME = linphone; SKIP_INSTALL = YES; }; @@ -1396,6 +1413,7 @@ TARGET_OS_IPHONE, ); GCC_UNROLL_LOOPS = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1409,6 +1427,10 @@ "../liblinphone-sdk/apple-darwin/include", ); INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + ); PRODUCT_NAME = linphone; SKIP_INSTALL = YES; }; @@ -1572,6 +1594,7 @@ TARGET_OS_IPHONE, ); GCC_UNROLL_LOOPS = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; HEADER_SEARCH_PATHS = ( linphone/mediastreamer2/build/iphone, linphone/mediastreamer2/include, @@ -1585,6 +1608,10 @@ "../liblinphone-sdk/apple-darwin/include", ); INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../liblinphone-sdk/apple-darwin/lib\"", + ); PRODUCT_NAME = linphone; SKIP_INSTALL = YES; }; @@ -1600,6 +1627,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( + HAVE_SILK, "_BYTE_ORDER=_LITTLE_ENDIAN", ORTP_INET6, ENABLE_TRACE, @@ -1613,7 +1641,6 @@ "PACKAGE=\\\"ortp\\\"", "POSIXTIMER_INTERVAL=10000", IN_LINPHONE, - __IOSIOUNIT_ENABLED__, HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, @@ -1650,6 +1677,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( + HAVE_SILK, "_BYTE_ORDER=_LITTLE_ENDIAN", ORTP_INET6, ENABLE_TRACE, @@ -1663,7 +1691,6 @@ "PACKAGE=\\\"ortp\\\"", "POSIXTIMER_INTERVAL=10000", IN_LINPHONE, - __IOSIOUNIT_ENABLED__, HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, @@ -1697,6 +1724,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "linphone/mediastreamer2/tests/ios/mediastream-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( + HAVE_SILK, "_BYTE_ORDER=_LITTLE_ENDIAN", ORTP_INET6, ENABLE_TRACE, @@ -1710,7 +1738,6 @@ "PACKAGE=\\\"ortp\\\"", "POSIXTIMER_INTERVAL=10000", IN_LINPHONE, - __IOSIOUNIT_ENABLED__, HAVE_EXOSIP_GET_SOCKET, MS2_INTERNAL, VIDEO_ENABLED, diff --git a/submodules/linphone b/submodules/linphone index ce510f9d1..46be0d846 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit ce510f9d1fa8d66aabcca308f0d2a9174f68acd4 +Subproject commit 46be0d846485f407ea91eefc5e0161fc11e639d7 From c69640e3a4d87c0bfcf8834e2751ef6fce51b785 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 18 Nov 2011 14:39:33 +0100 Subject: [PATCH 076/122] update linphone --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 46be0d846..5117bc143 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 46be0d846485f407ea91eefc5e0161fc11e639d7 +Subproject commit 5117bc14390a9029b46684513a7a6a0455dfc3f1 From 24e7ea9440f6383421a8608903efc09bee1a4e93 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 18 Nov 2011 17:17:12 +0100 Subject: [PATCH 077/122] InCallView: new icons --- Classes/IncallViewController.m | 19 +- Classes/IncallViewController.xib | 487 ++++++++++-------- Classes/PhoneViewController.xib | 26 +- PhoneMainView.xib | 48 +- Resources/HP.png | Bin 0 -> 2382 bytes Resources/HP_inverse.png | Bin 0 -> 8077 bytes Resources/ajouter.png | Bin 0 -> 1538 bytes Resources/clavier.png | Bin 0 -> 3353 bytes Resources/contact.png | Bin 0 -> 4155 bytes Resources/effacer.png | Bin 0 -> 2701 bytes Resources/grouper.png | Bin 0 -> 3364 bytes Resources/micro.png | Bin 0 -> 4760 bytes Resources/micro_inverse.png | Bin 0 -> 10593 bytes Resources/pause.png | Bin 0 -> 1564 bytes Resources/pause_inactif.png | Bin 0 -> 7304 bytes linphone.xcodeproj/project.pbxproj | 44 ++ .../liblinphone.xcodeproj/project.pbxproj | 11 +- 17 files changed, 363 insertions(+), 272 deletions(-) create mode 100755 Resources/HP.png create mode 100755 Resources/HP_inverse.png create mode 100755 Resources/ajouter.png create mode 100755 Resources/clavier.png create mode 100755 Resources/contact.png create mode 100755 Resources/effacer.png create mode 100755 Resources/grouper.png create mode 100755 Resources/micro.png create mode 100755 Resources/micro_inverse.png create mode 100755 Resources/pause.png create mode 100755 Resources/pause_inactif.png diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 8a961044b..25e82ebe9 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -90,8 +90,8 @@ int callCount(LinphoneCore* lc) { - (void)viewDidLoad { [super viewDidLoad]; //Controls - [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; + [mute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; + [speaker initWithOnImage:[UIImage imageNamed:@"HP_inverse.png"] offImage:[UIImage imageNamed:@"HP.png"] ]; //Dialer init @@ -139,10 +139,13 @@ int callCount(LinphoneCore* lc) { -(void) pauseCallPressed { if (!selectedCall) return; - if (linphone_call_get_state(selectedCall) == LinphoneCallPaused) + if (linphone_call_get_state(selectedCall) == LinphoneCallPaused) { + [pause setSelected:NO]; linphone_core_resume_call([LinphoneManager getLc], selectedCall); - else + }else{ linphone_core_pause_call([LinphoneManager getLc], selectedCall); + [pause setSelected:YES]; + } } @@ -261,12 +264,12 @@ int callCount(LinphoneCore* lc) { else if (linphone_call_get_state(selectedCall)==LinphoneCallPaused) { [pause setHidden:NO]; //[pause setTitle:@"Resume" forState:UIControlStateNormal]; - pause.selected = YES; + // pause.selected = YES; pause.highlighted = NO; } else if (callCount(lc) == callsCount && callsCount == 1) { [pause setHidden:NO]; //[pause setTitle:@"Pause" forState:UIControlStateNormal]; - pause.selected = NO; + // pause.selected = NO; pause.highlighted = NO; } else { [pause setHidden:YES]; @@ -493,7 +496,7 @@ int callCount(LinphoneCore* lc) { [self updateCell:cell at:indexPath withCall: [self retrieveCallAtIndex:indexPath.row inConference:NO] conferenceActive:linphone_core_is_in_conference(lc)]; - cell.userInteractionEnabled = YES; + cell.userInteractionEnabled = YES; cell.selectionStyle = UITableViewCellSelectionStyleNone; //cell.selectionStyle = UITableViewCellSelectionStyleBlue; @@ -503,7 +506,7 @@ int callCount(LinphoneCore* lc) { UIImage *theImage = [UIImage imageWithContentsOfFile:path]; cell.imageView.image = theImage;*/ return cell; -} +} // UITableViewDataSource (required) diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index a77415f09..678052028 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -13,9 +13,9 @@ YES IBUIViewController - IBUITableView - IBUIView IBUIButton + IBUIView + IBUITableView IBProxyObject @@ -45,14 +45,14 @@ 274 - {320, 276} + {320, 251} - + _NS:418 - + 3 - MC42NjY2NjY2NjY3AA + MCAwAA YES IBCocoaTouchFramework @@ -72,10 +72,10 @@ 292 - {{36, 8}, {248, 52}} + {{0, 1}, {320, 66}} - + 1 MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA @@ -101,6 +101,10 @@ NSImage stopcall-red.png + + NSImage + clavier-01-106px.png + Helvetica-Bold Helvetica @@ -114,15 +118,12 @@ - {{0, 392}, {320, 68}} + {{0, 393.5}, {320, 77}} _NS:196 - - 3 - MC4zMzMzMzMzMzMzAA - + IBCocoaTouchFramework @@ -133,11 +134,11 @@ 292 - {{119, 58}, {82, 52}} + {{107, 70}, {106, 66}} - - + + NO NO IBCocoaTouchFramework @@ -149,11 +150,14 @@ MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + NSImage conf_merge.png - + + NSImage + grouper.png + 2 17 @@ -167,11 +171,11 @@ 292 - {{36, 5}, {82, 52}} + {{0, 4}, {107, 66}} - + NO NO IBCocoaTouchFramework @@ -187,6 +191,14 @@ NSImage mic_active.png + + NSImage + micro_inverse.png + + + NSImage + micro.png + 2 2 @@ -200,11 +212,11 @@ 292 - {{36, 58}, {82, 52}} + {{0, 70}, {107, 66}} - - + + NO NO IBCocoaTouchFramework @@ -218,7 +230,7 @@ NSImage - addcall-green.png + ajouter.png @@ -226,17 +238,16 @@ 292 - {{202, 58}, {82, 52}} + {{213, 70}, {107, 66}} - + NO NO IBCocoaTouchFramework 0 0 - Cont 1 @@ -248,7 +259,7 @@ NSImage - contact-orange.png + contact.png @@ -256,11 +267,11 @@ 292 - {{119, 5}, {82, 52}} + {{107, 4}, {106, 66}} - + NO NO IBCocoaTouchFramework @@ -274,7 +285,7 @@ NSImage - numpad.png + clavier.png @@ -282,34 +293,41 @@ 292 - {{202, 5}, {82, 52}} + {{213, 4}, {107, 66}} - + NO NO IBCocoaTouchFramework 0 0 - Spk 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + NSImage + HP_inverse.png + + + NSImage + HP.png + 292 - {{119, 58}, {82, 52}} + {{107, 70}, {106, 66}} - - + + NO NO IBCocoaTouchFramework @@ -325,21 +343,21 @@ NSImage - resumecall.png + pause_inactif.png NSImage - pausecall.png + pause.png - {{0, 276}, {320, 115}} + {{0, 258.5}, {320, 135}} - + NO NO IBCocoaTouchFramework @@ -352,17 +370,17 @@ 292 - {{95, 219}, {82, 52}} + {{119, 251}, {82, 52}} - - + + NO NO IBCocoaTouchFramework 0 0 - Close + close 1 @@ -375,11 +393,14 @@ 292 - {{95, 166}, {82, 52}} + {{119, 193}, {82, 52}} - + + 3 + MC42NjY2NjY2NjY3AA + NO NO IBCocoaTouchFramework @@ -398,11 +419,11 @@ 292 - {{12, 7}, {82, 52}} + {{31, 19}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -421,11 +442,11 @@ 292 - {{95, 7}, {82, 52}} + {{119, 19}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -441,11 +462,11 @@ 292 - {{178, 7}, {82, 52}} + {{207, 19}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -464,11 +485,11 @@ 292 - {{12, 60}, {82, 52}} + {{31, 77}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -487,11 +508,11 @@ 292 - {{95, 60}, {82, 52}} + {{119, 77}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -510,11 +531,11 @@ 292 - {{178, 60}, {82, 52}} + {{207, 77}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -533,11 +554,11 @@ 292 - {{12, 113}, {82, 52}} + {{31, 135}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -556,11 +577,11 @@ 292 - {{95, 113}, {82, 52}} + {{119, 135}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -579,11 +600,11 @@ 292 - {{178, 113}, {82, 52}} + {{207, 135}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -602,11 +623,11 @@ 292 - {{12, 166}, {82, 52}} + {{31, 193}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -625,11 +646,11 @@ 292 - {{178, 166}, {82, 52}} + {{207, 193}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -646,11 +667,14 @@ - {{24, 115}, {272, 279}} + {{0, 71}, {320, 310}} - + + 3 + MC4yNAA + NO NO IBCocoaTouchFramework @@ -660,10 +684,7 @@ - - 1 - MC44MDAwMDAwMTE5IDAuODAwMDAwMDExOSAwLjgwMDAwMDAxMTkAA - + NO IBCocoaTouchFramework @@ -687,14 +708,6 @@ 23 - - - callTableView - - - - 109 - endCtrl @@ -703,70 +716,6 @@ 99 - - - addCall - - - - 112 - - - - controlSubView - - - - 44 - - - - mergeCalls - - - - 114 - - - - speaker - - - - 82 - - - - dialer - - - - 49 - - - - pause - - - - 115 - - - - mute - - - - 80 - - - - contacts - - - - 84 - star @@ -887,6 +836,78 @@ 122 + + + callTableView + + + + 109 + + + + controlSubView + + + + 44 + + + + mute + + + + 80 + + + + addCall + + + + 112 + + + + dialer + + + + 49 + + + + pause + + + + 115 + + + + speaker + + + + 82 + + + + contacts + + + + 84 + + + + mergeCalls + + + + 114 + doAction: @@ -967,18 +988,13 @@ YES - - + + - - 106 - - - 120 @@ -994,64 +1010,6 @@ end - - 26 - - - YES - - - - - - - - - - controls - - - 113 - - - pauseresume - - - 13 - - - speaker - - - 17 - - - dialer - - - 15 - - - contacts - - - 111 - - - addcall - - - 16 - - - mute - - - 104 - - - merge - 27 @@ -1061,7 +1019,6 @@ - @@ -1070,6 +1027,7 @@ + pad @@ -1152,6 +1110,69 @@ 9 + + 106 + + + + + 26 + + + YES + + + + + + + + + + controls + + + 113 + + + pauseresume + + + 13 + + + speaker + + + 17 + + + dialer + + + 15 + + + contacts + + + 111 + + + addcall + + + 16 + + + mute + + + 104 + + + merge + @@ -1172,6 +1193,7 @@ 120.IBPluginDependency 13.CustomClassName 13.IBPluginDependency + 13.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 15.IBPluginDependency 16.CustomClassName 16.IBPluginDependency @@ -1204,6 +1226,7 @@ 39.IBPluginDependency 40.CustomClassName 40.IBPluginDependency + 40.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 41.CustomClassName 41.IBPluginDependency 9.IBPluginDependency @@ -1220,14 +1243,15 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1256,6 +1280,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1554,24 +1579,36 @@ YES YES - addcall-green.png + HP.png + HP_inverse.png + ajouter.png + clavier-01-106px.png + clavier.png conf_merge.png - contact-orange.png + contact.png + grouper.png mic_active.png - numpad.png - pausecall.png - resumecall.png + micro.png + micro_inverse.png + pause.png + pause_inactif.png stopcall-red.png YES - {82, 71} + {164, 104} + {164, 104} + {164, 104} + {106, 60} + {164, 104} {82, 75} - {25, 23} + {164, 104} + {164, 104} {82, 82} - {82, 82} - {82, 75} - {82, 75} + {164, 104} + {164, 104} + {164, 104} + {164, 104} {62, 54} diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index 385db8b02..be02b22e2 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -59,7 +59,6 @@ IBCocoaTouchFramework 0 0 - <- 3 MQA @@ -72,9 +71,9 @@ 3 MC41AA - + NSImage - clavier-01-106px.png + effacer.png Helvetica-Bold @@ -216,7 +215,10 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + + NSImage + clavier-01-106px.png + @@ -239,7 +241,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -288,7 +290,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -311,7 +313,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -334,7 +336,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -384,7 +386,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -407,7 +409,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -453,7 +455,7 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + @@ -1346,6 +1348,7 @@ clavier-01-106px.png clavier-01-108px.png clavier-01-160px.png + effacer.png startcall-green.png stopcall-red.png @@ -1354,6 +1357,7 @@ {106, 60} {108, 60} {160, 60} + {164, 104} {60, 52} {62, 54} diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 1eb8dfbfc..8f1c9a54f 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -65,12 +65,18 @@ IBCocoaTouchFramework NO - - + + History + + History + + NSImage + history-orange.png + IBCocoaTouchFramework - 5 + 1 1 @@ -80,25 +86,7 @@ YES - - History - - History - - NSImage - history-orange.png - - IBCocoaTouchFramework - - - - - 1 - 1 - - IBCocoaTouchFramework - NO - + Dialer @@ -118,7 +106,19 @@ IBCocoaTouchFramework NO - + + + IBCocoaTouchFramework + 5 + + + + 1 + 1 + + IBCocoaTouchFramework + NO + @@ -357,7 +357,7 @@ - 47 + 48 0 diff --git a/Resources/HP.png b/Resources/HP.png new file mode 100755 index 0000000000000000000000000000000000000000..95d132189ab9b4b71466957362d039b280fb175a GIT binary patch literal 2382 zcmV-U39e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00_28L_t(|+U;FUZxh!Ve$LD| zw$nv(6DOq+x-M2w+pr*e7OnaNP`c<(U>!E)Zc3JPTco?ZS4fBmCAM%7B0@rHM5`bw zDj`vl6o_od!b(+0fspuXX5KF5!)N>vwKVaJkKbpL#2*vSnddz3^S8PWZ*LD605Cc_%A>*v4TfQ0Z+92J+jh+W z0Nb`9gy4~3gaWc{5C8$dXnKlAhtYjP0suMOGXOx-gsYIOl8g{Mq{}}dmykjT4%v(l z38}eSNK8mZ_z*%sxY6108OmUUNJ!5u`U=TlL`ESwWHZ7}YFZSM3CRdgAvFjH5EGIS zDG$kIA4ar1B$s^{QSgw>SvHq_7@;bprnS$qiFhrW5u%4|CM1V#Mz|i5lNv^Z6q3t6 zjA$e^o`>YJ4({R%pU>m<>(~1#;^5%mKN@e%IS3-E8?rTZ zvuq+lE|-hU=Q&6svWM)|5`v;cRNX^z*{6qysIo%3C#7cDr};caM@PG&nnZ+nJl>UY zRFRM^9#Yl&YU1&@Qs+iQYF;ZLZ9h}F?4x3P7&R5rIVZl|kSAEAVm1?!5s{guFd*|QwOVBfRm?*gy*%p%1_t`B>n{;0cg{ixpOIQGT?mG{ z<3PRQA-!#3f5#WHhvcN@z~SvZRISq&6S7AMsq1>n?VqfW>Lb!2dvI`&uTY;Tr05k7 z$qLzDNsXcMNvcXnm9G~s9kN0)ArA|-ZL|GgLPqFh+?~|yA(@a2Cgg!Y$)rYBNL|;V z>xOqz8w9yIosf$S)Y6%j$a&gpf+W2ZBnX0pb1)Jhzlo?jj^urJAED7CByb1_5Qu_3 zIf(h(#`mBr5oH@~*$|{%{FH((j^UF+&92 z)0hClpCsPbT7_J%V}f zaU#8N2ukEcW)jX%K_F-_blq1sAs^q3{lY)0XnYP|65V$QNyGcBL~KCu6JJ|j>-zu9 zWHJ~Y9(E^!kgO&7U&HHLO<%d)-#sttvemZxL?K;8;FX#~K%r2;vuDpRF)@LWkrXr` zB{?J-FH@ac<=z1FJH#v z$BzSKeYCoY_{Ih@nG8~?RFIg|zIJ5WR*UkgS@)s-DEo9PJj)HBrlzJaH8q9R)m2=% zas>|`J`50ZeSIAOFflQKRBE(Q;Sd6Hb}0bVYxTZR$PONoiTN&Yvgy{bJ8@zX-+p_+ zCFWd!m;kV`v4M?^4IDdm48z02fySM1?PR^lJ~(7lFR2NHY*xs_#pL7(T)5y6GndQZ z{{8!b=ZnQ6ip3(*|4w7*Uqik;3KB5eBsI3JRu^5FeoV-&5_1x>v$I%RTWd?q=bO** zeDgWR$Hy@=Gz191teb5JX{*)q(r%QpjAn*14j-R>I*Ie=XYuQ=>&RxaEyOI9N+^{| z_~6J9yw`MJQ9~hB4A`uYp(a5efBXr)`Q|(dg#vQ9ELK)l0+9KvMi+2AK~k-&*7`Do?&q@k2`nn zv|Jm{Ln=o~NNd@u&b(ezO>g|u=`?0$&SHA{OXTx;{P^P!enDK>knN3we3Fc4VSIcX zXV0F+ci&yaXPeO08)(vTRn!o`cu#NNI&+Ix@n9%?ingo>yJaj4%|kDP%Jl8R3U)!J8`>5y-OL-Ah97ZXZSzJtT)~M!1BugIP8wHH>fxiJ(F% z+rWs?GafRakfv#}hh&5XA%xc+Mi>C>?d@$QBqKCvnvP1PqG_6D8vtGv3Pm0jMu-Xt zn5Ol9EEcO60RFqPv%{mp2r;Q4#A2~TEEfCuPc4;J+UK;l&j0`b07*qoM6N<$g6|Sc Ai~s-t literal 0 HcmV?d00001 diff --git a/Resources/HP_inverse.png b/Resources/HP_inverse.png new file mode 100755 index 0000000000000000000000000000000000000000..e343dba736635489bd6612a63db86d6c7d4c5564 GIT binary patch literal 8077 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 b>D>PTy~S#voi4U|00000NkvXXu0mjf`#pd9 literal 0 HcmV?d00001 diff --git a/Resources/ajouter.png b/Resources/ajouter.png new file mode 100755 index 0000000000000000000000000000000000000000..c1526d8ba373dd3fef20f2a1e4af789bb27266a1 GIT binary patch literal 1538 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 literal 0 HcmV?d00001 diff --git a/Resources/contact.png b/Resources/contact.png new file mode 100755 index 0000000000000000000000000000000000000000..ecf2b160300415bdf22de4c73ba879b3eb8c0824 GIT binary patch literal 4155 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

sgX$hxKe`F}% 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 KN2y8y9{NAbRvXj+ literal 0 HcmV?d00001 diff --git a/Resources/micro_inverse.png b/Resources/micro_inverse.png new file mode 100755 index 0000000000000000000000000000000000000000..dc38d85a6591a1d0f0af03eef1de1eaddabb38e6 GIT binary patch literal 10593 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 O0000e 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 Date: Mon, 21 Nov 2011 12:53:43 +0100 Subject: [PATCH 078/122] update speex repo to use our version fix some compilation issue --- .gitmodules | 2 +- Classes/IncallViewController.m | 2 +- Classes/LinphoneAppDelegate.m | 4 - Classes/VideoViewController.m | 2 + linphone.xcodeproj/project.pbxproj | 134 +++++++++++++++--- submodules/build/builder-iphone-os.mk | 18 ++- submodules/build/iphone-config.site | 4 +- submodules/externals/speex | 2 +- .../liblinphone.xcodeproj/project.pbxproj | 2 +- submodules/linphone | 2 +- 10 files changed, 133 insertions(+), 39 deletions(-) diff --git a/.gitmodules b/.gitmodules index c331201f9..8ba0b2856 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,7 +12,7 @@ url = git://git.linphone.org/gsm.git [submodule "submodules/externals/speex"] path = submodules/externals/speex - url = http://git.xiph.org/speex.git + url = git://git.linphone.org/speex.git [submodule "submodules/msilbc"] path = submodules/msilbc url = git://git.linphone.org/msilbc.git diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index ae1414ad1..7d9f6adeb 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -248,7 +248,7 @@ int callCount(LinphoneCore* lc) { [self dismissModalViewControllerAnimated:FALSE];//just in case } - [self dismissModalViewControllerAnimated:true]; + [self dismissModalViewControllerAnimated:FALSE]; //disable animation to avoid blanc bar just below status bar*/ dismissed = true; [self updateUIFromLinphoneState: nil]; } diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 6a5d37412..dcb97b6b7 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -73,10 +73,6 @@ @"NO", @"enable_first_login_view_preference", // #ifdef HAVE_AMR @"YES",@"amr_8k_preference", // enable amr by default if compiled with -#endif -#ifdef HAVE_SILK - @"YES",@"silk_16k_preference", // enable SILK by default if compiled with - @"YES",@"silk_24k_preference", // enable SILK by default if compiled with #endif @"NO",@"debugenable_preference", //@"+33",@"countrycode_preference", diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index f1764a6af..ca07ae499 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -143,6 +143,8 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self configureOrientation:self.interfaceOrientation]; + [mMute reset]; + [mMuteLand reset]; } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [mLandscape removeFromSuperview]; diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index ca6ca3362..3e0de55b1 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -28,6 +28,28 @@ 2211DBBF14769C8300DEE054 /* CallDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBB14769C8200DEE054 /* CallDelegate.m */; }; 2211DBC014769CB200DEE054 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; 2211DBC114769CB300DEE054 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; + 2211DBD51476BE7300DEE054 /* ajouter.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCA1476BE7300DEE054 /* ajouter.png */; }; + 2211DBD61476BE7300DEE054 /* ajouter.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCA1476BE7300DEE054 /* ajouter.png */; }; + 2211DBD71476BE7300DEE054 /* clavier.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCB1476BE7300DEE054 /* clavier.png */; }; + 2211DBD81476BE7300DEE054 /* clavier.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCB1476BE7300DEE054 /* clavier.png */; }; + 2211DBD91476BE7300DEE054 /* contact.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCC1476BE7300DEE054 /* contact.png */; }; + 2211DBDA1476BE7300DEE054 /* contact.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCC1476BE7300DEE054 /* contact.png */; }; + 2211DBDB1476BE7300DEE054 /* effacer.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCD1476BE7300DEE054 /* effacer.png */; }; + 2211DBDC1476BE7300DEE054 /* effacer.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCD1476BE7300DEE054 /* effacer.png */; }; + 2211DBDD1476BE7300DEE054 /* grouper.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCE1476BE7300DEE054 /* grouper.png */; }; + 2211DBDE1476BE7300DEE054 /* grouper.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCE1476BE7300DEE054 /* grouper.png */; }; + 2211DBDF1476BE7300DEE054 /* HP_inverse.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCF1476BE7300DEE054 /* HP_inverse.png */; }; + 2211DBE01476BE7300DEE054 /* HP_inverse.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBCF1476BE7300DEE054 /* HP_inverse.png */; }; + 2211DBE11476BE7300DEE054 /* HP.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD01476BE7300DEE054 /* HP.png */; }; + 2211DBE21476BE7300DEE054 /* HP.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD01476BE7300DEE054 /* HP.png */; }; + 2211DBE31476BE7300DEE054 /* micro_inverse.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD11476BE7300DEE054 /* micro_inverse.png */; }; + 2211DBE41476BE7300DEE054 /* micro_inverse.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD11476BE7300DEE054 /* micro_inverse.png */; }; + 2211DBE51476BE7300DEE054 /* micro.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD21476BE7300DEE054 /* micro.png */; }; + 2211DBE61476BE7300DEE054 /* micro.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD21476BE7300DEE054 /* micro.png */; }; + 2211DBE71476BE7300DEE054 /* pause_inactif.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD31476BE7300DEE054 /* pause_inactif.png */; }; + 2211DBE81476BE7300DEE054 /* pause_inactif.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD31476BE7300DEE054 /* pause_inactif.png */; }; + 2211DBE91476BE7300DEE054 /* pause.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD41476BE7300DEE054 /* pause.png */; }; + 2211DBEA1476BE7300DEE054 /* pause.png in Resources */ = {isa = PBXBuildFile; fileRef = 2211DBD41476BE7300DEE054 /* pause.png */; }; 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2214783B1386A2030020F8B8 /* Localizable.strings */; }; 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB7912F846B1002A5394 /* UICallButton.m */; }; 2214EB8912F84EBB002A5394 /* UIHangUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB8812F84EBB002A5394 /* UIHangUpButton.m */; }; @@ -43,8 +65,8 @@ 22276E8313C73D3100210156 /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8013C73D3100210156 /* libavcodec.a */; }; 22276E8413C73D3100210156 /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8113C73D3100210156 /* libavutil.a */; }; 22276E8513C73D3100210156 /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8213C73D3100210156 /* libswscale.a */; }; - 22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; }; - 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; }; + 22276E8713C73D8A00210156 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 222A483412F7176F0075F07F /* IncallViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 222A483112F7176F0075F07F /* IncallViewController.xib */; }; 223148E41178A08200637D6A /* libilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E31178A08200637D6A /* libilbc.a */; }; 223148E61178A09900637D6A /* libmsilbc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 223148E51178A09900637D6A /* libmsilbc.a */; }; @@ -57,7 +79,7 @@ 2242D9C910D691F900E9963F /* GenericTabViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2242D9C810D691F900E9963F /* GenericTabViewController.m */; }; 2242E313125235120061DDCE /* oldphone-mono-30s.caf in Resources */ = {isa = PBXBuildFile; fileRef = 2242E312125235120061DDCE /* oldphone-mono-30s.caf */; }; 2245671D107699F700F10948 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2245671C107699F700F10948 /* Settings.bundle */; }; - 224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; }; + 224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 2245F78A1201D38000C4179D /* MoreViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22E0A81B111C44E100B04932 /* MoreViewController.xib */; }; 2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */; }; 2248E99F12F801C200220D9C /* LinphoneManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E99E12F801C200220D9C /* LinphoneManager.m */; }; @@ -357,6 +379,17 @@ 2211DB94147564B400DEE054 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = nogpl/Settings.bundle; sourceTree = ""; }; 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; 2211DBBB14769C8200DEE054 /* CallDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallDelegate.m; sourceTree = ""; }; + 2211DBCA1476BE7300DEE054 /* ajouter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ajouter.png; path = Resources/ajouter.png; sourceTree = ""; }; + 2211DBCB1476BE7300DEE054 /* clavier.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = clavier.png; path = Resources/clavier.png; sourceTree = ""; }; + 2211DBCC1476BE7300DEE054 /* contact.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact.png; path = Resources/contact.png; sourceTree = ""; }; + 2211DBCD1476BE7300DEE054 /* effacer.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = effacer.png; path = Resources/effacer.png; sourceTree = ""; }; + 2211DBCE1476BE7300DEE054 /* grouper.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = grouper.png; path = Resources/grouper.png; sourceTree = ""; }; + 2211DBCF1476BE7300DEE054 /* HP_inverse.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = HP_inverse.png; path = Resources/HP_inverse.png; sourceTree = ""; }; + 2211DBD01476BE7300DEE054 /* HP.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = HP.png; path = Resources/HP.png; sourceTree = ""; }; + 2211DBD11476BE7300DEE054 /* micro_inverse.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = micro_inverse.png; path = Resources/micro_inverse.png; sourceTree = ""; }; + 2211DBD21476BE7300DEE054 /* micro.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = micro.png; path = Resources/micro.png; sourceTree = ""; }; + 2211DBD31476BE7300DEE054 /* pause_inactif.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pause_inactif.png; path = Resources/pause_inactif.png; sourceTree = ""; }; + 2211DBD41476BE7300DEE054 /* pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pause.png; path = Resources/pause.png; sourceTree = ""; }; 2214783C1386A2030020F8B8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; 2214EB7812F846B1002A5394 /* UICallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICallButton.h; sourceTree = ""; }; 2214EB7912F846B1002A5394 /* UICallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICallButton.m; sourceTree = ""; }; @@ -514,7 +547,7 @@ 22C7564A13265C6A007BC101 /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = ""; }; 22C7564B13265C6A007BC101 /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = ""; }; 22D1B68012A3E0BE001AE361 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; - 22D8F187147548E2008C97DB /* linphone-nogpl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "linphone-nogpl.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 22D8F187147548E2008C97DB /* linphone-no-gpl-thirdparties.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "linphone-no-gpl-thirdparties.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 22D8F189147548E3008C97DB /* linphone copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "linphone copy-Info.plist"; path = "/Users/jehanmonnier/workspaces/workspace-iphone-port/linphone-iphone/linphone copy-Info.plist"; sourceTree = ""; }; 22E028B413B4CCBD0068A713 /* VideoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoViewController.h; sourceTree = ""; }; 22E028B513B4CCBD0068A713 /* VideoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoViewController.m; sourceTree = ""; }; @@ -683,7 +716,7 @@ isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* linphone.app */, - 22D8F187147548E2008C97DB /* linphone-nogpl.app */, + 22D8F187147548E2008C97DB /* linphone-no-gpl-thirdparties.app */, ); name = Products; sourceTree = ""; @@ -876,12 +909,12 @@ path = speex; sourceTree = ""; }; - 2211DB9614764F6B00DEE054 /* nogpl */ = { + 2211DB9614764F6B00DEE054 /* nogpl-thirdparties */ = { isa = PBXGroup; children = ( 2211DB94147564B400DEE054 /* Settings.bundle */, ); - name = nogpl; + name = "nogpl-thirdparties"; sourceTree = ""; }; 2214EB7012F84668002A5394 /* LinphoneUI */ = { @@ -999,7 +1032,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - 2211DB9614764F6B00DEE054 /* nogpl */, + 2211DB9614764F6B00DEE054 /* nogpl-thirdparties */, 2211DB911475562600DEE054 /* liblinphone.a */, 2211DB8F147555C800DEE054 /* libmediastreamer.a */, 226183AF147259670037138E /* libmssilk.a */, @@ -1068,6 +1101,17 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 2211DBCA1476BE7300DEE054 /* ajouter.png */, + 2211DBCB1476BE7300DEE054 /* clavier.png */, + 2211DBCC1476BE7300DEE054 /* contact.png */, + 2211DBCD1476BE7300DEE054 /* effacer.png */, + 2211DBCE1476BE7300DEE054 /* grouper.png */, + 2211DBCF1476BE7300DEE054 /* HP_inverse.png */, + 2211DBD01476BE7300DEE054 /* HP.png */, + 2211DBD11476BE7300DEE054 /* micro_inverse.png */, + 2211DBD21476BE7300DEE054 /* micro.png */, + 2211DBD31476BE7300DEE054 /* pause_inactif.png */, + 2211DBD41476BE7300DEE054 /* pause.png */, 70571E1913FABCB000CDD3C2 /* rootca.pem */, 22E19E47138A67A000FBFE87 /* missed_call.png */, 228B19AE130290C500F154D3 /* iTunesArtwork */, @@ -1128,9 +1172,9 @@ productReference = 1D6058910D05DD3D006BFB54 /* linphone.app */; productType = "com.apple.product-type.application"; }; - 22D8F11D147548E2008C97DB /* linphone-nogpl */ = { + 22D8F11D147548E2008C97DB /* linphone-no-gpl-thirdparties */ = { isa = PBXNativeTarget; - buildConfigurationList = 22D8F182147548E2008C97DB /* Build configuration list for PBXNativeTarget "linphone-nogpl" */; + buildConfigurationList = 22D8F182147548E2008C97DB /* Build configuration list for PBXNativeTarget "linphone-no-gpl-thirdparties" */; buildPhases = ( 22D8F11E147548E2008C97DB /* Resources */, 22D8F143147548E2008C97DB /* Sources */, @@ -1141,9 +1185,9 @@ ); dependencies = ( ); - name = "linphone-nogpl"; + name = "linphone-no-gpl-thirdparties"; productName = linphone; - productReference = 22D8F187147548E2008C97DB /* linphone-nogpl.app */; + productReference = 22D8F187147548E2008C97DB /* linphone-no-gpl-thirdparties.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -1167,7 +1211,7 @@ projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* linphone */, - 22D8F11D147548E2008C97DB /* linphone-nogpl */, + 22D8F11D147548E2008C97DB /* linphone-no-gpl-thirdparties */, ); }; /* End PBXProject section */ @@ -1213,6 +1257,17 @@ 226B563F13CAF1CD00921595 /* audio.plist in Resources */, 22E1A9E813CAF4AA00219531 /* video.plist in Resources */, 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */, + 2211DBD51476BE7300DEE054 /* ajouter.png in Resources */, + 2211DBD71476BE7300DEE054 /* clavier.png in Resources */, + 2211DBD91476BE7300DEE054 /* contact.png in Resources */, + 2211DBDB1476BE7300DEE054 /* effacer.png in Resources */, + 2211DBDD1476BE7300DEE054 /* grouper.png in Resources */, + 2211DBDF1476BE7300DEE054 /* HP_inverse.png in Resources */, + 2211DBE11476BE7300DEE054 /* HP.png in Resources */, + 2211DBE31476BE7300DEE054 /* micro_inverse.png in Resources */, + 2211DBE51476BE7300DEE054 /* micro.png in Resources */, + 2211DBE71476BE7300DEE054 /* pause_inactif.png in Resources */, + 2211DBE91476BE7300DEE054 /* pause.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1256,6 +1311,17 @@ 22D8F141147548E2008C97DB /* video.plist in Resources */, 22D8F142147548E2008C97DB /* rootca.pem in Resources */, 2211DB95147564B400DEE054 /* Settings.bundle in Resources */, + 2211DBD61476BE7300DEE054 /* ajouter.png in Resources */, + 2211DBD81476BE7300DEE054 /* clavier.png in Resources */, + 2211DBDA1476BE7300DEE054 /* contact.png in Resources */, + 2211DBDC1476BE7300DEE054 /* effacer.png in Resources */, + 2211DBDE1476BE7300DEE054 /* grouper.png in Resources */, + 2211DBE01476BE7300DEE054 /* HP_inverse.png in Resources */, + 2211DBE21476BE7300DEE054 /* HP.png in Resources */, + 2211DBE41476BE7300DEE054 /* micro_inverse.png in Resources */, + 2211DBE61476BE7300DEE054 /* micro.png in Resources */, + 2211DBE81476BE7300DEE054 /* pause_inactif.png in Resources */, + 2211DBEA1476BE7300DEE054 /* pause.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1344,6 +1410,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + armv6, + ); CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -1407,6 +1477,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + armv6, + ); CODE_SIGN_ENTITLEMENTS = untitled.plist; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; @@ -1453,6 +1527,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + arm6, + ); CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -1489,7 +1567,7 @@ "-l", mediastreamer, ); - PRODUCT_NAME = "linphone-nogpl"; + PRODUCT_NAME = "linphone-no-gpl-thirdparties"; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1501,6 +1579,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + arm6, + ); CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -1538,7 +1620,7 @@ "-l", mediastreamer, ); - PRODUCT_NAME = "linphone-nogpl"; + PRODUCT_NAME = "linphone-no-gpl-thirdparties"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1550,6 +1632,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + arm6, + ); CODE_SIGN_ENTITLEMENTS = untitled.plist; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -1587,7 +1673,7 @@ "-l", mediastreamer, ); - PRODUCT_NAME = "linphone-nogpl"; + PRODUCT_NAME = "linphone-no-gpl-thirdparties"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1599,6 +1685,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + arm6, + ); CODE_SIGN_ENTITLEMENTS = untitled.plist; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; @@ -1636,7 +1726,7 @@ "-l", mediastreamer, ); - PRODUCT_NAME = "linphone-nogpl"; + PRODUCT_NAME = "linphone-no-gpl-thirdparties"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; @@ -1665,6 +1755,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + armv6, + ); CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -1729,6 +1823,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD_32_BIT)", + armv6, + ); CODE_SIGN_ENTITLEMENTS = untitled.plist; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; @@ -1802,7 +1900,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - 22D8F182147548E2008C97DB /* Build configuration list for PBXNativeTarget "linphone-nogpl" */ = { + 22D8F182147548E2008C97DB /* Build configuration list for PBXNativeTarget "linphone-no-gpl-thirdparties" */ = { isa = XCConfigurationList; buildConfigurations = ( 22D8F183147548E2008C97DB /* Debug */, diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 03ad7a851..201493d16 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -36,11 +36,7 @@ linphone_configure_controls= \ --disable-x11 \ --with-gsm=$(prefix) \ --disable-tests \ - --with-srtp=$(prefix) \ - SPEEX_CFLAGS="-I$(prefix)/include" \ - SPEEXDSP_CFLAGS="-I$(prefix)/include" \ - SPEEXDSP_LIBS="-L$(prefix)/lib -lspeexdsp" \ - SPEEX_LIBS="-L$(prefix)/lib -lspeexdsp -lspeex " + --with-srtp=$(prefix) #path BUILDER_SRC_DIR?=$(shell pwd)/../ @@ -85,10 +81,13 @@ LIBILBC_SRC_DIR:=$(BUILDER_SRC_DIR)/libilbc-rfc3951 LIBILBC_BUILD_DIR:=$(BUILDER_BUILD_DIR)/libilbc-rfc3951 ifneq (,$(findstring arm,$(host))) - SPEEX_CONFIGURE_OPTION := --enable-fixed-point --disable-float-api + SPEEX_CONFIGURE_OPTION := --enable-fixed-point --disable-float-api #SPEEX_CONFIGURE_OPTION := --enable-arm5e-asm --enable-fixed-point endif +ifneq (,$(findstring armv7,$(host))) + SPEEX_CONFIGURE_OPTION := --enable-fixed-point --disable-float-api +endif prefix?=$(BUILDER_SRC_DIR)/../liblinphone-sdk/$(host) @@ -97,7 +96,7 @@ clean-makefile: clean-makefile-linphone clean: clean-linphone init: mkdir -p $(prefix)/include - mkdir -p $(prefix)/lib + mkdir -p $(prefix)/lib/pkgconfig veryclean: veryclean-linphone rm -rf $(BUILDER_BUILD_DIR) @@ -198,11 +197,10 @@ $(BUILDER_BUILD_DIR)/$(speex_dir)/Makefile: $(BUILDER_SRC_DIR)/$(speex_dir)/conf mkdir -p $(BUILDER_BUILD_DIR)/$(speex_dir) cd $(BUILDER_BUILD_DIR)/$(speex_dir)/\ && CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \ - $(BUILDER_SRC_DIR)/$(speex_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} --disable-oggtest $(SPEEX_CONFIGURE_OPTION) + $(BUILDER_SRC_DIR)/$(speex_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} --disable-ogg $(SPEEX_CONFIGURE_OPTION) build-speex: $(BUILDER_BUILD_DIR)/$(speex_dir)/Makefile - cd $(BUILDER_BUILD_DIR)/$(speex_dir)/libspeex && make && make install - cd $(BUILDER_BUILD_DIR)/$(speex_dir)/include && make && make install + cd $(BUILDER_BUILD_DIR)/$(speex_dir) && make && make install clean-speex: cd $(BUILDER_BUILD_DIR)/$(speex_dir) && make clean diff --git a/submodules/build/iphone-config.site b/submodules/build/iphone-config.site index 558ac7c38..c4c7840a8 100644 --- a/submodules/build/iphone-config.site +++ b/submodules/build/iphone-config.site @@ -28,7 +28,7 @@ SDK_PATH_LIST=`ls -drt /Developer/Platforms/iPhone${PLATFORM}.platform/Developer SDK_BIN_PATH=/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin for SYSROOT_PATH in $SDK_PATH_LIST ; do echo $SYSROOT_PATH ; done ; echo "Selecting SDK path = ${SYSROOT_PATH}" -COMMON_FLAGS=" -arch ${ARCH} ${MCPU} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE -D__IOS" +COMMON_FLAGS=" -arch ${ARCH} ${MCPU} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE=1 -D__IOS" CC="${SDK_BIN_PATH}/gcc -std=c99 $COMMON_FLAGS" OBJC="${SDK_BIN_PATH}/gcc -std=c99 $COMMON_FLAGS" CXX="${SDK_BIN_PATH}/g++ $COMMON_FLAGS" @@ -38,4 +38,4 @@ RANLIB=${SDK_BIN_PATH}/ranlib CPPFLAGS="-Dasm=__asm" LDFLAGS="-Wl,-syslibroot,${SYSROOT_PATH} -framework CFNetwork" -OBJCFLAGS="-x objective-c -fexceptions -fasm-blocks -gdwarf-2 -fobjc-abi-version=2 -fobjc-legacy-dispatch" +OBJCFLAGS="-x objective-c -fexceptions -gdwarf-2 -fobjc-abi-version=2 -fobjc-legacy-dispatch" diff --git a/submodules/externals/speex b/submodules/externals/speex index a6d05eb5f..7657e4041 160000 --- a/submodules/externals/speex +++ b/submodules/externals/speex @@ -1 +1 @@ -Subproject commit a6d05eb5ff9d5062852cdf7df574bec728921ef9 +Subproject commit 7657e404191ce939f79fc571008272b411b52089 diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 5d1a72885..b48894c42 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -19,7 +19,7 @@ 220ED1A113A9039600AC21E0 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A013A9039600AC21E0 /* CoreAudio.framework */; }; 220ED1A313A903BF00AC21E0 /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A213A903BF00AC21E0 /* libgsm.a */; }; 220ED1A713A9040700AC21E0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A613A9040700AC21E0 /* AudioToolbox.framework */; }; - 220ED1A913A9041800AC21E0 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A813A9041800AC21E0 /* AVFoundation.framework */; }; + 220ED1A913A9041800AC21E0 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 220ED1A813A9041800AC21E0 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 220ED1AC13A9062600AC21E0 /* nowebcam.h in Headers */ = {isa = PBXBuildFile; fileRef = 220ED1AA13A9062500AC21E0 /* nowebcam.h */; }; 220ED1AD13A9062600AC21E0 /* nowebcam.c in Sources */ = {isa = PBXBuildFile; fileRef = 220ED1AB13A9062500AC21E0 /* nowebcam.c */; }; 2211DB9C1476539600DEE054 /* l16.c in Sources */ = {isa = PBXBuildFile; fileRef = 2211DB9B1476539600DEE054 /* l16.c */; }; diff --git a/submodules/linphone b/submodules/linphone index 5117bc143..63d70bc59 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 5117bc14390a9029b46684513a7a6a0455dfc3f1 +Subproject commit 63d70bc59f4a3cdc6777ef69ffb793ff73f35414 From 825923eca398ab5c473a60a74989d2be2bb0caa6 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 21 Nov 2011 17:55:11 +0100 Subject: [PATCH 079/122] update exosip for tcp/tls fragmentation fixes --- linphone.xcodeproj/project.pbxproj | 8 ++++---- linphonerc | 5 +++++ submodules/externals/exosip | 2 +- submodules/externals/speex | 2 +- submodules/liblinphone.xcodeproj/project.pbxproj | 15 ++++++++++++--- submodules/linphone | 2 +- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 3e0de55b1..435b22471 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -19,8 +19,6 @@ 220FAD3810765B400068D98F /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2F10765B400068D98F /* libspeex.a */; }; 220FAD3910765B400068D98F /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD3010765B400068D98F /* libspeexdsp.a */; }; 220FAE4B10767A6A0068D98F /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 220FAE4A10767A6A0068D98F /* PhoneMainView.xib */; }; - 2211DB90147555C800DEE054 /* libmediastreamer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB8F147555C800DEE054 /* libmediastreamer.a */; }; - 2211DB921475562600DEE054 /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB911475562600DEE054 /* liblinphone.a */; }; 2211DB95147564B400DEE054 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2211DB94147564B400DEE054 /* Settings.bundle */; }; 2211DBBC14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */; }; 2211DBBD14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */; }; @@ -229,6 +227,8 @@ 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; + F476004B147AAF2800FFF19B /* liblinphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB911475562600DEE054 /* liblinphone.a */; }; + F476004C147AAF4600FFF19B /* libmediastreamer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2211DB8F147555C800DEE054 /* libmediastreamer.a */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -584,8 +584,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2211DB921475562600DEE054 /* liblinphone.a in Frameworks */, - 2211DB90147555C800DEE054 /* libmediastreamer.a in Frameworks */, + F476004C147AAF4600FFF19B /* libmediastreamer.a in Frameworks */, + F476004B147AAF2800FFF19B /* liblinphone.a in Frameworks */, 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */, 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */, 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, diff --git a/linphonerc b/linphonerc index ebdbde64c..def132148 100644 --- a/linphonerc +++ b/linphonerc @@ -6,6 +6,11 @@ mtu=0 [sip] sip_random_port=1 +sip_port=5060 +sip_tcp_random_port=1 +sip_tcp_port=0 +sip_tls_random_port=1 +sip_tls_port=0 guess_hostname=1 contact=sip:toto@unknown-host inc_timeout=15 diff --git a/submodules/externals/exosip b/submodules/externals/exosip index ce927e6b8..f28804413 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit ce927e6b891a9d9129ab50d0666f6f22f37228a1 +Subproject commit f288044136b3e60baf6c0805e8cf87e5cdbc7890 diff --git a/submodules/externals/speex b/submodules/externals/speex index 7657e4041..418ee578c 160000 --- a/submodules/externals/speex +++ b/submodules/externals/speex @@ -1 +1 @@ -Subproject commit 7657e404191ce939f79fc571008272b411b52089 +Subproject commit 418ee578c1f0870ff5bd348f0d2f432bb8f9d17a diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index b48894c42..5a4637662 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -1326,7 +1326,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + ARCHS = ( + armv6, + "$(ARCHS_STANDARD_32_BIT)", + ); COPY_PHASE_STRIP = NO; DSTROOT = /tmp/liblinphone.dst; GCC_DYNAMIC_NO_PIC = NO; @@ -1385,7 +1388,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + ARCHS = ( + armv6, + "$(ARCHS_STANDARD_32_BIT)", + ); DSTROOT = /tmp/liblinphone.dst; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -1566,7 +1572,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + ARCHS = ( + armv6, + "$(ARCHS_STANDARD_32_BIT)", + ); DSTROOT = /tmp/liblinphone.dst; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; diff --git a/submodules/linphone b/submodules/linphone index 63d70bc59..0d04b9451 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 63d70bc59f4a3cdc6777ef69ffb793ff73f35414 +Subproject commit 0d04b9451bf845e8bd7f047504f689292e099554 From 70b09a269442df7e920a5fbea05770946e13fb32 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 21 Nov 2011 18:17:36 +0100 Subject: [PATCH 080/122] add *addvideo* button --- Classes/IncallViewController.h | 2 + Classes/IncallViewController.m | 18 +++ Classes/IncallViewController.xib | 213 +++++++++++++++++++++++++- Classes/LinphoneUI/LinphoneManager.m | 1 + Classes/LinphoneUI/UIAddVideoButton.h | 24 +++ Classes/LinphoneUI/UIAddVideoButton.m | 58 +++++++ Classes/LinphoneUI/UICallButton.m | 11 +- Settings.bundle/video.plist | 10 ++ linphone.xcodeproj/project.pbxproj | 8 + 9 files changed, 337 insertions(+), 8 deletions(-) create mode 100644 Classes/LinphoneUI/UIAddVideoButton.h create mode 100644 Classes/LinphoneUI/UIAddVideoButton.m diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 071b37419..55b5fe2eb 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -34,6 +34,7 @@ UIButton* pause; UISpeakerButton* speaker; UIButton* contacts; + UIButton* addVideo; UITableView* callTableView; UIButton* addCall, *mergeCalls, *addToConf; @@ -89,6 +90,7 @@ @property (nonatomic, retain) IBOutlet UIButton* pause; @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UIButton* contacts; +@property (nonatomic, retain) IBOutlet UIButton* addVideo; @property (nonatomic, retain) IBOutlet UITableView* callTableView; @property (nonatomic, retain) IBOutlet UIButton* addCall; @property (nonatomic, retain) IBOutlet UIButton* mergeCalls; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 7d9f6adeb..8c7cbcc39 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -184,6 +184,24 @@ int callCount(LinphoneCore* lc) { withDisplayName:nil]; } + + + UIDevice* device = [UIDevice currentDevice]; + if ([device respondsToSelector:@selector(isMultitaskingSupported)] + && [device isMultitaskingSupported]) { + bool enableVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_video_preference"]; + bool startVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"start_video_preference"]; + if (enableVideo && !startVideo) { + [addVideo setHidden:FALSE]; + [contacts setHidden:TRUE]; + } else { + [addVideo setHidden:TRUE]; + [contacts setHidden:FALSE]; + } + + + } + } } diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index 678052028..f04038910 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -137,7 +137,7 @@ {{107, 70}, {106, 66}} - + NO NO @@ -215,7 +215,7 @@ {{0, 70}, {107, 66}} - + NO NO @@ -241,7 +241,7 @@ {{213, 70}, {107, 66}} - + NO NO @@ -264,6 +264,29 @@

+ + + -2147483356 + {{213, 70}, {107, 66}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + video + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + 292 @@ -326,7 +349,7 @@ {{107, 70}, {106, 66}} - + NO NO @@ -908,6 +931,14 @@ 114
+ + + addVideo + + + + 125 + doAction: @@ -1127,6 +1158,7 @@ + controls @@ -1173,6 +1205,12 @@ merge + + 123 + + + video +
@@ -1191,6 +1229,8 @@ 113.IBPluginDependency 113.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 120.IBPluginDependency + 123.CustomClassName + 123.IBPluginDependency 13.CustomClassName 13.IBPluginDependency 13.IBUIButtonInspectorSelectedStateConfigurationMetadataKey @@ -1245,6 +1285,8 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIAddVideoButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1298,7 +1340,7 @@ - 122 + 125
@@ -1323,6 +1365,7 @@ YES addCall addToConf + addVideo callControlSubView callTableView close @@ -1347,12 +1390,14 @@ star three two + videoViewController zero YES UIButton UIButton + UIButton UIView UITableView UIButton @@ -1377,6 +1422,7 @@ UIButton UIButton UIButton + VideoViewController UIButton @@ -1386,6 +1432,7 @@ YES addCall addToConf + addVideo callControlSubView callTableView close @@ -1410,6 +1457,7 @@ star three two + videoViewController zero
@@ -1422,6 +1470,10 @@ addToConf UIButton + + addVideo + UIButton + callControlSubView UIView @@ -1518,6 +1570,10 @@ two UIButton + + videoViewController + VideoViewController + zero UIButton @@ -1529,6 +1585,33 @@ ./Classes/IncallViewController.h
+ + UIAddVideoButton + UIButton + + IBProjectSource + ./Classes/UIAddVideoButton.h + + + + UICamSwitch + UIButton + + preview + UIView + + + preview + + preview + UIView + + + + IBProjectSource + ./Classes/UICamSwitch.h + + UIDigitButton UIButton @@ -1537,6 +1620,14 @@ ./Classes/UIDigitButton.h
+ + UIHangUpButton + UIButton + + IBProjectSource + ./Classes/UIHangUpButton.h + + UIMuteButton UIToggleButton @@ -1561,6 +1652,116 @@ ./Classes/UIToggleButton.h
+ + VideoViewController + UIViewController + + YES + + YES + mCamSwitch + mCamSwitchLand + mDisplay + mDisplayLand + mHangUp + mHangUpLand + mLandscape + mMute + mMuteLand + mPortrait + mPreview + mPreviewLand + + + YES + UICamSwitch + UICamSwitch + UIView + UIView + UIHangUpButton + UIHangUpButton + UIView + UIMuteButton + UIMuteButton + UIView + UIView + UIView + + + + YES + + YES + mCamSwitch + mCamSwitchLand + mDisplay + mDisplayLand + mHangUp + mHangUpLand + mLandscape + mMute + mMuteLand + mPortrait + mPreview + mPreviewLand + + + YES + + mCamSwitch + UICamSwitch + + + mCamSwitchLand + UICamSwitch + + + mDisplay + UIView + + + mDisplayLand + UIView + + + mHangUp + UIHangUpButton + + + mHangUpLand + UIHangUpButton + + + mLandscape + UIView + + + mMute + UIMuteButton + + + mMuteLand + UIMuteButton + + + mPortrait + UIView + + + mPreview + UIView + + + mPreviewLand + UIView + + + + + IBProjectSource + ./Classes/VideoViewController.h + +
0 @@ -1604,7 +1805,7 @@ {82, 75} {164, 104} {164, 104} - {82, 82} + {20, 20} {164, 104} {164, 104} {164, 104} diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 7db2ccd9e..4de33f114 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -560,6 +560,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach bool enableVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_video_preference"]; linphone_core_enable_video(theLinphoneCore, enableVideo, enableVideo); + bool enableSrtp = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_srtp_preference"]; linphone_core_set_media_encryption(theLinphoneCore, enableSrtp?LinphoneMediaEncryptionSRTP:LinphoneMediaEncryptionNone); diff --git a/Classes/LinphoneUI/UIAddVideoButton.h b/Classes/LinphoneUI/UIAddVideoButton.h new file mode 100644 index 000000000..275de0672 --- /dev/null +++ b/Classes/LinphoneUI/UIAddVideoButton.h @@ -0,0 +1,24 @@ +/* UIAddVideoButton.h + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +@interface UIAddVideoButton : UIButton +- (id)initWithCoder:(NSCoder *)decoder; +@end diff --git a/Classes/LinphoneUI/UIAddVideoButton.m b/Classes/LinphoneUI/UIAddVideoButton.m new file mode 100644 index 000000000..e34cdfb8f --- /dev/null +++ b/Classes/LinphoneUI/UIAddVideoButton.m @@ -0,0 +1,58 @@ +/* UIAddVideoButton.m + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UIAddVideoButton.h" +#include "LinphoneManager.h" + +@implementation UIAddVideoButton + +-(void) touchUp:(id) sender { + LinphoneCore* lc = [LinphoneManager getLc]; + LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); + if (call) { + LinphoneCallParams* call_params = linphone_call_params_copy(linphone_call_get_current_params(call)); + linphone_call_params_enable_video(call_params, TRUE); + linphone_core_update_call(lc, call, call_params); + linphone_call_params_destroy(call_params); + } { + ms_warning("Cannot add video, because no current call"); + } +} + +- (id) init { + [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; + return self; +} +- (id)initWithFrame:(CGRect)frame { + + self = [super initWithFrame:frame]; + if (self) { + [self init]; + } + return self; +} +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self init]; + } + return self; +} + +@end diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m index a63167009..82726e6c8 100644 --- a/Classes/LinphoneUI/UICallButton.m +++ b/Classes/LinphoneUI/UICallButton.m @@ -36,10 +36,12 @@ LinphoneProxyConfig* proxyCfg; //get default proxy linphone_core_get_default_proxy([LinphoneManager getLc],&proxyCfg); + bool startVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"start_video_preference"]; + LinphoneCallParams* lcallParams = linphone_core_create_default_call_parameters([LinphoneManager getLc]); if ([mAddress.text length] == 0) return; //just return if ([mAddress.text hasPrefix:@"sip:"]) { - linphone_core_invite([LinphoneManager getLc], [mAddress.text cStringUsingEncoding:[NSString defaultCStringEncoding]]); + linphone_core_invite_with_params([LinphoneManager getLc],[mAddress.text cStringUsingEncoding:[NSString defaultCStringEncoding]],lcallParams); } else if ( proxyCfg==nil){ UIAlertView* error = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Invalid sip address",nil) message:NSLocalizedString(@"Either configure a SIP proxy server from settings prior to place a call or use a valid sip address (I.E sip:john@example.net)",nil) @@ -61,9 +63,14 @@ LinphoneAddress* tmpAddress = linphone_address_new(linphone_core_get_identity([LinphoneManager getLc])); linphone_address_set_username(tmpAddress,normalizedUserName); linphone_address_set_display_name(tmpAddress,[mDisplayName.text length]>0?[mDisplayName.text cStringUsingEncoding:[NSString defaultCStringEncoding]]:nil); - linphone_core_invite([LinphoneManager getLc],linphone_address_as_string(tmpAddress)) ; + + + linphone_call_params_enable_video(lcallParams,startVideo); + linphone_core_invite_address_with_params([LinphoneManager getLc],tmpAddress,lcallParams) ; + linphone_address_destroy(tmpAddress); } + linphone_call_params_destroy(lcallParams); } else if (linphone_core_inc_invite_pending([LinphoneManager getLc])) { linphone_core_accept_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); } diff --git a/Settings.bundle/video.plist b/Settings.bundle/video.plist index 6123f2a4b..440f5ad90 100644 --- a/Settings.bundle/video.plist +++ b/Settings.bundle/video.plist @@ -14,6 +14,16 @@ DefaultValue + + Type + PSToggleSwitchSpecifier + Title + Automatically start video + Key + start_video_preference + DefaultValue + + Title Codecs diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 3e0de55b1..b7a43f251 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -114,6 +114,8 @@ 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */; }; 22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22C7555F1317E59C007BC101 /* UIBluetoothButton.m */; }; 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; + 22D817AD147A9F33001CFB9C /* UIAddVideoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D817AC147A9F33001CFB9C /* UIAddVideoButton.m */; }; + 22D817AE147A9F33001CFB9C /* UIAddVideoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D817AC147A9F33001CFB9C /* UIAddVideoButton.m */; }; 22D8F11F147548E2008C97DB /* linphonerc in Resources */ = {isa = PBXBuildFile; fileRef = 2274550710700509006EC466 /* linphonerc */; }; 22D8F120147548E2008C97DB /* PhoneViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22F2508D107141E100AC9B3F /* PhoneViewController.xib */; }; 22D8F121147548E2008C97DB /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; @@ -547,6 +549,8 @@ 22C7564A13265C6A007BC101 /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = ""; }; 22C7564B13265C6A007BC101 /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = ""; }; 22D1B68012A3E0BE001AE361 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; + 22D817AB147A9F33001CFB9C /* UIAddVideoButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAddVideoButton.h; sourceTree = ""; }; + 22D817AC147A9F33001CFB9C /* UIAddVideoButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAddVideoButton.m; sourceTree = ""; }; 22D8F187147548E2008C97DB /* linphone-no-gpl-thirdparties.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "linphone-no-gpl-thirdparties.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 22D8F189147548E3008C97DB /* linphone copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "linphone copy-Info.plist"; path = "/Users/jehanmonnier/workspaces/workspace-iphone-port/linphone-iphone/linphone copy-Info.plist"; sourceTree = ""; }; 22E028B413B4CCBD0068A713 /* VideoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoViewController.h; sourceTree = ""; }; @@ -947,6 +951,8 @@ 223963161393CFAF001DE689 /* FastAddressBook.m */, 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */, 22AA8B0013D83F6300B30535 /* UICamSwitch.m */, + 22D817AB147A9F33001CFB9C /* UIAddVideoButton.h */, + 22D817AC147A9F33001CFB9C /* UIAddVideoButton.m */, ); path = LinphoneUI; sourceTree = ""; @@ -1357,6 +1363,7 @@ 2211DBBC14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */, 2211DBBE14769C8300DEE054 /* CallDelegate.m in Sources */, 2211DBC014769CB200DEE054 /* IncallViewController.m in Sources */, + 22D817AD147A9F33001CFB9C /* UIAddVideoButton.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1389,6 +1396,7 @@ 2211DBBD14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */, 2211DBBF14769C8300DEE054 /* CallDelegate.m in Sources */, 2211DBC114769CB300DEE054 /* IncallViewController.m in Sources */, + 22D817AE147A9F33001CFB9C /* UIAddVideoButton.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From d6ea52ed1aea9adcd5617ea20c6ac475c07cd040 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 22 Nov 2011 16:09:14 +0100 Subject: [PATCH 081/122] New speex version --- submodules/build/builder-iphone-os.mk | 9 +++++---- submodules/externals/speex | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index 201493d16..c04473289 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -81,12 +81,13 @@ LIBILBC_SRC_DIR:=$(BUILDER_SRC_DIR)/libilbc-rfc3951 LIBILBC_BUILD_DIR:=$(BUILDER_BUILD_DIR)/libilbc-rfc3951 ifneq (,$(findstring arm,$(host))) - SPEEX_CONFIGURE_OPTION := --enable-fixed-point --disable-float-api - #SPEEX_CONFIGURE_OPTION := --enable-arm5e-asm --enable-fixed-point + #SPEEX_CONFIGURE_OPTION := --enable-fixed-point --disable-float-api + CFLAGS := $(CFLAGS) -marm + SPEEX_CONFIGURE_OPTION := --disable-float-api --enable-arm5e-asm --enable-fixed-point endif ifneq (,$(findstring armv7,$(host))) - SPEEX_CONFIGURE_OPTION := --enable-fixed-point --disable-float-api + SPEEX_CONFIGURE_OPTION += --enable-armv7neon-asm endif prefix?=$(BUILDER_SRC_DIR)/../liblinphone-sdk/$(host) @@ -196,7 +197,7 @@ $(BUILDER_SRC_DIR)/$(speex_dir)/configure: $(BUILDER_BUILD_DIR)/$(speex_dir)/Makefile: $(BUILDER_SRC_DIR)/$(speex_dir)/configure mkdir -p $(BUILDER_BUILD_DIR)/$(speex_dir) cd $(BUILDER_BUILD_DIR)/$(speex_dir)/\ - && CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \ + && CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) CFLAGS="$(CFLAGS) -O2" \ $(BUILDER_SRC_DIR)/$(speex_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} --disable-ogg $(SPEEX_CONFIGURE_OPTION) build-speex: $(BUILDER_BUILD_DIR)/$(speex_dir)/Makefile diff --git a/submodules/externals/speex b/submodules/externals/speex index 418ee578c..06a869e4a 160000 --- a/submodules/externals/speex +++ b/submodules/externals/speex @@ -1 +1 @@ -Subproject commit 418ee578c1f0870ff5bd348f0d2f432bb8f9d17a +Subproject commit 06a869e4a71941d24bacbf08289a6319c920973c From ece70fec20caa571975cf6be0a81273758c8e66a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 22 Nov 2011 17:25:27 +0100 Subject: [PATCH 082/122] remove old monolithic incall view --- Classes/AdvancedPhoneViewController.h | 28 --- Classes/AdvancedPhoneViewController.m | 92 ------- Classes/IncallViewController.h | 2 +- Classes/IncallViewController.m | 71 +++--- Classes/IncallViewController.xib | 25 +- Classes/LinphoneUI/LinphoneManager.m | 8 +- Classes/LinphoneUI/LinphoneUIDelegates.h | 1 - Classes/LinphoneUI/UIHangUpButton.m | 12 + Classes/PhoneViewController.h | 29 +-- Classes/PhoneViewController.m | 152 +++++------- Classes/PhoneViewController.xib | 297 ++++++++--------------- PhoneMainView.xib | 26 +- linphone.xcodeproj/project.pbxproj | 6 - 13 files changed, 255 insertions(+), 494 deletions(-) delete mode 100644 Classes/AdvancedPhoneViewController.h delete mode 100644 Classes/AdvancedPhoneViewController.m diff --git a/Classes/AdvancedPhoneViewController.h b/Classes/AdvancedPhoneViewController.h deleted file mode 100644 index 411c90615..000000000 --- a/Classes/AdvancedPhoneViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* AdvancedPhoneViewController.h - * - * Copyright (C) 2009 Belledonne Comunications, Grenoble, France - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#import -#import "PhoneViewController.h" - - -@interface AdvancedPhoneViewController : PhoneViewController { - IncallViewController* mIncallViewController; -} - -@end diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m deleted file mode 100644 index 6cc2a0eb6..000000000 --- a/Classes/AdvancedPhoneViewController.m +++ /dev/null @@ -1,92 +0,0 @@ -/* AdvancedPhoneViewController.m - * - * Copyright (C) 2009 Belledonne Comunications, Grenoble, France - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#import "AdvancedPhoneViewController.h" -#import "IncallViewController.h" - -@implementation AdvancedPhoneViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - mIncallViewController = [[IncallViewController alloc] initWithNibName:@"IncallViewController" - bundle:[NSBundle mainBundle]]; -} - --(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [super displayDialerFromUI:viewCtrl - forUser:username - withDisplayName:displayName]; - - [mIncallViewController displayDialerFromUI:viewCtrl - forUser:username - withDisplayName:displayName]; - -} --(void) displayCall: (LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - /*[super displayCallInProgressFromUI:viewCtrl - forUser:username - withDisplayName:displayName];*/ - - [self presentModalViewController:mIncallViewController animated:true]; - - [mIncallViewController displayCall:call InProgressFromUI:viewCtrl - forUser:username - withDisplayName:displayName]; - -} - --(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - if (self.presentedViewController != mIncallViewController && (call == 0x0 || - linphone_call_get_dir(call)==LinphoneCallIncoming)){ - [self presentModalViewController:mIncallViewController animated:true]; - } - - [super displayInCall:call FromUI:viewCtrl - forUser:username - withDisplayName:displayName]; - - [mIncallViewController displayInCall:call FromUI:viewCtrl - forUser:username - withDisplayName:displayName]; - -} --(void) displayStatus:(NSString*) message { - [super displayStatus:message]; - [mIncallViewController displayStatus:message]; -} - --(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl { - [super updateUIFromLinphoneState:viewCtrl]; - - [mIncallViewController updateUIFromLinphoneState:viewCtrl]; -} - --(void) displayVideoCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [mIncallViewController displayVideoCall:call FromUI:viewCtrl - forUser:username - withDisplayName:displayName]; -} -- (void)dealloc { - [mIncallViewController release]; - [super dealloc]; - -} - - -@end diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 55b5fe2eb..f50953aeb 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -66,7 +66,7 @@ ABPeoplePickerNavigationController* myPeoplePickerController; - LinphoneCall* selectedCall; + VideoViewController* mVideoViewController; BOOL mVideoShown; BOOL mVideoIsPending; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 8c7cbcc39..cb589b6fb 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -111,7 +111,7 @@ int callCount(LinphoneCore* lc) { [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchDown]; [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; - [endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; + //[endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; [addToConf addTarget:self action:@selector(addToConfCallPressed) forControlEvents:UIControlEventTouchUpInside]; [pause addTarget:self action:@selector(pauseCallPressed) forControlEvents:UIControlEventTouchUpInside]; [mergeCalls setHidden:YES]; @@ -134,13 +134,15 @@ int callCount(LinphoneCore* lc) { } -(void) addToConfCallPressed { - if (!selectedCall) + LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); + if (!selectedCall) return; linphone_core_add_to_conference([LinphoneManager getLc], selectedCall); } -(void) pauseCallPressed { - if (!selectedCall) + LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); + if (!selectedCall) return; if (linphone_call_get_state(selectedCall) == LinphoneCallPaused) { [pause setSelected:NO]; @@ -223,7 +225,7 @@ int callCount(LinphoneCore* lc) { -(void) displayStatus:(NSString*) message; { - [self updateUIFromLinphoneState: nil]; + } -(void) displayPad:(bool) enable { @@ -236,9 +238,10 @@ int callCount(LinphoneCore* lc) { //restaure view [self displayPad:false]; dismissed = false; - - if (call) - selectedCall = call; + UIDevice *device = [UIDevice currentDevice]; + device.proximityMonitoringEnabled = YES; + if ([speaker isOn]) + [speaker toggle]; [self updateUIFromLinphoneState: nil]; } @@ -246,15 +249,27 @@ int callCount(LinphoneCore* lc) { } +-(void) dismissVideoView { + [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; + [self dismissModalViewControllerAnimated:FALSE];//just in case + mVideoShown=FALSE; +} -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { dismissed = false; - if (call) - selectedCall = call; - [self updateUIFromLinphoneState: nil]; + UIDevice *device = [UIDevice currentDevice]; + device.proximityMonitoringEnabled = YES; + if (call !=nil && linphone_call_get_dir(call)==LinphoneCallIncoming) { + if ([speaker isOn]) [speaker toggle]; + } + [self updateUIFromLinphoneState: nil]; + if (self.presentedViewController == (UIViewController*)mVideoViewController) { + [self dismissVideoView]; + } } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { UIViewController* modalVC = self.modalViewController; - + UIDevice *device = [UIDevice currentDevice]; + device.proximityMonitoringEnabled = NO; if (modalVC != nil) { // clear previous native window ids if (modalVC == mVideoViewController) { @@ -282,7 +297,6 @@ int callCount(LinphoneCore* lc) { } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; - // if ( // [pause reset]; @@ -304,7 +318,7 @@ int callCount(LinphoneCore* lc) { } @catch (NSException* exc) { return; } - + LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); // hide call control subview if no call selected [callControlSubView setHidden:(selectedCall == NULL)]; // hide add to conf if no conf exist @@ -320,13 +334,11 @@ int callCount(LinphoneCore* lc) { else if (linphone_call_get_state(selectedCall)==LinphoneCallPaused) { [pause setHidden:NO]; //[pause setTitle:@"Resume" forState:UIControlStateNormal]; - // pause.selected = YES; - pause.highlighted = NO; + pause.selected = YES; } else if (callCount(lc) == callsCount && callsCount == 1) { [pause setHidden:NO]; //[pause setTitle:@"Pause" forState:UIControlStateNormal]; - // pause.selected = NO; - pause.highlighted = NO; + pause.selected = NO; } else { [pause setHidden:YES]; } @@ -480,8 +492,7 @@ int callCount(LinphoneCore* lc) { }*/ - - + LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); if (call == selectedCall) { [cell setSelected:YES animated:NO]; [callTableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone]; @@ -519,6 +530,7 @@ int callCount(LinphoneCore* lc) { //if (call == selectedCall) // [self updateActive:YES cell:cell]; + LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); if (call == selectedCall) { [callTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; cell.selected = YES; @@ -625,7 +637,7 @@ int callCount(LinphoneCore* lc) { bool inConf = (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0); - selectedCall = [self retrieveCallAtIndex:indexPath.row inConference:inConf]; + LinphoneCall* selectedCall = [self retrieveCallAtIndex:indexPath.row inConference:inConf]; if (inConf) { if (linphone_core_is_in_conference(lc)) @@ -644,24 +656,5 @@ int callCount(LinphoneCore* lc) { [self updateUIFromLinphoneState: nil]; } --(void) endCallPressed { - if (selectedCall == NULL) { - ms_error("No selected call"); - return; - } - - LinphoneCore* lc = [LinphoneManager getLc]; - if (isInConference(selectedCall)) { - linphone_core_terminate_conference(lc); - /* - linphone_core_remove_from_conference(lc, selectedCall); - if ((linphone_core_get_conference_size(lc) - (int)linphone_core_is_in_conference(lc)) == 0) - linphone_core_terminate_conference(lc); - */ - } else { - linphone_core_terminate_call(lc, selectedCall); - } - selectedCall = NULL; -} @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index f04038910..3e1b63885 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -241,7 +241,7 @@ {{213, 70}, {107, 66}} - + NO NO @@ -264,7 +264,7 @@
- + -2147483356 {{213, 70}, {107, 66}} @@ -277,13 +277,18 @@ IBCocoaTouchFramework 0 0 + 1 video 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + + + NSImage + clavier-01-160px.png + @@ -935,7 +940,7 @@ addVideo - + 125 @@ -1158,7 +1163,7 @@ - +
controls @@ -1207,7 +1212,7 @@
123 - + video @@ -1239,6 +1244,7 @@ 16.IBPluginDependency 16.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 17.IBPluginDependency + 18.CustomClassName 18.IBPluginDependency 2.IBPluginDependency 26.IBPluginDependency @@ -1283,18 +1289,19 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIAddVideoButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1784,6 +1791,7 @@ HP_inverse.png ajouter.png clavier-01-106px.png + clavier-01-160px.png clavier.png conf_merge.png contact.png @@ -1801,6 +1809,7 @@ {164, 104} {164, 104} {106, 60} + {160, 60} {164, 104} {82, 75} {164, 104} diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 4de33f114..48515e956 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -206,7 +206,12 @@ extern void libmssilk_init(); [callDelegate displayDialerFromUI:mCurrentViewController forUser:@"" withDisplayName:@""]; - } + } else { + [callDelegate displayInCall:call + FromUI:mCurrentViewController + forUser:lUserName + withDisplayName:lDisplayName]; + } break; default: break; @@ -816,7 +821,6 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach linphone_core_resume_call(theLinphoneCore, (LinphoneCall*) c->data); } - [callDelegate updateUIFromLinphoneState:mCurrentViewController]; } diff --git a/Classes/LinphoneUI/LinphoneUIDelegates.h b/Classes/LinphoneUI/LinphoneUIDelegates.h index 47e28ebd6..1f2938cfe 100644 --- a/Classes/LinphoneUI/LinphoneUIDelegates.h +++ b/Classes/LinphoneUI/LinphoneUIDelegates.h @@ -26,7 +26,6 @@ -(void) displayIncomingCall: (LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; -(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; -(void) displayVideoCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl; //status reporting -(void) displayStatus:(NSString*) message; @end diff --git a/Classes/LinphoneUI/UIHangUpButton.m b/Classes/LinphoneUI/UIHangUpButton.m index ffb57a87f..a7a291e61 100644 --- a/Classes/LinphoneUI/UIHangUpButton.m +++ b/Classes/LinphoneUI/UIHangUpButton.m @@ -30,6 +30,18 @@ if (call) linphone_core_terminate_call(lc,call); + else if (linphone_core_is_in_conference(lc)) { + linphone_core_terminate_conference(lc); + } else { + const MSList* calls = linphone_core_get_calls(lc); + if (ms_list_size(calls) == 1 + && !linphone_call_params_local_conference_mode(linphone_call_get_current_params((LinphoneCall*)(calls->data)))) { + //Only one call in the list, hangin up! + linphone_core_terminate_call(lc,(LinphoneCall*)(calls->data)); + } else { + ms_message("Cannot make a decision on which call to terminate"); + } + } } - (id)initWithFrame:(CGRect)frame { diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index a9bd56576..b9f5f09e2 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -35,18 +35,9 @@ UITextField* address; UILabel* mDisplayName; UIEraseButton* erase; + UICallButton* callShort; + UICallButton* callLarge; - UIView* incallView; - UIButton* backToCallView; - UIDuration* callDuration; - UIMuteButton* mute; - UISpeakerButton* speaker; - UILabel* peerLabel; - - - UICallButton* __call; - UIHangUpButton* hangup; - UILabel* status; //key pad @@ -64,30 +55,24 @@ UIDigitButton* hash; UIButton* back; + UIButton* backToCallView; UITabBarController* myTabBarController; UIActionSheet *mIncomingCallActionSheet; FirstLoginViewController* myFirstLoginViewController; - + IncallViewController* mIncallViewController; } @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UITextField* address; -@property (nonatomic, retain) IBOutlet UIButton* __call; +@property (nonatomic, retain) IBOutlet UIButton* callShort; +@property (nonatomic, retain) IBOutlet UIButton* callLarge; @property (nonatomic, retain) IBOutlet UIButton* hangup; @property (nonatomic, retain) IBOutlet UILabel* status; @property (nonatomic, retain) IBOutlet UIEraseButton* erase; -@property (nonatomic, retain) IBOutlet UIView* incallView; -@property (nonatomic, retain) IBOutlet UILabel* callDuration; -@property (nonatomic, retain) IBOutlet UIButton* mute; -@property (nonatomic, retain) IBOutlet UIButton* speaker; -@property (nonatomic, retain) IBOutlet UILabel* peerLabel; - -@property (nonatomic, retain) IBOutlet UIButton* backToCallView; - @property (nonatomic, retain) IBOutlet UIButton* one; @property (nonatomic, retain) IBOutlet UIButton* two; @property (nonatomic, retain) IBOutlet UIButton* three; @@ -102,7 +87,7 @@ @property (nonatomic, retain) IBOutlet UIButton* hash; @property (nonatomic, retain) IBOutlet UIButton* back; - +@property (nonatomic, retain) IBOutlet UIButton* backToCallView; // method to handle keypad event diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index ba8654af1..52a28a922 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -28,17 +28,11 @@ @implementation PhoneViewController @synthesize dialerView ; @synthesize address ; -@synthesize __call; +@synthesize callShort; +@synthesize callLarge; @synthesize hangup; @synthesize status; @synthesize erase; -@synthesize backToCallView; - -@synthesize incallView; -@synthesize callDuration; -@synthesize mute; -@synthesize speaker; -@synthesize peerLabel; @synthesize one; @synthesize two; @@ -55,7 +49,7 @@ @synthesize back; @synthesize myTabBarController; - +@synthesize backToCallView; //implements keypad behavior @@ -72,7 +66,6 @@ - (void)viewDidAppear:(BOOL)animated { [[UIApplication sharedApplication] setIdleTimerDisabled:true]; - [mute reset]; if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enable_first_login_view_preference"] == true) { myFirstLoginViewController = [[FirstLoginViewController alloc] initWithNibName:@"FirstLoginViewController" bundle:[NSBundle mainBundle]]; @@ -81,10 +74,6 @@ }; } -- (void)viewDidDisappear:(BOOL)animated { - -} - // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { @@ -103,21 +92,16 @@ [nine initWithNumber:'9' addressField:address dtmf:false]; [star initWithNumber:'*' addressField:address dtmf:false]; [hash initWithNumber:'#' addressField:address dtmf:false]; - [__call initWithAddress:address withDisplayName:mDisplayName]; - [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; + [callShort initWithAddress:address withDisplayName:mDisplayName]; + [callLarge initWithAddress:address withDisplayName:mDisplayName]; [erase initWithAddressField:address]; - [backToCallView addTarget:self action:@selector(backToCallViewPressed) forControlEvents:UIControlEventTouchUpInside]; + mIncallViewController = [[IncallViewController alloc] initWithNibName:@"IncallViewController" + bundle:[NSBundle mainBundle]]; } --(void) backToCallViewPressed { - [self displayInCall: nil - FromUI:nil - forUser:nil - withDisplayName:nil]; -} + /* @@ -139,9 +123,6 @@ // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } -- (void) viewWillAppear:(BOOL)animated { - -} - (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == address) { @@ -167,79 +148,32 @@ } } - [address setHidden:false]; if (username) { [address setText:username]; } //else keep previous [mDisplayName setText:displayName]; - [incallView setHidden:true]; - [dialerView setHidden:false]; - - [__call setEnabled:true]; - [hangup setEnabled:false]; - - [callDuration stop]; - UIDevice *device = [UIDevice currentDevice]; - device.proximityMonitoringEnabled = NO; + [callLarge setHidden:FALSE]; + [callShort setHidden:TRUE]; + [backToCallView setHidden:TRUE]; - [peerLabel setText:@""]; if ([[NSUserDefaults standardUserDefaults] boolForKey:@"firstlogindone_preference" ] == true) { //first login case, dismmis first login view [self dismissModalViewControllerAnimated:true]; }; + [mIncallViewController displayDialerFromUI:viewCtrl + forUser:username + withDisplayName:displayName]; + [myTabBarController setSelectedIndex:DIALER_TAB_INDEX]; } --(void) displayInCall: (LinphoneCall*) call ViewforUser:(NSString*) username withDisplayName:(NSString*) displayName { - UIDevice *device = [UIDevice currentDevice]; - device.proximityMonitoringEnabled = YES; - if (device.proximityMonitoringEnabled == YES) { - ms_message("Ok this device support proximity, and I just enabled it"); - } - [hangup setEnabled:true]; - if (displayName && [displayName length]>0) { - [peerLabel setText:displayName]; - } else { - [peerLabel setText:username?username:@""]; - } - [incallView setHidden:NO]; -} --(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [self displayInCall: call ViewforUser:username - withDisplayName:displayName]; - //[__call setEnabled:false]; - [callDuration setText:NSLocalizedString(@"Calling...",nil)]; - if ([speaker isOn]) [speaker toggle] ; //preset to off - - [incallView setHidden:NO]; -} - --(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [callDuration start]; - [callDuration setHidden:false]; - - if (linphone_call_get_dir(linphone_core_get_current_call([LinphoneManager getLc])) == LinphoneCallIncoming) { - [self displayInCall: call ViewforUser:username - withDisplayName:displayName]; - if ([speaker isOn]) [speaker toggle] ; //preset to off; - } - - [incallView setHidden:NO]; -} - --(void) displayVideoCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - ms_message("basic phone view does not support video"); -} //status reporting -(void) displayStatus:(NSString*) message { [status setText:message]; -} - --(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl { - [mute reset]; + [mIncallViewController displayStatus:message]; } @@ -277,6 +211,51 @@ } } + +-(void) backToCallViewPressed { + [self displayInCall: nil + FromUI:nil + forUser:nil + withDisplayName:nil]; +} + +-(void) displayCall: (LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + if (self.presentedViewController != (UIViewController*)mIncallViewController) { + [self presentModalViewController:(UIViewController*)mIncallViewController animated:true]; + } + [mIncallViewController displayCall:call InProgressFromUI:viewCtrl + forUser:username + withDisplayName:displayName]; + +} + +-(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + if (self.presentedViewController != (UIViewController*)mIncallViewController && (call == 0x0 || + linphone_call_get_dir(call)==LinphoneCallIncoming)){ + [self presentModalViewController:(UIViewController*)mIncallViewController animated:true]; + + } + + + + [mIncallViewController displayInCall:call FromUI:viewCtrl + forUser:username + withDisplayName:displayName]; + [callLarge setHidden:TRUE]; + [callShort setHidden:FALSE]; + [backToCallView setHidden:FALSE]; + +} + + +-(void) displayVideoCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + [mIncallViewController displayVideoCall:call FromUI:viewCtrl + forUser:username + withDisplayName:displayName]; +} + + + - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas{ LinphoneCall* call = (LinphoneCall*)datas; if (buttonIndex == 0 ) { @@ -290,13 +269,9 @@ - (void)dealloc { [address dealloc]; [ mDisplayName dealloc]; - [incallView dealloc]; [dialerView dealloc]; - [callDuration dealloc]; - [mute dealloc]; - [speaker dealloc]; - [peerLabel dealloc]; - [__call dealloc]; + [callShort dealloc]; + [callLarge dealloc]; [hangup dealloc]; [status dealloc]; [one dealloc]; @@ -313,6 +288,7 @@ [hash dealloc]; [back dealloc]; [myTabBarController release]; + [mIncallViewController release]; [super dealloc]; } diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index be02b22e2..d3eba61df 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -138,42 +138,13 @@
IBCocoaTouchFramework
- - - 292 - {{0, 328}, {160, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - startcall-green.png - - - NSImage - clavier-01-160px.png - - - - 292 {{9, 390}, {304, 21}} - + NO YES NO @@ -300,7 +271,7 @@ {{0, 196}, {107, 66}} - + NO NO IBCocoaTouchFramework @@ -482,17 +453,49 @@ - + 292 {{160, 328}, {160, 66}} - NO NO IBCocoaTouchFramework - NO + 0 + 0 + 1 + Back + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + clavier-01-160px.png + + + 2 + 2 + + + Helvetica-Bold + 18 + 16 + + + + + 292 + {{0, 328}, {160, 66}} + + + + NO + NO + IBCocoaTouchFramework 0 0 @@ -501,61 +504,36 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + NSImage - stopcall-red.png + startcall-green.png - + - + - -2147483356 - - YES - - - 292 - {160, 66} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Back - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - 2 - 2 - - - Helvetica-Bold - 18 - 16 - - - - {{160, 328}, {160, 66}} + 292 + {{0, 328}, {320, 66}} - - - 1 - MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA - + + NO NO IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + {{0, 20}, {320, 460}} @@ -701,22 +679,6 @@ 54
- - - hangup - - - - 109 - - - - incallView - - - - 119 - erase @@ -733,14 +695,6 @@ 158 - - - __call - - - - 159 - backToCallView @@ -749,6 +703,22 @@ 161 + + + callShort + + + + 163 + + + + callLarge + + + + 164 + delegate @@ -807,10 +777,7 @@ - - - @@ -818,8 +785,11 @@ - + + + + @@ -838,32 +808,16 @@
- - 114 - - - YES - - - - inCall - 39 - - 107 - - - hangup - 5 - Call + Call-short 7 @@ -936,9 +890,15 @@ 160 - + back + + 162 + + + Call-large +
@@ -951,14 +911,12 @@ -2.IBPluginDependency 1.IBPluginDependency 1.IBUserGuides - 107.CustomClassName - 107.IBPluginDependency - 114.IBPluginDependency - 114.IBUserGuides 150.CustomClassName 150.IBPluginDependency 157.IBPluginDependency 160.IBPluginDependency + 162.CustomClassName + 162.IBPluginDependency 29.CustomClassName 29.IBPluginDependency 30.CustomClassName @@ -1009,21 +967,12 @@ 1
- UIHangUpButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - 90 - 1 - - UIEraseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UICallButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1067,7 +1016,7 @@
- 161 + 164
@@ -1090,11 +1039,11 @@ YES YES - __call address back backToCallView - callDuration + callLarge + callShort dialerView eight erase @@ -1102,15 +1051,11 @@ four hangup hash - incallView - mute myTabBarController nine one - peerLabel seven six - speaker star status three @@ -1119,11 +1064,11 @@ YES - UIButton UITextField UIButton UIButton - UILabel + UIButton + UIButton UIView UIButton UIEraseButton @@ -1131,13 +1076,9 @@ UIButton UIButton UIButton - UIView - UIButton UITabBarController UIButton UIButton - UILabel - UIButton UIButton UIButton UIButton @@ -1151,11 +1092,11 @@ YES YES - __call address back backToCallView - callDuration + callLarge + callShort dialerView eight erase @@ -1163,15 +1104,11 @@ four hangup hash - incallView - mute myTabBarController nine one - peerLabel seven six - speaker star status three @@ -1180,10 +1117,6 @@ YES - - __call - UIButton - address UITextField @@ -1197,8 +1130,12 @@ UIButton - callDuration - UILabel + callLarge + UIButton + + + callShort + UIButton dialerView @@ -1228,14 +1165,6 @@ hash UIButton - - incallView - UIView - - - mute - UIButton - myTabBarController UITabBarController @@ -1248,10 +1177,6 @@ one UIButton - - peerLabel - UILabel - seven UIButton @@ -1260,10 +1185,6 @@ six UIButton - - speaker - UIButton - star UIButton @@ -1315,14 +1236,6 @@ ./Classes/UIEraseButton.h - - UIHangUpButton - UIButton - - IBProjectSource - ./Classes/UIHangUpButton.h - - 0 @@ -1331,10 +1244,6 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 @@ -1350,7 +1259,6 @@ clavier-01-160px.png effacer.png startcall-green.png - stopcall-red.png YES @@ -1359,7 +1267,6 @@ {160, 60} {164, 104} {60, 52} - {62, 54}
933 diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 8f1c9a54f..f7b3253b1 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -47,6 +47,7 @@ {320, 480} + 1 MSAxIDEAA @@ -65,17 +66,17 @@ IBCocoaTouchFramework NO - - History - - History + + + Dialer NSImage - history-orange.png + dialer-orange.png IBCocoaTouchFramework + PhoneViewController 1 @@ -86,18 +87,17 @@ YES - - - - Dialer + + History + + History NSImage - dialer-orange.png + history-orange.png IBCocoaTouchFramework - PhoneViewController 1 @@ -106,6 +106,7 @@ IBCocoaTouchFramework NO + IBCocoaTouchFramework @@ -140,6 +141,7 @@ 266 {{0, 431}, {320, 49}} + 3 MCAwAA @@ -330,7 +332,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin - AdvancedPhoneViewController + PhoneViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin linphoneAppDelegate diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 0d073c3ba..68ec64abc 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -20,8 +20,6 @@ 220FAD3910765B400068D98F /* libspeexdsp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD3010765B400068D98F /* libspeexdsp.a */; }; 220FAE4B10767A6A0068D98F /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 220FAE4A10767A6A0068D98F /* PhoneMainView.xib */; }; 2211DB95147564B400DEE054 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2211DB94147564B400DEE054 /* Settings.bundle */; }; - 2211DBBC14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */; }; - 2211DBBD14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */; }; 2211DBBE14769C8300DEE054 /* CallDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBB14769C8200DEE054 /* CallDelegate.m */; }; 2211DBBF14769C8300DEE054 /* CallDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2211DBBB14769C8200DEE054 /* CallDelegate.m */; }; 2211DBC014769CB200DEE054 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; @@ -379,7 +377,6 @@ 2211DB8F147555C800DEE054 /* libmediastreamer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmediastreamer.a; path = "liblinphone-sdk/apple-darwin/lib/libmediastreamer.a"; sourceTree = ""; }; 2211DB911475562600DEE054 /* liblinphone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblinphone.a; path = "liblinphone-sdk/apple-darwin/lib/liblinphone.a"; sourceTree = ""; }; 2211DB94147564B400DEE054 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = nogpl/Settings.bundle; sourceTree = ""; }; - 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; 2211DBBB14769C8200DEE054 /* CallDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallDelegate.m; sourceTree = ""; }; 2211DBCA1476BE7300DEE054 /* ajouter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ajouter.png; path = Resources/ajouter.png; sourceTree = ""; }; 2211DBCB1476BE7300DEE054 /* clavier.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = clavier.png; path = Resources/clavier.png; sourceTree = ""; }; @@ -682,7 +679,6 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( - 2211DBBA14769C8200DEE054 /* AdvancedPhoneViewController.m */, 2211DBBB14769C8200DEE054 /* CallDelegate.m */, 2214EB7012F84668002A5394 /* LinphoneUI */, 2218A92212FBE1340088A667 /* FirstLoginViewController.h */, @@ -1360,7 +1356,6 @@ 223963171393CFAF001DE689 /* FastAddressBook.m in Sources */, 22E028B713B4CCBD0068A713 /* VideoViewController.m in Sources */, 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */, - 2211DBBC14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */, 2211DBBE14769C8300DEE054 /* CallDelegate.m in Sources */, 2211DBC014769CB200DEE054 /* IncallViewController.m in Sources */, 22D817AD147A9F33001CFB9C /* UIAddVideoButton.m in Sources */, @@ -1393,7 +1388,6 @@ 22D8F157147548E2008C97DB /* FastAddressBook.m in Sources */, 22D8F158147548E2008C97DB /* VideoViewController.m in Sources */, 22D8F159147548E2008C97DB /* UICamSwitch.m in Sources */, - 2211DBBD14769C8300DEE054 /* AdvancedPhoneViewController.m in Sources */, 2211DBBF14769C8300DEE054 /* CallDelegate.m in Sources */, 2211DBC114769CB300DEE054 /* IncallViewController.m in Sources */, 22D817AE147A9F33001CFB9C /* UIAddVideoButton.m in Sources */, From dc3f533a2d4dba881f77555e362e54523c1867ae Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 22 Nov 2011 18:27:08 +0100 Subject: [PATCH 083/122] update mic button from video view --- Classes/LinphoneUI/LinphoneManager.m | 13 +++++++++---- Classes/VideoViewController.m | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 48515e956..edb2ddc06 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -198,7 +198,12 @@ extern void libmssilk_init(); [callDelegate displayDialerFromUI:mCurrentViewController forUser:@"" withDisplayName:@""]; - } + } else { + [callDelegate displayInCall:call + FromUI:mCurrentViewController + forUser:lUserName + withDisplayName:lDisplayName]; + } break; } case LinphoneCallEnd: @@ -208,9 +213,9 @@ extern void libmssilk_init(); withDisplayName:@""]; } else { [callDelegate displayInCall:call - FromUI:mCurrentViewController - forUser:lUserName - withDisplayName:lDisplayName]; + FromUI:mCurrentViewController + forUser:lUserName + withDisplayName:lDisplayName]; } break; default: diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index ca07ae499..94e7219a8 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -63,8 +63,8 @@ - (void)viewDidLoad { [super viewDidLoad]; - [mMute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - [mMuteLand initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; + [mMute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; + [mMuteLand initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; [mCamSwitch setPreview:mPreview]; [mCamSwitchLand setPreview:mPreviewLand]; isFirst=TRUE; From 2bee4694a2dbe866f6f2cf0e454b33991cb4fadd Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 22 Nov 2011 18:49:29 +0100 Subject: [PATCH 084/122] fix crash on second incoming call with video --- Classes/IncallViewController.m | 4 +- Classes/VideoViewController.xib | 312 +++++++++++++++++++++++++------- 2 files changed, 253 insertions(+), 63 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index cb589b6fb..d3d922613 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -163,7 +163,8 @@ int callCount(LinphoneCore* lc) { } -(void)viewDidAppear:(BOOL)animated { - if (dismissed) { + [super viewDidAppear:animated]; + if (dismissed) { [self dismissModalViewControllerAnimated:true]; } else { [self updateCallsDurations]; @@ -215,6 +216,7 @@ int callCount(LinphoneCore* lc) { glowingTimer = nil; } if (!mVideoShown) [[UIApplication sharedApplication] setIdleTimerDisabled:false]; + mIncallViewIsReady=FALSE; } - (void)viewDidUnload { diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index e6af95120..f79a64430 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -1,14 +1,14 @@ - 1056 - 10K549 - 1305 - 1038.36 - 461.00 + 1280 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 300 + 933 YES @@ -22,11 +22,8 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin - YES - - YES - - + PluginDependencyRecalculationVersion + YES @@ -43,6 +40,8 @@ 292 {320, 460} + + 1 MCAwIDAAA @@ -59,6 +58,7 @@ 274 {320, 420} + 1 NO @@ -69,16 +69,12 @@ 292 {{1, 418}, {108, 62}} + NO IBCocoaTouchFramework 0 0 - - Helvetica-Bold - 15 - 16 - 3 MQA @@ -95,18 +91,29 @@ NSImage clavier-01-108px.png + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + 292 {{106, 418}, {106, 63}} + NO IBCocoaTouchFramework 0 0 - 1 @@ -118,17 +125,20 @@ stopcall-red.png + + 292 {{211, 418}, {108, 62}} + + NO IBCocoaTouchFramework 0 0 - 1 switch @@ -138,12 +148,15 @@ + + 292 - {{216, 263}, {96, 128}} + {{233, 309}, {80, 106}} + 3 @@ -157,6 +170,7 @@ {320, 480} + 3 @@ -172,9 +186,27 @@ 274 + + YES + + + 274 + {{308, 235}, {106, 80}} + + + + + 3 + MQA + + + IBCocoaTouchFramework + + {420, 320} - + + 3 MQA @@ -187,12 +219,12 @@ 292 {{420, 0}, {60, 108}} - + + NO IBCocoaTouchFramework 0 0 - 1 @@ -207,18 +239,20 @@ NSImage clavier-01-106px.png + + 292 {{420, 107}, {60, 106}} + NO IBCocoaTouchFramework 0 0 - 1 @@ -227,17 +261,20 @@ + + 292 {{420, 212}, {60, 108}} + + NO IBCocoaTouchFramework 0 0 - Switch @@ -246,23 +283,13 @@ - - - - 274 - {{264, 210}, {142, 96}} - - - - 3 - MQA - - - IBCocoaTouchFramework + + {480, 320} + 3 @@ -335,14 +362,6 @@ 23 - - - mPreviewLand - - - - 24 - mHangUp @@ -383,13 +402,23 @@ 32 + + + mPreviewLand + + + + 24 + YES 0 - + + YES + @@ -419,10 +448,10 @@ YES - + portrait @@ -464,7 +493,6 @@ - landscape @@ -487,21 +515,22 @@ Mute - - 16 - - - YES - - - preview - 15 + + YES + + display + + 16 + + + preview + @@ -509,8 +538,9 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName - 1.IBEditorWindowLastContentRect + -2.IBPluginDependency 1.IBPluginDependency 14.IBPluginDependency 15.IBPluginDependency @@ -534,8 +564,9 @@ YES VideoViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder - {{556, 412}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -571,7 +602,164 @@ 33 - + + + YES + + UICamSwitch + UIButton + + preview + UIView + + + preview + + preview + UIView + + + + IBProjectSource + ./Classes/UICamSwitch.h + + + + UIHangUpButton + UIButton + + IBProjectSource + ./Classes/UIHangUpButton.h + + + + UIMuteButton + UIToggleButton + + IBProjectSource + ./Classes/UIMuteButton.h + + + + UIToggleButton + UIButton + + IBProjectSource + ./Classes/UIToggleButton.h + + + + VideoViewController + UIViewController + + YES + + YES + mCamSwitch + mCamSwitchLand + mDisplay + mDisplayLand + mHangUp + mHangUpLand + mLandscape + mMute + mMuteLand + mPortrait + mPreview + mPreviewLand + + + YES + UICamSwitch + UICamSwitch + UIView + UIView + UIHangUpButton + UIHangUpButton + UIView + UIMuteButton + UIMuteButton + UIView + UIView + UIView + + + + YES + + YES + mCamSwitch + mCamSwitchLand + mDisplay + mDisplayLand + mHangUp + mHangUpLand + mLandscape + mMute + mMuteLand + mPortrait + mPreview + mPreviewLand + + + YES + + mCamSwitch + UICamSwitch + + + mCamSwitchLand + UICamSwitch + + + mDisplay + UIView + + + mDisplayLand + UIView + + + mHangUp + UIHangUpButton + + + mHangUpLand + UIHangUpButton + + + mLandscape + UIView + + + mMute + UIMuteButton + + + mMuteLand + UIMuteButton + + + mPortrait + UIView + + + mPreview + UIView + + + mPreviewLand + UIView + + + + + IBProjectSource + ./Classes/VideoViewController.h + + + + 0 IBCocoaTouchFramework @@ -593,10 +781,10 @@ YES {106, 60} {108, 60} - {32, 32} + {20, 20} {62, 54} - 300 + 933 From cc6128eb7a495159de8aac4f8c5fc10188c50e25 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 23 Nov 2011 10:19:35 +0100 Subject: [PATCH 085/122] fix for incoming call action sheet not esay to decline --- Classes/PhoneViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 52a28a922..3390fd3a3 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -206,7 +206,7 @@ otherButtonTitles:nil]; mIncomingCallActionSheet.actionSheetStyle = UIActionSheetStyleDefault; - [mIncomingCallActionSheet showInView:self.view]; + [mIncomingCallActionSheet showInView:self.parentViewController.view]; [mIncomingCallActionSheet release]; } From 4a0c2cbd932f3e1bc17419ce8320419b633e0fa0 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 23 Nov 2011 10:21:25 +0100 Subject: [PATCH 086/122] Rewrite call status text in InCallView --- Classes/IncallViewController.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index d3d922613..95e8fb3e1 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -480,7 +480,16 @@ int callCount(LinphoneCore* lc) { else [ms appendFormat:@"%02i sec", duration, nil]; } else { - [ms appendFormat:@"%s", linphone_call_state_to_string(linphone_call_get_state(call)), nil]; + switch (linphone_call_get_state(call)) { + case LinphoneCallPaused: + [ms appendFormat:@"%@", NSLocalizedString(@"Paused", nil), nil]; + break; + case LinphoneCallOutgoingProgress: + [ms appendFormat:@"%@...", NSLocalizedString(@"In progress", nil), nil]; + break; + default: + break; + } } [cell.detailTextLabel setText:ms]; From 0199a06499067d2125c76ccbbaeb0907fd15f683 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 23 Nov 2011 15:00:32 +0100 Subject: [PATCH 087/122] IOS3.2 adaptations --- Classes/LinphoneUI/LinphoneManager.m | 21 ++++++++++++--------- Classes/LinphoneUI/UICallButton.m | 2 +- Classes/PhoneViewController.xib | 2 +- Resources/HP.png | Bin 2382 -> 3113 bytes Resources/HP_inverse.png | Bin 8077 -> 6868 bytes Resources/ajouter.png | Bin 1538 -> 2653 bytes Resources/clavier.png | Bin 3353 -> 4259 bytes Resources/contact.png | Bin 4155 -> 4547 bytes Resources/effacer.png | Bin 2701 -> 2180 bytes Resources/grouper.png | Bin 3364 -> 4208 bytes Resources/micro.png | Bin 4760 -> 5956 bytes Resources/micro_inverse.png | Bin 10593 -> 9434 bytes Resources/pause.png | Bin 1564 -> 2708 bytes Resources/pause_inactif.png | Bin 7304 -> 6699 bytes linphone.xcodeproj/project.pbxproj | 2 +- submodules/linphone | 2 +- 16 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index edb2ddc06..3adf864be 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -541,14 +541,13 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach //read codecs from setting bundle and enable them one by one if ([self isNotIphone3G]) { - [self configurePayloadType:"speex" fromPrefKey:@"speex_16k_preference" withRate:16000]; - [self configurePayloadType:"speex" fromPrefKey:@"speex_8k_preference" withRate:8000]; + [self configurePayloadType:"SILK" fromPrefKey:@"silk_24k_preference" withRate:24000]; } - else - { - ms_message("SPEEX codecs deactivated"); + else { + ms_message("SILK 24khz codec deactivated"); } - [self configurePayloadType:"SILK" fromPrefKey:@"silk_24k_preference" withRate:24000]; + [self configurePayloadType:"speex" fromPrefKey:@"speex_16k_preference" withRate:16000]; + [self configurePayloadType:"speex" fromPrefKey:@"speex_8k_preference" withRate:8000]; [self configurePayloadType:"SILK" fromPrefKey:@"silk_16k_preference" withRate:16000]; [self configurePayloadType:"AMR" fromPrefKey:@"amr_8k_preference" withRate:8000]; [self configurePayloadType:"GSM" fromPrefKey:@"gsm_8k_preference" withRate:8000]; @@ -568,9 +567,13 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach [self configurePayloadType:"H264" fromPrefKey:@"h264_preference" withRate:90000]; [self configurePayloadType:"VP8" fromPrefKey:@"vp8_preference" withRate:90000]; - bool enableVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_video_preference"]; - linphone_core_enable_video(theLinphoneCore, enableVideo, enableVideo); - + if ([self isNotIphone3G]) { + bool enableVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_video_preference"]; + linphone_core_enable_video(theLinphoneCore, enableVideo, enableVideo); + } else { + linphone_core_enable_video(theLinphoneCore, FALSE, FALSE); + ms_warning("Disable video for phones prior to iPhone 3GS"); + } bool enableSrtp = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_srtp_preference"]; linphone_core_set_media_encryption(theLinphoneCore, enableSrtp?LinphoneMediaEncryptionSRTP:LinphoneMediaEncryptionNone); diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m index 82726e6c8..e4ccdceb6 100644 --- a/Classes/LinphoneUI/UICallButton.m +++ b/Classes/LinphoneUI/UICallButton.m @@ -65,7 +65,7 @@ linphone_address_set_display_name(tmpAddress,[mDisplayName.text length]>0?[mDisplayName.text cStringUsingEncoding:[NSString defaultCStringEncoding]]:nil); - linphone_call_params_enable_video(lcallParams,startVideo); + linphone_call_params_enable_video(lcallParams,startVideo&linphone_core_video_enabled([LinphoneManager getLc])); linphone_core_invite_address_with_params([LinphoneManager getLc],tmpAddress,lcallParams) ; linphone_address_destroy(tmpAddress); diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index d3eba61df..8e5e6ac92 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -71,7 +71,7 @@ 3 MC41AA - + NSImage effacer.png diff --git a/Resources/HP.png b/Resources/HP.png index 95d132189ab9b4b71466957362d039b280fb175a..b3527b7826a113a123c88cbca091afdf7d3cfeab 100755 GIT binary patch delta 3060 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 diff --git a/Resources/HP_inverse.png b/Resources/HP_inverse.png index e343dba736635489bd6612a63db86d6c7d4c5564..983f799de12d072ef5dbee41f882b55f714abf74 100755 GIT binary patch delta 6844 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 bum1rNZbWfHa6}~l3jhEBNkvXXu0mjfiF?Q3 diff --git a/Resources/clavier.png b/Resources/clavier.png index 3d2d9495bde9bcb7b29ff5782ca6e34dc6b0f2b1..df1026b655661858a4dda7772a357b0acb4b9f08 100755 GIT binary patch delta 4215 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 N002ovPDHLkV1k|S8xH^g delta 3302 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 diff --git a/Resources/contact.png b/Resources/contact.png index ecf2b160300415bdf22de4c73ba879b3eb8c0824..32a5aee963f290d5eb5d46ed99a964166ce7957f 100755 GIT binary patch delta 4505 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 delta 4110 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 delta 2663 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 diff --git a/Resources/grouper.png b/Resources/grouper.png index 70ed3cbc7bc0b38a7cd15ea6584cc2c647fb0cf0..6ca595e436e2e673a96f84627ae8d901d0acc261 100755 GIT binary patch literal 4208 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 delta 4720 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 S@i_nh00{s|MNUMnLSTY8^xB93 delta 10588 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 diff --git a/Resources/pause.png b/Resources/pause.png index 37d96580b4273e8e867b6ab5f1ed045088a0f858..4875f41c2fff285e9134a4d25890dc6860feb736 100755 GIT binary patch delta 2652 zcmV-i3ZwO$43rfviBL{Q4GJ0x0000DNk~Le0001L0000(2nGNE0Ca+oX#fBK0drDE zLIAGL9O;oEG6)w900!@fE*+6uCw~d=NklgQ#h8^!F8F=OS z1Or}ORiB_2A$B{|h$Cm%gbekpt4MI!8z-*;VBxSK! z@Zay=!GMHP3QDOqEiDse1ryTHx9)$oFy5w>Owit~l!+u236jqEne%^l7S%V4f`Fum zzz`@~)LrXIBMGhjycm*HknM|oa+(lEAl8%DfR~SDWx!*&G72g zE1aL72ba9kcd@vXXV0GDtFL|!Yi*S8GmY5JWs)YF#w4F(32 z$pkw)V?28FJKn#4Ut&Z`66fdVxVX5$>FKE$V-P7>C2z(UIe$4h#lwdWF&GSFZ*OnK zQjd;~005__6AT7MDrjC?rk3hQZGWYdDCIegYkkC*U%Nqr_7&#twO+8dw}(fM9x=86 zlCrzIi;o{aLTgR3P_o(rDXExSl01I=n7g~XOIE6sg0&W(KYxbSI#g;lCR2i2tSsCr zrKqSNq_?P0Q-5l(j9aTThuW5i6oc!WgNPLMuh_zrqO<`a-^afn4u_IuS;+hgJ_dsU zL`3{bLNOkluSY2=GE~pC?$3IZ=fi)UYyFBaC2L@XMU_DUuYM|w&?HMVnWNwsTy?e{ zrIaES0s88B?)o+X_%@L{a4lX^cyFq@l;MAPejmo;ihmEnfc;yKs(|DTebLJM8sv&+ z_hCGI#po*GEyt*>tch&{&1=>A$|a<2vnUZ+OZ!PyRXO@^QAK3}EQ5(&OjOmN)=l7b zcn`E%SNS=kiAu@Z`&tfazoAYjb&wi(ZS*oAR9sB!)8GI(WXW{T~GTeppXzC<3?SGmi48EnCZ z`Zm;uH4h0~1A2FU@WBY=CV2yEUN_PduMRKxEo5P!-L;>kl`c+51plO!jyJP>QJGQ| zVrhr4MDRQzAfur|ywS@u0+VK7FdB_ut&Mw%^AlC%8Wl0Bwt7As4VSC)0%)UQ&VL8t zxl)RIom~hbA{6+WK@4Q2fVfGEx{;eO#$Yra!)6QL#SbB!UEYtLn(&GUMx#+aQQ}7c zfH4}zn93sWre#{AuQwh+QJLtkMHz$9a0IJ$-a!C?SaIb+O+Fer91fwBzS=^TTdpyt zmlhSis)|v)$)k)h7>`G?SZMD6a(^n;+9iHd^C)joLs3dEMZLjbz}%vGl}CwhAFfcG$2Y1)2JW6~`)=$)`@^srm zdB<7{n`Ov1^%u>qoNr3!J<TmhyWxA=LFM>X`U5F<$w;sM4l-y zaA5-C>k~Y;)= zzdgjj40v{a22xc%_kZ&863?GM$H~cwM0r)^g})~!C-~uqKjUA&`~nv;$dzXclu~kd zc!=ZU<8Z~nMr2B`D5*=(Lv_N(C;+Y}G0Its@y-tZ_}zDn`{7AqI-O!ZpSRvA>#~f0 z`1)%+{pOoinI@BoWXluZ-95P?w9bX@`nW}4N?po({318Y0 z@g*de|J}8IHI>gx*nnAv=QquxVz*ItIZSX(Z3u}KaimO#4KZPBWOB|GJCTZnH*$Sl zpuTl-4kY9;Xn)94wniqU6r(%}h%D-^^{6@L5Go}`@`X5SZCg<@HCaOo!b(M9O-L@a z&sNLi?`+B^Dz7M&Gx3x>rL8j2CU8owCJCR(n)J6yCKqabvRv!CYkh*}as~3tbUMX{ z4N|@2vX2HY$>P!x`c5pZ^0k1WV})P!_5H0000< KMNUMnLSTabtq_&~ delta 1499 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 delta 7284 zcmV-)9E;ADNiBL{Q4GJ0x0000DNk~Le0001_0001J2nGNE0Dqrbj*%`h2o4Mv z9ZbCuMUiMHe;e>gL_t(|+U;GvjwDBNj_4n8d3yi}9zaW$Xb30g3=+~K>=Wn#2;4i| z%bc*!A)FyY!Wk#Y;#o3e65>D$5F&?5Tz6N3h%bJ!s%F>O1_(9-v`bU}{u0s*4 zf49%6;Yoyu)$c{Excxl~k+7YI)VLIU$9txqsQ)c^gaZ z)BLku8r(C76527sb7}UEoHJ<&akzrK7!#FIJ{DiY*8y4VeY z1W5}Be^T(~-Zn#u1W67->dWZd2myba-(Q^du_C--f^6n($LbE)BS^vPgL}hjP3mu= z_WAa%h#<)!NCpHsk9VMdlixgXNZS9^b@BRE6DBfpZk^^J^8&mtps~=wpxa*gc;gee z4DM+~^NKo1#vBUGjkv$i*c#a3d=iYyfawVOe;fOpHQGyk;e^Ajy{~IebQU@g5y}1q zu}tcaxLI`d^kuu}5*o1_V#B$&_(;O3sdAv`a=M%?nI zzqjwkj{X~rJHNwD@VT^?vC|PHRv%hDf0zVwb&_Cjwd+F_yL1`*`Hb2sG$lcMu z1q8$^49@e-P}I z!a$zd1m0bbHDWN{#@ZI&(g_UB2 zTg2)@rJVp6kz5t_l-;sp1gN>-f8~tun(S|m_%*P|$X+?dW-FFEg3i`j6}8T@nyDBx zAX0w}LB0oHQ3}~q4tvRG>+zP%%XK|#i4Hufrw@a?Yqt)&*REFfF&5Plj#1wjDqwIG zd~pbS+-O~E4ZF4Lp)Clq;zf`I2VJp8(RU^d`v^kuJ)Lfg18|(you{bLe?!Dm*ekAz zrFc)#(slJ;1kv!qtxCS@{@DR81?i^IxK$i*Aq_Aqk?lbun#*Zeu#@j zR$|5CmOgmEeTD-LkZm+ue-A`T6xrn>3POEW5+nzg&bb8IQ&c8MaMl8_$jzjScfQ6` zlPS0r<6~5*ZGqh)M|;r*6a{1wQhpfW(1Yy?&tk&rU@eo6vve+T<)WM-mZ(^c!) zND7FSy!!TEw78!UU=DPtUpoF)YDbZib_99TA*%#A>io|{cw^MaNCYa!bFYNT9Ap%mZfK57fG#^CNQXp;iYOjXnp-i-47ltFK{}favi}~we_X5uJ$(Pu zUC)-0i^t6vYvzBv#;isRNs8iE6C@XSg@6RDrD_HR*ymZf4qMi~Qz7RBu&FL9uE6

2wf1;_;F)ra>zI;iaeDVn$4*ns(dGm%I9~&at9n=MKE)|Ta>_3OYfj;}} zGkWpjg**SZ-+oKy^ZEXZ{lP}|=zVM>$_c4O+=S2R3oMof2%OD4rj8Pa46_J7u@Ft% z5ajOQSgj)=NEHs3i4iFh;0S@*8=Dd1{7grX`$K~Be^H{=+&>vH&d)qNJTw>LxWHgw zs--{<7>cP_&#>DV6?i%oKK4e-h>J5raJG!sH4ZkC9H4Q|7myuQiP1SQKkshUXqP&r{pP3*{;=fbj zgH&Ynf7;K?p@m}1H1+ZYsTzifiG%9t;sa=11XLVwX4I>FO*|wyc`%uKju&!4*^VGv z#TbR~Z{hu!v09WWO6=?#ZFeJfhnlLBO0vP+p^g#hFu*K3Ai$88*f;O`_*6~c$|VG#gI|8H?WT~6p+Y^f^Vv4E`f)qC9EC!RUzhe&IOd10Nk^2TB{B~ zF_*$KusI1r870UHV4)BPk$X+03Fx0Fhsvo^RtF%}0UJ8fl{zK>`?QKNF$lG)e+E?) zlF<=9r>lUWYGFF>hs9c&P~2>(!;ytqTqI#5C31hTV}*_wRJ&3@9!*sC#xZ74#Sc#^ z3Lro;-i~Ox5Xp@o_X_K47OEG^DuFA#EMBZ2*-Id-JVs7c-7YMy!NxrA$z}whu6t|U z!V-fUGU*POr#$UR*V<``G%TX(e{7mZPmvl5%RGal42~uZ+ zvd#DJzCJ0~hl9xK4&MrNGsqP*SEaxTWn6N&<;d)$&6ceH4PYNA9u;tpfAq{v=a<|I zl11Xcixfr0&#IG$ReIYlMU`z*9Flj<;vCA~QBXN7!LtMyDju589zkj`!&raQC4{#S z+kCX+Fxd)d(3;%}n9n>l5{qMY7|2dJA$9`3tM+mv%?L%an@V$tLw5d7faG)Gf*SE2 zEN~=MLl7Z6lfD?~a2a%3e}Y3+&YuO#cMOE$JTj^J11e~s-Yi)+i8UhI+dotRX0%d@8AEV_UpOv$u28U6 zE-mbHxUa;7!=nXg6F?k`7dAtp*wA5wb1Fv$1i%UO?rG_1r#v-#c0#!_tN~2!KBfp>7ugK66bZDL zpu4__zOSK%)mApb;y^lV7+A2@%4clJ>a+y{=@y;AD!rtEK553?Elk}mXP?<|3d~uC ztqy)}IV7`UvD`22e`Y)|ZV<$UP1j=^ke6}bX8YY8TZ@pDVySaTcq0zQ?BH`6sAq=& zRxiNWXSSXftsdQ&h2vbfZJ$~c}=J#6s49-ptqxde+&2-stbf|lBp%g z%jrJY&I!jif1Rob$4PSLDN%$>su_@1PDSVEumax2@m_2d{&hL^R(q$vQeY5nWK>Nj z#TmKjC8&r(8!FoOPkgHs;YR$UBKz7%WM#OuOv393Axd|gpN9n5E-bCU=h*&S=q%-0 zLI^+(7c}<1Yd7(vNv2<;{s(cwQD1ZX4jG7F|hD3QeH#!)CvWT8F z+iW`fe;8z%nAPmfgerxEut>rZiE4gBlpWa`P+DZm4#XWs?dB-2ZKQ)|VNY&EkO6l! zdj+CMP`&J}36c@C;q_mX?KrgOAC@9PibIf*I+R7Hds(2mS*TaOWk*C8EwW`tY2p!7MUIce?bXvQPavLMiq>;M3FNi^&=|^KgAXC zxXGTyZ&BYZz4; z(Br@x;gm@cCqXPML5X@CYL?G=!0Hz0&vc^B1C+)2mF3_P9F%gvJF9wI30*^3hz3YU z)$W4clsZ&xe!eqmE@wZIV|AAZpueC*FBoJ&gu|%@7{yjlo)sny zhXe6v-B_M%@O;|(8NxWm7HJGE?Bgl)(2cqgQQlOBLKD<(zsaT=cY8Gjxl)PYlGXIl zU3jA^$|72ad>5&E-n)&42GJ^xw7aJKcDlR}NyJreun*^GM53}Rn!m$Ae`VZH9}&;H zZ^G!r#&(_>1mUa^dkNy|5@f&`({*J~#M5Vg*x&xfjW1fR);|+jm)~@v#T58#^RH<@y#32(l0& z4cmaoM)T`HgTV7K{8{?l%u`qC%76&6w6M$@&(HkwOUAZy9S=vCf9EbFjYhzZ$mG=o zxqSXg0dQJLSfl5ZdEKId`MQ48p(V&IIT!n;J#RV3vNgM%yrTV|&YSJdviVQXupfo* zbctP~MVJQkM3WtEyTxj#`ne#3M|1 zjituA`6IM>R7XVEe+#EtNvI}>is~wz6>BT|WJA47$+XPfq&kM8z>6-$)pNTs_TWeq zjWVKQTt#O4%`VGVaM|tI-!EQ+qM#WmZ!~|2BcaAsZ3?mUZU|_91L7uPOu@phI)y#zPhHEh%wO#fOs?xU*RZ%brUyj&PW1cRT zn^k*<9OOEMf0LXw>u{#1YpYrijtEkFw0wTVD4akDR2C&OW&~8QbMHE12?2QmXPi#K zK61XLA=aY5v%gokmA=7kq=+uz0$!^54g+$^nfUM<>!7FB{B%IgP<;o>~#= zfSerF61Xndmv%2Z4rxHw%8Bc0S`I6OHyGqj>r`1te~@}F1q6ivPN_N6`9xe-XqCvU zcp>6q1*_&qjW$szng9b45(!!Y(ha==utj4DGPCA8ol$c+$2EB(+LWlFV)K1txdqSg z0Pa2|e+P7PIiIiIk=df<>;LaRo3W6m1~nY@^zGI2pZ&-@H~oNcnQIO>A<_v)Va67IhGK5u_|3nFg%p-$&h&Y?_&VNYe~ zhx+0FexQ#({y3cf?ayx=4(&J%#4-Fh5tS&be-l2RASt??H0kJiqPUULUWsg&hwW6V z>i*8P3R;w?UPvj|V68=w3D$&6!ua02c|)Ik`Y9a_2X(af@!tIJ8%q$dKMt3S$oBK_ z@Iasa>R0sQ#S3@-hwmPI91^Nk(o`Q2teX?z9z@1$ND8ga-ojj*v=kf889v>gaBupnVQCl~`?+y0gd_L2|ci*j;zuILT zVT8cd$AR-BR7y7#?VZS$)4djV1v?z^;I zKL6!D=1>z*OH>J(_4A+nGblMV$mSxYe;zcT!i{wBsyJzGAEZMP@Ia*c+X7wIg*B7n zngninba9)1fBof4di@_i(!=9;UhLOjy^IMG>B)+tfBn@R<||k_37|T_Zd-!o2EcV(V%{e|%Et z)fY#4^~I-tr_^?lCa0PGlFnJboa^^reQ|i2UmH87-?vi`b~=ILQJ`s)j>7LcFpzJE z=)UBp(Wz7Ghg;YN)ijCc@FcVg4xA2<ek?pm%i!(D#zSswFex-u}BO~sBbDLZ`b*0cTeW4 zG;QRdD5$VX?c67)f&(hg%-B+Gu|O?$#e=#4jD$Fw0oxI0^*Zhf&|Nk6rXX@i>!g%a z)Dhn=P5|?qVF|uIC!^^{1}&PgByWHdm(J5aXuI=m*J6A>(2>Ow=HD7%K6 z^z&X(&+a`0EB*#Fm%ini?q(~6G*Vqd2Zf?}B@?@|A={*?+e3ZfLF3bwc_A-R)(f+{ z!OQz*f8X8b$}OEo&VjcA zVz>(eZb@1640JR%*aqz-h}aUR*SV*HY01}Kyf9^6?q|Ozl;jl{CR+jY#mF|-poyw~ zEbVe%U1#PN9nDi4+1HUU({O&EP9Rl63Q=6ubIb_x`k(dGbmq8fRGzhsqav6}fsx^r zcMFZ8R@^y|N!5*Me>jWo>rH;42(PW2h>vr^y+FYX-bHW>8jl!6b95Xtn#S&?>G+_J zH%u73uH^~!(XfvbTq~YQ?*-+ey>cqDwgV$QlF`AS4yE7ctnU3CQDUf0h~p#?TpXXeG}y`BV$`*sGHwB`rl+T9uo#Iz z6Y0Y>9BtC?!7s6#pcDpJOU6ZaE}Izc#?_Am(U9BTZ`K}T`~ z0fiWtgFPBmz`<~|Cr3BAXTX^VaO$kYrB_|d0Q{`LdL?;0UC-==U}F&Bxg3aaqvDA@ z6V@WTf5lb|K{_aFSjgOAS0*e89F#|pokbZCBq8sM6P=O$JuR7`a*+fbcA@@H8u`qD zF5m2HM37klQMYJ+sCXA~phzr==8%6OHy|Jj@rnRY_nD|#u2_zda*0fYf^e`5@E#TC z6!>||$!ZJ1dGZW96{#e_9*=Zlp~C&j3^KxIf5w4`h|fR7){+-+J5aHA2`ZGXXRC3m zb8+$KEa~YvKc&d-0%MbRu&(B_<2?}(ABc$l=f&RSGa)5D*;>xb)R(!a Date: Wed, 23 Nov 2011 10:58:05 +0100 Subject: [PATCH 088/122] InCallView: taller call rows --- Classes/IncallViewController.m | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 95e8fb3e1..be0ef0ece 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -121,6 +121,9 @@ int callCount(LinphoneCore* lc) { mIncallViewIsReady=FALSE; mVideoIsPending=FALSE; //selectedCall = nil; + + callTableView.rowHeight = 80; + } -(void) addCallPressed { @@ -159,8 +162,6 @@ int callCount(LinphoneCore* lc) { } -(void) viewWillAppear:(BOOL)animated { - - } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; @@ -201,11 +202,7 @@ int callCount(LinphoneCore* lc) { [addVideo setHidden:TRUE]; [contacts setHidden:FALSE]; } - - - } - - } + } } } - (void) viewDidDisappear:(BOOL)animated { @@ -566,6 +563,9 @@ int callCount(LinphoneCore* lc) { if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; cell.selectionStyle = UITableViewCellSelectionStyleNone; + + cell.textLabel.font = [UIFont systemFontOfSize:40]; + cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight; } LinphoneCore* lc = [LinphoneManager getLc]; From 26eaffe005c0ba637c9aa94134d453efe63fd4ec Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 23 Nov 2011 12:19:32 +0100 Subject: [PATCH 089/122] Fix incorrect display names used --- Classes/LinphoneUI/UICallButton.h | 3 +-- Classes/LinphoneUI/UICallButton.m | 13 ++++--------- Classes/PhoneViewController.m | 4 ++-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Classes/LinphoneUI/UICallButton.h b/Classes/LinphoneUI/UICallButton.h index 9593c546e..08301ae5c 100644 --- a/Classes/LinphoneUI/UICallButton.h +++ b/Classes/LinphoneUI/UICallButton.h @@ -24,7 +24,6 @@ @private char mDigit; UITextField* mAddress; - UILabel* mDisplayName; } --(void) initWithAddress:(UITextField*) address withDisplayName:(UILabel*) displayName; +-(void) initWithAddress:(UITextField*) address; @end diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m index e4ccdceb6..eed2d3fe9 100644 --- a/Classes/LinphoneUI/UICallButton.m +++ b/Classes/LinphoneUI/UICallButton.m @@ -53,16 +53,12 @@ } else { char normalizedUserName[256]; NSString* toUserName = [NSString stringWithString:[mAddress text]]; - if ([mDisplayName.text length] <=0) { - NSString* lDisplayName = [[LinphoneManager instance] getDisplayNameFromAddressBook:toUserName andUpdateCallLog:nil]; - if (lDisplayName) { - mDisplayName.text = lDisplayName; - } - } + NSString* lDisplayName = [[LinphoneManager instance] getDisplayNameFromAddressBook:toUserName andUpdateCallLog:nil]; + linphone_proxy_config_normalize_number(proxyCfg,[toUserName cStringUsingEncoding:[NSString defaultCStringEncoding]],normalizedUserName,sizeof(normalizedUserName)); LinphoneAddress* tmpAddress = linphone_address_new(linphone_core_get_identity([LinphoneManager getLc])); linphone_address_set_username(tmpAddress,normalizedUserName); - linphone_address_set_display_name(tmpAddress,[mDisplayName.text length]>0?[mDisplayName.text cStringUsingEncoding:[NSString defaultCStringEncoding]]:nil); + linphone_address_set_display_name(tmpAddress,(lDisplayName)?[lDisplayName cStringUsingEncoding:[NSString defaultCStringEncoding]]:nil); linphone_call_params_enable_video(lcallParams,startVideo&linphone_core_video_enabled([LinphoneManager getLc])); @@ -85,9 +81,8 @@ // Drawing code. } */ --(void) initWithAddress:(UITextField*) address withDisplayName:(UILabel*) displayName { +-(void) initWithAddress:(UITextField*) address{ mAddress=[address retain]; - mDisplayName = [displayName retain]; [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; } diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 3390fd3a3..a0e732f8a 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -92,8 +92,8 @@ [nine initWithNumber:'9' addressField:address dtmf:false]; [star initWithNumber:'*' addressField:address dtmf:false]; [hash initWithNumber:'#' addressField:address dtmf:false]; - [callShort initWithAddress:address withDisplayName:mDisplayName]; - [callLarge initWithAddress:address withDisplayName:mDisplayName]; + [callShort initWithAddress:address]; + [callLarge initWithAddress:address]; [erase initWithAddressField:address]; [backToCallView addTarget:self action:@selector(backToCallViewPressed) forControlEvents:UIControlEventTouchUpInside]; mIncallViewController = [[IncallViewController alloc] initWithNibName:@"IncallViewController" From 8447bdb15c761ea930f74cd77a43045a4b53b733 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 23 Nov 2011 14:45:24 +0100 Subject: [PATCH 090/122] InCallView: add contact image --- Classes/IncallViewController.m | 24 +++++++++++++++++------- Classes/LinphoneUI/FastAddressBook.h | 6 +++++- Classes/LinphoneUI/FastAddressBook.m | 8 +++++--- Classes/LinphoneUI/LinphoneManager.h | 1 + Classes/LinphoneUI/LinphoneManager.m | 22 ++++++++++++++++++++++ linphone.xcodeproj/project.pbxproj | 4 ++++ 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index be0ef0ece..156e94a7e 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -18,6 +18,7 @@ */ #import "IncallViewController.h" #import +#import #import "linphonecore.h" #include "LinphoneManager.h" #include "private.h" @@ -161,15 +162,15 @@ int callCount(LinphoneCore* lc) { [self updateUIFromLinphoneState: nil]; } --(void) viewWillAppear:(BOOL)animated { -} +-(void) viewWillAppear:(BOOL)animated {} + -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (dismissed) { [self dismissModalViewControllerAnimated:true]; } else { [self updateCallsDurations]; - durationRefreasher = [NSTimer scheduledTimerWithTimeInterval:1 + durationRefreasher = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCallsDurations) userInfo:nil @@ -457,17 +458,25 @@ int callCount(LinphoneCore* lc) { return; } const LinphoneAddress* addr = linphone_call_get_remote_address(call); + if (addr) { NSMutableString* mss = [[NSMutableString alloc] init]; - + /* contact name */ const char* n = linphone_address_get_display_name(addr); if (n) [mss appendFormat:@"%s", n, nil]; else [mss appendFormat:@"%s", linphone_address_get_username(addr), nil]; - [cell.textLabel setText:mss]; - } else + + if ([mss compare:cell.textLabel.text] != 0 || cell.imageView.image == nil) { + [cell.textLabel setText:mss]; + + cell.imageView.image = [[LinphoneManager instance] getImageFromAddressBook:[NSString stringWithCString:linphone_address_get_username(addr) encoding: [NSString defaultCStringEncoding]]]; + } + } else { [cell.textLabel setText:@"plop"]; + cell.imageView.image = nil; + } NSMutableString* ms = [[NSMutableString alloc] init ]; if (linphone_call_get_state(call) == LinphoneCallStreamsRunning) { @@ -549,6 +558,7 @@ int callCount(LinphoneCore* lc) { calls = calls->next; } [cell.detailTextLabel setText:ms]; + cell.imageView.image = nil; /*if (linphone_core_is_in_conference(lc)) cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; @@ -664,7 +674,7 @@ int callCount(LinphoneCore* lc) { linphone_core_resume_call([LinphoneManager getLc], selectedCall); } - [self updateUIFromLinphoneState: nil]; + [self updateUIFromLinphoneState: nil]; } diff --git a/Classes/LinphoneUI/FastAddressBook.h b/Classes/LinphoneUI/FastAddressBook.h index 5d11bb65c..65713ad35 100644 --- a/Classes/LinphoneUI/FastAddressBook.h +++ b/Classes/LinphoneUI/FastAddressBook.h @@ -30,7 +30,9 @@ @end @interface FastAddressBook : NSObject { - NSMutableDictionary* mAddressBookMap; + NSMutableDictionary* mAddressBookMap; + + ABAddressBookRef addressBook; } -(Contact*) getMatchingRecord:(NSString*) number ; @@ -38,4 +40,6 @@ +(NSString*) normalizePhoneNumber:(NSString*) number ; -(id) init ; +@property (nonatomic, readonly) ABAddressBookRef addressBook; + @end diff --git a/Classes/LinphoneUI/FastAddressBook.m b/Classes/LinphoneUI/FastAddressBook.m index 527381597..c08762045 100644 --- a/Classes/LinphoneUI/FastAddressBook.m +++ b/Classes/LinphoneUI/FastAddressBook.m @@ -20,6 +20,8 @@ #import "FastAddressBook.h" @implementation FastAddressBook +@synthesize addressBook; + -(Contact*) getMatchingRecord:(NSString*) number { @synchronized (mAddressBookMap){ return (Contact*) [mAddressBookMap objectForKey:number]; @@ -71,9 +73,9 @@ void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef info, void -(FastAddressBook*) init { if ((self = [super init])) { mAddressBookMap = [[NSMutableDictionary alloc] init]; - ABAddressBookRef lAddressBook = ABAddressBookCreate(); - ABAddressBookRegisterExternalChangeCallback (lAddressBook,sync_address_book,mAddressBookMap); - sync_address_book(lAddressBook,nil,mAddressBookMap); + addressBook = ABAddressBookCreate(); + ABAddressBookRegisterExternalChangeCallback (addressBook,sync_address_book,mAddressBookMap); + sync_address_book(addressBook,nil,mAddressBookMap); } return self; } diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index e3bc4ab95..5da93e076 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -59,6 +59,7 @@ typedef enum _Connectivity { -(void) becomeActive; -(void) kickOffNetworkConnection; -(NSString*) getDisplayNameFromAddressBook:(NSString*) number andUpdateCallLog:(LinphoneCallLog*)log; +-(UIImage*) getImageFromAddressBook:(NSString*) number; diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 3adf864be..de012d74c 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -98,6 +98,28 @@ extern void libmssilk_init(); return nil; } + +-(UIImage*) getImageFromAddressBook:(NSString *)number { + NSString* lNormalizedNumber = [FastAddressBook normalizePhoneNumber:number]; + Contact* lContact = [mFastAddressBook getMatchingRecord:lNormalizedNumber]; + if (lContact) { + ABRecordRef person = ABAddressBookGetPersonWithRecordID(mFastAddressBook.addressBook, ABRecordGetRecordID(lContact.record)); + if (ABPersonHasImageData(person)) { + NSData* d; + // ios 4.1+ + if ( &ABPersonCopyImageDataWithFormat != nil) { + d = (NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail); + } else { + d = (NSData*)ABPersonCopyImageData(person); + } + return [UIImage imageWithData:d]; + } + } + /* return default image */ + return [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"contact_vide" ofType:@"png"]]; + //return nil; +} + -(void) updateCallWithAddressBookData:(LinphoneCall*) call { //1 copy adress book LinphoneCallLog* lLog = linphone_call_get_call_log(call); diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 3986b1c48..3b99d4eae 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -223,6 +223,7 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */ = {isa = PBXBuildFile; fileRef = 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; @@ -573,6 +574,7 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_vide.png; path = Resources/contact_vide.png; sourceTree = ""; }; 70571E1913FABCB000CDD3C2 /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = ""; }; 7066FC0B13E830E400EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; @@ -1103,6 +1105,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */, 2211DBCA1476BE7300DEE054 /* ajouter.png */, 2211DBCB1476BE7300DEE054 /* clavier.png */, 2211DBCC1476BE7300DEE054 /* contact.png */, @@ -1270,6 +1273,7 @@ 2211DBE51476BE7300DEE054 /* micro.png in Resources */, 2211DBE71476BE7300DEE054 /* pause_inactif.png in Resources */, 2211DBE91476BE7300DEE054 /* pause.png in Resources */, + 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 40b8aff198d765d56205b1855ba47908fdff1f45 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 23 Nov 2011 15:08:19 +0100 Subject: [PATCH 091/122] InCallView: restore 'pause' button correct behavior --- Classes/IncallViewController.m | 44 +++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 156e94a7e..cd69c548a 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -145,15 +145,22 @@ int callCount(LinphoneCore* lc) { } -(void) pauseCallPressed { - LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); - if (!selectedCall) - return; - if (linphone_call_get_state(selectedCall) == LinphoneCallPaused) { - [pause setSelected:NO]; - linphone_core_resume_call([LinphoneManager getLc], selectedCall); - }else{ - linphone_core_pause_call([LinphoneManager getLc], selectedCall); - [pause setSelected:YES]; + LinphoneCore* lc = [LinphoneManager getLc]; + + LinphoneCall* currentCall = linphone_core_get_current_call(lc); + if (currentCall) { + if (linphone_call_get_state(currentCall) == LinphoneCallStreamsRunning) { + [pause setSelected:NO]; + linphone_core_pause_call(lc, currentCall); + } + } else { + if (linphone_core_get_calls_nb(lc) == 1) { + LinphoneCall* c = (LinphoneCall*) linphone_core_get_calls(lc)->data; + if (linphone_call_get_state(c) == LinphoneCallPaused) { + linphone_core_resume_call(lc, c); + [pause setSelected:YES]; + } + } } } @@ -331,19 +338,24 @@ int callCount(LinphoneCore* lc) { if (selectedCall) { if (linphone_core_is_in_conference(lc)) [pause setHidden:YES]; - else if (linphone_call_get_state(selectedCall)==LinphoneCallPaused) { + else if (callCount(lc) == callsCount && callsCount == 1) { [pause setHidden:NO]; - //[pause setTitle:@"Resume" forState:UIControlStateNormal]; - pause.selected = YES; - } else if (callCount(lc) == callsCount && callsCount == 1) { - [pause setHidden:NO]; - //[pause setTitle:@"Pause" forState:UIControlStateNormal]; pause.selected = NO; } else { [pause setHidden:YES]; } } else { - [pause setHidden:callsCount > 0]; + if (callsCount == 1) { + LinphoneCall* c = (LinphoneCall*)linphone_core_get_calls(lc)->data; + if (linphone_call_get_state(c) == LinphoneCallPaused || + linphone_call_get_state(c) == LinphoneCallPausing) { + [pause setHidden:NO]; + pause.selected = YES; + } + [pause setHidden:NO]; + } else { + [pause setHidden:YES]; + } } [mergeCalls setHidden:!pause.hidden]; } From 23cae69f008350f430eff17974f66dfb7178761d Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 23 Nov 2011 16:28:12 +0100 Subject: [PATCH 092/122] InCallView: add visual indication of encryption status of each call --- Classes/IncallViewController.m | 18 ++++++++++++++++-- linphone.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index cd69c548a..a01f7665b 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -441,7 +441,7 @@ int callCount(LinphoneCore* lc) { } [cell.textLabel setBackgroundColor:[UIColor clearColor]]; [cell.detailTextLabel setBackgroundColor:[UIColor clearColor]]; - [cell.accessoryView setHidden:YES]; + //[cell.accessoryView setHidden:YES]; //[cell.backgroundView setBackgroundColor:cell.backgroundColor]; } @@ -519,6 +519,16 @@ int callCount(LinphoneCore* lc) { } else{ cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:1]; }*/ + UIImageView* uiiv = ((UIImageView*)cell.accessoryView); + if (linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) != + LinphoneMediaEncryptionNone) { + if (uiiv.image == nil) + uiiv.image = [UIImage imageNamed:@"secured.png"]; + } else { + uiiv = nil; + } + + return; LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); @@ -542,6 +552,8 @@ int callCount(LinphoneCore* lc) { cell.accessoryType = UITableViewCellAccessoryNone; [self updateActive:NO cell:cell]; cell.selected = NO; + + ((UIImageView*)cell.accessoryView).image = nil; [callTableView deselectRowAtIndexPath:indexPath animated:NO]; NSMutableString* ms = [[NSMutableString alloc] init ]; @@ -588,7 +600,9 @@ int callCount(LinphoneCore* lc) { cell.textLabel.font = [UIFont systemFontOfSize:40]; cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight; + cell.accessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)]; } + ((UIImageView*)cell.accessoryView).image = nil; LinphoneCore* lc = [LinphoneManager getLc]; if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) @@ -666,7 +680,7 @@ int callCount(LinphoneCore* lc) { LinphoneCore* lc = [LinphoneManager getLc]; - [[callTableView cellForRowAtIndexPath:indexPath] setSelected:YES animated:NO]; + //[[callTableView cellForRowAtIndexPath:indexPath] setSelected:YES animated:NO]; bool inConf = (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0); diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 3b99d4eae..13b0bf947 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -223,6 +223,7 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 34957F3F147D3FBF00DD7A09 /* secured.png in Resources */ = {isa = PBXBuildFile; fileRef = 34957F3E147D3FBF00DD7A09 /* secured.png */; }; 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */ = {isa = PBXBuildFile; fileRef = 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; 7066FC0C13E830E400EFC6DC /* libvpx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7066FC0B13E830E400EFC6DC /* libvpx.a */; }; @@ -574,6 +575,7 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 34957F3E147D3FBF00DD7A09 /* secured.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = secured.png; path = Resources/secured.png; sourceTree = ""; }; 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_vide.png; path = Resources/contact_vide.png; sourceTree = ""; }; 70571E1913FABCB000CDD3C2 /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = ""; }; 7066FC0B13E830E400EFC6DC /* libvpx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvpx.a; path = "liblinphone-sdk/apple-darwin/lib/libvpx.a"; sourceTree = ""; }; @@ -1105,6 +1107,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 34957F3E147D3FBF00DD7A09 /* secured.png */, 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */, 2211DBCA1476BE7300DEE054 /* ajouter.png */, 2211DBCB1476BE7300DEE054 /* clavier.png */, @@ -1274,6 +1277,7 @@ 2211DBE71476BE7300DEE054 /* pause_inactif.png in Resources */, 2211DBE91476BE7300DEE054 /* pause.png in Resources */, 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */, + 34957F3F147D3FBF00DD7A09 /* secured.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 260f57f6d53d6d742bbcb6fe1041aea81540e231 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 24 Nov 2011 10:53:17 +0100 Subject: [PATCH 093/122] Add missing files --- Classes/IncallViewController.h | 1 + Classes/IncallViewController.m | 40 +++++++++++++++++++-------------- Resources/contact_vide.png | Bin 0 -> 3524 bytes Resources/secured.png | Bin 0 -> 838 bytes submodules/linphone | 2 +- 5 files changed, 25 insertions(+), 18 deletions(-) create mode 100755 Resources/contact_vide.png create mode 100644 Resources/secured.png diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index f50953aeb..36a7f91c6 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -66,6 +66,7 @@ ABPeoplePickerNavigationController* myPeoplePickerController; + UITableViewCell* activeCallCell; VideoViewController* mVideoViewController; BOOL mVideoShown; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index a01f7665b..bfce10358 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -110,8 +110,8 @@ int callCount(LinphoneCore* lc) { [star initWithNumber:'*']; [hash initWithNumber:'#']; - [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchDown]; - [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchUpInside]; //[endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; [addToConf addTarget:self action:@selector(addToConfCallPressed) forControlEvents:UIControlEventTouchUpInside]; [pause addTarget:self action:@selector(pauseCallPressed) forControlEvents:UIControlEventTouchUpInside]; @@ -131,9 +131,9 @@ int callCount(LinphoneCore* lc) { [self dismissModalViewControllerAnimated:true]; } + -(void) mergeCallsPressed { LinphoneCore* lc = [LinphoneManager getLc]; - linphone_core_add_all_to_conference(lc); } @@ -303,6 +303,7 @@ int callCount(LinphoneCore* lc) { } } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { + activeCallCell = nil; [mute reset]; // if ( // [pause reset]; @@ -446,20 +447,19 @@ int callCount(LinphoneCore* lc) { } -(void) updateGlow { - glow += 0.1; + if (!activeCallCell) + return; - NSIndexPath* path = [callTableView indexPathForSelectedRow]; - if (path) { - UITableViewCell* cell = [callTableView cellForRowAtIndexPath:path]; - [self updateActive:YES cell:cell]; - [cell.backgroundView setNeedsDisplay]; - [cell setNeedsDisplay]; - [callTableView setNeedsDisplay]; - } + glow += 0.1; + + [self updateActive:YES cell:activeCallCell]; + [activeCallCell.backgroundView setNeedsDisplay]; + [activeCallCell setNeedsDisplay]; + [callTableView setNeedsDisplay]; } -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - [self updateActive:(cell.accessoryType == UITableViewCellAccessoryCheckmark) cell:cell]; + [self updateActive:(cell == activeCallCell) cell:cell]; //cell.accessoryType = UITableViewCellAccessoryNone; } @@ -605,12 +605,18 @@ int callCount(LinphoneCore* lc) { ((UIImageView*)cell.accessoryView).image = nil; LinphoneCore* lc = [LinphoneManager getLc]; - if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) + if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) { [self updateConferenceCell:cell at:indexPath]; - else - [self updateCell:cell at:indexPath withCall: [self retrieveCallAtIndex:indexPath.row inConference:NO] + if (linphone_core_is_in_conference(lc)) + activeCallCell = cell; + } else { + LinphoneCall* call = [self retrieveCallAtIndex:indexPath.row inConference:NO]; + [self updateCell:cell at:indexPath withCall: call conferenceActive:linphone_core_is_in_conference(lc)]; - + if (linphone_core_get_current_call(lc) == call) + activeCallCell = cell; + } + cell.userInteractionEnabled = YES; cell.selectionStyle = UITableViewCellSelectionStyleNone; //cell.selectionStyle = UITableViewCellSelectionStyleBlue; diff --git a/Resources/contact_vide.png b/Resources/contact_vide.png new file mode 100755 index 0000000000000000000000000000000000000000..e929b54bab63f5dfa8d50784add3257d9fd4fb0e GIT binary patch literal 3524 zcmV;#4LkCQP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{01YfjL_t(|+U;FWY#T)v|BX|( z_U4b{I8~i|O`4=q2oWbLB+7{tf!eP^EfP&3ATAV%OND}jRH+>42?@jvk#b4<0ZNgm zif|)Q8bl?EgakR1QfLw&diSAZ{B;q zd9%A_r%rzXDbAHmO~Ihlf|CK-x^=76f|CIvBB=!@0|ZEb91W1m<&s)(GC+(msRap; z6bX<7NQxv0Qlte*fGQ-@(^K^4pVu%s8OE(!w{Y*?JtPtd0Dz(>sIRX_Fc?HzTRR?q zybGEiK{4A4ll&<;%Ev^JZCXo12@ld-rZU`)m)}vSrK00cdP& zd_xR$czBr3pAQwR#I7icf_?k`i@kgIZU~EFT|6Jf^=?w4PFq0c`*iCiwXF8#Y)F1-2X5j_3$(~h+!$I|SPk&84q zI9Rfd$K!#=lK`zClarGj0|TE4kGb7$`2Bu(Jf5=pbi3VXXlQ_Is*frp}D!a zqphvYQ9;?o7=x4kPn|k7E{Zvdq97OymJN>CB?f~*D2gI2w<&bLYNA zI-Pb5K#pN?7cN|&L?Uh}_xt@=k2uK~gWvDRKmYt=C{HBfxNzYDz4+pbOvWJY|I($O zglz3WV$Nz}QcX>brTo&RpPXYsPGE82@C0UNW-R5kwYBSh?%LW~3;mv%nZe{_813yH zl4b+Il`DUcXm%G{=d7i;-EMe19?N3(%9TH;qhlwN009^u9}~KtN{I-d@$oS@K{t*7 zXm)niQnq>X=8BzPbgtRiSqYFP^YimU*HbAGoojx6-WdS7Tn~Q`$z)QPX|5QR6`U)X zOu`AeafAhlQahC#m*`x%Tu!<;r;7wg0we*F07-z>o5jg1OUq$*kE8{;TrLZfBch7U zV9{NME|*KXI878qu_P>Wxm@8QkcUC@6-AK%X%YwoEC6LPnTi1{~Y^z^jwMzHSgZX7;**ip$z$0g#99z9x=Jw+lB#N%<>eaGW*L?V%*>87Jck2)@M z>^OirJ3Ddg*s+qXNwh`2k|dMKlCJXDv15*5ZoIH;HVY@pwQJXK{P=NNSXi(ebGzMW zYHBL0zepq^bdf%v4<}BXV4}scw4f5w)zyWep&_<^|9)W{DaX~t<8dK4`}gn1(9n=$ z!ErP|K>kj-{{DW})6*k#S>?Dlv-I@zpufMLRVpF-uLMYw-rinI@LpP4T6KF-T~VJB zAe++G)@CUyCw7YJiu#lQ*%Wh*&Z&JqvH%SY4Us55l@rTW)29=~@lXBz_~VahWMsrr zUe5D&wrtsA$sCM~jKJ&lQh$HHqhrw~Ck`r;$>7$lTloI_?3w z%P+I;?ruD+^-{$Fx_|#ZhKGk~U|_&j`#>Oo>gsA+ZR7E{?X8Qq-g*mr_wHqNb#;{m zXf0CstC46liZ8$XlFptzYb&FmC<=T&-wJVpVWlVOXEGTqEG!_ANWe}W^5DUPc=gp+ zncwgKcL0=3CUNG>89IIX^s3ud9oXtnKyJUw<8k4jp3Uy4tb<5?vFvR`TnwzvBJ(-(Qi(GsaL`TZ`J- z8YoINHdR%rcEG?GLAVlNs`^Q{9;PbaU`b2^m4sao^-w^1Gird6I44zI|;0TFc9tu3Wi-_uhN2C^&wxabqJ=9iVE# z^U-wxPYf9aSzh#xQZf=3~2& zEOT7U;ChM${S_#90T43uQ+QX3sjDYo0J6Cp!r?G(-@YxZ`q4)pt;tU90|RvT?p?g` z#v8(~)X}jM+qeJ6>P(10>LtgF3M5&b(M$vl7hFsZDsMIrP=dmFnAxkr*oF*NNu0Yh zjgv9UcbS=)#l(d8k6xiFV!F$O!7DP{z8%5UtAAQf+1%WWPe1+i zfwt9M`4igvA09q01gER33&CI$7|VZA29{S)zQFWZEmLo|$SaEb%)MtUe_JF2gtuy- z)U6zaHdLf<4J7>-KSl;)S>cZX!C;f{7MhzkZ(?}(JUxhxncWKk7Z(@t$}6u}CTvSf z3)(x{t?Zff;0?yFUrb>^RU{RT=@v((nXP>$j+*lplW#*{CQIeVMCt$-n7%MIhdZqY zqCz%4TVB< z=+Gfs8-pwsTeKB>UV7=E1)$E(PBi%aIxo^@nVB?M*c#Ib0vQo2tZ@t}A095Ae)Cgb zxYRYoIcsW2b$i6Gu1xICOe#6^X8`7-QT+Y)-xi&H^UYaXvB;JMneQhB0HwMbb#--E z&Sp7w#fNX>R41Z>UnkxHk?NixvIZ3nVh~_yO$TwrFW(Ot#$&KL&4n>QcVwCuRv!sq zF-_t!P5Cj`)zv|%u13NXI;N(k(B9r&K0tQNZgh0if@;0b2kYJvH=|eH2`J9Sgl)^{ zP*m4cR8DV3YqGYi_xUUUjgF2|dwV;phy{&~{%$GrdcDYIm$?KppDP3BzPRNK={YbG zc@ffA@1$7EibQf15CK8G<_gF-2y|RnpViKVTHUMGp$!mnQ+S(%1_&gVof+4wsohV zEf*)c@iv#saRVrkis2Tmq?;GFpk;<+r-2d(h=P{kW~ArU^o#_T%d-#!m?(l;rVp;b z&=~29QxT&#e`gU8BAu<91&P|EQYpAMyE)gPCp?LJpZ~&U3TxcMA&wx zmJb;>za0EOZ6?fdWeW@{gT+4U0J%cw1n9* zf0^-76I&KUQg4+5sFJB3DV4Gy8;t^iM$FCKl^QQoXLfY$0ujpn@9phfmmgjFH%o7C zFYM@=MIyJP_8csdBsd-*NfIPLQY1hUASn_cDH5O!2#}o&s}yNLQY1jq#YtHUfSmfo yMJXykqTeu;;vj&=$0wu~oD7iN%Ymd+M*a^Twv1i!P8t*d0000P000*V1^@s6{^R5m00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipo2 z4HPx$pLt~f00PEIL_t(Y$F-GDPZL2H#(y*0Zjm;c7!Ci51Z@>qqkaN7a5r8|Og{l9 z6HiK{WCatWM{XQQJT=jSH{*!|=qHf0)L2CMqoPC%pi=1Wc-Y;x+m3EJt7D^KXaYXY^mesC z1R%pvq#na&+cWPUauE?J3{p(YSFQL-%Ou%!97|ZvL<=MIRzxI9BJ&UcYsffq((RHz zKoVeaw9A(r5s8r;c}35S(K>+TxnZ$9HyoHt8QLdzzr#;rhpW!WQw-c&2vE~hV}nxF z5kzT{ta;Xf%$Z$20>jLb9q%SP9xpFj(?&-#B4ctLq@M^CabT4zI|U9wy1Pn1kG zW*(_wuKQnwg2nVXq=y%gEv^H80&Ci^T@nQ-Yud2gHRalsGv9QGCRTkAwzQF+*GaQ* zs8|5Yb+PsbD7kh#BBd$cZDjqUZzvosKumQH+6h~O4NG^=bK&s^jEU7_7sXuq8UvFJ zB<&6MP89#C>K0PB(U%4r7SnR#u?6b+O`owd`r|l!qL4~y)zO!&nj0~pQP|w}?f(4h z^l>j%DfB`jd(Dq1Kt@`Tktk~~#~K~70su>1UvYbjR!q#RiU?MmoLrt*L+UYv9tFLX zZ*O0)^W{Bo#><;lRpx8|kf*){GfpuvU#iWxPp_YzjSz0{M{nyxZ|}$cy~W=5McS|4 zYT6+IU%9uWFu7wc#lyUppmT2tXke*h*pK*I5du1RxTbj9rWK7tuWaVJKg1 Q^Z)<=07*qoM6N<$f{rD0jsO4v literal 0 HcmV?d00001 diff --git a/submodules/linphone b/submodules/linphone index 53b732a7d..0d04b9451 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 53b732a7d32fe1f3005f39e446fb860de0afa97c +Subproject commit 0d04b9451bf845e8bd7f047504f689292e099554 From f279fd1160bf292f5b0a643d80636e36df308f64 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 24 Nov 2011 15:37:49 +0100 Subject: [PATCH 094/122] Minor UI fixes. Change linphone version to 1.1 --- Classes/IncallViewController.m | 6 ++++-- linphone-Info.plist | 4 ++-- submodules/linphone | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index bfce10358..008a05010 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -558,6 +558,7 @@ int callCount(LinphoneCore* lc) { NSMutableString* ms = [[NSMutableString alloc] init ]; const MSList* calls = linphone_core_get_calls(lc); + bool isFirst = true; while (calls) { LinphoneCall* call = (LinphoneCall*)calls->data; if (isInConference(call)) { @@ -565,9 +566,9 @@ int callCount(LinphoneCore* lc) { const char* n = linphone_address_get_display_name(addr); if (n) - [ms appendFormat:@"%s ", n, nil]; + [ms appendFormat:(isFirst?@"%s":@", %s"), n, nil]; else - [ms appendFormat:@"%s ", linphone_address_get_username(addr), nil]; + [ms appendFormat:(isFirst?@"%s":@", %s"), linphone_address_get_username(addr), nil]; //if (call == selectedCall) // [self updateActive:YES cell:cell]; @@ -578,6 +579,7 @@ int callCount(LinphoneCore* lc) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } + isFirst = false; } calls = calls->next; } diff --git a/linphone-Info.plist b/linphone-Info.plist index dccfa7f39..549e8cff8 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.4.9 + 3.4.10 CFBundleSignature ???? CFBundleVersion - 1.0.7.3 + 1.1 NSMainNibFile PhoneMainView UIApplicationExitsOnSuspend diff --git a/submodules/linphone b/submodules/linphone index 0d04b9451..53b732a7d 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 0d04b9451bf845e8bd7f047504f689292e099554 +Subproject commit 53b732a7d32fe1f3005f39e446fb860de0afa97c From bb2e94369579a3fa33ef5d644ba17fe4980d4ed4 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 25 Nov 2011 09:48:28 +0100 Subject: [PATCH 095/122] Update speex submodule --- submodules/externals/speex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/externals/speex b/submodules/externals/speex index 06a869e4a..ff426caac 160000 --- a/submodules/externals/speex +++ b/submodules/externals/speex @@ -1 +1 @@ -Subproject commit 06a869e4a71941d24bacbf08289a6319c920973c +Subproject commit ff426caacc0f32d8c15e0643b45aa12ad8df723f From 2b3f404133217bf7ba9681d1c9c9ae842475d8c4 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Sat, 26 Nov 2011 10:02:48 +0100 Subject: [PATCH 096/122] Update speex submodule --- submodules/externals/speex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/externals/speex b/submodules/externals/speex index ff426caac..a796bb048 160000 --- a/submodules/externals/speex +++ b/submodules/externals/speex @@ -1 +1 @@ -Subproject commit ff426caacc0f32d8c15e0643b45aa12ad8df723f +Subproject commit a796bb048a6b8b9b38ed2668da87ddb96a2de8f9 From 341a37bdad751850474f7c06a98473ab0e6bca71 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 28 Nov 2011 11:16:44 +0100 Subject: [PATCH 097/122] New conference detail view --- Classes/ConferenceCallDetailCell.xib | 238 +++++++++++++ Classes/ConferenceCallDetailView.h | 32 ++ Classes/ConferenceCallDetailView.m | 114 +++++++ Classes/ConferenceCallDetailView.xib | 477 +++++++++++++++++++++++++++ Classes/IncallViewController.h | 5 + Classes/IncallViewController.m | 139 ++++---- linphone.xcodeproj/project.pbxproj | 20 ++ 7 files changed, 956 insertions(+), 69 deletions(-) create mode 100644 Classes/ConferenceCallDetailCell.xib create mode 100644 Classes/ConferenceCallDetailView.h create mode 100644 Classes/ConferenceCallDetailView.m create mode 100644 Classes/ConferenceCallDetailView.xib diff --git a/Classes/ConferenceCallDetailCell.xib b/Classes/ConferenceCallDetailCell.xib new file mode 100644 index 000000000..9feae9f9c --- /dev/null +++ b/Classes/ConferenceCallDetailCell.xib @@ -0,0 +1,238 @@ + + + + 1280 + 11C74 + 1938 + 1138.23 + 567.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + IBUITableViewCell + IBUIImageView + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 256 + + + + 292 + {{0, -0.5}, {80, 80}} + + + + _NS:567 + 1 + NO + IBCocoaTouchFramework + + + + 292 + {{79, -0.5}, {241, 80}} + + + + _NS:328 + NO + YES + 7 + 2 + NO + IBCocoaTouchFramework + Texte de test + + 1 + MCAwIDAAA + + + 1 + 10 + + 1 + 40 + + + Helvetica + 40 + 16 + + + + {320, 79} + + + + _NS:395 + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 80} + + + + _NS:384 + IBCocoaTouchFramework + + ConferenceDetailCellIdentifier + + + + + + + + conferenceDetailCell + + + + 7 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 3 + + + + + + + + + 5 + + + + + 6 + + + + + + + ConferenceCallDetailView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 7 + + + + + ConferenceCallDetailView + UIViewController + + UIButton + UIButton + UITableViewCell + UIButton + UIButton + UIButton + UITableView + + + + addCall + UIButton + + + back + UIButton + + + conferenceDetailCell + UITableViewCell + + + hangup + UIButton + + + mute + UIButton + + + speaker + UIButton + + + table + UITableView + + + + IBProjectSource + ./Classes/ConferenceCallDetailView.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 933 + + diff --git a/Classes/ConferenceCallDetailView.h b/Classes/ConferenceCallDetailView.h new file mode 100644 index 000000000..ccc5d10c8 --- /dev/null +++ b/Classes/ConferenceCallDetailView.h @@ -0,0 +1,32 @@ +// +// ConferenceCallDetailView.h +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 25/11/11. +// Copyright (c) 2011 Belledonne Communications. All rights reserved. +// + +#import +#import "LinphoneUI/UIMuteButton.h" +#import "LinphoneUI/UISpeakerButton.h" + +@interface ConferenceCallDetailView : UIViewController { + + UIMuteButton* mute; + UISpeakerButton* speaker; + UIButton* back; + UIButton* hangup; + UITableView* table; + + UITableViewCell* conferenceDetailCell; +} + +@property (nonatomic, retain) IBOutlet UIButton* mute; +@property (nonatomic, retain) IBOutlet UIButton* speaker; +@property (nonatomic, retain) IBOutlet UIButton* addCall; +@property (nonatomic, retain) IBOutlet UIButton* back; +@property (nonatomic, retain) IBOutlet UIButton* hangup; +@property (nonatomic, retain) IBOutlet UITableView* table; + +@property (nonatomic, assign) IBOutlet UITableViewCell* conferenceDetailCell; +@end diff --git a/Classes/ConferenceCallDetailView.m b/Classes/ConferenceCallDetailView.m new file mode 100644 index 000000000..0ca6890c5 --- /dev/null +++ b/Classes/ConferenceCallDetailView.m @@ -0,0 +1,114 @@ +// +// ConferenceCallDetailView.m +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 25/11/11. +// Copyright (c) 2011 Belledonne Communications. All rights reserved. +// + +#import "ConferenceCallDetailView.h" +#import "linphonecore.h" +#import "LinphoneManager.h" +#import "IncallViewController.h" + +@implementation ConferenceCallDetailView + +@synthesize mute; +@synthesize speaker; +@synthesize back; +@synthesize hangup; +@synthesize table; + +@synthesize conferenceDetailCell; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [back addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; + + table.rowHeight = 80; + + [mute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; + [speaker initWithOnImage:[UIImage imageNamed:@"HP_inverse.png"] offImage:[UIImage imageNamed:@"HP.png"] ]; +} + +-(void) backButtonPressed { + [self dismissModalViewControllerAnimated:YES]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +-(void) viewWillAppear:(BOOL)animated { + [table reloadData]; + [mute reset]; + [speaker reset]; +} + +#pragma mark - UITableView delegates +-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.row % 2) + cell.backgroundColor = [UIColor lightGrayColor]; + else + cell.backgroundColor = [UIColor darkGrayColor]; +} + +-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString* identifier = @"ConferenceDetailCellIdentifier"; + UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; + if (cell == nil) { + [[NSBundle mainBundle] loadNibNamed:@"ConferenceCallDetailCell" owner:self options:nil]; + cell = conferenceDetailCell; + self.conferenceDetailCell = nil; + } + + /* retrieve cell's fields using tags */ + UIImageView* image = (UIImageView*) [cell viewWithTag:1]; + UILabel* label = (UILabel*) [cell viewWithTag:2]; + + /* update cell content */ + LinphoneCall* call = [IncallViewController retrieveCallAtIndex:indexPath.row inConference:YES]; + [IncallViewController updateCellImageView:image Label:label DetailLabel:nil AndAccessoryView:nil withCall:call]; + + tableView.rowHeight = 80;//cell.bounds.size.height; + + return cell; +} + +-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + LinphoneCore* lc = [LinphoneManager getLc]; + int result = linphone_core_get_conference_size(lc) - (int)linphone_core_is_in_conference(lc); + return result; +} + +@end diff --git a/Classes/ConferenceCallDetailView.xib b/Classes/ConferenceCallDetailView.xib new file mode 100644 index 000000000..d756d676e --- /dev/null +++ b/Classes/ConferenceCallDetailView.xib @@ -0,0 +1,477 @@ + + + + 1280 + 11C74 + 1938 + 1138.23 + 567.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + IBUITableView + IBUIButton + IBUIView + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + + + 274 + {320, 328} + + + + _NS:418 + + 3 + MCAwAA + + YES + IBCocoaTouchFramework + YES + 0 + YES + 44 + 22 + 22 + + + + 292 + {{107, 328}, {106, 66}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + mic_active.png + + + NSImage + micro_inverse.png + + + NSImage + micro.png + + + 2 + 2 + + + Helvetica-Bold + 18 + 16 + + + + + 292 + {{213, 328}, {107, 66}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + HP_inverse.png + + + NSImage + HP.png + + + + + + + 292 + {{0, 394}, {320, 66}} + + + + + 1 + MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + stopcall-red.png + + + NSImage + clavier-01-106px.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {{0, 328}, {107, 66}} + + + + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + effacer.png + + + + + + {{0, 20}, {320, 460}} + + + + + 3 + MC42NjY2NjY2NjY3AA + + + IBCocoaTouchFramework + + + + + + + back + + + + 16 + + + + hangup + + + + 17 + + + + mute + + + + 18 + + + + speaker + + + + 19 + + + + view + + + + 20 + + + + table + + + + 23 + + + + dataSource + + + + 21 + + + + delegate + + + + 22 + + + + + + 0 + + + + + + 1 + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 7 + + + + + + 10 + + + mute + + + 11 + + + end + + + 12 + + + speaker + + + 14 + + + Erase + + + + + ConferenceCallDetailView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIMuteButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIHangUpButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UISpeakerButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIEraseButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 23 + + + + + ConferenceCallDetailView + UIViewController + + UIButton + UIButton + UITableViewCell + UIButton + UIButton + UIButton + UITableView + + + + addCall + UIButton + + + back + UIButton + + + conferenceDetailCell + UITableViewCell + + + hangup + UIButton + + + mute + UIButton + + + speaker + UIButton + + + table + UITableView + + + + IBProjectSource + ./Classes/ConferenceCallDetailView.h + + + + UIEraseButton + UIButton + + IBProjectSource + ./Classes/UIEraseButton.h + + + + UIHangUpButton + UIButton + + IBProjectSource + ./Classes/UIHangUpButton.h + + + + UIMuteButton + UIToggleButton + + IBProjectSource + ./Classes/UIMuteButton.h + + + + UISpeakerButton + UIToggleButton + + IBProjectSource + ./Classes/UISpeakerButton.h + + + + UIToggleButton + UIButton + + IBProjectSource + ./Classes/UIToggleButton.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + + {107, 67} + {107, 67} + {106, 60} + {66, 65} + {20, 20} + {107, 67} + {107, 67} + {62, 54} + + 933 + + diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 36a7f91c6..55fc0d57f 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -19,6 +19,7 @@ #import #import "linphonecore.h" #import "PhoneViewController.h" +#import "ConferenceCallDetailView.h" #import #include "UILinphone.h" @class VideoViewController; @@ -69,6 +70,7 @@ UITableViewCell* activeCallCell; VideoViewController* mVideoViewController; + ConferenceCallDetailView* conferenceDetail; BOOL mVideoShown; BOOL mVideoIsPending; BOOL mIncallViewIsReady; @@ -78,11 +80,14 @@ - (IBAction)doAction:(id)sender; ++(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf; ++ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIImageView*)accessoryView withCall:(LinphoneCall*) call; @property (nonatomic, retain) IBOutlet UIView* controlSubView; @property (nonatomic, retain) IBOutlet UIView* callControlSubView; @property (nonatomic, retain) IBOutlet UIView* padSubView; @property (nonatomic, retain) IBOutlet UIView* hangUpView; +@property (nonatomic, retain) IBOutlet UIViewController* conferenceDetail; @property (nonatomic, retain) IBOutlet UIButton* endCtrl; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 008a05010..5675b9c13 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -30,6 +30,7 @@ @synthesize callControlSubView; @synthesize padSubView; @synthesize hangUpView; +@synthesize conferenceDetail; @synthesize addToConf; @synthesize endCtrl; @@ -118,7 +119,11 @@ int callCount(LinphoneCore* lc) { [mergeCalls setHidden:YES]; mVideoViewController = [[VideoViewController alloc] initWithNibName:@"VideoViewController" bundle:[NSBundle mainBundle]]; - mVideoShown=FALSE; + + conferenceDetail = [[ConferenceCallDetailView alloc] initWithNibName:@"ConferenceCallDetailView" + bundle:[NSBundle mainBundle]]; + + mVideoShown=FALSE; mIncallViewIsReady=FALSE; mVideoIsPending=FALSE; //selectedCall = nil; @@ -359,6 +364,14 @@ int callCount(LinphoneCore* lc) { } } [mergeCalls setHidden:!pause.hidden]; + + // update conference details view if diaplsyed + if (self.presentedViewController == conferenceDetail) { + if (!linphone_core_is_in_conference(lc)) + [self dismissModalViewControllerAnimated:YES]; + else + [conferenceDetail.table reloadData]; + } } - (IBAction)doAction:(id)sender { @@ -404,7 +417,7 @@ int callCount(LinphoneCore* lc) { [super dealloc]; } --(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ ++(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); if (!conf && linphone_core_get_conference_size([LinphoneManager getLc])) @@ -442,8 +455,6 @@ int callCount(LinphoneCore* lc) { } [cell.textLabel setBackgroundColor:[UIColor clearColor]]; [cell.detailTextLabel setBackgroundColor:[UIColor clearColor]]; - //[cell.accessoryView setHidden:YES]; - //[cell.backgroundView setBackgroundColor:cell.backgroundColor]; } -(void) updateGlow { @@ -460,13 +471,12 @@ int callCount(LinphoneCore* lc) { -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [self updateActive:(cell == activeCallCell) cell:cell]; - //cell.accessoryType = UITableViewCellAccessoryNone; } -- (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ ++ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIImageView*)accessoryView withCall:(LinphoneCall*) call { if (call == NULL) { ms_warning("UpdateCell called with null call"); - [cell.textLabel setText:@""]; + [label setText:@""]; return; } const LinphoneAddress* addr = linphone_call_get_remote_address(call); @@ -480,66 +490,47 @@ int callCount(LinphoneCore* lc) { else [mss appendFormat:@"%s", linphone_address_get_username(addr), nil]; - if ([mss compare:cell.textLabel.text] != 0 || cell.imageView.image == nil) { - [cell.textLabel setText:mss]; + if ([mss compare:label.text] != 0 || imageView.image == nil) { + [label setText:mss]; - cell.imageView.image = [[LinphoneManager instance] getImageFromAddressBook:[NSString stringWithCString:linphone_address_get_username(addr) encoding: [NSString defaultCStringEncoding]]]; + imageView.image = [[LinphoneManager instance] getImageFromAddressBook:[NSString stringWithCString:linphone_address_get_username(addr) encoding: [NSString defaultCStringEncoding]]]; } } else { - [cell.textLabel setText:@"plop"]; - cell.imageView.image = nil; + [label setText:@"plop"]; + imageView.image = nil; } - NSMutableString* ms = [[NSMutableString alloc] init ]; - if (linphone_call_get_state(call) == LinphoneCallStreamsRunning) { - int duration = linphone_call_get_duration(call); - if (duration >= 60) - [ms appendFormat:@"%02i:%02i", (duration/60), duration - 60*(duration/60), nil]; - else - [ms appendFormat:@"%02i sec", duration, nil]; - } else { - switch (linphone_call_get_state(call)) { - case LinphoneCallPaused: - [ms appendFormat:@"%@", NSLocalizedString(@"Paused", nil), nil]; - break; - case LinphoneCallOutgoingProgress: - [ms appendFormat:@"%@...", NSLocalizedString(@"In progress", nil), nil]; - break; - default: - break; + if (detailLabel != nil) { + NSMutableString* ms = [[NSMutableString alloc] init ]; + if (linphone_call_get_state(call) == LinphoneCallStreamsRunning) { + int duration = linphone_call_get_duration(call); + if (duration >= 60) + [ms appendFormat:@"%02i:%02i", (duration/60), duration - 60*(duration/60), nil]; + else + [ms appendFormat:@"%02i sec", duration, nil]; + } else { + switch (linphone_call_get_state(call)) { + case LinphoneCallPaused: + [ms appendFormat:@"%@", NSLocalizedString(@"Paused", nil), nil]; + break; + case LinphoneCallOutgoingProgress: + [ms appendFormat:@"%@...", NSLocalizedString(@"In progress", nil), nil]; + break; + default: + break; + } } + [detailLabel setText:ms]; } - [cell.detailTextLabel setText:ms]; - - /* - if (linphone_core_get_current_call([LinphoneManager getLc]) == call) { - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; - } else if (confActive && isInConference(call)) { - cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1]; - } else{ - cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:1]; - }*/ - UIImageView* uiiv = ((UIImageView*)cell.accessoryView); - if (linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) != - LinphoneMediaEncryptionNone) { - if (uiiv.image == nil) - uiiv.image = [UIImage imageNamed:@"secured.png"]; - } else { - uiiv = nil; - } - - return; - - - LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); - if (call == selectedCall) { - [cell setSelected:YES animated:NO]; - [callTableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone]; - cell.accessoryType = UITableViewCellAccessoryCheckmark; - }else{ - [cell setSelected:NO animated:NO]; - [callTableView deselectRowAtIndexPath:path animated:NO]; - cell.accessoryType = UITableViewCellAccessoryNone; + + if (accessoryView != nil) { + if (linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) != + LinphoneMediaEncryptionNone) { + if (accessoryView.image == nil) + accessoryView.image = [UIImage imageNamed:@"secured.png"]; + } else { + accessoryView.image = nil; + } } } @@ -549,11 +540,9 @@ int callCount(LinphoneCore* lc) { LinphoneCore* lc = [LinphoneManager getLc]; - cell.accessoryType = UITableViewCellAccessoryNone; [self updateActive:NO cell:cell]; cell.selected = NO; - ((UIImageView*)cell.accessoryView).image = nil; [callTableView deselectRowAtIndexPath:indexPath animated:NO]; NSMutableString* ms = [[NSMutableString alloc] init ]; @@ -576,7 +565,6 @@ int callCount(LinphoneCore* lc) { if (call == selectedCall) { [callTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; cell.selected = YES; - cell.accessoryType = UITableViewCellAccessoryCheckmark; } isFirst = false; @@ -592,6 +580,12 @@ int callCount(LinphoneCore* lc) { cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];*/ } +-(void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath +{ + // show conference detail view + [self presentModalViewController:conferenceDetail animated:true]; + +} // UITableViewDataSource (required) - (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -602,21 +596,28 @@ int callCount(LinphoneCore* lc) { cell.textLabel.font = [UIFont systemFontOfSize:40]; cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight; - cell.accessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)]; } - ((UIImageView*)cell.accessoryView).image = nil; + if (cell.accessoryView != nil) + ((UIImageView*)cell.accessoryView).image = nil; LinphoneCore* lc = [LinphoneManager getLc]; if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) { [self updateConferenceCell:cell at:indexPath]; if (linphone_core_is_in_conference(lc)) activeCallCell = cell; + cell.accessoryView = nil; + if (linphone_core_is_in_conference(lc)) + cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; + else + cell.accessoryType = UITableViewCellAccessoryNone; } else { - LinphoneCall* call = [self retrieveCallAtIndex:indexPath.row inConference:NO]; - [self updateCell:cell at:indexPath withCall: call - conferenceActive:linphone_core_is_in_conference(lc)]; + LinphoneCall* call = [IncallViewController retrieveCallAtIndex:indexPath.row inConference:NO]; + [IncallViewController updateCellImageView:cell.imageView Label:cell.textLabel DetailLabel:cell.detailTextLabel AndAccessoryView:(UIImageView*)cell.accessoryView withCall:call]; if (linphone_core_get_current_call(lc) == call) activeCallCell = cell; + cell.accessoryType = UITableViewCellAccessoryNone; + if (cell.accessoryView == nil) + cell.accessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)]; } cell.userInteractionEnabled = YES; @@ -692,7 +693,7 @@ int callCount(LinphoneCore* lc) { bool inConf = (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0); - LinphoneCall* selectedCall = [self retrieveCallAtIndex:indexPath.row inConference:inConf]; + LinphoneCall* selectedCall = [IncallViewController retrieveCallAtIndex:indexPath.row inConference:inConf]; if (inConf) { if (linphone_core_is_in_conference(lc)) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 13b0bf947..18d84e353 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -223,6 +223,12 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 344ABD72147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */; }; + 344ABD73147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */; }; + 344ABD77147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */; }; + 344ABD78147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */; }; + 344ABD7A147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */; }; + 344ABD7B147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */; }; 34957F3F147D3FBF00DD7A09 /* secured.png in Resources */ = {isa = PBXBuildFile; fileRef = 34957F3E147D3FBF00DD7A09 /* secured.png */; }; 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */ = {isa = PBXBuildFile; fileRef = 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; @@ -575,6 +581,10 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConferenceCallDetailView.xib; sourceTree = ""; }; + 344ABD75147FCB68007420B6 /* ConferenceCallDetailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConferenceCallDetailView.h; sourceTree = ""; }; + 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConferenceCallDetailView.m; sourceTree = ""; }; + 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConferenceCallDetailCell.xib; sourceTree = ""; }; 34957F3E147D3FBF00DD7A09 /* secured.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = secured.png; path = Resources/secured.png; sourceTree = ""; }; 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_vide.png; path = Resources/contact_vide.png; sourceTree = ""; }; 70571E1913FABCB000CDD3C2 /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = ""; }; @@ -712,6 +722,10 @@ 22E028B413B4CCBD0068A713 /* VideoViewController.h */, 22E028B513B4CCBD0068A713 /* VideoViewController.m */, 22E028B613B4CCBD0068A713 /* VideoViewController.xib */, + 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */, + 344ABD75147FCB68007420B6 /* ConferenceCallDetailView.h */, + 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */, + 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */, ); path = Classes; sourceTree = ""; @@ -1278,6 +1292,8 @@ 2211DBE91476BE7300DEE054 /* pause.png in Resources */, 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */, 34957F3F147D3FBF00DD7A09 /* secured.png in Resources */, + 344ABD72147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */, + 344ABD7A147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1332,6 +1348,8 @@ 2211DBE61476BE7300DEE054 /* micro.png in Resources */, 2211DBE81476BE7300DEE054 /* pause_inactif.png in Resources */, 2211DBEA1476BE7300DEE054 /* pause.png in Resources */, + 344ABD73147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */, + 344ABD7B147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1367,6 +1385,7 @@ 2211DBBE14769C8300DEE054 /* CallDelegate.m in Sources */, 2211DBC014769CB200DEE054 /* IncallViewController.m in Sources */, 22D817AD147A9F33001CFB9C /* UIAddVideoButton.m in Sources */, + 344ABD77147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1399,6 +1418,7 @@ 2211DBBF14769C8300DEE054 /* CallDelegate.m in Sources */, 2211DBC114769CB300DEE054 /* IncallViewController.m in Sources */, 22D817AE147A9F33001CFB9C /* UIAddVideoButton.m in Sources */, + 344ABD78147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 5d49e8d5d843270f4b385471607be74582a29a60 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 28 Nov 2011 12:36:45 +0100 Subject: [PATCH 098/122] fix Could not read socket issue + speex issue --- README | 15 +++++++-------- linphone.xcodeproj/project.pbxproj | 10 ---------- submodules/build/Makefile | 12 ++++++------ submodules/build/builder-iphone-os.mk | 20 ++++++++++---------- submodules/externals/exosip | 2 +- submodules/linphone | 2 +- 6 files changed, 25 insertions(+), 36 deletions(-) diff --git a/README b/README index 8e33ced92..da91ec552 100644 --- a/README +++ b/README @@ -22,13 +22,13 @@ $ sudo mv gas-preprocessor.pl /opt/local/bin/. Link macport libtoolize to glibtoolize (sudo ln -s /opt/local/bin/glibtoolize /opt/local/bin/libtoolize) Link host's strings to simulator SDK (ln -s /usr/bin/strings /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/strings) -******************************************* -*******GPL versus non GPL****************** -******************************************* -This sdk can be generated in 2 flavors. Firt is GPL, it means liblinphone include GPL third parties like FFMPEG or x264. -If you choose this flavor, your final application must comply with GPL. This is the default mode. +*********************************************************************** +*******GPL third parties versus non GPL third parties****************** +*********************************************************************** +This sdk can be generated in 2 flavors. Firt is with GPL third parties, it means liblinphone includes GPL third parties like FFMPEG or x264. +If you choose this flavor, your final application must comply with GPL in any case. This is the default mode. -To generate the liblinphone multi arch sdkin GPL mode, once the above commands have been executed: +To generate the liblinphone multi arch sdk in GPL mode, once the above commands have been executed: cd submodules/build make all @@ -37,7 +37,7 @@ If you choose this flavor, your final application is still subject to GPL excep To generate the liblinphone multi arch sdkin non GPL mode, once the above commands have been executed: cd submodules/build - make all enable_gpl=no + make all enable_gpl_third_parties=no ****************************************** ****Third party, subject to lincense*i**** @@ -52,5 +52,4 @@ In case you upgrade your IOS SDK, you may force configure by using make targets Libraries are available from liblinphone-sdk/ -liblinphone xcode subproject: This subproject is just for debuggingi purpose, do not compile it until you know exactly what you are doing. diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 13b0bf947..0f50be466 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -174,9 +174,6 @@ 22D8F15D147548E2008C97DB /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 22D8F15E147548E2008C97DB /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; }; 22D8F15F147548E2008C97DB /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; }; - 22D8F160147548E2008C97DB /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8013C73D3100210156 /* libavcodec.a */; }; - 22D8F161147548E2008C97DB /* libavutil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8113C73D3100210156 /* libavutil.a */; }; - 22D8F162147548E2008C97DB /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8213C73D3100210156 /* libswscale.a */; }; 22D8F163147548E2008C97DB /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22E5B0AD133B5EA20044EA25 /* libssl.a */; }; 22D8F164147548E2008C97DB /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22E5B0AE133B5EA20044EA25 /* libcrypto.a */; }; 22D8F165147548E2008C97DB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; @@ -202,8 +199,6 @@ 22D8F179147548E2008C97DB /* libopencore-amrwb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED31344B0EF00F6EF27 /* libopencore-amrwb.a */; }; 22D8F17A147548E2008C97DB /* libopencore-amrnb.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED41344B0EF00F6EF27 /* libopencore-amrnb.a */; }; 22D8F17B147548E2008C97DB /* libmsamr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226F2ED51344B0EF00F6EF27 /* libmsamr.a */; }; - 22D8F17C147548E2008C97DB /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; }; - 22D8F17D147548E2008C97DB /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFC13D7125500B30535 /* libmsx264.a */; }; 22D8F17E147548E2008C97DB /* libSKP_SILK_SDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AA1472527D0037138E /* libSKP_SILK_SDK.a */; }; 22D8F17F147548E2008C97DB /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AB1472527D0037138E /* libsrtp.a */; }; 22D8F180147548E2008C97DB /* libmssilk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 226183AF147259670037138E /* libmssilk.a */; }; @@ -641,9 +636,6 @@ 22D8F15D147548E2008C97DB /* OpenGLES.framework in Frameworks */, 22D8F15E147548E2008C97DB /* CoreMedia.framework in Frameworks */, 22D8F15F147548E2008C97DB /* CoreVideo.framework in Frameworks */, - 22D8F160147548E2008C97DB /* libavcodec.a in Frameworks */, - 22D8F161147548E2008C97DB /* libavutil.a in Frameworks */, - 22D8F162147548E2008C97DB /* libswscale.a in Frameworks */, 22D8F163147548E2008C97DB /* libssl.a in Frameworks */, 22D8F164147548E2008C97DB /* libcrypto.a in Frameworks */, 22D8F165147548E2008C97DB /* Foundation.framework in Frameworks */, @@ -669,8 +661,6 @@ 22D8F179147548E2008C97DB /* libopencore-amrwb.a in Frameworks */, 22D8F17A147548E2008C97DB /* libopencore-amrnb.a in Frameworks */, 22D8F17B147548E2008C97DB /* libmsamr.a in Frameworks */, - 22D8F17C147548E2008C97DB /* libx264.a in Frameworks */, - 22D8F17D147548E2008C97DB /* libmsx264.a in Frameworks */, 22D8F17E147548E2008C97DB /* libSKP_SILK_SDK.a in Frameworks */, 22D8F17F147548E2008C97DB /* libsrtp.a in Frameworks */, 22D8F180147548E2008C97DB /* libmssilk.a in Frameworks */, diff --git a/submodules/build/Makefile b/submodules/build/Makefile index 4e2d6de4c..91f9d7d86 100644 --- a/submodules/build/Makefile +++ b/submodules/build/Makefile @@ -19,16 +19,16 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################ -enable_gpl=yes +enable_gpl_third_parties=yes .NOTPARALLEL all: build warning -ifeq ($(enable_gpl),yes) +ifeq ($(enable_gpl_third_parties),yes) warning: @echo @echo "*****************************************************************" @echo "*****************************************************************" @echo "*****CAUTION, this liblinphone SDK is built using GPL code ******" - @echo "*****To disable gpl code, use make enable_gpl=no *************" + @echo "*****To disable gpl code, use make enable_gpl_third_parties=no***" @echo "*****************************************************************" @echo "*****************************************************************" else @@ -42,9 +42,9 @@ warning: endif build: - make -f builder-iphone-os.mk all enable_gpl=$(enable_gpl) \ - && make -f builder-iphone-simulator.mk all enable_gpl=$(enable_gpl)\ - && make -f builder-iphone-os.mk host=armv7-apple-darwin all enable_gpl=$(enable_gpl)\ + make -f builder-iphone-os.mk all enable_gpl_third_parties=$(enable_gpl_third_parties) \ + && make -f builder-iphone-simulator.mk all enable_gpl_third_parties=$(enable_gpl_third_parties)\ + && make -f builder-iphone-os.mk host=armv7-apple-darwin all enable_gpl_third_parties=$(enable_gpl_third_parties)\ && make -f builder-iphone-os.mk delivery-sdk clean: make -f builder-iphone-simulator.mk clean \ diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk index c04473289..07f5ab3a9 100644 --- a/submodules/build/builder-iphone-os.mk +++ b/submodules/build/builder-iphone-os.mk @@ -47,25 +47,25 @@ LINPHONE_BUILD_DIR=$(BUILDER_BUILD_DIR)/linphone all: build-linphone build-msilbc build-msamr build-msx264 build-mssilk -$(LINPHONE_BUILD_DIR)/enable_gpl: +$(LINPHONE_BUILD_DIR)/enable_gpl_third_parties: mkdir -p $(LINPHONE_BUILD_DIR) - touch $(LINPHONE_BUILD_DIR)/enable_gpl - rm -f $(LINPHONE_BUILD_DIR)/disable_gpl + touch $(LINPHONE_BUILD_DIR)/enable_gpl_third_parties + rm -f $(LINPHONE_BUILD_DIR)/disable_gpl_third_parties cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile -$(LINPHONE_BUILD_DIR)/disable_gpl: +$(LINPHONE_BUILD_DIR)/disable_gpl_third_parties: mkdir -p $(LINPHONE_BUILD_DIR) - touch $(LINPHONE_BUILD_DIR)/disable_gpl - rm -f $(LINPHONE_BUILD_DIR)/enable_gpl + touch $(LINPHONE_BUILD_DIR)/disable_gpl_third_parties + rm -f $(LINPHONE_BUILD_DIR)/enable_gpl_third_parties cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile -ifeq ($(enable_gpl),yes) +ifeq ($(enable_gpl_third_parties),yes) linphone_configure_controls+= --enable-ffmpeg --enable-zrtp -detect_gpl_mode_switch: $(LINPHONE_BUILD_DIR)/enable_gpl +detect_gpl_mode_switch: $(LINPHONE_BUILD_DIR)/enable_gpl_third_parties else linphone_configure_controls+= --disable-ffmpeg --disable-zrtp -detect_gpl_mode_switch: $(LINPHONE_BUILD_DIR)/disable_gpl +detect_gpl_mode_switch: $(LINPHONE_BUILD_DIR)/disable_gpl_third_parties endif @@ -172,7 +172,7 @@ $(BUILDER_BUILD_DIR)/$(eXosip_dir)/Makefile: $(BUILDER_SRC_DIR)/$(eXosip_dir)/co mkdir -p $(BUILDER_BUILD_DIR)/$(eXosip_dir) cd $(BUILDER_BUILD_DIR)/$(eXosip_dir)/\ && PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \ - $(BUILDER_SRC_DIR)/$(eXosip_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} CFLAGS="-I$(prefix)/include -L$(prefix)/lib -lcrypto -DMULTITASKING_ENABLED" --enable-openssl --disable-tools + $(BUILDER_SRC_DIR)/$(eXosip_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} CFLAGS="-I$(prefix)/include -L$(prefix)/lib -lcrypto" --enable-openssl --disable-tools build-eXosip2: $(BUILDER_BUILD_DIR)/$(eXosip_dir)/Makefile cd $(BUILDER_BUILD_DIR)/$(eXosip_dir) \ diff --git a/submodules/externals/exosip b/submodules/externals/exosip index f28804413..c3da03035 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit f288044136b3e60baf6c0805e8cf87e5cdbc7890 +Subproject commit c3da0303519ad3120355cb85baee9cf6d0e4d1c2 diff --git a/submodules/linphone b/submodules/linphone index 53b732a7d..28a1f62e2 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 53b732a7d32fe1f3005f39e446fb860de0afa97c +Subproject commit 28a1f62e26e59273c7b8bf2c61a6c301dfc32904 From 3dd52b7a85314e769c72ae9ba4440dfcc71e5aa8 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 29 Nov 2011 11:43:55 +0100 Subject: [PATCH 099/122] apple sore version 1.1 --- disable-security.patch | 35 ++++++++++++++++++++++++++++++ linphone.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 disable-security.patch diff --git a/disable-security.patch b/disable-security.patch new file mode 100644 index 000000000..98f46d90a --- /dev/null +++ b/disable-security.patch @@ -0,0 +1,35 @@ +diff --git a/Settings.bundle/Root.plist b/Settings.bundle/Root.plist +index 5bc0378..9d011f1 100644 +--- a/Settings.bundle/Root.plist ++++ b/Settings.bundle/Root.plist +@@ -169,7 +169,7 @@ + + udp + tcp +- tls ++ + + Type + PSMultiValueSpecifier +@@ -177,10 +177,10 @@ + + udp + tcp +- tls ++ + + +- ++ + + DefaultValue + diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 0f50be466..8b074fcd4 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -1828,7 +1828,7 @@ armv6, ); CODE_SIGN_ENTITLEMENTS = untitled.plist; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: jehan monnier"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; @@ -1862,7 +1862,7 @@ ORDER_FILE = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = linphone; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "075921BC-C7D8-42E1-B864-F05FD9BF841C"; SDKROOT = iphoneos; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; TARGETED_DEVICE_FAMILY = 1; From 929a5045e76bef5f12649d58bb86bd1cb6c16b88 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 29 Nov 2011 16:02:55 +0100 Subject: [PATCH 100/122] ZRTP in call UI --- Classes/ConferenceCallDetailView.xib | 91 ++++++++++----------- Classes/IncallViewController.h | 7 +- Classes/IncallViewController.m | 117 ++++++++++++++++++++------- Resources/unverified.png | Bin 0 -> 358 bytes linphone.xcodeproj/project.pbxproj | 20 ++++- 5 files changed, 157 insertions(+), 78 deletions(-) create mode 100644 Resources/unverified.png diff --git a/Classes/ConferenceCallDetailView.xib b/Classes/ConferenceCallDetailView.xib index d756d676e..3b80aa096 100644 --- a/Classes/ConferenceCallDetailView.xib +++ b/Classes/ConferenceCallDetailView.xib @@ -36,15 +36,15 @@ 274 - + 274 {320, 328} - + _NS:418 - + 3 MCAwAA @@ -52,25 +52,26 @@ IBCocoaTouchFramework YES 0 + NO YES 44 22 22 - + 292 {{107, 328}, {106, 66}} - + NO NO IBCocoaTouchFramework 0 0 - + 3 MQA @@ -78,7 +79,7 @@ 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + 3 MC41AA @@ -94,35 +95,35 @@ NSImage micro.png - + 2 2 - + Helvetica-Bold 18 16 - + 292 {{213, 328}, {107, 66}} - - + + NO NO IBCocoaTouchFramework 0 0 - + 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + NSImage HP_inverse.png @@ -131,10 +132,10 @@ NSImage HP.png - - + + - + 292 {{0, 394}, {320, 66}} @@ -150,12 +151,12 @@ IBCocoaTouchFramework 0 0 - + 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + NSImage stopcall-red.png @@ -164,47 +165,47 @@ NSImage clavier-01-106px.png - + Helvetica-Bold Helvetica 2 15 - + Helvetica-Bold 15 16 - + 292 {{0, 328}, {107, 66}} - + NO IBCocoaTouchFramework 0 0 - + 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - + NSImage effacer.png - - + + {{0, 20}, {320, 460}} - + 3 MC42NjY2NjY2NjY3AA @@ -219,7 +220,7 @@ back - + 16 @@ -227,7 +228,7 @@ hangup - + 17 @@ -235,7 +236,7 @@ mute - + 18 @@ -243,7 +244,7 @@ speaker - + 19 @@ -259,14 +260,14 @@ table - + 23 dataSource - + 21 @@ -274,7 +275,7 @@ delegate - + 22 @@ -292,11 +293,11 @@ 1 - - - - - + + + + + @@ -313,31 +314,31 @@ 7 - + 10 - + mute 11 - + end 12 - + speaker 14 - + Erase diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 55fc0d57f..e6ea4e234 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -24,7 +24,7 @@ #include "UILinphone.h" @class VideoViewController; -@interface IncallViewController : UIViewController { +@interface IncallViewController : UIViewController { UIView* controlSubView, *callControlSubView, *hangUpView; @@ -74,6 +74,9 @@ BOOL mVideoShown; BOOL mVideoIsPending; BOOL mIncallViewIsReady; + + UIImage* verified, *unverified; + UIActionSheet* zrtpVerificationSheet; } -(void)displayStatus:(NSString*) message; @@ -81,7 +84,7 @@ - (IBAction)doAction:(id)sender; +(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf; -+ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIImageView*)accessoryView withCall:(LinphoneCall*) call; ++ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIButton*)accessoryView withCall:(LinphoneCall*) call; @property (nonatomic, retain) IBOutlet UIView* controlSubView; @property (nonatomic, retain) IBOutlet UIView* callControlSubView; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 5675b9c13..625621f20 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -95,7 +95,9 @@ int callCount(LinphoneCore* lc) { //Controls [mute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"HP_inverse.png"] offImage:[UIImage imageNamed:@"HP.png"] ]; - + + verified = [[UIImage imageNamed:@"secured.png"] retain]; + unverified = [[UIImage imageNamed:@"unverified.png"] retain]; //Dialer init [zero initWithNumber:'0']; @@ -218,6 +220,12 @@ int callCount(LinphoneCore* lc) { } } } +-(void) viewWillDisappear:(BOOL)animated { + if (zrtpVerificationSheet != nil) { + [zrtpVerificationSheet dismissWithClickedButtonIndex:2 animated:NO]; + } +} + - (void) viewDidDisappear:(BOOL)animated { if (durationRefreasher != nil) { [durationRefreasher invalidate]; @@ -230,8 +238,8 @@ int callCount(LinphoneCore* lc) { } - (void)viewDidUnload { - - + [verified release]; + [unverified release]; } @@ -473,7 +481,7 @@ int callCount(LinphoneCore* lc) { [self updateActive:(cell == activeCallCell) cell:cell]; } -+ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIImageView*)accessoryView withCall:(LinphoneCall*) call { ++ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIButton*)accessoryView withCall:(LinphoneCall*) call { if (call == NULL) { ms_warning("UpdateCell called with null call"); [label setText:@""]; @@ -524,13 +532,19 @@ int callCount(LinphoneCore* lc) { } if (accessoryView != nil) { - if (linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) != - LinphoneMediaEncryptionNone) { - if (accessoryView.image == nil) - accessoryView.image = [UIImage imageNamed:@"secured.png"]; + /* + LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); + if (enc != LinphoneMediaEncryptionNone) { + if (accessoryView.imageView.image == nil) { + if (enc == LinphoneMediaEncryptionSRTP || linphone_call_get_authentication_token_verified(call)) { + [accessoryView setImage: verified forState:UIControlStateNormal]; + } else { + [accessoryView setImage: unverified forState:UIControlStateNormal]; + } + } } else { - accessoryView.image = nil; - } + [accessoryView setImage: (UIImage*)nil forState:UIControlStateNormal]; + }*/ } } @@ -559,9 +573,7 @@ int callCount(LinphoneCore* lc) { else [ms appendFormat:(isFirst?@"%s":@", %s"), linphone_address_get_username(addr), nil]; - //if (call == selectedCall) - // [self updateActive:YES cell:cell]; - LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); + LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); if (call == selectedCall) { [callTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; cell.selected = YES; @@ -573,11 +585,6 @@ int callCount(LinphoneCore* lc) { } [cell.detailTextLabel setText:ms]; cell.imageView.image = nil; - - /*if (linphone_core_is_in_conference(lc)) - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; - else - cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];*/ } -(void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath @@ -597,8 +604,6 @@ int callCount(LinphoneCore* lc) { cell.textLabel.font = [UIFont systemFontOfSize:40]; cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight; } - if (cell.accessoryView != nil) - ((UIImageView*)cell.accessoryView).image = nil; LinphoneCore* lc = [LinphoneManager getLc]; if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) { @@ -611,27 +616,79 @@ int callCount(LinphoneCore* lc) { else cell.accessoryType = UITableViewCellAccessoryNone; } else { + if (cell.accessoryView == nil) { + UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom]; + [b setFrame:CGRectMake(0, 0, 28, 28)]; + [b setImage:nil forState:UIControlStateNormal]; + b.backgroundColor = [UIColor clearColor]; + b.userInteractionEnabled = YES; + cell.accessoryView = b; + } LinphoneCall* call = [IncallViewController retrieveCallAtIndex:indexPath.row inConference:NO]; - [IncallViewController updateCellImageView:cell.imageView Label:cell.textLabel DetailLabel:cell.detailTextLabel AndAccessoryView:(UIImageView*)cell.accessoryView withCall:call]; + [IncallViewController updateCellImageView:cell.imageView Label:cell.textLabel DetailLabel:cell.detailTextLabel AndAccessoryView:(UIButton*)cell.accessoryView withCall:call]; if (linphone_core_get_current_call(lc) == call) activeCallCell = cell; cell.accessoryType = UITableViewCellAccessoryNone; - if (cell.accessoryView == nil) - cell.accessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)]; + + LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); + + UIButton* accessoryBtn = (UIButton*) cell.accessoryView; + if (enc != LinphoneMediaEncryptionNone) { + if (enc == LinphoneMediaEncryptionSRTP || linphone_call_get_authentication_token_verified(call)) { + [accessoryBtn setImage: verified forState:UIControlStateNormal]; + } else { + [accessoryBtn setImage: unverified forState:UIControlStateNormal]; + } + } else { + [accessoryBtn setImage: (UIImage*)nil forState:UIControlStateNormal]; + } + + if (((UIButton*)cell.accessoryView).imageView.image != nil && linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) == LinphoneMediaEncryptionZRTP) { + [((UIButton*)cell.accessoryView) addTarget:self action:@selector(secureIconPressed:withEvent:) forControlEvents:UIControlEventTouchUpInside]; + } } cell.userInteractionEnabled = YES; cell.selectionStyle = UITableViewCellSelectionStyleNone; - //cell.selectionStyle = UITableViewCellSelectionStyleBlue; - - - - /*NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; - UIImage *theImage = [UIImage imageWithContentsOfFile:path]; - cell.imageView.image = theImage;*/ return cell; } +-(void) secureIconPressed:(UIControl*) button withEvent: (UIEvent*) evt { + NSSet* touches = [evt allTouches]; + UITouch* touch = [touches anyObject]; + CGPoint currentTouchPos = [touch locationInView:self.callTableView]; + NSIndexPath *path = [self.callTableView indexPathForRowAtPoint:currentTouchPos]; + if (path) { + LinphoneCall* call = [IncallViewController retrieveCallAtIndex:path.row inConference:NO]; + // start action sheet to validate/unvalidate zrtp code + CallDelegate* cd = [[CallDelegate alloc] init]; + cd.delegate = self; + cd.call = call; + + [(UIButton*)[callTableView cellForRowAtIndexPath:path].accessoryView setImage:nil forState:UIControlStateNormal]; + + zrtpVerificationSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" Mark auth token '%s' as:",nil),linphone_call_get_authentication_token(call)] + delegate:cd + cancelButtonTitle:NSLocalizedString(@"Unverified",nil) + destructiveButtonTitle:NSLocalizedString(@"Verified",nil) + otherButtonTitles:nil]; + + zrtpVerificationSheet.actionSheetStyle = UIActionSheetStyleDefault; + [zrtpVerificationSheet showInView:self.view]; + [zrtpVerificationSheet release]; + } +} + +-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas { + LinphoneCall* call = (LinphoneCall*)datas; + // maybe we could verify call validity + + if (buttonIndex == 0) + linphone_call_set_authentication_token_verified(call, YES); + else if (buttonIndex == 1) + linphone_call_set_authentication_token_verified(call, NO); + zrtpVerificationSheet = nil; +} // UITableViewDataSource (required) - (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section diff --git a/Resources/unverified.png b/Resources/unverified.png new file mode 100644 index 0000000000000000000000000000000000000000..f824d40c406655fea7979ef5e991e3dc0f8c3d4a GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoZ!3HG%J$@n#q!^2X+?^QKos)S9?EK z*~r^$AmIA{rsB$#5e;UGH!yH7Nt|P%^MLh`+7=y$srL?*Nj2*vaZ0-fDisQCV)^#> z_nps-?k+5?c_FzI84bQQ#&+I!+gkcfByhr==!^}*wYJjttFN6tE2HCbfT4fss<^T% zr_X)Y^-S@+@kC*P(gGu2xf;DQo^9S-v59^r_c#{)F3!uEdZ*&5*sXWQeGEJI3p703 zK5?nSnzyH7+4~NBS$V8jo@HU{ru?3%|3xHU&1&2AtUCSrE^);TE|!7s{uXe4zHroA y(PxeDwq5E^dVX0RpR`3J>5!nkpjfQFhkol1Cn?K%hgU!!GkCiCxvX Date: Tue, 29 Nov 2011 16:25:46 +0100 Subject: [PATCH 101/122] Declare c++ lib as optional --- linphone.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 3ea4ae020..e64109f60 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -232,8 +232,8 @@ 344ABDE51483E596007420B6 /* unverified.png in Resources */ = {isa = PBXBuildFile; fileRef = 344ABDE41483E596007420B6 /* unverified.png */; }; 344ABDE61483E596007420B6 /* unverified.png in Resources */ = {isa = PBXBuildFile; fileRef = 344ABDE41483E596007420B6 /* unverified.png */; }; 344ABDE81484E723007420B6 /* libzrtpcpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDE71484E723007420B6 /* libzrtpcpp.a */; }; - 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; }; - 344ABDF214850AE9007420B6 /* libstdc++.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */; }; + 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; + 344ABDF214850AE9007420B6 /* libstdc++.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; 34957F3F147D3FBF00DD7A09 /* secured.png in Resources */ = {isa = PBXBuildFile; fileRef = 34957F3E147D3FBF00DD7A09 /* secured.png */; }; 34F2F678147D2E1C00A2D5E3 /* contact_vide.png in Resources */ = {isa = PBXBuildFile; fileRef = 34F2F677147D2E1C00A2D5E3 /* contact_vide.png */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; From f25c029d4c36a49eb60b6ae65644315675ca2509 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 30 Nov 2011 11:01:50 +0100 Subject: [PATCH 102/122] use Automatically start video param even in case of sip uri --- Classes/LinphoneUI/UICallButton.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m index eed2d3fe9..7846548d8 100644 --- a/Classes/LinphoneUI/UICallButton.m +++ b/Classes/LinphoneUI/UICallButton.m @@ -38,6 +38,7 @@ linphone_core_get_default_proxy([LinphoneManager getLc],&proxyCfg); bool startVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"start_video_preference"]; LinphoneCallParams* lcallParams = linphone_core_create_default_call_parameters([LinphoneManager getLc]); + linphone_call_params_enable_video(lcallParams,startVideo&linphone_core_video_enabled([LinphoneManager getLc])); if ([mAddress.text length] == 0) return; //just return if ([mAddress.text hasPrefix:@"sip:"]) { @@ -61,7 +62,7 @@ linphone_address_set_display_name(tmpAddress,(lDisplayName)?[lDisplayName cStringUsingEncoding:[NSString defaultCStringEncoding]]:nil); - linphone_call_params_enable_video(lcallParams,startVideo&linphone_core_video_enabled([LinphoneManager getLc])); + linphone_core_invite_address_with_params([LinphoneManager getLc],tmpAddress,lcallParams) ; linphone_address_destroy(tmpAddress); From b4911ddac4c9fdbda3d7b09b7450db2df2476181 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 30 Nov 2011 11:39:17 +0100 Subject: [PATCH 103/122] Update linphone --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 53b732a7d..657d19168 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 53b732a7d32fe1f3005f39e446fb860de0afa97c +Subproject commit 657d19168c8c20e193a2cfda1f64544bf6cfa296 From be55f2f6bde817231061bda34d8a742cffd626de Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 09:48:57 +0100 Subject: [PATCH 104/122] During a call user can now establish a new call by pressing contacts Fixes issue: #0050: When a call is engaged, unable to select the phone number from Contacts. --- Classes/IncallViewController.m | 3 ++- Classes/PhoneViewController.m | 13 ++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 625621f20..a5b991804 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -22,6 +22,7 @@ #import "linphonecore.h" #include "LinphoneManager.h" #include "private.h" +#import "ContactPickerDelegate.h"Òß @implementation IncallViewController @@ -390,7 +391,7 @@ int callCount(LinphoneCore* lc) { } else if (sender == contacts) { // start people picker myPeoplePickerController = [[[ABPeoplePickerNavigationController alloc] init] autorelease]; - [myPeoplePickerController setPeoplePickerDelegate:self]; + [myPeoplePickerController setPeoplePickerDelegate:[[ContactPickerDelegate alloc] init] /*self*/]; [self presentModalViewController: myPeoplePickerController animated:true]; } else if (sender == close) { diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index a0e732f8a..fa1ccefe7 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -153,9 +153,16 @@ } //else keep previous [mDisplayName setText:displayName]; - [callLarge setHidden:FALSE]; - [callShort setHidden:TRUE]; - [backToCallView setHidden:TRUE]; + // disable call button if != Paused + if (linphone_core_get_calls_nb([LinphoneManager getLc]) == 0) { + [callLarge setHidden:FALSE]; + [callShort setHidden:TRUE]; + [backToCallView setHidden:TRUE]; + } else { + [callLarge setHidden:TRUE]; + [callShort setHidden:FALSE]; + [backToCallView setHidden:FALSE]; + } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"firstlogindone_preference" ] == true) { From 04d7e5e0ca903ea3898c14d122725b1f6b58ab96 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 10:15:11 +0100 Subject: [PATCH 105/122] User cannot start a new call, unless all currents calls are either paused or in conf Fixes issue: #0078 --- Classes/PhoneViewController.m | 51 ++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index fa1ccefe7..1e06fbf61 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -23,7 +23,8 @@ #import #import "LinphoneManager.h" #include "FirstLoginViewController.h" - +#include "linphonecore.h" +#include "private.h" @implementation PhoneViewController @synthesize dialerView ; @@ -133,6 +134,41 @@ return YES; } +-(void) updateCallAndBackButtons { + @try { + if (linphone_core_get_calls_nb([LinphoneManager getLc]) == 0) { + [callLarge setHidden:FALSE]; + [callShort setHidden:TRUE]; + [backToCallView setHidden:TRUE]; + } else { + bool areAllCallPausedOrInConference = true; + const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); + while (calls) { + LinphoneCall* call = (LinphoneCall*)calls->data; + if (!linphone_call_get_current_params(call)->in_conference + && (linphone_call_get_state(call) != LinphoneCallPaused)) { + areAllCallPausedOrInConference = false; + break; + } else { + calls = calls->next; + } + } + [callShort setEnabled:areAllCallPausedOrInConference]; + [callLarge setHidden:TRUE]; + [callShort setHidden:FALSE]; + [backToCallView setHidden:FALSE]; + } + } @catch (NSException* exc) { + // R.A.S: linphone core si simply not ready... + ms_warning("Exception %s: %s", + [exc.name cStringUsingEncoding:[NSString defaultCStringEncoding]], + [exc.reason cStringUsingEncoding:[NSString defaultCStringEncoding]]); + } +} + +-(void)viewWillAppear:(BOOL)animated { + [self updateCallAndBackButtons]; +} -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { @@ -153,18 +189,9 @@ } //else keep previous [mDisplayName setText:displayName]; - // disable call button if != Paused - if (linphone_core_get_calls_nb([LinphoneManager getLc]) == 0) { - [callLarge setHidden:FALSE]; - [callShort setHidden:TRUE]; - [backToCallView setHidden:TRUE]; - } else { - [callLarge setHidden:TRUE]; - [callShort setHidden:FALSE]; - [backToCallView setHidden:FALSE]; - } - + [self updateCallAndBackButtons]; + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"firstlogindone_preference" ] == true) { //first login case, dismmis first login view [self dismissModalViewControllerAnimated:true]; From 2ab07716469fc93d1425eb913fe0754a874798ae Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 12:45:00 +0100 Subject: [PATCH 106/122] Do not allow user to start/answer a SIP call when a GSM call is active --- Classes/IncallViewController.m | 2 +- Classes/LinphoneAppDelegate.m | 4 ++++ Classes/LinphoneUI/LinphoneManager.h | 1 + Classes/LinphoneUI/LinphoneManager.m | 10 +++++++++- Classes/PhoneViewController.h | 2 ++ Classes/PhoneViewController.m | 27 +++++++++++++++++++-------- submodules/externals/exosip | 2 +- 7 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index a5b991804..fd1518bc5 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -22,7 +22,7 @@ #import "linphonecore.h" #include "LinphoneManager.h" #include "private.h" -#import "ContactPickerDelegate.h"Òß +#import "ContactPickerDelegate.h" @implementation IncallViewController diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index dcb97b6b7..46c8b1a9b 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -42,6 +42,10 @@ } - (void)applicationDidBecomeActive:(UIApplication *)application { [[LinphoneManager instance] becomeActive]; + + if (myPhoneViewController != nil) { + [myPhoneViewController updateCallAndBackButtons]; + } } - (void) loadDefaultSettings { diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index 5da93e076..32f403dee 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -48,6 +48,7 @@ typedef enum _Connectivity { } +(LinphoneManager*) instance; +(LinphoneCore*) getLc; ++(BOOL) audioSessionInterrupted; -(void) registerLogView:(id) view; diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index de012d74c..75c5dee6e 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -30,6 +30,7 @@ static LinphoneCore* theLinphoneCore=nil; static LinphoneManager* theLinphoneManager=nil; +static BOOL audioSessionInterrupted = NO; extern void libmsilbc_init(); #ifdef HAVE_AMR @@ -835,6 +836,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } -(void) beginInterruption { + audioSessionInterrupted = YES; + LinphoneCall* c = linphone_core_get_current_call(theLinphoneCore); ms_message("Sound interruption detected!"); if (c) { @@ -850,7 +853,12 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach ms_message("Auto resuming call"); linphone_core_resume_call(theLinphoneCore, (LinphoneCall*) c->data); } - + + audioSessionInterrupted = NO; +} + ++(BOOL) audioSessionInterrupted { + return audioSessionInterrupted; } diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index b9f5f09e2..03947ff5c 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -64,6 +64,8 @@ IncallViewController* mIncallViewController; } +-(void) updateCallAndBackButtons; + @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UITextField* address; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 1e06fbf61..26c44d9ce 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -164,6 +164,12 @@ [exc.name cStringUsingEncoding:[NSString defaultCStringEncoding]], [exc.reason cStringUsingEncoding:[NSString defaultCStringEncoding]]); } + + /* if audio session is unavailable -> disable call buttons */ + if ([LinphoneManager audioSessionInterrupted]) { + [callShort setEnabled:NO]; + [callLarge setEnabled:NO]; + } } -(void)viewWillAppear:(BOOL)animated { @@ -212,7 +218,13 @@ -(void) displayIncomingCall:(LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - + if ([LinphoneManager audioSessionInterrupted]) { + // TODO: should we notify the user and let him cancel the call (without letting him accept it) ? + ms_message("Call refused: audio session is not available"); + linphone_core_terminate_call([LinphoneManager getLc], call); + return; + } + if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) { // Create a new notification @@ -233,17 +245,16 @@ cd.delegate = self; cd.call = call; - mIncomingCallActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username] - delegate:cd - cancelButtonTitle:NSLocalizedString(@"Decline",nil) + mIncomingCallActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username] + delegate:cd + cancelButtonTitle:NSLocalizedString(@"Decline",nil) destructiveButtonTitle:NSLocalizedString(@"Answer",nil) - otherButtonTitles:nil]; - + otherButtonTitles:nil]; + mIncomingCallActionSheet.actionSheetStyle = UIActionSheetStyleDefault; [mIncomingCallActionSheet showInView:self.parentViewController.view]; [mIncomingCallActionSheet release]; } - } -(void) backToCallViewPressed { @@ -292,7 +303,7 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas{ LinphoneCall* call = (LinphoneCall*)datas; - if (buttonIndex == 0 ) { + if (buttonIndex == actionSheet.destructiveButtonIndex ) { linphone_core_accept_call([LinphoneManager getLc],call); } else { linphone_core_terminate_call ([LinphoneManager getLc], call); diff --git a/submodules/externals/exosip b/submodules/externals/exosip index c3da03035..f28804413 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit c3da0303519ad3120355cb85baee9cf6d0e4d1c2 +Subproject commit f288044136b3e60baf6c0805e8cf87e5cdbc7890 From 710076633fac6387fd27d6be749e60bc0ca68d84 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 16:03:44 +0100 Subject: [PATCH 107/122] Revert "Do not allow user to start/answer a SIP call when a GSM call is active" This reverts commit 2ab07716469fc93d1425eb913fe0754a874798ae. --- Classes/IncallViewController.m | 2 +- Classes/LinphoneAppDelegate.m | 4 ---- Classes/LinphoneUI/LinphoneManager.h | 1 - Classes/LinphoneUI/LinphoneManager.m | 10 +--------- Classes/PhoneViewController.h | 2 -- Classes/PhoneViewController.m | 27 ++++++++------------------- submodules/externals/exosip | 2 +- 7 files changed, 11 insertions(+), 37 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index fd1518bc5..a5b991804 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -22,7 +22,7 @@ #import "linphonecore.h" #include "LinphoneManager.h" #include "private.h" -#import "ContactPickerDelegate.h" +#import "ContactPickerDelegate.h"Òß @implementation IncallViewController diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 46c8b1a9b..dcb97b6b7 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -42,10 +42,6 @@ } - (void)applicationDidBecomeActive:(UIApplication *)application { [[LinphoneManager instance] becomeActive]; - - if (myPhoneViewController != nil) { - [myPhoneViewController updateCallAndBackButtons]; - } } - (void) loadDefaultSettings { diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index 32f403dee..5da93e076 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -48,7 +48,6 @@ typedef enum _Connectivity { } +(LinphoneManager*) instance; +(LinphoneCore*) getLc; -+(BOOL) audioSessionInterrupted; -(void) registerLogView:(id) view; diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 75c5dee6e..de012d74c 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -30,7 +30,6 @@ static LinphoneCore* theLinphoneCore=nil; static LinphoneManager* theLinphoneManager=nil; -static BOOL audioSessionInterrupted = NO; extern void libmsilbc_init(); #ifdef HAVE_AMR @@ -836,8 +835,6 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } -(void) beginInterruption { - audioSessionInterrupted = YES; - LinphoneCall* c = linphone_core_get_current_call(theLinphoneCore); ms_message("Sound interruption detected!"); if (c) { @@ -853,12 +850,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach ms_message("Auto resuming call"); linphone_core_resume_call(theLinphoneCore, (LinphoneCall*) c->data); } - - audioSessionInterrupted = NO; -} - -+(BOOL) audioSessionInterrupted { - return audioSessionInterrupted; + } diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 03947ff5c..b9f5f09e2 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -64,8 +64,6 @@ IncallViewController* mIncallViewController; } --(void) updateCallAndBackButtons; - @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UITextField* address; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 26c44d9ce..1e06fbf61 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -164,12 +164,6 @@ [exc.name cStringUsingEncoding:[NSString defaultCStringEncoding]], [exc.reason cStringUsingEncoding:[NSString defaultCStringEncoding]]); } - - /* if audio session is unavailable -> disable call buttons */ - if ([LinphoneManager audioSessionInterrupted]) { - [callShort setEnabled:NO]; - [callLarge setEnabled:NO]; - } } -(void)viewWillAppear:(BOOL)animated { @@ -218,13 +212,7 @@ -(void) displayIncomingCall:(LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - if ([LinphoneManager audioSessionInterrupted]) { - // TODO: should we notify the user and let him cancel the call (without letting him accept it) ? - ms_message("Call refused: audio session is not available"); - linphone_core_terminate_call([LinphoneManager getLc], call); - return; - } - + if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) { // Create a new notification @@ -245,16 +233,17 @@ cd.delegate = self; cd.call = call; - mIncomingCallActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username] - delegate:cd - cancelButtonTitle:NSLocalizedString(@"Decline",nil) + mIncomingCallActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username] + delegate:cd + cancelButtonTitle:NSLocalizedString(@"Decline",nil) destructiveButtonTitle:NSLocalizedString(@"Answer",nil) - otherButtonTitles:nil]; - + otherButtonTitles:nil]; + mIncomingCallActionSheet.actionSheetStyle = UIActionSheetStyleDefault; [mIncomingCallActionSheet showInView:self.parentViewController.view]; [mIncomingCallActionSheet release]; } + } -(void) backToCallViewPressed { @@ -303,7 +292,7 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas{ LinphoneCall* call = (LinphoneCall*)datas; - if (buttonIndex == actionSheet.destructiveButtonIndex ) { + if (buttonIndex == 0 ) { linphone_core_accept_call([LinphoneManager getLc],call); } else { linphone_core_terminate_call ([LinphoneManager getLc], call); diff --git a/submodules/externals/exosip b/submodules/externals/exosip index f28804413..c3da03035 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit f288044136b3e60baf6c0805e8cf87e5cdbc7890 +Subproject commit c3da0303519ad3120355cb85baee9cf6d0e4d1c2 From e8e06f87045442bdbb993e6457dfb0d94d4a1a09 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 16:04:18 +0100 Subject: [PATCH 108/122] Fix typo --- Classes/IncallViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index a5b991804..fd1518bc5 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -22,7 +22,7 @@ #import "linphonecore.h" #include "LinphoneManager.h" #include "private.h" -#import "ContactPickerDelegate.h"Òß +#import "ContactPickerDelegate.h" @implementation IncallViewController From 202a22314cef98ceee844f5c4547f33304e6065f Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 16:05:11 +0100 Subject: [PATCH 109/122] Use destructiveButtonIndex value instead of hard-coded 0 index --- Classes/PhoneViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 1e06fbf61..9c5d6d0a6 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -292,7 +292,7 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas{ LinphoneCall* call = (LinphoneCall*)datas; - if (buttonIndex == 0 ) { + if (buttonIndex == actionSheet.destructiveButtonIndex ) { linphone_core_accept_call([LinphoneManager getLc],call); } else { linphone_core_terminate_call ([LinphoneManager getLc], call); From 7e603ffdd9a34a1bf8189b4da512a0deae20aa6f Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 1 Dec 2011 16:09:31 +0100 Subject: [PATCH 110/122] User is allowed to place a new call if linphone_core_sound_resource_locked() is false --- Classes/PhoneViewController.m | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 9c5d6d0a6..6fd2f0fbc 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -141,19 +141,7 @@ [callShort setHidden:TRUE]; [backToCallView setHidden:TRUE]; } else { - bool areAllCallPausedOrInConference = true; - const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); - while (calls) { - LinphoneCall* call = (LinphoneCall*)calls->data; - if (!linphone_call_get_current_params(call)->in_conference - && (linphone_call_get_state(call) != LinphoneCallPaused)) { - areAllCallPausedOrInConference = false; - break; - } else { - calls = calls->next; - } - } - [callShort setEnabled:areAllCallPausedOrInConference]; + [callShort setEnabled:!linphone_core_sound_resources_locked([LinphoneManager getLc])]; [callLarge setHidden:TRUE]; [callShort setHidden:FALSE]; [backToCallView setHidden:FALSE]; From a9a8da19408a544c77ac2c518a5f3743771344ee Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 2 Dec 2011 10:52:04 +0100 Subject: [PATCH 111/122] fix doxygen build issue --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 657d19168..27891569d 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 657d19168c8c20e193a2cfda1f64544bf6cfa296 +Subproject commit 27891569dd66344b618b1e5f5e986f25bcb9eeaa From 9d77b1bd28f4520e7047183123b6d90fc2b2da89 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 2 Dec 2011 12:07:37 +0100 Subject: [PATCH 112/122] fix no gpl third parties target --- linphone.xcodeproj/project.pbxproj | 2 +- nogpl-thirdparties/.DS_Store | Bin 0 -> 6148 bytes nogpl-thirdparties/Settings.bundle/Root.plist | 207 ++++++++++++++++++ .../Settings.bundle/audio.plist | 85 +++++++ .../Settings.bundle/en.lproj/Root.strings | Bin 0 -> 546 bytes .../Settings.bundle/video.plist | 35 +++ 6 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 nogpl-thirdparties/.DS_Store create mode 100644 nogpl-thirdparties/Settings.bundle/Root.plist create mode 100644 nogpl-thirdparties/Settings.bundle/audio.plist create mode 100644 nogpl-thirdparties/Settings.bundle/en.lproj/Root.strings create mode 100644 nogpl-thirdparties/Settings.bundle/video.plist diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 26230315b..7028f4316 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -384,7 +384,7 @@ 220FAE4A10767A6A0068D98F /* PhoneMainView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneMainView.xib; sourceTree = ""; }; 2211DB8F147555C800DEE054 /* libmediastreamer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmediastreamer.a; path = "liblinphone-sdk/apple-darwin/lib/libmediastreamer.a"; sourceTree = ""; }; 2211DB911475562600DEE054 /* liblinphone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblinphone.a; path = "liblinphone-sdk/apple-darwin/lib/liblinphone.a"; sourceTree = ""; }; - 2211DB94147564B400DEE054 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = nogpl/Settings.bundle; sourceTree = ""; }; + 2211DB94147564B400DEE054 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = "nogpl-thirdparties/Settings.bundle"; sourceTree = ""; }; 2211DBBB14769C8200DEE054 /* CallDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallDelegate.m; sourceTree = ""; }; 2211DBCA1476BE7300DEE054 /* ajouter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ajouter.png; path = Resources/ajouter.png; sourceTree = ""; }; 2211DBCB1476BE7300DEE054 /* clavier.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = clavier.png; path = Resources/clavier.png; sourceTree = ""; }; diff --git a/nogpl-thirdparties/.DS_Store b/nogpl-thirdparties/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9ec58e6187bd8d28bf6ee98ca302ad128ddac2d9 GIT binary patch literal 6148 zcmeHKF;2rk5S)b+ktj$>c`rbspg%><3;Y2@97RY8MoQefqsYe)U!mX&%-$|2mV@Xh zVAt9m-`>uhJcaiTfXut*2ABbu(iQQnVQf0DKC&~I+CGh(8ayY$lWJ7^aAQT7%LV{Z&d|iDM5BsdF~sQ1 zC$Gzny`j+|WoNGAJB!~?r0mXoD&>%D7%>zG1%?Wo+i<4+e?kA|{y!weC=>_<{*(eT zsp@LZPx9V6`Z(>iiGD}_G}e}KhQT3#18v1uM|DZxS(hDq!$N1i(1~#nP+h`8f!|Qz E1J2YVrT_o{ literal 0 HcmV?d00001 diff --git a/nogpl-thirdparties/Settings.bundle/Root.plist b/nogpl-thirdparties/Settings.bundle/Root.plist new file mode 100644 index 000000000..5bc0378b6 --- /dev/null +++ b/nogpl-thirdparties/Settings.bundle/Root.plist @@ -0,0 +1,207 @@ + + + + + PreferenceSpecifiers + + + Title + SIP account + Type + PSGroupSpecifier + + + AutocapitalizationType + None + AutocorrectionType + No + DefaultValue + + IsSecure + + Key + username_preference + KeyboardType + Alphabet + Title + User name + Type + PSTextFieldSpecifier + + + AutocapitalizationType + None + AutocorrectionType + No + DefaultValue + + IsSecure + + Key + password_preference + KeyboardType + Alphabet + Title + Password + Type + PSTextFieldSpecifier + + + AutocapitalizationType + None + AutocorrectionType + No + DefaultValue + + IsSecure + + Key + domain_preference + KeyboardType + URL + Title + Domain + Type + PSTextFieldSpecifier + + + AutocapitalizationType + None + AutocorrectionType + No + DefaultValue + + IsSecure + + Key + proxy_preference + KeyboardType + URL + Title + Proxy + Type + PSTextFieldSpecifier + + + DefaultValue + + Key + outbound_proxy_preference + Title + Outbound proxy + Type + PSToggleSwitchSpecifier + + + Title + Media + Type + PSGroupSpecifier + + + File + audio + Title + Audio + Type + PSChildPaneSpecifier + + + File + video + Title + Video + Type + PSChildPaneSpecifier + + + Title + Advanced + Type + PSGroupSpecifier + + + DefaultValue + + Key + debugenable_preference + Title + Debug + Type + PSToggleSwitchSpecifier + + + AutocapitalizationType + None + AutocorrectionType + No + DefaultValue + + IsSecure + + Key + prefix_preference + KeyboardType + NumberPad + Title + Prefix + Type + PSTextFieldSpecifier + + + DefaultValue + + Key + substitute_+_by_00_preference + Title + Substitue + by 00 + Type + PSToggleSwitchSpecifier + + + DefaultValue + udp + Key + transport_preference + Title + Transport + Titles + + udp + tcp + tls + + Type + PSMultiValueSpecifier + Values + + udp + tcp + tls + + + + DefaultValue + + Key + enable_srtp_preference + Title + Secure rtp + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + backgroundmode_preference + Title + Background mode + Type + PSToggleSwitchSpecifier + + + StringsTable + Root + + diff --git a/nogpl-thirdparties/Settings.bundle/audio.plist b/nogpl-thirdparties/Settings.bundle/audio.plist new file mode 100644 index 000000000..670182e79 --- /dev/null +++ b/nogpl-thirdparties/Settings.bundle/audio.plist @@ -0,0 +1,85 @@ + + + + + PreferenceSpecifiers + + + Title + Codecs + Type + PSGroupSpecifier + + + DefaultValue + + Key + speex_16k_preference + Title + Speex 16Khz + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + speex_8k_preference + Title + Speex 8Khz + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + g722_preference + Title + G722 + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + gsm_8k_preference + Title + GSM + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + ilbc_preference + Title + ILBC + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + pcmu_preference + Title + PCMU + Type + PSToggleSwitchSpecifier + + + DefaultValue + + Key + pcma_preference + Title + PCMA + Type + PSToggleSwitchSpecifier + + + + diff --git a/nogpl-thirdparties/Settings.bundle/en.lproj/Root.strings b/nogpl-thirdparties/Settings.bundle/en.lproj/Root.strings new file mode 100644 index 0000000000000000000000000000000000000000..8cd87b9d6b20c1fbf87bd4db3db267fca5ad4df9 GIT binary patch literal 546 zcmaixOHRW;5JYRuDMndFh#Ua1V1d}N;sVAV2TO?uC3a9aJn*VxFrY}tnon0(S66#J z-d9>G>6W!ur(SDqlp`9nn~*(m%iWnv?yq`Qfp6XbK1?+om~~#r)ZnhkYQU_VbfjuT zHNn`CX<0sd*m1A}>&5sU$akD=GTXJ1e literal 0 HcmV?d00001 diff --git a/nogpl-thirdparties/Settings.bundle/video.plist b/nogpl-thirdparties/Settings.bundle/video.plist new file mode 100644 index 000000000..5df2306c8 --- /dev/null +++ b/nogpl-thirdparties/Settings.bundle/video.plist @@ -0,0 +1,35 @@ + + + + + PreferenceSpecifiers + + + Type + PSToggleSwitchSpecifier + Title + Enable video + Key + enable_video_preference + DefaultValue + + + + Title + Codecs + Type + PSGroupSpecifier + + + DefaultValue + + Key + vp8_preference + Title + VP8 + Type + PSToggleSwitchSpecifier + + + + From 531e069354a35062bd050264c74cf7cbba52c861 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 2 Dec 2011 14:39:00 +0100 Subject: [PATCH 113/122] Add text showing that resuming a call is possible by clicking on its row + fix potential crash --- Classes/IncallViewController.m | 42 ++++++++++++---------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index fd1518bc5..af3933b3b 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -520,7 +520,7 @@ int callCount(LinphoneCore* lc) { } else { switch (linphone_call_get_state(call)) { case LinphoneCallPaused: - [ms appendFormat:@"%@", NSLocalizedString(@"Paused", nil), nil]; + [ms appendFormat:@"%@", NSLocalizedString(@"Paused (tap to resume)", nil), nil]; break; case LinphoneCallOutgoingProgress: [ms appendFormat:@"%@...", NSLocalizedString(@"In progress", nil), nil]; @@ -551,40 +551,24 @@ int callCount(LinphoneCore* lc) { -(void) updateConferenceCell:(UITableViewCell*) cell at:(NSIndexPath*)indexPath { - [cell.textLabel setText:@"Conference"]; - LinphoneCore* lc = [LinphoneManager getLc]; + NSString* t= [NSString stringWithFormat: + NSLocalizedString(@"Conference", nil), + linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc)]; + [cell.textLabel setText:t]; + [self updateActive:NO cell:cell]; cell.selected = NO; [callTableView deselectRowAtIndexPath:indexPath animated:NO]; - NSMutableString* ms = [[NSMutableString alloc] init ]; - const MSList* calls = linphone_core_get_calls(lc); - bool isFirst = true; - while (calls) { - LinphoneCall* call = (LinphoneCall*)calls->data; - if (isInConference(call)) { - const LinphoneAddress* addr = linphone_call_get_remote_address(call); - - const char* n = linphone_address_get_display_name(addr); - if (n) - [ms appendFormat:(isFirst?@"%s":@", %s"), n, nil]; - else - [ms appendFormat:(isFirst?@"%s":@", %s"), linphone_address_get_username(addr), nil]; - - LinphoneCall* selectedCall = linphone_core_get_current_call([LinphoneManager getLc]); - if (call == selectedCall) { - [callTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; - cell.selected = YES; - - } - isFirst = false; - } - calls = calls->next; - } - [cell.detailTextLabel setText:ms]; + if (!linphone_core_is_in_conference(lc)) { + [cell.detailTextLabel setText:NSLocalizedString(@"(tap to enter conference)", nil)]; + } else { + [cell.detailTextLabel setText: + [NSString stringWithFormat:NSLocalizedString(@"(me + %d participants)", nil), linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc)]]; + } cell.imageView.image = nil; } @@ -626,6 +610,8 @@ int callCount(LinphoneCore* lc) { cell.accessoryView = b; } LinphoneCall* call = [IncallViewController retrieveCallAtIndex:indexPath.row inConference:NO]; + if (call == nil) + return nil; [IncallViewController updateCellImageView:cell.imageView Label:cell.textLabel DetailLabel:cell.detailTextLabel AndAccessoryView:(UIButton*)cell.accessoryView withCall:call]; if (linphone_core_get_current_call(lc) == call) activeCallCell = cell; From f759b582f4682a9e36dc79a49bf2d1f98a943175 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 2 Dec 2011 14:46:38 +0100 Subject: [PATCH 114/122] update README file --- README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README b/README index da91ec552..7d0f28019 100644 --- a/README +++ b/README @@ -39,8 +39,10 @@ To generate the liblinphone multi arch sdkin non GPL mode, once the above comman cd submodules/build make all enable_gpl_third_parties=no +Note: simulator build does not work with this flavor. + ****************************************** -****Third party, subject to lincense*i**** +****Third party, subject to lincense***** ****************************************** The liblinphone-sdk is compiled with third parties code that are subject to license, specially: AMR, SILK and X264. Linphone activates/de-activates these codecs thanks to the preprocessor macros HAVE_SILK, HAVE_AMR, HAVE_X264 positioned in xcode. From 7c42c524ffc4b959b376eadc1f9853e8e6413951 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 6 Dec 2011 14:13:08 +0100 Subject: [PATCH 115/122] Deactivate audio session on startup Update linphone too. --- Classes/LinphoneUI/LinphoneManager.m | 2 ++ submodules/linphone | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index de012d74c..4757769fb 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -774,6 +774,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach BOOL bAudioInputAvailable= [audioSession inputIsAvailable]; [audioSession setDelegate:self]; + NSError* err; + [audioSession setActive:NO error: &err]; if(!bAudioInputAvailable){ UIAlertView* error = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No microphone",nil) message:NSLocalizedString(@"You need to plug a microphone to your device to use this application.",nil) diff --git a/submodules/linphone b/submodules/linphone index 27891569d..2001ce8a8 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 27891569dd66344b618b1e5f5e986f25bcb9eeaa +Subproject commit 2001ce8a8f32170223b182db840ef19afa9e256b From 8f647d405cb32929b011ff62b378f22d66e20e06 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 6 Dec 2011 14:16:38 +0100 Subject: [PATCH 116/122] add error traces --- Classes/LinphoneUI/LinphoneManager.m | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 4757769fb..9bef7968a 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -752,11 +752,17 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach proxyReachabilityContext.info=self; //initial state is network off should be done as soon as possible SCNetworkReachabilityFlags flags; - SCNetworkReachabilityGetFlags(proxyReachability, &flags); + if (!SCNetworkReachabilityGetFlags(proxyReachability, &flags)) { + ms_error("Cannot get reachability flags"); + }; networkReachabilityCallBack(proxyReachability,flags,self); - SCNetworkReachabilitySetCallback(proxyReachability, (SCNetworkReachabilityCallBack)networkReachabilityCallBack,&proxyReachabilityContext); - SCNetworkReachabilityScheduleWithRunLoop(proxyReachability, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + if (!SCNetworkReachabilitySetCallback(proxyReachability, (SCNetworkReachabilityCallBack)networkReachabilityCallBack,&proxyReachabilityContext)){ + ms_error("Cannot register reachability cb"); + }; + if(!SCNetworkReachabilityScheduleWithRunLoop(proxyReachability, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)){ + ms_error("Cannot register schedule reachability cb"); + }; [self doLinphoneConfiguration:nil]; [[NSNotificationCenter defaultCenter] addObserver:self From b9737725804c8904b66efbcea21b74fc606d9d4b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 6 Dec 2011 16:22:57 +0100 Subject: [PATCH 117/122] increase bandwith to 380kbits/s --- linphonerc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linphonerc b/linphonerc index def132148..eee6763a7 100644 --- a/linphonerc +++ b/linphonerc @@ -1,6 +1,6 @@ [net] -download_bw=256 -upload_bw=256 +download_bw=380 +upload_bw=380 firewall_policy=0 mtu=0 From 9c614b4cca4ec05f2897430a7f082cc42293517d Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 6 Dec 2011 16:23:36 +0100 Subject: [PATCH 118/122] fix call with sip uri whitout userinfo --- Classes/IncallViewController.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index af3933b3b..d3b984f60 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -491,19 +491,23 @@ int callCount(LinphoneCore* lc) { const LinphoneAddress* addr = linphone_call_get_remote_address(call); if (addr) { + const char* lUserNameChars=linphone_address_get_username(addr); + NSString* lUserName = lUserNameChars?[[NSString alloc] initWithUTF8String:lUserNameChars]:NSLocalizedString(@"Unknown",nil); NSMutableString* mss = [[NSMutableString alloc] init]; /* contact name */ const char* n = linphone_address_get_display_name(addr); if (n) [mss appendFormat:@"%s", n, nil]; else - [mss appendFormat:@"%s", linphone_address_get_username(addr), nil]; + [mss appendFormat:@"%@",lUserName , nil]; if ([mss compare:label.text] != 0 || imageView.image == nil) { [label setText:mss]; - imageView.image = [[LinphoneManager instance] getImageFromAddressBook:[NSString stringWithCString:linphone_address_get_username(addr) encoding: [NSString defaultCStringEncoding]]]; + imageView.image = [[LinphoneManager instance] getImageFromAddressBook:lUserName]; } + [mss release]; + [lUserName release]; } else { [label setText:@"plop"]; imageView.image = nil; @@ -530,6 +534,7 @@ int callCount(LinphoneCore* lc) { } } [detailLabel setText:ms]; + [ms release]; } if (accessoryView != nil) { From bdfa83b486769ae5ad7b41f23f733e80b73e3a61 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 6 Dec 2011 16:28:09 +0100 Subject: [PATCH 119/122] enable pcma by default --- Settings.bundle/audio.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Settings.bundle/audio.plist b/Settings.bundle/audio.plist index 66182e15a..d51abaff1 100644 --- a/Settings.bundle/audio.plist +++ b/Settings.bundle/audio.plist @@ -92,7 +92,7 @@ DefaultValue - + Key pcma_preference Title From 51497fc39982e7b882c647691759fed67fcc77dc Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 6 Dec 2011 18:16:43 +0100 Subject: [PATCH 120/122] fix preview in landscape mode --- Classes/VideoViewController.xib | 35 +++++++++++++++------------------ 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index f79a64430..2e2c9748d 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -186,23 +186,6 @@ 274 - - YES - - - 274 - {{308, 235}, {106, 80}} - - - - - 3 - MQA - - - IBCocoaTouchFramework - - {420, 320} @@ -286,6 +269,20 @@ + + + 274 + {{308, 233}, {106, 80}} + + + + + 3 + MQA + + + IBCocoaTouchFramework + {480, 320} @@ -493,6 +490,7 @@ + landscape @@ -520,7 +518,6 @@ YES - display @@ -528,7 +525,7 @@ 16 - + preview From 01be837306c04821b3b566294bb592439067a80e Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 7 Dec 2011 10:05:31 +0100 Subject: [PATCH 121/122] update linphone to implement IOS capture for landscape left --- Classes/LinphoneUI/LinphoneManager.m | 8 - Classes/VideoViewController.h | 38 ++- Classes/VideoViewController.m | 55 ++-- Classes/VideoViewController.xib | 407 ++++++++++++++++++++++----- linphone-Info.plist | 4 +- submodules/linphone | 2 +- 6 files changed, 401 insertions(+), 113 deletions(-) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 9bef7968a..65ec30936 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -829,14 +829,6 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach /*IOS specific*/ linphone_core_start_dtmf_stream(theLinphoneCore); - LCSipTransports transportValue; - if (linphone_core_get_sip_transports(theLinphoneCore, &transportValue)) { - ms_error("cannot get current transport"); - } - if (transportValue.udp_port != 0) { - //enable sip keepalive - linphone_core_enable_keep_alive(theLinphoneCore, true); - } } -(void) registerLogView:(id) view { mLogView = view; diff --git a/Classes/VideoViewController.h b/Classes/VideoViewController.h index ea65a8f10..48a728d42 100644 --- a/Classes/VideoViewController.h +++ b/Classes/VideoViewController.h @@ -27,12 +27,19 @@ UIHangUpButton* mHangUp; UICamSwitch* mCamSwitch; - UIView* mLandscape; - UIView* mDisplayLand; - UIView* mPreviewLand; - UIMuteButton* mMuteLand; - UIHangUpButton* mHangUpLand; - UICamSwitch* mCamSwitchLand; + UIView* mLandscapeRight; + UIView* mDisplayLandRight; + UIView* mPreviewLandRight; + UIMuteButton* mMuteLandRight; + UIHangUpButton* mHangUpLandRight; + UICamSwitch* mCamSwitchLandRight; + + UIView* mLandscapeLeft; + UIView* mDisplayLandLeft; + UIView* mPreviewLandLeft; + UIMuteButton* mMuteLandLeft; + UIHangUpButton* mHangUpLandLeft; + UICamSwitch* mCamSwitchLandLeft; BOOL isFirst; int maxCall; @@ -45,10 +52,17 @@ @property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUp; @property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitch; -@property (nonatomic, retain) IBOutlet UIView* mLandscape; -@property (nonatomic, retain) IBOutlet UIView* mDisplayLand; -@property (nonatomic, retain) IBOutlet UIView* mPreviewLand; -@property (nonatomic, retain) IBOutlet UIMuteButton* mMuteLand; -@property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUpLand; -@property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitchLand; +@property (nonatomic, retain) IBOutlet UIView* mLandscapeRight; +@property (nonatomic, retain) IBOutlet UIView* mDisplayLandRight; +@property (nonatomic, retain) IBOutlet UIView* mPreviewLandRight; +@property (nonatomic, retain) IBOutlet UIMuteButton* mMuteLandRight; +@property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUpLandRight; +@property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitchLandRight; + +@property (nonatomic, retain) IBOutlet UIView* mLandscapeLeft; +@property (nonatomic, retain) IBOutlet UIView* mDisplayLandLeft; +@property (nonatomic, retain) IBOutlet UIView* mPreviewLandLeft; +@property (nonatomic, retain) IBOutlet UIMuteButton* mMuteLandLeft; +@property (nonatomic, retain) IBOutlet UIHangUpButton* mHangUpLandLeft; +@property (nonatomic, retain) IBOutlet UICamSwitch* mCamSwitchLandLeft; @end \ No newline at end of file diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index 94e7219a8..56d2476c5 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -29,12 +29,19 @@ @synthesize mHangUp; @synthesize mCamSwitch; -@synthesize mLandscape; -@synthesize mDisplayLand; -@synthesize mPreviewLand; -@synthesize mMuteLand; -@synthesize mHangUpLand; -@synthesize mCamSwitchLand; +@synthesize mLandscapeRight; +@synthesize mDisplayLandRight; +@synthesize mPreviewLandRight; +@synthesize mMuteLandRight; +@synthesize mHangUpLandRight; +@synthesize mCamSwitchLandRight; + +@synthesize mLandscapeLeft; +@synthesize mDisplayLandLeft; +@synthesize mPreviewLandLeft; +@synthesize mMuteLandLeft; +@synthesize mHangUpLandLeft; +@synthesize mCamSwitchLandLeft; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { @@ -64,9 +71,11 @@ { [super viewDidLoad]; [mMute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; - [mMuteLand initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; + [mMuteLandRight initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; + [mMuteLandLeft initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] ]; [mCamSwitch setPreview:mPreview]; - [mCamSwitchLand setPreview:mPreviewLand]; + [mCamSwitchLandRight setPreview:mPreviewLandRight]; + [mCamSwitchLandLeft setPreview:mPreviewLandLeft]; isFirst=TRUE; } @@ -78,14 +87,19 @@ linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplay); linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreview); linphone_core_set_device_rotation([LinphoneManager getLc], 0); - + } else if (oritentation == UIInterfaceOrientationLandscapeRight ) { - [self.view addSubview:mLandscape]; - linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplayLand); - linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreviewLand); + [self.view addSubview:mLandscapeRight]; + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplayLandRight); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreviewLandRight); linphone_core_set_device_rotation([LinphoneManager getLc], 270); - } - + + } else if (oritentation == UIInterfaceOrientationLandscapeLeft ) { + [self.view addSubview:mLandscapeLeft]; + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)mDisplayLandLeft); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)mPreviewLandLeft); + linphone_core_set_device_rotation([LinphoneManager getLc], 90); + } if ((oldLinphoneOrientation != linphone_core_get_device_rotation([LinphoneManager getLc])) && linphone_core_get_current_call([LinphoneManager getLc])) { //Orientation has change, must call update call @@ -126,7 +140,8 @@ withObject:nil waitUntilDone:YES]; [mMute reset]; - [mMuteLand reset]; + [mMuteLandRight reset]; + [mMuteLandLeft reset]; maxCall = linphone_core_get_max_calls([LinphoneManager getLc]); linphone_core_set_max_calls([LinphoneManager getLc], 1); } @@ -138,16 +153,20 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations - return interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeRight ; + return interfaceOrientation == UIInterfaceOrientationPortrait + || interfaceOrientation == UIInterfaceOrientationLandscapeRight + || interfaceOrientation == UIInterfaceOrientationLandscapeLeft; } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self configureOrientation:self.interfaceOrientation]; [mMute reset]; - [mMuteLand reset]; + [mMuteLandRight reset]; + [mMuteLandLeft reset]; } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - [mLandscape removeFromSuperview]; + [mLandscapeLeft removeFromSuperview]; + [mLandscapeRight removeFromSuperview]; [mPortrait removeFromSuperview]; } @end diff --git a/Classes/VideoViewController.xib b/Classes/VideoViewController.xib index 2e2c9748d..f754d3f1a 100644 --- a/Classes/VideoViewController.xib +++ b/Classes/VideoViewController.xib @@ -41,7 +41,6 @@ {320, 460} - 1 MCAwIDAAA @@ -134,7 +133,6 @@ {{211, 418}, {108, 62}} - NO IBCocoaTouchFramework 0 @@ -203,7 +201,7 @@ {{420, 0}, {60, 108}} - + NO IBCocoaTouchFramework 0 @@ -214,9 +212,9 @@ MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - + NSImage - mic_active.png + micro.png NSImage @@ -231,7 +229,7 @@ {{420, 107}, {60, 106}} - + NO IBCocoaTouchFramework 0 @@ -253,7 +251,6 @@ {{420, 212}, {60, 108}} - NO IBCocoaTouchFramework 0 @@ -275,7 +272,7 @@ {{308, 233}, {106, 80}} - + 3 MQA @@ -299,6 +296,120 @@ IBCocoaTouchFramework + + + 292 + + YES + + + 274 + {{60, 0}, {420, 320}} + + + + + 3 + MQA + + + IBCocoaTouchFramework + + + + 292 + {60, 108} + + + + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + + + + 292 + {{0, 107}, {60, 106}} + + + + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + + + + 292 + {{0, 212}, {60, 108}} + + + NO + IBCocoaTouchFramework + 0 + 0 + Switch + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + + + + 274 + {{360, 233}, {106, 80}} + + + + + 3 + MQA + + + IBCocoaTouchFramework + + + {480, 320} + + + + + 3 + MQA + + + + 3 + 3 + + IBCocoaTouchFramework + @@ -343,22 +454,6 @@ 21 - - - mLandscape - - - - 22 - - - - mDisplayLand - - - - 23 - mHangUp @@ -367,30 +462,6 @@ 26 - - - mMuteLand - - - - 27 - - - - mHangUpLand - - - - 28 - - - - mCamSwitchLand - - - - 29 - view @@ -401,11 +472,99 @@ - mPreviewLand + mMuteLandRight + + + + 40 + + + + mHangUpLandRight + + + + 41 + + + + mCamSwitchLandRight + + + + 42 + + + + mLandscapeRight + + + + 43 + + + + mDisplayLandRight + + + + 44 + + + + mPreviewLandRight - 24 + 45 + + + + mDisplayLandLeft + + + + 46 + + + + mMuteLandLeft + + + + 47 + + + + mHangUpLandLeft + + + + 48 + + + + mCamSwitchLandLeft + + + + 49 + + + + mPreviewLandLeft + + + + 50 + + + + mLandscapeLeft + + + + 51 @@ -493,7 +652,7 @@ - landscape + landscape-right 19 @@ -528,6 +687,50 @@ preview + + 34 + + + YES + + + + + + + + landscape-left + + + 35 + + + preview + + + 36 + + + Cam Switch + + + 37 + + + HangHup + + + 38 + + + Mute + + + 39 + + + display + @@ -549,6 +752,15 @@ 19.CustomClassName 19.IBPluginDependency 31.IBPluginDependency + 34.IBPluginDependency + 35.IBPluginDependency + 36.CustomClassName + 36.IBPluginDependency + 37.CustomClassName + 37.IBPluginDependency + 38.CustomClassName + 38.IBPluginDependency + 39.IBPluginDependency 5.IBPluginDependency 6.CustomClassName 6.IBPluginDependency @@ -576,6 +788,15 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UICamSwitch + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIHangUpButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIMuteButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIHangUpButton @@ -597,7 +818,7 @@ - 33 + 51 @@ -653,29 +874,41 @@ YES mCamSwitch - mCamSwitchLand + mCamSwitchLandLeft + mCamSwitchLandRight mDisplay - mDisplayLand + mDisplayLandLeft + mDisplayLandRight mHangUp - mHangUpLand - mLandscape + mHangUpLandLeft + mHangUpLandRight + mLandscapeLeft + mLandscapeRight mMute - mMuteLand + mMuteLandLeft + mMuteLandRight mPortrait mPreview - mPreviewLand + mPreviewLandLeft + mPreviewLandRight YES UICamSwitch UICamSwitch + UICamSwitch + UIView UIView UIView UIHangUpButton UIHangUpButton + UIHangUpButton + UIView UIView UIMuteButton UIMuteButton + UIMuteButton + UIView UIView UIView UIView @@ -686,17 +919,23 @@ YES mCamSwitch - mCamSwitchLand + mCamSwitchLandLeft + mCamSwitchLandRight mDisplay - mDisplayLand + mDisplayLandLeft + mDisplayLandRight mHangUp - mHangUpLand - mLandscape + mHangUpLandLeft + mHangUpLandRight + mLandscapeLeft + mLandscapeRight mMute - mMuteLand + mMuteLandLeft + mMuteLandRight mPortrait mPreview - mPreviewLand + mPreviewLandLeft + mPreviewLandRight YES @@ -705,7 +944,11 @@ UICamSwitch - mCamSwitchLand + mCamSwitchLandLeft + UICamSwitch + + + mCamSwitchLandRight UICamSwitch @@ -713,7 +956,11 @@ UIView - mDisplayLand + mDisplayLandLeft + UIView + + + mDisplayLandRight UIView @@ -721,11 +968,19 @@ UIHangUpButton - mHangUpLand + mHangUpLandLeft UIHangUpButton - mLandscape + mHangUpLandRight + UIHangUpButton + + + mLandscapeLeft + UIView + + + mLandscapeRight UIView @@ -733,7 +988,11 @@ UIMuteButton - mMuteLand + mMuteLandLeft + UIMuteButton + + + mMuteLandRight UIMuteButton @@ -745,7 +1004,11 @@ UIView - mPreviewLand + mPreviewLandLeft + UIView + + + mPreviewLandRight UIView @@ -771,14 +1034,14 @@ YES clavier-01-106px.png clavier-01-108px.png - mic_active.png + micro.png stopcall-red.png YES {106, 60} {108, 60} - {20, 20} + {107, 67} {62, 54} diff --git a/linphone-Info.plist b/linphone-Info.plist index 549e8cff8..a2bb16988 100644 --- a/linphone-Info.plist +++ b/linphone-Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.4.10 + 3.4.11 CFBundleSignature ???? CFBundleVersion - 1.1 + 1.1.0.1 NSMainNibFile PhoneMainView UIApplicationExitsOnSuspend diff --git a/submodules/linphone b/submodules/linphone index 2001ce8a8..6818a24e2 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 2001ce8a8f32170223b182db840ef19afa9e256b +Subproject commit 6818a24e2d7ec20f3ff74026391c09ea88cc7091 From 64366d0053572dc417b59d1346d9b8a82d1d6930 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 8 Dec 2011 10:27:07 +0100 Subject: [PATCH 122/122] fix wrong linphone submodule --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 6818a24e2..1615847ff 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 6818a24e2d7ec20f3ff74026391c09ea88cc7091 +Subproject commit 1615847fff9cabdd1a3b26dd4e711db1e852fbdc