{"id":24797,"date":"2026-09-02T05:45:50","date_gmt":"2026-09-02T05:45:50","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24797"},"modified":"2026-09-02T05:45:53","modified_gmt":"2026-09-02T05:45:53","slug":"strain-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/strain-calculator\/","title":{"rendered":"Strain Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Strain Calculator<\/strong> is a practical engineering tool designed to calculate engineering strain, normal strain, lateral strain, shear strain, and elastic strain from dimensional changes, stress, and material properties. It helps engineers quickly evaluate deformation under tensile, compressive, or shear loading and convert results between decimal strain, percentage strain, microstrain, and millistrain. The Strain Calculator is useful for material testing, mechanical design, structural analysis, and preliminary deformation checks across a wide range of engineering applications.<\/p>\n\n\n\n<!-- WordPress Custom HTML Block: copy ALL content below -->\n<!-- Do NOT wrap in DOCTYPE\/html\/head\/body. Use Code Editor mode. -->\n<!-- All CSS\/JS scoped to #sc-calculator. Will NOT affect theme header, footer, menus, or other page content. -->\n<style>\n\/* Strain Calculator - WordPress-safe scoped styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #sc-calculator.\n * Will NOT affect theme header, footer, sidebar, menus, or other page content.\n * No html, body, :root, or unscoped universal selectors.\n *\/\n\n#sc-calculator.sc-calculator,\n#sc-calculator.sc-calculator *,\n#sc-calculator.sc-calculator *::before,\n#sc-calculator.sc-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n#sc-calculator.sc-calculator {\n    all: revert;\n    --sc-primary: #1a5276;\n    --sc-primary-light: #2471a3;\n    --sc-primary-dark: #0e3352;\n    --sc-accent: #e67e22;\n    --sc-safe: #27ae60;\n    --sc-caution: #f39c12;\n    --sc-danger: #c0392b;\n    --sc-neutral: #7f8c8d;\n    --sc-bg: #ecf0f1;\n    --sc-card-bg: #ffffff;\n    --sc-border: #d5dbdb;\n    --sc-text: #2c3e50;\n    --sc-text-muted: #5d6d7e;\n    --sc-shadow: 0 2px 12px rgba(26, 82, 118, 0.08);\n    --sc-radius: 8px;\n    --sc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --sc-mono: 'Consolas', 'Courier New', monospace;\n\n    box-sizing: border-box !important;\n    display: block !important;\n    max-width: 1000px !important;\n    width: 100% !important;\n    margin: 0 auto !important;\n    padding: 1.5rem 1rem !important;\n    font-family: var(--sc-font) !important;\n    color: var(--sc-text) !important;\n    line-height: 1.6 !important;\n    font-size: 16px !important;\n    text-align: left !important;\n    background: transparent !important;\n    border: none !important;\n    float: none !important;\n    clear: none !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    z-index: auto;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    box-shadow: none !important;\n}\n\n#sc-calculator.sc-calculator [hidden] {\n    display: none !important;\n}\n\n#sc-calculator.sc-calculator h1,\n#sc-calculator.sc-calculator h2,\n#sc-calculator.sc-calculator h3,\n#sc-calculator.sc-calculator h4,\n#sc-calculator.sc-calculator p,\n#sc-calculator.sc-calculator ul,\n#sc-calculator.sc-calculator ol,\n#sc-calculator.sc-calculator li,\n#sc-calculator.sc-calculator section,\n#sc-calculator.sc-calculator div,\n#sc-calculator.sc-calculator span,\n#sc-calculator.sc-calculator strong,\n#sc-calculator.sc-calculator em,\n#sc-calculator.sc-calculator sub,\n#sc-calculator.sc-calculator sup {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    font-family: inherit !important;\n    font-size: inherit !important;\n    font-weight: inherit !important;\n    font-style: inherit !important;\n    line-height: inherit !important;\n    color: inherit !important;\n    letter-spacing: inherit !important;\n    text-transform: none !important;\n    text-decoration: none !important;\n    float: none !important;\n}\n\n#sc-calculator.sc-calculator button,\n#sc-calculator.sc-calculator input,\n#sc-calculator.sc-calculator select,\n#sc-calculator.sc-calculator label,\n#sc-calculator.sc-calculator legend,\n#sc-calculator.sc-calculator summary {\n    font: inherit !important;\n    font-family: var(--sc-font) !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n}\n\n#sc-calculator.sc-calculator ul,\n#sc-calculator.sc-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#sc-calculator.sc-calculator button {\n    cursor: pointer !important;\n    background: transparent !important;\n    border: none !important;\n    padding: 0 !important;\n    box-shadow: none !important;\n    text-decoration: none !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n    text-transform: none !important;\n    min-height: unset !important;\n    height: auto !important;\n    width: auto !important;\n}\n\n#sc-calculator.sc-calculator input[type=\"number\"],\n#sc-calculator.sc-calculator input[type=\"checkbox\"],\n#sc-calculator.sc-calculator select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    padding: 0.55rem 0.75rem !important;\n    border: 1px solid var(--sc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--sc-font) !important;\n    background: #ffffff !important;\n    color: var(--sc-text) !important;\n    min-height: 38px !important;\n    outline: none !important;\n    box-shadow: none !important;\n    margin: 0 !important;\n    line-height: 1.4 !important;\n    appearance: auto !important;\n    -webkit-appearance: auto !important;\n}\n\n#sc-calculator.sc-calculator .sc-input-section legend {\n    display: block !important;\n    float: none !important;\n    width: 100% !important;\n    font-weight: 600 !important;\n    color: var(--sc-primary-dark) !important;\n    font-size: 0.9rem !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.04em !important;\n    margin: 0 0 0.75rem 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: transparent !important;\n    font-family: var(--sc-font) !important;\n    line-height: 1.4 !important;\n}\n\n#sc-calculator.sc-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#sc-calculator.sc-calculator sub,\n#sc-calculator.sc-calculator sup {\n    font-size: 75% !important;\n    line-height: 0 !important;\n    position: relative !important;\n    vertical-align: baseline !important;\n}\n\n#sc-calculator.sc-calculator sub { bottom: -0.2em !important; }\n#sc-calculator.sc-calculator sup { top: -0.45em !important; }\n\n#sc-calculator.sc-calculator div,\n#sc-calculator.sc-calculator section,\n#sc-calculator.sc-calculator form,\n#sc-calculator.sc-calculator fieldset,\n#sc-calculator.sc-calculator details {\n    float: none !important;\n    clear: none !important;\n    max-width: none;\n}\n\n#sc-calculator.sc-calculator form {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: transparent !important;\n}\n\n#sc-calculator.sc-calculator fieldset {\n    border: none !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    min-width: 0 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n}\n\n#sc-calculator.sc-calculator fieldset.sc-input-section {\n    border: none !important;\n    margin: 0 0 1.25rem 0 !important;\n    padding: 0 !important;\n    min-width: 0 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n}\n\n#sc-calculator.sc-calculator .sc-card {\n    background: var(--sc-card-bg) !important;\n    border-radius: var(--sc-radius) !important;\n    box-shadow: var(--sc-shadow) !important;\n    border: 1px solid var(--sc-border) !important;\n    padding: 1.5rem !important;\n    margin: 0 0 1.5rem 0 !important;\n}\n\n#sc-calculator.sc-calculator .sc-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.5rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-panel-header {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    align-items: center !important;\n    justify-content: space-between !important;\n    gap: 0.75rem !important;\n    margin-bottom: 1.25rem !important;\n    padding-bottom: 0.75rem !important;\n    border-bottom: 2px solid var(--sc-bg) !important;\n}\n\n#sc-calculator.sc-calculator .sc-panel-header h2 {\n    font-size: 1.25rem !important;\n    color: var(--sc-primary) !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    font-weight: 600 !important;\n    line-height: 1.3 !important;\n}\n\n#sc-calculator.sc-calculator .sc-unit-toggle {\n    display: flex !important;\n    flex-direction: row !important;\n    border-radius: var(--sc-radius) !important;\n    overflow: hidden !important;\n    border: 1px solid var(--sc-border) !important;\n}\n\n#sc-calculator.sc-calculator button.sc-unit-btn {\n    display: inline-block !important;\n    padding: 0.4rem 1rem !important;\n    border: none !important;\n    border-radius: 0 !important;\n    background: var(--sc-bg) !important;\n    color: var(--sc-text-muted) !important;\n    cursor: pointer !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    line-height: 1.4 !important;\n    transition: background 0.2s !important;\n}\n\n#sc-calculator.sc-calculator button.sc-unit-btn.sc-active {\n    background: var(--sc-primary) !important;\n    color: #ffffff !important;\n}\n\n#sc-calculator.sc-calculator button.sc-unit-btn:hover:not(.sc-active) {\n    background: #dfe6e9 !important;\n}\n\n#sc-calculator.sc-calculator .sc-form-row {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-form-group {\n    display: block !important;\n    margin-bottom: 0.85rem !important;\n    width: 100% !important;\n}\n\n#sc-calculator.sc-calculator .sc-form-group label {\n    display: block !important;\n    font-size: 0.875rem !important;\n    font-weight: 600 !important;\n    margin: 0 0 0.35rem 0 !important;\n    color: var(--sc-text) !important;\n}\n\n#sc-calculator.sc-calculator .sc-optional {\n    font-weight: 400 !important;\n    color: var(--sc-text-muted) !important;\n    font-size: 0.8rem !important;\n}\n\n#sc-calculator.sc-calculator input[type=\"number\"]:focus,\n#sc-calculator.sc-calculator input[type=\"checkbox\"]:focus,\n#sc-calculator.sc-calculator select:focus {\n    border-color: var(--sc-primary-light) !important;\n    box-shadow: 0 0 0 3px rgba(36, 113, 163, 0.15) !important;\n}\n\n#sc-calculator.sc-calculator .sc-input-with-unit {\n    display: flex !important;\n    flex-direction: row !important;\n    align-items: stretch !important;\n    gap: 0.5rem !important;\n    width: 100% !important;\n}\n\n#sc-calculator.sc-calculator .sc-input-with-unit input[type=\"number\"] {\n    flex: 1 1 auto !important;\n    width: auto !important;\n    min-width: 0 !important;\n}\n\n#sc-calculator.sc-calculator .sc-unit-label {\n    display: flex !important;\n    align-items: center !important;\n    flex-shrink: 0 !important;\n    padding: 0 0.65rem !important;\n    background: var(--sc-bg) !important;\n    border: 1px solid var(--sc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.8rem !important;\n    font-weight: 600 !important;\n    color: var(--sc-text-muted) !important;\n    white-space: nowrap !important;\n    min-width: 3rem !important;\n    justify-content: center !important;\n}\n\n#sc-calculator.sc-calculator select.sc-inline-unit {\n    width: auto !important;\n    flex: 0 0 auto !important;\n    min-width: 4.5rem !important;\n    padding: 0.55rem 0.5rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-tooltip {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    width: 16px !important;\n    height: 16px !important;\n    border-radius: 50% !important;\n    background: var(--sc-primary-light) !important;\n    color: #ffffff !important;\n    font-size: 0.65rem !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    vertical-align: middle !important;\n    margin-left: 0.25rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-tooltip::after {\n    content: attr(data-tip) !important;\n    position: absolute !important;\n    bottom: calc(100% + 6px) !important;\n    left: 50% !important;\n    transform: translateX(-50%) !important;\n    background: var(--sc-primary-dark) !important;\n    color: #ffffff !important;\n    padding: 0.4rem 0.6rem !important;\n    border-radius: 4px !important;\n    font-size: 0.75rem !important;\n    font-weight: 400 !important;\n    white-space: normal !important;\n    width: max-content !important;\n    max-width: 220px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n    transition: opacity 0.2s !important;\n    z-index: 100 !important;\n}\n\n#sc-calculator.sc-calculator .sc-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#sc-calculator.sc-calculator .sc-ref-note {\n    font-size: 0.8rem !important;\n    color: var(--sc-text-muted) !important;\n    margin: 0.5rem 0 0 !important;\n    font-style: italic !important;\n}\n\n#sc-calculator.sc-calculator .sc-hidden {\n    display: none !important;\n}\n\n#sc-calculator.sc-calculator .sc-form-actions {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    justify-content: center !important;\n    gap: 0.75rem !important;\n    margin-top: 1rem !important;\n}\n\n#sc-calculator.sc-calculator button.sc-btn {\n    display: inline-block !important;\n    padding: 0.75rem 1.5rem !important;\n    border: none !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-weight: 600 !important;\n    cursor: pointer !important;\n    transition: transform 0.2s, box-shadow 0.2s !important;\n}\n\n#sc-calculator.sc-calculator button.sc-btn-primary {\n    background: linear-gradient(135deg, var(--sc-primary) 0%, var(--sc-primary-light) 100%) !important;\n    color: #ffffff !important;\n    min-width: 220px !important;\n}\n\n#sc-calculator.sc-calculator button.sc-btn-primary:hover {\n    transform: translateY(-1px) !important;\n    box-shadow: 0 4px 12px rgba(26, 82, 118, 0.3) !important;\n}\n\n#sc-calculator.sc-calculator button.sc-btn-secondary {\n    background: var(--sc-bg) !important;\n    color: var(--sc-text) !important;\n    border: 1px solid var(--sc-border) !important;\n}\n\n#sc-calculator.sc-calculator button.sc-btn-secondary:hover {\n    background: #dfe6e9 !important;\n}\n\n#sc-calculator.sc-calculator .sc-status-badge {\n    display: inline-block !important;\n    padding: 0.35rem 0.85rem !important;\n    border-radius: 20px !important;\n    font-size: 0.8rem !important;\n    font-weight: 700 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n}\n\n#sc-calculator.sc-calculator .sc-status-neutral {\n    background: #ecf0f1 !important;\n    color: var(--sc-neutral) !important;\n}\n\n#sc-calculator.sc-calculator .sc-status-safe {\n    background: rgba(39, 174, 96, 0.15) !important;\n    color: var(--sc-safe) !important;\n    border: 1px solid var(--sc-safe) !important;\n}\n\n#sc-calculator.sc-calculator .sc-status-caution {\n    background: rgba(243, 156, 18, 0.15) !important;\n    color: #d68910 !important;\n    border: 1px solid var(--sc-caution) !important;\n}\n\n#sc-calculator.sc-calculator .sc-status-danger {\n    background: rgba(192, 57, 43, 0.12) !important;\n    color: var(--sc-danger) !important;\n    border: 1px solid var(--sc-danger) !important;\n}\n\n#sc-calculator.sc-calculator .sc-error-box,\n#sc-calculator.sc-calculator .sc-warning-box {\n    padding: 0.85rem 1rem !important;\n    border-radius: 6px !important;\n    margin-bottom: 1rem !important;\n    font-size: 0.9rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-error-box {\n    background: rgba(192, 57, 43, 0.08) !important;\n    border: 1px solid var(--sc-danger) !important;\n    color: var(--sc-danger) !important;\n}\n\n#sc-calculator.sc-calculator .sc-warning-box {\n    background: rgba(243, 156, 18, 0.08) !important;\n    border: 1px solid var(--sc-caution) !important;\n    color: #b7950b !important;\n}\n\n#sc-calculator.sc-calculator .sc-error-box ul,\n#sc-calculator.sc-calculator .sc-warning-box ul {\n    margin: 0.35rem 0 0 1.25rem !important;\n    padding: 0 !important;\n    list-style: disc !important;\n}\n\n#sc-calculator.sc-calculator .sc-results-grid {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)) !important;\n    gap: 0.75rem !important;\n    margin-bottom: 1.25rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-result-item {\n    background: var(--sc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--sc-border) !important;\n}\n\n#sc-calculator.sc-calculator .sc-result-label {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--sc-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-result-value {\n    display: block !important;\n    font-size: 1.1rem !important;\n    font-weight: 700 !important;\n    color: var(--sc-primary) !important;\n    font-family: var(--sc-mono) !important;\n}\n\n#sc-calculator.sc-calculator .sc-result-sub {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--sc-text-muted) !important;\n    margin-top: 0.15rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-recommendations {\n    background: rgba(36, 113, 163, 0.06) !important;\n    border: 1px solid rgba(36, 113, 163, 0.2) !important;\n    border-radius: 6px !important;\n    padding: 0.85rem 1rem !important;\n    margin-bottom: 1.25rem !important;\n    font-size: 0.875rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-recommendations h3 {\n    font-size: 0.9rem !important;\n    color: var(--sc-primary) !important;\n    margin: 0 0 0.5rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-recommendations ul {\n    margin: 0 !important;\n    padding-left: 1.25rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-recommendations li {\n    list-style: disc !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-visual-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#sc-calculator.sc-calculator .sc-viz-wide {\n    grid-column: 1 \/ -1 !important;\n}\n\n#sc-calculator.sc-calculator .sc-viz-card {\n    background: var(--sc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--sc-border) !important;\n}\n\n#sc-calculator.sc-calculator .sc-viz-card h3 {\n    font-size: 0.8rem !important;\n    color: var(--sc-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin: 0 0 0.5rem 0 !important;\n    text-align: center !important;\n    font-weight: 600 !important;\n}\n\n@media (max-width: 600px) {\n    #sc-calculator.sc-calculator .sc-form-row {\n        grid-template-columns: 1fr !important;\n    }\n\n    #sc-calculator.sc-calculator button.sc-btn-primary,\n    #sc-calculator.sc-calculator button.sc-btn-secondary {\n        width: 100% !important;\n    }\n}\n\n@media (max-width: 700px) {\n    #sc-calculator.sc-calculator .sc-visual-grid {\n        grid-template-columns: 1fr !important;\n    }\n\n    #sc-calculator.sc-calculator .sc-viz-wide {\n        grid-column: auto !important;\n    }\n}\n\n#sc-calculator.sc-calculator .sc-result-highlight {\n    border-color: var(--sc-primary-light) !important;\n    background: rgba(36, 113, 163, 0.08) !important;\n}\n\n#sc-calculator.sc-calculator .sc-sign-convention {\n    font-size: 0.85rem !important;\n    color: var(--sc-text-muted) !important;\n    background: var(--sc-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.6rem 0.85rem !important;\n    margin-bottom: 1rem !important;\n    border-left: 3px solid var(--sc-accent) !important;\n}\n\n#sc-calculator.sc-calculator .sc-checkbox-group {\n    margin-bottom: 0 !important;\n}\n\n#sc-calculator.sc-calculator .sc-checkbox-label {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.5rem !important;\n    font-size: 0.875rem !important;\n    font-weight: 500 !important;\n    cursor: pointer !important;\n}\n\n#sc-calculator.sc-calculator .sc-checkbox-label input[type=\"checkbox\"] {\n    width: auto !important;\n    min-height: unset !important;\n    margin: 0 !important;\n}\n\n@media print {\n    #sc-calculator.sc-calculator .sc-form-actions,\n    #sc-calculator.sc-calculator .sc-unit-toggle {\n        display: none !important;\n    }\n}\n\n\n<\/style>\n<div id=\"sc-calculator\" class=\"sc-calculator\">\n        <div class=\"sc-layout\">\n\n            <section class=\"sc-input-panel sc-card\" aria-label=\"Calculator inputs\">\n                <div class=\"sc-panel-header\">\n                    <h2>Strain Calculator<\/h2>\n                    <div class=\"sc-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                        <button type=\"button\" class=\"sc-unit-btn sc-active\" data-unit=\"metric\">Metric<\/button>\n                        <button type=\"button\" class=\"sc-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n                    <\/div>\n                <\/div>\n\n                <form id=\"sc-calcForm\" novalidate>\n                    <fieldset class=\"sc-input-section\">\n                        <legend>Calculation Mode<\/legend>\n                        <div class=\"sc-form-row\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-calcMode\">Mode<\/label>\n                                <select id=\"sc-calcMode\" name=\"calcMode\">\n                                    <option value=\"normalStrain\" selected>Normal \/ Engineering Strain<\/option>\n                                    <option value=\"lateralStrain\">Lateral Strain<\/option>\n                                    <option value=\"shearStrain\">Shear Strain<\/option>\n                                    <option value=\"elasticStrain\">Elastic Strain from Stress<\/option>\n                                    <option value=\"elongation\">Elongation from Strain<\/option>\n                                    <option value=\"finalLength\">Final Length from Strain<\/option>\n                                    <option value=\"conversion\">Strain Unit Conversion<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"sc-form-group sc-mode-field\" data-mode=\"normalStrain lateralStrain shearStrain elasticStrain\">\n                                <label for=\"sc-inputMethod\">Input Method<\/label>\n                                <select id=\"sc-inputMethod\" name=\"inputMethod\"><\/select>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-option-row\" data-mode=\"normalStrain\">\n                            <div class=\"sc-form-group sc-checkbox-group\">\n                                <label class=\"sc-checkbox-label\">\n                                    <input type=\"checkbox\" id=\"sc-showTrueStrain\" name=\"showTrueStrain\" checked>\n                                    Calculate true strain (&epsilon;<sub>true<\/sub> = ln(L<sub>f<\/sub>\/L<sub>0<\/sub>))\n                                <\/label>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-option-row\" data-mode=\"shearStrain\" data-method=\"angle\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-shearAngleMethod\">Shear Angle Method<\/label>\n                                <select id=\"sc-shearAngleMethod\" name=\"shearAngleMethod\">\n                                    <option value=\"small\" selected>Small-angle approximation (&gamma; &asymp; &theta;)<\/option>\n                                    <option value=\"exact\">Exact (&gamma; = tan &theta;)<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"sc-input-section sc-geometry-section\">\n                        <legend>Geometry &amp; Deformation<\/legend>\n\n                        <div class=\"sc-form-row sc-length-field\" data-mode=\"normalStrain elongation finalLength\" data-method=\"originalFinal\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-originalLength\">\n                                    Original Length (L<sub>0<\/sub>)\n                                    <span class=\"sc-tooltip\" data-tip=\"Original axial dimension before deformation\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-originalLength\" name=\"originalLength\" value=\"100\" min=\"0.001\" step=\"any\">\n                                    <select id=\"sc-lengthUnit\" class=\"sc-inline-unit\" aria-label=\"Length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-finalLength\">\n                                    Final Length (L<sub>f<\/sub>)\n                                    <span class=\"sc-tooltip\" data-tip=\"Length after deformation\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-finalLength\" name=\"finalLength\" value=\"100.2\" min=\"0.001\" step=\"any\">\n                                    <select id=\"sc-finalLengthUnit\" class=\"sc-inline-unit\" aria-label=\"Final length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-change-field\" data-mode=\"normalStrain\" data-method=\"changeLength\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-originalLength2\">Original Length (L<sub>0<\/sub>)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-originalLength2\" name=\"originalLength2\" value=\"100\" min=\"0.001\" step=\"any\">\n                                    <select id=\"sc-lengthUnit2\" class=\"sc-inline-unit\" aria-label=\"Length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-lengthChange\">\n                                    Change in Length (&Delta;L)\n                                    <span class=\"sc-tooltip\" data-tip=\"Positive for elongation (tension), negative for shortening (compression)\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-lengthChange\" name=\"lengthChange\" value=\"0.2\" step=\"any\">\n                                    <select id=\"sc-lengthChangeUnit\" class=\"sc-inline-unit\" aria-label=\"Length change unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-width-field\" data-mode=\"lateralStrain\" data-method=\"widthChange\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-originalWidth\">Original Width (w<sub>0<\/sub>)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-originalWidth\" name=\"originalWidth\" value=\"20\" min=\"0.001\" step=\"any\">\n                                    <span class=\"sc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-widthChange\">Change in Width (&Delta;w)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-widthChange\" name=\"widthChange\" value=\"-0.012\" step=\"any\">\n                                    <select id=\"sc-widthChangeUnit\" class=\"sc-inline-unit\" aria-label=\"Width change unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-diameter-field\" data-mode=\"lateralStrain\" data-method=\"diameterChange\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-originalDiameter\">Original Diameter (d<sub>0<\/sub>)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-originalDiameter\" name=\"originalDiameter\" value=\"10\" min=\"0.001\" step=\"any\">\n                                    <span class=\"sc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-diameterChange\">Change in Diameter (&Delta;d)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-diameterChange\" name=\"diameterChange\" value=\"-0.006\" step=\"any\">\n                                    <select id=\"sc-diameterChangeUnit\" class=\"sc-inline-unit\" aria-label=\"Diameter change unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-poisson-lateral-field\" data-mode=\"lateralStrain\" data-method=\"poisson\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-longStrainInput\">\n                                    Longitudinal Strain (&epsilon;<sub>long<\/sub>)\n                                    <span class=\"sc-tooltip\" data-tip=\"Axial strain \u2014 positive in tension\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-longStrainInput\" name=\"longStrainInput\" value=\"0.002\" step=\"any\">\n                                    <select id=\"sc-longStrainUnit\" class=\"sc-inline-unit\" aria-label=\"Longitudinal strain unit\">\n                                        <option value=\"dimensionless\">&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                        <option value=\"micro\">\u03bc\u03b5<\/option>\n                                        <option value=\"milli\">m\u03b5<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-poisson\">\n                                    Poisson&#8217;s Ratio (&nu;)\n                                    <span class=\"sc-tooltip\" data-tip=\"\u03b5<sub>lateral<\/sub> = \u2212\u03bd \u00d7 \u03b5<sub>longitudinal<\/sub>&#8220;>?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"sc-poisson\" name=\"poisson\" value=\"0.30\" min=\"-0.99\" max=\"0.499\" step=\"any\">\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-shear-angle-field\" data-mode=\"shearStrain\" data-method=\"angle\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-shearAngle\">\n                                    Shear Angle (&theta;)\n                                    <span class=\"sc-tooltip\" data-tip=\"Angular deformation of the element\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-shearAngle\" name=\"shearAngle\" value=\"0.5\" step=\"any\">\n                                    <select id=\"sc-angleUnit\" class=\"sc-inline-unit\" aria-label=\"Angle unit\">\n                                        <option value=\"deg\" selected>deg<\/option>\n                                        <option value=\"rad\">rad<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-shear-disp-field\" data-mode=\"shearStrain\" data-method=\"displacement\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-shearDisplacement\">Lateral Displacement (&Delta;x)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-shearDisplacement\" name=\"shearDisplacement\" value=\"0.5\" step=\"any\">\n                                    <span class=\"sc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-shearHeight\">Original Height (h)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-shearHeight\" name=\"shearHeight\" value=\"50\" min=\"0.001\" step=\"any\">\n                                    <span class=\"sc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"sc-form-row sc-strain-input-field\" data-mode=\"elongation finalLength conversion\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-inputStrain\">\n                                    Input Strain (&epsilon;)\n                                    <span class=\"sc-tooltip\" data-tip=\"Engineering strain value\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-inputStrain\" name=\"inputStrain\" value=\"0.002\" step=\"any\">\n                                    <select id=\"sc-inputStrainUnit\" class=\"sc-inline-unit\" aria-label=\"Strain unit\">\n                                        <option value=\"dimensionless\">&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                        <option value=\"micro\">\u03bc\u03b5<\/option>\n                                        <option value=\"milli\">m\u03b5<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group sc-elong-length-field\" data-mode=\"elongation finalLength\">\n                                <label for=\"sc-elongLength\">Original Length (L<sub>0<\/sub>)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-elongLength\" name=\"elongLength\" value=\"100\" min=\"0.001\" step=\"any\">\n                                    <span class=\"sc-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"sc-input-section sc-material-section\">\n                        <legend>Material &amp; Stress<\/legend>\n                        <div class=\"sc-form-row\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-material\">Material Preset<\/label>\n                                <select id=\"sc-material\" name=\"material\">\n                                    <option value=\"structuralSteel\" selected>Structural Steel<\/option>\n                                    <option value=\"carbonSteel\">Carbon Steel<\/option>\n                                    <option value=\"stainlessSteel\">Stainless Steel<\/option>\n                                    <option value=\"aluminum\">Aluminum Alloy<\/option>\n                                    <option value=\"titanium\">Titanium Alloy<\/option>\n                                    <option value=\"copper\">Copper<\/option>\n                                    <option value=\"brass\">Brass<\/option>\n                                    <option value=\"castIron\">Cast Iron<\/option>\n                                    <option value=\"engineeringPlastic\">Engineering Plastic<\/option>\n                                    <option value=\"custom\">Custom Material<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-elastic-field\" data-mode=\"elasticStrain normalStrain lateralStrain\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-youngModulus\">\n                                    Young&#8217;s Modulus (E)\n                                    <span class=\"sc-tooltip\" data-tip=\"Elastic modulus \u2014 required for Hooke's law calculations\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-youngModulus\" name=\"youngModulus\" value=\"200\" min=\"0.001\" step=\"any\">\n                                    <select id=\"sc-youngUnit\" class=\"sc-inline-unit\" aria-label=\"Young's modulus unit\">\n                                        <option value=\"GPa\" selected>GPa<\/option>\n                                        <option value=\"MPa\">MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group sc-shear-mod-field\" data-mode=\"elasticStrain\" data-method=\"shearStress strainToStress\">\n                                <label for=\"sc-shearModulus\">Shear Modulus (G)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-shearModulus\" name=\"shearModulus\" value=\"76.9\" min=\"0.001\" step=\"any\">\n                                    <select id=\"sc-shearUnit\" class=\"sc-inline-unit\" aria-label=\"Shear modulus unit\">\n                                        <option value=\"GPa\" selected>GPa<\/option>\n                                        <option value=\"MPa\">MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-stress-field\" data-mode=\"elasticStrain\" data-method=\"normalStress\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-normalStress\">\n                                    Normal Stress (&sigma;)\n                                    <span class=\"sc-tooltip\" data-tip=\"\u03b5 = \u03c3 \/ E (Hooke's law)\">?<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-normalStress\" name=\"normalStress\" value=\"400\" step=\"any\">\n                                    <select id=\"sc-stressUnit\" class=\"sc-inline-unit\" aria-label=\"Stress unit\">\n                                        <option value=\"MPa\" selected>MPa<\/option>\n                                        <option value=\"GPa\">GPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-yieldStrength\">\n                                    Yield Strength (S<sub>y<\/sub>) <span class=\"sc-optional\">(optional)<\/span>\n                                <\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-yieldStrength\" name=\"yieldStrength\" value=\"355\" step=\"any\">\n                                    <select id=\"sc-yieldUnit\" class=\"sc-inline-unit\" aria-label=\"Yield strength unit\">\n                                        <option value=\"MPa\" selected>MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-shear-stress-field\" data-mode=\"elasticStrain\" data-method=\"shearStress\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-shearStress\">Shear Stress (&tau;)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-shearStress\" name=\"shearStress\" value=\"150\" step=\"any\">\n                                    <select id=\"sc-shearStressUnit\" class=\"sc-inline-unit\" aria-label=\"Shear stress unit\">\n                                        <option value=\"MPa\" selected>MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-strain-stress-field\" data-mode=\"elasticStrain\" data-method=\"strainToStress\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-elasticStrainInput\">Strain (&epsilon;)<\/label>\n                                <div class=\"sc-input-with-unit\">\n                                    <input type=\"number\" id=\"sc-elasticStrainInput\" name=\"elasticStrainInput\" value=\"0.002\" step=\"any\">\n                                    <select id=\"sc-elasticStrainUnit\" class=\"sc-inline-unit\" aria-label=\"Strain unit\">\n                                        <option value=\"dimensionless\">&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                        <option value=\"micro\">\u03bc\u03b5<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"sc-form-row sc-poisson-material-field\" data-mode=\"normalStrain lateralStrain\">\n                            <div class=\"sc-form-group\">\n                                <label for=\"sc-poissonMaterial\">Poisson&#8217;s Ratio (&nu;) <span class=\"sc-optional\">(for lateral &amp; volumetric strain)<\/span><\/label>\n                                <input type=\"number\" id=\"sc-poissonMaterial\" name=\"poissonMaterial\" value=\"0.30\" min=\"-0.99\" max=\"0.499\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <div class=\"sc-form-actions\">\n                        <button type=\"submit\" class=\"sc-btn sc-btn-primary\" id=\"sc-calculateBtn\">Calculate<\/button>\n                    <\/div>\n                <\/form>\n            <\/section>\n\n            <section class=\"sc-results-panel sc-card sc-hidden\" id=\"sc-resultsPanel\" aria-label=\"Calculation results\">\n                <div class=\"sc-panel-header\">\n                    <h2>Results<\/h2>\n                    <div id=\"sc-statusBadge\" class=\"sc-status-badge sc-status-neutral\">Awaiting Input<\/div>\n                <\/div>\n\n                <div id=\"sc-errorBox\" class=\"sc-error-box sc-hidden\" role=\"alert\"><\/div>\n                <div id=\"sc-warningBox\" class=\"sc-warning-box sc-hidden\" role=\"status\"><\/div>\n\n                <div class=\"sc-sign-convention\" id=\"sc-signConvention\">\n                    Sign convention: positive strain = tension \/ elongation; negative strain = compression \/ shortening.\n                <\/div>\n\n                <div class=\"sc-results-grid\" id=\"sc-resultsGrid\"><\/div>\n\n                <div id=\"sc-recommendations\" class=\"sc-recommendations sc-hidden\"><\/div>\n\n                <div class=\"sc-visual-grid\">\n                    <div class=\"sc-viz-card\">\n                        <h3>Tensile \/ Compressive Deformation<\/h3>\n                        <svg id=\"sc-axialDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"sc-viz-card\">\n                        <h3>Lateral Contraction<\/h3>\n                        <svg id=\"sc-lateralDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"sc-viz-card\">\n                        <h3>Shear Deformation<\/h3>\n                        <svg id=\"sc-shearDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"sc-viz-card sc-viz-wide\">\n                        <h3>Engineering vs True Strain<\/h3>\n                        <svg id=\"sc-strainCompareDiagram\" viewBox=\"0 0 560 160\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"sc-viz-card sc-viz-wide\">\n                        <h3>Stress-Strain Curve (Elastic Region)<\/h3>\n                        <svg id=\"sc-stressStrainDiagram\" viewBox=\"0 0 560 180\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                <\/div>\n            <\/section>\n        <\/div>\n    <\/div>\n<script>\n(function(){\n  var r=document.getElementById('sc-calculator');\n  if(!r||r.dataset.scLoaderDone==='1'){return;}\n  r.dataset.scLoaderDone='1';\n  try{\n    var p=[\"LyoqDQogKiBTdHJhaW4gQ2FsY3VsYXRvcg0KICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQg4oCUIGRvZXMgbm90IGFmZmVjdCBlbGVtZW50cyBvdXRzaWRlICNzYy1jYWxjdWxhdG9yDQogKi8NCg0KKGZ1bmN0aW9uICgpIHsNCiAgICAndXNlIHN0cmljdCc7DQoNCiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjLWNhbGN1bGF0b3InKTsNCiAgICBpZiAoIXJvb3QgfHwgcm9vdC5kYXRhc2V0LnNjUmVhZHkgPT09ICcxJykgcmV0dXJuOw0KICAgIHJvb3QuZGF0YXNldC5zY1JlYWR5ID0gJzEnOw0KDQogICAgY29uc3QgU1ZHX0lEID0gJ3NjLWNhbGN1bGF0b3Itc3ZnLSc7DQoNCiAgICBmdW5jdGlvbiAkKGlkKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoJyNzYy0nICsgaWQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uICRhbGwoc2VsKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKTsNCiAgICB9DQoNCiAgICBjb25zdCBNQVRFUklBTFMgPSB7DQogICAgICAgIHN0cnVjdHVyYWxTdGVlbDogICAgeyBFOiAyMDAsIEc6IDc2LjksIG51OiAwLjMwLCBTeTogMzU1IH0sDQogICAgICAgIGNhcmJvblN0ZWVsOiAgICAgICAgeyBFOiAyMDAsIEc6IDc2LjksIG51OiAwLjMwLCBTeTogMzUwIH0sDQogICAgICAgIHN0YWlubGVzc1N0ZWVsOiAgICAgeyBFOiAxOTUsIEc6IDc1LjAsIG51OiAwLjMwLCBTeTogMzEwIH0sDQogICAgICAgIGFsdW1pbnVtOiAgICAgICAgICAgeyBFOiA3MCwgIEc6IDI2LjMsIG51OiAwLjMzLCBTeTogMjc1IH0sDQogICAgICAgIHRpdGFuaXVtOiAgICAgICAgICAgeyBFOiAxMTAsIEc6IDQxLjAsIG51OiAwLjM0LCBTeTogODgwIH0sDQogICAgICAgIGNvcHBlcjogICAgICAgICAgICAgeyBFOiAxMjAsIEc6IDQ0LjgsIG51OiAwLjM0LCBTeTogNzAgfSwNCiAgICAgICAgYnJhc3M6ICAgICAgICAgICAgICB7IEU6IDEwMCwgRzogMzcuMywgbnU6IDAuMzQsIFN5OiAyMDAgfSwNCiAgICAgICAgY2FzdElyb246ICAgICAgICAgICB7IEU6IDEwMCwgRzogNDAuMCwgbnU6IDAuMjUsIFN5OiAyNTAgfSwNCiAgICAgICAgZW5naW5lZXJpbmdQbGFzdGljOiB7IEU6IDMsICAgRzogMS4wNywgbnU6IDAuNDAsIFN5OiA1MCB9LA0KICAgICAgICBjdXN0b206ICAgICAgICAgICAgIHsgRTogbnVsbCwgRzogbnVsbCwgbnU6IG51bGwsIFN5OiBudWxsIH0NCiAgICB9Ow0KDQogICAgY29uc3QgQ09OViA9IHsNCiAgICAgICAgbGVuZ3RoVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2luJykgcmV0dXJuIHYgKiAyNS40Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdjbScpIHJldHVybiB2ICogMTA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ20nKSByZXR1cm4gdiAqIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2Z0JykgcmV0dXJuIHYgKiAzMDQuODsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAndW0nKSByZXR1cm4gdiAvIDEwMDA7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgbGVuZ3RoRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnaW4nKSByZXR1cm4gdiAvIDI1LjQ7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2NtJykgcmV0dXJuIHYgLyAxMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbScpIHJldHVybiB2IC8gMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnZnQnKSByZXR1cm4gdiAvIDMwNC44Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICd1bScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBzdHJlc3NUb0ludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnR1BhJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAqIDAuMDA2ODk0NzY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiB2ICogNi44OTQ3NjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBzdHJlc3NGcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdHUGEnKSByZXR1cm4gdiAvIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3BzaScpIHJldHVybiB2IC8gMC4wMDY4OTQ3NjsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuIHYgLyA2Ljg5NDc2Ow0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIG1vZHVsdXNUb0ludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnTVBhJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAqIDAuMDA2ODk0NzYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gdiAqIDYuODk0NzYgLyAxMDAwOw0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIG1vZHVsdXNGcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdNUGEnKSByZXR1cm4gdiAqIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3BzaScpIHJldHVybiAodiAqIDEwMDApIC8gMC4wMDY4OTQ3NjsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuICh2ICogMTAwMCkgLyA2Ljg5NDc2Ow0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIHN0cmFpblRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwZXJjZW50JykgcmV0dXJuIHYgLyAxMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ21pY3JvJykgcmV0dXJuIHYgLyAxZTY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ21pbGxpJykgcmV0dXJuIHYgLyAxZTM7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyYWluRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncGVyY2VudCcpIHJldHVybiB2ICogMTAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtaWNybycpIHJldHVybiB2ICogMWU2Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtaWxsaScpIHJldHVybiB2ICogMWUzOw0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIGFuZ2xlVG9SYWQodiwgdW5pdCkgew0KICAgICAgICAgICAgcmV0dXJuIHVuaXQgPT09ICdkZWcnID8gdiAqIE1hdGguUEkgLyAxODAgOiB2Ow0KICAgICAgICB9DQogICAgfTsNCg0KICAgIGNvbnN0IElOUFVUX01FVEhPRFMgPSB7DQogICAgICAgIG5vcm1hbFN0cmFpbjogWw0KICAgICAgICAgICAgWydvcmlnaW5hbEZpbmFsJywgJ09yaWdpbmFsICYgRmluYWwgTGVuZ3RoJ10sDQogICAgICAgICAgICBbJ2NoYW5nZUxlbmd0aCcsICdPcmlnaW5hbCBMZW5ndGggJiBDaGFuZ2UgaW4gTGVuZ3RoJ10NCiAgICAgICAgXSwNCiAgICAgICAgbGF0ZXJhbFN0cmFpbjogWw0KICAgICAgICAgICAgWyd3aWR0aENoYW5nZScsICdXaWR0aCBDaGFuZ2UnXSwNCiAgICAgICAgICAgIFsnZGlhbWV0ZXJDaGFuZ2UnLCAnRGlhbWV0ZXIgQ2hhbmdlJ10sDQogICAgICAgICAgICBbJ3BvaXNzb24nLCAiUG9pc3NvbidzIFJhdGlvICYgTG9uZ2l0dWRpbmFsIFN0cmFpbiJdDQogICAgICAgIF0sDQogICAgICAgIHNoZWFyU3RyYWluOiBbDQogICAgICAgICAgICBbJ2FuZ2xlJywgJ1NoZWFyIEFuZ2xlJ10sDQogICAgICAgICAgICBbJ2Rpc3BsYWNlbWVudCcsICdMYXRlcmFsIERpc3BsYWNlbWVudCAmIEhlaWdodCddDQogICAgICAgIF0sDQogICAgICAgIGVsYXN0aWNTdHJhaW46IFsNCiAgICAgICAgICAgIFsnbm9ybWFsU3RyZXNzJywgJ05vcm1hbCBTdHJlc3MgJiBZb3VuZ1wncyBNb2R1bHVzJ10sDQogICAgICAgICAgICBbJ3NoZWFyU3RyZXNzJywgJ1NoZWFyIFN0cmVzcyAmIFNoZWFyIE1vZHVsdXMnXSwNCiAgICAgICAgICAgIFsnc3RyYWluVG9TdHJlc3MnLCAnU3RyYWluIHRvIFN0cmVzcyAoSG9va2VcJ3MgTGF3KSddDQogICAgICAgIF0NCiAgICB9Ow0KDQogICAgbGV0IHVuaXRTeXN0ZW0gPSAnbWV0cmljJzsNCg0KICAgIGNvbnN0IGZvcm0gPSAkKCdjYWxjRm9ybScpOw0KICAgIGNvbnN0IGNhbGNNb2RlID0gJCgnY2FsY01vZGUnKTsNCiAgICBjb25zdCBpbnB1dE1ldGhvZCA9ICQoJ2lucHV0TWV0aG9kJyk7DQogICAgY29uc3QgbWF0ZXJpYWxTZWxlY3QgPSAkKCdtYXRlcmlhbCcpOw0KICAgIGNvbnN0IHJlc3VsdHNQYW5lbCA9ICQoJ3Jlc3VsdHNQYW5lbCcpOw0KDQogICAgZnVuY3Rpb24gaW5pdCgpIHsNCiAgICAgICAgdXBkYXRlSW5wdXRNZXRob2RPcHRpb25zKCk7DQogICAgICAgIGJpbmRF\",\n    \"dmVudHMoKTsNCiAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7DQogICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgew0KICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjYWxjdWxhdGUoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJGFsbCgnLnNjLXVuaXQtYnRuJykuZm9yRWFjaCgoYnRuKSA9PiB7DQogICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hVbml0U3lzdGVtKGJ0bi5kYXRhc2V0LnVuaXQpKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgY2FsY01vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgdXBkYXRlSW5wdXRNZXRob2RPcHRpb25zKCk7DQogICAgICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaW5wdXRNZXRob2QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIG1hdGVyaWFsU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFwcGx5TWF0ZXJpYWxQcmVzZXQpOw0KDQogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBoaWRlUmVzdWx0c1BhbmVsKTsNCiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gew0KICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBtYXRlcmlhbFNlbGVjdCkgcmV0dXJuOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVJbnB1dE1ldGhvZE9wdGlvbnMoKSB7DQogICAgICAgIGNvbnN0IG1vZGUgPSBjYWxjTW9kZS52YWx1ZTsNCiAgICAgICAgY29uc3QgbGlzdCA9IElOUFVUX01FVEhPRFNbbW9kZV07DQogICAgICAgIGlmICghbGlzdCkgew0KICAgICAgICAgICAgaW5wdXRNZXRob2QuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgY29uc3QgY3VycmVudCA9IGlucHV0TWV0aG9kLnZhbHVlOw0KICAgICAgICBpbnB1dE1ldGhvZC5pbm5lckhUTUwgPSBsaXN0Lm1hcCgoW3YsIHRdKSA9PiBgPG9wdGlvbiB2YWx1ZT0iJHt2fSI+JHt0fTwvb3B0aW9uPmApLmpvaW4oJycpOw0KICAgICAgICBpZiAobGlzdC5zb21lKChbdl0pID0+IHYgPT09IGN1cnJlbnQpKSB7DQogICAgICAgICAgICBpbnB1dE1ldGhvZC52YWx1ZSA9IGN1cnJlbnQ7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzd2l0Y2hVbml0U3lzdGVtKHN5cykgew0KICAgICAgICBpZiAoc3lzID09PSB1bml0U3lzdGVtKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgbGVuZ3RoSWRzID0gWydvcmlnaW5hbExlbmd0aCcsICdmaW5hbExlbmd0aCcsICdvcmlnaW5hbExlbmd0aDInLCAnZWxvbmdMZW5ndGgnLA0KICAgICAgICAgICAgJ29yaWdpbmFsV2lkdGgnLCAnb3JpZ2luYWxEaWFtZXRlcicsICdzaGVhckhlaWdodCddOw0KICAgICAgICBsZW5ndGhJZHMuZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgZnJvbVUgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbSc7DQogICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbCh2YWwsIGZyb21VKTsNCiAgICAgICAgICAgIGVsLnZhbHVlID0gZm9ybWF0TnVtKENPTlYubGVuZ3RoRnJvbUludGVybmFsKGludGVybmFsLCBzeXMgPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyksIDQpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBjb25zdCBjaGFuZ2VNYXAgPSB7DQogICAgICAgICAgICBsZW5ndGhDaGFuZ2U6ICdsZW5ndGhDaGFuZ2VVbml0JywNCiAgICAgICAgICAgIHdpZHRoQ2hhbmdlOiAnd2lkdGhDaGFuZ2VVbml0JywNCiAgICAgICAgICAgIGRpYW1ldGVyQ2hhbmdlOiAnZGlhbWV0ZXJDaGFuZ2VVbml0JywNCiAgICAgICAgICAgIHNoZWFyRGlzcGxhY2VtZW50OiBudWxsDQogICAgICAgIH07DQogICAgICAgIE9iamVjdC5rZXlzKGNoYW5nZU1hcCkuZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgdW5pdEVsID0gY2hhbmdlTWFwW2lkXSA\/ICQoY2hhbmdlTWFwW2lkXSkgOiBudWxsOw0KICAgICAgICAgICAgY29uc3QgdSA9IHVuaXRFbCA\/IHVuaXRFbC52YWx1ZSA6ICh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwodmFsLCB1KTsNCiAgICAgICAgICAgIGNvbnN0IG5ld1UgPSBzeXMgPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJzsNCiAgICAgICAgICAgIGVsLnZhbHVlID0gZm9ybWF0TnVtKENPTlYubGVuZ3RoRnJvbUludGVybmFsKGludGVybmFsLCBuZXdVKSwgNCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIFsneW91bmdNb2R1bHVzJywgJ3NoZWFyTW9kdWx1cyddLmZvckVhY2goKGlkKSA9PiB7DQogICAgICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICAgICAgaWYgKCFlbCB8fCBlbC52YWx1ZSA9PT0gJycpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOw0KICAgICAgICAgICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IHVuaXRJZCA9IGlkID09PSAneW91bmdNb2R1bHVzJyA\/ICd5b3VuZ1VuaXQnIDogJ3NoZWFyVW5pdCc7DQogICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwodmFsLCAkKHVuaXRJZCkudmFsdWUpOw0KICAgICAgICAgICAgY29uc3QgbmV3VW5pdCA9IHN5cyA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ0dQYSc7DQogICAgICAgICAgICBlbC52YWx1ZSA9IGZvcm1hdE51bShDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwoaW50ZXJuYWwsIG5ld1VuaXQpLCAyKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgWydub3JtYWxTdHJlc3MnLCAneWllbGRTdHJlbmd0aCcsICdzaGVhclN0cmVzcyddLmZvckVhY2goKGlkKSA9PiB7DQogICAgICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICAgICAgaWYgKCFlbCB8fCBlbC52YWx1ZSA9PT0gJycpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOw0KICAgICAgICAgICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IHVuaXRJZCA9IGlkID09PSAnbm9ybWFsU3RyZXNzJyA\/ICdzdHJlc3NVbml0JyA6IGlkID09PSAneWllbGRTdHJlbmd0aCcgPyAneWllbGRVbml0JyA6ICdzaGVhclN0cmVzc1VuaXQnOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLnN0cmVzc1RvSW50ZXJuYWwodmFsLCAkKHVuaXRJZCkudmFsdWUpOw0KICAgICAgICAgICAgY29uc3QgbmV3VW5pdCA9IHN5cyA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ01QYSc7DQogICAgICAgICAgICBlbC52YWx1ZSA9IGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbChpbnRlcm5hbCwgbmV3VW5pdCksIDEpOw0KICAgICAgICB9KTsNCg0KICAgICAgICB1bml0U3lzdGVtID0gc3lzOw0KICAgICAgICAkYWxsKCcuc2MtdW5pdC1idG4nKS5mb3JFYWNoKChiKSA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ3NjLWFjdGl2ZScsIGIuZGF0YXNldC51bml0ID09PSBzeXMpKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlVW5pdExhYmVscygpIHsNCiAgICAgICAgY29uc3QgaXNJbXAgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnOw0KICAgICAgICAkYWxsKCdbZGF0YS11bml0LWtleT0ibGVuZ3RoU21hbGwiXScpLmZvckVhY2goKGVsKSA9PiB7IGVsLnRleHRDb250ZW50ID0gaXNJbXAgPyAn\",\n    \"aW4nIDogJ21tJzsgfSk7DQoNCiAgICAgICAgY29uc3QgeW91bmdVbml0ID0gJCgneW91bmdVbml0Jyk7DQogICAgICAgIGNvbnN0IHNoZWFyVW5pdCA9ICQoJ3NoZWFyVW5pdCcpOw0KICAgICAgICBjb25zdCBzdHJlc3NVbml0ID0gJCgnc3RyZXNzVW5pdCcpOw0KICAgICAgICBjb25zdCB5aWVsZFVuaXQgPSAkKCd5aWVsZFVuaXQnKTsNCiAgICAgICAgY29uc3Qgc2hlYXJTdHJlc3NVbml0ID0gJCgnc2hlYXJTdHJlc3NVbml0Jyk7DQoNCiAgICAgICAgaWYgKGlzSW1wKSB7DQogICAgICAgICAgICB5b3VuZ1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9ImtzaSIgc2VsZWN0ZWQ+a3NpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHNpIj5wc2k8L29wdGlvbj4nOw0KICAgICAgICAgICAgc2hlYXJVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJrc2kiIHNlbGVjdGVkPmtzaTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBzaSI+cHNpPC9vcHRpb24+JzsNCiAgICAgICAgICAgIHN0cmVzc1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9ImtzaSIgc2VsZWN0ZWQ+a3NpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHNpIj5wc2k8L29wdGlvbj4nOw0KICAgICAgICAgICAgeWllbGRVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJrc2kiIHNlbGVjdGVkPmtzaTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBzaSI+cHNpPC9vcHRpb24+JzsNCiAgICAgICAgICAgIHNoZWFyU3RyZXNzVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ia3NpIiBzZWxlY3RlZD5rc2k8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwc2kiPnBzaTwvb3B0aW9uPic7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB5b3VuZ1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IkdQYSIgc2VsZWN0ZWQ+R1BhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iTVBhIj5NUGE8L29wdGlvbj4nOw0KICAgICAgICAgICAgc2hlYXJVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJHUGEiIHNlbGVjdGVkPkdQYTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Ik1QYSI+TVBhPC9vcHRpb24+JzsNCiAgICAgICAgICAgIHN0cmVzc1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9Ik1QYSIgc2VsZWN0ZWQ+TVBhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iR1BhIj5HUGE8L29wdGlvbj4nOw0KICAgICAgICAgICAgeWllbGRVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJNUGEiIHNlbGVjdGVkPk1QYTwvb3B0aW9uPic7DQogICAgICAgICAgICBzaGVhclN0cmVzc1VuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9Ik1QYSIgc2VsZWN0ZWQ+TVBhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHNpIj5wc2k8L29wdGlvbj4nOw0KICAgICAgICB9DQoNCiAgICAgICAgWydsZW5ndGhVbml0JywgJ2xlbmd0aFVuaXQyJywgJ2ZpbmFsTGVuZ3RoVW5pdCddLmZvckVhY2goKGlkKSA9PiB7DQogICAgICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICAgICAgaWYgKCFlbCkgcmV0dXJuOw0KICAgICAgICAgICAgZWwuaW5uZXJIVE1MID0gaXNJbXANCiAgICAgICAgICAgICAgICA\/ICc8b3B0aW9uIHZhbHVlPSJpbiIgc2VsZWN0ZWQ+aW48L29wdGlvbj48b3B0aW9uIHZhbHVlPSJmdCI+ZnQ8L29wdGlvbj4nDQogICAgICAgICAgICAgICAgOiAnPG9wdGlvbiB2YWx1ZT0ibW0iIHNlbGVjdGVkPm1tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY20iPmNtPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibSI+bTwvb3B0aW9uPic7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBtZXRob2QgPSBpbnB1dE1ldGhvZC52YWx1ZSB8fCAnJzsNCg0KICAgICAgICAkYWxsKCdbZGF0YS1tb2RlXScpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBjb25zdCBtb2RlcyA9IGVsLmRhdGFzZXQubW9kZS5zcGxpdCgnICcpOw0KICAgICAgICAgICAgaWYgKCFtb2Rlcy5pbmNsdWRlcyhtb2RlKSkgew0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NjLWhpZGRlbicpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChlbC5kYXRhc2V0Lm1ldGhvZCkgew0KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZHMgPSBlbC5kYXRhc2V0Lm1ldGhvZC5zcGxpdCgnICcpOw0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3NjLWhpZGRlbicsICFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZCkpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzYy1oaWRkZW4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgY29uc3QgbWV0aG9kUm93ID0gJGFsbCgnLnNjLW1vZGUtZmllbGQnKVswXTsNCiAgICAgICAgaWYgKG1ldGhvZFJvdykgew0KICAgICAgICAgICAgbWV0aG9kUm93LmNsYXNzTGlzdC50b2dnbGUoJ3NjLWhpZGRlbicsICFJTlBVVF9NRVRIT0RTW21vZGVdKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKSB7DQogICAgICAgIGNvbnN0IG1hdCA9IE1BVEVSSUFMU1ttYXRlcmlhbFNlbGVjdC52YWx1ZV07DQogICAgICAgIGlmICghbWF0IHx8IG1hdGVyaWFsU2VsZWN0LnZhbHVlID09PSAnY3VzdG9tJykgcmV0dXJuOw0KDQogICAgICAgIGlmIChtYXQuRSAhPSBudWxsKSB7DQogICAgICAgICAgICAkKCd5b3VuZ01vZHVsdXMnKS52YWx1ZSA9IGZvcm1hdE51bSgNCiAgICAgICAgICAgICAgICBDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwobWF0LkUsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnKSwgMQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobWF0LkcgIT0gbnVsbCkgew0KICAgICAgICAgICAgJCgnc2hlYXJNb2R1bHVzJykudmFsdWUgPSBmb3JtYXROdW0oDQogICAgICAgICAgICAgICAgQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKG1hdC5HLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyksIDINCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1hdC5udSAhPSBudWxsKSB7DQogICAgICAgICAgICBpZiAoJCgncG9pc3Nvbk1hdGVyaWFsJykpICQoJ3BvaXNzb25NYXRlcmlhbCcpLnZhbHVlID0gbWF0Lm51Ow0KICAgICAgICAgICAgaWYgKCQoJ3BvaXNzb24nKSkgJCgncG9pc3NvbicpLnZhbHVlID0gbWF0Lm51Ow0KICAgICAgICB9DQogICAgICAgIGlmIChtYXQuU3kgIT0gbnVsbCkgew0KICAgICAgICAgICAgJCgneWllbGRTdHJlbmd0aCcpLnZhbHVlID0gZm9ybWF0TnVtKA0KICAgICAgICAgICAgICAgIENPTlYuc3RyZXNzRnJvbUludGVybmFsKG1hdC5TeSwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ01QYScpLCAwDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcGFyc2VOdW0oaWQpIHsNCiAgICAgICAgY29uc3QgZWwgPSAkKGlkKTsNCiAgICAgICAgaWYgKCFlbCB8fCBlbC52YWx1ZSA9PT0gJycpIHJldHVybiBudWxsOw0KICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgIHJldHVybiBpc05hTih2KSA\/IG51bGwgOiB2Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldElucHV0cygpIHsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIG1vZGU6IGNhbGNNb2RlLnZhbHVlLA0KICAgICAgICAgICAgbWV0aG9kOiBpbnB1dE1ldGhvZC52YWx1ZSwNCiAgICAgICAgICAgIHNob3dUcnVlU3RyYWluOiAkKCdzaG93VHJ1ZVN0cmFpbicpID8gJCgnc2hvd1RydWVTdHJhaW4nKS5jaGVja2VkIDogZmFsc2UsDQogICAgICAgICAgICBzaGVhckFuZ2xlTWV0aG9kOiAkKCdzaGVhckFuZ2xlTWV0aG9kJykgPyAkKCdzaGVhckFuZ2xlTWV0aG9kJykudmFsdWUgOiAnc21hbGwnLA0KICAgICAgICAgICAgb3JpZ2luYWxMZW5ndGg6IHBhcnNlTnVtKCdvcmlnaW5hbExlbmd0aCcpLA0KICAgICAgICAgICAgbGVuZ3RoVW5pdDogJCgnbGVuZ3RoVW5pdCcpID8gJCgnbGVuZ3RoVW5pdCcpLnZhbHVlIDogJ21tJywNCiAgICAgICAgICAgIGZpbmFsTGVuZ3RoOiBwYXJzZU51bSgnZmluYWxMZW5ndGgnKSwNCiAgICAgICAgICAgIGZpbmFsTGVuZ3RoVW5pdDogJCgnZmluYWxMZW5ndGhVbml0JykgPyAkKCdmaW5hbExlbmd0aFVuaXQnKS52YWx1ZSA6ICdtbScsDQogICAgICAgICAgICBvcmlnaW5hbExlbmd0aDI6IHBhcnNlTnVtKCdvcmlnaW5hbExlbmd0aDInKSwNCiAgICAgICAgICAgIGxlbmd0aFVuaXQyOiAkKCdsZW5ndGhVbml0MicpID8gJCgnbGVuZ3RoVW5pdDInKS52YWx1ZSA6ICdtbScsDQogICAgICAgICAgICBsZW5ndGhD\",\n    \"aGFuZ2U6IHBhcnNlTnVtKCdsZW5ndGhDaGFuZ2UnKSwNCiAgICAgICAgICAgIGxlbmd0aENoYW5nZVVuaXQ6ICQoJ2xlbmd0aENoYW5nZVVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIG9yaWdpbmFsV2lkdGg6IHBhcnNlTnVtKCdvcmlnaW5hbFdpZHRoJyksDQogICAgICAgICAgICB3aWR0aENoYW5nZTogcGFyc2VOdW0oJ3dpZHRoQ2hhbmdlJyksDQogICAgICAgICAgICB3aWR0aENoYW5nZVVuaXQ6ICQoJ3dpZHRoQ2hhbmdlVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgb3JpZ2luYWxEaWFtZXRlcjogcGFyc2VOdW0oJ29yaWdpbmFsRGlhbWV0ZXInKSwNCiAgICAgICAgICAgIGRpYW1ldGVyQ2hhbmdlOiBwYXJzZU51bSgnZGlhbWV0ZXJDaGFuZ2UnKSwNCiAgICAgICAgICAgIGRpYW1ldGVyQ2hhbmdlVW5pdDogJCgnZGlhbWV0ZXJDaGFuZ2VVbml0JykudmFsdWUsDQogICAgICAgICAgICBsb25nU3RyYWluSW5wdXQ6IHBhcnNlTnVtKCdsb25nU3RyYWluSW5wdXQnKSwNCiAgICAgICAgICAgIGxvbmdTdHJhaW5Vbml0OiAkKCdsb25nU3RyYWluVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgcG9pc3NvbjogcGFyc2VOdW0oJ3BvaXNzb24nKSwNCiAgICAgICAgICAgIHNoZWFyQW5nbGU6IHBhcnNlTnVtKCdzaGVhckFuZ2xlJyksDQogICAgICAgICAgICBhbmdsZVVuaXQ6ICQoJ2FuZ2xlVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgc2hlYXJEaXNwbGFjZW1lbnQ6IHBhcnNlTnVtKCdzaGVhckRpc3BsYWNlbWVudCcpLA0KICAgICAgICAgICAgc2hlYXJIZWlnaHQ6IHBhcnNlTnVtKCdzaGVhckhlaWdodCcpLA0KICAgICAgICAgICAgaW5wdXRTdHJhaW46IHBhcnNlTnVtKCdpbnB1dFN0cmFpbicpLA0KICAgICAgICAgICAgaW5wdXRTdHJhaW5Vbml0OiAkKCdpbnB1dFN0cmFpblVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIGVsb25nTGVuZ3RoOiBwYXJzZU51bSgnZWxvbmdMZW5ndGgnKSwNCiAgICAgICAgICAgIHlvdW5nTW9kdWx1czogcGFyc2VOdW0oJ3lvdW5nTW9kdWx1cycpLA0KICAgICAgICAgICAgeW91bmdVbml0OiAkKCd5b3VuZ1VuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIHNoZWFyTW9kdWx1czogcGFyc2VOdW0oJ3NoZWFyTW9kdWx1cycpLA0KICAgICAgICAgICAgc2hlYXJVbml0OiAkKCdzaGVhclVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIG5vcm1hbFN0cmVzczogcGFyc2VOdW0oJ25vcm1hbFN0cmVzcycpLA0KICAgICAgICAgICAgc3RyZXNzVW5pdDogJCgnc3RyZXNzVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgeWllbGRTdHJlbmd0aDogcGFyc2VOdW0oJ3lpZWxkU3RyZW5ndGgnKSwNCiAgICAgICAgICAgIHlpZWxkVW5pdDogJCgneWllbGRVbml0JykudmFsdWUsDQogICAgICAgICAgICBzaGVhclN0cmVzczogcGFyc2VOdW0oJ3NoZWFyU3RyZXNzJyksDQogICAgICAgICAgICBzaGVhclN0cmVzc1VuaXQ6ICQoJ3NoZWFyU3RyZXNzVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgZWxhc3RpY1N0cmFpbklucHV0OiBwYXJzZU51bSgnZWxhc3RpY1N0cmFpbklucHV0JyksDQogICAgICAgICAgICBlbGFzdGljU3RyYWluVW5pdDogJCgnZWxhc3RpY1N0cmFpblVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIHBvaXNzb25NYXRlcmlhbDogcGFyc2VOdW0oJ3BvaXNzb25NYXRlcmlhbCcpLA0KICAgICAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsU2VsZWN0LnZhbHVlDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dHMoaW5wKSB7DQogICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOw0KICAgICAgICBjb25zdCB7IG1vZGUsIG1ldGhvZCB9ID0gaW5wOw0KDQogICAgICAgIGlmIChtb2RlID09PSAnbm9ybWFsU3RyYWluJykgew0KICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ29yaWdpbmFsRmluYWwnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgTDAgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wLm9yaWdpbmFsTGVuZ3RoIHx8IDAsIGlucC5sZW5ndGhVbml0KTsNCiAgICAgICAgICAgICAgICBjb25zdCBMZiA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnAuZmluYWxMZW5ndGggfHwgMCwgaW5wLmZpbmFsTGVuZ3RoVW5pdCk7DQogICAgICAgICAgICAgICAgaWYgKEwwIDw9IDApIGVycm9ycy5wdXNoKCdPcmlnaW5hbCBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgICAgICAgICBpZiAoTGYgPD0gMCkgZXJyb3JzLnB1c2goJ0ZpbmFsIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciB0cnVlIHN0cmFpbiBjYWxjdWxhdGlvbi4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnY2hhbmdlTGVuZ3RoJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IEwwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5vcmlnaW5hbExlbmd0aDIgfHwgMCwgaW5wLmxlbmd0aFVuaXQyKTsNCiAgICAgICAgICAgICAgICBpZiAoTDAgPD0gMCkgZXJyb3JzLnB1c2goJ09yaWdpbmFsIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG1vZGUgPT09ICdsYXRlcmFsU3RyYWluJykgew0KICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ3dpZHRoQ2hhbmdlJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IHcwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5vcmlnaW5hbFdpZHRoIHx8IDAsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgaWYgKHcwIDw9IDApIGVycm9ycy5wdXNoKCdPcmlnaW5hbCB3aWR0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdkaWFtZXRlckNoYW5nZScpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBkMCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnAub3JpZ2luYWxEaWFtZXRlciB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGlmIChkMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgZGlhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAncG9pc3NvbicpIHsNCiAgICAgICAgICAgICAgICBpZiAoaW5wLnBvaXNzb24gPT0gbnVsbCkgZXJyb3JzLnB1c2goIlBvaXNzb24ncyByYXRpbyBpcyByZXF1aXJlZC4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtb2RlID09PSAnc2hlYXJTdHJhaW4nICYmIG1ldGhvZCA9PT0gJ2Rpc3BsYWNlbWVudCcpIHsNCiAgICAgICAgICAgIGNvbnN0IGggPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wLnNoZWFySGVpZ2h0IHx8IDAsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICBpZiAoaCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ2VsYXN0aWNTdHJhaW4nKSB7DQogICAgICAgICAgICBpZiAobWV0aG9kID09PSAnbm9ybWFsU3RyZXNzJyB8fCBtZXRob2QgPT09ICdzdHJhaW5Ub1N0cmVzcycpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnAueW91bmdNb2R1bHVzIHx8IDAsIGlucC55b3VuZ1VuaXQpOw0KICAgICAgICAgICAgICAgIGlmIChFIDw9IDApIGVycm9ycy5wdXNoKCJZb3VuZydzIG1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdzaGVhclN0cmVzcycpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBHID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnAuc2hlYXJNb2R1bHVzIHx8IDAsIGlucC5zaGVhclVuaXQpOw0KICAgICAgICAgICAgICAgIGlmIChHIDw9IDApIGVycm9ycy5wdXNoKCdTaGVhciBtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ2Vsb25nYXRpb24nIHx8IG1vZGUgPT09ICdmaW5hbExlbmd0aCcpIHsNCiAgICAgICAgICAgIGNvbnN0IEwwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5lbG9uZ0xlbmd0aCB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgaWYgKEwwIDw9IDApIGVycm9ycy5wdXNoKCdPcmlnaW5hbCBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBlcnJvcnM7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xhc3NpZnlFbGFzdGljUmFuZ2Uoc3RyZXNzLCB5aWVsZFN0cmVuZ3RoLCBzdHJhaW4sIHlpZWxkU3Ry\",\n    \"YWluKSB7DQogICAgICAgIGlmICh5aWVsZFN0cmVuZ3RoICE9IG51bGwgJiYgc3RyZXNzICE9IG51bGwgJiYgeWllbGRTdHJlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIGNvbnN0IHV0aWwgPSBzdHJlc3MgLyB5aWVsZFN0cmVuZ3RoOw0KICAgICAgICAgICAgaWYgKHV0aWwgPiAxKSByZXR1cm4geyBsYWJlbDogJ0JleW9uZCBFbGFzdGljIFJhbmdlJywgbGV2ZWw6ICdkYW5nZXInIH07DQogICAgICAgICAgICBpZiAodXRpbCA+PSAwLjgpIHJldHVybiB7IGxhYmVsOiAnQ2F1dGlvbicsIGxldmVsOiAnY2F1dGlvbicgfTsNCiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiAnRWxhc3RpYycsIGxldmVsOiAnc2FmZScgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoeWllbGRTdHJhaW4gIT0gbnVsbCAmJiBzdHJhaW4gIT0gbnVsbCAmJiB5aWVsZFN0cmFpbiA+IDApIHsNCiAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gTWF0aC5hYnMoc3RyYWluKSAvIHlpZWxkU3RyYWluOw0KICAgICAgICAgICAgaWYgKHJhdGlvID4gMSkgcmV0dXJuIHsgbGFiZWw6ICdCZXlvbmQgRWxhc3RpYyBSYW5nZScsIGxldmVsOiAnZGFuZ2VyJyB9Ow0KICAgICAgICAgICAgaWYgKHJhdGlvID49IDAuOCkgcmV0dXJuIHsgbGFiZWw6ICdDYXV0aW9uJywgbGV2ZWw6ICdjYXV0aW9uJyB9Ow0KICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdFbGFzdGljJywgbGV2ZWw6ICdzYWZlJyB9Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiB7IGxhYmVsOiAnTi9BJywgbGV2ZWw6ICduZXV0cmFsJyB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRlZm9ybWF0aW9uVHlwZShlcHNpbG9uLCBpc1NoZWFyKSB7DQogICAgICAgIGlmIChpc1NoZWFyKSByZXR1cm4gJ1NoZWFyJzsNCiAgICAgICAgaWYgKGVwc2lsb24gPT0gbnVsbCB8fCAhaXNGaW5pdGUoZXBzaWxvbikpIHJldHVybiAnVW5rbm93bic7DQogICAgICAgIGlmIChlcHNpbG9uID4gMCkgcmV0dXJuICdUZW5zaW9uJzsNCiAgICAgICAgaWYgKGVwc2lsb24gPCAwKSByZXR1cm4gJ0NvbXByZXNzaW9uJzsNCiAgICAgICAgcmV0dXJuICdObyBEZWZvcm1hdGlvbic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgew0KICAgICAgICBoaWRlTWVzc2FnZXMoKTsNCiAgICAgICAgY29uc3QgaW5wID0gZ2V0SW5wdXRzKCk7DQogICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlSW5wdXRzKGlucCk7DQogICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsNCiAgICAgICAgICAgIHNob3dFcnJvcnMoZXJyb3JzKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHdhcm5pbmdzID0gW107DQogICAgICAgIGxldCBlRW5nID0gbnVsbCwgZVRydWUgPSBudWxsLCBlTGF0ID0gbnVsbCwgZVZvbCA9IG51bGwsIGdhbW1hID0gbnVsbDsNCiAgICAgICAgbGV0IGRMID0gbnVsbCwgTDAgPSBudWxsLCBMZiA9IG51bGwsIHNpZ21hID0gbnVsbCwgdGF1ID0gbnVsbDsNCiAgICAgICAgbGV0IEUgPSBudWxsLCBHID0gbnVsbCwgU3kgPSBudWxsLCBlWWllbGQgPSBudWxsOw0KICAgICAgICBsZXQgaXNTaGVhciA9IGZhbHNlOw0KDQogICAgICAgIGNvbnN0IHsgbW9kZSwgbWV0aG9kIH0gPSBpbnA7DQogICAgICAgIGNvbnN0IG51ID0gaW5wLnBvaXNzb25NYXRlcmlhbDsNCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ25vcm1hbFN0cmFpbicpIHsNCiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdvcmlnaW5hbEZpbmFsJykgew0KICAgICAgICAgICAgICAgIEwwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5vcmlnaW5hbExlbmd0aCwgaW5wLmxlbmd0aFVuaXQpOw0KICAgICAgICAgICAgICAgIExmID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5maW5hbExlbmd0aCwgaW5wLmZpbmFsTGVuZ3RoVW5pdCk7DQogICAgICAgICAgICAgICAgZEwgPSBMZiAtIEwwOw0KICAgICAgICAgICAgICAgIGVFbmcgPSBkTCAvIEwwOw0KICAgICAgICAgICAgICAgIGlmIChpbnAuc2hvd1RydWVTdHJhaW4gJiYgTGYgPiAwICYmIEwwID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBlVHJ1ZSA9IE1hdGgubG9nKExmIC8gTDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgTDAgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wLm9yaWdpbmFsTGVuZ3RoMiwgaW5wLmxlbmd0aFVuaXQyKTsNCiAgICAgICAgICAgICAgICBkTCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnAubGVuZ3RoQ2hhbmdlLCBpbnAubGVuZ3RoQ2hhbmdlVW5pdCk7DQogICAgICAgICAgICAgICAgZUVuZyA9IGRMIC8gTDA7DQogICAgICAgICAgICAgICAgTGYgPSBMMCArIGRMOw0KICAgICAgICAgICAgICAgIGlmIChpbnAuc2hvd1RydWVTdHJhaW4gJiYgTGYgPiAwICYmIEwwID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBlVHJ1ZSA9IE1hdGgubG9nKExmIC8gTDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChudSAhPSBudWxsICYmIGVFbmcgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGVMYXQgPSAtbnUgKiBlRW5nOw0KICAgICAgICAgICAgICAgIGVWb2wgPSBlRW5nICogKDEgLSAyICogbnUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdsYXRlcmFsU3RyYWluJykgew0KICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ3dpZHRoQ2hhbmdlJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IHcwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5vcmlnaW5hbFdpZHRoLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGR3ID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC53aWR0aENoYW5nZSwgaW5wLndpZHRoQ2hhbmdlVW5pdCk7DQogICAgICAgICAgICAgICAgZUxhdCA9IGR3IC8gdzA7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2RpYW1ldGVyQ2hhbmdlJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IGQwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5vcmlnaW5hbERpYW1ldGVyLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGRkID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5kaWFtZXRlckNoYW5nZSwgaW5wLmRpYW1ldGVyQ2hhbmdlVW5pdCk7DQogICAgICAgICAgICAgICAgZUxhdCA9IGRkIC8gZDA7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGNvbnN0IGVMb25nID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucC5sb25nU3RyYWluSW5wdXQsIGlucC5sb25nU3RyYWluVW5pdCk7DQogICAgICAgICAgICAgICAgZUxhdCA9IC1pbnAucG9pc3NvbiAqIGVMb25nOw0KICAgICAgICAgICAgICAgIGVFbmcgPSBlTG9uZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnc2hlYXJTdHJhaW4nKSB7DQogICAgICAgICAgICBpc1NoZWFyID0gdHJ1ZTsNCiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdhbmdsZScpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB0aGV0YSA9IENPTlYuYW5nbGVUb1JhZChpbnAuc2hlYXJBbmdsZSwgaW5wLmFuZ2xlVW5pdCk7DQogICAgICAgICAgICAgICAgZ2FtbWEgPSBpbnAuc2hlYXJBbmdsZU1ldGhvZCA9PT0gJ2V4YWN0JyA\/IE1hdGgudGFuKHRoZXRhKSA6IHRoZXRhOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBjb25zdCBkeCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnAuc2hlYXJEaXNwbGFjZW1lbnQsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgY29uc3QgaCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnAuc2hlYXJIZWlnaHQsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgZ2FtbWEgPSBkeCAvIGg7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2VsYXN0aWNTdHJhaW4nKSB7DQogICAgICAgICAgICBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnAueW91bmdNb2R1bHVzLCBpbnAueW91bmdVbml0KTsNCiAgICAgICAgICAgIEcgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucC5zaGVhck1vZHVsdXMsIGlucC5zaGVhclVuaXQpOw0KICAgICAgICAgICAgU3kgPSBpbnAueWllbGRTdHJlbmd0aCAhPSBudWxsID8gQ09OVi5zdHJlc3NUb0ludGVybmFsKGlucC55aWVsZFN0cmVuZ3RoLCBpbnAueWllbGRVbml0KSA6IG51bGw7DQoNCiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdub3JtYWxTdHJlc3MnKSB7DQogICAgICAgICAgICAgICAgc2lnbWEgPSBDT05WLnN0cmVzc1RvSW50ZXJuYWwoaW5wLm5vcm1hbFN0\",\n    \"cmVzcywgaW5wLnN0cmVzc1VuaXQpOw0KICAgICAgICAgICAgICAgIGVFbmcgPSBzaWdtYSAvIChFICogMTAwMCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3NoZWFyU3RyZXNzJykgew0KICAgICAgICAgICAgICAgIGlzU2hlYXIgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHRhdSA9IENPTlYuc3RyZXNzVG9JbnRlcm5hbChpbnAuc2hlYXJTdHJlc3MsIGlucC5zaGVhclN0cmVzc1VuaXQpOw0KICAgICAgICAgICAgICAgIGdhbW1hID0gdGF1IC8gKEcgKiAxMDAwKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZUVuZyA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChpbnAuZWxhc3RpY1N0cmFpbklucHV0LCBpbnAuZWxhc3RpY1N0cmFpblVuaXQpOw0KICAgICAgICAgICAgICAgIHNpZ21hID0gRSAqIDEwMDAgKiBlRW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoU3kgIT0gbnVsbCAmJiBFID4gMCkgZVlpZWxkID0gU3kgLyAoRSAqIDEwMDApOw0KICAgICAgICAgICAgaWYgKFN5ICE9IG51bGwgJiYgc2lnbWEgIT0gbnVsbCAmJiBzaWdtYSA+IFN5KSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnQXBwbGllZCBzdHJlc3MgZXhjZWVkcyB5aWVsZCBzdHJlbmd0aCDigJQgSG9va2VcJ3MgbGF3IG1heSBubyBsb25nZXIgYmUgdmFsaWQuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2Vsb25nYXRpb24nKSB7DQogICAgICAgICAgICBlRW5nID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucC5pbnB1dFN0cmFpbiwgaW5wLmlucHV0U3RyYWluVW5pdCk7DQogICAgICAgICAgICBMMCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnAuZWxvbmdMZW5ndGgsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICBkTCA9IGVFbmcgKiBMMDsNCiAgICAgICAgICAgIExmID0gTDAgKyBkTDsNCiAgICAgICAgICAgIGlmIChMZiA+IDAgJiYgTDAgPiAwKSBlVHJ1ZSA9IE1hdGgubG9nKExmIC8gTDApOw0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdmaW5hbExlbmd0aCcpIHsNCiAgICAgICAgICAgIGVFbmcgPSBDT05WLnN0cmFpblRvSW50ZXJuYWwoaW5wLmlucHV0U3RyYWluLCBpbnAuaW5wdXRTdHJhaW5Vbml0KTsNCiAgICAgICAgICAgIEwwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucC5lbG9uZ0xlbmd0aCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgIExmID0gTDAgKiAoMSArIGVFbmcpOw0KICAgICAgICAgICAgZEwgPSBMZiAtIEwwOw0KICAgICAgICAgICAgaWYgKExmID4gMCAmJiBMMCA+IDApIGVUcnVlID0gTWF0aC5sb2coTGYgLyBMMCk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2NvbnZlcnNpb24nKSB7DQogICAgICAgICAgICBlRW5nID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucC5pbnB1dFN0cmFpbiwgaW5wLmlucHV0U3RyYWluVW5pdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZUVuZyAhPSBudWxsICYmIE1hdGguYWJzKGVFbmcpID4gMC4wNSkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnRW5naW5lZXJpbmcgc3RyYWluIGV4Y2VlZHMgNSUg4oCUIGNvbnNpZGVyIHVzaW5nIHRydWUgc3RyYWluIGZvciBsYXJnZSBkZWZvcm1hdGlvbiBhbmFseXNpcy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlVHJ1ZSAhPSBudWxsICYmIGVFbmcgIT0gbnVsbCAmJiBNYXRoLmFicyhlRW5nIC0gZVRydWUpID4gMC4wMDEpIHsNCiAgICAgICAgICAgIC8qIGNvbXBhcmlzb24gc2hvd24gaW4gcmVzdWx0cyAqLw0KICAgICAgICB9DQoNCiAgICAgICAgRSA9IEUgPz8gKGlucC55b3VuZ01vZHVsdXMgIT0gbnVsbCA\/IENPTlYubW9kdWx1c1RvSW50ZXJuYWwoaW5wLnlvdW5nTW9kdWx1cywgaW5wLnlvdW5nVW5pdCkgOiBudWxsKTsNCiAgICAgICAgU3kgPSBTeSA\/PyAoaW5wLnlpZWxkU3RyZW5ndGggIT0gbnVsbCA\/IENPTlYuc3RyZXNzVG9JbnRlcm5hbChpbnAueWllbGRTdHJlbmd0aCwgaW5wLnlpZWxkVW5pdCkgOiBudWxsKTsNCiAgICAgICAgaWYgKGVZaWVsZCA9PSBudWxsICYmIFN5ICE9IG51bGwgJiYgRSAhPSBudWxsICYmIEUgPiAwKSBlWWllbGQgPSBTeSAvIChFICogMTAwMCk7DQoNCiAgICAgICAgY29uc3QgZWxhc3RpY1N0YXR1cyA9IGNsYXNzaWZ5RWxhc3RpY1JhbmdlKHNpZ21hLCBTeSwgZUVuZywgZVlpZWxkKTsNCiAgICAgICAgY29uc3QgZGVmVHlwZSA9IGRlZm9ybWF0aW9uVHlwZShlRW5nID8\/IGdhbW1hLCBpc1NoZWFyKTsNCg0KICAgICAgICBjb25zdCByZXN1bHRzID0gYnVpbGRSZXN1bHRzKHsNCiAgICAgICAgICAgIGVFbmcsIGVUcnVlLCBlTGF0LCBlVm9sLCBnYW1tYSwgZEwsIEwwLCBMZiwgc2lnbWEsIHRhdSwgZVlpZWxkLCBTeSwgRSwNCiAgICAgICAgICAgIGVsYXN0aWNTdGF0dXMsIGRlZlR5cGUsIGlzU2hlYXIsIG1vZGUsIGlucCwgd2FybmluZ3MNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmVuZGVyUmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgdXBkYXRlU3RhdHVzQmFkZ2UoZWxhc3RpY1N0YXR1cywgZGVmVHlwZSwgbW9kZSk7DQogICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgpIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgIGRyYXdWaXN1YWxpemF0aW9ucyh7IGVFbmcsIGVUcnVlLCBlTGF0LCBnYW1tYSwgc2lnbWEsIEUsIFN5LCBlWWllbGQsIGRlZlR5cGUsIGlzU2hlYXIsIG1vZGUgfSk7DQogICAgICAgIHNob3dSZWNvbW1lbmRhdGlvbnMobW9kZSwgZUVuZywgaXNTaGVhcik7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYnVpbGRSZXN1bHRzKGRhdGEpIHsNCiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTsNCiAgICAgICAgY29uc3QgbGVuVSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJzsNCiAgICAgICAgY29uc3Qgc3RyZXNzVSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdNUGEnOw0KDQogICAgICAgIGlmIChkYXRhLmVFbmcgIT0gbnVsbCAmJiAhZGF0YS5pc1NoZWFyKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdFbmdpbmVlcmluZyBTdHJhaW4gKM61KScsIHZhbHVlOiBmb3JtYXRTdHJhaW4oZGF0YS5lRW5nLCAnZGltZW5zaW9ubGVzcycpLCBoaWdobGlnaHQ6IHRydWUgfSk7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdQZXJjZW50YWdlIFN0cmFpbicsIHZhbHVlOiBmb3JtYXRTdHJhaW4oZGF0YS5lRW5nLCAncGVyY2VudCcpICsgJyAlJyB9KTsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ01pY3Jvc3RyYWluJywgdmFsdWU6IGZvcm1hdFN0cmFpbihkYXRhLmVFbmcsICdtaWNybycpICsgJyDOvM61JyB9KTsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ01pbGxpc3RyYWluJywgdmFsdWU6IGZvcm1hdFN0cmFpbihkYXRhLmVFbmcsICdtaWxsaScpICsgJyBtzrUnIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGRhdGEuZVRydWUgIT0gbnVsbCAmJiBkYXRhLmlucC5zaG93VHJ1ZVN0cmFpbiAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1RydWUgU3RyYWluICjOtV90cnVlKScsIHZhbHVlOiBmb3JtYXROdW0oZGF0YS5lVHJ1ZSwgNikgfSk7DQogICAgICAgICAgICBpZiAoZGF0YS5lRW5nICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdFbmcuIHZzIFRydWUgRGlmZmVyZW5jZScsIHZhbHVlOiBmb3JtYXROdW0oTWF0aC5hYnMoZGF0YS5lRW5nIC0gZGF0YS5lVHJ1ZSksIDYpIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGRhdGEuZ2FtbWEgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnU2hlYXIgU3RyYWluICjOsyknLCB2YWx1ZTogZm9ybWF0TnVtKGRhdGEuZ2FtbWEsIDYpLCBoaWdobGlnaHQ6IHRydWUgfSk7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdTaGVhciBTdHJhaW4gKCUpJywgdmFsdWU6IGZvcm1hdE51bShkYXRhLmdhbW1hICogMTAwLCA0KSArICcgJScgfSk7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdTaGVhciBBbmdsZSAocmFkKScsIHZhbHVlOiBmb3JtYXROdW0oZGF0YS5nYW1tYSwgNikgKyAnIHJhZCcgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZGF0YS5kTCAhPSBudWxsICYmIGRhdGEuTDAgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ2hhbmdlIGluIExlbmd0aCAozpRMKScsIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5sZW5ndGhGcm9tSW50ZXJuYWwoZGF0YS5kTCwgbGVuVSksIDQpICsgJyAnICsgbGVuVSB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZGF0YS5MZiAhPSBudWxsKSB7DQogICAgICAgICAg\",\n    \"ICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdGaW5hbCBMZW5ndGggKExfZiknLCB2YWx1ZTogZm9ybWF0TnVtKENPTlYubGVuZ3RoRnJvbUludGVybmFsKGRhdGEuTGYsIGxlblUpLCA0KSArICcgJyArIGxlblUgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZGF0YS5lTGF0ICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0xhdGVyYWwgU3RyYWluICjOtV9sYXQpJywgdmFsdWU6IGZvcm1hdFN0cmFpbihkYXRhLmVMYXQsICdkaW1lbnNpb25sZXNzJykgfSk7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdMYXRlcmFsIFN0cmFpbiAoJSknLCB2YWx1ZTogZm9ybWF0U3RyYWluKGRhdGEuZUxhdCwgJ3BlcmNlbnQnKSArICcgJScgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZGF0YS5lVm9sICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1ZvbHVtZXRyaWMgU3RyYWluICjOtV92KScsIHZhbHVlOiBmb3JtYXRTdHJhaW4oZGF0YS5lVm9sLCAnZGltZW5zaW9ubGVzcycpIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGRhdGEuc2lnbWEgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnTm9ybWFsIFN0cmVzcyAoz4MpJywgdmFsdWU6IGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbChkYXRhLnNpZ21hLCBzdHJlc3NVKSwgMikgKyAnICcgKyBzdHJlc3NVIH0pOw0KICAgICAgICB9DQogICAgICAgIGlmIChkYXRhLnRhdSAhPSBudWxsKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdTaGVhciBTdHJlc3MgKM+EKScsIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoZGF0YS50YXUsIHN0cmVzc1UpLCAyKSArICcgJyArIHN0cmVzc1UgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZGF0YS5lWWllbGQgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRXN0aW1hdGVkIFlpZWxkIFN0cmFpbicsIHZhbHVlOiBmb3JtYXRTdHJhaW4oZGF0YS5lWWllbGQsICdkaW1lbnNpb25sZXNzJykgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZGF0YS5zaWdtYSAhPSBudWxsICYmIGRhdGEuU3kgIT0gbnVsbCAmJiBkYXRhLlN5ID4gMCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnWWllbGQgVXRpbGl6YXRpb24nLCB2YWx1ZTogZm9ybWF0TnVtKGRhdGEuc2lnbWEgLyBkYXRhLlN5ICogMTAwLCAxKSArICcgJScgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdEZWZvcm1hdGlvbiBUeXBlJywgdmFsdWU6IGRhdGEuZGVmVHlwZSB9KTsNCiAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRWxhc3RpYyBSYW5nZSBTdGF0dXMnLCB2YWx1ZTogZGF0YS5lbGFzdGljU3RhdHVzLmxhYmVsIH0pOw0KDQogICAgICAgIHJldHVybiBpdGVtczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJSZXN1bHRzKGl0ZW1zKSB7DQogICAgICAgIGNvbnN0IGdyaWQgPSAkKCdyZXN1bHRzR3JpZCcpOw0KICAgICAgICBncmlkLmlubmVySFRNTCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gYA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2MtcmVzdWx0LWl0ZW0ke2l0ZW0uaGlnaGxpZ2h0ID8gJyBzYy1yZXN1bHQtaGlnaGxpZ2h0JyA6ICcnfSI+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNjLXJlc3VsdC1sYWJlbCI+JHtpdGVtLmxhYmVsfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2MtcmVzdWx0LXZhbHVlIj4ke2l0ZW0udmFsdWV9PC9zcGFuPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIGApLmpvaW4oJycpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1c0JhZGdlKGVsYXN0aWNTdGF0dXMsIGRlZlR5cGUsIG1vZGUpIHsNCiAgICAgICAgY29uc3QgYmFkZ2UgPSAkKCdzdGF0dXNCYWRnZScpOw0KICAgICAgICBpZiAobW9kZSA9PT0gJ2NvbnZlcnNpb24nKSB7DQogICAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICdDb252ZXJ0ZWQnOw0KICAgICAgICAgICAgYmFkZ2UuY2xhc3NOYW1lID0gJ3NjLXN0YXR1cy1iYWRnZSBzYy1zdGF0dXMtbmV1dHJhbCc7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVsYXN0aWNTdGF0dXMubGV2ZWwgIT09ICduZXV0cmFsJykgew0KICAgICAgICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBlbGFzdGljU3RhdHVzLmxhYmVsOw0KICAgICAgICAgICAgYmFkZ2UuY2xhc3NOYW1lID0gJ3NjLXN0YXR1cy1iYWRnZSBzYy1zdGF0dXMtJyArIGVsYXN0aWNTdGF0dXMubGV2ZWw7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9IGRlZlR5cGU7DQogICAgICAgICAgICBiYWRnZS5jbGFzc05hbWUgPSAnc2Mtc3RhdHVzLWJhZGdlIHNjLXN0YXR1cy0nICsgKGRlZlR5cGUgPT09ICdUZW5zaW9uJyA\/ICdzYWZlJyA6IGRlZlR5cGUgPT09ICdDb21wcmVzc2lvbicgPyAnY2F1dGlvbicgOiAnbmV1dHJhbCcpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1JlY29tbWVuZGF0aW9ucyhtb2RlLCBlRW5nLCBpc1NoZWFyKSB7DQogICAgICAgIGNvbnN0IHJlYyA9IFtdOw0KICAgICAgICByZWMucHVzaCgnVmVyaWZ5IG9yaWdpbmFsIGRpbWVuc2lvbnMgYmVmb3JlIGNhbGN1bGF0aW5nIHN0cmFpbi4nKTsNCiAgICAgICAgcmVjLnB1c2goJ1VzZSBjb25zaXN0ZW50IGxlbmd0aCB1bml0cyBmb3Igb3JpZ2luYWwgYW5kIGZpbmFsIGRpbWVuc2lvbnMuJyk7DQogICAgICAgIGlmIChlRW5nICE9IG51bGwgJiYgTWF0aC5hYnMoZUVuZykgPCAwLjAwMDEpIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdVc2UgbWljcm9zdHJhaW4gKM68zrUpIGZvciB2ZXJ5IHNtYWxsIGVsYXN0aWMgZGVmb3JtYXRpb25zLicpOw0KICAgICAgICB9DQogICAgICAgIHJlYy5wdXNoKCdDaGVjayB0aGUgc2lnbiBjb252ZW50aW9uOiBwb3NpdGl2ZSA9IHRlbnNpb24sIG5lZ2F0aXZlID0gY29tcHJlc3Npb24uJyk7DQogICAgICAgIGlmIChlRW5nICE9IG51bGwgJiYgTWF0aC5hYnMoZUVuZykgPiAwLjAyKSB7DQogICAgICAgICAgICByZWMucHVzaCgnVXNlIHRydWUgc3RyYWluIGZvciBsYXJnZSBkZWZvcm1hdGlvbiBhbmFseXNpcy4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobW9kZSA9PT0gJ2VsYXN0aWNTdHJhaW4nIHx8IG1vZGUgPT09ICdub3JtYWxTdHJhaW4nKSB7DQogICAgICAgICAgICByZWMucHVzaCgnRG8gbm90IHJlbHkgb24gSG9va2VcJ3MgbGF3IGJleW9uZCB0aGUgZWxhc3RpYyByYW5nZS4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNTaGVhcikgew0KICAgICAgICAgICAgcmVjLnB1c2goJ0ZvciBsYXJnZSBzaGVhciBhbmdsZXMsIHVzZSB0aGUgZXhhY3QgzrMgPSB0YW4ozrgpIHJlbGF0aW9uc2hpcC4nKTsNCiAgICAgICAgfQ0KICAgICAgICByZWMucHVzaCgnQ29uc2lkZXIgbGF0ZXJhbCBzdHJhaW4gYW5kIFBvaXNzb24gZWZmZWN0cyB3aGVuIG11bHRpLWRpcmVjdGlvbmFsIGRlZm9ybWF0aW9uIG1hdHRlcnMuJyk7DQoNCiAgICAgICAgY29uc3QgZWwgPSAkKCdyZWNvbW1lbmRhdGlvbnMnKTsNCiAgICAgICAgZWwuaW5uZXJIVE1MID0gJzxoMz5FbmdpbmVlcmluZyBSZWNvbW1lbmRhdGlvbnM8L2gzPjx1bD4nICsgcmVjLm1hcCgocikgPT4gJzxsaT4nICsgciArICc8L2xpPicpLmpvaW4oJycpICsgJzwvdWw+JzsNCiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2MtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1Zpc3VhbGl6YXRpb25zKGRhdGEpIHsNCiAgICAgICAgZHJhd0F4aWFsRGlhZ3JhbShkYXRhKTsNCiAgICAgICAgZHJhd0xhdGVyYWxEaWFncmFtKGRhdGEpOw0KICAgICAgICBkcmF3U2hlYXJEaWFncmFtKGRhdGEpOw0KICAgICAgICBkcmF3U3RyYWluQ29tcGFyZShkYXRhKTsNCiAgICAgICAgZHJhd1N0cmVzc1N0cmFpbihkYXRhKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3QXhpYWxEaWFncmFtKGRhdGEpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgnYXhpYWxEaWFncmFtJyk7DQogICAgICAgIGlmICghc3ZnKSByZXR1cm47DQogICAgICAgIGNvbnN0IGUgPSBkYXRhLmVFbmcgPz8gMDsNCiAgICAgICAgY29uc3QgaXNUZW5zaW9uID0gZSA+PSAwOw0KICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKE1hdGguYWJzKGUpICogNTAwLCA0MCk7DQogICAgICAgIGNvbnN0IG9yaWdXID0gMTIwLCBvcmlnSCA9IDI0Ow0KICAgICAgICBjb25zdCBuZXdXID0gb3JpZ1cgKyBzY2FsZTsNCiAgICAgICAgY29uc3QgY3ggPSA4MCwgY3kgPSA2NTsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPHJlY3QgeD0iJHtjeH0iIHk9IiR7Y3kgLSBvcmlnSCAvIDJ9IiB3aWR0aD0iJHtvcmlnV30iIGhlaWdodD0i\",\n    \"JHtvcmlnSH0iIGZpbGw9IiNlY2YwZjEiIHN0cm9rZT0iIzFhNTI3NiIgc3Ryb2tlLXdpZHRoPSIyIiByeD0iMiIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCArIG9yaWdXIC8gMn0iIHk9IiR7Y3kgKyBvcmlnSCAvIDIgKyAxOH0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiM1ZDZkN2UiPk9yaWdpbmFsIEzigoA8L3RleHQ+DQogICAgICAgICAgICA8cmVjdCB4PSIke2N4ICsgMTQwfSIgeT0iJHtjeSAtIG9yaWdIIC8gMn0iIHdpZHRoPSIke25ld1d9IiBoZWlnaHQ9IiR7b3JpZ0h9IiBmaWxsPSIke2lzVGVuc2lvbiA\/ICcjZDVmNWUzJyA6ICcjZmFkYmQ4J30iIHN0cm9rZT0iJHtpc1RlbnNpb24gPyAnIzI3YWU2MCcgOiAnI2MwMzkyYid9IiBzdHJva2Utd2lkdGg9IjIiIHJ4PSIyIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4ICsgMTQwICsgbmV3VyAvIDJ9IiB5PSIke2N5ICsgb3JpZ0ggLyAyICsgMTh9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWQ2ZDdlIj5EZWZvcm1lZDwvdGV4dD4NCiAgICAgICAgICAgIDxkZWZzPjxtYXJrZXIgaWQ9IiR7U1ZHX0lEfWFyciIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iNiIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEw2LDMgTDAsNiIgZmlsbD0iJHtpc1RlbnNpb24gPyAnIzI3YWU2MCcgOiAnI2MwMzkyYid9Ii8+PC9tYXJrZXI+PC9kZWZzPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7Y3ggLSAyMH0iIHkxPSIke2N5fSIgeDI9IiR7Y3h9IiB5Mj0iJHtjeX0iIHN0cm9rZT0iJHtpc1RlbnNpb24gPyAnIzI3YWU2MCcgOiAnI2MwMzkyYid9IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjJHtTVkdfSUR9YXJyKSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7Y3ggKyBvcmlnVyArIDIwfSIgeTE9IiR7Y3l9IiB4Mj0iJHtjeCArIG9yaWdXfSIgeTI9IiR7Y3l9IiBzdHJva2U9IiR7aXNUZW5zaW9uID8gJyMyN2FlNjAnIDogJyNjMDM5MmInfSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoIyR7U1ZHX0lEfWFycikiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjE0MCIgeT0iMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTEiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiMxYTUyNzYiPiR7aXNUZW5zaW9uID8gJ1RlbnNpb24nIDogJ0NvbXByZXNzaW9uJ308L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd0xhdGVyYWxEaWFncmFtKGRhdGEpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgnbGF0ZXJhbERpYWdyYW0nKTsNCiAgICAgICAgaWYgKCFzdmcpIHJldHVybjsNCiAgICAgICAgY29uc3QgZUxhdCA9IGRhdGEuZUxhdCA\/PyAoZGF0YS5lRW5nICE9IG51bGwgJiYgZGF0YS5lRW5nID4gMCA\/IC0wLjAwMyA6IDApOw0KICAgICAgICBjb25zdCBjb250cmFjdCA9IE1hdGgubWluKE1hdGguYWJzKGVMYXQpICogODAwLCAxMik7DQogICAgICAgIGNvbnN0IGN4ID0gMTQwLCBjeSA9IDY1Ow0KICAgICAgICBjb25zdCB3MCA9IDQwLCBoMCA9IDgwOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8cmVjdCB4PSIke2N4IC0gdzAgLyAyfSIgeT0iJHtjeSAtIGgwIC8gMn0iIHdpZHRoPSIke3cwfSIgaGVpZ2h0PSIke2gwfSIgZmlsbD0iI2VjZjBmMSIgc3Ryb2tlPSIjMWE1Mjc2IiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDxyZWN0IHg9IiR7Y3ggLSB3MCAvIDIgKyBjb250cmFjdH0iIHk9IiR7Y3kgLSBoMCAvIDIgLSA1fSIgd2lkdGg9IiR7dzAgLSAyICogY29udHJhY3R9IiBoZWlnaHQ9IiR7aDAgKyAxMH0iIGZpbGw9IiNkNWY1ZTMiIHN0cm9rZT0iIzI3YWU2MCIgc3Ryb2tlLXdpZHRoPSIyIi8+DQogICAgICAgICAgICA8ZGVmcz48bWFya2VyIGlkPSIke1NWR19JRH1sYXQiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIHJlZlg9IjUiIHJlZlk9IjMiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAsMCBMNSwzIEwwLDYiIGZpbGw9IiNlNjdlMjIiLz48L21hcmtlcj48L2RlZnM+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeCAtIHcwIC8gMiAtIDE1fSIgeTE9IiR7Y3l9IiB4Mj0iJHtjeCAtIHcwIC8gMiArIGNvbnRyYWN0IC0gNX0iIHkyPSIke2N5fSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjEuNSIgbWFya2VyLWVuZD0idXJsKCMke1NWR19JRH1sYXQpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeCArIHcwIC8gMiArIDE1fSIgeTE9IiR7Y3l9IiB4Mj0iJHtjeCArIHcwIC8gMiAtIGNvbnRyYWN0ICsgNX0iIHkyPSIke2N5fSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjEuNSIgbWFya2VyLWVuZD0idXJsKCMke1NWR19JRH1sYXQpIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIxNDAiIHk9IjE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWQ2ZDdlIj5MYXRlcmFsIENvbnRyYWN0aW9uIChQb2lzc29uKTwvdGV4dD4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3U2hlYXJEaWFncmFtKGRhdGEpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgnc2hlYXJEaWFncmFtJyk7DQogICAgICAgIGlmICghc3ZnKSByZXR1cm47DQogICAgICAgIGNvbnN0IGdhbW1hID0gZGF0YS5nYW1tYSA\/PyAwLjAxOw0KICAgICAgICBjb25zdCBkeCA9IE1hdGgubWluKE1hdGguYWJzKGdhbW1hKSAqIDEyMCwgMzUpOw0KICAgICAgICBjb25zdCBjeCA9IDEwMCwgY3kgPSA2NSwgdyA9IDgwLCBoID0gNjA7DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz0iJHtjeH0sJHtjeSAtIGggLyAyfSAke2N4ICsgd30sJHtjeSAtIGggLyAyfSAke2N4ICsgd30sJHtjeSArIGggLyAyfSAke2N4fSwke2N5ICsgaCAvIDJ9IiBmaWxsPSIjZWNmMGYxIiBzdHJva2U9IiMxYTUyNzYiIHN0cm9rZS13aWR0aD0iMiIvPg0KICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPSIke2N4ICsgZHh9LCR7Y3kgLSBoIC8gMn0gJHtjeCArIHcgKyBkeH0sJHtjeSAtIGggLyAyfSAke2N4ICsgdyArIGR4fSwke2N5ICsgaCAvIDJ9ICR7Y3ggKyBkeH0sJHtjeSArIGggLyAyfSIgZmlsbD0iI2ZkZWJkMCIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2N4ICsgdyAvIDJ9IiB5MT0iJHtjeSAtIGggLyAyIC0gNX0iIHgyPSIke2N4ICsgdyAvIDIgKyBkeH0iIHkyPSIke2N5IC0gaCAvIDIgLSA1fSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3ggKyB3IC8gMiArIGR4IC8gMn0iIHk9IiR7Y3kgLSBoIC8gMiAtIDEwfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjZTY3ZTIyIj7OlHg8L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIxNDAiIHk9IjE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWQ2ZDdlIj5TaGVhciBCbG9jayAozrMgPSDOlHgvaCk8L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1N0cmFpbkNvbXBhcmUoZGF0YSkgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdzdHJhaW5Db21wYXJlRGlhZ3JhbScpOw0KICAgICAgICBpZiAoIXN2ZykgcmV0dXJuOw0KICAgICAgICBjb25zdCBlRW5nID0gZGF0YS5lRW5nID8\/IDAuMDAyOw0KICAgICAgICBjb25zdCBlVHJ1ZSA9IGRhdGEuZVRydWUgPz8gKGVFbmcgPiAtMSA\/IE1hdGgubG9nKDEgKyBlRW5nKSA6IG51bGwpOw0KICAgICAgICBjb25zdCBtYXhFID0gTWF0aC5tYXgoTWF0aC5hYnMoZUVuZyksIGVUcnVlICE9IG51bGwgPyBNYXRoLmFicyhlVHJ1ZSkgOiAwLCAwLjAwMSk7DQogICAgICAgIGNvbnN0IGJhckggPSAzMDsNCiAgICAgICAgY29uc3Qgc2NhbGUgPSA0MDAgLyBtYXhFOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8dGV4dCB4PSIyMCIgeT0iMzUiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiMxYTUyNzYiPkVuZ2luZWVyaW5nIM61PC90ZXh0Pg0KICAgICAgICAgICAgPHJlY3QgeD0iMTMwIiB5PSIxOCIgd2lkdGg9IiR7TWF0aC5hYnMoZUVuZykgKiBzY2FsZX0iIGhlaWdodD0iJHtiYXJIfSIgZmlsbD0iIzI0NzFhMyIgcng9IjMiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7MTQwICsgTWF0aC5hYnMoZUVuZykgKiBzY2FsZX0iIHk9IjM4IiBmb250LXNpemU9IjEwIiBmaWxsPSIjMmMzZTUwIj4ke2Zvcm1hdFN0cmFpbihlRW5nLCAnZGltZW5zaW9ubGVzcycpfTwvdGV4dD4NCiAgICAgICAgICAgICR7ZVRydWUgIT0gbnVsbCA\/IGANCiAgICAgICAgICAgIDx0ZXh0IHg9IjIwIiB5PSI4NSIgZm9udC1zaXplPSIxMSIgZmlsbD0iIzFhNTI3NiI+VHJ1ZSDOtTwvdGV4\",\n    \"dD4NCiAgICAgICAgICAgIDxyZWN0IHg9IjEzMCIgeT0iNjgiIHdpZHRoPSIke01hdGguYWJzKGVUcnVlKSAqIHNjYWxlfSIgaGVpZ2h0PSIke2Jhckh9IiBmaWxsPSIjZTY3ZTIyIiByeD0iMyIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHsxNDAgKyBNYXRoLmFicyhlVHJ1ZSkgKiBzY2FsZX0iIHk9Ijg4IiBmb250LXNpemU9IjEwIiBmaWxsPSIjMmMzZTUwIj4ke2Zvcm1hdE51bShlVHJ1ZSwgNil9PC90ZXh0Pg0KICAgICAgICAgICAgYCA6ICc8dGV4dCB4PSIxMzAiIHk9Ijg1IiBmb250LXNpemU9IjEwIiBmaWxsPSIjN2Y4YzhkIj5UcnVlIHN0cmFpbiBOL0E8L3RleHQ+J30NCiAgICAgICAgICAgIDx0ZXh0IHg9IjI4MCIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWQ2ZDdlIj5WYWxpZCBmb3Igc21hbGwgc3RyYWluczsgdHJ1ZSBzdHJhaW4gcHJlZmVycmVkIGZvciBsYXJnZSBkZWZvcm1hdGlvbnM8L3RleHQ+DQogICAgICAgIGA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1N0cmVzc1N0cmFpbihkYXRhKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ3N0cmVzc1N0cmFpbkRpYWdyYW0nKTsNCiAgICAgICAgaWYgKCFzdmcpIHJldHVybjsNCiAgICAgICAgY29uc3QgRSA9IGRhdGEuRSA\/PyAyMDA7DQogICAgICAgIGNvbnN0IFN5ID0gZGF0YS5TeSA\/PyAzNTU7DQogICAgICAgIGNvbnN0IHNpZ21hID0gZGF0YS5zaWdtYSA\/PyAoZGF0YS5lRW5nICE9IG51bGwgPyBFICogMTAwMCAqIGRhdGEuZUVuZyA6IDQwMCk7DQogICAgICAgIGNvbnN0IGVZaWVsZCA9IGRhdGEuZVlpZWxkID8\/IFN5IC8gKEUgKiAxMDAwKTsNCiAgICAgICAgY29uc3QgZU1heCA9IE1hdGgubWF4KGVZaWVsZCAqIDEuNSwgTWF0aC5hYnMoZGF0YS5lRW5nID8\/IDAuMDAyKSAqIDEuMywgMC4wMDMpOw0KICAgICAgICBjb25zdCBzTWF4ID0gRSAqIDEwMDAgKiBlTWF4Ow0KICAgICAgICBjb25zdCBXID0gNDgwLCBIID0gMTQwLCBwYWQgPSA1MDsNCiAgICAgICAgY29uc3QgeFNjYWxlID0gKFcgLSBwYWQpIC8gZU1heDsNCiAgICAgICAgY29uc3QgeVNjYWxlID0gKEggLSBwYWQpIC8gc01heDsNCg0KICAgICAgICBjb25zdCBlbGFzdGljRW5kWCA9IHBhZCArIGVZaWVsZCAqIHhTY2FsZTsNCiAgICAgICAgY29uc3QgZWxhc3RpY0VuZFkgPSBIIC0gcGFkIC0gU3kgKiB5U2NhbGU7DQogICAgICAgIGNvbnN0IGN1cnJlbnRYID0gcGFkICsgTWF0aC5hYnMoZGF0YS5lRW5nID8\/IDAuMDAyKSAqIHhTY2FsZTsNCiAgICAgICAgY29uc3QgY3VycmVudFkgPSBIIC0gcGFkIC0gTWF0aC5taW4oc2lnbWEsIHNNYXgpICogeVNjYWxlOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8bGluZSB4MT0iJHtwYWR9IiB5MT0iJHtIIC0gcGFkfSIgeDI9IiR7V30iIHkyPSIke0ggLSBwYWR9IiBzdHJva2U9IiMyYzNlNTAiIHN0cm9rZS13aWR0aD0iMSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7cGFkfSIgeTE9IiR7SCAtIHBhZH0iIHgyPSIke3BhZH0iIHkyPSIxMCIgc3Ryb2tlPSIjMmMzZTUwIiBzdHJva2Utd2lkdGg9IjEiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7VyAvIDJ9IiB5PSIke0ggLSA1fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMCIgZmlsbD0iIzVkNmQ3ZSI+U3RyYWluIM61PC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iMTIiIHk9IiR7SCAvIDJ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWQ2ZDdlIiB0cmFuc2Zvcm09InJvdGF0ZSgtOTAgMTIgJHtIIC8gMn0pIj5TdHJlc3Mgz4M8L3RleHQ+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtwYWR9IiB5MT0iJHtIIC0gcGFkfSIgeDI9IiR7ZWxhc3RpY0VuZFh9IiB5Mj0iJHtlbGFzdGljRW5kWX0iIHN0cm9rZT0iIzI3YWU2MCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4NCiAgICAgICAgICAgIDxyZWN0IHg9IiR7cGFkfSIgeT0iJHtlbGFzdGljRW5kWX0iIHdpZHRoPSIke2VsYXN0aWNFbmRYIC0gcGFkfSIgaGVpZ2h0PSIke0ggLSBwYWQgLSBlbGFzdGljRW5kWX0iIGZpbGw9InJnYmEoMzksMTc0LDk2LDAuMTIpIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIke3BhZCArIChlbGFzdGljRW5kWCAtIHBhZCkgLyAyfSIgeT0iJHtlbGFzdGljRW5kWSAtIDV9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjkiIGZpbGw9IiMyN2FlNjAiPkVsYXN0aWMgUmVnaW9uPC90ZXh0Pg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7ZWxhc3RpY0VuZFh9IiB5MT0iJHtlbGFzdGljRW5kWX0iIHgyPSIke1cgLSAxMH0iIHkyPSIke2VsYXN0aWNFbmRZIC0gMjB9IiBzdHJva2U9IiNjMDM5MmIiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI0LDMiLz4NCiAgICAgICAgICAgIDxjaXJjbGUgY3g9IiR7Y3VycmVudFh9IiBjeT0iJHtjdXJyZW50WX0iIHI9IjUiIGZpbGw9IiNlNjdlMjIiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N1cnJlbnRYICsgOH0iIHk9IiR7Y3VycmVudFkgLSA1fSIgZm9udC1zaXplPSI5IiBmaWxsPSIjZTY3ZTIyIj5DdXJyZW50PC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdE51bSh2LCBkZWMpIHsNCiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCAhaXNGaW5pdGUodikpIHJldHVybiAn4oCUJzsNCiAgICAgICAgaWYgKE1hdGguYWJzKHYpID49IDFlNiB8fCAoTWF0aC5hYnModikgPCAwLjAwMDEgJiYgdiAhPT0gMCkpIHJldHVybiB2LnRvRXhwb25lbnRpYWwoZGVjKTsNCiAgICAgICAgcmV0dXJuIHYudG9GaXhlZChkZWMpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdFN0cmFpbihlLCB1bml0KSB7DQogICAgICAgIGNvbnN0IHYgPSBDT05WLnN0cmFpbkZyb21JbnRlcm5hbChlLCB1bml0KTsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdkaW1lbnNpb25sZXNzJykgcmV0dXJuIGZvcm1hdE51bSh2LCA2KTsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdwZXJjZW50JykgcmV0dXJuIGZvcm1hdE51bSh2LCA0KTsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdtaWNybycpIHJldHVybiBmb3JtYXROdW0odiwgMSk7DQogICAgICAgIGlmICh1bml0ID09PSAnbWlsbGknKSByZXR1cm4gZm9ybWF0TnVtKHYsIDMpOw0KICAgICAgICByZXR1cm4gZm9ybWF0TnVtKHYsIDYpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dSZXN1bHRzUGFuZWwoKSB7DQogICAgICAgIHJlc3VsdHNQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdzYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0c1BhbmVsKCkgew0KICAgICAgICByZXN1bHRzUGFuZWwuY2xhc3NMaXN0LmFkZCgnc2MtaGlkZGVuJyk7DQogICAgICAgIGhpZGVNZXNzYWdlcygpOw0KICAgICAgICAkKCdyZWNvbW1lbmRhdGlvbnMnKS5jbGFzc0xpc3QuYWRkKCdzYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7DQogICAgICAgICQoJ2Vycm9yQm94JykuY2xhc3NMaXN0LmFkZCgnc2MtaGlkZGVuJyk7DQogICAgICAgICQoJ3dhcm5pbmdCb3gnKS5jbGFzc0xpc3QuYWRkKCdzYy1oaWRkZW4nKTsNCiAgICAgICAgJCgncmVjb21tZW5kYXRpb25zJykuY2xhc3NMaXN0LmFkZCgnc2MtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd0Vycm9ycyhlcnJvcnMpIHsNCiAgICAgICAgY29uc3QgYm94ID0gJCgnZXJyb3JCb3gnKTsNCiAgICAgICAgYm94LmlubmVySFRNTCA9ICc8c3Ryb25nPlBsZWFzZSBjb3JyZWN0IHRoZSBmb2xsb3dpbmc6PC9zdHJvbmc+PHVsPicgKw0KICAgICAgICAgICAgZXJyb3JzLm1hcCgoZSkgPT4gJzxsaT4nICsgZSArICc8L2xpPicpLmpvaW4oJycpICsgJzwvdWw+JzsNCiAgICAgICAgYm94LmNsYXNzTGlzdC5yZW1vdmUoJ3NjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dXYXJuaW5ncyh3YXJuaW5ncykgew0KICAgICAgICBjb25zdCBib3ggPSAkKCd3YXJuaW5nQm94Jyk7DQogICAgICAgIGJveC5pbm5lckhUTUwgPSAnPHN0cm9uZz5XYXJuaW5nczo8L3N0cm9uZz48dWw+JyArDQogICAgICAgICAgICB3YXJuaW5ncy5tYXAoKHcpID0+ICc8bGk+JyArIHcgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgIGJveC5jbGFzc0xpc3QucmVtb3ZlKCdzYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBpbml0KCk7DQp9KSgpOw0K\"];\n    var bin=atob(p.join(''));\n    var bytes=new Uint8Array(bin.length);\n    for(var i=0;i<bin.length;i++){bytes[i]=bin.charCodeAt(i);}\n    var src=new TextDecoder('utf-8').decode(bytes);\n    (new Function(src))();\n  }catch(e){\n    console.error('Strain Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Strain Calculator is a practical engineering tool designed to calculate engineering strain, normal strain, lateral strain, shear strain, and elastic strain from dimensional changes,&#8230;<\/p>","protected":false},"author":2,"featured_media":24798,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8669,8667,8668,8656],"class_list":["post-24797","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-elastic-strain","tag-engineering-strain","tag-material-deformation","tag-shear-strain","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Strain-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/comments?post=24797"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24797\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24798"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24797"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}