{"id":24696,"date":"2026-08-18T08:29:26","date_gmt":"2026-08-18T08:29:26","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24696"},"modified":"2026-08-18T08:29:29","modified_gmt":"2026-08-18T08:29:29","slug":"multi-bolt-joint-load-distribution-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ar\/multi-bolt-joint-load-distribution-calculator\/","title":{"rendered":"Multi-Bolt Joint Load Distribution Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Multi-Bolt Joint Load Distribution Calculator<\/strong> is a practical engineering tool designed to analyze how external loads are distributed among multiple bolts in a bolted connection. By considering bolt number, arrangement, load direction, bolt dimensions, material properties, and applied forces, it helps engineers calculate individual bolt loads, stress levels, and connection safety factors. The Multi-Bolt Joint Load Distribution Calculator supports mechanical design, structural verification, and fastener selection while reducing the risks of bolt overload, uneven load sharing, and joint failure.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <meta name=\"description\" content=\"Multi-Bolt Joint Load Distribution Calculator for engineers. Analyze bolt load sharing, individual tensile and shear forces, stress levels, and connection safety. Bolt Load Distribution Calculator, Multiple Bolt Connection Calculator, Bolt Group Analysis Calculator, and Fastener Load Sharing Tool with metric and imperial units.\" \/>\n  <title>Multi-Bolt Joint Load Distribution Calculator | Bolt Group Analysis &amp; Safety<\/title>\n<\/head>\n<body>\n<!--\n  WordPress embed: copy the entire #mjld-root div (style + markup + script)\n  into a Custom HTML block. Paste in Code Editor mode; do not re-save in Visual mode.\n  If a cache plugin delays scripts, exclude mjld-js-b64 and mjld-boot-script.\n  All CSS is scoped to #mjld-root and will not affect theme header, footer, or other content.\n-->\n<div id=\"mjld-root\">\n<style id=\"mjld-calc-styles\">\n\/*\n * WordPress-safe: every rule is scoped under #mjld-root.\n * This stylesheet must not restyle theme header, footer, or content\n * outside the calculator. No html\/body\/universal selectors.\n *\/\n\n#mjld-root {\n  all: revert;\n  --mjld-bg: transparent;\n  --mjld-surface: #ffffff;\n  --mjld-surface-2: #f4f7fa;\n  --mjld-ink: #0f172a;\n  --mjld-muted: #64748b;\n  --mjld-line: #d4dde8;\n  --mjld-accent: #0369a1;\n  --mjld-accent-2: #0284c7;\n  --mjld-steel: #1e293b;\n  --mjld-ok: #059669;\n  --mjld-warn: #d97706;\n  --mjld-risk: #dc2626;\n  --mjld-radius: 10px;\n  --mjld-shadow: 0 1px 3px rgba(15, 23, 42, 0.06), 0 8px 24px rgba(15, 23, 42, 0.06);\n  --mjld-mono: ui-monospace, \"Cascadia Mono\", \"Segoe UI Mono\", Consolas, monospace;\n  --mjld-sans: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;\n\n  box-sizing: border-box;\n  display: block;\n  isolation: isolate;\n  contain: layout style;\n  float: none;\n  clear: both;\n  position: relative;\n  z-index: auto;\n  overflow: visible;\n  font-family: var(--mjld-sans);\n  font-size: 15px;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--mjld-ink);\n  background: var(--mjld-bg);\n  width: 1000px;\n  max-width: 100%;\n  margin: 0 auto;\n  padding: 1.25rem 1rem 2rem;\n  text-align: left;\n  letter-spacing: normal;\n  text-transform: none;\n}\n\n#mjld-root *,\n#mjld-root *::before,\n#mjld-root *::after { box-sizing: border-box; }\n\n#mjld-root h1, #mjld-root h2, #mjld-root h3, #mjld-root h4,\n#mjld-root p, #mjld-root ul, #mjld-root ol, #mjld-root li,\n#mjld-root figure, #mjld-root blockquote, #mjld-root section,\n#mjld-root aside, #mjld-root div, #mjld-root span,\n#mjld-root strong, #mjld-root em, #mjld-root i, #mjld-root b {\n  margin: 0; padding: 0; border: none; background: none; box-shadow: none;\n  font-family: inherit; font-size: inherit; font-weight: inherit; font-style: inherit;\n  line-height: inherit; color: inherit; letter-spacing: inherit; text-transform: none;\n  text-decoration: none; float: none;\n}\n\n#mjld-root table, #mjld-root thead, #mjld-root tbody, #mjld-root tr,\n#mjld-root th, #mjld-root td {\n  margin: 0; padding: 0; border: none; background: none; box-shadow: none;\n  font-family: inherit; font-size: inherit; font-weight: inherit; color: inherit;\n  text-align: inherit; vertical-align: inherit; float: none;\n}\n\n#mjld-root button, #mjld-root input, #mjld-root select, #mjld-root textarea, #mjld-root label {\n  font: inherit; color: inherit; margin: 0; max-width: none; min-width: 0; float: none;\n}\n#mjld-root button {\n  cursor: pointer; background: transparent; border: none; padding: 0;\n  box-shadow: none; text-decoration: none; appearance: none; -webkit-appearance: none;\n}\n#mjld-root label { cursor: default; }\n#mjld-root img, #mjld-root svg { display: block; max-width: 100%; height: auto; }\n#mjld-root ul, #mjld-root ol { padding-left: 1.2rem; }\n#mjld-root li { margin: 0.28rem 0; }\n#mjld-root strong { font-weight: 700; }\n#mjld-root sub, #mjld-root sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n#mjld-root sub { bottom: -0.2em; }\n#mjld-root sup { top: -0.45em; }\n#mjld-root #mjld-js-b64 {\n  display: none !important;\n  width: 0 !important;\n  height: 0 !important;\n  border: 0 !important;\n  padding: 0 !important;\n  position: absolute !important;\n  left: -9999px !important;\n}\n#mjld-root .mjld-hidden { display: none !important; }\n#mjld-root .mjld-mono { font-family: var(--mjld-mono); }\n\n#mjld-root .mjld-layout { display: flex; flex-direction: column; gap: 1.15rem; }\n\n#mjld-root .mjld-card {\n  background: var(--mjld-surface);\n  border: 1px solid var(--mjld-line);\n  border-radius: var(--mjld-radius);\n  box-shadow: var(--mjld-shadow);\n}\n#mjld-root .mjld-card-h {\n  display: flex !important; align-items: center !important; justify-content: space-between !important; gap: 0.75rem !important;\n  padding: 0.72rem 1rem;\n  background: linear-gradient(180deg, #f8fafc, #f1f5f9);\n  border-bottom: 1px solid var(--mjld-line);\n  flex-wrap: wrap;\n  position: relative;\n  z-index: 2;\n  overflow: visible;\n}\n#mjld-root .mjld-card-h h2 {\n  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;\n  color: var(--mjld-steel);\n  width: auto !important; max-width: none !important; flex: 0 1 auto !important;\n  position: static !important; pointer-events: none;\n}\n#mjld-root .mjld-card-b { padding: 0.95rem 1rem 1.1rem; }\n\n#mjld-root .mjld-section {\n  font-size: 0.78rem; font-weight: 700; color: var(--mjld-ink);\n  margin: 1.05rem 0 0.65rem; padding-bottom: 0.3rem;\n  border-bottom: 1px dashed var(--mjld-line);\n  display: flex; align-items: center; gap: 0.45rem;\n}\n#mjld-root .mjld-section:first-child { margin-top: 0; }\n#mjld-root .mjld-badge {\n  width: 1.35rem; height: 1.35rem; border-radius: 999px;\n  display: inline-flex; align-items: center; justify-content: center;\n  background: linear-gradient(135deg, #0f172a, #334155); color: #fff;\n  font-size: 0.65rem; font-weight: 700;\n}\n\n#mjld-root .mjld-grid { display: grid; gap: 0.7rem 0.75rem; }\n#mjld-root .mjld-g-2 { grid-template-columns: 1fr 1fr; }\n#mjld-root .mjld-g-3 { grid-template-columns: 1fr 1fr 1fr; }\n@media (max-width: 640px) {\n  #mjld-root .mjld-g-2, #mjld-root .mjld-g-3 { grid-template-columns: 1fr; }\n}\n\n#mjld-root label.mjld-fld { display: flex; flex-direction: column; gap: 0.28rem; min-width: 0; }\n#mjld-root label.mjld-fld > span.mjld-lbl {\n  font-size: 0.75rem; font-weight: 600; color: #334155;\n  display: flex; align-items: center; gap: 0.3rem; flex-wrap: wrap;\n}\n\n#mjld-root input[type=\"number\"] {\n  appearance: none; -webkit-appearance: none; width: 100%;\n  border: 1px solid #cbd5e1; border-radius: 8px;\n  padding: 0.5rem 0.7rem; font-size: 0.8125rem; background: #fff; color: #0f172a;\n  font-family: var(--mjld-mono); box-shadow: none; line-height: 1.25;\n}\n#mjld-root input[type=\"number\"]::-webkit-outer-spin-button,\n#mjld-root input[type=\"number\"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n#mjld-root input[type=\"number\"] { -moz-appearance: textfield; appearance: textfield; }\n\n#mjld-root select {\n  display: block !important; width: 100% !important; min-height: 2.45rem !important;\n  margin: 0 !important; padding: 0.48rem 2rem 0.48rem 0.7rem !important;\n  border: 1px solid #cbd5e1 !important; border-radius: 8px !important;\n  background-color: #fff !important; color: #0f172a !important;\n  font-size: 0.8125rem !important; font-family: var(--mjld-mono) !important;\n  line-height: 1.25 !important; box-shadow: none !important;\n  appearance: auto !important; -webkit-appearance: menulist !important;\n}\n#mjld-root .mjld-input-row select {\n  min-width: 4.6rem !important; width: auto !important;\n  padding-right: 1.6rem !important;\n}\n#mjld-root input:focus, #mjld-root select:focus {\n  outline: 2px solid #38bdf8; outline-offset: 0; border-color: #0ea5e9;\n}\n#mjld-root input:disabled, #mjld-root input[readonly] { background: #f8fafc; }\n#mjld-root input.mjld-invalid { border-color: #ef4444; background: #fef2f2; }\n#mjld-root .mjld-err { font-size: 0.68rem; color: var(--mjld-risk); min-height: 0.85rem; }\n\n#mjld-root .mjld-input-row {\n  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem;\n}\n#mjld-root .mjld-unit-pill {\n  display: inline-flex; align-items: center; justify-content: center;\n  min-width: 3.4rem; padding: 0 0.55rem; border: 1px solid #cbd5e1; border-radius: 8px;\n  background: #f8fafc; color: var(--mjld-muted); font-size: 0.72rem; font-weight: 600;\n  font-family: var(--mjld-mono);\n}\n\n#mjld-root .mjld-tools {\n  display: flex !important; align-items: center !important; gap: 0.5rem !important; flex-shrink: 0 !important;\n  position: relative !important; z-index: 5 !important; margin-left: auto;\n  pointer-events: auto !important;\n}\n#mjld-root .mjld-unit-switch {\n  display: inline-flex !important; align-items: center !important; gap: 2px !important; padding: 3px !important;\n  border-radius: 8px !important; background: #0f172a !important; border: 1px solid #1e293b !important;\n  position: relative !important; z-index: 6 !important; pointer-events: auto !important;\n}\n#mjld-root .mjld-unit-switch .mjld-unit-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.4rem 0.85rem !important; border: none !important; border-radius: 6px !important;\n  background: transparent !important; color: #cbd5e1 !important; font-size: 0.8125rem !important; font-weight: 500 !important;\n  font-family: inherit !important; cursor: pointer !important; line-height: 1.25 !important;\n  pointer-events: auto !important; position: relative !important; z-index: 7 !important;\n}\n#mjld-root .mjld-unit-switch .mjld-unit-btn:hover { color: #fff !important; }\n#mjld-root .mjld-unit-switch .mjld-unit-btn.mjld-is-active {\n  background: #0ea5e9 !important; color: #fff !important; font-weight: 600 !important;\n}\n#mjld-root .mjld-reset-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  margin: 0 !important; padding: 0.4rem 0.85rem !important; border-radius: 6px !important;\n  border: 1px solid #d1d5db !important; background: #ffffff !important; color: #0f172a !important;\n  font-size: 0.8125rem !important; font-weight: 500 !important; font-family: inherit !important;\n  cursor: pointer !important; line-height: 1.25 !important;\n  pointer-events: auto !important; position: relative !important; z-index: 7 !important;\n}\n#mjld-root .mjld-reset-btn:hover { background: #f8fafc !important; border-color: #94a3b8 !important; }\n\n#mjld-root .mjld-note {\n  font-size: 0.72rem; color: var(--mjld-muted); background: var(--mjld-surface-2);\n  border: 1px solid var(--mjld-line); border-radius: 8px; padding: 0.5rem 0.65rem; line-height: 1.45;\n}\n\n#mjld-root .mjld-actions {\n  display: flex; justify-content: center; gap: 0.65rem; flex-wrap: wrap;\n  margin-top: 1.15rem; padding-top: 0.9rem; border-top: 1px solid var(--mjld-line);\n}\n#mjld-root #mjldBtnCalculate.mjld-calc-btn {\n  appearance: none !important; -webkit-appearance: none !important;\n  display: inline-flex !important; align-items: center !important; justify-content: center !important;\n  min-width: 220px !important; padding: 0.85rem 2.5rem !important; border: none !important; border-radius: 10px !important;\n  background: #0077c2 !important; color: #ffffff !important; font-size: 1rem !important; font-weight: 700 !important;\n  font-family: inherit !important; cursor: pointer !important; letter-spacing: 0.01em !important;\n  pointer-events: auto !important;\n}\n#mjld-root #mjldBtnCalculate.mjld-calc-btn:hover { background: #0066a8 !important; }\n#mjld-root #mjldBtnCalculate.mjld-calc-btn:active { background: #005a94 !important; }\n\n#mjld-root .mjld-tip {\n  position: relative; display: inline-flex; align-items: center; justify-content: center;\n  width: 0.95rem; height: 0.95rem; border-radius: 999px;\n  background: #e2e8f0; color: #475569; font-size: 0.62rem; font-weight: 700; cursor: help;\n}\n#mjld-root .mjld-tip-box {\n  display: none; position: absolute; left: 50%; bottom: calc(100% + 8px); transform: translateX(-50%);\n  width: 16rem; padding: 0.55rem 0.65rem; border-radius: 8px; z-index: 20;\n  background: #0f172a; color: #e2e8f0; font-size: 0.7rem; font-weight: 400; line-height: 1.4;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.25); text-align: left;\n}\n#mjld-root .mjld-tip:hover .mjld-tip-box, #mjld-root .mjld-tip:focus .mjld-tip-box { display: block; }\n\n#mjld-root .mjld-custom-table-wrap {\n  overflow-x: auto; margin-top: 0.65rem;\n  border: 1px solid var(--mjld-line); border-radius: 8px;\n}\n#mjld-root .mjld-custom-table {\n  width: 100%; border-collapse: collapse; font-size: 0.78rem;\n  border-spacing: 0;\n}\n#mjld-root .mjld-custom-table th, #mjld-root .mjld-custom-table td {\n  padding: 0.45rem 0.55rem; border-bottom: 1px solid var(--mjld-line); text-align: left;\n  background: transparent;\n}\n#mjld-root .mjld-custom-table th {\n  background: #f8fafc !important; font-weight: 700; font-size: 0.68rem; text-transform: uppercase;\n  letter-spacing: 0.05em; color: var(--mjld-muted);\n}\n#mjld-root .mjld-custom-table input {\n  appearance: none; -webkit-appearance: none;\n  width: 100%; padding: 0.35rem 0.5rem; font-size: 0.75rem;\n  border: 1px solid #cbd5e1; border-radius: 8px; background: #fff; color: #0f172a;\n  font-family: var(--mjld-mono); box-shadow: none;\n}\n\n#mjld-root .mjld-banner {\n  border-radius: 10px; padding: 0.85rem 1rem; color: #fff; margin-bottom: 0.85rem;\n  display: flex; align-items: flex-start; gap: 0.75rem;\n}\n#mjld-root .mjld-banner .mjld-dot {\n  width: 0.7rem; height: 0.7rem; border-radius: 999px; background: #fff; flex-shrink: 0; margin-top: 0.28rem;\n}\n#mjld-root .mjld-banner-kicker { font-size: 0.65rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.85; }\n#mjld-root .mjld-banner-title { font-size: 1.15rem; font-weight: 750; margin: 0.1rem 0 0.2rem; }\n#mjld-root .mjld-banner-note { font-size: 0.75rem; opacity: 0.92; line-height: 1.45; }\n#mjld-root .mjld-banner-ok { background: linear-gradient(90deg, #14532d, #166534); }\n#mjld-root .mjld-banner-caution { background: linear-gradient(90deg, #854d0e, #a16207); }\n#mjld-root .mjld-banner-risk { background: linear-gradient(90deg, #7f1d1d, #991b1b); }\n#mjld-root .mjld-banner-idle { background: linear-gradient(90deg, #334155, #475569); }\n\n#mjld-root .mjld-hero {\n  display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.65rem; margin-bottom: 0.75rem;\n}\n@media (min-width: 720px) { #mjld-root .mjld-hero { grid-template-columns: repeat(4, 1fr); } }\n#mjld-root .mjld-hero-card {\n  border: 1px solid var(--mjld-line); border-radius: 10px; padding: 0.8rem 0.85rem;\n  background: linear-gradient(180deg, #fff, #f8fafc);\n}\n#mjld-root .mjld-hero-k { font-size: 0.65rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; color: var(--mjld-muted); }\n#mjld-root .mjld-hero-v { font-family: var(--mjld-mono); font-size: 1.15rem; font-weight: 700; margin-top: 0.2rem; }\n#mjld-root .mjld-hero-u { font-size: 0.68rem; color: var(--mjld-muted); margin-top: 0.15rem; }\n\n#mjld-root .mjld-viz-grid {\n  display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;\n}\n@media (max-width: 640px) { #mjld-root .mjld-viz-grid { grid-template-columns: 1fr; } }\n\n#mjld-root .mjld-viz-panel {\n  border: 1px solid var(--mjld-line); border-radius: 10px; padding: 0.65rem;\n  background: #fff;\n}\n#mjld-root .mjld-viz-title {\n  font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;\n  color: var(--mjld-muted); margin-bottom: 0.5rem;\n}\n#mjld-root .mjld-svg-label { fill: #64748b; font-size: 10px; font-family: var(--mjld-sans); }\n\n#mjld-root .mjld-gauge-row {\n  display: grid; grid-template-columns: 150px 1fr; gap: 0.75rem; align-items: center;\n  border: 1px solid var(--mjld-line); border-radius: 10px; padding: 0.55rem 0.75rem;\n  background: #fff; margin-bottom: 0.75rem;\n}\n@media (max-width: 520px) { #mjld-root .mjld-gauge-row { grid-template-columns: 1fr; } }\n#mjld-root .mjld-gauge-readout { font-family: var(--mjld-mono); font-size: 1.05rem; font-weight: 700; }\n#mjld-root .mjld-gauge-label { font-size: 0.68rem; color: var(--mjld-muted); }\n\n#mjld-root .mjld-util { margin-bottom: 0.75rem; }\n#mjld-root .mjld-util-head {\n  display: flex; justify-content: space-between; font-size: 0.72rem; margin-bottom: 0.35rem;\n}\n#mjld-root .mjld-util-track {\n  position: relative; height: 14px; border-radius: 999px; overflow: hidden; background: #e2e8f0;\n}\n#mjld-root .mjld-util-fill {\n  position: absolute; left: 0; top: 0; bottom: 0; width: 0;\n  background: linear-gradient(90deg, #0284c7, #0369a1); border-radius: 999px; transition: width 0.25s ease;\n}\n#mjld-root .mjld-util-fill.mjld-is-ok { background: linear-gradient(90deg, #059669, #047857); }\n#mjld-root .mjld-util-fill.mjld-is-caution { background: linear-gradient(90deg, #d97706, #b45309); }\n#mjld-root .mjld-util-fill.mjld-is-risk { background: linear-gradient(90deg, #dc2626, #b91c1c); }\n\n#mjld-root .mjld-bar-list { display: flex; flex-direction: column; gap: 0.55rem; max-height: 320px; overflow-y: auto; }\n#mjld-root .mjld-bar-group {\n  border: 1px solid var(--mjld-line); border-radius: 8px; padding: 0.5rem 0.6rem; background: #fafbfc;\n}\n#mjld-root .mjld-bar-group.mjld-bar-crit { border-color: #0284c7; box-shadow: 0 0 0 2px rgba(2, 132, 199, 0.12); }\n#mjld-root .mjld-bar-head {\n  display: flex; justify-content: space-between; font-size: 0.72rem; margin-bottom: 0.35rem;\n}\n#mjld-root .mjld-bar-row {\n  display: grid; grid-template-columns: 5.5rem 1fr auto; gap: 0.4rem; align-items: center; margin-top: 0.25rem;\n}\n#mjld-root .mjld-bar-k { font-size: 0.68rem; color: #334155; }\n#mjld-root .mjld-bar-track { height: 8px; background: #e2e8f0; border-radius: 999px; overflow: hidden; }\n#mjld-root .mjld-bar-fill { height: 100%; border-radius: 999px; }\n#mjld-root .mjld-bar-fill.mjld-bar-t { background: #0284c7; }\n#mjld-root .mjld-bar-fill.mjld-bar-v { background: #6366f1; }\n#mjld-root .mjld-bar-v { font-family: var(--mjld-mono); font-size: 0.65rem; color: var(--mjld-muted); }\n\n#mjld-root .mjld-heat-grid {\n  display: grid; grid-template-columns: repeat(auto-fill, minmax(4.5rem, 1fr)); gap: 0.4rem;\n}\n#mjld-root .mjld-heat-cell {\n  border-radius: 8px; padding: 0.45rem 0.35rem; text-align: center; color: #fff;\n  font-size: 0.72rem; font-weight: 700; line-height: 1.2;\n}\n#mjld-root .mjld-heat-cell small { display: block; font-size: 0.62rem; font-weight: 600; opacity: 0.9; }\n\n#mjld-root .mjld-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 0.55rem; }\n@media (min-width: 720px) { #mjld-root .mjld-tiles { grid-template-columns: repeat(3, 1fr); } }\n#mjld-root .mjld-tile {\n  border: 1px solid var(--mjld-line); border-radius: 8px; padding: 0.6rem 0.7rem;\n  background: linear-gradient(180deg, #fff, #f8fafc);\n}\n#mjld-root .mjld-tile .mjld-k { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--mjld-muted); }\n#mjld-root .mjld-tile .mjld-v { font-family: var(--mjld-mono); font-size: 0.98rem; font-weight: 700; margin-top: 0.12rem; }\n\n#mjld-root .mjld-alerts { display: flex; flex-direction: column; gap: 0.4rem; margin-top: 0.75rem; }\n#mjld-root .mjld-alert {\n  border-radius: 8px; padding: 0.5rem 0.7rem; font-size: 0.75rem; border: 1px solid; line-height: 1.4;\n}\n#mjld-root .mjld-alert-ok { background: #ecfdf5; border-color: #a7f3d0; color: #065f46; }\n#mjld-root .mjld-alert-warn { background: #fffbeb; border-color: #fcd34d; color: #92400e; }\n#mjld-root .mjld-alert-risk { background: #fef2f2; border-color: #fca5a5; color: #991b1b; }\n\n@media print {\n  #mjld-root { max-width: none; padding: 0; background: #fff; }\n  #mjld-root .mjld-no-print { display: none !important; }\n  #mjld-root .mjld-layout { display: block; }\n  #mjld-root .mjld-card { break-inside: avoid; box-shadow: none; }\n}\n<\/style>\n\n  <div class=\"mjld-layout\">\n    <section class=\"mjld-card\" id=\"mjldInputs\">\n      <div class=\"mjld-card-h\">\n        <h2>Input parameters<\/h2>\n        <div class=\"mjld-tools mjld-no-print\">\n          <div class=\"mjld-unit-switch\" role=\"group\" aria-label=\"Unit system\">\n            <button type=\"button\" class=\"mjld-unit-btn mjld-is-active\" id=\"mjldBtnMetric\" onclick=\"(function(){if(window.mjldSwitchUnit){window.mjldSwitchUnit('metric');return false;}var t=document.getElementById('mjld-js-b64');if(!t||!t.value){return false;}var s=document.createElement('script');s.text=atob(t.value.replace(\/\\s\/g,''));document.body.appendChild(s);setTimeout(function(){if(window.mjldSwitchUnit)window.mjldSwitchUnit('metric');},150);return false;})()\">Metric<\/button>\n            <button type=\"button\" class=\"mjld-unit-btn\" id=\"mjldBtnImperial\" onclick=\"(function(){if(window.mjldSwitchUnit){window.mjldSwitchUnit('imperial');return false;}var t=document.getElementById('mjld-js-b64');if(!t||!t.value){return false;}var s=document.createElement('script');s.text=atob(t.value.replace(\/\\s\/g,''));document.body.appendChild(s);setTimeout(function(){if(window.mjldSwitchUnit)window.mjldSwitchUnit('imperial');},150);return false;})()\">Imperial<\/button>\n          <\/div>\n          <button type=\"button\" class=\"mjld-reset-btn\" id=\"mjldBtnReset\" onclick=\"(function(){if(window.mjldReset){window.mjldReset();return false;}var t=document.getElementById('mjld-js-b64');if(!t||!t.value){return false;}var s=document.createElement('script');s.text=atob(t.value.replace(\/\\s\/g,''));document.body.appendChild(s);setTimeout(function(){if(window.mjldReset)window.mjldReset();},150);return false;})()\">Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"mjld-card-b\">\n\n        <div class=\"mjld-section\"><span class=\"mjld-badge\">1<\/span> Bolt group geometry<\/div>\n        <div class=\"mjld-grid mjld-g-2\">\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">\n              Number of bolts\n              <span class=\"mjld-tip\" tabindex=\"0\">?<span class=\"mjld-tip-box\">Total fasteners in the connection. Direct axial and shear loads are divided equally; moment causes additional force proportional to bolt distance from centroid.<\/span><\/span>\n            <\/span>\n            <input id=\"mjldN\" type=\"number\" min=\"1\" max=\"64\" step=\"1\" value=\"8\" inputmode=\"numeric\" \/>\n            <span class=\"mjld-err\" id=\"mjldErrN\"><\/span>\n          <\/label>\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">\n              Bolt arrangement type\n              <span class=\"mjld-tip\" tabindex=\"0\">?<span class=\"mjld-tip-box\">Pattern used to generate bolt coordinates. Custom Layout lets you enter X\/Y positions for each bolt relative to the group centroid.<\/span><\/span>\n            <\/span>\n            <select id=\"mjldArrangement\">\n              <option value=\"circular\" selected>Circular Pattern<\/option>\n              <option value=\"rectangular\">Rectangular Pattern<\/option>\n              <option value=\"linear\">Linear Pattern<\/option>\n              <option value=\"custom\">Custom Layout<\/option>\n            <\/select>\n          <\/label>\n        <\/div>\n        <div class=\"mjld-grid mjld-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">\n              Bolt diameter\n              <span class=\"mjld-tip\" tabindex=\"0\">?<span class=\"mjld-tip-box\">Nominal shank diameter. Used to compute tensile\/shear stress area A = \u03c0d\u00b2\/4.<\/span><\/span>\n            <\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldD\" type=\"number\" min=\"0\" step=\"any\" value=\"12\" inputmode=\"decimal\" \/>\n              <span class=\"mjld-unit-pill\" data-unit=\"d\">mm<\/span>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrD\"><\/span>\n          <\/label>\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">\n              Bolt spacing\n              <span class=\"mjld-tip\" tabindex=\"0\">?<span class=\"mjld-tip-box\">Center-to-center distance between adjacent bolts. For circular patterns, arc spacing along the pitch circle is used.<\/span><\/span>\n            <\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldSpacing\" type=\"number\" min=\"0\" step=\"any\" value=\"40\" inputmode=\"decimal\" \/>\n              <span class=\"mjld-unit-pill\" data-unit=\"spacing\">mm<\/span>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrSpacing\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div id=\"mjldCustomWrap\" class=\"mjld-hidden\">\n          <div class=\"mjld-section\"><span class=\"mjld-badge\">\u00b7<\/span> Custom bolt coordinates<\/div>\n          <p class=\"mjld-note\">Enter X and Y positions relative to the bolt group centroid (load center). Positive Y is upward in the diagram.<\/p>\n          <div class=\"mjld-custom-table-wrap\">\n            <table class=\"mjld-custom-table\" id=\"mjldCustomTable\">\n              <thead><tr><th>Bolt<\/th><th>X<\/th><th>Y<\/th><th>Distance r<\/th><th>Unit<\/th><\/tr><\/thead>\n              <tbody><\/tbody>\n            <\/table>\n          <\/div>\n        <\/div>\n\n        <div class=\"mjld-section\"><span class=\"mjld-badge\">2<\/span> Material strength<\/div>\n        <label class=\"mjld-fld\">\n          <span class=\"mjld-lbl\">\n            Bolt material grade\n            <span class=\"mjld-tip\" tabindex=\"0\">?<span class=\"mjld-tip-box\">ISO 898 property classes. Grade 10.9 = 1000 MPa tensile. Shear strength defaults to 0.6 \u00d7 tensile unless overridden.<\/span><\/span>\n          <\/span>\n          <select id=\"mjldGrade\">\n            <option value=\"8.8\">Grade 8.8<\/option>\n            <option value=\"10.9\" selected>Grade 10.9<\/option>\n            <option value=\"12.9\">Grade 12.9<\/option>\n            <option value=\"ss\">Stainless Steel<\/option>\n            <option value=\"custom\">Custom Material<\/option>\n          <\/select>\n        <\/label>\n        <div class=\"mjld-grid mjld-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">Bolt tensile strength<\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldSut\" type=\"number\" min=\"0\" step=\"any\" value=\"1000\" inputmode=\"decimal\" readonly \/>\n              <span class=\"mjld-unit-pill\" data-unit=\"stress\">MPa<\/span>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrSut\"><\/span>\n          <\/label>\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">Bolt shear strength<\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldSs\" type=\"number\" min=\"0\" step=\"any\" value=\"600\" inputmode=\"decimal\" readonly \/>\n              <span class=\"mjld-unit-pill\" data-unit=\"stress\">MPa<\/span>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrSs\"><\/span>\n          <\/label>\n        <\/div>\n\n        <div class=\"mjld-section\"><span class=\"mjld-badge\">3<\/span> Applied loads<\/div>\n        <label class=\"mjld-fld\">\n          <span class=\"mjld-lbl\">\n            Load direction\n            <span class=\"mjld-tip\" tabindex=\"0\">?<span class=\"mjld-tip-box\">Select primary loading mode. Combined Loading applies axial, shear, and moment together using F_combined = \u221a(Ft\u00b2 + Fs\u00b2).<\/span><\/span>\n          <\/span>\n          <select id=\"mjldLoadDir\">\n            <option value=\"axial\">Axial<\/option>\n            <option value=\"shear\">Shear<\/option>\n            <option value=\"bending\">Bending<\/option>\n            <option value=\"combined\" selected>Combined Loading<\/option>\n          <\/select>\n        <\/label>\n        <div class=\"mjld-grid mjld-g--2 mjld-g-2\" style=\"margin-top:0.65rem\">\n          <label class=\"mjld-fld\" id=\"mjldPWrap\">\n            <span class=\"mjld-lbl\">Total tensile load<\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldP\" type=\"number\" min=\"0\" step=\"any\" value=\"40000\" inputmode=\"decimal\" \/>\n              <select id=\"mjldPUnit\" aria-label=\"Tensile load unit\">\n                <option value=\"N\" selected>N<\/option>\n                <option value=\"kN\">kN<\/option>\n                <option value=\"lbf\">lbf<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrP\"><\/span>\n          <\/label>\n          <label class=\"mjld-fld\" id=\"mjldVWrap\">\n            <span class=\"mjld-lbl\">Total shear load<\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldV\" type=\"number\" min=\"0\" step=\"any\" value=\"20000\" inputmode=\"decimal\" \/>\n              <select id=\"mjldVUnit\" aria-label=\"Shear load unit\">\n                <option value=\"N\" selected>N<\/option>\n                <option value=\"kN\">kN<\/option>\n                <option value=\"lbf\">lbf<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrV\"><\/span>\n          <\/label>\n          <label class=\"mjld-fld\" id=\"mjldMWrap\">\n            <span class=\"mjld-lbl\">Applied moment<\/span>\n            <div class=\"mjld-input-row\">\n              <input id=\"mjldM\" type=\"number\" min=\"0\" step=\"any\" value=\"500\" inputmode=\"decimal\" \/>\n              <select id=\"mjldMUnit\" aria-label=\"Moment unit\">\n                <option value=\"Nm\" selected>N\u00b7m<\/option>\n                <option value=\"lbfft\">lbf\u00b7ft<\/option>\n              <\/select>\n            <\/div>\n            <span class=\"mjld-err\" id=\"mjldErrM\"><\/span>\n          <\/label>\n          <label class=\"mjld-fld\">\n            <span class=\"mjld-lbl\">Design safety factor<\/span>\n            <input id=\"mjldNsf\" type=\"number\" min=\"0\" step=\"any\" value=\"2.0\" inputmode=\"decimal\" \/>\n            <span class=\"mjld-err\" id=\"mjldErrNsf\"><\/span>\n          <\/label>\n        <\/div>\n        <p class=\"mjld-note\" style=\"margin-top:0.55rem\">\n          Direct share: F<sub>bolt<\/sub> = F<sub>total<\/sub> \/ n. Moment share: F<sub>i<\/sub> = M \u00d7 r<sub>i<\/sub> \/ \u03a3(r\u00b2).\n          Combined bolt load: F<sub>combined<\/sub> = \u221a(F<sub>t<\/sub>\u00b2 + F<sub>s<\/sub>\u00b2). Safety Factor = Allowable \/ Actual.\n        <\/p>\n\n        <div class=\"mjld-actions mjld-no-print\">\n          <button type=\"button\" class=\"mjld-calc-btn\" id=\"mjldBtnCalculate\" onclick=\"(function(){if(window.mjldCalculate){window.mjldCalculate();return false;}var t=document.getElementById('mjld-js-b64');if(!t||!t.value){return false;}var s=document.createElement('script');s.text=atob(t.value.replace(\/\\s\/g,''));document.body.appendChild(s);setTimeout(function(){if(window.mjldCalculate)window.mjldCalculate();},150);return false;})()\">Calculate<\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <aside class=\"mjld-hidden\" id=\"mjldResults\">\n      <section class=\"mjld-card\">\n        <div class=\"mjld-card-h\"><h2>Calculated results<\/h2><\/div>\n        <div class=\"mjld-card-b\">\n          <div class=\"mjld-banner mjld-banner-idle\" id=\"mjldBanner\">\n            <span class=\"mjld-dot\" aria-hidden=\"true\"><\/span>\n            <div>\n              <div class=\"mjld-banner-kicker\">Connection safety status<\/div>\n              <div class=\"mjld-banner-title\" id=\"mjldStatusTitle\">Ready<\/div>\n              <p class=\"mjld-banner-note\" id=\"mjldStatusNote\">Enter connection data and press Calculate.<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"mjld-hero\">\n            <div class=\"mjld-hero-card\">\n              <div class=\"mjld-hero-k\">Total applied load<\/div>\n              <div class=\"mjld-hero-v\" id=\"mjldOutTotalLoad\">\u2014<\/div>\n              <div class=\"mjld-hero-u\" id=\"mjldOutTotalSub\">P + V components<\/div>\n            <\/div>\n            <div class=\"mjld-hero-card\">\n              <div class=\"mjld-hero-k\">Maximum loaded bolt<\/div>\n              <div class=\"mjld-hero-v\" id=\"mjldOutMaxBolt\">\u2014<\/div>\n              <div class=\"mjld-hero-u\" id=\"mjldOutMaxLoad\">\u2014<\/div>\n            <\/div>\n            <div class=\"mjld-hero-card\">\n              <div class=\"mjld-hero-k\">Maximum bolt stress<\/div>\n              <div class=\"mjld-hero-v\" id=\"mjldOutMaxStress\">\u2014<\/div>\n              <div class=\"mjld-hero-u\" id=\"mjldOutMaxStressSub\">Combined stress<\/div>\n            <\/div>\n            <div class=\"mjld-hero-card\">\n              <div class=\"mjld-hero-k\">Safety factor<\/div>\n              <div class=\"mjld-hero-v\" id=\"mjldOutSf\">\u2014<\/div>\n              <div class=\"mjld-hero-u\" id=\"mjldOutSfSub\">Allowable \/ actual<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"mjld-viz-grid\">\n            <div class=\"mjld-viz-panel\">\n              <div class=\"mjld-viz-title\">Multi-bolt joint diagram<\/div>\n              <svg id=\"mjldLayoutSvg\" viewBox=\"0 0 280 280\" role=\"img\" aria-label=\"Bolt layout with force arrows\"><\/svg>\n            <\/div>\n            <div class=\"mjld-viz-panel\">\n              <div class=\"mjld-viz-title\">Bolt stress heatmap<\/div>\n              <div class=\"mjld-heat-grid\" id=\"mjldHeatGrid\"><\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"mjld-gauge-row\">\n            <svg viewBox=\"0 0 240 140\" width=\"150\" aria-hidden=\"true\">\n              <defs>\n                <linearGradient id=\"mjldGaugeGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n                  <stop offset=\"0%\" stop-color=\"#dc2626\" \/>\n                  <stop offset=\"25%\" stop-color=\"#d97706\" \/>\n                  <stop offset=\"55%\" stop-color=\"#059669\" \/>\n                  <stop offset=\"100%\" stop-color=\"#047857\" \/>\n                <\/linearGradient>\n              <\/defs>\n              <path d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"#e8eef4\" stroke-width=\"14\" stroke-linecap=\"round\" \/>\n              <path id=\"mjldGaugeArc\" d=\"M 30 118 A 90 90 0 0 1 210 118\" fill=\"none\" stroke=\"url(#mjldGaugeGrad)\" stroke-width=\"14\" stroke-linecap=\"round\" stroke-dasharray=\"282.7\" stroke-dashoffset=\"282.7\" \/>\n              <g id=\"mjldNeedle\" transform=\"rotate(-90 120 118)\">\n                <line x1=\"120\" y1=\"118\" x2=\"120\" y2=\"44\" stroke=\"#0f172a\" stroke-width=\"3\" stroke-linecap=\"round\" \/>\n                <circle cx=\"120\" cy=\"118\" r=\"6\" fill=\"#0f172a\" \/>\n              <\/g>\n            <\/svg>\n            <div>\n              <div class=\"mjld-gauge-label\">Safety factor gauge<\/div>\n              <div class=\"mjld-gauge-readout\" id=\"mjldGaugeRead\">\u2014<\/div>\n              <div class=\"mjld-gauge-label\">Scale 0\u20134 (critical bolt)<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"mjld-util\">\n            <div class=\"mjld-util-head\">\n              <span>Bolt utilization ratio (critical bolt)<\/span>\n              <strong id=\"mjldOutUtil\">\u2014<\/strong>\n            <\/div>\n            <div class=\"mjld-util-track\"><div class=\"mjld-util-fill\" id=\"mjldUtilFill\"><\/div><\/div>\n          <\/div>\n\n          <div class=\"mjld-viz-panel\" style=\"margin-bottom:0.75rem\">\n            <div class=\"mjld-viz-title\">Load distribution chart<\/div>\n            <div class=\"mjld-bar-list\" id=\"mjldBarList\"><\/div>\n          <\/div>\n\n          <div class=\"mjld-tiles\">\n            <div class=\"mjld-tile\">\n              <div class=\"mjld-k\">Average load per bolt<\/div>\n              <div class=\"mjld-v\" id=\"mjldOutAvgBolt\">\u2014<\/div>\n            <\/div>\n            <div class=\"mjld-tile\">\n              <div class=\"mjld-k\">Direct tensile share<\/div>\n              <div class=\"mjld-v\">P \/ n<\/div>\n            <\/div>\n            <div class=\"mjld-tile\">\n              <div class=\"mjld-k\">Direct shear share<\/div>\n              <div class=\"mjld-v\">V \/ n<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"mjld-alerts\" id=\"mjldAlerts\"><\/div>\n        <\/div>\n      <\/section>\n    <\/aside>\n  <\/div>\n\n<textarea id=\"mjld-js-b64\" aria-hidden=\"true\" style=\"display:none!important;width:0;height:0;border:0;padding:0;position:absolute;left:-9999px\">KGZ1bmN0aW9uICgpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1qbGQtcm9vdCIpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgiZGF0YS1tamxkLXJlYWR5IikgPT09ICIxIikgcmV0dXJuOwogIHJvb3Quc2V0QXR0cmlidXRlKCJkYXRhLW1qbGQtcmVhZHkiLCAiMSIpOwoKICB2YXIgQVJDX0xFTiA9IDI4Mi43NDM7CiAgdmFyIE1NX1BFUl9JTiA9IDI1LjQ7CiAgdmFyIFBTSV9QRVJfTVBBID0gMTQ1LjAzNzczNzczOwogIHZhciBMQkZfUEVSX04gPSAwLjIyNDgwODk0MzsKICB2YXIgTl9QRVJfTEJGID0gNC40NDgyMjE2MTUzOwogIHZhciBGVF9QRVJfTSA9IDMuMjgwODM5ODk1OwogIHZhciBNX1BFUl9GVCA9IDAuMzA0ODsKCiAgdmFyIEdSQURFUyA9IHsKICAgICI4LjgiOiB7IHN1dDogODAwLCBzczogNDgwLCBsYWJlbDogIkdyYWRlIDguOCIgfSwKICAgICIxMC45IjogeyBzdXQ6IDEwMDAsIHNzOiA2MDAsIGxhYmVsOiAiR3JhZGUgMTAuOSIgfSwKICAgICIxMi45IjogeyBzdXQ6IDEyMDAsIHNzOiA3MjAsIGxhYmVsOiAiR3JhZGUgMTIuOSIgfSwKICAgIHNzOiB7IHN1dDogNzAwLCBzczogNDIwLCBsYWJlbDogIlN0YWlubGVzcyBTdGVlbCBBMi03MCIgfSwKICAgIGN1c3RvbTogbnVsbAogIH07CgogIHZhciBERUZBVUxUUyA9IHsKICAgIHVuaXQ6ICJtZXRyaWMiLAogICAgbjogOCwKICAgIGFycmFuZ2VtZW50OiAiY2lyY3VsYXIiLAogICAgZDogMTIsCiAgICBncmFkZTogIjEwLjkiLAogICAgc3V0OiAxMDAwLAogICAgc3M6IDYwMCwKICAgIFA6IDQwMDAwLAogICAgVjogMjAwMDAsCiAgICBNOiA1MDAsCiAgICBzcGFjaW5nOiA0MCwKICAgIGxvYWREaXI6ICJjb21iaW5lZCIsCiAgICBuc2Y6IDIsCiAgICBwVW5pdDogIk4iLAogICAgdlVuaXQ6ICJOIiwKICAgIG1Vbml0OiAiTm0iCiAgfTsKCiAgdmFyIGVsID0ge307CiAgdmFyIHN0YXRlID0geyB1bml0OiAibWV0cmljIiwgbGl2ZTogZmFsc2UsIGFwcGx5aW5nOiBmYWxzZSB9OwoKICBmdW5jdGlvbiBieUlkKGlkKSB7IHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoIiMiICsgaWQpOyB9CgogIGZ1bmN0aW9uIG51bShub2RlKSB7CiAgICBpZiAoIW5vZGUpIHJldHVybiBOYU47CiAgICB2YXIgdiA9IHBhcnNlRmxvYXQoU3RyaW5nKG5vZGUudmFsdWUpLnJlcGxhY2UoIiwiLCAiLiIpKTsKICAgIHJldHVybiBpc0Zpbml0ZSh2KSA\/IHYgOiBOYU47CiAgfQoKICBmdW5jdGlvbiBjbGFtcCh2LCBhLCBiKSB7IHJldHVybiBNYXRoLm1heChhLCBNYXRoLm1pbihiLCB2KSk7IH0KCiAgZnVuY3Rpb24gcm91bmRTbWFydCh2KSB7CiAgICBpZiAoIWlzRmluaXRlKHYpKSByZXR1cm4gIiI7CiAgICB2YXIgYSA9IE1hdGguYWJzKHYpOwogICAgdmFyIGQgPSBhID49IDEwMCA\/IDIgOiBhID49IDEwID8gMyA6IGEgPj0gMSA\/IDQgOiA1OwogICAgcmV0dXJuIFN0cmluZyhOdW1iZXIodi50b0ZpeGVkKGQpKSk7CiAgfQoKICBmdW5jdGlvbiBmbXQodiwgZCkgewogICAgaWYgKCFpc0Zpbml0ZSh2KSkgcmV0dXJuICLigJQiOwogICAgcmV0dXJuIHYudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQsIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCB9KTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5KG5vZGUpIHsgcmV0dXJuICFub2RlIHx8IFN0cmluZyhub2RlLnZhbHVlKS50cmltKCkgPT09ICIiOyB9CgogIGZ1bmN0aW9uIHNldEVycihrZXksIG1zZykgewogICAgdmFyIG5vZGUgPSBieUlkKCJtamxkRXJyIiArIGtleSk7CiAgICB2YXIgbWFwID0gewogICAgICBOOiBlbC5uLCBEOiBlbC5kLCBTdXQ6IGVsLnN1dCwgU3M6IGVsLnNzLCBQOiBlbC5QLCBWOiBlbC5WLAogICAgICBNOiBlbC5NLCBTcGFjaW5nOiBlbC5zcGFjaW5nLCBOc2Y6IGVsLm5zZgogICAgfTsKICAgIHZhciBpbnB1dCA9IG1hcFtrZXldOwogICAgaWYgKG5vZGUpIG5vZGUudGV4dENvbnRlbnQgPSBtc2cgfHwgIiI7CiAgICBpZiAoaW5wdXQpIHsKICAgICAgaWYgKG1zZykgaW5wdXQuY2xhc3NMaXN0LmFkZCgibWpsZC1pbnZhbGlkIik7CiAgICAgIGVsc2UgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgibWpsZC1pbnZhbGlkIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGVhckVycnMoKSB7CiAgICBbIk4iLCAiRCIsICJTdXQiLCAiU3MiLCAiUCIsICJWIiwgIk0iLCAiU3BhY2luZyIsICJOc2YiXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgIHNldEVycihrLCAiIik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7CiAgICB2YXIgbWV0cmljID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyI7CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXVuaXQ9J2QnXSIpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA\/ICJtbSIgOiAiaW4iOwogICAgfSk7CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXVuaXQ9J3MnXSIpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA\/ICJtbSIgOiAiaW4iOwogICAgfSk7CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXVuaXQ9J3N0cmVzcyddIikuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICBuLnRleHRDb250ZW50ID0gbWV0cmljID8gIk1QYSIgOiAicHNpIjsKICAgIH0pOwogICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS11bml0PSdzcGFjaW5nJ10iKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgIG4udGV4dENvbnRlbnQgPSBtZXRyaWMgPyAibW0iIDogImluIjsKICAgIH0pOwogICAgaWYgKGVsLmJ0bk1ldHJpYykgZWwuYnRuTWV0cmljLmNsYXNzTGlzdC50b2dnbGUoIm1qbGQtaXMtYWN0aXZlIiwgbWV0cmljKTsKICAgIGlmIChlbC5idG5JbXBlcmlhbCkgZWwuYnRuSW1wZXJpYWwuY2xhc3NMaXN0LnRvZ2dsZSgibWpsZC1pcy1hY3RpdmUiLCAhbWV0cmljKTsKICB9CgogIGZ1bmN0aW9uIGZvcmNlVG9OKHZhbHVlLCB1bml0KSB7CiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIE5hTjsKICAgIGlmICh1bml0ID09PSAia04iKSByZXR1cm4gdmFsdWUgKiAxMDAwOwogICAgaWYgKHVuaXQgPT09ICJsYmYiKSByZXR1cm4gdmFsdWUgKiBOX1BFUl9MQkY7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBmdW5jdGlvbiBtb21lbnRUb05tKHZhbHVlLCB1bml0KSB7CiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIE5hTjsKICAgIGlmICh1bml0ID09PSAibGJmZnQiKSByZXR1cm4gdmFsdWUgKiBOX1BFUl9MQkYgKiBNX1BFUl9GVDsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIGZ1bmN0aW9uIGNvbnZlcnRGb3JjZVVuaXRWYWx1ZSh2YWx1ZSwgZnJvbVUsIHRvVSkgewogICAgdmFyIG4gPSBmb3JjZVRvTih2YWx1ZSwgZnJvbVUpOwogICAgaWYgKCFpc0Zpbml0ZShuKSkgcmV0dXJuIHZhbHVlOwogICAgaWYgKHRvVSA9PT0gImtOIikgcmV0dXJuIG4gLyAxMDAwOwogICAgaWYgKHRvVSA9PT0gImxiZiIpIHJldHVybiBuICogTEJGX1BFUl9OOwogICAgcmV0dXJuIG47CiAgfQoKICBmdW5jdGlvbiBjb252ZXJ0TW9tZW50VW5pdFZhbHVlKHZhbHVlLCBmcm9tVSwgdG9VKSB7CiAgICB2YXIgbm0gPSBtb21lbnRUb05tKHZhbHVlLCBmcm9tVSk7CiAgICBpZiAoIWlzRmluaXRlKG5tKSkgcmV0dXJuIHZhbHVlOwogICAgaWYgKHRvVSA9PT0gImxiZmZ0IikgcmV0dXJuIG5tICogTEJGX1BFUl9OICogRlRfUEVSX007CiAgICByZXR1cm4gbm07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRGb3JjZShOKSB7CiAgICBpZiAoIWlzRmluaXRlKE4pKSByZXR1cm4geyBwcmltYXJ5OiAi4oCUIiwgc2Vjb25kYXJ5OiAiIiB9OwogICAgaWYgKHN0YXRlLnVuaXQgPT09ICJpbXBlcmlhbCIpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBwcmltYXJ5OiBmbXQoTiAqIExCRl9QRVJfTiwgMSkgKyAiIGxiZiIsCiAgICAgICAgc2Vjb25kYXJ5OiBmbXQoTiAvIDEwMDAsIDIpICsgIiBrTiAgLyAgIiArIGZtdChOLCAwKSArICIgTiIKICAgICAgfTsKICAgIH0KICAgIGlmIChNYXRoLmFicyhOKSA+PSAxMDAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcHJpbWFyeTogZm10KE4gLyAxMDAwLCAyKSArICIga04iLAogICAgICAgIHNlY29uZGFyeTogZm10KE4sIDApICsgIiBOICAvICAiICsgZm10KE4gKiBMQkZfUEVSX04sIDEpICsgIiBsYmYiCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICBwcmltYXJ5OiBmbXQoTiwgMSkgKyAiIE4iLAogICAgICBzZWNvbmRhcnk6IGZtdChOICogTEJGX1BFUl9OLCAxKSArICIgbGJmIgogICAgfTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFN0cmVzcyhNUGEpIHsKICAgIGlmICghaXNGaW5pdGUoTVBhKSkgcmV0dXJuIHsgcHJpbWFyeTogIuKAlCIsIHNlY29uZGFyeTogIiIgfTsKICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcHJpbWFyeTogZm10KE1QYSAqIFBTSV9QRVJfTVBBLCAwKSArICIgcHNpIiwKICAgICAgICBzZWNvbmRhcnk6IGZtdChNUGEsIDEpICsgIiBNUGEiCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICBwcmltYXJ5OiBmbXQoTVBhLCAxKSArICIgTVBhIiwKICAgICAgc2Vjb25kYXJ5OiBmbXQoTVBhICogUFNJX1BFUl9NUEEsIDApICsgIiBwc2kiCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0TW9tZW50KE5tKSB7CiAgICBpZiAoIWlzRmluaXRlKE5tKSkgcmV0dXJuIHsgcHJpbWFyeTogIuKAlCIsIHNlY29uZGFyeTogIiIgfTsKICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSB7CiAgICAgIHZhciBsYmZmdCA9IE5tICogTEJGX1BFUl9OICogRlRfUEVSX007CiAgICAgIHJldHVybiB7IHByaW1hcnk6IGZtdChsYmZmdCwgMSkgKyAiIGxiZsK3ZnQiLCBzZWNvbmRhcnk6IGZtdChObSwgMSkgKyAiIE7Ct20iIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICBwcmltYXJ5OiBmbXQoTm0sIDEpICsgIiBOwrdtIiwKICAgICAgc2Vjb25kYXJ5OiBmbXQoTm0gKiBMQkZfUEVSX04gKiBGVF9QRVJfTSwgMSkgKyAiIGxiZsK3ZnQiCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gbGVuZ3RoVG9NbSh2KSB7CiAgICByZXR1cm4gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyB2IDogdiAqIE1NX1BFUl9JTjsKICB9CgogIGZ1bmN0aW9uIHNoYW5rQXJlYU1tMihkRGlzcCkgewogICAgdmFyIGRtbSA9IGxlbmd0aFRvTW0oZERpc3ApOwogICAgaWYgKCEoZG1tID4gMCkpIHJldHVybiBOYU47CiAgICByZXR1cm4gTWF0aC5QSSAvIDQgKiBkbW0gKiBkbW07CiAgfQoKICBmdW5jdGlvbiBhcHBseUdyYWRlKCkgewogICAgdmFyIGcgPSBHUkFERVNbZWwuZ3JhZGUudmFsdWVdOwogICAgaWYgKCFnKSB7CiAgICAgIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOwogICAgICBlbC5zcy5yZWFkT25seSA9IGZhbHNlOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGF0ZS5hcHBseWluZyA9IHRydWU7CiAgICB2YXIgbWV0cmljID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyI7CiAgICBlbC5zdXQudmFsdWUgPSBtZXRyaWMgPyBTdHJpbmcoZy5zdXQpIDogcm91bmRTbWFydChnLnN1dCAqIFBTSV9QRVJfTVBBKTsKICAgIGVsLnNzLnZhbHVlID0gbWV0cmljID8gU3RyaW5nKGcuc3MpIDogcm91bmRTbWFydChnLnNzICogUFNJX1BFUl9NUEEpOwogICAgZWwuc3V0LnJlYWRPbmx5ID0gdHJ1ZTsKICAgIGVsLnNzLnJlYWRPbmx5ID0gdHJ1ZTsKICAgIHN0YXRlLmFwcGx5aW5nID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBtYXJrQ3VzdG9tR3JhZGUoKSB7CiAgICBpZiAoc3RhdGUuYXBwbHlpbmcpIHJldHVybjsKICAgIGlmIChlbC5ncmFkZS52YWx1ZSAhPT0gImN1c3RvbSIpIGVsLmdyYWRlLnZhbHVlID0gImN1c3RvbSI7CiAgICBlbC5zdXQucmVhZE9ubHkgPSBmYWxzZTsKICAgIGVsLnNzLnJlYWRPbmx5ID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBncmlkRGltcyhuKSB7CiAgICB2YXIgY29scyA9IE1hdGguY2VpbChNYXRoLnNxcnQobikpOwogICAgdmFyIHJvd3MgPSBNYXRoLmNlaWwobiAvIGNvbHMpOwogICAgcmV0dXJuIHsgY29sczogY29scywgcm93czogcm93cyB9OwogIH0KCiAgZnVuY3Rpb24gZ2VuZXJhdGVQb3NpdGlvbnMobiwgYXJyYW5nZW1lbnQsIHNwYWNpbmdEaXNwKSB7CiAgICB2YXIgcyA9IGxlbmd0aFRvTW0oc3BhY2luZ0Rpc3ApOwogICAgdmFyIGJvbHRzID0gW107CiAgICB2YXIgaSwgaiwgaWR4LCBnZCwgcmFkaXVzLCBhbmdsZSwgeDAsIHkwLCBjb2xzLCByb3dzOwoKICAgIGlmIChhcnJhbmdlbWVudCA9PT0gImNpcmN1bGFyIikgewogICAgICByYWRpdXMgPSBuID4gMSA\/IChzICogbikgLyAoMiAqIE1hdGguUEkpIDogMDsKICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGFuZ2xlID0gKDIgKiBNYXRoLlBJICogaSkgLyBuIC0gTWF0aC5QSSAvIDI7CiAgICAgICAgYm9sdHMucHVzaCh7CiAgICAgICAgICBpZDogaSArIDEsCiAgICAgICAgICB4OiByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSksCiAgICAgICAgICB5OiByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSksCiAgICAgICAgICByOiByYWRpdXMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gYm9sdHM7CiAgICB9CgogICAgaWYgKGFycmFuZ2VtZW50ID09PSAibGluZWFyIikgewogICAgICB4MCA9IC0oKG4gLSAxKSAqIHMpIC8gMjsKICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGJvbHRzLnB1c2goewogICAgICAgICAgaWQ6IGkgKyAxLAogICAgICAgICAgeDogeDAgKyBpICogcywKICAgICAgICAgIHk6IDAsCiAgICAgICAgICByOiBNYXRoLmFicyh4MCArIGkgKiBzKQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBib2x0czsKICAgIH0KCiAgICBpZiAoYXJyYW5nZW1lbnQgPT09ICJyZWN0YW5ndWxhciIpIHsKICAgICAgZ2QgPSBncmlkRGltcyhuKTsKICAgICAgY29scyA9IGdkLmNvbHM7CiAgICAgIHJvd3MgPSBnZC5yb3dzOwogICAgICB4MCA9IC0oKGNvbHMgLSAxKSAqIHMpIC8gMjsKICAgICAgeTAgPSAtKChyb3dzIC0gMSkgKiBzKSAvIDI7CiAgICAgIGlkeCA9IDA7CiAgICAgIGZvciAoaiA9IDA7IGogPCByb3dzOyBqKyspIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sczsgaSsrKSB7CiAgICAgICAgICBpZiAoaWR4ID49IG4pIGJyZWFrOwogICAgICAgICAgdmFyIHggPSB4MCArIGkgKiBzOwogICAgICAgICAgdmFyIHkgPSB5MCArIGogKiBzOwogICAgICAgICAgYm9sdHMucHVzaCh7IGlkOiBpZHggKyAxLCB4OiB4LCB5OiB5LCByOiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSkgfSk7CiAgICAgICAgICBpZHgrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJvbHRzOwogICAgfQoKICAgIHJldHVybiByZWFkQ3VzdG9tUG9zaXRpb25zKG4pOwogIH0KCiAgZnVuY3Rpb24gcmVhZEN1c3RvbVBvc2l0aW9ucyhuKSB7CiAgICB2YXIgYm9sdHMgPSBbXTsKICAgIHZhciByb3dzID0gZWwuY3VzdG9tVGFibGUgPyBlbC5jdXN0b21UYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCJ0cltkYXRhLWJvbHRdIikgOiBbXTsKICAgIHZhciBpLCByb3csIHhJbiwgeUluLCB4LCB5OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICByb3cgPSByb3dzW2ldOwogICAgICBpZiAocm93KSB7CiAgICAgICAgeEluID0gcGFyc2VGbG9hdChyb3cucXVlcnlTZWxlY3RvcigiLm1qbGQtY3giKS52YWx1ZSk7CiAgICAgICAgeUluID0gcGFyc2VGbG9hdChyb3cucXVlcnlTZWxlY3RvcigiLm1qbGQtY3kiKS52YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgeEluID0gMDsKICAgICAgICB5SW4gPSAwOwogICAgICB9CiAgICAgIHggPSBsZW5ndGhUb01tKGlzRmluaXRlKHhJbikgPyB4SW4gOiAwKTsKICAgICAgeSA9IGxlbmd0aFRvTW0oaXNGaW5pdGUoeUluKSA\/IHlJbiA6IDApOwogICAgICBib2x0cy5wdXNoKHsgaWQ6IGkgKyAxLCB4OiB4LCB5OiB5LCByOiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSkgfSk7CiAgICB9CiAgICByZXR1cm4gYm9sdHM7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJDdXN0b21UYWJsZSgpIHsKICAgIGlmICghZWwuY3VzdG9tV3JhcCB8fCAhZWwuY3VzdG9tVGFibGUpIHJldHVybjsKICAgIHZhciBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNjQsIE1hdGguZmxvb3IobnVtKGVsLm4pKSB8fCAxKSk7CiAgICB2YXIgYXJyYW5nZW1lbnQgPSBlbC5hcnJhbmdlbWVudC52YWx1ZTsKICAgIHZhciBzaG93ID0gYXJyYW5nZW1lbnQgPT09ICJjdXN0b20iOwogICAgZWwuY3VzdG9tV3JhcC5jbGFzc0xpc3QudG9nZ2xlKCJtamxkLWhpZGRlbiIsICFzaG93KTsKICAgIGlmICghc2hvdykgcmV0dXJuOwoKICAgIHZhciBleGlzdGluZyA9IHt9OwogICAgZWwuY3VzdG9tVGFibGUucXVlcnlTZWxlY3RvckFsbCgidHJbZGF0YS1ib2x0XSIpLmZvckVhY2goZnVuY3Rpb24gKHRyKSB7CiAgICAgIHZhciBpZCA9IHBhcnNlSW50KHRyLmdldEF0dHJpYnV0ZSgiZGF0YS1ib2x0IiksIDEwKTsKICAgICAgZXhpc3RpbmdbaWRdID0gewogICAgICAgIHg6IHRyLnF1ZXJ5U2VsZWN0b3IoIi5tamxkLWN4IikudmFsdWUsCiAgICAgICAgeTogdHIucXVlcnlTZWxlY3RvcigiLm1qbGQtY3kiKS52YWx1ZQogICAgICB9OwogICAgfSk7CgogICAgdmFyIGh0bWwgPSAiIjsKICAgIHZhciBhdXRvID0gZ2VuZXJhdGVQb3NpdGlvbnMobiwgZWwuYXJyYW5nZW1lbnQudmFsdWUgPT09ICJjdXN0b20iID8gImNpcmN1bGFyIiA6IGVsLmFycmFuZ2VtZW50LnZhbHVlLCBudW0oZWwuc3BhY2luZykpOwogICAgdmFyIHVuaXQgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIiA\/ICJtbSIgOiAiaW4iOwogICAgdmFyIGksIGF4LCBheSwgcHJlZjsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgcHJlZiA9IGV4aXN0aW5nW2kgKyAxXTsKICAgICAgaWYgKHByZWYpIHsKICAgICAgICBheCA9IHByZWYueDsKICAgICAgICBheSA9IHByZWYueTsKICAgICAgfSBlbHNlIHsKICAgICAgICBheCA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiID8gcm91bmRTbWFydChhdXRvW2ldLngpIDogcm91bmRTbWFydChhdXRvW2ldLnggLyBNTV9QRVJfSU4pOwogICAgICAgIGF5ID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyByb3VuZFNtYXJ0KGF1dG9baV0ueSkgOiByb3VuZFNtYXJ0KGF1dG9baV0ueSAvIE1NX1BFUl9JTik7CiAgICAgIH0KICAgICAgaHRtbCArPSAiPHRyIGRhdGEtYm9sdD1cIiIgKyAoaSArIDEpICsgIlwiPiIgKwogICAgICAgICI8dGQ+QiIgKyAoaSArIDEpICsgIjwvdGQ+IiArCiAgICAgICAgIjx0ZD48aW5wdXQgY2xhc3M9XCJtamxkLWN4XCIgdHlwZT1cIm51bWJlclwiIHN0ZXA9XCJhbnlcIiB2YWx1ZT1cIiIgKyBheCArICJcIiBhcmlhLWxhYmVsPVwiQm9sdCAiICsgKGkgKyAxKSArICIgWFwiIC8+PC90ZD4iICsKICAgICAgICAiPHRkPjxpbnB1dCBjbGFzcz1cIm1qbGQtY3lcIiB0eXBlPVwibnVtYmVyXCIgc3RlcD1cImFueVwiIHZhbHVlPVwiIiArIGF5ICsgIlwiIGFyaWEtbGFiZWw9XCJCb2x0ICIgKyAoaSArIDEpICsgIiBZXCIgLz48L3RkPiIgKwogICAgICAgICI8dGQgY2xhc3M9XCJtamxkLW1vbm8gbWpsZC1kaXN0XCIgZGF0YS1ib2x0PVwiIiArIChpICsgMSkgKyAiXCI+4oCUPC90ZD4iICsKICAgICAgICAiPHRkIGNsYXNzPVwibWpsZC11bml0LWhpbnRcIj4iICsgdW5pdCArICI8L3RkPjwvdHI+IjsKICAgIH0KICAgIGVsLmN1c3RvbVRhYmxlLnF1ZXJ5U2VsZWN0b3IoInRib2R5IikuaW5uZXJIVE1MID0gaHRtbDsKICB9CgogIGZ1bmN0aW9uIHRvU0koKSB7CiAgICB2YXIgbWV0cmljID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyI7CiAgICB2YXIgc3V0RGlzcCA9IG51bShlbC5zdXQpOwogICAgdmFyIHNzRGlzcCA9IG51bShlbC5zcyk7CiAgICByZXR1cm4gewogICAgICBuOiBNYXRoLmZsb29yKG51bShlbC5uKSksCiAgICAgIGFycmFuZ2VtZW50OiBlbC5hcnJhbmdlbWVudC52YWx1ZSwKICAgICAgZF9tbTogbGVuZ3RoVG9NbShudW0oZWwuZCkpLAogICAgICBzdXRfTVBhOiBtZXRyaWMgPyBzdXREaXNwIDogc3V0RGlzcCAvIFBTSV9QRVJfTVBBLAogICAgICBzc19NUGE6IG1ldHJpYyA\/IHNzRGlzcCA6IHNzRGlzcCAvIFBTSV9QRVJfTVBBLAogICAgICBQX046IGZvcmNlVG9OKG51bShlbC5QKSwgZWwucFVuaXQudmFsdWUpLAogICAgICBWX046IGZvcmNlVG9OKG51bShlbC5WKSwgZWwudlVuaXQudmFsdWUpLAogICAgICBNX05tOiBtb21lbnRUb05tKG51bShlbC5NKSwgZWwubVVuaXQudmFsdWUpLAogICAgICBzcGFjaW5nX21tOiBsZW5ndGhUb01tKG51bShlbC5zcGFjaW5nKSksCiAgICAgIGxvYWREaXI6IGVsLmxvYWREaXIudmFsdWUsCiAgICAgIG5zZjogbnVtKGVsLm5zZikKICAgIH07CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZShzaSkgewogICAgdmFyIG9rID0gdHJ1ZTsKICAgIGNsZWFyRXJycygpOwoKICAgIGlmIChlbXB0eShlbC5uKSB8fCAhaXNGaW5pdGUobnVtKGVsLm4pKSkgewogICAgICBzZXRFcnIoIk4iLCAiRW50ZXIgdGhlIG51bWJlciBvZiBib2x0cy4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIShzaS5uID49IDEpIHx8IHNpLm4gIT09IG51bShlbC5uKSkgewogICAgICBzZXRFcnIoIk4iLCAiTnVtYmVyIG9mIGJvbHRzIG11c3QgYmUgYW4gaW50ZWdlciDiiaUgMS4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoc2kubiA+IDY0KSB7CiAgICAgIHNldEVycigiTiIsICJNYXhpbXVtIDY0IGJvbHRzIHN1cHBvcnRlZCBpbiB0aGlzIHRvb2wuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgaWYgKGVtcHR5KGVsLmQpIHx8ICEoc2kuZF9tbSA+IDApKSB7CiAgICAgIHNldEVycigiRCIsICJFbnRlciBhIHZhbGlkIGJvbHQgZGlhbWV0ZXIuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHNpLmRfbW0gPCAyIHx8IHNpLmRfbW0gPiAxNTApIHsKICAgICAgc2V0RXJyKCJEIiwgIkRpYW1ldGVyIGxvb2tzIHVucmVhbGlzdGljICh0eXBpY2FsIHJhbmdlIH4y4oCTMTUwIG1tKS4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KCiAgICBpZiAoZW1wdHkoZWwuc3V0KSB8fCAhKHNpLnN1dF9NUGEgPiAwKSkgewogICAgICBzZXRFcnIoIlN1dCIsICJFbnRlciB0ZW5zaWxlIHN0cmVuZ3RoLiIpOwogICAgICBvayA9IGZhbHNlOwogICAgfQogICAgaWYgKGVtcHR5KGVsLnNzKSB8fCAhKHNpLnNzX01QYSA+IDApKSB7CiAgICAgIHNldEVycigiU3MiLCAiRW50ZXIgc2hlYXIgc3RyZW5ndGguIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgaWYgKHNpLmxvYWREaXIgPT09ICJheGlhbCIgfHwgc2kubG9hZERpciA9PT0gImNvbWJpbmVkIikgewogICAgICBpZiAoZW1wdHkoZWwuUCkpIHsKICAgICAgICBzZXRFcnIoIlAiLCAiRW50ZXIgdG90YWwgdGVuc2lsZSBsb2FkLiIpOwogICAgICAgIG9rID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoIShzaS5QX04gPj0gMCkpIHsKICAgICAgICBzZXRFcnIoIlAiLCAiVGVuc2lsZSBsb2FkIGNhbm5vdCBiZSBuZWdhdGl2ZS4iKTsKICAgICAgICBvayA9IGZhbHNlOwogICAgICB9CiAgICB9CgogICAgaWYgKHNpLmxvYWREaXIgPT09ICJzaGVhciIgfHwgc2kubG9hZERpciA9PT0gImNvbWJpbmVkIikgewogICAgICBpZiAoZW1wdHkoZWwuVikpIHsKICAgICAgICBzZXRFcnIoIlYiLCAiRW50ZXIgdG90YWwgc2hlYXIgbG9hZC4iKTsKICAgICAgICBvayA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKCEoc2kuVl9OID49IDApKSB7CiAgICAgICAgc2V0RXJyKCJWIiwgIlNoZWFyIGxvYWQgY2Fubm90IGJlIG5lZ2F0aXZlLiIpOwogICAgICAgIG9rID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc2kubG9hZERpciA9PT0gImJlbmRpbmciIHx8IHNpLmxvYWREaXIgPT09ICJjb21iaW5lZCIpIHsKICAgICAgaWYgKGVtcHR5KGVsLk0pKSB7CiAgICAgICAgc2V0RXJyKCJNIiwgIkVudGVyIGFwcGxpZWQgbW9tZW50LiIpOwogICAgICAgIG9rID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoIShzaS5NX05tID49IDApKSB7CiAgICAgICAgc2V0RXJyKCJNIiwgIk1vbWVudCBjYW5ub3QgYmUgbmVnYXRpdmUuIik7CiAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChlbXB0eShlbC5zcGFjaW5nKSB8fCAhKHNpLnNwYWNpbmdfbW0gPiAwKSkgewogICAgICBzZXRFcnIoIlNwYWNpbmciLCAiRW50ZXIgYm9sdCBjZW50ZXIgc3BhY2luZy4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoc2kuc3BhY2luZ19tbSA8IHNpLmRfbW0pIHsKICAgICAgc2V0RXJyKCJTcGFjaW5nIiwgIlNwYWNpbmcgc2hvdWxkIGV4Y2VlZCBib2x0IGRpYW1ldGVyIGZvciByZWFsaXN0aWMgbGF5b3V0cy4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoc2kuc3BhY2luZ19tbSA+IDUwMCkgewogICAgICBzZXRFcnIoIlNwYWNpbmciLCAiU3BhY2luZyBsb29rcyB1bnVzdWFsbHkgbGFyZ2UuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgaWYgKGVtcHR5KGVsLm5zZikgfHwgIShzaS5uc2YgPiAwKSkgewogICAgICBzZXRFcnIoIk5zZiIsICJFbnRlciBkZXNpZ24gc2FmZXR5IGZhY3Rvci4iKTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoc2kubnNmIDwgMSB8fCBzaS5uc2YgPiAxMikgewogICAgICBzZXRFcnIoIk5zZiIsICJVc2UgYSBzYWZldHkgZmFjdG9yIGJldHdlZW4gMSBhbmQgMTIuIik7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIG9rOwogIH0KCiAgZnVuY3Rpb24gYW5hbHl6ZShzaSkgewogICAgdmFyIGJvbHRzID0gc2kuYXJyYW5nZW1lbnQgPT09ICJjdXN0b20iCiAgICAgID8gcmVhZEN1c3RvbVBvc2l0aW9ucyhzaS5uKQogICAgICA6IGdlbmVyYXRlUG9zaXRpb25zKHNpLm4sIHNpLmFycmFuZ2VtZW50LCBudW0oZWwuc3BhY2luZykpOwoKICAgIHZhciBuID0gc2kubjsKICAgIHZhciBBcyA9IHNoYW5rQXJlYU1tMihudW0oZWwuZCkpOwogICAgdmFyIHVzZVAgPSBzaS5sb2FkRGlyID09PSAiYXhpYWwiIHx8IHNpLmxvYWREaXIgPT09ICJjb21iaW5lZCI7CiAgICB2YXIgdXNlViA9IHNpLmxvYWREaXIgPT09ICJzaGVhciIgfHwgc2kubG9hZERpciA9PT0gImNvbWJpbmVkIjsKICAgIHZhciB1c2VNID0gc2kubG9hZERpciA9PT0gImJlbmRpbmciIHx8IHNpLmxvYWREaXIgPT09ICJjb21iaW5lZCI7CgogICAgdmFyIFAgPSB1c2VQID8gc2kuUF9OIDogMDsKICAgIHZhciBWID0gdXNlViA\/IHNpLlZfTiA6IDA7CiAgICB2YXIgTSA9IHVzZU0gPyBzaS5NX05tIDogMDsKCiAgICB2YXIgc3VtUjIgPSAwOwogICAgdmFyIHN1bVkyID0gMDsKICAgIGJvbHRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgc3VtUjIgKz0gYi54ICogYi54ICsgYi55ICogYi55OwogICAgICBzdW1ZMiArPSBiLnkgKiBiLnk7CiAgICB9KTsKICAgIGlmIChzdW1SMiA8IDFlLTkpIHN1bVIyID0gMTsKICAgIGlmIChzdW1ZMiA8IDFlLTkpIHN1bVkyID0gc3VtUjI7CgogICAgdmFyIEZ0MCA9IFAgLyBuOwogICAgdmFyIEZzMCA9IFYgLyBuOwogICAgdmFyIG1heElkeCA9IDA7CiAgICB2YXIgbWF4Q29tYmluZWQgPSAtMTsKICAgIHZhciB0b3RhbExvYWQgPSAwOwoKICAgIGJvbHRzLmZvckVhY2goZnVuY3Rpb24gKGIsIGlkeCkgewogICAgICB2YXIgRm0gPSB1c2VNID8gKE0gKiBiLnIpIC8gc3VtUjIgOiAwOwogICAgICB2YXIgRm1TaWduZWQgPSB1c2VNID8gKE0gKiBiLnkpIC8gc3VtWTIgOiAwOwogICAgICBiLkZ0X2RpcmVjdCA9IEZ0MDsKICAgICAgYi5GcyA9IEZzMDsKICAgICAgYi5GbSA9IEZtOwogICAgICBiLkZ0ID0gRnQwICsgRm1TaWduZWQ7CiAgICAgIGlmIChiLkZ0IDwgMCkgYi5GdCA9IDA7CiAgICAgIGIuRmNvbWJpbmVkID0gTWF0aC5zcXJ0KGIuRnQgKiBiLkZ0ICsgYi5GcyAqIGIuRnMpOwogICAgICBiLnNpZ21hVCA9IGIuRnQgLyBBczsKICAgICAgYi50YXUgPSBiLkZzIC8gQXM7CiAgICAgIGIuc2lnbWFDb21iID0gTWF0aC5zcXJ0KGIuc2lnbWFUICogYi5zaWdtYVQgKyBiLnRhdSAqIGIudGF1KTsKICAgICAgYi5wY3RUID0gUCA+IDAgPyAoYi5GdCAvIFApICogMTAwIDogMDsKICAgICAgYi5wY3RWID0gViA+IDAgPyAoYi5GcyAvIFYpICogMTAwIDogMDsKICAgICAgdG90YWxMb2FkICs9IGIuRmNvbWJpbmVkOwogICAgICBpZiAoYi5GY29tYmluZWQgPiBtYXhDb21iaW5lZCkgewogICAgICAgIG1heENvbWJpbmVkID0gYi5GY29tYmluZWQ7CiAgICAgICAgbWF4SWR4ID0gaWR4OwogICAgICB9CiAgICB9KTsKCiAgICB2YXIgc2lnbWFBbGxvdyA9IHNpLnN1dF9NUGEgLyBzaS5uc2Y7CiAgICB2YXIgdGF1QWxsb3cgPSBzaS5zc19NUGEgLyBzaS5uc2Y7CiAgICB2YXIgY3JpdCA9IGJvbHRzW21heElkeF07CiAgICB2YXIgdXRpbFQgPSBjcml0LnNpZ21hVCAvIHNpZ21hQWxsb3c7CiAgICB2YXIgdXRpbFMgPSBjcml0LnRhdSAvIHRhdUFsbG93OwogICAgdmFyIHV0aWxDb21iID0gY3JpdC5zaWdtYUNvbWIgLyBNYXRoLm1pbihzaWdtYUFsbG93LCB0YXVBbGxvdyAqIE1hdGguc3FydCgzKSk7CiAgICB2YXIgdXRpbCA9IE1hdGgubWF4KHV0aWxULCB1dGlsUywgdXRpbENvbWIpICogMTAwOwogICAgdmFyIHNmQWxsb3cgPSAxIC8gTWF0aC5tYXgodXRpbFQsIHV0aWxTLCAwLjAwMDEpOwogICAgdmFyIHNmVWx0ID0gc2kuc3V0X01QYSAvIE1hdGgubWF4KGNyaXQuc2lnbWFDb21iLCAwLjAwMDEpOwoKICAgIHJldHVybiB7CiAgICAgIGJvbHRzOiBib2x0cywKICAgICAgQXM6IEFzLAogICAgICBQOiBQLAogICAgICBWOiBWLAogICAgICBNOiBNLAogICAgICB0b3RhbExvYWQ6IHRvdGFsTG9hZCwKICAgICAgbWF4SWR4OiBtYXhJZHgsCiAgICAgIGNyaXQ6IGNyaXQsCiAgICAgIHNpZ21hQWxsb3c6IHNpZ21hQWxsb3csCiAgICAgIHRhdUFsbG93OiB0YXVBbGxvdywKICAgICAgdXRpbDogdXRpbCwKICAgICAgc2Y6IHNmQWxsb3csCiAgICAgIHNmVWx0OiBzZlVsdAogICAgfTsKICB9CgogIGZ1bmN0aW9uIHN0YXR1c0Zyb21VdGlsKHV0aWxQY3QsIHNmKSB7CiAgICBpZiAodXRpbFBjdCA+IDEwMCB8fCBzZiA8IDEpIHsKICAgICAgcmV0dXJuIHsga2V5OiAicmlzayIsIHRpdGxlOiAiRmFpbHVyZSBSaXNrIiwgbm90ZTogIkF0IGxlYXN0IG9uZSBib2x0IGV4Y2VlZHMgYWxsb3dhYmxlIHN0cmVuZ3RoLiBSZWR1Y2UgbG9hZCwgYWRkIGJvbHRzLCBpbmNyZWFzZSBkaWFtZXRlciBvciBncmFkZSwgb3IgcmV2aXNlIHRoZSBwYXR0ZXJuIGJlZm9yZSB1c2luZyB0aGlzIGNvbm5lY3Rpb24uIiB9OwogICAgfQogICAgaWYgKHV0aWxQY3QgPj0gODUgfHwgc2YgPCAxLjE1KSB7CiAgICAgIHJldHVybiB7IGtleTogImNhdXRpb24iLCB0aXRsZTogIldhcm5pbmciLCBub3RlOiAiT25lIG9yIG1vcmUgYm9sdHMgYXBwcm9hY2ggbWF4aW11bSBjYXBhY2l0eS4gVmVyaWZ5IGpvaW50IHN0aWZmbmVzcywgcHJlbG9hZCwgYW5kIGFwcGxpY2FibGUgY29kZXMuIiB9OwogICAgfQogICAgcmV0dXJuIHsga2V5OiAib2siLCB0aXRsZTogIlNhZmUiLCBub3RlOiAiQWxsIGJvbHRzIG9wZXJhdGUgd2l0aGluIGFsbG93YWJsZSBsaW1pdHMgZm9yIHRoaXMgc2ltcGxpZmllZCBCb2x0IEdyb3VwIEFuYWx5c2lzIENhbGN1bGF0b3IgbW9kZWwuIiB9OwogIH0KCiAgZnVuY3Rpb24gc2V0R2F1Z2Uoc2YpIHsKICAgIHZhciBmcmFjID0gY2xhbXAoKGlzRmluaXRlKHNmKSA\/IHNmIDogMCkgLyA0LCAwLCAxKTsKICAgIGlmIChlbC5nYXVnZUFyYykgZWwuZ2F1Z2VBcmMuc2V0QXR0cmlidXRlKCJzdHJva2UtZGFzaG9mZnNldCIsIFN0cmluZyhBUkNfTEVOICogKDEgLSBmcmFjKSkpOwogICAgdmFyIGFuZyA9IC05MCArIGZyYWMgKiAxODA7CiAgICBpZiAoZWwubmVlZGxlKSBlbC5uZWVkbGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCAicm90YXRlKCIgKyBhbmcgKyAiIDEyMCAxMTgpIik7CiAgfQoKICBmdW5jdGlvbiBzdHJlc3NDb2xvcih1dGlsUGN0KSB7CiAgICBpZiAodXRpbFBjdCA+IDEwMCkgcmV0dXJuICIjZGMyNjI2IjsKICAgIGlmICh1dGlsUGN0ID49IDg1KSByZXR1cm4gIiNkOTc3MDYiOwogICAgcmV0dXJuICIjMDU5NjY5IjsKICB9CgogIGZ1bmN0aW9uIGRyYXdMYXlvdXQocmVzKSB7CiAgICBpZiAoIWVsLmxheW91dFN2ZykgcmV0dXJuOwogICAgdmFyIHN2ZyA9IGVsLmxheW91dFN2ZzsKICAgIHZhciBib2x0cyA9IHJlcy5ib2x0czsKICAgIHZhciB3ID0gMjgwLCBoID0gMjgwLCBjeCA9IDE0MCwgY3kgPSAxNDA7CiAgICB2YXIgbWF4UiA9IDE7CiAgICBib2x0cy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CiAgICAgIG1heFIgPSBNYXRoLm1heChtYXhSLCBNYXRoLmFicyhiLngpLCBNYXRoLmFicyhiLnkpKTsKICAgIH0pOwogICAgdmFyIHNjYWxlID0gbWF4UiA+IDAgPyAxMDAgLyBtYXhSIDogMTsKICAgIHZhciBtYXhGID0gcmVzLmNyaXQuRmNvbWJpbmVkIHx8IDE7CiAgICB2YXIgaHRtbCA9ICIiOwoKICAgIGh0bWwgKz0gIjxyZWN0IHg9XCI4XCIgeT1cIjhcIiB3aWR0aD1cIjI2NFwiIGhlaWdodD1cIjI2NFwiIHJ4PVwiMTBcIiBmaWxsPVwiI2Y4ZmFmY1wiIHN0cm9rZT1cIiNkNGRkZThcIi8+IjsKICAgIGh0bWwgKz0gIjxjaXJjbGUgY3g9XCIiICsgY3ggKyAiXCIgY3k9XCIiICsgY3kgKyAiXCIgcj1cIjNcIiBmaWxsPVwiIzY0NzQ4YlwiLz4iOwogICAgaHRtbCArPSAiPHRleHQgeD1cIiIgKyBjeCArICJcIiB5PVwiMjRcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiIGNsYXNzPVwibWpsZC1zdmctbGFiZWxcIj5Cb2x0IGxheW91dCAoY2VudHJvaWQgYXQgY2VudGVyKTwvdGV4dD4iOwoKICAgIGJvbHRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgdmFyIHB4ID0gY3ggKyBiLnggKiBzY2FsZTsKICAgICAgdmFyIHB5ID0gY3kgLSBiLnkgKiBzY2FsZTsKICAgICAgdmFyIHV0aWwgPSAoYi5GY29tYmluZWQgLyAocmVzLmNyaXQuRmNvbWJpbmVkIHx8IDEpKSAqIHJlcy51dGlsOwogICAgICB2YXIgZmlsbCA9IHN0cmVzc0NvbG9yKHV0aWwpOwogICAgICB2YXIgciA9IGNsYW1wKDYgKyAoYi5GY29tYmluZWQgLyBtYXhGKSAqIDgsIDYsIDE2KTsKICAgICAgaHRtbCArPSAiPGNpcmNsZSBjeD1cIiIgKyBweCArICJcIiBjeT1cIiIgKyBweSArICJcIiByPVwiIiArIHIgKyAiXCIgZmlsbD1cIiIgKyBmaWxsICsgIlwiIHN0cm9rZT1cIiMwZjE3MmFcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBvcGFjaXR5PVwiMC45MlwiLz4iOwogICAgICBodG1sICs9ICI8dGV4dCB4PVwiIiArIHB4ICsgIlwiIHk9XCIiICsgKHB5ICsgNCkgKyAiXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBmaWxsPVwiI2ZmZlwiIGZvbnQtc2l6ZT1cIjlcIiBmb250LXdlaWdodD1cIjcwMFwiPiIgKyBiLmlkICsgIjwvdGV4dD4iOwoKICAgICAgaWYgKGIuRmNvbWJpbmVkID4gMCkgewogICAgICAgIHZhciBhbGVuID0gY2xhbXAoMTIgKyAoYi5GY29tYmluZWQgLyBtYXhGKSAqIDI4LCAxMCwgNDApOwogICAgICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoLWIueSwgYi54KTsKICAgICAgICBpZiAoIWlzRmluaXRlKGFuZ2xlKSkgYW5nbGUgPSAtTWF0aC5QSSAvIDI7CiAgICAgICAgdmFyIGV4ID0gcHggKyBNYXRoLmNvcyhhbmdsZSkgKiBhbGVuOwogICAgICAgIHZhciBleSA9IHB5ICsgTWF0aC5zaW4oYW5nbGUpICogYWxlbjsKICAgICAgICBodG1sICs9ICI8bGluZSB4MT1cIiIgKyBweCArICJcIiB5MT1cIiIgKyBweSArICJcIiB4Mj1cIiIgKyBleCArICJcIiB5Mj1cIiIgKyBleSArICJcIiBzdHJva2U9XCIjMDM2OWExXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIG1hcmtlci1lbmQ9XCJ1cmwoI21qbGRBcnJvdylcIi8+IjsKICAgICAgfQogICAgfSk7CgogICAgc3ZnLmlubmVySFRNTCA9ICI8ZGVmcz48bWFya2VyIGlkPVwibWpsZEFycm93XCIgbWFya2VyV2lkdGg9XCI4XCIgbWFya2VySGVpZ2h0PVwiOFwiIHJlZlg9XCI2XCIgcmVmWT1cIjNcIiBvcmllbnQ9XCJhdXRvXCI+PHBvbHlnb24gcG9pbnRzPVwiMCAwLCA4IDMsIDAgNlwiIGZpbGw9XCIjMDM2OWExXCIvPjwvbWFya2VyPjwvZGVmcz4iICsgaHRtbDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckJhcnMocmVzKSB7CiAgICBpZiAoIWVsLmJhckxpc3QpIHJldHVybjsKICAgIHZhciBtYXhQY3QgPSAwOwogICAgcmVzLmJvbHRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgbWF4UGN0ID0gTWF0aC5tYXgobWF4UGN0LCBiLnBjdFQsIGIucGN0Vik7CiAgICB9KTsKICAgIGlmIChtYXhQY3QgPCAxKSBtYXhQY3QgPSAxMDA7CiAgICB2YXIgaHRtbCA9ICIiOwogICAgcmVzLmJvbHRzLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgdmFyIHdUID0gY2xhbXAoKGIucGN0VCAvIG1heFBjdCkgKiAxMDAsIDAsIDEwMCk7CiAgICAgIHZhciB3ViA9IGNsYW1wKChiLnBjdFYgLyBtYXhQY3QpICogMTAwLCAwLCAxMDApOwogICAgICB2YXIgY2xzID0gYi5pZCA9PT0gcmVzLmNyaXQuaWQgPyAiIG1qbGQtYmFyLWNyaXQiIDogIiI7CiAgICAgIGh0bWwgKz0gIjxkaXYgY2xhc3M9XCJtamxkLWJhci1ncm91cCIgKyBjbHMgKyAiXCI+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9XCJtamxkLWJhci1oZWFkXCI+PHN0cm9uZz5Cb2x0ICIgKyBiLmlkICsgIjwvc3Ryb25nPjxzcGFuIGNsYXNzPVwibWpsZC1tb25vXCI+IiArIGZtdChiLkZjb21iaW5lZCwgMCkgKyAiIE4gY29tYmluZWQ8L3NwYW4+PC9kaXY+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9XCJtamxkLWJhci1yb3dcIj48c3BhbiBjbGFzcz1cIm1qbGQtYmFyLWtcIj5UZW5zaWxlIHNoYXJlPC9zcGFuPjxkaXYgY2xhc3M9XCJtamxkLWJhci10cmFja1wiPjxkaXYgY2xhc3M9XCJtamxkLWJhci1maWxsIG1qbGQtYmFyLXRcIiBzdHlsZT1cIndpZHRoOiIgKyB3VCArICIlXCI+PC9kaXY+PC9kaXY+PHNwYW4gY2xhc3M9XCJtamxkLWJhci12XCI+IiArIGZtdChiLnBjdFQsIDEpICsgIiU8L3NwYW4+PC9kaXY+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9XCJtamxkLWJhci1yb3dcIj48c3BhbiBjbGFzcz1cIm1qbGQtYmFyLWtcIj5TaGVhciBzaGFyZTwvc3Bhbj48ZGl2IGNsYXNzPVwibWpsZC1iYXItdHJhY2tcIj48ZGl2IGNsYXNzPVwibWpsZC1iYXItZmlsbCBtamxkLWJhci12XCIgc3R5bGU9XCJ3aWR0aDoiICsgd1YgKyAiJVwiPjwvZGl2PjwvZGl2PjxzcGFuIGNsYXNzPVwibWpsZC1iYXItdlwiPiIgKyBmbXQoYi5wY3RWLCAxKSArICIlPC9zcGFuPjwvZGl2PiIgKwogICAgICAgICI8L2Rpdj4iOwogICAgfSk7CiAgICBlbC5iYXJMaXN0LmlubmVySFRNTCA9IGh0bWw7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJIZWF0bWFwKHJlcykgewogICAgaWYgKCFlbC5oZWF0R3JpZCkgcmV0dXJuOwogICAgdmFyIGh0bWwgPSAiIjsKICAgIHJlcy5ib2x0cy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CiAgICAgIHZhciB1dGlsID0gKGIuc2lnbWFDb21iIC8gcmVzLmNyaXQuc2lnbWFDb21iKSAqIHJlcy51dGlsOwogICAgICB2YXIgYmcgPSBzdHJlc3NDb2xvcih1dGlsKTsKICAgICAgaHRtbCArPSAiPGRpdiBjbGFzcz1cIm1qbGQtaGVhdC1jZWxsXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiIgKyBiZyArICJcIiB0aXRsZT1cIkJvbHQgIiArIGIuaWQgKyAiOiAiICsgZm10KGIuc2lnbWFDb21iLCAxKSArICIgTVBhXCI+IiArCiAgICAgICAgIjxzcGFuPkIiICsgYi5pZCArICI8L3NwYW4+PHNtYWxsPiIgKyBmbXQodXRpbCwgMCkgKyAiJTwvc21hbGw+PC9kaXY+IjsKICAgIH0pOwogICAgZWwuaGVhdEdyaWQuaW5uZXJIVE1MID0gaHRtbDsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZURpc3RhbmNlcyhib2x0cykgewogICAgaWYgKCFlbC5jdXN0b21UYWJsZSkgcmV0dXJuOwogICAgZWwuY3VzdG9tVGFibGUucXVlcnlTZWxlY3RvckFsbCgiLm1qbGQtZGlzdCIpLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHsKICAgICAgdmFyIGlkID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoImRhdGEtYm9sdCIpLCAxMCkgLSAxOwogICAgICB2YXIgYiA9IGJvbHRzW2lkXTsKICAgICAgaWYgKCFiKSB7IGNlbGwudGV4dENvbnRlbnQgPSAi4oCUIjsgcmV0dXJuOyB9CiAgICAgIHZhciByID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyBiLnIgOiBiLnIgLyBNTV9QRVJfSU47CiAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBmbXQociwgMik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNhbGN1bGF0ZShzY3JvbGwpIHsKICAgIHZhciBzaSA9IHRvU0koKTsKICAgIHZhciBvayA9IHZhbGlkYXRlKHNpKTsKICAgIGlmIChlbC5yZXN1bHRzKSBlbC5yZXN1bHRzLmNsYXNzTGlzdC5yZW1vdmUoIm1qbGQtaGlkZGVuIik7CiAgICB1cGRhdGVMb2FkVmlzaWJpbGl0eSgpOwoKICAgIGlmICghb2spIHsKICAgICAgc3RhdGUubGl2ZSA9IGZhbHNlOwogICAgICBpZiAoZWwuc3RhdHVzVGl0bGUpIGVsLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gIkNoZWNrIGlucHV0cyI7CiAgICAgIGlmIChlbC5zdGF0dXNOb3RlKSBlbC5zdGF0dXNOb3RlLnRleHRDb250ZW50ID0gIkNvcnJlY3QgaGlnaGxpZ2h0ZWQgZmllbGRzLCB0aGVuIGNhbGN1bGF0ZSBhZ2Fpbi4iOwogICAgICBpZiAoZWwuYmFubmVyKSBlbC5iYW5uZXIuY2xhc3NOYW1lID0gIm1qbGQtYmFubmVyIG1qbGQtYmFubmVyLWNhdXRpb24iOwogICAgICBzZXRHYXVnZSgwKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciByZXMgPSBhbmFseXplKHNpKTsKICAgIHZhciBzdCA9IHN0YXR1c0Zyb21VdGlsKHJlcy51dGlsLCByZXMuc2YpOwogICAgdmFyIGZQID0gZm9ybWF0Rm9yY2UocmVzLlApOwogICAgdmFyIGZWID0gZm9ybWF0Rm9yY2UocmVzLlYpOwogICAgdmFyIGZNID0gZm9ybWF0TW9tZW50KHJlcy5NKTsKICAgIHZhciBmVG90YWwgPSBmb3JtYXRGb3JjZShyZXMuUCArIHJlcy5WKTsKICAgIHZhciBmQ3JpdCA9IGZvcm1hdEZvcmNlKHJlcy5jcml0LkZjb21iaW5lZCk7CiAgICB2YXIgc0NyaXQgPSBmb3JtYXRTdHJlc3MocmVzLmNyaXQuc2lnbWFDb21iKTsKCiAgICBpZiAoZWwuc3RhdHVzVGl0bGUpIGVsLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gc3QudGl0bGU7CiAgICBpZiAoZWwuc3RhdHVzTm90ZSkgZWwuc3RhdHVzTm90ZS50ZXh0Q29udGVudCA9IHN0Lm5vdGU7CiAgICBpZiAoZWwuYmFubmVyKSBlbC5iYW5uZXIuY2xhc3NOYW1lID0gIm1qbGQtYmFubmVyIG1qbGQtYmFubmVyLSIgKyAoc3Qua2V5ID09PSAib2siID8gIm9rIiA6IHN0LmtleSA9PT0gInJpc2siID8gInJpc2siIDogImNhdXRpb24iKTsKCiAgICBpZiAoZWwub3V0VG90YWxMb2FkKSBlbC5vdXRUb3RhbExvYWQudGV4dENvbnRlbnQgPSBmVG90YWwucHJpbWFyeTsKICAgIGlmIChlbC5vdXRUb3RhbFN1YikgZWwub3V0VG90YWxTdWIudGV4dENvbnRlbnQgPSAiUCA9ICIgKyBmUC5wcmltYXJ5ICsgIiAgwrcgIFYgPSAiICsgZlYucHJpbWFyeTsKICAgIGlmIChlbC5vdXRNYXhCb2x0KSBlbC5vdXRNYXhCb2x0LnRleHRDb250ZW50ID0gIkJvbHQgIiArIHJlcy5jcml0LmlkOwogICAgaWYgKGVsLm91dE1heExvYWQpIGVsLm91dE1heExvYWQudGV4dENvbnRlbnQgPSBmQ3JpdC5wcmltYXJ5OwogICAgaWYgKGVsLm91dE1heFN0cmVzcykgZWwub3V0TWF4U3RyZXNzLnRleHRDb250ZW50ID0gc0NyaXQucHJpbWFyeTsKICAgIGlmIChlbC5vdXRNYXhTdHJlc3NTdWIpIGVsLm91dE1heFN0cmVzc1N1Yi50ZXh0Q29udGVudCA9IHNDcml0LnNlY29uZGFyeTsKICAgIGlmIChlbC5vdXRVdGlsKSBlbC5vdXRVdGlsLnRleHRDb250ZW50ID0gZm10KHJlcy51dGlsLCAxKSArICIlIjsKICAgIGlmIChlbC5vdXRTZikgZWwub3V0U2YudGV4dENvbnRlbnQgPSBmbXQocmVzLnNmLCAyKTsKICAgIGlmIChlbC5vdXRTZlN1YikgZWwub3V0U2ZTdWIudGV4dENvbnRlbnQgPSAiQWxsb3dhYmxlIC8gYWN0dWFsIChjcml0aWNhbCBib2x0KSI7CiAgICBpZiAoZWwub3V0QXZnQm9sdCkgZWwub3V0QXZnQm9sdC50ZXh0Q29udGVudCA9IGZvcm1hdEZvcmNlKChyZXMuUCArIHJlcy5WKSAvIHNpLm4pLnByaW1hcnk7CgogICAgaWYgKGVsLnV0aWxGaWxsKSB7CiAgICAgIGVsLnV0aWxGaWxsLnN0eWxlLndpZHRoID0gY2xhbXAocmVzLnV0aWwsIDAsIDEyMCkgKyAiJSI7CiAgICAgIGVsLnV0aWxGaWxsLmNsYXNzTmFtZSA9ICJtamxkLXV0aWwtZmlsbCIgKyAoc3Qua2V5ID09PSAicmlzayIgPyAiIG1qbGQtaXMtcmlzayIgOiBzdC5rZXkgPT09ICJjYXV0aW9uIiA\/ICIgbWpsZC1pcy1jYXV0aW9uIiA6ICIgbWpsZC1pcy1vayIpOwogICAgfQogICAgaWYgKGVsLmdhdWdlUmVhZCkgZWwuZ2F1Z2VSZWFkLnRleHRDb250ZW50ID0gZm10KHJlcy5zZiwgMik7CiAgICBzZXRHYXVnZShyZXMuc2YpOwoKICAgIGRyYXdMYXlvdXQocmVzKTsKICAgIHJlbmRlckJhcnMocmVzKTsKICAgIHJlbmRlckhlYXRtYXAocmVzKTsKICAgIHVwZGF0ZURpc3RhbmNlcyhyZXMuYm9sdHMpOwoKICAgIGlmIChlbC5hbGVydHMpIHsKICAgICAgdmFyIGFsZXJ0cyA9IFtdOwogICAgICBpZiAocmVzLk0gPiAwICYmIHNpLmFycmFuZ2VtZW50ICE9PSAiY3VzdG9tIikgewogICAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIm9rIiwgdGV4dDogIk1vbWVudCBsb2FkIHNoYXJpbmcgdXNlcyBGX2kgPSBNIMOXIHJfaSAvIM6jKHLCsikgZm9yIGVhY2ggYm9sdCBwb3NpdGlvbi4iIH0pOwogICAgICB9CiAgICAgIGlmIChyZXMuY3JpdC5GdCA+IHJlcy5jcml0LkZzICogMikgewogICAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiQ3JpdGljYWwgYm9sdCBpcyBkb21pbmF0ZWQgYnkgdGVuc2lsZSBsb2FkLiBDb25maXJtIGF4aWFsIGxvYWQgcGF0aCBhbmQgbWVtYmVyIHN0aWZmbmVzcy4iIH0pOwogICAgICB9CiAgICAgIGlmIChyZXMudXRpbCA+IDEwMCkgewogICAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogInJpc2siLCB0ZXh0OiAiQm9sdCBsb2FkIGV4Y2VlZHMgYWxsb3dhYmxlIHN0cmVuZ3RoIG9uIEJvbHQgIiArIHJlcy5jcml0LmlkICsgIi4gQ29ubmVjdGlvbiBpcyBvdmVyc3RyZXNzZWQuIiB9KTsKICAgICAgfSBlbHNlIGlmIChyZXMudXRpbCA+PSA4NSkgewogICAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIndhcm4iLCB0ZXh0OiAiVXRpbGl6YXRpb24gb24gQm9sdCAiICsgcmVzLmNyaXQuaWQgKyAiIGlzICIgKyBmbXQocmVzLnV0aWwsIDEpICsgIiUg4oCUIG1hcmdpbiBpcyBzbWFsbC4iIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIm9rIiwgdGV4dDogIlBlYWsgdXRpbGl6YXRpb24gIiArIGZtdChyZXMudXRpbCwgMSkgKyAiJSBvbiBCb2x0ICIgKyByZXMuY3JpdC5pZCArICIuIFNhZmV0eSBmYWN0b3IgdnMgYWxsb3dhYmxlID0gIiArIGZtdChyZXMuc2YsIDIpICsgIi4iIH0pOwogICAgICB9CiAgICAgIGVsLmFsZXJ0cy5pbm5lckhUTUwgPSBhbGVydHMubWFwKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPVwibWpsZC1hbGVydCBtamxkLWFsZXJ0LSIgKyAoYS50eXBlID09PSAicmlzayIgPyAicmlzayIgOiBhLnR5cGUgPT09ICJvayIgPyAib2siIDogIndhcm4iKSArICJcIj4iICsgYS50ZXh0ICsgIjwvZGl2PiI7CiAgICAgIH0pLmpvaW4oIiIpOwogICAgfQoKICAgIHN0YXRlLmxpdmUgPSB0cnVlOwogICAgaWYgKHNjcm9sbCAmJiBlbC5iYW5uZXIpIHsKICAgICAgdHJ5IHsgZWwuYmFubmVyLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTG9hZFZpc2liaWxpdHkoKSB7CiAgICB2YXIgZGlyID0gZWwubG9hZERpci52YWx1ZTsKICAgIGlmIChlbC5wV3JhcCkgZWwucFdyYXAuY2xhc3NMaXN0LnRvZ2dsZSgibWpsZC1oaWRkZW4iLCBkaXIgPT09ICJzaGVhciIgfHwgZGlyID09PSAiYmVuZGluZyIpOwogICAgaWYgKGVsLnZXcmFwKSBlbC52V3JhcC5jbGFzc0xpc3QudG9nZ2xlKCJtamxkLWhpZGRlbiIsIGRpciA9PT0gImF4aWFsIiB8fCBkaXIgPT09ICJiZW5kaW5nIik7CiAgICBpZiAoZWwubVdyYXApIGVsLm1XcmFwLmNsYXNzTGlzdC50b2dnbGUoIm1qbGQtaGlkZGVuIiwgZGlyID09PSAiYXhpYWwiIHx8IGRpciA9PT0gInNoZWFyIik7CiAgfQoKICBmdW5jdGlvbiBzd2l0Y2hVbml0KG5leHQpIHsKICAgIGlmIChuZXh0ID09PSBzdGF0ZS51bml0KSByZXR1cm47CiAgICB2YXIgZCA9IG51bShlbC5kKTsKICAgIHZhciBzdXQgPSBudW0oZWwuc3V0KTsKICAgIHZhciBzcyA9IG51bShlbC5zcyk7CiAgICB2YXIgc3AgPSBudW0oZWwuc3BhY2luZyk7CiAgICB2YXIgUCA9IG51bShlbC5QKTsKICAgIHZhciBWID0gbnVtKGVsLlYpOwogICAgdmFyIE0gPSBudW0oZWwuTSk7CiAgICB2YXIgZnJvbVBVID0gZWwucFVuaXQudmFsdWU7CiAgICB2YXIgZnJvbVZVID0gZWwudlVuaXQudmFsdWU7CiAgICB2YXIgZnJvbU1VID0gZWwubVVuaXQudmFsdWU7CgogICAgaWYgKG5leHQgPT09ICJpbXBlcmlhbCIpIHsKICAgICAgaWYgKGlzRmluaXRlKGQpKSBlbC5kLnZhbHVlID0gcm91bmRTbWFydChkIC8gTU1fUEVSX0lOKTsKICAgICAgaWYgKGlzRmluaXRlKHN1dCkpIGVsLnN1dC52YWx1ZSA9IHJvdW5kU21hcnQoc3V0ICogUFNJX1BFUl9NUEEpOwogICAgICBpZiAoaXNGaW5pdGUoc3MpKSBlbC5zcy52YWx1ZSA9IHJvdW5kU21hcnQoc3MgKiBQU0lfUEVSX01QQSk7CiAgICAgIGlmIChpc0Zpbml0ZShzcCkpIGVsLnNwYWNpbmcudmFsdWUgPSByb3VuZFNtYXJ0KHNwIC8gTU1fUEVSX0lOKTsKICAgICAgZWwucFVuaXQudmFsdWUgPSAibGJmIjsKICAgICAgZWwudlVuaXQudmFsdWUgPSAibGJmIjsKICAgICAgZWwubVVuaXQudmFsdWUgPSAibGJmZnQiOwogICAgICBpZiAoaXNGaW5pdGUoUCkpIGVsLlAudmFsdWUgPSByb3VuZFNtYXJ0KGNvbnZlcnRGb3JjZVVuaXRWYWx1ZShQLCBmcm9tUFUsICJsYmYiKSk7CiAgICAgIGlmIChpc0Zpbml0ZShWKSkgZWwuVi52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydEZvcmNlVW5pdFZhbHVlKFYsIGZyb21WVSwgImxiZiIpKTsKICAgICAgaWYgKGlzRmluaXRlKE0pKSBlbC5NLnZhbHVlID0gcm91bmRTbWFydChjb252ZXJ0TW9tZW50VW5pdFZhbHVlKE0sIGZyb21NVSwgImxiZmZ0IikpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGlzRmluaXRlKGQpKSBlbC5kLnZhbHVlID0gcm91bmRTbWFydChkICogTU1fUEVSX0lOKTsKICAgICAgaWYgKGlzRmluaXRlKHN1dCkpIGVsLnN1dC52YWx1ZSA9IHJvdW5kU21hcnQoc3V0IC8gUFNJX1BFUl9NUEEpOwogICAgICBpZiAoaXNGaW5pdGUoc3MpKSBlbC5zcy52YWx1ZSA9IHJvdW5kU21hcnQoc3MgLyBQU0lfUEVSX01QQSk7CiAgICAgIGlmIChpc0Zpbml0ZShzcCkpIGVsLnNwYWNpbmcudmFsdWUgPSByb3VuZFNtYXJ0KHNwICogTU1fUEVSX0lOKTsKICAgICAgZWwucFVuaXQudmFsdWUgPSAiTiI7CiAgICAgIGVsLnZVbml0LnZhbHVlID0gIk4iOwogICAgICBlbC5tVW5pdC52YWx1ZSA9ICJObSI7CiAgICAgIGlmIChpc0Zpbml0ZShQKSkgZWwuUC52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydEZvcmNlVW5pdFZhbHVlKFAsIGZyb21QVSwgIk4iKSk7CiAgICAgIGlmIChpc0Zpbml0ZShWKSkgZWwuVi52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydEZvcmNlVW5pdFZhbHVlKFYsIGZyb21WVSwgIk4iKSk7CiAgICAgIGlmIChpc0Zpbml0ZShNKSkgZWwuTS52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydE1vbWVudFVuaXRWYWx1ZShNLCBmcm9tTVUsICJObSIpKTsKICAgIH0KCiAgICBzdGF0ZS51bml0ID0gbmV4dDsKICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsKICAgIHJlbmRlckN1c3RvbVRhYmxlKCk7CiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgc3RhdGUudW5pdCA9IERFRkFVTFRTLnVuaXQ7CiAgICBzdGF0ZS5saXZlID0gZmFsc2U7CiAgICBlbC5uLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLm4pOwogICAgZWwuYXJyYW5nZW1lbnQudmFsdWUgPSBERUZBVUxUUy5hcnJhbmdlbWVudDsKICAgIGVsLmQudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuZCk7CiAgICBlbC5ncmFkZS52YWx1ZSA9IERFRkFVTFRTLmdyYWRlOwogICAgZWwuUC52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5QKTsKICAgIGVsLlYudmFsdWUgPSBTdHJpbmcoREVGQVVMVFMuVik7CiAgICBlbC5NLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLk0pOwogICAgZWwuc3BhY2luZy52YWx1ZSA9IFN0cmluZyhERUZBVUxUUy5zcGFjaW5nKTsKICAgIGVsLmxvYWREaXIudmFsdWUgPSBERUZBVUxUUy5sb2FkRGlyOwogICAgZWwubnNmLnZhbHVlID0gU3RyaW5nKERFRkFVTFRTLm5zZik7CiAgICBlbC5wVW5pdC52YWx1ZSA9IERFRkFVTFRTLnBVbml0OwogICAgZWwudlVuaXQudmFsdWUgPSBERUZBVUxUUy52VW5pdDsKICAgIGVsLm1Vbml0LnZhbHVlID0gREVGQVVMVFMubVVuaXQ7CiAgICBhcHBseUdyYWRlKCk7CiAgICB1cGRhdGVVbml0TGFiZWxzKCk7CiAgICB1cGRhdGVMb2FkVmlzaWJpbGl0eSgpOwogICAgcmVuZGVyQ3VzdG9tVGFibGUoKTsKICAgIGNsZWFyRXJycygpOwogICAgaWYgKGVsLnJlc3VsdHMpIGVsLnJlc3VsdHMuY2xhc3NMaXN0LmFkZCgibWpsZC1oaWRkZW4iKTsKICAgIHNldEdhdWdlKDApOwogIH0KCiAgZnVuY3Rpb24gYmluZEVsKCkgewogICAgZWwubiA9IGJ5SWQoIm1qbGROIik7CiAgICBlbC5hcnJhbmdlbWVudCA9IGJ5SWQoIm1qbGRBcnJhbmdlbWVudCIpOwogICAgZWwuZCA9IGJ5SWQoIm1qbGREIik7CiAgICBlbC5ncmFkZSA9IGJ5SWQoIm1qbGRHcmFkZSIpOwogICAgZWwuc3V0ID0gYnlJZCgibWpsZFN1dCIpOwogICAgZWwuc3MgPSBieUlkKCJtamxkU3MiKTsKICAgIGVsLlAgPSBieUlkKCJtamxkUCIpOwogICAgZWwuViA9IGJ5SWQoIm1qbGRWIik7CiAgICBlbC5NID0gYnlJZCgibWpsZE0iKTsKICAgIGVsLnBVbml0ID0gYnlJZCgibWpsZFBVbml0Iik7CiAgICBlbC52VW5pdCA9IGJ5SWQoIm1qbGRWVW5pdCIpOwogICAgZWwubVVuaXQgPSBieUlkKCJtamxkTVVuaXQiKTsKICAgIGVsLnNwYWNpbmcgPSBieUlkKCJtamxkU3BhY2luZyIpOwogICAgZWwubG9hZERpciA9IGJ5SWQoIm1qbGRMb2FkRGlyIik7CiAgICBlbC5uc2YgPSBieUlkKCJtamxkTnNmIik7CiAgICBlbC5idG5NZXRyaWMgPSBieUlkKCJtamxkQnRuTWV0cmljIik7CiAgICBlbC5idG5JbXBlcmlhbCA9IGJ5SWQoIm1qbGRCdG5JbXBlcmlhbCIpOwogICAgZWwuYnRuUmVzZXQgPSBieUlkKCJtamxkQnRuUmVzZXQiKTsKICAgIGVsLmJ0bkNhbGMgPSBieUlkKCJtamxkQnRuQ2FsY3VsYXRlIik7CiAgICBlbC5yZXN1bHRzID0gYnlJZCgibWpsZFJlc3VsdHMiKTsKICAgIGVsLmJhbm5lciA9IGJ5SWQoIm1qbGRCYW5uZXIiKTsKICAgIGVsLnN0YXR1c1RpdGxlID0gYnlJZCgibWpsZFN0YXR1c1RpdGxlIik7CiAgICBlbC5zdGF0dXNOb3RlID0gYnlJZCgibWpsZFN0YXR1c05vdGUiKTsKICAgIGVsLm91dFRvdGFsTG9hZCA9IGJ5SWQoIm1qbGRPdXRUb3RhbExvYWQiKTsKICAgIGVsLm91dFRvdGFsU3ViID0gYnlJZCgibWpsZE91dFRvdGFsU3ViIik7CiAgICBlbC5vdXRNYXhCb2x0ID0gYnlJZCgibWpsZE91dE1heEJvbHQiKTsKICAgIGVsLm91dE1heExvYWQgPSBieUlkKCJtamxkT3V0TWF4TG9hZCIpOwogICAgZWwub3V0TWF4U3RyZXNzID0gYnlJZCgibWpsZE91dE1heFN0cmVzcyIpOwogICAgZWwub3V0TWF4U3RyZXNzU3ViID0gYnlJZCgibWpsZE91dE1heFN0cmVzc1N1YiIpOwogICAgZWwub3V0VXRpbCA9IGJ5SWQoIm1qbGRPdXRVdGlsIik7CiAgICBlbC5vdXRTZiA9IGJ5SWQoIm1qbGRPdXRTZiIpOwogICAgZWwub3V0U2ZTdWIgPSBieUlkKCJtamxkT3V0U2ZTdWIiKTsKICAgIGVsLm91dEF2Z0JvbHQgPSBieUlkKCJtamxkT3V0QXZnQm9sdCIpOwogICAgZWwudXRpbEZpbGwgPSBieUlkKCJtamxkVXRpbEZpbGwiKTsKICAgIGVsLmdhdWdlQXJjID0gYnlJZCgibWpsZEdhdWdlQXJjIik7CiAgICBlbC5uZWVkbGUgPSBieUlkKCJtamxkTmVlZGxlIik7CiAgICBlbC5nYXVnZVJlYWQgPSBieUlkKCJtamxkR2F1Z2VSZWFkIik7CiAgICBlbC5sYXlvdXRTdmcgPSBieUlkKCJtamxkTGF5b3V0U3ZnIik7CiAgICBlbC5iYXJMaXN0ID0gYnlJZCgibWpsZEJhckxpc3QiKTsKICAgIGVsLmhlYXRHcmlkID0gYnlJZCgibWpsZEhlYXRHcmlkIik7CiAgICBlbC5hbGVydHMgPSBieUlkKCJtamxkQWxlcnRzIik7CiAgICBlbC5jdXN0b21XcmFwID0gYnlJZCgibWpsZEN1c3RvbVdyYXAiKTsKICAgIGVsLmN1c3RvbVRhYmxlID0gYnlJZCgibWpsZEN1c3RvbVRhYmxlIik7CiAgICBlbC5wV3JhcCA9IGJ5SWQoIm1qbGRQV3JhcCIpOwogICAgZWwudldyYXAgPSBieUlkKCJtamxkVldyYXAiKTsKICAgIGVsLm1XcmFwID0gYnlJZCgibWpsZE1XcmFwIik7CiAgfQoKICBmdW5jdGlvbiBib290SW5saW5lKCkgewogICAgYmluZEVsKCk7CiAgICBhcHBseUdyYWRlKCk7CiAgICB1cGRhdGVVbml0TGFiZWxzKCk7CiAgICB1cGRhdGVMb2FkVmlzaWJpbGl0eSgpOwogICAgcmVuZGVyQ3VzdG9tVGFibGUoKTsKCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIGJ0biA9IGUudGFyZ2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QgPyBlLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKSA6IG51bGw7CiAgICAgIGlmICghYnRuIHx8ICFyb290LmNvbnRhaW5zKGJ0bikpIHJldHVybjsKICAgICAgaWYgKGJ0bi5pZCA9PT0gIm1qbGRCdG5NZXRyaWMiKSB7IGUucHJldmVudERlZmF1bHQoKTsgc3dpdGNoVW5pdCgibWV0cmljIik7IH0KICAgICAgZWxzZSBpZiAoYnRuLmlkID09PSAibWpsZEJ0bkltcGVyaWFsIikgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFVuaXQoImltcGVyaWFsIik7IH0KICAgICAgZWxzZSBpZiAoYnRuLmlkID09PSAibWpsZEJ0blJlc2V0IikgeyBlLnByZXZlbnREZWZhdWx0KCk7IHJlc2V0QWxsKCk7IH0KICAgICAgZWxzZSBpZiAoYnRuLmlkID09PSAibWpsZEJ0bkNhbGN1bGF0ZSIpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBjYWxjdWxhdGUodHJ1ZSk7IH0KICAgIH0pOwoKICAgIGlmIChlbC5ncmFkZSkgZWwuZ3JhZGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgICBhcHBseUdyYWRlKCk7CiAgICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogICAgfSk7CiAgICBpZiAoZWwuc3V0KSBlbC5zdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7IG1hcmtDdXN0b21HcmFkZSgpOyBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsgfSk7CiAgICBpZiAoZWwuc3MpIGVsLnNzLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgeyBtYXJrQ3VzdG9tR3JhZGUoKTsgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7IH0pOwogICAgaWYgKGVsLmFycmFuZ2VtZW50KSBlbC5hcnJhbmdlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJlbmRlckN1c3RvbVRhYmxlKCk7CiAgICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogICAgfSk7CiAgICBpZiAoZWwubikgZWwubi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsKICAgICAgcmVuZGVyQ3VzdG9tVGFibGUoKTsKICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7CiAgICB9KTsKICAgIGlmIChlbC5sb2FkRGlyKSBlbC5sb2FkRGlyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgdXBkYXRlTG9hZFZpc2liaWxpdHkoKTsKICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7CiAgICB9KTsKICAgIGlmIChlbC5jdXN0b21UYWJsZSkgZWwuY3VzdG9tVGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOwogICAgfSk7CgogICAgWyJkIiwgIlAiLCAiViIsICJNIiwgInNwYWNpbmciLCAibnNmIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIGlmIChlbFtrZXkgPT09ICJkIiA\/ICJkIiA6IGtleSA9PT0gInNwYWNpbmciID8gInNwYWNpbmciIDoga2V5ID09PSAibnNmIiA\/ICJuc2YiIDoga2V5XSkgewogICAgICAgIChlbFtrZXkgPT09ICJkIiA\/ICJkIiA6IGtleSA9PT0gInNwYWNpbmciID8gInNwYWNpbmciIDoga2V5ID09PSAibnNmIiA\/ICJuc2YiIDoga2V5XSkKICAgICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7IH0pOwogICAgICB9CiAgICB9KTsKCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5rZXkgPT09ICJFbnRlciIgJiYgZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gIklOUFVUIikgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjYWxjdWxhdGUodHJ1ZSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgd2luZG93Lm1qbGRTd2l0Y2hVbml0ID0gZnVuY3Rpb24gKHUpIHsgc3dpdGNoVW5pdCh1KTsgfTsKICB3aW5kb3cubWpsZFJlc2V0ID0gcmVzZXRBbGw7CiAgd2luZG93Lm1qbGRDYWxjdWxhdGUgPSBmdW5jdGlvbiAoKSB7IGNhbGN1bGF0ZSh0cnVlKTsgfTsKCiAgYm9vdElubGluZSgpOwp9KSgpOwo=<\/textarea>\n<script id=\"mjld-boot-script\" type=\"text\/javascript\" data-no-minify=\"1\" data-no-defer=\"1\" data-cfasync=\"false\">\n(function(){\nfunction boot(){\nif(window.mjldCalculate){return;}\nvar el=document.getElementById(\"mjld-js-b64\");\nif(!el){return;}\nvar code=el.value;\nif(!code){code=el.textContent;}\nif(!code){return;}\ncode=code.replace(\/\\s\/g,\"\");\nvar js=atob(code);\nvar s=document.createElement(\"script\");\ns.type=\"text\/javascript\";\ns.setAttribute(\"data-no-minify\",\"1\");\ns.setAttribute(\"data-cfasync\",\"false\");\ns.text=js;\nvar p=document.body;\nif(!p){p=document.getElementsByTagName(\"head\")[0];}\nif(p){p.appendChild(s);}\n}\nwindow.mjldBoot=boot;\nif(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",boot);}\nelse{boot();}\n})();\n<\/script>\n<\/div>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Multi-Bolt Joint Load Distribution Calculator is a practical engineering tool designed to analyze how external loads are distributed among multiple bolts in a bolted&#8230;<\/p>","protected":false},"author":2,"featured_media":24697,"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":[8520],"tags":[8611,8602,8598,8612],"class_list":["post-24696","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-bolt-design","tag-bolt-load","tag-fastener-tools","tag-joint-analysis","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Multi-Bolt-Joint-Load-Distribution-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24696","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=24696"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24696\/revisions"}],"predecessor-version":[{"id":24698,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24696\/revisions\/24698"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media\/24697"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media?parent=24696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/categories?post=24696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/tags?post=24696"}],"curies":[{"name":"\u0648\u0648\u0631\u062f\u0628\u0631\u064a\u0633","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}