--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [02:02:51.133] Vidbot :: start() [02:02:51.133] Vidbot :: _next(), _stepIndex:0 of 4 [02:02:51.134] index :: _onStepStarted_vidbot(), step: 1 [02:02:51.135] Vidbot :: step[0], label:Initializing Core [02:02:51.144] index :: _onStepProgress_vidbot(), percent: 20 [02:02:51.145] Vidbot :: _parse() [02:02:51.146] index :: _onStepProgress_vidbot(), percent: 40 [02:02:51.146] Vidbot :: _validate() [02:02:51.147] index :: _onStepProgress_vidbot(), percent: 60 [02:02:51.147] Vidbot :: _fonts() [02:02:51.148] FabricFontManager :: add(), id: SourceSansPro-Bold [02:02:51.148] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [02:02:51.156] FabricFontManager :: add(), id: SourceSansPro-Light [02:02:51.157] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [02:02:51.157] FabricFontManager :: add(), id: DINOT-Bold [02:02:51.158] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [02:02:51.158] FabricFontManager :: add(), id: DINOT-Light [02:02:51.158] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [02:02:51.159] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [02:02:51.159] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [02:02:51.160] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [02:02:51.160] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [02:02:51.161] index :: _onStepProgress_vidbot(), percent: 80 [02:02:51.161] Vidbot :: _clips() [02:02:51.162] StreamManager :: add(), id:audio_vo, type:audio [02:02:51.162] AudioClip[audio_vo] :: constructor() [02:02:51.162] InputStream[audio_vo] :: constructor() [02:02:51.163] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [02:02:51.165] StreamManager :: add(), id:bg_music, type:audio [02:02:51.165] AudioClip[bg_music] :: constructor() [02:02:51.165] InputStream[bg_music] :: constructor() [02:02:51.166] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [02:02:51.166] StreamManager :: add(), id:simplefadedisplay, type:canvas [02:02:51.166] CanvasStream[canvas_1631706876809] :: constructor() [02:02:51.166] InputStream[canvas_1631706876809] :: constructor() [02:02:51.243] KenBurnsSlideshow[simplefadedisplay] :: constructor() [02:02:51.244] Overlay[simplefadedisplay] :: constructor() [02:02:51.244] CanvasClip[simplefadedisplay] :: constructor() [02:02:51.244] Clip[simplefadedisplay] :: constructor() [02:02:51.244] clip:"simplefadedisplay" added to stream:"canvas_1631706876809" [02:02:51.244] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1631706876809', clipId: 'simplefadedisplay' } [02:02:51.244] StreamManager :: add(), id:infosheet, type:canvas [02:02:51.245] RenInfosheet[infosheet] :: constructor() [02:02:51.245] Ren[infosheet] :: constructor() [02:02:51.245] Overlay[infosheet] :: constructor() [02:02:51.245] CanvasClip[infosheet] :: constructor() [02:02:51.245] Clip[infosheet] :: constructor() [02:02:51.245] clip:"infosheet" added to stream:"canvas_1631706876809" [02:02:51.245] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1631706876809', clipId: 'infosheet' } [02:02:51.245] StreamManager :: add(), id:caption, type:canvas [02:02:51.245] RenCaption[caption] :: constructor() [02:02:51.246] Ren[caption] :: constructor() [02:02:51.246] Overlay[caption] :: constructor() [02:02:51.246] CanvasClip[caption] :: constructor() [02:02:51.246] Clip[caption] :: constructor() [02:02:51.246] clip:"caption" added to stream:"canvas_1631706876809" [02:02:51.246] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1631706876809', clipId: 'caption' } [02:02:51.246] StreamManager :: add(), id:odometer, type:canvas [02:02:51.246] RenOdometer[odometer] :: constructor() [02:02:51.246] Ren[odometer] :: constructor() [02:02:51.246] Overlay[odometer] :: constructor() [02:02:51.246] CanvasClip[odometer] :: constructor() [02:02:51.246] Clip[odometer] :: constructor() [02:02:51.246] clip:"odometer" added to stream:"canvas_1631706876809" [02:02:51.247] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1631706876809', clipId: 'odometer' } [02:02:51.247] all added... [02:02:51.247] Vidbot :: _next(), _stepIndex:1 of 4 [02:02:51.247] index :: _onStepCompleted_vidbot(), step: 1 [02:02:51.247] index :: _onStepStarted_vidbot(), step: 2 [02:02:51.247] Vidbot :: step[1], label:Initializing Input Streams [02:02:51.248] StreamManager :: init() [02:02:51.248] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [02:02:51.248] index :: _onStepProgress_vidbot(), percent: 33 [02:02:51.248] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [02:02:51.249] index :: _onStepProgress_vidbot(), percent: 67 [02:02:51.249] CanvasStream[canvas_1631706876809] :: _init(), BEGIN [02:02:51.249] i:0, c.id:simplefadedisplay [02:02:51.249] KenBurnsSlideshow[simplefadedisplay] :: _init(), BEGIN [02:02:51.250] KenBurnsSlideshow[simplefadedisplay] :: _validate() [02:02:51.250] KenBurnsSlideshow[undefined] :: _validateAnim() [02:02:51.251] KenBurnsSlideshow[undefined] :: _validateTheme() [02:02:51.252] i:1, c.id:infosheet [02:02:51.252] RenInfosheet[infosheet] :: _init() [02:02:51.252] RenInfosheet[infosheet] :: _validate() [02:02:51.253] i:2, c.id:caption [02:02:51.253] RenCaption[caption] :: _init() [02:02:51.254] RenCaption[caption] :: _validate() [02:02:51.254] i:3, c.id:odometer [02:02:51.254] RenOdometer[odometer] :: _init() [02:02:51.255] RenOdometer[odometer] :: _validate() [02:02:51.255] KenBurnsSlideshow[simplefadedisplay] :: _build() [02:02:51.261] AnimatedImageFrame[aif] :: constructor() [02:02:51.262] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.262] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_1.jpg [02:02:51.274] RenInfosheet[infosheet] :: _assets() [02:02:51.275] CanvasClip :: LoadSVGFromStringWithPromise() [02:02:51.295] CanvasClip :: LoadSVGFromString(), loaded [02:02:51.296] RenCaption[caption] :: _build() [02:02:51.316] RenInfosheet[odometer] :: _assets() [02:02:51.316] CanvasClip :: LoadSVGFromStringWithPromise() [02:02:51.333] CanvasClip :: LoadSVGFromString(), loaded [02:02:51.336] Overlay[caption] :: _animate() [02:02:51.339] RenInfosheet[infosheet] :: _build() [02:02:51.367] RenOdometer[odometer] :: _build() [02:02:51.374] Overlay[infosheet] :: _animate() [02:02:51.375] CanvasStream[caption] :: _init(), p.then() [02:02:51.375] Overlay[odometer] :: _animate() [02:02:51.376] CanvasStream[infosheet] :: _init(), p.then() [02:02:51.376] CanvasStream[odometer] :: _init(), p.then() [02:02:51.401] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.405] AnimatedImageFrame[aif] :: _init(), END [02:02:51.406] AnimatedImageFrame[aif] :: constructor() [02:02:51.407] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.407] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_2.jpg [02:02:51.425] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.426] AnimatedImageFrame[aif] :: _init(), END [02:02:51.427] AnimatedImageFrame[aif] :: constructor() [02:02:51.427] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.427] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_3.jpg [02:02:51.444] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.446] AnimatedImageFrame[aif] :: _init(), END [02:02:51.446] AnimatedImageFrame[aif] :: constructor() [02:02:51.446] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.446] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_4.jpg [02:02:51.463] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.464] AnimatedImageFrame[aif] :: _init(), END [02:02:51.465] AnimatedImageFrame[aif] :: constructor() [02:02:51.465] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.465] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_5.jpg [02:02:51.482] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.483] AnimatedImageFrame[aif] :: _init(), END [02:02:51.484] AnimatedImageFrame[aif] :: constructor() [02:02:51.484] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.484] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_6.jpg [02:02:51.500] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.502] AnimatedImageFrame[aif] :: _init(), END [02:02:51.502] AnimatedImageFrame[aif] :: constructor() [02:02:51.502] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.502] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_7.jpg [02:02:51.519] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.520] AnimatedImageFrame[aif] :: _init(), END [02:02:51.520] AnimatedImageFrame[aif] :: constructor() [02:02:51.520] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.521] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_8.jpg [02:02:51.537] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.538] AnimatedImageFrame[aif] :: _init(), END [02:02:51.539] AnimatedImageFrame[aif] :: constructor() [02:02:51.539] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.539] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_9.jpg [02:02:51.558] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.559] AnimatedImageFrame[aif] :: _init(), END [02:02:51.559] AnimatedImageFrame[aif] :: constructor() [02:02:51.560] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.560] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_10.jpg [02:02:51.578] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.579] AnimatedImageFrame[aif] :: _init(), END [02:02:51.580] AnimatedImageFrame[aif] :: constructor() [02:02:51.580] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.580] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_11.jpg [02:02:51.598] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.599] AnimatedImageFrame[aif] :: _init(), END [02:02:51.600] AnimatedImageFrame[aif] :: constructor() [02:02:51.600] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.600] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_12.jpg [02:02:51.619] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.620] AnimatedImageFrame[aif] :: _init(), END [02:02:51.620] AnimatedImageFrame[aif] :: constructor() [02:02:51.620] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.620] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_13.jpg [02:02:51.640] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.641] AnimatedImageFrame[aif] :: _init(), END [02:02:51.641] AnimatedImageFrame[aif] :: constructor() [02:02:51.642] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.642] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_14.jpg [02:02:51.661] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.662] AnimatedImageFrame[aif] :: _init(), END [02:02:51.662] AnimatedImageFrame[aif] :: constructor() [02:02:51.663] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.663] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_15.jpg [02:02:51.686] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.687] AnimatedImageFrame[aif] :: _init(), END [02:02:51.688] AnimatedImageFrame[aif] :: constructor() [02:02:51.688] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.688] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_16.jpg [02:02:51.707] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.709] AnimatedImageFrame[aif] :: _init(), END [02:02:51.709] AnimatedImageFrame[aif] :: constructor() [02:02:51.709] AnimatedImageFrame[aif] :: _init(), BEGIN [02:02:51.709] CanvasClip :: LoadImageWithPromise(), src: 821087B1-3C37-9739-313B-751028523498_17.jpg [02:02:51.731] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [02:02:51.732] AnimatedImageFrame[aif] :: _init(), END [02:02:51.733] Overlay[simplefadedisplay] :: _animate() [02:02:51.733] KenBurnsSlideshow[simplefadedisplay] :: _init(), END [02:02:51.733] CanvasStream[simplefadedisplay] :: _init(), p.then() [02:02:51.734] CanvasStream[canvas_1631706876809] :: _init(), promise.all.then() [02:02:51.736] CanvasStream[canvas_1631706876809] :: _init(), END [02:02:51.736] StreamMangaer :: init(), stream[canvas_1631706876809].then() [02:02:51.736] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_1631706876809', progress: 1 } [02:02:51.737] index :: _onStepProgress_vidbot(), percent: 100 [02:02:51.737] StreamManager :: init(), promise.all.then... [02:02:51.737] Vidbot :: StreamMgr.on( 'INITED' ) [02:02:51.737] Vidbot :: _next(), _stepIndex:2 of 4 [02:02:51.737] index :: _onStepCompleted_vidbot(), step: 2 [02:02:51.737] index :: _onStepStarted_vidbot(), step: 3 [02:02:51.737] Vidbot :: step[2], label:Rendering Canvas Streams [02:02:51.738] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [02:02:51.738] StreamManager :: render() [02:02:51.738] CanvasStream[canvas_1631706876809] :: render() [02:02:51.769] index :: _onStepProgress_vidbot(), percent: 0 [02:03:01.423] index :: _onStepProgress_vidbot(), percent: 5 [02:03:15.995] index :: _onStepProgress_vidbot(), percent: 10 [02:03:29.400] index :: _onStepProgress_vidbot(), percent: 15 [02:03:42.010] index :: _onStepProgress_vidbot(), percent: 20 [02:03:53.608] index :: _onStepProgress_vidbot(), percent: 25 [02:04:06.243] index :: _onStepProgress_vidbot(), percent: 30 [02:04:19.753] index :: _onStepProgress_vidbot(), percent: 35 [02:04:33.523] index :: _onStepProgress_vidbot(), percent: 40 [02:04:46.595] index :: _onStepProgress_vidbot(), percent: 45 [02:05:01.934] index :: _onStepProgress_vidbot(), percent: 50 [02:05:19.322] index :: _onStepProgress_vidbot(), percent: 55 [02:05:35.886] index :: _onStepProgress_vidbot(), percent: 60 [02:05:50.948] index :: _onStepProgress_vidbot(), percent: 65 [02:06:06.287] index :: _onStepProgress_vidbot(), percent: 70 [02:06:20.714] index :: _onStepProgress_vidbot(), percent: 75 [02:06:35.277] index :: _onStepProgress_vidbot(), percent: 80 [02:06:49.288] index :: _onStepProgress_vidbot(), percent: 85 [02:07:02.713] index :: _onStepProgress_vidbot(), percent: 90 [02:07:17.215] index :: _onStepProgress_vidbot(), percent: 95 [02:07:30.494] index :: _onStepProgress_vidbot(), percent: 100 [02:07:31.628] StreamManager :: render(), Promise.all.then... [02:07:31.628] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [02:07:31.629] Vidbot :: _next(), _stepIndex:3 of 4 [02:07:31.629] index :: _onStepCompleted_vidbot(), step: 3 [02:07:31.629] index :: _onStepStarted_vidbot(), step: 4 [02:07:31.630] Vidbot :: step[3], label:Encoding Media [02:07:31.633] CanvasFilters :: Overlay() [02:07:31.633] AudioStream[audio_vo] :: inputOptions() [02:07:31.634] AudioFilters :: Volume() [02:07:31.634] filter: [2:a]volume=1[2_vol] [02:07:31.634] AudioFilters :: Delay() [02:07:31.634] filter: [2_vol]adelay=0|0[2_del] [02:07:31.634] AudioStream[bg_music] :: inputOptions() [02:07:31.634] AudioFilters :: Volume() [02:07:31.634] filter: [3:a]volume=0.15[3_vol] [02:07:31.634] AudioFilters :: FadeOut() [02:07:31.635] filter: [3_vol]afade=t=out:st=51:d=1[3_fadeout] [02:07:31.635] AudioFilters :: Delay() [02:07:31.635] filter: [3_fadeout]adelay=0|0[3_del] [02:07:31.635] AudioFilters :: Mix() [02:07:31.635] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [02:07:31.635] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [02:07:31.637] hang.time: 60 [02:07:31.730] Vidbot :: ffmpeg.on( 'start' ) [02:07:31.731] ffmpeg -f lavfi -i color=c=000000:s=640x360:r=30:duration=51 -r 30 -i ./tmp/canvas_1631706876809_%05d.png -to 00:00:51.000 -i file:///var/www/html/cli [02:07:31.731] ents/21285/audio/821087B1-3C37-9739-313B-751028523498.mp3 -to 00:00:51.000 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/Concept11 [02:07:31.731] .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.15[3_vol];[3_vol]afade=t=out:st=5 [02:07:31.731] 1: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 [a_out [02:07:31.731] ] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/21285/video/821087B1-3C37-9739-313B- [02:07:31.731] 751028523498.mp4 [02:07:31.870] index :: _onStepProgress_vidbot(), percent: -4073036191 [02:07:32.312] index :: _onStepProgress_vidbot(), percent: 2 [02:07:32.814] index :: _onStepProgress_vidbot(), percent: 5 [02:07:33.317] index :: _onStepProgress_vidbot(), percent: 10 [02:07:34.324] index :: _onStepProgress_vidbot(), percent: 20 [02:07:35.328] index :: _onStepProgress_vidbot(), percent: 29 [02:07:35.850] index :: _onStepProgress_vidbot(), percent: 33 [02:07:36.350] index :: _onStepProgress_vidbot(), percent: 37 [02:07:36.858] index :: _onStepProgress_vidbot(), percent: 42 [02:07:37.359] index :: _onStepProgress_vidbot(), percent: 47 [02:07:37.861] index :: _onStepProgress_vidbot(), percent: 51 [02:07:38.875] index :: _onStepProgress_vidbot(), percent: 56 [02:07:39.880] index :: _onStepProgress_vidbot(), percent: 61 [02:07:40.896] index :: _onStepProgress_vidbot(), percent: 66 [02:07:41.913] index :: _onStepProgress_vidbot(), percent: 71 [02:07:42.927] index :: _onStepProgress_vidbot(), percent: 77 [02:07:43.941] index :: _onStepProgress_vidbot(), percent: 82 [02:07:44.453] index :: _onStepProgress_vidbot(), percent: 85 [02:07:45.466] index :: _onStepProgress_vidbot(), percent: 90 [02:07:46.467] index :: _onStepProgress_vidbot(), percent: 96 [02:07:47.238] index :: _onStepProgress_vidbot(), percent: 100 [02:07:47.270] Vidbot :: ffmpeg.on( 'end' ), Done! [02:07:47.271] StreamManager :: dispose() [02:07:47.271] CanvasStream[canvas_1631706876809] :: dispose() [02:07:47.279] Vidbot :: fflog.on( 'finish' ) [02:07:47.279] fflog.path: /var/www/html/clients/21285/video/821087B1-3C37-9739-313B-751028523498.mp4.fflog [02:07:47.279] Vidbot :: _next(), _stepIndex:4 of 4 [02:07:47.279] index :: _onStepCompleted_vidbot(), step: 4 [02:07:47.279] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 296.166, output: '/var/www/html/clients/21285/video/821087B1-3C37-9739-313B-751028523498.mp4', duration: 51 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/21285/video/821087B1-3C37-9739-313B-751028523498.mp4 Media Duration : 00:00:51.000 Generation Time : 00:04:56.165 ---------------------------------------------------------------------------------------------------------------