{"id":24813,"date":"2026-09-02T08:57:07","date_gmt":"2026-09-02T08:57:07","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24813"},"modified":"2026-09-02T08:57:10","modified_gmt":"2026-09-02T08:57:10","slug":"material-elongation-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ar\/material-elongation-calculator\/","title":{"rendered":"Material Elongation Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Material Elongation Calculator<\/strong> is a practical engineering tool designed to calculate material elongation, percentage elongation, engineering strain, and elastic deformation under axial loading. By entering original length, final length, applied load, cross-sectional area, and Young\u2019s modulus, users can quickly evaluate material deformation and dimensional changes. The Material Elongation Calculator is useful for tensile testing, mechanical design, material analysis, quality control, and preliminary deformation assessment across a wide range of engineering applications.<\/p>\n\n\n\n<!-- WordPress Custom HTML Block: copy ALL content below -->\n<!-- Do NOT wrap in DOCTYPE\/html\/head\/body. Use Code Editor mode. -->\n<!-- All CSS\/JS scoped to #mec-calculator only. Will NOT affect theme header, footer, menus, sidebar, or other page content. -->\n<style>\n\/* Material Elongation Calculator - WordPress-safe scoped styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #mec-calculator.\n * Will NOT affect theme header, footer, sidebar, menus, or other page content.\n * No html, body, :root, or unscoped universal selectors.\n *\/\n\n.entry-content #mec-calculator.mec-calculator,\n.wp-block-html #mec-calculator.mec-calculator,\n.elementor-widget-container #mec-calculator.mec-calculator,\n#mec-calculator.mec-calculator,\n.entry-content #mec-calculator.mec-calculator *,\n.wp-block-html #mec-calculator.mec-calculator *,\n.elementor-widget-container #mec-calculator.mec-calculator *,\n#mec-calculator.mec-calculator *,\n.entry-content #mec-calculator.mec-calculator *::before,\n.wp-block-html #mec-calculator.mec-calculator *::before,\n.elementor-widget-container #mec-calculator.mec-calculator *::before,\n#mec-calculator.mec-calculator *::before,\n.entry-content #mec-calculator.mec-calculator *::after,\n.wp-block-html #mec-calculator.mec-calculator *::after,\n.elementor-widget-container #mec-calculator.mec-calculator *::after,\n#mec-calculator.mec-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n.entry-content #mec-calculator.mec-calculator,\n.wp-block-html #mec-calculator.mec-calculator,\n.elementor-widget-container #mec-calculator.mec-calculator,\n#mec-calculator.mec-calculator {\n    all: revert;\n    --mec-primary: #1a5276;\n    --mec-primary-light: #2471a3;\n    --mec-primary-dark: #0e3352;\n    --mec-accent: #e67e22;\n    --mec-safe: #27ae60;\n    --mec-caution: #f39c12;\n    --mec-danger: #c0392b;\n    --mec-neutral: #7f8c8d;\n    --mec-bg: #ecf0f1;\n    --mec-card-bg: #ffffff;\n    --mec-border: #d5dbdb;\n    --mec-text: #2c3e50;\n    --mec-text-muted: #5d6d7e;\n    --mec-shadow: 0 2px 12px rgba(26, 82, 118, 0.08);\n    --mec-radius: 8px;\n    --mec-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --mec-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(--mec-font) !important;\n    color: var(--mec-text) !important;\n    line-height: 1.6 !important;\n    font-size: 16px !important;\n    text-align: left !important;\n    background: transparent !important;\n    border: none !important;\n    float: none !important;\n    clear: both !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    z-index: auto;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    box-shadow: none !important;\n}\n\n#mec-calculator.mec-calculator form,\n#mec-calculator.mec-calculator fieldset,\n#mec-calculator.mec-calculator table {\n    all: revert !important;\n    box-sizing: border-box !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    float: none !important;\n    width: auto !important;\n    max-width: none !important;\n    font-family: inherit !important;\n    color: inherit !important;\n}\n\n#mec-calculator.mec-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n    float: none !important;\n    overflow: visible !important;\n}\n\n#mec-calculator.mec-calculator [hidden] {\n    display: none !important;\n}\n\n#mec-calculator.mec-calculator h1,\n#mec-calculator.mec-calculator h2,\n#mec-calculator.mec-calculator h3,\n#mec-calculator.mec-calculator h4,\n#mec-calculator.mec-calculator p,\n#mec-calculator.mec-calculator ul,\n#mec-calculator.mec-calculator ol,\n#mec-calculator.mec-calculator li,\n#mec-calculator.mec-calculator section,\n#mec-calculator.mec-calculator div,\n#mec-calculator.mec-calculator span,\n#mec-calculator.mec-calculator strong,\n#mec-calculator.mec-calculator em,\n#mec-calculator.mec-calculator sub,\n#mec-calculator.mec-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#mec-calculator.mec-calculator button,\n#mec-calculator.mec-calculator input,\n#mec-calculator.mec-calculator select,\n#mec-calculator.mec-calculator label,\n#mec-calculator.mec-calculator legend,\n#mec-calculator.mec-calculator summary {\n    font: inherit !important;\n    font-family: var(--mec-font) !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n}\n\n#mec-calculator.mec-calculator ul,\n#mec-calculator.mec-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#mec-calculator.mec-calculator button {\n    cursor: pointer !important;\n    background: transparent !important;\n    border: none !important;\n    padding: 0 !important;\n    box-shadow: none !important;\n    text-decoration: none !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n    text-transform: none !important;\n    min-height: unset !important;\n    height: auto !important;\n    width: auto !important;\n}\n\n#mec-calculator.mec-calculator input[type=\"number\"],\n#mec-calculator.mec-calculator input[type=\"checkbox\"],\n#mec-calculator.mec-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(--mec-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--mec-font) !important;\n    background: #ffffff !important;\n    color: var(--mec-text) !important;\n    min-height: 38px !important;\n    outline: none !important;\n    box-shadow: none !important;\n    margin: 0 !important;\n}\n\n#mec-calculator.mec-calculator input[type=\"number\"]:focus,\n#mec-calculator.mec-calculator select:focus {\n    border-color: var(--mec-primary-light) !important;\n    box-shadow: 0 0 0 2px rgba(36, 113, 163, 0.15) !important;\n}\n\n#mec-calculator.mec-calculator .mec-seo-intro {\n    margin-bottom: 1.5rem !important;\n    padding: 1.25rem !important;\n    background: var(--mec-bg) !important;\n    border-radius: var(--mec-radius) !important;\n    border-left: 4px solid var(--mec-primary) !important;\n}\n\n#mec-calculator.mec-calculator .mec-seo-intro h1 {\n    font-size: 1.5rem !important;\n    font-weight: 700 !important;\n    color: var(--mec-primary-dark) !important;\n    margin-bottom: 0.75rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-seo-intro p {\n    font-size: 0.95rem !important;\n    color: var(--mec-text-muted) !important;\n    line-height: 1.7 !important;\n}\n\n#mec-calculator.mec-calculator .mec-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.25rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-card {\n    background: var(--mec-card-bg) !important;\n    border: 1px solid var(--mec-border) !important;\n    border-radius: var(--mec-radius) !important;\n    padding: 1.25rem !important;\n    box-shadow: var(--mec-shadow) !important;\n}\n\n#mec-calculator.mec-calculator .mec-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: 1rem !important;\n    padding-bottom: 0.75rem !important;\n    border-bottom: 2px solid var(--mec-bg) !important;\n}\n\n#mec-calculator.mec-calculator .mec-panel-header h2 {\n    font-size: 1.25rem !important;\n    font-weight: 700 !important;\n    color: var(--mec-primary) !important;\n}\n\n#mec-calculator.mec-calculator .mec-unit-toggle {\n    display: flex !important;\n    border: 1px solid var(--mec-border) !important;\n    border-radius: 6px !important;\n    overflow: hidden !important;\n}\n\n#mec-calculator.mec-calculator .mec-unit-btn {\n    padding: 0.4rem 0.85rem !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    background: #fff !important;\n    color: var(--mec-text-muted) !important;\n    border-right: 1px solid var(--mec-border) !important;\n    transition: background 0.15s, color 0.15s !important;\n}\n\n#mec-calculator.mec-calculator .mec-unit-btn:last-child {\n    border-right: none !important;\n}\n\n#mec-calculator.mec-calculator .mec-unit-btn.mec-active {\n    background: var(--mec-primary) !important;\n    color: #fff !important;\n}\n\n#mec-calculator.mec-calculator fieldset.mec-input-section {\n    border: 1px solid var(--mec-border) !important;\n    border-radius: var(--mec-radius) !important;\n    padding: 1rem !important;\n    margin: 0 0 1rem 0 !important;\n    background: #fafbfc !important;\n}\n\n#mec-calculator.mec-calculator legend {\n    font-weight: 600 !important;\n    font-size: 0.9rem !important;\n    color: var(--mec-primary) !important;\n    padding: 0 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-form-row {\n    display: grid !important;\n    grid-template-columns: 1fr !important;\n    gap: 0.75rem !important;\n    margin-bottom: 0.75rem !important;\n}\n\n@media (min-width: 540px) {\n    #mec-calculator.mec-calculator .mec-form-row {\n        grid-template-columns: 1fr 1fr !important;\n    }\n}\n\n#mec-calculator.mec-calculator .mec-form-group label {\n    display: block !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    color: var(--mec-text) !important;\n    margin-bottom: 0.35rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-optional {\n    font-weight: 400 !important;\n    color: var(--mec-text-muted) !important;\n    font-size: 0.8rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-input-with-unit {\n    display: flex !important;\n    gap: 0 !important;\n}\n\n#mec-calculator.mec-calculator .mec-input-with-unit input {\n    flex: 1 !important;\n    border-radius: 6px 0 0 6px !important;\n    border-right: none !important;\n}\n\n#mec-calculator.mec-calculator .mec-inline-unit,\n#mec-calculator.mec-calculator .mec-unit-label {\n    min-width: 58px !important;\n    width: auto !important;\n    flex-shrink: 0 !important;\n    padding: 0.55rem 0.5rem !important;\n    font-size: 0.82rem !important;\n    border: 1px solid var(--mec-border) !important;\n    border-radius: 0 6px 6px 0 !important;\n    background: var(--mec-bg) !important;\n    color: var(--mec-text-muted) !important;\n    text-align: center !important;\n}\n\n#mec-calculator.mec-calculator .mec-unit-label {\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n}\n\n#mec-calculator.mec-calculator .mec-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    margin-left: 4px !important;\n    border-radius: 50% !important;\n    background: var(--mec-primary-light) !important;\n    color: #fff !important;\n    font-size: 10px !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    vertical-align: middle !important;\n}\n\n#mec-calculator.mec-calculator .mec-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    min-width: 180px !important;\n    max-width: 260px !important;\n    padding: 0.5rem 0.65rem !important;\n    background: var(--mec-primary-dark) !important;\n    color: #fff !important;\n    font-size: 0.75rem !important;\n    font-weight: 400 !important;\n    line-height: 1.4 !important;\n    border-radius: 4px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n    transition: opacity 0.15s !important;\n    z-index: 100 !important;\n    white-space: normal !important;\n    text-align: left !important;\n}\n\n#mec-calculator.mec-calculator .mec-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#mec-calculator.mec-calculator .mec-checkbox-label {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.5rem !important;\n    font-size: 0.88rem !important;\n    cursor: pointer !important;\n}\n\n#mec-calculator.mec-calculator .mec-checkbox-label input {\n    width: auto !important;\n    min-height: unset !important;\n}\n\n#mec-calculator.mec-calculator .mec-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: 0.5rem !important;\n    width: 100% !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn {\n    padding: 0.65rem 1.25rem !important;\n    font-size: 0.95rem !important;\n    font-weight: 600 !important;\n    border-radius: 6px !important;\n    transition: background 0.15s, transform 0.1s !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn-primary {\n    background: var(--mec-primary) !important;\n    color: #fff !important;\n    width: auto !important;\n    min-width: 120px !important;\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn-primary:hover {\n    background: var(--mec-primary-light) !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn-secondary {\n    background: var(--mec-bg) !important;\n    color: var(--mec-text) !important;\n    border: 1px solid var(--mec-border) !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn-secondary:hover {\n    background: #dfe6e9 !important;\n}\n\n#mec-calculator.mec-calculator .mec-hidden {\n    display: none !important;\n}\n\n#mec-calculator.mec-calculator .mec-status-badge {\n    display: inline-block !important;\n    padding: 0.3rem 0.75rem !important;\n    border-radius: 20px !important;\n    font-size: 0.8rem !important;\n    font-weight: 600 !important;\n}\n\n#mec-calculator.mec-calculator .mec-status-neutral {\n    background: var(--mec-bg) !important;\n    color: var(--mec-neutral) !important;\n}\n\n#mec-calculator.mec-calculator .mec-status-safe {\n    background: rgba(39, 174, 96, 0.15) !important;\n    color: var(--mec-safe) !important;\n}\n\n#mec-calculator.mec-calculator .mec-status-caution {\n    background: rgba(243, 156, 18, 0.15) !important;\n    color: var(--mec-caution) !important;\n}\n\n#mec-calculator.mec-calculator .mec-status-danger {\n    background: rgba(192, 57, 43, 0.15) !important;\n    color: var(--mec-danger) !important;\n}\n\n#mec-calculator.mec-calculator .mec-error-box,\n#mec-calculator.mec-calculator .mec-warning-box {\n    padding: 0.85rem 1rem !important;\n    border-radius: 6px !important;\n    margin-bottom: 1rem !important;\n    font-size: 0.88rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-error-box {\n    background: rgba(192, 57, 43, 0.08) !important;\n    border: 1px solid rgba(192, 57, 43, 0.3) !important;\n    color: var(--mec-danger) !important;\n}\n\n#mec-calculator.mec-calculator .mec-warning-box {\n    background: rgba(243, 156, 18, 0.08) !important;\n    border: 1px solid rgba(243, 156, 18, 0.3) !important;\n    color: #9a6700 !important;\n}\n\n#mec-calculator.mec-calculator .mec-error-box ul,\n#mec-calculator.mec-calculator .mec-warning-box ul {\n    margin-top: 0.4rem !important;\n    padding-left: 1.2rem !important;\n    list-style: disc !important;\n}\n\n#mec-calculator.mec-calculator .mec-results-grid {\n    display: grid !important;\n    grid-template-columns: 1fr !important;\n    gap: 0.5rem !important;\n    margin-bottom: 1rem !important;\n}\n\n@media (min-width: 480px) {\n    #mec-calculator.mec-calculator .mec-results-grid {\n        grid-template-columns: 1fr 1fr !important;\n    }\n}\n\n#mec-calculator.mec-calculator .mec-result-item {\n    display: flex !important;\n    flex-direction: column !important;\n    padding: 0.65rem 0.85rem !important;\n    background: var(--mec-bg) !important;\n    border-radius: 6px !important;\n    border-left: 3px solid var(--mec-border) !important;\n}\n\n#mec-calculator.mec-calculator .mec-result-highlight {\n    border-left-color: var(--mec-primary) !important;\n    background: rgba(36, 113, 163, 0.06) !important;\n}\n\n#mec-calculator.mec-calculator .mec-result-label {\n    font-size: 0.78rem !important;\n    color: var(--mec-text-muted) !important;\n    margin-bottom: 0.15rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-result-value {\n    font-size: 1rem !important;\n    font-weight: 700 !important;\n    font-family: var(--mec-mono) !important;\n    color: var(--mec-primary-dark) !important;\n}\n\n#mec-calculator.mec-calculator .mec-recommendations {\n    padding: 0.85rem 1rem !important;\n    background: rgba(36, 113, 163, 0.06) !important;\n    border-radius: 6px !important;\n    margin-bottom: 1rem !important;\n    border-left: 3px solid var(--mec-primary-light) !important;\n}\n\n#mec-calculator.mec-calculator .mec-recommendations h3 {\n    font-size: 0.9rem !important;\n    font-weight: 700 !important;\n    color: var(--mec-primary) !important;\n    margin-bottom: 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-recommendations ul {\n    padding-left: 1.2rem !important;\n    list-style: disc !important;\n}\n\n#mec-calculator.mec-calculator .mec-recommendations li {\n    font-size: 0.85rem !important;\n    color: var(--mec-text-muted) !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-visual-grid {\n    display: grid !important;\n    grid-template-columns: 1fr !important;\n    gap: 0.75rem !important;\n}\n\n@media (min-width: 600px) {\n    #mec-calculator.mec-calculator .mec-visual-grid {\n        grid-template-columns: 1fr 1fr !important;\n    }\n}\n\n#mec-calculator.mec-calculator .mec-viz-card {\n    background: #fafbfc !important;\n    border: 1px solid var(--mec-border) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-viz-card h3 {\n    font-size: 0.82rem !important;\n    font-weight: 600 !important;\n    color: var(--mec-primary) !important;\n    margin-bottom: 0.5rem !important;\n    text-align: center !important;\n}\n\n#mec-calculator.mec-calculator .mec-viz-wide {\n    grid-column: 1 \/ -1 !important;\n}\n\n#mec-calculator.mec-calculator .mec-viz-card svg {\n    display: block !important;\n    width: 100% !important;\n    height: auto !important;\n}\n\n#mec-calculator.mec-calculator .mec-comparison-table-wrap {\n    overflow-x: auto !important;\n    margin-bottom: 1rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-comparison-table {\n    width: 100% !important;\n    border-collapse: collapse !important;\n    font-size: 0.82rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-comparison-table th,\n#mec-calculator.mec-calculator .mec-comparison-table td {\n    padding: 0.5rem 0.65rem !important;\n    border: 1px solid var(--mec-border) !important;\n    text-align: left !important;\n    background: #fff !important;\n}\n\n#mec-calculator.mec-calculator .mec-comparison-table th {\n    background: var(--mec-primary) !important;\n    color: #fff !important;\n    font-weight: 600 !important;\n}\n\n#mec-calculator.mec-calculator .mec-comparison-table tr.mec-ref-row td {\n    background: rgba(36, 113, 163, 0.08) !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-chart {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-row {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-label {\n    min-width: 90px !important;\n    font-size: 0.78rem !important;\n    font-weight: 600 !important;\n    color: var(--mec-text) !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-track {\n    flex: 1 !important;\n    height: 22px !important;\n    background: var(--mec-bg) !important;\n    border-radius: 4px !important;\n    overflow: hidden !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-fill {\n    height: 100% !important;\n    background: linear-gradient(90deg, var(--mec-primary-light), var(--mec-primary)) !important;\n    border-radius: 4px !important;\n    transition: width 0.3s !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-fill.mec-ref {\n    background: linear-gradient(90deg, var(--mec-accent), #d35400) !important;\n}\n\n#mec-calculator.mec-calculator .mec-bar-value {\n    min-width: 70px !important;\n    font-size: 0.78rem !important;\n    font-family: var(--mec-mono) !important;\n    text-align: right !important;\n}\n\n#mec-calculator.mec-calculator .mec-segment-block {\n    border: 1px dashed var(--mec-border) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    margin-bottom: 0.75rem !important;\n    background: #fff !important;\n}\n\n#mec-calculator.mec-calculator .mec-segment-header {\n    display: flex !important;\n    justify-content: space-between !important;\n    align-items: center !important;\n    margin-bottom: 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-segment-header span {\n    font-weight: 600 !important;\n    font-size: 0.85rem !important;\n    color: var(--mec-primary) !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn-remove {\n    padding: 0.25rem 0.5rem !important;\n    font-size: 0.75rem !important;\n    color: var(--mec-danger) !important;\n    border: 1px solid rgba(192, 57, 43, 0.3) !important;\n    border-radius: 4px !important;\n    background: rgba(192, 57, 43, 0.05) !important;\n}\n\n#mec-calculator.mec-calculator .mec-btn-add {\n    padding: 0.45rem 0.85rem !important;\n    font-size: 0.85rem !important;\n    color: var(--mec-primary) !important;\n    border: 1px dashed var(--mec-primary-light) !important;\n    border-radius: 6px !important;\n    background: rgba(36, 113, 163, 0.05) !important;\n    width: 100% !important;\n    margin-bottom: 0.75rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-material-row {\n    border: 1px solid var(--mec-border) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    margin-bottom: 0.75rem !important;\n    background: #fff !important;\n}\n\n#mec-calculator.mec-calculator .mec-material-row-header {\n    display: flex !important;\n    justify-content: space-between !important;\n    align-items: center !important;\n    margin-bottom: 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-section {\n    margin-top: 1.25rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-section details {\n    border: 1px solid var(--mec-border) !important;\n    border-radius: var(--mec-radius) !important;\n    margin-bottom: 0.5rem !important;\n    background: var(--mec-card-bg) !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-section summary {\n    padding: 0.75rem 1rem !important;\n    font-weight: 600 !important;\n    color: var(--mec-primary) !important;\n    cursor: pointer !important;\n    list-style: none !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-section summary::-webkit-details-marker {\n    display: none !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-body {\n    padding: 0 1rem 1rem !important;\n    font-size: 0.88rem !important;\n    color: var(--mec-text-muted) !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-body p {\n    margin-bottom: 0.5rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-formula-body code {\n    display: block !important;\n    padding: 0.5rem 0.75rem !important;\n    background: var(--mec-bg) !important;\n    border-radius: 4px !important;\n    font-family: var(--mec-mono) !important;\n    font-size: 0.85rem !important;\n    margin: 0.35rem 0 !important;\n    color: var(--mec-primary-dark) !important;\n}\n\n#mec-calculator.mec-calculator .mec-disclaimer {\n    margin-top: 1.25rem !important;\n    padding: 1rem !important;\n    background: rgba(127, 140, 141, 0.08) !important;\n    border-radius: var(--mec-radius) !important;\n    font-size: 0.82rem !important;\n    color: var(--mec-text-muted) !important;\n    border: 1px solid var(--mec-border) !important;\n}\n\n#mec-calculator.mec-calculator .mec-disclaimer strong {\n    display: block !important;\n    color: var(--mec-text) !important;\n    margin-bottom: 0.35rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-deform-note {\n    padding: 0.65rem 0.85rem !important;\n    background: rgba(230, 126, 34, 0.08) !important;\n    border-left: 3px solid var(--mec-accent) !important;\n    border-radius: 0 6px 6px 0 !important;\n    font-size: 0.85rem !important;\n    color: var(--mec-text-muted) !important;\n    margin-bottom: 0.75rem !important;\n}\n\n#mec-calculator.mec-calculator .mec-span-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n<\/style>\n<div id=\"mec-calculator\" class=\"mec-calculator\">\n        <div class=\"mec-layout\">\n\n            <section class=\"mec-input-panel mec-card\" aria-label=\"Calculator inputs\">\n                <div class=\"mec-panel-header\">\n                    <h2>Material Elongation Calculator<\/h2>\n                    <div class=\"mec-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                        <button type=\"button\" class=\"mec-unit-btn mec-active\" data-unit=\"metric\">Metric<\/button>\n                        <button type=\"button\" class=\"mec-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n                    <\/div>\n                <\/div>\n\n                <form id=\"mec-calcForm\" novalidate>\n                    <fieldset class=\"mec-input-section\">\n                        <legend>Calculation Mode<\/legend>\n                        <div class=\"mec-form-row\">\n                            <div class=\"mec-form-group mec-span-full\">\n                                <label for=\"mec-calcMode\">Mode<\/label>\n                                <select id=\"mec-calcMode\" name=\"calcMode\">\n                                    <option value=\"elastic\" selected>Elastic Elongation<\/option>\n                                    <option value=\"measured\">Measured Elongation<\/option>\n                                    <option value=\"percentage\">Percentage Elongation<\/option>\n                                    <option value=\"engineeringStrain\">Engineering Strain<\/option>\n                                    <option value=\"finalLength\">Final Length Calculation<\/option>\n                                    <option value=\"requiredE\">Required Young&#8217;s Modulus<\/option>\n                                    <option value=\"requiredArea\">Required Cross-Sectional Area<\/option>\n                                    <option value=\"allowableLoad\">Allowable Load<\/option>\n                                    <option value=\"requiredLength\">Required Original Length<\/option>\n                                    <option value=\"tensileTest\">Tensile Test (Elongation at Break)<\/option>\n                                    <option value=\"comparison\">Material Comparison<\/option>\n                                    <option value=\"multiSegment\">Multi-Segment Axial Member<\/option>\n                                    <option value=\"thermal\">Thermal Elongation<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                        <div class=\"mec-form-row mec-mode-field\" data-mode=\"measured percentage engineeringStrain finalLength tensileTest\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-inputMethod\">Input Method<\/label>\n                                <select id=\"mec-inputMethod\" name=\"inputMethod\">\n                                    <option value=\"originalFinal\" selected>Original &amp; Final Length<\/option>\n                                    <option value=\"originalDelta\">Original Length &amp; Elongation<\/option>\n                                    <option value=\"strainKnown\">Known Strain<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mec-input-section mec-geometry-section\">\n                        <legend>Geometry &amp; Length<\/legend>\n\n                        <div class=\"mec-form-row mec-length-field\" data-mode=\"measured percentage engineeringStrain finalLength tensileTest elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment thermal\" data-method=\"originalFinal\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-originalLength\">\n                                    Original Length (L<sub>0<\/sub>)\n                                    <span class=\"mec-tooltip\" data-tip=\"Original gauge length before deformation\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-originalLength\" name=\"originalLength\" value=\"1000\" min=\"0.001\" step=\"any\">\n                                    <select id=\"mec-lengthUnit\" class=\"mec-inline-unit\" aria-label=\"Length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mec-form-group mec-final-field\" data-mode=\"measured percentage engineeringStrain tensileTest\" data-method=\"originalFinal\">\n                                <label for=\"mec-finalLength\">\n                                    Final Length (L<sub>f<\/sub>)\n                                    <span class=\"mec-tooltip\" data-tip=\"Length after deformation or fracture\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-finalLength\" name=\"finalLength\" value=\"1000.095\" min=\"0\" step=\"any\">\n                                    <select id=\"mec-finalLengthUnit\" class=\"mec-inline-unit\" aria-label=\"Final length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-delta-field\" data-mode=\"measured percentage engineeringStrain requiredE requiredArea allowableLoad requiredLength\" data-method=\"originalDelta\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-originalLength2\">Original Length (L<sub>0<\/sub>)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-originalLength2\" name=\"originalLength2\" value=\"1000\" min=\"0.001\" step=\"any\">\n                                    <select id=\"mec-lengthUnit2\" class=\"mec-inline-unit\" aria-label=\"Length unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"m\">m<\/option>\n                                        <option value=\"in\">in<\/option>\n                                        <option value=\"ft\">ft<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-elongation\">\n                                    Elongation (&Delta;L)\n                                    <span class=\"mec-tooltip\" data-tip=\"Absolute change in length \u2014 positive for tension\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-elongation\" name=\"elongation\" value=\"0.095\" step=\"any\">\n                                    <select id=\"mec-elongationUnit\" class=\"mec-inline-unit\" aria-label=\"Elongation unit\">\n                                        <option value=\"mm\" selected>mm<\/option>\n                                        <option value=\"um\">\u03bcm<\/option>\n                                        <option value=\"cm\">cm<\/option>\n                                        <option value=\"in\">in<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-strain-field\" data-mode=\"finalLength\" data-method=\"strainKnown\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-inputStrain\">\n                                    Engineering Strain (&epsilon;)\n                                    <span class=\"mec-tooltip\" data-tip=\"\u03b5 = \u0394L \/ L\u2080 \u2014 dimensionless engineering strain\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-inputStrain\" name=\"inputStrain\" value=\"0.000095\" step=\"any\">\n                                    <select id=\"mec-strainUnit\" class=\"mec-inline-unit\" aria-label=\"Strain unit\">\n                                        <option value=\"dimensionless\" selected>\u2014<\/option>\n                                        <option value=\"percent\">%<\/option>\n                                        <option value=\"micro\">\u03bc\u03b5<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-strainLength\">Original Length (L<sub>0<\/sub>)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-strainLength\" name=\"strainLength\" value=\"1000\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"length\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-section-field\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\">\n                            <div class=\"mec-form-group mec-span-full\">\n                                <label for=\"mec-sectionType\">Cross-Section Type<\/label>\n                                <select id=\"mec-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=\"square\">Square<\/option>\n                                    <option value=\"custom\">Custom Area<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-geom-solid mec-section-field\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\" data-section=\"solidRound\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-diameter\">Diameter (d)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-diameter\" name=\"diameter\" value=\"20\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-geom-hollow mec-section-field mec-hidden\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\" data-section=\"hollowRound\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-outerDiameter\">Outer Diameter (D)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-outerDiameter\" name=\"outerDiameter\" value=\"30\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-innerDiameter\">Inner Diameter (d)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-innerDiameter\" name=\"innerDiameter\" value=\"20\" min=\"0\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-geom-rect mec-section-field mec-hidden\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\" data-section=\"rectangle\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-width\">Width (b)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-width\" name=\"width\" value=\"20\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-thickness\">Thickness (t)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-thickness\" name=\"thickness\" value=\"10\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-geom-square mec-section-field mec-hidden\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\" data-section=\"square\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-side\">Side (a)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-side\" name=\"side\" value=\"20\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mec-unit-label\" data-unit-key=\"lengthSmall\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-geom-custom mec-section-field mec-hidden\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\" data-section=\"custom\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-customArea\">Cross-Sectional Area (A)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-customArea\" name=\"customArea\" value=\"314.16\" min=\"0.001\" step=\"any\">\n                                    <select id=\"mec-areaUnit\" class=\"mec-inline-unit\" aria-label=\"Area unit\">\n                                        <option value=\"mm2\" selected>mm\u00b2<\/option>\n                                        <option value=\"cm2\">cm\u00b2<\/option>\n                                        <option value=\"in2\">in\u00b2<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mec-input-section mec-loading-section\">\n                        <legend>Loading<\/legend>\n                        <div class=\"mec-form-row mec-load-field\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-appliedLoad\">\n                                    Applied Axial Load (F)\n                                    <span class=\"mec-tooltip\" data-tip=\"Tensile axial force applied to the member\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-appliedLoad\" name=\"appliedLoad\" value=\"20\" min=\"0\" step=\"any\">\n                                    <select id=\"mec-forceUnit\" class=\"mec-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                                        <option value=\"kip\">kip<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"mec-form-row mec-allow-field\" data-mode=\"elastic requiredArea allowableLoad measured percentage engineeringStrain\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-allowElongation\">\n                                    Allowable Elongation (&Delta;L<sub>allow<\/sub>)\n                                    <span class=\"mec-optional\">(optional)<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-allowElongation\" name=\"allowElongation\" value=\"\" step=\"any\" placeholder=\"\u2014\">\n                                    <select id=\"mec-allowElongUnit\" class=\"mec-inline-unit\" aria-label=\"Allowable 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                            <div class=\"mec-form-group\">\n                                <label for=\"mec-allowStrain\">\n                                    Allowable Strain (&epsilon;<sub>allow<\/sub>)\n                                    <span class=\"mec-optional\">(optional)<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-allowStrain\" name=\"allowStrain\" value=\"\" step=\"any\" placeholder=\"\u2014\">\n                                    <select id=\"mec-allowStrainUnit\" class=\"mec-inline-unit\" aria-label=\"Allowable strain unit\">\n                                        <option value=\"dimensionless\">\u2014<\/option>\n                                        <option value=\"percent\" selected>%<\/option>\n                                        <option value=\"micro\">\u03bc\u03b5<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mec-input-section mec-material-section\">\n                        <legend>Material Properties<\/legend>\n                        <div class=\"mec-form-row mec-material-field\" data-mode=\"elastic requiredE requiredArea allowableLoad requiredLength comparison multiSegment thermal\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-material\">Material Preset<\/label>\n                                <select id=\"mec-material\" name=\"material\">\n                                    <option value=\"structuralSteel\" selected>Structural Steel<\/option>\n                                    <option value=\"carbonSteel\">Carbon Steel<\/option>\n                                    <option value=\"stainlessSteel\">Stainless Steel<\/option>\n                                    <option value=\"aluminum\">Aluminum Alloy<\/option>\n                                    <option value=\"titanium\">Titanium Alloy<\/option>\n                                    <option value=\"copper\">Copper<\/option>\n                                    <option value=\"brass\">Brass<\/option>\n                                    <option value=\"castIron\">Cast Iron<\/option>\n                                    <option value=\"magnesium\">Magnesium Alloy<\/option>\n                                    <option value=\"engineeringPlastic\">Engineering Plastic<\/option>\n                                    <option value=\"custom\">Custom Material<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"mec-form-group mec-modulus-field\" data-mode=\"elastic requiredArea allowableLoad requiredLength comparison multiSegment\">\n                                <label for=\"mec-youngModulus\">\n                                    Young&#8217;s Modulus (E)\n                                    <span class=\"mec-tooltip\" data-tip=\"Elastic modulus \u2014 editable preset value\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-youngModulus\" name=\"youngModulus\" value=\"200\" min=\"0.001\" step=\"any\">\n                                    <select id=\"mec-youngUnit\" class=\"mec-inline-unit\" aria-label=\"Young's modulus unit\">\n                                        <option value=\"GPa\" selected>GPa<\/option>\n                                        <option value=\"MPa\">MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"mec-form-row mec-yield-field\" data-mode=\"elastic comparison multiSegment\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-yieldStrength\">\n                                    Yield Strength (S<sub>y<\/sub>)\n                                    <span class=\"mec-optional\">(optional \u2014 elastic range check)<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-yieldStrength\" name=\"yieldStrength\" value=\"355\" step=\"any\">\n                                    <select id=\"mec-yieldUnit\" class=\"mec-inline-unit\" aria-label=\"Yield strength unit\">\n                                        <option value=\"MPa\" selected>MPa<\/option>\n                                        <option value=\"psi\">psi<\/option>\n                                        <option value=\"ksi\">ksi<\/option>\n                                    <\/select>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mec-input-section mec-thermal-section mec-hidden\" data-mode=\"thermal\">\n                        <legend>Temperature<\/legend>\n                        <div class=\"mec-form-row\">\n                            <div class=\"mec-form-group\">\n                                <label class=\"mec-checkbox-label\">\n                                    <input type=\"checkbox\" id=\"mec-includeMechanical\" name=\"includeMechanical\">\n                                    Include mechanical elongation (\u0394L = FL\/AE + \u03b1L\u0394T)\n                                <\/label>\n                            <\/div>\n                        <\/div>\n                        <div class=\"mec-form-row\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-thermalAlpha\">\n                                    Coefficient of Thermal Expansion (&alpha;)\n                                    <span class=\"mec-tooltip\" data-tip=\"Linear CTE \u2014 editable preset value (\u00d710\u207b\u2076 \/\u00b0C)\">?<\/span>\n                                <\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-thermalAlpha\" name=\"thermalAlpha\" value=\"12\" min=\"0\" step=\"any\">\n                                    <span class=\"mec-unit-label\">\u00d710\u207b\u2076\/\u00b0C<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-tempChange\">Temperature Change (&Delta;T)<\/label>\n                                <div class=\"mec-input-with-unit\">\n                                    <input type=\"number\" id=\"mec-tempChange\" name=\"tempChange\" value=\"50\" step=\"any\">\n                                    <span class=\"mec-unit-label\">\u00b0C<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"mec-deform-note\">\n                            Thermal elongation assumes free unconstrained expansion. Restrained thermal expansion requires thermal stress analysis.\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mec-input-section mec-comparison-section mec-hidden\" data-mode=\"comparison\">\n                        <legend>Material Comparison (2\u20136 Materials)<\/legend>\n                        <div class=\"mec-form-row\">\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-numMaterials\">Number of Materials<\/label>\n                                <select id=\"mec-numMaterials\" name=\"numMaterials\">\n                                    <option value=\"2\" selected>2<\/option>\n                                    <option value=\"3\">3<\/option>\n                                    <option value=\"4\">4<\/option>\n                                    <option value=\"5\">5<\/option>\n                                    <option value=\"6\">6<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"mec-form-group\">\n                                <label for=\"mec-refMaterial\">Reference Material<\/label>\n                                <select id=\"mec-refMaterial\" name=\"refMaterial\">\n                                    <option value=\"0\" selected>Material 1<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                        <div id=\"mec-comparisonMaterials\"><\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mec-input-section mec-segment-section mec-hidden\" data-mode=\"multiSegment\">\n                        <legend>Multi-Segment Member<\/legend>\n                        <div id=\"mec-segments\"><\/div>\n                        <button type=\"button\" class=\"mec-btn-add\" id=\"mec-addSegment\">+ Add Segment<\/button>\n                        <div class=\"mec-deform-note\">\n                            Total elongation: &Delta;L<sub>total<\/sub> = &Sigma; F<sub>i<\/sub>L<sub>i<\/sub> \/ (A<sub>i<\/sub>E<sub>i<\/sub>). Internal force may differ in each segment.\n                        <\/div>\n                    <\/fieldset>\n\n                    <div class=\"mec-form-actions\">\n                        <button type=\"submit\" class=\"mec-btn mec-btn-primary\" id=\"mec-calculateBtn\">Calculate<\/button>\n                    <\/div>\n                <\/form>\n            <\/section>\n\n            <section class=\"mec-results-panel mec-card mec-hidden\" id=\"mec-resultsPanel\" aria-label=\"Calculation results\">\n                <div class=\"mec-panel-header\">\n                    <h2>Results<\/h2>\n                    <div id=\"mec-statusBadge\" class=\"mec-status-badge mec-status-neutral\">Awaiting Input<\/div>\n                <\/div>\n\n                <div id=\"mec-errorBox\" class=\"mec-error-box mec-hidden\" role=\"alert\"><\/div>\n                <div id=\"mec-warningBox\" class=\"mec-warning-box mec-hidden\" role=\"status\"><\/div>\n\n                <div class=\"mec-deform-note mec-hidden\" id=\"mec-deformTypeNote\"><\/div>\n\n                <div class=\"mec-results-grid\" id=\"mec-resultsGrid\"><\/div>\n\n                <div id=\"mec-comparisonResults\" class=\"mec-hidden\"><\/div>\n\n                <div id=\"mec-recommendations\" class=\"mec-recommendations mec-hidden\"><\/div>\n\n                <div class=\"mec-visual-grid\">\n                    <div class=\"mec-viz-card\">\n                        <h3>Tensile Specimen \u2014 Before &amp; After<\/h3>\n                        <svg id=\"mec-specimenDiagram\" viewBox=\"0 0 300 120\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"mec-viz-card\">\n                        <h3>Axial Load &amp; Elongation<\/h3>\n                        <svg id=\"mec-loadDiagram\" viewBox=\"0 0 300 120\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"mec-viz-card mec-viz-wide\">\n                        <h3>Stress-Strain Diagram (Elastic &amp; Plastic Regions)<\/h3>\n                        <svg id=\"mec-stressStrainDiagram\" viewBox=\"0 0 560 180\" aria-hidden=\"true\"><\/svg>\n                    <\/div>\n                    <div class=\"mec-viz-card mec-viz-wide mec-hidden\" id=\"mec-comparisonViz\">\n                        <h3>Material Comparison \u2014 Relative Elongation<\/h3>\n                        <div id=\"mec-comparisonBars\" class=\"mec-bar-chart\"><\/div>\n                    <\/div>\n                <\/div>\n            <\/section>\n        <\/div>\n    <\/div>\n<script>\n(function(){\n  var r=document.getElementById('mec-calculator');\n  if(!r||r.dataset.mecLoaderDone==='1'){return;}\n  r.dataset.mecLoaderDone='1';\n  try{\n    var p=[\"LyoqDQogKiBNYXRlcmlhbCBFbG9uZ2F0aW9uIENhbGN1bGF0b3INCiAqIFNjb3BlZCBmb3IgV29yZFByZXNzIGVtYmVkIOKAlCBkb2VzIG5vdCBhZmZlY3QgZWxlbWVudHMgb3V0c2lkZSAjbWVjLWNhbGN1bGF0b3INCiAqLw0KDQooZnVuY3Rpb24gKCkgew0KICAgICd1c2Ugc3RyaWN0JzsNCg0KICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVjLWNhbGN1bGF0b3InKTsNCiAgICBpZiAoIXJvb3QgfHwgcm9vdC5kYXRhc2V0Lm1lY1JlYWR5ID09PSAnMScpIHJldHVybjsNCiAgICByb290LmRhdGFzZXQubWVjUmVhZHkgPSAnMSc7DQoNCiAgICBjb25zdCBTVkdfSUQgPSAnbWVjLWNhbGN1bGF0b3Itc3ZnLSc7DQoNCiAgICBmdW5jdGlvbiAkKGlkKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoJyNtZWMtJyArIGlkKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiAkYWxsKHNlbCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbCk7DQogICAgfQ0KDQogICAgY29uc3QgTUFURVJJQUxTID0gew0KICAgICAgICBzdHJ1Y3R1cmFsU3RlZWw6ICAgIHsgRTogMjAwLCBhbHBoYTogMTIuMCwgU3k6IDM1NSwgbmFtZTogJ1N0cnVjdHVyYWwgU3RlZWwnIH0sDQogICAgICAgIGNhcmJvblN0ZWVsOiAgICAgICAgeyBFOiAyMDAsIGFscGhhOiAxMS43LCBTeTogMzUwLCBuYW1lOiAnQ2FyYm9uIFN0ZWVsJyB9LA0KICAgICAgICBzdGFpbmxlc3NTdGVlbDogICAgIHsgRTogMTk1LCBhbHBoYTogMTcuMywgU3k6IDMxMCwgbmFtZTogJ1N0YWlubGVzcyBTdGVlbCcgfSwNCiAgICAgICAgYWx1bWludW06ICAgICAgICAgICB7IEU6IDcwLCAgYWxwaGE6IDIzLjAsIFN5OiAyNzUsIG5hbWU6ICdBbHVtaW51bSBBbGxveScgfSwNCiAgICAgICAgdGl0YW5pdW06ICAgICAgICAgICB7IEU6IDExMCwgYWxwaGE6IDguNiwgIFN5OiA4ODAsIG5hbWU6ICdUaXRhbml1bSBBbGxveScgfSwNCiAgICAgICAgY29wcGVyOiAgICAgICAgICAgICB7IEU6IDEyMCwgYWxwaGE6IDE2LjUsIFN5OiA3MCwgIG5hbWU6ICdDb3BwZXInIH0sDQogICAgICAgIGJyYXNzOiAgICAgICAgICAgICAgeyBFOiAxMDAsIGFscGhhOiAxOC43LCBTeTogMjAwLCBuYW1lOiAnQnJhc3MnIH0sDQogICAgICAgIGNhc3RJcm9uOiAgICAgICAgICAgeyBFOiAxMDAsIGFscGhhOiAxMC44LCBTeTogMjUwLCBuYW1lOiAnQ2FzdCBJcm9uJyB9LA0KICAgICAgICBtYWduZXNpdW06ICAgICAgICAgIHsgRTogNDUsICBhbHBoYTogMjYuMCwgU3k6IDIyMCwgbmFtZTogJ01hZ25lc2l1bSBBbGxveScgfSwNCiAgICAgICAgZW5naW5lZXJpbmdQbGFzdGljOiB7IEU6IDMsICAgYWxwaGE6IDgwLjAsIFN5OiA1MCwgIG5hbWU6ICdFbmdpbmVlcmluZyBQbGFzdGljJyB9LA0KICAgICAgICBjdXN0b206ICAgICAgICAgICAgIHsgRTogbnVsbCwgYWxwaGE6IG51bGwsIFN5OiBudWxsLCBuYW1lOiAnQ3VzdG9tIE1hdGVyaWFsJyB9DQogICAgfTsNCg0KICAgIGNvbnN0IENPTlYgPSB7DQogICAgICAgIGxlbmd0aFRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2ICogMjUuNDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnY20nKSByZXR1cm4gdiAqIDEwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtJykgcmV0dXJuIHYgKiAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdmdCcpIHJldHVybiB2ICogMzA0Ljg7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3VtJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIGxlbmd0aEZyb21JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2luJykgcmV0dXJuIHYgLyAyNS40Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdjbScpIHJldHVybiB2IC8gMTA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ20nKSByZXR1cm4gdiAvIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2Z0JykgcmV0dXJuIHYgLyAzMDQuODsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAndW0nKSByZXR1cm4gdiAqIDEwMDA7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgYXJlYVRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdjbTInKSByZXR1cm4gdiAqIDEwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnaW4yJykgcmV0dXJuIHYgKiA2NDUuMTY7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgYXJlYUZyb21JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2NtMicpIHJldHVybiB2IC8gMTAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbjInKSByZXR1cm4gdiAvIDY0NS4xNjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBmb3JjZVRvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrTicpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbGJmJykgcmV0dXJuIHYgKiA0LjQ0ODIyOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdraXAnKSByZXR1cm4gdiAqIDQ0NDguMjI7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgZm9yY2VGcm9tSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrTicpIHJldHVybiB2IC8gMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbGJmJykgcmV0dXJuIHYgLyA0LjQ0ODIyOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdraXAnKSByZXR1cm4gdiAvIDQ0NDguMjI7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgbW9kdWx1c1RvSW50ZXJuYWwodiwgdW5pdCkgew0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdNUGEnKSByZXR1cm4gdiAvIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3BzaScpIHJldHVybiB2ICogMC4wMDY4OTQ3NiAvIDEwMDA7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiB2ICogNi44OTQ3NiAvIDEwMDA7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgbW9kdWx1c0Zyb21JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuICh2ICogMTAwMCkgLyAwLjAwNjg5NDc2Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gKHYgKiAxMDAwKSAvIDYuODk0NzY7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyZXNzVG9JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ0dQYScpIHJldHVybiB2ICogMTAwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuIHYgKiAwLjAwNjg5NDc2Ow0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gdiAqIDYuODk0NzY7DQogICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfSwNCiAgICAgICAgc3RyZXNzRnJvbUludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnR1BhJykgcmV0dXJuIHYgLyAxMDAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAvIDAuMDA2ODk0NzY7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiB2IC8gNi44OTQ3NjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9LA0KICAgICAgICBzdHJhaW5Ub0ludGVybmFsKHYsIHVuaXQpIHsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAncGVyY2VudCcpIHJldHVybiB2IC8gMTAwOw0KICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdtaWNybycpIHJldHVybiB2IC8gMWU2Ow0KICAgICAgICAgICAgcmV0dXJuIHY7DQogICAgICAgIH0sDQogICAgICAgIHN0cmFpbkZyb21JbnRlcm5hbCh2LCB1bml0KSB7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ3BlcmNlbnQnKSByZXR1cm4gdiAqIDEwMDsNCiAgICAgICAgICAgIGlmICh1bml0ID09PSAnbWljcm8nKSByZXR1cm4gdiAqIDFlNjsNCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9DQogICAgfTsNCg0KICAgIGNvbnN0IE1PREVfSU5QVVRfTUVUSE9EUyA9IHsNCiAgICAgICAgbWVhc3VyZWQ6IFtbJ29yaWdpbmFsRmluYWwnLCAnT3JpZ2luYWwgJiBGaW5hbCBMZW5ndGgnXSwgWydvcmlnaW5hbERlbHRhJywgJ09yaWdpbmFsIExlbmd0aCAmIEVsb25nYXRpb24nXV0sDQogICAgICAgIHBlcmNlbnRhZ2U6IFtbJ29yaWdpbmFsRmluYWwnLCAnT3JpZ2luYWwgJiBGaW5hbCBMZW5ndGgnXSwg\",\n    \"WydvcmlnaW5hbERlbHRhJywgJ09yaWdpbmFsIExlbmd0aCAmIEVsb25nYXRpb24nXV0sDQogICAgICAgIGVuZ2luZWVyaW5nU3RyYWluOiBbWydvcmlnaW5hbEZpbmFsJywgJ09yaWdpbmFsICYgRmluYWwgTGVuZ3RoJ10sIFsnb3JpZ2luYWxEZWx0YScsICdPcmlnaW5hbCBMZW5ndGggJiBFbG9uZ2F0aW9uJ11dLA0KICAgICAgICBmaW5hbExlbmd0aDogW1snb3JpZ2luYWxGaW5hbCcsICdPcmlnaW5hbCAmIEZpbmFsIExlbmd0aCddLCBbJ3N0cmFpbktub3duJywgJ0tub3duIFN0cmFpbiddXSwNCiAgICAgICAgdGVuc2lsZVRlc3Q6IFtbJ29yaWdpbmFsRmluYWwnLCAnR2F1Z2UgTGVuZ3RoIEJlZm9yZSAmIEFmdGVyIEZyYWN0dXJlJ11dDQogICAgfTsNCg0KICAgIGxldCB1bml0U3lzdGVtID0gJ21ldHJpYyc7DQogICAgbGV0IHNlZ21lbnRDb3VudCA9IDI7DQogICAgbGV0IGNvbXBhcmlzb25Db3VudCA9IDI7DQoNCiAgICBjb25zdCBmb3JtID0gJCgnY2FsY0Zvcm0nKTsNCiAgICBjb25zdCBjYWxjTW9kZSA9ICQoJ2NhbGNNb2RlJyk7DQogICAgY29uc3QgaW5wdXRNZXRob2QgPSAkKCdpbnB1dE1ldGhvZCcpOw0KICAgIGNvbnN0IHNlY3Rpb25UeXBlID0gJCgnc2VjdGlvblR5cGUnKTsNCiAgICBjb25zdCBtYXRlcmlhbFNlbGVjdCA9ICQoJ21hdGVyaWFsJyk7DQogICAgY29uc3QgcmVzdWx0c1BhbmVsID0gJCgncmVzdWx0c1BhbmVsJyk7DQoNCiAgICBmdW5jdGlvbiBpbml0KCkgew0KICAgICAgICB1cGRhdGVJbnB1dE1ldGhvZE9wdGlvbnMoKTsNCiAgICAgICAgYnVpbGRDb21wYXJpc29uTWF0ZXJpYWxzKCk7DQogICAgICAgIGJ1aWxkU2VnbWVudHMoKTsNCiAgICAgICAgYmluZEV2ZW50cygpOw0KICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEV2ZW50cygpIHsNCiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT4gew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgY2FsY3VsYXRlKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJy5tZWMtdW5pdC1idG4nKS5mb3JFYWNoKChidG4pID0+IHsNCiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFVuaXRTeXN0ZW0oYnRuLmRhdGFzZXQudW5pdCkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBjYWxjTW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVJbnB1dE1ldGhvZE9wdGlvbnMoKTsNCiAgICAgICAgICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpbnB1dE1ldGhvZC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgc2VjdGlvblR5cGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgdXBkYXRlU2VjdGlvbkZpZWxkcygpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBtYXRlcmlhbFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhcHBseU1hdGVyaWFsUHJlc2V0KTsNCg0KICAgICAgICAkKCdudW1NYXRlcmlhbHMnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICBjb21wYXJpc29uQ291bnQgPSBwYXJzZUludCgkKCdudW1NYXRlcmlhbHMnKS52YWx1ZSwgMTApOw0KICAgICAgICAgICAgYnVpbGRDb21wYXJpc29uTWF0ZXJpYWxzKCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0c1BhbmVsKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgICQoJ2FkZFNlZ21lbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICAgICAgICAgIGlmIChzZWdtZW50Q291bnQgPCA2KSB7DQogICAgICAgICAgICAgICAgc2VnbWVudENvdW50Kys7DQogICAgICAgICAgICAgICAgYnVpbGRTZWdtZW50cygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaGlkZVJlc3VsdHNQYW5lbCk7DQogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsNCiAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gbWF0ZXJpYWxTZWxlY3QpIHJldHVybjsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlSW5wdXRNZXRob2RPcHRpb25zKCkgew0KICAgICAgICBjb25zdCBtb2RlID0gY2FsY01vZGUudmFsdWU7DQogICAgICAgIGNvbnN0IGxpc3QgPSBNT0RFX0lOUFVUX01FVEhPRFNbbW9kZV07DQogICAgICAgIGNvbnN0IHJvdyA9IHJvb3QucXVlcnlTZWxlY3RvcignLm1lYy1tb2RlLWZpZWxkJyk7DQogICAgICAgIGlmICghbGlzdCkgew0KICAgICAgICAgICAgaWYgKHJvdykgcm93LmNsYXNzTGlzdC5hZGQoJ21lYy1oaWRkZW4nKTsNCiAgICAgICAgICAgIGlucHV0TWV0aG9kLmlubmVySFRNTCA9ICcnOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChyb3cpIHJvdy5jbGFzc0xpc3QucmVtb3ZlKCdtZWMtaGlkZGVuJyk7DQogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpbnB1dE1ldGhvZC52YWx1ZTsNCiAgICAgICAgaW5wdXRNZXRob2QuaW5uZXJIVE1MID0gbGlzdC5tYXAoKFt2LCB0XSkgPT4gYDxvcHRpb24gdmFsdWU9IiR7dn0iPiR7dH08L29wdGlvbj5gKS5qb2luKCcnKTsNCiAgICAgICAgaWYgKGxpc3Quc29tZSgoW3ZdKSA9PiB2ID09PSBjdXJyZW50KSkgaW5wdXRNZXRob2QudmFsdWUgPSBjdXJyZW50Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVNlY3Rpb25GaWVsZHMoKSB7DQogICAgICAgIGNvbnN0IHR5cGUgPSBzZWN0aW9uVHlwZS52YWx1ZTsNCiAgICAgICAgJGFsbCgnLm1lYy1zZWN0aW9uLWZpZWxkW2RhdGEtc2VjdGlvbl0nKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbWVjLWhpZGRlbicsIGVsLmRhdGFzZXQuc2VjdGlvbiAhPT0gdHlwZSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBtZXRob2QgPSBpbnB1dE1ldGhvZC52YWx1ZSB8fCAnb3JpZ2luYWxGaW5hbCc7DQoNCiAgICAgICAgJGFsbCgnW2RhdGEtbW9kZV0nKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgY29uc3QgbW9kZXMgPSBlbC5kYXRhc2V0Lm1vZGUuc3BsaXQoJyAnKTsNCiAgICAgICAgICAgIGNvbnN0IG1vZGVNYXRjaCA9IG1vZGVzLmluY2x1ZGVzKG1vZGUpOw0KICAgICAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSAhZWwuZGF0YXNldC5tZXRob2QgfHwgZWwuZGF0YXNldC5tZXRob2Quc3BsaXQoJyAnKS5pbmNsdWRlcyhtZXRob2QpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbWVjLWhpZGRlbicsICEobW9kZU1hdGNoICYmIG1ldGhvZE1hdGNoKSk7DQogICAgICAgIH0pOw0KDQogICAgICAgICRhbGwoJ2ZpZWxkc2V0W2RhdGEtbW9kZV0nKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgY29uc3QgbW9kZXMgPSBlbC5kYXRhc2V0Lm1vZGUuc3BsaXQoJyAnKTsNCiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ21lYy1oaWRkZW4nLCAhbW9kZXMuaW5jbHVkZXMobW9kZSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICB1cGRhdGVTZWN0aW9uRmllbGRzKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3dpdGNoVW5pdFN5c3RlbShzeXMpIHsNCiAgICAgICAgaWYgKHN5cyA9PT0gdW5pdFN5c3RlbSkgcmV0dXJuOw0KICAgICAgICBjb25zdCBmcm9tTGVuID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nOw0KICAgICAgICBjb25zdCB0b0xlbiA9IHN5cyA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nOw0KDQogICAgICAgIFsnb3JpZ2luYWxMZW5ndGgnLCAnZmluYWxMZW5ndGgnLCAnb3JpZ2luYWxMZW5ndGgyJywgJ3N0cmFpbkxlbmd0aCcsDQogICAgICAgICAgICAnZGlhbWV0ZXInLCAnb3V0ZXJEaWFtZXRlcicsICdpbm5lckRpYW1ldGVyJywgJ3dpZHRoJywgJ3RoaWNrbmVzcycsICdzaWRlJ10uZm9yRWFjaCgoaWQpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJu\",\n    \"Ow0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwodmFsLCBmcm9tTGVuKTsNCiAgICAgICAgICAgIGVsLnZhbHVlID0gZm9ybWF0TnVtKENPTlYubGVuZ3RoRnJvbUludGVybmFsKGludGVybmFsLCB0b0xlbiksIDQpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBjb25zdCBsb2FkRWwgPSAkKCdhcHBsaWVkTG9hZCcpOw0KICAgICAgICBpZiAobG9hZEVsICYmIGxvYWRFbC52YWx1ZSAhPT0gJycpIHsNCiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlRmxvYXQobG9hZEVsLnZhbHVlKTsNCiAgICAgICAgICAgIGlmICghaXNOYU4odmFsKSkgew0KICAgICAgICAgICAgICAgIGlmIChzeXMgPT09ICdpbXBlcmlhbCcpIHsNCiAgICAgICAgICAgICAgICAgICAgbG9hZEVsLnZhbHVlID0gZm9ybWF0TnVtKENPTlYuZm9yY2VGcm9tSW50ZXJuYWwoQ09OVi5mb3JjZVRvSW50ZXJuYWwodmFsLCAna04nKSwgJ2xiZicpLCAyKTsNCiAgICAgICAgICAgICAgICAgICAgJCgnZm9yY2VVbml0JykudmFsdWUgPSAnbGJmJzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBsb2FkRWwudmFsdWUgPSBmb3JtYXROdW0oQ09OVi5mb3JjZUZyb21JbnRlcm5hbChDT05WLmZvcmNlVG9JbnRlcm5hbCh2YWwsICdsYmYnKSwgJ2tOJyksIDIpOw0KICAgICAgICAgICAgICAgICAgICAkKCdmb3JjZVVuaXQnKS52YWx1ZSA9ICdrTic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgZUVsID0gJCgneW91bmdNb2R1bHVzJyk7DQogICAgICAgIGlmIChlRWwgJiYgZUVsLnZhbHVlICE9PSAnJykgew0KICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlRWwudmFsdWUpOw0KICAgICAgICAgICAgaWYgKCFpc05hTih2YWwpKSB7DQogICAgICAgICAgICAgICAgaWYgKHN5cyA9PT0gJ2ltcGVyaWFsJykgew0KICAgICAgICAgICAgICAgICAgICBlRWwudmFsdWUgPSBmb3JtYXROdW0oQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKENPTlYubW9kdWx1c1RvSW50ZXJuYWwodmFsLCAnR1BhJyksICdrc2knKSwgMSk7DQogICAgICAgICAgICAgICAgICAgICQoJ3lvdW5nVW5pdCcpLnZhbHVlID0gJ2tzaSc7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZUVsLnZhbHVlID0gZm9ybWF0TnVtKENPTlYubW9kdWx1c0Zyb21JbnRlcm5hbChDT05WLm1vZHVsdXNUb0ludGVybmFsKHZhbCwgJ2tzaScpLCAnR1BhJyksIDEpOw0KICAgICAgICAgICAgICAgICAgICAkKCd5b3VuZ1VuaXQnKS52YWx1ZSA9ICdHUGEnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHVuaXRTeXN0ZW0gPSBzeXM7DQogICAgICAgICRhbGwoJy5tZWMtdW5pdC1idG4nKS5mb3JFYWNoKChiKSA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ21lYy1hY3RpdmUnLCBiLmRhdGFzZXQudW5pdCA9PT0gc3lzKSk7DQogICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgICAgIGNvbnN0IGxlbiA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJzsNCiAgICAgICAgY29uc3QgYXJlYSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW7CsicgOiAnbW3Csic7DQogICAgICAgICRhbGwoJ1tkYXRhLXVuaXQta2V5PSJsZW5ndGgiXScpLmZvckVhY2goKGVsKSA9PiB7IGVsLnRleHRDb250ZW50ID0gbGVuOyB9KTsNCiAgICAgICAgJGFsbCgnW2RhdGEtdW5pdC1rZXk9Imxlbmd0aFNtYWxsIl0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IGxlbjsgfSk7DQogICAgICAgIGlmICgkKCdhcmVhVW5pdCcpKSB7DQogICAgICAgICAgICAkKCdhcmVhVW5pdCcpLnZhbHVlID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbjInIDogJ21tMic7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsUHJlc2V0KCkgew0KICAgICAgICBjb25zdCBrZXkgPSBtYXRlcmlhbFNlbGVjdC52YWx1ZTsNCiAgICAgICAgY29uc3QgbWF0ID0gTUFURVJJQUxTW2tleV07DQogICAgICAgIGlmICghbWF0KSByZXR1cm47DQogICAgICAgIGlmIChtYXQuRSAhPSBudWxsICYmICQoJ3lvdW5nTW9kdWx1cycpKSAkKCd5b3VuZ01vZHVsdXMnKS52YWx1ZSA9IG1hdC5FOw0KICAgICAgICBpZiAobWF0LmFscGhhICE9IG51bGwgJiYgJCgndGhlcm1hbEFscGhhJykpICQoJ3RoZXJtYWxBbHBoYScpLnZhbHVlID0gbWF0LmFscGhhOw0KICAgICAgICBpZiAobWF0LlN5ICE9IG51bGwgJiYgJCgneWllbGRTdHJlbmd0aCcpKSAkKCd5aWVsZFN0cmVuZ3RoJykudmFsdWUgPSBtYXQuU3k7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYnVpbGRDb21wYXJpc29uTWF0ZXJpYWxzKCkgew0KICAgICAgICBjb21wYXJpc29uQ291bnQgPSBwYXJzZUludCgkKCdudW1NYXRlcmlhbHMnKS52YWx1ZSwgMTApOw0KICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCdjb21wYXJpc29uTWF0ZXJpYWxzJyk7DQogICAgICAgIGNvbnN0IHJlZlNlbGVjdCA9ICQoJ3JlZk1hdGVyaWFsJyk7DQogICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhNQVRFUklBTFMpLmZpbHRlcigoaykgPT4gayAhPT0gJ2N1c3RvbScpOw0KICAgICAgICBsZXQgaHRtbCA9ICcnOw0KICAgICAgICBsZXQgcmVmT3B0cyA9ICcnOw0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBhcmlzb25Db3VudDsgaSsrKSB7DQogICAgICAgICAgICBjb25zdCBkZWZhdWx0S2V5ID0ga2V5c1tpICUga2V5cy5sZW5ndGhdOw0KICAgICAgICAgICAgY29uc3QgbWF0ID0gTUFURVJJQUxTW2RlZmF1bHRLZXldOw0KICAgICAgICAgICAgcmVmT3B0cyArPSBgPG9wdGlvbiB2YWx1ZT0iJHtpfSI+JHttYXQubmFtZX08L29wdGlvbj5gOw0KICAgICAgICAgICAgaHRtbCArPSBgDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVjLW1hdGVyaWFsLXJvdyIgZGF0YS1pZHg9IiR7aX0iPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWMtbWF0ZXJpYWwtcm93LWhlYWRlciI+PHNwYW4+TWF0ZXJpYWwgJHtpICsgMX08L3NwYW4+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lYy1mb3JtLXJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWMtZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5hbWU8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ibWVjLWNtcC1uYW1lIiB2YWx1ZT0iJHttYXQubmFtZX0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWMtZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByZXNldDwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0ibWVjLWNtcC1wcmVzZXQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2tleXMubWFwKChrKSA9PiBgPG9wdGlvbiB2YWx1ZT0iJHtrfSIke2sgPT09IGRlZmF1bHRLZXkgPyAnIHNlbGVjdGVkJyA6ICcnfT4ke01BVEVSSUFMU1trXS5uYW1lfTwvb3B0aW9uPmApLmpvaW4oJycpfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjdXN0b20iPkN1c3RvbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWMtZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkUgKEdQYSk8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJtZWMtY21wLUUiIHZhbHVlPSIke21hdC5FfSIgbWluPSIwLjAwMSIgc3RlcD0iYW55Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj5gOw0KICAgICAgICB9DQogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOw0KICAgICAgICByZWZTZWxlY3QuaW5uZXJIVE1MID0gcmVmT3B0czsNCg0KICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLm1lYy1jbXAtcHJlc2V0JykuZm9yRWFjaCgoc2VsKSA9PiB7DQogICAg\",\n    \"ICAgICAgICBzZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBlLnRhcmdldC5jbG9zZXN0KCcubWVjLW1hdGVyaWFsLXJvdycpOw0KICAgICAgICAgICAgICAgIGNvbnN0IG1hdCA9IE1BVEVSSUFMU1tlLnRhcmdldC52YWx1ZV07DQogICAgICAgICAgICAgICAgaWYgKG1hdCAmJiBtYXQuRSAhPSBudWxsKSByb3cucXVlcnlTZWxlY3RvcignLm1lYy1jbXAtRScpLnZhbHVlID0gbWF0LkU7DQogICAgICAgICAgICAgICAgaWYgKG1hdCkgcm93LnF1ZXJ5U2VsZWN0b3IoJy5tZWMtY21wLW5hbWUnKS52YWx1ZSA9IG1hdC5uYW1lOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJ1aWxkU2VnbWVudHMoKSB7DQogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICQoJ3NlZ21lbnRzJyk7DQogICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhNQVRFUklBTFMpLmZpbHRlcigoaykgPT4gayAhPT0gJ2N1c3RvbScpOw0KICAgICAgICBsZXQgaHRtbCA9ICcnOw0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKSB7DQogICAgICAgICAgICBjb25zdCBkZWZhdWx0S2V5ID0ga2V5c1tpICUga2V5cy5sZW5ndGhdOw0KICAgICAgICAgICAgY29uc3QgbWF0ID0gTUFURVJJQUxTW2RlZmF1bHRLZXldOw0KICAgICAgICAgICAgaHRtbCArPSBgDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVjLXNlZ21lbnQtYmxvY2siIGRhdGEtc2VnPSIke2l9Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVjLXNlZ21lbnQtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNlZ21lbnQgJHtpICsgMX08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAke2kgPj0gMiA\/IGA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im1lYy1idG4tcmVtb3ZlIiBkYXRhLXJlbW92ZT0iJHtpfSI+UmVtb3ZlPC9idXR0b24+YCA6ICcnfQ0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVjLWZvcm0tcm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lYy1mb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TGVuZ3RoIEwgKG1tKTwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1lYy1zZWctTCIgdmFsdWU9IiR7aSA9PT0gMCA\/IDUwMCA6IDUwMH0iIG1pbj0iMC4wMDEiIHN0ZXA9ImFueSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lYy1mb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+QXJlYSBBIChtbcKyKTwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1lYy1zZWctQSIgdmFsdWU9IjMxNC4xNiIgbWluPSIwLjAwMSIgc3RlcD0iYW55Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVjLWZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Gb3JjZSBGIChrTik8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJtZWMtc2VnLUYiIHZhbHVlPSIyMCIgbWluPSIwIiBzdGVwPSJhbnkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZWMtZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkUgKEdQYSk8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJtZWMtc2VnLUUiIHZhbHVlPSIke21hdC5FfSIgbWluPSIwLjAwMSIgc3RlcD0iYW55Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj5gOw0KICAgICAgICB9DQogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOw0KICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLm1lYy1idG4tcmVtb3ZlJykuZm9yRWFjaCgoYnRuKSA9PiB7DQogICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRDb3VudCA+IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgc2VnbWVudENvdW50LS07DQogICAgICAgICAgICAgICAgICAgIGJ1aWxkU2VnbWVudHMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVhZExlbmd0aChpZCwgdW5pdElkKSB7DQogICAgICAgIGNvbnN0IGVsID0gJChpZCk7DQogICAgICAgIGlmICghZWwgfHwgZWwudmFsdWUgPT09ICcnKSByZXR1cm4gbnVsbDsNCiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgIGlmIChpc05hTih2YWwpKSByZXR1cm4gbnVsbDsNCiAgICAgICAgY29uc3QgdW5pdCA9IHVuaXRJZCA\/ICQodW5pdElkKS52YWx1ZSA6ICh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbScpOw0KICAgICAgICByZXR1cm4gQ09OVi5sZW5ndGhUb0ludGVybmFsKHZhbCwgdW5pdCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVhZEFyZWEoKSB7DQogICAgICAgIGNvbnN0IHR5cGUgPSBzZWN0aW9uVHlwZS52YWx1ZTsNCiAgICAgICAgY29uc3QgbGVuVSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJzsNCiAgICAgICAgaWYgKHR5cGUgPT09ICdzb2xpZFJvdW5kJykgew0KICAgICAgICAgICAgY29uc3QgZCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChwYXJzZUZsb2F0KCQoJ2RpYW1ldGVyJykudmFsdWUpIHx8IDAsIGxlblUpOw0KICAgICAgICAgICAgcmV0dXJuIE1hdGguUEkgKiBkICogZCAvIDQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGUgPT09ICdob2xsb3dSb3VuZCcpIHsNCiAgICAgICAgICAgIGNvbnN0IEQgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwocGFyc2VGbG9hdCgkKCdvdXRlckRpYW1ldGVyJykudmFsdWUpIHx8IDAsIGxlblUpOw0KICAgICAgICAgICAgY29uc3QgZCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChwYXJzZUZsb2F0KCQoJ2lubmVyRGlhbWV0ZXInKS52YWx1ZSkgfHwgMCwgbGVuVSk7DQogICAgICAgICAgICByZXR1cm4gTWF0aC5QSSAqIChEICogRCAtIGQgKiBkKSAvIDQ7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGUgPT09ICdyZWN0YW5nbGUnKSB7DQogICAgICAgICAgICBjb25zdCBiID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKHBhcnNlRmxvYXQoJCgnd2lkdGgnKS52YWx1ZSkgfHwgMCwgbGVuVSk7DQogICAgICAgICAgICBjb25zdCB0ID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKHBhcnNlRmxvYXQoJCgndGhpY2tuZXNzJykudmFsdWUpIHx8IDAsIGxlblUpOw0KICAgICAgICAgICAgcmV0dXJuIGIgKiB0Ow0KICAgICAgICB9DQogICAgICAgIGlmICh0eXBlID09PSAnc3F1YXJlJykgew0KICAgICAgICAgICAgY29uc3QgYSA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChwYXJzZUZsb2F0KCQoJ3NpZGUnKS52YWx1ZSkgfHwgMCwgbGVuVSk7DQogICAgICAgICAgICByZXR1cm4gYSAqIGE7DQogICAgICAgIH0NCiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VGbG9hdCgkKCdjdXN0b21BcmVhJykudmFsdWUpIHx8IDA7DQogICAgICAgIHJldHVybiBDT05WLmFyZWFUb0ludGVybmFsKHZhbCwgJCgnYXJlYVVuaXQnKS52YWx1ZSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVhZENvbW1vbklucHV0cygpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBtZXRob2QgPSBpbnB1dE1ldGhvZC52YWx1ZSB8fCAnb3JpZ2luYWxGaW5hbCc7DQogICAgICAgIGNvbnN0IGlucCA9IHsgbW9kZSwgbWV0aG9kIH07DQoNCiAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ29yaWdpbmFsRmluYWwnKSB7DQogICAgICAgICAgICBpbnAuTDAgPSByZWFkTGVuZ3RoKCdvcmlnaW5hbExlbmd0aCcsICdsZW5ndGhVbml0Jyk7DQogICAgICAgICAgICBpbnAuTGYgPSByZWFkTGVuZ3RoKCdmaW5hbExlbmd0aCcsICdmaW5hbExlbmd0aFVuaXQnKTsNCiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdvcmlnaW5hbERlbHRhJykgew0KICAgICAgICAgICAgaW5wLkwwID0gcmVhZExlbmd0aCgnb3JpZ2luYWxMZW5ndGgyJywgJ2xlbmd0aFVuaXQyJyk7DQogICAgICAgICAgICBjb25zdCBkTHZh\",\n    \"bCA9IHBhcnNlRmxvYXQoJCgnZWxvbmdhdGlvbicpLnZhbHVlKTsNCiAgICAgICAgICAgIGlmICghaXNOYU4oZEx2YWwpKSBpbnAuZEwgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwoZEx2YWwsICQoJ2Vsb25nYXRpb25Vbml0JykudmFsdWUpOw0KICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3N0cmFpbktub3duJykgew0KICAgICAgICAgICAgaW5wLkwwID0gcmVhZExlbmd0aCgnc3RyYWluTGVuZ3RoJywgbnVsbCk7DQogICAgICAgICAgICBjb25zdCBzdiA9IHBhcnNlRmxvYXQoJCgnaW5wdXRTdHJhaW4nKS52YWx1ZSk7DQogICAgICAgICAgICBpZiAoIWlzTmFOKHN2KSkgaW5wLnN0cmFpbiA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChzdiwgJCgnc3RyYWluVW5pdCcpLnZhbHVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlucC5BID0gcmVhZEFyZWEoKTsNCiAgICAgICAgaW5wLkYgPSBDT05WLmZvcmNlVG9JbnRlcm5hbChwYXJzZUZsb2F0KCQoJ2FwcGxpZWRMb2FkJykudmFsdWUpIHx8IDAsICQoJ2ZvcmNlVW5pdCcpLnZhbHVlKTsNCiAgICAgICAgaW5wLkUgPSBDT05WLm1vZHVsdXNUb0ludGVybmFsKHBhcnNlRmxvYXQoJCgneW91bmdNb2R1bHVzJykudmFsdWUpIHx8IDAsICQoJ3lvdW5nVW5pdCcpLnZhbHVlKTsNCiAgICAgICAgaW5wLlN5ID0gQ09OVi5zdHJlc3NUb0ludGVybmFsKHBhcnNlRmxvYXQoJCgneWllbGRTdHJlbmd0aCcpLnZhbHVlKSB8fCAwLCAkKCd5aWVsZFVuaXQnKS52YWx1ZSk7DQoNCiAgICAgICAgY29uc3QgYWxsb3dETCA9ICQoJ2FsbG93RWxvbmdhdGlvbicpLnZhbHVlOw0KICAgICAgICBpZiAoYWxsb3dETCAhPT0gJycpIGlucC5hbGxvd0RMID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKHBhcnNlRmxvYXQoYWxsb3dETCksICQoJ2FsbG93RWxvbmdVbml0JykudmFsdWUpOw0KICAgICAgICBjb25zdCBhbGxvd1N0ciA9ICQoJ2FsbG93U3RyYWluJykudmFsdWU7DQogICAgICAgIGlmIChhbGxvd1N0ciAhPT0gJycpIGlucC5hbGxvd1N0cmFpbiA9IENPTlYuc3RyYWluVG9JbnRlcm5hbChwYXJzZUZsb2F0KGFsbG93U3RyKSwgJCgnYWxsb3dTdHJhaW5Vbml0JykudmFsdWUpOw0KDQogICAgICAgIGlucC5hbHBoYSA9IChwYXJzZUZsb2F0KCQoJ3RoZXJtYWxBbHBoYScpLnZhbHVlKSB8fCAwKSAqIDFlLTY7DQogICAgICAgIGlucC5kVCA9IHBhcnNlRmxvYXQoJCgndGVtcENoYW5nZScpLnZhbHVlKSB8fCAwOw0KICAgICAgICBpbnAuaW5jbHVkZU1lY2hhbmljYWwgPSAkKCdpbmNsdWRlTWVjaGFuaWNhbCcpLmNoZWNrZWQ7DQoNCiAgICAgICAgcmV0dXJuIGlucDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cyhpbnAsIGVycm9ycywgd2FybmluZ3MpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGlucC5tb2RlOw0KDQogICAgICAgIGlmIChbJ21lYXN1cmVkJywgJ3BlcmNlbnRhZ2UnLCAnZW5naW5lZXJpbmdTdHJhaW4nLCAnZmluYWxMZW5ndGgnLCAndGVuc2lsZVRlc3QnXS5pbmNsdWRlcyhtb2RlKSkgew0KICAgICAgICAgICAgaWYgKGlucC5MMCA9PSBudWxsIHx8IGlucC5MMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICBpZiAoaW5wLm1ldGhvZCA9PT0gJ29yaWdpbmFsRmluYWwnICYmIGlucC5MZiAhPSBudWxsICYmIGlucC5MZiA8IDApIGVycm9ycy5wdXNoKCdGaW5hbCBsZW5ndGggbXVzdCBub3QgYmUgbmVnYXRpdmUuJyk7DQogICAgICAgICAgICBpZiAoaW5wLm1ldGhvZCA9PT0gJ29yaWdpbmFsRmluYWwnICYmIGlucC5MZiAhPSBudWxsICYmIGlucC5MMCAhPSBudWxsICYmIGlucC5MZiA8IGlucC5MMCAmJiBtb2RlICE9PSAndGVuc2lsZVRlc3QnKSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnRmluYWwgbGVuZ3RoIGlzIGxlc3MgdGhhbiBvcmlnaW5hbCBsZW5ndGgg4oCUIHRoaXMgaW5kaWNhdGVzIGNvbXByZXNzaW9uIG9yIG1lYXN1cmVtZW50IGVycm9yIGluIHRlbnNpbGUgZWxvbmdhdGlvbiBtb2RlLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKFsnZWxhc3RpYycsICdyZXF1aXJlZEUnLCAncmVxdWlyZWRBcmVhJywgJ2FsbG93YWJsZUxvYWQnLCAncmVxdWlyZWRMZW5ndGgnLCAnY29tcGFyaXNvbicsICdtdWx0aVNlZ21lbnQnXS5pbmNsdWRlcyhtb2RlKSkgew0KICAgICAgICAgICAgaWYgKG1vZGUgIT09ICdtdWx0aVNlZ21lbnQnICYmIG1vZGUgIT09ICdjb21wYXJpc29uJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IEwwID0gaW5wLkwwID8\/IHJlYWRMZW5ndGgoJ29yaWdpbmFsTGVuZ3RoJywgJ2xlbmd0aFVuaXQnKTsNCiAgICAgICAgICAgICAgICBpZiAoTDAgPT0gbnVsbCB8fCBMMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICAgICAgaW5wLkwwID0gTDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobW9kZSAhPT0gJ211bHRpU2VnbWVudCcpIHsNCiAgICAgICAgICAgICAgICBpZiAoaW5wLkEgPT0gbnVsbCB8fCBpbnAuQSA8PSAwKSBlcnJvcnMucHVzaCgnQ3Jvc3Mtc2VjdGlvbmFsIGFyZWEgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgICAgICAgICBpZiAoc2VjdGlvblR5cGUudmFsdWUgPT09ICdob2xsb3dSb3VuZCcpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuVSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4nIDogJ21tJzsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgRCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChwYXJzZUZsb2F0KCQoJ291dGVyRGlhbWV0ZXInKS52YWx1ZSkgfHwgMCwgbGVuVSk7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBDT05WLmxlbmd0aFRvSW50ZXJuYWwocGFyc2VGbG9hdCgkKCdpbm5lckRpYW1ldGVyJykudmFsdWUpIHx8IDAsIGxlblUpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZCA+PSBEKSBlcnJvcnMucHVzaCgnSW5uZXIgZGlhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3V0ZXIgZGlhbWV0ZXIuJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKFsnZWxhc3RpYycsICdyZXF1aXJlZEFyZWEnLCAnYWxsb3dhYmxlTG9hZCcsICdyZXF1aXJlZExlbmd0aCcsICdjb21wYXJpc29uJ10uaW5jbHVkZXMobW9kZSkpIHsNCiAgICAgICAgICAgIGlmIChpbnAuRSA9PSBudWxsIHx8IGlucC5FIDw9IDApIGVycm9ycy5wdXNoKCJZb3VuZydzIG1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChbJ3JlcXVpcmVkRScsICdyZXF1aXJlZEFyZWEnLCAnYWxsb3dhYmxlTG9hZCcsICdyZXF1aXJlZExlbmd0aCddLmluY2x1ZGVzKG1vZGUpKSB7DQogICAgICAgICAgICBpZiAoaW5wLmRMID09IG51bGwgJiYgaW5wLm1ldGhvZCA9PT0gJ29yaWdpbmFsRGVsdGEnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgZEx2YWwgPSBwYXJzZUZsb2F0KCQoJ2Vsb25nYXRpb24nKS52YWx1ZSk7DQogICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRMdmFsKSB8fCBkTHZhbCA8PSAwKSBlcnJvcnMucHVzaCgnRWxvbmdhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciByZXZlcnNlIGNhbGN1bGF0aW9ucy4nKTsNCiAgICAgICAgICAgICAgICBlbHNlIGlucC5kTCA9IENPTlYubGVuZ3RoVG9JbnRlcm5hbChkTHZhbCwgJCgnZWxvbmdhdGlvblVuaXQnKS52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoaW5wLmFsbG93REwgIT0gbnVsbCAmJiBpbnAuYWxsb3dETCA8PSAwKSBlcnJvcnMucHVzaCgnQWxsb3dhYmxlIGVsb25nYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtb2RlID09PSAndGhlcm1hbCcpIHsNCiAgICAgICAgICAgIGNvbnN0IEwwID0gcmVhZExlbmd0aCgnb3JpZ2luYWxMZW5ndGgnLCAnbGVuZ3RoVW5pdCcpOw0KICAgICAgICAgICAgaWYgKEwwID09IG51bGwgfHwgTDAgPD0gMCkgZXJyb3JzLnB1c2goJ09yaWdpbmFsIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgaW5wLkwwID0gTDA7DQogICAgICAgICAgICBpZiAoaW5wLmluY2x1ZGVNZWNoYW5pY2FsKSB7DQogICAgICAgICAgICAgICAgaWYgKGlucC5BIDw9IDApIGVycm9ycy5wdXNoKCdDcm9zcy1zZWN0aW9uYWwgYXJlYSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICAgICAgICAgIGlmIChpbnAuRSA8PSAwKSBlcnJvcnMucHVzaCgiWW91bmcncyBtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA9PT0gMDsNCiAg\",\n    \"ICB9DQoNCiAgICBmdW5jdGlvbiBjbGFzc2lmeUFsbG93YWJsZShkTCwgTDAsIGFsbG93REwsIGFsbG93U3RyYWluKSB7DQogICAgICAgIGlmIChhbGxvd0RMID09IG51bGwgJiYgYWxsb3dTdHJhaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7DQogICAgICAgIGxldCBsaW1pdCA9IGFsbG93REw7DQogICAgICAgIGlmIChsaW1pdCA9PSBudWxsICYmIGFsbG93U3RyYWluICE9IG51bGwgJiYgTDAgPiAwKSBsaW1pdCA9IGFsbG93U3RyYWluICogTDA7DQogICAgICAgIGlmIChsaW1pdCA9PSBudWxsIHx8IGxpbWl0IDw9IDApIHJldHVybiBudWxsOw0KICAgICAgICBjb25zdCByYXRpbyA9IGRMIC8gbGltaXQ7DQogICAgICAgIGlmIChyYXRpbyA8PSAwLjg1KSByZXR1cm4geyBsYWJlbDogJ0FjY2VwdGFibGUnLCBsZXZlbDogJ3NhZmUnIH07DQogICAgICAgIGlmIChyYXRpbyA8PSAxLjApIHJldHVybiB7IGxhYmVsOiAnQ2F1dGlvbiDigJQgTmVhciBMaW1pdCcsIGxldmVsOiAnY2F1dGlvbicgfTsNCiAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdFeGNlZWRzIExpbWl0JywgbGV2ZWw6ICdkYW5nZXInIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZU1lYXN1cmVkKGlucCkgew0KICAgICAgICBsZXQgZEwsIEwwID0gaW5wLkwwLCBMZjsNCiAgICAgICAgaWYgKGlucC5tZXRob2QgPT09ICdvcmlnaW5hbEZpbmFsJykgew0KICAgICAgICAgICAgTGYgPSBpbnAuTGY7DQogICAgICAgICAgICBkTCA9IExmIC0gTDA7DQogICAgICAgIH0gZWxzZSBpZiAoaW5wLm1ldGhvZCA9PT0gJ29yaWdpbmFsRGVsdGEnKSB7DQogICAgICAgICAgICBkTCA9IGlucC5kTDsNCiAgICAgICAgICAgIExmID0gTDAgKyBkTDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNvbnN0IHN0cmFpbiA9IGlucC5zdHJhaW47DQogICAgICAgICAgICBkTCA9IHN0cmFpbiAqIEwwOw0KICAgICAgICAgICAgTGYgPSBMMCAqICgxICsgc3RyYWluKTsNCiAgICAgICAgfQ0KICAgICAgICBjb25zdCBzdHJhaW4gPSBMMCA+IDAgPyBkTCAvIEwwIDogMDsNCiAgICAgICAgcmV0dXJuIHsgTDAsIExmLCBkTCwgc3RyYWluLCBwY3Q6IHN0cmFpbiAqIDEwMCwgbWljcm86IHN0cmFpbiAqIDFlNiB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNvbXB1dGVFbGFzdGljKGlucCkgew0KICAgICAgICBjb25zdCBMMCA9IGlucC5MMDsNCiAgICAgICAgY29uc3QgQSA9IGlucC5BOw0KICAgICAgICBjb25zdCBGID0gaW5wLkY7DQogICAgICAgIGNvbnN0IEUgPSBpbnAuRTsNCiAgICAgICAgY29uc3QgZEwgPSBGICogTDAgLyAoQSAqIEUgKiAxMDAwKTsNCiAgICAgICAgY29uc3QgTGYgPSBMMCArIGRMOw0KICAgICAgICBjb25zdCBzdHJhaW4gPSBMMCA+IDAgPyBkTCAvIEwwIDogMDsNCiAgICAgICAgY29uc3Qgc2lnbWEgPSBBID4gMCA\/IEYgLyBBIDogMDsNCiAgICAgICAgcmV0dXJuIHsgTDAsIExmLCBkTCwgc3RyYWluLCBwY3Q6IHN0cmFpbiAqIDEwMCwgbWljcm86IHN0cmFpbiAqIDFlNiwgc2lnbWEsIEEsIEYsIEUgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7DQogICAgICAgIGhpZGVNZXNzYWdlcygpOw0KICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsNCiAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBbXTsNCiAgICAgICAgY29uc3QgaW5wID0gcmVhZENvbW1vbklucHV0cygpOw0KICAgICAgICBjb25zdCBtb2RlID0gaW5wLm1vZGU7DQoNCiAgICAgICAgaWYgKCF2YWxpZGF0ZUlucHV0cyhpbnAsIGVycm9ycywgd2FybmluZ3MpKSB7DQogICAgICAgICAgICBzaG93RXJyb3JzKGVycm9ycyk7DQogICAgICAgICAgICBzaG93UmVzdWx0c1BhbmVsKCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBsZXQgcmVzdWx0cyA9IFtdOw0KICAgICAgICBsZXQgdml6RGF0YSA9IHt9Ow0KICAgICAgICBsZXQgY2xhc3NpZmljYXRpb24gPSBudWxsOw0KDQogICAgICAgIGlmIChtb2RlID09PSAnbWVhc3VyZWQnIHx8IG1vZGUgPT09ICdwZXJjZW50YWdlJyB8fCBtb2RlID09PSAnZW5naW5lZXJpbmdTdHJhaW4nKSB7DQogICAgICAgICAgICBjb25zdCByID0gY29tcHV0ZU1lYXN1cmVkKGlucCk7DQogICAgICAgICAgICBpZiAoTWF0aC5hYnMoci5zdHJhaW4pID4gMC4wNSkgd2FybmluZ3MucHVzaCgnRW5naW5lZXJpbmcgc3RyYWluIGV4Y2VlZHMgNSUg4oCUIGVuZ2luZWVyaW5nIHN0cmFpbiBtYXkgYmUgdW5zdWl0YWJsZSBmb3IgbGFyZ2UgZGVmb3JtYXRpb24uJyk7DQogICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5QWxsb3dhYmxlKHIuZEwsIHIuTDAsIGlucC5hbGxvd0RMLCBpbnAuYWxsb3dTdHJhaW4pOw0KICAgICAgICAgICAgcmVzdWx0cyA9IGJ1aWxkU3RhbmRhcmRSZXN1bHRzKHIsIGlucCk7DQogICAgICAgICAgICB2aXpEYXRhID0geyAuLi5yLCBtb2RlLCBpbnAgfTsNCiAgICAgICAgICAgIHNldERlZm9ybU5vdGUoJ01lYXN1cmVkIGVsb25nYXRpb24gZnJvbSBkaW1lbnNpb25hbCBjaGFuZ2UuIFRoaXMgbWF5IGluY2x1ZGUgYm90aCBlbGFzdGljIGFuZCBwbGFzdGljIGRlZm9ybWF0aW9uIGRlcGVuZGluZyBvbiBsb2FkaW5nIGhpc3RvcnkuJyk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2ZpbmFsTGVuZ3RoJykgew0KICAgICAgICAgICAgY29uc3QgciA9IGNvbXB1dGVNZWFzdXJlZChpbnApOw0KICAgICAgICAgICAgcmVzdWx0cyA9IGJ1aWxkU3RhbmRhcmRSZXN1bHRzKHIsIGlucCk7DQogICAgICAgICAgICB2aXpEYXRhID0geyAuLi5yLCBtb2RlLCBpbnAgfTsNCiAgICAgICAgICAgIHNldERlZm9ybU5vdGUoJ0ZpbmFsIGxlbmd0aCBjYWxjdWxhdGVkIGZyb20gc3RyYWluOiBMZiA9IEwwKDEgKyDOtSkuJyk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ3RlbnNpbGVUZXN0Jykgew0KICAgICAgICAgICAgY29uc3QgciA9IGNvbXB1dGVNZWFzdXJlZChpbnApOw0KICAgICAgICAgICAgaWYgKHIuZEwgPCAwKSB3YXJuaW5ncy5wdXNoKCdOZWdhdGl2ZSBlbG9uZ2F0aW9uIGF0IGJyZWFrIOKAlCB2ZXJpZnkgZ2F1Z2UgbGVuZ3RoIG1lYXN1cmVtZW50cy4nKTsNCiAgICAgICAgICAgIHJlc3VsdHMgPSBbDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0luaXRpYWwgR2F1Z2UgTGVuZ3RoIChM4oKAKScsIHZhbHVlOiBmbXRMZW4oci5MMCksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRmluYWwgR2F1Z2UgTGVuZ3RoIChMZiknLCB2YWx1ZTogZm10TGVuKHIuTGYpLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0Vsb25nYXRpb24gYXQgQnJlYWsgKCUpJywgdmFsdWU6IGZvcm1hdE51bShyLnBjdCwgMikgKyAnICUnLCBoaWdobGlnaHQ6IHRydWUgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQWJzb2x1dGUgRWxvbmdhdGlvbiAozpRMKScsIHZhbHVlOiBmbXRMZW4oci5kTCksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRW5naW5lZXJpbmcgU3RyYWluIGF0IEJyZWFrJywgdmFsdWU6IGZvcm1hdE51bShyLnN0cmFpbiwgNiksIGhpZ2hsaWdodDogZmFsc2UgfQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIHZpekRhdGEgPSB7IC4uLnIsIG1vZGUsIGlucCwgaXNUZW5zaWxlVGVzdDogdHJ1ZSB9Ow0KICAgICAgICAgICAgc2V0RGVmb3JtTm90ZSgnVGVuc2lsZS10ZXN0IHBlcmNlbnRhZ2UgZWxvbmdhdGlvbiBpcyBhIGR1Y3RpbGl0eSBtZWFzdXJlbWVudCBvYnRhaW5lZCBhZnRlciBmcmFjdHVyZS4gSXQgZGlmZmVycyBmcm9tIHNtYWxsIGVsYXN0aWMgZWxvbmdhdGlvbiBjYWxjdWxhdGVkIHVzaW5nIEhvb2tlXCdzIGxhdyAozpRMID0gRkwvQUUpLicpOw0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdlbGFzdGljJykgew0KICAgICAgICAgICAgY29uc3QgciA9IGNvbXB1dGVFbGFzdGljKGlucCk7DQogICAgICAgICAgICBpZiAoaW5wLlN5ID4gMCAmJiByLnNpZ21hID4gaW5wLlN5KSB3YXJuaW5ncy5wdXNoKCdDYWxjdWxhdGVkIHN0cmVzcyBleGNlZWRzIHlpZWxkIHN0cmVuZ3RoIOKAlCBkZWZvcm1hdGlvbiBtYXkgbm90IHJlbWFpbiBpbiB0aGUgbGluZWFyIGVsYXN0aWMgcmFuZ2UuJyk7DQogICAgICAgICAgICBpZiAoTWF0aC5hYnMoci5zdHJhaW4pID4gMC4wMDIpIHdhcm5pbmdzLnB1c2goJ1N0cmFpbiBleGNlZWRzIDAuMiUg4oCUIHZlcmlmeSBsaW5lYXIgZWxhc3RpYyBhc3N1bXB0aW9uIGZvciDOlEwgPSBGTC8oQUUpLicpOw0KICAgICAgICAgICAgY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmeUFsbG93YWJsZShyLmRMLCByLkwwLCBpbnAuYWxsb3dETCwgaW5wLmFsbG93U3RyYWluKTsNCiAgICAgICAgICAgIHJlc3VsdHMgPSBidWlsZEVsYXN0aWNSZXN1bHRzKHIsIGlucCk7DQogICAgICAgICAgICB2aXpEYXRhID0geyAuLi5yLCBtb2RlLCBpbnAsIFN5OiBpbnAuU3kgfTsNCiAgICAgICAg\",\n    \"ICAgIHNldERlZm9ybU5vdGUoJ0VsYXN0aWMgZWxvbmdhdGlvbiDigJQgZGVmb3JtYXRpb24gZXhwZWN0ZWQgdG8gcmVjb3ZlciBhZnRlciBsb2FkIHJlbW92YWwuIFZhbGlkIG9ubHkgd2l0aGluIHRoZSBsaW5lYXIgZWxhc3RpYyByZWdpb24uJyk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ3JlcXVpcmVkRScpIHsNCiAgICAgICAgICAgIGxldCBkTCA9IGlucC5kTDsNCiAgICAgICAgICAgIGlmIChkTCA9PSBudWxsICYmIGlucC5tZXRob2QgPT09ICdvcmlnaW5hbEZpbmFsJyAmJiBpbnAuTGYgIT0gbnVsbCkgZEwgPSBpbnAuTGYgLSBpbnAuTDA7DQogICAgICAgICAgICBpZiAoZEwgPT0gbnVsbCB8fCBkTCA8PSAwKSB7IGVycm9ycy5wdXNoKCdQcm92aWRlIG1lYXN1cmVkIGVsb25nYXRpb24gZm9yIHJldmVyc2UgY2FsY3VsYXRpb24uJyk7IHNob3dFcnJvcnMoZXJyb3JzKTsgc2hvd1Jlc3VsdHNQYW5lbCgpOyByZXR1cm47IH0NCiAgICAgICAgICAgIGNvbnN0IEUgPSBpbnAuRiAqIGlucC5MMCAvIChpbnAuQSAqIGRMICogMTAwMCk7DQogICAgICAgICAgICByZXN1bHRzID0gWw0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdSZXF1aXJlZCBZb3VuZ1wncyBNb2R1bHVzIChFKScsIHZhbHVlOiBmb3JtYXROdW0oQ09OVi5tb2R1bHVzRnJvbUludGVybmFsKEUsIHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnKSwgMikgKyAnICcgKyAodW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdrc2knIDogJ0dQYScpLCBoaWdobGlnaHQ6IHRydWUgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnTWVhc3VyZWQgRWxvbmdhdGlvbiAozpRMKScsIHZhbHVlOiBmbXRMZW4oZEwpLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0Nyb3NzLVNlY3Rpb25hbCBBcmVhIChBKScsIHZhbHVlOiBmbXRBcmVhKGlucC5BKSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdBcHBsaWVkIExvYWQgKEYpJywgdmFsdWU6IGZtdEZvcmNlKGlucC5GKSwgaGlnaGxpZ2h0OiBmYWxzZSB9DQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgdml6RGF0YSA9IHsgZEwsIEwwOiBpbnAuTDAsIG1vZGUsIGlucCwgRSB9Ow0KICAgICAgICAgICAgc2V0RGVmb3JtTm90ZSgnUmV2ZXJzZSBjYWxjdWxhdGlvbjogRSA9IEZMIC8gKEHOlEwpLicpOw0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdyZXF1aXJlZEFyZWEnKSB7DQogICAgICAgICAgICBjb25zdCBkTGFsbG93ID0gaW5wLmFsbG93REwgPz8gKGlucC5hbGxvd1N0cmFpbiAhPSBudWxsID8gaW5wLmFsbG93U3RyYWluICogaW5wLkwwIDogbnVsbCk7DQogICAgICAgICAgICBpZiAoZExhbGxvdyA9PSBudWxsIHx8IGRMYWxsb3cgPD0gMCkgeyBlcnJvcnMucHVzaCgnUHJvdmlkZSBhbGxvd2FibGUgZWxvbmdhdGlvbiBvciBhbGxvd2FibGUgc3RyYWluLicpOyBzaG93RXJyb3JzKGVycm9ycyk7IHNob3dSZXN1bHRzUGFuZWwoKTsgcmV0dXJuOyB9DQogICAgICAgICAgICBjb25zdCBBcmVxID0gaW5wLkYgKiBpbnAuTDAgLyAoaW5wLkUgKiAxMDAwICogZExhbGxvdyk7DQogICAgICAgICAgICByZXN1bHRzID0gWw0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdSZXF1aXJlZCBDcm9zcy1TZWN0aW9uYWwgQXJlYSAoQSknLCB2YWx1ZTogZm10QXJlYShBcmVxKSwgaGlnaGxpZ2h0OiB0cnVlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0FsbG93YWJsZSBFbG9uZ2F0aW9uICjOlEwpJywgdmFsdWU6IGZtdExlbihkTGFsbG93KSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdDdXJyZW50IEFyZWEgKGlmIGVudGVyZWQpJywgdmFsdWU6IGZtdEFyZWEoaW5wLkEpLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0FwcGxpZWQgTG9hZCAoRiknLCB2YWx1ZTogZm10Rm9yY2UoaW5wLkYpLCBoaWdobGlnaHQ6IGZhbHNlIH0NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICBpZiAoaW5wLkEgPiAwICYmIEFyZXEgPiBpbnAuQSkgd2FybmluZ3MucHVzaCgnUmVxdWlyZWQgYXJlYSBleGNlZWRzIGN1cnJlbnQgYXJlYSDigJQgaW5jcmVhc2UgY3Jvc3Mtc2VjdGlvbiB0byBtZWV0IGFsbG93YWJsZSBlbG9uZ2F0aW9uLicpOw0KICAgICAgICAgICAgdml6RGF0YSA9IHsgZEw6IGRMYWxsb3csIEwwOiBpbnAuTDAsIG1vZGUsIGlucCwgQTogQXJlcSB9Ow0KICAgICAgICAgICAgc2V0RGVmb3JtTm90ZSgnUmV2ZXJzZSBjYWxjdWxhdGlvbjogQSA9IEZMIC8gKEXOlExhbGxvdykuJyk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2FsbG93YWJsZUxvYWQnKSB7DQogICAgICAgICAgICBjb25zdCBkTGFsbG93ID0gaW5wLmFsbG93REwgPz8gKGlucC5hbGxvd1N0cmFpbiAhPSBudWxsID8gaW5wLmFsbG93U3RyYWluICogaW5wLkwwIDogbnVsbCk7DQogICAgICAgICAgICBpZiAoZExhbGxvdyA9PSBudWxsIHx8IGRMYWxsb3cgPD0gMCkgeyBlcnJvcnMucHVzaCgnUHJvdmlkZSBhbGxvd2FibGUgZWxvbmdhdGlvbiBvciBhbGxvd2FibGUgc3RyYWluLicpOyBzaG93RXJyb3JzKGVycm9ycyk7IHNob3dSZXN1bHRzUGFuZWwoKTsgcmV0dXJuOyB9DQogICAgICAgICAgICBjb25zdCBGYWxsb3cgPSBpbnAuQSAqIGlucC5FICogMTAwMCAqIGRMYWxsb3cgLyBpbnAuTDA7DQogICAgICAgICAgICByZXN1bHRzID0gWw0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdBbGxvd2FibGUgTG9hZCAoRiknLCB2YWx1ZTogZm10Rm9yY2UoRmFsbG93KSwgaGlnaGxpZ2h0OiB0cnVlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0FsbG93YWJsZSBFbG9uZ2F0aW9uICjOlEwpJywgdmFsdWU6IGZtdExlbihkTGFsbG93KSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdDcm9zcy1TZWN0aW9uYWwgQXJlYSAoQSknLCB2YWx1ZTogZm10QXJlYShpbnAuQSksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQ3VycmVudCBMb2FkIChpZiBlbnRlcmVkKScsIHZhbHVlOiBmbXRGb3JjZShpbnAuRiksIGhpZ2hsaWdodDogZmFsc2UgfQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIGlmIChpbnAuRiA+IEZhbGxvdykgd2FybmluZ3MucHVzaCgnQXBwbGllZCBsb2FkIGV4Y2VlZHMgYWxsb3dhYmxlIGxvYWQgZm9yIHRoZSBzcGVjaWZpZWQgZWxvbmdhdGlvbiBsaW1pdC4nKTsNCiAgICAgICAgICAgIHZpekRhdGEgPSB7IGRMOiBkTGFsbG93LCBMMDogaW5wLkwwLCBtb2RlLCBpbnAsIEY6IEZhbGxvdyB9Ow0KICAgICAgICAgICAgc2V0RGVmb3JtTm90ZSgnUmV2ZXJzZSBjYWxjdWxhdGlvbjogRmFsbG93ID0gQUXOlExhbGxvdyAvIEwuJyk7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ3JlcXVpcmVkTGVuZ3RoJykgew0KICAgICAgICAgICAgbGV0IGRMID0gaW5wLmRMOw0KICAgICAgICAgICAgaWYgKGRMID09IG51bGwgJiYgaW5wLmFsbG93REwgIT0gbnVsbCkgZEwgPSBpbnAuYWxsb3dETDsNCiAgICAgICAgICAgIGlmIChkTCA9PSBudWxsIHx8IGRMIDw9IDApIHsgZXJyb3JzLnB1c2goJ1Byb3ZpZGUgZWxvbmdhdGlvbiBmb3IgcmV2ZXJzZSBsZW5ndGggY2FsY3VsYXRpb24uJyk7IHNob3dFcnJvcnMoZXJyb3JzKTsgc2hvd1Jlc3VsdHNQYW5lbCgpOyByZXR1cm47IH0NCiAgICAgICAgICAgIGNvbnN0IExyZXEgPSBpbnAuQSAqIGlucC5FICogMTAwMCAqIGRMIC8gaW5wLkY7DQogICAgICAgICAgICByZXN1bHRzID0gWw0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdSZXF1aXJlZCBPcmlnaW5hbCBMZW5ndGggKEwpJywgdmFsdWU6IGZtdExlbihMcmVxKSwgaGlnaGxpZ2h0OiB0cnVlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0Vsb25nYXRpb24gKM6UTCknLCB2YWx1ZTogZm10TGVuKGRMKSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdDcm9zcy1TZWN0aW9uYWwgQXJlYSAoQSknLCB2YWx1ZTogZm10QXJlYShpbnAuQSksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQXBwbGllZCBMb2FkIChGKScsIHZhbHVlOiBmbXRGb3JjZShpbnAuRiksIGhpZ2hsaWdodDogZmFsc2UgfQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIHZpekRhdGEgPSB7IGRMLCBMMDogTHJlcSwgbW9kZSwgaW5wIH07DQogICAgICAgICAgICBzZXREZWZvcm1Ob3RlKCdSZXZlcnNlIGNhbGN1bGF0aW9uOiBMID0gQUXOlEwgLyBGLicpOw0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdjb21wYXJpc29uJykgew0KICAgICAgICAgICAgcnVuQ29tcGFyaXNvbihpbnAsIHdhcm5pbmdzKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnbXVsdGlTZWdtZW50Jykgew0KICAgICAgICAgICAgcnVuTXVsdGlT\",\n    \"ZWdtZW50KHdhcm5pbmdzKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAndGhlcm1hbCcpIHsNCiAgICAgICAgICAgIGNvbnN0IEwwID0gaW5wLkwwOw0KICAgICAgICAgICAgY29uc3QgZEx0aGVybWFsID0gaW5wLmFscGhhICogTDAgKiBpbnAuZFQ7DQogICAgICAgICAgICBsZXQgZExtZWNoID0gMDsNCiAgICAgICAgICAgIGlmIChpbnAuaW5jbHVkZU1lY2hhbmljYWwpIGRMbWVjaCA9IGlucC5GICogTDAgLyAoaW5wLkEgKiBpbnAuRSAqIDEwMDApOw0KICAgICAgICAgICAgY29uc3QgZEx0b3RhbCA9IGRMbWVjaCArIGRMdGhlcm1hbDsNCiAgICAgICAgICAgIGNvbnN0IExmID0gTDAgKyBkTHRvdGFsOw0KICAgICAgICAgICAgcmVzdWx0cyA9IFsNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnT3JpZ2luYWwgTGVuZ3RoIChM4oKAKScsIHZhbHVlOiBmbXRMZW4oTDApLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ1RoZXJtYWwgRWxvbmdhdGlvbiAozpRMdGgpJywgdmFsdWU6IGZtdExlbihkTHRoZXJtYWwpLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgaWYgKGlucC5pbmNsdWRlTWVjaGFuaWNhbCkgcmVzdWx0cy5wdXNoKHsgbGFiZWw6ICdNZWNoYW5pY2FsIEVsb25nYXRpb24gKM6UTG0pJywgdmFsdWU6IGZtdExlbihkTG1lY2gpLCBoaWdobGlnaHQ6IGZhbHNlIH0pOw0KICAgICAgICAgICAgcmVzdWx0cy5wdXNoKA0KICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdUb3RhbCBFbG9uZ2F0aW9uICjOlEwpJywgdmFsdWU6IGZtdExlbihkTHRvdGFsKSwgaGlnaGxpZ2h0OiB0cnVlIH0sDQogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0ZpbmFsIExlbmd0aCAoTGYpJywgdmFsdWU6IGZtdExlbihMZiksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVG90YWwgU3RyYWluICjOtSknLCB2YWx1ZTogZm9ybWF0TnVtKGRMdG90YWwgLyBMMCwgNiksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnUGVyY2VudGFnZSBFbG9uZ2F0aW9uJywgdmFsdWU6IGZvcm1hdE51bShkTHRvdGFsIC8gTDAgKiAxMDAsIDQpICsgJyAlJywgaGlnaGxpZ2h0OiBmYWxzZSB9DQogICAgICAgICAgICApOw0KICAgICAgICAgICAgdml6RGF0YSA9IHsgTDAsIGRMOiBkTHRvdGFsLCBMZiwgc3RyYWluOiBkTHRvdGFsIC8gTDAsIG1vZGUsIGlucCB9Ow0KICAgICAgICAgICAgc2V0RGVmb3JtTm90ZShpbnAuaW5jbHVkZU1lY2hhbmljYWwNCiAgICAgICAgICAgICAgICA\/ICdDb21iaW5lZCBtZWNoYW5pY2FsIGFuZCB0aGVybWFsIGZyZWUgZXhwYW5zaW9uOiDOlEx0b3RhbCA9IM6UTG1lY2hhbmljYWwgKyDOlEx0aGVybWFsLicNCiAgICAgICAgICAgICAgICA6ICdGcmVlIHRoZXJtYWwgZXhwYW5zaW9uOiDOlEx0aGVybWFsID0gzrFMzpRULiBSZXN0cmFpbmVkIGV4cGFuc2lvbiByZXF1aXJlcyB0aGVybWFsIHN0cmVzcyBhbmFseXNpcy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJlbmRlclJlc3VsdHMocmVzdWx0cyk7DQogICAgICAgIHVwZGF0ZVN0YXR1c0JhZGdlKGNsYXNzaWZpY2F0aW9uLCBtb2RlKTsNCiAgICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCkgc2hvd1dhcm5pbmdzKHdhcm5pbmdzKTsNCiAgICAgICAgc2hvd1JlY29tbWVuZGF0aW9ucyhtb2RlLCB2aXpEYXRhKTsNCiAgICAgICAgZHJhd1Zpc3VhbGl6YXRpb25zKHZpekRhdGEpOw0KICAgICAgICAkKCdjb21wYXJpc29uUmVzdWx0cycpLmNsYXNzTGlzdC5hZGQoJ21lYy1oaWRkZW4nKTsNCiAgICAgICAgJCgnY29tcGFyaXNvblZpeicpLmNsYXNzTGlzdC5hZGQoJ21lYy1oaWRkZW4nKTsNCiAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJ1aWxkU3RhbmRhcmRSZXN1bHRzKHIsIGlucCkgew0KICAgICAgICByZXR1cm4gWw0KICAgICAgICAgICAgeyBsYWJlbDogJ09yaWdpbmFsIExlbmd0aCAoTOKCgCknLCB2YWx1ZTogZm10TGVuKHIuTDApLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICB7IGxhYmVsOiAnRmluYWwgTGVuZ3RoIChMZiknLCB2YWx1ZTogZm10TGVuKHIuTGYpLCBoaWdobGlnaHQ6IGZhbHNlIH0sDQogICAgICAgICAgICB7IGxhYmVsOiAnQWJzb2x1dGUgRWxvbmdhdGlvbiAozpRMKScsIHZhbHVlOiBmbXRMZW4oci5kTCksIGhpZ2hsaWdodDogdHJ1ZSB9LA0KICAgICAgICAgICAgeyBsYWJlbDogJ0VuZ2luZWVyaW5nIFN0cmFpbiAozrUpJywgdmFsdWU6IGZvcm1hdE51bShyLnN0cmFpbiwgNiksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgIHsgbGFiZWw6ICdQZXJjZW50YWdlIEVsb25nYXRpb24nLCB2YWx1ZTogZm9ybWF0TnVtKHIucGN0LCA0KSArICcgJScsIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgIHsgbGFiZWw6ICdNaWNyb3N0cmFpbiAozrzOtSknLCB2YWx1ZTogZm9ybWF0TnVtKHIubWljcm8sIDEpICsgJyDOvM61JywgaGlnaGxpZ2h0OiBmYWxzZSB9DQogICAgICAgIF07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYnVpbGRFbGFzdGljUmVzdWx0cyhyLCBpbnApIHsNCiAgICAgICAgY29uc3QgaXRlbXMgPSBidWlsZFN0YW5kYXJkUmVzdWx0cyhyLCBpbnApOw0KICAgICAgICBpdGVtcy5wdXNoKA0KICAgICAgICAgICAgeyBsYWJlbDogJ0Nyb3NzLVNlY3Rpb25hbCBBcmVhIChBKScsIHZhbHVlOiBmbXRBcmVhKHIuQSksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgIHsgbGFiZWw6ICdBeGlhbCBTdHJlc3MgKM+DKScsIHZhbHVlOiBmbXRTdHJlc3Moci5zaWdtYSksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgIHsgbGFiZWw6ICdBcHBsaWVkIExvYWQgKEYpJywgdmFsdWU6IGZtdEZvcmNlKHIuRiksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgIHsgbGFiZWw6ICJZb3VuZydzIE1vZHVsdXMgKEUpIiwgdmFsdWU6IGZvcm1hdE51bShDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwoci5FLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyksIDEpICsgJyAnICsgKHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnKSwgaGlnaGxpZ2h0OiBmYWxzZSB9DQogICAgICAgICk7DQogICAgICAgIGlmIChpbnAuU3kgPiAwKSB7DQogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdZaWVsZCBVdGlsaXphdGlvbiAoz4MvU3kpJywgdmFsdWU6IGZvcm1hdE51bShyLnNpZ21hIC8gaW5wLlN5ICogMTAwLCAxKSArICcgJScsIGhpZ2hsaWdodDogZmFsc2UgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGl0ZW1zOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJ1bkNvbXBhcmlzb24oaW5wLCB3YXJuaW5ncykgew0KICAgICAgICBjb25zdCBMMCA9IGlucC5MMDsNCiAgICAgICAgY29uc3QgQSA9IGlucC5BOw0KICAgICAgICBjb25zdCBGID0gaW5wLkY7DQogICAgICAgIGNvbnN0IHJlZklkeCA9IHBhcnNlSW50KCQoJ3JlZk1hdGVyaWFsJykudmFsdWUsIDEwKTsNCiAgICAgICAgY29uc3Qgcm93cyA9ICRhbGwoJy5tZWMtbWF0ZXJpYWwtcm93Jyk7DQogICAgICAgIGNvbnN0IG1hdGVyaWFscyA9IFtdOw0KDQogICAgICAgIHJvd3MuZm9yRWFjaCgocm93LCBpKSA9PiB7DQogICAgICAgICAgICBjb25zdCBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChwYXJzZUZsb2F0KHJvdy5xdWVyeVNlbGVjdG9yKCcubWVjLWNtcC1FJykudmFsdWUpIHx8IDAsICdHUGEnKTsNCiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSByb3cucXVlcnlTZWxlY3RvcignLm1lYy1jbXAtbmFtZScpLnZhbHVlIHx8ICgnTWF0ZXJpYWwgJyArIChpICsgMSkpOw0KICAgICAgICAgICAgaWYgKEUgPD0gMCkgeyB3YXJuaW5ncy5wdXNoKG5hbWUgKyAnOiBZb3VuZ1wncyBtb2R1bHVzIG11c3QgYmUgcG9zaXRpdmUuJyk7IHJldHVybjsgfQ0KICAgICAgICAgICAgY29uc3QgZEwgPSBGICogTDAgLyAoQSAqIEUgKiAxMDAwKTsNCiAgICAgICAgICAgIGNvbnN0IHN0cmFpbiA9IEwwID4gMCA\/IGRMIC8gTDAgOiAwOw0KICAgICAgICAgICAgY29uc3QgTGYgPSBMMCArIGRMOw0KICAgICAgICAgICAgbWF0ZXJpYWxzLnB1c2goeyBuYW1lLCBFLCBkTCwgc3RyYWluLCBMZiwgcGN0OiBzdHJhaW4gKiAxMDAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChtYXRlcmlhbHMubGVuZ3RoIDwgMikgew0KICAgICAgICAgICAgc2hvd0Vycm9ycyhbJ0F0IGxlYXN0IHR3byB2YWxpZCBtYXRlcmlhbHMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb24uJ10pOw0KICAgICAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgcmVmID0gbWF0ZXJpYWxzW3JlZklkeF0gfHwgbWF0ZXJpYWxzWzBdOw0KICAgICAgICBtYXRlcmlhbHMuZm9y\",\n    \"RWFjaCgobSkgPT4gew0KICAgICAgICAgICAgbS5yZWxQY3QgPSByZWYuZEwgPiAwID8gbS5kTCAvIHJlZi5kTCAqIDEwMCA6IDA7DQogICAgICAgICAgICBtLmlzUmVmID0gbSA9PT0gcmVmOw0KICAgICAgICB9KTsNCg0KICAgICAgICBjb25zdCByZXN1bHRzID0gWw0KICAgICAgICAgICAgeyBsYWJlbDogJ1NoYXJlZCBMZW5ndGggKEzigoApJywgdmFsdWU6IGZtdExlbihMMCksIGhpZ2hsaWdodDogZmFsc2UgfSwNCiAgICAgICAgICAgIHsgbGFiZWw6ICdTaGFyZWQgQXJlYSAoQSknLCB2YWx1ZTogZm10QXJlYShBKSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgeyBsYWJlbDogJ1NoYXJlZCBMb2FkIChGKScsIHZhbHVlOiBmbXRGb3JjZShGKSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBNYXRlcmlhbCcsIHZhbHVlOiByZWYubmFtZSwgaGlnaGxpZ2h0OiB0cnVlIH0NCiAgICAgICAgXTsNCiAgICAgICAgcmVuZGVyUmVzdWx0cyhyZXN1bHRzKTsNCg0KICAgICAgICBsZXQgdGFibGVIdG1sID0gYDxkaXYgY2xhc3M9Im1lYy1jb21wYXJpc29uLXRhYmxlLXdyYXAiPjx0YWJsZSBjbGFzcz0ibWVjLWNvbXBhcmlzb24tdGFibGUiPg0KICAgICAgICAgICAgPHRoZWFkPjx0cj48dGg+TWF0ZXJpYWw8L3RoPjx0aD5FICgke3VuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAna3NpJyA6ICdHUGEnfSk8L3RoPjx0aD7OlEw8L3RoPjx0aD7OtTwvdGg+PHRoPkxmPC90aD48dGg+UmVsYXRpdmUgzpRMICglKTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT5gOw0KICAgICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobSkgPT4gew0KICAgICAgICAgICAgdGFibGVIdG1sICs9IGA8dHIgY2xhc3M9IiR7bS5pc1JlZiA\/ICdtZWMtcmVmLXJvdycgOiAnJ30iPg0KICAgICAgICAgICAgICAgIDx0ZD4ke20ubmFtZX0ke20uaXNSZWYgPyAnIOKYhScgOiAnJ308L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD4ke2Zvcm1hdE51bShDT05WLm1vZHVsdXNGcm9tSW50ZXJuYWwobS5FLCB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2tzaScgOiAnR1BhJyksIDEpfTwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPiR7Zm10TGVuKG0uZEwpfTwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPiR7Zm9ybWF0TnVtKG0uc3RyYWluLCA2KX08L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD4ke2ZtdExlbihtLkxmKX08L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD4ke2Zvcm1hdE51bShtLnJlbFBjdCwgMSl9ICU8L3RkPg0KICAgICAgICAgICAgPC90cj5gOw0KICAgICAgICB9KTsNCiAgICAgICAgdGFibGVIdG1sICs9ICc8L3Rib2R5PjwvdGFibGU+PC9kaXY+JzsNCg0KICAgICAgICBsZXQgYmFyc0h0bWwgPSAnJzsNCiAgICAgICAgY29uc3QgbWF4REwgPSBNYXRoLm1heCguLi5tYXRlcmlhbHMubWFwKChtKSA9PiBtLmRMKSk7DQogICAgICAgIG1hdGVyaWFscy5mb3JFYWNoKChtKSA9PiB7DQogICAgICAgICAgICBjb25zdCBwY3QgPSBtYXhETCA+IDAgPyBtLmRMIC8gbWF4REwgKiAxMDAgOiAwOw0KICAgICAgICAgICAgYmFyc0h0bWwgKz0gYDxkaXYgY2xhc3M9Im1lYy1iYXItcm93Ij4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVjLWJhci1sYWJlbCI+JHttLm5hbWV9PC9zcGFuPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lYy1iYXItdHJhY2siPjxkaXYgY2xhc3M9Im1lYy1iYXItZmlsbCR7bS5pc1JlZiA\/ICcgbWVjLXJlZicgOiAnJ30iIHN0eWxlPSJ3aWR0aDoke3BjdH0lIj48L2Rpdj48L2Rpdj4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVjLWJhci12YWx1ZSI+JHtmbXRMZW4obS5kTCl9PC9zcGFuPg0KICAgICAgICAgICAgPC9kaXY+YDsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgnY29tcGFyaXNvblJlc3VsdHMnKS5pbm5lckhUTUwgPSB0YWJsZUh0bWw7DQogICAgICAgICQoJ2NvbXBhcmlzb25SZXN1bHRzJykuY2xhc3NMaXN0LnJlbW92ZSgnbWVjLWhpZGRlbicpOw0KICAgICAgICAkKCdjb21wYXJpc29uQmFycycpLmlubmVySFRNTCA9IGJhcnNIdG1sOw0KICAgICAgICAkKCdjb21wYXJpc29uVml6JykuY2xhc3NMaXN0LnJlbW92ZSgnbWVjLWhpZGRlbicpOw0KDQogICAgICAgIHVwZGF0ZVN0YXR1c0JhZGdlKG51bGwsICdjb21wYXJpc29uJyk7DQogICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgpIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgIHNob3dSZWNvbW1lbmRhdGlvbnMoJ2NvbXBhcmlzb24nLCB7IG1hdGVyaWFscywgTDAsIEYsIEEgfSk7DQogICAgICAgIGRyYXdWaXN1YWxpemF0aW9ucyh7IEwwLCBkTDogcmVmLmRMLCBzdHJhaW46IHJlZi5kTCAvIEwwLCBtb2RlOiAnY29tcGFyaXNvbicsIGlucCwgbWF0ZXJpYWxzIH0pOw0KICAgICAgICBzZXREZWZvcm1Ob3RlKCdNYXRlcmlhbCBjb21wYXJpc29uIHVuZGVyIGlkZW50aWNhbCBnZW9tZXRyeSBhbmQgbG9hZGluZy4gUmVsYXRpdmUgZWxvbmdhdGlvbiA9IM6UTG1hdGVyaWFsIC8gzpRMcmVmZXJlbmNlIMOXIDEwMCUuJyk7DQogICAgICAgIHNob3dSZXN1bHRzUGFuZWwoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBydW5NdWx0aVNlZ21lbnQod2FybmluZ3MpIHsNCiAgICAgICAgY29uc3QgYmxvY2tzID0gJGFsbCgnLm1lYy1zZWdtZW50LWJsb2NrJyk7DQogICAgICAgIGxldCBkTHRvdGFsID0gMDsNCiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTsNCg0KICAgICAgICBibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGkpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IEwgPSBwYXJzZUZsb2F0KGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZWMtc2VnLUwnKS52YWx1ZSkgfHwgMDsNCiAgICAgICAgICAgIGNvbnN0IEEgPSBwYXJzZUZsb2F0KGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZWMtc2VnLUEnKS52YWx1ZSkgfHwgMDsNCiAgICAgICAgICAgIGNvbnN0IEYgPSBDT05WLmZvcmNlVG9JbnRlcm5hbChwYXJzZUZsb2F0KGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZWMtc2VnLUYnKS52YWx1ZSkgfHwgMCwgJ2tOJyk7DQogICAgICAgICAgICBjb25zdCBFID0gQ09OVi5tb2R1bHVzVG9JbnRlcm5hbChwYXJzZUZsb2F0KGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZWMtc2VnLUUnKS52YWx1ZSkgfHwgMCwgJ0dQYScpOw0KICAgICAgICAgICAgaWYgKEwgPD0gMCB8fCBBIDw9IDAgfHwgRSA8PSAwKSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnU2VnbWVudCAnICsgKGkgKyAxKSArICc6IGxlbmd0aCwgYXJlYSwgYW5kIG1vZHVsdXMgbXVzdCBiZSBwb3NpdGl2ZS4nKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCBkTGkgPSBGICogTCAvIChBICogRSAqIDEwMDApOw0KICAgICAgICAgICAgZEx0b3RhbCArPSBkTGk7DQogICAgICAgICAgICBzZWdtZW50cy5wdXNoKHsgaTogaSArIDEsIEwsIEEsIEYsIEUsIGRMaSB9KTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgc2hvd0Vycm9ycyhbJ05vIHZhbGlkIHNlZ21lbnRzLiBDaGVjayBpbnB1dHMuJ10pOw0KICAgICAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgTHRvdGFsID0gc2VnbWVudHMucmVkdWNlKChzLCBzZWcpID0+IHMgKyBzZWcuTCwgMCk7DQogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbDQogICAgICAgICAgICB7IGxhYmVsOiAnVG90YWwgRWxvbmdhdGlvbiAozpRMdG90YWwpJywgdmFsdWU6IGZtdExlbihkTHRvdGFsKSwgaGlnaGxpZ2h0OiB0cnVlIH0sDQogICAgICAgICAgICB7IGxhYmVsOiAnVG90YWwgTWVtYmVyIExlbmd0aCcsIHZhbHVlOiBmbXRMZW4oTHRvdGFsKSwgaGlnaGxpZ2h0OiBmYWxzZSB9LA0KICAgICAgICAgICAgeyBsYWJlbDogJ051bWJlciBvZiBTZWdtZW50cycsIHZhbHVlOiBTdHJpbmcoc2VnbWVudHMubGVuZ3RoKSwgaGlnaGxpZ2h0OiBmYWxzZSB9DQogICAgICAgIF07DQogICAgICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZykgPT4gew0KICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgbGFiZWw6ICdTZWdtZW50ICcgKyBzZWcuaSArICcgzpRMJywgdmFsdWU6IGZtdExlbihzZWcuZExpKSwgaGlnaGxpZ2h0OiBmYWxzZSB9KTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmVuZGVyUmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgdXBkYXRlU3RhdHVzQmFkZ2UobnVsbCwgJ211bHRpU2VnbWVudCcpOw0KICAgICAgICBpZiAod2FybmluZ3MubGVuZ3RoKSBzaG93V2FybmluZ3Mod2FybmluZ3MpOw0KICAgICAgICBzaG93UmVjb21tZW5kYXRpb25zKCdtdWx0aVNlZ21lbnQnLCB7IGRMOiBkTHRvdGFsLCBMMDogTHRvdGFsIH0pOw0KICAgICAgICBkcmF3VmlzdWFsaXphdGlvbnMoeyBMMDogTHRvdGFsLCBkTDogZEx0b3RhbCwgc3RyYWlu\",\n    \"OiBMdG90YWwgPiAwID8gZEx0b3RhbCAvIEx0b3RhbCA6IDAsIG1vZGU6ICdtdWx0aVNlZ21lbnQnIH0pOw0KICAgICAgICBzZXREZWZvcm1Ob3RlKCdNdWx0aS1zZWdtZW50IGFuYWx5c2lzOiDOlEx0b3RhbCA9IM6jIEZpTGkgLyAoQWlFaSkuIEludGVybmFsIGF4aWFsIGZvcmNlIG1heSBkaWZmZXIgaW4gZWFjaCBzZWdtZW50LicpOw0KICAgICAgICAkKCdjb21wYXJpc29uUmVzdWx0cycpLmNsYXNzTGlzdC5hZGQoJ21lYy1oaWRkZW4nKTsNCiAgICAgICAgJCgnY29tcGFyaXNvblZpeicpLmNsYXNzTGlzdC5hZGQoJ21lYy1oaWRkZW4nKTsNCiAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlbmRlclJlc3VsdHMoaXRlbXMpIHsNCiAgICAgICAgJCgncmVzdWx0c0dyaWQnKS5pbm5lckhUTUwgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGANCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lYy1yZXN1bHQtaXRlbSR7aXRlbS5oaWdobGlnaHQgPyAnIG1lYy1yZXN1bHQtaGlnaGxpZ2h0JyA6ICcnfSI+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lYy1yZXN1bHQtbGFiZWwiPiR7aXRlbS5sYWJlbH08L3NwYW4+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lYy1yZXN1bHQtdmFsdWUiPiR7aXRlbS52YWx1ZX08L3NwYW4+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgYCkuam9pbignJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzQmFkZ2UoY2xhc3NpZmljYXRpb24sIG1vZGUpIHsNCiAgICAgICAgY29uc3QgYmFkZ2UgPSAkKCdzdGF0dXNCYWRnZScpOw0KICAgICAgICBpZiAoY2xhc3NpZmljYXRpb24pIHsNCiAgICAgICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gY2xhc3NpZmljYXRpb24ubGFiZWw7DQogICAgICAgICAgICBiYWRnZS5jbGFzc05hbWUgPSAnbWVjLXN0YXR1cy1iYWRnZSBtZWMtc3RhdHVzLScgKyBjbGFzc2lmaWNhdGlvbi5sZXZlbDsNCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAndGVuc2lsZVRlc3QnKSB7DQogICAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICdEdWN0aWxpdHkgUmVzdWx0JzsNCiAgICAgICAgICAgIGJhZGdlLmNsYXNzTmFtZSA9ICdtZWMtc3RhdHVzLWJhZGdlIG1lYy1zdGF0dXMtbmV1dHJhbCc7DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2NvbXBhcmlzb24nKSB7DQogICAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICdDb21wYXJpc29uIENvbXBsZXRlJzsNCiAgICAgICAgICAgIGJhZGdlLmNsYXNzTmFtZSA9ICdtZWMtc3RhdHVzLWJhZGdlIG1lYy1zdGF0dXMtc2FmZSc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICdDYWxjdWxhdGVkJzsNCiAgICAgICAgICAgIGJhZGdlLmNsYXNzTmFtZSA9ICdtZWMtc3RhdHVzLWJhZGdlIG1lYy1zdGF0dXMtc2FmZSc7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVjb21tZW5kYXRpb25zKG1vZGUsIGRhdGEpIHsNCiAgICAgICAgY29uc3QgcmVjID0gW107DQogICAgICAgIGlmIChtb2RlID09PSAnZWxhc3RpYycgfHwgbW9kZSA9PT0gJ3JlcXVpcmVkQXJlYScpIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdJbmNyZWFzZSBjcm9zcy1zZWN0aW9uYWwgYXJlYSB0byByZWR1Y2UgYXhpYWwgZWxvbmdhdGlvbi4nKTsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdVc2UgYSBtYXRlcmlhbCB3aXRoIGEgaGlnaGVyIFlvdW5nXCdzIG1vZHVsdXMgdG8gcmVkdWNlIGVsYXN0aWMgZGVmb3JtYXRpb24uJyk7DQogICAgICAgICAgICByZWMucHVzaCgnUmVkdWNlIG1lbWJlciBsZW5ndGggd2hlcmUgcG9zc2libGUuJyk7DQogICAgICAgICAgICByZWMucHVzaCgnUmVkdWNlIGFwcGxpZWQgYXhpYWwgbG9hZC4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobW9kZSA9PT0gJ2VsYXN0aWMnIHx8IG1vZGUgPT09ICdjb21wYXJpc29uJyB8fCBtb2RlID09PSAnbXVsdGlTZWdtZW50Jykgew0KICAgICAgICAgICAgcmVjLnB1c2goJ0NoZWNrIHdoZXRoZXIgdGhlIGNhbGN1bGF0ZWQgc3RyZXNzIGV4Y2VlZHMgdGhlIGVsYXN0aWMgcmFuZ2UuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKG1vZGUgPT09ICd0aGVybWFsJykgew0KICAgICAgICAgICAgcmVjLnB1c2goJ0NvbnNpZGVyIHRlbXBlcmF0dXJlIGVmZmVjdHMgd2hlbiBvcGVyYXRpbmcgYWNyb3NzIGxhcmdlIHRlbXBlcmF0dXJlIHJhbmdlcy4nKTsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdSZXN0cmFpbmVkIHRoZXJtYWwgZXhwYW5zaW9uIHJlcXVpcmVzIHRoZXJtYWwgc3RyZXNzIGFuYWx5c2lzIOKAlCBub3Qgc2ltcGxlIGZyZWUgZWxvbmdhdGlvbi4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobW9kZSA9PT0gJ3RlbnNpbGVUZXN0Jykgew0KICAgICAgICAgICAgcmVjLnB1c2goJ1VzZSBtZWFzdXJlZCB0ZW5zaWxlLXRlc3QgZWxvbmdhdGlvbiBmb3IgZHVjdGlsaXR5IGFzc2Vzc21lbnQgcmF0aGVyIHRoYW4gSG9va2VcJ3MgbGF3LicpOw0KICAgICAgICB9DQogICAgICAgIHJlYy5wdXNoKCdUaGUgZXF1YXRpb24gzpRMID0gRkwvKEFFKSBpcyB2YWxpZCBvbmx5IHdpdGhpbiB0aGUgbGluZWFyIGVsYXN0aWMgcmVnaW9uLicpOw0KICAgICAgICByZWMucHVzaCgnQ2hlY2sgc3RyZXNzIGNvbmNlbnRyYXRpb24sIGZhdGlndWUsIGNyZWVwLCBhbmQgam9pbnQgZmxleGliaWxpdHkgZm9yIGNyaXRpY2FsIGNvbXBvbmVudHMuJyk7DQogICAgICAgIGlmIChkYXRhLnN0cmFpbiAhPSBudWxsICYmIE1hdGguYWJzKGRhdGEuc3RyYWluKSA8IDAuMDAwMSkgew0KICAgICAgICAgICAgcmVjLnB1c2goJ1VzZSBtaWNyb3N0cmFpbiAozrzOtSkgZm9yIHZlcnkgc21hbGwgZWxhc3RpYyBkZWZvcm1hdGlvbnMuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBlbCA9ICQoJ3JlY29tbWVuZGF0aW9ucycpOw0KICAgICAgICBlbC5pbm5lckhUTUwgPSAnPGgzPkVuZ2luZWVyaW5nIFJlY29tbWVuZGF0aW9uczwvaDM+PHVsPicgKyByZWMubWFwKChyKSA9PiAnPGxpPicgKyByICsgJzwvbGk+Jykuam9pbignJykgKyAnPC91bD4nOw0KICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdtZWMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1Zpc3VhbGl6YXRpb25zKGRhdGEpIHsNCiAgICAgICAgZHJhd1NwZWNpbWVuKGRhdGEpOw0KICAgICAgICBkcmF3TG9hZERpYWdyYW0oZGF0YSk7DQogICAgICAgIGRyYXdTdHJlc3NTdHJhaW4oZGF0YSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1NwZWNpbWVuKGRhdGEpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgnc3BlY2ltZW5EaWFncmFtJyk7DQogICAgICAgIGlmICghc3ZnKSByZXR1cm47DQogICAgICAgIGNvbnN0IHN0cmFpbiA9IE1hdGguYWJzKGRhdGEuc3RyYWluID8\/IChkYXRhLkwwID4gMCA\/IGRhdGEuZEwgLyBkYXRhLkwwIDogMC4wMDAxKSk7DQogICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oc3RyYWluICogODAwLCAzNSk7DQogICAgICAgIGNvbnN0IG9yaWdXID0gMTAwLCBvcmlnSCA9IDIwOw0KICAgICAgICBjb25zdCBuZXdXID0gb3JpZ1cgKyBzY2FsZTsNCiAgICAgICAgY29uc3QgY3ggPSA0MCwgY3kgPSA2MDsNCg0KICAgICAgICBzdmcuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgPHJlY3QgeD0iJHtjeH0iIHk9IiR7Y3kgLSBvcmlnSCAvIDJ9IiB3aWR0aD0iJHtvcmlnV30iIGhlaWdodD0iJHtvcmlnSH0iIGZpbGw9IiNlY2YwZjEiIHN0cm9rZT0iIzFhNTI3NiIgc3Ryb2tlLXdpZHRoPSIyIiByeD0iMiIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCArIG9yaWdXIC8gMn0iIHk9IiR7Y3kgKyBvcmlnSCAvIDIgKyAxNn0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iIzVkNmQ3ZSI+TOKCgDwvdGV4dD4NCiAgICAgICAgICAgIDxyZWN0IHg9IiR7Y3ggKyAxMjB9IiB5PSIke2N5IC0gb3JpZ0ggLyAyfSIgd2lkdGg9IiR7bmV3V30iIGhlaWdodD0iJHtvcmlnSH0iIGZpbGw9IiNkNWY1ZTMiIHN0cm9rZT0iIzI3YWU2MCIgc3Ryb2tlLXdpZHRoPSIyIiByeD0iMiIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCArIDEyMCArIG5ld1cgLyAyfSIgeT0iJHtjeSArIG9yaWdIIC8gMiArIDE2fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj5MZjwvdGV4dD4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2N4ICsgb3JpZ1cgKyA1fSIgeTE9IiR7Y3kgLSAxNX0iIHgyPSIke2N4ICsgMTIwIC0gNX0iIHkyPSIke2N5IC0gMTV9IiBzdHJva2U9IiNlNjdlMjIiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoIyR7U1ZHX0lEfXNwZWMpIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIkeyhjeCArIG9yaWdXICsgY3ggKyAxMjApIC8gMn0iIHk9IiR7Y3kgLSAyMH0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQt\",\n    \"c2l6ZT0iOSIgZmlsbD0iI2U2N2UyMiI+zpRMPC90ZXh0Pg0KICAgICAgICAgICAgPGRlZnM+PG1hcmtlciBpZD0iJHtTVkdfSUR9c3BlYyIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgcmVmWD0iNSIgcmVmWT0iMyIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEw1LDMgTDAsNiIgZmlsbD0iI2U2N2UyMiIvPjwvbWFya2VyPjwvZGVmcz4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3TG9hZERpYWdyYW0oZGF0YSkgew0KICAgICAgICBjb25zdCBzdmcgPSAkKCdsb2FkRGlhZ3JhbScpOw0KICAgICAgICBpZiAoIXN2ZykgcmV0dXJuOw0KICAgICAgICBjb25zdCBjeCA9IDE1MCwgY3kgPSA2MCwgdyA9IDEyMCwgaCA9IDIyOw0KDQogICAgICAgIHN2Zy5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8cmVjdCB4PSIke2N4IC0gdyAvIDJ9IiB5PSIke2N5IC0gaCAvIDJ9IiB3aWR0aD0iJHt3fSIgaGVpZ2h0PSIke2h9IiBmaWxsPSIjZWNmMGYxIiBzdHJva2U9IiMxYTUyNzYiIHN0cm9rZS13aWR0aD0iMiIgcng9IjIiLz4NCiAgICAgICAgICAgIDxkZWZzPjxtYXJrZXIgaWQ9IiR7U1ZHX0lEfWxvYWQiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjgiIHJlZlg9IjYiIHJlZlk9IjMiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAsMCBMNiwzIEwwLDYiIGZpbGw9IiMyN2FlNjAiLz48L21hcmtlcj48L2RlZnM+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtjeCAtIHcgLyAyIC0gMjV9IiB5MT0iJHtjeX0iIHgyPSIke2N4IC0gdyAvIDJ9IiB5Mj0iJHtjeX0iIHN0cm9rZT0iIzI3YWU2MCIgc3Ryb2tlLXdpZHRoPSIyLjUiIG1hcmtlci1lbmQ9InVybCgjJHtTVkdfSUR9bG9hZCkiLz4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2N4ICsgdyAvIDIgKyAyNX0iIHkxPSIke2N5fSIgeDI9IiR7Y3ggKyB3IC8gMn0iIHkyPSIke2N5fSIgc3Ryb2tlPSIjMjdhZTYwIiBzdHJva2Utd2lkdGg9IjIuNSIgbWFya2VyLWVuZD0idXJsKCMke1NWR19JRH1sb2FkKSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtjeCAtIHcgLyAyIC0gMzB9IiB5PSIke2N5ICsgNH0iIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiMyN2FlNjAiPkY8L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIke2N4ICsgdyAvIDIgKyAzMH0iIHk9IiR7Y3kgKyA0fSIgdGV4dC1hbmNob3I9InN0YXJ0IiBmb250LXNpemU9IjEwIiBmaWxsPSIjMjdhZTYwIj5GPC90ZXh0Pg0KICAgICAgICAgICAgPGxpbmUgeDE9IiR7Y3h9IiB5MT0iJHtjeSArIGggLyAyICsgNX0iIHgyPSIke2N4fSIgeTI9IiR7Y3kgKyBoIC8gMiArIDI1fSIgc3Ryb2tlPSIjZTY3ZTIyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjJHtTVkdfSUR9ZGwpIi8+DQogICAgICAgICAgICA8ZGVmcz48bWFya2VyIGlkPSIke1NWR19JRH1kbCIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgcmVmWD0iMyIgcmVmWT0iNSIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEwzLDUgTDYsMCIgZmlsbD0iI2U2N2UyMiIvPjwvbWFya2VyPjwvZGVmcz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3ggKyA4fSIgeT0iJHtjeSArIGggLyAyICsgMjJ9IiBmb250LXNpemU9IjkiIGZpbGw9IiNlNjdlMjIiPs6UTDwvdGV4dD4NCiAgICAgICAgYDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3U3RyZXNzU3RyYWluKGRhdGEpIHsNCiAgICAgICAgY29uc3Qgc3ZnID0gJCgnc3RyZXNzU3RyYWluRGlhZ3JhbScpOw0KICAgICAgICBpZiAoIXN2ZykgcmV0dXJuOw0KICAgICAgICBjb25zdCBFID0gZGF0YS5FID8\/IChkYXRhLmlucCA\/IGRhdGEuaW5wLkUgOiAyMDApOw0KICAgICAgICBjb25zdCBTeSA9IGRhdGEuU3kgPz8gMzU1Ow0KICAgICAgICBjb25zdCBzaWdtYSA9IGRhdGEuc2lnbWEgPz8gKGRhdGEuc3RyYWluICE9IG51bGwgPyBFICogMTAwMCAqIGRhdGEuc3RyYWluIDogMTAwKTsNCiAgICAgICAgY29uc3QgZVlpZWxkID0gU3kgLyAoRSAqIDEwMDApOw0KICAgICAgICBjb25zdCBlTWF4ID0gTWF0aC5tYXgoZVlpZWxkICogMS44LCBNYXRoLmFicyhkYXRhLnN0cmFpbiA\/PyAwLjAwMSkgKiAxLjUsIDAuMDA1KTsNCiAgICAgICAgY29uc3Qgc01heCA9IEUgKiAxMDAwICogZU1heDsNCiAgICAgICAgY29uc3QgVyA9IDQ4MCwgSCA9IDE0MCwgcGFkID0gNTA7DQogICAgICAgIGNvbnN0IHhTY2FsZSA9IChXIC0gcGFkKSAvIGVNYXg7DQogICAgICAgIGNvbnN0IHlTY2FsZSA9IChIIC0gcGFkKSAvIHNNYXg7DQogICAgICAgIGNvbnN0IGVsYXN0aWNFbmRYID0gcGFkICsgZVlpZWxkICogeFNjYWxlOw0KICAgICAgICBjb25zdCBlbGFzdGljRW5kWSA9IEggLSBwYWQgLSBTeSAqIHlTY2FsZTsNCiAgICAgICAgY29uc3QgY3VyWCA9IHBhZCArIE1hdGguYWJzKGRhdGEuc3RyYWluID8\/IDAuMDAxKSAqIHhTY2FsZTsNCiAgICAgICAgY29uc3QgY3VyWSA9IEggLSBwYWQgLSBNYXRoLm1pbihzaWdtYSwgc01heCkgKiB5U2NhbGU7DQoNCiAgICAgICAgc3ZnLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxsaW5lIHgxPSIke3BhZH0iIHkxPSIke0ggLSBwYWR9IiB4Mj0iJHtXfSIgeTI9IiR7SCAtIHBhZH0iIHN0cm9rZT0iIzJjM2U1MCIgc3Ryb2tlLXdpZHRoPSIxIi8+DQogICAgICAgICAgICA8bGluZSB4MT0iJHtwYWR9IiB5MT0iJHtIIC0gcGFkfSIgeDI9IiR7cGFkfSIgeTI9IjEwIiBzdHJva2U9IiMyYzNlNTAiIHN0cm9rZS13aWR0aD0iMSIvPg0KICAgICAgICAgICAgPHRleHQgeD0iJHtXIC8gMn0iIHk9IiR7SCAtIDV9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjNWQ2ZDdlIj5TdHJhaW4gzrU8L3RleHQ+DQogICAgICAgICAgICA8dGV4dCB4PSIxMiIgeT0iJHtIIC8gMn0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiM1ZDZkN2UiIHRyYW5zZm9ybT0icm90YXRlKC05MCAxMiAke0ggLyAyfSkiPlN0cmVzcyDPgzwvdGV4dD4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke3BhZH0iIHkxPSIke0ggLSBwYWR9IiB4Mj0iJHtlbGFzdGljRW5kWH0iIHkyPSIke2VsYXN0aWNFbmRZfSIgc3Ryb2tlPSIjMjdhZTYwIiBzdHJva2Utd2lkdGg9IjIuNSIvPg0KICAgICAgICAgICAgPHJlY3QgeD0iJHtwYWR9IiB5PSIke2VsYXN0aWNFbmRZfSIgd2lkdGg9IiR7ZWxhc3RpY0VuZFggLSBwYWR9IiBoZWlnaHQ9IiR7SCAtIHBhZCAtIGVsYXN0aWNFbmRZfSIgZmlsbD0icmdiYSgzOSwxNzQsOTYsMC4xMikiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7cGFkICsgKGVsYXN0aWNFbmRYIC0gcGFkKSAvIDJ9IiB5PSIke2VsYXN0aWNFbmRZIC0gNX0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iIzI3YWU2MCI+RWxhc3RpYzwvdGV4dD4NCiAgICAgICAgICAgIDxsaW5lIHgxPSIke2VsYXN0aWNFbmRYfSIgeTE9IiR7ZWxhc3RpY0VuZFl9IiB4Mj0iJHtXIC0gMTB9IiB5Mj0iJHtlbGFzdGljRW5kWSAtIDI1fSIgc3Ryb2tlPSIjYzAzOTJiIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCwzIi8+DQogICAgICAgICAgICA8dGV4dCB4PSIke1cgLSA2MH0iIHk9IiR7ZWxhc3RpY0VuZFkgLSAzMH0iIGZvbnQtc2l6ZT0iOSIgZmlsbD0iI2MwMzkyYiI+UGxhc3RpYyBSZWdpb248L3RleHQ+DQogICAgICAgICAgICA8Y2lyY2xlIGN4PSIke2N1clh9IiBjeT0iJHtjdXJZfSIgcj0iNSIgZmlsbD0iI2U2N2UyMiIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEiLz4NCiAgICAgICAgICAgIDx0ZXh0IHg9IiR7Y3VyWCArIDh9IiB5PSIke2N1clkgLSA1fSIgZm9udC1zaXplPSI5IiBmaWxsPSIjZTY3ZTIyIj5DdXJyZW50PC90ZXh0Pg0KICAgICAgICBgOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZtdExlbih2KSB7DQogICAgICAgIGNvbnN0IHUgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luJyA6ICdtbSc7DQogICAgICAgIGNvbnN0IHZhbCA9IENPTlYubGVuZ3RoRnJvbUludGVybmFsKHYsIHUpOw0KICAgICAgICBpZiAoTWF0aC5hYnModmFsKSA8IDAuMDEgJiYgdmFsICE9PSAwKSB7DQogICAgICAgICAgICBjb25zdCB1bSA9IENPTlYubGVuZ3RoRnJvbUludGVybmFsKHYsICd1bScpOw0KICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE51bSh1bSwgMikgKyAnIM68bSc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZvcm1hdE51bSh2YWwsIDQpICsgJyAnICsgdTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmbXRBcmVhKHYpIHsNCiAgICAgICAgY29uc3QgdSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnaW4yJyA6ICdtbTInOw0KICAgICAgICByZXR1cm4gZm9ybWF0TnVtKENPTlYuYXJlYUZyb21JbnRlcm5hbCh2LCB1KSwgMykgKyAnICcgKyAodSA9PT0gJ2luMicgPyAnaW7CsicgOiAnbW3CsicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZtdEZvcmNl\",\n    \"KHYpIHsNCiAgICAgICAgY29uc3QgdSA9IHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAnbGJmJyA6ICdrTic7DQogICAgICAgIHJldHVybiBmb3JtYXROdW0oQ09OVi5mb3JjZUZyb21JbnRlcm5hbCh2LCB1KSwgMykgKyAnICcgKyB1Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZtdFN0cmVzcyh2KSB7DQogICAgICAgIGNvbnN0IHUgPSB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ3BzaScgOiAnTVBhJzsNCiAgICAgICAgcmV0dXJuIGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbCh2LCB1KSwgMikgKyAnICcgKyB1Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdE51bSh2LCBkZWMpIHsNCiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCAhaXNGaW5pdGUodikpIHJldHVybiAn4oCUJzsNCiAgICAgICAgaWYgKE1hdGguYWJzKHYpID49IDFlNiB8fCAoTWF0aC5hYnModikgPCAwLjAwMDEgJiYgdiAhPT0gMCkpIHJldHVybiB2LnRvRXhwb25lbnRpYWwoZGVjKTsNCiAgICAgICAgcmV0dXJuIHYudG9GaXhlZChkZWMpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dSZXN1bHRzUGFuZWwoKSB7DQogICAgICAgIHJlc3VsdHNQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCdtZWMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2V0RGVmb3JtTm90ZSh0ZXh0KSB7DQogICAgICAgIGNvbnN0IG5vdGUgPSAkKCdkZWZvcm1UeXBlTm90ZScpOw0KICAgICAgICBpZiAoIW5vdGUpIHJldHVybjsNCiAgICAgICAgaWYgKHRleHQpIHsNCiAgICAgICAgICAgIG5vdGUudGV4dENvbnRlbnQgPSB0ZXh0Ow0KICAgICAgICAgICAgbm90ZS5jbGFzc0xpc3QucmVtb3ZlKCdtZWMtaGlkZGVuJyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBub3RlLnRleHRDb250ZW50ID0gJyc7DQogICAgICAgICAgICBub3RlLmNsYXNzTGlzdC5hZGQoJ21lYy1oaWRkZW4nKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVSZXN1bHRzUGFuZWwoKSB7DQogICAgICAgIHJlc3VsdHNQYW5lbC5jbGFzc0xpc3QuYWRkKCdtZWMtaGlkZGVuJyk7DQogICAgICAgIGhpZGVNZXNzYWdlcygpOw0KICAgICAgICAkKCdyZWNvbW1lbmRhdGlvbnMnKS5jbGFzc0xpc3QuYWRkKCdtZWMtaGlkZGVuJyk7DQogICAgICAgIHNldERlZm9ybU5vdGUoJycpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVNZXNzYWdlcygpIHsNCiAgICAgICAgJCgnZXJyb3JCb3gnKS5jbGFzc0xpc3QuYWRkKCdtZWMtaGlkZGVuJyk7DQogICAgICAgICQoJ3dhcm5pbmdCb3gnKS5jbGFzc0xpc3QuYWRkKCdtZWMtaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd0Vycm9ycyhlcnJvcnMpIHsNCiAgICAgICAgJCgnZXJyb3JCb3gnKS5pbm5lckhUTUwgPSAnPHN0cm9uZz5QbGVhc2UgY29ycmVjdCB0aGUgZm9sbG93aW5nOjwvc3Ryb25nPjx1bD4nICsNCiAgICAgICAgICAgIGVycm9ycy5tYXAoKGUpID0+ICc8bGk+JyArIGUgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPic7DQogICAgICAgICQoJ2Vycm9yQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnbWVjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNob3dXYXJuaW5ncyh3YXJuaW5ncykgew0KICAgICAgICAkKCd3YXJuaW5nQm94JykuaW5uZXJIVE1MID0gJzxzdHJvbmc+V2FybmluZ3M6PC9zdHJvbmc+PHVsPicgKw0KICAgICAgICAgICAgd2FybmluZ3MubWFwKCh3KSA9PiAnPGxpPicgKyB3ICsgJzwvbGk+Jykuam9pbignJykgKyAnPC91bD4nOw0KICAgICAgICAkKCd3YXJuaW5nQm94JykuY2xhc3NMaXN0LnJlbW92ZSgnbWVjLWhpZGRlbicpOw0KICAgIH0NCg0KICAgIGluaXQoKTsNCn0pKCk7DQo=\"];\n    var bin=atob(p.join(''));\n    var bytes=new Uint8Array(bin.length);\n    for(var i=0;i<bin.length;i++){bytes[i]=bin.charCodeAt(i);}\n    var src=new TextDecoder('utf-8').decode(bytes);\n    (new Function(src))();\n  }catch(e){\n    console.error('Material Elongation Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Material Elongation Calculator is a practical engineering tool designed to calculate material elongation, percentage elongation, engineering strain, and elastic deformation under axial loading. By&#8230;<\/p>","protected":false},"author":2,"featured_media":24814,"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":[8680,8683,8681,8682],"class_list":["post-24813","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-elastic-deformation","tag-material-elongation","tag-tensile-strain","tag-tensile-testing","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Material-Elongation-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24813","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/comments?post=24813"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24813\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media\/24814"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media?parent=24813"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/categories?post=24813"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/tags?post=24813"}],"curies":[{"name":"\u0648\u0648\u0631\u062f\u0628\u0631\u064a\u0633","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}