2018-04-23 17:34:22 +00:00
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
2017-05-12 12:24:03 +00:00
// DO NOT EDIT
use ClockTime ;
use Object ;
use glib ;
2017-11-27 17:16:34 +00:00
use glib ::StaticType ;
2017-05-12 12:24:03 +00:00
use glib ::Value ;
2019-01-16 11:32:39 +00:00
use glib ::object ::Cast ;
2017-05-12 12:24:03 +00:00
use glib ::object ::IsA ;
2017-09-09 13:01:32 +00:00
use glib ::signal ::SignalHandlerId ;
2018-12-08 09:05:20 +00:00
use glib ::signal ::connect_raw ;
2017-05-12 12:24:03 +00:00
use glib ::translate ::* ;
2019-03-19 07:40:05 +00:00
use glib_sys ;
use gobject_sys ;
use gst_sys ;
2017-05-12 12:24:03 +00:00
use std ::boxed ::Box as Box_ ;
use std ::mem ;
use std ::mem ::transmute ;
glib_wrapper! {
2019-03-19 07:40:05 +00:00
pub struct Clock ( Object < gst_sys ::GstClock , gst_sys ::GstClockClass , ClockClass > ) @ extends Object ;
2017-05-12 12:24:03 +00:00
match fn {
2019-03-19 07:40:05 +00:00
get_type = > | | gst_sys ::gst_clock_get_type ( ) ,
2017-05-12 12:24:03 +00:00
}
}
impl Clock {
2019-01-29 13:53:44 +00:00
//pub fn id_compare_func(id1: /*Unimplemented*/Option<Fundamental: Pointer>, id2: /*Unimplemented*/Option<Fundamental: Pointer>) -> i32 {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_compare_func() }
2017-05-12 12:24:03 +00:00
//}
2019-04-23 14:32:09 +00:00
//#[cfg(any(feature = "v1_16", feature = "dox"))]
//pub fn id_get_clock(id: /*Unimplemented*/ClockID) -> Option<Clock> {
// unsafe { TODO: call gst_sys:gst_clock_id_get_clock() }
//}
2017-05-12 12:24:03 +00:00
//pub fn id_get_time(id: /*Unimplemented*/ClockID) -> ClockTime {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_get_time() }
2017-05-12 12:24:03 +00:00
//}
//pub fn id_ref(id: /*Unimplemented*/ClockID) -> /*Unimplemented*/Option<ClockID> {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_ref() }
2017-05-12 12:24:03 +00:00
//}
//pub fn id_unref(id: /*Unimplemented*/ClockID) {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_unref() }
2017-05-12 12:24:03 +00:00
//}
//pub fn id_unschedule(id: /*Unimplemented*/ClockID) {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_unschedule() }
2017-05-12 12:24:03 +00:00
//}
2019-04-23 14:32:09 +00:00
//#[cfg(any(feature = "v1_16", feature = "dox"))]
//pub fn id_uses_clock<P: IsA<Clock>>(id: /*Unimplemented*/ClockID, clock: &P) -> bool {
// unsafe { TODO: call gst_sys:gst_clock_id_uses_clock() }
//}
2017-08-13 22:40:43 +00:00
//pub fn id_wait(id: /*Unimplemented*/ClockID) -> (ClockReturn, ClockTimeDiff) {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_wait() }
2017-05-12 12:24:03 +00:00
//}
2019-01-29 13:53:44 +00:00
//pub fn id_wait_async(id: /*Unimplemented*/ClockID, func: /*Unimplemented*/Fn(&Clock, ClockTime, /*Unimplemented*/ClockID) -> bool, user_data: /*Unimplemented*/Option<Fundamental: Pointer>) -> ClockReturn {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_id_wait_async() }
2017-05-12 12:24:03 +00:00
//}
}
2017-06-25 08:04:37 +00:00
unsafe impl Send for Clock { }
unsafe impl Sync for Clock { }
2019-01-16 11:32:39 +00:00
pub const NONE_CLOCK : Option < & Clock > = None ;
2018-12-08 09:05:20 +00:00
pub trait ClockExt : 'static {
2017-05-12 12:24:03 +00:00
fn add_observation ( & self , slave : ClockTime , master : ClockTime ) -> Option < f64 > ;
fn add_observation_unapplied ( & self , slave : ClockTime , master : ClockTime ) -> Option < ( f64 , ClockTime , ClockTime , ClockTime , ClockTime ) > ;
fn adjust_unlocked ( & self , internal : ClockTime ) -> ClockTime ;
fn get_calibration ( & self ) -> ( ClockTime , ClockTime , ClockTime , ClockTime ) ;
fn get_internal_time ( & self ) -> ClockTime ;
fn get_master ( & self ) -> Option < Clock > ;
fn get_resolution ( & self ) -> ClockTime ;
fn get_time ( & self ) -> ClockTime ;
fn get_timeout ( & self ) -> ClockTime ;
fn is_synced ( & self ) -> bool ;
//fn new_periodic_id(&self, start_time: ClockTime, interval: ClockTime) -> /*Unimplemented*/Option<ClockID>;
//fn new_single_shot_id(&self, time: ClockTime) -> /*Unimplemented*/Option<ClockID>;
//fn periodic_id_reinit(&self, id: /*Unimplemented*/ClockID, start_time: ClockTime, interval: ClockTime) -> bool;
fn set_calibration ( & self , internal : ClockTime , external : ClockTime , rate_num : ClockTime , rate_denom : ClockTime ) ;
2019-03-19 07:40:05 +00:00
fn set_master < P : IsA < Clock > > ( & self , master : Option < & P > ) -> Result < ( ) , glib ::error ::BoolError > ;
2017-05-12 12:24:03 +00:00
fn set_resolution ( & self , resolution : ClockTime ) -> ClockTime ;
fn set_synced ( & self , synced : bool ) ;
fn set_timeout ( & self , timeout : ClockTime ) ;
//fn single_shot_id_reinit(&self, id: /*Unimplemented*/ClockID, time: ClockTime) -> bool;
fn unadjust_unlocked ( & self , external : ClockTime ) -> ClockTime ;
2017-06-24 09:02:24 +00:00
fn wait_for_sync ( & self , timeout : ClockTime ) -> Result < ( ) , glib ::error ::BoolError > ;
2017-05-12 12:24:03 +00:00
fn get_property_window_size ( & self ) -> i32 ;
fn set_property_window_size ( & self , window_size : i32 ) ;
fn get_property_window_threshold ( & self ) -> i32 ;
fn set_property_window_threshold ( & self , window_threshold : i32 ) ;
2017-09-09 13:01:32 +00:00
fn connect_synced < F : Fn ( & Self , bool ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId ;
2017-08-18 13:29:21 +00:00
2017-09-09 13:01:32 +00:00
fn connect_property_timeout_notify < F : Fn ( & Self ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId ;
2017-08-18 13:29:21 +00:00
2017-09-09 13:01:32 +00:00
fn connect_property_window_size_notify < F : Fn ( & Self ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId ;
2017-08-18 13:29:21 +00:00
2017-09-09 13:01:32 +00:00
fn connect_property_window_threshold_notify < F : Fn ( & Self ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId ;
2017-05-12 12:24:03 +00:00
}
2018-12-08 09:05:20 +00:00
impl < O : IsA < Clock > > ClockExt for O {
2017-05-12 12:24:03 +00:00
fn add_observation ( & self , slave : ClockTime , master : ClockTime ) -> Option < f64 > {
unsafe {
let mut r_squared = mem ::uninitialized ( ) ;
2019-03-19 07:40:05 +00:00
let ret = from_glib ( gst_sys ::gst_clock_add_observation ( self . as_ref ( ) . to_glib_none ( ) . 0 , slave . to_glib ( ) , master . to_glib ( ) , & mut r_squared ) ) ;
2017-05-12 12:24:03 +00:00
if ret { Some ( r_squared ) } else { None }
}
}
fn add_observation_unapplied ( & self , slave : ClockTime , master : ClockTime ) -> Option < ( f64 , ClockTime , ClockTime , ClockTime , ClockTime ) > {
unsafe {
let mut r_squared = mem ::uninitialized ( ) ;
let mut internal = mem ::uninitialized ( ) ;
let mut external = mem ::uninitialized ( ) ;
let mut rate_num = mem ::uninitialized ( ) ;
let mut rate_denom = mem ::uninitialized ( ) ;
2019-03-19 07:40:05 +00:00
let ret = from_glib ( gst_sys ::gst_clock_add_observation_unapplied ( self . as_ref ( ) . to_glib_none ( ) . 0 , slave . to_glib ( ) , master . to_glib ( ) , & mut r_squared , & mut internal , & mut external , & mut rate_num , & mut rate_denom ) ) ;
2017-11-11 10:21:55 +00:00
if ret { Some ( ( r_squared , from_glib ( internal ) , from_glib ( external ) , from_glib ( rate_num ) , from_glib ( rate_denom ) ) ) } else { None }
2017-05-12 12:24:03 +00:00
}
}
fn adjust_unlocked ( & self , internal : ClockTime ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_adjust_unlocked ( self . as_ref ( ) . to_glib_none ( ) . 0 , internal . to_glib ( ) ) )
2017-05-12 12:24:03 +00:00
}
}
fn get_calibration ( & self ) -> ( ClockTime , ClockTime , ClockTime , ClockTime ) {
unsafe {
let mut internal = mem ::uninitialized ( ) ;
let mut external = mem ::uninitialized ( ) ;
let mut rate_num = mem ::uninitialized ( ) ;
let mut rate_denom = mem ::uninitialized ( ) ;
2019-03-19 07:40:05 +00:00
gst_sys ::gst_clock_get_calibration ( self . as_ref ( ) . to_glib_none ( ) . 0 , & mut internal , & mut external , & mut rate_num , & mut rate_denom ) ;
2017-11-11 10:21:55 +00:00
( from_glib ( internal ) , from_glib ( external ) , from_glib ( rate_num ) , from_glib ( rate_denom ) )
2017-05-12 12:24:03 +00:00
}
}
fn get_internal_time ( & self ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_get_internal_time ( self . as_ref ( ) . to_glib_none ( ) . 0 ) )
2017-05-12 12:24:03 +00:00
}
}
fn get_master ( & self ) -> Option < Clock > {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib_full ( gst_sys ::gst_clock_get_master ( self . as_ref ( ) . to_glib_none ( ) . 0 ) )
2017-05-12 12:24:03 +00:00
}
}
fn get_resolution ( & self ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_get_resolution ( self . as_ref ( ) . to_glib_none ( ) . 0 ) )
2017-05-12 12:24:03 +00:00
}
}
fn get_time ( & self ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_get_time ( self . as_ref ( ) . to_glib_none ( ) . 0 ) )
2017-05-12 12:24:03 +00:00
}
}
fn get_timeout ( & self ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_get_timeout ( self . as_ref ( ) . to_glib_none ( ) . 0 ) )
2017-05-12 12:24:03 +00:00
}
}
fn is_synced ( & self ) -> bool {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_is_synced ( self . as_ref ( ) . to_glib_none ( ) . 0 ) )
2017-05-12 12:24:03 +00:00
}
}
//fn new_periodic_id(&self, start_time: ClockTime, interval: ClockTime) -> /*Unimplemented*/Option<ClockID> {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_new_periodic_id() }
2017-05-12 12:24:03 +00:00
//}
//fn new_single_shot_id(&self, time: ClockTime) -> /*Unimplemented*/Option<ClockID> {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_new_single_shot_id() }
2017-05-12 12:24:03 +00:00
//}
//fn periodic_id_reinit(&self, id: /*Unimplemented*/ClockID, start_time: ClockTime, interval: ClockTime) -> bool {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_periodic_id_reinit() }
2017-05-12 12:24:03 +00:00
//}
fn set_calibration ( & self , internal : ClockTime , external : ClockTime , rate_num : ClockTime , rate_denom : ClockTime ) {
unsafe {
2019-03-19 07:40:05 +00:00
gst_sys ::gst_clock_set_calibration ( self . as_ref ( ) . to_glib_none ( ) . 0 , internal . to_glib ( ) , external . to_glib ( ) , rate_num . to_glib ( ) , rate_denom . to_glib ( ) ) ;
2017-05-12 12:24:03 +00:00
}
}
2019-03-19 07:40:05 +00:00
fn set_master < P : IsA < Clock > > ( & self , master : Option < & P > ) -> Result < ( ) , glib ::error ::BoolError > {
2017-05-12 12:24:03 +00:00
unsafe {
2019-03-19 07:40:05 +00:00
glib_result_from_gboolean! ( gst_sys ::gst_clock_set_master ( self . as_ref ( ) . to_glib_none ( ) . 0 , master . map ( | p | p . as_ref ( ) ) . to_glib_none ( ) . 0 ) , " Failed to set master clock " )
2017-05-12 12:24:03 +00:00
}
}
fn set_resolution ( & self , resolution : ClockTime ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_set_resolution ( self . as_ref ( ) . to_glib_none ( ) . 0 , resolution . to_glib ( ) ) )
2017-05-12 12:24:03 +00:00
}
}
fn set_synced ( & self , synced : bool ) {
unsafe {
2019-03-19 07:40:05 +00:00
gst_sys ::gst_clock_set_synced ( self . as_ref ( ) . to_glib_none ( ) . 0 , synced . to_glib ( ) ) ;
2017-05-12 12:24:03 +00:00
}
}
fn set_timeout ( & self , timeout : ClockTime ) {
unsafe {
2019-03-19 07:40:05 +00:00
gst_sys ::gst_clock_set_timeout ( self . as_ref ( ) . to_glib_none ( ) . 0 , timeout . to_glib ( ) ) ;
2017-05-12 12:24:03 +00:00
}
}
//fn single_shot_id_reinit(&self, id: /*Unimplemented*/ClockID, time: ClockTime) -> bool {
2019-03-19 07:40:05 +00:00
// unsafe { TODO: call gst_sys:gst_clock_single_shot_id_reinit() }
2017-05-12 12:24:03 +00:00
//}
fn unadjust_unlocked ( & self , external : ClockTime ) -> ClockTime {
unsafe {
2019-03-19 07:40:05 +00:00
from_glib ( gst_sys ::gst_clock_unadjust_unlocked ( self . as_ref ( ) . to_glib_none ( ) . 0 , external . to_glib ( ) ) )
2017-05-12 12:24:03 +00:00
}
}
2017-06-24 09:02:24 +00:00
fn wait_for_sync ( & self , timeout : ClockTime ) -> Result < ( ) , glib ::error ::BoolError > {
2017-05-12 12:24:03 +00:00
unsafe {
2019-03-19 07:40:05 +00:00
glib_result_from_gboolean! ( gst_sys ::gst_clock_wait_for_sync ( self . as_ref ( ) . to_glib_none ( ) . 0 , timeout . to_glib ( ) ) , " Timed out waiting for sync " )
2017-05-12 12:24:03 +00:00
}
}
fn get_property_window_size ( & self ) -> i32 {
unsafe {
2018-02-06 14:42:34 +00:00
let mut value = Value ::from_type ( < i32 as StaticType > ::static_type ( ) ) ;
2019-03-19 07:40:05 +00:00
gobject_sys ::g_object_get_property ( self . to_glib_none ( ) . 0 as * mut gobject_sys ::GObject , b " window-size \0 " . as_ptr ( ) as * const _ , value . to_glib_none_mut ( ) . 0 ) ;
2017-11-27 17:16:34 +00:00
value . get ( ) . unwrap ( )
2017-05-12 12:24:03 +00:00
}
}
fn set_property_window_size ( & self , window_size : i32 ) {
unsafe {
2019-03-19 07:40:05 +00:00
gobject_sys ::g_object_set_property ( self . to_glib_none ( ) . 0 as * mut gobject_sys ::GObject , b " window-size \0 " . as_ptr ( ) as * const _ , Value ::from ( & window_size ) . to_glib_none ( ) . 0 ) ;
2017-05-12 12:24:03 +00:00
}
}
fn get_property_window_threshold ( & self ) -> i32 {
unsafe {
2018-02-06 14:42:34 +00:00
let mut value = Value ::from_type ( < i32 as StaticType > ::static_type ( ) ) ;
2019-03-19 07:40:05 +00:00
gobject_sys ::g_object_get_property ( self . to_glib_none ( ) . 0 as * mut gobject_sys ::GObject , b " window-threshold \0 " . as_ptr ( ) as * const _ , value . to_glib_none_mut ( ) . 0 ) ;
2017-11-27 17:16:34 +00:00
value . get ( ) . unwrap ( )
2017-05-12 12:24:03 +00:00
}
}
fn set_property_window_threshold ( & self , window_threshold : i32 ) {
unsafe {
2019-03-19 07:40:05 +00:00
gobject_sys ::g_object_set_property ( self . to_glib_none ( ) . 0 as * mut gobject_sys ::GObject , b " window-threshold \0 " . as_ptr ( ) as * const _ , Value ::from ( & window_threshold ) . to_glib_none ( ) . 0 ) ;
2017-05-12 12:24:03 +00:00
}
}
2017-09-09 13:01:32 +00:00
fn connect_synced < F : Fn ( & Self , bool ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId {
2017-05-12 12:24:03 +00:00
unsafe {
2019-01-29 13:53:44 +00:00
let f : Box_ < F > = Box_ ::new ( f ) ;
2019-01-16 11:32:39 +00:00
connect_raw ( self . as_ptr ( ) as * mut _ , b " synced \0 " . as_ptr ( ) as * const _ ,
2019-01-29 13:53:44 +00:00
Some ( transmute ( synced_trampoline ::< Self , F > as usize ) ) , Box_ ::into_raw ( f ) )
2017-05-12 12:24:03 +00:00
}
}
2017-08-18 13:29:21 +00:00
2017-09-09 13:01:32 +00:00
fn connect_property_timeout_notify < F : Fn ( & Self ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId {
2017-08-18 13:29:21 +00:00
unsafe {
2019-01-29 13:53:44 +00:00
let f : Box_ < F > = Box_ ::new ( f ) ;
2019-01-16 11:32:39 +00:00
connect_raw ( self . as_ptr ( ) as * mut _ , b " notify::timeout \0 " . as_ptr ( ) as * const _ ,
2019-01-29 13:53:44 +00:00
Some ( transmute ( notify_timeout_trampoline ::< Self , F > as usize ) ) , Box_ ::into_raw ( f ) )
2017-08-18 13:29:21 +00:00
}
}
2017-09-09 13:01:32 +00:00
fn connect_property_window_size_notify < F : Fn ( & Self ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId {
2017-08-18 13:29:21 +00:00
unsafe {
2019-01-29 13:53:44 +00:00
let f : Box_ < F > = Box_ ::new ( f ) ;
2019-01-16 11:32:39 +00:00
connect_raw ( self . as_ptr ( ) as * mut _ , b " notify::window-size \0 " . as_ptr ( ) as * const _ ,
2019-01-29 13:53:44 +00:00
Some ( transmute ( notify_window_size_trampoline ::< Self , F > as usize ) ) , Box_ ::into_raw ( f ) )
2017-08-18 13:29:21 +00:00
}
}
2017-09-09 13:01:32 +00:00
fn connect_property_window_threshold_notify < F : Fn ( & Self ) + Send + Sync + 'static > ( & self , f : F ) -> SignalHandlerId {
2017-08-18 13:29:21 +00:00
unsafe {
2019-01-29 13:53:44 +00:00
let f : Box_ < F > = Box_ ::new ( f ) ;
2019-01-16 11:32:39 +00:00
connect_raw ( self . as_ptr ( ) as * mut _ , b " notify::window-threshold \0 " . as_ptr ( ) as * const _ ,
2019-01-29 13:53:44 +00:00
Some ( transmute ( notify_window_threshold_trampoline ::< Self , F > as usize ) ) , Box_ ::into_raw ( f ) )
2017-08-18 13:29:21 +00:00
}
}
2017-05-12 12:24:03 +00:00
}
2019-03-19 07:40:05 +00:00
unsafe extern " C " fn synced_trampoline < P , F : Fn ( & P , bool ) + Send + Sync + 'static > ( this : * mut gst_sys ::GstClock , synced : glib_sys ::gboolean , f : glib_sys ::gpointer )
2017-05-12 12:24:03 +00:00
where P : IsA < Clock > {
2019-02-22 09:51:17 +00:00
let f : & F = & * ( f as * const F ) ;
2019-01-16 11:32:39 +00:00
f ( & Clock ::from_glib_borrow ( this ) . unsafe_cast ( ) , from_glib ( synced ) )
2017-05-12 12:24:03 +00:00
}
2017-08-18 13:29:21 +00:00
2019-03-19 07:40:05 +00:00
unsafe extern " C " fn notify_timeout_trampoline < P , F : Fn ( & P ) + Send + Sync + 'static > ( this : * mut gst_sys ::GstClock , _param_spec : glib_sys ::gpointer , f : glib_sys ::gpointer )
2017-08-18 13:29:21 +00:00
where P : IsA < Clock > {
2019-02-22 09:51:17 +00:00
let f : & F = & * ( f as * const F ) ;
2019-01-16 11:32:39 +00:00
f ( & Clock ::from_glib_borrow ( this ) . unsafe_cast ( ) )
2017-08-18 13:29:21 +00:00
}
2019-03-19 07:40:05 +00:00
unsafe extern " C " fn notify_window_size_trampoline < P , F : Fn ( & P ) + Send + Sync + 'static > ( this : * mut gst_sys ::GstClock , _param_spec : glib_sys ::gpointer , f : glib_sys ::gpointer )
2017-08-18 13:29:21 +00:00
where P : IsA < Clock > {
2019-02-22 09:51:17 +00:00
let f : & F = & * ( f as * const F ) ;
2019-01-16 11:32:39 +00:00
f ( & Clock ::from_glib_borrow ( this ) . unsafe_cast ( ) )
2017-08-18 13:29:21 +00:00
}
2019-03-19 07:40:05 +00:00
unsafe extern " C " fn notify_window_threshold_trampoline < P , F : Fn ( & P ) + Send + Sync + 'static > ( this : * mut gst_sys ::GstClock , _param_spec : glib_sys ::gpointer , f : glib_sys ::gpointer )
2017-08-18 13:29:21 +00:00
where P : IsA < Clock > {
2019-02-22 09:51:17 +00:00
let f : & F = & * ( f as * const F ) ;
2019-01-16 11:32:39 +00:00
f ( & Clock ::from_glib_borrow ( this ) . unsafe_cast ( ) )
2017-08-18 13:29:21 +00:00
}