1(function($) { 2 var formatTimeHM = function (seconds) { 3 const hrs = Math.floor(seconds / 3600); 4 const mins = Math.floor((seconds % 3600) / 60); 5 const secs = Math.floor(seconds % 60); 6 7 if (hrs > 0) { 8 return `${hrs}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; 9 } else { 10 return `${mins}:${secs.toString().padStart(2, '0')}`; 11 } 12 } 13 14 var handleSlidePlayer = function($scope, player_selector) { 15 $scope.find(player_selector).each(function() { 16 17 var item_hover_color = $(this).data("entryhbgcolor"); 18 $(this).find('.swp_music_player_entry.wpb_smc_elt').each(function(){ 19 $(this).hover( 20 function() { 21 $(this).css("background-color", item_hover_color); 22 }, function() { 23 $(this).css("background-color", "transparent"); 24 } 25 ); 26 }); 27 28 var $player = $(this); 29 var player_id = $player.attr("id"); 30 var $play_btn = $player.find('.fa-play.player_play'); 31 var $pause_btn = $player.find('.fa-pause.player_pause'); 32 var $fwd_btn = $player.find('.fa-step-forward'); 33 var $bkw_btn = $player.find('.fa-step-backward'); 34 var $first_song = $player.find('.swp_music_player_entry').first(); 35 var $last_song = $player.find('.swp_music_player_entry').last(); 36 var $playing_song_name = $player.find('.current_song_name'); 37 var $playing_album_name = $player.find('.current_album_name'); 38 var $time_slider = $player.find('.player_time_slider'); 39 var $song_duration = $player.find('.song_duration'); 40 var $song_current_progress = $player.find('.song_current_progress'); 41 var autoplay = $player.data('autoplay'); 42 var playmode = $player.data('playmode'); 43 var stop_on_playlist_end = $player.data('stopplaylistend'); 44 var stop_on_song_end = $player.data('stopsongend'); 45 var play_from_start = $player.data('pfs'); 46 var repeatmode = $player.data("repeatmode"); 47 var shuffle_btn_on = false, repeat_btn_on = false; 48 var $ps_elt = $player.find('.compact-playback-speed'); 49 var $ps_val = $ps_elt.find('.ps-val'); 50 var $ps_opts = $player.find('ul.compact-ps-opts'); 51 var other_mpfe = new Array(); 52 53 54 $('.swp_music_player').not('#' + player_id).each(function(){ 55 other_mpfe.push($(this).attr('id')); 56 }); 57 58 $ps_val.on('click', function(){ 59 $ps_opts.toggle(); 60 }) 61 $('.compact-ps-opt').on('click', function(){ 62 var new_pstext = $(this).text(); 63 var new_psval = new_pstext.substring(0,new_pstext.length - 1) 64 $ps_opts.toggle(); 65 $ps_val.text(new_pstext); 66 $player.find('audio').each(function() { 67 $(this).get(0).playbackRate = new_psval; 68 }); 69 }) 70 71 function resetAudioTime(audioElement) { 72 if (!audioElement || !audioElement.src) { 73 return; 74 } 75 76 if (!audioElement.paused) { 77 audioElement.pause(); 78 } 79 if (play_from_start === "yes") { 80 audioElement.currentTime = 0; 81 } 82 } 83 84 function handleCoverImg($crt_elt) { 85 if(!$player.data('playerimg')) { 86 return; 87 } 88 89 if (!$crt_elt.data('trackimg')) { 90 /*set the album default img*/ 91 $player.find('.music_player_left').removeAttr("style"); 92 return; 93 } 94 95 /*song individual cover*/ 96 $player.find('.music_player_left').css('background-image', 'url(' + $crt_elt.data('trackimg') + ')'); 97 } 98 99 function handleAlbumInfoForCompact($crt_elt) { 100 if (!$player.hasClass('compact-player')) { 101 return; 102 } 103 104 $playing_album_name.text($crt_elt.find('.player_song_name').data('albumname')); 105 } 106 107 function stopOtherPlayers() { 108 other_mpfe.forEach(function(mpfe_player_id){ 109 var $crt_play = $('#' + mpfe_player_id).find('.swp_music_player_entry.now_playing'); 110 if ($crt_play.length){ 111 $crt_play.find('audio').get(0).pause(); 112 $('#' + mpfe_player_id).find('.fa-play.player_play').removeClass("display_none"); 113 $('#' + mpfe_player_id).find('.fa-pause').addClass("display_none"); 114 } 115 }); 116 } 117 118 $player.find('.swp_music_player_entry').each(function(){ 119 var $player_entry = $(this); 120 var audio = new Audio($player_entry.data("mediafile")); 121 audio.type= 'audio/mpeg'; 122 audio.preload = 'metadata'; 123 $(this).append(audio); 124 125 126 audio.onloadedmetadata = function() { 127 $player_entry.find('.entry_duration').text(formatTimeHM(audio.duration)); 128 if ($first_song.is($player_entry)) { 129 $song_duration.text(formatTimeHM(audio.duration)); 130 } 131 }; 132 133 audio.onended = function() { 134 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 135 var $next_elt = get_next_player_elt($crt_elt); 136 137 $playing_song_name.text($next_elt.find('.player_song_name').text()); 138 $song_duration.text(formatTimeHM($next_elt.find('audio').get(0).duration)); 139 $crt_elt.removeClass('now_playing'); 140 $next_elt.addClass('now_playing'); 141 142 if ("yes" == stop_on_song_end) { 143 $play_btn.removeClass("display_none"); 144 $pause_btn.addClass("display_none"); 145 146 return; 147 } 148 149 /*on repeat current song and repeat active, bypass stop when playlist ends*/ 150 if (!(("current_song" == repeatmode) && repeat_btn_on)) { 151 /*stop when playlist ends*/ 152 if (("yes" == stop_on_playlist_end) && (!$crt_elt.next().length)) { 153 $play_btn.removeClass("display_none"); 154 $pause_btn.addClass("display_none"); 155 156 return; 157 } 158 } 159 160 resetAudioTime($next_elt.find('audio').get(0)); 161 $next_elt.find('audio').get(0).play(); 162 $next_elt.addClass('mpfe_already_played'); 163 stopOtherPlayers(); 164 handleCoverImg($next_elt); 165 handleAlbumInfoForCompact($next_elt); 166 $play_btn.addClass("display_none"); 167 $pause_btn.removeClass("display_none"); 168 }; 169 170 audio.addEventListener("timeupdate", function() { 171 var currentTime = audio.currentTime; 172 var duration = audio.duration; 173 $time_slider.stop(true,true).css('width', (currentTime +.25)/duration*100+'%'); 174 $song_current_progress.text(formatTimeHM(currentTime)); 175 }); 176 }); 177 178 /*load the 1st song*/ 179 $first_song.addClass("now_playing"); 180 $playing_song_name.text($first_song.find('.player_song_name').text()); 181 handleAlbumInfoForCompact($first_song); 182 183 $song_current_progress.text("0:00"); 184 if ("yes" == autoplay) { 185 var fp_response = $first_song.find('audio').get(0).play(); 186 handleCoverImg($first_song); 187 if (fp_response!== undefined) { 188 fp_response.then(_ => { 189 $play_btn.toggleClass("display_none"); 190 $pause_btn.toggleClass("display_none"); 191 $first_song.addClass('mpfe_already_played'); 192 stopOtherPlayers(); 193 }).catch(error => { 194 $(document).on('click', function(e) { 195 if (!$first_song.hasClass("autoplay_loaded")) { 196 $first_song.find('audio').get(0).play(); 197 $first_song.addClass('mpfe_already_played'); 198 $play_btn.toggleClass("display_none"); 199 $pause_btn.toggleClass("display_none"); 200 $first_song.addClass("autoplay_loaded"); 201 } 202 }); 203 }); 204 } 205 } 206 207 $play_btn.off('click').on('click', function() { 208 stopOtherPlayers(); 209 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 210 $crt_elt.find('audio').get(0).play(); 211 $crt_elt.addClass('mpfe_already_played'); 212 213 stopOtherPlayers(); 214 handleCoverImg($crt_elt); 215 handleAlbumInfoForCompact($crt_elt); 216 $play_btn.addClass("display_none"); 217 $pause_btn.removeClass("display_none"); 218 toggleCompactPlaylistUnderPlayPause($player, 'play'); 219 }); 220 $pause_btn.off('click').on('click', function() { 221 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 222 $crt_elt.find('audio').get(0).pause(); 223 $play_btn.removeClass("display_none"); 224 $pause_btn.addClass("display_none"); 225 toggleCompactPlaylistUnderPlayPause($player, 'pause'); 226 }); 227 228 $fwd_btn.off('click').on('click', function() { 229 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 230 $crt_elt.find('audio').get(0).pause(); 231 232 var $next_elt = get_next_player_elt($crt_elt); 233 234 $playing_song_name.text($next_elt.find('.player_song_name').text()); 235 $next_elt.find('audio').get(0).currentTime = 0; 236 $next_elt.find('audio').get(0).play(); 237 $next_elt.addClass('mpfe_already_played'); 238 stopOtherPlayers(); 239 handleCoverImg($next_elt); 240 handleAlbumInfoForCompact($next_elt); 241 $song_duration.text(formatTimeHM($next_elt.find('audio').get(0).duration)); 242 $crt_elt.removeClass('now_playing'); 243 $next_elt.addClass('now_playing'); 244 $play_btn.addClass("display_none"); 245 $pause_btn.removeClass("display_none"); 246 toggleCompactPlaylistCrtNext($player, $crt_elt, $next_elt); 247 }); 248 249 $bkw_btn.off('click').on('click', function() { 250 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 251 $crt_elt.find('audio').get(0).pause(); 252 var $prev_elt = $crt_elt.prev(); 253 if (!$prev_elt.length) { 254 $prev_elt = $last_song; 255 } 256 $playing_song_name.text($prev_elt.find('.player_song_name').text()); 257 resetAudioTime($prev_elt.find('audio').get(0)); 258 $prev_elt.find('audio').get(0).play(); 259 $prev_elt.addClass('mpfe_already_played'); 260 stopOtherPlayers(); 261 handleCoverImg($prev_elt); 262 handleAlbumInfoForCompact($prev_elt); 263 $song_duration.text(formatTimeHM($prev_elt.find('audio').get(0).duration)); 264 $crt_elt.removeClass('now_playing'); 265 $prev_elt.addClass('now_playing'); 266 $play_btn.addClass("display_none"); 267 $pause_btn.removeClass("display_none"); 268 toggleCompactPlaylistCrtNext($player, $crt_elt, $prev_elt); 269 }); 270 271 $player.find('.player_entry_left').on('click', function(){ 272 var $next_elt = $(this).parent(); 273 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 274 275 /*alow play pause from the playlist for compact player with under playlist*/ 276 if ($(this).hasClass('compact_player_entry_left')) { 277 var $play_small_btn = $(this).find('.compact_bs_play'); 278 var $pause_small_btn = $(this).find('.compact_bs_pause'); 279 var crt_time = $crt_elt.find('audio').get(0).currentTime; 280 281 /*check if we need to pause*/ 282 if ($next_elt.is($crt_elt) && (0 != crt_time)) { 283 if ($crt_elt.hasClass('now_paused')) { 284 /*continue playing if was paused*/ 285 $crt_elt.find('audio').get(0).play(); 286 $crt_elt.removeClass('now_paused'); 287 288 showPauseHidePlay($play_small_btn, $pause_small_btn); 289 showPauseHidePlay($play_btn, $pause_btn); 290 } else { 291 /*pause song*/ 292 $crt_elt.find('audio').get(0).pause(); 293 294 showPlayHidePause($play_small_btn, $pause_small_btn); 295 showPlayHidePause($play_btn, $pause_btn); 296 297 $crt_elt.addClass('now_paused'); 298 } 299 300 return; 301 } else { 302 /*show small pause button*/ 303 showPauseHidePlay($play_small_btn, $pause_small_btn); 304 /*show small play for current*/ 305 if (0 != crt_time) { 306 showPlayHidePause($crt_elt.find('.compact_bs_play'), $crt_elt.find('.compact_bs_pause')); 307 } 308 309 } 310 } 311 312 $crt_elt.find('audio').get(0).pause(); 313 $crt_elt.removeClass('now_playing'); 314 315 $next_elt.addClass('now_playing'); 316 resetAudioTime($next_elt.find('audio').get(0)); 317 $next_elt.find('audio').get(0).play(); 318 $next_elt.addClass('mpfe_already_played'); 319 stopOtherPlayers(); 320 handleCoverImg($next_elt); 321 handleAlbumInfoForCompact($next_elt); 322 $song_duration.text(formatTimeHM($(this).parent().find('audio').get(0).duration)); 323 $playing_song_name.text($(this).find('.player_song_name').text()); 324 325 $play_btn.addClass("display_none"); 326 $pause_btn.removeClass("display_none"); 327 }); 328 329 $player.find('.player_time_slider_base').on('click', function(e){ 330 var $slider_elt = $(this); 331 var elt_width = $slider_elt.width(); 332 var click_pos = e.pageX - Math.floor($slider_elt.offset().left); 333 334 if( $(this).hasClass('rtl_direction') ) { 335 click_pos = Math.floor($slider_elt.offset().left + elt_width) - e.pageX; 336 } 337 338 var percent_progress = Math.floor(click_pos/elt_width*100); 339 $time_slider.width(percent_progress + "%"); 340 341 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 342 $crt_elt.find('audio').get(0).currentTime = $crt_elt.find('audio').get(0).duration * (percent_progress/100); 343 }); 344 345 var get_next_player_elt = function($crt_elt) { 346 /*repeat*/ 347 if ("repeat" == playmode) { 348 if (("current_song" == repeatmode) && repeat_btn_on) { 349 return $crt_elt; 350 } 351 352 var $next_elt = $crt_elt.next(); 353 if (!$next_elt.length) { 354 $next_elt = $first_song; 355 } 356 return $next_elt; 357 } 358 /*shuffle*/ 359 var playlist_size = $player.find('.swp_music_player_entry').length; 360 var already_played_size = $player.find('.swp_music_player_entry.mpfe_already_played').length; 361 console.log("playlist size: " + playlist_size + " already played size: " + already_played_size); 362 if (already_played_size == playlist_size) { 363 $player.find('.swp_music_player_entry.mpfe_already_played').each(function(){ 364 $(this).removeClass('mpfe_already_played'); 365 }); 366 } 367 368 var $playlist = $player.find('.swp_music_player_entry').not('.now_playing').not('.mpfe_already_played').toArray(); 369 return jQuery($playlist[Math.floor(Math.random() * $playlist.length)]); 370 } 371 372 var showPlayHidePause = function($playBtn, $pauseBtn) { 373 $playBtn.removeClass('display_none'); 374 $pauseBtn.addClass('display_none'); 375 } 376 377 var showPauseHidePlay = function($playBtn, $pauseBtn) { 378 $playBtn.addClass('display_none'); 379 $pauseBtn.removeClass('display_none'); 380 } 381 382 var toggleCompactPlaylistUnderPlayPause = function($player, $button_pressed = 'play') { 383 var $compact_playlist = $player.find('.swp-playlist-under'); 384 if (!$compact_playlist.length) { 385 return; 386 } 387 388 var $crt_elt = $player.find('.swp_music_player_entry.now_playing'); 389 var $play_small_btn = $crt_elt.find('.compact_bs_play'); 390 var $pause_small_btn = $crt_elt.find('.compact_bs_pause'); 391 if ('play' == $button_pressed) { 392 showPauseHidePlay($play_small_btn, $pause_small_btn); 393 } else { 394 showPlayHidePause($play_small_btn, $pause_small_btn); 395 } 396 } 397 398 var toggleCompactPlaylistCrtNext = function($player, $crt, $next) { 399 var $compact_playlist = $player.find('.swp-playlist-under'); 400 if (!$compact_playlist.length) { 401 return; 402 } 403 404 var $crt_small_play = $crt.find('.compact_bs_play'); 405 var $crt_small_pause = $crt.find('.compact_bs_pause'); 406 showPlayHidePause($crt_small_play, $crt_small_pause); 407 408 var $next_small_play = $next.find('.compact_bs_play'); 409 var $next_small_pause = $next.find('.compact_bs_pause'); 410 showPauseHidePlay($next_small_play, $next_small_pause); 411 412 } 413 414 $player.find('i.playback-shuffle').on('click', function(e){ 415 if(shuffle_btn_on) { 416 $player.attr('data-playmode', "repeat"); 417 playmode = "repeat"; 418 shuffle_btn_on = false;
419 } else { 420 $player.attr('data-playmode', "shuffle"); 421 playmode = "shuffle"; 422 shuffle_btn_on = true; 423 } 424 $(this).toggleClass("is_active"); 425 }); 426 $player.find('i.playback-repeat').on('click', function(e){ 427 if (repeat_btn_on) { 428 if (shuffle_btn_on) { 429 $player.attr('data-playmode', "shuffle"); 430 playmode = "shuffle"; 431 } 432 repeat_btn_on = false; 433 } else { 434 $player.attr('data-playmode', "repeat"); 435 playmode = "repeat"; 436 repeat_btn_on = true; 437 } 438 $(this).toggleClass("is_active"); 439 }); 440 441 }); 442 } 443 444 var MPFESlideMusicPlayer = function($scope, $) { 445 $scope.find('.mpfe-sr-helper').on('click', function(e){ 446 e.preventDefault(); 447 }); 448 449 handleSlidePlayer($scope, '.swp_music_player'); 450 451 } 452 453 var MPFESlideCompactPlayer = function($scope, $) { 454 handleSlidePlayer($scope, '.swp_music_player.compact-player'); 455 456 $('.mpfe-compact-list').on('click', function(){ 457 $(this).closest('.swp_music_player').find('.swp-compact-playlist').addClass('list-visible'); 458 $(window).addClass('swp-overflow-y-hidden'); 459 }); 460 $('.compact-close-playlist-container').on('click', function(){ 461 $(this).closest('.swp-compact-playlist').removeClass('list-visible'); 462 $(window).removeClass('swp-overflow-y-hidden'); 463 }); 464 465 handleVolumeControl($scope, '.swp_music_player.compact-player'); 466 467 468 } 469 470 var handleVolumeControl = function($scope, player_selector) { 471 var $toggle_vol = $scope.find('.mpfe-toggle-vol'); 472 var $range_vol = $scope.find('.mpfe-range-vol'); 473 var $slider = $scope.find('.mpfe-input-range'); 474 var $player = $scope.find(player_selector); 475 476 $toggle_vol.on('click', function() { 477 $range_vol.toggle(); 478 }) 479 480 $slider.on("input", function() { 481 $player.find('.swp_music_player_entry').each(function(){ 482 $(this).find('audio').get(0).volume = $slider.val(); 483 }); 484 console.log("Value: " + $slider.val()); 485 }); 486 } 487 488 489 $(window).on("elementor/frontend/init", function() { 490 elementorFrontend.hooks.addAction( 491 "frontend/element_ready/slide-music-player-free.default", 492 MPFESlideMusicPlayer 493 ); 494 elementorFrontend.hooks.addAction( 495 "frontend/element_ready/slide-compact-player.default", 496 MPFESlideCompactPlayer 497 ); 498 }); 499 500})(jQuery); 501 502!function(){var e=document.createElement("input");try{if(e.type="range","range"==e.type)return}catch(e){return}if(e.style.background="linear-gradient(red, red)",e.style.backgroundImage&&"MozAppearance"in e.style){var t,n="MacIntel"==navigator.platform,i={radius:n?9:6,width:n?22:12,height:n?16:20},r="linear-gradient(transparent "+(n?"6px, #999 6px, #999 7px, #ccc 8px, #bbb 9px, #bbb 10px, transparent 10px":"9px, #999 9px, #bbb 10px, #fff 11px, transparent 11px")+", transparent)",a={"min-width":i.width+"px","min-height":i.height+"px","max-height":i.height+"px",padding:"0 0 "+(n?"2px":"1px"),border:0,"border-radius":0,cursor:"default","text-indent":"-999999px"},o={attributes:!0,attributeFilter:["min","max","step","value"]},u=document.createEvent("HTMLEvents");u.initEvent("input",!0,!1);var d=document.createEvent("HTMLEvents");d.initEvent("change",!0,!1),"loading"==document.readyState?document.addEventListener("DOMContentLoaded",s,!0):s(),addEventListener("pageshow",c,!0)}function s(){c(),new MutationObserver((function(e){e.forEach((function(e){e.addedNodes&&Array.forEach(e.addedNodes,(function(e){e instanceof Element&&(e.childElementCount?Array.forEach(e.querySelectorAll("input[type=range]"),l):e.mozMatchesSelector("input[type=range]")&&l(e))}))}))})).observe(document,{childList:!0,subtree:!0})}function c(){Array.forEach(document.querySelectorAll("input[type=range]"),l)}function l(e){"range"!=e.type&&function(e){var s,c,l,h,f,v,m,b,g,y,x,E=e.value;t||(p(t=document.body.appendChild(document.createElement("hr")),{"-moz-appearance":n?"scale-horizontal":"scalethumb-horizontal",display:"block",visibility:"visible",opacity:1,position:"fixed",top:"-999999px"}),document.mozSetImageElement("__sliderthumb__",t));var _=function(){return""+E},w=function t(n){E=""+n,s=!0,F(),delete e.value,e.value=E,e.__defineGetter__("value",_),e.__defineSetter__("value",t)};function L(e){if(h=!0,setTimeout((function(){h=!1}),0),!e.button&&x){var t=(parseFloat(getComputedStyle(this).width)-i.width)/x;if(t){var n=e.clientX-this.getBoundingClientRect().left-i.width/2-(E-b)*t;Math.abs(n)>i.radius&&(l=!0,this.value-=-n/t),v=E,m=e.clientX,this.addEventListener("mousemove",A,!0),this.addEventListener("mouseup",S,!0)}}}function A(e){var t=(parseFloat(getComputedStyle(this).width)-i.width)/x;t&&(v+=(e.clientX-m)/t,m=e.clientX,l=!0,this.value=v)}function S(){this.removeEventListener("mousemove",A,!0),this.removeEventListener("mouseup",S,!0),e.dispatchEvent(u),e.dispatchEvent(d)}function C(e){e.keyCode>36&&e.keyCode<41&&(M.call(this),l=!0,this.value=E+(38==e.keyCode||39==e.keyCode?y:-y))}function M(){h||(this.style.boxShadow=n?"inset 0 0 20px rgba(0,127,255,.1), 0 0 1px rgba(0,127,255,.4)":"0 0 0 2px #fb0")}function k(){this.style.boxShadow=""}
502function z(e){return!isNaN(e)&&+e==parseFloat(e)}function O(){b=z(e.min)?+e.min:0,(g=z(e.max)?+e.max:100)<b&&(g=b>100?b:100),y=z(e.step)&&e.step>0?+e.step:1,x=g-b,F(!0)}function N(){s||c||(E=e.getAttribute("value")),z(E)||(E=(b+g)/2),(E=Math.round((E-b)/y)*y+b)<b?E=b:E>g&&(E=b+~~(x/y)*y)}function F(t){N();var n=l;(l=!1,n&&E!=f&&e.dispatchEvent(u),t||E!=f)&&(f=E,p(e,{background:"-moz-element(#__sliderthumb__) "+(x?(E-b)/x*100:0)+"% no-repeat, "+r}))}e.__defineGetter__("value",_),e.__defineSetter__("value",w),Object.defineProperty(e,"type",{get:function(){return"range"}}),["min","max","step"].forEach((function(t){e.hasAttribute(t)&&(c=!0),Object.defineProperty(e,t,{get:function(){return this.hasAttribute(t)?this.getAttribute(t):""},set:function(e){null===e?this.removeAttribute(t):this.setAttribute(t,e)}})})),e.readOnly=!0,p(e,a),O(),new MutationObserver((function(t){t.forEach((function(t){"value"!=t.attributeName?(O(),c=!0):s||(E=e.getAttribute("value"),F())}))})).observe(e,o),e.addEventListener("mousedown",L,!0),e.addEventListener("keydown",C,!0),e.addEventListener("focus",M,!0),e.addEventListener("blur",k,!0)}(e)}function p(e,t){for(var n in t)e.style.setProperty(n,t[n],"important")}}();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.