{"id":25758,"date":"2026-10-16T12:59:20","date_gmt":"2026-10-16T12:59:20","guid":{"rendered":"https:\/\/cmacademy.events\/?post_type=ht_kb&#038;p=25758"},"modified":"2026-10-16T13:00:44","modified_gmt":"2026-10-16T13:00:44","slug":"bilder-prufen-und-optimieren","status":"publish","type":"ht_kb","link":"https:\/\/cmacademy.events\/de\/knowledge-base\/bilder-prufen-und-optimieren\/","title":{"rendered":"Bilder pr\u00fcfen und optimieren"},"content":{"rendered":"\n<div class=\"cm-image-tool-placeholder\"><!-- Diesen Block durch die Bildpr\u00fcfung ersetzen (Tabs HTML, CSS und JavaScript, Ordner DE). --><\/div>\n\n\n\n<style data-wp-block-html=\"css\">\n#cm-image-lab,#cm-image-lab *{box-sizing:border-box}\n#cm-image-lab{--green:var(--cmac-brand,#9CCC3D);--green-soft:#F8FBEF;--blue:var(--cmac-accent,#185ABC);--navy:var(--cmac-ink,#1F354D);--text:#12202E;--body:#405266;--muted:var(--cmac-muted,#677482);--line:#D9E2EA;--line-soft:#E4EAEF;--soft:#F7F9FB;color:var(--text);font-family:inherit;line-height:1.6;max-width:100%}\n#cm-image-lab button,#cm-image-lab select,#cm-image-lab input{font:inherit;letter-spacing:normal;text-transform:none}\n#cm-image-lab h2,#cm-image-lab h3{font-family:inherit;letter-spacing:normal;text-transform:none;line-height:1.25}\n#cm-image-lab p{margin:0 0 12px}\n#cm-image-lab .cil-card{border:1px solid var(--line);border-radius:16px;padding:30px 32px;background:#fff;margin:0 0 24px;box-shadow:0 1px 2px rgba(18,32,46,.04),0 10px 28px rgba(18,32,46,.05)}\n#cm-image-lab .cil-title{margin:0 0 8px;font-size:26px;font-weight:700;color:var(--navy);letter-spacing:-.01em}\n#cm-image-lab .cil-subtitle{margin:20px 0 8px;font-size:19px;font-weight:700;color:var(--navy)}\n#cm-image-lab .cil-lead{margin:0 0 24px;color:var(--body);font-size:17px;max-width:62ch}\n#cm-image-lab .cil-muted{font-size:14px;color:var(--muted)}\n#cm-image-lab .cil-small{font-size:13px;color:var(--muted)}\n#cm-image-lab .cil-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}\n#cm-image-lab .cil-options{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 16px}\n#cm-image-lab .cil-choice{flex:0 0 auto;border:1px solid #CFD8E1;border-radius:8px;background:#fff;color:#31465A;padding:9px 16px;cursor:pointer;font-weight:700;box-shadow:none;line-height:1.3;transition:border-color .15s,background .15s}\n#cm-image-lab .cil-choice:hover{border-color:var(--green);background:#F0F6E7}\n#cm-image-lab .cil-choice[aria-pressed=true]{border-color:var(--green);background:#EEF6DF;color:var(--navy);box-shadow:inset 0 0 0 1px var(--green)}\n#cm-image-lab .cil-field{display:flex;flex-direction:column;gap:5px;min-width:0;margin:0}\n#cm-image-lab .cil-label{font-weight:700;font-size:14px;color:var(--navy)}\n#cm-image-lab .cil-tipbtn{display:inline-flex!important;align-items:center;justify-content:center;width:18px;height:18px;min-height:0!important;margin-left:6px;padding:0!important;border:1.5px solid #B6C2CE!important;border-radius:50%!important;background:#fff!important;color:#5B6B7B!important;-webkit-text-fill-color:#5B6B7B!important;font:700 11px\/1 inherit!important;cursor:pointer;vertical-align:1px;box-shadow:none!important;transition:border-color .15s,color .15s,background .15s}\n#cm-image-lab .cil-tipbtn:hover,#cm-image-lab .cil-tipbtn:focus-visible,#cm-image-lab .cil-tipbtn[aria-expanded=\"true\"]{border-color:var(--blue)!important;background:#EEF4FF!important;color:var(--blue)!important;-webkit-text-fill-color:var(--blue)!important}\n#cm-image-lab .cil-tiptext{display:block;margin:6px 0 4px;padding:8px 10px;border-radius:8px;background:#F4F7FA;font-size:13px;font-weight:400;line-height:1.45;color:var(--text)}\n#cm-image-lab .cil-tiptext[hidden]{display:none}\n#cm-image-lab .cil-stat{position:relative}\n#cm-image-lab .cil-stat-label .cil-tipbtn{flex:0 0 18px;margin-left:0}\n#cm-image-lab .cil-tipwrap{position:relative;display:inline-flex;flex:0 0 auto;vertical-align:middle}\n#cm-image-lab .cil-stat-label .cil-tipbtn{margin-left:0}\n#cm-image-lab .cil-tippop{position:absolute;right:-10px;bottom:calc(100% + 10px);left:auto;top:auto;z-index:6;width:min(280px,80vw);margin:0;background:#fff;border:1px solid var(--line-soft);box-shadow:0 10px 24px rgba(18,32,46,.14)}\n#cm-image-lab .cil-tippop::after{content:\"\";position:absolute;right:12px;bottom:-6px;width:10px;height:10px;background:#fff;border-right:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);transform:rotate(45deg)}\n#cm-image-lab .cil-tip-left .cil-tippop{left:-10px;right:auto}\n#cm-image-lab .cil-tip-left .cil-tippop::after{left:12px;right:auto}\n#cm-image-lab select,#cm-image-lab input[type=number]{border:1px solid #CFD8E1;background:#fff;border-radius:8px;min-height:42px;padding:8px 10px;width:100%;max-width:100%;color:var(--text);margin:0;box-shadow:none}\n#cm-image-lab input[type=url]{border:1px solid #CFD8E1;background:#fff;border-radius:8px;min-height:42px;padding:8px 10px;width:100%;max-width:100%;color:var(--text);margin:0;box-shadow:none}\n#cm-image-lab .cil-urlrow{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;margin:0 0 12px}\n#cm-image-lab .cil-urlfield{flex:1 1 260px}\n#cm-image-lab input[type=range]{width:100%;accent-color:#185ABC;margin:4px 0}\n#cm-image-lab .cil-drop{border:1.5px dashed #B9D97A;border-radius:16px;background:#FAFCF6;padding:40px 24px 30px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:0;margin:14px 0;color:var(--body);cursor:pointer;}\n#cm-image-lab .cil-drop:hover{background:#F6FAEE}\n#cm-image-lab .cil-drop-icon{display:grid;place-items:center;width:48px;height:48px;border-radius:12px;background:#EAF4D6;color:#5E8A14;margin:0 0 14px}\n#cm-image-lab .cil-drop-icon svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-drop-title{display:block;font-size:20px;font-weight:700;color:var(--navy);line-height:1.3;margin:0 0 6px}\n#cm-image-lab .cil-drop-text{display:block;font-size:15px;color:var(--muted);margin:0 0 16px}\n#cm-image-lab .cil-drop-btn{min-height:48px;padding:12px 22px;border-radius:10px;font-size:16px}\n#cm-image-lab .cil-drop-btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-drop-hint{display:block;font-size:13px;color:var(--muted);margin:12px 0 0}\n#cm-image-lab .cil-drop[data-drag=\"1\"]{border-color:var(--green);background:#FBFDF8}\n#cm-image-lab .cil-btn{border:0;border-radius:8px;transition:background .18s,color .18s,box-shadow .18s;background:var(--blue);color:#fff!important;padding:11px 18px;min-height:42px;cursor:pointer;font-weight:700;text-decoration:none!important;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-shadow:none;line-height:1.2;}\n#cm-image-lab .cil-btn:hover,#cm-image-lab .cil-btn:focus-visible{background:var(--green)}\n#cm-image-lab .cil-btn:disabled{opacity:.5;cursor:not-allowed}\n#cm-image-lab .cil-btn:disabled:hover{background:var(--blue)}\n#cm-image-lab .cil-btn-primary{background:var(--green);color:#fff!important}\n#cm-image-lab .cil-btn-primary svg,#cm-image-lab .cil-btn-primary svg *{stroke:#fff!important;fill:none!important;color:#fff!important}\n#cm-image-lab .cil-btn-primary:hover{background:var(--blue);color:#fff!important}\n#cm-image-lab .cil-btn-secondary{background:transparent;color:var(--blue)!important;box-shadow:inset 0 0 0 2px var(--blue)}\n#cm-image-lab .cil-btn-secondary:hover,#cm-image-lab .cil-btn-secondary:disabled:hover{background:var(--blue);color:#fff!important}\n#cm-image-lab .cil-btn-secondary:disabled:hover{background:transparent;color:var(--blue)!important}\n#cm-image-lab .cil-btn-text{background:transparent;color:var(--blue)!important;padding:6px 10px;min-height:42px}\n#cm-image-lab .cil-btn-text:hover{background:#EEF4FF}\n#cm-image-lab select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:42px!important;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%231F354D' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'\/%3E%3C\/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 16px center!important;background-size:16px 16px!important}\n#cm-image-lab select::-ms-expand{display:none}\n#cm-image-lab .cil-unitrow select{padding-right:30px!important;background-position:right 10px center!important}\n#cm-image-lab .cil-options{display:grid!important;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin:10px 0 16px;max-width:720px}\n#cm-image-lab .cil-choice{display:flex!important;align-items:flex-start;gap:12px;width:100%;text-align:left;padding:14px 16px!important;border:1px solid var(--line)!important;border-radius:10px!important;background:#fff!important;box-shadow:none!important;color:var(--navy)!important;transition:border-color .15s,background .15s}\n#cm-image-lab .cil-choice:hover{border-color:var(--green)!important;background:#FBFDF7!important}\n#cm-image-lab .cil-choice[aria-pressed=true]{border-color:var(--green)!important;background:var(--green-soft)!important;box-shadow:inset 0 0 0 1px var(--green)!important}\n#cm-image-lab .cil-choice-icon{flex:0 0 36px;width:36px;height:36px;border-radius:8px;background:#F1F4F7;display:grid;place-items:center}\n#cm-image-lab .cil-choice-icon svg{width:20px;height:20px;fill:none!important;stroke:#677482!important;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-icon{background:var(--green)}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-icon svg{stroke:#fff!important}\n#cm-image-lab .cil-choice-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}\n#cm-image-lab .cil-choice-name{font-weight:700;font-size:16px;line-height:1.3;color:var(--navy)}\n#cm-image-lab .cil-choice-desc{font-weight:400;font-size:13px;line-height:1.4;color:var(--body)}\n#cm-image-lab .cil-choice-check{flex:0 0 20px;width:20px;height:20px;border-radius:50%;border:1.5px solid #B7C3CF;display:grid;place-items:center;margin-top:2px}\n#cm-image-lab .cil-choice-check svg{width:12px;height:12px;fill:none!important;stroke:#fff!important;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;opacity:0}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-check{background:var(--green);border-color:var(--green)}\n#cm-image-lab .cil-choice[aria-pressed=true] .cil-choice-check svg{opacity:1}\n#cm-image-lab .cil-adv{border-top:1px solid var(--line-soft);padding-top:12px;margin:14px 0 4px}\n#cm-image-lab .cil-adv summary{cursor:pointer;font-weight:700;color:var(--blue);font-size:15px;list-style:none;display:inline-flex;align-items:center;gap:6px}\n#cm-image-lab .cil-adv summary::-webkit-details-marker{display:none}\n#cm-image-lab .cil-adv summary::after{content:'';width:8px;height:8px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);margin:-3px 0 0 2px;transition:transform .15s}\n#cm-image-lab .cil-adv[open] summary::after{transform:rotate(-135deg);margin-top:3px}\n#cm-image-lab .cil-adv .cil-small{margin:4px 0 10px}\n#cm-image-lab .cil-adv-body{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}\n#cm-image-lab .cil-range input[type=range]{-webkit-appearance:auto;appearance:auto;width:100%;height:auto!important;min-height:0!important;margin:8px 0 4px!important;padding:0!important;border:0!important;border-radius:0;box-shadow:none!important;background:transparent!important;accent-color:var(--blue);cursor:pointer}\n#cm-image-lab{font-size:16px}\n#cm-image-lab select,#cm-image-lab input[type=number],#cm-image-lab input[type=url]{font-size:15px!important;line-height:1.4!important;min-height:42px}\n#cm-image-lab .cil-btn{font-size:15px!important;line-height:1.3!important}\n#cm-image-lab .cil-card p,#cm-image-lab .cil-card li{font-size:15px}\n#cm-image-lab .cil-small{font-size:13px!important}\n#cm-image-lab .cil-placement-note{grid-column:1\/-1;margin:0}\n#cm-image-lab .cil-check{display:flex;align-items:center;gap:8px;min-height:32px;font-size:14px;cursor:pointer}\n#cm-image-lab .cil-check input{width:16px;height:16px;margin:0;accent-color:#185ABC}\n#cm-image-lab .cil-stack{display:flex;flex-direction:column;gap:16px;min-width:0}\n#cm-image-lab .cil-range input[type=range]{max-width:420px}\n#cm-image-lab .cil-pick img{cursor:crosshair}\n#cm-image-lab .cil-pickbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin:10px 0 0}\n#cm-image-lab .cil-editor{margin:14px 0 4px;padding:16px;border:1px solid #D9E2EA;border-radius:10px;background:#fff;display:flex;flex-direction:column;gap:10px}\n#cm-image-lab .cil-ed-title{font-size:16px;color:#1F354D}\n#cm-image-lab .cil-editor>.cil-small{margin:-6px 0 0}\n#cm-image-lab .cil-ed-bar{display:flex;flex-wrap:wrap;align-items:center;gap:6px}\n#cm-image-lab .cil-ed-btn{min-width:40px;height:36px;padding:0 12px;border:1px solid #D9E2EA;border-radius:8px;background:#fff;color:#1F354D;font:inherit;font-size:14px;font-weight:600;cursor:pointer}\n#cm-image-lab .cil-ed-btn:hover:not(:disabled){border-color:#185ABC;color:#185ABC}\n#cm-image-lab .cil-ed-btn:disabled{opacity:.45;cursor:default}\n#cm-image-lab .cil-ed-zoom{min-width:44px;font-size:13px;color:var(--muted);text-align:center}\n#cm-image-lab .cil-ed-tol{flex:1 1 200px;margin-left:8px}\n#cm-image-lab .cil-ed-tol input[type=range]{max-width:260px}\n#cm-image-lab .cil-ed-view{max-height:520px;overflow:auto;border:1px solid #D9E2EA;border-radius:10px;background:repeating-conic-gradient(#EEF1F4 0 25%,#fff 0 50%) 0 0\/16px 16px;display:flex;min-height:200px}\n#cm-image-lab .cil-ed-canvas{display:block;flex:0 0 auto;margin:auto;cursor:crosshair;image-rendering:pixelated;height:auto}\n#cm-image-lab .cil-ed-foot{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}\n#cm-image-lab .cil-ed-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;min-height:58px}\n#cm-image-lab .cil-ed-modes{display:flex;flex-wrap:wrap;align-items:center;gap:6px;flex:1 1 320px}\n#cm-image-lab .cil-ed-toolbar .cil-ed-bar{margin-left:auto}\n#cm-image-lab .cil-ed-group{display:inline-flex;border:1px solid #D9E2EA;border-radius:8px;overflow:hidden;background:#fff}\n#cm-image-lab .cil-ed-mode{display:inline-flex!important;align-items:center;justify-content:center;width:40px;height:36px;padding:0!important;margin:0!important;border:0!important;border-radius:0!important;background:#fff!important;color:#1F354D!important;cursor:pointer;box-shadow:none!important}\n#cm-image-lab .cil-ed-mode+.cil-ed-mode{border-left:1px solid #D9E2EA!important}\n#cm-image-lab .cil-ed-mode:hover{background:#F3F9FE!important;color:#185ABC!important}\n#cm-image-lab .cil-ed-mode[aria-pressed='true'],#cm-image-lab .cil-ed-mode[aria-pressed='true']:hover,#cm-image-lab .cil-ed-mode[aria-pressed='true']:focus{background:#185ABC!important;color:#fff!important}\n#cm-image-lab .cil-ed-mode svg{display:block;pointer-events:none;fill:none!important;stroke:currentColor!important}\n#cm-image-lab .cil-ed-mode svg *{fill:none!important;stroke:currentColor!important;stroke-width:2!important}\n#cm-image-lab .cil-ed-mode svg,#cm-image-lab .cil-ed-mode svg *{stroke:#1F354D!important;color:#1F354D!important}\n#cm-image-lab .cil-ed-mode:hover svg,#cm-image-lab .cil-ed-mode:hover svg *{stroke:#185ABC!important}\n#cm-image-lab .cil-ed-mode[aria-pressed='true'] svg,#cm-image-lab .cil-ed-mode[aria-pressed='true'] svg *{stroke:#fff!important;color:#fff!important}\n#cm-image-lab .cil-ed-toolname{font-size:14px;font-weight:600;color:#1F354D;margin-right:8px}\n#cm-image-lab .cil-ed-canvas{touch-action:none}\n#cm-image-lab .cil-locked .cil-controls,#cm-image-lab .cil-locked .cil-grid,#cm-image-lab .cil-locked .cil-adv,#cm-image-lab .cil-locked .cil-hint{opacity:.5;pointer-events:none}\n#cm-image-lab .cil-locked .cil-editor .cil-hint{opacity:1;pointer-events:auto}\n#cm-image-lab .cil-lock-note{color:#1F354D}\n#cm-image-lab .cil-actions.cil-actions-split{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}\n#cm-image-lab .cil-acts-group{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;min-width:0}\n@media (max-width:700px){#cm-image-lab .cil-actions.cil-actions-split{grid-template-columns:1fr}}\n#cm-image-lab #cil-drop{position:relative}\n#cm-image-lab .cil-drop-ok{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;border-radius:inherit;background:rgba(248,251,239,.97);color:#1F354D;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility 0s linear .2s;pointer-events:none;z-index:2}\n#cm-image-lab .cil-drop-ok.cil-show{opacity:1;visibility:visible;transition:opacity .2s ease}\n#cm-image-lab .cil-drop-okicon{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:#9CCC3D;color:#fff;transform:scale(.8);transition:transform .25s ease}\n#cm-image-lab .cil-drop-ok.cil-show .cil-drop-okicon{transform:scale(1)}\n#cm-image-lab .cil-drop-okicon svg,#cm-image-lab .cil-drop-okicon svg *{fill:none!important;stroke:#fff!important}\n#cm-image-lab .cil-drop-oktext{font-size:20px;font-weight:700}\n#cm-image-lab .cil-drop-oksub{font-size:14px;color:#3D4F61}\n@media (prefers-reduced-motion:reduce){#cm-image-lab .cil-drop-ok,#cm-image-lab .cil-drop-okicon{transition:none}}\n#cm-image-lab .cil-clear-bottom{margin-left:auto}\n\/* no lingering focus look after a mouse click; keyboard focus still shows via :focus-visible *\/\n#cm-image-lab button:focus:not(:focus-visible),#cm-image-lab summary:focus:not(:focus-visible),#cm-image-lab select:focus:not(:focus-visible){outline:none!important;box-shadow:none!important}\n#cm-image-lab .cil-btn-text:focus:not(:focus-visible),#cm-image-lab .cil-btn-text:active{background:transparent!important;border-color:transparent!important}\n#cm-image-lab .cil-btn-secondary:focus:not(:focus-visible),#cm-image-lab .cil-btn-secondary:active{background:transparent!important;color:var(--blue)!important;box-shadow:inset 0 0 0 2px var(--blue)!important}\n#cm-image-lab .cil-btn:not(.cil-btn-secondary):not(.cil-btn-text):focus:not(:focus-visible){background:#185ABC!important;color:#fff!important}\n#cm-image-lab .cil-help{display:block;margin-top:5px;font-size:13px;line-height:1.45;color:var(--muted)}\n#cm-image-lab button:focus-visible,#cm-image-lab select:focus-visible,#cm-image-lab input:focus-visible,#cm-image-lab a:focus-visible{outline:2px solid var(--blue);outline-offset:2px}\n#cm-image-lab .cil-summary{border:0;border-radius:14px;background:var(--soft);padding:18px;margin:18px 0 22px}\n#cm-image-lab .cil-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:10px}\n#cm-image-lab .cil-stat{background:#fff;border:1px solid var(--line-soft);border-radius:12px;padding:14px 16px;min-width:0}\n#cm-image-lab .cil-stat-label{display:flex;align-items:flex-start;justify-content:space-between;gap:6px;font-size:13px;font-weight:700;color:var(--muted)}\n#cm-image-lab .cil-summary .cil-stat-value{display:block;font-size:26px;line-height:1.2;margin:4px 0 2px;color:var(--navy)}\n#cm-image-lab .cil-stat-sub{display:block;font-size:13px;color:var(--muted);line-height:1.4}\n#cm-image-lab .cil-stat-good .cil-stat-value{color:#4E7A0E}\n#cm-image-lab .cil-stat-warn .cil-stat-value{color:#8A6D00}\n#cm-image-lab .cil-stat-good{border-color:rgba(156,204,61,.45);background:#F8FBEF}\n#cm-image-lab .cil-stat-warn{border-color:rgba(230,214,60,.6);background:#FCFCE8}\n#cm-image-lab .cil-stat-alert{border-color:rgba(232,137,43,.5);background:#FFF4E8}\n#cm-image-lab .cil-stat-alert .cil-stat-value{color:#B5590C}\n#cm-image-lab .cil-summary .cil-small{display:block;font-size:13px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--navy)}\n\n#cm-image-lab .cil-summary p{margin:4px 0 0;color:var(--body)}\n#cm-image-lab .cil-file{border:1px solid var(--line);border-radius:14px;padding:22px 24px;margin:16px 0;min-width:0;background:#fff}\n#cm-image-lab .cil-filetop{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n#cm-image-lab .cil-filename{margin:0;font-size:17px;font-weight:700;color:var(--navy);overflow-wrap:anywhere;min-width:0}\n#cm-image-lab .cil-metrics{display:flex;flex-wrap:wrap;gap:10px;margin:12px 0}\n#cm-image-lab .cil-metric{padding:10px 14px;background:var(--soft);border:0;border-radius:10px;min-width:120px;flex:1}\n#cm-image-lab .cil-metric .cil-small{display:block}\n#cm-image-lab .cil-metric b{display:block;color:var(--navy)}\n#cm-image-lab .cil-hint{display:flex;gap:12px;align-items:flex-start;padding:11px 15px;border:1px solid rgba(24,90,188,.18);border-radius:12px;background:#F6FAFF;color:var(--text);font-size:15px;line-height:1.5;margin:10px 0}\n#cm-image-lab .cil-warn{border-color:rgba(230,214,60,.6);background:#FCFCE8}\n#cm-image-lab .cil-success{border-color:rgba(156,204,61,.45);background:#F8FBEF}\n#cm-image-lab .cil-success .cmac-info-icon{background:#7FAF2A}\n#cm-image-lab .cil-alert{border-color:rgba(232,137,43,.5);background:#FFF4E8}\n#cm-image-lab .cil-alert .cmac-info-icon{background:#E8892B}\n#cm-image-lab .cil-neutral{border-color:#E3E9EF;background:#F7F9FB}\n#cm-image-lab .cil-hint.cil-success .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#7FAF2A!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-success .cmac-info-icon::before{content:\"\";display:block;width:19px;height:19px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m16%209-5.5%205.5L8%2012%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m16%209-5.5%205.5L8%2012%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-warn .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#D9B800!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-warn .cmac-info-icon::before{content:\"\";display:block;width:19px;height:19px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712%27%20y1%3D%278%27%20y2%3D%2712%27%2F%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712.01%27%20y1%3D%2716%27%20y2%3D%2716%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712%27%20y1%3D%278%27%20y2%3D%2712%27%2F%3E%3Cline%20x1%3D%2712%27%20x2%3D%2712.01%27%20y1%3D%2716%27%20y2%3D%2716%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-alert .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#E8892B!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-alert .cmac-info-icon::before{content:\"\";display:block;width:16px;height:16px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m21.73%2018-8-14a2%202%200%200%200-3.48%200l-8%2014A2%202%200%200%200%204%2021h16a2%202%200%200%200%201.73-3%27%2F%3E%3Cpath%20d%3D%27M12%209v4%27%2F%3E%3Cpath%20d%3D%27M12%2017h.01%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m21.73%2018-8-14a2%202%200%200%200-3.48%200l-8%2014A2%202%200%200%200%204%2021h16a2%202%200%200%200%201.73-3%27%2F%3E%3Cpath%20d%3D%27M12%209v4%27%2F%3E%3Cpath%20d%3D%27M12%2017h.01%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-error .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#B84040!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-error .cmac-info-icon::before{content:\"\";display:block;width:19px;height:19px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m15%209-6%206%27%2F%3E%3Cpath%20d%3D%27m9%209%206%206%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%274%204%2016%2016%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.8%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m15%209-6%206%27%2F%3E%3Cpath%20d%3D%27m9%209%206%206%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-hint.cil-neutral .cmac-info-icon{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:#8A97A5!important;display:flex;align-items:center;justify-content:center;margin-top:-3px}\n#cm-image-lab .cil-hint.cil-neutral .cmac-info-icon::before{content:\"\";display:block;width:16px;height:16px;background:#fff;-webkit-mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M21.3%2015.3a2.4%202.4%200%200%201%200%203.4l-2.6%202.6a2.4%202.4%200%200%201-3.4%200L2.7%208.7a2.41%202.41%200%200%201%200-3.4l2.6-2.6a2.41%202.41%200%200%201%203.4%200Z%27%2F%3E%3Cpath%20d%3D%27m14.5%2012.5%202-2%27%2F%3E%3Cpath%20d%3D%27m11.5%209.5%202-2%27%2F%3E%3Cpath%20d%3D%27m8.5%206.5%202-2%27%2F%3E%3Cpath%20d%3D%27m17.5%2015.5%202-2%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain;mask:url(\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%272.3%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M21.3%2015.3a2.4%202.4%200%200%201%200%203.4l-2.6%202.6a2.4%202.4%200%200%201-3.4%200L2.7%208.7a2.41%202.41%200%200%201%200-3.4l2.6-2.6a2.41%202.41%200%200%201%203.4%200Z%27%2F%3E%3Cpath%20d%3D%27m14.5%2012.5%202-2%27%2F%3E%3Cpath%20d%3D%27m11.5%209.5%202-2%27%2F%3E%3Cpath%20d%3D%27m8.5%206.5%202-2%27%2F%3E%3Cpath%20d%3D%27m17.5%2015.5%202-2%27%2F%3E%3C%2Fsvg%3E\") no-repeat center\/contain}\n#cm-image-lab .cil-warn .cmac-info-icon{background:#D9B800}\n#cm-image-lab .cil-error{border-color:rgba(184,64,64,.32);background:var(--cmac-alert-soft,#FFF0F0)}\n#cm-image-lab .cil-success{border-color:rgba(156,204,61,.42);background:var(--green-soft)}\n#cm-image-lab .cil-controls{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}\n#cm-image-lab .cil-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px}\n#cm-image-lab .cil-guide{position:relative;display:block;overflow:hidden;margin:20px 0;padding:18px 18px 18px 22px;border:1px solid rgba(156,204,61,.32);border-radius:14px;background:linear-gradient(135deg,rgba(156,204,61,.14) 0%,rgba(255,255,255,.98) 58%,rgba(240,247,224,.8) 100%);box-shadow:0 8px 20px rgba(18,32,46,.06);text-decoration:none!important;color:#12202E;}\n#cm-image-lab .cil-guide::before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:5px;background:var(--green)}\n#cm-image-lab .cil-guide:hover{border-color:var(--green);box-shadow:0 14px 30px rgba(18,32,46,.13)}\n#cm-image-lab .cil-guide:focus-visible{outline:2px solid var(--blue);outline-offset:3px}\n#cm-image-lab .cil-badge{display:inline-flex;margin-bottom:11px;padding:4px 10px;border-radius:999px;background:var(--green);color:#fff;font-size:13px;font-weight:700;line-height:1.2;letter-spacing:.04em;text-transform:uppercase}\n#cm-image-lab .cil-guide-title{display:block;margin-bottom:5px;font-size:20px;font-weight:700;line-height:1.3;color:#12202E}\n#cm-image-lab .cil-guide-desc{display:block;margin-bottom:13px;color:#677482;font-size:16px;line-height:1.5}\n#cm-image-lab .cil-guide-cta{display:inline-flex;align-items:center;gap:.35em;color:var(--blue);font-size:15px;font-weight:700;}\n#cm-image-lab .cil-guide:hover .cil-guide-cta{color:var(--green)}\n#cm-image-lab .cil-hide{display:none!important}\n#cm-image-lab a{color:var(--blue)}\n#cm-image-lab .cil-unitrow{display:flex;gap:8px}\n#cm-image-lab .cil-unitrow input{flex:1 1 auto;min-width:0}\n#cm-image-lab .cil-unitrow select{flex:0 0 76px;width:76px}\n#cm-image-lab .cil-file .cil-grid{margin:12px 0;grid-template-columns:repeat(3,minmax(0,1fr))}\n@media (max-width:700px){#cm-image-lab .cil-file .cil-grid{grid-template-columns:1fr}}\n#cm-image-lab .cil-note{display:flex;gap:14px;align-items:flex-start;border-color:rgba(24,90,188,.18);background:#F6FAFF;box-shadow:none;margin:0 0 20px}\n#cm-image-lab .cmac-info-body{min-width:0;flex:1}\n#cm-image-lab .cmac-info-icon{display:none}\n#cm-image-lab[data-icons=\"1\"] .cmac-info-icon{display:block}\n#cm-image-lab[data-icons=\"1\"] .cil-hint .cmac-info-icon{flex:0 0 26px;width:26px;height:26px}\n#cm-image-lab .cil-error .cmac-info-icon{background:var(--cmac-alert,#B84040)}\n#cm-image-lab .cil-note .cmac-info-icon{margin-top:2px}\n#cm-image-lab .cil-note .cil-title{font-size:19px}\n#cm-image-lab .cil-list{margin:0 0 12px;padding-left:22px}\n#cm-image-lab .cil-list li{margin:6px 0;line-height:1.55}\n#cm-image-lab .cil-compare{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:6px}\n#cm-image-lab .cil-pane{margin:0;min-width:0}\n#cm-image-lab .cil-view{height:240px;overflow:auto;border:1px solid var(--line);border-radius:10px;background:repeating-conic-gradient(#EEF1F4 0 25%,#fff 0 50%) 0 0\/16px 16px;display:flex;align-items:center;justify-content:center;padding:0}\n#cm-image-lab .cil-view img{display:block;max-width:100%;max-height:100%;width:auto;height:auto;margin:0;border-radius:0}\n#cm-image-lab .cil-view[data-actual=\"1\"]{display:block}\n#cm-image-lab .cil-view[data-actual=\"1\"] img{max-width:none;max-height:none}\n#cm-image-lab .cil-pane figcaption{font-size:13px;color:var(--muted);margin-top:5px}\n#cm-image-lab .cil-eyebrow{display:block;font-size:13px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#5E8A14;margin:0 0 6px}\n#cm-image-lab .cil-basics{margin:16px 0 0;border:1px solid var(--line);border-radius:10px;background:#fff}\n#cm-image-lab .cil-basics summary{cursor:pointer;padding:12px 16px;font-weight:700;color:var(--navy);list-style:none;display:flex;align-items:center;gap:10px}\n#cm-image-lab .cil-basics summary::-webkit-details-marker{display:none}\n#cm-image-lab .cil-basics summary::before{content:'';flex:0 0 22px;width:22px;height:22px;border-radius:50%;background-color:var(--green);background-image:linear-gradient(#fff,#fff),linear-gradient(#fff,#fff);background-size:10px 2px,2px 10px;background-position:center;background-repeat:no-repeat}\n#cm-image-lab .cil-basics[open] summary::before{background-size:10px 2px,0 0}\n#cm-image-lab .cil-basics-body{padding:0 16px 14px 48px;color:var(--body);font-size:15px}\n#cm-image-lab .cil-basics-body p{margin:0 0 10px}\n#cm-image-lab .cil-added{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;margin:10px 0 0;padding:12px 16px;border:1px solid var(--green);border-radius:10px;background:var(--green-soft);color:var(--navy);font-size:15px;font-weight:600}\n#cm-image-lab .cil-added::before{content:'\u2713';display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--green);color:#fff;font-weight:800;font-size:13px}\n#cm-image-lab .cil-added .cil-btn-text{padding:0;font-size:15px}\n#cm-image-lab .cil-thumbs{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;margin:12px 0 0;padding:12px 16px;border:1px solid var(--green);border-radius:10px;background:var(--green-soft)}\n#cm-image-lab .cil-thumbrow{display:flex;flex-wrap:wrap;gap:8px}\n#cm-image-lab .cil-thumb{display:grid;place-items:center;width:56px;height:56px;border-radius:8px;overflow:hidden;background:#fff;border:1px solid var(--line);font-weight:700;color:var(--navy);font-size:14px}\n#cm-image-lab .cil-thumb img{width:100%;height:100%;object-fit:cover;display:block}\n#cm-image-lab .cil-thumbtext{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 220px;color:var(--body);font-size:14px}\n#cm-image-lab .cil-thumbtext strong{color:var(--navy);font-size:15px}\n#cm-image-lab .cil-thumbtext .cil-btn-text{align-self:flex-start;padding:2px 0 0;font-size:14px}\n#cm-image-lab .cil-intro{border:0;box-shadow:none;background:transparent;padding:0;margin:0 0 28px}\n#cm-image-lab .cil-hero{font-size:32px;line-height:1.15;margin:0 0 10px}\n\n\n\n\n#cm-image-lab #cil-guide{border:0;background:transparent;padding:0;color:var(--muted);font-size:15px;margin:0 0 18px}\n#cm-image-lab #cil-guide .cmac-info-icon{display:none!important}\n#cm-image-lab .cil-drop{border:2px dashed #B9D97A;background:linear-gradient(180deg,#FAFCF5 0%,#F3F8E8 100%);padding:52px 24px 40px;border-radius:18px}\n#cm-image-lab .cil-drop:hover{background:linear-gradient(180deg,#F7FBEF 0%,#EEF6DF 100%);border-color:var(--green)}\n#cm-image-lab .cil-drop-icon{width:64px;height:64px;border-radius:18px;background:#fff;box-shadow:0 2px 10px rgba(94,138,20,.15);margin-bottom:18px}\n#cm-image-lab .cil-drop-icon svg{width:30px;height:30px}\n#cm-image-lab .cil-drop-title{font-size:24px}\n#cm-image-lab .cil-privacy{display:flex;align-items:center;gap:10px;margin:16px 0 0;padding:10px 14px;background:var(--soft);border-radius:10px}\n#cm-image-lab .cil-lock{flex:0 0 28px;display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:#fff;color:var(--navy)}\n#cm-image-lab .cil-lock svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}\n#cm-image-lab .cil-filename{font-size:18px}\n@media(max-width:760px){#cm-image-lab .cil-stats{grid-template-columns:repeat(2,minmax(0,1fr))}}\n@media(max-width:640px){#cm-image-lab .cil-card{padding:20px}#cm-image-lab .cil-file{padding:16px}#cm-image-lab .cil-grid,#cm-image-lab .cil-controls,#cm-image-lab .cil-compare{grid-template-columns:1fr}#cm-image-lab .cil-metric{min-width:100px}}\n\n#cm-image-lab #cil-status:empty{display:none}\n#cm-image-lab #cil-status .cil-hint{margin:12px 0 0}\n<\/style>\n\n<script data-wp-block-html=\"js\">\n\/* CM Academy image checker v8 (DE), JavaScript tab. The code is encoded so WordPress cannot alter characters in it. *\/\n(function(){try{var c=decodeURIComponent(escape(atob(\"KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2lsU3RhcnQoKXsKKGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOwp2YXIgcm9vdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY20taW1hZ2UtbGFiJyk7aWYoIXJvb3R8fHJvb3QuZGF0YXNldC5yZWFkeSlyZXR1cm47cm9vdC5kYXRhc2V0LnJlYWR5PScxJzsKdHJ5e2lmKGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWNtYWMtYWNjZW50JykudHJpbSgpKXJvb3QuZGF0YXNldC5pY29ucz0nMSd9Y2F0Y2goZSl7fQpjb25zdCAkPWlkPT5yb290LnF1ZXJ5U2VsZWN0b3IoJyMnK2lkKTsKY29uc3QgS0I9MTAyNCxNQj1LQipLQixNQVhfUElYRUxTPTE2Nzc3MjE2LE1BWF9TSURFPTE2Mzg0LE1BWF9JTlBVVF9XSURUSD0xMjAwMCxNQVhfWklQX0ZJTEVTPTUwMCxNQVhfU1ZHX0JZVEVTPTEwKk1CLE1BWF9HSUZfU0NBTj02NCpNQixSRUFEX0NPTkNVUlJFTkNZPTM7CmNvbnN0IFdFQlNJVEU9e2hlYWRlcjp7YTpbMjU2MCw3NjgsNTY4XSxiOlsxMDI0LDc2OCw1NjhdLGM6WzMwMCw3NjgsNTY4XX0sYmFja2dyb3VuZDp7YTpbMjU2MCw3NjgsNTY4XSxiOlsxMDI0LDc2OCw1NjhdLGM6WzIyNDAsNzY4LDU2OF19LGNvbHVtbnM6e2E6WzExNDAsNTQ2LDM0OF0sYjpbMTAyNCw0MzgsMjc2XSxjOlsxMTQwLDU0NiwzNDhdfSxzZWN0aW9uOnthOlsxMTQwXSxiOlsxMDI0XSxjOlsxMTQwXX19Owpjb25zdCBFTUFJTD17JzEnOjYwMCwnMic6MzAwLCczJzoyMDB9Owpjb25zdCBUWVBFUz17J2ltYWdlL2pwZWcnOlsnSlBHJywnanBnJ10sJ2ltYWdlL3BuZyc6WydQTkcnLCdwbmcnXSwnaW1hZ2UvZ2lmJzpbJ0dJRicsJ2dpZiddLCdpbWFnZS9ibXAnOlsnQk1QJywnYm1wJ10sJ2ltYWdlL3dlYnAnOlsnV2ViUCcsJ3dlYnAnXSwnaW1hZ2Uvc3ZnK3htbCc6WydTVkcnLCdzdmcnXSwnaW1hZ2UvYXZpZic6WydBVklGJywnYXZpZiddLCdpbWFnZS9oZWljJzpbJ0hFSUMnLCdoZWljJ10sJ2ltYWdlL3RpZmYnOlsnVElGRicsJ3RpZiddLCdpbWFnZS94LWljb24nOlsnSUNPJywnaWNvJ119Owpjb25zdCBFWFRfVFlQRT17anBnOidpbWFnZS9qcGVnJyxqcGVnOidpbWFnZS9qcGVnJyxqcGU6J2ltYWdlL2pwZWcnLGpmaWY6J2ltYWdlL2pwZWcnLHBuZzonaW1hZ2UvcG5nJyxnaWY6J2ltYWdlL2dpZicsYm1wOidpbWFnZS9ibXAnLGRpYjonaW1hZ2UvYm1wJyx3ZWJwOidpbWFnZS93ZWJwJyxzdmc6J2ltYWdlL3N2Zyt4bWwnLGF2aWY6J2ltYWdlL2F2aWYnLGhlaWM6J2ltYWdlL2hlaWMnLGhlaWY6J2ltYWdlL2hlaWMnLHRpZjonaW1hZ2UvdGlmZicsdGlmZjonaW1hZ2UvdGlmZicsaWNvOidpbWFnZS94LWljb24nfTsKY29uc3QgQ01fQUNDRVBURUQ9WydpbWFnZS9qcGVnJywnaW1hZ2UvcG5nJywnaW1hZ2UvZ2lmJywnaW1hZ2UvYm1wJ107CmNvbnN0IEFMUEhBX1RZUEVTPVsnaW1hZ2UvcG5nJywnaW1hZ2UvZ2lmJywnaW1hZ2Uvd2VicCcsJ2ltYWdlL3N2Zyt4bWwnLCdpbWFnZS9ibXAnLCdpbWFnZS9hdmlmJywnaW1hZ2UvdGlmZicsJ2ltYWdlL3gtaWNvbiddOwpsZXQgYXJlYT0nd2Vic2l0ZScsaXRlbXM9W10sc2VyaWFsPTEsemlwQnVzeT1mYWxzZSxvcHRCdXN5PWZhbHNlO2NvbnN0IHF1ZXVlPVtdO2xldCBhY3RpdmU9MDsKY29uc3QgZm10PW49PihuPEtCP24rJyBCJzpuPE1CPyhuL0tCKS50b0ZpeGVkKG48MTAqS0I\/MTowKSsnIEtCJzoobi9NQikudG9GaXhlZCgyKSsnIE1CJykucmVwbGFjZSgnLicsJywnKTsKY29uc3QgZXh0T2Y9bmFtZT0+e2NvbnN0IG09L1wuKFteLlwvXFxdKykkLy5leGVjKG5hbWV8fCcnKTtyZXR1cm4gbT9tWzFdLnRvTG93ZXJDYXNlKCk6Jyd9Owpjb25zdCB0eXBlTGFiZWw9dD0+VFlQRVNbdF0\/VFlQRVNbdF1bMF06J3Vua25vd24nOwpjb25zdCBhbGl2ZT1pdGVtPT5pdGVtcy5pbmRleE9mKGl0ZW0pPi0xOwpmdW5jdGlvbiBzdGF0dXMobXNnLHRvbmUpe2NvbnN0IHN0PSQoJ2NpbC1zdGF0dXMnKTtzdC5jbGFzc0xpc3QucmVtb3ZlKCdjaWwtYWRkZWQnKTtzdC50ZXh0Q29udGVudD0nJztpZighbXNnKXJldHVybjtpZih0b25lKWhpbnQoc3QsbXNnLHRvbmUpO2Vsc2Ugc3QudGV4dENvbnRlbnQ9bXNnfQpmdW5jdGlvbiBnb1Jlc3VsdHMoKXtjb25zdCByPSQoJ2NpbC1yZXN1bHRzJyk7aWYoIXIpcmV0dXJuO2NvbnN0IHk9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LTkwO3dpbmRvdy5zY3JvbGxUbyh7dG9wOk1hdGgubWF4KDAseSksYmVoYXZpb3I6J3Ntb290aCd9KX0KZnVuY3Rpb24gdGh1bWJzKCl7Y29uc3QgYm94PSQoJ2NpbC10aHVtYnMnKTtpZighYm94KXJldHVybjtib3gudGV4dENvbnRlbnQ9Jyc7Ym94LmNsYXNzTGlzdC50b2dnbGUoJ2NpbC1oaWRlJywhaXRlbXMubGVuZ3RoKTtpZighaXRlbXMubGVuZ3RoKXJldHVybjsKIGNvbnN0IHJvdz1lbCgnZGl2JywnY2lsLXRodW1icm93Jyk7aXRlbXMuc2xpY2UoMCw4KS5mb3JFYWNoKGl0ZW09Pntjb25zdCBmPWVsKCdzcGFuJywnY2lsLXRodW1iJyk7aWYoaXRlbS51cmxPbmx5fHxpdGVtLmZpbGUgaW5zdGFuY2VvZiBCbG9iKXtjb25zdCBpbT1lbCgnaW1nJyk7aW0uYWx0PScnO2ltLm9uZXJyb3I9KCk9PntpZihpbS5kYXRhc2V0LmZifHxpdGVtLnVybE9ubHkpcmV0dXJuO2ltLmRhdGFzZXQuZmI9JzEnO2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e2ltLnNyYz1yLnJlc3VsdH07ci5yZWFkQXNEYXRhVVJMKGl0ZW0uZmlsZSl9O2ltLnNyYz1pdGVtLnVybE9ubHk\/aXRlbS5zcmNVcmw6b2JqVXJsKGl0ZW0sJ29yaWcnLGl0ZW0uZmlsZSk7Zi5hcHBlbmQoaW0pfWYudGl0bGU9aXRlbS5maWxlLm5hbWV8fCcnO3Jvdy5hcHBlbmQoZil9KTtpZihpdGVtcy5sZW5ndGg+OClyb3cuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXRodW1iIGNpbC10aHVtYi1tb3JlJywnKycrKGl0ZW1zLmxlbmd0aC04KSkpOwogY29uc3Qgbj1pdGVtcy5sZW5ndGgsdHh0PWVsKCdkaXYnLCdjaWwtdGh1bWJ0ZXh0Jyk7dHh0LmFwcGVuZChlbCgnc3Ryb25nJyxudWxsLG49PT0xPycxIEJpbGQgaGluenVnZWbDvGd0JzpuKycgQmlsZGVyIGhpbnp1Z2Vmw7xndCcpLGVsKCdzcGFuJyxudWxsLCdTY3JvbGxlbiBTaWUgbmFjaCB1bnRlbiwgdW0gR3LDtsOfZSB1bmQgTWHDn2UgamVkZXMgQmlsZGVzIHp1IHNlaGVuLCB1bmQgb3B0aW1pZXJlbiBTaWUgc2llIGJlaSBCZWRhcmYuJykpO2JveC5hcHBlbmQocm93LHR4dCl9CmZ1bmN0aW9uIHNob3dBZGRlZChuKXtjb25zdCBzdD0kKCdjaWwtc3RhdHVzJyk7c3QudGV4dENvbnRlbnQ9Jyc7c3QuY2xhc3NMaXN0LmFkZCgnY2lsLWFkZGVkJyk7Y29uc3QgdD1lbCgnc3BhbicsbnVsbCwobj09PTE\/JzEgQmlsZCBoaW56dWdlZsO8Z3QuJzpuKycgQmlsZGVyIGhpbnp1Z2Vmw7xndC4nKSsnIFfDpGhsZW4gU2llIHVudGVuIGRpZSBFaW5zdGVsbHVuZ2VuIHVuZCBvcHRpbWllcmVuIFNpZS4nKTtjb25zdCBiPWJ1dHRvbignWnUgSWhyZW4gQmlsZGVybicsZ29SZXN1bHRzLCdjaWwtYnRuLXRleHQnKTtzdC5hcHBlbmQodCxiKX0KLyogVXNhZ2UgdHJhY2tpbmcgdmlhIENNIEFjYWRlbXkgQ29tcGFuaW9uOiBvbmUgZXZlbnQgcGVyIGFjdGlvbiBwZXIgcGFnZSB2aWV3LiBPbmx5IHRoZSBhY3Rpb24gYW5kIFdlYnNpdGUvRW1haWwgYXJlIHNlbnQsIG5ldmVyIGZpbGUgbmFtZXMsIHNpemVzIG9yIGltYWdlcy4gRG9lcyBub3RoaW5nIGlmIHRyYWNraW5nIGlzIG9mZi4gKi8KY29uc3QgdHJhY2tlZD17fTsKZnVuY3Rpb24gdHJhY2soYWN0aW9uKXtjb25zdCBrZXk9J2ltYWdlX2NoZWNrZXJfJythY3Rpb24rJ18nK2FyZWE7aWYodHJhY2tlZFtrZXldKXJldHVybjt0cmFja2VkW2tleV09MTt0cnl7Y29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtiLnR5cGU9J2J1dHRvbic7Yi5oaWRkZW49dHJ1ZTtiLnNldEF0dHJpYnV0ZSgnZGF0YS1jbS10cmFjaycsJ2NtX2J1dHRvbl9jbGljaycpO2Iuc2V0QXR0cmlidXRlKCdkYXRhLWNtLWtleScsa2V5KTtiLnRleHRDb250ZW50PSdJbWFnZSBjaGVja2VyOiAnK2FjdGlvbisnICgnK2FyZWErJyknO2RvY3VtZW50LmJvZHkuYXBwZW5kKGIpO2IuY2xpY2soKTtiLnJlbW92ZSgpfWNhdGNoKGUpe319Ci8qIC0tLS0tLS0tLS0gc2V0dGluZ3MgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiB3ZWJzaXRlUmVjKGl0ZW0pe2NvbnN0IHA9aXRlbS53UGxhY2VtZW50O2lmKHA9PT0nY3VzdG9tJylyZXR1cm4gaXRlbS5zaXRlV2lkdGhVbml0PT09JyUnPyhpdGVtLnNpdGVXaWR0aCYmaXRlbS5zaXRlQmFzZT9NYXRoLnJvdW5kKGl0ZW0uc2l0ZUJhc2UqaXRlbS5zaXRlV2lkdGgvMTAwKTowKTppdGVtLnNpdGVXaWR0aHx8MDtyZXR1cm4gV0VCU0lURVtwXT9XRUJTSVRFW3BdW2l0ZW0ud1RoZW1lXVtwPT09J3NlY3Rpb24nPzA6KE51bWJlcihpdGVtLndWYXJpYW50KXx8MCldOjB9CmZ1bmN0aW9uIHN1Z2dlc3RlZChpdGVtKXtyZXR1cm4gYXJlYT09PSd3ZWJzaXRlJz93ZWJzaXRlUmVjKGl0ZW0pOml0ZW0ubGF5b3V0PT09J2N1c3RvbSc\/KGl0ZW0ubGF5b3V0V2lkdGhVbml0PT09JyUnPyhpdGVtLmxheW91dFdpZHRoP01hdGgucm91bmQoNjAwKml0ZW0ubGF5b3V0V2lkdGgvMTAwKTowKTppdGVtLmxheW91dFdpZHRofHwwKTpFTUFJTFtpdGVtLmxheW91dF18fDYwMH0KZnVuY3Rpb24gdG9vTmFycm93KGl0ZW0pe2NvbnN0IHI9c3VnZ2VzdGVkKGl0ZW0pO3JldHVybiAhIXImJml0ZW0udHlwZSE9PSdpbWFnZS9zdmcreG1sJyYmaXRlbS53aWR0aD4wJiZpdGVtLndpZHRoPHIqMC43NX0KZnVuY3Rpb24gZW1haWxWZXJkaWN0KG4pe3JldHVybiBuPDUwMCpLQj8nU2VociBndXQuJzpuPD1NQj8nR3V0Lic6bjw9MipNQj8nRXJ3w6RnZW4gU2llIGVpbmUgT3B0aW1pZXJ1bmcuIFppZWw6IGluc2dlc2FtdCB1bnRlciAxIE1CLic6J09wdGltaWVydW5nIGVtcGZvaGxlbi4gR3Jvw59lIEUtTWFpbHMgd2VyZGVuIGxhbmdzYW1lciB2ZXJzZW5kZXQgdW5kIHZvbiBtYW5jaGVuIFBvc3Rmw6RjaGVybiBhYmdlbGVobnQuIFppZWw6IHVudGVyIDEgTUIgdW5kIGjDtmNoc3RlbnMgMiBNQi4nfQpmdW5jdGlvbiBpc0NvbHVtbihpdGVtKXtyZXR1cm4gYXJlYT09PSd3ZWJzaXRlJyYmKGl0ZW0ud1BsYWNlbWVudD09PSdjb2x1bW5zJ3x8aXRlbS53UGxhY2VtZW50PT09J3NlY3Rpb24nKX0KZnVuY3Rpb24gaXNFeGFjdChpdGVtKXtyZXR1cm4gYXJlYT09PSd3ZWJzaXRlJyYmKGl0ZW0ud1BsYWNlbWVudD09PSdiYWNrZ3JvdW5kJ3x8aXRlbS53UGxhY2VtZW50PT09J2hlYWRlcicpfQpmdW5jdGlvbiBsZXZlbChpKXtpZihpLmxvYWRpbmcpcmV0dXJuIC0xO2NvbnN0IFI9aS5yZXN1bHQmJiFpLnJlc3VsdC5rZXB0T3JpZ2luYWw\/aS5yZXN1bHQ6bnVsbDtpZihSJiZpLnR5cGUhPT0naW1hZ2Uvc3ZnK3htbCcmJmkud2lkdGg8Ui53aWR0aCowLjkpcmV0dXJuIDM7aWYoaS5lcnJvcnx8KCFSJiYoaS5taXNtYXRjaHx8KGkudHlwZSYmIUNNX0FDQ0VQVEVELmluY2x1ZGVzKGkudHlwZSkpKSkpcmV0dXJuIDM7Y29uc3Qgcj1zdWdnZXN0ZWQoaSksc3ZnPSFSJiZpLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcsVz1SP1Iud2lkdGg6aS53aWR0aCxTWj1SP1IuYmxvYi5zaXplOmkuZmlsZS5zaXplO2xldCBsdj0wO2lmKHImJlc+MCYmIXN2Zyl7aWYoaXNFeGFjdChpKSlsdj1XPT09cj8wOjM7ZWxzZSBpZihpc0NvbHVtbihpKSlsdj1NYXRoLmFicyhXLXIpPD01PzA6MjtlbHNlIGlmKFc8cnx8Vz5yKjIpbHY9Mn1pZihTWj5NQilsdj0zO2Vsc2UgaWYoU1o+NTAwKktCKWx2PU1hdGgubWF4KGx2LDIpO3JldHVybiBsdn0KZnVuY3Rpb24gaXNDdXN0b21XaWR0aChpdGVtKXtyZXR1cm4gYXJlYT09PSd3ZWJzaXRlJz9pdGVtLndQbGFjZW1lbnQ9PT0nY3VzdG9tJzppdGVtLmxheW91dD09PSdjdXN0b20nfQpmdW5jdGlvbiB1cGRhdGVHdWlkZSgpeyQoJ2NpbC1ndWlkZScpLnRleHRDb250ZW50PWFyZWE9PT0nZW1haWwnPydGw7xnZW4gU2llIGFsbGUgQmlsZGVyIGhpbnp1LCBkaWUgU2llIGluIElocmVyIEUtTWFpbCB2ZXJ3ZW5kZW4gbcO2Y2h0ZW4uIFfDpGhsZW4gU2llIGbDvHIgamVkZXMgQmlsZCBlaW4gU3BhbHRlbmxheW91dCBvZGVyIGdlYmVuIFNpZSBlaW5lIGVpZ2VuZSBCcmVpdGUgZWluLiBFbXBmb2hsZW5lIEJyZWl0ZW46IGVpbmUgU3BhbHRlIDYwMCBweCwgendlaSBTcGFsdGVuIDMwMCBweCwgZHJlaSBTcGFsdGVuIDIwMCBweCAoU3RhbmRhcmQtRS1NYWlsIG1pdCA2MDAgcHgpLiBEYXMgc2luZCBSaWNodHdlcnRlLCBrZWluZSBVcGxvYWQtR3Jlbnplbi4gRGllIEdlc2FtdGdyw7bDn2UgYWxsZXIgQmlsZGVyLCBhdWNoIGRlciBCaWxkZXIgYXVzIGVpbmVyIFVSTCwgd2lyZCB1bnRlbiBhbmdlemVpZ3QuJzonRsO8Z2VuIFNpZSBlaW4gb2RlciBtZWhyZXJlIEJpbGRlciBoaW56dS4gV8OkaGxlbiBTaWUgZsO8ciBqZWRlcyBCaWxkIFBsYXR6aWVydW5nIHVuZCBUaGVtZS4gSGludGVyZ3J1bmRiaWxkZXIgaW4gSGVhZGVybiB1bmQgQmVyZWljaGVuIGJlbsO2dGlnZW4gZ2VuYXUgZGllIGFuZ2V6ZWlndGUgQnJlaXRlLiBCaWxkZXIgaW4gU3BhbHRlbiByaWNodGVuIHNpY2ggYW0gYmVzdGVuIG1pdCBkZXIgZW1wZm9obGVuZW4gQnJlaXRlIGF1cywgZGllIGF1ZiBkZW4gU3RhbmRhcmQtU3BhbHRlbmJyZWl0ZW4gYmFzaWVydC4gV2VubiBTaWUgZGllIFNwYWx0ZW5icmVpdGVuIGdlw6RuZGVydCBoYWJlbiwgd8OkaGxlbiBTaWUgc3RhdHRkZXNzZW4gRWlnZW5lIEJyZWl0ZS4nfQpmdW5jdGlvbiBzZXR0aW5nc0NoYW5nZWQoKXt1cGRhdGVHdWlkZSgpO2l0ZW1zLmZvckVhY2goaT0+e2lmKGkucmVzaXplPT09J3JlY29tbWVuZGVkJylpbnZhbGlkYXRlKGkpfSk7cmVuZGVyKCl9CnJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJlYV0nKS5mb3JFYWNoKGI9PmIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57aWYoYXJlYT09PWIuZGF0YXNldC5hcmVhKXJldHVybjthcmVhPWIuZGF0YXNldC5hcmVhO3Jvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJlYV0nKS5mb3JFYWNoKHg9Pnguc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLFN0cmluZyh4PT09YikpKTtyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW9ubHldJykuZm9yRWFjaCh4PT54LmNsYXNzTGlzdC50b2dnbGUoJ2NpbC1oaWRlJyx4LmRhdGFzZXQub25seSE9PWFyZWEpKTtzZXR0aW5nc0NoYW5nZWQoKTtpZighYi5kYXRhc2V0LnNpbGVudCl7dHJ5e2NvbnN0IHU9bmV3IFVSTChsb2NhdGlvbi5ocmVmKTt1LnNlYXJjaFBhcmFtcy5zZXQoJ3VzZScsYXJlYSk7aGlzdG9yeS5yZXBsYWNlU3RhdGUoaGlzdG9yeS5zdGF0ZSwnJyx1KX1jYXRjaChlKXt9fX0pKTsKLyogTGluayBkaXJlY3RseSB0byBhIHRhYjogP3VzZT1lbWFpbCBvciA\/dXNlPXdlYnNpdGUgKGFsc28gI2VtYWlsIC8gI3dlYnNpdGUpICovCnRyeXtjb25zdCBxPW5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKS5nZXQoJ3VzZScpfHxsb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCcnKTtpZihxPT09J2VtYWlsJ3x8cT09PSd3ZWJzaXRlJyl7Y29uc3QgYj1yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFyZWE9IicrcSsnIl0nKTtpZihiKXtiLmRhdGFzZXQuc2lsZW50PScxJztiLmNsaWNrKCk7ZGVsZXRlIGIuZGF0YXNldC5zaWxlbnR9fX1jYXRjaChlKXt9CnVwZGF0ZUd1aWRlKCk7Ci8qIC0tLS0tLS0tLS0gZmlsZSBpbnRha2UgLS0tLS0tLS0tLSAqLwokKCdjaWwtYWRkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9PntlLnN0b3BQcm9wYWdhdGlvbigpOyQoJ2NpbC1pbnB1dCcpLmNsaWNrKCl9KTsKJCgnY2lsLWRyb3AnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2lmKGUudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbixpbnB1dCcpKXJldHVybjskKCdjaWwtaW5wdXQnKS5jbGljaygpfSk7CiQoJ2NpbC1pbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZT0+e2NvbnN0IGY9QXJyYXkuZnJvbShlLnRhcmdldC5maWxlc3x8W10pO2UudGFyZ2V0LnZhbHVlPScnO2FkZEZpbGVzKGYpfSk7CmNvbnN0IGR6PSQoJ2NpbC1kcm9wJyksaGFzRmlsZXM9ZT0+ISFlLmRhdGFUcmFuc2ZlciYmQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci50eXBlc3x8W10pLmluZGV4T2YoJ0ZpbGVzJyk+LTE7CnJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLGU9PntpZighaGFzRmlsZXMoZSkpcmV0dXJuO2UucHJldmVudERlZmF1bHQoKTtlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSdjb3B5Jztkei5kYXRhc2V0LmRyYWc9JzEnfSk7CnJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJyxlPT57aWYoIXJvb3QuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSlkZWxldGUgZHouZGF0YXNldC5kcmFnfSk7CnJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsZT0+e2lmKCFoYXNGaWxlcyhlKSlyZXR1cm47ZS5wcmV2ZW50RGVmYXVsdCgpO2RlbGV0ZSBkei5kYXRhc2V0LmRyYWc7YWRkRmlsZXMoQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlc3x8W10pKX0pOwpmdW5jdGlvbiBjbGVhckFsbCgpe2lmKGl0ZW1zLnNvbWUoaT0+aS5yZXN1bHQmJiFpLnJlc3VsdC5rZXB0T3JpZ2luYWwpJiYhd2luZG93LmNvbmZpcm0oJ0FsbGUgQmlsZGVyIGVudGZlcm5lbj8gT3B0aW1pZXJ0ZSBCaWxkZXIsIGRpZSBTaWUgbmljaHQgaGVydW50ZXJnZWxhZGVuIGhhYmVuLCBnZWhlbiB2ZXJsb3Jlbi4nKSlyZXR1cm47aXRlbXMuZm9yRWFjaChkaXNjYXJkKTtpdGVtcz1bXTtxdWV1ZS5sZW5ndGg9MDtyZW5kZXIoKTtzdGF0dXMoJ0FsbGUgQmlsZGVyIHd1cmRlbiBlbnRmZXJudC4nKTskKCdjaWwtYWRkJykuZm9jdXMoKX0KJCgnY2lsLWNsZWFyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsZWFyQWxsKTtpZigkKCdjaWwtY2xlYXIyJykpJCgnY2lsLWNsZWFyMicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbGVhckFsbCk7CmFzeW5jIGZ1bmN0aW9uIGhlYWRCeXRlcyhmaWxlLG4pe3JldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBmaWxlLnNsaWNlKDAsbikuYXJyYXlCdWZmZXIoKSl9CmFzeW5jIGZ1bmN0aW9uIHNuaWZmKGZpbGUpewogY29uc3QgYj1hd2FpdCBoZWFkQnl0ZXMoZmlsZSw2NCksYXQ9KG8scyk9Pntmb3IobGV0IGk9MDtpPHMubGVuZ3RoO2krKylpZihiW28raV0hPT1zLmNoYXJDb2RlQXQoaSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfTsKIGlmKGJbMF09PT0weEZGJiZiWzFdPT09MHhEOCYmYlsyXT09PTB4RkYpcmV0dXJuICdpbWFnZS9qcGVnJzsKIGlmKGF0KDAsJ1x4ODlQTkdcclxuXHgxYVxuJykpcmV0dXJuICdpbWFnZS9wbmcnOwogaWYoYXQoMCwnR0lGODdhJyl8fGF0KDAsJ0dJRjg5YScpKXJldHVybiAnaW1hZ2UvZ2lmJzsKIGlmKGF0KDAsJ0JNJykmJmIubGVuZ3RoPj0xOCYmWzEyLDE2LDQwLDUyLDU2LDY0LDEwOCwxMjRdLmluZGV4T2YoYlsxNF18KGJbMTVdPDw4KSk+LTEmJmJbMTZdPT09MCYmYlsxN109PT0wKXJldHVybiAnaW1hZ2UvYm1wJzsKIGlmKGF0KDAsJ1JJRkYnKSYmYXQoOCwnV0VCUCcpKXJldHVybiAnaW1hZ2Uvd2VicCc7CiBpZihhdCg0LCdmdHlwJykpe2NvbnN0IHM9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGIuc3ViYXJyYXkoOCw2NCkpO2lmKC9hdmlbZnNdLy50ZXN0KHMpKXJldHVybiAnaW1hZ2UvYXZpZic7aWYoL2hlaVtjbXN4XXxoZXZbY21zeF18bWlmMXxtc2YxLy50ZXN0KHMpKXJldHVybiAnaW1hZ2UvaGVpYyc7cmV0dXJuICcnfQogaWYoKGF0KDAsJ0lJJykmJmJbMl09PT00MiYmYlszXT09PTApfHwoYXQoMCwnTU0nKSYmYlsyXT09PTAmJmJbM109PT00MikpcmV0dXJuICdpbWFnZS90aWZmJzsKIGlmKGJbMF09PT0wJiZiWzFdPT09MCYmYlsyXT09PTEmJmJbM109PT0wJiZiWzRdPjApcmV0dXJuICdpbWFnZS94LWljb24nOwogY29uc3QgaGVhZD1uZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGF3YWl0IGhlYWRCeXRlcyhmaWxlLDQwOTYpKS5yZXBsYWNlKC9eXHVGRUZGLywnJyk7CiBpZigvXlxzKig8XD94bWxbXj5dKlw\/PlxzKik\/KFx4M2MhLS1bXHNcU10qPy0tXHgzZVxzKnxceDNjIURPQ1RZUEVbXj5dKj5ccyopKjxzdmdbXHM+XC9dL2kudGVzdChoZWFkKSlyZXR1cm4gJ2ltYWdlL3N2Zyt4bWwnOwogcmV0dXJuICcnOwp9CmZ1bmN0aW9uIGRlZmF1bHRPdXRwdXQodHlwZSl7cmV0dXJuIHR5cGU9PT0naW1hZ2UvZ2lmJz8nb3JpZ2luYWwnOidhdXRvJ30KYXN5bmMgZnVuY3Rpb24gYWRkRmlsZXMoZmlsZXMpewogaWYoIWZpbGVzLmxlbmd0aClyZXR1cm47bGV0IGFkZGVkPTAsZHVwZXM9MDtjb25zdCByZWplY3RlZD1bXSxkYW1hZ2VkPVtdOwogZm9yKGNvbnN0IGZpbGUgb2YgZmlsZXMpewogIGNvbnN0IGtleT1bZmlsZS5uYW1lLGZpbGUuc2l6ZSxmaWxlLmxhc3RNb2RpZmllZF0uam9pbignOicpOwogIGlmKGl0ZW1zLnNvbWUoaT0+aS5rZXk9PT1rZXkpKXtkdXBlcysrO2NvbnRpbnVlfQogIGxldCB0eXBlPScnO3RyeXt0eXBlPWF3YWl0IHNuaWZmKGZpbGUpfWNhdGNoKGUpe30KICBpZighdHlwZSl7KEVYVF9UWVBFW2V4dE9mKGZpbGUubmFtZSldP2RhbWFnZWQ6cmVqZWN0ZWQpLnB1c2goZmlsZS5uYW1lfHwndW5iZW5hbm50ZSBEYXRlaScpO2NvbnRpbnVlfQogIGlmKGl0ZW1zLnNvbWUoaT0+aS5rZXk9PT1rZXkpKXtkdXBlcysrO2NvbnRpbnVlfQogIGNvbnN0IGNsYWltZWQ9RVhUX1RZUEVbZXh0T2YoZmlsZS5uYW1lKV18fCcnOwogIGNvbnN0IGl0ZW09e2lkOnNlcmlhbCsrLGtleSxmaWxlLHR5cGUsY2xhaW1lZCxtaXNtYXRjaDpjbGFpbWVkIT09dHlwZSx3aWR0aDowLGhlaWdodDowLGxvYWRpbmc6dHJ1ZSxlcnJvcjonJyxmcmFtZXM6MCxhbmltYXRlZDpmYWxzZSxzdmc6bnVsbCxzdmdBc3N1bWVkOmZhbHNlLGxheW91dDonMScsbGF5b3V0V2lkdGg6MCxzaXRlV2lkdGg6MCxsYXlvdXRXaWR0aFVuaXQ6J3B4JyxzaXRlV2lkdGhVbml0OidweCcsc2l0ZUJhc2U6MCx3UGxhY2VtZW50Oidub25lJyx3VGhlbWU6J2EnLHdWYXJpYW50OicwJyxjb21wYXJlOmZhbHNlLHRyYW5zcDpmYWxzZSx0b2w6NDAsY2xpY2tzOltdLGFjdHVhbDpmYWxzZSx1cmxzOnt9LG91dHB1dDpkZWZhdWx0T3V0cHV0KHR5cGUpLHJlc2l6ZToncmVjb21tZW5kZWQnLGN1c3RvbVdpZHRoOjAscXVhbGl0eTo4Mixjb2xvdXJzOjI1NixyZXN1bHQ6bnVsbCxidXN5OmZhbHNlLHJldjowfTsKICBpdGVtcy5wdXNoKGl0ZW0pO3F1ZXVlLnB1c2goaXRlbSk7YWRkZWQrKzsKIH0KIHB1bXAoKTtyZW5kZXIoKTtpZihhZGRlZCl7dHJhY2soJ2FkZCcpO2Ryb3BDb25maXJtKGFkZGVkKX0KIGNvbnN0IG1zZz1bXTtpZihhZGRlZCltc2cucHVzaChhZGRlZCsoYWRkZWQ9PT0xPycgQmlsZCc6JyBCaWxkZXInKSsnIGhpbnp1Z2Vmw7xndC4nKTtpZihkdXBlcyltc2cucHVzaChkdXBlcysnIGlzdCBiZXJlaXRzIGluIGRlciBMaXN0ZS4nKTsKIGlmKGRhbWFnZWQubGVuZ3RoKW1zZy5wdXNoKChkYW1hZ2VkLmxlbmd0aD09PTE\/J0RpZXNlIERhdGVpIHNpZWh0IHdpZSBlaW4gQmlsZCBhdXMsIGtvbm50ZSBhYmVyIG5pY2h0IGdlbGVzZW4gd2VyZGVuOiAnOidEaWVzZSBEYXRlaWVuIHNlaGVuIHdpZSBCaWxkZXIgYXVzLCBrb25udGVuIGFiZXIgbmljaHQgZ2VsZXNlbiB3ZXJkZW46ICcpK2RhbWFnZWQuc2xpY2UoMCwzKS5qb2luKCcsICcpKyhkYW1hZ2VkLmxlbmd0aD4zPycgdW5kICcrKGRhbWFnZWQubGVuZ3RoLTMpKycgd2VpdGVyZSc6JycpKycuICcrKGRhbWFnZWQubGVuZ3RoPT09MT8nRGllIERhdGVpIGlzdCBtw7ZnbGljaGVyd2Vpc2UgYmVzY2jDpGRpZ3Qgb2RlciBmYWxzY2ggZ2VzcGVpY2hlcnQuIMOWZmZuZW4gU2llIHNpZSBpbiBJaHJlbSBCaWxkcHJvZ3JhbW0gdW5kIHNwZWljaGVybiBvZGVyIGV4cG9ydGllcmVuIFNpZSBzaWUgZXJuZXV0Lic6J0RpZSBEYXRlaWVuIHNpbmQgbcO2Z2xpY2hlcndlaXNlIGJlc2Now6RkaWd0IG9kZXIgZmFsc2NoIGdlc3BlaWNoZXJ0LiDDlmZmbmVuIFNpZSBzaWUgaW4gSWhyZW0gQmlsZHByb2dyYW1tIHVuZCBzcGVpY2hlcm4gb2RlciBleHBvcnRpZXJlbiBTaWUgc2llIGVybmV1dC4nKSk7CiBpZihyZWplY3RlZC5sZW5ndGgpbXNnLnB1c2goKHJlamVjdGVkLmxlbmd0aD09PTE\/J0RpZXNlIERhdGVpIGlzdCBrZWluIEJpbGQgdW5kIGthbm4gbmljaHQgZ2VwcsO8ZnQgd2VyZGVuOiAnOidEaWVzZSBEYXRlaWVuIHNpbmQga2VpbmUgQmlsZGVyIHVuZCBrw7ZubmVuIG5pY2h0IGdlcHLDvGZ0IHdlcmRlbjogJykrcmVqZWN0ZWQuc2xpY2UoMCwzKS5qb2luKCcsICcpKyhyZWplY3RlZC5sZW5ndGg+Mz8nIHVuZCAnKyhyZWplY3RlZC5sZW5ndGgtMykrJyB3ZWl0ZXJlJzonJykrJy4gV8OkaGxlbiBTaWUgZWluZSBKUEctLCBQTkctLCBHSUYtLCBCTVAtLCBXZWJQLSBvZGVyIFNWRy1EYXRlaS4nKTsKIGlmKHJlamVjdGVkLmxlbmd0aHx8ZGFtYWdlZC5sZW5ndGgpc3RhdHVzKG1zZy5maWx0ZXIobT0+IS8gYWRkZWRcLiQvLnRlc3QobSkpLmpvaW4oJyAnKSwnZXJyb3InKTtlbHNlIGlmKGR1cGVzKXN0YXR1cyhtc2cuZmlsdGVyKG09PiEvIGFkZGVkXC4kLy50ZXN0KG0pKS5qb2luKCcgJykpO2Vsc2Ugc3RhdHVzKCcnKQp9CmZ1bmN0aW9uIGRyb3BDb25maXJtKG4pe2NvbnN0IGQ9JCgnY2lsLWRyb3AnKTtpZighZClyZXR1cm47bGV0IG9rPWQucXVlcnlTZWxlY3RvcignLmNpbC1kcm9wLW9rJyk7aWYoIW9rKXtvaz1lbCgnZGl2JywnY2lsLWRyb3Atb2snKTtvay5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywndHJ1ZScpO29rLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9ImNpbC1kcm9wLW9raWNvbiI+PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMCA2IDkgMTdsLTUtNSIvPjwvc3ZnPjwvc3Bhbj48c3Ryb25nIGNsYXNzPSJjaWwtZHJvcC1va3RleHQiPjwvc3Ryb25nPjxzcGFuIGNsYXNzPSJjaWwtZHJvcC1va3N1YiI+RGV0YWlscyBzaWVoZSB1bnRlbjwvc3Bhbj4nO2QuYXBwZW5kKG9rKX1vay5xdWVyeVNlbGVjdG9yKCcuY2lsLWRyb3Atb2t0ZXh0JykudGV4dENvbnRlbnQ9bisobj09PTE\/JyBCaWxkIGhpbnp1Z2Vmw7xndCc6JyBCaWxkZXIgaGluenVnZWbDvGd0Jyk7b2suY2xhc3NMaXN0LnJlbW92ZSgnY2lsLXNob3cnKTt2b2lkIG9rLm9mZnNldFdpZHRoO29rLmNsYXNzTGlzdC5hZGQoJ2NpbC1zaG93Jyk7Y2xlYXJUaW1lb3V0KGRyb3BDb25maXJtLnQpO2Ryb3BDb25maXJtLnQ9c2V0VGltZW91dCgoKT0+b2suY2xhc3NMaXN0LnJlbW92ZSgnY2lsLXNob3cnKSwyMjAwKX0KZnVuY3Rpb24gcHVtcCgpe3doaWxlKGFjdGl2ZTxSRUFEX0NPTkNVUlJFTkNZJiZxdWV1ZS5sZW5ndGgpe2NvbnN0IGl0ZW09cXVldWUuc2hpZnQoKTtpZighYWxpdmUoaXRlbSkpY29udGludWU7YWN0aXZlKys7aW5zcGVjdChpdGVtKS5maW5hbGx5KCgpPT57YWN0aXZlLS07cHVtcCgpfSl9fQpmdW5jdGlvbiBnaWZGcmFtZXMoYil7CiBpZihiLmxlbmd0aDwxMylyZXR1cm4gMDtsZXQgcD0xMyxmcmFtZXM9MDtpZihiWzEwXSYweDgwKXArPTMqKDE8PCgoYlsxMF0mNykrMSkpOwogY29uc3Qgc2tpcEJsb2Nrcz0oKT0+e3doaWxlKHA8Yi5sZW5ndGgmJmJbcF0hPT0wKXArPWJbcF0rMTtwKyt9Owogd2hpbGUocDxiLmxlbmd0aCl7Y29uc3QgYz1iW3ArK107aWYoYz09PTB4M0IpYnJlYWs7aWYoYz09PTB4MjEpe3ArKztza2lwQmxvY2tzKCl9ZWxzZSBpZihjPT09MHgyQyl7ZnJhbWVzKys7aWYocCs5PmIubGVuZ3RoKWJyZWFrO2NvbnN0IHBrPWJbcCs4XTtwKz05O2lmKHBrJjB4ODApcCs9MyooMTw8KChwayY3KSsxKSk7cCsrO3NraXBCbG9ja3MoKX1lbHNlIGJyZWFrfQogcmV0dXJuIGZyYW1lczsKfQphc3luYyBmdW5jdGlvbiBpc0FwbmcoZmlsZSl7Y29uc3QgYj1hd2FpdCBoZWFkQnl0ZXMoZmlsZSw0Kk1CKSx2PW5ldyBEYXRhVmlldyhiLmJ1ZmZlcik7bGV0IHA9ODt3aGlsZShwKzg8PWIubGVuZ3RoKXtjb25zdCBsZW49di5nZXRVaW50MzIocCksdD1TdHJpbmcuZnJvbUNoYXJDb2RlKGJbcCs0XSxiW3ArNV0sYltwKzZdLGJbcCs3XSk7aWYodD09PSdhY1RMJylyZXR1cm4gdHJ1ZTtpZih0PT09J0lEQVQnfHx0PT09J0lFTkQnKXJldHVybiBmYWxzZTtwKz0xMitsZW59cmV0dXJuIGZhbHNlfQphc3luYyBmdW5jdGlvbiBpc0FuaW1hdGVkV2VicChmaWxlKXtjb25zdCBiPWF3YWl0IGhlYWRCeXRlcyhmaWxlLDMyKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShiWzEyXSxiWzEzXSxiWzE0XSxiWzE1XSk9PT0nVlA4WCcmJihiWzIwXSYweDAyKT09PTB4MDJ9CmZ1bmN0aW9uIGxvYWRJbWcoYmxvYil7cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pntjb25zdCB1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxpbWc9bmV3IEltYWdlKCk7aW1nLm9ubG9hZD0oKT0+cmVzb2x2ZSh7c291cmNlOmltZyx3aWR0aDppbWcubmF0dXJhbFdpZHRoLGhlaWdodDppbWcubmF0dXJhbEhlaWdodCxyZWxlYXNlOigpPT5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCl9KTtpbWcub25lcnJvcj0oKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodXJsKTsvKiBGYWxsYmFjayBmb3Igc2l0ZXMgd2hvc2Ugc2VjdXJpdHkgcG9saWN5IGJsb2NrcyBibG9iOiBpbWFnZXMgKi9jb25zdCByPW5ldyBGaWxlUmVhZGVyKCk7ci5vbmxvYWQ9KCk9Pntjb25zdCBpMj1uZXcgSW1hZ2UoKTtpMi5vbmxvYWQ9KCk9PnJlc29sdmUoe3NvdXJjZTppMix3aWR0aDppMi5uYXR1cmFsV2lkdGgsaGVpZ2h0OmkyLm5hdHVyYWxIZWlnaHQscmVsZWFzZTooKT0+e319KTtpMi5vbmVycm9yPSgpPT5yZWplY3QoRXJyb3IoJ2RlY29kZScpKTtpMi5zcmM9ci5yZXN1bHR9O3Iub25lcnJvcj0oKT0+cmVqZWN0KEVycm9yKCdkZWNvZGUnKSk7ci5yZWFkQXNEYXRhVVJMKGJsb2IpfTtpbWcuc3JjPXVybH0pfQphc3luYyBmdW5jdGlvbiBkZWNvZGVSYXN0ZXIoZmlsZSl7CiBpZih0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXA9PT0nZnVuY3Rpb24nKXt0cnl7Y29uc3QgYm1wPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGZpbGUse2ltYWdlT3JpZW50YXRpb246J2Zyb20taW1hZ2UnfSk7cmV0dXJuIHtzb3VyY2U6Ym1wLHdpZHRoOmJtcC53aWR0aCxoZWlnaHQ6Ym1wLmhlaWdodCxyZWxlYXNlOigpPT5ibXAuY2xvc2UmJmJtcC5jbG9zZSgpfX1jYXRjaChlKXt9fQogcmV0dXJuIGxvYWRJbWcoZmlsZSk7Cn0KYXN5bmMgZnVuY3Rpb24gc3ZnSW5mbyhmaWxlKXsKIGlmKGZpbGUuc2l6ZT5NQVhfU1ZHX0JZVEVTKXRocm93IEVycm9yKCdEaWVzZSBTVkctRGF0ZWkgaXN0IHp1IGdyb8OfIGbDvHIgZWluZSBzaWNoZXJlIFByw7xmdW5nICjDvGJlciAxMCBNQikuJyk7CiBjb25zdCBkb2M9bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhhd2FpdCBmaWxlLnRleHQoKSwnaW1hZ2Uvc3ZnK3htbCcpLHN2Zz1kb2MuZG9jdW1lbnRFbGVtZW50OwogaWYoZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXJzZXJlcnJvcicpLmxlbmd0aHx8IXN2Z3x8c3ZnLmxvY2FsTmFtZSE9PSdzdmcnKXRocm93IEVycm9yKCdEaWVzZSBTVkctRGF0ZWkgc2NoZWludCBmZWhsZXJoYWZ0IHp1IHNlaW4gdW5kIGthbm4gaGllciBuaWNodCBrb252ZXJ0aWVydCB3ZXJkZW4uJyk7CiBjb25zdCBsZW49dj0+e2NvbnN0IG09L15ccyooWzAtOV0qXC4\/WzAtOV0rKD86ZVsrLV0\/XGQrKT8pXHMqKHB4KT9ccyokL2kuZXhlYyh2fHwnJyk7cmV0dXJuIG0\/cGFyc2VGbG9hdChtWzFdKTowfTsKIGxldCB3PWxlbihzdmcuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKSxoPWxlbihzdmcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7CiBjb25zdCB2Yj0oc3ZnLmdldEF0dHJpYnV0ZSgndmlld0JveCcpfHwnJykudHJpbSgpLnNwbGl0KC9bXHMsXSsvKS5tYXAoTnVtYmVyKSxoYXNWQj12Yi5sZW5ndGg9PT00JiZ2Yi5ldmVyeShpc0Zpbml0ZSkmJnZiWzJdPjAmJnZiWzNdPjA7CiBpZihoYXNWQil7aWYodyYmIWgpaD13KnZiWzNdL3ZiWzJdO2Vsc2UgaWYoaCYmIXcpdz1oKnZiWzJdL3ZiWzNdO2Vsc2UgaWYoIXcmJiFoKXt3PXZiWzJdO2g9dmJbM119fQogbGV0IGFzc3VtZWQ9ZmFsc2U7aWYoIXd8fCFoKXt3PTMwMDtoPTE1MDthc3N1bWVkPXRydWV9CiByZXR1cm4ge3N2ZyxoYXNWQix3aWR0aDpNYXRoLm1heCgxLE1hdGgucm91bmQodykpLGhlaWdodDpNYXRoLm1heCgxLE1hdGgucm91bmQoaCkpLGFzc3VtZWR9Owp9CmZ1bmN0aW9uIHN2Z0Jsb2IoaW5mbyx3LGgpe2NvbnN0IHM9aW5mby5zdmcuY2xvbmVOb2RlKHRydWUpO2lmKCFpbmZvLmhhc1ZCKXMuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywnMCAwICcraW5mby53aWR0aCsnICcraW5mby5oZWlnaHQpO3Muc2V0QXR0cmlidXRlKCd3aWR0aCcsU3RyaW5nKHcpKTtzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JyxTdHJpbmcoaCkpO3JldHVybiBuZXcgQmxvYihbbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzKV0se3R5cGU6J2ltYWdlL3N2Zyt4bWwnfSl9CmFzeW5jIGZ1bmN0aW9uIGluc3BlY3QoaXRlbSl7CiB0cnl7CiAgaWYoaXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnKXtjb25zdCBpbmZvPWF3YWl0IHN2Z0luZm8oaXRlbS5maWxlKTtpdGVtLnN2Zz1pbmZvO2l0ZW0ud2lkdGg9aW5mby53aWR0aDtpdGVtLmhlaWdodD1pbmZvLmhlaWdodDtpdGVtLnN2Z0Fzc3VtZWQ9aW5mby5hc3N1bWVkfQogIGVsc2V7CiAgIGlmKGl0ZW0udHlwZT09PSdpbWFnZS9naWYnJiZpdGVtLmZpbGUuc2l6ZTw9TUFYX0dJRl9TQ0FOKXtpdGVtLmZyYW1lcz1naWZGcmFtZXMobmV3IFVpbnQ4QXJyYXkoYXdhaXQgaXRlbS5maWxlLmFycmF5QnVmZmVyKCkpKTtpdGVtLmFuaW1hdGVkPWl0ZW0uZnJhbWVzPjF9CiAgIGVsc2UgaWYoaXRlbS50eXBlPT09J2ltYWdlL3BuZycpaXRlbS5hbmltYXRlZD1hd2FpdCBpc0FwbmcoaXRlbS5maWxlKTsKICAgZWxzZSBpZihpdGVtLnR5cGU9PT0naW1hZ2Uvd2VicCcpaXRlbS5hbmltYXRlZD1hd2FpdCBpc0FuaW1hdGVkV2VicChpdGVtLmZpbGUpOwogICBpZihpdGVtLmFuaW1hdGVkJiZpdGVtLnR5cGU9PT0naW1hZ2UvcG5nJyYmaXRlbS5vdXRwdXQ9PT0nYXV0bycpaXRlbS5vdXRwdXQ9J29yaWdpbmFsJzsKICAgbGV0IHNyYzt0cnl7c3JjPWF3YWl0IGRlY29kZVJhc3RlcihpdGVtLmZpbGUpfWNhdGNoKGUpe3Rocm93IEVycm9yKCdJaHIgQnJvd3NlciBrYW5uIGRpZXNlICcrdHlwZUxhYmVsKGl0ZW0udHlwZSkrJy1EYXRlaSBuaWNodCBsZXNlbiwgZGFoZXIga2FubiBzaWUgaGllciBuaWNodCBnZXByw7xmdCBvZGVyIGtvbnZlcnRpZXJ0IHdlcmRlbi4gRXhwb3J0aWVyZW4gU2llIHNpZSBhdXMgSWhyZW0gQmlsZHByb2dyYW1tIGFscyBKUEcgb2RlciBQTkcuJyl9CiAgIGl0ZW0ud2lkdGg9c3JjLndpZHRoO2l0ZW0uaGVpZ2h0PXNyYy5oZWlnaHQ7c3JjLnJlbGVhc2UoKTsKICAgaWYoIWl0ZW0ud2lkdGh8fCFpdGVtLmhlaWdodCl0aHJvdyBFcnJvcignRGllIEJpbGRtYcOfZSBrb25udGVuIG5pY2h0IGdlbGVzZW4gd2VyZGVuLicpOwogIH0KIH1jYXRjaChlKXtpdGVtLmVycm9yPWUubWVzc2FnZXx8J0RpZXNlcyBCaWxkIGtvbm50ZSBuaWNodCBnZWxlc2VuIHdlcmRlbi4nfQogZmluYWxseXtpdGVtLmxvYWRpbmc9ZmFsc2U7aWYoYWxpdmUoaXRlbSkpcmVuZGVyKCl9Cn0KLyogLS0tLS0tLS0tLSBwZXItaXRlbSBzdGF0ZSAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIGRyb3BVcmwoaXRlbSxrKXtpZihpdGVtLnVybHNba10pe1VSTC5yZXZva2VPYmplY3RVUkwoaXRlbS51cmxzW2tdKTtkZWxldGUgaXRlbS51cmxzW2tdfX0KZnVuY3Rpb24gb2JqVXJsKGl0ZW0sayxibG9iKXtpZighaXRlbS51cmxzW2tdKWl0ZW0udXJsc1trXT1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO3JldHVybiBpdGVtLnVybHNba119CmZ1bmN0aW9uIGludmFsaWRhdGUoaXRlbSl7aXRlbS5yZXN1bHQ9bnVsbDtpdGVtLnJldisrO2l0ZW0uYnVzeT1mYWxzZTtkcm9wVXJsKGl0ZW0sJ3JlcycpfQpmdW5jdGlvbiBkaXNjYXJkKGl0ZW0pe2ludmFsaWRhdGUoaXRlbSk7ZHJvcFVybChpdGVtLCdvcmlnJyl9CmZ1bmN0aW9uIGNoYW5nZUl0ZW0oaXRlbSxwcm9wLHZhbHVlKXtpdGVtW3Byb3BdPXZhbHVlO2lmKHByb3A9PT0ncmVzaXplJylpdGVtLnJlc2l6ZUNob3Nlbj10cnVlO2lmKHByb3A9PT0ncmVzaXplJyYmdmFsdWU9PT0nY3VzdG9tJyYmIWl0ZW0uY3VzdG9tV2lkdGgpaXRlbS5jdXN0b21XaWR0aD1NYXRoLm1pbihpdGVtLndpZHRofHwxMjAwLDEyMDApO2lmKFsnbGF5b3V0Jywnd1BsYWNlbWVudCcsJ3dUaGVtZScsJ3dWYXJpYW50JywnbGF5b3V0V2lkdGgnLCdzaXRlV2lkdGgnLCdsYXlvdXRXaWR0aFVuaXQnLCdzaXRlV2lkdGhVbml0Jywnc2l0ZUJhc2UnXS5pbmRleE9mKHByb3ApPDB8fGl0ZW0ucmVzaXplPT09J3JlY29tbWVuZGVkJylpbnZhbGlkYXRlKGl0ZW0pO3JlbmRlcigpfQpmdW5jdGlvbiByZXNpemVNb2RlKGl0ZW0pe2NvbnN0IHJlYz1zdWdnZXN0ZWQoaXRlbSk7aWYoaXRlbS5yZXNpemU9PT0ncmVjb21tZW5kZWQnJiYhcmVjKXJldHVybiAnb3JpZ2luYWwnO2lmKGl0ZW0ucmVzaXplPT09J3JlY29tbWVuZGVkJyYmIWl0ZW0ucmVzaXplQ2hvc2VuJiZpdGVtLnR5cGUhPT0naW1hZ2Uvc3ZnK3htbCcmJml0ZW0ud2lkdGg+MCYmaXRlbS53aWR0aDxyZWMqMC45KXJldHVybiAnb3JpZ2luYWwnO3JldHVybiBpdGVtLnJlc2l6ZX0KZnVuY3Rpb24gb3V0VHlwZShpdGVtKXtyZXR1cm4gaXRlbS5vdXRwdXQ9PT0nb3JpZ2luYWwnPycnOml0ZW0ub3V0cHV0fQpmdW5jdGlvbiBjYW5PcHRpbWlzZShpdGVtKXtyZXR1cm4gIWl0ZW0ubG9hZGluZyYmIWl0ZW0uZXJyb3ImJiFpdGVtLmJ1c3kmJiEhb3V0VHlwZShpdGVtKSYmaXRlbS53aWR0aD4wJiZpdGVtLmhlaWdodD4wfQpmdW5jdGlvbiB0YXJnZXRTaXplKGl0ZW0pewogY29uc3QgdzA9aXRlbS53aWR0aCxoMD1pdGVtLmhlaWdodCxzdmc9aXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnLG1vZGU9cmVzaXplTW9kZShpdGVtKTtsZXQgdz13MDsKIGlmKG1vZGU9PT0ncmVjb21tZW5kZWQnKXc9c3VnZ2VzdGVkKGl0ZW0pOwogZWxzZSBpZihtb2RlPT09J2N1c3RvbScpe2NvbnN0IG49TnVtYmVyKGl0ZW0uY3VzdG9tV2lkdGgpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDF8fG4+TUFYX0lOUFVUX1dJRFRIKXRocm93IEVycm9yKCdHZWJlbiBTaWUgZsO8ciBkaWUgQnJlaXRlIGVpbmUgZ2FuemUgWmFobCB6d2lzY2hlbiAxIHVuZCAxMi4wMDAgZWluLicpO3c9bn0KIGNvbnN0IGg9TWF0aC5tYXgoMSxNYXRoLnJvdW5kKGgwKncvdzApKTsKIGlmKHc+TUFYX1NJREV8fGg+TUFYX1NJREV8fHcqaD5NQVhfUElYRUxTKXRocm93IEVycm9yKCdEYXMgRXJnZWJuaXMgd8OkcmUgJyt3Kycgw5cgJytoKycgcHggZ3Jvw58gdW5kIGRhbWl0IHp1IGdyb8OfIGbDvHIgZWluZSB6dXZlcmzDpHNzaWdlIFZlcmFyYmVpdHVuZyBpbiBqZWRlbSBCcm93c2VyIChHcmVuemUgMTYsNyBNZWdhcGl4ZWwpLiBXw6RobGVuIFNpZSBlaW5lIGtsZWluZXJlIEJyZWl0ZS4nKTsKIHJldHVybiB7dyxofTsKfQpmdW5jdGlvbiBzYWZlQmFzZShuYW1lKXtsZXQgYj0obmFtZXx8JycpLm5vcm1hbGl6ZSgnTkZDJykucmVwbGFjZSgvXC5bXi5dKiQvLCcnKS5yZXBsYWNlKC9bXHUwMDAwLVx1MDAxZlx1MDA3ZlwvXFw6Kj8iPD58XSsvZywnXycpLnJlcGxhY2UoL15bXHMuXSt8W1xzLl0rJC9nLCcnKTtyZXR1cm4gKGJ8fCdpbWFnZScpLnNsaWNlKDAsMTIwKX0KZnVuY3Rpb24gYW5hbHlzZShzb3VyY2UsdyxoKXsKIHRyeXtjb25zdCBzPU1hdGgubWluKDEsMTI4L01hdGgubWF4KHcsaCkpLGN3PU1hdGgubWF4KDEsTWF0aC5yb3VuZCh3KnMpKSxjaD1NYXRoLm1heCgxLE1hdGgucm91bmQoaCpzKSksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjLndpZHRoPWN3O2MuaGVpZ2h0PWNoOwogIGNvbnN0IHg9Yy5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSk7eC5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ZmFsc2U7eC5kcmF3SW1hZ2Uoc291cmNlLDAsMCxjdyxjaCk7CiAgY29uc3QgZD14LmdldEltYWdlRGF0YSgwLDAsY3csY2gpLmRhdGEsc2Vlbj1uZXcgU2V0KCk7bGV0IGFscGhhPWZhbHNlOwogIGZvcihsZXQgaT0wO2k8ZC5sZW5ndGg7aSs9NCl7aWYoZFtpKzNdPDI1MClhbHBoYT10cnVlO2lmKHNlZW4uc2l6ZTw9MTAyNClzZWVuLmFkZCgoZFtpXTw8MTYpfChkW2krMV08PDgpfGRbaSsyXSl9CiAgYy53aWR0aD1jLmhlaWdodD0wO3JldHVybiB7YWxwaGEscGhvdG86c2Vlbi5zaXplPjEwMjR9OwogfWNhdGNoKGUpe3JldHVybiBudWxsfQp9Ci8qIHdoaWxlIHRoZSBtYW51YWwgZWRpdG9yIGlzIG9wZW4sIGxvY2sgZXZlcnl0aGluZyBlbHNlIGZvciB0aGF0IGltYWdlIHNvIG9ubHkgRG9uZSBvciBDYW5jZWwgYXBwbHkgKi8KY29uc3QgX19yZW5kZXJCYXNlPXJlbmRlcjtyZW5kZXI9ZnVuY3Rpb24oKXtfX3JlbmRlckJhc2UoKTsKIC8qIHJlc3VsdCBidXR0b25zIHNpdCBvbiB0aGUgc2FtZSByb3cgYXMgT3B0aW1pc2UsIHVuZGVyIHRoZSBvcHRpbWlzZWQgaW1hZ2UgKi8KIGNvbnN0IGNhcmRzPXJvb3QucXVlcnlTZWxlY3RvckFsbCgnI2NpbC1maWxlcyA+IC5jaWwtZmlsZScpO2l0ZW1zLmZvckVhY2goKGl0LGl4KT0+e2NvbnN0IGNhcmQ9Y2FyZHNbaXhdO2lmKCFjYXJkfHwhaXQucmVzdWx0fHxpdC5yZXN1bHQua2VwdE9yaWdpbmFsfHwhaXQuY29tcGFyZXx8aXQuZWRpdGluZylyZXR1cm47Y29uc3QgYWN0cz1bLi4uY2FyZC5jaGlsZHJlbl0uZmlsdGVyKHg9PnguY2xhc3NMaXN0LmNvbnRhaW5zKCdjaWwtYWN0aW9ucycpKS5wb3AoKTtpZighYWN0cylyZXR1cm47Y29uc3QgTD1lbCgnZGl2JywnY2lsLWFjdHMtZ3JvdXAnKSxSPWVsKCdkaXYnLCdjaWwtYWN0cy1ncm91cCcpO3doaWxlKGFjdHMuZmlyc3RDaGlsZClMLmFwcGVuZChhY3RzLmZpcnN0Q2hpbGQpO1IuYXBwZW5kKGJ1dHRvbignSGVydW50ZXJsYWRlbjogJyt0eXBlTGFiZWwoaXQucmVzdWx0LnR5cGUpLCgpPT57dHJhY2soJ2Rvd25sb2FkJyk7ZG93bmxvYWQoaXQucmVzdWx0LmJsb2IsaXQucmVzdWx0Lm5hbWUpfSwnJyxpdC5pZCsnLWRsJykpO2lmKGl0LnRyYW5zcClSLmFwcGVuZChidXR0b24oJ0hpbnRlcmdydW5kIG1hbnVlbGwgYmVhcmJlaXRlbicsKCk9Pm9wZW5FZGl0b3IoaXQpLCdjaWwtYnRuLXNlY29uZGFyeScsaXQuaWQrJy1lZGl0JykpO2lmKChpdC5jbGlja3N8fFtdKS5sZW5ndGgpUi5hcHBlbmQoYnV0dG9uKCdNYW51ZWxsZSDDhG5kZXJ1bmdlbiByw7xja2fDpG5naWcgbWFjaGVuJywoKT0+e2l0LmNsaWNrcz1bXTtvcHRpbWlzZShpdCl9LCdjaWwtYnRuLXRleHQnLGl0LmlkKyctdW5kb2VkJykpO2FjdHMuY2xhc3NMaXN0LmFkZCgnY2lsLWFjdGlvbnMtc3BsaXQnKTthY3RzLmFwcGVuZChMLFIpfSk7Y29uc3QgZWRzPXJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmNpbC1lZGl0b3InKTtlZHMuZm9yRWFjaChlZD0+e2NvbnN0IGNhcmQ9ZWQuY2xvc2VzdCgnLmNpbC1maWxlJyk7aWYoIWNhcmQpcmV0dXJuO2NhcmQuY2xhc3NMaXN0LmFkZCgnY2lsLWxvY2tlZCcpO2NhcmQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0LGlucHV0LGJ1dHRvbix0ZXh0YXJlYSxzdW1tYXJ5JykuZm9yRWFjaCh4PT57aWYoeC5jbG9zZXN0KCcuY2lsLWVkaXRvcicpKXJldHVybjtpZih4LnRhZ05hbWU9PT0nU1VNTUFSWScpe3guc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywndHJ1ZScpO3gudGFiSW5kZXg9LTF9ZWxzZSB4LmRpc2FibGVkPXRydWV9KTtjb25zdCBhY3RzPVsuLi5jYXJkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaWwtYWN0aW9ucycpXS5wb3AoKTtpZihhY3RzJiYhYWN0cy5xdWVyeVNlbGVjdG9yKCcuY2lsLWxvY2stbm90ZScpKWFjdHMuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsIGNpbC1sb2NrLW5vdGUnLCdTY2hsaWXDn2VuIFNpZSB6dWVyc3QgZGllIEJlYXJiZWl0dW5nIGRlcyBIaW50ZXJncnVuZHMgYWI6IEtsaWNrZW4gU2llIGF1ZiBGZXJ0aWcgb2RlciBBYmJyZWNoZW4uJykpfSk7aWYoZWRzLmxlbmd0aCl7WydjaWwtb3B0YWxsJywnY2lsLXppcCddLmZvckVhY2goaWQ9Pntjb25zdCBiPSQoaWQpO2lmKGIpYi5kaXNhYmxlZD10cnVlfSl9fTsKLyogLS0tLS0tLS0tLSBtYW51YWwgYmFja2dyb3VuZCBlZGl0b3I6IGVkaXRzIGEgY2FudmFzIGRpcmVjdGx5LCBvcHRpbWlzZXMgb25jZSBvbiBEb25lIC0tLS0tLS0tLS0gKi8KY29uc3QgWk9PTVM9WzAuMjUsMC41LDEsMiw0LDhdOwpmdW5jdGlvbiBvcGVuRWRpdG9yKGl0ZW0pe2l0ZW0uZWRpdGluZz10cnVlO2l0ZW0uZWRab29tPTA7aXRlbS5lZFRvb2w9aXRlbS5lZFRvb2x8fCdmaWxsJztpdGVtLmVkVG9sPWl0ZW0uZWRUb2x8fGl0ZW0udG9sfHw0MDtpdGVtLmVkQnJ1c2g9aXRlbS5lZEJydXNofHwxNjtpdGVtLmVkU3RhY2s9W107aXRlbS5kcmFmdD1bXTtpdGVtLmVkQ2FudmFzPW51bGw7cmVuZGVyKCk7CiBkZWNvZGVSYXN0ZXIoaXRlbS5yZXN1bHQuYmxvYikudGhlbihzcmM9PntpZighaXRlbS5lZGl0aW5nKXJldHVybjtjb25zdCBjdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjdi5jbGFzc05hbWU9J2NpbC1lZC1jYW52YXMnO2N2LndpZHRoPXNyYy53aWR0aDtjdi5oZWlnaHQ9c3JjLmhlaWdodDtjdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSkuZHJhd0ltYWdlKHNyYy5zb3VyY2UsMCwwKTtpZihzcmMucmVsZWFzZSlzcmMucmVsZWFzZSgpO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxlPT57aWYoaXRlbS5lZFRvb2whPT0nYnJ1c2gnKWVkQ2xpY2soaXRlbSxlKX0pO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxlPT5lZEJydXNoU3RhcnQoaXRlbSxlKSk7Y3YuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLGU9PmVkQnJ1c2hNb3ZlKGl0ZW0sZSkpO1sncG9pbnRlcnVwJywncG9pbnRlcmNhbmNlbCcsJ3BvaW50ZXJsZWF2ZSddLmZvckVhY2godD0+Y3YuYWRkRXZlbnRMaXN0ZW5lcih0LCgpPT5lZEJydXNoRW5kKGl0ZW0pKSk7Y3YuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLGU9PmVkUmluZyhpdGVtLGUpKTtjdi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLGU9PmVkUmluZyhpdGVtLGUpKTtjdi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCgpPT5lZFJpbmdIaWRlKGl0ZW0pKTtpdGVtLmVkQ2FudmFzPWN2O3JlbmRlcigpfSkuY2F0Y2goKCk9PntpdGVtLmVkaXRpbmc9ZmFsc2U7c3RhdHVzKCdEZXIgRWRpdG9yIGtvbm50ZSBkaWVzZXMgQmlsZCBuaWNodCDDtmZmbmVuLicpO3JlbmRlcigpfSl9CmZ1bmN0aW9uIGZsb29kQ2xlYXIoZCx3LGgsZngsZnksdG9sKXtjb25zdCBuPXcqaCxjeD1NYXRoLm1pbih3LTEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKGZ4KncpKSksY3k9TWF0aC5taW4oaC0xLE1hdGgubWF4KDAsTWF0aC5mbG9vcihmeSpoKSkpLHMwPWN5KncrY3g7aWYoZFtzMCo0KzNdPT09MClyZXR1cm4gZmFsc2U7Y29uc3QgcjA9ZFtzMCo0XSxnMD1kW3MwKjQrMV0sYjA9ZFtzMCo0KzJdLGRvbmU9bmV3IFVpbnQ4QXJyYXkobikscT1uZXcgVWludDMyQXJyYXkobik7bGV0IHFoPTAscXQ9MDtjb25zdCBwYz1wPT57aWYoIWRvbmVbcF0mJmRbcCo0KzNdPjAmJk1hdGgubWF4KE1hdGguYWJzKGRbcCo0XS1yMCksTWF0aC5hYnMoZFtwKjQrMV0tZzApLE1hdGguYWJzKGRbcCo0KzJdLWIwKSk8PXRvbCl7ZG9uZVtwXT0xO3FbcXQrK109cH19O3BjKHMwKTt3aGlsZShxaDxxdCl7Y29uc3QgcD1xW3FoKytdLHg9cCV3O2lmKHg+MClwYyhwLTEpO2lmKHg8dy0xKXBjKHArMSk7aWYocD49dylwYyhwLXcpO2lmKHA8bi13KXBjKHArdyl9Zm9yKGxldCBpPTA7aTxxdDtpKyspZFtxW2ldKjQrM109MDtyZXR1cm4gcXQ+MH0KZnVuY3Rpb24gZWRDbGljayhpdGVtLGUpe2NvbnN0IGN2PWl0ZW0uZWRDYW52YXM7aWYoIWN2KXJldHVybjtjb25zdCBiPWN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFiLndpZHRofHwhYi5oZWlnaHQpcmV0dXJuO2NvbnN0IGZ4PShlLmNsaWVudFgtYi5sZWZ0KS9iLndpZHRoLGZ5PShlLmNsaWVudFktYi50b3ApL2IuaGVpZ2h0LGN0eD1jdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSksaW1nPWN0eC5nZXRJbWFnZURhdGEoMCwwLGN2LndpZHRoLGN2LmhlaWdodCksc25hcD1uZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nLmRhdGEpOwogaWYoIWZsb29kQ2xlYXIoaW1nLmRhdGEsY3Yud2lkdGgsY3YuaGVpZ2h0LGZ4LGZ5LGl0ZW0uZWRUb2x8fDQwKSlyZXR1cm47aWYoaXRlbS5lZFN0YWNrLmxlbmd0aD49MjApaXRlbS5lZFN0YWNrLnNoaWZ0KCk7aXRlbS5lZFN0YWNrLnB1c2goe2RhdGE6c25hcCxuOml0ZW0uZHJhZnQubGVuZ3RofSk7Y3R4LnB1dEltYWdlRGF0YShpbWcsMCwwKTtpdGVtLmRyYWZ0LnB1c2goe3g6ZngseTpmeSx0Oml0ZW0uZWRUb2x8fDQwfSk7cmVuZGVyKCl9CmZ1bmN0aW9uIGVkUHQoaXRlbSxlKXtjb25zdCBjdj1pdGVtLmVkQ2FudmFzLGI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHtmeDooZS5jbGllbnRYLWIubGVmdCkvYi53aWR0aCxmeTooZS5jbGllbnRZLWIudG9wKS9iLmhlaWdodH19CmZ1bmN0aW9uIGVkQnJ1c2hTdGFydChpdGVtLGUpe2lmKGl0ZW0uZWRUb29sIT09J2JydXNoJ3x8IWl0ZW0uZWRDYW52YXMpcmV0dXJuO2UucHJldmVudERlZmF1bHQoKTtjb25zdCBjdj1pdGVtLmVkQ2FudmFzLGN0eD1jdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSk7aWYoaXRlbS5lZFN0YWNrLmxlbmd0aD49MjApaXRlbS5lZFN0YWNrLnNoaWZ0KCk7aXRlbS5lZFN0YWNrLnB1c2goe2RhdGE6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGN0eC5nZXRJbWFnZURhdGEoMCwwLGN2LndpZHRoLGN2LmhlaWdodCkuZGF0YSksbjppdGVtLmRyYWZ0Lmxlbmd0aH0pO3RyeXtjdi5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCl9Y2F0Y2goeCl7fWl0ZW0uZWRTdHJva2U9KGl0ZW0uZWRTdHJva2V8fDApKzE7aXRlbS5lZERvd249dHJ1ZTtpdGVtLmVkTGFzdD1udWxsO2VkQnJ1c2hNb3ZlKGl0ZW0sZSl9CmZ1bmN0aW9uIGVkQnJ1c2hNb3ZlKGl0ZW0sZSl7aWYoIWl0ZW0uZWREb3dufHwhaXRlbS5lZENhbnZhcylyZXR1cm47Y29uc3QgY3Y9aXRlbS5lZENhbnZhcyxjdHg9Y3YuZ2V0Q29udGV4dCgnMmQnLHt3aWxsUmVhZEZyZXF1ZW50bHk6dHJ1ZX0pLHA9ZWRQdChpdGVtLGUpLHB4PXAuZngqY3Yud2lkdGgscHk9cC5meSpjdi5oZWlnaHQscnI9aXRlbS5lZEJydXNoLzI7Y3R4LnNhdmUoKTtjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSdkZXN0aW5hdGlvbi1vdXQnO2N0eC5maWxsU3R5bGU9JyMwMDAnO2N0eC5zdHJva2VTdHlsZT0nIzAwMCc7Y3R4LmxpbmVDYXA9J3JvdW5kJztjdHgubGluZVdpZHRoPXJyKjI7aWYoaXRlbS5lZExhc3Qpe2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKGl0ZW0uZWRMYXN0LnB4LGl0ZW0uZWRMYXN0LnB5KTtjdHgubGluZVRvKHB4LHB5KTtjdHguc3Ryb2tlKCl9ZWxzZXtjdHguYmVnaW5QYXRoKCk7Y3R4LmFyYyhweCxweSxyciwwLE1hdGguUEkqMik7Y3R4LmZpbGwoKX1jdHgucmVzdG9yZSgpO2l0ZW0uZWRMYXN0PXtweCxweX07aXRlbS5kcmFmdC5wdXNoKHtiOjEsczppdGVtLmVkU3Ryb2tlLHg6cC5meCx5OnAuZnkscjpyci9jdi53aWR0aH0pfQpmdW5jdGlvbiBlZFJpbmdIaWRlKGl0ZW0pe2lmKGl0ZW0uZWRSaW5nRWwpaXRlbS5lZFJpbmdFbC5zdHlsZS5kaXNwbGF5PSdub25lJ30KZnVuY3Rpb24gZWRSaW5nKGl0ZW0sZSl7aWYoaXRlbS5lZFRvb2whPT0nYnJ1c2gnfHwhaXRlbS5lZENhbnZhc3x8ZS5wb2ludGVyVHlwZT09PSd0b3VjaCcpe2VkUmluZ0hpZGUoaXRlbSk7cmV0dXJufWxldCByaW5nPWl0ZW0uZWRSaW5nRWw7aWYoIXJpbmd8fCFyaW5nLmlzQ29ubmVjdGVkKXtyaW5nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3Jpbmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtyaW5nLnN0eWxlLmNzc1RleHQ9J3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MjE0NzQ4MzAwMDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoxcHggc29saWQgI2ZmZjtib3gtc2hhZG93OjAgMCAwIDFweCAjMUYzNTREO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtkaXNwbGF5Om5vbmUnO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocmluZyk7aXRlbS5lZFJpbmdFbD1yaW5nfWNvbnN0IGN2PWl0ZW0uZWRDYW52YXMsYj1jdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPU1hdGgubWF4KDQsaXRlbS5lZEJydXNoKihiLndpZHRoL2N2LndpZHRoKSk7cmluZy5zdHlsZS53aWR0aD1yaW5nLnN0eWxlLmhlaWdodD1kKydweCc7cmluZy5zdHlsZS5sZWZ0PWUuY2xpZW50WCsncHgnO3Jpbmcuc3R5bGUudG9wPWUuY2xpZW50WSsncHgnO3Jpbmcuc3R5bGUuZGlzcGxheT0nYmxvY2snfQpmdW5jdGlvbiBlZEJydXNoRW5kKGl0ZW0pe2lmKCFpdGVtLmVkRG93bilyZXR1cm47aXRlbS5lZERvd249ZmFsc2U7aXRlbS5lZExhc3Q9bnVsbDtyZW5kZXIoKX0KZnVuY3Rpb24gZWRVbmRvKGl0ZW0pe2NvbnN0IHN0PWl0ZW0uZWRTdGFjay5wb3AoKTtpZighc3QpcmV0dXJuO2NvbnN0IGN2PWl0ZW0uZWRDYW52YXMsY3R4PWN2LmdldENvbnRleHQoJzJkJyk7Y3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKHN0LmRhdGEsY3Yud2lkdGgsY3YuaGVpZ2h0KSwwLDApO2l0ZW0uZHJhZnQubGVuZ3RoPXN0Lm47cmVuZGVyKCl9CmZ1bmN0aW9uIGVkWm9vbShpdGVtLGRpcil7Y29uc3QgY3Y9aXRlbS5lZENhbnZhcztpZighY3YpcmV0dXJuO2NvbnN0IGN1cj1pdGVtLmVkWm9vbXx8KGN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoL2N2LndpZHRoKXx8MTtsZXQgejtpZihkaXI+MCl6PVpPT01TLmZpbmQodj0+dj5jdXIrMC4wMDEpfHxaT09NU1taT09NUy5sZW5ndGgtMV07ZWxzZSB6PVsuLi5aT09NU10ucmV2ZXJzZSgpLmZpbmQodj0+djxjdXItMC4wMDEpfHxaT09NU1swXTtpdGVtLmVkWm9vbT16O3JlbmRlcigpfQpmdW5jdGlvbiBlZGl0b3JGb3IoaXRlbSl7Y29uc3QgZWQ9ZWwoJ2RpdicsJ2NpbC1lZGl0b3InKSxjdj1pdGVtLmVkQ2FudmFzOwogY29uc3QgYnJ1c2g9aXRlbS5lZFRvb2w9PT0nYnJ1c2gnO2VkLmFwcGVuZChlbCgnc3Ryb25nJywnY2lsLWVkLXRpdGxlJywnSGludGVyZ3J1bmQgYmVhcmJlaXRlbicpLGVsKCdwJywnY2lsLXNtYWxsJyxicnVzaD8nWmllaGVuIFNpZSDDvGJlciBkYXMgQmlsZCwgdW0genUgcmFkaWVyZW4uIEbDvHIga2xlaW5lIFN0ZWxsZW4gdW5kIEthbnRlbiwgZGllIHNjaHdlciBhbnp1a2xpY2tlbiBzaW5kLic6J0tsaWNrZW4gU2llIGF1ZiBlaW5lbiBCZXJlaWNoLCB1bSBpaG4gdHJhbnNwYXJlbnQgenUgbWFjaGVuLiBEaWUgQmVyZWljaHN0b2xlcmFueiBsZWd0IGZlc3QsIHdpZSDDpGhubGljaCBkaWUgRmFyYmVuIHNlaW4gbcO8c3Nlbi4gU2llIHdpcmt0IG51ciBhdWYgSWhyZSBLbGlja3MgaGllciwgbmljaHQgYXVmIGRpZSBhdXRvbWF0aXNjaGUgRW50ZmVybnVuZyBvYmVuLicpKTsKIGNvbnN0IG1vZGVzPWVsKCdkaXYnLCdjaWwtZWQtbW9kZXMnKSxncnA9ZWwoJ2RpdicsJ2NpbC1lZC1ncm91cCcpO2dycC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdncm91cCcpO2dycC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdXZXJremV1ZycpO2NvbnN0IElDTz17ZmlsbDonPHBhdGggZD0ibTE5IDExLTgtOC04LjYgOC42YTIgMiAwIDAgMCAwIDIuOGw1LjIgNS4yYy44LjggMiAuOCAyLjggMEwxOSAxMVoiLz48cGF0aCBkPSJtNSAyIDUgNSIvPjxwYXRoIGQ9Ik0yIDEzaDE1Ii8+PHBhdGggZD0iTTIyIDIwYTIgMiAwIDEgMS00IDBjMC0xLjYgMS43LTIuNCAyLTQgLjMgMS42IDIgMi40IDIgNFoiLz4nLGJydXNoOic8cGF0aCBkPSJtNyAyMS00LjMtNC4zYy0xLTEtMS0yLjUgMC0zLjRsOS42LTkuNmMxLTEgMi41LTEgMy40IDBsNS42IDUuNmMxIDEgMSAyLjUgMCAzLjRMMTMgMjEiLz48cGF0aCBkPSJNMjIgMjFINyIvPjxwYXRoIGQ9Im01IDExIDkgOSIvPid9O1tbJ2ZpbGwnLCdCZXJlaWNoIGVudGZlcm5lbiddLFsnYnJ1c2gnLCdSYWRpZXJlciddXS5mb3JFYWNoKChbayx0XSk9Pntjb25zdCBiPWVsKCdidXR0b24nLCdjaWwtZWQtbW9kZScpO2IudHlwZT0nYnV0dG9uJztiLnRpdGxlPXQ7Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLHQpO2Iuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLGl0ZW0uZWRUb29sPT09az8ndHJ1ZSc6J2ZhbHNlJyk7Yi5pbm5lckhUTUw9Jzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgYXJpYS1oaWRkZW49InRydWUiPicrSUNPW2tdKyc8L3N2Zz4nO2IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57aXRlbS5lZFRvb2w9aztyZW5kZXIoKX0pO2dycC5hcHBlbmQoYil9KTttb2Rlcy5hcHBlbmQoZ3JwLGVsKCdzcGFuJywnY2lsLWVkLXRvb2xuYW1lJyxicnVzaD8nUmFkaWVyZXInOidCZXJlaWNoIGVudGZlcm5lbicpKTsKIGlmKGJydXNoKXtjb25zdCBibD1lbCgnbGFiZWwnLCdjaWwtZmllbGQgY2lsLXJhbmdlIGNpbC1lZC10b2wnKSxicT1lbCgnaW5wdXQnKSxidj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ1JhZGllcmdyw7bDn2U6ICcraXRlbS5lZEJydXNoKycgcHgnKTticS50eXBlPSdyYW5nZSc7YnEubWluPScyJzticS5tYXg9JzEyMCc7YnEuc3RlcD0nMSc7YnEudmFsdWU9U3RyaW5nKGl0ZW0uZWRCcnVzaCk7YnEuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57YnYudGV4dENvbnRlbnQ9J1JhZGllcmdyw7bDn2U6ICcrYnEudmFsdWUrJyBweCc7aXRlbS5lZEJydXNoPU51bWJlcihicS52YWx1ZSk7Y29uc3QgY3Y9aXRlbS5lZENhbnZhcyxyaW5nPWl0ZW0uZWRSaW5nRWw7aWYoY3Ype2lmKCFyaW5nfHwhcmluZy5pc0Nvbm5lY3RlZCl7ZWRSaW5nKGl0ZW0se2NsaWVudFg6MCxjbGllbnRZOjAscG9pbnRlclR5cGU6J21vdXNlJ30pO31jb25zdCByZz1pdGVtLmVkUmluZ0VsLGI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1heCg0LGl0ZW0uZWRCcnVzaCooYi53aWR0aC9jdi53aWR0aCkpO3JnLnN0eWxlLndpZHRoPXJnLnN0eWxlLmhlaWdodD1kKydweCc7cmcuc3R5bGUubGVmdD0oYi5sZWZ0K2Iud2lkdGgvMikrJ3B4JztyZy5zdHlsZS50b3A9KGIudG9wK01hdGgubWluKGIuaGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodC1iLnRvcCkvMikrJ3B4JztyZy5zdHlsZS5kaXNwbGF5PSdibG9jayc7Y2xlYXJUaW1lb3V0KGl0ZW0uZWRSaW5nVCk7aXRlbS5lZFJpbmdUPXNldFRpbWVvdXQoKCk9PmVkUmluZ0hpZGUoaXRlbSksOTAwKX19KTtibC5hcHBlbmQoYnEsYnYpO21vZGVzLmFwcGVuZChibCl9CiBpZighYnJ1c2gpe2NvbnN0IHRsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCBjaWwtcmFuZ2UgY2lsLWVkLXRvbCcpLHE9ZWwoJ2lucHV0Jyksdj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ0JlcmVpY2hzdG9sZXJhbno6ICcrKGl0ZW0uZWRUb2x8fDQwKSk7cS50eXBlPSdyYW5nZSc7cS5taW49JzUnO3EubWF4PScxMjAnO3Euc3RlcD0nMSc7cS52YWx1ZT1TdHJpbmcoaXRlbS5lZFRvbHx8NDApO3EuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57di50ZXh0Q29udGVudD0nQmVyZWljaHN0b2xlcmFuejogJytxLnZhbHVlO2l0ZW0uZWRUb2w9TnVtYmVyKHEudmFsdWUpfSk7dGwuYXBwZW5kKHEsdik7bW9kZXMuYXBwZW5kKHRsKX0KIGNvbnN0IGJhcj1lbCgnZGl2JywnY2lsLWVkLWJhcicpLHRiPSh0LGYsZGlzLGxhYik9Pntjb25zdCBiPWVsKCdidXR0b24nLCdjaWwtZWQtYnRuJyx0KTtiLnR5cGU9J2J1dHRvbic7aWYobGFiKWIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyxsYWIpO2IuZGlzYWJsZWQ9ISFkaXM7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZik7cmV0dXJuIGJ9OwogY29uc3Qgej1pdGVtLmVkWm9vbTtiYXIuYXBwZW5kKHRiKCfiiJInLCgpPT5lZFpvb20oaXRlbSwtMSksIWN2LCdWZXJrbGVpbmVybicpLHRiKCcrJywoKT0+ZWRab29tKGl0ZW0sMSksIWN2LCdWZXJncsO2w59lcm4nKSx0YignQW5wYXNzZW4nLCgpPT57aXRlbS5lZFpvb209MDtyZW5kZXIoKX0sIWN2fHwheiksdGIoJzEwMCUnLCgpPT57aXRlbS5lZFpvb209MTtyZW5kZXIoKX0sIWN2fHx6PT09MSksZWwoJ3NwYW4nLCdjaWwtZWQtem9vbScsY3Y\/KHo\/TWF0aC5yb3VuZCh6KjEwMCkrJyUnOidBbnBhc3NlbicpOicnKSx0YignUsO8Y2tnw6RuZ2lnJywoKT0+ZWRVbmRvKGl0ZW0pLCFpdGVtLmVkU3RhY2subGVuZ3RoKSx0YignWnVyw7xja3NldHplbicsKCk9Pm9wZW5FZGl0b3IoaXRlbSksIWl0ZW0uZWRTdGFjay5sZW5ndGgpKTsKIGNvbnN0IHJvdz1lbCgnZGl2JywnY2lsLWVkLXRvb2xiYXInKTtyb3cuYXBwZW5kKG1vZGVzLGJhcik7ZWQuYXBwZW5kKHJvdyk7CiBjb25zdCB2aWV3PWVsKCdkaXYnLCdjaWwtZWQtdmlldycpO2lmKGN2KXtjdi5zdHlsZS5jdXJzb3I9YnJ1c2g\/J25vbmUnOidjcm9zc2hhaXInO2lmKCFicnVzaCllZFJpbmdIaWRlKGl0ZW0pO2lmKHope2N2LnN0eWxlLndpZHRoPU1hdGgucm91bmQoY3Yud2lkdGgqeikrJ3B4Jztjdi5zdHlsZS5tYXhXaWR0aD0nbm9uZSc7Y3Yuc3R5bGUubWF4SGVpZ2h0PSdub25lJzt2aWV3LmRhdGFzZXQuem9vbT0nMSd9ZWxzZXtjdi5zdHlsZS53aWR0aD0nJztjdi5zdHlsZS5tYXhXaWR0aD0nMTAwJSc7Y3Yuc3R5bGUubWF4SGVpZ2h0PSc0ODBweCd9dmlldy5hcHBlbmQoY3YpfWVsc2Ugdmlldy5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCdXaXJkIGdlbGFkZW7igKYnKSk7ZWQuYXBwZW5kKHZpZXcpOwogY29uc3QgZnQ9ZWwoJ2RpdicsJ2NpbC1lZC1mb290JyksZG9uZT1idXR0b24oJ0ZlcnRpZycsKCk9PntlZFJpbmdIaWRlKGl0ZW0pO2l0ZW0uY2xpY2tzPShpdGVtLmNsaWNrc3x8W10pLmNvbmNhdChpdGVtLmRyYWZ0KTtpdGVtLmVkaXRpbmc9ZmFsc2U7aXRlbS5lZENhbnZhcz1udWxsO2l0ZW0uZWRTdGFjaz1bXTtvcHRpbWlzZShpdGVtKX0sJycsaXRlbS5pZCsnLWVkZG9uZScpO2RvbmUuZGlzYWJsZWQ9IWN2O2NvbnN0IGNhbmNlbD1lbCgnYnV0dG9uJywnY2lsLWJ0bi10ZXh0JywnQWJicmVjaGVuJyk7Y2FuY2VsLnR5cGU9J2J1dHRvbic7Y2FuY2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e2VkUmluZ0hpZGUoaXRlbSk7aXRlbS5lZGl0aW5nPWZhbHNlO2l0ZW0uZWRDYW52YXM9bnVsbDtpdGVtLmVkU3RhY2s9W107aXRlbS5kcmFmdD1bXTtyZW5kZXIoKX0pOwogZnQuYXBwZW5kKGRvbmUsY2FuY2VsKTtlZC5hcHBlbmQoZnQpO3JldHVybiBlZH0KLyogLS0tLS0tLS0tLSBiYWNrZ3JvdW5kIHJlbW92YWw6IGZsb29kIGZpbGwgZnJvbSB0aGUgZWRnZXMsIGNvbG91ciB0YWtlbiBmcm9tIHRoZSBjb3JuZXJzIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gcmVtb3ZlQmcoY3R4LHcsaCx0b2wsY2xpY2tzKXsKIGNvbnN0IGltZz1jdHguZ2V0SW1hZ2VEYXRhKDAsMCx3LGgpLGQ9aW1nLmRhdGEsbj13Kmg7CiBjb25zdCBjcz1bMCx3LTEsKGgtMSkqdyxuLTFdLmZpbHRlcihwPT5kW3AqNCszXT4yMDApO2lmKCFjcy5sZW5ndGgpcmV0dXJuIGZhbHNlOwogbGV0IG1peGVkPWZhbHNlO2Zvcihjb25zdCBhIG9mIGNzKWZvcihjb25zdCBiIG9mIGNzKWlmKE1hdGgubWF4KE1hdGguYWJzKGRbYSo0XS1kW2IqNF0pLE1hdGguYWJzKGRbYSo0KzFdLWRbYio0KzFdKSxNYXRoLmFicyhkW2EqNCsyXS1kW2IqNCsyXSkpPjYwKW1peGVkPXRydWU7CiBsZXQgYnI9MCxiZz0wLGJiPTA7Y3MuZm9yRWFjaChwPT57YnIrPWRbcCo0XTtiZys9ZFtwKjQrMV07YmIrPWRbcCo0KzJdfSk7YnIvPWNzLmxlbmd0aDtiZy89Y3MubGVuZ3RoO2JiLz1jcy5sZW5ndGg7CiBjb25zdCBkaXN0PXA9Pk1hdGgubWF4KE1hdGguYWJzKGRbcCo0XS1iciksTWF0aC5hYnMoZFtwKjQrMV0tYmcpLE1hdGguYWJzKGRbcCo0KzJdLWJiKSk7CiBjb25zdCBkb25lPW5ldyBVaW50OEFycmF5KG4pLHE9bmV3IFVpbnQzMkFycmF5KG4pO2xldCBxaD0wLHF0PTA7CiBjb25zdCBwdXNoPXA9PntpZighZG9uZVtwXSYmZFtwKjQrM10+MCYmZGlzdChwKTw9dG9sKXtkb25lW3BdPTE7cVtxdCsrXT1wfX07CiBmb3IobGV0IHg9MDt4PHc7eCsrKXtwdXNoKHgpO3B1c2goKGgtMSkqdyt4KX1mb3IobGV0IHk9MDt5PGg7eSsrKXtwdXNoKHkqdyk7cHVzaCh5Kncrdy0xKX0KIHdoaWxlKHFoPHF0KXtjb25zdCBwPXFbcWgrK10seD1wJXc7aWYoeD4wKXB1c2gocC0xKTtpZih4PHctMSlwdXNoKHArMSk7aWYocD49dylwdXNoKHAtdyk7aWYocDxuLXcpcHVzaChwK3cpfQogY29uc3Qgc3RhbXA9KHB4LHB5LHJyKT0+e2NvbnN0IHgwPU1hdGgubWF4KDAsTWF0aC5mbG9vcihweC1ycikpLHgxPU1hdGgubWluKHctMSxNYXRoLmNlaWwocHgrcnIpKSx5MD1NYXRoLm1heCgwLE1hdGguZmxvb3IocHktcnIpKSx5MT1NYXRoLm1pbihoLTEsTWF0aC5jZWlsKHB5K3JyKSk7Zm9yKGxldCB5PXkwO3k8PXkxO3krKylmb3IobGV0IHg9eDA7eDw9eDE7eCsrKWlmKCh4LXB4KSooeC1weCkrKHktcHkpKih5LXB5KTw9cnIqcnIpZG9uZVt5KncreF09MX07CiBsZXQgcHJldkI9bnVsbDsoY2xpY2tzfHxbXSkuZm9yRWFjaChjPT57aWYoYy5iKXtjb25zdCBweD1jLngqdyxweT1jLnkqaCxycj1NYXRoLm1heCgwLjUsYy5yKncpO2lmKHByZXZCJiZwcmV2Qi5zPT09Yy5zKXtjb25zdCBkeD1weC1wcmV2Qi5weCxkeT1weS1wcmV2Qi5weSxMPU1hdGguaHlwb3QoZHgsZHkpLHN0PU1hdGgubWF4KDEsTWF0aC5jZWlsKEwvTWF0aC5tYXgoMSxyci8yKSkpO2ZvcihsZXQgaz0xO2s8PXN0O2srKylzdGFtcChwcmV2Qi5weCtkeCprL3N0LHByZXZCLnB5K2R5Kmsvc3QscnIpfWVsc2Ugc3RhbXAocHgscHkscnIpO3ByZXZCPXtzOmMucyxweCxweX07cmV0dXJufXByZXZCPW51bGw7Y29uc3QgY3g9TWF0aC5taW4ody0xLE1hdGgubWF4KDAsTWF0aC5yb3VuZChjLngqdykpKSxjeT1NYXRoLm1pbihoLTEsTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGMueSpoKSkpLHMwPWN5KncrY3g7aWYoZG9uZVtzMF0pcmV0dXJuO2NvbnN0IHIwPWRbczAqNF0sZzA9ZFtzMCo0KzFdLGIwPWRbczAqNCsyXTtjb25zdCBkYz1wPT5NYXRoLm1heChNYXRoLmFicyhkW3AqNF0tcjApLE1hdGguYWJzKGRbcCo0KzFdLWcwKSxNYXRoLmFicyhkW3AqNCsyXS1iMCkpO2NvbnN0IGN0PWMudHx8dG9sLHBjPXA9PntpZighZG9uZVtwXSYmZFtwKjQrM10+MCYmZGMocCk8PWN0KXtkb25lW3BdPTE7cVtxdCsrXT1wfX07cGMoczApO3doaWxlKHFoPHF0KXtjb25zdCBwPXFbcWgrK10seD1wJXc7aWYoeD4wKXBjKHAtMSk7aWYoeDx3LTEpcGMocCsxKTtpZihwPj13KXBjKHAtdyk7aWYocDxuLXcpcGMocCt3KX19KTsKIGZvcihsZXQgcD0wO3A8bjtwKyspaWYoZG9uZVtwXSlkW3AqNCszXT0wOwogZm9yKGxldCBwPTA7cDxuO3ArKyl7aWYoZG9uZVtwXSljb250aW51ZTtjb25zdCB4PXAldztpZighKCh4PjAmJmRvbmVbcC0xXSl8fCh4PHctMSYmZG9uZVtwKzFdKXx8KHA+PXcmJmRvbmVbcC13XSl8fChwPG4tdyYmZG9uZVtwK3ddKSkpY29udGludWU7Y29uc3Qgaz1kaXN0KHApO2lmKGs8dG9sKjIpZFtwKjQrM109TWF0aC5yb3VuZChkW3AqNCszXSooay10b2wpL3RvbCl9CiBsZXQgZWRnZT0wLGVkZ2VEb25lPTAscmVtb3ZlZD0wO2ZvcihsZXQgcD0wO3A8bjtwKyspaWYoZG9uZVtwXSlyZW1vdmVkKys7CiBmb3IobGV0IHg9MDt4PHc7eCsrKXtmb3IoY29uc3QgcCBvZiBbeCwoaC0xKSp3K3hdKXtlZGdlKys7aWYoZG9uZVtwXSllZGdlRG9uZSsrfX1mb3IobGV0IHk9MTt5PGgtMTt5Kyspe2Zvcihjb25zdCBwIG9mIFt5KncseSp3K3ctMV0pe2VkZ2UrKztpZihkb25lW3BdKWVkZ2VEb25lKyt9fQogY3R4LnB1dEltYWdlRGF0YShpbWcsMCwwKTsKIGNvbnN0IGVkZ2VTaGFyZT1lZGdlP2VkZ2VEb25lL2VkZ2U6MCxzaGFyZT1yZW1vdmVkL247CiBsZXQgc3RhdHVzPSdvayc7aWYoc2hhcmU8MC4wMilzdGF0dXM9J25vbmUnO2Vsc2UgaWYoc2hhcmU+MC45NylzdGF0dXM9J2FsbCc7ZWxzZSBpZihtaXhlZHx8ZWRnZVNoYXJlPDAuODUpc3RhdHVzPSdwYXJ0aWFsJzsKIHJldHVybiB7bWl4ZWQsc3RhdHVzLGVkZ2VTaGFyZSxzaGFyZX07Cn0KLyogLS0tLS0tLS0tLSBQTkcgY29sb3VyIHJlZHVjdGlvbiAobGlrZSBUaW55UE5HIC8gQ2FudmEgY29tcHJlc3Npb24pIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gcG5nQ3JjKGIpe2xldCBjPX4wO2ZvcihsZXQgaT0wO2k8Yi5sZW5ndGg7aSsrKXtjXj1iW2ldO2ZvcihsZXQgaz0wO2s8ODtrKyspYz0oYz4+PjEpXigweEVEQjg4MzIwJi0oYyYxKSl9cmV0dXJuIH5jPj4+MH0KZnVuY3Rpb24gcG5nQ2h1bmsodHlwZSxkYXRhKXtjb25zdCBvdXQ9bmV3IFVpbnQ4QXJyYXkoMTIrZGF0YS5sZW5ndGgpLGR2PW5ldyBEYXRhVmlldyhvdXQuYnVmZmVyKTtkdi5zZXRVaW50MzIoMCxkYXRhLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTw0O2krKylvdXRbNCtpXT10eXBlLmNoYXJDb2RlQXQoaSk7b3V0LnNldChkYXRhLDgpO2R2LnNldFVpbnQzMig4K2RhdGEubGVuZ3RoLHBuZ0NyYyhvdXQuc3ViYXJyYXkoNCw4K2RhdGEubGVuZ3RoKSkpO3JldHVybiBvdXR9CmFzeW5jIGZ1bmN0aW9uIGRlZmxhdGUoYnl0ZXMpe2NvbnN0IGNzPW5ldyBDb21wcmVzc2lvblN0cmVhbSgnZGVmbGF0ZScpO2NvbnN0IHc9Y3Mud3JpdGFibGUuZ2V0V3JpdGVyKCk7dy53cml0ZShieXRlcyk7dy5jbG9zZSgpO3JldHVybiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2UoY3MucmVhZGFibGUpLmFycmF5QnVmZmVyKCkpfQpmdW5jdGlvbiBtZWRpYW5DdXQoZCxuKXsKIGNvbnN0IHN0ZXA9TWF0aC5tYXgoMSxNYXRoLmZsb29yKGQubGVuZ3RoLzQvMjUwMDAwKSkscHg9W107CiBmb3IobGV0IGk9MDtpPGQubGVuZ3RoO2krPTQqc3RlcCl7Y29uc3QgYT1kW2krM107aWYoYTw4KWNvbnRpbnVlO3B4LnB1c2goW2RbaV0sZFtpKzFdLGRbaSsyXSxhXSl9CiBpZighcHgubGVuZ3RoKXJldHVybiBbXTsKIGxldCBib3hlcz1bcHhdOwogd2hpbGUoYm94ZXMubGVuZ3RoPG4pe2xldCBiaT0tMSxiZXN0PTAsYmM9MDsKICBib3hlcy5mb3JFYWNoKChiLGkpPT57aWYoYi5sZW5ndGg8MilyZXR1cm47Zm9yKGxldCBjPTA7Yzw0O2MrKyl7bGV0IGxvPTI1NSxoaT0wO2Zvcihjb25zdCBwIG9mIGIpe2lmKHBbY108bG8pbG89cFtjXTtpZihwW2NdPmhpKWhpPXBbY119Y29uc3Qgc2M9KGhpLWxvKSpNYXRoLnNxcnQoYi5sZW5ndGgpO2lmKHNjPmJlc3Qpe2Jlc3Q9c2M7Ymk9aTtiYz1jfX19KTsKICBpZihiaTwwfHxiZXN0PT09MClicmVhaztjb25zdCBiPWJveGVzW2JpXTtiLnNvcnQoKHgseSk9PnhbYmNdLXlbYmNdKTtjb25zdCBtPWIubGVuZ3RoPj4xO2JveGVzLnNwbGljZShiaSwxLGIuc2xpY2UoMCxtKSxiLnNsaWNlKG0pKX0KIHJldHVybiBib3hlcy5tYXAoYj0+e2xldCByPTAsZz0wLGJsPTAsYT0wO2Zvcihjb25zdCBwIG9mIGIpe3IrPXBbMF07Zys9cFsxXTtibCs9cFsyXTthKz1wWzNdfWNvbnN0IGs9Yi5sZW5ndGg7cmV0dXJuIFtNYXRoLnJvdW5kKHIvayksTWF0aC5yb3VuZChnL2spLE1hdGgucm91bmQoYmwvayksTWF0aC5yb3VuZChhL2spXX0pOwp9CmFzeW5jIGZ1bmN0aW9uIHF1YW50UG5nKGN0eCx3LGgsbil7CiBjb25zdCBkPWN0eC5nZXRJbWFnZURhdGEoMCwwLHcsaCkuZGF0YTsKIGxldCBoYXNDbGVhcj1mYWxzZTtmb3IobGV0IGk9MztpPGQubGVuZ3RoO2krPTQpaWYoZFtpXTw4KXtoYXNDbGVhcj10cnVlO2JyZWFrfQogY29uc3QgcGFsPW1lZGlhbkN1dChkLGhhc0NsZWFyP24tMTpuKTtpZihoYXNDbGVhcilwYWwudW5zaGlmdChbMCwwLDAsMF0pOwogaWYoIXBhbC5sZW5ndGgpcGFsLnB1c2goWzAsMCwwLDBdKTsKIGNvbnN0IGNhY2hlPW5ldyBJbnQxNkFycmF5KDE8PDIwKS5maWxsKC0xKSxzdGFydD1oYXNDbGVhcj8xOjA7CiBjb25zdCByYXc9bmV3IFVpbnQ4QXJyYXkoKHcrMSkqaCk7CiBmb3IobGV0IHk9MCxvPTAsaT0wO3k8aDt5Kyspe3Jhd1tvKytdPTA7Zm9yKGxldCB4PTA7eDx3O3grKyxpKz00KXsKICBjb25zdCBhPWRbaSszXTtsZXQgaWR4OwogIGlmKGE8OCYmaGFzQ2xlYXIpaWR4PTA7ZWxzZXtjb25zdCBrZXk9KChkW2ldPj4zKTw8MTUpfCgoZFtpKzFdPj4zKTw8MTApfCgoZFtpKzJdPj4zKTw8NSl8KGE+PjMpO2lkeD1jYWNoZVtrZXldOwogICBpZihpZHg8MCl7bGV0IGJkPTFlOTtmb3IobGV0IHA9c3RhcnQ7cDxwYWwubGVuZ3RoO3ArKyl7Y29uc3QgcT1wYWxbcF0sZHI9cVswXS1kW2ldLGRnPXFbMV0tZFtpKzFdLGRiPXFbMl0tZFtpKzJdLGRhPXFbM10tYSxkZD1kcipkcioyK2RnKmRnKjQrZGIqZGIrZGEqZGEqMztpZihkZDxiZCl7YmQ9ZGQ7aWR4PXB9fWNhY2hlW2tleV09aWR4fX0KICByYXdbbysrXT1pZHh9fQogY29uc3QgaWhkcj1uZXcgVWludDhBcnJheSgxMyksZHY9bmV3IERhdGFWaWV3KGloZHIuYnVmZmVyKTtkdi5zZXRVaW50MzIoMCx3KTtkdi5zZXRVaW50MzIoNCxoKTtpaGRyWzhdPTg7aWhkcls5XT0zOwogY29uc3QgcGx0ZT1uZXcgVWludDhBcnJheShwYWwubGVuZ3RoKjMpO3BhbC5mb3JFYWNoKChwLGkpPT57cGx0ZVtpKjNdPXBbMF07cGx0ZVtpKjMrMV09cFsxXTtwbHRlW2kqMysyXT1wWzJdfSk7CiBsZXQgbGFzdD0tMTtwYWwuZm9yRWFjaCgocCxpKT0+e2lmKHBbM10hPT0yNTUpbGFzdD1pfSk7CiBjb25zdCBwYXJ0cz1bbmV3IFVpbnQ4QXJyYXkoWzEzNyw4MCw3OCw3MSwxMywxMCwyNiwxMF0pLHBuZ0NodW5rKCdJSERSJyxpaGRyKSxwbmdDaHVuaygnUExURScscGx0ZSldOwogaWYobGFzdD49MClwYXJ0cy5wdXNoKHBuZ0NodW5rKCd0Uk5TJyxuZXcgVWludDhBcnJheShwYWwuc2xpY2UoMCxsYXN0KzEpLm1hcChwPT5wWzNdKSkpKTsKIHBhcnRzLnB1c2gocG5nQ2h1bmsoJ0lEQVQnLGF3YWl0IGRlZmxhdGUocmF3KSkscG5nQ2h1bmsoJ0lFTkQnLG5ldyBVaW50OEFycmF5KDApKSk7CiByZXR1cm4gbmV3IEJsb2IocGFydHMse3R5cGU6J2ltYWdlL3BuZyd9KTsKfQpjb25zdCBDQU5fUVVBTlQ9dHlwZW9mIENvbXByZXNzaW9uU3RyZWFtPT09J2Z1bmN0aW9uJzsKYXN5bmMgZnVuY3Rpb24gb3B0aW1pc2UoaXRlbSl7CiBpZighY2FuT3B0aW1pc2UoaXRlbSkpcmV0dXJuO2NvbnN0IHJldj0rK2l0ZW0ucmV2O2l0ZW0ucmVzdWx0PW51bGw7ZHJvcFVybChpdGVtLCdyZXMnKTtpdGVtLmJ1c3k9dHJ1ZTtyZW5kZXIoKTsKIGxldCBzcmM9bnVsbCxjYW52YXM9bnVsbDsKIHRyeXsKICBsZXQgb3V0PW91dFR5cGUoaXRlbSkscmVhc29uPScnO2NvbnN0IHQ9dGFyZ2V0U2l6ZShpdGVtKTsKICBpZihpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcpe3RyeXtzcmM9YXdhaXQgbG9hZEltZyhzdmdCbG9iKGl0ZW0uc3ZnLHQudyx0LmgpKX1jYXRjaChlKXt0aHJvdyBFcnJvcignSWhyIEJyb3dzZXIga29ubnRlIGRpZXNlIFNWRyBuaWNodCBkYXJzdGVsbGVuLiBTaWUgdmVyd2VuZGV0IG3DtmdsaWNoZXJ3ZWlzZSBGdW5rdGlvbmVuLCBkaWUgbmljaHQgYWxzIEJpbGQgZ2V6ZWljaG5ldCB3ZXJkZW4ga8O2bm5lbi4nKX19CiAgZWxzZSBzcmM9YXdhaXQgZGVjb2RlUmFzdGVyKGl0ZW0uZmlsZSk7CiAgaWYob3V0PT09J2F1dG8nKXtjb25zdCBhPWl0ZW0udHlwZT09PSdpbWFnZS9qcGVnJz97YWxwaGE6ZmFsc2UscGhvdG86dHJ1ZX06YW5hbHlzZShzcmMuc291cmNlLHQudyx0LmgpOwogICBpZighYXx8YS5hbHBoYSl7b3V0PSdpbWFnZS9wbmcnO3JlYXNvbj1hPydBbHMgUE5HIGdlc3BlaWNoZXJ0LCB1bSBkaWUgVHJhbnNwYXJlbnogenUgZXJoYWx0ZW4uJzonJ30KICAgZWxzZSBpZighYS5waG90byl7b3V0PSdpbWFnZS9wbmcnO3JlYXNvbj0nQWxzIFBORyBnZXNwZWljaGVydCwgZGEgZXMgd2llIGVpbmUgR3JhZmlrIG9kZXIgZWluIExvZ28gbWl0IHdlbmlnZW4gRmFyYmVuIGF1c3NpZWh0Lid9CiAgIGVsc2V7b3V0PSdpbWFnZS9qcGVnJztyZWFzb249aXRlbS50eXBlPT09J2ltYWdlL2pwZWcnPydBbHMgSlBHIGJlaWJlaGFsdGVuLCBkYXMgenUgRm90b3MgdW5kIEJpbGRlcm4gb2huZSBUcmFuc3BhcmVueiBwYXNzdC4nOidBbHMgSlBHIGdlc3BlaWNoZXJ0LCBkYSBlcyB3aWUgZWluIEZvdG8gb2huZSBUcmFuc3BhcmVueiBhdXNzaWVodC4nfX0KICBpZihpdGVtLnRyYW5zcCYmIWl0ZW0uYW5pbWF0ZWQpe291dD0naW1hZ2UvcG5nJztyZWFzb249J0FscyBQTkcgZ2VzcGVpY2hlcnQsIHVtIGRlbiB0cmFuc3BhcmVudGVuIEhpbnRlcmdydW5kIHp1IGVyaGFsdGVuLid9CiAgY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2NhbnZhcy53aWR0aD10Lnc7Y2FudmFzLmhlaWdodD10Lmg7CiAgY29uc3QgY3R4PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2lmKCFjdHgpdGhyb3cgRXJyb3IoJ0JpbGRiZWFyYmVpdHVuZyBpc3QgaW4gZGllc2VtIEJyb3dzZXIgbmljaHQgdmVyZsO8Z2Jhci4nKTsKICBpZihvdXQ9PT0naW1hZ2UvanBlZycpe2N0eC5maWxsU3R5bGU9JyNmZmYnO2N0eC5maWxsUmVjdCgwLDAsdC53LHQuaCl9CiAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZD10cnVlO2N0eC5pbWFnZVNtb290aGluZ1F1YWxpdHk9J2hpZ2gnO2N0eC5kcmF3SW1hZ2Uoc3JjLnNvdXJjZSwwLDAsdC53LHQuaCk7CiAgbGV0IGJnTWl4ZWQ9bnVsbDtpZihpdGVtLnRyYW5zcCYmIWl0ZW0uYW5pbWF0ZWQpYmdNaXhlZD1yZW1vdmVCZyhjdHgsdC53LHQuaCxpdGVtLnRvbHx8NDAsaXRlbS5jbGlja3MpfHx7c3RhdHVzOidub25lJ307CiAgbGV0IGJsb2I7CiAgaWYob3V0PT09J2ltYWdlL3BuZycmJkNBTl9RVUFOVCYmaXRlbS5jb2xvdXJzPjApe3RyeXtibG9iPWF3YWl0IHF1YW50UG5nKGN0eCx0LncsdC5oLGl0ZW0uY29sb3Vycyl9Y2F0Y2goZSl7YmxvYj1udWxsfX0KICBpZighYmxvYilibG9iPWF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pnt0cnl7Y2FudmFzLnRvQmxvYihiPT5iP3Jlc29sdmUoYik6cmVqZWN0KEVycm9yKCdJaHIgQnJvd3NlciBrb25udGUgZGFzIEJpbGQgbmljaHQgZXJzdGVsbGVuLiBFcyBpc3QgbcO2Z2xpY2hlcndlaXNlIHp1IGdyb8OfIGbDvHIgZGVuIHZlcmbDvGdiYXJlbiBTcGVpY2hlci4nKSksb3V0LGl0ZW0ucXVhbGl0eS8xMDApfWNhdGNoKGUpe3JlamVjdChlJiZlLm5hbWU9PT0nU2VjdXJpdHlFcnJvcic\/RXJyb3IoJ0lociBCcm93c2VyIGhhdCBkaWUgS29udmVydGllcnVuZyBkaWVzZXIgU1ZHIGJsb2NraWVydC4gRXhwb3J0aWVyZW4gU2llIHNpZSBzdGF0dGRlc3NlbiBhdXMgSWhyZW0gRGVzaWducHJvZ3JhbW0gYWxzIFBORy4nKTplKX19KTsKICBpZihibG9iLnR5cGUhPT1vdXQpdGhyb3cgRXJyb3IoJ0lociBCcm93c2VyIGthbm4ga2VpbmUgJyt0eXBlTGFiZWwob3V0KSsnLURhdGVpZW4gZXJzdGVsbGVuLicpOwogIGNvbnN0IGtlcHQ9IWl0ZW0udHJhbnNwJiZDTV9BQ0NFUFRFRC5pbmNsdWRlcyhpdGVtLnR5cGUpJiYhaXRlbS5taXNtYXRjaCYmdC53PT09aXRlbS53aWR0aCYmdC5oPT09aXRlbS5oZWlnaHQmJmJsb2Iuc2l6ZT49aXRlbS5maWxlLnNpemUmJihpdGVtLm91dHB1dD09PSdhdXRvJ3x8b3V0PT09aXRlbS50eXBlKSxjaG9zZW49a2VwdD9pdGVtLmZpbGU6YmxvYjsKICBjb25zdCBjcmM9Y3JjMzIobmV3IFVpbnQ4QXJyYXkoYXdhaXQgY2hvc2VuLmFycmF5QnVmZmVyKCkpKTsKICBpZihyZXYhPT1pdGVtLnJldnx8IWFsaXZlKGl0ZW0pKXJldHVybjsKICBpdGVtLnJlc3VsdD17YmxvYjpjaG9zZW4sY3JjLHR5cGU6a2VwdD9pdGVtLnR5cGU6b3V0LHdpZHRoOnQudyxoZWlnaHQ6dC5oLGtlcHRPcmlnaW5hbDprZXB0LHRyaWVkU2l6ZTpibG9iLnNpemUsYmdNaXhlZCxyZWFzb24sbmFtZTprZXB0P3NhZmVCYXNlKGl0ZW0uZmlsZS5uYW1lKSsnLicrKGV4dE9mKGl0ZW0uZmlsZS5uYW1lKXx8VFlQRVNbaXRlbS50eXBlXVsxXSk6c2FmZUJhc2UoaXRlbS5maWxlLm5hbWUpKyctb3B0aW1pc2VkLicrVFlQRVNbb3V0XVsxXX07CiAgaXRlbS5jb21wYXJlPXRydWU7dHJhY2soJ29wdGltaXNlJyk7CiAgc3RhdHVzKGtlcHQ\/aXRlbS5maWxlLm5hbWUrJyBpc3QgYmVyZWl0cyBndXQgb3B0aW1pZXJ0LiBEaWUgT3JpZ2luYWxkYXRlaSB3dXJkZSBiZWliZWhhbHRlbi4nOidCaWxkIGJlcmVpdDogJytpdGVtLnJlc3VsdC5uYW1lKTsKIH1jYXRjaChlKXtpZihyZXY9PT1pdGVtLnJldiYmYWxpdmUoaXRlbSkpc3RhdHVzKCdLb25udGUgbmljaHQgb3B0aW1pZXJ0IHdlcmRlbjogJytpdGVtLmZpbGUubmFtZSsnOiAnKyhlJiZlLm1lc3NhZ2U\/ZS5tZXNzYWdlOid1bmJla2FubnRlciBGZWhsZXInKSl9CiBmaW5hbGx5e2lmKHNyYylzcmMucmVsZWFzZSgpO2lmKGNhbnZhcyl7Y2FudmFzLndpZHRoPTA7Y2FudmFzLmhlaWdodD0wfWlmKHJldj09PWl0ZW0ucmV2KWl0ZW0uYnVzeT1mYWxzZTtpZihhbGl2ZShpdGVtKSlyZW5kZXIoKX0KfQovKiAtLS0tLS0tLS0tIHJlbmRlcmluZyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIGVsKHRhZyxjbHMsdHh0KXtjb25zdCB4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtpZihjbHMpeC5jbGFzc05hbWU9Y2xzO2lmKHR4dCE9PXVuZGVmaW5lZCl4LnRleHRDb250ZW50PXR4dDtyZXR1cm4geH0KY29uc3Qgb3BlblRpcHM9bmV3IFNldCgpOwpjb25zdCBjYW5Ib3Zlcj13aW5kb3cubWF0Y2hNZWRpYSYmbWF0Y2hNZWRpYSgnKGhvdmVyOiBob3ZlcikgYW5kIChwb2ludGVyOiBmaW5lKScpLm1hdGNoZXM7CmZ1bmN0aW9uIGhlbHBUaXAodGV4dCxrZXkpe2NvbnN0IHc9ZWwoJ3NwYW4nLCdjaWwtdGlwd3JhcCcpLGI9ZWwoJ2J1dHRvbicsJ2NpbC10aXBidG4nLCc\/JykscD1lbCgnc3BhbicsJ2NpbC10aXB0ZXh0IGNpbC10aXBwb3AnLHRleHQpO2IudHlwZT0nYnV0dG9uJztiLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ1dlaXRlcmUgSW5mb3JtYXRpb25lbicpO2NvbnN0IHNldD1vPT57cC5oaWRkZW49IW87Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLFN0cmluZyhvKSl9O3NldCghY2FuSG92ZXImJm9wZW5UaXBzLmhhcyhrZXkpKTsKIGlmKGNhbkhvdmVyKXt3LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCgpPT5zZXQodHJ1ZSkpO3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsKCk9PntpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09YilzZXQoZmFsc2UpfSk7Yi5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsKCk9PnNldCh0cnVlKSk7Yi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywoKT0+c2V0KGZhbHNlKSk7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpfSl9CiBlbHNlIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9PntlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtjb25zdCBvPXAuaGlkZGVuO3NldChvKTtpZihvKW9wZW5UaXBzLmFkZChrZXkpO2Vsc2Ugb3BlblRpcHMuZGVsZXRlKGtleSl9KTsKIHcuYXBwZW5kKGIscCk7cmV0dXJuIHd9CmZ1bmN0aW9uIGZpZWxkSGVscCh0ZXh0LGNvbnRyb2wsaGVscCxrZXkpe2NvbnN0IGQ9ZWwoJ2RpdicsJ2NpbC1maWVsZCcpLGg9ZWwoJ3NwYW4nLCdjaWwtbGFiZWwnLHRleHQpO3tjb25zdCB0dz1oZWxwVGlwKGhlbHAsa2V5KTt0dy5jbGFzc0xpc3QuYWRkKCdjaWwtdGlwLWxlZnQnKTtoLmFwcGVuZCh0dyl9Y29udHJvbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLHRleHQpO2QuYXBwZW5kKGgsY29udHJvbCk7cmV0dXJuIGR9CmZ1bmN0aW9uIGZpZWxkKHRleHQsY29udHJvbCl7Y29uc3QgbD1lbCgnbGFiZWwnLCdjaWwtZmllbGQnKTtsLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1sYWJlbCcsdGV4dCksY29udHJvbCk7cmV0dXJuIGx9CmZ1bmN0aW9uIHNlbGVjdChvcHRzLHZhbHVlLGZpZCxvbkNoYW5nZSl7Y29uc3Qgcz1lbCgnc2VsZWN0Jyk7cy5kYXRhc2V0LmY9ZmlkO29wdHMuZm9yRWFjaCgoW3YsdF0pPT57Y29uc3Qgbz1lbCgnb3B0aW9uJyxudWxsLHQpO28udmFsdWU9djtzLmFwcGVuZChvKX0pO3MudmFsdWU9dmFsdWU7cy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT5vbkNoYW5nZShzLnZhbHVlKSk7cmV0dXJuIHN9CmZ1bmN0aW9uIGJ1dHRvbih0ZXh0LGZuLGNscyxmaWQpe2NvbnN0IGI9ZWwoJ2J1dHRvbicsJ2NpbC1idG4nKyhjbHM\/JyAnK2NsczonJyksdGV4dCk7Yi50eXBlPSdidXR0b24nO2lmKGZpZCliLmRhdGFzZXQuZj1maWQ7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZm4pO3JldHVybiBifQpmdW5jdGlvbiBtZXRyaWMobmFtZSx2YWx1ZSl7Y29uc3QgZD1lbCgnZGl2JywnY2lsLW1ldHJpYycpO2QuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJyxuYW1lKSxlbCgnYicsbnVsbCx2YWx1ZSkpO3JldHVybiBkfQpjb25zdCBJTkZPX1RZUEU9eycnOidnb29kLXRvLWtub3cnLHdhcm46J2Nhbm5vdC1iZS11bmRvbmUnLGFsZXJ0OidjYW5ub3QtYmUtdW5kb25lJyxlcnJvcjonY2Fubm90LWJlLXVuZG9uZScsc3VjY2VzczondGlwJyxuZXV0cmFsOidnb29kLXRvLWtub3cnfTsKZnVuY3Rpb24gaGludChjYXJkLHRleHQsdG9uZSl7Y29uc3QgZD1lbCgnZGl2JywnY2lsLWhpbnQgY21hYy1pbmZvIGNtYWMtaW5mby0nK0lORk9fVFlQRVt0b25lfHwnJ10rKHRvbmU\/JyBjaWwtJyt0b25lOicnKSksaT1lbCgnc3BhbicsJ2NtYWMtaW5mby1pY29uJyksYj1lbCgnZGl2JywnY21hYy1pbmZvLWJvZHknKSxjPWVsKCdkaXYnLCdjbWFjLWluZm8tY29udGVudCcsdGV4dCk7aS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywndHJ1ZScpO2IuYXBwZW5kKGMpO2QuYXBwZW5kKGksYik7Y2FyZC5hcHBlbmQoZCl9CmZ1bmN0aW9uIGJnSGludChjYXJkLHJlcCl7aWYoIXJlcHx8cmVwLnN0YXR1cz09PSdvaycpcmV0dXJuO2NvbnN0IG1zZz17bm9uZTonRGVyIEhpbnRlcmdydW5kIGtvbm50ZSBuaWNodCBlbnRmZXJudCB3ZXJkZW4uIERhcyBUb29sIGVudGZlcm50IG51ciBlaW5lbiBlaW5mYXJiaWdlbiBIaW50ZXJncnVuZCwgZGVyIGJpcyBhbiBkaWUgQmlsZHLDpG5kZXIgcmVpY2h0LCB6dW0gQmVpc3BpZWwgV2Vpw58gaGludGVyIGVpbmVtIExvZ28uJyxwYXJ0aWFsOidEZXIgSGludGVyZ3J1bmQgd3VyZGUgbnVyIHRlaWx3ZWlzZSBlbnRmZXJudC4gRGllIFLDpG5kZXIgZGllc2VzIEJpbGRlcyBoYWJlbiBtZWhyIGFscyBlaW5lIEZhcmJlLCBtZWlzdCB3ZWlsIGVzIGVpbiBGb3RvIGlzdCBvZGVyIGVpbmVuIFNjaGF0dGVuIG9kZXIgVmVybGF1ZiBoYXQuIFZlcnN1Y2hlbiBTaWUgZWluZSBow7ZoZXJlIFRvbGVyYW56LicsYWxsOidGYXN0IGRhcyBnYW56ZSBCaWxkIHd1cmRlIGVudGZlcm50LCB3ZWlsIGVzIMO8YmVyd2llZ2VuZCBkaWVzZWxiZSBGYXJiZSB3aWUgZGVyIEhpbnRlcmdydW5kIGhhdC4gU2Vua2VuIFNpZSBkaWUgVG9sZXJhbnouJ31bcmVwLnN0YXR1c107aGludChjYXJkLG1zZyxyZXAuc3RhdHVzPT09J3BhcnRpYWwnPyd3YXJuJzonYWxlcnQnKTtjb25zdCBib3g9Y2FyZC5sYXN0Q2hpbGQucXVlcnlTZWxlY3RvcignLmNtYWMtaW5mby1jb250ZW50Jyk7Ym94LmFwcGVuZCgnIEbDvHIgRm90b3MgdW5kIGtvbXBsZXhlcmUgQmlsZGVyIGvDtm5uZW4gU2llIGVpbiBLSS1Ub29sIHp1bSBFbnRmZXJuZW4gdm9uIEhpbnRlcmdyw7xuZGVuIHZlcndlbmRlbiwgenVtIEJlaXNwaWVsICcpO2NvbnN0IGE9ZWwoJ2EnLG51bGwsJ3JlbW92ZS5iZycpO2EuaHJlZj0naHR0cHM6Ly93d3cucmVtb3ZlLmJnLyc7YS50YXJnZXQ9J19ibGFuayc7YS5yZWw9J25vb3BlbmVyIG5vcmVmZXJyZXInO2JveC5hcHBlbmQoYSwnLicpfQpmdW5jdGlvbiBmb3JtYXRUZXh0KGl0ZW0pe2xldCB0PXR5cGVMYWJlbChpdGVtLnR5cGUpO2lmKGl0ZW0udHlwZT09PSdpbWFnZS9naWYnKXQrPWl0ZW0uYW5pbWF0ZWQ\/JyAoYW5pbWllcnQsICcraXRlbS5mcmFtZXMrJyBFaW56ZWxiaWxkZXIpJzppdGVtLmZyYW1lcz09PTE\/JyAoc3RhdGlzY2gpJzonJztlbHNlIGlmKGl0ZW0uYW5pbWF0ZWQpdCs9JyAoYW5pbWllcnQpJztyZXR1cm4gdH0KZnVuY3Rpb24gYWR2aWNlRm9yKGNhcmQsaXRlbSl7CiBpZihpdGVtLmxvYWRpbmcpe2hpbnQoY2FyZCwnQmlsZCB3aXJkIGdlbGVzZW7igKYnKTtyZXR1cm59CiBpZihpdGVtLm1pc21hdGNoKWhpbnQoY2FyZCwoaXRlbS5jbGFpbWVkPydMYXV0IERhdGVpbmFtZTogJyt0eXBlTGFiZWwoaXRlbS5jbGFpbWVkKSsnLCBhYmVyIGRlciBEYXRlaWluaGFsdCBpc3QgJyt0eXBlTGFiZWwoaXRlbS50eXBlKSsnLic6J0RlciBEYXRlaW5hbWUgaGF0IGtlaW5lIGJla2FubnRlIEJpbGQtRGF0ZWllbmR1bmcuIERlciBJbmhhbHQgaXN0ICcrdHlwZUxhYmVsKGl0ZW0udHlwZSkrJy4nKSsnIENvbmZlcmVuY2UgTWFuYWdlciBsZWhudCBkaWUgRGF0ZWkgbcO2Z2xpY2hlcndlaXNlIGFiIG9kZXIgemVpZ3Qgc2llIGZhbHNjaCBhbi4gS29udmVydGllcmVuIFNpZSBzaWUgdW50ZW4gb2RlciBzcGVpY2hlcm4gU2llIHNpZSBtaXQgZGVyIHJpY2h0aWdlbiBFbmR1bmcgZXJuZXV0LicsJ3dhcm4nKTsKIGlmKCFDTV9BQ0NFUFRFRC5pbmNsdWRlcyhpdGVtLnR5cGUpKWhpbnQoY2FyZCx0eXBlTGFiZWwoaXRlbS50eXBlKSsnLURhdGVpZW4ga8O2bm5lbiBuaWNodCBpbiBkaWUgTWVkaWVuYmlibGlvdGhlayB2b24gQ29uZmVyZW5jZSBNYW5hZ2VyIGhvY2hnZWxhZGVuIHdlcmRlbi4gS29udmVydGllcmVuIFNpZSBzaWUgaW4gSlBHIG9kZXIgUE5HLicrKGFyZWE9PT0nZW1haWwnJiYoaXRlbS50eXBlPT09J2ltYWdlL3dlYnAnfHxpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcpPycgQmlsZCAoVVJMKSB6ZWlndCBlaW5lIGV4dGVybiBnZWhvc3RldGUgJyt0eXBlTGFiZWwoaXRlbS50eXBlKSsnLURhdGVpIGltIEVkaXRvciBldmVudHVlbGwgYW4sIGFiZXIgZGllIEUtTWFpbC1Qcm9ncmFtbWUgZGVyIEVtcGbDpG5nZXIgemVpZ2VuIHNpZSBtw7ZnbGljaGVyd2Vpc2UgbmljaHQgYW4uJzonJyksJ3dhcm4nKTsKIGlmKGl0ZW0uZXJyb3Ipe2hpbnQoY2FyZCxpdGVtLmVycm9yLCdlcnJvcicpO3JldHVybn0KIGNvbnN0IFI9aXRlbS5yZXN1bHQmJiFpdGVtLnJlc3VsdC5rZXB0T3JpZ2luYWw\/aXRlbS5yZXN1bHQ6bnVsbCxTWj1SP1IuYmxvYi5zaXplOml0ZW0uZmlsZS5zaXplLHJlYz1zdWdnZXN0ZWQoaXRlbSksc3ZnPSFSJiZpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcsVz1SP1Iud2lkdGg6aXRlbS53aWR0aCxleGFjdD1pc0V4YWN0KGl0ZW0pJiYhIXJlYyxjb2w9aXNDb2x1bW4oaXRlbSkmJiEhcmVjJiYhc3ZnLGJpZz1yZWMmJiFleGFjdCYmIWNvbCYmVz5yZWMqMjsKIGNvbnN0IHNpemVUeHQ9U1o+TUI\/J0RpZSBEYXRlaSBpc3QgJysoYmlnPydhdWNoICc6JycpKydyZWxhdGl2IGdyb8OfICgnK2ZtdChTWikrJykuIEtvbXByaW1pZXJlbiBTaWUgc2llLCBkZW5uIGdyb8OfZSBCaWxkZGF0ZWllbiBrw7ZubmVuICcrKGFyZWE9PT0nZW1haWwnPydkaWUgTGFkZXplaXQsIGRlbiBWZXJzYW5kIHVuZCBpbiBtYW5jaGVuIEbDpGxsZW4gZGllIFp1c3RlbGx1bmcgZGVyIEUtTWFpbCBiZWVpbnRyw6RjaHRpZ2VuLic6J0locmUgV2Vic2l0ZSB2ZXJsYW5nc2FtZW4sIGJlc29uZGVycyBhdWYgTW9iaWxnZXLDpHRlbi4nKTpTWj41MDAqS0I\/J0RpZSBEYXRlaSBpc3QgJysoYmlnPydhdWNoICc6JycpKydyZWNodCBncm\/DnyAoJytmbXQoU1opKycpLiBTaWUga8O2bm5lbiBzaWUga29tcHJpbWllcmVuLic6U1o+MD8nRGllIERhdGVpZ3LDtsOfZSAoJytmbXQoU1opKycpIGlzdCBpbiBPcmRudW5nLic6Jyc7CiBsZXQgZGltPScnLGx2PTA7CiBpZighcmVjKWx2PS0xLGRpbT1pc0N1c3RvbVdpZHRoKGl0ZW0pPydHZWJlbiBTaWUgZGllIEJpbGRicmVpdGUgaW4gcHggZWluLCB1bSBzaWUgbWl0IGRpZXNlbSBCaWxkIHp1IHZlcmdsZWljaGVuLic6YXJlYT09PSd3ZWJzaXRlJyYmaXRlbS53UGxhY2VtZW50PT09J25vbmUnPydXw6RobGVuIFNpZSBlaW5lIFBsYXR6aWVydW5nLCB1bSBlaW5lIGVtcGZvaGxlbmUgQnJlaXRlIHp1IHNlaGVuLic6J0bDvHIgZGllc2UgUGxhdHppZXJ1bmcgZ2lidCBlcyBrZWluZSBiZXN0aW1tdGUgZW1wZm9obGVuZSBCcmVpdGUuJzsKIGVsc2UgaWYoZXhhY3QpewogIGlmKFc9PT1yZWMpe2x2PTA7ZGltPSdSaWNodGlnZSBCcmVpdGU6IERpZXNlIFBsYXR6aWVydW5nIGJlbsO2dGlndCAnK3JlYysnIHB4LCB1bmQgZGllc2VzIEJpbGQgaXN0ICcrVysnIHB4IGJyZWl0Lid9CiAgZWxzZSBpZihzdmcpZGltPSdEaWVzZSBQbGF0emllcnVuZyBiZW7DtnRpZ3QgZ2VuYXUgJytyZWMrJyBweC4gV8OkaGxlbiBTaWUgdW50ZXIgQmlsZG1hw59lIGRpZSBPcHRpb24gR2VuYXUgJytyZWMrJyBweC4gU1ZHIGthbm4gaW4gamVkZXIgQnJlaXRlIG9obmUgU2Now6RyZmV2ZXJsdXN0IGtvbnZlcnRpZXJ0IHdlcmRlbi4nOwogIGVsc2V7bHY9MztkaW09J0ZhbHNjaGUgQnJlaXRlIGbDvHIgZGllc2UgUGxhdHppZXJ1bmc6IERpZXNlcyBCaWxkIGlzdCAnK1crJyBweCBicmVpdCwgdW5kIGRpZXNlIFBsYXR6aWVydW5nIGJlbsO2dGlndCBnZW5hdSAnK3JlYysnIHB4LiBadSBzY2htYWxlIG9kZXIgenUgYnJlaXRlIEJpbGRlciB3ZXJkZW4gaW0gV2Vic2l0ZS1EZXNpZ25lciBtw7ZnbGljaGVyd2Vpc2UgbmljaHQgd2llIGdld8O8bnNjaHQgYW5nZXplaWd0LiAnKyhXPHJlYyowLjk\/J1ZlcndlbmRlbiBTaWUgZWluIGdyw7bDn2VyZXMgQmlsZCBtaXQgbWluZGVzdGVucyAnK3JlYysnIHB4IEJyZWl0ZS4gRWluZSBWZXJncsO2w59lcnVuZyB3w7xyZGUgZGFzIEJpbGQgdW5zY2jDpHJmZXIgbWFjaGVuLCBkYWhlciBlbXBmZWhsZW4gd2lyIHNpZSBuaWNodC4nOidXw6RobGVuIFNpZSB1bnRlciBCaWxkbWHDn2UgZGllIE9wdGlvbiBHZW5hdSAnK3JlYysnIHB4IHVuZCBrbGlja2VuIFNpZSBhdWYgT3B0aW1pZXJlbiAvIGtvbnZlcnRpZXJlbi4gTnVyIGRpZSBCcmVpdGUgd2lyZCBnZcOkbmRlcnQsIGRhcyBCaWxkIHdpcmQgbmljaHQgYmVzY2huaXR0ZW4uJysoVzxyZWM\/JyBEYXMgQmlsZCB3aXJkIGxlaWNodCB2ZXJncsO2w59lcnQsIHdhcyBtZWlzdCBuaWNodCBzaWNodGJhciBpc3QuJzonJykpfQogfQogZWxzZSBpZihjb2wpewogIGlmKE1hdGguYWJzKFctcmVjKTw9NSl7bHY9MDtkaW09J0d1dGUgQnJlaXRlOiBFdHdhICcrcmVjKycgcHggd2VyZGVuIGbDvHIgZGllc2VzIFNwYWx0ZW5sYXlvdXQgZW1wZm9obGVuLCB1bmQgZGllc2VzIEJpbGQgaXN0ICcrVysnIHB4IGJyZWl0Lid9CiAgZWxzZSBpZihXPnJlYyl7bHY9MjtkaW09J0lociBCaWxkIGlzdCAnK1crJyBweCBicmVpdCwgdW5kIGV0d2EgJytyZWMrJyBweCB3ZXJkZW4gZsO8ciBkaWVzZXMgU3BhbHRlbmxheW91dCBlbXBmb2hsZW4gKFN0YW5kYXJkLVNwYWx0ZW5icmVpdGVuKS4gQmlsZGVyIGluIFNwYWx0ZW4gcmljaHRlbiBzaWNoIGFtIGJlc3RlbiBtaXQgZGVyIGVtcGZvaGxlbmVuIEJyZWl0ZSBhdXMuIFfDpGhsZW4gU2llIHVudGVyIEJpbGRtYcOfZSBkaWUgT3B0aW9uIEVtcGZvaGxlbmUgQnJlaXRlIHVuZCBrbGlja2VuIFNpZSBhdWYgT3B0aW1pZXJlbiAvIGtvbnZlcnRpZXJlbi4nfQogIGVsc2V7bHY9MjtkaW09J0lociBCaWxkIGlzdCAnK1crJyBweCBicmVpdCwgdW5kIGV0d2EgJytyZWMrJyBweCB3ZXJkZW4gZsO8ciBkaWVzZXMgU3BhbHRlbmxheW91dCBlbXBmb2hsZW4uIEVzIGbDvGxsdCBkaWUgU3BhbHRlIGV2ZW50dWVsbCBuaWNodCBhdXMsIHJpY2h0ZXQgc2ljaCBuaWNodCBhbiBkZW4gYW5kZXJlbiBCaWxkZXJuIGF1cyB1bmQga2FubiB1bnNjaGFyZiB3aXJrZW4uIFZlcndlbmRlbiBTaWUgZWluIGdyw7bDn2VyZXMgQmlsZCwgZmFsbHMgdm9yaGFuZGVuLid9CiB9CiBlbHNlIGlmKFc8cmVjJiYhc3ZnKXtsdj0yO2RpbT0odG9vTmFycm93KGl0ZW0pPydTY2htYWxlciBhbHMgZW1wZm9obGVuOiAnOidFdHdhcyBzY2htYWxlciBhbHMgZW1wZm9obGVuOiAnKSsnZGllc2VzIEJpbGQgaXN0ICcrVysnIHB4IGJyZWl0LCB1bmQgZXR3YSAnK3JlYysnIHB4IHdlcmRlbiBlbXBmb2hsZW4uIEVzIGthbm4gdW5zY2hhcmYgd2lya2VuJysoYXJlYT09PSdlbWFpbCc\/JyAoaW4gZGVyIEUtTWFpbCknOicnKSsnLiBWZXJ3ZW5kZW4gU2llIGVpbiBncsO2w59lcmVzIEJpbGQsIGZhbGxzIHZvcmhhbmRlbi4nfQogZWxzZSBpZihXPHJlYylkaW09J0VtcGZvaGxlbmUgQnJlaXRlOiBldHdhICcrcmVjKycgcHguIFNWRyBrYW5uIGluIGRpZXNlciBCcmVpdGUgb2huZSBTY2jDpHJmZXZlcmx1c3Qga29udmVydGllcnQgd2VyZGVuLic7CiBlbHNlIGlmKGJpZyYmU1o8PTUwMCpLQil7bHY9MjtkaW09J0lociBCaWxkIGlzdCAnK1crJyBweCBicmVpdCwgdW5kIGV0d2EgJytyZWMrJyBweCB3ZXJkZW4gZW1wZm9obGVuIGbDvHIgJysoYXJlYT09PSdlbWFpbCc\/J2RpZXNlcyBMYXlvdXQnOidkaWVzZSBQbGF0emllcnVuZycpKycuIFdpciBlbXBmZWhsZW4sIGVzIGF1ZiBldHdhICcrcmVjKycgcHggenUgdmVya2xlaW5lcm4uIFfDpGhsZW4gU2llIHVudGVyIEJpbGRtYcOfZSBkaWUgT3B0aW9uIEVtcGZvaGxlbmUgQnJlaXRlIHVuZCBrbGlja2VuIFNpZSBhdWYgT3B0aW1pZXJlbiAvIGtvbnZlcnRpZXJlbi4nfQogZWxzZSBpZihiaWcpe2x2PTI7ZGltPSdJaHIgQmlsZCBpc3QgJytXKycgcHggYnJlaXQsIHfDpGhyZW5kIGRpZSBlbXBmb2hsZW5lIEJyZWl0ZSBmw7xyICcrKGFyZWE9PT0nZW1haWwnPydkaWVzZXMgTGF5b3V0JzonZGllc2UgUGxhdHppZXJ1bmcnKSsnIGJlaSBldHdhICcrcmVjKycgcHggbGllZ3QuIEFuZGVyZSBNYcOfZSBrw7ZubmVuIGF1Y2ggZnVua3Rpb25pZXJlbiwgYWJlciBlaW5lIGdlcmluZ2VyZSBCcmVpdGUgaMOkbHQgZGllIERhdGVpZ3LDtsOfZSBrbGVpbi4nfQogZWxzZXtsdj0wO2RpbT0nRW1wZm9obGVuZSBCcmVpdGU6IGV0d2EgJytyZWMrJyBweC4gRGllc2VzIEJpbGQgaXN0IGJyZWl0IGdlbnVnLid9CiBpZihzdmcmJnJlYyl7bHY9MjtkaW09ZXhhY3Q\/J0tvbnZlcnRpZXJlbiBTaWUgZGllc2UgU1ZHIG1pdCBnZW5hdSAnK3JlYysnIHB4OiBXw6RobGVuIFNpZSB1bnRlciBCaWxkbWHDn2UgZGllIE9wdGlvbiBHZW5hdSAnK3JlYysnIHB4IHVuZCBrbGlja2VuIFNpZSBhdWYgT3B0aW1pZXJlbiAvIGtvbnZlcnRpZXJlbi4gU1ZHIGthbm4gaW4gamVkZXIgQnJlaXRlIG9obmUgU2Now6RyZmV2ZXJsdXN0IGtvbnZlcnRpZXJ0IHdlcmRlbi4nOidLb252ZXJ0aWVyZW4gU2llIGRpZXNlIFNWRyBtaXQgZXR3YSAnK3JlYysnIHB4OiBXw6RobGVuIFNpZSB1bnRlciBCaWxkbWHDn2UgZGllIE9wdGlvbiBFbXBmb2hsZW5lIEJyZWl0ZSB1bmQga2xpY2tlbiBTaWUgYXVmIE9wdGltaWVyZW4gLyBrb252ZXJ0aWVyZW4uIFNWRyBrYW5uIGluIGplZGVyIEJyZWl0ZSBvaG5lIFNjaMOkcmZldmVybHVzdCBrb252ZXJ0aWVydCB3ZXJkZW4uJ30KIGNvbnN0IGx2RGltPWx2OwogaWYoc3ZnKXt9ZWxzZSBpZihTWj5NQilsdj1NYXRoLm1heChsdiwzKTtlbHNlIGlmKFNaPjUwMCpLQilsdj1NYXRoLm1heChsdiwyKTsKIGlmKCFSfHxsdkRpbT49MiloaW50KGNhcmQsZGltKyghUiYmc2l6ZVR4dCYmIXN2ZyYmIShiaWcmJlNaPD01MDAqS0IpPycgJytzaXplVHh0OicnKSxSP1snc3VjY2VzcycsJ3N1Y2Nlc3MnLCd3YXJuJywnYWxlcnQnXVtsdkRpbV06bHY8MD8nbmV1dHJhbCc6WydzdWNjZXNzJywnc3VjY2VzcycsJ3dhcm4nLCdhbGVydCddW2x2XSk7CiBpZihpdGVtLnR5cGU9PT0naW1hZ2UvYm1wJyloaW50KGNhcmQsJ0JNUCBrYW5uIGluIGRlciBNZWRpZW5iaWJsaW90aGVrIHZlcndlbmRldCB3ZXJkZW4sIGFiZXIgSlBHIG9kZXIgUE5HIHdpcmQgZsO8ciBrbGVpbmVyZSBEYXRlaWVuIHVuZCBiZXNzZXJlIERhcnN0ZWxsdW5nIGluIEUtTWFpbHMgZW1wZm9obGVuLicpOwogaWYoaXRlbS50eXBlPT09J2ltYWdlL2dpZicmJml0ZW0uYW5pbWF0ZWQpaGludChjYXJkLGFyZWE9PT0nZW1haWwnPydBbmltaWVydGVzIEdJRi4gRGllIEFuaW1hdGlvbiBmdW5rdGlvbmllcnRlIGluIHVuc2VyZW4gVGVzdHMgaW0gRS1NYWlsLUVkaXRvciwgZGllIFdpZWRlcmdhYmUgaW4gZGVuIEUtTWFpbC1Qcm9ncmFtbWVuIGRlciBFbXBmw6RuZ2VyIGlzdCBqZWRvY2ggdW50ZXJzY2hpZWRsaWNoLiBCZWhhbHRlbiBTaWUgZGllIE9yaWdpbmFsZGF0ZWksIHVtIGRpZSBBbmltYXRpb24genUgZXJoYWx0ZW4uJzonQW5pbWllcnRlcyBHSUYuIEJlaGFsdGVuIFNpZSBkaWUgT3JpZ2luYWxkYXRlaSwgdW0gZGllIEFuaW1hdGlvbiB6dSBlcmhhbHRlbi4nKTsKIGlmKGl0ZW0uc3ZnQXNzdW1lZCloaW50KGNhcmQsJ0RpZXNlIFNWRyBoYXQga2VpbmUgZmVzdGUgR3LDtsOfZSwgZGFoZXIgd3VyZGVuIDMwMCDDlyAxNTAgcHggYW5nZW5vbW1lbi4gV8OkaGxlbiBTaWUgYmVpbSBLb252ZXJ0aWVyZW4gZWluZSBlaWdlbmUgQnJlaXRlLicsJ3dhcm4nKTsKfQpmdW5jdGlvbiBjb250cm9sc0ZvcihjYXJkLGl0ZW0pewogY29uc3QgYz1lbCgnZGl2JywnY2lsLWNvbnRyb2xzJyksa2VlcD1pdGVtLnR5cGU9PT0naW1hZ2UvZ2lmJ3x8aXRlbS50eXBlPT09J2ltYWdlL2JtcCd8fChpdGVtLnR5cGU9PT0naW1hZ2UvcG5nJyYmaXRlbS5hbmltYXRlZCk7CiBjb25zdCBvdXRzPVtdO2lmKGtlZXApb3V0cy5wdXNoKFsnb3JpZ2luYWwnLCdPcmlnaW5hbCAnK3R5cGVMYWJlbChpdGVtLnR5cGUpKycgYmVoYWx0ZW4gKGtlaW5lIEtvbnZlcnRpZXJ1bmcpJ10pO2lmKCEoa2VlcCYmaXRlbS5hbmltYXRlZCkpb3V0cy5wdXNoKFsnYXV0bycsJ0F1dG9tYXRpc2NoIChlbXBmb2hsZW4pJ10pO291dHMucHVzaChbJ2ltYWdlL2pwZWcnLCdKUEcnXSxbJ2ltYWdlL3BuZycsJ1BORyddKTsKIGNvbnN0IG91dENvbD1lbCgnZGl2JywnY2lsLXN0YWNrJyk7b3V0Q29sLmFwcGVuZChmaWVsZCgnQXVzZ2FiZWZvcm1hdCcsc2VsZWN0KG91dHMsaXRlbS5vdXRwdXQsaXRlbS5pZCsnLW91dCcsdj0+Y2hhbmdlSXRlbShpdGVtLCdvdXRwdXQnLHYpKSkpO2MuYXBwZW5kKG91dENvbCk7CiBjb25zdCByZWM9c3VnZ2VzdGVkKGl0ZW0pLHNpemVzPVtbJ29yaWdpbmFsJywnT3JpZ2luYWxtYcOfZSBiZWhhbHRlbiddXTtpZihyZWMpc2l6ZXMucHVzaChbJ3JlY29tbWVuZGVkJyxpc0V4YWN0KGl0ZW0pPydHZW5hdSAnK3JlYysnIHB4JzonRW1wZm9obGVuZSBCcmVpdGUgKCcrcmVjKycgcHgpJ10pO3NpemVzLnB1c2goWydjdXN0b20nLGl0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJz8nRWlnZW5lIEJyZWl0ZSc6J0VpZ2VuZSBCcmVpdGUnXSk7CiB7Y29uc3QgZGY9ZmllbGQoJ0JpbGRtYcOfZScsc2VsZWN0KHNpemVzLHJlc2l6ZU1vZGUoaXRlbSksaXRlbS5pZCsnLXNpemUnLHY9PmNoYW5nZUl0ZW0oaXRlbSwncmVzaXplJyx2KSkpO2RmLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1oZWxwJyxpc0V4YWN0KGl0ZW0pJiZyZWM\/J0RpZXNlIFBsYXR6aWVydW5nIGJlbsO2dGlndCBnZW5hdSAnK3JlYysnIHB4LiBFaW5lIFZlcmdyw7bDn2VydW5nIGthbm4gZGFzIEJpbGQgdW5zY2hhcmYgbWFjaGVuLic6J0VpbiBzY2htYWxlcmVzIEJpbGQgdmVycmluZ2VydCBkaWUgRGF0ZWlncsO2w59lLiBFaW4gYnJlaXRlcmVzIEJpbGQga2FubiB1bnNjaGFyZiB3aXJrZW4uJykpO2MuYXBwZW5kKGRmKX0KIGlmKGl0ZW0ucmVzaXplPT09J2N1c3RvbScpe2NvbnN0IHc9ZWwoJ2lucHV0Jyk7dy50eXBlPSdudW1iZXInO3cubWluPScxJzt3Lm1heD1TdHJpbmcoTUFYX0lOUFVUX1dJRFRIKTt3LnN0ZXA9JzEnO3cuaW5wdXRNb2RlPSdudW1lcmljJzt3LnZhbHVlPVN0cmluZyhpdGVtLmN1c3RvbVdpZHRofHwnJyk7dy5kYXRhc2V0LmY9aXRlbS5pZCsnLXcnO3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+Y2hhbmdlSXRlbShpdGVtLCdjdXN0b21XaWR0aCcsdy52YWx1ZS50cmltKCk9PT0nJz8wOk51bWJlcih3LnZhbHVlKSkpO2MuYXBwZW5kKGZpZWxkKGl0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJz8nQnJlaXRlIChweCknOidCcmVpdGUgKHB4KScsdykpfQogaWYoIWl0ZW0uYW5pbWF0ZWQmJml0ZW0udHlwZSE9PSdpbWFnZS9zdmcreG1sJyl7Y29uc3QgdGY9ZWwoJ2RpdicsJ2NpbC1maWVsZCBjaWwtcmFuZ2UgY2lsLXRyYW5zcCcpLGxiPWVsKCdsYWJlbCcsJ2NpbC1jaGVjaycpLGNiPWVsKCdpbnB1dCcpO2NiLnR5cGU9J2NoZWNrYm94JztjYi5jaGVja2VkPSEhaXRlbS50cmFuc3A7Y2IuZGF0YXNldC5mPWl0ZW0uaWQrJy10cic7Y2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+Y2hhbmdlSXRlbShpdGVtLCd0cmFuc3AnLGNiLmNoZWNrZWQpKTtsYi5hcHBlbmQoY2IsZWwoJ3NwYW4nLG51bGwsJ0hpbnRlcmdydW5kIHRyYW5zcGFyZW50IG1hY2hlbicpKTt0Zi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtbGFiZWwnLCdIaW50ZXJncnVuZCcpLGxiLGVsKCdzcGFuJywnY2lsLWhlbHAnLCdGdW5rdGlvbmllcnQgYW0gYmVzdGVuIGJlaSBMb2dvcyB1bmQgR3JhZmlrZW4gbWl0IGVpbmZhcmJpZ2VtIEhpbnRlcmdydW5kLCB6dW0gQmVpc3BpZWwgV2Vpw58gaGludGVyIGVpbmVtIExvZ28uIERhcyBCaWxkIHdpcmQgYWxzIFBORyBnZXNwZWljaGVydC4nKSk7CiAgaWYoaXRlbS50cmFuc3Ape2NvbnN0IHE9ZWwoJ2lucHV0Jyksdj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ1RvbGVyYW56OiAnKyhpdGVtLnRvbHx8NDApKTtxLnR5cGU9J3JhbmdlJztxLm1pbj0nNSc7cS5tYXg9JzEyMCc7cS5zdGVwPScxJztxLnZhbHVlPVN0cmluZyhpdGVtLnRvbHx8NDApO3EuZGF0YXNldC5mPWl0ZW0uaWQrJy10b2wnO3EuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57di50ZXh0Q29udGVudD0nVG9sZXJhbno6ICcrcS52YWx1ZX0pO3EuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+Y2hhbmdlSXRlbShpdGVtLCd0b2wnLE51bWJlcihxLnZhbHVlKSkpO3RmLmFwcGVuZChxLHYsZWwoJ3NwYW4nLCdjaWwtaGVscCcsJ0VyaMO2aGVuIFNpZSBkZW4gV2VydCwgd2VubiBlaW4gaGVsbGVyIFJhbmQgb2RlciBTY2hhdHRlbiBibGVpYnQuIFNlbmtlbiBTaWUgaWhuLCB3ZW5uIFRlaWxlIGRlcyBCaWxkZXMgdmVyc2Nod2luZGVuLicpKX0KICBvdXRDb2wuYXBwZW5kKHRmKX0KIGNvbnN0IGFkdj1lbCgnZGl2JywnY2lsLWFkdi1ib2R5Jyk7bGV0IGFkdkVsPW51bGw7CiBpZihpdGVtLm91dHB1dD09PSdpbWFnZS9qcGVnJyl7Y29uc3QgcT1lbCgnaW5wdXQnKSxsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCBjaWwtcmFuZ2UnKSx2PWVsKCdzcGFuJywnY2lsLXNtYWxsJywnSlBHLVF1YWxpdMOkdDogJytpdGVtLnF1YWxpdHkrJyUnKTtxLnR5cGU9J3JhbmdlJztxLm1pbj0nNTAnO3EubWF4PSc5NSc7cS5zdGVwPScxJztxLnZhbHVlPVN0cmluZyhpdGVtLnF1YWxpdHkpO3EuZGF0YXNldC5mPWl0ZW0uaWQrJy1xJztxLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+e3YudGV4dENvbnRlbnQ9J0pQRy1RdWFsaXTDpHQ6ICcrcS52YWx1ZSsnJSd9KTtxLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCk9PmNoYW5nZUl0ZW0oaXRlbSwncXVhbGl0eScsTnVtYmVyKHEudmFsdWUpKSk7bC5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtbGFiZWwnLCdLb21wcmltaWVydW5nc3F1YWxpdMOkdCcpLHEsdixlbCgnc3BhbicsJ2NpbC1oZWxwJywnRWluIG5pZWRyaWdlcmVyIFdlcnQgZXJnaWJ0IGVpbmUga2xlaW5lcmUgRGF0ZWksIGFiZXIgd2VuaWdlciBEZXRhaWxzLiA3NeKAkzg1ICUgcGFzc2VuIGbDvHIgZGllIG1laXN0ZW4gRm90b3MuJykpO2Fkdi5hcHBlbmQobCl9CiBpZihDQU5fUVVBTlQmJihpdGVtLm91dHB1dD09PSdpbWFnZS9wbmcnfHxpdGVtLm91dHB1dD09PSdhdXRvJykmJiFpdGVtLmFuaW1hdGVkKWFkdi5hcHBlbmQoZmllbGQoaXRlbS5vdXRwdXQ9PT0nYXV0byc\/J1BORy1GYXJiZW4gKGJlaSBTcGVpY2hlcnVuZyBhbHMgUE5HKSc6J1BORy1GYXJiZW4nLHNlbGVjdChbWycyNTYnLCcyNTYgRmFyYmVuIChlbXBmb2hsZW4pJ10sWycxMjgnLCcxMjggRmFyYmVuJ10sWyc2NCcsJzY0IEZhcmJlbiddLFsnMzInLCczMiBGYXJiZW4nXSxbJzAnLCdBbGxlIEZhcmJlbiAodmVybHVzdGZyZWkpJ11dLFN0cmluZyhpdGVtLmNvbG91cnMpLGl0ZW0uaWQrJy1jb2wnLHY9PmNoYW5nZUl0ZW0oaXRlbSwnY29sb3VycycsTnVtYmVyKHYpKSkpKTsKIGlmKGFkdi5sYXN0Q2hpbGQmJmFkdi5sYXN0Q2hpbGQucXVlcnlTZWxlY3RvciYmYWR2Lmxhc3RDaGlsZC5xdWVyeVNlbGVjdG9yKCdzZWxlY3RbZGF0YS1mJD0iLWNvbCJdJykpYWR2Lmxhc3RDaGlsZC5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtaGVscCcsJ1dlbmlnZXIgRmFyYmVuIGVyZ2ViZW4gZWluZSBrbGVpbmVyZSBEYXRlaS4gV8OkaGxlbiBTaWUgQWxsZSBGYXJiZW4sIHdlbm4gVmVybMOkdWZlIHVuZ2xlaWNobcOkw59pZyBhdXNzZWhlbi4nKSk7CiBpZihhZHYuY2hpbGROb2Rlcy5sZW5ndGgpe2NvbnN0IGQ9ZWwoJ2RldGFpbHMnLCdjaWwtYWR2Jyk7aWYoaXRlbS5hZHZPcGVuKWQub3Blbj10cnVlO2QuYWRkRXZlbnRMaXN0ZW5lcigndG9nZ2xlJywoKT0+e2l0ZW0uYWR2T3Blbj1kLm9wZW59KTtkLmFwcGVuZChlbCgnc3VtbWFyeScsbnVsbCwnRXJ3ZWl0ZXJ0ZSBFaW5zdGVsbHVuZ2VuJyksZWwoJ3AnLCdjaWwtc21hbGwnLCdPcHRpb25hbC4gRGllIFN0YW5kYXJkZWluc3RlbGx1bmdlbiBwYXNzZW4gZsO8ciBkaWUgbWVpc3RlbiBCaWxkZXIuJyksYWR2KTthZHZFbD1kfQogY2FyZC5hcHBlbmQoYyk7CiBjb25zdCBvdXQ9b3V0VHlwZShpdGVtKTsKIGlmKCFvdXQpaGludChjYXJkLCdLZWluZSBLb252ZXJ0aWVydW5nIG7DtnRpZzogVmVyd2VuZGVuIFNpZSBJaHJlIE9yaWdpbmFsZGF0ZWkuJysoaXRlbS50eXBlPT09J2ltYWdlL2dpZic\/JyBCZWkgZGVyIEtvbnZlcnRpZXJ1bmcgZWluZXMgR0lGIGluIEpQRyBvZGVyIFBORyBibGVpYnQgbnVyIGVpbiBFaW56ZWxiaWxkIGVyaGFsdGVuLic6JycpKTsKIGlmKG91dD09PSdhdXRvJyloaW50KGNhcmQsJ0F1dG9tYXRpc2NoIHfDpGhsdCBQTkcgZsO8ciBCaWxkZXIgbWl0IFRyYW5zcGFyZW56IG9kZXIgd2VuaWdlbiBGYXJiZW4gdW5kIEpQRyBmw7xyIGFsbGVzIGFuZGVyZS4gRXMgZXJrZW5udCBuaWNodCwgd2FzIGRhcyBCaWxkIHplaWd0LCBwcsO8ZmVuIFNpZSBkYWhlciBkaWUgVm9yc2NoYXUuJyk7CiBpZihvdXQmJml0ZW0uYW5pbWF0ZWQpaGludChjYXJkLCdCZWkgZGVyIEtvbnZlcnRpZXJ1bmcgYmxlaWJ0IG51ciBkYXMgZXJzdGUgRWluemVsYmlsZCBlcmhhbHRlbi4gRGllIEFuaW1hdGlvbiBnZWh0IHZlcmxvcmVuLiBCZWhhbHRlbiBTaWUgZGllIE9yaWdpbmFsZGF0ZWksIHVtIGRpZSBBbmltYXRpb24genUgZXJoYWx0ZW4uJywnd2FybicpOwogaWYob3V0JiZpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcpaGludChjYXJkLCdEaWUgS29udmVydGllcnVuZyB2b24gU1ZHIGluIEpQRyBvZGVyIFBORyBlcnpldWd0IGVpbmUgUGl4ZWxncmFmaWsuIFRleHQgdW5kIEZvcm1lbiBsYXNzZW4gc2ljaCBkYW5uIG5pY2h0IG1laHIgdmVybHVzdGZyZWkgc2thbGllcmVuLicsJ3dhcm4nKTsKIGlmKG91dD09PSdpbWFnZS9qcGVnJyYmQUxQSEFfVFlQRVMuaW5jbHVkZXMoaXRlbS50eXBlKSloaW50KGNhcmQsJ0pQRyB1bnRlcnN0w7x0enQga2VpbmUgVHJhbnNwYXJlbnouIFRyYW5zcGFyZW50ZSBCZXJlaWNoZSB3ZXJkZW4gd2Vpw58uJyk7CiBpZihvdXQ9PT0naW1hZ2UvcG5nJyYmaXRlbS50eXBlPT09J2ltYWdlL2pwZWcnKWhpbnQoY2FyZCwnUE5HIGlzdCBiZWkgRm90b3MgbWVpc3QgZGV1dGxpY2ggZ3LDtsOfZXIgYWxzIEpQRy4nKTsKIGlmKGFkdkVsKWNhcmQuYXBwZW5kKGFkdkVsKTsKfQpmdW5jdGlvbiByZXN1bHRGb3IoY2FyZCxpdGVtKXsKIGNvbnN0IHI9aXRlbS5yZXN1bHQ7CiBpZihyLmtlcHRPcmlnaW5hbCl7aGludChjYXJkLCh0b29OYXJyb3coaXRlbSk\/J0RpZSBEYXRlaWdyw7bDn2UgaXN0IGJlcmVpdHMgZ3V0IG9wdGltaWVydCwgYWJlciBkYXMgQmlsZCBpc3Qgbm9jaCB6dSBzY2htYWwgKHNpZWhlIG9iZW4pLic6J0locmUgT3JpZ2luYWxkYXRlaSBpc3QgYmVyZWl0cyBndXQgb3B0aW1pZXJ0LicpKycgRGllIE9wdGltaWVydW5nIGhhdCBlaW5lIGdyw7bDn2VyZSBEYXRlaSBlcnpldWd0ICgnK2ZtdChyLnRyaWVkU2l6ZSkrJyksIHZlcndlbmRlbiBTaWUgZGFoZXIgd2VpdGVyIElocmUgT3JpZ2luYWxkYXRlaSAoJytmbXQoaXRlbS5maWxlLnNpemUpKycpLiBTaWUgaXN0IHRyb3R6ZGVtIGluIGRlciBaSVAtRGF0ZWkgZW50aGFsdGVuLicsdG9vTmFycm93KGl0ZW0pPyd3YXJuJzonc3VjY2VzcycpO3JldHVybn0KIGNvbnN0IGRlbHRhPSgxLXIuYmxvYi5zaXplL2l0ZW0uZmlsZS5zaXplKSoxMDAsYWNjZXB0ZWQ9Q01fQUNDRVBURUQuaW5jbHVkZXMoaXRlbS50eXBlKSYmIWl0ZW0ubWlzbWF0Y2g7CiBsZXQgdD0nT3B0aW1pZXJ0ZSBEYXRlaTogJytmbXQoci5ibG9iLnNpemUpKycgwrcgJytyLndpZHRoKycgw5cgJytyLmhlaWdodCsnIHB4IMK3ICcrdHlwZUxhYmVsKHIudHlwZSkrJyDCtyAnOwogaWYoTWF0aC5hYnMoZGVsdGEpPDAuNSl0Kz0nZXR3YSBzbyBncm\/DnyB3aWUgZGFzIE9yaWdpbmFsLic7ZWxzZSBpZihkZWx0YT4wKXQrPWRlbHRhLnRvRml4ZWQoMCkrJyUga2xlaW5lci4nO2Vsc2UgaWYoci53aWR0aCE9PWl0ZW0ud2lkdGgpdCs9TWF0aC5hYnMoZGVsdGEpLnRvRml4ZWQoMCkrJyUgZ3LDtsOfZXIsIGRhIGRhcyBCaWxkIGpldHp0IGRpZXNlIEJyZWl0ZSBoYXQ6ICcrci53aWR0aCsnIHB4Lic7ZWxzZSB0Kz1NYXRoLmFicyhkZWx0YSkudG9GaXhlZCgwKSsnJSBncsO2w59lci4nKyhhY2NlcHRlZD8nIERhcyBPcmlnaW5hbCBpc3Qga2xlaW5lciwgU2llIGvDtm5uZW4gZXMgc3RhdHRkZXNzZW4gYmVoYWx0ZW4uJzonJyk7CiBpZihyLnJlYXNvbil0Kz0nICcrci5yZWFzb247CiBpZihyLmJnTWl4ZWQpYmdIaW50KGNhcmQsci5iZ01peGVkKTsKIGNvbnN0IGVubD0hci5rZXB0T3JpZ2luYWwmJml0ZW0udHlwZSE9PSdpbWFnZS9zdmcreG1sJyYmaXRlbS53aWR0aDxyLndpZHRoKjAuOTsKIGlmKGVubCl7aGludChjYXJkLCdWZXJncsO2w59lcnRlcyBCaWxkOiBEaWVzZXMgQmlsZCB3dXJkZSB2b24gJytpdGVtLndpZHRoKycgcHggYXVmICcrci53aWR0aCsnIHB4IHZlcmdyw7bDn2VydCB1bmQgd2lya3QgZGFoZXIgd2VuaWdlciBzY2hhcmYuIFdpciBlbXBmZWhsZW4ga2VpbiB2ZXJncsO2w59lcnRlcyBCaWxkLiBWZXJ3ZW5kZW4gU2llIHN0YXR0ZGVzc2VuIGVpbiBncsO2w59lcmVzIEJpbGQgbWl0IG1pbmRlc3RlbnMgJytyLndpZHRoKycgcHggQnJlaXRlLiBWZXJncsO2w59lcnRlIERhdGVpOiAnK2ZtdChyLmJsb2Iuc2l6ZSkrJyDCtyAnK3Iud2lkdGgrJyDDlyAnK3IuaGVpZ2h0KycgcHggwrcgJyt0eXBlTGFiZWwoci50eXBlKSsnLicsJ2FsZXJ0Jyk7cmV0dXJufQogaWYoIXIua2VwdE9yaWdpbmFsKXtpZihyLmJsb2Iuc2l6ZT5NQiYmIS9sb3dlciB0aGUgSlBHIHF1YWxpdHkvLnRlc3QodCkpdCs9JyBEaWUgRGF0ZWkgaXN0IG5vY2ggcmVsYXRpdiBncm\/DnyAoJytmbXQoci5ibG9iLnNpemUpKycpLiBTZW5rZW4gU2llIGRpZSBKUEctUXVhbGl0w6R0IHVudGVyIEVyd2VpdGVydGUgRWluc3RlbGx1bmdlbiBvZGVyIHfDpGhsZW4gU2llIGVpbmUga2xlaW5lcmUgQnJlaXRlLic7ZWxzZSBpZihyLmJsb2Iuc2l6ZT41MDAqS0ImJnIuYmxvYi5zaXplPD1NQil0Kz0nIERpZSBEYXRlaSBpc3Qgbm9jaCByZWNodCBncm\/DnyAoJytmbXQoci5ibG9iLnNpemUpKycpLiBTaWUga8O2bm5lbiBkaWUgSlBHLVF1YWxpdMOkdCB1bnRlciBFcndlaXRlcnRlIEVpbnN0ZWxsdW5nZW4gc2Vua2VuLid9CiBjb25zdCBsdlI9bGV2ZWwoaXRlbSk7aGludChjYXJkLHQsci5rZXB0T3JpZ2luYWw\/KGRlbHRhPj0wfHwhYWNjZXB0ZWQ\/J3N1Y2Nlc3MnOid3YXJuJyk6bHZSPj0zPydhbGVydCc6bHZSPj0yPyd3YXJuJzonc3VjY2VzcycpOwp9CmZ1bmN0aW9uIHByZXZpZXdGb3IoY2FyZCxpdGVtKXsKIGNvbnN0IHI9aXRlbS5yZXN1bHQsd3JhcD1lbCgnZGl2JywnY2lsLWNvbXBhcmUnKSx2aWV3cz1bXSxiYXI9ZWwoJ2RpdicsJ2NpbC1hY3Rpb25zJyk7CiBjb25zdCBwYW5lPSh0aXRsZSxrZXksYmxvYixtZXRhKT0+e2NvbnN0IGY9ZWwoJ2ZpZ3VyZScsJ2NpbC1wYW5lJyksdj1lbCgnZGl2JywnY2lsLXZpZXcnKTtpZihpdGVtLmFjdHVhbCl2LmRhdGFzZXQuYWN0dWFsPScxJztpZihibG9iKXsvKiByZXVzZSB0aGUgc2FtZSBpbWcgZWxlbWVudCBiZXR3ZWVuIHJlbmRlcnMgc28gdGhlIHByZXZpZXcgZG9lcyBub3QgZmxpY2tlciAqL2l0ZW0uX2ltcz1pdGVtLl9pbXN8fHt9O2NvbnN0IGM9aXRlbS5faW1zW2tleV07bGV0IGltO2lmKGMmJmMuYmxvYj09PWJsb2Ipe2ltPWMuaW19ZWxzZXtpbT1lbCgnaW1nJyk7aW0uYWx0PXRpdGxlKyc6ICcrKGl0ZW0uZmlsZS5uYW1lfHwnaW1hZ2UnKTtpbS5vbmVycm9yPSgpPT57aWYoaW0uZGF0YXNldC5mYilyZXR1cm47aW0uZGF0YXNldC5mYj0nMSc7LyogYmxvYjogYmxvY2tlZCBieSB0aGUgc2l0ZSBzZWN1cml0eSBwb2xpY3k6IHVzZSBhIGRhdGEgVVJMIGluc3RlYWQgKi9jb25zdCByPW5ldyBGaWxlUmVhZGVyKCk7ci5vbmxvYWQ9KCk9PntpbS5zcmM9ci5yZXN1bHR9O3IucmVhZEFzRGF0YVVSTChibG9iKX07aW0uc3JjPW9ialVybChpdGVtLGtleSxibG9iKTtpdGVtLl9pbXNba2V5XT17YmxvYixpbX19di5hcHBlbmQoaW0pfWVsc2Ugdi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCdPcHRpbWllcmVuIFNpZSBkYXMgQmlsZCwgdW0gZGFzIEVyZ2VibmlzIGhpZXIgenUgc2VoZW4uJykpO2YuYXBwZW5kKHYsZWwoJ2ZpZ2NhcHRpb24nLG51bGwsbWV0YT90aXRsZSsnIMK3ICcrbWV0YTp0aXRsZSkpO3ZpZXdzLnB1c2godik7cmV0dXJuIGZ9OwogY29uc3QgcGlja0Jhcj1pdGVtLnJlc3VsdCYmIWl0ZW0ucmVzdWx0LmtlcHRPcmlnaW5hbCYmIWl0ZW0uZWRpdGluZz8oKCk9Pntjb25zdCBwYj1lbCgnZGl2JywnY2lsLXBpY2tiYXInKTtwYi5hcHBlbmQoYnV0dG9uKCdIZXJ1bnRlcmxhZGVuOiAnK3R5cGVMYWJlbChpdGVtLnJlc3VsdC50eXBlKSwoKT0+e3RyYWNrKCdkb3dubG9hZCcpO2Rvd25sb2FkKGl0ZW0ucmVzdWx0LmJsb2IsaXRlbS5yZXN1bHQubmFtZSl9LCcnLGl0ZW0uaWQrJy1kbCcpKTtpZihpdGVtLnRyYW5zcClwYi5hcHBlbmQoYnV0dG9uKCdIaW50ZXJncnVuZCBtYW51ZWxsIGJlYXJiZWl0ZW4nLCgpPT5vcGVuRWRpdG9yKGl0ZW0pLCdjaWwtYnRuLXNlY29uZGFyeScsaXRlbS5pZCsnLWVkaXQnKSk7aWYoKGl0ZW0uY2xpY2tzfHxbXSkubGVuZ3RoKXtjb25zdCBycz1lbCgnYnV0dG9uJywnY2lsLWJ0bi10ZXh0JywnTWFudWVsbGUgw4RuZGVydW5nZW4gcsO8Y2tnw6RuZ2lnIG1hY2hlbicpO3JzLnR5cGU9J2J1dHRvbic7cnMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57aXRlbS5jbGlja3M9W107b3B0aW1pc2UoaXRlbSl9KTtwYi5hcHBlbmQocnMpfXJldHVybiBwYn0pKCk6bnVsbDsKIHdyYXAuYXBwZW5kKHBhbmUoJ09yaWdpbmFsJywnb3JpZycsaXRlbS5maWxlLGZtdChpdGVtLmZpbGUuc2l6ZSkrJyDCtyAnK2l0ZW0ud2lkdGgrJyDDlyAnK2l0ZW0uaGVpZ2h0KycgcHgnKSxwYW5lKHImJnIua2VwdE9yaWdpbmFsPydPcmlnaW5hbCBiZWhhbHRlbic6J09wdGltaWVydCcsJ3Jlcycscj9yLmJsb2I6bnVsbCxyP2ZtdChyLmJsb2Iuc2l6ZSkrJyDCtyAnK3Iud2lkdGgrJyDDlyAnK3IuaGVpZ2h0KycgcHgnOicnKSk7CiBsZXQgbG9jaz1mYWxzZTt2aWV3cy5mb3JFYWNoKHY9PnYuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywoKT0+e2lmKGxvY2spcmV0dXJuO2xvY2s9dHJ1ZTtjb25zdCBvPXZpZXdzW3ZpZXdzWzBdPT09dj8xOjBdLGZ4PXYuc2Nyb2xsTGVmdC9NYXRoLm1heCgxLHYuc2Nyb2xsV2lkdGgtdi5jbGllbnRXaWR0aCksZnk9di5zY3JvbGxUb3AvTWF0aC5tYXgoMSx2LnNjcm9sbEhlaWdodC12LmNsaWVudEhlaWdodCk7by5zY3JvbGxMZWZ0PWZ4KihvLnNjcm9sbFdpZHRoLW8uY2xpZW50V2lkdGgpO28uc2Nyb2xsVG9wPWZ5KihvLnNjcm9sbEhlaWdodC1vLmNsaWVudEhlaWdodCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bG9jaz1mYWxzZX0pfSkpOwogYmFyLmFwcGVuZChidXR0b24oaXRlbS5hY3R1YWw\/J0FuIFJhaG1lbiBhbnBhc3Nlbic6J0luIE9yaWdpbmFsZ3LDtsOfZSBhbnplaWdlbicsKCk9PntpdGVtLmFjdHVhbD0haXRlbS5hY3R1YWw7cmVuZGVyKCl9LCdjaWwtYnRuLXRleHQnLGl0ZW0uaWQrJy16b29tJyksZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCdQcsO8ZmVuIFNpZSBEZXRhaWxzLCBUZXh0IHVuZCBLYW50ZW4gaW4gT3JpZ2luYWxncsO2w59lLicpKTsKIGNhcmQuYXBwZW5kKGJhcix3cmFwKTtpZihpdGVtLmVkaXRpbmcpY2FyZC5hcHBlbmQoZWRpdG9yRm9yKGl0ZW0pKTsKfQpmdW5jdGlvbiB3ZWJzaXRlRmllbGRzKGl0ZW0pewogY29uc3QgZz1lbCgnZGl2JywnY2lsLWdyaWQnKSxwPWl0ZW0ud1BsYWNlbWVudDsKIGcuYXBwZW5kKGZpZWxkSGVscCgnUGxhdHppZXJ1bmcnLHNlbGVjdChbWydub25lJywnTmljaHQgYXVzZ2V3w6RobHQnXSxbJ2hlYWRlcicsJ0hlYWRlciddLFsnYmFja2dyb3VuZCcsJ0hpbnRlcmdydW5kIGltIEJlcmVpY2gnXSxbJ3NlY3Rpb24nLCdCaWxkIGltIEJlcmVpY2gnXSxbJ2NvbHVtbnMnLCdCaWxkIGluIFNwYWx0ZSddLFsnY3VzdG9tJywnRWlnZW5lIEJyZWl0ZSddLFsnb3RoZXInLCdBbmRlcmVzIEJpbGQnXV0scCxpdGVtLmlkKyctd3AnLHY9PmNoYW5nZUl0ZW0oaXRlbSwnd1BsYWNlbWVudCcsdikpLCdIZWFkZXIgdW5kIEhpbnRlcmdydW5kIGltIEJlcmVpY2ggYmVuw7Z0aWdlbiBnZW5hdSBkaWUgQnJlaXRlLCBkaWUgenUgSWhyZW0gVGhlbWUgdW5kIElocmVyIEJpbGRzY2hpcm1ncsO2w59lIHBhc3N0LiBFaW4gSGVhZGVyLUJpbGQgcGFzc3Qgc2ljaCBkZXIgQmlsZHNjaGlybWJyZWl0ZSBhbi4gRWluIEhpbnRlcmdydW5kYmlsZCBpbiBlaW5lbSBCZXJlaWNoIHdpcmQgbmljaHQgc2thbGllcnQsIGRhaGVyIHdpcmQgYXVmIHNjaG1hbGVyZW4gQmlsZHNjaGlybWVuIGRpZSByZWNodGUgU2VpdGUgYWJnZXNjaG5pdHRlbi4gUGxhdHppZXJlbiBTaWUgd2ljaHRpZ2UgSW5oYWx0ZSBpbSBsaW5rZW4gVGVpbCBkZXMgQmlsZGVzLiBCaWxkIGltIEJlcmVpY2ggaXN0IGVpbiBCaWxkIGRpcmVrdCBpbiBlaW5lbSBCZXJlaWNoLCBvaG5lIFNwYWx0ZW4uIEJpbGQgaW0gQmVyZWljaCB1bmQgQmlsZCBpbiBTcGFsdGUgaGFiZW4gZWluZSBlbXBmb2hsZW5lIEJyZWl0ZSwgZGFtaXQgc2ljaCBkaWUgQmlsZGVyIGF1c3JpY2h0ZW4uIFdlbm4gU2llIGRpZSBTcGFsdGVuYnJlaXRlbiBnZcOkbmRlcnQgaGFiZW4sIHfDpGhsZW4gU2llIEVpZ2VuZSBCcmVpdGUuJywnd3AtJytpdGVtLmlkKSk7CiBpZihXRUJTSVRFW3BdKXtnLmFwcGVuZChmaWVsZCgnVGhlbWUnLHNlbGVjdChbWydhJywnU3RhbmRhcmQgQSddLFsnYicsJ1N0YW5kYXJkIEInXSxbJ2MnLCdTdGFuZGFyZCBDJ11dLGl0ZW0ud1RoZW1lLGl0ZW0uaWQrJy13dCcsdj0+Y2hhbmdlSXRlbShpdGVtLCd3VGhlbWUnLHYpKSkpOwogIGlmKHAhPT0nc2VjdGlvbicpZy5hcHBlbmQoZmllbGQoKHA9PT0nYmFja2dyb3VuZCd8fHA9PT0naGVhZGVyJyk\/J0dlcsOkdCc6J1NwYWx0ZW4nLHNlbGVjdCgoKHA9PT0nYmFja2dyb3VuZCd8fHA9PT0naGVhZGVyJyk\/WydEZXNrdG9wJywnVGFibGV0JywnTW9iaWwnXTpbJ0VpbmUgU3BhbHRlJywnWndlaSBTcGFsdGVuJywnRHJlaSBTcGFsdGVuJ10pLm1hcCgoeCxpKT0+W1N0cmluZyhpKSx4XSksaXRlbS53VmFyaWFudCxpdGVtLmlkKyctd3YnLHY9PmNoYW5nZUl0ZW0oaXRlbSwnd1ZhcmlhbnQnLHYpKSkpfQogaWYocD09PSdjdXN0b20nKXtnLmFwcGVuZCh3aWR0aEZpZWxkKGl0ZW0sJ3NpdGVXaWR0aCcsJ0JpbGRicmVpdGUgYXVmIElocmVyIFdlYnNpdGUnKSk7aWYoaXRlbS5zaXRlV2lkdGhVbml0PT09JyUnKXtjb25zdCBmPWZpZWxkKCdCcmVpdGUgZGVzIEJlcmVpY2hzIG9kZXIgZGVyIFNwYWx0ZSAocHgpJyxudW1JbnB1dChpdGVtLCdzaXRlQmFzZScsTUFYX0lOUFVUX1dJRFRILCdlLmcuIDExNDAnKSkscHg9c3VnZ2VzdGVkKGl0ZW0pO2YuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJyxweD8nPSAnK3B4KycgcHguJzonRGVyIFByb3plbnR3ZXJ0IHdpcmQgYXVzIGRpZXNlciBCcmVpdGUgYmVyZWNobmV0LicpKTtnLmFwcGVuZChmKX19CiBpZihwPT09J2hlYWRlcicpZy5hcHBlbmQoZWwoJ3AnLCdjaWwtaGVscCBjaWwtcGxhY2VtZW50LW5vdGUnLCdWZXJ3ZW5kZW4gU2llIGRpZSBlbXBmb2hsZW5lIEJyZWl0ZS4gRWluIEhlYWRlci1CaWxkIHBhc3N0IHNpY2ggZGVyIEJpbGRzY2hpcm1icmVpdGUgYW4uJykpOwogaWYocD09PSdiYWNrZ3JvdW5kJylnLmFwcGVuZChlbCgncCcsJ2NpbC1oZWxwIGNpbC1wbGFjZW1lbnQtbm90ZScsJ0VpbiBIaW50ZXJncnVuZGJpbGQgaW4gZWluZW0gQmVyZWljaCB3aXJkIG5pY2h0IHNrYWxpZXJ0LiBFcyB3aXJkIGluIHNlaW5lciBlaWdlbmVuIEdyw7bDn2UgYWIgZGVtIGxpbmtlbiBSYW5kIGFuZ2V6ZWlndCwgZGFoZXIgd2lyZCBhdWYgQmlsZHNjaGlybWVuLCBkaWUgc2NobWFsZXIgYWxzIGRpZSBlbXBmb2hsZW5lIEJyZWl0ZSBzaW5kLCBkaWUgcmVjaHRlIFNlaXRlIGFiZ2VzY2huaXR0ZW4uIERpZSBlbXBmb2hsZW5lbiBCcmVpdGVuIHBhc3NlbiB6dW0gYnJlaXRlc3RlbiBCaWxkc2NoaXJtIGplZGVyIEdydXBwZTogRGVza3RvcCwgVGFibGV0IHVuZCBNb2JpbC4gUGxhdHppZXJlbiBTaWUgd2ljaHRpZ2UgSW5oYWx0ZSBpbSBsaW5rZW4gVGVpbCBkZXMgQmlsZGVzLicpKTsKIHJldHVybiBnOwp9CmZ1bmN0aW9uIG51bUlucHV0KGl0ZW0scHJvcCxtYXgscGgpe2NvbnN0IHc9ZWwoJ2lucHV0Jyk7dy50eXBlPSdudW1iZXInO3cubWluPScxJzt3Lm1heD1TdHJpbmcobWF4KTt3LnN0ZXA9JzEnO3cuaW5wdXRNb2RlPSdudW1lcmljJzt3LnBsYWNlaG9sZGVyPXBoO3cudmFsdWU9aXRlbVtwcm9wXT9TdHJpbmcoaXRlbVtwcm9wXSk6Jyc7dy5pZD0nY2lsLScraXRlbS5pZCsnLScrcHJvcDt3LmRhdGFzZXQuZj1pdGVtLmlkKyctJytwcm9wO3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+e2NvbnN0IG49TnVtYmVyKHcudmFsdWUpO2NoYW5nZUl0ZW0oaXRlbSxwcm9wLE51bWJlci5pc0ludGVnZXIobikmJm4+PTEmJm48PW1heD9uOjApfSk7cmV0dXJuIHd9CmZ1bmN0aW9uIHdpZHRoRmllbGQoaXRlbSxwcm9wLGxhYmVsKXsKIGNvbnN0IHVuaXQ9aXRlbVtwcm9wKydFaW5oZWl0J10scGN0PXVuaXQ9PT0nJScsZj1lbCgnZGl2JywnY2lsLWZpZWxkJyksbD1lbCgnbGFiZWwnLCdjaWwtbGFiZWwnLGxhYmVsKSxyb3c9ZWwoJ2RpdicsJ2NpbC11bml0cm93Jyk7CiBjb25zdCB3PW51bUlucHV0KGl0ZW0scHJvcCxwY3Q\/MTAwOk1BWF9JTlBVVF9XSURUSCxwY3Q\/J2UuZy4gNTAnOidlLmcuIDQwMCcpO2wuaHRtbEZvcj13LmlkOwogY29uc3QgdT1zZWxlY3QoW1sncHgnLCdweCddLFsnJScsJyUnXV0sdW5pdCxpdGVtLmlkKyctJytwcm9wKyctdW5pdCcsdj0+e2l0ZW1bcHJvcF09MDtjaGFuZ2VJdGVtKGl0ZW0scHJvcCsnRWluaGVpdCcsdil9KTt1LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ0VpbmhlaXQnKTsKIHJvdy5hcHBlbmQodyx1KTtmLmFwcGVuZChsLHJvdyk7CiBjb25zdCBweD1zdWdnZXN0ZWQoaXRlbSk7CiBpZihwY3QmJnByb3A9PT0nbGF5b3V0V2lkdGgnKWYuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJyxweD8nPSAnK3B4KycgcHggZGVyIFN0YW5kYXJkYnJlaXRlIHZvbiA2MDAgcHggZsO8ciBFLU1haWxzLic6J1Byb3plbnQgZGVyIFN0YW5kYXJkYnJlaXRlIHZvbiA2MDAgcHggZsO8ciBFLU1haWxzLicpKTsKIGVsc2UgaWYoIXBjdClmLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1zbWFsbCcscHJvcD09PSdsYXlvdXRXaWR0aCc\/J1ZlcndlbmRlbiBTaWUgZGllcywgd2VubiBTaWUgZGllIFNwYWx0ZW4tIG9kZXIgQmlsZGJyZWl0ZSBnZcOkbmRlcnQgaGFiZW4uJzonVmVyd2VuZGVuIFNpZSBkaWVzLCB3ZW5uIFNpZSBlaW5lIGJlc3RpbW10ZSBCcmVpdGUgZsO8ciBkYXMgQmlsZCBvZGVyIGRpZSBTcGFsdGUgZmVzdGdlbGVndCBoYWJlbi4nKSk7CiByZXR1cm4gZjsKfQpmdW5jdGlvbiBlbWFpbEZpZWxkcyhpdGVtKXsKIGNvbnN0IGc9ZWwoJ2RpdicsJ2NpbC1ncmlkJyk7CiBnLmFwcGVuZChmaWVsZCgnUGxhdHppZXJ1bmcgKG9wdGlvbmFsKScsc2VsZWN0KFtbJzEnLCdFaW5lIFNwYWx0ZSddLFsnMicsJ1p3ZWkgU3BhbHRlbiddLFsnMycsJ0RyZWkgU3BhbHRlbiddLFsnY3VzdG9tJywnRWlnZW5lIEJyZWl0ZSddXSxpdGVtLmxheW91dCxpdGVtLmlkKyctbGF5b3V0Jyx2PT5jaGFuZ2VJdGVtKGl0ZW0sJ2xheW91dCcsdikpKSk7CiBpZihpdGVtLmxheW91dD09PSdjdXN0b20nKWcuYXBwZW5kKHdpZHRoRmllbGQoaXRlbSwnbGF5b3V0V2lkdGgnLCdCaWxkYnJlaXRlIGluIElocmVyIEUtTWFpbCcpKTsKIHJldHVybiBnOwp9CmZ1bmN0aW9uIHVybEJvZHkoY2FyZCxpdGVtKXsKIGNvbnN0IHJlYz1zdWdnZXN0ZWQoaXRlbSk7bGV0IHQ9Jyc7CiBpZihyZWMmJmlzRXhhY3QoaXRlbSkpe2lmKGl0ZW0ud2lkdGg9PT1yZWMpdD0nUmljaHRpZ2UgQnJlaXRlOiBEaWVzZSBQbGF0emllcnVuZyBiZW7DtnRpZ3QgJytyZWMrJyBweCwgdW5kIGRpZXNlcyBCaWxkIGlzdCAnK2l0ZW0ud2lkdGgrJyBweCBicmVpdC4nO2Vsc2V7aGludChjYXJkLCdGYWxzY2hlIEJyZWl0ZSBmw7xyIGRpZXNlIFBsYXR6aWVydW5nOiBEaWVzZXMgQmlsZCBpc3QgJytpdGVtLndpZHRoKycgcHggYnJlaXQsIHVuZCBkaWVzZSBQbGF0emllcnVuZyBiZW7DtnRpZ3QgZ2VuYXUgJytyZWMrJyBweC4gWnUgc2NobWFsZSBvZGVyIHp1IGJyZWl0ZSBCaWxkZXIgd2VyZGVuIGltIFdlYnNpdGUtRGVzaWduZXIgbcO2Z2xpY2hlcndlaXNlIG5pY2h0IHdpZSBnZXfDvG5zY2h0IGFuZ2V6ZWlndC4gJysoaXRlbS53aWR0aDxyZWMqMC45PydWZXJ3ZW5kZW4gU2llIGVpbiBncsO2w59lcmVzIEJpbGQgbWl0IG1pbmRlc3RlbnMgJytyZWMrJyBweCBicmVpdC4nOidTcGVpY2hlcm4gU2llIGRhcyBCaWxkIGF1ZiBJaHJlbSBDb21wdXRlciwgZsO8Z2VuIFNpZSBlcyBhbHMgRGF0ZWkgaGluenUgdW5kIHfDpGhsZW4gU2llIEdlbmF1ICcrcmVjKycgcHguJyksJ3dhcm4nKX19CiBlbHNlIGlmKHJlYyl7dD0oaXNDdXN0b21XaWR0aChpdGVtKT8nSWhyZSBCaWxkYnJlaXRlOiAnK3JlYysnIHB4LiAnOidFbXBmb2hsZW5lIEJpbGRicmVpdGU6IGV0d2EgJytyZWMrJyBweC4gJyk7dCs9aXRlbS53aWR0aDxyZWM\/J0RpZXNlcyBCaWxkIGlzdCBzY2htYWxlciBhbHMgZGllIGVtcGZvaGxlbmUgQnJlaXRlIHVuZCBrYW5uIHdlbmlnZXIgc2NoYXJmIHdpcmtlbi4nOml0ZW0ud2lkdGg+cmVjKjI\/J0RpZXNlcyBCaWxkIGlzdCB2aWVsIGJyZWl0ZXIgYWxzIG7DtnRpZy4gRWluZSBrbGVpbmVyZSBWZXJzaW9uIHfDvHJkZSBzY2huZWxsZXIgbGFkZW4uJzonRGllIEJyZWl0ZSBzaWVodCBwYXNzZW5kIGF1cy4nfQogZWxzZSBpZihpc0N1c3RvbVdpZHRoKGl0ZW0pKXQ9J0dlYmVuIFNpZSBkaWUgQmlsZGJyZWl0ZSBpbiBweCBlaW4sIHVtIHNpZSBtaXQgZGllc2VtIEJpbGQgenUgdmVyZ2xlaWNoZW4uJzsKIGVsc2UgaWYoYXJlYT09PSd3ZWJzaXRlJyYmaXRlbS53UGxhY2VtZW50PT09J25vbmUnKXQ9J1fDpGhsZW4gU2llIGVpbmUgUGxhdHppZXJ1bmcsIHVtIGVpbmUgZW1wZm9obGVuZSBCcmVpdGUgenUgc2VoZW4uJzsKIGlmKHQpaGludChjYXJkLHQpOwogaWYoaXRlbS50eXBlJiYhQ01fQUNDRVBURUQuaW5jbHVkZXMoaXRlbS50eXBlKSloaW50KGNhcmQsdHlwZUxhYmVsKGl0ZW0udHlwZSkrJy1EYXRlaWVuIGvDtm5uZW4gbmljaHQgaW4gZGllIE1lZGllbmJpYmxpb3RoZWsgdm9uIENvbmZlcmVuY2UgTWFuYWdlciBob2NoZ2VsYWRlbiB3ZXJkZW4uJysoYXJlYT09PSdlbWFpbCc\/JyDDnGJlciBCaWxkIChVUkwpIHdlcmRlbiBzaWUgbcO2Z2xpY2hlcndlaXNlIG5pY2h0IGJlaSBhbGxlbiBFbXBmw6RuZ2VybiBhbmdlemVpZ3QuJzonJyksJ3dhcm4nKTsKIGlmKCFpdGVtLnR5cGUpaGludChjYXJkLCdEYXMgRm9ybWF0IGtvbm50ZSBhdXMgZGVyIFVSTCBuaWNodCBlcm1pdHRlbHQgd2VyZGVuLicpOwogaWYoaXRlbS5maWxlLnNpemU+NTAwKktCKWhpbnQoY2FyZCxpdGVtLmZpbGUuc2l6ZT5NQj8nRGllIERhdGVpIGlzdCBncsO2w59lciBhbHMgMSBNQi4gRXJ3w6RnZW4gU2llIGVpbmUgT3B0aW1pZXJ1bmcuJzonRXJ3w6RnZW4gU2llLCBkaWVzZSByZWxhdGl2IGdyb8OfZSBEYXRlaSB6dSB2ZXJrbGVpbmVybi4nLGl0ZW0uZmlsZS5zaXplPk1CPyd3YXJuJzonJyk7CiBlbHNlIGlmKCFpdGVtLmZpbGUuc2l6ZSloaW50KGNhcmQsJ0RpZSBEYXRlaWdyw7bDn2Uga2FubiBuaWNodCBnZWxlc2VuIHdlcmRlbiwgd2VpbCBkaWUgV2Vic2l0ZSwgYXVmIGRlciBkYXMgQmlsZCBsaWVndCwgZGllcyBuaWNodCBlcmxhdWJ0LiBVbSBkaWUgRGF0ZWlncsO2w59lIHp1IHByw7xmZW4gb2RlciBkYXMgQmlsZCB6dSBrb252ZXJ0aWVyZW4sIHNwZWljaGVybiBTaWUgZXMgYXVmIElocmVtIENvbXB1dGVyIHVuZCBmw7xnZW4gU2llIGVzIG9iZW4gaGluenUuJywnd2FybicpOwogY29uc3Qgdj1lbCgnZGl2JywnY2lsLXZpZXcnKSxpbT1lbCgnaW1nJyk7aW0uYWx0PSdWb3JzY2hhdTogJytpdGVtLmZpbGUubmFtZTtpbS5yZWZlcnJlclBvbGljeT0nbm8tcmVmZXJyZXInO2ltLnNyYz1pdGVtLnNyY1VybDt2LnN0eWxlLmhlaWdodD0nMTgwcHgnO3YuYXBwZW5kKGltKTtjYXJkLmFwcGVuZCh2KTsKfQphc3luYyBmdW5jdGlvbiBjaGVja1VybChyYXcpewogbGV0IHU7dHJ5e3U9bmV3IFVSTChyYXcpfWNhdGNoKGUpe3U9bnVsbH0KIGlmKCF1fHwhL15odHRwcz86JC8udGVzdCh1LnByb3RvY29sKSl7c3RhdHVzKCdHZWJlbiBTaWUgZWluZSB2b2xsc3TDpG5kaWdlIEJpbGQtVVJMIGVpbiwgZGllIG1pdCBodHRwczovLyBiZWdpbm50Jyk7JCgnY2lsLXVybCcpLmZvY3VzKCk7cmV0dXJufQogaWYoaXRlbXMuc29tZShpPT5pLnNyY1VybD09PXUuaHJlZikpe3N0YXR1cygnRGllc2VzIEJpbGQgaXN0IGJlcmVpdHMgaW4gZGVyIExpc3RlLicpO3JldHVybn0KIGNvbnN0IGJ0bj0kKCdjaWwtdXJsLWJ0bicpO2J0bi5kaXNhYmxlZD10cnVlO2J0bi50ZXh0Q29udGVudD0nV2lyZCBoaW56dWdlZsO8Z3TigKYnO3RyYWNrKCd1cmwnKTtzdGF0dXMoJ0JpbGQgd2lyZCBnZXByw7xmdOKApicpOwogbGV0IG5hbWU9J2ltYWdlJzt0cnl7bmFtZT1kZWNvZGVVUklDb21wb25lbnQodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpfHwnJyl8fHUuaG9zdG5hbWV9Y2F0Y2goZSl7bmFtZT11Lmhvc3RuYW1lfW5hbWU9bmFtZS5zbGljZSgwLDE1MCk7CiB0cnl7CiAgdHJ5ewogICBjb25zdCBjdGw9bmV3IEFib3J0Q29udHJvbGxlcigpLHRtPXNldFRpbWVvdXQoKCk9PmN0bC5hYm9ydCgpLDE1MDAwKTsKICAgY29uc3Qgcj1hd2FpdCBmZXRjaCh1LmhyZWYse21vZGU6J2NvcnMnLGNyZWRlbnRpYWxzOidvbWl0JyxyZWZlcnJlclBvbGljeTonbm8tcmVmZXJyZXInLHNpZ25hbDpjdGwuc2lnbmFsfSk7Y2xlYXJUaW1lb3V0KHRtKTsKICAgaWYoci5vayl7Y29uc3QgYmxvYj1hd2FpdCByLmJsb2IoKTtjb25zdCBiZWZvcmU9aXRlbXMubGVuZ3RoO2F3YWl0IGFkZEZpbGVzKFtuZXcgRmlsZShbYmxvYl0sbmFtZSx7dHlwZTpibG9iLnR5cGUsbGFzdE1vZGlmaWVkOjB9KV0pO2lmKGl0ZW1zLmxlbmd0aD5iZWZvcmUpe2l0ZW1zW2l0ZW1zLmxlbmd0aC0xXS5zcmNVcmw9dS5ocmVmOyQoJ2NpbC11cmwnKS52YWx1ZT0nJztzdGF0dXMoJ0JpbGQgYXVzIGRlciBVUkwgZ2VsYWRlbi4gRGF0ZWlncsO2w59lLCBGb3JtYXQgdW5kIEtvbnZlcnRpZXJ1bmcgc2luZCB2ZXJmw7xnYmFyLicpfXJldHVybn0KICB9Y2F0Y2goZSl7fQogIGNvbnN0IGltZz1hd2FpdCBuZXcgUHJvbWlzZSgocmVzLHJlaik9Pntjb25zdCBpbT1uZXcgSW1hZ2UoKSx0bT1zZXRUaW1lb3V0KCgpPT5yZWooRXJyb3IoJ3RpbWVvdXQnKSksMTUwMDApO2ltLnJlZmVycmVyUG9saWN5PSduby1yZWZlcnJlcic7aW0ub25sb2FkPSgpPT57Y2xlYXJUaW1lb3V0KHRtKTtyZXMoaW0pfTtpbS5vbmVycm9yPSgpPT57Y2xlYXJUaW1lb3V0KHRtKTtyZWooRXJyb3IoJ2xvYWQnKSl9O2ltLnNyYz11LmhyZWZ9KTsKICBjb25zdCB0eXBlPUVYVF9UWVBFW2V4dE9mKHUucGF0aG5hbWUpXXx8Jyc7bGV0IHNpemU9MDsKICB0cnl7Y29uc3QgZW49cGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSh1LmhyZWYpLnBvcCgpO3NpemU9ZW4\/KGVuLmVuY29kZWRCb2R5U2l6ZXx8MCk6MH1jYXRjaChlKXt9CiAgaXRlbXMucHVzaCh7aWQ6c2VyaWFsKyssa2V5Oid1cmw6Jyt1LmhyZWYsc3JjVXJsOnUuaHJlZix1cmxPbmx5OnRydWUsZmlsZTp7bmFtZSxzaXplfSx0eXBlLGNsYWltZWQ6dHlwZSxtaXNtYXRjaDpmYWxzZSx3aWR0aDppbWcubmF0dXJhbFdpZHRoLGhlaWdodDppbWcubmF0dXJhbEhlaWdodCxsb2FkaW5nOmZhbHNlLGVycm9yOicnLGZyYW1lczowLGFuaW1hdGVkOmZhbHNlLGxheW91dDonMScsbGF5b3V0V2lkdGg6MCxzaXRlV2lkdGg6MCxsYXlvdXRXaWR0aFVuaXQ6J3B4JyxzaXRlV2lkdGhVbml0OidweCcsc2l0ZUJhc2U6MCx3UGxhY2VtZW50Oidub25lJyx3VGhlbWU6J2EnLHdWYXJpYW50OicwJyxjb21wYXJlOmZhbHNlLHRyYW5zcDpmYWxzZSx0b2w6NDAsY2xpY2tzOltdLGFjdHVhbDpmYWxzZSx1cmxzOnt9LG91dHB1dDonb3JpZ2luYWwnLHJlc2l6ZTonb3JpZ2luYWwnLGN1c3RvbVdpZHRoOjAscXVhbGl0eTo4MixyZXN1bHQ6bnVsbCxidXN5OmZhbHNlLHJldjowfSk7CiAgJCgnY2lsLXVybCcpLnZhbHVlPScnO3JlbmRlcigpO3N0YXR1cyhzaXplPydCaWxkIGF1cyBkZXIgVVJMIGdlcHLDvGZ0Lic6J0JpbGQgYXVzIGRlciBVUkwgZ2VwcsO8ZnQuIERpZSBEYXRlaWdyw7bDn2Uga29ubnRlIHZvbiBkaWVzZXIgV2Vic2l0ZSBuaWNodCBnZWxlc2VuIHdlcmRlbi4nKTsKIH1jYXRjaChlKXtzdGF0dXMoJ0RhcyBCaWxkIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbi4gUHLDvGZlbiBTaWUsIG9iIGRpZSBVUkwgZGlyZWt0IGF1ZiBlaW5lIEJpbGRkYXRlaSB6ZWlndCB1bmQgw7ZmZmVudGxpY2ggenVnw6RuZ2xpY2ggaXN0LicpfQogZmluYWxseXtidG4uZGlzYWJsZWQ9ZmFsc2U7YnRuLnRleHRDb250ZW50PSdCaWxkIGF1cyBVUkwgaGluenVmw7xnZW4nfQp9CiQoJ2NpbC11cmwtZm9ybScpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsZT0+e2UucHJldmVudERlZmF1bHQoKTtjaGVja1VybCgkKCdjaWwtdXJsJykudmFsdWUudHJpbSgpKX0pOwpmdW5jdGlvbiByZW5kZXIoKXt0aHVtYnMoKTsKIGNvbnN0IGZhPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsZm9jdXNJZD1mYSYmcm9vdC5jb250YWlucyhmYSkmJmZhLmRhdGFzZXQ\/ZmEuZGF0YXNldC5mOm51bGw7CiBjb25zdCBsaXN0PSQoJ2NpbC1maWxlcycpLHByZXZIPWxpc3Qub2Zmc2V0SGVpZ2h0OyQoJ2NpbC1yZXN1bHRzJykuY2xhc3NMaXN0LnRvZ2dsZSgnY2lsLWhpZGUnLCFpdGVtcy5sZW5ndGgpO2xpc3QucmVwbGFjZUNoaWxkcmVuKCk7CiAvKiBrZWVwIHRoZSBwYWdlIGZyb20ganVtcGluZyB3aGlsZSBhbiBpbWFnZSBpcyByZS1vcHRpbWlzZWQgKGUuZy4gYWZ0ZXIgYSBjbGljayB0byByZW1vdmUgYW4gYXJlYSkgKi8KIGxpc3Quc3R5bGUubWluSGVpZ2h0PWl0ZW1zLnNvbWUoaT0+aS5idXN5KSYmcHJldkg\/cHJldkgrJ3B4JzonJzsKIGNvbnN0IGRvbmU9aXRlbXMuZmlsdGVyKGk9PmkucmVzdWx0KTskKCdjaWwtb3B0YWxsJykuZGlzYWJsZWQ9b3B0QnVzeXx8IWl0ZW1zLnNvbWUoaT0+Y2FuT3B0aW1pc2UoaSkmJiFpLnJlc3VsdCk7JCgnY2lsLW9wdGFsbCcpLnRleHRDb250ZW50PW9wdEJ1c3k\/J1dpcmQgb3B0aW1pZXJ04oCmJzonQWxsZSBCaWxkZXIgb3B0aW1pZXJlbic7JCgnY2lsLXppcCcpLmRpc2FibGVkPSFkb25lLmxlbmd0aHx8emlwQnVzeTskKCdjaWwtemlwJykudGV4dENvbnRlbnQ9emlwQnVzeT8nWklQIHdpcmQgdm9yYmVyZWl0ZXTigKYnOidPcHRpbWllcnRlIEJpbGRlciBhbHMgWklQIGhlcnVudGVybGFkZW4nOwogJCgnY2lsLXppcC1ub3RlJykudGV4dENvbnRlbnQ9ZG9uZS5sZW5ndGg\/ZG9uZS5sZW5ndGgrKGRvbmUubGVuZ3RoPT09MT8nIG9wdGltaWVydGVzICc6JyBvcHRpbWllcnRlICcpKyhkb25lLmxlbmd0aD09PTE\/J0JpbGQnOidCaWxkZXInKSsnIGJlcmVpdCBmw7xyIFpJUC4nOidPcHRpbWllcmVuIFNpZSBtaW5kZXN0ZW5zIGVpbiBCaWxkLCB1bSBlaW5lIFpJUCBoZXJ1bnRlcnp1bGFkZW4uJzsKIGlmKCFpdGVtcy5sZW5ndGgpcmV0dXJuOwogY29uc3QgdG90YWw9aXRlbXMucmVkdWNlKChzLGkpPT5zK2kuZmlsZS5zaXplLDApLG1peGVkPWl0ZW1zLnJlZHVjZSgocyxpKT0+cysoaS5yZXN1bHQ\/aS5yZXN1bHQuYmxvYi5zaXplOmkuZmlsZS5zaXplKSwwKSxzdW09JCgnY2lsLXN1bW1hcnknKSxuPWl0ZW1zLmxlbmd0aCsoaXRlbXMubGVuZ3RoPT09MT8nIEJpbGQnOicgQmlsZGVyJykrJyBhdXNnZXfDpGhsdCc7CiBjb25zdCBzdGF0PShsLHYsc3ViLHRvbmUsaGVscCk9Pntjb25zdCBkPWVsKCdkaXYnLCdjaWwtc3RhdCcrKHRvbmU\/JyBjaWwtc3RhdC0nK3RvbmU6JycpKSxsYj1lbCgnc3BhbicsJ2NpbC1zdGF0LWxhYmVsJyxsKTtsZXQgdGlwPW51bGw7aWYoaGVscClsYi5hcHBlbmQoaGVscFRpcChoZWxwLCdzdGF0LScrbCkpO2QuYXBwZW5kKGxiLGVsKCdzdHJvbmcnLCdjaWwtc3RhdC12YWx1ZScsdikpO2lmKHN1YilkLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1zdGF0LXN1Yicsc3ViKSk7cmV0dXJuIGR9OwogY29uc3QgdW5rbm93bj1hcmVhPT09J2VtYWlsJz9pdGVtcy5maWx0ZXIoaT0+aS51cmxPbmx5JiYhaS5maWxlLnNpemUpLmxlbmd0aDowOwogY29uc3Qgc2F2ZWQ9ZG9uZS5sZW5ndGgmJnRvdGFsP01hdGgucm91bmQoKDEtbWl4ZWQvdG90YWwpKjEwMCk6MCxhdHRuPWl0ZW1zLmZpbHRlcihpPT5sZXZlbChpKT49MikubGVuZ3RoLGF0dG5NYXg9aXRlbXMucmVkdWNlKChtLGkpPT5NYXRoLm1heChtLGxldmVsKGkpKSwwKSxncmlkPWVsKCdkaXYnLCdjaWwtc3RhdHMnKTsKIGdyaWQuYXBwZW5kKHN0YXQoJ0JpbGRlcicsU3RyaW5nKGl0ZW1zLmxlbmd0aCksZG9uZS5sZW5ndGg\/ZG9uZS5sZW5ndGgrJyBvcHRpbWllcnQnOidOb2NoIGtlaW5lcyBvcHRpbWllcnQnKSwoYXJlYT09PSdlbWFpbCc\/c3RhdCgnR2VzYW10Z3LDtsOfZSBkZXIgQmlsZGVyJywodW5rbm93bj8nTWluZGVzdGVucyAnOicnKStmbXQobWl4ZWQpLGVtYWlsVmVyZGljdChtaXhlZCkrKHVua25vd24\/JyAnK3Vua25vd24rKHVua25vd24+MT8nIEJpbGRncsO2w59lbic6JyBCaWxkZ3LDtsOfZScpKycgbmljaHQgbGVzYmFyLCBkYWhlciBpc3QgZGllIHRhdHPDpGNobGljaGUgU3VtbWUgaMO2aGVyLic6JycpLG1peGVkPD1NQj8nZ29vZCc6bWl4ZWQ8PTIqTUI\/J3dhcm4nOidhbGVydCcsJ0RhcyBpc3QgZGllIEdlc2FtdGdyw7bDn2UgZGVyIEJpbGRkYXRlaWVuLiBEaWUgdmVyc2VuZGV0ZSBFLU1haWwga2FubiBncsO2w59lciBzZWluLCB3ZWlsIEJpbGRlciBiZWltIFZlcnNhbmQga29kaWVydCB3ZXJkZW4uIERpZSBHcmVuemVuIHNpbmQgUmljaHR3ZXJ0ZSwga2VpbmUgR3JlbnplbiBpbiBDb25mZXJlbmNlIE1hbmFnZXIuJyk6c3RhdCgnR2VzYW10ZSBEYXRlaWdyw7bDn2UnLGZtdCh0b3RhbCksJ1N1bW1lIGFsbGVyIGF1c2dld8OkaGx0ZW4gQmlsZGVyJywnJywnV2VubiBhbGxlIEJpbGRlciBhdWYgZGVyc2VsYmVuIFNlaXRlIHNpbmQsIGJlZWluZmx1c3N0IGRpZSBTdW1tZSwgd2llIHNjaG5lbGwgZGllIFNlaXRlIGzDpGR0LiBXZW5uIHNpZSBhdWYgdmVyc2NoaWVkZW5lbiBTZWl0ZW4gc2luZCwgesOkaGx0IGRpZSBEYXRlaWdyw7bDn2UgamVkZXMgQmlsZGVzIG1laHIuJykpLHN0YXQoJ05hY2ggZGVyIE9wdGltaWVydW5nJyxkb25lLmxlbmd0aD9mbXQobWl4ZWQpOifigJMnLGRvbmUubGVuZ3RoPyhzYXZlZD4wP3NhdmVkKyclIGtsZWluZXInOidLZWluZSBWZXJyaW5nZXJ1bmcnKTonT3B0aW1pZXJlbiwgdW0gZGFzIEVyZ2VibmlzIHp1IHNlaGVuJyxkb25lLmxlbmd0aCYmc2F2ZWQ+MD8nZ29vZCc6JycsJ0RpZSBHZXNhbXRncsO2w59lIGFsbGVyIEJpbGRlciBuYWNoIGRlciBPcHRpbWllcnVuZy4gTmljaHQgb3B0aW1pZXJ0ZSBCaWxkZXIgd2VyZGVuIG1pdCBpaHJlciBPcmlnaW5hbGdyw7bDn2UgZ2V6w6RobHQuJyksc3RhdCgnUHLDvGZlbicsU3RyaW5nKGF0dG4pLGF0dG4\/KGF0dG49PT0xPycxIEJpbGQgaGF0IGVpbmUgTWVsZHVuZyc6YXR0bisnIEJpbGRlciBoYWJlbiBlaW5lIE1lbGR1bmcnKSsnIChzaWVoZSB1bnRlbiknOidBbGxlIGluIE9yZG51bmcnLGF0dG5NYXg+PTM\/J2FsZXJ0JzphdHRuPyd3YXJuJzonZ29vZCcsJ1rDpGhsdCBCaWxkZXIgbWl0IGVpbmVyIGdlbGJlbiBvZGVyIG9yYW5nZW4gTWVsZHVuZy4gR3LDvG4gYmVkZXV0ZXQsIGRhc3MgQnJlaXRlIHVuZCBEYXRlaWdyw7bDn2UgenVyIGdld8OkaGx0ZW4gUGxhdHppZXJ1bmcgcGFzc2VuLicpKTsKIHN1bS5yZXBsYWNlQ2hpbGRyZW4oZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCfDnGJlcmJsaWNrJyksZ3JpZCk7dm9pZCBuOwogCiBmb3IoY29uc3QgaXRlbSBvZiBpdGVtcyl7CiAgY29uc3QgY2FyZD1lbCgnZGl2JywnY2lsLWZpbGUnKSx0b3A9ZWwoJ2RpdicsJ2NpbC1maWxldG9wJyk7CiAgdG9wLmFwcGVuZChlbCgnaDMnLCdjaWwtZmlsZW5hbWUnLGl0ZW0uZmlsZS5uYW1lfHwnVW5iZW5hbm50ZSBEYXRlaScpLGJ1dHRvbignRW50ZmVybmVuJywoKT0+e2NvbnN0IGlkeD1pdGVtcy5pbmRleE9mKGl0ZW0pO2Rpc2NhcmQoaXRlbSk7aXRlbXM9aXRlbXMuZmlsdGVyKHg9PnghPT1pdGVtKTtyZW5kZXIoKTtjb25zdCBuZXh0PWl0ZW1zW01hdGgubWluKGlkeCxpdGVtcy5sZW5ndGgtMSldO2NvbnN0IGY9bmV4dCYmcm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mPSInK25leHQuaWQrJy1ybSJdJyk7KGZ8fCQoJ2NpbC1hZGQnKSkuZm9jdXMoKX0sJ2NpbC1idG4tdGV4dCcsaXRlbS5pZCsnLXJtJykpOwogIGNhcmQuYXBwZW5kKHRvcCk7Y29uc3QgbT1lbCgnZGl2JywnY2lsLW1ldHJpY3MnKTsKICBtLmFwcGVuZChtZXRyaWMoaXRlbS51cmxPbmx5PydEYXRlaWdyw7bDn2UnOidPcmlnaW5hbGdyw7bDn2UnLGl0ZW0udXJsT25seSYmIWl0ZW0uZmlsZS5zaXplPydOaWNodCB2ZXJmw7xnYmFyJzpmbXQoaXRlbS5maWxlLnNpemUpKSxtZXRyaWMoJ01hw59lJyxpdGVtLmxvYWRpbmc\/J1dpcmQgZ2VsZXNlbuKApic6aXRlbS53aWR0aD9pdGVtLndpZHRoKycgw5cgJytpdGVtLmhlaWdodCsnIHB4JzonTmljaHQgdmVyZsO8Z2JhcicpLG1ldHJpYygnRm9ybWF0JyxpdGVtLnVybE9ubHk\/KGl0ZW0udHlwZT90eXBlTGFiZWwoaXRlbS50eXBlKSsnIChhdXMgVVJMKSc6J1VuYmVrYW5udCcpOmZvcm1hdFRleHQoaXRlbSkpKTtjYXJkLmFwcGVuZChtKTsKICBpZihhcmVhPT09J2VtYWlsJyljYXJkLmFwcGVuZChlbWFpbEZpZWxkcyhpdGVtKSk7CiAgZWxzZSBjYXJkLmFwcGVuZCh3ZWJzaXRlRmllbGRzKGl0ZW0pKTsKICBpZihpdGVtLnVybE9ubHkpe3VybEJvZHkoY2FyZCxpdGVtKTtjb25zdCB1YT1lbCgnZGl2JywnY2lsLWFjdGlvbnMnKTtjYXJkLmFwcGVuZCh1YSk7bGlzdC5hcHBlbmQoY2FyZCk7Y29udGludWV9CiAgYWR2aWNlRm9yKGNhcmQsaXRlbSk7CiAgaWYoIWl0ZW0ubG9hZGluZyYmIWl0ZW0uZXJyb3IpY29udHJvbHNGb3IoY2FyZCxpdGVtKTsKICBjb25zdCBhY3RzPWVsKCdkaXYnLCdjaWwtYWN0aW9ucycpLG9wdD1idXR0b24oaXRlbS5idXN5PydXaXJkIGJlYXJiZWl0ZXTigKYnOidPcHRpbWllcmVuIC8ga29udmVydGllcmVuJywoKT0+b3B0aW1pc2UoaXRlbSksJycsaXRlbS5pZCsnLW9wdCcpO29wdC5kaXNhYmxlZD0hY2FuT3B0aW1pc2UoaXRlbSk7YWN0cy5hcHBlbmQob3B0KTsKICBpZihpdGVtLnJlc3VsdCl7cmVzdWx0Rm9yKGNhcmQsaXRlbSk7aWYoIWl0ZW0ucmVzdWx0LmtlcHRPcmlnaW5hbCYmIWl0ZW0uY29tcGFyZSlhY3RzLmFwcGVuZChidXR0b24oJ0hlcnVudGVybGFkZW46ICcrdHlwZUxhYmVsKGl0ZW0ucmVzdWx0LnR5cGUpLCgpPT57dHJhY2soJ2Rvd25sb2FkJyk7ZG93bmxvYWQoaXRlbS5yZXN1bHQuYmxvYixpdGVtLnJlc3VsdC5uYW1lKX0sJ2NpbC1idG4tc2Vjb25kYXJ5JyxpdGVtLmlkKyctZGwnKSl9CiAgaWYoaXRlbS5yZXN1bHQpe2NvbnN0IHB2PWJ1dHRvbihpdGVtLmNvbXBhcmU\/J1ZlcmdsZWljaCBhdXNibGVuZGVuJzonTWl0IE9yaWdpbmFsIHZlcmdsZWljaGVuJywoKT0+e2l0ZW0uY29tcGFyZT0haXRlbS5jb21wYXJlO2lmKCFpdGVtLmNvbXBhcmUpe2Ryb3BVcmwoaXRlbSwnb3JpZycpO2Ryb3BVcmwoaXRlbSwncmVzJyl9cmVuZGVyKCl9LCdjaWwtYnRuLXRleHQnLGl0ZW0uaWQrJy1wdicpO3B2LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsU3RyaW5nKGl0ZW0uY29tcGFyZSkpO2FjdHMuYXBwZW5kKHB2KTtpZihpdGVtLmNvbXBhcmUpcHJldmlld0ZvcihjYXJkLGl0ZW0pfQogIGNhcmQuYXBwZW5kKGFjdHMpO2xpc3QuYXBwZW5kKGNhcmQpOwogfQogaWYoZm9jdXNJZCl7Y29uc3QgZj1yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWY9IicrZm9jdXNJZCsnIl0nKTtpZihmJiYhZi5kaXNhYmxlZClmLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOnRydWV9KX0KfQpmdW5jdGlvbiBkb3dubG9hZChibG9iLG5hbWUpe2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpLHVybD1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO2EuaHJlZj11cmw7YS5kb3dubG9hZD1uYW1lO2EucmVsPSdub29wZW5lcic7YS5zdHlsZS5kaXNwbGF5PSdub25lJztkb2N1bWVudC5ib2R5LmFwcGVuZChhKTthLmNsaWNrKCk7YS5yZW1vdmUoKTtzZXRUaW1lb3V0KCgpPT5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCksNjAwMDApfQovKiAtLS0tLS0tLS0tIFpJUCAoU1RPUkUsIFVURi04IG5hbWVzLCBDUkMtMzIpIC0tLS0tLS0tLS0gKi8KY29uc3QgQ1JDX1RBQkxFPSgoKT0+e2NvbnN0IHQ9bmV3IFVpbnQzMkFycmF5KDI1Nik7Zm9yKGxldCBuPTA7bjwyNTY7bisrKXtsZXQgYz1uO2ZvcihsZXQgaz0wO2s8ODtrKyspYz1jJjE\/MHhFREI4ODMyMF4oYz4+PjEpOmM+Pj4xO3Rbbl09Yz4+PjB9cmV0dXJuIHR9KSgpOwpmdW5jdGlvbiBjcmMzMihkKXtsZXQgYz0weEZGRkZGRkZGO2ZvcihsZXQgaT0wO2k8ZC5sZW5ndGg7aSsrKWM9Q1JDX1RBQkxFWyhjXmRbaV0pJjI1NV1eKGM+Pj44KTtyZXR1cm4gKGNeMHhGRkZGRkZGRik+Pj4wfQpmdW5jdGlvbiB6aXBCbG9iKGVudHJpZXMpewogY29uc3QgZW5jPW5ldyBUZXh0RW5jb2RlcigpLG5vdz1uZXcgRGF0ZSgpLHRpbWU9KG5vdy5nZXRIb3VycygpPDwxMSl8KG5vdy5nZXRNaW51dGVzKCk8PDUpfChub3cuZ2V0U2Vjb25kcygpPj4xKSxkYXRlPSgoTWF0aC5tYXgoMTk4MCxub3cuZ2V0RnVsbFllYXIoKSktMTk4MCk8PDkpfCgobm93LmdldE1vbnRoKCkrMSk8PDUpfG5vdy5nZXREYXRlKCk7CiBjb25zdCBwYXJ0cz1bXSxjZW50cmFsPVtdO2xldCBvZmZzZXQ9MDsKIGZvcihjb25zdCBlIG9mIGVudHJpZXMpewogIGNvbnN0IG5hbWU9ZW5jLmVuY29kZShlLm5hbWUpLHNpemU9ZS5ibG9iLnNpemUsaD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDMwKSksZD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDQ2KSk7CiAgaC5zZXRVaW50MzIoMCwweDA0MDM0YjUwLHRydWUpO2guc2V0VWludDE2KDQsMjAsdHJ1ZSk7aC5zZXRVaW50MTYoNiwweDA4MDAsdHJ1ZSk7aC5zZXRVaW50MTYoOCwwLHRydWUpO2guc2V0VWludDE2KDEwLHRpbWUsdHJ1ZSk7aC5zZXRVaW50MTYoMTIsZGF0ZSx0cnVlKTtoLnNldFVpbnQzMigxNCxlLmNyYyx0cnVlKTtoLnNldFVpbnQzMigxOCxzaXplLHRydWUpO2guc2V0VWludDMyKDIyLHNpemUsdHJ1ZSk7aC5zZXRVaW50MTYoMjYsbmFtZS5sZW5ndGgsdHJ1ZSk7aC5zZXRVaW50MTYoMjgsMCx0cnVlKTsKICBkLnNldFVpbnQzMigwLDB4MDIwMTRiNTAsdHJ1ZSk7ZC5zZXRVaW50MTYoNCwyMCx0cnVlKTtkLnNldFVpbnQxNig2LDIwLHRydWUpO2Quc2V0VWludDE2KDgsMHgwODAwLHRydWUpO2Quc2V0VWludDE2KDEwLDAsdHJ1ZSk7ZC5zZXRVaW50MTYoMTIsdGltZSx0cnVlKTtkLnNldFVpbnQxNigxNCxkYXRlLHRydWUpO2Quc2V0VWludDMyKDE2LGUuY3JjLHRydWUpO2Quc2V0VWludDMyKDIwLHNpemUsdHJ1ZSk7ZC5zZXRVaW50MzIoMjQsc2l6ZSx0cnVlKTtkLnNldFVpbnQxNigyOCxuYW1lLmxlbmd0aCx0cnVlKTtkLnNldFVpbnQzMig0MixvZmZzZXQsdHJ1ZSk7CiAgcGFydHMucHVzaChuZXcgVWludDhBcnJheShoLmJ1ZmZlciksbmFtZSxlLmJsb2IpO2NlbnRyYWwucHVzaChuZXcgVWludDhBcnJheShkLmJ1ZmZlciksbmFtZSk7CiAgb2Zmc2V0Kz0zMCtuYW1lLmxlbmd0aCtzaXplO2lmKG9mZnNldD4weEZGRkZGRkZGKXRocm93IEVycm9yKCdEaWUgWklQIHfDpHJlIGdyw7bDn2VyIGFscyA0IEdCLiBMYWRlbiBTaWUgd2VuaWdlciBCaWxkZXIgYXVmIGVpbm1hbCBoZXJ1bnRlci4nKTsKIH0KIGNvbnN0IGNzaXplPWNlbnRyYWwucmVkdWNlKChzLHgpPT5zK3gubGVuZ3RoLDApLGVuZD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDIyKSk7CiBlbmQuc2V0VWludDMyKDAsMHgwNjA1NGI1MCx0cnVlKTtlbmQuc2V0VWludDE2KDgsZW50cmllcy5sZW5ndGgsdHJ1ZSk7ZW5kLnNldFVpbnQxNigxMCxlbnRyaWVzLmxlbmd0aCx0cnVlKTtlbmQuc2V0VWludDMyKDEyLGNzaXplLHRydWUpO2VuZC5zZXRVaW50MzIoMTYsb2Zmc2V0LHRydWUpOwogcmV0dXJuIG5ldyBCbG9iKHBhcnRzLmNvbmNhdChjZW50cmFsLFtuZXcgVWludDhBcnJheShlbmQuYnVmZmVyKV0pLHt0eXBlOidhcHBsaWNhdGlvbi96aXAnfSk7Cn0KZnVuY3Rpb24gdW5pcXVlTmFtZXMobGlzdCl7Y29uc3QgdXNlZD1uZXcgU2V0KCk7cmV0dXJuIGxpc3QubWFwKGk9Pntjb25zdCBuYW1lPWkucmVzdWx0Lm5hbWUsZG90PW5hbWUubGFzdEluZGV4T2YoJy4nKSxiYXNlPW5hbWUuc2xpY2UoMCxkb3QpLGV4dD1uYW1lLnNsaWNlKGRvdCk7bGV0IG49bmFtZSxrPTI7d2hpbGUodXNlZC5oYXMobi50b0xvd2VyQ2FzZSgpKSluPWJhc2UrJyAoJysoaysrKSsnKScrZXh0O3VzZWQuYWRkKG4udG9Mb3dlckNhc2UoKSk7cmV0dXJuIHtuYW1lOm4sYmxvYjppLnJlc3VsdC5ibG9iLGNyYzppLnJlc3VsdC5jcmN9fSl9CiQoJ2NpbC1vcHRhbGwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsYXN5bmMoKT0+ewogaWYob3B0QnVzeSlyZXR1cm47Y29uc3QgbGlzdD1pdGVtcy5maWx0ZXIoaT0+Y2FuT3B0aW1pc2UoaSkmJiFpLnJlc3VsdCk7aWYoIWxpc3QubGVuZ3RoKXJldHVybjtvcHRCdXN5PXRydWU7bGV0IG49MDsKIGZvcihjb25zdCBpdCBvZiBsaXN0KXtpZighYWxpdmUoaXQpfHwhY2FuT3B0aW1pc2UoaXQpKWNvbnRpbnVlO24rKztzdGF0dXMoJ09wdGltaWVyZSBCaWxkICcrbisnIHZvbiAnK2xpc3QubGVuZ3RoKyfigKYnKTt0cnl7YXdhaXQgb3B0aW1pc2UoaXQpfWNhdGNoKGUpe319CiBvcHRCdXN5PWZhbHNlO3JlbmRlcigpO3N0YXR1cygnRmVydGlnLiBWZXJnbGVpY2hlbiBTaWUgamVkZXMgRXJnZWJuaXMgbWl0IGRlbSBPcmlnaW5hbCwgYmV2b3IgU2llIGVzIHZlcndlbmRlbi4nKX0pOwokKCdjaWwtemlwJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57CiBpZih6aXBCdXN5KXJldHVybjtjb25zdCByZWFkeT1pdGVtcy5maWx0ZXIoaT0+aS5yZXN1bHQpO2lmKCFyZWFkeS5sZW5ndGgpcmV0dXJuOwogaWYocmVhZHkubGVuZ3RoPk1BWF9aSVBfRklMRVMpe3N0YXR1cygnQml0dGUgbGFkZW4gU2llIGjDtmNoc3RlbnMgJytNQVhfWklQX0ZJTEVTKycgQmlsZGVyIGF1ZiBlaW5tYWwgaGVydW50ZXIuJyk7cmV0dXJufQogemlwQnVzeT10cnVlO3JlbmRlcigpOwogdHJ5e3RyYWNrKCd6aXAnKTtkb3dubG9hZCh6aXBCbG9iKHVuaXF1ZU5hbWVzKHJlYWR5KSksJ2NtLW9wdGltaXNlZC1pbWFnZXMuemlwJyk7c3RhdHVzKCdaSVAgaGVydW50ZXJnZWxhZGVuIG1pdCAnK3JlYWR5Lmxlbmd0aCsocmVhZHkubGVuZ3RoPT09MT8nIEJpbGQuJzonIEJpbGRlcm4uJykpfQogY2F0Y2goZSl7c3RhdHVzKCdaSVAtRG93bmxvYWQgZmVobGdlc2NobGFnZW46ICcrZS5tZXNzYWdlKX0KIGZpbmFsbHl7emlwQnVzeT1mYWxzZTtyZW5kZXIoKX0KfSk7CnJlbmRlcigpOwp9KSgpOwp9CmlmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0nbG9hZGluZycpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLGNpbFN0YXJ0KX1lbHNle2NpbFN0YXJ0KCl9fSkoKTs=\")));(new Function(c))()}catch(e){if(window.console){console.error('CM image checker:',e)}}})();\n\n<\/script>\n\n<section id=\"cm-image-lab\" data-cmac-toc-skip aria-label=\"Bildpr\u00fcfung und Optimierung\">\n <div class=\"cil-card cil-intro\">\n  <p class=\"cil-lead\">Pr\u00fcfen Sie Bildma\u00dfe (px), Dateigr\u00f6\u00dfen (KB\/MB) und Formate. Optimieren oder konvertieren Sie Bilder, bevor Sie sie in Conference Manager hinzuf\u00fcgen.<\/p>\n  <div class=\"cil-label\" id=\"cil-area-label\">Wo verwenden Sie Ihre Bilder?<\/div>\n  <div class=\"cil-options\" role=\"group\" aria-labelledby=\"cil-area-label\"><button type=\"button\" class=\"cil-choice\" data-area=\"website\" aria-pressed=\"true\"><span class=\"cil-choice-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><path d=\"M2 12h20\"><\/path><path d=\"M12 2a15 15 0 0 1 0 20a15 15 0 0 1 0-20\"><\/path><\/svg><\/span><span class=\"cil-choice-text\"><span class=\"cil-choice-name\">Website-Designer<\/span><span class=\"cil-choice-desc\">Bilder f\u00fcr Ihre Veranstaltungswebsite<\/span><\/span><span class=\"cil-choice-check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"><\/path><\/svg><\/span><\/button><button type=\"button\" class=\"cil-choice\" data-area=\"email\" aria-pressed=\"false\"><span class=\"cil-choice-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"><\/rect><path d=\"m22 7-10 6L2 7\"><\/path><\/svg><\/span><span class=\"cil-choice-text\"><span class=\"cil-choice-name\">E-Mail-Editor<\/span><span class=\"cil-choice-desc\">Bilder f\u00fcr Ihre E-Mails<\/span><\/span><span class=\"cil-choice-check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"><\/path><\/svg><\/span><\/button><\/div>\n  <div id=\"cil-guide\" class=\"cil-hint\" aria-live=\"polite\"><\/div>\n  <div id=\"cil-drop\" class=\"cil-drop\"><input type=\"file\" id=\"cil-input\" accept=\"image\/*,.jpg,.jpeg,.png,.gif,.bmp,.dib,.svg,.webp\" multiple hidden><span class=\"cil-drop-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><path d=\"M18 22H4a2 2 0 0 1-2-2V6\"><\/path><path d=\"m22 13-1.3-1.3a2.4 2.4 0 0 0-3.4 0L11 18\"><\/path><circle cx=\"12\" cy=\"8\" r=\"2\"><\/circle><rect width=\"16\" height=\"16\" x=\"6\" y=\"2\" rx=\"2\"><\/rect><\/svg><\/span><span class=\"cil-drop-title\">Bilder hinzuf\u00fcgen<\/span><span class=\"cil-drop-text\">Bilder hierher ziehen oder auf Ihrem Computer suchen<\/span><button type=\"button\" class=\"cil-btn cil-btn-primary cil-drop-btn\" id=\"cil-add\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"><\/path><path d=\"m17 8-5-5-5 5\"><\/path><path d=\"M12 3v12\"><\/path><\/svg>Bilder ausw\u00e4hlen<\/button><span class=\"cil-drop-hint\">Ein oder mehrere Bilder ausw\u00e4hlen<\/span><\/div>\n  <form id=\"cil-url-form\" class=\"cil-urlrow cil-hide\" data-only=\"email\" novalidate><label class=\"cil-field cil-urlfield\"><span class=\"cil-label\">Verwenden Sie Bild (URL)? Pr\u00fcfen Sie ein Bild anhand seiner URL<\/span><input type=\"url\" id=\"cil-url\" placeholder=\"https:\/\/example.com\/image.jpg\" autocomplete=\"off\" spellcheck=\"false\"><\/label><button type=\"submit\" class=\"cil-btn cil-btn-secondary\" id=\"cil-url-btn\">Bild aus URL hinzuf\u00fcgen<\/button><\/form>\n  <div id=\"cil-status\" class=\"cil-small\" role=\"status\" aria-live=\"polite\"><\/div>\n  <p class=\"cil-muted cil-privacy\"><span class=\"cil-lock\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\"><rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\"><\/rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"><\/path><\/svg><\/span><span>Die Bilder werden lokal in Ihrem Browser verarbeitet. Nichts wird zu CM Academy hochgeladen oder auf unseren Servern gespeichert.<span data-only=\"email\" class=\"cil-hide\"> Wenn Sie ein Bild aus einer URL pr\u00fcfen, l\u00e4dt Ihr Browser es direkt von der Website, auf der es liegt.<\/span><\/span><\/p>\n  <div id=\"cil-thumbs\" class=\"cil-thumbs cil-hide\" aria-live=\"polite\"><\/div>\n  <details class=\"cil-basics\"><summary>Neu bei Bildern? Die Grundlagen<\/summary><div class=\"cil-basics-body\">\n<p><strong>Ma\u00dfe (px)<\/strong> geben Breite und H\u00f6he eines Bildes in Pixeln an, zum Beispiel 1920 \u00d7 1080 px. Die richtigen Ma\u00dfe h\u00e4ngen davon ab, wo das Bild verwendet wird. Im <strong>Website-Designer<\/strong> ben\u00f6tigen Hintergrundbilder in Headern und Bereichen genau die Breite f\u00fcr Ihr Theme: Ein zu schmales oder zu breites Bild wird m\u00f6glicherweise nicht wie gew\u00fcnscht angezeigt. Bilder in Spalten richten sich am besten mit der empfohlenen Breite aus, die auf den Standard-Spaltenbreiten basiert. Wenn Sie die Spaltenbreiten ge\u00e4ndert haben, w\u00e4hlen Sie stattdessen Eigene Breite. Im <strong>E-Mail-Editor<\/strong> sind die empfohlenen Breiten Richtwerte.<\/p>\n<p><strong>Dateigr\u00f6\u00dfe (KB oder MB)<\/strong> ist der Speicherplatz, den die Datei belegt. 1 MB sind 1.024 KB. Auch ein Bild mit den richtigen Ma\u00dfen kann eine gro\u00dfe Datei sein. Auf Websites laden gro\u00dfe Dateien langsamer, besonders auf Mobilger\u00e4ten. In E-Mails verlangsamen sie den Versand und vergr\u00f6\u00dfern die E-Mail, sodass manche Postf\u00e4cher sie ablehnen.<\/p>\n<p><strong>Format<\/strong> ist der Dateityp am Ende des Dateinamens, zum Beispiel .jpg oder .png. Verwenden Sie <strong>JPG<\/strong> f\u00fcr Fotos und <strong>PNG<\/strong> f\u00fcr Logos, Icons, Screenshots und alles, was einen transparenten Hintergrund braucht.<\/p>\n<p><strong>Optimieren<\/strong> macht die Datei kleiner. Das Tool kann das Bild schmaler machen oder in einem anderen Format speichern. Kleinere Dateien k\u00f6nnen etwas weniger scharf aussehen, vergleichen Sie daher immer vorher und nachher.<\/p>\n<p><strong>Erweiterte Einstellungen<\/strong> sind optional. <strong>JPG-Qualit\u00e4t<\/strong> legt fest, wie stark ein JPG komprimiert wird: Ein niedrigerer Wert ergibt eine kleinere Datei, aber weniger Details. <strong>PNG-Farben<\/strong> verringert die Anzahl der Farben in einem PNG, wodurch Logos und Grafiken deutlich kleiner werden. 256 Farben sehen meist aus wie das Original. W\u00e4hlen Sie <strong>Alle Farben<\/strong> wenn Sie einen Unterschied sehen, zum Beispiel bei weichen Verl\u00e4ufen.<\/p>\n<p><strong>So verwenden Sie das Tool<\/strong><\/p>\n<ol class=\"cil-list\"><li>W\u00e4hlen Sie Website-Designer oder E-Mail-Editor.<\/li><li>F\u00fcgen Sie Ihre Bilder hinzu. Sie sehen nun Dateigr\u00f6\u00dfe, Ma\u00dfe und Format jedes Bildes.<\/li><li>W\u00e4hlen Sie, wo jedes Bild platziert wird, um die erforderliche oder empfohlene Breite zu sehen.<\/li><li>Wenn ein Bild die falsche Breite, eine gro\u00dfe Datei oder das falsche Format hat, klicken Sie auf <strong>Optimieren \/ konvertieren<\/strong> und vergleichen Sie das Ergebnis mit dem Original.<\/li><li>Laden Sie das optimierte Bild oder alle Bilder als ZIP herunter und laden Sie es in Conference Manager hoch.<\/li><\/ol>\n<\/div><\/details>\n <\/div>\n <div class=\"cil-card cil-hide\" id=\"cil-results\">\n  <div class=\"cil-filetop\"><div class=\"cil-title\" role=\"heading\" aria-level=\"2\" style=\"margin:0\">Ihre Bilder<\/div><button class=\"cil-btn cil-btn-text\" id=\"cil-clear\" type=\"button\">Alle entfernen<\/button><\/div>\n  <div class=\"cil-summary\" id=\"cil-summary\"><\/div>\n  <div id=\"cil-files\"><\/div>\n  <div class=\"cil-actions\"><button class=\"cil-btn cil-btn-secondary\" type=\"button\" id=\"cil-optall\" disabled>Alle Bilder optimieren<\/button><button class=\"cil-btn cil-btn-secondary\" type=\"button\" id=\"cil-zip\" disabled>Optimierte Bilder als ZIP herunterladen<\/button><span class=\"cil-small\" id=\"cil-zip-note\"><\/span><button class=\"cil-btn cil-btn-text cil-clear-bottom\" id=\"cil-clear2\" type=\"button\">Alle Bilder entfernen<\/button><\/div>\n  <p class=\"cil-small\" style=\"margin:10px 0 0\">Pr\u00fcfen Sie immer, wie Ihre optimierten Bilder auf Ihrer Website oder in Ihrer E-Mail aussehen, bevor Sie ver\u00f6ffentlichen oder versenden.<\/p>\n <\/div>\n <div class=\"cil-card cil-note cmac-info cmac-info-good-to-know\"><span class=\"cmac-info-icon\" aria-hidden=\"true\"><\/span><div class=\"cmac-info-body\"><div class=\"cil-title\" role=\"heading\" aria-level=\"2\">Pr\u00fcfen Sie die Bildqualit\u00e4t<\/div><div class=\"cmac-info-content\"><p>Die Optimierung kann die Bildqualit\u00e4t beeinflussen, und das Ergebnis h\u00e4ngt von der Originaldatei und Ihrem Browser ab.<\/p><p>Sehen Sie sich Ihre optimierten oder konvertierten Bilder immer an und pr\u00fcfen Sie, wie sie auf Ihrer Website oder in Ihrer E-Mail aussehen, bevor Sie ver\u00f6ffentlichen oder versenden.<\/p><p style=\"margin-bottom:0\">Wenn Sie mit dem Ergebnis nicht zufrieden sind, passen Sie die Einstellungen an oder verwenden Sie ein Bildbearbeitungsprogramm wie <a href=\"https:\/\/www.canva.com\/\" target=\"_blank\" rel=\"noopener\">Canva<\/a>, <a href=\"https:\/\/www.adobe.com\/products\/photoshop.html\" target=\"_blank\" rel=\"noopener\">Adobe Photoshop<\/a> oder <a href=\"https:\/\/squoosh.app\/\" target=\"_blank\" rel=\"noopener\">Squoosh<\/a>.<\/p><\/div><\/div><\/div>\n <div class=\"cil-card\"><div class=\"cil-title\" role=\"heading\" aria-level=\"2\" style=\"font-size:19px\">Unterst\u00fctzte Bildformate<\/div><p><strong>JPG, PNG, GIF und BMP<\/strong> k\u00f6nnen in die Medienbibliothek von Conference Manager hochgeladen werden. F\u00fcr kleinere Dateien und breite Kompatibilit\u00e4t empfehlen wir JPG f\u00fcr Fotos und PNG f\u00fcr Grafiken mit Transparenz. <span data-only=\"website\">GIF wird unterst\u00fctzt, auch animierte GIFs, aber animierte GIFs sind oft sehr gro\u00dfe Dateien. Verwenden Sie sie sparsam.<\/span><span data-only=\"email\" class=\"cil-hide\">GIF wird unterst\u00fctzt, aber animierte GIFs sind oft sehr gro\u00dfe Dateien und verhalten sich in verschiedenen E-Mail-Programmen unterschiedlich. Verwenden Sie sie sparsam.<\/span> BMP wird akzeptiert, ist aber oft deutlich gr\u00f6\u00dfer als JPG oder PNG.<\/p><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Warum die Dateigr\u00f6\u00dfe wichtig ist<\/div><p data-only=\"website\">Gro\u00dfe Bilddateien verlangsamen Ihre Website, besonders auf Mobilger\u00e4ten und bei langsamen Verbindungen. Halten Sie die Dateigr\u00f6\u00dfe so klein wie m\u00f6glich, ohne sichtbaren Qualit\u00e4tsverlust. Bei Hintergr\u00fcnden in Headern und Bereichen muss die Breite trotzdem genau zu Ihrem Theme passen.<\/p><p data-only=\"email\" class=\"cil-hide\">Gro\u00dfe Bilder lassen Ihre E-Mail langsamer laden und k\u00f6nnen die Zustellung verz\u00f6gern. Manche Postf\u00e4cher lehnen E-Mails mit sehr gro\u00dfen Bildern ab. Wenn Sie ein Bild im Editor verkleinern, wird die Datei nicht kleiner. Laden Sie es daher in der Gr\u00f6\u00dfe hoch, in der es angezeigt wird.<\/p><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Wann JPG und wann PNG<\/div><ul class=\"cil-list\"><li><strong>JPG:<\/strong> Fotos und Bilder mit vielen Farben oder weichen Verl\u00e4ufen, zum Beispiel Fotos von Referenten, Veranstaltungsorten und Hintergr\u00fcnde. Ergibt die kleinsten Dateien. Unterst\u00fctzt keine Transparenz.<\/li><li><strong>PNG:<\/strong> Logos, Icons, Screenshots und Grafiken mit Text, scharfen Kanten oder wenigen Farben sowie alle Bilder mit transparentem Hintergrund. H\u00e4lt Kanten und Text scharf, aber als PNG gespeicherte Fotos sind oft deutlich gr\u00f6\u00dfer.<\/li><\/ul><p class=\"cil-muted\"><strong>Automatisch<\/strong> im Konverter w\u00e4hlt anhand der Transparenz und der Anzahl der Farben im Bild. Es erkennt nicht, was das Bild zeigt. Pr\u00fcfen Sie daher immer das Ergebnis und w\u00e4hlen Sie bei Bedarf selbst JPG oder PNG.<\/p><p><strong>WebP und SVG<\/strong> k\u00f6nnen nicht in die Medienbibliothek hochgeladen werden. Erstellen Sie mit dem Konverter oben stattdessen eine JPG- oder PNG-Datei.<\/p><div data-only=\"email\" class=\"cil-hide\"><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Bild und Bild (URL) im E-Mail-Editor<\/div><ul class=\"cil-list\"><li><strong>Bild:<\/strong> Verwendet die Medienbibliothek von Conference Manager, die JPG, PNG, GIF und BMP akzeptiert.<\/li><li><strong>Bild (URL):<\/strong> Verwendet ein Bild, das anderswo liegt und \u00fcber seine Webadresse eingef\u00fcgt wird. SVG und WebP sehen im Editor eventuell richtig aus, werden aber m\u00f6glicherweise nicht bei allen Empf\u00e4ngern angezeigt, zum Beispiel in Outlook.<\/li><\/ul><p>F\u00fcr die beste Kompatibilit\u00e4t in allen E-Mail-Programmen verwenden Sie JPG oder PNG.<\/p><\/div><\/div>\n<\/section>\n\n\n<div class=\"cmac-author wp-block-cm-academy-author\"><img class=\"cmac-author-photo\" src=\"https:\/\/cmacademy.events\/wp-content\/plugins\/cm-academy-companion\/assets\/author.png\" alt=\"Elisabeth Bj\u00f8rn Andersen\" width=\"80\" height=\"80\" loading=\"lazy\" decoding=\"async\"><div class=\"cmac-author-text\"><span class=\"cmac-author-name\">Elisabeth Bj\u00f8rn Andersen<\/span><span class=\"cmac-author-date\">Ver\u00f6ffentlicht: 16.10.2026<\/span><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Pr\u00fcfen Sie Bildma\u00dfe (px), Dateigr\u00f6\u00dfen (KB\/MB) und Formate. Optimieren oder konvertieren Sie Bilder, bevor Sie sie in Conference Manager hinzuf\u00fcgen. Wo verwenden Sie Ihre Bilder? Website-DesignerBilder f\u00fcr Ihre VeranstaltungswebsiteE-Mail-EditorBilder f\u00fcr Ihre E-Mails Bilder hinzuf\u00fcgenBilder hierher ziehen oder auf Ihrem Computer suchenBilder ausw\u00e4hlenEin oder mehrere Bilder ausw\u00e4hlen Verwenden Sie Bild (URL)? Pr\u00fcfen Sie ein Bild anhand &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/cmacademy.events\/de\/knowledge-base\/bilder-prufen-und-optimieren\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBilder pr\u00fcfen und optimieren\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":6,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"ht-kb-category":[],"ht-kb-tag":[],"class_list":["post-25758","ht_kb","type-ht_kb","status-publish","format-standard","hentry","entry"],"_links":{"self":[{"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/ht-kb\/25758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/ht-kb"}],"about":[{"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/comments?post=25758"}],"version-history":[{"count":2,"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/ht-kb\/25758\/revisions"}],"predecessor-version":[{"id":25764,"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/ht-kb\/25758\/revisions\/25764"}],"wp:attachment":[{"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/media?parent=25758"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/ht-kb-category?post=25758"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/cmacademy.events\/de\/wp-json\/wp\/v2\/ht-kb-tag?post=25758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}