1"use strict";(self.webpackChunknodebb=self.webpackChunknodebb||[]).push([[13230,21374,26174,57490,65928,87212],{8454(M,U,o){var w,E;w=[o(24962),o(96352),o(52473),o(17459),o(34342),o(49897),o(65303),o(29930),o(91749),o(30076),o(13230)],E=(function(g,R,u,A,I,x,y,r,h,p,W){const O={};let K=!1;O.init=function(e){K=!1,F(),k(e),g.addShareHandlers(ajaxify.data.title),I.addVoteHandler(),O.updatePostCount(ajaxify.data.postcount)};function F(){document.querySelector('[component="topic"]')&&$('[component="topic"]').on("show.bs.dropdown",'[component="post/tools"]',function(){const t=$(this),c=t.find(".dropdown-menu"),{top:a}=this.getBoundingClientRect();if(t.toggleClass("dropup",a>window.innerHeight/2),c.attr("data-loaded"))return;c.html(p.generatePlaceholderWave([3,5,9,7,10,"divider",10]));const l=t.parents("[data-pid]"),d=l.attr("data-pid"),P=parseInt(l.attr("data-index"),10);socket.emit("posts.loadPostTools",{pid:d},async(D,S)=>{if(D)return r.error(D);S.posts.display_move_tools=S.posts.display_move_tools&&P!==0;const L=await app.parseAndTranslate("partials/topic/post-menu-list",S),j=o(57576);c.attr("data-loaded","true").html(L),new j("[data-clipboard-text]"),h.fire("action:post.tools.load",{element:c})})})}O.toggle=function(e,t){const c=u.get("post","pid",e);c.find('[component="post/quote"], [component="post/bookmark"], [component="post/reply"], [component="post/flag"], [component="user/chat"]').toggleClass("hidden",t),c.find('[component="post/delete"]').toggleClass("hidden",t).parent().attr("hidden",t?"":null),c.find('[component="post/restore"]').toggleClass("hidden",!t).parent().attr("hidden",t?null:""),c.find('[component="post/purge"]').toggleClass("hidden",!t).parent().attr("hidden",t?null:""),O.removeMenu(c)},O.removeMenu=function(e){e.find('[component="post/tools"] .dropdown-menu').removeAttr("data-loaded").html("")},O.updatePostCount=function(e){u.get("topic/post-count").attr("title",e).html(p.humanReadableNumber(e)),R.setCount(e)};function k(e){const t=u.get("topic");H(),t.on("click",'[component="post/quote"]',function(){i($(this),e)}),t.on("click",'[component="post/reply"]',function(){n($(this),e)}),$(".topic").on("click",'[component="topic/reply"]',function(a){a.preventDefault(),n($(this),e)}),$(".topic").on("click",'[component="topic/reply-as-topic"]',async function(){h.fire("action:composer.topic.new",{cid:ajaxify.data.cid,body:await Y()})}),t.on("click",'[component="post/bookmark"]',function(){return f($(this),m($(this),"data-pid"))}),t.on("click",'[component="post/upvote"]',function(){return I.toggleVote($(this),".upvoted",1)}),t.on("click",'[component="post/downvote"]',function(){return I.toggleVote($(this),".downvoted",-1)}),t.on("click",'[component="post/vote-count"]',function(){I.showVotes(m($(this),"data-pid"))}),t.on("click",'[component="post/announce-count"]',function(){I.showAnnouncers(m($(this),"data-pid"))}),t.on("click",'[component="post/flag"]',function(){const a=m($(this),"data-pid");o.e(6574).then(function(){var l=[o(6574)];
1(function(d){d.showFlagModal({type:"post",id:a})}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/already-flagged"]',function(){const a=$(this).data("flag-id");o.e(6574).then(function(){var l=[o(6574)];(function(d){y.confirm("[[flags:modal-confirm-rescind]]",function(P){P&&d.rescind(a)})}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/flagUser"]',function(){const a=m($(this),"data-uid");o.e(6574).then(function(){var l=[o(6574)];(function(d){d.showFlagModal({type:"user",id:a})}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/flagResolve"]',function(){const a=$(this).attr("data-flagId");o.e(6574).then(function(){var l=[o(6574)];(function(d){d.resolve(a)}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/edit"]',function(){const a=$(this),l=parseInt(m(a,"data-timestamp"),10),d=parseInt(ajaxify.data.postEditDuration,10);c(d,l,"post-edit-duration-expired")&&h.fire("action:composer.post.edit",{pid:m(a,"data-pid")})}),config.enablePostHistory&&ajaxify.data.privileges["posts:history"]&&t.on("click",'[component="post/view-history"], [component="post/edit-indicator"]',function(){const a=$(this);o.e(92747).then(function(){var l=[o(92747)];(function(d){d.open(m(a,"data-pid"))}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/delete"]',function(){const a=$(this),l=parseInt(m(a,"data-timestamp"),10),d=parseInt(ajaxify.data.postDeleteDuration,10);c(d,l,"post-delete-duration-expired")&&C($(this))});function c(a,l,d){if(!ajaxify.data.privileges.isAdminOrMod&&a&&Date.now()-l>a*1e3){const P=Math.floor(a/86400),D=Math.floor(a%86400/3600),S=Math.floor(a%86400%3600/60),L=a%86400%3600%60;let j="[[error:"+d+", "+a+"]]";return P?D?j="[[error:"+d+"-days-hours, "+P+", "+D+"]]":j="[[error:"+d+"-days, "+P+"]]":D?S?j="[[error:"+d+"-hours-minutes, "+D+", "+S+"]]":j="[[error:"+d+"-hours, "+D+"]]":S&&(L?j="[[error:"+d+"-minutes-seconds, "+S+", "+L+"]]":j="[[error:"+d+"-minutes, "+S+"]]"),r.error(j),!1}return!0}t.on("click",'[component="post/restore"]',function(){C($(this))}),t.on("click",'[component="post/purge"]',function(){b($(this))}),t.on("click",'[component="post/move"]',function(){const a=$(this);o.e(90677).then(function(){var l=[o(90677)];(function(d){d.init(a.parents("[data-pid]"))}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/change-owner"]',function(){const a=$(this);Promise.all([o.e(20056),o.e(17205)]).then(function(){var l=[o(17205)];(function(d){d.init(a.parents("[data-pid]"))}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/manage-editors"]',function(){const a=$(this);Promise.all([o.e(20056),o.e(24459)]).then(function(){var l=[o(24459)];(function(d){d.init(a.parents("[data-pid]"))}).apply(null,l)}).catch(o.oe)}),t.on("click",'[component="post/ban-ip"]',function(){const a=$(this).attr("data-ip");socket.emit("blacklist.addRule",a,function(l){if(l)return r.error(l);r.success("[[admin/manage/blacklist:ban-ip]]")})}),t.on("click",'[component="post/chat"]',function(){V($(this))})}function n(e,t){const c=s();N(function(){let a=v(e);const l=m(e,"data-uid");(l===String(app.user.uid)||l==="0"||!m(e,"data-userslug"))&&(a="");const P=e.is('[component="post/reply"]')?m(e,"data-pid"):null,D=!P||!c.pid||P===c.pid;c.text&&D?(a=a||c.username,h.fire("action:composer.addQuote",{tid:t,pid:P,title:ajaxify.data.title,username:a,body:c.text,selectedPid:c.pid})):h.fire("action:composer.post.new",{tid:t,pid:P,title:ajaxify.data.title,body:a?a+" ":$('[component="topic/quickreply/text"]').val()||""})})}function i(e,t){const c=s();N(async function(){const a=v(e),l=m(e,"data-pid"),d=c.text&&l&&l===c.pid?c.text:(await x.get(`/posts/${encodeURIComponent(l)}/raw`)).content;h.fire("action:composer.addQuote",{tid:t,pid:l,username:a,title:ajaxify.data.title,body:d})})}function s(){let e="",t,c="";const a=window.getSelection?window.getSelection():document.selection.createRange(),l=$('[component="post"] [component="post/content"]');let d;return l.each(function(P,D){a&&a.containsNode&&D&&a.containsNode(D,!0)&&(d=D)}),d&&a&&(e=a.toString(),t=$(d).parents('[component="post"]').attr("data-pid"),c=v($(d))),{text:e,pid:t,username:c}}function f(e,t){const c=e.attr("data-bookmarked")==="false"?"put":"del";return x[c](`/posts/${encodeURIComponent(t)}
1/bookmark`,void 0,function(a){if(a)return r.error(a);const l=c==="put"?"bookmark":"unbookmark";h.fire(`action:post.${l}`,{pid:t})}),!1}function m(e,t){return e.parents("[data-pid]").attr(t)}function v(e){let t="";if(e.attr("component")==="topic/reply")return t;const c=e.parents("[data-pid]"),a=c.hasClass("self-post");return c.length&&(t=W(c.attr("data-username"),!0),t||(c.attr("data-uid")!=="0"?t="[[global:former-user]]":t="[[global:guest]]"),t&&t!=="[[global:former-user]]"&&t!=="[[global:guest]]"&&(t=a?t:`@${t}`)),t}function C(e){const t=m(e,"data-pid"),a=u.get("post","pid",t).hasClass("deleted")?"restore":"delete";B(a,t)}function b(e){B("purge",m(e,"data-pid"))}async function B(e,t){({action:e}=await h.fire(`static:post.${e}`,{action:e,pid:t})),e&&y.confirm("[[topic:post-"+e+"-confirm]]",function(c){if(!c)return;const a=e==="purge"?"":"/state";x[e==="restore"?"put":"del"](`/posts/${encodeURIComponent(t)}${a}`).catch(r.error)})}function V(e){const t=e.parents("[data-pid]");return o.e(92619).then(function(){var c=[o(92619)];(function(a){a.newChat(t.attr("data-uid"))}).apply(null,c)}).catch(o.oe),e.parents(".dropdown").find(".dropdown-toggle").click(),!1}async function N(e){if(!parseInt(ajaxify.data.topicStaleDays,10))return e();const c=Math.min(Date.now()-1e3*60*60*24*ajaxify.data.topicStaleDays,864e13);if(K||ajaxify.data.lastposttime>=c)return e();y.dialog({title:"[[topic:stale.title]]",message:"[[topic:stale.warning]]",buttons:{reply:{label:"[[topic:stale.reply-anyway]]",className:"btn-link",callback:function(){K=!0,e()}},create:{label:"[[topic:stale.create]]",className:"btn-primary",callback:async function(){h.fire("action:composer.topic.new",{cid:ajaxify.data.cid,body:await Y(),fromStaleTopic:!0})}}}})}const T=utils.debounce(J,250);function H(){ajaxify.data.privileges["topics:reply"]&&(h.onPage("action:posts.loaded",Q),$(document).off("selectionchange"),$(document).on("selectionchange",function(){window.getSelection().toString()===""&&$('[component="selection/tooltip"]').addClass("hidden")}),$(document).on("selectionchange",T))}function J(){window.getSelection().toString()===""||Q()}async function Q(){let e=$('[component="selection/tooltip"]');if(e.addClass("hidden"),e.attr("data-ajaxify")==="1"){e.remove();return}const t=window.getSelection();if(t.focusNode&&t.type==="Range"&&ajaxify.data.template.topic){const c=$(t.focusNode),a=$(t.anchorNode),l=a.parents("[data-pid]").attr("data-pid"),d=c.parents("[data-pid]").attr("data-pid");if(l!==d||!c.parents('[component="post/content"]').length||!a.parents('[component="post/content"]').length)return;const P=c.parents("[data-pid]"),D=t.getRangeAt(0);if(!P.length||D.collapsed)return;const S=D.getClientRects(),L=S[S.length-1];e.length||(e=await app.parseAndTranslate("partials/topic/selection-tooltip",ajaxify.data),$('[component="selection/tooltip"]').remove(),e.addClass("hidden").appendTo("body")),e.off("click").on("click",'[component="selection/tooltip/quote"]',function(){e.addClass("hidden"),i(P.find('[component="post/quote"]'),ajaxify.data.tid)}),e.removeClass("hidden"),$(window).one("action:ajaxify.start",function(){e.attr("data-ajaxify",1).addClass("hidden"),$(document).off("selectionchange",T)});const j=e.outerWidth(!0);e.css({top:L.bottom+$(window).scrollTop(),left:j>L.width?L.left:L.left+L.width-j})}}async function Y(){const e=ajaxify.data.title.replace(/\]\]/g,"\\]\\]").replace(/\[\[/g,"\\[\\[").replace(/[/g,"[").replace(/]/g,"]"),t=`${config.relative_path}/topic/${ajaxify.data.slug}`;return await A.translateKey("topic:link-back",[e,t])}return O}).apply(U,w),E!==void 0&&(M.exports=E)},34342(M,U,o){var w,E;w=[o(52473),o(17459),o(49897),o(91749),o(65303),o(29930),o(89336),o(81335)],E=(function(g,R,u,A,I,x,y,r){const h={};let p={};h.addVoteHandler=function(){p={},W()&&(g.get("topic").on("mouseenter",'[data-pid] [component="post/vote-count"]',F),g.get("topic").on("mouseleave",'[data-pid] [component="post/vote-count"]',K)),g.get("topic").on("mouseenter",'[data-pid] [component="post/announce-count"]',F),g.get("topic").on("mouseleave",'[data-pid] [component="post/announce-count"]',K)};function W(){const{upvoteVisibility:n,privileges:i}=ajaxify.data;return i.isAdminOrMod||n==="all"||n==="loggedin"&&config.loggedIn}function O(){const{upvoteVisibility:n,downvoteVisibility:i,privileges:s}=ajaxify.data;return s.isAdminOrMod||n==="all"||i==="all"||(n==="loggedin"||i==="loggedin")&&config.loggedIn}function K(){const n=$(this),i=n.parents("[data-pid]").attr("data-pid"),s=y.Tooltip.getInstance(this);s&&(s.dispose(),n.attr("title","")),p[i]=!1}function F(){const n=$(this),s=n.parent().parents("[data-pid]").attr("data-pid");p[s]=!0;const f=y.Tooltip.getInstance(this);f&&(f.dispose(),n.attr("title",""));const m=n.attr("component")==="post/vote-count"?`/posts/${encodeURIComponent(s)}/upvoters`:`/posts/${encodeURIComponent(s)}/announcers/tooltip`;u.get(m,{},function(v,C){if(v)return x.error(v);p[s]&&C&&k(n,C)})}async function k(n,i){function s(v){n.attr("title",v),new y.Tooltip(n,{container:"#content",html:!0}).show()}const f=i.usernames.filter(v=>v!=="[[global:former-user]]");if(!f.length)return;const m=f.join(", ");
1if(f.length+i.otherCount>i.cutoff){const v=await R.translateKey("topic:users-and-others",[m,i.otherCount]);s(v)}else s(utils.escapeHTML(m))}return h.toggleVote=async function(n,i,s,f){const m=n.closest("[data-pid]"),v=i.replace(/^\./,""),C=n.hasClass(v),b=C?"del":"put",B=C?-s:s,V=m.attr("data-pid");if(!app.user.uid){if(!config.activitypub.enabled)return ajaxify.go("login"),!1;let T;return utils.isNumber(V)?T=config.url+"/post/"+V:T=V,o.e(91722).then(()=>o(91722)).then(({trigger:H})=>{H("like",{object:T})}),!1}n.toggleClass(v),f&&n.find(f).toggleClass("fa text-danger",!C).toggleClass("fa-regular text-muted",C);const N=m.find('[component="post/vote-count"], [component="upvote-count"]');if(N.length){const T=parseInt(N.attr("data-votes")||N.text(),10)||0;N.text(T+B).attr("data-votes",T+B)}try{await u[b](`/posts/${encodeURIComponent(V)}/vote`,{delta:B})}catch(T){if(n.toggleClass(v),f&&n.find(f).toggleClass("fa text-danger",!C).toggleClass("fa-regular text-muted",C),N.length){const H=parseInt(N.attr("data-votes")||N.text(),10)||0;N.text(H-B).attr("data-votes",H-B)}return x.error(T.message),!1}return A.fire("action:post.toggleVote",{pid:V,delta:B,unvote:b==="del"}),!1},h.showVotes=async function(n){if(!O())return;const i=await u.get(`/posts/${encodeURIComponent(n)}/voters`,{}),s=await r.render("modals/votes",i),f=await I.dialog({title:"[[global:voters]]",message:s,className:"vote-modal",show:!0,onEscape:!0,backdrop:!0});f.on("click",function(){f.modal("hide")})},h.showAnnouncers=async function(n){const i=await u.get(`/posts/${encodeURIComponent(n)}/announcers`,{}).catch(m=>x.error(m)),s=await app.parseAndTranslate("modals/announcers",i),f=await I.dialog({title:`[[topic:announcers-x, ${i.announceCount}]]`,message:s,className:"announce-modal",show:!0,onEscape:!0,backdrop:!0});f.on("click",function(){f.modal("hide")})},h}).apply(U,w),E!==void 0&&(M.exports=E)},49897(M,U,o){o.r(U),o.d(U,{del:()=>F,get:()=>h,head:()=>p,patch:()=>O,post:()=>W,put:()=>K});var w=o(91749),E=o.n(w),g=o(65303),R=o(17459),u=o.n(R),A=o(68636),I=o.n(A);const x=config.relative_path+"/api/v3";async function y(n,i){if(n.url=n.url.startsWith("/api")?config.relative_path+n.url:x+n.url,n.headers=n.headers||{},n.headers["x-return-to"]||(n.headers["x-return-to"]=`${window.location.pathname.slice(config.relative_path.length)}${window.location.search}`),typeof i=="function"){r(n).then(s=>i(null,s),s=>i(s));return}try{return await r(n)}catch(s){if(s.message===await R.translate("[[error:api.401]]",config.userLang)){const{url:f}=await(0,w.fire)("filter:admin.reauth",{url:"login"}),m=await R.translate("[[error:api.reauth-required]]",config.userLang);(0,g.confirm)(m,v=>{v&&(A.setItem("location-hash",window.location.hash),ajaxify.go(f))})}throw s}}async function r(n){const{url:i}=n;delete n.url,n.data&&!(n.data instanceof FormData)&&(n.data=JSON.stringify(n.data||{}),n.headers["content-type"]="application/json; charset=utf-8"),{options:n}=await(0,w.fire)("filter:api.options",{options:n}),n.data&&(n.body=n.data,delete n.data);const s=await fetch(i,n),{headers:f}=s;if(f.get("x-redirect"))return r({url:f.get("x-redirect"),...n});const m=f.get("content-type"),v=m&&m.startsWith("application/json");let C;if(n.method!=="HEAD"&&(v?C=await s.json():C=await s.text()),!s.ok){if(C){const b=v&&(C.status?.message||C.error||""),B=typeof C=="string"?C:s.statusText||`[[error:api.${s.status}]]`;throw new Error(v&&b?b:B)}throw new Error(s.statusText)}return v&&C&&C.hasOwnProperty("status")&&C.hasOwnProperty("response")?C.response:C}function h(n,i,s){return y({url:n+(i&&Object.keys(i).length?"?"+$.param(i):"")},s)}function p(n,i,s){return y({url:n+(i&&Object.keys(i).length?"?"+$.param(i):""),method:"HEAD"},s)}function W(n,i,s,f){return k("POST",n,i,s,f)}function O(n,i,s,f){return k("PATCH",n,i,s,f)}function K(n,i,s,f){return k("PUT",n,i,s,f)}function F(n,i,s,f){return k("DELETE",n,i,s,f)}function k(n,i,s,f,m){return typeof f=="function"&&(m=f,f={}),y({url:i,method:n,data:s,headers:{"x-csrf-token":config.csrf_token,...f}},m)}},24962(M,U,o){var w,E;w=[o(91749),o(17459)],E=(function(g,R){const u={};u.addShareHandlers=function(x){function y(r,h,p,W){return window.open(r,"_blank","width="+p+",height="+W+",scrollbars=no,status=no"),g.fire("action:share.open",{url:r,urlToPost:h}),!1}$("#content").off("shown.bs.dropdown",".share-dropdown").on("shown.bs.dropdown",".share-dropdown",function(){const r=$(this).find(".post-link");
1r.val(I($(this))),setTimeout(function(){r.putCursorAtEnd().select()},50)}),A(".post-link",function(r){return r.preventDefault(),!1}),A('[component="share/twitter"]',function(){const r=I($(this)),h=`https://twitter.com/intent/tweet?text=${encodeURIComponent(x)}&url=${encodeURIComponent(r)}`;return y(h,r,550,420)}),A('[component="share/facebook"]',function(){const r=I($(this)),h=`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(r)}`;return y(h,r,626,436)}),A('[component="share/whatsapp"]',function(){const r=I($(this)),h=encodeURIComponent(x)+" - "+encodeURIComponent(r),p=config.useragent.isMobile?`whatsapp://send?text=${h}`:`https://wa.me/?text=${h}`;return y(p,r,626,436)}),A('[component="share/telegram"]',function(){const r=I($(this)),h=`https://t.me/share/url?text=${encodeURIComponent(x)}&url=${encodeURIComponent(r)}`;return y(h,r,626,436)}),A('[component="share/linkedin"]',function(){const r=I($(this)),h=`https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(r)}`;return y(h,r,626,436)}),A('[component="share/mastodon"]',function(){const r=I($(this)),h=`https://share.joinmastodon.org/#text=${encodeURIComponent(r)}`;return y(h,r,626,760)}),A('[component="share/email"]',async function(){const r=I($(this)),[h,p]=await R.translateKeys([R.compile("topic:share-mail-subject",config.siteTitle),R.compile("topic:share-mail-body",r)]),W=`mailto:?subject=${encodeURIComponent(h)}&body=${encodeURIComponent(p)}`;window.location.href=W}),g.fire("action:share.addHandlers",{openShare:y})};function A(x,y){$("#content").off("click",x).on("click",x,y)}function I(x){const y=x.parents("[data-pid]").attr("data-pid");return y?`${config.url}/post/${y}`:window.location.href}return u}).apply(U,w),E!==void 0&&(M.exports=E)},13230(M,U,o){var w,E;(function(g){w=g,E=typeof w=="function"?w.call(U,o,U,M):w,E!==void 0&&(M.exports=E)})(function(){const g=/[^\p{L}\s\d\-_@.]/gu,R=/[^\w\s\d\-_@.]/g,u=/^\s+|\s+$/g,A=/\s+/g,I=/-+/g,x=/-$/g,y=/^-/g,r=/^[\w\d\s.,\-@]+$/;return function(p,W){return!p||(p=String(p).replace(u,""),r.test(p)?p=p.replace(R,"-"):p=p.replace(g,"-"),p=W?p:p.toLocaleLowerCase(),p=p.replace(A,"-"),p=p.replace(I,"-"),p=p.replace(x,""),p=p.replace(y,""),p==="."||p==="..")?"":p}})},68636(M,U,o){var w;w=(function(){function E(){this._store={},this._keys=[]}E.prototype.isMock=!0,E.prototype.setItem=function(u,A){u=String(u),this._keys.indexOf(u)===-1&&this._keys.push(u),this._store[u]=A},E.prototype.getItem=function(u){return u=String(u),this._keys.indexOf(u)===-1?null:this._store[u]},E.prototype.removeItem=function(u){u=String(u),this._keys=this._keys.filter(function(A){return A!==u}),this._store[u]=null},E.prototype.clear=function(){this._keys=[],this._store={}},E.prototype.key=function(u){return u=parseInt(u,10)||0,this._keys[u]},Object.defineProperty&&Object.defineProperty(E.prototype,"length",{get:function(){return this._keys.length}});let g;const R=Date.now().toString();try{if(g=window.localStorage,g.setItem(R,R),g.getItem(R)!==R)throw Error("localStorage behaved unexpectedly");return g.removeItem(R),g}catch(u){console.warn(u),console.warn("localStorage failed, falling back on sessionStorage");try{if(g=window.sessionStorage,g.setItem(R,R),g.getItem(R)!==R)throw Error("sessionStorage behaved unexpectedly");return g.removeItem(R),g}catch(A){return console.warn(A),console.warn("sessionStorage failed, falling back on memory storage"),new E}}}).call(U,o,U,M),w!==void 0&&(M.exports=w)}}]);
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.