@dineug/erd-editor 3.2.6 → 3.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/erd-editor.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { c as Sd, b as U0, S as j0, _ as ta, a as to, O as pt, i as P0, o as Ga, d as Yd, e as Bn, f as Cn, g as Vn, h as E0, r as O0, j as B0, k as Ld, l as A0, m as Q0, n as D0, p as _0, q as q0, s as Dn, t as Td, u as e1, v as Kd, w as sn, x as t1, y as n1, z as al, R as rl, A as O, B as Oe, C as i1, D as o1, E as a1, F as r1, G as Ir, H as l1, I as s1, J as c1, K as ll, L as d1, M as u1, N as m1, P as p1, Q as h1, T as jn, U as b1, V as f1, W as yt, X as $i, Y as g1, Z as Re, $ as y1, a0 as Hd, a1 as Z1, a2 as Nd, a3 as Je, a4 as bi, a5 as fi, a6 as Me, a7 as ye, a8 as To, a9 as $e, aa as it, ab as v1, ac as oc, ad as N, ae as j, af as et, ag as x1, ah as X1, ai as G1, aj as ac, ak as W1, al as oe, am as Ke, an as V1, ao as ni, ap as wd, aq as I1, ar as k1, as as C1, at as rc, au as Wa, av as sl, aw as Ci, ax as Va, ay as zd, az as Qt, aA as an, aB as rn, aC as V, aD as sr, aE as lc, aF as sc, aG as Bo, aH as R1, aI as gi, aJ as yi, aK as Md, aL as S1, aM as Y1, aN as Ee, aO as de, aP as wi, aQ as De, aR as Ue, aS as Fe, aT as L1, aU as T1, aV as In, aW as cc, aX as ie, aY as Ia, aZ as Ri, a_ as Jd, a$ as K1, b0 as H1, b1 as ge, b2 as We, b3 as cl, b4 as ka, b5 as N1, b6 as kr, b7 as Fd, b8 as na, b9 as dl, ba as w1, bb as ul, bc as Ca, bd as $d, be as z1, bf as M1, bg as J1, bh as F1, bi as $1, bj as U1, bk as j1, bl as Ud, bm as Oi, bn as _n, bo as Gi, bp as eo, bq as Si, br as jd, bs as ho, bt as ln, bu as no, bv as ii, bw as P1, bx as Ao, by as st, bz as Pd, bA as E1, bB as ia, bC as Ra, bD as oa, bE as O1, bF as Cr, bG as ml, bH as Ed, bI as Od, bJ as B1, bK as Wi, bL as aa, bM as gt, bN as Pn, bO as Bd, bP as Ad, bQ as Qd, bR as pl, bS as A1, bT as Q1, bU as D1, bV as hl, bW as bl, bX as _1, bY as Dd, bZ as dc, b_ as _d, b$ as q1, c0 as An, c1 as ef, c2 as tf, c3 as nf, c4 as of, c5 as af, c6 as rf, c7 as lf, c8 as sf, c9 as qd, ca as Ht, cb as eu, cc as Ce, cd as tu, ce as cf, cf as df, cg as uf, ch as Sa, ci as nu, cj as Ko, ck as mf, cl as pf, cm as fl, cn as It, co as iu, cp as ou, cq as ue, cr as uc, cs as hf, ct as bf, cu as ff, cv as gf, cw as yf, cx as mc, cy as Zf, cz as vf, cA as xf, cB as Xf, cC as Gf, cD as pi, cE as cr, cF as Wf, cG as Vf, cH as If, cI as pc, cJ as hc, cK as kf, cL as bc, cM as Ho, cN as Cf, cO as Mt, cP as Rf, cQ as Sf, cR as Rr, cS as fc, cT as Yf, cU as Lf, cV as Tf, cW as Kf, cX as Hf, cY as Nf, cZ as wf, c_ as zf, c$ as gc, d0 as Mf, d1 as Jf, d2 as Ff, d3 as $f, d4 as No, d5 as Uf, d6 as jf, d7 as Pf, d8 as Ef, d9 as Of, da as Bf } from "./schemaGCService-
|
|
1
|
+
import { c as Sd, b as U0, S as j0, _ as ta, a as to, O as pt, i as P0, o as Ga, d as Yd, e as Bn, f as Cn, g as Vn, h as E0, r as O0, j as B0, k as Ld, l as A0, m as Q0, n as D0, p as _0, q as q0, s as Dn, t as Td, u as e1, v as Kd, w as sn, x as t1, y as n1, z as al, R as rl, A as O, B as Oe, C as i1, D as o1, E as a1, F as r1, G as Ir, H as l1, I as s1, J as c1, K as ll, L as d1, M as u1, N as m1, P as p1, Q as h1, T as jn, U as b1, V as f1, W as yt, X as $i, Y as g1, Z as Re, $ as y1, a0 as Hd, a1 as Z1, a2 as Nd, a3 as Je, a4 as bi, a5 as fi, a6 as Me, a7 as ye, a8 as To, a9 as $e, aa as it, ab as v1, ac as oc, ad as N, ae as j, af as et, ag as x1, ah as X1, ai as G1, aj as ac, ak as W1, al as oe, am as Ke, an as V1, ao as ni, ap as wd, aq as I1, ar as k1, as as C1, at as rc, au as Wa, av as sl, aw as Ci, ax as Va, ay as zd, az as Qt, aA as an, aB as rn, aC as V, aD as sr, aE as lc, aF as sc, aG as Bo, aH as R1, aI as gi, aJ as yi, aK as Md, aL as S1, aM as Y1, aN as Ee, aO as de, aP as wi, aQ as De, aR as Ue, aS as Fe, aT as L1, aU as T1, aV as In, aW as cc, aX as ie, aY as Ia, aZ as Ri, a_ as Jd, a$ as K1, b0 as H1, b1 as ge, b2 as We, b3 as cl, b4 as ka, b5 as N1, b6 as kr, b7 as Fd, b8 as na, b9 as dl, ba as w1, bb as ul, bc as Ca, bd as $d, be as z1, bf as M1, bg as J1, bh as F1, bi as $1, bj as U1, bk as j1, bl as Ud, bm as Oi, bn as _n, bo as Gi, bp as eo, bq as Si, br as jd, bs as ho, bt as ln, bu as no, bv as ii, bw as P1, bx as Ao, by as st, bz as Pd, bA as E1, bB as ia, bC as Ra, bD as oa, bE as O1, bF as Cr, bG as ml, bH as Ed, bI as Od, bJ as B1, bK as Wi, bL as aa, bM as gt, bN as Pn, bO as Bd, bP as Ad, bQ as Qd, bR as pl, bS as A1, bT as Q1, bU as D1, bV as hl, bW as bl, bX as _1, bY as Dd, bZ as dc, b_ as _d, b$ as q1, c0 as An, c1 as ef, c2 as tf, c3 as nf, c4 as of, c5 as af, c6 as rf, c7 as lf, c8 as sf, c9 as qd, ca as Ht, cb as eu, cc as Ce, cd as tu, ce as cf, cf as df, cg as uf, ch as Sa, ci as nu, cj as Ko, ck as mf, cl as pf, cm as fl, cn as It, co as iu, cp as ou, cq as ue, cr as uc, cs as hf, ct as bf, cu as ff, cv as gf, cw as yf, cx as mc, cy as Zf, cz as vf, cA as xf, cB as Xf, cC as Gf, cD as pi, cE as cr, cF as Wf, cG as Vf, cH as If, cI as pc, cJ as hc, cK as kf, cL as bc, cM as Ho, cN as Cf, cO as Mt, cP as Rf, cQ as Sf, cR as Rr, cS as fc, cT as Yf, cU as Lf, cV as Tf, cW as Kf, cX as Hf, cY as Nf, cZ as wf, c_ as zf, c$ as gc, d0 as Mf, d1 as Jf, d2 as Ff, d3 as $f, d4 as No, d5 as Uf, d6 as jf, d7 as Pf, d8 as Ef, d9 as Of, da as Bf } from "./schemaGCService-AAKKj104.js";
|
|
2
2
|
/*!
|
|
3
3
|
* @dineug/erd-editor
|
|
4
|
-
* @version 3.2.
|
|
4
|
+
* @version 3.2.7 | Fri Feb 28 2025
|
|
5
5
|
* @author SeungHwan-Lee <dineug2@gmail.com>
|
|
6
6
|
* @license MIT
|
|
7
7
|
*/
|
|
@@ -26552,7 +26552,7 @@ function hi(e, t, n) {
|
|
|
26552
26552
|
function bR() {
|
|
26553
26553
|
return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join("-");
|
|
26554
26554
|
}
|
|
26555
|
-
const fR = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGVuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLHVzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGNzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxTdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIikscWU9U3ltYm9sKCJDb21saW5rLnRocm93biIpLHRuPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLGZzPXtjYW5IYW5kbGU6dD0+dG4odCkmJnRbZW5dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gT3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLHlzKHQpfX0sZHM9e2NhbkhhbmRsZTp0PT50bih0KSYmcWUgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LG5uPW5ldyBNYXAoW1sicHJveHkiLGZzXSxbInRocm93Iixkc11dKTtmdW5jdGlvbiBocyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFocyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSxsPShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGFlKTtsZXQgdTt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgocCxoKT0+cFtoXSx0KSxkPW8ucmVkdWNlKChwLGgpPT5wW2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6dT1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1hZShzLmRhdGEudmFsdWUpLHU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6dT1kLmFwcGx5KGMsbCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCBwPW5ldyBkKC4uLmwpO3U9U3MocCl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnAscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO090KHQsaCksdT1UcyhwLFtwXSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjp1PXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7dT17dmFsdWU6YyxbcWVdOjB9fVByb21pc2UucmVzb2x2ZSh1KS5jYXRjaChjPT4oe3ZhbHVlOmMsW3FlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2QscF09QmUoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSxwKSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxybihlKSxTdCBpbiB0JiZ0eXBlb2YgdFtTdF09PSJmdW5jdGlvbiImJnRbU3RdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2QscF09QmUoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtxZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSkscCl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBtcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBybih0KXttcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIHlzKHQsZSl7cmV0dXJuIGt0KHQsW10sZSl9ZnVuY3Rpb24gWWUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHNuKHQpe3JldHVybiBnZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9Pntybih0KX0pfWNvbnN0IEdlPW5ldyBXZWFrTWFwLEplPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KEdlLmdldCh0KXx8MCktMTtHZS5zZXQodCxlKSxlPT09MCYmc24odCl9KTtmdW5jdGlvbiBncyh0LGUpe2NvbnN0IG49KEdlLmdldChlKXx8MCkrMTtHZS5zZXQoZSxuKSxKZSYmSmUucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIHBzKHQpe0plJiZKZS51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uIGt0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWWUociksYT09PWNzKXJldHVybigpPT57cHMocyksc24odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPWdlKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcChsPT5sLnRvU3RyaW5nKCkpfSkudGhlbihhZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiBrdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtZZShyKTtjb25zdFtsLHVdPUJlKG8pO3JldHVybiBnZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6bH0sdSkudGhlbihhZSl9LGFwcGx5KGksYSxvKXtZZShyKTtjb25zdCBsPWVbZS5sZW5ndGgtMV07aWYobD09PXVzKXJldHVybiBnZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGFlKTtpZihsPT09ImJpbmQiKXJldHVybiBrdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W3UsY109YW4obyk7cmV0dXJuIGdlKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OnV9LGMpLnRoZW4oYWUpfSxjb25zdHJ1Y3QoaSxhKXtZZShyKTtjb25zdFtvLGxdPWFuKGEpO3JldHVybiBnZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAodT0+dS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sbCkudGhlbihhZSl9fSk7cmV0dXJuIGdzKHMsdCksc31mdW5jdGlvbiB3cyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBhbih0KXtjb25zdCBlPXQubWFwKEJlKTtyZXR1cm5bZS5tYXAobj0+blswXSksd3MoZS5tYXAobj0+blsxXSkpXX1jb25zdCBvbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBUcyh0LGUpe3JldHVybiBvbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFNzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1tlbl06ITB9KX1mdW5jdGlvbiBCZSh0KXtmb3IoY29uc3RbZSxuXW9mIG5uKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxvbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBhZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBubi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIGdlKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9T3MoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gT3MoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfXZhciBrcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsYnM9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixidD1rc3x8YnN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCkscGU9YnQuU3ltYm9sLGxuPU9iamVjdC5wcm90b3R5cGUsdnM9bG4uaGFzT3duUHJvcGVydHksSXM9bG4udG9TdHJpbmcsQWU9cGU/cGUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIEVzKHQpe3ZhciBlPXZzLmNhbGwodCxBZSksbj10W0FlXTt0cnl7dFtBZV09dm9pZCAwO3ZhciByPSEwfWNhdGNoe312YXIgcz1Jcy5jYWxsKHQpO3JldHVybiByJiYoZT90W0FlXT1uOmRlbGV0ZSB0W0FlXSksc312YXIgTnM9T2JqZWN0LnByb3RvdHlwZSxNcz1Ocy50b1N0cmluZztmdW5jdGlvbiB4cyh0KXtyZXR1cm4gTXMuY2FsbCh0KX12YXIgRHM9IltvYmplY3QgTnVsbF0iLENzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHVuPXBlP3BlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBjbih0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP0NzOkRzOnVuJiZ1biBpbiBPYmplY3QodCk/RXModCk6eHModCl9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In1mdW5jdGlvbiBGcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxzPUFycmF5KHIpOysrbjxyOylzW25dPWUodFtuXSxuLHQpO3JldHVybiBzfXZhciBBcz1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGZuKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGRuKHQpe3JldHVybiB0fXZhciBWcz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsV3M9IltvYmplY3QgRnVuY3Rpb25dIixMcz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCRzPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gaG4odCl7aWYoIWZuKHQpKXJldHVybiExO3ZhciBlPWNuKHQpO3JldHVybiBlPT1Xc3x8ZT09THN8fGU9PVZzfHxlPT0kc312YXIgSXQ9YnRbIl9fY29yZS1qc19zaGFyZWRfXyJdLG1uPWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhJdCYmSXQua2V5cyYmSXQua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBfcyh0KXtyZXR1cm4hIW1uJiZtbiBpbiB0fXZhciB6cz1GdW5jdGlvbi5wcm90b3R5cGUsUnM9enMudG9TdHJpbmc7ZnVuY3Rpb24gWnModCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBScy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgUHM9L1tcXF4kLiorPygpW1xde318XS9nLFVzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEhzPUZ1bmN0aW9uLnByb3RvdHlwZSxqcz1PYmplY3QucHJvdG90eXBlLHFzPUhzLnRvU3RyaW5nLFlzPWpzLmhhc093blByb3BlcnR5LEdzPVJlZ0V4cCgiXiIrcXMuY2FsbChZcykucmVwbGFjZShQcywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiBKcyh0KXtpZighZm4odCl8fF9zKHQpKXJldHVybiExO3ZhciBlPWhuKHQpP0dzOlVzO3JldHVybiBlLnRlc3QoWnModCkpfWZ1bmN0aW9uIEJzKHQsZSl7cmV0dXJuIHQ9PW51bGw/dm9pZCAwOnRbZV19ZnVuY3Rpb24gRXQodCxlKXt2YXIgbj1Ccyh0LGUpO3JldHVybiBKcyhuKT9uOnZvaWQgMH1mdW5jdGlvbiBRcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfXZhciBLcz04MDAsWHM9MTYsZWk9RGF0ZS5ub3c7ZnVuY3Rpb24gdGkodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZWkoKSxzPVhzLShyLW4pO2lmKG49cixzPjApe2lmKCsrZT49S3MpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZnVuY3Rpb24gbmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciB5bj1mdW5jdGlvbigpe3RyeXt2YXIgdD1FdChPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0oKSxyaT15bj9mdW5jdGlvbih0LGUpe3JldHVybiB5bih0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm5pKGUpLHdyaXRhYmxlOiEwfSl9OmRuLHNpPXJpLGlpPXRpKHNpKTtmdW5jdGlvbiBhaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBvaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gbGkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gdWkodCxlLG4pe3JldHVybiBlPT09ZT9saSh0LGUsbik6YWkodCxvaSxuKX1mdW5jdGlvbiBjaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJnVpKHQsZSwwKT4tMX1mdW5jdGlvbiBmaSh0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBnbj1NYXRoLm1heDtmdW5jdGlvbiBkaSh0LGUsbil7cmV0dXJuIGU9Z24oZT09PXZvaWQgMD90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLHM9LTEsaT1nbihyLmxlbmd0aC1lLDApLGE9QXJyYXkoaSk7KytzPGk7KWFbc109cltlK3NdO3M9LTE7Zm9yKHZhciBvPUFycmF5KGUrMSk7KytzPGU7KW9bc109cltzXTtyZXR1cm4gb1tlXT1uKGEpLFFzKHQsdGhpcyxvKX19ZnVuY3Rpb24gaGkodCxlKXtyZXR1cm4gaWkoZGkodCxlLGRuKSx0KyIiKX12YXIgbWk9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiB5aSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PW1pfWZ1bmN0aW9uIGdpKHQpe3JldHVybiB0IT1udWxsJiZ5aSh0Lmxlbmd0aCkmJiFobih0KX12YXIgcGk9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gcG4odCl7cmV0dXJuIHZ0KHQpJiZjbih0KT09cGl9dmFyIHduPU9iamVjdC5wcm90b3R5cGUsd2k9d24uaGFzT3duUHJvcGVydHksVGk9d24ucHJvcGVydHlJc0VudW1lcmFibGUsU2k9cG4oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9wbjpmdW5jdGlvbih0KXtyZXR1cm4gdnQodCkmJndpLmNhbGwodCwiY2FsbGVlIikmJiFUaS5jYWxsKHQsImNhbGxlZSIpfTtmdW5jdGlvbiBPaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBWZT1FdChPYmplY3QsImNyZWF0ZSIpO2Z1bmN0aW9uIGtpKCl7dGhpcy5fX2RhdGFfXz1WZT9WZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgdmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLElpPU9iamVjdC5wcm90b3R5cGUsRWk9SWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTmkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihWZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXZpP3ZvaWQgMDpufXJldHVybiBFaS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIE1pPU9iamVjdC5wcm90b3R5cGUseGk9TWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gRGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gVmU/ZVt0XSE9PXZvaWQgMDp4aS5jYWxsKGUsdCl9dmFyIENpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBGaSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09VmUmJmU9PT12b2lkIDA/Q2k6ZSx0aGlzfWZ1bmN0aW9uIG9lKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fW9lLnByb3RvdHlwZS5jbGVhcj1raSxvZS5wcm90b3R5cGUuZGVsZXRlPWJpLG9lLnByb3RvdHlwZS5nZXQ9Tmksb2UucHJvdG90eXBlLmhhcz1EaSxvZS5wcm90b3R5cGUuc2V0PUZpO2Z1bmN0aW9uIEFpKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKGZpKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIFZpPUFycmF5LnByb3RvdHlwZSxXaT1WaS5zcGxpY2U7ZnVuY3Rpb24gTGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVFlKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpXaS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiAkaSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49UWUoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIF9pKHQpe3JldHVybiBRZSh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIHppKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPVFlKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gd2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19d2UucHJvdG90eXBlLmNsZWFyPUFpLHdlLnByb3RvdHlwZS5kZWxldGU9TGksd2UucHJvdG90eXBlLmdldD0kaSx3ZS5wcm90b3R5cGUuaGFzPV9pLHdlLnByb3RvdHlwZS5zZXQ9emk7dmFyIFJpPUV0KGJ0LCJNYXAiKTtmdW5jdGlvbiBaaSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IG9lLG1hcDpuZXcoUml8fHdlKSxzdHJpbmc6bmV3IG9lfX1mdW5jdGlvbiBQaSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBLZSh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIFBpKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVWkodCl7dmFyIGU9S2UodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gS2UodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gamkodCl7cmV0dXJuIEtlKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIHFpKHQsZSl7dmFyIG49S2UodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1UZS5wcm90b3R5cGUuY2xlYXI9WmksVGUucHJvdG90eXBlLmRlbGV0ZT1VaSxUZS5wcm90b3R5cGUuZ2V0PUhpLFRlLnByb3RvdHlwZS5oYXM9amksVGUucHJvdG90eXBlLnNldD1xaTtmdW5jdGlvbiBZaSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLHM9dC5sZW5ndGg7KytuPHI7KXRbcytuXT1lW25dO3JldHVybiB0fXZhciBUbj1wZT9wZS5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEdpKHQpe3JldHVybiBBcyh0KXx8U2kodCl8fCEhKFRuJiZ0JiZ0W1RuXSl9ZnVuY3Rpb24gU24odCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1HaSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP1NuKG8sZS0xLG4scixzKTpZaShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc312YXIgSmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIEJpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LEppKSx0aGlzfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX1mdW5jdGlvbiBYZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgVGU7KytlPG47KXRoaXMuYWRkKHRbZV0pfVhlLnByb3RvdHlwZS5hZGQ9WGUucHJvdG90eXBlLnB1c2g9QmksWGUucHJvdG90eXBlLmhhcz1RaTtmdW5jdGlvbiBLaSh0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdnQodCkmJmdpKHQpfWZ1bmN0aW9uIFhpKHQsZSxuKXtmb3IodmFyIHI9LTEscz10PT1udWxsPzA6dC5sZW5ndGg7KytyPHM7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgZWE9MjAwO2Z1bmN0aW9uIHRhKHQsZSxuLHIpe3ZhciBzPS0xLGk9Y2ksYT0hMCxvPXQubGVuZ3RoLGw9W10sdT1lLmxlbmd0aDtpZighbylyZXR1cm4gbDtuJiYoZT1GcyhlLE9pKG4pKSkscj8oaT1YaSxhPSExKTplLmxlbmd0aD49ZWEmJihpPUtpLGE9ITEsZT1uZXcgWGUoZSkpO2U6Zm9yKDsrK3M8bzspe3ZhciBjPXRbc10sZD1uPT1udWxsP2M6bihjKTtpZihjPXJ8fGMhPT0wP2M6MCxhJiZkPT09ZCl7Zm9yKHZhciBwPXU7cC0tOylpZihlW3BdPT09ZCljb250aW51ZSBlO2wucHVzaChjKX1lbHNlIGkoZSxkLHIpfHxsLnB1c2goYyl9cmV0dXJuIGx9dmFyIG5hPWhpKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9uKHQpP3RhKHQsU24oZSwxLE9uLCEwKSk6W119KTtmdW5jdGlvbiAkKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9Y29uc3QgV2U9dD0+ZT0+dHlwZW9mIGU9PT10LHJhPVdlKCJvYmplY3QiKSxOdD1XZSgiYm9vbGVhbiIpLEU9V2UoIm51bWJlciIpLEY9V2UoInN0cmluZyIpLHNhPVdlKCJ1bmRlZmluZWQiKSxrbj10PT50PT09bnVsbCxHPXQ9PmtuKHQpfHxzYSh0KSx7aXNBcnJheTpYfT1BcnJheSxVPXQ9PnJhKHQpJiYha24odCkmJiFYKHQpOygodCxlLG4pPT57bGV0IHI9KDI8PE1hdGgubG9nKHQubGVuZ3RoLTEpL01hdGguTE4yKS0xLHM9LX4oMS42KnIqZS90Lmxlbmd0aCk7cmV0dXJuKGk9ZSk9PntsZXQgYT0iIjtmb3IoOzspe2xldCBvPW4ocyksbD1zO2Zvcig7bC0tOylpZihhKz10W29bbF0mcl18fCIiLGEubGVuZ3RoPT09aSlyZXR1cm4gYX19fSkoInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QiLDIxLHQ9PntsZXQgZT1nbG9iYWxUaGlzLmNyeXB0bztyZXR1cm4gZT09PXZvaWQgMCYmKGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKS53ZWJjcnlwdG8pLGUuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKX0pO2NvbnN0IE10PSh0LGUpPT5uPT5NYXRoLm1pbihNYXRoLm1heChuLHQpLGUpOy8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgU3VuIE9jdCAyMCAyMDI0CiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiB3KHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9PkUoZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gU2UoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gT2UodCxlKXtjb25zdCBuPXcoRSx0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBpYT0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIGFhKHQpe2NvbnN0IGU9aWEoKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXcoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgb2E9KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBsYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9b2EoKSxzPXcoRixyLG4pLGk9dyhOdCxyLG4pLGE9dyhYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBibj17QVNDOjEsREVTQzoyfSx1YT1PYmplY3QudmFsdWVzKGJuKSxjYT0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpibi5BU0MsbWV0YTpTZSgpfSk7ZnVuY3Rpb24gZmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPWNhKCkscz13KEYscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHcoSCh1YSkscixuKSgib3JkZXJUeXBlIiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgZGE9KCk9Pih7fSk7ZnVuY3Rpb24gaGEodCl7Y29uc3QgZT1kYSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihGKHMpJiZFKGkpJiZFKGEpJiZVKG8pKXtjb25zdCBsPXt9LHU9dyhFLGwsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaCh1KSxlW25dPVtzLGksYSxsXX19cmV0dXJuIGV9Y29uc3QgbWE9KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOlNlKCl9KTtmdW5jdGlvbiB5YSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9bWEoKSxzPXcoRixyLG4pLGk9dyhFLHIudWksbi51aSksYT13KEYsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0IiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qgdm49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSxnYT1PYmplY3QudmFsdWVzKHZuKSxJbj17cmluZzoxLGRhc2g6Mn0scGE9T2JqZWN0LnZhbHVlcyhJbikseHQ9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSxFbj1PYmplY3QudmFsdWVzKHh0KSx3YT0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOnZuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTpJbi5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjp4dC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246eHQuYm90dG9tfSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBUYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9d2EoKSxzPXcoRixyLG4pLGk9dyhOdCxyLG4pLGE9dyhFLHIuc3RhcnQsbi5zdGFydCksbz13KEYsci5zdGFydCxuLnN0YXJ0KSxsPXcoRSxyLmVuZCxuLmVuZCksdT13KEYsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSx3KEgoZ2EpLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSx3KEgocGEpLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHcoSChFbiksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIiksdyhYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLHUoInRhYmxlSWQiKSxsKCJ4IiksbCgieSIpLHcoSChFbiksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSx3KFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBTYT17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LGxlPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxObj1PYmplY3QudmFsdWVzKGVlKSxNbj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sT2E9T2JqZWN0LnZhbHVlcyhNbikseG49e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LGthPU9iamVjdC52YWx1ZXMoeG4pLER0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxEbj1PYmplY3QudmFsdWVzKER0KSxDbj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxiYT1PYmplY3QudmFsdWVzKENuKSx2YT0uMSxJYT0xLEVhPTJlMyxOYT0yZTQsTWE9bGUudGFibGVDb21tZW50fGxlLmNvbHVtbkNvbW1lbnR8bGUuY29sdW1uRGF0YVR5cGV8bGUuY29sdW1uRGVmYXVsdHxsZS5jb2x1bW5QcmltYXJ5S2V5fGxlLmNvbHVtbk5vdE51bGx8bGUucmVsYXRpb25zaGlwLHhhPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93Ok1hLGRhdGFiYXNlOk1uLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOlNhLkVSRCxsYW5ndWFnZTp4bi5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6RHQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpEdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6Q24ubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTEsaWdub3JlU2F2ZVNldHRpbmdzOjB9KSxGbj1NdChFYSxOYSksRGE9TXQodmEsSWEpLENhPU10KDYwLDIwMCk7ZnVuY3Rpb24gRmEodCl7Y29uc3QgZT14YSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49dyhFLGUsdCkscj13KEYsZSx0KSxzPXcoTnQsZSx0KTtyZXR1cm4gRSh0LndpZHRoKSYmKGUud2lkdGg9Rm4odC53aWR0aCkpLEUodC5oZWlnaHQpJiYoZS5oZWlnaHQ9Rm4odC5oZWlnaHQpKSxFKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPURhKHQuem9vbUxldmVsKSksRSh0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1DYSh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IiksbigiaWdub3JlU2F2ZVNldHRpbmdzIikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHcoSChPYSksZSx0KSgiZGF0YWJhc2UiKSx3KEgoa2EpLGUsdCkoImxhbmd1YWdlIiksdyhIKERuKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIiksdyhIKERuKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHcoSChiYSksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZObi5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmbmEoTm4sdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBBYT0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gVmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUFhKCkscz13KEYscixuKSxpPXcoWCxyLG4pLGE9dyhFLHIudWksbi51aSksbz13KEYsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLE9lKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFdhPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gTGEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVdhKCkscz13KEYscixuKSxpPXcoRSxyLG4pLGE9dyhFLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiAkYSh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LGw9RmEoby5zZXR0aW5ncyksdT1hYShvLmRvYyksYz1oYShvLmx3dyksZD1WYSgoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSxwPUxhKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9VGEoKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLGs9bGEoKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksUD1mYSgoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPXlhKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJueyRzY2hlbWE6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kaW5ldWcvZXJkLWVkaXRvci9tYWluL2pzb24tc2NoZW1hL3NjaGVtYS5qc29uIix2ZXJzaW9uOiIzLjAuMCIsc2V0dGluZ3M6bCxkb2M6dSxjb2xsZWN0aW9uczp7dGFibGVFbnRpdGllczpkLHRhYmxlQ29sdW1uRW50aXRpZXM6cCxyZWxhdGlvbnNoaXBFbnRpdGllczpoLGluZGV4RW50aXRpZXM6ayxpbmRleENvbHVtbkVudGl0aWVzOlAsbWVtb0VudGl0aWVzOk19LGx3dzpjfX1mdW5jdGlvbiBfYSh0KXtyZXR1cm5bdCwtMSwtMSx7fV19ZnVuY3Rpb24gQ3QodCxlLG4pe3JldHVybiB0W2VdfHwodFtlXT1fYShuKSx0W2VdKX1mdW5jdGlvbiB6YSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsxXSxvPWlbMl07YTxlJiYoaVsxXT1lKSxvPGUmJnMoKX1mdW5jdGlvbiBSYSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsyXSxvPWlbMV07YTxlJiYoaVsyXT1lKSxvPD1lJiZzKCl9ZnVuY3Rpb24gWmEodCxlLG4scixzLGkpe2NvbnN0IGE9Q3QodCxuLHIpOyhhWzNdW3NdPz8tMSk8PWUmJihhWzNdW3NdPWUsaSgpKX1jbGFzcyBQYXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbnMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9Y29sbGVjdGlvbihlKXtyZXR1cm4gbmV3IFVhKHRoaXMuY29sbGVjdGlvbnNbZV0sZSl9fWNsYXNzIFVhe2NvbnN0cnVjdG9yKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb25LZXkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSl9c2VsZWN0QnlJZChlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2VdfXNlbGVjdEJ5SWRzKGUpe3JldHVybiBlLmxlbmd0aCxlLm1hcChuPT50aGlzLnNlbGVjdEJ5SWQobikpLmZpbHRlcihCb29sZWFuKX1zZWxlY3RFbnRpdGllcygpe3JldHVybiB0aGlzLmNvbGxlY3Rpb259c2VsZWN0QWxsKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb2xsZWN0aW9uKX1zZXRPbmUoZSl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbltlLmlkXT1lLHRoaXN9c2V0TWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMuc2V0T25lKG4pKSx0aGlzfXNldEFsbChlKXtyZXR1cm4gdGhpcy5yZW1vdmVBbGwoKSx0aGlzLnNldE1hbnkoZSksdGhpc31hZGRPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlLmlkKT90aGlzOih0aGlzLnNldE9uZShlKSx0aGlzKX1hZGRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5hZGRPbmUobikpLHRoaXN9cmVtb3ZlT25lKGUpe3JldHVybiB0aGlzLnNlbGVjdEJ5SWQoZSkmJlJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5jb2xsZWN0aW9uLGUpLHRoaXN9cmVtb3ZlTWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMucmVtb3ZlT25lKG4pKSx0aGlzfXJlbW92ZUFsbCgpe3JldHVybiB0aGlzLmNvbGxlY3Rpb249e30sdGhpc311cGRhdGVPbmUoZSxuKXtjb25zdCByPXRoaXMuc2VsZWN0QnlJZChlKTtyZXR1cm4gciYmKG4ociksci5tZXRhLnVwZGF0ZUF0PURhdGUubm93KCkpLHRoaXN9dXBkYXRlTWFueShlLG4pe3JldHVybiBlLmZvckVhY2gocj0+dGhpcy51cGRhdGVPbmUocixuKSksdGhpc31nZXRPckNyZWF0ZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO2lmKHIpcmV0dXJuIHI7Y29uc3Qgcz1uKGUpO3JldHVybiB0aGlzLnNldE9uZShzKSx0aGlzLnNlbGVjdEJ5SWQoZSl9YWRkT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIHphKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlbW92ZU9wZXJhdG9yKGUsbixyLHMpe3JldHVybiBSYShlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyksdGhpc31yZXBsYWNlT3BlcmF0b3IoZSxuLHIscyxpKXtyZXR1cm4gWmEoZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMsaSksdGhpc319Y29uc3QgQT10PT5uZXcgUGEodCk7Y2xhc3MgdWUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgSGEgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBqYSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHFhIGV4dGVuZHMgdWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3Mga2UgZXh0ZW5kcyB1ZXt9Y2xhc3MgQW4gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgRCBleHRlbmRzIHVle31jbGFzcyB0ZSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsXz0ic2hvcnQiLEM9ImxvbmciLGV0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sVm49e3llYXI6Zixtb250aDpfLGRheTpmfSxZYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpffSxXbj17eWVhcjpmLG1vbnRoOkMsZGF5OmZ9LExuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkN9LCRuPXtob3VyOmYsbWludXRlOmZ9LF9uPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHpuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOl99LFJuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkN9LFpuPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxQbj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sVW49e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOl99LEhuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpDfSxqbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxxbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxZbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxHbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxHYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpfLGhvdXI6ZixtaW51dGU6Zn0sSm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6X30sQm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6X30sUW49e3llYXI6Zixtb250aDpDLGRheTpmLHdlZWtkYXk6Qyxob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkN9LEtuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkMsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpDfTtjbGFzcyBMZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBGdD1udWxsO2NsYXNzIHR0IGV4dGVuZHMgTGV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBGdD09PW51bGwmJihGdD1uZXcgdHQpLEZ0fWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIGtyKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IG50PXt9O2Z1bmN0aW9uIEphKHQpe3JldHVybiBudFt0XXx8KG50W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxudFt0XX1jb25zdCBCYT17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBRYSh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyxsLHUsY109cjtyZXR1cm5bYSxzLGksbyxsLHUsY119ZnVuY3Rpb24gS2EodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPUJhW2ldO2k9PT0iZXJhIj9yW29dPWE6eShvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCBydD17fTtjbGFzcyBKIGV4dGVuZHMgTGV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gcnRbZV18fChydFtlXT1uZXcgSihlKSkscnRbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXtydD17fSxudD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4ga3IoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPUphKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sbCx1LGNdPXIuZm9ybWF0VG9QYXJ0cz9LYShyLG4pOlFhKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCBwPWx0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOmw9PT0yND8wOmwsbWludXRlOnUsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IGs9aCUxZTM7cmV0dXJuIGgtPWs+PTA/azoxZTMraywocC1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBYbj17fTtmdW5jdGlvbiBYYSh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVhuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksWG5bbl09cikscn1sZXQgQXQ9e307ZnVuY3Rpb24gVnQodCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj1BdFtuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSxBdFtuXT1yKSxyfWxldCBXdD17fTtmdW5jdGlvbiBlbyh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVd0W25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxXdFtuXT1yKSxyfWxldCBMdD17fTtmdW5jdGlvbiB0byh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPUx0W3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxMdFtzXT1pKSxpfWxldCAkZT1udWxsO2Z1bmN0aW9uIG5vKCl7cmV0dXJuICRlfHwoJGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsJGUpfWxldCBlcj17fTtmdW5jdGlvbiBybyh0KXtsZXQgZT1lclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxlclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIHNvKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPVZ0KHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCBsPXQuc3Vic3RyaW5nKDAsbik7cj1WdChsKS5yZXNvbHZlZE9wdGlvbnMoKSxzPWx9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBpbyh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIGFvKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPWcudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb28odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1nLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiBzdCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyB1b3tjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPWVvKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6VXQoZSwzKTtyZXR1cm4gSShuLHRoaXMucGFkVG8pfX19Y2xhc3MgY297Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9VnQobixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgZm97Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZ3cigpJiYodGhpcy5ydGY9dG8oZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOkZvKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBobz17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIE97c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBPLmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fHYuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6bm8oKSksbD1ufHx2LmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sdT1yfHx2LmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPVp0KHMpfHx2LmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBPKG8sbCx1LGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXskZT1udWxsLEF0PXt9LFd0PXt9LEx0PXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIE8uY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLGxdPXNvKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fGx8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9aW8odGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPWxvKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6Ty5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLFp0KGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiBzdCh0aGlzLGUsSXIsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPWFvKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gc3QodGhpcyxlLE1yLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1vbyhpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gc3QodGhpcyx2b2lkIDAsKCk9PnhyLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W2cudXRjKDIwMTYsMTEsMTMsOSksZy51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHN0KHRoaXMsZSxEciwoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W2cudXRjKC00MCwxLDEpLGcudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgdW8odGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IGNvKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IGZvKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFhhKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6VHIoKT9ybyh0aGlzLmxvY2FsZSk6aG99Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0ICR0PW51bGw7Y2xhc3MgeCBleHRlbmRzIExle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gJHQ9PT1udWxsJiYoJHQ9bmV3IHgoMCkpLCR0fXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/eC51dGNJbnN0YW5jZTpuZXcgeChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IHgodXQoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke1JlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7UmUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIFJlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBtbyBleHRlbmRzIExle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZih5KHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgTGUpcmV0dXJuIHQ7aWYocG8odCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj90dC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij94LnV0Y0luc3RhbmNlOngucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP3guaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBtbyh0KX1sZXQgdHI9KCk9PkRhdGUubm93KCksbnI9InN5c3RlbSIscnI9bnVsbCxzcj1udWxsLGlyPW51bGwsYXI9NjAsb3IsbHI9bnVsbDtjbGFzcyB2e3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIHRyfXN0YXRpYyBzZXQgbm93KGUpe3RyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtucj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUobnIsdHQuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiBycn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7cnI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gc3J9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe3NyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gaXJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7aXI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gbHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe2xyPVp0KGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIGFyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe2FyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gb3J9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtvcj1lfXN0YXRpYyByZXNldENhY2hlcygpe08ucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyB6e2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QgdXI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sY3I9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVih0LGUpe3JldHVybiBuZXcgeigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIF90KHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gZnIodCxlLG4pe3JldHVybiBuKyhfZSh0KT9jcjp1cilbZS0xXX1mdW5jdGlvbiBkcih0LGUpe2NvbnN0IG49X2UodCk/Y3I6dXIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHp0KHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gaXQodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPWZyKHIscyxpKSxvPXp0KF90KHIscyxpKSxuKTtsZXQgbD1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksdTtyZXR1cm4gbDwxPyh1PXItMSxsPXplKHUsZSxuKSk6bD56ZShyLGUsbik/KHU9cisxLGw9MSk6dT1yLHt3ZWVrWWVhcjp1LHdlZWtOdW1iZXI6bCx3ZWVrZGF5Om8sLi4uZnQodCl9fWZ1bmN0aW9uIGhyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9enQoX3QociwxLGUpLG4pLG89dmUocik7bGV0IGw9cyo3K2ktYS03K2UsdTtsPDE/KHU9ci0xLGwrPXZlKHUpKTpsPm8/KHU9cisxLGwtPXZlKHIpKTp1PXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09ZHIodSxsKTtyZXR1cm57eWVhcjp1LG1vbnRoOmMsZGF5OmQsLi4uZnQodCl9fWZ1bmN0aW9uIFJ0KHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9ZnIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLmZ0KHQpfX1mdW5jdGlvbiBtcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1kcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5mdCh0KX19ZnVuY3Rpb24geXIodCxlKXtpZigheSh0LmxvY2FsV2Vla2RheSl8fCF5KHQubG9jYWxXZWVrTnVtYmVyKXx8IXkodC5sb2NhbFdlZWtZZWFyKSl7aWYoIXkodC53ZWVrZGF5KXx8IXkodC53ZWVrTnVtYmVyKXx8IXkodC53ZWVrWWVhcikpdGhyb3cgbmV3IGtlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiB5KHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSkseSh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLHkodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24geW8odCxlPTQsbj0xKXtjb25zdCByPWF0KHQud2Vla1llYXIpLHM9Vyh0LndlZWtOdW1iZXIsMSx6ZSh0LndlZWtZZWFyLGUsbikpLGk9Vyh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vigid2Vla2RheSIsdC53ZWVrZGF5KTpWKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlYoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBnbyh0KXtjb25zdCBlPWF0KHQueWVhciksbj1XKHQub3JkaW5hbCwxLHZlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vigib3JkaW5hbCIsdC5vcmRpbmFsKTpWKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIGdyKHQpe2NvbnN0IGU9YXQodC55ZWFyKSxuPVcodC5tb250aCwxLDEyKSxyPVcodC5kYXksMSxvdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpWKCJkYXkiLHQuZGF5KTpWKCJtb250aCIsdC5tb250aCk6VigieWVhciIsdC55ZWFyKX1mdW5jdGlvbiBwcih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPVcoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9VyhuLDAsNTkpLG89VyhyLDAsNTkpLGw9VyhzLDAsOTk5KTtyZXR1cm4gaT9hP28/bD8hMTpWKCJtaWxsaXNlY29uZCIscyk6Vigic2Vjb25kIixyKTpWKCJtaW51dGUiLG4pOlYoImhvdXIiLGUpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gcG8odCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiB3byh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHdyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFRyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVG8odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gU3IodCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gU28odCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIFp0KHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBEKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoIVcodC5maXJzdERheSwxLDcpfHwhVyh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiFXKGUsMSw3KSkpdGhyb3cgbmV3IEQoIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uIFcodCxlLG4pe3JldHVybiBhdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBPbyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEkodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gUHQodCl7aWYoISh5KHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBVdCh0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4gX2UodCk/MzY2OjM2NX1mdW5jdGlvbiBvdCh0LGUpe2NvbnN0IG49T28oZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/X2Uocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gbHQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gT3IodCxlLG4pe3JldHVybi16dChfdCh0LDEsZSksbikrZS0xfWZ1bmN0aW9uIHplKHQsZT00LG49MSl7Y29uc3Qgcj1Pcih0LGUsbikscz1Pcih0KzEsZSxuKTtyZXR1cm4odmUodCktcitzKS83fWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0Pjk5P3Q6dD52LnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24ga3IodCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKGw9PmwudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiB1dCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBicih0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgRChgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBjdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPWJyKHMpfXJldHVybiBufWZ1bmN0aW9uIFJlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7SShuLDIpfToke0kociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtJKG4sMil9JHtJKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBmdCh0KXtyZXR1cm4gU28odCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCBrbz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sdnI9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxibz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIElyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmJvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4udnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmtvXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IEVyPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxOcj1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLHZvPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIE1yKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnZvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uTnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLkVyXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IHhyPVsiQU0iLCJQTSJdLElvPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sRW89WyJCQyIsIkFEIl0sTm89WyJCIiwiQSJdO2Z1bmN0aW9uIERyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLk5vXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uRW9dO2Nhc2UibG9uZyI6cmV0dXJuWy4uLklvXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBNbyh0KXtyZXR1cm4geHJbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24geG8odCxlKXtyZXR1cm4gTXIoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIERvKHQsZSl7cmV0dXJuIElyKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gQ28odCxlKXtyZXR1cm4gRHIoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBGbyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSxsPW89PT0xLHU9c1t0XSxjPXI/bD91WzFdOnVbMl18fHVbMV06bD9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIENyKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgQW89e0Q6ZXQsREQ6Vm4sREREOlduLEREREQ6TG4sdDokbix0dDpfbix0dHQ6em4sdHR0dDpSbixUOlpuLFRUOlBuLFRUVDpVbixUVFRUOkhuLGY6am4sZmY6WW4sZmZmOkpuLGZmZmY6UW4sRjpxbixGRjpHbixGRkY6Qm4sRkZGRjpLbn07Y2xhc3MgTntzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyBOKGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIEFvW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEkoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLGspPT50aGlzLmxvYy5leHRyYWN0KGUsaCxrKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9NbyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSxsPShoLGspPT5yP0RvKGUsaCk6aShrP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSx1PShoLGspPT5yP3hvKGUsaCk6aShrP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3Qgaz1OLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIGs/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLGspOmh9LGQ9aD0+cj9DbyhlLGgpOmkoe2VyYTpofSwiZXJhIikscD1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gdSgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiB1KCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIHUoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiB1KCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIHUoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gdSgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiBsKCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIGwoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gbCgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIGwoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gbCgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiBsKCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIENyKE4ucGFyc2VGb3JtYXQobikscCl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj1sPT57c3dpdGNoKGxbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9bD0+dT0+e2NvbnN0IGM9cih1KTtyZXR1cm4gYz90aGlzLm51bShsLmdldChjKSx1Lmxlbmd0aCk6dX0saT1OLnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKGwse2xpdGVyYWw6dSx2YWw6Y30pPT51P2w6bC5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcihsPT5sKSk7cmV0dXJuIENyKGkscyhvKSl9fWNvbnN0IEZyPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sbF09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLGxdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIEFyKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IFZyPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyxWbz1gKD86JHtWci5zb3VyY2V9Pyg/OlxcWygke0ZyLnNvdXJjZX0pXFxdKT8pP2AsanQ9LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8sV3I9UmVnRXhwKGAke2p0LnNvdXJjZX0ke1ZvfWApLHF0PVJlZ0V4cChgKD86VCR7V3Iuc291cmNlfSk/YCksV289LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLExvPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLCRvPS8oXGR7NH0pLT8oXGR7M30pLyxfbz1Bcigid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLHpvPUFyKCJ5ZWFyIiwib3JkaW5hbCIpLFJvPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLExyPVJlZ0V4cChgJHtqdC5zb3VyY2V9ID8oPzoke1ZyLnNvdXJjZX18KCR7RnIuc291cmNlfSkpP2ApLFpvPVJlZ0V4cChgKD86ICR7THIuc291cmNlfSk/YCk7ZnVuY3Rpb24gTWUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4geShyKT9uOnJlKHIpfWZ1bmN0aW9uIFBvKHQsZSl7cmV0dXJuW3t5ZWFyOk1lKHQsZSksbW9udGg6TWUodCxlKzEsMSksZGF5Ok1lKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24geGUodCxlKXtyZXR1cm5be2hvdXJzOk1lKHQsZSwwKSxtaW51dGVzOk1lKHQsZSsxLDApLHNlY29uZHM6TWUodCxlKzIsMCksbWlsbGlzZWNvbmRzOlB0KHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBaZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj11dCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDp4Lmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gUGUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IFVvPVJlZ0V4cChgXlQ/JHtqdC5zb3VyY2V9JGApLEhvPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIGpvKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sbCx1XT10LGM9ZVswXT09PSItIixkPWwmJmxbMF09PT0iLSIscD0oaCxrPSExKT0+aCE9PXZvaWQgMCYmKGt8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczpwKGZlKG4pKSxtb250aHM6cChmZShyKSksd2Vla3M6cChmZShzKSksZGF5czpwKGZlKGkpKSxob3VyczpwKGZlKGEpKSxtaW51dGVzOnAoZmUobykpLHNlY29uZHM6cChmZShsKSxsPT09Ii0wIiksbWlsbGlzZWNvbmRzOnAoUHQodSksZCl9XX1jb25zdCBxbz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gWXQodCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/SHQocmUoZSkpOnJlKGUpLG1vbnRoOnZyLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9Fci5pbmRleE9mKHQpKzE6TnIuaW5kZXhPZih0KSsxKSxvfWNvbnN0IFlvPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gR28odCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sbCx1LGMsZF09dCxwPVl0KGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiBsP2g9cW9bbF06dT9oPTA6aD11dChjLGQpLFtwLG5ldyB4KGgpXX1mdW5jdGlvbiBKbyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IEJvPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sUW89L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sS289L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uICRyKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltZdChlLHMscixuLGksYSxvKSx4LnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBYbyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bWXQoZSxvLG4scixzLGksYSkseC51dGNJbnN0YW5jZV19Y29uc3QgZWw9SWUoV28scXQpLHRsPUllKExvLHF0KSxubD1JZSgkbyxxdCkscmw9SWUoV3IpLF9yPUVlKFBvLHhlLFplLFBlKSxzbD1FZShfbyx4ZSxaZSxQZSksaWw9RWUoem8seGUsWmUsUGUpLGFsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBvbCh0KXtyZXR1cm4gTmUodCxbZWwsX3JdLFt0bCxzbF0sW25sLGlsXSxbcmwsYWxdKX1mdW5jdGlvbiBsbCh0KXtyZXR1cm4gTmUoSm8odCksW1lvLEdvXSl9ZnVuY3Rpb24gdWwodCl7cmV0dXJuIE5lKHQsW0JvLCRyXSxbUW8sJHJdLFtLbyxYb10pfWZ1bmN0aW9uIGNsKHQpe3JldHVybiBOZSh0LFtIbyxqb10pfWNvbnN0IGZsPUVlKHhlKTtmdW5jdGlvbiBkbCh0KXtyZXR1cm4gTmUodCxbVW8sZmxdKX1jb25zdCBobD1JZShSbyxabyksbWw9SWUoTHIpLHlsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBnbCh0KXtyZXR1cm4gTmUodCxbaGwsX3JdLFttbCx5bF0pfWNvbnN0IHpyPSJJbnZhbGlkIER1cmF0aW9uIixScj17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSxwbD17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Scn0sTD0xNDYwOTcvNDAwLERlPTE0NjA5Ny80ODAwLHdsPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6RGUvNyxkYXlzOkRlLGhvdXJzOkRlKjI0LG1pbnV0ZXM6RGUqMjQqNjAsc2Vjb25kczpEZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6RGUqMjQqNjAqNjAqMWUzfSwuLi5Scn0sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLFRsPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgVChyKX1mdW5jdGlvbiBacih0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIFRsLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBQcih0LGUpe2NvbnN0IG49WnIodCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZih5KGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKHkoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIFNsKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3MgVHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj93bDpwbDtlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxPLmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gVC5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IEQoYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgVCh7dmFsdWVzOmN0KGUsVC5ub3JtYWxpemVVbml0KSxsb2M6Ty5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gVC5mcm9tTWlsbGlzKGUpO2lmKFQuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIFQuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgRChgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPWNsKGUpO3JldHVybiByP1QuZnJvbU9iamVjdChyLG4pOlQuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09ZGwoZSk7cmV0dXJuIHI/VC5mcm9tT2JqZWN0KHIsbik6VC5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHFhKHIpO3JldHVybiBuZXcgVCh7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgQW4oZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6enJ9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB6cjtjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4geShzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPVV0KHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxnLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/WnIodGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09YnIoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW1Qubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uY3QoZSxULm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gUHIodGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPVNsKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT5ULm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCB1IGluIHIpbys9dGhpcy5tYXRyaXhbdV1bYV0qclt1XSxyW3VdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCBsPU1hdGgudHJ1bmMobyk7blthXT1sLHJbYV09KG8qMWUzLWwqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFByKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IENlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBPbCh0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2IuaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/Yi5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2IuaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3MgYntjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IGphKHIpO3JldHVybiBuZXcgYih7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUhlKGUpLHM9SGUobiksaT1PbChyLHMpO3JldHVybiBpPz9uZXcgYih7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPWcuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sbDt0cnl7bz1nLmZyb21JU08ocyxuKSxsPW8uaXNWYWxpZH1jYXRjaHtsPSExfWlmKGEmJmwpcmV0dXJuIGIuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IHU9VC5mcm9tSVNPKHMsbik7aWYodS5pc1ZhbGlkKXJldHVybiBiLmFmdGVyKGksdSl9ZWxzZSBpZihsKXtjb25zdCB1PVQuZnJvbUlTTyhyLG4pO2lmKHUuaXNWYWxpZClyZXR1cm4gYi5iZWZvcmUobyx1KX19cmV0dXJuIGIuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9iLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChIZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGIuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49VC5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHMobD0+bCpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChiLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDpiLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBiLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKGw9Plt7dGltZTpsLnMsdHlwZToicyJ9LHt0aW1lOmwuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKGwsdSk9PmwudGltZS11LnRpbWUpO2Zvcihjb25zdCBsIG9mIG8pcis9bC50eXBlPT09InMiPzE6LTEscj09PTE/bj1sLnRpbWU6KG4mJituIT0rbC50aW1lJiZzLnB1c2goYi5mcm9tRGF0ZVRpbWVzKG4sbC50aW1lKSksbj1udWxsKTtyZXR1cm4gYi5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBiLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkNlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9ZXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkNlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkNlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkNlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkNlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpDZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTpULmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgZHR7c3RhdGljIGhhc0RTVChlPXYuZGVmYXVsdFpvbmUpe2NvbnN0IG49Zy5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLHYuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fE8uY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8Ty5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxPLmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8Ty5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBPLmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gTy5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6d3IoKSxsb2NhbGVXZWVrOlRyKCl9fX1mdW5jdGlvbiBVcih0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKFQuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiBrbCh0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKGwsdSk9PnUueWVhci1sLnllYXJdLFsicXVhcnRlcnMiLChsLHUpPT51LnF1YXJ0ZXItbC5xdWFydGVyKyh1LnllYXItbC55ZWFyKSo0XSxbIm1vbnRocyIsKGwsdSk9PnUubW9udGgtbC5tb250aCsodS55ZWFyLWwueWVhcikqMTJdLFsid2Vla3MiLChsLHUpPT57Y29uc3QgYz1VcihsLHUpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsVXJdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFtsLHVdb2YgciluLmluZGV4T2YobCk+PTAmJihhPWwsc1tsXT11KHQsZSksbz1pLnBsdXMocyksbz5lPyhzW2xdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbbF0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIGJsKHQsZSxuLHIpe2xldFtzLGksYSxvXT1rbCh0LGUsbik7Y29uc3QgbD1lLXMsdT1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTt1Lmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKStsLyhhLXMpKSk7Y29uc3QgYz1ULmZyb21PYmplY3QoaSxyKTtyZXR1cm4gdS5sZW5ndGg+MD9ULmZyb21NaWxsaXMobCxyKS5zaGlmdFRvKC4uLnUpLnBsdXMoYyk6Y31jb25zdCBHdD17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sSHI9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LHZsPUd0LmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gSWwodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKEd0LmhhbmlkZWMpIT09LTEpZSs9dmwuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIEhyKXtjb25zdFtpLGFdPUhyW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7R3RbdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgRWw9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIFModCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKElsKG4pKX19Y29uc3QganI9IlsgwqBdIixxcj1uZXcgUmVnRXhwKGpyLCJnIik7ZnVuY3Rpb24gTmwodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UocXIsanIpfWZ1bmN0aW9uIFlyKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UocXIsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKE5sKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5ZcihuKT09PVlyKHIpKStlfX1mdW5jdGlvbiBHcih0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT51dChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiBodCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gTWwodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIHhsKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSxsPVIoZSwiezEsM30iKSx1PVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSxwPVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKE1sKE0udmFsKSksZGVzZXI6KFtqXSk9PmosbGl0ZXJhbDohMH0pLFA9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBaKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gWihlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBTKHUpO2Nhc2UieXkiOnJldHVybiBTKGQsSHQpO2Nhc2UieXl5eSI6cmV0dXJuIFMoaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIFMocCk7Y2FzZSJ5eXl5eXkiOnJldHVybiBTKGEpO2Nhc2UiTSI6cmV0dXJuIFMobyk7Y2FzZSJNTSI6cmV0dXJuIFMocik7Y2FzZSJNTU0iOnJldHVybiBaKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFooZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBTKG8pO2Nhc2UiTEwiOnJldHVybiBTKHIpO2Nhc2UiTExMIjpyZXR1cm4gWihlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBaKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gUyhvKTtjYXNlImRkIjpyZXR1cm4gUyhyKTtjYXNlIm8iOnJldHVybiBTKGwpO2Nhc2Uib29vIjpyZXR1cm4gUyhzKTtjYXNlIkhIIjpyZXR1cm4gUyhyKTtjYXNlIkgiOnJldHVybiBTKG8pO2Nhc2UiaGgiOnJldHVybiBTKHIpO2Nhc2UiaCI6cmV0dXJuIFMobyk7Y2FzZSJtbSI6cmV0dXJuIFMocik7Y2FzZSJtIjpyZXR1cm4gUyhvKTtjYXNlInEiOnJldHVybiBTKG8pO2Nhc2UicXEiOnJldHVybiBTKHIpO2Nhc2UicyI6cmV0dXJuIFMobyk7Y2FzZSJzcyI6cmV0dXJuIFMocik7Y2FzZSJTIjpyZXR1cm4gUyhsKTtjYXNlIlNTUyI6cmV0dXJuIFMocyk7Y2FzZSJ1IjpyZXR1cm4gaHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIGh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gUyhuKTtjYXNlImEiOnJldHVybiBaKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gUyhpKTtjYXNlImtrIjpyZXR1cm4gUyhkLEh0KTtjYXNlIlciOnJldHVybiBTKG8pO2Nhc2UiV1ciOnJldHVybiBTKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gUyhuKTtjYXNlIkVFRSI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiBHcihuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIEdyKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiBodCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4gaHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOkVsfTtyZXR1cm4gUC50b2tlbj10LFB9Y29uc3QgRGw9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gQ2wodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IGw9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiFsLHZhbDpsPyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1EbFthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIEZsKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiBBbCh0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSxsPW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaStsKSkpLGkrPWx9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gVmwodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIHkodC56KXx8KG49Si5jcmVhdGUodC56KSkseSh0LlopfHwobnx8KG49bmV3IHgodC5aKSkscj10LlopLHkodC5xKXx8KHQuTT0odC5xLTEpKjMrMSkseSh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSx5KHQudSl8fCh0LlM9UHQodC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IEp0PW51bGw7ZnVuY3Rpb24gV2woKXtyZXR1cm4gSnR8fChKdD1nLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLEp0fWZ1bmN0aW9uIExsKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49Ti5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPVFyKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gSnIodCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT5MbChuLGUpKSl9ZnVuY3Rpb24gQnIodCxlLG4pe2NvbnN0IHI9SnIoTi5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PnhsKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109RmwocyksbD1SZWdFeHAoYSwiaSIpLFt1LGNdPUFsKGUsbCxvKSxbZCxwLGhdPWM/VmwoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBrZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDpsLHJhd01hdGNoZXM6dSxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTpwLHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiAkbCh0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Ccih0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIFFyKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj1OLmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKFdsKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5DbChhLHQsaSkpfWNvbnN0IEJ0PSJJbnZhbGlkIERhdGVUaW1lIixLcj04NjRlMTM7ZnVuY3Rpb24gbXQodCl7cmV0dXJuIG5ldyB6KCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIFF0KHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9aXQodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBLdCh0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1pdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IGcoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIFhyKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIHl0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gZ3QodCxlLG4pe3JldHVybiBYcihsdCh0KSxlLG4pfWZ1bmN0aW9uIGVzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksb3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT1ULmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1sdChpKTtsZXRbbCx1XT1YcihvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJihsKz1hLHU9dC56b25lLm9mZnNldChsKSkse3RzOmwsbzp1fX1mdW5jdGlvbiBVZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCBsPWV8fG8sdT1nLmZyb21PYmplY3QodCx7Li4ubix6b25lOmwsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP3U6dS5zZXRab25lKG8pfWVsc2UgcmV0dXJuIGcuaW52YWxpZChuZXcgeigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gcHQodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/Ti5jcmVhdGUoTy5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBYdCh0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUkodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1JKHQuYy5tb250aCkscis9Ii0iLHIrPUkodC5jLmRheSkpOihyKz1JKHQuYy5tb250aCkscis9SSh0LmMuZGF5KSkscn1mdW5jdGlvbiB0cyh0LGUsbixyLHMsaSl7bGV0IGE9SSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1JKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9SSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUkodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1JKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9SShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9SShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1JKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUkoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBucz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sX2w9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHpsPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHJzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sUmw9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sWmw9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIFBsKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBBbih0KTtyZXR1cm4gZX1mdW5jdGlvbiBzcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBQbCh0KX19ZnVuY3Rpb24gaXModCxlKXtjb25zdCBuPW5lKGUuem9uZSx2LmRlZmF1bHRab25lKSxyPU8uZnJvbU9iamVjdChlKSxzPXYubm93KCk7bGV0IGksYTtpZih5KHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IHUgb2YgcnMpeSh0W3VdKSYmKHRbdV09bnNbdV0pO2NvbnN0IG89Z3IodCl8fHByKHQpO2lmKG8pcmV0dXJuIGcuaW52YWxpZChvKTtjb25zdCBsPW4ub2Zmc2V0KHMpO1tpLGFdPWd0KHQsbCxuKX1yZXR1cm4gbmV3IGcoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIGFzKHQsZSxuKXtjb25zdCByPXkobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1VdChhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIG9zKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8di5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IHooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOm10KG4pKTt0aGlzLnRzPXkoZS50cyk/di5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPXl0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgeigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8Ty5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgZyh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1vcyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sbCx1XT1uO3JldHVybiBpcyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDpsLG1pbGxpc2Vjb25kOnV9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPW9zKGFyZ3VtZW50cyksW3IscyxpLGEsbyxsLHVdPW47cmV0dXJuIGUuem9uZT14LnV0Y0luc3RhbmNlLGlzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOmwsbWlsbGlzZWNvbmQ6dX0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPXdvKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIGcuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IGcoe3RzOnIsem9uZTpzLGxvYzpPLmZyb21PYmplY3Qobil9KTpnLmludmFsaWQobXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LUtyfHxlPktyP2cuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBnKHt0czplLHpvbmU6bmUobi56b25lLHYuZGVmYXVsdFpvbmUpLGxvYzpPLmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgRChgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBnKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSx2LmRlZmF1bHRab25lKSxsb2M6Ty5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IEQoImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIGcuaW52YWxpZChtdChyKSk7Y29uc3Qgcz1PLmZyb21PYmplY3QobiksaT1jdChlLHNzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309eXIoaSxzKSxsPXYubm93KCksdT15KG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KGwpOm4uc3BlY2lmaWNPZmZzZXQsYz0heShpLm9yZGluYWwpLGQ9IXkoaS55ZWFyKSxwPSF5KGkubW9udGgpfHwheShpLmRheSksaD1kfHxwLGs9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmayl0aHJvdyBuZXcga2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZihwJiZjKXRocm93IG5ldyBrZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBQPWt8fGkud2Vla2RheSYmIWg7bGV0IE0saixCPXl0KGwsdSk7UD8oTT1SbCxqPV9sLEI9aXQoQixhLG8pKTpjPyhNPVpsLGo9emwsQj1SdChCKSk6KE09cnMsaj1ucyk7bGV0IEZlPSExO2Zvcihjb25zdCBLIG9mIE0pe2NvbnN0IFR0PWlbS107eShUdCk/RmU/aVtLXT1qW0tdOmlbS109QltLXTpGZT0hMH1jb25zdCB3dD1QP3lvKGksYSxvKTpjP2dvKGkpOmdyKGkpLHE9d3R8fHByKGkpO2lmKHEpcmV0dXJuIGcuaW52YWxpZChxKTtjb25zdCBtZT1QP2hyKGksYSxvKTpjP21yKGkpOmksW3llLGllXT1ndChtZSx1LHIpLFE9bmV3IGcoe3RzOnllLHpvbmU6cixvOmllLGxvYzpzfSk7cmV0dXJuIGkud2Vla2RheSYmaCYmZS53ZWVrZGF5IT09US53ZWVrZGF5P2cuaW52YWxpZCgibWlzbWF0Y2hlZCB3ZWVrZGF5IixgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtpLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtRLnRvSVNPKCl9YCk6UX1zdGF0aWMgZnJvbUlTTyhlLG49e30pe2NvbnN0W3Isc109b2woZSk7cmV0dXJuIFVlKHIscyxuLCJJU08gODYwMSIsZSl9c3RhdGljIGZyb21SRkMyODIyKGUsbj17fSl7Y29uc3RbcixzXT1sbChlKTtyZXR1cm4gVWUocixzLG4sIlJGQyAyODIyIixlKX1zdGF0aWMgZnJvbUhUVFAoZSxuPXt9KXtjb25zdFtyLHNdPXVsKGUpO3JldHVybiBVZShyLHMsbiwiSFRUUCIsbil9c3RhdGljIGZyb21Gb3JtYXQoZSxuLHI9e30pe2lmKHkoZSl8fHkobikpdGhyb3cgbmV3IEQoImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCIpO2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPU8uZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSksW28sbCx1LGNdPSRsKGEsZSxuKTtyZXR1cm4gYz9nLmludmFsaWQoYyk6VWUobyxsLHIsYGZvcm1hdCAke259YCxlLHUpfXN0YXRpYyBmcm9tU3RyaW5nKGUsbixyPXt9KXtyZXR1cm4gZy5mcm9tRm9ybWF0KGUsbixyKX1zdGF0aWMgZnJvbVNRTChlLG49e30pe2NvbnN0W3Isc109Z2woZSk7cmV0dXJuIFVlKHIscyxuLCJTUUwiLGUpfXN0YXRpYyBpbnZhbGlkKGUsbj1udWxsKXtpZighZSl0aHJvdyBuZXcgRCgibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkIik7Y29uc3Qgcj1lIGluc3RhbmNlb2Ygej9lOm5ldyB6KGUsbik7aWYodi50aHJvd09uSW52YWxpZCl0aHJvdyBuZXcgSGEocik7cmV0dXJuIG5ldyBnKHtpbnZhbGlkOnJ9KX1zdGF0aWMgaXNEYXRlVGltZShlKXtyZXR1cm4gZSYmZS5pc0x1eG9uRGF0ZVRpbWV8fCExfXN0YXRpYyBwYXJzZUZvcm1hdEZvck9wdHMoZSxuPXt9KXtjb25zdCByPVFyKGUsTy5mcm9tT2JqZWN0KG4pKTtyZXR1cm4gcj9yLm1hcChzPT5zP3MudmFsOm51bGwpLmpvaW4oIiIpOm51bGx9c3RhdGljIGV4cGFuZEZvcm1hdChlLG49e30pe3JldHVybiBKcihOLnBhcnNlRm9ybWF0KGUpLE8uZnJvbU9iamVjdChuKSkubWFwKHM9PnMudmFsKS5qb2luKCIiKX1nZXQoZSl7cmV0dXJuIHRoaXNbZV19Z2V0IGlzVmFsaWQoKXtyZXR1cm4gdGhpcy5pbnZhbGlkPT09bnVsbH1nZXQgaW52YWxpZFJlYXNvbigpe3JldHVybiB0aGlzLmludmFsaWQ/dGhpcy5pbnZhbGlkLnJlYXNvbjpudWxsfWdldCBpbnZhbGlkRXhwbGFuYXRpb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5leHBsYW5hdGlvbjpudWxsfWdldCBsb2NhbGUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLmxvY2FsZTpudWxsfWdldCBudW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm51bWJlcmluZ1N5c3RlbTpudWxsfWdldCBvdXRwdXRDYWxlbmRhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXI6bnVsbH1nZXQgem9uZSgpe3JldHVybiB0aGlzLl96b25lfWdldCB6b25lTmFtZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm5hbWU6bnVsbH1nZXQgeWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnllYXI6TmFOfWdldCBxdWFydGVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmNlaWwodGhpcy5jLm1vbnRoLzMpOk5hTn1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5tb250aDpOYU59Z2V0IGRheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLmRheTpOYU59Z2V0IGhvdXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5ob3VyOk5hTn1nZXQgbWludXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWludXRlOk5hTn1nZXQgc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuc2Vjb25kOk5hTn1nZXQgbWlsbGlzZWNvbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5taWxsaXNlY29uZDpOYU59Z2V0IHdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IHdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1F0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCB3ZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgaXNXZWVrZW5kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCYmdGhpcy5sb2MuZ2V0V2Vla2VuZERheXMoKS5pbmNsdWRlcyh0aGlzLndlZWtkYXkpfWdldCBsb2NhbFdlZWtkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtkYXk6TmFOfWdldCBsb2NhbFdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCBsb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9LdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IG9yZGluYWwoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1J0KHRoaXMuYykub3JkaW5hbDpOYU59Z2V0IG1vbnRoU2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0Lm1vbnRocygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLm1vbnRoLTFdOm51bGx9Z2V0IG1vbnRoTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQubW9udGhzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCB3ZWVrZGF5U2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0LndlZWtkYXlzKCJzaG9ydCIse2xvY09iajp0aGlzLmxvY30pW3RoaXMud2Vla2RheS0xXTpudWxsfWdldCB3ZWVrZGF5TG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQud2Vla2RheXMoImxvbmciLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgb2Zmc2V0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rdGhpcy5vOk5hTn1nZXQgb2Zmc2V0TmFtZVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLHtmb3JtYXQ6InNob3J0Iixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBvZmZzZXROYW1lTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBpc09mZnNldEZpeGVkKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUuaXNVbml2ZXJzYWw6bnVsbH1nZXQgaXNJbkRTVCgpe3JldHVybiB0aGlzLmlzT2Zmc2V0Rml4ZWQ/ITE6dGhpcy5vZmZzZXQ+dGhpcy5zZXQoe21vbnRoOjEsZGF5OjF9KS5vZmZzZXR8fHRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDo1fSkub2Zmc2V0fWdldFBvc3NpYmxlT2Zmc2V0cygpe2lmKCF0aGlzLmlzVmFsaWR8fHRoaXMuaXNPZmZzZXRGaXhlZClyZXR1cm5bdGhpc107Y29uc3QgZT04NjRlNSxuPTZlNCxyPWx0KHRoaXMuYykscz10aGlzLnpvbmUub2Zmc2V0KHItZSksaT10aGlzLnpvbmUub2Zmc2V0KHIrZSksYT10aGlzLnpvbmUub2Zmc2V0KHItcypuKSxvPXRoaXMuem9uZS5vZmZzZXQoci1pKm4pO2lmKGE9PT1vKXJldHVyblt0aGlzXTtjb25zdCBsPXItYSpuLHU9ci1vKm4sYz15dChsLGEpLGQ9eXQodSxvKTtyZXR1cm4gYy5ob3VyPT09ZC5ob3VyJiZjLm1pbnV0ZT09PWQubWludXRlJiZjLnNlY29uZD09PWQuc2Vjb25kJiZjLm1pbGxpc2Vjb25kPT09ZC5taWxsaXNlY29uZD9baGUodGhpcyx7dHM6bH0pLGhlKHRoaXMse3RzOnV9KV06W3RoaXNdfWdldCBpc0luTGVhcFllYXIoKXtyZXR1cm4gX2UodGhpcy55ZWFyKX1nZXQgZGF5c0luTW9udGgoKXtyZXR1cm4gb3QodGhpcy55ZWFyLHRoaXMubW9udGgpfWdldCBkYXlzSW5ZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD92ZSh0aGlzLnllYXIpOk5hTn1nZXQgd2Vla3NJbldlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLndlZWtZZWFyKTpOYU59Z2V0IHdlZWtzSW5Mb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLmxvY2FsV2Vla1llYXIsdGhpcy5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSk6TmFOfXJlc29sdmVkTG9jYWxlT3B0aW9ucyhlPXt9KXtjb25zdHtsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixjYWxlbmRhcjpzfT1OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7cmV0dXJue2xvY2FsZTpuLG51bWJlcmluZ1N5c3RlbTpyLG91dHB1dENhbGVuZGFyOnN9fXRvVVRDKGU9MCxuPXt9KXtyZXR1cm4gdGhpcy5zZXRab25lKHguaW5zdGFuY2UoZSksbil9dG9Mb2NhbCgpe3JldHVybiB0aGlzLnNldFpvbmUodi5kZWZhdWx0Wm9uZSl9c2V0Wm9uZShlLHtrZWVwTG9jYWxUaW1lOm49ITEsa2VlcENhbGVuZGFyVGltZTpyPSExfT17fSl7aWYoZT1uZShlLHYuZGVmYXVsdFpvbmUpLGUuZXF1YWxzKHRoaXMuem9uZSkpcmV0dXJuIHRoaXM7aWYoZS5pc1ZhbGlkKXtsZXQgcz10aGlzLnRzO2lmKG58fHIpe2NvbnN0IGk9ZS5vZmZzZXQodGhpcy50cyksYT10aGlzLnRvT2JqZWN0KCk7W3NdPWd0KGEsaSxlKX1yZXR1cm4gaGUodGhpcyx7dHM6cyx6b25lOmV9KX1lbHNlIHJldHVybiBnLmludmFsaWQobXQoZSkpfXJlY29uZmlndXJlKHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyfT17fSl7Y29uc3Qgcz10aGlzLmxvYy5jbG9uZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn0pO3JldHVybiBoZSh0aGlzLHtsb2M6c30pfXNldExvY2FsZShlKXtyZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7bG9jYWxlOmV9KX1zZXQoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPWN0KGUsc3MpLHttaW5EYXlzSW5GaXJzdFdlZWs6cixzdGFydE9mV2VlazpzfT15cihuLHRoaXMubG9jKSxpPSF5KG4ud2Vla1llYXIpfHwheShuLndlZWtOdW1iZXIpfHwheShuLndlZWtkYXkpLGE9IXkobi5vcmRpbmFsKSxvPSF5KG4ueWVhciksbD0heShuLm1vbnRoKXx8IXkobi5kYXkpLHU9b3x8bCxjPW4ud2Vla1llYXJ8fG4ud2Vla051bWJlcjtpZigodXx8YSkmJmMpdGhyb3cgbmV3IGtlKCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzIik7aWYobCYmYSl0aHJvdyBuZXcga2UoIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5Iik7bGV0IGQ7aT9kPWhyKHsuLi5pdCh0aGlzLmMscixzKSwuLi5ufSxyLHMpOnkobi5vcmRpbmFsKT8oZD17Li4udGhpcy50b09iamVjdCgpLC4uLm59LHkobi5kYXkpJiYoZC5kYXk9TWF0aC5taW4ob3QoZC55ZWFyLGQubW9udGgpLGQuZGF5KSkpOmQ9bXIoey4uLlJ0KHRoaXMuYyksLi4ubn0pO2NvbnN0W3AsaF09Z3QoZCx0aGlzLm8sdGhpcy56b25lKTtyZXR1cm4gaGUodGhpcyx7dHM6cCxvOmh9KX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIGhlKHRoaXMsZXModGhpcyxuKSl9bWludXMoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPVQuZnJvbUR1cmF0aW9uTGlrZShlKS5uZWdhdGUoKTtyZXR1cm4gaGUodGhpcyxlcyh0aGlzLG4pKX1zdGFydE9mKGUse3VzZUxvY2FsZVdlZWtzOm49ITF9PXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IHI9e30scz1ULm5vcm1hbGl6ZVVuaXQoZSk7c3dpdGNoKHMpe2Nhc2UieWVhcnMiOnIubW9udGg9MTtjYXNlInF1YXJ0ZXJzIjpjYXNlIm1vbnRocyI6ci5kYXk9MTtjYXNlIndlZWtzIjpjYXNlImRheXMiOnIuaG91cj0wO2Nhc2UiaG91cnMiOnIubWludXRlPTA7Y2FzZSJtaW51dGVzIjpyLnNlY29uZD0wO2Nhc2Uic2Vjb25kcyI6ci5taWxsaXNlY29uZD0wO2JyZWFrfWlmKHM9PT0id2Vla3MiKWlmKG4pe2NvbnN0IGk9dGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSx7d2Vla2RheTphfT10aGlzO2E8aSYmKHIud2Vla051bWJlcj10aGlzLndlZWtOdW1iZXItMSksci53ZWVrZGF5PWl9ZWxzZSByLndlZWtkYXk9MTtpZihzPT09InF1YXJ0ZXJzIil7Y29uc3QgaT1NYXRoLmNlaWwodGhpcy5tb250aC8zKTtyLm1vbnRoPShpLTEpKjMrMX1yZXR1cm4gdGhpcy5zZXQocil9ZW5kT2YoZSxuKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMucGx1cyh7W2VdOjF9KS5zdGFydE9mKGUsbikubWludXMoMSk6dGhpc310b0Zvcm1hdChlLG49e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MucmVkZWZhdWx0VG9FTihuKSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMsZSk6QnR9dG9Mb2NhbGVTdHJpbmcoZT1ldCxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP04uY3JlYXRlKHRoaXMubG9jLmNsb25lKG4pLGUpLmZvcm1hdERhdGVUaW1lKHRoaXMpOkJ0fXRvTG9jYWxlUGFydHMoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpOltdfXRvSVNPKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQiLHN1cHByZXNzU2Vjb25kczpuPSExLHN1cHByZXNzTWlsbGlzZWNvbmRzOnI9ITEsaW5jbHVkZU9mZnNldDpzPSEwLGV4dGVuZGVkWm9uZTppPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBhPWU9PT0iZXh0ZW5kZWQiO2xldCBvPVh0KHRoaXMsYSk7cmV0dXJuIG8rPSJUIixvKz10cyh0aGlzLGEsbixyLHMsaSksb310b0lTT0RhdGUoe2Zvcm1hdDplPSJleHRlbmRlZCJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1h0KHRoaXMsZT09PSJleHRlbmRlZCIpOm51bGx9dG9JU09XZWVrRGF0ZSgpe3JldHVybiBwdCh0aGlzLCJra2trLSdXJ1dXLWMiKX10b0lTT1RpbWUoe3N1cHByZXNzTWlsbGlzZWNvbmRzOmU9ITEsc3VwcHJlc3NTZWNvbmRzOm49ITEsaW5jbHVkZU9mZnNldDpyPSEwLGluY2x1ZGVQcmVmaXg6cz0hMSxleHRlbmRlZFpvbmU6aT0hMSxmb3JtYXQ6YT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8ocz8iVCI6IiIpK3RzKHRoaXMsYT09PSJleHRlbmRlZCIsbixlLHIsaSk6bnVsbH10b1JGQzI4MjIoKXtyZXR1cm4gcHQodGhpcywiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWloiLCExKX10b0hUVFAoKXtyZXR1cm4gcHQodGhpcy50b1VUQygpLCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnIil9dG9TUUxEYXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9YdCh0aGlzLCEwKTpudWxsfXRvU1FMVGltZSh7aW5jbHVkZU9mZnNldDplPSEwLGluY2x1ZGVab25lOm49ITEsaW5jbHVkZU9mZnNldFNwYWNlOnI9ITB9PXt9KXtsZXQgcz0iSEg6bW06c3MuU1NTIjtyZXR1cm4obnx8ZSkmJihyJiYocys9IiAiKSxuP3MrPSJ6IjplJiYocys9IlpaIikpLHB0KHRoaXMscywhMCl9dG9TUUwoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKGUpfWA6bnVsbH10b1N0cmluZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50b0lTTygpOkJ0fVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YERhdGVUaW1lIHsgdHM6ICR7dGhpcy50b0lTTygpfSwgem9uZTogJHt0aGlzLnpvbmUubmFtZX0sIGxvY2FsZTogJHt0aGlzLmxvY2FsZX0gfWA6YERhdGVUaW1lIHsgSW52YWxpZCwgcmVhc29uOiAke3RoaXMuaW52YWxpZFJlYXNvbn0gfWB9dmFsdWVPZigpe3JldHVybiB0aGlzLnRvTWlsbGlzKCl9dG9NaWxsaXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOfXRvU2Vjb25kcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50cy8xZTM6TmFOfXRvVW5peEludGVnZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP01hdGguZmxvb3IodGhpcy50cy8xZTMpOk5hTn10b0pTT04oKXtyZXR1cm4gdGhpcy50b0lTTygpfXRvQlNPTigpe3JldHVybiB0aGlzLnRvSlNEYXRlKCl9dG9PYmplY3QoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm57fTtjb25zdCBuPXsuLi50aGlzLmN9O3JldHVybiBlLmluY2x1ZGVDb25maWcmJihuLm91dHB1dENhbGVuZGFyPXRoaXMub3V0cHV0Q2FsZW5kYXIsbi5udW1iZXJpbmdTeXN0ZW09dGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtLG4ubG9jYWxlPXRoaXMubG9jLmxvY2FsZSksbn10b0pTRGF0ZSgpe3JldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQ/dGhpcy50czpOYU4pfWRpZmYoZSxuPSJtaWxsaXNlY29uZHMiLHI9e30pe2lmKCF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQpcmV0dXJuIFQuaW52YWxpZCgiY3JlYXRlZCBieSBkaWZmaW5nIGFuIGludmFsaWQgRGF0ZVRpbWUiKTtjb25zdCBzPXtsb2NhbGU6dGhpcy5sb2NhbGUsbnVtYmVyaW5nU3lzdGVtOnRoaXMubnVtYmVyaW5nU3lzdGVtLC4uLnJ9LGk9VG8obikubWFwKFQubm9ybWFsaXplVW5pdCksYT1lLnZhbHVlT2YoKT50aGlzLnZhbHVlT2YoKSxvPWE/dGhpczplLGw9YT9lOnRoaXMsdT1ibChvLGwsaSxzKTtyZXR1cm4gYT91Lm5lZ2F0ZSgpOnV9ZGlmZk5vdyhlPSJtaWxsaXNlY29uZHMiLG49e30pe3JldHVybiB0aGlzLmRpZmYoZy5ub3coKSxlLG4pfXVudGlsKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/Yi5mcm9tRGF0ZVRpbWVzKHRoaXMsZSk6dGhpc31oYXNTYW1lKGUsbixyKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiExO2NvbnN0IHM9ZS52YWx1ZU9mKCksaT10aGlzLnNldFpvbmUoZS56b25lLHtrZWVwTG9jYWxUaW1lOiEwfSk7cmV0dXJuIGkuc3RhcnRPZihuLHIpPD1zJiZzPD1pLmVuZE9mKG4scil9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQmJmUuaXNWYWxpZCYmdGhpcy52YWx1ZU9mKCk9PT1lLnZhbHVlT2YoKSYmdGhpcy56b25lLmVxdWFscyhlLnpvbmUpJiZ0aGlzLmxvYy5lcXVhbHMoZS5sb2MpfXRvUmVsYXRpdmUoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBuPWUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHI9ZS5wYWRkaW5nP3RoaXM8bj8tZS5wYWRkaW5nOmUucGFkZGluZzowO2xldCBzPVsieWVhcnMiLCJtb250aHMiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyJdLGk9ZS51bml0O3JldHVybiBBcnJheS5pc0FycmF5KGUudW5pdCkmJihzPWUudW5pdCxpPXZvaWQgMCksYXMobix0aGlzLnBsdXMociksey4uLmUsbnVtZXJpYzoiYWx3YXlzIix1bml0czpzLHVuaXQ6aX0pfXRvUmVsYXRpdmVDYWxlbmRhcihlPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2FzKGUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHRoaXMsey4uLmUsbnVtZXJpYzoiYXV0byIsdW5pdHM6WyJ5ZWFycyIsIm1vbnRocyIsImRheXMiXSxjYWxlbmRhcnk6ITB9KTpudWxsfXN0YXRpYyBtaW4oLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5taW4pfXN0YXRpYyBtYXgoLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5tYXgpfXN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbihlLG4scj17fSl7Y29uc3R7bG9jYWxlOnM9bnVsbCxudW1iZXJpbmdTeXN0ZW06aT1udWxsfT1yLGE9Ty5mcm9tT3B0cyh7bG9jYWxlOnMsbnVtYmVyaW5nU3lzdGVtOmksZGVmYXVsdFRvRU46ITB9KTtyZXR1cm4gQnIoYSxlLG4pfXN0YXRpYyBmcm9tU3RyaW5nRXhwbGFpbihlLG4scj17fSl7cmV0dXJuIGcuZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHIpfXN0YXRpYyBnZXQgREFURV9TSE9SVCgpe3JldHVybiBldH1zdGF0aWMgZ2V0IERBVEVfTUVEKCl7cmV0dXJuIFZufXN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIFlhfXN0YXRpYyBnZXQgREFURV9GVUxMKCl7cmV0dXJuIFdufXN0YXRpYyBnZXQgREFURV9IVUdFKCl7cmV0dXJuIExufXN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKXtyZXR1cm4gJG59c3RhdGljIGdldCBUSU1FX1dJVEhfU0VDT05EUygpe3JldHVybiBfbn1zdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gem59c3RhdGljIGdldCBUSU1FX1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4gUm59c3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpe3JldHVybiBabn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIFBufXN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpe3JldHVybiBVbn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCgpe3JldHVybiBIbn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCl7cmV0dXJuIGpufXN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIHFufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCl7cmV0dXJuIFlufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpe3JldHVybiBHbn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkoKXtyZXR1cm4gR2F9c3RhdGljIGdldCBEQVRFVElNRV9GVUxMKCl7cmV0dXJuIEpufXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gQm59c3RhdGljIGdldCBEQVRFVElNRV9IVUdFKCl7cmV0dXJuIFFufXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gS259fWZ1bmN0aW9uIEhlKHQpe2lmKGcuaXNEYXRlVGltZSh0KSlyZXR1cm4gdDtpZih0JiZ0LnZhbHVlT2YmJmNlKHQudmFsdWVPZigpKSlyZXR1cm4gZy5mcm9tSlNEYXRlKHQpO2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0IilyZXR1cm4gZy5mcm9tT2JqZWN0KHQpO3Rocm93IG5ldyBEKGBVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50OiAke3R9LCBvZiB0eXBlICR7dHlwZW9mIHR9YCl9ZnVuY3Rpb24gVWwoe2NvbGxlY3Rpb25zOnQsbHd3OmV9LHt0YWJsZUlkczpuLHRhYmxlQ29sdW1uSWRzOnIscmVsYXRpb25zaGlwSWRzOnMsaW5kZXhJZHM6aSxpbmRleENvbHVtbklkczphLG1lbW9JZHM6b30pe0EodCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLnJlbW92ZU1hbnkobiksQSh0KS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIikucmVtb3ZlTWFueShyKSxBKHQpLmNvbGxlY3Rpb24oInJlbGF0aW9uc2hpcEVudGl0aWVzIikucmVtb3ZlTWFueShzKSxBKHQpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKS5yZW1vdmVNYW55KGkpLEEodCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkoYSksQSh0KS5jb2xsZWN0aW9uKCJtZW1vRW50aXRpZXMiKS5yZW1vdmVNYW55KG8pLFsuLi5uLC4uLnIsLi4ucywuLi5pLC4uLmEsLi4ub10uZm9yRWFjaChsPT5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsbCkpfWNvbnN0IEhsPTMsamw9JChbInRhYmxlRW50aXRpZXMiLCJ0YWJsZUNvbHVtbkVudGl0aWVzIiwicmVsYXRpb25zaGlwRW50aXRpZXMiLCJpbmRleEVudGl0aWVzIiwiaW5kZXhDb2x1bW5FbnRpdGllcyIsIm1lbW9FbnRpdGllcyJdKTtjbGFzcyBxbHthc3luYyBydW4oZSl7Y29uc3Qgbj1KU09OLnBhcnNlKGUpLHI9JGEobikse2RvYzp7dGFibGVJZHM6cyxtZW1vSWRzOmksaW5kZXhJZHM6YSxyZWxhdGlvbnNoaXBJZHM6b30sY29sbGVjdGlvbnM6bCxsd3c6dX09cixjPSQocyksZD0kKGkpLHA9JChhKSxoPSQobyksaz1ZbChnLm5vdygpKSxQPUEobCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLE09QShsKS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIiksaj1BKGwpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKSxCPUEobCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLEZlPUEobCkuY29sbGVjdGlvbigicmVsYXRpb25zaGlwRW50aXRpZXMiKSx3dD1BKGwpLmNvbGxlY3Rpb24oIm1lbW9FbnRpdGllcyIpLHE9bmV3IFNldChQLnNlbGVjdEFsbCgpLmZpbHRlcihrKGMpKS5tYXAoKHtpZDptfSk9Pm0pKSxtZT1uZXcgU2V0LHllPW5ldyBTZXQoRmUuc2VsZWN0QWxsKCkuZmlsdGVyKGsoaCkpLm1hcCgoe2lkOm19KT0+bSkpLGllPW5ldyBTZXQoai5zZWxlY3RBbGwoKS5maWx0ZXIoayhwKSkubWFwKCh7aWQ6bX0pPT5tKSksUT1uZXcgU2V0LEs9bmV3IFNldCh3dC5zZWxlY3RBbGwoKS5maWx0ZXIoayhkKSkubWFwKCh7aWQ6bX0pPT5tKSk7TS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm19KT0+cS5oYXMobSkpLmZvckVhY2goKHtpZDptfSk9Pm1lLmFkZChtKSksRmUuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSxzdGFydDpZLGVuZDpqZX0pPT4heWUuaGFzKG0pJiYocS5oYXMoWS50YWJsZUlkKXx8cS5oYXMoamUudGFibGVJZCkpKS5mb3JFYWNoKCh7aWQ6bX0pPT55ZS5hZGQobSkpLGouc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSx0YWJsZUlkOll9KT0+IWllLmhhcyhtKSYmcS5oYXMoWSkpLmZvckVhY2goKHtpZDptfSk9PmllLmFkZChtKSksQi5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpbmRleElkOm19KT0+aWUuaGFzKG0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5RLmFkZChtKSksVWwocix7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119KTtjb25zdCBUdD0kKFAuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksSmw9JChNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLGxzPSQoai5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxCbD0kKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksUWw9JChGZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxLbD0kKHd0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBNLnNlbGVjdEFsbCgpLmZpbHRlcigoe3RhYmxlSWQ6bSxpZDpZLG1ldGE6amV9KT0+IVR0KG0pJiZrKCgpPT4hMSkoe2lkOlksbWV0YTpqZX0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5tZS5hZGQobSkpLEIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpqZX0pPT4hbHMobSkmJmsoKCk9PiExKSh7aWQ6WSxtZXRhOmplfSkpLmZvckVhY2goKHtpZDptfSk9PlEuYWRkKG0pKSxPYmplY3QuZW50cmllcyh1KS5mb3JFYWNoKChbbSxbWV1dKT0+e2lmKGpsKFkpKXN3aXRjaChZKXtjYXNlInRhYmxlRW50aXRpZXMiOiFUdChtKSYmcS5hZGQobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohSmwobSkmJm1lLmFkZChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohUWwobSkmJnllLmFkZChtKTticmVhaztjYXNlImluZGV4RW50aXRpZXMiOiFscyhtKSYmaWUuYWRkKG0pO2JyZWFrO2Nhc2UiaW5kZXhDb2x1bW5FbnRpdGllcyI6IUJsKG0pJiZRLmFkZChtKTticmVhaztjYXNlIm1lbW9FbnRpdGllcyI6IUtsKG0pJiZLLmFkZChtKTticmVha319KSx7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119fX1jb25zdCBZbD10PT5lPT4oe2lkOm4sbWV0YTpyfSk9PntpZihlKG4pKXJldHVybiExO2NvbnN0IHM9TWF0aC5mbG9vcih0LmRpZmYoZy5mcm9tTWlsbGlzKHIudXBkYXRlQXQpLCJkYXlzIikudG9PYmplY3QoKS5kYXlzPz8wKTtyZXR1cm4gSGw8c30sR2w9bmV3IHFsO3NlbGYub25jb25uZWN0PXQ9Pntjb25zdCBlPXQucG9ydHNbMF07T3QoR2wsZSl9fSkoKTsK";
|
|
26555
|
+
const fR = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGVuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLHVzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGNzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxTdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIikscWU9U3ltYm9sKCJDb21saW5rLnRocm93biIpLHRuPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLGZzPXtjYW5IYW5kbGU6dD0+dG4odCkmJnRbZW5dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gT3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLHlzKHQpfX0sZHM9e2NhbkhhbmRsZTp0PT50bih0KSYmcWUgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LG5uPW5ldyBNYXAoW1sicHJveHkiLGZzXSxbInRocm93Iixkc11dKTtmdW5jdGlvbiBocyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFocyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSxsPShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGFlKTtsZXQgdTt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgocCxoKT0+cFtoXSx0KSxkPW8ucmVkdWNlKChwLGgpPT5wW2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6dT1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1hZShzLmRhdGEudmFsdWUpLHU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6dT1kLmFwcGx5KGMsbCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCBwPW5ldyBkKC4uLmwpO3U9U3MocCl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnAscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO090KHQsaCksdT1UcyhwLFtwXSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjp1PXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7dT17dmFsdWU6YyxbcWVdOjB9fVByb21pc2UucmVzb2x2ZSh1KS5jYXRjaChjPT4oe3ZhbHVlOmMsW3FlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2QscF09QmUoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSxwKSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxybihlKSxTdCBpbiB0JiZ0eXBlb2YgdFtTdF09PSJmdW5jdGlvbiImJnRbU3RdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2QscF09QmUoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtxZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSkscCl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBtcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBybih0KXttcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIHlzKHQsZSl7cmV0dXJuIGt0KHQsW10sZSl9ZnVuY3Rpb24gWWUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHNuKHQpe3JldHVybiBnZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9Pntybih0KX0pfWNvbnN0IEdlPW5ldyBXZWFrTWFwLEplPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KEdlLmdldCh0KXx8MCktMTtHZS5zZXQodCxlKSxlPT09MCYmc24odCl9KTtmdW5jdGlvbiBncyh0LGUpe2NvbnN0IG49KEdlLmdldChlKXx8MCkrMTtHZS5zZXQoZSxuKSxKZSYmSmUucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIHBzKHQpe0plJiZKZS51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uIGt0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWWUociksYT09PWNzKXJldHVybigpPT57cHMocyksc24odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPWdlKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcChsPT5sLnRvU3RyaW5nKCkpfSkudGhlbihhZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiBrdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtZZShyKTtjb25zdFtsLHVdPUJlKG8pO3JldHVybiBnZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6bH0sdSkudGhlbihhZSl9LGFwcGx5KGksYSxvKXtZZShyKTtjb25zdCBsPWVbZS5sZW5ndGgtMV07aWYobD09PXVzKXJldHVybiBnZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGFlKTtpZihsPT09ImJpbmQiKXJldHVybiBrdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W3UsY109YW4obyk7cmV0dXJuIGdlKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OnV9LGMpLnRoZW4oYWUpfSxjb25zdHJ1Y3QoaSxhKXtZZShyKTtjb25zdFtvLGxdPWFuKGEpO3JldHVybiBnZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAodT0+dS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sbCkudGhlbihhZSl9fSk7cmV0dXJuIGdzKHMsdCksc31mdW5jdGlvbiB3cyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBhbih0KXtjb25zdCBlPXQubWFwKEJlKTtyZXR1cm5bZS5tYXAobj0+blswXSksd3MoZS5tYXAobj0+blsxXSkpXX1jb25zdCBvbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBUcyh0LGUpe3JldHVybiBvbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFNzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1tlbl06ITB9KX1mdW5jdGlvbiBCZSh0KXtmb3IoY29uc3RbZSxuXW9mIG5uKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxvbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBhZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBubi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIGdlKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9T3MoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gT3MoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfXZhciBrcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsYnM9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixidD1rc3x8YnN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCkscGU9YnQuU3ltYm9sLGxuPU9iamVjdC5wcm90b3R5cGUsdnM9bG4uaGFzT3duUHJvcGVydHksSXM9bG4udG9TdHJpbmcsQWU9cGU/cGUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIEVzKHQpe3ZhciBlPXZzLmNhbGwodCxBZSksbj10W0FlXTt0cnl7dFtBZV09dm9pZCAwO3ZhciByPSEwfWNhdGNoe312YXIgcz1Jcy5jYWxsKHQpO3JldHVybiByJiYoZT90W0FlXT1uOmRlbGV0ZSB0W0FlXSksc312YXIgTnM9T2JqZWN0LnByb3RvdHlwZSxNcz1Ocy50b1N0cmluZztmdW5jdGlvbiB4cyh0KXtyZXR1cm4gTXMuY2FsbCh0KX12YXIgRHM9IltvYmplY3QgTnVsbF0iLENzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHVuPXBlP3BlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBjbih0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP0NzOkRzOnVuJiZ1biBpbiBPYmplY3QodCk/RXModCk6eHModCl9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In1mdW5jdGlvbiBGcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxzPUFycmF5KHIpOysrbjxyOylzW25dPWUodFtuXSxuLHQpO3JldHVybiBzfXZhciBBcz1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGZuKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGRuKHQpe3JldHVybiB0fXZhciBWcz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsV3M9IltvYmplY3QgRnVuY3Rpb25dIixMcz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCRzPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gaG4odCl7aWYoIWZuKHQpKXJldHVybiExO3ZhciBlPWNuKHQpO3JldHVybiBlPT1Xc3x8ZT09THN8fGU9PVZzfHxlPT0kc312YXIgSXQ9YnRbIl9fY29yZS1qc19zaGFyZWRfXyJdLG1uPWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhJdCYmSXQua2V5cyYmSXQua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBfcyh0KXtyZXR1cm4hIW1uJiZtbiBpbiB0fXZhciB6cz1GdW5jdGlvbi5wcm90b3R5cGUsUnM9enMudG9TdHJpbmc7ZnVuY3Rpb24gWnModCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBScy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgUHM9L1tcXF4kLiorPygpW1xde318XS9nLFVzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEhzPUZ1bmN0aW9uLnByb3RvdHlwZSxqcz1PYmplY3QucHJvdG90eXBlLHFzPUhzLnRvU3RyaW5nLFlzPWpzLmhhc093blByb3BlcnR5LEdzPVJlZ0V4cCgiXiIrcXMuY2FsbChZcykucmVwbGFjZShQcywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiBKcyh0KXtpZighZm4odCl8fF9zKHQpKXJldHVybiExO3ZhciBlPWhuKHQpP0dzOlVzO3JldHVybiBlLnRlc3QoWnModCkpfWZ1bmN0aW9uIEJzKHQsZSl7cmV0dXJuIHQ9PW51bGw/dm9pZCAwOnRbZV19ZnVuY3Rpb24gRXQodCxlKXt2YXIgbj1Ccyh0LGUpO3JldHVybiBKcyhuKT9uOnZvaWQgMH1mdW5jdGlvbiBRcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfXZhciBLcz04MDAsWHM9MTYsZWk9RGF0ZS5ub3c7ZnVuY3Rpb24gdGkodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZWkoKSxzPVhzLShyLW4pO2lmKG49cixzPjApe2lmKCsrZT49S3MpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZnVuY3Rpb24gbmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciB5bj1mdW5jdGlvbigpe3RyeXt2YXIgdD1FdChPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0oKSxyaT15bj9mdW5jdGlvbih0LGUpe3JldHVybiB5bih0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm5pKGUpLHdyaXRhYmxlOiEwfSl9OmRuLHNpPXJpLGlpPXRpKHNpKTtmdW5jdGlvbiBhaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBvaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gbGkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gdWkodCxlLG4pe3JldHVybiBlPT09ZT9saSh0LGUsbik6YWkodCxvaSxuKX1mdW5jdGlvbiBjaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJnVpKHQsZSwwKT4tMX1mdW5jdGlvbiBmaSh0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBnbj1NYXRoLm1heDtmdW5jdGlvbiBkaSh0LGUsbil7cmV0dXJuIGU9Z24oZT09PXZvaWQgMD90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLHM9LTEsaT1nbihyLmxlbmd0aC1lLDApLGE9QXJyYXkoaSk7KytzPGk7KWFbc109cltlK3NdO3M9LTE7Zm9yKHZhciBvPUFycmF5KGUrMSk7KytzPGU7KW9bc109cltzXTtyZXR1cm4gb1tlXT1uKGEpLFFzKHQsdGhpcyxvKX19ZnVuY3Rpb24gaGkodCxlKXtyZXR1cm4gaWkoZGkodCxlLGRuKSx0KyIiKX12YXIgbWk9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiB5aSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PW1pfWZ1bmN0aW9uIGdpKHQpe3JldHVybiB0IT1udWxsJiZ5aSh0Lmxlbmd0aCkmJiFobih0KX12YXIgcGk9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gcG4odCl7cmV0dXJuIHZ0KHQpJiZjbih0KT09cGl9dmFyIHduPU9iamVjdC5wcm90b3R5cGUsd2k9d24uaGFzT3duUHJvcGVydHksVGk9d24ucHJvcGVydHlJc0VudW1lcmFibGUsU2k9cG4oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9wbjpmdW5jdGlvbih0KXtyZXR1cm4gdnQodCkmJndpLmNhbGwodCwiY2FsbGVlIikmJiFUaS5jYWxsKHQsImNhbGxlZSIpfTtmdW5jdGlvbiBPaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBWZT1FdChPYmplY3QsImNyZWF0ZSIpO2Z1bmN0aW9uIGtpKCl7dGhpcy5fX2RhdGFfXz1WZT9WZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgdmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLElpPU9iamVjdC5wcm90b3R5cGUsRWk9SWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTmkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihWZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXZpP3ZvaWQgMDpufXJldHVybiBFaS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIE1pPU9iamVjdC5wcm90b3R5cGUseGk9TWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gRGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gVmU/ZVt0XSE9PXZvaWQgMDp4aS5jYWxsKGUsdCl9dmFyIENpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBGaSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09VmUmJmU9PT12b2lkIDA/Q2k6ZSx0aGlzfWZ1bmN0aW9uIG9lKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fW9lLnByb3RvdHlwZS5jbGVhcj1raSxvZS5wcm90b3R5cGUuZGVsZXRlPWJpLG9lLnByb3RvdHlwZS5nZXQ9Tmksb2UucHJvdG90eXBlLmhhcz1EaSxvZS5wcm90b3R5cGUuc2V0PUZpO2Z1bmN0aW9uIEFpKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKGZpKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIFZpPUFycmF5LnByb3RvdHlwZSxXaT1WaS5zcGxpY2U7ZnVuY3Rpb24gTGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVFlKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpXaS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiAkaSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49UWUoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIF9pKHQpe3JldHVybiBRZSh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIHppKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPVFlKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gd2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19d2UucHJvdG90eXBlLmNsZWFyPUFpLHdlLnByb3RvdHlwZS5kZWxldGU9TGksd2UucHJvdG90eXBlLmdldD0kaSx3ZS5wcm90b3R5cGUuaGFzPV9pLHdlLnByb3RvdHlwZS5zZXQ9emk7dmFyIFJpPUV0KGJ0LCJNYXAiKTtmdW5jdGlvbiBaaSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IG9lLG1hcDpuZXcoUml8fHdlKSxzdHJpbmc6bmV3IG9lfX1mdW5jdGlvbiBQaSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBLZSh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIFBpKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVWkodCl7dmFyIGU9S2UodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gS2UodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gamkodCl7cmV0dXJuIEtlKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIHFpKHQsZSl7dmFyIG49S2UodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1UZS5wcm90b3R5cGUuY2xlYXI9WmksVGUucHJvdG90eXBlLmRlbGV0ZT1VaSxUZS5wcm90b3R5cGUuZ2V0PUhpLFRlLnByb3RvdHlwZS5oYXM9amksVGUucHJvdG90eXBlLnNldD1xaTtmdW5jdGlvbiBZaSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLHM9dC5sZW5ndGg7KytuPHI7KXRbcytuXT1lW25dO3JldHVybiB0fXZhciBUbj1wZT9wZS5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEdpKHQpe3JldHVybiBBcyh0KXx8U2kodCl8fCEhKFRuJiZ0JiZ0W1RuXSl9ZnVuY3Rpb24gU24odCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1HaSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP1NuKG8sZS0xLG4scixzKTpZaShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc312YXIgSmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIEJpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LEppKSx0aGlzfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX1mdW5jdGlvbiBYZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgVGU7KytlPG47KXRoaXMuYWRkKHRbZV0pfVhlLnByb3RvdHlwZS5hZGQ9WGUucHJvdG90eXBlLnB1c2g9QmksWGUucHJvdG90eXBlLmhhcz1RaTtmdW5jdGlvbiBLaSh0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdnQodCkmJmdpKHQpfWZ1bmN0aW9uIFhpKHQsZSxuKXtmb3IodmFyIHI9LTEscz10PT1udWxsPzA6dC5sZW5ndGg7KytyPHM7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgZWE9MjAwO2Z1bmN0aW9uIHRhKHQsZSxuLHIpe3ZhciBzPS0xLGk9Y2ksYT0hMCxvPXQubGVuZ3RoLGw9W10sdT1lLmxlbmd0aDtpZighbylyZXR1cm4gbDtuJiYoZT1GcyhlLE9pKG4pKSkscj8oaT1YaSxhPSExKTplLmxlbmd0aD49ZWEmJihpPUtpLGE9ITEsZT1uZXcgWGUoZSkpO2U6Zm9yKDsrK3M8bzspe3ZhciBjPXRbc10sZD1uPT1udWxsP2M6bihjKTtpZihjPXJ8fGMhPT0wP2M6MCxhJiZkPT09ZCl7Zm9yKHZhciBwPXU7cC0tOylpZihlW3BdPT09ZCljb250aW51ZSBlO2wucHVzaChjKX1lbHNlIGkoZSxkLHIpfHxsLnB1c2goYyl9cmV0dXJuIGx9dmFyIG5hPWhpKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9uKHQpP3RhKHQsU24oZSwxLE9uLCEwKSk6W119KTtmdW5jdGlvbiAkKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9Y29uc3QgV2U9dD0+ZT0+dHlwZW9mIGU9PT10LHJhPVdlKCJvYmplY3QiKSxOdD1XZSgiYm9vbGVhbiIpLEU9V2UoIm51bWJlciIpLEY9V2UoInN0cmluZyIpLHNhPVdlKCJ1bmRlZmluZWQiKSxrbj10PT50PT09bnVsbCxHPXQ9PmtuKHQpfHxzYSh0KSx7aXNBcnJheTpYfT1BcnJheSxVPXQ9PnJhKHQpJiYha24odCkmJiFYKHQpOygodCxlLG4pPT57bGV0IHI9KDI8PE1hdGgubG9nKHQubGVuZ3RoLTEpL01hdGguTE4yKS0xLHM9LX4oMS42KnIqZS90Lmxlbmd0aCk7cmV0dXJuKGk9ZSk9PntsZXQgYT0iIjtmb3IoOzspe2xldCBvPW4ocyksbD1zO2Zvcig7bC0tOylpZihhKz10W29bbF0mcl18fCIiLGEubGVuZ3RoPT09aSlyZXR1cm4gYX19fSkoInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QiLDIxLHQ9PntsZXQgZT1nbG9iYWxUaGlzLmNyeXB0bztyZXR1cm4gZT09PXZvaWQgMCYmKGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKS53ZWJjcnlwdG8pLGUuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKX0pO2NvbnN0IE10PSh0LGUpPT5uPT5NYXRoLm1pbihNYXRoLm1heChuLHQpLGUpOy8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgRnJpIEZlYiAyOCAyMDI1CiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiB3KHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9PkUoZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gU2UoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gT2UodCxlKXtjb25zdCBuPXcoRSx0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBpYT0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIGFhKHQpe2NvbnN0IGU9aWEoKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXcoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgb2E9KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBsYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9b2EoKSxzPXcoRixyLG4pLGk9dyhOdCxyLG4pLGE9dyhYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBibj17QVNDOjEsREVTQzoyfSx1YT1PYmplY3QudmFsdWVzKGJuKSxjYT0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpibi5BU0MsbWV0YTpTZSgpfSk7ZnVuY3Rpb24gZmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPWNhKCkscz13KEYscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHcoSCh1YSkscixuKSgib3JkZXJUeXBlIiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgZGE9KCk9Pih7fSk7ZnVuY3Rpb24gaGEodCl7Y29uc3QgZT1kYSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihGKHMpJiZFKGkpJiZFKGEpJiZVKG8pKXtjb25zdCBsPXt9LHU9dyhFLGwsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaCh1KSxlW25dPVtzLGksYSxsXX19cmV0dXJuIGV9Y29uc3QgbWE9KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOlNlKCl9KTtmdW5jdGlvbiB5YSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9bWEoKSxzPXcoRixyLG4pLGk9dyhFLHIudWksbi51aSksYT13KEYsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0IiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qgdm49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSxnYT1PYmplY3QudmFsdWVzKHZuKSxJbj17cmluZzoxLGRhc2g6Mn0scGE9T2JqZWN0LnZhbHVlcyhJbikseHQ9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSxFbj1PYmplY3QudmFsdWVzKHh0KSx3YT0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOnZuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTpJbi5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjp4dC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246eHQuYm90dG9tfSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBUYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9d2EoKSxzPXcoRixyLG4pLGk9dyhOdCxyLG4pLGE9dyhFLHIuc3RhcnQsbi5zdGFydCksbz13KEYsci5zdGFydCxuLnN0YXJ0KSxsPXcoRSxyLmVuZCxuLmVuZCksdT13KEYsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSx3KEgoZ2EpLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSx3KEgocGEpLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHcoSChFbiksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIiksdyhYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLHUoInRhYmxlSWQiKSxsKCJ4IiksbCgieSIpLHcoSChFbiksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSx3KFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBTYT17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LGxlPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxObj1PYmplY3QudmFsdWVzKGVlKSxNbj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sT2E9T2JqZWN0LnZhbHVlcyhNbikseG49e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LGthPU9iamVjdC52YWx1ZXMoeG4pLER0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxEbj1PYmplY3QudmFsdWVzKER0KSxDbj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxiYT1PYmplY3QudmFsdWVzKENuKSx2YT0uMSxJYT0xLEVhPTJlMyxOYT0yZTQsTWE9bGUudGFibGVDb21tZW50fGxlLmNvbHVtbkNvbW1lbnR8bGUuY29sdW1uRGF0YVR5cGV8bGUuY29sdW1uRGVmYXVsdHxsZS5jb2x1bW5QcmltYXJ5S2V5fGxlLmNvbHVtbk5vdE51bGx8bGUucmVsYXRpb25zaGlwLHhhPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93Ok1hLGRhdGFiYXNlOk1uLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOlNhLkVSRCxsYW5ndWFnZTp4bi5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6RHQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpEdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6Q24ubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTEsaWdub3JlU2F2ZVNldHRpbmdzOjB9KSxGbj1NdChFYSxOYSksRGE9TXQodmEsSWEpLENhPU10KDYwLDIwMCk7ZnVuY3Rpb24gRmEodCl7Y29uc3QgZT14YSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49dyhFLGUsdCkscj13KEYsZSx0KSxzPXcoTnQsZSx0KTtyZXR1cm4gRSh0LndpZHRoKSYmKGUud2lkdGg9Rm4odC53aWR0aCkpLEUodC5oZWlnaHQpJiYoZS5oZWlnaHQ9Rm4odC5oZWlnaHQpKSxFKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPURhKHQuem9vbUxldmVsKSksRSh0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1DYSh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IiksbigiaWdub3JlU2F2ZVNldHRpbmdzIikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHcoSChPYSksZSx0KSgiZGF0YWJhc2UiKSx3KEgoa2EpLGUsdCkoImxhbmd1YWdlIiksdyhIKERuKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIiksdyhIKERuKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHcoSChiYSksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZObi5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmbmEoTm4sdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBBYT0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gVmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUFhKCkscz13KEYscixuKSxpPXcoWCxyLG4pLGE9dyhFLHIudWksbi51aSksbz13KEYsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLE9lKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFdhPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gTGEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVdhKCkscz13KEYscixuKSxpPXcoRSxyLG4pLGE9dyhFLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiAkYSh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LGw9RmEoby5zZXR0aW5ncyksdT1hYShvLmRvYyksYz1oYShvLmx3dyksZD1WYSgoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSxwPUxhKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9VGEoKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLGs9bGEoKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksUD1mYSgoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPXlhKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJueyRzY2hlbWE6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kaW5ldWcvZXJkLWVkaXRvci9tYWluL2pzb24tc2NoZW1hL3NjaGVtYS5qc29uIix2ZXJzaW9uOiIzLjAuMCIsc2V0dGluZ3M6bCxkb2M6dSxjb2xsZWN0aW9uczp7dGFibGVFbnRpdGllczpkLHRhYmxlQ29sdW1uRW50aXRpZXM6cCxyZWxhdGlvbnNoaXBFbnRpdGllczpoLGluZGV4RW50aXRpZXM6ayxpbmRleENvbHVtbkVudGl0aWVzOlAsbWVtb0VudGl0aWVzOk19LGx3dzpjfX1mdW5jdGlvbiBfYSh0KXtyZXR1cm5bdCwtMSwtMSx7fV19ZnVuY3Rpb24gQ3QodCxlLG4pe3JldHVybiB0W2VdfHwodFtlXT1fYShuKSx0W2VdKX1mdW5jdGlvbiB6YSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsxXSxvPWlbMl07YTxlJiYoaVsxXT1lKSxvPGUmJnMoKX1mdW5jdGlvbiBSYSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsyXSxvPWlbMV07YTxlJiYoaVsyXT1lKSxvPD1lJiZzKCl9ZnVuY3Rpb24gWmEodCxlLG4scixzLGkpe2NvbnN0IGE9Q3QodCxuLHIpOyhhWzNdW3NdPz8tMSk8PWUmJihhWzNdW3NdPWUsaSgpKX1jbGFzcyBQYXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbnMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9Y29sbGVjdGlvbihlKXtyZXR1cm4gbmV3IFVhKHRoaXMuY29sbGVjdGlvbnNbZV0sZSl9fWNsYXNzIFVhe2NvbnN0cnVjdG9yKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb25LZXkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSl9c2VsZWN0QnlJZChlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2VdfXNlbGVjdEJ5SWRzKGUpe3JldHVybiBlLmxlbmd0aCxlLm1hcChuPT50aGlzLnNlbGVjdEJ5SWQobikpLmZpbHRlcihCb29sZWFuKX1zZWxlY3RFbnRpdGllcygpe3JldHVybiB0aGlzLmNvbGxlY3Rpb259c2VsZWN0QWxsKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb2xsZWN0aW9uKX1zZXRPbmUoZSl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbltlLmlkXT1lLHRoaXN9c2V0TWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMuc2V0T25lKG4pKSx0aGlzfXNldEFsbChlKXtyZXR1cm4gdGhpcy5yZW1vdmVBbGwoKSx0aGlzLnNldE1hbnkoZSksdGhpc31hZGRPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlLmlkKT90aGlzOih0aGlzLnNldE9uZShlKSx0aGlzKX1hZGRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5hZGRPbmUobikpLHRoaXN9cmVtb3ZlT25lKGUpe3JldHVybiB0aGlzLnNlbGVjdEJ5SWQoZSkmJlJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5jb2xsZWN0aW9uLGUpLHRoaXN9cmVtb3ZlTWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMucmVtb3ZlT25lKG4pKSx0aGlzfXJlbW92ZUFsbCgpe3JldHVybiB0aGlzLmNvbGxlY3Rpb249e30sdGhpc311cGRhdGVPbmUoZSxuKXtjb25zdCByPXRoaXMuc2VsZWN0QnlJZChlKTtyZXR1cm4gciYmKG4ociksci5tZXRhLnVwZGF0ZUF0PURhdGUubm93KCkpLHRoaXN9dXBkYXRlTWFueShlLG4pe3JldHVybiBlLmZvckVhY2gocj0+dGhpcy51cGRhdGVPbmUocixuKSksdGhpc31nZXRPckNyZWF0ZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO2lmKHIpcmV0dXJuIHI7Y29uc3Qgcz1uKGUpO3JldHVybiB0aGlzLnNldE9uZShzKSx0aGlzLnNlbGVjdEJ5SWQoZSl9YWRkT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIHphKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlbW92ZU9wZXJhdG9yKGUsbixyLHMpe3JldHVybiBSYShlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyksdGhpc31yZXBsYWNlT3BlcmF0b3IoZSxuLHIscyxpKXtyZXR1cm4gWmEoZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMsaSksdGhpc319Y29uc3QgQT10PT5uZXcgUGEodCk7Y2xhc3MgdWUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgSGEgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBqYSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHFhIGV4dGVuZHMgdWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3Mga2UgZXh0ZW5kcyB1ZXt9Y2xhc3MgQW4gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgRCBleHRlbmRzIHVle31jbGFzcyB0ZSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsXz0ic2hvcnQiLEM9ImxvbmciLGV0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sVm49e3llYXI6Zixtb250aDpfLGRheTpmfSxZYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpffSxXbj17eWVhcjpmLG1vbnRoOkMsZGF5OmZ9LExuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkN9LCRuPXtob3VyOmYsbWludXRlOmZ9LF9uPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHpuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOl99LFJuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkN9LFpuPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxQbj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sVW49e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOl99LEhuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpDfSxqbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxxbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxZbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxHbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxHYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpfLGhvdXI6ZixtaW51dGU6Zn0sSm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6X30sQm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6X30sUW49e3llYXI6Zixtb250aDpDLGRheTpmLHdlZWtkYXk6Qyxob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkN9LEtuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkMsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpDfTtjbGFzcyBMZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBGdD1udWxsO2NsYXNzIHR0IGV4dGVuZHMgTGV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBGdD09PW51bGwmJihGdD1uZXcgdHQpLEZ0fWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIGtyKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IG50PXt9O2Z1bmN0aW9uIEphKHQpe3JldHVybiBudFt0XXx8KG50W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxudFt0XX1jb25zdCBCYT17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBRYSh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyxsLHUsY109cjtyZXR1cm5bYSxzLGksbyxsLHUsY119ZnVuY3Rpb24gS2EodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPUJhW2ldO2k9PT0iZXJhIj9yW29dPWE6eShvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCBydD17fTtjbGFzcyBKIGV4dGVuZHMgTGV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gcnRbZV18fChydFtlXT1uZXcgSihlKSkscnRbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXtydD17fSxudD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4ga3IoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPUphKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sbCx1LGNdPXIuZm9ybWF0VG9QYXJ0cz9LYShyLG4pOlFhKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCBwPWx0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOmw9PT0yND8wOmwsbWludXRlOnUsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IGs9aCUxZTM7cmV0dXJuIGgtPWs+PTA/azoxZTMraywocC1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBYbj17fTtmdW5jdGlvbiBYYSh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVhuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksWG5bbl09cikscn1sZXQgQXQ9e307ZnVuY3Rpb24gVnQodCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj1BdFtuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSxBdFtuXT1yKSxyfWxldCBXdD17fTtmdW5jdGlvbiBlbyh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVd0W25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxXdFtuXT1yKSxyfWxldCBMdD17fTtmdW5jdGlvbiB0byh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPUx0W3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxMdFtzXT1pKSxpfWxldCAkZT1udWxsO2Z1bmN0aW9uIG5vKCl7cmV0dXJuICRlfHwoJGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsJGUpfWxldCBlcj17fTtmdW5jdGlvbiBybyh0KXtsZXQgZT1lclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxlclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIHNvKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPVZ0KHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCBsPXQuc3Vic3RyaW5nKDAsbik7cj1WdChsKS5yZXNvbHZlZE9wdGlvbnMoKSxzPWx9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBpbyh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIGFvKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPWcudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb28odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1nLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiBzdCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyB1b3tjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPWVvKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6VXQoZSwzKTtyZXR1cm4gSShuLHRoaXMucGFkVG8pfX19Y2xhc3MgY297Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9VnQobixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgZm97Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZ3cigpJiYodGhpcy5ydGY9dG8oZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOkZvKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBobz17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIE97c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBPLmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fHYuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6bm8oKSksbD1ufHx2LmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sdT1yfHx2LmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPVp0KHMpfHx2LmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBPKG8sbCx1LGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXskZT1udWxsLEF0PXt9LFd0PXt9LEx0PXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIE8uY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLGxdPXNvKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fGx8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9aW8odGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPWxvKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6Ty5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLFp0KGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiBzdCh0aGlzLGUsSXIsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPWFvKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gc3QodGhpcyxlLE1yLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1vbyhpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gc3QodGhpcyx2b2lkIDAsKCk9PnhyLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W2cudXRjKDIwMTYsMTEsMTMsOSksZy51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHN0KHRoaXMsZSxEciwoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W2cudXRjKC00MCwxLDEpLGcudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgdW8odGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IGNvKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IGZvKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFhhKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6VHIoKT9ybyh0aGlzLmxvY2FsZSk6aG99Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0ICR0PW51bGw7Y2xhc3MgeCBleHRlbmRzIExle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gJHQ9PT1udWxsJiYoJHQ9bmV3IHgoMCkpLCR0fXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/eC51dGNJbnN0YW5jZTpuZXcgeChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IHgodXQoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke1JlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7UmUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIFJlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBtbyBleHRlbmRzIExle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZih5KHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgTGUpcmV0dXJuIHQ7aWYocG8odCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj90dC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij94LnV0Y0luc3RhbmNlOngucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP3guaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBtbyh0KX1sZXQgdHI9KCk9PkRhdGUubm93KCksbnI9InN5c3RlbSIscnI9bnVsbCxzcj1udWxsLGlyPW51bGwsYXI9NjAsb3IsbHI9bnVsbDtjbGFzcyB2e3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIHRyfXN0YXRpYyBzZXQgbm93KGUpe3RyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtucj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUobnIsdHQuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiBycn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7cnI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gc3J9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe3NyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gaXJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7aXI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gbHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe2xyPVp0KGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIGFyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe2FyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gb3J9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtvcj1lfXN0YXRpYyByZXNldENhY2hlcygpe08ucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyB6e2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QgdXI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sY3I9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVih0LGUpe3JldHVybiBuZXcgeigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIF90KHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gZnIodCxlLG4pe3JldHVybiBuKyhfZSh0KT9jcjp1cilbZS0xXX1mdW5jdGlvbiBkcih0LGUpe2NvbnN0IG49X2UodCk/Y3I6dXIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHp0KHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gaXQodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPWZyKHIscyxpKSxvPXp0KF90KHIscyxpKSxuKTtsZXQgbD1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksdTtyZXR1cm4gbDwxPyh1PXItMSxsPXplKHUsZSxuKSk6bD56ZShyLGUsbik/KHU9cisxLGw9MSk6dT1yLHt3ZWVrWWVhcjp1LHdlZWtOdW1iZXI6bCx3ZWVrZGF5Om8sLi4uZnQodCl9fWZ1bmN0aW9uIGhyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9enQoX3QociwxLGUpLG4pLG89dmUocik7bGV0IGw9cyo3K2ktYS03K2UsdTtsPDE/KHU9ci0xLGwrPXZlKHUpKTpsPm8/KHU9cisxLGwtPXZlKHIpKTp1PXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09ZHIodSxsKTtyZXR1cm57eWVhcjp1LG1vbnRoOmMsZGF5OmQsLi4uZnQodCl9fWZ1bmN0aW9uIFJ0KHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9ZnIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLmZ0KHQpfX1mdW5jdGlvbiBtcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1kcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5mdCh0KX19ZnVuY3Rpb24geXIodCxlKXtpZigheSh0LmxvY2FsV2Vla2RheSl8fCF5KHQubG9jYWxXZWVrTnVtYmVyKXx8IXkodC5sb2NhbFdlZWtZZWFyKSl7aWYoIXkodC53ZWVrZGF5KXx8IXkodC53ZWVrTnVtYmVyKXx8IXkodC53ZWVrWWVhcikpdGhyb3cgbmV3IGtlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiB5KHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSkseSh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLHkodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24geW8odCxlPTQsbj0xKXtjb25zdCByPWF0KHQud2Vla1llYXIpLHM9Vyh0LndlZWtOdW1iZXIsMSx6ZSh0LndlZWtZZWFyLGUsbikpLGk9Vyh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vigid2Vla2RheSIsdC53ZWVrZGF5KTpWKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlYoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBnbyh0KXtjb25zdCBlPWF0KHQueWVhciksbj1XKHQub3JkaW5hbCwxLHZlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vigib3JkaW5hbCIsdC5vcmRpbmFsKTpWKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIGdyKHQpe2NvbnN0IGU9YXQodC55ZWFyKSxuPVcodC5tb250aCwxLDEyKSxyPVcodC5kYXksMSxvdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpWKCJkYXkiLHQuZGF5KTpWKCJtb250aCIsdC5tb250aCk6VigieWVhciIsdC55ZWFyKX1mdW5jdGlvbiBwcih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPVcoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9VyhuLDAsNTkpLG89VyhyLDAsNTkpLGw9VyhzLDAsOTk5KTtyZXR1cm4gaT9hP28/bD8hMTpWKCJtaWxsaXNlY29uZCIscyk6Vigic2Vjb25kIixyKTpWKCJtaW51dGUiLG4pOlYoImhvdXIiLGUpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gcG8odCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiB3byh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHdyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFRyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVG8odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gU3IodCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gU28odCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIFp0KHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBEKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoIVcodC5maXJzdERheSwxLDcpfHwhVyh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiFXKGUsMSw3KSkpdGhyb3cgbmV3IEQoIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uIFcodCxlLG4pe3JldHVybiBhdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBPbyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEkodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gUHQodCl7aWYoISh5KHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBVdCh0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4gX2UodCk/MzY2OjM2NX1mdW5jdGlvbiBvdCh0LGUpe2NvbnN0IG49T28oZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/X2Uocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gbHQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gT3IodCxlLG4pe3JldHVybi16dChfdCh0LDEsZSksbikrZS0xfWZ1bmN0aW9uIHplKHQsZT00LG49MSl7Y29uc3Qgcj1Pcih0LGUsbikscz1Pcih0KzEsZSxuKTtyZXR1cm4odmUodCktcitzKS83fWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0Pjk5P3Q6dD52LnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24ga3IodCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKGw9PmwudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiB1dCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBicih0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgRChgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBjdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPWJyKHMpfXJldHVybiBufWZ1bmN0aW9uIFJlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7SShuLDIpfToke0kociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtJKG4sMil9JHtJKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBmdCh0KXtyZXR1cm4gU28odCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCBrbz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sdnI9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxibz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIElyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmJvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4udnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmtvXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IEVyPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxOcj1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLHZvPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIE1yKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnZvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uTnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLkVyXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IHhyPVsiQU0iLCJQTSJdLElvPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sRW89WyJCQyIsIkFEIl0sTm89WyJCIiwiQSJdO2Z1bmN0aW9uIERyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLk5vXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uRW9dO2Nhc2UibG9uZyI6cmV0dXJuWy4uLklvXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBNbyh0KXtyZXR1cm4geHJbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24geG8odCxlKXtyZXR1cm4gTXIoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIERvKHQsZSl7cmV0dXJuIElyKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gQ28odCxlKXtyZXR1cm4gRHIoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBGbyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSxsPW89PT0xLHU9c1t0XSxjPXI/bD91WzFdOnVbMl18fHVbMV06bD9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIENyKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgQW89e0Q6ZXQsREQ6Vm4sREREOlduLEREREQ6TG4sdDokbix0dDpfbix0dHQ6em4sdHR0dDpSbixUOlpuLFRUOlBuLFRUVDpVbixUVFRUOkhuLGY6am4sZmY6WW4sZmZmOkpuLGZmZmY6UW4sRjpxbixGRjpHbixGRkY6Qm4sRkZGRjpLbn07Y2xhc3MgTntzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyBOKGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIEFvW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEkoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLGspPT50aGlzLmxvYy5leHRyYWN0KGUsaCxrKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9NbyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSxsPShoLGspPT5yP0RvKGUsaCk6aShrP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSx1PShoLGspPT5yP3hvKGUsaCk6aShrP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3Qgaz1OLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIGs/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLGspOmh9LGQ9aD0+cj9DbyhlLGgpOmkoe2VyYTpofSwiZXJhIikscD1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gdSgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiB1KCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIHUoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiB1KCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIHUoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gdSgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiBsKCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIGwoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gbCgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIGwoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gbCgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiBsKCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIENyKE4ucGFyc2VGb3JtYXQobikscCl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj1sPT57c3dpdGNoKGxbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9bD0+dT0+e2NvbnN0IGM9cih1KTtyZXR1cm4gYz90aGlzLm51bShsLmdldChjKSx1Lmxlbmd0aCk6dX0saT1OLnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKGwse2xpdGVyYWw6dSx2YWw6Y30pPT51P2w6bC5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcihsPT5sKSk7cmV0dXJuIENyKGkscyhvKSl9fWNvbnN0IEZyPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sbF09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLGxdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIEFyKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IFZyPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyxWbz1gKD86JHtWci5zb3VyY2V9Pyg/OlxcWygke0ZyLnNvdXJjZX0pXFxdKT8pP2AsanQ9LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8sV3I9UmVnRXhwKGAke2p0LnNvdXJjZX0ke1ZvfWApLHF0PVJlZ0V4cChgKD86VCR7V3Iuc291cmNlfSk/YCksV289LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLExvPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLCRvPS8oXGR7NH0pLT8oXGR7M30pLyxfbz1Bcigid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLHpvPUFyKCJ5ZWFyIiwib3JkaW5hbCIpLFJvPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLExyPVJlZ0V4cChgJHtqdC5zb3VyY2V9ID8oPzoke1ZyLnNvdXJjZX18KCR7RnIuc291cmNlfSkpP2ApLFpvPVJlZ0V4cChgKD86ICR7THIuc291cmNlfSk/YCk7ZnVuY3Rpb24gTWUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4geShyKT9uOnJlKHIpfWZ1bmN0aW9uIFBvKHQsZSl7cmV0dXJuW3t5ZWFyOk1lKHQsZSksbW9udGg6TWUodCxlKzEsMSksZGF5Ok1lKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24geGUodCxlKXtyZXR1cm5be2hvdXJzOk1lKHQsZSwwKSxtaW51dGVzOk1lKHQsZSsxLDApLHNlY29uZHM6TWUodCxlKzIsMCksbWlsbGlzZWNvbmRzOlB0KHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBaZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj11dCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDp4Lmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gUGUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IFVvPVJlZ0V4cChgXlQ/JHtqdC5zb3VyY2V9JGApLEhvPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIGpvKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sbCx1XT10LGM9ZVswXT09PSItIixkPWwmJmxbMF09PT0iLSIscD0oaCxrPSExKT0+aCE9PXZvaWQgMCYmKGt8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczpwKGZlKG4pKSxtb250aHM6cChmZShyKSksd2Vla3M6cChmZShzKSksZGF5czpwKGZlKGkpKSxob3VyczpwKGZlKGEpKSxtaW51dGVzOnAoZmUobykpLHNlY29uZHM6cChmZShsKSxsPT09Ii0wIiksbWlsbGlzZWNvbmRzOnAoUHQodSksZCl9XX1jb25zdCBxbz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gWXQodCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/SHQocmUoZSkpOnJlKGUpLG1vbnRoOnZyLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9Fci5pbmRleE9mKHQpKzE6TnIuaW5kZXhPZih0KSsxKSxvfWNvbnN0IFlvPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gR28odCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sbCx1LGMsZF09dCxwPVl0KGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiBsP2g9cW9bbF06dT9oPTA6aD11dChjLGQpLFtwLG5ldyB4KGgpXX1mdW5jdGlvbiBKbyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IEJvPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sUW89L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sS289L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uICRyKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltZdChlLHMscixuLGksYSxvKSx4LnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBYbyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bWXQoZSxvLG4scixzLGksYSkseC51dGNJbnN0YW5jZV19Y29uc3QgZWw9SWUoV28scXQpLHRsPUllKExvLHF0KSxubD1JZSgkbyxxdCkscmw9SWUoV3IpLF9yPUVlKFBvLHhlLFplLFBlKSxzbD1FZShfbyx4ZSxaZSxQZSksaWw9RWUoem8seGUsWmUsUGUpLGFsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBvbCh0KXtyZXR1cm4gTmUodCxbZWwsX3JdLFt0bCxzbF0sW25sLGlsXSxbcmwsYWxdKX1mdW5jdGlvbiBsbCh0KXtyZXR1cm4gTmUoSm8odCksW1lvLEdvXSl9ZnVuY3Rpb24gdWwodCl7cmV0dXJuIE5lKHQsW0JvLCRyXSxbUW8sJHJdLFtLbyxYb10pfWZ1bmN0aW9uIGNsKHQpe3JldHVybiBOZSh0LFtIbyxqb10pfWNvbnN0IGZsPUVlKHhlKTtmdW5jdGlvbiBkbCh0KXtyZXR1cm4gTmUodCxbVW8sZmxdKX1jb25zdCBobD1JZShSbyxabyksbWw9SWUoTHIpLHlsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBnbCh0KXtyZXR1cm4gTmUodCxbaGwsX3JdLFttbCx5bF0pfWNvbnN0IHpyPSJJbnZhbGlkIER1cmF0aW9uIixScj17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSxwbD17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Scn0sTD0xNDYwOTcvNDAwLERlPTE0NjA5Ny80ODAwLHdsPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6RGUvNyxkYXlzOkRlLGhvdXJzOkRlKjI0LG1pbnV0ZXM6RGUqMjQqNjAsc2Vjb25kczpEZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6RGUqMjQqNjAqNjAqMWUzfSwuLi5Scn0sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLFRsPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgVChyKX1mdW5jdGlvbiBacih0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIFRsLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBQcih0LGUpe2NvbnN0IG49WnIodCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZih5KGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKHkoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIFNsKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3MgVHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj93bDpwbDtlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxPLmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gVC5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IEQoYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgVCh7dmFsdWVzOmN0KGUsVC5ub3JtYWxpemVVbml0KSxsb2M6Ty5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gVC5mcm9tTWlsbGlzKGUpO2lmKFQuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIFQuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgRChgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPWNsKGUpO3JldHVybiByP1QuZnJvbU9iamVjdChyLG4pOlQuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09ZGwoZSk7cmV0dXJuIHI/VC5mcm9tT2JqZWN0KHIsbik6VC5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHFhKHIpO3JldHVybiBuZXcgVCh7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgQW4oZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6enJ9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB6cjtjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4geShzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPVV0KHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxnLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/WnIodGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09YnIoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW1Qubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uY3QoZSxULm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gUHIodGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPVNsKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT5ULm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCB1IGluIHIpbys9dGhpcy5tYXRyaXhbdV1bYV0qclt1XSxyW3VdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCBsPU1hdGgudHJ1bmMobyk7blthXT1sLHJbYV09KG8qMWUzLWwqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFByKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IENlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBPbCh0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2IuaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/Yi5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2IuaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3MgYntjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IGphKHIpO3JldHVybiBuZXcgYih7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUhlKGUpLHM9SGUobiksaT1PbChyLHMpO3JldHVybiBpPz9uZXcgYih7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPWcuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sbDt0cnl7bz1nLmZyb21JU08ocyxuKSxsPW8uaXNWYWxpZH1jYXRjaHtsPSExfWlmKGEmJmwpcmV0dXJuIGIuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IHU9VC5mcm9tSVNPKHMsbik7aWYodS5pc1ZhbGlkKXJldHVybiBiLmFmdGVyKGksdSl9ZWxzZSBpZihsKXtjb25zdCB1PVQuZnJvbUlTTyhyLG4pO2lmKHUuaXNWYWxpZClyZXR1cm4gYi5iZWZvcmUobyx1KX19cmV0dXJuIGIuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9iLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChIZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGIuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49VC5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHMobD0+bCpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChiLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDpiLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBiLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKGw9Plt7dGltZTpsLnMsdHlwZToicyJ9LHt0aW1lOmwuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKGwsdSk9PmwudGltZS11LnRpbWUpO2Zvcihjb25zdCBsIG9mIG8pcis9bC50eXBlPT09InMiPzE6LTEscj09PTE/bj1sLnRpbWU6KG4mJituIT0rbC50aW1lJiZzLnB1c2goYi5mcm9tRGF0ZVRpbWVzKG4sbC50aW1lKSksbj1udWxsKTtyZXR1cm4gYi5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBiLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkNlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9ZXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkNlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkNlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkNlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkNlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpDZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTpULmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgZHR7c3RhdGljIGhhc0RTVChlPXYuZGVmYXVsdFpvbmUpe2NvbnN0IG49Zy5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLHYuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fE8uY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8Ty5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxPLmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8Ty5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBPLmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gTy5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6d3IoKSxsb2NhbGVXZWVrOlRyKCl9fX1mdW5jdGlvbiBVcih0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKFQuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiBrbCh0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKGwsdSk9PnUueWVhci1sLnllYXJdLFsicXVhcnRlcnMiLChsLHUpPT51LnF1YXJ0ZXItbC5xdWFydGVyKyh1LnllYXItbC55ZWFyKSo0XSxbIm1vbnRocyIsKGwsdSk9PnUubW9udGgtbC5tb250aCsodS55ZWFyLWwueWVhcikqMTJdLFsid2Vla3MiLChsLHUpPT57Y29uc3QgYz1VcihsLHUpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsVXJdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFtsLHVdb2YgciluLmluZGV4T2YobCk+PTAmJihhPWwsc1tsXT11KHQsZSksbz1pLnBsdXMocyksbz5lPyhzW2xdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbbF0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIGJsKHQsZSxuLHIpe2xldFtzLGksYSxvXT1rbCh0LGUsbik7Y29uc3QgbD1lLXMsdT1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTt1Lmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKStsLyhhLXMpKSk7Y29uc3QgYz1ULmZyb21PYmplY3QoaSxyKTtyZXR1cm4gdS5sZW5ndGg+MD9ULmZyb21NaWxsaXMobCxyKS5zaGlmdFRvKC4uLnUpLnBsdXMoYyk6Y31jb25zdCBHdD17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sSHI9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LHZsPUd0LmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gSWwodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKEd0LmhhbmlkZWMpIT09LTEpZSs9dmwuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIEhyKXtjb25zdFtpLGFdPUhyW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7R3RbdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgRWw9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIFModCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKElsKG4pKX19Y29uc3QganI9IlsgwqBdIixxcj1uZXcgUmVnRXhwKGpyLCJnIik7ZnVuY3Rpb24gTmwodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UocXIsanIpfWZ1bmN0aW9uIFlyKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UocXIsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKE5sKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5ZcihuKT09PVlyKHIpKStlfX1mdW5jdGlvbiBHcih0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT51dChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiBodCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gTWwodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIHhsKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSxsPVIoZSwiezEsM30iKSx1PVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSxwPVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKE1sKE0udmFsKSksZGVzZXI6KFtqXSk9PmosbGl0ZXJhbDohMH0pLFA9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBaKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gWihlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBTKHUpO2Nhc2UieXkiOnJldHVybiBTKGQsSHQpO2Nhc2UieXl5eSI6cmV0dXJuIFMoaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIFMocCk7Y2FzZSJ5eXl5eXkiOnJldHVybiBTKGEpO2Nhc2UiTSI6cmV0dXJuIFMobyk7Y2FzZSJNTSI6cmV0dXJuIFMocik7Y2FzZSJNTU0iOnJldHVybiBaKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFooZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBTKG8pO2Nhc2UiTEwiOnJldHVybiBTKHIpO2Nhc2UiTExMIjpyZXR1cm4gWihlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBaKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gUyhvKTtjYXNlImRkIjpyZXR1cm4gUyhyKTtjYXNlIm8iOnJldHVybiBTKGwpO2Nhc2Uib29vIjpyZXR1cm4gUyhzKTtjYXNlIkhIIjpyZXR1cm4gUyhyKTtjYXNlIkgiOnJldHVybiBTKG8pO2Nhc2UiaGgiOnJldHVybiBTKHIpO2Nhc2UiaCI6cmV0dXJuIFMobyk7Y2FzZSJtbSI6cmV0dXJuIFMocik7Y2FzZSJtIjpyZXR1cm4gUyhvKTtjYXNlInEiOnJldHVybiBTKG8pO2Nhc2UicXEiOnJldHVybiBTKHIpO2Nhc2UicyI6cmV0dXJuIFMobyk7Y2FzZSJzcyI6cmV0dXJuIFMocik7Y2FzZSJTIjpyZXR1cm4gUyhsKTtjYXNlIlNTUyI6cmV0dXJuIFMocyk7Y2FzZSJ1IjpyZXR1cm4gaHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIGh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gUyhuKTtjYXNlImEiOnJldHVybiBaKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gUyhpKTtjYXNlImtrIjpyZXR1cm4gUyhkLEh0KTtjYXNlIlciOnJldHVybiBTKG8pO2Nhc2UiV1ciOnJldHVybiBTKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gUyhuKTtjYXNlIkVFRSI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiBHcihuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIEdyKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiBodCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4gaHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOkVsfTtyZXR1cm4gUC50b2tlbj10LFB9Y29uc3QgRGw9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gQ2wodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IGw9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiFsLHZhbDpsPyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1EbFthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIEZsKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiBBbCh0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSxsPW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaStsKSkpLGkrPWx9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gVmwodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIHkodC56KXx8KG49Si5jcmVhdGUodC56KSkseSh0LlopfHwobnx8KG49bmV3IHgodC5aKSkscj10LlopLHkodC5xKXx8KHQuTT0odC5xLTEpKjMrMSkseSh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSx5KHQudSl8fCh0LlM9UHQodC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IEp0PW51bGw7ZnVuY3Rpb24gV2woKXtyZXR1cm4gSnR8fChKdD1nLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLEp0fWZ1bmN0aW9uIExsKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49Ti5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPVFyKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gSnIodCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT5MbChuLGUpKSl9ZnVuY3Rpb24gQnIodCxlLG4pe2NvbnN0IHI9SnIoTi5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PnhsKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109RmwocyksbD1SZWdFeHAoYSwiaSIpLFt1LGNdPUFsKGUsbCxvKSxbZCxwLGhdPWM/VmwoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBrZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDpsLHJhd01hdGNoZXM6dSxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTpwLHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiAkbCh0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Ccih0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIFFyKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj1OLmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKFdsKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5DbChhLHQsaSkpfWNvbnN0IEJ0PSJJbnZhbGlkIERhdGVUaW1lIixLcj04NjRlMTM7ZnVuY3Rpb24gbXQodCl7cmV0dXJuIG5ldyB6KCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIFF0KHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9aXQodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBLdCh0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1pdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IGcoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIFhyKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIHl0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gZ3QodCxlLG4pe3JldHVybiBYcihsdCh0KSxlLG4pfWZ1bmN0aW9uIGVzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksb3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT1ULmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1sdChpKTtsZXRbbCx1XT1YcihvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJihsKz1hLHU9dC56b25lLm9mZnNldChsKSkse3RzOmwsbzp1fX1mdW5jdGlvbiBVZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCBsPWV8fG8sdT1nLmZyb21PYmplY3QodCx7Li4ubix6b25lOmwsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP3U6dS5zZXRab25lKG8pfWVsc2UgcmV0dXJuIGcuaW52YWxpZChuZXcgeigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gcHQodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/Ti5jcmVhdGUoTy5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBYdCh0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUkodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1JKHQuYy5tb250aCkscis9Ii0iLHIrPUkodC5jLmRheSkpOihyKz1JKHQuYy5tb250aCkscis9SSh0LmMuZGF5KSkscn1mdW5jdGlvbiB0cyh0LGUsbixyLHMsaSl7bGV0IGE9SSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1JKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9SSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUkodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1JKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9SShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9SShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1JKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUkoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBucz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sX2w9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHpsPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHJzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sUmw9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sWmw9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIFBsKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBBbih0KTtyZXR1cm4gZX1mdW5jdGlvbiBzcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBQbCh0KX19ZnVuY3Rpb24gaXModCxlKXtjb25zdCBuPW5lKGUuem9uZSx2LmRlZmF1bHRab25lKSxyPU8uZnJvbU9iamVjdChlKSxzPXYubm93KCk7bGV0IGksYTtpZih5KHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IHUgb2YgcnMpeSh0W3VdKSYmKHRbdV09bnNbdV0pO2NvbnN0IG89Z3IodCl8fHByKHQpO2lmKG8pcmV0dXJuIGcuaW52YWxpZChvKTtjb25zdCBsPW4ub2Zmc2V0KHMpO1tpLGFdPWd0KHQsbCxuKX1yZXR1cm4gbmV3IGcoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIGFzKHQsZSxuKXtjb25zdCByPXkobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1VdChhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIG9zKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8di5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IHooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOm10KG4pKTt0aGlzLnRzPXkoZS50cyk/di5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPXl0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgeigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8Ty5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgZyh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1vcyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sbCx1XT1uO3JldHVybiBpcyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDpsLG1pbGxpc2Vjb25kOnV9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPW9zKGFyZ3VtZW50cyksW3IscyxpLGEsbyxsLHVdPW47cmV0dXJuIGUuem9uZT14LnV0Y0luc3RhbmNlLGlzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOmwsbWlsbGlzZWNvbmQ6dX0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPXdvKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIGcuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IGcoe3RzOnIsem9uZTpzLGxvYzpPLmZyb21PYmplY3Qobil9KTpnLmludmFsaWQobXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LUtyfHxlPktyP2cuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBnKHt0czplLHpvbmU6bmUobi56b25lLHYuZGVmYXVsdFpvbmUpLGxvYzpPLmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgRChgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBnKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSx2LmRlZmF1bHRab25lKSxsb2M6Ty5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IEQoImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIGcuaW52YWxpZChtdChyKSk7Y29uc3Qgcz1PLmZyb21PYmplY3QobiksaT1jdChlLHNzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309eXIoaSxzKSxsPXYubm93KCksdT15KG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KGwpOm4uc3BlY2lmaWNPZmZzZXQsYz0heShpLm9yZGluYWwpLGQ9IXkoaS55ZWFyKSxwPSF5KGkubW9udGgpfHwheShpLmRheSksaD1kfHxwLGs9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmayl0aHJvdyBuZXcga2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZihwJiZjKXRocm93IG5ldyBrZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBQPWt8fGkud2Vla2RheSYmIWg7bGV0IE0saixCPXl0KGwsdSk7UD8oTT1SbCxqPV9sLEI9aXQoQixhLG8pKTpjPyhNPVpsLGo9emwsQj1SdChCKSk6KE09cnMsaj1ucyk7bGV0IEZlPSExO2Zvcihjb25zdCBLIG9mIE0pe2NvbnN0IFR0PWlbS107eShUdCk/RmU/aVtLXT1qW0tdOmlbS109QltLXTpGZT0hMH1jb25zdCB3dD1QP3lvKGksYSxvKTpjP2dvKGkpOmdyKGkpLHE9d3R8fHByKGkpO2lmKHEpcmV0dXJuIGcuaW52YWxpZChxKTtjb25zdCBtZT1QP2hyKGksYSxvKTpjP21yKGkpOmksW3llLGllXT1ndChtZSx1LHIpLFE9bmV3IGcoe3RzOnllLHpvbmU6cixvOmllLGxvYzpzfSk7cmV0dXJuIGkud2Vla2RheSYmaCYmZS53ZWVrZGF5IT09US53ZWVrZGF5P2cuaW52YWxpZCgibWlzbWF0Y2hlZCB3ZWVrZGF5IixgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtpLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtRLnRvSVNPKCl9YCk6UX1zdGF0aWMgZnJvbUlTTyhlLG49e30pe2NvbnN0W3Isc109b2woZSk7cmV0dXJuIFVlKHIscyxuLCJJU08gODYwMSIsZSl9c3RhdGljIGZyb21SRkMyODIyKGUsbj17fSl7Y29uc3RbcixzXT1sbChlKTtyZXR1cm4gVWUocixzLG4sIlJGQyAyODIyIixlKX1zdGF0aWMgZnJvbUhUVFAoZSxuPXt9KXtjb25zdFtyLHNdPXVsKGUpO3JldHVybiBVZShyLHMsbiwiSFRUUCIsbil9c3RhdGljIGZyb21Gb3JtYXQoZSxuLHI9e30pe2lmKHkoZSl8fHkobikpdGhyb3cgbmV3IEQoImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCIpO2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPU8uZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSksW28sbCx1LGNdPSRsKGEsZSxuKTtyZXR1cm4gYz9nLmludmFsaWQoYyk6VWUobyxsLHIsYGZvcm1hdCAke259YCxlLHUpfXN0YXRpYyBmcm9tU3RyaW5nKGUsbixyPXt9KXtyZXR1cm4gZy5mcm9tRm9ybWF0KGUsbixyKX1zdGF0aWMgZnJvbVNRTChlLG49e30pe2NvbnN0W3Isc109Z2woZSk7cmV0dXJuIFVlKHIscyxuLCJTUUwiLGUpfXN0YXRpYyBpbnZhbGlkKGUsbj1udWxsKXtpZighZSl0aHJvdyBuZXcgRCgibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkIik7Y29uc3Qgcj1lIGluc3RhbmNlb2Ygej9lOm5ldyB6KGUsbik7aWYodi50aHJvd09uSW52YWxpZCl0aHJvdyBuZXcgSGEocik7cmV0dXJuIG5ldyBnKHtpbnZhbGlkOnJ9KX1zdGF0aWMgaXNEYXRlVGltZShlKXtyZXR1cm4gZSYmZS5pc0x1eG9uRGF0ZVRpbWV8fCExfXN0YXRpYyBwYXJzZUZvcm1hdEZvck9wdHMoZSxuPXt9KXtjb25zdCByPVFyKGUsTy5mcm9tT2JqZWN0KG4pKTtyZXR1cm4gcj9yLm1hcChzPT5zP3MudmFsOm51bGwpLmpvaW4oIiIpOm51bGx9c3RhdGljIGV4cGFuZEZvcm1hdChlLG49e30pe3JldHVybiBKcihOLnBhcnNlRm9ybWF0KGUpLE8uZnJvbU9iamVjdChuKSkubWFwKHM9PnMudmFsKS5qb2luKCIiKX1nZXQoZSl7cmV0dXJuIHRoaXNbZV19Z2V0IGlzVmFsaWQoKXtyZXR1cm4gdGhpcy5pbnZhbGlkPT09bnVsbH1nZXQgaW52YWxpZFJlYXNvbigpe3JldHVybiB0aGlzLmludmFsaWQ/dGhpcy5pbnZhbGlkLnJlYXNvbjpudWxsfWdldCBpbnZhbGlkRXhwbGFuYXRpb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5leHBsYW5hdGlvbjpudWxsfWdldCBsb2NhbGUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLmxvY2FsZTpudWxsfWdldCBudW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm51bWJlcmluZ1N5c3RlbTpudWxsfWdldCBvdXRwdXRDYWxlbmRhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXI6bnVsbH1nZXQgem9uZSgpe3JldHVybiB0aGlzLl96b25lfWdldCB6b25lTmFtZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm5hbWU6bnVsbH1nZXQgeWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnllYXI6TmFOfWdldCBxdWFydGVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmNlaWwodGhpcy5jLm1vbnRoLzMpOk5hTn1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5tb250aDpOYU59Z2V0IGRheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLmRheTpOYU59Z2V0IGhvdXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5ob3VyOk5hTn1nZXQgbWludXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWludXRlOk5hTn1nZXQgc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuc2Vjb25kOk5hTn1nZXQgbWlsbGlzZWNvbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5taWxsaXNlY29uZDpOYU59Z2V0IHdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IHdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1F0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCB3ZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgaXNXZWVrZW5kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCYmdGhpcy5sb2MuZ2V0V2Vla2VuZERheXMoKS5pbmNsdWRlcyh0aGlzLndlZWtkYXkpfWdldCBsb2NhbFdlZWtkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtkYXk6TmFOfWdldCBsb2NhbFdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCBsb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9LdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IG9yZGluYWwoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1J0KHRoaXMuYykub3JkaW5hbDpOYU59Z2V0IG1vbnRoU2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0Lm1vbnRocygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLm1vbnRoLTFdOm51bGx9Z2V0IG1vbnRoTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQubW9udGhzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCB3ZWVrZGF5U2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0LndlZWtkYXlzKCJzaG9ydCIse2xvY09iajp0aGlzLmxvY30pW3RoaXMud2Vla2RheS0xXTpudWxsfWdldCB3ZWVrZGF5TG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQud2Vla2RheXMoImxvbmciLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgb2Zmc2V0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rdGhpcy5vOk5hTn1nZXQgb2Zmc2V0TmFtZVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLHtmb3JtYXQ6InNob3J0Iixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBvZmZzZXROYW1lTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBpc09mZnNldEZpeGVkKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUuaXNVbml2ZXJzYWw6bnVsbH1nZXQgaXNJbkRTVCgpe3JldHVybiB0aGlzLmlzT2Zmc2V0Rml4ZWQ/ITE6dGhpcy5vZmZzZXQ+dGhpcy5zZXQoe21vbnRoOjEsZGF5OjF9KS5vZmZzZXR8fHRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDo1fSkub2Zmc2V0fWdldFBvc3NpYmxlT2Zmc2V0cygpe2lmKCF0aGlzLmlzVmFsaWR8fHRoaXMuaXNPZmZzZXRGaXhlZClyZXR1cm5bdGhpc107Y29uc3QgZT04NjRlNSxuPTZlNCxyPWx0KHRoaXMuYykscz10aGlzLnpvbmUub2Zmc2V0KHItZSksaT10aGlzLnpvbmUub2Zmc2V0KHIrZSksYT10aGlzLnpvbmUub2Zmc2V0KHItcypuKSxvPXRoaXMuem9uZS5vZmZzZXQoci1pKm4pO2lmKGE9PT1vKXJldHVyblt0aGlzXTtjb25zdCBsPXItYSpuLHU9ci1vKm4sYz15dChsLGEpLGQ9eXQodSxvKTtyZXR1cm4gYy5ob3VyPT09ZC5ob3VyJiZjLm1pbnV0ZT09PWQubWludXRlJiZjLnNlY29uZD09PWQuc2Vjb25kJiZjLm1pbGxpc2Vjb25kPT09ZC5taWxsaXNlY29uZD9baGUodGhpcyx7dHM6bH0pLGhlKHRoaXMse3RzOnV9KV06W3RoaXNdfWdldCBpc0luTGVhcFllYXIoKXtyZXR1cm4gX2UodGhpcy55ZWFyKX1nZXQgZGF5c0luTW9udGgoKXtyZXR1cm4gb3QodGhpcy55ZWFyLHRoaXMubW9udGgpfWdldCBkYXlzSW5ZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD92ZSh0aGlzLnllYXIpOk5hTn1nZXQgd2Vla3NJbldlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLndlZWtZZWFyKTpOYU59Z2V0IHdlZWtzSW5Mb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLmxvY2FsV2Vla1llYXIsdGhpcy5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSk6TmFOfXJlc29sdmVkTG9jYWxlT3B0aW9ucyhlPXt9KXtjb25zdHtsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixjYWxlbmRhcjpzfT1OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7cmV0dXJue2xvY2FsZTpuLG51bWJlcmluZ1N5c3RlbTpyLG91dHB1dENhbGVuZGFyOnN9fXRvVVRDKGU9MCxuPXt9KXtyZXR1cm4gdGhpcy5zZXRab25lKHguaW5zdGFuY2UoZSksbil9dG9Mb2NhbCgpe3JldHVybiB0aGlzLnNldFpvbmUodi5kZWZhdWx0Wm9uZSl9c2V0Wm9uZShlLHtrZWVwTG9jYWxUaW1lOm49ITEsa2VlcENhbGVuZGFyVGltZTpyPSExfT17fSl7aWYoZT1uZShlLHYuZGVmYXVsdFpvbmUpLGUuZXF1YWxzKHRoaXMuem9uZSkpcmV0dXJuIHRoaXM7aWYoZS5pc1ZhbGlkKXtsZXQgcz10aGlzLnRzO2lmKG58fHIpe2NvbnN0IGk9ZS5vZmZzZXQodGhpcy50cyksYT10aGlzLnRvT2JqZWN0KCk7W3NdPWd0KGEsaSxlKX1yZXR1cm4gaGUodGhpcyx7dHM6cyx6b25lOmV9KX1lbHNlIHJldHVybiBnLmludmFsaWQobXQoZSkpfXJlY29uZmlndXJlKHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyfT17fSl7Y29uc3Qgcz10aGlzLmxvYy5jbG9uZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn0pO3JldHVybiBoZSh0aGlzLHtsb2M6c30pfXNldExvY2FsZShlKXtyZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7bG9jYWxlOmV9KX1zZXQoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPWN0KGUsc3MpLHttaW5EYXlzSW5GaXJzdFdlZWs6cixzdGFydE9mV2VlazpzfT15cihuLHRoaXMubG9jKSxpPSF5KG4ud2Vla1llYXIpfHwheShuLndlZWtOdW1iZXIpfHwheShuLndlZWtkYXkpLGE9IXkobi5vcmRpbmFsKSxvPSF5KG4ueWVhciksbD0heShuLm1vbnRoKXx8IXkobi5kYXkpLHU9b3x8bCxjPW4ud2Vla1llYXJ8fG4ud2Vla051bWJlcjtpZigodXx8YSkmJmMpdGhyb3cgbmV3IGtlKCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzIik7aWYobCYmYSl0aHJvdyBuZXcga2UoIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5Iik7bGV0IGQ7aT9kPWhyKHsuLi5pdCh0aGlzLmMscixzKSwuLi5ufSxyLHMpOnkobi5vcmRpbmFsKT8oZD17Li4udGhpcy50b09iamVjdCgpLC4uLm59LHkobi5kYXkpJiYoZC5kYXk9TWF0aC5taW4ob3QoZC55ZWFyLGQubW9udGgpLGQuZGF5KSkpOmQ9bXIoey4uLlJ0KHRoaXMuYyksLi4ubn0pO2NvbnN0W3AsaF09Z3QoZCx0aGlzLm8sdGhpcy56b25lKTtyZXR1cm4gaGUodGhpcyx7dHM6cCxvOmh9KX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIGhlKHRoaXMsZXModGhpcyxuKSl9bWludXMoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPVQuZnJvbUR1cmF0aW9uTGlrZShlKS5uZWdhdGUoKTtyZXR1cm4gaGUodGhpcyxlcyh0aGlzLG4pKX1zdGFydE9mKGUse3VzZUxvY2FsZVdlZWtzOm49ITF9PXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IHI9e30scz1ULm5vcm1hbGl6ZVVuaXQoZSk7c3dpdGNoKHMpe2Nhc2UieWVhcnMiOnIubW9udGg9MTtjYXNlInF1YXJ0ZXJzIjpjYXNlIm1vbnRocyI6ci5kYXk9MTtjYXNlIndlZWtzIjpjYXNlImRheXMiOnIuaG91cj0wO2Nhc2UiaG91cnMiOnIubWludXRlPTA7Y2FzZSJtaW51dGVzIjpyLnNlY29uZD0wO2Nhc2Uic2Vjb25kcyI6ci5taWxsaXNlY29uZD0wO2JyZWFrfWlmKHM9PT0id2Vla3MiKWlmKG4pe2NvbnN0IGk9dGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSx7d2Vla2RheTphfT10aGlzO2E8aSYmKHIud2Vla051bWJlcj10aGlzLndlZWtOdW1iZXItMSksci53ZWVrZGF5PWl9ZWxzZSByLndlZWtkYXk9MTtpZihzPT09InF1YXJ0ZXJzIil7Y29uc3QgaT1NYXRoLmNlaWwodGhpcy5tb250aC8zKTtyLm1vbnRoPShpLTEpKjMrMX1yZXR1cm4gdGhpcy5zZXQocil9ZW5kT2YoZSxuKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMucGx1cyh7W2VdOjF9KS5zdGFydE9mKGUsbikubWludXMoMSk6dGhpc310b0Zvcm1hdChlLG49e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MucmVkZWZhdWx0VG9FTihuKSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMsZSk6QnR9dG9Mb2NhbGVTdHJpbmcoZT1ldCxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP04uY3JlYXRlKHRoaXMubG9jLmNsb25lKG4pLGUpLmZvcm1hdERhdGVUaW1lKHRoaXMpOkJ0fXRvTG9jYWxlUGFydHMoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpOltdfXRvSVNPKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQiLHN1cHByZXNzU2Vjb25kczpuPSExLHN1cHByZXNzTWlsbGlzZWNvbmRzOnI9ITEsaW5jbHVkZU9mZnNldDpzPSEwLGV4dGVuZGVkWm9uZTppPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBhPWU9PT0iZXh0ZW5kZWQiO2xldCBvPVh0KHRoaXMsYSk7cmV0dXJuIG8rPSJUIixvKz10cyh0aGlzLGEsbixyLHMsaSksb310b0lTT0RhdGUoe2Zvcm1hdDplPSJleHRlbmRlZCJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1h0KHRoaXMsZT09PSJleHRlbmRlZCIpOm51bGx9dG9JU09XZWVrRGF0ZSgpe3JldHVybiBwdCh0aGlzLCJra2trLSdXJ1dXLWMiKX10b0lTT1RpbWUoe3N1cHByZXNzTWlsbGlzZWNvbmRzOmU9ITEsc3VwcHJlc3NTZWNvbmRzOm49ITEsaW5jbHVkZU9mZnNldDpyPSEwLGluY2x1ZGVQcmVmaXg6cz0hMSxleHRlbmRlZFpvbmU6aT0hMSxmb3JtYXQ6YT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8ocz8iVCI6IiIpK3RzKHRoaXMsYT09PSJleHRlbmRlZCIsbixlLHIsaSk6bnVsbH10b1JGQzI4MjIoKXtyZXR1cm4gcHQodGhpcywiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWloiLCExKX10b0hUVFAoKXtyZXR1cm4gcHQodGhpcy50b1VUQygpLCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnIil9dG9TUUxEYXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9YdCh0aGlzLCEwKTpudWxsfXRvU1FMVGltZSh7aW5jbHVkZU9mZnNldDplPSEwLGluY2x1ZGVab25lOm49ITEsaW5jbHVkZU9mZnNldFNwYWNlOnI9ITB9PXt9KXtsZXQgcz0iSEg6bW06c3MuU1NTIjtyZXR1cm4obnx8ZSkmJihyJiYocys9IiAiKSxuP3MrPSJ6IjplJiYocys9IlpaIikpLHB0KHRoaXMscywhMCl9dG9TUUwoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKGUpfWA6bnVsbH10b1N0cmluZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50b0lTTygpOkJ0fVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YERhdGVUaW1lIHsgdHM6ICR7dGhpcy50b0lTTygpfSwgem9uZTogJHt0aGlzLnpvbmUubmFtZX0sIGxvY2FsZTogJHt0aGlzLmxvY2FsZX0gfWA6YERhdGVUaW1lIHsgSW52YWxpZCwgcmVhc29uOiAke3RoaXMuaW52YWxpZFJlYXNvbn0gfWB9dmFsdWVPZigpe3JldHVybiB0aGlzLnRvTWlsbGlzKCl9dG9NaWxsaXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOfXRvU2Vjb25kcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50cy8xZTM6TmFOfXRvVW5peEludGVnZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP01hdGguZmxvb3IodGhpcy50cy8xZTMpOk5hTn10b0pTT04oKXtyZXR1cm4gdGhpcy50b0lTTygpfXRvQlNPTigpe3JldHVybiB0aGlzLnRvSlNEYXRlKCl9dG9PYmplY3QoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm57fTtjb25zdCBuPXsuLi50aGlzLmN9O3JldHVybiBlLmluY2x1ZGVDb25maWcmJihuLm91dHB1dENhbGVuZGFyPXRoaXMub3V0cHV0Q2FsZW5kYXIsbi5udW1iZXJpbmdTeXN0ZW09dGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtLG4ubG9jYWxlPXRoaXMubG9jLmxvY2FsZSksbn10b0pTRGF0ZSgpe3JldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQ/dGhpcy50czpOYU4pfWRpZmYoZSxuPSJtaWxsaXNlY29uZHMiLHI9e30pe2lmKCF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQpcmV0dXJuIFQuaW52YWxpZCgiY3JlYXRlZCBieSBkaWZmaW5nIGFuIGludmFsaWQgRGF0ZVRpbWUiKTtjb25zdCBzPXtsb2NhbGU6dGhpcy5sb2NhbGUsbnVtYmVyaW5nU3lzdGVtOnRoaXMubnVtYmVyaW5nU3lzdGVtLC4uLnJ9LGk9VG8obikubWFwKFQubm9ybWFsaXplVW5pdCksYT1lLnZhbHVlT2YoKT50aGlzLnZhbHVlT2YoKSxvPWE/dGhpczplLGw9YT9lOnRoaXMsdT1ibChvLGwsaSxzKTtyZXR1cm4gYT91Lm5lZ2F0ZSgpOnV9ZGlmZk5vdyhlPSJtaWxsaXNlY29uZHMiLG49e30pe3JldHVybiB0aGlzLmRpZmYoZy5ub3coKSxlLG4pfXVudGlsKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/Yi5mcm9tRGF0ZVRpbWVzKHRoaXMsZSk6dGhpc31oYXNTYW1lKGUsbixyKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiExO2NvbnN0IHM9ZS52YWx1ZU9mKCksaT10aGlzLnNldFpvbmUoZS56b25lLHtrZWVwTG9jYWxUaW1lOiEwfSk7cmV0dXJuIGkuc3RhcnRPZihuLHIpPD1zJiZzPD1pLmVuZE9mKG4scil9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQmJmUuaXNWYWxpZCYmdGhpcy52YWx1ZU9mKCk9PT1lLnZhbHVlT2YoKSYmdGhpcy56b25lLmVxdWFscyhlLnpvbmUpJiZ0aGlzLmxvYy5lcXVhbHMoZS5sb2MpfXRvUmVsYXRpdmUoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBuPWUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHI9ZS5wYWRkaW5nP3RoaXM8bj8tZS5wYWRkaW5nOmUucGFkZGluZzowO2xldCBzPVsieWVhcnMiLCJtb250aHMiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyJdLGk9ZS51bml0O3JldHVybiBBcnJheS5pc0FycmF5KGUudW5pdCkmJihzPWUudW5pdCxpPXZvaWQgMCksYXMobix0aGlzLnBsdXMociksey4uLmUsbnVtZXJpYzoiYWx3YXlzIix1bml0czpzLHVuaXQ6aX0pfXRvUmVsYXRpdmVDYWxlbmRhcihlPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2FzKGUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHRoaXMsey4uLmUsbnVtZXJpYzoiYXV0byIsdW5pdHM6WyJ5ZWFycyIsIm1vbnRocyIsImRheXMiXSxjYWxlbmRhcnk6ITB9KTpudWxsfXN0YXRpYyBtaW4oLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5taW4pfXN0YXRpYyBtYXgoLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5tYXgpfXN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbihlLG4scj17fSl7Y29uc3R7bG9jYWxlOnM9bnVsbCxudW1iZXJpbmdTeXN0ZW06aT1udWxsfT1yLGE9Ty5mcm9tT3B0cyh7bG9jYWxlOnMsbnVtYmVyaW5nU3lzdGVtOmksZGVmYXVsdFRvRU46ITB9KTtyZXR1cm4gQnIoYSxlLG4pfXN0YXRpYyBmcm9tU3RyaW5nRXhwbGFpbihlLG4scj17fSl7cmV0dXJuIGcuZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHIpfXN0YXRpYyBnZXQgREFURV9TSE9SVCgpe3JldHVybiBldH1zdGF0aWMgZ2V0IERBVEVfTUVEKCl7cmV0dXJuIFZufXN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIFlhfXN0YXRpYyBnZXQgREFURV9GVUxMKCl7cmV0dXJuIFdufXN0YXRpYyBnZXQgREFURV9IVUdFKCl7cmV0dXJuIExufXN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKXtyZXR1cm4gJG59c3RhdGljIGdldCBUSU1FX1dJVEhfU0VDT05EUygpe3JldHVybiBfbn1zdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gem59c3RhdGljIGdldCBUSU1FX1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4gUm59c3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpe3JldHVybiBabn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIFBufXN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpe3JldHVybiBVbn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCgpe3JldHVybiBIbn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCl7cmV0dXJuIGpufXN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIHFufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCl7cmV0dXJuIFlufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpe3JldHVybiBHbn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkoKXtyZXR1cm4gR2F9c3RhdGljIGdldCBEQVRFVElNRV9GVUxMKCl7cmV0dXJuIEpufXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gQm59c3RhdGljIGdldCBEQVRFVElNRV9IVUdFKCl7cmV0dXJuIFFufXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gS259fWZ1bmN0aW9uIEhlKHQpe2lmKGcuaXNEYXRlVGltZSh0KSlyZXR1cm4gdDtpZih0JiZ0LnZhbHVlT2YmJmNlKHQudmFsdWVPZigpKSlyZXR1cm4gZy5mcm9tSlNEYXRlKHQpO2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0IilyZXR1cm4gZy5mcm9tT2JqZWN0KHQpO3Rocm93IG5ldyBEKGBVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50OiAke3R9LCBvZiB0eXBlICR7dHlwZW9mIHR9YCl9ZnVuY3Rpb24gVWwoe2NvbGxlY3Rpb25zOnQsbHd3OmV9LHt0YWJsZUlkczpuLHRhYmxlQ29sdW1uSWRzOnIscmVsYXRpb25zaGlwSWRzOnMsaW5kZXhJZHM6aSxpbmRleENvbHVtbklkczphLG1lbW9JZHM6b30pe0EodCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLnJlbW92ZU1hbnkobiksQSh0KS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIikucmVtb3ZlTWFueShyKSxBKHQpLmNvbGxlY3Rpb24oInJlbGF0aW9uc2hpcEVudGl0aWVzIikucmVtb3ZlTWFueShzKSxBKHQpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKS5yZW1vdmVNYW55KGkpLEEodCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkoYSksQSh0KS5jb2xsZWN0aW9uKCJtZW1vRW50aXRpZXMiKS5yZW1vdmVNYW55KG8pLFsuLi5uLC4uLnIsLi4ucywuLi5pLC4uLmEsLi4ub10uZm9yRWFjaChsPT5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsbCkpfWNvbnN0IEhsPTMsamw9JChbInRhYmxlRW50aXRpZXMiLCJ0YWJsZUNvbHVtbkVudGl0aWVzIiwicmVsYXRpb25zaGlwRW50aXRpZXMiLCJpbmRleEVudGl0aWVzIiwiaW5kZXhDb2x1bW5FbnRpdGllcyIsIm1lbW9FbnRpdGllcyJdKTtjbGFzcyBxbHthc3luYyBydW4oZSl7Y29uc3Qgbj1KU09OLnBhcnNlKGUpLHI9JGEobikse2RvYzp7dGFibGVJZHM6cyxtZW1vSWRzOmksaW5kZXhJZHM6YSxyZWxhdGlvbnNoaXBJZHM6b30sY29sbGVjdGlvbnM6bCxsd3c6dX09cixjPSQocyksZD0kKGkpLHA9JChhKSxoPSQobyksaz1ZbChnLm5vdygpKSxQPUEobCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLE09QShsKS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIiksaj1BKGwpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKSxCPUEobCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLEZlPUEobCkuY29sbGVjdGlvbigicmVsYXRpb25zaGlwRW50aXRpZXMiKSx3dD1BKGwpLmNvbGxlY3Rpb24oIm1lbW9FbnRpdGllcyIpLHE9bmV3IFNldChQLnNlbGVjdEFsbCgpLmZpbHRlcihrKGMpKS5tYXAoKHtpZDptfSk9Pm0pKSxtZT1uZXcgU2V0LHllPW5ldyBTZXQoRmUuc2VsZWN0QWxsKCkuZmlsdGVyKGsoaCkpLm1hcCgoe2lkOm19KT0+bSkpLGllPW5ldyBTZXQoai5zZWxlY3RBbGwoKS5maWx0ZXIoayhwKSkubWFwKCh7aWQ6bX0pPT5tKSksUT1uZXcgU2V0LEs9bmV3IFNldCh3dC5zZWxlY3RBbGwoKS5maWx0ZXIoayhkKSkubWFwKCh7aWQ6bX0pPT5tKSk7TS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm19KT0+cS5oYXMobSkpLmZvckVhY2goKHtpZDptfSk9Pm1lLmFkZChtKSksRmUuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSxzdGFydDpZLGVuZDpqZX0pPT4heWUuaGFzKG0pJiYocS5oYXMoWS50YWJsZUlkKXx8cS5oYXMoamUudGFibGVJZCkpKS5mb3JFYWNoKCh7aWQ6bX0pPT55ZS5hZGQobSkpLGouc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSx0YWJsZUlkOll9KT0+IWllLmhhcyhtKSYmcS5oYXMoWSkpLmZvckVhY2goKHtpZDptfSk9PmllLmFkZChtKSksQi5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpbmRleElkOm19KT0+aWUuaGFzKG0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5RLmFkZChtKSksVWwocix7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119KTtjb25zdCBUdD0kKFAuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksSmw9JChNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLGxzPSQoai5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxCbD0kKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksUWw9JChGZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxLbD0kKHd0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBNLnNlbGVjdEFsbCgpLmZpbHRlcigoe3RhYmxlSWQ6bSxpZDpZLG1ldGE6amV9KT0+IVR0KG0pJiZrKCgpPT4hMSkoe2lkOlksbWV0YTpqZX0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5tZS5hZGQobSkpLEIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpqZX0pPT4hbHMobSkmJmsoKCk9PiExKSh7aWQ6WSxtZXRhOmplfSkpLmZvckVhY2goKHtpZDptfSk9PlEuYWRkKG0pKSxPYmplY3QuZW50cmllcyh1KS5mb3JFYWNoKChbbSxbWV1dKT0+e2lmKGpsKFkpKXN3aXRjaChZKXtjYXNlInRhYmxlRW50aXRpZXMiOiFUdChtKSYmcS5hZGQobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohSmwobSkmJm1lLmFkZChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohUWwobSkmJnllLmFkZChtKTticmVhaztjYXNlImluZGV4RW50aXRpZXMiOiFscyhtKSYmaWUuYWRkKG0pO2JyZWFrO2Nhc2UiaW5kZXhDb2x1bW5FbnRpdGllcyI6IUJsKG0pJiZRLmFkZChtKTticmVhaztjYXNlIm1lbW9FbnRpdGllcyI6IUtsKG0pJiZLLmFkZChtKTticmVha319KSx7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119fX1jb25zdCBZbD10PT5lPT4oe2lkOm4sbWV0YTpyfSk9PntpZihlKG4pKXJldHVybiExO2NvbnN0IHM9TWF0aC5mbG9vcih0LmRpZmYoZy5mcm9tTWlsbGlzKHIudXBkYXRlQXQpLCJkYXlzIikudG9PYmplY3QoKS5kYXlzPz8wKTtyZXR1cm4gSGw8c30sR2w9bmV3IHFsO3NlbGYub25jb25uZWN0PXQ9Pntjb25zdCBlPXQucG9ydHNbMF07T3QoR2wsZSl9fSkoKTsK";
|
|
26556
26556
|
function gR(e) {
|
|
26557
26557
|
return new SharedWorker(
|
|
26558
26558
|
"data:text/javascript;base64," + fR,
|
|
@@ -26561,7 +26561,7 @@ function gR(e) {
|
|
|
26561
26561
|
}
|
|
26562
26562
|
);
|
|
26563
26563
|
}
|
|
26564
|
-
const Qp = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGVuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLHVzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGNzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxTdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIikscWU9U3ltYm9sKCJDb21saW5rLnRocm93biIpLHRuPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLGZzPXtjYW5IYW5kbGU6dD0+dG4odCkmJnRbZW5dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gT3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLHlzKHQpfX0sZHM9e2NhbkhhbmRsZTp0PT50bih0KSYmcWUgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LG5uPW5ldyBNYXAoW1sicHJveHkiLGZzXSxbInRocm93Iixkc11dKTtmdW5jdGlvbiBocyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFocyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSxsPShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGFlKTtsZXQgdTt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgodyxoKT0+d1toXSx0KSxkPW8ucmVkdWNlKCh3LGgpPT53W2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6dT1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1hZShzLmRhdGEudmFsdWUpLHU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6dT1kLmFwcGx5KGMsbCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCB3PW5ldyBkKC4uLmwpO3U9U3Modyl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOncscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO090KHQsaCksdT1Ucyh3LFt3XSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjp1PXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7dT17dmFsdWU6YyxbcWVdOjB9fVByb21pc2UucmVzb2x2ZSh1KS5jYXRjaChjPT4oe3ZhbHVlOmMsW3FlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2Qsd109QmUoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSx3KSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxybihlKSxTdCBpbiB0JiZ0eXBlb2YgdFtTdF09PSJmdW5jdGlvbiImJnRbU3RdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2Qsd109QmUoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtxZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSksdyl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBtcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBybih0KXttcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIHlzKHQsZSl7cmV0dXJuIGt0KHQsW10sZSl9ZnVuY3Rpb24gWWUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHNuKHQpe3JldHVybiBnZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9Pntybih0KX0pfWNvbnN0IEdlPW5ldyBXZWFrTWFwLEplPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KEdlLmdldCh0KXx8MCktMTtHZS5zZXQodCxlKSxlPT09MCYmc24odCl9KTtmdW5jdGlvbiBncyh0LGUpe2NvbnN0IG49KEdlLmdldChlKXx8MCkrMTtHZS5zZXQoZSxuKSxKZSYmSmUucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIHdzKHQpe0plJiZKZS51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uIGt0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWWUociksYT09PWNzKXJldHVybigpPT57d3Mocyksc24odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPWdlKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcChsPT5sLnRvU3RyaW5nKCkpfSkudGhlbihhZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiBrdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtZZShyKTtjb25zdFtsLHVdPUJlKG8pO3JldHVybiBnZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6bH0sdSkudGhlbihhZSl9LGFwcGx5KGksYSxvKXtZZShyKTtjb25zdCBsPWVbZS5sZW5ndGgtMV07aWYobD09PXVzKXJldHVybiBnZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGFlKTtpZihsPT09ImJpbmQiKXJldHVybiBrdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W3UsY109YW4obyk7cmV0dXJuIGdlKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OnV9LGMpLnRoZW4oYWUpfSxjb25zdHJ1Y3QoaSxhKXtZZShyKTtjb25zdFtvLGxdPWFuKGEpO3JldHVybiBnZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAodT0+dS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sbCkudGhlbihhZSl9fSk7cmV0dXJuIGdzKHMsdCksc31mdW5jdGlvbiBwcyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBhbih0KXtjb25zdCBlPXQubWFwKEJlKTtyZXR1cm5bZS5tYXAobj0+blswXSkscHMoZS5tYXAobj0+blsxXSkpXX1jb25zdCBvbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBUcyh0LGUpe3JldHVybiBvbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFNzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1tlbl06ITB9KX1mdW5jdGlvbiBCZSh0KXtmb3IoY29uc3RbZSxuXW9mIG5uKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxvbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBhZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBubi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIGdlKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9T3MoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gT3MoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfXZhciBrcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsYnM9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixidD1rc3x8YnN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksd2U9YnQuU3ltYm9sLGxuPU9iamVjdC5wcm90b3R5cGUsdnM9bG4uaGFzT3duUHJvcGVydHksSXM9bG4udG9TdHJpbmcsQWU9d2U/d2UudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIEVzKHQpe3ZhciBlPXZzLmNhbGwodCxBZSksbj10W0FlXTt0cnl7dFtBZV09dm9pZCAwO3ZhciByPSEwfWNhdGNoe312YXIgcz1Jcy5jYWxsKHQpO3JldHVybiByJiYoZT90W0FlXT1uOmRlbGV0ZSB0W0FlXSksc312YXIgTnM9T2JqZWN0LnByb3RvdHlwZSxNcz1Ocy50b1N0cmluZztmdW5jdGlvbiB4cyh0KXtyZXR1cm4gTXMuY2FsbCh0KX12YXIgRHM9IltvYmplY3QgTnVsbF0iLENzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHVuPXdlP3dlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBjbih0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP0NzOkRzOnVuJiZ1biBpbiBPYmplY3QodCk/RXModCk6eHModCl9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In1mdW5jdGlvbiBGcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxzPUFycmF5KHIpOysrbjxyOylzW25dPWUodFtuXSxuLHQpO3JldHVybiBzfXZhciBBcz1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGZuKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGRuKHQpe3JldHVybiB0fXZhciBWcz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsV3M9IltvYmplY3QgRnVuY3Rpb25dIixMcz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCRzPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gaG4odCl7aWYoIWZuKHQpKXJldHVybiExO3ZhciBlPWNuKHQpO3JldHVybiBlPT1Xc3x8ZT09THN8fGU9PVZzfHxlPT0kc312YXIgSXQ9YnRbIl9fY29yZS1qc19zaGFyZWRfXyJdLG1uPWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhJdCYmSXQua2V5cyYmSXQua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBfcyh0KXtyZXR1cm4hIW1uJiZtbiBpbiB0fXZhciB6cz1GdW5jdGlvbi5wcm90b3R5cGUsUnM9enMudG9TdHJpbmc7ZnVuY3Rpb24gWnModCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBScy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgUHM9L1tcXF4kLiorPygpW1xde318XS9nLFVzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEhzPUZ1bmN0aW9uLnByb3RvdHlwZSxqcz1PYmplY3QucHJvdG90eXBlLHFzPUhzLnRvU3RyaW5nLFlzPWpzLmhhc093blByb3BlcnR5LEdzPVJlZ0V4cCgiXiIrcXMuY2FsbChZcykucmVwbGFjZShQcywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiBKcyh0KXtpZighZm4odCl8fF9zKHQpKXJldHVybiExO3ZhciBlPWhuKHQpP0dzOlVzO3JldHVybiBlLnRlc3QoWnModCkpfWZ1bmN0aW9uIEJzKHQsZSl7cmV0dXJuIHQ9PW51bGw/dm9pZCAwOnRbZV19ZnVuY3Rpb24gRXQodCxlKXt2YXIgbj1Ccyh0LGUpO3JldHVybiBKcyhuKT9uOnZvaWQgMH1mdW5jdGlvbiBRcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfXZhciBLcz04MDAsWHM9MTYsZWk9RGF0ZS5ub3c7ZnVuY3Rpb24gdGkodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZWkoKSxzPVhzLShyLW4pO2lmKG49cixzPjApe2lmKCsrZT49S3MpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZnVuY3Rpb24gbmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciB5bj1mdW5jdGlvbigpe3RyeXt2YXIgdD1FdChPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0oKSxyaT15bj9mdW5jdGlvbih0LGUpe3JldHVybiB5bih0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm5pKGUpLHdyaXRhYmxlOiEwfSl9OmRuLHNpPXJpLGlpPXRpKHNpKTtmdW5jdGlvbiBhaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBvaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gbGkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gdWkodCxlLG4pe3JldHVybiBlPT09ZT9saSh0LGUsbik6YWkodCxvaSxuKX1mdW5jdGlvbiBjaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJnVpKHQsZSwwKT4tMX1mdW5jdGlvbiBmaSh0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBnbj1NYXRoLm1heDtmdW5jdGlvbiBkaSh0LGUsbil7cmV0dXJuIGU9Z24oZT09PXZvaWQgMD90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLHM9LTEsaT1nbihyLmxlbmd0aC1lLDApLGE9QXJyYXkoaSk7KytzPGk7KWFbc109cltlK3NdO3M9LTE7Zm9yKHZhciBvPUFycmF5KGUrMSk7KytzPGU7KW9bc109cltzXTtyZXR1cm4gb1tlXT1uKGEpLFFzKHQsdGhpcyxvKX19ZnVuY3Rpb24gaGkodCxlKXtyZXR1cm4gaWkoZGkodCxlLGRuKSx0KyIiKX12YXIgbWk9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiB5aSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PW1pfWZ1bmN0aW9uIGdpKHQpe3JldHVybiB0IT1udWxsJiZ5aSh0Lmxlbmd0aCkmJiFobih0KX12YXIgd2k9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gd24odCl7cmV0dXJuIHZ0KHQpJiZjbih0KT09d2l9dmFyIHBuPU9iamVjdC5wcm90b3R5cGUscGk9cG4uaGFzT3duUHJvcGVydHksVGk9cG4ucHJvcGVydHlJc0VudW1lcmFibGUsU2k9d24oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT93bjpmdW5jdGlvbih0KXtyZXR1cm4gdnQodCkmJnBpLmNhbGwodCwiY2FsbGVlIikmJiFUaS5jYWxsKHQsImNhbGxlZSIpfTtmdW5jdGlvbiBPaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBWZT1FdChPYmplY3QsImNyZWF0ZSIpO2Z1bmN0aW9uIGtpKCl7dGhpcy5fX2RhdGFfXz1WZT9WZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgdmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLElpPU9iamVjdC5wcm90b3R5cGUsRWk9SWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTmkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihWZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXZpP3ZvaWQgMDpufXJldHVybiBFaS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIE1pPU9iamVjdC5wcm90b3R5cGUseGk9TWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gRGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gVmU/ZVt0XSE9PXZvaWQgMDp4aS5jYWxsKGUsdCl9dmFyIENpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBGaSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09VmUmJmU9PT12b2lkIDA/Q2k6ZSx0aGlzfWZ1bmN0aW9uIG9lKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fW9lLnByb3RvdHlwZS5jbGVhcj1raSxvZS5wcm90b3R5cGUuZGVsZXRlPWJpLG9lLnByb3RvdHlwZS5nZXQ9Tmksb2UucHJvdG90eXBlLmhhcz1EaSxvZS5wcm90b3R5cGUuc2V0PUZpO2Z1bmN0aW9uIEFpKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKGZpKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIFZpPUFycmF5LnByb3RvdHlwZSxXaT1WaS5zcGxpY2U7ZnVuY3Rpb24gTGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVFlKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpXaS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiAkaSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49UWUoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIF9pKHQpe3JldHVybiBRZSh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIHppKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPVFlKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gcGUodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19cGUucHJvdG90eXBlLmNsZWFyPUFpLHBlLnByb3RvdHlwZS5kZWxldGU9TGkscGUucHJvdG90eXBlLmdldD0kaSxwZS5wcm90b3R5cGUuaGFzPV9pLHBlLnByb3RvdHlwZS5zZXQ9emk7dmFyIFJpPUV0KGJ0LCJNYXAiKTtmdW5jdGlvbiBaaSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IG9lLG1hcDpuZXcoUml8fHBlKSxzdHJpbmc6bmV3IG9lfX1mdW5jdGlvbiBQaSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBLZSh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIFBpKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVWkodCl7dmFyIGU9S2UodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gS2UodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gamkodCl7cmV0dXJuIEtlKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIHFpKHQsZSl7dmFyIG49S2UodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1UZS5wcm90b3R5cGUuY2xlYXI9WmksVGUucHJvdG90eXBlLmRlbGV0ZT1VaSxUZS5wcm90b3R5cGUuZ2V0PUhpLFRlLnByb3RvdHlwZS5oYXM9amksVGUucHJvdG90eXBlLnNldD1xaTtmdW5jdGlvbiBZaSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLHM9dC5sZW5ndGg7KytuPHI7KXRbcytuXT1lW25dO3JldHVybiB0fXZhciBUbj13ZT93ZS5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEdpKHQpe3JldHVybiBBcyh0KXx8U2kodCl8fCEhKFRuJiZ0JiZ0W1RuXSl9ZnVuY3Rpb24gU24odCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1HaSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP1NuKG8sZS0xLG4scixzKTpZaShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc312YXIgSmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIEJpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LEppKSx0aGlzfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX1mdW5jdGlvbiBYZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgVGU7KytlPG47KXRoaXMuYWRkKHRbZV0pfVhlLnByb3RvdHlwZS5hZGQ9WGUucHJvdG90eXBlLnB1c2g9QmksWGUucHJvdG90eXBlLmhhcz1RaTtmdW5jdGlvbiBLaSh0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdnQodCkmJmdpKHQpfWZ1bmN0aW9uIFhpKHQsZSxuKXtmb3IodmFyIHI9LTEscz10PT1udWxsPzA6dC5sZW5ndGg7KytyPHM7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgZWE9MjAwO2Z1bmN0aW9uIHRhKHQsZSxuLHIpe3ZhciBzPS0xLGk9Y2ksYT0hMCxvPXQubGVuZ3RoLGw9W10sdT1lLmxlbmd0aDtpZighbylyZXR1cm4gbDtuJiYoZT1GcyhlLE9pKG4pKSkscj8oaT1YaSxhPSExKTplLmxlbmd0aD49ZWEmJihpPUtpLGE9ITEsZT1uZXcgWGUoZSkpO2U6Zm9yKDsrK3M8bzspe3ZhciBjPXRbc10sZD1uPT1udWxsP2M6bihjKTtpZihjPXJ8fGMhPT0wP2M6MCxhJiZkPT09ZCl7Zm9yKHZhciB3PXU7dy0tOylpZihlW3ddPT09ZCljb250aW51ZSBlO2wucHVzaChjKX1lbHNlIGkoZSxkLHIpfHxsLnB1c2goYyl9cmV0dXJuIGx9dmFyIG5hPWhpKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9uKHQpP3RhKHQsU24oZSwxLE9uLCEwKSk6W119KTtmdW5jdGlvbiAkKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9Y29uc3QgV2U9dD0+ZT0+dHlwZW9mIGU9PT10LHJhPVdlKCJvYmplY3QiKSxOdD1XZSgiYm9vbGVhbiIpLEU9V2UoIm51bWJlciIpLEY9V2UoInN0cmluZyIpLHNhPVdlKCJ1bmRlZmluZWQiKSxrbj10PT50PT09bnVsbCxHPXQ9PmtuKHQpfHxzYSh0KSx7aXNBcnJheTpYfT1BcnJheSxVPXQ9PnJhKHQpJiYha24odCkmJiFYKHQpOygodCxlLG4pPT57bGV0IHI9KDI8PE1hdGgubG9nKHQubGVuZ3RoLTEpL01hdGguTE4yKS0xLHM9LX4oMS42KnIqZS90Lmxlbmd0aCk7cmV0dXJuKGk9ZSk9PntsZXQgYT0iIjtmb3IoOzspe2xldCBvPW4ocyksbD1zO2Zvcig7bC0tOylpZihhKz10W29bbF0mcl18fCIiLGEubGVuZ3RoPT09aSlyZXR1cm4gYX19fSkoInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QiLDIxLHQ9PntsZXQgZT1nbG9iYWxUaGlzLmNyeXB0bztyZXR1cm4gZT09PXZvaWQgMCYmKGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKS53ZWJjcnlwdG8pLGUuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKX0pO2NvbnN0IE10PSh0LGUpPT5uPT5NYXRoLm1pbihNYXRoLm1heChuLHQpLGUpOy8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgU3VuIE9jdCAyMCAyMDI0CiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBwKHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9PkUoZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gU2UoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gT2UodCxlKXtjb25zdCBuPXAoRSx0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBpYT0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIGFhKHQpe2NvbnN0IGU9aWEoKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXAoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgb2E9KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBsYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9b2EoKSxzPXAoRixyLG4pLGk9cChOdCxyLG4pLGE9cChYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBibj17QVNDOjEsREVTQzoyfSx1YT1PYmplY3QudmFsdWVzKGJuKSxjYT0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpibi5BU0MsbWV0YTpTZSgpfSk7ZnVuY3Rpb24gZmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPWNhKCkscz1wKEYscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHAoSCh1YSkscixuKSgib3JkZXJUeXBlIiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgZGE9KCk9Pih7fSk7ZnVuY3Rpb24gaGEodCl7Y29uc3QgZT1kYSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihGKHMpJiZFKGkpJiZFKGEpJiZVKG8pKXtjb25zdCBsPXt9LHU9cChFLGwsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaCh1KSxlW25dPVtzLGksYSxsXX19cmV0dXJuIGV9Y29uc3QgbWE9KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOlNlKCl9KTtmdW5jdGlvbiB5YSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9bWEoKSxzPXAoRixyLG4pLGk9cChFLHIudWksbi51aSksYT1wKEYsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0IiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qgdm49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSxnYT1PYmplY3QudmFsdWVzKHZuKSxJbj17cmluZzoxLGRhc2g6Mn0sd2E9T2JqZWN0LnZhbHVlcyhJbikseHQ9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSxFbj1PYmplY3QudmFsdWVzKHh0KSxwYT0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOnZuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTpJbi5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjp4dC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246eHQuYm90dG9tfSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBUYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9cGEoKSxzPXAoRixyLG4pLGk9cChOdCxyLG4pLGE9cChFLHIuc3RhcnQsbi5zdGFydCksbz1wKEYsci5zdGFydCxuLnN0YXJ0KSxsPXAoRSxyLmVuZCxuLmVuZCksdT1wKEYsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSxwKEgoZ2EpLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSxwKEgod2EpLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHAoSChFbiksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIikscChYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLHUoInRhYmxlSWQiKSxsKCJ4IiksbCgieSIpLHAoSChFbiksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSxwKFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBTYT17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LGxlPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxObj1PYmplY3QudmFsdWVzKGVlKSxNbj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sT2E9T2JqZWN0LnZhbHVlcyhNbikseG49e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LGthPU9iamVjdC52YWx1ZXMoeG4pLER0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxEbj1PYmplY3QudmFsdWVzKER0KSxDbj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxiYT1PYmplY3QudmFsdWVzKENuKSx2YT0uMSxJYT0xLEVhPTJlMyxOYT0yZTQsTWE9bGUudGFibGVDb21tZW50fGxlLmNvbHVtbkNvbW1lbnR8bGUuY29sdW1uRGF0YVR5cGV8bGUuY29sdW1uRGVmYXVsdHxsZS5jb2x1bW5QcmltYXJ5S2V5fGxlLmNvbHVtbk5vdE51bGx8bGUucmVsYXRpb25zaGlwLHhhPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93Ok1hLGRhdGFiYXNlOk1uLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOlNhLkVSRCxsYW5ndWFnZTp4bi5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6RHQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpEdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6Q24ubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTEsaWdub3JlU2F2ZVNldHRpbmdzOjB9KSxGbj1NdChFYSxOYSksRGE9TXQodmEsSWEpLENhPU10KDYwLDIwMCk7ZnVuY3Rpb24gRmEodCl7Y29uc3QgZT14YSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49cChFLGUsdCkscj1wKEYsZSx0KSxzPXAoTnQsZSx0KTtyZXR1cm4gRSh0LndpZHRoKSYmKGUud2lkdGg9Rm4odC53aWR0aCkpLEUodC5oZWlnaHQpJiYoZS5oZWlnaHQ9Rm4odC5oZWlnaHQpKSxFKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPURhKHQuem9vbUxldmVsKSksRSh0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1DYSh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IiksbigiaWdub3JlU2F2ZVNldHRpbmdzIikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHAoSChPYSksZSx0KSgiZGF0YWJhc2UiKSxwKEgoa2EpLGUsdCkoImxhbmd1YWdlIikscChIKERuKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIikscChIKERuKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHAoSChiYSksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZObi5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmbmEoTm4sdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBBYT0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gVmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUFhKCkscz1wKEYscixuKSxpPXAoWCxyLG4pLGE9cChFLHIudWksbi51aSksbz1wKEYsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLE9lKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFdhPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gTGEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVdhKCkscz1wKEYscixuKSxpPXAoRSxyLG4pLGE9cChFLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiAkYSh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LGw9RmEoby5zZXR0aW5ncyksdT1hYShvLmRvYyksYz1oYShvLmx3dyksZD1WYSgoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSx3PUxhKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9VGEoKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLGs9bGEoKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksUD1mYSgoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPXlhKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJueyRzY2hlbWE6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kaW5ldWcvZXJkLWVkaXRvci9tYWluL2pzb24tc2NoZW1hL3NjaGVtYS5qc29uIix2ZXJzaW9uOiIzLjAuMCIsc2V0dGluZ3M6bCxkb2M6dSxjb2xsZWN0aW9uczp7dGFibGVFbnRpdGllczpkLHRhYmxlQ29sdW1uRW50aXRpZXM6dyxyZWxhdGlvbnNoaXBFbnRpdGllczpoLGluZGV4RW50aXRpZXM6ayxpbmRleENvbHVtbkVudGl0aWVzOlAsbWVtb0VudGl0aWVzOk19LGx3dzpjfX1mdW5jdGlvbiBfYSh0KXtyZXR1cm5bdCwtMSwtMSx7fV19ZnVuY3Rpb24gQ3QodCxlLG4pe3JldHVybiB0W2VdfHwodFtlXT1fYShuKSx0W2VdKX1mdW5jdGlvbiB6YSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsxXSxvPWlbMl07YTxlJiYoaVsxXT1lKSxvPGUmJnMoKX1mdW5jdGlvbiBSYSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsyXSxvPWlbMV07YTxlJiYoaVsyXT1lKSxvPD1lJiZzKCl9ZnVuY3Rpb24gWmEodCxlLG4scixzLGkpe2NvbnN0IGE9Q3QodCxuLHIpOyhhWzNdW3NdPz8tMSk8PWUmJihhWzNdW3NdPWUsaSgpKX1jbGFzcyBQYXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbnMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9Y29sbGVjdGlvbihlKXtyZXR1cm4gbmV3IFVhKHRoaXMuY29sbGVjdGlvbnNbZV0sZSl9fWNsYXNzIFVhe2NvbnN0cnVjdG9yKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb25LZXkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSl9c2VsZWN0QnlJZChlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2VdfXNlbGVjdEJ5SWRzKGUpe3JldHVybiBlLmxlbmd0aCxlLm1hcChuPT50aGlzLnNlbGVjdEJ5SWQobikpLmZpbHRlcihCb29sZWFuKX1zZWxlY3RFbnRpdGllcygpe3JldHVybiB0aGlzLmNvbGxlY3Rpb259c2VsZWN0QWxsKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb2xsZWN0aW9uKX1zZXRPbmUoZSl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbltlLmlkXT1lLHRoaXN9c2V0TWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMuc2V0T25lKG4pKSx0aGlzfXNldEFsbChlKXtyZXR1cm4gdGhpcy5yZW1vdmVBbGwoKSx0aGlzLnNldE1hbnkoZSksdGhpc31hZGRPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlLmlkKT90aGlzOih0aGlzLnNldE9uZShlKSx0aGlzKX1hZGRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5hZGRPbmUobikpLHRoaXN9cmVtb3ZlT25lKGUpe3JldHVybiB0aGlzLnNlbGVjdEJ5SWQoZSkmJlJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5jb2xsZWN0aW9uLGUpLHRoaXN9cmVtb3ZlTWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMucmVtb3ZlT25lKG4pKSx0aGlzfXJlbW92ZUFsbCgpe3JldHVybiB0aGlzLmNvbGxlY3Rpb249e30sdGhpc311cGRhdGVPbmUoZSxuKXtjb25zdCByPXRoaXMuc2VsZWN0QnlJZChlKTtyZXR1cm4gciYmKG4ociksci5tZXRhLnVwZGF0ZUF0PURhdGUubm93KCkpLHRoaXN9dXBkYXRlTWFueShlLG4pe3JldHVybiBlLmZvckVhY2gocj0+dGhpcy51cGRhdGVPbmUocixuKSksdGhpc31nZXRPckNyZWF0ZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO2lmKHIpcmV0dXJuIHI7Y29uc3Qgcz1uKGUpO3JldHVybiB0aGlzLnNldE9uZShzKSx0aGlzLnNlbGVjdEJ5SWQoZSl9YWRkT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIHphKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlbW92ZU9wZXJhdG9yKGUsbixyLHMpe3JldHVybiBSYShlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyksdGhpc31yZXBsYWNlT3BlcmF0b3IoZSxuLHIscyxpKXtyZXR1cm4gWmEoZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMsaSksdGhpc319Y29uc3QgQT10PT5uZXcgUGEodCk7Y2xhc3MgdWUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgSGEgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBqYSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHFhIGV4dGVuZHMgdWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3Mga2UgZXh0ZW5kcyB1ZXt9Y2xhc3MgQW4gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgRCBleHRlbmRzIHVle31jbGFzcyB0ZSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsXz0ic2hvcnQiLEM9ImxvbmciLGV0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sVm49e3llYXI6Zixtb250aDpfLGRheTpmfSxZYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpffSxXbj17eWVhcjpmLG1vbnRoOkMsZGF5OmZ9LExuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkN9LCRuPXtob3VyOmYsbWludXRlOmZ9LF9uPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHpuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOl99LFJuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkN9LFpuPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxQbj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sVW49e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOl99LEhuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpDfSxqbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxxbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxZbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxHbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxHYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpfLGhvdXI6ZixtaW51dGU6Zn0sSm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6X30sQm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6X30sUW49e3llYXI6Zixtb250aDpDLGRheTpmLHdlZWtkYXk6Qyxob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkN9LEtuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkMsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpDfTtjbGFzcyBMZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBGdD1udWxsO2NsYXNzIHR0IGV4dGVuZHMgTGV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBGdD09PW51bGwmJihGdD1uZXcgdHQpLEZ0fWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIGtyKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IG50PXt9O2Z1bmN0aW9uIEphKHQpe3JldHVybiBudFt0XXx8KG50W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxudFt0XX1jb25zdCBCYT17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBRYSh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyxsLHUsY109cjtyZXR1cm5bYSxzLGksbyxsLHUsY119ZnVuY3Rpb24gS2EodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPUJhW2ldO2k9PT0iZXJhIj9yW29dPWE6eShvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCBydD17fTtjbGFzcyBKIGV4dGVuZHMgTGV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gcnRbZV18fChydFtlXT1uZXcgSihlKSkscnRbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXtydD17fSxudD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4ga3IoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPUphKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sbCx1LGNdPXIuZm9ybWF0VG9QYXJ0cz9LYShyLG4pOlFhKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCB3PWx0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOmw9PT0yND8wOmwsbWludXRlOnUsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IGs9aCUxZTM7cmV0dXJuIGgtPWs+PTA/azoxZTMraywody1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBYbj17fTtmdW5jdGlvbiBYYSh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVhuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksWG5bbl09cikscn1sZXQgQXQ9e307ZnVuY3Rpb24gVnQodCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj1BdFtuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSxBdFtuXT1yKSxyfWxldCBXdD17fTtmdW5jdGlvbiBlbyh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVd0W25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxXdFtuXT1yKSxyfWxldCBMdD17fTtmdW5jdGlvbiB0byh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPUx0W3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxMdFtzXT1pKSxpfWxldCAkZT1udWxsO2Z1bmN0aW9uIG5vKCl7cmV0dXJuICRlfHwoJGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsJGUpfWxldCBlcj17fTtmdW5jdGlvbiBybyh0KXtsZXQgZT1lclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxlclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIHNvKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPVZ0KHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCBsPXQuc3Vic3RyaW5nKDAsbik7cj1WdChsKS5yZXNvbHZlZE9wdGlvbnMoKSxzPWx9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBpbyh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIGFvKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPWcudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb28odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1nLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiBzdCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyB1b3tjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPWVvKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6VXQoZSwzKTtyZXR1cm4gSShuLHRoaXMucGFkVG8pfX19Y2xhc3MgY297Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9VnQobixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgZm97Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZwcigpJiYodGhpcy5ydGY9dG8oZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOkZvKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBobz17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIE97c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBPLmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fHYuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6bm8oKSksbD1ufHx2LmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sdT1yfHx2LmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPVp0KHMpfHx2LmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBPKG8sbCx1LGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXskZT1udWxsLEF0PXt9LFd0PXt9LEx0PXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIE8uY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLGxdPXNvKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fGx8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9aW8odGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPWxvKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6Ty5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLFp0KGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiBzdCh0aGlzLGUsSXIsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPWFvKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gc3QodGhpcyxlLE1yLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1vbyhpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gc3QodGhpcyx2b2lkIDAsKCk9PnhyLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W2cudXRjKDIwMTYsMTEsMTMsOSksZy51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHN0KHRoaXMsZSxEciwoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W2cudXRjKC00MCwxLDEpLGcudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgdW8odGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IGNvKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IGZvKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFhhKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6VHIoKT9ybyh0aGlzLmxvY2FsZSk6aG99Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0ICR0PW51bGw7Y2xhc3MgeCBleHRlbmRzIExle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gJHQ9PT1udWxsJiYoJHQ9bmV3IHgoMCkpLCR0fXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/eC51dGNJbnN0YW5jZTpuZXcgeChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IHgodXQoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke1JlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7UmUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIFJlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBtbyBleHRlbmRzIExle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZih5KHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgTGUpcmV0dXJuIHQ7aWYod28odCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj90dC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij94LnV0Y0luc3RhbmNlOngucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP3guaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBtbyh0KX1sZXQgdHI9KCk9PkRhdGUubm93KCksbnI9InN5c3RlbSIscnI9bnVsbCxzcj1udWxsLGlyPW51bGwsYXI9NjAsb3IsbHI9bnVsbDtjbGFzcyB2e3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIHRyfXN0YXRpYyBzZXQgbm93KGUpe3RyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtucj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUobnIsdHQuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiBycn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7cnI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gc3J9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe3NyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gaXJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7aXI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gbHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe2xyPVp0KGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIGFyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe2FyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gb3J9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtvcj1lfXN0YXRpYyByZXNldENhY2hlcygpe08ucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyB6e2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QgdXI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sY3I9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVih0LGUpe3JldHVybiBuZXcgeigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIF90KHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gZnIodCxlLG4pe3JldHVybiBuKyhfZSh0KT9jcjp1cilbZS0xXX1mdW5jdGlvbiBkcih0LGUpe2NvbnN0IG49X2UodCk/Y3I6dXIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHp0KHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gaXQodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPWZyKHIscyxpKSxvPXp0KF90KHIscyxpKSxuKTtsZXQgbD1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksdTtyZXR1cm4gbDwxPyh1PXItMSxsPXplKHUsZSxuKSk6bD56ZShyLGUsbik/KHU9cisxLGw9MSk6dT1yLHt3ZWVrWWVhcjp1LHdlZWtOdW1iZXI6bCx3ZWVrZGF5Om8sLi4uZnQodCl9fWZ1bmN0aW9uIGhyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9enQoX3QociwxLGUpLG4pLG89dmUocik7bGV0IGw9cyo3K2ktYS03K2UsdTtsPDE/KHU9ci0xLGwrPXZlKHUpKTpsPm8/KHU9cisxLGwtPXZlKHIpKTp1PXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09ZHIodSxsKTtyZXR1cm57eWVhcjp1LG1vbnRoOmMsZGF5OmQsLi4uZnQodCl9fWZ1bmN0aW9uIFJ0KHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9ZnIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLmZ0KHQpfX1mdW5jdGlvbiBtcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1kcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5mdCh0KX19ZnVuY3Rpb24geXIodCxlKXtpZigheSh0LmxvY2FsV2Vla2RheSl8fCF5KHQubG9jYWxXZWVrTnVtYmVyKXx8IXkodC5sb2NhbFdlZWtZZWFyKSl7aWYoIXkodC53ZWVrZGF5KXx8IXkodC53ZWVrTnVtYmVyKXx8IXkodC53ZWVrWWVhcikpdGhyb3cgbmV3IGtlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiB5KHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSkseSh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLHkodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24geW8odCxlPTQsbj0xKXtjb25zdCByPWF0KHQud2Vla1llYXIpLHM9Vyh0LndlZWtOdW1iZXIsMSx6ZSh0LndlZWtZZWFyLGUsbikpLGk9Vyh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vigid2Vla2RheSIsdC53ZWVrZGF5KTpWKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlYoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBnbyh0KXtjb25zdCBlPWF0KHQueWVhciksbj1XKHQub3JkaW5hbCwxLHZlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vigib3JkaW5hbCIsdC5vcmRpbmFsKTpWKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIGdyKHQpe2NvbnN0IGU9YXQodC55ZWFyKSxuPVcodC5tb250aCwxLDEyKSxyPVcodC5kYXksMSxvdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpWKCJkYXkiLHQuZGF5KTpWKCJtb250aCIsdC5tb250aCk6VigieWVhciIsdC55ZWFyKX1mdW5jdGlvbiB3cih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPVcoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9VyhuLDAsNTkpLG89VyhyLDAsNTkpLGw9VyhzLDAsOTk5KTtyZXR1cm4gaT9hP28/bD8hMTpWKCJtaWxsaXNlY29uZCIscyk6Vigic2Vjb25kIixyKTpWKCJtaW51dGUiLG4pOlYoImhvdXIiLGUpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gd28odCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBwbyh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHByKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFRyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVG8odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gU3IodCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gU28odCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIFp0KHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBEKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoIVcodC5maXJzdERheSwxLDcpfHwhVyh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiFXKGUsMSw3KSkpdGhyb3cgbmV3IEQoIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uIFcodCxlLG4pe3JldHVybiBhdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBPbyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEkodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gUHQodCl7aWYoISh5KHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBVdCh0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4gX2UodCk/MzY2OjM2NX1mdW5jdGlvbiBvdCh0LGUpe2NvbnN0IG49T28oZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/X2Uocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gbHQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gT3IodCxlLG4pe3JldHVybi16dChfdCh0LDEsZSksbikrZS0xfWZ1bmN0aW9uIHplKHQsZT00LG49MSl7Y29uc3Qgcj1Pcih0LGUsbikscz1Pcih0KzEsZSxuKTtyZXR1cm4odmUodCktcitzKS83fWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0Pjk5P3Q6dD52LnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24ga3IodCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKGw9PmwudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiB1dCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBicih0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgRChgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBjdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPWJyKHMpfXJldHVybiBufWZ1bmN0aW9uIFJlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7SShuLDIpfToke0kociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtJKG4sMil9JHtJKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBmdCh0KXtyZXR1cm4gU28odCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCBrbz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sdnI9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxibz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIElyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmJvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4udnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmtvXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IEVyPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxOcj1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLHZvPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIE1yKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnZvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uTnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLkVyXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IHhyPVsiQU0iLCJQTSJdLElvPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sRW89WyJCQyIsIkFEIl0sTm89WyJCIiwiQSJdO2Z1bmN0aW9uIERyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLk5vXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uRW9dO2Nhc2UibG9uZyI6cmV0dXJuWy4uLklvXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBNbyh0KXtyZXR1cm4geHJbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24geG8odCxlKXtyZXR1cm4gTXIoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIERvKHQsZSl7cmV0dXJuIElyKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gQ28odCxlKXtyZXR1cm4gRHIoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBGbyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSxsPW89PT0xLHU9c1t0XSxjPXI/bD91WzFdOnVbMl18fHVbMV06bD9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIENyKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgQW89e0Q6ZXQsREQ6Vm4sREREOlduLEREREQ6TG4sdDokbix0dDpfbix0dHQ6em4sdHR0dDpSbixUOlpuLFRUOlBuLFRUVDpVbixUVFRUOkhuLGY6am4sZmY6WW4sZmZmOkpuLGZmZmY6UW4sRjpxbixGRjpHbixGRkY6Qm4sRkZGRjpLbn07Y2xhc3MgTntzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyBOKGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIEFvW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEkoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLGspPT50aGlzLmxvYy5leHRyYWN0KGUsaCxrKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9NbyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSxsPShoLGspPT5yP0RvKGUsaCk6aShrP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSx1PShoLGspPT5yP3hvKGUsaCk6aShrP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3Qgaz1OLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIGs/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLGspOmh9LGQ9aD0+cj9DbyhlLGgpOmkoe2VyYTpofSwiZXJhIiksdz1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gdSgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiB1KCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIHUoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiB1KCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIHUoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gdSgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiBsKCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIGwoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gbCgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIGwoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gbCgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiBsKCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIENyKE4ucGFyc2VGb3JtYXQobiksdyl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj1sPT57c3dpdGNoKGxbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9bD0+dT0+e2NvbnN0IGM9cih1KTtyZXR1cm4gYz90aGlzLm51bShsLmdldChjKSx1Lmxlbmd0aCk6dX0saT1OLnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKGwse2xpdGVyYWw6dSx2YWw6Y30pPT51P2w6bC5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcihsPT5sKSk7cmV0dXJuIENyKGkscyhvKSl9fWNvbnN0IEZyPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sbF09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLGxdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIEFyKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IFZyPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyxWbz1gKD86JHtWci5zb3VyY2V9Pyg/OlxcWygke0ZyLnNvdXJjZX0pXFxdKT8pP2AsanQ9LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8sV3I9UmVnRXhwKGAke2p0LnNvdXJjZX0ke1ZvfWApLHF0PVJlZ0V4cChgKD86VCR7V3Iuc291cmNlfSk/YCksV289LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLExvPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLCRvPS8oXGR7NH0pLT8oXGR7M30pLyxfbz1Bcigid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLHpvPUFyKCJ5ZWFyIiwib3JkaW5hbCIpLFJvPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLExyPVJlZ0V4cChgJHtqdC5zb3VyY2V9ID8oPzoke1ZyLnNvdXJjZX18KCR7RnIuc291cmNlfSkpP2ApLFpvPVJlZ0V4cChgKD86ICR7THIuc291cmNlfSk/YCk7ZnVuY3Rpb24gTWUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4geShyKT9uOnJlKHIpfWZ1bmN0aW9uIFBvKHQsZSl7cmV0dXJuW3t5ZWFyOk1lKHQsZSksbW9udGg6TWUodCxlKzEsMSksZGF5Ok1lKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24geGUodCxlKXtyZXR1cm5be2hvdXJzOk1lKHQsZSwwKSxtaW51dGVzOk1lKHQsZSsxLDApLHNlY29uZHM6TWUodCxlKzIsMCksbWlsbGlzZWNvbmRzOlB0KHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBaZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj11dCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDp4Lmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gUGUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IFVvPVJlZ0V4cChgXlQ/JHtqdC5zb3VyY2V9JGApLEhvPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIGpvKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sbCx1XT10LGM9ZVswXT09PSItIixkPWwmJmxbMF09PT0iLSIsdz0oaCxrPSExKT0+aCE9PXZvaWQgMCYmKGt8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczp3KGZlKG4pKSxtb250aHM6dyhmZShyKSksd2Vla3M6dyhmZShzKSksZGF5czp3KGZlKGkpKSxob3Vyczp3KGZlKGEpKSxtaW51dGVzOncoZmUobykpLHNlY29uZHM6dyhmZShsKSxsPT09Ii0wIiksbWlsbGlzZWNvbmRzOncoUHQodSksZCl9XX1jb25zdCBxbz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gWXQodCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/SHQocmUoZSkpOnJlKGUpLG1vbnRoOnZyLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9Fci5pbmRleE9mKHQpKzE6TnIuaW5kZXhPZih0KSsxKSxvfWNvbnN0IFlvPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gR28odCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sbCx1LGMsZF09dCx3PVl0KGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiBsP2g9cW9bbF06dT9oPTA6aD11dChjLGQpLFt3LG5ldyB4KGgpXX1mdW5jdGlvbiBKbyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IEJvPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sUW89L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sS289L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uICRyKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltZdChlLHMscixuLGksYSxvKSx4LnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBYbyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bWXQoZSxvLG4scixzLGksYSkseC51dGNJbnN0YW5jZV19Y29uc3QgZWw9SWUoV28scXQpLHRsPUllKExvLHF0KSxubD1JZSgkbyxxdCkscmw9SWUoV3IpLF9yPUVlKFBvLHhlLFplLFBlKSxzbD1FZShfbyx4ZSxaZSxQZSksaWw9RWUoem8seGUsWmUsUGUpLGFsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBvbCh0KXtyZXR1cm4gTmUodCxbZWwsX3JdLFt0bCxzbF0sW25sLGlsXSxbcmwsYWxdKX1mdW5jdGlvbiBsbCh0KXtyZXR1cm4gTmUoSm8odCksW1lvLEdvXSl9ZnVuY3Rpb24gdWwodCl7cmV0dXJuIE5lKHQsW0JvLCRyXSxbUW8sJHJdLFtLbyxYb10pfWZ1bmN0aW9uIGNsKHQpe3JldHVybiBOZSh0LFtIbyxqb10pfWNvbnN0IGZsPUVlKHhlKTtmdW5jdGlvbiBkbCh0KXtyZXR1cm4gTmUodCxbVW8sZmxdKX1jb25zdCBobD1JZShSbyxabyksbWw9SWUoTHIpLHlsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBnbCh0KXtyZXR1cm4gTmUodCxbaGwsX3JdLFttbCx5bF0pfWNvbnN0IHpyPSJJbnZhbGlkIER1cmF0aW9uIixScj17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSx3bD17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Scn0sTD0xNDYwOTcvNDAwLERlPTE0NjA5Ny80ODAwLHBsPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6RGUvNyxkYXlzOkRlLGhvdXJzOkRlKjI0LG1pbnV0ZXM6RGUqMjQqNjAsc2Vjb25kczpEZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6RGUqMjQqNjAqNjAqMWUzfSwuLi5Scn0sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLFRsPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgVChyKX1mdW5jdGlvbiBacih0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIFRsLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBQcih0LGUpe2NvbnN0IG49WnIodCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZih5KGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKHkoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIFNsKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3MgVHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj9wbDp3bDtlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxPLmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gVC5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IEQoYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgVCh7dmFsdWVzOmN0KGUsVC5ub3JtYWxpemVVbml0KSxsb2M6Ty5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gVC5mcm9tTWlsbGlzKGUpO2lmKFQuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIFQuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgRChgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPWNsKGUpO3JldHVybiByP1QuZnJvbU9iamVjdChyLG4pOlQuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09ZGwoZSk7cmV0dXJuIHI/VC5mcm9tT2JqZWN0KHIsbik6VC5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHFhKHIpO3JldHVybiBuZXcgVCh7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgQW4oZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6enJ9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB6cjtjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4geShzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPVV0KHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxnLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/WnIodGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09YnIoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW1Qubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uY3QoZSxULm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gUHIodGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPVNsKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT5ULm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCB1IGluIHIpbys9dGhpcy5tYXRyaXhbdV1bYV0qclt1XSxyW3VdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCBsPU1hdGgudHJ1bmMobyk7blthXT1sLHJbYV09KG8qMWUzLWwqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFByKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IENlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBPbCh0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2IuaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/Yi5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2IuaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3MgYntjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IGphKHIpO3JldHVybiBuZXcgYih7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUhlKGUpLHM9SGUobiksaT1PbChyLHMpO3JldHVybiBpPz9uZXcgYih7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPWcuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sbDt0cnl7bz1nLmZyb21JU08ocyxuKSxsPW8uaXNWYWxpZH1jYXRjaHtsPSExfWlmKGEmJmwpcmV0dXJuIGIuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IHU9VC5mcm9tSVNPKHMsbik7aWYodS5pc1ZhbGlkKXJldHVybiBiLmFmdGVyKGksdSl9ZWxzZSBpZihsKXtjb25zdCB1PVQuZnJvbUlTTyhyLG4pO2lmKHUuaXNWYWxpZClyZXR1cm4gYi5iZWZvcmUobyx1KX19cmV0dXJuIGIuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9iLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChIZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGIuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49VC5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHMobD0+bCpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChiLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDpiLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBiLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKGw9Plt7dGltZTpsLnMsdHlwZToicyJ9LHt0aW1lOmwuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKGwsdSk9PmwudGltZS11LnRpbWUpO2Zvcihjb25zdCBsIG9mIG8pcis9bC50eXBlPT09InMiPzE6LTEscj09PTE/bj1sLnRpbWU6KG4mJituIT0rbC50aW1lJiZzLnB1c2goYi5mcm9tRGF0ZVRpbWVzKG4sbC50aW1lKSksbj1udWxsKTtyZXR1cm4gYi5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBiLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkNlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9ZXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkNlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkNlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkNlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkNlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpDZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTpULmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgZHR7c3RhdGljIGhhc0RTVChlPXYuZGVmYXVsdFpvbmUpe2NvbnN0IG49Zy5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLHYuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fE8uY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8Ty5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxPLmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8Ty5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBPLmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gTy5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6cHIoKSxsb2NhbGVXZWVrOlRyKCl9fX1mdW5jdGlvbiBVcih0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKFQuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiBrbCh0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKGwsdSk9PnUueWVhci1sLnllYXJdLFsicXVhcnRlcnMiLChsLHUpPT51LnF1YXJ0ZXItbC5xdWFydGVyKyh1LnllYXItbC55ZWFyKSo0XSxbIm1vbnRocyIsKGwsdSk9PnUubW9udGgtbC5tb250aCsodS55ZWFyLWwueWVhcikqMTJdLFsid2Vla3MiLChsLHUpPT57Y29uc3QgYz1VcihsLHUpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsVXJdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFtsLHVdb2YgciluLmluZGV4T2YobCk+PTAmJihhPWwsc1tsXT11KHQsZSksbz1pLnBsdXMocyksbz5lPyhzW2xdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbbF0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIGJsKHQsZSxuLHIpe2xldFtzLGksYSxvXT1rbCh0LGUsbik7Y29uc3QgbD1lLXMsdT1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTt1Lmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKStsLyhhLXMpKSk7Y29uc3QgYz1ULmZyb21PYmplY3QoaSxyKTtyZXR1cm4gdS5sZW5ndGg+MD9ULmZyb21NaWxsaXMobCxyKS5zaGlmdFRvKC4uLnUpLnBsdXMoYyk6Y31jb25zdCBHdD17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sSHI9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LHZsPUd0LmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gSWwodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKEd0LmhhbmlkZWMpIT09LTEpZSs9dmwuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIEhyKXtjb25zdFtpLGFdPUhyW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7R3RbdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgRWw9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIFModCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKElsKG4pKX19Y29uc3QganI9IlsgwqBdIixxcj1uZXcgUmVnRXhwKGpyLCJnIik7ZnVuY3Rpb24gTmwodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UocXIsanIpfWZ1bmN0aW9uIFlyKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UocXIsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKE5sKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5ZcihuKT09PVlyKHIpKStlfX1mdW5jdGlvbiBHcih0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT51dChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiBodCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gTWwodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIHhsKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSxsPVIoZSwiezEsM30iKSx1PVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSx3PVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKE1sKE0udmFsKSksZGVzZXI6KFtqXSk9PmosbGl0ZXJhbDohMH0pLFA9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBaKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gWihlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBTKHUpO2Nhc2UieXkiOnJldHVybiBTKGQsSHQpO2Nhc2UieXl5eSI6cmV0dXJuIFMoaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIFModyk7Y2FzZSJ5eXl5eXkiOnJldHVybiBTKGEpO2Nhc2UiTSI6cmV0dXJuIFMobyk7Y2FzZSJNTSI6cmV0dXJuIFMocik7Y2FzZSJNTU0iOnJldHVybiBaKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFooZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBTKG8pO2Nhc2UiTEwiOnJldHVybiBTKHIpO2Nhc2UiTExMIjpyZXR1cm4gWihlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBaKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gUyhvKTtjYXNlImRkIjpyZXR1cm4gUyhyKTtjYXNlIm8iOnJldHVybiBTKGwpO2Nhc2Uib29vIjpyZXR1cm4gUyhzKTtjYXNlIkhIIjpyZXR1cm4gUyhyKTtjYXNlIkgiOnJldHVybiBTKG8pO2Nhc2UiaGgiOnJldHVybiBTKHIpO2Nhc2UiaCI6cmV0dXJuIFMobyk7Y2FzZSJtbSI6cmV0dXJuIFMocik7Y2FzZSJtIjpyZXR1cm4gUyhvKTtjYXNlInEiOnJldHVybiBTKG8pO2Nhc2UicXEiOnJldHVybiBTKHIpO2Nhc2UicyI6cmV0dXJuIFMobyk7Y2FzZSJzcyI6cmV0dXJuIFMocik7Y2FzZSJTIjpyZXR1cm4gUyhsKTtjYXNlIlNTUyI6cmV0dXJuIFMocyk7Y2FzZSJ1IjpyZXR1cm4gaHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIGh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gUyhuKTtjYXNlImEiOnJldHVybiBaKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gUyhpKTtjYXNlImtrIjpyZXR1cm4gUyhkLEh0KTtjYXNlIlciOnJldHVybiBTKG8pO2Nhc2UiV1ciOnJldHVybiBTKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gUyhuKTtjYXNlIkVFRSI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiBHcihuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIEdyKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiBodCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4gaHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOkVsfTtyZXR1cm4gUC50b2tlbj10LFB9Y29uc3QgRGw9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gQ2wodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IGw9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiFsLHZhbDpsPyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1EbFthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIEZsKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiBBbCh0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSxsPW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaStsKSkpLGkrPWx9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gVmwodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIHkodC56KXx8KG49Si5jcmVhdGUodC56KSkseSh0LlopfHwobnx8KG49bmV3IHgodC5aKSkscj10LlopLHkodC5xKXx8KHQuTT0odC5xLTEpKjMrMSkseSh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSx5KHQudSl8fCh0LlM9UHQodC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IEp0PW51bGw7ZnVuY3Rpb24gV2woKXtyZXR1cm4gSnR8fChKdD1nLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLEp0fWZ1bmN0aW9uIExsKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49Ti5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPVFyKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gSnIodCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT5MbChuLGUpKSl9ZnVuY3Rpb24gQnIodCxlLG4pe2NvbnN0IHI9SnIoTi5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PnhsKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109RmwocyksbD1SZWdFeHAoYSwiaSIpLFt1LGNdPUFsKGUsbCxvKSxbZCx3LGhdPWM/VmwoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBrZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDpsLHJhd01hdGNoZXM6dSxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTp3LHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiAkbCh0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Ccih0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIFFyKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj1OLmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKFdsKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5DbChhLHQsaSkpfWNvbnN0IEJ0PSJJbnZhbGlkIERhdGVUaW1lIixLcj04NjRlMTM7ZnVuY3Rpb24gbXQodCl7cmV0dXJuIG5ldyB6KCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIFF0KHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9aXQodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBLdCh0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1pdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IGcoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIFhyKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIHl0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gZ3QodCxlLG4pe3JldHVybiBYcihsdCh0KSxlLG4pfWZ1bmN0aW9uIGVzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksb3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT1ULmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1sdChpKTtsZXRbbCx1XT1YcihvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJihsKz1hLHU9dC56b25lLm9mZnNldChsKSkse3RzOmwsbzp1fX1mdW5jdGlvbiBVZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCBsPWV8fG8sdT1nLmZyb21PYmplY3QodCx7Li4ubix6b25lOmwsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP3U6dS5zZXRab25lKG8pfWVsc2UgcmV0dXJuIGcuaW52YWxpZChuZXcgeigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gd3QodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/Ti5jcmVhdGUoTy5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBYdCh0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUkodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1JKHQuYy5tb250aCkscis9Ii0iLHIrPUkodC5jLmRheSkpOihyKz1JKHQuYy5tb250aCkscis9SSh0LmMuZGF5KSkscn1mdW5jdGlvbiB0cyh0LGUsbixyLHMsaSl7bGV0IGE9SSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1JKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9SSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUkodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1JKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9SShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9SShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1JKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUkoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBucz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sX2w9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHpsPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHJzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sUmw9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sWmw9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIFBsKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBBbih0KTtyZXR1cm4gZX1mdW5jdGlvbiBzcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBQbCh0KX19ZnVuY3Rpb24gaXModCxlKXtjb25zdCBuPW5lKGUuem9uZSx2LmRlZmF1bHRab25lKSxyPU8uZnJvbU9iamVjdChlKSxzPXYubm93KCk7bGV0IGksYTtpZih5KHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IHUgb2YgcnMpeSh0W3VdKSYmKHRbdV09bnNbdV0pO2NvbnN0IG89Z3IodCl8fHdyKHQpO2lmKG8pcmV0dXJuIGcuaW52YWxpZChvKTtjb25zdCBsPW4ub2Zmc2V0KHMpO1tpLGFdPWd0KHQsbCxuKX1yZXR1cm4gbmV3IGcoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIGFzKHQsZSxuKXtjb25zdCByPXkobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1VdChhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIG9zKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8di5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IHooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOm10KG4pKTt0aGlzLnRzPXkoZS50cyk/di5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPXl0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgeigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8Ty5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgZyh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1vcyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sbCx1XT1uO3JldHVybiBpcyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDpsLG1pbGxpc2Vjb25kOnV9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPW9zKGFyZ3VtZW50cyksW3IscyxpLGEsbyxsLHVdPW47cmV0dXJuIGUuem9uZT14LnV0Y0luc3RhbmNlLGlzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOmwsbWlsbGlzZWNvbmQ6dX0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPXBvKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIGcuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IGcoe3RzOnIsem9uZTpzLGxvYzpPLmZyb21PYmplY3Qobil9KTpnLmludmFsaWQobXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LUtyfHxlPktyP2cuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBnKHt0czplLHpvbmU6bmUobi56b25lLHYuZGVmYXVsdFpvbmUpLGxvYzpPLmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgRChgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBnKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSx2LmRlZmF1bHRab25lKSxsb2M6Ty5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IEQoImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIGcuaW52YWxpZChtdChyKSk7Y29uc3Qgcz1PLmZyb21PYmplY3QobiksaT1jdChlLHNzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309eXIoaSxzKSxsPXYubm93KCksdT15KG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KGwpOm4uc3BlY2lmaWNPZmZzZXQsYz0heShpLm9yZGluYWwpLGQ9IXkoaS55ZWFyKSx3PSF5KGkubW9udGgpfHwheShpLmRheSksaD1kfHx3LGs9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmayl0aHJvdyBuZXcga2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZih3JiZjKXRocm93IG5ldyBrZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBQPWt8fGkud2Vla2RheSYmIWg7bGV0IE0saixCPXl0KGwsdSk7UD8oTT1SbCxqPV9sLEI9aXQoQixhLG8pKTpjPyhNPVpsLGo9emwsQj1SdChCKSk6KE09cnMsaj1ucyk7bGV0IEZlPSExO2Zvcihjb25zdCBLIG9mIE0pe2NvbnN0IFR0PWlbS107eShUdCk/RmU/aVtLXT1qW0tdOmlbS109QltLXTpGZT0hMH1jb25zdCBwdD1QP3lvKGksYSxvKTpjP2dvKGkpOmdyKGkpLHE9cHR8fHdyKGkpO2lmKHEpcmV0dXJuIGcuaW52YWxpZChxKTtjb25zdCBtZT1QP2hyKGksYSxvKTpjP21yKGkpOmksW3llLGllXT1ndChtZSx1LHIpLFE9bmV3IGcoe3RzOnllLHpvbmU6cixvOmllLGxvYzpzfSk7cmV0dXJuIGkud2Vla2RheSYmaCYmZS53ZWVrZGF5IT09US53ZWVrZGF5P2cuaW52YWxpZCgibWlzbWF0Y2hlZCB3ZWVrZGF5IixgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtpLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtRLnRvSVNPKCl9YCk6UX1zdGF0aWMgZnJvbUlTTyhlLG49e30pe2NvbnN0W3Isc109b2woZSk7cmV0dXJuIFVlKHIscyxuLCJJU08gODYwMSIsZSl9c3RhdGljIGZyb21SRkMyODIyKGUsbj17fSl7Y29uc3RbcixzXT1sbChlKTtyZXR1cm4gVWUocixzLG4sIlJGQyAyODIyIixlKX1zdGF0aWMgZnJvbUhUVFAoZSxuPXt9KXtjb25zdFtyLHNdPXVsKGUpO3JldHVybiBVZShyLHMsbiwiSFRUUCIsbil9c3RhdGljIGZyb21Gb3JtYXQoZSxuLHI9e30pe2lmKHkoZSl8fHkobikpdGhyb3cgbmV3IEQoImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCIpO2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPU8uZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSksW28sbCx1LGNdPSRsKGEsZSxuKTtyZXR1cm4gYz9nLmludmFsaWQoYyk6VWUobyxsLHIsYGZvcm1hdCAke259YCxlLHUpfXN0YXRpYyBmcm9tU3RyaW5nKGUsbixyPXt9KXtyZXR1cm4gZy5mcm9tRm9ybWF0KGUsbixyKX1zdGF0aWMgZnJvbVNRTChlLG49e30pe2NvbnN0W3Isc109Z2woZSk7cmV0dXJuIFVlKHIscyxuLCJTUUwiLGUpfXN0YXRpYyBpbnZhbGlkKGUsbj1udWxsKXtpZighZSl0aHJvdyBuZXcgRCgibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkIik7Y29uc3Qgcj1lIGluc3RhbmNlb2Ygej9lOm5ldyB6KGUsbik7aWYodi50aHJvd09uSW52YWxpZCl0aHJvdyBuZXcgSGEocik7cmV0dXJuIG5ldyBnKHtpbnZhbGlkOnJ9KX1zdGF0aWMgaXNEYXRlVGltZShlKXtyZXR1cm4gZSYmZS5pc0x1eG9uRGF0ZVRpbWV8fCExfXN0YXRpYyBwYXJzZUZvcm1hdEZvck9wdHMoZSxuPXt9KXtjb25zdCByPVFyKGUsTy5mcm9tT2JqZWN0KG4pKTtyZXR1cm4gcj9yLm1hcChzPT5zP3MudmFsOm51bGwpLmpvaW4oIiIpOm51bGx9c3RhdGljIGV4cGFuZEZvcm1hdChlLG49e30pe3JldHVybiBKcihOLnBhcnNlRm9ybWF0KGUpLE8uZnJvbU9iamVjdChuKSkubWFwKHM9PnMudmFsKS5qb2luKCIiKX1nZXQoZSl7cmV0dXJuIHRoaXNbZV19Z2V0IGlzVmFsaWQoKXtyZXR1cm4gdGhpcy5pbnZhbGlkPT09bnVsbH1nZXQgaW52YWxpZFJlYXNvbigpe3JldHVybiB0aGlzLmludmFsaWQ/dGhpcy5pbnZhbGlkLnJlYXNvbjpudWxsfWdldCBpbnZhbGlkRXhwbGFuYXRpb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5leHBsYW5hdGlvbjpudWxsfWdldCBsb2NhbGUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLmxvY2FsZTpudWxsfWdldCBudW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm51bWJlcmluZ1N5c3RlbTpudWxsfWdldCBvdXRwdXRDYWxlbmRhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXI6bnVsbH1nZXQgem9uZSgpe3JldHVybiB0aGlzLl96b25lfWdldCB6b25lTmFtZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm5hbWU6bnVsbH1nZXQgeWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnllYXI6TmFOfWdldCBxdWFydGVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmNlaWwodGhpcy5jLm1vbnRoLzMpOk5hTn1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5tb250aDpOYU59Z2V0IGRheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLmRheTpOYU59Z2V0IGhvdXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5ob3VyOk5hTn1nZXQgbWludXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWludXRlOk5hTn1nZXQgc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuc2Vjb25kOk5hTn1nZXQgbWlsbGlzZWNvbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5taWxsaXNlY29uZDpOYU59Z2V0IHdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IHdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1F0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCB3ZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgaXNXZWVrZW5kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCYmdGhpcy5sb2MuZ2V0V2Vla2VuZERheXMoKS5pbmNsdWRlcyh0aGlzLndlZWtkYXkpfWdldCBsb2NhbFdlZWtkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtkYXk6TmFOfWdldCBsb2NhbFdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCBsb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9LdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IG9yZGluYWwoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1J0KHRoaXMuYykub3JkaW5hbDpOYU59Z2V0IG1vbnRoU2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0Lm1vbnRocygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLm1vbnRoLTFdOm51bGx9Z2V0IG1vbnRoTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQubW9udGhzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCB3ZWVrZGF5U2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0LndlZWtkYXlzKCJzaG9ydCIse2xvY09iajp0aGlzLmxvY30pW3RoaXMud2Vla2RheS0xXTpudWxsfWdldCB3ZWVrZGF5TG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQud2Vla2RheXMoImxvbmciLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgb2Zmc2V0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rdGhpcy5vOk5hTn1nZXQgb2Zmc2V0TmFtZVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLHtmb3JtYXQ6InNob3J0Iixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBvZmZzZXROYW1lTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBpc09mZnNldEZpeGVkKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUuaXNVbml2ZXJzYWw6bnVsbH1nZXQgaXNJbkRTVCgpe3JldHVybiB0aGlzLmlzT2Zmc2V0Rml4ZWQ/ITE6dGhpcy5vZmZzZXQ+dGhpcy5zZXQoe21vbnRoOjEsZGF5OjF9KS5vZmZzZXR8fHRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDo1fSkub2Zmc2V0fWdldFBvc3NpYmxlT2Zmc2V0cygpe2lmKCF0aGlzLmlzVmFsaWR8fHRoaXMuaXNPZmZzZXRGaXhlZClyZXR1cm5bdGhpc107Y29uc3QgZT04NjRlNSxuPTZlNCxyPWx0KHRoaXMuYykscz10aGlzLnpvbmUub2Zmc2V0KHItZSksaT10aGlzLnpvbmUub2Zmc2V0KHIrZSksYT10aGlzLnpvbmUub2Zmc2V0KHItcypuKSxvPXRoaXMuem9uZS5vZmZzZXQoci1pKm4pO2lmKGE9PT1vKXJldHVyblt0aGlzXTtjb25zdCBsPXItYSpuLHU9ci1vKm4sYz15dChsLGEpLGQ9eXQodSxvKTtyZXR1cm4gYy5ob3VyPT09ZC5ob3VyJiZjLm1pbnV0ZT09PWQubWludXRlJiZjLnNlY29uZD09PWQuc2Vjb25kJiZjLm1pbGxpc2Vjb25kPT09ZC5taWxsaXNlY29uZD9baGUodGhpcyx7dHM6bH0pLGhlKHRoaXMse3RzOnV9KV06W3RoaXNdfWdldCBpc0luTGVhcFllYXIoKXtyZXR1cm4gX2UodGhpcy55ZWFyKX1nZXQgZGF5c0luTW9udGgoKXtyZXR1cm4gb3QodGhpcy55ZWFyLHRoaXMubW9udGgpfWdldCBkYXlzSW5ZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD92ZSh0aGlzLnllYXIpOk5hTn1nZXQgd2Vla3NJbldlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLndlZWtZZWFyKTpOYU59Z2V0IHdlZWtzSW5Mb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLmxvY2FsV2Vla1llYXIsdGhpcy5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSk6TmFOfXJlc29sdmVkTG9jYWxlT3B0aW9ucyhlPXt9KXtjb25zdHtsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixjYWxlbmRhcjpzfT1OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7cmV0dXJue2xvY2FsZTpuLG51bWJlcmluZ1N5c3RlbTpyLG91dHB1dENhbGVuZGFyOnN9fXRvVVRDKGU9MCxuPXt9KXtyZXR1cm4gdGhpcy5zZXRab25lKHguaW5zdGFuY2UoZSksbil9dG9Mb2NhbCgpe3JldHVybiB0aGlzLnNldFpvbmUodi5kZWZhdWx0Wm9uZSl9c2V0Wm9uZShlLHtrZWVwTG9jYWxUaW1lOm49ITEsa2VlcENhbGVuZGFyVGltZTpyPSExfT17fSl7aWYoZT1uZShlLHYuZGVmYXVsdFpvbmUpLGUuZXF1YWxzKHRoaXMuem9uZSkpcmV0dXJuIHRoaXM7aWYoZS5pc1ZhbGlkKXtsZXQgcz10aGlzLnRzO2lmKG58fHIpe2NvbnN0IGk9ZS5vZmZzZXQodGhpcy50cyksYT10aGlzLnRvT2JqZWN0KCk7W3NdPWd0KGEsaSxlKX1yZXR1cm4gaGUodGhpcyx7dHM6cyx6b25lOmV9KX1lbHNlIHJldHVybiBnLmludmFsaWQobXQoZSkpfXJlY29uZmlndXJlKHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyfT17fSl7Y29uc3Qgcz10aGlzLmxvYy5jbG9uZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn0pO3JldHVybiBoZSh0aGlzLHtsb2M6c30pfXNldExvY2FsZShlKXtyZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7bG9jYWxlOmV9KX1zZXQoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPWN0KGUsc3MpLHttaW5EYXlzSW5GaXJzdFdlZWs6cixzdGFydE9mV2VlazpzfT15cihuLHRoaXMubG9jKSxpPSF5KG4ud2Vla1llYXIpfHwheShuLndlZWtOdW1iZXIpfHwheShuLndlZWtkYXkpLGE9IXkobi5vcmRpbmFsKSxvPSF5KG4ueWVhciksbD0heShuLm1vbnRoKXx8IXkobi5kYXkpLHU9b3x8bCxjPW4ud2Vla1llYXJ8fG4ud2Vla051bWJlcjtpZigodXx8YSkmJmMpdGhyb3cgbmV3IGtlKCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzIik7aWYobCYmYSl0aHJvdyBuZXcga2UoIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5Iik7bGV0IGQ7aT9kPWhyKHsuLi5pdCh0aGlzLmMscixzKSwuLi5ufSxyLHMpOnkobi5vcmRpbmFsKT8oZD17Li4udGhpcy50b09iamVjdCgpLC4uLm59LHkobi5kYXkpJiYoZC5kYXk9TWF0aC5taW4ob3QoZC55ZWFyLGQubW9udGgpLGQuZGF5KSkpOmQ9bXIoey4uLlJ0KHRoaXMuYyksLi4ubn0pO2NvbnN0W3csaF09Z3QoZCx0aGlzLm8sdGhpcy56b25lKTtyZXR1cm4gaGUodGhpcyx7dHM6dyxvOmh9KX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIGhlKHRoaXMsZXModGhpcyxuKSl9bWludXMoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPVQuZnJvbUR1cmF0aW9uTGlrZShlKS5uZWdhdGUoKTtyZXR1cm4gaGUodGhpcyxlcyh0aGlzLG4pKX1zdGFydE9mKGUse3VzZUxvY2FsZVdlZWtzOm49ITF9PXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IHI9e30scz1ULm5vcm1hbGl6ZVVuaXQoZSk7c3dpdGNoKHMpe2Nhc2UieWVhcnMiOnIubW9udGg9MTtjYXNlInF1YXJ0ZXJzIjpjYXNlIm1vbnRocyI6ci5kYXk9MTtjYXNlIndlZWtzIjpjYXNlImRheXMiOnIuaG91cj0wO2Nhc2UiaG91cnMiOnIubWludXRlPTA7Y2FzZSJtaW51dGVzIjpyLnNlY29uZD0wO2Nhc2Uic2Vjb25kcyI6ci5taWxsaXNlY29uZD0wO2JyZWFrfWlmKHM9PT0id2Vla3MiKWlmKG4pe2NvbnN0IGk9dGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSx7d2Vla2RheTphfT10aGlzO2E8aSYmKHIud2Vla051bWJlcj10aGlzLndlZWtOdW1iZXItMSksci53ZWVrZGF5PWl9ZWxzZSByLndlZWtkYXk9MTtpZihzPT09InF1YXJ0ZXJzIil7Y29uc3QgaT1NYXRoLmNlaWwodGhpcy5tb250aC8zKTtyLm1vbnRoPShpLTEpKjMrMX1yZXR1cm4gdGhpcy5zZXQocil9ZW5kT2YoZSxuKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMucGx1cyh7W2VdOjF9KS5zdGFydE9mKGUsbikubWludXMoMSk6dGhpc310b0Zvcm1hdChlLG49e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MucmVkZWZhdWx0VG9FTihuKSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMsZSk6QnR9dG9Mb2NhbGVTdHJpbmcoZT1ldCxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP04uY3JlYXRlKHRoaXMubG9jLmNsb25lKG4pLGUpLmZvcm1hdERhdGVUaW1lKHRoaXMpOkJ0fXRvTG9jYWxlUGFydHMoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpOltdfXRvSVNPKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQiLHN1cHByZXNzU2Vjb25kczpuPSExLHN1cHByZXNzTWlsbGlzZWNvbmRzOnI9ITEsaW5jbHVkZU9mZnNldDpzPSEwLGV4dGVuZGVkWm9uZTppPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBhPWU9PT0iZXh0ZW5kZWQiO2xldCBvPVh0KHRoaXMsYSk7cmV0dXJuIG8rPSJUIixvKz10cyh0aGlzLGEsbixyLHMsaSksb310b0lTT0RhdGUoe2Zvcm1hdDplPSJleHRlbmRlZCJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1h0KHRoaXMsZT09PSJleHRlbmRlZCIpOm51bGx9dG9JU09XZWVrRGF0ZSgpe3JldHVybiB3dCh0aGlzLCJra2trLSdXJ1dXLWMiKX10b0lTT1RpbWUoe3N1cHByZXNzTWlsbGlzZWNvbmRzOmU9ITEsc3VwcHJlc3NTZWNvbmRzOm49ITEsaW5jbHVkZU9mZnNldDpyPSEwLGluY2x1ZGVQcmVmaXg6cz0hMSxleHRlbmRlZFpvbmU6aT0hMSxmb3JtYXQ6YT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8ocz8iVCI6IiIpK3RzKHRoaXMsYT09PSJleHRlbmRlZCIsbixlLHIsaSk6bnVsbH10b1JGQzI4MjIoKXtyZXR1cm4gd3QodGhpcywiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWloiLCExKX10b0hUVFAoKXtyZXR1cm4gd3QodGhpcy50b1VUQygpLCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnIil9dG9TUUxEYXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9YdCh0aGlzLCEwKTpudWxsfXRvU1FMVGltZSh7aW5jbHVkZU9mZnNldDplPSEwLGluY2x1ZGVab25lOm49ITEsaW5jbHVkZU9mZnNldFNwYWNlOnI9ITB9PXt9KXtsZXQgcz0iSEg6bW06c3MuU1NTIjtyZXR1cm4obnx8ZSkmJihyJiYocys9IiAiKSxuP3MrPSJ6IjplJiYocys9IlpaIikpLHd0KHRoaXMscywhMCl9dG9TUUwoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKGUpfWA6bnVsbH10b1N0cmluZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50b0lTTygpOkJ0fVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YERhdGVUaW1lIHsgdHM6ICR7dGhpcy50b0lTTygpfSwgem9uZTogJHt0aGlzLnpvbmUubmFtZX0sIGxvY2FsZTogJHt0aGlzLmxvY2FsZX0gfWA6YERhdGVUaW1lIHsgSW52YWxpZCwgcmVhc29uOiAke3RoaXMuaW52YWxpZFJlYXNvbn0gfWB9dmFsdWVPZigpe3JldHVybiB0aGlzLnRvTWlsbGlzKCl9dG9NaWxsaXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOfXRvU2Vjb25kcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50cy8xZTM6TmFOfXRvVW5peEludGVnZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP01hdGguZmxvb3IodGhpcy50cy8xZTMpOk5hTn10b0pTT04oKXtyZXR1cm4gdGhpcy50b0lTTygpfXRvQlNPTigpe3JldHVybiB0aGlzLnRvSlNEYXRlKCl9dG9PYmplY3QoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm57fTtjb25zdCBuPXsuLi50aGlzLmN9O3JldHVybiBlLmluY2x1ZGVDb25maWcmJihuLm91dHB1dENhbGVuZGFyPXRoaXMub3V0cHV0Q2FsZW5kYXIsbi5udW1iZXJpbmdTeXN0ZW09dGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtLG4ubG9jYWxlPXRoaXMubG9jLmxvY2FsZSksbn10b0pTRGF0ZSgpe3JldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQ/dGhpcy50czpOYU4pfWRpZmYoZSxuPSJtaWxsaXNlY29uZHMiLHI9e30pe2lmKCF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQpcmV0dXJuIFQuaW52YWxpZCgiY3JlYXRlZCBieSBkaWZmaW5nIGFuIGludmFsaWQgRGF0ZVRpbWUiKTtjb25zdCBzPXtsb2NhbGU6dGhpcy5sb2NhbGUsbnVtYmVyaW5nU3lzdGVtOnRoaXMubnVtYmVyaW5nU3lzdGVtLC4uLnJ9LGk9VG8obikubWFwKFQubm9ybWFsaXplVW5pdCksYT1lLnZhbHVlT2YoKT50aGlzLnZhbHVlT2YoKSxvPWE/dGhpczplLGw9YT9lOnRoaXMsdT1ibChvLGwsaSxzKTtyZXR1cm4gYT91Lm5lZ2F0ZSgpOnV9ZGlmZk5vdyhlPSJtaWxsaXNlY29uZHMiLG49e30pe3JldHVybiB0aGlzLmRpZmYoZy5ub3coKSxlLG4pfXVudGlsKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/Yi5mcm9tRGF0ZVRpbWVzKHRoaXMsZSk6dGhpc31oYXNTYW1lKGUsbixyKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiExO2NvbnN0IHM9ZS52YWx1ZU9mKCksaT10aGlzLnNldFpvbmUoZS56b25lLHtrZWVwTG9jYWxUaW1lOiEwfSk7cmV0dXJuIGkuc3RhcnRPZihuLHIpPD1zJiZzPD1pLmVuZE9mKG4scil9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQmJmUuaXNWYWxpZCYmdGhpcy52YWx1ZU9mKCk9PT1lLnZhbHVlT2YoKSYmdGhpcy56b25lLmVxdWFscyhlLnpvbmUpJiZ0aGlzLmxvYy5lcXVhbHMoZS5sb2MpfXRvUmVsYXRpdmUoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBuPWUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHI9ZS5wYWRkaW5nP3RoaXM8bj8tZS5wYWRkaW5nOmUucGFkZGluZzowO2xldCBzPVsieWVhcnMiLCJtb250aHMiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyJdLGk9ZS51bml0O3JldHVybiBBcnJheS5pc0FycmF5KGUudW5pdCkmJihzPWUudW5pdCxpPXZvaWQgMCksYXMobix0aGlzLnBsdXMociksey4uLmUsbnVtZXJpYzoiYWx3YXlzIix1bml0czpzLHVuaXQ6aX0pfXRvUmVsYXRpdmVDYWxlbmRhcihlPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2FzKGUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHRoaXMsey4uLmUsbnVtZXJpYzoiYXV0byIsdW5pdHM6WyJ5ZWFycyIsIm1vbnRocyIsImRheXMiXSxjYWxlbmRhcnk6ITB9KTpudWxsfXN0YXRpYyBtaW4oLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5taW4pfXN0YXRpYyBtYXgoLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5tYXgpfXN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbihlLG4scj17fSl7Y29uc3R7bG9jYWxlOnM9bnVsbCxudW1iZXJpbmdTeXN0ZW06aT1udWxsfT1yLGE9Ty5mcm9tT3B0cyh7bG9jYWxlOnMsbnVtYmVyaW5nU3lzdGVtOmksZGVmYXVsdFRvRU46ITB9KTtyZXR1cm4gQnIoYSxlLG4pfXN0YXRpYyBmcm9tU3RyaW5nRXhwbGFpbihlLG4scj17fSl7cmV0dXJuIGcuZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHIpfXN0YXRpYyBnZXQgREFURV9TSE9SVCgpe3JldHVybiBldH1zdGF0aWMgZ2V0IERBVEVfTUVEKCl7cmV0dXJuIFZufXN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIFlhfXN0YXRpYyBnZXQgREFURV9GVUxMKCl7cmV0dXJuIFdufXN0YXRpYyBnZXQgREFURV9IVUdFKCl7cmV0dXJuIExufXN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKXtyZXR1cm4gJG59c3RhdGljIGdldCBUSU1FX1dJVEhfU0VDT05EUygpe3JldHVybiBfbn1zdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gem59c3RhdGljIGdldCBUSU1FX1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4gUm59c3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpe3JldHVybiBabn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIFBufXN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpe3JldHVybiBVbn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCgpe3JldHVybiBIbn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCl7cmV0dXJuIGpufXN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIHFufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCl7cmV0dXJuIFlufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpe3JldHVybiBHbn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkoKXtyZXR1cm4gR2F9c3RhdGljIGdldCBEQVRFVElNRV9GVUxMKCl7cmV0dXJuIEpufXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gQm59c3RhdGljIGdldCBEQVRFVElNRV9IVUdFKCl7cmV0dXJuIFFufXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gS259fWZ1bmN0aW9uIEhlKHQpe2lmKGcuaXNEYXRlVGltZSh0KSlyZXR1cm4gdDtpZih0JiZ0LnZhbHVlT2YmJmNlKHQudmFsdWVPZigpKSlyZXR1cm4gZy5mcm9tSlNEYXRlKHQpO2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0IilyZXR1cm4gZy5mcm9tT2JqZWN0KHQpO3Rocm93IG5ldyBEKGBVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50OiAke3R9LCBvZiB0eXBlICR7dHlwZW9mIHR9YCl9ZnVuY3Rpb24gVWwoe2NvbGxlY3Rpb25zOnQsbHd3OmV9LHt0YWJsZUlkczpuLHRhYmxlQ29sdW1uSWRzOnIscmVsYXRpb25zaGlwSWRzOnMsaW5kZXhJZHM6aSxpbmRleENvbHVtbklkczphLG1lbW9JZHM6b30pe0EodCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLnJlbW92ZU1hbnkobiksQSh0KS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIikucmVtb3ZlTWFueShyKSxBKHQpLmNvbGxlY3Rpb24oInJlbGF0aW9uc2hpcEVudGl0aWVzIikucmVtb3ZlTWFueShzKSxBKHQpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKS5yZW1vdmVNYW55KGkpLEEodCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkoYSksQSh0KS5jb2xsZWN0aW9uKCJtZW1vRW50aXRpZXMiKS5yZW1vdmVNYW55KG8pLFsuLi5uLC4uLnIsLi4ucywuLi5pLC4uLmEsLi4ub10uZm9yRWFjaChsPT5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsbCkpfWNvbnN0IEhsPTMsamw9JChbInRhYmxlRW50aXRpZXMiLCJ0YWJsZUNvbHVtbkVudGl0aWVzIiwicmVsYXRpb25zaGlwRW50aXRpZXMiLCJpbmRleEVudGl0aWVzIiwiaW5kZXhDb2x1bW5FbnRpdGllcyIsIm1lbW9FbnRpdGllcyJdKTtjbGFzcyBxbHthc3luYyBydW4oZSl7Y29uc3Qgbj1KU09OLnBhcnNlKGUpLHI9JGEobikse2RvYzp7dGFibGVJZHM6cyxtZW1vSWRzOmksaW5kZXhJZHM6YSxyZWxhdGlvbnNoaXBJZHM6b30sY29sbGVjdGlvbnM6bCxsd3c6dX09cixjPSQocyksZD0kKGkpLHc9JChhKSxoPSQobyksaz1ZbChnLm5vdygpKSxQPUEobCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLE09QShsKS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIiksaj1BKGwpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKSxCPUEobCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLEZlPUEobCkuY29sbGVjdGlvbigicmVsYXRpb25zaGlwRW50aXRpZXMiKSxwdD1BKGwpLmNvbGxlY3Rpb24oIm1lbW9FbnRpdGllcyIpLHE9bmV3IFNldChQLnNlbGVjdEFsbCgpLmZpbHRlcihrKGMpKS5tYXAoKHtpZDptfSk9Pm0pKSxtZT1uZXcgU2V0LHllPW5ldyBTZXQoRmUuc2VsZWN0QWxsKCkuZmlsdGVyKGsoaCkpLm1hcCgoe2lkOm19KT0+bSkpLGllPW5ldyBTZXQoai5zZWxlY3RBbGwoKS5maWx0ZXIoayh3KSkubWFwKCh7aWQ6bX0pPT5tKSksUT1uZXcgU2V0LEs9bmV3IFNldChwdC5zZWxlY3RBbGwoKS5maWx0ZXIoayhkKSkubWFwKCh7aWQ6bX0pPT5tKSk7TS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm19KT0+cS5oYXMobSkpLmZvckVhY2goKHtpZDptfSk9Pm1lLmFkZChtKSksRmUuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSxzdGFydDpZLGVuZDpqZX0pPT4heWUuaGFzKG0pJiYocS5oYXMoWS50YWJsZUlkKXx8cS5oYXMoamUudGFibGVJZCkpKS5mb3JFYWNoKCh7aWQ6bX0pPT55ZS5hZGQobSkpLGouc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSx0YWJsZUlkOll9KT0+IWllLmhhcyhtKSYmcS5oYXMoWSkpLmZvckVhY2goKHtpZDptfSk9PmllLmFkZChtKSksQi5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpbmRleElkOm19KT0+aWUuaGFzKG0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5RLmFkZChtKSksVWwocix7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119KTtjb25zdCBUdD0kKFAuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksSmw9JChNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLGxzPSQoai5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxCbD0kKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksUWw9JChGZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxLbD0kKHB0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBNLnNlbGVjdEFsbCgpLmZpbHRlcigoe3RhYmxlSWQ6bSxpZDpZLG1ldGE6amV9KT0+IVR0KG0pJiZrKCgpPT4hMSkoe2lkOlksbWV0YTpqZX0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5tZS5hZGQobSkpLEIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpqZX0pPT4hbHMobSkmJmsoKCk9PiExKSh7aWQ6WSxtZXRhOmplfSkpLmZvckVhY2goKHtpZDptfSk9PlEuYWRkKG0pKSxPYmplY3QuZW50cmllcyh1KS5mb3JFYWNoKChbbSxbWV1dKT0+e2lmKGpsKFkpKXN3aXRjaChZKXtjYXNlInRhYmxlRW50aXRpZXMiOiFUdChtKSYmcS5hZGQobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohSmwobSkmJm1lLmFkZChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohUWwobSkmJnllLmFkZChtKTticmVhaztjYXNlImluZGV4RW50aXRpZXMiOiFscyhtKSYmaWUuYWRkKG0pO2JyZWFrO2Nhc2UiaW5kZXhDb2x1bW5FbnRpdGllcyI6IUJsKG0pJiZRLmFkZChtKTticmVhaztjYXNlIm1lbW9FbnRpdGllcyI6IUtsKG0pJiZLLmFkZChtKTticmVha319KSx7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119fX1jb25zdCBZbD10PT5lPT4oe2lkOm4sbWV0YTpyfSk9PntpZihlKG4pKXJldHVybiExO2NvbnN0IHM9TWF0aC5mbG9vcih0LmRpZmYoZy5mcm9tTWlsbGlzKHIudXBkYXRlQXQpLCJkYXlzIikudG9PYmplY3QoKS5kYXlzPz8wKTtyZXR1cm4gSGw8c30sR2w9bmV3IHFsO090KEdsKX0pKCk7Cg==", yR = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), kd = typeof window < "u" && window.Blob && new Blob([yR(Qp)], { type: "text/javascript;charset=utf-8" });
|
|
26564
|
+
const Qp = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGVuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLHVzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGNzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxTdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIikscWU9U3ltYm9sKCJDb21saW5rLnRocm93biIpLHRuPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLGZzPXtjYW5IYW5kbGU6dD0+dG4odCkmJnRbZW5dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gT3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLHlzKHQpfX0sZHM9e2NhbkhhbmRsZTp0PT50bih0KSYmcWUgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LG5uPW5ldyBNYXAoW1sicHJveHkiLGZzXSxbInRocm93Iixkc11dKTtmdW5jdGlvbiBocyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFocyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSxsPShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGFlKTtsZXQgdTt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgodyxoKT0+d1toXSx0KSxkPW8ucmVkdWNlKCh3LGgpPT53W2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6dT1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1hZShzLmRhdGEudmFsdWUpLHU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6dT1kLmFwcGx5KGMsbCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCB3PW5ldyBkKC4uLmwpO3U9U3Modyl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOncscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO090KHQsaCksdT1Ucyh3LFt3XSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjp1PXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7dT17dmFsdWU6YyxbcWVdOjB9fVByb21pc2UucmVzb2x2ZSh1KS5jYXRjaChjPT4oe3ZhbHVlOmMsW3FlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2Qsd109QmUoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSx3KSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxybihlKSxTdCBpbiB0JiZ0eXBlb2YgdFtTdF09PSJmdW5jdGlvbiImJnRbU3RdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2Qsd109QmUoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtxZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSksdyl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBtcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBybih0KXttcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIHlzKHQsZSl7cmV0dXJuIGt0KHQsW10sZSl9ZnVuY3Rpb24gWWUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHNuKHQpe3JldHVybiBnZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9Pntybih0KX0pfWNvbnN0IEdlPW5ldyBXZWFrTWFwLEplPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KEdlLmdldCh0KXx8MCktMTtHZS5zZXQodCxlKSxlPT09MCYmc24odCl9KTtmdW5jdGlvbiBncyh0LGUpe2NvbnN0IG49KEdlLmdldChlKXx8MCkrMTtHZS5zZXQoZSxuKSxKZSYmSmUucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIHdzKHQpe0plJiZKZS51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uIGt0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWWUociksYT09PWNzKXJldHVybigpPT57d3Mocyksc24odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPWdlKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcChsPT5sLnRvU3RyaW5nKCkpfSkudGhlbihhZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiBrdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtZZShyKTtjb25zdFtsLHVdPUJlKG8pO3JldHVybiBnZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6bH0sdSkudGhlbihhZSl9LGFwcGx5KGksYSxvKXtZZShyKTtjb25zdCBsPWVbZS5sZW5ndGgtMV07aWYobD09PXVzKXJldHVybiBnZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGFlKTtpZihsPT09ImJpbmQiKXJldHVybiBrdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W3UsY109YW4obyk7cmV0dXJuIGdlKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OnV9LGMpLnRoZW4oYWUpfSxjb25zdHJ1Y3QoaSxhKXtZZShyKTtjb25zdFtvLGxdPWFuKGEpO3JldHVybiBnZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAodT0+dS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sbCkudGhlbihhZSl9fSk7cmV0dXJuIGdzKHMsdCksc31mdW5jdGlvbiBwcyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBhbih0KXtjb25zdCBlPXQubWFwKEJlKTtyZXR1cm5bZS5tYXAobj0+blswXSkscHMoZS5tYXAobj0+blsxXSkpXX1jb25zdCBvbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBUcyh0LGUpe3JldHVybiBvbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFNzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1tlbl06ITB9KX1mdW5jdGlvbiBCZSh0KXtmb3IoY29uc3RbZSxuXW9mIG5uKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxvbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBhZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBubi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIGdlKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9T3MoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gT3MoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfXZhciBrcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsYnM9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixidD1rc3x8YnN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksd2U9YnQuU3ltYm9sLGxuPU9iamVjdC5wcm90b3R5cGUsdnM9bG4uaGFzT3duUHJvcGVydHksSXM9bG4udG9TdHJpbmcsQWU9d2U/d2UudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIEVzKHQpe3ZhciBlPXZzLmNhbGwodCxBZSksbj10W0FlXTt0cnl7dFtBZV09dm9pZCAwO3ZhciByPSEwfWNhdGNoe312YXIgcz1Jcy5jYWxsKHQpO3JldHVybiByJiYoZT90W0FlXT1uOmRlbGV0ZSB0W0FlXSksc312YXIgTnM9T2JqZWN0LnByb3RvdHlwZSxNcz1Ocy50b1N0cmluZztmdW5jdGlvbiB4cyh0KXtyZXR1cm4gTXMuY2FsbCh0KX12YXIgRHM9IltvYmplY3QgTnVsbF0iLENzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHVuPXdlP3dlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBjbih0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP0NzOkRzOnVuJiZ1biBpbiBPYmplY3QodCk/RXModCk6eHModCl9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In1mdW5jdGlvbiBGcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxzPUFycmF5KHIpOysrbjxyOylzW25dPWUodFtuXSxuLHQpO3JldHVybiBzfXZhciBBcz1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGZuKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGRuKHQpe3JldHVybiB0fXZhciBWcz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsV3M9IltvYmplY3QgRnVuY3Rpb25dIixMcz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCRzPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gaG4odCl7aWYoIWZuKHQpKXJldHVybiExO3ZhciBlPWNuKHQpO3JldHVybiBlPT1Xc3x8ZT09THN8fGU9PVZzfHxlPT0kc312YXIgSXQ9YnRbIl9fY29yZS1qc19zaGFyZWRfXyJdLG1uPWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhJdCYmSXQua2V5cyYmSXQua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBfcyh0KXtyZXR1cm4hIW1uJiZtbiBpbiB0fXZhciB6cz1GdW5jdGlvbi5wcm90b3R5cGUsUnM9enMudG9TdHJpbmc7ZnVuY3Rpb24gWnModCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBScy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgUHM9L1tcXF4kLiorPygpW1xde318XS9nLFVzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEhzPUZ1bmN0aW9uLnByb3RvdHlwZSxqcz1PYmplY3QucHJvdG90eXBlLHFzPUhzLnRvU3RyaW5nLFlzPWpzLmhhc093blByb3BlcnR5LEdzPVJlZ0V4cCgiXiIrcXMuY2FsbChZcykucmVwbGFjZShQcywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiBKcyh0KXtpZighZm4odCl8fF9zKHQpKXJldHVybiExO3ZhciBlPWhuKHQpP0dzOlVzO3JldHVybiBlLnRlc3QoWnModCkpfWZ1bmN0aW9uIEJzKHQsZSl7cmV0dXJuIHQ9PW51bGw/dm9pZCAwOnRbZV19ZnVuY3Rpb24gRXQodCxlKXt2YXIgbj1Ccyh0LGUpO3JldHVybiBKcyhuKT9uOnZvaWQgMH1mdW5jdGlvbiBRcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfXZhciBLcz04MDAsWHM9MTYsZWk9RGF0ZS5ub3c7ZnVuY3Rpb24gdGkodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZWkoKSxzPVhzLShyLW4pO2lmKG49cixzPjApe2lmKCsrZT49S3MpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZnVuY3Rpb24gbmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciB5bj1mdW5jdGlvbigpe3RyeXt2YXIgdD1FdChPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0oKSxyaT15bj9mdW5jdGlvbih0LGUpe3JldHVybiB5bih0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm5pKGUpLHdyaXRhYmxlOiEwfSl9OmRuLHNpPXJpLGlpPXRpKHNpKTtmdW5jdGlvbiBhaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBvaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gbGkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gdWkodCxlLG4pe3JldHVybiBlPT09ZT9saSh0LGUsbik6YWkodCxvaSxuKX1mdW5jdGlvbiBjaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJnVpKHQsZSwwKT4tMX1mdW5jdGlvbiBmaSh0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBnbj1NYXRoLm1heDtmdW5jdGlvbiBkaSh0LGUsbil7cmV0dXJuIGU9Z24oZT09PXZvaWQgMD90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLHM9LTEsaT1nbihyLmxlbmd0aC1lLDApLGE9QXJyYXkoaSk7KytzPGk7KWFbc109cltlK3NdO3M9LTE7Zm9yKHZhciBvPUFycmF5KGUrMSk7KytzPGU7KW9bc109cltzXTtyZXR1cm4gb1tlXT1uKGEpLFFzKHQsdGhpcyxvKX19ZnVuY3Rpb24gaGkodCxlKXtyZXR1cm4gaWkoZGkodCxlLGRuKSx0KyIiKX12YXIgbWk9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiB5aSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PW1pfWZ1bmN0aW9uIGdpKHQpe3JldHVybiB0IT1udWxsJiZ5aSh0Lmxlbmd0aCkmJiFobih0KX12YXIgd2k9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gd24odCl7cmV0dXJuIHZ0KHQpJiZjbih0KT09d2l9dmFyIHBuPU9iamVjdC5wcm90b3R5cGUscGk9cG4uaGFzT3duUHJvcGVydHksVGk9cG4ucHJvcGVydHlJc0VudW1lcmFibGUsU2k9d24oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT93bjpmdW5jdGlvbih0KXtyZXR1cm4gdnQodCkmJnBpLmNhbGwodCwiY2FsbGVlIikmJiFUaS5jYWxsKHQsImNhbGxlZSIpfTtmdW5jdGlvbiBPaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBWZT1FdChPYmplY3QsImNyZWF0ZSIpO2Z1bmN0aW9uIGtpKCl7dGhpcy5fX2RhdGFfXz1WZT9WZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgdmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLElpPU9iamVjdC5wcm90b3R5cGUsRWk9SWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTmkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihWZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXZpP3ZvaWQgMDpufXJldHVybiBFaS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIE1pPU9iamVjdC5wcm90b3R5cGUseGk9TWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gRGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gVmU/ZVt0XSE9PXZvaWQgMDp4aS5jYWxsKGUsdCl9dmFyIENpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBGaSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09VmUmJmU9PT12b2lkIDA/Q2k6ZSx0aGlzfWZ1bmN0aW9uIG9lKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fW9lLnByb3RvdHlwZS5jbGVhcj1raSxvZS5wcm90b3R5cGUuZGVsZXRlPWJpLG9lLnByb3RvdHlwZS5nZXQ9Tmksb2UucHJvdG90eXBlLmhhcz1EaSxvZS5wcm90b3R5cGUuc2V0PUZpO2Z1bmN0aW9uIEFpKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKGZpKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIFZpPUFycmF5LnByb3RvdHlwZSxXaT1WaS5zcGxpY2U7ZnVuY3Rpb24gTGkodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVFlKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpXaS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiAkaSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49UWUoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIF9pKHQpe3JldHVybiBRZSh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIHppKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPVFlKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gcGUodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19cGUucHJvdG90eXBlLmNsZWFyPUFpLHBlLnByb3RvdHlwZS5kZWxldGU9TGkscGUucHJvdG90eXBlLmdldD0kaSxwZS5wcm90b3R5cGUuaGFzPV9pLHBlLnByb3RvdHlwZS5zZXQ9emk7dmFyIFJpPUV0KGJ0LCJNYXAiKTtmdW5jdGlvbiBaaSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IG9lLG1hcDpuZXcoUml8fHBlKSxzdHJpbmc6bmV3IG9lfX1mdW5jdGlvbiBQaSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBLZSh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIFBpKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVWkodCl7dmFyIGU9S2UodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gS2UodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gamkodCl7cmV0dXJuIEtlKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIHFpKHQsZSl7dmFyIG49S2UodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1UZS5wcm90b3R5cGUuY2xlYXI9WmksVGUucHJvdG90eXBlLmRlbGV0ZT1VaSxUZS5wcm90b3R5cGUuZ2V0PUhpLFRlLnByb3RvdHlwZS5oYXM9amksVGUucHJvdG90eXBlLnNldD1xaTtmdW5jdGlvbiBZaSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLHM9dC5sZW5ndGg7KytuPHI7KXRbcytuXT1lW25dO3JldHVybiB0fXZhciBUbj13ZT93ZS5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEdpKHQpe3JldHVybiBBcyh0KXx8U2kodCl8fCEhKFRuJiZ0JiZ0W1RuXSl9ZnVuY3Rpb24gU24odCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1HaSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP1NuKG8sZS0xLG4scixzKTpZaShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc312YXIgSmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIEJpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LEppKSx0aGlzfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX1mdW5jdGlvbiBYZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgVGU7KytlPG47KXRoaXMuYWRkKHRbZV0pfVhlLnByb3RvdHlwZS5hZGQ9WGUucHJvdG90eXBlLnB1c2g9QmksWGUucHJvdG90eXBlLmhhcz1RaTtmdW5jdGlvbiBLaSh0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdnQodCkmJmdpKHQpfWZ1bmN0aW9uIFhpKHQsZSxuKXtmb3IodmFyIHI9LTEscz10PT1udWxsPzA6dC5sZW5ndGg7KytyPHM7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgZWE9MjAwO2Z1bmN0aW9uIHRhKHQsZSxuLHIpe3ZhciBzPS0xLGk9Y2ksYT0hMCxvPXQubGVuZ3RoLGw9W10sdT1lLmxlbmd0aDtpZighbylyZXR1cm4gbDtuJiYoZT1GcyhlLE9pKG4pKSkscj8oaT1YaSxhPSExKTplLmxlbmd0aD49ZWEmJihpPUtpLGE9ITEsZT1uZXcgWGUoZSkpO2U6Zm9yKDsrK3M8bzspe3ZhciBjPXRbc10sZD1uPT1udWxsP2M6bihjKTtpZihjPXJ8fGMhPT0wP2M6MCxhJiZkPT09ZCl7Zm9yKHZhciB3PXU7dy0tOylpZihlW3ddPT09ZCljb250aW51ZSBlO2wucHVzaChjKX1lbHNlIGkoZSxkLHIpfHxsLnB1c2goYyl9cmV0dXJuIGx9dmFyIG5hPWhpKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9uKHQpP3RhKHQsU24oZSwxLE9uLCEwKSk6W119KTtmdW5jdGlvbiAkKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9Y29uc3QgV2U9dD0+ZT0+dHlwZW9mIGU9PT10LHJhPVdlKCJvYmplY3QiKSxOdD1XZSgiYm9vbGVhbiIpLEU9V2UoIm51bWJlciIpLEY9V2UoInN0cmluZyIpLHNhPVdlKCJ1bmRlZmluZWQiKSxrbj10PT50PT09bnVsbCxHPXQ9PmtuKHQpfHxzYSh0KSx7aXNBcnJheTpYfT1BcnJheSxVPXQ9PnJhKHQpJiYha24odCkmJiFYKHQpOygodCxlLG4pPT57bGV0IHI9KDI8PE1hdGgubG9nKHQubGVuZ3RoLTEpL01hdGguTE4yKS0xLHM9LX4oMS42KnIqZS90Lmxlbmd0aCk7cmV0dXJuKGk9ZSk9PntsZXQgYT0iIjtmb3IoOzspe2xldCBvPW4ocyksbD1zO2Zvcig7bC0tOylpZihhKz10W29bbF0mcl18fCIiLGEubGVuZ3RoPT09aSlyZXR1cm4gYX19fSkoInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QiLDIxLHQ9PntsZXQgZT1nbG9iYWxUaGlzLmNyeXB0bztyZXR1cm4gZT09PXZvaWQgMCYmKGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKS53ZWJjcnlwdG8pLGUuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKX0pO2NvbnN0IE10PSh0LGUpPT5uPT5NYXRoLm1pbihNYXRoLm1heChuLHQpLGUpOy8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgRnJpIEZlYiAyOCAyMDI1CiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBwKHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9PkUoZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gU2UoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gT2UodCxlKXtjb25zdCBuPXAoRSx0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBpYT0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIGFhKHQpe2NvbnN0IGU9aWEoKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXAoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgb2E9KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBsYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9b2EoKSxzPXAoRixyLG4pLGk9cChOdCxyLG4pLGE9cChYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBibj17QVNDOjEsREVTQzoyfSx1YT1PYmplY3QudmFsdWVzKGJuKSxjYT0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpibi5BU0MsbWV0YTpTZSgpfSk7ZnVuY3Rpb24gZmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPWNhKCkscz1wKEYscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHAoSCh1YSkscixuKSgib3JkZXJUeXBlIiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgZGE9KCk9Pih7fSk7ZnVuY3Rpb24gaGEodCl7Y29uc3QgZT1kYSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihGKHMpJiZFKGkpJiZFKGEpJiZVKG8pKXtjb25zdCBsPXt9LHU9cChFLGwsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaCh1KSxlW25dPVtzLGksYSxsXX19cmV0dXJuIGV9Y29uc3QgbWE9KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOlNlKCl9KTtmdW5jdGlvbiB5YSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9bWEoKSxzPXAoRixyLG4pLGk9cChFLHIudWksbi51aSksYT1wKEYsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0IiksT2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qgdm49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSxnYT1PYmplY3QudmFsdWVzKHZuKSxJbj17cmluZzoxLGRhc2g6Mn0sd2E9T2JqZWN0LnZhbHVlcyhJbikseHQ9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSxFbj1PYmplY3QudmFsdWVzKHh0KSxwYT0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOnZuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTpJbi5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjp4dC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246eHQuYm90dG9tfSxtZXRhOlNlKCl9KTtmdW5jdGlvbiBUYSh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9cGEoKSxzPXAoRixyLG4pLGk9cChOdCxyLG4pLGE9cChFLHIuc3RhcnQsbi5zdGFydCksbz1wKEYsci5zdGFydCxuLnN0YXJ0KSxsPXAoRSxyLmVuZCxuLmVuZCksdT1wKEYsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSxwKEgoZ2EpLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSxwKEgod2EpLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHAoSChFbiksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIikscChYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLHUoInRhYmxlSWQiKSxsKCJ4IiksbCgieSIpLHAoSChFbiksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSxwKFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBTYT17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LGxlPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxObj1PYmplY3QudmFsdWVzKGVlKSxNbj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sT2E9T2JqZWN0LnZhbHVlcyhNbikseG49e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LGthPU9iamVjdC52YWx1ZXMoeG4pLER0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxEbj1PYmplY3QudmFsdWVzKER0KSxDbj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxiYT1PYmplY3QudmFsdWVzKENuKSx2YT0uMSxJYT0xLEVhPTJlMyxOYT0yZTQsTWE9bGUudGFibGVDb21tZW50fGxlLmNvbHVtbkNvbW1lbnR8bGUuY29sdW1uRGF0YVR5cGV8bGUuY29sdW1uRGVmYXVsdHxsZS5jb2x1bW5QcmltYXJ5S2V5fGxlLmNvbHVtbk5vdE51bGx8bGUucmVsYXRpb25zaGlwLHhhPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93Ok1hLGRhdGFiYXNlOk1uLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOlNhLkVSRCxsYW5ndWFnZTp4bi5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6RHQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpEdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6Q24ubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTEsaWdub3JlU2F2ZVNldHRpbmdzOjB9KSxGbj1NdChFYSxOYSksRGE9TXQodmEsSWEpLENhPU10KDYwLDIwMCk7ZnVuY3Rpb24gRmEodCl7Y29uc3QgZT14YSgpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49cChFLGUsdCkscj1wKEYsZSx0KSxzPXAoTnQsZSx0KTtyZXR1cm4gRSh0LndpZHRoKSYmKGUud2lkdGg9Rm4odC53aWR0aCkpLEUodC5oZWlnaHQpJiYoZS5oZWlnaHQ9Rm4odC5oZWlnaHQpKSxFKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPURhKHQuem9vbUxldmVsKSksRSh0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1DYSh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IiksbigiaWdub3JlU2F2ZVNldHRpbmdzIikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHAoSChPYSksZSx0KSgiZGF0YWJhc2UiKSxwKEgoa2EpLGUsdCkoImxhbmd1YWdlIikscChIKERuKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIikscChIKERuKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHAoSChiYSksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZObi5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmbmEoTm4sdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBBYT0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gVmEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUFhKCkscz1wKEYscixuKSxpPXAoWCxyLG4pLGE9cChFLHIudWksbi51aSksbz1wKEYsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLE9lKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFdhPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpTZSgpfSk7ZnVuY3Rpb24gTGEodCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVdhKCkscz1wKEYscixuKSxpPXAoRSxyLG4pLGE9cChFLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSxPZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiAkYSh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LGw9RmEoby5zZXR0aW5ncyksdT1hYShvLmRvYyksYz1oYShvLmx3dyksZD1WYSgoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSx3PUxhKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9VGEoKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLGs9bGEoKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksUD1mYSgoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPXlhKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJueyRzY2hlbWE6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kaW5ldWcvZXJkLWVkaXRvci9tYWluL2pzb24tc2NoZW1hL3NjaGVtYS5qc29uIix2ZXJzaW9uOiIzLjAuMCIsc2V0dGluZ3M6bCxkb2M6dSxjb2xsZWN0aW9uczp7dGFibGVFbnRpdGllczpkLHRhYmxlQ29sdW1uRW50aXRpZXM6dyxyZWxhdGlvbnNoaXBFbnRpdGllczpoLGluZGV4RW50aXRpZXM6ayxpbmRleENvbHVtbkVudGl0aWVzOlAsbWVtb0VudGl0aWVzOk19LGx3dzpjfX1mdW5jdGlvbiBfYSh0KXtyZXR1cm5bdCwtMSwtMSx7fV19ZnVuY3Rpb24gQ3QodCxlLG4pe3JldHVybiB0W2VdfHwodFtlXT1fYShuKSx0W2VdKX1mdW5jdGlvbiB6YSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsxXSxvPWlbMl07YTxlJiYoaVsxXT1lKSxvPGUmJnMoKX1mdW5jdGlvbiBSYSh0LGUsbixyLHMpe2NvbnN0IGk9Q3QodCxuLHIpLGE9aVsyXSxvPWlbMV07YTxlJiYoaVsyXT1lKSxvPD1lJiZzKCl9ZnVuY3Rpb24gWmEodCxlLG4scixzLGkpe2NvbnN0IGE9Q3QodCxuLHIpOyhhWzNdW3NdPz8tMSk8PWUmJihhWzNdW3NdPWUsaSgpKX1jbGFzcyBQYXtjb25zdHJ1Y3RvcihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbnMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9Y29sbGVjdGlvbihlKXtyZXR1cm4gbmV3IFVhKHRoaXMuY29sbGVjdGlvbnNbZV0sZSl9fWNsYXNzIFVhe2NvbnN0cnVjdG9yKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvbGxlY3Rpb25LZXkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSl9c2VsZWN0QnlJZChlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2VdfXNlbGVjdEJ5SWRzKGUpe3JldHVybiBlLmxlbmd0aCxlLm1hcChuPT50aGlzLnNlbGVjdEJ5SWQobikpLmZpbHRlcihCb29sZWFuKX1zZWxlY3RFbnRpdGllcygpe3JldHVybiB0aGlzLmNvbGxlY3Rpb259c2VsZWN0QWxsKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb2xsZWN0aW9uKX1zZXRPbmUoZSl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbltlLmlkXT1lLHRoaXN9c2V0TWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMuc2V0T25lKG4pKSx0aGlzfXNldEFsbChlKXtyZXR1cm4gdGhpcy5yZW1vdmVBbGwoKSx0aGlzLnNldE1hbnkoZSksdGhpc31hZGRPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlLmlkKT90aGlzOih0aGlzLnNldE9uZShlKSx0aGlzKX1hZGRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5hZGRPbmUobikpLHRoaXN9cmVtb3ZlT25lKGUpe3JldHVybiB0aGlzLnNlbGVjdEJ5SWQoZSkmJlJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5jb2xsZWN0aW9uLGUpLHRoaXN9cmVtb3ZlTWFueShlKXtyZXR1cm4gZS5mb3JFYWNoKG49PnRoaXMucmVtb3ZlT25lKG4pKSx0aGlzfXJlbW92ZUFsbCgpe3JldHVybiB0aGlzLmNvbGxlY3Rpb249e30sdGhpc311cGRhdGVPbmUoZSxuKXtjb25zdCByPXRoaXMuc2VsZWN0QnlJZChlKTtyZXR1cm4gciYmKG4ociksci5tZXRhLnVwZGF0ZUF0PURhdGUubm93KCkpLHRoaXN9dXBkYXRlTWFueShlLG4pe3JldHVybiBlLmZvckVhY2gocj0+dGhpcy51cGRhdGVPbmUocixuKSksdGhpc31nZXRPckNyZWF0ZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO2lmKHIpcmV0dXJuIHI7Y29uc3Qgcz1uKGUpO3JldHVybiB0aGlzLnNldE9uZShzKSx0aGlzLnNlbGVjdEJ5SWQoZSl9YWRkT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIHphKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlbW92ZU9wZXJhdG9yKGUsbixyLHMpe3JldHVybiBSYShlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyksdGhpc31yZXBsYWNlT3BlcmF0b3IoZSxuLHIscyxpKXtyZXR1cm4gWmEoZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMsaSksdGhpc319Y29uc3QgQT10PT5uZXcgUGEodCk7Y2xhc3MgdWUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgSGEgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBqYSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHFhIGV4dGVuZHMgdWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3Mga2UgZXh0ZW5kcyB1ZXt9Y2xhc3MgQW4gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgRCBleHRlbmRzIHVle31jbGFzcyB0ZSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsXz0ic2hvcnQiLEM9ImxvbmciLGV0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sVm49e3llYXI6Zixtb250aDpfLGRheTpmfSxZYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpffSxXbj17eWVhcjpmLG1vbnRoOkMsZGF5OmZ9LExuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkN9LCRuPXtob3VyOmYsbWludXRlOmZ9LF9uPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHpuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOl99LFJuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkN9LFpuPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxQbj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sVW49e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOl99LEhuPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpDfSxqbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxxbj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxZbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxHbj17eWVhcjpmLG1vbnRoOl8sZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxHYT17eWVhcjpmLG1vbnRoOl8sZGF5OmYsd2Vla2RheTpfLGhvdXI6ZixtaW51dGU6Zn0sSm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6X30sQm49e3llYXI6Zixtb250aDpDLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6X30sUW49e3llYXI6Zixtb250aDpDLGRheTpmLHdlZWtkYXk6Qyxob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkN9LEtuPXt5ZWFyOmYsbW9udGg6QyxkYXk6Zix3ZWVrZGF5OkMsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpDfTtjbGFzcyBMZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBGdD1udWxsO2NsYXNzIHR0IGV4dGVuZHMgTGV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBGdD09PW51bGwmJihGdD1uZXcgdHQpLEZ0fWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIGtyKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IG50PXt9O2Z1bmN0aW9uIEphKHQpe3JldHVybiBudFt0XXx8KG50W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxudFt0XX1jb25zdCBCYT17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBRYSh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyxsLHUsY109cjtyZXR1cm5bYSxzLGksbyxsLHUsY119ZnVuY3Rpb24gS2EodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPUJhW2ldO2k9PT0iZXJhIj9yW29dPWE6eShvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCBydD17fTtjbGFzcyBKIGV4dGVuZHMgTGV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gcnRbZV18fChydFtlXT1uZXcgSihlKSkscnRbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXtydD17fSxudD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4ga3IoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gUmUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPUphKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sbCx1LGNdPXIuZm9ybWF0VG9QYXJ0cz9LYShyLG4pOlFhKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCB3PWx0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOmw9PT0yND8wOmwsbWludXRlOnUsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IGs9aCUxZTM7cmV0dXJuIGgtPWs+PTA/azoxZTMraywody1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBYbj17fTtmdW5jdGlvbiBYYSh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVhuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksWG5bbl09cikscn1sZXQgQXQ9e307ZnVuY3Rpb24gVnQodCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj1BdFtuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSxBdFtuXT1yKSxyfWxldCBXdD17fTtmdW5jdGlvbiBlbyh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPVd0W25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxXdFtuXT1yKSxyfWxldCBMdD17fTtmdW5jdGlvbiB0byh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPUx0W3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxMdFtzXT1pKSxpfWxldCAkZT1udWxsO2Z1bmN0aW9uIG5vKCl7cmV0dXJuICRlfHwoJGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsJGUpfWxldCBlcj17fTtmdW5jdGlvbiBybyh0KXtsZXQgZT1lclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxlclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIHNvKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPVZ0KHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCBsPXQuc3Vic3RyaW5nKDAsbik7cj1WdChsKS5yZXNvbHZlZE9wdGlvbnMoKSxzPWx9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBpbyh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIGFvKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPWcudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb28odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1nLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiBzdCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyB1b3tjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPWVvKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6VXQoZSwzKTtyZXR1cm4gSShuLHRoaXMucGFkVG8pfX19Y2xhc3MgY297Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9VnQobixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgZm97Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZwcigpJiYodGhpcy5ydGY9dG8oZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOkZvKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBobz17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIE97c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBPLmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fHYuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6bm8oKSksbD1ufHx2LmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sdT1yfHx2LmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPVp0KHMpfHx2LmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBPKG8sbCx1LGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXskZT1udWxsLEF0PXt9LFd0PXt9LEx0PXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIE8uY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLGxdPXNvKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fGx8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9aW8odGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPWxvKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6Ty5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLFp0KGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiBzdCh0aGlzLGUsSXIsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPWFvKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gc3QodGhpcyxlLE1yLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1vbyhpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gc3QodGhpcyx2b2lkIDAsKCk9PnhyLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W2cudXRjKDIwMTYsMTEsMTMsOSksZy51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHN0KHRoaXMsZSxEciwoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W2cudXRjKC00MCwxLDEpLGcudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgdW8odGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IGNvKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IGZvKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFhhKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6VHIoKT9ybyh0aGlzLmxvY2FsZSk6aG99Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0ICR0PW51bGw7Y2xhc3MgeCBleHRlbmRzIExle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gJHQ9PT1udWxsJiYoJHQ9bmV3IHgoMCkpLCR0fXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/eC51dGNJbnN0YW5jZTpuZXcgeChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IHgodXQoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke1JlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7UmUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIFJlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBtbyBleHRlbmRzIExle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZih5KHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgTGUpcmV0dXJuIHQ7aWYod28odCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj90dC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij94LnV0Y0luc3RhbmNlOngucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP3guaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBtbyh0KX1sZXQgdHI9KCk9PkRhdGUubm93KCksbnI9InN5c3RlbSIscnI9bnVsbCxzcj1udWxsLGlyPW51bGwsYXI9NjAsb3IsbHI9bnVsbDtjbGFzcyB2e3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIHRyfXN0YXRpYyBzZXQgbm93KGUpe3RyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtucj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUobnIsdHQuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiBycn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7cnI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gc3J9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe3NyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gaXJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7aXI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gbHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe2xyPVp0KGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIGFyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe2FyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gb3J9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtvcj1lfXN0YXRpYyByZXNldENhY2hlcygpe08ucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyB6e2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QgdXI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sY3I9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVih0LGUpe3JldHVybiBuZXcgeigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIF90KHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gZnIodCxlLG4pe3JldHVybiBuKyhfZSh0KT9jcjp1cilbZS0xXX1mdW5jdGlvbiBkcih0LGUpe2NvbnN0IG49X2UodCk/Y3I6dXIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHp0KHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gaXQodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPWZyKHIscyxpKSxvPXp0KF90KHIscyxpKSxuKTtsZXQgbD1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksdTtyZXR1cm4gbDwxPyh1PXItMSxsPXplKHUsZSxuKSk6bD56ZShyLGUsbik/KHU9cisxLGw9MSk6dT1yLHt3ZWVrWWVhcjp1LHdlZWtOdW1iZXI6bCx3ZWVrZGF5Om8sLi4uZnQodCl9fWZ1bmN0aW9uIGhyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9enQoX3QociwxLGUpLG4pLG89dmUocik7bGV0IGw9cyo3K2ktYS03K2UsdTtsPDE/KHU9ci0xLGwrPXZlKHUpKTpsPm8/KHU9cisxLGwtPXZlKHIpKTp1PXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09ZHIodSxsKTtyZXR1cm57eWVhcjp1LG1vbnRoOmMsZGF5OmQsLi4uZnQodCl9fWZ1bmN0aW9uIFJ0KHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9ZnIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLmZ0KHQpfX1mdW5jdGlvbiBtcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1kcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5mdCh0KX19ZnVuY3Rpb24geXIodCxlKXtpZigheSh0LmxvY2FsV2Vla2RheSl8fCF5KHQubG9jYWxXZWVrTnVtYmVyKXx8IXkodC5sb2NhbFdlZWtZZWFyKSl7aWYoIXkodC53ZWVrZGF5KXx8IXkodC53ZWVrTnVtYmVyKXx8IXkodC53ZWVrWWVhcikpdGhyb3cgbmV3IGtlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiB5KHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSkseSh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLHkodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24geW8odCxlPTQsbj0xKXtjb25zdCByPWF0KHQud2Vla1llYXIpLHM9Vyh0LndlZWtOdW1iZXIsMSx6ZSh0LndlZWtZZWFyLGUsbikpLGk9Vyh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vigid2Vla2RheSIsdC53ZWVrZGF5KTpWKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlYoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBnbyh0KXtjb25zdCBlPWF0KHQueWVhciksbj1XKHQub3JkaW5hbCwxLHZlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vigib3JkaW5hbCIsdC5vcmRpbmFsKTpWKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIGdyKHQpe2NvbnN0IGU9YXQodC55ZWFyKSxuPVcodC5tb250aCwxLDEyKSxyPVcodC5kYXksMSxvdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpWKCJkYXkiLHQuZGF5KTpWKCJtb250aCIsdC5tb250aCk6VigieWVhciIsdC55ZWFyKX1mdW5jdGlvbiB3cih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPVcoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9VyhuLDAsNTkpLG89VyhyLDAsNTkpLGw9VyhzLDAsOTk5KTtyZXR1cm4gaT9hP28/bD8hMTpWKCJtaWxsaXNlY29uZCIscyk6Vigic2Vjb25kIixyKTpWKCJtaW51dGUiLG4pOlYoImhvdXIiLGUpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIGF0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gd28odCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBwbyh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHByKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFRyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVG8odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gU3IodCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gU28odCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIFp0KHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBEKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoIVcodC5maXJzdERheSwxLDcpfHwhVyh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiFXKGUsMSw3KSkpdGhyb3cgbmV3IEQoIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uIFcodCxlLG4pe3JldHVybiBhdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBPbyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEkodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoeSh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gUHQodCl7aWYoISh5KHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBVdCh0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4gX2UodCk/MzY2OjM2NX1mdW5jdGlvbiBvdCh0LGUpe2NvbnN0IG49T28oZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/X2Uocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gbHQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gT3IodCxlLG4pe3JldHVybi16dChfdCh0LDEsZSksbikrZS0xfWZ1bmN0aW9uIHplKHQsZT00LG49MSl7Y29uc3Qgcj1Pcih0LGUsbikscz1Pcih0KzEsZSxuKTtyZXR1cm4odmUodCktcitzKS83fWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0Pjk5P3Q6dD52LnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24ga3IodCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKGw9PmwudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiB1dCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBicih0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgRChgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBjdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPWJyKHMpfXJldHVybiBufWZ1bmN0aW9uIFJlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7SShuLDIpfToke0kociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtJKG4sMil9JHtJKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBmdCh0KXtyZXR1cm4gU28odCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCBrbz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sdnI9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxibz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIElyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmJvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4udnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmtvXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IEVyPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxOcj1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLHZvPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIE1yKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnZvXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uTnJdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLkVyXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IHhyPVsiQU0iLCJQTSJdLElvPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sRW89WyJCQyIsIkFEIl0sTm89WyJCIiwiQSJdO2Z1bmN0aW9uIERyKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLk5vXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uRW9dO2Nhc2UibG9uZyI6cmV0dXJuWy4uLklvXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBNbyh0KXtyZXR1cm4geHJbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24geG8odCxlKXtyZXR1cm4gTXIoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIERvKHQsZSl7cmV0dXJuIElyKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gQ28odCxlKXtyZXR1cm4gRHIoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBGbyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSxsPW89PT0xLHU9c1t0XSxjPXI/bD91WzFdOnVbMl18fHVbMV06bD9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIENyKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgQW89e0Q6ZXQsREQ6Vm4sREREOlduLEREREQ6TG4sdDokbix0dDpfbix0dHQ6em4sdHR0dDpSbixUOlpuLFRUOlBuLFRUVDpVbixUVFRUOkhuLGY6am4sZmY6WW4sZmZmOkpuLGZmZmY6UW4sRjpxbixGRjpHbixGRkY6Qm4sRkZGRjpLbn07Y2xhc3MgTntzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyBOKGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIEFvW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEkoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLGspPT50aGlzLmxvYy5leHRyYWN0KGUsaCxrKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9NbyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSxsPShoLGspPT5yP0RvKGUsaCk6aShrP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSx1PShoLGspPT5yP3hvKGUsaCk6aShrP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3Qgaz1OLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIGs/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLGspOmh9LGQ9aD0+cj9DbyhlLGgpOmkoe2VyYTpofSwiZXJhIiksdz1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gdSgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiB1KCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIHUoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiB1KCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIHUoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gdSgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiBsKCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIGwoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gbCgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIGwoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gbCgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiBsKCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIENyKE4ucGFyc2VGb3JtYXQobiksdyl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj1sPT57c3dpdGNoKGxbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9bD0+dT0+e2NvbnN0IGM9cih1KTtyZXR1cm4gYz90aGlzLm51bShsLmdldChjKSx1Lmxlbmd0aCk6dX0saT1OLnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKGwse2xpdGVyYWw6dSx2YWw6Y30pPT51P2w6bC5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcihsPT5sKSk7cmV0dXJuIENyKGkscyhvKSl9fWNvbnN0IEZyPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sbF09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLGxdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIEFyKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IFZyPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyxWbz1gKD86JHtWci5zb3VyY2V9Pyg/OlxcWygke0ZyLnNvdXJjZX0pXFxdKT8pP2AsanQ9LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8sV3I9UmVnRXhwKGAke2p0LnNvdXJjZX0ke1ZvfWApLHF0PVJlZ0V4cChgKD86VCR7V3Iuc291cmNlfSk/YCksV289LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLExvPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLCRvPS8oXGR7NH0pLT8oXGR7M30pLyxfbz1Bcigid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLHpvPUFyKCJ5ZWFyIiwib3JkaW5hbCIpLFJvPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLExyPVJlZ0V4cChgJHtqdC5zb3VyY2V9ID8oPzoke1ZyLnNvdXJjZX18KCR7RnIuc291cmNlfSkpP2ApLFpvPVJlZ0V4cChgKD86ICR7THIuc291cmNlfSk/YCk7ZnVuY3Rpb24gTWUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4geShyKT9uOnJlKHIpfWZ1bmN0aW9uIFBvKHQsZSl7cmV0dXJuW3t5ZWFyOk1lKHQsZSksbW9udGg6TWUodCxlKzEsMSksZGF5Ok1lKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24geGUodCxlKXtyZXR1cm5be2hvdXJzOk1lKHQsZSwwKSxtaW51dGVzOk1lKHQsZSsxLDApLHNlY29uZHM6TWUodCxlKzIsMCksbWlsbGlzZWNvbmRzOlB0KHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBaZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj11dCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDp4Lmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gUGUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IFVvPVJlZ0V4cChgXlQ/JHtqdC5zb3VyY2V9JGApLEhvPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIGpvKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sbCx1XT10LGM9ZVswXT09PSItIixkPWwmJmxbMF09PT0iLSIsdz0oaCxrPSExKT0+aCE9PXZvaWQgMCYmKGt8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczp3KGZlKG4pKSxtb250aHM6dyhmZShyKSksd2Vla3M6dyhmZShzKSksZGF5czp3KGZlKGkpKSxob3Vyczp3KGZlKGEpKSxtaW51dGVzOncoZmUobykpLHNlY29uZHM6dyhmZShsKSxsPT09Ii0wIiksbWlsbGlzZWNvbmRzOncoUHQodSksZCl9XX1jb25zdCBxbz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gWXQodCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/SHQocmUoZSkpOnJlKGUpLG1vbnRoOnZyLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9Fci5pbmRleE9mKHQpKzE6TnIuaW5kZXhPZih0KSsxKSxvfWNvbnN0IFlvPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gR28odCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sbCx1LGMsZF09dCx3PVl0KGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiBsP2g9cW9bbF06dT9oPTA6aD11dChjLGQpLFt3LG5ldyB4KGgpXX1mdW5jdGlvbiBKbyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IEJvPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sUW89L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sS289L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uICRyKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltZdChlLHMscixuLGksYSxvKSx4LnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBYbyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bWXQoZSxvLG4scixzLGksYSkseC51dGNJbnN0YW5jZV19Y29uc3QgZWw9SWUoV28scXQpLHRsPUllKExvLHF0KSxubD1JZSgkbyxxdCkscmw9SWUoV3IpLF9yPUVlKFBvLHhlLFplLFBlKSxzbD1FZShfbyx4ZSxaZSxQZSksaWw9RWUoem8seGUsWmUsUGUpLGFsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBvbCh0KXtyZXR1cm4gTmUodCxbZWwsX3JdLFt0bCxzbF0sW25sLGlsXSxbcmwsYWxdKX1mdW5jdGlvbiBsbCh0KXtyZXR1cm4gTmUoSm8odCksW1lvLEdvXSl9ZnVuY3Rpb24gdWwodCl7cmV0dXJuIE5lKHQsW0JvLCRyXSxbUW8sJHJdLFtLbyxYb10pfWZ1bmN0aW9uIGNsKHQpe3JldHVybiBOZSh0LFtIbyxqb10pfWNvbnN0IGZsPUVlKHhlKTtmdW5jdGlvbiBkbCh0KXtyZXR1cm4gTmUodCxbVW8sZmxdKX1jb25zdCBobD1JZShSbyxabyksbWw9SWUoTHIpLHlsPUVlKHhlLFplLFBlKTtmdW5jdGlvbiBnbCh0KXtyZXR1cm4gTmUodCxbaGwsX3JdLFttbCx5bF0pfWNvbnN0IHpyPSJJbnZhbGlkIER1cmF0aW9uIixScj17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSx3bD17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Scn0sTD0xNDYwOTcvNDAwLERlPTE0NjA5Ny80ODAwLHBsPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6RGUvNyxkYXlzOkRlLGhvdXJzOkRlKjI0LG1pbnV0ZXM6RGUqMjQqNjAsc2Vjb25kczpEZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6RGUqMjQqNjAqNjAqMWUzfSwuLi5Scn0sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLFRsPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgVChyKX1mdW5jdGlvbiBacih0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIFRsLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBQcih0LGUpe2NvbnN0IG49WnIodCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZih5KGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKHkoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIFNsKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3MgVHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj9wbDp3bDtlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxPLmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gVC5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IEQoYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgVCh7dmFsdWVzOmN0KGUsVC5ub3JtYWxpemVVbml0KSxsb2M6Ty5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gVC5mcm9tTWlsbGlzKGUpO2lmKFQuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIFQuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgRChgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPWNsKGUpO3JldHVybiByP1QuZnJvbU9iamVjdChyLG4pOlQuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09ZGwoZSk7cmV0dXJuIHI/VC5mcm9tT2JqZWN0KHIsbik6VC5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHFhKHIpO3JldHVybiBuZXcgVCh7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgQW4oZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6enJ9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB6cjtjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4geShzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPVV0KHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxnLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/WnIodGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09YnIoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW1Qubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uY3QoZSxULm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gUHIodGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPVNsKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT5ULm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCB1IGluIHIpbys9dGhpcy5tYXRyaXhbdV1bYV0qclt1XSxyW3VdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCBsPU1hdGgudHJ1bmMobyk7blthXT1sLHJbYV09KG8qMWUzLWwqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFByKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IENlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBPbCh0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2IuaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/Yi5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2IuaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3MgYntjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IEQoIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIHo/ZTpuZXcgeihlLG4pO2lmKHYudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IGphKHIpO3JldHVybiBuZXcgYih7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUhlKGUpLHM9SGUobiksaT1PbChyLHMpO3JldHVybiBpPz9uZXcgYih7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9VC5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SGUoZSk7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPWcuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sbDt0cnl7bz1nLmZyb21JU08ocyxuKSxsPW8uaXNWYWxpZH1jYXRjaHtsPSExfWlmKGEmJmwpcmV0dXJuIGIuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IHU9VC5mcm9tSVNPKHMsbik7aWYodS5pc1ZhbGlkKXJldHVybiBiLmFmdGVyKGksdSl9ZWxzZSBpZihsKXtjb25zdCB1PVQuZnJvbUlTTyhyLG4pO2lmKHUuaXNWYWxpZClyZXR1cm4gYi5iZWZvcmUobyx1KX19cmV0dXJuIGIuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9iLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChIZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGIuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49VC5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHMobD0+bCpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChiLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDpiLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBiLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKGw9Plt7dGltZTpsLnMsdHlwZToicyJ9LHt0aW1lOmwuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKGwsdSk9PmwudGltZS11LnRpbWUpO2Zvcihjb25zdCBsIG9mIG8pcis9bC50eXBlPT09InMiPzE6LTEscj09PTE/bj1sLnRpbWU6KG4mJituIT0rbC50aW1lJiZzLnB1c2goYi5mcm9tRGF0ZVRpbWVzKG4sbC50aW1lKSksbj1udWxsKTtyZXR1cm4gYi5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBiLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkNlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9ZXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkNlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkNlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkNlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkNlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpDZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTpULmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGIuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgZHR7c3RhdGljIGhhc0RTVChlPXYuZGVmYXVsdFpvbmUpe2NvbnN0IG49Zy5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLHYuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fE8uY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8Ty5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxPLmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8Ty5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fE8uY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBPLmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gTy5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6cHIoKSxsb2NhbGVXZWVrOlRyKCl9fX1mdW5jdGlvbiBVcih0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKFQuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiBrbCh0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKGwsdSk9PnUueWVhci1sLnllYXJdLFsicXVhcnRlcnMiLChsLHUpPT51LnF1YXJ0ZXItbC5xdWFydGVyKyh1LnllYXItbC55ZWFyKSo0XSxbIm1vbnRocyIsKGwsdSk9PnUubW9udGgtbC5tb250aCsodS55ZWFyLWwueWVhcikqMTJdLFsid2Vla3MiLChsLHUpPT57Y29uc3QgYz1VcihsLHUpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsVXJdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFtsLHVdb2YgciluLmluZGV4T2YobCk+PTAmJihhPWwsc1tsXT11KHQsZSksbz1pLnBsdXMocyksbz5lPyhzW2xdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbbF0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIGJsKHQsZSxuLHIpe2xldFtzLGksYSxvXT1rbCh0LGUsbik7Y29uc3QgbD1lLXMsdT1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTt1Lmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKStsLyhhLXMpKSk7Y29uc3QgYz1ULmZyb21PYmplY3QoaSxyKTtyZXR1cm4gdS5sZW5ndGg+MD9ULmZyb21NaWxsaXMobCxyKS5zaGlmdFRvKC4uLnUpLnBsdXMoYyk6Y31jb25zdCBHdD17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sSHI9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LHZsPUd0LmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gSWwodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKEd0LmhhbmlkZWMpIT09LTEpZSs9dmwuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIEhyKXtjb25zdFtpLGFdPUhyW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7R3RbdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgRWw9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIFModCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKElsKG4pKX19Y29uc3QganI9IlsgwqBdIixxcj1uZXcgUmVnRXhwKGpyLCJnIik7ZnVuY3Rpb24gTmwodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UocXIsanIpfWZ1bmN0aW9uIFlyKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UocXIsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKE5sKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5ZcihuKT09PVlyKHIpKStlfX1mdW5jdGlvbiBHcih0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT51dChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiBodCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gTWwodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIHhsKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSxsPVIoZSwiezEsM30iKSx1PVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSx3PVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKE1sKE0udmFsKSksZGVzZXI6KFtqXSk9PmosbGl0ZXJhbDohMH0pLFA9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBaKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gWihlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBTKHUpO2Nhc2UieXkiOnJldHVybiBTKGQsSHQpO2Nhc2UieXl5eSI6cmV0dXJuIFMoaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIFModyk7Y2FzZSJ5eXl5eXkiOnJldHVybiBTKGEpO2Nhc2UiTSI6cmV0dXJuIFMobyk7Y2FzZSJNTSI6cmV0dXJuIFMocik7Y2FzZSJNTU0iOnJldHVybiBaKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFooZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBTKG8pO2Nhc2UiTEwiOnJldHVybiBTKHIpO2Nhc2UiTExMIjpyZXR1cm4gWihlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBaKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gUyhvKTtjYXNlImRkIjpyZXR1cm4gUyhyKTtjYXNlIm8iOnJldHVybiBTKGwpO2Nhc2Uib29vIjpyZXR1cm4gUyhzKTtjYXNlIkhIIjpyZXR1cm4gUyhyKTtjYXNlIkgiOnJldHVybiBTKG8pO2Nhc2UiaGgiOnJldHVybiBTKHIpO2Nhc2UiaCI6cmV0dXJuIFMobyk7Y2FzZSJtbSI6cmV0dXJuIFMocik7Y2FzZSJtIjpyZXR1cm4gUyhvKTtjYXNlInEiOnJldHVybiBTKG8pO2Nhc2UicXEiOnJldHVybiBTKHIpO2Nhc2UicyI6cmV0dXJuIFMobyk7Y2FzZSJzcyI6cmV0dXJuIFMocik7Y2FzZSJTIjpyZXR1cm4gUyhsKTtjYXNlIlNTUyI6cmV0dXJuIFMocyk7Y2FzZSJ1IjpyZXR1cm4gaHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIGh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gUyhuKTtjYXNlImEiOnJldHVybiBaKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gUyhpKTtjYXNlImtrIjpyZXR1cm4gUyhkLEh0KTtjYXNlIlciOnJldHVybiBTKG8pO2Nhc2UiV1ciOnJldHVybiBTKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gUyhuKTtjYXNlIkVFRSI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFooZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBaKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiBHcihuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIEdyKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiBodCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4gaHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOkVsfTtyZXR1cm4gUC50b2tlbj10LFB9Y29uc3QgRGw9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gQ2wodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IGw9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiFsLHZhbDpsPyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1EbFthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIEZsKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiBBbCh0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSxsPW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaStsKSkpLGkrPWx9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gVmwodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIHkodC56KXx8KG49Si5jcmVhdGUodC56KSkseSh0LlopfHwobnx8KG49bmV3IHgodC5aKSkscj10LlopLHkodC5xKXx8KHQuTT0odC5xLTEpKjMrMSkseSh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSx5KHQudSl8fCh0LlM9UHQodC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IEp0PW51bGw7ZnVuY3Rpb24gV2woKXtyZXR1cm4gSnR8fChKdD1nLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLEp0fWZ1bmN0aW9uIExsKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49Ti5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPVFyKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gSnIodCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT5MbChuLGUpKSl9ZnVuY3Rpb24gQnIodCxlLG4pe2NvbnN0IHI9SnIoTi5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PnhsKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109RmwocyksbD1SZWdFeHAoYSwiaSIpLFt1LGNdPUFsKGUsbCxvKSxbZCx3LGhdPWM/VmwoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBrZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDpsLHJhd01hdGNoZXM6dSxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTp3LHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiAkbCh0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Ccih0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIFFyKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj1OLmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKFdsKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5DbChhLHQsaSkpfWNvbnN0IEJ0PSJJbnZhbGlkIERhdGVUaW1lIixLcj04NjRlMTM7ZnVuY3Rpb24gbXQodCl7cmV0dXJuIG5ldyB6KCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIFF0KHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9aXQodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBLdCh0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1pdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IGcoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIFhyKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIHl0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gZ3QodCxlLG4pe3JldHVybiBYcihsdCh0KSxlLG4pfWZ1bmN0aW9uIGVzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksb3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT1ULmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1sdChpKTtsZXRbbCx1XT1YcihvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJihsKz1hLHU9dC56b25lLm9mZnNldChsKSkse3RzOmwsbzp1fX1mdW5jdGlvbiBVZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCBsPWV8fG8sdT1nLmZyb21PYmplY3QodCx7Li4ubix6b25lOmwsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP3U6dS5zZXRab25lKG8pfWVsc2UgcmV0dXJuIGcuaW52YWxpZChuZXcgeigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gd3QodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/Ti5jcmVhdGUoTy5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBYdCh0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUkodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1JKHQuYy5tb250aCkscis9Ii0iLHIrPUkodC5jLmRheSkpOihyKz1JKHQuYy5tb250aCkscis9SSh0LmMuZGF5KSkscn1mdW5jdGlvbiB0cyh0LGUsbixyLHMsaSl7bGV0IGE9SSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1JKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9SSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUkodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1JKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9SShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9SShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1JKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUkoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBucz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sX2w9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHpsPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LHJzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sUmw9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sWmw9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIFBsKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBBbih0KTtyZXR1cm4gZX1mdW5jdGlvbiBzcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBQbCh0KX19ZnVuY3Rpb24gaXModCxlKXtjb25zdCBuPW5lKGUuem9uZSx2LmRlZmF1bHRab25lKSxyPU8uZnJvbU9iamVjdChlKSxzPXYubm93KCk7bGV0IGksYTtpZih5KHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IHUgb2YgcnMpeSh0W3VdKSYmKHRbdV09bnNbdV0pO2NvbnN0IG89Z3IodCl8fHdyKHQpO2lmKG8pcmV0dXJuIGcuaW52YWxpZChvKTtjb25zdCBsPW4ub2Zmc2V0KHMpO1tpLGFdPWd0KHQsbCxuKX1yZXR1cm4gbmV3IGcoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIGFzKHQsZSxuKXtjb25zdCByPXkobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1VdChhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIG9zKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8di5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IHooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOm10KG4pKTt0aGlzLnRzPXkoZS50cyk/di5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPXl0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgeigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8Ty5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgZyh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1vcyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sbCx1XT1uO3JldHVybiBpcyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDpsLG1pbGxpc2Vjb25kOnV9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPW9zKGFyZ3VtZW50cyksW3IscyxpLGEsbyxsLHVdPW47cmV0dXJuIGUuem9uZT14LnV0Y0luc3RhbmNlLGlzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOmwsbWlsbGlzZWNvbmQ6dX0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPXBvKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIGcuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IGcoe3RzOnIsem9uZTpzLGxvYzpPLmZyb21PYmplY3Qobil9KTpnLmludmFsaWQobXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LUtyfHxlPktyP2cuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBnKHt0czplLHpvbmU6bmUobi56b25lLHYuZGVmYXVsdFpvbmUpLGxvYzpPLmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgRChgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBnKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSx2LmRlZmF1bHRab25lKSxsb2M6Ty5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IEQoImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLHYuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIGcuaW52YWxpZChtdChyKSk7Y29uc3Qgcz1PLmZyb21PYmplY3QobiksaT1jdChlLHNzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309eXIoaSxzKSxsPXYubm93KCksdT15KG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KGwpOm4uc3BlY2lmaWNPZmZzZXQsYz0heShpLm9yZGluYWwpLGQ9IXkoaS55ZWFyKSx3PSF5KGkubW9udGgpfHwheShpLmRheSksaD1kfHx3LGs9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmayl0aHJvdyBuZXcga2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZih3JiZjKXRocm93IG5ldyBrZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBQPWt8fGkud2Vla2RheSYmIWg7bGV0IE0saixCPXl0KGwsdSk7UD8oTT1SbCxqPV9sLEI9aXQoQixhLG8pKTpjPyhNPVpsLGo9emwsQj1SdChCKSk6KE09cnMsaj1ucyk7bGV0IEZlPSExO2Zvcihjb25zdCBLIG9mIE0pe2NvbnN0IFR0PWlbS107eShUdCk/RmU/aVtLXT1qW0tdOmlbS109QltLXTpGZT0hMH1jb25zdCBwdD1QP3lvKGksYSxvKTpjP2dvKGkpOmdyKGkpLHE9cHR8fHdyKGkpO2lmKHEpcmV0dXJuIGcuaW52YWxpZChxKTtjb25zdCBtZT1QP2hyKGksYSxvKTpjP21yKGkpOmksW3llLGllXT1ndChtZSx1LHIpLFE9bmV3IGcoe3RzOnllLHpvbmU6cixvOmllLGxvYzpzfSk7cmV0dXJuIGkud2Vla2RheSYmaCYmZS53ZWVrZGF5IT09US53ZWVrZGF5P2cuaW52YWxpZCgibWlzbWF0Y2hlZCB3ZWVrZGF5IixgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtpLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtRLnRvSVNPKCl9YCk6UX1zdGF0aWMgZnJvbUlTTyhlLG49e30pe2NvbnN0W3Isc109b2woZSk7cmV0dXJuIFVlKHIscyxuLCJJU08gODYwMSIsZSl9c3RhdGljIGZyb21SRkMyODIyKGUsbj17fSl7Y29uc3RbcixzXT1sbChlKTtyZXR1cm4gVWUocixzLG4sIlJGQyAyODIyIixlKX1zdGF0aWMgZnJvbUhUVFAoZSxuPXt9KXtjb25zdFtyLHNdPXVsKGUpO3JldHVybiBVZShyLHMsbiwiSFRUUCIsbil9c3RhdGljIGZyb21Gb3JtYXQoZSxuLHI9e30pe2lmKHkoZSl8fHkobikpdGhyb3cgbmV3IEQoImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdCIpO2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPU8uZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSksW28sbCx1LGNdPSRsKGEsZSxuKTtyZXR1cm4gYz9nLmludmFsaWQoYyk6VWUobyxsLHIsYGZvcm1hdCAke259YCxlLHUpfXN0YXRpYyBmcm9tU3RyaW5nKGUsbixyPXt9KXtyZXR1cm4gZy5mcm9tRm9ybWF0KGUsbixyKX1zdGF0aWMgZnJvbVNRTChlLG49e30pe2NvbnN0W3Isc109Z2woZSk7cmV0dXJuIFVlKHIscyxuLCJTUUwiLGUpfXN0YXRpYyBpbnZhbGlkKGUsbj1udWxsKXtpZighZSl0aHJvdyBuZXcgRCgibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkIik7Y29uc3Qgcj1lIGluc3RhbmNlb2Ygej9lOm5ldyB6KGUsbik7aWYodi50aHJvd09uSW52YWxpZCl0aHJvdyBuZXcgSGEocik7cmV0dXJuIG5ldyBnKHtpbnZhbGlkOnJ9KX1zdGF0aWMgaXNEYXRlVGltZShlKXtyZXR1cm4gZSYmZS5pc0x1eG9uRGF0ZVRpbWV8fCExfXN0YXRpYyBwYXJzZUZvcm1hdEZvck9wdHMoZSxuPXt9KXtjb25zdCByPVFyKGUsTy5mcm9tT2JqZWN0KG4pKTtyZXR1cm4gcj9yLm1hcChzPT5zP3MudmFsOm51bGwpLmpvaW4oIiIpOm51bGx9c3RhdGljIGV4cGFuZEZvcm1hdChlLG49e30pe3JldHVybiBKcihOLnBhcnNlRm9ybWF0KGUpLE8uZnJvbU9iamVjdChuKSkubWFwKHM9PnMudmFsKS5qb2luKCIiKX1nZXQoZSl7cmV0dXJuIHRoaXNbZV19Z2V0IGlzVmFsaWQoKXtyZXR1cm4gdGhpcy5pbnZhbGlkPT09bnVsbH1nZXQgaW52YWxpZFJlYXNvbigpe3JldHVybiB0aGlzLmludmFsaWQ/dGhpcy5pbnZhbGlkLnJlYXNvbjpudWxsfWdldCBpbnZhbGlkRXhwbGFuYXRpb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5leHBsYW5hdGlvbjpudWxsfWdldCBsb2NhbGUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLmxvY2FsZTpudWxsfWdldCBudW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm51bWJlcmluZ1N5c3RlbTpudWxsfWdldCBvdXRwdXRDYWxlbmRhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXI6bnVsbH1nZXQgem9uZSgpe3JldHVybiB0aGlzLl96b25lfWdldCB6b25lTmFtZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm5hbWU6bnVsbH1nZXQgeWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnllYXI6TmFOfWdldCBxdWFydGVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmNlaWwodGhpcy5jLm1vbnRoLzMpOk5hTn1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5tb250aDpOYU59Z2V0IGRheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLmRheTpOYU59Z2V0IGhvdXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5ob3VyOk5hTn1nZXQgbWludXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWludXRlOk5hTn1nZXQgc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuc2Vjb25kOk5hTn1nZXQgbWlsbGlzZWNvbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5taWxsaXNlY29uZDpOYU59Z2V0IHdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IHdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1F0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCB3ZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9RdCh0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgaXNXZWVrZW5kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCYmdGhpcy5sb2MuZ2V0V2Vla2VuZERheXMoKS5pbmNsdWRlcyh0aGlzLndlZWtkYXkpfWdldCBsb2NhbFdlZWtkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtkYXk6TmFOfWdldCBsb2NhbFdlZWtOdW1iZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP0t0KHRoaXMpLndlZWtOdW1iZXI6TmFOfWdldCBsb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9LdCh0aGlzKS53ZWVrWWVhcjpOYU59Z2V0IG9yZGluYWwoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1J0KHRoaXMuYykub3JkaW5hbDpOYU59Z2V0IG1vbnRoU2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0Lm1vbnRocygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLm1vbnRoLTFdOm51bGx9Z2V0IG1vbnRoTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQubW9udGhzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCB3ZWVrZGF5U2hvcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2R0LndlZWtkYXlzKCJzaG9ydCIse2xvY09iajp0aGlzLmxvY30pW3RoaXMud2Vla2RheS0xXTpudWxsfWdldCB3ZWVrZGF5TG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/ZHQud2Vla2RheXMoImxvbmciLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgb2Zmc2V0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rdGhpcy5vOk5hTn1nZXQgb2Zmc2V0TmFtZVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLHtmb3JtYXQ6InNob3J0Iixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBvZmZzZXROYW1lTG9uZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2NhbGV9KTpudWxsfWdldCBpc09mZnNldEZpeGVkKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnpvbmUuaXNVbml2ZXJzYWw6bnVsbH1nZXQgaXNJbkRTVCgpe3JldHVybiB0aGlzLmlzT2Zmc2V0Rml4ZWQ/ITE6dGhpcy5vZmZzZXQ+dGhpcy5zZXQoe21vbnRoOjEsZGF5OjF9KS5vZmZzZXR8fHRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDo1fSkub2Zmc2V0fWdldFBvc3NpYmxlT2Zmc2V0cygpe2lmKCF0aGlzLmlzVmFsaWR8fHRoaXMuaXNPZmZzZXRGaXhlZClyZXR1cm5bdGhpc107Y29uc3QgZT04NjRlNSxuPTZlNCxyPWx0KHRoaXMuYykscz10aGlzLnpvbmUub2Zmc2V0KHItZSksaT10aGlzLnpvbmUub2Zmc2V0KHIrZSksYT10aGlzLnpvbmUub2Zmc2V0KHItcypuKSxvPXRoaXMuem9uZS5vZmZzZXQoci1pKm4pO2lmKGE9PT1vKXJldHVyblt0aGlzXTtjb25zdCBsPXItYSpuLHU9ci1vKm4sYz15dChsLGEpLGQ9eXQodSxvKTtyZXR1cm4gYy5ob3VyPT09ZC5ob3VyJiZjLm1pbnV0ZT09PWQubWludXRlJiZjLnNlY29uZD09PWQuc2Vjb25kJiZjLm1pbGxpc2Vjb25kPT09ZC5taWxsaXNlY29uZD9baGUodGhpcyx7dHM6bH0pLGhlKHRoaXMse3RzOnV9KV06W3RoaXNdfWdldCBpc0luTGVhcFllYXIoKXtyZXR1cm4gX2UodGhpcy55ZWFyKX1nZXQgZGF5c0luTW9udGgoKXtyZXR1cm4gb3QodGhpcy55ZWFyLHRoaXMubW9udGgpfWdldCBkYXlzSW5ZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD92ZSh0aGlzLnllYXIpOk5hTn1nZXQgd2Vla3NJbldlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLndlZWtZZWFyKTpOYU59Z2V0IHdlZWtzSW5Mb2NhbFdlZWtZZWFyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD96ZSh0aGlzLmxvY2FsV2Vla1llYXIsdGhpcy5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSk6TmFOfXJlc29sdmVkTG9jYWxlT3B0aW9ucyhlPXt9KXtjb25zdHtsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixjYWxlbmRhcjpzfT1OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7cmV0dXJue2xvY2FsZTpuLG51bWJlcmluZ1N5c3RlbTpyLG91dHB1dENhbGVuZGFyOnN9fXRvVVRDKGU9MCxuPXt9KXtyZXR1cm4gdGhpcy5zZXRab25lKHguaW5zdGFuY2UoZSksbil9dG9Mb2NhbCgpe3JldHVybiB0aGlzLnNldFpvbmUodi5kZWZhdWx0Wm9uZSl9c2V0Wm9uZShlLHtrZWVwTG9jYWxUaW1lOm49ITEsa2VlcENhbGVuZGFyVGltZTpyPSExfT17fSl7aWYoZT1uZShlLHYuZGVmYXVsdFpvbmUpLGUuZXF1YWxzKHRoaXMuem9uZSkpcmV0dXJuIHRoaXM7aWYoZS5pc1ZhbGlkKXtsZXQgcz10aGlzLnRzO2lmKG58fHIpe2NvbnN0IGk9ZS5vZmZzZXQodGhpcy50cyksYT10aGlzLnRvT2JqZWN0KCk7W3NdPWd0KGEsaSxlKX1yZXR1cm4gaGUodGhpcyx7dHM6cyx6b25lOmV9KX1lbHNlIHJldHVybiBnLmludmFsaWQobXQoZSkpfXJlY29uZmlndXJlKHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyfT17fSl7Y29uc3Qgcz10aGlzLmxvYy5jbG9uZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn0pO3JldHVybiBoZSh0aGlzLHtsb2M6c30pfXNldExvY2FsZShlKXtyZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7bG9jYWxlOmV9KX1zZXQoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPWN0KGUsc3MpLHttaW5EYXlzSW5GaXJzdFdlZWs6cixzdGFydE9mV2VlazpzfT15cihuLHRoaXMubG9jKSxpPSF5KG4ud2Vla1llYXIpfHwheShuLndlZWtOdW1iZXIpfHwheShuLndlZWtkYXkpLGE9IXkobi5vcmRpbmFsKSxvPSF5KG4ueWVhciksbD0heShuLm1vbnRoKXx8IXkobi5kYXkpLHU9b3x8bCxjPW4ud2Vla1llYXJ8fG4ud2Vla051bWJlcjtpZigodXx8YSkmJmMpdGhyb3cgbmV3IGtlKCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzIik7aWYobCYmYSl0aHJvdyBuZXcga2UoIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5Iik7bGV0IGQ7aT9kPWhyKHsuLi5pdCh0aGlzLmMscixzKSwuLi5ufSxyLHMpOnkobi5vcmRpbmFsKT8oZD17Li4udGhpcy50b09iamVjdCgpLC4uLm59LHkobi5kYXkpJiYoZC5kYXk9TWF0aC5taW4ob3QoZC55ZWFyLGQubW9udGgpLGQuZGF5KSkpOmQ9bXIoey4uLlJ0KHRoaXMuYyksLi4ubn0pO2NvbnN0W3csaF09Z3QoZCx0aGlzLm8sdGhpcy56b25lKTtyZXR1cm4gaGUodGhpcyx7dHM6dyxvOmh9KX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1ULmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIGhlKHRoaXMsZXModGhpcyxuKSl9bWludXMoZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBuPVQuZnJvbUR1cmF0aW9uTGlrZShlKS5uZWdhdGUoKTtyZXR1cm4gaGUodGhpcyxlcyh0aGlzLG4pKX1zdGFydE9mKGUse3VzZUxvY2FsZVdlZWtzOm49ITF9PXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IHI9e30scz1ULm5vcm1hbGl6ZVVuaXQoZSk7c3dpdGNoKHMpe2Nhc2UieWVhcnMiOnIubW9udGg9MTtjYXNlInF1YXJ0ZXJzIjpjYXNlIm1vbnRocyI6ci5kYXk9MTtjYXNlIndlZWtzIjpjYXNlImRheXMiOnIuaG91cj0wO2Nhc2UiaG91cnMiOnIubWludXRlPTA7Y2FzZSJtaW51dGVzIjpyLnNlY29uZD0wO2Nhc2Uic2Vjb25kcyI6ci5taWxsaXNlY29uZD0wO2JyZWFrfWlmKHM9PT0id2Vla3MiKWlmKG4pe2NvbnN0IGk9dGhpcy5sb2MuZ2V0U3RhcnRPZldlZWsoKSx7d2Vla2RheTphfT10aGlzO2E8aSYmKHIud2Vla051bWJlcj10aGlzLndlZWtOdW1iZXItMSksci53ZWVrZGF5PWl9ZWxzZSByLndlZWtkYXk9MTtpZihzPT09InF1YXJ0ZXJzIil7Y29uc3QgaT1NYXRoLmNlaWwodGhpcy5tb250aC8zKTtyLm1vbnRoPShpLTEpKjMrMX1yZXR1cm4gdGhpcy5zZXQocil9ZW5kT2YoZSxuKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMucGx1cyh7W2VdOjF9KS5zdGFydE9mKGUsbikubWludXMoMSk6dGhpc310b0Zvcm1hdChlLG49e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/Ti5jcmVhdGUodGhpcy5sb2MucmVkZWZhdWx0VG9FTihuKSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHRoaXMsZSk6QnR9dG9Mb2NhbGVTdHJpbmcoZT1ldCxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP04uY3JlYXRlKHRoaXMubG9jLmNsb25lKG4pLGUpLmZvcm1hdERhdGVUaW1lKHRoaXMpOkJ0fXRvTG9jYWxlUGFydHMoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShlKSxlKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpOltdfXRvSVNPKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQiLHN1cHByZXNzU2Vjb25kczpuPSExLHN1cHByZXNzTWlsbGlzZWNvbmRzOnI9ITEsaW5jbHVkZU9mZnNldDpzPSEwLGV4dGVuZGVkWm9uZTppPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBhPWU9PT0iZXh0ZW5kZWQiO2xldCBvPVh0KHRoaXMsYSk7cmV0dXJuIG8rPSJUIixvKz10cyh0aGlzLGEsbixyLHMsaSksb310b0lTT0RhdGUoe2Zvcm1hdDplPSJleHRlbmRlZCJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP1h0KHRoaXMsZT09PSJleHRlbmRlZCIpOm51bGx9dG9JU09XZWVrRGF0ZSgpe3JldHVybiB3dCh0aGlzLCJra2trLSdXJ1dXLWMiKX10b0lTT1RpbWUoe3N1cHByZXNzTWlsbGlzZWNvbmRzOmU9ITEsc3VwcHJlc3NTZWNvbmRzOm49ITEsaW5jbHVkZU9mZnNldDpyPSEwLGluY2x1ZGVQcmVmaXg6cz0hMSxleHRlbmRlZFpvbmU6aT0hMSxmb3JtYXQ6YT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8ocz8iVCI6IiIpK3RzKHRoaXMsYT09PSJleHRlbmRlZCIsbixlLHIsaSk6bnVsbH10b1JGQzI4MjIoKXtyZXR1cm4gd3QodGhpcywiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWloiLCExKX10b0hUVFAoKXtyZXR1cm4gd3QodGhpcy50b1VUQygpLCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnIil9dG9TUUxEYXRlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9YdCh0aGlzLCEwKTpudWxsfXRvU1FMVGltZSh7aW5jbHVkZU9mZnNldDplPSEwLGluY2x1ZGVab25lOm49ITEsaW5jbHVkZU9mZnNldFNwYWNlOnI9ITB9PXt9KXtsZXQgcz0iSEg6bW06c3MuU1NTIjtyZXR1cm4obnx8ZSkmJihyJiYocys9IiAiKSxuP3MrPSJ6IjplJiYocys9IlpaIikpLHd0KHRoaXMscywhMCl9dG9TUUwoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKGUpfWA6bnVsbH10b1N0cmluZygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50b0lTTygpOkJ0fVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YERhdGVUaW1lIHsgdHM6ICR7dGhpcy50b0lTTygpfSwgem9uZTogJHt0aGlzLnpvbmUubmFtZX0sIGxvY2FsZTogJHt0aGlzLmxvY2FsZX0gfWA6YERhdGVUaW1lIHsgSW52YWxpZCwgcmVhc29uOiAke3RoaXMuaW52YWxpZFJlYXNvbn0gfWB9dmFsdWVPZigpe3JldHVybiB0aGlzLnRvTWlsbGlzKCl9dG9NaWxsaXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOfXRvU2Vjb25kcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy50cy8xZTM6TmFOfXRvVW5peEludGVnZXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP01hdGguZmxvb3IodGhpcy50cy8xZTMpOk5hTn10b0pTT04oKXtyZXR1cm4gdGhpcy50b0lTTygpfXRvQlNPTigpe3JldHVybiB0aGlzLnRvSlNEYXRlKCl9dG9PYmplY3QoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm57fTtjb25zdCBuPXsuLi50aGlzLmN9O3JldHVybiBlLmluY2x1ZGVDb25maWcmJihuLm91dHB1dENhbGVuZGFyPXRoaXMub3V0cHV0Q2FsZW5kYXIsbi5udW1iZXJpbmdTeXN0ZW09dGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtLG4ubG9jYWxlPXRoaXMubG9jLmxvY2FsZSksbn10b0pTRGF0ZSgpe3JldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQ/dGhpcy50czpOYU4pfWRpZmYoZSxuPSJtaWxsaXNlY29uZHMiLHI9e30pe2lmKCF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQpcmV0dXJuIFQuaW52YWxpZCgiY3JlYXRlZCBieSBkaWZmaW5nIGFuIGludmFsaWQgRGF0ZVRpbWUiKTtjb25zdCBzPXtsb2NhbGU6dGhpcy5sb2NhbGUsbnVtYmVyaW5nU3lzdGVtOnRoaXMubnVtYmVyaW5nU3lzdGVtLC4uLnJ9LGk9VG8obikubWFwKFQubm9ybWFsaXplVW5pdCksYT1lLnZhbHVlT2YoKT50aGlzLnZhbHVlT2YoKSxvPWE/dGhpczplLGw9YT9lOnRoaXMsdT1ibChvLGwsaSxzKTtyZXR1cm4gYT91Lm5lZ2F0ZSgpOnV9ZGlmZk5vdyhlPSJtaWxsaXNlY29uZHMiLG49e30pe3JldHVybiB0aGlzLmRpZmYoZy5ub3coKSxlLG4pfXVudGlsKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/Yi5mcm9tRGF0ZVRpbWVzKHRoaXMsZSk6dGhpc31oYXNTYW1lKGUsbixyKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiExO2NvbnN0IHM9ZS52YWx1ZU9mKCksaT10aGlzLnNldFpvbmUoZS56b25lLHtrZWVwTG9jYWxUaW1lOiEwfSk7cmV0dXJuIGkuc3RhcnRPZihuLHIpPD1zJiZzPD1pLmVuZE9mKG4scil9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQmJmUuaXNWYWxpZCYmdGhpcy52YWx1ZU9mKCk9PT1lLnZhbHVlT2YoKSYmdGhpcy56b25lLmVxdWFscyhlLnpvbmUpJiZ0aGlzLmxvYy5lcXVhbHMoZS5sb2MpfXRvUmVsYXRpdmUoZT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtjb25zdCBuPWUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHI9ZS5wYWRkaW5nP3RoaXM8bj8tZS5wYWRkaW5nOmUucGFkZGluZzowO2xldCBzPVsieWVhcnMiLCJtb250aHMiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyJdLGk9ZS51bml0O3JldHVybiBBcnJheS5pc0FycmF5KGUudW5pdCkmJihzPWUudW5pdCxpPXZvaWQgMCksYXMobix0aGlzLnBsdXMociksey4uLmUsbnVtZXJpYzoiYWx3YXlzIix1bml0czpzLHVuaXQ6aX0pfXRvUmVsYXRpdmVDYWxlbmRhcihlPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2FzKGUuYmFzZXx8Zy5mcm9tT2JqZWN0KHt9LHt6b25lOnRoaXMuem9uZX0pLHRoaXMsey4uLmUsbnVtZXJpYzoiYXV0byIsdW5pdHM6WyJ5ZWFycyIsIm1vbnRocyIsImRheXMiXSxjYWxlbmRhcnk6ITB9KTpudWxsfXN0YXRpYyBtaW4oLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5taW4pfXN0YXRpYyBtYXgoLi4uZSl7aWYoIWUuZXZlcnkoZy5pc0RhdGVUaW1lKSl0aHJvdyBuZXcgRCgibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzIik7cmV0dXJuIFNyKGUsbj0+bi52YWx1ZU9mKCksTWF0aC5tYXgpfXN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbihlLG4scj17fSl7Y29uc3R7bG9jYWxlOnM9bnVsbCxudW1iZXJpbmdTeXN0ZW06aT1udWxsfT1yLGE9Ty5mcm9tT3B0cyh7bG9jYWxlOnMsbnVtYmVyaW5nU3lzdGVtOmksZGVmYXVsdFRvRU46ITB9KTtyZXR1cm4gQnIoYSxlLG4pfXN0YXRpYyBmcm9tU3RyaW5nRXhwbGFpbihlLG4scj17fSl7cmV0dXJuIGcuZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHIpfXN0YXRpYyBnZXQgREFURV9TSE9SVCgpe3JldHVybiBldH1zdGF0aWMgZ2V0IERBVEVfTUVEKCl7cmV0dXJuIFZufXN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIFlhfXN0YXRpYyBnZXQgREFURV9GVUxMKCl7cmV0dXJuIFdufXN0YXRpYyBnZXQgREFURV9IVUdFKCl7cmV0dXJuIExufXN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKXtyZXR1cm4gJG59c3RhdGljIGdldCBUSU1FX1dJVEhfU0VDT05EUygpe3JldHVybiBfbn1zdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gem59c3RhdGljIGdldCBUSU1FX1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4gUm59c3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpe3JldHVybiBabn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIFBufXN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpe3JldHVybiBVbn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCgpe3JldHVybiBIbn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCl7cmV0dXJuIGpufXN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIHFufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCl7cmV0dXJuIFlufXN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpe3JldHVybiBHbn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkoKXtyZXR1cm4gR2F9c3RhdGljIGdldCBEQVRFVElNRV9GVUxMKCl7cmV0dXJuIEpufXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gQm59c3RhdGljIGdldCBEQVRFVElNRV9IVUdFKCl7cmV0dXJuIFFufXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gS259fWZ1bmN0aW9uIEhlKHQpe2lmKGcuaXNEYXRlVGltZSh0KSlyZXR1cm4gdDtpZih0JiZ0LnZhbHVlT2YmJmNlKHQudmFsdWVPZigpKSlyZXR1cm4gZy5mcm9tSlNEYXRlKHQpO2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0IilyZXR1cm4gZy5mcm9tT2JqZWN0KHQpO3Rocm93IG5ldyBEKGBVbmtub3duIGRhdGV0aW1lIGFyZ3VtZW50OiAke3R9LCBvZiB0eXBlICR7dHlwZW9mIHR9YCl9ZnVuY3Rpb24gVWwoe2NvbGxlY3Rpb25zOnQsbHd3OmV9LHt0YWJsZUlkczpuLHRhYmxlQ29sdW1uSWRzOnIscmVsYXRpb25zaGlwSWRzOnMsaW5kZXhJZHM6aSxpbmRleENvbHVtbklkczphLG1lbW9JZHM6b30pe0EodCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLnJlbW92ZU1hbnkobiksQSh0KS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIikucmVtb3ZlTWFueShyKSxBKHQpLmNvbGxlY3Rpb24oInJlbGF0aW9uc2hpcEVudGl0aWVzIikucmVtb3ZlTWFueShzKSxBKHQpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKS5yZW1vdmVNYW55KGkpLEEodCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkoYSksQSh0KS5jb2xsZWN0aW9uKCJtZW1vRW50aXRpZXMiKS5yZW1vdmVNYW55KG8pLFsuLi5uLC4uLnIsLi4ucywuLi5pLC4uLmEsLi4ub10uZm9yRWFjaChsPT5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGUsbCkpfWNvbnN0IEhsPTMsamw9JChbInRhYmxlRW50aXRpZXMiLCJ0YWJsZUNvbHVtbkVudGl0aWVzIiwicmVsYXRpb25zaGlwRW50aXRpZXMiLCJpbmRleEVudGl0aWVzIiwiaW5kZXhDb2x1bW5FbnRpdGllcyIsIm1lbW9FbnRpdGllcyJdKTtjbGFzcyBxbHthc3luYyBydW4oZSl7Y29uc3Qgbj1KU09OLnBhcnNlKGUpLHI9JGEobikse2RvYzp7dGFibGVJZHM6cyxtZW1vSWRzOmksaW5kZXhJZHM6YSxyZWxhdGlvbnNoaXBJZHM6b30sY29sbGVjdGlvbnM6bCxsd3c6dX09cixjPSQocyksZD0kKGkpLHc9JChhKSxoPSQobyksaz1ZbChnLm5vdygpKSxQPUEobCkuY29sbGVjdGlvbigidGFibGVFbnRpdGllcyIpLE09QShsKS5jb2xsZWN0aW9uKCJ0YWJsZUNvbHVtbkVudGl0aWVzIiksaj1BKGwpLmNvbGxlY3Rpb24oImluZGV4RW50aXRpZXMiKSxCPUEobCkuY29sbGVjdGlvbigiaW5kZXhDb2x1bW5FbnRpdGllcyIpLEZlPUEobCkuY29sbGVjdGlvbigicmVsYXRpb25zaGlwRW50aXRpZXMiKSxwdD1BKGwpLmNvbGxlY3Rpb24oIm1lbW9FbnRpdGllcyIpLHE9bmV3IFNldChQLnNlbGVjdEFsbCgpLmZpbHRlcihrKGMpKS5tYXAoKHtpZDptfSk9Pm0pKSxtZT1uZXcgU2V0LHllPW5ldyBTZXQoRmUuc2VsZWN0QWxsKCkuZmlsdGVyKGsoaCkpLm1hcCgoe2lkOm19KT0+bSkpLGllPW5ldyBTZXQoai5zZWxlY3RBbGwoKS5maWx0ZXIoayh3KSkubWFwKCh7aWQ6bX0pPT5tKSksUT1uZXcgU2V0LEs9bmV3IFNldChwdC5zZWxlY3RBbGwoKS5maWx0ZXIoayhkKSkubWFwKCh7aWQ6bX0pPT5tKSk7TS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm19KT0+cS5oYXMobSkpLmZvckVhY2goKHtpZDptfSk9Pm1lLmFkZChtKSksRmUuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSxzdGFydDpZLGVuZDpqZX0pPT4heWUuaGFzKG0pJiYocS5oYXMoWS50YWJsZUlkKXx8cS5oYXMoamUudGFibGVJZCkpKS5mb3JFYWNoKCh7aWQ6bX0pPT55ZS5hZGQobSkpLGouc2VsZWN0QWxsKCkuZmlsdGVyKCh7aWQ6bSx0YWJsZUlkOll9KT0+IWllLmhhcyhtKSYmcS5oYXMoWSkpLmZvckVhY2goKHtpZDptfSk9PmllLmFkZChtKSksQi5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpbmRleElkOm19KT0+aWUuaGFzKG0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5RLmFkZChtKSksVWwocix7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119KTtjb25zdCBUdD0kKFAuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksSmw9JChNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLGxzPSQoai5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxCbD0kKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksUWw9JChGZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxLbD0kKHB0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBNLnNlbGVjdEFsbCgpLmZpbHRlcigoe3RhYmxlSWQ6bSxpZDpZLG1ldGE6amV9KT0+IVR0KG0pJiZrKCgpPT4hMSkoe2lkOlksbWV0YTpqZX0pKS5mb3JFYWNoKCh7aWQ6bX0pPT5tZS5hZGQobSkpLEIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpqZX0pPT4hbHMobSkmJmsoKCk9PiExKSh7aWQ6WSxtZXRhOmplfSkpLmZvckVhY2goKHtpZDptfSk9PlEuYWRkKG0pKSxPYmplY3QuZW50cmllcyh1KS5mb3JFYWNoKChbbSxbWV1dKT0+e2lmKGpsKFkpKXN3aXRjaChZKXtjYXNlInRhYmxlRW50aXRpZXMiOiFUdChtKSYmcS5hZGQobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohSmwobSkmJm1lLmFkZChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohUWwobSkmJnllLmFkZChtKTticmVhaztjYXNlImluZGV4RW50aXRpZXMiOiFscyhtKSYmaWUuYWRkKG0pO2JyZWFrO2Nhc2UiaW5kZXhDb2x1bW5FbnRpdGllcyI6IUJsKG0pJiZRLmFkZChtKTticmVhaztjYXNlIm1lbW9FbnRpdGllcyI6IUtsKG0pJiZLLmFkZChtKTticmVha319KSx7dGFibGVJZHM6Wy4uLnFdLHRhYmxlQ29sdW1uSWRzOlsuLi5tZV0scmVsYXRpb25zaGlwSWRzOlsuLi55ZV0saW5kZXhJZHM6Wy4uLmllXSxpbmRleENvbHVtbklkczpbLi4uUV0sbWVtb0lkczpbLi4uS119fX1jb25zdCBZbD10PT5lPT4oe2lkOm4sbWV0YTpyfSk9PntpZihlKG4pKXJldHVybiExO2NvbnN0IHM9TWF0aC5mbG9vcih0LmRpZmYoZy5mcm9tTWlsbGlzKHIudXBkYXRlQXQpLCJkYXlzIikudG9PYmplY3QoKS5kYXlzPz8wKTtyZXR1cm4gSGw8c30sR2w9bmV3IHFsO090KEdsKX0pKCk7Cg==", yR = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), kd = typeof window < "u" && window.Blob && new Blob([yR(Qp)], { type: "text/javascript;charset=utf-8" });
|
|
26565
26565
|
function ZR(e) {
|
|
26566
26566
|
let t;
|
|
26567
26567
|
try {
|
|
@@ -26584,7 +26584,7 @@ function ZR(e) {
|
|
|
26584
26584
|
t && (window.URL || window.webkitURL).revokeObjectURL(t);
|
|
26585
26585
|
}
|
|
26586
26586
|
}
|
|
26587
|
-
const Cd = "@dineug/erd-editor-schema-gc-worker?v3.2.
|
|
26587
|
+
const Cd = "@dineug/erd-editor-schema-gc-worker?v3.2.7";
|
|
26588
26588
|
let ui = null;
|
|
26589
26589
|
function vR() {
|
|
26590
26590
|
if (ui)
|