1$ = jQuery.noConflict(); 2 3$(document).ready(function () { 4 5 var aplicar = chamaJS(); 6 7 if(aplicar){ 8 chamarCSS(); 9 10 perparaTela(); 11 12 incluirTopoPaginaInterna(); 13 14 alterarPosicaoTitulo(); 15 alterarPosicaoInforShare(); 16 adicionarBotaoSalvarNaAgenda(); 17 reorganizarCamposFormulario(); 18 alterarMetaDatePublishedStringParaData(); 19 20 mascararCampos(); 21 } 22 23 function chamarCSS() { 24 25 var protocolo = window.location.protocol; 26 var host = window.location.host; 27 28 var linkCss = protocolo + '//' + host + '/assets/css/evento-interna-inova.css'; 29 30 if(host.indexOf('inova') < 0){ 31 linkCss = protocolo + '//' + host + '/assets/css/evento-interna-portal.css'; 32 } 33 34 $('head').append('<link rel="stylesheet" type="text/css" href="' + linkCss + '">'); 35 36 } 37 38 function incluirTopoPaginaInterna() { 39 $('#sp-conteudo-do-site') 40 .children('.container') 41 .children('.container-inner') 42 .prepend('<div class="topo-pagina-interna"></div>'); 43 $('.topo-pagina-interna').append('<div class="image-banner"></div>') 44 $('.topo-pagina-interna').append(montarBreadCrumb()); 45 } 46 47 function montarBreadCrumb() { 48 var tituloPagina = $('.article-header').children('h1').text() 49 50 var htmlBreadCrumb = '<ol itemscope="" itemtype="https://schema.org/BreadcrumbList" class="breadcrumb">' + 51 ' <li class="">' + 52 ' <span class="" aria-hidden="true"></span>' + 53 ' </li>' + 54 ' <li itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem" class="breadcrumb-item"><a itemprop="item" href="/" class="pathway"><span itemprop="name">Home</span></a>' + 55 ' <meta itemprop="position" content="1">' + 56 ' </li>' + 57 ' <li itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem" class="breadcrumb-item"><a itemprop="item" href="/conteudos/eventos" class="pathway"><span itemprop="name">Eventos</span></a>' + 58 ' <meta itemprop="position" content="2">' + 59 ' </li>' + 60 ' <li itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem" class="breadcrumb-item active">' + 61 ' <span itemprop="name">' + tituloPagina + '</span>' + 62 ' <meta itemprop="position" content="3">' + 63 ' </li>' + 64 '</ol>'; 65 66 return htmlBreadCrumb; 67 } 68 69 function adicionarBotaoSalvarNaAgenda() { 70 71 var titulo = $('.template-eventos') 72 .find('.article-header') 73 .find('h1') 74 .text() 75 .trim(); 76 77 var local = "Sistema OCB"; 78 79 var dataHora = $('.template-eventos') 80 .find('.data-evento') 81 .text() 82 .trim(); 83 84 var datas = montaDataEvento(dataHora); 85 var dataInicio = datas['data-inicio']; 86 var dataFim = datas['data-fim']; 87 88 var botaoAgenda = "<li><a class='salvar-na-agenda' onclick=\"salvarNaAgenda('" + titulo + "', '" + local + "', '" + dataInicio + "', '" + dataFim + "')\" title='Salvar na agenda'><i class='fa fa-calendar-check-o' ></i> </a></li>"; 89 90 $('.info-box-evento') 91 .find('.share-evento') 92 .find('.social-share-icon') 93 .find('ul') 94 .children('li') 95 .eq(0) 96 .before(botaoAgenda); 97 } 98 99 function montaDataEvento(dataHora) { 100 101 var dataHoraSplited = dataHora.split(' '); 102 103 var dataInicio = ''; 104 var dataFim = ''; 105 106 var dataSplitComIntervalo = dataHoraSplited[0].split('a'); 107 108 if (dataSplitComIntervalo[0].length <= 2) { 109 // apenas dia inicial 110 var diaDataInicio = dataHoraSplited[0]; 111 var dataFimSplited = dataHoraSplited.reverse()[0].split('/'); 112 113 var dataInicio = dataFimSplited[2] + dataFimSplited[1] + diaDataInicio; 114 //var dataFim = dataHoraSplited[0].split('/').reverse().join('').replace(' ', ''); 115 116 var dataHoraSplited = dataHoraSplited[0].split('/').reverse(); 117 118 var dataFimDia = dataHoraSplited[2]; 119 120 if (dataFimDia <= 9) { 121 var dataFimDia = parseInt(dataFimDia) + 1; 122 var dataFimDia = 0 + dataFimDia.toString(); 123 } else { 124 var dataFimDia = parseInt(dataFimDia) + 1; 125 } 126 127 var dataFimMes = dataHoraSplited[1]; 128 var dataFimAno = dataHoraSplited[0]; 129 130 var dataFim = dataFimAno + dataFimMes + dataFimDia; 131 132 } else if (dataSplitComIntervalo[0].length > 2 && dataSplitComIntervalo[0].length <= 5) { 133 //dia e mes inicial 134 var diaDataInicio = dataHoraSplited[0]; 135 136 var dataFimSplited = dataHoraSplited.reverse()[0].split('/'); 137 138 var dataInicio = dataFimSplited[2] + diaDataInicio.split('/').reverse().join('').replace(' ', ''); 139 //var dataFim = dataHoraSplited[0].split('/').reverse().join('').replace(' ', ''); 140 141 var dataHoraSplited = dataHoraSplited[0].split('/').reverse(); 142 143 var dataFimDia = dataHoraSplited[2]; 144 145 if (dataFimDia <= 9) { 146 var dataFimDia = parseInt(dataFimDia) + 1; 147 var dataFimDia = 0 + dataFimDia.toString(); 148 } else { 149 var dataFimDia = parseInt(dataFimDia) + 1; 150 } 151 152 var dataFimMes = dataHoraSplited[1]; 153 var dataFimAno = dataHoraSplited[0]; 154 155 var dataFim = dataFimAno + dataFimMes + dataFimDia; 156 157 } else { 158 // inicio e fin mesmo dia 159 dataInicio = dataHoraSplited[0].split('/').reverse().join('').replace(' ', ''); 160 dataFim = dataHoraSplited[0].split('/').reverse().join('').replace(' ', ''); 161 } 162 163 dataInicio = isNaN(dataInicio) ? '' : dataInicio; 164 dataInicio = dataInicio == 'undefinedNaN' ? '' : dataInicio; 165
166 dataFim = isNaN(dataFim) ? '' : dataFim; 167 dataFim = dataFim == 'undefinedNaN' ? '' : dataFim; 168 169 return { "data-inicio": dataInicio, "data-fim": dataFim }; 170 171 } 172 173 function alterarPosicaoTitulo() { 174 var articleHeader = $('#sp-conteudo-do-site') 175 .find('.article-details') 176 .find('.article-header'); 177 178 $('[itemprop="articleBody"]') 179 .find('.template-eventos') 180 .find('.titulo-evento') 181 .append(articleHeader); 182 } 183 184 function alterarPosicaoInforShare() { 185 var socialShare = $('.social-share-block'); 186 $('.template-eventos') 187 .find('.share-evento') 188 .append(socialShare) 189 } 190 191 function reorganizarCamposFormulario() { 192 var nome = $('.formulario').find('.cf-fields').find('[data-name="nome_completo"]'); 193 194 var dataDeNascimento = $('.formulario').find('.cf-fields').find('[data-name="data_de_nascimento"]') 195 var cpf = $('.formulario').find('.cf-fields').find('[data-name="cpf"]') 196 var email = $('.formulario').find('.cf-fields').find('[data-name="e_mail"]') 197 198 var celular = $('.formulario').find('.cf-fields').find('[data-name="celular"]'); 199 var eWhatsapp = $('.formulario').find('.cf-fields').find('[data-name="e_whatsapp"]'); 200 201 var comoSeIdentifica = $('.formulario').find('.cf-fields').find('[data-name="como_se_identifica"]'); 202 var municipio = $('.formulario').find('.cf-fields').find('[data-name="municipio"]'); 203 204 var cooperativa = $('.formulario').find('.cf-fields').find('[data-name="cooperativa"]'); 205 var cargo = $('.formulario').find('.cf-fields').find('[data-name="cargo"]'); 206 207 var publicoBeneficiario = $('.formulario').find('.cf-fields').find('[data-name="publico_beneficiario"]'); 208 209 var portadorDeDeficiencia = $('.formulario').find('.cf-fields').find('[data-name="portador_de_deficiencia"]'); 210 var precisaDeAtendimentoEspecial = $('.formulario').find('.cf-fields').find('[data-name="precisa_de_atendimento_especial"]'); 211 212 213 var nivelDeEscolaridade = $('.formulario').find('.cf-fields').find('[data-name="nivel_de_escolaridade"]'); 214 var comoVoceFicouSabendoDesteEvento = $('.formulario').find('.cf-fields').find('[data-name="como_voce_ficou_sabendo_deste_evento"]'); 215 216 var liEConcordo = $('.formulario').find('.cf-fields').find('[data-name="li_e_concordo"]'); 217 var botaoEnviar = $('.formulario').find('.cf-fields').find('[data-name="submit_21"]'); 218 219 220 $('.formulario').find('.cf-fields').append('<div class="formulario-responsivo"></div>') 221 222 var i = 0; 223 for (i; i <= 8; i++) { 224 $('.formulario-responsivo').append('<div class="formulario-responsivo-linha-' + i + '"></div>') 225 } 226 227 var tituloForm = "<div class='titulo-form'>Dados do beneficiário</div>"; 228 229 $('.formulario-responsivo-linha-0').append(tituloForm); 230 $('.formulario-responsivo-linha-1').append(nome); 231 $('.formulario-responsivo-linha-2').append(dataDeNascimento, cpf, email); 232 $('.formulario-responsivo-linha-3').append(celular, eWhatsapp); 233 $('.formulario-responsivo-linha-4').append(comoSeIdentifica, municipio); 234 $('.formulario-responsivo-linha-5').append(cooperativa, cargo); 235 $('.formulario-responsivo-linha-6').append('<div class="formulario-responsivo-linha-6-1"></div>'); 236 $('.formulario-responsivo-linha-6').append('<div class="formulario-responsivo-linha-6-2"></div>'); 237 $('.formulario-responsivo-linha-6-1').append(publicoBeneficiario, portadorDeDeficiencia); 238 $('.formulario-responsivo-linha-6-2').append(portadorDeDeficiencia, precisaDeAtendimentoEspecial); 239 $('.formulario-responsivo-linha-7').append(nivelDeEscolaridade, comoVoceFicouSabendoDesteEvento); 240 $('.formulario-responsivo-linha-8').append(liEConcordo, botaoEnviar); 241 } 242 243 function mascararCampos() { 244 245 var dataDeNascimento = $('[name="cf[data_de_nascimento]"]'); 246 var cpf = $('[name="cf[cpf]"]'); 247 var celular = $('[name="cf[celular]"]'); 248 249 dataDeNascimento.mask('00/00/0000', { reverse: true }); 250 cpf.mask('000.000.000-00', { reverse: true }); 251 celular.mask("(00) 00000-0000", { reverse: false }); 252 253 } 254 255 imagemParaArtigosRelacionadosSemImagem(); 256 function imagemParaArtigosRelacionadosSemImagem() { 257 $(".related-article-list-container .related-article-list .article").each(function() { 258 var link = $(this).children("a").first(); 259 260 if (link.find(".article-full-image img").length === 0) { 261 var divImagem = link.find(".article-full-image"); 262 263 if (divImagem.length === 0) { 264 divImagem = $('<div>', { class: "article-full-image float-left" }); 265 link.append(divImagem); 266 } 267 268 var imgPadrao = $("<img>", { 269 src: "https://conteudo.somos.coop.br/images/Imagens/imagem-padrao-coop.webp", 270 alt: "Imagem padrão SomosCoop" 271 }); 272 273 divImagem.append(imgPadrao); 274 } 275 }); 276 } 277 278 $('.boxModulos').hide(); 279 280}); 281 282function salvarNaAgenda(titulo, local, dataInicio, dataFim) { 283 var data = dataInicio + '/' + ((dataFim != "") ? dataFim : ''); 284 var url = 'https://calendar.google.com/calendar/u/0/r/eventedit?' + 285 'dates=' + data + 286 '&text=' + titulo.replace(" ", "+") + 287 '&details=' + local; 288 window.open(url, '_blank'); 289 /*var arrDataHoraInicio = $('.fields-container') 290 .children('.data-hora-inicio') 291 .children('.field-value') 292 .text() 293 .split(' '); 294 295 var arrDataInicio = arrDataHoraInicio[0].split('-'); 296 var arrHoraInicio = arrDataHoraInicio[1].split(':'); 297 298 var arrDataHoraFim = $('.fields-container') 299 .children('.data-hora-fim') 300 .children('.field-value') 301 .text() 302 .split(' '); 303 304 var arrDataFim = arrDataHoraFim[0].split('-'); 305 var arrHoraFim = arrDataHoraFim[1].split(':'); 306 307 var linkEvento = $('.fields-container') 308 .children('.url-do-link') 309 .children('.field-value') 310 .text(); 311 312 var sumario = $('.texto-evento').text(); 313 var descricao = $('.titulo-evento').text(); 314 315 const createICalendar = () => { 316 const icsContent = ` 317 BEGIN:VCALENDAR 318 VERSION:2.0 319 PRODID:- 320 BEGIN:VEVENT 321 UID:${Date.now()}@somoscoopertivismo.coop.br 322 DTSTAMP:${formatDate(new Date())} 323 DTSTART:${formatDate(new Date(arrDataInicio[2], arrDataInicio[1], arrDataInicio[0], arrHoraInicio[0], arrHoraInicio[1]))} 324 DTEND:${formatDate(new Date(arrDataFim[2], arrDataFim[1], arrDataFim[0], arrHoraFim[0], arrHoraFim[1]))} 325 SUMMARY:${sumario} 326 DESCRIPTION:${descricao} 327 LOCATION:${linkEvento} 328 END:VEVENT 329 END:VCALENDAR 330 `; 331 return icsContent; 332 }; 333 334 const formatDate = (date) => { 335 return date.toISOString().replace(/[-:]/g, '').split('.')[0]; 336 };
337 const icsContent = createICalendar(); 338 const blob = new Blob([icsContent], { type: 'text/calendar;charset=utf-8;' }); 339 const url = URL.createObjectURL(blob); 340 const a = document.createElement('a'); 341 a.href = url; 342 a.download = 'evento.ics'; 343 a.click(); 344 URL.revokeObjectURL(url);*/ 345} 346 347function perparaTela(){ 348 $('ul.fields-container').hide(); 349 $('.data-evento').find('i').remove(); 350 351 var divTemplate = $('<div>').addClass('template-eventos'); 352 var divTitulo = $('<div>').addClass('titulo-evento'); 353 var divHeader = $('.article-header')[0]; 354 var divImagemEvento = $('<div>').addClass('image-topo-evento'); 355 var divInfoBox = $('<div>').addClass('info-box-evento'); 356 var divDataHoraRedes = $('<div>').addClass('data-evento-hora'); 357 var divData = retornaData(); 358 var divRedes = $('<div>').addClass('share-evento'); 359 var divTexto = $('<div>').addClass('texto-evento'); 360 var divDataHoraRedes = $('<div>').addClass('data-evento-hora'); 361 var divTags = $('<div>').addClass('rodapeEvento'); 362 var spanVoltar = $('<span>').addClass('linkVoltarEventos'); 363 var linkVoltar = $('<a>').attr('href','/acontece').text('< Voltar'); 364 var textoLink = $('.texto-para-link').children('.field-value') 365 .text(); 366 var link = $('.url-do-link').children('.field-value') 367 .children('a') 368 .attr('href'); 369 var tipoInscricao = (typeof $('.tipo-de-inscricao') != 'undefined') ? $('.tipo-de-inscricao').children('.field-value') 370 .text() : ''; 371 372 textoLink = $('.texto-para-link').children('.field-value').length == 0 ? 'Saiba mais' : textoLink; 373 374 var linkPosEvento = $('<a>').attr('href', link) 375 .attr('target', '_blank') 376 .text(textoLink); 377 378 var divLinkPosEvento = $('<div>').addClass('linkPosEvento'); 379 380 if(tipoInscricao == 'form') { 381 linkPosEvento.attr('onclick', 'mostrarFormulario()') 382 .attr('target', '') 383 .attr('href', 'javascript:void(0)'); 384 } 385 386 divTitulo.append(divHeader); 387 388 divDataHoraRedes.prepend(divData); 389 390 divInfoBox.append(divDataHoraRedes) 391 .append(divRedes); 392 393 if($('.article-header').length > 0) 394 $('.article-header')[0].remove(); 395 396 var img = $('[itemprop="articleBody"]').find('img')[0]; 397 divImagemEvento.append(img); 398 399 var texto = $('[itemprop="articleBody"]').html(); 400 divTexto.append(texto); 401 402 $('[itemprop="articleBody"]').remove(); 403 404 var tags = $('ul.tags'); 405 406 spanVoltar.append(linkVoltar); 407 divTags.append(spanVoltar) 408 .append(tags); 409 410 $('ul.tags').remove(); 411 412 divLinkPosEvento.append(linkPosEvento); 413 414 if(divLinkPosEvento.attr('href') == '' && tipoInscricao == 'link'){ 415 divLinkPosEvento.attr('style', 'display:none') 416 } 417 418 divTemplate.append(divTitulo) 419 .append(divInfoBox) 420 .append(divImagemEvento) 421 .append(divTexto) 422 .append(divLinkPosEvento) 423 .append(divTags); 424 425 $('main #sp-conteudo-do-site .sp-column').prepend(divTemplate); 426} 427 428function retornaData(){ 429 var dataInicio = $('.fields-container') 430 .children('.data-hora-inicio') 431 .children('.field-value') 432 .text() 433 .split(' ')[0]; 434 435 var periodo = formatarData(dataInicio); 436 437 var dataFim = ''; 438 439 var iconeCalendario = ''; 440 441 if(typeof $('.fields-container').children('.data-hora-fim') != undefined){ 442 dataFim = $('.fields-container') 443 .children('.data-hora-fim') 444 .children('.field-value') 445 .text() 446 .split(' ')[0]; 447 } 448 449 if(dataFim != ''){ 450 var diaInicio = dataInicio.split('-')[2]; 451 452 periodo = diaInicio+' a '+formatarData(dataFim); 453 } 454 455 if(dataFim != '' && verificarDatasIguas(dataInicio, dataFim)){ 456 periodo = formatarData(dataFim); 457 } 458 459 if(periodo != '') 460 iconeCalendario = $('<img>').addClass('icone-calendario-evento') 461 .attr('src', '/assets/img/icones/calendario_inova_azul.svg'); 462 463 var divData = $('<div>').addClass('data-evento') 464 .append(iconeCalendario) 465 .append(periodo); 466 467 return divData; 468} 469 470function formatarData(data) { 471 if (data.indexOf('.') > -1) { 472 arrData = data.split('.'); 473 arrData[2] = '20' + arrData[2]; 474 475 return arrData.join('/'); 476 } 477 478 if(data.indexOf('-') > -1){ 479 arrData = data.split('-'); 480 return arrData.reverse().join('/'); 481 } 482 return ''; 483} 484 485 486function alterarMetaDatePublishedStringParaData() { 487 $('time').each(function () { 488 var metaDateSplited = $(this).html().split(':'); 489 490 if (metaDateSplited.length >= 2) { 491 var splitedDate = metaDateSplited[1].split(' '); 492 var stringMonth = splitedDate[2]; 493
494 var month = stringDataParaData(stringMonth); 495 496 var date = metaDateSplited[0] + ': ' + splitedDate[1] + '/' + month + '/' + splitedDate[3]; 497 $(this).html(date); 498 499 } else { 500 var splitedDate = metaDateSplited[0].split(' '); 501 var stringMonth = splitedDate[1]; 502 503 var month = stringDataParaData(stringMonth); 504 505 var date = splitedDate[0] + '/' + month + '/' + splitedDate[2]; 506 $(this).html(date); 507 } 508 509 }); 510 511} 512 513function stringDataParaData(stringMonth) { 514 var month = ''; 515 516 switch (stringMonth) { 517 case 'Jan': 518 case 'January': 519 case 'Janeiro': 520 month = '01'; 521 break; 522 523 case 'Fev': 524 case 'Fevereiro': 525 case 'Feb': 526 case 'February': 527 month = '02'; 528 break; 529 530 case 'Mar': 531 case 'Março': 532 case 'March': 533 month = '03'; 534 break; 535 536 case 'Abr': 537 case 'Abril': 538 case 'Apr': 539 case 'April': 540 month = '04'; 541 break; 542 543 case 'Mai': 544 case 'May': 545 case 'Maio': 546 month = '05'; 547 break; 548 549 case 'Junho': 550 case 'June': 551 case 'Jun': 552 month = '06'; 553 break; 554 555 case 'Julho': 556 case 'July': 557 case 'Jul': 558 month = '07'; 559 break; 560 561 case 'Agosto': 562 case 'Ago': 563 case 'August': 564 case 'Aug': 565 month = '08'; 566 break; 567 568 case 'Setembro': 569 case 'Set': 570 case 'September': 571 case 'Sep': 572 month = '09'; 573 break; 574 575 case 'Outubro': 576 case 'Out': 577 case 'October': 578 case 'Oct': 579 month = '10'; 580 break; 581 582 case 'Novembro': 583 case 'Nov': 584 case 'November': 585 month = '11'; 586 break; 587 588 case 'Dezembro': 589 case 'Dez': 590 case 'December': 591 case 'Dec': 592 month = '12'; 593 break; 594 } 595 596 return month; 597} 598 599function chamaJS(){ 600 var path = window.location.pathname.replace(/\/$/, ""); 601 var splitUrl = path.split("/").reverse(); 602 var hostname = window.location.hostname; 603 var port = window.location.port ? ":" + window.location.port : ""; 604 var hostWithPort = hostname + port; 605 var hostWithoutPort = hostname; 606 607 608 if ((splitUrl[0] === hostWithPort) || (splitUrl[0] === hostWithoutPort)) { 609 splitUrl[0] = ""; 610 } 611 612 if (splitUrl.length >= 2 && splitUrl[0] === "eventos" && splitUrl[1] === "conteudos") { 613 return false; 614 } 615 616 if (splitUrl.length >= 3 && 617 (splitUrl[0] === "evento-detalhe" || splitUrl[0] === "detalhe") && 618 splitUrl[1] === "eventos" && splitUrl[2] === "conteudos") { 619 return false; 620 } 621 622 if (splitUrl[1] === "eventos-inovacao") { 623 return true; 624 } 625 if ( 626 splitUrl[1] === "eventos" 627 || splitUrl[1] === "eventos-nacionais" 628 || splitUrl[1] === "evento-nacional" 629 || splitUrl[1] === "eventos-estaduais" 630 || splitUrl[1] === "demais-eventos" 631 || splitUrl[1] === "eventos-sistema-ocepar" 632 ) { 633 if($('ul.fields-container').length > 0){ 634 return true; 635 } 636 637 var template = $("[itemprop=\"articleBody\"]").find(".template-eventos").attr("id"); 638 $("li.field-entry.posicao-destaque-home").remove(); 639 640 switch (template) { 641 case "template-eventos-001": 642 case "template-eventos-003": 643 $("head").append("<script src='/assets/js/evento-interna-template-001.js'></script>"); 644 break; 645 646 case "template-eventos-002": 647 $("head").append("<script src='/assets/js/evento-interna-template-002.js'></script>"); 648 break; 649 650 case "template-eventos-004": 651 $("head").append("<script src='/assets/js/evento-interna-template-004.js'></script>"); 652 break; 653 654 case "eventos-hibridos": 655 $("head").append("<script src='/assets/js/eventos-hibridos.js'></script>"); 656 break; 657 658 default: 659 return true; 660 //$("head").append("<script src='/assets/js/evento-interna.js'></script>"); 661 break; 662 } 663 664 } 665 return false;
666} 667 668function verificarDatasIguas(data1, data2){ 669 var date1 = new Date(data1); 670 var date2 = new Date(data2); 671 672 673 if (date1.getTime() === date2.getTime()) { 674 return true; 675 } 676 return false; 677} 678 679function mostrarFormulario(){ 680 if(!$('.boxModulos').is(':visible')){ 681 $('[name="cf[nome_evento]"]').val($('.titulo-evento').text()); 682 $('.boxModulos').show(); 683 $('.linkPosEvento').hide(); 684 } 685}
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.