--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [17:42:04.064] Vidbot :: start() [17:42:04.065] Vidbot :: _next(), _stepIndex:0 of 4 [17:42:04.065] index :: _onStepStarted_vidbot(), step: 1 [17:42:04.067] Vidbot :: step[0], label:Initializing Core [17:42:04.076] index :: _onStepProgress_vidbot(), percent: 20 [17:42:04.076] Vidbot :: _parse() [17:42:04.077] index :: _onStepProgress_vidbot(), percent: 40 [17:42:04.077] Vidbot :: _validate() [17:42:04.078] index :: _onStepProgress_vidbot(), percent: 60 [17:42:04.078] Vidbot :: _fonts() [17:42:04.079] FabricFontManager :: add(), id: SourceSansPro-Bold [17:42:04.079] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [17:42:04.087] FabricFontManager :: add(), id: SourceSansPro-Light [17:42:04.087] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [17:42:04.088] FabricFontManager :: add(), id: DINOT-Bold [17:42:04.088] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [17:42:04.089] FabricFontManager :: add(), id: DINOT-Light [17:42:04.089] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [17:42:04.090] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [17:42:04.090] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [17:42:04.090] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [17:42:04.091] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [17:42:04.092] index :: _onStepProgress_vidbot(), percent: 80 [17:42:04.092] Vidbot :: _clips() [17:42:04.092] StreamManager :: add(), id:audio_vo, type:audio [17:42:04.093] AudioClip[audio_vo] :: constructor() [17:42:04.093] InputStream[audio_vo] :: constructor() [17:42:04.093] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [17:42:04.096] StreamManager :: add(), id:bg_music, type:audio [17:42:04.096] AudioClip[bg_music] :: constructor() [17:42:04.096] InputStream[bg_music] :: constructor() [17:42:04.096] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [17:42:04.096] StreamManager :: add(), id:mira, type:canvas [17:42:04.096] CanvasStream[canvas_48339963502] :: constructor() [17:42:04.097] InputStream[canvas_48339963502] :: constructor() [17:42:04.172] MiraSlideshow[mira] :: constructor() [17:42:04.172] Mira[mira] :: constructor() [17:42:04.172] Overlay[mira] :: constructor() [17:42:04.172] CanvasClip[mira] :: constructor() [17:42:04.172] Clip[mira] :: constructor() [17:42:04.172] clip:"mira" added to stream:"canvas_48339963502" [17:42:04.173] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_48339963502', clipId: 'mira' } [17:42:04.173] all added... [17:42:04.173] Vidbot :: _next(), _stepIndex:1 of 4 [17:42:04.173] index :: _onStepCompleted_vidbot(), step: 1 [17:42:04.173] index :: _onStepStarted_vidbot(), step: 2 [17:42:04.174] Vidbot :: step[1], label:Initializing Input Streams [17:42:04.174] StreamManager :: init() [17:42:04.174] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [17:42:04.174] index :: _onStepProgress_vidbot(), percent: 33 [17:42:04.175] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [17:42:04.175] index :: _onStepProgress_vidbot(), percent: 67 [17:42:04.175] CanvasStream[canvas_48339963502] :: _init(), BEGIN [17:42:04.175] i:0, c.id:mira [17:42:04.176] MiraSlideshow[mira] :: _init(), BEGIN [17:42:04.176] MiraSlideshow[mira] :: _validate() [17:42:04.178] MiraSlideshow :: _validateSlides() [17:42:04.178] i:0, s.type: title [17:42:04.178] i:1, s.type: info [17:42:04.178] i:2, s.type: image [17:42:04.178] i:3, s.type: image [17:42:04.178] i:4, s.type: image [17:42:04.178] i:5, s.type: image [17:42:04.178] i:6, s.type: image [17:42:04.178] i:7, s.type: image [17:42:04.178] i:8, s.type: image [17:42:04.178] i:9, s.type: image [17:42:04.178] i:10, s.type: image [17:42:04.178] i:11, s.type: image [17:42:04.178] i:12, s.type: image [17:42:04.179] i:13, s.type: image [17:42:04.179] i:14, s.type: image [17:42:04.179] i:15, s.type: image [17:42:04.179] i:16, s.type: image [17:42:04.182] MiraSlideshow[mira] :: _build(), BEGIN [17:42:04.187] MiraTitlecard[titlecard] :: constructor() [17:42:04.187] Mira[titlecard] :: constructor() [17:42:04.187] Overlay[titlecard] :: constructor() [17:42:04.187] CanvasClip[titlecard] :: constructor() [17:42:04.187] Clip[titlecard] :: constructor() [17:42:04.187] MiraTitlecard[titlecard] :: _init() [17:42:04.188] MiraTitlecard[titlecard] :: _validate() [17:42:04.189] MiraTitlecard[titlecard] :: _build() [17:42:04.213] Overlay[titlecard] :: _animate() [17:42:04.215] MiraTitlecard[titlecard] :: _animate() [17:42:04.217] AnimatedImageFrame[aiftitle] :: constructor() [17:42:04.218] AnimatedImageFrame[aiftitle] :: _init(), BEGIN [17:42:04.219] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_1.jpg [17:42:04.272] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.277] AnimatedImageFrame[aiftitle] :: _init(), END [17:42:04.282] MiraInfosheet[info] :: constructor() [17:42:04.282] Mira[info] :: constructor() [17:42:04.282] Overlay[info] :: constructor() [17:42:04.282] CanvasClip[info] :: constructor() [17:42:04.282] Clip[info] :: constructor() [17:42:04.283] MiraInfosheet[info] :: _init() [17:42:04.283] MiraInfosheet[info] :: _validate() [17:42:04.284] MiraInfosheet[info] :: _build() [17:42:04.298] RenOptions[info] :: _animate() [17:42:04.298] Overlay[info] :: _animate() [17:42:04.300] AnimatedImageFrame[info1] :: constructor() [17:42:04.300] AnimatedImageFrame[info2] :: constructor() [17:42:04.300] AnimatedImageFrame[info3] :: constructor() [17:42:04.301] AnimatedImageFrame[info1] :: _init(), BEGIN [17:42:04.301] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_13.jpg [17:42:04.346] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.348] AnimatedImageFrame[info1] :: _init(), END [17:42:04.348] AnimatedImageFrame[info2] :: _init(), BEGIN [17:42:04.348] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_16.jpg [17:42:04.386] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.387] AnimatedImageFrame[info2] :: _init(), END [17:42:04.387] AnimatedImageFrame[info3] :: _init(), BEGIN [17:42:04.387] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_19.jpg [17:42:04.427] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.428] AnimatedImageFrame[info3] :: _init(), END [17:42:04.430] AnimatedImageFrame[image] :: constructor() [17:42:04.430] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.430] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_1.jpg [17:42:04.468] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.469] AnimatedImageFrame[image] :: _init(), END [17:42:04.469] AnimatedImageFrame[image] :: constructor() [17:42:04.470] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.470] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_2.jpg [17:42:04.519] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.521] AnimatedImageFrame[image] :: _init(), END [17:42:04.521] AnimatedImageFrame[image] :: constructor() [17:42:04.521] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.521] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_3.jpg [17:42:04.564] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.565] AnimatedImageFrame[image] :: _init(), END [17:42:04.565] AnimatedImageFrame[image] :: constructor() [17:42:04.566] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.566] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_4.jpg [17:42:04.607] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.608] AnimatedImageFrame[image] :: _init(), END [17:42:04.609] AnimatedImageFrame[image] :: constructor() [17:42:04.609] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.609] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_5.jpg [17:42:04.648] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.649] AnimatedImageFrame[image] :: _init(), END [17:42:04.650] AnimatedImageFrame[image] :: constructor() [17:42:04.650] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.650] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_6.jpg [17:42:04.692] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.693] AnimatedImageFrame[image] :: _init(), END [17:42:04.693] AnimatedImageFrame[image] :: constructor() [17:42:04.693] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.694] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_7.jpg [17:42:04.735] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.736] AnimatedImageFrame[image] :: _init(), END [17:42:04.736] AnimatedImageFrame[image] :: constructor() [17:42:04.736] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.736] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_8.jpg [17:42:04.770] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.771] AnimatedImageFrame[image] :: _init(), END [17:42:04.772] AnimatedImageFrame[image] :: constructor() [17:42:04.772] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.772] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_9.jpg [17:42:04.808] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.809] AnimatedImageFrame[image] :: _init(), END [17:42:04.809] AnimatedImageFrame[image] :: constructor() [17:42:04.809] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.809] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_10.jpg [17:42:04.848] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.849] AnimatedImageFrame[image] :: _init(), END [17:42:04.849] AnimatedImageFrame[image] :: constructor() [17:42:04.849] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.849] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_11.jpg [17:42:04.896] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.897] AnimatedImageFrame[image] :: _init(), END [17:42:04.898] AnimatedImageFrame[image] :: constructor() [17:42:04.898] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.898] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_12.jpg [17:42:04.935] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.936] AnimatedImageFrame[image] :: _init(), END [17:42:04.937] AnimatedImageFrame[image] :: constructor() [17:42:04.937] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.937] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_13.jpg [17:42:04.969] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:04.970] AnimatedImageFrame[image] :: _init(), END [17:42:04.971] AnimatedImageFrame[image] :: constructor() [17:42:04.971] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:04.971] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_14.jpg [17:42:05.003] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:05.004] AnimatedImageFrame[image] :: _init(), END [17:42:05.004] AnimatedImageFrame[image] :: constructor() [17:42:05.004] AnimatedImageFrame[image] :: _init(), BEGIN [17:42:05.005] CanvasClip :: LoadImageWithPromise(), src: 2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56_15.jpg [17:42:05.043] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [17:42:05.044] AnimatedImageFrame[image] :: _init(), END [17:42:05.045] MiraSlideshow[mira] :: _build(), END [17:42:05.045] Overlay[mira] :: _animate() [17:42:05.045] MiraSlideshow[mira] :: _init(), END [17:42:05.046] CanvasStream[mira] :: _init(), p.then() [17:42:05.046] CanvasStream[canvas_48339963502] :: _init(), promise.all.then() [17:42:05.047] CanvasStream[canvas_48339963502] :: _init(), END [17:42:05.047] StreamMangaer :: init(), stream[canvas_48339963502].then() [17:42:05.047] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_48339963502', progress: 1 } [17:42:05.048] index :: _onStepProgress_vidbot(), percent: 100 [17:42:05.048] StreamManager :: init(), promise.all.then... [17:42:05.048] Vidbot :: StreamMgr.on( 'INITED' ) [17:42:05.048] Vidbot :: _next(), _stepIndex:2 of 4 [17:42:05.048] index :: _onStepCompleted_vidbot(), step: 2 [17:42:05.048] index :: _onStepStarted_vidbot(), step: 3 [17:42:05.048] Vidbot :: step[2], label:Rendering Canvas Streams [17:42:05.049] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [17:42:05.049] StreamManager :: render() [17:42:05.049] CanvasStream[canvas_48339963502] :: render() [17:42:05.110] index :: _onStepProgress_vidbot(), percent: 0 [17:42:33.966] index :: _onStepProgress_vidbot(), percent: 5 [17:42:58.036] index :: _onStepProgress_vidbot(), percent: 10 [17:43:31.394] index :: _onStepProgress_vidbot(), percent: 15 [17:44:08.457] index :: _onStepProgress_vidbot(), percent: 20 [17:44:55.813] index :: _onStepProgress_vidbot(), percent: 25 [17:45:41.553] index :: _onStepProgress_vidbot(), percent: 30 [17:46:28.527] index :: _onStepProgress_vidbot(), percent: 35 [17:47:16.140] index :: _onStepProgress_vidbot(), percent: 40 [17:47:57.878] index :: _onStepProgress_vidbot(), percent: 45 [17:48:34.329] index :: _onStepProgress_vidbot(), percent: 50 [17:49:15.381] index :: _onStepProgress_vidbot(), percent: 55 [17:49:58.552] index :: _onStepProgress_vidbot(), percent: 60 [17:50:43.388] index :: _onStepProgress_vidbot(), percent: 65 [17:51:28.498] index :: _onStepProgress_vidbot(), percent: 70 [17:52:13.649] index :: _onStepProgress_vidbot(), percent: 75 [17:52:58.578] index :: _onStepProgress_vidbot(), percent: 80 [17:53:44.559] index :: _onStepProgress_vidbot(), percent: 85 [17:54:30.474] index :: _onStepProgress_vidbot(), percent: 90 [17:55:12.440] index :: _onStepProgress_vidbot(), percent: 95 [17:55:50.480] index :: _onStepProgress_vidbot(), percent: 100 [17:55:54.112] StreamManager :: render(), Promise.all.then... [17:55:54.112] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [17:55:54.112] Vidbot :: _next(), _stepIndex:3 of 4 [17:55:54.112] index :: _onStepCompleted_vidbot(), step: 3 [17:55:54.113] index :: _onStepStarted_vidbot(), step: 4 [17:55:54.114] Vidbot :: step[3], label:Encoding Media [17:55:54.116] CanvasFilters :: Overlay() [17:55:54.116] AudioStream[audio_vo] :: inputOptions() [17:55:54.117] AudioFilters :: Volume() [17:55:54.117] filter: [2:a]volume=1[2_vol] [17:55:54.117] AudioFilters :: Delay() [17:55:54.117] filter: [2_vol]adelay=0|0[2_del] [17:55:54.117] AudioStream[bg_music] :: inputOptions() [17:55:54.117] AudioFilters :: Volume() [17:55:54.117] filter: [3:a]volume=0.15[3_vol] [17:55:54.117] AudioFilters :: FadeOut() [17:55:54.117] filter: [3_vol]afade=t=out:st=60:d=1[3_fadeout] [17:55:54.118] AudioFilters :: Delay() [17:55:54.118] filter: [3_fadeout]adelay=0|0[3_del] [17:55:54.118] AudioFilters :: Mix() [17:55:54.118] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [17:55:54.118] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [17:55:54.120] hang.time: 60 [17:55:54.248] Vidbot :: ffmpeg.on( 'start' ) [17:55:54.248] ffmpeg -f lavfi -i color=c=000000:s=960x540:r=30:duration=60 -r 30 -i ./tmp/canvas_48339963502_%05d.png -to 00:01:00.000 -i file:///var/www/html/clien [17:55:54.249] ts/21967/audio/2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56.mp3 -to 00:01:00.000 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/bgmusic.mp3 [17:55:54.249] -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.15[3_vol];[3_vol]afade=t=out:st=60:d= [17:55:54.249] 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 [a_out] -m [17:55:54.249] ap [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/21967/video/2634D6F6-7B3F-82D4-FF4F-1E2A [17:55:54.249] 12DC6D56.mp4 [17:55:54.501] index :: _onStepProgress_vidbot(), percent: -3462080762 [17:55:54.878] index :: _onStepProgress_vidbot(), percent: 1 [17:55:56.394] index :: _onStepProgress_vidbot(), percent: 7 [17:55:57.449] index :: _onStepProgress_vidbot(), percent: 10 [17:55:58.960] index :: _onStepProgress_vidbot(), percent: 15 [17:56:00.477] index :: _onStepProgress_vidbot(), percent: 20 [17:56:02.004] index :: _onStepProgress_vidbot(), percent: 26 [17:56:03.522] index :: _onStepProgress_vidbot(), percent: 31 [17:56:04.532] index :: _onStepProgress_vidbot(), percent: 35 [17:56:06.060] index :: _onStepProgress_vidbot(), percent: 41 [17:56:07.071] index :: _onStepProgress_vidbot(), percent: 45 [17:56:08.091] index :: _onStepProgress_vidbot(), percent: 50 [17:56:09.102] index :: _onStepProgress_vidbot(), percent: 55 [17:56:10.117] index :: _onStepProgress_vidbot(), percent: 61 [17:56:11.123] index :: _onStepProgress_vidbot(), percent: 66 [17:56:12.150] index :: _onStepProgress_vidbot(), percent: 71 [17:56:13.156] index :: _onStepProgress_vidbot(), percent: 76 [17:56:14.172] index :: _onStepProgress_vidbot(), percent: 81 [17:56:15.183] index :: _onStepProgress_vidbot(), percent: 86 [17:56:16.214] index :: _onStepProgress_vidbot(), percent: 91 [17:56:17.218] index :: _onStepProgress_vidbot(), percent: 95 [17:56:18.521] index :: _onStepProgress_vidbot(), percent: 100 [17:56:18.578] Vidbot :: ffmpeg.on( 'end' ), Done! [17:56:18.578] StreamManager :: dispose() [17:56:18.579] CanvasStream[canvas_48339963502] :: dispose() [17:56:18.583] Vidbot :: fflog.on( 'finish' ) [17:56:18.584] fflog.path: /var/www/html/clients/21967/video/2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56.mp4.fflog [17:56:18.584] Vidbot :: _next(), _stepIndex:4 of 4 [17:56:18.584] index :: _onStepCompleted_vidbot(), step: 4 [17:56:18.584] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 854.538, output: '/var/www/html/clients/21967/video/2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56.mp4', duration: 60 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/21967/video/2634D6F6-7B3F-82D4-FF4F-1E2A12DC6D56.mp4 Media Duration : 00:01:00.000 Generation Time : 00:14:14.538 ---------------------------------------------------------------------------------------------------------------