function toggleNextSibling (e) {
if (e.nextSibling.style.display=='none') {
e.nextSibling.style.display='block';
} else { e.nextSibling.style.display='none'; }
}
// Globals used by SEC loader (Show.js)
window.SEC_ALIAS_DIR = "";
window.RFV_MENU = [{"category":"Cover","reports":[{"label":"Document and Entity Information","pos":1,"url":"R1.htm"}]},{"category":"Financial Statements","reports":[{"label":"Condensed Consolidated Statement of Income (Unaudited)","pos":2,"url":"R2.htm"},{"label":"Condensed Consolidated Statement of Comprehensive Income (Unaudited)","pos":3,"url":"R3.htm"},{"label":"Condensed Consolidated Balance Sheet (Unaudited)","pos":4,"url":"R4.htm"},{"label":"Condensed Consolidated Balance Sheet (Unaudited) (Parenthetical)","pos":5,"url":"R5.htm"},{"label":"Condensed Consolidated Statement of Cash Flows (Unaudited)","pos":6,"url":"R6.htm"},{"label":"Condensed Consolidated Statement of Shareholders' Equity","pos":7,"url":"R7.htm"}]},{"category":"Notes to Financial Statements","reports":[{"label":"Insider Trading Arrangements","pos":8,"url":"R8.htm"},{"label":"Description of Business and Basis of Presentation","pos":9,"url":"R9.htm"},{"label":"Recently Issued Accounting Standards","pos":10,"url":"R10.htm"},{"label":"Warranty","pos":11,"url":"R11.htm"},{"label":"Credit Facilities","pos":12,"url":"R12.htm"},{"label":"Derivative Instruments","pos":13,"url":"R13.htm"},{"label":"Income Taxes","pos":14,"url":"R14.htm"},{"label":"Earnings Per Share","pos":15,"url":"R15.htm"},{"label":"Stock-Based Compensation","pos":16,"url":"R16.htm"},{"label":"Other Expense, Net","pos":17,"url":"R17.htm"},{"label":"Accumulated Other Comprehensive Loss by Component","pos":18,"url":"R18.htm"},{"label":"Related Party","pos":19,"url":"R19.htm"},{"label":"Segment Information","pos":20,"url":"R20.htm"},{"label":"Commitments and Contingencies","pos":21,"url":"R21.htm"}]},{"category":"Notes Tables","reports":[{"label":"Warranty (Tables)","pos":22,"url":"R22.htm"},{"label":"Derivative Instruments (Tables)","pos":23,"url":"R23.htm"},{"label":"Income Taxes (Tables)","pos":24,"url":"R24.htm"},{"label":"Earnings Per Share (Tables)","pos":25,"url":"R25.htm"},{"label":"Stock-Based Compensation (Tables)","pos":26,"url":"R26.htm"},{"label":"Other Expense, Net (Tables)","pos":27,"url":"R27.htm"},{"label":"Accumulated Other Comprehensive Loss by Component (Tables)","pos":28,"url":"R28.htm"},{"label":"Related Party (Tables)","pos":29,"url":"R29.htm"},{"label":"Segment Information (Tables)","pos":30,"url":"R30.htm"}]},{"category":"Notes Details","reports":[{"label":"Warranty - Changes in Warranty Reserve (Details)","pos":31,"url":"R31.htm"},{"label":"Credit Facilities (Details Textual)","pos":32,"url":"R32.htm"},{"label":"Derivative Instruments - Additional Information (Details)","pos":33,"url":"R33.htm"},{"label":"Derivative Instruments - Schedule of Fair Value Derivative Instruments Not Designated As Hedging Instruments (Details)","pos":34,"url":"R34.htm"},{"label":"Income Taxes (Details Textual)","pos":35,"url":"R35.htm"},{"label":"Income Taxes - Schedule of Income Tax Expense and Effective Tax Rate (Details)","pos":36,"url":"R36.htm"},{"label":"Earnings Per Share - Reconciliation of the Components of Basic and Diluted Per Share (Details)","pos":37,"url":"R37.htm"},{"label":"Stock-Based Compensation (Details Textual)","pos":38,"url":"R38.htm"},{"label":"Stock-Based Compensation - Summary of Restricted Stock Awards And Performance Stock Unit Activity (Details)","pos":39,"url":"R39.htm"},{"label":"Other Expense , Net - Summary of Components of Other (Expense) Income, Net (Details)","pos":40,"url":"R40.htm"},{"label":"Accumulated Other Comprehensive Loss by Component - Summary of Changes in Accumulated Other Comprehensive Loss (Details)","pos":41,"url":"R41.htm"},{"label":"Related Party (Details Textual)","pos":42,"url":"R42.htm"},{"label":"Related Party - Summary of Related Party Transaction (Details)","pos":43,"url":"R43.htm"},{"label":"Segment Information (Details Textual)","pos":44,"url":"R44.htm"},{"label":"Segment Information - Schedule of Significant Expenses Disclosed in Consolidated Statements of Income (Details)","pos":45,"url":"R45.htm"},{"label":"Segment Information - Schedule of Sales by Product Line (Details)","pos":46,"url":"R46.htm"},{"label":"Segment Information - Schedule of Sales to Largest Customers (Details)","pos":47,"url":"R47.htm"},{"label":"Segment Information - Schedule of Receivables from Largest Customers (Details)","pos":48,"url":"R48.htm"}]},{"allReports":{"1":"R1.htm","2":"R2.htm","3":"R3.htm","4":"R4.htm","5":"R5.htm","6":"R6.htm","7":"R7.htm","8":"R8.htm","9":"R9.htm","10":"R10.htm","11":"R11.htm","12":"R12.htm","13":"R13.htm","14":"R14.htm","15":"R15.htm","16":"R16.htm","17":"R17.htm","18":"R18.htm","19":"R19.htm","20":"R20.htm","21":"R21.htm","22":"R22.htm","23":"R23.htm","24":"R24.htm","25":"R25.htm","26":"R26.htm","27":"R27.htm","28":"R28.htm","29":"R29.htm","30":"R30.htm","31":"R31.htm","32":"R32.htm","33":"R33.htm","34":"R34.htm","35":"R35.htm","36":"R36.htm","37":"R37.htm","38":"R38.htm","39":"R39.htm","40":"R40.htm","41":"R41.htm","42":"R42.htm","43":"R43.htm","44":"R44.htm","45":"R45.htm","46":"R46.htm","47":"R47.htm","48":"R48.htm","49":"ALL_REPORTS_SYNTHETIC"}}];
window.R_FILES_BY_POS = RFV_MENU.find(o => 'allReports' in o)?.allReports;
function scrollMainContentToTop() {
// Scroll to company info instead of top of page header
const anchor = document.getElementById('company-info');
if (anchor) {
anchor.scrollIntoView({
block: 'start', // top-align it
behavior: 'auto' // no animation unless desired
});
}
}
window.RENDERING_LOGS = RFV_MENU.find(o => 'renderingLogs' in o)?.renderingLogs;
// Log viewer renders selected log into #reportDiv
window.showRenderingLog = function () {
const root = ensureShadow();
clearShadow();
let baseDir = (typeof window.SEC_ALIAS_DIR === 'string' && window.SEC_ALIAS_DIR.length)
? window.SEC_ALIAS_DIR.replace(/\/$/, '')
: (location.pathname.replace(/\/[^/]*$/, '') || '/');
if (!baseDir.endsWith('/')) baseDir += '/';
const reportCssHref = `${baseDir}report.css`; // same folder as R1.htm
const logEntries = window.RENDERING_LOGS || [];
const rows = logEntries.map(entry => {
const type = entry?.type || 'Info';
const text = (entry?.text || '').replace(/\r\n|\r|\n/g, '
');
const cls = type.slice(0,4).toLowerCase(); // 'erro', 'warn', 'info', etc.
return `
| The rendering log information below will not appear on the EDGAR web site. |
|---|