@vonage/ml-transformers 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,9 @@
1
+ var BlurRadius = /* @__PURE__ */ ((BlurRadius2) => {
2
+ BlurRadius2["Low"] = "Low";
3
+ BlurRadius2["High"] = "High";
4
+ return BlurRadius2;
5
+ })(BlurRadius || {});
6
+ const simd = async () => WebAssembly.validate(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 10, 10, 1, 8, 0, 65, 0, 253, 15, 253, 98, 11]));
1
7
  function isSupported$1() {
2
8
  return new Promise((resolve, reject) => {
3
9
  if (typeof MediaStreamTrackProcessor === "undefined" || typeof MediaStreamTrackGenerator === "undefined") {
@@ -1466,9 +1472,9 @@ class InsertableStreamHelper {
1466
1472
  }
1467
1473
  }
1468
1474
  class MediaProcessorConnector {
1469
- constructor(vonageMediaProcessor) {
1475
+ constructor(vonageMediaProcessor2) {
1470
1476
  this.insertableStreamHelper_ = new InsertableStreamHelper();
1471
- this.mediaProcessor_ = vonageMediaProcessor;
1477
+ this.mediaProcessor_ = vonageMediaProcessor2;
1472
1478
  }
1473
1479
  setTrack(track) {
1474
1480
  return new Promise((resolve, reject) => {
@@ -1497,591 +1503,235 @@ class MediaProcessorConnector {
1497
1503
  });
1498
1504
  }
1499
1505
  }
1500
- const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFR7fVQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxULmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgWT17ZXhwb3J0czp7fX0sRWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLG89MDtvPG4ubGVuZ3RoO28rKyluW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4gZS5hcHBseSh0LG4pfX0scnQ9RWUsUj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIFoocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocil9ZnVuY3Rpb24gZWUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBzdChyKXtyZXR1cm4gciE9PW51bGwmJiFlZShyKSYmci5jb25zdHJ1Y3RvciE9PW51bGwmJiFlZShyLmNvbnN0cnVjdG9yKSYmdHlwZW9mIHIuY29uc3RydWN0b3IuaXNCdWZmZXI9PSJmdW5jdGlvbiImJnIuY29uc3RydWN0b3IuaXNCdWZmZXIocil9ZnVuY3Rpb24gVGUocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSJ9ZnVuY3Rpb24gbnQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZvcm1EYXRhXSJ9ZnVuY3Rpb24gaXQocil7dmFyIGU7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCImJkFycmF5QnVmZmVyLmlzVmlldz9lPUFycmF5QnVmZmVyLmlzVmlldyhyKTplPXImJnIuYnVmZmVyJiZUZShyLmJ1ZmZlciksZX1mdW5jdGlvbiBvdChyKXtyZXR1cm4gdHlwZW9mIHI9PSJzdHJpbmcifWZ1bmN0aW9uIGF0KHIpe3JldHVybiB0eXBlb2Ygcj09Im51bWJlciJ9ZnVuY3Rpb24gUmUocil7cmV0dXJuIHIhPT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9ZnVuY3Rpb24gRihyKXtpZihSLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiB1dChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIGx0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gY3Qocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBQZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBmdChyKXtyZXR1cm4gUmUocikmJlBlKHIucGlwZSl9ZnVuY3Rpb24gaHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIGR0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gcHQoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gdGUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxaKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIHJlKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0YocltvXSkmJkYobik/cltvXT1yZShyW29dLG4pOkYobik/cltvXT1yZSh7fSxuKTpaKG4pP3Jbb109bi5zbGljZSgpOnJbb109bn1mb3IodmFyIHQ9MCxzPWFyZ3VtZW50cy5sZW5ndGg7dDxzO3QrKyl0ZShhcmd1bWVudHNbdF0sZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gbXQocixlLHQpe3JldHVybiB0ZShlLGZ1bmN0aW9uKG4sbyl7dCYmdHlwZW9mIG49PSJmdW5jdGlvbiI/cltvXT1ydChuLHQpOnJbb109bn0pLHJ9ZnVuY3Rpb24gZ3Qocil7cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYocj1yLnNsaWNlKDEpKSxyfXZhciBwPXtpc0FycmF5OlosaXNBcnJheUJ1ZmZlcjpUZSxpc0J1ZmZlcjpzdCxpc0Zvcm1EYXRhOm50LGlzQXJyYXlCdWZmZXJWaWV3Oml0LGlzU3RyaW5nOm90LGlzTnVtYmVyOmF0LGlzT2JqZWN0OlJlLGlzUGxhaW5PYmplY3Q6Rixpc1VuZGVmaW5lZDplZSxpc0RhdGU6dXQsaXNGaWxlOmx0LGlzQmxvYjpjdCxpc0Z1bmN0aW9uOlBlLGlzU3RyZWFtOmZ0LGlzVVJMU2VhcmNoUGFyYW1zOmh0LGlzU3RhbmRhcmRCcm93c2VyRW52OnB0LGZvckVhY2g6dGUsbWVyZ2U6cmUsZXh0ZW5kOm10LHRyaW06ZHQsc3RyaXBCT006Z3R9LHg9cDtmdW5jdGlvbiBDZShyKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgU2U9ZnVuY3Rpb24oZSx0LHMpe2lmKCF0KXJldHVybiBlO3ZhciBuO2lmKHMpbj1zKHQpO2Vsc2UgaWYoeC5pc1VSTFNlYXJjaFBhcmFtcyh0KSluPXQudG9TdHJpbmcoKTtlbHNle3ZhciBvPVtdO3guZm9yRWFjaCh0LGZ1bmN0aW9uKGwsbSl7bD09PW51bGx8fHR5cGVvZiBsPT0idW5kZWZpbmVkInx8KHguaXNBcnJheShsKT9tPW0rIltdIjpsPVtsXSx4LmZvckVhY2gobCxmdW5jdGlvbihmKXt4LmlzRGF0ZShmKT9mPWYudG9JU09TdHJpbmcoKTp4LmlzT2JqZWN0KGYpJiYoZj1KU09OLnN0cmluZ2lmeShmKSksby5wdXNoKENlKG0pKyI9IitDZShmKSl9KSl9KSxuPW8uam9pbigiJiIpfWlmKG4pe3ZhciBpPWUuaW5kZXhPZigiIyIpO2khPT0tMSYmKGU9ZS5zbGljZSgwLGkpKSxlKz0oZS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStufXJldHVybiBlfSx5dD1wO2Z1bmN0aW9uIEwoKXt0aGlzLmhhbmRsZXJzPVtdfUwucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQscyl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpzP3Muc3luY2hyb25vdXM6ITEscnVuV2hlbjpzP3MucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sTC5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LEwucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7eXQuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHMpe3MhPT1udWxsJiZlKHMpfSl9O3ZhciBfdD1MLHZ0PXAsYnQ9ZnVuY3Rpb24oZSx0KXt2dC5mb3JFYWNoKGUsZnVuY3Rpb24obixvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1uLGRlbGV0ZSBlW29dKX0pfSx4ZT1mdW5jdGlvbihlLHQscyxuLG8pe3JldHVybiBlLmNvbmZpZz10LHMmJihlLmNvZGU9cyksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sd3Q9eGUsT2U9ZnVuY3Rpb24oZSx0LHMsbixvKXt2YXIgaT1uZXcgRXJyb3IoZSk7cmV0dXJuIHd0KGksdCxzLG4sbyl9LEV0PU9lLFR0PWZ1bmN0aW9uKGUsdCxzKXt2YXIgbj1zLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshcy5zdGF0dXN8fCFufHxuKHMuc3RhdHVzKT9lKHMpOnQoRXQoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIitzLnN0YXR1cyxzLmNvbmZpZyxudWxsLHMucmVxdWVzdCxzKSl9LEQ9cCxSdD1ELmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24odCxzLG4sbyxpLGEpe3ZhciBsPVtdO2wucHVzaCh0KyI9IitlbmNvZGVVUklDb21wb25lbnQocykpLEQuaXNOdW1iZXIobikmJmwucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKG4pLnRvR01UU3RyaW5nKCkpLEQuaXNTdHJpbmcobykmJmwucHVzaCgicGF0aD0iK28pLEQuaXNTdHJpbmcoaSkmJmwucHVzaCgiZG9tYWluPSIraSksYT09PSEwJiZsLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1sLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24odCl7dmFyIHM9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK3QrIik9KFteO10qKSIpKTtyZXR1cm4gcz9kZWNvZGVVUklDb21wb25lbnQoc1szXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGUodCwiIixEYXRlLm5vdygpLTg2NGU1KX19fSgpOmZ1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSgpLFB0PWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LEN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LFN0PVB0LHh0PUN0LE90PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFTdCh0KT94dChlLHQpOnR9LHNlPXAsSXQ9WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSxNdD1mdW5jdGlvbihlKXt2YXIgdD17fSxzLG4sbztyZXR1cm4gZSYmc2UuZm9yRWFjaChlLnNwbGl0KGAKYCksZnVuY3Rpb24oYSl7aWYobz1hLmluZGV4T2YoIjoiKSxzPXNlLnRyaW0oYS5zdWJzdHIoMCxvKSkudG9Mb3dlckNhc2UoKSxuPXNlLnRyaW0oYS5zdWJzdHIobysxKSkscyl7aWYodFtzXSYmSXQuaW5kZXhPZihzKT49MClyZXR1cm47cz09PSJzZXQtY29va2llIj90W3NdPSh0W3NdP3Rbc106W10pLmNvbmNhdChbbl0pOnRbc109dFtzXT90W3NdKyIsICIrbjpufX0pLHR9LEllPXAsa3Q9SWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlPS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikscztmdW5jdGlvbiBuKG8pe3ZhciBpPW87cmV0dXJuIGUmJih0LnNldEF0dHJpYnV0ZSgiaHJlZiIsaSksaT10LmhyZWYpLHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSx7aHJlZjp0LmhyZWYscHJvdG9jb2w6dC5wcm90b2NvbD90LnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDp0Lmhvc3Qsc2VhcmNoOnQuc2VhcmNoP3Quc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6dC5oYXNoP3QuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnQuaG9zdG5hbWUscG9ydDp0LnBvcnQscGF0aG5hbWU6dC5wYXRobmFtZS5jaGFyQXQoMCk9PT0iLyI/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZX19cmV0dXJuIHM9bih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24oaSl7dmFyIGE9SWUuaXNTdHJpbmcoaSk/bihpKTppO3JldHVybiBhLnByb3RvY29sPT09cy5wcm90b2NvbCYmYS5ob3N0PT09cy5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiEwfX0oKTtmdW5jdGlvbiBuZShyKXt0aGlzLm1lc3NhZ2U9cn1uZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sbmUucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIHE9bmUsSD1wLEF0PVR0LE50PVJ0LCR0PVNlLFV0PU90LEJ0PU10LEZ0PWt0LGllPU9lLEx0PUosRHQ9cSxNZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocyxuKXt2YXIgbz1lLmRhdGEsaT1lLmhlYWRlcnMsYT1lLnJlc3BvbnNlVHlwZSxsO2Z1bmN0aW9uIG0oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGwpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsbCl9SC5pc0Zvcm1EYXRhKG8pJiZkZWxldGUgaVsiQ29udGVudC1UeXBlIl07dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGY9ZS5hdXRoLnVzZXJuYW1lfHwiIixFPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7aS5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoZisiOiIrRSl9dmFyIGc9VXQoZS5iYXNlVVJMLGUudXJsKTt1Lm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSwkdChnLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksITApLHUudGltZW91dD1lLnRpbWVvdXQ7ZnVuY3Rpb24gZXQoKXtpZighIXUpe3ZhciBiPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gdT9CdCh1LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE49IWF8fGE9PT0idGV4dCJ8fGE9PT0ianNvbiI/dS5yZXNwb25zZVRleHQ6dS5yZXNwb25zZSxTPXtkYXRhOk4sc3RhdHVzOnUuc3RhdHVzLHN0YXR1c1RleHQ6dS5zdGF0dXNUZXh0LGhlYWRlcnM6Yixjb25maWc6ZSxyZXF1ZXN0OnV9O0F0KGZ1bmN0aW9uKHdlKXtzKHdlKSxtKCl9LGZ1bmN0aW9uKHdlKXtuKHdlKSxtKCl9LFMpLHU9bnVsbH19aWYoIm9ubG9hZGVuZCJpbiB1P3Uub25sb2FkZW5kPWV0OnUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IXV8fHUucmVhZHlTdGF0ZSE9PTR8fHUuc3RhdHVzPT09MCYmISh1LnJlc3BvbnNlVVJMJiZ1LnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChldCl9LHUub25hYm9ydD1mdW5jdGlvbigpeyF1fHwobihpZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLHUpKSx1PW51bGwpfSx1Lm9uZXJyb3I9ZnVuY3Rpb24oKXtuKGllKCJOZXR3b3JrIEVycm9yIixlLG51bGwsdSkpLHU9bnVsbH0sdS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTj1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsUz1lLnRyYW5zaXRpb25hbHx8THQudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE49ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxuKGllKE4sZSxTLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbH0sSC5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgdHQ9KGUud2l0aENyZWRlbnRpYWxzfHxGdChnKSkmJmUueHNyZkNvb2tpZU5hbWU/TnQucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7dHQmJihpW2UueHNyZkhlYWRlck5hbWVdPXR0KX0ic2V0UmVxdWVzdEhlYWRlciJpbiB1JiZILmZvckVhY2goaSxmdW5jdGlvbihOLFMpe3R5cGVvZiBvPT0idW5kZWZpbmVkIiYmUy50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSI/ZGVsZXRlIGlbU106dS5zZXRSZXF1ZXN0SGVhZGVyKFMsTil9KSxILmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KHUud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLGEmJmEhPT0ianNvbiImJih1LnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmdS51cGxvYWQmJnUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihsPWZ1bmN0aW9uKGIpeyF1fHwobighYnx8YiYmYi50eXBlP25ldyBEdCgiY2FuY2VsZWQiKTpiKSx1LmFib3J0KCksdT1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobCksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2woKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbCkpKSxvfHwobz1udWxsKSx1LnNlbmQobyl9KX0saD1wLGtlPWJ0LHF0PXhlLEh0PXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gQWUocixlKXshaC5pc1VuZGVmaW5lZChyKSYmaC5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBqdCgpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPU1lKSxyfWZ1bmN0aW9uIEp0KHIsZSx0KXtpZihoLmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksaC50cmltKHIpfWNhdGNoKHMpe2lmKHMubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgc31yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciBqPXt0cmFuc2l0aW9uYWw6e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LGFkYXB0ZXI6anQoKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBrZSh0LCJBY2NlcHQiKSxrZSh0LCJDb250ZW50LVR5cGUiKSxoLmlzRm9ybURhdGEoZSl8fGguaXNBcnJheUJ1ZmZlcihlKXx8aC5pc0J1ZmZlcihlKXx8aC5pc1N0cmVhbShlKXx8aC5pc0ZpbGUoZSl8fGguaXNCbG9iKGUpP2U6aC5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjpoLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhBZSh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6aC5pc09iamVjdChlKXx8dCYmdFsiQ29udGVudC1UeXBlIl09PT0iYXBwbGljYXRpb24vanNvbiI/KEFlKHQsImFwcGxpY2F0aW9uL2pzb24iKSxKdChlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8ai50cmFuc2l0aW9uYWwscz10JiZ0LnNpbGVudEpTT05QYXJzaW5nLG49dCYmdC5mb3JjZWRKU09OUGFyc2luZyxvPSFzJiZ0aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihvfHxuJiZoLmlzU3RyaW5nKGUpJiZlLmxlbmd0aCl0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goaSl7aWYobyl0aHJvdyBpLm5hbWU9PT0iU3ludGF4RXJyb3IiP3F0KGksdGhpcywiRV9KU09OX1BBUlNFIik6aX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtoLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sZnVuY3Rpb24oZSl7ai5oZWFkZXJzW2VdPXt9fSksaC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7ai5oZWFkZXJzW2VdPWgubWVyZ2UoSHQpfSk7dmFyIEo9aixWdD1wLHp0PUosV3Q9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXRoaXN8fHp0O3JldHVybiBWdC5mb3JFYWNoKHMsZnVuY3Rpb24oaSl7ZT1pLmNhbGwobixlLHQpfSksZX0sTmU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5fX0NBTkNFTF9fKX0sJGU9cCxvZT1XdCxHdD1OZSxRdD1KLFh0PXE7ZnVuY3Rpb24gYWUocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IFh0KCJjYW5jZWxlZCIpfXZhciBLdD1mdW5jdGlvbihlKXthZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9b2UuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9JGUubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSwkZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKG4pe2RlbGV0ZSBlLmhlYWRlcnNbbl19KTt2YXIgdD1lLmFkYXB0ZXJ8fFF0LmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gYWUoZSksbi5kYXRhPW9lLmNhbGwoZSxuLmRhdGEsbi5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLG59LGZ1bmN0aW9uKG4pe3JldHVybiBHdChuKXx8KGFlKGUpLG4mJm4ucmVzcG9uc2UmJihuLnJlc3BvbnNlLmRhdGE9b2UuY2FsbChlLG4ucmVzcG9uc2UuZGF0YSxuLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChuKX0pfSx5PXAsVWU9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBzPXt9O2Z1bmN0aW9uIG4odSxmKXtyZXR1cm4geS5pc1BsYWluT2JqZWN0KHUpJiZ5LmlzUGxhaW5PYmplY3QoZik/eS5tZXJnZSh1LGYpOnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHt9LGYpOnkuaXNBcnJheShmKT9mLnNsaWNlKCk6Zn1mdW5jdGlvbiBvKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKGVbdV0sdFt1XSl9ZnVuY3Rpb24gaSh1KXtpZigheS5pc1VuZGVmaW5lZCh0W3VdKSlyZXR1cm4gbih2b2lkIDAsdFt1XSl9ZnVuY3Rpb24gYSh1KXtpZih5LmlzVW5kZWZpbmVkKHRbdV0pKXtpZigheS5pc1VuZGVmaW5lZChlW3VdKSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9ZWxzZSByZXR1cm4gbih2b2lkIDAsdFt1XSl9ZnVuY3Rpb24gbCh1KXtpZih1IGluIHQpcmV0dXJuIG4oZVt1XSx0W3VdKTtpZih1IGluIGUpcmV0dXJuIG4odm9pZCAwLGVbdV0pfXZhciBtPXt1cmw6aSxtZXRob2Q6aSxkYXRhOmksYmFzZVVSTDphLHRyYW5zZm9ybVJlcXVlc3Q6YSx0cmFuc2Zvcm1SZXNwb25zZTphLHBhcmFtc1NlcmlhbGl6ZXI6YSx0aW1lb3V0OmEsdGltZW91dE1lc3NhZ2U6YSx3aXRoQ3JlZGVudGlhbHM6YSxhZGFwdGVyOmEscmVzcG9uc2VUeXBlOmEseHNyZkNvb2tpZU5hbWU6YSx4c3JmSGVhZGVyTmFtZTphLG9uVXBsb2FkUHJvZ3Jlc3M6YSxvbkRvd25sb2FkUHJvZ3Jlc3M6YSxkZWNvbXByZXNzOmEsbWF4Q29udGVudExlbmd0aDphLG1heEJvZHlMZW5ndGg6YSx0cmFuc3BvcnQ6YSxodHRwQWdlbnQ6YSxodHRwc0FnZW50OmEsY2FuY2VsVG9rZW46YSxzb2NrZXRQYXRoOmEscmVzcG9uc2VFbmNvZGluZzphLHZhbGlkYXRlU3RhdHVzOmx9O3JldHVybiB5LmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihmKXt2YXIgRT1tW2ZdfHxvLGc9RShmKTt5LmlzVW5kZWZpbmVkKGcpJiZFIT09bHx8KHNbZl09Zyl9KSxzfSxCZT17dmVyc2lvbjoiMC4yNS4wIn0sWXQ9QmUudmVyc2lvbix1ZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXt1ZVtyXT1mdW5jdGlvbihzKXtyZXR1cm4gdHlwZW9mIHM9PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgRmU9e307dWUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxzKXtmdW5jdGlvbiBuKG8saSl7cmV0dXJuIltBeGlvcyB2IitZdCsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2krKHM/Ii4gIitzOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxpLGEpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IobihpLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFGZVtpXSYmKEZlW2ldPSEwLGNvbnNvbGUud2FybihuKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8saSxhKTohMH19O2Z1bmN0aW9uIFp0KHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgcz1PYmplY3Qua2V5cyhyKSxuPXMubGVuZ3RoO24tLSA+MDspe3ZhciBvPXNbbl0saT1lW29dO2lmKGkpe3ZhciBhPXJbb10sbD1hPT09dm9pZCAwfHxpKGEsbyxyKTtpZihsIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitsKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBlcj17YXNzZXJ0T3B0aW9uczpadCx2YWxpZGF0b3JzOnVlfSxMZT1wLHRyPVNlLERlPV90LHFlPUt0LFY9VWUsSGU9ZXIsTz1IZS52YWxpZGF0b3JzO2Z1bmN0aW9uICQocil7dGhpcy5kZWZhdWx0cz1yLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBEZSxyZXNwb25zZTpuZXcgRGV9fSQucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZT09InN0cmluZyI/KHQ9dHx8e30sdC51cmw9ZSk6dD1lfHx7fSwhdC51cmwpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBjb25maWcgdXJsIGlzIG5vdCB2YWxpZCIpO3Q9Vih0aGlzLmRlZmF1bHRzLHQpLHQubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgcz10LnRyYW5zaXRpb25hbDtzIT09dm9pZCAwJiZIZS5hc3NlcnRPcHRpb25zKHMse3NpbGVudEpTT05QYXJzaW5nOk8udHJhbnNpdGlvbmFsKE8uYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6Ty50cmFuc2l0aW9uYWwoTy5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOk8udHJhbnNpdGlvbmFsKE8uYm9vbGVhbil9LCExKTt2YXIgbj1bXSxvPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihnKXt0eXBlb2YgZy5ydW5XaGVuPT0iZnVuY3Rpb24iJiZnLnJ1bldoZW4odCk9PT0hMXx8KG89byYmZy5zeW5jaHJvbm91cyxuLnVuc2hpZnQoZy5mdWxmaWxsZWQsZy5yZWplY3RlZCkpfSk7dmFyIGk9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbihnKXtpLnB1c2goZy5mdWxmaWxsZWQsZy5yZWplY3RlZCl9KTt2YXIgYTtpZighbyl7dmFyIGw9W3FlLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGwsbiksbD1sLmNvbmNhdChpKSxhPVByb21pc2UucmVzb2x2ZSh0KTtsLmxlbmd0aDspYT1hLnRoZW4obC5zaGlmdCgpLGwuc2hpZnQoKSk7cmV0dXJuIGF9Zm9yKHZhciBtPXQ7bi5sZW5ndGg7KXt2YXIgdT1uLnNoaWZ0KCksZj1uLnNoaWZ0KCk7dHJ5e209dShtKX1jYXRjaChFKXtmKEUpO2JyZWFrfX10cnl7YT1xZShtKX1jYXRjaChFKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoRSl9Zm9yKDtpLmxlbmd0aDspYT1hLnRoZW4oaS5zaGlmdCgpLGkuc2hpZnQoKSk7cmV0dXJuIGF9LCQucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtpZighZS51cmwpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBjb25maWcgdXJsIGlzIG5vdCB2YWxpZCIpO3JldHVybiBlPVYodGhpcy5kZWZhdWx0cyxlKSx0cihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxMZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXskLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHMpe3JldHVybiB0aGlzLnJlcXVlc3QoVihzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTooc3x8e30pLmRhdGF9KSl9fSksTGUuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKGUpeyQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFYobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6c30pKX19KTt2YXIgcnI9JCxzcj1xO2Z1bmN0aW9uIEkocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihuKXtlPW59KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKHMpe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgbixvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKG49MDtuPG87bisrKXQuX2xpc3RlbmVyc1tuXShzKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihzKXt2YXIgbixvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGkpe3Quc3Vic2NyaWJlKGkpLG49aX0pLnRoZW4ocyk7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShuKX0sb30scihmdW5jdGlvbihuKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBzcihuKSxlKHQucmVhc29uKSl9KX1JLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LEkucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxJLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxJLnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IEkoZnVuY3Rpb24obil7ZT1ufSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgbnI9SSxpcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIGUuYXBwbHkobnVsbCxzKX19LG9yPXAsYXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG9yLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxqZT1wLHVyPUVlLHo9cnIsbHI9VWUsY3I9SjtmdW5jdGlvbiBKZShyKXt2YXIgZT1uZXcgeihyKSx0PXVyKHoucHJvdG90eXBlLnJlcXVlc3QsZSk7cmV0dXJuIGplLmV4dGVuZCh0LHoucHJvdG90eXBlLGUpLGplLmV4dGVuZCh0LGUpLHQuY3JlYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBKZShscihyLG4pKX0sdH12YXIgdz1KZShjcik7dy5BeGlvcz16LHcuQ2FuY2VsPXEsdy5DYW5jZWxUb2tlbj1ucix3LmlzQ2FuY2VsPU5lLHcuVkVSU0lPTj1CZS52ZXJzaW9uLHcuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX0sdy5zcHJlYWQ9aXIsdy5pc0F4aW9zRXJyb3I9YXIsWS5leHBvcnRzPXcsWS5leHBvcnRzLmRlZmF1bHQ9dzt2YXIgZnI9WS5leHBvcnRzO2NsYXNzIGN7aXNFbXB0eSgpe3JldHVybiF0aGlzLmlzUHJlc2VudCgpfXN0YXRpYyBvZihlKXtpZihlIT1udWxsKXJldHVybiBuZXcgVmUoZSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhc3NlZCB2YWx1ZSB3YXMgbnVsbCBvciB1bmRlZmluZWQuIil9c3RhdGljIG9mTm9uTnVsbChlKXtyZXR1cm4gYy5vZihlKX1zdGF0aWMgb2ZOdWxsYWJsZShlKXtyZXR1cm4gZSE9bnVsbD9uZXcgVmUoZSk6bmV3IHplfXN0YXRpYyBlbXB0eSgpe3JldHVybiBuZXcgemV9c3RhdGljIGZyb20oZSl7c3dpdGNoKGUua2luZCl7Y2FzZSJwcmVzZW50IjpyZXR1cm4gYy5vZihlLnZhbHVlKTtjYXNlImVtcHR5IjpyZXR1cm4gYy5lbXB0eSgpO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhc3NlZCB2YWx1ZSB3YXMgbm90IGFuIE9wdGlvbiB0eXBlLiIpfX19Y2xhc3MgVmUgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5wYXlsb2FkPWV9aXNQcmVzZW50KCl7cmV0dXJuITB9Z2V0KCl7cmV0dXJuIHRoaXMucGF5bG9hZH1pZlByZXNlbnQoZSl7ZSh0aGlzLnBheWxvYWQpfWlmUHJlc2VudE9yRWxzZShlLHQpe2UodGhpcy5wYXlsb2FkKX1maWx0ZXIoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKT90aGlzOmMuZW1wdHkoKX1tYXAoZSl7Y29uc3QgdD1lKHRoaXMucGF5bG9hZCk7cmV0dXJuIGMub2ZOdWxsYWJsZSh0KX1mbGF0TWFwKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCl9b3IoZSl7cmV0dXJuIHRoaXN9b3JFbHNlKGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JFbHNlVGhyb3coZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vck51bGwoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yVW5kZWZpbmVkKCl7cmV0dXJuIHRoaXMucGF5bG9hZH10b09wdGlvbigpe3JldHVybntraW5kOiJwcmVzZW50Iix2YWx1ZTp0aGlzLnBheWxvYWR9fW1hdGNoZXMoZSl7cmV0dXJuIGUucHJlc2VudCh0aGlzLnBheWxvYWQpfXRvSlNPTihlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfX1jbGFzcyB6ZSBleHRlbmRzIGN7aXNQcmVzZW50KCl7cmV0dXJuITF9Y29uc3RydWN0b3IoKXtzdXBlcigpfWdldCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBvcHRpb25hbCBpcyBub3QgcHJlc2VudC4iKX1pZlByZXNlbnQoZSl7fWlmUHJlc2VudE9yRWxzZShlLHQpe3QoKX1maWx0ZXIoZSl7cmV0dXJuIHRoaXN9bWFwKGUpe3JldHVybiBjLmVtcHR5KCl9ZmxhdE1hcChlKXtyZXR1cm4gYy5lbXB0eSgpfW9yKGUpe3JldHVybiBlKCl9b3JFbHNlKGUpe3JldHVybiBlfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5vckVsc2UoZSgpKX1vckVsc2VUaHJvdyhlKXt0aHJvdyBlKCl9b3JOdWxsKCl7cmV0dXJuIG51bGx9b3JVbmRlZmluZWQoKXt9dG9PcHRpb24oKXtyZXR1cm57a2luZDoiZW1wdHkifX1tYXRjaGVzKGUpe3JldHVybiBlLmVtcHR5KCl9dG9KU09OKGUpe3JldHVybiBudWxsfX1jb25zdCBocj0iMS4yLjciO2Z1bmN0aW9uIGRyKHIpe2dsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGE9cn1mdW5jdGlvbiBwcigpe3JldHVybiBnbG9iYWxUaGlzLl92b25hZ2VNZWRpYVByb2Nlc3Nvck1ldGFkYXRhfWNsYXNzIF97Y29uc3RydWN0b3IoKXtjb25zdCBlPXByKCk7dGhpcy5fcmVwb3J0PXthY3Rpb246Yy5lbXB0eSgpLGFwcGxpY2F0aW9uSWQ6Yy5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5hcHBJZDpudWxsKSx0aW1lc3RhbXA6RGF0ZS5ub3coKSxmcHM6Yy5lbXB0eSgpLGZyYW1lc1RyYW5zZm9ybWVkOmMuZW1wdHkoKSxndWlkOmMuZW1wdHkoKSxoaWdoZXN0RnJhbWVUcmFuc2Zvcm1DcHU6Yy5lbXB0eSgpLG1lc3NhZ2U6Yy5lbXB0eSgpLHNvdXJjZTpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnNvdXJjZVR5cGU6bnVsbCksdHJhbnNmb3JtZWRGcHM6Yy5lbXB0eSgpLHRyYW5zZm9ybWVyVHlwZTpjLmVtcHR5KCksdmFyaWF0aW9uOmMuZW1wdHkoKSx2aWRlb0hlaWdodDpjLmVtcHR5KCksdmlkZW9XaWR0aDpjLmVtcHR5KCksdmVyc2lvbjpocixlcnJvcjpjLmVtcHR5KCkscHJveHlVcmw6Yy5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5wcm94eVVybDpudWxsKX19YWN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuYWN0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfWZyYW1lc1RyYW5zZm9ybWVkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnJhbWVzVHJhbnNmb3JtZWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnBzPWMub2ZOdWxsYWJsZShlKSx0aGlzfWd1aWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5ndWlkPWMub2ZOdWxsYWJsZShlKSx0aGlzfW1lc3NhZ2UoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5tZXNzYWdlPWMub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVkRnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZWRGcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZXJUeXBlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZXJUeXBlPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZhcmlhdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZhcmlhdGlvbj1jLm9mTnVsbGFibGUoZSksdGhpc312aWRlb0hlaWdodChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvSGVpZ2h0PWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvV2lkdGgoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb1dpZHRoPWMub2ZOdWxsYWJsZShlKSx0aGlzfWVycm9yKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZXJyb3I9Yy5vZk51bGxhYmxlKGUpLHRoaXN9YnVpbGQoKXtyZXR1cm4gdGhpcy5fcmVwb3J0fX1jb25zdCBtcj1yPT5KU09OLnN0cmluZ2lmeShyLChlLHQpPT57aWYodCE9PW51bGwpcmV0dXJuIHR9KTtjbGFzcyB2e3N0YXRpYyByZXBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LHMpPT57aWYoZS5hcHBsaWNhdGlvbklkLmlzRW1wdHkoKXx8ZS5zb3VyY2UuaXNFbXB0eSgpKXt0KCJzdWNjZXNzIik7cmV0dXJufWxldCBuPWZyLmNyZWF0ZSgpLG89e3RpbWVvdXQ6MWU0LHRpbWVvdXRFcnJvck1lc3NhZ2U6IlJlcXVlc3QgdGltZW91dCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX0saT0iaGxnLnRva2JveC5jb20vcHJvZC9sb2dnaW5nL3ZjcF93ZWJydGMiO2lmKGUucHJveHlVcmwuaXNFbXB0eSgpKWk9Imh0dHBzOi8vIitpO2Vsc2V7bGV0IGE7ZS5wcm94eVVybC5nZXQoKS5zbGljZShlLnByb3h5VXJsLmdldCgpLmxlbmd0aC0xKSE9PSIvIj9hPWUucHJveHlVcmwuZ2V0KCkrIi8iOmE9ZS5wcm94eVVybC5nZXQoKSxpPWEraX1uLnBvc3QoaSxtcihlKSxvKS50aGVuKGE9Pntjb25zb2xlLmxvZyhhKSx0KCJzdWNjZXNzIil9KS5jYXRjaChhPT57Y29uc29sZS5sb2coYSkscyhhKX0pfSl9fXZhciBXLGdyPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiB5cigpe2lmKCFXJiYoVz10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhVykpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBXKGdyKX12YXIgX3I9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIHZyKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJl9yLnRlc3Qocil9Zm9yKHZhciBkPVtdLGxlPTA7bGU8MjU2OysrbGUpZC5wdXNoKChsZSsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIGJyKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KGRbcltlKzBdXStkW3JbZSsxXV0rZFtyW2UrMl1dK2RbcltlKzNdXSsiLSIrZFtyW2UrNF1dK2RbcltlKzVdXSsiLSIrZFtyW2UrNl1dK2RbcltlKzddXSsiLSIrZFtyW2UrOF1dK2RbcltlKzldXSsiLSIrZFtyW2UrMTBdXStkW3JbZSsxMV1dK2RbcltlKzEyXV0rZFtyW2UrMTNdXStkW3JbZSsxNF1dK2RbcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIXZyKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gV2UocixlLHQpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8eXIpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgbj0wO248MTY7KytuKWVbdCtuXT1zW25dO3JldHVybiBlfXJldHVybiBicihzKX1jb25zdCBQPW5ldyBXZWFrTWFwLEc9bmV3IFdlYWtNYXAsVT1uZXcgV2Vha01hcCxjZT1TeW1ib2woImFueVByb2R1Y2VyIiksR2U9UHJvbWlzZS5yZXNvbHZlKCksUT1TeW1ib2woImxpc3RlbmVyQWRkZWQiKSxYPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IGZlPSExO2Z1bmN0aW9uIE0ocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBLKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGsocixlKXtjb25zdCB0PUcuZ2V0KHIpO3JldHVybiB0LmhhcyhlKXx8dC5zZXQoZSxuZXcgU2V0KSx0LmdldChlKX1mdW5jdGlvbiBCKHIsZSl7Y29uc3QgdD10eXBlb2YgZT09InN0cmluZyJ8fHR5cGVvZiBlPT0ic3ltYm9sIj9lOmNlLHM9VS5nZXQocik7cmV0dXJuIHMuaGFzKHQpfHxzLnNldCh0LG5ldyBTZXQpLHMuZ2V0KHQpfWZ1bmN0aW9uIHdyKHIsZSx0KXtjb25zdCBzPVUuZ2V0KHIpO2lmKHMuaGFzKGUpKWZvcihjb25zdCBuIG9mIHMuZ2V0KGUpKW4uZW5xdWV1ZSh0KTtpZihzLmhhcyhjZSkpe2NvbnN0IG49UHJvbWlzZS5hbGwoW2UsdF0pO2Zvcihjb25zdCBvIG9mIHMuZ2V0KGNlKSlvLmVucXVldWUobil9fWZ1bmN0aW9uIFFlKHIsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PSExLHM9KCk9Pnt9LG49W107Y29uc3Qgbz17ZW5xdWV1ZShpKXtuLnB1c2goaSkscygpfSxmaW5pc2goKXt0PSEwLHMoKX19O2Zvcihjb25zdCBpIG9mIGUpQihyLGkpLmFkZChvKTtyZXR1cm57YXN5bmMgbmV4dCgpe3JldHVybiBuP24ubGVuZ3RoPT09MD90PyhuPXZvaWQgMCx0aGlzLm5leHQoKSk6KGF3YWl0IG5ldyBQcm9taXNlKGk9PntzPWl9KSx0aGlzLm5leHQoKSk6e2RvbmU6ITEsdmFsdWU6YXdhaXQgbi5zaGlmdCgpfTp7ZG9uZTohMH19LGFzeW5jIHJldHVybihpKXtuPXZvaWQgMDtmb3IoY29uc3QgYSBvZiBlKUIocixhKS5kZWxldGUobyk7cmV0dXJuIHMoKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgaX06e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBYZShyKXtpZihyPT09dm9pZCAwKXJldHVybiBLZTtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIUtlLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgaGU9cj0+cj09PVF8fHI9PT1YO2NsYXNzIEN7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9WGUodCkscz0+e2lmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgaSBvZiB0KWlmKHMucHJvdG90eXBlW2ldIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtpfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBuKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IEN9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpufSk7Y29uc3Qgbz1pPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtpXSguLi5hKX07Zm9yKGNvbnN0IGkgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkocy5wcm90b3R5cGUsaSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKGkpfSk7cmV0dXJuIHN9fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIGZlO2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fGZlfXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7ZmU9ZX1jb25zdHJ1Y3RvcihlPXt9KXtQLnNldCh0aGlzLG5ldyBTZXQpLEcuc2V0KHRoaXMsbmV3IE1hcCksVS5zZXQodGhpcyxuZXcgTWFwKSx0aGlzLmRlYnVnPWUuZGVidWd8fHt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0odCxzLG4sbyk9PntvPUpTT04uc3RyaW5naWZ5KG8pLHR5cGVvZiBuPT0ic3ltYm9sIiYmKG49bi50b1N0cmluZygpKTtjb25zdCBpPW5ldyBEYXRlLGE9YCR7aS5nZXRIb3VycygpfToke2kuZ2V0TWludXRlcygpfToke2kuZ2V0U2Vjb25kcygpfS4ke2kuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7YX1dW2VtaXR0ZXJ5OiR7dH1dWyR7c31dIEV2ZW50IE5hbWU6ICR7bn0KCWRhdGE6ICR7b31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxzKXsoQy5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUsdCxzKX1vbihlLHQpe0sodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpTShzKSxrKHRoaXMscykuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIscyx2b2lkIDApLGhlKHMpfHx0aGlzLmVtaXQoUSx7ZXZlbnROYW1lOnMsbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtLKHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgcyBvZiBlKU0ocyksayh0aGlzLHMpLmRlbGV0ZSh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZSIscyx2b2lkIDApLGhlKHMpfHx0aGlzLmVtaXQoWCx7ZXZlbnROYW1lOnMsbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBzPXRoaXMub24oZSxuPT57cygpLHQobil9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlNKHQpO3JldHVybiBRZSh0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtNKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCksd3IodGhpcyxlLHQpO2NvbnN0IHM9ayh0aGlzLGUpLG49UC5nZXQodGhpcyksbz1bLi4uc10saT1oZShlKT9bXTpbLi4ubl07YXdhaXQgR2UsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm8ubWFwKGFzeW5jIGE9PntpZihzLmhhcyhhKSlyZXR1cm4gYSh0KX0pLC4uLmkubWFwKGFzeW5jIGE9PntpZihuLmhhcyhhKSlyZXR1cm4gYShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7TShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IHM9ayh0aGlzLGUpLG49UC5nZXQodGhpcyksbz1bLi4uc10saT1bLi4ubl07YXdhaXQgR2U7Zm9yKGNvbnN0IGEgb2YgbylzLmhhcyhhKSYmYXdhaXQgYSh0KTtmb3IoY29uc3QgYSBvZiBpKW4uaGFzKGEpJiZhd2FpdCBhKGUsdCl9b25BbnkoZSl7cmV0dXJuIEsoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxQLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KFEse2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gUWUodGhpcyl9b2ZmQW55KGUpe0soZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChYLHtsaXN0ZW5lcjplfSksUC5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe2sodGhpcyx0KS5jbGVhcigpO2NvbnN0IHM9Qih0aGlzLHQpO2Zvcihjb25zdCBuIG9mIHMpbi5maW5pc2goKTtzLmNsZWFyKCl9ZWxzZXtQLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBzIG9mIEcuZ2V0KHRoaXMpLnZhbHVlcygpKXMuY2xlYXIoKTtmb3IoY29uc3QgcyBvZiBVLmdldCh0aGlzKS52YWx1ZXMoKSl7Zm9yKGNvbnN0IG4gb2YgcyluLmZpbmlzaCgpO3MuY2xlYXIoKX19fWxpc3RlbmVyQ291bnQoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PTA7Zm9yKGNvbnN0IHMgb2YgZSl7aWYodHlwZW9mIHM9PSJzdHJpbmciKXt0Kz1QLmdldCh0aGlzKS5zaXplK2sodGhpcyxzKS5zaXplK0IodGhpcyxzKS5zaXplK0IodGhpcykuc2l6ZTtjb250aW51ZX10eXBlb2YgcyE9InVuZGVmaW5lZCImJk0ocyksdCs9UC5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgbiBvZiBHLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1uLnNpemU7Zm9yKGNvbnN0IG4gb2YgVS5nZXQodGhpcykudmFsdWVzKCkpdCs9bi5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9WGUodCk7Zm9yKGNvbnN0IHMgb2YgdCl7aWYoZVtzXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7c31cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscyx7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW3NdLmJpbmQodGhpcyl9KX19fWNvbnN0IEtlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEMucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6USx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTpYLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7dmFyIGRlPUM7ZnVuY3Rpb24gRXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIFRyKHIpe2lmKEVyKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIHBlKHIpe3JldHVybiBUcihyKS5tZXNzYWdlfXZhciBtZTsoZnVuY3Rpb24ocil7ci5GUFNfRFJPUD0iZnBzX2Ryb3AifSkobWV8fChtZT17fSkpO2NvbnN0IFJyPTUwMCxQcj0uODtjbGFzcyBDciBleHRlbmRzIGRle2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmluZGV4Xz10LHRoaXMudXVpZF89V2UoKSx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wLHRoaXMudHJhbnNmb3JtZXJfPWUsdGhpcy5zaG91bGRTdG9wXz0hMSx0aGlzLmlzRmxhc2hlZF89ITEsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnBzXz0wLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMudmlkZW9IZWlnaHRfPTAsdGhpcy52aWRlb1dpZHRoXz0wLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMudHJhbnNmb3JtZXJUeXBlXz0iQ3VzdG9tIiwiZ2V0VHJhbnNmb3JtZXJUeXBlImluIGUmJih0aGlzLnRyYW5zZm9ybWVyVHlwZV89ZS5nZXRUcmFuc2Zvcm1lclR5cGUoKSk7Y29uc3Qgcz1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO3YucmVwb3J0KHMpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWV9YXN5bmMgc3RhcnQoZSl7aWYodGhpcy5jb250cm9sbGVyXz1lLHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IHM9bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMudHJhbnNmb3JtZXJfc3RhcnQpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihwZSh0KSkuYnVpbGQoKTt2LnJlcG9ydChzKTtjb25zdCBuPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjp0LGZ1bmN0aW9uOiJzdGFydCJ9O3RoaXMuZW1pdCgiZXJyb3IiLG4pfX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt2YXIgcyxuLG8saTtpZih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89PT0wJiYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPURhdGUubm93KCkpLGUgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lJiYodGhpcy52aWRlb0hlaWdodF89KHM9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5SGVpZ2h0KSE9bnVsbD9zOjAsdGhpcy52aWRlb1dpZHRoXz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlXaWR0aCkhPW51bGw/bjowKSwrK3RoaXMuZnJhbWVzRnJvbVNvdXJjZV8sdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyljb25zb2xlLndhcm4oIltQaXBlbGluZV0gZmx1c2ggZnJvbSB0cmFuc2Zvcm0iKSxlLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2UgdHJ5e2F3YWl0KChpPShvPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDppLmNhbGwobyxlLHQpKSwrK3RoaXMuZnJhbWVzVHJhbnNmb3JtZWRfLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPT09UnImJnRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpfWNhdGNoKGEpe2NvbnN0IGw9bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IocGUoYSkpLmJ1aWxkKCk7di5yZXBvcnQobCk7Y29uc3QgbT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6YSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsbSl9fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2gocyl7Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShULmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKHBlKHMpKS5idWlsZCgpO3YucmVwb3J0KG4pO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnMsZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTt2LnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Uscz10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qUHI+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6bWUuRlBTX0RST1AsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnR9fTt0aGlzLmVtaXQoIndhcm4iLG8pfWNvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5mcHModCkudHJhbnNmb3JtZWRGcHMocykuZnJhbWVzVHJhbnNmb3JtZWQodGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8pLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmlkZW9IZWlnaHQodGhpcy52aWRlb0hlaWdodF8pLnZpZGVvV2lkdGgodGhpcy52aWRlb1dpZHRoXykudmFyaWF0aW9uKCJRb1MiKS5idWlsZCgpO3YucmVwb3J0KG4pLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wfX1jbGFzcyBTciBleHRlbmRzIGRle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcz1uZXcgQ3IoZVt0XSx0KTtzLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSkscy5vbigid2FybiIsbj0+e3RoaXMuZW1pdCgid2FybiIsbil9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChzKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHQgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXQuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUsdCl7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBzPWU7Zm9yKGxldCBuIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShuKSk7ZS5waXBlVG8odCkudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgdC5hYm9ydCgpLGF3YWl0IHMuY2FuY2VsKCksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9lbmRlZCJ9KX0pLmNhdGNoKGFzeW5jIG49PntlLmNhbmNlbCgpLnRoZW4oKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTaHV0dGluZyBkb3duIHN0cmVhbXMgYWZ0ZXIgYWJvcnQuIil9KS5jYXRjaChvPT57Y29uc29sZS5lcnJvcigiW1BpcGVsaW5lXSBFcnJvciBmcm9tIHN0cmVhbSB0cmFuc2Zvcm06IixvKX0pLGF3YWl0IHQuYWJvcnQobiksYXdhaXQgcy5jYW5jZWwobiksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9lbmRlZF93aXRoX2Vycm9yIn0pfSl9Y2F0Y2h7dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IifSksdGhpcy5kZXN0cm95KCk7cmV0dXJufXRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIix7bWVzc2FnZToicGlwZWxpbmVfc3RhcnRlZCJ9KSxjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIHhyIGV4dGVuZHMgZGV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudXVpZF89V2UoKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO3YucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShULmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTt2LnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKTtyZXR1cm59aWYoIXRoaXMucmVhZGFibGVfKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShULmVycm9ycy5yZWFkYWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTt2LnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFJlYWRhYmxlIGlzIG51bGwuIik7cmV0dXJufWlmKCF0aGlzLndyaXRhYmxlXyl7Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMud3JpdGFibGVfbnVsbCkudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7di5yZXBvcnQobiksdCgiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgcz0hMTt0aGlzLnBpcGVsaW5lXyYmKHM9ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBTcih0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIsbj0+e3MmJihuLm1lc3NhZ2U9PT0icGlwZWxpbmVfc3RhcnRlZCI/bi5tZXNzYWdlPSJwaXBlbGluZV9yZXN0YXJ0ZWQiOm4ubWVzc2FnZT09PSJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiJiYobi5tZXNzYWdlPSJwaXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvciIpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsbil9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKG49Pnt0KG4pfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiB2LnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTt2LnJlcG9ydCh0KSxlKCl9KX19dmFyIGdlPShyPT4oci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIixyKSkoZ2V8fHt9KTtjbGFzcyBZZXtjb25zdHJ1Y3RvcihlKXt0eXBlb2YgZT09Im51bWJlciI/dGhpcy5ibHVyRmlsdGVyXz0iYmx1cigiK2UrInB4KSI6dGhpcy5ibHVyRmlsdGVyXz1lPT09Z2UuSGlnaD8iYmx1cigxMHB4KSI6ImJsdXIoNXB4KSJ9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57ZSgpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZmlsdGVyPXRoaXMuYmx1ckZpbHRlcl8sZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gocyl7Y29uc29sZS5sb2coIltCbHVyUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIscyl9fX1jbGFzcyBaZXtjb25zdHJ1Y3Rvcigpe31kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLmJnSW1hZ2VfJiZ0aGlzLmJnSW1hZ2VfLmNsb3NlKCksZSgpfSl9c2V0VmlydHVhbEJHSW1hZ2UoZSl7dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLHRoaXMuYmdJbWFnZV89ZX1hc3luYyBydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe2lmKHRoaXMuYmdJbWFnZV8pe2lmKHRoaXMuYmdJbWFnZV8ud2lkdGghPXQud2lkdGh8fHRoaXMuYmdJbWFnZV8uaGVpZ2h0IT10LmhlaWdodCl7Y29uc3Qgcz0iaGlnaCIsbj17cmVzaXplV2lkdGg6dC53aWR0aCxyZXNpemVIZWlnaHQ6dC5oZWlnaHQscmVzaXplUXVhbGl0eTpzfTt0cnl7dGhpcy5iZ0ltYWdlXz1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmJnSW1hZ2VfLG4pfWNhdGNoKG8pe3Rocm93IG99fWUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmRyYXdJbWFnZSh0aGlzLmJnSW1hZ2VfLDAsMCx0aGlzLmJnSW1hZ2VfLndpZHRoLHRoaXMuYmdJbWFnZV8uaGVpZ2h0KX19fWNsYXNzIE9ye2NvbnN0cnVjdG9yKGU9MS8wKXt0aGlzLmNhcGFjaXR5PWUsdGhpcy5zdG9yYWdlPVtdfWVucXVldWUoZSl7aWYodGhpcy5zaXplKCk9PT10aGlzLmNhcGFjaXR5KXRocm93IEVycm9yKCJRdWV1ZSBoYXMgcmVhY2hlZCBtYXggY2FwYWNpdHksIHlvdSBjYW5ub3QgYWRkIG1vcmUgaXRlbXMiKTt0aGlzLnN0b3JhZ2UucHVzaChlKX1kZXF1ZXVlKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5zaGlmdCgpfXNpemUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLmxlbmd0aH19Y29uc3QgeWU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnF1ZXVlXz1uZXcgT3J9Y2xlYXJRdWV1ZShyKXtmb3IoO3RoaXMucXVldWVfLnNpemUoKT4wOyl0aGlzLnF1ZXVlXy5kZXF1ZXVlKCkuY2xvc2UoKX1zZXRWaWRlb1JlYWRhYmxlKHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e3RoaXMuZnJhbWVSZWFkZXJfPXIuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4ocz0+e3RoaXMucHJvY2Vzc0ZyYW1lKHMpfSkuY2F0Y2gocz0+e3Qocyl9KSxlKCl9KX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHIsZSk9Pnt2YXIgdDt0aGlzLmNsZWFyUXVldWUoITApLHRoaXMuZnJhbWVSZWFkZXJfPyh0PXRoaXMuZnJhbWVSZWFkZXJfKT09bnVsbHx8dC5jYW5jZWwoKS50aGVuKCgpPT57cigpfSkuY2F0Y2gocz0+e2Uocyl9KTpyKCl9KX1wcm9jZXNzRnJhbWUocil7aWYoIXIuZG9uZSl7aWYoIXRoaXMuZnJhbWVSZWFkZXJfKXtyLnZhbHVlLmNsb3NlKCk7cmV0dXJufWZvcig7dGhpcy5xdWV1ZV8uc2l6ZSgpPj15ZS5OVU1CRVJfT0ZfRlJBTUVTX1RPX0NMRUFSOyl7bGV0IGU9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UmJmUuY2xvc2UoKX10aGlzLnF1ZXVlXy5lbnF1ZXVlKHIudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKGU9Pnt0aGlzLnByb2Nlc3NGcmFtZShlKX0pLmNhdGNoKGU9Pntjb25zb2xlLmVycm9yKGUpfSl9fXJ1blBvc3RQcm9jZXNzaW5nKHIsZSl7dHJ5e2lmKHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLnF1ZXVlXy5zaXplKCk+eWUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUiYmdGhpcy5jbGVhclF1ZXVlKCExKSx0aGlzLnF1ZXVlXy5zaXplKCk+MCl7Y29uc3QgdD10aGlzLnF1ZXVlXy5kZXF1ZXVlKCk7ci5kcmF3SW1hZ2UodCwwLDAsZS53aWR0aCxlLmhlaWdodCksdC5jbG9zZSgpfX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIix0KX19fTtsZXQgX2U9eWU7X2UuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUj01O2NsYXNzIElye2NvbnN0cnVjdG9yKGUpe3R5cGVvZiBlPT0ibnVtYmVyIj90aGlzLmJsdXJGaWx0ZXJfPSJibHVyKCIrZSsicHgpIjp0aGlzLmJsdXJGaWx0ZXJfPWU9PT1nZS5IaWdoPyJibHVyKDEwcHgpIjoiYmx1cig1cHgpIn1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntlKCl9KX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChzKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixzKX19fWNvbnN0IHZlPWNsYXNze2NvbnN0cnVjdG9yKCl7aWYodGhpcy5yZXN1bHRDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnJlc3VsdEN0eF89dGhpcy5yZXN1bHRDYW52YXNfLmdldENvbnRleHQoIjJkIix7ZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5yZXN1bHRDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXModmUuU0VMRklFX1dJRFRILHZlLlNFTEZJRV9ISUdIVCksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xz10aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLmdldENvbnRleHQoIjJkIix7ZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIil9aW5pdChyKXt0aGlzLnByb2Nlc3NGcmFtZUNiPXJ9YXN5bmMgc2V0QmFja2dyb3VuZE9wdGlvbnMocil7aWYodHlwZW9mIHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfIT0idW5kZWZpbmVkIil0cnl7YXdhaXQgdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uZGVzdHJveSgpfWNhdGNoKGUpe3Rocm93IGV9aWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlydHVhbEJhY2tncm91bmQiKXRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBaZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IkJhY2tncm91bmRCbHVyIil7bGV0IGU9cjt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpfWVsc2UgaWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIil0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgX2U7ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJTaWx1ZXRlQmx1ciIpe2xldCBlPXI7dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IElyKGUucmFkaXVzKX1lbHNlIHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBZZX1jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7dGhpcy5wcm9jZXNzU291cmNlKGUpLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0LDAsMCx0aGlzLnJlc3VsdENhbnZhc18ud2lkdGgsdGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCksdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8mJnRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnJ1blBvc3RQcm9jZXNzaW5nKHRoaXMucmVzdWx0Q3R4XyxlKSx0aGlzLnJlc3VsdEN0eF8ucmVzdG9yZSgpLHIuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSh0aGlzLnJlc3VsdENhbnZhc18se3RpbWVzdGFtcDp0LGFscGhhOiJkaXNjYXJkIn0pKSxlLmNsb3NlKCl9cHJvY2Vzc1NvdXJjZShyKXtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodCksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5kcmF3SW1hZ2UociwwLDAsci53aWR0aCxyLmhlaWdodCwwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodCksdGhpcy5wcm9jZXNzRnJhbWVDYil7bGV0IGU9dGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTt0aGlzLnByb2Nlc3NGcmFtZUNiKGUpfX1mbHVzaCgpe31nZXRUcmFuc2Zvcm1lclR5cGUoKXtyZXR1cm4iQmFja2dyb3VuZFRyYW5zZm9ybWVyIn1zZXRWaWRlb0JHUmVhZGFibGUocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBfZT90aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5zZXRWaWRlb1JlYWRhYmxlKHIpLnRoZW4oKCk9PntlKCl9KS5jYXRjaChzPT57dChzKX0pOnQoInBvc3QgcHJvY2VzcyBpcyBub3QgdmlkZW8iKX0pfXNldFZpcnR1YWxCR0ltYWdlKHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfIGluc3RhbmNlb2YgWmU/KHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpcnR1YWxCR0ltYWdlKHIpLGUoKSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0U2VnbWVudGF0aW9uTWFza0ltYWdlKHIpeyhyLmhlaWdodCE9dGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy5oZWlnaHR8fHIud2lkdGghPXRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18ud2lkdGgpJiYodGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy53aWR0aD1yLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18uaGVpZ2h0PXIuaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLmhlaWdodCksdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xy5kcmF3SW1hZ2UociwwLDApO2xldCBlPXRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0N0eF8uZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18uaGVpZ2h0KSx0PXRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18ud2lkdGgqdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy5oZWlnaHQ7Zm9yKGxldCBzPTA7czx0O3MrKyllLmRhdGFbcyo0XTwxMDAmJihlLmRhdGFbcyo0XT0wKTt0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLmhlaWdodCksdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xy5wdXRJbWFnZURhdGEoZSwwLDApLHIuY2xvc2UoKX19O2xldCBiZT12ZTtiZS5TRUxGSUVfV0lEVEg9MjU2LGJlLlNFTEZJRV9ISUdIVD0xNDQ7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIGtyKHIpe2lmKE1yKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIEEocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjprcihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgocyxuKT0+e2U9bmV3IHhyLGUub24oImVycm9yIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigid2FybiIsaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigicGlwZWxpbmVJbmZvIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfcGlwZWxpbmVfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksdD1uZXcgYmUsdC5pbml0KGk9Pntwb3N0TWVzc2FnZShpLFtpXSl9KTtsZXQgbz1bXTtvLnB1c2godCksZS5zZXRUcmFuc2Zvcm1lcnMobykudGhlbigoKT0+e3MoKX0pLmNhdGNoKGk9PntuKGkpfSl9KX0sZSx0O29ubWVzc2FnZT1hc3luYyBzPT57aWYocy5kYXRhIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe3QmJnQuc2V0U2VnbWVudGF0aW9uTWFza0ltYWdlKHMuZGF0YSk7cmV0dXJufWNvbnN0e29wZXJhdGlvbjpufT1zLmRhdGE7aWYobj09PSJpbml0Iil7Y29uc3R7bWV0YURhdGE6b309cy5kYXRhO3R5cGVvZiBvPT0ic3RyaW5nIiYmZHIoSlNPTi5wYXJzZShvKSkscigpLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpBKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0idHJhbnNmb3JtIil7Y29uc3R7cmVhZGFibGU6byx3cml0YWJsZTppfT1zLmRhdGE7ZS50cmFuc2Zvcm0obyxpKS50aGVuKCgpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pLmNhdGNoKGE9Pntjb25zdCBsPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6QShhKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobCkpfSl9ZWxzZSBpZihuPT09ImRlc3Ryb3kiKXQuY2xvc2UoKS5maW5hbGx5KCgpPT57ZS5kZXN0cm95KCkudGhlbigoKT0+e2NvbnN0IG89e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShvKSl9KS5jYXRjaChvPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOkEobyl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pfSk7ZWxzZSBpZihuPT09InNldFRyYWNrRXhwZWN0ZWRSYXRlIil7ZS5zZXRUcmFja0V4cGVjdGVkUmF0ZShzLmRhdGEucmF0ZSk7Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pKX1lbHNlIGlmKG49PT0ic2V0QmFja2dyb3VuZE9wdGlvbnMiKXtjb25zdHtiYWNrZ3JvdW5kT3B0aW9uczpvfT1zLmRhdGE7dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhKU09OLnBhcnNlKG8pKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6QShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9ZWxzZSBpZihuPT09InNldFZpZGVvQkdSZWFkYWJsZSIpe2NvbnN0e3JlYWRhYmxlOm99PXMuZGF0YTt0LnNldFZpZGVvQkdSZWFkYWJsZShvKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6QShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9ZWxzZSBpZihuPT09InNldFZpcnR1YWxCR0ltYWdlIil7Y29uc3R7aW1hZ2U6b309cy5kYXRhO3Quc2V0VmlydHVhbEJHSW1hZ2UobykudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOkEoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfX19fSkoKTsK";
1501
- const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
1502
- function WorkerWrapper() {
1503
- const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
1504
- try {
1505
- return objURL ? new Worker(objURL, {}) : new Worker("data:application/javascript;base64," + encodedJs, { type: "module" });
1506
- } finally {
1507
- objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
1508
- }
1509
- }
1510
- const anyMap = /* @__PURE__ */ new WeakMap();
1511
- const eventsMap = /* @__PURE__ */ new WeakMap();
1512
- const producersMap = /* @__PURE__ */ new WeakMap();
1513
- const anyProducer = Symbol("anyProducer");
1514
- const resolvedPromise = Promise.resolve();
1515
- const listenerAdded = Symbol("listenerAdded");
1516
- const listenerRemoved = Symbol("listenerRemoved");
1517
- let isGlobalDebugEnabled = false;
1518
- function assertEventName(eventName) {
1519
- if (typeof eventName !== "string" && typeof eventName !== "symbol") {
1520
- throw new TypeError("eventName must be a string or a symbol");
1521
- }
1522
- }
1523
- function assertListener(listener) {
1524
- if (typeof listener !== "function") {
1525
- throw new TypeError("listener must be a function");
1526
- }
1527
- }
1528
- function getListeners(instance, eventName) {
1529
- const events = eventsMap.get(instance);
1530
- if (!events.has(eventName)) {
1531
- events.set(eventName, /* @__PURE__ */ new Set());
1532
- }
1533
- return events.get(eventName);
1534
- }
1535
- function getEventProducers(instance, eventName) {
1536
- const key = typeof eventName === "string" || typeof eventName === "symbol" ? eventName : anyProducer;
1537
- const producers = producersMap.get(instance);
1538
- if (!producers.has(key)) {
1539
- producers.set(key, /* @__PURE__ */ new Set());
1540
- }
1541
- return producers.get(key);
1542
- }
1543
- function enqueueProducers(instance, eventName, eventData) {
1544
- const producers = producersMap.get(instance);
1545
- if (producers.has(eventName)) {
1546
- for (const producer of producers.get(eventName)) {
1547
- producer.enqueue(eventData);
1548
- }
1549
- }
1550
- if (producers.has(anyProducer)) {
1551
- const item = Promise.all([eventName, eventData]);
1552
- for (const producer of producers.get(anyProducer)) {
1553
- producer.enqueue(item);
1506
+ function isSupported() {
1507
+ return new Promise(async (resolve, reject) => {
1508
+ try {
1509
+ await isSupported$1();
1510
+ } catch (e) {
1511
+ reject(e);
1512
+ return;
1554
1513
  }
1555
- }
1514
+ simd().then((isSIMDSupported) => {
1515
+ if (isSIMDSupported === false) {
1516
+ reject("Your browser does not support WebAssembly features.");
1517
+ return;
1518
+ }
1519
+ resolve();
1520
+ }).catch((e) => {
1521
+ reject(e);
1522
+ });
1523
+ });
1556
1524
  }
1557
- function iterator(instance, eventNames) {
1558
- eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
1559
- let isFinished = false;
1560
- let flush = () => {
1525
+ const VonageSelfiesegmentation = {};
1526
+ (function() {
1527
+ var D;
1528
+ function aa(a) {
1529
+ var b = 0;
1530
+ return function() {
1531
+ return b < a.length ? { done: false, value: a[b++] } : { done: true };
1532
+ };
1533
+ }
1534
+ var ba = typeof Object.defineProperties == "function" ? Object.defineProperty : function(a, b, c) {
1535
+ if (a == Array.prototype || a == Object.prototype)
1536
+ return a;
1537
+ a[b] = c.value;
1538
+ return a;
1561
1539
  };
1562
- let queue = [];
1563
- const producer = {
1564
- enqueue(item) {
1565
- queue.push(item);
1566
- flush();
1567
- },
1568
- finish() {
1569
- isFinished = true;
1570
- flush();
1540
+ function ca(a) {
1541
+ a = [typeof globalThis == "object" && globalThis, a, typeof window == "object" && window, typeof self == "object" && self, typeof global == "object" && global];
1542
+ for (var b = 0; b < a.length; ++b) {
1543
+ var c = a[b];
1544
+ if (c && c.Math == Math)
1545
+ return c;
1571
1546
  }
1572
- };
1573
- for (const eventName of eventNames) {
1574
- getEventProducers(instance, eventName).add(producer);
1547
+ throw Error("Cannot find global object");
1575
1548
  }
1576
- return {
1577
- async next() {
1578
- if (!queue) {
1579
- return { done: true };
1580
- }
1581
- if (queue.length === 0) {
1582
- if (isFinished) {
1583
- queue = void 0;
1584
- return this.next();
1549
+ var H = ca(this);
1550
+ function J(a, b) {
1551
+ if (b)
1552
+ a: {
1553
+ var c = H;
1554
+ a = a.split(".");
1555
+ for (var d = 0; d < a.length - 1; d++) {
1556
+ var f = a[d];
1557
+ if (!(f in c))
1558
+ break a;
1559
+ c = c[f];
1585
1560
  }
1586
- await new Promise((resolve) => {
1587
- flush = resolve;
1588
- });
1589
- return this.next();
1590
- }
1591
- return {
1592
- done: false,
1593
- value: await queue.shift()
1594
- };
1595
- },
1596
- async return(value) {
1597
- queue = void 0;
1598
- for (const eventName of eventNames) {
1599
- getEventProducers(instance, eventName).delete(producer);
1561
+ a = a[a.length - 1];
1562
+ d = c[a];
1563
+ b = b(d);
1564
+ b != d && b != null && ba(c, a, { configurable: true, writable: true, value: b });
1600
1565
  }
1601
- flush();
1602
- return arguments.length > 0 ? { done: true, value: await value } : { done: true };
1603
- },
1604
- [Symbol.asyncIterator]() {
1605
- return this;
1606
- }
1607
- };
1608
- }
1609
- function defaultMethodNamesOrAssert(methodNames) {
1610
- if (methodNames === void 0) {
1611
- return allEmitteryMethods;
1612
1566
  }
1613
- if (!Array.isArray(methodNames)) {
1614
- throw new TypeError("`methodNames` must be an array of strings");
1615
- }
1616
- for (const methodName of methodNames) {
1617
- if (!allEmitteryMethods.includes(methodName)) {
1618
- if (typeof methodName !== "string") {
1619
- throw new TypeError("`methodNames` element must be a string");
1620
- }
1621
- throw new Error(`${methodName} is not Emittery method`);
1567
+ J("Symbol", function(a) {
1568
+ function b(h) {
1569
+ if (this instanceof b)
1570
+ throw new TypeError("Symbol is not a constructor");
1571
+ return new c(d + (h || "") + "_" + f++, h);
1622
1572
  }
1623
- }
1624
- return methodNames;
1625
- }
1626
- const isListenerSymbol = (symbol) => symbol === listenerAdded || symbol === listenerRemoved;
1627
- class Emittery {
1628
- static mixin(emitteryPropertyName, methodNames) {
1629
- methodNames = defaultMethodNamesOrAssert(methodNames);
1630
- return (target) => {
1631
- if (typeof target !== "function") {
1632
- throw new TypeError("`target` must be function");
1633
- }
1634
- for (const methodName of methodNames) {
1635
- if (target.prototype[methodName] !== void 0) {
1636
- throw new Error(`The property \`${methodName}\` already exists on \`target\``);
1637
- }
1638
- }
1639
- function getEmitteryProperty() {
1640
- Object.defineProperty(this, emitteryPropertyName, {
1641
- enumerable: false,
1642
- value: new Emittery()
1643
- });
1644
- return this[emitteryPropertyName];
1645
- }
1646
- Object.defineProperty(target.prototype, emitteryPropertyName, {
1647
- enumerable: false,
1648
- get: getEmitteryProperty
1649
- });
1650
- const emitteryMethodCaller = (methodName) => function(...args) {
1651
- return this[emitteryPropertyName][methodName](...args);
1652
- };
1653
- for (const methodName of methodNames) {
1654
- Object.defineProperty(target.prototype, methodName, {
1655
- enumerable: false,
1656
- value: emitteryMethodCaller(methodName)
1657
- });
1658
- }
1659
- return target;
1573
+ function c(h, e) {
1574
+ this.g = h;
1575
+ ba(this, "description", { configurable: true, writable: true, value: e });
1576
+ }
1577
+ if (a)
1578
+ return a;
1579
+ c.prototype.toString = function() {
1580
+ return this.g;
1660
1581
  };
1661
- }
1662
- static get isDebugEnabled() {
1663
- if (typeof process !== "object") {
1664
- return isGlobalDebugEnabled;
1582
+ var d = "jscomp_symbol_" + (1e9 * Math.random() >>> 0) + "_", f = 0;
1583
+ return b;
1584
+ });
1585
+ J("Symbol.iterator", function(a) {
1586
+ if (a)
1587
+ return a;
1588
+ a = Symbol("Symbol.iterator");
1589
+ for (var b = "Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "), c = 0; c < b.length; c++) {
1590
+ var d = H[b[c]];
1591
+ typeof d === "function" && typeof d.prototype[a] != "function" && ba(d.prototype, a, { configurable: true, writable: true, value: function() {
1592
+ return da(aa(this));
1593
+ } });
1665
1594
  }
1666
- const { env } = process || { env: {} };
1667
- return env.DEBUG === "emittery" || env.DEBUG === "*" || isGlobalDebugEnabled;
1595
+ return a;
1596
+ });
1597
+ function da(a) {
1598
+ a = { next: a };
1599
+ a[Symbol.iterator] = function() {
1600
+ return this;
1601
+ };
1602
+ return a;
1668
1603
  }
1669
- static set isDebugEnabled(newValue) {
1670
- isGlobalDebugEnabled = newValue;
1604
+ function M(a) {
1605
+ var b = typeof Symbol != "undefined" && Symbol.iterator && a[Symbol.iterator];
1606
+ return b ? b.call(a) : { next: aa(a) };
1671
1607
  }
1672
- constructor(options = {}) {
1673
- anyMap.set(this, /* @__PURE__ */ new Set());
1674
- eventsMap.set(this, /* @__PURE__ */ new Map());
1675
- producersMap.set(this, /* @__PURE__ */ new Map());
1676
- this.debug = options.debug || {};
1677
- if (this.debug.enabled === void 0) {
1678
- this.debug.enabled = false;
1679
- }
1680
- if (!this.debug.logger) {
1681
- this.debug.logger = (type, debugName, eventName, eventData) => {
1682
- try {
1683
- eventData = JSON.stringify(eventData);
1684
- } catch {
1685
- eventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(",")}`;
1686
- }
1687
- if (typeof eventName === "symbol") {
1688
- eventName = eventName.toString();
1689
- }
1690
- const currentTime = new Date();
1691
- const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;
1692
- console.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}
1693
- data: ${eventData}`);
1694
- };
1608
+ function ea(a) {
1609
+ if (!(a instanceof Array)) {
1610
+ a = M(a);
1611
+ for (var b, c = []; !(b = a.next()).done; )
1612
+ c.push(b.value);
1613
+ a = c;
1695
1614
  }
1615
+ return a;
1696
1616
  }
1697
- logIfDebugEnabled(type, eventName, eventData) {
1698
- if (Emittery.isDebugEnabled || this.debug.enabled) {
1699
- this.debug.logger(type, this.debug.name, eventName, eventData);
1617
+ var fa = typeof Object.create == "function" ? Object.create : function(a) {
1618
+ function b() {
1700
1619
  }
1701
- }
1702
- on(eventNames, listener) {
1703
- assertListener(listener);
1704
- eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
1705
- for (const eventName of eventNames) {
1706
- assertEventName(eventName);
1707
- getListeners(this, eventName).add(listener);
1708
- this.logIfDebugEnabled("subscribe", eventName, void 0);
1709
- if (!isListenerSymbol(eventName)) {
1710
- this.emit(listenerAdded, { eventName, listener });
1620
+ b.prototype = a;
1621
+ return new b();
1622
+ }, ha;
1623
+ if (typeof Object.setPrototypeOf == "function")
1624
+ ha = Object.setPrototypeOf;
1625
+ else {
1626
+ var ia;
1627
+ a: {
1628
+ var ja = { a: true }, ka = {};
1629
+ try {
1630
+ ka.__proto__ = ja;
1631
+ ia = ka.a;
1632
+ break a;
1633
+ } catch (a) {
1711
1634
  }
1635
+ ia = false;
1712
1636
  }
1713
- return this.off.bind(this, eventNames, listener);
1637
+ ha = ia ? function(a, b) {
1638
+ a.__proto__ = b;
1639
+ if (a.__proto__ !== b)
1640
+ throw new TypeError(a + " is not extensible");
1641
+ return a;
1642
+ } : null;
1714
1643
  }
1715
- off(eventNames, listener) {
1716
- assertListener(listener);
1717
- eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
1718
- for (const eventName of eventNames) {
1719
- assertEventName(eventName);
1720
- getListeners(this, eventName).delete(listener);
1721
- this.logIfDebugEnabled("unsubscribe", eventName, void 0);
1722
- if (!isListenerSymbol(eventName)) {
1723
- this.emit(listenerRemoved, { eventName, listener });
1724
- }
1725
- }
1644
+ var la = ha;
1645
+ function ma(a, b) {
1646
+ a.prototype = fa(b.prototype);
1647
+ a.prototype.constructor = a;
1648
+ if (la)
1649
+ la(a, b);
1650
+ else
1651
+ for (var c in b)
1652
+ if (c != "prototype")
1653
+ if (Object.defineProperties) {
1654
+ var d = Object.getOwnPropertyDescriptor(b, c);
1655
+ d && Object.defineProperty(a, c, d);
1656
+ } else
1657
+ a[c] = b[c];
1658
+ a.ea = b.prototype;
1726
1659
  }
1727
- once(eventNames) {
1728
- return new Promise((resolve) => {
1729
- const off = this.on(eventNames, (data2) => {
1730
- off();
1731
- resolve(data2);
1732
- });
1733
- });
1660
+ function na() {
1661
+ this.l = false;
1662
+ this.i = null;
1663
+ this.h = void 0;
1664
+ this.g = 1;
1665
+ this.s = this.m = 0;
1666
+ this.j = null;
1734
1667
  }
1735
- events(eventNames) {
1736
- eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
1737
- for (const eventName of eventNames) {
1738
- assertEventName(eventName);
1739
- }
1740
- return iterator(this, eventNames);
1668
+ function oa(a) {
1669
+ if (a.l)
1670
+ throw new TypeError("Generator is already running");
1671
+ a.l = true;
1741
1672
  }
1742
- async emit(eventName, eventData) {
1743
- assertEventName(eventName);
1744
- this.logIfDebugEnabled("emit", eventName, eventData);
1745
- enqueueProducers(this, eventName, eventData);
1746
- const listeners = getListeners(this, eventName);
1747
- const anyListeners = anyMap.get(this);
1748
- const staticListeners = [...listeners];
1749
- const staticAnyListeners = isListenerSymbol(eventName) ? [] : [...anyListeners];
1750
- await resolvedPromise;
1751
- await Promise.all([
1752
- ...staticListeners.map(async (listener) => {
1753
- if (listeners.has(listener)) {
1754
- return listener(eventData);
1755
- }
1756
- }),
1757
- ...staticAnyListeners.map(async (listener) => {
1758
- if (anyListeners.has(listener)) {
1759
- return listener(eventName, eventData);
1760
- }
1761
- })
1762
- ]);
1673
+ na.prototype.o = function(a) {
1674
+ this.h = a;
1675
+ };
1676
+ function pa(a, b) {
1677
+ a.j = { U: b, V: true };
1678
+ a.g = a.m || a.s;
1763
1679
  }
1764
- async emitSerial(eventName, eventData) {
1765
- assertEventName(eventName);
1766
- this.logIfDebugEnabled("emitSerial", eventName, eventData);
1767
- const listeners = getListeners(this, eventName);
1768
- const anyListeners = anyMap.get(this);
1769
- const staticListeners = [...listeners];
1770
- const staticAnyListeners = [...anyListeners];
1771
- await resolvedPromise;
1772
- for (const listener of staticListeners) {
1773
- if (listeners.has(listener)) {
1774
- await listener(eventData);
1775
- }
1776
- }
1777
- for (const listener of staticAnyListeners) {
1778
- if (anyListeners.has(listener)) {
1779
- await listener(eventName, eventData);
1780
- }
1781
- }
1680
+ na.prototype.return = function(a) {
1681
+ this.j = { return: a };
1682
+ this.g = this.s;
1683
+ };
1684
+ function N(a, b, c) {
1685
+ a.g = c;
1686
+ return { value: b };
1782
1687
  }
1783
- onAny(listener) {
1784
- assertListener(listener);
1785
- this.logIfDebugEnabled("subscribeAny", void 0, void 0);
1786
- anyMap.get(this).add(listener);
1787
- this.emit(listenerAdded, { listener });
1788
- return this.offAny.bind(this, listener);
1688
+ function qa(a) {
1689
+ this.g = new na();
1690
+ this.h = a;
1789
1691
  }
1790
- anyEvent() {
1791
- return iterator(this);
1692
+ function ra(a, b) {
1693
+ oa(a.g);
1694
+ var c = a.g.i;
1695
+ if (c)
1696
+ return sa(a, "return" in c ? c["return"] : function(d) {
1697
+ return { value: d, done: true };
1698
+ }, b, a.g.return);
1699
+ a.g.return(b);
1700
+ return ta(a);
1792
1701
  }
1793
- offAny(listener) {
1794
- assertListener(listener);
1795
- this.logIfDebugEnabled("unsubscribeAny", void 0, void 0);
1796
- this.emit(listenerRemoved, { listener });
1797
- anyMap.get(this).delete(listener);
1702
+ function sa(a, b, c, d) {
1703
+ try {
1704
+ var f = b.call(a.g.i, c);
1705
+ if (!(f instanceof Object))
1706
+ throw new TypeError("Iterator result " + f + " is not an object");
1707
+ if (!f.done)
1708
+ return a.g.l = false, f;
1709
+ var h = f.value;
1710
+ } catch (e) {
1711
+ return a.g.i = null, pa(a.g, e), ta(a);
1712
+ }
1713
+ a.g.i = null;
1714
+ d.call(a.g, h);
1715
+ return ta(a);
1798
1716
  }
1799
- clearListeners(eventNames) {
1800
- eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
1801
- for (const eventName of eventNames) {
1802
- this.logIfDebugEnabled("clear", eventName, void 0);
1803
- if (typeof eventName === "string" || typeof eventName === "symbol") {
1804
- getListeners(this, eventName).clear();
1805
- const producers = getEventProducers(this, eventName);
1806
- for (const producer of producers) {
1807
- producer.finish();
1808
- }
1809
- producers.clear();
1810
- } else {
1811
- anyMap.get(this).clear();
1812
- for (const listeners of eventsMap.get(this).values()) {
1813
- listeners.clear();
1814
- }
1815
- for (const producers of producersMap.get(this).values()) {
1816
- for (const producer of producers) {
1817
- producer.finish();
1818
- }
1819
- producers.clear();
1820
- }
1717
+ function ta(a) {
1718
+ for (; a.g.g; )
1719
+ try {
1720
+ var b = a.h(a.g);
1721
+ if (b)
1722
+ return a.g.l = false, { value: b.value, done: false };
1723
+ } catch (c) {
1724
+ a.g.h = void 0, pa(a.g, c);
1821
1725
  }
1726
+ a.g.l = false;
1727
+ if (a.g.j) {
1728
+ b = a.g.j;
1729
+ a.g.j = null;
1730
+ if (b.V)
1731
+ throw b.U;
1732
+ return { value: b.return, done: true };
1822
1733
  }
1823
- }
1824
- listenerCount(eventNames) {
1825
- eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
1826
- let count = 0;
1827
- for (const eventName of eventNames) {
1828
- if (typeof eventName === "string") {
1829
- count += anyMap.get(this).size + getListeners(this, eventName).size + getEventProducers(this, eventName).size + getEventProducers(this).size;
1830
- continue;
1831
- }
1832
- if (typeof eventName !== "undefined") {
1833
- assertEventName(eventName);
1834
- }
1835
- count += anyMap.get(this).size;
1836
- for (const value of eventsMap.get(this).values()) {
1837
- count += value.size;
1838
- }
1839
- for (const value of producersMap.get(this).values()) {
1840
- count += value.size;
1841
- }
1842
- }
1843
- return count;
1844
- }
1845
- bindMethods(target, methodNames) {
1846
- if (typeof target !== "object" || target === null) {
1847
- throw new TypeError("`target` must be an object");
1848
- }
1849
- methodNames = defaultMethodNamesOrAssert(methodNames);
1850
- for (const methodName of methodNames) {
1851
- if (target[methodName] !== void 0) {
1852
- throw new Error(`The property \`${methodName}\` already exists on \`target\``);
1853
- }
1854
- Object.defineProperty(target, methodName, {
1855
- enumerable: false,
1856
- value: this[methodName].bind(this)
1857
- });
1858
- }
1859
- }
1860
- }
1861
- const allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter((v) => v !== "constructor");
1862
- Object.defineProperty(Emittery, "listenerAdded", {
1863
- value: listenerAdded,
1864
- writable: false,
1865
- enumerable: true,
1866
- configurable: false
1867
- });
1868
- Object.defineProperty(Emittery, "listenerRemoved", {
1869
- value: listenerRemoved,
1870
- writable: false,
1871
- enumerable: true,
1872
- configurable: false
1873
- });
1874
- var emittery = Emittery;
1875
- const VonageSelfiesegmentation = {};
1876
- (function() {
1877
- var D;
1878
- function aa(a) {
1879
- var b = 0;
1880
- return function() {
1881
- return b < a.length ? { done: false, value: a[b++] } : { done: true };
1882
- };
1883
- }
1884
- var ba = typeof Object.defineProperties == "function" ? Object.defineProperty : function(a, b, c) {
1885
- if (a == Array.prototype || a == Object.prototype)
1886
- return a;
1887
- a[b] = c.value;
1888
- return a;
1889
- };
1890
- function ca(a) {
1891
- a = [typeof globalThis == "object" && globalThis, a, typeof window == "object" && window, typeof self == "object" && self, typeof global == "object" && global];
1892
- for (var b = 0; b < a.length; ++b) {
1893
- var c = a[b];
1894
- if (c && c.Math == Math)
1895
- return c;
1896
- }
1897
- throw Error("Cannot find global object");
1898
- }
1899
- var H = ca(this);
1900
- function J(a, b) {
1901
- if (b)
1902
- a: {
1903
- var c = H;
1904
- a = a.split(".");
1905
- for (var d = 0; d < a.length - 1; d++) {
1906
- var f = a[d];
1907
- if (!(f in c))
1908
- break a;
1909
- c = c[f];
1910
- }
1911
- a = a[a.length - 1];
1912
- d = c[a];
1913
- b = b(d);
1914
- b != d && b != null && ba(c, a, { configurable: true, writable: true, value: b });
1915
- }
1916
- }
1917
- J("Symbol", function(a) {
1918
- function b(h) {
1919
- if (this instanceof b)
1920
- throw new TypeError("Symbol is not a constructor");
1921
- return new c(d + (h || "") + "_" + f++, h);
1922
- }
1923
- function c(h, e) {
1924
- this.g = h;
1925
- ba(this, "description", { configurable: true, writable: true, value: e });
1926
- }
1927
- if (a)
1928
- return a;
1929
- c.prototype.toString = function() {
1930
- return this.g;
1931
- };
1932
- var d = "jscomp_symbol_" + (1e9 * Math.random() >>> 0) + "_", f = 0;
1933
- return b;
1934
- });
1935
- J("Symbol.iterator", function(a) {
1936
- if (a)
1937
- return a;
1938
- a = Symbol("Symbol.iterator");
1939
- for (var b = "Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "), c = 0; c < b.length; c++) {
1940
- var d = H[b[c]];
1941
- typeof d === "function" && typeof d.prototype[a] != "function" && ba(d.prototype, a, { configurable: true, writable: true, value: function() {
1942
- return da(aa(this));
1943
- } });
1944
- }
1945
- return a;
1946
- });
1947
- function da(a) {
1948
- a = { next: a };
1949
- a[Symbol.iterator] = function() {
1950
- return this;
1951
- };
1952
- return a;
1953
- }
1954
- function M(a) {
1955
- var b = typeof Symbol != "undefined" && Symbol.iterator && a[Symbol.iterator];
1956
- return b ? b.call(a) : { next: aa(a) };
1957
- }
1958
- function ea(a) {
1959
- if (!(a instanceof Array)) {
1960
- a = M(a);
1961
- for (var b, c = []; !(b = a.next()).done; )
1962
- c.push(b.value);
1963
- a = c;
1964
- }
1965
- return a;
1966
- }
1967
- var fa = typeof Object.create == "function" ? Object.create : function(a) {
1968
- function b() {
1969
- }
1970
- b.prototype = a;
1971
- return new b();
1972
- }, ha;
1973
- if (typeof Object.setPrototypeOf == "function")
1974
- ha = Object.setPrototypeOf;
1975
- else {
1976
- var ia;
1977
- a: {
1978
- var ja = { a: true }, ka = {};
1979
- try {
1980
- ka.__proto__ = ja;
1981
- ia = ka.a;
1982
- break a;
1983
- } catch (a) {
1984
- }
1985
- ia = false;
1986
- }
1987
- ha = ia ? function(a, b) {
1988
- a.__proto__ = b;
1989
- if (a.__proto__ !== b)
1990
- throw new TypeError(a + " is not extensible");
1991
- return a;
1992
- } : null;
1993
- }
1994
- var la = ha;
1995
- function ma(a, b) {
1996
- a.prototype = fa(b.prototype);
1997
- a.prototype.constructor = a;
1998
- if (la)
1999
- la(a, b);
2000
- else
2001
- for (var c in b)
2002
- if (c != "prototype")
2003
- if (Object.defineProperties) {
2004
- var d = Object.getOwnPropertyDescriptor(b, c);
2005
- d && Object.defineProperty(a, c, d);
2006
- } else
2007
- a[c] = b[c];
2008
- a.ea = b.prototype;
2009
- }
2010
- function na() {
2011
- this.l = false;
2012
- this.i = null;
2013
- this.h = void 0;
2014
- this.g = 1;
2015
- this.s = this.m = 0;
2016
- this.j = null;
2017
- }
2018
- function oa(a) {
2019
- if (a.l)
2020
- throw new TypeError("Generator is already running");
2021
- a.l = true;
2022
- }
2023
- na.prototype.o = function(a) {
2024
- this.h = a;
2025
- };
2026
- function pa(a, b) {
2027
- a.j = { U: b, V: true };
2028
- a.g = a.m || a.s;
2029
- }
2030
- na.prototype.return = function(a) {
2031
- this.j = { return: a };
2032
- this.g = this.s;
2033
- };
2034
- function N(a, b, c) {
2035
- a.g = c;
2036
- return { value: b };
2037
- }
2038
- function qa(a) {
2039
- this.g = new na();
2040
- this.h = a;
2041
- }
2042
- function ra(a, b) {
2043
- oa(a.g);
2044
- var c = a.g.i;
2045
- if (c)
2046
- return sa(a, "return" in c ? c["return"] : function(d) {
2047
- return { value: d, done: true };
2048
- }, b, a.g.return);
2049
- a.g.return(b);
2050
- return ta(a);
2051
- }
2052
- function sa(a, b, c, d) {
2053
- try {
2054
- var f = b.call(a.g.i, c);
2055
- if (!(f instanceof Object))
2056
- throw new TypeError("Iterator result " + f + " is not an object");
2057
- if (!f.done)
2058
- return a.g.l = false, f;
2059
- var h = f.value;
2060
- } catch (e) {
2061
- return a.g.i = null, pa(a.g, e), ta(a);
2062
- }
2063
- a.g.i = null;
2064
- d.call(a.g, h);
2065
- return ta(a);
2066
- }
2067
- function ta(a) {
2068
- for (; a.g.g; )
2069
- try {
2070
- var b = a.h(a.g);
2071
- if (b)
2072
- return a.g.l = false, { value: b.value, done: false };
2073
- } catch (c) {
2074
- a.g.h = void 0, pa(a.g, c);
2075
- }
2076
- a.g.l = false;
2077
- if (a.g.j) {
2078
- b = a.g.j;
2079
- a.g.j = null;
2080
- if (b.V)
2081
- throw b.U;
2082
- return { value: b.return, done: true };
2083
- }
2084
- return { value: void 0, done: true };
1734
+ return { value: void 0, done: true };
2085
1735
  }
2086
1736
  function ua(a) {
2087
1737
  this.next = function(b) {
@@ -24372,74 +24022,449 @@ const _MediapipeHelper = class {
24372
24022
  return;
24373
24023
  }
24374
24024
  }
24375
- resolve();
24025
+ resolve();
24026
+ });
24027
+ }
24028
+ close(modelType) {
24029
+ return new Promise((resolve, reject) => {
24030
+ let promises = [];
24031
+ if (modelType) {
24032
+ let tempMediaPipe = this.mediapipeMap_.get(modelType);
24033
+ if (tempMediaPipe) {
24034
+ this.mediapipeMap_.delete(modelType);
24035
+ promises.push(tempMediaPipe.close());
24036
+ } else {
24037
+ reject("model not exit");
24038
+ return;
24039
+ }
24040
+ } else {
24041
+ for (const [key, tempMediaPipe] of this.mediapipeMap_.entries()) {
24042
+ promises.push(tempMediaPipe.close());
24043
+ }
24044
+ this.mediapipeMap_.clear();
24045
+ }
24046
+ Promise.all(promises).then(() => {
24047
+ resolve();
24048
+ }).catch((e) => {
24049
+ reject(e);
24050
+ });
24051
+ });
24052
+ }
24053
+ send(image, modelType) {
24054
+ return new Promise((resolve, reject) => {
24055
+ let promises = [];
24056
+ if (modelType) {
24057
+ let tempMediaPipe = this.mediapipeMap_.get(modelType);
24058
+ if (tempMediaPipe) {
24059
+ promises.push(tempMediaPipe.send({ image }));
24060
+ } else {
24061
+ reject("model not exit");
24062
+ return;
24063
+ }
24064
+ } else {
24065
+ for (const [key, tempMediaPipe] of this.mediapipeMap_.entries()) {
24066
+ promises.push(tempMediaPipe.send({ image }));
24067
+ }
24068
+ }
24069
+ Promise.all(promises).then(() => {
24070
+ resolve();
24071
+ }).catch((e) => {
24072
+ reject(e);
24073
+ });
24074
+ });
24075
+ }
24076
+ reset(modelType) {
24077
+ if (modelType) {
24078
+ let tempMediaPipe = this.mediapipeMap_.get(modelType);
24079
+ if (tempMediaPipe && typeof tempMediaPipe.reset === "function") {
24080
+ tempMediaPipe.reset();
24081
+ }
24082
+ } else {
24083
+ for (const [key, tempMediaPipe] of this.mediapipeMap_.entries()) {
24084
+ if (tempMediaPipe && typeof tempMediaPipe.reset === "function") {
24085
+ tempMediaPipe.reset();
24086
+ }
24087
+ }
24088
+ }
24089
+ }
24090
+ };
24091
+ let MediapipeHelper = _MediapipeHelper;
24092
+ MediapipeHelper.defaultAssetsBaseUrl = "https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/";
24093
+ const anyMap = /* @__PURE__ */ new WeakMap();
24094
+ const eventsMap = /* @__PURE__ */ new WeakMap();
24095
+ const producersMap = /* @__PURE__ */ new WeakMap();
24096
+ const anyProducer = Symbol("anyProducer");
24097
+ const resolvedPromise = Promise.resolve();
24098
+ const listenerAdded = Symbol("listenerAdded");
24099
+ const listenerRemoved = Symbol("listenerRemoved");
24100
+ let isGlobalDebugEnabled = false;
24101
+ function assertEventName(eventName) {
24102
+ if (typeof eventName !== "string" && typeof eventName !== "symbol") {
24103
+ throw new TypeError("eventName must be a string or a symbol");
24104
+ }
24105
+ }
24106
+ function assertListener(listener) {
24107
+ if (typeof listener !== "function") {
24108
+ throw new TypeError("listener must be a function");
24109
+ }
24110
+ }
24111
+ function getListeners(instance, eventName) {
24112
+ const events = eventsMap.get(instance);
24113
+ if (!events.has(eventName)) {
24114
+ events.set(eventName, /* @__PURE__ */ new Set());
24115
+ }
24116
+ return events.get(eventName);
24117
+ }
24118
+ function getEventProducers(instance, eventName) {
24119
+ const key = typeof eventName === "string" || typeof eventName === "symbol" ? eventName : anyProducer;
24120
+ const producers = producersMap.get(instance);
24121
+ if (!producers.has(key)) {
24122
+ producers.set(key, /* @__PURE__ */ new Set());
24123
+ }
24124
+ return producers.get(key);
24125
+ }
24126
+ function enqueueProducers(instance, eventName, eventData) {
24127
+ const producers = producersMap.get(instance);
24128
+ if (producers.has(eventName)) {
24129
+ for (const producer of producers.get(eventName)) {
24130
+ producer.enqueue(eventData);
24131
+ }
24132
+ }
24133
+ if (producers.has(anyProducer)) {
24134
+ const item = Promise.all([eventName, eventData]);
24135
+ for (const producer of producers.get(anyProducer)) {
24136
+ producer.enqueue(item);
24137
+ }
24138
+ }
24139
+ }
24140
+ function iterator(instance, eventNames) {
24141
+ eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
24142
+ let isFinished = false;
24143
+ let flush = () => {
24144
+ };
24145
+ let queue = [];
24146
+ const producer = {
24147
+ enqueue(item) {
24148
+ queue.push(item);
24149
+ flush();
24150
+ },
24151
+ finish() {
24152
+ isFinished = true;
24153
+ flush();
24154
+ }
24155
+ };
24156
+ for (const eventName of eventNames) {
24157
+ getEventProducers(instance, eventName).add(producer);
24158
+ }
24159
+ return {
24160
+ async next() {
24161
+ if (!queue) {
24162
+ return { done: true };
24163
+ }
24164
+ if (queue.length === 0) {
24165
+ if (isFinished) {
24166
+ queue = void 0;
24167
+ return this.next();
24168
+ }
24169
+ await new Promise((resolve) => {
24170
+ flush = resolve;
24171
+ });
24172
+ return this.next();
24173
+ }
24174
+ return {
24175
+ done: false,
24176
+ value: await queue.shift()
24177
+ };
24178
+ },
24179
+ async return(value) {
24180
+ queue = void 0;
24181
+ for (const eventName of eventNames) {
24182
+ getEventProducers(instance, eventName).delete(producer);
24183
+ }
24184
+ flush();
24185
+ return arguments.length > 0 ? { done: true, value: await value } : { done: true };
24186
+ },
24187
+ [Symbol.asyncIterator]() {
24188
+ return this;
24189
+ }
24190
+ };
24191
+ }
24192
+ function defaultMethodNamesOrAssert(methodNames) {
24193
+ if (methodNames === void 0) {
24194
+ return allEmitteryMethods;
24195
+ }
24196
+ if (!Array.isArray(methodNames)) {
24197
+ throw new TypeError("`methodNames` must be an array of strings");
24198
+ }
24199
+ for (const methodName of methodNames) {
24200
+ if (!allEmitteryMethods.includes(methodName)) {
24201
+ if (typeof methodName !== "string") {
24202
+ throw new TypeError("`methodNames` element must be a string");
24203
+ }
24204
+ throw new Error(`${methodName} is not Emittery method`);
24205
+ }
24206
+ }
24207
+ return methodNames;
24208
+ }
24209
+ const isListenerSymbol = (symbol) => symbol === listenerAdded || symbol === listenerRemoved;
24210
+ class Emittery {
24211
+ static mixin(emitteryPropertyName, methodNames) {
24212
+ methodNames = defaultMethodNamesOrAssert(methodNames);
24213
+ return (target) => {
24214
+ if (typeof target !== "function") {
24215
+ throw new TypeError("`target` must be function");
24216
+ }
24217
+ for (const methodName of methodNames) {
24218
+ if (target.prototype[methodName] !== void 0) {
24219
+ throw new Error(`The property \`${methodName}\` already exists on \`target\``);
24220
+ }
24221
+ }
24222
+ function getEmitteryProperty() {
24223
+ Object.defineProperty(this, emitteryPropertyName, {
24224
+ enumerable: false,
24225
+ value: new Emittery()
24226
+ });
24227
+ return this[emitteryPropertyName];
24228
+ }
24229
+ Object.defineProperty(target.prototype, emitteryPropertyName, {
24230
+ enumerable: false,
24231
+ get: getEmitteryProperty
24232
+ });
24233
+ const emitteryMethodCaller = (methodName) => function(...args) {
24234
+ return this[emitteryPropertyName][methodName](...args);
24235
+ };
24236
+ for (const methodName of methodNames) {
24237
+ Object.defineProperty(target.prototype, methodName, {
24238
+ enumerable: false,
24239
+ value: emitteryMethodCaller(methodName)
24240
+ });
24241
+ }
24242
+ return target;
24243
+ };
24244
+ }
24245
+ static get isDebugEnabled() {
24246
+ if (typeof process !== "object") {
24247
+ return isGlobalDebugEnabled;
24248
+ }
24249
+ const { env } = process || { env: {} };
24250
+ return env.DEBUG === "emittery" || env.DEBUG === "*" || isGlobalDebugEnabled;
24251
+ }
24252
+ static set isDebugEnabled(newValue) {
24253
+ isGlobalDebugEnabled = newValue;
24254
+ }
24255
+ constructor(options = {}) {
24256
+ anyMap.set(this, /* @__PURE__ */ new Set());
24257
+ eventsMap.set(this, /* @__PURE__ */ new Map());
24258
+ producersMap.set(this, /* @__PURE__ */ new Map());
24259
+ this.debug = options.debug || {};
24260
+ if (this.debug.enabled === void 0) {
24261
+ this.debug.enabled = false;
24262
+ }
24263
+ if (!this.debug.logger) {
24264
+ this.debug.logger = (type, debugName, eventName, eventData) => {
24265
+ try {
24266
+ eventData = JSON.stringify(eventData);
24267
+ } catch {
24268
+ eventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(",")}`;
24269
+ }
24270
+ if (typeof eventName === "symbol") {
24271
+ eventName = eventName.toString();
24272
+ }
24273
+ const currentTime = new Date();
24274
+ const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;
24275
+ console.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}
24276
+ data: ${eventData}`);
24277
+ };
24278
+ }
24279
+ }
24280
+ logIfDebugEnabled(type, eventName, eventData) {
24281
+ if (Emittery.isDebugEnabled || this.debug.enabled) {
24282
+ this.debug.logger(type, this.debug.name, eventName, eventData);
24283
+ }
24284
+ }
24285
+ on(eventNames, listener) {
24286
+ assertListener(listener);
24287
+ eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
24288
+ for (const eventName of eventNames) {
24289
+ assertEventName(eventName);
24290
+ getListeners(this, eventName).add(listener);
24291
+ this.logIfDebugEnabled("subscribe", eventName, void 0);
24292
+ if (!isListenerSymbol(eventName)) {
24293
+ this.emit(listenerAdded, { eventName, listener });
24294
+ }
24295
+ }
24296
+ return this.off.bind(this, eventNames, listener);
24297
+ }
24298
+ off(eventNames, listener) {
24299
+ assertListener(listener);
24300
+ eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
24301
+ for (const eventName of eventNames) {
24302
+ assertEventName(eventName);
24303
+ getListeners(this, eventName).delete(listener);
24304
+ this.logIfDebugEnabled("unsubscribe", eventName, void 0);
24305
+ if (!isListenerSymbol(eventName)) {
24306
+ this.emit(listenerRemoved, { eventName, listener });
24307
+ }
24308
+ }
24309
+ }
24310
+ once(eventNames) {
24311
+ return new Promise((resolve) => {
24312
+ const off = this.on(eventNames, (data2) => {
24313
+ off();
24314
+ resolve(data2);
24315
+ });
24376
24316
  });
24377
24317
  }
24378
- close(modelType) {
24379
- return new Promise((resolve, reject) => {
24380
- let promises = [];
24381
- if (modelType) {
24382
- let tempMediaPipe = this.mediapipeMap_.get(modelType);
24383
- if (tempMediaPipe) {
24384
- this.mediapipeMap_.delete(modelType);
24385
- promises.push(tempMediaPipe.close());
24386
- } else {
24387
- reject("model not exit");
24388
- return;
24318
+ events(eventNames) {
24319
+ eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
24320
+ for (const eventName of eventNames) {
24321
+ assertEventName(eventName);
24322
+ }
24323
+ return iterator(this, eventNames);
24324
+ }
24325
+ async emit(eventName, eventData) {
24326
+ assertEventName(eventName);
24327
+ this.logIfDebugEnabled("emit", eventName, eventData);
24328
+ enqueueProducers(this, eventName, eventData);
24329
+ const listeners = getListeners(this, eventName);
24330
+ const anyListeners = anyMap.get(this);
24331
+ const staticListeners = [...listeners];
24332
+ const staticAnyListeners = isListenerSymbol(eventName) ? [] : [...anyListeners];
24333
+ await resolvedPromise;
24334
+ await Promise.all([
24335
+ ...staticListeners.map(async (listener) => {
24336
+ if (listeners.has(listener)) {
24337
+ return listener(eventData);
24389
24338
  }
24390
- } else {
24391
- for (const [key, tempMediaPipe] of this.mediapipeMap_.entries()) {
24392
- promises.push(tempMediaPipe.close());
24339
+ }),
24340
+ ...staticAnyListeners.map(async (listener) => {
24341
+ if (anyListeners.has(listener)) {
24342
+ return listener(eventName, eventData);
24393
24343
  }
24394
- this.mediapipeMap_.clear();
24344
+ })
24345
+ ]);
24346
+ }
24347
+ async emitSerial(eventName, eventData) {
24348
+ assertEventName(eventName);
24349
+ this.logIfDebugEnabled("emitSerial", eventName, eventData);
24350
+ const listeners = getListeners(this, eventName);
24351
+ const anyListeners = anyMap.get(this);
24352
+ const staticListeners = [...listeners];
24353
+ const staticAnyListeners = [...anyListeners];
24354
+ await resolvedPromise;
24355
+ for (const listener of staticListeners) {
24356
+ if (listeners.has(listener)) {
24357
+ await listener(eventData);
24395
24358
  }
24396
- Promise.all(promises).then(() => {
24397
- resolve();
24398
- }).catch((e) => {
24399
- reject(e);
24400
- });
24401
- });
24359
+ }
24360
+ for (const listener of staticAnyListeners) {
24361
+ if (anyListeners.has(listener)) {
24362
+ await listener(eventName, eventData);
24363
+ }
24364
+ }
24402
24365
  }
24403
- send(image, modelType) {
24404
- return new Promise((resolve, reject) => {
24405
- let promises = [];
24406
- if (modelType) {
24407
- let tempMediaPipe = this.mediapipeMap_.get(modelType);
24408
- if (tempMediaPipe) {
24409
- promises.push(tempMediaPipe.send({ image }));
24410
- } else {
24411
- reject("model not exit");
24412
- return;
24366
+ onAny(listener) {
24367
+ assertListener(listener);
24368
+ this.logIfDebugEnabled("subscribeAny", void 0, void 0);
24369
+ anyMap.get(this).add(listener);
24370
+ this.emit(listenerAdded, { listener });
24371
+ return this.offAny.bind(this, listener);
24372
+ }
24373
+ anyEvent() {
24374
+ return iterator(this);
24375
+ }
24376
+ offAny(listener) {
24377
+ assertListener(listener);
24378
+ this.logIfDebugEnabled("unsubscribeAny", void 0, void 0);
24379
+ this.emit(listenerRemoved, { listener });
24380
+ anyMap.get(this).delete(listener);
24381
+ }
24382
+ clearListeners(eventNames) {
24383
+ eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
24384
+ for (const eventName of eventNames) {
24385
+ this.logIfDebugEnabled("clear", eventName, void 0);
24386
+ if (typeof eventName === "string" || typeof eventName === "symbol") {
24387
+ getListeners(this, eventName).clear();
24388
+ const producers = getEventProducers(this, eventName);
24389
+ for (const producer of producers) {
24390
+ producer.finish();
24413
24391
  }
24392
+ producers.clear();
24414
24393
  } else {
24415
- for (const [key, tempMediaPipe] of this.mediapipeMap_.entries()) {
24416
- promises.push(tempMediaPipe.send({ image }));
24394
+ anyMap.get(this).clear();
24395
+ for (const listeners of eventsMap.get(this).values()) {
24396
+ listeners.clear();
24397
+ }
24398
+ for (const producers of producersMap.get(this).values()) {
24399
+ for (const producer of producers) {
24400
+ producer.finish();
24401
+ }
24402
+ producers.clear();
24417
24403
  }
24418
24404
  }
24419
- Promise.all(promises).then(() => {
24420
- resolve();
24421
- }).catch((e) => {
24422
- reject(e);
24423
- });
24424
- });
24405
+ }
24425
24406
  }
24426
- reset(modelType) {
24427
- if (modelType) {
24428
- let tempMediaPipe = this.mediapipeMap_.get(modelType);
24429
- if (tempMediaPipe && typeof tempMediaPipe.reset === "function") {
24430
- tempMediaPipe.reset();
24407
+ listenerCount(eventNames) {
24408
+ eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
24409
+ let count = 0;
24410
+ for (const eventName of eventNames) {
24411
+ if (typeof eventName === "string") {
24412
+ count += anyMap.get(this).size + getListeners(this, eventName).size + getEventProducers(this, eventName).size + getEventProducers(this).size;
24413
+ continue;
24431
24414
  }
24432
- } else {
24433
- for (const [key, tempMediaPipe] of this.mediapipeMap_.entries()) {
24434
- if (tempMediaPipe && typeof tempMediaPipe.reset === "function") {
24435
- tempMediaPipe.reset();
24436
- }
24415
+ if (typeof eventName !== "undefined") {
24416
+ assertEventName(eventName);
24417
+ }
24418
+ count += anyMap.get(this).size;
24419
+ for (const value of eventsMap.get(this).values()) {
24420
+ count += value.size;
24421
+ }
24422
+ for (const value of producersMap.get(this).values()) {
24423
+ count += value.size;
24437
24424
  }
24438
24425
  }
24426
+ return count;
24439
24427
  }
24440
- };
24441
- let MediapipeHelper = _MediapipeHelper;
24442
- MediapipeHelper.defaultAssetsBaseUrl = "https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/";
24428
+ bindMethods(target, methodNames) {
24429
+ if (typeof target !== "object" || target === null) {
24430
+ throw new TypeError("`target` must be an object");
24431
+ }
24432
+ methodNames = defaultMethodNamesOrAssert(methodNames);
24433
+ for (const methodName of methodNames) {
24434
+ if (target[methodName] !== void 0) {
24435
+ throw new Error(`The property \`${methodName}\` already exists on \`target\``);
24436
+ }
24437
+ Object.defineProperty(target, methodName, {
24438
+ enumerable: false,
24439
+ value: this[methodName].bind(this)
24440
+ });
24441
+ }
24442
+ }
24443
+ }
24444
+ const allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter((v) => v !== "constructor");
24445
+ Object.defineProperty(Emittery, "listenerAdded", {
24446
+ value: listenerAdded,
24447
+ writable: false,
24448
+ enumerable: true,
24449
+ configurable: false
24450
+ });
24451
+ Object.defineProperty(Emittery, "listenerRemoved", {
24452
+ value: listenerRemoved,
24453
+ writable: false,
24454
+ enumerable: true,
24455
+ configurable: false
24456
+ });
24457
+ var emittery = Emittery;
24458
+ const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFR7fVQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxULmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgWT17ZXhwb3J0czp7fX0sRWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLG89MDtvPG4ubGVuZ3RoO28rKyluW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4gZS5hcHBseSh0LG4pfX0scnQ9RWUsUj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIFoocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocil9ZnVuY3Rpb24gZWUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBzdChyKXtyZXR1cm4gciE9PW51bGwmJiFlZShyKSYmci5jb25zdHJ1Y3RvciE9PW51bGwmJiFlZShyLmNvbnN0cnVjdG9yKSYmdHlwZW9mIHIuY29uc3RydWN0b3IuaXNCdWZmZXI9PSJmdW5jdGlvbiImJnIuY29uc3RydWN0b3IuaXNCdWZmZXIocil9ZnVuY3Rpb24gVGUocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSJ9ZnVuY3Rpb24gbnQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZvcm1EYXRhXSJ9ZnVuY3Rpb24gaXQocil7dmFyIGU7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCImJkFycmF5QnVmZmVyLmlzVmlldz9lPUFycmF5QnVmZmVyLmlzVmlldyhyKTplPXImJnIuYnVmZmVyJiZUZShyLmJ1ZmZlciksZX1mdW5jdGlvbiBvdChyKXtyZXR1cm4gdHlwZW9mIHI9PSJzdHJpbmcifWZ1bmN0aW9uIGF0KHIpe3JldHVybiB0eXBlb2Ygcj09Im51bWJlciJ9ZnVuY3Rpb24gUmUocil7cmV0dXJuIHIhPT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9ZnVuY3Rpb24gRihyKXtpZihSLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiB1dChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIGx0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gY3Qocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBQZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBmdChyKXtyZXR1cm4gUmUocikmJlBlKHIucGlwZSl9ZnVuY3Rpb24gaHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIGR0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gcHQoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gdGUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxaKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIHJlKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0YocltvXSkmJkYobik/cltvXT1yZShyW29dLG4pOkYobik/cltvXT1yZSh7fSxuKTpaKG4pP3Jbb109bi5zbGljZSgpOnJbb109bn1mb3IodmFyIHQ9MCxzPWFyZ3VtZW50cy5sZW5ndGg7dDxzO3QrKyl0ZShhcmd1bWVudHNbdF0sZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gbXQocixlLHQpe3JldHVybiB0ZShlLGZ1bmN0aW9uKG4sbyl7dCYmdHlwZW9mIG49PSJmdW5jdGlvbiI/cltvXT1ydChuLHQpOnJbb109bn0pLHJ9ZnVuY3Rpb24gZ3Qocil7cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYocj1yLnNsaWNlKDEpKSxyfXZhciBwPXtpc0FycmF5OlosaXNBcnJheUJ1ZmZlcjpUZSxpc0J1ZmZlcjpzdCxpc0Zvcm1EYXRhOm50LGlzQXJyYXlCdWZmZXJWaWV3Oml0LGlzU3RyaW5nOm90LGlzTnVtYmVyOmF0LGlzT2JqZWN0OlJlLGlzUGxhaW5PYmplY3Q6Rixpc1VuZGVmaW5lZDplZSxpc0RhdGU6dXQsaXNGaWxlOmx0LGlzQmxvYjpjdCxpc0Z1bmN0aW9uOlBlLGlzU3RyZWFtOmZ0LGlzVVJMU2VhcmNoUGFyYW1zOmh0LGlzU3RhbmRhcmRCcm93c2VyRW52OnB0LGZvckVhY2g6dGUsbWVyZ2U6cmUsZXh0ZW5kOm10LHRyaW06ZHQsc3RyaXBCT006Z3R9LHg9cDtmdW5jdGlvbiBDZShyKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgU2U9ZnVuY3Rpb24oZSx0LHMpe2lmKCF0KXJldHVybiBlO3ZhciBuO2lmKHMpbj1zKHQpO2Vsc2UgaWYoeC5pc1VSTFNlYXJjaFBhcmFtcyh0KSluPXQudG9TdHJpbmcoKTtlbHNle3ZhciBvPVtdO3guZm9yRWFjaCh0LGZ1bmN0aW9uKGwsbSl7bD09PW51bGx8fHR5cGVvZiBsPT0idW5kZWZpbmVkInx8KHguaXNBcnJheShsKT9tPW0rIltdIjpsPVtsXSx4LmZvckVhY2gobCxmdW5jdGlvbihmKXt4LmlzRGF0ZShmKT9mPWYudG9JU09TdHJpbmcoKTp4LmlzT2JqZWN0KGYpJiYoZj1KU09OLnN0cmluZ2lmeShmKSksby5wdXNoKENlKG0pKyI9IitDZShmKSl9KSl9KSxuPW8uam9pbigiJiIpfWlmKG4pe3ZhciBpPWUuaW5kZXhPZigiIyIpO2khPT0tMSYmKGU9ZS5zbGljZSgwLGkpKSxlKz0oZS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStufXJldHVybiBlfSx5dD1wO2Z1bmN0aW9uIEwoKXt0aGlzLmhhbmRsZXJzPVtdfUwucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQscyl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpzP3Muc3luY2hyb25vdXM6ITEscnVuV2hlbjpzP3MucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sTC5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LEwucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7eXQuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHMpe3MhPT1udWxsJiZlKHMpfSl9O3ZhciBfdD1MLHZ0PXAsYnQ9ZnVuY3Rpb24oZSx0KXt2dC5mb3JFYWNoKGUsZnVuY3Rpb24obixvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1uLGRlbGV0ZSBlW29dKX0pfSx4ZT1mdW5jdGlvbihlLHQscyxuLG8pe3JldHVybiBlLmNvbmZpZz10LHMmJihlLmNvZGU9cyksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sd3Q9eGUsT2U9ZnVuY3Rpb24oZSx0LHMsbixvKXt2YXIgaT1uZXcgRXJyb3IoZSk7cmV0dXJuIHd0KGksdCxzLG4sbyl9LEV0PU9lLFR0PWZ1bmN0aW9uKGUsdCxzKXt2YXIgbj1zLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshcy5zdGF0dXN8fCFufHxuKHMuc3RhdHVzKT9lKHMpOnQoRXQoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIitzLnN0YXR1cyxzLmNvbmZpZyxudWxsLHMucmVxdWVzdCxzKSl9LEQ9cCxSdD1ELmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24odCxzLG4sbyxpLGEpe3ZhciBsPVtdO2wucHVzaCh0KyI9IitlbmNvZGVVUklDb21wb25lbnQocykpLEQuaXNOdW1iZXIobikmJmwucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKG4pLnRvR01UU3RyaW5nKCkpLEQuaXNTdHJpbmcobykmJmwucHVzaCgicGF0aD0iK28pLEQuaXNTdHJpbmcoaSkmJmwucHVzaCgiZG9tYWluPSIraSksYT09PSEwJiZsLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1sLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24odCl7dmFyIHM9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK3QrIik9KFteO10qKSIpKTtyZXR1cm4gcz9kZWNvZGVVUklDb21wb25lbnQoc1szXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGUodCwiIixEYXRlLm5vdygpLTg2NGU1KX19fSgpOmZ1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSgpLFB0PWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LEN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LFN0PVB0LHh0PUN0LE90PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFTdCh0KT94dChlLHQpOnR9LHNlPXAsSXQ9WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSxNdD1mdW5jdGlvbihlKXt2YXIgdD17fSxzLG4sbztyZXR1cm4gZSYmc2UuZm9yRWFjaChlLnNwbGl0KGAKYCksZnVuY3Rpb24oYSl7aWYobz1hLmluZGV4T2YoIjoiKSxzPXNlLnRyaW0oYS5zdWJzdHIoMCxvKSkudG9Mb3dlckNhc2UoKSxuPXNlLnRyaW0oYS5zdWJzdHIobysxKSkscyl7aWYodFtzXSYmSXQuaW5kZXhPZihzKT49MClyZXR1cm47cz09PSJzZXQtY29va2llIj90W3NdPSh0W3NdP3Rbc106W10pLmNvbmNhdChbbl0pOnRbc109dFtzXT90W3NdKyIsICIrbjpufX0pLHR9LEllPXAsa3Q9SWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlPS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikscztmdW5jdGlvbiBuKG8pe3ZhciBpPW87cmV0dXJuIGUmJih0LnNldEF0dHJpYnV0ZSgiaHJlZiIsaSksaT10LmhyZWYpLHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSx7aHJlZjp0LmhyZWYscHJvdG9jb2w6dC5wcm90b2NvbD90LnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDp0Lmhvc3Qsc2VhcmNoOnQuc2VhcmNoP3Quc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6dC5oYXNoP3QuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnQuaG9zdG5hbWUscG9ydDp0LnBvcnQscGF0aG5hbWU6dC5wYXRobmFtZS5jaGFyQXQoMCk9PT0iLyI/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZX19cmV0dXJuIHM9bih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24oaSl7dmFyIGE9SWUuaXNTdHJpbmcoaSk/bihpKTppO3JldHVybiBhLnByb3RvY29sPT09cy5wcm90b2NvbCYmYS5ob3N0PT09cy5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiEwfX0oKTtmdW5jdGlvbiBuZShyKXt0aGlzLm1lc3NhZ2U9cn1uZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sbmUucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIHE9bmUsSD1wLEF0PVR0LE50PVJ0LCR0PVNlLFV0PU90LEJ0PU10LEZ0PWt0LGllPU9lLEx0PUosRHQ9cSxNZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocyxuKXt2YXIgbz1lLmRhdGEsaT1lLmhlYWRlcnMsYT1lLnJlc3BvbnNlVHlwZSxsO2Z1bmN0aW9uIG0oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGwpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsbCl9SC5pc0Zvcm1EYXRhKG8pJiZkZWxldGUgaVsiQ29udGVudC1UeXBlIl07dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGY9ZS5hdXRoLnVzZXJuYW1lfHwiIixFPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7aS5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoZisiOiIrRSl9dmFyIGc9VXQoZS5iYXNlVVJMLGUudXJsKTt1Lm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSwkdChnLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksITApLHUudGltZW91dD1lLnRpbWVvdXQ7ZnVuY3Rpb24gZXQoKXtpZighIXUpe3ZhciBiPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gdT9CdCh1LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE49IWF8fGE9PT0idGV4dCJ8fGE9PT0ianNvbiI/dS5yZXNwb25zZVRleHQ6dS5yZXNwb25zZSxTPXtkYXRhOk4sc3RhdHVzOnUuc3RhdHVzLHN0YXR1c1RleHQ6dS5zdGF0dXNUZXh0LGhlYWRlcnM6Yixjb25maWc6ZSxyZXF1ZXN0OnV9O0F0KGZ1bmN0aW9uKHdlKXtzKHdlKSxtKCl9LGZ1bmN0aW9uKHdlKXtuKHdlKSxtKCl9LFMpLHU9bnVsbH19aWYoIm9ubG9hZGVuZCJpbiB1P3Uub25sb2FkZW5kPWV0OnUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IXV8fHUucmVhZHlTdGF0ZSE9PTR8fHUuc3RhdHVzPT09MCYmISh1LnJlc3BvbnNlVVJMJiZ1LnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChldCl9LHUub25hYm9ydD1mdW5jdGlvbigpeyF1fHwobihpZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLHUpKSx1PW51bGwpfSx1Lm9uZXJyb3I9ZnVuY3Rpb24oKXtuKGllKCJOZXR3b3JrIEVycm9yIixlLG51bGwsdSkpLHU9bnVsbH0sdS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTj1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsUz1lLnRyYW5zaXRpb25hbHx8THQudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE49ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxuKGllKE4sZSxTLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbH0sSC5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgdHQ9KGUud2l0aENyZWRlbnRpYWxzfHxGdChnKSkmJmUueHNyZkNvb2tpZU5hbWU/TnQucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7dHQmJihpW2UueHNyZkhlYWRlck5hbWVdPXR0KX0ic2V0UmVxdWVzdEhlYWRlciJpbiB1JiZILmZvckVhY2goaSxmdW5jdGlvbihOLFMpe3R5cGVvZiBvPT0idW5kZWZpbmVkIiYmUy50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSI/ZGVsZXRlIGlbU106dS5zZXRSZXF1ZXN0SGVhZGVyKFMsTil9KSxILmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KHUud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLGEmJmEhPT0ianNvbiImJih1LnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmdS51cGxvYWQmJnUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihsPWZ1bmN0aW9uKGIpeyF1fHwobighYnx8YiYmYi50eXBlP25ldyBEdCgiY2FuY2VsZWQiKTpiKSx1LmFib3J0KCksdT1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobCksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2woKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbCkpKSxvfHwobz1udWxsKSx1LnNlbmQobyl9KX0saD1wLGtlPWJ0LHF0PXhlLEh0PXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gQWUocixlKXshaC5pc1VuZGVmaW5lZChyKSYmaC5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBqdCgpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPU1lKSxyfWZ1bmN0aW9uIEp0KHIsZSx0KXtpZihoLmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksaC50cmltKHIpfWNhdGNoKHMpe2lmKHMubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgc31yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciBqPXt0cmFuc2l0aW9uYWw6e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LGFkYXB0ZXI6anQoKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBrZSh0LCJBY2NlcHQiKSxrZSh0LCJDb250ZW50LVR5cGUiKSxoLmlzRm9ybURhdGEoZSl8fGguaXNBcnJheUJ1ZmZlcihlKXx8aC5pc0J1ZmZlcihlKXx8aC5pc1N0cmVhbShlKXx8aC5pc0ZpbGUoZSl8fGguaXNCbG9iKGUpP2U6aC5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjpoLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhBZSh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6aC5pc09iamVjdChlKXx8dCYmdFsiQ29udGVudC1UeXBlIl09PT0iYXBwbGljYXRpb24vanNvbiI/KEFlKHQsImFwcGxpY2F0aW9uL2pzb24iKSxKdChlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8ai50cmFuc2l0aW9uYWwscz10JiZ0LnNpbGVudEpTT05QYXJzaW5nLG49dCYmdC5mb3JjZWRKU09OUGFyc2luZyxvPSFzJiZ0aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihvfHxuJiZoLmlzU3RyaW5nKGUpJiZlLmxlbmd0aCl0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goaSl7aWYobyl0aHJvdyBpLm5hbWU9PT0iU3ludGF4RXJyb3IiP3F0KGksdGhpcywiRV9KU09OX1BBUlNFIik6aX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtoLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sZnVuY3Rpb24oZSl7ai5oZWFkZXJzW2VdPXt9fSksaC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7ai5oZWFkZXJzW2VdPWgubWVyZ2UoSHQpfSk7dmFyIEo9aixWdD1wLHp0PUosV3Q9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXRoaXN8fHp0O3JldHVybiBWdC5mb3JFYWNoKHMsZnVuY3Rpb24oaSl7ZT1pLmNhbGwobixlLHQpfSksZX0sTmU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5fX0NBTkNFTF9fKX0sJGU9cCxvZT1XdCxHdD1OZSxRdD1KLFh0PXE7ZnVuY3Rpb24gYWUocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IFh0KCJjYW5jZWxlZCIpfXZhciBLdD1mdW5jdGlvbihlKXthZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9b2UuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9JGUubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSwkZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKG4pe2RlbGV0ZSBlLmhlYWRlcnNbbl19KTt2YXIgdD1lLmFkYXB0ZXJ8fFF0LmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gYWUoZSksbi5kYXRhPW9lLmNhbGwoZSxuLmRhdGEsbi5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLG59LGZ1bmN0aW9uKG4pe3JldHVybiBHdChuKXx8KGFlKGUpLG4mJm4ucmVzcG9uc2UmJihuLnJlc3BvbnNlLmRhdGE9b2UuY2FsbChlLG4ucmVzcG9uc2UuZGF0YSxuLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChuKX0pfSx5PXAsVWU9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBzPXt9O2Z1bmN0aW9uIG4odSxmKXtyZXR1cm4geS5pc1BsYWluT2JqZWN0KHUpJiZ5LmlzUGxhaW5PYmplY3QoZik/eS5tZXJnZSh1LGYpOnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHt9LGYpOnkuaXNBcnJheShmKT9mLnNsaWNlKCk6Zn1mdW5jdGlvbiBvKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKGVbdV0sdFt1XSl9ZnVuY3Rpb24gaSh1KXtpZigheS5pc1VuZGVmaW5lZCh0W3VdKSlyZXR1cm4gbih2b2lkIDAsdFt1XSl9ZnVuY3Rpb24gYSh1KXtpZih5LmlzVW5kZWZpbmVkKHRbdV0pKXtpZigheS5pc1VuZGVmaW5lZChlW3VdKSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9ZWxzZSByZXR1cm4gbih2b2lkIDAsdFt1XSl9ZnVuY3Rpb24gbCh1KXtpZih1IGluIHQpcmV0dXJuIG4oZVt1XSx0W3VdKTtpZih1IGluIGUpcmV0dXJuIG4odm9pZCAwLGVbdV0pfXZhciBtPXt1cmw6aSxtZXRob2Q6aSxkYXRhOmksYmFzZVVSTDphLHRyYW5zZm9ybVJlcXVlc3Q6YSx0cmFuc2Zvcm1SZXNwb25zZTphLHBhcmFtc1NlcmlhbGl6ZXI6YSx0aW1lb3V0OmEsdGltZW91dE1lc3NhZ2U6YSx3aXRoQ3JlZGVudGlhbHM6YSxhZGFwdGVyOmEscmVzcG9uc2VUeXBlOmEseHNyZkNvb2tpZU5hbWU6YSx4c3JmSGVhZGVyTmFtZTphLG9uVXBsb2FkUHJvZ3Jlc3M6YSxvbkRvd25sb2FkUHJvZ3Jlc3M6YSxkZWNvbXByZXNzOmEsbWF4Q29udGVudExlbmd0aDphLG1heEJvZHlMZW5ndGg6YSx0cmFuc3BvcnQ6YSxodHRwQWdlbnQ6YSxodHRwc0FnZW50OmEsY2FuY2VsVG9rZW46YSxzb2NrZXRQYXRoOmEscmVzcG9uc2VFbmNvZGluZzphLHZhbGlkYXRlU3RhdHVzOmx9O3JldHVybiB5LmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihmKXt2YXIgRT1tW2ZdfHxvLGc9RShmKTt5LmlzVW5kZWZpbmVkKGcpJiZFIT09bHx8KHNbZl09Zyl9KSxzfSxCZT17dmVyc2lvbjoiMC4yNS4wIn0sWXQ9QmUudmVyc2lvbix1ZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXt1ZVtyXT1mdW5jdGlvbihzKXtyZXR1cm4gdHlwZW9mIHM9PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgRmU9e307dWUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxzKXtmdW5jdGlvbiBuKG8saSl7cmV0dXJuIltBeGlvcyB2IitZdCsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2krKHM/Ii4gIitzOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxpLGEpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IobihpLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFGZVtpXSYmKEZlW2ldPSEwLGNvbnNvbGUud2FybihuKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8saSxhKTohMH19O2Z1bmN0aW9uIFp0KHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgcz1PYmplY3Qua2V5cyhyKSxuPXMubGVuZ3RoO24tLSA+MDspe3ZhciBvPXNbbl0saT1lW29dO2lmKGkpe3ZhciBhPXJbb10sbD1hPT09dm9pZCAwfHxpKGEsbyxyKTtpZihsIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitsKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBlcj17YXNzZXJ0T3B0aW9uczpadCx2YWxpZGF0b3JzOnVlfSxMZT1wLHRyPVNlLERlPV90LHFlPUt0LFY9VWUsSGU9ZXIsTz1IZS52YWxpZGF0b3JzO2Z1bmN0aW9uICQocil7dGhpcy5kZWZhdWx0cz1yLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBEZSxyZXNwb25zZTpuZXcgRGV9fSQucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZT09InN0cmluZyI/KHQ9dHx8e30sdC51cmw9ZSk6dD1lfHx7fSwhdC51cmwpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBjb25maWcgdXJsIGlzIG5vdCB2YWxpZCIpO3Q9Vih0aGlzLmRlZmF1bHRzLHQpLHQubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgcz10LnRyYW5zaXRpb25hbDtzIT09dm9pZCAwJiZIZS5hc3NlcnRPcHRpb25zKHMse3NpbGVudEpTT05QYXJzaW5nOk8udHJhbnNpdGlvbmFsKE8uYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6Ty50cmFuc2l0aW9uYWwoTy5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOk8udHJhbnNpdGlvbmFsKE8uYm9vbGVhbil9LCExKTt2YXIgbj1bXSxvPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihnKXt0eXBlb2YgZy5ydW5XaGVuPT0iZnVuY3Rpb24iJiZnLnJ1bldoZW4odCk9PT0hMXx8KG89byYmZy5zeW5jaHJvbm91cyxuLnVuc2hpZnQoZy5mdWxmaWxsZWQsZy5yZWplY3RlZCkpfSk7dmFyIGk9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbihnKXtpLnB1c2goZy5mdWxmaWxsZWQsZy5yZWplY3RlZCl9KTt2YXIgYTtpZighbyl7dmFyIGw9W3FlLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGwsbiksbD1sLmNvbmNhdChpKSxhPVByb21pc2UucmVzb2x2ZSh0KTtsLmxlbmd0aDspYT1hLnRoZW4obC5zaGlmdCgpLGwuc2hpZnQoKSk7cmV0dXJuIGF9Zm9yKHZhciBtPXQ7bi5sZW5ndGg7KXt2YXIgdT1uLnNoaWZ0KCksZj1uLnNoaWZ0KCk7dHJ5e209dShtKX1jYXRjaChFKXtmKEUpO2JyZWFrfX10cnl7YT1xZShtKX1jYXRjaChFKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoRSl9Zm9yKDtpLmxlbmd0aDspYT1hLnRoZW4oaS5zaGlmdCgpLGkuc2hpZnQoKSk7cmV0dXJuIGF9LCQucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtpZighZS51cmwpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBjb25maWcgdXJsIGlzIG5vdCB2YWxpZCIpO3JldHVybiBlPVYodGhpcy5kZWZhdWx0cyxlKSx0cihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxMZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXskLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHMpe3JldHVybiB0aGlzLnJlcXVlc3QoVihzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTooc3x8e30pLmRhdGF9KSl9fSksTGUuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKGUpeyQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFYobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6c30pKX19KTt2YXIgcnI9JCxzcj1xO2Z1bmN0aW9uIEkocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihuKXtlPW59KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKHMpe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgbixvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKG49MDtuPG87bisrKXQuX2xpc3RlbmVyc1tuXShzKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihzKXt2YXIgbixvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGkpe3Quc3Vic2NyaWJlKGkpLG49aX0pLnRoZW4ocyk7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShuKX0sb30scihmdW5jdGlvbihuKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBzcihuKSxlKHQucmVhc29uKSl9KX1JLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LEkucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxJLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxJLnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IEkoZnVuY3Rpb24obil7ZT1ufSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgbnI9SSxpcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIGUuYXBwbHkobnVsbCxzKX19LG9yPXAsYXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG9yLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxqZT1wLHVyPUVlLHo9cnIsbHI9VWUsY3I9SjtmdW5jdGlvbiBKZShyKXt2YXIgZT1uZXcgeihyKSx0PXVyKHoucHJvdG90eXBlLnJlcXVlc3QsZSk7cmV0dXJuIGplLmV4dGVuZCh0LHoucHJvdG90eXBlLGUpLGplLmV4dGVuZCh0LGUpLHQuY3JlYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBKZShscihyLG4pKX0sdH12YXIgdz1KZShjcik7dy5BeGlvcz16LHcuQ2FuY2VsPXEsdy5DYW5jZWxUb2tlbj1ucix3LmlzQ2FuY2VsPU5lLHcuVkVSU0lPTj1CZS52ZXJzaW9uLHcuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX0sdy5zcHJlYWQ9aXIsdy5pc0F4aW9zRXJyb3I9YXIsWS5leHBvcnRzPXcsWS5leHBvcnRzLmRlZmF1bHQ9dzt2YXIgZnI9WS5leHBvcnRzO2NsYXNzIGN7aXNFbXB0eSgpe3JldHVybiF0aGlzLmlzUHJlc2VudCgpfXN0YXRpYyBvZihlKXtpZihlIT1udWxsKXJldHVybiBuZXcgVmUoZSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhc3NlZCB2YWx1ZSB3YXMgbnVsbCBvciB1bmRlZmluZWQuIil9c3RhdGljIG9mTm9uTnVsbChlKXtyZXR1cm4gYy5vZihlKX1zdGF0aWMgb2ZOdWxsYWJsZShlKXtyZXR1cm4gZSE9bnVsbD9uZXcgVmUoZSk6bmV3IHplfXN0YXRpYyBlbXB0eSgpe3JldHVybiBuZXcgemV9c3RhdGljIGZyb20oZSl7c3dpdGNoKGUua2luZCl7Y2FzZSJwcmVzZW50IjpyZXR1cm4gYy5vZihlLnZhbHVlKTtjYXNlImVtcHR5IjpyZXR1cm4gYy5lbXB0eSgpO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhc3NlZCB2YWx1ZSB3YXMgbm90IGFuIE9wdGlvbiB0eXBlLiIpfX19Y2xhc3MgVmUgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5wYXlsb2FkPWV9aXNQcmVzZW50KCl7cmV0dXJuITB9Z2V0KCl7cmV0dXJuIHRoaXMucGF5bG9hZH1pZlByZXNlbnQoZSl7ZSh0aGlzLnBheWxvYWQpfWlmUHJlc2VudE9yRWxzZShlLHQpe2UodGhpcy5wYXlsb2FkKX1maWx0ZXIoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKT90aGlzOmMuZW1wdHkoKX1tYXAoZSl7Y29uc3QgdD1lKHRoaXMucGF5bG9hZCk7cmV0dXJuIGMub2ZOdWxsYWJsZSh0KX1mbGF0TWFwKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCl9b3IoZSl7cmV0dXJuIHRoaXN9b3JFbHNlKGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JFbHNlVGhyb3coZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vck51bGwoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yVW5kZWZpbmVkKCl7cmV0dXJuIHRoaXMucGF5bG9hZH10b09wdGlvbigpe3JldHVybntraW5kOiJwcmVzZW50Iix2YWx1ZTp0aGlzLnBheWxvYWR9fW1hdGNoZXMoZSl7cmV0dXJuIGUucHJlc2VudCh0aGlzLnBheWxvYWQpfXRvSlNPTihlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfX1jbGFzcyB6ZSBleHRlbmRzIGN7aXNQcmVzZW50KCl7cmV0dXJuITF9Y29uc3RydWN0b3IoKXtzdXBlcigpfWdldCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBvcHRpb25hbCBpcyBub3QgcHJlc2VudC4iKX1pZlByZXNlbnQoZSl7fWlmUHJlc2VudE9yRWxzZShlLHQpe3QoKX1maWx0ZXIoZSl7cmV0dXJuIHRoaXN9bWFwKGUpe3JldHVybiBjLmVtcHR5KCl9ZmxhdE1hcChlKXtyZXR1cm4gYy5lbXB0eSgpfW9yKGUpe3JldHVybiBlKCl9b3JFbHNlKGUpe3JldHVybiBlfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5vckVsc2UoZSgpKX1vckVsc2VUaHJvdyhlKXt0aHJvdyBlKCl9b3JOdWxsKCl7cmV0dXJuIG51bGx9b3JVbmRlZmluZWQoKXt9dG9PcHRpb24oKXtyZXR1cm57a2luZDoiZW1wdHkifX1tYXRjaGVzKGUpe3JldHVybiBlLmVtcHR5KCl9dG9KU09OKGUpe3JldHVybiBudWxsfX1jb25zdCBocj0iMS4yLjciO2Z1bmN0aW9uIGRyKHIpe2dsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGE9cn1mdW5jdGlvbiBwcigpe3JldHVybiBnbG9iYWxUaGlzLl92b25hZ2VNZWRpYVByb2Nlc3Nvck1ldGFkYXRhfWNsYXNzIF97Y29uc3RydWN0b3IoKXtjb25zdCBlPXByKCk7dGhpcy5fcmVwb3J0PXthY3Rpb246Yy5lbXB0eSgpLGFwcGxpY2F0aW9uSWQ6Yy5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5hcHBJZDpudWxsKSx0aW1lc3RhbXA6RGF0ZS5ub3coKSxmcHM6Yy5lbXB0eSgpLGZyYW1lc1RyYW5zZm9ybWVkOmMuZW1wdHkoKSxndWlkOmMuZW1wdHkoKSxoaWdoZXN0RnJhbWVUcmFuc2Zvcm1DcHU6Yy5lbXB0eSgpLG1lc3NhZ2U6Yy5lbXB0eSgpLHNvdXJjZTpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnNvdXJjZVR5cGU6bnVsbCksdHJhbnNmb3JtZWRGcHM6Yy5lbXB0eSgpLHRyYW5zZm9ybWVyVHlwZTpjLmVtcHR5KCksdmFyaWF0aW9uOmMuZW1wdHkoKSx2aWRlb0hlaWdodDpjLmVtcHR5KCksdmlkZW9XaWR0aDpjLmVtcHR5KCksdmVyc2lvbjpocixlcnJvcjpjLmVtcHR5KCkscHJveHlVcmw6Yy5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5wcm94eVVybDpudWxsKX19YWN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuYWN0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfWZyYW1lc1RyYW5zZm9ybWVkKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnJhbWVzVHJhbnNmb3JtZWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZnBzPWMub2ZOdWxsYWJsZShlKSx0aGlzfWd1aWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5ndWlkPWMub2ZOdWxsYWJsZShlKSx0aGlzfW1lc3NhZ2UoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5tZXNzYWdlPWMub2ZOdWxsYWJsZShlKSx0aGlzfXRyYW5zZm9ybWVkRnBzKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZWRGcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZXJUeXBlKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudHJhbnNmb3JtZXJUeXBlPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZhcmlhdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZhcmlhdGlvbj1jLm9mTnVsbGFibGUoZSksdGhpc312aWRlb0hlaWdodChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvSGVpZ2h0PWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvV2lkdGgoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC52aWRlb1dpZHRoPWMub2ZOdWxsYWJsZShlKSx0aGlzfWVycm9yKGUpe3JldHVybiB0aGlzLl9yZXBvcnQuZXJyb3I9Yy5vZk51bGxhYmxlKGUpLHRoaXN9YnVpbGQoKXtyZXR1cm4gdGhpcy5fcmVwb3J0fX1jb25zdCBtcj1yPT5KU09OLnN0cmluZ2lmeShyLChlLHQpPT57aWYodCE9PW51bGwpcmV0dXJuIHR9KTtjbGFzcyB2e3N0YXRpYyByZXBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LHMpPT57aWYoZS5hcHBsaWNhdGlvbklkLmlzRW1wdHkoKXx8ZS5zb3VyY2UuaXNFbXB0eSgpKXt0KCJzdWNjZXNzIik7cmV0dXJufWxldCBuPWZyLmNyZWF0ZSgpLG89e3RpbWVvdXQ6MWU0LHRpbWVvdXRFcnJvck1lc3NhZ2U6IlJlcXVlc3QgdGltZW91dCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX0saT0iaGxnLnRva2JveC5jb20vcHJvZC9sb2dnaW5nL3ZjcF93ZWJydGMiO2lmKGUucHJveHlVcmwuaXNFbXB0eSgpKWk9Imh0dHBzOi8vIitpO2Vsc2V7bGV0IGE7ZS5wcm94eVVybC5nZXQoKS5zbGljZShlLnByb3h5VXJsLmdldCgpLmxlbmd0aC0xKSE9PSIvIj9hPWUucHJveHlVcmwuZ2V0KCkrIi8iOmE9ZS5wcm94eVVybC5nZXQoKSxpPWEraX1uLnBvc3QoaSxtcihlKSxvKS50aGVuKGE9Pntjb25zb2xlLmxvZyhhKSx0KCJzdWNjZXNzIil9KS5jYXRjaChhPT57Y29uc29sZS5sb2coYSkscyhhKX0pfSl9fXZhciBXLGdyPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiB5cigpe2lmKCFXJiYoVz10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhVykpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBXKGdyKX12YXIgX3I9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIHZyKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJl9yLnRlc3Qocil9Zm9yKHZhciBkPVtdLGxlPTA7bGU8MjU2OysrbGUpZC5wdXNoKChsZSsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIGJyKHIpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLHQ9KGRbcltlKzBdXStkW3JbZSsxXV0rZFtyW2UrMl1dK2RbcltlKzNdXSsiLSIrZFtyW2UrNF1dK2RbcltlKzVdXSsiLSIrZFtyW2UrNl1dK2RbcltlKzddXSsiLSIrZFtyW2UrOF1dK2RbcltlKzldXSsiLSIrZFtyW2UrMTBdXStkW3JbZSsxMV1dK2RbcltlKzEyXV0rZFtyW2UrMTNdXStkW3JbZSsxNF1dK2RbcltlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIXZyKHQpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIHR9ZnVuY3Rpb24gV2UocixlLHQpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8eXIpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsZSl7dD10fHwwO2Zvcih2YXIgbj0wO248MTY7KytuKWVbdCtuXT1zW25dO3JldHVybiBlfXJldHVybiBicihzKX1jb25zdCBQPW5ldyBXZWFrTWFwLEc9bmV3IFdlYWtNYXAsVT1uZXcgV2Vha01hcCxjZT1TeW1ib2woImFueVByb2R1Y2VyIiksR2U9UHJvbWlzZS5yZXNvbHZlKCksUT1TeW1ib2woImxpc3RlbmVyQWRkZWQiKSxYPVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IGZlPSExO2Z1bmN0aW9uIE0ocil7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0eXBlb2YgciE9InN5bWJvbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXZlbnROYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wiKX1mdW5jdGlvbiBLKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGsocixlKXtjb25zdCB0PUcuZ2V0KHIpO3JldHVybiB0LmhhcyhlKXx8dC5zZXQoZSxuZXcgU2V0KSx0LmdldChlKX1mdW5jdGlvbiBCKHIsZSl7Y29uc3QgdD10eXBlb2YgZT09InN0cmluZyJ8fHR5cGVvZiBlPT0ic3ltYm9sIj9lOmNlLHM9VS5nZXQocik7cmV0dXJuIHMuaGFzKHQpfHxzLnNldCh0LG5ldyBTZXQpLHMuZ2V0KHQpfWZ1bmN0aW9uIHdyKHIsZSx0KXtjb25zdCBzPVUuZ2V0KHIpO2lmKHMuaGFzKGUpKWZvcihjb25zdCBuIG9mIHMuZ2V0KGUpKW4uZW5xdWV1ZSh0KTtpZihzLmhhcyhjZSkpe2NvbnN0IG49UHJvbWlzZS5hbGwoW2UsdF0pO2Zvcihjb25zdCBvIG9mIHMuZ2V0KGNlKSlvLmVucXVldWUobil9fWZ1bmN0aW9uIFFlKHIsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PSExLHM9KCk9Pnt9LG49W107Y29uc3Qgbz17ZW5xdWV1ZShpKXtuLnB1c2goaSkscygpfSxmaW5pc2goKXt0PSEwLHMoKX19O2Zvcihjb25zdCBpIG9mIGUpQihyLGkpLmFkZChvKTtyZXR1cm57YXN5bmMgbmV4dCgpe3JldHVybiBuP24ubGVuZ3RoPT09MD90PyhuPXZvaWQgMCx0aGlzLm5leHQoKSk6KGF3YWl0IG5ldyBQcm9taXNlKGk9PntzPWl9KSx0aGlzLm5leHQoKSk6e2RvbmU6ITEsdmFsdWU6YXdhaXQgbi5zaGlmdCgpfTp7ZG9uZTohMH19LGFzeW5jIHJldHVybihpKXtuPXZvaWQgMDtmb3IoY29uc3QgYSBvZiBlKUIocixhKS5kZWxldGUobyk7cmV0dXJuIHMoKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgaX06e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBYZShyKXtpZihyPT09dm9pZCAwKXJldHVybiBLZTtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIUtlLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgaGU9cj0+cj09PVF8fHI9PT1YO2NsYXNzIEN7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9WGUodCkscz0+e2lmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgaSBvZiB0KWlmKHMucHJvdG90eXBlW2ldIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtpfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBuKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IEN9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpufSk7Y29uc3Qgbz1pPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtpXSguLi5hKX07Zm9yKGNvbnN0IGkgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkocy5wcm90b3R5cGUsaSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKGkpfSk7cmV0dXJuIHN9fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIGZlO2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fGZlfXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7ZmU9ZX1jb25zdHJ1Y3RvcihlPXt9KXtQLnNldCh0aGlzLG5ldyBTZXQpLEcuc2V0KHRoaXMsbmV3IE1hcCksVS5zZXQodGhpcyxuZXcgTWFwKSx0aGlzLmRlYnVnPWUuZGVidWd8fHt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0odCxzLG4sbyk9PntvPUpTT04uc3RyaW5naWZ5KG8pLHR5cGVvZiBuPT0ic3ltYm9sIiYmKG49bi50b1N0cmluZygpKTtjb25zdCBpPW5ldyBEYXRlLGE9YCR7aS5nZXRIb3VycygpfToke2kuZ2V0TWludXRlcygpfToke2kuZ2V0U2Vjb25kcygpfS4ke2kuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7YX1dW2VtaXR0ZXJ5OiR7dH1dWyR7c31dIEV2ZW50IE5hbWU6ICR7bn0KCWRhdGE6ICR7b31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxzKXsoQy5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUsdCxzKX1vbihlLHQpe0sodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpTShzKSxrKHRoaXMscykuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIscyx2b2lkIDApLGhlKHMpfHx0aGlzLmVtaXQoUSx7ZXZlbnROYW1lOnMsbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtLKHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgcyBvZiBlKU0ocyksayh0aGlzLHMpLmRlbGV0ZSh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZSIscyx2b2lkIDApLGhlKHMpfHx0aGlzLmVtaXQoWCx7ZXZlbnROYW1lOnMsbGlzdGVuZXI6dH0pfW9uY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pntjb25zdCBzPXRoaXMub24oZSxuPT57cygpLHQobil9KX0pfWV2ZW50cyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlNKHQpO3JldHVybiBRZSh0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtNKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCksd3IodGhpcyxlLHQpO2NvbnN0IHM9ayh0aGlzLGUpLG49UC5nZXQodGhpcyksbz1bLi4uc10saT1oZShlKT9bXTpbLi4ubl07YXdhaXQgR2UsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm8ubWFwKGFzeW5jIGE9PntpZihzLmhhcyhhKSlyZXR1cm4gYSh0KX0pLC4uLmkubWFwKGFzeW5jIGE9PntpZihuLmhhcyhhKSlyZXR1cm4gYShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7TShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IHM9ayh0aGlzLGUpLG49UC5nZXQodGhpcyksbz1bLi4uc10saT1bLi4ubl07YXdhaXQgR2U7Zm9yKGNvbnN0IGEgb2YgbylzLmhhcyhhKSYmYXdhaXQgYSh0KTtmb3IoY29uc3QgYSBvZiBpKW4uaGFzKGEpJiZhd2FpdCBhKGUsdCl9b25BbnkoZSl7cmV0dXJuIEsoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxQLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KFEse2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gUWUodGhpcyl9b2ZmQW55KGUpe0soZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChYLHtsaXN0ZW5lcjplfSksUC5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe2sodGhpcyx0KS5jbGVhcigpO2NvbnN0IHM9Qih0aGlzLHQpO2Zvcihjb25zdCBuIG9mIHMpbi5maW5pc2goKTtzLmNsZWFyKCl9ZWxzZXtQLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBzIG9mIEcuZ2V0KHRoaXMpLnZhbHVlcygpKXMuY2xlYXIoKTtmb3IoY29uc3QgcyBvZiBVLmdldCh0aGlzKS52YWx1ZXMoKSl7Zm9yKGNvbnN0IG4gb2YgcyluLmZpbmlzaCgpO3MuY2xlYXIoKX19fWxpc3RlbmVyQ291bnQoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PTA7Zm9yKGNvbnN0IHMgb2YgZSl7aWYodHlwZW9mIHM9PSJzdHJpbmciKXt0Kz1QLmdldCh0aGlzKS5zaXplK2sodGhpcyxzKS5zaXplK0IodGhpcyxzKS5zaXplK0IodGhpcykuc2l6ZTtjb250aW51ZX10eXBlb2YgcyE9InVuZGVmaW5lZCImJk0ocyksdCs9UC5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgbiBvZiBHLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1uLnNpemU7Zm9yKGNvbnN0IG4gb2YgVS5nZXQodGhpcykudmFsdWVzKCkpdCs9bi5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9WGUodCk7Zm9yKGNvbnN0IHMgb2YgdCl7aWYoZVtzXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7c31cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscyx7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW3NdLmJpbmQodGhpcyl9KX19fWNvbnN0IEtlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEMucHJvdG90eXBlKS5maWx0ZXIocj0+ciE9PSJjb25zdHJ1Y3RvciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6USx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTpYLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7dmFyIGRlPUM7ZnVuY3Rpb24gRXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIFRyKHIpe2lmKEVyKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIHBlKHIpe3JldHVybiBUcihyKS5tZXNzYWdlfXZhciBtZTsoZnVuY3Rpb24ocil7ci5GUFNfRFJPUD0iZnBzX2Ryb3AifSkobWV8fChtZT17fSkpO2NvbnN0IFJyPTUwMCxQcj0uODtjbGFzcyBDciBleHRlbmRzIGRle2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmluZGV4Xz10LHRoaXMudXVpZF89V2UoKSx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wLHRoaXMudHJhbnNmb3JtZXJfPWUsdGhpcy5zaG91bGRTdG9wXz0hMSx0aGlzLmlzRmxhc2hlZF89ITEsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnBzXz0wLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMudmlkZW9IZWlnaHRfPTAsdGhpcy52aWRlb1dpZHRoXz0wLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMudHJhbnNmb3JtZXJUeXBlXz0iQ3VzdG9tIiwiZ2V0VHJhbnNmb3JtZXJUeXBlImluIGUmJih0aGlzLnRyYW5zZm9ybWVyVHlwZV89ZS5nZXRUcmFuc2Zvcm1lclR5cGUoKSk7Y29uc3Qgcz1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO3YucmVwb3J0KHMpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWV9YXN5bmMgc3RhcnQoZSl7aWYodGhpcy5jb250cm9sbGVyXz1lLHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IHM9bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMudHJhbnNmb3JtZXJfc3RhcnQpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihwZSh0KSkuYnVpbGQoKTt2LnJlcG9ydChzKTtjb25zdCBuPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjp0LGZ1bmN0aW9uOiJzdGFydCJ9O3RoaXMuZW1pdCgiZXJyb3IiLG4pfX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt2YXIgcyxuLG8saTtpZih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89PT0wJiYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPURhdGUubm93KCkpLGUgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lJiYodGhpcy52aWRlb0hlaWdodF89KHM9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5SGVpZ2h0KSE9bnVsbD9zOjAsdGhpcy52aWRlb1dpZHRoXz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlXaWR0aCkhPW51bGw/bjowKSwrK3RoaXMuZnJhbWVzRnJvbVNvdXJjZV8sdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyljb25zb2xlLndhcm4oIltQaXBlbGluZV0gZmx1c2ggZnJvbSB0cmFuc2Zvcm0iKSxlLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2UgdHJ5e2F3YWl0KChpPShvPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDppLmNhbGwobyxlLHQpKSwrK3RoaXMuZnJhbWVzVHJhbnNmb3JtZWRfLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPT09UnImJnRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpfWNhdGNoKGEpe2NvbnN0IGw9bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IocGUoYSkpLmJ1aWxkKCk7di5yZXBvcnQobCk7Y29uc3QgbT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6YSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsbSl9fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2gocyl7Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShULmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKHBlKHMpKS5idWlsZCgpO3YucmVwb3J0KG4pO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnMsZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTt2LnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Uscz10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qUHI+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6bWUuRlBTX0RST1AsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnR9fTt0aGlzLmVtaXQoIndhcm4iLG8pfWNvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5mcHModCkudHJhbnNmb3JtZWRGcHMocykuZnJhbWVzVHJhbnNmb3JtZWQodGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8pLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmlkZW9IZWlnaHQodGhpcy52aWRlb0hlaWdodF8pLnZpZGVvV2lkdGgodGhpcy52aWRlb1dpZHRoXykudmFyaWF0aW9uKCJRb1MiKS5idWlsZCgpO3YucmVwb3J0KG4pLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wfX1jbGFzcyBTciBleHRlbmRzIGRle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcz1uZXcgQ3IoZVt0XSx0KTtzLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSkscy5vbigid2FybiIsbj0+e3RoaXMuZW1pdCgid2FybiIsbil9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChzKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHQgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXQuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUsdCl7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBzPWU7Zm9yKGxldCBuIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShuKSk7ZS5waXBlVG8odCkudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgdC5hYm9ydCgpLGF3YWl0IHMuY2FuY2VsKCksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9lbmRlZCJ9KX0pLmNhdGNoKGFzeW5jIG49PntlLmNhbmNlbCgpLnRoZW4oKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTaHV0dGluZyBkb3duIHN0cmVhbXMgYWZ0ZXIgYWJvcnQuIil9KS5jYXRjaChvPT57Y29uc29sZS5lcnJvcigiW1BpcGVsaW5lXSBFcnJvciBmcm9tIHN0cmVhbSB0cmFuc2Zvcm06IixvKX0pLGF3YWl0IHQuYWJvcnQobiksYXdhaXQgcy5jYW5jZWwobiksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9lbmRlZF93aXRoX2Vycm9yIn0pfSl9Y2F0Y2h7dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IifSksdGhpcy5kZXN0cm95KCk7cmV0dXJufXRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIix7bWVzc2FnZToicGlwZWxpbmVfc3RhcnRlZCJ9KSxjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBQaXBlbGluZSBzdGFydGVkLiIpfWFzeW5jIGRlc3Ryb3koKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBEZXN0cm95aW5nIFBpcGVsaW5lLiIpO2ZvcihsZXQgZSBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZS5zdG9wKCl9fWNsYXNzIHhyIGV4dGVuZHMgZGV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudXVpZF89V2UoKSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtjb25zdCBlPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO3YucmVwb3J0KGUpfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWUsdGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX10cmFuc2Zvcm0oZSx0KXtyZXR1cm4gdGhpcy5yZWFkYWJsZV89ZSx0aGlzLndyaXRhYmxlXz10LHRoaXMudHJhbnNmb3JtSW50ZXJuYWwoKX10cmFuc2Zvcm1JbnRlcm5hbCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShULmVycm9ycy50cmFuc2Zvcm1lcl9ub25lKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTt2LnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIE5lZWQgdG8gc2V0IHRyYW5zZm9ybWVycy4iKTtyZXR1cm59aWYoIXRoaXMucmVhZGFibGVfKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShULmVycm9ycy5yZWFkYWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTt2LnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFJlYWRhYmxlIGlzIG51bGwuIik7cmV0dXJufWlmKCF0aGlzLndyaXRhYmxlXyl7Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMud3JpdGFibGVfbnVsbCkudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7di5yZXBvcnQobiksdCgiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgcz0hMTt0aGlzLnBpcGVsaW5lXyYmKHM9ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBTcih0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsbj0+e3RoaXMuZW1pdCgiZXJyb3IiLG4pfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIsbj0+e3MmJihuLm1lc3NhZ2U9PT0icGlwZWxpbmVfc3RhcnRlZCI/bi5tZXNzYWdlPSJwaXBlbGluZV9yZXN0YXJ0ZWQiOm4ubWVzc2FnZT09PSJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiJiYobi5tZXNzYWdlPSJwaXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvciIpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsbil9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKG49Pnt0KG4pfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiB2LnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTt2LnJlcG9ydCh0KSxlKCl9KX19dmFyIGdlPShyPT4oci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIixyKSkoZ2V8fHt9KTtjbGFzcyBZZXtjb25zdHJ1Y3RvcihlKXt0eXBlb2YgZT09Im51bWJlciI/dGhpcy5ibHVyRmlsdGVyXz0iYmx1cigiK2UrInB4KSI6dGhpcy5ibHVyRmlsdGVyXz1lPT09Z2UuSGlnaD8iYmx1cigxMHB4KSI6ImJsdXIoNXB4KSJ9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57ZSgpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZmlsdGVyPXRoaXMuYmx1ckZpbHRlcl8sZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gocyl7Y29uc29sZS5sb2coIltCbHVyUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIscyl9fX1jbGFzcyBaZXtjb25zdHJ1Y3Rvcigpe31kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLmJnSW1hZ2VfJiZ0aGlzLmJnSW1hZ2VfLmNsb3NlKCksZSgpfSl9c2V0VmlydHVhbEJHSW1hZ2UoZSl7dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLHRoaXMuYmdJbWFnZV89ZX1hc3luYyBydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe2lmKHRoaXMuYmdJbWFnZV8pe2lmKHRoaXMuYmdJbWFnZV8ud2lkdGghPXQud2lkdGh8fHRoaXMuYmdJbWFnZV8uaGVpZ2h0IT10LmhlaWdodCl7Y29uc3Qgcz0iaGlnaCIsbj17cmVzaXplV2lkdGg6dC53aWR0aCxyZXNpemVIZWlnaHQ6dC5oZWlnaHQscmVzaXplUXVhbGl0eTpzfTt0cnl7dGhpcy5iZ0ltYWdlXz1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmJnSW1hZ2VfLG4pfWNhdGNoKG8pe3Rocm93IG99fWUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmRyYXdJbWFnZSh0aGlzLmJnSW1hZ2VfLDAsMCx0aGlzLmJnSW1hZ2VfLndpZHRoLHRoaXMuYmdJbWFnZV8uaGVpZ2h0KX19fWNsYXNzIE9ye2NvbnN0cnVjdG9yKGU9MS8wKXt0aGlzLmNhcGFjaXR5PWUsdGhpcy5zdG9yYWdlPVtdfWVucXVldWUoZSl7aWYodGhpcy5zaXplKCk9PT10aGlzLmNhcGFjaXR5KXRocm93IEVycm9yKCJRdWV1ZSBoYXMgcmVhY2hlZCBtYXggY2FwYWNpdHksIHlvdSBjYW5ub3QgYWRkIG1vcmUgaXRlbXMiKTt0aGlzLnN0b3JhZ2UucHVzaChlKX1kZXF1ZXVlKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5zaGlmdCgpfXNpemUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLmxlbmd0aH19Y29uc3QgeWU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnF1ZXVlXz1uZXcgT3J9Y2xlYXJRdWV1ZShyKXtmb3IoO3RoaXMucXVldWVfLnNpemUoKT4wOyl0aGlzLnF1ZXVlXy5kZXF1ZXVlKCkuY2xvc2UoKX1zZXRWaWRlb1JlYWRhYmxlKHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e3RoaXMuZnJhbWVSZWFkZXJfPXIuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4ocz0+e3RoaXMucHJvY2Vzc0ZyYW1lKHMpfSkuY2F0Y2gocz0+e3Qocyl9KSxlKCl9KX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHIsZSk9Pnt2YXIgdDt0aGlzLmNsZWFyUXVldWUoITApLHRoaXMuZnJhbWVSZWFkZXJfPyh0PXRoaXMuZnJhbWVSZWFkZXJfKT09bnVsbHx8dC5jYW5jZWwoKS50aGVuKCgpPT57cigpfSkuY2F0Y2gocz0+e2Uocyl9KTpyKCl9KX1wcm9jZXNzRnJhbWUocil7aWYoIXIuZG9uZSl7aWYoIXRoaXMuZnJhbWVSZWFkZXJfKXtyLnZhbHVlLmNsb3NlKCk7cmV0dXJufWZvcig7dGhpcy5xdWV1ZV8uc2l6ZSgpPj15ZS5OVU1CRVJfT0ZfRlJBTUVTX1RPX0NMRUFSOyl7bGV0IGU9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UmJmUuY2xvc2UoKX10aGlzLnF1ZXVlXy5lbnF1ZXVlKHIudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKGU9Pnt0aGlzLnByb2Nlc3NGcmFtZShlKX0pLmNhdGNoKGU9Pntjb25zb2xlLmVycm9yKGUpfSl9fXJ1blBvc3RQcm9jZXNzaW5nKHIsZSl7dHJ5e2lmKHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLnF1ZXVlXy5zaXplKCk+eWUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUiYmdGhpcy5jbGVhclF1ZXVlKCExKSx0aGlzLnF1ZXVlXy5zaXplKCk+MCl7Y29uc3QgdD10aGlzLnF1ZXVlXy5kZXF1ZXVlKCk7ci5kcmF3SW1hZ2UodCwwLDAsZS53aWR0aCxlLmhlaWdodCksdC5jbG9zZSgpfX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIix0KX19fTtsZXQgX2U9eWU7X2UuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUj01O2NsYXNzIElye2NvbnN0cnVjdG9yKGUpe3R5cGVvZiBlPT0ibnVtYmVyIj90aGlzLmJsdXJGaWx0ZXJfPSJibHVyKCIrZSsicHgpIjp0aGlzLmJsdXJGaWx0ZXJfPWU9PT1nZS5IaWdoPyJibHVyKDEwcHgpIjoiYmx1cig1cHgpIn1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntlKCl9KX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChzKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixzKX19fWNvbnN0IHZlPWNsYXNze2NvbnN0cnVjdG9yKCl7aWYodGhpcy5yZXN1bHRDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnJlc3VsdEN0eF89dGhpcy5yZXN1bHRDYW52YXNfLmdldENvbnRleHQoIjJkIix7ZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5yZXN1bHRDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXModmUuU0VMRklFX1dJRFRILHZlLlNFTEZJRV9ISUdIVCksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xz10aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLmdldENvbnRleHQoIjJkIix7ZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIil9aW5pdChyKXt0aGlzLnByb2Nlc3NGcmFtZUNiPXJ9YXN5bmMgc2V0QmFja2dyb3VuZE9wdGlvbnMocil7aWYodHlwZW9mIHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfIT0idW5kZWZpbmVkIil0cnl7YXdhaXQgdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uZGVzdHJveSgpfWNhdGNoKGUpe3Rocm93IGV9aWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlydHVhbEJhY2tncm91bmQiKXRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBaZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IkJhY2tncm91bmRCbHVyIil7bGV0IGU9cjt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpfWVsc2UgaWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIil0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgX2U7ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJTaWx1ZXRlQmx1ciIpe2xldCBlPXI7dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IElyKGUucmFkaXVzKX1lbHNlIHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBZZX1jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7dGhpcy5wcm9jZXNzU291cmNlKGUpLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0LDAsMCx0aGlzLnJlc3VsdENhbnZhc18ud2lkdGgsdGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCksdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8mJnRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnJ1blBvc3RQcm9jZXNzaW5nKHRoaXMucmVzdWx0Q3R4XyxlKSx0aGlzLnJlc3VsdEN0eF8ucmVzdG9yZSgpLHIuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZSh0aGlzLnJlc3VsdENhbnZhc18se3RpbWVzdGFtcDp0LGFscGhhOiJkaXNjYXJkIn0pKSxlLmNsb3NlKCl9cHJvY2Vzc1NvdXJjZShyKXtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodCksdGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5kcmF3SW1hZ2UociwwLDAsci53aWR0aCxyLmhlaWdodCwwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLmhlaWdodCksdGhpcy5wcm9jZXNzRnJhbWVDYil7bGV0IGU9dGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTt0aGlzLnByb2Nlc3NGcmFtZUNiKGUpfX1mbHVzaCgpe31nZXRUcmFuc2Zvcm1lclR5cGUoKXtyZXR1cm4iQmFja2dyb3VuZFRyYW5zZm9ybWVyIn1zZXRWaWRlb0JHUmVhZGFibGUocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBfZT90aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5zZXRWaWRlb1JlYWRhYmxlKHIpLnRoZW4oKCk9PntlKCl9KS5jYXRjaChzPT57dChzKX0pOnQoInBvc3QgcHJvY2VzcyBpcyBub3QgdmlkZW8iKX0pfXNldFZpcnR1YWxCR0ltYWdlKHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfIGluc3RhbmNlb2YgWmU/KHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpcnR1YWxCR0ltYWdlKHIpLGUoKSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0U2VnbWVudGF0aW9uTWFza0ltYWdlKHIpeyhyLmhlaWdodCE9dGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy5oZWlnaHR8fHIud2lkdGghPXRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18ud2lkdGgpJiYodGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy53aWR0aD1yLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18uaGVpZ2h0PXIuaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLmhlaWdodCksdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xy5kcmF3SW1hZ2UociwwLDApO2xldCBlPXRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0N0eF8uZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18uaGVpZ2h0KSx0PXRoaXMuc2VnbWVudGF0aW9uUmVzdWx0c0NhbnZhc18ud2lkdGgqdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy5oZWlnaHQ7Zm9yKGxldCBzPTA7czx0O3MrKyllLmRhdGFbcyo0XTwxMDAmJihlLmRhdGFbcyo0XT0wKTt0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ2FudmFzXy53aWR0aCx0aGlzLnNlZ21lbnRhdGlvblJlc3VsdHNDYW52YXNfLmhlaWdodCksdGhpcy5zZWdtZW50YXRpb25SZXN1bHRzQ3R4Xy5wdXRJbWFnZURhdGEoZSwwLDApLHIuY2xvc2UoKX19O2xldCBiZT12ZTtiZS5TRUxGSUVfV0lEVEg9MjU2LGJlLlNFTEZJRV9ISUdIVD0xNDQ7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIGtyKHIpe2lmKE1yKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIEEocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjprcihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgocyxuKT0+e2U9bmV3IHhyLGUub24oImVycm9yIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigid2FybiIsaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigicGlwZWxpbmVJbmZvIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfcGlwZWxpbmVfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksdD1uZXcgYmUsdC5pbml0KGk9Pntwb3N0TWVzc2FnZShpLFtpXSl9KTtsZXQgbz1bXTtvLnB1c2godCksZS5zZXRUcmFuc2Zvcm1lcnMobykudGhlbigoKT0+e3MoKX0pLmNhdGNoKGk9PntuKGkpfSl9KX0sZSx0O29ubWVzc2FnZT1hc3luYyBzPT57aWYocy5kYXRhIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe3QmJnQuc2V0U2VnbWVudGF0aW9uTWFza0ltYWdlKHMuZGF0YSk7cmV0dXJufWNvbnN0e29wZXJhdGlvbjpufT1zLmRhdGE7aWYobj09PSJpbml0Iil7Y29uc3R7bWV0YURhdGE6b309cy5kYXRhO3R5cGVvZiBvPT0ic3RyaW5nIiYmZHIoSlNPTi5wYXJzZShvKSkscigpLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpBKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0idHJhbnNmb3JtIil7Y29uc3R7cmVhZGFibGU6byx3cml0YWJsZTppfT1zLmRhdGE7ZS50cmFuc2Zvcm0obyxpKS50aGVuKCgpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pLmNhdGNoKGE9Pntjb25zdCBsPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6QShhKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobCkpfSl9ZWxzZSBpZihuPT09ImRlc3Ryb3kiKXQuY2xvc2UoKS5maW5hbGx5KCgpPT57ZS5kZXN0cm95KCkudGhlbigoKT0+e2NvbnN0IG89e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShvKSl9KS5jYXRjaChvPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOkEobyl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pfSk7ZWxzZSBpZihuPT09InNldFRyYWNrRXhwZWN0ZWRSYXRlIil7ZS5zZXRUcmFja0V4cGVjdGVkUmF0ZShzLmRhdGEucmF0ZSk7Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pKX1lbHNlIGlmKG49PT0ic2V0QmFja2dyb3VuZE9wdGlvbnMiKXtjb25zdHtiYWNrZ3JvdW5kT3B0aW9uczpvfT1zLmRhdGE7dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhKU09OLnBhcnNlKG8pKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6QShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9ZWxzZSBpZihuPT09InNldFZpZGVvQkdSZWFkYWJsZSIpe2NvbnN0e3JlYWRhYmxlOm99PXMuZGF0YTt0LnNldFZpZGVvQkdSZWFkYWJsZShvKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6QShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9ZWxzZSBpZihuPT09InNldFZpcnR1YWxCR0ltYWdlIil7Y29uc3R7aW1hZ2U6b309cy5kYXRhO3Quc2V0VmlydHVhbEJHSW1hZ2UobykudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOkEoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfX19fSkoKTsK";
24459
+ const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
24460
+ function WorkerWrapper() {
24461
+ const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
24462
+ try {
24463
+ return objURL ? new Worker(objURL, {}) : new Worker("data:application/javascript;base64," + encodedJs, { type: "module" });
24464
+ } finally {
24465
+ objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
24466
+ }
24467
+ }
24443
24468
  class VonageAssetsLoaderHelper {
24444
24469
  static createVideoReadable(videoUri) {
24445
24470
  return new Promise((resolve, reject) => {
@@ -24758,60 +24783,52 @@ class VonageMediaProcessorWorker extends emittery {
24758
24783
  });
24759
24784
  }
24760
24785
  }
24761
- var BlurRadius = /* @__PURE__ */ ((BlurRadius2) => {
24762
- BlurRadius2["Low"] = "Low";
24763
- BlurRadius2["High"] = "High";
24764
- return BlurRadius2;
24765
- })(BlurRadius || {});
24766
- const simd = async () => WebAssembly.validate(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 10, 10, 1, 8, 0, 65, 0, 253, 15, 253, 98, 11]));
24767
- function isSupported() {
24768
- return new Promise(async (resolve, reject) => {
24769
- try {
24770
- await isSupported$1();
24771
- } catch (e) {
24772
- reject(e);
24773
- return;
24774
- }
24775
- simd().then((isSIMDSupported) => {
24776
- if (isSIMDSupported === false) {
24777
- reject("Your browser does not support WebAssembly features.");
24778
- return;
24779
- }
24780
- resolve();
24781
- }).catch((e) => {
24782
- reject(e);
24783
- });
24784
- });
24786
+ class VonageMediaProcessor extends emittery {
24787
+ constructor() {
24788
+ super();
24789
+ this.worker = new VonageMediaProcessorWorker();
24790
+ this.connector = new MediaProcessorConnector(this.worker);
24791
+ }
24792
+ async init(config) {
24793
+ await this.worker.init(config);
24794
+ this.worker.onAny((name, data2) => this.emit(name, data2));
24795
+ }
24796
+ async setBackgroundOptions(options) {
24797
+ await this.worker.setBackgroundOptions(options);
24798
+ }
24799
+ setTrackExpectedRate(rate) {
24800
+ this.worker.setTrackExpectedRate(rate);
24801
+ }
24802
+ getConnector() {
24803
+ return this.connector;
24804
+ }
24805
+ static async create(config) {
24806
+ const result = new this();
24807
+ await result.init(config);
24808
+ return result;
24809
+ }
24810
+ }
24811
+ let vonageMediaProcessor;
24812
+ async function createVonageMediaProcessor(config) {
24813
+ return await VonageMediaProcessor.create(config);
24785
24814
  }
24786
- let vonageMediaProcessor_;
24787
- let trackExpectedRate_ = -1;
24788
24815
  function getVonageEventEmitter() {
24789
- return vonageMediaProcessor_;
24816
+ return vonageMediaProcessor;
24790
24817
  }
24791
- function setTrackExpectedRate(trackExpectedRate) {
24792
- trackExpectedRate_ = trackExpectedRate;
24793
- if (typeof vonageMediaProcessor_ != "undefined") {
24794
- vonageMediaProcessor_.setTrackExpectedRate(trackExpectedRate_);
24795
- }
24818
+ function setTrackExpectedRate(trackExpectedRate2) {
24819
+ trackExpectedRate2 = trackExpectedRate2;
24820
+ vonageMediaProcessor.setTrackExpectedRate(trackExpectedRate2);
24796
24821
  }
24797
24822
  function createVonageMediaProcessorConnector(config) {
24798
24823
  return new Promise(async (resolve, reject) => {
24799
- vonageMediaProcessor_ = new VonageMediaProcessorWorker();
24800
- if (trackExpectedRate_ != -1) {
24801
- vonageMediaProcessor_.setTrackExpectedRate(trackExpectedRate_);
24802
- }
24803
- vonageMediaProcessor_.init(config).then(() => {
24804
- const connector = new MediaProcessorConnector(vonageMediaProcessor_);
24805
- resolve(connector);
24806
- }).catch((e) => {
24807
- reject(e);
24808
- });
24824
+ vonageMediaProcessor = await VonageMediaProcessor.create(config);
24825
+ resolve(vonageMediaProcessor.getConnector());
24809
24826
  });
24810
24827
  }
24811
24828
  function setBackgroundOptions(backgroundOptions) {
24812
24829
  return new Promise((resolve, reject) => {
24813
- if (vonageMediaProcessor_) {
24814
- vonageMediaProcessor_.setBackgroundOptions(backgroundOptions).then(() => {
24830
+ if (vonageMediaProcessor) {
24831
+ vonageMediaProcessor.setBackgroundOptions(backgroundOptions).then(() => {
24815
24832
  resolve();
24816
24833
  }).catch((e) => {
24817
24834
  reject(e);
@@ -24821,4 +24838,4 @@ function setBackgroundOptions(backgroundOptions) {
24821
24838
  }
24822
24839
  });
24823
24840
  }
24824
- export { BlurRadius, MediapipeHelper, VonageFacedetection, VonageFacemash, VonageHands, VonageHolistic, VonageObjectron, VonagePose, VonageSelfiesegmentation, createVonageMediaProcessorConnector, getVonageEventEmitter, isSupported, setBackgroundOptions, setTrackExpectedRate };
24841
+ export { BlurRadius, MediapipeHelper, VonageFacedetection, VonageFacemash, VonageHands, VonageHolistic, VonageMediaProcessor, VonageObjectron, VonagePose, VonageSelfiesegmentation, createVonageMediaProcessor, createVonageMediaProcessorConnector, getVonageEventEmitter, isSupported, setBackgroundOptions, setTrackExpectedRate };