1/******/ (function(modules) { // webpackBootstrap 2/******/ // The module cache 3/******/ var installedModules = {}; 4/******/ 5/******/ // The require function 6/******/ function __webpack_require__(moduleId) { 7/******/ 8/******/ // Check if module is in cache 9/******/ if(installedModules[moduleId]) { 10/******/ return installedModules[moduleId].exports; 11/******/ } 12/******/ // Create a new module (and put it into the cache) 13/******/ var module = installedModules[moduleId] = { 14/******/ i: moduleId, 15/******/ l: false, 16/******/ exports: {} 17/******/ }; 18/******/ 19/******/ // Execute the module function 20/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21/******/ 22/******/ // Flag the module as loaded 23/******/ module.l = true; 24/******/ 25/******/ // Return the exports of the module 26/******/ return module.exports; 27/******/ } 28/******/ 29/******/ 30/******/ // expose the modules object (__webpack_modules__) 31/******/ __webpack_require__.m = modules; 32/******/ 33/******/ // expose the module cache 34/******/ __webpack_require__.c = installedModules; 35/******/ 36/******/ // identity function for calling harmony imports with the correct context 37/******/ __webpack_require__.i = function(value) { return value; }; 38/******/ 39/******/ // define getter function for harmony exports 40/******/ __webpack_require__.d = function(exports, name, getter) { 41/******/ if(!__webpack_require__.o(exports, name)) { 42/******/ Object.defineProperty(exports, name, { 43/******/ configurable: false, 44/******/ enumerable: true, 45/******/ get: getter 46/******/ }); 47/******/ } 48/******/ }; 49/******/ 50/******/ // getDefaultExport function for compatibility with non-harmony modules 51/******/ __webpack_require__.n = function(module) { 52/******/ var getter = module && module.__esModule ? 53/******/ function getDefault() { return module['default']; } : 54/******/ function getModuleExports() { return module; }; 55/******/ __webpack_require__.d(getter, 'a', getter); 56/******/ return getter; 57/******/ }; 58/******/ 59/******/ // Object.prototype.hasOwnProperty.call 60/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 61/******/ 62/******/ // __webpack_public_path__ 63/******/ __webpack_require__.p = ""; 64/******/ 65/******/ // Load entry module and return exports 66/******/ return __webpack_require__(__webpack_require__.s = 72); 67/******/ }) 68/************************************************************************/ 69/******/ ([ 70/* 0 */ 71/***/ (function(module, exports, __webpack_require__) { 72 73"use strict"; 74 75 76exports.__esModule = true; 77var _$ = true ? window.jQuery : require('jquery'), 78 _html2canvas = true ? window.html2canvas : require('html2canvas'), 79 _THREE = true ? window.THREE : require('three'), 80 _React = true ? window.React : require('react'), 81 _ReactDOM = true ? window.ReactDOM : require('react-dom'), 82 _PDFJS = true ? window.PDFJS : require('pdfjs'), 83 _tr = function _tr(s) { 84 return (window.iberezansky || {}).tr && window.iberezansky.tr(s) || s; 85}; 86 87exports.$ = _$; 88exports.html2canvas = _html2canvas; 89exports.THREE = _THREE; 90exports.React = _React; 91exports.ReactDOM = _ReactDOM; 92exports.PDFJS = _PDFJS; 93exports.tr = _tr; 94 95/***/ }), 96/* 1 */ 97/***/ (function(module, exports, __webpack_require__) { 98 99"use strict"; 100 101 102exports.__esModule = true; 103 104var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 105 106var _$ = true ? window.jQuery : require('jquery'), 107 _html2canvas = true ? window.html2canvas : require('html2canvas'), 108 _THREE = true ? window.THREE : require('three'), 109 _PDFJS = true ? window.PDFJS : require('pdfjs'), 110 _tr = function _tr(s) { 111 return (window.iberezansky || {}).tr && window.iberezansky.tr(s) || s; 112}; 113 114if (window.FB3D_LOCALE) { 115 window.iberezansky = _extends({}, window.iberezansky, { 116 tr: function tr(s) { 117 return (FB3D_LOCALE.dictionary || {})[s] || s; 118 } 119 }); 120} 121 122exports.$ = _$; 123exports.html2canvas = _html2canvas; 124exports.THREE = _THREE; 125exports.PDFJS = _PDFJS; 126exports.tr = _tr; 127 128/***/ }), 129/* 2 */ 130/***/ (function(module, exports, __webpack_require__) { 131 132"use strict"; 133 134 135exports.__esModule = true; 136 137function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 138 139var BaseMathUtils = function () { 140 function BaseMathUtils() { 141 _classCallCheck(this, BaseMathUtils); 142 } 143 144 BaseMathUtils.sum1 = function sum1(ka, a, kb, b) { 145 return [ka * a[0] + kb * b[0]]; 146 }; 147 148 BaseMathUtils.sum2 = function sum2(ka, a, kb, b) { 149 return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1]]; 150 }; 151 152 BaseMathUtils.sum3 = function sum3(ka, a, kb, b) { 153 return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1], ka * a[2] + kb * b[2]]; 154 }; 155 156 BaseMathUtils.sum4 = function sum4(ka, a, kb, b) { 157 return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1], ka * a[2] + kb * b[2], ka * a[3] + kb * b[3]]; 158 }; 159 160 BaseMathUtils.rk4 = function rk4(dy, t, dt, y) { 161 var sum = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : BaseMathUtils.sum[y.length - 1]; 162 163 var k1 = dy(t, y), 164 k2 = dy(t + dt / 2, sum(1, y, dt / 2, k1)), 165 k3 = dy(t + dt / 2, sum(1, y, dt / 2, k2)), 166 k4 = dy(t + dt, sum(1, y, dt, k3));
167 return sum(1, y, dt / 6, sum(1, sum(1, k1, 2, k2), 1, sum(2, k3, 1, k4))); 168 }; 169 170 BaseMathUtils.extrapolateLinear = function extrapolateLinear(x, y, xi) { 171 return y[0] + (y[1] - y[0]) / (x[1] - x[0]) * (xi - x[0]); 172 }; 173 174 BaseMathUtils.interpolateLinear = function interpolateLinear(x, y, xi) { 175 var yi = void 0; 176 if (x[0] > x[1]) { 177 x = x.reverse(); 178 y = y.reverse(); 179 } 180 if (xi < x[0]) { 181 yi = y[0]; 182 } else if (xi > x[1]) { 183 yi = y[1]; 184 } else { 185 yi = BaseMathUtils.extrapolateLinear(x, y, xi); 186 } 187 return yi; 188 }; 189 190 BaseMathUtils.calcScale = function calcScale(srcW, srcH, dstW, dstH) { 191 return Math.min(dstW / srcW, dstH / srcH); 192 }; 193 194 BaseMathUtils.mulM = function mulM(a, b) { 195 var r = []; 196 for (var i = 0; i < a.length; ++i) { 197 r.push([]); 198 for (var j = 0; j < b[0].length; ++j) { 199 r[i][j] = 0; 200 for (var k = 0; k < b.length; ++k) { 201 r[i][j] += a[i][k] * b[k][j]; 202 } 203 } 204 } 205 return r; 206 }; 207 208 BaseMathUtils.transM = function transM(m) { 209 var r = []; 210 for (var i = 0; i < m.length; ++i) { 211 for (var j = 0; j < m[0].length; ++j) { 212 if (!r[j]) { 213 r[j] = []; 214 } 215 r[j][i] = m[i][j]; 216 } 217 } 218 return r; 219 }; 220 221 BaseMathUtils.mat = function mat(data) { 222 var s = 0; 223 for (var _iterator = data, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 224 var _ref; 225 226 if (_isArray) { 227 if (_i >= _iterator.length) break; 228 _ref = _iterator[_i++]; 229 } else { 230 _i = _iterator.next(); 231 if (_i.done) break; 232 _ref = _i.value; 233 } 234 235 var x = _ref; 236 237 s += x; 238 } 239 return s / data.length; 240 }; 241 242 BaseMathUtils.disp = function disp(data) { 243 var M = BaseMathUtils.mat(data); 244 var s = 0; 245 for (var _iterator2 = data, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 246 var _ref2; 247 248 if (_isArray2) { 249 if (_i2 >= _iterator2.length) break; 250 _ref2 = _iterator2[_i2++]; 251 } else { 252 _i2 = _iterator2.next(); 253 if (_i2.done) break; 254 _ref2 = _i2.value; 255 } 256 257 var x = _ref2; 258 259 s += (x - M) * (x - M); 260 } 261 return s / data.length; 262 }; 263 264 BaseMathUtils.predict = function predict(data, num) { 265 var r = [], 266 l = data.length, 267 D = BaseMathUtils.disp(data); 268 if (D < l && l > 1) { 269 var am = [], 270 bm = []; 271 for (var i = 0; i < l; ++i) { 272 am.push([i, 1]); 273 bm.push([data[i]]); 274 } 275 var ta = BaseMathUtils.transM(am), 276 a = BaseMathUtils.mulM(ta, am), 277 b = BaseMathUtils.mulM(ta, bm), 278 d = a[0][0] * a[1][1] - a[1][0] * a[0][1], 279 p = [-(a[0][1] * b[1][0] - b[0][0] * a[1][1]) / d, (a[0][0] * b[1][0] - a[1][0] * b[0][0]) / d]; 280 for (var _i3 = 0; _i3 < num; ++_i3) { 281 var v = Math.round(p[0] * (_i3 + l) + p[1]); 282 if (r.indexOf(v) === -1) { 283 r.push(v); 284 } 285 } 286 } 287 return r; 288 }; 289 290 BaseMathUtils.getUnique = function getUnique() { 291 return Math.ceil(1e9 * Math.random()); 292 }; 293 294 BaseMathUtils.setSplinePoints = function setSplinePoints(spline, ps) { 295 if (spline.points.length !== ps.x.length) { 296 console.warn('setSplinePoints: bad points'); 297 } 298 for (var i = 0; i < spline.points.length; ++i) { 299 spline.points[i].set(ps.x[i], ps.y[i], ps.z ? ps.z[i] : 0); 300 } 301 }; 302 303 BaseMathUtils.mapl2L = function mapl2L(ls, len, n, f) { 304 var dL = len / (n - 1); 305 var L = 0; 306 for (var i = 0, d = ls[0]; i < ls.length - 1 && L < len + 0.1 * dL; ++i, d += ls[i]) { 307 if (Math.abs(L - d) < Math.abs(L - d - ls[i + 1])) { 308 f(i, L); 309 L += dL; 310 } 311 } 312 if (L < len + 0.1 * dL) { 313 console.warn('mapl2L: ls is not enought'); 314 } 315 }; 316 317 BaseMathUtils.det2 = function det2(a, b, c, d) { 318 return a * d - b * c;
319 }; 320 321 BaseMathUtils.solve2Lin = function solve2Lin(a1, b1, a2, b2) { 322 var res = void 0; 323 var d = BaseMathUtils.det2(a1[0], a1[1], a2[0], a2[1]); 324 if (Math.abs(d) > BaseMathUtils.eps) { 325 var dx = BaseMathUtils.det2(b1, a1[1], b2, a2[1]), 326 dy = BaseMathUtils.det2(a1[0], b1, a2[0], b2); 327 res = { 328 x: dx / d, 329 y: dy / d 330 }; 331 } 332 return res; 333 }; 334 335 BaseMathUtils.isInsidePoly = function isInsidePoly(ps, p) { 336 var done = false, 337 ct = void 0; 338 for (var i = 0; i < ps.length; ++i) { 339 if (BaseMathUtils.v2dist(p, ps[i]) < BaseMathUtils.eps) { 340 ct = 1; 341 done = true; 342 break; 343 } 344 } 345 while (!done) { 346 done = true; 347 ct = 0; 348 var np = { x: p.x + Math.random() - 0.5, y: p.y + Math.random() - 0.5 }, 349 rn = { x: np.x - p.x, y: np.y - p.y }, 350 a1 = [rn.y, -rn.x], 351 b1 = p.x * rn.y - p.y * rn.x; 352 for (var _i4 = 0; _i4 < ps.length; ++_i4) { 353 var p0 = ps[_i4], 354 p1 = ps[(_i4 + 1) % ps.length], 355 n = { x: p1.x - p0.x, y: p1.y - p0.y }, 356 a2 = [n.y, -n.x], 357 b2 = p0.x * n.y - p0.y * n.x, 358 ip = BaseMathUtils.solve2Lin(a1, b1, a2, b2); 359 if (ip) { 360 if (BaseMathUtils.v2dist(ip, p0) < BaseMathUtils.eps || BaseMathUtils.v2dist(ip, p1) < BaseMathUtils.eps) { 361 done = false; 362 break; 363 } else if (ip.x > Math.min(p0.x, p1.x) - BaseMathUtils.eps && ip.x < Math.max(p0.x, p1.x) + BaseMathUtils.eps && ip.y > Math.min(p0.y, p1.y) - BaseMathUtils.eps && ip.y < Math.max(p0.y, p1.y) + BaseMathUtils.eps) { 364 if (BaseMathUtils.v2dist(ip, p) < BaseMathUtils.eps) { 365 ct = 1; 366 break; 367 } else { 368 var tn = { x: ip.x - p.x, y: ip.y - p.y }; 369 ct += tn.x * rn.x + tn.y * rn.y > 0; 370 } 371 } 372 } 373 } 374 } 375 return ct % 2; 376 }; 377 378 BaseMathUtils.isInsideConvPoly = function isInsideConvPoly(ps, p) { 379 var sg = [0, 0]; 380 for (var i = 0; i < ps.length; ++i) { 381 var p0 = ps[i], 382 p1 = ps[(i + 1) % ps.length], 383 a = { x: p0.x - p.x, y: p0.y - p.y }, 384 b = { x: p1.x - p.x, y: p1.y - p.y }; 385 ++sg[(a.x * b.y - a.y * b.x < 0) + 0]; 386 } 387 return ~sg.indexOf(ps.length); 388 }; 389 390 BaseMathUtils.v2len = function v2len(v2) { 391 return Math.sqrt(v2.x * v2.x + v2.y * v2.y); 392 }; 393 394 BaseMathUtils.v2dist = function v2dist(v21, v22) { 395 return BaseMathUtils.v2len({ 396 x: v22.x - v21.x, 397 y: v22.y - v21.y 398 }); 399 }; 400 401 BaseMathUtils.computeSquare = function computeSquare(ps) { 402 var a = []; 403 var p = 0; 404 for (var i = 0; i < ps.length; ++i) { 405 a.push(BaseMathUtils.v2dist(ps[i], ps[(i + 1) % ps.length])); 406 p += 0.5 * a[i]; 407 } 408 return Math.sqrt(p * (p - a[0]) * (p - a[1]) * (p - a[2])); 409 }; 410 411 BaseMathUtils.computeInterpCoefs = function computeInterpCoefs(tri, p) { 412 var s = BaseMathUtils.computeSquare(tri), 413 coefs = [], 414 l = tri.length; 415 for (var i = 0; i < l; ++i) { 416 coefs[i] = BaseMathUtils.computeSquare([p, tri[(i + 1) % l], tri[(i + 2) % l]]) / s; 417 } 418 return coefs; 419 }; 420 421 return BaseMathUtils; 422}(); 423 424BaseMathUtils.sum = [BaseMathUtils.sum1, BaseMathUtils.sum2, BaseMathUtils.sum3, BaseMathUtils.sum4]; 425BaseMathUtils.eps = 1e-4; 426exports.default = BaseMathUtils; 427 428/***/ }), 429/* 3 */ 430/***/ (function(module, exports, __webpack_require__) { 431 432"use strict"; 433 434 435exports.__esModule = true; 436 437var _libs = __webpack_require__(0); 438 439var _BaseMathUtils2 = __webpack_require__(2); 440 441var _BaseMathUtils3 = _interopRequireDefault(_BaseMathUtils2); 442 443function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 444 445function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 446 447function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 448 449function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
449onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 450 451var MathUtils = function (_BaseMathUtils) { 452 _inherits(MathUtils, _BaseMathUtils); 453 454 function MathUtils() { 455 _classCallCheck(this, MathUtils); 456 457 return _possibleConstructorReturn(this, _BaseMathUtils.apply(this, arguments)); 458 } 459 460 MathUtils.splitSpline = function splitSpline(spline, N) { 461 var o = { len: 0, ls: [0] }, 462 dl = 1 / N; 463 for (var i = 0; i <= N; ++i) { 464 var p = spline.getPoint(i * dl); 465 if (i) { 466 var d = MathUtils.v1.distanceTo(p); 467 o.len += d; 468 o.ls.push(d); 469 } 470 MathUtils.v1.copy(p); 471 } 472 return o; 473 }; 474 475 MathUtils.getLinearIndeces = function getLinearIndeces(spline, n) { 476 var del = 5000, 477 dDel = 1 / del; 478 var ls = [0]; 479 var l = 0; 480 for (var i = 0; i <= del; ++i) { 481 var p = spline.getPoint(i * dDel); 482 if (i) { 483 var d = MathUtils.v1.distanceTo(p); 484 l += d; 485 ls.push(d); 486 } 487 MathUtils.v1.copy(p); 488 } 489 ls.push(1e7); 490 491 var res = [], 492 dl = l / (n - 1); 493 for (var _i = 0, L = 0, _d = ls[0]; _i < ls.length - 1; ++_i, _d += ls[_i]) { 494 if (Math.abs(L - _d) < Math.abs(L - _d - ls[_i + 1])) { 495 res.push(_i * dDel); 496 L += dl; 497 } 498 } 499 500 return res; 501 }; 502 503 MathUtils.refinePoly = function refinePoly(poly, maxDl) { 504 var res = []; 505 for (var i = 0; i < poly.length; ++i) { 506 var p0 = poly[i], 507 p1 = poly[(i + 1) % poly.length], 508 l = _BaseMathUtils3.default.v2dist(p0, p1), 509 n = Math.ceil(l / maxDl), 510 dl = l / n; 511 res.push(p0); 512 for (var j = 1; j < n; ++j) { 513 res.push(new _libs.THREE.Vector2(p0.x + j * dl * (p1.x - p0.x) / l, p0.y + j * dl * (p1.y - p0.y) / l)); 514 } 515 } 516 return res; 517 }; 518 519 return MathUtils; 520}(_BaseMathUtils3.default); 521 522MathUtils.v1 = new _libs.THREE.Vector3(); 523exports.default = MathUtils; 524 525/***/ }), 526/* 4 */ 527/***/ (function(module, exports, __webpack_require__) { 528 529"use strict"; 530 531 532exports.__esModule = true; 533 534function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 535 536var Utils = function () { 537 function Utils() { 538 _classCallCheck(this, Utils); 539 } 540 541 Utils.normalizeUrl = function normalizeUrl(url) { 542 function split(s) { 543 return s.replace(/\\/g, '/').split('/'); 544 } 545 var base = split(window.location.href); 546 url = split(url); 547 if (base[2] === url[2]) { 548 url[0] = base[0]; 549 } 550 return url.join('/'); 551 }; 552 553 Utils.extends = function _extends(der, base) { 554 for (var name in base) { 555 if (!der.hasOwnProperty(name)) { 556 der[name] = base[name]; 557 } 558 } 559 }; 560 561 Utils.defaultCmp = function defaultCmp(a, b) { 562 return a - b; 563 }; 564 565 Utils.lowerBound = function lowerBound(a, x, cmp) { 566 cmp = cmp || Utils.defaultCmp; 567 var l = 0, 568 h = a.length - 1; 569 while (h - l > 1) { 570 var mid = Math.floor((l + h) / 2); 571 if (cmp(x, a[mid]) < 0) { 572 h = mid; 573 } else { 574 l = mid; 575 } 576 } 577 return cmp(x, a[h]) >= 0 ? h : l; 578 }; 579 580 return Utils; 581}(); 582 583exports.default = Utils; 584 585/***/ }), 586/* 5 */ 587/***/ (function(module, exports, __webpack_require__) { 588 589"use strict"; 590 591 592exports.__esModule = true; 593 594var _libs = __webpack_require__(0); 595 596var _GraphUtils = __webpack_require__(7); 597 598var _GraphUtils2 = _interopRequireDefault(_GraphUtils); 599 600function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 601 602function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 603 604var ImageBase = function () { 605 function ImageBase(context, width, height, color) { 606 _classCallCheck(this, ImageBase); 607 608 this.context = context; 609 this.wnd = context.wnd; 610 this.doc = context.doc; 611 this.element = context.element || context.doc.body; 612 this.c = context.renderCanvas || ImageBase.renderCanvas; 613 this.ctx = context.renderCanvasCtx || ImageBase.renderCanvasCtx; 614 this.resW = this.width = width; 615 this.resH = this.height = height; 616 this.color = color; 617 } 618 619 ImageBase.prototype.setResolution = function setResolution(res) { 620 this.resW = res.width; 621 this.resH = res.height; 622 }; 623 624 ImageBase.prototype.dispose = function dispose() {}; 625 626 ImageBase.prototype.renderBlankPage = function renderBlankPage() { 627 this.ctx.beginPath(); 628 this.ctx.fillStyle = _GraphUtils2.default.color2Rgba(this.color, 1); 629 this.ctx.rect(0, 0, this.c.width, this.c.height); 630 this.ctx.fill(); 631 }; 632 633 ImageBase.prototype.renderImage = function renderImage(image) { 634 this.pushCtx();
635 this.ctx.drawImage(image, 0, 0); 636 this.popCtx(); 637 }; 638 639 ImageBase.prototype.normToConv = function normToConv(p) { 640 return { 641 x: p.x * this.c.width, 642 y: (1 - p.y) * this.c.height 643 }; 644 }; 645 646 ImageBase.prototype.renderHit = function renderHit(poly) { 647 var ctx = this.ctx; 648 ctx.fillStyle = 'rgba(255,255,0,0.4)'; 649 ctx.beginPath(); 650 var p = this.normToConv(poly[0]); 651 ctx.moveTo(p.x, p.y); 652 for (var i = 1; i < poly.length; ++i) { 653 p = this.normToConv(poly[i]); 654 ctx.lineTo(p.x, p.y); 655 } 656 ctx.closePath(); 657 ctx.fill(); 658 }; 659 660 ImageBase.prototype.pushCtx = function pushCtx() { 661 if (this.resW != this.c.width) { 662 this.c.width = this.resW; 663 } 664 if (this.resH != this.c.height) { 665 this.c.height = this.resH; 666 } 667 this.ctx.save(); 668 this.ctx.scale(this.c.width / this.width, this.c.height / this.height); 669 return this.ctx; 670 }; 671 672 ImageBase.prototype.popCtx = function popCtx() { 673 this.ctx.restore(); 674 }; 675 676 ImageBase.prototype.renderNotFoundPage = function renderNotFoundPage() { 677 this.renderBlankPage(); 678 }; 679 680 ImageBase.prototype.finishRender = function finishRender() { 681 if (this.onChange) { 682 this.onChange(this.c); 683 } 684 }; 685 686 ImageBase.prototype.finishLoad = function finishLoad() { 687 if (this.onLoad) { 688 this.onLoad(); 689 } else { 690 this.startRender(); 691 } 692 }; 693 694 ImageBase.prototype.getSimulatedDoc = function getSimulatedDoc() { 695 return undefined; 696 }; 697 698 return ImageBase; 699}(); 700 701ImageBase.renderCanvas = (0, _libs.$)('<canvas>')[0]; 702ImageBase.renderCanvasCtx = ImageBase.renderCanvas.getContext('2d'); 703exports.default = ImageBase; 704 705/***/ }), 706/* 6 */ 707/***/ (function(module, exports, __webpack_require__) { 708 709"use strict"; 710 711 712exports.__esModule = true; 713 714var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 715 716var _libs = __webpack_require__(0); 717 718function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 719 720var EventConverter = function () { 721 722 // virtuals 723 // getObject(e, data); 724 // getCallback(object); 725 // test(object1, object1); 726 727 function EventConverter(wnd, doc) { 728 _classCallCheck(this, EventConverter); 729 730 this.wnd = wnd; 731 this.doc = doc; 732 this.enabled = true; 733 } 734 735 EventConverter.prototype.setEnable = function setEnable(vl) { 736 if (!vl) { 737 if (this.mCapObject) { 738 this.notify(this.mCapObject, _libs.$.Event('mouseup'), 'mouseup'); 739 this.mCapObject = undefined; 740 } 741 if (this.mHovObject) { 742 this.notify(this.mHovObject, _libs.$.Event('mouseout'), 'mouseout'); 743 this.mHovObject = undefined; 744 } 745 } 746 this.enabled = vl; 747 }; 748 749 EventConverter.prototype.getCallback = function getCallback(object) { 750 return undefined; 751 }; 752 753 EventConverter.prototype.notify = function notify(object, e, type) { 754 var callback = this.getCallback(object); 755 if (callback) { 756 var props = _extends({}, e, { 757 type: type, 758 view: this.wnd 759 }); 760 var jE = _libs.$.Event(type, props); 761 callback(jE, object); 762 } 763 }; 764 765 EventConverter.prototype.convert = function convert(e, data) { 766 if (!this.enabled) return; 767 768 if (this.filter) { 769 e = this.filter(this.element, e); 770 } 771 772 var object = this.getObject(e, data), 773 notify = ~e.type.indexOf('touch') ? this.convertTouch(e, data, object) : this.convertMouse(e, data, object); 774 if (notify && object) { 775 this.notify(object, e, e.type); 776 } 777 }; 778 779 EventConverter.prototype.convertTouch = function convertTouch(e, data, object) { 780 var notify = true; 781 switch (e.type) { 782 case 'touchstart': 783 { 784 if (this.tCapObject) { 785 this.notify(this.tCapObject, e, 'touchend'); 786 } 787 this.tCapObject = object; 788 break; 789 } 790 case 'touchend': 791 { 792 if (this.tCapObject && !this.test(this.tCapObject, object)) { 793 this.notify(this.tCapObject, e, 'touchend'); 794 notify = false; 795 } else if (object && this.test(this.tCapObject, object)) { 796 this.notify(object, e, 'touchtap'); 797 } 798 this.tCapObject = undefined; 799 break; 800 } 801 case 'touchtap': 802 { 803 notify = false; 804 break; 805 } 806 } 807 return notify;
808 }; 809 810 EventConverter.prototype.convertMouse = function convertMouse(e, data, object) { 811 var notify = true; 812 switch (e.type) { 813 case 'mousedown': 814 { 815 if (this.mCapObject) { 816 this.notify(this.mCapObject, e, 'mouseup'); 817 } 818 this.mCapObject = object; 819 break; 820 } 821 case 'mouseup': 822 { 823 if (this.mCapObject && !this.test(this.mCapObject, object)) { 824 this.notify(this.mCapObject, e, 'mouseup'); 825 notify = false; 826 } 827 break; 828 } 829 case 'click': 830 { 831 notify = this.test(this.mCapObject, object); 832 this.mCapObject = undefined; 833 break; 834 } 835 case 'mouseenter': 836 case 'mouseover': 837 case 'mousemove': 838 { 839 if (!this.test(this.mHovObject, object) && this.mHovObject) { 840 this.notify(this.mHovObject, e, 'mouseout'); 841 this.mHovObject = undefined; 842 } 843 if (!this.mHovObject && object) { 844 this.notify(object, e, 'mouseover'); 845 this.mHovObject = object; 846 } 847 notify = e.type === 'mousemove'; 848 break; 849 } 850 case 'mouseleave': 851 case 'mouseout': 852 { 853 if (this.mHovObject) { 854 this.notify(this.mHovObject, e, 'mouseout'); 855 this.mHovObject = undefined; 856 } 857 notify = false; 858 break; 859 } 860 } 861 return notify; 862 }; 863 864 return EventConverter; 865}(); 866 867exports.default = EventConverter; 868 869/***/ }), 870/* 7 */ 871/***/ (function(module, exports, __webpack_require__) { 872 873"use strict"; 874 875 876exports.__esModule = true; 877 878function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 879 880var GraphUtils = function () { 881 function GraphUtils() { 882 _classCallCheck(this, GraphUtils); 883 } 884 885 GraphUtils.extrapolateLinear = function extrapolateLinear(x, y, xi) { 886 return y[0] + (y[1] - y[0]) / (x[1] - x[0]) * (xi - x[0]); 887 }; 888 889 GraphUtils.interpolate01 = function interpolate01(y1, y2, t) { 890 return GraphUtils.extrapolateLinear([0, 1], [y1, y2], t); 891 }; 892 893 GraphUtils.getColorBytes = function getColorBytes(color) { 894 return [color >> 16 & 0xFF, color >> 8 & 0xFF, color & 0xFF]; 895 }; 896 897 GraphUtils.inverseColor = function inverseColor(color) { 898 var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 899 900 var bs = GraphUtils.getColorBytes(color), 901 ibs = [0xFF - bs[0], 0xFF - bs[1], 0xFF - bs[2]], 902 nbs = [Math.round(GraphUtils.interpolate01(bs[0], ibs[0], t)), Math.round(GraphUtils.interpolate01(bs[1], ibs[1], t)), Math.round(GraphUtils.interpolate01(bs[2], ibs[2], t))]; 903 return GraphUtils.bytes2Color(nbs); 904 }; 905 906 GraphUtils.color2Rgba = function color2Rgba(color, a) { 907 return GraphUtils.bytes2Rgba(GraphUtils.getColorBytes(color), a); 908 }; 909 910 GraphUtils.bytes2Rgba = function bytes2Rgba(bs, a) { 911 return 'rgba(' + bs.join(',') + ',' + a + ')'; 912 }; 913 914 GraphUtils.bytes2Color = function bytes2Color(bs) { 915 return bs[2] | bs[1] << 8 | bs[0] << 16; 916 }; 917 918 return GraphUtils; 919}(); 920 921exports.default = GraphUtils; 922 923/***/ }), 924/* 8 */ 925/***/ (function(module, exports, __webpack_require__) { 926 927"use strict"; 928 929 930exports.__esModule = true; 931 932var _Cache = __webpack_require__(14); 933 934var _Cache2 = _interopRequireDefault(_Cache); 935 936var _BlankImage = __webpack_require__(43); 937 938var _BlankImage2 = _interopRequireDefault(_BlankImage); 939 940var _StaticImage = __webpack_require__(59); 941 942var _StaticImage2 = _interopRequireDefault(_StaticImage); 943 944var _PdfImage = __webpack_require__(57); 945 946var _PdfImage2 = _interopRequireDefault(_PdfImage); 947 948var _InteractiveImage = __webpack_require__(51); 949 950var _InteractiveImage2 = _interopRequireDefault(_InteractiveImage); 951 952function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 953 954function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 955 956var ImageFactory = function () { 957 function ImageFactory(context, cache) { 958 _classCallCheck(this, ImageFactory); 959 960 this.context = context; 961 this.cache = cache || new _Cache2.default(); 962 } 963 964 ImageFactory.prototype.build = function build(info) { 965 var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; 966 var widthTexels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 210; 967 var heightTexels = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 297; 968 var color = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0xFFFFFF; 969 var injector = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined; 970 971 var image = void 0; 972 switch (info.type) { 973 case 'html': 974 { 975 image = new _InteractiveImage2.default(this.context, widthTexels, heightTexels, color, info.src, this.cache, injector); 976 break; 977 } 978 case 'image': 979 { 980 image = new _StaticImage2.default(this.context, widthTexels, heightTexels, color, info.src); 981 break; 982 } 983 case 'pdf': 984 { 985 image = new _PdfImage2.default(this.context, widthTexels, heightTexels, color, info.src, n); 986 break; 987 } 988 case 'blank': 989 default: 990 { 991 image = new _BlankImage2.default(this.context, widthTexels, heightTexels, color); 992 break; 993 } 994 } 995 return image; 996 }; 997 998 return ImageFactory;
999}(); 1000 1001exports.default = ImageFactory; 1002 1003/***/ }), 1004/* 9 */ 1005/***/ (function(module, exports, __webpack_require__) { 1006 1007"use strict"; 1008 1009 1010exports.__esModule = true; 1011 1012var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 1013 1014var _book = __webpack_require__(11); 1015 1016var _BaseMathUtils = __webpack_require__(2); 1017 1018var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); 1019 1020function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1021 1022function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 1023 1024var BookPropsBuilder = function () { 1025 function BookPropsBuilder(onReady) { 1026 _classCallCheck(this, BookPropsBuilder); 1027 1028 this.onReady = onReady; 1029 this.defaults = (0, _book.props)(); 1030 } 1031 1032 BookPropsBuilder.prototype.dispose = function dispose() {}; 1033 1034 BookPropsBuilder.prototype.calcSize = function calcSize(width, height) { 1035 var scale = _BaseMathUtils2.default.calcScale(width, height, this.defaults.width, this.defaults.height); 1036 return { 1037 width: scale * width, 1038 height: scale * height 1039 }; 1040 }; 1041 1042 BookPropsBuilder.prototype.calcTexels = function calcTexels(width, height) { 1043 var sheet = this.defaults.sheet, 1044 scale = _BaseMathUtils2.default.calcScale(width, height, sheet.widthTexels, sheet.heightTexels); 1045 return { 1046 widthTexels: scale * width, 1047 heightTexels: scale * height 1048 }; 1049 }; 1050 1051 BookPropsBuilder.prototype.calcProps = function calcProps(width, height) { 1052 this.props = _extends({}, this.defaults, this.calcSize(width, height), { 1053 sheet: _extends({}, this.defaults.sheet, this.calcTexels(width, height)), 1054 cover: _extends({}, this.defaults.cover), 1055 page: _extends({}, this.defaults.page) 1056 }); 1057 }; 1058 1059 BookPropsBuilder.prototype.calcSheets = function calcSheets(pages) { 1060 return this.sheets = Math.ceil(Math.max(0, pages - 4) / 2); 1061 }; 1062 1063 BookPropsBuilder.prototype.getSheets = function getSheets() { 1064 return this.sheets; 1065 }; 1066 1067 BookPropsBuilder.prototype.getProps = function getProps() { 1068 return this.props; 1069 }; 1070 1071 BookPropsBuilder.prototype.getPageCallback = function getPageCallback() { 1072 return this.binds.pageCallback; 1073 }; 1074 1075 BookPropsBuilder.prototype.ready = function ready() { 1076 if (this.onReady) {
1077 this.onReady(this.getProps(), this.getSheets(), this.getPageCallback()); 1078 } 1079 }; 1080 1081 return BookPropsBuilder; 1082}(); 1083 1084exports.default = BookPropsBuilder; 1085 1086/***/ }), 1087/* 10 */ 1088/***/ (function(module, exports, __webpack_require__) { 1089 1090"use strict"; 1091 1092 1093exports.__esModule = true; 1094 1095var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 1096 1097var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 1098 1099var _libs = __webpack_require__(1); 1100 1101var _sheetBlock = __webpack_require__(41); 1102 1103var _sheetBlock2 = _interopRequireDefault(_sheetBlock); 1104 1105var _MathUtils = __webpack_require__(3); 1106 1107var _MathUtils2 = _interopRequireDefault(_MathUtils); 1108 1109var _ThreeUtils = __webpack_require__(20); 1110 1111var _ThreeUtils2 = _interopRequireDefault(_ThreeUtils); 1112 1113function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1114 1115function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 1116 1117// import ThreeMarkup from './ThreeMarkup'; 1118 1119var SheetBlock = function () { 1120 function SheetBlock(visual, p, first, last) { 1121 var angle = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; 1122 1123 var _this = this; 1124 1125 var state = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'closed'; 1126 var height = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; 1127 1128 _classCallCheck(this, SheetBlock); 1129 1130 this.visual = visual; 1131 this.p = _extends({}, p, { 1132 first: first, 1133 last: last 1134 }); 1135 var props = this.getProps(); 1136 1137 var loadedPoints = this.loadPoints(); 1138 Object.keys(loadedPoints).map(function (k) { 1139 _this[k] = loadedPoints[k][props.shape] || loadedPoints[k][0]; 1140 }); 1141 1142 this.pSpline = new _libs.THREE.Spline([]); 1143 for (var i = 0; i < this.interpolationPoints.x[0].length; ++i) { 1144 this.pSpline.points.push(new _libs.THREE.Vector3()); 1145 } 1146 1147 this.iSpline = new _libs.THREE.Spline([]); 1148 for (var _i = 0; _i < _sheetBlock2.default.resX; ++_i) { 1149 this.iSpline.points.push(new _libs.THREE.Vector3()); 1150 } 1151 1152 this.aSplines = []; 1153 1154 //this.three = new THREE.Object3D(); 1155 1156 this.geometry = _sheetBlock2.default.geometry.clone(); 1157 1158 this.p.sideFaces = [{ 1159 first: 0, 1160 last: _sheetBlock2.default.faces[0] 1161 }, { 1162 first: _sheetBlock2.default.faces[0], 1163 last: _sheetBlock2.default.faces[1] 1164 }]; 1165 1166 this.sideTexture = new _libs.THREE.Texture(); 1167 this.sideTexture.wrapT = _libs.THREE.RepeatWrapping; 1168 this.sideTexture.repeat.set(0, last - first); 1169 this.sideTexture.image = props.sideTexture; 1170 this.sideTexture.needsUpdate = true; 1171 1172 this.materials = [new _libs.THREE.MeshPhongMaterial(), new _libs.THREE.MeshPhongMaterial(), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture })]; 1173 1174 this.p.setTexture(this.materials[0], 2 * first); 1175 this.p.setTexture(this.materials[1], 2 * last - 1); 1176 1177 this.mesh = new _libs.THREE.Mesh(this.geometry, new _libs.THREE.MeshFaceMaterial(this.materials)); 1178 this.mesh.castShadow = false; 1179 this.mesh.receiveShadow = false; 1180 // this.mesh.frustumCulled = true; 1181 1182 //this.three.add(this.mesh); 1183 this.three = this.mesh; 1184 this.three.userData.self = this; 1185 1186 this.markers = []; 1187 if (this.p.marker.use) { 1188 var l = this.geometry.vertices.length; 1189 var is = void 0; 1190 // is = [0, sheetBlock.resX-1, (sheetBlock.resZ-1)*sheetBlock.resX, sheetBlock.resZ*sheetBlock.resX-1]; 1191 is = Array.apply(0, Array(l)).map(function (_, i) { 1192 return i; 1193 }); 1194 1195 for (var _iterator = is, _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 1196 var _ref; 1197 1198 if (_isArray) { 1199 if (_i2 >= _iterator.length) break; 1200 _ref = _iterator[_i2++]; 1201 } else { 1202 _i2 = _iterator.next(); 1203 if (_i2.done) break; 1204 _ref = _i2.value; 1205 } 1206 1207 var _i3 = _ref; 1208 1209 var marker = _ThreeUtils2.default.createMarker(this.geometry.vertices[_i3], _i3 < l / 2 ? 0xFF0000 : 0x00FF00, this.p.marker.size); 1210 this.markers.push({ 1211 marker: marker, 1212 vertex: _i3 1213 }); 1214 this.three.add(marker); 1215 } 1216 } 1217 1218 this.corner = { 1219 use: true, 1220 height: 0, 1221 maxDistance: 0, 1222 points: [], 1223 OZ: new _libs.THREE.Vector3(0, 0, 1), 1224 axis: new _libs.THREE.Vector3() 1225 }; 1226 this.set(0, 'closed', height, first, last); // calculate corner points 1227 1228 this.set(angle, state, height, first, last); // init position 1229 1230 // if(!SheetBlock.markup) { 1231 // SheetBlock.markup=true; 1232 // this.markup = new ThreeMarkup(this, 0, [{ 1233 // x: 0, 1234 // y: 0, 1235 // }, { 1236 // x: 0.5, 1237 // y: 1 1238 // }, { 1239 // x: 1, 1240 // y: 0 1241 // }].map((p)=>new THREE.Vector2(p.x, p.y)), {}); 1242 // } 1243 } 1244 1245 SheetBlock.prototype.dispose = function dispose() { 1246 for (var _iterator2 = this.materials, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 1247 var _ref2; 1248 1249 if (_isArray2) { 1250 if (_i4 >= _iterator2.length) break; 1251 _ref2 = _iterator2[_i4++]; 1252 } else { 1253 _i4 = _iterator2.next(); 1254 if (_i4.done) break; 1255 _ref2 = _i4.value; 1256 } 1257 1258 var m = _ref2; 1259
1260 if (m.map) { 1261 m.map = null; 1262 m.needsUpdate = true; 1263 } 1264 m.dispose(); 1265 } 1266 delete this.materials; 1267 this.geometry.dispose(); 1268 }; 1269 1270 SheetBlock.prototype.getSize = function getSize() { 1271 return this.p.last - this.p.first; 1272 }; 1273 1274 SheetBlock.prototype.getProps = function getProps() { 1275 return _extends({}, this.p.page, { 1276 sheets: this.p.sheets 1277 }); 1278 }; 1279 1280 SheetBlock.prototype.getTopCerners = function getTopCerners() { 1281 var off = this.angle > Math.PI / 2 ? this.geometry.vertices.length / 2 : 0; 1282 return [this.geometry.vertices[off], this.geometry.vertices[_sheetBlock2.default.resX - 1 + off], this.geometry.vertices[(_sheetBlock2.default.resZ - 1) * _sheetBlock2.default.resX + off], this.geometry.vertices[_sheetBlock2.default.resZ * _sheetBlock2.default.resX - 1 + off]]; 1283 }; 1284 1285 SheetBlock.prototype.getTopSize = function getTopSize() { 1286 // const l=this.geometry.vertices.length, off = this.angle>Math.PI/2? l/2: 0, 1287 // v0 = this.geometry.vertices[off], v1 = this.geometry.vertices[sheetBlock.resZ*sheetBlock.resX-1+off]; 1288 // // is = [0, sheetBlock.resX-1, (sheetBlock.resZ-1)*sheetBlock.resX, sheetBlock.resZ*sheetBlock.resX-1]; 1289 // return { 1290 // width: Math.abs(v1.x-v0.x), 1291 // height: Math.abs(v1.z-v0.z) 1292 // }; 1293 var vs = this.getTopCerners(); 1294 return { 1295 width: vs[0].distanceTo(vs[1]), 1296 height: vs[0].distanceTo(vs[2]) 1297 }; 1298 }; 1299 1300 SheetBlock.prototype.getTopWorldRotation = function getTopWorldRotation(q) { 1301 q.x = -Math.PI / 2; 1302 return q; 1303 }; 1304 1305 SheetBlock.prototype.getTopWorldPosition = function getTopWorldPosition(v) { 1306 var l = this.geometry.vertices.length, 1307 off = this.angle > Math.PI / 2 ? l / 2 : 0, 1308 vs = [this.geometry.vertices[off], this.geometry.vertices[_sheetBlock2.default.resX - 1 + off], this.geometry.vertices[(_sheetBlock2.default.resZ - 1) * _sheetBlock2.default.resX + off], this.geometry.vertices[_sheetBlock2.default.resZ * _sheetBlock2.default.resX - 1 + off]]; 1309 v.set(0, 0, 0); 1310 for (var _iterator3 = vs, _isArray3 = Array.isArray(_iterator3), _i5 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 1311 var _ref3; 1312 1313 if (_isArray3) { 1314 if (_i5 >= _iterator3.length) break; 1315 _ref3 = _iterator3[_i5++]; 1316 } else { 1317 _i5 = _iterator3.next(); 1318 if (_i5.done) break; 1319 _ref3 = _i5.value; 1320 } 1321 1322 var vi = _ref3; 1323 1324 v.x += 0.25 * vi.x; 1325 v.y += 0.25 * vi.y; 1326 v.z += 0.25 * vi.z; 1327 } 1328 this.three.localToWorld(v); 1329 return v; 1330 }; 1331 1332 SheetBlock.prototype.getInterpolationPoints = function getInterpolationPoints(inds, mod) { 1333 var ps = { x: [], y: [] }, 1334 K = this.getProps().wave; 1335 for (var _iterator4 = inds, _isArray4 = Array.isArray(_iterator4), _i6 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 1336 var _ref4; 1337 1338 if (_isArray4) { 1339 if (_i6 >= _iterator4.length) break; 1340 _ref4 = _iterator4[_i6++]; 1341 } else { 1342 _i6 = _iterator4.next(); 1343 if (_i6.done) break; 1344 _ref4 = _i6.value; 1345 } 1346 1347 var i = _ref4; 1348 1349 ps.x.push([].concat(this.interpolationPoints.x[i])); 1350 ps.y.push(~mod.indexOf(i) ? this.interpolationPoints.y[i].map(function (n) { 1351 return K * n; 1352 }) : [].concat(this.interpolationPoints.y[i])); 1353 } 1354 return ps; 1355 }; 1356 1357 SheetBlock.prototype.set = function set(angle) { 1358 var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.state; 1359 var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.corner.height; 1360 var first = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.p.first; 1361 var last = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.p.last; 1362 1363 var PI = Math.PI; 1364 this.state = state; 1365 var closedAngle = void 0, 1366 binderTurn = void 0; 1367 if ((typeof angle === 'undefined' ? 'undefined' : _typeof(angle)) === 'object') { 1368 this.angle = angle.openedAngle; 1369 closedAngle = angle.closedAngle; 1370 binderTurn = angle.binderTurn > PI / 2 ? PI - angle.binderTurn : angle.binderTurn; 1371 } else { 1372 this.angle = angle; 1373 } 1374 this.corner.height = height; 1375 if (this.p.first !== first || this.p.last !== last) { 1376 this.sideTexture.repeat.set(0, last - first); 1377 this.sideTexture.needsUpdate = true; 1378 if (this.p.first !== first) { 1379 this.p.setTexture(this.materials[0], 2 * first); 1380 } 1381 if (this.p.last !== last) { 1382 this.p.setTexture(this.materials[1], 2 * last - 1); 1383 } 1384 } 1385 this.p.first = first; 1386 this.p.last = last; 1387 var points = void 0; 1388 var props = this.getProps(); 1389 if (this.state === 'closed') { 1390 points = this.getInterpolationPoints(this.closedInterpolationIndeces, this.closedInterpolationIndeces); 1391 } else if (this.state === 'opened') { 1392 if (closedAngle !== undefined && Math.abs(closedAngle - PI / 2) > 1e-2) { 1393 points = this.getInterpolationPoints(this.flatInterpolationIndeces, []); 1394 var ps = this.getPointsAtAngle(this.getInterpolationPoints(this.closedInterpolationIndeces, this.closedInterpolationIndeces), closedAngle > PI / 2 ? PI - closedAngle : closedAngle); 1395 points.x = [ps.x].concat(points.x); 1396 points.y = [ps.y].concat(points.y); 1397 // console.log(ps); 1398 } else { 1399 points = this.getInterpolationPoints(this.openedInterpolationIndeces, this.closedInterpolationIndeces); 1400 } 1401 } 1402 var hl = void 0, 1403 hr = void 0, 1404 offset = 0.5 * props.sheets * props.depth; 1405 if (this.state === 'closed') { 1406 offset -= 7e-6 * this.p.scale; 1407 } 1408 if (this.angle <= PI / 2) { 1409 hl = (props.sheets - first) * props.depth; 1410 hr = (props.sheets - last) * props.depth; 1411 } else { 1412 hl = first * props.depth; 1413 hr = last * props.depth; 1414 } 1415 1416 var inAngle = this.angle > PI / 2 ? PI - this.angle : this.angle, 1417 hAngle = this.state === 'closed' ? inAngle : binderTurn === undefined ? PI / 2 : binderTurn; 1418 1419 var _getPointsAtAngleAndH = this.getPointsAtAngleAndHs(points, inAngle, hAngle, [hl / props.width, hr / props.width]), 1420 left = _getPointsAtAngleAndH[0], 1421 right = _getPointsAtAngleAndH[1]; 1422 1423 if (this.angle > PI / 2) { 1424 this.inverse(left); 1425 this.inverse(right); 1426 offset = -offset; 1427 } 1428 this.setPoints(left, right, offset); 1429 }; 1430 1431 SheetBlock.prototype.setPoints = function setPoints(left, right, offset) { 1432 var _this2 = this; 1433 1434 var p = this.getProps(); 1435 var i = 0; 1436 1437 var ys = [right, left]; 1438 for (var y = 0; y < _sheetBlock2.default.resY; ++y) { 1439 for (var z = 0; z < _sheetBlock2.default.resZ; ++z) { 1440 for (var x = 0; x < _sheetBlock2.default.resX; ++x) { 1441 this.geometry.vertices[i++].set(ys[y].x[x] * p.width + offset, ys[y].y[x] * p.width, z * p.height / (_sheetBlock2.default.resZ - 1) - 0.5 * p.height); 1442 } 1443 } 1444 } 1445 if (i !== this.geometry.vertices.length) { 1446 console.warn('setPoints: bad mapping!'); 1447 } 1448 1449 if (this.corner.use && !this.corner.points.length) { 1450 var plane = new _libs.THREE.Plane(), 1451 normal = plane.normal, 1452 planeOffset = (1 - this.getProps().flexibleCorner) * Math.min(p.width, p.height), 1453 proj = new _libs.THREE.Vector3(); 1454 plane.setFromNormalAndCoplanarPoint(new _libs.THREE.Vector3(-1, 0, -1).normalize(), new _libs.THREE.Vector3(planeOffset + offset, 0, 0.5 * p.height)); 1455 for (var _i7 = 0, l = this.geometry.vertices.length; _i7 < l; ++_i7) { 1456 plane.projectPoint(this.geometry.vertices[_i7], proj); 1457 proj.sub(this.geometry.vertices[_i7]); 1458 if (proj.x * normal.x + proj.y * normal.y + proj.z * normal.z > 0) { 1459 var d = proj.length() / planeOffset; 1460 this.corner.maxDistance = Math.max(this.corner.maxDistance, d); 1461 this.corner.points.push({ vertex: _i7, distance: d }); 1462 } 1463 } 1464 } 1465 1466 if (this.corner.use && Math.abs(this.corner.height) > 1e-3) { 1467 var d2Angle = function d2Angle(d) { 1468 return p.cornerDeviation * _this2.corner.height / (1 + Math.exp(-p.bending * (d - 0.5 * _this2.corner.maxDistance))); 1469 }; 1470 this.corner.axis.set(-1, 0, 1).normalize(); 1471 this.corner.axis.applyAxisAngle(this.corner.OZ, this.angle); 1472 for (var _iterator5 = this.corner.points, _isArray5 = Array.isArray(_iterator5), _i8 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { 1473 var _ref5; 1474 1475 if (_isArray5) { 1476 if (_i8 >= _iterator5.length) break; 1477 _ref5 = _iterator5[_i8++]; 1478 } else { 1479 _i8 = _iterator5.next(); 1480 if (_i8.done) break; 1481 _ref5 = _i8.value; 1482 } 1483 1484 var point = _ref5; 1485 1486 this.geometry.vertices[point.vertex].applyAxisAngle(this.corner.axis, d2Angle(point.distance)); 1487 } 1488 } 1489 1490 for (var _iterator6 = this.markers, _isArray6 = Array.isArray(_iterator6), _i9 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { 1491 var _ref6; 1492 1493 if (_isArray6) { 1494 if (_i9 >= _iterator6.length) break; 1495 _ref6 = _iterator6[_i9++]; 1496 } else { 1497 _i9 = _iterator6.next(); 1498 if (_i9.done) break; 1499 _ref6 = _i9.value; 1500 } 1501 1502 var m = _ref6; 1503 1504 m.marker.position.copy(this.geometry.vertices[m.vertex]); 1505 } 1506 1507 this.geometry.computeVertexNormals(); 1508 //this.geometry.computeFaceNormals(); 1509 this.geometry.computeBoundingSphere(); 1510 //this.geometry.computeBoundingBox(); 1511 this.geometry.verticesNeedUpdate = true; 1512 1513 if (this.markup) { 1514 this.markup.computeVertices(); 1515 } 1516 }; 1517 1518 SheetBlock.prototype.inverse = function inverse(ps) { 1519 for (var i = 0; i < ps.x.length; ++i) { 1520 ps.x[i] = -ps.x[i]; 1521 } 1522 return ps; 1523 }; 1524 1525 SheetBlock.prototype.getPointsAtHs = function getPointsAtHs(ps, angle, hs) { 1526 var _this3 = this; 1527 1528 var N = 1000; 1529 _MathUtils2.default.setSplinePoints(this.pSpline, ps); 1530 var bl = _MathUtils2.default.splitSpline(this.pSpline, N), 1531 r = []; 1532 { 1533 var p1 = _extends({}, this.pSpline.getPoint((N - 1) / N)), 1534 p2 = _extends({}, this.pSpline.getPoint(1)),
1535 dp = { x: p2.x - p1.x, y: p2.y - p1.y }, 1536 ln = Math.sqrt(dp.x * dp.x + dp.y * dp.y), 1537 sp = this.pSpline.points[this.pSpline.points.length - 1]; 1538 sp.set(sp.x + 0.1 * dp.x / ln, sp.y + 0.1 * dp.y / ln, 0); 1539 bl = _MathUtils2.default.splitSpline(this.pSpline, N); 1540 } 1541 bl.ls.push(1e7); 1542 _MathUtils2.default.mapl2L(bl.ls, bl.len, _sheetBlock2.default.resX, function (i) { 1543 for (var j = 0; j < hs.length; ++j) { 1544 if (!i) { 1545 r[j] = { x: [-hs[j] * Math.sin(angle)], y: [hs[j] * Math.cos(angle)] }; 1546 } else { 1547 var p0 = _extends({}, _this3.pSpline.getPoint((i - 1) / N)), 1548 _p = _this3.pSpline.getPoint(i / N), 1549 x = -(_p.y - p0.y), 1550 y = _p.x - p0.x, 1551 l = Math.sqrt(x * x + y * y); 1552 r[j].x.push(_p.x + x / l * hs[j]); 1553 r[j].y.push(_p.y + y / l * hs[j]); 1554 } 1555 } 1556 }); 1557 1558 var nps = []; 1559 1560 var _loop = function _loop(j) { 1561 nps[j] = { x: [], y: [] }; 1562 _MathUtils2.default.setSplinePoints(_this3.iSpline, r[j]); 1563 var l = _MathUtils2.default.splitSpline(_this3.iSpline, N); 1564 l.ls.push(1e7); 1565 _MathUtils2.default.mapl2L(l.ls, 1, _sheetBlock2.default.resX, function (i) { 1566 var p = _this3.iSpline.getPoint(i / N); 1567 nps[j].x.push(p.x); 1568 nps[j].y.push(p.y); 1569 }); 1570 }; 1571 1572 for (var j = 0; j < hs.length; ++j) { 1573 _loop(j); 1574 } 1575 return nps; 1576 }; 1577 1578 SheetBlock.prototype.getPointsAtAngleAndHs = function getPointsAtAngleAndHs(points, angle, hAngle, hs) { 1579 var ps = this.getPointsAtAngle(points, angle); 1580 return this.getPointsAtHs(ps, hAngle, hs); 1581 }; 1582 1583 SheetBlock.prototype.getPointsAtAngle = function getPointsAtAngle(points, angle) { 1584 var ps = { x: [], y: [] }, 1585 angles = []; 1586 angle /= Math.PI / 2; 1587 for (var j = 0; j < points.x.length; ++j) { 1588 angles.push(j / (points.x.length - 1)); 1589 } 1590 for (var i = 0; i < points.x[0].length; ++i) { 1591 var xps = [], 1592 yps = []; 1593 for (var _j = 0; _j < points.x.length; ++_j) { 1594 xps.push(points.x[_j][i]); 1595 yps.push(points.y[_j][i]); 1596 } 1597 ps.x.push(this.interpolate(angles, xps, angle)); 1598 ps.y.push(this.interpolate(angles, yps, angle)); 1599 } 1600 return ps; 1601 }; 1602 1603 SheetBlock.prototype.interpolate = function interpolate(x, y, xi) { 1604 if (!this.aSplines[x.length]) { 1605 this.aSplines[x.length] = new _libs.THREE.Spline([]); 1606 var ps = this.aSplines[x.length].points; 1607 for (var i = 0; i < x.length; ++i) { 1608 ps.push(new _libs.THREE.Vector3()); 1609 } 1610 } 1611 var spline = this.aSplines[x.length]; 1612 for (var _i10 = 0; _i10 < x.length; ++_i10) { 1613 spline.points[_i10].set(x[_i10], y[_i10], 0); 1614 } 1615 return spline.getPoint(Math.min(1, Math.max(xi, 0))).y; 1616 }; 1617 1618 SheetBlock.prototype.loadPoints = function loadPoints() { 1619 var x = [], 1620 y = []; 1621 var _arr = [0, 0.2877, 0.6347, 0.8174, 1.0000]; 1622 for (var _i11 = 0; _i11 < _arr.length; _i11++) { 1623 var r = _arr[_i11]; 1624 x.push(r * Math.cos(0.9 * Math.PI / 4)); 1625 y.push(r * Math.sin(0.9 * Math.PI / 4)); 1626 } 1627 1628 var openedInterpolationIndeces = [[2, 3, 4], [2, 3, 4, 5, 6]], 1629 closedInterpolationIndeces = [[0, 1, 2], [0, 1, 2]], 1630 flatInterpolationIndeces = [[5, 4], [7, 6]], 1631 interpolationPoints = [{ 1632 x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0.000, 0.286, 0.632, 0.815, 0.997], [0.000, 0.279, 0.623, 0.806, 0.988], [0.000, 0.126, 0.411, 0.593, 0.774], [0, 0, 0, 0, 0], x], 1633 y: [[0, 0, 0, 0, 0], [0.000, 0.030, 0.010, 0.002, 0.000], [0.000, 0.060, 0.017, 0.004, 0.000], [0.000, 0.259, 0.440, 0.446, 0.429], [0, 0.2877, 0.6347, 0.8174, 1.0000], y] 1634 }, { 1635 x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0.000, 0.286, 0.632, 0.815, 0.997], [0.000, 0.279, 0.623, 0.806, 0.988], [0.000, 0.233, 0.563, 0.746, 0.927], [0.000, 0.144, 0.433, 0.613, 0.796], [0.000, 0.070, 0.288, 0.455, 0.626], [0, 0, 0, 0, 0], x], 1636 y: [[0, 0, 0, 0, 0], [0.000, 0.030, 0.010, 0.002, 0.000], [0.000, 0.060, 0.01
16367, 0.004, 0.000], [0.000, 0.168, 0.269, 0.270, 0.255], [0.000, 0.245, 0.435, 0.458, 0.460], [0.000, 0.278, 0.544, 0.614, 0.673], [0, 0.2877, 0.6347, 0.8174, 1.0000], y] 1637 }]; 1638 1639 return { 1640 interpolationPoints: interpolationPoints, 1641 openedInterpolationIndeces: openedInterpolationIndeces, 1642 closedInterpolationIndeces: closedInterpolationIndeces, 1643 flatInterpolationIndeces: flatInterpolationIndeces 1644 }; 1645 }; 1646 1647 return SheetBlock; 1648}(); 1649 1650exports.default = SheetBlock; 1651 1652/***/ }), 1653/* 11 */ 1654/***/ (function(module, exports, __webpack_require__) { 1655 1656"use strict"; 1657 1658 1659exports.__esModule = true; 1660exports.props = props; 1661function props() { 1662 // const props = { 1663 // height, 1664 // width, 1665 // gravity, 1666 // injector, 1667 // cachedPages, 1668 // renderInactivePages, 1669 // renderWhileFlipping, 1670 // pagesForPredicting, 1671 // preloadPages, 1672 // sheet: { 1673 // startVelocity, 1674 // cornerDeviation, 1675 // flexibility, 1676 // flexibleCorner, 1677 // bending, 1678 // wave, 1679 // shape, 1680 // widthTexels, 1681 // heightTexels, 1682 // color, 1683 // sideTexture 1684 // }, 1685 // cover: { 1686 // ...sheet, 1687 // padding, 1688 // binderTexture, 1689 // depth, 1690 // mass 1691 // }, 1692 // page: { 1693 // ...sheet, 1694 // depth, 1695 // mass 1696 // } 1697 // }; 1698 1699 return { 1700 height: 0.297, 1701 width: 0.21, 1702 gravity: 1, 1703 cachedPages: 50, 1704 renderInactivePages: true, 1705 renderInactivePagesOnMobile: false, 1706 renderWhileFlipping: false, 1707 pagesForPredicting: 5, 1708 preloadPages: 5, 1709 rtl: false, 1710 sheet: { 1711 startVelocity: 0.9, 1712 cornerDeviation: 0.25, 1713 flexibility: 10, 1714 flexibleCorner: 0.5, 1715 bending: 11, 1716 wave: 0.5, 1717 shape: 0, 1718 widthTexels: 5 * 210, 1719 heightTexels: 5 * 297, 1720 color: 0xFFFFFF 1721 }, 1722 cover: { 1723 binderTexture: '', 1724 depth: 0.0003, 1725 padding: 0, 1726 mass: 0.003 1727 }, 1728 page: { 1729 depth: 0.0001, 1730 mass: 0.001 1731 }, 1732 cssLayerProps: { 1733 width: 1024 1734 } 1735 }; 1736}; 1737 1738/***/ }), 1739/* 12 */ 1740/***/ (function(module, exports, __webpack_require__) { 1741 1742"use strict"; 1743 1744 1745exports.__esModule = true; 1746exports.CSS3DSprite = exports.CSS3DObject = undefined; 1747 1748var _libs = __webpack_require__(0); 1749 1750function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 1751 1752function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 1753 1754function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 1755 1756_libs.THREE.CSS3DObject = function (_THREE$Object3D) { 1757 _inherits(CSS3DObject, _THREE$Object3D); 1758 1759 function CSS3DObject() { 1760 var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; 1761 1762 _classCallCheck(this, CSS3DObject); 1763 1764 var _this = _possibleConstructorReturn(this, _THREE$Object3D.call(this)); 1765 1766 if (element) { 1767 _this.set(element); 1768 } 1769 return _this; 1770 } 1771 1772 CSS3DObject.prototype.set = function set(element) { 1773 this.element = element; 1774 this.element.style.position = 'absolute'; 1775 1776 this.addEventListener('removed', function () { 1777 if (this.element.parentNode !== null) { 1778 this.element.parentNode.removeChild(this.element); 1779 } 1780 }); 1781 }; 1782 1783 return CSS3DObject; 1784}(_libs.THREE.Object3D); 1785 1786_libs.THREE.CSS3DSprite = function (_THREE$CSS3DObject) { 1787 _inherits(CSS3DSprite, _THREE$CSS3DObject); 1788 1789 function CSS3DSprite(element) { 1790 _classCallCheck(this, CSS3DSprite); 1791 1792 return _possibleConstructorReturn(this, _THREE$CSS3DObject.call(this, element)); 1793 } 1794 1795 return CSS3DSprite; 1796}(_libs.THREE.CSS3DObject); 1797 1798_libs.THREE.CSS3DRenderer = function CSS3DRenderer() { 1799 _classCallCheck(this, CSS3DRenderer); 1800 1801 var _width, _height; 1802 var _widthHalf, _heightHalf; 1803 1804 var matrix = new _libs.THREE.Matrix4(); 1805 1806 var cache = { 1807 camera: { fov: 0, style: '' }, 1808 objects: {} 1809 }; 1810 1811 var domElement = document.createElement('div'); 1812 domElement.style.overflow = 'hidden'; 1813 1814 this.domElement = domElement; 1815 1816 var cameraElement = document.createElement('div'); 1817 1818 cameraElement.style.WebkitTransformStyle = 'preserve-3d'; 1819 cameraElement.style.MozTransformStyle = 'preserve-3d'; 1820 cameraElement.style.transformStyle = 'preserve-3d'; 1821 1822 domElement.appendChild(cameraElement); 1823 1824 var isIE = /Trident/i.test(navigator.userAgent); 1825 1826 this.setClearColor = function () {}; 1827
1828 this.getSize = function () { 1829 1830 return { 1831 width: _width, 1832 height: _height 1833 }; 1834 }; 1835 1836 this.setSize = function (width, height) { 1837 1838 _width = width; 1839 _height = height; 1840 _widthHalf = _width / 2; 1841 _heightHalf = _height / 2; 1842 1843 domElement.style.width = width + 'px'; 1844 domElement.style.height = height + 'px'; 1845 1846 cameraElement.style.width = width + 'px'; 1847 cameraElement.style.height = height + 'px'; 1848 }; 1849 1850 function epsilon(value) { 1851 1852 return Math.abs(value) < 1e-10 ? 0 : value; 1853 } 1854 1855 function getCameraCSSMatrix(matrix) { 1856 1857 var elements = matrix.elements; 1858 1859 return 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(-elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(elements[6]) + ',' + epsilon(elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(-elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(-elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')'; 1860 } 1861 1862 function getObjectCSSMatrix(matrix, cameraCSSMatrix) { 1863 1864 var elements = matrix.elements; 1865 var matrix3d = 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(-elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(-elements[6]) + ',' + epsilon(-elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')'; 1866 1867 if (isIE) { 1868 1869 return 'translate(-50%,-50%)' + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)' + cameraCSSMatrix + matrix3d; 1870 } 1871 1872 return 'translate(-50%,-50%)' + matrix3d; 1873 } 1874 1875 function renderObject(object, camera, cameraCSSMatrix) { 1876 1877 if (object instanceof _libs.THREE.CSS3DObject) { 1878 1879 var style; 1880 1881 if (object instanceof _libs.THREE.CSS3DSprite) { 1882 matrix.copy(camera.matrixWorldInverse); 1883 matrix.transpose(); 1884 matrix.copyPosition(object.matrixWorld); 1885 matrix.scale(object.scale); 1886 1887 matrix.elements[3] = 0; 1888 matrix.elements[7] = 0; 1889 matrix.elements[11] = 0; 1890 matrix.elements[15] = 1; 1891 1892 style = getObjectCSSMatrix(matrix, cameraCSSMatrix); 1893 } else { 1894 1895 style = getObjectCSSMatrix(object.matrixWorld, cameraCSSMatrix); 1896 } 1897 1898 var element = object.element; 1899 var cachedStyle = cache.objects[object.id] && cache.objects[object.id].style; 1900 1901 if (cachedStyle === undefined || cachedStyle !== style) { 1902 element.style.WebkitTransform = style; 1903 element.style.MozTransform = style; 1904 element.style.transform = style; 1905 1906 cache.objects[object.id] = { style: style }; 1907 if (isIE) { 1908 cache.objects[object.id].distanceToCameraSquared = getDistanceToSquared(camera, object); 1909 } 1910 } 1911 1912 if (element.parentNode !== cameraElement) { 1913 cameraElement.appendChild(element); 1914 } 1915 } 1916 1917 for (var i = 0, l = object.children.length; i < l; i++) { 1918 1919 renderObject(object.children[i], camera, cameraCSSMatrix); 1920 } 1921 } 1922 1923 var getDistanceToSquared = function () { 1924 1925 var a = new _libs.THREE.Vector3(); 1926 var b = new _libs.THREE.Vector3(); 1927 1928 return function (object1, object2) { 1929 1930 a.setFromMatrixPosition(object1.matrixWorld); 1931 b.setFromMatrixPosition(object2.matrixWorld); 1932 1933 return a.distanceToSquared(b); 1934 }; 1935 }(); 1936 1937 function zOrder(scene) { 1938 1939 var order = Object.keys(cache.objects).sort(function (a, b) { 1940 1941 return cache.objects[a].distanceToCameraSquared - cache.objects[b].distanceToCameraSquared; 1942 }); 1943 var zMax = order.length; 1944 1945 scene.traverse(function (object) { 1946 1947 var index = order.indexOf(object.id + ''); 1948 1949 if (index !== -1) { 1950 1951 object.element.style.zIndex = zMax - index; 1952 } 1953 });
1954 } 1955 1956 this.render = function (scene, camera) { 1957 1958 var fov = camera.projectionMatrix.elements[5] * _heightHalf; 1959 1960 if (cache.camera.fov !== fov) { 1961 1962 domElement.style.WebkitPerspective = fov + 'px'; 1963 domElement.style.MozPerspective = fov + 'px'; 1964 domElement.style.perspective = fov + 'px'; 1965 1966 cache.camera.fov = fov; 1967 } 1968 1969 scene.updateMatrixWorld(); 1970 1971 if (camera.parent === null) camera.updateMatrixWorld(); 1972 1973 var cameraCSSMatrix = 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse); 1974 1975 var style = cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'; 1976 1977 if (cache.camera.style !== style && !isIE) { 1978 1979 cameraElement.style.WebkitTransform = style; 1980 cameraElement.style.MozTransform = style; 1981 cameraElement.style.transform = style; 1982 1983 cache.camera.style = style; 1984 } 1985 1986 renderObject(scene, camera, cameraCSSMatrix); 1987 1988 if (isIE) { 1989 1990 // IE10 and 11 does not support 'preserve-3d'. 1991 // Thus, z-order in 3D will not work. 1992 // We have to calc z-order manually and set CSS z-index for IE. 1993 // FYI: z-index can't handle object intersection 1994 zOrder(scene); 1995 } 1996 }; 1997}; 1998 1999exports.default = _libs.THREE.CSS3DRenderer; 2000 2001 2002var _CSS3DObject = _libs.THREE.CSS3DObject, 2003 _CSS3DSprite = _libs.THREE.CSS3DSprite; 2004exports.CSS3DObject = _CSS3DObject; 2005exports.CSS3DSprite = _CSS3DSprite; 2006 2007/***/ }), 2008/* 13 */ 2009/***/ (function(module, exports, __webpack_require__) { 2010 2011"use strict"; 2012 2013 2014exports.__esModule = true; 2015 2016var _libs = __webpack_require__(0); 2017 2018var _CSS3DRenderer = __webpack_require__(12); 2019 2020function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2021 2022function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 2023 2024function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 2025 2026var CSSLayer = function (_CSS3DObject) { 2027 _inherits(CSSLayer, _CSS3DObject); 2028 2029 CSSLayer.init = function init(doc) { 2030 var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 150; 2031 2032 CSSLayer.delay = delay; 2033 CSSLayer.style = (0, _libs.$)('<style type=text/css>\n .css-layer {\n \t\topacity: 1;\n \t\ttransition: opacity ' + delay + 'ms ease-out;\n visibility: visible;\n overflow: hidden;\n \t}\n \t.css-layer.hidden {\n \t\ttransition: opacity ' + delay + 'ms ease-in, visibility ' + delay + 'ms step-end;\n \t\topacity: 0;\n visibility: hidden;\n }\n </style>').appendTo(doc.head); 2034 }; 2035 2036 CSSLayer.dispose = function dispose() { 2037 CSSLayer.style.remove(); 2038 }; 2039 2040 function CSSLayer(width, height, props) { 2041 _classCallCheck(this, CSSLayer); 2042 2043 var _this = _possibleConstructorReturn(this, _CSS3DObject.call(this)); 2044 2045 _this.props = props; 2046 _this.jContainer = (0, _libs.$)('<div class="hidden css-layer"></div>'); 2047 var widthPxs = props.width, 2048 heightPxs = height / width * widthPxs; 2049 _this.jContainer.width(widthPxs).height(heightPxs); 2050 _this.scale.x /= widthPxs / width; 2051 _this.scale.y /= widthPxs / width; 2052 2053 _this.setData(); 2054 _this.set(_this.jContainer[0]); 2055 return _this; 2056 } 2057 2058 CSSLayer.prototype.callInternal = function callInternal(name) { 2059 if (this.object && this.object[name]) { 2060 try { 2061 this.object[name](); 2062 } catch (e) { 2063 console.error(e); 2064 } 2065 } 2066 }; 2067 2068 CSSLayer.prototype.dispose = function dispose() { 2069 this.clearInternals(); 2070 }; 2071 2072 CSSLayer.prototype.clearInternals = function clearInternals() { 2073 this.callInternal('dispose'); 2074 !this.css || this.css.remove(); 2075 !this.html || this.html.remove(); 2076 }; 2077 2078 CSSLayer.prototype.setData = function setData() { 2079 var css = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; 2080 var html = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 2081 var js = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 2082 2083 this.clearInternals(); 2084 2085 this.css = (0, _libs.$)('<style type="text/css">' + css + '</style>').appendTo(this.jContainer); 2086 this.html = (0, _libs.$)(html).appendTo(this.jContainer); 2087 var init = eval(js); 2088 if (init) { 2089 this.object = init(this.jContainer, this.props) || {}; 2090 } 2091 }; 2092 2093 CSSLayer.prototype.pendedCall = function pendedCall(clb) { 2094 var _this2 = this; 2095 2096 var timestamp = this.timestamp = Date.now(); 2097 setTimeout(function () { 2098 if (timestamp === _this2.timestamp) { 2099 clb(); 2100 } 2101 }, CSSLayer.delay); 2102 }; 2103 2104 CSSLayer.prototype.isHidden = function isHidden() { 2105 return this.jContainer.hasClass('hidden'); 2106 }; 2107 2108 CSSLayer.prototype.hide = function hide() { 2109 var _this3 = this; 2110 2111 var res = void 0; 2112 if (!this.isHidden()) { 2113 this.jContainer.addClass('hidden'); 2114 this.callInternal('hide'); 2115 res = new Promise(function (resolve) { 2116 _this3.pendedCall(function () { 2117 _this3.callInternal('hidden'); 2118 resolve(); 2119 }); 2120 }); 2121 } else { 2122 res = Promise.resolve(); 2123 } 2124 return res; 2125 }; 2126 2127 CSSLayer.prototype.show = function show() { 2128 var _this4 = this; 2129 2130 var res = void 0; 2131 if (this.isHidden()) { 2132 this.jContainer.removeClass('hidden'); 2133 this.callInternal('show'); 2134 res = new Promise(function (resolve) { 2135 _this4.pendedCall(function () { 2136 _this4.callInternal('shown'); 2137 resolve(); 2138 }); 2139 }); 2140 } else { 2141 res = Promise.resolve(); 2142 } 2143 return res; 2144 }; 2145 2146 return CSSLayer; 2147}(_CSS3DRenderer.CSS3DObject); 2148 2149exports.default = CSSLayer; 2150 2151/***/ }), 2152/* 14 */ 2153/***/ (function(module, exports, __webpack_require__) { 2154 2155"use strict"; 2156 2157 2158exports.__esModule = true; 2159 2160function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2161 2162var Cache = function () { 2163 function Cache() { 2164 var maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity; 2165 var sizeof = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Cache.countSizeof; 2166 2167 _classCallCheck(this, Cache); 2168 2169 this.os = new Map(); 2170 this.sizeof = sizeof; 2171 this.maxSize = maxSize; 2172 this.size = 0; 2173 } 2174 2175 Cache.prototype.forEach = function forEach(clb) { 2176 this.os.forEach(function (v, k) { 2177 return clb([k, v]); 2178 });
2179 }; 2180 2181 Cache.countSizeof = function countSizeof(value) { 2182 return 1; 2183 }; 2184 2185 Cache.prototype.remove = function remove(k) { 2186 var res = false; 2187 var v = this.os.get(k); 2188 if (!v.locked || !v.locked(k)) { 2189 this.size -= this.sizeof(v); 2190 if (v.dispose) { 2191 v.dispose(); 2192 } 2193 this.os.delete(k); 2194 res = true; 2195 } 2196 return res; 2197 }; 2198 2199 Cache.prototype.freeSpace = function freeSpace() { 2200 var arr = []; 2201 for (var _iterator = this.os, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 2202 var _ref; 2203 2204 if (_isArray) { 2205 if (_i >= _iterator.length) break; 2206 _ref = _iterator[_i++]; 2207 } else { 2208 _i = _iterator.next(); 2209 if (_i.done) break; 2210 _ref = _i.value; 2211 } 2212 2213 var p = _ref; 2214 2215 arr.push({ timestamp: p[1].timestamp, key: p[0] }); 2216 } 2217 arr.sort(function (a, b) { 2218 return a.timestamp - b.timestamp; 2219 }); 2220 for (var i = 0; i < arr.length && this.size > 3 * this.maxSize / 4; ++i) { 2221 this.remove(arr[i].key); 2222 } 2223 }; 2224 2225 Cache.prototype.dispose = function dispose() { 2226 var arr = []; 2227 for (var _iterator2 = this.os, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 2228 var _ref2; 2229 2230 if (_isArray2) { 2231 if (_i2 >= _iterator2.length) break; 2232 _ref2 = _iterator2[_i2++]; 2233 } else { 2234 _i2 = _iterator2.next(); 2235 if (_i2.done) break; 2236 _ref2 = _i2.value; 2237 } 2238 2239 var p = _ref2; 2240 2241 arr.push({ v: p[1], k: p[0] }); 2242 } 2243 for (var _iterator3 = arr, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 2244 var _ref3; 2245 2246 if (_isArray3) { 2247 if (_i3 >= _iterator3.length) break; 2248 _ref3 = _iterator3[_i3++]; 2249 } else { 2250 _i3 = _iterator3.next(); 2251 if (_i3.done) break; 2252 _ref3 = _i3.value; 2253 } 2254 2255 var o = _ref3; 2256 2257 if (o.v.dispose) { 2258 o.v.dispose(); 2259 } 2260 this.os.delete(o.k); 2261 } 2262 }; 2263 2264 Cache.recursionSizeof = function recursionSizeof(value) { 2265 var size = 0; 2266 if (value) { 2267 ++size; 2268 var len = value.length; 2269 if (len === undefined) { 2270 for (var p in value) { 2271 if (value.hasOwnProperty(p)) { 2272 size += Cache.recursionSizeof(value[p]); 2273 } 2274 } 2275 } else { 2276 size += len; 2277 } 2278 } 2279 return size; 2280 }; 2281 2282 Cache.prototype.getTimestamp = function getTimestamp() { 2283 return Date.now(); 2284 }; 2285 2286 Cache.prototype.get = function get(key) { 2287 var value = this.os.get(key); 2288 if (value) { 2289 value.timestamp = this.getTimestamp(); 2290 } 2291 return value; 2292 }; 2293 2294 Cache.prototype.put = function put(key, value) { 2295 value.timestamp = this.getTimestamp(); 2296 this.os.set(key, value); 2297 this.size += this.sizeof(value); 2298 if (this.size > this.maxSize) { 2299 this.freeSpace(); 2300 } 2301 return value; 2302 }; 2303 2304 return Cache; 2305}(); 2306 2307exports.default = Cache; 2308 2309/***/ }), 2310/* 15 */ 2311/***/ (function(module, exports, __webpack_require__) { 2312 2313"use strict"; 2314 2315 2316exports.__esModule = true; 2317 2318var _libs = __webpack_require__(0); 2319 2320function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2321 2322function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 2323 2324function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 2325 2326var Controller = function (_THREE$EventDispatche) { 2327 _inherits(Controller, _THREE$EventDispatche); 2328 2329 function Controller() { 2330 _classCallCheck(this, Controller); 2331 2332 return _possibleConstructorReturn(this, _THREE$EventDispatche.apply(this, arguments)); 2333 } 2334 2335 Controller.prototype.handleDefault = function handleDefault(id, e, data) { 2336 //console.log(id+'-'+e.type+'-'+data); 2337 }; 2338 2339 Controller.prototype.dispatchAsync = function dispatchAsync(e) { 2340 var _this2 = this; 2341 2342 Promise.resolve().then(function () { 2343 return _this2.dispatchEvent(e); 2344 });
2345 }; 2346 2347 Controller.prototype.dispose = function dispose() {}; 2348 2349 return Controller; 2350}(_libs.THREE.EventDispatcher); 2351 2352exports.default = Controller; 2353 2354/***/ }), 2355/* 16 */ 2356/***/ (function(module, exports, __webpack_require__) { 2357 2358"use strict"; 2359 2360 2361exports.__esModule = true; 2362 2363var _EventConverter2 = __webpack_require__(6); 2364 2365var _EventConverter3 = _interopRequireDefault(_EventConverter2); 2366 2367function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2368 2369function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2370 2371function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 2372 2373function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 2374 2375var CustomEventConverter = function (_EventConverter) { 2376 _inherits(CustomEventConverter, _EventConverter); 2377 2378 // custom 2379 // testIntersection(e, data); 2380 // custom.object 2381 // test(object); 2382 2383 function CustomEventConverter(wnd, doc) { 2384 var customTest = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () { 2385 return false; 2386 }; 2387 var eDoc = arguments[3]; 2388 2389 _classCallCheck(this, CustomEventConverter); 2390 2391 var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); 2392 2393 _this.eDoc = eDoc; 2394 _this.customTest = customTest; 2395 _this.customs = []; 2396 return _this; 2397 } 2398 2399 CustomEventConverter.prototype.test = function test(object1, object2) { 2400 return object1 && object2 ? this.customTest(object1, object2) : false; 2401 }; 2402 2403 CustomEventConverter.prototype.getCallback = function getCallback(object) { 2404 return object.target.callback; 2405 }; 2406 2407 CustomEventConverter.prototype.addCustom = function addCustom(custom) { 2408 this.customs.push(custom); 2409 }; 2410 2411 CustomEventConverter.prototype.getObject = function getObject(e, data) { 2412 var object = void 0; 2413 if (data.doc === this.eDoc) { 2414 for (var _iterator = this.customs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 2415 var _ref; 2416 2417 if (_isArray) { 2418 if (_i >= _iterator.length) break; 2419 _ref = _iterator[_i++]; 2420 } else { 2421 _i = _iterator.next(); 2422 if (_i.done) break; 2423 _ref = _i.value; 2424 } 2425 2426 var custom = _ref; 2427 2428 object = custom.testIntersection(e, data); 2429 if (object) { 2430 break; 2431 } 2432 } 2433 } 2434 return object; 2435 }; 2436 2437 return CustomEventConverter; 2438}(_EventConverter3.default); 2439 2440exports.default = CustomEventConverter; 2441 2442/***/ }), 2443/* 17 */ 2444/***/ (function(module, exports, __webpack_require__) { 2445 2446"use strict"; 2447 2448 2449exports.__esModule = true; 2450 2451var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 2452 2453var _Utils = __webpack_require__(4); 2454 2455var _Utils2 = _interopRequireDefault(_Utils); 2456 2457function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2458 2459function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2460 2461var Finder = function () { 2462 Finder.isDelimetr = function isDelimetr(s) { 2463 return s === Finder.DELIMITER; 2464 }; 2465 2466 Finder.prototype.merge = function merge() { 2467 var as = [], 2468 map = [], 2469 strs = this.strs; 2470 var p = 0; 2471 for (var i = 0; i < strs.length; ++i) { 2472 if (strs[i].length) { 2473 map.push({ 2474 base: i, 2475 offset: p 2476 }); 2477 as.push(strs[i]); 2478 p += strs[i].length; 2479 if (i < strs.length - 1 && !Finder.isDelimetr(strs[i].charAt(strs[i].length - 1)) && !Finder.isDelimetr(strs[i + 1].charAt(0))) { 2480 as.push(Finder.DELIMITER); 2481 ++p; 2482 } 2483 } 2484 } 2485 this.map = map; 2486 this.str = as.join(''); 2487 }; 2488 2489 Finder.prototype.addHits = function addHits(p) { 2490 var info = this.map[_Utils2.default.lowerBound(this.map, { offset: p }, function (a, b) { 2491 return a.offset - b.offset; 2492 })]; 2493 var chars = this.pattern.length, 2494 i = info.base; 2495 p -= info.offset; 2496 while (chars) { 2497 if (this.strs[i].length) { 2498 var delimeter = i < this.strs.length - 1 && !Finder.isDelimetr(this.strs[i].charAt(this.strs[i].length - 1)) && !Finder.isDelimetr(this.strs[i + 1].charAt(0)), 2499 length = Math.min(this.strs[i].length + (delimeter ? 1 : 0) - p, chars); 2500 if (p < this.strs[i].length) { 2501 this.hits.push({ 2502 index: i, 2503 offset: p, 2504 length: Math.min(length, this.strs[i].length - p) 2505 }); 2506 } 2507 chars -= length; 2508 ++i; 2509 p = 0; 2510 } 2511 } 2512 }; 2513 2514 Finder.prototype.addContext = function addContext(p) { 2515 var f = p, 2516 l = p + this.pattern.length - 1, 2517 dels = this.props.contextLength, 2518 prevDels = dels + 1; 2519 while (dels && prevDels - dels) { 2520 prevDels = dels; 2521 if (dels % 2) { 2522 for (var i = f - 2; i >= 0; --i) { 2523 if (Finder.isDelimetr(this.str[i]) || i === 0) { 2524 f = i === 0 ? 0 : i + 1; 2525 --dels; 2526 break; 2527 } 2528 } 2529 } else { 2530 for (var _i = l + 2; _i < this.str.length; ++_i) { 2531 if (Finder.isDelimetr(this.str[_i]) || _i === this.str.length - 1) { 2532 l = _i === this.str.length - 1 ? _i === this.str.length - 1 : _i - 1; 2533 --dels; 2534 break; 2535 } 2536 } 2537 } 2538 } 2539 this.contexts.push(this.str.substr(f, l - f + 1)); 2540 }; 2541 2542 Finder.prototype.getHits = function getHits() { 2543 return this.hits; 2544 }; 2545 2546 Finder.prototype.getContexts = function getContexts() { 2547 return this.contexts; 2548 }; 2549 2550 function Finder(strs, pattern, props) { 2551 _classCallCheck(this, Finder); 2552 2553 this.props = _extends({}, Finder.defaults, props); 2554 this.strs = strs;
2555 var data = this.merge(strs); 2556 this.hits = []; 2557 this.contexts = []; 2558 this.pattern = pattern.toLowerCase(); 2559 this.lstr = this.str.toLowerCase(); 2560 var p = 0; 2561 while (true) { 2562 p = this.lstr.indexOf(this.pattern, p); 2563 if (p === -1) { 2564 break; 2565 } else { 2566 this.addHits(p); 2567 this.addContext(p); 2568 p += this.pattern.length; 2569 } 2570 } 2571 } 2572 2573 return Finder; 2574}(); 2575 2576Finder.DELIMITER = ' '; 2577Finder.defaults = { 2578 contextLength: 7, 2579 hits: true, 2580 contexts: true 2581}; 2582exports.default = Finder; 2583 2584/***/ }), 2585/* 18 */ 2586/***/ (function(module, exports, __webpack_require__) { 2587 2588"use strict"; 2589 2590 2591exports.__esModule = true; 2592 2593var _libs = __webpack_require__(0); 2594 2595var _Utils = __webpack_require__(4); 2596 2597var _Utils2 = _interopRequireDefault(_Utils); 2598 2599function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2600 2601function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2602 2603_libs.PDFJS.workerSrc = (window.PDFJS_LOCALE ? PDFJS_LOCALE : __webpack_require__.i({"pdfJsWorker":"/FlipBook/3d-flip-book/js/pdf.worker.js","pdfJsCMapUrl":"cmaps/"})).pdfJsWorker; 2604_libs.PDFJS.cMapUrl = (window.PDFJS_LOCALE ? PDFJS_LOCALE : __webpack_require__.i({"pdfJsWorker":"/FlipBook/3d-flip-book/js/pdf.worker.js","pdfJsCMapUrl":"cmaps/"})).pdfJsCMapUrl; 2605_libs.PDFJS.cMapPacked = true; 2606_libs.PDFJS.disableAutoFetch = true; 2607_libs.PDFJS.disableStream = true; 2608_libs.PDFJS.imageResourcesPath = 'images/pdfjs/'; 2609_libs.PDFJS.externalLinkTarget = _libs.PDFJS.LinkTarget.BLANK; 2610 2611var Pdf = function () { 2612 function Pdf(src, loadingProgress) { 2613 var _this = this; 2614 2615 _classCallCheck(this, Pdf); 2616 2617 this.src = _Utils2.default.normalizeUrl(src); 2618 this.handlerQueue = []; 2619 this.progresData = { loaded: -1, total: 1 }; 2620 this.loadingProgress = loadingProgress; 2621 2622 this.task = _libs.PDFJS.getDocument({ 2623 url: this.src, 2624 rangeChunkSize: 512 * 1024 2625 }); 2626 this.task.onProgress = function (data) { 2627 if (_this.loadingProgress) { 2628 var cur = Math.floor(100 * data.loaded / data.total), 2629 old = Math.floor(100 * _this.progresData.loaded / _this.progresData.total); 2630 if (cur !== old) { 2631 cur = isNaN(cur) ? 0 : cur; 2632 cur = cur > 100 ? 100 : cur; 2633 Promise.resolve().then(function () { 2634 _this.loadingProgress(cur); 2635 }); 2636 } 2637 } 2638 _this.progresData = data; 2639 }; 2640 this.task.then(function (handler) { 2641 if (handler.numPages > 1) { 2642 Promise.all([handler.getPage(1), handler.getPage(2)]).then(function (pages) { 2643 _this.init(handler, pages); 2644 }); 2645 } else { 2646 _this.init(handler); 2647 } 2648 }).catch(function (e) { 2649 return console.error(e); 2650 }); 2651 } 2652 2653 Pdf.prototype.init = function init(handler, pages) { 2654 this.handler = handler; 2655 this.doubledPages = pages ? Math.abs(2 * Pdf.getPageSize(pages[0]).width - Pdf.getPageSize(pages[1]).width) / Pdf.getPageSize(pages[0]).width < 0.01 : false; 2656 var done = Promise.resolve(handler); 2657 2658 var _loop = function _loop() { 2659 if (_isArray) { 2660 if (_i >= _iterator.length) return 'break'; 2661 _ref = _iterator[_i++]; 2662 } else { 2663 _i = _iterator.next(); 2664 if (_i.done) return 'break'; 2665 _ref = _i.value; 2666 } 2667 2668 var clb = _ref; 2669 2670 done = done.then(function (handler) { 2671 clb(handler); 2672 return handler; 2673 }); 2674 }; 2675 2676 for (var _iterator = this.handlerQueue.reverse(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 2677 var _ref; 2678 2679 var _ret = _loop(); 2680 2681 if (_ret === 'break') break; 2682 } 2683 }; 2684 2685 Pdf.prototype.getPageType = function getPageType(n) { 2686 return !this.doubledPages || n === 0 || n === this.getPagesNum() - 1 ? 'full' : n & 1 ? 'left' : 'right'; 2687 }; 2688 2689 Pdf.prototype.getPage = function getPage(n) { 2690 return this.handler.getPage(this.doubledPages ? Math.ceil(n / 2) + 1 : n + 1); 2691 }; 2692 2693 Pdf.prototype.dispose = function dispose() { 2694 this.handlerQueue.splice(0, this.handlerQueue.length); 2695 delete this.handler; 2696 }; 2697 2698 Pdf.prototype.setLoadingProgressClb = function setLoadingProgressClb(clb) { 2699 this.loadingProgress = clb; 2700 }; 2701 2702 Pdf.prototype.getPagesNum = function getPagesNum() { 2703 return this.handler ? this.doubledPages ? 2 * (this.handler.numPages - 1) : this.handler.numPages : undefined; 2704 }; 2705 2706 Pdf.getPageSize = function getPageSize(page) { 2707 return { 2708 width: page.view[2] - page.view[0], 2709 height: page.view[3] - page.view[1] 2710 }; 2711 }; 2712 2713 // if(pages>1) { 2714 // handler.getPage(2). 2715 // then((page)=> { 2716 // const size1 = Pdf.getPageSize(page); 2717 // this.props.doubledPages = 2*size0.width===size1.width; 2718 // this.ready(); 2719 // }). 2720 // catch(()=> this.ready()); 2721 // } 2722 // else { 2723 2724 Pdf.prototype.getHandler = function getHandler(clb) { 2725 if (this.handler) { 2726 clb(this.handler); 2727 } else { 2728 this.handlerQueue.push(clb); 2729 } 2730 }; 2731 2732 return Pdf; 2733}();
2734 2735exports.default = Pdf; 2736 2737/***/ }), 2738/* 19 */ 2739/***/ (function(module, exports, __webpack_require__) { 2740 2741"use strict"; 2742 2743 2744exports.__esModule = true; 2745 2746var _libs = __webpack_require__(0); 2747 2748function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2749 2750var ThreeEventConverterFs = function () { 2751 ThreeEventConverterFs.objectsTest = function objectsTest(object1, object2) { 2752 return object1 && object2 ? object1.object === object2.object : false; 2753 }; 2754 2755 ThreeEventConverterFs.objectsAndFacesTest = function objectsAndFacesTest(object1, object2) { 2756 return object1 && object2 ? object1.object === object2.object && object1.face.materialIndex === object2.face.materialIndex : false; 2757 }; 2758 2759 function ThreeEventConverterFs(visualWorld) { 2760 var test = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ThreeEventConverterFs.objectsAndFacesTest; 2761 2762 _classCallCheck(this, ThreeEventConverterFs); 2763 2764 this.visual = visualWorld; 2765 this.coords = new _libs.THREE.Vector2(); 2766 this.raycaster = this.visual.raycaster; 2767 this.camera = this.visual.camera; 2768 this.threes = []; 2769 this.test = test; 2770 } 2771 2772 ThreeEventConverterFs.prototype.addThree = function addThree(three) { 2773 this.threes.push(three); 2774 }; 2775 2776 ThreeEventConverterFs.prototype.removeThree = function removeThree(three) { 2777 var i = this.threes.indexOf(three); 2778 if (~i) { 2779 this.threes.splice(i, 1); 2780 } 2781 }; 2782 2783 ThreeEventConverterFs.prototype.getObject = function getObject(e) { 2784 this.setCoordsFromEvent(e); 2785 this.raycaster.setFromCamera(this.coords, this.camera); 2786 var intersects = this.raycaster.intersectObjects(this.threes); 2787 return intersects[0]; 2788 }; 2789 2790 return ThreeEventConverterFs; 2791}(); 2792 2793exports.default = ThreeEventConverterFs; 2794 2795/***/ }), 2796/* 20 */ 2797/***/ (function(module, exports, __webpack_require__) { 2798 2799"use strict"; 2800 2801 2802exports.__esModule = true; 2803 2804var _BaseMathUtils = __webpack_require__(2); 2805 2806var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); 2807 2808function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2809 2810function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2811 2812var ThreeUtils = function () { 2813 function ThreeUtils() { 2814 _classCallCheck(this, ThreeUtils); 2815 } 2816 2817 ThreeUtils.vertices2UVs = function vertices2UVs(vertices, indeces, first, last, converClb) { 2818 var r = []; 2819 for (var i = first; i < last; ++i) { 2820 var vis = [indeces[i].a, indeces[i].b, indeces[i].c]; 2821 for (var j = 0; j < vis.length; ++j) { 2822 if (!r[vis[j]]) { 2823 r[vis[j]] = converClb(vertices[vis[j]]); 2824 } 2825 } 2826 } 2827 return r; 2828 }; 2829 2830 ThreeUtils.computeFaceVertexUvs = function computeFaceVertexUvs(geometry, faces) { 2831 var uvs = [ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, 0, faces[0], function (p) { 2832 return new THREE.Vector2(p.x, 1 - p.z); 2833 }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[0], faces[1], function (p) { 2834 return new THREE.Vector2(1 - p.x, 1 - p.z); 2835 }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[1], faces[2], function (p) { 2836 return new THREE.Vector2(p.x, p.y); 2837 }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[2], faces[3], function (p) { 2838 return new THREE.Vector2(1 - p.x, p.y); 2839 }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[3], faces[4], function (p) { 2840 return new THREE.Vector2(p.z, p.y); 2841 }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[4], geometry.faces.length, function (p) { 2842 return new THREE.Vector2(1 - p.z, p.y); 2843 })]; 2844 2845 var uvsi = 0; 2846 for (var i = 0; i < geometry.faces.length; ++i) { 2847 uvsi += faces[uvsi] === i; 2848 var f = geometry.faces[i]; 2849 f.materialIndex = uvsi; 2850 geometry.faceVertexUvs[0][i] = [uvs[uvsi][f.a], uvs[uvsi][f.b], uvs[uvsi][f.c]]; 2851 } 2852 }; 2853 2854 ThreeUtils.createMarker = function createMarker(p, c, size) { 2855 var marker = new THREE.Mesh(new THREE.SphereGeometry(size), new THREE.MeshPhongMaterial({ color: c })); 2856 marker.position.set(p.x, p.y, p.z); 2857 return marker; 2858 }; 2859 2860 ThreeUtils.findUvTris = function findUvTris(geometry, ps, first, last) { 2861 var res = []; 2862 for (var _iterator = ps, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 2863 var _ref; 2864 2865 if (_isArray) { 2866 if (_i >= _iterator.length) break; 2867 _ref = _iterator[_i++]; 2868 } else { 2869 _i = _iterator.next(); 2870 if (_i.done) break; 2871 _ref = _i.value; 2872 } 2873 2874 var p = _ref; 2875 2876 var found = false; 2877 for (var i = first; i < last && !found; ++i) { 2878 var tri = geometry.faceVertexUvs[0][i]; 2879 if (_BaseMathUtils2.default.isInsideConvPoly(tri, p)) { 2880 res.push({ 2881 coefs: _BaseMathUtils2.default.computeInterpCoefs(tri, p), 2882 i: i 2883 }); 2884 found = true; 2885 } 2886 } 2887 if (!found) { 2888 console.error('Bad point'); 2889 res.push(undefined); 2890 } 2891 } 2892 return res; 2893 }; 2894 2895 ThreeUtils.findInternalVertices = function findInternalVertices(geometry, ps, first, last) { 2896 var res = {}; 2897 for (var i = first; i < last; ++i) { 2898 var tri = geometry.faceVertexUvs[0][i], 2899 f = geometry.faces[i], 2900 vs = [f.a, f.b, f.c]; 2901 for (var j = 0; j < tri.length; ++j) { 2902 if (res[vs[j]] === undefined && _BaseMathUtils2.default.isInsidePoly(ps, tri[j])) { 2903 res[vs[j]] = { 2904 p: tri[j], 2905 i: vs[j], 2906 n: f.vertexNormals[j] 2907 }; 2908 } 2909 } 2910 } 2911 return Object.values(res); 2912 }; 2913 2914 return ThreeUtils; 2915}(); 2916 2917exports.default = ThreeUtils; 2918 2919/***/ }), 2920/* 21 */ 2921/***/ (function(module, exports, __webpack_require__) { 2922 2923"use strict"; 2924 2925 2926exports.__esModule = true; 2927 2928function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2929 2930var Target = function () { 2931 function Target() { 2932 _classCallCheck(this, Target); 2933 } 2934 2935 Target.test = function test(object1, object2) { 2936 return object1.target === object2.target; 2937 }; 2938 2939 return Target; 2940}();
2941 2942exports.default = Target; 2943 2944/***/ }), 2945/* 22 */ 2946/***/ (function(module, exports, __webpack_require__) { 2947 2948"use strict"; 2949 2950 2951var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 2952 2953var _libs = __webpack_require__(1); 2954 2955var _Detector = __webpack_require__(45); 2956 2957var _Detector2 = _interopRequireDefault(_Detector); 2958 2959var _VisualWorld = __webpack_require__(66); 2960 2961var _VisualWorld2 = _interopRequireDefault(_VisualWorld); 2962 2963var _PdfLinksHandler = __webpack_require__(35); 2964 2965var _PdfLinksHandler2 = _interopRequireDefault(_PdfLinksHandler); 2966 2967var _Book = __webpack_require__(26); 2968 2969var _Book2 = _interopRequireDefault(_Book); 2970 2971var _BookView = __webpack_require__(29); 2972 2973var _BookView2 = _interopRequireDefault(_BookView); 2974 2975var _BookController = __webpack_require__(27); 2976 2977var _BookController2 = _interopRequireDefault(_BookController); 2978 2979var _PdfBookPropsBuilder = __webpack_require__(34); 2980 2981var _PdfBookPropsBuilder2 = _interopRequireDefault(_PdfBookPropsBuilder); 2982 2983var _ClbBookPropsBuilder = __webpack_require__(30); 2984 2985var _ClbBookPropsBuilder2 = _interopRequireDefault(_ClbBookPropsBuilder); 2986 2987var _LoadingController = __webpack_require__(53); 2988 2989var _LoadingController2 = _interopRequireDefault(_LoadingController); 2990 2991var _Search = __webpack_require__(58); 2992 2993var _Search2 = _interopRequireDefault(_Search); 2994 2995var _Bookmarks = __webpack_require__(44); 2996 2997var _Bookmarks2 = _interopRequireDefault(_Bookmarks); 2998 2999var _Thumbnails = __webpack_require__(63); 3000 3001var _Thumbnails2 = _interopRequireDefault(_Thumbnails); 3002 3003var _TocController = __webpack_require__(40); 3004 3005var _TocController2 = _interopRequireDefault(_TocController); 3006 3007var _BookPrinter = __webpack_require__(28); 3008 3009var _BookPrinter2 = _interopRequireDefault(_BookPrinter); 3010 3011var _AutoNavigator = __webpack_require__(24); 3012 3013var _AutoNavigator2 = _interopRequireDefault(_AutoNavigator); 3014 3015var _SoundsEnviroment = __webpack_require__(39); 3016 3017var _SoundsEnviroment2 = _interopRequireDefault(_SoundsEnviroment); 3018 3019function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 3020 3021_libs.$.fn.FlipBook = function (options) { 3022 var scene = { 3023 dispose: function dispose() { 3024 if (this.ready) { 3025 !scene.pdfLinksHandler || scene.pdfLinksHandler.dispose(); 3026 delete scene.pdfLinksHandler; 3027 scene.sounds.dispose(); 3028 delete scene.sounds; 3029 scene.tocCtrl.dispose(); 3030 delete scene.tocCtrl; 3031 scene.thumbnails.dispose(); 3032 delete scene.thumbnails; 3033 !scene.bookmarks || scene.bookmarks.dispose(); 3034 delete scene.bookmarks; 3035 scene.ctrl.dispose(); 3036 delete scene.ctrl; 3037 scene.bookPrinter.dispose(); 3038 delete scene.bookPrinter; 3039 scene.book.dispose(); 3040 delete scene.book; 3041 scene.propsBuilder.dispose(); 3042 delete scene.propsBuilder; 3043 delete scene.bookBuilder; 3044 scene.visual.dispose(); 3045 delete scene.visual; 3046 scene.view.dispose(); 3047 delete scene.view; 3048 delete scene.dispose; 3049 } else { 3050 this.pendingDispose = true; 3051 } 3052 } 3053 }; 3054 options = _extends({}, options); 3055 scene.view = new _BookView2.default(this.length ? this[0] : (0, _libs.$)('<div>').appendTo('body'), function () { 3056 if (!_Detector2.default.webgl) { 3057 _Detector2.default.addGetWebGLMessage({ parent: scene.view.getView() }); 3058 } else { 3059 scene.loadingCtrl = new _LoadingController2.default(scene.view, true, function (progress) { 3060 return progress === 0 ? (0, _libs.tr)('Please wait... the Application is Loading') : (0, _libs.tr)('PDF is Loading:') + ' ' + progress + '%'; 3061 }); 3062 scene.visual = new _VisualWorld2.default(scene.view.getContainer().ownerDocument.defaultView, scene.view.getContainer().ownerDocument, scene.view.getView()); 3063 scene.bookBuilder = function (props, sheets, pageCallback) { 3064 props.cssLayerProps = _extends({}, props.cssLayerProps, { 3065 scene: scene 3066 }); 3067 if (options.propertiesCallback) { 3068 props = options.propertiesCallback(props); 3069 } 3070 scene.book = new _Book2.default(scene.visual, sheets, pageCallback, props); 3071 scene.bookPrinter = new _BookPrinter2.default(scene.visual, scene.book, (options.template || {}).printStyle); 3072 scene.loadingCtrl.dispose(); 3073 delete scene.loadingCtrl; 3074 scene.ctrl = new _BookController2.default(scene.book, scene.view, options.controlsProps); 3075 scene.book.setInjector(function (w) { 3076 w.jQuery = w.$ = _libs.$; 3077 w.book = scene.book; 3078 w.bookCtrl = scene.ctrl; 3079 if (props.injector) { 3080 props.injector(w); 3081 } 3082 }); 3083 scene.view.addHandler(scene.ctrl); 3084 scene.ctrl.setPrinter(scene.bookPrinter); 3085 var test = pageCallback(0); 3086 3087 scene.search = new _Search2.default(scene.view.getSearchView(), scene.book.getPages()); 3088 scene.search.onQuery = scene.book.setQuery.bind(scene.book); 3089 scene.book.addEventListener('searchResults', function (e) { 3090 scene.search.setResults(e.results, e.lastPage); 3091 }); 3092
3093 scene.thumbnails = new _Thumbnails2.default(scene.visual, scene.view.getThumbnailsView(), pageCallback, 2 * (sheets + 2), { kWtoH: props.width / props.height }); 3094 scene.tocCtrl = new _TocController2.default(scene.view, scene.ctrl); 3095 scene.tocCtrl.setThumbnails(scene.thumbnails); 3096 scene.tocCtrl.setSearch(scene.search); 3097 scene.ctrl.setTocCtrl(scene.tocCtrl); 3098 scene.view.addHandler(scene.tocCtrl); 3099 3100 if (test.type === 'pdf') { 3101 scene.pdfLinksHandler = new _PdfLinksHandler2.default(test.src, scene.ctrl, scene.visual.element); 3102 scene.book.addEventListener('pdfAnnotation', scene.pdfLinksHandler.handleEvent.bind(scene.pdfLinksHandler)); 3103 test.src.getHandler(function (handler) { 3104 handler.getOutline().then(function (outline) { 3105 scene.bookmarks = new _Bookmarks2.default(scene.view.getBookmarksView(), outline); 3106 scene.tocCtrl.setBookmarks(scene.bookmarks, test.src); 3107 }); 3108 }); 3109 if (options.pdfLinks && options.pdfLinks.handler) { 3110 scene.pdfLinksHandler.setHandler(options.pdfLinks.handler); 3111 } 3112 } 3113 3114 scene.sounds = new _SoundsEnviroment2.default(options.template); 3115 scene.ctrl.setSounds(scene.sounds); 3116 scene.sounds.subscribeFlips(scene.ctrl); 3117 3118 scene.ready = true; 3119 new _AutoNavigator2.default(scene.visual, scene.ctrl, options.autoNavigation).dispose(); 3120 if (options.ready) { 3121 options.ready(scene); 3122 } 3123 if (scene.pendingDispose) { 3124 scene.dispose(); 3125 } 3126 }; 3127 if (options.pdf) { 3128 scene.propsBuilder = new _PdfBookPropsBuilder2.default(options.pdf, scene.bookBuilder); 3129 scene.propsBuilder.pdf.setLoadingProgressClb(scene.loadingCtrl.setProgress.bind(scene.loadingCtrl)); 3130 } else if (options.pageCallback) { 3131 scene.propsBuilder = new _ClbBookPropsBuilder2.default(scene.visual, options.pageCallback, options.pages, scene.bookBuilder); 3132 } else { 3133 scene.propsBuilder = new _ClbBookPropsBuilder2.default(scene.visual, _Book2.default.pageCallback, 6, scene.bookBuilder); 3134 } 3135 } 3136 }, options.template); 3137 return scene; 3138}; 3139 3140(0, _libs.$)(function () { 3141 var containers = (0, _libs.$)('.flip-book-container'); 3142 for (var i = 0; i < containers.length; ++i) { 3143 var jContainer = (0, _libs.$)(containers[i]), 3144 src = jContainer.attr('src'); 3145 if (!!src) { 3146 jContainer.FlipBook({ pdf: src }); 3147 } 3148 } 3149}); 3150 3151window.jQuery = window.$ = _libs.$; 3152 3153/***/ }), 3154/* 23 */ 3155/***/ (function(module, exports, __webpack_require__) { 3156 3157"use strict"; 3158 3159 3160if (!Array.prototype.fill) { 3161 Array.prototype.fill = function (value) { 3162 3163 // Шаги 1-2. 3164 if (this == null) { 3165 throw new TypeError('this is null or not defined'); 3166 } 3167 3168 var O = Object(this); 3169 3170 // Шаги 3-5. 3171 var len = O.length >>> 0; 3172 3173 // Шаги 6-7. 3174 var start = arguments[1]; 3175 var relativeStart = start >> 0; 3176 3177 // Шаг 8. 3178 var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); 3179 3180 // Шаги 9-10. 3181 var end = arguments[2]; 3182 var relativeEnd = end === undefined ? len : end >> 0; 3183 3184 // Шаг 11. 3185 var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); 3186 3187 // Шаг 12. 3188 while (k < final) { 3189 O[k] = value; 3190 k++; 3191 } 3192 3193 // Шаг 13. 3194 return O; 3195 }; 3196} 3197 3198if (!Array.prototype.find) { 3199 Object.defineProperty(Array.prototype, 'find', { 3200 value: function value(predicate) { 3201 'use strict'; 3202 3203 if (this == null) { 3204 throw new TypeError('Array.prototype.find called on null or undefined'); 3205 } 3206 if (typeof predicate !== 'function') { 3207 throw new TypeError('predicate must be a function'); 3208 } 3209 var list = Object(this); 3210 var length = list.length >>> 0; 3211 var thisArg = arguments[1]; 3212 var value; 3213 3214 for (var i = 0; i < length; i++) { 3215 value = list[i]; 3216 if (predicate.call(thisArg, value, i, list)) { 3217 return value; 3218 } 3219 } 3220 return undefined; 3221 } 3222 }); 3223} 3224 3225if (!Array.prototype.findIndex) { 3226 Array.prototype.findIndex = function (predicate) { 3227 if (this == null) { 3228 throw new TypeError('Array.prototype.findIndex called on null or undefined'); 3229 } 3230 if (typeof predicate !== 'function') { 3231 throw new TypeError('predicate must be a function'); 3232 } 3233 var list = Object(this); 3234 var length = list.length >>> 0; 3235 var thisArg = arguments[1]; 3236 var value; 3237 3238 for (var i = 0; i < length; i++) { 3239 value = list[i]; 3240 if (predicate.call(thisArg, value, i, list)) { 3241 return i; 3242 } 3243 } 3244 return -1; 3245 }; 3246} 3247 3248if (!Object.values) { 3249 Object.values = function values(O) { 3250 return Object.keys(O).map(function (name) { 3251 return O[name]; 3252 }) || []; 3253 }; 3254} 3255 3256if (!RegExp.escape) { 3257 RegExp.escape = function (s) { 3258 return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 3259 }; 3260} 3261 3262if (!String.prototype.replaceAll) { 3263 String.prototype.replaceAll = function (search, replace) { 3264 return this.replace(new RegExp(RegExp.escape(search), 'g'), replace); 3265 }; 3266} 3267 3268/***/ }), 3269/* 24 */ 3270/***/ (function(module, exports, __webpack_require__) { 3271 3272"use strict"; 3273 3274 3275exports.__esModule = true; 3276 3277var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 3278 3279function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 3280 3281var AutoNavigator = function () { 3282 function AutoNavigator(context, bookCtrl) { 3283 var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 3284 3285 _classCallCheck(this, AutoNavigator); 3286 3287 props = _extends({}, props, { 3288 urlParam: props.urlParam || 'fb3d-page', 3289 navigates: props.navigates === undefined ? 1 : props.navigates, 3290 pageN: props.pageN || 0 3291 });
3292 this.props = props; 3293 this.context = context; 3294 this.bookCtrl = bookCtrl; 3295 this.urlParam = props.urlParam; 3296 this.pageN = props.pageN; 3297 this.wnd = context.wnd; 3298 3299 this.wnd.fb3d = _extends({}, this.wnd.fb3d); 3300 this.wnd.fb3d.navigator = _extends({}, this.wnd.fb3d.navigator); 3301 this.navigator = this.wnd.fb3d.navigator[this.urlParam] = _extends({}, this.wnd.fb3d.navigator[this.urlParam]); 3302 this.navigator.instances = (this.navigator.instances || 0) + 1; 3303 3304 if (this.navigator.instances <= this.props.navigates) { 3305 this.bookCtrl.goToPage(this.getPageNumber()); 3306 } 3307 } 3308 3309 AutoNavigator.prototype.dispose = function dispose() {}; 3310 3311 AutoNavigator.prototype.getParameterByName = function getParameterByName(name, url) { 3312 if (!url) { 3313 url = window.location.href; 3314 } 3315 name = name.replace(/[\[\]]/g, '\\$&'); 3316 var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'), 3317 results = regex.exec(url); 3318 if (!results) return null; 3319 if (!results[2]) return ''; 3320 return decodeURIComponent(results[2].replace(/\+/g, ' ')); 3321 }; 3322 3323 AutoNavigator.prototype.getPageNumber = function getPageNumber() { 3324 var number = parseInt(this.pageN); 3325 if (isNaN(number) || number === 0) { 3326 number = this.getParameterByName(this.urlParam); 3327 number = parseInt(number); 3328 if (isNaN(number)) { 3329 number = 1; 3330 } 3331 } 3332 return number - 1; 3333 }; 3334 3335 return AutoNavigator; 3336}(); 3337 3338exports.default = AutoNavigator; 3339 3340/***/ }), 3341/* 25 */ 3342/***/ (function(module, exports, __webpack_require__) { 3343 3344"use strict"; 3345 3346 3347exports.__esModule = true; 3348 3349var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 3350 3351var _libs = __webpack_require__(1); 3352 3353var _MathUtils = __webpack_require__(3); 3354 3355var _MathUtils2 = _interopRequireDefault(_MathUtils); 3356 3357function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 3358 3359function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 3360 3361var Binder = function () { 3362 function Binder(visual, p) { 3363 var _this = this; 3364 3365 _classCallCheck(this, Binder); 3366 3367 this.visual = visual; 3368 this.p = _extends({}, p, { 3369 backSize: 2 * p.cover.depth + p.sheets * p.page.depth 3370 }); 3371 this.OZ = new _libs.THREE.Vector3(0, 0, 1); 3372 3373 this.backG = new _libs.THREE.BoxGeometry(p.cover.depth, this.p.backSize, p.cover.height); 3374 3375 this.materials = [new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color })]; 3376 3377 var backM = new _libs.THREE.Mesh(this.backG, new _libs.THREE.MeshFaceMaterial(this.materials)); 3378 3379 if (p.cover.binderTexture !== '') { 3380 this.visual.textureLoader.load(p.cover.binderTexture, function (texture) { 3381 _this.materials[1].color.setHex(0xFFFFFF); 3382 _this.materials[1].map = texture; 3383 texture.minFilter = _libs.THREE.LinearFilter; 3384 texture.needsUpdate = true; 3385 _this.materials[1].needsUpdate = true; 3386 }); 3387 } 3388 3389 this.three = new _libs.THREE.Object3D(); 3390 this.back = new _libs.THREE.Object3D(); 3391 this.backRT = new _libs.THREE.Object3D(); 3392 this.backRR = new _libs.THREE.Object3D(); 3393 this.backLT = new _libs.THREE.Object3D(); 3394 this.backLR = new _libs.THREE.Object3D(); 3395 this.leftPivot = new _libs.THREE.Object3D(); 3396 this.rightPivot = new _libs.THREE.Object3D(); 3397 3398 this.back.add(backM); 3399 this.back.add(this.leftPivot); 3400 this.back.add(this.rightPivot); 3401 this.backRT.add(this.back); 3402 this.backRR.add(this.backRT); 3403 this.backLT.add(this.backRR); 3404 this.backLR.add(this.backLT); 3405 this.three.add(this.backLR); 3406 } 3407 3408 Binder.prototype.dispose = function dispose() { 3409 for (var _iterator = this.materials, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 3410 var _ref; 3411 3412 if (_isArray) { 3413 if (_i >= _iterator.length) break; 3414 _ref = _iterator[_i++]; 3415 } else { 3416 _i = _iterator.next(); 3417 if (_i.done) break; 3418 _ref = _i.value; 3419 } 3420 3421 var m = _ref; 3422
3423 if (m.map) { 3424 m.map = null; 3425 m.needsUpdate = true; 3426 } 3427 m.dispose(); 3428 } 3429 delete this.materials; 3430 this.backG.dispose(); 3431 }; 3432 3433 Binder.prototype.set = function set(angle) { 3434 var right = void 0, 3435 left = void 0; 3436 if (angle > Math.PI / 2) { 3437 right = Math.PI / 2; 3438 left = angle - Math.PI / 2; 3439 } else { 3440 right = angle; 3441 left = 0; 3442 } 3443 var p = this.p, 3444 tr1 = { x: -0.5 * p.cover.depth, y: 0.5 * p.backSize - p.cover.depth }; 3445 this.backRT.position.set(tr1.x, tr1.y, 0); 3446 this.backRR.position.set(-tr1.x, -tr1.y, 0); 3447 this.backRR.quaternion.setFromAxisAngle(this.OZ, right); 3448 3449 var tr2 = { x: p.backSize - 2 * p.cover.depth - 0.5 * p.cover.depth, y: 0.5 * p.backSize - p.cover.depth }; 3450 this.backLT.position.set(tr2.x, tr2.y, 0); 3451 this.backLR.position.set(-tr2.x, -tr2.y, 0); 3452 this.backLR.quaternion.setFromAxisAngle(this.OZ, left); 3453 }; 3454 3455 Binder.prototype.setLeft = function setLeft(angle) { 3456 var PI = Math.PI; 3457 this.leftPivot.position.set(_MathUtils2.default.interpolateLinear([-PI, -PI / 2], [0, this.p.cover.depth], angle), 0.5 * this.p.backSize - 0.5 * this.p.cover.depth, 0); 3458 this.leftPivot.quaternion.setFromAxisAngle(this.OZ, angle); 3459 }; 3460 3461 Binder.prototype.setRight = function setRight(angle) { 3462 var PI = Math.PI; 3463 this.rightPivot.position.set(_MathUtils2.default.interpolateLinear([-PI / 2, 0], [this.p.cover.depth, 0], angle), -0.5 * this.p.backSize + 0.5 * this.p.cover.depth, 0); 3464 this.rightPivot.quaternion.setFromAxisAngle(this.OZ, angle); 3465 }; 3466 3467 Binder.prototype.joinLeftCover = function joinLeftCover(cover) { 3468 cover.three.position.set(0, -0.5 * this.p.cover.depth, 0); 3469 this.leftPivot.add(cover.three); 3470 }; 3471 3472 Binder.prototype.disconnectLeftCover = function disconnectLeftCover(cover) { 3473 this.leftPivot.remove(cover.three); 3474 }; 3475 3476 Binder.prototype.joinRightCover = function joinRightCover(cover) { 3477 cover.three.position.set(0, -0.5 * this.p.cover.depth, 0); 3478 this.rightPivot.add(cover.three); 3479 }; 3480 3481 Binder.prototype.disconnectRightCover = function disconnectRightCover(cover) { 3482 this.rightPivot.remove(cover.three); 3483 }; 3484 3485 return Binder; 3486}(); 3487 3488exports.default = Binder; 3489 3490/***/ }), 3491/* 26 */ 3492/***/ (function(module, exports, __webpack_require__) { 3493 3494"use strict"; 3495 3496 3497exports.__esModule = true; 3498 3499var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 3500 3501var _libs = __webpack_require__(1); 3502 3503var _book = __webpack_require__(11); 3504 3505var _GraphUtils = __webpack_require__(7); 3506 3507var _GraphUtils2 = _interopRequireDefault(_GraphUtils); 3508 3509var _Binder = __webpack_require__(25); 3510 3511var _Binder2 = _interopRequireDefault(_Binder); 3512 3513var _Cover = __webpack_require__(31); 3514 3515var _Cover2 = _interopRequireDefault(_Cover); 3516 3517var _SheetBlock = __webpack_require__(10); 3518 3519var _SheetBlock2 = _interopRequireDefault(_SheetBlock); 3520 3521var _SheetPhysics = __webpack_require__(38); 3522 3523var _SheetPhysics2 = _interopRequireDefault(_SheetPhysics); 3524 3525var _PageManager = __webpack_require__(33); 3526 3527var _PageManager2 = _interopRequireDefault(_PageManager); 3528 3529var _CSSLayer = __webpack_require__(13); 3530 3531var _CSSLayer2 = _interopRequireDefault(_CSSLayer); 3532 3533var _CssLayersManager = __webpack_require__(32); 3534 3535var _CssLayersManager2 = _interopRequireDefault(_CssLayersManager); 3536 3537var _SearchEngine = __webpack_require__(36); 3538 3539var _SearchEngine2 = _interopRequireDefault(_SearchEngine); 3540 3541var _CustomEventConverter = __webpack_require__(16); 3542 3543var _CustomEventConverter2 = _interopRequireDefault(_CustomEventConverter); 3544 3545var _CircleTarget = __webpack_require__(68); 3546 3547var _CircleTarget2 = _interopRequireDefault(_CircleTarget); 3548 3549function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 3550 3551function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 3552 3553function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 3554 3555function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
3555onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 3556 3557var Book = function (_THREE$EventDispatche) { 3558 _inherits(Book, _THREE$EventDispatche); 3559 3560 // pageCallback samples 3561 3562 // (n)=> ({ 3563 // type: 'image', 3564 // src: 'sample.png', 3565 // interactive: false 3566 // }); 3567 // 3568 // (n)=> ({ 3569 // type: 'html', 3570 // src: 'sample.html', 3571 // interactive: true 3572 // }); 3573 // 3574 // const pdf = new Pdf('sample.pdf'); 3575 // (n)=> ({ 3576 // type: 'pdf', 3577 // src: pdf, 3578 // interactive: false 3579 // }); 3580 3581 function Book(visual, sheets, pageCallback, props) { 3582 _classCallCheck(this, Book); 3583 3584 var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); 3585 3586 _this.visual = visual; 3587 _this.mouseController = true; 3588 _this.p = _extends({}, Book.prepareProps(props), { 3589 sheets: sheets, 3590 pageCallback: pageCallback, 3591 zoom: 1, 3592 singlePage: false, 3593 autoResolution: { 3594 enable: false, 3595 k: 1.5 3596 } 3597 }); 3598 _this.pageManager = new _PageManager2.default(visual, _this, _this.p); 3599 _CSSLayer2.default.init(visual.doc); 3600 _this.layerManager = new _CssLayersManager2.default(_this); 3601 _this.searchEngine = new _SearchEngine2.default(pageCallback, 2 * (sheets + 2)); 3602 _this.searchEngine.onPageHitsChanged = function (page, query) { 3603 _this.pageManager.refreshPageQuery(page, query); 3604 _this.dispatchEvent({ 3605 type: 'searchResults', 3606 results: _this.searchEngine.results, 3607 lastPage: page, 3608 query: query 3609 }); 3610 }; 3611 3612 _this.three = new _libs.THREE.Object3D(); 3613 3614 _this.binder = new _Binder2.default(visual, _this.p); 3615 _this.three.add(_this.binder.three); 3616 3617 _this.leftCover = new _Cover2.default(visual, _extends({}, _this.p, { setTexture: _this.setLeftCoverTexture.bind(_this) }), Math.PI / 2, 'opened'); 3618 _this.binder.joinLeftCover(_this.leftCover); 3619 _this.subscribeSheetBlock(_this.leftCover, 0); 3620 _this.rightCover = new _Cover2.default(visual, _extends({}, _this.p, { setTexture: _this.setRightCoverTexture.bind(_this) }), 0, 'closed'); 3621 _this.binder.joinRightCover(_this.rightCover); 3622 _this.subscribeSheetBlock(_this.rightCover, 2 * (_this.p.sheets + 1)); 3623 3624 _this.threeSheetBlocks = new _libs.THREE.Object3D(); 3625 _this.three.add(_this.threeSheetBlocks); 3626 _this.threeSheetBlocks.position.set(0.5 * _this.p.cover.depth - 0.5 * sheets * _this.p.page.depth, -0.5 * sheets * _this.p.page.depth, 0); 3627 3628 _this.sheetBlocks = []; 3629 if (sheets > 0) { 3630 _this.addSheetBlock(0, new _SheetBlock2.default(visual, _extends({}, _this.p, { setTexture: _this.setPageTexture.bind(_this) }), 0, sheets, 0, 'closed')); 3631 } 3632 3633 _this.angle = _this.p.rtl ? Math.PI : 0; 3634 _this.closedAngle = 0; 3635 _this.set(_this.angle, 0); 3636 _this.lastMousePos = { 3637 t: 0 3638 }; 3639 3640 _this.three.position.set(-0.5 * _this.p.cover.depth + 0.5 * sheets * _this.p.page.depth, 0, 0); 3641 _this.sheetPhysics = new _SheetPhysics2.default(_this.p.page.width / _this.p.scale, _this.p.gravity, _this.p.page.cornerDeviation); 3642 3643 _this.binds = { 3644 update: _this.update.bind(_this), 3645 lastMousePos: function lastMousePos(e) { 3646 _this.lastMousePos = _extends({}, _this.lastMousePos, { 3647 pageX: e.pageX, 3648 pageY: e.pageY 3649 }); 3650 } 3651 }; 3652 _this.visual.addRenderCallback(_this.binds.update); 3653 (0, _libs.$)(_this.visual.element).on('mousemove', _this.binds.lastMousePos); 3654 3655 _this.binds.onPickCallback = _this.onPickCallback.bind(_this); 3656 _this.visual.drag.onPickCallback = _this.binds.onPickCallback; 3657 _this.binds.onDragCallback = _this.onDragCallback.bind(_this); 3658 _this.visual.drag.onDragCallback = _this.binds.onDragCallback; 3659 _this.binds.onReleaseCallback = _this.onReleaseCallback.bind(_this); 3660 _this.visual.drag.onReleaseCallback = _this.binds.onReleaseCallback; 3661 3662 _this.dragAngle = 0.05; 3663 _this.tmp = { 3664 boxs: [new _libs.THREE.Box3(), new _libs.THREE.Box3()] 3665 }; 3666 3667 _this.visual.addObject(_this.three); 3668 _this.visual.addEventListener('resize', _this.pageManager.refreshZoom.bind(_this.pageManager)); 3669 3670 setTimeout(function () { 3671 _this.notifyBeforeAnimation(); 3672 _this.notifyAfterAnimation(); 3673 }, 100); 3674 return _this; 3675 } 3676 3677 Book.prototype.dispose = function dispose() { 3678 this.visual.removeObject(this.three); 3679 this.sheetPhysics.dispose(); 3680 delete this.visual.drag.onPickCallback;
3681 delete this.visual.drag.onDragCallback; 3682 delete this.visual.drag.onReleaseCallback; 3683 (0, _libs.$)(this.visual.element).off('mousemove', this.binds.lastMousePos); 3684 this.visual.removeRenderCallback(this.binds.update); 3685 this.removeSheetBlocks(0, this.sheetBlocks.length); 3686 this.binder.disconnectLeftCover(this.leftCover); 3687 this.removeSheetBlock(this.leftCover); 3688 this.binder.disconnectRightCover(this.rightCover); 3689 this.removeSheetBlock(this.rightCover); 3690 this.binder.dispose(); 3691 this.layerManager.dispose(); 3692 _CSSLayer2.default.dispose(); 3693 this.pageManager.dispose(); 3694 }; 3695 3696 // publics { 3697 3698 Book.prototype.setAutoResolution = function setAutoResolution(enable) { 3699 var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.5; 3700 3701 this.p.autoResolution = _extends({}, this.p.autoResolution, { 3702 enable: enable, 3703 k: k 3704 }); 3705 }; 3706 3707 Book.prototype.setZoom = function setZoom(zoom, singlePage) { 3708 if (Math.abs(this.p.zoom - zoom) > 1e-3 || singlePage !== this.p.singlePage) { 3709 this.p.zoom = zoom; 3710 this.p.singlePage = singlePage; 3711 this.pageManager.refreshZoom(); 3712 } 3713 }; 3714 3715 Book.prototype.getPageCallback = function getPageCallback() { 3716 return this.p.pageCallback; 3717 }; 3718 3719 Book.prototype.setQuery = function setQuery(query) { 3720 this.searchEngine.setQuery(query); 3721 }; 3722 3723 Book.prototype.isProcessing = function isProcessing() { 3724 return this.sheetPhysics.getSize() !== 0; 3725 }; 3726 3727 Book.prototype.getPages = function getPages() { 3728 return 4 + 2 * this.p.sheets; 3729 }; 3730 3731 Book.prototype.setFlipProgressClb = function setFlipProgressClb(clb) { 3732 this.p.flipProgressClb = clb; 3733 }; 3734 3735 Book.prototype.setInjector = function setInjector(injector) { 3736 this.p.injector = injector; 3737 }; 3738 3739 Book.prototype.isActivePage = function isActivePage(n) { 3740 var res = true; 3741 if (n > 1 && n < this.getPages() - 2) { 3742 for (var _iterator = this.sheetBlocks, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 3743 var _ref; 3744 3745 if (_isArray) { 3746 if (_i >= _iterator.length) break; 3747 _ref = _iterator[_i++]; 3748 } else { 3749 _i = _iterator.next(); 3750 if (_i.done) break; 3751 _ref = _i.value; 3752 } 3753 3754 var b = _ref; 3755 3756 if (n - 2 > 2 * b.p.first && n - 2 < 2 * b.p.last - 1) { 3757 res = false; 3758 break; 3759 } 3760 } 3761 } 3762 return res; 3763 }; 3764 3765 Book.prototype.getBlockByPage = function getBlockByPage(n) { 3766 var block = void 0; 3767 if (n < 2) { 3768 block = this.leftCover; 3769 } else if (n < 2 * (this.p.sheets + 1)) { 3770 for (var _iterator2 = this.sheetBlocks, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 3771 var _ref2; 3772 3773 if (_isArray2) { 3774 if (_i2 >= _iterator2.length) break; 3775 _ref2 = _iterator2[_i2++]; 3776 } else { 3777 _i2 = _iterator2.next(); 3778 if (_i2.done) break; 3779 _ref2 = _i2.value; 3780 } 3781 3782 var b = _ref2; 3783 3784 if (n - 2 >= 2 * b.p.first && n - 2 < 2 * b.p.last) { 3785 block = b; 3786 break; 3787 } 3788 } 3789 } else { 3790 block = this.rightCover; 3791 } 3792 return block; 3793 }; 3794 3795 Book.prototype.getBlockPages = function getBlockPages(block) { 3796 var range = void 0; 3797 switch (block) { 3798 case this.leftCover: 3799 { 3800 range = [0, 1]; 3801 break; 3802 } 3803 case this.rightCover: 3804 { 3805 range = [2 * (this.p.sheets + 1), 2 * (this.p.sheets + 1) + 1]; 3806 break; 3807 } 3808 default: 3809 { 3810 range = block ? [2 * (block.p.first + 1), 2 * (block.p.last + 1) - 1] : undefined; 3811 } 3812 } 3813 return range; 3814 }; 3815 3816 Book.prototype.getPage = function getPage() { 3817 var PI = Math.PI; 3818 var p = void 0; 3819 if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { 3820 for (var _iterator3 = this.sheetBlocks, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 3821 var _ref3; 3822 3823 if (_isArray3) { 3824 if (_i3 >= _iterator3.length) break; 3825 _ref3 = _iterator3[_i3++]; 3826 } else { 3827 _i3 = _iterator3.next(); 3828 if (_i3.done) break; 3829 _ref3 = _i3.value; 3830 } 3831 3832 var block = _ref3; 3833 3834 if (block.angle <= PI / 2) { 3835 p = this.getBlockPages(block)[0] - 1; 3836 break; 3837 } 3838 } 3839 if (!p) { 3840 p = this.getPages() - 3; 3841 } 3842 } else if (this.angle < PI / 2) { 3843 p = 0; 3844 } else if (this.angle > 3 * PI / 2) { 3845 p = 1; 3846 } else if (this.angle < PI) { 3847 p = this.getPages() - 3; 3848 } else if (this.angle >= PI) { 3849 p = this.getPages() - 1; 3850 } 3851 return p; 3852 }; 3853 3854 Book.prototype.getTopPages = function getTopPages() { 3855 var p = this.getPage(); 3856 return p === 0 || p === this.getPages() - 1 ? [p] : [p, p + 1]; 3857 }; 3858 3859 Book.prototype.getPageState = function getPageState(n) { 3860 return this.pageManager.getPageState(n); 3861 }; 3862 3863 Book.prototype.enableLoadingAnimation = function enableLoadingAnimation(enable) { 3864 this.pageManager.enableLoadingAnimation(enable); 3865 }; 3866 3867 Book.prototype.getLeftFlipping = function getLeftFlipping() { 3868 var block = void 0; 3869 var left = this.sheetBlocks[0], 3870 PI = Math.PI; 3871 if (this.angle === PI) { 3872 block = this.rightCover; 3873 } else { 3874 if (left && left.state === 'closed' && left.angle > PI / 2) { 3875 block = left; 3876 } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { 3877 block = this.leftCover; 3878 } 3879 } 3880 return block; 3881 }; 3882 3883 Book.prototype.getRightFlipping = function getRightFlipping() { 3884 var block = void 0; 3885 var right = this.sheetBlocks[this.sheetBlocks.length - 1], 3886 PI = Math.PI; 3887 if (this.angle === 0) { 3888 block = this.leftCover; 3889 } else { 3890 if (right && right.state === 'closed' && right.angle <= PI / 2) { 3891 block = right; 3892 } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { 3893 block = this.rightCover; 3894 } 3895 } 3896 return block; 3897 }; 3898 3899 Book.prototype.getClosedBlockAngle = function getClosedBlockAngle(angle) { 3900 var closedAngle = void 0, 3901 PI = Math.PI; 3902 3903 if (this.leftCover.physicId) { 3904 var test = void 0;
3905 try { 3906 test = Math.abs(this.sheetPhysics.getParametr(this.leftCover.physicId, 'angle') - angle); 3907 } catch (e) { 3908 test = 0; 3909 } 3910 closedAngle = angle > PI / 2 || test > PI / 6 ? PI / 2 : this.closedAngle; 3911 } else if (this.rightCover.physicId) { 3912 var _test = void 0; 3913 try { 3914 _test = Math.abs(this.sheetPhysics.getParametr(this.rightCover.physicId, 'angle') - angle); 3915 } catch (e) { 3916 _test = 0; 3917 } 3918 closedAngle = angle < PI / 2 || _test > PI / 6 ? PI / 2 + 1e-7 : this.closedAngle; 3919 } else { 3920 closedAngle = PI / 2 + (angle !== 0) * 1e-7; 3921 } 3922 3923 return { 3924 openedAngle: angle, 3925 closedAngle: closedAngle, 3926 binderTurn: this.closedAngle 3927 }; 3928 }; 3929 3930 Book.prototype.flipLeft = function flipLeft() { 3931 var _this2 = this; 3932 3933 var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; 3934 var progressClb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.p.flipProgressClb; 3935 3936 var block = void 0, 3937 res = void 0; 3938 if (this.sheetPhysics.getSize() < 25) { 3939 var left = this.sheetBlocks[0], 3940 PI = Math.PI; 3941 if (this.angle === PI) { 3942 res = this.connectPhysics(block = this.rightCover, this.p.cover.mass, PI, -this.p.cover.startVelocity, this.p.cover.flexibility, 0, function (angle, height) { 3943 return _this2.set(3 * PI / 2 - angle / 2, height); 3944 }, function (angle, height) { 3945 _this2.set(3 * PI / 2 - angle / 2, 0); 3946 _this2.setSheetBlocks(angle ? PI : PI / 2 + 1e-7, 'closed'); 3947 }, progressClb); 3948 } else { 3949 if (left && left.state === 'closed' && left.angle > PI / 2) { 3950 block = size < left.getSize() ? this.splitSheetBlock(0, left.getSize() - size)[1] : left; 3951 res = this.connectPhysics(block, this.p.page.mass * block.getSize(), PI, -this.p.page.startVelocity, this.p.page.flexibility, 0, function (angle, height) { 3952 return block.set(_this2.getClosedBlockAngle(angle), 'opened', height); 3953 }, Book.finishAnimationClb.bind({ book: this, block: block }), progressClb); 3954 } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { 3955 res = this.connectPhysics(block = this.leftCover, this.p.cover.mass, PI, -this.p.cover.startVelocity, this.p.cover.flexibility, 0, function (angle, height) { 3956 _this2.set(2 * PI - angle / 2, height); 3957 if (angle > PI / 2) { 3958 _this2.setSheetBlocks(angle ? PI / 2 : 0, 'closed'); 3959 } 3960 }, function (angle, height) { 3961 return _this2.set(angle === 0 ? 0 : 2 * PI - angle / 2, 0); 3962 }, progressClb); 3963 } 3964 } 3965 } 3966 return res; 3967 }; 3968 3969 Book.prototype.flipRight = function flipRight() { 3970 var _this3 = this; 3971 3972 var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; 3973 var progressClb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.p.flipProgressClb; 3974 3975 var block = void 0, 3976 res = void 0; 3977 if (this.sheetPhysics.getSize() < 25) { 3978 var right = this.sheetBlocks[this.sheetBlocks.length - 1], 3979 PI = Math.PI; 3980 if (this.angle === 0) { 3981 res = this.connectPhysics(block = this.leftCover, this.p.cover.mass, 0, this.p.cover.startVelocity, this.p.cover.flexibility, 0, function (angle, height) { 3982 return _this3.set(angle / 2, height); 3983 }, function (angle, height) { 3984 _this3.set(angle / 2, 0); 3985 _this3.setSheetBlocks(angle ? PI / 2 : 0, 'closed'); 3986 }, progressClb); 3987 } else { 3988 if (right && right.state === 'closed' && right.angle <= PI / 2) { 3989 block = size < right.getSize() ? this.splitSheetBlock(this.sheetBlocks.length - 1, size)[0] : right; 3990 res = this.connectPhysics(block, this.p.page.mass * block.getSize(), 0, this.p.page.startVelocity, this.p.page.flexibility, 0, function (angle, height) { 3991 return block.set(_this3.getClosedBlockAngle(angle), 'opened', height); 3992 }, Book.finishAnimationClb.bind({ book: this, block: block }), progressClb); 3993 } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { 3994 res = this.connectPhysics(block = this.rightCover, this.p.cover.mass, 0, this.p.cover.startVelocity, this.p.cover.flexibility, 0, function (angle, height) { 3995 _this3.set(PI / 2 + angle / 2, height); 3996 if (angle < PI / 2) { 3997 _this3.setSheetBlocks(PI / 2 + 1e-7, 'closed'); 3998 } 3999 }, function (angle, height) { 4000 return _this3.set(PI / 2 + angle / 2, 0); 4001 }, progressClb); 4002 } 4003 } 4004 } 4005 return res; 4006 }; 4007 4008 // } 4009 4010 Book.prototype.clearHoverInfo = function clearHoverInfo() { 4011 this.pageManager.turnOnEvents(); 4012 delete this.hoverInfo.block.force; 4013 delete this.hoverInfo.block.cornerForce; 4014 delete this.hoverInfo; 4015 }; 4016 4017 Book.prototype.xSegment = function xSegment() { 4018 var boxs = this.tmp.boxs, 4019 res = {}; 4020 if (this.leftCover.physicId) { 4021 boxs[0].setFromObject(this.rightCover.three); 4022 res.min = -(res.max = boxs[0].max.x); 4023 } else if (this.rightCover.physicId) { 4024 boxs[0].setFromObject(this.leftCover.three); 4025 res.max = -(res.min = boxs[0].min.x); 4026 } else { 4027 boxs[0].setFromObject(this.leftCover.three); 4028 boxs[1].setFromObject(this.rightCover.three); 4029 boxs[0].union(boxs[1]); 4030 res.min = boxs[0].min.x; 4031 res.max = boxs[0].max.x; 4032 } 4033 return res; 4034 }; 4035 4036 Book.prototype.computeTarget = function computeTarget(point) { 4037 var x = point.x, 4038 y = point.y, 4039 seg = this.xSegment(), 4040 angle = void 0; 4041 4042 angle = (seg.max - x) / (seg.max - seg.min) * Math.PI; 4043 // angle = Math.acos(x/Math.sqrt(x*x+y*y)); 4044 return Math.max(this.dragAngle, Math.min(Math.PI - this.dragAngle, angle)); 4045 }; 4046 4047 Book.prototype.onPickCallback = function onPickCallback(object) { 4048 var res = false; 4049 var block = object.object.userData.self, 4050 p = _extends({}, object.uv), 4051 i = object.face.materialIndex; 4052 if (i < 2) { 4053 p.x = i === 0 ? p.x : 1 - p.x; 4054 if (block.cornerTarget.testIntersection(null, p) && block.physicId) { 4055 if (this.hoverInfo) { 4056 this.clearHoverInfo(); 4057 } 4058 block.force = _SheetPhysics2.default.dragForceClb; 4059 block.cornerForce = _SheetPhysics2.default.getDragCornerForceClb(this.computeTarget(object.point)); 4060 this.dragInfo = { 4061 object: object, 4062 block: block 4063 }; 4064 res = true; 4065 this.pageManager.turnOffEvents(); 4066 } 4067 } 4068 return res; 4069 }; 4070
4071 Book.prototype.onDragCallback = function onDragCallback(point) { 4072 var block = this.dragInfo.block, 4073 p = block.getProps(); 4074 block.force = _SheetPhysics2.default.dragForceClb; 4075 block.cornerForce = _SheetPhysics2.default.getDragCornerForceClb(this.computeTarget(point)); 4076 return true; 4077 }; 4078 4079 Book.prototype.onReleaseCallback = function onReleaseCallback() { 4080 delete this.dragInfo.block.force; 4081 delete this.dragInfo.block.cornerForce; 4082 delete this.dragInfo; 4083 this.pageManager.turnOnEvents(); 4084 }; 4085 4086 Book.prototype.getFlipping = function getFlipping(i) { 4087 return i ? this.getLeftFlipping() : this.getRightFlipping(); 4088 }; 4089 4090 Book.prototype.flip = function flip(i) { 4091 var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 4092 4093 return i ? this.flipLeft(size) : this.flipRight(size); 4094 }; 4095 4096 Book.prototype.enableMouse = function enableMouse(enable) { 4097 this.mouseController = enable; 4098 }; 4099 4100 Book.prototype.cornerCallback = function cornerCallback(e, data) { 4101 var _this4 = this; 4102 4103 if (this.mouseController) { 4104 var _data$data = data.data, 4105 i = _data$data.i, 4106 n = _data$data.n; 4107 4108 if (e.type === 'mouseover') { 4109 if (this.hoverInfo && this.hoverInfo.pendings !== undefined) { 4110 ++this.hoverInfo.pendings; 4111 } else { 4112 if (this.hoverInfo) { 4113 console.warn('Wrong state: element is already hover'); 4114 if (this.hoverInfo.n !== n) { 4115 this.clearHoverInfo(); 4116 } 4117 } 4118 if (!this.hoverInfo && !this.dragInfo) { 4119 var res = Promise.resolve(undefined); 4120 var hoverAngle = 0.02, 4121 hover = this.getBlockByPage(n), 4122 possible = this.getFlipping(i); 4123 if (n > 1 && n < 2 * (this.p.sheets + 1) && hover.physicId && (hover.angle < hoverAngle || hover.angle > Math.PI - hoverAngle)) { 4124 res = Promise.resolve(hover); 4125 } else if (hover === possible) { 4126 var sheetBlocks = [this.leftCover].concat(this.sheetBlocks, [this.rightCover]); 4127 var j = sheetBlocks.indexOf(hover), 4128 nextBlock = ~j ? sheetBlocks[j + 2 * i - 1] : undefined; 4129 if (!nextBlock || !nextBlock.physicId || nextBlock.angle > hoverAngle && nextBlock.angle < Math.PI - hoverAngle) { 4130 res = this.flip(i, 1).then(function (block) { 4131 if (!block) { 4132 delete _this4.hoverInfo; 4133 } else { 4134 _this4.sheetPhysics.setParametr(block.physicId, 'velocity', 0); 4135 } 4136 return block; 4137 }); 4138 this.hoverInfo = { 4139 pendings: 1 4140 }; 4141 } 4142 } 4143 res.then(function (block) { 4144 if (_this4.hoverInfo && _this4.hoverInfo.pendings < 1) { 4145 block = undefined; 4146 delete _this4.hoverInfo; 4147 } 4148 if (block) { 4149 _this4.pageManager.turnOffEvents(); 4150 var p = block.getProps(); 4151 block.force = _this4.sheetPhysics.getTargetForceClb(p.mass * block.getSize(), i ? Math.PI - hoverAngle : hoverAngle); 4152 block.cornerForce = function () { 4153 return (i ? -1 : 1) * _SheetPhysics2.default.hoverCornerForceClb(); 4154 }; 4155 _this4.sheetPhysics.setParametr(block.physicId, 'angle', i ? Math.PI - 0.5 * hoverAngle : 0.5 * hoverAngle); 4156 _this4.hoverInfo = { 4157 n: n, 4158 block: block 4159 }; 4160 _this4.update(1 / 30); 4161 } 4162 }); 4163 } 4164 } 4165 } else if (this.hoverInfo && e.type === 'mouseout') { 4166 if (this.hoverInfo.pendings !== undefined) { 4167 --this.hoverInfo.pendings; 4168 } else if (n === this.hoverInfo.n) { 4169 this.clearHoverInfo(); 4170 } 4171 } else if (e.type === 'mousedown') { 4172 this.cornerClickData = { 4173 x: e.pageX, 4174 y: e.pageY 4175 }; 4176 } else if (e.type === 'click') { 4177 if (Math.sqrt(Math.pow(this.cornerClickData.x - e.pageX, 2) + Math.pow(this.cornerClickData.y - e.pageY, 2)) < 5) { 4178 var _hover = this.getBlockByPage(n); 4179 if (_hover.physicId) { 4180 var id = _hover.physicId, 4181 props = _hover.getProps(); 4182 this.sheetPhysics.setParametr(id, 'velocity', (i ? -1 : 1) * props.startVelocity); 4183 } 4184 } 4185 delete this.cornerClickData; 4186 } 4187 } 4188 }; 4189 4190 Book.prototype.addSheetBlock = function addSheetBlock(p, block) { 4191 this.sheetBlocks.splice(p, 0, block); 4192 this.subscribeSheetBlock(block, 2); 4193 this.threeSheetBlocks.add(block.three); 4194 }; 4195 4196 Book.prototype.subscribeSheetBlock = function subscribeSheetBlock(block, offset) { 4197 var _this5 = this; 4198 4199 var eventConverter = new _CustomEventConverter2.default(this.visual.wnd, this.visual.doc, _CircleTarget2.default.test), 4200 r = 0.15,
4201 target = new _CircleTarget2.default(1 - 0.5 * r, 0.5 * r, r); 4202 target.block = block; 4203 target.callback = this.cornerCallback.bind(this); 4204 eventConverter.addCustom(target); 4205 block.cornerTarget = target; 4206 block.three.userData.mouseCallback = function (e, data) { 4207 var i = data.face.materialIndex; 4208 if (i < 2) { 4209 var n = i === 0 ? offset + 2 * block.p.first : offset + 2 * block.p.last - 1; 4210 eventConverter.convert(e, { x: i === 0 ? data.uv.x : 1 - data.uv.x, y: data.uv.y, i: i, n: n }); 4211 _this5.pageManager.transferEventToTexture(n, e, data); 4212 } 4213 }; 4214 block.three.userData.touchCallback = function (e, data) { 4215 var i = data.face.materialIndex; 4216 if (i < 2) { 4217 var n = i === 0 ? offset + 2 * block.p.first : offset + 2 * block.p.last - 1; 4218 _this5.pageManager.transferEventToTexture(n, e, data); 4219 } 4220 }; 4221 this.visual.drag.addThree(block.three); 4222 this.visual.mouseEvents.addThree(block.three); 4223 this.visual.touchEvents.addThree(block.three); 4224 }; 4225 4226 Book.prototype.removeSheetBlock = function removeSheetBlock(block) { 4227 this.visual.mouseEvents.removeThree(block.three); 4228 this.visual.touchEvents.removeThree(block.three); 4229 this.visual.drag.removeThree(block.three); 4230 this.threeSheetBlocks.remove(block.three); 4231 block.dispose(); 4232 }; 4233 4234 Book.prototype.removeSheetBlocks = function removeSheetBlocks(first, size) { 4235 var blocks = this.sheetBlocks.splice(first, size); 4236 for (var _iterator4 = blocks, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 4237 var _ref4; 4238 4239 if (_isArray4) { 4240 if (_i4 >= _iterator4.length) break; 4241 _ref4 = _iterator4[_i4++]; 4242 } else { 4243 _i4 = _iterator4.next(); 4244 if (_i4.done) break; 4245 _ref4 = _i4.value; 4246 } 4247 4248 var block = _ref4; 4249 4250 this.removeSheetBlock(block); 4251 } 4252 }; 4253 4254 Book.prototype.setTexture = function setTexture(material, n) { 4255 this.pageManager.setTexture(material, n); 4256 }; 4257 4258 Book.prototype.setPageTexture = function setPageTexture(material, n) { 4259 this.setTexture(material, n + 2); 4260 }; 4261 4262 Book.prototype.setLeftCoverTexture = function setLeftCoverTexture(material, n) { 4263 this.setTexture(material, n); 4264 }; 4265 4266 Book.prototype.setRightCoverTexture = function setRightCoverTexture(material, n) { 4267 this.setTexture(material, n + 2 * (this.p.sheets + 1)); 4268 }; 4269 4270 Book.finishAnimationClb = function finishAnimationClb(angle) { 4271 this.block.set(this.book.getClosedBlockAngle(angle).closedAngle, 'closed', 0); 4272 var i = this.book.sheetBlocks.indexOf(this.block); 4273 if (~i) { 4274 if (angle === 0) { 4275 this.book.mergeSheetBlocks(i, this.book.sheetBlocks.length - i); 4276 } else { 4277 this.book.mergeSheetBlocks(0, i + 1); 4278 } 4279 } 4280 }; 4281 4282 Book.prototype.calcBlockForce = function calcBlockForce(block, object, angle, velocity, cornerHeight) { 4283 return block.force ? block.force(object, angle, velocity, cornerHeight) : 0; 4284 }; 4285 4286 Book.prototype.calcBlockCornerForce = function calcBlockCornerForce(block, object, angle, velocity, cornerHeight) { 4287 return block.cornerForce ? block.cornerForce(object, angle, velocity, cornerHeight) : 0; 4288 }; 4289 4290 Book.prototype.notifyBeforeAnimation = function notifyBeforeAnimation() { 4291 var res = void 0; 4292 if (this.animationNotification) { 4293 res = Promise.reject(); 4294 } else { 4295 this.animationNotification = true; 4296 this.dispatchEvent({ 4297 type: 'beforeAnimation' 4298 }); 4299 res = this.layerManager.hide(); 4300 } 4301 return res; 4302 }; 4303 4304 Book.prototype.notifyAfterAnimation = function notifyAfterAnimation() { 4305 if (this.animationNotification) { 4306 delete this.animationNotification; 4307 this.layerManager.show(); 4308 this.dispatchEvent({ 4309 type: 'afterAnimation' 4310 }); 4311 } 4312 }; 4313 4314 Book.prototype.connectPhysics = function connectPhysics(block, mass, angle, velocity, flexibility, coverHeight, simulateClb, removeClb, progressClb) { 4315 var _this6 = this; 4316 4317 var type = function type() { 4318 return _this6.hoverInfo ? 'hover' : _this6.dragInfo ? 'drag' : 'free'; 4319 }, 4320 res = this.sheetPhysics.getSize() ? Promise.resolve() : this.notifyBeforeAnimation(); 4321 return res.then(function () { 4322 block.physicId = _this6.sheetPhysics.addObject(mass, angle, velocity, flexibility, coverHeight, function (angl, ch) { 4323 simulateClb(angl, ch); 4324 progressClb(block, Math.abs(angle - angl) / Math.PI, 'process', type()); 4325 }, function (angl, ch) { 4326 removeClb(angl, ch); 4327 delete block.physicId; 4328 progressClb(block, Math.abs(angle - angl) / Math.PI, 'finish', type()); 4329 Promise.resolve().then(function () { 4330 if (!_this6.sheetPhysics.getSize()) { 4331 _this6.notifyAfterAnimation(); 4332 } 4333 }); 4334 }, function (object, angle, velocity, cornerHeight) { 4335 return _this6.calcBlockForce(block, object, angle, velocity, cornerHeight); 4336 }, function (object, angle, velocity, cornerHeight) { 4337 return _this6.calcBlockCornerForce(block, object, angle, velocity, cornerHeight); 4338 });
4339 progressClb(block, 0, 'init', type()); 4340 return block; 4341 }).catch(function () { 4342 return undefined; 4343 }); 4344 }; 4345 4346 Book.prototype.update = function update(dt) { 4347 var _this7 = this; 4348 4349 this.lastMousePos.t += dt; 4350 if (this.isProcessing() && this.lastMousePos.pageX !== undefined && this.lastMousePos.t - (this.lastMousePos.lastT || 0) > 0.25 && !this.hoverInfo && !this.dragInfo) { 4351 this.lastMousePos.lastT = this.lastMousePos.t; 4352 Promise.resolve().then(function () { 4353 (0, _libs.$)(_this7.visual.element).trigger(_libs.$.Event('mousemove', _this7.lastMousePos)); 4354 }); 4355 } 4356 this.sheetPhysics.simulate(dt); 4357 }; 4358 4359 Book.prototype.splitSheetBlock = function splitSheetBlock(i, leftSize) { 4360 var block = this.sheetBlocks[i]; 4361 if (block && leftSize < block.getSize()) { 4362 var newBlock = new _SheetBlock2.default(this.visual, _extends({}, this.p, { setTexture: this.setPageTexture.bind(this) }), block.p.first, block.p.first + leftSize, block.angle, block.state); 4363 block.set(block.angle, block.state, block.corner.height, block.p.first + leftSize, block.p.last); 4364 this.addSheetBlock(i, newBlock); 4365 return [newBlock, block]; 4366 } 4367 }; 4368 4369 Book.prototype.mergeSheetBlocks = function mergeSheetBlocks(first, size) { 4370 if (first < this.sheetBlocks.length) { 4371 size = Math.min(this.sheetBlocks.length - first, size); 4372 var firstBlock = this.sheetBlocks[first], 4373 lastBlock = this.sheetBlocks[first + size - 1]; 4374 firstBlock.set(firstBlock.angle, firstBlock.state, firstBlock.corner.height, firstBlock.p.first, lastBlock.p.last); 4375 this.removeSheetBlocks(first + 1, size - 1); 4376 } 4377 }; 4378 4379 Book.prototype.setSheetBlocks = function setSheetBlocks(angle, state) { 4380 if (state === 'closed') { 4381 this.closedAngle = angle; 4382 } 4383 this.sheetBlocks.forEach(function (s) { 4384 if (!s.physicId) { 4385 s.set(angle, state); 4386 } 4387 }); 4388 }; 4389 4390 Book.prototype.set = function set(angle) { 4391 var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; 4392 4393 this.angle = angle; 4394 var PI = Math.PI; 4395 if (angle < PI / 4) { 4396 this.binder.set(0); 4397 4398 this.binder.setLeft(-PI / 2 + 2 * angle); 4399 this.leftCover.set(PI / 2, 'opened', height); 4400 4401 this.setSheetBlocks(0, 'closed'); 4402 4403 this.binder.setRight(0); 4404 this.rightCover.set(0, 'closed', 0); 4405 } else if (angle < 2 * PI / 4) { 4406 var a = 2 * (angle - PI / 4); 4407 this.binder.set(a); 4408 4409 this.binder.setLeft(-a); 4410 this.leftCover.set(PI / 2 + a, 'opened', height); 4411 4412 this.setSheetBlocks(a, 'closed'); 4413 4414 this.binder.setRight(-a); 4415 this.rightCover.set(a, 'closed', 0); 4416 } else if (angle < 3 * PI / 4) { 4417 var _a = 2 * (angle - PI / 2); 4418 this.binder.set(PI / 2); 4419 4420 this.binder.setLeft(-PI / 2); 4421 this.leftCover.set(PI, 'opened', 0); 4422 4423 this.binder.setRight(-PI / 2); 4424 this.rightCover.set(_a, 'opened', height); 4425 } else if (angle < 4 * PI / 4) { 4426 var _a2 = 2 * (angle - 3 * PI / 4) + PI / 2; 4427 this.binder.set(_a2); 4428 4429 this.binder.setLeft(-_a2); 4430 this.leftCover.set(_a2, 'closed', 0); 4431 4432 this.setSheetBlocks(_a2, 'closed'); 4433 4434 this.binder.setRight(-PI / 2); 4435 this.rightCover.set(PI / 2, 'opened', height); 4436 } else if (angle < 5 * PI / 4) { 4437 this.binder.set(PI); 4438 4439 this.binder.setLeft(-PI); 4440 this.leftCover.set(PI, 'closed', 0); 4441 4442 this.setSheetBlocks(PI, 'closed'); 4443 4444 this.binder.setRight(-PI / 2 - 2 * (angle - PI)); 4445 this.rightCover.set(PI / 2, 'opened', height); 4446 } else if (angle < 6 * PI / 4) { 4447 var _a3 = 2 * (angle - 5 * PI / 4); 4448 this.binder.set(PI - _a3); 4449 4450 this.binder.setLeft(-PI + _a3); 4451 this.leftCover.set(PI - _a3, 'closed', 0); 4452 4453 this.setSheetBlocks(PI - _a3, 'closed'); 4454 4455 this.binder.setRight(-PI + _a3); 4456 this.rightCover.set(PI / 2 - _a3, 'opened', height); 4457 } else if (angle < 7 * PI / 4) { 4458 var _a4 = 2 * (angle - 6 * PI / 4); 4459 this.binder.set(PI / 2); 4460 4461 this.binder.setLeft(-PI / 2); 4462 this.leftCover.set(PI - _a4, 'opened', height); 4463 4464 this.binder.setRight(-PI / 2); 4465 this.rightCover.set(0, 'opened', 0); 4466 } else if (angle < 8 * PI / 4) { 4467 var _a5 = 2 * (angle - 7 * PI / 4); 4468 this.binder.set(PI / 2 - _a5); 4469 4470 this.binder.setLeft(-PI / 2); 4471 this.leftCover.set(PI / 2, 'opened', height); 4472 4473 this.setSheetBlocks(PI / 2 - _a5, 'closed'); 4474 4475 this.binder.setRight(-PI / 2 + _a5); 4476 this.rightCover.set(PI / 2 - _a5, 'closed', 0); 4477 } 4478 }; 4479 4480 Book.createSideTexture = function createSideTexture(color) {
4481 var jC = (0, _libs.$)('<canvas width="8" height="8"></canvas>'); 4482 var ctx = jC[0].getContext('2d'); 4483 ctx.beginPath(); 4484 ctx.fillStyle = _GraphUtils2.default.color2Rgba(color, 1); 4485 ctx.rect(0, 0, 8, 7); 4486 ctx.fill(); 4487 ctx.beginPath(); 4488 ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(color, 0.5), 1); 4489 ctx.rect(0, 7, 8, 1); 4490 ctx.fill(); 4491 return jC[0]; 4492 }; 4493 4494 Book.prepareProps = function prepareProps(props) { 4495 return Book.calcProps(Book.mergeProps((0, _book.props)(), props)); 4496 }; 4497 4498 Book.mergeProps = function mergeProps(first, second) { 4499 second = second || {}; 4500 return _extends({}, first, second, { 4501 sheet: _extends({}, first.sheet, second.sheet), 4502 cover: _extends({}, first.cover, second.cover), 4503 page: _extends({}, first.page, second.page), 4504 cssLayerProps: _extends({}, first.cssLayerProps, second.cssLayerProps) 4505 }); 4506 }; 4507 4508 Book.calcProps = function calcProps(props) { 4509 var p = _extends({}, props, { 4510 sheet: _extends({}, props.sheet), 4511 cover: _extends({}, props.sheet, props.cover), 4512 page: _extends({}, props.sheet, props.page), 4513 cssLayerProps: _extends({}, props.cssLayerProps, { 4514 $: _libs.$ 4515 }) 4516 }), 4517 scale = 50, 4518 height = scale * p.height, 4519 width = scale * p.width, 4520 flipProgressClb = function flipProgressClb() { 4521 return undefined; 4522 }, 4523 sheet = { 4524 sideTexture: p.sheet.sideTexture || Book.createSideTexture(p.sheet.color) 4525 }, 4526 cover = _extends({}, sheet, p.cover, { 4527 depth: scale * p.cover.depth, 4528 width: width, 4529 height: height, 4530 padding: scale * p.cover.padding 4531 }), 4532 page = _extends({}, sheet, p.page, { 4533 depth: scale * p.page.depth, 4534 width: cover.width - cover.padding, 4535 height: cover.height - 2 * cover.padding 4536 }), 4537 marker = { 4538 use: false, 4539 color: 0XFF0000, 4540 size: scale * 0.001 4541 }; 4542 if (cover.color !== sheet.color && !p.cover.sideTexture) { 4543 cover.sideTexture = Book.createSideTexture(cover.color); 4544 } 4545 if (page.color !== sheet.color && !p.page.sideTexture) { 4546 page.sideTexture = Book.createSideTexture(page.color); 4547 } 4548 return _extends({}, p, { scale: scale, height: height, width: width, flipProgressClb: flipProgressClb, cover: cover, page: page, marker: marker }); 4549 }; 4550 4551 return Book; 4552}(_libs.THREE.EventDispatcher); 4553 4554exports.default = Book; 4555 4556/***/ }), 4557/* 27 */ 4558/***/ (function(module, exports, __webpack_require__) { 4559 4560"use strict"; 4561 4562 4563exports.__esModule = true; 4564 4565var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 4566 4567var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 4568 4569var _libs = __webpack_require__(1); 4570 4571var _Controller2 = __webpack_require__(15); 4572 4573var _Controller3 = _interopRequireDefault(_Controller2); 4574 4575var _bookController = __webpack_require__(42); 4576 4577var _EventsToActions = __webpack_require__(49); 4578 4579var _EventsToActions2 = _interopRequireDefault(_EventsToActions); 4580 4581var _stats = __webpack_require__(71); 4582 4583var _stats2 = _interopRequireDefault(_stats); 4584 4585var _Object3DWatcher = __webpack_require__(55); 4586 4587var _Object3DWatcher2 = _interopRequireDefault(_Object3DWatcher); 4588 4589var _FullScreen = __webpack_require__(50); 4590 4591var _FullScreen2 = _interopRequireDefault(_FullScreen); 4592 4593function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 4594 4595function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 4596 4597function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 4598 4599function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
4599onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 4600 4601var BookController = function (_Controller) { 4602 _inherits(BookController, _Controller); 4603 4604 function BookController(book, view, props) { 4605 _classCallCheck(this, BookController); 4606 4607 var _this = _possibleConstructorReturn(this, _Controller.call(this)); 4608 4609 _this.navigationControls = true; 4610 _this.book = book; 4611 _this.visual = book.visual; 4612 _this.p = BookController.prepareProps(props); 4613 _this.p.rtl = book.p.rtl; 4614 _this.devicePixelRatio = _this.visual.wnd.devicePixelRatio || 1; 4615 4616 _this.orbit = book.visual.getOrbit(); 4617 book.setFlipProgressClb(_this.updateViewIfState.bind(_this)); 4618 _this.view = view; 4619 _this.bindActions(); 4620 4621 _this.state = { 4622 smartPan: !_this.actions['cmdSmartPan'].active, 4623 singlePage: _this.actions['cmdSinglePage'].active || _this.actions['cmdSinglePage'].activeForMobile && _this.devicePixelRatio > 1, 4624 stats: _this.actions['cmdStats'].active, 4625 lighting: _this.p.lighting.default, 4626 activeSide: 1 4627 }; 4628 4629 _this.boxs = [new _libs.THREE.Box3(), new _libs.THREE.Box3()]; 4630 _this.bookWatcher = new _Object3DWatcher2.default(_this.visual, function () { 4631 if (_this.state.singlePage) { 4632 if (_this.state.activeSide) { 4633 _this.boxs[0].setFromObject(book.rightCover.three); 4634 } else { 4635 _this.boxs[0].setFromObject(book.leftCover.three); 4636 } 4637 } else { 4638 _this.boxs[0].setFromObject(book.leftCover.three); 4639 _this.boxs[1].setFromObject(book.rightCover.three); 4640 _this.boxs[0].union(_this.boxs[1]); 4641 } 4642 return _this.boxs[0]; 4643 }); 4644 _this.bookWatcher.scale = _this.p.scale.default; 4645 _this.book.setZoom(_this.bookWatcher.scale, _this.state.singlePage); 4646 4647 _this.Stats = new _stats2.default(); 4648 _this.Stats.domElement.style.position = 'absolute'; 4649 _this.Stats.domElement.style.top = '0px'; 4650 4651 _this.visual.setExtraLighting(_this.state.lighting); 4652 _this.binds = { 4653 onScreenModeChanged: _this.onScreenModeChanged.bind(_this), 4654 stats: _this.Stats.update.bind(_this.Stats), 4655 onUpdateView: _this.updateView.bind(_this) 4656 }; 4657 _FullScreen2.default.addEventListener(_this.view.getParentContainer().ownerDocument, _this.binds.onScreenModeChanged); 4658 4659 _this.cmdSmartPan(); 4660 4661 if (_this.view.templateObject.appLoaded) { 4662 Promise.resolve().then(_this.view.templateObject.appLoaded); 4663 } 4664 4665 _this.book.enableLoadingAnimation(_this.p.loadingAnimation.book); 4666 if (_this.p.loadingAnimation.skin) { 4667 _this.initLoadingAnimation(); 4668 } 4669 4670 _this.book.enableLoadingAnimation(_this.p.loadingAnimation.book); 4671 _this.book.setAutoResolution(_this.p.autoResolution.enabled, _this.p.autoResolution.coefficient); 4672 4673 _this.visual.addEventListener('resize', _this.updateView.bind(_this)); 4674 return _this; 4675 } 4676 4677 BookController.prototype.dispose = function dispose() { 4678 _FullScreen2.default.removeEventListener(this.view.getParentContainer().ownerDocument, this.binds.onScreenModeChanged); 4679 delete this.book; 4680 delete this.view; 4681 delete this.visual; 4682 }; 4683 4684 BookController.prototype.initLoadingAnimation = function initLoadingAnimation() { 4685 var _this2 = this; 4686 4687 var handler = function handler() { 4688 var pages = _this2.book.getTopPages(); 4689 var visible = false; 4690 for (var _iterator = pages, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 4691 var _ref; 4692 4693 if (_isArray) { 4694 if (_i >= _iterator.length) break; 4695 _ref = _iterator[_i++]; 4696 } else { 4697 _i = _iterator.next(); 4698 if (_i.done) break; 4699 _ref = _i.value; 4700 } 4701 4702 var n = _ref; 4703 4704 var state = _this2.book.getPageState(n); 4705 visible = state === undefined || state === 'loading'; 4706 if (visible) { 4707 break; 4708 } 4709 } 4710 _this2.view.setState('widLoading', { 4711 visible: visible 4712 }); 4713 }; 4714 this.book.addEventListener('beforeAnimation', handler); 4715 this.book.addEventListener('afterAnimation', handler); 4716 this.book.addEventListener('loadPage', handler); 4717 this.book.addEventListener('loadedPage', handler); 4718 }; 4719 4720 BookController.prototype.enableNavigation = function enableNavigation(enable) { 4721 this.navigationControls = enable; 4722 }; 4723 4724 BookController.prototype.setTocCtrl = function setTocCtrl(tocCtrl) { 4725 this.tocCtrl = tocCtrl; 4726 this.tocCtrl.onChange = this.updateView.bind(this); 4727 this.updateView(); 4728 }; 4729 4730 BookController.prototype.setPrinter = function setPrinter(printer) { 4731 this.printer = printer; 4732 this.updateView(); 4733 }; 4734 4735 BookController.prototype.setSounds = function setSounds(sounds) { 4736 this.sounds = sounds; 4737 sounds.setEnabled(this.actions['cmdSounds'].active); 4738 this.updateView(); 4739 }; 4740
4741 BookController.prototype.onScreenModeChanged = function onScreenModeChanged(e) { 4742 this.updateView(); 4743 }; 4744 4745 BookController.prototype.canZoomIn = function canZoomIn() { 4746 return !this.state.smartPan || Math.abs(this.bookWatcher.scale - this.p.scale.max) > this.p.eps; 4747 }; 4748 4749 BookController.prototype.canZoomOut = function canZoomOut() { 4750 return !this.state.smartPan || Math.abs(this.bookWatcher.scale - this.p.scale.min) > this.p.eps; 4751 }; 4752 4753 BookController.prototype.canDefaultZoom = function canDefaultZoom() { 4754 return this.state.smartPan; 4755 }; 4756 4757 BookController.prototype.setBookZoom = function setBookZoom(scale) { 4758 var _this3 = this; 4759 4760 setTimeout(function () { 4761 if (_this3.bookWatcher.scale === scale) { 4762 _this3.book.setZoom(scale, _this3.state.singlePage); 4763 } 4764 }, 1000); 4765 }; 4766 4767 BookController.prototype.cmdZoomIn = function cmdZoomIn() { 4768 if (this.state.smartPan) { 4769 this.bookWatcher.scale = Math.min(this.p.scale.max, this.bookWatcher.scale + this.p.scale.delta); 4770 this.setBookZoom(this.bookWatcher.scale); 4771 } else { 4772 this.orbit.zoomIn(6.6 * this.p.scale.delta / 0.32); 4773 } 4774 this.updateView(); 4775 }; 4776 4777 BookController.prototype.cmdZoomOut = function cmdZoomOut() { 4778 if (this.state.smartPan) { 4779 this.bookWatcher.scale = Math.max(this.p.scale.min, this.bookWatcher.scale - this.p.scale.delta); 4780 this.setBookZoom(this.bookWatcher.scale); 4781 } else { 4782 this.orbit.zoomOut(6.6 * this.p.scale.delta / 0.32); 4783 } 4784 this.updateView(); 4785 }; 4786 4787 BookController.prototype.cmdDefaultZoom = function cmdDefaultZoom() { 4788 if (this.state.smartPan) { 4789 this.bookWatcher.scale = this.p.scale.default; 4790 this.setBookZoom(this.bookWatcher.scale); 4791 this.updateView(); 4792 } 4793 }; 4794 4795 BookController.prototype.cmdToc = function cmdToc() { 4796 if (this.tocCtrl) { 4797 this.tocCtrl.togle(); 4798 } 4799 }; 4800 4801 BookController.prototype.cmdFastBackward = function cmdFastBackward() { 4802 this.startFlip(this.book.flipLeft(5)); 4803 }; 4804 4805 BookController.prototype.cmdBackward = function cmdBackward() { 4806 var _this4 = this; 4807 4808 if (this.state.singlePage) { 4809 this.state.activeSide = (this.getPage() + 1) % 2; 4810 if (this.state.activeSide) { 4811 this.state.activeSide = 0; 4812 this.updateView(); 4813 } else { 4814 this.startFlip(this.book.flipLeft(1)).then(function (block) { 4815 if (block) { 4816 _this4.state.activeSide = 1; 4817 } 4818 }); 4819 } 4820 } else { 4821 this.startFlip(this.book.flipLeft(1)); 4822 } 4823 }; 4824 4825 BookController.prototype.cmdBigBackward = function cmdBigBackward() { 4826 this.cmdBackward(); 4827 }; 4828 4829 BookController.prototype.cmdForward = function cmdForward() { 4830 var _this5 = this; 4831 4832 if (this.state.singlePage) { 4833 this.state.activeSide = (this.getPage() + 1) % 2; 4834 if (!this.state.activeSide) { 4835 this.state.activeSide = 1; 4836 this.updateView(); 4837 } else { 4838 this.startFlip(this.book.flipRight(1)).then(function (block) { 4839 if (block) { 4840 _this5.state.activeSide = 0; 4841 } 4842 }); 4843 } 4844 } else { 4845 this.startFlip(this.book.flipRight(1)); 4846 } 4847 }; 4848 4849 BookController.prototype.cmdBigForward = function cmdBigForward() { 4850 this.cmdForward(); 4851 }; 4852 4853 BookController.prototype.cmdFastForward = function cmdFastForward() { 4854 this.startFlip(this.book.flipRight(5)); 4855 }; 4856 4857 BookController.prototype.cmdSave = function cmdSave() { 4858 window.open(this.p.downloadURL, '_blank'); 4859 }; 4860 4861 BookController.prototype.cmdPrint = function cmdPrint() { 4862 this.printer.print(); 4863 }; 4864 4865 BookController.prototype.cmdFullScreen = function cmdFullScreen() { 4866 if (!_FullScreen2.default.activated()) { 4867 _FullScreen2.default.request(this.view.getParentContainer()); 4868 } else { 4869 _FullScreen2.default.cancel(); 4870 } 4871 }; 4872 4873 BookController.prototype.cmdSmartPan = function cmdSmartPan() { 4874 this.state.smartPan = !this.state.smartPan; 4875 if (this.state.smartPan) { 4876 this.orbit.minAzimuthAngle = 0; 4877 this.orbit.maxAzimuthAngle = 0; 4878 this.orbit.minPolarAngle = 0; 4879 this.orbit.maxPolarAngle = Math.PI / 4; 4880 this.bookWatcher.enabled = true; 4881 } else { 4882 this.orbit.minAzimuthAngle = -Infinity; 4883 this.orbit.maxAzimuthAngle = Infinity; 4884 this.orbit.minPolarAngle = 0; 4885 this.orbit.maxPolarAngle = Math.PI; 4886 this.bookWatcher.enabled = false; 4887 } 4888 this.updateView(); 4889 }; 4890 4891 BookController.prototype.cmdSinglePage = function cmdSinglePage() { 4892 this.state.singlePage = !this.state.singlePage; 4893 this.setBookZoom(this.bookWatcher.scale); 4894 this.updateView(); 4895 }; 4896 4897 BookController.prototype.cmdSounds = function cmdSounds() { 4898 if (this.sounds) { 4899 this.sounds.togle(); 4900 } 4901 this.updateView(); 4902 }; 4903 4904 BookController.prototype.cmdStats = function cmdStats() { 4905 this.state.stats = !this.state.stats; 4906 if (this.state.stats) { 4907 (0, _libs.$)(this.view.getContainer()).append(this.Stats.domElement); 4908 this.visual.addRenderCallback(this.binds.stats); 4909 } else { 4910 (0, _libs.$)(this.view.getContainer()).find(this.Stats.domElement).remove(); 4911 this.visual.removeRenderCallback(this.binds.stats); 4912 } 4913 this.updateView(); 4914 }; 4915 4916 BookController.prototype.cmdLightingUp = function cmdLightingUp() { 4917 this.state.lighting = Math.min(this.state.lighting + this.p.lighting.delta, this.p.lighting.max); 4918 this.visual.setExtraLighting(this.state.lighting); 4919 this.updateView(); 4920 }; 4921 4922 BookController.prototype.cmdLightingDown = function cmdLightingDown() { 4923 this.state.lighting = Math.max(this.state.lighting - this.p.lighting.delta, this.p.lighting.min); 4924 this.visual.setExtraLighting(this.state.lighting); 4925 this.updateView(); 4926 }; 4927 4928 BookController.prototype.goToPage = function goToPage(page) { 4929 var _this6 = this; 4930 4931 if (this.p.rtl) { 4932 page = this.book.getPages() - 1 - page; 4933 } 4934 var pageNum = Math.max(Math.min(page, this.book.getPages() - 1), 0); 4935 this.state.activeSide = (pageNum + 1) % 2; 4936 var target = Math.max(Math.min(page - 1 + page % 2, this.book.getPages() - 1), 0), 4937 current = this.book.getPage(), 4938 flips = [], 4939 covs = 0;; 4940 if (target != current) { 4941 if (current === 0) { 4942 flips.push(1); 4943 current += 1; 4944 ++covs; 4945 } else if (current === this.book.getPages() - 1) { 4946 flips.push(-1); 4947 current -= 2; 4948 ++covs; 4949 } 4950 var cv = 0; 4951 if (target === 0) { 4952 cv = -1; 4953 target += 1; 4954 ++covs; 4955 } else if (target === this.book.getPages() - 1) { 4956 cv = 1; 4957 target -= 2; 4958 ++covs; 4959 } 4960 if (target - current) { 4961 flips.push(Math.ceil((target - current) / 2)); 4962 } 4963 if (cv) { 4964 flips.push(cv); 4965 } 4966 } 4967 4968 var setClb = function setClb(fl, time, clb) { 4969 setTimeout(function () { 4970 if (fl < 0) { 4971 _this6.startFlip(_this6.book.flipLeft(-fl, clb)); 4972 } else { 4973 _this6.startFlip(_this6.book.flipRight(fl, clb)); 4974 } 4975 }, time); 4976 }; 4977 4978 if (covs === 2) { 4979 setClb(flips[0], 0, function (block, progress, state) { 4980 if (state == 'finish' && progress == 1) { 4981 setClb(flips[flips.length - 1], 0); 4982 } 4983 }); 4984 setClb(flips[1], 500); 4985 } else { 4986 var time = 0; 4987 for (var _iterator2 = flips, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 4988 var _ref2; 4989 4990 if (_isArray2) { 4991 if (_i2 >= _iterator2.length) break; 4992 _ref2 = _iterator2[_i2++]; 4993 } else { 4994 _i2 = _iterator2.next(); 4995 if (_i2.done) break; 4996 _ref2 = _i2.value; 4997 } 4998 4999 var fl = _ref2; 5000 5001 setClb(fl, time); 5002 time += 400; 5003 } 5004 } 5005 }; 5006 5007 BookController.prototype.startFlip = function startFlip(flipRes) { 5008 var _this7 = this; 5009 5010 return flipRes ? flipRes.then(function (block) { 5011 if (block) { 5012 _this7.dispatchAsync({ 5013 type: 'startFlip' 5014 }); 5015 } 5016 return block; 5017 }) : Promise.resolve(undefined); 5018 }; 5019 5020 BookController.prototype.endFlip = function endFlip(block) { 5021 this.dispatchAsync({ 5022 type: 'endFlip' 5023 });
5024 return block; 5025 }; 5026 5027 BookController.prototype.getPage = function getPage() { 5028 var page = this.book.getPage(); 5029 return page ? Math.min(this.book.getPage() + this.state.activeSide, this.book.getPages() - 1) : 0; 5030 }; 5031 5032 BookController.prototype.getPageForGUI = function getPageForGUI() { 5033 var n = (this.state.singlePage ? this.getPage() : this.book.getPage()) + 1; 5034 if (this.p.rtl) { 5035 n = this.book.getPages() - n + 1; 5036 } 5037 return n; 5038 }; 5039 5040 BookController.prototype.inpPage = function inpPage(e, data) { 5041 this.goToPage(data - 1); 5042 }; 5043 5044 BookController.prototype.updateViewIfState = function updateViewIfState(block, progress, state, type) { 5045 if (state === 'init' || state === 'finish') { 5046 setTimeout(this.updateView.bind(this), 100); 5047 } 5048 if (state === 'finish') { 5049 this.endFlip(block); 5050 } 5051 }; 5052 5053 BookController.prototype.isCmdVisible = function isCmdVisible(name) { 5054 return (0, _libs.$)(this.visual.element).width() < this.p.narrowView.width ? this.actions[name].enabledInNarrow === undefined ? this.actions[name].enabled : this.actions[name].enabledInNarrow : this.actions[name].enabled; 5055 }; 5056 5057 BookController.prototype.updateViewState = function updateViewState() { 5058 this.viewState = { 5059 'cmdZoomIn': { 5060 enable: this.canZoomIn(), 5061 visible: this.isCmdVisible('cmdZoomIn'), 5062 active: false 5063 }, 5064 'cmdZoomOut': { 5065 enable: this.canZoomOut(), 5066 visible: this.isCmdVisible('cmdZoomOut'), 5067 active: false 5068 }, 5069 'cmdDefaultZoom': { 5070 enable: this.canDefaultZoom(), 5071 visible: this.isCmdVisible('cmdDefaultZoom'), 5072 active: this.canDefaultZoom() && Math.abs(this.bookWatcher.scale - this.p.scale.default) < this.p.eps 5073 }, 5074 'cmdToc': { 5075 enable: !!this.tocCtrl, 5076 visible: this.isCmdVisible('cmdToc') && this.tocCtrl, 5077 active: this.tocCtrl && this.tocCtrl.visible 5078 }, 5079 'inpPages': { 5080 visible: true, 5081 value: this.book.getPages() 5082 }, 5083 'inpPage': { 5084 visible: true, 5085 enable: !this.book.isProcessing() && this.navigationControls, 5086 value: this.getPageForGUI() 5087 }, 5088 'cmdSave': { 5089 enable: true, 5090 visible: this.isCmdVisible('cmdSave') && !!this.p.downloadURL, 5091 active: false 5092 }, 5093 'cmdPrint': { 5094 enable: true, 5095 visible: this.isCmdVisible('cmdPrint') && !!this.printer, 5096 active: false 5097 }, 5098 'cmdFullScreen': { 5099 enable: _FullScreen2.default.available(), 5100 visible: this.isCmdVisible('cmdFullScreen'), 5101 active: _FullScreen2.default.available() && _FullScreen2.default.activated() 5102 }, 5103 'widSettings': { 5104 enable: true, 5105 visible: this.isCmdVisible('widSettings'), 5106 active: false 5107 }, 5108 'cmdSmartPan': { 5109 enable: true, 5110 visible: this.isCmdVisible('cmdSmartPan'), 5111 active: this.state.smartPan 5112 }, 5113 'cmdSinglePage': { 5114 enable: true, 5115 visible: this.isCmdVisible('cmdSinglePage'), 5116 active: this.state.singlePage 5117 }, 5118 'cmdSounds': { 5119 enable: true, 5120 visible: this.isCmdVisible('cmdSounds') && !!this.sounds, 5121 active: !!this.sounds && this.sounds.enabled 5122 }, 5123 'cmdStats': { 5124 enable: true, 5125 visible: this.isCmdVisible('cmdStats'), 5126 active: this.state.stats 5127 }, 5128 'cmdLightingUp': { 5129 enable: Math.abs(this.state.lighting - this.p.lighting.max) > this.p.eps, 5130 visible: this.isCmdVisible('cmdLightingUp'), 5131 active: false 5132 }, 5133 'cmdLightingDown': { 5134 enable: Math.abs(this.state.lighting - this.p.lighting.min) > this.p.eps, 5135 visible: this.isCmdVisible('cmdLightingDown'), 5136 active: false 5137 } 5138 }; 5139 5140 var left = this.book.getLeftFlipping(), 5141 right = this.book.getRightFlipping(); 5142 var flippersEnable = { 5143 cmdFastBackward: !!left && this.navigationControls, 5144 cmdBackward: !!left && this.navigationControls, 5145 cmdBigBackward: !!left && this.navigationControls, 5146 cmdForward: !!right && this.navigationControls, 5147 cmdBigForward: !!right && this.navigationControls, 5148 cmdFastForward: !!right && this.navigationControls 5149 }; 5150 for (var _iterator3 = Object.keys(flippersEnable), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 5151 var _ref3; 5152 5153 if (_isArray3) { 5154 if (_i3 >= _iterator3.length) break; 5155 _ref3 = _iterator3[_i3++]; 5156 } else { 5157 _i3 = _iterator3.next(); 5158 if (_i3.done) break; 5159 _ref3 = _i3.value; 5160 } 5161 5162 var name = _ref3; 5163 5164 this.viewState[name] = { 5165 enable: flippersEnable[name], 5166 visible: this.isCmdVisible(name), 5167 active: false 5168 }; 5169 }; 5170 }; 5171 5172 BookController.prototype.updateView = function updateView() { 5173 if (this.view) { 5174 this.updateViewState(); 5175 for (var _iterator4 = Object.keys(this.viewState), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 5176 var _ref4; 5177 5178 if (_isArray4) { 5179 if (_i4 >= _iterator4.length) break; 5180 _ref4 = _iterator4[_i4++]; 5181 } else { 5182 _i4 = _iterator4.next(); 5183 if (_i4.done) break; 5184 _ref4 = _i4.value; 5185 } 5186 5187 var name = _ref4; 5188 5189 this.view.setState(name, this.viewState[name]); 5190 } 5191 } 5192 }; 5193 5194 BookController.prototype.getActions = function getActions() { 5195 var _this8 = this; 5196 5197 var isSwipping = function isSwipping(name) { 5198 return _this8.actions.touchCmdSwipe.enabled && _this8.actions.touchCmdSwipe.code === _this8.actions[name].code && _this8.state.smartPan && _this8.bookWatcher.scale <= 1; 5199 }, 5200 cmds = {}; 5201 5202 var _loop = function _loop(name) { 5203 if (name.indexOf('cmd') === 0) { 5204 cmds[name] = { 5205 activate: function activate() { 5206 if (_this8.viewState && _this8.viewState[name].enable) { 5207 _this8[name].apply(_this8, arguments); 5208 } 5209 } 5210 }; 5211 } 5212 }; 5213 5214 for (var name in this) { 5215 _loop(name); 5216 } 5217 5218 return _extends({}, cmds, { 5219 cmdPanLeft: { 5220 activate: function activate(e) { 5221 return _this8.orbit.actions.pan(e, { 5222 state: 'move', 5223 dx: -_this8.p.pan.speed, 5224 dy: 0 5225 }); 5226 } 5227 }, 5228 cmdPanRight: { 5229 activate: function activate(e) { 5230 return _this8.orbit.actions.pan(e, { 5231 state: 'move', 5232 dx: _this8.p.pan.speed, 5233 dy: 0 5234 }); 5235 } 5236 }, 5237 cmdPanUp: { 5238 activate: function activate(e) { 5239 return _this8.orbit.actions.pan(e, { 5240 state: 'move', 5241 dx: 0, 5242 dy: -_this8.p.pan.speed 5243 }); 5244 } 5245 }, 5246 cmdPanDown: { 5247 activate: function activate(e) { 5248 return _this8.orbit.actions.pan(e, { 5249 state: 'move', 5250 dx: 0, 5251 dy: _this8.p.pan.speed 5252 }); 5253 } 5254 }, 5255 mouseCmdRotate: { 5256 activate: this.orbit.actions.rotate 5257 }, 5258 mouseCmdDragZoom: { 5259 activate: function activate(e, data) { 5260 if (data.dy > 0) { 5261 _this8.cmdZoomOut(); 5262 } else if (data.dy < 0) { 5263 _this8.cmdZoomIn(); 5264 } 5265 } 5266 }, 5267 mouseCmdPan: { 5268 activate: this.orbit.actions.pan 5269 }, 5270 mouseCmdWheelZoom: { 5271 activate: function activate(e) { 5272 e.preventDefault(); 5273 if (e.deltaY < 0) { 5274 _this8.cmdZoomOut(); 5275 } else if (e.deltaY > 0) { 5276 _this8.cmdZoomIn(); 5277 } 5278 } 5279 }, 5280 touchCmdRotate: { 5281 activate: function activate(e, data) { 5282 if (!isSwipping('touchCmdRotate')) { 5283 e.preventDefault(); 5284 _this8.orbit.actions.rotate(e, data); 5285 } 5286 } 5287 }, 5288 touchCmdZoom: { 5289 activate: function activate(e, data) { 5290 if (!isSwipping('touchCmdZoom')) { 5291 e.preventDefault(); 5292 if (data.dy > 0) { 5293 _this8.cmdZoomOut(); 5294 } else if (data.dy < 0) { 5295 _this8.cmdZoomIn(); 5296 } 5297 } 5298 } 5299 }, 5300 touchCmdPan: { 5301 activate: function activate(e, data) { 5302 if (!isSwipping('touchCmdPan')) { 5303 e.preventDefault(); 5304 _this8.orbit.actions.pan(e, data); 5305 } 5306 } 5307 }, 5308 touchCmdSwipe: { 5309 activate: function activate(e, data) { 5310 if (isSwipping('touchCmdSwipe')) { 5311 e.preventDefault(); 5312 if (data.state === 'start') { 5313 var touch = (e.touches || e.originalEvent.touches)[_this8.actions.touchCmdSwipe.code - 1];
5314 _this8.swipeData = { 5315 handled: false, 5316 x0: touch.pageX, 5317 y0: touch.pageY, 5318 x: touch.pageX, 5319 y: touch.pageY 5320 }; 5321 } else if (data.state === 'move') { 5322 if (!_this8.swipeData.handled) { 5323 _this8.swipeData = _extends({}, _this8.swipeData, { 5324 x: _this8.swipeData.x + data.dx, 5325 y: _this8.swipeData.y + data.dy 5326 }); 5327 if (Math.abs(_this8.swipeData.x0 - _this8.swipeData.x) > 100) { 5328 _this8.swipeData.x0 > _this8.swipeData.x ? _this8.cmdForward() : _this8.cmdBackward(); 5329 _this8.swipeData.handled = true; 5330 } 5331 } 5332 } else { 5333 delete _this8.swipeData; 5334 } 5335 } 5336 } 5337 }, 5338 widSettings: { 5339 activate: function activate() { 5340 return undefined; 5341 } 5342 } 5343 }); 5344 }; 5345 5346 BookController.prototype.bindActions = function bindActions() { 5347 this.eToA = new _EventsToActions2.default((0, _libs.$)(this.visual.element)); 5348 this.eToA.addAction(function (e) { 5349 return e.preventDefault(); 5350 }, 'contextmenu', _EventsToActions2.default.mouseButtons.Right, 0); 5351 5352 this.actions = this.getActions(); 5353 for (var _iterator5 = Object.keys(this.actions), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { 5354 var _ref5; 5355 5356 if (_isArray5) { 5357 if (_i5 >= _iterator5.length) break; 5358 _ref5 = _iterator5[_i5++]; 5359 } else { 5360 _i5 = _iterator5.next(); 5361 if (_i5.done) break; 5362 _ref5 = _i5.value; 5363 } 5364 5365 var name = _ref5; 5366 5367 var action = _extends({}, this.actions[name], this.p.actions[name]); 5368 this.actions[name] = action; 5369 if (action.enabled) { 5370 var flags = action.flags || 0; 5371 if (action.type) { 5372 this.eToA.addAction(action.activate, action.type, action.code, flags); 5373 } else if (action.code !== undefined) { 5374 this.eToA.addAction(action.activate, 'keydown', action.code, flags); 5375 } 5376 } 5377 } 5378 }; 5379 5380 BookController.prepareProps = function prepareProps(props) { 5381 return BookController.calcProps(BookController.mergeProps((0, _bookController.props)(), props)); 5382 }; 5383 5384 BookController.setActions = function setActions(props, actions) { 5385 for (var _iterator6 = Object.keys(actions || {}), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { 5386 var _ref6; 5387 5388 if (_isArray6) { 5389 if (_i6 >= _iterator6.length) break; 5390 _ref6 = _iterator6[_i6++]; 5391 } else { 5392 _i6 = _iterator6.next(); 5393 if (_i6.done) break; 5394 _ref6 = _i6.value; 5395 } 5396 5397 var name = _ref6; 5398 5399 props.actions[name] = _extends({}, props.actions[name], actions[name]); 5400 } 5401 }; 5402 5403 BookController.mergeProps = function mergeProps(first, second) { 5404 second = second || {}; 5405 function merge(first, second) { 5406 second = second || {}; 5407 var props = _extends({}, first, second); 5408 for (var _iterator7 = Object.keys(first), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { 5409 var _ref7; 5410 5411 if (_isArray7) { 5412 if (_i7 >= _iterator7.length) break; 5413 _ref7 = _iterator7[_i7++]; 5414 } else { 5415 _i7 = _iterator7.next(); 5416 if (_i7.done) break; 5417 _ref7 = _i7.value; 5418 } 5419 5420 var name = _ref7; 5421 5422 if (_typeof(first[name]) === 'object') { 5423 props[name] = merge(first[name], second[name]); 5424 } 5425 } 5426 return props; 5427 } 5428 var props = merge(first, second); 5429 BookController.setActions(props, first.actions); 5430 BookController.setActions(props, second.actions); 5431 return props; 5432 }; 5433 5434 BookController.calcProps = function calcProps(props) { 5435 props.scale.delta = (props.scale.max - props.scale.min) / props.scale.levels; 5436 props.lighting.delta = (props.lighting.max - props.lighting.min) / props.lighting.levels; 5437 return props; 5438 }; 5439 5440 return BookController; 5441}(_Controller3.default); 5442 5443exports.default = BookController; 5444 5445/***/ }), 5446/* 28 */ 5447/***/ (function(module, exports, __webpack_require__) { 5448 5449"use strict"; 5450 5451 5452exports.__esModule = true; 5453 5454var _libs = __webpack_require__(1); 5455 5456function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 5457 5458var BookPrinter = function () { 5459 function BookPrinter(context, book, styleSheet) { 5460 _classCallCheck(this, BookPrinter); 5461 5462 this.book = book; 5463 this.styleSheet = styleSheet; 5464 this.wnd = context.wnd; 5465 this.doc = context.doc; 5466 this.pageCallback = book.getPageCallback(); 5467 var test = this.pageCallback(0); 5468 this.type = test.type;
5469 if (this.type === 'pdf') { 5470 this.pdfSrc = test.src.src; 5471 } 5472 } 5473 5474 BookPrinter.prototype.cancel = function cancel() { 5475 this.canceled = true; 5476 }; 5477 5478 BookPrinter.prototype.dispose = function dispose() { 5479 if (this.frame) { 5480 this.frame.remove(); 5481 delete this.frame; 5482 } 5483 }; 5484 5485 BookPrinter.prototype.print = function print() { 5486 var _this = this; 5487 5488 delete this.canceled; 5489 if (this.type === 'pdf') { 5490 var printWnd = void 0, 5491 callManually = false; 5492 if (this.useIFrame()) { 5493 callManually = !!this.frame; 5494 if (!this.frame) { 5495 this.frame = (0, _libs.$)('<iframe src="' + this.pdfSrc + '" style="display: none;"></iframe>').appendTo(this.doc.body); 5496 } 5497 printWnd = this.frame[0].contentWindow; 5498 } else { 5499 printWnd = this.wnd.open(this.pdfSrc); 5500 } 5501 if (callManually) { 5502 printWnd.print(); 5503 } else { 5504 (0, _libs.$)(printWnd).on('load', function () { 5505 try { 5506 printWnd.print(); 5507 } catch (e) { 5508 console.error(e); 5509 } 5510 }); 5511 } 5512 } else { 5513 this.renderContent().then(function (content) { 5514 var printWnd = _this.wnd.open(), 5515 printDoc = printWnd.document, 5516 html = '\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset="utf-8">\n <title>3D FlipBook - Printing</title>\n ' + content.head + '\n <script type="text/javascript">\n function printDocument() {\n window.print();\n window.close();\n }\n function init() {\n setTimeout(printDocument, 100);\n }\n </script>\n </head>\n <body onload="init()">\n ' + content.body + '\n </body>\n </html>\n '; 5517 printDoc.open(); 5518 printDoc.write(html); 5519 printDoc.close(); 5520 }).catch(function (e) { 5521 return console.warn('3D FlipBook - Printing was canceled'); 5522 }); 5523 } 5524 }; 5525 5526 BookPrinter.prototype.progress = function progress(v) { 5527 if (this.canceled) { 5528 throw 'Cancel Printing'; 5529 } 5530 if (this.onProgress) { 5531 this.onProgress(Math.floor(v * 100)); 5532 } 5533 }; 5534 5535 BookPrinter.prototype.renderContent = function renderContent() { 5536 var _this2 = this; 5537 5538 var pages = this.book.getPages(), 5539 head = new Set(), 5540 body = []; 5541 var done = Promise.resolve(); 5542 5543 var _loop = function _loop(page) { 5544 var info = _this2.pageCallback(page); 5545 if (info.type === 'image') { 5546 done = done.then(function () { 5547 _this2.progress(page / pages); 5548 return _this2.renderImage(head, body, info.src); 5549 }); 5550 } else if (info.type === 'html') { 5551 done = done.then(function () { 5552 _this2.progress(page / pages); 5553 return _this2.renderHtml(head, body, info.src); 5554 }); 5555 } 5556 }; 5557 5558 for (var page = 0; page < pages; ++page) { 5559 _loop(page); 5560 } 5561 return done.then(function () { 5562 _this2.progress(1); 5563 return { head: _this2.renderHead(head), body: body.join('\n') }; 5564 }); 5565 }; 5566 5567 BookPrinter.wrap = function wrap(content) { 5568 return '<div class="fb3d-printer-page">' + content + '</div>'; 5569 }; 5570 5571 BookPrinter.prototype.renderImage = function renderImage(head, body, src) { 5572 body.push(BookPrinter.wrap('<img src="' + src + '" />')); 5573 }; 5574 5575 BookPrinter.prototype.renderHtml = function renderHtml(head, body, src) { 5576 return new Promise(function (resolve, reject) { 5577 _libs.$.get(src, function (html) { 5578 var links = html.match(/<link.*?>/ig) || []; 5579 for (var _iterator = links, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 5580 var _ref; 5581 5582 if (_isArray) { 5583 if (_i >= _iterator.length) break; 5584 _ref = _iterator[_i++]; 5585 } else { 5586 _i = _iterator.next(); 5587 if (_i.done) break; 5588 _ref = _i.value; 5589 } 5590 5591 var link = _ref; 5592 5593 if (link.match(/stylesheet/i)) { 5594 var href = link.match(/href\s*=\s*['"](.*)['"]/i); 5595 if (href) { 5596 head.add(href[1]); 5597 } 5598 } 5599 } 5600 var content = html.match(/<body.*?>([\S\s]*)<\/body>/i); 5601 if (content) { 5602 body.push(BookPrinter.wrap(content[1])); 5603 } 5604 resolve(); 5605 }).fail(function (e) { 5606 console.error(e.responseText); 5607 reject(); 5608 }); 5609 });
5610 }; 5611 5612 BookPrinter.prototype.renderHead = function renderHead(head) { 5613 var content = []; 5614 head.forEach(function (k) { 5615 return content.push('<link rel="stylesheet" href="' + k + '">'); 5616 }); 5617 content.push(this.styleSheet ? '<link rel="stylesheet" href="' + this.styleSheet + '">' : BookPrinter.defaultStyleSheet()); 5618 return content.join('\n'); 5619 }; 5620 5621 BookPrinter.prototype.useIFrame = function useIFrame() { 5622 var isChromium = this.wnd.chrome, 5623 winNav = this.wnd.navigator, 5624 vendorName = winNav.vendor, 5625 isIEedge = winNav.userAgent.indexOf("Edge") > -1, 5626 isIOSChrome = winNav.userAgent.match("CriOS"); 5627 var use = void 0; 5628 if (isIOSChrome) { 5629 use = true; 5630 } else if (isChromium && vendorName === 'Google Inc.' && !isIEedge) { 5631 use = true; 5632 } else { 5633 use = false; 5634 } 5635 return use; 5636 }; 5637 5638 BookPrinter.defaultStyleSheet = function defaultStyleSheet() { 5639 return '\n <style type="text/css">\n body {\n margin: 0;\n padding: 0;\n }\n .fb3d-printer-page {\n page-break-after: always;\n }\n </style>\n '; 5640 }; 5641 5642 return BookPrinter; 5643}(); 5644 5645exports.default = BookPrinter; 5646 5647/***/ }), 5648/* 29 */ 5649/***/ (function(module, exports, __webpack_require__) { 5650 5651"use strict"; 5652 5653 5654exports.__esModule = true; 5655 5656var _libs = __webpack_require__(1); 5657 5658var _View2 = __webpack_require__(65); 5659 5660var _View3 = _interopRequireDefault(_View2); 5661 5662function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 5663 5664function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 5665 5666function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 5667 5668function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 5669 5670var BookView = function (_View) { 5671 _inherits(BookView, _View); 5672 5673 function BookView(container, onLoad, template, handler) { 5674 _classCallCheck(this, BookView); 5675 5676 return _possibleConstructorReturn(this, _View.call(this, container, onLoad, template, handler)); 5677 } 5678 5679 BookView.prototype.initView = function initView() { 5680 this.view = this.container.find('.view'); 5681 this.bookmarksView = this.container.find('.widBookmarks'); 5682 this.thumbnailsView = this.container.find('.widThumbnails'); 5683 this.searchView = this.container.find('.widSearch'); 5684 }; 5685 5686 BookView.prototype.getHandlers = function getHandlers(id) { 5687 var _this2 = this; 5688 5689 var handlers = void 0; 5690 if (id === 'inpPage') { 5691 handlers = [{ 5692 inpPage: function inpPage(e, data) { 5693 return _this2.callLater(_View.prototype.getHandlers.call(_this2, id), id, e, data, BookView.PAGE_HANDLER_DELAY); 5694 } 5695 }]; 5696 } else { 5697 handlers = _View.prototype.getHandlers.call(this, id); 5698 } 5699 return handlers; 5700 }; 5701 5702 BookView.prototype.onItemStateChanged = function onItemStateChanged(id, state) { 5703 if (id === 'cmdFullScreen') { 5704 if (state.active) { 5705 this.parentContainer.addClass('fullscreen'); 5706 } else { 5707 this.parentContainer.removeClass('fullscreen'); 5708 } 5709 } 5710 }; 5711 5712 BookView.prototype.getView = function getView() { 5713 return this.view; 5714 }; 5715 5716 BookView.prototype.getBookmarksView = function getBookmarksView() { 5717 return this.bookmarksView; 5718 }; 5719 5720 BookView.prototype.getThumbnailsView = function getThumbnailsView() { 5721 return this.thumbnailsView; 5722 }; 5723 5724 BookView.prototype.getSearchView = function getSearchView() { 5725 return this.searchView; 5726 }; 5727 5728 BookView.prototype.getForms = function getForms() { 5729 return []; 5730 }; 5731 5732 BookView.prototype.getLinks = function getLinks() { 5733 return ['cmdZoomIn', 'cmdZoomOut', 'cmdDefaultZoom', 'cmdToc', 'cmdFastBackward', 'cmdBackward', 'cmdBigBackward', 'cmdForward', 'cmdBigForward', 'cmdFastForward', 'cmdSave', 'cmdPrint', 'cmdFullScreen', 'cmdSmartPan', 'cmdSinglePage', 'cmdSounds', 'cmdStats', 'cmdLightingUp', 'cmdLightingDown', 'cmdCloseToc', 'cmdBookmarks', 'cmdSearch', 'cmdThumbnails']; 5734 }; 5735 5736 BookView.prototype.getWidgets = function getWidgets() { 5737 return ['widLoadingProgress', 'widFloatWnd', 'widTocMenu', 'widBookmarks', 'widThumbnails', 'widSearch', 'widSettings', 'widLoading']; 5738 }; 5739 5740 BookView.prototype.getInputs = function getInputs() { 5741 return ['inpPage', 'inpPages']; 5742 }; 5743 5744 BookView.prototype.getTexts = function getTexts() { 5745 return ['txtLoadingProgress']; 5746 }; 5747 5748 BookView.prototype.getTemplate = function getTemplate() { 5749 return { 5750 html: 'templates/default-book-view.html',
5751 styles: ['css/black-book-view.css'], 5752 links: [{ 5753 rel: 'stylesheet', 5754 href: 'css/font-awesome.min.css' 5755 }], 5756 script: 'js/default-book-view.js' 5757 }; 5758 }; 5759 5760 return BookView; 5761}(_View3.default); 5762 5763BookView.PAGE_HANDLER_DELAY = 1000; 5764exports.default = BookView; 5765 5766/***/ }), 5767/* 30 */ 5768/***/ (function(module, exports, __webpack_require__) { 5769 5770"use strict"; 5771 5772 5773exports.__esModule = true; 5774 5775var _BookPropsBuilder2 = __webpack_require__(9); 5776 5777var _BookPropsBuilder3 = _interopRequireDefault(_BookPropsBuilder2); 5778 5779var _ImageFactory = __webpack_require__(8); 5780 5781var _ImageFactory2 = _interopRequireDefault(_ImageFactory); 5782 5783function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 5784 5785function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 5786 5787function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 5788 5789function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 5790 5791var ClbBookPropsBuilder = function (_BookPropsBuilder) { 5792 _inherits(ClbBookPropsBuilder, _BookPropsBuilder); 5793 5794 function ClbBookPropsBuilder(context, pageCallback, pages, onReady) { 5795 _classCallCheck(this, ClbBookPropsBuilder); 5796 5797 var _this = _possibleConstructorReturn(this, _BookPropsBuilder.call(this, onReady)); 5798 5799 _this.calcSheets(pages); 5800 _this.pageCallback = pageCallback; 5801 _this.binds = { 5802 pageCallback: pageCallback.bind(_this) 5803 }; 5804 _this.imageFactory = new _ImageFactory2.default(context); 5805 5806 if (pages > 0) { 5807 var test = _this.imageFactory.build(pageCallback(0), 0, _this.defaults.sheet.widthTexels, _this.defaults.sheet.heightTexels, _this.defaults.sheet.color); 5808 test.onLoad = function () { 5809 _this.calcProps(test.width, test.height); 5810 test.dispose(); 5811 _this.ready(); 5812 }; 5813 } else { 5814 _this.props = _this.defaults; 5815 _this.ready(); 5816 } 5817 return _this; 5818 } 5819 5820 return ClbBookPropsBuilder; 5821}(_BookPropsBuilder3.default); 5822 5823exports.default = ClbBookPropsBuilder; 5824 5825/***/ }), 5826/* 31 */ 5827/***/ (function(module, exports, __webpack_require__) { 5828 5829"use strict"; 5830 5831 5832exports.__esModule = true; 5833 5834var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 5835 5836var _SheetBlock2 = __webpack_require__(10); 5837 5838var _SheetBlock3 = _interopRequireDefault(_SheetBlock2); 5839 5840function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 5841 5842function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 5843 5844function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 5845 5846function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 5847
5848var Cover = function (_SheetBlock) { 5849 _inherits(Cover, _SheetBlock); 5850 5851 function Cover(visual, p, angle, state) { 5852 _classCallCheck(this, Cover); 5853 5854 return _possibleConstructorReturn(this, _SheetBlock.call(this, visual, p, 0, 1, angle, state)); 5855 } 5856 5857 Cover.prototype.getProps = function getProps() { 5858 return _extends({}, this.p.cover, { 5859 sheets: 1 5860 }); 5861 }; 5862 5863 Cover.prototype.loadPoints = function loadPoints() { 5864 var openedInterpolationIndeces = [[2, 3, 4], [2, 3, 4, 5, 6]], 5865 closedInterpolationIndeces = [[0, 1, 2], [0, 1, 2]], 5866 interpolationPoints = [{ 5867 x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0, 0.2831, 0.6256, 0.8082, 0.9909], [0, 0.2603, 0.5936, 0.7763, 0.9589], [0, 0.1370, 0.3881, 0.5342, 0.6758], [0, 0, 0, 0, 0]], 5868 y: [[0, 0, 0, 0, 0], [0, 0.02, 0.005, -0.001, -0.0025], [0, 0.04, 0.01, -0.002, -0.005], [0, 0.2466, 0.4795, 0.5708, 0.6758], [0, 0.2877, 0.6347, 0.8174, 1.0000]] 5869 }, { 5870 x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0, 0.2831, 0.6256, 0.8082, 0.9909], [0, 0.2603, 0.5936, 0.7763, 0.9589], [0.000, 0.233, 0.563, 0.746, 0.927], [0.000, 0.144, 0.433, 0.613, 0.796], [0.000, 0.070, 0.288, 0.455, 0.626], [0, 0, 0, 0, 0]], 5871 y: [[0, 0, 0, 0, 0], [0, 0.02, 0.005, -0.001, -0.0025], [0, 0.04, 0.01, -0.002, -0.005], [0.000, 0.168, 0.269, 0.270, 0.255], [0.000, 0.245, 0.435, 0.458, 0.460], [0.000, 0.278, 0.544, 0.614, 0.673], [0, 0.2877, 0.6347, 0.8174, 1.0000]] 5872 }]; 5873 return { 5874 interpolationPoints: interpolationPoints, 5875 openedInterpolationIndeces: openedInterpolationIndeces, 5876 closedInterpolationIndeces: closedInterpolationIndeces 5877 }; 5878 }; 5879 5880 return Cover; 5881}(_SheetBlock3.default); 5882 5883exports.default = Cover; 5884 5885/***/ }), 5886/* 32 */ 5887/***/ (function(module, exports, __webpack_require__) { 5888 5889"use strict"; 5890 5891 5892exports.__esModule = true; 5893 5894var _SheetCssLayer = __webpack_require__(37); 5895 5896var _SheetCssLayer2 = _interopRequireDefault(_SheetCssLayer); 5897 5898function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 5899 5900function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 5901 5902var CssLayersManager = function () { 5903 function CssLayersManager(book) { 5904 _classCallCheck(this, CssLayersManager); 5905 5906 this.book = book; 5907 this.props = book.p.cssLayerProps; 5908 this.visual = book.visual; 5909 this.pageManager = book.pageManager; 5910 this.wrappers = {}; 5911 } 5912 5913 CssLayersManager.prototype.getActives = function getActives() { 5914 var page = this.book.getPage(), 5915 pages = this.book.getPages(); 5916 return page === 0 || page === pages - 1 ? [page] : [page, page + 1]; 5917 }; 5918 5919 CssLayersManager.prototype.dispose = function dispose() { 5920 for (var _iterator = Object.values(this.wrappers), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 5921 var _ref; 5922 5923 if (_isArray) { 5924 if (_i >= _iterator.length) break; 5925 _ref = _iterator[_i++]; 5926 } else { 5927 _i = _iterator.next(); 5928 if (_i.done) break; 5929 _ref = _i.value; 5930 } 5931 5932 var w = _ref; 5933 5934 w.layers.forEach(function (l) { 5935 return l.dispose(); 5936 }); 5937 } 5938 delete this.wrappers; 5939 }; 5940 5941 CssLayersManager.prototype.show = function show() { 5942 var _this = this; 5943 5944 this.hidden = false; 5945 5946 var _loop = function _loop() { 5947 if (_isArray2) { 5948 if (_i2 >= _iterator2.length) return 'break'; 5949 _ref2 = _iterator2[_i2++]; 5950 } else { 5951 _i2 = _iterator2.next(); 5952 if (_i2.done) return 'break'; 5953 _ref2 = _i2.value; 5954 } 5955 5956 var n = _ref2; 5957 5958 var w = _this.wrappers[n]; 5959 if (w) { 5960 if (w.state === 'ready' && w.layers.length) { 5961 var block = _this.book.getBlockByPage(n); 5962 w.layers.forEach(function (l) { 5963 if (l.isHidden()) { 5964 l.update(block); 5965 l.show(); 5966 } 5967 }); 5968 } 5969 } else { 5970 var _w = _this.wrappers[n] = { 5971 state: 'loading', 5972 layers: [] 5973 }; 5974 Promise.resolve().then(function () { 5975 _this.pageManager.getLayers(n, function (layers) { 5976 if (layers.length && _this.wrappers) { 5977 var _block = _this.book.getBlockByPage(n); 5978 for (var _iterator3 = layers, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 5979 var _ref3; 5980 5981 if (_isArray3) { 5982 if (_i3 >= _iterator3.length) break; 5983 _ref3 = _iterator3[_i3++]; 5984 } else { 5985 _i3 = _iterator3.next(); 5986 if (_i3.done) break; 5987 _ref3 = _i3.value; 5988 } 5989 5990 var l = _ref3; 5991 5992 var sl = new _SheetCssLayer2.default(_this.visual, _block, _this.props); 5993 _w.layers.push(sl); 5994 sl.set(l.css, l.html, l.js); 5995 } 5996 setTimeout(function () { 5997 if (!_this.hidden && ~_this.getActives().indexOf(n)) {
5998 _w.layers.forEach(function (l) { 5999 return l.show(); 6000 }); 6001 } 6002 }, 10); 6003 } 6004 _w.state = 'ready'; 6005 }); 6006 }); 6007 } 6008 }; 6009 6010 for (var _iterator2 = this.getActives(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 6011 var _ref2; 6012 6013 var _ret = _loop(); 6014 6015 if (_ret === 'break') break; 6016 } 6017 }; 6018 6019 CssLayersManager.prototype.hide = function hide() { 6020 this.hidden = true; 6021 var wait = []; 6022 for (var _iterator4 = Object.values(this.wrappers), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 6023 var _ref4; 6024 6025 if (_isArray4) { 6026 if (_i4 >= _iterator4.length) break; 6027 _ref4 = _iterator4[_i4++]; 6028 } else { 6029 _i4 = _iterator4.next(); 6030 if (_i4.done) break; 6031 _ref4 = _i4.value; 6032 } 6033 6034 var _w2 = _ref4; 6035 6036 _w2.layers.forEach(function (l) { 6037 return wait.push(l.hide()); 6038 }); 6039 } 6040 return Promise.all(wait); 6041 }; 6042 6043 return CssLayersManager; 6044}(); 6045 6046exports.default = CssLayersManager; 6047 6048/***/ }), 6049/* 33 */ 6050/***/ (function(module, exports, __webpack_require__) { 6051 6052"use strict"; 6053 6054 6055exports.__esModule = true; 6056 6057var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 6058 6059var _libs = __webpack_require__(1); 6060 6061var _Cache = __webpack_require__(14); 6062 6063var _Cache2 = _interopRequireDefault(_Cache); 6064 6065var _LoadingAnimation = __webpack_require__(52); 6066 6067var _LoadingAnimation2 = _interopRequireDefault(_LoadingAnimation); 6068 6069var _ImageFactory = __webpack_require__(8); 6070 6071var _ImageFactory2 = _interopRequireDefault(_ImageFactory); 6072 6073var _BaseMathUtils = __webpack_require__(2); 6074 6075var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); 6076 6077var _TextureAnimator = __webpack_require__(60); 6078 6079var _TextureAnimator2 = _interopRequireDefault(_TextureAnimator); 6080 6081function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 6082 6083function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 6084 6085var PageManager = function () { 6086 function PageManager(visual, book, p) { 6087 _classCallCheck(this, PageManager); 6088 6089 this.visual = visual; 6090 this.book = book; 6091 this.pageQuery = ''; 6092 this.p = p; 6093 this.pageCache = new _Cache2.default(p.cachedPages); 6094 this.resourcesCache = new _Cache2.default(); 6095 this.canvas = (0, _libs.$)('<canvas>')[0]; 6096 this.imageFactory = new _ImageFactory2.default(_extends({}, visual, { dispatchEvent: book.dispatchEvent.bind(book), renderCanvas: this.canvas, renderCanvasCtx: this.canvas.getContext('2d') }), this.resourcesCache); 6097 6098 this.loadings = []; 6099 this.renderQueue = []; 6100 this.pageRequests = []; 6101 this.predictedRequests = []; 6102 6103 this.tmpMaterial = new _libs.THREE.MeshBasicMaterial(); 6104 visual.addObject(new _libs.THREE.Mesh(new _libs.THREE.PlaneGeometry(0, 0), this.tmpMaterial)); 6105 6106 this.loadingAnimation = true; 6107 this.loading = {}; 6108 this.loading[p.cover.color] = this.createLoadingTexture(p.cover); 6109 if (p.page.color !== p.cover.color) { 6110 this.loading[p.page.color] = this.createLoadingTexture(p.page); 6111 } 6112 6113 this.turnOnEvents(); 6114 6115 visual.addRenderCallback(this.update.bind(this)); 6116 6117 setTimeout(this.updateRenderQueue.bind(this), 250); 6118 } 6119 6120 PageManager.prototype.createLoadingTexture = function createLoadingTexture(p) { 6121 var spriteTiles = 6, 6122 scale = Math.sqrt(4.5 * 210 * 4.5 * 297 / (p.widthTexels * p.heightTexels)), 6123 animation = new _LoadingAnimation2.default(scale * p.widthTexels, scale * p.heightTexels, p.color), 6124 animator = new _TextureAnimator2.default(animation.createSprite(spriteTiles), spriteTiles, 1, spriteTiles, 0.2); 6125 animation.dispose(); 6126 return animator; 6127 }; 6128 6129 PageManager.prototype.dispose = function dispose() { 6130 this.turnOffEvents(); 6131 for (var _iterator = Object.keys(this.loading), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 6132 var _ref; 6133 6134 if (_isArray) { 6135 if (_i >= _iterator.length) break; 6136 _ref = _iterator[_i++]; 6137 } else { 6138 _i = _iterator.next(); 6139 if (_i.done) break; 6140 _ref = _i.value; 6141 } 6142 6143 var color = _ref; 6144 6145 this.loading[color].dispose(); 6146 } 6147 delete this.loading; 6148 this.resourcesCache.dispose(); 6149 this.pageCache.dispose(); 6150 this.canvas.height = this.canvas.width = 0; 6151 delete this.canvas; 6152 }; 6153 6154 PageManager.prototype.isCover = function isCover(n) { 6155 return n < 2 || n >= 2 * (this.p.sheets + 1); 6156 }; 6157 6158 PageManager.prototype.isMobile = function isMobile() { 6159 return (this.visual.wnd.devicePixelRatio || 1) > 1;
6160 }; 6161 6162 PageManager.prototype.getPageState = function getPageState(n) { 6163 var object = this.pageCache.get(n); 6164 return object ? object.state : undefined; 6165 }; 6166 6167 PageManager.prototype.enableLoadingAnimation = function enableLoadingAnimation(enable) { 6168 this.loadingAnimation = enable; 6169 for (var _iterator2 = this.loadings, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 6170 var _ref2; 6171 6172 if (_isArray2) { 6173 if (_i2 >= _iterator2.length) break; 6174 _ref2 = _iterator2[_i2++]; 6175 } else { 6176 _i2 = _iterator2.next(); 6177 if (_i2.done) break; 6178 _ref2 = _i2.value; 6179 } 6180 6181 var o = _ref2; 6182 6183 this.setupMaterial(o); 6184 } 6185 }; 6186 6187 PageManager.prototype.update = function update(dt) { 6188 if (this.loadingAnimation) { 6189 var loading = {}; 6190 for (var _iterator3 = this.loadings, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 6191 var _ref3; 6192 6193 if (_isArray3) { 6194 if (_i3 >= _iterator3.length) break; 6195 _ref3 = _iterator3[_i3++]; 6196 } else { 6197 _i3 = _iterator3.next(); 6198 if (_i3.done) break; 6199 _ref3 = _i3.value; 6200 } 6201 6202 var o = _ref3; 6203 6204 if (o.isActive()) { 6205 loading[o.color] = true;; 6206 } 6207 } 6208 for (var _iterator4 = Object.keys(loading), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 6209 var _ref4; 6210 6211 if (_isArray4) { 6212 if (_i4 >= _iterator4.length) break; 6213 _ref4 = _iterator4[_i4++]; 6214 } else { 6215 _i4 = _iterator4.next(); 6216 if (_i4.done) break; 6217 _ref4 = _i4.value; 6218 } 6219 6220 var color = _ref4; 6221 6222 this.loading[color].update(dt); 6223 } 6224 } 6225 }; 6226 6227 PageManager.prototype.removeFromLoadings = function removeFromLoadings(o) { 6228 var i = this.loadings.indexOf(o); 6229 if (~i) { 6230 this.loadings.splice(i, 1); 6231 } 6232 }; 6233 6234 PageManager.prototype.removeFromRenderQueue = function removeFromRenderQueue(o) { 6235 var i = this.renderQueue.indexOf(o); 6236 if (~i) { 6237 this.renderQueue.splice(i, 1); 6238 } 6239 }; 6240 6241 PageManager.prototype.refreshPageQuery = function refreshPageQuery(n) { 6242 var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 6243 6244 this.pageQuery = query; 6245 var object = this.pageCache.get(n); 6246 if (object && object.wrapper && object.wrapper.setQuery) { 6247 if (!this.pageCache.remove(n)) { 6248 object.wrapper.setQuery(query); 6249 this.pushInRenderQueue(object); 6250 } 6251 } 6252 }; 6253 6254 PageManager.prototype.refreshZoom = function refreshZoom() { 6255 var _this = this; 6256 6257 if (this.p.autoResolution.enable) { 6258 var es = []; 6259 this.pageCache.forEach(function (e) { 6260 es.push(e); 6261 }); 6262 es.forEach(function (e) { 6263 var object = e[1]; 6264 if (object && object.wrapper) { 6265 if (!_this.pageCache.remove(e[0])) { 6266 _this.pushInRenderQueue(object); 6267 } 6268 } 6269 }); 6270 } 6271 }; 6272 6273 PageManager.prototype.getLayers = function getLayers(n, clb) { 6274 var _this2 = this; 6275 6276 if (this.p.cssLayersLoader) { 6277 this.p.cssLayersLoader(n, function () { 6278 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 6279 args[_key] = arguments[_key]; 6280 } 6281 6282 var object = _this2.pageCache.get(n); 6283 if (object) { 6284 if (object.state !== 'active') { 6285 object.pendings.push({ clb: clb, args: args }); 6286 } else { 6287 clb.apply(undefined, args); 6288 } 6289 } 6290 }); 6291 } else { 6292 clb([]); 6293 } 6294 }; 6295 6296 PageManager.prototype.resolvePendings = function resolvePendings(pendings) { 6297 for (var _iterator5 = pendings, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { 6298 var _ref5; 6299 6300 if (_isArray5) { 6301 if (_i5 >= _iterator5.length) break; 6302 _ref5 = _iterator5[_i5++]; 6303 } else { 6304 _i5 = _iterator5.next(); 6305 if (_i5.done) break; 6306 _ref5 = _i5.value; 6307 } 6308 6309 var p = _ref5; 6310
6311 try { 6312 p.clb.apply(p, p.args); 6313 } catch (e) { 6314 console.error(e); 6315 } 6316 } 6317 pendings.splice(0, pendings.length); 6318 }; 6319 6320 PageManager.prototype.rtlPageN = function rtlPageN(n) { 6321 return this.p.rtl ? 2 * (this.p.sheets + 2) - 1 - n : n; 6322 }; 6323 6324 PageManager.prototype.load = function load(material, n) { 6325 var _this3 = this; 6326 6327 var pi = this.p.pageCallback(this.rtlPageN(n)), 6328 p = this.isCover(n) ? this.p.cover : this.p.page; 6329 var o = { 6330 n: n, 6331 texture: new _libs.THREE.Texture(), 6332 wrapper: null, 6333 state: 'loading', 6334 locked: function locked(n) { 6335 return o.state === 'loading' || o.state === 'rendering' || _this3.book.isActivePage(n); 6336 }, 6337 color: p.color, 6338 isActive: function isActive() { 6339 return _this3.book.isActivePage(n); 6340 }, 6341 isTop: function isTop() { 6342 return ~_this3.book.getTopPages().indexOf(n); 6343 }, 6344 dispose: function dispose() { 6345 _this3.removeFromLoadings(o); 6346 _this3.removeFromRenderQueue(o); 6347 if (o.wrapper && o.wrapper.dispose) { 6348 o.wrapper.dispose(); 6349 } 6350 o.texture.dispose(); 6351 delete o.texture; 6352 delete o.wrapper; 6353 }, 6354 pendings: [] 6355 }; 6356 o.texture.minFilter = _libs.THREE.LinearFilter; 6357 this.loadings.push(o); 6358 this.setMaterial(o, material); 6359 6360 Promise.resolve().then(function () { 6361 if (o.texture) { 6362 o.widthTexels = pi.widthTexels || p.widthTexels; 6363 o.heightTexels = pi.heightTexels || p.heightTexels; 6364 var res = _this3.calcResolution(o); 6365 o.wrapper = _this3.imageFactory.build(pi, pi.number === undefined ? _this3.rtlPageN(n) : pi.number, res.width, res.height, p.color, _this3.p.injector); 6366 if (o.wrapper.setQuery) { 6367 o.wrapper.setQuery(_this3.pageQuery); 6368 } 6369 o.simulate = pi.interactive ? (o.wrapper.simulate || function () { 6370 return undefined; 6371 }).bind(o.wrapper) : undefined; 6372 o.wrapper.onLoad = function () { 6373 _this3.pushInRenderQueue(o); 6374 _this3.book.dispatchEvent({ 6375 type: 'loadedPage', 6376 page: n 6377 }); 6378 }; 6379 o.wrapper.onChange = function (image) { 6380 if (o.texture) { 6381 _this3.removeFromLoadings(o); 6382 if (o.material) { 6383 o.material.map = o.texture; 6384 o.material.color = new _libs.THREE.Color(0xFFFFFF); 6385 o.material.needsUpdate = true; 6386 } 6387 o.texture.image = image; 6388 o.texture.needsUpdate = true; 6389 o.texture.onUpdate = function () { 6390 if (o.state !== 'queuedForRender') { 6391 o.state = 'active'; 6392 _this3.resolvePendings(o.pendings); 6393 } 6394 delete _this3.rendering; 6395 //this.updateRenderQueue(); 6396 }; 6397 _this3.tmpMaterial.map = o.texture; 6398 _this3.tmpMaterial.needsUpdate = true; 6399 } 6400 }; 6401 } 6402 }); 6403 this.book.dispatchEvent({ 6404 type: 'loadPage', 6405 page: n 6406 }); 6407 return this.pageCache.put(n, o); 6408 }; 6409 6410 PageManager.prototype.isSinglePage = function isSinglePage(o) { 6411 return this.p.singlePage || !o.n || o.n === this.book.getPages() - 1; 6412 }; 6413 6414 PageManager.prototype.calcResolution = function calcResolution(o) { 6415 var res = void 0; 6416 if (this.p.autoResolution.enable) { 6417 var k = Math.min((this.isSinglePage(o) ? 1 : 0.5) * this.visual.width() / o.widthTexels, this.visual.height() / o.heightTexels); 6418 res = { 6419 width: this.p.autoResolution.k * this.p.zoom * k * o.widthTexels, 6420 height: this.p.autoResolution.k * this.p.zoom * k * o.heightTexels 6421 }; 6422 } else { 6423 res = { 6424 width: o.widthTexels, 6425 height: o.heightTexels 6426 }; 6427 } 6428 return res; 6429 }; 6430 6431 PageManager.prototype.pushInRenderQueue = function pushInRenderQueue(o) { 6432 if (o.state !== 'queuedForRender') { 6433 o.state = 'queuedForRender'; 6434 this.renderQueue.push(o); 6435 // this.updateRenderQueue(); 6436 } 6437 }; 6438 6439 PageManager.prototype.updateRenderQueue = function updateRenderQueue() { 6440 if (this.canvas) { 6441 var p = this.p; 6442 if (!this.rendering && (p.renderWhileFlipping || !this.book.isProcessing())) { 6443 var active = void 0, 6444 top = void 0; 6445 for (var _iterator6 = this.renderQueue, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { 6446 var _ref6; 6447 6448 if (_isArray6) { 6449 if (_i6 >= _iterator6.length) break; 6450 _ref6 = _iterator6[_i6++]; 6451 } else { 6452 _i6 = _iterator6.next(); 6453 if (_i6.done) break; 6454 _ref6 = _i6.value; 6455 } 6456 6457 var o = _ref6; 6458 6459 if (!active && o.isActive()) { 6460 active = o; 6461 } 6462 if (o.isTop()) { 6463 top = o; 6464 break; 6465 } 6466 } 6467 this.rendering = top || active; 6468 if (this.isMobile() && p.renderInactivePagesOnMobile || !this.isMobile() && p.renderInactivePages) { 6469 this.rendering = this.rendering || this.renderQueue[0]; 6470 } 6471 if (this.rendering) { 6472 if (this.rendering.wrapper.startRender) { 6473 this.removeFromRenderQueue(this.rendering); 6474 this.rendering.state = 'rendering'; 6475 this.rendering.wrapper.setResolution(this.calcResolution(this.rendering)); 6476 this.rendering.wrapper.startRender(); 6477 } else { 6478 delete this.rendering; 6479 } 6480 } 6481 } 6482 setTimeout(this.updateRenderQueue.bind(this), 250); 6483 } 6484 }; 6485 6486 PageManager.prototype.turnOnEvents = function turnOnEvents() { 6487 this.transferEvents = true; 6488 }; 6489 6490 PageManager.prototype.turnOffEvents = function turnOffEvents() { 6491 var mouseup = _libs.$.Event('mouseup'), 6492 mouseout = _libs.$.Event('mouseout'); 6493 this.pageCache.forEach(function (ent) { 6494 var object = ent[1];
6495 if (object.simulate) { 6496 object.simulate(mouseup, undefined, 0, 0); 6497 object.simulate(mouseout, undefined, 0, 0); 6498 } 6499 }); 6500 this.transferEvents = false; 6501 }; 6502 6503 PageManager.prototype.transferEventToTexture = function transferEventToTexture(n, e, data) { 6504 if (this.transferEvents) { 6505 var toObject = this.getOrLoadTextureObject(undefined, n); 6506 if (toObject.wrapper) { 6507 var uv = data.uv, 6508 toDoc = toObject.wrapper.getSimulatedDoc(); 6509 this.pageCache.forEach(function (ent) { 6510 var object = ent[1]; 6511 if (object.simulate) { 6512 object.simulate(e, toDoc, uv.x, uv.y); 6513 } 6514 }); 6515 } 6516 } 6517 }; 6518 6519 PageManager.prototype.loadPredictedPages = function loadPredictedPages() { 6520 this.predictedRequests = _BaseMathUtils2.default.predict(this.pageRequests, this.p.preloadPages); 6521 for (var _iterator7 = this.predictedRequests, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { 6522 var _ref7; 6523 6524 if (_isArray7) { 6525 if (_i7 >= _iterator7.length) break; 6526 _ref7 = _iterator7[_i7++]; 6527 } else { 6528 _i7 = _iterator7.next(); 6529 if (_i7.done) break; 6530 _ref7 = _i7.value; 6531 } 6532 6533 var p = _ref7; 6534 6535 if (p < this.book.getPages() && !this.pageCache.get(p)) { 6536 this.load(undefined, p); 6537 } 6538 } 6539 }; 6540 6541 PageManager.prototype.addPageRequest = function addPageRequest(n) { 6542 this.pageRequests.push(n); 6543 if (this.pageRequests.length > this.p.pagesForPredicting) { 6544 this.pageRequests.shift(); 6545 } 6546 Promise.resolve().then(this.loadPredictedPages.bind(this)); 6547 }; 6548 6549 PageManager.prototype.setMaterial = function setMaterial(o, material) { 6550 this.pageCache.forEach(function (e) { 6551 var ob = e[1]; 6552 if (o !== ob && ob.material === material) { 6553 delete ob.material; 6554 } 6555 }); 6556 if (material && material !== o.material) { 6557 o.material = material; 6558 this.setupMaterial(o); 6559 } 6560 }; 6561 6562 PageManager.prototype.setupMaterial = function setupMaterial(o) { 6563 o.material.map = o.texture.image ? o.texture : this.loadingAnimation ? this.loading[o.color].texture : null; 6564 if (!o.material.map) { 6565 o.material.color = new _libs.THREE.Color(o.color); 6566 } 6567 o.material.needsUpdate = true; 6568 }; 6569 6570 PageManager.prototype.getOrLoadTextureObject = function getOrLoadTextureObject(material, n) { 6571 var object = this.pageCache.get(n); 6572 if (!object) { 6573 object = this.load(material, n); 6574 this.addPageRequest(n); 6575 } else { 6576 this.setMaterial(object, material); 6577 } 6578 6579 return object; 6580 }; 6581 6582 PageManager.prototype.setTexture = function setTexture(material, n) { 6583 if (~this.predictedRequests.indexOf(n)) { 6584 this.addPageRequest(n); 6585 } 6586 this.getOrLoadTextureObject(material, n); 6587 }; 6588 6589 return PageManager; 6590}(); 6591 6592exports.default = PageManager; 6593 6594/***/ }), 6595/* 34 */ 6596/***/ (function(module, exports, __webpack_require__) { 6597 6598"use strict"; 6599 6600 6601exports.__esModule = true; 6602 6603var _BookPropsBuilder2 = __webpack_require__(9); 6604 6605var _BookPropsBuilder3 = _interopRequireDefault(_BookPropsBuilder2); 6606 6607var _Pdf = __webpack_require__(18); 6608 6609var _Pdf2 = _interopRequireDefault(_Pdf); 6610 6611function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 6612 6613function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 6614 6615function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 6616 6617function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
6617onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 6618 6619var PdfBookPropsBuilder = function (_BookPropsBuilder) { 6620 _inherits(PdfBookPropsBuilder, _BookPropsBuilder); 6621 6622 function PdfBookPropsBuilder(src, onReady) { 6623 _classCallCheck(this, PdfBookPropsBuilder); 6624 6625 var _this = _possibleConstructorReturn(this, _BookPropsBuilder.call(this, onReady)); 6626 6627 _this.pdf = new _Pdf2.default(src); 6628 _this.pageDescription = { 6629 type: 'pdf', 6630 src: _this.pdf, 6631 interactive: true 6632 }; 6633 _this.binds = { 6634 pageCallback: _this.pageCallback.bind(_this) 6635 }; 6636 _this.pdf.getHandler(_this.init.bind(_this)); 6637 return _this; 6638 } 6639 6640 PdfBookPropsBuilder.prototype.dispose = function dispose() { 6641 this.pdf.dispose(); 6642 _BookPropsBuilder.prototype.dispose.call(this); 6643 }; 6644 6645 PdfBookPropsBuilder.prototype.init = function init(handler) { 6646 var _this2 = this; 6647 6648 var pages = this.pdf.getPagesNum(); 6649 this.calcSheets(pages); 6650 if (pages > 0) { 6651 handler.getPage(1).then(function (page) { 6652 var viewport = page.getViewport(1), 6653 size = { width: viewport.width, height: viewport.height }; 6654 _this2.calcProps(size.width, size.height); 6655 _this2.ready(); 6656 }).catch(function (e) { 6657 console.error(e); 6658 }); 6659 } else { 6660 this.props = this.defaults; 6661 this.ready(); 6662 } 6663 }; 6664 6665 PdfBookPropsBuilder.prototype.pageCallback = function pageCallback(n) { 6666 return this.pageDescription; 6667 }; 6668 6669 return PdfBookPropsBuilder; 6670}(_BookPropsBuilder3.default); 6671 6672exports.default = PdfBookPropsBuilder; 6673 6674/***/ }), 6675/* 35 */ 6676/***/ (function(module, exports, __webpack_require__) { 6677 6678"use strict"; 6679 6680 6681exports.__esModule = true; 6682 6683var _libs = __webpack_require__(1); 6684 6685function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 6686 6687var PdfLinksHandler = function () { 6688 function PdfLinksHandler(pdf, ctrl, element) { 6689 _classCallCheck(this, PdfLinksHandler); 6690 6691 this.pdf = pdf; 6692 this.ctrl = ctrl; 6693 this.element = (0, _libs.$)(element); 6694 this.cursors = []; 6695 } 6696 6697 PdfLinksHandler.prototype.dispose = function dispose() {}; 6698 6699 PdfLinksHandler.prototype.setHandler = function setHandler(handler) { 6700 this.handler = handler; 6701 }; 6702 6703 PdfLinksHandler.prototype.defaultHandler = function defaultHandler(type, destination) { 6704 if (type === 'internal') { 6705 this.ctrl.goToPage(destination); 6706 } else if (type === 'external') { 6707 window.open(destination, '_blank'); 6708 } 6709 }; 6710 6711 PdfLinksHandler.prototype.callHandlers = function callHandlers(type, destination) { 6712 if (!this.handler || !this.handler(type, destination)) { 6713 this.defaultHandler(type, destination); 6714 } 6715 }; 6716 6717 PdfLinksHandler.prototype.handleEvent = function handleEvent(data) { 6718 var _this = this; 6719 6720 var e = data.event, 6721 anno = data.annotation; 6722 switch (e.type) { 6723 case 'mouseover': 6724 { 6725 this.cursors.push(this.element.css('cursor')); 6726 this.element.css('cursor', 'pointer'); 6727 break; 6728 } 6729 case 'mouseout': 6730 { 6731 this.element.css('cursor', this.cursors.pop() || ''); 6732 break; 6733 } 6734 case 'touchtap': 6735 case 'click': 6736 { 6737 if (anno.url) { 6738 this.callHandlers('external', anno.url); 6739 } else if (anno.dest) { 6740 var destPromise = void 0; 6741 if (typeof anno.dest === 'string') { 6742 destPromise = this.pdf.handler.getDestination(anno.dest); 6743 } else { 6744 destPromise = Promise.resolve(anno.dest); 6745 } 6746 destPromise.then(function (dest) { 6747 return typeof dest[0] === 'number' ? dest[0] : _this.pdf.handler.getPageIndex(dest[0]); 6748 }).then(function (number) { 6749 return _this.callHandlers('internal', number); 6750 }).catch(function () { 6751 return console.error('Bad link'); 6752 }); 6753 } 6754 break; 6755 } 6756 } 6757 }; 6758 6759 return PdfLinksHandler; 6760}();
6761 6762exports.default = PdfLinksHandler; 6763 6764/***/ }), 6765/* 36 */ 6766/***/ (function(module, exports, __webpack_require__) { 6767 6768"use strict"; 6769 6770 6771exports.__esModule = true; 6772 6773var _Finder = __webpack_require__(17); 6774 6775var _Finder2 = _interopRequireDefault(_Finder); 6776 6777function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 6778 6779function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 6780 6781var SearchEngine = function () { 6782 function SearchEngine(pageCallback, pages) { 6783 _classCallCheck(this, SearchEngine); 6784 6785 this.pageCallback = pageCallback; 6786 this.pages = pages; 6787 this.results = []; 6788 } 6789 6790 SearchEngine.prototype.setQuery = function setQuery(query) { 6791 this.query = query; 6792 this.update = true; 6793 this.process(); 6794 }; 6795 6796 SearchEngine.prototype.process = function process() { 6797 var _this = this; 6798 6799 if (this.update) { 6800 var results = this.results; 6801 this.results = []; 6802 if (this.onPageHitsChanged) { 6803 for (var _iterator = results, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 6804 var _ref; 6805 6806 if (_isArray) { 6807 if (_i >= _iterator.length) break; 6808 _ref = _iterator[_i++]; 6809 } else { 6810 _i = _iterator.next(); 6811 if (_i.done) break; 6812 _ref = _i.value; 6813 } 6814 6815 var res = _ref; 6816 6817 this.onPageHitsChanged(undefined, ''); 6818 } 6819 } 6820 this.update = false; 6821 this.page = 0; 6822 this.stamp = Date.now(); 6823 if (this.query.length > 1) { 6824 this.process(); 6825 } 6826 } else { 6827 if (this.page < this.pages) { 6828 var stamp = this.stamp; 6829 this.find(this.pageCallback(this.page)).then(function (contexts) { 6830 if (stamp === _this.stamp) { 6831 if (contexts.length) { 6832 _this.results.push({ 6833 page: _this.page, 6834 contexts: contexts 6835 }); 6836 } 6837 if (_this.onPageHitsChanged) { 6838 _this.onPageHitsChanged(_this.page, _this.query); 6839 } 6840 ++_this.page; 6841 _this.process(); 6842 } 6843 }); 6844 } 6845 } 6846 }; 6847 6848 SearchEngine.prototype.find = function find(pi) { 6849 var _this2 = this; 6850 6851 var next = void 0; 6852 if (pi.type === 'pdf') { 6853 next = new Promise(function (resolve) { 6854 pi.src.getHandler(function () { 6855 var n = pi.number === undefined ? _this2.page : pi.number; 6856 if (pi.src.getPageType(n) === 'right') { 6857 resolve([]); 6858 } else { 6859 pi.src.getPage(n).then(function (page) { 6860 page.getTextContent().then(function (textContent) { 6861 resolve(new _Finder2.default(textContent.items.map(function (item) { 6862 return item.str; 6863 }), _this2.query, { hits: false }).getContexts()); 6864 }); 6865 }).catch(function () { 6866 return resolve([]); 6867 }); 6868 } 6869 }); 6870 }); 6871 } else { 6872 next = Promise.resolve([]); 6873 } 6874 return next; 6875 }; 6876 6877 return SearchEngine; 6878}(); 6879 6880exports.default = SearchEngine; 6881 6882/***/ }), 6883/* 37 */ 6884/***/ (function(module, exports, __webpack_require__) { 6885 6886"use strict"; 6887 6888 6889exports.__esModule = true; 6890 6891var _CSSLayer = __webpack_require__(13); 6892 6893var _CSSLayer2 = _interopRequireDefault(_CSSLayer); 6894 6895function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 6896 6897function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 6898 6899var SheetCssLayer = function () { 6900 function SheetCssLayer(visual, block, props) { 6901 _classCallCheck(this, SheetCssLayer); 6902 6903 this.visual = visual; 6904 var size = block.getTopSize(); 6905 this.layer = new _CSSLayer2.default(size.width, size.height, props); 6906 6907 this.update(block); 6908 this.visual.addCssObject(this.layer); 6909 } 6910 6911 SheetCssLayer.prototype.dispose = function dispose() {
6912 this.layer.dispose(); 6913 this.visual.removeCssObject(this.layer); 6914 }; 6915 6916 SheetCssLayer.prototype.isHidden = function isHidden() { 6917 return this.layer.isHidden(); 6918 }; 6919 6920 SheetCssLayer.prototype.hide = function hide() { 6921 return this.layer.hide(); 6922 }; 6923 6924 SheetCssLayer.prototype.show = function show() { 6925 return this.layer.show(); 6926 }; 6927 6928 SheetCssLayer.prototype.set = function set(css, html, js) { 6929 this.layer.setData(css, html, js); 6930 }; 6931 6932 SheetCssLayer.prototype.update = function update(block) { 6933 this.block = block; 6934 this.block.getTopWorldRotation(this.layer.rotation); 6935 this.block.getTopWorldPosition(this.layer.position); 6936 }; 6937 6938 return SheetCssLayer; 6939}(); 6940 6941exports.default = SheetCssLayer; 6942 6943/***/ }), 6944/* 38 */ 6945/***/ (function(module, exports, __webpack_require__) { 6946 6947"use strict"; 6948 6949 6950exports.__esModule = true; 6951 6952var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 6953 6954var _MathUtils = __webpack_require__(3); 6955 6956var _MathUtils2 = _interopRequireDefault(_MathUtils); 6957 6958function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 6959 6960function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 6961 6962var SheetPhysics = function () { 6963 SheetPhysics.targetForceClb = function targetForceClb(o, a, v, ch) { 6964 var l = a * this.r; 6965 return 100 * this.m * this.g * (2 / (1 + Math.exp(10 * (l - this.tl))) - 1) - this.m * 40 * v; 6966 }; 6967 6968 SheetPhysics.hoverCornerForceClb = function hoverCornerForceClb(o, v, l, ch) { 6969 return 5; 6970 }; 6971 6972 SheetPhysics.prototype.getTargetForceClb = function getTargetForceClb(mass, targetAngle) { 6973 return SheetPhysics.targetForceClb.bind({ 6974 g: this.p.gravity, 6975 m: mass, 6976 tl: targetAngle * this.p.r, 6977 r: this.p.r 6978 }); 6979 }; 6980 6981 SheetPhysics.dragForceClb = function dragForceClb(o, a, v, ch) { 6982 return o.flbt * o.m * (10 * o.g * ch - 50 * v / (1 + Math.exp(3.5 * Math.abs(ch)))); 6983 }; 6984 6985 SheetPhysics.dragCornerForceClb = function dragCornerForceClb(o, a, v, ch) { 6986 return 15 * (2 / (1 + Math.exp(10 * (a - this.ta) * o.r)) - 1); 6987 }; 6988 6989 SheetPhysics.getDragCornerForceClb = function getDragCornerForceClb(targetAngle) { 6990 return SheetPhysics.dragCornerForceClb.bind({ 6991 ta: targetAngle 6992 }); 6993 }; 6994 6995 function SheetPhysics() { 6996 var r = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; 6997 var gravity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 6998 var cornerDeviation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15; 6999 var fps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 240; 7000 7001 _classCallCheck(this, SheetPhysics); 7002 7003 this.p = { 7004 r: r, 7005 cornerDeviation: cornerDeviation, 7006 l: Math.PI * r, 7007 startDt: 1 / fps, 7008 gravity: gravity, 7009 margin: 0.002 * r, 7010 infM: 1e4, 7011 attempts: 16, 7012 maxIterations: 100 7013 }; 7014 this.os = []; 7015 } 7016 7017 SheetPhysics.prototype.dispose = function dispose() { 7018 this.os = []; 7019 }; 7020 7021 SheetPhysics.prototype.getSize = function getSize() { 7022 return this.os.length; 7023 }; 7024 7025 SheetPhysics.prototype.addObject = function addObject(mass, angle, velocity, flexibility, cornerHeight, simulateClb, removeClb) { 7026 var forceClb = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function () { 7027 return 0; 7028 }; 7029 var cornerForceClb = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : function () { 7030 return 0; 7031 }; 7032 7033 var no = { 7034 id: _MathUtils2.default.getUnique(), 7035 m: mass, 7036 v: velocity, 7037 l: angle * this.p.r, 7038 f: forceClb, 7039 cf: cornerForceClb, 7040 ch: cornerHeight, 7041 flbt: flexibility, 7042 simulateClb: simulateClb, 7043 removeClb: removeClb 7044 }; 7045 var i = this.os.findIndex(function (o) { 7046 return no.l <= o.l; 7047 });
7048 i = ~i ? i : this.os.length; 7049 this.os.splice(i, 0, no); 7050 return no.id; 7051 }; 7052 7053 SheetPhysics.prototype.getParametrMap = function getParametrMap(name) { 7054 var map = { 7055 mass: 'm', 7056 velocity: 'v', 7057 flexibility: 'flbt', 7058 cornerHeight: 'ch', 7059 simulateClb: 'simulateClb', 7060 removeClb: 'removeClb', 7061 forceClb: 'f', 7062 cornerForceClb: 'cf' 7063 }; 7064 return map[name]; 7065 }; 7066 7067 SheetPhysics.prototype.setParametr = function setParametr(id, name, value) { 7068 var o = this.os.find(function (o) { 7069 return o.id === id; 7070 }); 7071 if (name === 'angle') { 7072 o.l = value * this.p.r; 7073 } else { 7074 o[this.getParametrMap(name)] = value; 7075 } 7076 }; 7077 7078 SheetPhysics.prototype.getParametr = function getParametr(id, name) { 7079 var o = this.os.find(function (o) { 7080 return o.id === id; 7081 }); 7082 var value = void 0; 7083 if (name === 'angle') { 7084 value = o.l / this.p.r; 7085 } else { 7086 value = o[this.getParametrMap(name)]; 7087 } 7088 return value; 7089 }; 7090 7091 SheetPhysics.prototype.simulate = function simulate(T) { 7092 var t = 0, 7093 dt = this.p.startDt, 7094 attempt = 0, 7095 it = 0; 7096 7097 while (t < T && it < this.p.maxIterations) { 7098 if (dt > T - t) { 7099 dt = T - t; 7100 } 7101 var nos = this.integrate(this.os, dt), 7102 ci = this.findCollisions(nos); 7103 if (ci.num > 1 && attempt < this.p.attempts) { 7104 dt /= 2; 7105 ++attempt; 7106 } else { 7107 if (ci.num === 1) { 7108 var scos = this.solveCollision(nos[ci.last - 1], nos[ci.last]); 7109 nos[ci.last - 1] = scos[0]; 7110 nos[ci.last] = scos[1]; 7111 } else if (ci.num > 1) { 7112 var gs = []; 7113 var last = -2; 7114 for (var _iterator = ci.all, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 7115 var _ref; 7116 7117 if (_isArray) { 7118 if (_i >= _iterator.length) break; 7119 _ref = _iterator[_i++]; 7120 } else { 7121 _i = _iterator.next(); 7122 if (_i.done) break; 7123 _ref = _i.value; 7124 } 7125 7126 var i = _ref; 7127 7128 if (i - last > 1) { 7129 gs.push([]); 7130 } 7131 gs[gs.length - 1].push(i); 7132 last = i; 7133 } 7134 for (var _iterator2 = gs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 7135 var _ref2; 7136 7137 if (_isArray2) { 7138 if (_i2 >= _iterator2.length) break; 7139 _ref2 = _iterator2[_i2++]; 7140 } else { 7141 _i2 = _iterator2.next(); 7142 if (_i2.done) break; 7143 _ref2 = _i2.value; 7144 } 7145 7146 var g = _ref2; 7147 7148 var sg = void 0, 7149 i0 = void 0; 7150 if (nos[g[0]].l > Math.PI / 2 * this.p.r) { 7151 sg = -1; 7152 i0 = g[g.length - 1]; 7153 } else { 7154 sg = 1; 7155 i0 = g[0]; 7156 } 7157 for (var _i3 = i0; _i3 < nos.length && _i3 > -1; _i3 += sg) { 7158 var o = nos[_i3 + sg]; 7159 if (o && sg * (o.l - nos[_i3].l) <= this.p.margin) { 7160 o.l = nos[_i3].l + sg * 2 * this.p.margin; 7161 if (o.l > this.p.l || o.l < 0) { 7162 o.l = o.l > this.p.l ? this.p.l : 0; 7163 o.ch = 0; 7164 o.v = 0; 7165 console.error('Bad collision'); 7166 } 7167 } else { 7168 break; 7169 } 7170 } 7171 } 7172 } 7173 this.os = nos; 7174 this.findAndSolveCornerCollisions(); 7175 t += dt; 7176 dt = this.p.startDt; 7177 attempt = 0; 7178 } 7179 ++it; 7180 } 7181 7182 this.removeStatics(); 7183 }; 7184 7185 SheetPhysics.prototype.removeStatics = function removeStatics() { 7186 var nos = [], 7187 notify = [[], []]; 7188 for (var _iterator3 = this.os, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 7189 var _ref3; 7190 7191 if (_isArray3) { 7192 if (_i4 >= _iterator3.length) break; 7193 _ref3 = _iterator3[_i4++]; 7194 } else { 7195 _i4 = _iterator3.next(); 7196 if (_i4.done) break; 7197 _ref3 = _i4.value; 7198 } 7199 7200 var o = _ref3; 7201 7202 if (o.simulateClb) { 7203 o.simulateClb(o.l / this.p.r, o.ch); 7204 } 7205 if ((o.l === this.p.l || o.l === 0) && o.v === 0) { 7206 if (o.removeClb !== undefined) { 7207 notify[(o.l !== this.p.l) + 0].push(o); 7208 } 7209 } else { 7210 nos.push(o); 7211 } 7212 } 7213 this.os = nos; 7214 for (var _iterator4 = notify[0].reverse(), _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 7215 var _ref4; 7216 7217 if (_isArray4) { 7218 if (_i5 >= _iterator4.length) break; 7219 _ref4 = _iterator4[_i5++]; 7220 } else { 7221 _i5 = _iterator4.next(); 7222 if (_i5.done) break; 7223 _ref4 = _i5.value; 7224 } 7225 7226 var _o = _ref4; 7227 7228 _o.removeClb(Math.PI, _o.ch); 7229 } 7230 for (var _iterator5 = notify[1], _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { 7231 var _ref5; 7232 7233 if (_isArray5) { 7234 if (_i6 >= _iterator5.length) break; 7235 _ref5 = _iterator5[_i6++]; 7236 } else { 7237 _i6 = _iterator5.next(); 7238 if (_i6.done) break; 7239 _ref5 = _i6.value; 7240 } 7241 7242 var _o2 = _ref5; 7243 7244 _o2.removeClb(0, _o2.ch); 7245 } 7246 }; 7247 7248 SheetPhysics.prototype.findAndSolveCornerCollisions = function findAndSolveCornerCollisions() { 7249 if (this.os.length) { 7250 var os = [_extends({}, this.os[0], { 7251 l: 0, 7252 m: this.p.infM, 7253 ch: 0 7254 })].concat(this.os, [_extends({}, this.os[0], { 7255 l: 1.05 * this.p.l, 7256 m: this.p.infM, 7257 ch: 0 7258 })]); 7259 7260 for (var i = 1; i < os.length; ++i) { 7261 var a = os[i - 1], 7262 b = os[i], 7263 al = a.l + this.p.cornerDeviation * a.ch * this.p.r, 7264 bl = b.l + this.p.cornerDeviation * b.ch * this.p.r; 7265 if (1.05 * al > bl && a.ch > b.ch) { 7266 var dCh = a.ch - b.ch, 7267 dv = a.m / a.flbt + b.m / b.flbt, 7268 ka = a.m / a.flbt / dv, 7269 kb = b.m / b.flbt / dv; 7270 a.ch = a.ch - kb * dCh; 7271 b.ch = b.ch + ka * dCh; 7272 } 7273 } 7274 } 7275 }; 7276 7277 SheetPhysics.prototype.solveCollision = function solveCollision(a, b) { 7278 var mm = b.m + a.m, 7279 av = (-a.v * b.m + a.m * a.v + 2 * b.m * b.v) / mm, 7280 bv = (b.m * b.v - b.v * a.m + 2 * a.m * a.v) / mm; 7281 return [_extends({}, a, { v: av }), _extends({}, b, { v: bv })]; 7282 }; 7283 7284 SheetPhysics.prototype.findCollisions = function findCollisions(os) { 7285 var ci = { 7286 num: 0, 7287 last: 0, 7288 all: [] 7289 }; 7290 for (var i = 1; i < os.length && ci.num < 2; ++i) { 7291 if (os[i - 1].l > os[i].l || this.isCollision(os[i - 1], os[i])) { 7292 if (os[i - 1].l > os[i].l) { 7293 ++ci.num; 7294 } 7295 ++ci.num; 7296 ci.last = i; 7297 if (ci.all.indexOf(i - 1) === -1) { 7298 ci.all.push(i - 1); 7299 } 7300 if (ci.all.indexOf(i) === -1) { 7301 ci.all.push(i); 7302 } 7303 } 7304 } 7305 return ci; 7306 }; 7307 7308 SheetPhysics.prototype.isCollision = function isCollision(a, b) { 7309 return Math.abs(a.l - b.l) < this.p.margin && a.v > b.v; 7310 }; 7311 7312 SheetPhysics.prototype.integrate = function integrate(os, dt) { 7313 var nos = []; 7314 for (var _iterator6 = os, _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { 7315 var _ref6; 7316 7317 if (_isArray6) { 7318 if (_i7 >= _iterator6.length) break; 7319 _ref6 = _iterator6[_i7++]; 7320 } else { 7321 _i7 = _iterator6.next(); 7322 if (_i7.done) break; 7323 _ref6 = _i7.value; 7324 } 7325 7326 var o = _ref6; 7327 7328 var vl = _MathUtils2.default.rk4(this.dy.bind({ 7329 g: this.p.gravity, 7330 r: this.p.r, 7331 m: o.m, 7332 f: o.f, 7333 cf: o.cf, 7334 ch: o.ch, 7335 flbt: o.flbt 7336 }), 0, dt, [o.v, o.l, o.ch]); 7337 var no = _extends({}, o, { 7338 v: vl[0], 7339 l: vl[1], 7340 ch: vl[2] 7341 }); 7342 if (no.l <= 0 || no.l >= this.p.l) { 7343 no.l = no.l <= 0 ? 0 : this.p.l; 7344 no.v = 0; 7345 no.ch = 0; 7346 } 7347 nos.push(no); 7348 } 7349 return nos; 7350 }; 7351 7352 SheetPhysics.prototype.dy = function dy(t, y) { 7353 var v = y[0], 7354 l = y[1], 7355 ch = y[2], 7356 f = this.f(this, l / this.r, v, ch), 7357 cf = this.cf(this, l / this.r, v, ch); 7358 return [(-this.g * Math.cos(l / this.r) * this.m + f) / this.m, v + 0.01 * (Math.random() - 0.5), this.flbt * ((2 / (1 + Math.exp(-0.2 * cf)) - 1) * (1 - 2 / (1 + Math.exp(-5 * (Math.abs(ch) - 2)))) - ch)]; 7359 }; 7360 7361 return SheetPhysics; 7362}(); 7363 7364exports.default = SheetPhysics; 7365 7366/***/ }), 7367/* 39 */ 7368/***/ (function(module, exports, __webpack_require__) { 7369 7370"use strict"; 7371 7372 7373exports.__esModule = true; 7374 7375function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 7376 7377var SoundsEnviroment = function () { 7378 function SoundsEnviroment() { 7379 var template = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 7380 7381 _classCallCheck(this, SoundsEnviroment); 7382 7383 this.sounds = template.sounds || {}; 7384 this.audio = {}; 7385 if (this.sounds.startFlip) { 7386 this.audio.startFlip = new Audio(this.sounds.startFlip); 7387 } 7388 if (this.sounds.endFlip) { 7389 this.audio.endFlip = new Audio(this.sounds.endFlip); 7390 } 7391 } 7392 7393 SoundsEnviroment.prototype.setEnabled = function setEnabled(enabled) { 7394 this.enabled = enabled; 7395 }; 7396 7397 SoundsEnviroment.prototype.togle = function togle() { 7398 this.enabled = !this.enabled; 7399 }; 7400 7401 SoundsEnviroment.prototype.dispose = function dispose() { 7402 delete this.audio.startFlip; 7403 delete this.audio.endFlip; 7404 }; 7405 7406 SoundsEnviroment.prototype.startFlip = function startFlip() { 7407 if (this.enabled && this.audio.startFlip) { 7408 this.audio.startFlip.play(); 7409 } 7410 }; 7411 7412 SoundsEnviroment.prototype.endFlip = function endFlip() { 7413 if (this.enabled && this.audio.startFlip) { 7414 this.audio.startFlip.pause(); 7415 this.audio.startFlip.currentTime = 0; 7416 } 7417 if (this.enabled && this.audio.endFlip) { 7418 this.audio.endFlip.play(); 7419 } 7420 }; 7421 7422 SoundsEnviroment.prototype.subscribeFlips = function subscribeFlips(emitter) { 7423 emitter.addEventListener('startFlip', this.startFlip.bind(this)); 7424 emitter.addEventListener('endFlip', this.endFlip.bind(this)); 7425 }; 7426 7427 return SoundsEnviroment; 7428}();
7429 7430exports.default = SoundsEnviroment; 7431 7432/***/ }), 7433/* 40 */ 7434/***/ (function(module, exports, __webpack_require__) { 7435 7436"use strict"; 7437 7438 7439exports.__esModule = true; 7440 7441var _WidgetController2 = __webpack_require__(67); 7442 7443var _WidgetController3 = _interopRequireDefault(_WidgetController2); 7444 7445function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 7446 7447function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 7448 7449function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 7450 7451function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 7452 7453var TocController = function (_WidgetController) { 7454 _inherits(TocController, _WidgetController); 7455 7456 function TocController(view, bookCtrl) { 7457 _classCallCheck(this, TocController); 7458 7459 var _this = _possibleConstructorReturn(this, _WidgetController.call(this, view)); 7460 7461 _this.bookCtrl = bookCtrl; 7462 _this.tab = 'none'; 7463 return _this; 7464 } 7465 7466 TocController.prototype.setThumbnails = function setThumbnails(thumbnails) { 7467 this.thumbnails = thumbnails; 7468 thumbnails.onNavigate = this.navigateThumbnails.bind(this); 7469 if (this.tab === 'none') { 7470 this.tab = 'thumbnails'; 7471 } 7472 this.fireChange(); 7473 }; 7474 7475 TocController.prototype.setSearch = function setSearch(search) { 7476 this.search = search; 7477 search.onNavigate = this.navigateSearch.bind(this); 7478 this.fireChange(); 7479 }; 7480 7481 TocController.prototype.setBookmarks = function setBookmarks(bookmarks, pdf) { 7482 this.bookmarks = bookmarks; 7483 this.pdf = pdf; 7484 bookmarks.onNavigate = this.navigateBookmarks.bind(this); 7485 if (bookmarks.getSize()) { 7486 this.tab = 'bookmarks'; 7487 this.isBookmarks = true; 7488 } 7489 this.fireChange(); 7490 }; 7491 7492 TocController.prototype.cmdBookmarks = function cmdBookmarks() { 7493 this.tab = 'bookmarks'; 7494 this.fireChange(); 7495 }; 7496 7497 TocController.prototype.cmdThumbnails = function cmdThumbnails() { 7498 this.tab = 'thumbnails'; 7499 this.fireChange(); 7500 }; 7501 7502 TocController.prototype.cmdSearch = function cmdSearch() { 7503 this.tab = 'search'; 7504 this.fireChange(); 7505 }; 7506 7507 TocController.prototype.cmdCloseToc = function cmdCloseToc() { 7508 this.hide(); 7509 }; 7510 7511 TocController.prototype.navigateThumbnails = function navigateThumbnails(number) { 7512 this.bookCtrl.goToPage(number); 7513 }; 7514 7515 TocController.prototype.navigateSearch = function navigateSearch(number) { 7516 this.bookCtrl.goToPage(number); 7517 }; 7518 7519 TocController.prototype.navigateBookmarks = function navigateBookmarks(item) { 7520 var _this2 = this; 7521 7522 if (item.url) { 7523 window.open(item.url, '_blank'); 7524 } else if (item.dest) { 7525 var destPromise = void 0; 7526 if (typeof item.dest === 'string') { 7527 destPromise = this.pdf.handler.getDestination(item.dest); 7528 } else { 7529 destPromise = Promise.resolve(item.dest); 7530 } 7531 destPromise.then(function (dest) { 7532 return _this2.pdf.handler.getPageIndex(dest[0]); 7533 }).then(function (number) { 7534 return _this2.bookCtrl.goToPage(number); 7535 }).catch(function () { 7536 return console.error('Bad bookmark'); 7537 }); 7538 } 7539 }; 7540 7541 TocController.prototype.updateView = function updateView() { 7542 var _this3 = this; 7543 7544 if (this.view) { 7545 this.view.setState('widTocMenu', { 7546 enable: true, 7547 visible: true, 7548 active: false 7549 }); 7550 this.view.setState('widThumbnails', { 7551 enable: true, 7552 visible: this.tab === 'thumbnails', 7553 active: false 7554 }); 7555 this.view.setState('widSearch', { 7556 enable: true, 7557 visible: this.tab === 'search', 7558 active: false 7559 }); 7560 this.view.setState('widBookmarks', { 7561 enable: true, 7562 visible: this.tab === 'bookmarks', 7563 active: false 7564 }); 7565 this.view.setState('cmdBookmarks', { 7566 enable: true, 7567 visible: true, 7568 active: this.tab === 'bookmarks' 7569 }); 7570 this.view.setState('cmdCloseToc', { 7571 enable: true, 7572 visible: true, 7573 active: false 7574 }); 7575 this.view.setState('cmdThumbnails', { 7576 enable: true, 7577 visible: true, 7578 active: this.tab === 'thumbnails' 7579 }); 7580 this.view.setState('cmdSearch', { 7581 enable: true, 7582 visible: true, 7583 active: this.tab === 'search' 7584 }); 7585 Promise.resolve().then(function () { 7586 return _this3.thumbnails.setEnable(_this3.visible && _this3.tab === 'thumbnails'); 7587 }); 7588 _WidgetController.prototype.updateView.call(this); 7589 } 7590 }; 7591 7592 return TocController; 7593}(_WidgetController3.default); 7594 7595exports.default = TocController; 7596 7597/***/ }), 7598/* 41 */ 7599/***/ (function(module, exports, __webpack_require__) { 7600 7601"use strict"; 7602 7603 7604exports.__esModule = true; 7605 7606var _libs = __webpack_require__(1); 7607 7608var _ThreeUtils = __webpack_require__(20); 7609 7610var _ThreeUtils2 = _interopRequireDefault(_ThreeUtils); 7611 7612function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 7613 7614var resX = 11, 7615 resY = 2, 7616 resZ = 15, 7617 scale = 1, 7618 faces = []; 7619 7620var frontGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resY - 1); 7621frontGeometry.translate(0.5 * scale, 0.5 * scale, scale); 7622var backGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resY - 1); 7623backGeometry.rotateY(Math.PI); 7624backGeometry.translate(0.5 * scale, 0.5 * scale, 0); 7625var leftGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resZ - 1, resY - 1); 7626leftGeometry.rotateY(-Math.PI / 2); 7627leftGeometry.translate(0, 0.5 * scale, 0.5 * scale); 7628var rightGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resZ - 1, resY - 1); 7629rightGeometry.rotateY(Math.PI / 2); 7630rightGeometry.translate(scale, 0.5 * scale, 0.5 * scale); 7631var topGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resZ - 1); 7632topGeometry.rotateX(-Math.PI / 2); 7633topGeometry.translate(0.5 * scale, scale, 0.5 * scale); 7634var bottomGeometry = topGeometry.clone(); 7635bottomGeometry.translate(0, -scale, 0); 7636for (var _iterator = bottomGeometry.faces, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 7637 var _ref; 7638 7639 if (_isArray) { 7640 if (_i >= _iterator.length) break; 7641 _ref = _iterator[_i++]; 7642 } else { 7643 _i = _iterator.next(); 7644 if (_i.done) break; 7645 _ref = _i.value; 7646 } 7647 7648 var f = _ref;
7649 var _ref3 = [f.b, f.a]; 7650 f.a = _ref3[0]; 7651 f.b = _ref3[1]; 7652} 7653 7654var geometry = new _libs.THREE.Geometry(); 7655geometry.vertices = [].concat(bottomGeometry.vertices, topGeometry.vertices); 7656 7657var addFaces = function addFaces(fs, map) { 7658 for (var _iterator2 = fs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 7659 var _ref2; 7660 7661 if (_isArray2) { 7662 if (_i2 >= _iterator2.length) break; 7663 _ref2 = _iterator2[_i2++]; 7664 } else { 7665 _i2 = _iterator2.next(); 7666 if (_i2.done) break; 7667 _ref2 = _i2.value; 7668 } 7669 7670 var f = _ref2; 7671 7672 geometry.faces.push(new _libs.THREE.Face3(map(f.a), map(f.b), map(f.c))); 7673 } 7674 faces.push(geometry.faces.length); 7675}; 7676 7677var mapVertices = function mapVertices(src, dst) { 7678 var map = []; 7679 var eq = function eq(a, b) { 7680 return Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z) < 1e-4; 7681 }; 7682 for (var i = 0; i < src.length; ++i) { 7683 for (var j = 0; j < dst.length; ++j) { 7684 if (eq(src[i], dst[j])) { 7685 map[i] = j; 7686 break; 7687 } 7688 } 7689 } 7690 return map; 7691}; 7692 7693var frontMap = mapVertices(frontGeometry.vertices, geometry.vertices); 7694var backMap = mapVertices(backGeometry.vertices, geometry.vertices); 7695var leftMap = mapVertices(leftGeometry.vertices, geometry.vertices); 7696var rightMap = mapVertices(rightGeometry.vertices, geometry.vertices); 7697 7698addFaces(topGeometry.faces, function (i) { 7699 return i + bottomGeometry.vertices.length; 7700}); 7701addFaces(bottomGeometry.faces, function (i) { 7702 return i; 7703}); 7704addFaces(frontGeometry.faces, function (i) { 7705 return frontMap[i]; 7706}); 7707addFaces(backGeometry.faces, function (i) { 7708 return backMap[i]; 7709}); 7710addFaces(leftGeometry.faces, function (i) { 7711 return leftMap[i]; 7712}); 7713addFaces(rightGeometry.faces, function (i) { 7714 return rightMap[i]; 7715}); 7716faces.pop(); 7717 7718_ThreeUtils2.default.computeFaceVertexUvs(geometry, faces); 7719 7720geometry.computeVertexNormals(); 7721//geometry.computeFaceNormals(); 7722geometry.computeBoundingSphere(); 7723//geometry.computeBoundingBox(); 7724geometry.verticesNeedUpdate = true; 7725 7726exports.default = { 7727 resX: resX, 7728 resY: resY, 7729 resZ: resZ, 7730 faces: faces, 7731 geometry: geometry 7732}; 7733 7734/***/ }), 7735/* 42 */ 7736/***/ (function(module, exports, __webpack_require__) { 7737 7738"use strict"; 7739 7740 7741exports.__esModule = true; 7742exports.props = props; 7743var mouseButtons = { 7744 Left: 0, 7745 Middle: 1, 7746 Right: 2 7747}; 7748 7749function props() { 7750 return { 7751 eps: 1e-4, 7752 skin: { 7753 default: 'short-white-book-view' 7754 }, 7755 scale: { 7756 default: 0.9, 7757 min: 0.9, 7758 max: 2.5, 7759 levels: 7 7760 }, 7761 lighting: { 7762 default: 0.7, 7763 min: 0, 7764 max: 1, 7765 levels: 7 7766 }, 7767 pan: { 7768 speed: 50 7769 }, 7770 loadingAnimation: { 7771 skin: false, 7772 book: true 7773 }, 7774 autoResolution: { 7775 enabled: true, 7776 coefficient: 1.5 7777 }, 7778 narrowView: { 7779 width: 500 7780 }, 7781 actions: { 7782 cmdZoomIn: { 7783 enabled: true, 7784 enabledInNarrow: true 7785 }, 7786 cmdZoomOut: { 7787 enabled: true, 7788 enabledInNarrow: true 7789 }, 7790 cmdDefaultZoom: { 7791 enabled: true, 7792 enabledInNarrow: false, 7793 type: 'dblclick', 7794 code: 0 7795 }, 7796 cmdToc: { 7797 enabled: true, 7798 enabledInNarrow: true 7799 }, 7800 cmdFastBackward: { 7801 enabled: false, 7802 enabledInNarrow: false 7803 }, 7804 cmdBackward: { 7805 enabled: true, 7806 enabledInNarrow: false 7807 }, 7808 cmdBigBackward: { 7809 enabled: true, 7810 enabledInNarrow: true 7811 }, 7812 cmdForward: { 7813 enabled: true, 7814 enabledInNarrow: false 7815 }, 7816 cmdBigForward: { 7817 enabled: true, 7818 enabledInNarrow: true 7819 }, 7820 cmdFastForward: { 7821 enabled: false, 7822 enabledInNarrow: false 7823 }, 7824 cmdSave: { 7825 enabled: true, 7826 enabledInNarrow: true 7827 }, 7828 cmdPrint: { 7829 enabled: true,
7830 enabledInNarrow: false 7831 }, 7832 cmdFullScreen: { 7833 enabled: true, 7834 enabledInNarrow: true 7835 }, 7836 widSettings: { 7837 enabled: true, 7838 enabledInNarrow: true 7839 }, 7840 cmdSmartPan: { 7841 enabled: true, 7842 enabledInNarrow: true, 7843 active: true 7844 }, 7845 cmdSinglePage: { 7846 enabled: true, 7847 enabledInNarrow: true, 7848 active: false, 7849 activeForMobile: false 7850 }, 7851 cmdSounds: { 7852 enabled: true, 7853 enabledInNarrow: true, 7854 active: true 7855 }, 7856 cmdStats: { 7857 enabled: true, 7858 enabledInNarrow: true, 7859 active: false 7860 }, 7861 cmdLightingUp: { 7862 enabled: true, 7863 enabledInNarrow: true 7864 }, 7865 cmdLightingDown: { 7866 enabled: true, 7867 enabledInNarrow: true 7868 }, 7869 cmdPanLeft: { 7870 enabled: false 7871 }, 7872 cmdPanRight: { 7873 enabled: false 7874 }, 7875 cmdPanUp: { 7876 enabled: false 7877 }, 7878 cmdPanDown: { 7879 enabled: false 7880 }, 7881 mouseCmdRotate: { 7882 enabled: true, 7883 type: 'mousedrag', 7884 code: mouseButtons.Right 7885 }, 7886 mouseCmdDragZoom: { 7887 enabled: true, 7888 type: 'mousedrag', 7889 code: mouseButtons.Middle 7890 }, 7891 mouseCmdPan: { 7892 enabled: true, 7893 type: 'mousedrag', 7894 code: mouseButtons.Left 7895 }, 7896 mouseCmdWheelZoom: { 7897 enabled: true, 7898 type: 'mousewheel', 7899 code: 0 7900 }, 7901 touchCmdRotate: { 7902 enabled: true, 7903 type: 'touchdrag', 7904 code: 3 7905 }, 7906 touchCmdZoom: { 7907 enabled: true, 7908 type: 'touchdrag', 7909 code: 2 7910 }, 7911 touchCmdPan: { 7912 enabled: true, 7913 type: 'touchdrag', 7914 code: 1 7915 }, 7916 touchCmdSwipe: { 7917 enabled: true, 7918 type: 'touchdrag', 7919 code: 1 7920 } 7921 } 7922 }; 7923}; 7924 7925/***/ }), 7926/* 43 */ 7927/***/ (function(module, exports, __webpack_require__) { 7928 7929"use strict"; 7930 7931 7932exports.__esModule = true; 7933 7934var _libs = __webpack_require__(0); 7935 7936var _ImageBase2 = __webpack_require__(5); 7937 7938var _ImageBase3 = _interopRequireDefault(_ImageBase2); 7939 7940function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 7941 7942function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 7943 7944function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 7945 7946function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 7947 7948var BlankImage = function (_ImageBase) { 7949 _inherits(BlankImage, _ImageBase); 7950 7951 function BlankImage(context, width, height, color) { 7952 _classCallCheck(this, BlankImage); 7953 7954 var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); 7955 7956 Promise.resolve().then(function () { 7957 _this.startRender = function () { 7958 _this.renderBlankPage(); 7959 _this.finishRender(); 7960 }; 7961 _this.finishLoad(); 7962 }); 7963 return _this; 7964 } 7965 7966 return BlankImage; 7967}(_ImageBase3.default); 7968 7969exports.default = BlankImage; 7970 7971/***/ }), 7972/* 44 */ 7973/***/ (function(module, exports, __webpack_require__) { 7974 7975"use strict"; 7976 7977 7978exports.__esModule = true; 7979 7980var _libs = __webpack_require__(0); 7981 7982function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 7983 7984var Bookmarks = function () { 7985 function Bookmarks(container, items) { 7986 var _this = this; 7987 7988 var getTitle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (i) { 7989 return i.title; 7990 }; 7991 var getItems = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (i) { 7992 return i.items; 7993 }; 7994 7995 _classCallCheck(this, Bookmarks); 7996 7997 this.container = container; 7998 this.map = []; 7999 this.getTitle = getTitle; 8000 this.getItems = getItems; 8001 this.nodes = this.mapNodes(items, this.map); 8002 8003 this.binds = { 8004 togle: function togle(e) { 8005 e.preventDefault(); 8006 var li = (0, _libs.$)(e.target); 8007 while (li[0] && li[0] !== container[0] && !li.hasClass('item')) { 8008 li = (0, _libs.$)(li[0].parentNode); 8009 } 8010 if (li.hasClass('item')) { 8011 var cmd = (0, _libs.$)(e.target); 8012 while (cmd[0] && cmd[0] !== li[0] && !cmd.hasClass('cmd')) { 8013 cmd = (0, _libs.$)(cmd[0].parentNode); 8014 } 8015 if (cmd.hasClass('cmd')) { 8016 var node = _this.map[li.attr('data-id')]; 8017 if (cmd.hasClass('togle')) { 8018 node.minimized = !node.minimized; 8019 if (node.minimized) { 8020 li.find('ul').remove(); 8021 li.find('.togle').addClass('minimized'); 8022 } else { 8023 li.find('.togle').removeClass('minimized'); 8024 li.append((_this.renderNode(node).match(/<ul.*<\/ul>/) || [''])[0]); 8025 } 8026 } else { 8027 if (_this.onNavigate) { 8028 _this.onNavigate(node.item); 8029 } 8030 } 8031 } 8032 } 8033 } 8034 }; 8035 8036 container.on('click', this.binds.togle); 8037 this.update(); 8038 } 8039 8040 Bookmarks.prototype.getSize = function getSize() { 8041 return this.map.length; 8042 }; 8043 8044 Bookmarks.prototype.dispose = function dispose() { 8045 this.container.off('click', this.binds.togle); 8046 this.container.html(''); 8047 }; 8048
8049 Bookmarks.prototype.update = function update() { 8050 this.container.html(this.renderNodes(this.nodes)); 8051 }; 8052 8053 Bookmarks.prototype.forEach = function forEach(f) { 8054 var nodes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.nodes; 8055 8056 for (var _iterator = nodes || [], _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 8057 var _ref; 8058 8059 if (_isArray) { 8060 if (_i >= _iterator.length) break; 8061 _ref = _iterator[_i++]; 8062 } else { 8063 _i = _iterator.next(); 8064 if (_i.done) break; 8065 _ref = _i.value; 8066 } 8067 8068 var node = _ref; 8069 8070 f(node); 8071 this.forEach(f, node.children); 8072 } 8073 }; 8074 8075 Bookmarks.prototype.expand = function expand() { 8076 this.forEach(function (n) { 8077 return n.minimized = false; 8078 }); 8079 this.update(); 8080 }; 8081 8082 Bookmarks.prototype.minimize = function minimize() { 8083 this.forEach(function (n) { 8084 return n.minimized = true; 8085 }); 8086 this.update(); 8087 }; 8088 8089 Bookmarks.prototype.renderNode = function renderNode(node) { 8090 return ['<div class="area">', node.children ? '<a href="#" class="cmd togle' + (node.minimized ? ' minimized' : '') + '"><i class="fa fa-angle-right"></i></a> ' : '<i class="white-space"></i> ', '<a class="cmd" title="', node.title, '" href="#">', node.title, '</a></div>', node.minimized ? '' : this.renderNodes(node.children)].join(''); 8091 }; 8092 8093 Bookmarks.prototype.renderNodes = function renderNodes(nodes) { 8094 var res = ['<div class="bookmarks">']; 8095 if (nodes && nodes.length) { 8096 res.push('<ul class="level-', nodes[0].level, '">'); 8097 for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 8098 var _ref2; 8099 8100 if (_isArray2) { 8101 if (_i2 >= _iterator2.length) break; 8102 _ref2 = _iterator2[_i2++]; 8103 } else { 8104 _i2 = _iterator2.next(); 8105 if (_i2.done) break; 8106 _ref2 = _i2.value; 8107 } 8108 8109 var node = _ref2; 8110 8111 res.push(['<li class="item" data-id="', node.id, '">', this.renderNode(node), '</li>'].join('')); 8112 } 8113 res.push('</ul>'); 8114 } 8115 res.push('</div>'); 8116 return res.join(''); 8117 }; 8118 8119 Bookmarks.prototype.mapNodes = function mapNodes(items) { 8120 var map = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; 8121 var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; 8122 8123 var nodes = null; 8124 if (items && items.length) { 8125 nodes = []; 8126 for (var _iterator3 = items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 8127 var _ref3; 8128 8129 if (_isArray3) { 8130 if (_i3 >= _iterator3.length) break; 8131 _ref3 = _iterator3[_i3++]; 8132 } else { 8133 _i3 = _iterator3.next(); 8134 if (_i3.done) break; 8135 _ref3 = _i3.value; 8136 } 8137 8138 var item = _ref3; 8139 8140 var id = map.length; 8141 map.push(undefined); 8142 var node = { 8143 id: id, 8144 title: this.getTitle(item), 8145 level: level, 8146 item: item, 8147 minimized: true, 8148 children: this.mapNodes(this.getItems(item), map, level + 1) 8149 }; 8150 nodes.push(node); 8151 map[id] = node; 8152 } 8153 } 8154 return nodes; 8155 }; 8156 8157 return Bookmarks; 8158}(); 8159 8160exports.default = Bookmarks; 8161 8162/***/ }), 8163/* 45 */ 8164/***/ (function(module, exports, __webpack_require__) { 8165 8166"use strict"; 8167 8168 8169exports.__esModule = true; 8170 8171var _libs = __webpack_require__(0); 8172 8173function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 8174 8175var Detector = function () { 8176 function Detector() { 8177 _classCallCheck(this, Detector); 8178 } 8179 8180 Detector.getWebGLErrorMessage = function getWebGLErrorMessage() { 8181 var element = document.createElement('div');
8182 element.id = 'webgl-error-message'; 8183 element.style.fontFamily = 'monospace'; 8184 element.style.fontSize = '13px'; 8185 element.style.fontWeight = 'normal'; 8186 element.style.textAlign = 'center'; 8187 element.style.background = '#fff'; 8188 element.style.color = '#000'; 8189 element.style.padding = '1.5em'; 8190 element.style.width = '400px'; 8191 element.style.margin = '5em auto 0'; 8192 8193 if (!Detector.webgl) { 8194 element.innerHTML = window.WebGLRenderingContext ? ['Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br />', 'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.'].join('\n') : ['Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br/>', 'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.'].join('\n'); 8195 } 8196 return element; 8197 }; 8198 8199 Detector.addGetWebGLMessage = function addGetWebGLMessage(parameters) { 8200 var parent = void 0, 8201 id = void 0, 8202 element = void 0; 8203 parameters = parameters || {}; 8204 8205 parent = parameters.parent || (0, _libs.$)(document.body); 8206 id = parameters.id || 'oldie'; 8207 8208 element = Detector.getWebGLErrorMessage(); 8209 //element.id = id; 8210 8211 parent.append(element); 8212 }; 8213 8214 return Detector; 8215}(); 8216 8217Detector.canvas = !!window.CanvasRenderingContext2D; 8218 8219Detector.webgl = function () { 8220 try { 8221 var canvas = document.createElement('canvas'); 8222 return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))); 8223 } catch (e) { 8224 return false; 8225 } 8226}(); 8227 8228Detector.workers = !!window.Worker; 8229Detector.fileapi = window.File && window.FileReader && window.FileList && window.Blob; 8230exports.default = Detector; 8231 8232/***/ }), 8233/* 46 */ 8234/***/ (function(module, exports, __webpack_require__) { 8235 8236"use strict"; 8237 8238 8239exports.__esModule = true; 8240 8241var _libs = __webpack_require__(0); 8242 8243function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 8244 8245var DocMouseSimulator = function () { 8246 function DocMouseSimulator(jFrame, element) { 8247 var bElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document.body; 8248 8249 _classCallCheck(this, DocMouseSimulator); 8250 8251 this.jFrame = jFrame; 8252 this.wnd = jFrame[0].contentWindow; 8253 this.doc = jFrame[0].contentDocument; 8254 this.element = element || doc.body; 8255 this.bElement = bElement; 8256 this.resendProperties = this.getDefaultResendProperties(); 8257 this.undefinedProperties = this.getDefaultUndefinedProperties(); 8258 this.cursors = []; 8259 this.onDocChangeClbs = []; 8260 var terms = [{ 8261 find: ':hover', 8262 replace: '.' + DocMouseSimulator.HOVER 8263 }, { 8264 find: ':active', 8265 replace: '.' + DocMouseSimulator.ACTIVE 8266 }]; 8267 var style = ['<style type="text/css">']; 8268 for (var i = 0; i < this.doc.styleSheets.length; ++i) { 8269 var ss = this.doc.styleSheets[i]; 8270 for (var j = 0; j < ss.cssRules.length; ++j) { 8271 var r = ss.cssRules[j], 8272 cssText = void 0; 8273 for (var _iterator = terms, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 8274 var _ref; 8275 8276 if (_isArray) { 8277 if (_i >= _iterator.length) break; 8278 _ref = _iterator[_i++]; 8279 } else { 8280 _i = _iterator.next(); 8281 if (_i.done) break; 8282 _ref = _i.value; 8283 } 8284 8285 var term = _ref; 8286 8287 if (~r.selectorText.indexOf(term.find)) { 8288 cssText = (cssText || r.cssText).replace(new RegExp(term.find, 'g'), term.replace); 8289 } 8290 } 8291 if (cssText) { 8292 style.push(cssText); 8293 } 8294 } 8295 } 8296 style.push('</style>'); 8297 (0, _libs.$)(this.doc.head).append((0, _libs.$)(style.join(''))); 8298 } 8299 8300 DocMouseSimulator.prototype.convertCoords = function convertCoords(x, y) { 8301 var jElement = (0, _libs.$)(this.element); 8302 var offset = jElement.offset(); 8303 return { 8304 x: offset.left + jElement.width() * x, 8305 y: offset.top + jElement.height() * (1 - y) 8306 }; 8307 }; 8308 8309 DocMouseSimulator.prototype.triggerEvent = function triggerEvent(element, e, p, type, advancedProps) { 8310 var props = {}; 8311 for (var _iterator2 = this.resendProperties, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 8312 var _ref2; 8313 8314 if (_isArray2) { 8315 if (_i2 >= _iterator2.length) break; 8316 _ref2 = _iterator2[_i2++]; 8317 } else { 8318 _i2 = _iterator2.next(); 8319 if (_i2.done) break; 8320 _ref2 = _i2.value; 8321 } 8322 8323 var _n = _ref2; 8324 8325 props[_n] = e[_n]; 8326 } 8327 for (var _iterator3 = this.undefinedProperties, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 8328 var _ref3; 8329 8330 if (_isArray3) { 8331 if (_i3 >= _iterator3.length) break; 8332 _ref3 = _iterator3[_i3++]; 8333 } else { 8334 _i3 = _iterator3.next(); 8335 if (_i3.done) break; 8336 _ref3 = _i3.value; 8337 } 8338 8339 var _n2 = _ref3; 8340 8341 props[_n2] = undefined; 8342 } 8343 for (var n in advancedProps) { 8344 if (advancedProps.hasOwnProperty(n)) { 8345 props[n] = advancedProps[n]; 8346 } 8347 } 8348 props.view = this.wnd; 8349 props.pageX = p.x; 8350 props.pageY = p.y; 8351 var jE = _libs.$.Event(type, props); 8352 jE.timeStamp = e.timeStamp; 8353 (0, _libs.$)(element).trigger(jE); 8354 }; 8355 8356 DocMouseSimulator.prototype.addClass = function addClass(element, name) { 8357 (0, _libs.$)(element).addClass(name); 8358 var style = this.wnd.getComputedStyle(element); 8359 this.cursors.push((0, _libs.$)(this.bElement).css('cursor')); 8360 (0, _libs.$)(this.bElement).css('cursor', style.getPropertyValue('cursor')); 8361 }; 8362 8363 DocMouseSimulator.prototype.removeClass = function removeClass(element, name) { 8364 (0, _libs.$)(element).removeClass(name); 8365 (0, _libs.$)(this.bElement).css('cursor', this.cursors.pop()); 8366 }; 8367 8368 DocMouseSimulator.prototype.enterElement = function enterElement(element) { 8369 this.addClass(element, DocMouseSimulator.HOVER); 8370 }; 8371 8372 DocMouseSimulator.prototype.leaveElement = function leaveElement(element) { 8373 this.removeClass(element, DocMouseSimulator.HOVER); 8374 }; 8375 8376 DocMouseSimulator.prototype.activateElement = function activateElement(element) { 8377 this.addClass(element, DocMouseSimulator.ACTIVE); 8378 }; 8379 8380 DocMouseSimulator.prototype.deactivateElement = function deactivateElement(element) { 8381 this.removeClass(element, DocMouseSimulator.ACTIVE); 8382 }; 8383 8384 DocMouseSimulator.prototype.addDocChangeClb = function addDocChangeClb(clb) { 8385 this.onDocChangeClbs.push(clb); 8386 }; 8387 8388 DocMouseSimulator.prototype.notify = function notify() { 8389 for (var _iterator4 = this.onDocChangeClbs, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 8390 var _ref4; 8391 8392 if (_isArray4) { 8393 if (_i4 >= _iterator4.length) break; 8394 _ref4 = _iterator4[_i4++]; 8395 } else { 8396 _i4 = _iterator4.next(); 8397 if (_i4.done) break; 8398 _ref4 = _i4.value; 8399 } 8400 8401 var clb = _ref4; 8402 8403 clb(this.wnd, this.doc);
8404 } 8405 }; 8406 8407 DocMouseSimulator.prototype.elementFromPoint = function elementFromPoint(p) { 8408 var node = this.doc.body, 8409 next = true; 8410 while (next) { 8411 next = false; 8412 for (var i = 0; i < node.childNodes.length; ++i) { 8413 var child = node.childNodes[i]; 8414 if (child instanceof this.wnd.Element) { 8415 var jC = (0, _libs.$)(child), 8416 offset = jC.offset(), 8417 height = jC.height(), 8418 width = jC.width(); 8419 if (p.x > offset.left && p.x < offset.left + width && p.y > offset.top && p.y < offset.top + height) { 8420 node = child; 8421 next = true; 8422 break; 8423 } 8424 } 8425 } 8426 } 8427 return node; 8428 }; 8429 8430 DocMouseSimulator.prototype.getElement = function getElement(p) { 8431 var off0 = this.jFrame.offset(); 8432 this.jFrame.offset({ left: 0.5 * window.innerWidth - p.x, top: 0.5 * window.innerHeight - p.y }); 8433 var element = this.doc.elementFromPoint(p.x, p.y); 8434 if (!element) { 8435 // it isn't a joke it's IE 8436 element = this.doc.elementFromPoint(p.x, p.y); 8437 } 8438 this.jFrame.offset(off0); 8439 return element ? element : this.elementFromPoint(p); 8440 }; 8441 8442 DocMouseSimulator.prototype.simulate = function simulate(e, doc, x, y) { 8443 var p = this.convertCoords(x, y), 8444 element = doc === this.doc ? this.getElement(p) : undefined; 8445 var trigger = element !== undefined, 8446 notify = false; 8447 8448 switch (e.type) { 8449 case 'mousedown': 8450 { 8451 if (this.capElement) { 8452 this.deactivateElement(this.capElement); 8453 notify = true; 8454 } 8455 this.capElement = element; 8456 if (this.capElement) { 8457 this.activateElement(this.capElement); 8458 notify = true; 8459 } 8460 break; 8461 } 8462 case 'mouseup': 8463 { 8464 if (this.capElement) { 8465 this.deactivateElement(this.capElement); 8466 notify = true; 8467 } 8468 this.timeStamp = e.timeStamp; 8469 break; 8470 } 8471 case 'click': 8472 { 8473 trigger = element && this.capElement === element; // && e.timeStamp === this.timeStamp; 8474 this.capElement = undefined; 8475 break; 8476 } 8477 case 'mouseenter': 8478 case 'mouseover': 8479 case 'mousemove': 8480 { 8481 var leaved = null; 8482 if (this.hovElement !== element && this.hovElement) { 8483 this.triggerEvent(this.hovElement, e, p, 'mouseout', { relatedTarget: element ? element : null }); 8484 this.leaveElement(this.hovElement); 8485 leaved = this.hovElement; 8486 this.hovElement = undefined; 8487 notify = true; 8488 } 8489 if (!this.hovElement && element) { 8490 this.triggerEvent(element, e, p, 'mouseover', { relatedTarget: leaved }); 8491 this.enterElement(element); 8492 this.hovElement = element; 8493 notify = true; 8494 } 8495 trigger = element && e.type === 'mousemove'; 8496 break; 8497 } 8498 case 'mouseleave': 8499 case 'mouseout': 8500 { 8501 if (this.hovElement) { 8502 this.triggerEvent(this.hovElement, e, p, 'mouseout', { relatedTarget: e.relatedTarget }); 8503 this.leaveElement(this.hovElement); 8504 this.hovElement = undefined; 8505 notify = true; 8506 } 8507 trigger = false; 8508 break; 8509 } 8510 } 8511 if (trigger) { 8512 this.triggerEvent(element, e, p, e.type); 8513 } 8514 if (notify) { 8515 this.notify(); 8516 } 8517 }; 8518 8519 DocMouseSimulator.prototype.getDefaultUndefinedProperties = function getDefaultUndefinedProperties() { 8520 return ['clientX', 'clientY', 'offsetX', 'offsetY', 'screenX', 'screenY']; 8521 }; 8522 8523 DocMouseSimulator.prototype.getDefaultResendProperties = function getDefaultResendProperties() { 8524 return ['altKey', 'bubbles', 'button', 'buttons', 'cancelable', 'changedTouches', 'char', 'charCode', 'ctrlKey', 'data', 'detail', 'eventPhase', 'isDefaultPrevented', 'key', 'keyCode', 'metaKey', 'pointerId', 'pointerType', 'shiftKey', 'targetTouches', 'touches', 'which']; 8525 }; 8526 8527 return DocMouseSimulator; 8528}();
8529 8530/* 8531altKey, 8532bubbles, 8533button, 8534buttons, 8535cancelable, 8536changedTouches, 8537char, 8538charCode, 8539clientX, 8540clientY, 8541ctrlKey, 8542currentTarget, 8543data, 8544delegateTarget, 8545detail, 8546eventPhase, 8547handleObj, 8548isDefaultPrevented, 8549key, 8550keyCode, 8551metaKey, 8552offsetX, 8553offsetY, 8554originalEvent, 8555pageX, 8556pageY, 8557pointerId, 8558pointerType, 8559relatedTarget, 8560screenX, 8561screenY, 8562shiftKey, 8563target, 8564targetTouches, 8565timeStamp, 8566toElement, 8567touches, 8568type, 8569view, 8570which 8571*/ 8572 8573 8574DocMouseSimulator.HOVER = 'SIMULATED-HOVER'; 8575DocMouseSimulator.ACTIVE = 'SIMULATED-ACTIVE'; 8576exports.default = DocMouseSimulator; 8577 8578/***/ }), 8579/* 47 */ 8580/***/ (function(module, exports, __webpack_require__) { 8581 8582"use strict"; 8583 8584 8585exports.__esModule = true; 8586 8587function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 8588 8589var Dom2Image = function Dom2Image(wnd, doc, cache) { 8590 _classCallCheck(this, Dom2Image); 8591 8592 var self = this; 8593 this.window = wnd; 8594 this.document = doc; 8595 this.cache = cache; 8596 8597 var util = newUtil(); 8598 var inliner = newInliner(); 8599 var fontFaces = newFontFaces(); 8600 var images = newImages(); 8601 8602 this.toSvg = toSvg; 8603 this.toPng = toPng; 8604 this.toJpeg = toJpeg; 8605 this.toBlob = toBlob; 8606 this.toPixelData = toPixelData; 8607 this.impl = { 8608 fontFaces: fontFaces, 8609 images: images, 8610 util: util, 8611 inliner: inliner 8612 }; 8613 8614 /** 8615 * @param {Node} node - The DOM Node object to render 8616 * @param {Object} options - Rendering options 8617 * @param {Function} options.filter - Should return true if passed node should be included in the output 8618 * (excluding node means excluding it's children as well). Not called on the root node. 8619 * @param {String} options.bgcolor - color for the background, any valid CSS color value. 8620 * @param {Number} options.width - width to be applied to node before rendering. 8621 * @param {Number} options.height - height to be applied to node before rendering. 8622 * @param {Object} options.style - an object whose properties to be copied to node's style before rendering. 8623 * @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only), 8624 defaults to 1.0. 8625 * @return {Promise} - A promise that is fulfilled with a SVG image data URL 8626 * */ 8627 8628 function toSvg(node, options) { 8629 options = options || {}; 8630 return Promise.resolve(node).then(function (node) { 8631 return cloneNode(node, options.filter, true); 8632 }).then(embedFonts).then(inlineImages).then(applyOptions).then(function (clone) { 8633 return makeSvgDataUri(clone, options.width || util.width(node), options.height || util.height(node)); 8634 }); 8635 8636 function applyOptions(clone) { 8637 if (options.bgcolor) clone.style.backgroundColor = options.bgcolor; 8638 8639 if (options.width) clone.style.width = options.width + 'px'; 8640 if (options.height) clone.style.height = options.height + 'px'; 8641 8642 if (options.style) self.window.Object.keys(options.style).forEach(function (property) { 8643 clone.style[property] = options.style[property]; 8644 }); 8645 8646 return clone; 8647 } 8648 } 8649 8650 /** 8651 * @param {Node} node - The DOM Node object to render 8652 * @param {Object} options - Rendering options, @see {@link toSvg} 8653 * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data. 8654 * */ 8655 function toPixelData(node, options) { 8656 return draw(node, options || {}).then(function (canvas) { 8657 return canvas.getContext('2d').getImageData(0, 0, util.width(node), util.height(node)).data; 8658 }); 8659 } 8660 8661 /** 8662 * @param {Node} node - The DOM Node object to render 8663 * @param {Object} options - Rendering options, @see {@link toSvg} 8664 * @return {Promise} - A promise that is fulfilled with a PNG image data URL 8665 * */ 8666 function toPng(node, options) { 8667 return draw(node, options || {}).then(function (canvas) { 8668 return canvas.toDataURL(); 8669 }); 8670 } 8671 8672 /** 8673 * @param {Node} node - The DOM Node object to render
8674 * @param {Object} options - Rendering options, @see {@link toSvg} 8675 * @return {Promise} - A promise that is fulfilled with a JPEG image data URL 8676 * */ 8677 function toJpeg(node, options) { 8678 options = options || {}; 8679 return draw(node, options).then(function (canvas) { 8680 return canvas.toDataURL('image/jpeg', options.quality || 1.0); 8681 }); 8682 } 8683 8684 /** 8685 * @param {Node} node - The DOM Node object to render 8686 * @param {Object} options - Rendering options, @see {@link toSvg} 8687 * @return {Promise} - A promise that is fulfilled with a PNG image blob 8688 * */ 8689 function toBlob(node, options) { 8690 return draw(node, options || {}).then(util.canvasToBlob); 8691 } 8692 8693 function draw(domNode, options) { 8694 return toSvg(domNode, options).then(util.makeImage).then(util.delay(100)).then(function (image) { 8695 var canvas = newCanvas(domNode); 8696 canvas.getContext('2d').drawImage(image, 0, 0); 8697 return canvas; 8698 }); 8699 8700 function newCanvas(domNode) { 8701 var canvas = self.document.createElement('canvas'); 8702 canvas.width = options.width || util.width(domNode); 8703 canvas.height = options.height || util.height(domNode); 8704 8705 if (options.bgcolor) { 8706 var ctx = canvas.getContext('2d'); 8707 ctx.fillStyle = options.bgcolor; 8708 ctx.fillRect(0, 0, canvas.width, canvas.height); 8709 } 8710 8711 return canvas; 8712 } 8713 } 8714 8715 function cloneNode(node, filter, root) { 8716 if (!root && filter && !filter(node)) return Promise.resolve(); 8717 8718 return Promise.resolve(node).then(makeNodeCopy).then(function (clone) { 8719 return cloneChildren(node, clone, filter); 8720 }).then(function (clone) { 8721 return processClone(node, clone); 8722 }); 8723 8724 function makeNodeCopy(node) { 8725 if (util.isCanvas(node)) return util.makeImage(node.toDataURL()); 8726 return node.cloneNode(false); 8727 } 8728 8729 function cloneChildren(original, clone, filter) { 8730 var children = original.childNodes; 8731 if (children.length === 0) return Promise.resolve(clone); 8732 8733 return cloneChildrenInOrder(clone, util.asArray(children), filter).then(function () { 8734 return clone; 8735 }); 8736 8737 function cloneChildrenInOrder(parent, children, filter) { 8738 var done = Promise.resolve(); 8739 children.forEach(function (child) { 8740 done = done.then(function () { 8741 return cloneNode(child, filter); 8742 }).then(function (childClone) { 8743 if (childClone) parent.appendChild(childClone); 8744 }); 8745 }); 8746 return done; 8747 } 8748 } 8749 8750 function processClone(original, clone) { 8751 if (!util.isElement(clone)) return clone; 8752 8753 return Promise.resolve().then(cloneStyle).then(clonePseudoElements).then(copyUserInput).then(fixSvg).then(function () { 8754 return clone; 8755 }); 8756 8757 function cloneStyle() { 8758 copyStyle(self.window.getComputedStyle(original), clone.style); 8759 8760 function copyStyle(source, target) { 8761 if (source.cssText) target.cssText = source.cssText;else copyProperties(source, target); 8762 8763 function copyProperties(source, target) { 8764 util.asArray(source).forEach(function (name) { 8765 target.setProperty(name, source.getPropertyValue(name), source.getPropertyPriority(name)); 8766 }); 8767 } 8768 } 8769 } 8770 8771 function clonePseudoElements() { 8772 [':before', ':after'].forEach(function (element) { 8773 clonePseudoElement(element); 8774 }); 8775 8776 function clonePseudoElement(element) { 8777 var style = self.window.getComputedStyle(original, element); 8778 var content = style.getPropertyValue('content'); 8779 8780 if (content === '' || content === 'none') return; 8781 8782 var className = util.uid(); 8783 clone.className = clone.className + ' ' + className; 8784 var styleElement = self.document.createElement('style'); 8785 styleElement.appendChild(formatPseudoElementStyle(className, element, style)); 8786 clone.appendChild(styleElement); 8787 8788 function formatPseudoElementStyle(className, element, style) { 8789 var selector = '.' + className + ':' + element; 8790 var cssText = style.cssText ? formatCssText(style) : formatCssProperties(style); 8791 return self.document.createTextNode(selector + '{' + cssText + '}'); 8792 8793 function formatCssText(style) { 8794 var content = style.getPropertyValue('content'); 8795 return style.cssText + ' content: ' + content + ';'; 8796 } 8797 8798 function formatCssProperties(style) { 8799 8800 return util.asArray(style).map(formatProperty).join('; ') + ';'; 8801 8802 function formatProperty(name) { 8803 return name + ': ' + style.getPropertyValue(name) + (style.getPropertyPriority(name) ? ' !important' : ''); 8804 } 8805 } 8806 } 8807 } 8808 } 8809 8810 function copyUserInput() { 8811 if (util.isTextArea(original)) clone.innerHTML = original.value; 8812 if (util.isInput(original)) clone.setAttribute("value", original.value); 8813 } 8814 8815 function fixSvg() { 8816 if (!util.isSVG(clone)) return; 8817 clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); 8818 8819 if (!util.isSVGRect(clone)) return; 8820 ['width', 'height'].forEach(function (attribute) { 8821 var value = clone.getAttribute(attribute); 8822 if (!value) return; 8823 8824 clone.style.setProperty(attribute, value); 8825 }); 8826 } 8827 } 8828 } 8829 8830 function embedFonts(node) { 8831 return fontFaces.resolveAll().then(function (cssText) { 8832 var styleNode = self.document.createElement('style'); 8833 node.appendChild(styleNode); 8834 styleNode.appendChild(self.document.createTextNode(cssText)); 8835 return node; 8836 }); 8837 } 8838 8839 function inlineImages(node) { 8840 return images.inlineAll(node).then(function () { 8841 return node; 8842 }); 8843 } 8844 8845 function makeSvgDataUri(node, width, height) { 8846 return Promise.resolve(node).then(function (node) { 8847 node.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); 8848 return new self.window.XMLSerializer().serializeToString(node); 8849 }).then(util.escapeXhtml).then(function (xhtml) { 8850 return ['data:image/svg+xml;charset=utf-8,', '<svg xmlns="http://www.w3.org/2000/svg" width="', width, '" height="', height, '">', '<foreignObject x="0" y="0" width="100%" height="100%">', xhtml, '</foreignObject>', '</svg>'].join(''); 8851 }); 8852 } 8853 8854 function newUtil() { 8855 return { 8856 escape: escape, 8857 parseExtension: parseExtension, 8858 mimeType: mimeType, 8859 dataAsUrl: dataAsUrl, 8860 isDataUrl: isDataUrl, 8861 canvasToBlob: canvasToBlob, 8862 resolveUrl: resolveUrl, 8863 getAndEncode: getAndEncode, 8864 uid: uid(), 8865 delay: delay, 8866 asArray: asArray, 8867 escapeXhtml: escapeXhtml, 8868 makeImage: makeImage, 8869 width: width, 8870 height: height, 8871 8872 isElement: isElement, 8873 isCanvas: isCanvas, 8874 isTextArea: isTextArea,
8875 isInput: isInput, 8876 isSVG: isSVG, 8877 isSVGRect: isSVGRect, 8878 isImage: isImage 8879 }; 8880 8881 function mimes() { 8882 /* 8883 * Only WOFF and EOT mime types for fonts are 'real' 8884 * see http://www.iana.org/assignments/media-types/media-types.xhtml 8885 */ 8886 var WOFF = 'application/font-woff'; 8887 var JPEG = 'image/jpeg'; 8888 8889 return { 8890 'woff': WOFF, 8891 'woff2': WOFF, 8892 'ttf': 'application/font-truetype', 8893 'eot': 'application/vnd.ms-fontobject', 8894 'png': 'image/png', 8895 'jpg': JPEG, 8896 'jpeg': JPEG, 8897 'gif': 'image/gif', 8898 'tiff': 'image/tiff', 8899 'svg': 'image/svg+xml' 8900 }; 8901 } 8902 8903 function parseExtension(url) { 8904 var match = /\.([^\.\/]*?)$/g.exec(url); 8905 if (match) return match[1];else return ''; 8906 } 8907 8908 function mimeType(url) { 8909 var extension = parseExtension(url).toLowerCase(); 8910 return mimes()[extension] || ''; 8911 } 8912 8913 function isDataUrl(url) { 8914 return url.search(/^(data:)/) !== -1; 8915 } 8916 8917 function toBlob(canvas) { 8918 return new Promise(function (resolve) { 8919 var binaryString = self.window.atob(canvas.toDataURL().split(',')[1]); 8920 var length = binaryString.length; 8921 var binaryArray = new self.window.Uint8Array(length); 8922 8923 for (var i = 0; i < length; i++) { 8924 binaryArray[i] = binaryString.charCodeAt(i); 8925 }resolve(new self.window.Blob([binaryArray], { 8926 type: 'image/png' 8927 })); 8928 }); 8929 } 8930 8931 function canvasToBlob(canvas) { 8932 if (canvas.toBlob) return new Promise(function (resolve) { 8933 canvas.toBlob(resolve); 8934 }); 8935 8936 return toBlob(canvas); 8937 } 8938 8939 function resolveUrl(url, baseUrl) { 8940 var doc = self.document.implementation.createHTMLDocument(); 8941 var base = doc.createElement('base'); 8942 doc.head.appendChild(base); 8943 var a = doc.createElement('a'); 8944 doc.body.appendChild(a); 8945 base.href = baseUrl; 8946 a.href = url; 8947 return a.href; 8948 } 8949 8950 function uid() { 8951 var index = 0; 8952 8953 return function () { 8954 return 'u' + fourRandomChars() + index++; 8955 8956 function fourRandomChars() { 8957 /* see http://stackoverflow.com/a/6248722/2519373 */ 8958 return ('0000' + (self.window.Math.random() * self.window.Math.pow(36, 4) << 0).toString(36)).slice(-4); 8959 } 8960 }; 8961 } 8962 8963 function makeImage(uri) { 8964 return new Promise(function (resolve, reject) { 8965 var image = new self.window.Image(); 8966 image.onload = function () { 8967 resolve(image); 8968 }; 8969 image.onerror = reject; 8970 image.src = uri; 8971 }); 8972 } 8973 8974 function getAndEncode(url) { 8975 var data = self.cache.get(url); 8976 if (data) { 8977 if (data.content) { 8978 return data.content; 8979 } else { 8980 return new Promise(function (resolve) { 8981 if (data.content) { 8982 resolve(data.content); 8983 } else { 8984 data.pendings.push(resolve); 8985 } 8986 }); 8987 } 8988 } else { 8989 data = self.cache.put(url, { pendings: [] }); 8990 8991 var TIMEOUT = 30000; 8992 8993 return new Promise(function (resolve) { 8994 var request = new self.window.XMLHttpRequest(); 8995 8996 request.onreadystatechange = done; 8997 request.ontimeout = timeout; 8998 request.responseType = 'blob'; 8999 request.timeout = TIMEOUT; 9000 request.open('GET', url, true); 9001 request.send(); 9002 9003 function done() { 9004 if (request.readyState !== 4) return; 9005 9006 if (request.status !== 200) { 9007 fail('cannot fetch resource: ' + url + ', status: ' + request.status); 9008 return; 9009 } 9010 9011 var encoder = new self.window.FileReader(); 9012 encoder.onloadend = function () { 9013 data.content = encoder.result.split(/,/)[1]; 9014 for (var _iterator = data.pendings, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 9015 var _ref; 9016 9017 if (_isArray) { 9018 if (_i >= _iterator.length) break; 9019 _ref = _iterator[_i++]; 9020 } else { 9021 _i = _iterator.next(); 9022 if (_i.done) break; 9023 _ref = _i.value; 9024 } 9025 9026 var _resolve = _ref; 9027 9028 _resolve(data.content); 9029 } 9030 data.pendings = []; 9031 resolve(data.content); 9032 };
9033 encoder.readAsDataURL(request.response); 9034 } 9035 9036 function timeout() { 9037 fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url); 9038 } 9039 9040 function fail(message) { 9041 console.error(message); 9042 resolve(''); 9043 } 9044 }); 9045 } 9046 } 9047 9048 function dataAsUrl(content, type) { 9049 return ['data:', type, ';base64,', content].join(''); 9050 } 9051 9052 function escape(string) { 9053 return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1'); 9054 } 9055 9056 function delay(ms) { 9057 return function (arg) { 9058 return new Promise(function (resolve) { 9059 setTimeout(function () { 9060 resolve(arg); 9061 }, ms); 9062 }); 9063 }; 9064 } 9065 9066 function asArray(arrayLike) { 9067 var array = []; 9068 var length = arrayLike.length; 9069 for (var i = 0; i < length; i++) { 9070 array.push(arrayLike[i]); 9071 }return array; 9072 } 9073 9074 function escapeXhtml(string) { 9075 return string.replace(/(#|\n)/g, function (c) { 9076 return c === '#' ? '%23' : '%0A'; 9077 }); 9078 } 9079 9080 function width(node) { 9081 var leftBorder = px(node, 'border-left-width'); 9082 var rightBorder = px(node, 'border-right-width'); 9083 return node.scrollWidth + leftBorder + rightBorder; 9084 } 9085 9086 function height(node) { 9087 var topBorder = px(node, 'border-top-width'); 9088 var bottomBorder = px(node, 'border-bottom-width'); 9089 return node.scrollHeight + topBorder + bottomBorder; 9090 } 9091 9092 function px(node, styleProperty) { 9093 var value = self.window.getComputedStyle(node).getPropertyValue(styleProperty); 9094 return parseFloat(value.replace('px', '')); 9095 } 9096 9097 function isElement(node) { 9098 return node instanceof self.window.Element; 9099 } 9100 9101 function isCanvas(node) { 9102 return node instanceof self.window.HTMLCanvasElement; 9103 } 9104 9105 function isTextArea(node) { 9106 return node instanceof self.window.HTMLTextAreaElement; 9107 } 9108 9109 function isInput(node) { 9110 return node instanceof self.window.HTMLInputElement; 9111 } 9112 9113 function isSVG(node) { 9114 return node instanceof self.window.SVGElement; 9115 } 9116 9117 function isSVGRect(node) { 9118 return node instanceof self.window.SVGRectElement; 9119 } 9120 9121 function isImage(node) { 9122 return node instanceof self.window.HTMLImageElement; 9123 } 9124 } 9125 9126 function newInliner() { 9127 var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g; 9128 9129 return { 9130 inlineAll: inlineAll, 9131 shouldProcess: shouldProcess, 9132 impl: { 9133 readUrls: readUrls, 9134 inline: inline 9135 } 9136 }; 9137 9138 function shouldProcess(string) { 9139 return string.search(URL_REGEX) !== -1; 9140 } 9141 9142 function readUrls(string) { 9143 var result = []; 9144 var match = void 0; 9145 while ((match = URL_REGEX.exec(string)) !== null) { 9146 result.push(match[1]); 9147 } 9148 return result.filter(function (url) { 9149 return !util.isDataUrl(url); 9150 }); 9151 } 9152 9153 function inline(string, url, baseUrl, get) { 9154 return Promise.resolve(url).then(function (url) { 9155 return baseUrl ? util.resolveUrl(url, baseUrl) : url; 9156 }).then(get || util.getAndEncode).then(function (data) { 9157 return util.dataAsUrl(data, util.mimeType(url)); 9158 }).then(function (dataUrl) { 9159 return string.replace(urlAsRegex(url), ['$1', dataUrl, '$3'].join(''));
9160 }); 9161 9162 function urlAsRegex(url) { 9163 return new self.window.RegExp(['(url\\([\'"]?)(', util.escape(url), ')([\'"]?\\))'].join(''), 'g'); 9164 } 9165 } 9166 9167 function inlineAll(string, baseUrl, get) { 9168 if (nothingToInline()) return Promise.resolve(string); 9169 9170 return Promise.resolve(string).then(readUrls).then(function (urls) { 9171 var done = Promise.resolve(string); 9172 urls.forEach(function (url) { 9173 done = done.then(function (string) { 9174 return inline(string, url, baseUrl, get); 9175 }); 9176 }); 9177 return done; 9178 }); 9179 9180 function nothingToInline() { 9181 return !shouldProcess(string); 9182 } 9183 } 9184 } 9185 9186 function newFontFaces() { 9187 return { 9188 resolveAll: resolveAll, 9189 impl: { 9190 readAll: readAll 9191 } 9192 }; 9193 9194 function resolveAll() { 9195 return readAll(self.document).then(function (webFonts) { 9196 return Promise.all(webFonts.map(function (webFont) { 9197 return webFont.resolve(); 9198 })); 9199 }).then(function (cssStrings) { 9200 return cssStrings.join('\n'); 9201 }); 9202 } 9203
9204 function readAll() { 9205 return Promise.resolve(util.asArray(self.document.styleSheets)).then(getCssRules).then(selectWebFontRules).then(function (rules) { 9206 return rules.map(newWebFont); 9207 }); 9208 9209 function selectWebFontRules(cssRules) { 9210 return cssRules.filter(function (rule) { 9211 return rule.type === CSSRule.FONT_FACE_RULE; 9212 }).filter(function (rule) { 9213 return inliner.shouldProcess(rule.style.getPropertyValue('src')); 9214 }); 9215 } 9216 9217 function getCssRules(styleSheets) { 9218 var cssRules = []; 9219 styleSheets.forEach(function (sheet) { 9220 try { 9221 util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules)); 9222 } catch (e) { 9223 console.log('Error while reading CSS rules from ' + sheet.href, e.toString()); 9224 } 9225 }); 9226 return cssRules; 9227 } 9228 9229 function newWebFont(webFontRule) { 9230 return { 9231 resolve: function resolve() { 9232 var baseUrl = (webFontRule.parentStyleSheet || {}).href; 9233 return inliner.inlineAll(webFontRule.cssText, baseUrl); 9234 }, 9235 src: function src() { 9236 return webFontRule.style.getPropertyValue('src'); 9237 } 9238 }; 9239 } 9240 } 9241 } 9242 9243 function newImages() { 9244 return { 9245 inlineAll: inlineAll, 9246 impl: { 9247 newImage: newImage 9248 } 9249 }; 9250 9251 function newImage(element) { 9252 return { 9253 inline: inline 9254 }; 9255 9256 function inline(get) { 9257 if (util.isDataUrl(element.src)) return Promise.resolve(); 9258 9259 return Promise.resolve(element.src).then(get || util.getAndEncode).then(function (data) { 9260 return util.dataAsUrl(data, util.mimeType(element.src)); 9261 }).then(function (dataUrl) { 9262 return new Promise(function (resolve, reject) { 9263 element.onload = resolve; 9264 element.onerror = reject; 9265 element.src = dataUrl; 9266 }); 9267 }); 9268 } 9269 } 9270 9271 function inlineAll(node) { 9272 if (!util.isElement(node)) return Promise.resolve(node); 9273 9274 return inlineBackground(node).then(function () { 9275 if (util.isImage(node)) return newImage(node).inline();else return Promise.all(util.asArray(node.childNodes).map(function (child) { 9276 return inlineAll(child); 9277 })); 9278 }); 9279 9280 function inlineBackground(node) { 9281 var background = node.style.getPropertyValue('background'); 9282 9283 if (!background) return Promise.resolve(node); 9284 9285 return inliner.inlineAll(background).then(function (inlined) { 9286 node.style.setProperty('background', inlined, node.style.getPropertyPriority('background')); 9287 }).then(function () { 9288 return node; 9289 }); 9290 } 9291 } 9292 } 9293}; 9294 9295exports.default = Dom2Image; 9296 9297/***/ }), 9298/* 48 */ 9299/***/ (function(module, exports, __webpack_require__) { 9300 9301"use strict"; 9302 9303 9304exports.__esModule = true; 9305 9306var _libs = __webpack_require__(0); 9307 9308function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 9309 9310var Drag = function () { 9311 function Drag(wnd, doc, visualWorld) { 9312 _classCallCheck(this, Drag); 9313 9314 this.wnd = wnd; 9315 this.doc = doc; 9316 this.visual = visualWorld; 9317 this.coords = new _libs.THREE.Vector2(); 9318 this.intersection = new _libs.THREE.Vector3(); 9319 this.raycaster = this.visual.raycaster; 9320 this.camera = this.visual.camera; 9321 this.plane = new _libs.THREE.Plane(); 9322 this.threes = []; 9323 this.selected = null; 9324 this.enabled = true; 9325 this.controlsState = this.visual.getControlsState(); 9326 9327 this.element = this.visual.element; 9328 this.binds = { 9329 onMouseMove: this.onMouseMove.bind(this), 9330 onMouseDown: this.onMouseDown.bind(this), 9331 onMouseUp: this.onMouseUp.bind(this) 9332 }; 9333 (0, _libs.$)(this.element).on('mousemove', this.binds.onMouseMove); 9334 (0, _libs.$)(this.element).on('mousedown', this.binds.onMouseDown);
9335 (0, _libs.$)(this.doc).on('mouseup', this.binds.onMouseUp); 9336 } 9337 9338 Drag.prototype.addThree = function addThree(three) { 9339 this.threes.push(three); 9340 }; 9341 9342 Drag.prototype.removeThree = function removeThree(three) { 9343 var i = this.threes.indexOf(three); 9344 if (~i) { 9345 this.threes.splice(i, 1); 9346 } 9347 }; 9348 9349 Drag.prototype.onPickCallback = function onPickCallback() { 9350 return true; 9351 }; 9352 9353 Drag.prototype.onDragCallback = function onDragCallback() { 9354 return true; 9355 }; 9356 9357 Drag.prototype.onReleaseCallback = function onReleaseCallback() {}; 9358 9359 Drag.prototype.dispose = function dispose() { 9360 (0, _libs.$)(this.element).off('mousemove', this.binds.onMouseMove); 9361 (0, _libs.$)(this.element).off('mousedown', this.binds.onMouseDown); 9362 (0, _libs.$)(this.doc).off('mouseup', this.binds.onMouseUp); 9363 }; 9364 9365 Drag.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { 9366 var jElement = (0, _libs.$)(this.element); 9367 var offset = jElement.offset(); 9368 this.coords.x = (e.pageX - offset.left) / jElement.width() * 2 - 1; 9369 this.coords.y = -((e.pageY - offset.top) / jElement.height()) * 2 + 1; 9370 return this.coords; 9371 }; 9372 9373 Drag.prototype.onMouseDown = function onMouseDown(e) { 9374 if (!this.enabled) return; 9375 9376 if (this.selected) this.onMouseUp(e); 9377 9378 this.setCoordsFromEvent(e); 9379 this.raycaster.setFromCamera(this.coords, this.camera); 9380 9381 var intersects = this.raycaster.intersectObjects(this.threes); 9382 if (intersects.length > 0) { 9383 var selected = intersects[0].object; 9384 if (!this.onPickCallback(intersects[0])) return; 9385 var v = intersects[0].point.clone(); 9386 this.distance = v.sub(this.raycaster.ray.origin).length();; 9387 this.controlsState = this.visual.getControlsState(); 9388 this.visual.setControlsState(false); 9389 this.plane.setFromNormalAndCoplanarPoint(this.visual.camera.getWorldDirection(this.plane.normal), intersects[0].point); 9390 //this.plane.setFromNormalAndCoplanarPoint(this.plane.normal.set(0,0,1), new THREE.Vector3(0,0,0)); 9391 this.selected = selected; 9392 } 9393 }; 9394 9395 Drag.prototype.onMouseMove = function onMouseMove(e) { 9396 if (!this.enabled) return; 9397 e.preventDefault(); 9398 9399 if (this.selected) { 9400 this.setCoordsFromEvent(e); 9401 this.raycaster.setFromCamera(this.coords, this.camera); 9402 if (this.raycaster.ray.intersectPlane(this.plane, this.intersection)) { 9403 if (!this.onDragCallback(this.intersection)) this.onMouseUp(e); 9404 } /**/ 9405 //this.intersection.copy(this.raycaster.ray.direction).normalize().multiplyScalar(this.distance).add(this.raycaster.ray.origin);/**/ 9406 //if(!this.onDragCallback(this.selected, this.intersection)) this.onMouseUp(e); 9407 } 9408 }; 9409 9410 Drag.prototype.onMouseUp = function onMouseUp(e) { 9411 if (this.selected) { 9412 this.onReleaseCallback(); 9413 this.selected = null; 9414 this.visual.setControlsState(this.controlsState); 9415 } 9416 if (!this.enabled) return; 9417 e.preventDefault(); 9418 }; 9419 9420 return Drag; 9421}(); 9422 9423exports.default = Drag; 9424 9425/***/ }), 9426/* 49 */ 9427/***/ (function(module, exports, __webpack_require__) { 9428 9429"use strict"; 9430 9431 9432exports.__esModule = true; 9433 9434var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 9435 9436var _libs = __webpack_require__(0); 9437 9438function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 9439 9440__webpack_require__(70)(_libs.$); 9441 9442var EventsToActions = function () { 9443 EventsToActions.getEventFlags = function getEventFlags(e) { 9444 return e.ctrlKey << 0 | e.shiftKey << 1 | e.altKey << 2; 9445 }; 9446 9447 EventsToActions.getPosition = function getPosition(touches) { 9448 var x = void 0, 9449 y = void 0; 9450 if (touches.length === 2) { 9451 x = touches[1].pageX - touches[0].pageX; 9452 y = touches[1].pageY - touches[0].pageY; 9453 y = -Math.sqrt(x * x + y * y); 9454 x = 0; 9455 } else { 9456 x = touches[0].pageX; 9457 y = touches[0].pageY; 9458 } 9459 return { 9460 x: x, 9461 y: y 9462 }; 9463 }; 9464 9465 function EventsToActions(element, actions) { 9466 _classCallCheck(this, EventsToActions); 9467 9468 this.actions = actions || {}; 9469 this.element = element; 9470 this.doc = element[0].ownerDocument; 9471 this.wnd = this.doc.defaultView; 9472 this.enabled = true; 9473 9474 this.binds = { 9475 contextMenu: this.contextMenu.bind(this), 9476 9477 mouseDown: this.mouseDown.bind(this), 9478 mouseMove: this.mouseMove.bind(this), 9479 mouseUp: this.mouseUp.bind(this), 9480 mouseWheel: this.mouseWheel.bind(this), 9481 9482 mouseMoveDoc: this.mouseMoveDoc.bind(this), 9483 mouseUpDoc: this.mouseUpDoc.bind(this), 9484 9485 click: this.click.bind(this), 9486 dblclick: this.dblclick.bind(this), 9487 9488 touchStart: this.touchStart.bind(this), 9489 touchMove: this.touchMove.bind(this), 9490 touchEnd: this.touchEnd.bind(this), 9491 9492 keyDown: this.keyDown.bind(this), 9493 keyPress: this.keyPress.bind(this), 9494 keyUp: this.keyUp.bind(this) 9495 }; 9496 9497 this.element.on('contextmenu', this.binds.contextMenu); 9498 9499 this.element.on('mousedown', this.binds.mouseDown);
9500 this.element.on('mousemove', this.binds.mouseMove); 9501 this.element.on('mouseup', this.binds.mouseUp); 9502 this.element.on('mousewheel', this.binds.mouseWheel); 9503 9504 (0, _libs.$)(this.doc).on('mousemove', this.binds.mouseMoveDoc); 9505 (0, _libs.$)(this.doc).on('mouseup', this.binds.mouseUpDoc); 9506 9507 this.element.on('click', this.binds.click); 9508 this.element.on('dblclick', this.binds.dblclick); 9509 9510 this.element.on('touchstart', this.binds.touchStart); 9511 this.element.on('touchmove', this.binds.touchMove); 9512 this.element.on('touchend', this.binds.touchEnd); 9513 9514 (0, _libs.$)(this.wnd).on('keydown', this.binds.keyDown); 9515 (0, _libs.$)(this.wnd).on('keypress', this.binds.keyPress); 9516 (0, _libs.$)(this.wnd).on('keyup', this.binds.keyUp); 9517 } 9518 9519 EventsToActions.prototype.addAction = function addAction(action, type, code, flags) { 9520 type = type.toLowerCase(); 9521 if (!this.actions[type]) { 9522 this.actions[type] = {}; 9523 } 9524 if (!this.actions[type][code]) { 9525 this.actions[type][code] = {}; 9526 } 9527 if (!this.actions[type][code][flags]) { 9528 this.actions[type][code][flags] = []; 9529 } 9530 this.actions[type][code][flags].push(action); 9531 }; 9532 9533 EventsToActions.prototype.getActions = function getActions(type, code, flags) { 9534 return ((this.actions[type] || {})[code] || {})[flags] || []; 9535 }; 9536 9537 EventsToActions.prototype.fireActions = function fireActions(actions, e, data) { 9538 for (var _iterator = actions, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 9539 var _ref; 9540 9541 if (_isArray) { 9542 if (_i >= _iterator.length) break; 9543 _ref = _iterator[_i++]; 9544 } else { 9545 _i = _iterator.next(); 9546 if (_i.done) break; 9547 _ref = _i.value; 9548 } 9549 9550 var action = _ref; 9551 9552 action(e, data); 9553 } 9554 }; 9555 9556 EventsToActions.prototype.contextMenu = function contextMenu(e) { 9557 if (this.enabled) { 9558 var flags = EventsToActions.getEventFlags(e); 9559 this.fireActions(this.getActions('contextmenu', e.button, flags), e); 9560 } 9561 }; 9562 9563 EventsToActions.prototype.mouseDown = function mouseDown(e) { 9564 if (this.picked) { 9565 this.mouseUpDoc(); 9566 } 9567 if (this.enabled) { 9568 var flags = EventsToActions.getEventFlags(e); 9569 this.fireActions(this.getActions('mousedown', e.button, flags), e); 9570 this.picked = { 9571 x: e.pageX, 9572 y: e.pageY, 9573 actions: this.getActions('mousedrag', e.button, flags) 9574 }; 9575 this.fireActions(this.picked.actions, e, { 9576 state: 'start' 9577 }); 9578 } 9579 }; 9580 9581 EventsToActions.prototype.mouseMove = function mouseMove(e) { 9582 if (this.enabled) { 9583 var flags = EventsToActions.getEventFlags(e); 9584 this.fireActions(this.getActions('mousemove', e.button, flags), e); 9585 } 9586 }; 9587 9588 EventsToActions.prototype.mouseMoveDoc = function mouseMoveDoc(e) { 9589 if (this.enabled && this.picked) { 9590 this.fireActions(this.picked.actions, e, { 9591 state: 'move', 9592 dx: e.pageX - this.picked.x, 9593 dy: e.pageY - this.picked.y 9594 }); 9595 this.picked = { 9596 x: e.pageX, 9597 y: e.pageY, 9598 actions: this.picked.actions 9599 }; 9600 } 9601 }; 9602 9603 EventsToActions.prototype.mouseUp = function mouseUp(e) { 9604 if (this.enabled) { 9605 var flags = EventsToActions.getEventFlags(e); 9606 this.fireActions(this.getActions('mouseup', e.button, flags), e); 9607 } 9608 }; 9609 9610 EventsToActions.prototype.mouseUpDoc = function mouseUpDoc(e) { 9611 if (this.picked) { 9612 this.fireActions(this.picked.actions, e, { 9613 state: 'end' 9614 }); 9615 delete this.picked; 9616 } 9617 }; 9618 9619 EventsToActions.prototype.mouseWheel = function mouseWheel(e) { 9620 if (this.enabled) { 9621 var flags = EventsToActions.getEventFlags(e); 9622 this.fireActions(this.getActions('mousewheel', 0, flags), e); 9623 } 9624 }; 9625 9626 EventsToActions.prototype.clicks = function clicks(e, type) { 9627 if (this.enabled) { 9628 var flags = EventsToActions.getEventFlags(e); 9629 this.fireActions(this.getActions(type, e.button, flags), e); 9630 } 9631 }; 9632 9633 EventsToActions.prototype.click = function click(e) { 9634 this.clicks(e, 'click'); 9635 }; 9636 9637 EventsToActions.prototype.dblclick = function dblclick(e) { 9638 this.clicks(e, 'dblclick'); 9639 }; 9640 9641 EventsToActions.prototype.touchPick = function touchPick(e, flags, touches) { 9642 this.touchPicked = _extends({}, EventsToActions.getPosition(touches), { 9643 actions: this.getActions('touchdrag', touches.length, flags), 9644 code: touches.length, 9645 flags: flags 9646 });
9647 this.fireActions(this.touchPicked.actions, e, { 9648 state: 'start' 9649 }); 9650 }; 9651 9652 EventsToActions.prototype.touchStart = function touchStart(e) { 9653 if (this.touchPicked) { 9654 this.touchEnd(e); 9655 } 9656 if (this.enabled) { 9657 var flags = EventsToActions.getEventFlags(e), 9658 touches = e.touches || e.originalEvent.touches; 9659 this.fireActions(this.getActions('touchstart', touches.length, flags), e); 9660 this.touchPick(e, flags, touches); 9661 } 9662 }; 9663 9664 EventsToActions.prototype.touchMove = function touchMove(e) { 9665 if (this.enabled) { 9666 var flags = EventsToActions.getEventFlags(e), 9667 touches = e.touches || e.originalEvent.touches; 9668 this.fireActions(this.getActions('touchmove', touches.length, flags), e); 9669 if (this.touchPicked) { 9670 if (this.touchPicked.code === touches.length && this.touchPicked.flags === flags) { 9671 var pos = EventsToActions.getPosition(touches); 9672 this.fireActions(this.touchPicked.actions, e, { 9673 state: 'move', 9674 dx: pos.x - this.touchPicked.x, 9675 dy: pos.y - this.touchPicked.y 9676 }); 9677 this.touchPicked = _extends({}, this.touchPicked, pos); 9678 } else { 9679 this.touchEnd(e); 9680 this.touchPick(e, flags, touches); 9681 } 9682 } 9683 } 9684 }; 9685 9686 EventsToActions.prototype.touchEnd = function touchEnd(e) { 9687 if (this.touchPicked) { 9688 this.fireActions(this.touchPicked.actions, e, { 9689 state: 'end' 9690 }); 9691 delete this.touchPicked; 9692 } 9693 }; 9694 9695 EventsToActions.prototype.key = function key(e, type) { 9696 if (this.enabled) { 9697 var flags = EventsToActions.getEventFlags(e); 9698 this.fireActions(this.getActions(type, e.keyCode, flags), e); 9699 } 9700 }; 9701 9702 EventsToActions.prototype.keyDown = function keyDown(e) { 9703 this.key(e, 'keydown'); 9704 }; 9705 9706 EventsToActions.prototype.keyPress = function keyPress(e) { 9707 this.key(e, 'keypress'); 9708 }; 9709 9710 EventsToActions.prototype.keyUp = function keyUp(e) { 9711 this.key(e, 'keyup'); 9712 }; 9713 9714 EventsToActions.prototype.dispose = function dispose() { 9715 this.element.off('contextmenu', this.binds.contextMenu); 9716 9717 this.element.off('mousedown', this.binds.mouseDown);
9718 this.element.off('mousemove', this.binds.mouseMove); 9719 this.element.off('mouseup', this.binds.mouseUp); 9720 this.element.off('mousewheel', this.binds.mouseWheel); 9721 9722 (0, _libs.$)(this.doc).off('mousemove', this.binds.mouseMoveDoc); 9723 (0, _libs.$)(this.doc).off('mouseup', this.binds.mouseUpDoc); 9724 9725 this.element.off('click', this.binds.click); 9726 this.element.off('dblclick', this.binds.dblclick); 9727 9728 this.element.off('touchstart', this.binds.touchStart); 9729 this.element.off('touchmove', this.binds.touchMove); 9730 this.element.off('touchend', this.binds.touchEnd); 9731 9732 (0, _libs.$)(this.wnd).off('keydown', this.binds.keyDown); 9733 (0, _libs.$)(this.wnd).off('keypress', this.binds.keyPress); 9734 (0, _libs.$)(this.wnd).off('keyup', this.binds.keyUp); 9735 }; 9736 9737 return EventsToActions; 9738}(); 9739 9740EventsToActions.modKeys = { 9741 Ctrl: 1, 9742 Shift: 2, 9743 Alt: 4 9744}; 9745EventsToActions.mouseButtons = { 9746 Left: 0, 9747 Middle: 1, 9748 Right: 2 9749}; 9750exports.default = EventsToActions; 9751 9752/***/ }), 9753/* 50 */ 9754/***/ (function(module, exports, __webpack_require__) { 9755 9756"use strict"; 9757 9758 9759exports.__esModule = true; 9760 9761function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 9762 9763var FullScreen = function () { 9764 function FullScreen() { 9765 _classCallCheck(this, FullScreen); 9766 } 9767 9768 FullScreen.available = function available() { 9769 return FullScreen._hasWebkitFullScreen || FullScreen._hasMozFullScreen || FullScreen._hasMsFullscreen; 9770 }; 9771 9772 FullScreen.activated = function activated() { 9773 if (FullScreen._hasWebkitFullScreen) { 9774 return document.webkitIsFullScreen; 9775 } else if (FullScreen._hasMozFullScreen) { 9776 return document.mozFullScreen; 9777 } else if (FullScreen._hasMsFullscreen) { 9778 return !!document.msFullscreenElement; 9779 } else { 9780 console.assert(false); 9781 } 9782 }; 9783 9784 FullScreen.addEventListener = function addEventListener(element, handler) { 9785 if (element.addEventListener) { 9786 element.addEventListener('webkitfullscreenchange', handler, false); 9787 element.addEventListener('mozfullscreenchange', handler, false); 9788 element.addEventListener('fullscreenchange', handler, false); 9789 element.addEventListener('MSFullscreenChange', handler, false); 9790 } 9791 }; 9792 9793 FullScreen.removeEventListener = function removeEventListener(element, handler) { 9794 if (element.removeEventListener) { 9795 element.removeEventListener('webkitfullscreenchange', handler, false); 9796 element.removeEventListener('mozfullscreenchange', handler, false); 9797 element.removeEventListener('fullscreenchange', handler, false); 9798 element.removeEventListener('MSFullscreenChange', handler, false); 9799 } 9800 }; 9801 9802 FullScreen.request = function request(element) { 9803 element = element || document.body; 9804 if (FullScreen._hasWebkitFullScreen) { 9805 element.webkitRequestFullScreen(); 9806 } else if (FullScreen._hasMozFullScreen) { 9807 element.mozRequestFullScreen(); 9808 } else if (FullScreen._hasMsFullscreen) { 9809 element.msRequestFullscreen(); 9810 } else { 9811 console.assert(false); 9812 } 9813 }; 9814 9815 FullScreen.cancel = function cancel() { 9816 if (FullScreen._hasWebkitFullScreen) { 9817 document.webkitCancelFullScreen(); 9818 } else if (FullScreen._hasMozFullScreen) { 9819 document.mozCancelFullScreen(); 9820 } else if (FullScreen._hasMsFullscreen) { 9821 document.msExitFullscreen(); 9822 } else { 9823 console.assert(false); 9824 } 9825 }; 9826 9827 return FullScreen; 9828}(); 9829 9830FullScreen._hasWebkitFullScreen = !!document.webkitCancelFullScreen; 9831FullScreen._hasMozFullScreen = !!document.mozCancelFullScreen; 9832FullScreen._hasMsFullscreen = !!document.documentElement.msRequestFullscreen; 9833exports.default = FullScreen; 9834 9835/***/ }), 9836/* 51 */ 9837/***/ (function(module, exports, __webpack_require__) { 9838 9839"use strict"; 9840 9841 9842exports.__esModule = true; 9843 9844var _libs = __webpack_require__(0); 9845 9846var _ImageBase2 = __webpack_require__(5); 9847 9848var _ImageBase3 = _interopRequireDefault(_ImageBase2); 9849 9850var _BaseMathUtils = __webpack_require__(2); 9851 9852var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); 9853 9854var _Dom2Image = __webpack_require__(47); 9855 9856var _Dom2Image2 = _interopRequireDefault(_Dom2Image); 9857 9858var _DocMouseSimulator = __webpack_require__(46); 9859 9860var _DocMouseSimulator2 = _interopRequireDefault(_DocMouseSimulator); 9861 9862function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 9863 9864function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 9865 9866function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 9867 9868function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
9868onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 9869 9870var InteractiveImage = function (_ImageBase) { 9871 _inherits(InteractiveImage, _ImageBase); 9872 9873 function InteractiveImage(context, width, height, color, src, cache, injector) { 9874 _classCallCheck(this, InteractiveImage); 9875 9876 var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); 9877 9878 _this.iId = 'i' + _BaseMathUtils2.default.getUnique(); 9879 var jFrame = (0, _libs.$)('<iframe id="' + _this.iId + '" src="' + src + '" style="position: fixed; left: -1000px;"></iframe>'); 9880 (0, _libs.$)(_this.doc.body).append(jFrame); 9881 _this.frame = jFrame[0]; 9882 9883 _this.binds = {}; 9884 9885 if (injector) { 9886 injector(_this.frame.contentWindow); 9887 } 9888 9889 if (_this.doc.implementation.hasFeature('www.http://w3.org/TR/SVG11/feature#Extensibility', '1.1')) { 9890 // svg foreignObject renderer 9891 _this.image = new Image(); 9892 _this.binds.imageLoad = function () { 9893 _this.renderImage(_this.image); 9894 _this.finishRender(); 9895 }; 9896 (0, _libs.$)(_this.image).on('load', _this.binds.imageLoad); 9897 _this.svgRender = new _Dom2Image2.default(_this.frame.contentWindow, _this.frame.contentDocument, cache); 9898 } // otherwise - html2canvas 9899 9900 _this.binds.frameLoad = function () { 9901 if (~_this.frame.contentDocument.title.indexOf('404')) { 9902 _this.startRender = function () { 9903 _this.renderNotFoundPage(); 9904 _this.finishRender(); 9905 }; 9906 _this.finishLoad(); 9907 } else { 9908 setTimeout(function () { 9909 if (_this.frame) { 9910 _this.width = (0, _libs.$)(_this.frame.contentDocument.body).width(); 9911 _this.height = (0, _libs.$)(_this.frame.contentDocument.body).height(); 9912 jFrame.css('width', _this.width + 'px').css('height', _this.height + 'px'); 9913 jFrame.offset({ left: -_this.width - 100, top: 0 }); 9914 if (_this.svgRender) { 9915 _this.simulator = new _DocMouseSimulator2.default(jFrame, _this.frame.contentDocument.body, _this.element); 9916 _this.simulator.addDocChangeClb(_this.finishLoad.bind(_this)); 9917 } 9918 _this.startRender = function () { 9919 _this.render(); 9920 }; 9921 _this.finishLoad(); 9922 } 9923 }, 500); 9924 } 9925 }; 9926 (0, _libs.$)(_this.frame.contentWindow).on('load', _this.binds.frameLoad); 9927 return _this; 9928 } 9929 9930 InteractiveImage.prototype.getSimulatedDoc = function getSimulatedDoc() { 9931 return this.frame.contentDocument; 9932 }; 9933 9934 InteractiveImage.prototype.render = function render() { 9935 var _this2 = this; 9936 9937 if (this.svgRender) { 9938 this.svgRender.toSvg(this.simulator.element, { height: this.height + 'px', width: this.width + 'px' }).then(function (dataUrl) { 9939 _this2.image.src = dataUrl; 9940 }).catch(function (error) { 9941 console.error('Dom2Image: ', error); 9942 _this2.renderBlankPage(); 9943 _this2.finishRender(); 9944 }); 9945 } else { 9946 (0, _libs.html2canvas)(this.frame.contentDocument.body, { timeout: 30000 }).then(function (canvas) { 9947 _this2.renderImage(canvas); 9948 _this2.finishRender(); 9949 }); 9950 } 9951 }; 9952 9953 InteractiveImage.prototype.dispose = function dispose() { 9954 (0, _libs.$)(this.image).off('load', this.binds.imageLoad); 9955 (0, _libs.$)(this.frame.contentWindow).off('load', this.binds.frameLoad); 9956 (0, _libs.$)(this.doc.body).find('#' + this.iId).remove(); 9957 if (this.image) { 9958 this.image.src = ''; 9959 delete this.image; 9960 } 9961 this.frame.src = ''; 9962 delete this.frame; 9963 _ImageBase.prototype.dispose.call(this); 9964 }; 9965 9966 InteractiveImage.prototype.simulate = function simulate(e, doc, x, y) { 9967 if (this.simulator) { 9968 this.simulator.simulate(e, doc, x, y); 9969 } 9970 }; 9971 9972 return InteractiveImage; 9973}(_ImageBase3.default); 9974 9975exports.default = InteractiveImage; 9976 9977/***/ }), 9978/* 52 */ 9979/***/ (function(module, exports, __webpack_require__) { 9980 9981"use strict"; 9982 9983 9984exports.__esModule = true; 9985 9986var _libs = __webpack_require__(0); 9987 9988var _GraphUtils = __webpack_require__(7); 9989 9990var _GraphUtils2 = _interopRequireDefault(_GraphUtils); 9991 9992var _MathUtils = __webpack_require__(3); 9993 9994var _MathUtils2 = _interopRequireDefault(_MathUtils); 9995 9996function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 9997 9998function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 9999
10000var LoadingAnimation = function () { 10001 LoadingAnimation.prototype.dy = function dy(t, y) { 10002 var w = y[0], 10003 a = y[1]; 10004 return [-this.g * Math.cos(a), w]; 10005 }; 10006 10007 LoadingAnimation.prototype.integrate = function integrate(T) { 10008 var t = 0, 10009 dt = this.p.dt, 10010 os = this.os; 10011 while (t < T) { 10012 if (t + dt > T) { 10013 dt = T - t; 10014 } 10015 os = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.g }), 0, dt, os); 10016 t += dt; 10017 } 10018 return os; 10019 }; 10020 10021 LoadingAnimation.prototype.calcTimeTo = function calcTimeTo(target) { 10022 var t = 0, 10023 dt = this.p.dt, 10024 os = this.os; 10025 while (Math.abs(os[1] - target) > 1e-4) { 10026 var nos = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.g }), 0, dt, os); 10027 if (nos[0] < 0 && nos[1] < target || nos[0] > 0 && nos[1] > target) { 10028 dt /= 2; 10029 } else { 10030 os = nos; 10031 t += dt; 10032 } 10033 } 10034 return t; 10035 }; 10036 10037 LoadingAnimation.prototype.update = function update(T) { 10038 this.os = this.integrate(T); 10039 10040 this.t += T; 10041 if (this.t >= this.p.updateInterval) { 10042 this.t = 0; 10043 var r = 0.06 * Math.min(this.c.width, this.c.height), 10044 a = this.os[1], 10045 x0 = 0.5 * this.c.width, 10046 y0 = 0.5 * this.c.height, 10047 ctx = this.ctx; 10048 10049 ctx.clearRect(0, 0, this.c.width, this.c.height); 10050 ctx.beginPath(); 10051 ctx.fillStyle = _GraphUtils2.default.color2Rgba(this.p.color, 1); 10052 ctx.rect(0, 0, this.c.width, this.c.height); 10053 ctx.fill(); 10054 10055 ctx.beginPath(); 10056 ctx.shadowBlur = 50; 10057 ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 0.9), Math.abs(this.os[0] / 6.36)); 10058 ctx.shadowColor = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 1), 0.9); 10059 ctx.shadowOffsetX = 0; 10060 ctx.shadowOffsetY = 0; 10061 ctx.font = 'bold ' + Math.round(0.25 * r) + 'px Arial'; 10062 ctx.textAlign = 'center'; 10063 ctx.textBaseline = 'middle'; 10064 ctx.fillText((0, _libs.tr)('Loading...'), x0, y0); 10065 10066 var ps = 10, 10067 da = 2 * Math.PI / ps; //2.5*_r/r 10068 ctx.shadowColor = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 1), 0.7); 10069 for (var i = 0, _a = a, _r = 0.2 * r; i < ps; ++i, _r *= 0.9, _a += da) { 10070 ctx.beginPath(); 10071 ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, (ps - i) / ps), 0.7 * (ps - i) / ps); 10072 var cx = x0 + r * Math.cos(_a), 10073 cy = y0 - r * Math.sin(_a), 10074 nx = x0 + r * Math.cos(_a + da), 10075 ny = y0 - r * Math.sin(_a + da); 10076 ctx.shadowOffsetX = 0.2 * (nx - cx); 10077 ctx.shadowOffsetY = 0.2 * (ny - cy); 10078 ctx.arc(cx, cy, _r, 0, Math.PI * 2, 1); 10079 ctx.fill(); 10080 } 10081 if (this.onChange) { 10082 this.onChange(this.c, this.p.color); 10083 } 10084 } 10085 }; 10086 10087 LoadingAnimation.prototype.getImage = function getImage() { 10088 return this.c; 10089 }; 10090 10091 LoadingAnimation.prototype.dispose = function dispose() { 10092 this.c.width = 0; 10093 this.c.height = 0; 10094 delete this.ctx; 10095 delete this.c; 10096 }; 10097 10098 LoadingAnimation.prototype.createSprite = function createSprite(n) { 10099 var c = (0, _libs.$)('<canvas width="' + this.c.width * n + '" height="' + this.c.height + '"></canvas>')[0], 10100 ctx = c.getContext('2d'), 10101 t = this.calcTimeTo(this.os[1] + Math.sign(this.os[0]) * 2 * Math.PI), 10102 dt = t / (n + 1); 10103 var updateInterval = this.p.updateInterval; 10104 10105 this.p.updateInterval = 0; 10106 for (var i = 0; i < n; ++i) { 10107 this.update(dt); 10108 ctx.drawImage(this.c, i * this.c.width, 0); 10109 } 10110 this.p.updateInterval = updateInterval; 10111 return c; 10112 }; 10113 10114 function LoadingAnimation(width, height, color) { 10115 _classCallCheck(this, LoadingAnimation); 10116 10117 var jC = (0, _libs.$)('<canvas width="' + width + '" height="' + height + '"></canvas>'); 10118 this.c = jC[0]; 10119 this.p = { 10120 g: 9.8, 10121 dt: 1 / 60, 10122 color: color, 10123 updateInterval: 0.25 10124 }; 10125 this.ctx = this.c.getContext('2d'); 10126 this.os = [-2, Math.PI / 2]; 10127 this.t = this.p.updateInterval; 10128 } 10129 10130 return LoadingAnimation; 10131}(); 10132 10133exports.default = LoadingAnimation; 10134 10135/***/ }), 10136/* 53 */ 10137/***/ (function(module, exports, __webpack_require__) { 10138 10139"use strict"; 10140 10141 10142exports.__esModule = true; 10143 10144var _libs = __webpack_require__(0); 10145 10146function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 10147
10148var LoadingController = function () { 10149 function LoadingController(view) { 10150 var showProgress = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 10151 var loadingMsg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; 10152 10153 _classCallCheck(this, LoadingController); 10154 10155 this.view = view; 10156 this.progress = 0; 10157 this.showProgress = showProgress; 10158 this.getLoadingMsg = loadingMsg || LoadingController.defaultLoadingMsg; 10159 this.updateView(); 10160 } 10161 10162 LoadingController.defaultLoadingMsg = function defaultLoadingMsg(progress) { 10163 return ['Please wait... the Application is Loading: ', progress, '%'].join(''); 10164 }; 10165 10166 LoadingController.prototype.dispose = function dispose() { 10167 this.showProgress = false; 10168 this.updateView(); 10169 delete this.view; 10170 }; 10171 10172 LoadingController.prototype.setProgress = function setProgress(v) { 10173 this.progress = v; 10174 this.updateView(); 10175 }; 10176 10177 LoadingController.prototype.updateView = function updateView() { 10178 if (this.view) { 10179 10180 this.view.setState('widLoadingProgress', { 10181 enable: true, 10182 visible: this.showProgress, 10183 active: false 10184 }); 10185 10186 this.view.setState('txtLoadingProgress', { 10187 value: this.getLoadingMsg(this.progress), 10188 visible: true 10189 }); 10190 10191 for (var _iterator = this.view.getLinks(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 10192 var _ref; 10193 10194 if (_isArray) { 10195 if (_i >= _iterator.length) break; 10196 _ref = _iterator[_i++]; 10197 } else { 10198 _i = _iterator.next(); 10199 if (_i.done) break; 10200 _ref = _i.value; 10201 } 10202 10203 var name = _ref; 10204 10205 this.view.setState(name, { 10206 enable: false, 10207 visible: true, 10208 active: false 10209 }); 10210 } 10211 10212 this.view.setState('inpPages', { 10213 visible: true, 10214 value: '' 10215 }); 10216 10217 this.view.setState('inpPage', { 10218 visible: true, 10219 enable: false, 10220 value: '' 10221 }); 10222 } 10223 }; 10224 10225 return LoadingController; 10226}(); 10227 10228exports.default = LoadingController; 10229 10230/***/ }), 10231/* 54 */ 10232/***/ (function(module, exports, __webpack_require__) { 10233 10234"use strict"; 10235 10236 10237exports.__esModule = true; 10238 10239var _libs = __webpack_require__(0); 10240 10241var _EventConverter2 = __webpack_require__(6); 10242 10243var _EventConverter3 = _interopRequireDefault(_EventConverter2); 10244 10245function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 10246 10247function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 10248 10249function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 10250 10251function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 10252 10253var MouseEventConverter = function (_EventConverter) { 10254 _inherits(MouseEventConverter, _EventConverter); 10255 10256 function MouseEventConverter(wnd, doc, element) { 10257 _classCallCheck(this, MouseEventConverter); 10258 10259 var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); 10260 10261 _this.element = element; 10262 _this.binds = { 10263 convert: _this.convert.bind(_this) 10264 }; 10265 (0, _libs.$)(_this.element).on('mousemove mousedown mouseover mouseout click', _this.binds.convert); 10266 (0, _libs.$)(_this.doc).on('mouseup', _this.binds.convert); 10267 return _this; 10268 } 10269
10270 MouseEventConverter.prototype.dispose = function dispose() { 10271 (0, _libs.$)(this.element).off('mousemove mousedown mouseover mouseout click', this.binds.convert); 10272 (0, _libs.$)(this.doc).off('mouseup', this.binds.convert); 10273 }; 10274 10275 return MouseEventConverter; 10276}(_EventConverter3.default); 10277 10278exports.default = MouseEventConverter; 10279 10280/***/ }), 10281/* 55 */ 10282/***/ (function(module, exports, __webpack_require__) { 10283 10284"use strict"; 10285 10286 10287exports.__esModule = true; 10288 10289var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 10290 10291var _libs = __webpack_require__(0); 10292 10293var _MathUtils = __webpack_require__(3); 10294 10295var _MathUtils2 = _interopRequireDefault(_MathUtils); 10296 10297function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 10298 10299function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 10300 10301var Object3DWatcher = function () { 10302 function Object3DWatcher(visual, boundBoxClb) { 10303 var testScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.testScale; 10304 10305 _classCallCheck(this, Object3DWatcher); 10306 10307 this.visual = visual; 10308 this.boundBoxClb = boundBoxClb; 10309 this.testScale = testScale; 10310 this.camera = visual.camera; 10311 this.element = this.visual.element; 10312 this.elementSize = { w: 1, h: 1 }; 10313 this.devicePixelRatio = this.visual.wnd.devicePixelRatio || 1; 10314 this.orbit = visual.getOrbit(); 10315 this.scale = 1; 10316 10317 this.eps = 1e-4; 10318 this.v = new _libs.THREE.Vector3(); 10319 this.dv = new _libs.THREE.Vector2(); 10320 10321 this.enabled = false; 10322 10323 visual.addRenderCallback(this.update.bind(this)); 10324 10325 this.os = { 10326 vx: 0, 10327 vy: 0, 10328 x: 0, 10329 y: 0 10330 }; 10331 this.orbit.update(); 10332 this.camera.updateMatrixWorld(); 10333 var box = this.computeClientBoundBox(), 10334 k = 1.11; 10335 this.movePan({ x: -k * box.mid.x, y: -k * box.mid.y }); 10336 } 10337 10338 Object3DWatcher.prototype.movePan = function movePan(dv) { 10339 this.orbit.pan(dv.x * this.visual.width(), -dv.y * this.visual.height()); 10340 }; 10341 10342 Object3DWatcher.prototype.vToCamera = function vToCamera(v) { 10343 v.project(this.camera); 10344 return { 10345 x: 0.5 * v.x, 10346 y: 0.5 * v.y 10347 }; 10348 }; 10349 10350 Object3DWatcher.prototype.computeClientBoundBox = function computeClientBoundBox() { 10351 var box = this.boundBoxClb(), 10352 xs = [box.min.x, box.max.x], 10353 ys = [0, 0], 10354 zs = [box.min.z, box.max.z]; 10355 10356 var ps = [], 10357 res = { max: {}, min: {} }; 10358 for (var _iterator = xs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 10359 var _ref; 10360 10361 if (_isArray) { 10362 if (_i >= _iterator.length) break; 10363 _ref = _iterator[_i++]; 10364 } else { 10365 _i = _iterator.next(); 10366 if (_i.done) break; 10367 _ref = _i.value; 10368 } 10369 10370 var x = _ref; 10371 10372 for (var _iterator2 = ys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 10373 var _ref2; 10374 10375 if (_isArray2) { 10376 if (_i2 >= _iterator2.length) break; 10377 _ref2 = _iterator2[_i2++]; 10378 } else { 10379 _i2 = _iterator2.next(); 10380 if (_i2.done) break; 10381 _ref2 = _i2.value; 10382 } 10383 10384 var y = _ref2; 10385 10386 for (var _iterator3 = zs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 10387 var _ref3; 10388 10389 if (_isArray3) { 10390 if (_i3 >= _iterator3.length) break; 10391 _ref3 = _iterator3[_i3++]; 10392 } else { 10393 _i3 = _iterator3.next(); 10394 if (_i3.done) break; 10395 _ref3 = _i3.value; 10396 } 10397 10398 var z = _ref3; 10399 10400 ps.push(this.vToCamera(this.v.set(x, y, z))); 10401 } 10402 } 10403 } 10404 10405 ps.sort(function (p1, p2) { 10406 return p1.x - p2.x; 10407 });
10408 res.min.x = ps[0].x; 10409 res.max.x = ps[ps.length - 1].x; 10410 ps.sort(function (p1, p2) { 10411 return p1.y - p2.y; 10412 }); 10413 res.min.y = ps[0].y; 10414 res.max.y = ps[ps.length - 1].y; 10415 10416 res.width = res.max.x - res.min.x; 10417 res.height = res.max.y - res.min.y; 10418 10419 res.mid = { 10420 x: 0.5 * (res.max.x + res.min.x), 10421 y: 0.5 * (res.max.y + res.min.y) 10422 }; 10423 10424 return res; 10425 }; 10426 10427 Object3DWatcher.prototype.setObject = function setObject(boundBoxClb) { 10428 this.boundBoxClb = boundBoxClb; 10429 }; 10430 10431 Object3DWatcher.prototype.testScale = function testScale() { 10432 return true; 10433 }; 10434 10435 Object3DWatcher.prototype.computeCorr = function computeCorr(K, min, max) { 10436 var corr = 0; 10437 if (K < 1) { 10438 if (min > -0.5) { 10439 corr = -0.5 - min; 10440 } else if (max < 0.5) { 10441 corr = 0.5 - max; 10442 } 10443 } else { 10444 if (min < -0.5) { 10445 corr = -0.5 - min; 10446 } else if (max > 0.5) { 10447 corr = 0.5 - max; 10448 } 10449 } 10450 return corr; 10451 }; 10452 10453 Object3DWatcher.prototype.getScale = function getScale() { 10454 var box = this.computeClientBoundBox(), 10455 Kx = this.elementSize.w / box.width, 10456 Ky = this.elementSize.h / box.height; 10457 return 1 / Math.min(Kx, Ky); 10458 }; 10459 10460 Object3DWatcher.prototype.centerView = function centerView(T) { 10461 var _this = this; 10462 10463 var box = this.computeClientBoundBox(), 10464 Kx = this.elementSize.w / box.width, 10465 Ky = this.elementSize.h / box.height, 10466 K = Math.min(Kx, Ky); 10467 10468 if (this.testScale() && Math.abs(1 / K - this.scale) > this.eps) { 10469 var scale = 1 / K + 0.2 * (this.scale - 1 / K); 10470 this.orbit.setScale(this.orbit.getScale() / (K * scale)); 10471 this.orbit.update(); 10472 this.camera.updateMatrixWorld(); 10473 box = this.computeClientBoundBox(); 10474 Kx = this.elementSize.w / box.width; 10475 Ky = this.elementSize.h / box.height; 10476 K = Math.min(Kx, Ky); 10477 } 10478 10479 var dv = this.dv; 10480 if (K > 1 - this.eps) { 10481 dv.set(-box.mid.x, -box.mid.y); 10482 } else { 10483 dv.set(this.computeCorr(Kx, box.min.x, box.max.x), this.computeCorr(Ky, box.min.y, box.max.y)); 10484 } 10485 10486 if (Math.sqrt(this.os.vx * this.os.vx + this.os.vy * this.os.vy) > 0.003 || dv.length() > 0.003) { 10487 var dt = 1 / 60, 10488 t = 0, 10489 os = _extends({}, this.os, { 10490 x: 0, 10491 y: 0 10492 }); 10493 os.tf = function (vx, vy, x, y) { 10494 return { 10495 x: 75 * (dv.x - x) / Math.pow(_this.devicePixelRatio, 1.0), 10496 y: 75 * (dv.y - y) / Math.pow(_this.devicePixelRatio, 1.0) 10497 }; 10498 }; 10499 while (t < T) { 10500 if (t + dt > T) { 10501 dt = T - t; 10502 } 10503 os = this.integrate(os, dt); 10504 t += dt; 10505 } 10506 this.movePan(os); 10507 this.os = os; 10508 } 10509 }; 10510 10511 Object3DWatcher.prototype.integrate = function integrate(os, dt) { 10512 var _MathUtils$rk = _MathUtils2.default.rk4(this.dy.bind(os), 0, dt, [os.vx, os.vy, os.x, os.y]), 10513 vx = _MathUtils$rk[0], 10514 vy = _MathUtils$rk[1], 10515 x = _MathUtils$rk[2], 10516 y = _MathUtils$rk[3]; 10517 10518 return _extends({}, os, { 10519 vx: vx, vy: vy, x: x, y: y 10520 }); 10521 }; 10522 10523 Object3DWatcher.prototype.dy = function dy(t, Y) { 10524 var vx = Y[0], 10525 vy = Y[1], 10526 x = Y[2], 10527 y = Y[3], 10528 vd = 15, 10529 tf = this.tf(vx, vy, x, y); 10530 10531 return [tf.x - vd * vx, tf.y - vd * vy, vx, vy]; 10532 }; 10533 10534 Object3DWatcher.prototype.update = function update(dt) { 10535 if (this.enabled && this.boundBoxClb) { 10536 this.centerView(dt); 10537 } 10538 }; 10539 10540 return Object3DWatcher; 10541}(); 10542 10543exports.default = Object3DWatcher; 10544 10545/***/ }), 10546/* 56 */ 10547/***/ (function(module, exports, __webpack_require__) { 10548 10549"use strict"; 10550 10551 10552exports.__esModule = true; 10553 10554var _libs = __webpack_require__(0); 10555 10556function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 10557 10558function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 10559 10560function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
10560onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 10561 10562var Orbit = function (_THREE$EventDispatche) { 10563 _inherits(Orbit, _THREE$EventDispatche); 10564 10565 function Orbit(object, domElement) { 10566 _classCallCheck(this, Orbit); 10567 10568 var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); 10569 10570 _this.object = object; 10571 _this.domElement = domElement || document.body; 10572 10573 // Set to false to disable this control 10574 _this.enabled = true; 10575 10576 // "target" sets the location of focus, where the object orbits around 10577 _this.target = new _libs.THREE.Vector3(); 10578 10579 // How far you can dolly in and out(PerspectiveCamera only) 10580 _this.minDistance = 0; 10581 _this.maxDistance = Infinity; 10582 10583 // How far you can zoom in and out(OrthographicCamera only) 10584 _this.minZoom = 0; 10585 _this.maxZoom = Infinity; 10586 10587 // How far you can orbit vertically, upper and lower limits. 10588 // Range is 0 to Math.PI radians. 10589 _this.minPolarAngle = 0; // radians 10590 _this.maxPolarAngle = Math.PI; // radians 10591 10592 // How far you can orbit horizontally, upper and lower limits. 10593 // If set, must be a sub-interval of the interval [-Math.PI, Math.PI ]. 10594 _this.minAzimuthAngle = -Infinity; // radians 10595 _this.maxAzimuthAngle = Infinity; // radians 10596 10597 // Set to true to enable damping (inertia) 10598 // If damping is enabled, you must call controls.update() in your animation loop 10599 _this.enableDamping = false; 10600 _this.dampingFactor = 0.25; 10601 10602 // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. 10603 // Set to false to disable zooming 10604 _this.enableZoom = true; 10605 _this.zoomSpeed = 1.0; 10606 10607 // Set to false to disable rotating 10608 _this.enableRotate = true; 10609 _this.rotateSpeed = 1.0; 10610 10611 // Set to false to disable panning 10612 _this.enablePan = true; 10613 10614 // Set to true to automatically rotate around the target 10615 // If auto-rotate is enabled, you must call controls.update() in your animation loop 10616 _this.autoRotate = false; 10617 _this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 10618 10619 // for reset 10620 _this.target0 = _this.target.clone(); 10621 _this.position0 = _this.object.position.clone(); 10622 _this.zoom0 = _this.object.zoom; 10623 10624 // 10625 // public methods 10626 // 10627 _this.getPolarAngle = function () { 10628 return spherical.phi; 10629 }; 10630 10631 _this.getAzimuthalAngle = function () { 10632 return spherical.theta; 10633 }; 10634 10635 _this.reset = function () { 10636 scope.target.copy(scope.target0); 10637 scope.object.position.copy(scope.position0); 10638 scope.object.zoom = scope.zoom0; 10639 10640 scope.object.updateProjectionMatrix(); 10641 scope.dispatchEvent(changeEvent); 10642 10643 scope.update(); 10644 }; 10645 10646 _this.zoomOut = function () { 10647 var speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.zoomSpeed; 10648 10649 var _speed = this.zoomSpeed; 10650 this.zoomSpeed = speed; 10651 dollyIn(getZoomScale()); 10652 this.zoomSpeed = _speed; 10653 }; 10654 10655 _this.zoomIn = function () { 10656 var speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.zoomSpeed; 10657 10658 var _speed = this.zoomSpeed; 10659 this.zoomSpeed = speed; 10660 dollyOut(getZoomScale()); 10661 this.zoomSpeed = _speed; 10662 }; 10663
10664 _this.getScale = function () { 10665 return scale; 10666 }; 10667 10668 _this.setScale = function (newScale) { 10669 scale = newScale; 10670 }; 10671 10672 // this method is exposed, but perhaps it would be better if we can make it private... 10673 _this.update = function () { 10674 var offset = new _libs.THREE.Vector3(); 10675 // so camera.up is the orbit axis 10676 var quat = new _libs.THREE.Quaternion().setFromUnitVectors(object.up, new _libs.THREE.Vector3(0, 1, 0)); 10677 var quatInverse = quat.clone().inverse(); 10678 var lastPosition = new _libs.THREE.Vector3(); 10679 var lastQuaternion = new _libs.THREE.Quaternion(); 10680 10681 return function update() { 10682 var position = scope.object.position; 10683 offset.copy(position).sub(scope.target); 10684 // rotate offset to "y-axis-is-up" space 10685 offset.applyQuaternion(quat); 10686 // angle from z-axis around y-axis 10687 spherical.setFromVector3(offset); 10688 if (scope.autoRotate) { 10689 rotateLeft(getAutoRotationAngle()); 10690 } 10691 spherical.theta += sphericalDelta.theta; 10692 spherical.phi += sphericalDelta.phi; 10693 // restrict theta to be between desired limits 10694 spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); 10695 // restrict phi to be between desired limits 10696 spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); 10697 spherical.makeSafe(); 10698 spherical.radius *= scale; 10699 // restrict radius to be between desired limits 10700 spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); 10701 // move target to panned location 10702 scope.target.add(panOffset); 10703 offset.setFromSpherical(spherical); 10704 // rotate offset back to "camera-up-vector-is-up" space 10705 offset.applyQuaternion(quatInverse); 10706 position.copy(scope.target).add(offset); 10707 scope.object.lookAt(scope.target); 10708 10709 if (scope.enableDamping === true) { 10710 sphericalDelta.theta *= 1 - scope.dampingFactor; 10711 sphericalDelta.phi *= 1 - scope.dampingFactor; 10712 } else { 10713 sphericalDelta.set(0, 0, 0); 10714 } 10715 10716 scale = 1; 10717 panOffset.set(0, 0, 0); 10718 10719 // update condition is: 10720 // min(camera displacement, camera rotation in radians)^2 > EPS 10721 // using small-angle approximation cos(x/2) = 1-x^2 / 8 10722 10723 if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { 10724 10725 scope.dispatchEvent(changeEvent); 10726 10727 lastPosition.copy(scope.object.position); 10728 lastQuaternion.copy(scope.object.quaternion); 10729 zoomChanged = false; 10730 10731 return true; 10732 } 10733 return false; 10734 }; 10735 }(); 10736 10737 _this.dispose = function () {}; 10738 10739 // 10740 // internals 10741 // 10742 var scope = _this; 10743 var changeEvent = { type: 'change' }; 10744 var EPS = 1e-6; 10745 // current position in spherical coordinates 10746 var spherical = new _libs.THREE.Spherical(); 10747 var sphericalDelta = new _libs.THREE.Spherical(); 10748 10749 var scale = 1; 10750 var panOffset = new _libs.THREE.Vector3(); 10751 var zoomChanged = false; 10752 10753 function getAutoRotationAngle() { 10754 return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; 10755 } 10756 10757 function getZoomScale() { 10758 return Math.pow(0.95, scope.zoomSpeed); 10759 } 10760 10761 function rotateLeft(angle) { 10762 sphericalDelta.theta -= angle; 10763 } 10764 10765 function rotateUp(angle) { 10766 sphericalDelta.phi -= angle; 10767 } 10768 10769 var panLeft = function () { 10770 var v = new _libs.THREE.Vector3(); 10771 return function panLeft(distance, objectMatrix) { 10772 v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix 10773 v.multiplyScalar(-distance); 10774 panOffset.add(v); 10775 }; 10776 }(); 10777 10778 var panUp = function () { 10779 var v = new _libs.THREE.Vector3(); 10780 return function panUp(distance, objectMatrix) { 10781 v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix 10782 v.multiplyScalar(distance); 10783 panOffset.add(v); 10784 }; 10785 }(); 10786 10787 // deltaX and deltaY are in pixels; right and down are positive 10788 scope.pan = function () { 10789 var offset = new _libs.THREE.Vector3(); 10790 return function pan(deltaX, deltaY) { 10791 var element = scope.domElement; 10792 if (scope.object instanceof _libs.THREE.PerspectiveCamera) { 10793 // perspective 10794 var position = scope.object.position; 10795 offset.copy(position).sub(scope.target); 10796 var targetDistance = offset.length(); 10797 // half of the fov is center to top of screen 10798 targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0); 10799 // we actually don't use screenWidth, since perspective camera is fixed to screen height 10800 panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); 10801 panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); 10802 }
10802 else if (scope.object instanceof _libs.THREE.OrthographicCamera) { 10803 // orthographic 10804 panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); 10805 panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); 10806 } else { 10807 // camera neither orthographic nor perspective 10808 console.warn('WARNING: OrbitControls.js encountered an unknown camera type-pan disabled.'); 10809 scope.enablePan = false; 10810 } 10811 }; 10812 }(); 10813 10814 function dollyIn(dollyScale) { 10815 if (scope.object instanceof _libs.THREE.PerspectiveCamera) { 10816 scale /= dollyScale; 10817 } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { 10818 scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); 10819 scope.object.updateProjectionMatrix(); 10820 zoomChanged = true; 10821 } else { 10822 console.warn('WARNING: OrbitControls.js encountered an unknown camera type-dolly/zoom disabled.'); 10823 scope.enableZoom = false; 10824 } 10825 } 10826 10827 function dollyOut(dollyScale) { 10828 if (scope.object instanceof _libs.THREE.PerspectiveCamera) { 10829 scale *= dollyScale; 10830 } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { 10831 scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); 10832 scope.object.updateProjectionMatrix(); 10833 zoomChanged = true; 10834 } else { 10835 console.warn('WARNING: OrbitControls.js encountered an unknown camera type-dolly/zoom disabled.'); 10836 scope.enableZoom = false; 10837 } 10838 } 10839 10840 /* Actions */ 10841 10842 function rotate(event, data) { 10843 if (scope.enabled && scope.enableRotate && data.state === 'move') { 10844 var element = scope.domElement; 10845 // rotating across whole screen goes 360 degrees around 10846 rotateLeft(2 * Math.PI * data.dx / element.clientWidth * scope.rotateSpeed); 10847 // rotating up and down along whole screen attempts to go 360, but limited to 180 10848 rotateUp(2 * Math.PI * data.dy / element.clientHeight * scope.rotateSpeed); 10849 scope.update(); 10850 } 10851 } 10852 10853 function pan(event, data) { 10854 if (scope.enabled && scope.enablePan && data.state === 'move') { 10855 scope.pan(data.dx, data.dy); 10856 scope.update(); 10857 } 10858 } 10859 10860 function offsetDolly(event, data) { 10861 if (scope.enabled && scope.enableZoom && data.state === 'move') { 10862 if (data.dy > 0) { 10863 dollyIn(getZoomScale()); 10864 } else if (data.dy < 0) { 10865 dollyOut(getZoomScale()); 10866 } 10867 scope.update(); 10868 } 10869 } 10870 10871 function wheelDolly(event) { 10872 if (scope.enabled && scope.enableZoom) { 10873 if (event.deltaY > 0) { 10874 dollyOut(getZoomScale()); 10875 } else if (event.deltaY < 0) { 10876 dollyIn(getZoomScale()); 10877 } 10878 scope.update(); 10879 } 10880 } 10881 10882 _this.actions = { 10883 rotate: rotate, 10884 pan: pan, 10885 offsetDolly: offsetDolly, 10886 wheelDolly: wheelDolly 10887 10888 // force an update at start 10889 };_this.update(); 10890 return _this; 10891 } 10892 10893 return Orbit; 10894}(_libs.THREE.EventDispatcher); 10895 10896exports.default = Orbit; 10897 10898/***/ }), 10899/* 57 */ 10900/***/ (function(module, exports, __webpack_require__) { 10901 10902"use strict"; 10903 10904 10905exports.__esModule = true; 10906 10907var _libs = __webpack_require__(0); 10908 10909var _ImageBase2 = __webpack_require__(5); 10910 10911var _ImageBase3 = _interopRequireDefault(_ImageBase2); 10912 10913var _Pdf = __webpack_require__(18); 10914 10915var _Pdf2 = _interopRequireDefault(_Pdf); 10916 10917var _BaseMathUtils = __webpack_require__(2); 10918 10919var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); 10920 10921var _CustomEventConverter = __webpack_require__(16); 10922 10923var _CustomEventConverter2 = _interopRequireDefault(_CustomEventConverter); 10924 10925var _PolyTarget = __webpack_require__(69); 10926 10927var _PolyTarget2 = _interopRequireDefault(_PolyTarget); 10928 10929var _Finder = __webpack_require__(17); 10930 10931var _Finder2 = _interopRequireDefault(_Finder); 10932 10933function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 10934 10935function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 10936 10937function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 10938 10939function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
10939onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 10940 10941var PdfImage = function (_ImageBase) { 10942 _inherits(PdfImage, _ImageBase); 10943 10944 function PdfImage(context, width, height, color, pdf, n) { 10945 _classCallCheck(this, PdfImage); 10946 10947 var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); 10948 10949 _this.query = ''; 10950 _this.n = n; 10951 _this.pdf = pdf; 10952 _this.v = { x: 0, y: 0, z: 0, set: function set(x, y, z) { 10953 this.x = x;this.y = y;this.z = z; 10954 return this; 10955 }, transform: function transform(m) { 10956 var x = m.m[0][0] * this.x + m.m[1][0] * this.y + m.m[2][0] * this.z, 10957 y = m.m[0][1] * this.x + m.m[1][1] * this.y + m.m[2][1] * this.z, 10958 z = m.m[0][2] * this.x + m.m[0][2] * this.y + m.m[2][0] * this.z; 10959 this.x = x; 10960 this.y = y; 10961 this.z = z; 10962 return this; 10963 } }; 10964 _this.m = { m: [[1, 0, 0], [0, 1, 0], [0, 0, 1]], set: function set(m00, m01, m02, m10, m11, m12, m20, m21, m22) { 10965 this.m = [[m00, m01, m02], [m10, m11, m12], [m20, m21, m22]]; 10966 return this; 10967 } }; 10968 10969 _this.startRender = function () { 10970 _this.pdf.getHandler(_this.render.bind(_this)); 10971 }; 10972 Promise.resolve().then(function () { 10973 return _this.pdf.getHandler(_this.init.bind(_this)); 10974 }); 10975 return _this; 10976 } 10977 10978 PdfImage.prototype.setQuery = function setQuery(query) { 10979 this.query = query.trim(); 10980 if (this.textContent) { 10981 this.setHits(this.textContent); 10982 // this.finishLoad(); 10983 } 10984 }; 10985 10986 PdfImage.prototype.rectSize = function rectSize(r) { 10987 return { 10988 width: r[2] - r[0], 10989 height: r[3] - r[1] 10990 }; 10991 }; 10992 10993 PdfImage.prototype.createPoly = function createPoly(m, p, s) { 10994 var poly = [], 10995 v = this.v; 10996 v.set(p.x, p.y, 1).transform(m); 10997 poly.push({ x: v.x, y: v.y }); 10998 v.set(p.x, p.y + s.height, 1).transform(m); 10999 poly.push({ x: v.x, y: v.y }); 11000 v.set(p.x + s.width, p.y + s.height, 1).transform(m); 11001 poly.push({ x: v.x, y: v.y }); 11002 v.set(p.x + s.width, p.y, 1).transform(m); 11003 poly.push({ x: v.x, y: v.y }); 11004 return poly; 11005 }; 11006 11007 PdfImage.prototype.getSimulatedDoc = function getSimulatedDoc() { 11008 return this; 11009 }; 11010 11011 PdfImage.prototype.simulate = function simulate(e, doc, x, y) { 11012 if (this.eventConverter) { 11013 this.eventConverter.convert(e, { doc: doc, x: x, y: y }); 11014 } 11015 }; 11016 11017 PdfImage.prototype.setAnnotations = function setAnnotations(annos) { 11018 var _this2 = this; 11019 11020 var t = this.viewport.transform, 11021 targets = []; 11022 this.m.set(t[0], t[1], 0, t[2], t[3], 0, t[4], t[5], 1); 11023 11024 for (var _iterator = annos, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 11025 var _ref; 11026 11027 if (_isArray) { 11028 if (_i >= _iterator.length) break; 11029 _ref = _iterator[_i++]; 11030 } else { 11031 _i = _iterator.next(); 11032 if (_i.done) break; 11033 _ref = _i.value; 11034 } 11035 11036 var anno = _ref; 11037 11038 if (anno.subtype === 'Link') { 11039 var rect = anno.rect, 11040 aPos = { 11041 x: rect[0], 11042 y: rect[1] 11043 }, 11044 aSz = this.rectSize(rect); 11045 var _target = new _PolyTarget2.default(this.createPoly(this.m, aPos, aSz).map(function (p) { 11046 return { x: p.x / _this2.viewport.width, y: 1 - p.y / _this2.viewport.height }; 11047 })); 11048 _target.anno = anno; 11049 _target.callback = this.annoClb.bind(this); 11050 targets.push(_target); 11051 } 11052 } 11053 if (targets.length) { 11054 this.eventConverter = new _CustomEventConverter2.default(this.wnd, this.doc, _PolyTarget2.default.test, this.getSimulatedDoc()); 11055 for (var _iterator2 = targets, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 11056 var _ref2; 11057 11058 if (_isArray2) { 11059 if (_i2 >= _iterator2.length) break; 11060 _ref2 = _iterator2[_i2++]; 11061 } else { 11062 _i2 = _iterator2.next(); 11063 if (_i2.done) break; 11064 _ref2 = _i2.value; 11065 } 11066 11067 var target = _ref2; 11068 11069 this.eventConverter.addCustom(target); 11070 } 11071 } 11072 }; 11073 11074 PdfImage.prototype.setHits = function setHits(textContent) { 11075 this.textContent = textContent; 11076 if (this.query !== '') { 11077 this.finder = new _Finder2.default(textContent.items.map(function (item) { 11078 return item.str; 11079 }), this.query, { contexts: false }); 11080 } 11081 }; 11082 11083 PdfImage.prototype.renderHits = function renderHits() { 11084 var _this3 = this; 11085 11086 if (this.finder) { 11087 var view = this.page.view, 11088 testSz = (0, _libs.$)('<div style="position: absolute; visibility: hidden;"></div>').appendTo('body'), 11089 textDiv = testSz[0], 11090 baseOffset = testSz.offset().left; 11091 for (var _iterator3 = this.finder.getHits(), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 11092 var _ref3; 11093 11094 if (_isArray3) { 11095 if (_i3 >= _iterator3.length) break; 11096 _ref3 = _iterator3[_i3++]; 11097 } else { 11098 _i3 = _iterator3.next(); 11099 if (_i3.done) break; 11100 _ref3 = _i3.value; 11101 } 11102 11103 var hit = _ref3; 11104 11105 var item = this.textContent.items[hit.index], 11106 t = PDFJS.Util.transform(this.viewport.transform, item.transform), 11107 style = this.textContent.styles[item.fontName], 11108 angle = Math.atan2(t[1], t[0]) + (style.vertical ? Math.PI / 2 : 0), 11109 fontHeight = Math.sqrt(t[2] * t[2] + t[3] * t[3]), 11110 fontAscent = style.ascent ? style.ascent * fontHeight : style.descent ? (1 + style.descent) * fontHeight : fontHeight; 11111 testSz.html(item.str.substr(0, hit.offset) + '<span>' + item.str.substr(hit.offset, hit.length) + '</span>' + item.str.substr(hit.offset + hit.length)); 11112 11113 textDiv.style.fontSize = fontHeight + 'px'; 11114 textDiv.style.fontFamily = style.fontFamily; 11115 11116 var testSpan = testSz.find('span'), 11117 iwidth = style.vertical ? item.height * this.viewport.scale : item.width * this.viewport.scale, 11118 width = testSz.width(), 11119 relativeOffset = (testSpan.offset().left - baseOffset) / width; 11120 this.m.set(1, 0, 0, 0, 1, 0, t[4] + fontAscent * Math.sin(angle), t[5] - fontAscent * Math.cos(angle), 1); 11121 var poly = this.createPoly(this.m, { x: relativeOffset * iwidth, y: 0 }, { width: iwidth * testSpan.width() / width, height: testSpan.height() }); 11122 poly = poly.map(function (p) { 11123 return { x: p.x / _this3.viewport.width, y: 1 - p.y / _this3.viewport.height }; 11124 }); 11125 this.renderHit(poly); 11126 } 11127 testSz.remove(); 11128 } 11129 }; 11130 11131 PdfImage.prototype.annoClb = function annoClb(e, data) { 11132 if (this.context.dispatchEvent) { 11133 this.context.dispatchEvent({ 11134 type: 'pdfAnnotation', 11135 event: e, 11136 annotation: data.target.anno 11137 }); 11138 } 11139 }; 11140 11141 PdfImage.prototype.calcViewport = function calcViewport() { 11142 var scale = _BaseMathUtils2.default.calcScale(this.size.width, this.size.height, this.resW, this.resH); 11143 if (!this.viewport || Math.abs(this.viewport.scale - scale) > 1e-4) { 11144 this.viewport = this.page.getViewport(scale);
11145 if (this.type !== 'full') { 11146 if (this.type === 'right') { 11147 this.viewport.offsetX += 0.5 * this.viewport.width; 11148 this.viewport.transform[4] -= 0.5 * this.viewport.width; 11149 } 11150 this.viewport.width /= 2; 11151 } 11152 this.resW = this.width = this.viewport.width; 11153 this.resH = this.height = this.viewport.height; 11154 } 11155 }; 11156 11157 PdfImage.prototype.init = function init() { 11158 var _this4 = this; 11159 11160 this.type = this.pdf.getPageType(this.n); 11161 this.pdf.getPage(this.n).then(function (page) { 11162 _this4.page = page; 11163 _this4.size = _Pdf2.default.getPageSize(page); 11164 if (_this4.type !== 'full') { 11165 _this4.size.width /= 2; 11166 } 11167 page.getAnnotations().then(_this4.setAnnotations.bind(_this4)); 11168 page.getTextContent().then(_this4.setHits.bind(_this4)); 11169 _this4.calcViewport(); 11170 _this4.finishLoad(); 11171 }).catch(function (e) { 11172 console.error('Cannot load PDF page: ' + (_this4.n + 1)); 11173 _this4.finishLoad(); 11174 }); 11175 }; 11176 11177 PdfImage.prototype.setResolution = function setResolution(res) { 11178 _ImageBase.prototype.setResolution.call(this, res); 11179 if (this.page) { 11180 this.calcViewport(); 11181 } 11182 }; 11183 11184 PdfImage.prototype.render = function render(handler) { 11185 var _this5 = this; 11186 11187 if (this.page) { 11188 this.page.render({ 11189 canvasContext: this.pushCtx(), 11190 viewport: this.viewport 11191 }).then(function () { 11192 _this5.renderHits(); 11193 _this5.popCtx(); 11194 _this5.finishRender(); 11195 }); 11196 } else { 11197 this.renderBlankPage(); 11198 this.finishRender(); 11199 } 11200 }; 11201 11202 return PdfImage; 11203}(_ImageBase3.default); 11204 11205exports.default = PdfImage; 11206 11207/***/ }), 11208/* 58 */ 11209/***/ (function(module, exports, __webpack_require__) { 11210 11211"use strict"; 11212 11213 11214exports.__esModule = true; 11215 11216var _libs = __webpack_require__(0); 11217 11218function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11219 11220var Search = function () { 11221 function Search(container, pages) { 11222 _classCallCheck(this, Search); 11223 11224 this.container = container; 11225 this.pages = pages; 11226 this.prevResults = []; 11227 container.html('\n <div class="search">\n <div class="query">\n <input class="inpQuery" type="text" maxlength="30" value="" />\n </div>\n <div class="results">\n </div>\n <div class="status">\n\n </div>\n </div>\n '); 11228 this.query = container.find('.query input'); 11229 this.results = container.find('.results'); 11230 this.status = container.find('.status'); 11231 11232 this.binds = { 11233 navigate: this.navigate.bind(this), 11234 doQuery: this.doQuery.bind(this) 11235 }; 11236 11237 this.query.on('keydown', this.binds.doQuery); 11238 this.results.on('click', this.binds.navigate); 11239 } 11240 11241 Search.prototype.dispose = function dispose() { 11242 this.results.off('click', this.binds.navigate); 11243 this.query.off('keydown', this.binds.doQuery); 11244 }; 11245 11246 Search.prototype.navigate = function navigate(e) { 11247 e.preventDefault(); 11248 if (this.onNavigate !== undefined) { 11249 var target = (0, _libs.$)(e.target); 11250 if (!target.hasClass('result')) { 11251 var t = target.find('.result'); 11252 if (t.length) { 11253 target = t; 11254 } else { 11255 while (target.length && !target.hasClass('result')) { 11256 target = (0, _libs.$)(target[0].parentNode); 11257 } 11258 } 11259 } 11260 var page = target.attr('data'); 11261 if (page !== undefined) { 11262 this.onNavigate(parseInt(page)); 11263 } 11264 } 11265 }; 11266 11267 Search.prototype.doQuery = function doQuery() { 11268 var _this = this; 11269 11270 if (this.onQuery) { 11271 var queryStamp = this.queryStamp = Date.now(); 11272 setTimeout(function () { 11273 if (queryStamp === _this.queryStamp) { 11274 _this.onQuery(_this.query[0].value.trim()); 11275 } 11276 }, 1000); 11277 } 11278 }; 11279 11280 Search.prototype.setResults = function setResults(results, lastPage) { 11281 if (this.prevResults.length && results[0] !== this.prevResults[0]) { 11282 this.prevResults = []; 11283 this.results.html(''); 11284 } 11285 var htmls = []; 11286 for (var i = this.prevResults.length; i < results.length; ++i) { 11287 var result = results[i];
11288 htmls.push('<div class="result" data="' + result.page + '">'); 11289 htmls.push('<a href="#">'); 11290 htmls.push('<div>' + result.contexts.join('</div><div>') + '</div>'); 11291 htmls.push('</a>'); 11292 htmls.push('</div>'); 11293 } 11294 (0, _libs.$)(htmls.join('')).appendTo(this.results); 11295 this.prevResults = [].concat(results); 11296 if (lastPage === undefined) { 11297 this.status.html(''); 11298 } else { 11299 this.status.html(lastPage + ' of ' + this.pages); 11300 } 11301 }; 11302 11303 return Search; 11304}(); 11305 11306exports.default = Search; 11307 11308/***/ }), 11309/* 59 */ 11310/***/ (function(module, exports, __webpack_require__) { 11311 11312"use strict"; 11313 11314 11315exports.__esModule = true; 11316 11317var _libs = __webpack_require__(0); 11318 11319var _ImageBase2 = __webpack_require__(5); 11320 11321var _ImageBase3 = _interopRequireDefault(_ImageBase2); 11322 11323var _Utils = __webpack_require__(4); 11324 11325var _Utils2 = _interopRequireDefault(_Utils); 11326 11327function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 11328 11329function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11330 11331function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 11332 11333function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 11334 11335var StaticImage = function (_ImageBase) { 11336 _inherits(StaticImage, _ImageBase); 11337 11338 function StaticImage(context, width, height, color, src) { 11339 _classCallCheck(this, StaticImage); 11340 11341 var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); 11342 11343 _this.binds = {}; 11344 _this.image = new Image(); 11345 _this.image.crossOrigin = 'Anonymous'; 11346 _this.binds.imageLoad = function () { 11347 _this.width = _this.image.width; 11348 _this.height = _this.image.height; 11349 _this.startRender = function () { 11350 _this.renderImage(_this.image); 11351 _this.finishRender(); 11352 }; 11353 _this.finishLoad(); 11354 }; 11355 _this.binds.imageError = function () { 11356 _this.startRender = function () { 11357 _this.renderNotFoundPage(); 11358 _this.finishRender(); 11359 }; 11360 _this.finishLoad(); 11361 }; 11362 (0, _libs.$)(_this.image).on('load', _this.binds.imageLoad).on('error', _this.binds.imageError); 11363 _this.image.src = _Utils2.default.normalizeUrl(src); 11364 return _this; 11365 } 11366 11367 StaticImage.prototype.dispose = function dispose() { 11368 (0, _libs.$)(this.image).off('load', this.binds.imageLoad).off('error', this.binds.imageError); 11369 this.image.src = ''; 11370 delete this.image; 11371 _ImageBase.prototype.dispose.call(this); 11372 }; 11373 11374 return StaticImage; 11375}(_ImageBase3.default); 11376 11377exports.default = StaticImage; 11378 11379/***/ }), 11380/* 60 */ 11381/***/ (function(module, exports, __webpack_require__) { 11382 11383"use strict"; 11384 11385 11386exports.__esModule = true; 11387 11388var _libs = __webpack_require__(0); 11389 11390function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11391 11392var TextureAnimator = function () { 11393 function TextureAnimator(img, tilesHoriz, tilesVert, numTiles, tileDispDuration) { 11394 _classCallCheck(this, TextureAnimator); 11395 11396 var texture = new _libs.THREE.Texture(); 11397 texture.minFilter = _libs.THREE.LinearFilter; 11398 texture.image = img; 11399 texture.needsUpdate = true; 11400 11401 // note: texture passed by reference, will be updated by the update function. 11402 this.texture = texture; 11403 this.tilesHorizontal = tilesHoriz; 11404 this.tilesVertical = tilesVert;
11405 // how many images does this spritesheet contain? 11406 // usually equals tilesHoriz * tilesVert, but not necessarily, 11407 // if there at blank tiles at the bottom of the spritesheet. 11408 this.numberOfTiles = numTiles; 11409 texture.repeat.set(1 / this.tilesHorizontal, 1 / this.tilesVertical); 11410 11411 // how long should each image be displayed? 11412 this.tileDisplayDuration = tileDispDuration; 11413 11414 // how long has the current image been displayed? 11415 this.currentDisplayTime = 0; 11416 11417 // which image is currently being displayed? 11418 this.currentTile = 0; 11419 } 11420 11421 TextureAnimator.prototype.update = function update(milliSec) { 11422 this.currentDisplayTime += milliSec; 11423 while (this.currentDisplayTime > this.tileDisplayDuration) { 11424 this.currentDisplayTime -= this.tileDisplayDuration; 11425 ++this.currentTile; 11426 if (this.currentTile == this.numberOfTiles) this.currentTile = 0; 11427 var currentColumn = this.currentTile % this.tilesHorizontal; 11428 this.texture.offset.x = currentColumn / this.tilesHorizontal; 11429 var currentRow = Math.floor(this.currentTile / this.tilesHorizontal); 11430 this.texture.offset.y = currentRow / this.tilesVertical; 11431 } 11432 }; 11433 11434 TextureAnimator.prototype.dispose = function dispose() { 11435 var img = this.texture.image; 11436 img.height = img.width = 0; 11437 this.texture.dispose(); 11438 }; 11439 11440 return TextureAnimator; 11441}(); 11442 11443exports.default = TextureAnimator; 11444 11445/***/ }), 11446/* 61 */ 11447/***/ (function(module, exports, __webpack_require__) { 11448 11449"use strict"; 11450 11451 11452exports.__esModule = true; 11453 11454var _libs = __webpack_require__(0); 11455 11456var _Utils = __webpack_require__(4); 11457 11458var _Utils2 = _interopRequireDefault(_Utils); 11459 11460var _MouseEventConverter2 = __webpack_require__(54); 11461 11462var _MouseEventConverter3 = _interopRequireDefault(_MouseEventConverter2); 11463 11464var _ThreeEventConverter = __webpack_require__(19); 11465 11466var _ThreeEventConverter2 = _interopRequireDefault(_ThreeEventConverter); 11467 11468function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 11469 11470function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11471 11472function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 11473 11474function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 11475 11476var ThreeMouseEventConverter = function (_MouseEventConverter) { 11477 _inherits(ThreeMouseEventConverter, _MouseEventConverter); 11478 11479 function ThreeMouseEventConverter(wnd, doc, visualWorld, test) { 11480 _classCallCheck(this, ThreeMouseEventConverter); 11481 11482 var _this = _possibleConstructorReturn(this, _MouseEventConverter.call(this, wnd, doc, visualWorld.element)); 11483 11484 _Utils2.default.extends(_this, new _ThreeEventConverter2.default(visualWorld, test)); 11485 return _this; 11486 } 11487 11488 ThreeMouseEventConverter.prototype.getCallback = function getCallback(object) { 11489 return object.object.userData.mouseCallback; 11490 }; 11491 11492 ThreeMouseEventConverter.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { 11493 var jElement = (0, _libs.$)(this.element); 11494 var offset = jElement.offset(); 11495 this.coords.x = (e.pageX - offset.left) / jElement.width() * 2 - 1; 11496 this.coords.y = -((e.pageY - offset.top) / jElement.height()) * 2 + 1; 11497 return this.coords; 11498 }; 11499 11500 return ThreeMouseEventConverter; 11501}(_MouseEventConverter3.default); 11502 11503exports.default = ThreeMouseEventConverter; 11504 11505/***/ }), 11506/* 62 */ 11507/***/ (function(module, exports, __webpack_require__) { 11508 11509"use strict"; 11510 11511 11512exports.__esModule = true; 11513 11514var _libs = __webpack_require__(0); 11515 11516var _Utils = __webpack_require__(4); 11517 11518var _Utils2 = _interopRequireDefault(_Utils); 11519 11520var _TouchEventConverter2 = __webpack_require__(64); 11521 11522var _TouchEventConverter3 = _interopRequireDefault(_TouchEventConverter2); 11523 11524var _ThreeEventConverter = __webpack_require__(19); 11525 11526var _ThreeEventConverter2 = _interopRequireDefault(_ThreeEventConverter); 11527 11528function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 11529 11530function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11531 11532function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 11533 11534function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
11534onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 11535 11536var ThreeTouchEventConverter = function (_TouchEventConverter) { 11537 _inherits(ThreeTouchEventConverter, _TouchEventConverter); 11538 11539 function ThreeTouchEventConverter(wnd, doc, visualWorld, test) { 11540 _classCallCheck(this, ThreeTouchEventConverter); 11541 11542 var _this = _possibleConstructorReturn(this, _TouchEventConverter.call(this, wnd, doc, visualWorld.element)); 11543 11544 _Utils2.default.extends(_this, new _ThreeEventConverter2.default(visualWorld, test)); 11545 return _this; 11546 } 11547 11548 ThreeTouchEventConverter.prototype.getCallback = function getCallback(object) { 11549 return object.object.userData.touchCallback; 11550 }; 11551 11552 ThreeTouchEventConverter.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { 11553 var jElement = (0, _libs.$)(this.element), 11554 offset = jElement.offset(), 11555 touches = e.touches || e.originalEvent.touches, 11556 touch = touches.length ? touches[0] : (this.lastTouches || [{ pageX: 0, pageY: 0 }])[0], 11557 pageX = touch.pageX, 11558 pageY = touch.pageY; 11559 this.lastTouches = touches.length ? touches : this.lastTouches; 11560 this.coords.x = (pageX - offset.left) / jElement.width() * 2 - 1; 11561 this.coords.y = -((pageY - offset.top) / jElement.height()) * 2 + 1; 11562 return this.coords; 11563 }; 11564 11565 return ThreeTouchEventConverter; 11566}(_TouchEventConverter3.default); 11567 11568exports.default = ThreeTouchEventConverter; 11569 11570/***/ }), 11571/* 63 */ 11572/***/ (function(module, exports, __webpack_require__) { 11573 11574"use strict"; 11575 11576 11577exports.__esModule = true; 11578 11579var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 11580 11581var _libs = __webpack_require__(0); 11582 11583var _ImageFactory = __webpack_require__(8); 11584 11585var _ImageFactory2 = _interopRequireDefault(_ImageFactory); 11586 11587function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 11588 11589function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11590 11591var Thumbnails = function () { 11592 function Thumbnails(context, container, thumbnailsClb, size) { 11593 var _this = this; 11594 11595 var props = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { kWtoH: 210 / 297 }; 11596 11597 _classCallCheck(this, Thumbnails); 11598 11599 this.container = container; 11600 this.p = props; 11601 this.thumbnailsClb = thumbnailsClb; 11602 this.size = size; 11603 this.canvas = (0, _libs.$)('<canvas>')[0]; 11604 this.imageFactory = new _ImageFactory2.default(_extends({}, context, { 11605 renderCanvas: this.canvas, 11606 renderCanvasCtx: this.canvas.getContext('2d') 11607 })); 11608 this.thumbnails = []; 11609 for (var i = 0; i < size; ++i) { 11610 var info = this.thumbnailsClb(i); 11611 this.thumbnails.push(_extends({}, info, { 11612 index: i, 11613 loaded: info.type === 'thumbnail-image', 11614 heading: null, 11615 thumbnail: null, 11616 title: info.title || i 11617 })); 11618 } 11619 11620 this.binds = { 11621 update: this.update.bind(this), 11622 navigate: function navigate(e) { 11623 e.preventDefault(); 11624 if (_this.onNavigate) { 11625 var node = e.target; 11626 while (node && !node.dataThumbnail) { 11627 node = node.parentNode; 11628 } 11629 _this.onNavigate(node.dataThumbnail.index); 11630 } 11631 } 11632 }; 11633 this.container.on('scroll', this.binds.update); 11634 } 11635 11636 Thumbnails.prototype.getSize = function getSize() { 11637 return this.size; 11638 }; 11639 11640 Thumbnails.prototype.setEnable = function setEnable(enable) { 11641 this.enable = enable; 11642 this.update(); 11643 }; 11644 11645 Thumbnails.prototype.dispose = function dispose() { 11646 this.container.find('a').off('click', this.binds.navigate); 11647 this.container.off('scroll', this.binds.update); 11648 this.container.html(''); 11649 this.canvas.height = this.canvas.width = 0; 11650 delete this.canvas; 11651 }; 11652
11653 Thumbnails.prototype.load = function load(thumbnail) { 11654 var _this2 = this; 11655 11656 this.loading = true; 11657 var wrapper = this.imageFactory.build(thumbnail, thumbnail.number === undefined ? thumbnail.index : thumbnail.number, this.p.kWtoH * 300, 300); 11658 wrapper.onChange = function (canvas) { 11659 _this2.setImage(thumbnail, canvas.toDataURL('image/png')); 11660 thumbnail.loaded = true; 11661 wrapper.dispose(); 11662 _this2.loading = false; 11663 Promise.resolve().then(function () { 11664 return _this2.update(); 11665 }); 11666 }; 11667 }; 11668 11669 Thumbnails.prototype.getActive = function getActive() { 11670 var first = this.container.scrollTop(), 11671 last = first + this.container.height(), 11672 res = []; 11673 for (var _iterator = this.thumbnails, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 11674 var _ref; 11675 11676 if (_isArray) { 11677 if (_i >= _iterator.length) break; 11678 _ref = _iterator[_i++]; 11679 } else { 11680 _i = _iterator.next(); 11681 if (_i.done) break; 11682 _ref = _i.value; 11683 } 11684 11685 var thumbnail = _ref; 11686 11687 if (Math.max(thumbnail.first, first) < Math.min(thumbnail.last, last)) { 11688 res.push(thumbnail); 11689 } 11690 } 11691 return res; 11692 }; 11693 11694 Thumbnails.prototype.update = function update() { 11695 if (!this.loading && this.canvas && this.enable) { 11696 if (!this.built) { 11697 this.render(); 11698 } 11699 var active = this.getActive(); 11700 for (var _iterator2 = active, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 11701 var _ref2; 11702 11703 if (_isArray2) { 11704 if (_i2 >= _iterator2.length) break; 11705 _ref2 = _iterator2[_i2++]; 11706 } else { 11707 _i2 = _iterator2.next(); 11708 if (_i2.done) break; 11709 _ref2 = _i2.value; 11710 } 11711 11712 var thumbnail = _ref2; 11713 11714 if (!thumbnail.loaded) { 11715 this.load(thumbnail); 11716 break; 11717 } 11718 } 11719 } 11720 }; 11721 11722 Thumbnails.prototype.setImage = function setImage(thumbnail, img) { 11723 thumbnail.img = img; 11724 thumbnail.thumbnail.css('background-image', ['url(\'', img, '\')'].join('')); 11725 thumbnail.thumbnail.removeClass('loading'); 11726 }; 11727 11728 Thumbnails.prototype.render = function render() { 11729 var elements = ['<div class="thumbnails">']; 11730 for (var i = 0; i < this.size; ++i) { 11731 elements.push(['<div class="item"><a href="#"><div class="thumbnail loading"></div></a><div class="heading"><a href="#" title="', i + 1, '">', i + 1, '</a></div></div>'].join('')); 11732 } 11733 elements.push('</div>'); 11734 this.container.append(elements.join('')); 11735 var items = this.container.find('.item'), 11736 base = this.container.find('.thumbnails').offset().top; 11737 for (var _i3 = 0; _i3 < items.length; ++_i3) { 11738 var item = (0, _libs.$)(items[_i3]); 11739 this.thumbnails[_i3].heading = item.find('.heading'); 11740 this.thumbnails[_i3].thumbnail = item.find('.thumbnail'); 11741 this.thumbnails[_i3].first = item.offset().top - base; 11742 this.thumbnails[_i3].last = this.thumbnails[_i3].first + item.height(); 11743 if (this.thumbnails[_i3].loaded) { 11744 this.setImage(this.thumbnails[_i3], this.thumbnails[_i3].src); 11745 } 11746 var as = item.find('a'); 11747 for (var j = 0; j < as.length; ++j) { 11748 var a = as[j]; 11749 a.dataThumbnail = this.thumbnails[_i3]; 11750 } 11751 } 11752 this.container.find('a').on('click', this.binds.navigate); 11753 this.built = true; 11754 }; 11755 11756 return Thumbnails; 11757}(); 11758 11759exports.default = Thumbnails; 11760 11761/***/ }), 11762/* 64 */ 11763/***/ (function(module, exports, __webpack_require__) { 11764 11765"use strict"; 11766 11767 11768exports.__esModule = true; 11769 11770var _libs = __webpack_require__(0); 11771 11772var _EventConverter2 = __webpack_require__(6); 11773 11774var _EventConverter3 = _interopRequireDefault(_EventConverter2); 11775 11776function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 11777 11778function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11779 11780function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 11781 11782function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
11782onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 11783 11784var TouchConverter = function (_EventConverter) { 11785 _inherits(TouchConverter, _EventConverter); 11786 11787 function TouchConverter(wnd, doc, element) { 11788 _classCallCheck(this, TouchConverter); 11789 11790 var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); 11791 11792 _this.element = element; 11793 _this.binds = { 11794 convert: _this.convert.bind(_this) 11795 }; 11796 (0, _libs.$)(_this.element).on('touchstart touchmove', _this.binds.convert); 11797 (0, _libs.$)(_this.doc).on('touchend', _this.binds.convert); 11798 return _this; 11799 } 11800 11801 TouchConverter.prototype.dispose = function dispose() { 11802 (0, _libs.$)(this.element).off('touchstart touchmove', this.binds.convert); 11803 (0, _libs.$)(this.doc).off('touchend', this.binds.convert); 11804 }; 11805 11806 return TouchConverter; 11807}(_EventConverter3.default); 11808 11809exports.default = TouchConverter; 11810 11811/***/ }), 11812/* 65 */ 11813/***/ (function(module, exports, __webpack_require__) { 11814 11815"use strict"; 11816 11817 11818exports.__esModule = true; 11819 11820var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 11821 11822var _libs = __webpack_require__(0); 11823 11824function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 11825 11826var View = function () { 11827 View.classProperty = function classProperty(ctrl, className, value) { 11828 if (value) { 11829 ctrl.addClass(className); 11830 } else { 11831 ctrl.removeClass(className); 11832 } 11833 }; 11834 11835 View.attributeProperty = function attributeProperty(ctrl, attributeName, value) { 11836 if (value) { 11837 ctrl.attr(attributeName, value); 11838 } else { 11839 ctrl.removeAttr(attributeName); 11840 } 11841 }; 11842 11843 View.callHandlers = function callHandlers(handlers, id, e, data) { 11844 for (var _iterator = handlers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 11845 var _ref; 11846 11847 if (_isArray) { 11848 if (_i >= _iterator.length) break; 11849 _ref = _iterator[_i++]; 11850 } else { 11851 _i = _iterator.next(); 11852 if (_i.done) break; 11853 _ref = _i.value; 11854 } 11855 11856 var handler = _ref; 11857 11858 if (handler[id]) { 11859 handler[id](e, data); 11860 } else if (handler.handleDefault) { 11861 handler.handleDefault(id, e, data); 11862 } 11863 } 11864 }; 11865 11866 View.handleEvent = function handleEvent(id, getHandlers, e, data) { 11867 View.callHandlers(getHandlers(id), id, e, data); 11868 }; 11869 11870 View.handleLinkEvent = function handleLinkEvent(e) { 11871 e.preventDefault(); 11872 if (!this.ctrl.hasClass('disabled')) { 11873 View.handleEvent(this.id, this.getHandlers, e); 11874 } 11875 }; 11876 11877 View.handleInputEvent = function handleInputEvent(e) { 11878 View.handleEvent(this.id, this.getHandlers, e, e.target.value); 11879 }; 11880 11881 View.handleFormEvent = function handleFormEvent(e) { 11882 e.preventDefault(); 11883 View.handleEvent(this.id, this.getHandlers, e); 11884 }; 11885 11886 // virtual functions { 11887 11888 11889 View.prototype.getLinks = function getLinks() { 11890 return null; 11891 }; 11892 11893 View.prototype.getWidgets = function getWidgets() { 11894 return null; 11895 }; 11896 11897 View.prototype.getInputs = function getInputs() { 11898 return null; 11899 }; 11900 11901 View.prototype.getTexts = function getTexts() { 11902 return null; 11903 }; 11904 11905 View.prototype.getTemplate = function getTemplate() { 11906 return {}; 11907 }; 11908 11909 View.prototype.getHandlers = function getHandlers(id) { 11910 return this.handlers; 11911 }; 11912 // } 11913 11914 View.prototype.callLater = function callLater(handlers, id, e, data, ms) { 11915 var _this = this; 11916 11917 this.pendings[id] = { 11918 timestamp: new Date().getTime() 11919 }; 11920 setTimeout(function () { 11921 var timestamp = new Date().getTime(), 11922 pending = _this.pendings[id]; 11923 if (pending && timestamp - pending.timestamp >= ms) { 11924 View.callHandlers(handlers, id, e, data); 11925 delete _this.pendings[id]; 11926 } 11927 }, ms); 11928 }; 11929 11930 // loadFiles(urls, ready, failure) { 11931 // let done = Promise.resolve(); 11932 // for(let url of urls) { 11933 // done = done.then(()=> { 11934 // return new Promise((resolve, reject)=> { 11935 // $.get(url, (res)=> { 11936 // ready(res, url); 11937 // resolve(); 11938 // }).fail((res)=> { 11939 // if(failure && failure(res, url)) { 11940 // resolve(); 11941 // } 11942 // else { 11943 // reject(res); 11944 // } 11945 // }); 11946 // }); 11947 // }); 11948 // } 11949 // return done; 11950 // } 11951 11952 View.prototype.loadFiles = function loadFiles(urls, files) { 11953 var tasks = []; 11954 11955 var _loop = function _loop() { 11956 if (_isArray2) { 11957 if (_i2 >= _iterator2.length) return 'break'; 11958 _ref2 = _iterator2[_i2++]; 11959 } else { 11960 _i2 = _iterator2.next(); 11961 if (_i2.done) return 'break'; 11962 _ref2 = _i2.value; 11963 } 11964 11965 var name = _ref2; 11966 11967 files[name] = []; 11968 11969 var _loop2 = function _loop2() { 11970 if (_isArray3) { 11971 if (_i3 >= _iterator3.length) return 'break'; 11972 _ref3 = _iterator3[_i3++]; 11973 } else { 11974 _i3 = _iterator3.next(); 11975 if (_i3.done) return 'break'; 11976 _ref3 = _i3.value; 11977 } 11978 11979 var url = _ref3; 11980 11981 tasks.push(new Promise(function (resolve, reject) { 11982 _libs.$.get(url, function (data) { 11983 files[name].push({ url: url, data: data }); 11984 resolve(); 11985 }).fail(function (res) { 11986 reject(res); 11987 }); 11988 })); 11989 }; 11990 11991 for (var _iterator3 = urls[name], _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { 11992 var _ref3; 11993 11994 var _ret2 = _loop2(); 11995 11996 if (_ret2 === 'break') break; 11997 } 11998 }; 11999 12000 for (var _iterator2 = Object.keys(urls), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { 12001 var _ref2; 12002 12003 var _ret = _loop();
12004 12005 if (_ret === 'break') break; 12006 } 12007 return Promise.all(tasks); 12008 }; 12009 12010 View.prototype.urlResolver = function urlResolver(baseUrl, url) { 12011 url = url.replace(/\\/g, '/'); 12012 if (url.charAt(0) !== '/') { 12013 baseUrl = baseUrl.replace(/\\/g, '/'); 12014 var p = baseUrl.lastIndexOf('/'); 12015 url = (~p ? baseUrl.substr(0, p + 1) : '') + url; 12016 12017 var parts = url.split('/'); 12018 url = []; 12019 for (var _iterator4 = parts, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { 12020 var _ref4; 12021 12022 if (_isArray4) { 12023 if (_i4 >= _iterator4.length) break; 12024 _ref4 = _iterator4[_i4++]; 12025 } else { 12026 _i4 = _iterator4.next(); 12027 if (_i4.done) break; 12028 _ref4 = _i4.value; 12029 } 12030 12031 var part = _ref4; 12032 12033 if (part === '.') {} else if (part === '..') { 12034 if (url.length && !(url.length === 1 && url[0] === '')) { 12035 url.pop(); 12036 } 12037 } else { 12038 url.push(part); 12039 } 12040 } 12041 url = url.join('/'); 12042 } 12043 12044 return url; 12045 }; 12046 12047 View.prototype.objToAttrsStr = function objToAttrsStr(o) { 12048 var res = []; 12049 for (var _iterator5 = Object.keys(o), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { 12050 var _ref5; 12051 12052 if (_isArray5) { 12053 if (_i5 >= _iterator5.length) break; 12054 _ref5 = _iterator5[_i5++]; 12055 } else { 12056 _i5 = _iterator5.next(); 12057 if (_i5.done) break; 12058 _ref5 = _i5.value; 12059 } 12060 12061 var _name = _ref5; 12062 12063 res.push([_name, '="', o[_name], '"'].join('')); 12064 } 12065 return res.join(' '); 12066 }; 12067 12068 View.prototype.checkIframeSize = function checkIframeSize() { 12069 if (this.frame) { 12070 if (Math.abs(this.frame.width - this.parentContainer.width()) > 1 || Math.abs(this.frame.height - this.parentContainer.height()) > 1) { 12071 this.onResize(); 12072 } 12073 setTimeout(this.checkIframeSize.bind(this), 250); 12074 } 12075 }; 12076 12077 View.prototype.onResize = function onResize() { 12078 this.frame.width = this.parentContainer.width(); 12079 this.frame.height = this.parentContainer.height(); 12080 }; 12081 12082 View.prototype.translate = function translate(html) { 12083 return html.replace(/<\$tr>(.*)<\/\$tr>/gi, function (s0, s1) { 12084 return (0, _libs.tr)(s1); 12085 }); 12086 }; 12087 12088 View.prototype.fireLinksOnLoadEvent = function fireLinksOnLoadEvent() { 12089 var _this2 = this; 12090 12091 if (this.templateObject && this.templateObject.linkLoaded) { 12092 var loaded = true; 12093 12094 var _loop3 = function _loop3() { 12095 if (_isArray6) { 12096 if (_i6 >= _iterator6.length) return 'break'; 12097 _ref6 = _iterator6[_i6++]; 12098 } else { 12099 _i6 = _iterator6.next(); 12100 if (_i6.done) return 'break'; 12101 _ref6 = _i6.value; 12102 } 12103 12104 var jLink = _ref6; 12105 12106 var link = jLink[0]; 12107 var img = new Image(); 12108 img.onerror = function () { 12109 return _this2.templateObject.linkLoaded(link); 12110 }; 12111 img.src = link.href; 12112 }; 12113 12114 for (var _iterator6 = this.jLinks, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { 12115 var _ref6; 12116 12117 var _ret3 = _loop3(); 12118 12119 if (_ret3 === 'break') break; 12120 } 12121 } 12122 }; 12123 12124 function View(parentContainer, onLoad) { 12125 var _this3 = this; 12126 12127 var template = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 12128 12129 _classCallCheck(this, View); 12130 12131 this.pendings = {}; 12132 this.binds = { 12133 onResize: this.onResize.bind(this) 12134 }; 12135 this.parentContainer = (0, _libs.$)(parentContainer); 12136 this.isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 12137 this.parentContainer.html('<iframe style="border: 0;' + (this.isIOS ? '' : ' width: 100%; height: 100%') + '" scrolling="no"></iframe>'); 12138 12139 this.frame = this.parentContainer.find('iframe')[0];
12140 if (this.frame.contentWindow.stop) { 12141 this.frame.contentWindow.stop(); 12142 } 12143 if (this.isIOS) { 12144 (0, _libs.$)(this.parentContainer[0].ownerDocument.defaultView).on('resize', this.binds.onResize); 12145 this.onResize(); 12146 setTimeout(this.checkIframeSize.bind(this), 250); 12147 } 12148 12149 this.container = (0, _libs.$)(this.frame.contentDocument.body); 12150 this.container.css('margin', '0'); 12151 this.head = (0, _libs.$)(this.frame.contentDocument.head); 12152 this.onLoad = onLoad; 12153 this.handlers = []; 12154 12155 var script = template.html ? template.script : this.getTemplate().script; 12156 var urls = { 12157 styles: template.styles || this.getTemplate().styles, 12158 html: [template.html || this.getTemplate().html], 12159 script: script ? [script] : [] 12160 }, 12161 files = {}, 12162 links = template.links || this.getTemplate().links; 12163 12164 this.loadFiles(urls, files).then(function () { 12165 var _loop4 = function _loop4() { 12166 if (_isArray7) { 12167 if (_i7 >= _iterator7.length) return 'break'; 12168 _ref7 = _iterator7[_i7++]; 12169 } else { 12170 _i7 = _iterator7.next(); 12171 if (_i7.done) return 'break'; 12172 _ref7 = _i7.value; 12173 } 12174 12175 var style = _ref7; 12176 12177 var textCss = style.data, 12178 url = style.url; 12179 textCss = textCss.replace(/url\(['"](.*?)["']\)/g, function (r, r1) { 12180 return ['url(', _this3.urlResolver(url, r1), ')'].join(''); 12181 }); 12182 (0, _libs.$)('<style type="text/css">' + textCss + '</style>').appendTo(_this3.head); 12183 }; 12184 12185 for (var _iterator7 = files.styles, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { 12186 var _ref7; 12187 12188 var _ret4 = _loop4(); 12189 12190 if (_ret4 === 'break') break; 12191 } 12192 12193 _this3.container.html(_this3.translate(files.html[0].data)); 12194 12195 _this3.jLinks = []; 12196 for (var _iterator8 = links, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { 12197 var _ref8; 12198 12199 if (_isArray8) { 12200 if (_i8 >= _iterator8.length) break; 12201 _ref8 = _iterator8[_i8++]; 12202 } else { 12203 _i8 = _iterator8.next(); 12204 if (_i8.done) break; 12205 _ref8 = _i8.value; 12206 } 12207 12208 var _link = _ref8; 12209 12210 _this3.jLinks.push((0, _libs.$)(['<link ', _this3.objToAttrsStr(_link), '>'].join('')).appendTo(_this3.head)); 12211 } 12212 12213 if (files.script[0]) { 12214 var init = eval(files.script[0].data); 12215 _this3.templateObject = init(_this3.container); 12216 } else { 12217 _this3.templateObject = {}; 12218 } 12219 12220 _this3.linkControls = {}; 12221 for (var _iterator9 = _this3.getLinks(), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { 12222 var _ref9; 12223 12224 if (_isArray9) { 12225 if (_i9 >= _iterator9.length) break; 12226 _ref9 = _iterator9[_i9++]; 12227 } else { 12228 _i9 = _iterator9.next(); 12229 if (_i9.done) break; 12230 _ref9 = _i9.value; 12231 } 12232 12233 var id = _ref9; 12234 12235 _this3.linkControls[id] = _this3.container.find('.' + id); 12236 _this3.binds[id] = View.handleLinkEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: id, ctrl: _this3.linkControls[id] }); 12237 _this3.linkControls[id].on('click', _this3.binds[id]); 12238 } 12239 12240 _this3.widgetControls = {}; 12241 for (var _iterator10 = _this3.getWidgets(), _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { 12242 var _ref10; 12243 12244 if (_isArray10) { 12245 if (_i10 >= _iterator10.length) break; 12246 _ref10 = _iterator10[_i10++]; 12247 } else { 12248 _i10 = _iterator10.next(); 12249 if (_i10.done) break; 12250 _ref10 = _i10.value; 12251 } 12252 12253 var _id = _ref10; 12254 12255 _this3.widgetControls[_id] = _this3.container.find('.' + _id); 12256 } 12257 12258 _this3.inputControls = {}; 12259 for (var _iterator11 = _this3.getInputs(), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { 12260 var _ref11; 12261 12262 if (_isArray11) { 12263 if (_i11 >= _iterator11.length) break; 12264 _ref11 = _iterator11[_i11++]; 12265 } else { 12266 _i11 = _iterator11.next(); 12267 if (_i11.done) break; 12268 _ref11 = _i11.value; 12269 } 12270 12271 var _id2 = _ref11; 12272 12273 _this3.inputControls[_id2] = _this3.container.find('.' + _id2); 12274 _this3.binds[_id2] = View.handleInputEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: _id2, ctrl: _this3.inputControls[_id2] }); 12275 _this3.inputControls[_id2].on('keyup', _this3.binds[_id2]); 12276 } 12277 12278 _this3.formControls = {}; 12279 for (var _iterator12 = _this3.getForms(), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { 12280 var _ref12; 12281 12282 if (_isArray12) { 12283 if (_i12 >= _iterator12.length) break; 12284 _ref12 = _iterator12[_i12++]; 12285 } else { 12286 _i12 = _iterator12.next(); 12287 if (_i12.done) break; 12288 _ref12 = _i12.value; 12289 } 12290 12291 var _id3 = _ref12; 12292 12293 _this3.formControls[_id3] = _this3.container.find('.' + _id3); 12294 _this3.binds[_id3] = View.handleFormEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: _id3, ctrl: _this3.formControls[_id3] }); 12295 _this3.formControls[_id3].on('submit', _this3.binds[_id3]); 12296 } 12297 12298 _this3.textControls = {}; 12299 for (var _iterator13 = _this3.getTexts(), _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { 12300 var _ref13; 12301 12302 if (_isArray13) { 12303 if (_i13 >= _iterator13.length) break; 12304 _ref13 = _iterator13[_i13++]; 12305 } else { 12306 _i13 = _iterator13.next(); 12307 if (_i13.done) break; 12308 _ref13 = _i13.value; 12309 } 12310 12311 var _id4 = _ref13; 12312 12313 _this3.textControls[_id4] = _this3.container.find('.' + _id4); 12314 } 12315 12316 _this3.stateSetters = [{ 12317 map: _this3.linkControls, 12318 setter: _this3.setLinkControlState.bind(_this3) 12319 }, { 12320 map: _this3.widgetControls, 12321 setter: _this3.setWidgetControlState.bind(_this3) 12322 }, { 12323 map: _this3.inputControls, 12324 setter: _this3.setInputControlState.bind(_this3) 12325 }, { 12326 map: _this3.textControls, 12327 setter: _this3.setTextControlState.bind(_this3) 12328 }]; 12329 12330 _this3.initView(); 12331 12332 if (_this3.onLoad) { 12333 _this3.onLoad(); 12334 } 12335 12336 _this3.fireLinksOnLoadEvent(); 12337 }).catch(function (res) { 12338 return console.error(res); 12339 });
12340 } 12341 12342 View.prototype.dispose = function dispose() { 12343 delete this.textControls; 12344 for (var _iterator14 = this.getLinks(), _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { 12345 var _ref14; 12346 12347 if (_isArray14) { 12348 if (_i14 >= _iterator14.length) break; 12349 _ref14 = _iterator14[_i14++]; 12350 } else { 12351 _i14 = _iterator14.next(); 12352 if (_i14.done) break; 12353 _ref14 = _i14.value; 12354 } 12355 12356 var id = _ref14; 12357 12358 this.linkControls[id].off('click', this.binds[id]); 12359 } 12360 delete this.linkControls; 12361 delete this.widgetControls; 12362 for (var _iterator15 = this.getInputs(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { 12363 var _ref15; 12364 12365 if (_isArray15) { 12366 if (_i15 >= _iterator15.length) break; 12367 _ref15 = _iterator15[_i15++]; 12368 } else { 12369 _i15 = _iterator15.next(); 12370 if (_i15.done) break; 12371 _ref15 = _i15.value; 12372 } 12373 12374 var _id5 = _ref15; 12375 12376 this.inputControls[_id5].off('keyup', this.binds[_id5]); 12377 } 12378 delete this.inputControls; 12379 for (var _iterator16 = this.getForms(), _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { 12380 var _ref16; 12381 12382 if (_isArray16) { 12383 if (_i16 >= _iterator16.length) break; 12384 _ref16 = _iterator16[_i16++]; 12385 } else { 12386 _i16 = _iterator16.next(); 12387 if (_i16.done) break; 12388 _ref16 = _i16.value; 12389 } 12390 12391 var _id6 = _ref16; 12392 12393 this.formControls[_id6].off('submit', this.binds[_id6]); 12394 } 12395 delete this.formControls; 12396 12397 !this.templateObject.dispose || this.templateObject.dispose(); 12398 delete this.templateObject; 12399 12400 if (this.isIOS) { 12401 (0, _libs.$)(this.parentContainer[0].ownerDocument.defaultView).off('resize', this.binds.onResize); 12402 } 12403 this.parentContainer.html(''); 12404 delete this.frame; 12405 }; 12406 12407 View.prototype.getContainer = function getContainer() { 12408 return this.container[0]; 12409 }; 12410 12411 View.prototype.getParentContainer = function getParentContainer() { 12412 return this.parentContainer[0]; 12413 }; 12414 12415 View.prototype.addHandler = function addHandler(handler) { 12416 this.handlers.push(handler); 12417 }; 12418 12419 View.prototype.initView = function initView() {}; 12420 12421 View.setControlState = function setControlState(ctrl, defaults, state, stateHandlers) { 12422 if (ctrl) { 12423 var st = _extends({}, defaults, state); 12424 for (var _name2 in st) { 12425 if (st.hasOwnProperty(_name2) && stateHandlers[_name2]) { 12426 stateHandlers[_name2](ctrl, st[_name2]); 12427 } 12428 } 12429 } 12430 }; 12431 12432 View.prototype.setLinkControlState = function setLinkControlState(id, state) { 12433 View.setControlState(this.linkControls[id], { 12434 visible: true, 12435 active: false, 12436 enable: true 12437 }, state, View.linkStateHandlers); 12438 }; 12439 12440 View.prototype.setWidgetControlState = function setWidgetControlState(id, state) { 12441 View.setControlState(this.widgetControls[id], { 12442 visible: true, 12443 active: false, 12444 enable: true 12445 }, state, View.widgetStateHandlers); 12446 }; 12447 12448 View.prototype.setInputControlState = function setInputControlState(id, state) { 12449 View.setControlState(this.inputControls[id], { 12450 visible: true, 12451 enable: true, 12452 value: '' 12453 }, state, View.inputStateHandlers); 12454 }; 12455 12456 View.prototype.setTextControlState = function setTextControlState(id, state) { 12457 View.setControlState(this.textControls[id], { 12458 visible: true, 12459 value: '' 12460 }, state, View.textStateHandlers); 12461 }; 12462 12463 View.prototype.onItemStateChanged = function onItemStateChanged() {}; 12464 12465 View.prototype.setState = function setState(id, state) { 12466 for (var _iterator17 = this.stateSetters, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) { 12467 var _ref17; 12468 12469 if (_isArray17) { 12470 if (_i17 >= _iterator17.length) break; 12471 _ref17 = _iterator17[_i17++]; 12472 } else { 12473 _i17 = _iterator17.next(); 12474 if (_i17.done) break; 12475 _ref17 = _i17.value; 12476 } 12477 12478 var item = _ref17; 12479 12480 if (item.map[id]) { 12481 item.setter(id, state); 12482 this.onItemStateChanged(id, state); 12483 break; 12484 } 12485 } 12486 }; 12487 12488 return View; 12489}(); 12490 12491View.linkStateHandlers = { 12492 visible: function visible(ctrl, value) { 12493 return View.classProperty(ctrl, 'hidden', !value); 12494 }, 12495 active: function active(ctrl, value) { 12496 return View.classProperty(ctrl, 'active', value); 12497 }, 12498 enable: function enable(ctrl, value) { 12499 return View.classProperty(ctrl, 'disabled', !value); 12500 } 12501}; 12502View.widgetStateHandlers = { 12503 visible: function visible(ctrl, value) { 12504 return View.classProperty(ctrl, 'hidden', !value); 12505 }, 12506 active: function active(ctrl, value) { 12507 return View.classProperty(ctrl, 'active', value); 12508 }, 12509 enable: function enable(ctrl, value) { 12510 return View.classProperty(ctrl, 'disabled', !value); 12511 } 12512}; 12513View.inputStateHandlers = { 12514 visible: function visible(ctrl, value) { 12515 return View.classProperty(ctrl, 'hidden', !value); 12516 }, 12517 value: function value(ctrl, _value) { 12518 return ctrl[0].value = _value; 12519 }, 12520 enable: function enable(ctrl, value) { 12521 return View.attributeProperty(ctrl, 'disabled', !value); 12522 } 12523}; 12524View.textStateHandlers = { 12525 visible: function visible(ctrl, value) { 12526 return View.classProperty(ctrl, 'hidden', !value); 12527 }, 12528 value: function value(ctrl, _value2) { 12529 return ctrl.text(_value2); 12530 } 12531}; 12532exports.default = View; 12533 12534/***/ }), 12535/* 66 */ 12536/***/ (function(module, exports, __webpack_require__) { 12537 12538"use strict"; 12539 12540 12541exports.__esModule = true; 12542 12543var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 12544 12545var _libs = __webpack_require__(0); 12546 12547var _Orbit = __webpack_require__(56);
12548 12549var _Orbit2 = _interopRequireDefault(_Orbit); 12550 12551var _ThreeMouseEventConverter = __webpack_require__(61); 12552 12553var _ThreeMouseEventConverter2 = _interopRequireDefault(_ThreeMouseEventConverter); 12554 12555var _ThreeTouchEventConverter = __webpack_require__(62); 12556 12557var _ThreeTouchEventConverter2 = _interopRequireDefault(_ThreeTouchEventConverter); 12558 12559var _Drag = __webpack_require__(48); 12560 12561var _Drag2 = _interopRequireDefault(_Drag); 12562 12563var _CSS3DRenderer = __webpack_require__(12); 12564 12565var _CSS3DRenderer2 = _interopRequireDefault(_CSS3DRenderer); 12566 12567function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 12568 12569function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 12570 12571function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 12572 12573function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 12574 12575var VisualWorld = function (_THREE$EventDispatche) { 12576 _inherits(VisualWorld, _THREE$EventDispatche); 12577 12578 function VisualWorld(wnd, doc, container) { 12579 var useHelpers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; 12580 12581 _classCallCheck(this, VisualWorld); 12582 12583 var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); 12584 12585 _this.wnd = wnd; 12586 _this.doc = doc; 12587 _this.jContainer = container; 12588 _this.renderCallbacks = []; 12589 12590 _this.clock = new _libs.THREE.Clock(); 12591 12592 _this.raycaster = new _libs.THREE.Raycaster(); 12593 12594 _this.scene = new _libs.THREE.Scene(); 12595 _this.cssScene = new _libs.THREE.Scene(); 12596 12597 _this.camera = new _libs.THREE.PerspectiveCamera(30, _this.width() / _this.height(), 0.2, 2000); 12598 var scale = 5; 12599 12600 _this.camera.position.x = 0; 12601 _this.camera.position.y = 5.5 * scale; 12602 _this.camera.position.z = 0; 12603 12604 _this.renderer = new _libs.THREE.WebGLRenderer({ alpha: true, antialias: true }); 12605 _this.renderer.setClearColor(0x000000, 0); 12606 _this.renderer.setPixelRatio(_this.wnd.devicePixelRatio); 12607 _this.renderer.setSize(_this.width(), _this.height()); 12608 12609 _this.jContainer.append(_this.renderer.domElement); 12610 12611 _this.cssRenderer = new _CSS3DRenderer2.default(); 12612 _this.cssRenderer.setSize(_this.width(), _this.height()); 12613 (0, _libs.$)(_this.cssRenderer.domElement).css({ 12614 position: 'absolute', 12615 top: 0, 12616 margin: 0, 12617 padding: 0 12618 }); 12619 _this.jContainer.append(_this.cssRenderer.domElement); 12620 12621 _this.element = _this.cssRenderer.domElement; 12622 12623 _this.controls = new _Orbit2.default(_this.camera, _this.element); 12624 _this.controls.target.y = 0.5; 12625 12626 var cssScene = (0, _libs.$)(_this.cssRenderer.domElement).find('div'), 12627 tmpVector = new _libs.THREE.Vector3(); 12628 _this.controls.addEventListener('change', function () { 12629 _this.camera.getWorldDirection(tmpVector); 12630 cssScene.css('display', tmpVector.y - _this.camera.position.y > 0 ? 'none' : 'block'); 12631 }); 12632 12633 _this.textureLoader = new _libs.THREE.TextureLoader(); 12634 12635 _this.scene.add(new _libs.THREE.AmbientLight(0xD0D0D0)); //0xC0C0C0 12636 12637 _this.light = new _libs.THREE.DirectionalLight(0x404040, 1); 12638 _this.light.position.set(0, 6 * scale, 0); 12639 _this.light.castShadow = false; 12640 // const d = 20*scale; 12641 // this.light.shadow.camera.left = -d; 12642 // this.light.shadow.camera.right = d; 12643 // this.light.shadow.camera.top = d; 12644 // this.light.shadow.camera.bottom = -d; 12645 // this.light.shadow.camera.near = 1*scale; 12646 // this.light.shadow.camera.far = 25*scale; 12647 // this.light.shadow.mapSize.x = 1024; 12648 // this.light.shadow.mapSize.y = 1024; 12649 _this.scene.add(_this.light); 12650 12651 if (useHelpers) { 12652 _this.scene.add(new _libs.THREE.AxisHelper(5)); 12653 } 12654 12655 _this.binds = { 12656 onWindowResize: _this.onWindowResize.bind(_this), 12657 animate: _this.animate.bind(_this) 12658 }; 12659 12660 (0, _libs.$)(_this.wnd).on('resize', _this.binds.onWindowResize); 12661
12662 _this.mouseEvents = new _ThreeMouseEventConverter2.default(_this.wnd, _this.doc, _this); 12663 _this.touchEvents = new _ThreeTouchEventConverter2.default(_this.wnd, _this.doc, _this); 12664 var filterData = { type: 'mousemove' }; 12665 _this.mouseEvents.filter = function (element, e) { 12666 var types = ['mouseenter', 'mouseover', 'mouseleave', 'mouseout'], 12667 contains = function contains(p, c) { 12668 return p === c || _libs.$.contains(p, c); 12669 }; 12670 if (e.type === 'mousemove') { 12671 filterData.pageX = e.pageX; 12672 filterData.pageY = e.pageY; 12673 } 12674 return e.relatedTarget && ~types.indexOf(e.type) && contains(element, e.target) && contains(element, e.relatedTarget) ? _extends({}, e, filterData) : e; 12675 }; 12676 _this.drag = new _Drag2.default(_this.wnd, _this.doc, _this); 12677 12678 _this.onWindowResize(); 12679 _this.animate(); 12680 return _this; 12681 } 12682 12683 VisualWorld.prototype.dispose = function dispose() { 12684 delete this.binds.animate; 12685 (0, _libs.$)(this.wnd).off('resize', this.binds.onWindowResize); 12686 this.mouseEvents.dispose(); 12687 this.touchEvents.dispose(); 12688 this.drag.dispose(); 12689 this.controls.dispose(); 12690 }; 12691 12692 VisualWorld.prototype.width = function width() { 12693 return this.jContainer.width(); 12694 }; 12695 12696 VisualWorld.prototype.height = function height() { 12697 return this.jContainer.height(); 12698 }; 12699 12700 VisualWorld.prototype.setExtraLighting = function setExtraLighting(v) { 12701 this.light.intensity = v; 12702 }; 12703 12704 VisualWorld.prototype.getOrbit = function getOrbit() { 12705 return this.controls; 12706 }; 12707 12708 VisualWorld.prototype.setControlsState = function setControlsState(state) { 12709 this.controls.enabled = state; 12710 }; 12711 12712 VisualWorld.prototype.getControlsState = function getControlsState() { 12713 return this.controls.enabled; 12714 }; 12715 12716 VisualWorld.prototype.onWindowResize = function onWindowResize() { 12717 var _this2 = this; 12718 12719 if (this.width() > 1 && this.height() > 1) { 12720 var updateCamera = function updateCamera(camera) { 12721 camera.aspect = _this2.width() / _this2.height(); 12722 camera.updateProjectionMatrix(); 12723 }, 12724 updateRenderer = function updateRenderer(renderer) { 12725 renderer.setSize(_this2.width(), _this2.height()); 12726 }; 12727 12728 updateCamera(this.camera); 12729 updateRenderer(this.renderer); 12730 updateRenderer(this.cssRenderer); 12731 12732 this.dispatchEvent({ type: 'resize' }); 12733 } else { 12734 setTimeout(function () { 12735 _this2.onWindowResize(); 12736 }, 250); 12737 } 12738 }; 12739 12740 VisualWorld.prototype.addObject = function addObject(object) { 12741 this.scene.add(object); 12742 }; 12743 12744 VisualWorld.prototype.addCssObject = function addCssObject(object) { 12745 this.cssScene.add(object); 12746 }; 12747 12748 VisualWorld.prototype.removeCssObject = function removeCssObject(object) { 12749 this.cssScene.remove(object); 12750 }; 12751 12752 VisualWorld.prototype.removeObject = function removeObject(object) { 12753 this.scene.remove(object); 12754 }; 12755 12756 VisualWorld.prototype.animate = function animate() { 12757 if (this.binds.animate) { 12758 requestAnimationFrame(this.binds.animate); 12759 } 12760 this.render(); 12761 }; 12762 12763 VisualWorld.prototype.addRenderCallback = function addRenderCallback(clb) { 12764 this.renderCallbacks.push(clb); 12765 }; 12766 12767 VisualWorld.prototype.removeRenderCallback = function removeRenderCallback(clb) { 12768 var i = this.renderCallbacks.indexOf(clb); 12769 if (~i) { 12770 this.renderCallbacks.splice(i, 1); 12771 } 12772 }; 12773 12774 VisualWorld.prototype.render = function render() { 12775 var deltaTime = this.clock.getDelta(); 12776 this.controls.update(deltaTime); 12777 for (var _iterator = this.renderCallbacks, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 12778 var _ref; 12779 12780 if (_isArray) { 12781 if (_i >= _iterator.length) break; 12782 _ref = _iterator[_i++]; 12783 } else { 12784 _i = _iterator.next(); 12785 if (_i.done) break; 12786 _ref = _i.value; 12787 } 12788 12789 var clb = _ref; 12790 12791 clb(deltaTime); 12792 } 12793 this.cssRenderer.render(this.cssScene, this.camera); 12794 this.renderer.render(this.scene, this.camera); 12795 }; 12796 12797 VisualWorld.prototype.processGeometry = function processGeometry(bufGeometry, mesh) { 12798 mesh.geometry = bufGeometry; 12799 // Obtain a Geometry 12800 var geometry = new _libs.THREE.Geometry().fromBufferGeometry(bufGeometry); 12801 // Merge the vertices so the triangle soup is converted to indexed triangles 12802 geometry.mergeVertices(); 12803 // Convert again to BufferGeometry, indexed 12804 var indexedBufferGeom = this.createIndexedBufferGeometryFromGeometry(geometry); 12805 // Create index arrays mapping the indexed vertices to bufGeometry vertices 12806 return this.mapIndices(bufGeometry, indexedBufferGeom); 12807 }; 12808 12809 VisualWorld.prototype.createIndexedBufferGeometryFromGeometry = function createIndexedBufferGeometryFromGeometry(geometry) { 12810 var numVertices = geometry.vertices.length; 12811 var numFaces = geometry.faces.length; 12812 12813 var bufferGeom = new _libs.THREE.BufferGeometry(); 12814 var vertices = new Float32Array(numVertices * 3); 12815 var indices = new (numFaces * 3 > 65535 ? Uint32Array : Uint16Array)(numFaces * 3); 12816 12817 for (var i = 0; i < numVertices; i++) { 12818 var p = geometry.vertices[i]; 12819 var i3 = i * 3; 12820 vertices[i3] = p.x; 12821 vertices[i3 + 1] = p.y; 12822 vertices[i3 + 2] = p.z; 12823 } 12824 12825 for (var _i2 = 0; _i2 < numFaces; _i2++) { 12826 var f = geometry.faces[_i2]; 12827 var _i3 = _i2 * 3; 12828 indices[_i3] = f.a; 12829 indices[_i3 + 1] = f.b; 12830 indices[_i3 + 2] = f.c; 12831 } 12832 12833 bufferGeom.setIndex(new _libs.THREE.BufferAttribute(indices, 1)); 12834 bufferGeom.addAttribute('position', new _libs.THREE.BufferAttribute(vertices, 3)); 12835 12836 return bufferGeom; 12837 }; 12838 12839 VisualWorld.prototype.isEqual = function isEqual(x1, y1, z1, x2, y2, z2) { 12840 var delta = 0.000001; 12841 return Math.abs(x2 - x1) < delta && Math.abs(y2 - y1) < delta && Math.abs(z2 - z1) < delta; 12842 }; 12843 12844 VisualWorld.prototype.mapIndices = function mapIndices(bufGeometry, indexedBufferGeom) { 12845 // Creates mappedVertices, mappedIndices and mappedAssociation in bufGeometry 12846 var vertices = bufGeometry.attributes.position.array; 12847 var idxVertices = indexedBufferGeom.attributes.position.array; 12848 var indices = indexedBufferGeom.index.array; 12849 12850 var numIdxVertices = idxVertices.length / 3; 12851 var numVertices = vertices.length / 3; 12852 12853 bufGeometry.mappedVertices = idxVertices; 12854 bufGeometry.mappedIndices = indices; 12855 bufGeometry.mappedAssociation = []; 12856 12857 for (var i = 0; i < numIdxVertices; i++) { 12858 var association = []; 12859 bufGeometry.mappedAssociation.push(association); 12860 var i3 = i * 3; 12861 for (var j = 0; j < numVertices; j++) { 12862 var j3 = j * 3; 12863 if (this.isEqual(idxVertices[i3], idxVertices[i3 + 1], idxVertices[i3 + 2], vertices[j3], vertices[j3 + 1], vertices[j3 + 2])) { 12864 association.push(j3); 12865 } 12866 } 12867 } 12868 return { vertices: bufGeometry.mappedVertices, indices: bufGeometry.mappedIndices }; 12869 }; 12870 12871 VisualWorld.prototype.oneNodePositionCallback = function oneNodePositionCallback(p, q) { 12872 this.position.set(p.x, p.y, p.z); 12873 this.quaternion.set(q.x, q.y, q.z, q.w); 12874 }; 12875 12876 VisualWorld.prototype.multyNodePositionCallback = function multyNodePositionCallback(node, p, n) { 12877 var geometry = this.geometry; 12878 var volumePositions = geometry.attributes.position.array; 12879 var volumeNormals = geometry.attributes.normal.array; 12880 var assocVertex = geometry.mappedAssociation[node]; 12881 12882 for (var k = 0; k < assocVertex.length; k++) { 12883 var indexVertex = assocVertex[k]; 12884 volumePositions[indexVertex] = p.x; 12885 volumeNormals[indexVertex] = n.x; 12886 ++indexVertex; 12887 volumePositions[indexVertex] = p.y; 12888 volumeNormals[indexVertex] = n.y; 12889 ++indexVertex; 12890 volumePositions[indexVertex] = p.z; 12891 volumeNormals[indexVertex] = n.z; 12892 } 12893 }; 12894 12895 VisualWorld.prototype.multyNodePositionPostCallback = function multyNodePositionPostCallback() { 12896 var geometry = this.geometry; 12897 geometry.attributes.position.needsUpdate = true; 12898 geometry.attributes.normal.needsUpdate = true; 12899 }; 12900 12901 VisualWorld.prototype.pathPositionCallback = function pathPositionCallback(node, p) { 12902 var positions = this.geometry.attributes.position.array; 12903 var i = 3 * node; 12904 positions[i++] = p.x; 12905 positions[i++] = p.y; 12906 positions[i] = p.z; 12907 }; 12908 12909 VisualWorld.prototype.pathPositionPostCallback = function pathPositionPostCallback() { 12910 var geometry = this.geometry; 12911 geometry.computeVertexNormals(); 12912 geometry.attributes.position.needsUpdate = true; 12913 geometry.attributes.normal.needsUpdate = true; 12914 }; 12915 12916 return VisualWorld; 12917}(_libs.THREE.EventDispatcher); 12918 12919exports.default = VisualWorld; 12920 12921/***/ }), 12922/* 67 */ 12923/***/ (function(module, exports, __webpack_require__) { 12924 12925"use strict"; 12926 12927 12928exports.__esModule = true; 12929 12930var _Controller2 = __webpack_require__(15); 12931 12932var _Controller3 = _interopRequireDefault(_Controller2); 12933 12934function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 12935 12936function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 12937 12938function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 12939 12940function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
12940onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 12941 12942var WidgetController = function (_Controller) { 12943 _inherits(WidgetController, _Controller); 12944 12945 function WidgetController(view) { 12946 _classCallCheck(this, WidgetController); 12947 12948 var _this = _possibleConstructorReturn(this, _Controller.call(this)); 12949 12950 _this.view = view; 12951 _this.visible = false; 12952 return _this; 12953 } 12954 12955 WidgetController.prototype.togle = function togle() { 12956 this.visible = !this.visible; 12957 this.fireChange(); 12958 }; 12959 12960 WidgetController.prototype.hide = function hide() { 12961 this.visible = false; 12962 this.fireChange(); 12963 }; 12964 12965 WidgetController.prototype.fireChange = function fireChange() { 12966 if (this.onChange) { 12967 this.onChange(); 12968 } 12969 this.updateView(); 12970 }; 12971 12972 WidgetController.prototype.updateView = function updateView() { 12973 if (this.view) { 12974 this.view.setState('widFloatWnd', { 12975 enable: true, 12976 visible: this.visible, 12977 active: false 12978 }); 12979 } 12980 }; 12981 12982 return WidgetController; 12983}(_Controller3.default); 12984
12985exports.default = WidgetController; 12986 12987/***/ }), 12988/* 68 */ 12989/***/ (function(module, exports, __webpack_require__) { 12990 12991"use strict"; 12992 12993 12994exports.__esModule = true; 12995 12996var _Target2 = __webpack_require__(21); 12997 12998var _Target3 = _interopRequireDefault(_Target2); 12999 13000function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 13001 13002function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 13003 13004function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 13005 13006function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 13007 13008var CircleTarget = function (_Target) { 13009 _inherits(CircleTarget, _Target); 13010 13011 function CircleTarget(x, y, r) { 13012 _classCallCheck(this, CircleTarget); 13013 13014 var _this = _possibleConstructorReturn(this, _Target.call(this)); 13015 13016 _this.p = { 13017 x: x, 13018 y: y, 13019 r: r 13020 }; 13021 return _this; 13022 } 13023 13024 CircleTarget.prototype.testIntersection = function testIntersection(e, data) { 13025 var res = void 0; 13026 var x = data.x, 13027 y = data.y, 13028 p = this.p; 13029 13030 if ((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y) <= p.r * p.r) { 13031 res = { 13032 target: this, 13033 data: data 13034 }; 13035 } 13036 return res; 13037 }; 13038 13039 return CircleTarget; 13040}(_Target3.default); 13041 13042exports.default = CircleTarget; 13043 13044/***/ }), 13045/* 69 */ 13046/***/ (function(module, exports, __webpack_require__) { 13047 13048"use strict"; 13049 13050 13051exports.__esModule = true; 13052 13053var _Target2 = __webpack_require__(21); 13054 13055var _Target3 = _interopRequireDefault(_Target2); 13056 13057var _BaseMathUtils = __webpack_require__(2); 13058 13059var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); 13060 13061function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 13062 13063function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 13064 13065function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 13066 13067function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 13068 13069var PolyTarget = function (_Target) { 13070 _inherits(PolyTarget, _Target); 13071 13072 function PolyTarget(poly) { 13073 _classCallCheck(this, PolyTarget); 13074 13075 var _this = _possibleConstructorReturn(this, _Target.call(this)); 13076 13077 _this.poly = poly; 13078 return _this; 13079 } 13080 13081 PolyTarget.prototype.testIntersection = function testIntersection(e, p) { 13082 return _BaseMathUtils2.default.isInsidePoly(this.poly, p) ? { 13083 target: this, 13084 data: p 13085 } : undefined; 13086 }; 13087 13088 return PolyTarget; 13089}(_Target3.default); 13090 13091exports.default = PolyTarget; 13092 13093/***/ }), 13094/* 70 */ 13095/***/ (function(module, exports, __webpack_require__) { 13096 13097/*** IMPORTS FROM imports-loader ***/ 13098var define = false; 13099 13100/*! 13101 * jQuery Mousewheel 3.1.13 13102 * 13103 * Copyright jQuery Foundation and other contributors 13104 * Released under the MIT license 13105 * http://jquery.org/license 13106 */ 13107 13108(function (factory) { 13109 if ( typeof define === 'function' && define.amd ) { 13110 // AMD. Register as an anonymous module. 13111 define(['jquery'], factory); 13112 } else if (true) { 13113 // Node/CommonJS style for Browserify 13114 module.exports = factory; 13115 } else { 13116 // Browser globals 13117 factory(jQuery); 13118 } 13119}(function ($) { 13120 13121 var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], 13122 toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? 13123 ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], 13124 slice = Array.prototype.slice,
vendor: 6,625 bytes, lines 13125-13298
13125 nullLowestDeltaTimeout, lowestDelta; 13126 13127 if ( $.event.fixHooks ) { 13128 for ( var i = toFix.length; i; ) { 13129 $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; 13130 } 13131 } 13132 13133 var special = $.event.special.mousewheel = { 13134 version: '3.1.12', 13135 13136 setup: function() { 13137 if ( this.addEventListener ) { 13138 for ( var i = toBind.length; i; ) { 13139 this.addEventListener( toBind[--i], handler, false ); 13140 } 13141 } else { 13142 this.onmousewheel = handler; 13143 } 13144 // Store the line height and page height for this particular element 13145 $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); 13146 $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); 13147 }, 13148 13149 teardown: function() { 13150 if ( this.removeEventListener ) { 13151 for ( var i = toBind.length; i; ) { 13152 this.removeEventListener( toBind[--i], handler, false ); 13153 } 13154 } else { 13155 this.onmousewheel = null; 13156 } 13157 // Clean up the data we added to the element 13158 $.removeData(this, 'mousewheel-line-height'); 13159 $.removeData(this, 'mousewheel-page-height'); 13160 }, 13161 13162 getLineHeight: function(elem) { 13163 var $elem = $(elem), 13164 $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); 13165 if (!$parent.length) { 13166 $parent = $('body'); 13167 } 13168 return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; 13169 }, 13170 13171 getPageHeight: function(elem) { 13172 return $(elem).height(); 13173 }, 13174 13175 settings: { 13176 adjustOldDeltas: true, // see shouldAdjustOldDeltas() below 13177 normalizeOffset: true // calls getBoundingClientRect for each event 13178 } 13179 }; 13180 13181 $.fn.extend({ 13182 mousewheel: function(fn) { 13183 return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); 13184 }, 13185 13186 unmousewheel: function(fn) { 13187 return this.unbind('mousewheel', fn); 13188 } 13189 }); 13190 13191 13192 function handler(event) { 13193 var orgEvent = event || window.event, 13194 args = slice.call(arguments, 1), 13195 delta = 0, 13196 deltaX = 0, 13197 deltaY = 0, 13198 absDelta = 0, 13199 offsetX = 0, 13200 offsetY = 0; 13201 event = $.event.fix(orgEvent); 13202 event.type = 'mousewheel'; 13203 13204 // Old school scrollwheel delta 13205 if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } 13206 if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } 13207 if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } 13208 if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } 13209 13210 // Firefox < 17 horizontal scrolling related to DOMMouseScroll event 13211 if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { 13212 deltaX = deltaY * -1; 13213 deltaY = 0; 13214 } 13215 13216 // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy 13217 delta = deltaY === 0 ? deltaX : deltaY; 13218 13219 // New school wheel delta (wheel event) 13220 if ( 'deltaY' in orgEvent ) { 13221 deltaY = orgEvent.deltaY * -1; 13222 delta = deltaY; 13223 } 13224 if ( 'deltaX' in orgEvent ) { 13225 deltaX = orgEvent.deltaX; 13226 if ( deltaY === 0 ) { delta = deltaX * -1; } 13227 } 13228 13229 // No change actually happened, no reason to go any further 13230 if ( deltaY === 0 && deltaX === 0 ) { return; } 13231 13232 // Need to convert lines and pages to pixels if we aren't already in pixels 13233 // There are three delta modes: 13234 // * deltaMode 0 is by pixels, nothing to do 13235 // * deltaMode 1 is by lines 13236 // * deltaMode 2 is by pages 13237 if ( orgEvent.deltaMode === 1 ) { 13238 var lineHeight = $.data(this, 'mousewheel-line-height'); 13239 delta *= lineHeight; 13240 deltaY *= lineHeight; 13241 deltaX *= lineHeight; 13242 } else if ( orgEvent.deltaMode === 2 ) { 13243 var pageHeight = $.data(this, 'mousewheel-page-height'); 13244 delta *= pageHeight; 13245 deltaY *= pageHeight; 13246 deltaX *= pageHeight; 13247 } 13248 13249 // Store lowest absolute delta to normalize the delta values 13250 absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); 13251 13252 if ( !lowestDelta || absDelta < lowestDelta ) { 13253 lowestDelta = absDelta; 13254 13255 // Adjust older deltas if necessary 13256 if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { 13257 lowestDelta /= 40; 13258 } 13259 } 13260 13261 // Adjust older deltas if necessary 13262 if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { 13263 // Divide all the things by 40! 13264 delta /= 40; 13265 deltaX /= 40; 13266 deltaY /= 40; 13267 } 13268 13269 // Get a whole, normalized value for the deltas 13270 delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); 13271 deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); 13272 deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); 13273 13274 // Normalise offsetX and offsetY properties 13275 if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { 13276 var boundingRect = this.getBoundingClientRect(); 13277 offsetX = event.clientX - boundingRect.left; 13278 offsetY = event.clientY - boundingRect.top; 13279 } 13280 13281 // Add information to the event object 13282 event.deltaX = deltaX; 13283 event.deltaY = deltaY; 13284 event.deltaFactor = lowestDelta; 13285 event.offsetX = offsetX; 13286 event.offsetY = offsetY; 13287 // Go ahead and set deltaMode to 0 since we converted to pixels 13288 // Although this is a little odd since we overwrite the deltaX/Y 13289 // properties with normalized deltas. 13290 event.deltaMode = 0; 13291 13292 // Add event and delta to the front of the arguments 13293 args.unshift(event, delta, deltaX, deltaY); 13294 13295 // Clearout lowestDelta after sometime to better 13296 // handle multiple device types that give different 13297 // a different lowestDelta 13298 // Ex: trackpad = 3 and mouse wheel = 120
vendor: 5,812 bytes, lines 13299-13345
13299 if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } 13300 nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); 13301 13302 return ($.event.dispatch || $.event.handle).apply(this, args); 13303 } 13304 13305 function nullLowestDelta() { 13306 lowestDelta = null; 13307 } 13308 13309 function shouldAdjustOldDeltas(orgEvent, absDelta) { 13310 // If this is an older event and the delta is divisable by 120, 13311 // then we are assuming that the browser is treating this as an 13312 // older mouse wheel event and that we should divide the deltas 13313 // by 40 to try and get a more usable deltaFactor. 13314 // Side note, this actually impacts the reported scroll distance 13315 // in older browsers and can cause scrolling to be slower than native. 13316 // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. 13317 return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; 13318 } 13319 13320})); 13321 13322 13323 13324/***/ }), 13325/* 71 */ 13326/***/ (function(module, exports, __webpack_require__) { 13327 13328// stats.js - http://github.com/mrdoob/stats.js 13329(function(f,e){ true?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?"block":"none";l=a}var l=0,c=document.createElement("div");c.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click",function(a){a.preventDefault(); 13330u(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel("FPS","#0ff","#002")),h=e(new f.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var t=e(new f.Panel("MB","#f08","#201"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/ 133311048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v); 13332b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f}); 13333 13334 13335/***/ }), 13336/* 72 */ 13337/***/ (function(module, exports, __webpack_require__) { 13338 13339__webpack_require__(23); 13340module.exports = __webpack_require__(22); 13341 13342 13343/***/ }) 13344/******/ ]); 13345//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYjJiNmFmNDM0NTMzODlmMmE2YjgiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2xpYnMuanMiLCJ3ZWJwYWNrOi8vLy4vanMvbGlicy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9CYXNlTWF0aFV0aWxzLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL01hdGhVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9VdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9JbWFnZUJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvR3JhcGhVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9JbWFnZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9Cb29rUHJvcHNCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvU2hlZXRCbG9jay5qcyIsIndlYnBhY2s6Ly8vLi9qcy9wcm9wcy9ib29rLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0NTUzNEUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQ1NTTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9DdXN0b21FdmVudENvbnZlcnRlci5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9GaW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvUGRmLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy90YXJnZXRzL1RhcmdldC5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvQmluZGVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvQm9vay5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL0Jvb2tDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvQm9va1ByaW50ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9Cb29rVmlldy5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL0NsYkJvb2tQcm9wc0J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9Db3Zlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL0Nzc0xheWVyc01hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9QYWdlTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL1BkZkJvb2tQcm9wc0J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9QZGZMaW5rc0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9TZWFyY2hFbmdpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9TaGVldENzc0xheWVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvU2hlZXRQaHlzaWNzLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvU291bmRzRW52aXJvbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL1RvY0NvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvbW9kZWxzL3NoZWV0QmxvY2suanMiLCJ3ZWJwYWNrOi8vLy4vanMvcHJvcHMvYm9va0Nvb
13345nRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQmxhbmtJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9Cb29rbWFya3MuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRG9jTW91c2VTaW11bGF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRG9tMkltYWdlLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0RyYWcuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRXZlbnRzVG9BY3Rpb25zLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0Z1bGxTY3JlZW4uanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvSW50ZXJhY3RpdmVJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0xvYWRpbmdDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL01vdXNlRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvT2JqZWN0M0RXYXRjaGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL09yYml0LmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1BkZkltYWdlLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1NlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9TdGF0aWNJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9UZXh0dXJlQW5pbWF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlVG91Y2hFdmVudENvbnZlcnRlci5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9UaHVtYm5haWxzLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1RvdWNoRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvVmlldy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9WaXN1YWxXb3JsZC5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9XaWRnZXRDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvQ2lyY2xlVGFyZ2V0LmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvUG9seVRhcmdldC5qcyIsIndlYnBhY2s6Ly8vLi4vfi9qcXVlcnktbW91c2V3aGVlbC9qcXVlcnkubW91c2V3aGVlbC5qcyIsIndlYnBhY2s6Ly8vLi4vfi9zdGF0cy5qcy9idWlsZC9zdGF0cy5taW4uanMiXSwibmFtZXMiOlsiXyQiLCJHTE9CQUxfTElCUyIsIndpbmRvdyIsImpRdWVyeSIsInJlcXVpcmUiLCJfaHRtbDJjYW52YXMiLCJodG1sMmNhbnZhcyIsIl9USFJFRSIsIlRIUkVFIiwiX1JlYWN0IiwiUmVhY3QiLCJfUmVhY3RET00iLCJSZWFjdERPTSIsIl9QREZKUyIsIlBERkpTIiwiX3RyIiwicyIsImliZXJlemFuc2t5IiwidHIiLCIkIiwiRkIzRF9MT0NBTEUiLCJkaWN0aW9uYXJ5IiwiQmFzZU1hdGhVdGlscyIsInN1bTEiLCJrYSIsImEiLCJrYiIsImIiLCJzdW0yIiwic3VtMyIsInN1bTQiLCJyazQiLCJkeSIsInQiLCJkdCIsInkiLCJzdW0iLCJsZW5ndGgiLCJrMSIsImsyIiwiazMiLCJrNCIsImV4dHJhcG9sYXRlTGluZWFyIiwieCIsInhpIiwiaW50ZXJwb2xhdGVMaW5lYXIiLCJ5aSIsInJldmVyc2UiLCJjYWxjU2NhbGUiLCJzcmNXIiwic3JjSCIsImRzdFciLCJkc3RIIiwiTWF0aCIsIm1pbiIsIm11bE0iLCJyIiwiaSIsInB1c2giLCJqIiwiayIsInRyYW5zTSIsIm0iLCJtYXQiLCJkYXRhIiwiZGlzcCIsIk0iLCJwcmVkaWN0IiwibnVtIiwibCIsIkQiLCJhbSIsImJtIiwidGEiLCJkIiwicCIsInYiLCJyb3VuZCIsImluZGV4T2YiLCJnZXRVbmlxdWUiLCJjZWlsIiwicmFuZG9tIiwic2V0U3BsaW5lUG9pbnRzIiwic3BsaW5lIiwicHMiLCJwb2ludHMiLCJjb25zb2xlIiwid2FybiIsInNldCIsInoiLCJtYXBsMkwiLCJscyIsImxlbiIsIm4iLCJmIiwiZEwiLCJMIiwiYWJzIiwiZGV0MiIsImMiLCJzb2x2ZTJMaW4iLCJhMSIsImIxIiwiYTIiLCJiMiIsInJlcyIsImVwcyIsImR4IiwiaXNJbnNpZGVQb2x5IiwiZG9uZSIsImN0IiwidjJkaXN0IiwibnAiLCJybiIsInAwIiwicDEiLCJpcCIsIm1heCIsInRuIiwiaXNJbnNpZGVDb252UG9seSIsInNnIiwidjJsZW4iLCJ2MiIsInNxcnQiLCJ2MjEiLCJ2MjIiLCJjb21wdXRlU3F1YXJlIiwiY29tcHV0ZUludGVycENvZWZzIiwidHJpIiwiY29lZnMiLCJNYXRoVXRpbHMiLCJzcGxpdFNwbGluZSIsIk4iLCJvIiwiZGwiLCJnZXRQb2ludCIsInYxIiwiZGlzdGFuY2VUbyIsImNvcHkiLCJnZXRMaW5lYXJJbmRlY2VzIiwiZGVsIiwiZERlbCIsInJlZmluZVBvbHkiLCJwb2x5IiwibWF4RGwiLCJWZWN0b3IyIiwiVmVjdG9yMyIsIlV0aWxzIiwibm9ybWFsaXplVXJsIiwidXJsIiwic3BsaXQiLCJyZXBsYWNlIiwiYmFzZSIsImxvY2F0aW9uIiwiaHJlZiIsImpvaW4iLCJleHRlbmRzIiwiZGVyIiwibmFtZSIsImhhc093blByb3BlcnR5IiwiZGVmYXVsdENtcCIsImxvd2VyQm91bmQiLCJjbXAiLCJoIiwibWlkIiwiZmxvb3IiLCJJbWFnZUJhc2UiLCJjb250ZXh0Iiwid2lkdGgiLCJoZWlnaHQiLCJjb2xvciIsInduZCIsImRvYyIsImVsZW1lbnQiLCJib2R5IiwicmVuZGVyQ2FudmFzIiwiY3R4IiwicmVuZGVyQ2FudmFzQ3R4IiwicmVzVyIsInJlc0giLCJzZXRSZXNvbHV0aW9uIiwiZGlzcG9zZSIsInJlbmRlckJsYW5rUGFnZSIsImJlZ2luUGF0aCIsImZpbGxTdHlsZSIsIkdyYXBoVXRpbHMiLCJjb2xvcjJSZ2JhIiwicmVjdCIsImZpbGwiLCJyZW5kZXJJbWFnZSIsImltYWdlIiwicHVzaEN0eCIsImRyYXdJbWFnZSIsInBvcEN0eCIsIm5vcm1Ub0NvbnYiLCJyZW5kZXJIaXQiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzYXZlIiwic2NhbGUiLCJyZXN0b3JlIiwicmVuZGVyTm90Rm91bmRQYWdlIiwiZmluaXNoUmVuZGVyIiwib25DaGFuZ2UiLCJmaW5pc2hMb2FkIiwib25Mb2FkIiwic3RhcnRSZW5kZXIiLCJnZXRTaW11bGF0ZWREb2MiLCJ1bmRlZmluZWQiLCJnZXRDb250ZXh0IiwiRXZlbnRDb252ZXJ0ZXIiLCJlbmFibGVkIiwic2V0RW5hYmxlIiwidmwiLCJtQ2FwT2JqZWN0Iiwibm90aWZ5IiwiRXZlbnQiLCJtSG92T2JqZWN0IiwiZ2V0Q2FsbGJhY2siLCJvYmplY3QiLCJlIiwidHlwZSIsImNhbGxiYWNrIiwicHJvcHMiLCJ2aWV3IiwiakUiLCJjb252ZXJ0IiwiZmlsdGVyIiwi
13345Z2V0T2JqZWN0IiwiY29udmVydFRvdWNoIiwiY29udmVydE1vdXNlIiwidENhcE9iamVjdCIsInRlc3QiLCJpbnRlcnBvbGF0ZTAxIiwieTEiLCJ5MiIsImdldENvbG9yQnl0ZXMiLCJpbnZlcnNlQ29sb3IiLCJicyIsImlicyIsIm5icyIsImJ5dGVzMkNvbG9yIiwiYnl0ZXMyUmdiYSIsIkltYWdlRmFjdG9yeSIsImNhY2hlIiwiQ2FjaGUiLCJidWlsZCIsImluZm8iLCJ3aWR0aFRleGVscyIsImhlaWdodFRleGVscyIsImluamVjdG9yIiwiSW50ZXJhY3RpdmVJbWFnZSIsInNyYyIsIlN0YXRpY0ltYWdlIiwiUGRmSW1hZ2UiLCJCbGFua0ltYWdlIiwiQm9va1Byb3BzQnVpbGRlciIsIm9uUmVhZHkiLCJkZWZhdWx0cyIsImNhbGNTaXplIiwiY2FsY1RleGVscyIsInNoZWV0IiwiY2FsY1Byb3BzIiwiY292ZXIiLCJwYWdlIiwiY2FsY1NoZWV0cyIsInBhZ2VzIiwic2hlZXRzIiwiZ2V0U2hlZXRzIiwiZ2V0UHJvcHMiLCJnZXRQYWdlQ2FsbGJhY2siLCJiaW5kcyIsInBhZ2VDYWxsYmFjayIsInJlYWR5IiwiU2hlZXRCbG9jayIsInZpc3VhbCIsImZpcnN0IiwibGFzdCIsImFuZ2xlIiwic3RhdGUiLCJsb2FkZWRQb2ludHMiLCJsb2FkUG9pbnRzIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsInNoYXBlIiwicFNwbGluZSIsIlNwbGluZSIsImludGVycG9sYXRpb25Qb2ludHMiLCJpU3BsaW5lIiwic2hlZXRCbG9jayIsInJlc1giLCJhU3BsaW5lcyIsImdlb21ldHJ5IiwiY2xvbmUiLCJzaWRlRmFjZXMiLCJmYWNlcyIsInNpZGVUZXh0dXJlIiwiVGV4dHVyZSIsIndyYXBUIiwiUmVwZWF0V3JhcHBpbmciLCJyZXBlYXQiLCJuZWVkc1VwZGF0ZSIsIm1hdGVyaWFscyIsIk1lc2hQaG9uZ01hdGVyaWFsIiwic2V0VGV4dHVyZSIsIm1lc2giLCJNZXNoIiwiTWVzaEZhY2VNYXRlcmlhbCIsImNhc3RTaGFkb3ciLCJyZWNlaXZlU2hhZG93IiwidGhyZWUiLCJ1c2VyRGF0YSIsInNlbGYiLCJtYXJrZXJzIiwibWFya2VyIiwidXNlIiwidmVydGljZXMiLCJpcyIsIkFycmF5IiwiYXBwbHkiLCJfIiwiVGhyZWVVdGlscyIsImNyZWF0ZU1hcmtlciIsInNpemUiLCJ2ZXJ0ZXgiLCJhZGQiLCJjb3JuZXIiLCJtYXhEaXN0YW5jZSIsIk9aIiwiYXhpcyIsImdldFNpemUiLCJnZXRUb3BDZXJuZXJzIiwib2ZmIiwiUEkiLCJyZXNaIiwiZ2V0VG9wU2l6ZSIsInZzIiwiZ2V0VG9wV29ybGRSb3RhdGlvbiIsInEiLCJnZXRUb3BXb3JsZFBvc2l0aW9uIiwidmkiLCJsb2NhbFRvV29ybGQiLCJnZXRJbnRlcnBvbGF0aW9uUG9pbnRzIiwiaW5kcyIsIm1vZCIsIksiLCJ3YXZlIiwiY2xvc2VkQW5nbGUiLCJiaW5kZXJUdXJuIiwib3BlbmVkQW5nbGUiLCJjbG9zZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyIsImZsYXRJbnRlcnBvbGF0aW9uSW5kZWNlcyIsImdldFBvaW50c0F0QW5nbGUiLCJvcGVuZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyIsImhsIiwiaHIiLCJvZmZzZXQiLCJkZXB0aCIsImluQW5nbGUiLCJoQW5nbGUiLCJnZXRQb2ludHNBdEFuZ2xlQW5kSHMiLCJsZWZ0IiwicmlnaHQiLCJpbnZlcnNlIiwic2V0UG9pbnRzIiwieXMiLCJyZXNZIiwicGxhbmUiLCJQbGFuZSIsIm5vcm1hbCIsInBsYW5lT2Zmc2V0IiwiZmxleGlibGVDb3JuZXIiLCJwcm9qIiwic2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQiLCJub3JtYWxpemUiLCJwcm9qZWN0UG9pbnQiLCJzdWIiLCJkaXN0YW5jZSIsImQyQW5nbGUiLCJjb3JuZXJEZXZpYXRpb24iLCJleHAiLCJiZW5kaW5nIiwiYXBwbHlBeGlzQW5nbGUiLCJwb2ludCIsInBvc2l0aW9uIiwiY29tcHV0ZVZlcnRleE5vcm1hbHMiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJ2ZXJ0aWNlc05lZWRVcGRhdGUiLCJtYXJrdXAiLCJjb21wdXRlVmVydGljZXMiLCJnZXRQb2ludHNBdEhzIiwiaHMiLCJibCIsInAyIiwiZHAiLCJsbiIsInNwIiwic2luIiwiY29zIiwibnBzIiwiYW5nbGVzIiwieHBzIiwieXBzIiwiaW50ZXJwb2xhdGUiLCJncmF2aXR5IiwiY2FjaGVkUGFnZXMiLCJyZW5kZXJJbmFjdGl2ZVBhZ2VzIiwicmVuZGVySW5hY3RpdmVQYWdlc09uTW9iaWxlIiwicmVuZGVyV2hpbGVGbGlwcGluZyIsInBhZ2VzRm9yUHJlZGljdGluZyIsInByZWxvYWRQYWdlcyIsInJ0bCIsInN0YXJ0VmVsb2NpdHkiLCJmbGV4aWJpbGl0eSIsImJpbmRlclRleHR1cmUiLCJwYWRkaW5nIiwibWFzcyIsImNzc0xheWVyUHJvcHMiLCJDU1MzRE9iamVjdCIsInN0eWxlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIk9iamVjdDNEIiwiQ1NTM0RTcHJpdGUiLCJDU1MzRFJlbmRlcmVyIiwiX3dpZHRoIiwiX2hlaWdodCIsIl93aWR0aEhhbGYiLCJfaGVpZ2h0SGFsZiIsIm1hdHJpeCIsIk1hdHJpeDQiLCJjYW1lcmEiLCJmb3YiLCJvYmplY3RzIiwiZG9tRWxlbWVudCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsIm92ZXJmbG93IiwiY2FtZXJhRWxlbWVudCIsIldlYmtpdFRyYW5zZm9ybVN0eWxlIiwiTW96VHJhbnNmb3JtU3R5bGUiLCJ0cmFuc2Zvcm1TdHlsZSIsImFwcGVuZENoaWxkIiwiaXNJRSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInNldENsZWFyQ29sb3IiLCJzZXRTaXplIiwiZXBzaWxvbiIsInZhbHVlIiwiZ2V0Q2FtZXJhQ1NTTWF0cml4IiwiZWxlbWVudHMiLCJnZXRPYmplY3RDU1NNYXRyaXgiLCJjYW1lcmFDU1NNYXRyaXgiLCJtYXRyaXgzZCIsInJlbmRlck9iamVjdCIsIm1hdHJpeFdvcmxkSW52ZXJzZSIsInRyYW5zcG9zZSIsImNvcHlQb3NpdGlvbiIsIm1hdHJpeFdvcmxkIiwiY2FjaGVkU3R5bGUiLCJpZCIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSIsInRyYW5zZm9ybSIsImRpc3RhbmNlVG9DYW1lcmFTcXVhcmVkIiwiZ2V0RGlzdGFuY2VUb1NxdWFyZWQiLCJjaGlsZHJlbiIsIm9iamVjdDEiLCJvYmplY3QyIiwic2V0RnJvbU1hdHJpeFBvc2l0aW9uIiwiZGlzdGFuY2VUb1NxdWFyZWQiLCJ6T3JkZXIiLCJzY2VuZSIsIm9yZGVyIiwic29ydCIsInpNYXgiLCJ0cmF2ZXJzZSIsImluZGV4IiwiekluZGV4IiwicmVuZGVyIiwicHJvamVjdGlvbk1hdHJpeCIsIldlYmtpdFBlcnNwZWN0aXZlIiwiTW96UGVyc3BlY3RpdmUiLCJwZXJzcGVjdGl2ZSIsInVwZGF0ZU1hdHJpeFdvcmxkIiwicGFyZW50IiwiX0NTUzNET2JqZWN0IiwiX0NTUzNEU3ByaXRlIiwiQ1NTTGF5ZXIiLCJpbml0IiwiZGVsYXkiLCJhcHBlbmRUbyIsImhlYWQiLCJyZW1vdmUiLCJqQ29udGFpbmVyIiwid2lkdGhQeHMiLCJoZWlnaHRQeHMiLCJzZXREYXRhIiwiY2FsbEludGVybmFsIiwiZXJyb3IiLCJjbGVhckludGVybmFscyIsIm
13345NzcyIsImh0bWwiLCJqcyIsImV2YWwiLCJwZW5kZWRDYWxsIiwiY2xiIiwidGltZXN0YW1wIiwiRGF0ZSIsIm5vdyIsInNldFRpbWVvdXQiLCJpc0hpZGRlbiIsImhhc0NsYXNzIiwiaGlkZSIsImFkZENsYXNzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzaG93IiwicmVtb3ZlQ2xhc3MiLCJtYXhTaXplIiwiSW5maW5pdHkiLCJzaXplb2YiLCJjb3VudFNpemVvZiIsIm9zIiwiTWFwIiwiZm9yRWFjaCIsImdldCIsImxvY2tlZCIsImRlbGV0ZSIsImZyZWVTcGFjZSIsImFyciIsImtleSIsInJlY3Vyc2lvblNpemVvZiIsImdldFRpbWVzdGFtcCIsInB1dCIsIkNvbnRyb2xsZXIiLCJoYW5kbGVEZWZhdWx0IiwiZGlzcGF0Y2hBc3luYyIsInRoZW4iLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnREaXNwYXRjaGVyIiwiQ3VzdG9tRXZlbnRDb252ZXJ0ZXIiLCJjdXN0b21UZXN0IiwiZURvYyIsImN1c3RvbXMiLCJ0YXJnZXQiLCJhZGRDdXN0b20iLCJjdXN0b20iLCJ0ZXN0SW50ZXJzZWN0aW9uIiwiRmluZGVyIiwiaXNEZWxpbWV0ciIsIkRFTElNSVRFUiIsIm1lcmdlIiwiYXMiLCJzdHJzIiwiY2hhckF0Iiwic3RyIiwiYWRkSGl0cyIsImNoYXJzIiwicGF0dGVybiIsImRlbGltZXRlciIsImhpdHMiLCJhZGRDb250ZXh0IiwiZGVscyIsImNvbnRleHRMZW5ndGgiLCJwcmV2RGVscyIsImNvbnRleHRzIiwic3Vic3RyIiwiZ2V0SGl0cyIsImdldENvbnRleHRzIiwidG9Mb3dlckNhc2UiLCJsc3RyIiwid29ya2VyU3JjIiwiUERGSlNfTE9DQUxFIiwiR0xPQkFMX1BBVEhTIiwicGRmSnNXb3JrZXIiLCJjTWFwVXJsIiwicGRmSnNDTWFwVXJsIiwiY01hcFBhY2tlZCIsImRpc2FibGVBdXRvRmV0Y2giLCJkaXNhYmxlU3RyZWFtIiwiaW1hZ2VSZXNvdXJjZXNQYXRoIiwiZXh0ZXJuYWxMaW5rVGFyZ2V0IiwiTGlua1RhcmdldCIsIkJMQU5LIiwiUGRmIiwibG9hZGluZ1Byb2dyZXNzIiwiaGFuZGxlclF1ZXVlIiwicHJvZ3Jlc0RhdGEiLCJsb2FkZWQiLCJ0b3RhbCIsInRhc2siLCJnZXREb2N1bWVudCIsInJhbmdlQ2h1bmtTaXplIiwib25Qcm9ncmVzcyIsImN1ciIsIm9sZCIsImlzTmFOIiwiaGFuZGxlciIsIm51bVBhZ2VzIiwiYWxsIiwiZ2V0UGFnZSIsImNhdGNoIiwiZG91YmxlZFBhZ2VzIiwiZ2V0UGFnZVNpemUiLCJnZXRQYWdlVHlwZSIsImdldFBhZ2VzTnVtIiwic3BsaWNlIiwic2V0TG9hZGluZ1Byb2dyZXNzQ2xiIiwiZ2V0SGFuZGxlciIsIlRocmVlRXZlbnRDb252ZXJ0ZXJGcyIsIm9iamVjdHNUZXN0Iiwib2JqZWN0c0FuZEZhY2VzVGVzdCIsImZhY2UiLCJtYXRlcmlhbEluZGV4IiwidmlzdWFsV29ybGQiLCJjb29yZHMiLCJyYXljYXN0ZXIiLCJ0aHJlZXMiLCJhZGRUaHJlZSIsInJlbW92ZVRocmVlIiwic2V0Q29vcmRzRnJvbUV2ZW50Iiwic2V0RnJvbUNhbWVyYSIsImludGVyc2VjdHMiLCJpbnRlcnNlY3RPYmplY3RzIiwidmVydGljZXMyVVZzIiwiaW5kZWNlcyIsImNvbnZlckNsYiIsInZpcyIsImNvbXB1dGVGYWNlVmVydGV4VXZzIiwidXZzIiwidXZzaSIsImZhY2VWZXJ0ZXhVdnMiLCJTcGhlcmVHZW9tZXRyeSIsImZpbmRVdlRyaXMiLCJmb3VuZCIsImZpbmRJbnRlcm5hbFZlcnRpY2VzIiwidmVydGV4Tm9ybWFscyIsInZhbHVlcyIsIlRhcmdldCIsImZuIiwiRmxpcEJvb2siLCJvcHRpb25zIiwicGRmTGlua3NIYW5kbGVyIiwic291bmRzIiwidG9jQ3RybCIsInRodW1ibmFpbHMiLCJib29rbWFya3MiLCJjdHJsIiwiYm9va1ByaW50ZXIiLCJib29rIiwicHJvcHNCdWlsZGVyIiwiYm9va0J1aWxkZXIiLCJwZW5kaW5nRGlzcG9zZSIsIkJvb2tWaWV3IiwiRGV0ZWN0b3IiLCJ3ZWJnbCIsImFkZEdldFdlYkdMTWVzc2FnZSIsImdldFZpZXciLCJsb2FkaW5nQ3RybCIsIkxvYWRpbmdDb250cm9sbGVyIiwicHJvZ3Jlc3MiLCJWaXN1YWxXb3JsZCIsImdldENvbnRhaW5lciIsIm93bmVyRG9jdW1lbnQiLCJkZWZhdWx0VmlldyIsInByb3BlcnRpZXNDYWxsYmFjayIsIkJvb2siLCJCb29rUHJpbnRlciIsInRlbXBsYXRlIiwicHJpbnRTdHlsZSIsIkJvb2tDb250cm9sbGVyIiwiY29udHJvbHNQcm9wcyIsInNldEluamVjdG9yIiwidyIsImJvb2tDdHJsIiwiYWRkSGFuZGxlciIsInNldFByaW50ZXIiLCJzZWFyY2giLCJTZWFyY2giLCJnZXRTZWFyY2hWaWV3IiwiZ2V0UGFnZXMiLCJvblF1ZXJ5Iiwic2V0UXVlcnkiLCJiaW5kIiwic2V0UmVzdWx0cyIsInJlc3VsdHMiLCJsYXN0UGFnZSIsIlRodW1ibmFpbHMiLCJnZXRUaHVtYm5haWxzVmlldyIsImtXdG9IIiwiVG9jQ29udHJvbGxlciIsInNldFRodW1ibmFpbHMiLCJzZXRTZWFyY2giLCJzZXRUb2NDdHJsIiwiUGRmTGlua3NIYW5kbGVyIiwiaGFuZGxlRXZlbnQiLCJnZXRPdXRsaW5lIiwib3V0bGluZSIsIkJvb2ttYXJrcyIsImdldEJvb2ttYXJrc1ZpZXciLCJzZXRCb29rbWFya3MiLCJwZGZMaW5rcyIsInNldEhhbmRsZXIiLCJTb3VuZHNFbnZpcm9tZW50Iiwic2V0U291bmRzIiwic3Vic2NyaWJlRmxpcHMiLCJBdXRvTmF2aWdhdG9yIiwiYXV0b05hdmlnYXRpb24iLCJwZGYiLCJQZGZCb29rUHJvcHNCdWlsZGVyIiwic2V0UHJvZ3Jlc3MiLCJDbGJCb29rUHJvcHNCdWlsZGVyIiwiY29udGFpbmVycyIsImF0dHIiLCJwcm90b3R5cGUiLCJUeXBlRXJyb3IiLCJPIiwic3RhcnQiLCJhcmd1bWVudHMiLCJyZWxhdGl2ZVN0YXJ0IiwiZW5kIiwicmVsYXRpdmVFbmQiLCJmaW5hbCIsImZpbmQiLCJkZWZpbmVQcm9wZXJ0eSIsInByZWRpY2F0ZSIsImxpc3QiLCJ0aGlzQXJnIiwiY2FsbCIsImZpbmRJbmRleCIsIlJlZ0V4cCIsImVzY2FwZSIsIlN0cmluZyIsInJlcGxhY2VBbGwiLCJ1cmxQYXJhbSIsIm5hdmlnYXRlcyIsInBhZ2VOIiwiZmIzZCIsImluc3RhbmNlcyIsImdvVG9QYWdlIiwiZ2V0UGFnZU51bWJlciIsImdldFBhcmFtZXRlckJ5TmFtZSIsInJlZ2V4IiwiZXhlYyIsImRlY29kZVVSSUNvbXBvbmVudCIsIm51bWJlciIsInBhcnNlSW50IiwiQmluZGVyIiwiYmFja1NpemUiLCJiYWNrRyIsIkJveEdlb21ldHJ5IiwiYmFja00iLCJ0ZXh0dXJlTG9hZGVyIiwibG9hZCIsInRleHR1cmUiLCJzZXRIZXgiLCJtaW5GaWx0ZXIiLCJMaW5lYXJGaWx0ZXIiLCJiYWNrIiwiYmFja1JUIiwiYmFja1JSIiwiYmFja0xUIiwiYmFja0xSIiwibGVmdFBpdm90IiwicmlnaHRQaXZvdCIsInRyMSIsInF1YXRlcm5pb24iLCJzZXRGcm9tQXhpc0FuZ2xlIiwidHIyIiwic2V0TGVmdCIsInNldFJpZ2h0Iiwiam9pbkxlZnRDb3ZlciIsImRpc2Nvbm5lY3RMZWZ0Q292ZXIiLCJqb2luUmlnaHRDb3ZlciIsImRpc2Nvbm5lY3RSaWdodENvdmVyIiwibW91c2VDb250cm9sbGVyIiwicHJlcGFyZVByb3BzIiwiem9vbSIsInNpbmdsZVBhZ2UiLCJhdXRvUmVzb2x1dGlvbiIsImVuYWJsZSIsInBhZ2VNYW5hZ2VyIiwiUGFnZU1hbmFnZXIiLCJsYXllck1hbmFnZXIiLCJDc3NMYXllcnNNYW5hZ2VyIiwic2VhcmNoRW5naW5lIiwiU2VhcmNoRW5naW5lIiwib25QYWdlSGl0c0NoYW5nZWQiLCJxdWVyeSIsInJlZnJlc2hQYWdlUXVlcnkiLCJiaW5kZXIiLCJsZWZ0Q292ZXIiLCJDb3ZlciIsInNldExlZnRDb3ZlclRleHR1cmUiLCJzdWJzY3JpYmVTaGVldEJsb2NrIiwicmlnaHRDb3ZlciIsInNldFJpZ2h0Q292ZXJUZXh0dXJlIiwidGhyZWVTaGVldEJsb2NrcyIsInNoZWV0QmxvY2tzIiwiYWRkU2hlZXRCbG9jayIsInNldFBhZ2VUZXh0dXJlIiwibGFzdE1vdXNlUG9zIiwic2hlZXRQaHlzaWNzIiwiU2hlZXRQaHlzaWNzIiwidXBkYXRlIiwicGFnZVgiLCJwYWdlWSIsImFkZFJlbmRlckNhbGxiYWNrIiwib24iLCJvblBpY2tDYWxsYmFjayIsImRyYWciLCJvbkRyYWdDYWxsYmFjayIsIm9uUmVsZWFzZUNhbGxiYWNrIiwiZHJhZ0FuZ2xlIiwidG1wIiwiYm94cyIsIkJveDMiLCJhZGRPYmplY3QiLCJyZWZyZXNoWm9vbSIsIm5vdGlmeUJlZm9yZUFuaW1hdGlvbiIsIm5vdGlmeUFmdGVyQW5pbWF0aW9uIiwicmVtb3ZlT2JqZWN0IiwicmVtb3ZlUmVuZGVyQ2FsbGJhY2siLCJyZW1vdmVTaGVldEJsb2NrcyIsInJlbW92ZVNoZWV0QmxvY2siLCJzZXRBdXRvUmVzb2x1dGlvbiIsInNldFpvb20iLCJpc1Byb2Nlc3NpbmciLCJzZXRGbGlwUHJvZ3Jlc3NDbGIiLCJmbGlwUHJvZ3Jlc3NDbGIiLCJpc0FjdGl2ZVBhZ2UiLCJnZXRCbG9ja0J5UGFnZSIsImJsb2NrIiwiZ2V0QmxvY2tQYWdlcyIsInJhbmdlIiwiZ2V0VG9wUGFnZXMiLCJnZXRQYWdlU3RhdGUiLCJlbmFibGVMb2FkaW5nQW5pbWF0aW9uIiwiZ2V0TGVmdEZsaXBwaW5nIiwiZ2V0UmlnaHRGbGlwcGluZyIsImdldENsb3NlZEJsb2NrQW5nbGUiLCJwaHlzaWNJZCIsImdldFBhcmFtZXRyIiwiZmxpcExlZnQiLCJwcm9ncmVzc0NsYiIsImNvbm5lY3RQaHlzaWNzIiwic2V0U2hlZXRCbG9ja3MiLCJzcGxpdFNoZWV0QmxvY2siLCJmaW5pc2hBbmltYXRpb25DbGIiLCJmbGlwUmlnaHQiLCJjbGVhckhvdmVySW5mbyIsInR1cm5PbkV2ZW50cyIsImhvdmVySW5mbyIsImZvcmNlIiwiY29ybmVyRm9yY2UiLCJ4U2VnbWVudCIsInNldEZyb21PYmplY3QiLCJ1bmlvbiIsImNvbXB1dGVUYXJnZXQiLCJzZWciLCJ1diIsImNvcm5lclRhcmdldCIsImRyYWdGb3JjZUNsYiIsImdldERyYWdDb3JuZXJGb3JjZUNsYiIsImRyYWdJbmZvIiwidHVybk9mZkV2ZW50cyIsImdldEZsaXBwaW5nIiwiZmxpcCIsImVuYWJsZU1vdXNlIiwiY29ybmVyQ2FsbGJhY2siLCJwZW5kaW5ncyIsImhvdmVyQW5nbGUiLCJob3ZlciIsInBvc3NpYmxlIiwibmV4dEJsb2NrIiwic2V0UGFyYW1ldHIiLCJ
13345nZXRUYXJnZXRGb3JjZUNsYiIsImhvdmVyQ29ybmVyRm9yY2VDbGIiLCJjb3JuZXJDbGlja0RhdGEiLCJwb3ciLCJldmVudENvbnZlcnRlciIsIkNpcmNsZVRhcmdldCIsIm1vdXNlQ2FsbGJhY2siLCJ0cmFuc2ZlckV2ZW50VG9UZXh0dXJlIiwidG91Y2hDYWxsYmFjayIsIm1vdXNlRXZlbnRzIiwidG91Y2hFdmVudHMiLCJibG9ja3MiLCJtYXRlcmlhbCIsIm1lcmdlU2hlZXRCbG9ja3MiLCJjYWxjQmxvY2tGb3JjZSIsInZlbG9jaXR5IiwiY29ybmVySGVpZ2h0IiwiY2FsY0Jsb2NrQ29ybmVyRm9yY2UiLCJhbmltYXRpb25Ob3RpZmljYXRpb24iLCJyZWplY3QiLCJjb3ZlckhlaWdodCIsInNpbXVsYXRlQ2xiIiwicmVtb3ZlQ2xiIiwiYW5nbCIsImNoIiwibGFzdFQiLCJ0cmlnZ2VyIiwic2ltdWxhdGUiLCJsZWZ0U2l6ZSIsIm5ld0Jsb2NrIiwiZmlyc3RCbG9jayIsImxhc3RCbG9jayIsImNyZWF0ZVNpZGVUZXh0dXJlIiwiakMiLCJtZXJnZVByb3BzIiwic2Vjb25kIiwibmF2aWdhdGlvbkNvbnRyb2xzIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIm9yYml0IiwiZ2V0T3JiaXQiLCJ1cGRhdGVWaWV3SWZTdGF0ZSIsImJpbmRBY3Rpb25zIiwic21hcnRQYW4iLCJhY3Rpb25zIiwiYWN0aXZlIiwiYWN0aXZlRm9yTW9iaWxlIiwic3RhdHMiLCJsaWdodGluZyIsImRlZmF1bHQiLCJhY3RpdmVTaWRlIiwiYm9va1dhdGNoZXIiLCJPYmplY3QzRFdhdGNoZXIiLCJTdGF0cyIsInRvcCIsInNldEV4dHJhTGlnaHRpbmciLCJvblNjcmVlbk1vZGVDaGFuZ2VkIiwib25VcGRhdGVWaWV3IiwidXBkYXRlVmlldyIsIkZ1bGxTY3JlZW4iLCJnZXRQYXJlbnRDb250YWluZXIiLCJjbWRTbWFydFBhbiIsInRlbXBsYXRlT2JqZWN0IiwiYXBwTG9hZGVkIiwibG9hZGluZ0FuaW1hdGlvbiIsInNraW4iLCJpbml0TG9hZGluZ0FuaW1hdGlvbiIsImNvZWZmaWNpZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInZpc2libGUiLCJzZXRTdGF0ZSIsImVuYWJsZU5hdmlnYXRpb24iLCJwcmludGVyIiwic2V0RW5hYmxlZCIsImNhblpvb21JbiIsImNhblpvb21PdXQiLCJjYW5EZWZhdWx0Wm9vbSIsInNldEJvb2tab29tIiwiY21kWm9vbUluIiwiZGVsdGEiLCJ6b29tSW4iLCJjbWRab29tT3V0Iiwiem9vbU91dCIsImNtZERlZmF1bHRab29tIiwiY21kVG9jIiwidG9nbGUiLCJjbWRGYXN0QmFja3dhcmQiLCJzdGFydEZsaXAiLCJjbWRCYWNrd2FyZCIsImNtZEJpZ0JhY2t3YXJkIiwiY21kRm9yd2FyZCIsImNtZEJpZ0ZvcndhcmQiLCJjbWRGYXN0Rm9yd2FyZCIsImNtZFNhdmUiLCJvcGVuIiwiZG93bmxvYWRVUkwiLCJjbWRQcmludCIsInByaW50IiwiY21kRnVsbFNjcmVlbiIsImFjdGl2YXRlZCIsInJlcXVlc3QiLCJjYW5jZWwiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJtaW5Qb2xhckFuZ2xlIiwibWF4UG9sYXJBbmdsZSIsImNtZFNpbmdsZVBhZ2UiLCJjbWRTb3VuZHMiLCJjbWRTdGF0cyIsImFwcGVuZCIsImNtZExpZ2h0aW5nVXAiLCJjbWRMaWdodGluZ0Rvd24iLCJwYWdlTnVtIiwiY3VycmVudCIsImZsaXBzIiwiY292cyIsImN2Iiwic2V0Q2xiIiwiZmwiLCJ0aW1lIiwiZmxpcFJlcyIsImVuZEZsaXAiLCJnZXRQYWdlRm9yR1VJIiwiaW5wUGFnZSIsImlzQ21kVmlzaWJsZSIsIm5hcnJvd1ZpZXciLCJlbmFibGVkSW5OYXJyb3ciLCJ1cGRhdGVWaWV3U3RhdGUiLCJ2aWV3U3RhdGUiLCJhdmFpbGFibGUiLCJmbGlwcGVyc0VuYWJsZSIsImdldEFjdGlvbnMiLCJpc1N3aXBwaW5nIiwidG91Y2hDbWRTd2lwZSIsImNvZGUiLCJjbWRzIiwiYWN0aXZhdGUiLCJjbWRQYW5MZWZ0IiwicGFuIiwic3BlZWQiLCJjbWRQYW5SaWdodCIsImNtZFBhblVwIiwiY21kUGFuRG93biIsIm1vdXNlQ21kUm90YXRlIiwicm90YXRlIiwibW91c2VDbWREcmFnWm9vbSIsIm1vdXNlQ21kUGFuIiwibW91c2VDbWRXaGVlbFpvb20iLCJwcmV2ZW50RGVmYXVsdCIsImRlbHRhWSIsInRvdWNoQ21kUm90YXRlIiwidG91Y2hDbWRab29tIiwidG91Y2hDbWRQYW4iLCJ0b3VjaCIsInRvdWNoZXMiLCJvcmlnaW5hbEV2ZW50Iiwic3dpcGVEYXRhIiwiaGFuZGxlZCIsIngwIiwieTAiLCJ3aWRTZXR0aW5ncyIsImVUb0EiLCJFdmVudHNUb0FjdGlvbnMiLCJhZGRBY3Rpb24iLCJtb3VzZUJ1dHRvbnMiLCJSaWdodCIsImFjdGlvbiIsImZsYWdzIiwic2V0QWN0aW9ucyIsImxldmVscyIsInN0eWxlU2hlZXQiLCJwZGZTcmMiLCJjYW5jZWxlZCIsImZyYW1lIiwicHJpbnRXbmQiLCJjYWxsTWFudWFsbHkiLCJ1c2VJRnJhbWUiLCJjb250ZW50V2luZG93IiwicmVuZGVyQ29udGVudCIsImNvbnRlbnQiLCJwcmludERvYyIsIndyaXRlIiwiY2xvc2UiLCJTZXQiLCJyZW5kZXJIdG1sIiwicmVuZGVySGVhZCIsIndyYXAiLCJsaW5rcyIsIm1hdGNoIiwibGluayIsImZhaWwiLCJyZXNwb25zZVRleHQiLCJkZWZhdWx0U3R5bGVTaGVldCIsImlzQ2hyb21pdW0iLCJjaHJvbWUiLCJ3aW5OYXYiLCJ2ZW5kb3JOYW1lIiwidmVuZG9yIiwiaXNJRWVkZ2UiLCJpc0lPU0Nocm9tZSIsImNvbnRhaW5lciIsImluaXRWaWV3IiwiYm9va21hcmtzVmlldyIsInRodW1ibmFpbHNWaWV3Iiwic2VhcmNoVmlldyIsImdldEhhbmRsZXJzIiwiaGFuZGxlcnMiLCJjYWxsTGF0ZXIiLCJQQUdFX0hBTkRMRVJfREVMQVkiLCJvbkl0ZW1TdGF0ZUNoYW5nZWQiLCJwYXJlbnRDb250YWluZXIiLCJnZXRGb3JtcyIsImdldExpbmtzIiwiZ2V0V2lkZ2V0cyIsImdldElucHV0cyIsImdldFRleHRzIiwiZ2V0VGVtcGxhdGUiLCJzdHlsZXMiLCJyZWwiLCJzY3JpcHQiLCJWaWV3IiwiaW1hZ2VGYWN0b3J5Iiwid3JhcHBlcnMiLCJnZXRBY3RpdmVzIiwibGF5ZXJzIiwiaGlkZGVuIiwiZ2V0TGF5ZXJzIiwic2wiLCJTaGVldENzc0xheWVyIiwid2FpdCIsInBhZ2VRdWVyeSIsInBhZ2VDYWNoZSIsInJlc291cmNlc0NhY2hlIiwiY2FudmFzIiwibG9hZGluZ3MiLCJyZW5kZXJRdWV1ZSIsInBhZ2VSZXF1ZXN0cyIsInByZWRpY3RlZFJlcXVlc3RzIiwidG1wTWF0ZXJpYWwiLCJNZXNoQmFzaWNNYXRlcmlhbCIsIlBsYW5lR2VvbWV0cnkiLCJsb2FkaW5nIiwiY3JlYXRlTG9hZGluZ1RleHR1cmUiLCJ1cGRhdGVSZW5kZXJRdWV1ZSIsInNwcml0ZVRpbGVzIiwiYW5pbWF0aW9uIiwiTG9hZGluZ0FuaW1hdGlvbiIsImFuaW1hdG9yIiwiVGV4dHVyZUFuaW1hdG9yIiwiY3JlYXRlU3ByaXRlIiwiaXNDb3ZlciIsImlzTW9iaWxlIiwic2V0dXBNYXRlcmlhbCIsImlzQWN0aXZlIiwicmVtb3ZlRnJvbUxvYWRpbmdzIiwicmVtb3ZlRnJvbVJlbmRlclF1ZXVlIiwid3JhcHBlciIsInB1c2hJblJlbmRlclF1ZXVlIiwiZXMiLCJjc3NMYXllcnNMb2FkZXIiLCJhcmdzIiwicmVzb2x2ZVBlbmRpbmdzIiwicnRsUGFnZU4iLCJwaSIsImlzVG9wIiwic2V0TWF0ZXJpYWwiLCJjYWxjUmVzb2x1dGlvbiIsImludGVyYWN0aXZlIiwiQ29sb3IiLCJvblVwZGF0ZSIsInJlbmRlcmluZyIsImlzU2luZ2xlUGFnZSIsInRyYW5zZmVyRXZlbnRzIiwibW91c2V1cCIsIm1vdXNlb3V0IiwiZW50IiwidG9PYmplY3QiLCJnZXRPckxvYWRUZXh0dXJlT2JqZWN0IiwidG9Eb2MiLCJsb2FkUHJlZGljdGVkUGFnZXMiLCJhZGRQYWdlUmVxdWVzdCIsInNoaWZ0Iiwib2IiLCJwYWdlRGVzY3JpcHRpb24iLCJ2aWV3cG9ydCIsImdldFZpZXdwb3J0IiwiY3Vyc29ycyIsImRlZmF1bHRIYW5kbGVyIiwiZGVzdGluYXRpb24iLCJjYWxsSGFuZGxlcnMiLCJldmVudCIsImFubm8iLCJhbm5vdGF0aW9uIiwicG9wIiwiZGVzdCIsImRlc3RQcm9taXNlIiwiZ2V0RGVzdGluYXRpb24iLCJnZXRQYWdlSW5kZXgiLCJwcm9jZXNzIiwic3RhbXAiLCJuZXh0IiwiZ2V0VGV4dENvbnRlbnQiLCJ0ZXh0Q29udGVudCIsIml0ZW1zIiwiaXRlbSIsImxheWVyIiwiYWRkQ3NzT2JqZWN0IiwicmVtb3ZlQ3NzT2JqZWN0Iiwicm90YXRpb24iLCJ0YXJnZXRGb3JjZUNsYiIsImciLCJ0bCIsInRhcmdldEFuZ2xlIiwiZmxidCIsImRyYWdDb3JuZXJGb3JjZUNsYiIsImZwcyIsInN0YXJ0RHQiLCJtYXJnaW4iLCJpbmZNIiwiYXR0ZW1wdHMiLCJtYXhJdGVyYXRpb25zIiwiZm9yY2VDbGIiLCJjb3JuZXJGb3JjZUNsYiIsIm5vIiwiY2YiLCJnZXRQYXJhbWV0ck1hcCIsIlQiLCJhdHRlbXB0IiwiaXQiLCJub3MiLCJpbnRlZ3JhdGUiLCJjaSIsImZpbmRDb2xsaXNpb25zIiwic2NvcyIsInNvbHZlQ29sbGlzaW9uIiwiZ3MiLCJpMCIsImZpbmRBbmRTb2x2ZUNvcm5lckNvbGxpc2lvbnMiLCJyZW1vdmVTdGF0aWNzIiwiYWwiLCJkQ2giLCJkdiIsIm1tIiwiYXYiLCJidiIsImlzQ29sbGlzaW9uIiwiYXVkaW8iLCJBdWRpbyIsInBsYXkiLCJwYXVzZSIsImN1cnJlbnRUaW1lIiwiZW1pdHRlciIsInRhYiIsIm9uTmF2aWdhdGUiLCJuYXZpZ2F0ZVRodW1ibmFpbHMiLCJmaXJlQ2hhbmdlIiwibmF2aWdhdGVTZWFyY2giLCJuYXZpZ2F0ZUJvb2ttYXJrcyIsImlzQm9va21hcmtzIiwiY21kQm9va21hcmtzIiwiY21kVGh1bWJuYWlscyIsImNtZFNlYXJjaCIsImNtZENsb3NlVG9jIiwiV2lkZ2V0Q29udHJvbGxlciIsImZyb250R2VvbWV0cnkiLCJ0cmFuc2xhdGUiLCJiYWNrR2VvbWV0cnkiLCJyb3RhdGVZIiwibGVmdEdlb21ldHJ5IiwicmlnaHRHZW9tZXRyeSIsInRvcEdlb21ldHJ5Iiwicm90YXRlWCIsImJvdHRvbUdlb21ldHJ5IiwiR2VvbWV0cnkiLCJhZGRGYWNlcyIsImZzIiwiRmFjZTMiLCJtYXBWZXJ0aWNlcyIsImRzdCIsImVxIiwiZnJvbnRNYXAiLCJiYWNrTWFwIiwibGVmdE1hcCIsInJpZ2h0TWFwIiwiTGVmdCIsIk1pZGRsZSIsImdldFRpdGxlIiwidGl0bGUiLCJnZXRJdGVtcyIsIm5vZGVzIiwibWFwTm9kZXMiLCJsaSIsImNtZCIsIm5vZGUiLCJtaW5pbWl6ZWQiLCJyZW5kZXJOb2RlIiwicmVuZGVyTm9kZXMiLCJleHBhbmQiLCJtaW5pbWl6ZSIsImxldmVsIiwiZ2V0V2ViR0xFcnJvck1lc3NhZ2UiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwidGV4dEFsaWduIiwiYmFja2dyb3VuZCIsImlubmVySFRNTCIsIldlYkdMUmVuZGVyaW5nQ29udGV4dCIsInBhcmFtZXRlcnMiLCJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiLCJ3b3JrZXJzIiwiV29ya2VyIiwi
13345ZmlsZWFwaSIsIkZpbGUiLCJGaWxlUmVhZGVyIiwiRmlsZUxpc3QiLCJCbG9iIiwiRG9jTW91c2VTaW11bGF0b3IiLCJqRnJhbWUiLCJiRWxlbWVudCIsImNvbnRlbnREb2N1bWVudCIsInJlc2VuZFByb3BlcnRpZXMiLCJnZXREZWZhdWx0UmVzZW5kUHJvcGVydGllcyIsInVuZGVmaW5lZFByb3BlcnRpZXMiLCJnZXREZWZhdWx0VW5kZWZpbmVkUHJvcGVydGllcyIsIm9uRG9jQ2hhbmdlQ2xicyIsInRlcm1zIiwiSE9WRVIiLCJBQ1RJVkUiLCJzdHlsZVNoZWV0cyIsInNzIiwiY3NzUnVsZXMiLCJjc3NUZXh0IiwidGVybSIsInNlbGVjdG9yVGV4dCIsImNvbnZlcnRDb29yZHMiLCJqRWxlbWVudCIsInRyaWdnZXJFdmVudCIsImFkdmFuY2VkUHJvcHMiLCJ0aW1lU3RhbXAiLCJnZXRDb21wdXRlZFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImVudGVyRWxlbWVudCIsImxlYXZlRWxlbWVudCIsImFjdGl2YXRlRWxlbWVudCIsImRlYWN0aXZhdGVFbGVtZW50IiwiYWRkRG9jQ2hhbmdlQ2xiIiwiZWxlbWVudEZyb21Qb2ludCIsImNoaWxkTm9kZXMiLCJjaGlsZCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50Iiwib2ZmMCIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsImNhcEVsZW1lbnQiLCJsZWF2ZWQiLCJob3ZFbGVtZW50IiwicmVsYXRlZFRhcmdldCIsIkRvbTJJbWFnZSIsInV0aWwiLCJuZXdVdGlsIiwiaW5saW5lciIsIm5ld0lubGluZXIiLCJmb250RmFjZXMiLCJuZXdGb250RmFjZXMiLCJpbWFnZXMiLCJuZXdJbWFnZXMiLCJ0b1N2ZyIsInRvUG5nIiwidG9KcGVnIiwidG9CbG9iIiwidG9QaXhlbERhdGEiLCJpbXBsIiwiY2xvbmVOb2RlIiwiZW1iZWRGb250cyIsImlubGluZUltYWdlcyIsImFwcGx5T3B0aW9ucyIsIm1ha2VTdmdEYXRhVXJpIiwiYmdjb2xvciIsImJhY2tncm91bmRDb2xvciIsInByb3BlcnR5IiwiZHJhdyIsImdldEltYWdlRGF0YSIsInRvRGF0YVVSTCIsInF1YWxpdHkiLCJjYW52YXNUb0Jsb2IiLCJkb21Ob2RlIiwibWFrZUltYWdlIiwibmV3Q2FudmFzIiwiZmlsbFJlY3QiLCJyb290IiwibWFrZU5vZGVDb3B5IiwiY2xvbmVDaGlsZHJlbiIsInByb2Nlc3NDbG9uZSIsImlzQ2FudmFzIiwib3JpZ2luYWwiLCJjbG9uZUNoaWxkcmVuSW5PcmRlciIsImFzQXJyYXkiLCJjaGlsZENsb25lIiwiaXNFbGVtZW50IiwiY2xvbmVTdHlsZSIsImNsb25lUHNldWRvRWxlbWVudHMiLCJjb3B5VXNlcklucHV0IiwiZml4U3ZnIiwiY29weVN0eWxlIiwic291cmNlIiwiY29weVByb3BlcnRpZXMiLCJzZXRQcm9wZXJ0eSIsImdldFByb3BlcnR5UHJpb3JpdHkiLCJjbG9uZVBzZXVkb0VsZW1lbnQiLCJjbGFzc05hbWUiLCJ1aWQiLCJzdHlsZUVsZW1lbnQiLCJmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUiLCJzZWxlY3RvciIsImZvcm1hdENzc1RleHQiLCJmb3JtYXRDc3NQcm9wZXJ0aWVzIiwiY3JlYXRlVGV4dE5vZGUiLCJmb3JtYXRQcm9wZXJ0eSIsImlzVGV4dEFyZWEiLCJpc0lucHV0Iiwic2V0QXR0cmlidXRlIiwiaXNTVkciLCJpc1NWR1JlY3QiLCJhdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJyZXNvbHZlQWxsIiwic3R5bGVOb2RlIiwiaW5saW5lQWxsIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiZXNjYXBlWGh0bWwiLCJ4aHRtbCIsInBhcnNlRXh0ZW5zaW9uIiwibWltZVR5cGUiLCJkYXRhQXNVcmwiLCJpc0RhdGFVcmwiLCJyZXNvbHZlVXJsIiwiZ2V0QW5kRW5jb2RlIiwiaXNJbWFnZSIsIm1pbWVzIiwiV09GRiIsIkpQRUciLCJleHRlbnNpb24iLCJiaW5hcnlTdHJpbmciLCJhdG9iIiwiYmluYXJ5QXJyYXkiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsImJhc2VVcmwiLCJpbXBsZW1lbnRhdGlvbiIsImNyZWF0ZUhUTUxEb2N1bWVudCIsImZvdXJSYW5kb21DaGFycyIsInRvU3RyaW5nIiwic2xpY2UiLCJ1cmkiLCJJbWFnZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJUSU1FT1VUIiwiWE1MSHR0cFJlcXVlc3QiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJvbnRpbWVvdXQiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwic2VuZCIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJlbmNvZGVyIiwib25sb2FkZW5kIiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsInJlc3BvbnNlIiwibWVzc2FnZSIsInN0cmluZyIsIm1zIiwiYXJnIiwiYXJyYXlMaWtlIiwiYXJyYXkiLCJsZWZ0Qm9yZGVyIiwicHgiLCJyaWdodEJvcmRlciIsInNjcm9sbFdpZHR
13345oIiwidG9wQm9yZGVyIiwiYm90dG9tQm9yZGVyIiwic2Nyb2xsSGVpZ2h0Iiwic3R5bGVQcm9wZXJ0eSIsInBhcnNlRmxvYXQiLCJIVE1MQ2FudmFzRWxlbWVudCIsIkhUTUxUZXh0QXJlYUVsZW1lbnQiLCJIVE1MSW5wdXRFbGVtZW50IiwiU1ZHRWxlbWVudCIsIlNWR1JlY3RFbGVtZW50IiwiSFRNTEltYWdlRWxlbWVudCIsIlVSTF9SRUdFWCIsInNob3VsZFByb2Nlc3MiLCJyZWFkVXJscyIsImlubGluZSIsImRhdGFVcmwiLCJ1cmxBc1JlZ2V4Iiwibm90aGluZ1RvSW5saW5lIiwidXJscyIsInJlYWRBbGwiLCJ3ZWJGb250cyIsIndlYkZvbnQiLCJjc3NTdHJpbmdzIiwiZ2V0Q3NzUnVsZXMiLCJzZWxlY3RXZWJGb250UnVsZXMiLCJydWxlcyIsIm5ld1dlYkZvbnQiLCJydWxlIiwiQ1NTUnVsZSIsIkZPTlRfRkFDRV9SVUxFIiwibG9nIiwid2ViRm9udFJ1bGUiLCJwYXJlbnRTdHlsZVNoZWV0IiwibmV3SW1hZ2UiLCJpbmxpbmVCYWNrZ3JvdW5kIiwiaW5saW5lZCIsIkRyYWciLCJpbnRlcnNlY3Rpb24iLCJzZWxlY3RlZCIsImNvbnRyb2xzU3RhdGUiLCJnZXRDb250cm9sc1N0YXRlIiwib25Nb3VzZU1vdmUiLCJvbk1vdXNlRG93biIsIm9uTW91c2VVcCIsInJheSIsIm9yaWdpbiIsInNldENvbnRyb2xzU3RhdGUiLCJnZXRXb3JsZERpcmVjdGlvbiIsImludGVyc2VjdFBsYW5lIiwiZ2V0RXZlbnRGbGFncyIsImN0cmxLZXkiLCJzaGlmdEtleSIsImFsdEtleSIsImdldFBvc2l0aW9uIiwiY29udGV4dE1lbnUiLCJtb3VzZURvd24iLCJtb3VzZU1vdmUiLCJtb3VzZVVwIiwibW91c2VXaGVlbCIsIm1vdXNlTW92ZURvYyIsIm1vdXNlVXBEb2MiLCJjbGljayIsImRibGNsaWNrIiwidG91Y2hTdGFydCIsInRvdWNoTW92ZSIsInRvdWNoRW5kIiwia2V5RG93biIsImtleVByZXNzIiwia2V5VXAiLCJmaXJlQWN0aW9ucyIsImJ1dHRvbiIsInBpY2tlZCIsImNsaWNrcyIsInRvdWNoUGljayIsInRvdWNoUGlja2VkIiwicG9zIiwia2V5Q29kZSIsIm1vZEtleXMiLCJDdHJsIiwiU2hpZnQiLCJBbHQiLCJfaGFzV2Via2l0RnVsbFNjcmVlbiIsIl9oYXNNb3pGdWxsU2NyZWVuIiwiX2hhc01zRnVsbHNjcmVlbiIsIndlYmtpdElzRnVsbFNjcmVlbiIsIm1vekZ1bGxTY3JlZW4iLCJtc0Z1bGxzY3JlZW5FbGVtZW50IiwiYXNzZXJ0Iiwid2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4iLCJtb3pSZXF1ZXN0RnVsbFNjcmVlbiIsIm1zUmVxdWVzdEZ1bGxzY3JlZW4iLCJ3ZWJraXRDYW5jZWxGdWxsU2NyZWVuIiwibW96Q2FuY2VsRnVsbFNjcmVlbiIsIm1zRXhpdEZ1bGxzY3JlZW4iLCJkb2N1bWVudEVsZW1lbnQiLCJpSWQiLCJoYXNGZWF0dXJlIiwiaW1hZ2VMb2FkIiwic3ZnUmVuZGVyIiwiZnJhbWVMb2FkIiwic2ltdWxhdG9yIiwiY2FsY1RpbWVUbyIsInVwZGF0ZUludGVydmFsIiwiY2xlYXJSZWN0Iiwic2hhZG93Qmx1ciIsInNoYWRvd0NvbG9yIiwic2hhZG93T2Zmc2V0WCIsInNoYWRvd09mZnNldFkiLCJmb250IiwidGV4dEJhc2VsaW5lIiwiZmlsbFRleHQiLCJkYSIsIl9hIiwiX3IiLCJjeCIsImN5IiwibngiLCJueSIsImFyYyIsImdldEltYWdlIiwic2lnbiIsInNob3dQcm9ncmVzcyIsImxvYWRpbmdNc2ciLCJnZXRMb2FkaW5nTXNnIiwiZGVmYXVsdExvYWRpbmdNc2ciLCJNb3VzZUV2ZW50Q29udmVydGVyIiwiYm91bmRCb3hDbGIiLCJ0ZXN0U2NhbGUiLCJlbGVtZW50U2l6ZSIsInZ4IiwidnkiLCJib3giLCJjb21wdXRlQ2xpZW50Qm91bmRCb3giLCJtb3ZlUGFuIiwidlRvQ2FtZXJhIiwicHJvamVjdCIsInhzIiwienMiLCJzZXRPYmplY3QiLCJjb21wdXRlQ29yciIsImNvcnIiLCJnZXRTY2FsZSIsIkt4IiwiS3kiLCJjZW50ZXJWaWV3Iiwic2V0U2NhbGUiLCJ0ZiIsIlkiLCJ2ZCIsIk9yYml0IiwibWluRGlzdGFuY2UiLCJtaW5ab29tIiwibWF4Wm9vbSIsImVuYWJsZURhbXBpbmciLCJkYW1waW5nRmFjdG9yIiwiZW5hYmxlWm9vbSIsInpvb21TcGVlZCIsImVuYWJsZVJvdGF0ZSIsInJvdGF0ZVNwZWVkIiwiZW5hYmxlUGFuIiwiYXV0b1JvdGF0ZSIsImF1dG9Sb3RhdGVTcGVlZCIsInRhcmdldDAiLCJwb3NpdGlvbjAiLCJ6b29tMCIsImdldFBvbGFyQW5nbGUiLCJzcGhlcmljYWwiLCJwaGkiLCJnZXRBemltdXRoYWxBbmdsZSIsInRoZXRhIiwicmVzZXQiLCJzY29wZSIsInVwZGF0ZVByb2plY3Rpb25NYXRyaXgiLCJjaGFuZ2VFdmVudCIsIl9zcGVlZCIsImRvbGx5SW4iLCJnZXRab29tU2NhbGUiLCJkb2xseU91dCIsIm5ld1NjYWxlIiwicXVhdCIsIlF1YXRlcm5pb24iLCJzZXRGcm9tVW5pdFZlY3RvcnMiLCJ1cCIsInF1YXRJbnZlcnNlIiwibGFzdFBvc2l0aW9uIiwibGFzdFF1YXRlcm5pb24iLCJhcHBseVF1YXRlcm5pb24iLCJzZXRGcm9tVmVjdG9yMyIsInJvdGF0ZUxlZnQiLCJnZXRBdXRvUm90YXRpb25BbmdsZSIsInNwaGVyaWNhbERlbHRhIiwibWFrZVNhZmUiLCJyYWRpdXMiLCJwYW5PZmZzZXQiLCJzZXRGcm9tU3BoZXJpY2FsIiwibG9va0F0Iiwiem9vbUNoYW5nZWQiLCJFUFMiLCJkb3QiLCJTcGhlcmljYWwiLCJyb3RhdGVVcCIsInBhbkxlZnQiLCJvYmplY3RNYXRyaXgiLCJzZXRGcm9tTWF0cml4Q29sdW1uIiwibXVsdGlwbHlTY2FsYXIiLCJwYW5VcCIsImRlbHRhWCIsIlBlcnNwZWN0aXZlQ2FtZXJhIiwidGFyZ2V0RGlzdGFuY2UiLCJ0YW4iLCJjbGllbnRIZWlnaHQiLCJPcnRob2dyYXBoaWNDYW1lcmEiLCJjbGllbnRXaWR0aCIsImJvdHRvbSIsImRvbGx5U2NhbGUiLCJvZmZzZXREb2xseSIsIndoZWVsRG9sbHkiLCJtMDAiLCJtMDEiLCJtMDIiLCJtMTAiLCJtMTEiLCJtMTIiLCJtMjAiLCJtMjEiLCJtMjIiLCJ0cmltIiwic2V0SGl0cyIsInJlY3RTaXplIiwiY3JlYXRlUG9seSIsInNldEFubm90YXRpb25zIiwiYW5ub3MiLCJ0YXJnZXRzIiwic3VidHlwZSIsImFQb3MiLCJhU3oiLCJQb2x5VGFyZ2V0IiwiYW5ub0NsYiIsImZpbmRlciIsInJlbmRlckhpdHMiLCJ0ZXN0U3oiLCJ0ZXh0RGl2IiwiYmFzZU9mZnNldCIsImhpdCIsIlV0aWwiLCJmb250TmFtZSIsImF0YW4yIiwidmVydGljYWwiLCJmb250SGVpZ2h0IiwiZm9udEFzY2VudCIsImFzY2VudCIsImRlc2NlbnQiLCJ0ZXN0U3BhbiIsIml3aWR0aCIsInJlbGF0aXZlT2Zmc2V0IiwiY2FsY1ZpZXdwb3J0Iiwib2Zmc2V0WCIsImdldEFubm90YXRpb25zIiwiY2FudmFzQ29udGV4dCIsInByZXZSZXN1bHRzIiwibmF2aWdhdGUiLCJkb1F1ZXJ5IiwicXVlcnlTdGFtcCIsImh0bWxzIiwiY3Jvc3NPcmlnaW4iLCJpbWFnZUVycm9yIiwiaW1nIiwidGlsZXNIb3JpeiIsInRpbGVzVmVydCIsIm51bVRpbGVzIiwidGlsZURpc3BEdXJhdGlvbiIsInRpbGVzSG9yaXpvbn
13345RhbCIsInRpbGVzVmVydGljYWwiLCJudW1iZXJPZlRpbGVzIiwidGlsZURpc3BsYXlEdXJhdGlvbiIsImN1cnJlbnREaXNwbGF5VGltZSIsImN1cnJlbnRUaWxlIiwibWlsbGlTZWMiLCJjdXJyZW50Q29sdW1uIiwiY3VycmVudFJvdyIsIlRocmVlTW91c2VFdmVudENvbnZlcnRlciIsIlRocmVlRXZlbnRDb252ZXJ0ZXIiLCJUaHJlZVRvdWNoRXZlbnRDb252ZXJ0ZXIiLCJsYXN0VG91Y2hlcyIsIlRvdWNoRXZlbnRDb252ZXJ0ZXIiLCJ0aHVtYm5haWxzQ2xiIiwiaGVhZGluZyIsInRodW1ibmFpbCIsImRhdGFUaHVtYm5haWwiLCJzZXRJbWFnZSIsImdldEFjdGl2ZSIsInNjcm9sbFRvcCIsImJ1aWx0IiwiVG91Y2hDb252ZXJ0ZXIiLCJjbGFzc1Byb3BlcnR5IiwiYXR0cmlidXRlUHJvcGVydHkiLCJhdHRyaWJ1dGVOYW1lIiwicmVtb3ZlQXR0ciIsImhhbmRsZUxpbmtFdmVudCIsImhhbmRsZUlucHV0RXZlbnQiLCJoYW5kbGVGb3JtRXZlbnQiLCJnZXRUaW1lIiwicGVuZGluZyIsImxvYWRGaWxlcyIsImZpbGVzIiwidGFza3MiLCJ1cmxSZXNvbHZlciIsImxhc3RJbmRleE9mIiwicGFydHMiLCJwYXJ0Iiwib2JqVG9BdHRyc1N0ciIsImNoZWNrSWZyYW1lU2l6ZSIsIm9uUmVzaXplIiwiczAiLCJzMSIsImZpcmVMaW5rc09uTG9hZEV2ZW50IiwibGlua0xvYWRlZCIsImpMaW5rIiwiakxpbmtzIiwiaXNJT1MiLCJNU1N0cmVhbSIsInN0b3AiLCJ0ZXh0Q3NzIiwicjEiLCJsaW5rQ29udHJvbHMiLCJ3aWRnZXRDb250cm9scyIsImlucHV0Q29udHJvbHMiLCJmb3JtQ29udHJvbHMiLCJ0ZXh0Q29udHJvbHMiLCJzdGF0ZVNldHRlcnMiLCJzZXR0ZXIiLCJzZXRMaW5rQ29udHJvbFN0YXRlIiwic2V0V2lkZ2V0Q29udHJvbFN0YXRlIiwic2V0SW5wdXRDb250cm9sU3RhdGUiLCJzZXRUZXh0Q29udHJvbFN0YXRlIiwic2V0Q29udHJvbFN0YXRlIiwic3RhdGVIYW5kbGVycyIsInN0IiwibGlua1N0YXRlSGFuZGxlcnMiLCJ3aWRnZXRTdGF0ZUhhbmRsZXJzIiwiaW5wdXRTdGF0ZUhhbmRsZXJzIiwidGV4dFN0YXRlSGFuZGxlcnMiLCJ0ZXh0IiwidXNlSGVscGVycyIsInJlbmRlckNhbGxiYWNrcyIsImNsb2NrIiwiQ2xvY2siLCJSYXljYXN0ZXIiLCJTY2VuZSIsImNzc1NjZW5lIiwicmVuZGVyZXIiLCJXZWJHTFJlbmRlcmVyIiwiYWxwaGEiLCJhbnRpYWxpYXMiLCJzZXRQaXhlbFJhdGlvIiwiY3NzUmVuZGVyZXIiLCJjb250cm9scyIsInRtcFZlY3RvciIsIlRleHR1cmVMb2FkZXIiLCJBbWJpZW50TGlnaHQiLCJsaWdodCIsIkRpcmVjdGlvbmFsTGlnaHQiLCJBeGlzSGVscGVyIiwib25XaW5kb3dSZXNpemUiLCJhbmltYXRlIiwiZmlsdGVyRGF0YSIsInR5cGVzIiwiY29udGFpbnMiLCJpbnRlbnNpdHkiLCJ1cGRhdGVDYW1lcmEiLCJhc3BlY3QiLCJ1cGRhdGVSZW5kZXJlciIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImRlbHRhVGltZSIsImdldERlbHRhIiwicHJvY2Vzc0dlb21ldHJ5IiwiYnVmR2VvbWV0cnkiLCJmcm9tQnVmZmVyR2VvbWV0cnkiLCJtZXJnZVZlcnRpY2VzIiwiaW5kZXhlZEJ1ZmZlckdlb20iLCJjcmVhdGVJbmRleGVkQnVmZmVyR2VvbWV0cnlGcm9tR2VvbWV0cnkiLCJtYXBJbmRpY2VzIiwibnVtVmVydGljZXMiLCJudW1GYWNlcyIsImJ1ZmZlckdlb20iLCJCdWZmZXJHZW9tZXRyeSIsIkZsb2F0MzJBcnJheSIsImluZGljZXMiLCJVaW50MzJBcnJheSIsIlVpbnQxNkFycmF
133455IiwiaTMiLCJzZXRJbmRleCIsIkJ1ZmZlckF0dHJpYnV0ZSIsImFkZEF0dHJpYnV0ZSIsImlzRXF1YWwiLCJ4MSIsInoxIiwieDIiLCJ6MiIsImF0dHJpYnV0ZXMiLCJpZHhWZXJ0aWNlcyIsIm51bUlkeFZlcnRpY2VzIiwibWFwcGVkVmVydGljZXMiLCJtYXBwZWRJbmRpY2VzIiwibWFwcGVkQXNzb2NpYXRpb24iLCJhc3NvY2lhdGlvbiIsImozIiwib25lTm9kZVBvc2l0aW9uQ2FsbGJhY2siLCJtdWx0eU5vZGVQb3NpdGlvbkNhbGxiYWNrIiwidm9sdW1lUG9zaXRpb25zIiwidm9sdW1lTm9ybWFscyIsImFzc29jVmVydGV4IiwiaW5kZXhWZXJ0ZXgiLCJtdWx0eU5vZGVQb3NpdGlvblBvc3RDYWxsYmFjayIsInBhdGhQb3NpdGlvbkNhbGxiYWNrIiwicG9zaXRpb25zIiwicGF0aFBvc2l0aW9uUG9zdENhbGxiYWNrIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaEVBLElBQU1BLEtBQUtDLEtBQUEsR0FBb0JDLE9BQU9DLE1BQTNCLEdBQW1DQyxRQUFRLFFBQVIsQ0FBOUM7QUFBQSxJQUNNQyxlQUFlSixLQUFBLEdBQXlCQyxPQUFPSSxXQUFoQyxHQUE2Q0YsUUFBUSxhQUFSLENBRGxFO0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FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHNDQUFzQztBQUMzRTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7OztBQy9ORDtBQUNBLGVBQWUsS0FBc0QsaUZBQWlGLGtCQUFrQixpQkFBaUIsY0FBYyxxQkFBcUIsU0FBUyxjQUFjLFlBQVksb0JBQW9CLHFEQUFxRCxJQUFJLHdDQUF3QyxnQ0FBZ0MsTUFBTSxPQUFPLGVBQWUsWUFBWSxlQUFlLHVDQUF1QztBQUNsZix5QkFBeUIsS0FBSyxtSEFBbUgsc0ZBQXNGLEtBQUssT0FBTywwREFBMEQsNEJBQTRCLGdCQUFnQixJQUFJLGdDQUFnQyxrQkFBa0IsbURBQW1ELHlCQUF5QjtBQUMzZCxtQ0FBbUMsU0FBUyxtQkFBbUIsYUFBYSwwQkFBMEIsd0JBQXdCLHdKQUF3SixVQUFVLFdBQVcsNEJBQTRCLGFBQWEseUJBQXlCLG1EQUFtRCxxQkFBcUIsY0FBYyxvQkFBb0IsY0FBYztBQUNyZSxvQkFBb0IsY0FBYyxpQkFBaUIsb0JBQW9CLE9BQU8sMkJBQTJCLGdCQUFnQixnQkFBZ0IsY0FBYyxnQkFBZ0Isb0JBQW9CLGNBQWMsa0RBQWtELHFDQUFxQyx3QkFBd0IsY0FBYyxpQkFBaUIsc0NBQXNDLFNBQVMiLCJmaWxlIjoianMvZGlzdC8zZGZsaXBib29rLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbW
13345UsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA3Mik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYjJiNmFmNDM0NTMzODlmMmE2YjgiLCJjb25zdCBfJCA9IEdMT0JBTF9MSUJTLmpRdWVyeT8gd2luZG93LmpRdWVyeTogcmVxdWlyZSgnanF1ZXJ5JyksXHJcbiAgICAgIF9odG1sMmNhbnZhcyA9IEdMT0JBTF9MSUJTLmh0bWwyY2FudmFzPyB3aW5kb3cuaHRtbDJjYW52YXM6IHJlcXVpcmUoJ2h0bWwyY2FudmFzJyksXHJcbiAgICAgIF9USFJFRSA9IEdMT0JBTF9MSUJTLlRIUkVFPyB3aW5kb3cuVEhSRUU6IHJlcXVpcmUoJ3RocmVlJyksXHJcbiAgICAgIF9SZWFjdCA9IEdMT0JBTF9MSUJTLlJlYWN0PyB3aW5kb3cuUmVhY3Q6IHJlcXVpcmUoJ3JlYWN0JyksXHJcbiAgICAgIF9SZWFjdERPTSA9IEdMT0JBTF9MSUJTLlJlYWN0PyB3aW5kb3cuUmVhY3RET006IHJlcXVpcmUoJ3JlYWN0LWRvbScpLFxyXG4gICAgICBfUERGSlMgPSBHTE9CQUxfTElCUy5QREZKUz8gd2luZG93LlBERkpTOiByZXF1aXJlKCdwZGZqcycpLFxyXG4gICAgICBfdHIgPSAocyk9PiAod2luZG93LmliZXJlemFuc2t5IHx8IHt9KS50ciAmJiB3aW5kb3cuaWJlcmV6YW5za3kudHIocykgfHwgcztcclxuXHJcbmV4cG9ydCB7XHJcbiAgXyQgYXMgJCxcclxuICBfaHRtbDJjYW52YXMgYXMgaHRtbDJjYW52YXMsXHJcbiAgX1RIUkVFIGFzIFRIUkVFLFxyXG4gIF9SZWFjdCBhcyBSZWFjdCxcclxuICBfUmVhY3RET00gYXMgUmVhY3RET00sXHJcbiAgX1BERkpTIGFzIFBERkpTLFxyXG4gIF90ciBhcyB0clxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vbGlicy5qcyIsImNvbnN0IF8kID0gR0xPQkFMX0xJQlMualF1ZXJ5PyB3aW5kb3cualF1ZXJ5OiByZXF1aXJlKCdqcXVlcnknKSxcclxuICAgICAgX2h0bWwyY2FudmFzID0gR0xPQkFMX0xJQlMuaHRtbDJjYW52YXM/IHdpbmRvdy5odG1sMmNhbnZhczogcmVxdWlyZSgnaHRtbDJjYW52YXMnKSxcclxuICAgICAgX1RIUkVFID0gR0xPQkFMX0xJQlMuVEhSRUU/IHdpbmRvdy5USFJFRTogcmVxdWlyZSgndGhyZWUnKSxcclxuICAgICAgX1BERkpTID0gR0xPQkFMX0xJQlMuUERGSlM/IHdpbmRvdy5QREZKUzogcmVxdWlyZSgncGRmanMnKSxcclxuICAgICAgX3RyID0gKHMpPT4gKHdpbmRvdy5pYmVyZXphbnNreSB8fCB7fSkudHIgJiYgd2luZG93LmliZXJlemFuc2t5LnRyKHMpIHx8IHM7XHJcblxyXG5pZih3aW5kb3cuRkIzRF9MT0NBTEUpIHtcclxuICB3aW5kb3cuaWJlcmV6YW5za3kgPSB7XHJcbiAgICAuLi53aW5kb3cuaWJlcmV6YW5za3ksXHJcbiAgICB0cjogKHMpPT4gKEZCM0RfTE9DQUxFLmRpY3Rpb25hcnkgfHwge30pW3NdIHx8IHNcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIF8kIGFzICQsXHJcbiAgX2h0bWwyY2FudmFzIGFzIGh0bWwyY2FudmFzLFxyXG4gIF9USFJFRSBhcyBUSFJFRSxcclxuICBfUERGSlMgYXMgUERGSlMsXHJcbiAgX3RyIGFzIHRyXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2xpYnMuanMiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlTWF0aFV0aWxzIHtcclxuICBzdGF0aWMgc3VtID0gW0Jhc2VNYXRoVXRpbHMuc3VtMSwgQmFzZU1hdGhVdGlscy5zdW0yLCBCYXNlTWF0aFV0aWxzLnN1bTMsIEJhc2VNYXRoVXRpbHMuc3VtNF07XHJcbiAgc3RhdGljIGVwcyA9IDFlLTQ7XHJcblxyXG4gIHN0YXRpYyBzdW0xKGthLGEsa2IsYikge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAga2EqYVswXStrYipiWzBdXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHN1bTIoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF0sXHJcbiAgICAgIGthKmFbMV0ra2IqYlsxXVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzdW0zKGthLGEsa2IsYikge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAga2EqYVswXStrYipiWzBdLFxyXG4gICAgICBrYSphWzFdK2tiKmJbMV0sXHJcbiAgICAgIGthKmFbMl0ra2IqYlsyXVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzdW00KGthLGEsa2IsYikge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAga2EqYVswXStrYipiWzBdLFxyXG4gICAgICBrYSphWzFdK2tiKmJbMV0sXHJcbiAgICAgIGthKmFbMl0ra2IqYlsyXSxcclxuICAgICAga2EqYVszXStrYipiWzNdXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJrNChkeSwgdCwgZHQsIHksIHN1bT1CYXNlTWF0aFV0aWxzLnN1bVt5Lmxlbmd0aC0xXSkge1xyXG4gICAgY29uc3QgazE9ZHkodCx5KSxcclxuICAgICAgICAgIGsyPWR5KHQrZHQvMixzdW0oMSx5LGR0LzIsazEpKSxcclxuICAgICAgICAgIGszPWR5KHQrZHQvMixzdW0oMSx5LGR0LzIsazIpKSxcclxuICAgICAgICAgIGs0PWR5KHQrZHQsc3VtKDEseSxkdCxrMykpO1xyXG4gICAgcmV0dXJuIHN1bSgxLHksZHQvNixzdW0oMSxzdW0oMSxrMSwyLGsyKSwxLHN1bSgyLGszLDEsazQpKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXh0cmFwb2xhdGVMaW5lYXIoeCx5LHhpKSB7XHJcbiAgICByZXR1cm4geVswXSsoeVsxXS15WzBdKS8oeFsxXS14WzBdKSooeGkteFswXSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaW50ZXJwb2xhdGVMaW5lYXIoeCx5LHhpKSB7XHJcbiAgICBsZXQgeWk7XHJcbiAgICBpZih4WzBdPnhbMV0pIHtcclxuICAgICAgeD14LnJldmVyc2UoKTtcclxuICAgICAgeT15LnJldmVyc2UoKTtcclxuICAgIH1cclxuICAgIGlmKHhpPHhbMF0pIHtcclxuICAgICAgeWk9eVswXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoeGk+eFsxXSkge1xyXG4gICAgICB5aT15WzFdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHlpPUJhc2VNYXRoVXRpbHMuZXh0cmFwb2xhdGVMaW5lYXIoeCx5LHhpKTtcclxuICAgIH1cclxuICAgIHJldHVybi
13345B5aTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjYWxjU2NhbGUoc3JjVywgc3JjSCwgZHN0VywgZHN0SCkge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKGRzdFcvc3JjVywgZHN0SC9zcmNIKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtdWxNKGEsIGIpIHtcclxuICAgIGNvbnN0IHI9W107XHJcbiAgICBmb3IobGV0IGk9MDtpPGEubGVuZ3RoOysraSkge1xyXG4gICAgICByLnB1c2goW10pO1xyXG4gICAgICBmb3IobGV0IGo9MDtqPGJbMF0ubGVuZ3RoOysraikge1xyXG4gICAgICAgIHJbaV1bal0gPSAwO1xyXG4gICAgICAgIGZvcihsZXQgaz0wO2s8Yi5sZW5ndGg7KytrKSB7XHJcbiAgICAgICAgICByW2ldW2pdKz1hW2ldW2tdKmJba11bal07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB0cmFuc00obSkge1xyXG4gICAgY29uc3Qgcj1bXTtcclxuICAgIGZvcihsZXQgaT0wO2k8bS5sZW5ndGg7KytpKSB7XHJcbiAgICAgIGZvcihsZXQgaj0wO2o8bVswXS5sZW5ndGg7KytqKSB7XHJcbiAgICAgICAgaWYoIXJbal0pIHtcclxuICAgICAgICAgIHJbal09W107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJbal1baV09bVtpXVtqXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbWF0KGRhdGEpIHtcclxuICAgIGxldCBzPTA7XHJcbiAgICBmb3IobGV0IHggb2YgZGF0YSkge1xyXG4gICAgICBzKz14O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHMvZGF0YS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGlzcChkYXRhKSB7XHJcbiAgICBjb25zdCBNPUJhc2VNYXRoVXRpbHMubWF0KGRhdGEpO1xyXG4gICAgbGV0IHM9MDtcclxuICAgIGZvcihsZXQgeCBvZiBkYXRhKSB7XHJcbiAgICAgIHMrPSh4LU0pKih4LU0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHMvZGF0YS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcHJlZGljdChkYXRhLCBudW0pIHtcclxuICAgIGNvbnN0IHI9W10sIGw9ZGF0YS5sZW5ndGgsIEQ9QmFzZU1hdGhVdGlscy5kaXNwKGRhdGEpO1xyXG4gICAgaWYoRDxsICYmIGw+MSkge1xyXG4gICAgICBjb25zdCBhbT1bXSwgYm09W107XHJcbiAgICAgIGZvcihsZXQgaT0wO2k8bDsrK2kpIHtcclxuICAgICAgICBhbS5wdXNoKFtpLDFdKTtcclxuICAgICAgICBibS5wdXNoKFtkYXRhW2ldXSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdGE9QmFzZU1hdGhVdGlscy50cmFuc00oYW0pLCBhPUJhc2VNYXRoVXRpbHMubXVsTSh0YSxhbSksIGI9QmFzZU1hdGhVdGlscy5tdWxNKHRhLGJtKSxcclxuICAgICAgZD0oYVswXVswXSphWzFdWzFdLWFbMV1bMF0qYVswXVsxXSksXHJcbiAgICAgIHA9W1xyXG4gICAgICAgIC0oYVswXVsxXSpiWzFdWzBdLWJbMF1bMF0qYVsxXVsxXSkvZCxcclxuICAgICAgICAoYVswXVswXSpiWzFdWzBdLWFbMV1bMF0qYlswXVswXSkvZFxyXG4gICAgICBdO1xyXG4gICAgICBmb3IobGV0IGk9MDtpPG51bTsrK2kpIHtcclxuICAgICAgICBjb25zdCB2ID0gTWF0aC5yb3VuZChwWzBdKihpK2wpK3BbMV0pO1xyXG4gICAgICAgIGlmKHIuaW5kZXhPZih2KT09PS0xKSB7XHJcbiAgICAgICAgICByLnB1c2godik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRVbmlxdWUoKSB7XHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKDFlOSpNYXRoLnJhbmRvbSgpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRTcGxpbmVQb2ludHMoc3BsaW5lLCBwcykge1xyXG4gICAgaWYoc3BsaW5lLnBvaW50cy5sZW5ndGghPT1wcy54Lmxlbmd0aCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3NldFNwbGluZVBvaW50czogYmFkIHBvaW50cycpO1xyXG4gICAgfVxyXG4gICAgZm9yKGxldCBpPTA7IGk8c3BsaW5lLnBvaW50cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBzcGxpbmUucG9pbnRzW2ldLnNldChwcy54W2ldLCBwcy55W2ldLCBwcy56PyBwcy56W2ldOiAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBtYXBsMkwobHMsIGxlbiwgbiwgZikge1xyXG4gICAgY29uc3QgZEwgPSBsZW4vKG4tMSk7XHJcbiAgICBsZXQgTD0wO1xyXG4gICAgZm9yKGxldCBpPTAsIGQ9bHNbMF07IGk8bHMubGVuZ3RoLTEgJiYgTDxsZW4rMC4xKmRMOyArK2ksIGQrPWxzW2ldKSB7XHJcbiAgICAgIGlmKE1hdGguYWJzKEwtZCk8TWF0aC5hYnMoTC1kLWxzW2krMV0pKSB7XHJcbiAgICAgICAgZihpLCBMKTtcclxuICAgICAgICBMKz1kTDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoTDxsZW4rMC4xKmRMKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignbWFwbDJMOiBscyBpcyBub3QgZW5vdWdodCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRldDIoYSxiLGMsZCkge1xyXG4gICAgcmV0dXJuIGEqZC1iKmM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc29sdmUyTGluKGExLGIxLGEyLGIyKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgY29uc3QgZD1CYXNlTWF0aFV0aWxzLmRldDIoYTFbMF0sYTFbMV0sYTJbMF0sYTJbMV0pO1xyXG4gICAgaWYoTWF0aC5hYnMoZCk+QmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgY29uc3QgZHg9QmFzZU1hdGhVdGlscy5kZXQyKGIxLGExWzFdLGIyLGEyWzFdKSwgZHk9QmFzZU1hdGhVdGlscy5kZXQyKGExWzBdLGIxLGEyWzBdLGIyKTtcclxuICAgICAgcmVzID0ge1xyXG4gICAgICAgIHg6IGR4L2QsXHJcbiAgICAgICAgeTogZHkvZFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0luc2lkZVBvbHkocHMsIHApIHtcclxuICAgIGxldCBkb25lID0gZmFsc2UsIGN0O1xyXG4gICAgZm9yKGxldCBpPTA7IGk8cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgaWYoQmFzZU1hdGhVdGlscy52MmRpc3QocCwgcHNbaV0pPEJhc2VNYXRoVXRpbHMuZXBzKSB7XHJcbiAgICAgICAgY3Q9MTtcclxuICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2hpbGUoIWRvbmUpIHtcclxuICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgIGN0ID0gMDtcclxuICAgICAgbGV0IG5wID0ge3g6IHAueCtNYXRoLnJhbmRvbSgpLTAuNSwgeTogcC55K01hdGgucmFuZG9tKCktMC41fSwgcm4gPSB7eDogbnAueC1wLngsIHk6IG5wLnktcC55fSwgYTE9W3JuLnksIC1ybi54XSwgYjE9cC54KnJuLnktcC55KnJuLng7XHJcbiAgICAgIGZvcihsZXQgaT0wOyBpPHBzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgY29uc3QgcDA9cHNbaV0sIHAxPXBzWyhpKzEpJXBzLmxlbmd0aF0sIG4gPSB7eDogcDEueC1wMC54LCB5Oi
13345BwMS55LXAwLnl9LCBhMj1bbi55LCAtbi54XSwgYjI9cDAueCpuLnktcDAueSpuLngsXHJcbiAgICAgICAgICBpcCA9IEJhc2VNYXRoVXRpbHMuc29sdmUyTGluKGExLGIxLGEyLGIyKTtcclxuICAgICAgICBpZihpcCkge1xyXG4gICAgICAgICAgaWYoQmFzZU1hdGhVdGlscy52MmRpc3QoaXAsIHAwKTxCYXNlTWF0aFV0aWxzLmVwcyB8fCBCYXNlTWF0aFV0aWxzLnYyZGlzdChpcCwgcDEpPEJhc2VNYXRoVXRpbHMuZXBzKSB7XHJcbiAgICAgICAgICAgIGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmKGlwLng+TWF0aC5taW4ocDAueCxwMS54KS1CYXNlTWF0aFV0aWxzLmVwcyYmaXAueDxNYXRoLm1heChwMC54LHAxLngpK0Jhc2VNYXRoVXRpbHMuZXBzICYmXHJcbiAgICAgICAgICAgICAgICAgIGlwLnk+TWF0aC5taW4ocDAueSxwMS55KS1CYXNlTWF0aFV0aWxzLmVwcyYmaXAueTxNYXRoLm1heChwMC55LHAxLnkpK0Jhc2VNYXRoVXRpbHMuZXBzKSB7XHJcbiAgICAgICAgICAgIGlmKEJhc2VNYXRoVXRpbHMudjJkaXN0KGlwLCBwKTxCYXNlTWF0aFV0aWxzLmVwcykge1xyXG4gICAgICAgICAgICAgIGN0PTE7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG49e3g6IGlwLngtcC54LCB5OiBpcC55LXAueX07XHJcbiAgICAgICAgICAgICAgY3QgKz0gdG4ueCpybi54K3RuLnkqcm4ueT4wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3QlMjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0luc2lkZUNvbnZQb2x5KHBzLCBwKSB7XHJcbiAgICBsZXQgc2cgPSBbMCwgMF07XHJcbiAgICBmb3IobGV0IGk9MDsgaTxwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBwMD1wc1tpXSwgcDE9cHNbKGkrMSklcHMubGVuZ3RoXSwgYT17eDogcDAueC1wLngsIHk6IHAwLnktcC55fSwgYj17eDogcDEueC1wLngsIHk6IHAxLnktcC55fTtcclxuICAgICAgKytzZ1soYS54KmIueS1hLnkqYi54PDApKzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIH5zZy5pbmRleE9mKHBzLmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdjJsZW4odjIpIHtcclxuICAgIHJldHVybiBNYXRoLnNxcnQodjIueCp2Mi54K3YyLnkqdjIueSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdjJkaXN0KHYyMSwgdjIyKSB7XHJcbiAgICByZXR1cm4gQmFzZU1hdGhVdGlscy52Mmxlbih7XHJcbiAgICAgIHg6IHYyMi54LXYyMS54LFxyXG4gICAgICB5OiB2MjIueS12MjEueVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29tcHV0ZVNxdWFyZShwcykge1xyXG4gICAgY29uc3QgYSA9IFtdO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgYS5wdXNoKEJhc2VNYXRoVXRpbHMudjJkaXN0KHBzW2ldLCBwc1soaSsxKSVwcy5sZW5ndGhdKSk7XHJcbiAgICAgIHAgKz0gMC41KmFbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHAqKHAtYVswXSkqKHAtYVsxXSkqKHAtYVsyXSkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvbXB1dGVJbnRlcnBDb2Vmcyh0cmksIHApIHtcclxuICAgIGNvbnN0IHMgPSBCYXNlTWF0aFV0aWxzLmNvbXB1dGVTcXVhcmUodHJpKSwgY29lZnM9W10sIGwgPSB0cmkubGVuZ3RoO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8bDsgKytpKSB7XHJcbiAgICAgIGNvZWZzW2ldID0gQmFzZU1hdGhVdGlscy5jb21wdXRlU3F1YXJlKFtwLCB0cmlbKGkrMSklbF0sIHRyaVsoaSsyKSVsXV0pL3M7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29lZnM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9CYXNlTWF0aFV0aWxzLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRoVXRpbHMgZXh0ZW5kcyBCYXNlTWF0aFV0aWxzIHtcclxuICBzdGF0aWMgdjEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBzdGF0aWMgc3BsaXRTcGxpbmUoc3BsaW5lLCBOKSB7XHJcbiAgICBjb25zdCBvID0ge2xlbjogMCwgbHM6IFswXX0sIGRsPTEvTjtcclxuICAgIGZvcihsZXQgaT0wOyBpPD1OOyArK2kpIHtcclxuICAgICAgY29uc3QgcCA9IHNwbGluZS5nZXRQb2ludChpKmRsKTtcclxuICAgICAgaWYoaSkge1xyXG4gICAgICAgIGNvbnN0IGQgPSBNYXRoVXRpbHMudjEuZGlzdGFuY2VUbyhwKTtcclxuICAgICAgICBvLmxlbiArPSBkO1xyXG4gICAgICAgIG8ubHMucHVzaChkKTtcclxuICAgICAgfVxyXG4gICAgICBNYXRoVXRpbHMudjEuY29weShwKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldExpbmVhckluZGVjZXMoc3BsaW5lLCBuKSB7XHJcbiAgICBjb25zdCBkZWwgPSA1MDAwLCBkRGVsID0gMS9kZWw7XHJcbiAgICBjb25zdCBscz1bMF07XHJcbiAgICBsZXQgbCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTw9ZGVsOyArK2kpIHtcclxuICAgICAgY29uc3QgcCA9IHNwbGluZS5nZXRQb2ludChpKmREZWwpO1xyXG4gICAgICBpZihpKSB7XHJcbiAgICAgICAgY29uc3QgZD1NYXRoVXRpbHMudjEuZGlzdGFuY2VUbyhwKTtcclxuICAgICAgICBsICs9IGQ7XHJcbiAgICAgICAgbHMucHVzaChkKTtcclxuICAgICAgfVxyXG4gICAgICBNYXRoVXRpbHMudjEuY29weShwKTtcclxuICAgIH1cclxuICAgIGxzLnB1c2goMWU3KTtcclxuXHJcbiAgICBjb25zdCByZXMgPSBbXSwgZGwgPSBsLyhuLTEpO1xyXG4gICAgZm9yKGxldCBpPTAsIEw9MCwgZD1sc1swXTsgaTxscy5sZW5ndGgtMTsgKytpLCBkKz1sc1tpXSkge1xyXG4gICAgICBpZihNYXRoLmFicyhMLWQpPE1hdGguYWJzKEwtZC1sc1tpKzFdKSkge1xyXG4gICAgICAgI
13345HJlcy5wdXNoKGkqZERlbCk7XHJcbiAgICAgICAgTCs9ZGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZmluZVBvbHkocG9seSwgbWF4RGwpIHtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8cG9seS5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBwMCA9IHBvbHlbaV0sIHAxID0gcG9seVsoaSsxKSVwb2x5Lmxlbmd0aF0sIGwgPSBCYXNlTWF0aFV0aWxzLnYyZGlzdChwMCwgcDEpLCBuID0gTWF0aC5jZWlsKGwvbWF4RGwpLCBkbCA9IGwvbjtcclxuICAgICAgcmVzLnB1c2gocDApO1xyXG4gICAgICBmb3IobGV0IGo9MTsgajxuOyArK2opIHtcclxuICAgICAgICByZXMucHVzaChuZXcgVEhSRUUuVmVjdG9yMihcclxuICAgICAgICAgIHAwLngraipkbCoocDEueC1wMC54KS9sLFxyXG4gICAgICAgICAgcDAueStqKmRsKihwMS55LXAwLnkpL2xcclxuICAgICAgICApKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL01hdGhVdGlscy5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcclxuXHJcbiAgc3RhdGljIG5vcm1hbGl6ZVVybCh1cmwpIHtcclxuICAgIGZ1bmN0aW9uIHNwbGl0KHMpIHtcclxuICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFxcXC9nLCAnLycpLnNwbGl0KCcvJyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiYXNlID0gc3BsaXQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgdXJsID0gc3BsaXQodXJsKTtcclxuICAgIGlmKGJhc2VbMl09PT11cmxbMl0pIHtcclxuICAgICAgdXJsWzBdID0gYmFzZVswXTtcclxuICAgIH1cclxuICAgIHJldHVybiB1cmwuam9pbignLycpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGV4dGVuZHMoZGVyLCBiYXNlKSB7XHJcbiAgICBmb3IobGV0IG5hbWUgaW4gYmFzZSkge1xyXG4gICAgICBpZighZGVyLmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgZGVyW25hbWVdID0gYmFzZVtuYW1lXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlZmF1bHRDbXAoYSwgYikge1xyXG4gICAgcmV0dXJuIGEtYjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBsb3dlckJvdW5kKGEsIHgsIGNtcCkge1xyXG4gICAgY21wID0gY21wIHx8IFV0aWxzLmRlZmF1bHRDbXA7XHJcbiAgICBsZXQgbCA9IDAsIGggPSBhLmxlbmd0aC0xO1xyXG4gICAgd2hpbGUoaC1sPjEpIHtcclxuICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGwgKyBoKSAvIDIpO1xyXG4gICAgICBpZihjbXAoeCwgYVttaWRdKTwwKSB7XHJcbiAgICAgICAgaCA9IG1pZDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsID0gbWlkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY21wKHgsIGFbaF0pPj0wPyBoOiBsO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVXRpbHMuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgR3JhcGhVdGlscyBmcm9tICcuL0dyYXBoVXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VCYXNlIHtcclxuXHJcbiAgc3RhdGljIHJlbmRlckNhbnZhcyA9ICAkKCc8Y2FudmFzPicpWzBdO1xyXG4gIHN0YXRpYyByZW5kZXJDYW52YXNDdHggPSBJbWFnZUJhc2UucmVuZGVyQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy53bmQgPSBjb250ZXh0LnduZDtcclxuICAgIHRoaXMuZG9jID0gY29udGV4dC5kb2M7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSBjb250ZXh0LmVsZW1lbnQgfHwgY29udGV4dC5kb2MuYm9keTtcclxuICAgIHRoaXMuYyA9IGNvbnRleHQucmVuZGVyQ2FudmFzIHx8IEltYWdlQmFzZS5yZW5kZXJDYW52YXM7XHJcbiAgICB0aGlzLmN0eCA9IGNvbnRleHQucmVuZGVyQ2FudmFzQ3R4IHx8IEltYWdlQmFzZS5yZW5kZXJDYW52YXNDdHg7XHJcbiAgICB0aGlzLnJlc1cgPSB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgICB0aGlzLnJlc0ggPSB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcclxuICB9XHJcblxyXG4gIHNldFJlc29sdXRpb24ocmVzKSB7XHJcbiAgICB0aGlzLnJlc1cgPSByZXMud2lkdGg7XHJcbiAgICB0aGlzLnJlc0ggPSByZXMuaGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxuICByZW5kZXJCbGFua1BhZ2UoKSB7XHJcbiAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcclxuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYSh0aGlzLmNvbG9yLCAxKTtcclxuICAgIHRoaXMuY3R4LnJlY3QoMCwgMCwgdGhpcy5jLndpZHRoLCB0aGlzLmMuaGVpZ2h0KTtcclxuICAgIHRoaXMuY3R4LmZpbGwoKTtcclxuICB9XHJcblxyXG4gIHJlbmRlckltYWdlKGltYWdlKSB7XHJcbiAgICB0aGlzLnB1c2hDdHgoKTtcclxuICAgIHRoaXMuY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7XHJcbiAgICB0aGlzLnBvcEN0eCgpO1xyXG4gIH1cclxuXHJcbiAgbm9ybVRvQ29udihwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBwLngqdGhpcy5jLndpZHRoLFxyXG4gICAgICB5OiAoMS1wLnkpKnRoaXMuYy5oZWlnaHRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZW5kZXJIaXQocG9seSkge1xyXG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwwLDAuNCknO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgbGV0IHAgPSB0aGlzLm5vcm1Ub0NvbnYocG9seVswXSk7XHJcbiAgICBjdHgubW92ZVRvKHAueCwgcC55KTtcclxuICAgIGZvcihsZXQgaT0xOyBpPHBvbHkubGVuZ3RoOyArK2kpIHtcclxuICAgICAgcCA9IHRoaXMubm9ybVRvQ29udihwb2x5W2ldKTtcclxuICAgICAgY3R4LmxpbmVUbyhwLngsIHAueSk7XHJcbiAgICB9XHJcbiAgICBjdHguY2xvc2VQYXR
13345oKCk7XHJcbiAgICBjdHguZmlsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVzaEN0eCgpIHtcclxuICAgIGlmKHRoaXMucmVzVyE9dGhpcy5jLndpZHRoKSB7XHJcbiAgICAgIHRoaXMuYy53aWR0aCA9IHRoaXMucmVzVztcclxuICAgIH1cclxuICAgIGlmKHRoaXMucmVzSCE9dGhpcy5jLmhlaWdodCkge1xyXG4gICAgICB0aGlzLmMuaGVpZ2h0ID0gdGhpcy5yZXNIO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jdHguc2F2ZSgpO1xyXG4gICAgdGhpcy5jdHguc2NhbGUodGhpcy5jLndpZHRoL3RoaXMud2lkdGgsIHRoaXMuYy5oZWlnaHQvdGhpcy5oZWlnaHQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY3R4O1xyXG4gIH1cclxuXHJcbiAgcG9wQ3R4KCkge1xyXG4gICAgdGhpcy5jdHgucmVzdG9yZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm90Rm91bmRQYWdlKCkge1xyXG4gICAgdGhpcy5yZW5kZXJCbGFua1BhZ2UoKTtcclxuICB9XHJcblxyXG4gIGZpbmlzaFJlbmRlcigpIHtcclxuICAgIGlmKHRoaXMub25DaGFuZ2UpIHtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluaXNoTG9hZCgpIHtcclxuICAgIGlmKHRoaXMub25Mb2FkKSB7XHJcbiAgICAgIHRoaXMub25Mb2FkKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydFJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2ltdWxhdGVkRG9jKCkge1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0ltYWdlQmFzZS5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIC8vIHZpcnR1YWxzXHJcbiAgLy8gZ2V0T2JqZWN0KGUsIGRhdGEpO1xyXG4gIC8vIGdldENhbGxiYWNrKG9iamVjdCk7XHJcbiAgLy8gdGVzdChvYmplY3QxLCBvYmplY3QxKTtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MpIHtcclxuICAgIHRoaXMud25kID0gd25kO1xyXG4gICAgdGhpcy5kb2MgPSBkb2M7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2V0RW5hYmxlKHZsKSB7XHJcbiAgICBpZighdmwpIHtcclxuICAgICAgaWYodGhpcy5tQ2FwT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZnkodGhpcy5tQ2FwT2JqZWN0LCAkLkV2ZW50KCdtb3VzZXVwJyksICdtb3VzZXVwJyk7XHJcbiAgICAgICAgdGhpcy5tQ2FwT2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRoaXMubUhvdk9iamVjdCkge1xyXG4gICAgICAgIHRoaXMubm90aWZ5KHRoaXMubUhvdk9iamVjdCwgJC5FdmVudCgnbW91c2VvdXQnKSwgJ21vdXNlb3V0Jyk7XHJcbiAgICAgICAgdGhpcy5tSG92T2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB2bDtcclxuICB9XHJcblxyXG4gIGdldENhbGxiYWNrKG9iamVjdCkge1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG5vdGlmeShvYmplY3QsIGUsIHR5cGUpIHtcclxuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5nZXRDYWxsYmFjayhvYmplY3QpO1xyXG4gICAgaWYoY2FsbGJhY2spIHtcclxuICAgICAgY29uc3QgcHJvcHMgPSB7XHJcbiAgICAgICAgLi4uZSxcclxuICAgICAgICB0eXBlLFxyXG4gICAgICAgIHZpZXc6IHRoaXMud25kXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGpFID0gJC5FdmVudCh0eXBlLCBwcm9wcyk7XHJcbiAgICAgIGNhbGxiYWNrKGpFLCBvYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udmVydChlLCBkYXRhKSB7XHJcbiAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYodGhpcy5maWx0ZXIpIHtcclxuICAgICAgZSA9IHRoaXMuZmlsdGVyKHRoaXMuZWxlbWVudCwgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5nZXRPYmplY3QoZSwgZGF0YSksXHJcbiAgICAgIG5vdGlmeSA9IH5lLnR5cGUuaW5kZXhPZigndG91Y2gnKT8gdGhpcy5jb252ZXJ0VG91Y2goZSwgZGF0YSwgb2JqZWN0KTogdGhpcy5jb252ZXJ0TW91c2UoZSwgZGF0YSwgb2JqZWN0KTtcclxuICAgIGlmKG5vdGlmeSAmJiBvYmplY3QpIHtcclxuICAgICAgdGhpcy5ub3RpZnkob2JqZWN0LCBlLCBlLnR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udmVydFRvdWNoKGUsIGRhdGEsIG9iamVjdCkge1xyXG4gICAgbGV0IG5vdGlmeSA9IHRydWU7XHJcbiAgICBzd2l0Y2goZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3RvdWNoc3RhcnQnOiB7XHJcbiAgICAgICAgaWYodGhpcy50Q2FwT2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLnRDYXBPYmplY3QsIGUsICd0b3VjaGVuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRDYXBPYmplY3QgPSBvYmplY3Q7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAndG91Y2hlbmQnOiB7XHJcbiAgICAgICAgaWYodGhpcy50Q2FwT2JqZWN0ICYmICF0aGlzLnRlc3QodGhpcy50Q2FwT2JqZWN0LCBvYmplY3QpKSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLnRDYXBPYmplY3QsIGUsICd0b3VjaGVuZCcpO1xyXG4gICAgICAgICAgbm90aWZ5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYob2JqZWN0ICYmIHRoaXMudGVzdCh0aGlzLnRDYXBPYmplY3QsIG9iamVjdCkpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KG9iamVjdCwgZSwgJ3RvdWNodGFwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudENhcE9iamVjdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICd0b3VjaHRhcCc6IHtcclxuICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vdGlmeTtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRNb3VzZShlLCBkYXRhLCBvYmplY3QpIHtcclxuICAgIGxldCBub3RpZnkgPSB0cnVlO1xyXG4gICAgc3dpdGNoKGUudHlwZSkge1xyXG4gICAgICBjYXNlICdtb3VzZWRvd24nOiB7XHJcbiAgICAgICAgaWYodGhpcy5tQ2FwT2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1DYXBPYmplY3QsIGUsICdtb3VzZXVwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgI
13345HRoaXMubUNhcE9iamVjdCA9IG9iamVjdDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZXVwJzoge1xyXG4gICAgICAgIGlmKHRoaXMubUNhcE9iamVjdCAmJiAhdGhpcy50ZXN0KHRoaXMubUNhcE9iamVjdCwgb2JqZWN0KSkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnkodGhpcy5tQ2FwT2JqZWN0LCBlLCAnbW91c2V1cCcpO1xyXG4gICAgICAgICAgbm90aWZ5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2NsaWNrJzoge1xyXG4gICAgICAgIG5vdGlmeSA9IHRoaXMudGVzdCh0aGlzLm1DYXBPYmplY3QsIG9iamVjdCk7XHJcbiAgICAgICAgdGhpcy5tQ2FwT2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNlZW50ZXInOlxyXG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxyXG4gICAgICBjYXNlICdtb3VzZW1vdmUnOiB7XHJcbiAgICAgICAgaWYoIXRoaXMudGVzdCh0aGlzLm1Ib3ZPYmplY3QsIG9iamVjdCkgJiYgdGhpcy5tSG92T2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1Ib3ZPYmplY3QsIGUsICdtb3VzZW91dCcpO1xyXG4gICAgICAgICAgdGhpcy5tSG92T2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5tSG92T2JqZWN0ICYmIG9iamVjdCkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnkob2JqZWN0LCBlLCAnbW91c2VvdmVyJyk7XHJcbiAgICAgICAgICB0aGlzLm1Ib3ZPYmplY3QgPSBvYmplY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vdGlmeSA9IGUudHlwZSA9PT0gJ21vdXNlbW92ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2VsZWF2ZSc6XHJcbiAgICAgIGNhc2UgJ21vdXNlb3V0Jzoge1xyXG4gICAgICAgIGlmKHRoaXMubUhvdk9iamVjdCkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnkodGhpcy5tSG92T2JqZWN0LCBlLCAnbW91c2VvdXQnKTtcclxuICAgICAgICAgIHRoaXMubUhvdk9iamVjdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm90aWZ5ID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBub3RpZnk7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9FdmVudENvbnZlcnRlci5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXBoVXRpbHMge1xyXG5cclxuICBzdGF0aWMgZXh0cmFwb2xhdGVMaW5lYXIoeCx5LHhpKSB7XHJcbiAgICByZXR1cm4geVswXSsoeVsxXS15WzBdKS8oeFsxXS14WzBdKSooeGkteFswXSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaW50ZXJwb2xhdGUwMSh5MSx5Mix0KSB7XHJcbiAgICByZXR1cm4gR3JhcGhVdGlscy5leHRyYXBvbGF0ZUxpbmVhcihbMCwxXSxbeTEseTJdLHQpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldENvbG9yQnl0ZXMoY29sb3IpIHtcclxuICAgIHJldHVybiBbKGNvbG9yPj4xNikmMHhGRiwgKGNvbG9yPj44KSYweEZGLCBjb2xvciYweEZGXTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpbnZlcnNlQ29sb3IoY29sb3IsIHQ9MSkge1xyXG4gICAgY29uc3QgYnM9R3JhcGhVdGlscy5nZXRDb2xvckJ5dGVzKGNvbG9yKSxcclxuICAgICAgICAgIGlicz1bMHhGRi1ic1swXSwweEZGLWJzWzFdLDB4RkYtYnNbMl1dLFxyXG4gICAgICAgICAgbmJzPVtNYXRoLnJvdW5kKEdyYXBoVXRpbHMuaW50ZXJwb2xhdGUwMShic1swXSxpYnNbMF0sdCkpLE1hdGgucm91bmQoR3JhcGhVdGlscy5pbnRlcnBvbGF0ZTAxKGJzWzFdLGlic1sxXSx0KSksTWF0aC5yb3VuZChHcmFwaFV0aWxzLmludGVycG9sYXRlMDEoYnNbMl0saWJzWzJdLHQpKV07XHJcbiAgICByZXR1cm4gR3JhcGhVdGlscy5ieXRlczJDb2xvcihuYnMpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvbG9yMlJnYmEoY29sb3IsIGEpIHtcclxuICAgIHJldHVybiBHcmFwaFV0aWxzLmJ5dGVzMlJnYmEoR3JhcGhVdGlscy5nZXRDb2xvckJ5dGVzKGNvbG9yKSwgYSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYnl0ZXMyUmdiYShicywgYSkge1xyXG4gICAgcmV0dXJuICdyZ2JhKCcrYnMuam9pbignLCcpKycsJythKycpJztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBieXRlczJDb2xvcihicykge1xyXG4gICAgcmV0dXJuIGJzWzJdfChic1sxXTw8OCl8KGJzWzBdPDwxNilcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvR3JhcGhVdGlscy5qcyIsImltcG9ydCBDYWNoZSBmcm9tICcuL0NhY2hlJztcclxuaW1wb3J0IEJsYW5rSW1hZ2UgZnJvbSAnLi9CbGFua0ltYWdlJztcclxuaW1wb3J0IFN0YXRpY0ltYWdlIGZyb20gJy4vU3RhdGljSW1hZ2UnO1xyXG5pbXBvcnQgUGRmSW1hZ2UgZnJvbSAnLi9QZGZJbWFnZSc7XHJcbmltcG9ydCBJbnRlcmFjdGl2ZUltYWdlIGZyb20gJy4vSW50ZXJhY3RpdmVJbWFnZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUZhY3Rvcnkge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBjYWNoZSkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuY2FjaGUgPSBjYWNoZSB8fCBuZXcgQ2FjaGUoKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkKGluZm8sIG49MCwgd2lkdGhUZXhlbHM9MjEwLCBoZWlnaHRUZXhlbHM9Mjk3LCBjb2xvcj0weEZGRkZGRiwgaW5qZWN0b3I9dW5kZWZpbmVkKSB7XHJcbiAgICBsZXQgaW1hZ2U7XHJcbiAgICBzd2l0Y2goaW5mby50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2h0bWwnOiB7XHJcbiAgICAgICAgaW1hZ2UgPSBuZXcgSW50ZXJhY3RpdmVJbWFnZSh0aGlzLmNvbnRleHQsIHdpZHRoVGV4ZWxzLCBoZWlnaHRUZXhlbHMsIGNvbG9yLCBpbmZvLnNyYywgdGhpcy5jYWNoZSwgaW5qZWN0b3IpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2ltYWdlJzoge1xyXG4gICAgICAgIGltYWdlID0gbmV3IFN0YXRpY0ltYWdlKHRoaXMuY29udGV4dCwgd2lkdGhUZXhlbHMsIGhlaWdodFRleGVscywgY29sb3IsIGluZm8uc3JjKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdwZGYnOi
13345B7XHJcbiAgICAgICAgaW1hZ2UgPSBuZXcgUGRmSW1hZ2UodGhpcy5jb250ZXh0LCB3aWR0aFRleGVscywgaGVpZ2h0VGV4ZWxzLCBjb2xvciwgaW5mby5zcmMsIG4pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2JsYW5rJzpcclxuICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgIGltYWdlID0gbmV3IEJsYW5rSW1hZ2UodGhpcy5jb250ZXh0LCB3aWR0aFRleGVscywgaGVpZ2h0VGV4ZWxzLCBjb2xvcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpbWFnZTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvSW1hZ2VGYWN0b3J5LmpzIiwiaW1wb3J0IHtwcm9wcyBhcyAgYm9va1Byb3BzfSBmcm9tICcuLi9wcm9wcy9ib29rJztcclxuaW1wb3J0IEJhc2VNYXRoVXRpbHMgZnJvbSAnQmFzZU1hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb29rUHJvcHNCdWlsZGVyIHtcclxuICBjb25zdHJ1Y3RvcihvblJlYWR5KSB7XHJcbiAgICB0aGlzLm9uUmVhZHkgPSBvblJlYWR5O1xyXG4gICAgdGhpcy5kZWZhdWx0cyA9IGJvb2tQcm9wcygpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBjYWxjU2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICBjb25zdCBzY2FsZSA9IEJhc2VNYXRoVXRpbHMuY2FsY1NjYWxlKHdpZHRoLCBoZWlnaHQsIHRoaXMuZGVmYXVsdHMud2lkdGgsIHRoaXMuZGVmYXVsdHMuaGVpZ2h0KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiBzY2FsZSp3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBzY2FsZSpoZWlnaHRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjYWxjVGV4ZWxzKHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIGNvbnN0IHNoZWV0ID0gdGhpcy5kZWZhdWx0cy5zaGVldCwgc2NhbGUgPSBCYXNlTWF0aFV0aWxzLmNhbGNTY2FsZSh3aWR0aCwgaGVpZ2h0LCBzaGVldC53aWR0aFRleGVscywgc2hlZXQuaGVpZ2h0VGV4ZWxzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoVGV4ZWxzOiBzY2FsZSp3aWR0aCxcclxuICAgICAgaGVpZ2h0VGV4ZWxzOiBzY2FsZSpoZWlnaHRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjYWxjUHJvcHMod2lkdGgsIGhlaWdodCkge1xyXG4gICAgdGhpcy5wcm9wcyA9IHtcclxuICAgICAgLi4udGhpcy5kZWZhdWx0cyxcclxuICAgICAgLi4udGhpcy5jYWxjU2l6ZSh3aWR0aCwgaGVpZ2h0KSxcclxuICAgICAgc2hlZXQ6IHtcclxuICAgICAgICAuLi50aGlzLmRlZmF1bHRzLnNoZWV0LFxyXG4gICAgICAgIC4uLnRoaXMuY2FsY1RleGVscyh3aWR0aCwgaGVpZ2h0KVxyXG4gICAgICB9LFxyXG4gICAgICBjb3Zlcjoge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdHMuY292ZXIsXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2U6IHtcclxuICAgICAgICAuLi50aGlzLmRlZmF1bHRzLnBhZ2UsXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjYWxjU2hlZXRzKHBhZ2VzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVldHMgPSBNYXRoLmNlaWwoTWF0aC5tYXgoMCwgcGFnZXMtNCkvMik7XHJcbiAgfVxyXG5cclxuICBnZXRTaGVldHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVldHM7XHJcbiAgfVxyXG5cclxuICBnZXRQcm9wcygpIHtcclxuICAgIHJldHVybiB0aGlzLnByb3BzO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZUNhbGxiYWNrKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYmluZHMucGFnZUNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgcmVhZHkoKSB7XHJcbiAgICBpZih0aGlzLm9uUmVhZHkpIHtcclxuICAgICAgdGhpcy5vblJlYWR5KHRoaXMuZ2V0UHJvcHMoKSwgdGhpcy5nZXRTaGVldHMoKSwgdGhpcy5nZXRQYWdlQ2FsbGJhY2soKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQm9va1Byb3BzQnVpbGRlci5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgc2hlZXRCbG9jayBmcm9tICcuLi9tb2RlbHMvc2hlZXRCbG9jayc7XHJcbmltcG9ydCBNYXRoVXRpbHMgZnJvbSAnTWF0aFV0aWxzJztcclxuaW1wb3J0IFRocmVlVXRpbHMgZnJvbSAnVGhyZWVVdGlscyc7XHJcbi8vIGltcG9ydCBUaHJlZU1hcmt1cCBmcm9tICcuL1RocmVlTWFya3VwJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoZWV0QmxvY2sge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aXN1YWwsIHAsIGZpcnN0LCBsYXN0LCBhbmdsZT0wLCBzdGF0ZT0nY2xvc2VkJywgaGVpZ2h0PTApIHtcclxuICAgIHRoaXMudmlzdWFsID0gdmlzdWFsO1xyXG4gICAgdGhpcy5wID0ge1xyXG4gICAgICAuLi5wLFxyXG4gICAgICBmaXJzdCxcclxuICAgICAgbGFzdFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcygpO1xyXG5cclxuICAgIGNvbnN0IGxvYWRlZFBvaW50cyA9IHRoaXMubG9hZFBvaW50cygpO1xyXG4gICAgT2JqZWN0LmtleXMobG9hZGVkUG9pbnRzKS5tYXAoKGspPT4ge1xyXG4gICAgICB0aGlzW2tdID0gbG9hZGVkUG9pbnRzW2tdW3Byb3BzLnNoYXBlXSB8fCBsb2FkZWRQb2ludHNba11bMF07XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBTcGxpbmUgPSBuZXcgVEhSRUUuU3BsaW5lKFtdKTtcclxuICAgIGZvcihsZXQgaT0wOyBpPHRoaXMuaW50ZXJwb2xhdGlvblBvaW50cy54WzBdLmxlbmd0aDsgKytpKSB7XHJcbiAgICBcdHRoaXMucFNwbGluZS5wb2ludHMucHVzaChuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlTcGxpbmUgPSBuZXcgVEhSRUUuU3BsaW5lKFtdKTtcclxuICAgIGZvcihsZXQgaT0wOyBpPHNoZWV0QmxvY2sucmVzWDsgKytpKSB7XHJcbiAgICBcdHRoaXMuaVNwbGluZS5wb2ludHMucHVzaChuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFTcGxpbmVzID0gW107XHJcblxyXG4gICAgLy90aGlzLnRocmVlID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcblxyXG4gICAgdGhpcy5nZW9tZXRyeSA9IHNoZWV0QmxvY2suZ2VvbWV0cnkuY2xvbmUoKTtcclxuXHJcbiAgICB0aGlzLnAuc2lkZUZhY2VzID0gW3tcclxuICAgICAgICBmaXJzdDogMCxcclxuICAgICAgICBsYXN0OiBzaGVldEJsb2NrLmZhY2VzWzBdX
13345HJcbiAgICAgIH0sIHtcclxuICAgICAgICBmaXJzdDogc2hlZXRCbG9jay5mYWNlc1swXSxcclxuICAgICAgICBsYXN0OiBzaGVldEJsb2NrLmZhY2VzWzFdXHJcbiAgICAgIH1cclxuICAgIF07XHJcblxyXG4gICAgdGhpcy5zaWRlVGV4dHVyZSA9IG5ldyBUSFJFRS5UZXh0dXJlKCk7XHJcbiAgICB0aGlzLnNpZGVUZXh0dXJlLndyYXBUID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XHJcbiAgICB0aGlzLnNpZGVUZXh0dXJlLnJlcGVhdC5zZXQoMCwgbGFzdC1maXJzdCk7XHJcbiAgICB0aGlzLnNpZGVUZXh0dXJlLmltYWdlID0gcHJvcHMuc2lkZVRleHR1cmU7XHJcbiAgICB0aGlzLnNpZGVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLm1hdGVyaWFscyA9IFtcclxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKSxcclxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKSxcclxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe21hcDogdGhpcy5zaWRlVGV4dHVyZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7bWFwOiB0aGlzLnNpZGVUZXh0dXJlfSksXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHttYXA6IHRoaXMuc2lkZVRleHR1cmV9KSxcclxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe21hcDogdGhpcy5zaWRlVGV4dHVyZX0pXHJcbiAgICAgICAgICAgICAgICAgIF07XHJcblxyXG4gICAgdGhpcy5wLnNldFRleHR1cmUodGhpcy5tYXRlcmlhbHNbMF0sIDIqZmlyc3QpO1xyXG4gICAgdGhpcy5wLnNldFRleHR1cmUodGhpcy5tYXRlcmlhbHNbMV0sIDIqbGFzdC0xKTtcclxuXHJcbiAgICB0aGlzLm1lc2ggPSBuZXcgVEhSRUUuTWVzaCh0aGlzLmdlb21ldHJ5LCBuZXcgVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCh0aGlzLm1hdGVyaWFscykpO1xyXG4gICAgdGhpcy5tZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcclxuICAgIHRoaXMubWVzaC5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XHJcbiAgICAvLyB0aGlzLm1lc2guZnJ1c3R1bUN1bGxlZCA9IHRydWU7XHJcblxyXG4gICAgLy90aGlzLnRocmVlLmFkZCh0aGlzLm1lc2gpO1xyXG4gICAgdGhpcy50aHJlZSA9IHRoaXMubWVzaDtcclxuICAgIHRoaXMudGhyZWUudXNlckRhdGEuc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgdGhpcy5tYXJrZXJzID0gW107XHJcbiAgICBpZih0aGlzLnAubWFya2VyLnVzZSkge1xyXG4gICAgICBjb25zdCBsPXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoO1xyXG4gICAgICBsZXQgaXM7XHJcbiAgICAgIC8vIGlzID0gWzAsIHNoZWV0QmxvY2sucmVzWC0xLCAoc2hlZXRCbG9jay5yZXNaLTEpKnNoZWV0QmxvY2sucmVzWCwgc2hlZXRCbG9jay5yZXNaKnNoZWV0QmxvY2sucmVzWC0xXTtcclxuICAgICAgaXMgPSBBcnJheS5hcHBseSgwLCBBcnJheShsKSkubWFwKChfLCBpKT0+IGkpO1xyXG5cclxuICAgICAgZm9yKGxldCBpIG9mIGlzKSB7XHJcbiAgICAgICAgY29uc3QgbWFya2VyID0gVGhyZWVVdGlscy5jcmVhdGVNYXJrZXIodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpXSwgaTxsLzI/MHhGRjAwMDA6MHgwMEZGMDAsIHRoaXMucC5tYXJrZXIuc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJzLnB1c2goe1xyXG4gICAgICAgICAgbWFya2VyLFxyXG4gICAgICAgICAgdmVydGV4OiBpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50aHJlZS5hZGQobWFya2VyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29ybmVyID0ge1xyXG4gICAgICB1c2U6IHRydWUsXHJcbiAgICAgIGhlaWdodDogMCxcclxuICAgICAgbWF4RGlzdGFuY2U6IDAsXHJcbiAgICAgIHBvaW50czogW10sXHJcbiAgICAgIE9aOiBuZXcgVEhSRUUuVmVjdG9yMygwLDAsMSksXHJcbiAgICAgIGF4aXM6IG5ldyBUSFJFRS5WZWN0b3IzKClcclxuICAgIH07XHJcbiAgICB0aGlzLnNldCgwLCAnY2xvc2VkJywgaGVpZ2h0LCBmaXJzdCwgbGFzdCk7IC8vIGNhbGN1bGF0ZSBjb3JuZXIgcG9pbnRzXHJcblxyXG4gICAgdGhpcy5zZXQoYW5nbGUsIHN0YXRlLCBoZWlnaHQsIGZpcnN0LCBsYXN0KTsgLy8gaW5pdCBwb3NpdGlvblxyXG5cclxuICAgIC8vIGlmKCFTaGVldEJsb2NrLm1hcmt1cCkge1xyXG4gICAgLy8gICBTaGVldEJsb2NrLm1hcmt1cD10cnVlO1xyXG4gICAgLy8gICB0aGlzLm1hcmt1cCA9IG5ldyBUaHJlZU1hcmt1cCh0aGlzLCAwLCBbe1xyXG4gICAgLy8gICAgIHg6IDAsXHJcbiAgICAvLyAgICAgeTogMCxcclxuICAgIC8vICAgfSwge1xyXG4gICAgLy8gICAgIHg6IDAuNSxcclxuICAgIC8vICAgICB5OiAxXHJcbiAgICAvLyAgIH0sIHtcclxuICAgIC8vICAgICB4OiAxLFxyXG4gICAgLy8gICAgIHk6IDBcclxuICAgIC8vICAgfV0ubWFwKChwKT0+bmV3IFRIUkVFLlZlY3RvcjIocC54LCBwLnkpKSwge30pO1xyXG4gICAgLy8gfVxyXG5cclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBmb3IobGV0IG0gb2YgdGhpcy5tYXRlcmlhbHMpIHtcclxuICAgICAgaWYobS5tYXApIHtcclxuICAgICAgICBtLm1hcCA9IG51bGw7XHJcbiAgICAgICAgbS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbS5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5tYXRlcmlhbHM7XHJcbiAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wLmxhc3QtdGhpcy5wLmZpcnN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJvcHMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi50aGlzLnAucGFnZSxcclxuICAgICAgc2hlZXRzOiB0aGlzLnAuc2hlZXRzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9wQ2VybmVycygpIHtcclxuICAgIGNvbnN0IG9mZiA9IHRoaXMuYW5nbGU+TWF0aC5QSS8yPyB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aC8yOiAwO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW29mZl0sXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tzaGVldEJsb2NrLnJlc1gtMStvZmZdLFxyXG4gICAgICAgI
13345HRoaXMuZ2VvbWV0cnkudmVydGljZXNbKHNoZWV0QmxvY2sucmVzWi0xKSpzaGVldEJsb2NrLnJlc1grb2ZmXSxcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3NoZWV0QmxvY2sucmVzWipzaGVldEJsb2NrLnJlc1gtMStvZmZdXHJcbiAgICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRUb3BTaXplKCkge1xyXG4gICAgLy8gY29uc3QgbD10aGlzLmdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCwgb2ZmID0gdGhpcy5hbmdsZT5NYXRoLlBJLzI/IGwvMjogMCxcclxuICAgIC8vICAgdjAgPSB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW29mZl0sIHYxID0gdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTErb2ZmXTtcclxuICAgIC8vIC8vIGlzID0gWzAsIHNoZWV0QmxvY2sucmVzWC0xLCAoc2hlZXRCbG9jay5yZXNaLTEpKnNoZWV0QmxvY2sucmVzWCwgc2hlZXRCbG9jay5yZXNaKnNoZWV0QmxvY2sucmVzWC0xXTtcclxuICAgIC8vIHJldHVybiB7XHJcbiAgICAvLyAgIHdpZHRoOiBNYXRoLmFicyh2MS54LXYwLngpLFxyXG4gICAgLy8gICBoZWlnaHQ6IE1hdGguYWJzKHYxLnotdjAueilcclxuICAgIC8vIH07XHJcbiAgICBjb25zdCB2cyA9IHRoaXMuZ2V0VG9wQ2VybmVycygpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGg6IHZzWzBdLmRpc3RhbmNlVG8odnNbMV0pLFxyXG4gICAgICBoZWlnaHQ6IHZzWzBdLmRpc3RhbmNlVG8odnNbMl0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9wV29ybGRSb3RhdGlvbihxKSB7XHJcbiAgICBxLnggPSAtTWF0aC5QSS8yO1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG5cclxuICBnZXRUb3BXb3JsZFBvc2l0aW9uKHYpIHtcclxuICAgIGNvbnN0IGw9dGhpcy5nZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGgsIG9mZiA9IHRoaXMuYW5nbGU+TWF0aC5QSS8yPyBsLzI6IDAsIHZzID0gW1xyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbb2ZmXSxcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3NoZWV0QmxvY2sucmVzWC0xK29mZl0sXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1soc2hlZXRCbG9jay5yZXNaLTEpKnNoZWV0QmxvY2sucmVzWCtvZmZdLFxyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbc2hlZXRCbG9jay5yZXNaKnNoZWV0QmxvY2sucmVzWC0xK29mZl1cclxuICAgICAgXTtcclxuICAgIHYuc2V0KDAsIDAsIDApO1xyXG4gICAgZm9yKGxldCB2aSBvZiB2cykge1xyXG4gICAgICB2LnggKz0gMC4yNSp2aS54O1xyXG4gICAgICB2LnkgKz0gMC4yNSp2aS55O1xyXG4gICAgICB2LnogKz0gMC4yNSp2aS56O1xyXG4gICAgfVxyXG4gICAgdGhpcy50aHJlZS5sb2NhbFRvV29ybGQodik7XHJcbiAgICByZXR1cm4gdjtcclxuICB9XHJcblxyXG4gIGdldEludGVycG9sYXRpb25Qb2ludHMoaW5kcywgbW9kKSB7XHJcbiAgICBjb25zdCBwcyA9IHt4OiBbXSwgeTogW119LCBLID0gdGhpcy5nZXRQcm9wcygpLndhdmU7XHJcbiAgICBmb3IobGV0IGkgb2YgaW5kcykge1xyXG4gICAgICBwcy54LnB1c2goWy4uLnRoaXMuaW50ZXJwb2xhdGlvblBvaW50cy54W2ldXSk7XHJcbiAgICAgIHBzLnkucHVzaCh+bW9kLmluZGV4T2YoaSk/IHRoaXMuaW50ZXJwb2xhdGlvblBvaW50cy55W2ldLm1hcCgobik9PiBLKm4pOiBbLi4udGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnlbaV1dKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcztcclxuICB9XHJcblxyXG4gIHNldChhbmdsZSwgc3RhdGU9dGhpcy5zdGF0ZSwgaGVpZ2h0PXRoaXMuY29ybmVyLmhlaWdodCwgZmlyc3Q9dGhpcy5wLmZpcnN0LCBsYXN0PXRoaXMucC5sYXN0KSB7XHJcbiAgICBjb25zdCBQSSA9IE1hdGguUEk7XHJcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XHJcbiAgICBsZXQgY2xvc2VkQW5nbGUsIGJpbmRlclR1cm47XHJcbiAgICBpZih0eXBlb2YgYW5nbGU9PT0nb2JqZWN0Jykge1xyXG4gICAgICB0aGlzLmFuZ2xlID0gYW5nbGUub3BlbmVkQW5nbGU7XHJcbiAgICAgIGNsb3NlZEFuZ2xlID0gYW5nbGUuY2xvc2VkQW5nbGU7XHJcbiAgICAgIGJpbmRlclR1cm4gPSBhbmdsZS5iaW5kZXJUdXJuPlBJLzI/UEktYW5nbGUuYmluZGVyVHVybjphbmdsZS5iaW5kZXJUdXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcclxuICAgIH1cclxuICAgIHRoaXMuY29ybmVyLmhlaWdodCA9IGhlaWdodDtcclxuICAgIGlmKHRoaXMucC5maXJzdCE9PWZpcnN0IHx8IHRoaXMucC5sYXN0IT09bGFzdCkge1xyXG4gICAgICB0aGlzLnNpZGVUZXh0dXJlLnJlcGVhdC5zZXQoMCwgbGFzdC1maXJzdCk7XHJcbiAgICAgIHRoaXMuc2lkZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICBpZih0aGlzLnAuZmlyc3QhPT1maXJzdCkge1xyXG4gICAgICAgIHRoaXMucC5zZXRUZXh0dXJlKHRoaXMubWF0ZXJpYWxzWzBdLCAyKmZpcnN0KTtcclxuICAgICAgfVxyXG4gICAgICBpZih0aGlzLnAubGFzdCE9PWxhc3QpIHtcclxuICAgICAgICB0aGlzLnAuc2V0VGV4dHVyZSh0aGlzLm1hdGVyaWFsc1sxXSwgMipsYXN0LTEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnAuZmlyc3QgPSBmaXJzdDtcclxuICAgIHRoaXMucC5sYXN0ID0gbGFzdDtcclxuICAgIGxldCBwb2ludHM7XHJcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoKTtcclxuICAgIGlmKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnKSB7XHJcbiAgICAgIHBvaW50cyA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvblBvaW50cyh0aGlzLmNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzLCB0aGlzLmNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcpIHtcclxuICAgICAgaWYoY2xvc2VkQW5nbGUhPT11bmRlZmluZWQgJiYgTWF0aC5hYnMoY2xvc2VkQW5nbGUtUEkvMik+MWUtMikge1xyXG4gICAgICAgIHBvaW50cyA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvblBvaW50cyh0aGlzLmZsYXRJbnRlcnBvbGF0aW9uSW5kZWNlcywgW10pO1xyXG4gICAgICAgIGNvbnN0IHBzID0gdGhpcy5nZXRQb2ludHNBdEFuZ2xlKHRoaXMuZ2V0SW50ZXJwb2xhdGlvblBvaW50cyh0aGlzLmNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzLCB0aGlzLmNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzKSwgY2xvc2VkQW5nbGU+UEkvMj9QSS1jbG9zZWRBbmdsZTpjbG9zZWRBbmdsZSk7XHJcbiAgICAgICAgcG9pbnRzLnggPSBbcHMueCwuLi5wb2ludHMueF07XHJcbiAgICAgICAgcG9pbnRzLnkgPSBbcHMueSwuLi5wb2ludHMueV07XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocHMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgI
13345HBvaW50cyA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvblBvaW50cyh0aGlzLm9wZW5lZEludGVycG9sYXRpb25JbmRlY2VzLCB0aGlzLmNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGhsLCBociwgb2Zmc2V0ID0gMC41KnByb3BzLnNoZWV0cypwcm9wcy5kZXB0aDtcclxuICAgIGlmKHRoaXMuc3RhdGU9PT0nY2xvc2VkJykge1xyXG4gICAgICBvZmZzZXQgLT0gN2UtNip0aGlzLnAuc2NhbGU7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmFuZ2xlPD1QSS8yKSB7XHJcbiAgICAgIGhsID0gKHByb3BzLnNoZWV0cy1maXJzdCkqcHJvcHMuZGVwdGg7XHJcbiAgICAgIGhyID0gKHByb3BzLnNoZWV0cy1sYXN0KSpwcm9wcy5kZXB0aDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBobCA9IGZpcnN0KnByb3BzLmRlcHRoO1xyXG4gICAgICBociA9IGxhc3QqcHJvcHMuZGVwdGg7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5BbmdsZSA9IHRoaXMuYW5nbGU+UEkvMj9QSS10aGlzLmFuZ2xlOnRoaXMuYW5nbGUsIGhBbmdsZSA9IHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnPyBpbkFuZ2xlOiAoYmluZGVyVHVybj09PXVuZGVmaW5lZD8gUEkvMjogYmluZGVyVHVybik7XHJcbiAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gdGhpcy5nZXRQb2ludHNBdEFuZ2xlQW5kSHMocG9pbnRzLCBpbkFuZ2xlLCBoQW5nbGUsIFtobC9wcm9wcy53aWR0aCwgaHIvcHJvcHMud2lkdGhdKTtcclxuICAgIGlmKHRoaXMuYW5nbGU+UEkvMikge1xyXG4gICAgICB0aGlzLmludmVyc2UobGVmdCk7XHJcbiAgICAgIHRoaXMuaW52ZXJzZShyaWdodCk7XHJcbiAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFBvaW50cyhsZWZ0LCByaWdodCwgb2Zmc2V0KTtcclxuICB9XHJcblxyXG4gIHNldFBvaW50cyhsZWZ0LCByaWdodCwgb2Zmc2V0KSB7XHJcbiAgICBjb25zdCBwID0gdGhpcy5nZXRQcm9wcygpO1xyXG4gICAgbGV0IGkgPSAwO1xyXG5cclxuICAgIGNvbnN0IHlzID0gW3JpZ2h0LCBsZWZ0XTtcclxuICAgIGZvcihsZXQgeSA9IDA7IHk8c2hlZXRCbG9jay5yZXNZOyArK3kpIHtcclxuICAgICAgZm9yKGxldCB6ID0gMDsgejxzaGVldEJsb2NrLnJlc1o7ICsreikge1xyXG4gICAgICAgIGZvcihsZXQgeCA9IDA7IHg8c2hlZXRCbG9jay5yZXNYOyArK3gpIHtcclxuICAgICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbaSsrXS5zZXQoXHJcbiAgICAgICAgICAgIHlzW3ldLnhbeF0qcC53aWR0aCtvZmZzZXQsXHJcbiAgICAgICAgICAgIHlzW3ldLnlbeF0qcC53aWR0aCxcclxuICAgICAgICAgICAgeipwLmhlaWdodC8oc2hlZXRCbG9jay5yZXNaLTEpLTAuNSpwLmhlaWdodFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKGkhPT10aGlzLmdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3NldFBvaW50czogYmFkIG1hcHBpbmchJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5jb3JuZXIudXNlICYmICF0aGlzLmNvcm5lci5wb2ludHMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHBsYW5lID0gbmV3IFRIUkVFLlBsYW5lKCksIG5vcm1hbCA9IHBsYW5lLm5vcm1hbCwgcGxhbmVPZmZzZXQgPSAoMS10aGlzLmdldFByb3BzKCkuZmxleGlibGVDb3JuZXIpKk1hdGgubWluKHAud2lkdGgsIHAuaGVpZ2h0KSwgcHJvaiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgIHBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KG5ldyBUSFJFRS5WZWN0b3IzKC0xLDAsLTEpLm5vcm1hbGl6ZSgpLCBuZXcgVEhSRUUuVmVjdG9yMyhwbGFuZU9mZnNldCtvZmZzZXQsIDAsIDAuNSpwLmhlaWdodCkpO1xyXG4gICAgICBmb3IobGV0IGk9MCwgbD10aGlzLmdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aDtpPGw7KytpKSB7XHJcbiAgICAgICAgcGxhbmUucHJvamVjdFBvaW50KHRoaXMuZ2VvbWV0cnkudmVydGljZXNbaV0sIHByb2opO1xyXG4gICAgICAgIHByb2ouc3ViKHRoaXMuZ2VvbWV0cnkudmVydGljZXNbaV0pO1xyXG4gICAgICAgIGlmKHByb2oueCpub3JtYWwueCtwcm9qLnkqbm9ybWFsLnkrcHJvai56Km5vcm1hbC56PjApIHtcclxuICAgICAgICAgIGNvbnN0IGQgPSBwcm9qLmxlbmd0aCgpL3BsYW5lT2Zmc2V0O1xyXG4gICAgICAgICAgdGhpcy5jb3JuZXIubWF4RGlzdGFuY2UgPSBNYXRoLm1heCh0aGlzLmNvcm5lci5tYXhEaXN0YW5jZSwgZCk7XHJcbiAgICAgICAgICB0aGlzLmNvcm5lci5wb2ludHMucHVzaCh7dmVydGV4OiBpLCBkaXN0YW5jZTogZH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuY29ybmVyLnVzZSAmJiBNYXRoLmFicyh0aGlzLmNvcm5lci5oZWlnaHQpPjFlLTMpIHtcclxuICAgICAgY29uc3QgZDJBbmdsZSA9IChkKT0+IHAuY29ybmVyRGV2aWF0aW9uKnRoaXMuY29ybmVyLmhlaWdodC8oMStNYXRoLmV4cCgtcC5iZW5kaW5nKihkLTAuNSp0aGlzLmNvcm5lci5tYXhEaXN0YW5jZSkpKTtcclxuICAgICAgdGhpcy5jb3JuZXIuYXhpcy5zZXQoLTEsMCwxKS5ub3JtYWxpemUoKTtcclxuICAgICAgdGhpcy5jb3JuZXIuYXhpcy5hcHBseUF4aXNBbmdsZSh0aGlzLmNvcm5lci5PWiwgdGhpcy5hbmdsZSk7XHJcbiAgICAgIGZvcihsZXQgcG9pbnQgb2YgdGhpcy5jb3JuZXIucG9pbnRzKSB7XHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1twb2ludC52ZXJ0ZXhdLmFwcGx5QXhpc0FuZ2xlKHRoaXMuY29ybmVyLmF4aXMsIGQyQW5nbGUocG9pbnQuZGlzdGFuY2UpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yKGxldCBtIG9mIHRoaXMubWFya2Vycykge1xyXG4gICAgICBtLm1hcmtlci5wb3NpdGlvbi5jb3B5KHRoaXMuZ2VvbWV0cnkudmVydGljZXNbbS52ZXJ0ZXhdKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcbiAgICAvL3RoaXMuZ2VvbWV0cnkuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XHJcbiAgICB0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaG
13345VyZSgpO1xyXG4gICAgLy90aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIGlmKHRoaXMubWFya3VwKSB7XHJcbiAgICAgIHRoaXMubWFya3VwLmNvbXB1dGVWZXJ0aWNlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW52ZXJzZShwcykge1xyXG4gICAgZm9yKGxldCBpID0gMDtpPHBzLngubGVuZ3RoOyArK2kpIHtcclxuICAgICAgcHMueFtpXT0tcHMueFtpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcztcclxuICB9XHJcblxyXG4gIGdldFBvaW50c0F0SHMocHMsIGFuZ2xlLCBocykge1xyXG4gICAgY29uc3QgTiA9IDEwMDA7XHJcbiAgICBNYXRoVXRpbHMuc2V0U3BsaW5lUG9pbnRzKHRoaXMucFNwbGluZSwgcHMpO1xyXG4gICAgbGV0IGJsID0gTWF0aFV0aWxzLnNwbGl0U3BsaW5lKHRoaXMucFNwbGluZSwgTiksIHI9W107XHJcbiAgICB7XHJcbiAgICAgIGNvbnN0IHAxID0gey4uLnRoaXMucFNwbGluZS5nZXRQb2ludCgoTi0xKS9OKX0sIHAyID0gey4uLnRoaXMucFNwbGluZS5nZXRQb2ludCgxKX0sXHJcbiAgICAgICAgZHAgPSB7eDogcDIueC1wMS54LCB5OiBwMi55LXAxLnl9LCBsbiA9IE1hdGguc3FydChkcC54KmRwLngrZHAueSpkcC55KSxcclxuICAgICAgICBzcCA9IHRoaXMucFNwbGluZS5wb2ludHNbdGhpcy5wU3BsaW5lLnBvaW50cy5sZW5ndGgtMV07XHJcbiAgICAgIHNwLnNldChzcC54KzAuMSpkcC54L2xuLCBzcC55KzAuMSpkcC55L2xuLCAwKTtcclxuICAgICAgYmwgPSBNYXRoVXRpbHMuc3BsaXRTcGxpbmUodGhpcy5wU3BsaW5lLCBOKTtcclxuICAgIH1cclxuICAgIGJsLmxzLnB1c2goMWU3KTtcclxuICAgIE1hdGhVdGlscy5tYXBsMkwoYmwubHMsIGJsLmxlbiwgc2hlZXRCbG9jay5yZXNYLCAoaSk9PiB7XHJcbiAgICAgIGZvcihsZXQgaj0wOyBqPGhzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYoIWkpIHtcclxuICAgICAgICAgIHJbal0gPSB7eDogWy1oc1tqXSpNYXRoLnNpbihhbmdsZSldLCB5OiBbaHNbal0qTWF0aC5jb3MoYW5nbGUpXX07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgcDAgPSB7Li4udGhpcy5wU3BsaW5lLmdldFBvaW50KChpLTEpL04pfSxcclxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5wU3BsaW5lLmdldFBvaW50KGkvTiksXHJcbiAgICAgICAgICAgICAgICB4PS0ocDEueS1wMC55KSwgeT0ocDEueC1wMC54KSwgbD1NYXRoLnNxcnQoeCp4K3kqeSk7XHJcbiAgICAgICAgICByW2pdLngucHVzaChwMS54K3gvbCpoc1tqXSk7XHJcbiAgICAgICAgICByW2pdLnkucHVzaChwMS55K3kvbCpoc1tqXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBucHM9W107XHJcbiAgICBmb3IobGV0IGo9MDsgajxocy5sZW5ndGg7ICsraikge1xyXG4gICAgICBucHNbal09e3g6W10seTpbXX07XHJcbiAgICAgIE1hdGhVdGlscy5zZXRTcGxpbmVQb2ludHModGhpcy5pU3BsaW5lLCByW2pdKTtcclxuICAgICAgY29uc3QgbCA9IE1hdGhVdGlscy5zcGxpdFNwbGluZSh0aGlzLmlTcGxpbmUsIE4pO1xyXG4gICAgICBsLmxzLnB1c2goMWU3KTtcclxuICAgICAgTWF0aFV0aWxzLm1hcGwyTChsLmxzLCAxLCBzaGVldEJsb2NrLnJlc1gsIChpKT0+IHtcclxuICAgICAgICBjb25zdCBwID0gdGhpcy5pU3BsaW5lLmdldFBvaW50KGkvTik7XHJcbiAgICAgICAgbnBzW2pdLngucHVzaChwLngpO1xyXG4gICAgICAgIG5wc1tqXS55LnB1c2gocC55KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnBzO1xyXG4gIH1cclxuXHJcbiAgZ2V0UG9pbnRzQXRBbmdsZUFuZEhzKHBvaW50cywgYW5nbGUsIGhBbmdsZSwgaHMpIHtcclxuICAgIGNvbnN0IHBzID0gdGhpcy5nZXRQb2ludHNBdEFuZ2xlKHBvaW50cywgYW5nbGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRzQXRIcyhwcywgaEFuZ2xlLCBocyk7XHJcbiAgfVxyXG5cclxuICBnZXRQb2ludHNBdEFuZ2xlKHBvaW50cywgYW5nbGUpIHtcclxuICAgIGNvbnN0IHBzPXt4OiBbXSwgeTpbXX0sIGFuZ2xlcz1bXTtcclxuICAgIGFuZ2xlLz1NYXRoLlBJLzI7XHJcbiAgICBmb3IobGV0IGogPSAwOyBqPHBvaW50cy54Lmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGFuZ2xlcy5wdXNoKGovKHBvaW50cy54Lmxlbmd0aC0xKSk7XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IGkgPSAwOyBpPHBvaW50cy54WzBdLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHhwcyA9IFtdLCB5cHMgPSBbXTtcclxuICAgICAgZm9yKGxldCBqID0gMDsgajxwb2ludHMueC5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIHhwcy5wdXNoKHBvaW50cy54W2pdW2ldKTtcclxuICAgICAgICB5cHMucHVzaChwb2ludHMueVtqXVtpXSk7XHJcbiAgICAgIH1cclxuICAgICAgcHMueC5wdXNoKHRoaXMuaW50ZXJwb2xhdGUoYW5nbGVzLHhwcyxhbmdsZSkpO1xyXG4gICAgICBwcy55LnB1c2godGhpcy5pbnRlcnBvbGF0ZShhbmdsZXMseXBzLGFuZ2xlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHM7XHJcbiAgfVxyXG5cclxuICBpbnRlcnBvbGF0ZSh4LHkseGkpIHtcclxuICAgIGlmKCF0aGlzLmFTcGxpbmVzW3gubGVuZ3RoXSkge1xyXG4gICAgICB0aGlzLmFTcGxpbmVzW3gubGVuZ3RoXSA9IG5ldyBUSFJFRS5TcGxpbmUoW10pO1xyXG4gICAgICBjb25zdCBwcyA9IHRoaXMuYVNwbGluZXNbeC5sZW5ndGhdLnBvaW50cztcclxuICAgICAgZm9yKGxldCBpPTA7aTx4Lmxlbmd0aDsrK2kpIHtcclxuICAgICAgICBwcy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBzcGxpbmUgPSB0aGlzLmFTcGxpbmVzW3gubGVuZ3RoXTtcclxuICAgIGZvcihsZXQgaT0wO2k8eC5sZW5ndGg7KytpKSB7XHJcbiAgICAgIHNwbGluZS5wb2ludHNbaV0uc2V0KHhbaV0sIHlbaV0sIDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNwbGluZS5nZXRQb2ludChNYXRoLm1pbigxLCBNYXRoLm1heCh4aSwgMCkpKS55O1xyXG4gIH1cclxuXHJcbiAgbG9hZFBvaW50cygpIHtcclxuICAgIGNvbnN0IHg9W10seT1bXTtcclxuICAgIGZvcihsZXQgciBvZiBbMCwgMC4yODc3LCAwLjYzNDcsIDAuODE3NCwgMS4wMDAwXSkge1xyXG4gICAgICB4LnB1c2gocipNYXRoLmNvcygwLjkqTWF0aC5QSS80KSk7XHJcbiAgICAgIHkucHVzaChyKk1hdGguc2luKDAuOSpNYXRoLlBJLzQpKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wZW5lZEludGVycG9sYXRpb25JbmRlY2VzID0gW1xyXG4gICAgICBbMiwzLDRdLFxyXG4gICAgICBbMiwzLDQsNSw2XVxyXG4gICAgXSxcclxuICAgIGNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzID0gW1xyXG4gICAgICBbMCwxLDJdLFxyXG4gICAgICBbMCwxLDJdXHJcbiAgICBdLFxyXG4gICAgZmxh
13345dEludGVycG9sYXRpb25JbmRlY2VzID0gW1xyXG4gICAgICBbNSw0XSxcclxuICAgICAgWzcsNl1cclxuICAgIF0sXHJcbiAgICBpbnRlcnBvbGF0aW9uUG9pbnRzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgeDogW1xyXG4gICAgICAgICAgWzAsMC4yODc3LDAuNjM0NywwLjgxNzQsMS4wMDAwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjI4NiwwLjYzMiwwLjgxNSwwLjk5N10sXHJcbiAgICAgICAgICBbMC4wMDAsMC4yNzksMC42MjMsMC44MDYsMC45ODhdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMTI2LDAuNDExLDAuNTkzLDAuNzc0XSxcclxuICAgICAgICAgIFswLDAsMCwwLDBdLFxyXG4gICAgICAgICAgeFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgeTogW1xyXG4gICAgICAgICAgWzAsMCwwLDAsMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4wMzAsMC4wMTAsMC4wMDIsMC4wMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMDYwLDAuMDE3LDAuMDA0LDAuMDAwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjI1OSwwLjQ0MCwwLjQ0NiwwLjQyOV0sXHJcbiAgICAgICAgICBbMCwgMC4yODc3LCAwLjYzNDcsIDAuODE3NCwgMS4wMDAwXSxcclxuICAgICAgICAgIHlcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB4OiBbXHJcbiAgICAgICAgICBbMCwwLjI4NzcsMC42MzQ3LDAuODE3NCwxLjAwMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjg2LDAuNjMyLDAuODE1LDAuOTk3XSxcclxuICAgICAgICAgIFswLjAwMCwwLjI3OSwwLjYyMywwLjgwNiwwLjk4OF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4yMzMsMC41NjMsMC43NDYsMC45MjddLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMTQ0LDAuNDMzLDAuNjEzLDAuNzk2XSxcclxuICAgICAgICAgIFswLjAwMCwwLjA3MCwwLjI4OCwwLjQ1NSwwLjYyNl0sXHJcbiAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgIHhcclxuICAgICAgICBdLFxyXG4gICAgICAgIHk6IFtcclxuICAgICAgICAgIFswLDAsMCwwLDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMDMwLDAuMDEwLDAuMDAyLDAuMDAwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjA2MCwwLjAxNywwLjAwNCwwLjAwMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4xNjgsMC4yNjksMC4yNzAsMC4yNTVdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjQ1LDAuNDM1LDAuNDU4LDAuNDYwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjI3OCwwLjU0NCwwLjYxNCwwLjY3M10sXHJcbiAgICAgICAgICBbMCwgMC4yODc3LCAwLjYzNDcsIDAuODE3NCwgMS4wMDAwXSxcclxuICAgICAgICAgIHlcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaW50ZXJwb2xhdGlvblBvaW50cyxcclxuICAgICAgb3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMsXHJcbiAgICAgIGNsb3NlZEludGVycG9sYXRpb25JbmRlY2VzLFxyXG4gICAgICBmbGF0SW50ZXJwb2xhdGlvbkluZGVjZXNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU2hlZXRCbG9jay5qcyIsIlxyXG5leHBvcnQgZnVuY3Rpb24gcHJvcHMoKSB7XHJcbiAgLy8gY29uc3QgcHJvcHMgPSB7XHJcbiAgLy8gICBoZWlnaHQsXHJcbiAgLy8gICB3aWR0aCxcclxuICAvLyAgIGdyYXZpdHksXHJcbiAgLy8gICBpbmplY3RvcixcclxuICAvLyAgIGNhY2hlZFBhZ2VzLFxyXG4gIC8vICAgcmVuZGVySW5hY3RpdmVQYWdlcyxcclxuICAvLyAgIHJlbmRlcldoaWxlRmxpcHBpbmcsXHJcbiAgLy8gICBwYWdlc0ZvclByZWRpY3RpbmcsXHJcbiAgLy8gICBwcmVsb2FkUGFnZXMsXHJcbiAgLy8gICBzaGVldDoge1xyXG4gIC8vICAgICBzdGFydFZlbG9jaXR5LFxyXG4gIC8vICAgICBjb3JuZXJEZXZpYXRpb24sXHJcbiAgLy8gICAgIGZsZXhpYmlsaXR5LFxyXG4gIC8vICAgICBmbGV4aWJsZUNvcm5lcixcclxuICAvLyAgICAgYmVuZGluZyxcclxuICAvLyAgICAgd2F2ZSxcclxuICAvLyAgICAgc2hhcGUsXHJcbiAgLy8gICAgIHdpZHRoVGV4ZWxzLFxyXG4gIC8vICAgICBoZWlnaHRUZXhlbHMsXHJcbiAgLy8gICAgIGNvbG9yLFxyXG4gIC8vICAgICBzaWRlVGV4dHVyZVxyXG4gIC8vICAgfSxcclxuICAvLyAgIGNvdmVyOiB7XHJcbiAgLy8gICAgIC4uLnNoZWV0LFxyXG4gIC8vICAgICBwYWRkaW5nLFxyXG4gIC8vICAgICBiaW5kZXJUZXh0dXJlLFxyXG4gIC8vICAgICBkZXB0aCxcclxuICAvLyAgICAgbWFzc1xyXG4gIC8vICAgfSxcclxuICAvLyAgIHBhZ2U6IHtcclxuICAvLyAgICAgLi4uc2hlZXQsXHJcbiAgLy8gICAgIGRlcHRoLFxyXG4gIC8vICAgICBtYXNzXHJcbiAgLy8gICB9XHJcbiAgLy8gfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGhlaWdodDogMC4yOTcsXHJcbiAgICB3aWR0aDogMC4yMSxcclxuICAgIGdyYXZpdHk6IDEsXHJcbiAgICBjYWNoZWRQYWdlczogNTAsXHJcbiAgICByZW5kZXJJbmFjdGl2ZVBhZ2VzOiB0cnVlLFxyXG4gICAgcmVuZGVySW5hY3RpdmVQYWdlc09uTW9iaWxlOiBmYWxzZSxcclxuICAgIHJlbmRlcldoaWxlRmxpcHBpbmc6IGZhbHNlLFxyXG4gICAgcGFnZXNGb3JQcmVkaWN0aW5nOiA1LFxyXG4gICAgcHJlbG9hZFBhZ2VzOiA1LFxyXG4gICAgcnRsOiBmYWxzZSxcclxuICAgIHNoZWV0OiB7XHJcbiAgICAgIHN0YXJ0VmVsb2NpdHk6IDAuOSxcclxuICAgICAgY29ybmVyRGV2aWF0aW9uOiAwLjI1LFxyXG4gICAgICBmbGV4aWJpbGl0eTogMTAsXHJcbiAgICAgIGZsZXhpYmxlQ29ybmVyOiAwLjUsXHJcbiAgICAgIGJlbmRpbmc6IDExLFxyXG4gICAgICB3YXZlOiAwLjUsXHJcbiAgICAgIHNoYXBlOiAwLFxyXG4gICAgICB3aWR0aFRleGVsczogNSoyMTAsXHJcbiAgICAgIGhlaWdodFRleGVsczogNSoyOTcsXHJcbiAgICAgIGNvbG9yOiAweEZGRkZGRlxyXG4gICAgfSxcclxuICAgIGNvdmVyOiB7XHJcbiAgICAgIGJpbmRlclRleHR1cmU6ICcnLFxyXG4gICAgICBkZXB0aDogMC4wMDAzLFxyXG4gICAgICBwYWRkaW5nOiAwLFxyXG4gICAgICBtYXNzOiAwLjAwM1xyXG4gICAgfSxcclxuICAgIHBhZ2U6IHtcclxuICAgICAgZGVwdGg6IDAuMDAwMSxcclxuICAgICAgbWFzczogMC4wMDFcclxuICAgIH0sXHJcbiAgICBjc3NMYXllclByb3BzOiB7XHJcbiAgICAgIHdpZHRoOiAxMDI0XHJcbiAgICB9XHJcbiAgfTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvcHJvcHMvYm9vay5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuVEhSRUUuQ1NTM0RPYmplY3QgPSBjbGFzcyBDU1MzRE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEIHtcclxuICBjb25zdHJ1Y3RvcihlbGVtZW50PXVuZGVmaW5lZCkge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICBpZihlbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuc2V0KGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0KGVsZW1lbnQpIHtcclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgXHR0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG5cclxuICBcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZlZCcsIGZ1bmN0aW9uKCkge1xyXG4gIFx0XHRpZiAodGhpcy5lbGVtZW50LnBhcmVudE5vZGUgIT09IG51bGwpIHtcclxuICBcdFx0XHR0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gIFx0XHR9XHJcbiAgXHR9KTtcclxuICB9XHJcbn07XHJcblxyXG5USFJFRS5DU1MzRFNwcml0ZSA9IGNsYXNzIENTUzNEU3ByaXRlIGV4dGVuZHMgVEhSRUUuQ1NTM0RPYmplY3Qge1xyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcclxuICAgIHN1cGVyKGVsZW1lbnQpO1xyXG4gIH1cclxufTtcclxuXHJcblRIUkVFLkNTUzNEUmVuZGVyZXIgPSBjbGFzcyBDU1MzRFJlbmRlcmVyIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgXHR2YXIgX3dpZHRoLCBfaGVpZ2h0O1xyXG4gIFx0dmFyIF93aWR0aEhhbGYsIF9oZWlnaHRIYWxmO1xyXG5cclxuICBcdHZhciBtYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xyXG5cclxuICBcdHZhciBjYWNoZSA9IHtcclxuICBcdFx0Y2FtZXJhOiB7IGZvdjogMCwgc3R5bGU6ICcnIH0sXHJcbiAgXHRcdG9iamVjdHM6IHt9XHJcbiAgXHR9O1xyXG5cclxuICBcdHZhciBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicpO1xyXG4gIFx0ZG9tRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG5cclxuICBcdHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7XHJcblxyXG4gIFx0dmFyIGNhbWVyYUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2Jyk7XHJcblxyXG4gIFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm1TdHlsZSA9ICdwcmVzZXJ2ZS0zZCc7XHJcbiAgXHRjYW1lcmFFbGVtZW50LnN0eWxlLk1velRyYW5zZm9ybVN0eWxlID0gJ3ByZXNlcnZlLTNkJztcclxuICBcdGNhbWVyYUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtU3R5bGUgPSAncHJlc2VydmUtM2QnO1xyXG5cclxuICBcdGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNhbWVyYUVsZW1lbnQpO1xyXG5cclxuICBcdHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KCBuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuXHJcbiAgXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTtcclxuXHJcbiAgXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gIFx0XHRyZXR1cm4ge1xyXG4gIFx0XHRcdHdpZHRoOiBfd2lkdGgsXHJcbiAgXHRcdFx0aG
13345VpZ2h0OiBfaGVpZ2h0XHJcbiAgXHRcdH07XHJcblxyXG4gIFx0fTtcclxuXHJcbiAgXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG4gIFx0XHRfd2lkdGggPSB3aWR0aDtcclxuICBcdFx0X2hlaWdodCA9IGhlaWdodDtcclxuICBcdFx0X3dpZHRoSGFsZiA9IF93aWR0aCAvIDI7XHJcbiAgXHRcdF9oZWlnaHRIYWxmID0gX2hlaWdodCAvIDI7XHJcblxyXG4gIFx0XHRkb21FbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gIFx0XHRkb21FbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblxyXG4gIFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gIFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblxyXG4gIFx0fTtcclxuXHJcbiAgXHRmdW5jdGlvbiBlcHNpbG9uKCB2YWx1ZSkge1xyXG5cclxuICBcdFx0cmV0dXJuIE1hdGguYWJzKCB2YWx1ZSkgPCAxZS0xMCA/IDAgOiB2YWx1ZTtcclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gZ2V0Q2FtZXJhQ1NTTWF0cml4KCBtYXRyaXgpIHtcclxuXHJcbiAgXHRcdHZhciBlbGVtZW50cyA9IG1hdHJpeC5lbGVtZW50cztcclxuXHJcbiAgXHRcdHJldHVybiAnbWF0cml4M2QoJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDAgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDEgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAyIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMyBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDUgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyA2IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgNyBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDggXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDkgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMCBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDExIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTIgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDEzIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxNSBdKSArXHJcbiAgXHRcdCcpJztcclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gZ2V0T2JqZWN0Q1NTTWF0cml4KCBtYXRyaXgsIGNhbWVyYUNTU01hdHJpeCkge1xyXG5cclxuICBcdFx0dmFyIGVsZW1lbnRzID0gbWF0cml4LmVsZW1lbnRzO1xyXG4gIFx0XHR2YXIgbWF0cml4M2QgPSAnbWF0cml4M2QoJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDAgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMiBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDMgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDUgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDYgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDcgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyA4IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgOSBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDEwIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTEgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMiBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDEzIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxNSBdKSArXHJcbiAgXHRcdCcpJztcclxuXHJcbiAgXHRcdGlmKGlzSUUpIHtcclxuXHJcbiAgXHRcdFx0cmV0dXJuICd0cmFuc2xhdGUoLTUwJSwtNTAlKScgK1xyXG4gIFx0XHRcdFx0J3RyYW5zbGF0ZSgnICsgX3dpZHRoSGFsZiArICdweCwnICsgX2hlaWdodEhhbGYgKyAncHgpJyArXHJcbiAgXHRcdFx0XHRjYW1lcmFDU1NNYXRyaXggK1xyXG4gIFx0XHRcdFx0bWF0cml4M2Q7XHJcblxyXG4gIFx0XHR9XHJcblxyXG4gIFx0XHRyZXR1cm4gJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJyArIG1hdHJpeDNkO1xyXG5cclxuICBcdH1cclxuXHJcbiAgXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBjYW1lcmFDU1NNYXRyaXgpIHtcclxuXHJcbiAgXHRcdGlmKG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkNTUzNET2JqZWN0KSB7XHJcblxyXG4gIFx0XHRcdHZhciBzdHlsZTtcclxuXHJcbiAgXHRcdFx0aWYob2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuQ1NTM0RTcHJpdGUpIHtcclxuICBcdFx0XHRcdG1hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcclxuICBcdFx0XHRcdG1hdHJpeC50cmFuc3Bvc2UoKTtcclxuICBcdFx0XHRcdG1hdHJpeC5jb3B5UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCk7XHJcbiAgXHRcdFx0XHRtYXRyaXguc2NhbGUoIG9iamVjdC5zY2FsZSk7XHJcblxyXG4gIFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWyAzIF0gPSAwO1xyXG4gIFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWyA3IF0gPSAwO1xyXG4gIFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWyAxMSBdID0gMDtcclxuICBcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMTUgXSA9IDE7XHJcblxyXG4gIFx0XHRcdFx0c3R5bGUgPSBnZXRPYmplY3RDU1NNYXRyaXgoIG1hdHJpeCwgY2FtZXJhQ1NTTWF0cml4KTtcclxuXHJcbiAgXHRcdFx0fSBlbHNlIHtcclxuXHJcbiAgXHRcdFx0XHRzdHlsZSA9IGdldE9iamVjdENTU01hdHJpeCggb2JqZWN0Lm1hdHJpeFdvcmxkLCBjYW1lcmFDU1NNYXRyaXgpO1xyXG5cclxuICBcdFx0XHR9XHJcblxyXG4gIFx0XHRcdHZhciBlbGVtZW50ID0gb2JqZWN0LmVsZW1lbnQ7XHJcbiAgXHRcdFx0dmFyIGNhY2hlZFN0eWxlID0gY2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0gJiYgY2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0uc3R5bGU7XHJcblxyXG4gIFx0XHRcdGlmKGNhY2hlZFN0eWxlID09PSB1bmRlZmluZWQgfHwgY2FjaGVkU3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgXHRcdFx0XHRlbGVtZW50LnN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gIFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5Nb3pUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICBcdFx0XHRcdGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcblxyXG4gIFx0XHRcdFx0Y2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0gPSB7IHN0eWxlOiBzdHlsZSB9O1xyXG4gIFx0XHRcdFx0aWYoaXNJRSkge1xyXG4gIFx0XHRcdFx0XHRjYWNoZS5vYmplY3RzWyBvYmplY3QuaWQgXS5kaXN0YW5jZVRvQ2FtZXJhU3F1YXJlZCA9IGdldERpc3RhbmNlVG9TcXVhcmVkKCBjYW1lcmEsIG9iamVjdCk7XHJcbiAgXHRcdFx0XHR9XHJcbiAgXHRcdFx0fVxyXG5cclxuICBcdFx0XHRpZihlbGVtZW50LnBhcmVudE5vZGUgIT09IGNhbWVyYUVsZW1lbnQpIHtcclxuICBcdFx0XHRcdGNhbWVyYUVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsZW1lbnQpO1xyXG4gIFx0XHRcdH1cclxuICBcdFx0fVxyXG5cclxuICBcdFx0Zm9yKHZhciBpID0gMCwgbCA9IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrKSB7XHJcblxyXG4gIFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgY2FtZXJhQ1NTTWF0cml4KTtcclxuXHJcbiAgXHRcdH1cclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0dmFyIGdldERpc3RhbmNlVG9TcXVhcmVkID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICBcdFx0dmFyIGEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHR2YXIgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcblxyXG4gIFx0XHRyZXR1cm4gZnVuY3Rpb24ob2JqZWN0MSwgb2JqZWN0Mikge1xyXG5cclxuICBcdFx0XHRhLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0MS5tYXRyaXhXb3JsZCk7XHJcbiAgXHRcdFx0Yi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdDIubWF0cml4V29ybGQpO1xyXG5cclxuICBcdFx0XHRyZXR1cm4gYS5kaXN0YW5jZVRvU3F1YXJlZCggYik7XHJcblxyXG4gIFx0XHR9O1xyXG5cclxuICBcdH0oKTtcclxuXHJcbiAgXHRmdW5jdGlvbiB6T3JkZXIoIHNjZW5lKSB7XHJcblxyXG4gIFx0XHR2YXIgb3JkZXIgPSBPYmplY3Qua2V5cyggY2FjaGUub2JqZWN0cykuc29ydCggZnVuY3Rpb24oYSwgYikge1xyXG5cclxuICBcdFx0XHRyZXR1cm4gY2FjaGUub2JqZWN0c1sgYSBdLmRpc3RhbmNlVG9DYW1lcmFTcXVhcmVkIC0gY2FjaGUub2JqZWN0c1sgYiBdLmRpc3RhbmNlVG9DYW1lcmFTcXVhcmVkO1xyXG5cclxuICBcdFx0fSk7XHJcbiAgXHRcdHZhciB6TWF4ID0gb3JkZXIubGVuZ3RoO1xyXG5cclxuICBcdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uKG9iamVjdCkge1xyXG5cclxuICBcdFx0XHR2YXIgaW5kZXggPSBvcmRlci5pbmRleE9mKCBvYmplY3QuaWQgKyAnJyk7XHJcblxyXG4gIFx0XHRcdGlmKGluZGV4ICE9PSAtIDEpIHtcclxuXHJcbiAgXHRcdFx0XHRvYmplY3QuZWxlbWVudC5zdHlsZS56SW5kZXggPSB6TWF4IC0gaW5kZXg7XHJcblxyXG4gIFx0XHRcdH1cclxuXHJcbiAgXHRcdH0pO1xyXG5cclxuICBcdH1cclxuXHJcbiAgXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKHNjZW5lLCBjYW1lcmEpIHtcclxuXHJcbiAgXHRcdHZhciBmb3YgPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgNSBdICogX2hlaWdodEhhbGY7XHJcblxyXG4gIFx0XHRpZihjYWNoZS5jYW1lcmEuZm92ICE9PSBmb3YpIHtcclxuXHJcbiAgXHRcdFx0ZG9tRWxlbWVudC5zdHlsZS5XZWJraXRQZXJzcG
13345VjdGl2ZSA9IGZvdiArICdweCc7XHJcbiAgXHRcdFx0ZG9tRWxlbWVudC5zdHlsZS5Nb3pQZXJzcGVjdGl2ZSA9IGZvdiArICdweCc7XHJcbiAgXHRcdFx0ZG9tRWxlbWVudC5zdHlsZS5wZXJzcGVjdGl2ZSA9IGZvdiArICdweCc7XHJcblxyXG4gIFx0XHRcdGNhY2hlLmNhbWVyYS5mb3YgPSBmb3Y7XHJcblxyXG4gIFx0XHR9XHJcblxyXG4gIFx0XHRzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuICBcdFx0aWYoY2FtZXJhLnBhcmVudCA9PT0gbnVsbCkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG4gIFx0XHR2YXIgY2FtZXJhQ1NTTWF0cml4ID0gJ3RyYW5zbGF0ZVooJyArIGZvdiArICdweCknICtcclxuICBcdFx0XHRnZXRDYW1lcmFDU1NNYXRyaXgoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xyXG5cclxuICBcdFx0dmFyIHN0eWxlID0gY2FtZXJhQ1NTTWF0cml4ICtcclxuICBcdFx0XHQndHJhbnNsYXRlKCcgKyBfd2lkdGhIYWxmICsgJ3B4LCcgKyBfaGVpZ2h0SGFsZiArICdweCknO1xyXG5cclxuICBcdFx0aWYoY2FjaGUuY2FtZXJhLnN0eWxlICE9PSBzdHlsZSAmJiAhIGlzSUUpIHtcclxuXHJcbiAgXHRcdFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICBcdFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLk1velRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gIFx0XHRcdGNhbWVyYUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcblxyXG4gIFx0XHRcdGNhY2hlLmNhbWVyYS5zdHlsZSA9IHN0eWxlO1xyXG5cclxuICBcdFx0fVxyXG5cclxuICBcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBjYW1lcmFDU1NNYXRyaXgpO1xyXG5cclxuICBcdFx0aWYoaXNJRSkge1xyXG5cclxuICBcdFx0XHQvLyBJRTEwIGFuZCAxMSBkb2VzIG5vdCBzdXBwb3J0ICdwcmVzZXJ2ZS0zZCcuXHJcbiAgXHRcdFx0Ly8gVGh1cywgei1vcmRlciBpbiAzRCB3aWxsIG5vdCB3b3JrLlxyXG4gIFx0XHRcdC8vIFdlIGhhdmUgdG8gY2FsYyB6LW9yZGVyIG1hbnVhbGx5IGFuZCBzZXQgQ1NTIHotaW5kZXggZm9yIElFLlxyXG4gIFx0XHRcdC8vIEZZSTogei1pbmRleCBjYW4ndCBoYW5kbGUgb2JqZWN0IGludGVyc2VjdGlvblxyXG4gIFx0XHRcdHpPcmRlciggc2NlbmUpO1xyXG5cclxuICBcdFx0fVxyXG5cclxuICBcdH07XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVEhSRUUuQ1NTM0RSZW5kZXJlcjtcclxuXHJcbmNvbnN0IF9DU1MzRE9iamVjdCA9IFRIUkVFLkNTUzNET2JqZWN0LCBfQ1NTM0RTcHJpdGUgPSBUSFJFRS5DU1MzRFNwcml0ZTtcclxuZXhwb3J0IHtcclxuICBfQ1NTM0RPYmplY3QgYXMgQ1NTM0RPYmplY3QsXHJcbiAgX0NTUzNEU3ByaXRlIGFzIENTUzNEU3ByaXRlXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0NTUzNEUmVuZGVyZXIuanMiLCJpbXBvcnQge1RIUkVFLCAkfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IHtDU1MzRE9iamVjdH0gZnJvbSAnLi9DU1MzRFJlbmRlcmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENTU0xheWVyIGV4dGVuZHMgQ1NTM0RPYmplY3Qge1xyXG5cclxuICBzdGF0aWMgZGVsYXk7XHJcbiAgc3RhdGljIHN0eWxlO1xyXG4gIHN0YXRpYyBpbml0KGRvYywgZGVsYXk9MTUwKSB7XHJcbiAgICBDU1NMYXllci5kZWxheSA9IGRlbGF5O1xyXG4gICAgQ1NTTGF5ZXIuc3R5bGUgPSAkKGA8c3R5bGUgdHlwZT10ZXh0L2Nzcz5cclxuICAgICAgLmNzcy1sYXllciB7XHJcbiAgICBcdFx0b3BhY2l0eTogMTtcclxuICAgIFx0XHR0cmFuc2l0aW9uOiBvcGFjaXR5ICR7ZGVsYXl9bXMgZWFzZS1vdXQ7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgXHR9XHJcbiAgICBcdC5jc3MtbGF5ZXIuaGlkZGVuIHtcclxuICAgIFx0XHR0cmFuc2l0aW9uOiBvcGFjaXR5ICR7ZGVsYXl9bXMgZWFzZS1pbiwgdmlzaWJpbGl0eSAke2RlbGF5fW1zIHN0ZXAtZW5kO1xyXG4gICAgXHRcdG9wYWNpdHk6IDA7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgICB9XHJcbiAgICA8L3N0eWxlPmApLmFwcGVuZFRvKGRvYy5oZWFkKTtcclxuICB9XHJcbiAgc3RhdGljIGRpc3Bvc2UoKSB7XHJcbiAgICBDU1NMYXllci5zdHlsZS5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIHByb3BzKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG4gICAgdGhpcy5qQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImhpZGRlbiBjc3MtbGF5ZXJcIj48L2Rpdj4nKTtcclxuICBcdGNvbnN0IHdpZHRoUHhzID0gcHJvcHMud2lkdGgsIGhlaWdodFB4cyA9IGhlaWdodC93aWR0aC
13345p3aWR0aFB4cztcclxuICAgIHRoaXMuakNvbnRhaW5lci53aWR0aCh3aWR0aFB4cykuaGVpZ2h0KGhlaWdodFB4cyk7XHJcbiAgXHR0aGlzLnNjYWxlLnggLz0gd2lkdGhQeHMvd2lkdGg7XHJcbiAgXHR0aGlzLnNjYWxlLnkgLz0gd2lkdGhQeHMvd2lkdGg7XHJcblxyXG4gICAgdGhpcy5zZXREYXRhKCk7XHJcbiAgICB0aGlzLnNldCh0aGlzLmpDb250YWluZXJbMF0pO1xyXG4gIH1cclxuXHJcbiAgY2FsbEludGVybmFsKG5hbWUpIHtcclxuICAgIGlmKHRoaXMub2JqZWN0ICYmIHRoaXMub2JqZWN0W25hbWVdKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5vYmplY3RbbmFtZV0oKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY2xlYXJJbnRlcm5hbHMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFySW50ZXJuYWxzKCkge1xyXG4gICAgdGhpcy5jYWxsSW50ZXJuYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICF0aGlzLmNzcyB8fCB0aGlzLmNzcy5yZW1vdmUoKTtcclxuICAgICF0aGlzLmh0bWwgfHwgdGhpcy5odG1sLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGF0YShjc3M9JycsIGh0bWw9JycsIGpzPScnKSB7XHJcbiAgICB0aGlzLmNsZWFySW50ZXJuYWxzKCk7XHJcblxyXG4gICAgdGhpcy5jc3MgPSAkKGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHtjc3N9PC9zdHlsZT5gKS5hcHBlbmRUbyh0aGlzLmpDb250YWluZXIpO1xyXG4gICAgdGhpcy5odG1sID0gJChodG1sKS5hcHBlbmRUbyh0aGlzLmpDb250YWluZXIpO1xyXG4gICAgY29uc3QgaW5pdCA9IGV2YWwoanMpO1xyXG4gICAgaWYoaW5pdCkge1xyXG4gICAgICB0aGlzLm9iamVjdCA9IGluaXQodGhpcy5qQ29udGFpbmVyLCB0aGlzLnByb3BzKSB8fCB7fTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBlbmRlZENhbGwoY2xiKSB7XHJcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLnRpbWVzdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICBpZih0aW1lc3RhbXA9PT10aGlzLnRpbWVzdGFtcCkge1xyXG4gICAgICAgIGNsYigpO1xyXG4gICAgICB9XHJcbiAgICB9LCBDU1NMYXllci5kZWxheSk7XHJcbiAgfVxyXG5cclxuICBpc0hpZGRlbigpIHtcclxuICAgIHJldHVybiB0aGlzLmpDb250YWluZXIuaGFzQ2xhc3MoJ2hpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBpZighdGhpcy5pc0hpZGRlbigpKSB7XHJcbiAgICAgIHRoaXMuakNvbnRhaW5lci5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgIHRoaXMuY2FsbEludGVybmFsKCdoaWRlJyk7XHJcbiAgICAgIHJlcyA9IG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgICB0aGlzLnBlbmRlZENhbGwoKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxJbnRlcm5hbCgnaGlkZGVuJyk7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlcyA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgaWYodGhpcy5pc0hpZGRlbigpKSB7XHJcbiAgICAgIHRoaXMuakNvbnRhaW5lci5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgIHRoaXMuY2FsbEludGVybmFsKCdzaG93Jyk7XHJcbiAgICAgIHJlcyA9IG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgICB0aGlzLnBlbmRlZENhbGwoKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxJbnRlcm5hbCgnc2hvd24nKTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvQ1NTTGF5ZXIuanMiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBDYWNoZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG1heFNpemU9SW5maW5pdHksIHNpemVvZj1DYWNoZS5jb3VudFNpemVvZikge1xyXG4gICAgdGhpcy5vcyA9IG5ldyBNYXAoKTtcclxuICAgIHRoaXMuc2l6ZW9mID0gc2l6ZW9mO1xyXG4gICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTtcclxuICAgIHRoaXMuc2l6ZSA9IDA7XHJcbiAgfVxyXG5cclxuICBmb3JFYWNoKGNsYikge1xyXG4gICAgdGhpcy5vcy5mb3JFYWNoKCh2LCBrKT0+IGNsYihbayx2XSkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvdW50U2l6ZW9mKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gMTtcclxuICB9XHJcblxyXG4gIHJlbW92ZShrKSB7XHJcbiAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICBjb25zdCB2ID0gdGhpcy5vcy5nZXQoayk7XHJcbiAgICBpZighdi5sb2NrZWQgfHwgIXYubG9ja2VkKGspKSB7XHJcbiAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemVvZih2KTtcclxuICAgICAgaWYodi5kaXNwb3NlKSB7XHJcbiAgICAgICAgdi5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vcy5kZWxldGUoayk7XHJcbiAgICAgIHJlcyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgZnJlZVNwYWNlKCkge1xyXG4gICAgY29uc3QgYXJyID0gW107XHJcbiAgICBmb3IobGV0IHAgb2YgdGhpcy5vcykge1xyXG4gICAgICBhcnIucHVzaCh7dGltZXN0YW1wOiBwWzFdLnRpbWVzdGFtcCwga2V5OiBwWzBdfSk7XHJcbiAgICB9XHJcbiAgICBhcnIuc29ydCgoYSwgYik9PiBhLnRpbWVzdGFtcC1iLnRpbWVzdGFtcCk7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxhcnIubGVuZ3RoICYmIHRoaXMuc2l6ZT4zKnRoaXMubWF4U2l6ZS80OyArK2kpIHtcclxuICAgICAgdGhpcy5yZW1vdmUoYXJyW2ldLmtleSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgY29uc3QgYXJyID0gW107XHJcbiAgICBmb3IobGV0IHAgb2YgdGhpcy5vcykge1xyXG4gICAgICBhcnIucHVzaCh7djogcFsxXSwgazogcFswXX0pO1xyXG4gICAgfVxyXG4gICAgZm9yKGxldCBvIG9mIGFycikge1xyXG4gICAgICBpZihvLnYuZGlzcG9zZSkge1xyXG4gICAgICAgIG8udi5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vcy5kZWxldGUoby5rKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyByZWN1cnNpb25TaXplb2YodmFsdWUpIHtcclxuICAgIGxldCBzaXplID0gMDtcclxuICAgIGlmKHZhbHVlKSB7XHJcbiAgICAgICsrc2l6ZTtcclxuICAgICAgY29uc3QgbGVuID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZihsZW49PT11bmRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGxldCBwIGluIHZhbHVlKSB7XHJcbiAgICAgICAgICBpZih2YWx1ZS
133455oYXNPd25Qcm9wZXJ0eShwKSkge1xyXG4gICAgICAgICAgICBzaXplKz1DYWNoZS5yZWN1cnNpb25TaXplb2YodmFsdWVbcF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzaXplKz1sZW5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNpemU7XHJcbiAgfVxyXG5cclxuICBnZXRUaW1lc3RhbXAoKSB7XHJcbiAgICByZXR1cm4gRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG5cclxuICBnZXQoa2V5KSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMub3MuZ2V0KGtleSk7XHJcbiAgICBpZih2YWx1ZSkge1xyXG4gICAgICB2YWx1ZS50aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHV0KGtleSwgdmFsdWUpIHtcclxuICAgIHZhbHVlLnRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XHJcbiAgICB0aGlzLm9zLnNldChrZXksIHZhbHVlKTtcclxuICAgIHRoaXMuc2l6ZSs9dGhpcy5zaXplb2YodmFsdWUpO1xyXG4gICAgaWYodGhpcy5zaXplPnRoaXMubWF4U2l6ZSkge1xyXG4gICAgICB0aGlzLmZyZWVTcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9DYWNoZS5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG4gIGhhbmRsZURlZmF1bHQoaWQsIGUsIGRhdGEpIHtcclxuICAgIC8vY29uc29sZS5sb2coaWQrJy0nK2UudHlwZSsnLScrZGF0YSk7XHJcbiAgfVxyXG5cclxuICBkaXNwYXRjaEFzeW5jKGUpIHtcclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB0aGlzLmRpc3BhdGNoRXZlbnQoZSkpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Db250cm9sbGVyLmpzIiwiaW1wb3J0IEV2ZW50Q29udmVydGVyIGZyb20gJy4vRXZlbnRDb252ZXJ0ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VzdG9tRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIC8vIGN1c3RvbVxyXG4gIC8vIHRlc3RJbnRlcnNlY3Rpb24oZSwgZGF0YSk7XHJcbiAgLy8gY3VzdG9tLm9iamVjdFxyXG4gIC8vIHRlc3Qob2JqZWN0KTtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGN1c3RvbVRlc3Q9KCk9PiBmYWxzZSwgZURvYykge1xyXG4gICAgc3VwZXIod25kLCBkb2MpO1xyXG5cclxuICAgIHRoaXMuZURvYyA9IGVEb2M7XHJcbiAgICB0aGlzLmN1c3RvbVRlc3QgPSBjdXN0b21UZXN0O1xyXG4gICAgdGhpcy5jdXN0b21zID0gW107XHJcbiAgfVxyXG5cclxuICB0ZXN0KG9iamVjdDEsIG9iamVjdDIpIHtcclxuICAgIHJldHVybiBvYmplY3QxICYmIG9iamVjdDI/IHRoaXMuY3VzdG9tVGVzdChvYmplY3QxLCBvYmplY3QyKTogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRDYWxsYmFjayhvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3QudGFyZ2V0LmNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgYWRkQ3VzdG9tKGN1c3RvbSkge1xyXG4gICAgdGhpcy5jdXN0b21zLnB1c2goY3VzdG9tKTtcclxuICB9XHJcblxyXG4gIGdldE9iamVjdChlLCBkYXRhKSB7XHJcbiAgICBsZXQgb2JqZWN0O1xyXG4gICAgaWYoZGF0YS5kb2M9PT10aGlzLmVEb2MpIHtcclxuICAgICAgZm9yKGxldCBjdXN0b20gb2YgdGhpcy5jdXN0b21zKSB7XHJcbiAgICAgICAgb2JqZWN0ID0gY3VzdG9tLnRlc3RJbnRlcnNlY3Rpb24oZSwgZGF0YSk7XHJcbiAgICAgICAgaWYob2JqZWN0KSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9DdXN0b21FdmVudENvbnZlcnRlci5qcyIsImltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbmRlciB7XHJcblxyXG4gIHN0YXRpYyBERUxJTUlURVIgPSAnICc7XHJcblxyXG4gIHN0YXRpYyBpc0RlbGltZXRyKHMpIHtcclxuICAgIHJldHVybiBzPT09RmluZGVyLkRFTElNSVRFUjtcclxuICB9XHJcblxyXG4gIG1lcmdlKCkge1xyXG4gICAgY29uc3QgYXMgPSBbXSwgbWFwID0gW10sIHN0cnMgPSB0aGlzLnN0cnM7XHJcbiAgICBsZXQgcCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxzdHJzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGlmKHN0cnNbaV0ubGVuZ3RoKSB7XHJcbiAgICAgICAgbWFwLnB1c2goe1xyXG4gICAgICAgICAgYmFzZTogaSxcclxuICAgICAgICAgIG9mZnNldDogcFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFzLnB1c2goc3Ryc1tpXSk7XHJcbiAgICAgICAgcCArPSBzdHJzW2ldLmxlbmd0aDtcclxuICAgICAgICBpZihpPHN0cnMubGVuZ3RoLTEgJiYgIUZpbmRlci5pc0RlbGltZXRyKHN0cnNbaV0uY2hhckF0KHN0cnNbaV0ubGVuZ3RoLTEpKSAmJiAhRmluZGVyLmlzRGVsaW1ldHIoc3Ryc1tpKzFdLmNoYXJBdCgwKSkpIHtcclxuICAgICAgICAgIGFzLnB1c2goRmluZGVyLkRFTElNSVRFUik7XHJcbiAgICAgICAgICArK3A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcCA9IG1hcDtcclxuICAgIHRoaXMuc3RyID0gYXMuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBhZGRIaXRzKHApIHtcclxuICAgIGNvbnN0IGluZm8gPSB0aGlzLm1hcFtVdGlscy5sb3dlckJvdW5kKHRoaXMubWFwLCB7b2Zmc2V0OiBwfSwgKGEsIGIpPT4gYS5vZmZzZXQtYi5vZmZzZXQpXTtcclxuICAgIGxldCBjaGFycyA9IHRoaXMucGF0dGVybi5sZW5ndGgsIGkgPSBpbmZvLmJhc2U7XHJcbiAgICBwIC09IGluZm8ub2Zmc2V0O1xyXG4gICAgd2hpbGUoY2hhcnMpIHtcclxuICAgICAgaWYodGhpcy5zdHJzW2ldLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGRlbGltZXRlciA9IGk8dGhpcy5zdHJzLmxlbmd0aC0xICYmICFGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cnNbaV0uY2hhckF0KHRoaXMuc3Ryc1tpXS5sZW5ndGgtMSkpICYmICFGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cnNbaSsxXS5jaGFyQXQoMCkpLFxyXG4gICAgICAgICAgICAgIGxlbmd0aCA9IE1hdGgubWluKHRoaXMuc3Ryc1tpXS5sZW5ndGgrKGRlbGltZXRlcj8gMTogMCktcCwgY2hhcnMpO1xyXG4gICAgICAgIGlmKHA8dGhpcy5zdHJzW2ldLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5oaXRzLnB1c2goe1xyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgb2Zmc2V0OiBwLFxyXG4gICAgICAgICAgICBsZW5ndGg6IE1hdGgubWluKGxlbmd0aCwgdGhpcy5zdHJzW2ldLmxlbmd0aC1wKSxcclxuICAgICAgICAgI
13345H0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGFycyAtPSBsZW5ndGg7XHJcbiAgICAgICAgKytpO1xyXG4gICAgICAgIHAgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb250ZXh0KHApIHtcclxuICAgIGxldCBmID0gcCwgbCA9IHArdGhpcy5wYXR0ZXJuLmxlbmd0aC0xLCBkZWxzID0gdGhpcy5wcm9wcy5jb250ZXh0TGVuZ3RoLCBwcmV2RGVscyA9IGRlbHMrMTtcclxuICAgIHdoaWxlKGRlbHMgJiYgcHJldkRlbHMtZGVscykge1xyXG4gICAgICBwcmV2RGVscyA9IGRlbHM7XHJcbiAgICAgIGlmKGRlbHMlMikge1xyXG4gICAgICAgIGZvcihsZXQgaT1mLTI7IGk+PTA7IC0taSkge1xyXG4gICAgICAgICAgaWYoRmluZGVyLmlzRGVsaW1ldHIodGhpcy5zdHJbaV0pIHx8IGk9PT0wKSB7XHJcbiAgICAgICAgICAgIGYgPSBpPT09MD8gMDogaSsxO1xyXG4gICAgICAgICAgICAtLWRlbHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmb3IobGV0IGk9bCsyOyBpPHRoaXMuc3RyLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICBpZihGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cltpXSkgfHwgaT09PXRoaXMuc3RyLmxlbmd0aC0xKSB7XHJcbiAgICAgICAgICAgIGwgPSBpPT09dGhpcy5zdHIubGVuZ3RoLTE/IGk9PT10aGlzLnN0ci5sZW5ndGgtMTogaS0xO1xyXG4gICAgICAgICAgICAtLWRlbHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jb250ZXh0cy5wdXNoKHRoaXMuc3RyLnN1YnN0cihmLCBsLWYrMSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SGl0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpdHM7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHRzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlZmF1bHRzID0ge1xyXG4gICAgY29udGV4dExlbmd0aDogNyxcclxuICAgIGhpdHM6IHRydWUsXHJcbiAgICBjb250ZXh0czogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHN0cnMsIHBhdHRlcm4sIHByb3BzKSB7XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAuLi5GaW5kZXIuZGVmYXVsdHMsXHJcbiAgICAgIC4uLnByb3BzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdHJzID0gc3RycztcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1lcmdlKHN0cnMpO1xyXG4gICAgdGhpcy5oaXRzID0gW107XHJcbiAgICB0aGlzLmNvbnRleHRzID0gW107XHJcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLmxzdHIgPSB0aGlzLnN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgd2hpbGUodHJ1ZSkge1xyXG4gICAgICBwID0gdGhpcy5sc3RyLmluZGV4T2YodGhpcy5wYXR0ZXJuLCBwKTtcclxuICAgICAgaWYocD09PS0xKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRIaXRzKHApO1xyXG4gICAgICAgIHRoaXMuYWRkQ29udGV4dChwKTtcclxuICAgICAgICBwICs9IHRoaXMucGF0dGVybi5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRmluZGVyLmpzIiwiaW1wb3J0IHtQREZKU30gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcblBERkpTLndvcmtlclNyYyA9ICh3aW5kb3cuUERGSlNfTE9DQUxFPyBQREZKU19MT0NBTEU6IEdMT0JBTF9QQVRIUykucGRmSnNXb3JrZXI7XHJcblBERkpTLmNNYXBVcmwgPSAod2luZG93LlBERkpTX0xPQ0FMRT8gUERGSlNfTE9DQUxFOiBHTE9CQUxfUEFUSFMpLnBkZkpzQ01hcFVybDtcclxuUERGSlMuY01hcFBhY2tlZCA9IHRydWU7XHJcblBERkpTLmRpc2FibGVBdXRvRmV0Y2ggPSB0cnVlO1xyXG5QREZKUy5kaXNhYmxlU3RyZWFtID0gdHJ1ZTtcclxuUERGSlMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gJ2ltYWdlcy9wZGZqcy8nO1xyXG5QREZKUy5leHRlcm5hbExpbmtUYXJnZXQgPSBQREZKUy5MaW5rVGFyZ2V0LkJMQU5LO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGRmIHtcclxuXHJcbiAgY29uc3RydWN0b3Ioc3JjLCBsb2FkaW5nUHJvZ3Jlc3MpIHtcclxuICAgIHRoaXMuc3JjID0gVXRpbHMubm9ybWFsaXplVXJsKHNyYyk7XHJcbiAgICB0aGlzLmhhbmRsZXJRdWV1ZSA9IFtdO1xyXG4gICAgdGhpcy5wcm9ncmVzRGF0YSA9IHtsb2FkZWQ6IC0xLCB0b3RhbDogMX07XHJcbiAgICB0aGlzLmxvYWRpbmdQcm9ncmVzcyA9IGxvYWRpbmdQcm9ncmVzcztcclxuXHJcbiAgICB0aGlzLnRhc2sgPSBQREZKUy5nZXREb2N1bWVudCh7XHJcbiAgICAgIHVybDogdGhpcy5zcmMsXHJcbiAgICAgIHJhbmdlQ2h1bmtTaXplOiA1MTIqMTAyNFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRhc2sub25Qcm9ncmVzcyA9IChkYXRhKT0+IHtcclxuICAgICAgaWYodGhpcy5sb2FkaW5nUHJvZ3Jlc3MpIHtcclxuICAgICAgICBsZXQgY3VyID0gTWF0aC5mbG9vcigxMDAqZGF0YS5sb2FkZWQvZGF0YS50b3RhbCksXHJcbiAgICAgICAgICAgICAgb2xkID0gTWF0aC5mbG9vcigxMDAqdGhpcy5wcm9ncmVzRGF0YS5sb2FkZWQvdGhpcy5wcm9ncmVzRGF0YS50b3RhbCk7XHJcbiAgICAgICAgaWYoY3VyIT09b2xkKSB7XHJcbiAgICAgICAgICBjdXIgPSBpc05hTihjdXIpPyAwOiBjdXI7XHJcbiAgICAgICAgICBjdXIgPSBjdXI+MTAwPyAxMDA6IGN1cjtcclxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1Byb2dyZXNzKGN1cik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wcm9ncmVzRGF0YSA9IGRhdGE7XHJcbiAgICB9O1xyXG4gICAgdGhpcy50YXNrLnRoZW4oKGhhbmRsZXIpPT4ge1xyXG4gICAgICBpZihoYW5kbGVyLm51bVBhZ2VzPjEpIHtcclxuICAgICAgICBQcm9taXNlLmFsbChbaGFuZGxlci5nZXRQYWdlKDEpLCBoYW5kbGVyLmdldFBhZ2UoMildKS5cclxuICAgICAgICB0aGVuKChwYWdlcyk9PiB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoaGFuZGxlciwgcGFnZXMpO1xyXG4gICAgICAgI
13345H0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaW5pdChoYW5kbGVyKTtcclxuICAgICAgfVxyXG4gICAgfSkuXHJcbiAgICBjYXRjaCgoZSk9PiBjb25zb2xlLmVycm9yKGUpKTtcclxuICB9XHJcblxyXG4gIGluaXQoaGFuZGxlciwgcGFnZXMpIHtcclxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XHJcbiAgICB0aGlzLmRvdWJsZWRQYWdlcyA9IHBhZ2VzPyAoTWF0aC5hYnMoMipQZGYuZ2V0UGFnZVNpemUocGFnZXNbMF0pLndpZHRoLVBkZi5nZXRQYWdlU2l6ZShwYWdlc1sxXSkud2lkdGgpL1BkZi5nZXRQYWdlU2l6ZShwYWdlc1swXSkud2lkdGg8MC4wMSk6IGZhbHNlO1xyXG4gICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoaGFuZGxlcik7XHJcbiAgICBmb3IobGV0IGNsYiBvZiB0aGlzLmhhbmRsZXJRdWV1ZS5yZXZlcnNlKCkpIHtcclxuICAgICAgZG9uZSA9IGRvbmUudGhlbigoaGFuZGxlcik9PiB7XHJcbiAgICAgICAgY2xiKGhhbmRsZXIpO1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVyO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBhZ2VUeXBlKG4pIHtcclxuICAgIHJldHVybiAhdGhpcy5kb3VibGVkUGFnZXMgfHwgbj09PTAgfHwgbj09PXRoaXMuZ2V0UGFnZXNOdW0oKS0xPyAnZnVsbCc6IChuJjE/ICdsZWZ0JzogJ3JpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlKG4pIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIuZ2V0UGFnZSh0aGlzLmRvdWJsZWRQYWdlcz8gTWF0aC5jZWlsKG4vMikrMTogbisxKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJRdWV1ZS5zcGxpY2UoMCwgdGhpcy5oYW5kbGVyUXVldWUubGVuZ3RoKTtcclxuICAgIGRlbGV0ZSB0aGlzLmhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBzZXRMb2FkaW5nUHJvZ3Jlc3NDbGIoY2xiKSB7XHJcbiAgICB0aGlzLmxvYWRpbmdQcm9ncmVzcyA9IGNsYjtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VzTnVtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcj8gKHRoaXMuZG91YmxlZFBhZ2VzPyAyKih0aGlzLmhhbmRsZXIubnVtUGFnZXMtMSk6IHRoaXMuaGFuZGxlci5udW1QYWdlcyk6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRQYWdlU2l6ZShwYWdlKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogcGFnZS52aWV3WzJdLXBhZ2Uudmlld1swXSxcclxuICAgICAgaGVpZ2h0OiBwYWdlLnZpZXdbM10tcGFnZS52aWV3WzFdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbi8vICAgaWYocGFnZXM+MSkge1xyXG4vLyAgIGhhbmRsZXIuZ2V0UGFnZSgyKS5cclxuLy8gICB0aGVuKChwYWdlKT0+IHtcclxuLy8gICAgIGNvbnN0IHNpemUxID0gUGRmLmdldFBhZ2VTaXplKHBhZ2UpO1xyXG4vLyAgICAgdGhpcy5wcm9wcy5kb3VibGVkUGFnZXMgPSAyKnNpemUwLndpZHRoPT09c2l6ZTEud2lkdGg7XHJcbi8vICAgICB0aGlzLnJlYWR5KCk7XHJcbi8vICAgfSkuXHJcbi8vICAgY2F0Y2goKCk9PiB0aGlzLnJlYWR5KCkpO1xyXG4vLyB9XHJcbi8vIGVsc2Uge1xyXG5cclxuICBnZXRIYW5kbGVyKGNsYikge1xyXG4gICAgaWYodGhpcy5oYW5kbGVyKSB7XHJcbiAgICAgIGNsYih0aGlzLmhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlclF1ZXVlLnB1c2goY2xiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1BkZi5qcyIsImltcG9ydCB7VEhSRUUsICR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVFdmVudENvbnZlcnRlckZzIHtcclxuXHJcbiAgc3RhdGljIG9iamVjdHNUZXN0KG9iamVjdDEsIG9iamVjdDIpIHtcclxuICAgIHJldHVybiBvYmplY3QxICYmIG9iamVjdDI/IG9iamVjdDEub2JqZWN0PT09b2JqZWN0Mi5vYmplY3Q6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG9iamVjdHNBbmRGYWNlc1Rlc3Qob2JqZWN0MSwgb2JqZWN0Mikge1xyXG4gICAgcmV0dXJuIG9iamVjdDEgJiYgb2JqZWN0Mj8gb2JqZWN0MS5vYmplY3Q9PT1vYmplY3QyLm9iamVjdCAmJi
13345BvYmplY3QxLmZhY2UubWF0ZXJpYWxJbmRleD09PW9iamVjdDIuZmFjZS5tYXRlcmlhbEluZGV4OiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbFdvcmxkLCB0ZXN0PVRocmVlRXZlbnRDb252ZXJ0ZXJGcy5vYmplY3RzQW5kRmFjZXNUZXN0KSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbFdvcmxkO1xyXG4gICAgdGhpcy5jb29yZHMgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIgPSB0aGlzLnZpc3VhbC5yYXljYXN0ZXI7XHJcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlzdWFsLmNhbWVyYTtcclxuICAgIHRoaXMudGhyZWVzID0gW107XHJcbiAgICB0aGlzLnRlc3QgPSB0ZXN0O1xyXG4gIH1cclxuXHJcbiAgYWRkVGhyZWUodGhyZWUpIHtcclxuICAgIHRoaXMudGhyZWVzLnB1c2godGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhyZWUodGhyZWUpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnRocmVlcy5pbmRleE9mKHRocmVlKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMudGhyZWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE9iamVjdChlKSB7XHJcbiAgICB0aGlzLnNldENvb3Jkc0Zyb21FdmVudChlKTtcclxuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5jb29yZHMsIHRoaXMuY2FtZXJhKTtcclxuICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGhyZWVzKTtcclxuICAgIHJldHVybiBpbnRlcnNlY3RzWzBdO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaHJlZVV0aWxzIHtcclxuXHJcbiAgc3RhdGljIHZlcnRpY2VzMlVWcyh2ZXJ0aWNlcywgaW5kZWNlcywgZmlyc3QsIGxhc3QsIGNvbnZlckNsYikge1xyXG4gICAgY29uc3QgciA9IFtdO1xyXG4gICAgZm9yKGxldCBpID0gZmlyc3Q7IGk8bGFzdDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZpcyA9IFtpbmRlY2VzW2ldLmEsaW5kZWNlc1tpXS5iLGluZGVjZXNbaV0uY107XHJcbiAgICAgIGZvcihsZXQgaiA9IDA7IGo8dmlzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYoIXJbdmlzW2pdXSkge1xyXG4gICAgICAgICAgclt2aXNbal1dID0gY29udmVyQ2xiKHZlcnRpY2VzW3Zpc1tqXV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29tcHV0ZUZhY2VWZXJ0ZXhVdnMoZ2VvbWV0cnksIGZhY2VzKSB7XHJcbiAgICBjb25zdCB1dnMgPSBbXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIDAsIGZhY2VzWzBdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKHAueCwgMS1wLnopKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbMF0sIGZhY2VzWzFdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKDEtcC54LCAxLXAueikpLFxyXG4gICAgICAgICAgICAgICAgVGhyZWVVdGlscy52ZXJ0aWNlczJVVnMoZ2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LmZhY2VzLCBmYWNlc1sxXSwgZmFjZXNbMl0sIChwKT0+bmV3IFRIUkVFLlZlY3RvcjIocC54LCBwLnkpKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbMl0sIGZhY2VzWzNdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKDEtcC54LCBwLnkpKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbM10sIGZhY2VzWzRdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKHAueiwgcC55KSksXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIGZhY2VzWzRdLCBnZW9tZXRyeS5mYWNlcy5sZW5ndGgsIChwKT0+bmV3IFRIUkVFLlZlY3RvcjIoMS1wLnosIHAueSkpXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCB1dnNpID0gMDtcclxuICAgIGZvcihsZXQgaSA9IDA7IGk8Z2VvbWV0cnkuZmFjZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgdXZzaSArPSBmYWNlc1t1dnNpXSA9PT0gaTtcclxuICAgICAgY29uc3QgZiA9IGdlb21ldHJ5LmZhY2VzW2ldO1xyXG4gICAgICBmLm1hdGVyaWFsSW5kZXggPSB1dnNpO1xyXG4gICAgICBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWzBdW2ldID0gW3V2c1t1dnNpXVtmLmFdLCB1dnNbdXZzaV1bZi5iXSwgdXZzW3V2c2ldW2YuY11dO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZU1hcmtlcihwLCBjLCBzaXplKSB7XHJcbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoc2l6ZSksIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiBjIH0pKTtcclxuICAgIG1hcmtlci5wb3NpdGlvbi5zZXQocC54LHAueSxwLnopO1xyXG4gICAgcmV0dXJuIG1hcmtlcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaW5kVXZUcmlzKGdlb21ldHJ5LCBwcywgZmlyc3QsIGxhc3QpIHtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgZm9yKGxldCBwIG9mIHBzKSB7XHJcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICBmb3IobGV0IGk9Zmlyc3Q7IGk8bGFzdCAmJiAhZm91bmQ7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IHRyaSA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbMF1baV07XHJcbiAgICAgICAgaWYoQmFzZU1hdGhVdGlscy5pc0luc2lkZUNvbnZQb2x5KHRyaSwgcCkpIHtcclxuICAgICAgICAgI
13345HJlcy5wdXNoKHtcclxuICAgICAgICAgICAgY29lZnM6IEJhc2VNYXRoVXRpbHMuY29tcHV0ZUludGVycENvZWZzKHRyaSwgcCksXHJcbiAgICAgICAgICAgIGlcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZighZm91bmQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdCYWQgcG9pbnQnKTtcclxuICAgICAgICByZXMucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZpbmRJbnRlcm5hbFZlcnRpY2VzKGdlb21ldHJ5LCBwcywgZmlyc3QsIGxhc3QpIHtcclxuICAgIGNvbnN0IHJlcyA9IHt9O1xyXG4gICAgZm9yKGxldCBpPWZpcnN0OyBpPGxhc3Q7ICsraSkge1xyXG4gICAgICBjb25zdCB0cmkgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWzBdW2ldLCBmID0gZ2VvbWV0cnkuZmFjZXNbaV0sIHZzID0gW2YuYSwgZi5iLCBmLmNdO1xyXG4gICAgICBmb3IobGV0IGo9MDsgajx0cmkubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZihyZXNbdnNbal1dPT09dW5kZWZpbmVkICYmIEJhc2VNYXRoVXRpbHMuaXNJbnNpZGVQb2x5KHBzLCB0cmlbal0pKSB7XHJcbiAgICAgICAgICByZXNbdnNbal1dID0ge1xyXG4gICAgICAgICAgICBwOiB0cmlbal0sXHJcbiAgICAgICAgICAgIGk6IHZzW2pdLFxyXG4gICAgICAgICAgICBuOiBmLnZlcnRleE5vcm1hbHNbal1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZXMpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVVdGlscy5qcyIsIlxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYXJnZXQge1xyXG5cclxuICBzdGF0aWMgdGVzdChvYmplY3QxLCBvYmplY3QyKSB7XHJcbiAgICByZXR1cm4gb2JqZWN0MS50YXJnZXQ9PT1vYmplY3QyLnRhcmdldDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvVGFyZ2V0LmpzIiwiaW1wb3J0IHskLCB0cn0gZnJvbSAnLi9qcy9saWJzJztcclxuaW1wb3J0IERldGVjdG9yIGZyb20gJ0RldGVjdG9yJztcclxuaW1wb3J0IFZpc3VhbFdvcmxkIGZyb20gJ1Zpc3VhbFdvcmxkJztcclxuaW1wb3J0IFBkZkxpbmtzSGFuZGxlciBmcm9tICcuL2pzL2NsYXNzZXMvUGRmTGlua3NIYW5kbGVyJztcclxuaW1wb3J0IEJvb2sgZnJvbSAnLi9qcy9jbGFzc2VzL0Jvb2snO1xyXG5pbXBvcnQgQm9va1ZpZXcgZnJvbSAnLi9qcy9jbGFzc2VzL0Jvb2tWaWV3JztcclxuaW1wb3J0IEJvb2tDb250cm9sbGVyIGZyb20gJy4vanMvY2xhc3Nlcy9Cb29rQ29udHJvbGxlcic7XHJcbmltcG9ydCBQZGZCb29rUHJvcHNCdWlsZGVyIGZyb20gJy4vanMvY2xhc3Nlcy9QZGZCb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IENsYkJvb2tQcm9wc0J1aWxkZXIgZnJvbSAnLi9qcy9jbGFzc2VzL0NsYkJvb2tQcm9wc0J1aWxkZXInO1xyXG5pbXBvcnQgTG9h
13345ZGluZ0NvbnRyb2xsZXIgZnJvbSAnTG9hZGluZ0NvbnRyb2xsZXInO1xyXG5pbXBvcnQgU2VhcmNoIGZyb20gJ1NlYXJjaCc7XHJcbmltcG9ydCBCb29rbWFya3MgZnJvbSAnQm9va21hcmtzJztcclxuaW1wb3J0IFRodW1ibmFpbHMgZnJvbSAnVGh1bWJuYWlscyc7XHJcbmltcG9ydCBUb2NDb250cm9sbGVyIGZyb20gJy4vanMvY2xhc3Nlcy9Ub2NDb250cm9sbGVyJztcclxuaW1wb3J0IEJvb2tQcmludGVyIGZyb20gJy4vanMvY2xhc3Nlcy9Cb29rUHJpbnRlcic7XHJcbmltcG9ydCBBdXRvTmF2aWdhdG9yIGZyb20gJy4vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yJztcclxuaW1wb3J0IFNvdW5kc0Vudmlyb21lbnQgZnJvbSAnLi9qcy9jbGFzc2VzL1NvdW5kc0Vudmlyb21lbnQnO1xyXG5cclxuJC5mbi5GbGlwQm9vayA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICBjb25zdCBzY2VuZSA9IHtcclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgIGlmKHRoaXMucmVhZHkpIHtcclxuICAgICAgICAhc2NlbmUucGRmTGlua3NIYW5kbGVyIHx8IHNjZW5lLnBkZkxpbmtzSGFuZGxlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnBkZkxpbmtzSGFuZGxlcjtcclxuICAgICAgICBzY2VuZS5zb3VuZHMuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5zb3VuZHM7XHJcbiAgICAgICAgc2NlbmUudG9jQ3RybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnRvY0N0cmw7XHJcbiAgICAgICAgc2NlbmUudGh1bWJuYWlscy5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnRodW1ibmFpbHM7XHJcbiAgICAgICAgIXNjZW5lLmJvb2ttYXJrcyB8fCBzY2VuZS5ib29rbWFya3MuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5ib29rbWFya3M7XHJcbiAgICAgICAgc2NlbmUuY3RybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmN0cmw7XHJcbiAgICAgICAgc2NlbmUuYm9va1ByaW50ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5ib29rUHJpbnRlcjtcclxuICAgICAgICBzY2VuZS5ib29rLmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUuYm9vaztcclxuICAgICAgICBzY2VuZS5wcm9wc0J1aWxkZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5wcm9wc0J1aWxkZXI7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmJvb2tCdWlsZGVyO1xyXG4gICAgICAgIHNjZW5lLnZpc3VhbC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnZpc3VhbDtcclxuICAgICAgICBzY2VuZS52aWV3LmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUudmlldztcclxuICAgICAgICBkZWxldGUgc2NlbmUuZGlzcG9zZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdEaXNwb3NlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcclxuICBzY2VuZS52aWV3ID0gbmV3IEJvb2tWaWV3KHRoaXMubGVuZ3RoPyB0aGlzWzBdOiAkKCc8ZGl2PicpLmFwcGVuZFRvKCdib2R5JyksICgpPT4ge1xyXG4gICAgaWYoIURldGVjdG9yLndlYmdsKSB7XHJcbiAgICAgIERldGVjdG9yLmFkZEdldFdlYkdMTWVzc2FnZSh7cGFyZW50OiBzY2VuZS52aWV3LmdldFZpZXcoKX0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNjZW5lLmxvYWRpbmdDdHJsID0gbmV3IExvYWRpbmdDb250cm9sbGVyKHNjZW5lLnZpZXcsIHRydWUsIChwcm9ncmVzcyk9PiBwcm9ncmVzcz09PTA/IHRyKCdQbGVhc2Ugd2FpdC4uLiB0aGUgQXBwbGljYXRpb24gaXMgTG9hZGluZycpOiB0cignUERGIGlzIExvYWRpbmc6JykrJyAnK3Byb2dyZXNzKyclJyk7XHJcbiAgICAgIHNjZW5lLnZpc3VhbCA9IG5ldyBWaXN1YWxXb3JsZChzY2VuZS52aWV3LmdldENvbnRhaW5lcigpLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsIHNjZW5lLnZpZXcuZ2V0Q29udGFpbmVyKCkub3duZXJEb2N1bWVudCwgc2NlbmUudmlldy5nZXRWaWV3KCkpO1xyXG4gICAgICBzY2VuZS5ib29rQnVpbGRlciA9IChwcm9wcywgc2hlZXRzLCBwYWdlQ2FsbGJhY2spPT4ge1xyXG4gICAgICAgIHByb3BzLmNzc0xheWVyUHJvcHMgPSB7XHJcbiAgICAgICAgICAuLi5wcm9wcy5jc3NMYXllclByb3BzLFxyXG4gICAgICAgICAgc2NlbmVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKG9wdGlvbnMucHJvcGVydGllc0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICBwcm9wcyA9IG9wdGlvbnMucHJvcGVydGllc0NhbGxiYWNrKHByb3BzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2NlbmUuYm9vayA9IG5ldyBCb29rKHNjZW5lLnZpc3VhbCwgc2hlZXRzLCBwYWdlQ2FsbGJhY2ssIHByb3BzKTtcclxuICAgICAgICBzY2VuZS5ib29rUHJpbnRlciA9IG5ldyBCb29rUHJpbnRlcihzY2VuZS52aXN1YWwsIHNjZW5lLmJvb2ssIChvcHRpb25zLnRlbXBsYXRlIHx8IHt9KS5wcmludFN0eWxlKTtcclxuICAgICAgICBzY2VuZS5sb2FkaW5nQ3RybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmxvYWRpbmdDdHJsO1xyXG4gICAgICAgIHNjZW5lLmN0cmwgPSBuZXcgQm9va0NvbnRyb2xsZXIoc2NlbmUuYm9vaywgc2NlbmUudmlldywgb3B0aW9ucy5jb250cm9sc1Byb3BzKTtcclxuICAgICAgICBzY2VuZS5ib29rLnNldEluamVjdG9yKCh3KT0+IHtcclxuICAgICAgICAgIHcualF1ZXJ5ID0gdy4kID0gJDtcclxuICAgICAgICAgIHcuYm9vayA9IHNjZW5lLmJvb2s7XHJcbiAgICAgICAgICB3LmJvb2tDdHJsID0gc2NlbmUuY3RybDtcclxuICAgICAgICAgIGlmKHByb3BzLmluamVjdG9yKSB7XHJcbiAgICAgICAgICAgIHByb3BzLmluamVjdG9yKHcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNjZW5lLnZpZXcuYWRkSGFuZGxlcihzY2VuZS5jdHJsKTtcclxuICAgICAgICBzY2VuZS5jdHJsLnNldFByaW50ZXIoc2NlbmUuYm9va1ByaW50ZXIpO1xyXG4gICAgICAgIGNvbnN0IHRlc3QgPSBwYWdlQ2FsbGJhY2soMCk7XHJcblxyXG4gICAgICAgI
13345HNjZW5lLnNlYXJjaCA9IG5ldyBTZWFyY2goc2NlbmUudmlldy5nZXRTZWFyY2hWaWV3KCksIHNjZW5lLmJvb2suZ2V0UGFnZXMoKSk7XHJcbiAgICAgICAgc2NlbmUuc2VhcmNoLm9uUXVlcnkgPSBzY2VuZS5ib29rLnNldFF1ZXJ5LmJpbmQoc2NlbmUuYm9vayk7XHJcbiAgICAgICAgc2NlbmUuYm9vay5hZGRFdmVudExpc3RlbmVyKCdzZWFyY2hSZXN1bHRzJywgKGUpPT4ge1xyXG4gICAgICAgICAgc2NlbmUuc2VhcmNoLnNldFJlc3VsdHMoZS5yZXN1bHRzLCBlLmxhc3RQYWdlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2NlbmUudGh1bWJuYWlscyA9IG5ldyBUaHVtYm5haWxzKHNjZW5lLnZpc3VhbCwgc2NlbmUudmlldy5nZXRUaHVtYm5haWxzVmlldygpLCBwYWdlQ2FsbGJhY2ssIDIqKHNoZWV0cysyKSwge2tXdG9IOiBwcm9wcy53aWR0aC9wcm9wcy5oZWlnaHR9KTtcclxuICAgICAgICBzY2VuZS50b2NDdHJsID0gbmV3IFRvY0NvbnRyb2xsZXIoc2NlbmUudmlldywgc2NlbmUuY3RybCk7XHJcbiAgICAgICAgc2NlbmUudG9jQ3RybC5zZXRUaHVtYm5haWxzKHNjZW5lLnRodW1ibmFpbHMpO1xyXG4gICAgICAgIHNjZW5lLnRvY0N0cmwuc2V0U2VhcmNoKHNjZW5lLnNlYXJjaCk7XHJcbiAgICAgICAgc2NlbmUuY3RybC5zZXRUb2NDdHJsKHNjZW5lLnRvY0N0cmwpO1xyXG4gICAgICAgIHNjZW5lLnZpZXcuYWRkSGFuZGxlcihzY2VuZS50b2NDdHJsKTtcclxuXHJcbiAgICAgICAgaWYodGVzdC50eXBlPT09J3BkZicpIHtcclxuICAgICAgICAgIHNjZW5lLnBkZkxpbmtzSGFuZGxlciA9IG5ldyBQZGZMaW5rc0hhbmRsZXIodGVzdC5zcmMsIHNjZW5lLmN0cmwsIHNjZW5lLnZpc3VhbC5lbGVtZW50KTtcclxuICAgICAgICAgIHNjZW5lLmJvb2suYWRkRXZlbnRMaXN0ZW5lcigncGRmQW5ub3RhdGlvbicsIHNjZW5lLnBkZkxpbmtzSGFuZGxlci5oYW5kbGVFdmVudC5iaW5kKHNjZW5lLnBkZkxpbmtzSGFuZGxlcikpO1xyXG4gICAgICAgICAgdGVzdC5zcmMuZ2V0SGFuZGxlcigoaGFuZGxlcik9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIuZ2V0T3V0bGluZSgpLlxyXG4gICAgICAgICAgICAgIHRoZW4oKG91dGxpbmUpPT4ge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuYm9va21hcmtzID0gbmV3IEJvb2ttYXJrcyhzY2VuZS52aWV3LmdldEJvb2ttYXJrc1ZpZXcoKSwgb3V0bGluZSk7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS50b2NDdHJsLnNldEJvb2ttYXJrcyhzY2VuZS5ib29rbWFya3MsIHRlc3Quc3JjKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYob3B0aW9ucy5wZGZMaW5rcyAmJiBvcHRpb25zLnBkZkxpbmtzLmhhbmRsZXIpIHtcclxuICAgICAgICAgICAgc2NlbmUucGRmTGlua3NIYW5kbGVyLnNldEhhbmRsZXIob3B0aW9ucy5wZGZMaW5rcy5oYW5kbGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjZW5lLnNvdW5kcyA9IG5ldyBTb3VuZHNFbnZpcm9tZW50KG9wdGlvbnMudGVtcGxhdGUpO1xyXG4gICAgICAgIHNjZW5lLmN0cmwuc2V0U291bmRzKHNjZW5lLnNvdW5kcyk7XHJcbiAgICAgICAgc2NlbmUuc291bmRzLnN1YnNjcmliZUZsaXBzKHNjZW5lLmN0cmwpO1xyXG5cclxuICAgICAgICBzY2VuZS5yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgbmV3IEF1dG9OYXZpZ2F0b3Ioc2NlbmUudmlzdWFsLCBzY2VuZS5jdHJsLCBvcHRpb25zLmF1dG9OYXZpZ2F0aW9uKS5kaXNwb3NlKCk7XHJcbiAgICAgICAgaWYob3B0aW9ucy5yZWFkeSkge1xyXG4gICAgICAgICAgb3B0aW9ucy5yZWFkeShzY2VuZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHNjZW5lLnBlbmRpbmdEaXNwb3NlKSB7XHJcbiAgICAgICAgICBzY2VuZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBpZihvcHRpb25zLnBkZikge1xyXG4gICAgICAgIHNjZW5lLnByb3BzQnVpbGRlciA9IG5ldyBQZGZCb29rUHJvcHNCdWlsZGVyKG9wdGlvbnMucGRmLCBzY2VuZS5ib29rQnVpbGRlcik7XHJcbiAgICAgICAgc2NlbmUucHJvcHNCdWlsZGVyLnBkZi5zZXRMb2FkaW5nUHJvZ3Jlc3NDbGIoc2NlbmUubG9hZGluZ0N0cmwuc2V0UHJvZ3Jlc3MuYmluZChzY2VuZS5sb2FkaW5nQ3RybCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYob3B0aW9ucy5wYWdlQ2FsbGJhY2spIHtcclxuICAgICAgICBzY2VuZS5wcm9wc0J1aWxkZXIgPSBuZXcgQ2xiQm9va1Byb3BzQnVpbGRlcihzY2VuZS52aXN1YWwsIG9wdGlvbnMucGFnZUNhbGxiYWNrLCBvcHRpb25zLnBhZ2VzLCBzY2VuZS5ib29rQnVpbGRlcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2NlbmUucHJvcHNCdWlsZGVyID0gbmV3IENsYkJvb2tQcm9wc0J1aWxkZXIoc2NlbmUudmlzdWFsLCBCb29rLnBhZ2VDYWxsYmFjaywgNiwgc2NlbmUuYm9va0J1aWxkZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSwgb3B0aW9ucy50ZW1wbGF0ZSk7XHJcbiAgcmV0dXJuIHNjZW5lO1xyXG59XHJcblxyXG4kKCgpPT4ge1xyXG4gIGxldCBjb250YWluZXJzID0gJCgnLmZsaXAtYm9vay1jb250YWluZXInKTtcclxuICBmb3IobGV0IGkgPSAwOyBpPGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHtcclxuICAgIGNvbnN0IGpDb250YWluZXIgPSAkKGNvbnRhaW5lcnNbaV0pLCBzcmMgPSBqQ29udGFpbmVyLmF0dHIoJ3NyYycpO1xyXG4gICAgaWYoISFzcmMpIHtcclxuICAgICAgakNvbnRhaW5lci5GbGlwQm9vayh7cGRmOiBzcmN9KTtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxud2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0gJDtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaW5kZXguanMiLCJpZiAoIUFycmF5LnByb3RvdHlwZS5maWxsKSB7XHJcbiAgQXJyYXkucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG5cclxuICAgIC8vINCo0LDQs9C4IDEtMi5cclxuICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBudWxsIG9yIG5vdCBkZWZpbmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIE8gPSBPYmplY3QodGhpcyk7XHJcblxyXG4gICAgLy8g0KjQsNCz0LggMy01LlxyXG4gICAgdmFyIGxlbiA9IE8ubGVuZ3RoID4+PiAwO1xyXG5cclxuICAgIC8vINCo0LDQs9C4IDYtNy5cclxuICAgIHZhciBzdGFydCA9IGFyZ3VtZW50c1sxXTtcclxuICAgIHZhciByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQgPj4gMDtcclxuXHJcbiAgICAvLyDQqNCw0LMgOC5cclxuICAgIHZhciBrID0gcmVsYXRpdmVTdGFydCA8IDAgP1xyXG4gICAgICBNYXRoLm1heChsZW4gKyByZWxhdGl2ZVN0YXJ0LCAwKSA6XHJcbiAgICAgIE1hdGgubWluKHJlbGF0aXZlU3RhcnQsIGxlbik7XHJcblxyXG4gICAgLy8g0KjQsNCz0LggOS0xMC5cclxuICAgIHZhciBlbmQgPSBhcmd1bWVudHNbMl07XHJcbiAgICB2YXIgcmVsYXRpdmVFbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/XHJcbiAgICAgIGxlbiA6IGVuZCA+PiAwO1xyXG5cclxuICAgIC8vINCo0LDQsyAxMS5cclxuICAgIHZhciBmaW5hbCA9IHJlbGF0aXZlRW5kIDwgMCA/XHJcbiAgICAgIE1hdGgubWF4KGxlbiArIHJlbGF0aXZlRW5kLCAwKSA6XHJcbiAgICAgIE1hdGgubWluKHJlbGF0aXZlRW5kLCBsZW4pO1xyXG5cclxuICAgIC8vINCo0LDQsyAxMi5cclxuICAgIHdoaWxlIChrIDwgZmluYWwpIHtcclxuICAgICAgT1trXSA9IHZhbHVlO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g0KjQsNCzIDEzLlxyXG4gICAgcmV0dXJuIE87XHJcbiAgfTtcclxufVxyXG5cclxuaWYgKCFBcnJheS5wcm90b3R5cGUuZmluZCkge1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdmaW5kJywge1xyXG4gICAgdmFsdWU6IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xyXG4gICAgICd1c2Ugc3RyaWN0JztcclxuICAgICBpZiAodGhpcyA9PSBudWxsKSB7XHJcbiAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgICB9XHJcbiAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgI
13345HRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICB9XHJcbiAgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XHJcbiAgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xyXG4gICAgIHZhciB0aGlzQXJnID0gYXJndW1lbnRzWzFdO1xyXG4gICAgIHZhciB2YWx1ZTtcclxuXHJcbiAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgdmFsdWUgPSBsaXN0W2ldO1xyXG4gICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xyXG4gICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICB9XHJcbiAgICAgfVxyXG4gICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmlmICghQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xyXG4gIEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXggPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcclxuICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgIH1cclxuICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xyXG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xyXG4gICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XHJcbiAgICB2YXIgdmFsdWU7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICB2YWx1ZSA9IGxpc3RbaV07XHJcbiAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH07XHJcbn1cclxuXHJcbmlmICghT2JqZWN0LnZhbHVlcykge1xyXG5cdE9iamVjdC52YWx1ZXMgPSBmdW5jdGlvbiB2YWx1ZXMoTykge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKE8pLm1hcCgobmFtZSk9Pk9bbmFtZV0pIHx8IFtdO1xyXG5cdH07XHJcbn1cclxuXHJcbmlmKCFSZWdFeHAuZXNjYXBlKSB7XHJcbiAgUmVnRXhwLmVzY2FwZSA9IGZ1bmN0aW9uKHMpIHtcclxuICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xyXG4gIH07XHJcbn1cclxuXHJcbmlmKCFTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwpIHtcclxuICBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihzZWFyY2gsIHJlcGxhY2UpIHtcclxuICAgIHJldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChSZWdFeHAuZXNjYXBlKHNlYXJjaCksICdnJyksIHJlcGxhY2UpO1xyXG4gIH07XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL3BvbHlmaWxsLmpzIiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9OYXZpZ2F0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBib29rQ3RybCwgcHJvcHM9e30pIHtcclxuICAgIHByb3BzID0ge1xyXG4gICAgICAuLi5wcm9wcyxcclxuICAgICAgdXJsUGFyYW06IHByb3BzLnVybFBhcmFtIHx8ICdmYjNkLXBhZ2UnLFxyXG4gICAgICBuYXZpZ2F0ZXM6IHByb3BzLm5hdmlnYXRlcz09PXVuZGVmaW5lZD8gMTogcHJvcHMubmF2aWdhdGVzLFxyXG4gICAgICBwYWdlTjogcHJvcHMucGFnZU4gfHwgMFxyXG4gICAgfTtcclxuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLmJvb2tDdHJsID0gYm9va0N0cmw7XHJcbiAgICB0aGlzLnVybFBhcmFtID0gcHJvcHMudXJsUGFyYW07XHJcbiAgICB0aGlzLnBhZ2VOID0gcHJvcHMucGFnZU47XHJcbiAgICB0aGlzLnduZCA9IGNvbnRleHQud25kO1xyXG5cclxuICAgIHRoaXMud25kLmZiM2QgPSB7XHJcbiAgICAgIC4uLnRoaXMud25kLmZiM2RcclxuICAgIH07XHJcbiAgICB0aGlzLnduZC5mYjNkLm5hdmlnYXRvciA9IHtcclxuICAgICAgLi4udGhpcy53bmQuZmIzZC5uYXZpZ2F0b3JcclxuICAgIH07XHJcbiAgICB0aGlzLm5hdmlnYXRvciA9IHRoaXMud25kLmZiM2QubmF2aWdhdG9yW3RoaXMudXJsUGFyYW1dID0ge1xyXG4gICAgICAuLi50aGlzLnduZC5mYjNkLm5hdmlnYXRvclt0aGlzLnVybFBhcmFtXVxyXG4gICAgfTtcclxuICAgIHRoaXMubmF2aWdhdG9yLmluc3RhbmNlcyA9ICh0aGlzLm5hdmlnYXRvci5pbnN0YW5jZXMgfHwgMCkrMTtcclxuXHJcbiAgICBpZih0aGlzLm5hdmlnYXRvci5pbnN0YW5jZXM8PXRoaXMucHJvcHMubmF2aWdhdGVzKSB7XHJcbiAgICAgIHRoaXMuYm9va0N0cmwuZ29Ub1BhZ2UodGhpcy5nZXRQYWdlTnVtYmVyKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRQYXJhbWV0ZXJCeU5hbWUobmFtZSwgdXJsKSB7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgIH1cclxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtcXF1dL2csICdcXFxcJCYnKTtcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgnWz8mXScgKyBuYW1lICsgJyg9KFteXSopfCZ8I3wkKScpLFxyXG4gICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWModXJsKTtcclxuICAgIGlmICghcmVzdWx0cykgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoIXJlc3VsdHNbMl0pIHJldHVybiAnJztcclxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0c1syXS5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlTnVtYmVyKCkge1xyXG4gICAgbGV0IG51bWJlciA9IHBhcnNlSW50KHRoaXMucGFnZU4pO1xyXG4gICAgaWYoaXNOYU4obnVtYmVyKXx8bnVtYmVyPT09MCkge1xyXG4gICAgICBudW1iZXIgPSB0aGlzLmdldFBhcmFtZXRlckJ5TmFtZSh0aGlzLnVybFBhcmFtKTtcclxuICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyKTtcclxuICAgICAgaWYoaXNOYU4obnVtYmVyKSkge1xyXG4gICAgICAgIG51bWJlciA9IDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybi
13345BudW1iZXItMTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQXV0b05hdmlnYXRvci5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgTWF0aFV0aWxzIGZyb20gJ01hdGhVdGlscydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpbmRlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgcCkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIC4uLnAsXHJcbiAgICAgIGJhY2tTaXplOiAyKnAuY292ZXIuZGVwdGgrcC5zaGVldHMqcC5wYWdlLmRlcHRoXHJcbiAgICB9O1xyXG4gICAgdGhpcy5PWiA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsMCwxKTtcclxuXHJcbiAgICB0aGlzLmJhY2tHID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KHAuY292ZXIuZGVwdGgsIHRoaXMucC5iYWNrU2l6ZSwgcC5jb3Zlci5oZWlnaHQpO1xyXG5cclxuICAgIHRoaXMubWF0ZXJpYWxzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogcC5jb3Zlci5jb2xvcn0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogcC5jb3Zlci5jb2xvcn0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogcC5jb3Zlci5jb2xvcn0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogcC5jb3Zlci5jb2xvcn0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogcC5jb3Zlci5jb2xvcn0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogcC5jb3Zlci5jb2xvcn0pXHJcbiAgICAgICAgICAgICAgICAgICAgIF07XHJcblxyXG4gICAgY29uc3QgYmFja00gPSBuZXcgVEhSRUUuTWVzaCh0aGlzLmJhY2tHLCBuZXcgVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCh0aGlzLm1hdGVyaWFscykpO1xyXG5cclxuICAgIGlmKHAuY292ZXIuYmluZGVyVGV4dHVyZSE9PScnKSB7XHJcbiAgICAgIHRoaXMudmlzdWFsLnRleHR1cmVMb2FkZXIubG9hZChwLmNvdmVyLmJpbmRlclRleHR1cmUsICh0ZXh0dXJlKT0+IHtcclxuICAgICAgICB0aGlzLm1hdGVyaWFsc1sxXS5jb2xvci5zZXRIZXgoMHhGRkZGRkYpO1xyXG4gICAgICAgIHRoaXMubWF0ZXJpYWxzWzFdLm1hcCA9IHRleHR1cmU7XHJcbiAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBUSFJFRS5MaW5lYXJGaWx0ZXI7XHJcbiAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbHNbMV0ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRocmVlID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLmJhY2sgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuYmFja1JUID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLmJhY2tSUiA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy5iYWNrTFQgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuYmFja0xSID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLmxlZnRQaXZvdCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy5yaWdodFBpdm90ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcblxyXG4gICAgdGhpcy5iYWNrLmFkZChiYWNrTSk7XHJcbiAgICB0aGlzLmJhY2suYWRkKHRoaXMubGVmdFBpdm90KTtcclxuICAgIHRoaXMuYmFjay5hZGQodGhpcy5yaWdodFBpdm90KTtcclxuICAgIHRoaXMuYmFja1JULmFkZCh0aGlzLmJhY2spO1xyXG4gICAgdGhpcy5iYWNrUlIuYWRkKHRoaXMuYmFja1JUKTtcclxuICAgIHRoaXMuYmFja0xULmFkZCh0aGlzLmJhY2tSUik7XHJcbiAgICB0aGlzLmJhY2tMUi5hZGQodGhpcy5iYWNrTFQpO1xyXG4gICAgdGhpcy50aHJlZS5hZGQodGhpcy5iYWNrTFIpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGZvcihsZXQgbSBvZiB0aGlzLm1hdGVyaWFscykge1xyXG4gICAgICBpZihtLm1hcCkge1xyXG4gICAgICAgIG0ubWFwID0gbnVsbDtcclxuICAgICAgICBtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBtLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLm1hdGVyaWFscztcclxuICAgIHRoaXMuYmFja0cuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0KGFuZ2xlKSB7XHJcbiAgICBsZXQgcmlnaHQsIGxlZnQ7XHJcbiAgICBpZihhbmdsZT5NYXRoLlBJLzIpIHtcclxuICAgICAgcmlnaHQgPSBNYXRoLlBJLzI7XHJcbiAgICAgIGxlZnQgPSBhbmdsZS1NYXRoLlBJLzI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmlnaHQgPSBhbmdsZTtcclxuICAgICAgbGVmdCA9IDA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwID0gdGhpcy5wLHRyMT17eDotMC41KnAuY292ZXIuZGVwdGgseTowLjUqcC5iYWNrU2l6ZS1wLmNvdmVyLmRlcHRofTtcclxuICAgIHRoaXMuYmFja1JULnBvc2l0aW9uLnNldCh0cjEueCx0cjEueSwwKTtcclxuICAgIHRoaXMuYmFja1JSLnBvc2l0aW9uLnNldCgtdHIxLngsLXRyMS55LDApO1xyXG4gICAgdGhpcy5iYWNrUlIucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHRoaXMuT1osIHJpZ2h0KTtcclxuXHJcbiAgICBjb25zdCB0cjI9e3g6cC5iYWNrU2l6ZS0yKnAuY292ZXIuZGVwdGgtMC41KnAuY292ZXIuZGVwdGgseTowLjUqcC5iYWNrU2l6ZS1wLmNvdmVyLmRlcHRofTtcclxuICAgIHRoaXMuYmFja0xULnBvc2l0aW9uLnNldCh0cjIueCx0cjIueSwwKTtcclxuICAgIHRoaXMuYmFja0xSLnBvc2l0aW9uLnNldCgtdHIyLngsLXRyMi55LDApO1xyXG4gICAgdGhpcy5iYWNrTFIucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHRoaXMuT1osIGxlZnQpO1xyXG4gIH1cclxuXHJcbiAgc2V0TGVmdChhbmdsZSkge1xyXG4gICAgY29uc3QgUEkgPSBNYXRoLlBJO1xyXG4gICAgdGhpcy5sZWZ0UGl2b3QucG9zaXRpb24uc2V0KE1hdGhVdGlscy5pbnRlcnBvbGF0ZUxpbmVhcihbLVBJLC1QSS8yXSxbMCx0aGlzLnAuY292ZXIuZGVwdGhdLGFuZ2xlKSwwLjUqdGhpcy5wLmJhY2tTaXplLTAuNSp0aGlzLnAuY292ZXIuZGVwdGgsMCk7XHJcbiAgICB0aGlzLmxlZnRQaXZvdC5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodGhpcy5PWiwgYW5nbG
13345UpO1xyXG4gIH1cclxuXHJcbiAgc2V0UmlnaHQoYW5nbGUpIHtcclxuICAgIGNvbnN0IFBJID0gTWF0aC5QSTtcclxuICAgICAgdGhpcy5yaWdodFBpdm90LnBvc2l0aW9uLnNldChNYXRoVXRpbHMuaW50ZXJwb2xhdGVMaW5lYXIoWy1QSS8yLDBdLFt0aGlzLnAuY292ZXIuZGVwdGgsMF0sYW5nbGUpLC0wLjUqdGhpcy5wLmJhY2tTaXplKzAuNSp0aGlzLnAuY292ZXIuZGVwdGgsMCk7XHJcbiAgICAgIHRoaXMucmlnaHRQaXZvdC5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodGhpcy5PWiwgYW5nbGUpO1xyXG4gIH1cclxuXHJcbiAgam9pbkxlZnRDb3Zlcihjb3Zlcikge1xyXG4gICAgY292ZXIudGhyZWUucG9zaXRpb24uc2V0KDAsLTAuNSp0aGlzLnAuY292ZXIuZGVwdGgsMCk7XHJcbiAgICB0aGlzLmxlZnRQaXZvdC5hZGQoY292ZXIudGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdExlZnRDb3Zlcihjb3Zlcikge1xyXG4gICAgdGhpcy5sZWZ0UGl2b3QucmVtb3ZlKGNvdmVyLnRocmVlKTtcclxuICB9XHJcblxyXG4gIGpvaW5SaWdodENvdmVyKGNvdmVyKSB7XHJcbiAgICBjb3Zlci50aHJlZS5wb3NpdGlvbi5zZXQoMCwtMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgIHRoaXMucmlnaHRQaXZvdC5hZGQoY292ZXIudGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdFJpZ2h0Q292ZXIoY292ZXIpIHtcclxuICAgIHRoaXMucmlnaHRQaXZvdC5yZW1vdmUoY292ZXIudGhyZWUpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQmluZGVyLmpzIiwiaW1wb3J0IHskLCBUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCB7cHJvcHMgYXMgIGJvb2tQcm9wc30gZnJvbSAnLi4vcHJvcHMvYm9vayc7XHJcbmltcG9ydCBHcmFwaFV0aWxzIGZyb20gJ0dyYXBoVXRpbHMnO1xyXG5pbXBvcnQgQmluZGVyIGZyb20gJy4vQmluZGVyJztcclxuaW1wb3J0IENvdmVyIGZyb20gJy4vQ292ZXInO1xyXG5pbXBvcnQgU2hlZXRCbG9jayBmcm9tICcuL1NoZWV0QmxvY2snO1xyXG5pbXBvcnQgU2hlZXRQaHlzaWNzIGZyb20gJy4vU2hlZXRQaHlzaWNzJztcclxuaW1wb3J0IFBhZ2VNYW5hZ2VyIGZyb20gJy4vUGFnZU1hbmFnZXInO1xyXG5pbXBvcnQgQ1NTTGF5ZXIgZnJvbSAnQ1NTTGF5ZXInO1xyXG5pbXBvcnQgQ3NzTGF5ZXJzTWFuYWdlciBmcm9tICcuL0Nzc0xheWVyc01hbmFnZXInO1xyXG5pbXBvcnQgU2VhcmNoRW5naW5lIGZyb20gJy4vU2VhcmNoRW5naW5lJztcclxuaW1wb3J0IEN1c3RvbUV2ZW50Q29udmVydGVyIGZyb20gJ0N1c3RvbUV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IENpcmNsZVRhcmdldCBmcm9tICd0YXJnZXRzL0NpcmNsZVRhcmdldCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb29rIGV4dGVuZHMgVEhSRUUuRXZlbnREaXNwYXRjaGVyIHtcclxuICAvLyBwYWdlQ2FsbGJhY2sgc2FtcGxlc1xyXG5cclxuICAvLyAobik9PiAoe1xyXG4gIC8vICAgdHlwZTogJ2ltYWdlJyxcclxuICAvLyAgIHNyYzogJ3NhbXBsZS5wbmcnLFxyXG4gIC8vICAgaW50ZXJhY3RpdmU6IGZhbHNlXHJcbiAgLy8gfSk7XHJcbiAgLy9cclxuICAvLyAobik9PiAoe1xyXG4gIC8vICAgdHlwZTogJ2h0bWwnLFxyXG4gIC8vICAgc3JjOiAnc2FtcGxlLmh0bWwnLFxyXG4gIC8vICAgaW50ZXJhY3RpdmU6IHRydWVcclxuICAvLyB9KTtcclxuICAvL1xyXG4gIC8vIGNvbnN0IHBkZiA9IG5ldyBQZGYoJ3NhbXBsZS5wZGYnKTtcclxuICAvLyAobik9PiAoe1xyXG4gIC8vICAgdHlwZTogJ3BkZicsXHJcbiAgLy8gICBzcmM6IHBkZixcclxuICAvLyAgIGludGVyYWN0aXZlOiBmYWxzZVxyXG4gIC8vIH0pO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aXN1YWwsIHNoZWV0cywgcGFnZUNhbGxiYWNrLCBwcm9wcykge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMudmlzdWFsID0gdmlzdWFsO1xyXG4gICAgdGhpcy5tb3VzZUNvbnRyb2xsZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5wID0ge1xyXG4gICAgICAuLi5Cb29rLnByZXBhcmVQcm9wcyhwcm9wcyksXHJcbiAgICAgIHNoZWV0cyxcclxuICAgICAgcGFnZUNhbGxiYWNrLFxyXG4gICAgICB6b29tOiAxLFxyXG4gICAgICBzaW5nbGVQYWdlOiBmYWxzZSxcclxuICAgICAgYXV0b1Jlc29sdXRpb246IHtcclxuICAgICAgICBlbmFibGU6IGZhbHNlLFxyXG4gICAgICAgIGs6IDEuNVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5wYWdlTWFuYWdlciA9IG5ldyBQYWdlTWFuYWdlcih2aXN1YWwsIHRoaXMsIHRoaXMucCk7XHJcbiAgICBDU1NMYXllci5pbml0KHZpc3VhbC5kb2MpO1xyXG4gICAgdGhpcy5sYXllck1hbmFnZXIgPSBuZXcgQ3NzTGF5ZXJzTWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZShwYWdlQ2FsbGJhY2ssIDIqKHNoZWV0cysyKSk7XHJcbiAgICB0aGlzLnNlYXJjaEVuZ2luZS5vblBhZ2VIaXRzQ2hhbmdlZCA9IChwYWdlLCBxdWVyeSk9PiB7XHJcbiAgICAgIHRoaXMucGFnZU1hbmFnZXIucmVmcmVzaFBhZ2VRdWVyeShwYWdlLCBxdWVyeSk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7XHJcbiAgICAgICAgdHlwZTogJ3NlYXJjaFJlc3VsdHMnLFxyXG4gICAgICAgIHJlc3VsdHM6IHRoaXMuc2VhcmNoRW5naW5lLnJlc3VsdHMsXHJcbiAgICAgICAgbGFzdFBhZ2U6IHBhZ2UsXHJcbiAgICAgICAgcXVlcnlcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudGhyZWUgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuXHJcbiAgICB0aGlzLmJpbmRlciA9IG5ldyBCaW5kZXIodmlzdWFsLCB0aGlzLnApO1xyXG4gICAgdGhpcy50aHJlZS5hZGQodGhpcy5iaW5kZXIudGhyZWUpO1xyXG5cclxuICAgIHRoaXMubGVmdENvdmVyID0gbmV3IENvdmVyKHZpc3VhbCwgey4uLnRoaXMucCwgc2V0VGV4dHVyZTogdGhpcy5zZXRMZWZ0Q292ZXJUZXh0dXJlLmJpbmQodGhpcyl9LCBNYXRoLlBJLzIsICdvcGVuZWQnKTtcclxuICAgIHRoaXMuYmluZGVyLmpvaW5MZWZ0Q292ZXIodGhpcy5sZWZ0Q292ZXIpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVTaGVldEJsb2NrKHRoaXMubGVmdENvdmVyLCAwKTtcclxuICAgIHRoaXMucmlnaHRDb3ZlciA9IG5ldyBDb3Zlcih2aXN1YWwsIHsuLi50aGlzLnAsIHNldFRleHR1cmU6IHRoaXMuc2V0UmlnaHRDb3ZlclRleHR1cmUuYmluZCh0aGlzKX0sIDAsICdjbG9zZWQnKTtcclxuICAgIHRoaXMuYmluZGVyLmpvaW5SaWdodENvdmVyKHRoaXMucmlnaHRDb3Zlcik7XHJcbiAgICB0aGlzLnN1YnNjcmliZVNoZWV0QmxvY2sodGhpcy5yaWdodENvdmVyLCAyKih0aGlzLnAuc2hlZXRzKzEpKTtcclxuXHJcbiAgICB0aGlzLnRocmVlU2hlZXRCbG9ja3MgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMudGhyZWUuYWRkKHRoaXMudGhyZWVTaGVldEJsb2Nrcyk7XHJcbiAgICB0aGlzLnRocmVlU2hlZXRCbG9ja3MucG9zaXRpb24uc2V0KDAuNSp0aGlzLnAuY292ZXIuZGVwdGgtMC41KnNoZWV0cyp0aGlzLnAucGFnZS5kZXB0aCwtMC41KnNoZWV0cyp0aGlzLnAucGFnZS5kZXB0aCwwKTtcclxuXHJcbiAgICB0aGlzLnNoZWV0QmxvY2tzID0gW107XHJcbiAgICBpZihzaGVldHM+MCkge1xyXG4gICAgICB0aGlzLmFkZFNoZWV0QmxvY2soMCwgbmV3IFNoZWV0QmxvY2sodmlzdWFsLCB7Li4udGhpcy5wLCBzZXRUZX
13345h0dXJlOiB0aGlzLnNldFBhZ2VUZXh0dXJlLmJpbmQodGhpcyl9LCAwLCBzaGVldHMsIDAsICdjbG9zZWQnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hbmdsZSA9IHRoaXMucC5ydGw/IE1hdGguUEk6IDA7XHJcbiAgICB0aGlzLmNsb3NlZEFuZ2xlID0gMDtcclxuICAgIHRoaXMuc2V0KHRoaXMuYW5nbGUsMCk7XHJcbiAgICB0aGlzLmxhc3RNb3VzZVBvcyA9IHtcclxuICAgICAgdDogMFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnRocmVlLnBvc2l0aW9uLnNldCgtMC41KnRoaXMucC5jb3Zlci5kZXB0aCswLjUqc2hlZXRzKnRoaXMucC5wYWdlLmRlcHRoLDAsMCk7XHJcbiAgICB0aGlzLnNoZWV0UGh5c2ljcyA9IG5ldyBTaGVldFBoeXNpY3ModGhpcy5wLnBhZ2Uud2lkdGgvdGhpcy5wLnNjYWxlLCB0aGlzLnAuZ3Jhdml0eSwgdGhpcy5wLnBhZ2UuY29ybmVyRGV2aWF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICB1cGRhdGU6IHRoaXMudXBkYXRlLmJpbmQodGhpcyksXHJcbiAgICAgIGxhc3RNb3VzZVBvczogKGUpPT4ge1xyXG4gICAgICAgIHRoaXMubGFzdE1vdXNlUG9zID0ge1xyXG4gICAgICAgICAgLi4udGhpcy5sYXN0TW91c2VQb3MsXHJcbiAgICAgICAgICBwYWdlWDogZS5wYWdlWCxcclxuICAgICAgICAgIHBhZ2VZOiBlLnBhZ2VZXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRoaXMudmlzdWFsLmFkZFJlbmRlckNhbGxiYWNrKHRoaXMuYmluZHMudXBkYXRlKTtcclxuICAgICQodGhpcy52aXN1YWwuZWxlbWVudCkub24oJ21vdXNlbW92ZScsIHRoaXMuYmluZHMubGFzdE1vdXNlUG9zKTtcclxuXHJcbiAgICB0aGlzLmJpbmRzLm9uUGlja0NhbGxiYWNrID0gdGhpcy5vblBpY2tDYWxsYmFjay5iaW5kKHRoaXMpXHJcbiAgICB0aGlzLnZpc3VhbC5kcmFnLm9uUGlja0NhbGxiYWNrID0gdGhpcy5iaW5kcy5vblBpY2tDYWxsYmFjaztcclxuICAgIHRoaXMuYmluZHMub25EcmFnQ2FsbGJhY2sgPSB0aGlzLm9uRHJhZ0NhbGxiYWNrLmJpbmQodGhpcylcclxuICAgIHRoaXMudmlzdWFsLmRyYWcub25EcmFnQ2FsbGJhY2sgPSB0aGlzLmJpbmRzLm9uRHJhZ0NhbGxiYWNrO1xyXG4gICAgdGhpcy5iaW5kcy5vblJlbGVhc2VDYWxsYmFjayA9IHRoaXMub25SZWxlYXNlQ2FsbGJhY2suYmluZCh0aGlzKVxyXG4gICAgdGhpcy52aXN1YWwuZHJhZy5vblJlbGVhc2VDYWxsYmFjayA9IHRoaXMuYmluZHMub25SZWxlYXNlQ2FsbGJhY2s7XHJcblxyXG4gICAgdGhpcy5kcmFnQW5nbGUgPSAwLjA1O1xyXG4gICAgdGhpcy50bXAgPSB7XHJcbiAgICAgIGJveHM6IFtcclxuICAgICAgICBuZXcgVEhSRUUuQm94MygpLFxyXG4gICAgICAgIG5ldyBUSFJFRS5Cb3gzKClcclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnZpc3VhbC5hZGRPYmplY3QodGhpcy50aHJlZSk7XHJcbiAgICB0aGlzLnZpc3VhbC5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnBhZ2VNYW5hZ2VyLnJlZnJlc2hab29tLmJpbmQodGhpcy5wYWdlTWFuYWdlcikpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgIHRoaXMubm90aWZ5QmVmb3JlQW5pbWF0aW9uKCk7XHJcbiAgICAgIHRoaXMubm90aWZ5QWZ0ZXJBbmltYXRpb24oKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy52aXN1YWwucmVtb3ZlT2JqZWN0KHRoaXMudGhyZWUpO1xyXG4gICAgdGhpcy5zaGVldFBoeXNpY3MuZGlzcG9zZSgpO1xyXG4gICAgZGVsZXRlIHRoaXMudmlzdWFsLmRyYWcub25QaWNrQ2FsbGJhY2s7XHJcbiAgICBkZWxldGUgdGhpcy52aXN1YWwuZHJhZy5vbkRyYWdDYWxsYmFjaztcclxuICAgIGRlbGV0ZSB0aGlzLnZpc3VhbC5kcmFnLm9uUmVsZWFzZUNhbGxiYWNrO1xyXG4gICAgJCh0aGlzLnZpc3VhbC5lbGVtZW50KS5vZmYoJ21vdXNlbW92ZScsIHRoaXMuYmluZHMubGFzdE1vdXNlUG9zKTtcclxuICAgIHRoaXMudmlzdWFsLnJlbW92ZVJlbmRlckNhbGxiYWNrKHRoaXMuYmluZHMudXBkYXRlKTtcclxuICAgIHRoaXMucmVtb3ZlU2hlZXRCbG9ja3MoMCwgdGhpcy5zaGVldEJsb2Nrcy5sZW5ndGgpO1xyXG4gICAgdGhpcy5iaW5kZXIuZGlzY29ubmVjdExlZnRDb3Zlcih0aGlzLmxlZnRDb3Zlcik7XHJcbiAgICB0aGlzLnJlbW92ZVNoZWV0QmxvY2sodGhpcy5sZWZ0Q292ZXIpO1xyXG4gICAgdGhpcy5iaW5kZXIuZGlzY29ubmVjdFJpZ2h0Q292ZXIodGhpcy5yaWdodENvdmVyKTtcclxuICAgIHRoaXMucmVtb3ZlU2hlZXRCbG9jayh0aGlzLnJpZ2h0Q292ZXIpO1xyXG4gICAgdGhpcy5iaW5kZXIuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5sYXllck1hbmFnZXIuZGlzcG9zZSgpO1xyXG4gICAgQ1NTTGF5ZXIuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wYWdlTWFuYWdlci5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWNzIHtcclxuXHJcbiAgc2V0QXV0b1Jlc29sdXRpb24oZW5hYmxlLCBrPTEuNSkge1xyXG4gICAgdGhpcy5wLmF1dG9SZXNvbHV0aW9uID0ge1xyXG4gICAgICAuLi50aGlzLnAuYXV0b1Jlc29sdXRpb24sXHJcbiAgICAgIGVuYWJsZSxcclxuICAgICAga1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHNldFpvb20oem9vbSwgc2luZ2xlUGFnZSkge1xyXG4gICAgaWYoTWF0aC5hYnModGhpcy5wLnpvb20tem9vbSk+MWUtMyB8fCBzaW5nbGVQYWdlIT09dGhpcy5wLnNpbmdsZVBhZ2UpIHtcclxuICAgICAgdGhpcy5wLnpvb20gPSB6b29tO1xyXG4gICAgICB0aGlzLnAuc2luZ2xlUGFnZSA9IHNpbmdsZVBhZ2U7XHJcbiAgICAgIHRoaXMucGFnZU1hbmFnZXIucmVmcmVzaFpvb20oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBhZ2VDYWxsYmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLnAucGFnZUNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgc2V0UXVlcnkocXVlcnkpIHtcclxuICAgIHRoaXMuc2VhcmNoRW5naW5lLnNldFF1ZXJ5KHF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGlzUHJvY2Vzc2luZygpIHtcclxuICAgIHJldHVybiB0aGlzLnNoZWV0UGh5c2ljcy5nZXRTaXplKCkhPT0wO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZXMoKSB7XHJcbiAgICByZXR1cm4gNCsyKnRoaXMucC5zaGVldHM7XHJcbiAgfVxyXG5cclxuICBzZXRGbGlwUHJvZ3Jlc3NDbGIoY2xiKSB7XHJcbiAgICB0aGlzLnAuZmxpcFByb2dyZXNzQ2xiID0gY2xiO1xyXG4gIH1cclxuXHJcbiAgc2V0SW5qZWN0b3IoaW5qZWN0b3IpIHtcclxuICAgIHRoaXMucC5pbmplY3RvciA9IGluamVjdG9yO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmVQYWdlKG4pIHtcclxuICAgIGxldCByZXMgPSB0cnVlO1xyXG4gICAgaWYobj4xICYmIG48dGhpcy5nZXRQYWdlcygpLTIpIHtcclxuICAgICAgZm9yKGxldCBiIG9mIHRoaXMuc2hlZXRCbG9ja3MpIHtcclxuICAgICAgICBpZihuLTI+MipiLnAuZmlyc3QgJiYgbi0yPDIqYi5wLmxhc3QtMSkge1xyXG4gICAgICAgICAgcmVzID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgI
13345H1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIGdldEJsb2NrQnlQYWdlKG4pIHtcclxuICAgIGxldCBibG9jaztcclxuICAgIGlmKG48Mikge1xyXG4gICAgICBibG9jayA9IHRoaXMubGVmdENvdmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihuPDIqKHRoaXMucC5zaGVldHMrMSkpIHtcclxuICAgICAgZm9yKGxldCBiIG9mIHRoaXMuc2hlZXRCbG9ja3MpIHtcclxuICAgICAgICBpZihuLTI+PTIqYi5wLmZpcnN0ICYmIG4tMjwyKmIucC5sYXN0KSB7XHJcbiAgICAgICAgICBibG9jayA9IGI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBibG9jayA9IHRoaXMucmlnaHRDb3ZlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBibG9jaztcclxuICB9XHJcblxyXG4gIGdldEJsb2NrUGFnZXMoYmxvY2spIHtcclxuICAgIGxldCByYW5nZTtcclxuICAgIHN3aXRjaCAoYmxvY2spIHtcclxuICAgICAgY2FzZSB0aGlzLmxlZnRDb3Zlcjoge1xyXG4gICAgICAgICAgcmFuZ2UgPSBbMCwgMV07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSB0aGlzLnJpZ2h0Q292ZXI6IHtcclxuICAgICAgICByYW5nZSA9IFsyKih0aGlzLnAuc2hlZXRzKzEpLCAyKih0aGlzLnAuc2hlZXRzKzEpKzFdO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICByYW5nZSA9IGJsb2NrPyBbMiooYmxvY2sucC5maXJzdCsxKSwgMiooYmxvY2sucC5sYXN0KzEpLTFdOiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByYW5nZTtcclxuICB9XHJcblxyXG4gIGdldFBhZ2UoKSB7XHJcbiAgICBjb25zdCBQSSA9IE1hdGguUEk7XHJcbiAgICBsZXQgcDtcclxuICAgIGlmKHRoaXMuYW5nbGUgPT09IFBJLzIgfHwgdGhpcy5hbmdsZSA9PT0gMypQSS8yKSB7XHJcbiAgICAgIGZvcihsZXQgYmxvY2sgb2YgdGhpcy5zaGVldEJsb2Nrcykge1xyXG4gICAgICAgIGlmKGJsb2NrLmFuZ2xlPD1QSS8yKSB7XHJcbiAgICAgICAgICBwID0gdGhpcy5nZXRCbG9ja1BhZ2VzKGJsb2NrKVswXS0xO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKCFwKSB7XHJcbiAgICAgICAgcCA9IHRoaXMuZ2V0UGFnZXMoKS0zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMuYW5nbGU8UEkvMikge1xyXG4gICAgICBwID0gMDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5hbmdsZT4zKlBJLzIpIHtcclxuICAgICAgcCA9IDE7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMuYW5nbGU8UEkpIHtcclxuICAgICAgcCA9IHRoaXMuZ2V0UGFnZXMoKS0zO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLmFuZ2xlPj1QSSkge1xyXG4gICAgICBwID0gdGhpcy5nZXRQYWdlcygpLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcDtcclxuICB9XHJcblxyXG4gIGdldFRvcFBhZ2VzKCkge1xyXG4gICAgY29uc3QgcCA9IHRoaXMuZ2V0UGFnZSgpO1xyXG4gICAgcmV0dXJuIHA9PT0wIHx8IHA9PT10aGlzLmdldFBhZ2VzKCktMT8gW3BdOiBbcCwgcCsxXTtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VTdGF0ZShuKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlTWFuYWdlci5nZXRQYWdlU3RhdGUobik7XHJcbiAgfVxyXG5cclxuICBlbmFibGVMb2FkaW5nQW5pbWF0aW9uKGVuYWJsZSkge1xyXG4gICAgdGhpcy5wYWdlTWFuYWdlci5lbmFibGVMb2FkaW5nQW5pbWF0aW9uKGVuYWJsZSk7XHJcbiAgfVxyXG5cclxuICBnZXRMZWZ0RmxpcHBpbmcoKSB7XHJcbiAgICBsZXQgYmxvY2s7XHJcbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5zaGVldEJsb2Nrc1swXSwgUEkgPSBNYXRoLlBJO1xyXG4gICAgaWYodGhpcy5hbmdsZT09PVBJKSB7XHJcbiAgICAgIGJsb2NrID0gdGhpcy5yaWdodENvdmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmKGxlZnQgJiYgbGVmdC5zdGF0ZT09PSdjbG9zZWQnICYmIGxlZnQuYW5nbGU+UEkvMikge1xyXG4gICAgICAgIGJsb2NrID0gbGVmdDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKHRoaXMuYW5nbGUgPT09IFBJLzIgfHwgdGhpcy5hbmdsZSA9PT0gMypQSS8yKSB7XHJcbiAgICAgICAgYmxvY2sgPSB0aGlzLmxlZnRDb3ZlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJsb2NrO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmlnaHRGbGlwcGluZygpIHtcclxuICAgIGxldCBibG9jaztcclxuICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5zaGVldEJsb2Nrc1t0aGlzLnNoZWV0QmxvY2tzLmxlbmd0aC0xXSwgUEkgPSBNYXRoLlBJO1xyXG4gICAgaWYodGhpcy5hbmdsZT09PTApIHtcclxuICAgICAgYmxvY2sgPSB0aGlzLmxlZnRDb3ZlcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZihyaWdodCAmJiByaWdodC5zdGF0ZT09PSdjbG9zZWQnICYmIHJpZ2h0LmFuZ2xlPD1QSS8yKSB7XHJcbiAgICAgICAgYmxvY2sgPSByaWdodDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKHRoaXMuYW5nbGU9PT1QSS8yIHx8IHRoaXMuYW5nbGUgPT09IDMqUEkvMikge1xyXG4gICAgICAgIGJsb2NrID0gdGhpcy5yaWdodENvdmVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmxvY2s7XHJcbiAgfVxyXG5cclxuICBnZXRDbG9zZWRCbG9ja0FuZ2xlKGFuZ2xlKSB7XHJcbiAgICBsZXQgY2xvc2VkQW5nbGUsIHtQSX0gPSBNYXRoO1xyXG5cclxuICAgIGlmKHRoaXMubGVmdENvdmVyLnBoeXNpY0lkKSB7XHJcbiAgICAgIGxldCB0ZXN0O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRlc3QgPSBNYXRoLmFicyh0aGlzLnNoZWV0UGh5c2ljcy5nZXRQYXJhbWV0cih0aGlzLmxlZnRDb3Zlci5waHlzaWNJZCwgJ2FuZ2xlJyktYW5nbGUpXHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgIHRlc3QgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGNsb3NlZEFuZ2xlID0gYW5nbG
13345U+UEkvMiB8fCB0ZXN0PlBJLzY/IFBJLzI6IHRoaXMuY2xvc2VkQW5nbGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMucmlnaHRDb3Zlci5waHlzaWNJZCkge1xyXG4gICAgICBsZXQgdGVzdDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0ZXN0ID0gTWF0aC5hYnModGhpcy5zaGVldFBoeXNpY3MuZ2V0UGFyYW1ldHIodGhpcy5yaWdodENvdmVyLnBoeXNpY0lkLCAnYW5nbGUnKS1hbmdsZSlcclxuICAgICAgfVxyXG4gICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgdGVzdCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgY2xvc2VkQW5nbGUgPSBhbmdsZTxQSS8yIHx8IHRlc3Q+UEkvNj8gUEkvMisxZS03OiB0aGlzLmNsb3NlZEFuZ2xlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNsb3NlZEFuZ2xlID0gUEkvMisoYW5nbGUhPT0wKSoxZS03O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG9wZW5lZEFuZ2xlOiBhbmdsZSxcclxuICAgICAgY2xvc2VkQW5nbGUsXHJcbiAgICAgIGJpbmRlclR1cm46IHRoaXMuY2xvc2VkQW5nbGVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmbGlwTGVmdChzaXplPTEsIHByb2dyZXNzQ2xiPXRoaXMucC5mbGlwUHJvZ3Jlc3NDbGIpIHtcclxuICAgIGxldCBibG9jaywgcmVzO1xyXG4gICAgaWYodGhpcy5zaGVldFBoeXNpY3MuZ2V0U2l6ZSgpPDI1KSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLnNoZWV0QmxvY2tzWzBdLCBQSSA9IE1hdGguUEk7XHJcbiAgICAgIGlmKHRoaXMuYW5nbGU9PT1QSSkge1xyXG4gICAgICAgIHJlcyA9IHRoaXMuY29ubmVjdFBoeXNpY3MoXHJcbiAgICAgICAgICBibG9jaz10aGlzLnJpZ2h0Q292ZXIsXHJcbiAgICAgICAgICB0aGlzLnAuY292ZXIubWFzcyxcclxuICAgICAgICAgIFBJLFxyXG4gICAgICAgICAgLXRoaXMucC5jb3Zlci5zdGFydFZlbG9jaXR5LFxyXG4gICAgICAgICAgdGhpcy5wLmNvdmVyLmZsZXhpYmlsaXR5LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT50aGlzLnNldCgzKlBJLzItYW5nbGUvMixoZWlnaHQpLFxyXG4gICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0KDMqUEkvMi1hbmdsZS8yLDApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKGFuZ2xlPyBQSTogUEkvMisxZS03LCdjbG9zZWQnKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcm9ncmVzc0NsYlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYobGVmdCAmJiBsZWZ0LnN0YXRlPT09J2Nsb3NlZCcgJiYgbGVmdC5hbmdsZT5QSS8yKSB7XHJcbiAgICAgICAgICBibG9jayA9IHNpemU8bGVmdC5nZXRTaXplKCk/IHRoaXMuc3BsaXRTaGVldEJsb2NrKDAsIGxlZnQuZ2V0U2l6ZSgpLXNpemUpWzFdOiBsZWZ0O1xyXG4gICAgICAgICAgcmVzID0gdGhpcy5jb25uZWN0UGh5c2ljcyhcclxuICAgICAgICAgICAgYmxvY2ssXHJcbiAgICAgICAgICAgIHRoaXMucC5wYWdlLm1hc3MqYmxvY2suZ2V0U2l6ZSgpLFxyXG4gICAgICAgICAgICBQSSxcclxuICAgICAgICAgICAgLXRoaXMucC5wYWdlLnN0YXJ0VmVsb2NpdHksXHJcbiAgICAgICAgICAgIHRoaXMucC5wYWdlLmZsZXhpYmlsaXR5LFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+YmxvY2suc2V0KHRoaXMuZ2V0Q2xvc2VkQmxvY2tBbmdsZShhbmdsZSksJ29wZW5lZCcsaGVpZ2h0KSxcclxuICAgICAgICAgICAgQm9vay5maW5pc2hBbmltYXRpb25DbGIuYmluZCh7Ym9vazogdGhpcywgYmxvY2t9KSxcclxuICAgICAgICAgICAgcHJvZ3Jlc3NDbGJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodGhpcy5hbmdsZSA9PT0gUEkvMiB8fCB0aGlzLmFuZ2xlID09PSAzKlBJLzIpIHtcclxuICAgICAgICAgIHJlcyA9IHRoaXMuY29ubmVjdFBoeXNpY3MoXHJcbiAgICAgICAgICAgIGJsb2NrPXRoaXMubGVmdENvdmVyLFxyXG4gICAgICAgICAgICB0aGlzLnAuY292ZXIubWFzcyxcclxuICAgICAgICAgICAgUEksXHJcbiAgICAgICAgICAgIC10aGlzLnAuY292ZXIuc3RhcnRWZWxvY2l0eSxcclxuICAgICAgICAgICAgdGhpcy5wLmNvdmVyLmZsZXhpYmlsaXR5LFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNldCgyKlBJLWFuZ2xlLzIsaGVpZ2h0KTtcclxuICAgICAgICAgICAgICBpZihhbmdsZT5QSS8yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKGFuZ2xlPyBQSS8yOiAwLCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT4gdGhpcy5zZXQoYW5nbGU9PT0wPyAwOiAyKlBJLWFuZ2xlLzIsMCksXHJcbiAgICAgICAgICAgIHByb2dyZXNzQ2xiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIGZsaXBSaWdodChzaXplPTEsIHByb2dyZXNzQ2xiPXRoaXMucC5mbGlwUHJvZ3Jlc3NDbGIpIHtcclxuICAgIGxldCBibG9jaywgcmVzO1xyXG4gICAgaWYodGhpcy5zaGVldFBoeXNpY3MuZ2V0U2l6ZSgpPDI1KSB7XHJcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5zaGVldEJsb2Nrc1t0aGlzLnNoZWV0QmxvY2tzLmxlbmd0aC0xXSwgUEkgPSBNYXRoLlBJO1xyXG4gICAgICBpZih0aGlzLmFuZ2xlPT09MCkge1xyXG4gICAgICAgIHJlcyA9IHRoaXMuY29ubmVjdFBoeXNpY3MoXHJcbiAgICAgICAgICBibG9jaz10aGlzLmxlZnRDb3ZlcixcclxuICAgICAgICAgIHRoaXMucC5jb3Zlci5tYXNzLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIHRoaXMucC5jb3Zlci5zdGFydFZlbG9jaXR5LFxyXG4gICAgICAgICAgdGhpcy5wLmNvdmVyLmZsZXhpYmlsaXR5LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT50aGlzLnNldChhbmdsZS8yLGhlaWdodCksXHJcbiAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXQoYW5nbGUvMiwwKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhhbmdsZT8gUEkvMjogMCwnY2xvc2VkJyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcHJvZ3Jlc3NDbGJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmKHJpZ2h0ICYmIHJpZ2h0LnN0YXRlPT09J2Nsb3NlZCcgJiYgcmlnaHQuYW5nbGU8PVBJLzIpIHtcclxuICAgICAgICAgIGJsb2NrID0gc2l6ZTxyaWdodC5nZXRTaXplKCk/IHRoaXMuc3BsaXRTaGVldEJsb2NrKHRoaXMuc2hlZXRCbG9ja3MubGVuZ3RoLTEsIHNpemUpWzBdOiByaWdodDtcclxuICAgICAgICAgI
13345HJlcyA9IHRoaXMuY29ubmVjdFBoeXNpY3MoXHJcbiAgICAgICAgICAgIGJsb2NrLFxyXG4gICAgICAgICAgICB0aGlzLnAucGFnZS5tYXNzKmJsb2NrLmdldFNpemUoKSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgdGhpcy5wLnBhZ2Uuc3RhcnRWZWxvY2l0eSxcclxuICAgICAgICAgICAgdGhpcy5wLnBhZ2UuZmxleGliaWxpdHksXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT5ibG9jay5zZXQodGhpcy5nZXRDbG9zZWRCbG9ja0FuZ2xlKGFuZ2xlKSwnb3BlbmVkJyxoZWlnaHQpLFxyXG4gICAgICAgICAgICBCb29rLmZpbmlzaEFuaW1hdGlvbkNsYi5iaW5kKHtib29rOiB0aGlzLCBibG9ja30pLFxyXG4gICAgICAgICAgICBwcm9ncmVzc0NsYlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmFuZ2xlPT09UEkvMiB8fCB0aGlzLmFuZ2xlID09PSAzKlBJLzIpIHtcclxuICAgICAgICAgIHJlcyA9IHRoaXMuY29ubmVjdFBoeXNpY3MoXHJcbiAgICAgICAgICAgIGJsb2NrPXRoaXMucmlnaHRDb3ZlcixcclxuICAgICAgICAgICAgdGhpcy5wLmNvdmVyLm1hc3MsXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIHRoaXMucC5jb3Zlci5zdGFydFZlbG9jaXR5LFxyXG4gICAgICAgICAgICB0aGlzLnAuY292ZXIuZmxleGliaWxpdHksXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0KFBJLzIrYW5nbGUvMixoZWlnaHQpO1xyXG4gICAgICAgICAgICAgIGlmKGFuZ2xlPFBJLzIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoUEkvMisxZS03LCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT50aGlzLnNldChQSS8yK2FuZ2xlLzIsMCksXHJcbiAgICAgICAgICAgIHByb2dyZXNzQ2xiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIC8vIH1cclxuXHJcbiAgY2xlYXJIb3ZlckluZm8oKSB7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyLnR1cm5PbkV2ZW50cygpO1xyXG4gICAgZGVsZXRlIHRoaXMuaG92ZXJJbmZvLmJsb2NrLmZvcmNlO1xyXG4gICAgZGVsZXRlIHRoaXMuaG92ZXJJbmZvLmJsb2NrLmNvcm5lckZvcmNlO1xyXG4gICAgZGVsZXRlIHRoaXMuaG92ZXJJbmZvO1xyXG4gIH1cclxuXHJcbiAgeFNlZ21lbnQoKSB7XHJcbiAgICBjb25zdCBib3hzID0gdGhpcy50bXAuYm94cywgcmVzID0ge307XHJcbiAgICBpZih0aGlzLmxlZnRDb3Zlci5waHlzaWNJZCkge1xyXG4gICAgICBib3hzWzBdLnNldEZyb21PYmplY3QodGhpcy5yaWdodENvdmVyLnRocmVlKTtcclxuICAgICAgcmVzLm1pbiA9IC0ocmVzLm1heCA9IGJveHNbMF0ubWF4LngpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLnJpZ2h0Q292ZXIucGh5c2ljSWQpIHtcclxuICAgICAgYm94c1swXS5zZXRGcm9tT2JqZWN0KHRoaXMubGVmdENvdmVyLnRocmVlKTtcclxuICAgICAgcmVzLm1heCA9IC0ocmVzLm1pbiA9IGJveHNbMF0ubWluLngpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGJveHNbMF0uc2V0RnJvbU9iamVjdCh0aGlzLmxlZnRDb3Zlci50aHJlZSk7XHJcbiAgICAgIGJveHNbMV0uc2V0RnJvbU9iamVjdCh0aGlzLnJpZ2h0Q292ZXIudGhyZWUpO1xyXG4gICAgICBib3hzWzBdLnVuaW9uKGJveHNbMV0pO1xyXG4gICAgICByZXMubWluID0gYm94c1swXS5taW4ueDtcclxuICAgICAgcmVzLm1heCA9IGJveHNbMF0ubWF4Lng7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgY29tcHV0ZVRhcmdldChwb2ludCkge1xyXG4gICAgbGV0IHt4LCB5fSA9IHBvaW50LCBzZWcgPSB0aGlzLnhTZWdtZW50KCksIGFuZ2xlO1xyXG4gICAgYW5nbGUgPSAoc2VnLm1heC14KS8oc2VnLm1heC1zZWcubWluKSpNYXRoLlBJO1xyXG4gICAgLy8gYW5nbGUgPSBNYXRoLmFjb3MoeC9NYXRoLnNxcnQoeCp4K3kqeSkpO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZHJhZ0FuZ2xlLCBNYXRoLm1pbihNYXRoLlBJLXRoaXMuZHJhZ0FuZ2xlLCBhbmdsZSkpO1xyXG4gIH1cclxuXHJcbiAgb25QaWNrQ2FsbGJhY2sob2JqZWN0KSB7XHJcbiAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICBjb25zdCBibG9jayA9IG9iamVjdC5vYmplY3QudXNlckRhdGEuc2VsZixcclxuICAgICAgICAgIHAgPSB7Li4ub2JqZWN0LnV2fSwgaSA9IG9iamVjdC5mYWNlLm1hdGVyaWFsSW5kZXg7XHJcbiAgICBpZihpPDIpIHtcclxuICAgICAgcC54ID0gaT09PTA/IHAueDogMS1wLng7XHJcbiAgICAgIGlmKGJsb2NrLmNvcm5lclRhcmdldC50ZXN0SW50ZXJzZWN0aW9uKG51bGwsIHApICYmIGJsb2NrLnBoeXNpY0lkKSB7XHJcbiAgICAgICAgaWYodGhpcy5ob3ZlckluZm8pIHtcclxuICAgICAgICAgIHRoaXMuY2xlYXJIb3ZlckluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmxvY2suZm9yY2UgPSBTaGVldFBoeXNpY3MuZHJhZ0ZvcmNlQ2xiO1xyXG4gICAgICAgIGJsb2NrLmNvcm5lckZvcmNlID0gU2hlZXRQaHlzaWNzLmdldERyYWdDb3JuZXJGb3JjZUNsYih0aGlzLmNvbXB1dGVUYXJnZXQob2JqZWN0LnBvaW50KSk7XHJcbiAgICAgICAgdGhpcy5kcmFnSW5mbyA9IHtcclxuICAgICAgICAgIG9iamVjdCxcclxuICAgICAgICAgIGJsb2NrXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGFnZU1hbmFnZXIudHVybk9mZkV2ZW50cygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnQ2FsbGJhY2socG9pbnQpIHtcclxuICAgIGNvbnN0IGJsb2NrID0gdGhpcy5kcmFnSW5mby5ibG9jaywgcCA9IGJsb2NrLmdldFByb3BzKCk7XHJcbiAgICBibG9jay5mb3JjZSA9IFNoZWV0UGh5c2ljcy5kcmFnRm9yY2VDbGI7XHJcbiAgICBibG9jay5jb3JuZXJGb3JjZSA9IFNoZWV0UGh5c2ljcy5nZXREcmFnQ29ybmVyRm9yY2VDbGIodGhpcy5jb21wdXRlVGFyZ2V0KHBvaW50KSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uUmVsZWFzZUNhbGxiYWNrKCkge1xyXG4gICAgZGVsZXRlIHRoaXMuZHJhZ0luZm8uYmxvY2suZm9yY2U7XHJcbiAgICBkZWxldGUgdGhpcy5kcmFnSW5mby5ibG9jay5jb3JuZXJGb3JjZTtcclxuICAgIGRlbGV0ZSB0aGlzLmRyYWdJbmZvO1xyXG4gICAgdGhpcy5wYWdlTWFuYWdlci50dXJuT25FdmVudHMoKTtcclxuICB9XHJcblxyXG4gIGdldEZsaXBwaW5nKGkpIHtcclxuICAgIHJldHVybi
13345BpPyB0aGlzLmdldExlZnRGbGlwcGluZygpOiB0aGlzLmdldFJpZ2h0RmxpcHBpbmcoKTtcclxuICB9XHJcblxyXG4gIGZsaXAoaSwgc2l6ZT0xKSB7XHJcbiAgICByZXR1cm4gaT8gdGhpcy5mbGlwTGVmdChzaXplKTogdGhpcy5mbGlwUmlnaHQoc2l6ZSk7XHJcbiAgfVxyXG5cclxuICBlbmFibGVNb3VzZShlbmFibGUpIHtcclxuICAgIHRoaXMubW91c2VDb250cm9sbGVyID0gZW5hYmxlO1xyXG4gIH1cclxuXHJcbiAgY29ybmVyQ2FsbGJhY2soZSwgZGF0YSkge1xyXG4gICAgaWYodGhpcy5tb3VzZUNvbnRyb2xsZXIpIHtcclxuICAgICAgY29uc3Qge2ksIG59ID0gZGF0YS5kYXRhO1xyXG4gICAgICBpZihlLnR5cGU9PT0nbW91c2VvdmVyJykge1xyXG4gICAgICAgIGlmKHRoaXMuaG92ZXJJbmZvICYmIHRoaXMuaG92ZXJJbmZvLnBlbmRpbmdzIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICArK3RoaXMuaG92ZXJJbmZvLnBlbmRpbmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmKHRoaXMuaG92ZXJJbmZvKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignV3Jvbmcgc3RhdGU6IGVsZW1lbnQgaXMgYWxyZWFkeSBob3ZlcicpO1xyXG4gICAgICAgICAgICBpZih0aGlzLmhvdmVySW5mby5uIT09bikge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJIb3ZlckluZm8oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoIXRoaXMuaG92ZXJJbmZvICYmICF0aGlzLmRyYWdJbmZvKSB7XHJcbiAgICAgICAgICAgIGxldCByZXMgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgY29uc3QgaG92ZXJBbmdsZSA9IDAuMDIsXHJcbiAgICAgICAgICAgICAgICAgIGhvdmVyID0gdGhpcy5nZXRCbG9ja0J5UGFnZShuKSxcclxuICAgICAgICAgICAgICAgICAgcG9zc2libGUgPSB0aGlzLmdldEZsaXBwaW5nKGkpO1xyXG4gICAgICAgICAgICBpZihuPjEgJiYgbjwyKih0aGlzLnAuc2hlZXRzKzEpICYmIGhvdmVyLnBoeXNpY0lkICYmIChob3Zlci5hbmdsZTxob3ZlckFuZ2xlIHx8IGhvdmVyLmFuZ2xlPk1hdGguUEktaG92ZXJBbmdsZSkpIHtcclxuICAgICAgICAgICAgICByZXMgPSBQcm9taXNlLnJlc29sdmUoaG92ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoaG92ZXI9PT1wb3NzaWJsZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNoZWV0QmxvY2tzID0gW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0Q292ZXIsXHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnNoZWV0QmxvY2tzLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodENvdmVyXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICBjb25zdCBqID0gc2hlZXRCbG9ja3MuaW5kZXhPZihob3ZlciksIG5leHRCbG9jayA9IH5qPyBzaGVldEJsb2Nrc1tqKzIqaS0xXTogdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgIGlmKCFuZXh0QmxvY2sgfHwgIW5leHRCbG9jay5waHlzaWNJZCB8fCBuZXh0QmxvY2suYW5nbGU+aG92ZXJBbmdsZSAmJiBuZXh0QmxvY2suYW5nbGU8TWF0aC5QSS1ob3ZlckFuZ2xlKSB7XHJcbiAgICAgICAgICAgICAgICByZXMgPSB0aGlzLmZsaXAoaSwgMSkudGhlbigoYmxvY2spPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZighYmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5ob3ZlckluZm87XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVldFBoeXNpY3Muc2V0UGFyYW1ldHIoYmxvY2sucGh5c2ljSWQsICd2ZWxvY2l0eScsIDApO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlckluZm8gPSB7XHJcbiAgICAgICAgICAgICAgICAgIHBlbmRpbmdzOiAxXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXMudGhlbigoYmxvY2spPT4ge1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMuaG92ZXJJbmZvICYmIHRoaXMuaG92ZXJJbmZvLnBlbmRpbmdzPDEpIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuaG92ZXJJbmZvO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihibG9jaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlTWFuYWdlci50dXJuT2ZmRXZlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAgcCA9IGJsb2NrLmdldFByb3BzKCk7XHJcbiAgICAgICAgICAgICAgICBibG9jay5mb3JjZSA9IHRoaXMuc2hlZXRQaHlzaWNzLmdldFRhcmdldEZvcmNlQ2xiKHAubWFzcypibG9jay5nZXRTaXplKCksIGk/IE1hdGguUEktaG92ZXJBbmdsZTogaG92ZXJBbmdsZSk7XHJcbiAgICAgICAgICAgICAgICBibG9jay5jb3JuZXJGb3JjZSA9ICgpPT4gKGk/IC0xOiAxKSpTaGVldFBoeXNpY3MuaG92ZXJDb3JuZXJGb3JjZUNsYigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGVldFBoeXNpY3Muc2V0UGFyYW1ldHIoYmxvY2sucGh5c2ljSWQsICdhbmdsZScsIGk/IE1hdGguUEktMC41KmhvdmVyQW5nbGU6IDAuNSpob3ZlckFuZ2xlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgICBuLFxyXG4gICAgICAgICAgICAgICAgICBibG9ja1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKDEvMzApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKHRoaXMuaG92ZXJJbmZvICYmIGUudHlwZT09PSdtb3VzZW91dCcpIHtcclxuICAgICAgICBpZih0aGlzLmhvdmVySW5mby5wZW5kaW5ncyE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgLS10aGlzLmhvdmVySW5mby5wZW5kaW5ncztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihuPT09dGhpcy5ob3ZlckluZm8ubikge1xyXG4gICAgICAgICAgdGhpcy5jbGVhckhvdmVySW5mbygpO1xyXG4gICAgICAgI
13345H1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKGUudHlwZT09PSdtb3VzZWRvd24nKSB7XHJcbiAgICAgICAgdGhpcy5jb3JuZXJDbGlja0RhdGEgPSB7XHJcbiAgICAgICAgICB4OiBlLnBhZ2VYLFxyXG4gICAgICAgICAgeTogZS5wYWdlWVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihlLnR5cGU9PT0nY2xpY2snKSB7XHJcbiAgICAgICAgaWYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuY29ybmVyQ2xpY2tEYXRhLngtZS5wYWdlWCwyKStNYXRoLnBvdyh0aGlzLmNvcm5lckNsaWNrRGF0YS55LWUucGFnZVksMikpPDUpIHtcclxuICAgICAgICAgIGNvbnN0IGhvdmVyID0gdGhpcy5nZXRCbG9ja0J5UGFnZShuKTtcclxuICAgICAgICAgIGlmKGhvdmVyLnBoeXNpY0lkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaG92ZXIucGh5c2ljSWQsXHJcbiAgICAgICAgICAgICAgICAgIHByb3BzID0gaG92ZXIuZ2V0UHJvcHMoKTtcclxuICAgICAgICAgICAgdGhpcy5zaGVldFBoeXNpY3Muc2V0UGFyYW1ldHIoaWQsICd2ZWxvY2l0eScsIChpPyAtMTogMSkqcHJvcHMuc3RhcnRWZWxvY2l0eSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmNvcm5lckNsaWNrRGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkU2hlZXRCbG9jayhwLCBibG9jaykge1xyXG4gICAgdGhpcy5zaGVldEJsb2Nrcy5zcGxpY2UocCwgMCwgYmxvY2spO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVTaGVldEJsb2NrKGJsb2NrLCAyKTtcclxuICAgIHRoaXMudGhyZWVTaGVldEJsb2Nrcy5hZGQoYmxvY2sudGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlU2hlZXRCbG9jayhibG9jaywgb2Zmc2V0KSB7XHJcbiAgICBjb25zdCBldmVudENvbnZlcnRlciA9IG5ldyBDdXN0b21FdmVudENvbnZlcnRlcih0aGlzLnZpc3VhbC53bmQsIHRoaXMudmlzdWFsLmRvYywgQ2lyY2xlVGFyZ2V0LnRlc3QpLFxyXG4gICAgICAgICAgciA9IDAuMTUsXHJcbiAgICAgICAgICB0YXJnZXQgPSBuZXcgQ2lyY2xlVGFyZ2V0KDEtMC41KnIsIDAuNSpyLCByKTtcclxuICAgIHRhcmdldC5ibG9jayA9IGJsb2NrO1xyXG4gICAgdGFyZ2V0LmNhbGxiYWNrID0gdGhpcy5jb3JuZXJDYWxsYmFjay5iaW5kKHRoaXMpO1xyXG4gICAgZXZlbnRDb252ZXJ0ZXIuYWRkQ3VzdG9tKHRhcmdldCk7XHJcbiAgICBibG9jay5jb3JuZXJUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICBibG9jay50aHJlZS51c2VyRGF0YS5tb3VzZUNhbGxiYWNrID0gKGUsIGRhdGEpPT4ge1xyXG4gICAgICBjb25zdCBpID0gZGF0YS5mYWNlLm1hdGVyaWFsSW5kZXg7XHJcbiAgICAgIGlmKGk8Mikge1xyXG4gICAgICAgIGNvbnN0IG4gPSBpPT09MD8gb2Zmc2V0KzIqYmxvY2sucC5maXJzdDogb2Zmc2V0KzIqYmxvY2sucC5sYXN0LTE7XHJcbiAgICAgICAgZXZlbnRDb252ZXJ0ZXIuY29udmVydChlLCB7eDogaT09PTA/IGRhdGEudXYueDogMS1kYXRhLnV2LngsIHk6IGRhdGEudXYueSwgaSwgbn0pO1xyXG4gICAgICAgIHRoaXMucGFnZU1hbmFnZXIudHJhbnNmZXJFdmVudFRvVGV4dHVyZShuLCBlLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGJsb2NrLnRocmVlLnVzZXJEYXRhLnRvdWNoQ2FsbGJhY2sgPSAoZSwgZGF0YSk9PiB7XHJcbiAgICAgIGNvbnN0IGkgPSBkYXRhLmZhY2UubWF0ZXJpYWxJbmRleDtcclxuICAgICAgaWYoaTwyKSB7XHJcbiAgICAgICAgY29uc3QgbiA9IGk9PT0wPyBvZmZzZXQrMipibG9jay5wLmZpcnN0OiBvZmZzZXQrMipibG9jay5wLmxhc3QtMTtcclxuICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLnRyYW5zZmVyRXZlbnRUb1RleHR1cmUobiwgZSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aGlzLnZpc3VhbC5kcmFnLmFkZFRocmVlKGJsb2NrLnRocmVlKTtcclxuICAgIHRoaXMudmlzdWFsLm1vdXNlRXZlbnRzLmFkZFRocmVlKGJsb2NrLnRocmVlKTtcclxuICAgIHRoaXMudmlzdWFsLnRvdWNoRXZlbnRzLmFkZFRocmVlKGJsb2NrLnRocmVlKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVNoZWV0QmxvY2soYmxvY2spIHtcclxuICAgIHRoaXMudmlzdWFsLm1vdXNlRXZlbnRzLnJlbW92ZVRocmVlKGJsb2NrLnRocmVlKTtcclxuICAgIHRoaXMudmlzdWFsLnRvdWNoRXZlbnRzLnJlbW92ZVRocmVlKGJsb2NrLnRocmVlKTtcclxuICAgIHRoaXMudmlzdWFsLmRyYWcucmVtb3ZlVGhyZWUoYmxvY2sudGhyZWUpO1xyXG4gICAgdGhpcy50aHJlZVNoZWV0QmxvY2tzLnJlbW92ZShibG9jay50aHJlZSk7XHJcbiAgICBibG9jay5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTaGVldEJsb2NrcyhmaXJzdCwgc2l6ZSkge1xyXG4gICAgY29uc3QgYmxvY2tzID0gdGhpcy5zaGVldEJsb2Nrcy5zcGxpY2UoZmlyc3QsIHNpemUpO1xyXG4gICAgZm9yKGxldCBibG9jayBvZiBibG9ja3MpIHtcclxuICAgICAgdGhpcy5yZW1vdmVTaGVldEJsb2NrKGJsb2NrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFRleHR1cmUobWF0ZXJpYWwsIG4pIHtcclxuICAgIHRoaXMucGFnZU1hbmFnZXIuc2V0VGV4dHVyZShtYXRlcmlhbCwgbik7XHJcbiAgfVxyXG5cclxuICBzZXRQYWdlVGV4dHVyZShtYXRlcmlhbCwgbikge1xyXG4gICAgdGhpcy5zZXRUZXh0dXJlKG1hdGVyaWFsLCBuKzIpO1xyXG4gIH1cclxuXHJcbiAgc2V0TGVmdENvdmVyVGV4dHVyZShtYXRlcmlhbCwgbikge1xyXG4gICAgdGhpcy5zZXRUZXh0dXJlKG1hdGVyaWFsLCBuKTtcclxuICB9XHJcblxyXG4gIHNldFJpZ2h0Q292ZXJUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICB0aGlzLnNldFRleHR1cmUobWF0ZXJpYWwsIG4rMioodGhpcy5wLnNoZWV0cysxKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZmluaXNoQW5pbWF0aW9uQ2xiKGFuZ2xlKSB7XHJcbiAgICB0aGlzLmJsb2NrLnNldCh0aGlzLmJvb2suZ2V0Q2xvc2VkQmxvY2tBbmdsZShhbmdsZSkuY2xvc2VkQW5nbGUsJ2Nsb3NlZCcsMCk7XHJcbiAgICBjb25zdCBpID0gdGhpcy5ib29rLnNoZWV0QmxvY2tzLmluZGV4T2YodGhpcy5ibG9jayk7XHJcbiAgICBpZih+aSkge1xyXG4gICAgICBpZihhbmdsZT09PTApIHtcclxuICAgICAgICB0aGlzLmJvb2subWVyZ2VTaGVldEJsb2NrcyhpLCB0aGlzLmJvb2suc2hlZXRCbG9ja3MubGVuZ3RoLWkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgI
13345HRoaXMuYm9vay5tZXJnZVNoZWV0QmxvY2tzKDAsIGkrMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNCbG9ja0ZvcmNlKGJsb2NrLCBvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KSB7XHJcbiAgICByZXR1cm4gYmxvY2suZm9yY2U/IGJsb2NrLmZvcmNlKG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpOiAwO1xyXG4gIH1cclxuXHJcbiAgY2FsY0Jsb2NrQ29ybmVyRm9yY2UoYmxvY2ssIG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpIHtcclxuICAgIHJldHVybiBibG9jay5jb3JuZXJGb3JjZT8gYmxvY2suY29ybmVyRm9yY2Uob2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCk6IDA7XHJcbiAgfVxyXG5cclxuICBub3RpZnlCZWZvcmVBbmltYXRpb24oKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgaWYodGhpcy5hbmltYXRpb25Ob3RpZmljYXRpb24pIHtcclxuICAgICAgcmVzID0gUHJvbWlzZS5yZWplY3QoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmFuaW1hdGlvbk5vdGlmaWNhdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7XHJcbiAgICAgICAgdHlwZTogJ2JlZm9yZUFuaW1hdGlvbidcclxuICAgICAgfSk7XHJcbiAgICAgIHJlcyA9IHRoaXMubGF5ZXJNYW5hZ2VyLmhpZGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBub3RpZnlBZnRlckFuaW1hdGlvbigpIHtcclxuICAgIGlmKHRoaXMuYW5pbWF0aW9uTm90aWZpY2F0aW9uKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFuaW1hdGlvbk5vdGlmaWNhdGlvbjtcclxuICAgICAgdGhpcy5sYXllck1hbmFnZXIuc2hvdygpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe1xyXG4gICAgICAgIHR5cGU6ICdhZnRlckFuaW1hdGlvbidcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25uZWN0UGh5c2ljcyhibG9jaywgbWFzcywgYW5nbGUsIHZlbG9jaXR5LCBmbGV4aWJpbGl0eSwgY292ZXJIZWlnaHQsIHNpbXVsYXRlQ2xiLCByZW1vdmVDbGIsIHByb2dyZXNzQ2xiKSB7XHJcbiAgICBjb25zdCB0eXBlID0gKCk9PiB0aGlzLmhvdmVySW5mbz8gJ2hvdmVyJzogKHRoaXMuZHJhZ0luZm8/ICdkcmFnJzogJ2ZyZWUnKSxcclxuICAgICAgcmVzID0gdGhpcy5zaGVldFBoeXNpY3MuZ2V0U2l6ZSgpPyBQcm9taXNlLnJlc29sdmUoKTogdGhpcy5ub3RpZnlCZWZvcmVBbmltYXRpb24oKTtcclxuICAgIHJldHVybiByZXMudGhlbigoKT0+IHtcclxuICAgICAgYmxvY2sucGh5c2ljSWQgPSB0aGlzLnNoZWV0UGh5c2ljcy5hZGRPYmplY3QoXHJcbiAgICAgICAgbWFzcyxcclxuICAgICAgICBhbmdsZSxcclxuICAgICAgICB2ZWxvY2l0eSxcclxuICAgICAgICBmbGV4aWJpbGl0eSxcclxuICAgICAgICBjb3ZlckhlaWdodCxcclxuICAgICAgICAoYW5nbCwgY2gpPT4ge1xyXG4gICAgICAgICAgc2ltdWxhdGVDbGIoYW5nbCwgY2gpO1xyXG4gICAgICAgICAgcHJvZ3Jlc3NDbGIoYmxvY2ssIE1hdGguYWJzKGFuZ2xlLWFuZ2wpL01hdGguUEksICdwcm9jZXNzJywgdHlwZSgpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChhbmdsLCBjaCk9PiB7XHJcbiAgICAgICAgICByZW1vdmVDbGIoYW5nbCwgY2gpO1xyXG4gICAgICAgICAgZGVsZXRlIGJsb2NrLnBoeXNpY0lkO1xyXG4gICAgICAgICAgcHJvZ3Jlc3NDbGIoYmxvY2ssIE1hdGguYWJzKGFuZ2xlLWFuZ2wpL01hdGguUEksICdmaW5pc2gnLCB0eXBlKCkpO1xyXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+IHtcclxuICAgICAgICAgICAgaWYoIXRoaXMuc2hlZXRQaHlzaWNzLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubm90aWZ5QWZ0ZXJBbmltYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAob2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCk9PiB0aGlzLmNhbGNCbG9ja0ZvcmNlKGJsb2NrLCBvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KSxcclxuICAgICAgICAob2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCk9PiB0aGlzLmNhbGNCbG9ja0Nvcm5lckZvcmNlKGJsb2NrLCBvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KVxyXG4gICAgICApO1xyXG4gICAgICBwcm9ncmVzc0NsYihibG9jaywgMCwgJ2luaXQnLCB0eXBlKCkpO1xyXG4gICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICB9KS5jYXRjaCgoKT0+IHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoZHQpIHtcclxuICAgIHRoaXMubGFzdE1vdXNlUG9zLnQrPWR0O1xyXG4gICAgaWYodGhpcy5pc1Byb2Nlc3NpbmcoKSAmJiB0aGlzLmxhc3RNb3VzZVBvcy5wYWdlWCE9PXVuZGVmaW5lZCAmJiB0aGlzLmxhc3RNb3VzZVBvcy50LSh0aGlzLmxhc3RNb3VzZVBvcy5sYXN0VCB8fCAwKT4wLjI1ICYmICF0aGlzLmhvdmVySW5mbyAmJiAhdGhpcy5kcmFnSW5mbykge1xyXG4gICAgICB0aGlzLmxhc3RNb3VzZVBvcy5sYXN0VCA9IHRoaXMubGFzdE1vdXNlUG9zLnQ7XHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgJCh0aGlzLnZpc3VhbC5lbGVtZW50KS50cmlnZ2VyKCQuRXZlbnQoJ21vdXNlbW92ZScsIHRoaXMubGFzdE1vdXNlUG9zKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaGVldFBoeXNpY3Muc2ltdWxhdGUoZHQpO1xyXG4gIH1cclxuXHJcbiAgc3BsaXRTaGVldEJsb2NrKGksIGxlZnRTaXplKSB7XHJcbiAgICBjb25zdCBibG9jayA9IHRoaXMuc2hlZXRCbG9ja3NbaV07XHJcbiAgICBpZihibG9jayAmJiBsZWZ0U2l6ZTxibG9jay5nZXRTaXplKCkpIHtcclxuICAgICAgY29uc3QgbmV3QmxvY2sgPSBuZXcgU2hlZXRCbG9jayh0aGlzLnZpc3VhbCwgey4uLnRoaXMucCwgc2V0VGV4dHVyZTogdGhpcy5zZXRQYWdlVGV4dHVyZS5iaW5kKHRoaXMpfSwgYmxvY2sucC5maXJzdCwgYmxvY2sucC5maXJzdCtsZWZ0U2l6ZSwgYmxvY2suYW5nbGUsIGJsb2NrLnN0YXRlKTtcclxuICAgICAgYmxvY2suc2V0KGJsb2NrLmFuZ2xlLCBibG9jay5zdGF0ZSwgYmxvY2suY29ybmVyLmhlaWdodCwgYmxvY2sucC5maXJzdCtsZWZ0U2l6ZSwgYmxvY2sucC5sYXN0KTtcclxuICAgICAgdGhpcy5hZGRTaGVldEJsb2NrKGksIG5ld0Jsb2NrKTtcclxuICAgICAgcmV0dXJuIFtuZXdCbG9jaywgYmxvY2tdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWVyZ2VTaGVldEJsb2NrcyhmaXJzdCwgc2l6ZSkge1xyXG4gICAgaWYoZmlyc3Q8dGhpcy5zaGVldEJsb2Nrcy5sZW5ndGgpIHtcclxuICAgICAgc2l6ZSA9IE1hdGgubWluKHRoaXMuc2hlZXRCbG9ja3MubGVuZ3RoLWZpcnN0LCBzaXplKTtcclxuICAgICAgY29uc3QgZmlyc3RCbG9jayA9IHRoaXMuc2hlZXRCbG9ja3NbZmlyc3RdLCBsYXN0QmxvY2sgPSB0aGlzLnNoZWV0QmxvY2tzW2ZpcnN0K3NpemUtMV07XHJcbiAgICAgIGZpcnN0QmxvY2suc2V0KGZpcnN0QmxvY2suYW5nbGUsIGZpcnN0QmxvY2suc3RhdGUsIGZpcnN0QmxvY2suY29ybmVyLmhlaWdodCwgZmlyc3RCbG9jay5wLmZpcnN0LCBsYXN0QmxvY2sucC5sYXN0KTtcclxuICAgICAgdGhpcy5yZW1vdmVTaGVldEJsb2NrcyhmaXJzdCsxLCBzaXplLTEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0U2hlZXRCbG9ja3MoYW5nbGUsIHN0YXRl
13345KSB7XHJcbiAgICBpZihzdGF0ZT09PSdjbG9zZWQnKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VkQW5nbGUgPSBhbmdsZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hlZXRCbG9ja3MuZm9yRWFjaCgocyk9PiB7XHJcbiAgICAgIGlmKCFzLnBoeXNpY0lkKSB7XHJcbiAgICAgICAgcy5zZXQoYW5nbGUsIHN0YXRlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXQoYW5nbGUsIGhlaWdodD0wKSB7XHJcbiAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XHJcbiAgICBjb25zdCBQSSA9IE1hdGguUEk7XHJcbiAgICBpZihhbmdsZTxQSS80KSB7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldCgwKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLVBJLzIrMiphbmdsZSk7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSS8yLCdvcGVuZWQnLGhlaWdodCk7XHJcblxyXG4gICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKDAsJ2Nsb3NlZCcpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoMCk7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoMCwnY2xvc2VkJywwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8MipQSS80KSB7XHJcbiAgICAgIGNvbnN0IGE9MiooYW5nbGUtUEkvNCk7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChhKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLWEpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEkvMithLCdvcGVuZWQnLGhlaWdodCk7XHJcblxyXG4gICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKGEsJ2Nsb3NlZCcpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLWEpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KGEsJ2Nsb3NlZCcsMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDMqUEkvNCkge1xyXG4gICAgICBjb25zdCBhPTIqKGFuZ2xlLVBJLzIpO1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoUEkvMik7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1QSS8yKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLCdvcGVuZWQnLDApO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLVBJLzIpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KGEsJ29wZW5lZCcsaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8NCpQSS80KSB7XHJcbiAgICAgIGNvbnN0IGE9MiooYW5nbGUtMypQSS80KStQSS8yO1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoYSk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1hKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KGEsJ2Nsb3NlZCcsMCk7XHJcblxyXG4gICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKGEsJ2Nsb3NlZCcpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLVBJLzIpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KFBJLzIsJ29wZW5lZCcsaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8NSpQSS80KSB7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChQSSk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1QSSk7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSSwnY2xvc2VkJywwKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoUEksJ2Nsb3NlZCcpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLVBJLzItMiooYW5nbGUtUEkpKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldChQSS8yLCdvcGVuZWQnLGhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDYqUEkvNCkge1xyXG4gICAgICBjb25zdCBhPTIqKGFuZ2xlLTUqUEkvNCk7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChQSS1hKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLVBJK2EpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEktYSwnY2xvc2VkJywwKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoUEktYSwnY2xvc2VkJyk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtUEkrYSk7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoUEkvMi1hLCdvcGVuZWQnLGhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDcqUEkvNCkge1xyXG4gICAgICBjb25zdCBhPTIqKGFuZ2xlLTYqUEkvNCk7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChQSS8yKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLVBJLzIpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEktYSwnb3BlbmVkJyxoZWlnaHQpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLVBJLzIpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KDAsJ29wZW5lZCcsMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDgqUEkvNCkge1xyXG4gICAgICBjb25zdCBhPTIqKGFuZ2xlLTcqUEkvNCk7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChQSS8yLWEpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtUEkvMik7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSS8yLCdvcGVuZWQnLGhlaWdodCk7XHJcblxyXG4gICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKFBJLzItYSwnY2xvc2VkJyk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtUEkvMithKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldChQSS8yLWEsJ2Nsb3NlZCcsMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlU2lkZVRleHR1cmUoY29sb3IpIHtcclxuICAgIGNvbnN0IGpDID0gJCgnPGNhbnZhcyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCI+PC9jYW52YXM+Jyk7XHJcbiAgICBjb25zdCBjdHggPSBqQ1swXS5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgY3R4LmZpbGxTdHlsZSA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYShjb2xvciwgMSk7XHJcbiAgICBjdHgucmVjdCgwLCAwLCA4LCA3KTtcclxuICAgIGN0eC5maWxsKCk7XHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKGNvbG9yLDAuNSksI
13345DEpO1xyXG4gICAgY3R4LnJlY3QoMCwgNywgOCwgMSk7XHJcbiAgICBjdHguZmlsbCgpO1xyXG4gICAgcmV0dXJuIGpDWzBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHByZXBhcmVQcm9wcyhwcm9wcykge1xyXG4gICAgcmV0dXJuIEJvb2suY2FsY1Byb3BzKEJvb2subWVyZ2VQcm9wcyhib29rUHJvcHMoKSwgcHJvcHMpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtZXJnZVByb3BzKGZpcnN0LCBzZWNvbmQpIHtcclxuICAgIHNlY29uZCA9IHNlY29uZCB8fCB7fTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmZpcnN0LFxyXG4gICAgICAuLi5zZWNvbmQsXHJcbiAgICAgIHNoZWV0OiB7XHJcbiAgICAgICAgLi4uZmlyc3Quc2hlZXQsXHJcbiAgICAgICAgLi4uc2Vjb25kLnNoZWV0LFxyXG4gICAgICB9LFxyXG4gICAgICBjb3Zlcjoge1xyXG4gICAgICAgIC4uLmZpcnN0LmNvdmVyLFxyXG4gICAgICAgIC4uLnNlY29uZC5jb3ZlcixcclxuICAgICAgfSxcclxuICAgICAgcGFnZToge1xyXG4gICAgICAgIC4uLmZpcnN0LnBhZ2UsXHJcbiAgICAgICAgLi4uc2Vjb25kLnBhZ2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNzc0xheWVyUHJvcHM6IHtcclxuICAgICAgICAuLi5maXJzdC5jc3NMYXllclByb3BzLFxyXG4gICAgICAgIC4uLnNlY29uZC5jc3NMYXllclByb3BzLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGNQcm9wcyhwcm9wcykge1xyXG4gICAgY29uc3QgcCA9IHtcclxuICAgICAgLi4ucHJvcHMsXHJcbiAgICAgIHNoZWV0OiB7XHJcbiAgICAgICAgLi4ucHJvcHMuc2hlZXRcclxuICAgICAgfSxcclxuICAgICAgY292ZXI6IHtcclxuICAgICAgICAuLi5wcm9wcy5zaGVldCxcclxuICAgICAgICAuLi5wcm9wcy5jb3ZlclxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlOiB7XHJcbiAgICAgICAgLi4ucHJvcHMuc2hlZXQsXHJcbiAgICAgICAgLi4ucHJvcHMucGFnZVxyXG4gICAgICB9LFxyXG4gICAgICBjc3NMYXllclByb3BzOiB7XHJcbiAgICAgICAgLi4ucHJvcHMuY3NzTGF5ZXJQcm9wcyxcclxuICAgICAgICAkXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBzY2FsZSA9IDUwLFxyXG4gICAgaGVpZ2h0ID0gc2NhbGUqcC5oZWlnaHQsXHJcbiAgICB3aWR0aCA9IHNjYWxlKnAud2lkdGgsXHJcbiAgICBmbGlwUHJvZ3Jlc3NDbGIgPSAoKT0+IHVuZGVmaW5lZCxcclxuICAgIHNoZWV0ID0ge1xyXG4gICAgICBzaWRlVGV4dHVyZTogcC5zaGVldC5zaWRlVGV4dHVyZSB8fCBCb29rLmNyZWF0ZVNpZGVUZXh0dXJlKHAuc2hlZXQuY29sb3IpLFxyXG4gICAgfSxcclxuICAgIGNvdmVyID0ge1xyXG4gICAgICAuLi5zaGVldCxcclxuICAgICAgLi4ucC5jb3ZlcixcclxuICAgICAgZGVwdGg6IHNjYWxlKnAuY292ZXIuZGVwdGgsXHJcbiAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgIHBhZGRpbmc6IHNjYWxlKnAuY292ZXIucGFkZGluZ1xyXG4gICAgfSxcclxuICAgIHBhZ2UgPSB7XHJcbiAgICAgIC4uLnNoZWV0LFxyXG4gICAgICAuLi5wLnBhZ2UsXHJcbiAgICAgIGRlcHRoOiBzY2FsZSpwLnBhZ2UuZGVwdGgsXHJcbiAgICAgIHdpZHRoOiBjb3Zlci53aWR0aCAtIGNvdmVyLnBhZGRpbmcsXHJcbiAgICAgIGhlaWdodDogY292ZXIuaGVpZ2h0IC0gMipjb3Zlci5wYWRkaW5nXHJcbiAgICB9LFxyXG4gICAgbWFya2VyID0ge1xyXG4gICAgICB1c2U6IGZhbHNlLFxyXG4gICAgICBjb2xvcjogMFhGRjAwMDAsXHJcbiAgICAgIHNpemU6IHNjYWxlKjAuMDAxXHJcbiAgICB9O1xyXG4gICAgaWYoY292ZXIuY29sb3IhPT1zaGVldC5jb2xvciAmJiAhcC5jb3Zlci5zaWRlVGV4dHVyZSkge1xyXG4gICAgICBjb3Zlci5zaWRlVGV4dHVyZSA9IEJvb2suY3JlYXRlU2lkZVRleHR1cmUoY292ZXIuY29sb3IpO1xyXG4gICAgfVxyXG4gICAgaWYocGFnZS5jb2xvciE9PXNoZWV0LmNvbG9yICYmICFwLnBhZ2Uuc2lkZVRleHR1cmUpIHtcclxuICAgICAgcGFnZS5zaWRlVGV4dHVyZSA9IEJvb2suY3JlYXRlU2lkZVRleHR1cmUocGFnZS5jb2xvcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gey4uLnAsIHNjYWxlLCBoZWlnaHQsIHdpZHRoLCBmbGlwUHJvZ3Jlc3NDbGIsIGNvdmVyLCBwYWdlLCBtYXJrZXJ9O1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Cb29rLmpzIiwiaW1wb3J0IHskLCBUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBDb250cm9sbGVyIGZyb20gJ0NvbnRyb2xsZXInO1xyXG5pbXBvcnQge3Byb3BzIGFzICBib29rQ29udHJvbGxlclByb3BzfSBmcm9tICcuLi9wcm9wcy9ib29rQ29udHJvbGxlcic7XHJcbmltcG9ydCBFdmVudHNUb0FjdGlvbnMgZnJvbSAnRXZlbnRzVG9BY3Rpb25zJztcclxuaW1wb3J0IFN0YXRzIGZyb20gJ3N0YXRzLmpzJztcclxuaW1wb3J0IE9iamVjdDNEV2F0Y2hlciBmcm9tICdPYmplY3QzRFdhdGNoZXInO1xyXG5pbXBvcnQgRnVsbFNjcmVlbiBmcm9tICdGdWxsU2NyZWVuJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2tDb250cm9sbGVyIGV4dGVuZHMgQ29udHJvbGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGJvb2ssIHZpZXcsIHByb3BzKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMgPSB0cnVlO1xyXG4gICAgdGhpcy5ib29rID0gYm9vaztcclxuICAgIHRoaXMudmlzdWFsID0gYm9vay52aXN1YWw7XHJcbiAgICB0aGlzLnAgPSBCb29rQ29udHJvbGxlci5wcmVwYXJlUHJvcHMocHJvcHMpO1xyXG4gICAgdGhpcy5wLnJ0bCA9IGJvb2sucC5ydGw7XHJcbiAgICB0aGlzLmRldmljZVBpeGVsUmF0aW8gPSB0aGlzLnZpc3VhbC53bmQuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xyXG5cclxuICAgIHRoaXMub3JiaXQgPSBib29rLnZpc3VhbC5nZXRPcmJpdCgpO1xyXG4gICAgYm9vay5zZXRGbGlwUHJvZ3Jlc3NDbGIodGhpcy51cGRhdGVWaWV3SWZTdGF0ZS5iaW5kKHRoaXMpKTtcclxuICAgIHRoaXMudmlldyA9IHZpZXc7XHJcbiAgICB0aGlzLmJpbmRBY3Rpb25zKCk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgc21hcnRQYW46ICF0aGlzLmFjdGlvbnNbJ2NtZFNtYXJ0UGFuJ10uYWN0aXZlLFxyXG4gICAgICBzaW5nbGVQYWdlOiB0aGlzLmFjdGlvbnNbJ2NtZFNpbmdsZVBhZ2UnXS5hY3RpdmUgfHwgdGhpcy5hY3Rpb25zWydjbWRTaW5nbGVQYWdlJ10uYWN0aXZlRm9yTW9iaWxlICYmIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbz4xLFxyXG4gICAgICBzdGF0czogdGhpcy5hY3Rpb25zWydjbWRTdGF0cyddLmFjdGl2ZSxcclxuICAgICAgbGlnaHRpbmc6IHRoaXMucC5saWdodGluZy5kZWZh
13345dWx0LFxyXG4gICAgICBhY3RpdmVTaWRlOiAxXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuYm94cyA9IFtuZXcgVEhSRUUuQm94MygpLCBuZXcgVEhSRUUuQm94MygpXTtcclxuICAgIHRoaXMuYm9va1dhdGNoZXIgPSBuZXcgT2JqZWN0M0RXYXRjaGVyKHRoaXMudmlzdWFsLCAoKT0+IHtcclxuICAgICAgaWYodGhpcy5zdGF0ZS5zaW5nbGVQYWdlKSB7XHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmVTaWRlKSB7XHJcbiAgICAgICAgICB0aGlzLmJveHNbMF0uc2V0RnJvbU9iamVjdChib29rLnJpZ2h0Q292ZXIudGhyZWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYm94c1swXS5zZXRGcm9tT2JqZWN0KGJvb2subGVmdENvdmVyLnRocmVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ib3hzWzBdLnNldEZyb21PYmplY3QoYm9vay5sZWZ0Q292ZXIudGhyZWUpO1xyXG4gICAgICAgIHRoaXMuYm94c1sxXS5zZXRGcm9tT2JqZWN0KGJvb2sucmlnaHRDb3Zlci50aHJlZSk7XHJcbiAgICAgICAgdGhpcy5ib3hzWzBdLnVuaW9uKHRoaXMuYm94c1sxXSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuYm94c1swXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ib29rV2F0Y2hlci5zY2FsZSA9IHRoaXMucC5zY2FsZS5kZWZhdWx0O1xyXG4gICAgdGhpcy5ib29rLnNldFpvb20odGhpcy5ib29rV2F0Y2hlci5zY2FsZSwgdGhpcy5zdGF0ZS5zaW5nbGVQYWdlKTtcclxuXHJcbiAgICB0aGlzLlN0YXRzID0gbmV3IFN0YXRzKCk7XHJcbiAgICB0aGlzLlN0YXRzLmRvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgdGhpcy5TdGF0cy5kb21FbGVtZW50LnN0eWxlLnRvcCA9ICcwcHgnO1xyXG5cclxuICAgIHRoaXMudmlzdWFsLnNldEV4dHJhTGlnaHRpbmcodGhpcy5zdGF0ZS5saWdodGluZyk7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBvblNjcmVlbk1vZGVDaGFuZ2VkOiB0aGlzLm9uU2NyZWVuTW9kZUNoYW5nZWQuYmluZCh0aGlzKSxcclxuICAgICAgc3RhdHM6IHRoaXMuU3RhdHMudXBkYXRlLmJpbmQodGhpcy5TdGF0cyksXHJcbiAgICAgIG9uVXBkYXRlVmlldzogdGhpcy51cGRhdGVWaWV3LmJpbmQodGhpcylcclxuICAgIH1cclxuICAgIEZ1bGxTY3JlZW4uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnZpZXcuZ2V0UGFyZW50Q29udGFpbmVyKCkub3duZXJEb2N1bWVudCwgdGhpcy5iaW5kcy5vblNjcmVlbk1vZGVDaGFuZ2VkKTtcclxuXHJcbiAgICB0aGlzLmNtZFNtYXJ0UGFuKCk7XHJcblxyXG4gICAgaWYodGhpcy52aWV3LnRlbXBsYXRlT2JqZWN0LmFwcExvYWRlZCkge1xyXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMudmlldy50ZW1wbGF0ZU9iamVjdC5hcHBMb2FkZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYm9vay5lbmFibGVMb2FkaW5nQW5pbWF0aW9uKHRoaXMucC5sb2FkaW5nQW5pbWF0aW9uLmJvb2spO1xyXG4gICAgaWYodGhpcy5wLmxvYWRpbmdBbmltYXRpb24uc2tpbikge1xyXG4gICAgICB0aGlzLmluaXRMb2FkaW5nQW5pbWF0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ib29rLmVuYWJsZUxvYWRpbmdBbmltYXRpb24odGhpcy5wLmxvYWRpbmdBbmltYXRpb24uYm9vayk7XHJcbiAgICB0aGlzLmJvb2suc2V0QXV0b1Jlc29sdXRpb24odGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZWQsIHRoaXMucC5hdXRvUmVzb2x1dGlvbi5jb2VmZmljaWVudCk7XHJcblxyXG4gICAgdGhpcy52aXN1YWwuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy51cGRhdGVWaWV3LmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIEZ1bGxTY3JlZW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLnZpZXcuZ2V0UGFyZW50Q29udGFpbmVyKCkub3duZXJEb2N1bWVudCwgdGhpcy5iaW5kcy5vblNjcmVlbk1vZGVDaGFuZ2VkKTtcclxuICAgIGRlbGV0ZSB0aGlzLmJvb2s7XHJcbiAgICBkZWxldGUgdGhpcy52aWV3O1xyXG4gICAgZGVsZXRlIHRoaXMudmlzdWFsO1xyXG4gIH1cclxuXHJcbiAgaW5pdExvYWRpbmdBbmltYXRpb24oKSB7XHJcbiAgICBjb25zdCBoYW5kbGVyID0gKCk9PiB7XHJcbiAgICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5ib29rLmdldFRvcFBhZ2VzKCk7XHJcbiAgICAgIGxldCB2aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIGZvcihsZXQgbiBvZiBwYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ib29rLmdldFBhZ2VTdGF0ZShuKTtcclxuICAgICAgICB2aXNpYmxlID0gc3RhdGU9PT11bmRlZmluZWQgfHwgc3RhdGU9PT0nbG9hZGluZyc7XHJcbiAgICAgICAgaWYodmlzaWJsZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkTG9hZGluZycsIHtcclxuICAgICAgICB2aXNpYmxlXHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHRoaXMuYm9vay5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVBbmltYXRpb24nLCBoYW5kbGVyKTtcclxuICAgIHRoaXMuYm9vay5hZGRFdmVudExpc3RlbmVyKCdhZnRlckFuaW1hdGlvbicsIGhhbmRsZXIpO1xyXG4gICAgdGhpcy5ib29rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRQYWdlJywgaGFuZGxlcik7XHJcbiAgICB0aGlzLmJvb2suYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkUGFnZScsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlTmF2aWdhdGlvbihlbmFibGUpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzID0gZW5hYmxlO1xyXG4gIH1cclxuXHJcbiAgc2V0VG9jQ3RybCh0b2NDdHJsKSB7XHJcbiAgICB0aGlzLnRvY0N0cmwgPSB0b2NDdHJsO1xyXG4gICAgdGhpcy50b2NDdHJsLm9uQ2hhbmdlID0gdGhpcy51cGRhdGVWaWV3LmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHNldFByaW50ZXIocHJpbnRlcikge1xyXG4gICAgdGhpcy5wcmludGVyID0gcHJpbnRlcjtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U291bmRzKHNvdW5kcykge1xyXG4gICAgdGhpcy5zb3VuZHMgPSBzb3VuZHM7XHJcbiAgICBzb3VuZHMuc2
13345V0RW5hYmxlZCh0aGlzLmFjdGlvbnNbJ2NtZFNvdW5kcyddLmFjdGl2ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG5cclxuICBvblNjcmVlbk1vZGVDaGFuZ2VkKGUpIHtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY2FuWm9vbUluKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnN0YXRlLnNtYXJ0UGFuIHx8IE1hdGguYWJzKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUtdGhpcy5wLnNjYWxlLm1heCk+dGhpcy5wLmVwcztcclxuICB9XHJcblxyXG4gIGNhblpvb21PdXQoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuc3RhdGUuc21hcnRQYW4gfHwgTWF0aC5hYnModGhpcy5ib29rV2F0Y2hlci5zY2FsZS10aGlzLnAuc2NhbGUubWluKT50aGlzLnAuZXBzO1xyXG4gIH1cclxuXHJcbiAgY2FuRGVmYXVsdFpvb20oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zbWFydFBhbjtcclxuICB9XHJcblxyXG4gIHNldEJvb2tab29tKHNjYWxlKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICBpZih0aGlzLmJvb2tXYXRjaGVyLnNjYWxlPT09c2NhbGUpIHtcclxuICAgICAgICB0aGlzLmJvb2suc2V0Wm9vbShzY2FsZSwgdGhpcy5zdGF0ZS5zaW5nbGVQYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBjbWRab29tSW4oKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNtYXJ0UGFuKSB7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUgPSBNYXRoLm1pbih0aGlzLnAuc2NhbGUubWF4LCB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlK3RoaXMucC5zY2FsZS5kZWx0YSk7XHJcbiAgICAgIHRoaXMuc2V0Qm9va1pvb20odGhpcy5ib29rV2F0Y2hlci5zY2FsZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vcmJpdC56b29tSW4oNi42KnRoaXMucC5zY2FsZS5kZWx0YS8wLjMyKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kWm9vbU91dCgpIHtcclxuICAgIGlmKHRoaXMuc3RhdGUuc21hcnRQYW4pIHtcclxuICAgICAgdGhpcy5ib29rV2F0Y2hlci5zY2FsZSA9IE1hdGgubWF4KHRoaXMucC5zY2FsZS5taW4sIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUtdGhpcy5wLnNjYWxlLmRlbHRhKTtcclxuICAgICAgdGhpcy5zZXRCb29rWm9vbSh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9yYml0Lnpvb21PdXQoNi42KnRoaXMucC5zY2FsZS5kZWx0YS8wLjMyKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kRGVmYXVsdFpvb20oKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNtYXJ0UGFuKSB7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUgPSB0aGlzLnAuc2NhbGUuZGVmYXVsdDtcclxuICAgICAgdGhpcy5zZXRCb29rWm9vbSh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlKTtcclxuICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRUb2MoKSB7XHJcbiAgICBpZih0aGlzLnRvY0N0cmwpIHtcclxuICAgICAgdGhpcy50b2NDdHJsLnRvZ2xlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRGYXN0QmFja3dhcmQoKSB7XHJcbiAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcExlZnQoNSkpO1xyXG4gIH1cclxuXHJcbiAgY21kQmFja3dhcmQoKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNpbmdsZVBhZ2UpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gKHRoaXMuZ2V0UGFnZSgpKzEpJTI7XHJcbiAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlU2lkZSkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9IDA7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBMZWZ0KDEpKS50aGVuKChibG9jayk9PiB7XHJcbiAgICAgICAgICBpZihibG9jaykge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBMZWZ0KDEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNtZEJpZ0JhY2t3YXJkKCkge1xyXG4gICAgdGhpcy5jbWRCYWNrd2FyZCgpO1xyXG4gIH1cclxuXHJcbiAgY21kRm9yd2FyZCgpIHtcclxuICAgIGlmKHRoaXMuc3RhdGUuc2luZ2xlUGFnZSkge1xyXG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAodGhpcy5nZXRQYWdlKCkrMSklMjtcclxuICAgICAgaWYoIXRoaXMuc3RhdGUuYWN0aXZlU2lkZSkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9IDE7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBSaWdodCgxKSkudGhlbigoYmxvY2spPT4ge1xyXG4gICAgICAgICAgaWYoYmxvY2spIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwUmlnaHQoMSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY21kQmlnRm9yd2FyZCgpIHtcclxuICAgIHRoaXMuY21kRm9yd2FyZCgpO1xyXG4gIH1cclxuXHJcbiAgY21kRmFzdEZvcndhcmQoKSB7XHJcbiAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcFJpZ2h0KDUpKTtcclxuICB9XHJcblxyXG4gIGNtZFNhdmUoKSB7XHJcbiAgICB3aW5kb3cub3Blbih0aGlzLnAuZG93bmxvYWRVUkwsICdfYmxhbmsnKTtcclxuICB9XHJcblxyXG4gIGNtZFByaW50KCkge1xyXG4gICAgdGhpcy5wcmludGVyLnByaW50KCk7XHJcbiAgfVxyXG5cclxuICBjbWRGdWxsU2NyZWVuKCkge1xyXG4gICAgaWYoIUZ1bGxTY3JlZW4uYWN0aXZhdGVkKCkpIHtcclxuICAgICAgRnVsbFNjcmVlbi5yZXF1ZXN0KHRoaXMudmlldy5nZXRQYXJlbnRDb250YWluZXIoKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRnVsbFNjcmVlbi5jYW5jZWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNtZFNtYXJ0UGFuKCkge1xyXG4gICAgdGhpcy5zdGF0ZS5zbWFydFBhbiA9ICF0aGlzLnN0YXRlLnNtYXJ0UGFuO1xyXG4gICAgaWYodGhpcy5zdGF0ZS5zbWFydFBhbikge1xyXG4gICAgICB0aGlzLm9yYml0Lm1pbkF6aW11dGhBbmdsZSA9IDA7XHJcbiAgICAgIHRoaXMub3JiaXQubWF4QXppbXV0aEFuZ2xlID0gMDtcclxuICAgICAgdGhpcy5vcmJpdC5taW5Qb2xhckFuZ2xlID0gMDtcclxuICAgIFx0dGhpcy5vcmJpdC5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSS80O1xyXG4gICAgICB0aGlzLmJvb2tXYXRjaGVyLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMub3JiaXQubWluQXppbXV0aEFuZ2xlID0gLUluZmluaXR5O1xyXG4gICAgICB0aGlzLm9yYml0Lm1heEF6aW11dGhBbmdsZSA9IEluZmluaXR5O1xyXG4gICAgICB0aGlzLm9yYml0Lm1pblBvbGFyQW5nbGUgPSAwO1xyXG4gICAgXHR0aGlzLm9yYml0Lm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJO1xyXG4gICAgICB0aGlzLmJvb2tXYXRjaGVyLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kU2luZ2xlUGFnZSgpIHtcclxuICAgIHRoaXMuc3RhdGUuc2luZ2xlUGFnZSA9ICF0aGlzLnN0YXRlLnNpbmdsZVBhZ2U7XHJcbiAgICB0aGlzLnNldEJvb2tab29tKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUpO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBjbWRTb3VuZHMoKSB7X
13345HJcbiAgICBpZih0aGlzLnNvdW5kcykge1xyXG4gICAgICB0aGlzLnNvdW5kcy50b2dsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBjbWRTdGF0cygpIHtcclxuICAgIHRoaXMuc3RhdGUuc3RhdHMgPSAhdGhpcy5zdGF0ZS5zdGF0cztcclxuICAgIGlmKHRoaXMuc3RhdGUuc3RhdHMpIHtcclxuICAgICAgJCh0aGlzLnZpZXcuZ2V0Q29udGFpbmVyKCkpLmFwcGVuZCh0aGlzLlN0YXRzLmRvbUVsZW1lbnQpO1xyXG4gICAgICB0aGlzLnZpc3VhbC5hZGRSZW5kZXJDYWxsYmFjayh0aGlzLmJpbmRzLnN0YXRzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAkKHRoaXMudmlldy5nZXRDb250YWluZXIoKSkuZmluZCh0aGlzLlN0YXRzLmRvbUVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLnZpc3VhbC5yZW1vdmVSZW5kZXJDYWxsYmFjayh0aGlzLmJpbmRzLnN0YXRzKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kTGlnaHRpbmdVcCgpIHtcclxuICAgIHRoaXMuc3RhdGUubGlnaHRpbmcgPSBNYXRoLm1pbih0aGlzLnN0YXRlLmxpZ2h0aW5nK3RoaXMucC5saWdodGluZy5kZWx0YSwgdGhpcy5wLmxpZ2h0aW5nLm1heCk7XHJcbiAgICB0aGlzLnZpc3VhbC5zZXRFeHRyYUxpZ2h0aW5nKHRoaXMuc3RhdGUubGlnaHRpbmcpO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBjbWRMaWdodGluZ0Rvd24oKSB7XHJcbiAgICB0aGlzLnN0YXRlLmxpZ2h0aW5nID0gTWF0aC5tYXgodGhpcy5zdGF0ZS5saWdodGluZy10aGlzLnAubGlnaHRpbmcuZGVsdGEsIHRoaXMucC5saWdodGluZy5taW4pO1xyXG4gICAgdGhpcy52aXN1YWwuc2V0RXh0cmFMaWdodGluZyh0aGlzLnN0YXRlLmxpZ2h0aW5nKTtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1BhZ2UocGFnZSkge1xyXG4gICAgaWYodGhpcy5wLnJ0bCkge1xyXG4gICAgICBwYWdlID0gdGhpcy5ib29rLmdldFBhZ2VzKCktMS1wYWdlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFnZU51bSA9IE1hdGgubWF4KE1hdGgubWluKHBhZ2UsIHRoaXMuYm9vay5nZXRQYWdlcygpLTEpLDApO1xyXG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gKHBhZ2VOdW0rMSklMjtcclxuICAgIGxldCB0YXJnZXQgPSBNYXRoLm1heChNYXRoLm1pbihwYWdlLTErcGFnZSUyLCB0aGlzLmJvb2suZ2V0UGFnZXMoKS0xKSwwKSwgY3VycmVudCA9IHRoaXMuYm9vay5nZXRQYWdlKCksIGZsaXBzID0gW10sIGNvdnMgPSAwOztcclxuICAgIGlmKHRhcmdldCE9Y3VycmVudCkge1xyXG4gICAgICBpZihjdXJyZW50PT09MCkge1xyXG4gICAgICAgIGZsaXBzLnB1c2goMSk7XHJcbiAgICAgICAgY3VycmVudCs9MTtcclxuICAgICAgICArK2NvdnM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihjdXJyZW50PT09dGhpcy5ib29rLmdldFBhZ2VzKCktMSkge1xyXG4gICAgICAgIGZsaXBzLnB1c2goLTEpO1xyXG4gICAgICAgIGN1cnJlbnQtPTI7XHJcbiAgICAgICAgKytjb3ZzO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjdiA9IDA7XHJcbiAgICAgIGlmKHRhcmdldD09PTApIHtcclxuICAgICAgICBjdiA9IC0xO1xyXG4gICAgICAgIHRhcmdldCs9MTtcclxuICAgICAgICArK2NvdnM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0YXJnZXQ9PT10aGlzLmJvb2suZ2V0UGFnZXMoKS0xKSB7XHJcbiAgICAgICAgY3YgPSAxO1xyXG4gICAgICAgIHRhcmdldC09MjtcclxuICAgICAgICArK2NvdnM7XHJcbiAgICAgIH1cclxuICAgICAgaWYodGFyZ2V0LWN1cnJlbnQpIHtcclxuICAgICAgICBmbGlwcy5wdXNoKE1hdGguY2VpbCgodGFyZ2V0LWN1cnJlbnQpLzIpKTtcclxuICAgICAgfVxyXG4gICAgICBpZihjdikge1xyXG4gICAgICAgIGZsaXBzLnB1c2goY3YpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2V0Q2xiID0gKGZsLCB0aW1lLCBjbGIpPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICAgIGlmKGZsPDApIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwTGVmdCgtZmwsIGNsYikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwUmlnaHQoZmwsIGNsYikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgdGltZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGlmKGNvdnM9PT0yKSB7XHJcbiAgICAgIHNldENsYihmbGlwc1swXSwgMCwgKGJsb2NrLCBwcm9ncmVzcywgc3RhdGUpPT4ge1xyXG4gICAgICAgIGlmKHN0YXRlPT0nZmluaXNoJyAmJiBwcm9ncmVzcz09MSkge1xyXG4gICAgICAgICAgc2V0Q2xiKGZsaXBzW2ZsaXBzLmxlbmd0aC0xXSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgc2V0Q2xiKGZsaXBzWzFdLCA1MDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0aW1lID0gMDtcclxuICAgICAgZm9yKGxldCBmbCBvZiBmbGlwcykge1xyXG4gICAgICAgIHNldENsYihmbCwgdGltZSk7XHJcbiAgICAgICAgdGltZSs9NDAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydEZsaXAoZmxpcFJlcykge1xyXG4gICAgcmV0dXJuIGZsaXBSZXM/IGZsaXBSZXMudGhlbigoYmxvY2spPT4ge1xyXG4gICAgICBpZihibG9jaykge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hBc3luYyh7XHJcbiAgICAgICAgICB0eXBlOiAnc3RhcnRGbGlwJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBibG9jaztcclxuICAgIH0pOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIGVuZEZsaXAoYmxvY2spIHtcclxuICAgIHRoaXMuZGlzcGF0Y2hBc3luYyh7XHJcbiAgICAgIHR5cGU6ICdlbmRGbGlwJ1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYmxvY2s7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlKCkge1xyXG4gICAgY29uc3QgcGFnZSA9IHRoaXMuYm9vay5nZXRQYWdlKCk7XHJcbiAgICByZXR1cm4gcGFnZT8gTWF0aC5taW4odGhpcy5ib29rLmdldFBhZ2UoKSt0aGlzLnN0YXRlLmFjdGl2ZVNpZGUsIHRoaXMuYm9vay5nZXRQYWdlcygpLTEpOiAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZUZvckdVSSgpIHtcclxuICAgIGxldCBuID0gKHRoaXMuc3RhdGUuc2luZ2xlUGFnZT8gdGhpcy5nZXRQYWdlKCk6IHRoaXMuYm9vay5nZXRQYWdlKCkpKzE7XHJcbiAgICBpZih0aGlzLnAucnRsKSB7XHJcbiAgICAgIG4gPSB0aGlzLmJvb2suZ2V0UGFnZXMoKS1uKzE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbjtcclxuICB9XHJcblxyXG4gIGlucFBhZ2UoZSwgZGF0YSkge1xyXG4gICAgdGhpcy5nb1RvUGFnZShkYXRhLTEpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlld0lmU3RhdGUoYmxvY2ssIHByb2dyZXNzLCBzdGF0ZSwgdHlwZSkge1xyXG4gICAgaWYoc3RhdGU9PT0naW5pdCcgfHwgc3RhdGU9PT0nZmluaXNoJykge1xyXG4gICAgICBzZXRUaW
133451lb3V0KHRoaXMudXBkYXRlVmlldy5iaW5kKHRoaXMpLCAxMDApO1xyXG4gICAgfVxyXG4gICAgaWYoc3RhdGU9PT0nZmluaXNoJykge1xyXG4gICAgICB0aGlzLmVuZEZsaXAoYmxvY2spO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNDbWRWaXNpYmxlKG5hbWUpIHtcclxuICAgIHJldHVybiAkKHRoaXMudmlzdWFsLmVsZW1lbnQpLndpZHRoKCk8dGhpcy5wLm5hcnJvd1ZpZXcud2lkdGg/ICh0aGlzLmFjdGlvbnNbbmFtZV0uZW5hYmxlZEluTmFycm93PT09dW5kZWZpbmVkPyB0aGlzLmFjdGlvbnNbbmFtZV0uZW5hYmxlZDogdGhpcy5hY3Rpb25zW25hbWVdLmVuYWJsZWRJbk5hcnJvdyk6IHRoaXMuYWN0aW9uc1tuYW1lXS5lbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlld1N0YXRlKCkge1xyXG4gICAgdGhpcy52aWV3U3RhdGUgPSB7XHJcbiAgICAgICdjbWRab29tSW4nOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0aGlzLmNhblpvb21JbigpLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuaXNDbWRWaXNpYmxlKCdjbWRab29tSW4nKSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRab29tT3V0Jzoge1xyXG4gICAgICAgIGVuYWJsZTogdGhpcy5jYW5ab29tT3V0KCksXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5pc0NtZFZpc2libGUoJ2NtZFpvb21PdXQnKSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWREZWZhdWx0Wm9vbSc6IHtcclxuICAgICAgICBlbmFibGU6IHRoaXMuY2FuRGVmYXVsdFpvb20oKSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmlzQ21kVmlzaWJsZSgnY21kRGVmYXVsdFpvb20nKSxcclxuICAgICAgICBhY3RpdmU6IHRoaXMuY2FuRGVmYXVsdFpvb20oKSAmJiBNYXRoLmFicyh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlLXRoaXMucC5zY2FsZS5kZWZhdWx0KTx0aGlzLnAuZXBzXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRUb2MnOiB7XHJcbiAgICAgICAgZW5hYmxlOiAhIXRoaXMudG9jQ3RybCxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmlzQ21kVmlzaWJsZSgnY21kVG9jJykgJiYgdGhpcy50b2NDdHJsLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy50b2NDdHJsICYmIHRoaXMudG9jQ3RybC52aXNpYmxlXHJcbiAgICAgIH0sXHJcbiAgICAgICdpbnBQYWdlcyc6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmJvb2suZ2V0UGFnZXMoKVxyXG4gICAgICB9LFxyXG4gICAgICAnaW5wUGFnZSc6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZTogIXRoaXMuYm9vay5pc1Byb2Nlc3NpbmcoKSAmJiB0aGlzLm5hdmlnYXRpb25Db250cm9scyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5nZXRQYWdlRm9yR1VJKClcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFNhdmUnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuaXNDbWRWaXNpYmxlKCdjbWRTYXZlJykgJiYgISF0aGlzLnAuZG93bmxvYWRVUkwsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kUHJpbnQnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuaXNDbWRWaXNpYmxlKCdjbWRQcmludCcpICYmICEhdGhpcy5wcmludGVyLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZEZ1bGxTY3JlZW4nOiB7XHJcbiAgICAgICAgZW5hYmxlOiBGdWxsU2NyZWVuLmF2YWlsYWJsZSgpLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuaXNDbWRWaXNpYmxlKCdjbWRGdWxsU2NyZWVuJyksXHJcbiAgICAgICAgYWN0aXZlOiBGdWxsU2NyZWVuLmF2YWlsYWJsZSgpICYmIEZ1bGxTY3JlZW4uYWN0aXZhdGVkKClcclxuICAgICAgfSxcclxuICAgICAgJ3dpZFNldHRpbmdzJzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmlzQ21kVmlzaWJsZSgnd2lkU2V0dGluZ3MnKSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRTbWFydFBhbic6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5pc0NtZFZpc2libGUoJ2NtZFNtYXJ0UGFuJyksXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnN0YXRlLnNtYXJ0UGFuXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRTaW5nbGVQYWdlJzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmlzQ21kVmlzaWJsZSgnY21kU2luZ2xlUGFnZScpLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5zdGF0ZS5zaW5nbGVQYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRTb3VuZHMnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6ICB0aGlzLmlzQ21kVmlzaWJsZSgnY21kU291bmRzJykgJiYgISF0aGlzLnNvdW5kcyxcclxuICAgICAgICBhY3RpdmU6ICEhdGhpcy5zb3VuZHMgJiYgdGhpcy5zb3VuZHMuZW5hYmxlZFxyXG4gICAgICB9LFxyXG4gICAgICAnY21kU3RhdHMnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuaXNDbWRWaXNpYmxlKCdjbWRTdGF0cycpLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5zdGF0ZS5zdGF0c1xyXG4gICAgICB9LFxyXG4gICAgICAnY21kTGlnaHRpbmdVcCc6IHtcclxuICAgICAgICBlbmFibGU6IE1hdGguYWJzKHRoaXMuc3RhdGUubGlnaHRpbmctdGhpcy5wLmxpZ2h0aW5nLm1heCk+dGhpcy5wLmVwcyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmlzQ21kVmlzaWJsZSgnY21kTGlnaHRpbmdVcCcpLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZExpZ2h0aW5nRG93bic6IHtcclxuICAgICAgICBlbmFibGU6IE1hdGguYWJzKHRoaXMuc3RhdGUubGlnaHRpbmctdGhpcy5wLmxpZ2h0aW5nLm1pbik+dGhpcy5wLmVwcyxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmlzQ21kVmlzaWJsZSgnY21kTGlnaHRpbmdEb3duJyksXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLmJvb2suZ2V0TGVmdEZsaXBwaW5nKCksXHJcbiAgICAgICAgICByaWdodCA9IHRoaXMuYm9vay5nZXRSaWdodEZsaXBwaW5nKCk7XHJcbiAgICBjb25zdCBmbGlwcGVyc0VuYWJsZSA9IHtcclxuICAgICAgY21kRmFzdEJhY2t3YXJkOiAhIWxlZnQgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMsXHJcbiAgICAgIGNtZEJhY2t3YXJkOiAhIWxlZnQgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMsXHJcbiAgICAgIGNtZEJpZ0JhY2t3YXJkOiAhIWxlZnQgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMsXHJcbiAgICAgIGNtZEZvcndhcmQ6ICEhcmlnaHQgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMsXHJcbiAgICAgIGNtZEJpZ0ZvcndhcmQ6ICEhcmlnaHQgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMsXHJcbiAgICAgIGNtZEZhc3RGb3J3YXJkOiAhIXJpZ2h0ICYmIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzXHJcbiAgICB9O1xyXG4gICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKGZsaXBwZXJzRW5hYmxlKSkge1xyXG4gICAgICB0aGlzLnZpZXdTdGF0ZVtuYW1lXSA9IHtcclxuICAgICAgICBlbmFibGU6IGZsaXBwZXJzRW5hYmxlW25hbWVdLFxyXG4gICAgICAgI
13345HZpc2libGU6IHRoaXMuaXNDbWRWaXNpYmxlKG5hbWUpLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWaWV3KCkge1xyXG4gICAgaWYodGhpcy52aWV3KSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlld1N0YXRlKCk7XHJcbiAgICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLnZpZXdTdGF0ZSkpIHtcclxuICAgICAgICB0aGlzLnZpZXcuc2V0U3RhdGUobmFtZSwgdGhpcy52aWV3U3RhdGVbbmFtZV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBY3Rpb25zKCkge1xyXG4gICAgY29uc3QgaXNTd2lwcGluZyA9IChuYW1lKT0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucy50b3VjaENtZFN3aXBlLmVuYWJsZWQgJiYgdGhpcy5hY3Rpb25zLnRvdWNoQ21kU3dpcGUuY29kZT09PXRoaXMuYWN0aW9uc1tuYW1lXS5jb2RlICYmIHRoaXMuc3RhdGUuc21hcnRQYW4gJiYgdGhpcy5ib29rV2F0Y2hlci5zY2FsZTw9MTtcclxuICAgIH0sIGNtZHMgPSB7fTtcclxuXHJcbiAgICBmb3IobGV0IG5hbWUgaW4gdGhpcykge1xyXG4gICAgICBpZihuYW1lLmluZGV4T2YoJ2NtZCcpPT09MCkge1xyXG4gICAgICAgIGNtZHNbbmFtZV0gPSB7XHJcbiAgICAgICAgICBhY3RpdmF0ZTogKC4uLmFyZ3MpPT4ge1xyXG4gICAgICAgICAgICBpZih0aGlzLnZpZXdTdGF0ZSAmJiB0aGlzLnZpZXdTdGF0ZVtuYW1lXS5lbmFibGUpIHtcclxuICAgICAgICAgICAgICB0aGlzW25hbWVdKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmNtZHMsXHJcbiAgICAgIGNtZFBhbkxlZnQ6IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUpPT4gdGhpcy5vcmJpdC5hY3Rpb25zLnBhbihlLCB7XHJcbiAgICAgICAgICBzdGF0ZTogJ21vdmUnLFxyXG4gICAgICAgICAgZHg6IC10aGlzLnAucGFuLnNwZWVkLFxyXG4gICAgICAgICAgZHk6IDBcclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5SaWdodDoge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSk9PiB0aGlzLm9yYml0LmFjdGlvbnMucGFuKGUsIHtcclxuICAgICAgICAgIHN0YXRlOiAnbW92ZScsXHJcbiAgICAgICAgICBkeDogdGhpcy5wLnBhbi5zcGVlZCxcclxuICAgICAgICAgIGR5OiAwXHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgY21kUGFuVXA6IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUpPT4gdGhpcy5vcmJpdC5hY3Rpb25zLnBhbihlLCB7XHJcbiAgICAgICAgICBzdGF0ZTogJ21vdmUnLFxyXG4gICAgICAgICAgZHg6IDAsXHJcbiAgICAgICAgICBkeTogLXRoaXMucC5wYW4uc3BlZWRcclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5Eb3duOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlKT0+IHRoaXMub3JiaXQuYWN0aW9ucy5wYW4oZSwge1xyXG4gICAgICAgICAgc3RhdGU6ICdtb3ZlJyxcclxuICAgICAgICAgIGR4OiAwLFxyXG4gICAgICAgICAgZHk6IHRoaXMucC5wYW4uc3BlZWRcclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZFJvdGF0ZToge1xyXG4gICAgICAgIGFjdGl2YXRlOiB0aGlzLm9yYml0LmFjdGlvbnMucm90YXRlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kRHJhZ1pvb206IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUsIGRhdGEpPT4ge1xyXG4gICAgICAgICAgaWYoZGF0YS5keT4wKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY21kWm9vbU91dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZihkYXRhLmR5PDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbWRab29tSW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kUGFuOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IHRoaXMub3JiaXQuYWN0aW9ucy5wYW5cclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWRXaGVlbFpvb206IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUpPT4ge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgaWYoZS5kZWx0YVk8MCkge1xyXG4gICAgICAgICAgICB0aGlzLmNtZFpvb21PdXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYoZS5kZWx0YVk+MCkge1xyXG4gICAgICAgICAgICB0aGlzLmNtZFpvb21JbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdG91Y2hDbWRSb3RhdGU6IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUsIGRhdGEpPT4ge1xyXG4gICAgICAgICAgaWYoIWlzU3dpcHBpbmcoJ3RvdWNoQ21kUm90YXRlJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm9yYml0LmFjdGlvbnMucm90YXRlKGUsIGRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdG91Y2hDbWRab29tOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlLCBkYXRhKT0+IHtcclxuICAgICAgICAgIGlmKCFpc1N3aXBwaW5nKCd0b3VjaENtZFpvb20nKSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmKGRhdGEuZHk+MCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY21kWm9vbU91dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoZGF0YS5keTwwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jbWRab29tSW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdG91Y2hDbWRQYW46IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUsIGRhdGEpPT4ge1xyXG4gICAgICAgICAgaWYoIWlzU3dpcHBpbmcoJ3RvdWNoQ21kUGFuJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm9yYml0LmFjdGlvbnMucGFuKGUsIGRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgI
13345H1cclxuICAgICAgfSxcclxuICAgICAgdG91Y2hDbWRTd2lwZToge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSwgZGF0YSk9PiB7XHJcbiAgICAgICAgICBpZihpc1N3aXBwaW5nKCd0b3VjaENtZFN3aXBlJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpZihkYXRhLnN0YXRlPT09J3N0YXJ0Jykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvdWNoID0gKGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcylbdGhpcy5hY3Rpb25zLnRvdWNoQ21kU3dpcGUuY29kZS0xXTtcclxuICAgICAgICAgICAgICB0aGlzLnN3aXBlRGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgeDA6IHRvdWNoLnBhZ2VYLFxyXG4gICAgICAgICAgICAgICAgeTA6IHRvdWNoLnBhZ2VZLFxyXG4gICAgICAgICAgICAgICAgeDogdG91Y2gucGFnZVgsXHJcbiAgICAgICAgICAgICAgICB5OiB0b3VjaC5wYWdlWVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZihkYXRhLnN0YXRlPT09J21vdmUnKSB7XHJcbiAgICAgICAgICAgICAgaWYoIXRoaXMuc3dpcGVEYXRhLmhhbmRsZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpcGVEYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAuLi50aGlzLnN3aXBlRGF0YSxcclxuICAgICAgICAgICAgICAgICAgeDogdGhpcy5zd2lwZURhdGEueCtkYXRhLmR4LFxyXG4gICAgICAgICAgICAgICAgICB5OiB0aGlzLnN3aXBlRGF0YS55K2RhdGEuZHlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKE1hdGguYWJzKHRoaXMuc3dpcGVEYXRhLngwLXRoaXMuc3dpcGVEYXRhLngpPjEwMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN3aXBlRGF0YS54MD50aGlzLnN3aXBlRGF0YS54PyB0aGlzLmNtZEZvcndhcmQoKTogdGhpcy5jbWRCYWNrd2FyZCgpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN3aXBlRGF0YS5oYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3dpcGVEYXRhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB3aWRTZXR0aW5nczoge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoKT0+IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYmluZEFjdGlvbnMoKSB7XHJcbiAgICB0aGlzLmVUb0EgPSBuZXcgRXZlbnRzVG9BY3Rpb25zKCQodGhpcy52aXN1YWwuZWxlbWVudCkpO1xyXG4gICAgdGhpcy5lVG9BLmFkZEFjdGlvbigoZSk9PiBlLnByZXZlbnREZWZhdWx0KCksICdjb250ZXh0bWVudScsIEV2ZW50c1RvQWN0aW9ucy5tb3VzZUJ1dHRvbnMuUmlnaHQsIDApO1xyXG5cclxuICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuZ2V0QWN0aW9ucygpO1xyXG4gICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuYWN0aW9ucykpIHtcclxuICAgICAgY29uc3QgYWN0aW9uID0ge1xyXG4gICAgICAgIC4uLnRoaXMuYWN0aW9uc1tuYW1lXSxcclxuICAgICAgICAuLi50aGlzLnAuYWN0aW9uc1tuYW1lXVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmFjdGlvbnNbbmFtZV0gPSBhY3Rpb247XHJcbiAgICAgIGlmKGFjdGlvbi5lbmFibGVkKSB7XHJcbiAgICAgICAgY29uc3QgZmxhZ3MgPSBhY3Rpb24uZmxhZ3MgfHwgMDtcclxuICAgICAgICBpZihhY3Rpb24udHlwZSkge1xyXG4gICAgICAgICAgdGhpcy5lVG9BLmFkZEFjdGlvbihhY3Rpb24uYWN0aXZhdGUsIGFjdGlvbi50eXBlLCBhY3Rpb24uY29kZSwgZmxhZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGFjdGlvbi5jb2RlIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmVUb0EuYWRkQWN0aW9uKGFjdGlvbi5hY3RpdmF0ZSwgJ2tleWRvd24nLCBhY3Rpb24uY29kZSwgZmxhZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHByZXBhcmVQcm9wcyhwcm9wcykge1xyXG4gICAgcmV0dXJuIEJvb2tDb250cm9sbGVyLmNhbGNQcm9wcyhCb29rQ29udHJvbGxlci5tZXJnZVByb3BzKGJvb2tDb250cm9sbGVyUHJvcHMoKSwgcHJvcHMpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRBY3Rpb25zKHByb3BzLCBhY3Rpb25zKSB7XHJcbiAgICBmb3IobGV0IG5hbWUgb2YgT2JqZWN0LmtleXMoYWN0aW9ucyB8fCB7fSkpIHtcclxuICAgICAgcHJvcHMuYWN0aW9uc1tuYW1lXSA9IHtcclxuICAgICAgICAuLi5wcm9wcy5hY3Rpb25zW25hbWVdLFxyXG4gICAgICAgIC4uLmFjdGlvbnNbbmFtZV1cclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBtZXJnZVByb3BzKGZpcnN0LCBzZWNvbmQpIHtcclxuICAgIHNlY29uZCA9IHNlY29uZCB8fCB7fTtcclxuICAgIGZ1bmN0aW9uIG1lcmdlKGZpcnN0LCBzZWNvbmQpIHtcclxuICAgICAgc2Vjb25kID0gc2Vjb25kIHx8IHt9O1xyXG4gICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAuLi5maXJzdCxcclxuICAgICAgICAuLi5zZWNvbmRcclxuICAgICAgfTtcclxuICAgICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKGZpcnN0KSkge1xyXG4gICAgICAgIGlmKHR5cGVvZiBmaXJzdFtuYW1lXT09PSdvYmplY3QnKSB7XHJcbiAgICAgICAgICBwcm9wc1tuYW1lXSA9IG1lcmdlKGZpcnN0W25hbWVdLCBzZWNvbmRbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcm9wcyA9IG1lcmdlKGZpcnN0LCBzZWNvbmQpO1xyXG4gICAgQm9va0NvbnRyb2xsZXIuc2V0QWN0aW9ucyhwcm9wcywgZmlyc3QuYWN0aW9ucyk7XHJcbiAgICBCb29rQ29udHJvbGxlci5zZXRBY3Rpb25zKHByb3BzLCBzZWNvbmQuYWN0aW9ucyk7XHJcbiAgICByZXR1cm4gcHJvcHM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2FsY1Byb3BzKHByb3BzKSB7XHJcbiAgICBwcm9wcy5zY2FsZS5kZWx0YSA9IChwcm9wcy5zY2FsZS5tYXgtcHJvcHMuc2NhbGUubWluKS9wcm9wcy5zY2FsZS5sZXZlbHM7XHJcbiAgICBwcm9wcy5saWdodGluZy5kZWx0YSA9IChwcm9wcy5saWdodGluZy5tYXgtcHJvcHMubGlnaHRpbmcubWluKS9wcm9wcy5saWdodGluZy5sZXZlbHM7XHJcbiAgICByZXR1cm4gcHJvcHM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0Jvb2tDb250cm9sbGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2tQcmludGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgYm9vaywgc3R5bGVTaGVldCkge1xyXG4gICAgdGhpcy5ib29rID0gYm9vaztcclxuICAgIHRoaXMuc3R5bGVTaGVldCA9IHN0eWxlU2hlZXQ7XHJcbiAgICB0aGlzLnduZCA9IGNvbnRleHQud25kO1xyXG4gICAgdGhpcy5kb2MgPSBjb250ZXh0LmRvYztcclxuICAgIHRoaXMucGFnZUNhbGxiYWNrID0gYm9vay5nZXRQYWdlQ2FsbGJhY2soKTtcclxuICAgIGNvbnN0IHRlc3QgPSB0aGlzLnBhZ2VDYWxsYmFjaygwKTtcclxuICAgIHRoaXMudHlwZSA9IHRlc3QudHlwZTtcclxuICAgIGlmKHRoaXMudHlwZT09PSdwZGYnKSB7XHJcbiAgICAgIHRoaXMucGRmU3JjID0gdGVzdC5zcmMuc3JjO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5jYW5jZWxlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgaWYodGhpcy5mcmFtZSkge1xyXG4gICAgICB0aGlzLmZyYW1lLnJlbW92ZSgpO1xyXG4gICAgICBkZWxldGUgdGhpcy5mcmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaW50KCkge1xyXG4gICAgZGVsZXRlIHRoaXMuY2FuY2VsZWQ7XHJcbiAgICBpZih0aGlzLnR5cGU9PT0ncGRmJykge1xyXG4gICAgICBsZXQgcHJpbnRXbmQsIGNhbGxNYW51YWxseSA9IGZhbHNlO1xyXG4gICAgICBpZih0aGlzLnVzZUlGcmFtZSgpKSB7XHJcbiAgICAgICAgY2FsbE1hbnVhbGx5ID0gISF0aGlzLmZyYW1lO1xyXG4gICAgICAgIGlmKCF0aGlzLmZyYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLmZyYW1lID0gJCgnPGlmcmFtZSBzcmM9XCInK3RoaXMucGRmU3JjKydcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9pZnJhbWU+JykuYXBwZW5kVG8odGhpcy5kb2MuYm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgI
13345HByaW50V25kID0gdGhpcy5mcmFtZVswXS5jb250ZW50V2luZG93O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHByaW50V25kID0gdGhpcy53bmQub3Blbih0aGlzLnBkZlNyYyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoY2FsbE1hbnVhbGx5KSB7XHJcbiAgICAgICAgcHJpbnRXbmQucHJpbnQoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAkKHByaW50V25kKS5vbignbG9hZCcsICgpPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJpbnRXbmQucHJpbnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpLlxyXG4gICAgICAgIHRoZW4oKGNvbnRlbnQpPT4ge1xyXG4gICAgICAgICAgY29uc3QgcHJpbnRXbmQgPSB0aGlzLnduZC5vcGVuKCksXHJcbiAgICAgICAgICBwcmludERvYyA9IHByaW50V25kLmRvY3VtZW50LFxyXG4gICAgICAgICAgaHRtbCA9IGBcclxuICAgICAgICAgICAgPCFET0NUWVBFIGh0bWw+XHJcbiAgICAgICAgICAgIDxodG1sPlxyXG4gICAgICAgICAgICAgIDxoZWFkPlxyXG4gICAgICAgICAgICAgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XHJcbiAgICAgICAgICAgICAgICA8dGl0bGU+M0QgRmxpcEJvb2sgLSBQcmludGluZzwvdGl0bGU+XHJcbiAgICAgICAgICAgICAgICAke2NvbnRlbnQuaGVhZH1cclxuICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPlxyXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcmludERvY3VtZW50KCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wcmludCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChwcmludERvY3VtZW50LCAxMDApO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5cclxuICAgICAgICAgICAgICA8L2hlYWQ+XHJcbiAgICAgICAgICAgICAgPGJvZHkgb25sb2FkPVwiaW5pdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAke2NvbnRlbnQuYm9keX1cclxuICAgICAgICAgICAgICA8L2JvZHk+XHJcbiAgICAgICAgICAgIDwvaHRtbD5cclxuICAgICAgICAgIGA7XHJcbiAgICAgICAgICBwcmludERvYy5vcGVuKCk7XHJcbiAgICAgICAgICBwcmludERvYy53cml0ZShodG1sKTtcclxuICAgICAgICAgIHByaW50RG9jLmNsb3NlKCk7XHJcbiAgICAgICAgfSkuXHJcbiAgICAgICAgY2F0Y2goKGUpPT4gY29uc29sZS53YXJuKCczRCBGbGlwQm9vayAtIFByaW50aW5nIHdhcyBjYW5jZWxlZCcpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2dyZXNzKHYpIHtcclxuICAgIGlmKHRoaXMuY2FuY2VsZWQpIHtcclxuICAgICAgdGhyb3cgJ0NhbmNlbCBQcmludGluZyc7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLm9uUHJvZ3Jlc3MpIHtcclxuICAgICAgdGhpcy5vblByb2dyZXNzKE1hdGguZmxvb3IodioxMDApKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbmRlckNvbnRlbnQoKSB7XHJcbiAgICBjb25zdCBwYWdlcyA9IHRoaXMuYm9vay5nZXRQYWdlcygpLCBoZWFkID0gbmV3IFNldCgpLCBib2R5ID0gW107XHJcbiAgICBsZXQgZG9uZSA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgZm9yKGxldCBwYWdlPTA7IHBhZ2U8cGFnZXM7ICsrcGFnZSkge1xyXG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5wYWdlQ2FsbGJhY2socGFnZSk7XHJcbiAgICAgIGlmKGluZm8udHlwZT09PSdpbWFnZScpIHtcclxuICAgICAgICBkb25lID0gZG9uZS50aGVuKCgpPT4ge1xyXG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyhwYWdlL3BhZ2VzKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckltYWdlKGhlYWQsIGJvZHksIGluZm8uc3JjKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKGluZm8udHlwZT09PSdodG1sJykge1xyXG4gICAgICAgIGRvbmUgPSBkb25lLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnByb2dyZXNzKHBhZ2UvcGFnZXMpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySHRtbChoZWFkLCBib2R5LCBpbmZvLnNyYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkb25lLnRoZW4oKCk9PiB7XHJcbiAgICAgIHRoaXMucHJvZ3Jlc3MoMSk7XHJcbiAgICAgIHJldHVybiB7aGVhZDogdGhpcy5yZW5kZXJIZWFkKGhlYWQpLCBib2R5OiBib2R5LmpvaW4oJ1xcbicpfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgd3JhcChjb250ZW50KSB7XHJcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJmYjNkLXByaW50ZXItcGFnZVwiPiR7Y29udGVudH08L2Rpdj5gO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVySW1hZ2UoaGVhZCwgYm9keSwgc3JjKSB7XHJcbiAgICBib2R5LnB1c2goQm9va1ByaW50ZXIud3JhcChgPGltZyBzcmM9XCIke3NyY31cIiAvPmApKTtcclxuICB9XHJcblxyXG4gIHJlbmRlckh0bWwoaGVhZCwgYm9keSwgc3JjKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk9PiB7XHJcbiAgICAgICQuZ2V0KHNyYywgKGh0bWwpPT4ge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gaHRtbC5tYXRjaCgvPGxpbmsuKj8+L2lnKSB8fCBbXTtcclxuICAgICAgICBmb3IobGV0IGxpbmsgb2YgbGlua3MpIHtcclxuICAgICAgICAgIGlmKGxpbmsubWF0Y2goL3N0eWxlc2hlZXQvaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgaHJlZiA9IGxpbmsubWF0Y2goL2hyZWZcXHMqPVxccypbJ1wiXSguKilbJ1wiXS9pKTtcclxuICAgICAgICAgICAgaWYoaHJlZikge1xyXG4gICAgICAgICAgICAgIGhlYWQuYWRkKGhyZWZbMV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBodG1sLm1hdGNoKC88Ym9keS4qPz4oW1xcU1xcc10qKTxcXC9ib2R5Pi9pKTtcclxuICAgICAgICBpZihjb250ZW50KSB7XHJcbiAgICAgICAgICBib2R5LnB1c2goQm9va1ByaW50ZXIud3JhcChjb250ZW50WzFdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgI
13345HJlc29sdmUoKTtcclxuICAgICAgfSkuZmFpbCgoZSk9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJlbmRlckhlYWQoaGVhZCkge1xyXG4gICAgY29uc3QgY29udGVudCA9IFtdO1xyXG4gICAgaGVhZC5mb3JFYWNoKChrKT0+IGNvbnRlbnQucHVzaChgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIke2t9XCI+YCkpO1xyXG4gICAgY29udGVudC5wdXNoKHRoaXMuc3R5bGVTaGVldD8gYDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJHt0aGlzLnN0eWxlU2hlZXR9XCI+YDogQm9va1ByaW50ZXIuZGVmYXVsdFN0eWxlU2hlZXQoKSk7XHJcbiAgICByZXR1cm4gY29udGVudC5qb2luKCdcXG4nKTtcclxuICB9XHJcblxyXG4gIHVzZUlGcmFtZSgpIHtcclxuICAgIGNvbnN0IGlzQ2hyb21pdW0gPSB0aGlzLnduZC5jaHJvbWUsXHJcbiAgICAgIHdpbk5hdiA9IHRoaXMud25kLm5hdmlnYXRvcixcclxuICAgICAgdmVuZG9yTmFtZSA9IHdpbk5hdi52ZW5kb3IsXHJcbiAgICAgIGlzSUVlZGdlID0gd2luTmF2LnVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZVwiKT4tMSxcclxuICAgICAgaXNJT1NDaHJvbWUgPSB3aW5OYXYudXNlckFnZW50Lm1hdGNoKFwiQ3JpT1NcIik7XHJcbiAgICBsZXQgdXNlO1xyXG4gICAgaWYoaXNJT1NDaHJvbWUpe1xyXG4gICAgICB1c2UgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmKGlzQ2hyb21pdW0gJiYgdmVuZG9yTmFtZT09PSdHb29nbGUgSW5jLicgJiYgIWlzSUVlZGdlKSB7XHJcbiAgICAgIHVzZSA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB1c2UgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVmYXVsdFN0eWxlU2hlZXQoKSB7XHJcbiAgICByZXR1cm4gYFxyXG4gICAgICA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+XHJcbiAgICAgICAgYm9keSB7XHJcbiAgICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAuZmIzZC1wcmludGVyLXBhZ2Uge1xyXG4gICAgICAgICAgcGFnZS1icmVhay1hZnRlcjogYWx3YXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgPC9zdHlsZT5cclxuICAgIGA7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0Jvb2tQcmludGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IFZpZXcgZnJvbSAnVmlldyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb29rVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICBzdGF0aWMgUEFHRV9IQU5ETEVSX0RFTEFZID0gMTAwMDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvbkxvYWQsIHRlbXBsYXRlLCBoYW5kbGVyKSB7XHJcbiAgICBzdXBlcihjb250YWluZXIsIG9uTG9hZCwgdGVtcGxhdGUsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFZpZXcoKSB7XHJcbiAgICB0aGlzLnZpZXcgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcudmlldycpO1xyXG4gICAgdGhpcy5ib29rbWFya3NWaWV3ID0gdGhpcy5jb250YWluZXIuZmluZCgnLndpZEJvb2ttYXJrcycpO1xyXG4gICAgdGhpcy50aHVtYm5haWxzVmlldyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy53aWRUaHVtYm5haWxzJyk7XHJcbiAgICB0aGlzLnNlYXJjaFZpZXcgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcud2lkU2VhcmNoJyk7XHJcbiAgfVxyXG5cclxuICBnZXRIYW5kbGVycyhpZCkge1xyXG4gICAgbGV0IGhhbmRsZXJzO1xyXG4gICAgaWYoaWQ9PT0naW5wUGFnZScpIHtcclxuICAgICAgaGFuZGxlcnMgPSBbe1xyXG4gICAgICAgIGlucFBhZ2U6IChlLCBkYXRhKT0+IHRoaXMuY2FsbExhdGVyKHN1cGVyLmdldEhhbmRsZXJzKGlkKSwgaWQsIGUsIGRhdGEsIEJvb2tWaWV3LlBBR0VfSEFORExFUl9ERUxBWSlcclxuICAgICAgfV07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaGFuZGxlcnMgPSBzdXBlci5nZXRIYW5kbGVycyhpZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGFuZGxlcnM7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1TdGF0ZUNoYW5nZWQoaWQsIHN0YXRlKSB7XHJcbiAgICBpZihpZD09PSdjbWRGdWxsU2NyZWVuJykge1xyXG4gICAgICBpZihzdGF0ZS5hY3RpdmUpIHtcclxuICAgICAgICB0aGlzLnBhcmVudENvbnRhaW5lci5hZGRDbGFzcygnZnVsbHNjcmVlbicpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFyZW50Q29udGFpbmVyLnJlbW92ZUNsYXNzKCdmdWxsc2NyZWVuJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3O1xyXG4gIH1cclxuXHJcbiAgZ2V0Qm9va21hcmtzVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLmJvb2ttYXJrc1ZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXRUaHVtYm5haWxzVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLnRodW1ibmFpbHNWaWV3O1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlYXJjaFZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGlua3MoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnY21kWm9vbUluJyxcclxuICAgICAgJ2NtZFpvb21PdXQnLFxyXG4gICAgICAnY21kRGVmYXVsdFpvb20nLFxyXG4gICAgICAnY21kVG9jJyxcclxuICAgICAgJ2NtZEZhc3RCYWNrd2FyZCcsXHJcbiAgICAgICdjbWRCYWNrd2FyZCcsXHJcbiAgICAgICdjbWRCaWdCYWNrd2FyZCcsXHJcbiAgICAgICdjbWRGb3J3YXJkJyxcclxuICAgICAgJ2NtZEJpZ0ZvcndhcmQnLFxyXG4gICAgICAnY21kRmFzdEZvcndhcmQnLFxyXG4gICAgICAnY21kU2F2ZScsXHJcbiAgICAgICdjbWRQcmludCcsXHJcbiAgICAgICdjbWRGdWxsU2NyZWVuJyxcclxuICAgICAgJ2NtZFNtYXJ0UGFuJyxcclxuICAgICAgJ2NtZFNpbmdsZVBhZ2UnLFxyXG4gICAgICAnY21kU291bmRzJyxcclxuICAgICAgJ2NtZFN0YXRzJyxcclxuICAgICAgJ2NtZExpZ2h0aW5nVXAnLFxyXG4gICAgICAnY21kTGlnaHRpbmdEb3duJyxcclxuICAgICAgJ2NtZENsb3NlVG9jJyxcclxuICAgICAgJ2NtZEJvb2ttYXJrcycsXHJcbiAgICAgICdjbWRTZWFyY2gnLFxyXG4gICAgICAnY21kVGh1bWJuYWlscydcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRXaWRnZXRzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ3dpZExvYWRpbmdQcm9ncmVzcycsXHJcbiAgICAgICd3aWRGbG9hdFduZCcsXHJcbiAgICAgICd3aWRUb2NNZW51JyxcclxuICAgICAgJ3dpZEJvb2ttYXJrcycsXHJcbiAgICAgICd3aWRUaHVtYm5haWxzJyxcclxuICAgICAgJ3dpZFNlYXJjaCcsXHJcbiAgICAgICd3aWRTZXR0aW5ncycsXHJcbiAgICAgICd3aWRMb2FkaW5nJ1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldElu
13345cHV0cygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdpbnBQYWdlJyxcclxuICAgICAgJ2lucFBhZ2VzJ1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldFRleHRzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ3R4dExvYWRpbmdQcm9ncmVzcydcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGh0bWw6ICd0ZW1wbGF0ZXMvZGVmYXVsdC1ib29rLXZpZXcuaHRtbCcsXHJcbiAgICAgIHN0eWxlczogW1xyXG4gICAgICAgICdjc3MvYmxhY2stYm9vay12aWV3LmNzcydcclxuICAgICAgXSxcclxuICAgICAgbGlua3M6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0JyxcclxuICAgICAgICAgIGhyZWY6ICdjc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MnXHJcbiAgICAgICAgfVxyXG4gICAgICBdLFxyXG4gICAgICBzY3JpcHQ6ICdqcy9kZWZhdWx0LWJvb2stdmlldy5qcydcclxuICAgIH07XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0Jvb2tWaWV3LmpzIiwiaW1wb3J0IEJvb2tQcm9wc0J1aWxkZXIgZnJvbSAnLi9Cb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IEltYWdlRmFjdG9yeSBmcm9tICdJbWFnZUZhY3RvcnknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xiQm9va1Byb3BzQnVpbGRlciBleHRlbmRzIEJvb2tQcm9wc0J1aWxkZXIge1xyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHBhZ2VDYWxsYmFjaywgcGFnZXMsIG9uUmVhZHkpIHtcclxuICAgIHN1cGVyKG9uUmVhZHkpO1xyXG4gICAgdGhpcy5jYWxjU2hlZXRzKHBhZ2VzKTtcclxuICAgIHRoaXMucGFnZUNhbGxiYWNrID0gcGFnZUNhbGxiYWNrO1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgcGFnZUNhbGxiYWNrOiBwYWdlQ2FsbGJhY2suYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgIHRoaXMuaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeShjb250ZXh0KTtcclxuXHJcbiAgICBpZihwYWdlcz4wKSB7XHJcbiAgICAgIGNvbnN0IHRlc3QgPSB0aGlzLmltYWdlRmFjdG9yeS5idWlsZChwYWdlQ2FsbGJhY2soMCksIDAsIHRoaXMuZGVmYXVsdHMuc2hlZXQud2lkdGhUZXhlbHMsIHRoaXMuZGVmYXVsdHMuc2hlZXQuaGVpZ2h0VGV4ZWxzLCB0aGlzLmRlZmF1bHRzLnNoZWV0LmNvbG9yKTtcclxuICAgICAgdGVzdC5vbkxvYWQgPSAoKT0+IHtcclxuICAgICAgICB0aGlzLmNhbGNQcm9wcyh0ZXN0LndpZHR
13345oLCB0ZXN0LmhlaWdodCk7XHJcbiAgICAgICAgdGVzdC5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5yZWFkeSgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvcHMgPSB0aGlzLmRlZmF1bHRzO1xyXG4gICAgICB0aGlzLnJlYWR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0NsYkJvb2tQcm9wc0J1aWxkZXIuanMiLCJpbXBvcnQgU2hlZXRCbG9jayBmcm9tICcuL1NoZWV0QmxvY2snO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ292ZXIgZXh0ZW5kcyBTaGVldEJsb2NrIHtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBwLCBhbmdsZSwgc3RhdGUpIHtcclxuICAgIHN1cGVyKHZpc3VhbCwgcCwgMCwgMSwgYW5nbGUsIHN0YXRlKTtcclxuICB9XHJcblxyXG4gIGdldFByb3BzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4udGhpcy5wLmNvdmVyLFxyXG4gICAgICBzaGVldHM6IDFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBsb2FkUG9pbnRzKCkge1xyXG4gICAgY29uc3Qgb3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFsyLDMsNF0sXHJcbiAgICAgIFsyLDMsNCw1LDZdXHJcbiAgICBdLFxyXG4gICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFswLDEsMl0sXHJcbiAgICAgIFswLDEsMl1cclxuICAgIF0sXHJcbiAgICBpbnRlcnBvbGF0aW9uUG9pbnRzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgeDogW1xyXG4gICAgICAgICAgICAgWzAsMC4yODc3LDAuNjM0NywwLjgxNzQsMS4wMDAwXSxcclxuICAgICAgICAgICAgIFswLDAuMjgzMSwwLjYyNTYsMC44MDgyLDAuOTkwOV0sXHJcbiAgICAgICAgICAgICBbMCwwLjI2MDMsMC41OTM2LDAuNzc2MywwLjk1ODldLFxyXG4gICAgICAgICAgICAgWzAsMC4xMzcwLDAuMzg4MSwwLjUzNDIsMC42NzU4XSxcclxuICAgICAgICAgICAgIFswLDAsMCwwLDBdXHJcbiAgICAgICAgXSxcclxuICAgICAgICB5OiBbXHJcbiAgICAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgICAgIFswLDAuMDIsMC4wMDUsLTAuMDAxLC0wLjAwMjVdLFxyXG4gICAgICAgICAgICAgWzAsMC4wNCwwLjAxLC0wLjAwMiwtMC4wMDVdLFxyXG4gICAgICAgICAgICAgWzAsIDAuMjQ2NiwgMC40Nzk1LCAwLjU3MDgsIDAuNjc1OF0sXHJcbiAgICAgICAgICAgICBbMCwgMC4yODc3LCAwLjYzNDcsIDAuODE3NCwgMS4wMDAwXVxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHg6IFtcclxuICAgICAgICAgICAgIFswLDAuMjg3NywwLjYzNDcsMC44MTc0LDEuMDAwMF0sXHJcbiAgICAgICAgICAgICBbMCwwLjI4MzEsMC42MjU2LDAuODA4MiwwLjk5MDldLFxyXG4gICAgICAgICAgICAgWzAsMC4yNjAzLDAuNTkzNiwwLjc3NjMsMC45NTg5XSxcclxuICAgICAgICAgICAgIFswLjAwMCwwLjIzMywwLjU2MywwLjc0NiwwLjkyN10sXHJcbiAgICAgICAgICAgICBbMC4wMDAsMC4xNDQsMC40MzMsMC42MTMsMC43OTZdLFxyXG4gICAgICAgICAgICAgWzAuMDAwLDAuMDcwLDAuMjg4LDAuNDU1LDAuNjI2XSxcclxuICAgICAgICAgICAgIFswLDAsMCwwLDBdXHJcbiAgICAgICAgXSxcclxuICAgICAgICB5OiBbXHJcbiAgICAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgICAgIFswLDAuMDIsMC4wMDUsLTAuMDAxLC0wLjAwMjVdLFxyXG4gICAgICAgICAgICAgWzAsMC4wNCwwLjAxLC0wLjAwMiwtMC4wMDVdLFxyXG4gICAgICAgICAgICAgWzAuMDAwLDAuMTY4LDAuMjY5LDAuMjcwLDAuMjU1XSxcclxuICAgICAgICAgICAgIFswLjAwMCwwLjI0NSwwLjQzNSwwLjQ1OCwwLjQ2MF0sXHJcbiAgICAgICAgICAgICBbMC4wMDAsMC4yNzgsMC41NDQsMC42MTQsMC42NzNdLFxyXG4gICAgICAgICAgICAgWzAsIDAuMjg3NywgMC42MzQ3LCAwLjgxNzQsIDEuMDAwMF1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbnRlcnBvbGF0aW9uUG9pbnRzLFxyXG4gICAgICBvcGVuZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyxcclxuICAgICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQ292ZXIuanMiLCJpbXBvcnQgU2hlZXRDc3NMYXllciBmcm9tICcuL1NoZWV0Q3NzTGF5ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3NzTGF5ZXJzTWFuYWdlciB7XHJcbiAgY29uc3RydWN0b3IoYm9vaykge1xyXG4gICAgdGhpcy5ib29rID0gYm9vaztcclxuICAgIHRoaXMucHJvcHMgPSBib29rLnAuY3NzTGF5ZXJQcm9wcztcclxuICAgIHRoaXMudmlzdWFsID0gYm9vay52aXN1YWw7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyID0gYm9vay5wYWdlTWFuYWdlcjtcclxuICAgIHRoaXMud3JhcHBlcnMgPSB7fTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZXMoKSB7XHJcbiAgICBjb25zdCBwYWdlID0gdGhpcy5ib29rLmdldFBhZ2UoKSwgcGFnZXMgPSB0aGlzLmJvb2suZ2V0UGFnZXMoKTtcclxuICAgIHJldHVybiBwYWdlPT09MCB8fCBwYWdlPT09cGFnZXMtMT8gW3BhZ2VdOiBbcGFnZSwgcGFnZSsxXTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBmb3IobGV0IHcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLndyYXBwZXJzKSkge1xyXG4gICAgICB3LmxheWVycy5mb3JFYWNoKChsKT0+IGwuZGlzcG9zZSgpKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLndyYXBwZXJzO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XHJcbiAgICBmb3IobGV0IG4gb2YgdGhpcy5nZXRBY3RpdmVzKCkpIHtcclxuICAgICAgY29uc3QgdyA9IHRoaXMud3JhcHBlcnNbbl07XHJcbiAgICAgIGlmKHcpIHtcclxuICAgICAgICBpZih3LnN0YXRlPT09J3JlYWR5JyAmJiB3LmxheWVycy5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5ib29rLmdldEJsb2NrQnlQYWdlKG4pO1xyXG4gICAgICAgICAgdy5sYXllcnMuZm9yRWFjaCgobCk9PiB7XHJcbiAgICAgICAgICAgIGlmKGwuaXNIaWRkZW4oKSkge1xyXG4gICAgICAgICAgICAgIGwudXBkYXRlKGJsb2NrKTtcclxuICAgICAgICAgICAgICBsLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndyYXBwZXJzW25dID0ge1xyXG4gICAgICAgICAgc3RhdGU6ICdsb2FkaW5nJyxcclxuICAgICAgICAgIGxheWVyczogW11cclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLmdldExheWVycyhuLCAobGF5ZXJzKT0+IHtcclxuICAgICAgICAgICAgaWYobGF5ZXJzLmxlbmd0aCAmJi
13345B0aGlzLndyYXBwZXJzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJvb2suZ2V0QmxvY2tCeVBhZ2Uobik7XHJcbiAgICAgICAgICAgICAgZm9yKGxldCBsIG9mIGxheWVycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2wgPSBuZXcgU2hlZXRDc3NMYXllcih0aGlzLnZpc3VhbCwgYmxvY2ssIHRoaXMucHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgdy5sYXllcnMucHVzaChzbCk7XHJcbiAgICAgICAgICAgICAgICBzbC5zZXQobC5jc3MsIGwuaHRtbCwgbC5qcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighdGhpcy5oaWRkZW4gJiYgfnRoaXMuZ2V0QWN0aXZlcygpLmluZGV4T2YobikpIHtcclxuICAgICAgICAgICAgICAgICAgdy5sYXllcnMuZm9yRWFjaCgobCk9PiBsLnNob3coKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHcuc3RhdGUgPSAncmVhZHknO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcclxuICAgIGNvbnN0IHdhaXQgPSBbXTtcclxuICAgIGZvcihsZXQgdyBvZiBPYmplY3QudmFsdWVzKHRoaXMud3JhcHBlcnMpKSB7XHJcbiAgICAgIHcubGF5ZXJzLmZvckVhY2goKGwpPT4gd2FpdC5wdXNoKGwuaGlkZSgpKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdCk7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQ3NzTGF5ZXJzTWFuYWdlci5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnXHJcbmltcG9ydCBDYWNoZSBmcm9tICdDYWNoZSc7XHJcbmltcG9ydCBMb2FkaW5nQW5pbWF0aW9uIGZyb20gJ0xvYWRpbmdBbmltYXRpb24nO1xyXG5pbXBvcnQgSW1hZ2VGYWN0b3J5IGZyb20gJ0ltYWdlRmFjdG9yeSc7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJ0Jhc2VNYXRoVXRpbHMnO1xyXG5pbXBvcnQgVGV4dHVyZUFuaW1hdG9yIGZyb20gJ1RleHR1cmVBbmltYXRvcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlTWFuYWdlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgYm9vaywgcCkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLmJvb2sgPSBib29rO1xyXG4gICAgdGhpcy5wYWdlUXVlcnkgPSAnJztcclxuICAgIHRoaXMucCA9IHA7XHJcbiAgICB0aGlzLnBhZ2VDYWNoZSA9IG5ldyBDYWNoZShwLmNhY2hlZFBhZ2VzKTtcclxuICAgIHRoaXMucmVzb3VyY2VzQ2FjaGUgPSBuZXcgQ2FjaGUoKTtcclxuICAgIHRoaXMuY2FudmFzID0gJCgnPGNhbnZhcz4nKVswXTtcclxuICAgIHRoaXMuaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeSh7Li4udmlzdWFsLCBkaXNwYXRjaEV2ZW50OiBib29rLmRpc3BhdGNoRXZlbnQuYmluZChib29rKSwgcmVuZGVyQ2FudmFzOiB0aGlzLmNhbnZhcywgcmVuZGVyQ2FudmFzQ3R4OiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpfSwgdGhpcy5yZXNvdXJjZXNDYWNoZSk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5ncyA9IFtdO1xyXG4gICAgdGhpcy5yZW5kZXJRdWV1ZSA9IFtdO1xyXG4gICAgdGhpcy5wYWdlUmVxdWVzdHMgPSBbXTtcclxuICAgIHRoaXMucHJlZGljdGVkUmVxdWVzdHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnRtcE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCk7XHJcbiAgICB2aXN1YWwuYWRkT2JqZWN0KG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDAsIDApLCB0aGlzLnRtcE1hdGVyaWFsKSk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nQW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZGluZyA9IHt9O1xyXG4gICAgdGhpcy5sb2FkaW5nW3AuY292ZXIuY29sb3JdID0gdGhpcy5jcmVhdGVMb2FkaW5nVGV4dHVyZShwLmNvdmVyKTtcclxuICAgIGlmKHAucGFnZS5jb2xvciE9PXAuY292ZXIuY29sb3IpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nW3AucGFnZS5jb2xvcl0gPSB0aGlzLmNyZWF0ZUxvYWRpbmdUZXh0dXJlKHAucGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50dXJuT25FdmVudHMoKTtcclxuXHJcbiAgICB2aXN1YWwuYWRkUmVuZGVyQ2FsbGJhY2sodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb2FkaW5nVGV4dHVyZShwKSB7XHJcbiAgICBjb25zdCBzcHJpdGVUaWxlcyA9IDYsXHJcbiAgICAgIHNjYWxlID0gTWF0aC5zcXJ0KDQuNSoyMTAqNC41KjI5Ny8ocC53aWR0aFRleGVscypwLmhlaWdodFRleGVscykpLFxyXG4gICAgICBhbmltYXRpb24gPSBuZXcgTG9hZGluZ0FuaW1hdGlvbihzY2FsZSpwLndpZHRoVGV4ZWxzLCBzY2FsZSpwLmhlaWdodFRleGVscywgcC5jb2xvciksXHJcbiAgICAgIGFuaW1hdG9yID0gbmV3IFRleHR1cmVBbmltYXRvcihhbmltYXRpb24uY3JlYXRlU3ByaXRlKHNwcml0ZVRpbGVzKSwgc3ByaXRlVGlsZXMsIDEsIHNwcml0ZVRpbGVzLCAwLjIpO1xyXG4gICAgYW5pbWF0aW9uLmRpc3Bvc2UoKTtcclxuICAgIHJldHVybiBhbmltYXRvcjtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnR1cm5PZmZFdmVudHMoKTtcclxuICAgIGZvcihsZXQgY29sb3Igb2YgT2JqZWN0LmtleXModGhpcy5sb2FkaW5nKSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmdbY29sb3JdLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmc7XHJcbiAgICB0aGlzLnJlc291cmNlc0NhY2hlLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGFnZUNhY2hlLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY2FudmFzLndpZHRoID0gMDtcclxuICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcclxuICB9XHJcblxyXG4gIGlzQ292ZXIobikge1xyXG4gICAgcmV0dXJuIG48MiB8fCBuPj0yKih0aGlzLnAuc2hlZXRzKzEpO1xyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGUoKSB7X
13345HJcbiAgICByZXR1cm4gKHRoaXMudmlzdWFsLnduZC5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpPjE7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlU3RhdGUobikge1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5wYWdlQ2FjaGUuZ2V0KG4pO1xyXG4gICAgcmV0dXJuIG9iamVjdD8gb2JqZWN0LnN0YXRlOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVMb2FkaW5nQW5pbWF0aW9uKGVuYWJsZSkge1xyXG4gICAgdGhpcy5sb2FkaW5nQW5pbWF0aW9uID0gZW5hYmxlO1xyXG4gICAgZm9yKGxldCBvIG9mIHRoaXMubG9hZGluZ3MpIHtcclxuICAgICAgdGhpcy5zZXR1cE1hdGVyaWFsKG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGR0KSB7XHJcbiAgICBpZih0aGlzLmxvYWRpbmdBbmltYXRpb24pIHtcclxuICAgICAgY29uc3QgbG9hZGluZyA9IHt9O1xyXG4gICAgICBmb3IobGV0IG8gb2YgdGhpcy5sb2FkaW5ncykge1xyXG4gICAgICAgIGlmKG8uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgbG9hZGluZ1tvLmNvbG9yXSA9IHRydWU7O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IobGV0IGNvbG9yIG9mIE9iamVjdC5rZXlzKGxvYWRpbmcpKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nW2NvbG9yXS51cGRhdGUoZHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVGcm9tTG9hZGluZ3Mobykge1xyXG4gICAgY29uc3QgaSA9IHRoaXMubG9hZGluZ3MuaW5kZXhPZihvKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ3Muc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRnJvbVJlbmRlclF1ZXVlKG8pIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnJlbmRlclF1ZXVlLmluZGV4T2Yobyk7XHJcbiAgICBpZih+aSkge1xyXG4gICAgICB0aGlzLnJlbmRlclF1ZXVlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hQYWdlUXVlcnkobiwgcXVlcnk9JycpIHtcclxuICAgIHRoaXMucGFnZVF1ZXJ5ID0gcXVlcnk7XHJcbiAgICBjb25zdCBvYmplY3QgPSB0aGlzLnBhZ2VDYWNoZS5nZXQobik7XHJcbiAgICBpZihvYmplY3QgJiYgb2JqZWN0LndyYXBwZXIgJiYgb2JqZWN0LndyYXBwZXIuc2V0UXVlcnkpIHtcclxuICAgICAgaWYoIXRoaXMucGFnZUNhY2hlLnJlbW92ZShuKSkge1xyXG4gICAgICAgIG9iamVjdC53cmFwcGVyLnNldFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgICB0aGlzLnB1c2hJblJlbmRlclF1ZXVlKG9iamVjdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hab29tKCkge1xyXG4gICAgaWYodGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZSkge1xyXG4gICAgICBjb25zdCBlcyA9IFtdO1xyXG4gICAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChlKT0+IHtcclxuICAgICAgICBlcy5wdXNoKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgZXMuZm9yRWFjaCgoZSk9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gZVsxXTtcclxuICAgICAgICBpZihvYmplY3QgJiYgb2JqZWN0LndyYXBwZXIpIHtcclxuICAgICAgICAgIGlmKCF0aGlzLnBhZ2VDYWNoZS5yZW1vdmUoZVswXSkpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoSW5SZW5kZXJRdWV1ZShvYmplY3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRMYXllcnMobiwgY2xiKSB7XHJcbiAgICBpZih0aGlzLnAuY3NzTGF5ZXJzTG9hZGVyKSB7XHJcbiAgICAgIHRoaXMucC5jc3NMYXllcnNMb2FkZXIobiwgKC4uLmFyZ3MpPT4ge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMucGFnZUNhY2hlLmdldChuKTtcclxuICAgICAgICBpZihvYmplY3QpIHtcclxuICAgICAgICAgIGlmKG9iamVjdC5zdGF0ZSE9PSdhY3RpdmUnKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5wZW5kaW5ncy5wdXNoKHtjbGIsIGFyZ3N9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjbGIoLi4uYXJncyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjbGIoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZVBlbmRpbmdzKHBlbmRpbmdzKSB7XHJcbiAgICBmb3IobGV0IHAgb2YgcGVuZGluZ3MpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwLmNsYiguLi5wLmFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwZW5kaW5ncy5zcGxpY2UoMCwgcGVuZGluZ3MubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHJ0bFBhZ2VOKG4pIHtcclxuICAgIHJldHVybiB0aGlzLnAucnRsPyAyKih0aGlzLnAuc2hlZXRzKzIpLTEtbjogbjtcclxuICB9XHJcblxyXG4gIGxvYWQobWF0ZXJpYWwsIG4pIHtcclxuICAgIGNvbnN0IHBpID0gdGhpcy5wLnBhZ2VDYWxsYmFjayh0aGlzLnJ0bFBhZ2VOKG4pKSwgcCA9IHRoaXMuaXNDb3ZlcihuKT8gdGhpcy5wLmNvdmVyOiB0aGlzLnAucGFnZTtcclxuICAgIGNvbnN0IG8gPSB7XHJcbiAgICAgIG4sXHJcbiAgICAgIHRleHR1cmU6IG5ldyBUSFJFRS5UZXh0dXJlKCksXHJcbiAgICAgIHdyYXBwZXI6IG51bGwsXHJcbiAgICAgIHN0YXRlOiAnbG9hZGluZycsXHJcbiAgICAgIGxvY2tlZDogKG4pPT4gby5zdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IG8uc3RhdGUgPT09ICdyZW5kZXJpbmcnIHx8IHRoaXMuYm9vay5pc0FjdGl2ZVBhZ2UobiksXHJcbiAgICAgIGNvbG9yOiBwLmNvbG9yLFxyXG4gICAgICBpc0FjdGl2ZTogKCk9PiB0aGlzLmJvb2suaXNBY3RpdmVQYWdlKG4pLFxyXG4gICAgICBpc1RvcDogKCk9PiB+dGhpcy5ib29rLmdldFRvcFBhZ2VzKCkuaW5kZXhPZihuKSxcclxuICAgICAgZGlzcG9zZTogKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTG9hZGluZ3Mobyk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tUmVuZGVyUXVldWUobyk
133457XHJcbiAgICAgICAgaWYoby53cmFwcGVyICYmIG8ud3JhcHBlci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICBvLndyYXBwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBvLnRleHR1cmU7XHJcbiAgICAgICAgZGVsZXRlIG8ud3JhcHBlcjtcclxuICAgICAgfSxcclxuICAgICAgcGVuZGluZ3M6IFtdXHJcbiAgICB9O1xyXG4gICAgby50ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgIHRoaXMubG9hZGluZ3MucHVzaChvKTtcclxuICAgIHRoaXMuc2V0TWF0ZXJpYWwobywgbWF0ZXJpYWwpO1xyXG5cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgIGlmKG8udGV4dHVyZSkge1xyXG4gICAgICAgIG8ud2lkdGhUZXhlbHMgPSBwaS53aWR0aFRleGVscyB8fCBwLndpZHRoVGV4ZWxzO1xyXG4gICAgICAgIG8uaGVpZ2h0VGV4ZWxzID0gcGkuaGVpZ2h0VGV4ZWxzIHx8IHAuaGVpZ2h0VGV4ZWxzO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuY2FsY1Jlc29sdXRpb24obyk7XHJcbiAgICAgICAgby53cmFwcGVyID0gdGhpcy5pbWFnZUZhY3RvcnkuYnVpbGQocGksIHBpLm51bWJlcj09PXVuZGVmaW5lZD8gdGhpcy5ydGxQYWdlTihuKTogcGkubnVtYmVyLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIHAuY29sb3IsIHRoaXMucC5pbmplY3Rvcik7XHJcbiAgICAgICAgaWYoby53cmFwcGVyLnNldFF1ZXJ5KSB7XHJcbiAgICAgICAgICBvLndyYXBwZXIuc2V0UXVlcnkodGhpcy5wYWdlUXVlcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnNpbXVsYXRlID0gcGkuaW50ZXJhY3RpdmU/IChvLndyYXBwZXIuc2ltdWxhdGUgfHwgKCgpPT4gdW5kZWZpbmVkKSkuYmluZChvLndyYXBwZXIpOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgby53cmFwcGVyLm9uTG9hZCA9ICgpPT4ge1xyXG4gICAgICAgICAgdGhpcy5wdXNoSW5SZW5kZXJRdWV1ZShvKTtcclxuICAgICAgICAgIHRoaXMuYm9vay5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICAgICAgdHlwZTogJ2xvYWRlZFBhZ2UnLFxyXG4gICAgICAgICAgICBwYWdlOiBuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIG8ud3JhcHBlci5vbkNoYW5nZSA9IChpbWFnZSk9PiB7XHJcbiAgICAgICAgICBpZihvLnRleHR1cmUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tTG9hZGluZ3Mobyk7XHJcbiAgICAgICAgICAgIGlmKG8ubWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLm1hcCA9IG8udGV4dHVyZTtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLmNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKDB4RkZGRkZGKTtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvLnRleHR1cmUuaW1hZ2UgPSBpbWFnZTtcclxuICAgICAgICAgICAgby50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgby50ZXh0dXJlLm9uVXBkYXRlID0gKCk9PiB7XHJcbiAgICAgICAgICAgICAgaWYoby5zdGF0ZSAhPT0gJ3F1ZXVlZEZvclJlbmRlcicpIHtcclxuICAgICAgICAgICAgICAgIG8uc3RhdGUgPSAnYWN0aXZlJztcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVBlbmRpbmdzKG8ucGVuZGluZ3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZW5kZXJpbmc7XHJcbiAgICAgICAgICAgICAgLy90aGlzLnVwZGF0ZVJlbmRlclF1ZXVlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMudG1wTWF0ZXJpYWwubWFwID0gby50ZXh0dXJlO1xyXG4gICAgICAgICAgICB0aGlzLnRtcE1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYm9vay5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgdHlwZTogJ2xvYWRQYWdlJyxcclxuICAgICAgcGFnZTogblxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlQ2FjaGUucHV0KG4sIG8pO1xyXG4gIH1cclxuXHJcbiAgaXNTaW5nbGVQYWdlKG8pIHtcclxuICAgIHJldHVybiB0aGlzLnAuc2luZ2xlUGFnZSB8fCAhby5uIHx8IG8ubj09PXRoaXMuYm9vay5nZXRQYWdlcygpLTE7XHJcbiAgfVxyXG5cclxuICBjYWxjUmVzb2x1dGlvbihvKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgaWYodGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZSkge1xyXG4gICAgICBjb25zdCBrID0gTWF0aC5taW4oKHRoaXMuaXNTaW5nbGVQYWdlKG8pPyAxOiAwLjUpKnRoaXMudmlzdWFsLndpZHRoKCkvby53aWR0aFRleGVscywgdGhpcy52aXN1YWwuaGVpZ2h0KCkvby5oZWlnaHRUZXhlbHMpO1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgd2lkdGg6IHRoaXMucC5hdXRvUmVzb2x1dGlvbi5rKnRoaXMucC56b29tKmsqby53aWR0aFRleGVscyxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMucC5hdXRvUmVzb2x1dGlvbi5rKnRoaXMucC56b29tKmsqby5oZWlnaHRUZXhlbHNcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgd2lkdGg6IG8ud2lkdGhUZXhlbHMsXHJcbiAgICAgICAgaGVpZ2h0OiBvLmhlaWdodFRleGVsc1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHB1c2hJblJlbmRlclF1ZXVlKG8pIHtcclxuICAgIGlmKG8uc3RhdGUgIT09ICdxdWV1ZWRGb3JSZW5kZXInKSB7XHJcbiAgICAgIG8uc3RhdGUgPSAncXVldWVkRm9yUmVuZGVyJztcclxuICAgICAgdGhpcy5yZW5kZXJRdWV1ZS5wdXNoKG8pO1xyXG4gICAgICAvLyB0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVSZW5kZXJRdWV1ZSgpIHtcclxuICAgIGlmKHRoaXMuY2FudmFzKSB7XHJcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnA7XHJcbiAgICAgIGlmKCF0aGlzLnJlbmRlcmluZyAmJiAocC5yZW5kZXJXaGlsZUZsaXBwaW5nIHx8ICF0aGlzLmJvb2suaXNQcm9jZXNzaW5nKCkpKSB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZSwgdG9wO1xyXG4gICAgICAgIGZvcihsZXQgbyBvZiB0aGlzLnJlbmRlclF1ZXVlKSB7XHJcbiAgICAgICAgICBpZighYWN0aXZlICYmIG8uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICBhY3RpdmUgPSBvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoby5pc1RvcCgpKSB7XHJcbiAgICAgICAgICAgI
13345HRvcCA9IG87XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlcmluZyA9IHRvcCB8fCBhY3RpdmU7XHJcbiAgICAgICAgaWYodGhpcy5pc01vYmlsZSgpICYmIHAucmVuZGVySW5hY3RpdmVQYWdlc09uTW9iaWxlIHx8ICF0aGlzLmlzTW9iaWxlKCkgJiYgcC5yZW5kZXJJbmFjdGl2ZVBhZ2VzKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmluZyA9IHRoaXMucmVuZGVyaW5nIHx8IHRoaXMucmVuZGVyUXVldWVbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMucmVuZGVyaW5nKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnJlbmRlcmluZy53cmFwcGVyLnN0YXJ0UmVuZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVJlbmRlclF1ZXVlKHRoaXMucmVuZGVyaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcuc3RhdGUgPSAncmVuZGVyaW5nJztcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcud3JhcHBlci5zZXRSZXNvbHV0aW9uKHRoaXMuY2FsY1Jlc29sdXRpb24odGhpcy5yZW5kZXJpbmcpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcud3JhcHBlci5zdGFydFJlbmRlcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlcmluZztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0dXJuT25FdmVudHMoKSB7XHJcbiAgICB0aGlzLnRyYW5zZmVyRXZlbnRzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHR1cm5PZmZFdmVudHMoKSB7XHJcbiAgICBjb25zdCBtb3VzZXVwID0gJC5FdmVudCgnbW91c2V1cCcpLCBtb3VzZW91dCA9ICQuRXZlbnQoJ21vdXNlb3V0Jyk7XHJcbiAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChlbnQpPT4ge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBlbnRbMV07XHJcbiAgICAgIGlmKG9iamVjdC5zaW11bGF0ZSkge1xyXG4gICAgICAgIG9iamVjdC5zaW11bGF0ZShtb3VzZXVwLCB1bmRlZmluZWQsIDAsIDApO1xyXG4gICAgICAgIG9iamVjdC5zaW11bGF0ZShtb3VzZW91dCwgdW5kZWZpbmVkLCAwLCAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyYW5zZmVyRXZlbnRzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0cmFuc2ZlckV2ZW50VG9UZXh0dXJlKG4sIGUsIGRhdGEpIHtcclxuICAgIGlmKHRoaXMudHJhbnNmZXJFdmVudHMpIHtcclxuICAgICAgY29uc3QgdG9PYmplY3QgPSB0aGlzLmdldE9yTG9hZFRleHR1cmVPYmplY3QodW5kZWZpbmVkLCBuKTtcclxuICAgICAgaWYodG9PYmplY3Qud3JhcHBlcikge1xyXG4gICAgICAgIGNvbnN0IHt1dn0gPSBkYXRhLCB0b0RvYyA9IHRvT2JqZWN0LndyYXBwZXIuZ2V0U2ltdWxhdGVkRG9jKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZW50KT0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGVudFsxXTtcclxuICAgICAgICAgIGlmKG9iamVjdC5zaW11bGF0ZSkge1xyXG4gICAgICAgICAgICBvYmplY3Quc2ltdWxhdGUoZSwgdG9Eb2MsIHV2LngsIHV2LnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkUHJlZGljdGVkUGFnZXMoKSB7XHJcbiAgICB0aGlzLnByZWRpY3RlZFJlcXVlc3RzID0gQmFzZU1hdGhVdGlscy5wcmVkaWN0KHRoaXMucGFnZVJlcXVlc3RzLCB0aGlzLnAucHJlbG9hZFBhZ2VzKTtcclxuICAgIGZvcihsZXQgcCBvZiB0aGlzLnByZWRpY3RlZFJlcXVlc3RzKSB7XHJcbiAgICAgIGlmKHA8dGhpcy5ib29rLmdldFBhZ2VzKCkgJiYgIXRoaXMucGFnZUNhY2hlLmdldChwKSkge1xyXG4gICAgICAgIHRoaXMubG9hZCh1bmRlZmluZWQsIHApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRQYWdlUmVxdWVzdChuKSB7XHJcbiAgICB0aGlzLnBhZ2VSZXF1ZXN0cy5wdXNoKG4pO1xyXG4gICAgaWYodGhpcy5wYWdlUmVxdWVzdHMubGVuZ3RoPnRoaXMucC5wYWdlc0ZvclByZWRpY3RpbmcpIHtcclxuICAgICAgdGhpcy5wYWdlUmVxdWVzdHMuc2hpZnQoKTtcclxuICAgIH1cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5sb2FkUHJlZGljdGVkUGFnZXMuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBzZXRNYXRlcmlhbChvLCBtYXRlcmlhbCkge1xyXG4gICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZSk9PiB7XHJcbiAgICAgIGNvbnN0IG9iID0gZVsxXTtcclxuICAgICAgaWYobyE9PW9iICYmIG9iLm1hdGVyaWFsPT09bWF0ZXJpYWwpIHtcclxuICAgICAgICBkZWxldGUgb2IubWF0ZXJpYWw7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYobWF0ZXJpYWwgJiYgbWF0ZXJpYWwhPT1vLm1hdGVyaWFsKSB7XHJcbiAgICAgIG8ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuICAgICAgdGhpcy5zZXR1cE1hdGVyaWFsKG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0dXBNYXRlcmlhbChvKSB7XHJcbiAgICBvLm1hdGVyaWFsLm1hcCA9IG8udGV4dHVyZS5pbWFnZT8gby50ZXh0dXJlOiAodGhpcy5sb2FkaW5nQW5pbWF0aW9uPyB0aGlzLmxvYWRpbmdbby5jb2xvcl0udGV4dHVyZTogbnVsbCk7XHJcbiAgICBpZighby5tYXRlcmlhbC5tYXApIHtcclxuICAgICAgby5tYXRlcmlhbC5jb2xvciA9IG5ldyBUSFJFRS5Db2xvcihvLmNvbG9yKTtcclxuICAgIH1cclxuICAgIG8ubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JMb2FkVGV4dHVyZU9iamVjdChtYXRlcmlhbCwgbikge1xyXG4gICAgbGV0IG9iamVjdCA9IHRoaXMucGFnZUNhY2hlLmdldChuKTtcclxuICAgIGlmKCFvYmplY3QpIHtcclxuICAgICAgb2JqZWN0ID0gdGhpcy5sb2FkKG1hdGVyaWFsLCBuKTtcclxuICAgICAgdGhpcy5hZGRQYWdlUmVxdWVzdChuKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldE1hdGVyaWFsKG9iamVjdCwgbWF0ZXJpYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybi
13345BvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICBpZih+dGhpcy5wcmVkaWN0ZWRSZXF1ZXN0cy5pbmRleE9mKG4pKSB7XHJcbiAgICAgIHRoaXMuYWRkUGFnZVJlcXVlc3Qobik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldE9yTG9hZFRleHR1cmVPYmplY3QobWF0ZXJpYWwsIG4pO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1BhZ2VNYW5hZ2VyLmpzIiwiaW1wb3J0IEJvb2tQcm9wc0J1aWxkZXIgZnJvbSAnLi9Cb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IFBkZiBmcm9tICdQZGYnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGRmQm9va1Byb3BzQnVpbGRlciBleHRlbmRzIEJvb2tQcm9wc0J1aWxkZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcmMsIG9uUmVhZHkpIHtcclxuICAgIHN1cGVyKG9uUmVhZHkpO1xyXG4gICAgdGhpcy5wZGYgPSBuZXcgUGRmKHNyYyk7XHJcbiAgICB0aGlzLnBhZ2VEZXNjcmlwdGlvbiA9IHtcclxuICAgICAgdHlwZTogJ3BkZicsXHJcbiAgICAgIHNyYzogdGhpcy5wZGYsXHJcbiAgICAgIGludGVyYWN0aXZlOiB0cnVlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgcGFnZUNhbGxiYWNrOiB0aGlzLnBhZ2VDYWxsYmFjay5iaW5kKHRoaXMpXHJcbiAgICB9O1xyXG4gICAgdGhpcy5wZGYuZ2V0SGFuZGxlcih0aGlzLmluaXQuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5wZGYuZGlzcG9zZSgpO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdChoYW5kbGVyKSB7XHJcbiAgICBjb25zdCBwYWdlcyA9IHRoaXMucGRmLmdldFBhZ2VzTnVtKCk7XHJcbiAgICB0aGlzLmNhbGNTaGVldHMocGFnZXMpO1xyXG4gICAgaWYocGFnZXM+MCkge1xyXG4gICAgICBoYW5kbGVyLmdldFBhZ2UoMSkuXHJcbiAgICAgIHRoZW4oKHBhZ2UpPT4ge1xyXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCgxKSwgc2l6ZSA9IHt3aWR0aDogdmlld3BvcnQud2lkdGgsIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0fTtcclxuICAgICAgICB0aGlzLmNhbGNQcm9wcyhzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5yZWFkeSgpO1xyXG4gICAgICB9KS5cclxuICAgICAgY2F0Y2goKGUpPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvcHMgPSB0aGlzLmRlZmF1bHRzO1xyXG4gICAgICB0aGlzLnJlYWR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYWdlQ2FsbGJhY2sobikge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZURlc2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9QZGZCb29rUHJvcHNCdWlsZGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGRmTGlua3NIYW5kbGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IocGRmLCBjdHJsLCBlbGVtZW50KSB7XHJcbiAgICB0aGlzLnBkZiA9IHBkZjtcclxuICAgIHRoaXMuY3RybCA9IGN0cmw7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpO1xyXG4gICAgdGhpcy5jdXJzb3JzID0gW107XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHNldEhhbmRsZXIoaGFuZGxlcikge1xyXG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcclxuICB9XHJcblxyXG4gIGRlZmF1bHRIYW5kbGVyKHR5cGUsIGRlc3RpbmF0aW9uKSB7XHJcbiAgICBpZih0eXBlPT09J2ludGVybmFsJykge1xyXG4gICAgICB0aGlzLmN0cmwuZ29Ub1BhZ2UoZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0eXBlPT09J2V4dGVybmFsJykge1xyXG4gICAgICB3aW5kb3cub3BlbihkZXN0aW5hdGlvbiwgJ19ibGFuaycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsbEhhbmRsZXJzKHR5cGUsIGRlc3RpbmF0aW9uKSB7XHJcbiAgICBpZighdGhpcy5oYW5kbGVyIHx8ICF0aGlzLmhhbmRsZXIodHlwZSwgZGVzdGluYXRpb24pKSB7XHJcbiAgICAgIHRoaXMuZGVmYXVsdEhhbmRsZXIodHlwZSwgZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXZlbnQoZGF0YSkge1xyXG4gICAgY29uc3QgZSA9IGRhdGEuZXZlbnQsIGFubm8gPSBkYXRhLmFubm90YXRpb247XHJcbiAgICBzd2l0Y2goZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6IHtcclxuICAgICAgICB0aGlzLmN1cnNvcnMucHVzaCh0aGlzLmVsZW1lbnQuY3NzKCdjdXJzb3InKSk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmNzcygnY3
13345Vyc29yJywgJ3BvaW50ZXInKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZW91dCc6IHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuY3NzKCdjdXJzb3InLCB0aGlzLmN1cnNvcnMucG9wKCkgfHwgJycpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3RvdWNodGFwJzpcclxuICAgICAgY2FzZSAnY2xpY2snOiB7XHJcbiAgICAgICAgaWYoYW5uby51cmwpIHtcclxuICAgICAgICAgIHRoaXMuY2FsbEhhbmRsZXJzKCdleHRlcm5hbCcsIGFubm8udXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihhbm5vLmRlc3QpIHtcclxuICAgICAgICAgIGxldCBkZXN0UHJvbWlzZTtcclxuICAgICAgICAgIGlmKHR5cGVvZiBhbm5vLmRlc3Q9PT0nc3RyaW5nJykge1xyXG4gICAgICAgICAgICBkZXN0UHJvbWlzZSA9IHRoaXMucGRmLmhhbmRsZXIuZ2V0RGVzdGluYXRpb24oYW5uby5kZXN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZXN0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShhbm5vLmRlc3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGVzdFByb21pc2UuXHJcbiAgICAgICAgICAgIHRoZW4oKGRlc3QpPT4gdHlwZW9mIGRlc3RbMF09PT0nbnVtYmVyJz8gZGVzdFswXTogdGhpcy5wZGYuaGFuZGxlci5nZXRQYWdlSW5kZXgoZGVzdFswXSkpLlxyXG4gICAgICAgICAgICB0aGVuKChudW1iZXIpPT4gdGhpcy5jYWxsSGFuZGxlcnMoJ2ludGVybmFsJywgbnVtYmVyKSkuXHJcbiAgICAgICAgICAgIGNhdGNoKCgpPT4gY29uc29sZS5lcnJvcignQmFkIGxpbmsnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1BkZkxpbmtzSGFuZGxlci5qcyIsImltcG9ydCBGaW5kZXIgZnJvbSAnRmluZGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaEVuZ2luZSB7XHJcbiAgY29uc3RydWN0b3IocGFnZUNhbGxiYWNrLCBwYWdlcykge1xyXG4gICAgdGhpcy5wYWdlQ2FsbGJhY2sgPSBwYWdlQ2FsbGJhY2s7XHJcbiAgICB0aGlzLnBhZ2VzID0gcGFnZXM7XHJcbiAgICB0aGlzLnJlc3VsdHMgPSBbXTtcclxuICB9XHJcblxyXG4gIHNldFF1ZXJ5KHF1ZXJ5KSB7XHJcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XHJcbiAgICB0aGlzLnVwZGF0ZSA9IHRydWU7XHJcbiAgICB0aGlzLnByb2Nlc3MoKTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3MoKSB7XHJcbiAgICBpZih0aGlzLnVwZGF0ZSkge1xyXG4gICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5yZXN1bHRzO1xyXG4gICAgICB0aGlzLnJlc3VsdHMgPSBbXTtcclxuICAgICAgaWYodGhpcy5vblBhZ2VIaXRzQ2hhbmdlZCkge1xyXG4gICAgICAgIGZvcihsZXQgcmVzIG9mIHJlc3VsdHMpIHtcclxuICAgICAgICAgIHRoaXMub25QYWdlSGl0c0NoYW5nZWQodW5kZWZpbmVkLCAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucGFnZSA9IDA7XHJcbiAgICAgIHRoaXMuc3RhbXAgPSBEYXRlLm5vdygpO1xyXG4gICAgICBpZih0aGlzLnF1ZXJ5Lmxlbmd0aD4xKSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZih0aGlzLnBhZ2U8dGhpcy5wYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHN0YW1wID0gdGhpcy5zdGFtcDtcclxuICAgICAgICB0aGlzLmZpbmQodGhpcy5wYWdlQ2FsbGJhY2sodGhpcy5wYWdlKSkuXHJcbiAgICAgICAgICB0aGVuKChjb250ZXh0cyk9PiB7XHJcbiAgICAgICAgICAgIGlmKHN0YW1wID09PSB0aGlzLnN0YW1wKSB7XHJcbiAgICAgICAgICAgICAgaWYoY29udGV4dHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcclxuICAgICAgICAgICAgICAgICAgY29udGV4dHNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZih0aGlzLm9uUGFnZUhpdHNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGFnZUhpdHNDaGFuZ2VkKHRoaXMucGFnZSwgdGhpcy5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICsrdGhpcy5wYWdlO1xyXG4gICAgICAgICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZChwaSkge1xyXG4gICAgbGV0IG5leHQ7XHJcbiAgICBpZihwaS50eXBlPT09J3BkZicpIHtcclxuICAgICAgbmV4dCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgICBwaS5zcmMuZ2V0SGFuZGxlcigoKT0+IHtcclxuICAgICAgICAgIGNvbnN0IG4gPSBwaS5udW1iZXI9PT11bmRlZmluZWQ/IHRoaXMucGFnZTogcGkubnVtYmVyO1xyXG4gICAgICAgICAgaWYocGkuc3JjLmdldFBhZ2VUeXBlKG4pPT09J3JpZ2h0Jykge1xyXG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBwaS5zcmMuZ2V0UGFnZShuKS5cclxuICAgICAgICAgICAgdGhlbigocGFnZSk9PiB7XHJcbiAgICAgICAgICAgICAgcGFnZS5nZXRUZXh0Q29udGVudCgpLlxyXG4gICAgICAgICAgICAgIHRoZW4oKHRleHRDb250ZW50KT0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IEZpbmRlcih0ZXh0Q29udGVudC5pdGVtcy5tYXAoKGl0ZW0pPT4gaXRlbS5zdHIpLCB0aGlzLnF1ZXJ5LCB7aGl0czogZmFsc2V9KS5nZXRDb250ZXh0cygpKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkuXHJcbiAgICAgICAgICAgIGNhdGNoKCgpPT4gcmVzb2x2ZShbXSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgI
13345H0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBuZXh0ID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0O1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9TZWFyY2hFbmdpbmUuanMiLCJpbXBvcnQgQ1NTTGF5ZXIgZnJvbSAnQ1NTTGF5ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlZXRDc3NMYXllciB7XHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBibG9jaywgcHJvcHMpIHtcclxuICAgIHRoaXMudmlzdWFsID0gdmlzdWFsO1xyXG4gICAgY29uc3Qgc2l6ZSA9IGJsb2NrLmdldFRvcFNpemUoKTtcclxuICAgIHRoaXMubGF5ZXIgPSBuZXcgQ1NTTGF5ZXIoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIHByb3BzKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZShibG9jayk7XHJcbiAgICB0aGlzLnZpc3VhbC5hZGRDc3NPYmplY3QodGhpcy5sYXllcik7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5sYXllci5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnZpc3VhbC5yZW1vdmVDc3NPYmplY3QodGhpcy5sYXllcik7XHJcbiAgfVxyXG5cclxuICBpc0hpZGRlbigpIHtcclxuICAgIHJldHVybiB0aGlzLmxheWVyLmlzSGlkZGVuKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5ZXIuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLmxheWVyLnNob3coKTtcclxuICB9XHJcblxyXG4gIHNldChjc3MsIGh0bWwsIGpzKSB7XHJcbiAgICB0aGlzLmxheWVyLnNldERhdGEoY3NzLCBodG1sLCBqcyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoYmxvY2spIHtcclxuICAgIHRoaXMuYmxvY2sgPSBibG9jaztcclxuICAgIHRoaXMuYmxvY2suZ2V0VG9wV29ybGRSb3RhdGlvbih0aGlzLmxheWVyLnJvdGF0aW9uKTtcclxuICAgIHRoaXMuYmxvY2suZ2V0VG9wV29ybGRQb3NpdGlvbih0aGlzLmxheWVyLnBvc2l0aW9uKTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9TaGVldENzc0xheWVyLmpzIiwiaW1wb3J0IE1hdGhVdGlscyBmcm9tICdNYXRoVXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlZXRQaHlzaWNzIHtcclxuXHJcbiAgc3RhdGljIHRhcmdldEZvcmNlQ2xiKG8sYSx2LGNoKSB7XHJcbiAgICBjb25zdCBsID0gYSp0aGlzLnI7XHJcbiAgICByZXR1cm4gMTAwKnRoaXMubSp0aGlzLmcqKDIvKDErTWF0aC5leHAoMTAqKGwtdGhpcy50bCkpKS0xKS10aGlzLm0qNDAqdjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBob3ZlckNvcm5lckZvcmNlQ2xiKG8sdixsLGNoKSB7XHJcbiAgICByZXR1cm4gNTtcclxuICB9XHJcblxyXG4gIGdldFRhcmdldEZvcmNlQ2xiKG1hc3MsIHRhcmdldEFuZ2xlKSB7XHJcbiAgICByZXR1cm4gU2hlZXRQaHlzaWNzLnRhcmdldEZvcmNlQ2xiLmJpbmQoe1xyXG4gICAgICBnOiB0aGlzLnAuZ3Jhdml0eSxcclxuICAgICAgbTogbWFzcyxcclxuICAgICAgdGw6IHRhcmdldEFuZ2xlKnRoaXMucC5yLFxyXG4gICAgICByOiB0aGlzLnAuclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZHJhZ0ZvcmNlQ2xiKG8sYSx2LGNoKSB7XHJcbiAgICByZXR1cm4gby5mbGJ0Km8ubSooMTAqby5nKmNoLTUwKnYvKDErTWF0aC5leHAoMy41Kk1hdGguYWJzKGNoKSkpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkcmFnQ29ybmVyRm9yY2VDbGIobyxhLHYsY2gpIHtcclxuICAgIHJldHVybiAxNSooMi8oMStNYXRoLmV4cCgxMCooYS10aGlzLnRhKSpvLnIpKS0xKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXREcmFnQ29ybmVyRm9yY2VDbGIodGFyZ2V0QW5nbGUpIHtcclxuICAgIHJldHVybiBTaGVldFBoeXNpY3MuZHJhZ0Nvcm5lckZvcmNlQ2xiLmJpbmQoe1xyXG4gICAgICB0YTogdGFyZ2V0QW5nbGVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Iocj0xLCBncmF2aXR5PTEsIGNvcm5lckRldmlhdGlvbj0wLjE1LCBmcHM9MjQwKSB7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIHIsXHJcbiAgICAgIGNvcm5lckRldmlhdGlvbixcclxuICAgICAgbDogTWF0aC5QSSpyLFxyXG4gICAgICBzdGFydER0OiAxL2ZwcyxcclxuICAgICAgZ3Jhdml0eSxcclxuICAgICAgbWFyZ2luOiAwLjAwMipyLFxyXG4gICAgICBpbmZNOiAxZTQsXHJcbiAgICAgIGF0dGVtcHRzOiAxNixcclxuICAgICAgbWF4SXRlcmF0aW9uczogMTAwXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMub3MgPSBbXTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBhZGRPYmplY3QobWFzcywgYW5nbGUsIHZlbG9jaXR5LCBmbGV4aWJpbGl0eSwgY29ybmVySGVpZ2h0LCBzaW11bGF0ZUNsYiwgcmVtb3ZlQ2xiLCBmb3JjZUNsYj0oKT0+IDAsIGNvcm5lckZvcmNlQ2xiPSgpPT4gMCkge1xyXG4gICAgY29uc3Qgbm8gPSB7XHJcbiAgICAgIGlkOiBNYXRoVXRpbHMuZ2V0VW5pcXVlKCksXHJcbiAgICAgIG06IG1hc3MsXHJcbiAgICAgIHY6IHZlbG9jaXR5LFxyXG4gICAgICBsOiBhbmdsZSp0aGlzLnAucixcclxuICAgICAgZjogZm9yY2VDbGIsXHJcbiAgICAgIGNmOiBjb3JuZXJGb3JjZUNsYixcclxuICAgICAgY2g6IGNvcm5lckhlaWdodCxcclxuICAgICAgZmxidDogZmxleGliaWxpdHksXHJcbiAgICAgIHNpbXVsYXRlQ2xiLFxyXG4gICAgICByZW1vdmVDbGJcclxuICAgIH07XHJcbiAgICBsZXQgaSA9IHRoaXMub3MuZmluZEluZGV4KChvKT0+IG5vLmw8PW8ubCk7XHJcbiAgICBpID0gfmk/IGk6IHRoaXMub3MubGVuZ3RoO1xyXG4gICAgdGhpcy5vcy5zcGxpY2UoaSwgMCwgbm8pO1xyXG4gICAgcmV0dXJuIG5vLmlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFyYW1ldHJNYXAobmFtZSkge1xyXG4gICAgY29uc3QgbWFwID0ge1xyXG4gICAgICBtYXNzOiAnbScsXHJcbiAgICAgIHZlbG9jaXR5OiAndicsXHJcbiAgICAgIGZsZXhpYmlsaXR5OiAnZmxidCcsXHJcbiAgICAgIGNvcm5lckhlaWdodDogJ2NoJ
13345yxcclxuICAgICAgc2ltdWxhdGVDbGI6ICdzaW11bGF0ZUNsYicsXHJcbiAgICAgIHJlbW92ZUNsYjogJ3JlbW92ZUNsYicsXHJcbiAgICAgIGZvcmNlQ2xiOiAnZicsXHJcbiAgICAgIGNvcm5lckZvcmNlQ2xiOiAnY2YnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG1hcFtuYW1lXTtcclxuICB9XHJcblxyXG4gIHNldFBhcmFtZXRyKGlkLCBuYW1lLCB2YWx1ZSkge1xyXG4gICAgY29uc3QgbyA9IHRoaXMub3MuZmluZCgobyk9PiBvLmlkPT09aWQpO1xyXG4gICAgaWYobmFtZSA9PT0gJ2FuZ2xlJykge1xyXG4gICAgICBvLmwgPSB2YWx1ZSp0aGlzLnAucjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBvW3RoaXMuZ2V0UGFyYW1ldHJNYXAobmFtZSldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQYXJhbWV0cihpZCwgbmFtZSkge1xyXG4gICAgY29uc3QgbyA9IHRoaXMub3MuZmluZCgobyk9PiBvLmlkPT09aWQpO1xyXG4gICAgbGV0IHZhbHVlO1xyXG4gICAgaWYobmFtZSA9PT0gJ2FuZ2xlJykge1xyXG4gICAgICB2YWx1ZSA9IG8ubC90aGlzLnAucjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB2YWx1ZSA9IG9bdGhpcy5nZXRQYXJhbWV0ck1hcChuYW1lKV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzaW11bGF0ZShUKSB7XHJcbiAgICBsZXQgdD0wLFxyXG4gICAgICAgIGR0PXRoaXMucC5zdGFydER0LFxyXG4gICAgICAgIGF0dGVtcHQ9MCxcclxuICAgICAgICBpdD0wO1xyXG5cclxuICAgIHdoaWxlKHQ8VCAmJiBpdDx0aGlzLnAubWF4SXRlcmF0aW9ucykge1xyXG4gICAgICBpZihkdD5ULXQpIHtcclxuICAgICAgICBkdCA9IFQtdDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBub3MgPSB0aGlzLmludGVncmF0ZSh0aGlzLm9zLCBkdCksXHJcbiAgICAgICAgICAgIGNpID0gdGhpcy5maW5kQ29sbGlzaW9ucyhub3MpO1xyXG4gICAgICBpZihjaS5udW0+MSAmJiBhdHRlbXB0PHRoaXMucC5hdHRlbXB0cykge1xyXG4gICAgICAgIGR0Lz0yO1xyXG4gICAgICAgICsrYXR0ZW1wdDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZihjaS5udW09PT0xKSB7XHJcbiAgICAgICAgICBjb25zdCBzY29zID0gdGhpcy5zb2x2ZUNvbGxpc2lvbihub3NbY2kubGFzdC0xXSwgbm9zW2NpLmxhc3RdKTtcclxuICAgICAgICAgIG5vc1tjaS5sYXN0LTFdID0gc2Nvc1swXTtcclxuICAgICAgICAgIG5vc1tjaS5sYXN0XSA9IHNjb3NbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoY2kubnVtPjEpIHtcclxuICAgICAgICAgIGNvbnN0IGdzID0gW107XHJcbiAgICAgICAgICBsZXQgbGFzdCA9IC0yO1xyXG4gICAgICAgICAgZm9yKGxldCBpIG9mIGNpLmFsbCkge1xyXG4gICAgICAgICAgICBpZihpLWxhc3Q+MSkge1xyXG4gICAgICAgICAgICAgIGdzLnB1c2goW10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdzW2dzLmxlbmd0aC0xXS5wdXNoKGkpO1xyXG4gICAgICAgICAgICBsYXN0ID0gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvcihsZXQgZyBvZiBncykge1xyXG4gICAgICAgICAgICBsZXQgc2csIGkwO1xyXG4gICAgICAgICAgICBpZihub3NbZ1swXV0ubD5NYXRoLlBJLzIqdGhpcy5wLnIpIHtcclxuICAgICAgICAgICAgICBzZyA9IC0xO1xyXG4gICAgICAgICAgICAgIGkwID0gZ1tnLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBzZyA9IDE7XHJcbiAgICAgICAgICAgICAgaTAgPSBnWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT1pMDsgaTxub3MubGVuZ3RoICYmIGk+LTE7IGkrPXNnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbyA9IG5vc1tpK3NnXTtcclxuICAgICAgICAgICAgICBpZihvICYmIHNnKihvLmwtbm9zW2ldLmwpPD10aGlzLnAubWFyZ2luKSB7XHJcbiAgICAgICAgICAgICAgICBvLmw9bm9zW2ldLmwrc2cqMip0aGlzLnAubWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgaWYoby5sPnRoaXMucC5sIHx8IG8ubDwwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG8ubCA9IG8ubD50aGlzLnAubD8gdGhpcy5wLmw6IDA7XHJcbiAgICAgICAgICAgICAgICAgIG8uY2ggPSAwO1xyXG4gICAgICAgICAgICAgICAgICBvLnY9MDtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQmFkIGNvbGxpc2lvbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9zID0gbm9zO1xyXG4gICAgICAgIHRoaXMuZmluZEFuZFNvbHZlQ29ybmVyQ29sbGlzaW9ucygpO1xyXG4gICAgICAgIHQrPWR0O1xyXG4gICAgICAgIGR0PXRoaXMucC5zdGFydER0O1xyXG4gICAgICAgIGF0dGVtcHQ9MDtcclxuICAgICAgfVxyXG4gICAgICArK2l0O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVtb3ZlU3RhdGljcygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU3RhdGljcygpIHtcclxuICAgIGNvbnN0IG5vcyA9IFtdLCBub3RpZnkgPSBbW10sW11dO1xyXG4gICAgZm9yKGxldCBvIG9mIHRoaXMub3MpIHtcclxuICAgICAgaWYoby5zaW11bGF0ZUNsYikge1xyXG4gICAgICAgIG8uc2ltdWxhdGVDbGIoby5sL3RoaXMucC5yLCBvLmNoKTtcclxuICAgICAgfVxyXG4gICAgICBpZigoby5sPT09dGhpcy5wLmwgfHwgby5sPT09MCkgJiYgby52PT09MCkge1xyXG4gICAgICAgIGlmKG8ucmVtb3ZlQ2xiICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG5vdGlmeVsoby5sIT09dGhpcy5wLmwpKzBdLnB1c2gobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIG5vcy5wdXNoKG8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm9zID0gbm9zO1xyXG4gICAgZm9yKGxldCBvIG9mIG5vdGlmeVswXS5yZXZlcnNlKCkpIHtcclxuICAgICAgby5yZW1vdmVDbGIoTWF0aC5QSSwgby5jaCk7XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IG8gb2Ygbm90aWZ5WzFdKSB7XHJcbiAgICAgIG8ucmVtb3ZlQ2xiKDAsIG8uY2gpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZEFuZFNvbHZlQ29ybmVyQ29sbGlzaW9ucygpIHtcclxuICAgIGlmKHRoaXMub3MubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG9zID0gW1xyXG4gICAgICAgI
13345HtcclxuICAgICAgICAgIC4uLnRoaXMub3NbMF0sXHJcbiAgICAgICAgICBsOiAwLFxyXG4gICAgICAgICAgbTogdGhpcy5wLmluZk0sXHJcbiAgICAgICAgICBjaDogMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4udGhpcy5vcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAuLi50aGlzLm9zWzBdLFxyXG4gICAgICAgICAgbDogMS4wNSp0aGlzLnAubCxcclxuICAgICAgICAgIG06IHRoaXMucC5pbmZNLFxyXG4gICAgICAgICAgY2g6IDBcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcblxyXG4gICAgICBmb3IobGV0IGk9MTsgaTxvcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IGE9b3NbaS0xXSwgYj1vc1tpXSxcclxuICAgICAgICAgICAgICBhbD1hLmwrdGhpcy5wLmNvcm5lckRldmlhdGlvbiphLmNoKnRoaXMucC5yLFxyXG4gICAgICAgICAgICAgIGJsPWIubCt0aGlzLnAuY29ybmVyRGV2aWF0aW9uKmIuY2gqdGhpcy5wLnI7XHJcbiAgICAgICAgaWYoMS4wNSphbD5ibCAmJiBhLmNoPmIuY2gpIHtcclxuICAgICAgICAgIGNvbnN0IGRDaCA9IGEuY2gtYi5jaCwgZHY9YS5tL2EuZmxidCtiLm0vYi5mbGJ0LCBrYT1hLm0vYS5mbGJ0L2R2LCBrYj1iLm0vYi5mbGJ0L2R2O1xyXG4gICAgICAgICAgYS5jaD1hLmNoLWtiKmRDaDtcclxuICAgICAgICAgIGIuY2g9Yi5jaCtrYSpkQ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb2x2ZUNvbGxpc2lvbihhLCBiKSB7XHJcbiAgICBjb25zdCBtbT0oYi5tK2EubSksXHJcbiAgICAgIGF2ID0gKC1hLnYqYi5tK2EubSphLnYrMipiLm0qYi52KS9tbSxcclxuICAgICAgYnYgPSAoYi5tKmIudi1iLnYqYS5tKzIqYS5tKmEudikvbW07XHJcbiAgICByZXR1cm4gW3suLi5hLCB2OiBhdn0sIHsuLi5iLCB2OiBidn1dO1xyXG4gIH1cclxuXHJcbiAgZmluZENvbGxpc2lvbnMob3MpIHtcclxuICAgIGNvbnN0IGNpID0ge1xyXG4gICAgICBudW06IDAsXHJcbiAgICAgIGxhc3Q6IDAsXHJcbiAgICAgIGFsbDogW11cclxuICAgIH07XHJcbiAgICBmb3IobGV0IGkgPSAxOyBpPG9zLmxlbmd0aCAmJiBjaS5udW08MjsgKytpKSB7XHJcbiAgICAgIGlmKG9zW2ktMV0ubD5vc1tpXS5sIHx8IHRoaXMuaXNDb2xsaXNpb24ob3NbaS0xXSwgb3NbaV0pKSB7XHJcbiAgICAgICAgaWYob3NbaS0xXS5sPm9zW2ldLmwpIHtcclxuICAgICAgICAgICsrY2kubnVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICArK2NpLm51bTtcclxuICAgICAgICBjaS5sYXN0ID0gaTtcclxuICAgICAgICBpZihjaS5hbGwuaW5kZXhPZihpLTEpPT09LTEpIHtcclxuICAgICAgICAgIGNpLmFsbC5wdXNoKGktMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNpLmFsbC5pbmRleE9mKGkpPT09LTEpIHtcclxuICAgICAgICAgIGNpLmFsbC5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNpO1xyXG4gIH1cclxuXHJcbiAgaXNDb2xsaXNpb24oYSwgYikge1xyXG4gICAgcmV0dXJuIE1hdGguYWJzKGEubC1iLmwpPHRoaXMucC5tYXJnaW4gJiYgYS52PmIudjtcclxuICB9XHJcblxyXG4gIGludGVncmF0ZShvcywgZHQpIHtcclxuICAgIGNvbnN0IG5vcyA9IFtdO1xyXG4gICAgZm9yKGxldCBvIG9mIG9zKSB7XHJcbiAgICAgIGNvbnN0IHZsID0gTWF0aFV0aWxzLnJrNChcclxuICAgICAgICB0aGlzLmR5LmJpbmQoe1xyXG4gICAgICAgICAgZzogdGhpcy5wLmdyYXZpdHksXHJcbiAgICAgICAgICByOiB0aGlzLnAucixcclxuICAgICAgICAgIG06IG8ubSxcclxuICAgICAgICAgIGY6IG8uZixcclxuICAgICAgICAgIGNmOiBvLmNmLFxyXG4gICAgICAgICAgY2g6IG8uY2gsXHJcbiAgICAgICAgICBmbGJ0OiBvLmZsYnRcclxuICAgICAgICB9KSxcclxuICAgICAgICAwLFxyXG4gICAgICAgIGR0LFxyXG4gICAgICAgIFtvLnYsIG8ubCwgby5jaF1cclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgbm8gPSB7XHJcbiAgICAgICAgLi4ubyxcclxuICAgICAgICB2OiB2bFswXSxcclxuICAgICAgICBsOiB2bFsxXSxcclxuICAgICAgICBjaDogdmxbMl1cclxuICAgICAgfTtcclxuICAgICAgaWYobm8ubDw9MCB8fCBuby5sPj10aGlzLnAubCkge1xyXG4gICAgICAgIG5vLmw9bm8ubDw9MD8gMDogdGhpcy5wLmw7XHJcbiAgICAgICAgbm8udj0wO1xyXG4gICAgICAgIG5vLmNoPTA7XHJcbiAgICAgIH1cclxuICAgICAgbm9zLnB1c2gobm8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vcztcclxuICB9XHJcblxyXG4gIGR5KHQseSkge1xyXG4gICAgY29uc3Qgdj15WzBdLCBsPXlbMV0sIGNoPXlbMl0sIGY9dGhpcy5mKHRoaXMsbC90aGlzLnIsdixjaCksIGNmPXRoaXMuY2YodGhpcyxsL3RoaXMucix2LGNoKTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICgtdGhpcy5nKk1hdGguY29zKGwvdGhpcy5yKSp0aGlzLm0rZikvdGhpcy5tLFxyXG4gICAgICB2KzAuMDEqKE1hdGgucmFuZG9tKCktMC41KSxcclxuICAgICAgdGhpcy5mbGJ0KigoMi8oMStNYXRoLmV4cCgtMC4yKmNmKSktMSkqKDEtMi8oMStNYXRoLmV4cCgtNSooTWF0aC5hYnMoY2gpLTIpKSkpLWNoKVxyXG4gICAgXTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU2hlZXRQaHlzaWNzLmpzIiwiXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTb3VuZHNFbnZpcm9tZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IodGVtcGxhdGU9e30pIHtcclxuICAgIHRoaXMuc291bmRzID0gdGVtcGxhdGUuc291bmRzIHx8IHt9O1xyXG4gICAgdGhpcy5hdWRpbyA9IHt9O1xyXG4gICAgaWYodGhpcy5zb3VuZHMuc3RhcnRGbGlwKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8uc3RhcnRGbGlwID0gbmV3IEF1ZGlvKHRoaXMuc291bmRzLnN0YXJ0RmxpcCk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLnNvdW5kcy5lbmRGbGlwKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8uZW5kRmxpcCA9IG5ldyBBdWRpbyh0aGlzLnNvdW5kcy5lbmRGbGlwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEVuYWJsZWQoZW5hYmxlZCkge1xyXG4gICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIHRvZ2xlKCkge1xyXG4gICAgdGhpcy5lbmFibGVkID0gIXRoaXMuZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5hdWRpby5zdGFydEZsaXA7XHJcbiAgICBkZWxldGUgdGhpcy5hdWRpby5lbmRGbGlwO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRGbGlwKCkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkICYmIHRoaXMuYXVkaW8uc3RhcnRGbGlwKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8uc3RhcnRGbGlwLnBsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZEZsaXAoKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQgJiYgdGhpcy5hdWRpby5zdGFydEZsaXApIHtcclxuICAgICAgdGhpcy5hdWRpby5zdGFydEZsaXAucGF1c2UoKTtcclxuICAgICAgdGhpcy5hdWRpby5zdGFydEZsaXAuY3VycmVudFRpbWUgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5lbmFibGVkICYmIHRoaXMuYXVkaW8uZW5kRmxpcCkge1xyXG4gICAgICB0aGlzLmF1ZGlvLmVuZEZsaXAucGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlRmxpcHMoZW1pdHRlcikge1xyXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKCdzdGFydEZsaXAnLCB0aGlzLnN0YXJ0RmxpcC5iaW5kKHRoaXMpKTtcclxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcignZW5kRmxpcCcsIHRoaXMuZW5kRmxpcC5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU291bmRzRW52aXJvbWVudC5qcyIsImltcG9ydCBXaWRnZXRDb250cm9sbGVyIGZyb20gJ1dpZGdldENvbnRyb2xsZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9jQ29udHJvbGxlciBleHRlbmRzIFdpZGdldENvbnRyb2xsZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3LCBib29rQ3RybCkge1xyXG4gICAgc3VwZXIodmlldyk7XHJcbiAgICB0aGlzLmJvb2tDdHJsID0gYm9va0N0cmw7XHJcbiAgICB0aGlzLnRhYiA9ICdub25lJztcclxuICB9XHJcblxyXG4gIHNldFRodW1ibmFpbHModGh1bWJuYWlscykge1xyXG4gICAgdGhpcy50aHVtYm5haWxzID0gdGh1bWJuYWlscztcclxuICAgIHRodW1ibmFpbHMub25OYXZpZ2F0ZSA9IHRoaXMubmF2aWdhdGVUaHVtYm5haWxzLmJpbmQodGhpcyk7XHJcbiAgICBpZih0aGlzLnRhYiA9PT0gJ25vbmUnKSB7XHJcbiAgICAgIHRoaXMudGFiID0gJ3RodW1ibmFpbHMnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRTZWFyY2goc2VhcmNoKSB7X
13345HJcbiAgICB0aGlzLnNlYXJjaCA9IHNlYXJjaDtcclxuICAgIHNlYXJjaC5vbk5hdmlnYXRlID0gdGhpcy5uYXZpZ2F0ZVNlYXJjaC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRCb29rbWFya3MoYm9va21hcmtzLCBwZGYpIHtcclxuICAgIHRoaXMuYm9va21hcmtzID0gYm9va21hcmtzO1xyXG4gICAgdGhpcy5wZGYgPSBwZGY7XHJcbiAgICBib29rbWFya3Mub25OYXZpZ2F0ZSA9IHRoaXMubmF2aWdhdGVCb29rbWFya3MuYmluZCh0aGlzKTtcclxuICAgIGlmKGJvb2ttYXJrcy5nZXRTaXplKCkpIHtcclxuICAgICAgdGhpcy50YWIgPSAnYm9va21hcmtzJztcclxuICAgICAgdGhpcy5pc0Jvb2ttYXJrcyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGNtZEJvb2ttYXJrcygpIHtcclxuICAgIHRoaXMudGFiID0gJ2Jvb2ttYXJrcyc7XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGNtZFRodW1ibmFpbHMoKSB7XHJcbiAgICB0aGlzLnRhYiA9ICd0aHVtYm5haWxzJztcclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgY21kU2VhcmNoKCkge1xyXG4gICAgdGhpcy50YWIgPSAnc2VhcmNoJztcclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgY21kQ2xvc2VUb2MoKSB7XHJcbiAgICB0aGlzLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlVGh1bWJuYWlscyhudW1iZXIpIHtcclxuICAgIHRoaXMuYm9va0N0cmwuZ29Ub1BhZ2UobnVtYmVyKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlU2VhcmNoKG51bWJlcikge1xyXG4gICAgdGhpcy5ib29rQ3RybC5nb1RvUGFnZShudW1iZXIpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVCb29rbWFya3MoaXRlbSkge1xyXG4gICAgaWYoaXRlbS51cmwpIHtcclxuICAgICAgd2luZG93Lm9wZW4oaXRlbS51cmwsICdfYmxhbmsnKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoaXRlbS5kZXN0KSB7XHJcbiAgICAgIGxldCBkZXN0UHJvbWlzZTtcclxuICAgICAgaWYodHlwZW9mIGl0ZW0uZGVzdD09PSdzdHJpbmcnKSB7XHJcbiAgICAgICAgZGVzdFByb21pc2UgPSB0aGlzLnBkZi5oYW5kbGVyLmdldERlc3RpbmF0aW9uKGl0ZW0uZGVzdCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZGVzdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoaXRlbS5kZXN0KTtcclxuICAgICAgfVxyXG4gICAgICBkZXN0UHJvbWlzZS5cclxuICAgICAgICB0aGVuKChkZXN0KT0+IHRoaXMucGRmLmhhbmRsZXIuZ2V0UGFnZUluZGV4KGRlc3RbMF0pKS5cclxuICAgICAgICB0aGVuKChudW1iZXIpPT4gdGhpcy5ib29rQ3RybC5nb1RvUGFnZShudW1iZXIpKS5cclxuICAgICAgICBjYXRjaCgoKT0+IGNvbnNvbGUuZXJyb3IoJ0JhZCBib29rbWFyaycpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBpZih0aGlzLnZpZXcpIHtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd3aWRUb2NNZW51Jywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkVGh1bWJuYWlscycsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy50YWI9PT0ndGh1bWJuYWlscycsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd3aWRTZWFyY2gnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMudGFiPT09J3NlYXJjaCcsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd3aWRCb29rbWFya3MnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMudGFiPT09J2Jvb2ttYXJrcycsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCdjbWRCb29rbWFya3MnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnRhYj09PSdib29rbWFya3MnXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ2NtZENsb3NlVG9jJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnY21kVGh1bWJuYWlscycsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IHRoaXMudGFiPT09J3RodW1ibmFpbHMnXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ2NtZFNlYXJjaCcsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IHRoaXMudGFiPT09J3NlYXJjaCdcclxuICAgICAgfSk7XHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB0aGlzLnRodW1ibmFpbHMuc2V0RW5hYmxlKHRoaXMudmlzaWJsZSAmJiB0aGlzLnRhYj09PSd0aHVtYm5haWxzJykpO1xyXG4gICAgICBzdXBlci51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1RvY0NvbnRyb2xsZXIuanMiLCJpbXBvcnQge1RIUkVFfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IFRocmVlVXRpbHMgZnJvbSAnVGhyZWVVdGlscyc7XHJcblxyXG5jb25zdCByZXNYID0gMTEsXHJcbiAgICAgIHJlc1kgPSAyLFxyXG4gICAgICByZXNaID0gMTUsXHJcbiAgICAgIHNjYWxlID0gMSxcclxuICAgICAgZmFjZXMgPSBbXTtcclxuXHJcbmNvbnN0IGZyb250R2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShzY2FsZSwgc2NhbGUsIHJlc1gtMSwgcmVzWS0xKTtcclxuZnJvbnRHZW9tZXRyeS50cmFuc2xhdGUoMC41KnNjYWxlLDAuNSpzY2FsZSxzY2FsZSk7XHJcbmNvbnN0IGJhY2tHZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KHNjYWxlLCBzY2FsZSwgcmVzWC0xLCByZXNZLTEpO1xyXG5iYWNrR2VvbWV0cnkucm90YXRlWShNYXRoLlBJKTtcclxuYmFja0dlb21ldHJ5LnRyYW5zbGF0ZSgwLjUqc2NhbGUsMC41KnNjYWxlLDApO1xyXG5jb25zdCBsZWZ0R2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShzY2FsZSwgc2NhbGUsIHJlc1otMSwgcmVzWS0xKTtcclxubGVmdEdlb21ldHJ5LnJvdGF0ZVkoLU1hdGguUEkvMik7XHJcbmxlZnRHZW9tZXRyeS50cmFuc2xhdGUoMCwwLjUqc2NhbGUsMC41KnNjYWxlKTtcclxuY29uc3QgcmlnaHRHZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KHNjYWxlLCBzY2FsZSwgcmVzWi0xLCByZXNZLTEpO1xyXG5yaWdodEdlb21ldHJ5LnJvdGF0ZVkoTWF0aC5QSS8yKTtcclxucmlnaHRHZW9tZXRyeS50cmFuc2xhdGUoc2NhbGUsMC41KnNjYWxlLDAuNSpzY2FsZSk7XHJcbmNvbnN0IHRvcEdlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoc2NhbGUsIHNjYWxlLCByZXNYLTEsIHJlc1otMSk7XHJcbnRvcEdlb21ldHJ5LnJvdGF0ZVgoLU1hdGguUEkvMik7XHJcbnRvcEdlb21ldHJ5LnRyYW5zbGF0ZSgwLjUqc2NhbGUsc2NhbGUsMC41KnNjYWxlKTtcclxuY29uc3QgYm90dG9tR2VvbWV0cnkgPSB0b3BHZW9tZXRyeS5jbG9uZSgpO1xyXG5ib3R0b21HZW9tZXRyeS50cmFuc2xhdGUoMCwtc2NhbGUsMCk7XHJcbmZvcihsZXQgZiBvZiBib3R0b21HZW9tZXRyeS5mYWNlcykge1xyXG4gIFtmLmEsIGYuYl0gPSBbZi5iLCBmLmFdO1xyXG59XHJcblxyXG5jb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpO1xyXG5nZW9tZXRyeS52ZXJ0aWNlcyA9IFsuLi5ib3R0b21HZW9tZXRyeS52ZXJ0aWNlcywgLi4udG9wR2VvbWV0cnkudmVydGljZXNdO1xyXG5cclxuY29uc3QgYWRkRmFjZXMgPSAoZnMsIG1hcCk9PiB7XHJcbiAgZm9yKGxldCBmIG9mIGZzKSB7XHJcbiAgICBnZW9tZXRyeS5mYWNlcy5wdXNoKG5ldyBUSFJFRS5GYWNlMyhtYXAoZi5hKSwgbWFwKGYuYiksIG1hcChmLmMpKSk7XHJcbiAgfVxyXG4gIGZhY2VzLnB1c2goZ2VvbWV0cnkuZmFjZXMubGVuZ3RoKTtcclxufTtcclxuXHJcbmNvbnN0IG1hcFZlcnRpY2VzID0gKHNyYywgZHN0KT0+IHtcclxuICBjb25zdCBtYXAgPSBbXTtcclxuICBjb25zdCBlcSA9IChhLCBiKT0+IE1hdGguYWJzKGEueC1iLngpK01hdGguYWJzKGEueS1iLnkpK01hdGguYWJzKGEuei1iLnopPDFlLTQ7XHJcbiAgZm9yKGxldCBpPTA7IGk8c3JjLmxlbmd0aDsgKytpKSB7XHJcbiAgICBmb3IobGV0IGo9MDsgajxkc3QubGVuZ3RoOyArK2opIHtcclxuICAgICAgaWYoZXEoc3JjW2ldLCBkc3Rbal0pKSB7XHJcbiAgICAgICAgbWFwW2ldPWo7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG1hcDtcclxufTtcclxuXHJcbmNvbnN0IGZyb250TWFwID0gbWFwVmVydGljZXMoZnJvbnRHZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkudmVydGljZXMpO1xyXG5jb25zdCBiYWNrTWFwID0gbWFwVmVydGljZXMoYmFja0dlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS52ZXJ0aWNlcyk7XHJcbmNvbnN0IGxlZnRNYXAgPSBtYXBWZXJ0aWNlcyhsZWZ0R2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LnZlcnRpY2VzKTtcclxuY29uc3QgcmlnaHRNYXAgPSBtYXBWZXJ0aWNlcyhyaWdodEdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS52ZXJ0aWNlcyk7XHJcblxyXG5hZGRGYWNlcyh0b3BHZW9tZXRyeS5mYWNlcywgKGkpPT4gaStib3R0b21HZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGgpO1xyXG5hZGRGYWNlcyhib3R0b21HZW9tZXRyeS5mYWNlcywgKGkpPT4gaSk7XHJcbmFkZEZhY2VzKGZyb250R2VvbWV0cnkuZmFjZXMsIChpKT0+IGZyb250TWFwW2ldKTtcclxuYWRkRmFjZXMoYmFja0dlb21ldHJ5LmZhY2VzLCAoaSk9PiBiYWNrTWFwW2ldKTtcclxuYWRkRmFjZXMobGVmdEdlb21ldHJ5LmZhY2VzLCAoaSk9PiBsZWZ0TWFwW2ldKTtcclxuYWRkRmFjZXMocmlnaHRHZW9tZXRyeS5mYWNlcywgKGkpPT4gcmlnaHRNYXBbaV0pO1xyXG5mYWNlcy5wb3AoKTtcclxuXHJcblRocmVlVXRpbHMuY29tcHV0ZUZhY2VWZXJ0ZXhVdnMoZ2VvbWV0cnksIGZhY2VzKTtcclxuXHJcbmdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcbi8vZ2VvbWV0cnkuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XHJcbmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaG
13345VyZSgpO1xyXG4vL2dlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG5nZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSB0cnVlO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG5cdHJlc1gsXHJcblx0cmVzWSxcclxuXHRyZXNaLFxyXG5cdGZhY2VzLFxyXG5cdGdlb21ldHJ5XHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL21vZGVscy9zaGVldEJsb2NrLmpzIiwiY29uc3QgbW91c2VCdXR0b25zID0ge1xyXG4gIExlZnQ6IDAsXHJcbiAgTWlkZGxlOiAxLFxyXG4gIFJpZ2h0OiAyXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvcHMoKSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGVwczogMWUtNCxcclxuICAgIHNraW46IHtcclxuICAgICAgZGVmYXVsdDogJ3Nob3J0LXdoaXRlLWJvb2stdmlldycsXHJcbiAgICB9LFxyXG4gICAgc2NhbGU6IHtcclxuICAgICAgZGVmYXVsdDogMC45LFxyXG4gICAgICBtaW46IDAuOSxcclxuICAgICAgbWF4OiAyLjUsXHJcbiAgICAgIGxldmVsczogN1xyXG4gICAgfSxcclxuICAgIGxpZ2h0aW5nOiB7XHJcbiAgICAgIGRlZmF1bHQ6IDAuNyxcclxuICAgICAgbWluOiAwLFxyXG4gICAgICBtYXg6IDEsXHJcbiAgICAgIGxldmVsczogN1xyXG4gICAgfSxcclxuICAgIHBhbjoge1xyXG4gICAgICBzcGVlZDogNTBcclxuICAgIH0sXHJcbiAgICBsb2FkaW5nQW5pbWF0aW9uOiB7XHJcbiAgICAgIHNraW46IGZhbHNlLFxyXG4gICAgICBib29rOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgYXV0b1Jlc29sdXRpb246IHtcclxuICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29lZmZpY2llbnQ6IDEuNVxyXG4gICAgfSxcclxuICAgIG5hcnJvd1ZpZXc6IHtcclxuICAgICAgd2lkdGg6IDUwMFxyXG4gICAgfSxcclxuICAgIGFjdGlvbnM6IHtcclxuICAgICAgY21kWm9vbUluOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kWm9vbU91dDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlZEluTmFycm93OiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZERlZmF1bHRab29tOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IGZhbHNlLFxyXG4gICAgICAgIHR5cGU6ICdkYmxjbGljaycsXHJcbiAgICAgICAgY29kZTogMFxyXG4gICAgICB9LFxyXG4gICAgICBjbWRUb2M6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRGYXN0QmFja3dhcmQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZEJhY2t3YXJkOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZEJpZ0JhY2t3YXJkOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRm9yd2FyZDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlZEluTmFycm93OiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRCaWdGb3J3YXJkOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRmFzdEZvcndhcmQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFNhdmU6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQcmludDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlZEluTmFycm93OiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRGdWxsU2NyZWVuOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVkSW5OYXJyb3c6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgd2lkU2V0dGluZ3M6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTbWFydFBhbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlZEluTmFycm93OiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAgY21kU2luZ2xlUGFnZToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlZEluTmFycm93OiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgYWN0aXZlRm9yTW9iaWxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTb3VuZHM6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kU3RhdHM6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZExpZ2h0aW5nVXA6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRMaWdodGluZ0Rvd246IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZWRJbk5hcnJvdzogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5MZWZ0OiB7XHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgY21kUGFuUmlnaHQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5VcDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhbkRvd246IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZFJvdGF0ZToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ21vdXNlZHJhZycsXHJcbiAgICAgICAgY29
13345kZTogbW91c2VCdXR0b25zLlJpZ2h0XHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kRHJhZ1pvb206IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICdtb3VzZWRyYWcnLFxyXG4gICAgICAgIGNvZGU6IG1vdXNlQnV0dG9ucy5NaWRkbGVcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWRQYW46IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICdtb3VzZWRyYWcnLFxyXG4gICAgICAgIGNvZGU6IG1vdXNlQnV0dG9ucy5MZWZ0XHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kV2hlZWxab29tOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnbW91c2V3aGVlbCcsXHJcbiAgICAgICAgY29kZTogMFxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFJvdGF0ZToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ3RvdWNoZHJhZycsXHJcbiAgICAgICAgY29kZTogM1xyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFpvb206IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICd0b3VjaGRyYWcnLFxyXG4gICAgICAgIGNvZGU6IDJcclxuICAgICAgfSxcclxuICAgICAgdG91Y2hDbWRQYW46IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICd0b3VjaGRyYWcnLFxyXG4gICAgICAgIGNvZGU6IDFcclxuICAgICAgfSxcclxuICAgICAgdG91Y2hDbWRTd2lwZToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ3RvdWNoZHJhZycsXHJcbiAgICAgICAgY29kZTogMVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvcHJvcHMvYm9va0NvbnRyb2xsZXIuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgSW1hZ2VCYXNlIGZyb20gJy4vSW1hZ2VCYXNlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJsYW5rSW1hZ2UgZXh0ZW5kcyBJbWFnZUJhc2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcikge1xyXG4gICAgc3VwZXIoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpO1xyXG5cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLlxyXG4gICAgICB0aGVuKCgpPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhcnRSZW5kZXIgPSAoKT0+IHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyQmxhbmtQYWdlKCk7XHJcbiAgICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9CbGFua0ltYWdlLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2ttYXJrcyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgaXRlbXMsIGdldFRpdGxlPShpKT0+IGkudGl0bGUsIGdldEl0ZW1zPShpKT0+aS5pdGVtcykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICB0aGlzLm1hcCA9IFtdO1xyXG4gICAgdGhpcy5nZXRUaXRsZSA9IGdldFRpdGxlO1xyXG4gICAgdGhpcy5nZXRJdGVtcyA9IGdldEl0ZW1zO1xyXG4gICAgdGhpcy5ub2RlcyA9IHRoaXMubWFwTm9kZXMoaXRlbXMsIHRoaXMubWFwKTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICB0b2dsZTogKGUpPT4ge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBsZXQgbGkgPSAkKGUudGFyZ2V0KTtcclxuICAgICAgICB3aGlsZShsaVswXSAmJiBsaVswXSE9PWNvbnRhaW5lclswXSAmJiAhbGkuaGFzQ2xhc3MoJ2l0ZW0nKSkge1xyXG4gICAgICAgICAgbGkgPSAkKGxpWzBdLnBhcmVudE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihsaS5oYXNDbGFzcygnaXRlbScpKSB7XHJcbiAgICAgICAgICBsZXQgY21kID0gJChlLnRhcmdldCk7XHJcbiAgICAgICAgICB3aGlsZShjbWRbMF0gJiYgY21kWzBdIT09bGlbMF0gJiYgIWNtZC5oYXNDbGFzcygnY21kJykpIHtcclxuICAgICAgICAgICAgY21kID0gJChjbWRbMF0ucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihjbWQuaGFzQ2xhc3MoJ2NtZCcpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm1hcFtsaS5hdHRyKCdkYXRhLWlkJyldO1xyXG4gICAgICAgICAgICBpZihjbWQuaGFzQ2xhc3MoJ3RvZ2xlJykpIHtcclxuICAgICAgICAgICAgICBub2RlLm1pbmltaXplZCA9ICFub2RlLm1pbmltaXplZDtcclxuICAgICAgICAgICAgICBpZihub2RlLm1pbmltaXplZCkge1xyXG4gICAgICAgICAgICAgICAgbGkuZmluZCgndWwnKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGxpLmZpbmQoJy50b2dsZScpLmFkZENsYXNzKCdtaW5pbWl6ZWQnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsaS5maW5kKCcudG9nbGUnKS5yZW1vdmVDbGFzcygnbWluaW1pemVkJyk7XHJcbiAgICAgICAgICAgICAgICBsaS5hcHBlbmQoKHRoaXMucmVuZGVyTm9kZShub2RlKS5tYXRjaCgvPHVsLio8XFwvdWw+LykgfHwgWycnXSlbMF0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZih0aGlzLm9uTmF2aWdhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25OYXZpZ2F0ZShub2RlLml0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnRhaW5lci5vbignY2xpY2snLCB0aGlzLmJpbmRzLnRvZ2xlKTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWFwLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lci5vZmYoJ2NsaWNrJywgdGhpcy5iaW5kcy50b2dsZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lci5odG1sKCcnKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIHRoaXMuY29udGFpbmVyLmh0bWwodGhpcy5yZW5kZXJOb2Rlcyh0aGlzLm5vZGVzKSk7XHJcbiAgfVxyXG5cclxuICBmb3JFYWNoKGYsIG5vZGVzPXRoaXMubm9kZXMpIHtcclxuICAgIGZvcihsZXQgbm9kZSBvZiAobm9kZXMgfHwgW10pKSB7X
13345HJcbiAgICAgIGYobm9kZSk7XHJcbiAgICAgIHRoaXMuZm9yRWFjaChmLCBub2RlLmNoaWxkcmVuKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cGFuZCgpIHtcclxuICAgIHRoaXMuZm9yRWFjaCgobik9PiBuLm1pbmltaXplZCA9IGZhbHNlKTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBtaW5pbWl6ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaCgobik9PiBuLm1pbmltaXplZCA9IHRydWUpO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIHJlbmRlck5vZGUobm9kZSkge1xyXG4gICAgcmV0dXJuIFsnPGRpdiBjbGFzcz1cImFyZWFcIj4nLFxyXG4gICAgICBub2RlLmNoaWxkcmVuPyAnPGEgaHJlZj1cIiNcIiBjbGFzcz1cImNtZCB0b2dsZScgKyAobm9kZS5taW5pbWl6ZWQ/ICcgbWluaW1pemVkJzogJycpICsgJ1wiPjxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+PC9hPiAnOiAnPGkgY2xhc3M9XCJ3aGl0ZS1zcGFjZVwiPjwvaT4gJyxcclxuICAgICAgJzxhIGNsYXNzPVwiY21kXCIgdGl0bGU9XCInLCBub2RlLnRpdGxlLCdcIiBocmVmPVwiI1wiPicsIG5vZGUudGl0bGUsICc8L2E+PC9kaXY+JyxcclxuICAgICAgbm9kZS5taW5pbWl6ZWQ/ICcnOiB0aGlzLnJlbmRlck5vZGVzKG5vZGUuY2hpbGRyZW4pXHJcbiAgICBdLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm9kZXMobm9kZXMpIHtcclxuICAgIGxldCByZXMgPSBbJzxkaXYgY2xhc3M9XCJib29rbWFya3NcIj4nXTtcclxuICAgIGlmKG5vZGVzICYmIG5vZGVzLmxlbmd0aCkge1xyXG4gICAgICByZXMucHVzaCgnPHVsIGNsYXNzPVwibGV2ZWwtJywgbm9kZXNbMF0ubGV2ZWwsICdcIj4nKTtcclxuICAgICAgZm9yKGxldCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgICAgcmVzLnB1c2goW1xyXG4gICAgICAgICAgJzxsaSBjbGFzcz1cIml0ZW1cIiBkYXRhLWlkPVwiJywgbm9kZS5pZCwnXCI+JyxcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJOb2RlKG5vZGUpLFxyXG4gICAgICAgICAgJzwvbGk+J10uam9pbignJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlcy5wdXNoKCc8L3VsPicpO1xyXG4gICAgfVxyXG4gICAgcmVzLnB1c2goJzwvZGl2PicpO1xyXG4gICAgcmV0dXJuIHJlcy5qb2luKCcnKTtcclxuICB9XHJcblxyXG4gIG1hcE5vZGVzKGl0ZW1zLCBtYXA9W10sIGxldmVsPTApIHtcclxuICAgIGxldCBub2RlcyA9IG51bGw7XHJcbiAgICBpZihpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgbm9kZXM9W107XHJcbiAgICAgIGZvcihsZXQgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICAgIGNvbnN0IGlkID0gbWFwLmxlbmd0aDtcclxuICAgICAgICBtYXAucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmdldFRpdGxlKGl0ZW0pLFxyXG4gICAgICAgICAgbGV2ZWwsXHJcbiAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgbWluaW1pemVkOiB0cnVlLFxyXG4gICAgICAgICAgY2hpbGRyZW46IHRoaXMubWFwTm9kZXModGhpcy5nZXRJdGVtcyhpdGVtKSwgbWFwLCBsZXZlbCsxKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgICAgICBtYXBbaWRdID0gbm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGVzO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvQm9va21hcmtzLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldGVjdG9yIHtcclxuXHJcblx0c3RhdGljIGNhbnZhcyA9ICEhIHdpbmRvdy5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XHJcblxyXG5cdHN0YXRpYyB3ZWJnbCA9IChmdW5jdGlvbigpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG5cdFx0XHRyZXR1cm4gISEgKHdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgJiYgKGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKSkpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2ggKGUpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH0pKCk7XHJcblxyXG5cdHN0YXRpYyB3b3JrZXJzID0gISEgd2luZG93LldvcmtlcjtcclxuXHJcblx0c3RhdGljIGZpbGVhcGkgPSB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2I7XHJcblxyXG5cdHN0YXRpYyBnZXRXZWJHTEVycm9yTWVzc2FnZSgpIHtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGVsZW1lbnQuaWQgPSAnd2ViZ2wtZXJyb3ItbWVzc2FnZSc7XHJcblx0XHRlbGVtZW50LnN0eWxlLmZvbnRGYW1pbHkgPSAnbW9ub3NwYWNlJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMTNweCc7XHJcblx0XHRlbGVtZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAnbm9ybWFsJztcclxuXHRcdGVsZW1lbnQuc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcblx0XHRlbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZic7XHJcblx0XHRlbGVtZW50LnN0eWxlLmNvbG9yID0gJyMwMDAnO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzEuNWVtJztcclxuXHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSAnNDAwcHgnO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnNWVtIGF1dG8gMCc7XHJcblxyXG5cdFx0aWYgKCFEZXRlY3Rvci53ZWJnbCkge1xyXG5cdFx0XHRlbGVtZW50LmlubmVySFRNTCA9IHdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgPyBbXHJcblx0XHRcdFx0J1lvdXIgZ3JhcGhpY3MgY2FyZCBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgPGEgaHJlZj1cImh0dHA6Ly9raHJvbm9zLm9yZy93ZWJnbC93aWtpL0dldHRpbmdfYV9XZWJHTF9JbXBsZW1lbnRhdGlvblwiIHN0eWxlPVwiY29sb3I6IzAwMFwiPldlYkdMPC9hPi48YnIgLz4nLFxyXG5cdFx0XHRcdCdGaW5kIG9
133451dCBob3cgdG8gZ2V0IGl0IDxhIGhyZWY9XCJodHRwOi8vZ2V0LndlYmdsLm9yZy9cIiBzdHlsZT1cImNvbG9yOiMwMDBcIj5oZXJlPC9hPi4nXHJcblx0XHRcdF0uam9pbignXFxuJykgOiBbXHJcblx0XHRcdFx0J1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgPGEgaHJlZj1cImh0dHA6Ly9raHJvbm9zLm9yZy93ZWJnbC93aWtpL0dldHRpbmdfYV9XZWJHTF9JbXBsZW1lbnRhdGlvblwiIHN0eWxlPVwiY29sb3I6IzAwMFwiPldlYkdMPC9hPi48YnIvPicsXHJcblx0XHRcdFx0J0ZpbmQgb3V0IGhvdyB0byBnZXQgaXQgPGEgaHJlZj1cImh0dHA6Ly9nZXQud2ViZ2wub3JnL1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPmhlcmU8L2E+LidcclxuXHRcdFx0XS5qb2luKCdcXG4nKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBlbGVtZW50O1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZEdldFdlYkdMTWVzc2FnZShwYXJhbWV0ZXJzKSB7XHJcblx0XHRsZXQgcGFyZW50LCBpZCwgZWxlbWVudDtcclxuXHRcdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xyXG5cclxuXHRcdHBhcmVudCA9IHBhcmFtZXRlcnMucGFyZW50IHx8ICQoZG9jdW1lbnQuYm9keSk7XHJcblx0XHRpZCA9IHBhcmFtZXRlcnMuaWQgfHwgJ29sZGllJztcclxuXHJcblx0XHRlbGVtZW50ID0gRGV0ZWN0b3IuZ2V0V2ViR0xFcnJvck1lc3NhZ2UoKTtcclxuXHRcdC8vZWxlbWVudC5pZCA9IGlkO1xyXG5cclxuXHRcdHBhcmVudC5hcHBlbmQoZWxlbWVudCk7XHJcblx0fVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9EZXRlY3Rvci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvY01vdXNlU2ltdWxhdG9yIHtcclxuXHJcbiAgc3RhdGljIEhPVkVSID0gJ1NJTVVMQVRFRC1IT1ZFUic7XHJcbiAgc3RhdGljIEFDVElWRSA9ICdTSU1VTEFURUQtQUNUSVZFJztcclxuXHJcbiAgY29uc3RydWN0b3IoakZyYW1lLCBlbGVtZW50LCBiRWxlbWVudD1kb2N1bWVudC5ib2R5KSB7XHJcbiAgICB0aGlzLmpGcmFtZSA9IGpGcmFtZTtcclxuICAgIHRoaXMud25kID0gakZyYW1lWzBdLmNvbnRlbnRXaW5kb3c7XHJcbiAgICB0aGlzLmRvYyA9IGpGcmFtZVswXS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50IHx8IGRvYy5ib2R5O1xyXG4gICAgdGhpcy5iRWxlbWVudCA9IGJFbGVtZW50O1xyXG4gICAgdGhpcy5yZXNlbmRQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWZhdWx0UmVzZW5kUHJvcGVydGllcygpO1xyXG4gICAgdGhpcy51bmRlZmluZWRQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWZhdWx0VW5kZWZpbmVkUHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5jdXJzb3JzID0gW107XHJcbiAgICB0aGlzLm9uRG9jQ2hhbmdlQ2xicyA9IFtdO1xyXG4gICAgY29uc3QgdGVybXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluZDogJzpob3ZlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlOiAnLicrRG9jTW91c2VTaW11bGF0b3IuSE9WRVJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmQ6ICc6YWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6ICcuJytEb2NNb3VzZVNpbXVsYXRvci5BQ1RJVkVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF07XHJcbiAgICBsZXQgc3R5bGUgPSBbJzxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4nXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgbGV0IHNzID0gdGhpcy5kb2Muc3R5bGVTaGVldHNbaV07XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3MuY3NzUnVsZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBsZXQgciA9IHNzLmNzc1J1bGVzW2pdLCBjc3NUZXh0O1xyXG4gICAgICAgIGZvcihsZXQgdGVybSBvZiB0ZXJtcykge1xyXG4gICAgICAgICAgaWYgKH5yLnNlbGVjdG9yVGV4dC5pbmRleE9mKHRlcm0uZmluZCkpIHtcclxuICAgICAgICAgICAgY3NzVGV4dCA9IChjc3NUZXh0IHx8IHIuY3NzVGV4dCkucmVwbGFjZShuZXcgUmVnRXhwKHRlcm0uZmluZCwgJ2cnKSwgdGVybS5yZXBsYWNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY3NzVGV4dCkge1xyXG4gICAgICAgICAgc3R5bGUucHVzaChjc3NUZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHN0eWxlLnB1c2goJzwvc3R5bGU+Jyk7XHJcbiAgICAkKHRoaXMuZG9jLmhlYWQpLmFwcGVuZCgkKHN0eWxlLmpvaW4oJycpKSk7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0Q29vcmRzKHgsIHkpIHtcclxuICAgIGNvbnN0IGpFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgY29uc3Qgb2Zmc2V0ID0gakVsZW1lbnQub2Zmc2V0KCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBvZmZzZXQubGVmdCtqRWxlbWVudC53aWR0aCgpKngsXHJcbiAgICAgIHk6IG9mZnNldC50b3ArakVsZW1lbnQuaGVpZ2h0KCkqKDEteSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgZSwgcCwgdHlwZSwgYWR2YW5jZWRQcm9wcykge1xyXG4gICAgY29uc3QgcHJvcHMgPSB7fTtcclxuICAgIGZvcihsZXQgbiBvZiB0aGlzLnJlc2VuZFByb3BlcnRpZXMpIHtcclxuICAgICAgcHJvcHNbbl0gPSBlW25dO1xyXG4gICAgfVxyXG4gICAgZm9yKGxldCBuIG9mIHRoaXMudW5kZWZpbmVkUHJvcGVydGllcykge1xyXG4gICAgICBwcm9wc1tuXSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGZvcihsZXQgbiBpbiBhZHZhbmNlZFByb3BzKSB7XHJcbiAgICAgIGlmKGFkdmFuY2VkUHJvcHMuaGFzT3duUHJvcGVydHkobikpIHtcclxuICAgICAgICBwcm9wc1tuXSA9IGFkdmFuY2VkUHJvcHNbbl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3BzLnZpZXcgPSB0aGlzLnduZDtcclxuICAgIHByb3BzLnBhZ2VYID0gcC54O1xyXG4gICAgcHJvcHMucGFnZVkgPSBwLnk7XHJcbiAgICBjb25zdCBqRSA9ICQuRXZlbnQodHlwZSwgcHJvcHMpO1xyXG4gICAgakUudGltZVN0YW1wID0gZS50aW1lU3RhbXA7XHJcbiAgICAkKGVsZW1lbnQpLnRyaWdnZXIoakUpO1xyXG4gIH1cclxuXHJcbiAgYWRkQ2xhc3MoZWxlbWVudCwgbmFtZSkge1xyXG4gICAgJChlbGVtZW50KS5hZGRDbGFzcyhuYW1lKTtcclxuICAgIGNvbnN0IHN0eWxlID0gdGhpcy53bmQuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuICAgIHRoaXMuY3Vyc29ycy5wdXNoKCQodGhpcy5iRWxlbWVudCkuY3NzKCdjdXJzb3InKSk7XHJcbiAgICAkKHRoaXMuYkVsZW1lbnQpLmNzcygnY3
13345Vyc29yJywgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnY3Vyc29yJykpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgbmFtZSkge1xyXG4gICAgJChlbGVtZW50KS5yZW1vdmVDbGFzcyhuYW1lKTtcclxuICAgICQodGhpcy5iRWxlbWVudCkuY3NzKCdjdXJzb3InLCB0aGlzLmN1cnNvcnMucG9wKCkpO1xyXG4gIH1cclxuXHJcbiAgZW50ZXJFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgIHRoaXMuYWRkQ2xhc3MoZWxlbWVudCwgRG9jTW91c2VTaW11bGF0b3IuSE9WRVIpO1xyXG4gIH1cclxuXHJcbiAgbGVhdmVFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoZWxlbWVudCwgRG9jTW91c2VTaW11bGF0b3IuSE9WRVIpO1xyXG4gIH1cclxuXHJcbiAgYWN0aXZhdGVFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgIHRoaXMuYWRkQ2xhc3MoZWxlbWVudCwgRG9jTW91c2VTaW11bGF0b3IuQUNUSVZFKTtcclxuICB9XHJcblxyXG4gIGRlYWN0aXZhdGVFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoZWxlbWVudCwgRG9jTW91c2VTaW11bGF0b3IuQUNUSVZFKTtcclxuICB9XHJcblxyXG4gIGFkZERvY0NoYW5nZUNsYihjbGIpIHtcclxuICAgIHRoaXMub25Eb2NDaGFuZ2VDbGJzLnB1c2goY2xiKTtcclxuICB9XHJcblxyXG4gIG5vdGlmeSgpIHtcclxuICAgIGZvcihsZXQgY2xiIG9mIHRoaXMub25Eb2NDaGFuZ2VDbGJzKSB7XHJcbiAgICAgIGNsYih0aGlzLnduZCwgdGhpcy5kb2MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZWxlbWVudEZyb21Qb2ludChwKSB7XHJcbiAgICBsZXQgbm9kZSA9IHRoaXMuZG9jLmJvZHksIG5leHQgPSB0cnVlO1xyXG4gICAgd2hpbGUobmV4dCkge1xyXG4gICAgICBuZXh0ID0gZmFsc2U7XHJcbiAgICAgIGZvcihsZXQgaT0wOyBpPG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW2ldO1xyXG4gICAgICAgIGlmKGNoaWxkIGluc3RhbmNlb2YgdGhpcy53bmQuRWxlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgakMgPSAkKGNoaWxkKSwgb2Zmc2V0ID0gakMub2Zmc2V0KCksIGhlaWdodCA9IGpDLmhlaWdodCgpLCB3aWR0aCA9IGpDLndpZHRoKCk7XHJcbiAgICAgICAgICBpZihwLng+b2Zmc2V0LmxlZnQgJiYgcC54PG9mZnNldC5sZWZ0K3dpZHRoICYmIHAueT5vZmZzZXQudG9wICYmIHAueTxvZmZzZXQudG9wK2hlaWdodCkge1xyXG4gICAgICAgICAgICBub2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgIG5leHQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBub2RlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RWxlbWVudChwKSB7XHJcbiAgICBjb25zdCBvZmYwID0gdGhpcy5qRnJhbWUub2Zmc2V0KCk7XHJcbiAgICB0aGlzLmpGcmFtZS5vZmZzZXQoe2xlZnQ6IDAuNSp3aW5kb3cuaW5uZXJXaWR0aC1wLngsIHRvcDogMC41KndpbmRvdy5pbm5lckhlaWdodC1wLnl9KTtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5kb2MuZWxlbWVudEZyb21Qb2ludChwLngsIHAueSk7XHJcbiAgICBpZighZWxlbWVudCkgeyAvLyBpdCBpc24ndCBhIGpva2UgaXQncyBJRVxyXG4gICAgICBlbGVtZW50ID0gdGhpcy5kb2MuZWxlbWVudEZyb21Qb2ludChwLngsIHAueSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmpGcmFtZS5vZmZzZXQob2ZmMCk7XHJcbiAgICByZXR1cm4gZWxlbWVudD8gZWxlbWVudDogdGhpcy5lbGVtZW50RnJvbVBvaW50KHApO1xyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGUoZSwgZG9jLCB4LCB5KSB7XHJcbiAgICBjb25zdCBwID0gdGhpcy5jb252ZXJ0Q29vcmRzKHgsIHkpLFxyXG4gICAgICAgICAgZWxlbWVudCA9IGRvYz09PXRoaXMuZG9jPyB0aGlzLmdldEVsZW1lbnQocCk6IHVuZGVmaW5lZDtcclxuICAgIGxldCB0cmlnZ2VyID0gZWxlbWVudCAhPT0gdW5kZWZpbmVkLCBub3RpZnkgPSBmYWxzZTtcclxuXHJcbiAgICBzd2l0Y2goZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ21vdXNlZG93bic6IHtcclxuICAgICAgICBpZih0aGlzLmNhcEVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUVsZW1lbnQodGhpcy5jYXBFbGVtZW50KTtcclxuICAgICAgICAgIG5vdGlmeSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FwRWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgaWYodGhpcy5jYXBFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlRWxlbWVudCh0aGlzLmNhcEVsZW1lbnQpO1xyXG4gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2V1cCc6IHtcclxuICAgICAgICBpZih0aGlzLmNhcEVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUVsZW1lbnQodGhpcy5jYXBFbGVtZW50KTtcclxuICAgICAgICAgIG5vdGlmeSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGltZVN0YW1wID0gZS50aW1lU3RhbXA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnY2xpY2snOiB7XHJcbiAgICAgICAgdHJpZ2dlciA9IGVsZW1lbnQgJiYgdGhpcy5jYXBFbGVtZW50ID09PSBlbGVtZW50Oy8vICYmIGUudGltZVN0YW1wID09PSB0aGlzLnRpbWVTdGFtcDtcclxuICAgICAgICB0aGlzLmNhcEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2VlbnRlcic6XHJcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XHJcbiAgICAgIGNhc2UgJ21vdXNlbW92ZSc6IHtcclxuICAgICAgICBsZXQgbGVhdmVkID0gbnVsbDtcclxuICAgICAgICBpZih0aGlzLmhvdkVsZW1lbnQgIT09IGVsZW1lbnQgJiYgdGhpcy5ob3ZFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh0aGlzLmhvdkVsZW1lbnQsIGUsIHAsICdtb3VzZW91dCcsIHtyZWxhdGVkVGFyZ2V0OiBlbGVtZW50PyBlbGVtZW50OiBudWxsfSk7XHJcbiAgICAgICAgICB0aGlzLmxlYXZlRWxlbWVudCh0aGlzLmhvdkVsZW1lbnQpO1xyXG4gICAgICAgICAgbGVhdmVkID0gdGhpcy5ob3ZFbGVtZW50O1xyXG4gICAgICAgICAgdGhpcy5ob3ZFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuaG92RWxlbWVudCAmJiBlbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChlbGVtZW50LCBlLCBwLCAnbW91c2VvdmVyJywge3JlbGF0ZWRUYXJnZXQ6IGxlYXZlZH0pO1xyXG4gICAgICAgICAgdGhpcy5lbnRlckVsZW1lbnQoZWxlbWVudCk7XHJcbiAgICAgICAgICB0aGlzLmhvdkVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJpZ2dlciA9IGVsZW1lbnQgJiYgZS50eXBlID09PSAnbW91c2Vtb3ZlJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZWxlYXZlJzpcclxuICAgICAgY2FzZSAnbW91c2VvdXQnOiB7XHJcbiAgICAgICAgaWYodGhpcy5ob3ZFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh0aGlzLmhvdkVsZW1lbnQsIGUsIHAsICdtb3VzZW91dCcsIHtyZWxhdGVkVGFyZ2V0OiBlLnJlbGF0ZWRUYXJnZXR9KTtcclxuICAgICAgICAgI
13345HRoaXMubGVhdmVFbGVtZW50KHRoaXMuaG92RWxlbWVudCk7XHJcbiAgICAgICAgICB0aGlzLmhvdkVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBub3RpZnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKHRyaWdnZXIpIHtcclxuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZWxlbWVudCwgZSwgcCwgZS50eXBlKTtcclxuICAgIH1cclxuICAgIGlmKG5vdGlmeSkge1xyXG4gICAgICB0aGlzLm5vdGlmeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RGVmYXVsdFVuZGVmaW5lZFByb3BlcnRpZXMoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnY2xpZW50WCcsXHJcbiAgICAgICdjbGllbnRZJyxcclxuICAgICAgJ29mZnNldFgnLFxyXG4gICAgICAnb2Zmc2V0WScsXHJcbiAgICAgICdzY3JlZW5YJyxcclxuICAgICAgJ3NjcmVlblknXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVmYXVsdFJlc2VuZFByb3BlcnRpZXMoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnYWx0S2V5JyxcclxuICAgICAgJ2J1YmJsZXMnLFxyXG4gICAgICAnYnV0dG9uJyxcclxuICAgICAgJ2J1dHRvbnMnLFxyXG4gICAgICAnY2FuY2VsYWJsZScsXHJcbiAgICAgICdjaGFuZ2VkVG91Y2hlcycsXHJcbiAgICAgICdjaGFyJyxcclxuICAgICAgJ2NoYXJDb2RlJyxcclxuICAgICAgJ2N0cmxLZXknLFxyXG4gICAgICAnZGF0YScsXHJcbiAgICAgICdkZXRhaWwnLFxyXG4gICAgICAnZXZlbnRQaGFzZScsXHJcbiAgICAgICdpc0RlZmF1bHRQcmV2ZW50ZWQnLFxyXG4gICAgICAna2V5JyxcclxuICAgICAgJ2tleUNvZGUnLFxyXG4gICAgICAnbWV0YUtleScsXHJcbiAgICAgICdwb2ludGVySWQnLFxyXG4gICAgICAncG9pbnRlclR5cGUnLFxyXG4gICAgICAnc2hpZnRLZXknLFxyXG4gICAgICAndGFyZ2V0VG91Y2hlcycsXHJcbiAgICAgICd0b3VjaGVzJyxcclxuICAgICAgJ3doaWNoJ1xyXG4gICAgXTtcclxuICB9XHJcblxyXG59XHJcblxyXG4vKlxyXG5hbHRLZXksXHJcbmJ1YmJsZXMsXHJcbmJ1dHRvbixcclxuYnV0dG9ucyxcclxuY2FuY2VsYWJsZSxcclxuY2hhbmdlZFRvdWNoZXMsXHJcbmNoYXIsXHJcbmNoYXJDb2RlLFxyXG5jbGllbnRYLFxyXG5jbGllbnRZLFxyXG5jdHJsS2V5LFxyXG5jdXJyZW50VGFyZ2V0LFxyXG5kYXRhLFxyXG5kZWxlZ2F0ZVRhcmdldCxcclxuZGV0YWlsLFxyXG5ldmVudFBoYXNlLFxyXG5oYW5kbGVPYmosXHJcbmlzRGVmYXVsdFByZXZlbnRlZCxcclxua2V5LFxyXG5rZXlDb2RlLFxyXG5tZXRhS2V5LFxyXG5vZmZzZXRYLFxyXG5vZmZzZXRZLFxyXG5vcmlnaW5hbEV2ZW50LFxyXG5wYWdlWCxcclxucGFnZVksXHJcbnBvaW50ZXJJZCxcclxucG9pbnRlclR5cGUsXHJcbnJlbGF0ZWRUYXJnZXQsXHJcbnNjcmVlblgsXHJcbnNjcmVlblksXHJcbnNoaWZ0S2V5LFxyXG50YXJnZXQsXHJcbnRhcmdldFRvdWNoZXMsXHJcbnRpbWVTdGFtcCxcclxudG9FbGVtZW50LFxyXG50b3VjaGVzLFxyXG50eXBlLFxyXG52aWV3LFxyXG53aGljaFxyXG4qL1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Eb2NNb3VzZVNpbXVsYXRvci5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbTJJbWFnZSB7XG5cbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGNhY2hlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy53aW5kb3cgPSB3bmQ7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvYztcbiAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG5cbiAgICBjb25zdCB1dGlsID0gbmV3VXRpbCgpO1xuICAgIGNvbnN0IGlubGluZXIgPSBuZXdJbmxpbmVyKCk7XG4gICAgY29uc3QgZm9udEZhY2VzID0gbmV3Rm9udEZhY2VzKCk7XG4gICAgY29uc3QgaW1hZ2VzID0gbmV3SW1hZ2VzKCk7XG5cbiAgICB0aGlzLnRvU3ZnID0gdG9Tdmc7XG4gICAgdGhpcy50b1BuZyA9IHRvUG5nO1xuICAgIHRoaXMudG9KcGVnID0gdG9KcGVnO1xuICAgIHRoaXMudG9CbG9iID0gdG9CbG9iO1xuICAgIHRoaXMudG9QaXhlbERhdGEgPSB0b1BpeGVsRGF0YTtcbiAgICB0aGlzLmltcGwgPSB7XG4gICAgICAgICAgICAgICAgICBmb250RmFjZXM6IGZvbnRGYWNlcyxcbiAgICAgICAgICAgICAgICAgIGltYWdlczogaW1hZ2VzLFxuICAgICAgICAgICAgICAgICAgdXRpbDogdXRpbCxcbiAgICAgICAgICAgICAgICAgIGlubGluZXI6IGlubGluZXJcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5maWx0ZXIgLSBTaG91bGQgcmV0dXJuIHRydWUgaWYgcGFzc2VkIG5vZGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXRcbiAgICAgKiAgICAgICAgICAoZXhjbHVkaW5nIG5vZGUgbWVhbnMgZXhjbHVkaW5nIGl0J3MgY2hpbGRyZW4gYXMgd2VsbCkuIE5vdCBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5iZ2NvbG9yIC0gY29sb3IgZm9yIHRoZSBiYWNrZ3JvdW5kLCBhbnkgdmFsaWQgQ1NTIGNvbG9yIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLndpZHRoIC0gd2lkdGggdG8gYmUgYXBwbGllZCB0byBub2RlIGJlZm9yZSByZW5kZXJpbmcuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuaGVpZ2h0IC0gaGVpZ2h0IHRvIGJlIGFwcGxpZWQgdG8gbm9kZSBiZWZvcmUgcmVuZGVyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnN0eWxlIC0gYW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgdG8gYmUgY29waWVkIHRvIG5vZGUncyBzdHlsZSBiZWZvcmUgcmVuZGVyaW5nLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLnF1YWxpdHkgLSBhIE51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBpbWFnZSBxdWFsaXR5IChhcHBsaWNhYmxlIHRvIEpQRUcgb25seSksXG4gICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gMS4wLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBTVkcgaW1hZ2UgZGF0YSBVUkxcbiAgICAgKiAqL1xuXG4gICAgZnVuY3Rpb24gdG9Tdmcobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVOb2RlKG5vZGUsIG9wdGlvbnMuZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgICAgI
13345H0pXG4gICAgICAgICAgICAudGhlbihlbWJlZEZvbnRzKVxuICAgICAgICAgICAgLnRoZW4oaW5saW5lSW1hZ2VzKVxuICAgICAgICAgICAgLnRoZW4oYXBwbHlPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTdmdEYXRhVXJpKGNsb25lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLndpZHRoIHx8IHV0aWwud2lkdGgobm9kZSksXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVpZ2h0IHx8IHV0aWwuaGVpZ2h0KG5vZGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5T3B0aW9ucyhjbG9uZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmdjb2xvcikgY2xvbmUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gb3B0aW9ucy5iZ2NvbG9yO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aWR0aCkgY2xvbmUuc3R5bGUud2lkdGggPSBvcHRpb25zLndpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhlaWdodCkgY2xvbmUuc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgKyAncHgnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdHlsZSlcbiAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5PYmplY3Qua2V5cyhvcHRpb25zLnN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZS5zdHlsZVtwcm9wZXJ0eV0gPSBvcHRpb25zLnN0eWxlW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLCBAc2VlIHtAbGluayB0b1N2Z31cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgVWludDhBcnJheSBjb250YWluaW5nIFJHQkEgcGl4ZWwgZGF0YS5cbiAgICAgKiAqL1xuICAgIGZ1bmN0aW9uIHRvUGl4ZWxEYXRhKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRyYXcobm9kZSwgb3B0aW9ucyB8fCB7fSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FudmFzLmdldENvbnRleHQoJzJkJykuZ2V0SW1hZ2VEYXRhKFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICB1dGlsLndpZHRoKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICB1dGlsLmhlaWdodChub2RlKVxuICAgICAgICAgICAgICAgICkuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSBvYmplY3QgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9ucywgQHNlZSB7QGxpbmsgdG9Tdmd9XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIFBORyBpbWFnZSBkYXRhIFVSTFxuICAgICAqICovXG4gICAgZnVuY3Rpb24gdG9Qbmcobm9kZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZHJhdyhub2RlLCBvcHRpb25zIHx8IHt9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgb2JqZWN0IHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMsIEBzZWUge0BsaW5rIHRvU3ZnfVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBKUEVHIGltYWdlIGRhdGEgVVJMXG4gICAgICogKi9cbiAgICBmdW5jdGlvbiB0b0pwZWcobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIGRyYXcobm9kZSwgb3B0aW9ucylcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIG9wdGlvbnMucXVhbGl0eSB8fCAxLjApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLCBAc2VlIHtAbGluayB0b1N2Z31cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgUE5HIGltYWdlIGJsb2JcbiAgICAgKiAqL1xuICAgIGZ1bmN0aW9uIHRvQmxvYihub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pXG4gICAgICAgICAgICAudGhlbih1dGlsLmNhbnZhc1RvQmxvYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhdyhkb21Ob2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0b1N2Zyhkb21Ob2RlLCBvcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4odXRpbC5tYWtlSW1hZ2UpXG4gICAgICAgICAgICAudGhlbih1dGlsLmRlbGF5KDEwMCkpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSBuZXdDYW52YXMoZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gbmV3Q2FudmFzKGRvbU5vZGUp
13345IHtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBvcHRpb25zLndpZHRoIHx8IHV0aWwud2lkdGgoZG9tTm9kZSk7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgfHwgdXRpbC5oZWlnaHQoZG9tTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJnY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iZ2NvbG9yO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVOb2RlKG5vZGUsIGZpbHRlciwgcm9vdCkge1xuICAgICAgICBpZiAoIXJvb3QgJiYgZmlsdGVyICYmICFmaWx0ZXIobm9kZSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpXG4gICAgICAgICAgICAudGhlbihtYWtlTm9kZUNvcHkpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVDaGlsZHJlbihub2RlLCBjbG9uZSwgZmlsdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0Nsb25lKG5vZGUsIGNsb25lKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIG1ha2VOb2RlQ29weShub2RlKSB7XG4gICAgICAgICAgICBpZiAodXRpbC5pc0NhbnZhcyhub2RlKSkgcmV0dXJuIHV0aWwubWFrZUltYWdlKG5vZGUudG9EYXRhVVJMKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsb25lQ2hpbGRyZW4ob3JpZ2luYWwsIGNsb25lLCBmaWx0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3JpZ2luYWwuY2hpbGROb2RlcztcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmUpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2xvbmVDaGlsZHJlbkluT3JkZXIoY2xvbmUsIHV0aWwuYXNBcnJheShjaGlsZHJlbiksIGZpbHRlcilcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2xvbmVDaGlsZHJlbkluT3JkZXIocGFyZW50LCBjaGlsZHJlbiwgZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZU5vZGUoY2hpbGQsIGZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNoaWxkQ2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRDbG9uZSkgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkQ2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzQ2xvbmUob3JpZ2luYWwsIGNsb25lKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNFbGVtZW50KGNsb25lKSkgcmV0dXJuIGNsb25lO1xuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihjbG9uZVN0eWxlKVxuICAgICAgICAgICAgICAgIC50aGVuKGNsb25lUHNldWRvRWxlbWVudHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oY29weVVzZXJJbnB1dClcbiAgICAgICAgICAgICAgICAudGhlbihmaXhTdmcpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb25lU3R5bGUoKSB7XG4gICAgICAgICAgICAgICAgY29weVN0eWxlKHNlbGYud2luZG93LmdldENvbXB1dGVkU3R5bGUob3JpZ2luYWwpLCBjbG9uZS5zdHlsZSk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5U3R5bGUoc291cmNlLCB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3NUZXh0KSB0YXJnZXQuY3NzVGV4dCA9IHNvdXJjZS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5hc0FycmF5KHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFByb3BlcnR5VmFsdWUobmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRQcm9wZXJ0eVByaW9yaXR5KG5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
13345H0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9uZVBzZXVkb0VsZW1lbnRzKCkge1xuICAgICAgICAgICAgICAgIFsnOmJlZm9yZScsICc6YWZ0ZXInXS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lUHNldWRvRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gc2VsZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnaW5hbCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdub25lJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHV0aWwudWlkKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lLmNsYXNzTmFtZSA9IGNsb25lLmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gc2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZm9ybWF0UHNldWRvRWxlbWVudFN0eWxlKGNsYXNzTmFtZSwgZWxlbWVudCwgc3R5bGUpKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUoY2xhc3NOYW1lLCBlbGVtZW50LCBzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAnLicgKyBjbGFzc05hbWUgKyAnOicgKyBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NzVGV4dCA9IHN0eWxlLmNzc1RleHQgPyBmb3JtYXRDc3NUZXh0KHN0eWxlKSA6IGZvcm1hdENzc1Byb3BlcnRpZXMoc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2VsZWN0b3IgKyAneycgKyBjc3NUZXh0ICsgJ30nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0Q3NzVGV4dChzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmNzc1RleHQgKyAnIGNvbnRlbnQ6ICcgKyBjb250ZW50ICsgJzsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRDc3NQcm9wZXJ0aWVzKHN0eWxlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hc0FycmF5KHN0eWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZvcm1hdFByb3BlcnR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignOyAnKSArICc7JztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAnOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSkgPyAnICFpbXBvcnRhbnQnIDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gY29weVVzZXJJbnB1dCgpIHtcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc1RleHRBcmVhKG9yaWdpbmFsKSkgY2xvbmUuaW5uZXJIVE1MID0gb3JpZ2luYWwudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNJbnB1dChvcmlnaW5hbCkpIGNsb25lLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIG9yaWdpbmFsLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gZml4U3ZnKCkge1xuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc1NWRyhjbG9uZSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNTVkdSZWN0KGNsb25lKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xvbmUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBjbG9uZS5zdHlsZS5zZXRQcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtYmVkRm9udHMobm9kZSkge1xuICAgICAgICByZXR1cm4gZm9udEZhY2VzLnJlc29sdmVBbGwoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpO1xuICAgICAgICAgICAgICAgI
13345HN0eWxlTm9kZS5hcHBlbmRDaGlsZChzZWxmLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1RleHQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlubGluZUltYWdlcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBpbWFnZXMuaW5saW5lQWxsKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlU3ZnRGF0YVVyaShub2RlLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNlbGYud2luZG93LlhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih1dGlsLmVzY2FwZVhodG1sKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHhodG1sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJyxcbiAgICAgICAgICAgICAgICAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCInLCB3aWR0aCwgJ1wiIGhlaWdodD1cIicsIGhlaWdodCwgJ1wiPicsXG4gICAgICAgICAgICAgICAgICAnPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj4nLCB4aHRtbCwgJzwvZm9yZWlnbk9iamVjdD4nLFxuICAgICAgICAgICAgICAgICc8L3N2Zz4nXS5qb2luKCcnKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5ld1V0aWwoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlc2NhcGU6IGVzY2FwZSxcbiAgICAgICAgICAgIHBhcnNlRXh0ZW5zaW9uOiBwYXJzZUV4dGVuc2lvbixcbiAgICAgICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZSxcbiAgICAgICAgICAgIGRhdGFBc1VybDogZGF0YUFzVXJsLFxuICAgICAgICAgICAgaXNEYXRhVXJsOiBpc0RhdGFVcmwsXG4gICAgICAgICAgICBjYW52YXNUb0Jsb2I6IGNhbnZhc1RvQmxvYixcbiAgICAgICAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsXG4gICAgICAgICAgICBnZXRBbmRFbmNvZGU6IGdldEFuZEVuY29kZSxcbiAgICAgICAgICAgIHV
13345pZDogdWlkKCksXG4gICAgICAgICAgICBkZWxheTogZGVsYXksXG4gICAgICAgICAgICBhc0FycmF5OiBhc0FycmF5LFxuICAgICAgICAgICAgZXNjYXBlWGh0bWw6IGVzY2FwZVhodG1sLFxuICAgICAgICAgICAgbWFrZUltYWdlOiBtYWtlSW1hZ2UsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcblxuICAgICAgICAgICAgaXNFbGVtZW50LFxuICAgICAgICAgICAgaXNDYW52YXMsXG4gICAgICAgICAgICBpc1RleHRBcmVhLFxuICAgICAgICAgICAgaXNJbnB1dCxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgaXNTVkdSZWN0LFxuICAgICAgICAgICAgaXNJbWFnZVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIG1pbWVzKCkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIE9ubHkgV09GRiBhbmQgRU9UIG1pbWUgdHlwZXMgZm9yIGZvbnRzIGFyZSAncmVhbCdcbiAgICAgICAgICAgICAqIHNlZSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL21lZGlhLXR5cGVzLnhodG1sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IFdPRkYgPSAnYXBwbGljYXRpb24vZm9udC13b2ZmJztcbiAgICAgICAgICAgIGNvbnN0IEpQRUcgPSAnaW1hZ2UvanBlZyc7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ3dvZmYnOiBXT0ZGLFxuICAgICAgICAgICAgICAgICd3b2ZmMic6IFdPRkYsXG4gICAgICAgICAgICAgICAgJ3R0Zic6ICdhcHBsaWNhdGlvbi9mb250LXRydWV0eXBlJyxcbiAgICAgICAgICAgICAgICAnZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICAgICAgICAgICAgICAncG5nJzogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICAgICAgJ2pwZyc6IEpQRUcsXG4gICAgICAgICAgICAgICAgJ2pwZWcnOiBKUEVHLFxuICAgICAgICAgICAgICAgICdnaWYnOiAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgICAgICAgICAndGlmZic6ICdpbWFnZS90aWZmJyxcbiAgICAgICAgICAgICAgICAnc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGFyc2VFeHRlbnNpb24odXJsKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9cXC4oW15cXC5cXC9dKj8pJC9nLmV4ZWModXJsKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtaW1lVHlwZSh1cmwpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhcnNlRXh0ZW5zaW9uKHVybCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBtaW1lcygpW2V4dGVuc2lvbl0gfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc0RhdGFVcmwodXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsLnNlYXJjaCgvXihkYXRhOikvKSAhPT0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0b0Jsb2IoY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBzZWxmLndpbmRvdy5hdG9iKGNhbnZhcy50b0RhdGFVUkwoKS5zcGxpdCgnLCcpWzFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUFycmF5ID0gbmV3IHNlbGYud2luZG93LlVpbnQ4QXJyYXkobGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGJpbmFyeUFycmF5W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBzZWxmLndpbmRvdy5CbG9iKFtiaW5hcnlBcnJheV0sIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZydcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNhbnZhc1RvQmxvYihjYW52YXMpIHtcbiAgICAgICAgICAgIGlmIChjYW52YXMudG9CbG9iKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZS
13345hmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYW52YXMudG9CbG9iKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdG9CbG9iKGNhbnZhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZXNvbHZlVXJsKHVybCwgYmFzZVVybCkge1xuICAgICAgICAgICAgY29uc3QgZG9jID0gc2VsZi5kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBkb2MuY3JlYXRlRWxlbWVudCgnYmFzZScpO1xuICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoYmFzZSk7XG4gICAgICAgICAgICBjb25zdCBhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgYmFzZS5ocmVmID0gYmFzZVVybDtcbiAgICAgICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgICAgIHJldHVybiBhLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB1aWQoKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndScgKyBmb3VyUmFuZG9tQ2hhcnMoKSArIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3VyUmFuZG9tQ2hhcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82MjQ4NzIyLzI1MTkzNzMgKi9cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnMDAwMCcgKyAoc2VsZi53aW5kb3cuTWF0aC5yYW5kb20oKSAqIHNlbGYud2luZG93Lk1hdGgucG93KDM2LCA0KSA8PCAwKS50b1N0cmluZygzNikpLnNsaWNlKC00KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbWFrZUltYWdlKHVyaSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBzZWxmLndpbmRvdy5JbWFnZSgpO1xuICAgICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IHVyaTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0QW5kRW5jb2RlKHVybCkge1xuICAgICAgICAgIGxldCBkYXRhID0gc2VsZi5jYWNoZS5nZXQodXJsKTtcbiAgICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgICBpZihkYXRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT4ge1xuICAgICAgICAgICAgICAgIGlmKGRhdGEuY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRhdGEucGVuZGluZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNhY2hlLnB1dCh1cmwsIHtwZW5kaW5nczogW119KTtcblxuICAgICAgICAgICAgY29uc3QgVElNRU9VVCA9IDMwMDAwO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IHNlbGYud2luZG93LlhNTEh0dHBSZXF1
13345ZXN0KCk7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGRvbmU7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QudGltZW91dCA9IFRJTUVPVVQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCdjYW5ub3QgZmV0Y2ggcmVzb3VyY2U6ICcgKyB1cmwgKyAnLCBzdGF0dXM6ICcgKyByZXF1ZXN0LnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IHNlbGYud2luZG93LkZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSBlbmNvZGVyLnJlc3VsdC5zcGxpdCgvLC8pWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCByZXNvbHZlIG9mIGRhdGEucGVuZGluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wZW5kaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnJlYWRBc0RhdGFVUkwocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdGltZW91dCgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbCgndGltZW91dCBvZiAnICsgVElNRU9VVCArICdtcyBvY2N1cmVkIHdoaWxlIGZldGNoaW5nIHJlc291cmNlOiAnICsgdXJsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGF0YUFzVXJsKGNvbnRlbnQsIHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2RhdGE6Jyx0eXBlLCc7YmFzZTY0LCcsY29udGVudF0uam9pbignJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhbLiorP14ke30oKXxcXFtcXF1cXC9cXFxcXSkvZywgJ1xcXFwkMScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGVsYXkobXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9LCBtcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYXNBcnJheShhcnJheUxpa2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXkucHVzaChhcnJheUxpa2VbaV0pO1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZXNjYXBlWGh0bWwoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLygjfFxcbikvZywgKGMpPT4gYz09PScjJz8gJyUyMyc6ICclMEEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdpZHRoKG5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci1yaWdodC13aWR0aCcpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuc2Nyb2xsV2lkdGggKyBsZWZ0Qm9yZGVyICsgcmlnaHRCb3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBoZWlnaHQobm9kZSkge1xuICAgICAgICAgICAgY29uc3QgdG9wQm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItYm90dG9tLXdpZHRoJyk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zY3JvbGxIZWlnaHQgKyB0b3BCb3JkZXIgKyBib3R0b21Cb3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBweChub2RlLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNlbGYud2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5FbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNDYW52YXMobm9kZSkge1xuICAgICAgICAgI
13345HJldHVybiBub2RlIGluc3RhbmNlb2Ygc2VsZi53aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc1RleHRBcmVhKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc0lucHV0KG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LkhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc1NWRyhub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5TVkdFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNTVkdSZWN0KG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LlNWR1JlY3RFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNJbWFnZShub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5IVE1MSW1hZ2VFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmV3SW5saW5lcigpIHtcbiAgICAgICAgY29uc3QgVVJMX1JFR0VYID0gL3VybFxcKFsnXCJdPyhbXidcIl0rPylbJ1wiXT9cXCkvZztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5saW5lQWxsOiBpbmxpbmVBbGwsXG4gICAgICAgICAgICBzaG91bGRQcm9jZXNzOiBzaG91bGRQcm9jZXNzLFxuICAgICAgICAgICAgaW1wbDoge1xuICAgICAgICAgICAgICAgIHJlYWRVcmxzOiByZWFkVXJscyxcbiAgICAgICAgICAgICAgICBpbmxpbmU6IGlubGluZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3Moc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnNlYXJjaChVUkxfUkVHRVgpICE9PSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlYWRVcmxzKHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gVVJMX1JFR0VYLmV4ZWMoc3RyaW5nKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF1dGlsLmlzRGF0YVVybCh1cmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbmxpbmUoc3RyaW5nLCB1cmwsIGJhc2VVcmwsIGdldCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmwpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVVybCA/IHV0aWwucmVzb2x2ZVVybCh1cmwsIGJhc2VVcmwpIDogdXJsO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZ2V0IHx8IHV0aWwuZ2V0QW5kRW5jb2RlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLmRhdGFBc1VybChkYXRhLCB1dGlsLm1pbWVUeXBlKHVybCkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHVybEFzUmVnZXgodXJsKSwgWyckMScsIGRhdGFVcmwsICckMyddLmpvaW4oJycpKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdXJsQXNSZWdleCh1cmwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNlbGYud2luZG93LlJlZ0V4cChbJyh1cmxcXFxcKFtcXCdcIl0/KSgnLCB1dGlsLmVzY2FwZSh1cmwpLCAnKShbXFwnXCJdP1xcXFwpKSddLmpvaW4oJycpLCAnZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5saW5lQWxsKHN0cmluZywgYmFzZVVybCwgZ2V0KSB7XG4gICAgICAgICAgICBpZiAobm90aGluZ1RvSW5saW5lKCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RyaW5nKTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdHJpbmcpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVhZFVybHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHVybHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgdXJscy5mb3JFYWNoKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb25lLnRoZW4oZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmUoc3RyaW5nLCB1cmwsIGJhc2VVcmwsIGdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBub3RoaW5nVG9JbmxpbmUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFzaG91bGRQcm9jZXNzKHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXdGb250RmFjZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvbHZlQWxsOiByZXNvbHZlQWxsLFxuICAgICAgICAgICAgaW1wbDoge1xuICAgICAgICAgICAgICAgIHJlYWRBbGw6IHJlYWRBbGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiByZXNvbHZlQWxsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRBbGwoc2VsZi5kb2N1bWVudClcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAod2ViRm9udHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgd2ViRm9udHMubWFwKGZ1bmN0aW9uICh3ZWJGb250KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlYkZvbnQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjc3NTdHJpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgI
13345HJldHVybiBjc3NTdHJpbmdzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZEFsbCgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXRpbC5hc0FycmF5KHNlbGYuZG9jdW1lbnQuc3R5bGVTaGVldHMpKVxuICAgICAgICAgICAgICAgIC50aGVuKGdldENzc1J1bGVzKVxuICAgICAgICAgICAgICAgIC50aGVuKHNlbGVjdFdlYkZvbnRSdWxlcylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVzLm1hcChuZXdXZWJGb250KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0V2ViRm9udFJ1bGVzKGNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNzc1J1bGVzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydWxlLnR5cGUgPT09IENTU1J1bGUuRk9OVF9GQUNFX1JVTEU7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVyLnNob3VsZFByb2Nlc3MocnVsZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdzcmMnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRDc3NSdWxlcyhzdHlsZVNoZWV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzc1J1bGVzID0gW107XG4gICAgICAgICAgICAgICAgc3R5bGVTaGVldHMuZm9yRWFjaChmdW5jdGlvbiAoc2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuYXNBcnJheShzaGVldC5jc3NSdWxlcyB8fCBbXSkuZm9yRWFjaChjc3NSdWxlcy5wdXNoLmJpbmQoY3NzUnVsZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIHJlYWRpbmcgQ1NTIHJ1bGVzIGZyb20gJyArIHNoZWV0LmhyZWYsIGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3NzUnVsZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG5ld1dlYkZvbnQod2ViRm9udFJ1bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9ICh3ZWJGb250UnVsZS5wYXJlbnRTdHlsZVNoZWV0IHx8IHt9KS5ocmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZXIuaW5saW5lQWxsKHdlYkZvbnRSdWxlLmNzc1RleHQsIGJhc2VVcmwpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWJGb250UnVsZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXdJbWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmxpbmVBbGw6IGlubGluZUFsbCxcbiAgICAgICAgICAgIGltcGw6IHtcbiAgICAgICAgICAgICAgICBuZXdJbWFnZTogbmV3SW1hZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBuZXdJbWFnZShlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlubGluZTogaW5saW5lXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBpbmxpbmUoZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNEYXRhVXJsKGVsZW1lbnQuc3JjKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbGVtZW50LnNyYylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZ2V0IHx8IHV0aWwuZ2V0QW5kRW5jb2RlKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuZGF0YUFzVXJsKGRhdGEsIHV0aWwubWltZVR5cGUoZWxlbWVudC5zcmMpKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZS
13345hmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNyYyA9IGRhdGFVcmw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbmxpbmVBbGwobm9kZSkge1xuICAgICAgICAgICAgaWYgKCF1dGlsLmlzRWxlbWVudChub2RlKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGlubGluZUJhY2tncm91bmQobm9kZSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzSW1hZ2Uobm9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW1hZ2Uobm9kZSkuaW5saW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmFzQXJyYXkobm9kZS5jaGlsZE5vZGVzKS5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVBbGwoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBpbmxpbmVCYWNrZ3JvdW5kKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWJhY2tncm91bmQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lci5pbmxpbmVBbGwoYmFja2dyb3VuZClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGlubGluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KCdiYWNrZ3JvdW5kJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRG9tMkltYWdlLmpzIiwiaW1wb3J0IHskLCBUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmFnIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIHZpc3VhbFdvcmxkKSB7XHJcbiAgICB0aGlzLnduZCA9IHduZDtcclxuICAgIHRoaXMuZG9jID0gZG9jO1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWxXb3JsZDtcclxuICAgIHRoaXMuY29vcmRzID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgIHRoaXMuaW50ZXJzZWN0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIHRoaXMucmF5Y2FzdGVyID0gdGhpcy52aXN1YWwucmF5Y2FzdGVyO1xyXG4gICAgdGhpcy5jYW1lcmEgPSB0aGlzLnZpc3VhbC5jYW1lcmE7XHJcbiAgICB0aGlzLnBsYW5lID0gbmV3IFRIUkVFLlBsYW5lKCk7XHJcbiAgICB0aGlzLnRocmVlcyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jb250cm9sc1N0YXRlID0gdGhpcy52aXN1YWwuZ2V0Q29udHJvbHNTdGF0ZSgpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMudmlzdWFsLmVsZW1lbnQ7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBvbk1vdXNlTW92ZTogdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpLFxyXG4gICAgICBvbk1vdXNlVXA6IHRoaXMub25Nb3VzZVVwLmJpbmQodGhpcylcclxuICAgIH07XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub24oJ21vdXNlbW92ZScsIHRoaXMuYmluZHMub25Nb3VzZU1vdmUpO1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9uKCdtb3VzZWRvd24nLCB0aGlzLmJpbmRzLm9uTW91c2VEb3duKTtcclxuICAgICQodGhpcy5kb2MpLm9uKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5vbk1vdXNlVXApO1xyXG4gIH1cclxuXHJcbiAgYWRkVGhyZWUodGhyZWUpIHtcclxuICAgIHRoaXMudGhyZWVzLnB1c2godGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhyZWUodGhyZWUpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnRocmVlcy5pbmRleE9mKHRocmVlKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMudGhyZWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUGlja0NhbGxiYWNrKCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdDYWxsYmFjaygpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25SZWxlYXNlQ2FsbGJhY2soKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICQodGhpcy5lbGVtZW50KS5vZmYoJ21vdXNlbW92ZScsIHRoaXMuYmluZHMub25Nb3VzZU1vdmUpO1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9mZignbW91c2Vkb3duJywgdGhpcy5iaW5kcy5vbk1vdXNlRG93bik7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ21vdXNldXAnLCB0aGlzLmJpbmRzLm9uTW91c2VVcCk7XHJcbiAgfVxyXG5cclxuICBzZXRDb29yZHNGcm9tRXZlbnQoZSkge1xyXG4gICAgY29uc3QgakVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKTtcclxuICAgIHRoaXMuY29vcmRzLnggPSAoKGUucGFnZVgtb2Zmc2V0LmxlZnQpL2pFbGVtZW50LndpZHR
13345oKCkpKjItMTtcclxuICAgIHRoaXMuY29vcmRzLnkgPSAtKChlLnBhZ2VZLW9mZnNldC50b3ApL2pFbGVtZW50LmhlaWdodCgpKSoyKzE7XHJcbiAgICByZXR1cm4gdGhpcy5jb29yZHM7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93bihlKSB7XHJcbiAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYodGhpcy5zZWxlY3RlZCkgdGhpcy5vbk1vdXNlVXAoZSk7XHJcblxyXG4gICAgdGhpcy5zZXRDb29yZHNGcm9tRXZlbnQoZSk7XHJcbiAgXHR0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMuY29vcmRzLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gIFx0Y29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy50aHJlZXMpO1xyXG4gIFx0aWYoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XHJcbiAgICAgIGlmKCF0aGlzLm9uUGlja0NhbGxiYWNrKGludGVyc2VjdHNbMF0pKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHYgPSBpbnRlcnNlY3RzWzBdLnBvaW50LmNsb25lKCk7XHJcbiAgICAgIHRoaXMuZGlzdGFuY2UgPSB2LnN1Yih0aGlzLnJheWNhc3Rlci5yYXkub3JpZ2luKS5sZW5ndGgoKTs7XHJcbiAgICAgIHRoaXMuY29udHJvbHNTdGF0ZSA9IHRoaXMudmlzdWFsLmdldENvbnRyb2xzU3RhdGUoKTtcclxuICAgICAgdGhpcy52aXN1YWwuc2V0Q29udHJvbHNTdGF0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMucGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodGhpcy52aXN1YWwuY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHRoaXMucGxhbmUubm9ybWFsKSwgaW50ZXJzZWN0c1swXS5wb2ludCk7XHJcbiAgICAgIC8vdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0aGlzLnBsYW5lLm5vcm1hbC5zZXQoMCwwLDEpLCBuZXcgVEhSRUUuVmVjdG9yMygwLDAsMCkpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcbiAgXHR9XHJcblxyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZSkge1xyXG4gICAgaWYoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xyXG4gIFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICBcdGlmKHRoaXMuc2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5zZXRDb29yZHNGcm9tRXZlbnQoZSk7XHJcbiAgICBcdHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5jb29yZHMsIHRoaXMuY2FtZXJhKTtcclxuXHQgICAgaWYodGhpcy5yYXljYXN0ZXIucmF5LmludGVyc2VjdFBsYW5lKHRoaXMucGxhbmUsIHRoaXMuaW50ZXJzZWN0aW9uKSkge1xyXG4gICAgICAgIGlmKCF0aGlzLm9uRHJhZ0NhbGxiYWNrKHRoaXMuaW50ZXJzZWN0aW9uKSkgdGhpcy5vbk1vdXNlVXAoZSk7XHJcbiAgICAgIH0vKiovXHJcbiAgICAgIC8vdGhpcy5pbnRlcnNlY3Rpb24uY29weSh0aGlzLnJheWNhc3Rlci5yYXkuZGlyZWN0aW9uKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLmRpc3RhbmNlKS5hZGQodGhpcy5yYXljYXN0ZXIucmF5Lm9yaWdpbik7LyoqL1xyXG4gICAgICAvL2lmKCF0aGlzLm9uRHJhZ0NhbGxiYWNrKHRoaXMuc2VsZWN0ZWQsIHRoaXMuaW50ZXJzZWN0aW9uKSkgdGhpcy5vbk1vdXNlVXAoZSk7XHJcbiAgXHR9XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlVXAoZSkge1xyXG4gICAgaWYodGhpcy5zZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLm9uUmVsZWFzZUNhbGxiYWNrKCk7XHJcbiAgXHRcdHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICB0aGlzLnZpc3VhbC5zZXRDb250cm9sc1N0YXRlKHRoaXMuY29udHJvbHNTdGF0ZSk7XHJcbiAgXHR9XHJcbiAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XHJcbiAgXHRlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9EcmFnLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxucmVxdWlyZSgnaW1wb3J0cy1sb2FkZXI/ZGVmaW5lPT5mYWxzZSFqcXVlcnktbW91c2V3aGVlbCcpKCQpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXZlbnRzVG9BY3Rpb25zIHtcclxuXHJcbiAgc3RhdGljIG1vZEtleXMgPSB7XHJcbiAgICBDdHJsOiAxLFxyXG4gICAgU2hpZnQ6IDIsXHJcbiAgICBBbHQ6IDRcclxuICB9O1xyXG5cclxuICBzdGF0aWMgbW91c2VCdXR0b25zID0ge1xyXG4gICAgTGVmdDogMCxcclxuICAgIE1pZGRsZTogMSxcclxuICAgIFJpZ2h0OiAyXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIGdldEV2ZW50RmxhZ3MoZSkge1xyXG4gICAgcmV0dXJuIGUuY3RybEtleTw8MCB8IGUuc2hpZnRLZXk8PDEgfCBlLmFsdEtleTw8MjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRQb3NpdGlvbih0b3VjaGVzKSB7XHJcbiAgICBsZXQgeCwgeTtcclxuICAgIGlmKHRvdWNoZXMubGVuZ3RoPT09Mikge1xyXG4gICAgICB4ID0gdG91Y2hlc1sxXS5wYWdlWC10b3VjaGVzWzBdLnBhZ2VYO1xyXG4gICAgICB5ID0gdG91Y2hlc1sxXS5wYWdlWS10b3VjaGVzWzBdLnBhZ2VZO1xyXG4gICAgICB5ID0gLU1hdGguc3FydCh4KngreSp5KTtcclxuICAgICAgeCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgeCA9IHRvdWNoZXNbMF0ucGFnZVg7XHJcbiAgICAgIHkgPSB0b3VjaGVzWzBdLnBhZ2VZO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgeCxcclxuICAgICAgeVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGFjdGlvbnMpIHtcclxuICAgIHRoaXMuYWN0aW9ucyA9IGFjdGlvbnMgfHwge307XHJcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgdGhpcy5kb2MgPSBlbGVtZW50WzBdLm93bmVyRG9jdW1lbnQ7XHJcbiAgICB0aGlzLnduZCA9IHRoaXMuZG9jLmRlZmF1bHRWaWV3O1xyXG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBjb250ZXh0TWVudTogdGh
13345pcy5jb250ZXh0TWVudS5iaW5kKHRoaXMpLFxyXG5cclxuICAgICAgbW91c2VEb3duOiB0aGlzLm1vdXNlRG93bi5iaW5kKHRoaXMpLFxyXG4gICAgICBtb3VzZU1vdmU6IHRoaXMubW91c2VNb3ZlLmJpbmQodGhpcyksXHJcbiAgICAgIG1vdXNlVXA6IHRoaXMubW91c2VVcC5iaW5kKHRoaXMpLFxyXG4gICAgICBtb3VzZVdoZWVsOiB0aGlzLm1vdXNlV2hlZWwuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIG1vdXNlTW92ZURvYzogdGhpcy5tb3VzZU1vdmVEb2MuYmluZCh0aGlzKSxcclxuICAgICAgbW91c2VVcERvYzogdGhpcy5tb3VzZVVwRG9jLmJpbmQodGhpcyksXHJcblxyXG4gICAgICBjbGljazogdGhpcy5jbGljay5iaW5kKHRoaXMpLFxyXG4gICAgICBkYmxjbGljazogdGhpcy5kYmxjbGljay5iaW5kKHRoaXMpLFxyXG5cclxuICAgICAgdG91Y2hTdGFydDogdGhpcy50b3VjaFN0YXJ0LmJpbmQodGhpcyksXHJcbiAgICAgIHRvdWNoTW92ZTogdGhpcy50b3VjaE1vdmUuYmluZCh0aGlzKSxcclxuICAgICAgdG91Y2hFbmQ6IHRoaXMudG91Y2hFbmQuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIGtleURvd246IHRoaXMua2V5RG93bi5iaW5kKHRoaXMpLFxyXG4gICAgICBrZXlQcmVzczogdGhpcy5rZXlQcmVzcy5iaW5kKHRoaXMpLFxyXG4gICAgICBrZXlVcDogdGhpcy5rZXlVcC5iaW5kKHRoaXMpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vbignY29udGV4dG1lbnUnLCB0aGlzLmJpbmRzLmNvbnRleHRNZW51KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNlZG93bicsIHRoaXMuYmluZHMubW91c2VEb3duKTtcclxuICAgIHRoaXMuZWxlbWVudC5vbignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5tb3VzZU1vdmUpO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5tb3VzZVVwKTtcclxuICAgIHRoaXMuZWxlbWVudC5vbignbW91c2V3aGVlbCcsIHRoaXMuYmluZHMubW91c2VXaGVlbCk7XHJcblxyXG4gICAgJCh0aGlzLmRvYykub24oJ21vdXNlbW92ZScsIHRoaXMuYmluZHMubW91c2VNb3ZlRG9jKTtcclxuICAgICQodGhpcy5kb2MpLm9uKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5tb3VzZVVwRG9jKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ2NsaWNrJywgdGhpcy5iaW5kcy5jbGljayk7XHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ2RibGNsaWNrJywgdGhpcy5iaW5kcy5kYmxjbGljayk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCd0b3VjaHN0YXJ0JywgdGhpcy5iaW5kcy50b3VjaFN0YXJ0KTtcclxuICAgIHRoaXMuZWxlbWVudC5vbigndG91Y2htb3ZlJywgdGhpcy5iaW5kcy50b3VjaE1vdmUpO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCd0b3VjaGVuZCcsIHRoaXMuYmluZHMudG91Y2hFbmQpO1xyXG5cclxuICAgICQodGhpcy53bmQpLm9uKCdrZXlkb3duJywgdGhpcy5iaW5kcy5rZXlEb3duKTtcclxuICAgICQodGhpcy53bmQpLm9uKCdrZXlwcmVzcycsIHRoaXMuYmluZHMua2V5UHJlc3MpO1xyXG4gICAgJCh0aGlzLnduZCkub24oJ2tleXVwJywgdGhpcy5iaW5kcy5rZXlVcCk7XHJcbiAgfVxyXG5cclxuICBhZGRBY3Rpb24oYWN0aW9uLCB0eXBlLCBjb2RlLCBmbGFncykge1xyXG4gICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmKCF0aGlzLmFjdGlvbnNbdHlwZV0pIHtcclxuICAgICAgdGhpcy5hY3Rpb25zW3R5cGVdID0ge307XHJcbiAgICB9XHJcbiAgICBpZighdGhpcy5hY3Rpb25zW3R5cGVdW2NvZGVdKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uc1t0eXBlXVtjb2RlXSA9IHt9XHJcbiAgICB9XHJcbiAgICBpZighdGhpcy5hY3Rpb25zW3R5cGVdW2NvZGVdW2ZsYWdzXSkge1xyXG4gICAgICB0aGlzLmFjdGlvbnNbdHlwZV1bY29kZV1bZmxhZ3NdID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGlvbnNbdHlwZV1bY29kZV1bZmxhZ3NdLnB1c2goYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGdldEFjdGlvbnModHlwZSwgY29kZSwgZmxhZ3MpIHtcclxuICAgIHJldHVybiAoKHRoaXMuYWN0aW9uc1t0eXBlXSB8fCB7fSlbY29kZV0gfHwge30pW2ZsYWdzXSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGZpcmVBY3Rpb25zKGFjdGlvbnMsIGUsIGRhdGEpIHtcclxuICAgIGZvcihsZXQgYWN0aW9uIG9mIGFjdGlvbnMpIHtcclxuICAgICAgYWN0aW9uKGUsIGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udGV4dE1lbnUoZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCdjb250ZXh0bWVudScsIGUuYnV0dG9uLCBmbGFncyksIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VEb3duKGUpIHtcclxuICAgIGlmKHRoaXMucGlja2VkKSB7XHJcbiAgICAgIHRoaXMubW91c2VVcERvYygpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCdtb3VzZWRvd24nLCBlLmJ1dHRvbiwgZmxhZ3MpLCBlKTtcclxuICAgICAgdGhpcy5waWNrZWQgPSB7XHJcbiAgICAgICAgeDogZS5wYWdlWCxcclxuICAgICAgICB5OiBlLnBhZ2VZLFxyXG4gICAgICAgIGFjdGlvbnM6IHRoaXMuZ2V0QWN0aW9ucygnbW91c2VkcmFnJywgZS5idXR0b24sIGZsYWdzKVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMucGlja2VkLmFjdGlvbnMsIGUsIHtcclxuICAgICAgICBzdGF0ZTogJ3N0YXJ0J1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlTW92ZShlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ21vdXNlbW92ZScsIGUuYnV0dG9uLCBmbGFncyksIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VNb3ZlRG9jKGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCAmJiB0aGlzLnBpY2tlZCkge1xyXG4gICAgICB0aGlzLmZpcmV
13345BY3Rpb25zKHRoaXMucGlja2VkLmFjdGlvbnMsIGUsIHtcclxuICAgICAgICBzdGF0ZTogJ21vdmUnLFxyXG4gICAgICAgIGR4OiBlLnBhZ2VYLXRoaXMucGlja2VkLngsXHJcbiAgICAgICAgZHk6IGUucGFnZVktdGhpcy5waWNrZWQueVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5waWNrZWQgPSB7XHJcbiAgICAgICAgeDogZS5wYWdlWCxcclxuICAgICAgICB5OiBlLnBhZ2VZLFxyXG4gICAgICAgIGFjdGlvbnM6IHRoaXMucGlja2VkLmFjdGlvbnNcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlVXAoZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCdtb3VzZXVwJywgZS5idXR0b24sIGZsYWdzKSwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZVVwRG9jKGUpIHtcclxuICAgIGlmKHRoaXMucGlja2VkKSB7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5waWNrZWQuYWN0aW9ucywgZSwge1xyXG4gICAgICAgIHN0YXRlOiAnZW5kJ1xyXG4gICAgICB9KTtcclxuICAgICAgZGVsZXRlIHRoaXMucGlja2VkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VXaGVlbChlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ21vdXNld2hlZWwnLCAwLCBmbGFncyksIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xpY2tzKGUsIHR5cGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucyh0eXBlLCBlLmJ1dHRvbiwgZmxhZ3MpLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsaWNrKGUpIHtcclxuICAgIHRoaXMuY2xpY2tzKGUsICdjbGljaycpO1xyXG4gIH1cclxuXHJcbiAgZGJsY2xpY2soZSkge1xyXG4gICAgdGhpcy5jbGlja3MoZSwgJ2RibGNsaWNrJyk7XHJcbiAgfVxyXG5cclxuICB0b3VjaFBpY2soZSwgZmxhZ3MsIHRvdWNoZXMpIHtcclxuICAgIHRoaXMudG91Y2hQaWNrZWQgPSB7XHJcbiAgICAgIC4uLkV2ZW50c1RvQWN0aW9ucy5nZXRQb3NpdGlvbih0b3VjaGVzKSxcclxuICAgICAgYWN0aW9uczogdGhpcy5nZXRBY3Rpb25zKCd0b3VjaGRyYWcnLCB0b3VjaGVzLmxlbmd0aCwgZmxhZ3MpLFxyXG4gICAgICBjb2RlOiB0b3VjaGVzLmxlbmd0aCxcclxuICAgICAgZmxhZ3NcclxuICAgIH07XHJcbiAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMudG91Y2hQaWNrZWQuYWN0aW9ucywgZSwge1xyXG4gICAgICBzdGF0ZTogJ3N0YXJ0J1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b3VjaFN0YXJ0KGUpIHtcclxuICAgIGlmKHRoaXMudG91Y2hQaWNrZWQpIHtcclxuICAgICAgdGhpcy50b3VjaEVuZChlKTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpLCB0b3VjaGVzID0gZS50b3VjaGVzIHx8IGUub3JpZ2luYWxFdmVudC50b3VjaGVzO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygndG91Y2hzdGFydCcsIHRvdWNoZXMubGVuZ3RoLCBmbGFncyksIGUpO1xyXG4gICAgICB0aGlzLnRvdWNoUGljayhlLCBmbGFncywgdG91Y2hlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b3VjaE1vdmUoZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSksIHRvdWNoZXMgPSBlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCd0b3VjaG1vdmUnLCB0b3VjaGVzLmxlbmd0aCwgZmxhZ3MpLCBlKTtcclxuICAgICAgaWYodGhpcy50b3VjaFBpY2tlZCkge1xyXG4gICAgICAgIGlmKHRoaXMudG91Y2hQaWNrZWQuY29kZT09PXRvdWNoZXMubGVuZ3RoICYmIHRoaXMudG91Y2hQaWNrZWQuZmxhZ3M9PT1mbGFncykge1xyXG4gICAgICAgICAgY29uc3QgcG9zID0gRXZlbnRzVG9BY3Rpb25zLmdldFBvc2l0aW9uKHRvdWNoZXMpO1xyXG4gICAgICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLnRvdWNoUGlja2VkLmFjdGlvbnMsIGUsIHtcclxuICAgICAgICAgICAgc3RhdGU6ICdtb3ZlJyxcclxuICAgICAgICAgICAgZHg6IHBvcy54LXRoaXMudG91Y2hQaWNrZWQueCxcclxuICAgICAgICAgICAgZHk6IHBvcy55LXRoaXMudG91Y2hQaWNrZWQueVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnRvdWNoUGlja2VkID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnRvdWNoUGlja2VkLFxyXG4gICAgICAgICAgICAuLi5wb3NcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b3VjaEVuZChlKTtcclxuICAgICAgICAgIHRoaXMudG91Y2hQaWNrKGUsIGZsYWdzLCB0b3VjaGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvdWNoRW5kKGUpIHtcclxuICAgIGlmKHRoaXMudG91Y2hQaWNrZWQpIHtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLnRvdWNoUGlja2VkLmFjdGlvbnMsIGUsIHtcclxuICAgICAgICBzdGF0ZTogJ2VuZCdcclxuICAgICAgfSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnRvdWNoUGlja2VkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAga2V5KGUsIHR5cGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmV
13345BY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucyh0eXBlLCBlLmtleUNvZGUsIGZsYWdzKSwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBrZXlEb3duKGUpIHtcclxuICAgIHRoaXMua2V5KGUsICdrZXlkb3duJyk7XHJcbiAgfVxyXG5cclxuICBrZXlQcmVzcyhlKSB7XHJcbiAgICB0aGlzLmtleShlLCAna2V5cHJlc3MnKTtcclxuICB9XHJcblxyXG4gIGtleVVwKGUpIHtcclxuICAgIHRoaXMua2V5KGUsICdrZXl1cCcpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ2NvbnRleHRtZW51JywgdGhpcy5iaW5kcy5jb250ZXh0TWVudSk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignbW91c2Vkb3duJywgdGhpcy5iaW5kcy5tb3VzZURvd24pO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5tb3VzZU1vdmUpO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignbW91c2V1cCcsIHRoaXMuYmluZHMubW91c2VVcCk7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdtb3VzZXdoZWVsJywgdGhpcy5iaW5kcy5tb3VzZVdoZWVsKTtcclxuXHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ21vdXNlbW92ZScsIHRoaXMuYmluZHMubW91c2VNb3ZlRG9jKTtcclxuICAgICQodGhpcy5kb2MpLm9mZignbW91c2V1cCcsIHRoaXMuYmluZHMubW91c2VVcERvYyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignY2xpY2snLCB0aGlzLmJpbmRzLmNsaWNrKTtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ2RibGNsaWNrJywgdGhpcy5iaW5kcy5kYmxjbGljayk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9mZigndG91Y2hzdGFydCcsIHRoaXMuYmluZHMudG91Y2hTdGFydCk7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLmJpbmRzLnRvdWNoTW92ZSk7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCd0b3VjaGVuZCcsIHRoaXMuYmluZHMudG91Y2hFbmQpO1xyXG5cclxuICAgICQodGhpcy53bmQpLm9mZigna2V5ZG93bicsIHRoaXMuYmluZHMua2V5RG93bik7XHJcbiAgICAkKHRoaXMud25kKS5vZmYoJ2tleXByZXNzJywgdGhpcy5iaW5kcy5rZXlQcmVzcyk7XHJcbiAgICAkKHRoaXMud25kKS5vZmYoJ2tleXVwJywgdGhpcy5iaW5kcy5rZXlVcCk7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9FdmVudHNUb0FjdGlvbnMuanMiLCJcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnVsbFNjcmVlbiB7XHJcblxyXG5cdHN0YXRpYyBfaGFzV2Via2l0RnVsbFNjcmVlblx0PSAhIWRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW47XHJcblx0c3RhdGljIF9oYXNNb3pGdWxsU2NyZWVuXHQ9ICEhZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbjtcclxuXHRzdGF0aWMgX2hhc01zRnVsbHNjcmVlbiA9ICEhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW47XHJcblxyXG5cdHN0YXRpYyBhdmFpbGFibGUoKSB7XHJcblx0XHRyZXR1cm4gRnVsbFNjcmVlbi5faGFzV2Via2l0RnVsbFNjcmVlbiB8fCBGdWxsU2NyZWVuLl9oYXNNb3pGdWxsU2NyZWVuIHx8IEZ1bGxTY3JlZW4uX2hhc01zRnVsbHNjcmVlbjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhY3RpdmF0ZWQoKSB7XHJcblx0XHRpZihGdWxsU2NyZWVuLl9oYXNXZWJraXRGdWxsU2NyZWVuKSB7XHJcblx0XHRcdHJldHVybiBkb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW47XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKEZ1bGxTY3JlZW4uX2hhc01vekZ1bGxTY3JlZW4pIHtcclxuXHRcdFx0cmV0dXJuIGRvY3VtZW50Lm1vekZ1bGxTY3JlZW47XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKEZ1bGxTY3JlZW4uX2hhc01zRnVsbHNjcmVlbikge1xyXG5cdFx0XHRyZXR1cm4gISFkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50O1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUuYXNzZXJ0KGZhbHNlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGhhbmRsZXIpIHtcclxuXHRcdGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHtcclxuXHRcdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuY2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyByZW1vdmVFdmVudExpc3RlbmVyKGVsZW1lbnQsIGhhbmRsZXIpIHtcclxuXHRcdGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcclxuXHRcdCAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHQgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuY2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0ICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdCAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyByZXF1ZXN0KGVsZW1lbnQpIHtcclxuXHRcdGVsZW1lbnRcdD0gZWxlbWVudFx0fHwgZG9jdW1lbnQuYm9keTtcclxuXHRcdGlmKEZ1bGxTY3JlZW4uX2hhc1dlYmtpdEZ1bGxTY3JlZW4pIHtcclxuXHRcdFx0ZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihGdWxsU2NyZWVuLl9oYXNNb3pGdWxsU2NyZWVuKSB7XHJcblx0XHRcdGVsZW1lbnQubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoRnVsbFNjcmVlbi5faGFzTXNGdWxsc2NyZWVuKSB7XHJcblx0XHRcdGVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUuYXNzZXJ0KGZhbHNlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjYW5jZWwoKSB7XHJcblx0XHRpZihGdWxsU2NyZWVuLl9oYXNXZWJraXRGdWxsU2NyZWVuKSB7XHJcblx0XHRcdGRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTtcclxuXHRcdH1lbHNlIGlmKEZ1bGxTY3JlZW4uX2hhc01vekZ1bGxTY3JlZW4pIHtcclxuXHRcdFx0ZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihGdWxsU2NyZWVuLl9oYXNNc0Z1bGxzY3JlZW4pIHtcclxuXHRcdFx0ZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUuYXNzZXJ0KGZhbHNlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0Z1bGxTY3JlZW4uanMiLCJpbXBvcnQgeyQsIGh0bWwyY2FudmFzfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEltYWdlQmFzZSBmcm9tICcuL0ltYWdlQmFzZSc7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcbmltcG9ydCBEb20ySW1hZ2UgZnJvbSAnLi9Eb20ySW1hZ2UnO1xyXG5pbXBvcnQgRG9jTW91c2VTaW11bGF0b3IgZnJvbSAnLi9Eb2NNb3VzZVNpbXVsYXRvcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnRlcmFjdGl2ZUltYWdlIGV4dGVuZHMgSW1hZ2VCYXNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IsIHNyYywgY2FjaGUsIGluamVjdG9yKSB7XHJcbiAgICBzdXBlcihjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcik7XHJcblxyXG4gICAgdGhpcy5pSWQgPSAnaScrQmFzZU1hdGhVdGlscy5nZXRVbmlxdWUoKTtcclxuICAgIGNvbnN0IGpGcmFtZSA9ICQoJzxpZnJhbWUgaWQ9XCInK3RoaXMuaUlkKydcIiBzcmM9XCInICsgc3JjICsgJ1wiIHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAtMTAwMHB4O1wiPjwvaWZyYW1lPicpO1xyXG4gICAgJCh0aGlzLmRvYy5ib2R5KS5hcHBlbmQoakZyYW1lKTtcclxuICAgIHRoaXMuZnJhbWUgPSBqRnJhbWVbMF07XHJcblxyXG4gICAgdGhpcy5iaW5kcyA9IHt9O1xyXG5cclxuICAgIGlmKGluamVjdG9yKSB7XHJcbiAgICAgIGluamVjdG9yKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5kb2MuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnd3d3Lmh0dHA6Ly93My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5JywgJzEuMScpKSB7IC8vIHN2ZyBmb3JlaWduT2JqZWN0IHJlbmRlcmVyXHJcbiAgICAgIHRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgdGhpcy5iaW5kcy5pbWFnZUxvYWQgPSAoKT0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlckltYWdlKHRoaXMuaW1hZ2UpO1xyXG4gICAgICAgI
13345HRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgIH07XHJcbiAgICAgICQodGhpcy5pbWFnZSkub24oJ2xvYWQnLCB0aGlzLmJpbmRzLmltYWdlTG9hZCk7XHJcbiAgICAgIHRoaXMuc3ZnUmVuZGVyID0gbmV3IERvbTJJbWFnZSh0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3csIHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LCBjYWNoZSk7XHJcbiAgICB9IC8vIG90aGVyd2lzZSAtIGh0bWwyY2FudmFzXHJcblxyXG4gICAgdGhpcy5iaW5kcy5mcmFtZUxvYWQgPSAoKT0+IHtcclxuICAgICAgaWYofnRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LnRpdGxlLmluZGV4T2YoJzQwNCcpKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFJlbmRlciA9ICgpPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJOb3RGb3VuZFBhZ2UoKTtcclxuICAgICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICAgICAgaWYodGhpcy5mcmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gJCh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5KS53aWR0aCgpO1xyXG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9ICQodGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQuYm9keSkuaGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIGpGcmFtZS5jc3MoJ3dpZHRoJywgdGhpcy53aWR0aCsncHgnKS5jc3MoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KydweCcpO1xyXG4gICAgICAgICAgICBqRnJhbWUub2Zmc2V0KHtsZWZ0OiAtdGhpcy53aWR0aC0xMDAsIHRvcDogMH0pO1xyXG4gICAgICAgICAgICBpZih0aGlzLnN2Z1JlbmRlcikge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ltdWxhdG9yID0gbmV3IERvY01vdXNlU2ltdWxhdG9yKGpGcmFtZSwgdGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQuYm9keSwgdGhpcy5lbGVtZW50KTtcclxuICAgICAgICAgICAgICB0aGlzLnNpbXVsYXRvci5hZGREb2NDaGFuZ2VDbGIodGhpcy5maW5pc2hMb2FkLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRSZW5kZXIgPSAoKT0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgJCh0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cpLm9uKCdsb2FkJywgdGhpcy5iaW5kcy5mcmFtZUxvYWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2ltdWxhdGVkRG9jKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50O1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgaWYodGhpcy5zdmdSZW5kZXIpIHtcclxuICAgICAgdGhpcy5zdmdSZW5kZXIudG9TdmcodGhpcy5zaW11bGF0b3IuZWxlbWVudCwge2hlaWdodDogdGhpcy5oZWlnaHQrJ3B4Jywgd2lkdGg6IHRoaXMud2lkdGgrJ3B4J30pXHJcbiAgICAgICAgLnRoZW4oKGRhdGFVcmwpPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbWFnZS5zcmMgPSBkYXRhVXJsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnJvcik9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEb20ySW1hZ2U6ICcsIGVycm9yKTtcclxuICAgICAgICAgIHRoaXMucmVuZGVyQmxhbmtQYWdlKCk7XHJcbiAgICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGh0bWwyY2FudmFzKHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LmJvZHksIHt0aW1lb3V0OiAzMDAwMH0pLlxyXG4gICAgICAgIHRoZW4oKGNhbnZhcyk9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlckltYWdlKGNhbnZhcyk7XHJcbiAgICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICQodGhpcy5pbWFnZSkub2ZmKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpO1xyXG4gICAgJCh0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cpLm9mZignbG9hZCcsIHRoaXMuYmluZHMuZnJhbWVMb2FkKTtcclxuICAgICQodGhpcy5kb2MuYm9keSkuZmluZCgnIycrdGhpcy5pSWQpLnJlbW92ZSgpO1xyXG4gICAgaWYodGhpcy5pbWFnZSkge1xyXG4gICAgICB0aGlzLmltYWdlLnNyYyA9ICcnO1xyXG4gICAgICBkZWxldGUgdGhpcy5pbWFnZTtcclxuICAgIH1cclxuICAgIHRoaXMuZnJhbWUuc3JjID0gJyc7XHJcbiAgICBkZWxldGUgdGhpcy5mcmFtZTtcclxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHNpbXVsYXRlKGUsIGRvYywgeCwgeSkge1xyXG4gICAgaWYodGhpcy5zaW11bGF0b3IpIHtcclxuICAgICAgdGhpcy5zaW11bGF0b3Iuc2ltdWxhdGUoZSwgZG9jLCB4LCB5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0ludGVyYWN0aXZlSW1hZ2UuanMiLCJpbXBvcnQgeyQsIHRyfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEdyYXBoVXRpbHMgZnJvbSAnLi9HcmFwaFV0aWxzJztcclxuaW1wb3J0IE1hdGhVdGlscyBmcm9tICcuL01hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2FkaW5nQW5pbWF0aW9uIHtcclxuXHJcbiAgZHkodCx5KSB7XHJcbiAgICBjb25zdCB3PXlbMF0sIGE9eVsxXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIC10aGlzLmcqTWF0aC5jb3MoYSksXHJcbiAgICAgIHdcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBpbnRlZ3JhdGUoVCkge1xyXG4gICAgbGV0IHQ9MCwgZHQ9dGhpcy5wLmR0LCBvcyA9IHRoaXMub3M7XHJcbiAgICB3aGlsZSh0PFQpIHtcclxuICAgICAgaWYodCtkdD5UKSB7XHJcbiAgICAgICAgZHQ9VC10O1xyXG4gICAgICB9XHJcbiAgICAgIG9zPU1
13345hdGhVdGlscy5yazQodGhpcy5keS5iaW5kKHtnOiB0aGlzLnAuZ30pLCAwLCBkdCwgb3MpO1xyXG4gICAgICB0Kz1kdDtcclxuICAgIH1cclxuICAgIHJldHVybiBvcztcclxuICB9XHJcblxyXG4gIGNhbGNUaW1lVG8odGFyZ2V0KSB7XHJcbiAgICBsZXQgdD0wLCBkdD10aGlzLnAuZHQsIG9zID0gdGhpcy5vcztcclxuICAgIHdoaWxlKE1hdGguYWJzKG9zWzFdLXRhcmdldCk+MWUtNCkge1xyXG4gICAgICBjb25zdCBub3M9TWF0aFV0aWxzLnJrNCh0aGlzLmR5LmJpbmQoe2c6IHRoaXMucC5nfSksIDAsIGR0LCBvcyk7XHJcbiAgICAgIGlmKG5vc1swXTwwICYmIG5vc1sxXTx0YXJnZXQgfHwgbm9zWzBdPjAgJiYgbm9zWzFdPnRhcmdldCkge1xyXG4gICAgICAgIGR0Lz0yO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIG9zID0gbm9zO1xyXG4gICAgICAgIHQrPWR0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShUKSB7XHJcbiAgICB0aGlzLm9zID0gdGhpcy5pbnRlZ3JhdGUoVCk7XHJcblxyXG4gICAgdGhpcy50Kz1UXHJcbiAgICBpZih0aGlzLnQ+PXRoaXMucC51cGRhdGVJbnRlcnZhbCkge1xyXG4gICAgICB0aGlzLnQgPSAwO1xyXG4gICAgICBjb25zdCByID0gMC4wNipNYXRoLm1pbih0aGlzLmMud2lkdGgsIHRoaXMuYy5oZWlnaHQpLFxyXG4gICAgICAgICAgICBhID0gdGhpcy5vc1sxXSxcclxuICAgICAgICAgICAgeDAgPSAwLjUqdGhpcy5jLndpZHRoLFxyXG4gICAgICAgICAgICB5MCA9IDAuNSp0aGlzLmMuaGVpZ2h0LFxyXG4gICAgICAgICAgICBjdHggPSB0aGlzLmN0eDtcclxuXHJcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jLndpZHRoLCB0aGlzLmMuaGVpZ2h0KTtcclxuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKHRoaXMucC5jb2xvciwxKTtcclxuICAgICAgY3R4LnJlY3QoMCwgMCwgdGhpcy5jLndpZHRoLCB0aGlzLmMuaGVpZ2h0KTtcclxuICAgICAgY3R4LmZpbGwoKTtcclxuXHJcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgY3R4LnNoYWRvd0JsdXIgPSA1MDtcclxuICAgICAgY3R4LmZpbGxTdHlsZSA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYShHcmFwaFV0aWxzLmludmVyc2VDb2xvcih0aGlzLnAuY29sb3IsMC45KSxNYXRoLmFicyh0aGlzLm9zWzBdLzYuMzYpKTtcclxuICAgICAgY3R4LnNoYWRvd0NvbG9yID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKHRoaXMucC5jb2xvciwxKSwwLjkpO1xyXG4gICAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDA7XHJcbiAgICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gMDtcclxuICAgICAgY3R4LmZvbnQ9J2JvbGQgJytNYXRoLnJvdW5kKDAuMjUqcikrJ3B4IEFyaWFsJztcclxuICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XHJcbiAgICAgIGN0eC5maWxsVGV4dCh0cignTG9hZGluZy4uLicpLHgwLHkwKTtcclxuXHJcbiAgICAgIGNvbnN0IHBzID0gMTAsIGRhPTIqTWF0aC5QSS9wczsvLzIuNSpfci9yXHJcbiAgICAgIGN0eC5zaGFkb3dDb2xvciA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYShHcmFwaFV0aWxzLmludmVyc2VDb2xvcih0aGlzLnAuY29sb3IsMSksMC43KTtcclxuICAgICAgZm9yKGxldCBpPTAsIF9hPWEsIF9yPTAuMipyOyBpPHBzOyArK2ksIF9yKj0wLjksIF9hKz1kYSkge1xyXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKHRoaXMucC5jb2xvciwocHMtaSkvcHMpLDAuNyoocHMtaSkvcHMpO1xyXG4gICAgICAgIGNvbnN0IGN4PXgwK3IqTWF0aC5jb3MoX2EpLCBjeT15MC1yKk1hdGguc2luKF9hKSwgbng9eDArcipNYXRoLmNvcyhfYStkYSksIG55PXkwLXIqTWF0aC5zaW4oX2ErZGEpO1xyXG4gICAgICAgIGN0eC5zaGFkb3dPZmZzZXRYID0gMC4yKihueC1jeCk7XHJcbiAgICAgICAgY3R4LnNoYWRvd09mZnNldFkgPSAwLjIqKG55LWN5KTtcclxuICAgICAgICBjdHguYXJjKGN4LCBjeSwgX3IsIDAsIE1hdGguUEkqMiwgMSk7XHJcbiAgICAgICAgY3R4LmZpbGwoKTtcclxuICAgICAgfVxyXG4gICAgICBpZih0aGlzLm9uQ2hhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmMsIHRoaXMucC5jb2xvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEltYWdlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYztcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmMud2lkdGggPSAwO1xyXG4gICAgdGhpcy5jLmhlaWdodCA9IDA7XHJcbiAgICBkZWxldGUgdGhpcy5jdHg7XHJcbiAgICBkZWxldGUgdGhpcy5jO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU3ByaXRlKG4pIHtcclxuICAgIGNvbnN0IGMgPSAkKCc8Y2FudmFzIHdpZHRoPVwiJyt0aGlzLmMud2lkdGgqbisnXCIgaGVpZ2h0PVwiJyt0aGlzLmMuaGVpZ2h0KydcIj48L2NhbnZhcz4nKVswXSwgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpLFxyXG4gICAgdCA9IHRoaXMuY2FsY1RpbWVUbyh0aGlzLm9zWzFdK01hdGguc2lnbih0aGlzLm9zWzBdKSoyKk1hdGguUEkpLCBkdD10LyhuKzEpO1xyXG4gICAgY29uc3Qge3VwZGF0ZUludGVydmFsfSA9IHRoaXMucDtcclxuICAgIHRoaXMucC51cGRhdGVJbnRlcnZhbCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxuOyArK2kpIHtcclxuICAgICAgdGhpcy51cGRhdGUoZHQpO1xyXG4gICAgICBjdHguZHJhd0ltYWdlKHRoaXMuYywgaSp0aGlzLmMud2lkdGgsIDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wLnVwZGF0ZUludGVydmFsID0gdXBkYXRlSW50ZXJ2YWw7XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIGNvbG9yKSB7XHJcbiAgICBjb25zdCBqQyA9ICQoJzxjYW52YXMgd2lkdGg9XCInK3dpZHRoKydcIiBoZWlnaHQ9XCInK2hlaWdodCsnXCI+PC9jYW52YXM+Jyk7XHJcbiAgICB0aGlzLmMgPSBqQ1swXTtcclxuICAgIHRoaXMucCA9IHtcclxuICAgICAgZzogOS44LFxyXG4gICAgICBkdDogMS82MCxcclxuICAgICAgY29sb3IsXHJcbiAgICAgIHVwZGF0ZUludGVydmFsOiAwLjI1XHJcbiAgICB9O1xyXG4gICAgdGhpcy5jdHggPSB0aGlzLmMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIHRoaXMub3MgPSBbLTIsIE1hdGguUEkvMl07XHJcbiAgICB0aGlzLnQgPSB0aGlzLnAudXBkYXRlSW50ZXJ2YWw7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQW5pbWF0aW9uLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvYWRpbmdDb250cm9sbGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iodmlldywgc2hvd1Byb2dyZXNzPXRydWUsIGxvYWRpbmdNc2c9dW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xyXG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICB0aGlzLnNob3dQcm9ncmVzcyA9IHNob3dQcm9ncmVzcztcclxuICAgIHRoaXMuZ2V0TG9hZGluZ01zZyA9IGxvYWRpbmdNc2cgfHwgTG9hZGluZ0NvbnRyb2xsZXIuZGVmYXVsdExvYWRpbmdNc2c7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWZh
13345dWx0TG9hZGluZ01zZyhwcm9ncmVzcykge1xyXG4gICAgcmV0dXJuIFsnUGxlYXNlIHdhaXQuLi4gdGhlIEFwcGxpY2F0aW9uIGlzIExvYWRpbmc6ICcsIHByb2dyZXNzLCAnJSddLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuc2hvd1Byb2dyZXNzID0gZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICAgIGRlbGV0ZSB0aGlzLnZpZXc7XHJcbiAgfVxyXG5cclxuICBzZXRQcm9ncmVzcyh2KSB7XHJcbiAgICB0aGlzLnByb2dyZXNzID0gdjtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIGlmKHRoaXMudmlldykge1xyXG5cclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd3aWRMb2FkaW5nUHJvZ3Jlc3MnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuc2hvd1Byb2dyZXNzLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3R4dExvYWRpbmdQcm9ncmVzcycsIHtcclxuICAgICAgICB2YWx1ZTogdGhpcy5nZXRMb2FkaW5nTXNnKHRoaXMucHJvZ3Jlc3MpLFxyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBmb3IobGV0IG5hbWUgb2YgdGhpcy52aWV3LmdldExpbmtzKCkpIHtcclxuICAgICAgICB0aGlzLnZpZXcuc2V0U3RhdGUobmFtZSwge1xyXG4gICAgICAgICAgZW5hYmxlOiBmYWxzZSxcclxuICAgICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnaW5wUGFnZXMnLCB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ2lucFBhZ2UnLCB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBlbmFibGU6IGZhbHNlLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQ29udHJvbGxlci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBFdmVudENvbnZlcnRlciBmcm9tICcuL0V2ZW50Q29udmVydGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vdXNlRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHduZCwgZG9jLCBlbGVtZW50KSB7XHJcbiAgICBzdXBlcih3bmQsIGRvYyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIGNvbnZlcnQ6IHRoaXMuY29udmVydC5iaW5kKHRoaXMpXHJcbiAgICB9O1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9uKCdtb3VzZW1vdmUgbW91c2Vkb3duIG1vdXNlb3ZlciBtb3VzZW91dCBjbGljaycsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgICAkKHRoaXMuZG9jKS5vbignbW91c2V1cCcsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9mZignbW91c2Vtb3ZlIG1vdXNlZG93biBtb3VzZW92ZXIgbW91c2VvdXQgY2xpY2snLCB0aGlzLmJpbmRzLmNvbnZlcnQpO1xyXG4gICAgJCh0aGlzLmRvYykub2ZmKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvTW91c2VFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgTWF0aFV0aWxzIGZyb20gJy4vTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9iamVjdDNEV2F0Y2hlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgYm91bmRCb3hDbGIsIHRlc3RTY2FsZT10aGlzLnRlc3RTY2FsZSkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLmJvdW5kQm94Q2xiID0gYm91bmRCb3hDbGI7XHJcbiAgICB0aGlzLnRlc3RTY2FsZSA9IHRlc3RTY2FsZTtcclxuICAgIHRoaXMuY2FtZXJhID0gdmlzdWFsLmNhbWVyYTtcclxuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMudmlzdWFsLmVsZW1lbnQ7XHJcbiAgICB0aGlzLmVsZW1lbnRTaXplID0ge3c6IDEsIGg6IDF9O1xyXG4gICAgdGhpcy5kZXZpY2VQaXhlbFJhdGlvID0gdGhpcy52aXN1YWwud25kLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcclxuICAgIHRoaXMub3JiaXQgPSB2aXN1YWwuZ2V0T3JiaXQoKTtcclxuICAgIHRoaXMuc2NhbGUgPSAxO1xyXG5cclxuICAgIHRoaXMuZXBzID0gMWUtNDtcclxuICAgIHRoaXMudiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICB0aGlzLmR2ID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuXHJcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICB2aXN1YWwuYWRkUmVuZGVyQ2FsbGJhY2sodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgdGhpcy5vcyA9IHtcclxuICAgICAgdng6IDAsXHJcbiAgICAgIHZ5OiAwLFxyXG4gICAgICB4OiAwLFxyXG4gICAgICB5OiAwXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcmJpdC51cGRhdGUoKTtcclxuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcbiAgICBsZXQgYm94ID0gdGhpcy5jb21wdXRlQ2xpZW50Qm91bmRCb3goKSwgaz0xLjExO1xyXG4gICAgdGhpcy5tb3ZlUGFuKHt4OiAtaypib3gubWlkLngsIHk6IC1rKmJveC5taWQueX0pO1xyXG4gIH1cclxuXHJcbiAgbW92ZVBhbihkdikge1xyXG4gICAgdGhpcy5vcmJpdC5wYW4oZHYueCp0aGlzLnZpc3VhbC53aWR0aCgpLCAtZHYueSp0aGlzLnZpc3VhbC5oZWlnaHQoKSk7XHJcbiAgfVxyXG5cclxuICB2VG9DYW1lcmEodikge1xyXG4gICAgdi5wcm9qZWN0KHRoaXMuY2FtZXJhKTtcclxuICAgIHJldHVybi
13345B7XHJcbiAgICAgIHg6IDAuNSp2LngsXHJcbiAgICAgIHk6IDAuNSp2LnlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb21wdXRlQ2xpZW50Qm91bmRCb3goKSB7XHJcbiAgICBjb25zdCBib3ggPSB0aGlzLmJvdW5kQm94Q2xiKCksXHJcbiAgICAgIHhzID0gW2JveC5taW4ueCwgYm94Lm1heC54XSxcclxuICAgICAgeXMgPSBbMCwgMF0sXHJcbiAgICAgIHpzID0gW2JveC5taW4ueiwgYm94Lm1heC56XTtcclxuXHJcbiAgICBjb25zdCBwcyA9IFtdLCByZXMgPSB7bWF4OiB7fSwgbWluOiB7fX07XHJcbiAgICBmb3IobGV0IHggb2YgeHMpIHtcclxuICAgICAgZm9yKGxldCB5IG9mIHlzKSB7XHJcbiAgICAgICAgZm9yKGxldCB6IG9mIHpzKSB7XHJcbiAgICAgICAgICBwcy5wdXNoKHRoaXMudlRvQ2FtZXJhKHRoaXMudi5zZXQoeCx5LHopKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHMuc29ydCgocDEsIHAyKT0+IHAxLngtcDIueCk7XHJcbiAgICByZXMubWluLnggPSBwc1swXS54O1xyXG4gICAgcmVzLm1heC54ID0gcHNbcHMubGVuZ3RoLTFdLng7XHJcbiAgICBwcy5zb3J0KChwMSwgcDIpPT4gcDEueS1wMi55KTtcclxuICAgIHJlcy5taW4ueSA9IHBzWzBdLnk7XHJcbiAgICByZXMubWF4LnkgPSBwc1twcy5sZW5ndGgtMV0ueTtcclxuXHJcbiAgICByZXMud2lkdGggPSByZXMubWF4LngtcmVzLm1pbi54O1xyXG4gICAgcmVzLmhlaWdodCA9IHJlcy5tYXgueS1yZXMubWluLnk7XHJcblxyXG4gICAgcmVzLm1pZCA9IHtcclxuICAgICAgeDogMC41KihyZXMubWF4LngrcmVzLm1pbi54KSxcclxuICAgICAgeTogMC41KihyZXMubWF4LnkrcmVzLm1pbi55KVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc2V0T2JqZWN0KGJvdW5kQm94Q2xiKSB7XHJcbiAgICB0aGlzLmJvdW5kQm94Q2xiID0gYm91bmRCb3hDbGI7XHJcbiAgfVxyXG5cclxuICB0ZXN0U2NhbGUoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNvbXB1dGVDb3JyKEssIG1pbiwgbWF4KSB7XHJcbiAgICBsZXQgY29yciA9IDA7XHJcbiAgICBpZihLPDEpIHtcclxuICAgICAgaWYobWluPi0wLjUpIHtcclxuICAgICAgICBjb3JyID0gLTAuNS1taW47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihtYXg8MC41KSB7XHJcbiAgICAgICAgY29yciA9IDAuNS1tYXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZihtaW48LTAuNSkge1xyXG4gICAgICAgIGNvcnIgPSAtMC41LW1pbjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKG1heD4wLjUpIHtcclxuICAgICAgICBjb3JyID0gMC41LW1heDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnI7XHJcbiAgfVxyXG5cclxuICBnZXRTY2FsZSgpIHtcclxuICAgIGNvbnN0IGJveCA9IHRoaXMuY29tcHV0ZUNsaWVudEJvdW5kQm94KCksXHJcbiAgICAgIEt4ID0gdGhpcy5lbGVtZW50U2l6ZS53L2JveC53aWR0aCxcclxuICAgICAgS3kgPSB0aGlzLmVsZW1lbnRTaXplLmgvYm94LmhlaWdodDtcclxuICAgIHJldHVybiAxL01hdGgubWluKEt4LCBLeSk7XHJcbiAgfVxyXG5cclxuICBjZW50ZXJWaWV3KFQpIHtcclxuICAgIGxldCBib3ggPSB0aGlzLmNvbXB1dGVDbGllbnRCb3VuZEJveCgpLFxyXG4gICAgICBLeCA9IHRoaXMuZWxlbWVudFNpemUudy9ib3gud2lkdGgsXHJcbiAgICAgIEt5ID0gdGhpcy5lbGVtZW50U2l6ZS5oL2JveC5oZWlnaHQsXHJcbiAgICAgIEsgPSBNYXRoLm1pbihLeCwgS3kpO1xyXG5cclxuICAgIGlmKHRoaXMudGVzdFNjYWxlKCkgJiYgTWF0aC5hYnMoMS9LLXRoaXMuc2NhbGUpPnRoaXMuZXBzKSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gMS9LKzAuMioodGhpcy5zY2FsZS0xL0spO1xyXG4gICAgICB0aGlzLm9yYml0LnNldFNjYWxlKHRoaXMub3JiaXQuZ2V0U2NhbGUoKS8oSypzY2FsZSkpO1xyXG4gICAgICB0aGlzLm9yYml0LnVwZGF0ZSgpO1xyXG4gICAgICB0aGlzLmNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgICBib3ggPSB0aGlzLmNvbXB1dGVDbGllbnRCb3VuZEJveCgpO1xyXG4gICAgICAgIEt4ID0gdGhpcy5lbGVtZW50U2l6ZS53L2JveC53aWR0aDtcclxuICAgICAgICBLeSA9IHRoaXMuZWxlbWVudFNpemUuaC9ib3guaGVpZ2h0O1xyXG4gICAgICAgIEsgPSBNYXRoLm1pbihLeCwgS3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR2ID0gdGhpcy5kdjtcclxuICAgIGlmKEs+MS10aGlzLmVwcykge1xyXG4gICAgICBkdi5zZXQoLWJveC5taWQueCwgLWJveC5taWQueSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZHYuc2V0KHRoaXMuY29tcHV0ZUNvcnIoS3gsIGJveC5taW4ueCwgYm94Lm1heC54KSxcclxuICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUNvcnIoS3ksIGJveC5taW4ueSwgYm94Lm1heC55KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoTWF0aC5zcXJ0KHRoaXMub3MudngqdGhpcy5vcy52eCt0aGlzLm9zLnZ5KnRoaXMub3MudnkpPjAuMDAzIHx8IGR2Lmxlbmd0aCgpPjAuMDAzKSB7XHJcbiAgICAgIGxldCBkdCA9IDEvNjAsIHQ9MCwgb3MgPSB7XHJcbiAgICAgICAgLi4udGhpcy5vcyxcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDBcclxuICAgICAgfTtcclxuICAgICAgb3MudGYgPSAodngsIHZ5LCB4LCB5KT0+ICh7XHJcbiAgICAgICAgeDogNzUqKGR2LngteCkvTWF0aC5wb3codGhpcy5kZXZpY2VQaXhlbFJhdGlvLCAxLjApLFxyXG4gICAgICAgIHk6IDc1Kihkdi55LXkpL01hdGgucG93KHRoaXMuZGV2aWNlUGl4ZWxSYXRpbywgMS4wKVxyXG4gICAgICB9KTtcclxuICAgICAgd2hpbGUodDxUKSB7XHJcbiAgICAgICAgaWYodCtkdD5UKSB7XHJcbiAgICAgICAgICBkdCA9IFQtdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3MgPSB0aGlzLmludGVncmF0ZShvcywgZHQpO1xyXG4gICAgICAgIHQgKz0gZHQ7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb3ZlUGFuKG9zKTtcclxuICAgICAgdGhpcy5vcyA9IG9zO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW50ZWdyYXRlKG9zLCBkdCkge1xyXG4gICAgY29uc3QgW3Z4LCB2eSwgeCwgeV0gPSBNYXRoVXRpbHMucms0KFxyXG4gICAgICB0aGlzLmR5LmJpbmQob3MpLFxyXG4gICAgICAwLFxyXG4gICAgICBkdCxcclxuICAgICAgW29zLnZ4LCBvcy52eSwgb3MueCwgb3MueV1cclxuICAgICk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5vcyxcclxuICAgICAgdngsIHZ5LCB4LCB5XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZHkodCxZKSB7XHJcbiAgICBjb25zdCBbdngsIHZ5LCB4LCB5XSA9IFksIHZkID0gMTUsIHRmID0gdGhpcy50Zih2eCwgdnksIHgsIHkpO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgdGYueC12ZCp2eCxcclxuICAgICAgdGYueS12ZCp2eSxcclxuICAgICAgdngsXHJcbiAgICAgIHZ5XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGR0KSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQgJiYgdGhpcy5ib3VuZEJveENsYikge1xyXG4gICAgICB0aGlzLmNlbnRlclZpZXcoZHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvT2JqZWN0M0RXYXRjaGVyLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPcmJpdCBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9iamVjdCwgZG9tRWxlbWVudCkge1xyXG4gICAgc3VwZXIoKTtcclxuICBcdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xyXG4gIFx0dGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xyXG5cclxuICBcdC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbFxyXG4gIFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgXHQvLyBcInRhcmdldFwiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmRcclxuICBcdHRoaXMudGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuXHJcbiAgXHQvLyBIb3cgZmFyIHlvdSBjYW4gZG9sbHkgaW4gYW5kIG91dChQZXJzcG
13345VjdGl2ZUNhbWVyYSBvbmx5KVxyXG4gIFx0dGhpcy5taW5EaXN0YW5jZSA9IDA7XHJcbiAgXHR0aGlzLm1heERpc3RhbmNlID0gSW5maW5pdHk7XHJcblxyXG4gIFx0Ly8gSG93IGZhciB5b3UgY2FuIHpvb20gaW4gYW5kIG91dChPcnRob2dyYXBoaWNDYW1lcmEgb25seSlcclxuICBcdHRoaXMubWluWm9vbSA9IDA7XHJcbiAgXHR0aGlzLm1heFpvb20gPSBJbmZpbml0eTtcclxuXHJcbiAgXHQvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgdmVydGljYWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cclxuICBcdC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxyXG4gIFx0dGhpcy5taW5Qb2xhckFuZ2xlID0gMDsgLy8gcmFkaWFuc1xyXG4gIFx0dGhpcy5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSTsgLy8gcmFkaWFuc1xyXG5cclxuICBcdC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCBob3Jpem9udGFsbHksIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuXHJcbiAgXHQvLyBJZiBzZXQsIG11c3QgYmUgYSBzdWItaW50ZXJ2YWwgb2YgdGhlIGludGVydmFsIFstTWF0aC5QSSwgTWF0aC5QSSBdLlxyXG4gIFx0dGhpcy5taW5BemltdXRoQW5nbGUgPSAtSW5maW5pdHk7IC8vIHJhZGlhbnNcclxuICBcdHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcclxuXHJcbiAgXHQvLyBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgZGFtcGluZyAoaW5lcnRpYSlcclxuICBcdC8vIElmIGRhbXBpbmcgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXHJcbiAgXHR0aGlzLmVuYWJsZURhbXBpbmcgPSBmYWxzZTtcclxuICBcdHRoaXMuZGFtcGluZ0ZhY3RvciA9IDAuMjU7XHJcblxyXG4gIFx0Ly8gVGhpcyBvcHRpb24gYWN0dWFsbHkgZW5hYmxlcyBkb2xseWluZyBpbiBhbmQgb3V0OyBsZWZ0IGFzIFwiem9vbVwiIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cclxuICBcdC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHpvb21pbmdcclxuICBcdHRoaXMuZW5hYmxlWm9vbSA9IHRydWU7XHJcbiAgXHR0aGlzLnpvb21TcGVlZCA9IDEuMDtcclxuXHJcbiAgXHQvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSByb3RhdGluZ1xyXG4gIFx0dGhpcy5lbmFibGVSb3RhdGUgPSB0cnVlO1xyXG4gIFx0dGhpcy5yb3RhdGVTcGVlZCA9IDEuMDtcclxuXHJcbiAgXHQvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBwYW5uaW5nXHJcbiAgXHR0aGlzLmVuYWJsZVBhbiA9IHRydWU7XHJcblxyXG4gIFx0Ly8gU2V0IHRvIHRydWUgdG8gYXV0b21hdGljYWxseSByb3RhdGUgYXJvdW5kIHRoZSB0YXJnZXRcclxuICBcdC8vIElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxyXG4gIFx0dGhpcy5hdXRvUm90YXRlID0gZmFsc2U7XHJcbiAgXHR0aGlzLmF1dG9Sb3RhdGVTcGVlZCA9IDIuMDsgLy8gMzAgc2Vjb25kcyBwZXIgcm91bmQgd2hlbiBmcHMgaXMgNjBcclxuXHJcbiAgXHQvLyBmb3IgcmVzZXRcclxuICBcdHRoaXMudGFyZ2V0MCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7XHJcbiAgXHR0aGlzLnBvc2l0aW9uMCA9IHRoaXMub2JqZWN0LnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgXHR0aGlzLnpvb20wID0gdGhpcy5vYmplY3Quem9vbTtcclxuXHJcbiAgXHQvL1xyXG4gIFx0Ly8gcHVibGljIG1ldGhvZHNcclxuICBcdC8vXHJcbiAgXHR0aGlzLmdldFBvbGFyQW5nbGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgXHRcdHJldHVybiBzcGhlcmljYWwucGhpO1xyXG4gIFx0fTtcclxuXHJcbiAgXHR0aGlzLmdldEF6aW11dGhhbEFuZ2xlID0gZnVuY3Rpb24gKCkge1xyXG4gIFx0XHRyZXR1cm4gc3BoZXJpY2FsLnRoZXRhO1xyXG4gIFx0fTtcclxuXHJcbiAgXHR0aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gIFx0XHRzY29wZS50YXJnZXQuY29weShzY29wZS50YXJnZXQwKTtcclxuICBcdFx0c2NvcGUub2JqZWN0LnBvc2l0aW9uLmNvcHkoc2NvcGUucG9zaXRpb24wKTtcclxuICBcdFx0c2NvcGUub2JqZWN0Lnpvb20gPSBzY29wZS56b29tMDtcclxuXHJcbiAgXHRcdHNjb3BlLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcbiAgXHRcdHNjb3BlLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG5cclxuICBcdFx0c2NvcGUudXBkYXRlKCk7XHJcbiAgXHR9O1xyXG5cclxuICAgIHRoaXMuem9vbU91dCA9IGZ1bmN0aW9uKHNwZWVkPXRoaXMuem9vbVNwZWVkKSB7XHJcbiAgICAgIGNvbnN0IF9zcGVlZCA9IHRoaXMuem9vbVNwZWVkO1xyXG4gICAgICB0aGlzLnpvb21TcGVlZCA9IHNwZWVkO1xyXG4gICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgdGhpcy56b29tU3BlZWQgPSBfc3BlZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuem9vbUluID0gZnVuY3Rpb24oc3BlZWQ9dGhpcy56b29tU3BlZWQpIHtcclxuICAgICAgY29uc3QgX3NwZWVkID0gdGhpcy56b29tU3BlZWQ7XHJcbiAgICAgIHRoaXMuem9vbVNwZWVkID0gc3BlZWQ7XHJcbiAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgdGhpcy56b29tU3BlZWQgPSBfc3BlZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0U2NhbGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0U2NhbGUgPSBmdW5jdGlvbihuZXdTY2FsZSkge1xyXG4gICAgICBzY2FsZSA9IG5ld1NjYWxlO1xyXG4gICAgfVxyXG5cclxuICBcdC8vIHRoaXMgbWV0aG9kIGlzIGV4cG9zZWQsIGJ1dCBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBjYW4gbWFrZSBpdCBwcml2YXRlLi4uXHJcbiAgXHR0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gIFx0XHR2YXIgb2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdFx0Ly8gc28gY2FtZXJhLnVwIGlzIHRoZSBvcmJpdCBheGlzXHJcbiAgXHRcdHZhciBxdWF0ID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMob2JqZWN0LnVwLCBuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSk7XHJcbiAgXHRcdHZhciBx
13345dWF0SW52ZXJzZSA9IHF1YXQuY2xvbmUoKS5pbnZlcnNlKCk7XHJcbiAgXHRcdHZhciBsYXN0UG9zaXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHR2YXIgbGFzdFF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG5cclxuICBcdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XHJcbiAgXHRcdFx0dmFyIHBvc2l0aW9uID0gc2NvcGUub2JqZWN0LnBvc2l0aW9uO1xyXG4gIFx0XHRcdG9mZnNldC5jb3B5KHBvc2l0aW9uKS5zdWIoc2NvcGUudGFyZ2V0KTtcclxuICBcdFx0XHQvLyByb3RhdGUgb2Zmc2V0IHRvIFwieS1heGlzLWlzLXVwXCIgc3BhY2VcclxuICBcdFx0XHRvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXQpO1xyXG4gIFx0XHRcdC8vIGFuZ2xlIGZyb20gei1heGlzIGFyb3VuZCB5LWF4aXNcclxuICBcdFx0XHRzcGhlcmljYWwuc2V0RnJvbVZlY3RvcjMob2Zmc2V0KTtcclxuICBcdFx0XHRpZihzY29wZS5hdXRvUm90YXRlKSB7XHJcbiAgXHRcdFx0XHRyb3RhdGVMZWZ0KGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCkpO1xyXG4gIFx0XHRcdH1cclxuICBcdFx0XHRzcGhlcmljYWwudGhldGEgKz0gc3BoZXJpY2FsRGVsdGEudGhldGE7XHJcbiAgXHRcdFx0c3BoZXJpY2FsLnBoaSArPSBzcGhlcmljYWxEZWx0YS5waGk7XHJcbiAgXHRcdFx0Ly8gcmVzdHJpY3QgdGhldGEgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xyXG4gIFx0XHRcdHNwaGVyaWNhbC50aGV0YSA9IE1hdGgubWF4KHNjb3BlLm1pbkF6aW11dGhBbmdsZSwgTWF0aC5taW4oc2NvcGUubWF4QXppbXV0aEFuZ2xlLCBzcGhlcmljYWwudGhldGEpKTtcclxuICBcdFx0XHQvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xyXG4gIFx0XHRcdHNwaGVyaWNhbC5waGkgPSBNYXRoLm1heChzY29wZS5taW5Qb2xhckFuZ2xlLCBNYXRoLm1pbihzY29wZS5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKSk7XHJcbiAgXHRcdFx0c3BoZXJpY2FsLm1ha2VTYWZlKCk7XHJcbiAgXHRcdFx0c3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTtcclxuICBcdFx0XHQvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xyXG4gIFx0XHRcdHNwaGVyaWNhbC5yYWRpdXMgPSBNYXRoLm1heChzY29wZS5taW5EaXN0YW5jZSwgTWF0aC5taW4oc2NvcGUubWF4RGlzdGFuY2UsIHNwaGVyaWNhbC5yYWRpdXMpKTtcclxuICBcdFx0XHQvLyBtb3ZlIHRhcmdldCB0byBwYW5uZWQgbG9jYXRpb25cclxuICBcdFx0XHRzY29wZS50YXJnZXQuYWRkKHBhbk9mZnNldCk7XHJcbiAgXHRcdFx0b2Zmc2V0LnNldEZyb21TcGhlcmljYWwoc3BoZXJpY2FsKTtcclxuICBcdFx0XHQvLyByb3RhdGUgb2Zmc2V0IGJhY2sgdG8gXCJjYW1lcmEtdXAtdmVjdG9yLWlzLXVwXCIgc3BhY2VcclxuICBcdFx0XHRvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTtcclxuICBcdFx0XHRwb3NpdGlvbi5jb3B5KHNjb3BlLnRhcmdldCkuYWRkKG9mZnNldCk7XHJcbiAgXHRcdFx0c2NvcGUub2JqZWN0Lmxvb2tBdChzY29wZS50YXJnZXQpO1xyXG5cclxuICBcdFx0XHRpZihzY29wZS5lbmFibGVEYW1waW5nPT09dHJ1ZSkge1xyXG4gIFx0XHRcdFx0c3BoZXJpY2FsRGVsdGEudGhldGEgKj0oMS1zY29wZS5kYW1waW5nRmFjdG9yKTtcclxuICBcdFx0XHRcdHNwaGVyaWNhbERlbHRhLnBoaSAqPSgxLXNjb3BlLmRhbXBpbmdGYWN0b3IpO1xyXG4gIFx0XHRcdH0gZWxzZSB7XHJcbiAgXHRcdFx0XHRzcGhlcmljYWxEZWx0YS5zZXQoMCwgMCwgMCk7XHJcbiAgXHRcdFx0fVxyXG5cclxuICBcdFx0XHRzY2FsZSA9IDE7XHJcbiAgXHRcdFx0cGFuT2Zmc2V0LnNldCgwLCAwLCAwKTtcclxuXHJcbiAgXHRcdFx0Ly8gdXBkYXRlIGNvbmRpdGlvbiBpczpcclxuICBcdFx0XHQvLyBtaW4oY2FtZXJhIGRpc3BsYWNlbWVudCwgY2FtZXJhIHJvdGF0aW9uIGluIHJhZGlhbnMpXjIgPiBFUFNcclxuICBcdFx0XHQvLyB1c2luZyBzbWFsbC1hbmdsZSBhcHByb3hpbWF0aW9uIGNvcyh4LzIpID0gMS14XjIgLyA4XHJcblxyXG4gIFx0XHRcdGlmKHpvb21DaGFuZ2VkIHx8XHJcbiAgXHRcdFx0XHRsYXN0UG9zaXRpb24uZGlzdGFuY2VUb1NxdWFyZWQoc2NvcGUub2JqZWN0LnBvc2l0aW9uKSA+IEVQUyB8fFxyXG4gIFx0XHRcdFx0OCAqKDEtbGFzdFF1YXRlcm5pb24uZG90KHNjb3BlLm9iamVjdC5xdWF0ZXJuaW9uKSkgPiBFUFMpIHtcclxuXHJcbiAgXHRcdFx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuXHJcbiAgXHRcdFx0XHRsYXN0UG9zaXRpb24uY29weShzY29wZS5vYmplY3QucG9zaXRpb24pO1xyXG4gIFx0XHRcdFx0bGFzdFF1YXRlcm5pb24uY29weShzY29wZS5vYmplY3QucXVhdGVybmlvbik7XHJcbiAgXHRcdFx0XHR6b29tQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICBcdFx0XHRcdHJldHVybiB0cnVlO1xyXG4gIFx0XHRcdH1cclxuICBcdFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgXHRcdH07XHJcbiAgXHR9KCk7XHJcblxyXG4gICAgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgXHQvL1xyXG4gIFx0Ly8gaW50ZXJuYWxzXHJcbiAgXHQvL1xyXG4gIFx0dmFyIHNjb3BlID0gdGhpcztcclxuICBcdHZhciBjaGFuZ2VFdmVudCA9IHsgdHlwZTogJ2NoYW5nZScgfTtcclxuICBcdHZhciBFUFMgPSAxZS02O1xyXG4gIFx0Ly8gY3VycmVudCBwb3NpdGlvbiBpbiBzcGhlcmljYWwgY29vcmRpbmF0ZXNcclxuICBcdHZhciBzcGhlcmljYWwgPSBuZXcgVEhSRUUuU3BoZXJpY2FsKCk7XHJcbiAgXHR2YXIgc3BoZXJpY2FsRGVsdGEgPSBuZXcgVEhSRUUuU3BoZXJpY2FsKCk7XHJcblxyXG4gIFx0dmFyIHNjYWxlID0gMTtcclxuICBcdHZhciBwYW5PZmZzZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0dmFyIHpvb21DaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gIFx0ZnVuY3Rpb24gZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSB7XHJcbiAgXHRcdHJldHVybiAyICogTWF0aC5QSSAvIDYwIC8gNjAgKiBzY29wZS5hdXRvUm90YXRlU3BlZWQ7XHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gZ2V0Wm9vbVNjYWxlKCkge1xyXG4gIFx0XHRyZXR1cm4gTWF0aC5wb3coMC45NSwgc2NvcGUuem9vbVNwZWVkKTtcclxuICBcdH1cclxuXHJcbiAgXHRmdW5jdGlvbiByb3RhdGVMZWZ0KGFuZ2xlKSB7XHJcbiAgXHRcdHNwaGVyaWNhbERlbHRhLnRoZXRhIC09IGFuZ2xlO1xyXG4gIFx0fVxyXG5cclxuICBcdGZ1bmN0aW9uIHJvdGF0ZVVwKGFuZ2xlKSB7XHJcbiAgXHRcdHNwaGVyaWNhbERlbHRhLnBoaSAtPSBhbmdsZTtcclxuICBcdH1cclxuXHJcbiAgXHR2YXIgcGFuTGVmdCA9IGZ1bmN0aW9uKCkge1xyXG4gIFx0XHR2YXIgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgXHRcdHJldHVybi
13345BmdW5jdGlvbiBwYW5MZWZ0KGRpc3RhbmNlLCBvYmplY3RNYXRyaXgpIHtcclxuICBcdFx0XHR2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsgLy8gZ2V0IFggY29sdW1uIG9mIG9iamVjdE1hdHJpeFxyXG4gIFx0XHRcdHYubXVsdGlwbHlTY2FsYXIoLSBkaXN0YW5jZSk7XHJcbiAgXHRcdFx0cGFuT2Zmc2V0LmFkZCh2KTtcclxuICBcdFx0fTtcclxuICBcdH0oKTtcclxuXHJcbiAgXHR2YXIgcGFuVXAgPSBmdW5jdGlvbigpIHtcclxuICBcdFx0dmFyIHYgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHRyZXR1cm4gZnVuY3Rpb24gcGFuVXAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkge1xyXG4gIFx0XHRcdHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpOyAvLyBnZXQgWSBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XHJcbiAgXHRcdFx0di5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSk7XHJcbiAgXHRcdFx0cGFuT2Zmc2V0LmFkZCh2KTtcclxuICBcdFx0fTtcclxuICBcdH0oKTtcclxuXHJcbiAgXHQvLyBkZWx0YVggYW5kIGRlbHRhWSBhcmUgaW4gcGl4ZWxzOyByaWdodCBhbmQgZG93biBhcmUgcG9zaXRpdmVcclxuICBcdHNjb3BlLnBhbiA9IGZ1bmN0aW9uKCkge1xyXG4gIFx0XHR2YXIgb2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdFx0cmV0dXJuIGZ1bmN0aW9uIHBhbihkZWx0YVgsIGRlbHRhWSkge1xyXG4gIFx0XHRcdHZhciBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudDtcclxuICBcdFx0XHRpZihzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG4gIFx0XHRcdFx0Ly8gcGVyc3BlY3RpdmVcclxuICBcdFx0XHRcdHZhciBwb3NpdGlvbiA9IHNjb3BlLm9iamVjdC5wb3NpdGlvbjtcclxuICBcdFx0XHRcdG9mZnNldC5jb3B5KHBvc2l0aW9uKS5zdWIoc2NvcGUudGFyZ2V0KTtcclxuICBcdFx0XHRcdHZhciB0YXJnZXREaXN0YW5jZSA9IG9mZnNldC5sZW5ndGgoKTtcclxuICBcdFx0XHRcdC8vIGhhbGYgb2YgdGhlIGZvdiBpcyBjZW50ZXIgdG8gdG9wIG9mIHNjcmVlblxyXG4gIFx0XHRcdFx0dGFyZ2V0RGlzdGFuY2UgKj0gTWF0aC50YW4oKHNjb3BlLm9iamVjdC5mb3YgLyAyKSAqIE1hdGguUEkgLyAxODAuMCk7XHJcbiAgXHRcdFx0XHQvLyB3ZSBhY3R1YWxseSBkb24ndCB1c2Ugc2NyZWVuV2lkdGgsIHNpbmNlIHBlcnNwZWN0aXZlIGNhbWVyYSBpcyBmaXhlZCB0byBzY3JlZW4gaGVpZ2h0XHJcbiAgXHRcdFx0XHRwYW5MZWZ0KDIgKiBkZWx0YVggKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4KTtcclxuICBcdFx0XHRcdHBhblVwKDIgKiBkZWx0YVkgKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4KTtcclxuICBcdFx0XHR9IGVsc2UgaWYoc2NvcGUub2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKSB7XHJcbiAgXHRcdFx0XHQvLyBvcnRob2dyYXBoaWNcclxuICBcdFx0XHRcdHBhbkxlZnQoZGVsdGFYICooc2NvcGUub2JqZWN0LnJpZ2h0LXNjb3BlLm9iamVjdC5sZWZ0KSAvIHNjb3BlLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRXaWR0aCwgc2NvcGUub2JqZWN0Lm1hdHJpeCk7XHJcbiAgXHRcdFx0XHRwYW5VcChkZWx0YVkgKihzY29wZS5vYmplY3QudG9wLXNjb3BlLm9iamVjdC5ib3R0b20pIC8gc2NvcGUub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCk7XHJcbiAgXHRcdFx0fSBlbHNlIHtcclxuICBcdFx0XHRcdC8vIGNhbWVyYSBuZWl0aGVyIG9ydGhvZ3JhcGhpYyBub3IgcGVyc3BlY3RpdmVcclxuICBcdFx0XHRcdGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlLXBhbiBkaXNhYmxlZC4nKTtcclxuICBcdFx0XHRcdHNjb3BlLmVuYWJsZVBhbiA9IGZhbHNlO1xyXG4gIFx0XHRcdH1cclxuICBcdFx0fTtcclxuICBcdH0oKTtcclxuXHJcbiAgXHRmdW5jdGlvbiBkb2xseUluKGRvbGx5U2NhbGUpIHtcclxuICAgICAgaWYoc2NvcGUub2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEpIHtcclxuICBcdFx0XHRzY2FsZSAvPSBkb2xseVNjYWxlO1xyXG4gIFx0XHR9IGVsc2UgaWYoc2NvcGUub2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKSB7XHJcbiAgXHRcdFx0c2NvcGUub2JqZWN0Lnpvb20gPSBNYXRoLm1heChzY29wZS5taW5ab29tLCBNYXRoLm1pbihzY29wZS5tYXhab29tLCBzY29wZS5vYmplY3Quem9vbSAqIGRvbGx5U2NhbGUpKTtcclxuICBcdFx0XHRzY29wZS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIFx0XHRcdHpvb21DaGFuZ2VkID0gdHJ1ZTtcclxuICBcdFx0fSBlbHNlIHtcclxuICBcdFx0XHRjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZS1kb2xseS96b29tIGRpc2FibGVkLicpO1xyXG4gIFx0XHRcdHNjb3BlLmVuYWJsZVpvb20gPSBmYWxzZTtcclxuICBcdFx0fVxyXG4gIFx0fVxyXG5cclxuICBcdGZ1bmN0aW9uIGRvbGx5T3V0KGRvbGx5U2NhbGUpIHtcclxuICAgICAgaWYoc2NvcGUub2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEpIHtcclxuICBcdFx0XHRzY2FsZSAqPSBkb2xseVNjYWxlO1xyXG4gIFx0XHR9IGVsc2UgaWYoc2NvcGUub2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKSB7XHJcbiAgXHRcdFx0c2NvcGUub2JqZWN0Lnpvb20gPSBNYXRoLm1heChzY29wZS5taW5ab29tLCBNYXRoLm1pbihzY29wZS5tYXhab29tLCBzY29wZS5vYmplY3Quem9vbSAvIGRvbGx5U2NhbGUpKTtcclxuICBcdFx0XHRzY29wZS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIFx0XHRcdHpvb21DaGFuZ2VkID0gdHJ1ZTtcclxuICBcdFx0fSBlbHNlIHtcclxuICBcdFx0XHRjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZS1kb2xseS96b29tIGRpc2FibGVkLicpO1xyXG4gIFx0XHRcdHNjb3BlLmVuYWJsZVpvb20gPSBmYWxzZTtcclxuICBcdFx0fVxyXG4gIFx0fVxyXG5cclxuICAgIC8qIEFjdGlvbnMgKi9cclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoZXZlbnQsIGRhdGEpIHtcclxuICAgICAgaWYoc2NvcGUuZW5hYmxlZCAmJiBzY29wZS5lbmFibGVSb3RhdGUgJiYgZGF0YS5zdGF0ZT09PSdtb3ZlJykge1xyXG4gICAgICAgI
13345HZhciBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudDtcclxuICAgICAgICAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kXHJcbiAgICAgICAgcm90YXRlTGVmdCgyICogTWF0aC5QSSAqIGRhdGEuZHggLyBlbGVtZW50LmNsaWVudFdpZHRoICogc2NvcGUucm90YXRlU3BlZWQpO1xyXG4gICAgICAgIC8vIHJvdGF0aW5nIHVwIGFuZCBkb3duIGFsb25nIHdob2xlIHNjcmVlbiBhdHRlbXB0cyB0byBnbyAzNjAsIGJ1dCBsaW1pdGVkIHRvIDE4MFxyXG4gICAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogZGF0YS5keSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogc2NvcGUucm90YXRlU3BlZWQpO1xyXG4gICAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcGFuKGV2ZW50LCBkYXRhKSB7XHJcbiAgICAgIGlmKHNjb3BlLmVuYWJsZWQgJiYgc2NvcGUuZW5hYmxlUGFuICYmIGRhdGEuc3RhdGU9PT0nbW92ZScpIHtcclxuICAgICAgICBzY29wZS5wYW4oZGF0YS5keCwgZGF0YS5keSk7XHJcbiAgICAgICAgc2NvcGUudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBvZmZzZXREb2xseShldmVudCwgZGF0YSkge1xyXG4gICAgICBpZihzY29wZS5lbmFibGVkICYmIHNjb3BlLmVuYWJsZVpvb20gJiYgZGF0YS5zdGF0ZT09PSdtb3ZlJykge1xyXG4gICAgICAgIGlmKGRhdGEuZHk+MCkge1xyXG4gICAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmKGRhdGEuZHk8MCkge1xyXG4gICAgICAgICAgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzY29wZS51cGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHdoZWVsRG9sbHkoZXZlbnQpIHtcclxuICAgICAgaWYoc2NvcGUuZW5hYmxlZCAmJiBzY29wZS5lbmFibGVab29tKSB7XHJcbiAgICAgICAgaWYoZXZlbnQuZGVsdGFZPjApIHtcclxuICAgICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGVsdGFZPDApIHtcclxuICAgICAgICAgIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzY29wZS51cGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aW9ucyA9IHtcclxuICAgICAgcm90YXRlLFxyXG4gICAgICBwYW4sXHJcbiAgICAgIG9mZnNldERvbGx5LFxyXG4gICAgICB3aGVlbERvbGx5XHJcbiAgICB9XHJcblxyXG4gIFx0Ly8gZm9yY2UgYW4gdXBkYXRlIGF0IHN0YXJ0XHJcbiAgXHR0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvT3JiaXQuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgSW1hZ2VCYXNlIGZyb20gJy4vSW1hZ2VCYXNlJztcclxuaW1wb3J0IFBkZiBmcm9tICcuL1BkZic7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcbmltcG9ydCBDdXN0b21FdmVudENvbnZlcnRlciBmcm9tICcuL0N1c3RvbUV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IFBvbHlUYXJnZXQgZnJvbSAnLi90YXJnZXRzL1BvbHlUYXJnZXQnO1xyXG5cclxuaW1wb3J0IEZpbmRlciBmcm9tICcuL0ZpbmRlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZGZJbWFnZSBleHRlbmRzIEltYWdlQmFzZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yLCBwZGYsIG4pIHtcclxuICAgIHN1cGVyKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKTtcclxuXHJcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLm4gPSBuO1xyXG4gICAgdGhpcy5wZGYgPSBwZGY7XHJcbiAgICB0aGlzLnYgPSB7eDogMCwgeTogMCwgejogMCwgc2V0OiBmdW5jdGlvbih4LHkseikge1xyXG4gICAgICB0aGlzLng9eDsgdGhpcy55PXk7IHRoaXMuej16O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sIHRyYW5zZm9ybTogZnVuY3Rpb24obSkge1xyXG4gICAgICBjb25zdCB4PW0ubVswXVswXSp0aGlzLngrbS5tWzFdWzBdKnRoaXMueSttLm1bMl1bMF0qdGhpcy56LFxyXG4gICAgICAgICAgICB5PW0ubVswXVsxXSp0aGlzLngrbS5tWzFdWzFdKnRoaXMueSttLm1bMl1bMV0qdGhpcy56LFxyXG4gICAgICAgICAgICB6PW0ubVswXVsyXSp0aGlzLngrbS5tWzBdWzJdKnRoaXMueSttLm1bMl1bMF0qdGhpcy56O1xyXG4gICAgICB0aGlzLng9eDtcclxuICAgICAgdGhpcy55PXk7XHJcbiAgICAgIHRoaXMuej16O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH19O1xyXG4gICAgdGhpcy5tID0ge206IFtbMSwwLDBdLFswLDEsMF0sWzAsMCwxXV0sIHNldDogZnVuY3Rpb24obTAwLG0wMSxtMDIsbTEwLG0xMSxtMTIsbTIwLG0yMSxtMjIpIHtcclxuICAgICAgdGhpcy5tPVtbbTAwLG0wMSxtMDJdLFttMTAsbTExLG0xMl0sW20yMCxtMjEsbTIyXV07XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfX07XHJcblxyXG4gICAgdGhpcy5zdGFydFJlbmRlciA9ICgpPT4ge1xyXG4gICAgICB0aGlzLnBkZi5nZXRIYW5kbGVyKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xyXG4gICAgfTtcclxuICAgIFByb21pc2UucmVzb2x2ZSgpLlxyXG4gICAgICB0aGVuKCgpPT4gdGhpcy5wZGYuZ2V0SGFuZGxlcih0aGlzLmluaXQuYmluZCh0aGlzKSkpO1xyXG4gIH1cclxuXHJcbiAgc2V0UXVlcnkocXVlcnkpIHtcclxuICAgIHRoaXMucXVlcnkgPSBxdWVyeS50cmltKCk7XHJcbiAgICBpZih0aGlzLnRleHRDb250ZW50KSB7XHJcbiAgICAgIHRoaXMuc2V0SGl0cyh0aGlzLnRleHRDb250ZW50KTtcclxuICAgICAgLy8gdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWN0U2l6ZShyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogclsyXS1yWzBdLFxyXG4gICAgICBoZWlnaHQ6IHJbM10tclsxXVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVBvbHkobSwgcCwgcykge1xyXG4gICAgY29uc3QgcG9seSA9IFtdLCB2ID0gdGhpcy52O1xyXG4gICAgdi5zZXQocC54LCBwLnksIDEpLnRyYW5zZm9ybShtKTtcclxuICAgIHBvbHkucHVzaCh7eDogdi54LCB5Oi
13345B2Lnl9KTtcclxuICAgIHYuc2V0KHAueCwgcC55K3MuaGVpZ2h0LCAxKS50cmFuc2Zvcm0obSk7XHJcbiAgICBwb2x5LnB1c2goe3g6IHYueCwgeTogdi55fSk7XHJcbiAgICB2LnNldChwLngrcy53aWR0aCwgcC55K3MuaGVpZ2h0LCAxKS50cmFuc2Zvcm0obSk7XHJcbiAgICBwb2x5LnB1c2goe3g6IHYueCwgeTogdi55fSk7XHJcbiAgICB2LnNldChwLngrcy53aWR0aCwgcC55LCAxKS50cmFuc2Zvcm0obSk7XHJcbiAgICBwb2x5LnB1c2goe3g6IHYueCwgeTogdi55fSk7XHJcbiAgICByZXR1cm4gcG9seTtcclxuICB9XHJcblxyXG4gIGdldFNpbXVsYXRlZERvYygpIHtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGUoZSwgZG9jLCB4LCB5KSB7XHJcbiAgICBpZih0aGlzLmV2ZW50Q29udmVydGVyKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRDb252ZXJ0ZXIuY29udmVydChlLCB7ZG9jLCB4LCB5fSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRBbm5vdGF0aW9ucyhhbm5vcykge1xyXG4gICAgY29uc3QgdCA9IHRoaXMudmlld3BvcnQudHJhbnNmb3JtLFxyXG4gICAgICB0YXJnZXRzID0gW107XHJcbiAgICB0aGlzLm0uc2V0KFxyXG4gICAgICB0WzBdLHRbMV0sMCxcclxuICAgICAgdFsyXSx0WzNdLDAsXHJcbiAgICAgIHRbNF0sdFs1XSwxKTtcclxuXHJcbiAgICBmb3IobGV0IGFubm8gb2YgYW5ub3MpIHtcclxuICAgICAgaWYgKGFubm8uc3VidHlwZT09PSdMaW5rJykge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBhbm5vLnJlY3QsXHJcbiAgICAgICAgICBhUG9zID0ge1xyXG4gICAgICAgICAgICB4OiByZWN0WzBdLFxyXG4gICAgICAgICAgICB5OiByZWN0WzFdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYVN6ID0gdGhpcy5yZWN0U2l6ZShyZWN0KTtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBuZXcgUG9seVRhcmdldCh0aGlzLmNyZWF0ZVBvbHkodGhpcy5tLCBhUG9zLCBhU3opLm1hcCgocCk9PiAoe3g6IHAueC90aGlzLnZpZXdwb3J0LndpZHRoLCB5OiAxLXAueS90aGlzLnZpZXdwb3J0LmhlaWdodH0pKSk7XHJcbiAgICAgICAgdGFyZ2V0LmFubm8gPSBhbm5vO1xyXG4gICAgICAgIHRhcmdldC5jYWxsYmFjayA9IHRoaXMuYW5ub0NsYi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRhcmdldHMucHVzaCh0YXJnZXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZih0YXJnZXRzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmV2ZW50Q29udmVydGVyID0gbmV3IEN1c3RvbUV2ZW50Q29udmVydGVyKHRoaXMud25kLCB0aGlzLmRvYywgUG9seVRhcmdldC50ZXN0LCB0aGlzLmdldFNpbXVsYXRlZERvYygpKTtcclxuICAgICAgZm9yKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRDb252ZXJ0ZXIuYWRkQ3VzdG9tKHRhcmdldCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEhpdHModGV4dENvbnRlbnQpIHtcclxuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcclxuICAgIGlmKHRoaXMucXVlcnkhPT0nJykge1xyXG4gICAgICB0aGlzLmZpbmRlciA9IG5ldyBGaW5kZXIodGV4dENvbnRlbnQuaXRlbXMubWFwKChpdGVtKT0+IGl0ZW0uc3RyKSwgdGhpcy5xdWVyeSwge2NvbnRleHRzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVySGl0cygpIHtcclxuICAgIGlmKHRoaXMuZmluZGVyKSB7XHJcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnBhZ2UudmlldyxcclxuICAgICAgICB0ZXN0U3ogPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB2aXNpYmlsaXR5OiBoaWRkZW47XCI+PC9kaXY+JykuYXBwZW5kVG8oJ2JvZHknKSwgdGV4dERpdiA9IHRlc3RTelswXSxcclxuICAgICAgICBiYXNlT2Zmc2V0ID0gdGVzdFN6Lm9mZnNldCgpLmxlZnQ7XHJcbiAgICAgIGZvcihsZXQgaGl0IG9mIHRoaXMuZmluZGVyLmdldEhpdHMoKSkge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMudGV4dENvbnRlbnQuaXRlbXNbaGl0LmluZGV4XSxcclxuICAgICAgICAgICAgICAgIHQgPSBQREZKUy5VdGlsLnRyYW5zZm9ybSh0aGlzLnZpZXdwb3J0LnRyYW5zZm9ybSwgaXRlbS50cmFuc2Zvcm0pLFxyXG4gICAgICAgICAgICAgICAgc3R5bGUgPSB0aGlzLnRleHRDb250ZW50LnN0eWxlc1tpdGVtLmZvbnROYW1lXSxcclxuICAgICAgICAgICAgICAgIGFuZ2xlID0gTWF0aC5hdGFuMih0WzFdLCB0WzBdKSsoc3R5bGUudmVydGljYWw/IE1hdGguUEkgLyAyOiAwKSxcclxuICAgICAgICAgICAgICAgIGZvbnRIZWlnaHQgPSBNYXRoLnNxcnQoKHRbMl0gKiB0WzJdKSArICh0WzNdICogdFszXSkpLFxyXG4gICAgICAgICAgICAgICAgZm9udEFzY2VudCA9IHN0eWxlLmFzY2VudD9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYXNjZW50ICogZm9udEhlaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmRlc2NlbnQ/ICgxICsgc3R5bGUuZGVzY2VudCkgKiBmb250SGVpZ2h0OiBmb250SGVpZ2h0KTtcclxuICAgICAgICAgIHRlc3RTei5odG1sKGl0ZW0uc3RyLnN1YnN0cigwLCBoaXQub2Zmc2V0KSsnPHNwYW4+JytpdGVtLnN0ci5zdWJzdHIoaGl0Lm9mZnNldCwgaGl0Lmxlbmd0aCkrJzwvc3Bhbj4nK2l0ZW0uc3RyLnN1YnN0cihoaXQub2Zmc2V0K2hpdC5sZW5ndGgpKTtcclxuXHJcbiAgICAgICAgICB0ZXh0RGl2LnN0eWxlLmZvbnRTaXplID0gZm9udEhlaWdodCsncHgnO1xyXG4gICAgICAgICAgdGV4dERpdi5zdHlsZS5mb250RmFtaWx5ID0gc3R5bGUuZm9udEZhbWlseTtcclxuXHJcbiAgICAgICAgICBjb25zdCB0ZXN0U3BhbiA9IHRlc3RTei5maW5kKCdzcGFuJyksXHJcbiAgICAgICAgICAgICAgaXdpZHRoID0gc3R5bGUudmVydGljYWw/IGl0ZW0uaGVpZ2h0KnRoaXMudmlld3BvcnQuc2NhbGU6IGl0ZW0ud2lkdGgqdGhpcy52aWV3cG9ydC5zY2FsZSxcclxuICAgICAgICAgICAgICB3aWR0aCA9IHRlc3RTei53aWR0aCgpLFxyXG4gICAgICAgICAgICAgIHJlbGF0aXZlT2Zmc2V0ID0gKHRlc3RTcGFuLm9mZnNldCgpLmxlZnQtYmFzZU9mZnNldCkvd2lkdGg7XHJcbiAgICAgICAgICB0aGlzLm0uc2V0KFxyXG4gICAgICAgICAgICAxLDAsMCxcclxuICAgICAgICAgICAgMCwxLDAsXHJcbiAgICAgICAgICAgI
13345HRbNF0rZm9udEFzY2VudCpNYXRoLnNpbihhbmdsZSksdFs1XS1mb250QXNjZW50Kk1hdGguY29zKGFuZ2xlKSwxKTtcclxuICAgICAgICAgIGxldCBwb2x5ID0gdGhpcy5jcmVhdGVQb2x5KHRoaXMubSwge3g6IHJlbGF0aXZlT2Zmc2V0Kml3aWR0aCwgeTogMH0sIHt3aWR0aDogaXdpZHRoKnRlc3RTcGFuLndpZHRoKCkvd2lkdGgsIGhlaWdodDogdGVzdFNwYW4uaGVpZ2h0KCl9KTtcclxuICAgICAgICAgIHBvbHkgPSBwb2x5Lm1hcCgocCk9PiAoe3g6IHAueC90aGlzLnZpZXdwb3J0LndpZHRoLCB5OiAxLXAueS90aGlzLnZpZXdwb3J0LmhlaWdodH0pKTtcclxuICAgICAgICAgIHRoaXMucmVuZGVySGl0KHBvbHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRlc3RTei5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFubm9DbGIoZSwgZGF0YSkge1xyXG4gICAgaWYodGhpcy5jb250ZXh0LmRpc3BhdGNoRXZlbnQpIHtcclxuICAgICAgdGhpcy5jb250ZXh0LmRpc3BhdGNoRXZlbnQoe1xyXG4gICAgICAgIHR5cGU6ICdwZGZBbm5vdGF0aW9uJyxcclxuICAgICAgICBldmVudDogZSxcclxuICAgICAgICBhbm5vdGF0aW9uOiBkYXRhLnRhcmdldC5hbm5vXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY1ZpZXdwb3J0KCkge1xyXG4gICAgY29uc3Qgc2NhbGUgPSBCYXNlTWF0aFV0aWxzLmNhbGNTY2FsZSh0aGlzLnNpemUud2lkdGgsIHRoaXMuc2l6ZS5oZWlnaHQsIHRoaXMucmVzVywgdGhpcy5yZXNIKTtcclxuICAgIGlmKCF0aGlzLnZpZXdwb3J0IHx8IE1hdGguYWJzKHRoaXMudmlld3BvcnQuc2NhbGUtc2NhbGUpPjFlLTQpIHtcclxuICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMucGFnZS5nZXRWaWV3cG9ydChzY2FsZSk7XHJcbiAgICAgIGlmKHRoaXMudHlwZSE9PSdmdWxsJykge1xyXG4gICAgICAgIGlmKHRoaXMudHlwZT09PSdyaWdodCcpIHtcclxuICAgICAgICAgIHRoaXMudmlld3BvcnQub2Zmc2V0WCArPSAwLjUqdGhpcy52aWV3cG9ydC53aWR0aDtcclxuICAgICAgICAgIHRoaXMudmlld3BvcnQudHJhbnNmb3JtWzRdIC09IDAuNSp0aGlzLnZpZXdwb3J0LndpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdwb3J0LndpZHRoIC89IDI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXNXID0gdGhpcy53aWR0aCA9IHRoaXMudmlld3BvcnQud2lkdGg7XHJcbiAgICAgIHRoaXMucmVzSCA9IHRoaXMuaGVpZ2h0ID0gdGhpcy52aWV3cG9ydC5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgdGhpcy50eXBlID0gdGhpcy5wZGYuZ2V0UGFnZVR5cGUodGhpcy5uKTtcclxuICAgIHRoaXMucGRmLmdldFBhZ2UodGhpcy5uKS5cclxuICAgICAgdGhlbigocGFnZSk9PiB7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcclxuICAgICAgICB0aGlzLnNpemUgPSBQZGYuZ2V0UGFnZVNpemUocGFnZSk7XHJcbiAgICAgICAgaWYodGhpcy50eXBlIT09J2Z1bGwnKSB7XHJcbiAgICAgICAgICB0aGlzLnNpemUud2lkdGggLz0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFnZS5nZXRBbm5vdGF0aW9ucygpLlxyXG4gICAgICAgICAgdGhlbih0aGlzLnNldEFubm90YXRpb25zLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHBhZ2UuZ2V0VGV4dENvbnRlbnQoKS5cclxuICAgICAgICAgIHRoZW4odGhpcy5zZXRIaXRzLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuY2FsY1ZpZXdwb3J0KCk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICAgIH0pLlxyXG4gICAgICBjYXRjaCgoZSk9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGxvYWQgUERGIHBhZ2U6ICcrKHRoaXMubisxKSk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVzb2x1dGlvbihyZXMpIHtcclxuICAgIHN1cGVyLnNldFJlc29sdXRpb24ocmVzKTtcclxuICAgIGlmKHRoaXMucGFnZSkge1xyXG4gICAgICB0aGlzLmNhbGNWaWV3cG9ydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyKGhhbmRsZXIpIHtcclxuICAgIGlmKHRoaXMucGFnZSkge1xyXG4gICAgICB0aGlzLnBhZ2UucmVuZGVyKHtcclxuICAgICAgICBjYW52YXNDb250ZXh0OiB0aGlzLnB1c2hDdHgoKSxcclxuICAgICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydFxyXG4gICAgICB9KS5cclxuICAgICAgdGhlbigoKT0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlckhpdHMoKTtcclxuICAgICAgICB0aGlzLnBvcEN0eCgpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQmxhbmtQYWdlKCk7XHJcbiAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9QZGZJbWFnZS5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2gge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIHBhZ2VzKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMucGFnZXMgPSBwYWdlcztcclxuICAgIHRoaXMucHJldlJlc3VsdHMgPSBbXTtcclxuICAgIGNvbnRhaW5lci5odG1sKGBcclxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWVyeVwiPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wUXVlcnlcIiB0eXBlPVwidGV4dFwiIG1heGxlbmd0aD1cIjMwXCIgdmFsdWU9XCJcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICBgKTtcclxuICAgIHRoaXMucXVlcnkgPSBjb250YWluZXIuZmluZCgnLnF1ZXJ5IGlucHV0Jyk7XHJcbiAgICB0aGlzLnJlc3VsdHMgPSBjb250YWluZXIuZmluZCgnLnJlc3VsdHMnKTtcclxuICAgIHRoaXMuc3RhdHVzID0gY29udGFpbmVyLmZpbmQoJy5zdGF0dXMnKTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBuYXZpZ2F0ZTogdGhpcy5uYXZpZ2F0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBkb1F1ZXJ5OiB0aGlzLmRvUXVlcnkuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnF1ZXJ5Lm9uKCdrZXlkb3duJywgdGhpcy5iaW5kcy5kb1F1ZXJ5KTtcclxuICAgIHRoaXMucmVzdWx0cy5vbignY2xpY2snLCB0aGlzLmJpbmRzLm5hdmlnYXRlKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnJlc3VsdHMub2ZmKCdjbGljaycsIHRoaXMuYmluZHMubmF2aWdhdGUpO1xyXG4gICAgdGhpcy5xdWVyeS5vZmYoJ2tleWRvd24nLCB0aGlzLmJpbmRzLmRvUXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGUoZSkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYodGhpcy5vbk5hdmlnYXRlIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTtcclxuICAgICAgaWYoIXRhcmdldC5oYXNDbGFzcygncmVzdWx0JykpIHtcclxuICAgICAgICBjb25zdCB0ID0gdGFyZ2V0LmZpbmQoJy5yZXN1bHQnKTtcclxuICAgICAgICBpZih0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGFyZ2V0ID0gdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB3aGlsZSh0YXJnZXQubGVuZ3RoICYmICF0YXJnZXQuaGFzQ2xhc3MoJ3Jlc3VsdCcpKSB7XHJcbiAgICAgICAgICAgI
13345HRhcmdldCA9ICQodGFyZ2V0WzBdLnBhcmVudE5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYWdlID0gdGFyZ2V0LmF0dHIoJ2RhdGEnKTtcclxuICAgICAgaWYocGFnZSE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMub25OYXZpZ2F0ZShwYXJzZUludChwYWdlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRvUXVlcnkoKSB7XHJcbiAgICBpZih0aGlzLm9uUXVlcnkpIHtcclxuICAgICAgY29uc3QgcXVlcnlTdGFtcCA9IHRoaXMucXVlcnlTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgaWYocXVlcnlTdGFtcCA9PT0gdGhpcy5xdWVyeVN0YW1wKSB7XHJcbiAgICAgICAgICB0aGlzLm9uUXVlcnkodGhpcy5xdWVyeVswXS52YWx1ZS50cmltKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRSZXN1bHRzKHJlc3VsdHMsIGxhc3RQYWdlKSB7XHJcbiAgICBpZih0aGlzLnByZXZSZXN1bHRzLmxlbmd0aCAmJiByZXN1bHRzWzBdIT09dGhpcy5wcmV2UmVzdWx0c1swXSkge1xyXG4gICAgICB0aGlzLnByZXZSZXN1bHRzID0gW107XHJcbiAgICAgIHRoaXMucmVzdWx0cy5odG1sKCcnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGh0bWxzID0gW107XHJcbiAgICBmb3IobGV0IGk9dGhpcy5wcmV2UmVzdWx0cy5sZW5ndGg7IGk8cmVzdWx0cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xyXG4gICAgICBodG1scy5wdXNoKCc8ZGl2IGNsYXNzPVwicmVzdWx0XCIgZGF0YT1cIicrcmVzdWx0LnBhZ2UrJ1wiPicpO1xyXG4gICAgICAgIGh0bWxzLnB1c2goJzxhIGhyZWY9XCIjXCI+Jyk7XHJcbiAgICAgICAgICBodG1scy5wdXNoKCc8ZGl2PicrcmVzdWx0LmNvbnRleHRzLmpvaW4oJzwvZGl2PjxkaXY+JykrJzwvZGl2PicpO1xyXG4gICAgICAgIGh0bWxzLnB1c2goJzwvYT4nKTtcclxuICAgICAgaHRtbHMucHVzaCgnPC9kaXY+Jyk7XHJcbiAgICB9XHJcbiAgICAkKGh0bWxzLmpvaW4oJycpKS5hcHBlbmRUbyh0aGlzLnJlc3VsdHMpO1xyXG4gICAgdGhpcy5wcmV2UmVzdWx0cyA9IFsuLi5yZXN1bHRzXTtcclxuICAgIGlmKGxhc3RQYWdlPT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLmh0bWwoJycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLmh0bWwobGFzdFBhZ2UrJyBvZiAnK3RoaXMucGFnZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvU2VhcmNoLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEltYWdlQmFzZSBmcm9tICcuL0ltYWdlQmFzZSc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY0ltYWdlIGV4dGVuZHMgSW1hZ2VCYXNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IsIHNyYykge1xyXG4gICAgc3VwZXIoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7fVxyXG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgdGhpcy5pbWFnZS5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgdGhpcy5iaW5kcy5pbWFnZUxvYWQgPSAoKT0+IHtcclxuICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5pbWFnZS5oZWlnaHQ7XHJcbiAgICAgIHRoaXMuc3RhcnRSZW5kZXIgPSAoKT0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlckltYWdlKHRoaXMuaW1hZ2UpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuYmluZHMuaW1hZ2VFcnJvciA9ICgpPT4ge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOb3RGb3VuZFBhZ2UoKTtcclxuICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgIH07XHJcbiAgICAkKHRoaXMuaW1hZ2UpLm9uKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpLm9uKCdlcnJvcicsIHRoaXMuYmluZHMuaW1hZ2VFcnJvcik7XHJcbiAgICB0aGlzLmltYWdlLnNyYyA9IFV0aWxzLm5vcm1hbGl6ZVVybChzcmMpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICQodGhpcy5pbWFnZSkub2ZmKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpLm9mZignZXJyb3InLCB0aGlzLmJpbmRzLmltYWdlRXJyb3IpO1xyXG4gICAgdGhpcy5pbWFnZS5zcmMgPSAnJztcclxuICAgIGRlbGV0ZSB0aGlzLmltYWdlO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvU3RhdGljSW1hZ2UuanMiLCJpbXBvcnQge1RIUkVFfSBmcm9tICcuLi9saWJzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dHVyZUFuaW1hdG9yIHtcclxuICBjb25zdHJ1Y3RvcihpbWcsIHRpbGVzSG9yaXosIHRpbGVzVmVydCwgbnVtVGlsZXMsIHRpbGVEaXNwRHVyYXRpb24pIHtcclxuXHJcbiAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLlRleHR1cmUoKTtcclxuICAgIHRleHR1cmUubWluRmlsdGVyID0gVEhSRUUuTGluZWFyRmlsdGVyO1xyXG4gICAgdGV4dHVyZS5pbWFnZSA9IGltZztcclxuICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICBcdC8vIG5vdGU6IHRleHR1cmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSwgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSB1cGRhdGUgZnVuY3Rpb24uXHJcbiAgICB0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG4gIFx0dGhpcy50aWxlc0hvcml6b250YWwgPSB0aWxlc0hvcml6O1xyXG4gIFx0dGhpcy50aWxlc1ZlcnRpY2FsID0gdGlsZXNWZXJ0O1xyXG4gIFx0Ly8gaG93IG1hbnkgaW1hZ2VzIGRvZXMgdGhpcyBzcHJpdGVzaGVldCBjb250YWluP1xyXG4gIFx0Ly8gIHVzdWFsbHkgZXF1YWxzIHRpbGVzSG9yaXogKiB0aWxlc1ZlcnQsIGJ1dCBub3QgbmVjZXNzYXJpbHksXHJcbiAgXHQvLyAgaWYgdGhlcmUgYXQgYmxhbmsgdGlsZXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3ByaXRlc2hlZXQuXHJcbiAgXHR0aGlzLm51bWJlck9mVGlsZXMgPSBudW1UaWxlcztcclxuICBcdHRleHR1cmUucmVwZWF0LnNldCgxL3RoaXMudGlsZXNIb3Jpem9udGFsLCAxL3RoaXMudGlsZXNWZXJ0aWNhbCk7XHJcblxyXG4gIFx0Ly8gaG93IGxvbmcgc2hvdWxkIGVhY2ggaW1hZ2UgYmUgZGlzcGxheWVkP1xyXG4gIFx0dGhpcy50aWxlRGlzcGxheUR1cmF0aW9uID0gdGlsZURpc3BEdXJhdGlvbjtcclxuXHJcbiAgXHQvLyBob3cgbG9uZyBoYXMgdGhlIGN1cnJlbnQgaW1hZ2UgYmVlbiBkaXNwbGF5ZWQ/XHJcbiAgXHR0aGlzLmN1cnJlbnREaXNwbGF5VGltZSA9IDA7XHJcblxyXG4gIFx0Ly8gd2hpY2ggaW1hZ2UgaXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZD9cclxuICBcdHRoaXMuY3VycmVudFRpbGUgPSAwO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKG
133451pbGxpU2VjKSB7XHJcbiAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGltZSArPSBtaWxsaVNlYztcclxuICAgIHdoaWxlKHRoaXMuY3VycmVudERpc3BsYXlUaW1lID4gdGhpcy50aWxlRGlzcGxheUR1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaW1lIC09IHRoaXMudGlsZURpc3BsYXlEdXJhdGlvbjtcclxuICAgICAgKyt0aGlzLmN1cnJlbnRUaWxlO1xyXG4gICAgICBpZih0aGlzLmN1cnJlbnRUaWxlID09IHRoaXMubnVtYmVyT2ZUaWxlcylcclxuICAgICAgICB0aGlzLmN1cnJlbnRUaWxlID0gMDtcclxuICAgICAgdmFyIGN1cnJlbnRDb2x1bW4gPSB0aGlzLmN1cnJlbnRUaWxlJXRoaXMudGlsZXNIb3Jpem9udGFsO1xyXG4gICAgICB0aGlzLnRleHR1cmUub2Zmc2V0LnggPSBjdXJyZW50Q29sdW1uL3RoaXMudGlsZXNIb3Jpem9udGFsO1xyXG4gICAgICB2YXIgY3VycmVudFJvdyA9IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGlsZS90aGlzLnRpbGVzSG9yaXpvbnRhbCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZS5vZmZzZXQueSA9IGN1cnJlbnRSb3cvdGhpcy50aWxlc1ZlcnRpY2FsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGNvbnN0IGltZyA9IHRoaXMudGV4dHVyZS5pbWFnZTtcclxuICAgIGltZy5oZWlnaHQgPSBpbWcud2lkdGggPSAwO1xyXG4gICAgdGhpcy50ZXh0dXJlLmRpc3Bvc2UoKTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGV4dHVyZUFuaW1hdG9yLmpzIiwiaW1wb3J0IHtUSFJFRSwgJH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuaW1wb3J0IE1vdXNlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9Nb3VzZUV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IFRocmVlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9UaHJlZUV2ZW50Q29udmVydGVyJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBNb3VzZUV2ZW50Q29udmVydGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIHZpc3VhbFdvcmxkLCB0ZXN0KSB7XHJcbiAgICBzdXBlcih3bmQsIGRvYywgdmlzdWFsV29ybGQuZWxlbWVudCk7XHJcbiAgICBVdGlscy5leHRlbmRzKHRoaXMsIG5ldyBUaHJlZUV2ZW50Q29udmVydGVyKHZpc3VhbFdvcmxkLCB0ZXN0KSk7XHJcbiAgfVxyXG5cclxuICBnZXRDYWxsYmFjayhvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3Qub2JqZWN0LnVzZXJEYXRhLm1vdXNlQ2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBzZXRDb29yZHNGcm9tRXZlbnQoZSkge1xyXG4gICAgY29uc3QgakVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKTtcclxuICAgIHRoaXMuY29vcmRzLnggPSAoKGUucGFnZVgtb2Zmc2V0LmxlZnQpL2pFbGVtZW50LndpZHRoKCkpKjItMTtcclxuICAgIHRoaXMuY29vcmRzLnkgPSAtKChlLnBhZ2VZLW9mZnNldC50b3ApL2pFbGVtZW50LmhlaWdodCgpKSoyKzE7XHJcbiAgICByZXR1cm4gdGhpcy5jb29yZHM7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlTW91c2VFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7VEhSRUUsICR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSAnLi9VdGlscyc7XHJcbmltcG9ydCBUb3VjaEV2ZW50Q29udmVydGVyIGZyb20gJy4vVG91Y2hFdmVudENvbnZlcnRlcic7XHJcbmltcG9ydCBUaHJlZUV2ZW50Q29udmVydGVyIGZyb20gJy4vVGhyZWVFdmVudENvbnZlcnRlcic7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyIGV4dGVuZHMgVG91Y2hFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHduZCwgZG9jLCB2aXN1YWxXb3JsZCwgdGVzdCkge1xyXG4gICAgc3VwZXIod25kLCBkb2MsIHZpc3VhbFdvcmxkLmVsZW1lbnQpO1xyXG4gICAgVXRpbHMuZXh0ZW5kcyh0aGlzLCBuZXcgVGhyZWVFdmVudENvbnZlcnRlcih2aXN1YWxXb3JsZCwgdGVzdCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FsbGJhY2sob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gb2JqZWN0Lm9iamVjdC51c2VyRGF0YS50b3VjaENhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29vcmRzRnJvbUV2ZW50KGUpIHtcclxuICAgIGNvbnN0IGpFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnQpLCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKSxcclxuICAgICAgdG91Y2hlcyA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcywgdG91Y2ggPSB0b3VjaGVzLmxlbmd0aD8gdG91Y2hlc1swXTogKHRoaXMubGFzdFRvdWNoZXMgfHwgW3twYWdlWDogMCwgcGFnZVk6IDB9XSlbMF0sXHJcbiAgICAgIHBhZ2VYID0gdG91Y2gucGFnZVgsIHBhZ2VZID0gdG91Y2gucGFnZVk7XHJcbiAgICB0aGlzLmxhc3RUb3VjaGVzID0gdG91Y2hlcy5sZW5ndGg/IHRvdWNoZXM6IHRoaXMubGFzdFRvdWNoZXM7XHJcbiAgICB0aGlzLmNvb3Jkcy54ID0gKChwYWdlWC1vZmZzZXQubGVmdCkvakVsZW1lbnQud2lkdGgoKSkqMi0xO1xyXG4gICAgdGhpcy5jb29yZHMueSA9IC0oKHBhZ2VZLW9mZnNldC50b3ApL2pFbGVtZW50LmhlaWdodCgpKSoyKzE7XHJcbiAgICByZXR1cm4gdGhpcy5jb29yZHM7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlVG91Y2hFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBJbWFnZUZhY3RvcnkgZnJvbSAnLi9JbWFnZUZhY3RvcnknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGh1bWJuYWlscyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvbnRhaW5lciwgdGh1bWJuYWlsc0NsYiwgc2l6ZSwgcHJvcHM9e2tXdG9IOiAyMTAvMjk3fSkge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICB0aGlzLnAgPSBwcm9wcztcclxuICAgIHRoaXMudGh1bWJuYWlsc0NsYiA9IHRodW1ibmFpbHNDbGI7XHJcbiAgICB0aGlzLnNpemUgPSBzaXplO1xyXG4gICAgdGhpcy5jYW52YXMgPSAkKCc8Y2FudmFzPicpWzBdO1xyXG4gICAgdGhpcy5pbWFnZUZhY3RvcnkgPSBuZXcgSW1hZ2VGYWN0b3J5KHtcclxuICAgICAgLi4uY29udGV4dCxcclxuICAgICAgcmVuZGVyQ2FudmFzOiB0aGlzLmNhbnZhcyxcclxuICAgICAgcmVuZGVyQ2FudmFzQ3R4OiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXHJcbiAgICB9KTtcclxuICAgIHRoaXMudGh1bWJuYWlscyA9IFtdO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8c2l6ZTsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnRodW1ibmFpbHNDbGIoaSk7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlscy5wdXNoKHtcclxuICAgICAgICAuLi5pbmZvLFxyXG4gICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgIGxvYWRlZDogaW5mby50eXBlPT09J3RodW1ibmFpbC1pbWFnZScsXHJcbiAgICAgICAgaGVhZGluZzogbnVsbCxcclxuICAgICAgICB0aHVtYm5haWw6IG51bGwsXHJcbiAgICAgICAgdGl0bGU6IGluZm8udGl0bGUgfHwgaVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICB1cGRhdGU6IHRoaXMudXBkYXRlLmJpbmQodGhpcyksXHJcbiAgICAgIG5hdmlnYXRlOiAoZSk9PiB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGlmKHRoaXMub25OYXZpZ2F0ZSkge1xyXG4gICAgICAgICAgbGV0IG5vZGUgPSBlLnRhcmdldDtcclxuICAgICAgICAgI
13345HdoaWxlKG5vZGUgJiYgIW5vZGUuZGF0YVRodW1ibmFpbCkge1xyXG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRlKG5vZGUuZGF0YVRodW1ibmFpbC5pbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5jb250YWluZXIub24oJ3Njcm9sbCcsIHRoaXMuYmluZHMudXBkYXRlKTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplO1xyXG4gIH1cclxuXHJcbiAgc2V0RW5hYmxlKGVuYWJsZSkge1xyXG4gICAgdGhpcy5lbmFibGUgPSBlbmFibGU7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2EnKS5vZmYoJ2NsaWNrJywgdGhpcy5iaW5kcy5uYXZpZ2F0ZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lci5vZmYoJ3Njcm9sbCcsIHRoaXMuYmluZHMudXBkYXRlKTtcclxuICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMud2lkdGggPSAwO1xyXG4gICAgZGVsZXRlIHRoaXMuY2FudmFzO1xyXG4gIH1cclxuXHJcbiAgbG9hZCh0aHVtYm5haWwpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5pbWFnZUZhY3RvcnkuYnVpbGQodGh1bWJuYWlsLCB0aHVtYm5haWwubnVtYmVyPT09dW5kZWZpbmVkPyB0aHVtYm5haWwuaW5kZXg6IHRodW1ibmFpbC5udW1iZXIsIHRoaXMucC5rV3RvSCozMDAsIDMwMCk7XHJcbiAgICB3cmFwcGVyLm9uQ2hhbmdlID0gKGNhbnZhcyk9PiB7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2UodGh1bWJuYWlsLCBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XHJcbiAgICAgIHRodW1ibmFpbC5sb2FkZWQgPSB0cnVlO1xyXG4gICAgICB3cmFwcGVyLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB0aGlzLnVwZGF0ZSgpKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRBY3RpdmUoKSB7XHJcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCgpLCBsYXN0ID0gZmlyc3QgKyB0aGlzLmNvbnRhaW5lci5oZWlnaHQoKSwgcmVzID0gW107XHJcbiAgICBmb3IobGV0IHRodW1ibmFpbCBvZiB0aGlzLnRodW1ibmFpbHMpIHtcclxuICAgICAgaWYoTWF0aC5tYXgodGh1bWJuYWlsLmZpcnN0LCBmaXJzdCk8TWF0aC5taW4odGh1bWJuYWlsLmxhc3QsIGxhc3QpKSB7XHJcbiAgICAgICAgcmVzLnB1c2godGh1bWJuYWlsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmKCF0aGlzLmxvYWRpbmcgJiYgdGhpcy5jYW52YXMgJiYgdGhpcy5lbmFibGUpIHtcclxuICAgICAgaWYoIXRoaXMuYnVpbHQpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuZ2V0QWN0aXZlKCk7XHJcbiAgICAgIGZvcihsZXQgdGh1bWJuYWlsIG9mIGFjdGl2ZSkge1xyXG4gICAgICAgIGlmKCF0aHVtYm5haWwubG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQodGh1bWJuYWlsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0SW1hZ2UodGh1bWJuYWlsLCBpbWcpIHtcclxuICAgIHRodW1ibmFpbC5pbWcgPSBpbWc7XHJcbiAgICB0aHVtYm5haWwudGh1bWJuYWlsLmNzcygnYmFja2dyb3VuZC1pbWFnZScsIFsndXJsKFxcJycsIGltZywnXFwnKSddLmpvaW4oJycpKTtcclxuICAgIHRodW1ibmFpbC50aHVtYm5haWwucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTtcclxuICB9XHJcblxyXG4gIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gWyc8ZGl2IGNsYXNzPVwidGh1bWJuYWlsc1wiPiddXHJcbiAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnNpemU7ICsraSkge1xyXG4gICAgICBlbGVtZW50cy5wdXNoKFsnPGRpdiBjbGFzcz1cIml0ZW1cIj48YSBocmVmPVwiI1wiPjxkaXYgY2xhc3M9XCJ0aHVtYm5haWwgbG9hZGluZ1wiPjwvZGl2PjwvYT48ZGl2IGNsYXNzPVwiaGVhZGluZ1wiPjxhIGhyZWY9XCIjXCIgdGl0bGU9XCInLCBpKzEsJ1wiPicsIGkrMSwgJzwvYT48L2Rpdj48L2Rpdj4nXS5qb2luKCcnKSk7XHJcbiAgICB9XHJcbiAgICBlbGVtZW50cy5wdXNoKCc8L2Rpdj4nKTtcclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50cy5qb2luKCcnKSk7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy5pdGVtJyksIGJhc2UgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcudGh1bWJuYWlscycpLm9mZnNldCgpLnRvcDtcclxuICAgIGZvcihsZXQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSAkKGl0ZW1zW2ldKTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLmhlYWRpbmcgPSBpdGVtLmZpbmQoJy5oZWFkaW5nJyk7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsc1tpXS50aHVtYm5haWwgPSBpdGVtLmZpbmQoJy50aHVtYm5haWwnKTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLmZpcnN0ID0gaXRlbS5vZmZzZXQoKS50b3AtYmFzZTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLmxhc3QgPSB0aGlzLnRodW1ibmFpbHNbaV0uZmlyc3QraXRlbS5oZWlnaHQoKTtcclxuICAgICAgaWYodGhpcy50aHVtYm5haWxzW2ldLmxvYWRlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2UodGhpcy50aHVtYm5haWxzW2ldLCB0aGlzLnRodW1ibmFpbHNbaV0uc3JjKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhcyA9IGl0ZW0uZmluZCgnYScpO1xyXG4gICAgICBmb3IobGV0IGo9MDsgajxhcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IGEgPSBhc1tqXTtcclxuICAgICAgICBhLmRhdGFUaHVtYm5haWwgPSB0aGlzLnRodW1ibmFpbHNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2EnKS5vbignY2xpY2snLCB0aGlzLmJpbmRzLm5hdmlnYXRlKTtcclxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGh1bWJuYWlscy5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBFdmVudENvbnZlcnRlciBmcm9tICcuL0V2ZW50Q29udmVydGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvdWNoQ29udmVydGVyIGV4dGVuZHMgRXZlbnRDb252ZXJ0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgZWxlbWVudCkge1xyXG4gICAgc3VwZXIod25kLCBkb2MpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBjb252ZXJ0OiB0aGlzLmNvbnZlcnQuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgICQo
13345dGhpcy5lbGVtZW50KS5vbigndG91Y2hzdGFydCB0b3VjaG1vdmUnLCB0aGlzLmJpbmRzLmNvbnZlcnQpO1xyXG4gICAgJCh0aGlzLmRvYykub24oJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub2ZmKCd0b3VjaHN0YXJ0IHRvdWNobW92ZScsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVG91Y2hFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7JCwgdHJ9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XHJcblxyXG4gIHN0YXRpYyBsaW5rU3RhdGVIYW5kbGVycyA9IHtcclxuICAgIHZpc2libGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2hpZGRlbicsICF2YWx1ZSksXHJcbiAgICBhY3RpdmU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2FjdGl2ZScsIHZhbHVlKSxcclxuICAgIGVuYWJsZTogKGN0cmwsIHZhbHVlKT0+IFZpZXcuY2xhc3NQcm9wZXJ0eShjdHJsLCAnZGlzYWJsZWQnLCAhdmFsdWUpXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIHdpZGdldFN0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgYWN0aXZlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdhY3RpdmUnLCB2YWx1ZSksXHJcbiAgICBlbmFibGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2Rpc2FibGVkJywgIXZhbHVlKVxyXG4gIH07XHJcblxyXG4gIHN0YXRpYyBpbnB1dFN0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgdmFsdWU6IChjdHJsLCB2YWx1ZSk9PiBjdHJsWzBdLnZhbHVlID0gdmFsdWUsXHJcbiAgICBlbmFibGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmF0dHJpYnV0ZVByb3BlcnR5KGN0cmwsICdkaXNhYmxlZCcsICF2YWx1ZSlcclxuICB9O1xyXG5cclxuICBzdGF0aWMgdGV4dFN0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgdmFsdWU6IChjdHJsLCB2YWx1ZSk9PiBjdHJsLnRleHQodmFsdWUpXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIGNsYXNzUHJvcGVydHkoY3RybCwgY2xhc3NOYW1lLCB2YWx1ZSkge1xyXG4gICAgaWYodmFsdWUpIHtcclxuICAgICAgY3RybC5hZGRDbGFzcyhjbGFzc05hbWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN0cmwucmVtb3ZlQ2xhc3MoY2xhc3NOYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBhdHRyaWJ1dGVQcm9wZXJ0eShjdHJsLCBhdHRyaWJ1dGVOYW1lLCB2YWx1ZSkge1xyXG4gICAgaWYodmFsdWUpIHtcclxuICAgICAgY3RybC5hdHRyKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdHJsLnJlbW92ZUF0dHIoYXR0cmlidXRlTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2FsbEhhbmRsZXJzKGhhbmRsZXJzLCBpZCwgZSwgZGF0YSkge1xyXG4gICAgZm9yKGxldCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XHJcbiAgICAgIGlmKGhhbmRsZXJbaWRdKSB7XHJcbiAgICAgICAgaGFuZGxlcltpZF0oZSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihoYW5kbGVyLmhhbmRsZURlZmF1bHQpIHtcclxuICAgICAgICBoYW5kbGVyLmhhbmRsZURlZmF1bHQoaWQsIGUsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRXZlbnQoaWQsIGdldEhhbmRsZXJzLCBlLCBkYXRhKSB7XHJcbiAgICBWaWV3LmNhbGxIYW5kbGVycyhnZXRIYW5kbGVycyhpZCksIGlkLCBlLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYW5kbGVMaW5rRXZlbnQoZSkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYoIXRoaXMuY3RybC5oYXNDbGFzcygnZGlzYWJsZWQnKSkge1xyXG4gICAgICBWaWV3LmhhbmRsZUV2ZW50KHRoaXMuaWQsIHRoaXMuZ2V0SGFuZGxlcnMsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGhhbmRsZUlucHV0RXZlbnQoZSkge1xyXG4gICAgVmlldy5oYW5kbGVFdmVudCh0aGlzLmlkLCB0aGlzLmdldEhhbmRsZXJzLCBlLCBlLnRhcmdldC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRm9ybUV2ZW50KGUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIFZpZXcuaGFuZGxlRXZlbnQodGhpcy5pZCwgdGhpcy5nZXRIYW5kbGVycywgZSk7XHJcbiAgfVxyXG5cclxuICAvLyB2aXJ0dWFsIGZ1bmN0aW9ucyB7XHJcbiAgZ2V0TGlua3MoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFdpZGdldHMoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldElucHV0cygpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGV4dHMoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRlbXBsYXRlKCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0SGFuZGxlcnMoaWQpIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzO1xyXG4gIH1cclxuICAvLyB9XHJcblxyXG4gIGNhbGxMYXRlcihoYW5kbGVycywgaWQsIGUsIGRhdGEsIG1zKSB7XHJcbiAgICB0aGlzLnBlbmRpbmdzW2lkXSA9IHtcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxyXG4gICAgfTtcclxuICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nc1tpZF07XHJcbiAgICAgIGlmKHBlbmRpbmcgJiYgdGltZXN0YW1wLXBlbmRpbmcudGltZXN0YW1wPj1tcykge1xyXG4gICAgICAgIFZpZXcuY2FsbEhhbmRsZXJzKGhhbmRsZXJzLCBpZCwgZSwgZGF0YSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ3NbaWRdO1xyXG4gICAgICB9XHJcbiAgICB9LCBtcyk7XHJcbiAgfVxyXG5cclxuICAvLyBsb2FkRmlsZXModXJscywgcmVhZHksIGZhaWx1cmUpIHtcclxuICAvLyAgIGxldCBkb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgLy8gICBmb3IobGV0IHVybCBvZiB1cmxzKSB7XHJcbiAgLy8gICAgIGRvbmUgPSBkb25lLnRoZW4oKCk9PiB7XHJcbiAgLy8gICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT4ge1xyXG4gIC8vICAgICAgICAgJC5nZXQodXJsLCAocmVzKT0+IHtcclxuICAvLyAgICAgICAgICAgcmVhZHkocmVzLCB1cmwpO1xyXG4gIC8vICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgLy8gICAgICAgICB9KS5mYWlsKChyZXMpPT4ge1xyXG4gIC8vICAgICAgICAgICBpZihmYWlsdXJlICYmIGZhaWx1cmU
13345ocmVzLCB1cmwpKSB7XHJcbiAgLy8gICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHJlamVjdChyZXMpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZG9uZTtcclxuICAvLyB9XHJcblxyXG4gIGxvYWRGaWxlcyh1cmxzLCBmaWxlcykge1xyXG4gICAgY29uc3QgdGFza3MgPSBbXTtcclxuICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyh1cmxzKSkge1xyXG4gICAgICBmaWxlc1tuYW1lXSA9IFtdO1xyXG4gICAgICBmb3IobGV0IHVybCBvZiB1cmxzW25hbWVdKSB7XHJcbiAgICAgICAgdGFza3MucHVzaChcclxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT4ge1xyXG4gICAgICAgICAgICAkLmdldCh1cmwsIChkYXRhKT0+IHtcclxuICAgICAgICAgICAgICBmaWxlc1tuYW1lXS5wdXNoKHt1cmwsIGRhdGF9KTtcclxuICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0pLmZhaWwoKHJlcyk9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KHJlcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGFza3MpO1xyXG4gIH1cclxuXHJcbiAgdXJsUmVzb2x2ZXIoYmFzZVVybCwgdXJsKSB7XHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gICAgaWYodXJsLmNoYXJBdCgwKSE9PScvJykge1xyXG4gICAgICBiYXNlVXJsID0gYmFzZVVybC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbiAgICAgIGNvbnN0IHAgPSBiYXNlVXJsLmxhc3RJbmRleE9mKCcvJyk7XHJcbiAgICAgIHVybCA9ICh+cD8gYmFzZVVybC5zdWJzdHIoMCwgcCsxKTogJycpK3VybDtcclxuXHJcbiAgICAgIGNvbnN0IHBhcnRzID0gdXJsLnNwbGl0KCcvJyk7XHJcbiAgICAgIHVybCA9IFtdO1xyXG4gICAgICBmb3IobGV0IHBhcnQgb2YgcGFydHMpIHtcclxuICAgICAgICBpZihwYXJ0PT09Jy4nKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYocGFydD09PScuLicpIHtcclxuICAgICAgICAgIGlmKHVybC5sZW5ndGggJiYgISh1cmwubGVuZ3RoPT09MSAmJiB1cmxbMF09PT0nJykpIHtcclxuICAgICAgICAgICAgdXJsLnBvcCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHVybC5wdXNoKHBhcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB1cmwgPSB1cmwuam9pbignLycpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1cmw7XHJcbiAgfVxyXG5cclxuICBvYmpUb0F0dHJzU3RyKG8pIHtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKG8pKSB7XHJcbiAgICAgIHJlcy5wdXNoKFtuYW1lLCAnPVwiJywgb1tuYW1lXSwgJ1wiJ10uam9pbignJykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmcmFtZVNpemUoKSB7XHJcbiAgICBpZih0aGlzLmZyYW1lKSB7XHJcbiAgICAgIGlmKE1hdGguYWJzKHRoaXMuZnJhbWUud2lkdGgtdGhpcy5wYXJlbnRDb250YWluZXIud2lkdGgoKSk+MSB8fCBNYXRoLmFicyh0aGlzLmZyYW1lLmhlaWdodC10aGlzLnBhcmVudENvbnRhaW5lci5oZWlnaHQoKSk+MSkge1xyXG4gICAgICAgIHRoaXMub25SZXNpemUoKTtcclxuICAgICAgfVxyXG4gICAgICBzZXRUaW1lb3V0KHRoaXMuY2hlY2tJZnJhbWVTaXplLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZSgpIHtcclxuICAgIHRoaXMuZnJhbWUud2lkdGggPSB0aGlzLnBhcmVudENvbnRhaW5lci53aWR0aCgpO1xyXG4gICAgdGhpcy5mcmFtZS5oZWlnaHQgPSB0aGlzLnBhcmVudENvbnRhaW5lci5oZWlnaHQoKTtcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZShodG1sKSB7XHJcbiAgICByZXR1cm4gaHRtbC5yZXBsYWNlKC88XFwkdHI+KC4qKTxcXC9cXCR0cj4vZ2ksIChzMCxzMSk9PiB0cihzMSkpO1xyXG4gIH1cclxuXHJcbiAgZmlyZUxpbmtzT25Mb2FkRXZlbnQoKSB7XHJcbiAgICBpZih0aGlzLnRlbXBsYXRlT2JqZWN0ICYmIHRoaXMudGVtcGxhdGVPYmplY3QubGlua0xvYWRlZCkge1xyXG4gICAgICBsZXQgbG9hZGVkID0gdHJ1ZTtcclxuICAgICAgZm9yKGxldCBqTGluayBvZiB0aGlzLmpMaW5rcykge1xyXG4gICAgICAgIGNvbnN0IGxpbmsgPSBqTGlua1swXTtcclxuICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgICBpbWcub25lcnJvciA9ICgpPT4gdGhpcy50ZW1wbGF0ZU9iamVjdC5saW5rTG9hZGVkKGxpbmspO1xyXG4gICAgICAgIGltZy5zcmMgPSBsaW5rLmhyZWY7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmVudENvbnRhaW5lciwgb25Mb2FkLCB0ZW1wbGF0ZT17fSkge1xyXG4gICAgdGhpcy5wZW5kaW5ncyA9IHt9O1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgb25SZXNpemU6IHRoaXMub25SZXNpemUuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgIHRoaXMucGFyZW50Q29udGFpbmVyID0gJChwYXJlbnRDb250YWluZXIpO1xyXG4gICAgdGhpcy5pc0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cuTVNTdHJlYW07XHJcbiAgICB0aGlzLnBhcmVudENvbnRhaW5lci5odG1sKCc8aWZyYW1lIHN0eWxlPVwiYm9yZGVyOiAwOycrKHRoaXMuaXNJT1M/ICcnOiAnIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCUnKSsnXCIgc2Nyb2xsaW5nPVwibm9cIj48L2lmcmFtZT4nKTtcclxuXHJcbiAgICB0aGlzLmZyYW1lID0gdGhpcy5wYXJlbnRDb250YWluZXIuZmluZCgnaWZyYW1lJylbMF07XHJcbiAgICBpZih0aGlzLmZyYW1lLmNvbnRlbn
13345RXaW5kb3cuc3RvcCkge1xyXG4gICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cuc3RvcCgpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pc0lPUykge1xyXG4gICAgICAkKHRoaXMucGFyZW50Q29udGFpbmVyWzBdLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLm9uKCdyZXNpemUnLCB0aGlzLmJpbmRzLm9uUmVzaXplKTtcclxuICAgICAgdGhpcy5vblJlc2l6ZSgpO1xyXG4gICAgICBzZXRUaW1lb3V0KHRoaXMuY2hlY2tJZnJhbWVTaXplLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkpO1xyXG4gICAgdGhpcy5jb250YWluZXIuY3NzKCdtYXJnaW4nLCAnMCcpO1xyXG4gICAgdGhpcy5oZWFkID0gJCh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5oZWFkKTtcclxuICAgIHRoaXMub25Mb2FkID0gb25Mb2FkO1xyXG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHNjcmlwdCA9IHRlbXBsYXRlLmh0bWw/IHRlbXBsYXRlLnNjcmlwdDogdGhpcy5nZXRUZW1wbGF0ZSgpLnNjcmlwdDtcclxuICAgIGNvbnN0IHVybHMgPSB7XHJcbiAgICAgIHN0eWxlczogdGVtcGxhdGUuc3R5bGVzIHx8IHRoaXMuZ2V0VGVtcGxhdGUoKS5zdHlsZXMsXHJcbiAgICAgIGh0bWw6IFt0ZW1wbGF0ZS5odG1sIHx8IHRoaXMuZ2V0VGVtcGxhdGUoKS5odG1sXSxcclxuICAgICAgc2NyaXB0OiBzY3JpcHQ/IFtzY3JpcHRdOiBbXVxyXG4gICAgfSwgZmlsZXMgPSB7fSwgbGlua3MgPSB0ZW1wbGF0ZS5saW5rcyB8fCB0aGlzLmdldFRlbXBsYXRlKCkubGlua3M7XHJcblxyXG4gICAgdGhpcy5sb2FkRmlsZXModXJscywgZmlsZXMpLnRoZW4oKCk9PiB7XHJcbiAgICAgIGZvcihsZXQgc3R5bGUgb2YgZmlsZXMuc3R5bGVzKSB7XHJcbiAgICAgICAgbGV0IHRleHRDc3MgPSBzdHlsZS5kYXRhLCB1cmwgPSBzdHlsZS51cmw7XHJcbiAgICAgICAgdGV4dENzcyA9IHRleHRDc3MucmVwbGFjZSgvdXJsXFwoWydcIl0oLio/KVtcIiddXFwpL2csIChyLCByMSk9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWyd1cmwoJywgdGhpcy51cmxSZXNvbHZlcih1cmwsIHIxKSwgJyknXS5qb2luKCcnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHt0ZXh0Q3NzfTwvc3R5bGU+YCkuYXBwZW5kVG8odGhpcy5oZWFkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jb250YWluZXIuaHRtbCh0aGlzLnRyYW5zbGF0ZShmaWxlcy5odG1sWzBdLmRhdGEpKTtcclxuXHJcbiAgICAgIHRoaXMuakxpbmtzID0gW107XHJcbiAgICAgIGZvcihsZXQgbGluayBvZiBsaW5rcykge1xyXG4gICAgICAgIHRoaXMuakxpbmtzLnB1c2goJChbJzxsaW5rICcsIHRoaXMub2JqVG9BdHRyc1N0cihsaW5rKSwgJz4nXS5qb2luKCcnKSkuYXBwZW5kVG8odGhpcy5oZWFkKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKGZpbGVzLnNjcmlwdFswXSkge1xyXG4gICAgICAgIGNvbnN0IGluaXQgPSBldmFsKGZpbGVzLnNjcmlwdFswXS5kYXRhKTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlT2JqZWN0ID0gaW5pdCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9iamVjdCA9IHt9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxpbmtDb250cm9scyA9IHt9O1xyXG4gICAgICBmb3IobGV0IGlkIG9mIHRoaXMuZ2V0TGlua3MoKSkge1xyXG4gICAgICAgIHRoaXMubGlua0NvbnRyb2xzW2lkXSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy4nK2lkKTtcclxuICAgICAgICB0aGlzLmJpbmRzW2lkXSA9IFZpZXcuaGFuZGxlTGlua0V2ZW50LmJpbmQoe2dldEhhbmRsZXJzOiB0aGlzLmdldEhhbmRsZXJzLmJpbmQodGhpcyksIGlkLCBjdHJsOiB0aGlzLmxpbmtDb250cm9sc1tpZF19KTtcclxuICAgICAgICB0aGlzLmxpbmtDb250cm9sc1tpZF0ub24oJ2NsaWNrJywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLndpZGdldENvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRXaWRnZXRzKCkpIHtcclxuICAgICAgICB0aGlzLndpZGdldENvbnRyb2xzW2lkXSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy4nK2lkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRJbnB1dHMoKSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sc1tpZF0gPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuJytpZCk7XHJcbiAgICAgICAgdGhpcy5iaW5kc1tpZF0gPSBWaWV3LmhhbmRsZUlucHV0RXZlbnQuYmluZCh7Z2V0SGFuZGxlcnM6IHRoaXMuZ2V0SGFuZGxlcnMuYmluZCh0aGlzKSwgaWQsIGN0cmw6IHRoaXMuaW5wdXRDb250cm9sc1tpZF19KTtcclxuICAgICAgICB0aGlzLmlucHV0Q29udHJvbHNbaWRdLm9uKCdrZXl1cCcsIHRoaXMuYmluZHNbaWRdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSB7fTtcclxuICAgICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldEZvcm1zKCkpIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sc1tpZF0gPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuJytpZCk7XHJcbiAgICAgICAgdGhpcy5iaW5kc1tpZF0gPSBWaWV3LmhhbmRsZUZvcm1FdmVudC5iaW5kKHtnZXRIYW5kbGVyczogdGhpcy5nZXRIYW5kbGVycy5iaW5kKHRoaXMpLCBpZCwgY3RybDogdGhpcy5mb3JtQ29udHJvbHNbaWRdfSk7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNbaWRdLm9uKCdzdWJtaXQnLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudGV4dENvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRUZXh0cygpKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0Q29udHJvbHNbaWRdID0gdGhpcy5jb250YWluZXIuZmluZCgnLicraWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnN0YXRlU2V0dGVycyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtYXA6IHRoaXMubGlua0NvbnRyb2xzLFxyXG4gICAgICAgICAgc2V0dGVyOiB0aGlzLnNldExpbmtDb250cm9sU3RhdGUuYmluZCh0aGlzKVxyXG4gICAgICAgI
13345H0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWFwOiB0aGlzLndpZGdldENvbnRyb2xzLFxyXG4gICAgICAgICAgc2V0dGVyOiB0aGlzLnNldFdpZGdldENvbnRyb2xTdGF0ZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtYXA6IHRoaXMuaW5wdXRDb250cm9scyxcclxuICAgICAgICAgIHNldHRlcjogdGhpcy5zZXRJbnB1dENvbnRyb2xTdGF0ZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtYXA6IHRoaXMudGV4dENvbnRyb2xzLFxyXG4gICAgICAgICAgc2V0dGVyOiB0aGlzLnNldFRleHRDb250cm9sU3RhdGUuYmluZCh0aGlzKVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuXHJcbiAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuXHJcbiAgICAgIGlmKHRoaXMub25Mb2FkKSB7XHJcbiAgICAgICAgdGhpcy5vbkxvYWQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5maXJlTGlua3NPbkxvYWRFdmVudCgpO1xyXG4gICAgfSkuXHJcbiAgICBjYXRjaCgocmVzKT0+IGNvbnNvbGUuZXJyb3IocmVzKSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZGVsZXRlIHRoaXMudGV4dENvbnRyb2xzO1xyXG4gICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldExpbmtzKCkpIHtcclxuICAgICAgdGhpcy5saW5rQ29udHJvbHNbaWRdLm9mZignY2xpY2snLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5saW5rQ29udHJvbHM7XHJcbiAgICBkZWxldGUgdGhpcy53aWRnZXRDb250cm9scztcclxuICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRJbnB1dHMoKSkge1xyXG4gICAgICB0aGlzLmlucHV0Q29udHJvbHNbaWRdLm9mZigna2V5dXAnLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5pbnB1dENvbnRyb2xzO1xyXG4gICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldEZvcm1zKCkpIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbHNbaWRdLm9mZignc3VibWl0JywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMuZm9ybUNvbnRyb2xzO1xyXG5cclxuICAgICF0aGlzLnRlbXBsYXRlT2JqZWN0LmRpc3Bvc2UgfHwgdGhpcy50ZW1wbGF0ZU9iamVjdC5kaXNwb3NlKCk7XHJcbiAgICBkZWxldGUgdGhpcy50ZW1wbGF0ZU9iamVjdDtcclxuXHJcbiAgICBpZih0aGlzLmlzSU9TKSB7XHJcbiAgICAgICQodGhpcy5wYXJlbnRDb250YWluZXJbMF0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykub2ZmKCdyZXNpemUnLCB0aGlzLmJpbmRzLm9uUmVzaXplKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyZW50Q29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgZGVsZXRlIHRoaXMuZnJhbWU7XHJcbiAgfVxyXG5cclxuICBnZXRDb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJbMF07XHJcbiAgfVxyXG5cclxuICBnZXRQYXJlbnRDb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb250YWluZXJbMF07XHJcbiAgfVxyXG5cclxuICBhZGRIYW5kbGVyKGhhbmRsZXIpIHtcclxuICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIGluaXRWaWV3KCkge1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRDb250cm9sU3RhdGUoY3RybCwgZGVmYXVsdHMsIHN0YXRlLCBzdGF0ZUhhbmRsZXJzKSB7XHJcbiAgICBpZihjdHJsKSB7XHJcbiAgICAgIGNvbnN0IHN0ID0ge1xyXG4gICAgICAgIC4uLmRlZmF1bHRzLFxyXG4gICAgICAgIC4uLnN0YXRlXHJcbiAgICAgIH07XHJcbiAgICAgIGZvcihsZXQgbmFtZSBpbiBzdCkge1xyXG4gICAgICAgIGlmKHN0Lmhhc093blByb3BlcnR5KG5hbWUpICYmIHN0YXRlSGFuZGxlcnNbbmFtZV0pIHtcclxuICAgICAgICAgIHN0YXRlSGFuZGxlcnNbbmFtZV0oY3RybCwgc3RbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TGlua0NvbnRyb2xTdGF0ZShpZCwgc3RhdGUpIHtcclxuICAgIFZpZXcuc2V0Q29udHJvbFN0YXRlKFxyXG4gICAgICB0aGlzLmxpbmtDb250cm9sc1tpZF0sXHJcbiAgICAgIHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgZW5hYmxlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlLFxyXG4gICAgICBWaWV3LmxpbmtTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0V2lkZ2V0Q29udHJvbFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgVmlldy5zZXRDb250cm9sU3RhdGUoXHJcbiAgICAgIHRoaXMud2lkZ2V0Q29udHJvbHNbaWRdLFxyXG4gICAgICB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZSxcclxuICAgICAgVmlldy53aWRnZXRTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0SW5wdXRDb250cm9sU3RhdGUoaWQsIHN0YXRlKSB7XHJcbiAgICBWaWV3LnNldENvbnRyb2xTdGF0ZShcclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2xzW2lkXSxcclxuICAgICAge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZSxcclxuICAgICAgVmlldy5pbnB1dFN0YXRlSGFuZGxlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0Q29udHJvbFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgVmlldy5zZXRDb250cm9sU3RhdGUoXHJcbiAgICAgIHRoaXMudGV4dENvbnRyb2xzW2lkXSxcclxuICAgICAge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlLFxyXG4gICAgICBWaWV3LnRleHRTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25JdGVtU3RhdGVDaGFuZ2VkKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHNldFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgZm9yKGxldCBpdGVtIG9mIHRoaXMuc3RhdGVTZXR0ZXJzKSB7XHJcbiAgICAgIGlmKGl0ZW0ubWFwW2lkXSkge1xyXG4gICAgICAgIGl0ZW0uc2V0dGVyKGlkLCBzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5vbkl0ZW1TdGF0ZUNoYW5nZWQoaWQsIHN0YXRl
13345KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVmlldy5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgT3JiaXQgZnJvbSAnLi9PcmJpdCc7XHJcbmltcG9ydCBUaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9UaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXInO1xyXG5pbXBvcnQgVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyIGZyb20gJy4vVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IERyYWcgZnJvbSAnLi9EcmFnJztcclxuaW1wb3J0IENTUzNEUmVuZGVyZXIgZnJvbSAnLi9DU1MzRFJlbmRlcmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpc3VhbFdvcmxkIGV4dGVuZHMgVEhSRUUuRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGNvbnRhaW5lciwgdXNlSGVscGVycz1mYWxzZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMud25kID0gd25kO1xyXG4gICAgdGhpcy5kb2MgPSBkb2M7XHJcbiAgICB0aGlzLmpDb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICB0aGlzLnJlbmRlckNhbGxiYWNrcyA9IFtdO1xyXG5cclxuICAgIHRoaXMuY2xvY2sgPSBuZXcgVEhSRUUuQ2xvY2soKTtcclxuXHJcbiAgICB0aGlzLnJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAgICB0aGlzLmNzc1NjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcblxyXG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzAsIHRoaXMud2lkdGgoKS90aGlzLmhlaWdodCgpLCAwLjIsIDIwMDApO1xyXG4gICAgY29uc3Qgc2NhbGUgPSA1O1xyXG5cclxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnggPSAwO1xyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueSA9IDUuNSpzY2FsZTtcclxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnogPSAwO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7YWxwaGE6IHRydWUsIGFudGlhbGlhczogdHJ1ZX0pO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKDB4MDAwMDAwLCAwKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh0aGlzLnduZC5kZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpO1xyXG5cclxuICAgIHRoaXMuakNvbnRhaW5lci5hcHBlbmQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmNzc1JlbmRlcmVyXHQ9IG5ldyBDU1MzRFJlbmRlcmVyKCk7XHJcbiAgICB0aGlzLmNzc1JlbmRlcmVyLnNldFNpemUodGhpcy53aWR0aCgpLCB0aGlzLmhlaWdodCgpKTtcclxuICAgICQodGhpcy5jc3NSZW5kZXJlci5kb21FbGVtZW50KS5jc3Moe1xyXG4gIFx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcclxuICBcdFx0dG9wOiAwLFxyXG4gIFx0XHRtYXJnaW46IDAsXHJcbiAgXHRcdHBhZGRpbmc6IDBcclxuXHQgIH0pO1xyXG4gICAgdGhpcy5qQ29udGFpbmVyLmFwcGVuZCh0aGlzLmNzc1JlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuY3NzUmVuZGVyZXIuZG9tRWxlbWVudDtcclxuXHJcblxyXG5cclxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXQodGhpcy5jYW1lcmEsIHRoaXMuZWxlbWVudCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC55ID0gMC41O1xyXG5cclxuICAgIGNvbnN0IGNzc1NjZW5lID0gJCh0aGlzLmNzc1JlbmRlcmVyLmRvbUVsZW1lbnQpLmZpbmQoJ2RpdicpLCB0bXBWZWN0b3IgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgdGhpcy5jb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKT0+IHtcclxuICAgICAgdGhpcy5jYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24odG1wVmVjdG9yKTtcclxuICAgICAgY3NzU2NlbmUuY3NzKCdkaXNwbGF5J
13345ywgdG1wVmVjdG9yLnktdGhpcy5jYW1lcmEucG9zaXRpb24ueT4wPyAnbm9uZSc6ICdibG9jaycpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50ZXh0dXJlTG9hZGVyID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmFkZChuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4RDBEMEQwKSk7Ly8weEMwQzBDMFxyXG5cclxuICAgIHRoaXMubGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweDQwNDA0MCwgMSk7XHJcbiAgICB0aGlzLmxpZ2h0LnBvc2l0aW9uLnNldCgwLCA2KnNjYWxlLCAwKTtcclxuICAgIHRoaXMubGlnaHQuY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgLy8gY29uc3QgZCA9IDIwKnNjYWxlO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhLmxlZnQgPSAtZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5yaWdodCA9IGQ7XHJcbiAgICAvLyB0aGlzLmxpZ2h0LnNoYWRvdy5jYW1lcmEudG9wID0gZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5ib3R0b20gPSAtZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5uZWFyID0gMSpzY2FsZTtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5mYXIgPSAyNSpzY2FsZTtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93Lm1hcFNpemUueCA9IDEwMjQ7XHJcbiAgICAvLyB0aGlzLmxpZ2h0LnNoYWRvdy5tYXBTaXplLnkgPSAxMDI0O1xyXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5saWdodCk7XHJcblxyXG4gICAgaWYodXNlSGVscGVycykge1xyXG4gICAgICB0aGlzLnNjZW5lLmFkZChuZXcgVEhSRUUuQXhpc0hlbHBlcig1KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgb25XaW5kb3dSZXNpemU6IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKSxcclxuICAgICAgYW5pbWF0ZTogdGhpcy5hbmltYXRlLmJpbmQodGhpcylcclxuICAgIH07XHJcblxyXG4gICAgJCh0aGlzLnduZCkub24oJ3Jlc2l6ZScsIHRoaXMuYmluZHMub25XaW5kb3dSZXNpemUpO1xyXG5cclxuICAgIHRoaXMubW91c2VFdmVudHMgPSBuZXcgVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyKHRoaXMud25kLCB0aGlzLmRvYywgdGhpcyk7XHJcbiAgICB0aGlzLnRvdWNoRXZlbnRzID0gbmV3IFRocmVlVG91Y2hFdmVudENvbnZlcnRlcih0aGlzLnduZCwgdGhpcy5kb2MsIHRoaXMpO1xyXG4gICAgY29uc3QgZmlsdGVyRGF0YSA9IHt0eXBlOiAnbW91c2Vtb3ZlJ307XHJcbiAgICB0aGlzLm1vdXNlRXZlbnRzLmZpbHRlciA9IChlbGVtZW50LCBlKT0+IHtcclxuICAgICAgY29uc3QgdHlwZXMgPSBbJ21vdXNlZW50ZXInLCAnbW91c2VvdmVyJywgJ21vdXNlbGVhdmUnLCAnbW91c2VvdXQnXSwgY29udGFpbnMgPSAocCwgYyk9PiBwPT09YyB8fCAkLmNvbnRhaW5zKHAsIGMpO1xyXG4gICAgICBpZihlLnR5cGU9PT0nbW91c2Vtb3ZlJykge1xyXG4gICAgICAgIGZpbHRlckRhdGEucGFnZVggPSBlLnBhZ2VYO1xyXG4gICAgICAgIGZpbHRlckRhdGEucGFnZVkgPSBlLnBhZ2VZO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBlLnJlbGF0ZWRUYXJnZXQgJiYgfnR5cGVzLmluZGV4T2YoZS50eXBlKSAmJiBjb250YWlucyhlbGVtZW50LCBlLnRhcmdldCkgJiYgY29udGFpbnMoZWxlbWVudCwgZS5yZWxhdGVkVGFyZ2V0KT8gey4uLmUsIC4uLmZpbHRlckRhdGF9OiBlO1xyXG4gICAgfTtcclxuICAgIHRoaXMuZHJhZyA9IG5ldyBEcmFnKHRoaXMud25kLCB0aGlzLmRvYywgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vbldpbmRvd1Jlc2l6ZSgpO1xyXG4gICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZGVsZXRlIHRoaXMuYmluZHMuYW5pbWF0ZTtcclxuICAgICQodGhpcy53bmQpLm9mZigncmVzaXplJywgdGhpcy5iaW5kcy5vbldpbmRvd1Jlc2l6ZSk7XHJcbiAgICB0aGlzLm1vdXNlRXZlbnRzLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMudG91Y2hFdmVudHMuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kcmFnLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY29udHJvbHMuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgd2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5qQ29udGFpbmVyLndpZHR
13345oKCk7XHJcbiAgfVxyXG5cclxuICBoZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5qQ29udGFpbmVyLmhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RXh0cmFMaWdodGluZyh2KSB7XHJcbiAgICB0aGlzLmxpZ2h0LmludGVuc2l0eSA9IHY7XHJcbiAgfVxyXG5cclxuICBnZXRPcmJpdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29udHJvbHNTdGF0ZShzdGF0ZSkge1xyXG4gICAgdGhpcy5jb250cm9scy5lbmFibGVkID0gc3RhdGU7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sc1N0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbHMuZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgaWYodGhpcy53aWR0aCgpPjEgJiYgdGhpcy5oZWlnaHQoKT4xKSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZUNhbWVyYSA9IChjYW1lcmEpPT4ge1xyXG4gICAgICAgIGNhbWVyYS5hc3BlY3QgPSB0aGlzLndpZHRoKCkvdGhpcy5oZWlnaHQoKTtcclxuICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgICB9LFxyXG4gICAgICB1cGRhdGVSZW5kZXJlciA9IChyZW5kZXJlcik9PiB7XHJcbiAgICAgICAgcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdXBkYXRlQ2FtZXJhKHRoaXMuY2FtZXJhKTtcclxuICAgICAgdXBkYXRlUmVuZGVyZXIodGhpcy5yZW5kZXJlcik7XHJcbiAgICAgIHVwZGF0ZVJlbmRlcmVyKHRoaXMuY3NzUmVuZGVyZXIpO1xyXG5cclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiAncmVzaXplJ30pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgdGhpcy5vbldpbmRvd1Jlc2l6ZSgpO1xyXG4gICAgICB9LCAyNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkT2JqZWN0KG9iamVjdCkge1xyXG4gICAgdGhpcy5zY2VuZS5hZGQob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGFkZENzc09iamVjdChvYmplY3QpIHtcclxuICAgIHRoaXMuY3NzU2NlbmUuYWRkKG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDc3NPYmplY3Qob2JqZWN0KSB7XHJcbiAgICB0aGlzLmNzc1NjZW5lLnJlbW92ZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlT2JqZWN0KG9iamVjdCkge1xyXG4gICAgdGhpcy5zY2VuZS5yZW1vdmUob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGFuaW1hdGUoKSB7XHJcbiAgICBpZih0aGlzLmJpbmRzLmFuaW1hdGUpIHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYmluZHMuYW5pbWF0ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgYWRkUmVuZGVyQ2FsbGJhY2soY2xiKSB7XHJcbiAgICB0aGlzLnJlbmRlckNhbGxiYWNrcy5wdXNoKGNsYik7XHJcbiAgfVxyXG5cclxuICByZW1vdmVSZW5kZXJDYWxsYmFjayhjbGIpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnJlbmRlckNhbGxiYWNrcy5pbmRleE9mKGNsYik7XHJcbiAgICBpZih+aSkge1xyXG4gICAgICB0aGlzLnJlbmRlckNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBkZWx0YVRpbWUgPSB0aGlzLmNsb2NrLmdldERlbHRhKCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZShkZWx0YVRpbWUpO1xyXG4gICAgZm9yKGxldCBjbGIgb2YgdGhpcy5yZW5kZXJDYWxsYmFja3MpIHtcclxuICAgICAgY2xiKGRlbHRhVGltZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNzc1JlbmRlcmVyLnJlbmRlcih0aGlzLmNzc1NjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzR2VvbWV0cnkoYnVmR2VvbWV0cnksIG1lc2gpIHtcclxuICAgIG1lc2guZ2VvbWV0cnkgPSBidWZHZW9tZXRyeTtcclxuICAgIC8vIE9idGFpbiBhIEdlb21ldHJ5XHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpLmZyb21CdWZmZXJHZW9tZXRyeShidWZHZW9tZXRyeSk7XHJcbiAgICAvLyBNZXJnZSB0aGUgdmVydGljZXMgc28gdGhlIHRyaWFuZ2xlIHNvdXAgaXMgY29udmVydGVkIHRvIGluZGV4ZWQgdHJpYW5nbGVzXHJcbiAgICBnZW9tZXRyeS5tZXJnZVZlcnRpY2VzKCk7XHJcbiAgICAvLyBDb252ZXJ0IGFnYWluIHRvIEJ1ZmZlckdlb21ldHJ5LCBpbmRleGVkXHJcbiAgICBjb25zdCBpbmRleGVkQnVmZmVyR2VvbSA9IHRoaXMuY3JlYXRlSW5kZXhlZEJ1ZmZlckdlb21ldHJ5RnJvbUdlb21ldHJ5KGdlb21ldHJ5KTtcclxuICAgIC8vIENyZWF0ZSBpbmRleCBhcnJheXMgbWFwcGluZyB0aGUgaW5kZXhlZCB2ZXJ0aWNlcyB0byBidWZHZW9tZXRyeSB2ZXJ0aWNlc1xyXG4gICAgcmV0dXJuIHRoaXMubWFwSW5kaWNlcyhidWZHZW9tZXRyeSwgaW5kZXhlZEJ1ZmZlckdlb20pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlSW5kZXhlZEJ1ZmZlckdlb21ldHJ5RnJvbUdlb21ldHJ5KGdlb21ldHJ5KSB7XHJcbiAgICBjb25zdCBudW1WZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bUZhY2VzID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IGJ1ZmZlckdlb20gPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShudW1WZXJ0aWNlcyAqIDMpO1xyXG4gICAgY29uc3QgaW5kaWNlcyA9IG5ldyAobnVtRmFjZXMgKiAzID4gNjU1MzUgPyBVaW50MzJBcnJheSA6IFVpbnQxNkFycmF
133455KShudW1GYWNlcyAqIDMpO1xyXG5cclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHAgPSBnZW9tZXRyeS52ZXJ0aWNlc1tpXTtcclxuICAgICAgY29uc3QgaTMgPSBpICogMztcclxuICAgICAgdmVydGljZXNbaTNdID0gcC54O1xyXG4gICAgICB2ZXJ0aWNlc1tpMyArIDFdID0gcC55O1xyXG4gICAgICB2ZXJ0aWNlc1tpMyArIDJdID0gcC56O1xyXG4gICAgfVxyXG5cclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBudW1GYWNlczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGYgPSBnZW9tZXRyeS5mYWNlc1tpXTtcclxuICAgICAgY29uc3QgaTMgPSBpICogMztcclxuICAgICAgaW5kaWNlc1tpM10gPSBmLmE7XHJcbiAgICAgIGluZGljZXNbaTMgKyAxXSA9IGYuYjtcclxuICAgICAgaW5kaWNlc1tpMyArIDJdID0gZi5jO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlckdlb20uc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShpbmRpY2VzLCAxKSk7XHJcbiAgICBidWZmZXJHZW9tLmFkZEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHZlcnRpY2VzLCAzKSk7XHJcblxyXG4gICAgcmV0dXJuIGJ1ZmZlckdlb207XHJcbiAgfVxyXG5cclxuICBpc0VxdWFsKHgxLCB5MSwgejEsIHgyLCB5MiwgejIpIHtcclxuICAgIGNvbnN0IGRlbHRhID0gMC4wMDAwMDE7XHJcbiAgICByZXR1cm4gTWF0aC5hYnMoeDIgLSB4MSkgPCBkZWx0YSAmJlxyXG4gICAgTWF0aC5hYnMoeTIgLSB5MSkgPCBkZWx0YSAmJlxyXG4gICAgTWF0aC5hYnMoejIgLSB6MSkgPCBkZWx0YTtcclxuICB9XHJcblxyXG4gIG1hcEluZGljZXMoYnVmR2VvbWV0cnksIGluZGV4ZWRCdWZmZXJHZW9tKSB7XHJcbiAgICAvLyBDcmVhdGVzIG1hcHBlZFZlcnRpY2VzLCBtYXBwZWRJbmRpY2VzIGFuZCBtYXBwZWRBc3NvY2lhdGlvbiBpbiBidWZHZW9tZXRyeVxyXG4gICAgY29uc3QgdmVydGljZXMgPSBidWZHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xyXG4gICAgY29uc3QgaWR4VmVydGljZXMgPSBpbmRleGVkQnVmZmVyR2VvbS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xyXG4gICAgY29uc3QgaW5kaWNlcyA9IGluZGV4ZWRCdWZmZXJHZW9tLmluZGV4LmFycmF5O1xyXG5cclxuICAgIGNvbnN0IG51bUlkeFZlcnRpY2VzID0gaWR4VmVydGljZXMubGVuZ3RoIC8gMztcclxuICAgIGNvbnN0IG51bVZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoIC8gMztcclxuXHJcbiAgICBidWZHZW9tZXRyeS5tYXBwZWRWZXJ0aWNlcyA9IGlkeFZlcnRpY2VzO1xyXG4gICAgYnVmR2VvbWV0cnkubWFwcGVkSW5kaWNlcyA9IGluZGljZXM7XHJcbiAgICBidWZHZW9tZXRyeS5tYXBwZWRBc3NvY2lhdGlvbiA9IFtdO1xyXG5cclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBudW1JZHhWZXJ0aWNlczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGFzc29jaWF0aW9uID0gW107XHJcbiAgICAgIGJ1Zkdlb21ldHJ5Lm1hcHBlZEFzc29jaWF0aW9uLnB1c2goYXNzb2NpYXRpb24pO1xyXG4gICAgICBjb25zdCBpMyA9IGkgKiAzO1xyXG4gICAgICBmb3IobGV0IGogPSAwOyBqIDwgbnVtVmVydGljZXM7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGozID0gaiAqIDM7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNFcXVhbChpZHhWZXJ0aWNlc1tpM10sIGlkeFZlcnRpY2VzW2kzICsgMV0sIGlkeFZlcnRpY2VzW2kzICsgMl0sXHJcbiAgICAgICAgdmVydGljZXNbajNdLCB2ZXJ0aWNlc1tqMyArIDFdLCB2ZXJ0aWNlc1tqMyArIDJdKSkge1xyXG4gICAgICAgICAgYXNzb2NpYXRpb24ucHVzaChqMyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge3ZlcnRpY2VzOiBidWZHZW9tZXRyeS5tYXBwZWRWZXJ0aWNlcywgaW5kaWNlczogYnVmR2VvbWV0cnkubWFwcGVkSW5kaWNlc307XHJcbiAgfVxyXG5cclxuICBvbmVOb2RlUG9zaXRpb25DYWxsYmFjayhwLCBxKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uLnNldChwLngsIHAueSwgcC56KTtcclxuICAgIHRoaXMucXVhdGVybmlvbi5zZXQocS54LCBxLnksIHEueiwgcS53KTtcclxuICB9XHJcblxyXG4gIG11bHR5Tm9kZVBvc2l0aW9uQ2FsbGJhY2sobm9kZSwgcCwgbikge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG4gICAgY29uc3Qgdm9sdW1lUG9zaXRpb25zID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcclxuICAgIGNvbnN0IHZvbHVtZU5vcm1hbHMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcclxuICAgIGNvbnN0IGFzc29jVmVydGV4ID0gZ2VvbWV0cnkubWFwcGVkQXNzb2NpYXRpb25bbm9kZV07XHJcblxyXG4gICAgZm9yKGxldCBrID0gMDsgayA8IGFzc29jVmVydGV4Lmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgbGV0IGluZGV4VmVydGV4ID0gYXNzb2NWZXJ0ZXhba107XHJcbiAgICAgICAgdm9sdW1lUG9zaXRpb25zW2luZGV4VmVydGV4XSA9IHAueDtcclxuICAgICAgICB2b2x1bWVOb3JtYWxzW2luZGV4VmVydGV4XSA9IG4ueDtcclxuICAgICAgICArK2luZGV4VmVydGV4O1xyXG4gICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpbmRleFZlcnRleF0gPSBwLnk7XHJcbiAgICAgICAgdm9sdW1lTm9ybWFsc1tpbmRleFZlcnRleF0gPSBuLnk7XHJcbiAgICAgICAgKytpbmRleFZlcnRleDtcclxuICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaW5kZXhWZXJ0ZXhdID0gcC56O1xyXG4gICAgICAgIHZvbHVtZU5vcm1hbHNbaW5kZXhWZXJ0ZXhdID0gbi56O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbXVsdHlOb2RlUG9zaXRpb25Qb3N0Q2FsbGJhY2soKSB7XHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcbiAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHBhdGhQb3NpdGlvbkNhbGxiYWNrKG5vZGUsIHApIHtcclxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcclxuXHRcdGxldCBpID0gMyAqIG5vZGU7XHJcblx0XHRwb3NpdGlvbnNbaSsrXSA9IHAueDtcclxuXHRcdH
13345Bvc2l0aW9uc1tpKytdID0gcC55O1xyXG5cdFx0cG9zaXRpb25zW2ldID0gcC56O1xyXG4gIH1cclxuXHJcbiAgcGF0aFBvc2l0aW9uUG9zdENhbGxiYWNrKCkge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG4gICAgZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVmlzdWFsV29ybGQuanMiLCJpbXBvcnQgQ29udHJvbGxlciBmcm9tICcuL0NvbnRyb2xsZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lkZ2V0Q29udHJvbGxlciBleHRlbmRzIENvbnRyb2xsZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nbGUoKSB7XHJcbiAgICB0aGlzLnZpc2libGUgPSAhdGhpcy52aXNpYmxlO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGZpcmVDaGFuZ2UoKSB7XHJcbiAgICBpZih0aGlzLm9uQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIGlmKHRoaXMudmlldykge1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZEZsb2F0V25kJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLnZpc2libGUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1dpZGdldENvbnRyb2xsZXIuanMiLCJpbXBvcnQgVGFyZ2V0IGZyb20gJy4vVGFyZ2V0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmNsZVRhcmdldCBleHRlbmRzIFRhcmdldCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHgsIHksIHIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIHgsXHJcbiAgICAgIHksXHJcbiAgICAgIHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0ZXN0SW50ZXJzZWN0aW9uKGUsIGRhdGEpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBjb25zdCB7eCwgeX0gPSBkYXRhLCBwID0gdGhpcy5wO1xyXG4gICAgaWYoKHgtcC54KSooeC1wLngpKyh5LXAueSkqKHktcC55KTw9cC5yKnAucikge1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLFxyXG4gICAgICAgIGRhdGFcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy90YXJnZXRzL0NpcmNsZVRhcmdldC5qcyIsImltcG9ydCBUYXJnZXQgZnJvbSAnLi9UYXJnZXQnO1xyXG5pbXBvcnQgQmFzZU1hdGhVdGlscyBmcm9tICcuLi9CYXNlTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbHlUYXJnZXQgZXh0ZW5kcyBUYXJnZXQge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwb2x5KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5wb2x5ID0gcG9seTtcclxuICB9XHJcblxyXG4gIHRlc3RJbnRlcnNlY3Rpb24oZSwgcCkge1xyXG4gICAgcmV0dXJuIEJhc2VNYXRoVXRpbHMuaXNJbnNpZGVQb2x5KHRoaXMucG9seSwgcCk/IHtcclxuICAgICAgdGFyZ2V0OiB0aGlzLFxyXG4gICAgICBkYXRhOiBwXHJcbiAgICB9OiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy90YXJnZXRzL1BvbHlUYXJnZXQuanMiLCIvKioqIElNUE9SVFMgRlJPTSBpbXBvcnRzLWxvYWRlciAqKiovXG52YXIgZGVmaW5lID0gZmFsc2U7XG5cbi8qIVxuICogalF1ZXJ5IE1vdXNld2hlZWwgMy4xLjEzXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICovXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGlmICggdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBOb2RlL0NvbW1vbkpTIHN0eWxlIGZvciBCcm93c2VyaWZ5XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHNcbiAgICAgICAgZmFjdG9yeShqUXVlcnkpO1xuICAgIH1cbn0oZnVuY3Rpb24gKCQpIHtcblxuICAgIHZhciB0b0ZpeCAgPSBbJ3doZWVsJywgJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnLCAnTW96TW91c2VQaXhlbFNjcm9sbCddLFxuICAgICAgICB0b0JpbmQgPSAoICdvbndoZWVsJyBpbiBkb2N1bWVudCB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPj0gOSApID9cbiAgICAgICAgICAgICAgICAgICAgWyd3aGVlbCddIDogWydtb3VzZXdoZWVsJywgJ0RvbU1vdXNlU2Nyb2xsJywgJ01vek1vdXNlUGl4ZWxTY3JvbGwnXSxcbiAgICAgICAgc2xpY2UgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgICAgICBudWxsTG93ZXN0RGVsdGFUaW1lb3V0LCBsb3dlc3REZWx0YTtcblxuICAgIGlmICggJC5ldmVudC5maXhIb29rcyApIHtcbiAgICAgICAgZm9yICggdmFyIGkgPSB0b0ZpeC5sZW5ndGg7IGk7ICkge1xuICAgICAgICAgICAgJC5ldmVudC5maXhIb29rc1sgdG9GaXhbLS1pXSBdID0gJC5ldmVudC5tb3VzZUhvb2tzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNwZWNpYWwgP
13345SAkLmV2ZW50LnNwZWNpYWwubW91c2V3aGVlbCA9IHtcbiAgICAgICAgdmVyc2lvbjogJzMuMS4xMicsXG5cbiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG4gICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSB0b0JpbmQubGVuZ3RoOyBpOyApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCB0b0JpbmRbLS1pXSwgaGFuZGxlciwgZmFsc2UgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25tb3VzZXdoZWVsID0gaGFuZGxlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBsaW5lIGhlaWdodCBhbmQgcGFnZSBoZWlnaHQgZm9yIHRoaXMgcGFydGljdWxhciBlbGVtZW50XG4gICAgICAgICAgICAkLmRhdGEodGhpcywgJ21vdXNld2hlZWwtbGluZS1oZWlnaHQnLCBzcGVjaWFsLmdldExpbmVIZWlnaHQodGhpcykpO1xuICAgICAgICAgICAgJC5kYXRhKHRoaXMsICdtb3VzZXdoZWVsLXBhZ2UtaGVpZ2h0Jywgc3BlY2lhbC5nZXRQYWdlSGVpZ2h0KHRoaXMpKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcbiAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IHRvQmluZC5sZW5ndGg7IGk7ICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHRvQmluZFstLWldLCBoYW5kbGVyLCBmYWxzZSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1vdXNld2hlZWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGRhdGEgd2UgYWRkZWQgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnbW91c2V3aGVlbC1saW5lLWhlaWdodCcpO1xuICAgICAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICdtb3VzZXdoZWVsLXBhZ2UtaGVpZ2h0Jyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0TGluZUhlaWdodDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgdmFyICRlbGVtID0gJChlbGVtKSxcbiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJGVsZW1bJ29mZnNldFBhcmVudCcgaW4gJC5mbiA/ICdvZmZzZXRQYXJlbnQnIDogJ3BhcmVudCddKCk7XG4gICAgICAgICAgICBpZiAoISRwYXJlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgJHBhcmVudCA9ICQoJ2JvZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCgkcGFyZW50LmNzcygnZm9udFNpemUnKSwgMTApIHx8IHBhcnNlSW50KCRlbGVtLmNzcygnZm9udFNpemUnKSwgMTApIHx8IDE2O1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFBhZ2VIZWlnaHQ6IGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiAkKGVsZW0pLmhlaWdodCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICBhZGp1c3RPbGREZWx0YXM6IHRydWUsIC8vIHNlZSBzaG91bGRBZGp1c3RPbGREZWx0YXMoKSBiZWxvd1xuICAgICAgICAgICAgbm9ybWFsaXplT2Zmc2V0OiB0cnVlICAvLyBjYWxscyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZm9yIGVhY2ggZXZlbnRcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAkLmZuLmV4dGVuZCh7XG4gICAgICAgIG1vdXNld2hlZWw6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4gPyB0aGlzLmJpbmQoJ21vdXNld2hlZWwnLCBmbikgOiB0aGlzLnRyaWdnZXIoJ21vdXNld2hlZWwnKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1bm1vdXNld2hlZWw6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bmJpbmQoJ21vdXNld2hlZWwnLCBmbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgICB2Y
13345XIgb3JnRXZlbnQgICA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudCxcbiAgICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBkZWx0YSAgICAgID0gMCxcbiAgICAgICAgICAgIGRlbHRhWCAgICAgPSAwLFxuICAgICAgICAgICAgZGVsdGFZICAgICA9IDAsXG4gICAgICAgICAgICBhYnNEZWx0YSAgID0gMCxcbiAgICAgICAgICAgIG9mZnNldFggICAgPSAwLFxuICAgICAgICAgICAgb2Zmc2V0WSAgICA9IDA7XG4gICAgICAgIGV2ZW50ID0gJC5ldmVudC5maXgob3JnRXZlbnQpO1xuICAgICAgICBldmVudC50eXBlID0gJ21vdXNld2hlZWwnO1xuXG4gICAgICAgIC8vIE9sZCBzY2hvb2wgc2Nyb2xsd2hlZWwgZGVsdGFcbiAgICAgICAgaWYgKCAnZGV0YWlsJyAgICAgIGluIG9yZ0V2ZW50ICkgeyBkZWx0YVkgPSBvcmdFdmVudC5kZXRhaWwgKiAtMTsgICAgICB9XG4gICAgICAgIGlmICggJ3doZWVsRGVsdGEnICBpbiBvcmdFdmVudCApIHsgZGVsdGFZID0gb3JnRXZlbnQud2hlZWxEZWx0YTsgICAgICAgfVxuICAgICAgICBpZiAoICd3aGVlbERlbHRhWScgaW4gb3JnRXZlbnQgKSB7IGRlbHRhWSA9IG9yZ0V2ZW50LndoZWVsRGVsdGFZOyAgICAgIH1cbiAgICAgICAgaWYgKCAnd2hlZWxEZWx0YVgnIGluIG9yZ0V2ZW50ICkgeyBkZWx0YVggPSBvcmdFdmVudC53aGVlbERlbHRhWCAqIC0xOyB9XG5cbiAgICAgICAgLy8gRmlyZWZveCA8IDE3IGhvcml6b250YWwgc2Nyb2xsaW5nIHJlbGF0ZWQgdG8gRE9NTW91c2VTY3JvbGwgZXZlbnRcbiAgICAgICAgaWYgKCAnYXhpcycgaW4gb3JnRXZlbnQgJiYgb3JnRXZlbnQuYXhpcyA9PT0gb3JnRXZlbnQuSE9SSVpPTlRBTF9BWElTICkge1xuICAgICAgICAgICAgZGVsdGFYID0gZGVsdGFZICogLTE7XG4gICAgICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlbHRhIHRvIGJlIGRlbHRhWSBvciBkZWx0YVggaWYgZGVsdGFZIGlzIDAgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXRpeVxuICAgICAgICBkZWx0YSA9IGRlbHRhWSA9PT0gMCA/IGRlbHRhWCA6IGRlbHRhWTtcblxuICAgICAgICAvLyBOZXcgc2Nob29sIHdoZWVsIGRlbHRhICh3aGVlbCBldmVudClcbiAgICAgICAgaWYgKCAnZGVsdGFZJyBpbiBvcmdFdmVudCApIHtcbiAgICAgICAgICAgIGRlbHRhWSA9IG9yZ0V2ZW50LmRlbHRhWSAqIC0xO1xuICAgICAgICAgICAgZGVsdGEgID0gZGVsdGFZO1xuICAgICAgICB9XG4gICAgICAgIGlmICggJ2RlbHRhWCcgaW4gb3JnRXZlbnQgKSB7XG4gICAgICAgICAgICBkZWx0YVggPSBvcmdFdmVudC5kZWx0YVg7XG4gICAgICAgICAgICBpZiAoIGRlbHRhWSA9PT0gMCApIHsgZGVsdGEgID0gZGVsdGFYICogLTE7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNoYW5nZSBhY3R1YWxseSBoYXBwZW5lZCwgbm8gcmVhc29uIHRvIGdvIGFueSBmdXJ0aGVyXG4gICAgICAgIGlmICggZGVsdGFZID09PSAwICYmIGRlbHRhWCA9PT0gMCApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgLy8gTmVlZCB0byBjb252ZXJ0IGxpbmVzIGFuZCBwYWdlcyB0byBwaXhlbHMgaWYgd2UgYXJlbid0IGFscmVhZHkgaW4gcGl4ZWxzXG4gICAgICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBkZWx0YSBtb2RlczpcbiAgICAgICAgLy8gICAqIGRlbHRhTW9kZSAwIGlzIGJ5IHBpeGVscywgbm90aGluZyB0byBkb1xuICAgICAgICAvLyAgICogZGVsdGFNb2RlIDEgaXMgYnkgbGluZXNcbiAgICAgICAgLy8gICAqIGRlbHRhTW9kZSAyIGlzIGJ5IHBhZ2VzXG4gICAgICAgIGlmICggb3JnRXZlbnQuZGVsdGFNb2RlID09PSAxICkge1xuICAgICAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSAkLmRhdGEodGhpcywgJ21vdXNld2hlZWwtbGluZS1oZWlnaHQnKTtcbiAgICAgICAgICAgIGRlbHRhICAqPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgZGVsdGFZICo9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkZWx0YVggKj0gbGluZUhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmICggb3JnRXZlbnQuZGVsdGFNb2RlID09PSAyICkge1xuICAgICAgICAgICAgdmFyIHBhZ2VIZWlnaHQgPSAkLmRhdGEodGhpcywgJ21vdXNld2hlZWwtcGFnZS1oZWlnaHQnKTtcbiAgICAgICAgICAgIGRlbHRhICAqPSBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgZGVsdGFZICo9IHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBkZWx0YVggKj0gcGFnZUhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIGxvd2VzdCBhYnNvbHV0ZSBkZWx0YSB0byBub3JtYWxpemUgdGhlIGRlbHRhIHZhbHVlc1xuICAgICAgICBhYnNEZWx0YSA9IE1hdGgubWF4KCBNYXRoLmFicyhkZWx0YVkpLCBNYXRoLmFicyhkZWx0YVgpICk7XG5cbiAgICAgICAgaWYgKCAhbG93ZXN0RGVsdGEgfHwgYWJzRGVsdGEgPCBsb3dlc3REZWx0YSApIHtcbiAgICAgICAgICAgIGxvd2VzdERlbHRhID0gYWJzRGVsdGE7XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCBvbGRlciBk
13345ZWx0YXMgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoIHNob3VsZEFkanVzdE9sZERlbHRhcyhvcmdFdmVudCwgYWJzRGVsdGEpICkge1xuICAgICAgICAgICAgICAgIGxvd2VzdERlbHRhIC89IDQwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRqdXN0IG9sZGVyIGRlbHRhcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKCBzaG91bGRBZGp1c3RPbGREZWx0YXMob3JnRXZlbnQsIGFic0RlbHRhKSApIHtcbiAgICAgICAgICAgIC8vIERpdmlkZSBhbGwgdGhlIHRoaW5ncyBieSA0MCFcbiAgICAgICAgICAgIGRlbHRhICAvPSA0MDtcbiAgICAgICAgICAgIGRlbHRhWCAvPSA0MDtcbiAgICAgICAgICAgIGRlbHRhWSAvPSA0MDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhIHdob2xlLCBub3JtYWxpemVkIHZhbHVlIGZvciB0aGUgZGVsdGFzXG4gICAgICAgIGRlbHRhICA9IE1hdGhbIGRlbHRhICA+PSAxID8gJ2Zsb29yJyA6ICdjZWlsJyBdKGRlbHRhICAvIGxvd2VzdERlbHRhKTtcbiAgICAgICAgZGVsdGFYID0gTWF0aFsgZGVsdGFYID49IDEgPyAnZmxvb3InIDogJ2NlaWwnIF0oZGVsdGFYIC8gbG93ZXN0RGVsdGEpO1xuICAgICAgICBkZWx0YVkgPSBNYXRoWyBkZWx0YVkgPj0gMSA/ICdmbG9vcicgOiAnY2VpbCcgXShkZWx0YVkgLyBsb3dlc3REZWx0YSk7XG5cbiAgICAgICAgLy8gTm9ybWFsaXNlIG9mZnNldFggYW5kIG9mZnNldFkgcHJvcGVydGllc1xuICAgICAgICBpZiAoIHNwZWNpYWwuc2V0dGluZ3Mubm9ybWFsaXplT2Zmc2V0ICYmIHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICkge1xuICAgICAgICAgICAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIGJvdW5kaW5nUmVjdC5sZWZ0O1xuICAgICAgICAgICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSBib3VuZGluZ1JlY3QudG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGluZm9ybWF0aW9uIHRvIHRoZSBldmVudCBvYmplY3RcbiAgICAgICAgZXZlbnQuZGVsdGFYID0gZGVsdGFYO1xuICAgICAgICBldmVudC5kZWx0YVkgPSBkZWx0YVk7XG4gICAgICAgIGV2ZW50LmRlbHRhRmFjdG9yID0gbG93ZXN0RGVsdGE7XG4gICAgICAgIGV2ZW50Lm9mZnNldFggPSBvZmZzZXRYO1xuICAgICAgICBldmVudC5vZmZzZXRZID0gb2Zmc2V0WTtcbiAgICAgICAgLy8gR28gYWhlYWQgYW5kIHNldCBkZWx0YU1vZGUgdG8gMCBzaW5jZSB3ZSBjb252ZXJ0ZWQgdG8gcGl4ZWxzXG4gICAgICAgIC8vIEFsdGhvdWdoIHRoaXMgaXMgYSBsaXR0bGUgb2RkIHNpbmNlIHdlIG92ZXJ3cml0ZSB0aGUgZGVsdGFYL1lcbiAgICAgICAgLy8gcHJvcGVydGllcyB3aXRoIG5vcm1hbGl6ZWQgZGVsdGFzLlxuICAgICAgICBldmVudC5kZWx0YU1vZGUgPSAwO1xuXG4gICAgICAgIC8vIEFkZCBldmVudCBhbmQgZGVsdGEgdG8gdGhlIGZyb250IG9mIHRoZSBhcmd1bWVudHNcbiAgICAgICAgYXJncy51bnNoaWZ0KGV2ZW50LCBkZWx0YSwgZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAgIC8vIENsZWFyb3V0IGxvd2VzdERlbHRhIGFmdGVyIHNvbWV0aW1lIHRvIGJldHRlclxuICAgICAgICAvLyBoYW5kbGUgbXVsdGlwbGUgZGV2aWNlIHR5cGVzIHRoYXQgZ2l2ZSBkaWZmZXJlbnRcbiAgICAgICAgLy8gYSBkaWZmZXJlbnQgbG93ZXN0RGVsdGFcbiAgICAgICAgLy8gRXg6IHRyYWNrcGFkID0gMyBhbmQgbW91c2Ugd2hlZWwgPSAxMjBcbiAgICAgICAgaWYgKG51bGxMb3dlc3REZWx0YVRpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KG51bGxMb3dlc3REZWx0YVRpbWVvdXQpOyB9XG4gICAgICAgIG51bGxMb3dlc3REZWx0YVRpbWVvdXQgPSBzZXRUaW1lb3V0KG51bGxMb3dlc3REZWx0YSwgMjAwKTtcblxuICAgICAgICByZXR1cm4gKCQuZXZlbnQuZGlzcGF0Y2ggfHwgJC5ldmVudC5oYW5kbGUpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG51bGxMb3dlc3REZWx0YSgpIHtcbiAgICAgICAgbG93ZXN0RGVsdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3VsZEFkanVzdE9sZERlbHRhcyhvcmdFdmVudCwgYWJzRGVsdGEpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBvbGRlciBldmVudCBhbmQgdGhlIGRlbHRhIGlzIGRpdmlzYWJsZSBieSAxMjAsXG4gICAgICAgIC8vIHRoZW4gd2UgYXJlIGFzc3VtaW5nIHRoYXQgdGhlIGJyb3dzZXIgaXMgdHJlYXRpbmcgdGhpcyBhcyBhblxuICAgICAgICAvLyBvbGRlciBtb3VzZSB3aGVlbCBldmVudCBhbmQgdGhhdCB3ZSBzaG91bGQgZGl2aWRlIHRoZSBkZWx0YXNcbiAgICAgICAgLy8gYnkgNDAgdG8gdHJ5IGFuZCBnZXQgYSBtb3JlIHVzYWJsZSBkZWx0YUZhY3Rvci5cbiAgICAgICAgLy8gU2lkZSBub3RlLCB0aGlzIGFjdHVhbGx5IGltcGFjdHMgdGhlIHJlcG9ydGVkIHNjcm9sbCBkaXN0YW5jZVxuICAgICAgICAvLyBpbiBvbGRlciBicm93c2VycyBhbmQgY2FuIGNhdXNlIHNjcm9sbGluZyB0byBiZSBzbG93ZXIgdGhhbiBuYXRpdmUuXG4gICAgICAgIC8vIFR1cm4gdGhpcyBvZmYgYnkgc2V0dGluZyAkLmV2ZW50LnNwZWNpYWwubW91c2V3aGVlbC5zZXR0aW5ncy5hZGp1c3RPbGREZWx0YXMgdG8gZmFsc2UuXG4gICAgICAgIHJldHVybiBzcGVjaWFsLnNldHRpbmdzLmFkanVzdE9sZERlbHRhcyAmJiBvcmdFdmVudC50eXBlID09PSAnbW91c2V3aGVlbCcgJiYgYWJzRGVsdGEgJSAxMjAgPT09IDA7XG4gICAgfVxuXG59KSk7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vaW1wb3J0cy1sb2FkZXI/ZGVmaW5lPT5mYWxzZSEuLi9+L2pxdWVyeS1tb3VzZXdoZWVsL2pxdWVyeS5tb3VzZXdoZWVsLmpzXG4vLyBtb2R1bGUgaWQgPSA3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBzdGF0cy5qcyAtIGh0dHA6Ly9naXRodWIuY29tL21yZG9vYi9zdGF0cy5qc1xuKGZ1bmN0aW9uKGYsZSl7XCJvYmplY3RcIj09PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6Zi5TdGF0cz1lKCl9KSh0aGlzLGZ1bmN0aW9uKCl7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGEpe2MuYXBwZW5kQ2hpbGQoYS5kb20pO3JldHVybiBhfWZ1bmN0aW9uIHUoYSl7Zm9yKHZhciBkPTA7ZDxjLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PWQ9PT1hP1wiYmxvY2tcIjpcIm5vbmVcIjtsPWF9dmFyIGw9MCxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Yy5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MC45O3otaW5kZXg6MTAwMDBcIjtjLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtcbnUoKytsJWMuY2hpbGRyZW4ubGVuZ3RoKX0sITEpO3ZhciBrPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCksZz1rLGE9MCxyPWUobmV3IGYuUGFuZWwoXCJGUFNcIixcIiMwZmZcIixcIiMwMDJcIikpLGg9ZShuZXcgZi5QYW5lbChcIk1TXCIsXCIjMGYwXCIsXCIjMDIwXCIpKTtpZihzZWxmLnBlcmZvcm1hbmNlJiZzZWxmLnBlcmZvcm1hbmNlLm1lbW9yeSl2YXIgdD1lKG5ldyBmLlBhbmVsKFwiTUJcIixcIiNmMDhcIixcIiMyMDFcIikpO3UoMCk7cmV0dXJue1JFVklTSU9OOjE2LGRvbTpjLGFkZFBhbmVsOmUsc2hvd1BhbmVsOnUsYmVnaW46ZnVuY3Rpb24oKXtrPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCl9LG
13345VuZDpmdW5jdGlvbigpe2ErKzt2YXIgYz0ocGVyZm9ybWFuY2V8fERhdGUpLm5vdygpO2gudXBkYXRlKGMtaywyMDApO2lmKGM+ZysxRTMmJihyLnVwZGF0ZSgxRTMqYS8oYy1nKSwxMDApLGc9YyxhPTAsdCkpe3ZhciBkPXBlcmZvcm1hbmNlLm1lbW9yeTt0LnVwZGF0ZShkLnVzZWRKU0hlYXBTaXplL1xuMTA0ODU3NixkLmpzSGVhcFNpemVMaW1pdC8xMDQ4NTc2KX1yZXR1cm4gY30sdXBkYXRlOmZ1bmN0aW9uKCl7az10aGlzLmVuZCgpfSxkb21FbGVtZW50OmMsc2V0TW9kZTp1fX07Zi5QYW5lbD1mdW5jdGlvbihlLGYsbCl7dmFyIGM9SW5maW5pdHksaz0wLGc9TWF0aC5yb3VuZCxhPWcod2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLHI9ODAqYSxoPTQ4KmEsdD0zKmEsdj0yKmEsZD0zKmEsbT0xNSphLG49NzQqYSxwPTMwKmEscT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3Eud2lkdGg9cjtxLmhlaWdodD1oO3Euc3R5bGUuY3NzVGV4dD1cIndpZHRoOjgwcHg7aGVpZ2h0OjQ4cHhcIjt2YXIgYj1xLmdldENvbnRleHQoXCIyZFwiKTtiLmZvbnQ9XCJib2xkIFwiKzkqYStcInB4IEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmXCI7Yi50ZXh0QmFzZWxpbmU9XCJ0b3BcIjtiLmZpbGxTdHlsZT1sO2IuZmlsbFJlY3QoMCwwLHIsaCk7Yi5maWxsU3R5bGU9ZjtiLmZpbGxUZXh0KGUsdCx2KTtcbmIuZmlsbFJlY3QoZCxtLG4scCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCxtLG4scCk7cmV0dXJue2RvbTpxLHVwZGF0ZTpmdW5jdGlvbihoLHcpe2M9TWF0aC5taW4oYyxoKTtrPU1hdGgubWF4KGssaCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPTE7Yi5maWxsUmVjdCgwLDAscixtKTtiLmZpbGxTdHlsZT1mO2IuZmlsbFRleHQoZyhoKStcIiBcIitlK1wiIChcIitnKGMpK1wiLVwiK2coaykrXCIpXCIsdCx2KTtiLmRyYXdJbWFnZShxLGQrYSxtLG4tYSxwLGQsbSxuLWEscCk7Yi5maWxsUmVjdChkK24tYSxtLGEscCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCtuLWEsbSxhLGcoKDEtaC93KSpwKSl9fX07cmV0dXJuIGZ9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL34vc3RhdHMuanMvYnVpbGQvc3RhdHMubWluLmpzXG4vLyBtb2R1bGUgaWQgPSA3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.