--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [07:52:33.972] Vidbot :: start() [07:52:33.972] Vidbot :: _next(), _stepIndex:0 of 4 [07:52:33.973] index :: _onStepStarted_vidbot(), step: 1 [07:52:33.974] Vidbot :: step[0], label:Initializing Core [07:52:33.983] index :: _onStepProgress_vidbot(), percent: 20 [07:52:33.983] Vidbot :: _parse() [07:52:33.985] index :: _onStepProgress_vidbot(), percent: 40 [07:52:33.985] Vidbot :: _validate() [07:52:33.986] index :: _onStepProgress_vidbot(), percent: 60 [07:52:33.986] Vidbot :: _fonts() [07:52:33.987] FabricFontManager :: add(), id: SourceSansPro-Bold [07:52:33.987] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [07:52:33.995] FabricFontManager :: add(), id: SourceSansPro-Light [07:52:33.995] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [07:52:33.996] FabricFontManager :: add(), id: DINOT-Bold [07:52:33.996] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [07:52:33.997] FabricFontManager :: add(), id: DINOT-Light [07:52:33.997] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [07:52:33.998] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [07:52:33.998] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [07:52:33.998] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [07:52:33.999] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [07:52:34.000] index :: _onStepProgress_vidbot(), percent: 80 [07:52:34.000] Vidbot :: _clips() [07:52:34.000] StreamManager :: add(), id:audio_vo, type:audio [07:52:34.001] AudioClip[audio_vo] :: constructor() [07:52:34.001] InputStream[audio_vo] :: constructor() [07:52:34.001] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [07:52:34.004] StreamManager :: add(), id:bg_music, type:audio [07:52:34.004] AudioClip[bg_music] :: constructor() [07:52:34.004] InputStream[bg_music] :: constructor() [07:52:34.004] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [07:52:34.004] StreamManager :: add(), id:simplefadedisplay, type:canvas [07:52:34.005] CanvasStream[canvas_521354026969] :: constructor() [07:52:34.005] InputStream[canvas_521354026969] :: constructor() [07:52:34.092] KenBurnsSlideshow[simplefadedisplay] :: constructor() [07:52:34.092] Overlay[simplefadedisplay] :: constructor() [07:52:34.092] CanvasClip[simplefadedisplay] :: constructor() [07:52:34.093] Clip[simplefadedisplay] :: constructor() [07:52:34.093] clip:"simplefadedisplay" added to stream:"canvas_521354026969" [07:52:34.093] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_521354026969', clipId: 'simplefadedisplay' } [07:52:34.093] StreamManager :: add(), id:caption, type:canvas [07:52:34.093] RenCaption[caption] :: constructor() [07:52:34.093] Ren[caption] :: constructor() [07:52:34.094] Overlay[caption] :: constructor() [07:52:34.094] CanvasClip[caption] :: constructor() [07:52:34.094] Clip[caption] :: constructor() [07:52:34.094] clip:"caption" added to stream:"canvas_521354026969" [07:52:34.094] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_521354026969', clipId: 'caption' } [07:52:34.094] all added... [07:52:34.094] Vidbot :: _next(), _stepIndex:1 of 4 [07:52:34.094] index :: _onStepCompleted_vidbot(), step: 1 [07:52:34.095] index :: _onStepStarted_vidbot(), step: 2 [07:52:34.095] Vidbot :: step[1], label:Initializing Input Streams [07:52:34.095] StreamManager :: init() [07:52:34.096] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [07:52:34.096] index :: _onStepProgress_vidbot(), percent: 33 [07:52:34.096] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [07:52:34.096] index :: _onStepProgress_vidbot(), percent: 67 [07:52:34.097] CanvasStream[canvas_521354026969] :: _init(), BEGIN [07:52:34.097] i:0, c.id:simplefadedisplay [07:52:34.097] KenBurnsSlideshow[simplefadedisplay] :: _init(), BEGIN [07:52:34.097] KenBurnsSlideshow[simplefadedisplay] :: _validate() [07:52:34.098] KenBurnsSlideshow[undefined] :: _validateAnim() [07:52:34.098] KenBurnsSlideshow[undefined] :: _validateTheme() [07:52:34.099] i:1, c.id:caption [07:52:34.100] RenCaption[caption] :: _init() [07:52:34.100] RenCaption[caption] :: _validate() [07:52:34.101] KenBurnsSlideshow[simplefadedisplay] :: _build() [07:52:34.107] AnimatedImageFrame[aif] :: constructor() [07:52:34.108] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.109] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_1.jpg [07:52:34.122] RenCaption[caption] :: _build() [07:52:34.140] Overlay[caption] :: _animate() [07:52:34.142] CanvasStream[caption] :: _init(), p.then() [07:52:34.158] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.162] AnimatedImageFrame[aif] :: _init(), END [07:52:34.164] AnimatedImageFrame[aif] :: constructor() [07:52:34.164] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.164] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_2.jpg [07:52:34.177] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.179] AnimatedImageFrame[aif] :: _init(), END [07:52:34.180] AnimatedImageFrame[aif] :: constructor() [07:52:34.180] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.180] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_3.jpg [07:52:34.191] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.193] AnimatedImageFrame[aif] :: _init(), END [07:52:34.194] AnimatedImageFrame[aif] :: constructor() [07:52:34.194] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.194] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_4.jpg [07:52:34.206] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.207] AnimatedImageFrame[aif] :: _init(), END [07:52:34.207] AnimatedImageFrame[aif] :: constructor() [07:52:34.208] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.208] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_1.jpg [07:52:34.219] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.220] AnimatedImageFrame[aif] :: _init(), END [07:52:34.221] AnimatedImageFrame[aif] :: constructor() [07:52:34.221] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.221] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_2.jpg [07:52:34.232] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.233] AnimatedImageFrame[aif] :: _init(), END [07:52:34.234] AnimatedImageFrame[aif] :: constructor() [07:52:34.234] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.234] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_3.jpg [07:52:34.246] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.247] AnimatedImageFrame[aif] :: _init(), END [07:52:34.247] AnimatedImageFrame[aif] :: constructor() [07:52:34.247] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.247] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_4.jpg [07:52:34.259] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.260] AnimatedImageFrame[aif] :: _init(), END [07:52:34.260] AnimatedImageFrame[aif] :: constructor() [07:52:34.260] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.261] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_1.jpg [07:52:34.272] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.273] AnimatedImageFrame[aif] :: _init(), END [07:52:34.273] AnimatedImageFrame[aif] :: constructor() [07:52:34.273] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.274] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_2.jpg [07:52:34.284] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.285] AnimatedImageFrame[aif] :: _init(), END [07:52:34.286] AnimatedImageFrame[aif] :: constructor() [07:52:34.286] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.286] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_3.jpg [07:52:34.303] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.304] AnimatedImageFrame[aif] :: _init(), END [07:52:34.304] AnimatedImageFrame[aif] :: constructor() [07:52:34.304] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.305] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_4.jpg [07:52:34.316] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.317] AnimatedImageFrame[aif] :: _init(), END [07:52:34.317] AnimatedImageFrame[aif] :: constructor() [07:52:34.318] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.318] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_1.jpg [07:52:34.329] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.330] AnimatedImageFrame[aif] :: _init(), END [07:52:34.331] AnimatedImageFrame[aif] :: constructor() [07:52:34.331] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.331] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_2.jpg [07:52:34.341] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.343] AnimatedImageFrame[aif] :: _init(), END [07:52:34.343] AnimatedImageFrame[aif] :: constructor() [07:52:34.343] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.343] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_3.jpg [07:52:34.354] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.355] AnimatedImageFrame[aif] :: _init(), END [07:52:34.356] AnimatedImageFrame[aif] :: constructor() [07:52:34.356] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.356] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_4.jpg [07:52:34.366] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.367] AnimatedImageFrame[aif] :: _init(), END [07:52:34.368] AnimatedImageFrame[aif] :: constructor() [07:52:34.368] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.368] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_1.jpg [07:52:34.379] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.380] AnimatedImageFrame[aif] :: _init(), END [07:52:34.381] AnimatedImageFrame[aif] :: constructor() [07:52:34.381] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.381] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_2.jpg [07:52:34.392] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.392] AnimatedImageFrame[aif] :: _init(), END [07:52:34.393] AnimatedImageFrame[aif] :: constructor() [07:52:34.393] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.393] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_3.jpg [07:52:34.411] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.412] AnimatedImageFrame[aif] :: _init(), END [07:52:34.413] AnimatedImageFrame[aif] :: constructor() [07:52:34.413] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.413] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_4.jpg [07:52:34.424] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.425] AnimatedImageFrame[aif] :: _init(), END [07:52:34.426] AnimatedImageFrame[aif] :: constructor() [07:52:34.426] AnimatedImageFrame[aif] :: _init(), BEGIN [07:52:34.426] CanvasClip :: LoadImageWithPromise(), src: 3CFAF93F-B50A-BE83-552E-B00971B21DF6_1.jpg [07:52:34.436] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [07:52:34.437] AnimatedImageFrame[aif] :: _init(), END [07:52:34.437] Overlay[simplefadedisplay] :: _animate() [07:52:34.438] KenBurnsSlideshow[simplefadedisplay] :: _init(), END [07:52:34.438] CanvasStream[simplefadedisplay] :: _init(), p.then() [07:52:34.438] CanvasStream[canvas_521354026969] :: _init(), promise.all.then() [07:52:34.440] CanvasStream[canvas_521354026969] :: _init(), END [07:52:34.440] StreamMangaer :: init(), stream[canvas_521354026969].then() [07:52:34.440] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_521354026969', progress: 1 } [07:52:34.440] index :: _onStepProgress_vidbot(), percent: 100 [07:52:34.440] StreamManager :: init(), promise.all.then... [07:52:34.441] Vidbot :: StreamMgr.on( 'INITED' ) [07:52:34.441] Vidbot :: _next(), _stepIndex:2 of 4 [07:52:34.441] index :: _onStepCompleted_vidbot(), step: 2 [07:52:34.441] index :: _onStepStarted_vidbot(), step: 3 [07:52:34.441] Vidbot :: step[2], label:Rendering Canvas Streams [07:52:34.442] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [07:52:34.442] StreamManager :: render() [07:52:34.442] CanvasStream[canvas_521354026969] :: render() [07:52:34.474] index :: _onStepProgress_vidbot(), percent: 0 [07:52:45.286] index :: _onStepProgress_vidbot(), percent: 5 [07:52:57.753] index :: _onStepProgress_vidbot(), percent: 10 [07:53:08.051] index :: _onStepProgress_vidbot(), percent: 15 [07:53:19.198] index :: _onStepProgress_vidbot(), percent: 20 [07:53:30.505] index :: _onStepProgress_vidbot(), percent: 25 [07:53:41.408] index :: _onStepProgress_vidbot(), percent: 30 [07:53:52.435] index :: _onStepProgress_vidbot(), percent: 35 [07:54:03.707] index :: _onStepProgress_vidbot(), percent: 40 [07:54:14.241] index :: _onStepProgress_vidbot(), percent: 45 [07:54:24.120] index :: _onStepProgress_vidbot(), percent: 50 [07:54:33.468] index :: _onStepProgress_vidbot(), percent: 55 [07:54:43.067] index :: _onStepProgress_vidbot(), percent: 60 [07:54:54.191] index :: _onStepProgress_vidbot(), percent: 65 [07:55:05.129] index :: _onStepProgress_vidbot(), percent: 70 [07:55:16.426] index :: _onStepProgress_vidbot(), percent: 75 [07:55:26.942] index :: _onStepProgress_vidbot(), percent: 80 [07:55:38.102] index :: _onStepProgress_vidbot(), percent: 85 [07:55:49.256] index :: _onStepProgress_vidbot(), percent: 90 [07:56:00.165] index :: _onStepProgress_vidbot(), percent: 95 [07:56:11.305] index :: _onStepProgress_vidbot(), percent: 100 [07:56:12.478] StreamManager :: render(), Promise.all.then... [07:56:12.478] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [07:56:12.479] Vidbot :: _next(), _stepIndex:3 of 4 [07:56:12.479] index :: _onStepCompleted_vidbot(), step: 3 [07:56:12.480] index :: _onStepStarted_vidbot(), step: 4 [07:56:12.481] Vidbot :: step[3], label:Encoding Media [07:56:12.483] CanvasFilters :: Overlay() [07:56:12.483] AudioStream[audio_vo] :: inputOptions() [07:56:12.484] AudioFilters :: Volume() [07:56:12.484] filter: [2:a]volume=1[2_vol] [07:56:12.484] AudioFilters :: Delay() [07:56:12.484] filter: [2_vol]adelay=0|0[2_del] [07:56:12.484] AudioStream[bg_music] :: inputOptions() [07:56:12.484] AudioFilters :: Volume() [07:56:12.484] filter: [3:a]volume=0.25[3_vol] [07:56:12.485] AudioFilters :: FadeOut() [07:56:12.485] filter: [3_vol]afade=t=out:st=62.11:d=1[3_fadeout] [07:56:12.485] AudioFilters :: Delay() [07:56:12.485] filter: [3_fadeout]adelay=0|0[3_del] [07:56:12.485] AudioFilters :: Mix() [07:56:12.485] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [07:56:12.485] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [07:56:12.488] hang.time: 60 [07:56:12.597] Vidbot :: ffmpeg.on( 'start' ) [07:56:12.597] ffmpeg -f lavfi -i color=c=000000:s=640x360:r=30:duration=62.11 -r 30 -i ./tmp/canvas_521354026969_%05d.png -to 00:01:02.109 -i file:///var/www/html/c [07:56:12.597] lients/3493/audio/3CFAF93F-B50A-BE83-552E-B00971B21DF6.mp3 -to 00:01:02.109 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/RF5_Loun [07:56:12.597] ge_Jazz.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=o [07:56:12.597] ut:st=62.11: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 - [07:56:12.597] map [a_out] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/3493/video/3CFAF93F-B50A-B [07:56:12.598] E83-552E-B00971B21DF6.mp4 [07:56:12.731] index :: _onStepProgress_vidbot(), percent: -3344467006 [07:56:13.174] index :: _onStepProgress_vidbot(), percent: 1 [07:56:13.679] index :: _onStepProgress_vidbot(), percent: 5 [07:56:14.685] index :: _onStepProgress_vidbot(), percent: 12 [07:56:15.190] index :: _onStepProgress_vidbot(), percent: 15 [07:56:16.206] index :: _onStepProgress_vidbot(), percent: 22 [07:56:16.713] index :: _onStepProgress_vidbot(), percent: 25 [07:56:17.718] index :: _onStepProgress_vidbot(), percent: 32 [07:56:18.219] index :: _onStepProgress_vidbot(), percent: 35 [07:56:19.225] index :: _onStepProgress_vidbot(), percent: 41 [07:56:19.735] index :: _onStepProgress_vidbot(), percent: 45 [07:56:20.739] index :: _onStepProgress_vidbot(), percent: 51 [07:56:21.243] index :: _onStepProgress_vidbot(), percent: 55 [07:56:22.245] index :: _onStepProgress_vidbot(), percent: 63 [07:56:22.747] index :: _onStepProgress_vidbot(), percent: 67 [07:56:23.251] index :: _onStepProgress_vidbot(), percent: 71 [07:56:23.758] index :: _onStepProgress_vidbot(), percent: 75 [07:56:24.762] index :: _onStepProgress_vidbot(), percent: 83 [07:56:25.263] index :: _onStepProgress_vidbot(), percent: 88 [07:56:25.765] index :: _onStepProgress_vidbot(), percent: 93 [07:56:26.265] index :: _onStepProgress_vidbot(), percent: 97 [07:56:26.521] index :: _onStepProgress_vidbot(), percent: 100 [07:56:26.539] Vidbot :: ffmpeg.on( 'end' ), Done! [07:56:26.540] StreamManager :: dispose() [07:56:26.540] CanvasStream[canvas_521354026969] :: dispose() [07:56:26.545] Vidbot :: fflog.on( 'finish' ) [07:56:26.546] fflog.path: /var/www/html/clients/3493/video/3CFAF93F-B50A-BE83-552E-B00971B21DF6.mp4.fflog [07:56:26.546] Vidbot :: _next(), _stepIndex:4 of 4 [07:56:26.546] index :: _onStepCompleted_vidbot(), step: 4 [07:56:26.546] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 232.595, output: '/var/www/html/clients/3493/video/3CFAF93F-B50A-BE83-552E-B00971B21DF6.mp4', duration: 62.11 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/3493/video/3CFAF93F-B50A-BE83-552E-B00971B21DF6.mp4 Media Duration : 00:01:02.109 Generation Time : 00:03:52.594 ---------------------------------------------------------------------------------------------------------------