{"id":25757,"date":"2026-10-16T12:59:20","date_gmt":"2026-10-16T12:59:20","guid":{"rendered":"https:\/\/cmacademy.events\/?post_type=ht_kb&#038;p=25757"},"modified":"2026-10-16T13:02:27","modified_gmt":"2026-10-16T13:02:27","slug":"tjek-og-optimer-dine-billeder","status":"publish","type":"ht_kb","link":"https:\/\/cmacademy.events\/da\/knowledge-base\/tjek-og-optimer-dine-billeder\/","title":{"rendered":"Tjek og optim\u00e9r dine billeder"},"content":{"rendered":"\n<div class=\"cm-image-tool-placeholder\"><!-- Erstat denne blok med billedtjekket (fanerne HTML, CSS og JavaScript, mappen DA). --><\/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 (DA), 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+OClyb3cuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXRodW1iIGNpbC10aHVtYi1tb3JlJywnKycrKGl0ZW1zLmxlbmd0aC04KSkpOwogY29uc3Qgbj1pdGVtcy5sZW5ndGgsdHh0PWVsKCdkaXYnLCdjaWwtdGh1bWJ0ZXh0Jyk7dHh0LmFwcGVuZChlbCgnc3Ryb25nJyxudWxsLG49PT0xPycxIGJpbGxlZGUgdGlsZsO4amV0JzpuKycgYmlsbGVkZXIgdGlsZsO4amV0JyksZWwoJ3NwYW4nLG51bGwsJ1Njcm9sbCBuZWQgZm9yIGF0IHNlIHN0w7hycmVsc2Ugb2cgbcOlbCBww6UgaHZlcnQgYmlsbGVkZSwgb2cgb3B0aW3DqXIgZGVtLCBodmlzIGRldCBlciBuw7hkdmVuZGlndC4nKSk7Ym94LmFwcGVuZChyb3csdHh0KX0KZnVuY3Rpb24gc2hvd0FkZGVkKG4pe2NvbnN0IHN0PSQoJ2NpbC1zdGF0dXMnKTtzdC50ZXh0Q29udGVudD0nJztzdC5jbGFzc0xpc3QuYWRkKCdjaWwtYWRkZWQnKTtjb25zdCB0PWVsKCdzcGFuJyxudWxsLChuPT09MT8nMSBiaWxsZWRlIHRpbGbDuGpldC4nOm4rJyBiaWxsZWRlciB0aWxmw7hqZXQuJykrJyBWw6ZsZyBpbmRzdGlsbGluZ2VyLCBvZyBvcHRpbcOpciBuZWRlbmZvci4nKTtjb25zdCBiPWJ1dHRvbignR8OlIHRpbCBkaW5lIGJpbGxlZGVyJyxnb1Jlc3VsdHMsJ2NpbC1idG4tdGV4dCcpO3N0LmFwcGVuZCh0LGIpfQovKiBVc2FnZSB0cmFja2luZyB2aWEgQ00gQWNhZGVteSBDb21wYW5pb246IG9uZSBldmVudCBwZXIgYWN0aW9uIHBlciBwYWdlIHZpZXcuIE9ubHkgdGhlIGFjdGlvbiBhbmQgV2Vic2l0ZS9FbWFpbCBhcmUgc2VudCwgbmV2ZXIgZmlsZSBuYW1lcywgc2l6ZXMgb3IgaW1hZ2VzLiBEb2VzIG5vdGhpbmcgaWYgdHJhY2tpbmcgaXMgb2ZmLiAqLwpjb25zdCB0cmFja2VkPXt9OwpmdW5jdGlvbiB0cmFjayhhY3Rpb24pe2NvbnN0IGtleT0naW1hZ2VfY2hlY2tlcl8nK2FjdGlvbisnXycrYXJlYTtpZih0cmFja2VkW2tleV0pcmV0dXJuO3RyYWNrZWRba2V5XT0xO3RyeXtjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2IudHlwZT0nYnV0dG9uJztiLmhpZGRlbj10cnVlO2Iuc2V0QXR0cmlidXRlKCdkYXRhLWNtLXRyYWNrJywnY21fYnV0dG9uX2NsaWNrJyk7Yi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY20ta2V5JyxrZXkpO2IudGV4dENvbnRlbnQ9J0ltYWdlIGNoZWNrZXI6ICcrYWN0aW9uKycgKCcrYXJlYSsnKSc7ZG9jdW1lbnQuYm9keS5hcHBlbmQoYik7Yi5jbGljaygpO2IucmVtb3ZlKCl9Y2F0Y2goZSl7fX0KLyogLS0tLS0tLS0tLSBzZXR0aW5ncyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIHdlYnNpdGVSZWMoaXRlbSl7Y29uc3QgcD1pdGVtLndQbGFjZW1lbnQ7aWYocD09PSdjdXN0b20nKXJldHVybiBpdGVtLnNpdGVXaWR0aFVuaXQ9PT0nJSc\/KGl0ZW0uc2l0ZVdpZHRoJiZpdGVtLnNpdGVCYXNlP01hdGgucm91bmQoaXRlbS5zaXRlQmFzZSppdGVtLnNpdGVXaWR0aC8xMDApOjApOml0ZW0uc2l0ZVdpZHRofHwwO3JldHVybiBXRUJTSVRFW3BdP1dFQlNJVEVbcF1baXRlbS53VGhlbWVdW3A9PT0nc2VjdGlvbic\/MDooTnVtYmVyKGl0ZW0ud1ZhcmlhbnQpfHwwKV06MH0KZnVuY3Rpb24gc3VnZ2VzdGVkKGl0ZW0pe3JldHVybiBhcmVhPT09J3dlYnNpdGUnP3dlYnNpdGVSZWMoaXRlbSk6aXRlbS5sYXlvdXQ9PT0nY3VzdG9tJz8oaXRlbS5sYXlvdXRXaWR0aFVuaXQ9PT0nJSc\/KGl0ZW0ubGF5b3V0V2lkdGg\/TWF0aC5yb3VuZCg2MDAqaXRlbS5sYXlvdXRXaWR0aC8xMDApOjApOml0ZW0ubGF5b3V0V2lkdGh8fDApOkVNQUlMW2l0ZW0ubGF5b3V0XXx8NjAwfQpmdW5jdGlvbiB0b29OYXJyb3coaXRlbSl7Y29uc3Qgcj1zdWdnZXN0ZWQoaXRlbSk7cmV0dXJuICEhciYmaXRlbS50eXBlIT09J2ltYWdlL3N2Zyt4bWwnJiZpdGVtLndpZHRoPjAmJml0ZW0ud2lkdGg8ciowLjc1fQpmdW5jdGlvbiBlbWFpbFZlcmRpY3Qobil7cmV0dXJuIG48NTAwKktCPydGcmVtcmFnZW5kZS4nOm48PU1CPydHb2QuJzpuPD0yKk1CPydPdmVydmVqIGF0IG9wdGltZXJlLiBHw6UgZWZ0ZXIgdW5kZXIgMSBNQiBpIGFsdC4nOidPcHRpbWVyaW5nIGFuYmVmYWxlcy4gU3RvcmUgZS1tYWlscyBrYW4gdsOmcmUgbGFuZ3NvbW1lcmUgYXQgc2VuZGUsIG9nIG5vZ2xlIGluZGJha2tlciBrYW4gYWZ2aXNlIGRlbS4gR8OlIGVmdGVyIHVuZGVyIDEgTUIgb2cgaMO4anN0IDIgTUIuJ30KZnVuY3Rpb24gaXNDb2x1bW4oaXRlbSl7cmV0dXJuIGFyZWE9PT0nd2Vic2l0ZScmJihpdGVtLndQbGFjZW1lbnQ9PT0nY29sdW1ucyd8fGl0ZW0ud1BsYWNlbWVudD09PSdzZWN0aW9uJyl9CmZ1bmN0aW9uIGlzRXhhY3QoaXRlbSl7cmV0dXJuIGFyZWE9PT0nd2Vic2l0ZScmJihpdGVtLndQbGFjZW1lbnQ9PT0nYmFja2dyb3VuZCd8fGl0ZW0ud1BsYWNlbWVudD09PSdoZWFkZXInKX0KZnVuY3Rpb24gbGV2ZWwoaSl7aWYoaS5sb2FkaW5nKXJldHVybiAtMTtjb25zdCBSPWkucmVzdWx0JiYhaS5yZXN1bHQua2VwdE9yaWdpbmFsP2kucmVzdWx0Om51bGw7aWYoUiYmaS50eXBlIT09J2ltYWdlL3N2Zyt4bWwnJiZpLndpZHRoPFIud2lkdGgqMC45KXJldHVybiAzO2lmKGkuZXJyb3J8fCghUiYmKGkubWlzbWF0Y2h8fChpLnR5cGUmJiFDTV9BQ0NFUFRFRC5pbmNsdWRlcyhpLnR5cGUpKSkpKXJldHVybiAzO2NvbnN0IHI9c3VnZ2VzdGVkKGkpLHN2Zz0hUiYmaS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnLFc9Uj9SLndpZHRoOmkud2lkdGgsU1o9Uj9SLmJsb2Iuc2l6ZTppLmZpbGUuc2l6ZTtsZXQgbHY9MDtpZihyJiZXPjAmJiFzdmcpe2lmKGlzRXhhY3QoaSkpbHY9Vz09PXI\/MDozO2Vsc2UgaWYoaXNDb2x1bW4oaSkpbHY9TWF0aC5hYnMoVy1yKTw9NT8wOjI7ZWxzZSBpZihXPHJ8fFc+cioyKWx2PTJ9aWYoU1o+TUIpbHY9MztlbHNlIGlmKFNaPjUwMCpLQilsdj1NYXRoLm1heChsdiwyKTtyZXR1cm4gbHZ9CmZ1bmN0aW9uIGlzQ3VzdG9tV2lkdGgoaXRlbSl7cmV0dXJuIGFyZWE9PT0nd2Vic2l0ZSc\/aXRlbS53UGxhY2VtZW50PT09J2N1c3RvbSc6aXRlbS5sYXlvdXQ9PT0nY3VzdG9tJ30KZnVuY3Rpb24gdXBkYXRlR3VpZGUoKXskKCdjaWwtZ3VpZGUnKS50ZXh0Q29udGVudD1hcmVhPT09J2VtYWlsJz8nVGlsZsO4aiBhbGxlIGRlIGJpbGxlZGVyLCBkdSB2aWwgYnJ1Z2UgaSBkaW4gZS1tYWlsLiBWw6ZsZyBldCBrb2xvbm5lbGF5b3V0IGVsbGVyIGFuZ2l2IGVuIGJyZWRkZSBmb3IgaHZlcnQgYmlsbGVkZS4gQW5iZWZhbGVkZSBicmVkZGVyOiDDqW4ga29sb25uZSA2MDAgcHgsIHRvIGtvbG9ubmVyIDMwMCBweCwgdHJlIGtvbG9ubmVyIDIwMCBweCAoc3RhbmRhcmQtZS1tYWlsIHDDpSA2MDAgcHgpLiBEZXQgZXIgdmVqbGVkZW5kZSwgaWtrZSBncsOmbnNlciBmb3IgdXBsb2FkLiBEZW4gc2FtbGVkZSBmaWxzdMO4cnJlbHNlIGZvciBhbGxlIGJpbGxlZGVyLCBvZ3PDpSBiaWxsZWRlciB0aWxmw7hqZXQgZnJhIGVuIFVSTCwgdmlzZXMgbmVkZW5mb3IuJzonVGlsZsO4aiDDqXQgZWxsZXIgZmxlcmUgYmlsbGVkZXIuIFbDpmxnIHBsYWNlcmluZyBvZyB0ZW1hIGZvciBodmVydCBiaWxsZWRlLiBCYWdncnVuZHNiaWxsZWRlciBpIGhlYWRlcmUgb2cgc2VrdGlvbmVyIHNrYWwgaGF2ZSBwcsOmY2lzIGRlbiB2aXN0ZSBicmVkZGUuIEJpbGxlZGVyIGkga29sb25uZXIgZmx1Z3RlciBiZWRzdCBtZWQgZGVuIGFuYmVmYWxlZGUgYnJlZGRlLCBzb20gYnlnZ2VyIHDDpSBzdGFuZGFyZGJyZWRkZW4gZm9yIGtvbG9ubmVyLiBIYXIgZHUgw6ZuZHJldCBrb2xvbm5lYnJlZGRlcm5lLCBzw6UgdsOmbGcgRWdlbiBicmVkZGUgaSBzdGVkZXQuJ30KZnVuY3Rpb24gc2V0dGluZ3NDaGFuZ2VkKCl7dXBkYXRlR3VpZGUoKTtpdGVtcy5mb3JFYWNoKGk9PntpZihpLnJlc2l6ZT09PSdyZWNvbW1lbmRlZCcpaW52YWxpZGF0ZShpKX0pO3JlbmRlcigpfQpyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFyZWFdJykuZm9yRWFjaChiPT5iLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e2lmKGFyZWE9PT1iLmRhdGFzZXQuYXJlYSlyZXR1cm47YXJlYT1iLmRhdGFzZXQuYXJlYTtyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFyZWFdJykuZm9yRWFjaCh4PT54LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJyxTdHJpbmcoeD09PWIpKSk7cm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1vbmx5XScpLmZvckVhY2goeD0+eC5jbGFzc0xpc3QudG9nZ2xlKCdjaWwtaGlkZScseC5kYXRhc2V0Lm9ubHkhPT1hcmVhKSk7c2V0dGluZ3NDaGFuZ2VkKCk7aWYoIWIuZGF0YXNldC5zaWxlbnQpe3RyeXtjb25zdCB1PW5ldyBVUkwobG9jYXRpb24uaHJlZik7dS5zZWFyY2hQYXJhbXMuc2V0KCd1c2UnLGFyZWEpO2hpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3Rvcnkuc3RhdGUsJycsdSl9Y2F0Y2goZSl7fX19KSk7Ci8qIExpbmsgZGlyZWN0bHkgdG8gYSB0YWI6ID91c2U9ZW1haWwgb3IgP3VzZT13ZWJzaXRlIChhbHNvICNlbWFpbCAvICN3ZWJzaXRlKSAqLwp0cnl7Y29uc3QgcT1uZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCkuZ2V0KCd1c2UnKXx8bG9jYXRpb24uaGFzaC5yZXBsYWNlKCcjJywnJyk7aWYocT09PSdlbWFpbCd8fHE9PT0nd2Vic2l0ZScpe2NvbnN0IGI9cm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hcmVhPSInK3ErJyJdJyk7aWYoYil7Yi5kYXRhc2V0LnNpbGVudD0nMSc7Yi5jbGljaygpO2RlbGV0ZSBiLmRhdGFzZXQuc2lsZW50fX19Y2F0Y2goZSl7fQp1cGRhdGVHdWlkZSgpOwovKiAtLS0tLS0tLS0tIGZpbGUgaW50YWtlIC0tLS0tLS0tLS0gKi8KJCgnY2lsLWFkZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxlPT57ZS5zdG9wUHJvcGFnYXRpb24oKTskKCdjaWwtaW5wdXQnKS5jbGljaygpfSk7CiQoJ2NpbC1kcm9wJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGU9PntpZihlLnRhcmdldC5jbG9zZXN0KCdidXR0b24saW5wdXQnKSlyZXR1cm47JCgnY2lsLWlucHV0JykuY2xpY2soKX0pOwokKCdjaWwtaW5wdXQnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGU9Pntjb25zdCBmPUFycmF5LmZyb20oZS50YXJnZXQuZmlsZXN8fFtdKTtlLnRhcmdldC52YWx1ZT0nJzthZGRGaWxlcyhmKX0pOwpjb25zdCBkej0kKCdjaWwtZHJvcCcpLGhhc0ZpbGVzPWU9PiEhZS5kYXRhVHJhbnNmZXImJkFycmF5LmZyb20oZS5kYXRhVHJhbnNmZXIudHlwZXN8fFtdKS5pbmRleE9mKCdGaWxlcycpPi0xOwpyb290LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJyxlPT57aWYoIWhhc0ZpbGVzKGUpKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7ZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD0nY29weSc7ZHouZGF0YXNldC5kcmFnPScxJ30pOwpyb290LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsZT0+e2lmKCFyb290LmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkpZGVsZXRlIGR6LmRhdGFzZXQuZHJhZ30pOwpyb290LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLGU9PntpZighaGFzRmlsZXMoZSkpcmV0dXJuO2UucHJldmVudERlZmF1bHQoKTtkZWxldGUgZHouZGF0YXNldC5kcmFnO2FkZEZpbGVzKEFycmF5LmZyb20oZS5kYXRhVHJhbnNmZXIuZmlsZXN8fFtdKSl9KTsKZnVuY3Rpb24gY2xlYXJBbGwoKXtpZihpdGVtcy5zb21lKGk9PmkucmVzdWx0JiYhaS5yZXN1bHQua2VwdE9yaWdpbmFsKSYmIXdpbmRvdy5jb25maXJtKCdGamVybiBhbGxlIGJpbGxlZGVyPyBPcHRpbWVyZWRlIGJpbGxlZGVyLCBzb20gZHUgaWtrZSBoYXIgZG93bmxvYWRldCwgZ8OlciB0YWJ0LicpKXJldHVybjtpdGVtcy5mb3JFYWNoKGRpc2NhcmQpO2l0ZW1zPVtdO3F1ZXVlLmxlbmd0aD0wO3JlbmRlcigpO3N0YXR1cygnQWxsZSBiaWxsZWRlciBlciBmamVybmV0LicpOyQoJ2NpbC1hZGQnKS5mb2N1cygpfQokKCdjaWwtY2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsY2xlYXJBbGwpO2lmKCQoJ2NpbC1jbGVhcjInKSkkKCdjaWwtY2xlYXIyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsZWFyQWxsKTsKYXN5bmMgZnVuY3Rpb24gaGVhZEJ5dGVzKGZpbGUsbil7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IGZpbGUuc2xpY2UoMCxuKS5hcnJheUJ1ZmZlcigpKX0KYXN5bmMgZnVuY3Rpb24gc25pZmYoZmlsZSl7CiBjb25zdCBiPWF3YWl0IGhlYWRCeXRlcyhmaWxlLDY0KSxhdD0obyxzKT0+e2ZvcihsZXQgaT0wO2k8cy5sZW5ndGg7aSsrKWlmKGJbbytpXSE9PXMuY2hhckNvZGVBdChpKSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9OwogaWYoYlswXT09PTB4RkYmJmJbMV09PT0weEQ4JiZiWzJdPT09MHhGRilyZXR1cm4gJ2ltYWdlL2pwZWcnOwogaWYoYXQoMCwnXHg4OVBOR1xyXG5ceDFhXG4nKSlyZXR1cm4gJ2ltYWdlL3BuZyc7CiBpZihhdCgwLCdHSUY4N2EnKXx8YXQoMCwnR0lGODlhJykpcmV0dXJuICdpbWFnZS9naWYnOwogaWYoYXQoMCwnQk0nKSYmYi5sZW5ndGg+PTE4JiZbMTIsMTYsNDAsNTIsNTYsNjQsMTA4LDEyNF0uaW5kZXhPZihiWzE0XXwoYlsxNV08PDgpKT4tMSYmYlsxNl09PT0wJiZiWzE3XT09PTApcmV0dXJuICdpbWFnZS9ibXAnOwogaWYoYXQoMCwnUklGRicpJiZhdCg4LCdXRUJQJykpcmV0dXJuICdpbWFnZS93ZWJwJzsKIGlmKGF0KDQsJ2Z0eXAnKSl7Y29uc3Qgcz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYi5zdWJhcnJheSg4LDY0KSk7aWYoL2F2aVtmc10vLnRlc3QocykpcmV0dXJuICdpbWFnZS9hdmlmJztpZigvaGVpW2Ntc3hdfGhldltjbXN4XXxtaWYxfG1zZjEvLnRlc3QocykpcmV0dXJuICdpbWFnZS9oZWljJztyZXR1cm4gJyd9CiBpZigoYXQoMCwnSUknKSYmYlsyXT09PTQyJiZiWzNdPT09MCl8fChhdCgwLCdNTScpJiZiWzJdPT09MCYmYlszXT09PTQyKSlyZXR1cm4gJ2ltYWdlL3RpZmYnOwogaWYoYlswXT09PTAmJmJbMV09PT0wJiZiWzJdPT09MSYmYlszXT09PTAmJmJbNF0+MClyZXR1cm4gJ2ltYWdlL3gtaWNvbic7CiBjb25zdCBoZWFkPW5ldyBUZXh0RGVjb2RlcigndXRmLTgnKS5kZWNvZGUoYXdhaXQgaGVhZEJ5dGVzKGZpbGUsNDA5NikpLnJlcGxhY2UoL15cdUZFRkYvLCcnKTsKIGlmKC9eXHMqKDxcP3htbFtePl0qXD8+XHMqKT8oXHgzYyEtLVtcc1xTXSo\/LS1ceDNlXHMqfFx4M2MhRE9DVFlQRVtePl0qPlxzKikqPHN2Z1tccz5cL10vaS50ZXN0KGhlYWQpKXJldHVybiAnaW1hZ2Uvc3ZnK3htbCc7CiByZXR1cm4gJyc7Cn0KZnVuY3Rpb24gZGVmYXVsdE91dHB1dCh0eXBlKXtyZXR1cm4gdHlwZT09PSdpbWFnZS9naWYnPydvcmlnaW5hbCc6J2F1dG8nfQphc3luYyBmdW5jdGlvbiBhZGRGaWxlcyhmaWxlcyl7CiBpZighZmlsZXMubGVuZ3RoKXJldHVybjtsZXQgYWRkZWQ9MCxkdXBlcz0wO2NvbnN0IHJlamVjdGVkPVtdLGRhbWFnZWQ9W107CiBmb3IoY29uc3QgZmlsZSBvZiBmaWxlcyl7CiAgY29uc3Qga2V5PVtmaWxlLm5hbWUsZmlsZS5zaXplLGZpbGUubGFzdE1vZGlmaWVkXS5qb2luKCc6Jyk7CiAgaWYoaXRlbXMuc29tZShpPT5pLmtleT09PWtleSkpe2R1cGVzKys7Y29udGludWV9CiAgbGV0IHR5cGU9Jyc7dHJ5e3R5cGU9YXdhaXQgc25pZmYoZmlsZSl9Y2F0Y2goZSl7fQogIGlmKCF0eXBlKXsoRVhUX1RZUEVbZXh0T2YoZmlsZS5uYW1lKV0\/ZGFtYWdlZDpyZWplY3RlZCkucHVzaChmaWxlLm5hbWV8fCd1bmF2bmdpdmV0IGZpbCcpO2NvbnRpbnVlfQogIGlmKGl0ZW1zLnNvbWUoaT0+aS5rZXk9PT1rZXkpKXtkdXBlcysrO2NvbnRpbnVlfQogIGNvbnN0IGNsYWltZWQ9RVhUX1RZUEVbZXh0T2YoZmlsZS5uYW1lKV18fCcnOwogIGNvbnN0IGl0ZW09e2lkOnNlcmlhbCsrLGtleSxmaWxlLHR5cGUsY2xhaW1lZCxtaXNtYXRjaDpjbGFpbWVkIT09dHlwZSx3aWR0aDowLGhlaWdodDowLGxvYWRpbmc6dHJ1ZSxlcnJvcjonJyxmcmFtZXM6MCxhbmltYXRlZDpmYWxzZSxzdmc6bnVsbCxzdmdBc3N1bWVkOmZhbHNlLGxheW91dDonMScsbGF5b3V0V2lkdGg6MCxzaXRlV2lkdGg6MCxsYXlvdXRXaWR0aFVuaXQ6J3B4JyxzaXRlV2lkdGhVbml0OidweCcsc2l0ZUJhc2U6MCx3UGxhY2VtZW50Oidub25lJyx3VGhlbWU6J2EnLHdWYXJpYW50OicwJyxjb21wYXJlOmZhbHNlLHRyYW5zcDpmYWxzZSx0b2w6NDAsY2xpY2tzOltdLGFjdHVhbDpmYWxzZSx1cmxzOnt9LG91dHB1dDpkZWZhdWx0T3V0cHV0KHR5cGUpLHJlc2l6ZToncmVjb21tZW5kZWQnLGN1c3RvbVdpZHRoOjAscXVhbGl0eTo4Mixjb2xvdXJzOjI1NixyZXN1bHQ6bnVsbCxidXN5OmZhbHNlLHJldjowfTsKICBpdGVtcy5wdXNoKGl0ZW0pO3F1ZXVlLnB1c2goaXRlbSk7YWRkZWQrKzsKIH0KIHB1bXAoKTtyZW5kZXIoKTtpZihhZGRlZCl7dHJhY2soJ2FkZCcpO2Ryb3BDb25maXJtKGFkZGVkKX0KIGNvbnN0IG1zZz1bXTtpZihhZGRlZCltc2cucHVzaChhZGRlZCsoYWRkZWQ9PT0xPycgYmlsbGVkZSc6JyBiaWxsZWRlcicpKycgdGlsZsO4amV0LicpO2lmKGR1cGVzKW1zZy5wdXNoKGR1cGVzKycgZXIgYWxsZXJlZGUgcMOlIGxpc3Rlbi4nKTsKIGlmKGRhbWFnZWQubGVuZ3RoKW1zZy5wdXNoKChkYW1hZ2VkLmxlbmd0aD09PTE\/J0ZpbGVuIGxpZ25lciBldCBiaWxsZWRlLCBtZW4gZGVuIGt1bm5lIGlra2UgbMOmc2VzOiAnOidGaWxlcm5lIGxpZ25lciBiaWxsZWRlciwgbWVuIGRlIGt1bm5lIGlra2UgbMOmc2VzOiAnKStkYW1hZ2VkLnNsaWNlKDAsMykuam9pbignLCAnKSsoZGFtYWdlZC5sZW5ndGg+Mz8nIG9nICcrKGRhbWFnZWQubGVuZ3RoLTMpKycgbWVyZSc6JycpKycuICcrKGRhbWFnZWQubGVuZ3RoPT09MT8nRmlsZW4ga2FuIHbDpnJlIGJlc2thZGlnZXQgZWxsZXIgZ2VtdCBmb3JrZXJ0LiDDhWJuIGRlbiBpIGRpdCBiaWxsZWRwcm9ncmFtLCBvZyBnZW0gZWxsZXIgZWtzcG9ydMOpciBkZW4gaWdlbi4nOidGaWxlcm5lIGthbiB2w6ZyZSBiZXNrYWRpZ2VkZSBlbGxlciBnZW10IGZvcmtlcnQuIMOFYm4gZGVtIGkgZGl0IGJpbGxlZHByb2dyYW0sIG9nIGdlbSBlbGxlciBla3Nwb3J0w6lyIGRlbSBpZ2VuLicpKTsKIGlmKHJlamVjdGVkLmxlbmd0aCltc2cucHVzaCgocmVqZWN0ZWQubGVuZ3RoPT09MT8nRmlsZW4gZXIgaWtrZSBldCBiaWxsZWRlIG9nIGthbiBpa2tlIHRqZWtrZXM6ICc6J0ZpbGVybmUgZXIgaWtrZSBiaWxsZWRlciBvZyBrYW4gaWtrZSB0amVra2VzOiAnKStyZWplY3RlZC5zbGljZSgwLDMpLmpvaW4oJywgJykrKHJlamVjdGVkLmxlbmd0aD4zPycgb2cgJysocmVqZWN0ZWQubGVuZ3RoLTMpKycgbWVyZSc6JycpKycuIFbDpmxnIGVuIEpQRy0sIFBORy0sIEdJRi0sIEJNUC0sIFdlYlAtIGVsbGVyIFNWRy1maWwuJyk7CiBpZihyZWplY3RlZC5sZW5ndGh8fGRhbWFnZWQubGVuZ3RoKXN0YXR1cyhtc2cuZmlsdGVyKG09PiEvIGFkZGVkXC4kLy50ZXN0KG0pKS5qb2luKCcgJyksJ2Vycm9yJyk7ZWxzZSBpZihkdXBlcylzdGF0dXMobXNnLmZpbHRlcihtPT4hLyBhZGRlZFwuJC8udGVzdChtKSkuam9pbignICcpKTtlbHNlIHN0YXR1cygnJykKfQpmdW5jdGlvbiBkcm9wQ29uZmlybShuKXtjb25zdCBkPSQoJ2NpbC1kcm9wJyk7aWYoIWQpcmV0dXJuO2xldCBvaz1kLnF1ZXJ5U2VsZWN0b3IoJy5jaWwtZHJvcC1vaycpO2lmKCFvayl7b2s9ZWwoJ2RpdicsJ2NpbC1kcm9wLW9rJyk7b2suc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtvay5pbm5lckhUTUw9JzxzcGFuIGNsYXNzPSJjaWwtZHJvcC1va2ljb24iPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiLz48L3N2Zz48L3NwYW4+PHN0cm9uZyBjbGFzcz0iY2lsLWRyb3Atb2t0ZXh0Ij48L3N0cm9uZz48c3BhbiBjbGFzcz0iY2lsLWRyb3Atb2tzdWIiPlNlIGRldGFsamVybmUgbmVkZW5mb3I8L3NwYW4+JztkLmFwcGVuZChvayl9b2sucXVlcnlTZWxlY3RvcignLmNpbC1kcm9wLW9rdGV4dCcpLnRleHRDb250ZW50PW4rKG49PT0xPycgYmlsbGVkZSB0aWxmw7hqZXQnOicgYmlsbGVkZXIgdGlsZsO4amV0Jyk7b2suY2xhc3NMaXN0LnJlbW92ZSgnY2lsLXNob3cnKTt2b2lkIG9rLm9mZnNldFdpZHRoO29rLmNsYXNzTGlzdC5hZGQoJ2NpbC1zaG93Jyk7Y2xlYXJUaW1lb3V0KGRyb3BDb25maXJtLnQpO2Ryb3BDb25maXJtLnQ9c2V0VGltZW91dCgoKT0+b2suY2xhc3NMaXN0LnJlbW92ZSgnY2lsLXNob3cnKSwyMjAwKX0KZnVuY3Rpb24gcHVtcCgpe3doaWxlKGFjdGl2ZTxSRUFEX0NPTkNVUlJFTkNZJiZxdWV1ZS5sZW5ndGgpe2NvbnN0IGl0ZW09cXVldWUuc2hpZnQoKTtpZighYWxpdmUoaXRlbSkpY29udGludWU7YWN0aXZlKys7aW5zcGVjdChpdGVtKS5maW5hbGx5KCgpPT57YWN0aXZlLS07cHVtcCgpfSl9fQpmdW5jdGlvbiBnaWZGcmFtZXMoYil7CiBpZihiLmxlbmd0aDwxMylyZXR1cm4gMDtsZXQgcD0xMyxmcmFtZXM9MDtpZihiWzEwXSYweDgwKXArPTMqKDE8PCgoYlsxMF0mNykrMSkpOwogY29uc3Qgc2tpcEJsb2Nrcz0oKT0+e3doaWxlKHA8Yi5sZW5ndGgmJmJbcF0hPT0wKXArPWJbcF0rMTtwKyt9Owogd2hpbGUocDxiLmxlbmd0aCl7Y29uc3QgYz1iW3ArK107aWYoYz09PTB4M0IpYnJlYWs7aWYoYz09PTB4MjEpe3ArKztza2lwQmxvY2tzKCl9ZWxzZSBpZihjPT09MHgyQyl7ZnJhbWVzKys7aWYocCs5PmIubGVuZ3RoKWJyZWFrO2NvbnN0IHBrPWJbcCs4XTtwKz05O2lmKHBrJjB4ODApcCs9MyooMTw8KChwayY3KSsxKSk7cCsrO3NraXBCbG9ja3MoKX1lbHNlIGJyZWFrfQogcmV0dXJuIGZyYW1lczsKfQphc3luYyBmdW5jdGlvbiBpc0FwbmcoZmlsZSl7Y29uc3QgYj1hd2FpdCBoZWFkQnl0ZXMoZmlsZSw0Kk1CKSx2PW5ldyBEYXRhVmlldyhiLmJ1ZmZlcik7bGV0IHA9ODt3aGlsZShwKzg8PWIubGVuZ3RoKXtjb25zdCBsZW49di5nZXRVaW50MzIocCksdD1TdHJpbmcuZnJvbUNoYXJDb2RlKGJbcCs0XSxiW3ArNV0sYltwKzZdLGJbcCs3XSk7aWYodD09PSdhY1RMJylyZXR1cm4gdHJ1ZTtpZih0PT09J0lEQVQnfHx0PT09J0lFTkQnKXJldHVybiBmYWxzZTtwKz0xMitsZW59cmV0dXJuIGZhbHNlfQphc3luYyBmdW5jdGlvbiBpc0FuaW1hdGVkV2VicChmaWxlKXtjb25zdCBiPWF3YWl0IGhlYWRCeXRlcyhmaWxlLDMyKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShiWzEyXSxiWzEzXSxiWzE0XSxiWzE1XSk9PT0nVlA4WCcmJihiWzIwXSYweDAyKT09PTB4MDJ9CmZ1bmN0aW9uIGxvYWRJbWcoYmxvYil7cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pntjb25zdCB1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxpbWc9bmV3IEltYWdlKCk7aW1nLm9ubG9hZD0oKT0+cmVzb2x2ZSh7c291cmNlOmltZyx3aWR0aDppbWcubmF0dXJhbFdpZHRoLGhlaWdodDppbWcubmF0dXJhbEhlaWdodCxyZWxlYXNlOigpPT5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCl9KTtpbWcub25lcnJvcj0oKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodXJsKTsvKiBGYWxsYmFjayBmb3Igc2l0ZXMgd2hvc2Ugc2VjdXJpdHkgcG9saWN5IGJsb2NrcyBibG9iOiBpbWFnZXMgKi9jb25zdCByPW5ldyBGaWxlUmVhZGVyKCk7ci5vbmxvYWQ9KCk9Pntjb25zdCBpMj1uZXcgSW1hZ2UoKTtpMi5vbmxvYWQ9KCk9PnJlc29sdmUoe3NvdXJjZTppMix3aWR0aDppMi5uYXR1cmFsV2lkdGgsaGVpZ2h0OmkyLm5hdHVyYWxIZWlnaHQscmVsZWFzZTooKT0+e319KTtpMi5vbmVycm9yPSgpPT5yZWplY3QoRXJyb3IoJ2RlY29kZScpKTtpMi5zcmM9ci5yZXN1bHR9O3Iub25lcnJvcj0oKT0+cmVqZWN0KEVycm9yKCdkZWNvZGUnKSk7ci5yZWFkQXNEYXRhVVJMKGJsb2IpfTtpbWcuc3JjPXVybH0pfQphc3luYyBmdW5jdGlvbiBkZWNvZGVSYXN0ZXIoZmlsZSl7CiBpZih0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXA9PT0nZnVuY3Rpb24nKXt0cnl7Y29uc3QgYm1wPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGZpbGUse2ltYWdlT3JpZW50YXRpb246J2Zyb20taW1hZ2UnfSk7cmV0dXJuIHtzb3VyY2U6Ym1wLHdpZHRoOmJtcC53aWR0aCxoZWlnaHQ6Ym1wLmhlaWdodCxyZWxlYXNlOigpPT5ibXAuY2xvc2UmJmJtcC5jbG9zZSgpfX1jYXRjaChlKXt9fQogcmV0dXJuIGxvYWRJbWcoZmlsZSk7Cn0KYXN5bmMgZnVuY3Rpb24gc3ZnSW5mbyhmaWxlKXsKIGlmKGZpbGUuc2l6ZT5NQVhfU1ZHX0JZVEVTKXRocm93IEVycm9yKCdTVkctZmlsZW4gZXIgZm9yIHN0b3IgdGlsIGF0IGJsaXZlIHRqZWtrZXQgc2lra2VydCAob3ZlciAxMCBNQikuJyk7CiBjb25zdCBkb2M9bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhhd2FpdCBmaWxlLnRleHQoKSwnaW1hZ2Uvc3ZnK3htbCcpLHN2Zz1kb2MuZG9jdW1lbnRFbGVtZW50OwogaWYoZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXJzZXJlcnJvcicpLmxlbmd0aHx8IXN2Z3x8c3ZnLmxvY2FsTmFtZSE9PSdzdmcnKXRocm93IEVycm9yKCdTVkctZmlsZW4gc2VyIHVkIHRpbCBhdCB2w6ZyZSBmZWpsYmVow6ZmdGV0IG9nIGthbiBpa2tlIGtvbnZlcnRlcmVzIGhlci4nKTsKIGNvbnN0IGxlbj12PT57Y29uc3QgbT0vXlxzKihbMC05XSpcLj9bMC05XSsoPzplWystXT9cZCspPylccyoocHgpP1xzKiQvaS5leGVjKHZ8fCcnKTtyZXR1cm4gbT9wYXJzZUZsb2F0KG1bMV0pOjB9OwogbGV0IHc9bGVuKHN2Zy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpLGg9bGVuKHN2Zy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKTsKIGNvbnN0IHZiPShzdmcuZ2V0QXR0cmlidXRlKCd2aWV3Qm94Jyl8fCcnKS50cmltKCkuc3BsaXQoL1tccyxdKy8pLm1hcChOdW1iZXIpLGhhc1ZCPXZiLmxlbmd0aD09PTQmJnZiLmV2ZXJ5KGlzRmluaXRlKSYmdmJbMl0+MCYmdmJbM10+MDsKIGlmKGhhc1ZCKXtpZih3JiYhaCloPXcqdmJbM10vdmJbMl07ZWxzZSBpZihoJiYhdyl3PWgqdmJbMl0vdmJbM107ZWxzZSBpZighdyYmIWgpe3c9dmJbMl07aD12YlszXX19CiBsZXQgYXNzdW1lZD1mYWxzZTtpZighd3x8IWgpe3c9MzAwO2g9MTUwO2Fzc3VtZWQ9dHJ1ZX0KIHJldHVybiB7c3ZnLGhhc1ZCLHdpZHRoOk1hdGgubWF4KDEsTWF0aC5yb3VuZCh3KSksaGVpZ2h0Ok1hdGgubWF4KDEsTWF0aC5yb3VuZChoKSksYXNzdW1lZH07Cn0KZnVuY3Rpb24gc3ZnQmxvYihpbmZvLHcsaCl7Y29uc3Qgcz1pbmZvLnN2Zy5jbG9uZU5vZGUodHJ1ZSk7aWYoIWluZm8uaGFzVkIpcy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCcwIDAgJytpbmZvLndpZHRoKycgJytpbmZvLmhlaWdodCk7cy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyxTdHJpbmcodykpO3Muc2V0QXR0cmlidXRlKCdoZWlnaHQnLFN0cmluZyhoKSk7cmV0dXJuIG5ldyBCbG9iKFtuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHMpXSx7dHlwZTonaW1hZ2Uvc3ZnK3htbCd9KX0KYXN5bmMgZnVuY3Rpb24gaW5zcGVjdChpdGVtKXsKIHRyeXsKICBpZihpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcpe2NvbnN0IGluZm89YXdhaXQgc3ZnSW5mbyhpdGVtLmZpbGUpO2l0ZW0uc3ZnPWluZm87aXRlbS53aWR0aD1pbmZvLndpZHRoO2l0ZW0uaGVpZ2h0PWluZm8uaGVpZ2h0O2l0ZW0uc3ZnQXNzdW1lZD1pbmZvLmFzc3VtZWR9CiAgZWxzZXsKICAgaWYoaXRlbS50eXBlPT09J2ltYWdlL2dpZicmJml0ZW0uZmlsZS5zaXplPD1NQVhfR0lGX1NDQU4pe2l0ZW0uZnJhbWVzPWdpZkZyYW1lcyhuZXcgVWludDhBcnJheShhd2FpdCBpdGVtLmZpbGUuYXJyYXlCdWZmZXIoKSkpO2l0ZW0uYW5pbWF0ZWQ9aXRlbS5mcmFtZXM+MX0KICAgZWxzZSBpZihpdGVtLnR5cGU9PT0naW1hZ2UvcG5nJylpdGVtLmFuaW1hdGVkPWF3YWl0IGlzQXBuZyhpdGVtLmZpbGUpOwogICBlbHNlIGlmKGl0ZW0udHlwZT09PSdpbWFnZS93ZWJwJylpdGVtLmFuaW1hdGVkPWF3YWl0IGlzQW5pbWF0ZWRXZWJwKGl0ZW0uZmlsZSk7CiAgIGlmKGl0ZW0uYW5pbWF0ZWQmJml0ZW0udHlwZT09PSdpbWFnZS9wbmcnJiZpdGVtLm91dHB1dD09PSdhdXRvJylpdGVtLm91dHB1dD0nb3JpZ2luYWwnOwogICBsZXQgc3JjO3RyeXtzcmM9YXdhaXQgZGVjb2RlUmFzdGVyKGl0ZW0uZmlsZSl9Y2F0Y2goZSl7dGhyb3cgRXJyb3IoJ0RpbiBicm93c2VyIGthbiBpa2tlIGzDpnNlIGRlbm5lICcrdHlwZUxhYmVsKGl0ZW0udHlwZSkrJy1maWwsIHPDpSBkZW4ga2FuIGlra2UgdGpla2tlcyBlbGxlciBrb252ZXJ0ZXJlcyBoZXIuIEVrc3BvcnTDqXIgZGVuIHNvbSBKUEcgZWxsZXIgUE5HIGZyYSBkaXQgYmlsbGVkcHJvZ3JhbS4nKX0KICAgaXRlbS53aWR0aD1zcmMud2lkdGg7aXRlbS5oZWlnaHQ9c3JjLmhlaWdodDtzcmMucmVsZWFzZSgpOwogICBpZighaXRlbS53aWR0aHx8IWl0ZW0uaGVpZ2h0KXRocm93IEVycm9yKCdCaWxsZWRldHMgbcOlbCBrdW5uZSBpa2tlIGzDpnNlcy4nKTsKICB9CiB9Y2F0Y2goZSl7aXRlbS5lcnJvcj1lLm1lc3NhZ2V8fCdCaWxsZWRldCBrdW5uZSBpa2tlIGzDpnNlcy4nfQogZmluYWxseXtpdGVtLmxvYWRpbmc9ZmFsc2U7aWYoYWxpdmUoaXRlbSkpcmVuZGVyKCl9Cn0KLyogLS0tLS0tLS0tLSBwZXItaXRlbSBzdGF0ZSAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIGRyb3BVcmwoaXRlbSxrKXtpZihpdGVtLnVybHNba10pe1VSTC5yZXZva2VPYmplY3RVUkwoaXRlbS51cmxzW2tdKTtkZWxldGUgaXRlbS51cmxzW2tdfX0KZnVuY3Rpb24gb2JqVXJsKGl0ZW0sayxibG9iKXtpZighaXRlbS51cmxzW2tdKWl0ZW0udXJsc1trXT1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO3JldHVybiBpdGVtLnVybHNba119CmZ1bmN0aW9uIGludmFsaWRhdGUoaXRlbSl7aXRlbS5yZXN1bHQ9bnVsbDtpdGVtLnJldisrO2l0ZW0uYnVzeT1mYWxzZTtkcm9wVXJsKGl0ZW0sJ3JlcycpfQpmdW5jdGlvbiBkaXNjYXJkKGl0ZW0pe2ludmFsaWRhdGUoaXRlbSk7ZHJvcFVybChpdGVtLCdvcmlnJyl9CmZ1bmN0aW9uIGNoYW5nZUl0ZW0oaXRlbSxwcm9wLHZhbHVlKXtpdGVtW3Byb3BdPXZhbHVlO2lmKHByb3A9PT0ncmVzaXplJylpdGVtLnJlc2l6ZUNob3Nlbj10cnVlO2lmKHByb3A9PT0ncmVzaXplJyYmdmFsdWU9PT0nY3VzdG9tJyYmIWl0ZW0uY3VzdG9tV2lkdGgpaXRlbS5jdXN0b21XaWR0aD1NYXRoLm1pbihpdGVtLndpZHRofHwxMjAwLDEyMDApO2lmKFsnbGF5b3V0Jywnd1BsYWNlbWVudCcsJ3dUaGVtZScsJ3dWYXJpYW50JywnbGF5b3V0V2lkdGgnLCdzaXRlV2lkdGgnLCdsYXlvdXRXaWR0aFVuaXQnLCdzaXRlV2lkdGhVbml0Jywnc2l0ZUJhc2UnXS5pbmRleE9mKHByb3ApPDB8fGl0ZW0ucmVzaXplPT09J3JlY29tbWVuZGVkJylpbnZhbGlkYXRlKGl0ZW0pO3JlbmRlcigpfQpmdW5jdGlvbiByZXNpemVNb2RlKGl0ZW0pe2NvbnN0IHJlYz1zdWdnZXN0ZWQoaXRlbSk7aWYoaXRlbS5yZXNpemU9PT0ncmVjb21tZW5kZWQnJiYhcmVjKXJldHVybiAnb3JpZ2luYWwnO2lmKGl0ZW0ucmVzaXplPT09J3JlY29tbWVuZGVkJyYmIWl0ZW0ucmVzaXplQ2hvc2VuJiZpdGVtLnR5cGUhPT0naW1hZ2Uvc3ZnK3htbCcmJml0ZW0ud2lkdGg+MCYmaXRlbS53aWR0aDxyZWMqMC45KXJldHVybiAnb3JpZ2luYWwnO3JldHVybiBpdGVtLnJlc2l6ZX0KZnVuY3Rpb24gb3V0VHlwZShpdGVtKXtyZXR1cm4gaXRlbS5vdXRwdXQ9PT0nb3JpZ2luYWwnPycnOml0ZW0ub3V0cHV0fQpmdW5jdGlvbiBjYW5PcHRpbWlzZShpdGVtKXtyZXR1cm4gIWl0ZW0ubG9hZGluZyYmIWl0ZW0uZXJyb3ImJiFpdGVtLmJ1c3kmJiEhb3V0VHlwZShpdGVtKSYmaXRlbS53aWR0aD4wJiZpdGVtLmhlaWdodD4wfQpmdW5jdGlvbiB0YXJnZXRTaXplKGl0ZW0pewogY29uc3QgdzA9aXRlbS53aWR0aCxoMD1pdGVtLmhlaWdodCxzdmc9aXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnLG1vZGU9cmVzaXplTW9kZShpdGVtKTtsZXQgdz13MDsKIGlmKG1vZGU9PT0ncmVjb21tZW5kZWQnKXc9c3VnZ2VzdGVkKGl0ZW0pOwogZWxzZSBpZihtb2RlPT09J2N1c3RvbScpe2NvbnN0IG49TnVtYmVyKGl0ZW0uY3VzdG9tV2lkdGgpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDF8fG4+TUFYX0lOUFVUX1dJRFRIKXRocm93IEVycm9yKCdBbmdpdiBldCBoZWx0IHRhbCBtZWxsZW0gMSBvZyAxMi4wMDAgZm9yIGJyZWRkZW4uJyk7dz1ufQogY29uc3QgaD1NYXRoLm1heCgxLE1hdGgucm91bmQoaDAqdy93MCkpOwogaWYodz5NQVhfU0lERXx8aD5NQVhfU0lERXx8dypoPk1BWF9QSVhFTFMpdGhyb3cgRXJyb3IoJ1Jlc3VsdGF0ZXQgdmlsbGUgYmxpdmUgJyt3Kycgw5cgJytoKycgcHgsIGh2aWxrZXQgZXIgZm9yIHN0b3J0IHRpbCBhdCBibGl2ZSBiZWhhbmRsZXQgc2lra2VydCBpIGFsbGUgYnJvd3NlcmUgKGdyw6Zuc2UgMTYsNyBtZWdhcGl4ZWwpLiBWw6ZsZyBlbiBtaW5kcmUgYnJlZGRlLicpOwogcmV0dXJuIHt3LGh9Owp9CmZ1bmN0aW9uIHNhZmVCYXNlKG5hbWUpe2xldCBiPShuYW1lfHwnJykubm9ybWFsaXplKCdORkMnKS5yZXBsYWNlKC9cLlteLl0qJC8sJycpLnJlcGxhY2UoL1tcdTAwMDAtXHUwMDFmXHUwMDdmXC9cXDoqPyI8PnxdKy9nLCdfJykucmVwbGFjZSgvXltccy5dK3xbXHMuXSskL2csJycpO3JldHVybiAoYnx8J2ltYWdlJykuc2xpY2UoMCwxMjApfQpmdW5jdGlvbiBhbmFseXNlKHNvdXJjZSx3LGgpewogdHJ5e2NvbnN0IHM9TWF0aC5taW4oMSwxMjgvTWF0aC5tYXgodyxoKSksY3c9TWF0aC5tYXgoMSxNYXRoLnJvdW5kKHcqcykpLGNoPU1hdGgubWF4KDEsTWF0aC5yb3VuZChoKnMpKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2Mud2lkdGg9Y3c7Yy5oZWlnaHQ9Y2g7CiAgY29uc3QgeD1jLmdldENvbnRleHQoJzJkJyx7d2lsbFJlYWRGcmVxdWVudGx5OnRydWV9KTt4LmltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZTt4LmRyYXdJbWFnZShzb3VyY2UsMCwwLGN3LGNoKTsKICBjb25zdCBkPXguZ2V0SW1hZ2VEYXRhKDAsMCxjdyxjaCkuZGF0YSxzZWVuPW5ldyBTZXQoKTtsZXQgYWxwaGE9ZmFsc2U7CiAgZm9yKGxldCBpPTA7aTxkLmxlbmd0aDtpKz00KXtpZihkW2krM108MjUwKWFscGhhPXRydWU7aWYoc2Vlbi5zaXplPD0xMDI0KXNlZW4uYWRkKChkW2ldPDwxNil8KGRbaSsxXTw8OCl8ZFtpKzJdKX0KICBjLndpZHRoPWMuaGVpZ2h0PTA7cmV0dXJuIHthbHBoYSxwaG90bzpzZWVuLnNpemU+MTAyNH07CiB9Y2F0Y2goZSl7cmV0dXJuIG51bGx9Cn0KLyogd2hpbGUgdGhlIG1hbnVhbCBlZGl0b3IgaXMgb3BlbiwgbG9jayBldmVyeXRoaW5nIGVsc2UgZm9yIHRoYXQgaW1hZ2Ugc28gb25seSBEb25lIG9yIENhbmNlbCBhcHBseSAqLwpjb25zdCBfX3JlbmRlckJhc2U9cmVuZGVyO3JlbmRlcj1mdW5jdGlvbigpe19fcmVuZGVyQmFzZSgpOwogLyogcmVzdWx0IGJ1dHRvbnMgc2l0IG9uIHRoZSBzYW1lIHJvdyBhcyBPcHRpbWlzZSwgdW5kZXIgdGhlIG9wdGltaXNlZCBpbWFnZSAqLwogY29uc3QgY2FyZHM9cm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcjY2lsLWZpbGVzID4gLmNpbC1maWxlJyk7aXRlbXMuZm9yRWFjaCgoaXQsaXgpPT57Y29uc3QgY2FyZD1jYXJkc1tpeF07aWYoIWNhcmR8fCFpdC5yZXN1bHR8fGl0LnJlc3VsdC5rZXB0T3JpZ2luYWx8fCFpdC5jb21wYXJlfHxpdC5lZGl0aW5nKXJldHVybjtjb25zdCBhY3RzPVsuLi5jYXJkLmNoaWxkcmVuXS5maWx0ZXIoeD0+eC5jbGFzc0xpc3QuY29udGFpbnMoJ2NpbC1hY3Rpb25zJykpLnBvcCgpO2lmKCFhY3RzKXJldHVybjtjb25zdCBMPWVsKCdkaXYnLCdjaWwtYWN0cy1ncm91cCcpLFI9ZWwoJ2RpdicsJ2NpbC1hY3RzLWdyb3VwJyk7d2hpbGUoYWN0cy5maXJzdENoaWxkKUwuYXBwZW5kKGFjdHMuZmlyc3RDaGlsZCk7Ui5hcHBlbmQoYnV0dG9uKCdEb3dubG9hZCAnK3R5cGVMYWJlbChpdC5yZXN1bHQudHlwZSksKCk9Pnt0cmFjaygnZG93bmxvYWQnKTtkb3dubG9hZChpdC5yZXN1bHQuYmxvYixpdC5yZXN1bHQubmFtZSl9LCcnLGl0LmlkKyctZGwnKSk7aWYoaXQudHJhbnNwKVIuYXBwZW5kKGJ1dHRvbignUmVkaWfDqXIgYmFnZ3J1bmQgbWFudWVsdCcsKCk9Pm9wZW5FZGl0b3IoaXQpLCdjaWwtYnRuLXNlY29uZGFyeScsaXQuaWQrJy1lZGl0JykpO2lmKChpdC5jbGlja3N8fFtdKS5sZW5ndGgpUi5hcHBlbmQoYnV0dG9uKCdGb3J0cnlkIG1hbnVlbGxlIMOmbmRyaW5nZXInLCgpPT57aXQuY2xpY2tzPVtdO29wdGltaXNlKGl0KX0sJ2NpbC1idG4tdGV4dCcsaXQuaWQrJy11bmRvZWQnKSk7YWN0cy5jbGFzc0xpc3QuYWRkKCdjaWwtYWN0aW9ucy1zcGxpdCcpO2FjdHMuYXBwZW5kKEwsUil9KTtjb25zdCBlZHM9cm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuY2lsLWVkaXRvcicpO2Vkcy5mb3JFYWNoKGVkPT57Y29uc3QgY2FyZD1lZC5jbG9zZXN0KCcuY2lsLWZpbGUnKTtpZighY2FyZClyZXR1cm47Y2FyZC5jbGFzc0xpc3QuYWRkKCdjaWwtbG9ja2VkJyk7Y2FyZC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3QsaW5wdXQsYnV0dG9uLHRleHRhcmVhLHN1bW1hcnknKS5mb3JFYWNoKHg9PntpZih4LmNsb3Nlc3QoJy5jaWwtZWRpdG9yJykpcmV0dXJuO2lmKHgudGFnTmFtZT09PSdTVU1NQVJZJyl7eC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCd0cnVlJyk7eC50YWJJbmRleD0tMX1lbHNlIHguZGlzYWJsZWQ9dHJ1ZX0pO2NvbnN0IGFjdHM9Wy4uLmNhcmQucXVlcnlTZWxlY3RvckFsbCgnLmNpbC1hY3Rpb25zJyldLnBvcCgpO2lmKGFjdHMmJiFhY3RzLnF1ZXJ5U2VsZWN0b3IoJy5jaWwtbG9jay1ub3RlJykpYWN0cy5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwgY2lsLWxvY2stbm90ZScsJ0fDuHIgcmVkaWdlcmluZ2VuIGFmIGJhZ2dydW5kZW4gZsOmcmRpZyBmw7hyc3Q6IGtsaWsgRsOmcmRpZyBlbGxlciBBbm51bGzDqXIuJykpfSk7aWYoZWRzLmxlbmd0aCl7WydjaWwtb3B0YWxsJywnY2lsLXppcCddLmZvckVhY2goaWQ9Pntjb25zdCBiPSQoaWQpO2lmKGIpYi5kaXNhYmxlZD10cnVlfSl9fTsKLyogLS0tLS0tLS0tLSBtYW51YWwgYmFja2dyb3VuZCBlZGl0b3I6IGVkaXRzIGEgY2FudmFzIGRpcmVjdGx5LCBvcHRpbWlzZXMgb25jZSBvbiBEb25lIC0tLS0tLS0tLS0gKi8KY29uc3QgWk9PTVM9WzAuMjUsMC41LDEsMiw0LDhdOwpmdW5jdGlvbiBvcGVuRWRpdG9yKGl0ZW0pe2l0ZW0uZWRpdGluZz10cnVlO2l0ZW0uZWRab29tPTA7aXRlbS5lZFRvb2w9aXRlbS5lZFRvb2x8fCdmaWxsJztpdGVtLmVkVG9sPWl0ZW0uZWRUb2x8fGl0ZW0udG9sfHw0MDtpdGVtLmVkQnJ1c2g9aXRlbS5lZEJydXNofHwxNjtpdGVtLmVkU3RhY2s9W107aXRlbS5kcmFmdD1bXTtpdGVtLmVkQ2FudmFzPW51bGw7cmVuZGVyKCk7CiBkZWNvZGVSYXN0ZXIoaXRlbS5yZXN1bHQuYmxvYikudGhlbihzcmM9PntpZighaXRlbS5lZGl0aW5nKXJldHVybjtjb25zdCBjdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjdi5jbGFzc05hbWU9J2NpbC1lZC1jYW52YXMnO2N2LndpZHRoPXNyYy53aWR0aDtjdi5oZWlnaHQ9c3JjLmhlaWdodDtjdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSkuZHJhd0ltYWdlKHNyYy5zb3VyY2UsMCwwKTtpZihzcmMucmVsZWFzZSlzcmMucmVsZWFzZSgpO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxlPT57aWYoaXRlbS5lZFRvb2whPT0nYnJ1c2gnKWVkQ2xpY2soaXRlbSxlKX0pO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxlPT5lZEJydXNoU3RhcnQoaXRlbSxlKSk7Y3YuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLGU9PmVkQnJ1c2hNb3ZlKGl0ZW0sZSkpO1sncG9pbnRlcnVwJywncG9pbnRlcmNhbmNlbCcsJ3BvaW50ZXJsZWF2ZSddLmZvckVhY2godD0+Y3YuYWRkRXZlbnRMaXN0ZW5lcih0LCgpPT5lZEJydXNoRW5kKGl0ZW0pKSk7Y3YuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLGU9PmVkUmluZyhpdGVtLGUpKTtjdi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLGU9PmVkUmluZyhpdGVtLGUpKTtjdi5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCgpPT5lZFJpbmdIaWRlKGl0ZW0pKTtpdGVtLmVkQ2FudmFzPWN2O3JlbmRlcigpfSkuY2F0Y2goKCk9PntpdGVtLmVkaXRpbmc9ZmFsc2U7c3RhdHVzKCdFZGl0b3JlbiBrdW5uZSBpa2tlIMOlYm5lIGJpbGxlZGV0LicpO3JlbmRlcigpfSl9CmZ1bmN0aW9uIGZsb29kQ2xlYXIoZCx3LGgsZngsZnksdG9sKXtjb25zdCBuPXcqaCxjeD1NYXRoLm1pbih3LTEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKGZ4KncpKSksY3k9TWF0aC5taW4oaC0xLE1hdGgubWF4KDAsTWF0aC5mbG9vcihmeSpoKSkpLHMwPWN5KncrY3g7aWYoZFtzMCo0KzNdPT09MClyZXR1cm4gZmFsc2U7Y29uc3QgcjA9ZFtzMCo0XSxnMD1kW3MwKjQrMV0sYjA9ZFtzMCo0KzJdLGRvbmU9bmV3IFVpbnQ4QXJyYXkobikscT1uZXcgVWludDMyQXJyYXkobik7bGV0IHFoPTAscXQ9MDtjb25zdCBwYz1wPT57aWYoIWRvbmVbcF0mJmRbcCo0KzNdPjAmJk1hdGgubWF4KE1hdGguYWJzKGRbcCo0XS1yMCksTWF0aC5hYnMoZFtwKjQrMV0tZzApLE1hdGguYWJzKGRbcCo0KzJdLWIwKSk8PXRvbCl7ZG9uZVtwXT0xO3FbcXQrK109cH19O3BjKHMwKTt3aGlsZShxaDxxdCl7Y29uc3QgcD1xW3FoKytdLHg9cCV3O2lmKHg+MClwYyhwLTEpO2lmKHg8dy0xKXBjKHArMSk7aWYocD49dylwYyhwLXcpO2lmKHA8bi13KXBjKHArdyl9Zm9yKGxldCBpPTA7aTxxdDtpKyspZFtxW2ldKjQrM109MDtyZXR1cm4gcXQ+MH0KZnVuY3Rpb24gZWRDbGljayhpdGVtLGUpe2NvbnN0IGN2PWl0ZW0uZWRDYW52YXM7aWYoIWN2KXJldHVybjtjb25zdCBiPWN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFiLndpZHRofHwhYi5oZWlnaHQpcmV0dXJuO2NvbnN0IGZ4PShlLmNsaWVudFgtYi5sZWZ0KS9iLndpZHRoLGZ5PShlLmNsaWVudFktYi50b3ApL2IuaGVpZ2h0LGN0eD1jdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSksaW1nPWN0eC5nZXRJbWFnZURhdGEoMCwwLGN2LndpZHRoLGN2LmhlaWdodCksc25hcD1uZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nLmRhdGEpOwogaWYoIWZsb29kQ2xlYXIoaW1nLmRhdGEsY3Yud2lkdGgsY3YuaGVpZ2h0LGZ4LGZ5LGl0ZW0uZWRUb2x8fDQwKSlyZXR1cm47aWYoaXRlbS5lZFN0YWNrLmxlbmd0aD49MjApaXRlbS5lZFN0YWNrLnNoaWZ0KCk7aXRlbS5lZFN0YWNrLnB1c2goe2RhdGE6c25hcCxuOml0ZW0uZHJhZnQubGVuZ3RofSk7Y3R4LnB1dEltYWdlRGF0YShpbWcsMCwwKTtpdGVtLmRyYWZ0LnB1c2goe3g6ZngseTpmeSx0Oml0ZW0uZWRUb2x8fDQwfSk7cmVuZGVyKCl9CmZ1bmN0aW9uIGVkUHQoaXRlbSxlKXtjb25zdCBjdj1pdGVtLmVkQ2FudmFzLGI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHtmeDooZS5jbGllbnRYLWIubGVmdCkvYi53aWR0aCxmeTooZS5jbGllbnRZLWIudG9wKS9iLmhlaWdodH19CmZ1bmN0aW9uIGVkQnJ1c2hTdGFydChpdGVtLGUpe2lmKGl0ZW0uZWRUb29sIT09J2JydXNoJ3x8IWl0ZW0uZWRDYW52YXMpcmV0dXJuO2UucHJldmVudERlZmF1bHQoKTtjb25zdCBjdj1pdGVtLmVkQ2FudmFzLGN0eD1jdi5nZXRDb250ZXh0KCcyZCcse3dpbGxSZWFkRnJlcXVlbnRseTp0cnVlfSk7aWYoaXRlbS5lZFN0YWNrLmxlbmd0aD49MjApaXRlbS5lZFN0YWNrLnNoaWZ0KCk7aXRlbS5lZFN0YWNrLnB1c2goe2RhdGE6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGN0eC5nZXRJbWFnZURhdGEoMCwwLGN2LndpZHRoLGN2LmhlaWdodCkuZGF0YSksbjppdGVtLmRyYWZ0Lmxlbmd0aH0pO3RyeXtjdi5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCl9Y2F0Y2goeCl7fWl0ZW0uZWRTdHJva2U9KGl0ZW0uZWRTdHJva2V8fDApKzE7aXRlbS5lZERvd249dHJ1ZTtpdGVtLmVkTGFzdD1udWxsO2VkQnJ1c2hNb3ZlKGl0ZW0sZSl9CmZ1bmN0aW9uIGVkQnJ1c2hNb3ZlKGl0ZW0sZSl7aWYoIWl0ZW0uZWREb3dufHwhaXRlbS5lZENhbnZhcylyZXR1cm47Y29uc3QgY3Y9aXRlbS5lZENhbnZhcyxjdHg9Y3YuZ2V0Q29udGV4dCgnMmQnLHt3aWxsUmVhZEZyZXF1ZW50bHk6dHJ1ZX0pLHA9ZWRQdChpdGVtLGUpLHB4PXAuZngqY3Yud2lkdGgscHk9cC5meSpjdi5oZWlnaHQscnI9aXRlbS5lZEJydXNoLzI7Y3R4LnNhdmUoKTtjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSdkZXN0aW5hdGlvbi1vdXQnO2N0eC5maWxsU3R5bGU9JyMwMDAnO2N0eC5zdHJva2VTdHlsZT0nIzAwMCc7Y3R4LmxpbmVDYXA9J3JvdW5kJztjdHgubGluZVdpZHRoPXJyKjI7aWYoaXRlbS5lZExhc3Qpe2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKGl0ZW0uZWRMYXN0LnB4LGl0ZW0uZWRMYXN0LnB5KTtjdHgubGluZVRvKHB4LHB5KTtjdHguc3Ryb2tlKCl9ZWxzZXtjdHguYmVnaW5QYXRoKCk7Y3R4LmFyYyhweCxweSxyciwwLE1hdGguUEkqMik7Y3R4LmZpbGwoKX1jdHgucmVzdG9yZSgpO2l0ZW0uZWRMYXN0PXtweCxweX07aXRlbS5kcmFmdC5wdXNoKHtiOjEsczppdGVtLmVkU3Ryb2tlLHg6cC5meCx5OnAuZnkscjpyci9jdi53aWR0aH0pfQpmdW5jdGlvbiBlZFJpbmdIaWRlKGl0ZW0pe2lmKGl0ZW0uZWRSaW5nRWwpaXRlbS5lZFJpbmdFbC5zdHlsZS5kaXNwbGF5PSdub25lJ30KZnVuY3Rpb24gZWRSaW5nKGl0ZW0sZSl7aWYoaXRlbS5lZFRvb2whPT0nYnJ1c2gnfHwhaXRlbS5lZENhbnZhc3x8ZS5wb2ludGVyVHlwZT09PSd0b3VjaCcpe2VkUmluZ0hpZGUoaXRlbSk7cmV0dXJufWxldCByaW5nPWl0ZW0uZWRSaW5nRWw7aWYoIXJpbmd8fCFyaW5nLmlzQ29ubmVjdGVkKXtyaW5nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3Jpbmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtyaW5nLnN0eWxlLmNzc1RleHQ9J3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MjE0NzQ4MzAwMDtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6NTAlO2JvcmRlcjoxcHggc29saWQgI2ZmZjtib3gtc2hhZG93OjAgMCAwIDFweCAjMUYzNTREO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtkaXNwbGF5Om5vbmUnO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocmluZyk7aXRlbS5lZFJpbmdFbD1yaW5nfWNvbnN0IGN2PWl0ZW0uZWRDYW52YXMsYj1jdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPU1hdGgubWF4KDQsaXRlbS5lZEJydXNoKihiLndpZHRoL2N2LndpZHRoKSk7cmluZy5zdHlsZS53aWR0aD1yaW5nLnN0eWxlLmhlaWdodD1kKydweCc7cmluZy5zdHlsZS5sZWZ0PWUuY2xpZW50WCsncHgnO3Jpbmcuc3R5bGUudG9wPWUuY2xpZW50WSsncHgnO3Jpbmcuc3R5bGUuZGlzcGxheT0nYmxvY2snfQpmdW5jdGlvbiBlZEJydXNoRW5kKGl0ZW0pe2lmKCFpdGVtLmVkRG93bilyZXR1cm47aXRlbS5lZERvd249ZmFsc2U7aXRlbS5lZExhc3Q9bnVsbDtyZW5kZXIoKX0KZnVuY3Rpb24gZWRVbmRvKGl0ZW0pe2NvbnN0IHN0PWl0ZW0uZWRTdGFjay5wb3AoKTtpZighc3QpcmV0dXJuO2NvbnN0IGN2PWl0ZW0uZWRDYW52YXMsY3R4PWN2LmdldENvbnRleHQoJzJkJyk7Y3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKHN0LmRhdGEsY3Yud2lkdGgsY3YuaGVpZ2h0KSwwLDApO2l0ZW0uZHJhZnQubGVuZ3RoPXN0Lm47cmVuZGVyKCl9CmZ1bmN0aW9uIGVkWm9vbShpdGVtLGRpcil7Y29uc3QgY3Y9aXRlbS5lZENhbnZhcztpZighY3YpcmV0dXJuO2NvbnN0IGN1cj1pdGVtLmVkWm9vbXx8KGN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoL2N2LndpZHRoKXx8MTtsZXQgejtpZihkaXI+MCl6PVpPT01TLmZpbmQodj0+dj5jdXIrMC4wMDEpfHxaT09NU1taT09NUy5sZW5ndGgtMV07ZWxzZSB6PVsuLi5aT09NU10ucmV2ZXJzZSgpLmZpbmQodj0+djxjdXItMC4wMDEpfHxaT09NU1swXTtpdGVtLmVkWm9vbT16O3JlbmRlcigpfQpmdW5jdGlvbiBlZGl0b3JGb3IoaXRlbSl7Y29uc3QgZWQ9ZWwoJ2RpdicsJ2NpbC1lZGl0b3InKSxjdj1pdGVtLmVkQ2FudmFzOwogY29uc3QgYnJ1c2g9aXRlbS5lZFRvb2w9PT0nYnJ1c2gnO2VkLmFwcGVuZChlbCgnc3Ryb25nJywnY2lsLWVkLXRpdGxlJywnUmVkaWfDqXIgYmFnZ3J1bmQnKSxlbCgncCcsJ2NpbC1zbWFsbCcsYnJ1c2g\/J1Ryw6ZrIGhlbiBvdmVyIGJpbGxlZGV0IGZvciBhdCB2aXNrZSB1ZC4gQnJ1ZyBkZXQgdGlsIHNtw6UgcGxldHRlciBvZyBrYW50ZXIsIGRlciBlciBzdsOmcmUgYXQga2xpa2tlIHDDpS4nOidLbGlrIHDDpSBldCBvbXLDpWRlIGZvciBhdCBnw7hyZSBkZXQgZ2VubmVtc2lndGlndC4gT21yw6VkZXRvbGVyYW5jZSBzdHlyZXIsIGh2b3IgZW5zIGZhcnZlcm5lIHNrYWwgdsOmcmUuIERlbiBww6V2aXJrZXIga3VuIGRpbmUga2xpayBoZXIsIGlra2UgZGVuIGF1dG9tYXRpc2tlIGZqZXJuZWxzZSBvdmVuZm9yLicpKTsKIGNvbnN0IG1vZGVzPWVsKCdkaXYnLCdjaWwtZWQtbW9kZXMnKSxncnA9ZWwoJ2RpdicsJ2NpbC1lZC1ncm91cCcpO2dycC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdncm91cCcpO2dycC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdWw6Zya3TDuGonKTtjb25zdCBJQ089e2ZpbGw6JzxwYXRoIGQ9Im0xOSAxMS04LTgtOC42IDguNmEyIDIgMCAwIDAgMCAyLjhsNS4yIDUuMmMuOC44IDIgLjggMi44IDBMMTkgMTFaIi8+PHBhdGggZD0ibTUgMiA1IDUiLz48cGF0aCBkPSJNMiAxM2gxNSIvPjxwYXRoIGQ9Ik0yMiAyMGEyIDIgMCAxIDEtNCAwYzAtMS42IDEuNy0yLjQgMi00IC4zIDEuNiAyIDIuNCAyIDRaIi8+JyxicnVzaDonPHBhdGggZD0ibTcgMjEtNC4zLTQuM2MtMS0xLTEtMi41IDAtMy40bDkuNi05LjZjMS0xIDIuNS0xIDMuNCAwbDUuNiA1LjZjMSAxIDEgMi41IDAgMy40TDEzIDIxIi8+PHBhdGggZD0iTTIyIDIxSDciLz48cGF0aCBkPSJtNSAxMSA5IDkiLz4nfTtbWydmaWxsJywnRmplcm4gb21yw6VkZSddLFsnYnJ1c2gnLCdWaXNrZWzDpmRlciddXS5mb3JFYWNoKChbayx0XSk9Pntjb25zdCBiPWVsKCdidXR0b24nLCdjaWwtZWQtbW9kZScpO2IudHlwZT0nYnV0dG9uJztiLnRpdGxlPXQ7Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLHQpO2Iuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLGl0ZW0uZWRUb29sPT09az8ndHJ1ZSc6J2ZhbHNlJyk7Yi5pbm5lckhUTUw9Jzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgYXJpYS1oaWRkZW49InRydWUiPicrSUNPW2tdKyc8L3N2Zz4nO2IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57aXRlbS5lZFRvb2w9aztyZW5kZXIoKX0pO2dycC5hcHBlbmQoYil9KTttb2Rlcy5hcHBlbmQoZ3JwLGVsKCdzcGFuJywnY2lsLWVkLXRvb2xuYW1lJyxicnVzaD8nVmlza2Vsw6ZkZXInOidGamVybiBvbXLDpWRlJykpOwogaWYoYnJ1c2gpe2NvbnN0IGJsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCBjaWwtcmFuZ2UgY2lsLWVkLXRvbCcpLGJxPWVsKCdpbnB1dCcpLGJ2PWVsKCdzcGFuJywnY2lsLXNtYWxsJywnVmlza2Vsw6ZkZXJzdMO4cnJlbHNlOiAnK2l0ZW0uZWRCcnVzaCsnIHB4Jyk7YnEudHlwZT0ncmFuZ2UnO2JxLm1pbj0nMic7YnEubWF4PScxMjAnO2JxLnN0ZXA9JzEnO2JxLnZhbHVlPVN0cmluZyhpdGVtLmVkQnJ1c2gpO2JxLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+e2J2LnRleHRDb250ZW50PSdWaXNrZWzDpmRlcnN0w7hycmVsc2U6ICcrYnEudmFsdWUrJyBweCc7aXRlbS5lZEJydXNoPU51bWJlcihicS52YWx1ZSk7Y29uc3QgY3Y9aXRlbS5lZENhbnZhcyxyaW5nPWl0ZW0uZWRSaW5nRWw7aWYoY3Ype2lmKCFyaW5nfHwhcmluZy5pc0Nvbm5lY3RlZCl7ZWRSaW5nKGl0ZW0se2NsaWVudFg6MCxjbGllbnRZOjAscG9pbnRlclR5cGU6J21vdXNlJ30pO31jb25zdCByZz1pdGVtLmVkUmluZ0VsLGI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1heCg0LGl0ZW0uZWRCcnVzaCooYi53aWR0aC9jdi53aWR0aCkpO3JnLnN0eWxlLndpZHRoPXJnLnN0eWxlLmhlaWdodD1kKydweCc7cmcuc3R5bGUubGVmdD0oYi5sZWZ0K2Iud2lkdGgvMikrJ3B4JztyZy5zdHlsZS50b3A9KGIudG9wK01hdGgubWluKGIuaGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodC1iLnRvcCkvMikrJ3B4JztyZy5zdHlsZS5kaXNwbGF5PSdibG9jayc7Y2xlYXJUaW1lb3V0KGl0ZW0uZWRSaW5nVCk7aXRlbS5lZFJpbmdUPXNldFRpbWVvdXQoKCk9PmVkUmluZ0hpZGUoaXRlbSksOTAwKX19KTtibC5hcHBlbmQoYnEsYnYpO21vZGVzLmFwcGVuZChibCl9CiBpZighYnJ1c2gpe2NvbnN0IHRsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCBjaWwtcmFuZ2UgY2lsLWVkLXRvbCcpLHE9ZWwoJ2lucHV0Jyksdj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ09tcsOlZGV0b2xlcmFuY2U6ICcrKGl0ZW0uZWRUb2x8fDQwKSk7cS50eXBlPSdyYW5nZSc7cS5taW49JzUnO3EubWF4PScxMjAnO3Euc3RlcD0nMSc7cS52YWx1ZT1TdHJpbmcoaXRlbS5lZFRvbHx8NDApO3EuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57di50ZXh0Q29udGVudD0nT21yw6VkZXRvbGVyYW5jZTogJytxLnZhbHVlO2l0ZW0uZWRUb2w9TnVtYmVyKHEudmFsdWUpfSk7dGwuYXBwZW5kKHEsdik7bW9kZXMuYXBwZW5kKHRsKX0KIGNvbnN0IGJhcj1lbCgnZGl2JywnY2lsLWVkLWJhcicpLHRiPSh0LGYsZGlzLGxhYik9Pntjb25zdCBiPWVsKCdidXR0b24nLCdjaWwtZWQtYnRuJyx0KTtiLnR5cGU9J2J1dHRvbic7aWYobGFiKWIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyxsYWIpO2IuZGlzYWJsZWQ9ISFkaXM7Yi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZik7cmV0dXJuIGJ9OwogY29uc3Qgej1pdGVtLmVkWm9vbTtiYXIuYXBwZW5kKHRiKCfiiJInLCgpPT5lZFpvb20oaXRlbSwtMSksIWN2LCdab29tIHVkJyksdGIoJysnLCgpPT5lZFpvb20oaXRlbSwxKSwhY3YsJ1pvb20gaW5kJyksdGIoJ1RpbHBhcycsKCk9PntpdGVtLmVkWm9vbT0wO3JlbmRlcigpfSwhY3Z8fCF6KSx0YignMTAwJScsKCk9PntpdGVtLmVkWm9vbT0xO3JlbmRlcigpfSwhY3Z8fHo9PT0xKSxlbCgnc3BhbicsJ2NpbC1lZC16b29tJyxjdj8oej9NYXRoLnJvdW5kKHoqMTAwKSsnJSc6J1RpbHBhcycpOicnKSx0YignRm9ydHJ5ZCcsKCk9PmVkVW5kbyhpdGVtKSwhaXRlbS5lZFN0YWNrLmxlbmd0aCksdGIoJ051bHN0aWwnLCgpPT5vcGVuRWRpdG9yKGl0ZW0pLCFpdGVtLmVkU3RhY2subGVuZ3RoKSk7CiBjb25zdCByb3c9ZWwoJ2RpdicsJ2NpbC1lZC10b29sYmFyJyk7cm93LmFwcGVuZChtb2RlcyxiYXIpO2VkLmFwcGVuZChyb3cpOwogY29uc3Qgdmlldz1lbCgnZGl2JywnY2lsLWVkLXZpZXcnKTtpZihjdil7Y3Yuc3R5bGUuY3Vyc29yPWJydXNoPydub25lJzonY3Jvc3NoYWlyJztpZighYnJ1c2gpZWRSaW5nSGlkZShpdGVtKTtpZih6KXtjdi5zdHlsZS53aWR0aD1NYXRoLnJvdW5kKGN2LndpZHRoKnopKydweCc7Y3Yuc3R5bGUubWF4V2lkdGg9J25vbmUnO2N2LnN0eWxlLm1heEhlaWdodD0nbm9uZSc7dmlldy5kYXRhc2V0Lnpvb209JzEnfWVsc2V7Y3Yuc3R5bGUud2lkdGg9Jyc7Y3Yuc3R5bGUubWF4V2lkdGg9JzEwMCUnO2N2LnN0eWxlLm1heEhlaWdodD0nNDgwcHgnfXZpZXcuYXBwZW5kKGN2KX1lbHNlIHZpZXcuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJywnSW5kbMOmc2Vy4oCmJykpO2VkLmFwcGVuZCh2aWV3KTsKIGNvbnN0IGZ0PWVsKCdkaXYnLCdjaWwtZWQtZm9vdCcpLGRvbmU9YnV0dG9uKCdGw6ZyZGlnJywoKT0+e2VkUmluZ0hpZGUoaXRlbSk7aXRlbS5jbGlja3M9KGl0ZW0uY2xpY2tzfHxbXSkuY29uY2F0KGl0ZW0uZHJhZnQpO2l0ZW0uZWRpdGluZz1mYWxzZTtpdGVtLmVkQ2FudmFzPW51bGw7aXRlbS5lZFN0YWNrPVtdO29wdGltaXNlKGl0ZW0pfSwnJyxpdGVtLmlkKyctZWRkb25lJyk7ZG9uZS5kaXNhYmxlZD0hY3Y7Y29uc3QgY2FuY2VsPWVsKCdidXR0b24nLCdjaWwtYnRuLXRleHQnLCdBbm51bGzDqXInKTtjYW5jZWwudHlwZT0nYnV0dG9uJztjYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57ZWRSaW5nSGlkZShpdGVtKTtpdGVtLmVkaXRpbmc9ZmFsc2U7aXRlbS5lZENhbnZhcz1udWxsO2l0ZW0uZWRTdGFjaz1bXTtpdGVtLmRyYWZ0PVtdO3JlbmRlcigpfSk7CiBmdC5hcHBlbmQoZG9uZSxjYW5jZWwpO2VkLmFwcGVuZChmdCk7cmV0dXJuIGVkfQovKiAtLS0tLS0tLS0tIGJhY2tncm91bmQgcmVtb3ZhbDogZmxvb2QgZmlsbCBmcm9tIHRoZSBlZGdlcywgY29sb3VyIHRha2VuIGZyb20gdGhlIGNvcm5lcnMgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiByZW1vdmVCZyhjdHgsdyxoLHRvbCxjbGlja3MpewogY29uc3QgaW1nPWN0eC5nZXRJbWFnZURhdGEoMCwwLHcsaCksZD1pbWcuZGF0YSxuPXcqaDsKIGNvbnN0IGNzPVswLHctMSwoaC0xKSp3LG4tMV0uZmlsdGVyKHA9PmRbcCo0KzNdPjIwMCk7aWYoIWNzLmxlbmd0aClyZXR1cm4gZmFsc2U7CiBsZXQgbWl4ZWQ9ZmFsc2U7Zm9yKGNvbnN0IGEgb2YgY3MpZm9yKGNvbnN0IGIgb2YgY3MpaWYoTWF0aC5tYXgoTWF0aC5hYnMoZFthKjRdLWRbYio0XSksTWF0aC5hYnMoZFthKjQrMV0tZFtiKjQrMV0pLE1hdGguYWJzKGRbYSo0KzJdLWRbYio0KzJdKSk+NjApbWl4ZWQ9dHJ1ZTsKIGxldCBicj0wLGJnPTAsYmI9MDtjcy5mb3JFYWNoKHA9Pnticis9ZFtwKjRdO2JnKz1kW3AqNCsxXTtiYis9ZFtwKjQrMl19KTtici89Y3MubGVuZ3RoO2JnLz1jcy5sZW5ndGg7YmIvPWNzLmxlbmd0aDsKIGNvbnN0IGRpc3Q9cD0+TWF0aC5tYXgoTWF0aC5hYnMoZFtwKjRdLWJyKSxNYXRoLmFicyhkW3AqNCsxXS1iZyksTWF0aC5hYnMoZFtwKjQrMl0tYmIpKTsKIGNvbnN0IGRvbmU9bmV3IFVpbnQ4QXJyYXkobikscT1uZXcgVWludDMyQXJyYXkobik7bGV0IHFoPTAscXQ9MDsKIGNvbnN0IHB1c2g9cD0+e2lmKCFkb25lW3BdJiZkW3AqNCszXT4wJiZkaXN0KHApPD10b2wpe2RvbmVbcF09MTtxW3F0KytdPXB9fTsKIGZvcihsZXQgeD0wO3g8dzt4Kyspe3B1c2goeCk7cHVzaCgoaC0xKSp3K3gpfWZvcihsZXQgeT0wO3k8aDt5Kyspe3B1c2goeSp3KTtwdXNoKHkqdyt3LTEpfQogd2hpbGUocWg8cXQpe2NvbnN0IHA9cVtxaCsrXSx4PXAldztpZih4PjApcHVzaChwLTEpO2lmKHg8dy0xKXB1c2gocCsxKTtpZihwPj13KXB1c2gocC13KTtpZihwPG4tdylwdXNoKHArdyl9CiBjb25zdCBzdGFtcD0ocHgscHkscnIpPT57Y29uc3QgeDA9TWF0aC5tYXgoMCxNYXRoLmZsb29yKHB4LXJyKSkseDE9TWF0aC5taW4ody0xLE1hdGguY2VpbChweCtycikpLHkwPU1hdGgubWF4KDAsTWF0aC5mbG9vcihweS1ycikpLHkxPU1hdGgubWluKGgtMSxNYXRoLmNlaWwocHkrcnIpKTtmb3IobGV0IHk9eTA7eTw9eTE7eSsrKWZvcihsZXQgeD14MDt4PD14MTt4KyspaWYoKHgtcHgpKih4LXB4KSsoeS1weSkqKHktcHkpPD1ycipycilkb25lW3kqdyt4XT0xfTsKIGxldCBwcmV2Qj1udWxsOyhjbGlja3N8fFtdKS5mb3JFYWNoKGM9PntpZihjLmIpe2NvbnN0IHB4PWMueCp3LHB5PWMueSpoLHJyPU1hdGgubWF4KDAuNSxjLnIqdyk7aWYocHJldkImJnByZXZCLnM9PT1jLnMpe2NvbnN0IGR4PXB4LXByZXZCLnB4LGR5PXB5LXByZXZCLnB5LEw9TWF0aC5oeXBvdChkeCxkeSksc3Q9TWF0aC5tYXgoMSxNYXRoLmNlaWwoTC9NYXRoLm1heCgxLHJyLzIpKSk7Zm9yKGxldCBrPTE7azw9c3Q7aysrKXN0YW1wKHByZXZCLnB4K2R4Kmsvc3QscHJldkIucHkrZHkqay9zdCxycil9ZWxzZSBzdGFtcChweCxweSxycik7cHJldkI9e3M6Yy5zLHB4LHB5fTtyZXR1cm59cHJldkI9bnVsbDtjb25zdCBjeD1NYXRoLm1pbih3LTEsTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGMueCp3KSkpLGN5PU1hdGgubWluKGgtMSxNYXRoLm1heCgwLE1hdGgucm91bmQoYy55KmgpKSksczA9Y3kqdytjeDtpZihkb25lW3MwXSlyZXR1cm47Y29uc3QgcjA9ZFtzMCo0XSxnMD1kW3MwKjQrMV0sYjA9ZFtzMCo0KzJdO2NvbnN0IGRjPXA9Pk1hdGgubWF4KE1hdGguYWJzKGRbcCo0XS1yMCksTWF0aC5hYnMoZFtwKjQrMV0tZzApLE1hdGguYWJzKGRbcCo0KzJdLWIwKSk7Y29uc3QgY3Q9Yy50fHx0b2wscGM9cD0+e2lmKCFkb25lW3BdJiZkW3AqNCszXT4wJiZkYyhwKTw9Y3Qpe2RvbmVbcF09MTtxW3F0KytdPXB9fTtwYyhzMCk7d2hpbGUocWg8cXQpe2NvbnN0IHA9cVtxaCsrXSx4PXAldztpZih4PjApcGMocC0xKTtpZih4PHctMSlwYyhwKzEpO2lmKHA+PXcpcGMocC13KTtpZihwPG4tdylwYyhwK3cpfX0pOwogZm9yKGxldCBwPTA7cDxuO3ArKylpZihkb25lW3BdKWRbcCo0KzNdPTA7CiBmb3IobGV0IHA9MDtwPG47cCsrKXtpZihkb25lW3BdKWNvbnRpbnVlO2NvbnN0IHg9cCV3O2lmKCEoKHg+MCYmZG9uZVtwLTFdKXx8KHg8dy0xJiZkb25lW3ArMV0pfHwocD49dyYmZG9uZVtwLXddKXx8KHA8bi13JiZkb25lW3Ard10pKSljb250aW51ZTtjb25zdCBrPWRpc3QocCk7aWYoazx0b2wqMilkW3AqNCszXT1NYXRoLnJvdW5kKGRbcCo0KzNdKihrLXRvbCkvdG9sKX0KIGxldCBlZGdlPTAsZWRnZURvbmU9MCxyZW1vdmVkPTA7Zm9yKGxldCBwPTA7cDxuO3ArKylpZihkb25lW3BdKXJlbW92ZWQrKzsKIGZvcihsZXQgeD0wO3g8dzt4Kyspe2Zvcihjb25zdCBwIG9mIFt4LChoLTEpKncreF0pe2VkZ2UrKztpZihkb25lW3BdKWVkZ2VEb25lKyt9fWZvcihsZXQgeT0xO3k8aC0xO3krKyl7Zm9yKGNvbnN0IHAgb2YgW3kqdyx5Kncrdy0xXSl7ZWRnZSsrO2lmKGRvbmVbcF0pZWRnZURvbmUrK319CiBjdHgucHV0SW1hZ2VEYXRhKGltZywwLDApOwogY29uc3QgZWRnZVNoYXJlPWVkZ2U\/ZWRnZURvbmUvZWRnZTowLHNoYXJlPXJlbW92ZWQvbjsKIGxldCBzdGF0dXM9J29rJztpZihzaGFyZTwwLjAyKXN0YXR1cz0nbm9uZSc7ZWxzZSBpZihzaGFyZT4wLjk3KXN0YXR1cz0nYWxsJztlbHNlIGlmKG1peGVkfHxlZGdlU2hhcmU8MC44NSlzdGF0dXM9J3BhcnRpYWwnOwogcmV0dXJuIHttaXhlZCxzdGF0dXMsZWRnZVNoYXJlLHNoYXJlfTsKfQovKiAtLS0tLS0tLS0tIFBORyBjb2xvdXIgcmVkdWN0aW9uIChsaWtlIFRpbnlQTkcgLyBDYW52YSBjb21wcmVzc2lvbikgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBwbmdDcmMoYil7bGV0IGM9fjA7Zm9yKGxldCBpPTA7aTxiLmxlbmd0aDtpKyspe2NePWJbaV07Zm9yKGxldCBrPTA7azw4O2srKyljPShjPj4+MSleKDB4RURCODgzMjAmLShjJjEpKX1yZXR1cm4gfmM+Pj4wfQpmdW5jdGlvbiBwbmdDaHVuayh0eXBlLGRhdGEpe2NvbnN0IG91dD1uZXcgVWludDhBcnJheSgxMitkYXRhLmxlbmd0aCksZHY9bmV3IERhdGFWaWV3KG91dC5idWZmZXIpO2R2LnNldFVpbnQzMigwLGRhdGEubGVuZ3RoKTtmb3IobGV0IGk9MDtpPDQ7aSsrKW91dFs0K2ldPXR5cGUuY2hhckNvZGVBdChpKTtvdXQuc2V0KGRhdGEsOCk7ZHYuc2V0VWludDMyKDgrZGF0YS5sZW5ndGgscG5nQ3JjKG91dC5zdWJhcnJheSg0LDgrZGF0YS5sZW5ndGgpKSk7cmV0dXJuIG91dH0KYXN5bmMgZnVuY3Rpb24gZGVmbGF0ZShieXRlcyl7Y29uc3QgY3M9bmV3IENvbXByZXNzaW9uU3RyZWFtKCdkZWZsYXRlJyk7Y29uc3Qgdz1jcy53cml0YWJsZS5nZXRXcml0ZXIoKTt3LndyaXRlKGJ5dGVzKTt3LmNsb3NlKCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXNwb25zZShjcy5yZWFkYWJsZSkuYXJyYXlCdWZmZXIoKSl9CmZ1bmN0aW9uIG1lZGlhbkN1dChkLG4pewogY29uc3Qgc3RlcD1NYXRoLm1heCgxLE1hdGguZmxvb3IoZC5sZW5ndGgvNC8yNTAwMDApKSxweD1bXTsKIGZvcihsZXQgaT0wO2k8ZC5sZW5ndGg7aSs9NCpzdGVwKXtjb25zdCBhPWRbaSszXTtpZihhPDgpY29udGludWU7cHgucHVzaChbZFtpXSxkW2krMV0sZFtpKzJdLGFdKX0KIGlmKCFweC5sZW5ndGgpcmV0dXJuIFtdOwogbGV0IGJveGVzPVtweF07CiB3aGlsZShib3hlcy5sZW5ndGg8bil7bGV0IGJpPS0xLGJlc3Q9MCxiYz0wOwogIGJveGVzLmZvckVhY2goKGIsaSk9PntpZihiLmxlbmd0aDwyKXJldHVybjtmb3IobGV0IGM9MDtjPDQ7YysrKXtsZXQgbG89MjU1LGhpPTA7Zm9yKGNvbnN0IHAgb2YgYil7aWYocFtjXTxsbylsbz1wW2NdO2lmKHBbY10+aGkpaGk9cFtjXX1jb25zdCBzYz0oaGktbG8pKk1hdGguc3FydChiLmxlbmd0aCk7aWYoc2M+YmVzdCl7YmVzdD1zYztiaT1pO2JjPWN9fX0pOwogIGlmKGJpPDB8fGJlc3Q9PT0wKWJyZWFrO2NvbnN0IGI9Ym94ZXNbYmldO2Iuc29ydCgoeCx5KT0+eFtiY10teVtiY10pO2NvbnN0IG09Yi5sZW5ndGg+PjE7Ym94ZXMuc3BsaWNlKGJpLDEsYi5zbGljZSgwLG0pLGIuc2xpY2UobSkpfQogcmV0dXJuIGJveGVzLm1hcChiPT57bGV0IHI9MCxnPTAsYmw9MCxhPTA7Zm9yKGNvbnN0IHAgb2YgYil7cis9cFswXTtnKz1wWzFdO2JsKz1wWzJdO2ErPXBbM119Y29uc3Qgaz1iLmxlbmd0aDtyZXR1cm4gW01hdGgucm91bmQoci9rKSxNYXRoLnJvdW5kKGcvayksTWF0aC5yb3VuZChibC9rKSxNYXRoLnJvdW5kKGEvayldfSk7Cn0KYXN5bmMgZnVuY3Rpb24gcXVhbnRQbmcoY3R4LHcsaCxuKXsKIGNvbnN0IGQ9Y3R4LmdldEltYWdlRGF0YSgwLDAsdyxoKS5kYXRhOwogbGV0IGhhc0NsZWFyPWZhbHNlO2ZvcihsZXQgaT0zO2k8ZC5sZW5ndGg7aSs9NClpZihkW2ldPDgpe2hhc0NsZWFyPXRydWU7YnJlYWt9CiBjb25zdCBwYWw9bWVkaWFuQ3V0KGQsaGFzQ2xlYXI\/bi0xOm4pO2lmKGhhc0NsZWFyKXBhbC51bnNoaWZ0KFswLDAsMCwwXSk7CiBpZighcGFsLmxlbmd0aClwYWwucHVzaChbMCwwLDAsMF0pOwogY29uc3QgY2FjaGU9bmV3IEludDE2QXJyYXkoMTw8MjApLmZpbGwoLTEpLHN0YXJ0PWhhc0NsZWFyPzE6MDsKIGNvbnN0IHJhdz1uZXcgVWludDhBcnJheSgodysxKSpoKTsKIGZvcihsZXQgeT0wLG89MCxpPTA7eTxoO3krKyl7cmF3W28rK109MDtmb3IobGV0IHg9MDt4PHc7eCsrLGkrPTQpewogIGNvbnN0IGE9ZFtpKzNdO2xldCBpZHg7CiAgaWYoYTw4JiZoYXNDbGVhcilpZHg9MDtlbHNle2NvbnN0IGtleT0oKGRbaV0+PjMpPDwxNSl8KChkW2krMV0+PjMpPDwxMCl8KChkW2krMl0+PjMpPDw1KXwoYT4+Myk7aWR4PWNhY2hlW2tleV07CiAgIGlmKGlkeDwwKXtsZXQgYmQ9MWU5O2ZvcihsZXQgcD1zdGFydDtwPHBhbC5sZW5ndGg7cCsrKXtjb25zdCBxPXBhbFtwXSxkcj1xWzBdLWRbaV0sZGc9cVsxXS1kW2krMV0sZGI9cVsyXS1kW2krMl0sZGE9cVszXS1hLGRkPWRyKmRyKjIrZGcqZGcqNCtkYipkYitkYSpkYSozO2lmKGRkPGJkKXtiZD1kZDtpZHg9cH19Y2FjaGVba2V5XT1pZHh9fQogIHJhd1tvKytdPWlkeH19CiBjb25zdCBpaGRyPW5ldyBVaW50OEFycmF5KDEzKSxkdj1uZXcgRGF0YVZpZXcoaWhkci5idWZmZXIpO2R2LnNldFVpbnQzMigwLHcpO2R2LnNldFVpbnQzMig0LGgpO2loZHJbOF09ODtpaGRyWzldPTM7CiBjb25zdCBwbHRlPW5ldyBVaW50OEFycmF5KHBhbC5sZW5ndGgqMyk7cGFsLmZvckVhY2goKHAsaSk9PntwbHRlW2kqM109cFswXTtwbHRlW2kqMysxXT1wWzFdO3BsdGVbaSozKzJdPXBbMl19KTsKIGxldCBsYXN0PS0xO3BhbC5mb3JFYWNoKChwLGkpPT57aWYocFszXSE9PTI1NSlsYXN0PWl9KTsKIGNvbnN0IHBhcnRzPVtuZXcgVWludDhBcnJheShbMTM3LDgwLDc4LDcxLDEzLDEwLDI2LDEwXSkscG5nQ2h1bmsoJ0lIRFInLGloZHIpLHBuZ0NodW5rKCdQTFRFJyxwbHRlKV07CiBpZihsYXN0Pj0wKXBhcnRzLnB1c2gocG5nQ2h1bmsoJ3RSTlMnLG5ldyBVaW50OEFycmF5KHBhbC5zbGljZSgwLGxhc3QrMSkubWFwKHA9PnBbM10pKSkpOwogcGFydHMucHVzaChwbmdDaHVuaygnSURBVCcsYXdhaXQgZGVmbGF0ZShyYXcpKSxwbmdDaHVuaygnSUVORCcsbmV3IFVpbnQ4QXJyYXkoMCkpKTsKIHJldHVybiBuZXcgQmxvYihwYXJ0cyx7dHlwZTonaW1hZ2UvcG5nJ30pOwp9CmNvbnN0IENBTl9RVUFOVD10eXBlb2YgQ29tcHJlc3Npb25TdHJlYW09PT0nZnVuY3Rpb24nOwphc3luYyBmdW5jdGlvbiBvcHRpbWlzZShpdGVtKXsKIGlmKCFjYW5PcHRpbWlzZShpdGVtKSlyZXR1cm47Y29uc3QgcmV2PSsraXRlbS5yZXY7aXRlbS5yZXN1bHQ9bnVsbDtkcm9wVXJsKGl0ZW0sJ3JlcycpO2l0ZW0uYnVzeT10cnVlO3JlbmRlcigpOwogbGV0IHNyYz1udWxsLGNhbnZhcz1udWxsOwogdHJ5ewogIGxldCBvdXQ9b3V0VHlwZShpdGVtKSxyZWFzb249Jyc7Y29uc3QgdD10YXJnZXRTaXplKGl0ZW0pOwogIGlmKGl0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJyl7dHJ5e3NyYz1hd2FpdCBsb2FkSW1nKHN2Z0Jsb2IoaXRlbS5zdmcsdC53LHQuaCkpfWNhdGNoKGUpe3Rocm93IEVycm9yKCdEaW4gYnJvd3NlciBrdW5uZSBpa2tlIHZpc2UgZGVubmUgU1ZHLiBEZW4gYnJ1Z2VyIG3DpXNrZSBmdW5rdGlvbmVyLCBkZXIgaWtrZSBrYW4gdGVnbmVzIHNvbSBldCBiaWxsZWRlLicpfX0KICBlbHNlIHNyYz1hd2FpdCBkZWNvZGVSYXN0ZXIoaXRlbS5maWxlKTsKICBpZihvdXQ9PT0nYXV0bycpe2NvbnN0IGE9aXRlbS50eXBlPT09J2ltYWdlL2pwZWcnP3thbHBoYTpmYWxzZSxwaG90bzp0cnVlfTphbmFseXNlKHNyYy5zb3VyY2UsdC53LHQuaCk7CiAgIGlmKCFhfHxhLmFscGhhKXtvdXQ9J2ltYWdlL3BuZyc7cmVhc29uPWE\/J0dlbXQgc29tIFBORyBmb3IgYXQgYmV2YXJlIGdlbm5lbXNpZ3RpZ2hlZGVuLic6Jyd9CiAgIGVsc2UgaWYoIWEucGhvdG8pe291dD0naW1hZ2UvcG5nJztyZWFzb249J0dlbXQgc29tIFBORywgZm9yZGkgZGV0IGxpZ25lciBlbiBncmFmaWsgZWxsZXIgZXQgbG9nbyBtZWQgZsOlIGZhcnZlci4nfQogICBlbHNle291dD0naW1hZ2UvanBlZyc7cmVhc29uPWl0ZW0udHlwZT09PSdpbWFnZS9qcGVnJz8nQmVob2xkdCBzb20gSlBHLCBzb20gcGFzc2VyIHRpbCBmb3RvcyBvZyBiaWxsZWRlciB1ZGVuIGdlbm5lbXNpZ3RpZ2hlZC4nOidHZW10IHNvbSBKUEcsIGZvcmRpIGRldCBsaWduZXIgZXQgZm90byB1ZGVuIGdlbm5lbXNpZ3RpZ2hlZC4nfX0KICBpZihpdGVtLnRyYW5zcCYmIWl0ZW0uYW5pbWF0ZWQpe291dD0naW1hZ2UvcG5nJztyZWFzb249J0dlbXQgc29tIFBORyBmb3IgYXQgYmV2YXJlIGRlbiBnZW5uZW1zaWd0aWdlIGJhZ2dydW5kLid9CiAgY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2NhbnZhcy53aWR0aD10Lnc7Y2FudmFzLmhlaWdodD10Lmg7CiAgY29uc3QgY3R4PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2lmKCFjdHgpdGhyb3cgRXJyb3IoJ0JpbGxlZGJlaGFuZGxpbmcgZXIgaWtrZSBtdWxpZyBpIGRlbm5lIGJyb3dzZXIuJyk7CiAgaWYob3V0PT09J2ltYWdlL2pwZWcnKXtjdHguZmlsbFN0eWxlPScjZmZmJztjdHguZmlsbFJlY3QoMCwwLHQudyx0LmgpfQogIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQ9dHJ1ZTtjdHguaW1hZ2VTbW9vdGhpbmdRdWFsaXR5PSdoaWdoJztjdHguZHJhd0ltYWdlKHNyYy5zb3VyY2UsMCwwLHQudyx0LmgpOwogIGxldCBiZ01peGVkPW51bGw7aWYoaXRlbS50cmFuc3AmJiFpdGVtLmFuaW1hdGVkKWJnTWl4ZWQ9cmVtb3ZlQmcoY3R4LHQudyx0LmgsaXRlbS50b2x8fDQwLGl0ZW0uY2xpY2tzKXx8e3N0YXR1czonbm9uZSd9OwogIGxldCBibG9iOwogIGlmKG91dD09PSdpbWFnZS9wbmcnJiZDQU5fUVVBTlQmJml0ZW0uY29sb3Vycz4wKXt0cnl7YmxvYj1hd2FpdCBxdWFudFBuZyhjdHgsdC53LHQuaCxpdGVtLmNvbG91cnMpfWNhdGNoKGUpe2Jsb2I9bnVsbH19CiAgaWYoIWJsb2IpYmxvYj1hd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57dHJ5e2NhbnZhcy50b0Jsb2IoYj0+Yj9yZXNvbHZlKGIpOnJlamVjdChFcnJvcignRGluIGJyb3dzZXIga3VubmUgaWtrZSBsYXZlIGJpbGxlZGV0LiBEZXQgZXIgbcOlc2tlIGZvciBzdG9ydCB0aWwgZGVuIHRpbGfDpm5nZWxpZ2UgaHVrb21tZWxzZS4nKSksb3V0LGl0ZW0ucXVhbGl0eS8xMDApfWNhdGNoKGUpe3JlamVjdChlJiZlLm5hbWU9PT0nU2VjdXJpdHlFcnJvcic\/RXJyb3IoJ0RpbiBicm93c2VyIGJsb2tlcmVkZSBrb252ZXJ0ZXJpbmdlbiBhZiBkZW5uZSBTVkcuIEVrc3BvcnTDqXIgZGVuIHNvbSBQTkcgZnJhIGRpdCBkZXNpZ25wcm9ncmFtIGkgc3RlZGV0LicpOmUpfX0pOwogIGlmKGJsb2IudHlwZSE9PW91dCl0aHJvdyBFcnJvcignRGluIGJyb3dzZXIga2FuIGlra2UgbGF2ZSAnK3R5cGVMYWJlbChvdXQpKyctZmlsZXIuJyk7CiAgY29uc3Qga2VwdD0haXRlbS50cmFuc3AmJkNNX0FDQ0VQVEVELmluY2x1ZGVzKGl0ZW0udHlwZSkmJiFpdGVtLm1pc21hdGNoJiZ0Lnc9PT1pdGVtLndpZHRoJiZ0Lmg9PT1pdGVtLmhlaWdodCYmYmxvYi5zaXplPj1pdGVtLmZpbGUuc2l6ZSYmKGl0ZW0ub3V0cHV0PT09J2F1dG8nfHxvdXQ9PT1pdGVtLnR5cGUpLGNob3Nlbj1rZXB0P2l0ZW0uZmlsZTpibG9iOwogIGNvbnN0IGNyYz1jcmMzMihuZXcgVWludDhBcnJheShhd2FpdCBjaG9zZW4uYXJyYXlCdWZmZXIoKSkpOwogIGlmKHJldiE9PWl0ZW0ucmV2fHwhYWxpdmUoaXRlbSkpcmV0dXJuOwogIGl0ZW0ucmVzdWx0PXtibG9iOmNob3NlbixjcmMsdHlwZTprZXB0P2l0ZW0udHlwZTpvdXQsd2lkdGg6dC53LGhlaWdodDp0Lmgsa2VwdE9yaWdpbmFsOmtlcHQsdHJpZWRTaXplOmJsb2Iuc2l6ZSxiZ01peGVkLHJlYXNvbixuYW1lOmtlcHQ\/c2FmZUJhc2UoaXRlbS5maWxlLm5hbWUpKycuJysoZXh0T2YoaXRlbS5maWxlLm5hbWUpfHxUWVBFU1tpdGVtLnR5cGVdWzFdKTpzYWZlQmFzZShpdGVtLmZpbGUubmFtZSkrJy1vcHRpbWlzZWQuJytUWVBFU1tvdXRdWzFdfTsKICBpdGVtLmNvbXBhcmU9dHJ1ZTt0cmFjaygnb3B0aW1pc2UnKTsKICBzdGF0dXMoa2VwdD9pdGVtLmZpbGUubmFtZSsnIGVyIGFsbGVyZWRlIGdvZHQgb3B0aW1lcmV0LiBEZW4gb3JpZ2luYWxlIGZpbCBlciBiZWhvbGR0Lic6J0JpbGxlZGV0IGVyIGtsYXI6ICcraXRlbS5yZXN1bHQubmFtZSk7CiB9Y2F0Y2goZSl7aWYocmV2PT09aXRlbS5yZXYmJmFsaXZlKGl0ZW0pKXN0YXR1cygnS3VubmUgaWtrZSBvcHRpbWVyZSAnK2l0ZW0uZmlsZS5uYW1lKyc6ICcrKGUmJmUubWVzc2FnZT9lLm1lc3NhZ2U6J3VrZW5kdCBmZWpsJykpfQogZmluYWxseXtpZihzcmMpc3JjLnJlbGVhc2UoKTtpZihjYW52YXMpe2NhbnZhcy53aWR0aD0wO2NhbnZhcy5oZWlnaHQ9MH1pZihyZXY9PT1pdGVtLnJldilpdGVtLmJ1c3k9ZmFsc2U7aWYoYWxpdmUoaXRlbSkpcmVuZGVyKCl9Cn0KLyogLS0tLS0tLS0tLSByZW5kZXJpbmcgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBlbCh0YWcsY2xzLHR4dCl7Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7aWYoY2xzKXguY2xhc3NOYW1lPWNscztpZih0eHQhPT11bmRlZmluZWQpeC50ZXh0Q29udGVudD10eHQ7cmV0dXJuIHh9CmNvbnN0IG9wZW5UaXBzPW5ldyBTZXQoKTsKY29uc3QgY2FuSG92ZXI9d2luZG93Lm1hdGNoTWVkaWEmJm1hdGNoTWVkaWEoJyhob3ZlcjogaG92ZXIpIGFuZCAocG9pbnRlcjogZmluZSknKS5tYXRjaGVzOwpmdW5jdGlvbiBoZWxwVGlwKHRleHQsa2V5KXtjb25zdCB3PWVsKCdzcGFuJywnY2lsLXRpcHdyYXAnKSxiPWVsKCdidXR0b24nLCdjaWwtdGlwYnRuJywnPycpLHA9ZWwoJ3NwYW4nLCdjaWwtdGlwdGV4dCBjaWwtdGlwcG9wJyx0ZXh0KTtiLnR5cGU9J2J1dHRvbic7Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdNZXJlIGluZm9ybWF0aW9uJyk7Y29uc3Qgc2V0PW89PntwLmhpZGRlbj0hbztiLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsU3RyaW5nKG8pKX07c2V0KCFjYW5Ib3ZlciYmb3BlblRpcHMuaGFzKGtleSkpOwogaWYoY2FuSG92ZXIpe3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsKCk9PnNldCh0cnVlKSk7dy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywoKT0+e2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1iKXNldChmYWxzZSl9KTtiLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywoKT0+c2V0KHRydWUpKTtiLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCgpPT5zZXQoZmFsc2UpKTtiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxlPT57ZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcFByb3BhZ2F0aW9uKCl9KX0KIGVsc2UgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+e2UucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO2NvbnN0IG89cC5oaWRkZW47c2V0KG8pO2lmKG8pb3BlblRpcHMuYWRkKGtleSk7ZWxzZSBvcGVuVGlwcy5kZWxldGUoa2V5KX0pOwogdy5hcHBlbmQoYixwKTtyZXR1cm4gd30KZnVuY3Rpb24gZmllbGRIZWxwKHRleHQsY29udHJvbCxoZWxwLGtleSl7Y29uc3QgZD1lbCgnZGl2JywnY2lsLWZpZWxkJyksaD1lbCgnc3BhbicsJ2NpbC1sYWJlbCcsdGV4dCk7e2NvbnN0IHR3PWhlbHBUaXAoaGVscCxrZXkpO3R3LmNsYXNzTGlzdC5hZGQoJ2NpbC10aXAtbGVmdCcpO2guYXBwZW5kKHR3KX1jb250cm9sLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsdGV4dCk7ZC5hcHBlbmQoaCxjb250cm9sKTtyZXR1cm4gZH0KZnVuY3Rpb24gZmllbGQodGV4dCxjb250cm9sKXtjb25zdCBsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCcpO2wuYXBwZW5kKGVsKCdzcGFuJywnY2lsLWxhYmVsJyx0ZXh0KSxjb250cm9sKTtyZXR1cm4gbH0KZnVuY3Rpb24gc2VsZWN0KG9wdHMsdmFsdWUsZmlkLG9uQ2hhbmdlKXtjb25zdCBzPWVsKCdzZWxlY3QnKTtzLmRhdGFzZXQuZj1maWQ7b3B0cy5mb3JFYWNoKChbdix0XSk9Pntjb25zdCBvPWVsKCdvcHRpb24nLG51bGwsdCk7by52YWx1ZT12O3MuYXBwZW5kKG8pfSk7cy52YWx1ZT12YWx1ZTtzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCk9Pm9uQ2hhbmdlKHMudmFsdWUpKTtyZXR1cm4gc30KZnVuY3Rpb24gYnV0dG9uKHRleHQsZm4sY2xzLGZpZCl7Y29uc3QgYj1lbCgnYnV0dG9uJywnY2lsLWJ0bicrKGNscz8nICcrY2xzOicnKSx0ZXh0KTtiLnR5cGU9J2J1dHRvbic7aWYoZmlkKWIuZGF0YXNldC5mPWZpZDtiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmbik7cmV0dXJuIGJ9CmZ1bmN0aW9uIG1ldHJpYyhuYW1lLHZhbHVlKXtjb25zdCBkPWVsKCdkaXYnLCdjaWwtbWV0cmljJyk7ZC5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLG5hbWUpLGVsKCdiJyxudWxsLHZhbHVlKSk7cmV0dXJuIGR9CmNvbnN0IElORk9fVFlQRT17Jyc6J2dvb2QtdG8ta25vdycsd2FybjonY2Fubm90LWJlLXVuZG9uZScsYWxlcnQ6J2Nhbm5vdC1iZS11bmRvbmUnLGVycm9yOidjYW5ub3QtYmUtdW5kb25lJyxzdWNjZXNzOid0aXAnLG5ldXRyYWw6J2dvb2QtdG8ta25vdyd9OwpmdW5jdGlvbiBoaW50KGNhcmQsdGV4dCx0b25lKXtjb25zdCBkPWVsKCdkaXYnLCdjaWwtaGludCBjbWFjLWluZm8gY21hYy1pbmZvLScrSU5GT19UWVBFW3RvbmV8fCcnXSsodG9uZT8nIGNpbC0nK3RvbmU6JycpKSxpPWVsKCdzcGFuJywnY21hYy1pbmZvLWljb24nKSxiPWVsKCdkaXYnLCdjbWFjLWluZm8tYm9keScpLGM9ZWwoJ2RpdicsJ2NtYWMtaW5mby1jb250ZW50Jyx0ZXh0KTtpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCd0cnVlJyk7Yi5hcHBlbmQoYyk7ZC5hcHBlbmQoaSxiKTtjYXJkLmFwcGVuZChkKX0KZnVuY3Rpb24gYmdIaW50KGNhcmQscmVwKXtpZighcmVwfHxyZXAuc3RhdHVzPT09J29rJylyZXR1cm47Y29uc3QgbXNnPXtub25lOidCYWdncnVuZGVuIGt1bm5lIGlra2UgZmplcm5lcy4gVsOmcmt0w7hqZXQgZmplcm5lciBrdW4gZW4gZW5zZmFydmV0IGJhZ2dydW5kLCBkZXIgZ8OlciB1ZCB0aWwgYmlsbGVkZXRzIGthbnRlciwgZnggaHZpZCBiYWcgZXQgbG9nby4nLHBhcnRpYWw6J0JhZ2dydW5kZW4gYmxldiBrdW4gZGVsdmlzdCBmamVybmV0LiBCaWxsZWRldHMga2FudGVyIGhhciBtZXJlIGVuZCDDqW4gZmFydmUsIGh2aWxrZXQgc29tIHJlZ2VsIGJldHlkZXIsIGF0IGRldCBlciBldCBmb3RvIGVsbGVyIGhhciBlbiBza3lnZ2UgZWxsZXIgZW4gb3ZlcmdhbmcuIFByw7h2IG1lZCBlbiBow7hqZXJlIHRvbGVyYW5jZS4nLGFsbDonTsOmc3RlbiBoZWxlIGJpbGxlZGV0IGJsZXYgZmplcm5ldCwgZm9yZGkgYmlsbGVkZXQgZm9yIGRldCBtZXN0ZSBoYXIgc2FtbWUgZmFydmUgc29tIGJhZ2dydW5kZW4uIFPDpm5rIHRvbGVyYW5jZW4uJ31bcmVwLnN0YXR1c107aGludChjYXJkLG1zZyxyZXAuc3RhdHVzPT09J3BhcnRpYWwnPyd3YXJuJzonYWxlcnQnKTtjb25zdCBib3g9Y2FyZC5sYXN0Q2hpbGQucXVlcnlTZWxlY3RvcignLmNtYWMtaW5mby1jb250ZW50Jyk7Ym94LmFwcGVuZCgnIFRpbCBmb3RvcyBvZyBtZXJlIGtvbXBsZWtzZSBiaWxsZWRlciBrYW4gZHUgYnJ1Z2UgZXQgQUktdsOmcmt0w7hqIHRpbCBhdCBmamVybmUgYmFnZ3J1bmRlLCBmeCAnKTtjb25zdCBhPWVsKCdhJyxudWxsLCdyZW1vdmUuYmcnKTthLmhyZWY9J2h0dHBzOi8vd3d3LnJlbW92ZS5iZy8nO2EudGFyZ2V0PSdfYmxhbmsnO2EucmVsPSdub29wZW5lciBub3JlZmVycmVyJztib3guYXBwZW5kKGEsJy4nKX0KZnVuY3Rpb24gZm9ybWF0VGV4dChpdGVtKXtsZXQgdD10eXBlTGFiZWwoaXRlbS50eXBlKTtpZihpdGVtLnR5cGU9PT0naW1hZ2UvZ2lmJyl0Kz1pdGVtLmFuaW1hdGVkPycgKGFuaW1lcmV0LCAnK2l0ZW0uZnJhbWVzKycgYmlsbGVkZXIpJzppdGVtLmZyYW1lcz09PTE\/JyAoc3RhdGlzayknOicnO2Vsc2UgaWYoaXRlbS5hbmltYXRlZCl0Kz0nIChhbmltZXJldCknO3JldHVybiB0fQpmdW5jdGlvbiBhZHZpY2VGb3IoY2FyZCxpdGVtKXsKIGlmKGl0ZW0ubG9hZGluZyl7aGludChjYXJkLCdMw6ZzZXIgYmlsbGVkZeKApicpO3JldHVybn0KIGlmKGl0ZW0ubWlzbWF0Y2gpaGludChjYXJkLChpdGVtLmNsYWltZWQ\/J0ZpbG5hdm5ldCBzaWdlciAnK3R5cGVMYWJlbChpdGVtLmNsYWltZWQpKycsIG1lbiBmaWxlbnMgaW5kaG9sZCBlciAnK3R5cGVMYWJlbChpdGVtLnR5cGUpKycuJzonRmlsbmF2bmV0IGhhciBpa2tlIGVuIGtlbmR0IGZpbGVuZGVsc2UgZm9yIGJpbGxlZGVyLiBJbmRob2xkZXQgZXIgJyt0eXBlTGFiZWwoaXRlbS50eXBlKSsnLicpKycgQ29uZmVyZW5jZSBNYW5hZ2VyIGthbiBhZnZpc2UgZGV0IGVsbGVyIHZpc2UgZGV0IGZvcmtlcnQuIEtvbnZlcnTDqXIgZGV0IG5lZGVuZm9yLCBlbGxlciBnZW0gZGV0IGlnZW4gbWVkIGRlbiByaWd0aWdlIGZpbGVuZGVsc2UuJywnd2FybicpOwogaWYoIUNNX0FDQ0VQVEVELmluY2x1ZGVzKGl0ZW0udHlwZSkpaGludChjYXJkLHR5cGVMYWJlbChpdGVtLnR5cGUpKyctZmlsZXIga2FuIGlra2UgdXBsb2FkZXMgdGlsIG1lZGllYXJraXZldCBpIENvbmZlcmVuY2UgTWFuYWdlci4gS29udmVydMOpciB0aWwgSlBHIGVsbGVyIFBORy4nKyhhcmVhPT09J2VtYWlsJyYmKGl0ZW0udHlwZT09PSdpbWFnZS93ZWJwJ3x8aXRlbS50eXBlPT09J2ltYWdlL3N2Zyt4bWwnKT8nIEJpbGxlZGUgKFVSTCkga2FuIHZpc2UgZW4gZWtzdGVybiAnK3R5cGVMYWJlbChpdGVtLnR5cGUpKycgaSBlZGl0b3JlbiwgbWVuIG1vZHRhZ2VybmVzIG1haWxwcm9ncmFtbWVyIHZpc2VyIGRlbiBtw6Vza2UgaWtrZS4nOicnKSwnd2FybicpOwogaWYoaXRlbS5lcnJvcil7aGludChjYXJkLGl0ZW0uZXJyb3IsJ2Vycm9yJyk7cmV0dXJufQogY29uc3QgUj1pdGVtLnJlc3VsdCYmIWl0ZW0ucmVzdWx0LmtlcHRPcmlnaW5hbD9pdGVtLnJlc3VsdDpudWxsLFNaPVI\/Ui5ibG9iLnNpemU6aXRlbS5maWxlLnNpemUscmVjPXN1Z2dlc3RlZChpdGVtKSxzdmc9IVImJml0ZW0udHlwZT09PSdpbWFnZS9zdmcreG1sJyxXPVI\/Ui53aWR0aDppdGVtLndpZHRoLGV4YWN0PWlzRXhhY3QoaXRlbSkmJiEhcmVjLGNvbD1pc0NvbHVtbihpdGVtKSYmISFyZWMmJiFzdmcsYmlnPXJlYyYmIWV4YWN0JiYhY29sJiZXPnJlYyoyOwogY29uc3Qgc2l6ZVR4dD1TWj5NQj8nRmlsZW4gZXIgJysoYmlnPydvZ3PDpSAnOicnKSsnZm9yaG9sZHN2aXMgc3RvciAoJytmbXQoU1opKycpLiBPdmVydmVqIGF0IGtvbXByaW1lcmUgZGVuLCBkYSBzdG9yZSBiaWxsZWRmaWxlciBrYW4gJysoYXJlYT09PSdlbWFpbCc\/J3DDpXZpcmtlIGluZGzDpnNuaW5nc3RpZGVuLCBhZnNlbmRlbHNlbiBvZyBpIG5vZ2xlIHRpbGbDpmxkZSBsZXZlcmluZ2VuIGFmIGUtbWFpbGVuLic6J2fDuHJlIGRpdCB3ZWJzaXRlIGxhbmdzb21tZXJlLCBpc8OmciBww6UgbW9iaWxlIGVuaGVkZXIuJyk6U1o+NTAwKktCPydGaWxlbiBlciAnKyhiaWc\/J29nc8OlICc6JycpKydyZXQgc3RvciAoJytmbXQoU1opKycpLiBEdSBrYW4gb3ZlcnZlamUgYXQga29tcHJpbWVyZSBkZW4uJzpTWj4wPydGaWxzdMO4cnJlbHNlbiAoJytmbXQoU1opKycpIGVyIGZpbi4nOicnOwogbGV0IGRpbT0nJyxsdj0wOwogaWYoIXJlYylsdj0tMSxkaW09aXNDdXN0b21XaWR0aChpdGVtKT8nQW5naXYgYmlsbGVkYnJlZGRlbiBpIHB4IGZvciBhdCBzYW1tZW5saWduZSBkZW4gbWVkIGJpbGxlZGV0Lic6YXJlYT09PSd3ZWJzaXRlJyYmaXRlbS53UGxhY2VtZW50PT09J25vbmUnPydWw6ZsZyBlbiBwbGFjZXJpbmcgZm9yIGF0IHNlIGVuIGFuYmVmYWxldCBicmVkZGUuJzonRGVyIGVyIGluZ2VuIGJlc3RlbXQgYW5iZWZhbGV0IGJyZWRkZSBmb3IgZGVubmUgcGxhY2VyaW5nLic7CiBlbHNlIGlmKGV4YWN0KXsKICBpZihXPT09cmVjKXtsdj0wO2RpbT0nUmlndGlnIGJyZWRkZTogZGVubmUgcGxhY2VyaW5nIGtyw6Z2ZXIgJytyZWMrJyBweCwgb2cgYmlsbGVkZXQgZXIgJytXKycgcHggYnJlZHQuJ30KICBlbHNlIGlmKHN2ZylkaW09J0Rlbm5lIHBsYWNlcmluZyBrcsOmdmVyIHByw6ZjaXMgJytyZWMrJyBweC4gVsOmbGcgw4ZuZHIgdGlsIHByw6ZjaXMgJytyZWMrJyBweCB1bmRlciBCaWxsZWRtw6VsLiBTVkcga2FuIGtvbnZlcnRlcmVzIGkgZW5odmVyIGJyZWRkZSB1ZGVuIGF0IG1pc3RlIHNrYXJwaGVkLic7CiAgZWxzZXtsdj0zO2RpbT0nRm9ya2VydCBicmVkZGUgdGlsIGRlbm5lIHBsYWNlcmluZzogYmlsbGVkZXQgZXIgJytXKycgcHggYnJlZHQsIG9nIHBsYWNlcmluZ2VuIGtyw6Z2ZXIgcHLDpmNpcyAnK3JlYysnIHB4LiBCaWxsZWRlciwgZGVyIGVyIGZvciBzbWFsbGUgZWxsZXIgZm9yIGJyZWRlLCBibGl2ZXIgbcOlc2tlIGlra2UgdmlzdCBzb20gdGlsdMOmbmt0IGkgV2Vic2l0ZS1EZXNpZ25lci4gJysoVzxyZWMqMC45PydCcnVnIGV0IHN0w7hycmUgYmlsbGVkZSwgZGVyIGVyIG1pbmRzdCAnK3JlYysnIHB4IGJyZWR0LiBIdmlzIGJpbGxlZGV0IGZvcnN0w7hycmVzLCBibGl2ZXIgZGV0IG1pbmRyZSBza2FycHQsIHPDpSBkZXQgYW5iZWZhbGVyIHZpIGlra2UuJzonVsOmbGcgw4ZuZHIgdGlsIHByw6ZjaXMgJytyZWMrJyBweCB1bmRlciBCaWxsZWRtw6VsLCBvZyBrbGlrIE9wdGltw6lyIC8ga29udmVydMOpci4gS3VuIGJyZWRkZW4gw6ZuZHJlcywgYmlsbGVkZXQgYmVza8OmcmVzIGlra2UuJysoVzxyZWM\/JyBCaWxsZWRldCBmb3JzdMO4cnJlcyBlbiBzbXVsZSwgaHZpbGtldCBub3JtYWx0IGlra2Uga2FuIHNlcy4nOicnKSl9CiB9CiBlbHNlIGlmKGNvbCl7CiAgaWYoTWF0aC5hYnMoVy1yZWMpPD01KXtsdj0wO2RpbT0nR29kIGJyZWRkZTogY2EuICcrcmVjKycgcHggYW5iZWZhbGVzIHRpbCBkZXR0ZSBrb2xvbm5lbGF5b3V0LCBvZyBiaWxsZWRldCBlciAnK1crJyBweCBicmVkdC4nfQogIGVsc2UgaWYoVz5yZWMpe2x2PTI7ZGltPSdEaXQgYmlsbGVkZSBlciAnK1crJyBweCBicmVkdCwgb2cgY2EuICcrcmVjKycgcHggYW5iZWZhbGVzIHRpbCBkZXR0ZSBrb2xvbm5lbGF5b3V0IChzdGFuZGFyZGJyZWRkZXIpLiBCaWxsZWRlciBpIGtvbG9ubmVyIGZsdWd0ZXIgYmVkc3QsIG7DpXIgZGUgaGFyIGRlbiBhbmJlZmFsZWRlIGJyZWRkZS4gVsOmbGcgw4ZuZHIgdGlsIGFuYmVmYWxldCBicmVkZGUgdW5kZXIgQmlsbGVkbcOlbCwgb2cga2xpayBPcHRpbcOpciAvIGtvbnZlcnTDqXIuJ30KICBlbHNle2x2PTI7ZGltPSdEaXQgYmlsbGVkZSBlciAnK1crJyBweCBicmVkdCwgb2cgY2EuICcrcmVjKycgcHggYW5iZWZhbGVzIHRpbCBkZXR0ZSBrb2xvbm5lbGF5b3V0LiBEZXQgZnlsZGVyIG3DpXNrZSBpa2tlIGtvbG9ubmVuIHVkIGVsbGVyIGZsdWd0ZXIgbWVkIGRlIGFuZHJlIGJpbGxlZGVyLCBvZyBkZXQga2FuIHNlIHVza2FycHQgdWQuIEJydWcgZXQgc3TDuHJyZSBiaWxsZWRlLCBodmlzIGR1IGhhciBldC4nfQogfQogZWxzZSBpZihXPHJlYyYmIXN2Zyl7bHY9MjtkaW09KHRvb05hcnJvdyhpdGVtKT8nU21hbGxlcmUgZW5kIGFuYmVmYWxldDogJzonTGlkdCBzbWFsbGVyZSBlbmQgYW5iZWZhbGV0OiAnKSsnYmlsbGVkZXQgZXIgJytXKycgcHggYnJlZHQsIG9nIGNhLiAnK3JlYysnIHB4IGFuYmVmYWxlcy4gRGV0IGthbiBzZSB1c2thcnB0IHVkJysoYXJlYT09PSdlbWFpbCc\/JyBpIGUtbWFpbGVuJzonJykrJy4gQnJ1ZyBldCBzdMO4cnJlIGJpbGxlZGUsIGh2aXMgZHUgaGFyIGV0Lid9CiBlbHNlIGlmKFc8cmVjKWRpbT0nQW5iZWZhbGV0IGJyZWRkZTogY2EuICcrcmVjKycgcHguIFNWRyBrYW4ga29udmVydGVyZXMgaSBkZW4gYnJlZGRlIHVkZW4gYXQgbWlzdGUgc2thcnBoZWQuJzsKIGVsc2UgaWYoYmlnJiZTWjw9NTAwKktCKXtsdj0yO2RpbT0nRGl0IGJpbGxlZGUgZXIgJytXKycgcHggYnJlZHQsIG9nIGNhLiAnK3JlYysnIHB4IGFuYmVmYWxlcyB0aWwgJysoYXJlYT09PSdlbWFpbCc\/J2RldHRlIGxheW91dCc6J2Rlbm5lIHBsYWNlcmluZycpKycuIFZpIGFuYmVmYWxlciBhdCDDpm5kcmUgZGV0IHRpbCBjYS4gJytyZWMrJyBweC4gVsOmbGcgw4ZuZHIgdGlsIGFuYmVmYWxldCBicmVkZGUgdW5kZXIgQmlsbGVkbcOlbCwgb2cga2xpayBPcHRpbcOpciAvIGtvbnZlcnTDqXIuJ30KIGVsc2UgaWYoYmlnKXtsdj0yO2RpbT0nRGl0IGJpbGxlZGUgZXIgJytXKycgcHggYnJlZHQsIG1lbnMgZGVuIGFuYmVmYWxlZGUgYnJlZGRlIHRpbCAnKyhhcmVhPT09J2VtYWlsJz8nZGV0dGUgbGF5b3V0JzonZGVubmUgcGxhY2VyaW5nJykrJyBlciBjYS4gJytyZWMrJyBweC4gQW5kcmUgbcOlbCBrYW4gb2dzw6UgZnVuZ2VyZSwgbWVuIGR1IGthbiBvdmVydmVqZSBhdCBnw7hyZSBkZXQgc21hbGxlcmUgZm9yIGF0IGhvbGRlIGZpbHN0w7hycmVsc2VuIG5lZGUuJ30KIGVsc2V7bHY9MDtkaW09J0FuYmVmYWxldCBicmVkZGU6IGNhLiAnK3JlYysnIHB4LiBCaWxsZWRldCBlciBicmVkdCBub2suJ30KIGlmKHN2ZyYmcmVjKXtsdj0yO2RpbT1leGFjdD8nS29udmVydMOpciBkZW5uZSBTVkcgaSBwcsOmY2lzICcrcmVjKycgcHg6IHbDpmxnIMOGbmRyIHRpbCBwcsOmY2lzICcrcmVjKycgcHggdW5kZXIgQmlsbGVkbcOlbCwgb2cga2xpayBPcHRpbcOpciAvIGtvbnZlcnTDqXIuIFNWRyBrYW4ga29udmVydGVyZXMgaSBlbmh2ZXIgYnJlZGRlIHVkZW4gYXQgbWlzdGUgc2thcnBoZWQuJzonS29udmVydMOpciBkZW5uZSBTVkcgaSBjYS4gJytyZWMrJyBweDogdsOmbGcgw4ZuZHIgdGlsIGFuYmVmYWxldCBicmVkZGUgdW5kZXIgQmlsbGVkbcOlbCwgb2cga2xpayBPcHRpbcOpciAvIGtvbnZlcnTDqXIuIFNWRyBrYW4ga29udmVydGVyZXMgaSBlbmh2ZXIgYnJlZGRlIHVkZW4gYXQgbWlzdGUgc2thcnBoZWQuJ30KIGNvbnN0IGx2RGltPWx2OwogaWYoc3ZnKXt9ZWxzZSBpZihTWj5NQilsdj1NYXRoLm1heChsdiwzKTtlbHNlIGlmKFNaPjUwMCpLQilsdj1NYXRoLm1heChsdiwyKTsKIGlmKCFSfHxsdkRpbT49MiloaW50KGNhcmQsZGltKyghUiYmc2l6ZVR4dCYmIXN2ZyYmIShiaWcmJlNaPD01MDAqS0IpPycgJytzaXplVHh0OicnKSxSP1snc3VjY2VzcycsJ3N1Y2Nlc3MnLCd3YXJuJywnYWxlcnQnXVtsdkRpbV06bHY8MD8nbmV1dHJhbCc6WydzdWNjZXNzJywnc3VjY2VzcycsJ3dhcm4nLCdhbGVydCddW2x2XSk7CiBpZihpdGVtLnR5cGU9PT0naW1hZ2UvYm1wJyloaW50KGNhcmQsJ0JNUCBrYW4gYnJ1Z2VzIGkgbWVkaWVhcmtpdmV0LCBtZW4gSlBHIGVsbGVyIFBORyBhbmJlZmFsZXMgZm9yIG1pbmRyZSBmaWxlciBvZyBiZWRyZSB2aXNuaW5nIGkgZS1tYWlscy4nKTsKIGlmKGl0ZW0udHlwZT09PSdpbWFnZS9naWYnJiZpdGVtLmFuaW1hdGVkKWhpbnQoY2FyZCxhcmVhPT09J2VtYWlsJz8nQW5pbWVyZXQgR0lGLiBBbmltYXRpb25lbiB2aXJrZWRlIGkgdm9yZXMgdGVzdCBhZiBlLW1haWxlZGl0b3JlbiwgbWVuIGRldCB2YXJpZXJlciwgb20gbW9kdGFnZXJuZXMgbWFpbHByb2dyYW1tZXIgYWZzcGlsbGVyIGRlbi4gQmVob2xkIGRlbiBvcmlnaW5hbGUgZmlsIGZvciBhdCBiZXZhcmUgYW5pbWF0aW9uZW4uJzonQW5pbWVyZXQgR0lGLiBCZWhvbGQgZGVuIG9yaWdpbmFsZSBmaWwgZm9yIGF0IGJldmFyZSBhbmltYXRpb25lbi4nKTsKIGlmKGl0ZW0uc3ZnQXNzdW1lZCloaW50KGNhcmQsJ0Rlbm5lIFNWRyBoYXIgaW5nZW4gZmFzdCBzdMO4cnJlbHNlLCBzw6UgMzAwIMOXIDE1MCBweCBlciBicnVndC4gVsOmbGcgZW4gZWdlbiBicmVkZGUgdmVkIGtvbnZlcnRlcmluZy4nLCd3YXJuJyk7Cn0KZnVuY3Rpb24gY29udHJvbHNGb3IoY2FyZCxpdGVtKXsKIGNvbnN0IGM9ZWwoJ2RpdicsJ2NpbC1jb250cm9scycpLGtlZXA9aXRlbS50eXBlPT09J2ltYWdlL2dpZid8fGl0ZW0udHlwZT09PSdpbWFnZS9ibXAnfHwoaXRlbS50eXBlPT09J2ltYWdlL3BuZycmJml0ZW0uYW5pbWF0ZWQpOwogY29uc3Qgb3V0cz1bXTtpZihrZWVwKW91dHMucHVzaChbJ29yaWdpbmFsJywnQmVob2xkIG9yaWdpbmFsICcrdHlwZUxhYmVsKGl0ZW0udHlwZSkrJyAoaW5nZW4ga29udmVydGVyaW5nKSddKTtpZighKGtlZXAmJml0ZW0uYW5pbWF0ZWQpKW91dHMucHVzaChbJ2F1dG8nLCdBdXRvbWF0aXNrIChhbmJlZmFsZXQpJ10pO291dHMucHVzaChbJ2ltYWdlL2pwZWcnLCdKUEcnXSxbJ2ltYWdlL3BuZycsJ1BORyddKTsKIGNvbnN0IG91dENvbD1lbCgnZGl2JywnY2lsLXN0YWNrJyk7b3V0Q29sLmFwcGVuZChmaWVsZCgnRmlsZm9ybWF0JyxzZWxlY3Qob3V0cyxpdGVtLm91dHB1dCxpdGVtLmlkKyctb3V0Jyx2PT5jaGFuZ2VJdGVtKGl0ZW0sJ291dHB1dCcsdikpKSk7Yy5hcHBlbmQob3V0Q29sKTsKIGNvbnN0IHJlYz1zdWdnZXN0ZWQoaXRlbSksc2l6ZXM9W1snb3JpZ2luYWwnLCdCZWhvbGQgb3JpZ2luYWxlIG3DpWwnXV07aWYocmVjKXNpemVzLnB1c2goWydyZWNvbW1lbmRlZCcsaXNFeGFjdChpdGVtKT8nw4ZuZHIgdGlsIHByw6ZjaXMgJytyZWMrJyBweCc6J8OGbmRyIHRpbCBhbmJlZmFsZXQgYnJlZGRlICgnK3JlYysnIHB4KSddKTtzaXplcy5wdXNoKFsnY3VzdG9tJyxpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCc\/J0VnZW4gYnJlZGRlJzonRWdlbiBicmVkZGUnXSk7CiB7Y29uc3QgZGY9ZmllbGQoJ0JpbGxlZG3DpWwnLHNlbGVjdChzaXplcyxyZXNpemVNb2RlKGl0ZW0pLGl0ZW0uaWQrJy1zaXplJyx2PT5jaGFuZ2VJdGVtKGl0ZW0sJ3Jlc2l6ZScsdikpKTtkZi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtaGVscCcsaXNFeGFjdChpdGVtKSYmcmVjPydEZW5uZSBwbGFjZXJpbmcga3LDpnZlciBwcsOmY2lzICcrcmVjKycgcHguIEh2aXMgZXQgYmlsbGVkZSBmb3JzdMO4cnJlcywga2FuIGRldCBzZSB1c2thcnB0IHVkLic6J0V0IHNtYWxsZXJlIGJpbGxlZGUgZ2l2ZXIgZW4gbWluZHJlIGZpbC4gRXQgYnJlZGVyZSBiaWxsZWRlIGthbiBzZSB1c2thcnB0IHVkLicpKTtjLmFwcGVuZChkZil9CiBpZihpdGVtLnJlc2l6ZT09PSdjdXN0b20nKXtjb25zdCB3PWVsKCdpbnB1dCcpO3cudHlwZT0nbnVtYmVyJzt3Lm1pbj0nMSc7dy5tYXg9U3RyaW5nKE1BWF9JTlBVVF9XSURUSCk7dy5zdGVwPScxJzt3LmlucHV0TW9kZT0nbnVtZXJpYyc7dy52YWx1ZT1TdHJpbmcoaXRlbS5jdXN0b21XaWR0aHx8JycpO3cuZGF0YXNldC5mPWl0ZW0uaWQrJy13Jzt3LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCk9PmNoYW5nZUl0ZW0oaXRlbSwnY3VzdG9tV2lkdGgnLHcudmFsdWUudHJpbSgpPT09Jyc\/MDpOdW1iZXIody52YWx1ZSkpKTtjLmFwcGVuZChmaWVsZChpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCc\/J0JyZWRkZSAocHgpJzonQnJlZGRlIChweCknLHcpKX0KIGlmKCFpdGVtLmFuaW1hdGVkJiZpdGVtLnR5cGUhPT0naW1hZ2Uvc3ZnK3htbCcpe2NvbnN0IHRmPWVsKCdkaXYnLCdjaWwtZmllbGQgY2lsLXJhbmdlIGNpbC10cmFuc3AnKSxsYj1lbCgnbGFiZWwnLCdjaWwtY2hlY2snKSxjYj1lbCgnaW5wdXQnKTtjYi50eXBlPSdjaGVja2JveCc7Y2IuY2hlY2tlZD0hIWl0ZW0udHJhbnNwO2NiLmRhdGFzZXQuZj1pdGVtLmlkKyctdHInO2NiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCk9PmNoYW5nZUl0ZW0oaXRlbSwndHJhbnNwJyxjYi5jaGVja2VkKSk7bGIuYXBwZW5kKGNiLGVsKCdzcGFuJyxudWxsLCdHw7hyIGJhZ2dydW5kZW4gZ2VubmVtc2lndGlnJykpO3RmLmFwcGVuZChlbCgnc3BhbicsJ2NpbC1sYWJlbCcsJ0JhZ2dydW5kJyksbGIsZWwoJ3NwYW4nLCdjaWwtaGVscCcsJ1ZpcmtlciBiZWRzdCBww6UgbG9nb2VyIG9nIGdyYWZpayBtZWQgZW4gZW5zZmFydmV0IGJhZ2dydW5kLCBmeCBodmlkIGJhZyBldCBsb2dvLiBCaWxsZWRldCBnZW1tZXMgc29tIFBORy4nKSk7CiAgaWYoaXRlbS50cmFuc3Ape2NvbnN0IHE9ZWwoJ2lucHV0Jyksdj1lbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ1RvbGVyYW5jZTogJysoaXRlbS50b2x8fDQwKSk7cS50eXBlPSdyYW5nZSc7cS5taW49JzUnO3EubWF4PScxMjAnO3Euc3RlcD0nMSc7cS52YWx1ZT1TdHJpbmcoaXRlbS50b2x8fDQwKTtxLmRhdGFzZXQuZj1pdGVtLmlkKyctdG9sJztxLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywoKT0+e3YudGV4dENvbnRlbnQ9J1RvbGVyYW5jZTogJytxLnZhbHVlfSk7cS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT5jaGFuZ2VJdGVtKGl0ZW0sJ3RvbCcsTnVtYmVyKHEudmFsdWUpKSk7dGYuYXBwZW5kKHEsdixlbCgnc3BhbicsJ2NpbC1oZWxwJywnSMOmdiBkZW4sIGh2aXMgZGVyIGVyIGVuIGx5cyBrYW50IGVsbGVyIHNreWdnZSB0aWxiYWdlLiBTw6ZuayBkZW4sIGh2aXMgZGVsZSBhZiBiaWxsZWRldCBmb3JzdmluZGVyLicpKX0KICBvdXRDb2wuYXBwZW5kKHRmKX0KIGNvbnN0IGFkdj1lbCgnZGl2JywnY2lsLWFkdi1ib2R5Jyk7bGV0IGFkdkVsPW51bGw7CiBpZihpdGVtLm91dHB1dD09PSdpbWFnZS9qcGVnJyl7Y29uc3QgcT1lbCgnaW5wdXQnKSxsPWVsKCdsYWJlbCcsJ2NpbC1maWVsZCBjaWwtcmFuZ2UnKSx2PWVsKCdzcGFuJywnY2lsLXNtYWxsJywnSlBHLWt2YWxpdGV0OiAnK2l0ZW0ucXVhbGl0eSsnJScpO3EudHlwZT0ncmFuZ2UnO3EubWluPSc1MCc7cS5tYXg9Jzk1JztxLnN0ZXA9JzEnO3EudmFsdWU9U3RyaW5nKGl0ZW0ucXVhbGl0eSk7cS5kYXRhc2V0LmY9aXRlbS5pZCsnLXEnO3EuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57di50ZXh0Q29udGVudD0nSlBHLWt2YWxpdGV0OiAnK3EudmFsdWUrJyUnfSk7cS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpPT5jaGFuZ2VJdGVtKGl0ZW0sJ3F1YWxpdHknLE51bWJlcihxLnZhbHVlKSkpO2wuYXBwZW5kKGVsKCdzcGFuJywnY2lsLWxhYmVsJywnS29tcHJpbWVyaW5nc2t2YWxpdGV0JykscSx2LGVsKCdzcGFuJywnY2lsLWhlbHAnLCdMYXZlcmUgZ2l2ZXIgZW4gbWluZHJlIGZpbCwgbWVuIGbDpnJyZSBkZXRhbGplci4gNzXigJM4NSAlIHBhc3NlciB0aWwgZGUgZmxlc3RlIGZvdG9zLicpKTthZHYuYXBwZW5kKGwpfQogaWYoQ0FOX1FVQU5UJiYoaXRlbS5vdXRwdXQ9PT0naW1hZ2UvcG5nJ3x8aXRlbS5vdXRwdXQ9PT0nYXV0bycpJiYhaXRlbS5hbmltYXRlZClhZHYuYXBwZW5kKGZpZWxkKGl0ZW0ub3V0cHV0PT09J2F1dG8nPydQTkctZmFydmVyIChicnVnZXMsIGh2aXMgZGVyIGdlbW1lcyBzb20gUE5HKSc6J1BORy1mYXJ2ZXInLHNlbGVjdChbWycyNTYnLCcyNTYgZmFydmVyIChhbmJlZmFsZXQpJ10sWycxMjgnLCcxMjggZmFydmVyJ10sWyc2NCcsJzY0IGZhcnZlciddLFsnMzInLCczMiBmYXJ2ZXInXSxbJzAnLCdBbGxlIGZhcnZlciAodWRlbiB0YWIpJ11dLFN0cmluZyhpdGVtLmNvbG91cnMpLGl0ZW0uaWQrJy1jb2wnLHY9PmNoYW5nZUl0ZW0oaXRlbSwnY29sb3VycycsTnVtYmVyKHYpKSkpKTsKIGlmKGFkdi5sYXN0Q2hpbGQmJmFkdi5sYXN0Q2hpbGQucXVlcnlTZWxlY3RvciYmYWR2Lmxhc3RDaGlsZC5xdWVyeVNlbGVjdG9yKCdzZWxlY3RbZGF0YS1mJD0iLWNvbCJdJykpYWR2Lmxhc3RDaGlsZC5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtaGVscCcsJ0bDpnJyZSBmYXJ2ZXIgZ2l2ZXIgZW4gbWluZHJlIGZpbC4gVsOmbGcgQWxsZSBmYXJ2ZXIsIGh2aXMgb3ZlcmdhbmdlIHNlciB1asOmdm5lIHVkLicpKTsKIGlmKGFkdi5jaGlsZE5vZGVzLmxlbmd0aCl7Y29uc3QgZD1lbCgnZGV0YWlscycsJ2NpbC1hZHYnKTtpZihpdGVtLmFkdk9wZW4pZC5vcGVuPXRydWU7ZC5hZGRFdmVudExpc3RlbmVyKCd0b2dnbGUnLCgpPT57aXRlbS5hZHZPcGVuPWQub3Blbn0pO2QuYXBwZW5kKGVsKCdzdW1tYXJ5JyxudWxsLCdBdmFuY2VyZWRlIGluZHN0aWxsaW5nZXInKSxlbCgncCcsJ2NpbC1zbWFsbCcsJ1ZhbGdmcml0LiBTdGFuZGFyZGluZHN0aWxsaW5nZXJuZSBwYXNzZXIgdGlsIGRlIGZsZXN0ZSBiaWxsZWRlci4nKSxhZHYpO2FkdkVsPWR9CiBjYXJkLmFwcGVuZChjKTsKIGNvbnN0IG91dD1vdXRUeXBlKGl0ZW0pOwogaWYoIW91dCloaW50KGNhcmQsJ0luZ2VuIGtvbnZlcnRlcmluZyBuw7hkdmVuZGlnOiBicnVnIGRpbiBvcmlnaW5hbGUgZmlsLicrKGl0ZW0udHlwZT09PSdpbWFnZS9naWYnPycgSHZpcyBlbiBHSUYga29udmVydGVyZXMgdGlsIEpQRyBlbGxlciBQTkcsIGJlaG9sZGVzIGt1biDDqXQgYmlsbGVkZS4nOicnKSk7CiBpZihvdXQ9PT0nYXV0bycpaGludChjYXJkLCdBdXRvbWF0aXNrIHbDpmxnZXIgUE5HIHRpbCBiaWxsZWRlciBtZWQgZ2VubmVtc2lndGlnaGVkIGVsbGVyIGbDpSBmYXJ2ZXIgb2cgSlBHIHRpbCBhbHQgYW5kZXQuIERldCBnZW5rZW5kZXIgaWtrZSwgaHZhZCBiaWxsZWRldCB2aXNlciwgc8OlIHRqZWsgZm9yaMOlbmRzdmlzbmluZ2VuLicpOwogaWYob3V0JiZpdGVtLmFuaW1hdGVkKWhpbnQoY2FyZCwnVmVkIGtvbnZlcnRlcmluZyBiZWhvbGRlcyBrdW4gZGV0IGbDuHJzdGUgYmlsbGVkZS4gQW5pbWF0aW9uZW4gZm9yc3ZpbmRlci4gQmVob2xkIGRlbiBvcmlnaW5hbGUgZmlsIGZvciBhdCBiZXZhcmUgYW5pbWF0aW9uZW4uJywnd2FybicpOwogaWYob3V0JiZpdGVtLnR5cGU9PT0naW1hZ2Uvc3ZnK3htbCcpaGludChjYXJkLCdOw6VyIFNWRyBrb252ZXJ0ZXJlcyB0aWwgSlBHIGVsbGVyIFBORywgYmxpdmVyIGRldCBldCBwaXhlbGJpbGxlZGUuIFRla3N0IG9nIGZvcm1lciBrYW4gc8OlIGlra2UgbMOmbmdlcmUgc2thbGVyZXMgdWRlbiB0YWIgYWYga3ZhbGl0ZXQuJywnd2FybicpOwogaWYob3V0PT09J2ltYWdlL2pwZWcnJiZBTFBIQV9UWVBFUy5pbmNsdWRlcyhpdGVtLnR5cGUpKWhpbnQoY2FyZCwnSlBHIHVuZGVyc3TDuHR0ZXIgaWtrZSBnZW5uZW1zaWd0aWdoZWQuIEdlbm5lbXNpZ3RpZ2Ugb21yw6VkZXIgYmxpdmVyIGh2aWRlLicpOwogaWYob3V0PT09J2ltYWdlL3BuZycmJml0ZW0udHlwZT09PSdpbWFnZS9qcGVnJyloaW50KGNhcmQsJ1BORyBlciBzb20gcmVnZWwgbWVnZXQgc3TDuHJyZSBlbmQgSlBHIHRpbCBmb3Rvcy4nKTsKIGlmKGFkdkVsKWNhcmQuYXBwZW5kKGFkdkVsKTsKfQpmdW5jdGlvbiByZXN1bHRGb3IoY2FyZCxpdGVtKXsKIGNvbnN0IHI9aXRlbS5yZXN1bHQ7CiBpZihyLmtlcHRPcmlnaW5hbCl7aGludChjYXJkLCh0b29OYXJyb3coaXRlbSk\/J0ZpbHN0w7hycmVsc2VuIGVyIGFsbGVyZWRlIGdvZHQgb3B0aW1lcmV0LCBtZW4gYmlsbGVkZXQgZXIgc3RhZGlnIGZvciBzbWFsdCAoc2Ugb3ZlbmZvcikuJzonRGluIG9yaWdpbmFsZSBmaWwgZXIgYWxsZXJlZGUgZ29kdCBvcHRpbWVyZXQuJykrJyBPcHRpbWVyaW5nZW4gZ2F2IGVuIHN0w7hycmUgZmlsICgnK2ZtdChyLnRyaWVkU2l6ZSkrJyksIHPDpSBicnVnIGZvcnRzYXQgZGluIG9yaWdpbmFsZSBmaWwgKCcrZm10KGl0ZW0uZmlsZS5zaXplKSsnKS4gRGVuIGtvbW1lciBzdGFkaWcgbWVkLCBodmlzIGR1IGRvd25sb2FkZXIgZW4gWklQLicsdG9vTmFycm93KGl0ZW0pPyd3YXJuJzonc3VjY2VzcycpO3JldHVybn0KIGNvbnN0IGRlbHRhPSgxLXIuYmxvYi5zaXplL2l0ZW0uZmlsZS5zaXplKSoxMDAsYWNjZXB0ZWQ9Q01fQUNDRVBURUQuaW5jbHVkZXMoaXRlbS50eXBlKSYmIWl0ZW0ubWlzbWF0Y2g7CiBsZXQgdD0nT3B0aW1lcmV0IGZpbDogJytmbXQoci5ibG9iLnNpemUpKycgwrcgJytyLndpZHRoKycgw5cgJytyLmhlaWdodCsnIHB4IMK3ICcrdHlwZUxhYmVsKHIudHlwZSkrJyDCtyAnOwogaWYoTWF0aC5hYnMoZGVsdGEpPDAuNSl0Kz0nY2EuIHNhbW1lIHN0w7hycmVsc2Ugc29tIG9yaWdpbmFsZW4uJztlbHNlIGlmKGRlbHRhPjApdCs9ZGVsdGEudG9GaXhlZCgwKSsnJSBtaW5kcmUuJztlbHNlIGlmKHIud2lkdGghPT1pdGVtLndpZHRoKXQrPU1hdGguYWJzKGRlbHRhKS50b0ZpeGVkKDApKyclIHN0w7hycmUsIGZvcmRpIGJpbGxlZGV0IGJsZXYgw6ZuZHJldCB0aWwgJytyLndpZHRoKycgcHguJztlbHNlIHQrPU1hdGguYWJzKGRlbHRhKS50b0ZpeGVkKDApKyclIHN0w7hycmUuJysoYWNjZXB0ZWQ\/JyBPcmlnaW5hbGVuIGVyIG1pbmRyZSwgc8OlIGR1IGthbiBiZWhvbGRlIGRlbiBpIHN0ZWRldC4nOicnKTsKIGlmKHIucmVhc29uKXQrPScgJytyLnJlYXNvbjsKIGlmKHIuYmdNaXhlZCliZ0hpbnQoY2FyZCxyLmJnTWl4ZWQpOwogY29uc3QgZW5sPSFyLmtlcHRPcmlnaW5hbCYmaXRlbS50eXBlIT09J2ltYWdlL3N2Zyt4bWwnJiZpdGVtLndpZHRoPHIud2lkdGgqMC45OwogaWYoZW5sKXtoaW50KGNhcmQsJ0ZvcnN0w7hycmV0IGJpbGxlZGU6IGJpbGxlZGV0IGVyIGZvcnN0w7hycmV0IGZyYSAnK2l0ZW0ud2lkdGgrJyBweCB0aWwgJytyLndpZHRoKycgcHgsIHPDpSBkZXQgYmxpdmVyIG1pbmRyZSBza2FycHQuIFZpIGFuYmVmYWxlciBpa2tlIGF0IGJydWdlIGV0IGZvcnN0w7hycmV0IGJpbGxlZGUuIEJydWcgaSBzdGVkZXQgZXQgc3TDuHJyZSBiaWxsZWRlLCBkZXIgZXIgbWluZHN0ICcrci53aWR0aCsnIHB4IGJyZWR0LiBGb3JzdMO4cnJldCBmaWw6ICcrZm10KHIuYmxvYi5zaXplKSsnIMK3ICcrci53aWR0aCsnIMOXICcrci5oZWlnaHQrJyBweCDCtyAnK3R5cGVMYWJlbChyLnR5cGUpKycuJywnYWxlcnQnKTtyZXR1cm59CiBpZighci5rZXB0T3JpZ2luYWwpe2lmKHIuYmxvYi5zaXplPk1CJiYhL2xvd2VyIHRoZSBKUEcgcXVhbGl0eS8udGVzdCh0KSl0Kz0nIEZpbGVuIGVyIHN0YWRpZyBmb3Job2xkc3ZpcyBzdG9yICgnK2ZtdChyLmJsb2Iuc2l6ZSkrJykuIFPDpm5rIEpQRy1rdmFsaXRldGVuIHVuZGVyIEF2YW5jZXJlZGUgaW5kc3RpbGxpbmdlciwgZWxsZXIgdsOmbGcgZW4gbWluZHJlIGJyZWRkZS4nO2Vsc2UgaWYoci5ibG9iLnNpemU+NTAwKktCJiZyLmJsb2Iuc2l6ZTw9TUIpdCs9JyBGaWxlbiBlciBzdGFkaWcgcmV0IHN0b3IgKCcrZm10KHIuYmxvYi5zaXplKSsnKS4gRHUga2FuIG92ZXJ2ZWplIGF0IHPDpm5rZSBKUEcta3ZhbGl0ZXRlbiB1bmRlciBBdmFuY2VyZWRlIGluZHN0aWxsaW5nZXIuJ30KIGNvbnN0IGx2Uj1sZXZlbChpdGVtKTtoaW50KGNhcmQsdCxyLmtlcHRPcmlnaW5hbD8oZGVsdGE+PTB8fCFhY2NlcHRlZD8nc3VjY2Vzcyc6J3dhcm4nKTpsdlI+PTM\/J2FsZXJ0JzpsdlI+PTI\/J3dhcm4nOidzdWNjZXNzJyk7Cn0KZnVuY3Rpb24gcHJldmlld0ZvcihjYXJkLGl0ZW0pewogY29uc3Qgcj1pdGVtLnJlc3VsdCx3cmFwPWVsKCdkaXYnLCdjaWwtY29tcGFyZScpLHZpZXdzPVtdLGJhcj1lbCgnZGl2JywnY2lsLWFjdGlvbnMnKTsKIGNvbnN0IHBhbmU9KHRpdGxlLGtleSxibG9iLG1ldGEpPT57Y29uc3QgZj1lbCgnZmlndXJlJywnY2lsLXBhbmUnKSx2PWVsKCdkaXYnLCdjaWwtdmlldycpO2lmKGl0ZW0uYWN0dWFsKXYuZGF0YXNldC5hY3R1YWw9JzEnO2lmKGJsb2Ipey8qIHJldXNlIHRoZSBzYW1lIGltZyBlbGVtZW50IGJldHdlZW4gcmVuZGVycyBzbyB0aGUgcHJldmlldyBkb2VzIG5vdCBmbGlja2VyICovaXRlbS5faW1zPWl0ZW0uX2ltc3x8e307Y29uc3QgYz1pdGVtLl9pbXNba2V5XTtsZXQgaW07aWYoYyYmYy5ibG9iPT09YmxvYil7aW09Yy5pbX1lbHNle2ltPWVsKCdpbWcnKTtpbS5hbHQ9dGl0bGUrJzogJysoaXRlbS5maWxlLm5hbWV8fCdpbWFnZScpO2ltLm9uZXJyb3I9KCk9PntpZihpbS5kYXRhc2V0LmZiKXJldHVybjtpbS5kYXRhc2V0LmZiPScxJzsvKiBibG9iOiBibG9ja2VkIGJ5IHRoZSBzaXRlIHNlY3VyaXR5IHBvbGljeTogdXNlIGEgZGF0YSBVUkwgaW5zdGVhZCAqL2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e2ltLnNyYz1yLnJlc3VsdH07ci5yZWFkQXNEYXRhVVJMKGJsb2IpfTtpbS5zcmM9b2JqVXJsKGl0ZW0sa2V5LGJsb2IpO2l0ZW0uX2ltc1trZXldPXtibG9iLGltfX12LmFwcGVuZChpbSl9ZWxzZSB2LmFwcGVuZChlbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ09wdGltw6lyIGJpbGxlZGV0IGZvciBhdCBzZSByZXN1bHRhdGV0IGhlci4nKSk7Zi5hcHBlbmQodixlbCgnZmlnY2FwdGlvbicsbnVsbCxtZXRhP3RpdGxlKycgwrcgJyttZXRhOnRpdGxlKSk7dmlld3MucHVzaCh2KTtyZXR1cm4gZn07CiBjb25zdCBwaWNrQmFyPWl0ZW0ucmVzdWx0JiYhaXRlbS5yZXN1bHQua2VwdE9yaWdpbmFsJiYhaXRlbS5lZGl0aW5nPygoKT0+e2NvbnN0IHBiPWVsKCdkaXYnLCdjaWwtcGlja2JhcicpO3BiLmFwcGVuZChidXR0b24oJ0Rvd25sb2FkICcrdHlwZUxhYmVsKGl0ZW0ucmVzdWx0LnR5cGUpLCgpPT57dHJhY2soJ2Rvd25sb2FkJyk7ZG93bmxvYWQoaXRlbS5yZXN1bHQuYmxvYixpdGVtLnJlc3VsdC5uYW1lKX0sJycsaXRlbS5pZCsnLWRsJykpO2lmKGl0ZW0udHJhbnNwKXBiLmFwcGVuZChidXR0b24oJ1JlZGlnw6lyIGJhZ2dydW5kIG1hbnVlbHQnLCgpPT5vcGVuRWRpdG9yKGl0ZW0pLCdjaWwtYnRuLXNlY29uZGFyeScsaXRlbS5pZCsnLWVkaXQnKSk7aWYoKGl0ZW0uY2xpY2tzfHxbXSkubGVuZ3RoKXtjb25zdCBycz1lbCgnYnV0dG9uJywnY2lsLWJ0bi10ZXh0JywnRm9ydHJ5ZCBtYW51ZWxsZSDDpm5kcmluZ2VyJyk7cnMudHlwZT0nYnV0dG9uJztycy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PntpdGVtLmNsaWNrcz1bXTtvcHRpbWlzZShpdGVtKX0pO3BiLmFwcGVuZChycyl9cmV0dXJuIHBifSkoKTpudWxsOwogd3JhcC5hcHBlbmQocGFuZSgnT3JpZ2luYWwnLCdvcmlnJyxpdGVtLmZpbGUsZm10KGl0ZW0uZmlsZS5zaXplKSsnIMK3ICcraXRlbS53aWR0aCsnIMOXICcraXRlbS5oZWlnaHQrJyBweCcpLHBhbmUociYmci5rZXB0T3JpZ2luYWw\/J09yaWdpbmFsIGJlaG9sZHQnOidPcHRpbWVyZXQnLCdyZXMnLHI\/ci5ibG9iOm51bGwscj9mbXQoci5ibG9iLnNpemUpKycgwrcgJytyLndpZHRoKycgw5cgJytyLmhlaWdodCsnIHB4JzonJykpOwogbGV0IGxvY2s9ZmFsc2U7dmlld3MuZm9yRWFjaCh2PT52LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsKCk9PntpZihsb2NrKXJldHVybjtsb2NrPXRydWU7Y29uc3Qgbz12aWV3c1t2aWV3c1swXT09PXY\/MTowXSxmeD12LnNjcm9sbExlZnQvTWF0aC5tYXgoMSx2LnNjcm9sbFdpZHRoLXYuY2xpZW50V2lkdGgpLGZ5PXYuc2Nyb2xsVG9wL01hdGgubWF4KDEsdi5zY3JvbGxIZWlnaHQtdi5jbGllbnRIZWlnaHQpO28uc2Nyb2xsTGVmdD1meCooby5zY3JvbGxXaWR0aC1vLmNsaWVudFdpZHRoKTtvLnNjcm9sbFRvcD1meSooby5zY3JvbGxIZWlnaHQtby5jbGllbnRIZWlnaHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2xvY2s9ZmFsc2V9KX0pKTsKIGJhci5hcHBlbmQoYnV0dG9uKGl0ZW0uYWN0dWFsPydUaWxwYXMgdGlsIGJva3Nlbic6J1ZpcyBpIGZha3Rpc2sgc3TDuHJyZWxzZScsKCk9PntpdGVtLmFjdHVhbD0haXRlbS5hY3R1YWw7cmVuZGVyKCl9LCdjaWwtYnRuLXRleHQnLGl0ZW0uaWQrJy16b29tJyksZWwoJ3NwYW4nLCdjaWwtc21hbGwnLCdUamVrIGRldGFsamVyLCB0ZWtzdCBvZyBrYW50ZXIgaSBmYWt0aXNrIHN0w7hycmVsc2UuJykpOwogY2FyZC5hcHBlbmQoYmFyLHdyYXApO2lmKGl0ZW0uZWRpdGluZyljYXJkLmFwcGVuZChlZGl0b3JGb3IoaXRlbSkpOwp9CmZ1bmN0aW9uIHdlYnNpdGVGaWVsZHMoaXRlbSl7CiBjb25zdCBnPWVsKCdkaXYnLCdjaWwtZ3JpZCcpLHA9aXRlbS53UGxhY2VtZW50OwogZy5hcHBlbmQoZmllbGRIZWxwKCdQbGFjZXJpbmcnLHNlbGVjdChbWydub25lJywnSWtrZSB2YWxndCddLFsnaGVhZGVyJywnSGVhZGVyJ10sWydiYWNrZ3JvdW5kJywnQmFnZ3J1bmQgaSBzZWt0aW9uJ10sWydzZWN0aW9uJywnQmlsbGVkZSBpIHNla3Rpb24nXSxbJ2NvbHVtbnMnLCdCaWxsZWRlIGkga29sb25uZSddLFsnY3VzdG9tJywnRWdlbiBicmVkZGUnXSxbJ290aGVyJywnQW5kZXQgYmlsbGVkZSddXSxwLGl0ZW0uaWQrJy13cCcsdj0+Y2hhbmdlSXRlbShpdGVtLCd3UGxhY2VtZW50Jyx2KSksJ0hlYWRlciBvZyBCYWdncnVuZCBpIHNla3Rpb24ga3LDpnZlciBwcsOmY2lzIGRlbiBicmVkZGUsIGRlciBwYXNzZXIgdGlsIGRpdCB0ZW1hIG9nIGRpbiBza8Omcm1zdMO4cnJlbHNlLiBFdCBoZWFkZXJiaWxsZWRlIHRpbHBhc3NlciBzaWcgc2vDpnJtZW5zIGJyZWRkZS4gRXQgYmFnZ3J1bmRzYmlsbGVkZSBpIGVuIHNla3Rpb24gc2thbGVyZXMgaWtrZSwgc8OlIHDDpSBzbWFsbGVyZSBza8Omcm1lIHNrw6ZyZXMgaMO4anJlIHNpZGUgYWYuIFBsYWPDqXIgdmlndGlndCBpbmRob2xkIGkgdmVuc3RyZSBkZWwgYWYgYmlsbGVkZXQuIEJpbGxlZGUgaSBzZWt0aW9uIGVyIGV0IGJpbGxlZGUsIGRlciBzdMOlciBkaXJla3RlIGkgZW4gc2VrdGlvbiB1ZGVuIGtvbG9ubmVyLiBCaWxsZWRlIGkgc2VrdGlvbiBvZyBCaWxsZWRlIGkga29sb25uZSBoYXIgZW4gYW5iZWZhbGV0IGJyZWRkZSwgc8OlIGJpbGxlZGVybmUgZmx1Z3Rlci4gSGFyIGR1IMOmbmRyZXQga29sb25uZWJyZWRkZXJuZSwgc8OlIHbDpmxnIEVnZW4gYnJlZGRlLicsJ3dwLScraXRlbS5pZCkpOwogaWYoV0VCU0lURVtwXSl7Zy5hcHBlbmQoZmllbGQoJ1RlbWEnLHNlbGVjdChbWydhJywnU3RhbmRhcmQgQSddLFsnYicsJ1N0YW5kYXJkIEInXSxbJ2MnLCdTdGFuZGFyZCBDJ11dLGl0ZW0ud1RoZW1lLGl0ZW0uaWQrJy13dCcsdj0+Y2hhbmdlSXRlbShpdGVtLCd3VGhlbWUnLHYpKSkpOwogIGlmKHAhPT0nc2VjdGlvbicpZy5hcHBlbmQoZmllbGQoKHA9PT0nYmFja2dyb3VuZCd8fHA9PT0naGVhZGVyJyk\/J0VuaGVkJzonS29sb25uZXInLHNlbGVjdCgoKHA9PT0nYmFja2dyb3VuZCd8fHA9PT0naGVhZGVyJyk\/WydEZXNrdG9wJywnVGFibGV0JywnTW9iaWwnXTpbJ8OJbiBrb2xvbm5lJywnVG8ga29sb25uZXInLCdUcmUga29sb25uZXInXSkubWFwKCh4LGkpPT5bU3RyaW5nKGkpLHhdKSxpdGVtLndWYXJpYW50LGl0ZW0uaWQrJy13dicsdj0+Y2hhbmdlSXRlbShpdGVtLCd3VmFyaWFudCcsdikpKSl9CiBpZihwPT09J2N1c3RvbScpe2cuYXBwZW5kKHdpZHRoRmllbGQoaXRlbSwnc2l0ZVdpZHRoJywnQmlsbGVkYnJlZGRlIHDDpSBkaXQgd2Vic2l0ZScpKTtpZihpdGVtLnNpdGVXaWR0aFVuaXQ9PT0nJScpe2NvbnN0IGY9ZmllbGQoJ0JyZWRkZSBww6Ugc2VrdGlvbmVuIGVsbGVyIGtvbG9ubmVuIChweCknLG51bUlucHV0KGl0ZW0sJ3NpdGVCYXNlJyxNQVhfSU5QVVRfV0lEVEgsJ2UuZy4gMTE0MCcpKSxweD1zdWdnZXN0ZWQoaXRlbSk7Zi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLHB4Pyc9ICcrcHgrJyBweC4nOidQcm9jZW50ZW4gYmVyZWduZXMgdWQgZnJhIGRlbm5lIGJyZWRkZS4nKSk7Zy5hcHBlbmQoZil9fQogaWYocD09PSdoZWFkZXInKWcuYXBwZW5kKGVsKCdwJywnY2lsLWhlbHAgY2lsLXBsYWNlbWVudC1ub3RlJywnQnJ1ZyBkZW4gYW5iZWZhbGVkZSBicmVkZGUuIEV0IGhlYWRlcmJpbGxlZGUgdGlscGFzc2VyIHNpZyBza8Omcm1lbnMgYnJlZGRlLicpKTsKIGlmKHA9PT0nYmFja2dyb3VuZCcpZy5hcHBlbmQoZWwoJ3AnLCdjaWwtaGVscCBjaWwtcGxhY2VtZW50LW5vdGUnLCdFdCBiYWdncnVuZHNiaWxsZWRlIGkgZW4gc2VrdGlvbiBza2FsZXJlcyBpa2tlLiBEZXQgdmlzZXMgaSBzaW4gZWdlbiBzdMO4cnJlbHNlIGZyYSB2ZW5zdHJlIGthbnQsIHPDpSBww6Ugc2vDpnJtZSwgZGVyIGVyIHNtYWxsZXJlIGVuZCBkZW4gYW5iZWZhbGVkZSBicmVkZGUsIHNrw6ZyZXMgaMO4anJlIHNpZGUgYWYuIERlIGFuYmVmYWxlZGUgYnJlZGRlciBwYXNzZXIgdGlsIGRlbiBicmVkZXN0ZSBza8Omcm0gaSBodmVyIGdydXBwZTogZGVza3RvcCwgdGFibGV0IG9nIG1vYmlsLiBQbGFjw6lyIHZpZ3RpZ3QgaW5kaG9sZCBpIHZlbnN0cmUgZGVsIGFmIGJpbGxlZGV0LicpKTsKIHJldHVybiBnOwp9CmZ1bmN0aW9uIG51bUlucHV0KGl0ZW0scHJvcCxtYXgscGgpe2NvbnN0IHc9ZWwoJ2lucHV0Jyk7dy50eXBlPSdudW1iZXInO3cubWluPScxJzt3Lm1heD1TdHJpbmcobWF4KTt3LnN0ZXA9JzEnO3cuaW5wdXRNb2RlPSdudW1lcmljJzt3LnBsYWNlaG9sZGVyPXBoO3cudmFsdWU9aXRlbVtwcm9wXT9TdHJpbmcoaXRlbVtwcm9wXSk6Jyc7dy5pZD0nY2lsLScraXRlbS5pZCsnLScrcHJvcDt3LmRhdGFzZXQuZj1pdGVtLmlkKyctJytwcm9wO3cuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKT0+e2NvbnN0IG49TnVtYmVyKHcudmFsdWUpO2NoYW5nZUl0ZW0oaXRlbSxwcm9wLE51bWJlci5pc0ludGVnZXIobikmJm4+PTEmJm48PW1heD9uOjApfSk7cmV0dXJuIHd9CmZ1bmN0aW9uIHdpZHRoRmllbGQoaXRlbSxwcm9wLGxhYmVsKXsKIGNvbnN0IHVuaXQ9aXRlbVtwcm9wKydFbmhlZCddLHBjdD11bml0PT09JyUnLGY9ZWwoJ2RpdicsJ2NpbC1maWVsZCcpLGw9ZWwoJ2xhYmVsJywnY2lsLWxhYmVsJyxsYWJlbCkscm93PWVsKCdkaXYnLCdjaWwtdW5pdHJvdycpOwogY29uc3Qgdz1udW1JbnB1dChpdGVtLHByb3AscGN0PzEwMDpNQVhfSU5QVVRfV0lEVEgscGN0PydlLmcuIDUwJzonZS5nLiA0MDAnKTtsLmh0bWxGb3I9dy5pZDsKIGNvbnN0IHU9c2VsZWN0KFtbJ3B4JywncHgnXSxbJyUnLCclJ11dLHVuaXQsaXRlbS5pZCsnLScrcHJvcCsnLXVuaXQnLHY9PntpdGVtW3Byb3BdPTA7Y2hhbmdlSXRlbShpdGVtLHByb3ArJ0VuaGVkJyx2KX0pO3Uuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnRW5oZWQnKTsKIHJvdy5hcHBlbmQodyx1KTtmLmFwcGVuZChsLHJvdyk7CiBjb25zdCBweD1zdWdnZXN0ZWQoaXRlbSk7CiBpZihwY3QmJnByb3A9PT0nbGF5b3V0V2lkdGgnKWYuYXBwZW5kKGVsKCdzcGFuJywnY2lsLXNtYWxsJyxweD8nPSAnK3B4KycgcHggYWYgc3RhbmRhcmRicmVkZGVuIHDDpSA2MDAgcHggZm9yIGUtbWFpbHMuJzonUHJvY2VudCBhZiBzdGFuZGFyZGJyZWRkZW4gcMOlIDYwMCBweCBmb3IgZS1tYWlscy4nKSk7CiBlbHNlIGlmKCFwY3QpZi5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc21hbGwnLHByb3A9PT0nbGF5b3V0V2lkdGgnPydCcnVnIGRldHRlLCBodmlzIGR1IGhhciDDpm5kcmV0IGtvbG9ubmUtIGVsbGVyIGJpbGxlZGJyZWRkZW4uJzonQnJ1ZyBkZXR0ZSwgaHZpcyBkdSBoYXIgYW5naXZldCBlbiBiZXN0ZW10IGJyZWRkZSBmb3IgYmlsbGVkZXQgZWxsZXIga29sb25uZW4uJykpOwogcmV0dXJuIGY7Cn0KZnVuY3Rpb24gZW1haWxGaWVsZHMoaXRlbSl7CiBjb25zdCBnPWVsKCdkaXYnLCdjaWwtZ3JpZCcpOwogZy5hcHBlbmQoZmllbGQoJ1BsYWNlcmluZyAodmFsZ2ZyaSknLHNlbGVjdChbWycxJywnw4luIGtvbG9ubmUnXSxbJzInLCdUbyBrb2xvbm5lciddLFsnMycsJ1RyZSBrb2xvbm5lciddLFsnY3VzdG9tJywnRWdlbiBicmVkZGUnXV0saXRlbS5sYXlvdXQsaXRlbS5pZCsnLWxheW91dCcsdj0+Y2hhbmdlSXRlbShpdGVtLCdsYXlvdXQnLHYpKSkpOwogaWYoaXRlbS5sYXlvdXQ9PT0nY3VzdG9tJylnLmFwcGVuZCh3aWR0aEZpZWxkKGl0ZW0sJ2xheW91dFdpZHRoJywnQmlsbGVkYnJlZGRlIGkgZGluIGUtbWFpbCcpKTsKIHJldHVybiBnOwp9CmZ1bmN0aW9uIHVybEJvZHkoY2FyZCxpdGVtKXsKIGNvbnN0IHJlYz1zdWdnZXN0ZWQoaXRlbSk7bGV0IHQ9Jyc7CiBpZihyZWMmJmlzRXhhY3QoaXRlbSkpe2lmKGl0ZW0ud2lkdGg9PT1yZWMpdD0nUmlndGlnIGJyZWRkZTogZGVubmUgcGxhY2VyaW5nIGtyw6Z2ZXIgJytyZWMrJyBweCwgb2cgYmlsbGVkZXQgZXIgJytpdGVtLndpZHRoKycgcHggYnJlZHQuJztlbHNle2hpbnQoY2FyZCwnRm9ya2VydCBicmVkZGUgdGlsIGRlbm5lIHBsYWNlcmluZzogYmlsbGVkZXQgZXIgJytpdGVtLndpZHRoKycgcHggYnJlZHQsIG9nIHBsYWNlcmluZ2VuIGtyw6Z2ZXIgcHLDpmNpcyAnK3JlYysnIHB4LiBCaWxsZWRlciwgZGVyIGVyIGZvciBzbWFsbGUgZWxsZXIgZm9yIGJyZWRlLCBibGl2ZXIgbcOlc2tlIGlra2UgdmlzdCBzb20gdGlsdMOmbmt0IGkgV2Vic2l0ZS1EZXNpZ25lci4gJysoaXRlbS53aWR0aDxyZWMqMC45PydCcnVnIGV0IHN0w7hycmUgYmlsbGVkZSwgZGVyIGVyIG1pbmRzdCAnK3JlYysnIHB4IGJyZWR0Lic6J0dlbSBiaWxsZWRldCBww6UgZGluIGNvbXB1dGVyLCB0aWxmw7hqIGRldCBzb20gZmlsLCBvZyB2w6ZsZyDDhm5kciB0aWwgcHLDpmNpcyAnK3JlYysnIHB4LicpLCd3YXJuJyl9fQogZWxzZSBpZihyZWMpe3Q9KGlzQ3VzdG9tV2lkdGgoaXRlbSk\/J0RpbiBiaWxsZWRicmVkZGU6ICcrcmVjKycgcHguICc6J0FuYmVmYWxldCBiaWxsZWRicmVkZGU6IGNhLiAnK3JlYysnIHB4LiAnKTt0Kz1pdGVtLndpZHRoPHJlYz8nQmlsbGVkZXQgZXIgc21hbGxlcmUgZW5kIGRlbiBhbmJlZmFsZWRlIGJyZWRkZSBvZyBrYW4gc2UgbWluZHJlIHNrYXJwdCB1ZC4nOml0ZW0ud2lkdGg+cmVjKjI\/J0JpbGxlZGV0IGVyIG1lZ2V0IGJyZWRlcmUgZW5kIG7DuGR2ZW5kaWd0LiBFbiBtaW5kcmUgdmVyc2lvbiB2aWxsZSBpbmRsw6ZzZXMgaHVydGlnZXJlLic6J0JyZWRkZW4gc2VyIHBhc3NlbmRlIHVkLid9CiBlbHNlIGlmKGlzQ3VzdG9tV2lkdGgoaXRlbSkpdD0nQW5naXYgYmlsbGVkYnJlZGRlbiBpIHB4IGZvciBhdCBzYW1tZW5saWduZSBkZW4gbWVkIGJpbGxlZGV0Lic7CiBlbHNlIGlmKGFyZWE9PT0nd2Vic2l0ZScmJml0ZW0ud1BsYWNlbWVudD09PSdub25lJyl0PSdWw6ZsZyBlbiBwbGFjZXJpbmcgZm9yIGF0IHNlIGVuIGFuYmVmYWxldCBicmVkZGUuJzsKIGlmKHQpaGludChjYXJkLHQpOwogaWYoaXRlbS50eXBlJiYhQ01fQUNDRVBURUQuaW5jbHVkZXMoaXRlbS50eXBlKSloaW50KGNhcmQsdHlwZUxhYmVsKGl0ZW0udHlwZSkrJy1maWxlciBrYW4gaWtrZSB1cGxvYWRlcyB0aWwgbWVkaWVhcmtpdmV0IGkgQ29uZmVyZW5jZSBNYW5hZ2VyLicrKGFyZWE9PT0nZW1haWwnPycgVmlhIEJpbGxlZGUgKFVSTCkgdmlzZXMgZGUgbcOlc2tlIGlra2UgZm9yIGFsbGUgbW9kdGFnZXJlLic6JycpLCd3YXJuJyk7CiBpZighaXRlbS50eXBlKWhpbnQoY2FyZCwnRm9ybWF0ZXQga3VubmUgaWtrZSBmaW5kZXMgdWQgZnJhIFVSTFwnZW4uJyk7CiBpZihpdGVtLmZpbGUuc2l6ZT41MDAqS0IpaGludChjYXJkLGl0ZW0uZmlsZS5zaXplPk1CPydGaWxlbiBlciBvdmVyIDEgTUIuIE92ZXJ2ZWogYXQgb3B0aW1lcmUgZGVuLic6J092ZXJ2ZWogYXQgZ8O4cmUgZGVuIGZvcmhvbGRzdmlzIHN0b3JlIGZpbCBtaW5kcmUuJyxpdGVtLmZpbGUuc2l6ZT5NQj8nd2Fybic6JycpOwogZWxzZSBpZighaXRlbS5maWxlLnNpemUpaGludChjYXJkLCdGaWxzdMO4cnJlbHNlbiBrYW4gaWtrZSBsw6ZzZXMsIGZvcmRpIGRldCB3ZWJzaXRlLCBiaWxsZWRldCBsaWdnZXIgcMOlLCBpa2tlIHRpbGxhZGVyIGRldC4gR2VtIGJpbGxlZGV0IHDDpSBkaW4gY29tcHV0ZXIsIG9nIHRpbGbDuGogZGV0IG92ZW5mb3IgZm9yIGF0IHRqZWtrZSBmaWxzdMO4cnJlbHNlbiBlbGxlciBrb252ZXJ0ZXJlIGJpbGxlZGV0LicsJ3dhcm4nKTsKIGNvbnN0IHY9ZWwoJ2RpdicsJ2NpbC12aWV3JyksaW09ZWwoJ2ltZycpO2ltLmFsdD0nRm9yaMOlbmRzdmlzbmluZzogJytpdGVtLmZpbGUubmFtZTtpbS5yZWZlcnJlclBvbGljeT0nbm8tcmVmZXJyZXInO2ltLnNyYz1pdGVtLnNyY1VybDt2LnN0eWxlLmhlaWdodD0nMTgwcHgnO3YuYXBwZW5kKGltKTtjYXJkLmFwcGVuZCh2KTsKfQphc3luYyBmdW5jdGlvbiBjaGVja1VybChyYXcpewogbGV0IHU7dHJ5e3U9bmV3IFVSTChyYXcpfWNhdGNoKGUpe3U9bnVsbH0KIGlmKCF1fHwhL15odHRwcz86JC8udGVzdCh1LnByb3RvY29sKSl7c3RhdHVzKCdJbmR0YXN0IGVuIGZ1bGQgYmlsbGVkLVVSTCwgZGVyIHN0YXJ0ZXIgbWVkIGh0dHBzOi8vJyk7JCgnY2lsLXVybCcpLmZvY3VzKCk7cmV0dXJufQogaWYoaXRlbXMuc29tZShpPT5pLnNyY1VybD09PXUuaHJlZikpe3N0YXR1cygnQmlsbGVkZXQgZXIgYWxsZXJlZGUgcMOlIGxpc3Rlbi4nKTtyZXR1cm59CiBjb25zdCBidG49JCgnY2lsLXVybC1idG4nKTtidG4uZGlzYWJsZWQ9dHJ1ZTtidG4udGV4dENvbnRlbnQ9J1RpbGbDuGplcuKApic7dHJhY2soJ3VybCcpO3N0YXR1cygnVGpla2tlciBiaWxsZWRl4oCmJyk7CiBsZXQgbmFtZT0naW1hZ2UnO3RyeXtuYW1lPWRlY29kZVVSSUNvbXBvbmVudCh1LnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCl8fCcnKXx8dS5ob3N0bmFtZX1jYXRjaChlKXtuYW1lPXUuaG9zdG5hbWV9bmFtZT1uYW1lLnNsaWNlKDAsMTUwKTsKIHRyeXsKICB0cnl7CiAgIGNvbnN0IGN0bD1uZXcgQWJvcnRDb250cm9sbGVyKCksdG09c2V0VGltZW91dCgoKT0+Y3RsLmFib3J0KCksMTUwMDApOwogICBjb25zdCByPWF3YWl0IGZldGNoKHUuaHJlZix7bW9kZTonY29ycycsY3JlZGVudGlhbHM6J29taXQnLHJlZmVycmVyUG9saWN5Oiduby1yZWZlcnJlcicsc2lnbmFsOmN0bC5zaWduYWx9KTtjbGVhclRpbWVvdXQodG0pOwogICBpZihyLm9rKXtjb25zdCBibG9iPWF3YWl0IHIuYmxvYigpO2NvbnN0IGJlZm9yZT1pdGVtcy5sZW5ndGg7YXdhaXQgYWRkRmlsZXMoW25ldyBGaWxlKFtibG9iXSxuYW1lLHt0eXBlOmJsb2IudHlwZSxsYXN0TW9kaWZpZWQ6MH0pXSk7aWYoaXRlbXMubGVuZ3RoPmJlZm9yZSl7aXRlbXNbaXRlbXMubGVuZ3RoLTFdLnNyY1VybD11LmhyZWY7JCgnY2lsLXVybCcpLnZhbHVlPScnO3N0YXR1cygnQmlsbGVkZXQgZXIgaGVudGV0IGZyYSBVUkxcJ2VuLiBGaWxzdMO4cnJlbHNlLCBmb3JtYXQgb2cga29udmVydGVyaW5nIGVyIHRpbGfDpm5nZWxpZ2UuJyl9cmV0dXJufQogIH1jYXRjaChlKXt9CiAgY29uc3QgaW1nPWF3YWl0IG5ldyBQcm9taXNlKChyZXMscmVqKT0+e2NvbnN0IGltPW5ldyBJbWFnZSgpLHRtPXNldFRpbWVvdXQoKCk9PnJlaihFcnJvcigndGltZW91dCcpKSwxNTAwMCk7aW0ucmVmZXJyZXJQb2xpY3k9J25vLXJlZmVycmVyJztpbS5vbmxvYWQ9KCk9PntjbGVhclRpbWVvdXQodG0pO3JlcyhpbSl9O2ltLm9uZXJyb3I9KCk9PntjbGVhclRpbWVvdXQodG0pO3JlaihFcnJvcignbG9hZCcpKX07aW0uc3JjPXUuaHJlZn0pOwogIGNvbnN0IHR5cGU9RVhUX1RZUEVbZXh0T2YodS5wYXRobmFtZSldfHwnJztsZXQgc2l6ZT0wOwogIHRyeXtjb25zdCBlbj1wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHUuaHJlZikucG9wKCk7c2l6ZT1lbj8oZW4uZW5jb2RlZEJvZHlTaXplfHwwKTowfWNhdGNoKGUpe30KICBpdGVtcy5wdXNoKHtpZDpzZXJpYWwrKyxrZXk6J3VybDonK3UuaHJlZixzcmNVcmw6dS5ocmVmLHVybE9ubHk6dHJ1ZSxmaWxlOntuYW1lLHNpemV9LHR5cGUsY2xhaW1lZDp0eXBlLG1pc21hdGNoOmZhbHNlLHdpZHRoOmltZy5uYXR1cmFsV2lkdGgsaGVpZ2h0OmltZy5uYXR1cmFsSGVpZ2h0LGxvYWRpbmc6ZmFsc2UsZXJyb3I6JycsZnJhbWVzOjAsYW5pbWF0ZWQ6ZmFsc2UsbGF5b3V0OicxJyxsYXlvdXRXaWR0aDowLHNpdGVXaWR0aDowLGxheW91dFdpZHRoVW5pdDoncHgnLHNpdGVXaWR0aFVuaXQ6J3B4JyxzaXRlQmFzZTowLHdQbGFjZW1lbnQ6J25vbmUnLHdUaGVtZTonYScsd1ZhcmlhbnQ6JzAnLGNvbXBhcmU6ZmFsc2UsdHJhbnNwOmZhbHNlLHRvbDo0MCxjbGlja3M6W10sYWN0dWFsOmZhbHNlLHVybHM6e30sb3V0cHV0OidvcmlnaW5hbCcscmVzaXplOidvcmlnaW5hbCcsY3VzdG9tV2lkdGg6MCxxdWFsaXR5OjgyLHJlc3VsdDpudWxsLGJ1c3k6ZmFsc2UscmV2OjB9KTsKICAkKCdjaWwtdXJsJykudmFsdWU9Jyc7cmVuZGVyKCk7c3RhdHVzKHNpemU\/J0JpbGxlZGV0IGVyIHRqZWtrZXQgZnJhIFVSTFwnZW4uJzonQmlsbGVkZXQgZXIgdGpla2tldCBmcmEgVVJMXCdlbi4gRmlsc3TDuHJyZWxzZW4ga3VubmUgaWtrZSBsw6ZzZXMgZnJhIGRldHRlIHdlYnNpdGUuJyk7CiB9Y2F0Y2goZSl7c3RhdHVzKCdCaWxsZWRldCBrdW5uZSBpa2tlIGhlbnRlcy4gVGplaywgYXQgVVJMXCdlbiBwZWdlciBkaXJla3RlIHDDpSBlbiBiaWxsZWRmaWwgb2cgZXIgb2ZmZW50bGlndCB0aWxnw6ZuZ2VsaWcuJyl9CiBmaW5hbGx5e2J0bi5kaXNhYmxlZD1mYWxzZTtidG4udGV4dENvbnRlbnQ9J1RpbGbDuGogYmlsbGVkZSBmcmEgVVJMJ30KfQokKCdjaWwtdXJsLWZvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLGU9PntlLnByZXZlbnREZWZhdWx0KCk7Y2hlY2tVcmwoJCgnY2lsLXVybCcpLnZhbHVlLnRyaW0oKSl9KTsKZnVuY3Rpb24gcmVuZGVyKCl7dGh1bWJzKCk7CiBjb25zdCBmYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50LGZvY3VzSWQ9ZmEmJnJvb3QuY29udGFpbnMoZmEpJiZmYS5kYXRhc2V0P2ZhLmRhdGFzZXQuZjpudWxsOwogY29uc3QgbGlzdD0kKCdjaWwtZmlsZXMnKSxwcmV2SD1saXN0Lm9mZnNldEhlaWdodDskKCdjaWwtcmVzdWx0cycpLmNsYXNzTGlzdC50b2dnbGUoJ2NpbC1oaWRlJywhaXRlbXMubGVuZ3RoKTtsaXN0LnJlcGxhY2VDaGlsZHJlbigpOwogLyoga2VlcCB0aGUgcGFnZSBmcm9tIGp1bXBpbmcgd2hpbGUgYW4gaW1hZ2UgaXMgcmUtb3B0aW1pc2VkIChlLmcuIGFmdGVyIGEgY2xpY2sgdG8gcmVtb3ZlIGFuIGFyZWEpICovCiBsaXN0LnN0eWxlLm1pbkhlaWdodD1pdGVtcy5zb21lKGk9PmkuYnVzeSkmJnByZXZIP3ByZXZIKydweCc6Jyc7CiBjb25zdCBkb25lPWl0ZW1zLmZpbHRlcihpPT5pLnJlc3VsdCk7JCgnY2lsLW9wdGFsbCcpLmRpc2FibGVkPW9wdEJ1c3l8fCFpdGVtcy5zb21lKGk9PmNhbk9wdGltaXNlKGkpJiYhaS5yZXN1bHQpOyQoJ2NpbC1vcHRhbGwnKS50ZXh0Q29udGVudD1vcHRCdXN5PydPcHRpbWVyZXLigKYnOidPcHRpbcOpciBhbGxlIGJpbGxlZGVyJzskKCdjaWwtemlwJykuZGlzYWJsZWQ9IWRvbmUubGVuZ3RofHx6aXBCdXN5OyQoJ2NpbC16aXAnKS50ZXh0Q29udGVudD16aXBCdXN5PydGb3JiZXJlZGVyIFpJUOKApic6J0Rvd25sb2FkIG9wdGltZXJlZGUgYmlsbGVkZXIgc29tIFpJUCc7CiAkKCdjaWwtemlwLW5vdGUnKS50ZXh0Q29udGVudD1kb25lLmxlbmd0aD9kb25lLmxlbmd0aCsnIG9wdGltZXJldCAnKyhkb25lLmxlbmd0aD09PTE\/J2JpbGxlZGUnOidiaWxsZWRlcicpKycga2xhciB0aWwgWklQLic6J09wdGltw6lyIG1pbmRzdCDDqXQgYmlsbGVkZSBmb3IgYXQga3VubmUgZG93bmxvYWRlIGVuIFpJUC4nOwogaWYoIWl0ZW1zLmxlbmd0aClyZXR1cm47CiBjb25zdCB0b3RhbD1pdGVtcy5yZWR1Y2UoKHMsaSk9PnMraS5maWxlLnNpemUsMCksbWl4ZWQ9aXRlbXMucmVkdWNlKChzLGkpPT5zKyhpLnJlc3VsdD9pLnJlc3VsdC5ibG9iLnNpemU6aS5maWxlLnNpemUpLDApLHN1bT0kKCdjaWwtc3VtbWFyeScpLG49aXRlbXMubGVuZ3RoKyhpdGVtcy5sZW5ndGg9PT0xPycgYmlsbGVkZSc6JyBiaWxsZWRlcicpKycgdmFsZ3QnOwogY29uc3Qgc3RhdD0obCx2LHN1Yix0b25lLGhlbHApPT57Y29uc3QgZD1lbCgnZGl2JywnY2lsLXN0YXQnKyh0b25lPycgY2lsLXN0YXQtJyt0b25lOicnKSksbGI9ZWwoJ3NwYW4nLCdjaWwtc3RhdC1sYWJlbCcsbCk7bGV0IHRpcD1udWxsO2lmKGhlbHApbGIuYXBwZW5kKGhlbHBUaXAoaGVscCwnc3RhdC0nK2wpKTtkLmFwcGVuZChsYixlbCgnc3Ryb25nJywnY2lsLXN0YXQtdmFsdWUnLHYpKTtpZihzdWIpZC5hcHBlbmQoZWwoJ3NwYW4nLCdjaWwtc3RhdC1zdWInLHN1YikpO3JldHVybiBkfTsKIGNvbnN0IHVua25vd249YXJlYT09PSdlbWFpbCc\/aXRlbXMuZmlsdGVyKGk9PmkudXJsT25seSYmIWkuZmlsZS5zaXplKS5sZW5ndGg6MDsKIGNvbnN0IHNhdmVkPWRvbmUubGVuZ3RoJiZ0b3RhbD9NYXRoLnJvdW5kKCgxLW1peGVkL3RvdGFsKSoxMDApOjAsYXR0bj1pdGVtcy5maWx0ZXIoaT0+bGV2ZWwoaSk+PTIpLmxlbmd0aCxhdHRuTWF4PWl0ZW1zLnJlZHVjZSgobSxpKT0+TWF0aC5tYXgobSxsZXZlbChpKSksMCksZ3JpZD1lbCgnZGl2JywnY2lsLXN0YXRzJyk7CiBncmlkLmFwcGVuZChzdGF0KCdCaWxsZWRlcicsU3RyaW5nKGl0ZW1zLmxlbmd0aCksZG9uZS5sZW5ndGg\/ZG9uZS5sZW5ndGgrJyBvcHRpbWVyZXQnOidJbmdlbiBvcHRpbWVyZXQgZW5kbnUnKSwoYXJlYT09PSdlbWFpbCc\/c3RhdCgnU2FtbGV0IGZpbHN0w7hycmVsc2UgZm9yIGJpbGxlZGVyJywodW5rbm93bj8nTWluZHN0ICc6JycpK2ZtdChtaXhlZCksZW1haWxWZXJkaWN0KG1peGVkKSsodW5rbm93bj8nICcrdW5rbm93bisodW5rbm93bj4xPycgYmlsbGVkc3TDuHJyZWxzZXInOicgYmlsbGVkc3TDuHJyZWxzZScpKycga3VubmUgaWtrZSBsw6ZzZXMsIHPDpSBkZW4gcmVlbGxlIHRvdGFsIGVyIGjDuGplcmUuJzonJyksbWl4ZWQ8PU1CPydnb29kJzptaXhlZDw9MipNQj8nd2Fybic6J2FsZXJ0JywnRGV0IGVyIGRlbiBzYW1sZWRlIHN0w7hycmVsc2UgcMOlIGJpbGxlZGZpbGVybmUuIERlbiBhZnNlbmR0ZSBlLW1haWwga2FuIHbDpnJlIHN0w7hycmUsIGZvcmRpIGJpbGxlZGVybmUga29kZXMsIG7DpXIgZS1tYWlsZW4gc2VuZGVzLiBHcsOmbnNlcm5lIGVyIHZlamxlZGVuZGUgb2cgaWtrZSBncsOmbnNlciBpIENvbmZlcmVuY2UgTWFuYWdlci4nKTpzdGF0KCdTYW1sZXQgZmlsc3TDuHJyZWxzZScsZm10KHRvdGFsKSwnU3VtbWVuIGFmIGFsbGUgdmFsZ3RlIGJpbGxlZGVyJywnJywnSHZpcyBhbGxlIGJpbGxlZGVybmUgZXIgcMOlIHNhbW1lIHNpZGUsIHDDpXZpcmtlciB0b3RhbGVuLCBodm9yIGh1cnRpZ3Qgc2lkZW4gaW5kbMOmc2VzLiBFciBkZSBww6UgZm9yc2tlbGxpZ2Ugc2lkZXIsIGJldHlkZXIgaHZlcnQgYmlsbGVkZXMgZmlsc3TDuHJyZWxzZSBtZXJlLicpKSxzdGF0KCdFZnRlciBvcHRpbWVyaW5nJyxkb25lLmxlbmd0aD9mbXQobWl4ZWQpOifigJMnLGRvbmUubGVuZ3RoPyhzYXZlZD4wP3NhdmVkKyclIG1pbmRyZSc6J0luZ2VuIHJlZHVrdGlvbicpOidPcHRpbcOpciBmb3IgYXQgc2UgcmVzdWx0YXRldCcsZG9uZS5sZW5ndGgmJnNhdmVkPjA\/J2dvb2QnOicnLCdEZW4gc2FtbGVkZSBzdMO4cnJlbHNlIHDDpSBhbGxlIGJpbGxlZGVyIGVmdGVyIG9wdGltZXJpbmcuIEJpbGxlZGVyLCBkdSBpa2tlIGhhciBvcHRpbWVyZXQsIHTDpmxsZXMgbWVkIGRlcmVzIG9yaWdpbmFsZSBzdMO4cnJlbHNlLicpLHN0YXQoJ0tyw6Z2ZXIgb3Btw6Zya3NvbWhlZCcsU3RyaW5nKGF0dG4pLGF0dG4\/KGF0dG49PT0xPycxIGJpbGxlZGUgaGFyIGVuIGJlc2tlZCc6YXR0bisnIGJpbGxlZGVyIGhhciBlbiBiZXNrZWQnKSsnIG5lZGVuZm9yJzonQWxsZSBzZXIgZmluZSB1ZCcsYXR0bk1heD49Mz8nYWxlcnQnOmF0dG4\/J3dhcm4nOidnb29kJywnVMOmbGxlciBiaWxsZWRlciBtZWQgZW4gZ3VsIGVsbGVyIG9yYW5nZSBiZXNrZWQuIEdyw7huIGJldHlkZXIsIGF0IGJyZWRkZSBvZyBmaWxzdMO4cnJlbHNlIHBhc3NlciB0aWwgZGVuIHZhbGd0ZSBwbGFjZXJpbmcuJykpOwogc3VtLnJlcGxhY2VDaGlsZHJlbihlbCgnc3BhbicsJ2NpbC1zbWFsbCcsJ092ZXJibGlrJyksZ3JpZCk7dm9pZCBuOwogCiBmb3IoY29uc3QgaXRlbSBvZiBpdGVtcyl7CiAgY29uc3QgY2FyZD1lbCgnZGl2JywnY2lsLWZpbGUnKSx0b3A9ZWwoJ2RpdicsJ2NpbC1maWxldG9wJyk7CiAgdG9wLmFwcGVuZChlbCgnaDMnLCdjaWwtZmlsZW5hbWUnLGl0ZW0uZmlsZS5uYW1lfHwnVW5hdm5naXZldCBmaWwnKSxidXR0b24oJ0ZqZXJuJywoKT0+e2NvbnN0IGlkeD1pdGVtcy5pbmRleE9mKGl0ZW0pO2Rpc2NhcmQoaXRlbSk7aXRlbXM9aXRlbXMuZmlsdGVyKHg9PnghPT1pdGVtKTtyZW5kZXIoKTtjb25zdCBuZXh0PWl0ZW1zW01hdGgubWluKGlkeCxpdGVtcy5sZW5ndGgtMSldO2NvbnN0IGY9bmV4dCYmcm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mPSInK25leHQuaWQrJy1ybSJdJyk7KGZ8fCQoJ2NpbC1hZGQnKSkuZm9jdXMoKX0sJ2NpbC1idG4tdGV4dCcsaXRlbS5pZCsnLXJtJykpOwogIGNhcmQuYXBwZW5kKHRvcCk7Y29uc3QgbT1lbCgnZGl2JywnY2lsLW1ldHJpY3MnKTsKICBtLmFwcGVuZChtZXRyaWMoaXRlbS51cmxPbmx5PydGaWxzdMO4cnJlbHNlJzonT3JpZ2luYWwgZmlsc3TDuHJyZWxzZScsaXRlbS51cmxPbmx5JiYhaXRlbS5maWxlLnNpemU\/J0lra2UgdGlsZ8OmbmdlbGlnJzpmbXQoaXRlbS5maWxlLnNpemUpKSxtZXRyaWMoJ03DpWwnLGl0ZW0ubG9hZGluZz8nTMOmc2Vy4oCmJzppdGVtLndpZHRoP2l0ZW0ud2lkdGgrJyDDlyAnK2l0ZW0uaGVpZ2h0KycgcHgnOidJa2tlIHRpbGfDpm5nZWxpZycpLG1ldHJpYygnRm9ybWF0JyxpdGVtLnVybE9ubHk\/KGl0ZW0udHlwZT90eXBlTGFiZWwoaXRlbS50eXBlKSsnIChmcmEgVVJMKSc6J1VrZW5kdCcpOmZvcm1hdFRleHQoaXRlbSkpKTtjYXJkLmFwcGVuZChtKTsKICBpZihhcmVhPT09J2VtYWlsJyljYXJkLmFwcGVuZChlbWFpbEZpZWxkcyhpdGVtKSk7CiAgZWxzZSBjYXJkLmFwcGVuZCh3ZWJzaXRlRmllbGRzKGl0ZW0pKTsKICBpZihpdGVtLnVybE9ubHkpe3VybEJvZHkoY2FyZCxpdGVtKTtjb25zdCB1YT1lbCgnZGl2JywnY2lsLWFjdGlvbnMnKTtjYXJkLmFwcGVuZCh1YSk7bGlzdC5hcHBlbmQoY2FyZCk7Y29udGludWV9CiAgYWR2aWNlRm9yKGNhcmQsaXRlbSk7CiAgaWYoIWl0ZW0ubG9hZGluZyYmIWl0ZW0uZXJyb3IpY29udHJvbHNGb3IoY2FyZCxpdGVtKTsKICBjb25zdCBhY3RzPWVsKCdkaXYnLCdjaWwtYWN0aW9ucycpLG9wdD1idXR0b24oaXRlbS5idXN5PydBcmJlamRlcuKApic6J09wdGltw6lyIC8ga29udmVydMOpcicsKCk9Pm9wdGltaXNlKGl0ZW0pLCcnLGl0ZW0uaWQrJy1vcHQnKTtvcHQuZGlzYWJsZWQ9IWNhbk9wdGltaXNlKGl0ZW0pO2FjdHMuYXBwZW5kKG9wdCk7CiAgaWYoaXRlbS5yZXN1bHQpe3Jlc3VsdEZvcihjYXJkLGl0ZW0pO2lmKCFpdGVtLnJlc3VsdC5rZXB0T3JpZ2luYWwmJiFpdGVtLmNvbXBhcmUpYWN0cy5hcHBlbmQoYnV0dG9uKCdEb3dubG9hZCAnK3R5cGVMYWJlbChpdGVtLnJlc3VsdC50eXBlKSwoKT0+e3RyYWNrKCdkb3dubG9hZCcpO2Rvd25sb2FkKGl0ZW0ucmVzdWx0LmJsb2IsaXRlbS5yZXN1bHQubmFtZSl9LCdjaWwtYnRuLXNlY29uZGFyeScsaXRlbS5pZCsnLWRsJykpfQogIGlmKGl0ZW0ucmVzdWx0KXtjb25zdCBwdj1idXR0b24oaXRlbS5jb21wYXJlPydTa2p1bCBzYW1tZW5saWduaW5nJzonU2FtbWVubGlnbiBtZWQgb3JpZ2luYWwnLCgpPT57aXRlbS5jb21wYXJlPSFpdGVtLmNvbXBhcmU7aWYoIWl0ZW0uY29tcGFyZSl7ZHJvcFVybChpdGVtLCdvcmlnJyk7ZHJvcFVybChpdGVtLCdyZXMnKX1yZW5kZXIoKX0sJ2NpbC1idG4tdGV4dCcsaXRlbS5pZCsnLXB2Jyk7cHYuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyxTdHJpbmcoaXRlbS5jb21wYXJlKSk7YWN0cy5hcHBlbmQocHYpO2lmKGl0ZW0uY29tcGFyZSlwcmV2aWV3Rm9yKGNhcmQsaXRlbSl9CiAgY2FyZC5hcHBlbmQoYWN0cyk7bGlzdC5hcHBlbmQoY2FyZCk7CiB9CiBpZihmb2N1c0lkKXtjb25zdCBmPXJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtZj0iJytmb2N1c0lkKyciXScpO2lmKGYmJiFmLmRpc2FibGVkKWYuZm9jdXMoe3ByZXZlbnRTY3JvbGw6dHJ1ZX0pfQp9CmZ1bmN0aW9uIGRvd25sb2FkKGJsb2IsbmFtZSl7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyksdXJsPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7YS5ocmVmPXVybDthLmRvd25sb2FkPW5hbWU7YS5yZWw9J25vb3BlbmVyJzthLnN0eWxlLmRpc3BsYXk9J25vbmUnO2RvY3VtZW50LmJvZHkuYXBwZW5kKGEpO2EuY2xpY2soKTthLnJlbW92ZSgpO3NldFRpbWVvdXQoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwodXJsKSw2MDAwMCl9Ci8qIC0tLS0tLS0tLS0gWklQIChTVE9SRSwgVVRGLTggbmFtZXMsIENSQy0zMikgLS0tLS0tLS0tLSAqLwpjb25zdCBDUkNfVEFCTEU9KCgpPT57Y29uc3QgdD1uZXcgVWludDMyQXJyYXkoMjU2KTtmb3IobGV0IG49MDtuPDI1NjtuKyspe2xldCBjPW47Zm9yKGxldCBrPTA7azw4O2srKyljPWMmMT8weEVEQjg4MzIwXihjPj4+MSk6Yz4+PjE7dFtuXT1jPj4+MH1yZXR1cm4gdH0pKCk7CmZ1bmN0aW9uIGNyYzMyKGQpe2xldCBjPTB4RkZGRkZGRkY7Zm9yKGxldCBpPTA7aTxkLmxlbmd0aDtpKyspYz1DUkNfVEFCTEVbKGNeZFtpXSkmMjU1XV4oYz4+PjgpO3JldHVybiAoY14weEZGRkZGRkZGKT4+PjB9CmZ1bmN0aW9uIHppcEJsb2IoZW50cmllcyl7CiBjb25zdCBlbmM9bmV3IFRleHRFbmNvZGVyKCksbm93PW5ldyBEYXRlKCksdGltZT0obm93LmdldEhvdXJzKCk8PDExKXwobm93LmdldE1pbnV0ZXMoKTw8NSl8KG5vdy5nZXRTZWNvbmRzKCk+PjEpLGRhdGU9KChNYXRoLm1heCgxOTgwLG5vdy5nZXRGdWxsWWVhcigpKS0xOTgwKTw8OSl8KChub3cuZ2V0TW9udGgoKSsxKTw8NSl8bm93LmdldERhdGUoKTsKIGNvbnN0IHBhcnRzPVtdLGNlbnRyYWw9W107bGV0IG9mZnNldD0wOwogZm9yKGNvbnN0IGUgb2YgZW50cmllcyl7CiAgY29uc3QgbmFtZT1lbmMuZW5jb2RlKGUubmFtZSksc2l6ZT1lLmJsb2Iuc2l6ZSxoPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMzApKSxkPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoNDYpKTsKICBoLnNldFVpbnQzMigwLDB4MDQwMzRiNTAsdHJ1ZSk7aC5zZXRVaW50MTYoNCwyMCx0cnVlKTtoLnNldFVpbnQxNig2LDB4MDgwMCx0cnVlKTtoLnNldFVpbnQxNig4LDAsdHJ1ZSk7aC5zZXRVaW50MTYoMTAsdGltZSx0cnVlKTtoLnNldFVpbnQxNigxMixkYXRlLHRydWUpO2guc2V0VWludDMyKDE0LGUuY3JjLHRydWUpO2guc2V0VWludDMyKDE4LHNpemUsdHJ1ZSk7aC5zZXRVaW50MzIoMjIsc2l6ZSx0cnVlKTtoLnNldFVpbnQxNigyNixuYW1lLmxlbmd0aCx0cnVlKTtoLnNldFVpbnQxNigyOCwwLHRydWUpOwogIGQuc2V0VWludDMyKDAsMHgwMjAxNGI1MCx0cnVlKTtkLnNldFVpbnQxNig0LDIwLHRydWUpO2Quc2V0VWludDE2KDYsMjAsdHJ1ZSk7ZC5zZXRVaW50MTYoOCwweDA4MDAsdHJ1ZSk7ZC5zZXRVaW50MTYoMTAsMCx0cnVlKTtkLnNldFVpbnQxNigxMix0aW1lLHRydWUpO2Quc2V0VWludDE2KDE0LGRhdGUsdHJ1ZSk7ZC5zZXRVaW50MzIoMTYsZS5jcmMsdHJ1ZSk7ZC5zZXRVaW50MzIoMjAsc2l6ZSx0cnVlKTtkLnNldFVpbnQzMigyNCxzaXplLHRydWUpO2Quc2V0VWludDE2KDI4LG5hbWUubGVuZ3RoLHRydWUpO2Quc2V0VWludDMyKDQyLG9mZnNldCx0cnVlKTsKICBwYXJ0cy5wdXNoKG5ldyBVaW50OEFycmF5KGguYnVmZmVyKSxuYW1lLGUuYmxvYik7Y2VudHJhbC5wdXNoKG5ldyBVaW50OEFycmF5KGQuYnVmZmVyKSxuYW1lKTsKICBvZmZzZXQrPTMwK25hbWUubGVuZ3RoK3NpemU7aWYob2Zmc2V0PjB4RkZGRkZGRkYpdGhyb3cgRXJyb3IoJ1pJUC1maWxlbiB2aWxsZSBibGl2ZSBzdMO4cnJlIGVuZCA0IEdCLiBEb3dubG9hZCBmw6ZycmUgYmlsbGVkZXIgYWQgZ2FuZ2VuLicpOwogfQogY29uc3QgY3NpemU9Y2VudHJhbC5yZWR1Y2UoKHMseCk9PnMreC5sZW5ndGgsMCksZW5kPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMjIpKTsKIGVuZC5zZXRVaW50MzIoMCwweDA2MDU0YjUwLHRydWUpO2VuZC5zZXRVaW50MTYoOCxlbnRyaWVzLmxlbmd0aCx0cnVlKTtlbmQuc2V0VWludDE2KDEwLGVudHJpZXMubGVuZ3RoLHRydWUpO2VuZC5zZXRVaW50MzIoMTIsY3NpemUsdHJ1ZSk7ZW5kLnNldFVpbnQzMigxNixvZmZzZXQsdHJ1ZSk7CiByZXR1cm4gbmV3IEJsb2IocGFydHMuY29uY2F0KGNlbnRyYWwsW25ldyBVaW50OEFycmF5KGVuZC5idWZmZXIpXSkse3R5cGU6J2FwcGxpY2F0aW9uL3ppcCd9KTsKfQpmdW5jdGlvbiB1bmlxdWVOYW1lcyhsaXN0KXtjb25zdCB1c2VkPW5ldyBTZXQoKTtyZXR1cm4gbGlzdC5tYXAoaT0+e2NvbnN0IG5hbWU9aS5yZXN1bHQubmFtZSxkb3Q9bmFtZS5sYXN0SW5kZXhPZignLicpLGJhc2U9bmFtZS5zbGljZSgwLGRvdCksZXh0PW5hbWUuc2xpY2UoZG90KTtsZXQgbj1uYW1lLGs9Mjt3aGlsZSh1c2VkLmhhcyhuLnRvTG93ZXJDYXNlKCkpKW49YmFzZSsnICgnKyhrKyspKycpJytleHQ7dXNlZC5hZGQobi50b0xvd2VyQ2FzZSgpKTtyZXR1cm4ge25hbWU6bixibG9iOmkucmVzdWx0LmJsb2IsY3JjOmkucmVzdWx0LmNyY319KX0KJCgnY2lsLW9wdGFsbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxhc3luYygpPT57CiBpZihvcHRCdXN5KXJldHVybjtjb25zdCBsaXN0PWl0ZW1zLmZpbHRlcihpPT5jYW5PcHRpbWlzZShpKSYmIWkucmVzdWx0KTtpZighbGlzdC5sZW5ndGgpcmV0dXJuO29wdEJ1c3k9dHJ1ZTtsZXQgbj0wOwogZm9yKGNvbnN0IGl0IG9mIGxpc3Qpe2lmKCFhbGl2ZShpdCl8fCFjYW5PcHRpbWlzZShpdCkpY29udGludWU7bisrO3N0YXR1cygnT3B0aW1lcmVyIGJpbGxlZGUgJytuKycgYWYgJytsaXN0Lmxlbmd0aCsn4oCmJyk7dHJ5e2F3YWl0IG9wdGltaXNlKGl0KX1jYXRjaChlKXt9fQogb3B0QnVzeT1mYWxzZTtyZW5kZXIoKTtzdGF0dXMoJ0bDpnJkaWcuIFNhbW1lbmxpZ24gaHZlcnQgcmVzdWx0YXQgbWVkIG9yaWdpbmFsZW4sIGbDuHIgZHUgYnJ1Z2VyIGRldC4nKX0pOwokKCdjaWwtemlwJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57CiBpZih6aXBCdXN5KXJldHVybjtjb25zdCByZWFkeT1pdGVtcy5maWx0ZXIoaT0+aS5yZXN1bHQpO2lmKCFyZWFkeS5sZW5ndGgpcmV0dXJuOwogaWYocmVhZHkubGVuZ3RoPk1BWF9aSVBfRklMRVMpe3N0YXR1cygnRG93bmxvYWQgaMO4anN0ICcrTUFYX1pJUF9GSUxFUysnIGJpbGxlZGVyIGFkIGdhbmdlbi4nKTtyZXR1cm59CiB6aXBCdXN5PXRydWU7cmVuZGVyKCk7CiB0cnl7dHJhY2soJ3ppcCcpO2Rvd25sb2FkKHppcEJsb2IodW5pcXVlTmFtZXMocmVhZHkpKSwnY20tb3B0aW1pc2VkLWltYWdlcy56aXAnKTtzdGF0dXMoJ1pJUCBkb3dubG9hZGV0IG1lZCAnK3JlYWR5Lmxlbmd0aCsocmVhZHkubGVuZ3RoPT09MT8nIGJpbGxlZGUuJzonIGJpbGxlZGVyLicpKX0KIGNhdGNoKGUpe3N0YXR1cygnWklQLWRvd25sb2FkIG1pc2x5a2tlZGVzOiAnK2UubWVzc2FnZSl9CiBmaW5hbGx5e3ppcEJ1c3k9ZmFsc2U7cmVuZGVyKCl9Cn0pOwpyZW5kZXIoKTsKfSkoKTsKfQppZihkb2N1bWVudC5yZWFkeVN0YXRlPT09J2xvYWRpbmcnKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJyxjaWxTdGFydCl9ZWxzZXtjaWxTdGFydCgpfX0pKCk7\")));(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=\"Billedtjek og optimering\">\n <div class=\"cil-card cil-intro\">\n  <p class=\"cil-lead\">Tjek billeders m\u00e5l (px), filst\u00f8rrelser (KB\/MB) og formater. Optim\u00e9r eller konvert\u00e9r billeder, f\u00f8r du tilf\u00f8jer dem i Conference Manager.<\/p>\n  <div class=\"cil-label\" id=\"cil-area-label\">Hvor skal du bruge dine billeder?<\/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\">Billeder til dit eventwebsite<\/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-maileditor<\/span><span class=\"cil-choice-desc\">Billeder til dine 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\">Tilf\u00f8j dine billeder<\/span><span class=\"cil-drop-text\">Tr\u00e6k og slip billeder her, eller find dem p\u00e5 din computer<\/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>V\u00e6lg billeder<\/button><span class=\"cil-drop-hint\">V\u00e6lg \u00e9t eller flere billeder<\/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\">Bruger du Billede (URL)? Tjek et billede ud fra dets 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\">Tilf\u00f8j billede fra URL<\/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>Billederne behandles lokalt i din browser. Intet bliver uploadet til CM Academy eller gemt p\u00e5 vores servere.<span data-only=\"email\" class=\"cil-hide\"> Hvis du tjekker et billede fra en URL, henter din browser det direkte fra det website, hvor det ligger.<\/span><\/span><\/p>\n  <div id=\"cil-thumbs\" class=\"cil-thumbs cil-hide\" aria-live=\"polite\"><\/div>\n  <details class=\"cil-basics\"><summary>Ny med billeder? L\u00e6r det grundl\u00e6ggende<\/summary><div class=\"cil-basics-body\">\n<p><strong>M\u00e5l (px)<\/strong> angiver et billedes bredde og h\u00f8jde i pixels, fx 1920 \u00d7 1080 px. De rigtige m\u00e5l afh\u00e6nger af, hvor billedet bruges. I <strong>Website-Designer<\/strong> skal baggrundsbilleder i headere og sektioner have pr\u00e6cis den bredde, der passer til dit tema: et billede, der er for smalt eller for bredt, bliver m\u00e5ske ikke vist som tilt\u00e6nkt. Billeder i kolonner flugter bedst med den anbefalede bredde, som bygger p\u00e5 standardbredden for kolonner. Har du \u00e6ndret kolonnebredderne, s\u00e5 v\u00e6lg Egen bredde i stedet. I <strong>E-maileditor<\/strong> er de anbefalede bredder vejledende.<\/p>\n<p><strong>Filst\u00f8rrelse (KB eller MB)<\/strong> er, hvor meget plads filen fylder. 1 MB er 1.024 KB. Selv et billede med de rigtige m\u00e5l kan have en stor filst\u00f8rrelse. P\u00e5 websites indl\u00e6ses store filer langsommere, is\u00e6r p\u00e5 mobil. I e-mails kan de g\u00f8re afsendelsen langsommere og g\u00f8re e-mailen st\u00f8rre, s\u00e5 nogle indbakker afviser den.<\/p>\n<p><strong>Format<\/strong> er filtypen, som st\u00e5r sidst i filnavnet, fx .jpg eller .png. Brug <strong>JPG<\/strong> til fotos og <strong>PNG<\/strong> til logoer, ikoner, sk\u00e6rmbilleder og alt, der skal have en gennemsigtig baggrund.<\/p>\n<p><strong>Optimering<\/strong> g\u00f8r filen mindre. V\u00e6rkt\u00f8jet kan g\u00f8re billedet smallere eller gemme det i et andet format. Mindre filer kan se lidt mindre skarpe ud, s\u00e5 sammenlign altid f\u00f8r og efter.<\/p>\n<p><strong>Avancerede indstillinger<\/strong> er valgfrie. <strong>JPG-kvalitet<\/strong> bestemmer, hvor meget en JPG komprimeres: et lavere tal giver en mindre fil, men f\u00e6rre detaljer. <strong>PNG-farver<\/strong> reducerer antallet af farver i en PNG, s\u00e5 logoer og grafik bliver meget mindre. 256 farver ser som regel ud som originalen. V\u00e6lg <strong>Alle farver<\/strong> hvis du kan se en forskel, fx i bl\u00f8de overgange.<\/p>\n<p><strong>S\u00e5dan bruger du v\u00e6rkt\u00f8jet<\/strong><\/p>\n<ol class=\"cil-list\"><li>V\u00e6lg Website-Designer eller E-maileditor.<\/li><li>Tilf\u00f8j dine billeder. Nu kan du se filst\u00f8rrelse, m\u00e5l og format for hvert billede.<\/li><li>V\u00e6lg, hvor hvert billede skal placeres, for at se den kr\u00e6vede eller anbefalede bredde.<\/li><li>Hvis et billede har forkert bredde, en stor filst\u00f8rrelse eller forkert format, s\u00e5 klik p\u00e5 <strong>Optim\u00e9r \/ konvert\u00e9r<\/strong> og sammenlign resultatet med originalen.<\/li><li>Download det optimerede billede, eller alle billeder som ZIP, og upload det i Conference Manager.<\/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\">Dine billeder<\/div><button class=\"cil-btn cil-btn-text\" id=\"cil-clear\" type=\"button\">Fjern alle<\/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>Optim\u00e9r alle billeder<\/button><button class=\"cil-btn cil-btn-secondary\" type=\"button\" id=\"cil-zip\" disabled>Download optimerede billeder som ZIP<\/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\">Fjern alle billeder<\/button><\/div>\n  <p class=\"cil-small\" style=\"margin:10px 0 0\">Tjek altid, hvordan dine optimerede billeder ser ud p\u00e5 dit website eller i din e-mail, f\u00f8r du udgiver eller sender.<\/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\">Tjek billedkvaliteten<\/div><div class=\"cmac-info-content\"><p>Optimering kan p\u00e5virke billedkvaliteten, og resultatet kan variere afh\u00e6ngigt af den originale fil og din browser.<\/p><p>Se altid dine optimerede eller konverterede billeder igennem, og tjek, hvordan de ser ud p\u00e5 dit website eller i din e-mail, f\u00f8r du udgiver eller sender.<\/p><p style=\"margin-bottom:0\">Hvis du ikke er tilfreds med resultatet, s\u00e5 pr\u00f8v at justere indstillingerne, eller brug et billedprogram som <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> eller <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\">Underst\u00f8ttede billedformater<\/div><p><strong>JPG, PNG, GIF og BMP<\/strong> kan uploades til mediearkivet i Conference Manager. For mindre filer og bred underst\u00f8ttelse anbefaler vi JPG til fotos og PNG til grafik, der skal v\u00e6re gennemsigtig. <span data-only=\"website\">GIF underst\u00f8ttes, ogs\u00e5 animerede GIF&#8217;er, men animerede GIF&#8217;er er ofte meget store filer. Brug dem med m\u00e5de.<\/span><span data-only=\"email\" class=\"cil-hide\">GIF underst\u00f8ttes, men animerede GIF&#8217;er er ofte meget store filer og kan opf\u00f8re sig forskelligt i forskellige mailprogrammer. Brug dem med m\u00e5de.<\/span> BMP accepteres, men er ofte meget st\u00f8rre end JPG eller PNG.<\/p><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Derfor betyder filst\u00f8rrelsen noget<\/div><p data-only=\"website\">Store billedfiler g\u00f8r dit website langsommere, is\u00e6r p\u00e5 mobile enheder og langsomme forbindelser. Hold filst\u00f8rrelsen s\u00e5 lille som muligt uden synligt tab af kvalitet. Til baggrunde i headere og sektioner skal bredden stadig passe pr\u00e6cist til dit tema.<\/p><p data-only=\"email\" class=\"cil-hide\">Store billeder g\u00f8r din e-mail langsommere at indl\u00e6se og kan forsinke leveringen. Nogle indbakker afviser m\u00e5ske e-mails med meget store billeder. N\u00e5r du g\u00f8r et billede mindre i editoren, bliver filen ikke mindre, s\u00e5 upload det i den st\u00f8rrelse, det skal vises i.<\/p><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Hvorn\u00e5r skal du bruge JPG eller PNG<\/div><ul class=\"cil-list\"><li><strong>JPG:<\/strong> fotos og billeder med mange farver eller bl\u00f8de overgange, fx billeder af talere, steder og baggrunde. Giver de mindste filer. Underst\u00f8tter ikke gennemsigtighed.<\/li><li><strong>PNG:<\/strong> logoer, ikoner, sk\u00e6rmbilleder og grafik med tekst, skarpe kanter eller f\u00e5 farver, og alle billeder, der skal have en gennemsigtig baggrund. Bevarer skarpe kanter og tekst, men fotos gemt som PNG er ofte meget st\u00f8rre.<\/li><\/ul><p class=\"cil-muted\"><strong>Automatisk<\/strong> i konverteren v\u00e6lger ud fra gennemsigtighed og antallet af farver i billedet. Den genkender ikke, hvad billedet viser, s\u00e5 se altid resultatet, og v\u00e6lg selv JPG eller PNG, hvis det er n\u00f8dvendigt.<\/p><p><strong>WebP og SVG<\/strong> kan ikke uploades til mediearkivet. Brug konverteren ovenfor til at lave en JPG eller PNG i stedet.<\/p><div data-only=\"email\" class=\"cil-hide\"><div class=\"cil-subtitle\" role=\"heading\" aria-level=\"3\">Billede og Billede (URL) i e-maileditoren<\/div><ul class=\"cil-list\"><li><strong>Billede:<\/strong> Bruger mediearkivet i Conference Manager, som accepterer JPG, PNG, GIF og BMP.<\/li><li><strong>Billede (URL):<\/strong> Bruger et billede, der ligger et andet sted, og som tilf\u00f8jes via sin webadresse. SVG og WebP kan se rigtige ud i editoren, men vises m\u00e5ske ikke for alle modtagere, fx i Outlook.<\/li><\/ul><p>For den bedste visning i alle mailprogrammer, brug JPG eller 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\">Udgivet: 16.10.2026<\/span><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Tjek billeders m\u00e5l (px), filst\u00f8rrelser (KB\/MB) og formater. Optim\u00e9r eller konvert\u00e9r billeder, f\u00f8r du tilf\u00f8jer dem i Conference Manager. Hvor skal du bruge dine billeder? Website-DesignerBilleder til dit eventwebsiteE-maileditorBilleder til dine e-mails Tilf\u00f8j dine billederTr\u00e6k og slip billeder her, eller find dem p\u00e5 din computerV\u00e6lg billederV\u00e6lg \u00e9t eller flere billeder Bruger du Billede (URL)? Tjek &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/cmacademy.events\/da\/knowledge-base\/tjek-og-optimer-dine-billeder\/\" class=\"more-link\">L\u00e6s resten<\/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-25757","ht_kb","type-ht_kb","status-publish","format-standard","hentry","entry"],"_links":{"self":[{"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/ht-kb\/25757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/ht-kb"}],"about":[{"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/comments?post=25757"}],"version-history":[{"count":2,"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/ht-kb\/25757\/revisions"}],"predecessor-version":[{"id":25766,"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/ht-kb\/25757\/revisions\/25766"}],"wp:attachment":[{"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/media?parent=25757"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/ht-kb-category?post=25757"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/cmacademy.events\/da\/wp-json\/wp\/v2\/ht-kb-tag?post=25757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}