From 0678b17975f50a831fb8a1cda6baaa961e3b6de7 Mon Sep 17 00:00:00 2001 From: Good Guy Date: Sun, 30 Aug 2020 17:01:00 -0600 Subject: [PATCH] add ctrl-z for undo, addition 7 ffmpeg plugins activated, add select highlighted edits, update shortcuts --- cinelerra-5.1/cinelerra/editpopup.C | 19 +++++++- cinelerra-5.1/cinelerra/editpopup.h | 10 ++++ cinelerra-5.1/cinelerra/mwindow.h | 1 + cinelerra-5.1/cinelerra/mwindowedit.C | 8 ++++ cinelerra-5.1/cinelerra/mwindowgui.C | 45 ++++++++++++------ cinelerra-5.1/cinelerra/tracks.C | 14 ++++++ cinelerra-5.1/cinelerra/tracks.h | 1 + cinelerra-5.1/doc/shortcuts.html | 34 +++++++++++-- cinelerra-5.1/ffmpeg/plugin.opts | 42 ++++++++-------- cinelerra-5.1/info/plugins.txt | 10 +++- cinelerra-5.1/msg/txt | 7 +++ .../plugins/theme_suv/data/span_off.png | Bin 6376 -> 5385 bytes 12 files changed, 149 insertions(+), 42 deletions(-) diff --git a/cinelerra-5.1/cinelerra/editpopup.C b/cinelerra-5.1/cinelerra/editpopup.C index da9b06ba..60dcafb8 100644 --- a/cinelerra-5.1/cinelerra/editpopup.C +++ b/cinelerra-5.1/cinelerra/editpopup.C @@ -67,6 +67,7 @@ void EditPopup::create_objects() { add_item(open_edl = new EditPopupOpenEDL(mwindow, this)); add_item(new EditPopupClearSelect(mwindow, this)); + add_item(new EditPopupSelectEdits(mwindow, this)); add_item(new EditPopupCopy(mwindow, this)); add_item(new EditPopupCut(mwindow, this)); add_item(new EditPopupMute(mwindow, this)); @@ -159,6 +160,21 @@ int EditPopupClearSelect::handle_event() return 1; } +EditPopupSelectEdits::EditPopupSelectEdits(MWindow *mwindow, EditPopup *popup) + : BC_MenuItem(_("Select Edits"),_("Ctrl-Alt-a"),'a') +{ + this->mwindow = mwindow; + this->popup = popup; + set_ctrl(1); + set_alt(1); +} + +int EditPopupSelectEdits::handle_event() +{ + mwindow->select_edits(); + return 1; +} + EditPopupCopy::EditPopupCopy(MWindow *mwindow, EditPopup *popup) : BC_MenuItem(_("Copy"),_("Ctrl-c"),'c') { @@ -203,11 +219,12 @@ int EditPopupCut::handle_event() } EditPopupCutPack::EditPopupCutPack(MWindow *mwindow, EditPopup *popup) - : BC_MenuItem(_("Cut pack"),_("Ctrl-z"),'z') + : BC_MenuItem(_("Cut pack"),_("Ctrl-Alt-z"),'z') { this->mwindow = mwindow; this->popup = popup; set_ctrl(1); + set_alt(); } int EditPopupCutPack::handle_event() diff --git a/cinelerra-5.1/cinelerra/editpopup.h b/cinelerra-5.1/cinelerra/editpopup.h index 2c34be62..ed3fe2f8 100644 --- a/cinelerra-5.1/cinelerra/editpopup.h +++ b/cinelerra-5.1/cinelerra/editpopup.h @@ -73,6 +73,16 @@ public: EditPopup *popup; }; +class EditPopupSelectEdits : public BC_MenuItem +{ +public: + EditPopupSelectEdits(MWindow *mwindow, EditPopup *popup); + int handle_event(); + + MWindow *mwindow; + EditPopup *popup; +}; + class EditPopupCopy : public BC_MenuItem { public: diff --git a/cinelerra-5.1/cinelerra/mwindow.h b/cinelerra-5.1/cinelerra/mwindow.h index 954d245a..2f89d2d9 100644 --- a/cinelerra-5.1/cinelerra/mwindow.h +++ b/cinelerra-5.1/cinelerra/mwindow.h @@ -447,6 +447,7 @@ public: void clear_hard_edges(); int clear_hard_edges(double start, double end); void clear_select(); + void select_edits(); void concatenate_tracks(); int copy_flags(int copy_flags=COPY_CLIPBOARD); void copy(); diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index eac149e9..7b359ce2 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -426,6 +426,14 @@ void MWindow::clear_select() gui->draw_overlays(1); } +void MWindow::select_edits() +{ + double start = edl->local_session->get_selectionstart(); + double end = edl->local_session->get_selectionend(); + edl->tracks->select_edits(start, end); + gui->draw_overlays(1); +} + void MWindow::concatenate_tracks() { undo_before(); diff --git a/cinelerra-5.1/cinelerra/mwindowgui.C b/cinelerra-5.1/cinelerra/mwindowgui.C index 34638e18..5f9edd92 100644 --- a/cinelerra-5.1/cinelerra/mwindowgui.C +++ b/cinelerra-5.1/cinelerra/mwindowgui.C @@ -1079,27 +1079,32 @@ int MWindowGUI::keypress_event() if( result ) return result; Track *this_track = 0, *first_track = 0; - int collapse = 0, packed = 0, overwrite = 0, plugins = 0; + int packed = 0, overwrite = 0, plugins = 0; double position = 0; switch( get_keypress() ) { case 'A': - if( !alt_down() ) { - if( !ctrl_down() || !shift_down() ) break; + if( !alt_down() && ctrl_down() ) { mwindow->edl->tracks->clear_selected_edits(); draw_overlays(1); result = 1; - break; - } // fall thru + } + break; case 'a': - if( !alt_down() ) break; - stop_transport("MWindowGUI::keypress_event 1"); - mwindow->nearest_auto_keyframe(shift_down(), - !ctrl_down() ? PLAY_FORWARD : PLAY_REVERSE); - result = 1; + if( !ctrl_down() && alt_down() ) { + stop_transport("MWindowGUI::keypress_event 1"); + mwindow->nearest_auto_keyframe(shift_down(), + !ctrl_down() ? PLAY_FORWARD : PLAY_REVERSE); + result = 1; + } + else if( ctrl_down() && alt_down() ) { + mwindow->select_edits(); + result = 1; + } break; case 'e': + if( ctrl_down() || alt_down() ) break; mwindow->toggle_editing_mode(); result = 1; break; @@ -1150,17 +1155,29 @@ int MWindowGUI::keypress_event() result = 1; break; case 'M': - collapse = 1; + mwindow->cut_selected_edits(0, 1); + result = 1; + break; case BACKSPACE: case 'm': - mwindow->cut_selected_edits(0, collapse); + mwindow->cut_selected_edits(0, 0); result = 1; break; case 'z': - collapse = 1; + if( !alt_down() ) { + // z and ctrl-z both are undo, z mainmenu item + if( mwindow->session->current_operation == NO_OPERATION ) + mwindow->undo_entry(this); + result = 1; + } + else if( ctrl_down() ) { + mwindow->cut_selected_edits(1, 1); + result = 1; + } + break; case 'x': if( !ctrl_down() || alt_down() ) break; - mwindow->cut_selected_edits(1, collapse); + mwindow->cut_selected_edits(1, 0); result = 1; break; diff --git a/cinelerra-5.1/cinelerra/tracks.C b/cinelerra-5.1/cinelerra/tracks.C index 101e7cdb..73e7706d 100644 --- a/cinelerra-5.1/cinelerra/tracks.C +++ b/cinelerra-5.1/cinelerra/tracks.C @@ -126,6 +126,20 @@ void Tracks::get_selected_edits(ArrayList *drag_edits) } } +void Tracks::select_edits(double start, double end) +{ + for( Track *track=first; track; track=track->next ) { + if( !track->is_armed() ) continue; + int64_t start_pos = track->to_units(start, 0); + int64_t end_pos = track->to_units(end, 0); + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( start_pos >= edit->startproject+edit->length ) continue; + if( edit->startproject >= end_pos ) continue; + edit->is_selected = 1; + } + } +} + void Tracks::get_automation_extents(float *min, float *max, double start, diff --git a/cinelerra-5.1/cinelerra/tracks.h b/cinelerra-5.1/cinelerra/tracks.h index e839b772..78d1fe59 100644 --- a/cinelerra-5.1/cinelerra/tracks.h +++ b/cinelerra-5.1/cinelerra/tracks.h @@ -59,6 +59,7 @@ public: void clear_selected_edits(); int clear_hard_edges(double start, double end); void get_selected_edits(ArrayList *drag_edits); + void select_edits(double start, double end); int next_group_id(); int new_group(int id); int set_group_selected(int id, int v); diff --git a/cinelerra-5.1/doc/shortcuts.html b/cinelerra-5.1/doc/shortcuts.html index 9f54f568..4c0c7730 100644 --- a/cinelerra-5.1/doc/shortcuts.html +++ b/cinelerra-5.1/doc/shortcuts.html @@ -57,13 +57,13 @@
- load tool - 'Alt-a' + 'Ctrl-a' Selects all files
- load tool - 'Alt-z' + 'Ctrl-z' Deselects any selected files @@ -72,6 +72,12 @@ 's' Save project + +
+ Save + 'Ctrl-s' + Save project +
Save As… @@ -174,6 +180,12 @@ 'z' Undo from history previous operation + + Edit + Undo clear + 'Ctrl-z' + Undo from history previous operation + Pulldown Redo @@ -552,10 +564,16 @@ Alt-e Bring up the Transcode menu + +
+ Align cursor on frames + Ctrl-a + Toggle Align cursor on frames +
- Save settings -
+ Save settings now + Ctrl-Shift-S Save Cinelerra_rc @@ -1154,6 +1172,12 @@ Edits + Select Edits + Ctrl-Alt-a + Add highlighted to selected edits + + +
Copy Ctrl-c Copy selected edits into copy buffer @@ -1185,7 +1209,7 @@
Cut Pack - Ctrl-z + Ctrl-Alt-z Delete selected edits/put in buffer/collapse diff --git a/cinelerra-5.1/ffmpeg/plugin.opts b/cinelerra-5.1/ffmpeg/plugin.opts index a5f92148..845a2545 100644 --- a/cinelerra-5.1/ffmpeg/plugin.opts +++ b/cinelerra-5.1/ffmpeg/plugin.opts @@ -20,8 +20,8 @@ agate #ainterleave #alimiter allpass -#allrgb -#allyuv +allrgb +allyuv aloop #alphaextract ###Operation not permitted #alphamerge ###Input/output error @@ -71,7 +71,7 @@ boxblur #buffer size=320x240:pixfmt=6:time_base=1/24:pixel_aspect=1/1 ###Invalid argument #buffersink ###Input/output error bwdif -#cellauto p=@:s=100x400:full=0:rule=18 +cellauto p=@:s=100x400:full=0:rule=18 #channelmap 1|2|0|5|3|4:5.1 ###Invalid argument #channelsplit ###Operation not permitted chorus in_gain=0.400000:out_gain=0.400000:delays=1|1:decays=1|1:speeds=1|1:depths=1|1 @@ -87,8 +87,8 @@ colorspace iall=smpte170m:all=bt709 compand compensationdelay #concat ###Operation not permitted -#convolution 0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0 -#copy +#convolution ###Invalid argument +#copy ###not appropriate cover_rect crop cropdetect @@ -133,11 +133,11 @@ fillborders #firequalizer delay=0.1:fixed=on:zero_phase=on flanger format pix_fmts=yuv420p|yuv444p|yuv410p -#fps 30 +#fps 30 ###not appropriate #framepack ###Input/output error framerate framestep step=30 -#freezedetect +#freezedetect ###not appropriate fspp gblur #geq ###Invalid argument @@ -153,9 +153,9 @@ hqdn3d hqx #hstack ###Operation not permitted hue -#hwdownload -#hwmap -#hwupload +#hwdownload ###Operation not permitted +#hwmap ###Input/output error +#hwupload ###Operation not permitted #hwupload_cuda #hysteresis ###Input/output error idet @@ -191,28 +191,28 @@ nlmeans r=15:p=7:s=2 #nnedi ###Invalid argument #noformat ###not part of frame data noise -#null +#null ###not appropriate #nullsink ###Input/output error #nullsrc #overlay x=main_w-overlay_w-10:y=main_h-overlay_h-10 ###Input/output error owdenoise pad -#palettegen +#palettegen ###Resource temporarily unavailable #paletteuse ###Input/output error pan 1c|c0=0.9*c0+0.1*c1 perms perspective phase -#pixdesctest +#pixdesctest ###not appropriate pp pp7 #premultiply ###Operation not permitted prewitt #procamp_vaapi ###Operation not permitted #psnr PSNR=10*log10(MAX^2/MSE) ###Input/output error -#pullup -#qp ###not part of frame data -#random seed=-1 +pullup +#qp ###Operation not permitted +#random seed =-1 ###Resource temporarily unavailable readeia608 readvitc realtime @@ -221,7 +221,7 @@ removegrain #removelogo ###Invalid argument repeatfields #replaygain -#reverse +#reverse ###Resource temporarily unavailable rgbtestsrc rotate sab @@ -230,14 +230,14 @@ scale 200:100 #scale_vaapi ###Operation not permitted #scale2ref ###Input/output error #select ###Operation not permitted -#selectivecolor greens=.5 0 -.33 0:blues=0 .27 +selectivecolor greens=.5 0 -.33 0:blues=0 .27 #sendcmd ###Invalid argument separatefields #setdar ###will not work because Format already set #setfield ###not part of frame data #setpts ###not part of frame data #setsar ###will not work because Format already set -#settb +#settb ###not appropriate #sharpness_vaapi ###Operation not permitted #showcqt ###Input/output error #showfreqs ###Input/output error @@ -327,8 +327,8 @@ roberts #superequalizer #surround tlut2 -#tonemap -#vmafmotion +tonemap +#vmafmotion ###not appropriate ; new in 4.0 acontrast #afir ###Operation not permitted diff --git a/cinelerra-5.1/info/plugins.txt b/cinelerra-5.1/info/plugins.txt index 9c5e8a1b..cfd4235c 100644 --- a/cinelerra-5.1/info/plugins.txt +++ b/cinelerra-5.1/info/plugins.txt @@ -243,6 +243,8 @@ Zoom Blur: Blur the video and use a zoom effect. # # Description of FFmpeg Video Plugins # +F_allrgb: Generate all rgb colors. +F_allyuv: Generate all yuv colors. F_addroi: Mark a region of interest in a video frame. F_amplify: Amplify changes between successive video frames. F_atadenoise: Apply an Adaptive Temporal Averaging Denoiser. @@ -258,7 +260,9 @@ F_boxblur: Blurs the input video. Through the settings you are able to change the power and the radius of the boxblur applied to luma, chroma and alpha. F_bwdif: Deinterlaces the input image. -F_cas: Apply Contrast Adaptive Sharpen filter to video. +F_cas: Apply Contrast Adaptive Sharpen filter to video. +F_cellauto: Create pattern generated by an elementart cellular + automaton. F_chromahold: Turns a certain color range into gray. F_chromakey: Turns a certain color into transparency. Operates on YUV colors. @@ -363,6 +367,7 @@ F_mcdeint: Applies motion compensating deinterlacing. F_median: Pick median pixel from rectangle defined by radius. F_mestimate: Generate motion vectors. F_metadata: Manipulate video frame metadata. +F_minterpolate: Frame rate conversion using Motion Interpolation. F_mpdecimate: Remove near-duplicate frames. F_mptestsrc: Generate various test pattern. F_negate: Negates input video. @@ -392,6 +397,7 @@ F_pp: Filters video using libpostproc. F_pp7: Applies Postprocessing 7 filter. F_prewitt: Apply prewitt operator. F_pseudocolor: Make pseudocolored video frames. +F_pullup: Pullup from field sequence to frames. F_readeia608: Read EIA-608 Closed Caption codes from input video and write them to frame metadata. F_readvitc: Reads vertical interval timecode and writes it to @@ -414,6 +420,7 @@ F_scale_cuda: GPU accelerated video resizer. F_scdet: Detect video scene change. F_scroll: Scroll input video horizontally and/or vertically by constant speed. +F_selectivecolor: Apply cmyk adjustments to specific color ranges. F_separatefields: Split input video frames into fields. F_setparams: Force field, or color property for the output video frame. @@ -449,6 +456,7 @@ F_tlut2: Compute and apply a lookup table from two successive frames. F_tmedian: Pick median pixels from successive frames. F_tmix: Mix successive video frames. +F_tonemap: Conversion to/from different dynamic ranges. F_transpose: Transposes input video. F_transpose_vaapi: VAAPI VPP for transpose. F_unsharp: Sharpen or blur the input video. diff --git a/cinelerra-5.1/msg/txt b/cinelerra-5.1/msg/txt index 1f58c67a..c080f1b8 100644 --- a/cinelerra-5.1/msg/txt +++ b/cinelerra-5.1/msg/txt @@ -7,6 +7,13 @@ Cinfinity icons selected in Preferences Sam (CC BY 3.0, Cakewalk and Neophyte themes by Olaf Wolff (CC BY 4.0, https://creativecommons.org/licenses/by/4.0/) . +August 2020 New Features of note: + Bump Autos new feature; especially useful for speed. + Language preference now in Settings->Preferences. + Align Timecodes time-reference added as an improvement. + Ctrl-s and Ctrl-z more standard usage implemented. + Added drag speed highlighting for easier usage of auto. + Option and shortcut to select multiple edits. July 2020 New Features of note: Align Timecodes for various timecodes/stamps is available. FFmpeg plugins will have changes take effect when use Enter. diff --git a/cinelerra-5.1/plugins/theme_suv/data/span_off.png b/cinelerra-5.1/plugins/theme_suv/data/span_off.png index 7bcbb2cf0c26d2a575e57d00b33485393d836ecc..8671672ce6d2fb4c7d1496790ecc64110f9c9db3 100644 GIT binary patch delta 5375 zcmVf#Wv(172qR`~SB27yqJ-#e|qkswr82{)HN85-0Zj4tE7|e;Pl9-y%BB zaqN6H=Pf^fD z!t%Bv|M^7e&i`^d&(Geo?7i;YwUCHtdMfG!+r6e?U?=2qzLt1pej=aqc~xG;Hakf9 zw8M5@!&T?W%BCRQbj@wI&iinKB?iBI=H2_@cH{4(S$ zh<{s)JJ+q}dczg2JRL*5V=_(kw=eU%lYi%B_8uA{XUkixSeMs;vkc9g{$>;jar?gR=BUvFt z>L-Un4YepS#28b|09&lFB}pO0lu}L#axF^^Ip&meF1hAbq=XVnD!G(WORK&L7#M4+ zxt3aMYu+?2)R?O=zHy}cE)D%b+qZHOkiTBnP-`Gw&lzM zDOOl%Nj>b&aWw)!b#Me zkue_}8PA#l3fgPVY;hrY&79`UR!>tz&myDd#!ROfBZXl(AGdqU-FxPKls6O0kMib! z|CBkSsrzqa&XBra^Y#~6o62+JWbAgK#?%Vk$N5#7@uexLHQ#%hR+h`F=jAE>GExE0=;tZF0HX_L4nX+cA@;JX|L3EfiPgS~V88fVHZ% z5F>C4ghtuR1FCh8DYDJl>lpw|*E*Shw$X}fO$uPu%Ji-p=~QOh|ISp#?H^1vELm-P z#=P8E-8CUtvrh_Z7HZDh4AV-^a1O20TiKyCouT9eMQxdF=Dl`H@S;z}3Xq|HwE|my zc{lc(6W_mYF0~v}k1Az)E;M^4{bf-^b@;xX`T#k6Sfckzjq0%`b+MZMyNj5Q2V|Vu z$dRdBFI=n7s%2t>Pi-aNXI#4n__ar0XG*=Z81Yo8nZ>T1+&~emk>{9^X-Wv2|EOAj zrYD_!hkWaC5*DKVKZY8Bj z@I#iF$GSH)JQ=94W(%r4?#($fHVc~NM_2vuUgL;)giQc|0Y{8VYO^ta8=)W{Vbxp! zNS_r=3nFXTIyx}cs*96c0W?j)jCHcYl*`HVD#o5lsS>TeZs0vZ>8kX|T4Fm&x$A&08*-wG9a1EtwLe|c;ARmiXetgX&0xLNt4U;u1SmP zWxl+d?@ol2`QQP4rT#v4kFbKO2|@mn`P}9lsdX+LAy5;xERLXmVGA`53AVhZXxpSYQ)jqcix7rss zt<_ExsBuq8YAc^AH9son3@@VhPsO>>Ko|UoGw10Q^=9e&h z3Ig5t3c`B~K1F~LCj#b&A%OcS6fG%=3+#l}KA$(g4aE}(D(Z&fJr1p8=*9vgSp`Tg zrshmxl}vX7!y_%73OsSn!B2ST}2FhmOwF zH4Nx|LD^lvuee7~nKsTr3U<*W!URk>?eUNg%ILM4baNZivl?_kFr3#OpQ#7*K(s(n z+Q_(+1`13P;0)TLG618El!Ip%wuK!JRmIOvKG;nkz%=pL@}5DcRgyH~{cNCftj6<(1^3w42gfjy1m3 zJ~>XiCWG)jNmjjq^v39|bMJ~_Ocny@dcYRzs4?jEs15)1=FQuIsupAVsFs6U_oqjo z*2J1ovcOqv%2^b`OX_r1qk%`A7n4;lVF>zu!ah%b*imoag}uZxR%P`lSss zI)Oo0Frjda*sr-#5`i1-XRyvZV!-y7*^(j{Ka zRQoMVoH(FiR7oiMHaZVNe}gSa2e#CN9M)YyDc_dwddRfwiDE)Y)u9_&RmJ2`zBr{2 zD5aBszau9xff`{qmrOnsxE^G}BCT$M%HcTAI#dP$BJo>%iqR)6+DXy2PH&2UQ^l)1 zMrS-?-E&zkUaaO0;fcOOYi>t_`&8+D*Ev8BNXU-tR4TBp#6`4QOoW&Z+t<44sSp_n zv{DK-00E7@7%c9tbZ>LAHe-i$E2Xa4^dw&dapZH2N1n4RBmWOEh5x37z48 zB_}^ewSXvhL3C33YHA)pE=~ct^aIEV-%j^&Z5z5GB`AqM7-Dm9`1ML0bo|=6$MKlUw~X>P>Cv~RQJ29`$sj5L6k>j z7Z+MO_^0gkQyaLV=te*#*y9v{y>nYYfY);P0-6U@n2YuR`hsqU_)YGMm+gCMxrUNm zE%eF?hE9*itpcg}ptJYaH|__mr-Sd7(tu=4R-cJ)bfF16`Xi%D*(Ci{5hXB57QT zq=<-nHAo+eH-FQoXFcc3pS1FSX;Lj;bHuW%k2#F~sU)my-XH5IE7zgNFAeOryQh6U zq60=Gx61wP&*VX$<-ROTiKEfmQ%bhl67x!zZTwcFu1c>eCNxaXxcX(bbuM1f|6yB~ zAs}^N={3vKR3I?&(kyr<1w8Gr34O&qjybPOwimT%W(BRcXxw0Y5F<-}J%D+(at>_n z{`A;++MwB-lX=zsqw55FIs{2HC#rH#h*;iSoh_^cQv-0r{C%7~jk|$SXv}bla)VBo z)1^vYi)2k{ND)HJ?=B@$AcEg31`2gD$Wv#Hh^+S8up@mj1yLV?AsDHsQTX{?B- zi%SC^t3ng00-YiBl&#Z$!fW$2-7$pZ3l&R}9eSeNjj9-M@6-(%GPN^n-q%~JMxFlZ z)fn)_zUt#E_xWqTehZ=Xry&GzHL7kTNUcZMwWufx9rcUG^t$Ox_j6-hwRIQ~{$y75 zzr*%fTRc0s&HYh~R_GGtU(>u>s@TfbVXycWo$wwV-9^A>)6(OAI7zsSDxGTSmv)`m z_Z}3uR=t)+Y2s}hU%4Yc-mY#^@6S^iM*K3>PYtDuPT@#^1~Cp$LY(QX0*^J!1|_$I zBw_RlqFdZSw==-u)j>AjTpPL@1C?(O6a2^0N27mn(Bnq}THPk#--GW1f!^)Phb7!Y zqd8o{+5oRApLuqFeC>$Sn{LP2t@Vkyq-8l9Vf;USF?GyVN9wn{3%0`=Xjl8kA;nrM z3s^-smB_!@D6heNj$B9Ay&7Z*&~n-k=0~8N8Wf@7wwa}7jTl8H>YZXk^Qf+)vEHi^w6TR^L zqI_ad*q94_T&0herRo0(;HLkZJEe|Wn;;HFtF{44fIaY%a0`$vtru&?-48Wsr%f{D zuX*VEx0`kL;5@uNKQO((d==3E2k}ol_JBfx&Lg&ei85V?Mt6Aa?yH~u?t;NdS7q3K zbwE$?*eiJ3X=oj6S{GWZErhaDM?cUB&FF563K$@E>tn8PjPgc3tGt_(m#CF&VB$(%FqYs71T-&aBIO_^y(SE zAbWk*)Xej+sW%+NcIu48!j_2Y=?BtCKu+DH_6u2(j`E^PFcDOczk8*dy6fg3@qK!i zU-bQqxg%Z!INirw-%VxSNB*;^%*T=cWGeG{O)@S%F!gK0z`@aZzM?ouZ{Vcl2U6ZNUoZY%Q3db$#cV{7wsP1* z?|AwG9`O;UR4s~|{!x5`ueNS@H7pT-#b1G|xF*6rR^98wJesaj)>jNi*8QrUyl!9y z!3>}M|KL^`y8o}Zgplj1vrbLB7PO}8mDHxJNJGy9ZZz20Ak#+?niZ~1fIzWoSD4VY z;N_w}UvxuzV|coY9^S+3bAI21EIG^q0*BPfG^_R>^{WQQlBR)>F|5qnDvgZpf z!=N4LS~~$5*4redycK5CXG`es2KRG0D0k{)*QV>X$7?%x&q_xA16YuS`;eirumAu7 zgp+&~8GjtbUt7f@Ekf-eB9fsxSr8R*)G8FALZ}s5buhW~3z{?}DK3tJYr(;f#j1mg zv#t)Vf*|+-;^gS0=prTlFDbN$@!+^0@9sVB-U0qbg{fxOIG}2lkxnLrY;INPc|{Pz zh#-uJ#7uoo6jSgVU-$6w^)Ak{ywCkP!b;v`fPYUQo@KgW5pNJrZ(2I%ec~u9Neb~f z@t8puB!1+&?D8AuqQick88tHLdEzLsQ0!p2gIUQ?iKmETimFk*KkKr>d5g1Jsj=2Q z`3pmNZDpD3G>4GHB9aZm4~v`|@2;B%9yl;}_~yGabG{jJXLxv6w-Z8e+_R5dT3R{~G&3_} zVSi!azX$_%&_Ieim_xJGY8f9NS11(J>-7T(lPv$(BNVX^loh9LX10jksl;$$uvl zIRg3Lzx8hljBZm#~8G`9}$HI z7xS@SQOw2ck*uw)Ws+#SAp}X1C^(nP`wZoBS*21@DwUdX7}{c1S62_;zQtnkA780d dI(T)3;18A8r&fP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3*vb{x5mg#U9Dvjo0DE{D%^W(TwU`9Nk#Wn1!f zw{NSZDraReNgxo2V5V9B_rKfx5C7$0t%*rWt~p!&i#1l?cvI~Cub#io#`E|7BR`+H zACH@l4?Kq$`TX*qwCDWB@$~tH*EL-K@wh3^C%!xbJs-RV40>hHoB2LTj{AGu#b=

nV)-P?@aD@8T>3irC&X_T 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