--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.0... --------------------------------------------------------------------------------------------------------------- [18:56:05.111] Vidbot :: start() [18:56:05.111] Vidbot :: _next(), _stepIndex:0 of 4 [18:56:05.112] index :: _onStepStarted_vidbot(), step: 1 [18:56:05.113] Vidbot :: step[0], label:Initializing Core [18:56:05.121] index :: _onStepProgress_vidbot(), percent: 20 [18:56:05.122] Vidbot :: _parse() [18:56:05.123] index :: _onStepProgress_vidbot(), percent: 40 [18:56:05.123] Vidbot :: _validate() [18:56:05.124] index :: _onStepProgress_vidbot(), percent: 60 [18:56:05.124] Vidbot :: _fonts() [18:56:05.125] FabricFontManager :: add(), id: SourceSansPro-Bold [18:56:05.125] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [18:56:05.133] FabricFontManager :: add(), id: SourceSansPro-Light [18:56:05.134] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [18:56:05.134] FabricFontManager :: add(), id: DINOT-Bold [18:56:05.135] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [18:56:05.135] FabricFontManager :: add(), id: DINOT-Light [18:56:05.136] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [18:56:05.136] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [18:56:05.136] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [18:56:05.137] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [18:56:05.137] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [18:56:05.138] index :: _onStepProgress_vidbot(), percent: 80 [18:56:05.139] Vidbot :: _clips() [18:56:05.139] StreamManager :: add(), id:audio_vo, type:audio [18:56:05.140] AudioClip[audio_vo] :: constructor() [18:56:05.140] InputStream[audio_vo] :: constructor() [18:56:05.140] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [18:56:05.143] StreamManager :: add(), id:bg_music, type:audio [18:56:05.143] AudioClip[bg_music] :: constructor() [18:56:05.143] InputStream[bg_music] :: constructor() [18:56:05.143] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [18:56:05.143] StreamManager :: add(), id:simplefadedisplay, type:canvas [18:56:05.144] CanvasStream[canvas_250532393806] :: constructor() [18:56:05.144] InputStream[canvas_250532393806] :: constructor() [18:56:05.229] KenBurnsSlideshow[simplefadedisplay] :: constructor() [18:56:05.229] Overlay[simplefadedisplay] :: constructor() [18:56:05.230] CanvasClip[simplefadedisplay] :: constructor() [18:56:05.230] Clip[simplefadedisplay] :: constructor() [18:56:05.230] clip:"simplefadedisplay" added to stream:"canvas_250532393806" [18:56:05.230] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_250532393806', clipId: 'simplefadedisplay' } [18:56:05.230] StreamManager :: add(), id:caption, type:canvas [18:56:05.230] RenCaption[caption] :: constructor() [18:56:05.231] Ren[caption] :: constructor() [18:56:05.231] Overlay[caption] :: constructor() [18:56:05.231] CanvasClip[caption] :: constructor() [18:56:05.231] Clip[caption] :: constructor() [18:56:05.231] clip:"caption" added to stream:"canvas_250532393806" [18:56:05.231] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_250532393806', clipId: 'caption' } [18:56:05.231] all added... [18:56:05.231] Vidbot :: _next(), _stepIndex:1 of 4 [18:56:05.231] index :: _onStepCompleted_vidbot(), step: 1 [18:56:05.232] index :: _onStepStarted_vidbot(), step: 2 [18:56:05.232] Vidbot :: step[1], label:Initializing Input Streams [18:56:05.233] StreamManager :: init() [18:56:05.233] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [18:56:05.233] index :: _onStepProgress_vidbot(), percent: 33 [18:56:05.233] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [18:56:05.234] index :: _onStepProgress_vidbot(), percent: 67 [18:56:05.234] CanvasStream[canvas_250532393806] :: _init(), BEGIN [18:56:05.234] i:0, c.id:simplefadedisplay [18:56:05.234] KenBurnsSlideshow[simplefadedisplay] :: _init(), BEGIN [18:56:05.235] KenBurnsSlideshow[simplefadedisplay] :: _validate() [18:56:05.235] KenBurnsSlideshow[undefined] :: _validateAnim() [18:56:05.236] KenBurnsSlideshow[undefined] :: _validateTheme() [18:56:05.237] i:1, c.id:caption [18:56:05.237] RenCaption[caption] :: _init() [18:56:05.238] RenCaption[caption] :: _validate() [18:56:05.239] KenBurnsSlideshow[simplefadedisplay] :: _build() [18:56:05.246] AnimatedImageFrame[aif] :: constructor() [18:56:05.247] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.247] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_1.jpg [18:56:05.260] RenCaption[caption] :: _build() [18:56:05.276] Overlay[caption] :: _animate() [18:56:05.279] CanvasStream[caption] :: _init(), p.then() [18:56:05.358] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.361] AnimatedImageFrame[aif] :: _init(), END [18:56:05.363] AnimatedImageFrame[aif] :: constructor() [18:56:05.363] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.363] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_2.jpg [18:56:05.438] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.440] AnimatedImageFrame[aif] :: _init(), END [18:56:05.447] AnimatedImageFrame[aif] :: constructor() [18:56:05.447] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.448] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_3.jpg [18:56:05.539] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.540] AnimatedImageFrame[aif] :: _init(), END [18:56:05.541] AnimatedImageFrame[aif] :: constructor() [18:56:05.541] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.541] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_4.jpg [18:56:05.610] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.611] AnimatedImageFrame[aif] :: _init(), END [18:56:05.611] AnimatedImageFrame[aif] :: constructor() [18:56:05.612] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.612] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_5.jpg [18:56:05.684] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.686] AnimatedImageFrame[aif] :: _init(), END [18:56:05.686] AnimatedImageFrame[aif] :: constructor() [18:56:05.686] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.687] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_6.jpg [18:56:05.752] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.753] AnimatedImageFrame[aif] :: _init(), END [18:56:05.753] AnimatedImageFrame[aif] :: constructor() [18:56:05.753] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.754] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_7.jpg [18:56:05.821] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.822] AnimatedImageFrame[aif] :: _init(), END [18:56:05.823] AnimatedImageFrame[aif] :: constructor() [18:56:05.823] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.823] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_8.jpg [18:56:05.897] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.898] AnimatedImageFrame[aif] :: _init(), END [18:56:05.898] AnimatedImageFrame[aif] :: constructor() [18:56:05.898] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.898] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_9.jpg [18:56:05.958] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:05.959] AnimatedImageFrame[aif] :: _init(), END [18:56:05.960] AnimatedImageFrame[aif] :: constructor() [18:56:05.960] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:05.960] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_10.jpg [18:56:06.045] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.050] AnimatedImageFrame[aif] :: _init(), END [18:56:06.051] AnimatedImageFrame[aif] :: constructor() [18:56:06.051] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.052] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_11.jpg [18:56:06.117] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.119] AnimatedImageFrame[aif] :: _init(), END [18:56:06.119] AnimatedImageFrame[aif] :: constructor() [18:56:06.119] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.119] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_12.jpg [18:56:06.185] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.186] AnimatedImageFrame[aif] :: _init(), END [18:56:06.187] AnimatedImageFrame[aif] :: constructor() [18:56:06.187] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.187] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_13.jpg [18:56:06.248] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.249] AnimatedImageFrame[aif] :: _init(), END [18:56:06.250] AnimatedImageFrame[aif] :: constructor() [18:56:06.250] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.250] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_14.jpg [18:56:06.314] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.315] AnimatedImageFrame[aif] :: _init(), END [18:56:06.315] AnimatedImageFrame[aif] :: constructor() [18:56:06.315] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.315] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_15.jpg [18:56:06.369] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.371] AnimatedImageFrame[aif] :: _init(), END [18:56:06.379] AnimatedImageFrame[aif] :: constructor() [18:56:06.379] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.379] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_16.jpg [18:56:06.435] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.436] AnimatedImageFrame[aif] :: _init(), END [18:56:06.437] AnimatedImageFrame[aif] :: constructor() [18:56:06.437] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.437] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_17.jpg [18:56:06.493] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.494] AnimatedImageFrame[aif] :: _init(), END [18:56:06.494] AnimatedImageFrame[aif] :: constructor() [18:56:06.495] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.495] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_18.jpg [18:56:06.553] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.554] AnimatedImageFrame[aif] :: _init(), END [18:56:06.554] AnimatedImageFrame[aif] :: constructor() [18:56:06.554] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.555] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_19.jpg [18:56:06.601] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.602] AnimatedImageFrame[aif] :: _init(), END [18:56:06.602] AnimatedImageFrame[aif] :: constructor() [18:56:06.602] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.602] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_20.jpg [18:56:06.660] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.661] AnimatedImageFrame[aif] :: _init(), END [18:56:06.661] AnimatedImageFrame[aif] :: constructor() [18:56:06.662] AnimatedImageFrame[aif] :: _init(), BEGIN [18:56:06.662] CanvasClip :: LoadImageWithPromise(), src: F9F85789-8D6B-B26F-CA2F-497DE5E37B80_1.jpg [18:56:06.719] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [18:56:06.720] AnimatedImageFrame[aif] :: _init(), END [18:56:06.721] Overlay[simplefadedisplay] :: _animate() [18:56:06.721] KenBurnsSlideshow[simplefadedisplay] :: _init(), END [18:56:06.721] CanvasStream[simplefadedisplay] :: _init(), p.then() [18:56:06.722] CanvasStream[canvas_250532393806] :: _init(), promise.all.then() [18:56:06.728] CanvasStream[canvas_250532393806] :: _init(), END [18:56:06.729] StreamMangaer :: init(), stream[canvas_250532393806].then() [18:56:06.729] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_250532393806', progress: 1 } [18:56:06.729] index :: _onStepProgress_vidbot(), percent: 100 [18:56:06.729] StreamManager :: init(), promise.all.then... [18:56:06.729] Vidbot :: StreamMgr.on( 'INITED' ) [18:56:06.729] Vidbot :: _next(), _stepIndex:2 of 4 [18:56:06.730] index :: _onStepCompleted_vidbot(), step: 2 [18:56:06.730] index :: _onStepStarted_vidbot(), step: 3 [18:56:06.730] Vidbot :: step[2], label:Rendering Canvas Streams [18:56:06.730] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [18:56:06.730] StreamManager :: render() [18:56:06.731] CanvasStream[canvas_250532393806] :: render() [18:56:06.846] index :: _onStepProgress_vidbot(), percent: 0 [18:57:13.340] index :: _onStepProgress_vidbot(), percent: 5 [18:58:23.813] index :: _onStepProgress_vidbot(), percent: 10 [18:59:48.409] index :: _onStepProgress_vidbot(), percent: 15 [19:01:08.549] index :: _onStepProgress_vidbot(), percent: 20 [19:02:34.771] index :: _onStepProgress_vidbot(), percent: 25 [19:04:01.788] index :: _onStepProgress_vidbot(), percent: 30 [19:05:25.885] index :: _onStepProgress_vidbot(), percent: 35 [19:06:52.937] index :: _onStepProgress_vidbot(), percent: 40 [19:08:17.705] index :: _onStepProgress_vidbot(), percent: 45 [19:09:39.367] index :: _onStepProgress_vidbot(), percent: 50 [19:10:50.758] index :: _onStepProgress_vidbot(), percent: 55 [19:12:00.196] index :: _onStepProgress_vidbot(), percent: 60 [19:13:16.350] index :: _onStepProgress_vidbot(), percent: 65 [19:14:40.775] index :: _onStepProgress_vidbot(), percent: 70 [19:15:54.731] index :: _onStepProgress_vidbot(), percent: 75 [19:17:04.394] index :: _onStepProgress_vidbot(), percent: 80 [19:18:10.563] index :: _onStepProgress_vidbot(), percent: 85 [19:19:14.417] index :: _onStepProgress_vidbot(), percent: 90 [19:20:23.768] index :: _onStepProgress_vidbot(), percent: 95 [19:21:43.225] index :: _onStepProgress_vidbot(), percent: 100 [19:21:50.480] StreamManager :: render(), Promise.all.then... [19:21:50.480] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [19:21:50.480] Vidbot :: _next(), _stepIndex:3 of 4 [19:21:50.481] index :: _onStepCompleted_vidbot(), step: 3 [19:21:50.481] index :: _onStepStarted_vidbot(), step: 4 [19:21:50.482] Vidbot :: step[3], label:Encoding Media [19:21:50.485] CanvasFilters :: Overlay() [19:21:50.486] AudioStream[audio_vo] :: inputOptions() [19:21:50.486] AudioFilters :: Volume() [19:21:50.486] filter: [2:a]volume=1[2_vol] [19:21:50.486] AudioFilters :: Delay() [19:21:50.486] filter: [2_vol]adelay=0|0[2_del] [19:21:50.487] AudioStream[bg_music] :: inputOptions() [19:21:50.487] AudioFilters :: Volume() [19:21:50.487] filter: [3:a]volume=0.25[3_vol] [19:21:50.487] AudioFilters :: FadeOut() [19:21:50.487] filter: [3_vol]afade=t=out:st=61.32:d=1[3_fadeout] [19:21:50.487] AudioFilters :: Delay() [19:21:50.487] filter: [3_fadeout]adelay=0|0[3_del] [19:21:50.487] AudioFilters :: Mix() [19:21:50.487] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [19:21:50.488] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [19:21:50.490] hang.time: 60 [19:21:50.679] Vidbot :: ffmpeg.on( 'start' ) [19:21:50.679] ffmpeg -f lavfi -i color=c=000000:s=1280x720:r=30:duration=61.32 -r 30 -i ./tmp/canvas_250532393806_%05d.png -to 00:01:01.320 -i file:///var/www/html/ [19:21:50.679] clients/20508/audio/F9F85789-8D6B-B26F-CA2F-497DE5E37B80.mp3 -to 00:01:01.320 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/Concep [19:21:50.679] t3.mp3 -y -filter_complex [0:v][1:v]overlay=x=0:y=0[1_out];[2:a]volume=1[2_vol];[2_vol]adelay=0|0[2_del];[3:a]volume=0.25[3_vol];[3_vol]afade=t=out:st [19:21:50.679] =61.32:d=1[3_fadeout];[3_fadeout]adelay=0|0[3_del];[2_del][3_del]amix=inputs=2:duration=longest[a_out] -acodec aac -vcodec libx264 -r 30 -f mp4 -map [ [19:21:50.679] a_out] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/20508/video/F9F85789-8D6B-B26F- [19:21:50.679] CA2F-497DE5E37B80.mp4 [19:21:50.951] index :: _onStepProgress_vidbot(), percent: -3387554562 [19:21:51.332] index :: _onStepProgress_vidbot(), percent: 1 [19:21:53.362] index :: _onStepProgress_vidbot(), percent: 6 [19:21:54.865] index :: _onStepProgress_vidbot(), percent: 10 [19:21:56.888] index :: _onStepProgress_vidbot(), percent: 15 [19:21:58.904] index :: _onStepProgress_vidbot(), percent: 20 [19:22:00.451] index :: _onStepProgress_vidbot(), percent: 25 [19:22:02.488] index :: _onStepProgress_vidbot(), percent: 30 [19:22:04.504] index :: _onStepProgress_vidbot(), percent: 36 [19:22:06.031] index :: _onStepProgress_vidbot(), percent: 40 [19:22:08.057] index :: _onStepProgress_vidbot(), percent: 46 [19:22:09.575] index :: _onStepProgress_vidbot(), percent: 51 [19:22:11.089] index :: _onStepProgress_vidbot(), percent: 55 [19:22:13.143] index :: _onStepProgress_vidbot(), percent: 61 [19:22:14.699] index :: _onStepProgress_vidbot(), percent: 66 [19:22:16.226] index :: _onStepProgress_vidbot(), percent: 70 [19:22:17.732] index :: _onStepProgress_vidbot(), percent: 75 [19:22:19.242] index :: _onStepProgress_vidbot(), percent: 80 [19:22:20.755] index :: _onStepProgress_vidbot(), percent: 85 [19:22:22.278] index :: _onStepProgress_vidbot(), percent: 91 [19:22:23.289] index :: _onStepProgress_vidbot(), percent: 95 [19:22:24.815] index :: _onStepProgress_vidbot(), percent: 100 [19:22:24.878] Vidbot :: ffmpeg.on( 'end' ), Done! [19:22:24.879] StreamManager :: dispose() [19:22:24.879] CanvasStream[canvas_250532393806] :: dispose() [19:22:24.896] Vidbot :: fflog.on( 'finish' ) [19:22:24.896] fflog.path: /var/www/html/clients/20508/video/F9F85789-8D6B-B26F-CA2F-497DE5E37B80.mp4.fflog [19:22:24.896] Vidbot :: _next(), _stepIndex:4 of 4 [19:22:24.896] index :: _onStepCompleted_vidbot(), step: 4 [19:22:24.897] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 1579.806, output: '/var/www/html/clients/20508/video/F9F85789-8D6B-B26F-CA2F-497DE5E37B80.mp4', duration: 61.32 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/20508/video/F9F85789-8D6B-B26F-CA2F-497DE5E37B80.mp4 Media Duration : 00:01:01.320 Generation Time : 00:26:19.806 ---------------------------------------------------------------------------------------------------------------