{"id":24776,"date":"2026-08-28T07:52:03","date_gmt":"2026-08-28T07:52:03","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24776"},"modified":"2026-08-28T07:57:05","modified_gmt":"2026-08-28T07:57:05","slug":"elastic-modulus-e-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/elastic-modulus-e-calculator\/","title":{"rendered":"Elastic Modulus E Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Elastic Modulus E Calculator<\/strong> is a practical engineering tool designed to calculate Young\u2019s modulus from stress and strain or from load, cross-sectional area, original length, and deformation. It helps engineers quickly evaluate material stiffness, elastic strain, stress, and elongation within the linear elastic range. The Elastic Modulus E Calculator is useful for material selection, mechanical design, structural analysis, and engineering verification, providing a simple way to compare the elastic behavior of metals and other engineering materials.<\/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 #emec-calculator. Will NOT affect theme header, footer, menus, or other page content. -->\n<style>\n\/* Elastic Modulus E Calculator - WordPress-safe scoped styles *\/\n\/* ALL rules scoped under #emec-calculator \u2014 will NOT affect theme header, footer, menus, or other page content *\/\n\n#emec-calculator.emec-calculator {\n    all: revert;\n    --emec-primary: #1a5276;    --emec-primary-light: #2471a3;\n    --emec-primary-dark: #0e3352;\n    --emec-accent: #e67e22;\n    --emec-safe: #27ae60;\n    --emec-caution: #f39c12;\n    --emec-danger: #c0392b;\n    --emec-neutral: #7f8c8d;\n    --emec-bg: #ecf0f1;\n    --emec-card-bg: #ffffff;\n    --emec-border: #d5dbdb;\n    --emec-text: #2c3e50;\n    --emec-text-muted: #5d6d7e;\n    --emec-shadow: 0 2px 12px rgba(26, 82, 118, 0.08);\n    --emec-radius: 8px;\n    --emec-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --emec-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(--emec-font) !important;\n    color: var(--emec-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    position: relative !important;\n    isolation: isolate;\n    contain: layout style paint;\n    z-index: auto;\n}\n\n#emec-calculator.emec-calculator *,\n#emec-calculator.emec-calculator *::before,\n#emec-calculator.emec-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n\/* WordPress theme reset \u2014 scoped to calculator only *\/\n#emec-calculator.emec-calculator h1,\n#emec-calculator.emec-calculator h2,\n#emec-calculator.emec-calculator h3,\n#emec-calculator.emec-calculator h4,\n#emec-calculator.emec-calculator p,\n#emec-calculator.emec-calculator ul,\n#emec-calculator.emec-calculator ol,\n#emec-calculator.emec-calculator li,\n#emec-calculator.emec-calculator section,\n#emec-calculator.emec-calculator div,\n#emec-calculator.emec-calculator span,\n#emec-calculator.emec-calculator strong,\n#emec-calculator.emec-calculator em,\n#emec-calculator.emec-calculator sub,\n#emec-calculator.emec-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#emec-calculator.emec-calculator button,\n#emec-calculator.emec-calculator input,\n#emec-calculator.emec-calculator select,\n#emec-calculator.emec-calculator label,\n#emec-calculator.emec-calculator legend {\n    font: inherit !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n}\n\n#emec-calculator.emec-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}\n\n#emec-calculator.emec-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#emec-calculator.emec-calculator sub,\n#emec-calculator.emec-calculator sup {\n    font-size: 75% !important;\n    line-height: 0 !important;\n    position: relative !important;\n    vertical-align: baseline !important;\n}\n\n#emec-calculator.emec-calculator sub {\n    bottom: -0.2em !important;\n}\n\n#emec-calculator.emec-calculator sup {\n    top: -0.45em !important;\n}\n\n#emec-calculator.emec-calculator div,\n#emec-calculator.emec-calculator section,\n#emec-calculator.emec-calculator form,\n#emec-calculator.emec-calculator fieldset,\n#emec-calculator.emec-calculator details {\n    float: none !important;\n    clear: none !important;\n    max-width: none;\n}\n#emec-calculator.emec-calculator form {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: transparent !important;\n}\n\n#emec-calculator.emec-calculator fieldset.emec-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#emec-calculator.emec-calculator .emec-card {\n    background: var(--emec-card-bg) !important;\n    border-radius: var(--emec-radius) !important;\n    box-shadow: var(--emec-shadow) !important;\n    border: 1px solid var(--emec-border) !important;\n    padding: 1.5rem !important;\n    margin: 0 0 1.5rem 0 !important;\n}\n\n#emec-calculator.emec-calculator .emec-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.5rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-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(--emec-bg) !important;\n}\n\n#emec-calculator.emec-calculator .emec-panel-header h2 {\n    font-size: 1.25rem !important;\n    color: var(--emec-primary) !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    font-weight: 600 !important;\n    line-height: 1.3 !important;\n    font-family: var(--emec-font) !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    border: none !important;\n    background: none !important;\n}\n\n#emec-calculator.emec-calculator .emec-unit-toggle {\n    display: flex !important;\n    flex-direction: row !important;\n    border-radius: var(--emec-radius) !important;\n    overflow: hidden !important;\n    border: 1px solid var(--emec-border) !important;\n    background: transparent !important;\n}\n\n#emec-calculator.emec-calculator button.emec-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(--emec-bg) !important;\n    color: var(--emec-text-muted) !important;\n    cursor: pointer !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    font-family: var(--emec-font) !important;\n    line-height: 1.4 !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    box-shadow: none !important;\n    min-height: unset !important;\n    height: auto !important;\n    width: auto !important;\n    margin: 0 !important;\n    transition: background 0.2s !important;\n}\n\n#emec-calculator.emec-calculator button.emec-unit-btn.emec-active {\n    background: var(--emec-primary) !important;\n    color: #ffffff !important;\n}\n\n#emec-calculator.emec-calculator button.emec-unit-btn:hover:not(.emec-active) {\n    background: #dfe6e9 !important;\n}\n\n#emec-calculator.emec-calculator .emec-input-section legend {\n    display: block !important;\n    float: none !important;\n    width: 100% !important;\n    font-weight: 600 !important;\n    color: var(--emec-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(--emec-font) !important;\n    line-height: 1.4 !important;\n}\n\n#emec-calculator.emec-calculator .emec-form-row {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-form-group {\n    display: block !important;\n    margin-bottom: 0.85rem !important;\n    padding: 0 !important;\n    width: 100% !important;\n}\n\n#emec-calculator.emec-calculator .emec-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    padding: 0 !important;\n    color: var(--emec-text) !important;\n    font-family: var(--emec-font) !important;\n    line-height: 1.4 !important;\n    text-transform: none !important;\n    cursor: default !important;\n}\n\n#emec-calculator.emec-calculator .emec-optional {\n    font-weight: 400 !important;\n    color: var(--emec-text-muted) !important;\n    font-size: 0.8rem !important;\n}\n\n#emec-calculator.emec-calculator input[type=\"number\"],\n#emec-calculator.emec-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(--emec-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--emec-font) !important;\n    background: #ffffff !important;\n    color: var(--emec-text) !important;\n    transition: border-color 0.2s, box-shadow 0.2s !important;\n    margin: 0 !important;\n    height: auto !important;\n    min-height: 38px !important;\n    line-height: 1.4 !important;\n    box-shadow: none !important;\n    appearance: auto !important;\n    outline: none !important;\n}\n\n#emec-calculator.emec-calculator input[type=\"number\"]:focus,\n#emec-calculator.emec-calculator select:focus {\n    border-color: var(--emec-primary-light) !important;\n    box-shadow: 0 0 0 3px rgba(36, 113, 163, 0.15) !important;\n}\n\n#emec-calculator.emec-calculator input[type=\"checkbox\"] {\n    width: auto !important;\n    min-height: unset !important;\n    margin: 0 0.5rem 0 0 !important;\n    accent-color: var(--emec-primary) !important;\n}\n\n#emec-calculator.emec-calculator .emec-checkbox-label {\n    display: flex !important;\n    align-items: center !important;\n    font-weight: 500 !important;\n    font-size: 0.875rem !important;\n    cursor: pointer !important;\n}\n\n#emec-calculator.emec-calculator .emec-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#emec-calculator.emec-calculator .emec-input-with-unit input[type=\"number\"] {\n    flex: 1 1 auto !important;\n    width: auto !important;\n    min-width: 0 !important;\n}\n\n#emec-calculator.emec-calculator .emec-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(--emec-bg) !important;\n    border: 1px solid var(--emec-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.8rem !important;\n    font-weight: 600 !important;\n    color: var(--emec-text-muted) !important;\n    white-space: nowrap !important;\n    min-width: 3rem !important;\n    justify-content: center !important;\n}\n\n#emec-calculator.emec-calculator select.emec-inline-unit {\n    display: block !important;\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#emec-calculator.emec-calculator .emec-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(--emec-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#emec-calculator.emec-calculator .emec-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(--emec-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#emec-calculator.emec-calculator .emec-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#emec-calculator.emec-calculator .emec-ref-note {\n    font-size: 0.8rem !important;\n    color: var(--emec-text-muted) !important;\n    margin: 0.5rem 0 0 !important;\n    font-style: italic !important;\n}\n\n#emec-calculator.emec-calculator .emec-hidden {\n    display: none !important;\n}\n\n#emec-calculator.emec-calculator .emec-form-actions {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    justify-content: center !important;\n    align-items: center !important;\n    gap: 0.75rem !important;\n    margin-top: 1rem !important;\n}\n\n#emec-calculator.emec-calculator button.emec-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    font-family: var(--emec-font) !important;\n    line-height: 1.4 !important;\n    text-transform: none !important;\n    transition: transform 0.2s, box-shadow 0.2s !important;\n}\n\n#emec-calculator.emec-calculator button.emec-btn-primary {\n    background: linear-gradient(135deg, var(--emec-primary) 0%, var(--emec-primary-light) 100%) !important;\n    color: #ffffff !important;\n    min-width: 200px !important;\n}\n\n#emec-calculator.emec-calculator button.emec-btn-primary:hover {\n    transform: translateY(-1px) !important;\n    box-shadow: 0 4px 12px rgba(26, 82, 118, 0.3) !important;\n}\n\n#emec-calculator.emec-calculator button.emec-btn-secondary {\n    background: var(--emec-bg) !important;\n    color: var(--emec-text) !important;\n    border: 1px solid var(--emec-border) !important;\n}\n\n#emec-calculator.emec-calculator button.emec-btn-secondary:hover {\n    background: #dfe6e9 !important;\n}\n\n#emec-calculator.emec-calculator .emec-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#emec-calculator.emec-calculator .emec-status-neutral {\n    background: #ecf0f1 !important;\n    color: var(--emec-neutral) !important;\n}\n\n#emec-calculator.emec-calculator .emec-status-safe {\n    background: rgba(39, 174, 96, 0.15) !important;\n    color: var(--emec-safe) !important;\n    border: 1px solid var(--emec-safe) !important;\n}\n\n#emec-calculator.emec-calculator .emec-status-caution {\n    background: rgba(243, 156, 18, 0.15) !important;\n    color: #d68910 !important;\n    border: 1px solid var(--emec-caution) !important;\n}\n\n#emec-calculator.emec-calculator .emec-status-danger {\n    background: rgba(192, 57, 43, 0.12) !important;\n    color: var(--emec-danger) !important;\n    border: 1px solid var(--emec-danger) !important;\n}\n\n#emec-calculator.emec-calculator .emec-error-box,\n#emec-calculator.emec-calculator .emec-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#emec-calculator.emec-calculator .emec-error-box {\n    background: rgba(192, 57, 43, 0.08) !important;\n    border: 1px solid var(--emec-danger) !important;\n    color: var(--emec-danger) !important;\n}\n\n#emec-calculator.emec-calculator .emec-warning-box {\n    background: rgba(243, 156, 18, 0.08) !important;\n    border: 1px solid var(--emec-caution) !important;\n    color: #b7950b !important;\n}\n\n#emec-calculator.emec-calculator .emec-error-box ul,\n#emec-calculator.emec-calculator .emec-warning-box ul {\n    margin: 0.35rem 0 0 1.25rem !important;\n    padding: 0 !important;\n    list-style: disc !important;\n}\n\n#emec-calculator.emec-calculator .emec-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#emec-calculator.emec-calculator .emec-result-item {\n    background: var(--emec-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--emec-border) !important;\n}\n\n#emec-calculator.emec-calculator .emec-result-label {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--emec-text-muted) !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.03em !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-result-value {\n    display: block !important;\n    font-size: 1.1rem !important;\n    font-weight: 700 !important;\n    color: var(--emec-primary) !important;\n    font-family: var(--emec-mono) !important;\n}\n\n#emec-calculator.emec-calculator .emec-result-sub {\n    display: block !important;\n    font-size: 0.75rem !important;\n    color: var(--emec-text-muted) !important;\n    margin-top: 0.15rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-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#emec-calculator.emec-calculator .emec-recommendations h3 {\n    font-size: 0.9rem !important;\n    color: var(--emec-primary) !important;\n    margin: 0 0 0.5rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-recommendations ul {\n    margin: 0 !important;\n    padding-left: 1.25rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-visual-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#emec-calculator.emec-calculator .emec-viz-wide {\n    grid-column: 1 \/ -1 !important;\n}\n\n#emec-calculator.emec-calculator .emec-viz-card {\n    background: var(--emec-bg) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    border: 1px solid var(--emec-border) !important;\n}\n\n#emec-calculator.emec-calculator .emec-viz-card h3 {\n    font-size: 0.8rem !important;\n    color: var(--emec-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#emec-calculator.emec-calculator .emec-viz-card svg {\n    width: 100% !important;\n    height: auto !important;\n    display: block !important;\n}\n\n@media (max-width: 600px) {\n    #emec-calculator.emec-calculator .emec-form-row {\n        grid-template-columns: 1fr !important;\n    }\n\n    #emec-calculator.emec-calculator button.emec-btn-primary,\n    #emec-calculator.emec-calculator button.emec-btn-secondary {\n        width: 100% !important;\n    }\n}\n\n@media (max-width: 700px) {\n    #emec-calculator.emec-calculator .emec-visual-grid {\n        grid-template-columns: 1fr !important;\n    }\n\n    #emec-calculator.emec-calculator .emec-viz-wide {\n        grid-column: auto !important;\n    }\n}\n\n@media print {\n    #emec-calculator.emec-calculator .emec-form-actions,\n    #emec-calculator.emec-calculator .emec-unit-toggle {\n        display: none !important;\n    }\n}\n\n<\/style>\n<div id=\"emec-calculator\" class=\"emec-calculator\">\n        <div class=\"emec-layout\">\n            <section class=\"emec-input-panel emec-card\" aria-label=\"Calculator inputs\">\n                <div class=\"emec-panel-header\">\n                    <h2>Input Parameters<\/h2>\n                    <div class=\"emec-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                        <button type=\"button\" class=\"emec-unit-btn emec-active\" data-unit=\"metric\">Metric<\/button>\n                        <button type=\"button\" class=\"emec-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n                    <\/div>\n                <\/div>\n\n                <form id=\"emec-calcForm\" novalidate>\n                    <fieldset class=\"emec-input-section\">\n                        <legend>Calculation Mode<\/legend>\n                        <div class=\"emec-form-row\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-calcMode\">Mode<\/label>\n                                <select id=\"emec-calcMode\" name=\"calcMode\">\n                                    <option value=\"calcModulus\" selected>Calculate Elastic Modulus<\/option>\n                                    <option value=\"calcStress\">Calculate Stress<\/option>\n                                    <option value=\"calcStrain\">Calculate Strain<\/option>\n                                    <option value=\"calcElongation\">Calculate Elongation<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"emec-form-group emec-mode-field\" data-mode=\"calcModulus\">\n                                <label for=\"emec-inputMethod\">Input Method<\/label>\n                                <select id=\"emec-inputMethod\" name=\"inputMethod\">\n                                    <option value=\"stressStrain\" selected>Stress &amp; Strain<\/option>\n                                    <option value=\"forceGeometry\">Force &amp; Geometry<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"emec-input-section\">\n                        <legend>Geometry<\/legend>\n                        <div class=\"emec-form-group emec-geom-field\" data-mode=\"calcModulus calcStress calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStress calcElongation\">\n                            <label for=\"emec-sectionType\">Cross-Section Type<\/label>\n                            <select id=\"emec-sectionType\" name=\"sectionType\">\n                                <option value=\"solidRound\" selected>Solid Round<\/option>\n                                <option value=\"hollowRound\">Hollow Round<\/option>\n                                <option value=\"rectangle\">Rectangle<\/option>\n                                <option value=\"customArea\">Custom Area<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"emec-form-group emec-geom-field emec-section-solid\" data-mode=\"calcModulus calcStress calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStress calcElongation\">\n                            <label for=\"emec-diameter\">\n                                Diameter\n                                <span class=\"emec-tooltip\" data-tip=\"Solid round cross-section diameter\">?<\/span>\n                            <\/label>\n                            <div class=\"emec-input-with-unit\">\n                                <input type=\"number\" id=\"emec-diameter\" name=\"diameter\" value=\"20\" min=\"0.001\" step=\"any\">\n                                <span class=\"emec-unit-label\" data-unit-key=\"length\">mm<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-row emec-geom-field emec-section-hollow emec-hidden\" data-mode=\"calcModulus calcStress calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStress calcElongation\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-outerDiameter\">Outer Diameter<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-outerDiameter\" name=\"outerDiameter\" value=\"30\" min=\"0.001\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-innerDiameter\">Inner Diameter<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-innerDiameter\" name=\"innerDiameter\" value=\"20\" min=\"0.001\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-row emec-geom-field emec-section-rect emec-hidden\" data-mode=\"calcModulus calcStress calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStress calcElongation\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-width\">Width<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-width\" name=\"width\" value=\"40\" min=\"0.001\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-thickness\">Thickness<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-thickness\" name=\"thickness\" value=\"10\" min=\"0.001\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-group emec-geom-field emec-section-custom emec-hidden\" data-mode=\"calcModulus calcStress calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStress calcElongation\">\n                            <label for=\"emec-customArea\">Custom Cross-Sectional Area<\/label>\n                            <div class=\"emec-input-with-unit\">\n                                <input type=\"number\" id=\"emec-customArea\" name=\"customArea\" value=\"314.16\" min=\"0.001\" step=\"any\">\n                                <span class=\"emec-unit-label\" data-unit-key=\"area\">mm2<\/span>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"emec-input-section\">\n                        <legend>Loading &amp; Deformation<\/legend>\n                        <div class=\"emec-form-group emec-load-field\" data-mode=\"calcModulus calcStress calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStress calcElongation\">\n                            <label for=\"emec-appliedForce\">Applied Force<\/label>\n                            <div class=\"emec-input-with-unit\">\n                                <input type=\"number\" id=\"emec-appliedForce\" name=\"appliedForce\" value=\"50\" min=\"0.001\" step=\"any\">\n                                <select id=\"emec-forceUnit\" class=\"emec-inline-unit\" aria-label=\"Force unit\">\n                                    <option value=\"kN\" selected>kN<\/option>\n                                    <option value=\"N\">N<\/option>\n                                    <option value=\"lbf\">lbf<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-group emec-deform-field\" data-mode=\"calcModulus calcStrain calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStrain calcElongation\">\n                            <label for=\"emec-originalLength\">\n                                Original Length (L0)\n                                <span class=\"emec-tooltip\" data-tip=\"Original gauge length before loading\">?<\/span>\n                            <\/label>\n                            <div class=\"emec-input-with-unit\">\n                                <input type=\"number\" id=\"emec-originalLength\" name=\"originalLength\" value=\"100\" min=\"0.001\" step=\"any\">\n                                <select id=\"emec-lengthUnit\" class=\"emec-inline-unit\" aria-label=\"Length unit\">\n                                    <option value=\"mm\" selected>mm<\/option>\n                                    <option value=\"m\">m<\/option>\n                                    <option value=\"in\">in<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-group emec-deform-field\" data-mode=\"calcModulus calcStrain calcElongation\" data-method=\"forceGeometry\" data-always=\"calcStrain calcElongation\">\n                            <label for=\"emec-elongation\">Change in Length \/ Elongation (dL)<\/label>\n                            <div class=\"emec-input-with-unit\">\n                                <input type=\"number\" id=\"emec-elongation\" name=\"elongation\" value=\"0.1\" min=\"0.000001\" step=\"any\">\n                                <select id=\"emec-elongationUnit\" class=\"emec-inline-unit\" aria-label=\"Elongation 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\n                        <div class=\"emec-form-row emec-stress-field\" data-mode=\"calcModulus calcStress calcStrain\" data-method=\"stressStrain\" data-always=\"calcStress calcStrain\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-stress\">\n                                    Stress (&sigma;)\n                                    <span class=\"emec-tooltip\" data-tip=\"Normal stress = F \/ A\">?<\/span>\n                                <\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-stress\" name=\"stress\" value=\"200\" min=\"0.001\" step=\"any\">\n                                    <select id=\"emec-stressUnit\" class=\"emec-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=\"emec-form-group\">\n                                <label for=\"emec-strain\">\n                                    Strain (&epsilon;)\n                                    <span class=\"emec-tooltip\" data-tip=\"Normal strain = dL \/ L0\">?<\/span>\n                                <\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-strain\" name=\"strain\" value=\"0.001\" min=\"0.0000001\" step=\"any\">\n                                    <select id=\"emec-strainUnit\" class=\"emec-inline-unit\" aria-label=\"Strain unit\">\n                                        <option value=\"dimensionless\" selected>&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-group emec-modulus-field\" data-mode=\"calcStress calcStrain calcElongation\">\n                            <label for=\"emec-elasticModulus\">Elastic Modulus E<\/label>\n                            <div class=\"emec-input-with-unit\">\n                                <input type=\"number\" id=\"emec-elasticModulus\" name=\"elasticModulus\" value=\"200\" min=\"0.001\" step=\"any\">\n                                <select id=\"emec-modulusUnit\" class=\"emec-inline-unit\" aria-label=\"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                    <\/fieldset>\n\n                    <fieldset class=\"emec-input-section emec-advanced-section\">\n                        <legend>Advanced Options<\/legend>\n                        <div class=\"emec-form-row emec-twopoint-field\" data-mode=\"calcModulus\" data-method=\"stressStrain\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-stress1\">Stress Point 1 (&sigma;<sub>1<\/sub>) <span class=\"emec-optional\">(optional)<\/span><\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-stress1\" name=\"stress1\" placeholder=\"Two-point slope\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"stress\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-strain1\">Strain Point 1 (&epsilon;<sub>1<\/sub>)<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-strain1\" name=\"strain1\" placeholder=\"e.g. 0.0005\" step=\"any\">\n                                    <select id=\"emec-strain1Unit\" class=\"emec-inline-unit\" aria-label=\"Strain 1 unit\">\n                                        <option value=\"dimensionless\" selected>&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"emec-form-row emec-twopoint-field\" data-mode=\"calcModulus\" data-method=\"stressStrain\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-stress2\">Stress Point 2 (&sigma;<sub>2<\/sub>)<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-stress2\" name=\"stress2\" placeholder=\"Two-point slope\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"stress\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-strain2\">Strain Point 2 (&epsilon;<sub>2<\/sub>)<\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-strain2\" name=\"strain2\" placeholder=\"e.g. 0.001\" step=\"any\">\n                                    <select id=\"emec-strain2Unit\" class=\"emec-inline-unit\" aria-label=\"Strain 2 unit\">\n                                        <option value=\"dimensionless\" selected>&#8211;<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"emec-form-row\">\n                            <div class=\"emec-form-group emec-checkbox-group\">\n                                <label class=\"emec-checkbox-label\">\n                                    <input type=\"checkbox\" id=\"emec-secantModulus\" name=\"secantModulus\">\n                                    Secant modulus (E<sub>secant<\/sub> = &sigma; \/ &epsilon;)\n                                    <span class=\"emec-tooltip\" data-tip=\"Use when the selected point may be outside a verified linear region\">?<\/span>\n                                <\/label>\n                            <\/div>\n                            <div class=\"emec-form-group emec-checkbox-group\">\n                                <label class=\"emec-checkbox-label\">\n                                    <input type=\"checkbox\" id=\"emec-calcStiffness\" name=\"calcStiffness\" checked>\n                                    Calculate axial stiffness (k = AE\/L)\n                                <\/label>\n                            <\/div>\n                        <\/div>\n                        <div class=\"emec-form-group emec-checkbox-group\">\n                            <label class=\"emec-checkbox-label\">\n                                <input type=\"checkbox\" id=\"emec-calcEnergy\" name=\"calcEnergy\" checked>\n                                Calculate elastic strain energy (U = F\u00b2L \/ 2AE)\n                            <\/label>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"emec-input-section\">\n                        <legend>Material<\/legend>\n                        <div class=\"emec-form-row\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-material\">Material Preset<\/label>\n                                <select id=\"emec-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=\"brass\">Brass<\/option>\n                                    <option value=\"copper\">Copper<\/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 class=\"emec-form-group\">\n                                <label for=\"emec-yieldStrength\">\n                                    Yield Strength (S<sub>y<\/sub>) <span class=\"emec-optional\">(optional)<\/span>\n                                    <span class=\"emec-tooltip\" data-tip=\"Used for elastic range verification\">?<\/span>\n                                <\/label>\n                                <div class=\"emec-input-with-unit\">\n                                    <input type=\"number\" id=\"emec-yieldStrength\" name=\"yieldStrength\" value=\"355\" min=\"0.001\" step=\"any\">\n                                    <span class=\"emec-unit-label\" data-unit-key=\"stress\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"emec-form-row emec-ref-fields\">\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-refEMin\">Reference E Min (GPa)<\/label>\n                                <input type=\"number\" id=\"emec-refEMin\" name=\"refEMin\" value=\"190\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-refEMax\">Reference E Max (GPa)<\/label>\n                                <input type=\"number\" id=\"emec-refEMax\" name=\"refEMax\" value=\"210\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                            <div class=\"emec-form-group\">\n                                <label for=\"emec-refETypical\">Reference E Typical (GPa)<\/label>\n                                <input type=\"number\" id=\"emec-refETypical\" name=\"refETypical\" value=\"200\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                        <\/div>\n                        <p class=\"emec-ref-note\">Reference values are editable. Actual modulus depends on alloy, temperature, manufacturing process, and material condition.<\/p>\n                    <\/fieldset>\n\n                    <div class=\"emec-form-actions\">\n                        <button type=\"submit\" class=\"emec-btn emec-btn-primary\" id=\"emec-calculateBtn\">Calculate<\/button>\n                    <\/div>\n                <\/form>\n            <\/section>\n\n            <section class=\"emec-results-panel emec-card emec-hidden\" id=\"emec-resultsPanel\" aria-label=\"Calculation results\">\n                <div class=\"emec-panel-header\">\n                    <h2>Results<\/h2>\n                    <div id=\"emec-statusBadge\" class=\"emec-status-badge emec-status-neutral\">Awaiting Input<\/div>\n                <\/div>\n\n                <div id=\"emec-errorBox\" class=\"emec-error-box emec-hidden\" role=\"alert\"><\/div>\n                <div id=\"emec-warningBox\" class=\"emec-warning-box emec-hidden\" role=\"status\"><\/div>\n\n                <div class=\"emec-results-grid\" id=\"emec-resultsGrid\"><\/div>\n\n                <div id=\"emec-recommendations\" class=\"emec-recommendations emec-hidden\"><\/div>\n\n                <div class=\"emec-visual-grid\">\n                    <div class=\"emec-viz-card\">\n                        <h3>Tensile Specimen<\/h3>\n                        <svg id=\"emec-axialDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"emec-viz-card\">\n                        <h3>Length Comparison<\/h3>\n                        <svg id=\"emec-elongationDiagram\" viewBox=\"0 0 280 130\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"emec-viz-card emec-viz-wide\">\n                        <h3>Stress-Strain Curve<\/h3>\n                        <svg id=\"emec-stressStrainCurve\" viewBox=\"0 0 560 180\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"emec-viz-card\">\n                        <h3>Material Stiffness<\/h3>\n                        <svg id=\"emec-stiffnessGauge\" viewBox=\"0 0 200 140\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"emec-viz-card\">\n                        <h3>Elastic Range Status<\/h3>\n                        <svg id=\"emec-elasticGauge\" viewBox=\"0 0 200 140\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                <\/div>\n            <\/section>\n        <\/div>\n    <\/div>\n<script>\n(function(){\n  var r=document.getElementById('emec-calculator');\n  if(!r){return;}\n  try{\n    var p=[\"LyoqDQogKiBFbGFzdGljIE1vZHVsdXMgRSBDYWxjdWxhdG9yDQogKiBTY29wZWQgZm9yIFdvcmRQcmVzcyBlbWJlZCAtIGRvZXMgbm90IGFmZmVjdCBlbGVtZW50cyBvdXRzaWRlICNlbWVjLWNhbGN1bGF0b3INCiAqLw0KDQooZnVuY3Rpb24gKCkgew0KICAgICd1c2Ugc3RyaWN0JzsNCg0KICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1lYy1jYWxjdWxhdG9yJyk7DQogICAgaWYgKCFyb290KSByZXR1cm47DQoNCiAgICBmdW5jdGlvbiAkKGlkKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoJyNlbWVjLScgKyBpZCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gJGFsbChzZWwpIHsNCiAgICAgICAgcmV0dXJuIHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWwpOw0KICAgIH0NCg0KICAgIGNvbnN0IE1BVEVSSUFMUyA9IHsNCiAgICAgICAgc3RydWN0dXJhbFN0ZWVsOiAgIHsgbWluOiAxOTAsIG1heDogMjEwLCB0eXBpY2FsOiAyMDAsIHlpZWxkOiAzNTUgfSwNCiAgICAgICAgY2FyYm9uU3RlZWw6ICAgICAgIHsgbWluOiAxOTAsIG1heDogMjEwLCB0eXBpY2FsOiAyMDAsIHlpZWxkOiAyNTAgfSwNCiAgICAgICAgc3RhaW5sZXNzU3RlZWw6ICAgIHsgbWluOiAxOTAsIG1heDogMjAwLCB0eXBpY2FsOiAxOTUsIHlpZWxkOiAyMDUgfSwNCiAgICAgICAgYWx1bWludW06ICAgICAgICAgIHsgbWluOiA2OSwgIG1heDogNzIsICB0eXBpY2FsOiA3MCwgIHlpZWxkOiAyNzUgfSwNCiAgICAgICAgdGl0YW5pdW06ICAgICAgICAgIHsgbWluOiAxMDAsIG1heDogMTIwLCB0eXBpY2FsOiAxMTAsIHlpZWxkOiA4ODAgfSwNCiAgICAgICAgYnJhc3M6ICAgICAgICAgICAgIHsgbWluOiA5MCwgIG1heDogMTEwLCB0eXBpY2FsOiAxMDAsIHlpZWxkOiAxMjQgfSwNCiAgICAgICAgY29wcGVyOiAgICAgICAgICAgIHsgbWluOiAxMTAsIG1heDogMTMwLCB0eXBpY2FsOiAxMjAsIHlpZWxkOiA3MCB9LA0KICAgICAgICBjYXN0SXJvbjogICAgICAgICAgeyBtaW46IDgwLCAgbWF4OiAxMjAsIHR5cGljYWw6IDEwMCwgeWllbGQ6IDIwMCB9LA0KICAgICAgICBlbmdpbmVlcmluZ1BsYXN0aWM6eyBtaW46IDEsICAgbWF4OiA1LCAgIHR5cGljYWw6IDMsICAgeWllbGQ6IDUwIH0sDQogICAgICAgIGN1c3RvbTogICAgICAgICAgICB7IG1pbjogbnVsbCwgbWF4OiBudWxsLCB0eXBpY2FsOiBudWxsLCB5aWVsZDogbnVsbCB9DQogICAgfTsNCg0KICAgIGNvbnN0IENPTlYgPSB7DQogICAgICAgIGxlbmd0aFRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2ICogMjUuNDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBsZW5ndGhGcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2IC8gMjUuNDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbScpIHJldHVybiB2IC8gMTAwMDsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBlbG9uZ1RvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2ICogMjUuNDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAndW0nKSByZXR1cm4gdiAvIDEwMDA7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgZWxvbmdGcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2IC8gMjUuNDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAndW0nKSByZXR1cm4gdiAqIDEwMDA7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgYXJlYVRvSW50ZXJuYWwodiwgc3lzKSB7DQogICAgICAgICAgICByZXR1cm4gc3lzID09PSAnaW1wZXJpYWwnID8gdiAqIDY0NS4xNiA6IHY7DQogICAgICAgIH0sDQogICAgICAgIGFyZWFGcm9tSW50ZXJuYWwodiwgc3lzKSB7DQogICAgICAgICAgICByZXR1cm4gc3lzID09PSAnaW1wZXJpYWwnID8gdiAvIDY0NS4xNiA6IHY7DQogICAgICAgIH0sDQogICAgICAgIGZvcmNlVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tOJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdsYmYnKSByZXR1cm4gdiAqIDQuNDQ4MjI7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyZXNzVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ0dQYScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuIHYgKiAwLjAwNjg5NDc2Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gdiAqIDYuODk0NzY7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyZXNzRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnR1BhJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAvIDAuMDA2ODk0NzY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiB2IC8gNi44OTQ3NjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBtb2R1bHVzVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2IC8gMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuIHYgKiAwLjAwNjg5NDc2IC8gMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuIHYgKiA2Ljg5NDc2IC8gMTAwMDsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBtb2R1bHVzRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnTVBhJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gKHYgKiAxMDAwKSAvIDAuMDA2ODk0NzY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiAodiAqIDEwMDApIC8gNi44OTQ3NjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBzdHJhaW5Ub0ludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIHJldHVybiB1bml0ID09PSAncGVyY2VudCcgPyB2IC8gMTAwIDogdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyYWluRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIHJldHVybiB1bml0ID09PSAncGVyY2VudCcgPyB2ICogMTAwIDogdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RpZmZuZXNzRnJvbUludGVybmFsKHYsIHN5cykgew0KICAgICAgICAgICAgaWYgKHN5cyA9PT0gJ2ltcGVyaWFsJykgcmV0dXJuIHsgdmFsdWU6IHYgLyAxNzUuMTI3LCB1bml0OiAnbGJmL2luJyB9Ow0KICAgICAgICAgICAgaWYgKHYgPj0gMTAwMCkgcmV0dXJuIHsgdmFsdWU6IHYgKiAxMDAwLCB1bml0OiAnTi9tJyB9Ow0KICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHYsIHVuaXQ6ICdOL21tJyB9Ow0KICAgICAgICB9LA0KICAgICAgICBlbmVyZ3lGcm9tSW50ZXJuYWwodiwgc3lzKSB7DQogICAgICAgICAgICBpZiAoc3lzID09PSAnaW1wZXJpYWwnKSByZXR1cm4geyB2YWx1ZTogdiAvIDEuMzU1ODIsIHVuaXQ6ICdmdC1sYmYnIH07DQogICAgICAgICAgICBpZiAodiA+PSAxMDAwKSByZXR1cm4geyB2YWx1ZTogdiAvIDEwMDAsIHVuaXQ6ICdKJyB9Ow0KICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHYsIHVuaXQ6ICdOLW1tJyB9Ow0KICAgICAgICB9DQogICAgfTsNCg0KICAgIGxldCB1bml0U3lzdGVtID0gJ21ldHJpYyc7DQogICAgbGV0IGRlYm91bmNlVGltZXIgPSBudWxsOw0KDQogICAgY29uc3QgZm9ybSA9ICQoJ2NhbGNGb3JtJyk7DQogICAgY29uc3QgY2FsY01vZGUgPSAkKCdjYWxjTW9kZScpOw0KICAgIGNvbnN0IGlucHV0TWV0aG9kID0gJCgnaW5wdXRNZXRob2QnKTsNCiAgICBjb25zdCBzZWN0aW9uVHlwZSA9ICQoJ3NlY3Rpb25UeXBlJyk7DQogICAgY29uc3QgbWF0ZXJpYWxTZWxlY3QgPSAkKCdtYXRlcmlhbCcpOw0KICAgIGNvbnN0IHJlc3VsdHNQYW5lbCA9ICQoJ3Jlc3VsdHNQYW5lbCcpOw0KDQogICAgZnVuY3Rpb24gaW5pdCgpIHsNCiAgICAgICAgYmluZEV2ZW50cygpOw0KICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEV2ZW50cygpIHsNCiAgICAgICAgZm9ybS5hZGRFdmVu\",\n    \"dExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT4gew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgY2FsY3VsYXRlKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJy5lbWVjLXVuaXQtYnRuJykuZm9yRWFjaCgoYnRuKSA9PiB7DQogICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzd2l0Y2hVbml0U3lzdGVtKGJ0bi5kYXRhc2V0LnVuaXQpKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgY2FsY01vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlucHV0TWV0aG9kLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBzZWN0aW9uVHlwZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVTZWN0aW9uRmllbGRzKCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIG1hdGVyaWFsU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFwcGx5TWF0ZXJpYWxQcmVzZXQpOw0KDQogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcik7DQogICAgICAgICAgICBkZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlU2lsZW50KCkpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICAgICAgICB9LCA0MDApOw0KICAgICAgICB9KTsNCg0KICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIGlmICh2YWxpZGF0ZVNpbGVudCgpKSBjYWxjdWxhdGUoZmFsc2UpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzd2l0Y2hVbml0U3lzdGVtKHN5cykgew0KICAgICAgICBpZiAoc3lzID09PSB1bml0U3lzdGVtKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgZmllbGRzID0gew0KICAgICAgICAgICAgZGlhbWV0ZXI6ICdsZW5ndGgnLCBvdXRlckRpYW1ldGVyOiAnbGVuZ3RoJywgaW5uZXJEaWFtZXRlcjogJ2xlbmd0aCcsDQogICAgICAgICAgICB3aWR0aDogJ2xlbmd0aCcsIHRoaWNrbmVzczogJ2xlbmd0aCcsIG9yaWdpbmFsTGVuZ3RoOiAnbGVuZ3RoJywNCiAgICAgICAgICAgIGN1c3RvbUFyZWE6ICdhcmVhJywgc3RyZXNzOiAnc3RyZXNzJywgc3RyZXNzMTogJ3N0cmVzcycsIHN0cmVzczI6ICdzdHJlc3MnLA0KICAgICAgICAgICAgZWxhc3RpY01vZHVsdXM6ICdtb2R1bHVzJywgeWllbGRTdHJlbmd0aDogJ3N0cmVzcycsDQogICAgICAgICAgICByZWZFTWluOiAnbW9kdWx1cycsIHJlZkVNYXg6ICdtb2R1bHVzJywgcmVmRVR5cGljYWw6ICdtb2R1bHVzJywNCiAgICAgICAgICAgIGVsb25nYXRpb246ICdlbG9uZ2F0aW9uJw0KICAgICAgICB9Ow0KDQogICAgICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2lkLCB0eXBlXSkgPT4gew0KICAgICAgICAgICAgY29uc3QgZWwgPSAkKGlkKTsNCiAgICAgICAgICAgIGlmICghZWwgfHwgZWwudmFsdWUgPT09ICcnKSByZXR1cm47DQogICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsNCiAgICAgICAgICAgIGlmIChpc05hTih2YWwpKSByZXR1cm47DQoNCiAgICAgICAgICAgIGxldCBpbnRlcm5hbCwgZGlzcGxheTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbGVuZ3RoJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBpZCA9PT0gJ29yaWdpbmFsTGVuZ3RoJyA\/ICQoJ2xlbmd0aFVuaXQnKS52YWx1ZSA6IChzeXMgPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgaW50ZXJuYWwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwodmFsLCBpZCA9PT0gJ29yaWdpbmFsTGVuZ3RoJyA\/ICQoJ2xlbmd0aFVuaXQnKS52YWx1ZSA6IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICAgICAgZGlzcGxheSA9IENPTlYubGVuZ3RoRnJvbUludGVybmFsKGludGVybmFsLCBpZCA9PT0gJ29yaWdpbmFsTGVuZ3RoJyA\/IChzeXMgPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJykgOiAoc3lzID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FyZWEnKSB7DQogICAgICAgICAgICAgICAgaW50ZXJuYWwgPSBDT05WLmFyZWFUb0ludGVybmFsKHZhbCwgdW5pdFN5c3RlbSk7DQogICAgICAgICAgICAgICAgZGlzcGxheSA9IENPTlYuYXJlYUZyb21JbnRlcm5hbChpbnRlcm5hbCwgc3lzKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmVzcycpIHsNCiAgICAgICAgICAgICAgICBpbnRlcm5hbCA9IENPTlYuc3RyZXNzVG9JbnRlcm5hbCh2YWwsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAncHNpJyA6ICdNUGEnKTsNCiAgICAgICAgICAgICAgICBkaXNwbGF5ID0gQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoaW50ZXJuYWwsIHN5cyA9PT0gJ2ltcGVyaWFsJyA\/ICdwc2knIDogJ01QYScpOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbW9kdWx1cycpIHsNCiAgICAgICAgICAgICAgICBpbnRlcm5hbCA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwodmFsLCAnR1BhJyk7DQogICAgICAgICAgICAgICAgZGlzcGxheSA9IENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChpbnRlcm5hbCwgc3lzID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlbG9uZ2F0aW9uJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IHUgPSAkKCdlbG9uZ2F0aW9uVW5pdCcpLnZhbHVlOw0KICAgICAgICAgICAgICAgIGludGVybmFsID0gQ09OVi5lbG9uZ1RvSW50ZXJuYWwodmFsLCB1KTsNCiAgICAgICAgICAgICAgICBkaXNwbGF5ID0gQ09OVi5lbG9uZ0Zyb21JbnRlcm5hbChpbnRlcm5hbCwgc3lzID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWwudmFsdWUgPSBmb3JtYXROdW0oZGlzcGxheSwgNCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHVuaXRTeXN0ZW0gPSBzeXM7DQogICAgICAgICRhbGwoJy5lbWVjLXVuaXQtYnRuJykuZm9yRWFjaCgoYikgPT4gYi5jbGFzc0xpc3QudG9nZ2xlKCdlbWVjLWFjdGl2ZScsIGIuZGF0YXNldC51bml0ID09PSBzeXMpKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlVW5pdExhYmVscygpIHsNCiAgICAgICAgY29uc3QgaXNJbXAgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnOw0KICAgICAgICAkYWxsKCdbZGF0YS11bml0LWtleT0ibGVuZ3RoIl0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IGlzSW1wID8gJ2luJyA6ICdtbSc7IH0pOw0KICAgICAgICAkYWxsKCdbZGF0YS11bml0LWtleT0iYXJlYSJdJykuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBpc0ltcCA\/ICdpbjInIDogJ21tMic7IH0pOw0KICAgICAgICAkYWxsKCdbZGF0YS11bml0LWtleT0ic3RyZXNzIl0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IGlzSW1wID8gJ3BzaScgOiAnTVBhJzsgfSk7DQoNCiAgICAgICAgY29uc3QgZm9yY2VVbml0ID0gJCgnZm9yY2VVbml0Jyk7DQogICAgICAgIGlmIChpc0ltcCkgew0KICAgICAgICAgICAgZm9yY2VVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJsYmYiIHNlbGVjdGVkPmxiZjwvb3B0aW9uPic7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3JjZVVuaXQuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9ImtOIiBzZWxlY3RlZD5rTjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Ik4iPk48L29wdGlvbj4nOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgbGVuZ3RoVW5pdCA9ICQoJ2xlbmd0aFVuaXQnKTsNCiAgICAgICAgaWYgKGlzSW1wKSB7DQogICAgICAgICAgICBsZW5ndGhVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJpbiIgc2VsZWN0ZWQ+aW48L29wdGlvbj4nOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbGVuZ3RoVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ibW0iIHNlbGVjdGVkPm1tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibSI+bTwvb3B0aW9uPic7DQogICAgICAgIH0NCg0KICAg\",\n    \"ICAgICBjb25zdCBlbG9uZ1VuaXQgPSAkKCdlbG9uZ2F0aW9uVW5pdCcpOw0KICAgICAgICBpZiAoaXNJbXApIHsNCiAgICAgICAgICAgIGVsb25nVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iaW4iIHNlbGVjdGVkPmluPC9vcHRpb24+JzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsb25nVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ibW0iIHNlbGVjdGVkPm1tPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idW0iPnVtPC9vcHRpb24+JzsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHN0cmVzc1VuaXQgPSAkKCdzdHJlc3NVbml0Jyk7DQogICAgICAgIGlmIChpc0ltcCkgew0KICAgICAgICAgICAgc3RyZXNzVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0icHNpIiBzZWxlY3RlZD5wc2k8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrc2kiPmtzaTwvb3B0aW9uPic7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzdHJlc3NVbml0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJNUGEiIHNlbGVjdGVkPk1QYTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IkdQYSI+R1BhPC9vcHRpb24+JzsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IG1vZHVsdXNVbml0ID0gJCgnbW9kdWx1c1VuaXQnKTsNCiAgICAgICAgaWYgKGlzSW1wKSB7DQogICAgICAgICAgICBtb2R1bHVzVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0ia3NpIiBzZWxlY3RlZD5rc2k8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwc2kiPnBzaTwvb3B0aW9uPic7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBtb2R1bHVzVW5pdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iR1BhIiBzZWxlY3RlZD5HUGE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJNUGEiPk1QYTwvb3B0aW9uPic7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVTZWN0aW9uRmllbGRzKCkgew0KICAgICAgICBjb25zdCBzdCA9IHNlY3Rpb25UeXBlLnZhbHVlOw0KICAgICAgICAkYWxsKCcuZW1lYy1zZWN0aW9uLXNvbGlkJykuZm9yRWFjaCgoZWwpID0+IGVsLmNsYXNzTGlzdC50b2dnbGUoJ2VtZWMtaGlkZGVuJywgc3QgIT09ICdzb2xpZFJvdW5kJykpOw0KICAgICAgICAkYWxsKCcuZW1lYy1zZWN0aW9uLWhvbGxvdycpLmZvckVhY2goKGVsKSA9PiBlbC5jbGFzc0xpc3QudG9nZ2xlKCdlbWVjLWhpZGRlbicsIHN0ICE9PSAnaG9sbG93Um91bmQnKSk7DQogICAgICAgICRhbGwoJy5lbWVjLXNlY3Rpb24tcmVjdCcpLmZvckVhY2goKGVsKSA9PiBlbC5jbGFzc0xpc3QudG9nZ2xlKCdlbWVjLWhpZGRlbicsIHN0ICE9PSAncmVjdGFuZ2xlJykpOw0KICAgICAgICAkYWxsKCcuZW1lYy1zZWN0aW9uLWN1c3RvbScpLmZvckVhY2goKGVsKSA9PiBlbC5jbGFzc0xpc3QudG9nZ2xlKCdlbWVjLWhpZGRlbicsIHN0ICE9PSAnY3VzdG9tQXJlYScpKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKSB7DQogICAgICAgIGNvbnN0IG1vZGUgPSBjYWxjTW9kZS52YWx1ZTsNCiAgICAgICAgY29uc3QgbWV0aG9kID0gaW5wdXRNZXRob2QudmFsdWU7DQoNCiAgICAgICAgJGFsbCgnW2RhdGEtbW9kZV0nKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgY29uc3QgbW9kZXMgPSBlbC5kYXRhc2V0Lm1vZGUuc3BsaXQoJyAnKTsNCiAgICAgICAgICAgIGlmICghbW9kZXMuaW5jbHVkZXMobW9kZSkpIHsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdlbWVjLWhpZGRlbicpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbnN0IGFsd2F5c01vZGVzID0gZWwuZGF0YXNldC5hbHdheXMgPyBlbC5kYXRhc2V0LmFsd2F5cy5zcGxpdCgnICcpIDogW107DQogICAgICAgICAgICBpZiAoYWx3YXlzTW9kZXMuaW5jbHVkZXMobW9kZSkpIHsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdlbWVjLWhpZGRlbicpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbC5kYXRhc2V0Lm1ldGhvZCAmJiBtb2RlID09PSAnY2FsY01vZHVsdXMnKSB7DQogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnZW1lYy1oaWRkZW4nLCAhZWwuZGF0YXNldC5tZXRob2Quc3BsaXQoJyAnKS5pbmNsdWRlcyhtZXRob2QpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZW1lYy1oaWRkZW4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgJGFsbCgnLmVtZWMtdHdvcG9pbnQtZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnZW1lYy1oaWRkZW4nLCBtb2RlICE9PSAnY2FsY01vZHVsdXMnIHx8IG1ldGhvZCAhPT0gJ3N0cmVzc1N0cmFpbicpOw0KICAgICAgICB9KTsNCg0KICAgICAgICB1cGRhdGVTZWN0aW9uRmllbGRzKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXBwbHlNYXRlcmlhbFByZXNldCgpIHsNCiAgICAgICAgY29uc3QgbWF0ID0gTUFURVJJQUxTW21hdGVyaWFsU2VsZWN0LnZhbHVlXTsNCiAgICAgICAgaWYgKCFtYXQgfHwgbWF0ZXJpYWxTZWxlY3QudmFsdWUgPT09ICdjdXN0b20nKSByZXR1cm47DQogICAgICAgIGlmIChtYXQubWluICE9IG51bGwpICQoJ3JlZkVNaW4nKS52YWx1ZSA9IG1hdC5taW47DQogICAgICAgIGlmIChtYXQubWF4ICE9IG51bGwpICQoJ3JlZkVNYXgnKS52YWx1ZSA9IG1hdC5tYXg7DQogICAgICAgIGlmIChtYXQudHlwaWNhbCAhPSBudWxsKSAkKCdyZWZFVHlwaWNhbCcpLnZhbHVlID0gbWF0LnR5cGljYWw7DQogICAgICAgIGlmIChtYXQueWllbGQgIT0gbnVsbCkgew0KICAgICAgICAgICAgY29uc3QgeSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcNCiAgICAgICAgICAgICAgICA\/IENPTlYuc3RyZXNzRnJvbUludGVybmFsKG1hdC55aWVsZCwgJ3BzaScpDQogICAgICAgICAgICAgICAgOiBtYXQueWllbGQ7DQogICAgICAgICAgICAkKCd5aWVsZFN0cmVuZ3RoJykudmFsdWUgPSBmb3JtYXROdW0oeSwgMSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bShpZCkgew0KICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7DQogICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsNCiAgICAgICAgcmV0dXJuIGlzTmFOKHYpID8gbnVsbCA6IHY7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY0FyZWEoaW5wdXRzKSB7DQogICAgICAgIGNvbnN0IHN0ID0gaW5wdXRzLnNlY3Rpb25UeXBlOw0KICAgICAgICBpZiAoc3QgPT09ICdzb2xpZFJvdW5kJykgew0KICAgICAgICAgICAgY29uc3QgZCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMuZGlhbWV0ZXIsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICByZXR1cm4gTWF0aC5QSSAqIGQgKiBkIC8gNDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoc3QgPT09ICdob2xsb3dSb3VuZCcpIHsNCiAgICAgICAgICAgIGNvbnN0IEQgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm91dGVyRGlhbWV0ZXIsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJyk7DQogICAgICAgICAgICBjb25zdCBkID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5pbm5lckRpYW1ldGVyLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgcmV0dXJuIE1hdGguUEkgKiAoRCAqIEQgLSBkICogZCkgLyA0Ow0KICAgICAgICB9DQogICAgICAgIGlmIChzdCA9PT0gJ3JlY3RhbmdsZScpIHsNCiAgICAgICAgICAgIGNvbnN0IGIgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLndpZHRoLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgY29uc3QgdCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMudGhpY2tuZXNzLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgcmV0dXJuIGIgKiB0Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiBDT05WLmFyZWFUb0ludGVybmFsKGlucHV0cy5jdXN0b21BcmVhLCB1bml0U3lzdGVtKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRJbnB1dHMoKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBtb2RlOiBjYWxjTW9kZS52YWx1ZSwNCiAgICAgICAgICAgIGlucHV0TWV0aG9kOiBpbnB1dE1ldGhvZC52YWx1ZSwNCiAgICAgICAgICAgIHNlY3Rpb25UeXBlOiBzZWN0aW9uVHlwZS52YWx1ZSwNCiAgICAgICAgICAgIGRpYW1ldGVyOiBwYXJzZU51bSgnZGlhbWV0ZXInKSwNCiAgICAgICAgICAgIG91dGVyRGlhbWV0ZXI6IHBhcnNlTnVtKCdvdXRlckRp\",\n    \"YW1ldGVyJyksDQogICAgICAgICAgICBpbm5lckRpYW1ldGVyOiBwYXJzZU51bSgnaW5uZXJEaWFtZXRlcicpLA0KICAgICAgICAgICAgd2lkdGg6IHBhcnNlTnVtKCd3aWR0aCcpLA0KICAgICAgICAgICAgdGhpY2tuZXNzOiBwYXJzZU51bSgndGhpY2tuZXNzJyksDQogICAgICAgICAgICBjdXN0b21BcmVhOiBwYXJzZU51bSgnY3VzdG9tQXJlYScpLA0KICAgICAgICAgICAgYXBwbGllZEZvcmNlOiBwYXJzZU51bSgnYXBwbGllZEZvcmNlJyksDQogICAgICAgICAgICBmb3JjZVVuaXQ6ICQoJ2ZvcmNlVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgb3JpZ2luYWxMZW5ndGg6IHBhcnNlTnVtKCdvcmlnaW5hbExlbmd0aCcpLA0KICAgICAgICAgICAgbGVuZ3RoVW5pdDogJCgnbGVuZ3RoVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgZWxvbmdhdGlvbjogcGFyc2VOdW0oJ2Vsb25nYXRpb24nKSwNCiAgICAgICAgICAgIGVsb25nYXRpb25Vbml0OiAkKCdlbG9uZ2F0aW9uVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgc3RyZXNzOiBwYXJzZU51bSgnc3RyZXNzJyksDQogICAgICAgICAgICBzdHJlc3NVbml0OiAkKCdzdHJlc3NVbml0JykudmFsdWUsDQogICAgICAgICAgICBzdHJhaW46IHBhcnNlTnVtKCdzdHJhaW4nKSwNCiAgICAgICAgICAgIHN0cmFpblVuaXQ6ICQoJ3N0cmFpblVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIGVsYXN0aWNNb2R1bHVzOiBwYXJzZU51bSgnZWxhc3RpY01vZHVsdXMnKSwNCiAgICAgICAgICAgIG1vZHVsdXNVbml0OiAkKCdtb2R1bHVzVW5pdCcpLnZhbHVlLA0KICAgICAgICAgICAgc3RyZXNzMTogcGFyc2VOdW0oJ3N0cmVzczEnKSwNCiAgICAgICAgICAgIHN0cmFpbjE6IHBhcnNlTnVtKCdzdHJhaW4xJyksDQogICAgICAgICAgICBzdHJhaW4xVW5pdDogJCgnc3RyYWluMVVuaXQnKS52YWx1ZSwNCiAgICAgICAgICAgIHN0cmVzczI6IHBhcnNlTnVtKCdzdHJlc3MyJyksDQogICAgICAgICAgICBzdHJhaW4yOiBwYXJzZU51bSgnc3RyYWluMicpLA0KICAgICAgICAgICAgc3RyYWluMlVuaXQ6ICQoJ3N0cmFpbjJVbml0JykudmFsdWUsDQogICAgICAgICAgICBzZWNhbnRNb2R1bHVzOiAkKCdzZWNhbnRNb2R1bHVzJykuY2hlY2tlZCwNCiAgICAgICAgICAgIGNhbGNTdGlmZm5lc3M6ICQoJ2NhbGNTdGlmZm5lc3MnKS5jaGVja2VkLA0KICAgICAgICAgICAgY2FsY0VuZXJneTogJCgnY2FsY0VuZXJneScpLmNoZWNrZWQsDQogICAgICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWxTZWxlY3QudmFsdWUsDQogICAgICAgICAgICB5aWVsZFN0cmVuZ3RoOiBwYXJzZU51bSgneWllbGRTdHJlbmd0aCcpLA0KICAgICAgICAgICAgcmVmRU1pbjogcGFyc2VOdW0oJ3JlZkVNaW4nKSwNCiAgICAgICAgICAgIHJlZkVNYXg6IHBhcnNlTnVtKCdyZWZFTWF4JyksDQogICAgICAgICAgICByZWZFVHlwaWNhbDogcGFyc2VOdW0oJ3JlZkVUeXBpY2FsJykNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZVNpbGVudCgpIHsNCiAgICAgICAgY29uc3QgaW5wdXRzID0gZ2V0SW5wdXRzKCk7DQogICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlSW5wdXRzKGlucHV0cyk7DQogICAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID09PSAwOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXRzKGlucHV0cykgew0KICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsNCiAgICAgICAgY29uc3QgbmVlZHNHZW9tZXRyeSA9IGlucHV0cy5tb2RlICE9PSAnY2FsY1N0cmFpbicgfHwNCiAgICAgICAgICAgIChpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdmb3JjZUdlb21ldHJ5JyAmJiBpbnB1dHMubW9kZSA9PT0gJ2NhbGNNb2R1bHVzJyk7DQoNCiAgICAgICAgY29uc3QgdXNlc0ZvcmNlID0gKGlucHV0cy5tb2RlID09PSAnY2FsY01vZHVsdXMnICYmIGlucHV0cy5pbnB1dE1ldGhvZCA9PT0gJ2ZvcmNlR2VvbWV0cnknKSB8fA0KICAgICAgICAgICAgaW5wdXRzLm1vZGUgPT09ICdjYWxjRWxvbmdhdGlvbicgfHwNCiAgICAgICAgICAgIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNTdHJlc3MnICYmIGlucHV0cy5pbnB1dE1ldGhvZCA9PT0gJ2ZvcmNlR2VvbWV0cnknKTsNCg0KICAgICAgICBjb25zdCB1c2VzU3RyZXNzU3RyYWluID0gKGlucHV0cy5tb2RlID09PSAnY2FsY01vZHVsdXMnICYmIGlucHV0cy5pbnB1dE1ldGhvZCA9PT0gJ3N0cmVzc1N0cmFpbicpIHx8DQogICAgICAgICAgICBpbnB1dHMubW9kZSA9PT0gJ2NhbGNTdHJlc3MnIHx8DQogICAgICAgICAgICBpbnB1dHMubW9kZSA9PT0gJ2NhbGNTdHJhaW4nOw0KDQogICAgICAgIGlmICh1c2VzRm9yY2UpIHsNCiAgICAgICAgICAgIGlmIChpbnB1dHMuYXBwbGllZEZvcmNlID09PSBudWxsIHx8IGlucHV0cy5hcHBsaWVkRm9yY2UgPD0gMCkgew0KICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdBcHBsaWVkIGZvcmNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaW5wdXRzLnNlY3Rpb25UeXBlID09PSAnaG9sbG93Um91bmQnKSB7DQogICAgICAgICAgICAgICAgY29uc3Qgb2QgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm91dGVyRGlhbWV0ZXIgfHwgMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKTsNCiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMuaW5uZXJEaWFtZXRlciB8fCAwLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICAgICAgICAgIGlmIChpZCA+PSBvZCkgZXJyb3JzLnB1c2goJ0lubmVyIGRpYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG91dGVyIGRpYW1ldGVyLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29uc3QgQSA9IGNhbGNBcmVhKGlucHV0cyk7DQogICAgICAgICAgICBpZiAoQSA8PSAwKSBlcnJvcnMucHVzaCgnQ3Jvc3Mtc2VjdGlvbmFsIGFyZWEgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNNb2R1bHVzJyAmJiBpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdmb3JjZUdlb21ldHJ5Jykgew0KICAgICAgICAgICAgY29uc3QgTDAgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm9yaWdpbmFsTGVuZ3RoIHx8IDAsIGlucHV0cy5sZW5ndGhVbml0KTsNCiAgICAgICAgICAgIGNvbnN0IGRMID0gQ09OVi5lbG9uZ1RvSW50ZXJuYWwoaW5wdXRzLmVsb25nYXRpb24gfHwgMCwgaW5wdXRzLmVsb25nYXRpb25Vbml0KTsNCiAgICAgICAgICAgIGlmIChMMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICBpZiAoZEwgPD0gMCkgZXJyb3JzLnB1c2goJ0Vsb25nYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh1c2VzU3RyZXNzU3RyYWluICYmIGlucHV0cy5tb2RlICE9PSAnY2FsY0Vsb25nYXRpb24nKSB7DQogICAgICAgICAgICBpZiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjTW9kdWx1cycgfHwgaW5wdXRzLm1vZGUgPT09ICdjYWxjU3RyZXNzJykgew0KICAgICAgICAgICAgICAgIGlmIChpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdzdHJlc3NTdHJhaW4nICYmIGlucHV0cy5tb2RlID09PSAnY2FsY01vZHVsdXMnKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1R3b1BvaW50ID0gaW5wdXRzLnN0cmVzczEgIT0gbnVsbCAmJiBpbnB1dHMuc3RyYWluMSAhPSBudWxsICYmDQogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHMuc3RyZXNzMiAhPSBudWxsICYmIGlucHV0cy5zdHJhaW4yICE9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIGlmICghaGFzVHdvUG9pbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVwcyA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChpbnB1dHMuc3RyYWluIHx8IDAsIGlucHV0cy5zdHJhaW5Vbml0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcHMgPT09IDApIGVycm9ycy5wdXNoKCdTdHJhaW4gY2Fubm90IGJlIHplcm8gd2hlbiBjYWxjdWxhdGluZyBlbGFzdGljIG1vZHVsdXMuJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaW5wdXRzLm1vZGUgPT09ICdjYWxjU3RyYWluJyAmJiBpbnB1dHMuaW5wdXRNZXRob2QgIT09ICdmb3JjZUdlb21ldHJ5Jykgew0KICAgICAgICAgICAgICAgIGNvbnN0IEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5lbGFzdGljTW9kdWx1cyB8fCAwLCBpbnB1dHMubW9kdWx1c1VuaXQpOw0KICAgICAgICAgICAgICAgIGlmIChFIDw9IDApIGVycm9ycy5wdXNoKCdFbGFzdGljIG1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVy\",\n    \"by4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNFbG9uZ2F0aW9uJykgew0KICAgICAgICAgICAgY29uc3QgRSA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwoaW5wdXRzLmVsYXN0aWNNb2R1bHVzIHx8IDAsIGlucHV0cy5tb2R1bHVzVW5pdCk7DQogICAgICAgICAgICBjb25zdCBMMCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChpbnB1dHMub3JpZ2luYWxMZW5ndGggfHwgMCwgaW5wdXRzLmxlbmd0aFVuaXQpOw0KICAgICAgICAgICAgaWYgKEUgPD0gMCkgZXJyb3JzLnB1c2goJ0VsYXN0aWMgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgaWYgKEwwIDw9IDApIGVycm9ycy5wdXNoKCdPcmlnaW5hbCBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNTdHJlc3MnICYmIGlucHV0cy5pbnB1dE1ldGhvZCA9PT0gJ3N0cmVzc1N0cmFpbicpIHsNCiAgICAgICAgICAgIGNvbnN0IEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5lbGFzdGljTW9kdWx1cyB8fCAwLCBpbnB1dHMubW9kdWx1c1VuaXQpOw0KICAgICAgICAgICAgaWYgKEUgPD0gMCkgZXJyb3JzLnB1c2goJ0VsYXN0aWMgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIHdoZW4gY2FsY3VsYXRpbmcgc3RyZXNzIGZyb20gc3RyYWluLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGVycm9yczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoc2hvd1BhbmVsKSB7DQogICAgICAgIGlmIChzaG93UGFuZWwgPT09IHVuZGVmaW5lZCkgc2hvd1BhbmVsID0gdHJ1ZTsNCiAgICAgICAgaGlkZU1lc3NhZ2VzKCk7DQogICAgICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0cygpOw0KICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZUlucHV0cyhpbnB1dHMpOw0KICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgew0KICAgICAgICAgICAgaWYgKHNob3dQYW5lbCkgew0KICAgICAgICAgICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgICAgICBzaG93RXJyb3JzKGVycm9ycyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCB3YXJuaW5ncyA9IFtdOw0KICAgICAgICBsZXQgc2lnbWEgPSBudWxsLCBlcHMgPSBudWxsLCBFID0gbnVsbCwgZEwgPSBudWxsLCBMMCA9IG51bGwsIEYgPSBudWxsLCBBID0gbnVsbDsNCiAgICAgICAgbGV0IGlzU2VjYW50ID0gaW5wdXRzLnNlY2FudE1vZHVsdXM7DQogICAgICAgIGxldCBtb2R1bHVzTGFiZWwgPSAiWW91bmcncyBNb2R1bHVzIEUiOw0KDQogICAgICAgIGlmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNNb2R1bHVzJykgew0KICAgICAgICAgICAgaWYgKGlucHV0cy5pbnB1dE1ldGhvZCA9PT0gJ3N0cmVzc1N0cmFpbicpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBoYXNUd29Qb2ludCA9IGlucHV0cy5zdHJlc3MxICE9IG51bGwgJiYgaW5wdXRzLnN0cmFpbjEgIT0gbnVsbCAmJg0KICAgICAgICAgICAgICAgICAgICBpbnB1dHMuc3RyZXNzMiAhPSBudWxsICYmIGlucHV0cy5zdHJhaW4yICE9IG51bGw7DQoNCiAgICAgICAgICAgICAgICBpZiAoaGFzVHdvUG9pbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgczEgPSBDT05WLnN0cmVzc1RvSW50ZXJuYWwoaW5wdXRzLnN0cmVzczEsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAncHNpJyA6ICdNUGEnKTsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgczIgPSBDT05WLnN0cmVzc1RvSW50ZXJuYWwoaW5wdXRzLnN0cmVzczIsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAncHNpJyA6ICdNUGEnKTsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZTEgPSBDT05WLnN0cmFpblRvSW50ZXJuYWwoaW5wdXRzLnN0cmFpbjEsIGlucHV0cy5zdHJhaW4xVW5pdCk7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGUyID0gQ09OVi5zdHJhaW5Ub0ludGVybmFsKGlucHV0cy5zdHJhaW4yLCBpbnB1dHMuc3RyYWluMlVuaXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoczIgLSBzMSkgPCAxZS0xMiAmJiBNYXRoLmFicyhlMiAtIGUxKSA8IDFlLTEyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdUd28gc3RyZXNzLXN0cmFpbiBwb2ludHMgYXJlIGlkZW50aWNhbCAtIGNhbm5vdCBjb21wdXRlIHNsb3BlLicpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGUyIC0gZTEpIDwgMWUtMTUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1N0cmFpbiBkaWZmZXJlbmNlIGlzIHplcm8gLSBjYW5ub3QgY2FsY3VsYXRlIG1vZHVsdXMgZnJvbSB0d28gcG9pbnRzLicpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgRSA9IChzMiAtIHMxKSAvIChlMiAtIGUxKSAvIDEwMDA7DQogICAgICAgICAgICAgICAgICAgICAgICBzaWdtYSA9IHMyOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXBzID0gZTI7DQogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bHVzTGFiZWwgPSAnVHdvLVBvaW50IE1vZHVsdXMgRSc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBzaWdtYSA9IENPTlYuc3RyZXNzVG9JbnRlcm5hbChpbnB1dHMuc3RyZXNzLCBpbnB1dHMuc3RyZXNzVW5pdCk7DQogICAgICAgICAgICAgICAgICAgIGVwcyA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChpbnB1dHMuc3RyYWluLCBpbnB1dHMuc3RyYWluVW5pdCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChlcHMgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcnMoWydTdHJhaW4gY2Fubm90IGJlIHplcm8gd2hlbiBjYWxjdWxhdGluZyBlbGFzdGljIG1vZHVsdXMuJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIEUgPSAoc2lnbWEgLyBlcHMpIC8gMTAwMDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VjYW50KSBtb2R1bHVzTGFiZWwgPSAnU2VjYW50IE1vZHVsdXMgRSc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBGID0gQ09OVi5mb3JjZVRvSW50ZXJuYWwoaW5wdXRzLmFwcGxpZWRGb3JjZSwgaW5wdXRzLmZvcmNlVW5pdCk7DQogICAgICAgICAgICAgICAgTDAgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm9yaWdpbmFsTGVuZ3RoLCBpbnB1dHMubGVuZ3RoVW5pdCk7DQogICAgICAgICAgICAgICAgZEwgPSBDT05WLmVsb25nVG9JbnRlcm5hbChpbnB1dHMuZWxvbmdhdGlvbiwgaW5wdXRzLmVsb25nYXRpb25Vbml0KTsNCiAgICAgICAgICAgICAgICBBID0gY2FsY0FyZWEoaW5wdXRzKTsNCiAgICAgICAgICAgICAgICBzaWdtYSA9IEYgLyBBOw0KICAgICAgICAgICAgICAgIGVwcyA9IGRMIC8gTDA7DQogICAgICAgICAgICAgICAgRSA9IChGICogTDApIC8gKEEgKiBkTCkgLyAxMDAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGlucHV0cy5tb2RlID09PSAnY2FsY1N0cmVzcycpIHsNCiAgICAgICAgICAgIEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5lbGFzdGljTW9kdWx1cywgaW5wdXRzLm1vZHVsdXNVbml0KTsNCiAgICAgICAgICAgIEYgPSBDT05WLmZvcmNlVG9JbnRlcm5hbChpbnB1dHMuYXBwbGllZEZvcmNlLCBpbnB1dHMuZm9yY2VVbml0KTsNCiAgICAgICAgICAgIEEgPSBjYWxjQXJlYShpbnB1dHMpOw0KICAgICAgICAgICAgY29uc3QgaGFzRm9yY2UgPSBpbnB1dHMuYXBwbGllZEZvcmNlICE9IG51bGwgJiYgaW5wdXRzLmFwcGxpZWRGb3JjZSA+IDAgJiYgQSA+IDA7DQogICAgICAgICAgICBjb25zdCBoYXNNb2R1bHVzU3RyYWluID0gRSA+IDAgJiYgaW5wdXRzLnN0cmFpbiAhPSBudWxsOw0KDQogICAgICAgICAgICBpZiAoaGFzRm9yY2UpIHsNCiAgICAgICAgICAgICAgICBzaWdtYSA9IEYgLyBBOw0KICAgICAgICAgICAgICAgIGVwcyA9IEUgPiAwID8gc2lnbWEgLyAoRSAqIDEwMDApIDogbnVsbDsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzTW9kdWx1c1N0cmFpbikgew0KICAgICAgICAgICAgICAgIGVwcyA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChpbnB1dHMuc3RyYWluLCBpbnB1dHMuc3RyYWluVW5pdCk7DQogICAgICAgICAgICAgICAgc2lnbWEgPSBFICogMTAwMCAqIGVwczsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0K\",\n    \"ICAgICAgICAgICAgICAgIHNob3dFcnJvcnMoWydQcm92aWRlIGFwcGxpZWQgZm9yY2UgYW5kIGdlb21ldHJ5LCBvciBlbGFzdGljIG1vZHVsdXMgYW5kIHN0cmFpbi4nXSk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGlucHV0cy5tb2RlID09PSAnY2FsY1N0cmFpbicpIHsNCiAgICAgICAgICAgIHNpZ21hID0gQ09OVi5zdHJlc3NUb0ludGVybmFsKGlucHV0cy5zdHJlc3MsIGlucHV0cy5zdHJlc3NVbml0KTsNCiAgICAgICAgICAgIEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5lbGFzdGljTW9kdWx1cywgaW5wdXRzLm1vZHVsdXNVbml0KTsNCiAgICAgICAgICAgIGlmIChFIDw9IDApIHsNCiAgICAgICAgICAgICAgICBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgICAgICAgICAgICAgc2hvd0Vycm9ycyhbJ0VsYXN0aWMgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiddKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlcHMgPSBzaWdtYSAvIChFICogMTAwMCk7DQogICAgICAgICAgICBpZiAoaW5wdXRzLm9yaWdpbmFsTGVuZ3RoICE9IG51bGwgJiYgaW5wdXRzLmVsb25nYXRpb24gIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIEwwID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKGlucHV0cy5vcmlnaW5hbExlbmd0aCwgaW5wdXRzLmxlbmd0aFVuaXQpOw0KICAgICAgICAgICAgICAgIGRMID0gQ09OVi5lbG9uZ1RvSW50ZXJuYWwoaW5wdXRzLmVsb25nYXRpb24sIGlucHV0cy5lbG9uZ2F0aW9uVW5pdCk7DQogICAgICAgICAgICAgICAgY29uc3QgZXBzR2VvbSA9IGRMIC8gTDA7DQogICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGVwc0dlb20gLSBlcHMpIC8gZXBzID4gMC4wNSkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdTdHJhaW4gZnJvbSBnZW9tZXRyeSBkaWZmZXJzIGZyb20gc3RyZXNzL0UgLSB2ZXJpZnkgaW5wdXRzIGFuZCBlbGFzdGljIGFzc3VtcHRpb25zLicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNFbG9uZ2F0aW9uJykgew0KICAgICAgICAgICAgRiA9IENPTlYuZm9yY2VUb0ludGVybmFsKGlucHV0cy5hcHBsaWVkRm9yY2UsIGlucHV0cy5mb3JjZVVuaXQpOw0KICAgICAgICAgICAgTDAgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm9yaWdpbmFsTGVuZ3RoLCBpbnB1dHMubGVuZ3RoVW5pdCk7DQogICAgICAgICAgICBBID0gY2FsY0FyZWEoaW5wdXRzKTsNCiAgICAgICAgICAgIEUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5lbGFzdGljTW9kdWx1cywgaW5wdXRzLm1vZHVsdXNVbml0KTsNCiAgICAgICAgICAgIHNpZ21hID0gRiAvIEE7DQogICAgICAgICAgICBkTCA9IChGICogTDApIC8gKEEgKiBFICogMTAwMCk7DQogICAgICAgICAgICBlcHMgPSBkTCAvIEwwOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKEYgPT09IG51bGwgJiYgc2lnbWEgIT0gbnVsbCAmJiBBICE9IG51bGwgJiYgQSA+IDApIEYgPSBzaWdtYSAqIEE7DQogICAgICAgIGlmIChBID09PSBudWxsICYmIChpbnB1dHMubW9kZSA9PT0gJ2NhbGNNb2R1bHVzJyAmJiBpbnB1dHMuaW5wdXRNZXRob2QgPT09ICdmb3JjZUdlb21ldHJ5JykgfHwNCiAgICAgICAgICAgIGlucHV0cy5tb2RlID09PSAnY2FsY1N0cmVzcycgfHwgaW5wdXRzLm1vZGUgPT09ICdjYWxjRWxvbmdhdGlvbicpIHsNCiAgICAgICAgICAgIEEgPSBjYWxjQXJlYShpbnB1dHMpOw0KICAgICAgICB9DQogICAgICAgIGlmIChMMCA9PT0gbnVsbCAmJiBpbnB1dHMub3JpZ2luYWxMZW5ndGggIT0gbnVsbCkgew0KICAgICAgICAgICAgTDAgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoaW5wdXRzLm9yaWdpbmFsTGVuZ3RoLCBpbnB1dHMubGVuZ3RoVW5pdCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRMID09PSBudWxsICYmIGVwcyAhPSBudWxsICYmIEwwICE9IG51bGwpIGRMID0gZXBzICogTDA7DQoNCiAgICAgICAgaWYgKGVwcyAhPSBudWxsICYmIGVwcyA+IDAuMDEpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1N0cmFpbiBleGNlZWRzIDElIC0gdW51c3VhbGx5IGxhcmdlIGZvciBhIGxpbmVhciBlbGFzdGljIGNhbGN1bGF0aW9uLiBWZXJpZnkgZWxhc3RpYyByYW5nZS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IFN5ID0gaW5wdXRzLnlpZWxkU3RyZW5ndGgNCiAgICAgICAgICAgID8gQ09OVi5zdHJlc3NUb0ludGVybmFsKGlucHV0cy55aWVsZFN0cmVuZ3RoLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJykNCiAgICAgICAgICAgIDogbnVsbDsNCg0KICAgICAgICBsZXQgdXRpbGl6YXRpb24gPSBudWxsOw0KICAgICAgICBpZiAoU3kgJiYgc2lnbWEgIT0gbnVsbCkgew0KICAgICAgICAgICAgdXRpbGl6YXRpb24gPSAoc2lnbWEgLyBTeSkgKiAxMDA7DQogICAgICAgICAgICBpZiAoc2lnbWEgPiBTeSkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1N0cmVzcyBleGNlZWRzIHlpZWxkIHN0cmVuZ3RoIC0gSG9va2VcJ3MgbGF3IG1heSBubyBsb25nZXIgYmUgdmFsaWQuJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHV0aWxpemF0aW9uID4gODApIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdTdHJlc3MgYXBwcm9hY2hlcyB5aWVsZCBzdHJlbmd0aCAtIHZlcmlmeSBsaW5lYXIgZWxhc3RpYyBhc3N1bXB0aW9ucy4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHJlZk1pbiA9IENPTlYubW9kdWx1c1RvSW50ZXJuYWwoaW5wdXRzLnJlZkVNaW4gfHwgMCwgJ0dQYScpOw0KICAgICAgICBjb25zdCByZWZNYXggPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKGlucHV0cy5yZWZFTWF4IHx8IDAsICdHUGEnKTsNCiAgICAgICAgY29uc3QgcmVmVHlwID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChpbnB1dHMucmVmRVR5cGljYWwgfHwgMCwgJ0dQYScpOw0KDQogICAgICAgIGxldCBtYXRlcmlhbE1hdGNoID0gJ04vQSc7DQogICAgICAgIGlmIChFICE9IG51bGwgJiYgcmVmTWluID4gMCAmJiByZWZNYXggPiAwKSB7DQogICAgICAgICAgICBpZiAoRSA+PSByZWZNaW4gJiYgRSA8PSByZWZNYXgpIHsNCiAgICAgICAgICAgICAgICBtYXRlcmlhbE1hdGNoID0gbWF0ZXJpYWxTZWxlY3Qub3B0aW9uc1ttYXRlcmlhbFNlbGVjdC5zZWxlY3RlZEluZGV4XS50ZXh0ICsgJyAod2l0aGluIHJlZmVyZW5jZSByYW5nZSknOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoRSAtIHJlZlR5cCkgLyByZWZUeXAgKiAxMDA7DQogICAgICAgICAgICAgICAgbWF0ZXJpYWxNYXRjaCA9IGRpZmYgPCAzMA0KICAgICAgICAgICAgICAgICAgICA\/ICdOZWFyICcgKyBtYXRlcmlhbFNlbGVjdC5vcHRpb25zW21hdGVyaWFsU2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQNCiAgICAgICAgICAgICAgICAgICAgOiAnRGlmZmVycyBmcm9tICcgKyBtYXRlcmlhbFNlbGVjdC5vcHRpb25zW21hdGVyaWFsU2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQgKyAnIHJlZmVyZW5jZSc7DQogICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAzMCkgew0KICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdDYWxjdWxhdGVkIG1vZHVsdXMgZGlmZmVycyBzaWduaWZpY2FudGx5IGZyb20gdHlwaWNhbCBtYXRlcmlhbCB2YWx1ZXMgLSBjaGVjayB1bml0cyBhbmQgZWxhc3RpYyByYW5nZS4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBsZXQgc3RpZmZuZXNzID0gbnVsbDsNCiAgICAgICAgaWYgKGlucHV0cy5jYWxjU3RpZmZuZXNzICYmIEEgJiYgRSAmJiBMMCAmJiBMMCA+IDApIHsNCiAgICAgICAgICAgIHN0aWZmbmVzcyA9IChBICogRSAqIDEwMDApIC8gTDA7DQogICAgICAgIH0NCg0KICAgICAgICBsZXQgZW5lcmd5ID0gbnVsbDsNCiAgICAgICAgaWYgKGlucHV0cy5jYWxjRW5lcmd5ICYmIEYgJiYgTDAgJiYgQSAmJiBFKSB7DQogICAgICAgICAgICBlbmVyZ3kgPSAoRiAqIEYgKiBMMCkgLyAoMiAqIEEgKiBFICogMTAwMCk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBzdGF0dXMgPSBjbGFzc2lmeVN0YXR1cyhzaWdtYSwgU3ksIHV0aWxpemF0aW9uLCBFLCByZWZNaW4sIHJlZk1heCk7DQoNCiAgICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCkgc2hvd1dhcm5pbmdzKHdhcm5pbmdzKTsNCg0KICAgICAgICBjb25zdCByZXN1bHRzID0gew0KICAgICAgICAgICAgRSwgc2lnbWEsIGVwcywgZEwsIEwwLCBGLCBBLCBzdGlmZm5lc3MsIGVuZXJneSwgdXRpbGl6YXRpb24sDQogICAgICAgICAgICBtYXRlcmlhbE1hdGNoLCBzdGF0dXMsIG1vZHVsdXNMYWJlbCwgU3ks\",\n    \"IHJlZk1pbiwgcmVmTWF4LCByZWZUeXAsDQogICAgICAgICAgICBtb2RlOiBpbnB1dHMubW9kZSwgaXNTZWNhbnQNCiAgICAgICAgfTsNCg0KICAgICAgICBkaXNwbGF5UmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgZHJhd1Zpc3VhbGl6YXRpb25zKHJlc3VsdHMpOw0KICAgICAgICBpZiAoc2hvd1BhbmVsKSBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xhc3NpZnlTdGF0dXMoc2lnbWEsIFN5LCB1dGlsaXphdGlvbiwgRSwgcmVmTWluLCByZWZNYXgpIHsNCiAgICAgICAgaWYgKFN5ICYmIHNpZ21hICE9IG51bGwgJiYgc2lnbWEgPiBTeSkgew0KICAgICAgICAgICAgcmV0dXJuIHsgbGV2ZWw6ICdkYW5nZXInLCBsYWJlbDogJ091dHNpZGUgRWxhc3RpYyBSYW5nZScgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodXRpbGl6YXRpb24gIT0gbnVsbCAmJiB1dGlsaXphdGlvbiA+IDgwKSB7DQogICAgICAgICAgICByZXR1cm4geyBsZXZlbDogJ2NhdXRpb24nLCBsYWJlbDogJ0NhdXRpb24nIH07DQogICAgICAgIH0NCiAgICAgICAgaWYgKEUgIT0gbnVsbCAmJiByZWZNaW4gPiAwICYmIHJlZk1heCA+IDAgJiYgKEUgPCByZWZNaW4gKiAwLjcgfHwgRSA+IHJlZk1heCAqIDEuMykpIHsNCiAgICAgICAgICAgIHJldHVybiB7IGxldmVsOiAnY2F1dGlvbicsIGxhYmVsOiAnQ2F1dGlvbicgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoc2lnbWEgIT0gbnVsbCB8fCBFICE9IG51bGwpIHsNCiAgICAgICAgICAgIHJldHVybiB7IGxldmVsOiAnc2FmZScsIGxhYmVsOiAnVmFsaWQgRWxhc3RpYyBSZXN1bHQnIH07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHsgbGV2ZWw6ICduZXV0cmFsJywgbGFiZWw6ICdBd2FpdGluZyBJbnB1dCcgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXROdW0obiwgZGVjaW1hbHMpIHsNCiAgICAgICAgaWYgKGRlY2ltYWxzID09PSB1bmRlZmluZWQpIGRlY2ltYWxzID0gMzsNCiAgICAgICAgaWYgKG4gPT09IG51bGwgfHwgbiA9PT0gdW5kZWZpbmVkIHx8ICFpc0Zpbml0ZShuKSkgcmV0dXJuICdOL0EnOw0KICAgICAgICBpZiAoTWF0aC5hYnMobikgPj0gMTAwMDApIHJldHVybiBuLnRvRXhwb25lbnRpYWwoMyk7DQogICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG4udG9GaXhlZChkZWNpbWFscykpLnRvU3RyaW5nKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheVJlc3VsdHMocikgew0KICAgICAgICBjb25zdCBiYWRnZSA9ICQoJ3N0YXR1c0JhZGdlJyk7DQogICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gci5zdGF0dXMubGFiZWw7DQogICAgICAgIGJhZGdlLmNsYXNzTmFtZSA9ICdlbWVjLXN0YXR1cy1iYWRnZSBlbWVjLXN0YXR1cy0nICsgci5zdGF0dXMubGV2ZWw7DQoNCiAgICAgICAgY29uc3QgZ3JpZCA9ICQoJ3Jlc3VsdHNHcmlkJyk7DQogICAgICAgIGNvbnN0IHN0cmVzc1VuaXQgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJzsNCiAgICAgICAgY29uc3QgbW9kVW5pdCA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnOw0KICAgICAgICBjb25zdCBpdGVtcyA9IFtdOw0KDQogICAgICAgIGlmIChyLkUgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6IHIubW9kdWx1c0xhYmVsLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKHIuRSwgbW9kVW5pdCksIDIpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IG1vZFVuaXQsDQogICAgICAgICAgICAgICAgc3ViOiByLmlzU2VjYW50ID8gJ1NlY2FudCBtb2R1bHVzIC0gdmVyaWZ5IGxpbmVhciByZWdpb24nIDogJycNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIuc2lnbWEgIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICdDYWxjdWxhdGVkIFN0cmVzcyAmIzk2MzsnLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoci5zaWdtYSwgc3RyZXNzVW5pdCksIDIpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IHN0cmVzc1VuaXQNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIuZXBzICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2FsY3VsYXRlZCBTdHJhaW4gJiM5NDk7JywNCiAgICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0TnVtKHIuZXBzLCA2KSwNCiAgICAgICAgICAgICAgICB1bml0OiAnJywNCiAgICAgICAgICAgICAgICBzdWI6ICcoJyArIGZvcm1hdE51bShyLmVwcyAqIDEwMCwgNCkgKyAnICUpJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5kTCAhPSBudWxsKSB7DQogICAgICAgICAgICBjb25zdCBlbFVuaXQgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICgkKCdlbG9uZ2F0aW9uVW5pdCcpLnZhbHVlIHx8ICdtbScpOw0KICAgICAgICAgICAgaXRlbXMucHVzaCh7DQogICAgICAgICAgICAgICAgbGFiZWw6ICdFbGFzdGljIEVsb25nYXRpb24gJiM5MTY7TCcsDQogICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdE51bShDT05WLmVsb25nRnJvbUludGVybmFsKHIuZEwsIGVsVW5pdCksIDQpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IGVsVW5pdA0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5BICE9IG51bGwpIHsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goew0KICAgICAgICAgICAgICAgIGxhYmVsOiAnQ3Jvc3MtU2VjdGlvbmFsIEFyZWEnLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5hcmVhRnJvbUludGVybmFsKHIuQSwgdW5pdFN5c3RlbSksIDMpLA0KICAgICAgICAgICAgICAgIHVuaXQ6IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4yJyA6ICdtbTInDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyLnN0aWZmbmVzcyAhPSBudWxsKSB7DQogICAgICAgICAgICBjb25zdCBrID0gQ09OVi5zdGlmZm5lc3NGcm9tSW50ZXJuYWwoci5zdGlmZm5lc3MsIHVuaXRTeXN0ZW0pOw0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQXhpYWwgU3RpZmZuZXNzIGsnLCB2YWx1ZTogZm9ybWF0TnVtKGsudmFsdWUsIDIpLCB1bml0OiBrLnVuaXQgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoci5lbmVyZ3kgIT0gbnVsbCkgew0KICAgICAgICAgICAgY29uc3QgdSA9IENPTlYuZW5lcmd5RnJvbUludGVybmFsKHIuZW5lcmd5LCB1bml0U3lzdGVtKTsNCiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0VsYXN0aWMgU3RyYWluIEVuZXJneSBVJywgdmFsdWU6IGZvcm1hdE51bSh1LnZhbHVlLCAzKSwgdW5pdDogdS51bml0IH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHIudXRpbGl6YXRpb24gIT0gbnVsbCkgew0KICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRWxhc3RpYyBVdGlsaXphdGlvbicsIHZhbHVlOiBmb3JtYXROdW0oci51dGlsaXphdGlvbiwgMSksIHVuaXQ6ICclJyB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1JlZmVyZW5jZSBNYXRlcmlhbCBNYXRjaCcsIHZhbHVlOiByLm1hdGVyaWFsTWF0Y2gsIHVuaXQ6ICcnLCBzdWI6ICcnIH0pOw0KICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdFbGFzdGljIFJhbmdlIFN0YXR1cycsIHZhbHVlOiByLnN0YXR1cy5sYWJlbCwgdW5pdDogJycsIHN1YjogJycgfSk7DQoNCiAgICAgICAgZ3JpZC5pbm5lckhUTUwgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGANCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtZWMtcmVzdWx0LWl0ZW0iPg0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbWVjLXJlc3VsdC1sYWJlbCI+JHtpdGVtLmxhYmVsfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1lYy1yZXN1bHQtdmFsdWUiPiR7aXRlbS52YWx1ZX0ke2l0ZW0udW5pdCA\/ICcgJyArIGl0ZW0udW5pdCA6ICcnfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAke2l0ZW0uc3ViID8gYDxzcGFuIGNsYXNzPSJlbWVjLXJlc3VsdC1zdWIiPiR7aXRlbS5zdWJ9PC9zcGFuPmAgOiAnJ30NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICBgKS5qb2luKCcnKTsNCg0KICAgICAgICBzaG93UmVjb21tZW5kYXRpb25zKHIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dSZWNvbW1lbmRhdGlvbnMocikgew0KICAgICAgICBjb25zdCByZWMgPSAkKCdyZWNvbW1lbmRhdGlvbnMnKTsNCiAgICAgICAgY29uc3QgdGlwcyA9IFsNCiAgICAgICAgICAgICdVc2Ugc3RyZXNzLXN0cmFpbiBkYXRhIGZyb20gdGhlIHZlcmlmaWVkIGxpbmVhciBlbGFzdGljIHJlZ2lv\",\n    \"bi4nLA0KICAgICAgICAgICAgJ0NoZWNrIHVuaXRzIGNhcmVmdWxseSB3aGVuIGNhbGN1bGF0ZWQgbW9kdWx1cyBkaWZmZXJzIHN0cm9uZ2x5IGZyb20gZXhwZWN0ZWQgdmFsdWVzLicsDQogICAgICAgICAgICAnVXNlIGFjY3VyYXRlIGNyb3NzLXNlY3Rpb25hbCBkaW1lbnNpb25zIGZvciBsb2FkLWJhc2VkIGNhbGN1bGF0aW9ucy4nLA0KICAgICAgICAgICAgJ1VzZSBuZXQgY3Jvc3Mtc2VjdGlvbmFsIGFyZWEgd2hlbiBob2xlcyBvciBzbG90cyByZWR1Y2UgdGhlIGVmZmVjdGl2ZSBzZWN0aW9uLicsDQogICAgICAgICAgICAnVmVyaWZ5IG1hdGVyaWFsLXNwZWNpZmljIFlvdW5nXCdzIG1vZHVsdXMgdXNpbmcgc3VwcGxpZXIgb3IgdGVzdCBkYXRhLicsDQogICAgICAgICAgICAnRG8gbm90IHVzZSB0aGUgbGluZWFyIGVsYXN0aWMgZXF1YXRpb24gYmV5b25kIHlpZWxkIHdpdGhvdXQgYW4gYXBwcm9wcmlhdGUgbm9ubGluZWFyIG1hdGVyaWFsIG1vZGVsLicsDQogICAgICAgICAgICAnUmVwZWF0IG1lYXN1cmVtZW50cyB1c2luZyBtdWx0aXBsZSBzdHJlc3Mtc3RyYWluIHBvaW50cyB0byBpbXByb3ZlIGFjY3VyYWN5LicNCiAgICAgICAgXTsNCg0KICAgICAgICBpZiAoci5zdGF0dXMubGV2ZWwgPT09ICdjYXV0aW9uJyB8fCByLnN0YXR1cy5sZXZlbCA9PT0gJ2RhbmdlcicpIHsNCiAgICAgICAgICAgIHRpcHMudW5zaGlmdCgnUmV2aWV3IGxvYWRpbmcgYW5kIG1hdGVyaWFsIGRhdGEgLSBjdXJyZW50IHJlc3VsdHMgbWF5IGJlIG91dHNpZGUgcmVsaWFibGUgZWxhc3RpYyBhc3N1bXB0aW9ucy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJlYy5pbm5lckhUTUwgPSAnPGgzPkVuZ2luZWVyaW5nIFJlY29tbWVuZGF0aW9uczwvaDM+PHVsPicgKw0KICAgICAgICAgICAgdGlwcy5tYXAoKHQpID0+ICc8bGk+JyArIHQgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgIHJlYy5jbGFzc0xpc3QucmVtb3ZlKCdlbWVjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dFcnJvcnMoZXJyb3JzKSB7DQogICAgICAgICQoJ2Vycm9yQm94JykuaW5uZXJIVE1MID0gJzxzdHJvbmc+UGxlYXNlIGNvcnJlY3QgdGhlIGZvbGxvd2luZzo8L3N0cm9uZz48dWw+JyArDQogICAgICAgICAgICBlcnJvcnMubWFwKChlKSA9PiAnPGxpPicgKyBlICsgJzwvbGk+Jykuam9pbignJykgKyAnPC91bD4nOw0KICAgICAgICAkKCdlcnJvckJveCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2VtZWMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1dhcm5pbmdzKHdhcm5pbmdzKSB7DQogICAgICAgICQoJ3dhcm5pbmdCb3gnKS5pbm5lckhUTUwgPSAnPHN0cm9uZz5XYXJuaW5nczo8L3N0cm9uZz48dWw+JyArDQogICAgICAgICAgICB3YXJuaW5ncy5tYXAoKHcpID0+ICc8bGk+JyArIHcgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgICQoJ3dhcm5pbmdCb3gnKS5jbGFzc0xpc3QucmVtb3ZlKCdlbWVjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVNZXNzYWdlcygpIHsNCiAgICAgICAgJCgnZXJyb3JCb3gnKS5jbGFzc0xpc3QuYWRkKCdlbWVjLWhpZGRlbicpOw0KICAgICAgICAkKCd3YXJuaW5nQm94JykuY2xhc3NMaXN0LmFkZCgnZW1lYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVzdWx0c1BhbmVsKCkgew0KICAgICAgICByZXN1bHRzUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnZW1lYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0c1BhbmVsKCkgew0KICAgICAgICByZXN1bHRzUGFuZWwuY2xhc3NMaXN0LmFkZCgnZW1lYy1oaWRkZW4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3VmlzdWFsaXphdGlvbnMocikgew0KICAgICAgICBkcmF3QXhpYWxEaWFncmFtKHIpOw0KICAgICAgICBkcmF3RWxvbmdhdGlvbkRpYWdyYW0ocik7DQogICAgICAgIGRyYXdTdHJlc3NTdHJhaW5DdXJ2ZShyKTsNCiAgICAgICAgZHJhd1N0aWZmbmVzc0dhdWdlKHIpOw0KICAgICAgICBkcmF3RWxhc3RpY0dhdWdlKHIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdBeGlhbERpYWdyYW0ocikgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdheGlhbERpYWdyYW0nKTsNCiAgICAgICAgY29uc3QgZCA9IHIuQSA\/IE1hdGguc3FydCg0ICogci5BIC8gTWF0aC5QSSkgOiAyMDsNCiAgICAgICAgY29uc3Qgcm9kVyA9IE1hdGgubWluKDE4MCwgTWF0aC5tYXgoNTAsIGQgKiAyKSk7DQogICAgICAgIGNvbnN0IHggPSAoMjgwIC0gcm9kVykgLyAyOw0KICAgICAgICBjb25zdCBlbG9uZyA9IHIuZEwgJiYgci5MMCA\/IE1hdGgubWluKDIwLCAoci5kTCAvIHIuTDApICogMjAwKSA6IDA7DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxkZWZzPg0KICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9ImVtZWMtYXJyUiIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iNyIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj4NCiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMOCwzIEwwLDYiIGZpbGw9IiNlNjdlMjIiLz4NCiAgICAgICAgICAgICAgICA8L21hcmtlcj4NCiAgICAgICAgICAgICAgICA8bWFya2VyIGlkPSJlbWVjLWFyckwiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjgiIHJlZlg9IjEiIHJlZlk9IjMiIG9yaWVudD0iYXV0byI+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04LDAgTDAsMyBMOCw2IiBmaWxsPSIjZTY3ZTIyIi8+DQogICAgICAgICAgICAgICAgPC9tYXJrZXI+DQogICAgICAgICAgICA8L2RlZnM+DQogICAgICAgICAgICA8cmVjdCB4PSIke3h9IiB5PSI1MCIgd2lkdGg9IiR7cm9kV30iIGhlaWdodD0iMjgiIHJ4PSIzIiBmaWxsPSIjYmRjM2M3IiBzdHJva2U9IiM3ZjhjOGQiIHN0cm9rZS13aWR0aD0iMS41Ii8+DQogICAgICAgICAgICAke2Vsb25nID4gMCA\/IGA8cmVjdCB4PSIke3ggKyByb2RXfSIgeT0iNTAiIHdpZHRoPSIke2Vsb25nfSIgaGVpZ2h0PSIyOCIgcng9IjIiIGZpbGw9IiMzNDk4ZGIiIG9wYWNpdHk9IjAuNSIvPmAgOiAnJ30NCiAgICAgICAgICAgIDxsaW5lIHgxPSIxNSIgeTE9IjY0IiB4Mj0iJHt4IC0gNX0iIHkyPSI2NCIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIuNSIgbWFya2VyLWVuZD0idXJsKCNlbWVjLWFyclIpIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iMjY1IiB5MT0iNjQiIHgyPSIke3ggKyByb2RXICsgZWxvbmcgKyA1fSIgeTI9IjY0IiBzdHJva2U9IiNlNjdlMjIiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItc3RhcnQ9InVybCgjZW1lYy1hcnJMKSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iMjIiIHk9IjU2IiBmb250LXNpemU9IjEwIiBmaWxsPSIjZTY3ZTIyIiBmb250LXdlaWdodD0iYm9sZCI+RjwvdGV4dD4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjE0MCIgeT0iMTAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjkiIGZpbGw9IiM1ZDZkN2UiPkF4aWFsIFRlbnNpbGUgTG9hZGluZzwvdGV4dD4NCiAgICAgICAgICAgIDx0ZXh0IHg9IjE0MCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiM5NWE1YTYiPlN0cmVzcyA9IEYgLyBBPC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdFbG9uZ2F0aW9uRGlhZ3JhbShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ2Vsb25nYXRpb25EaWFncmFtJyk7DQogICAgICAgIGNvbnN0IEwwID0gci5MMCB8fCAxMDA7DQogICAgICAgIGNvbnN0IGRMID0gci5kTCB8fCAwOw0KICAgICAgICBjb25zdCBiYXNlVyA9IDE2MDsNCiAgICAgICAgY29uc3Qgc2NhbGUgPSBkTCA+IDAgPyBNYXRoLm1pbig0MCwgKGRMIC8gTDApICogYmFzZVcgKiA1KSA6IDA7DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDx0ZXh0IHg9IjMwIiB5PSIzNSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj5MMCAob3JpZ2luYWwpPC90ZXh0Pg0KICAgICAgICAgICAgPHJlY3QgeD0iMzAiIHk9IjQyIiB3aWR0aD0iJHtiYXNlV30iIGhlaWdodD0iMTgiIHJ4PSIyIiBmaWxsPSIjYmRjM2M3IiBzdHJva2U9IiM3ZjhjOGQiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7MzAgKyBiYXNlVyAvIDJ9IiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmaWxsPSIjMmMzZTUwIj4ke2Zvcm1hdE51bShDT05WLmxlbmd0aEZyb21JbnRlcm5hbChMMCwgdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nKSwgMSl9PC90ZXh0Pg0KDQogICAgICAgICAgICA8dGV4dCB4PSIzMCIgeT0iODUiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iIzVkNmQ3ZSI+TDAgKyBkTCAoZWxvbmdhdGVkKTwvdGV4dD4NCiAgICAgICAgICAgIDxyZWN0IHg9IjMwIiB5PSI5MiIgd2lkdGg9IiR7YmFzZVcgKyBzY2Fs\",\n    \"ZX0iIGhlaWdodD0iMTgiIHJ4PSIyIiBmaWxsPSIjMzQ5OGRiIiBvcGFjaXR5PSIwLjciIHN0cm9rZT0iIzI0NzFhMyIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHszMCArIChiYXNlVyArIHNjYWxlKSAvIDJ9IiB5PSIxMDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOCIgZmlsbD0iI2ZmZmZmZiI+ZEwgPSAke2Zvcm1hdE51bShDT05WLmVsb25nRnJvbUludGVybmFsKGRMLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpLCA0KX08L3RleHQ+DQoNCiAgICAgICAgICAgICR7c2NhbGUgPiAyID8gYDxsaW5lIHgxPSIkezMwICsgYmFzZVd9IiB5MT0iNzUiIHgyPSIkezMwICsgYmFzZVcgKyBzY2FsZX0iIHkyPSI3NSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjEuNSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7MzAgKyBiYXNlV30iIHkxPSI3MiIgeDI9IiR7MzAgKyBiYXNlV30iIHkyPSI3OCIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjEuNSIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7MzAgKyBiYXNlVyArIHNjYWxlfSIgeTE9IjcyIiB4Mj0iJHszMCArIGJhc2VXICsgc2NhbGV9IiB5Mj0iNzgiIHN0cm9rZT0iI2U2N2UyMiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz5gIDogJyd9DQogICAgICAgICAgICA8dGV4dCB4PSIxNDAiIHk9IjEyNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmaWxsPSIjOTVhNWE2Ij5TdHJhaW4gPSBkTCAvIEwwPC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdTdHJlc3NTdHJhaW5DdXJ2ZShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ3N0cmVzc1N0cmFpbkN1cnZlJyk7DQogICAgICAgIGNvbnN0IEVfR1BhID0gci5FIHx8IDIwMDsNCiAgICAgICAgY29uc3QgRSA9IEVfR1BhICogMTAwMDsNCiAgICAgICAgY29uc3QgU3kgPSByLlN5IHx8IDM1NTsNCiAgICAgICAgY29uc3QgeWllbGRTdHJhaW4gPSBTeSAvIEU7DQogICAgICAgIGNvbnN0IGN1cnJlbnRTdHJhaW4gPSByLmVwcyB8fCAwLjAwMTsNCiAgICAgICAgY29uc3QgY3VycmVudFN0cmVzcyA9IHIuc2lnbWEgfHwgRSAqIGN1cnJlbnRTdHJhaW47DQoNCiAgICAgICAgY29uc3QgbWFyZ2luID0geyBsOiA0NSwgcjogMjAsIHQ6IDIwLCBiOiAzNSB9Ow0KICAgICAgICBjb25zdCB3ID0gNTYwIC0gbWFyZ2luLmwgLSBtYXJnaW4ucjsNCiAgICAgICAgY29uc3QgaCA9IDE4MCAtIG1hcmdpbi50IC0gbWFyZ2luLmI7DQogICAgICAgIGNvbnN0IG1heFN0cmVzcyA9IE1hdGgubWF4KFN5ICogMS40LCBjdXJyZW50U3RyZXNzICogMS4yLCAxKTsNCiAgICAgICAgY29uc3QgbWF4U3RyYWluID0gTWF0aC5tYXgoeWllbGRTdHJhaW4gKiAzLCBjdXJyZW50U3RyYWluICogMiwgMC4wMDIpOw0KDQogICAgICAgIGNvbnN0IHRvWCA9IChlKSA9PiBtYXJnaW4ubCArIChlIC8gbWF4U3RyYWluKSAqIHc7DQogICAgICAgIGNvbnN0IHRvWSA9IChzKSA9PiBtYXJnaW4udCArIGggLSAocyAvIG1heFN0cmVzcykgKiBoOw0KDQogICAgICAgIGNvbnN0IGVsYXN0aWNFbmRYID0gdG9YKHlpZWxkU3RyYWluKTsNCiAgICAgICAgY29uc3QgZWxhc3RpY0VuZFkgPSB0b1koU3kpOw0KICAgICAgICBjb25zdCBjdXJYID0gdG9YKE1hdGgubWluKGN1cnJlbnRTdHJhaW4sIG1heFN0cmFpbikpOw0KICAgICAgICBjb25zdCBjdXJZID0gdG9ZKE1hdGgubWluKGN1cnJlbnRTdHJlc3MsIG1heFN0cmVzcykpOw0KICAgICAgICBjb25zdCBvcmlnaW5ZID0gbWFyZ2luLnQgKyBoOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8bGluZSB4MT0iJHttYXJnaW4ubH0iIHkxPSIke29yaWdpbll9IiB4Mj0iJHttYXJnaW4ubCArIHd9IiB5Mj0iJHtvcmlnaW5ZfSIgc3Ryb2tlPSIjN2Y4YzhkIiBzdHJva2Utd2lkdGg9IjEiLz4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke21hcmdpbi5sfSIgeTE9IiR7bWFyZ2luLnR9IiB4Mj0iJHttYXJnaW4ubH0iIHkyPSIke29yaWdpbll9IiBzdHJva2U9IiM3ZjhjOGQiIHN0cm9rZS13aWR0aD0iMSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHttYXJnaW4ubCArIHcgLyAyfSIgeT0iJHsxODAgLSA4fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj5TdHJhaW48L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIxNCIgeT0iJHttYXJnaW4udCArIGggLyAyfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIiB0cmFuc2Zvcm09InJvdGF0ZSgtOTAgMTQgJHttYXJnaW4udCArIGggLyAyfSkiPlN0cmVzczwvdGV4dD4NCg0KICAgICAgICAgICAgPHJlY3QgeD0iJHttYXJnaW4ubH0iIHk9IiR7dG9ZKFN5KX0iIHdpZHRoPSIke2VsYXN0aWNFbmRYIC0gbWFyZ2luLmx9IiBoZWlnaHQ9IiR7b3JpZ2luWSAtIHRvWShTeSl9IiBmaWxsPSIjMjdhZTYwIiBvcGFjaXR5PSIwLjEiLz4NCiAgICAgICAgICAgIDxwYXRoIGQ9Ik0ke21hcmdpbi5sfSwke29yaWdpbll9IEwke2VsYXN0aWNFbmRYfSwke2VsYXN0aWNFbmRZfSIgc3Ryb2tlPSIjMjdhZTYwIiBzdHJva2Utd2lkdGg9IjIuNSIgZmlsbD0ibm9uZSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHttYXJnaW4ubCArIDEwfSIgeT0iJHt0b1koU3kgLyAyKX0iIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzI3YWU2MCI+TGluZWFyIEVsYXN0aWM8L3RleHQ+DQoNCiAgICAgICAgICAgIDxwYXRoIGQ9Ik0ke2VsYXN0aWNFbmRYfSwke2VsYXN0aWNFbmRZfSBMJHtlbGFzdGljRW5kWCArIDUwfSwke3RvWShTeSAqIDEuMDUpfSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMyIvPg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7ZWxhc3RpY0VuZFh9IiB5MT0iJHttYXJnaW4udH0iIHgyPSIke2VsYXN0aWNFbmRYfSIgeTI9IiR7b3JpZ2luWX0iIHN0cm9rZT0iI2MwMzkyYiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSI0LDMiIG9wYWNpdHk9IjAuNiIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtlbGFzdGljRW5kWCArIDR9IiB5PSIke21hcmdpbi50ICsgMTJ9IiBmb250LXNpemU9IjgiIGZpbGw9IiNjMDM5MmIiPllpZWxkPC90ZXh0Pg0KDQogICAgICAgICAgICA8bGluZSB4MT0iJHttYXJnaW4ubH0iIHkxPSIke29yaWdpbll9IiB4Mj0iJHtjdXJYfSIgeTI9IiR7Y3VyWX0iIHN0cm9rZT0iIzFhNTI3NiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQsMiIgb3BhY2l0eT0iMC41Ii8+DQogICAgICAgICAgICA8Y2lyY2xlIGN4PSIke2N1clh9IiBjeT0iJHtjdXJZfSIgcj0iNSIgZmlsbD0iJHtyLnN0YXR1cy5sZXZlbCA9PT0gJ2RhbmdlcicgPyAnI2MwMzkyYicgOiAnIzFhNTI3Nid9Ii8+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N1clggKyA4fSIgeT0iJHtjdXJZIC0gNn0iIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzFhNTI3NiI+KHN0cmFpbiwgc3RyZXNzKTwvdGV4dD4NCg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7bWFyZ2luLmx9IiB5MT0iJHtvcmlnaW5ZfSIgeDI9IiR7TWF0aC5taW4oY3VyWCwgZWxhc3RpY0VuZFgpfSIgeTI9IiR7dG9ZKE1hdGgubWluKGN1cnJlbnRTdHJlc3MsIFN5KSl9IiBzdHJva2U9IiMyNDcxYTMiIHN0cm9rZS13aWR0aD0iMSIgb3BhY2l0eT0iMC40Ii8+DQogICAgICAgICAgICA8dGV4dCB4PSIke21hcmdpbi5sICsgMjB9IiB5PSIke29yaWdpblkgLSAxNX0iIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzI0NzFhMyIgZm9udC1zdHlsZT0iaXRhbGljIj5FID0gU3RyZXNzIC8gU3RyYWluPC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdTdGlmZm5lc3NHYXVnZShyKSB7DQogICAgICAgIGNvbnN0IHN2ZyA9ICQoJ3N0aWZmbmVzc0dhdWdlJyk7DQogICAgICAgIGNvbnN0IEUgPSByLkUgfHwgMjAwOw0KICAgICAgICBjb25zdCByZWZUeXAgPSByLnJlZlR5cCB8fCAyMDA7DQogICAgICAgIGNvbnN0IHBjdCA9IE1hdGgubWluKDE1MCwgKEUgLyByZWZUeXApICogMTAwKTsNCiAgICAgICAgY29uc3QgY3ggPSAxMDAsIGN5ID0gODUsIHJhZGl1cyA9IDU1Ow0KICAgICAgICBjb25zdCBzdGFydEFuZ2xlID0gTWF0aC5QSTsNCiAgICAgICAgY29uc3QgdXRpbEFuZ2xlID0gc3RhcnRBbmdsZSAtIChwY3QgLyAxNTApICogTWF0aC5QSTsNCg0KICAgICAgICBjb25zdCBhcmMgPSAoc3RhcnQsIGVuZCwgY29sb3IsIHdpZHRoKSA9PiB7DQogICAgICAgICAgICBjb25zdCB4MSA9IGN4ICsgcmFkaXVzICogTWF0aC5jb3Moc3RhcnQpOw0KICAgICAgICAgICAgY29uc3QgeTEgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKHN0YXJ0KTsNCiAgICAgICAgICAgIGNvbnN0IHgyID0gY3ggKyByYWRpdXMgKiBNYXRoLmNvcyhlbmQpOw0KICAgICAgICAgICAgY29uc3QgeTIgPSBjeSArIHJhZGl1\",\n    \"cyAqIE1hdGguc2luKGVuZCk7DQogICAgICAgICAgICBjb25zdCBsYXJnZSA9IHN0YXJ0IC0gZW5kID4gTWF0aC5QSSA\/IDEgOiAwOw0KICAgICAgICAgICAgcmV0dXJuIGA8cGF0aCBkPSJNJHt4MX0sJHt5MX0gQSR7cmFkaXVzfSwke3JhZGl1c30gMCAke2xhcmdlfSAxICR7eDJ9LCR7eTJ9IiBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3J9IiBzdHJva2Utd2lkdGg9IiR7d2lkdGh9IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IG5lZWRsZVggPSBjeCArIChyYWRpdXMgLSAxMCkgKiBNYXRoLmNvcyh1dGlsQW5nbGUpOw0KICAgICAgICBjb25zdCBuZWVkbGVZID0gY3kgKyAocmFkaXVzIC0gMTApICogTWF0aC5zaW4odXRpbEFuZ2xlKTsNCiAgICAgICAgY29uc3QgY29sb3IgPSBwY3QgPiAxMzAgfHwgcGN0IDwgNzAgPyAnI2YzOWMxMicgOiAnIzI3YWU2MCc7DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgICR7YXJjKHN0YXJ0QW5nbGUsIHN0YXJ0QW5nbGUgLSAwLjUgKiBNYXRoLlBJLCAnIzM0OThkYicsIDEwKX0NCiAgICAgICAgICAgICR7YXJjKHN0YXJ0QW5nbGUgLSAwLjUgKiBNYXRoLlBJLCBzdGFydEFuZ2xlIC0gTWF0aC5QSSwgJyMxYTUyNzYnLCAxMCl9DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeH0iIHkxPSIke2N5fSIgeDI9IiR7bmVlZGxlWH0iIHkyPSIke25lZWRsZVl9IiBzdHJva2U9IiR7Y29sb3J9IiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+DQogICAgICAgICAgICA8Y2lyY2xlIGN4PSIke2N4fSIgY3k9IiR7Y3l9IiByPSI0IiBmaWxsPSIjMmMzZTUwIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4fSIgeT0iJHtjeSArIDIyfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZpbGw9IiR7Y29sb3J9Ij4ke2Zvcm1hdE51bShFLCAxKX0gR1BhPC90ZXh0Pg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeH0iIHk9IiR7Y3kgKyAzNn0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOCIgZmlsbD0iIzk1YTVhNiI+dnMgcmVmICR7Zm9ybWF0TnVtKHJlZlR5cCwgMCl9IEdQYTwvdGV4dD4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3RWxhc3RpY0dhdWdlKHIpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgnZWxhc3RpY0dhdWdlJyk7DQogICAgICAgIGNvbnN0IHV0aWwgPSBNYXRoLm1pbihyLnV0aWxpemF0aW9uIHx8IDAsIDEyMCk7DQogICAgICAgIGNvbnN0IGN4ID0gMTAwLCBjeSA9IDg1LCByYWRpdXMgPSA1NTsNCiAgICAgICAgY29uc3Qgc3RhcnRBbmdsZSA9IE1hdGguUEk7DQogICAgICAgIGNvbnN0IHV0aWxBbmdsZSA9IHN0YXJ0QW5nbGUgLSAodXRpbCAvIDEwMCkgKiBNYXRoLlBJOw0KDQogICAgICAgIGNvbnN0IGFyYyA9IChzdGFydCwgZW5kLCBjb2xvciwgd2lkdGgpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHgxID0gY3ggKyByYWRpdXMgKiBNYXRoLmNvcyhzdGFydCk7DQogICAgICAgICAgICBjb25zdCB5MSA9IGN5ICsgcmFkaXVzICogTWF0aC5zaW4oc3RhcnQpOw0KICAgICAgICAgICAgY29uc3QgeDIgPSBjeCArIHJhZGl1cyAqIE1hdGguY29zKGVuZCk7DQogICAgICAgICAgICBjb25zdCB5MiA9IGN5ICsgcmFkaXVzICogTWF0aC5zaW4oZW5kKTsNCiAgICAgICAgICAgIGNvbnN0IGxhcmdlID0gc3RhcnQgLSBlbmQgPiBNYXRoLlBJID8gMSA6IDA7DQogICAgICAgICAgICByZXR1cm4gYDxwYXRoIGQ9Ik0ke3gxfSwke3kxfSBBJHtyYWRpdXN9LCR7cmFkaXVzfSAwICR7bGFyZ2V9IDEgJHt4Mn0sJHt5Mn0iIGZpbGw9Im5vbmUiIHN0cm9rZT0iJHtjb2xvcn0iIHN0cm9rZS13aWR0aD0iJHt3aWR0aH0iIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPmA7DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3QgbmVlZGxlWCA9IGN4ICsgKHJhZGl1cyAtIDEwKSAqIE1hdGguY29zKHV0aWxBbmdsZSk7DQogICAgICAgIGNvbnN0IG5lZWRsZVkgPSBjeSArIChyYWRpdXMgLSAxMCkgKiBNYXRoLnNpbih1dGlsQW5nbGUpOw0KICAgICAgICBjb25zdCBnYXVnZUNvbG9yID0gdXRpbCA+IDEwMCA\/ICcjYzAzOTJiJyA6IHV0aWwgPiA4MCA\/ICcjZjM5YzEyJyA6ICcjMjdhZTYwJzsNCiAgICAgICAgY29uc3QgbGFiZWwgPSByLnV0aWxpemF0aW9uICE9IG51bGwgPyBmb3JtYXROdW0odXRpbCwgMSkgKyAnJScgOiAnTi9BJzsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgJHthcmMoc3RhcnRBbmdsZSwgc3RhcnRBbmdsZSAtIDAuNyAqIE1hdGguUEksICcjMjdhZTYwJywgMTApfQ0KICAgICAgICAgICAgJHthcmMoc3RhcnRBbmdsZSAtIDAuNyAqIE1hdGguUEksIHN0YXJ0QW5nbGUgLSAwLjkgKiBNYXRoLlBJLCAnI2YzOWMxMicsIDEwKX0NCiAgICAgICAgICAgICR7YXJjKHN0YXJ0QW5nbGUgLSAwLjkgKiBNYXRoLlBJLCAwLCAnI2MwMzkyYicsIDEwKX0NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2N4fSIgeTE9IiR7Y3l9IiB4Mj0iJHtuZWVkbGVYfSIgeTI9IiR7bmVlZGxlWX0iIHN0cm9rZT0iJHtnYXVnZUNvbG9yfSIgc3Ryb2tlLXdpZHRoPSIyLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPg0KICAgICAgICAgICAgPGNpcmNsZSBjeD0iJHtjeH0iIGN5PSIke2N5fSIgcj0iNCIgZmlsbD0iIzJjM2U1MCIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeH0iIHk9IiR7Y3kgKyAyMn0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTQiIGZvbnQtd2VpZ2h0PSJib2xkIiBmaWxsPSIke2dhdWdlQ29sb3J9Ij4ke2xhYmVsfTwvdGV4dD4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3h9IiB5PSIke2N5ICsgMzZ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiM5NWE1YTYiPlN0cmVzcyAvIFN5IFV0aWxpemF0aW9uPC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGluaXQoKTsNCiAgICB9DQp9KSgpOw0K\"];\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 s=document.createElement('script');\n    s.text=new TextDecoder('utf-8').decode(bytes);\n    r.appendChild(s);\n  }catch(e){\n    console.error('Elastic Modulus E Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Elastic Modulus E Calculator is a practical engineering tool designed to calculate Young\u2019s modulus from stress and strain or from load, cross-sectional area, original&#8230;<\/p>","protected":false},"author":2,"featured_media":24777,"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":[8653,8652,8654,8651],"class_list":["post-24776","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-elastic-modulus","tag-material-stiffness","tag-stress-strain","tag-youngs-modulus","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Elastic-Modulus-E-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24776","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=24776"}],"version-history":[{"count":2,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24776\/revisions"}],"predecessor-version":[{"id":24779,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24776\/revisions\/24779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24777"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24776"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}