UNPKG

object-difference-js

Version:

get deep difference between two JavaScript objects

2 lines 44 kB
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("ObjDiff",[],e):"object"==typeof exports?exports.ObjDiff=e():t.ObjDiff=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n={ObjectDifference:r(1).GetObjectDifference};e.default=n,t.exports=e.default},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GetObjectDifference=function(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return h("",t,e,r,n)};var n,o=(n=r(2))&&n.__esModule?n:{default:n};function f(t){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u="created",i="updated",c="deleted",a="NA";function p(t){return""===t||0===t||null==t||t==={}||Array.isArray(t)&&t.length<1}function y(t){return!p(t)&&("boolean"==typeof t||"number"==typeof t||"string"==typeof t)}function l(t){return!p(t)&&t instanceof Date}function d(t){return!p(t)&&Array.isArray(t)}function s(t){return"function"==typeof t}function m(t){return"symbol"===f(t)}function b(t){return!(y(t)||p(t)||l(t)||d(t)||s(t)||m(t))}function g(t,e){return t?"".concat(t,".").concat(e):e}function v(t,e,r,n){var o=[];if(r.length===n.length){for(var f=0;f<r.length;f++)if(JSON.stringify(r[f])!==JSON.stringify(n[f]))for(var u=0;u<r.length;u++)o=o.concat(h(g(t,e),"[".concat(u,"]"),r[u],n[u]));return o}if(r.length>30||n.length>30)return o.push({property:g(t,e),type:i,from:"Array[".concat(r.length,"]"),to:"Array[".concat(n.length,"]")}),o;function c(t){return function(e){return 0===t.filter(function(t){return JSON.stringify(t)===JSON.stringify(e)}).length}}for(var a=r.filter(c(n)),p=n.filter(c(r)),y=0;y<a.length;y++)o=o.concat(h(g(t,e),"[".concat(y,"]"),a[y],void 0));for(var l=0;l<p.length;l++)o=o.concat(h(g(t,e),"[".concat(l,"]"),void 0,p[l]));return o}function h(t,e,r,n){var f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},O=[];if("__ob__"===e||"__proto__"===e)return O;if(y(r)&&y(n))return r==n?O:(O.push({property:g(t,e),type:i,from:r,to:n}),O);if(s(r)||s(n))return O.push({property:g(t,e),type:a,from:(0,o.default)(r),to:(0,o.default)(n)}),O;if(m(r)||m(n))return O.push({property:g(t,e),type:i,from:(0,o.default)(r),to:(0,o.default)(n)}),O;if(l(r)&&l(n))return r.getTime()===n.getTime()?O:(O.push({property:g(t,e),type:i,from:(0,o.default)(r),to:(0,o.default)(n)}),O);if(l(n)&&y(r))return new Date(r).getTime()===n.getTime()?O:(O.push({property:g(t,e),type:i,from:(0,o.default)(r),to:(0,o.default)(n)}),O);if(l(r)&&y(n))return new Date(n).getTime()===r.getTime()?O:(O.push({property:g(t,e),type:i,from:(0,o.default)(r),to:(0,o.default)(n)}),O);if(p(r)&&p(n))return O;if(p(r)&&y(n))return n?(O.push({property:g(t,e),type:u,from:"",to:(0,o.default)(n)}),O):O;if(p(r)&&l(n))return O.push({property:g(t,e),type:u,from:"",to:(0,o.default)(n)}),O;if(p(r)&&d(n)){for(var j=0;j<n.length;j++)O=O.concat(h(g(t,e),"[".concat(j,"]"),void 0,n[j]));return O}if(p(r)&&b(n))return Object.getOwnPropertyNames(n).forEach(function(r,o,f){O=O.concat(h(g(t,e),r,void 0,n[r]))}),O;if((y(r)||l(r)||d(r)||b(r))&&p(n))return r?(O.push({property:g(t,e),type:c,from:"",to:""}),O):O;if((y(r)||l(r))&&d(n)){O.push({property:g(t,e),type:c,from:"",to:""});for(var S=0;S<n.length;S++)O=O.concat(h(g(t,e),"[".concat(S,"]"),void 0,n[S]));return O}if((y(r)||l(r))&&b(n))return O.push({property:g(t,e),type:c,from:"",to:""}),Object.getOwnPropertyNames(n).forEach(function(r,o,f){O=O.concat(h(g(t,e),r,void 0,n[r]))}),O;if(d(r)&&(y(n)||l(n)))return O.push({property:g(t,e),type:i,from:"Array[".concat(r.length,"]"),to:(0,o.default)(n)}),O;if(d(r)&&d(n)){if(f.ArrayKeyProperty){for(var _=!1,P=0;P<r.length;P++)void 0===r[P][f.ArrayKeyProperty]&&(_=!0);for(var A=0;A<n.length;A++)void 0===n[A][f.ArrayKeyProperty]&&(_=!0);O=_?O.concat(v(t,e,r,n)):O.concat(function(t,e,r,n,o){var f=[];function u(t){return function(e){return 0===t.filter(function(t){return t[o]===e[o]}).length}}for(var i=r.filter(u(n)),c=n.filter(u(r)),a=0;a<i.length;a++)f=f.concat(h(g(t,e),"[".concat(o,"=").concat(i[a][o],"]"),i[a],void 0));for(var p=0;p<c.length;p++)f=f.concat(h(g(t,e),"[".concat(o,"=").concat(c[p][o],"]"),void 0,c[p]));for(var y=function(u){var i=n.find(function(t){return t[o]===r[u][o]});i&&(f=f.concat(h(g(t,e),"[".concat(o,"=").concat(r[u][o],"]"),r[u],i)))},l=0;l<r.length;l++)y(l);return f}(t,e,r,n,f.ArrayKeyProperty))}else O=O.concat(v(t,e,r,n));return O}if(d(r)&&b(n))return O.push({property:g(t,e),type:c,from:"Array[".concat(r.length,"]"),to:""}),Object.getOwnPropertyNames(n).forEach(function(r,o,f){O=O.concat(h(g(t,e),r,void 0,n[r]))}),O;if(b(r)&&(y(n)||l(n)))return O.push({property:g(t,e),type:i,from:"{}",to:(0,o.default)(n)}),O;if(b(r)&&d(n)){O.push({property:g(t,e),type:c,from:"{}",to:(0,o.default)(n)});for(var x=0;x<n.length;x++)O=O.concat(h(g(t,e),"[".concat(x,"]"),void 0,n[x]));return O}return b(r)&&b(n)&&(Object.getOwnPropertyNames(r).forEach(function(o,f,u){O=O.concat(h(g(t,e),o,r[o],n[o]))}),Object.getOwnPropertyNames(n).forEach(function(o,f,u){void 0===r[o]&&(O=O.concat(h(g(t,e),o,void 0,n[o])))})),O}},function(t,e,r){"use strict";function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function t(e){if("boolean"==typeof e||"number"==typeof e||"string"==typeof e)return e.toString();if(null===e)return"null";if(void 0===e)return"undefined";if("symbol"===n(e))return"symbol";if(e instanceof Date)return e.toUTCString();if(Array.isArray(e))return e.map(function(e){return t(e)}).join(", ");if("function"==typeof e)return"function";return JSON.stringify(e)},t.exports=e.default}])}); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9PYmpEaWZmL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9PYmpEaWZmL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL09iakRpZmYvLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vT2JqRGlmZi8uL3NyYy9vYmplY3REaWZmZXJlbmNlLmpzIiwid2VicGFjazovL09iakRpZmYvLi9zcmMvYW55VG9TdHJpbmcuanMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsInRoaXMiLCJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiT2JqZWN0RGlmZmVyZW5jZSIsIkdldE9iamVjdERpZmZlcmVuY2UiLCJvYmplY3ROYW1lIiwidmFsdWVGcm9tIiwidmFsdWVUbyIsImNvbmZpZyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIl9HZXRPYmplY3REaWZmZXJlbmNlIiwiX2FueVRvU3RyaW5nIiwiVkFMVUVfQ1JFQVRFRCIsIlZBTFVFX1VQREFURUQiLCJWQUxVRV9ERUxFVEVEIiwiTk9UX0NPTVBBUkFCTEUiLCJfaXNCbGFuayIsIkFycmF5IiwiaXNBcnJheSIsIl9pc1ZhbHVlIiwiX2lzRGF0ZSIsIkRhdGUiLCJfaXNBcnJheSIsIl9pc0Z1bmN0aW9uIiwiX2lzU3ltYm9sIiwiX3R5cGVvZiIsIl9pc09iamVjdCIsIl9nZXRGdWxsUHJvcE5hbWUiLCJwYXJlbnROYW1lIiwicHJvcGVydHlOYW1lIiwiY29uY2F0IiwiX2dldEFycmF5RGlmZmVuY2UiLCJhMSIsImEyIiwiZGlmZiIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwidHlwZSIsImZyb20iLCJ0byIsImNvbXBhcmVyIiwib3RoZXJBcnJheSIsImN1cnJlbnQiLCJmaWx0ZXIiLCJvdGhlciIsIm9ubHlJbkExIiwib25seUluQTIiLCJkZWZhdWx0IiwiZ2V0VGltZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwidmFsIiwiaWR4IiwiYXJyYXkiLCJBcnJheUtleVByb3BlcnR5IiwibWlzc0tleVByb3AiLCJrZXlQcm9wIiwiX2xvb3AiLCJhMkl0ZW0iLCJmaW5kIiwieCIsIl9nZXRBcnJheURpZmZlbmNlQnlLZXkiLCJhbnlUb1N0cmluZyIsInRvU3RyaW5nIiwidG9VVENTdHJpbmciLCJtYXAiLCJqb2luIl0sIm1hcHBpbmdzIjoiQ0FBQSxTQUFBQSxFQUFBQyxHQUNBLGlCQUFBQyxTQUFBLGlCQUFBQyxPQUNBQSxPQUFBRCxRQUFBRCxJQUNBLG1CQUFBRyxlQUFBQyxJQUNBRCxPQUFBLGFBQUFILEdBQ0EsaUJBQUFDLFFBQ0FBLFFBQUEsUUFBQUQsSUFFQUQsRUFBQSxRQUFBQyxJQVJBLENBU0Msb0JBQUFLLFVBQUFDLEtBQUEsV0FDRCxtQkNUQSxJQUFBQyxFQUFBLEdBR0EsU0FBQUMsRUFBQUMsR0FHQSxHQUFBRixFQUFBRSxHQUNBLE9BQUFGLEVBQUFFLEdBQUFSLFFBR0EsSUFBQUMsRUFBQUssRUFBQUUsR0FBQSxDQUNBQyxFQUFBRCxFQUNBRSxHQUFBLEVBQ0FWLFFBQUEsSUFVQSxPQU5BVyxFQUFBSCxHQUFBSSxLQUFBWCxFQUFBRCxRQUFBQyxJQUFBRCxRQUFBTyxHQUdBTixFQUFBUyxHQUFBLEVBR0FULEVBQUFELFFBMERBLE9BckRBTyxFQUFBTSxFQUFBRixFQUdBSixFQUFBTyxFQUFBUixFQUdBQyxFQUFBUSxFQUFBLFNBQUFmLEVBQUFnQixFQUFBQyxHQUNBVixFQUFBVyxFQUFBbEIsRUFBQWdCLElBQ0FHLE9BQUFDLGVBQUFwQixFQUFBZ0IsRUFBQSxDQUEwQ0ssWUFBQSxFQUFBQyxJQUFBTCxLQUsxQ1YsRUFBQWdCLEVBQUEsU0FBQXZCLEdBQ0Esb0JBQUF3QixlQUFBQyxhQUNBTixPQUFBQyxlQUFBcEIsRUFBQXdCLE9BQUFDLFlBQUEsQ0FBd0RDLE1BQUEsV0FFeERQLE9BQUFDLGVBQUFwQixFQUFBLGNBQWlEMEIsT0FBQSxLQVFqRG5CLEVBQUFvQixFQUFBLFNBQUFELEVBQUFFLEdBRUEsR0FEQSxFQUFBQSxJQUFBRixFQUFBbkIsRUFBQW1CLElBQ0EsRUFBQUUsRUFBQSxPQUFBRixFQUNBLEtBQUFFLEdBQUEsaUJBQUFGLFFBQUFHLFdBQUEsT0FBQUgsRUFDQSxJQUFBSSxFQUFBWCxPQUFBWSxPQUFBLE1BR0EsR0FGQXhCLEVBQUFnQixFQUFBTyxHQUNBWCxPQUFBQyxlQUFBVSxFQUFBLFdBQXlDVCxZQUFBLEVBQUFLLFVBQ3pDLEVBQUFFLEdBQUEsaUJBQUFGLEVBQUEsUUFBQU0sS0FBQU4sRUFBQW5CLEVBQUFRLEVBQUFlLEVBQUFFLEVBQUEsU0FBQUEsR0FBZ0gsT0FBQU4sRUFBQU0sSUFBcUJDLEtBQUEsS0FBQUQsSUFDckksT0FBQUYsR0FJQXZCLEVBQUEyQixFQUFBLFNBQUFqQyxHQUNBLElBQUFnQixFQUFBaEIsS0FBQTRCLFdBQ0EsV0FBMkIsT0FBQTVCLEVBQUEsU0FDM0IsV0FBaUMsT0FBQUEsR0FFakMsT0FEQU0sRUFBQVEsRUFBQUUsRUFBQSxJQUFBQSxHQUNBQSxHQUlBVixFQUFBVyxFQUFBLFNBQUFpQixFQUFBQyxHQUFzRCxPQUFBakIsT0FBQWtCLFVBQUFDLGVBQUExQixLQUFBdUIsRUFBQUMsSUFHdEQ3QixFQUFBZ0MsRUFBQSxHQUlBaEMsSUFBQWlDLEVBQUEsb0dDbEZBLE1BQ2UsQ0FBRUMsaUJBRGpCbEMsRUFBQSxHQUNpQ21DLDBKQ3VZMUIsU0FBNkJDLEVBQVlDLEVBQVdDLEdBQXNCLElBQWJDLEVBQWFDLFVBQUFDLE9BQUEsUUFBQUMsSUFBQUYsVUFBQSxHQUFBQSxVQUFBLEdBQUosR0FDM0UsT0FBT0csRUFBcUIsR0FBSVAsRUFBWUMsRUFBV0MsRUFBU0MsSUF6WWxFLE1BQUFLLEtBQUE1QyxFQUFBLHFRQUVBLElBQU02QyxFQUFnQixVQUNwQkMsRUFBZ0IsVUFDaEJDLEVBQWdCLFVBQ2hCQyxFQUFpQixLQUVuQixTQUFTQyxFQUFTN0IsR0FDaEIsTUFBYSxLQUFOQSxHQUFrQixJQUFOQSxHQUFaQSxNQUF1QkEsR0FBaUNBLElBQU0sSUFBTzhCLE1BQU1DLFFBQVEvQixJQUFNQSxFQUFFcUIsT0FBUyxFQUU3RyxTQUFTVyxFQUFTaEMsR0FDaEIsT0FBUTZCLEVBQVM3QixLQUFvQixrQkFBTkEsR0FBZ0MsaUJBQU5BLEdBQStCLGlCQUFOQSxHQUVwRixTQUFTaUMsRUFBUWpDLEdBQ2YsT0FBUTZCLEVBQVM3QixJQUFNQSxhQUFha0MsS0FFdEMsU0FBU0MsRUFBU25DLEdBQ2hCLE9BQVE2QixFQUFTN0IsSUFBTThCLE1BQU1DLFFBQVEvQixHQUV2QyxTQUFTb0MsRUFBWXBDLEdBQ25CLE1BQW9CLG1CQUFOQSxFQUVoQixTQUFTcUMsRUFBVXJDLEdBQ2pCLE1BQW9CLFdBQWJzQyxFQUFPdEMsR0FFaEIsU0FBU3VDLEVBQVV2QyxHQUNqQixRQUFRZ0MsRUFBU2hDLElBQU82QixFQUFTN0IsSUFBT2lDLEVBQVFqQyxJQUFPbUMsRUFBU25DLElBQU9vQyxFQUFZcEMsSUFBT3FDLEVBQVVyQyxJQUd0RyxTQUFTd0MsRUFBaUJDLEVBQVlDLEdBQ3BDLE9BQU9ELEVBQVUsR0FBQUUsT0FBTUYsRUFBTixLQUFBRSxPQUFvQkQsR0FBaUJBLEVBR3hELFNBQVNFLEVBQWtCSCxFQUFZQyxFQUFjRyxFQUFJQyxHQUN2RCxJQUFJQyxFQUFPLEdBRVgsR0FBSUYsRUFBR3hCLFNBQVd5QixFQUFHekIsT0FBUSxDQUMzQixJQUFLLElBQUl2QyxFQUFJLEVBQUdBLEVBQUkrRCxFQUFHeEIsT0FBUXZDLElBQzdCLEdBQUlrRSxLQUFLQyxVQUFVSixFQUFHL0QsTUFBUWtFLEtBQUtDLFVBQVVILEVBQUdoRSxJQUc5QyxJQUFLLElBQUlBLEVBQUksRUFBR0EsRUFBSStELEVBQUd4QixPQUFRdkMsSUFDN0JpRSxFQUFPQSxFQUFLSixPQUFPcEIsRUFBcUJpQixFQUFpQkMsRUFBWUMsR0FBOUIsSUFBQUMsT0FBaUQ3RCxFQUFqRCxLQUF1RCtELEVBQUcvRCxHQUFJZ0UsRUFBR2hFLEtBSTlHLE9BQU9pRSxFQUdULEdBQUlGLEVBQUd4QixPQUFTLElBQU15QixFQUFHekIsT0FBUyxHQU9oQyxPQU5BMEIsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXpCLEVBQ04wQixLQUFJLFNBQUFULE9BQVdFLEVBQUd4QixPQUFkLEtBQ0pnQyxHQUFFLFNBQUFWLE9BQVdHLEVBQUd6QixPQUFkLE9BRUcwQixFQUdULFNBQVNPLEVBQVNDLEdBQ2hCLE9BQU8sU0FBVUMsR0FDZixPQUdnQixJQUZkRCxFQUFXRSxPQUFPLFNBQVVDLEdBQzFCLE9BQU9WLEtBQUtDLFVBQVVTLEtBQVdWLEtBQUtDLFVBQVVPLEtBQy9DbkMsUUFTVCxJQUpBLElBQUlzQyxFQUFXZCxFQUFHWSxPQUFPSCxFQUFTUixJQUU5QmMsRUFBV2QsRUFBR1csT0FBT0gsRUFBU1QsSUFFekIvRCxFQUFJLEVBQUdBLEVBQUk2RSxFQUFTdEMsT0FBUXZDLElBQ25DaUUsRUFBT0EsRUFBS0osT0FBT3BCLEVBQXFCaUIsRUFBaUJDLEVBQVlDLEdBQTlCLElBQUFDLE9BQWlEN0QsRUFBakQsS0FBdUQ2RSxFQUFTN0UsUUFBSXdDLElBRzdHLElBQUssSUFBSXhDLEVBQUksRUFBR0EsRUFBSThFLEVBQVN2QyxPQUFRdkMsSUFDbkNpRSxFQUFPQSxFQUFLSixPQUFPcEIsRUFBcUJpQixFQUFpQkMsRUFBWUMsR0FBOUIsSUFBQUMsT0FBaUQ3RCxFQUFqRCxVQUF1RHdDLEVBQVdzQyxFQUFTOUUsS0FHcEgsT0FBT2lFLEVBd0NULFNBQVN4QixFQUFxQmtCLEVBQVlDLEVBQWN6QixFQUFXQyxHQUFzQixJQUFiQyxFQUFhQyxVQUFBQyxPQUFBLFFBQUFDLElBQUFGLFVBQUEsR0FBQUEsVUFBQSxHQUFKLEdBQy9FMkIsRUFBTyxHQUVYLEdBQXFCLFdBQWpCTCxHQUE4QyxjQUFqQkEsRUFDL0IsT0FBT0ssRUFHVCxHQUFJZixFQUFTZixJQUFjZSxFQUFTZCxHQUNsQyxPQUFJRCxHQUFhQyxFQUNSNkIsR0FFVEEsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXpCLEVBQ04wQixLQUFNbkMsRUFDTm9DLEdBQUluQyxJQUVDNkIsR0FJVCxHQUFJWCxFQUFZbkIsSUFBY21CLEVBQVlsQixHQU94QyxPQU5BNkIsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXZCLEVBQ053QixNQUFNLEVBQUE1QixFQUFBcUMsU0FBWTVDLEdBQ2xCb0MsSUFBSSxFQUFBN0IsRUFBQXFDLFNBQVkzQyxLQUVYNkIsRUFJVCxHQUFJVixFQUFVcEIsSUFBY29CLEVBQVVuQixHQU9wQyxPQU5BNkIsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXpCLEVBQ04wQixNQUFNLEVBQUE1QixFQUFBcUMsU0FBWTVDLEdBQ2xCb0MsSUFBSSxFQUFBN0IsRUFBQXFDLFNBQVkzQyxLQUVYNkIsRUFJVCxHQUFJZCxFQUFRaEIsSUFBY2dCLEVBQVFmLEdBQ2hDLE9BQUlELEVBQVU2QyxZQUFjNUMsRUFBUTRDLFVBQzNCZixHQUVUQSxFQUFLRyxLQUFLLENBQ1J6QyxTQUFVK0IsRUFBaUJDLEVBQVlDLEdBQ3ZDUyxLQUFNekIsRUFDTjBCLE1BQU0sRUFBQTVCLEVBQUFxQyxTQUFZNUMsR0FDbEJvQyxJQUFJLEVBQUE3QixFQUFBcUMsU0FBWTNDLEtBRVg2QixHQUlULEdBQUlkLEVBQVFmLElBQVljLEVBQVNmLEdBQy9CLE9BQUksSUFBSWlCLEtBQUtqQixHQUFXNkMsWUFBYzVDLEVBQVE0QyxVQUNyQ2YsR0FFVEEsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXpCLEVBQ04wQixNQUFNLEVBQUE1QixFQUFBcUMsU0FBWTVDLEdBQ2xCb0MsSUFBSSxFQUFBN0IsRUFBQXFDLFNBQVkzQyxLQUVYNkIsR0FFVCxHQUFJZCxFQUFRaEIsSUFBY2UsRUFBU2QsR0FDakMsT0FBSSxJQUFJZ0IsS0FBS2hCLEdBQVM0QyxZQUFjN0MsRUFBVTZDLFVBQ3JDZixHQUVUQSxFQUFLRyxLQUFLLENBQ1J6QyxTQUFVK0IsRUFBaUJDLEVBQVlDLEdBQ3ZDUyxLQUFNekIsRUFDTjBCLE1BQU0sRUFBQTVCLEVBQUFxQyxTQUFZNUMsR0FDbEJvQyxJQUFJLEVBQUE3QixFQUFBcUMsU0FBWTNDLEtBRVg2QixHQUlULEdBQUlsQixFQUFTWixJQUFjWSxFQUFTWCxHQUNsQyxPQUFPNkIsRUFHVCxHQUFJbEIsRUFBU1osSUFBY2UsRUFBU2QsR0FDbEMsT0FBSUEsR0FHSjZCLEVBQUtHLEtBQUssQ0FDUnpDLFNBQVUrQixFQUFpQkMsRUFBWUMsR0FDdkNTLEtBQU0xQixFQUNOMkIsS0FBTSxHQUNOQyxJQUFJLEVBQUE3QixFQUFBcUMsU0FBWTNDLEtBRVg2QixHQVJFQSxFQVVYLEdBQUlsQixFQUFTWixJQUFjZ0IsRUFBUWYsR0FPakMsT0FOQTZCLEVBQUtHLEtBQUssQ0FDUnpDLFNBQVUrQixFQUFpQkMsRUFBWUMsR0FDdkNTLEtBQU0xQixFQUNOMkIsS0FBTSxHQUNOQyxJQUFJLEVBQUE3QixFQUFBcUMsU0FBWTNDLEtBRVg2QixFQUVULEdBQUlsQixFQUFTWixJQUFja0IsRUFBU2pCLEdBQVUsQ0FDNUMsSUFBSyxJQUFJcEMsRUFBSSxFQUFHQSxFQUFJb0MsRUFBUUcsT0FBUXZDLElBQ2xDaUUsRUFBT0EsRUFBS0osT0FBT3BCLEVBQXFCaUIsRUFBaUJDLEVBQVlDLEdBQTlCLElBQUFDLE9BQWlEN0QsRUFBakQsVUFBdUR3QyxFQUFXSixFQUFRcEMsS0FFbkgsT0FBT2lFLEVBRVQsR0FBSWxCLEVBQVNaLElBQWNzQixFQUFVckIsR0FJbkMsT0FIQTFCLE9BQU91RSxvQkFBb0I3QyxHQUFTOEMsUUFBUSxTQUFVQyxFQUFLQyxFQUFLQyxHQUM5RHBCLEVBQU9BLEVBQUtKLE9BQU9wQixFQUFxQmlCLEVBQWlCQyxFQUFZQyxHQUFldUIsT0FBSzNDLEVBQVdKLEVBQVErQyxPQUV2R2xCLEVBR1QsSUFBS2YsRUFBU2YsSUFBY2dCLEVBQVFoQixJQUFja0IsRUFBU2xCLElBQWNzQixFQUFVdEIsS0FBZVksRUFBU1gsR0FDekcsT0FBS0QsR0FHTDhCLEVBQUtHLEtBQUssQ0FDUnpDLFNBQVUrQixFQUFpQkMsRUFBWUMsR0FDdkNTLEtBQU14QixFQUNOeUIsS0FBTSxHQUNOQyxHQUFJLEtBRUNOLEdBUkVBLEVBWVgsSUFBS2YsRUFBU2YsSUFBY2dCLEVBQVFoQixLQUFla0IsRUFBU2pCLEdBQVUsQ0FDcEU2QixFQUFLRyxLQUFLLENBQ1J6QyxTQUFVK0IsRUFBaUJDLEVBQVlDLEdBQ3ZDUyxLQUFNeEIsRUFDTnlCLEtBQU0sR0FDTkMsR0FBSSxLQUdOLElBQUssSUFBSXZFLEVBQUksRUFBR0EsRUFBSW9DLEVBQVFHLE9BQVF2QyxJQUNsQ2lFLEVBQU9BLEVBQUtKLE9BQU9wQixFQUFxQmlCLEVBQWlCQyxFQUFZQyxHQUE5QixJQUFBQyxPQUFpRDdELEVBQWpELFVBQXVEd0MsRUFBV0osRUFBUXBDLEtBR25ILE9BQU9pRSxFQUlULElBQUtmLEVBQVNmLElBQWNnQixFQUFRaEIsS0FBZXNCLEVBQVVyQixHQVkzRCxPQVhBNkIsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXhCLEVBQ055QixLQUFNLEdBQ05DLEdBQUksS0FHTjdELE9BQU91RSxvQkFBb0I3QyxHQUFTOEMsUUFBUSxTQUFVQyxFQUFLQyxFQUFLQyxHQUM5RHBCLEVBQU9BLEVBQUtKLE9BQU9wQixFQUFxQmlCLEVBQWlCQyxFQUFZQyxHQUFldUIsT0FBSzNDLEVBQVdKLEVBQVErQyxPQUd2R2xCLEVBSVQsR0FBSVosRUFBU2xCLEtBQWVlLEVBQVNkLElBQVllLEVBQVFmLElBT3ZELE9BTkE2QixFQUFLRyxLQUFLLENBQ1J6QyxTQUFVK0IsRUFBaUJDLEVBQVlDLEdBQ3ZDUyxLQUFNekIsRUFDTjBCLEtBQUksU0FBQVQsT0FBVzFCLEVBQVVJLE9BQXJCLEtBQ0pnQyxJQUFJLEVBQUE3QixFQUFBcUMsU0FBWTNDLEtBRVg2QixFQUlULEdBQUlaLEVBQVNsQixJQUFja0IsRUFBU2pCLEdBQVUsQ0FDNUMsR0FBSUMsRUFBT2lELGlCQUFrQixDQUkzQixJQUZBLElBQUlDLEdBQWMsRUFFVHZGLEVBQUksRUFBR0EsRUFBSW1DLEVBQVVJLE9BQVF2QyxTQUNVd0MsSUFBMUNMLEVBQVVuQyxHQUFHcUMsRUFBT2lELG9CQUN0QkMsR0FBYyxHQUdsQixJQUFLLElBQUl2RixFQUFJLEVBQUdBLEVBQUlvQyxFQUFRRyxPQUFRdkMsU0FDVXdDLElBQXhDSixFQUFRcEMsR0FBR3FDLEVBQU9pRCxvQkFDcEJDLEdBQWMsR0FPaEJ0QixFQUhHc0IsRUFHSXRCLEVBQUtKLE9BQU9DLEVBQWtCSCxFQUFZQyxFQUFjekIsRUFBV0MsSUFGbkU2QixFQUFLSixPQXpPcEIsU0FBZ0NGLEVBQVlDLEVBQWNHLEVBQUlDLEVBQUl3QixHQUNoRSxJQUFJdkIsRUFBTyxHQUVYLFNBQVNPLEVBQVNDLEdBQ2hCLE9BQU8sU0FBVUMsR0FDZixPQUdnQixJQUZkRCxFQUFXRSxPQUFPLFNBQVVDLEdBQzFCLE9BQU9BLEVBQU1ZLEtBQWFkLEVBQVFjLEtBQ2pDakQsUUFTVCxJQUpBLElBQUlzQyxFQUFXZCxFQUFHWSxPQUFPSCxFQUFTUixJQUU5QmMsRUFBV2QsRUFBR1csT0FBT0gsRUFBU1QsSUFFekIvRCxFQUFJLEVBQUdBLEVBQUk2RSxFQUFTdEMsT0FBUXZDLElBQ25DaUUsRUFBT0EsRUFBS0osT0FBT3BCLEVBQXFCaUIsRUFBaUJDLEVBQVlDLEdBQTlCLElBQUFDLE9BQWlEMkIsRUFBakQsS0FBQTNCLE9BQTREZ0IsRUFBUzdFLEdBQUd3RixHQUF4RSxLQUFxRlgsRUFBUzdFLFFBQUl3QyxJQUczSSxJQUFLLElBQUl4QyxFQUFJLEVBQUdBLEVBQUk4RSxFQUFTdkMsT0FBUXZDLElBQ25DaUUsRUFBT0EsRUFBS0osT0FBT3BCLEVBQXFCaUIsRUFBaUJDLEVBQVlDLEdBQTlCLElBQUFDLE9BQWlEMkIsRUFBakQsS0FBQTNCLE9BQTREaUIsRUFBUzlFLEdBQUd3RixHQUF4RSxVQUFxRmhELEVBQVdzQyxFQUFTOUUsS0FHbEosSUF6QnlFLElBQUF5RixFQUFBLFNBeUJoRXpGLEdBQ1AsSUFBSTBGLEVBQVMxQixFQUFHMkIsS0FBSyxTQUFBQyxHQUNuQixPQUFPQSxFQUFFSixLQUFhekIsRUFBRy9ELEdBQUd3RixLQUcxQkUsSUFDRnpCLEVBQU9BLEVBQUtKLE9BQU9wQixFQUFxQmlCLEVBQWlCQyxFQUFZQyxHQUE5QixJQUFBQyxPQUFpRDJCLEVBQWpELEtBQUEzQixPQUE0REUsRUFBRy9ELEdBQUd3RixHQUFsRSxLQUErRXpCLEVBQUcvRCxHQUFJMEYsTUFOeEgxRixFQUFJLEVBQUdBLEVBQUkrRCxFQUFHeEIsT0FBUXZDLElBQUt5RixFQUEzQnpGLEdBVVQsT0FBT2lFLEVBc01rQjRCLENBQXVCbEMsRUFBWUMsRUFBY3pCLEVBQVdDLEVBQVNDLEVBQU9pRCx3QkFLakdyQixFQUFPQSxFQUFLSixPQUFPQyxFQUFrQkgsRUFBWUMsRUFBY3pCLEVBQVdDLElBRTVFLE9BQU82QixFQUlULEdBQUlaLEVBQVNsQixJQUFjc0IsRUFBVXJCLEdBWW5DLE9BWEE2QixFQUFLRyxLQUFLLENBQ1J6QyxTQUFVK0IsRUFBaUJDLEVBQVlDLEdBQ3ZDUyxLQUFNeEIsRUFDTnlCLEtBQUksU0FBQVQsT0FBVzFCLEVBQVVJLE9BQXJCLEtBQ0pnQyxHQUFJLEtBR043RCxPQUFPdUUsb0JBQW9CN0MsR0FBUzhDLFFBQVEsU0FBVUMsRUFBS0MsRUFBS0MsR0FDOURwQixFQUFPQSxFQUFLSixPQUFPcEIsRUFBcUJpQixFQUFpQkMsRUFBWUMsR0FBZXVCLE9BQUszQyxFQUFXSixFQUFRK0MsT0FHdkdsQixFQUlULEdBQUlSLEVBQVV0QixLQUFlZSxFQUFTZCxJQUFZZSxFQUFRZixJQVF4RCxPQVBBNkIsRUFBS0csS0FBSyxDQUNSekMsU0FBVStCLEVBQWlCQyxFQUFZQyxHQUN2Q1MsS0FBTXpCLEVBQ04wQixLQUFNLEtBQ05DLElBQUksRUFBQTdCLEVBQUFxQyxTQUFZM0MsS0FHWDZCLEVBR1QsR0FBSVIsRUFBVXRCLElBQWNrQixFQUFTakIsR0FBVSxDQUM3QzZCLEVBQUtHLEtBQUssQ0FDUnpDLFNBQVUrQixFQUFpQkMsRUFBWUMsR0FDdkNTLEtBQU14QixFQUNOeUIsS0FBTSxLQUNOQyxJQUFJLEVBQUE3QixFQUFBcUMsU0FBWTNDLEtBRWxCLElBQUssSUFBSXBDLEVBQUksRUFBR0EsRUFBSW9DLEVBQVFHLE9BQVF2QyxJQUNsQ2lFLEVBQU9BLEVBQUtKLE9BQU9wQixFQUFxQmlCLEVBQWlCQyxFQUFZQyxHQUE5QixJQUFBQyxPQUFpRDdELEVBQWpELFVBQXVEd0MsRUFBV0osRUFBUXBDLEtBRW5ILE9BQU9pRSxFQWdCVCxPQVpJUixFQUFVdEIsSUFBY3NCLEVBQVVyQixLQUNwQzFCLE9BQU91RSxvQkFBb0I5QyxHQUFXK0MsUUFBUSxTQUFVQyxFQUFLQyxFQUFLQyxHQUNoRXBCLEVBQU9BLEVBQUtKLE9BQU9wQixFQUFxQmlCLEVBQWlCQyxFQUFZQyxHQUFldUIsRUFBS2hELEVBQVVnRCxHQUFNL0MsRUFBUStDLE9BRW5IekUsT0FBT3VFLG9CQUFvQjdDLEdBQVM4QyxRQUFRLFNBQVVDLEVBQUtDLEVBQUtDLFFBQ3ZDN0MsSUFBbkJMLEVBQVVnRCxLQUdkbEIsRUFBT0EsRUFBS0osT0FBT3BCLEVBQXFCaUIsRUFBaUJDLEVBQVlDLEdBQWV1QixPQUFLM0MsRUFBV0osRUFBUStDLFNBSXpHbEIsaVVDNVhNLFNBQVM2QixFQUFZNUUsR0FDbEMsR0FBaUIsa0JBQU5BLEdBQWdDLGlCQUFOQSxHQUErQixpQkFBTkEsRUFDNUQsT0FBT0EsRUFBRTZFLFdBQ0osR0FBVSxPQUFON0UsRUFDVCxNQUFPLE9BQ0YsUUFBVXNCLElBQU50QixFQUNULE1BQU8sWUFFVCxHQUFpQixXQUFic0MsRUFBT3RDLEdBQ1QsTUFBTyxTQUNGLEdBQUlBLGFBQWFrQyxLQUN0QixPQUFPbEMsRUFBRThFLGNBQ0osR0FBSWhELE1BQU1DLFFBQVEvQixHQUN2QixPQUFPQSxFQUNKK0UsSUFBSSxTQUFBTCxHQUNILE9BQU9FLEVBQVlGLEtBRXBCTSxLQUFLLE1BQ0gsR0FBaUIsbUJBQU5oRixFQUNoQixNQUFPLFdBRVQsT0FBT2dELEtBQUtDLFVBQVVqRCIsImZpbGUiOiJvYmplY3QtZGlmZmVyZW5jZS1qcy5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIk9iakRpZmZcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiT2JqRGlmZlwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJPYmpEaWZmXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsImltcG9ydCB7IEdldE9iamVjdERpZmZlcmVuY2UgYXMgT2JqZWN0RGlmZmVyZW5jZX0gZnJvbSBcIi4vb2JqZWN0RGlmZmVyZW5jZS5qc1wiO1xyXG5leHBvcnQgZGVmYXVsdCB7IE9iamVjdERpZmZlcmVuY2UgfTtcclxuIiwiaW1wb3J0IGFueVRvU3RyaW5nIGZyb20gXCIuL2FueVRvU3RyaW5nLmpzXCI7XHJcblxyXG5jb25zdCBWQUxVRV9DUkVBVEVEID0gXCJjcmVhdGVkXCIsXHJcbiAgVkFMVUVfVVBEQVRFRCA9IFwidXBkYXRlZFwiLFxyXG4gIFZBTFVFX0RFTEVURUQgPSBcImRlbGV0ZWRcIixcclxuICBOT1RfQ09NUEFSQUJMRSA9IFwiTkFcIjtcclxuXHJcbmZ1bmN0aW9uIF9pc0JsYW5rKHQpIHtcclxuICByZXR1cm4gdCA9PT0gXCJcIiB8fCB0ID09PSAwIHx8IHQgPT09IHVuZGVmaW5lZCB8fCB0ID09PSBudWxsIHx8IHQgPT09IHt9IHx8IChBcnJheS5pc0FycmF5KHQpICYmIHQubGVuZ3RoIDwgMSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzVmFsdWUodCkge1xyXG4gIHJldHVybiAhX2lzQmxhbmsodCkgJiYgKHR5cGVvZiB0ID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgdCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdCA9PT0gXCJzdHJpbmdcIik7XHJcbn1cclxuZnVuY3Rpb24gX2lzRGF0ZSh0KSB7XHJcbiAgcmV0dXJuICFfaXNCbGFuayh0KSAmJiB0IGluc3RhbmNlb2YgRGF0ZTtcclxufVxyXG5mdW5jdGlvbiBfaXNBcnJheSh0KSB7XHJcbiAgcmV0dXJuICFfaXNCbGFuayh0KSAmJiBBcnJheS5pc0FycmF5KHQpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0Z1bmN0aW9uKHQpIHtcclxuICByZXR1cm4gdHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5mdW5jdGlvbiBfaXNTeW1ib2wodCkge1xyXG4gIHJldHVybiB0eXBlb2YgdCA9PT0gXCJzeW1ib2xcIjtcclxufVxyXG5mdW5jdGlvbiBfaXNPYmplY3QodCkge1xyXG4gIHJldHVybiAhX2lzVmFsdWUodCkgJiYgIV9pc0JsYW5rKHQpICYmICFfaXNEYXRlKHQpICYmICFfaXNBcnJheSh0KSAmJiAhX2lzRnVuY3Rpb24odCkgJiYgIV9pc1N5bWJvbCh0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpIHtcclxuICByZXR1cm4gcGFyZW50TmFtZSA/IGAke3BhcmVudE5hbWV9LiR7cHJvcGVydHlOYW1lfWAgOiBwcm9wZXJ0eU5hbWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9nZXRBcnJheURpZmZlbmNlKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSwgYTEsIGEyKSB7XHJcbiAgbGV0IGRpZmYgPSBbXTtcclxuXHJcbiAgaWYgKGExLmxlbmd0aCA9PT0gYTIubGVuZ3RoKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhMVtpXSkgPT09IEpTT04uc3RyaW5naWZ5KGEyW2ldKSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGRpZmYgPSBkaWZmLmNvbmNhdChfR2V0T2JqZWN0RGlmZmVyZW5jZShfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksIGBbJHtpfV1gLCBhMVtpXSwgYTJbaV0pKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRpZmY7XHJcbiAgfVxyXG5cclxuICBpZiAoYTEubGVuZ3RoID4gMzAgfHwgYTIubGVuZ3RoID4gMzApIHtcclxuICAgIGRpZmYucHVzaCh7XHJcbiAgICAgIHByb3BlcnR5OiBfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksXHJcbiAgICAgIHR5cGU6IFZBTFVFX1VQREFURUQsXHJcbiAgICAgIGZyb206IGBBcnJheVske2ExLmxlbmd0aH1dYCxcclxuICAgICAgdG86IGBBcnJheVske2EyLmxlbmd0aH1dYFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGNvbXBhcmVyKG90aGVyQXJyYXkpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoY3VycmVudCkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIG90aGVyQXJyYXkuZmlsdGVyKGZ1bmN0aW9uIChvdGhlcikge1xyXG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG90aGVyKSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCk7XHJcbiAgICAgICAgfSkubGVuZ3RoID09PSAwXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbGV0IG9ubHlJbkExID0gYTEuZmlsdGVyKGNvbXBhcmVyKGEyKSk7XHJcblxyXG4gIGxldCBvbmx5SW5BMiA9IGEyLmZpbHRlcihjb21wYXJlcihhMSkpO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9ubHlJbkExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7aX1dYCwgb25seUluQTFbaV0sIHVuZGVmaW5lZCkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9ubHlJbkEyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7aX1dYCwgdW5kZWZpbmVkLCBvbmx5SW5BMltpXSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGlmZjtcclxufVxyXG5mdW5jdGlvbiBfZ2V0QXJyYXlEaWZmZW5jZUJ5S2V5KHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSwgYTEsIGEyLCBrZXlQcm9wKSB7XHJcbiAgbGV0IGRpZmYgPSBbXTtcclxuXHJcbiAgZnVuY3Rpb24gY29tcGFyZXIob3RoZXJBcnJheSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgb3RoZXJBcnJheS5maWx0ZXIoZnVuY3Rpb24gKG90aGVyKSB7XHJcbiAgICAgICAgICByZXR1cm4gb3RoZXJba2V5UHJvcF0gPT09IGN1cnJlbnRba2V5UHJvcF07XHJcbiAgICAgICAgfSkubGVuZ3RoID09PSAwXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbGV0IG9ubHlJbkExID0gYTEuZmlsdGVyKGNvbXBhcmVyKGEyKSk7XHJcblxyXG4gIGxldCBvbmx5SW5BMiA9IGEyLmZpbHRlcihjb21wYXJlcihhMSkpO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9ubHlJbkExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7a2V5UHJvcH09JHtvbmx5SW5BMVtpXVtrZXlQcm9wXX1dYCwgb25seUluQTFbaV0sIHVuZGVmaW5lZCkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9ubHlJbkEyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7a2V5UHJvcH09JHtvbmx5SW5BMltpXVtrZXlQcm9wXX1dYCwgdW5kZWZpbmVkLCBvbmx5SW5BMltpXSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBsZXQgYTJJdGVtID0gYTIuZmluZCh4ID0+IHtcclxuICAgICAgcmV0dXJuIHhba2V5UHJvcF0gPT09IGExW2ldW2tleVByb3BdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGEySXRlbSkge1xyXG4gICAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7a2V5UHJvcH09JHthMVtpXVtrZXlQcm9wXX1dYCwgYTFbaV0sIGEySXRlbSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGlmZjtcclxufVxyXG5cclxuZnVuY3Rpb24gX0dldE9iamVjdERpZmZlcmVuY2UocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lLCB2YWx1ZUZyb20sIHZhbHVlVG8sIGNvbmZpZyA9IHt9KSB7XHJcbiAgbGV0IGRpZmYgPSBbXTtcclxuXHJcbiAgaWYgKHByb3BlcnR5TmFtZSA9PT0gXCJfX29iX19cIiB8fCBwcm9wZXJ0eU5hbWUgPT09IFwiX19wcm90b19fXCIpIHtcclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuICAvLyBjYXNlOiDkuKTkuKrpg73mmK/ln7rnoYDnsbvlnotcclxuICBpZiAoX2lzVmFsdWUodmFsdWVGcm9tKSAmJiBfaXNWYWx1ZSh2YWx1ZVRvKSkge1xyXG4gICAgaWYgKHZhbHVlRnJvbSA9PSB2YWx1ZVRvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuICAgICAgcmV0dXJuIGRpZmY7XHJcbiAgICB9XHJcbiAgICBkaWZmLnB1c2goe1xyXG4gICAgICBwcm9wZXJ0eTogX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICB0eXBlOiBWQUxVRV9VUERBVEVELFxyXG4gICAgICBmcm9tOiB2YWx1ZUZyb20sXHJcbiAgICAgIHRvOiB2YWx1ZVRvXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FzZTog5o6S6Zmk5pyJZnVuY3Rpb27nmoTmg4XlhrVcclxuICBpZiAoX2lzRnVuY3Rpb24odmFsdWVGcm9tKSB8fCBfaXNGdW5jdGlvbih2YWx1ZVRvKSkge1xyXG4gICAgZGlmZi5wdXNoKHtcclxuICAgICAgcHJvcGVydHk6IF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSxcclxuICAgICAgdHlwZTogTk9UX0NPTVBBUkFCTEUsXHJcbiAgICAgIGZyb206IGFueVRvU3RyaW5nKHZhbHVlRnJvbSksXHJcbiAgICAgIHRvOiBhbnlUb1N0cmluZyh2YWx1ZVRvKVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIC8vIGNhc2U6IOWFtuS4reS4gOS4quaYr3N5bWJvbFxyXG4gIGlmIChfaXNTeW1ib2wodmFsdWVGcm9tKSB8fCBfaXNTeW1ib2wodmFsdWVUbykpIHtcclxuICAgIGRpZmYucHVzaCh7XHJcbiAgICAgIHByb3BlcnR5OiBfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksXHJcbiAgICAgIHR5cGU6IFZBTFVFX1VQREFURUQsXHJcbiAgICAgIGZyb206IGFueVRvU3RyaW5nKHZhbHVlRnJvbSksXHJcbiAgICAgIHRvOiBhbnlUb1N0cmluZyh2YWx1ZVRvKVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIC8vIGNhc2U6IOS4pOS4qumDveaYr+aXpeacn1xyXG4gIGlmIChfaXNEYXRlKHZhbHVlRnJvbSkgJiYgX2lzRGF0ZSh2YWx1ZVRvKSkge1xyXG4gICAgaWYgKHZhbHVlRnJvbS5nZXRUaW1lKCkgPT09IHZhbHVlVG8uZ2V0VGltZSgpKSB7XHJcbiAgICAgIHJldHVybiBkaWZmO1xyXG4gICAgfVxyXG4gICAgZGlmZi5wdXNoKHtcclxuICAgICAgcHJvcGVydHk6IF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSxcclxuICAgICAgdHlwZTogVkFMVUVfVVBEQVRFRCxcclxuICAgICAgZnJvbTogYW55VG9TdHJpbmcodmFsdWVGcm9tKSxcclxuICAgICAgdG86IGFueVRvU3RyaW5nKHZhbHVlVG8pXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FzZTog5LiA5Liq5piv5pel5pyf77yM5Y+m5LiA5Liq5piv5YC8XHJcbiAgaWYgKF9pc0RhdGUodmFsdWVUbykgJiYgX2lzVmFsdWUodmFsdWVGcm9tKSkge1xyXG4gICAgaWYgKG5ldyBEYXRlKHZhbHVlRnJvbSkuZ2V0VGltZSgpID09PSB2YWx1ZVRvLmdldFRpbWUoKSkge1xyXG4gICAgICByZXR1cm4gZGlmZjtcclxuICAgIH1cclxuICAgIGRpZmYucHVzaCh7XHJcbiAgICAgIHByb3BlcnR5OiBfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksXHJcbiAgICAgIHR5cGU6IFZBTFVFX1VQREFURUQsXHJcbiAgICAgIGZyb206IGFueVRvU3RyaW5nKHZhbHVlRnJvbSksXHJcbiAgICAgIHRvOiBhbnlUb1N0cmluZyh2YWx1ZVRvKVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcbiAgaWYgKF9pc0RhdGUodmFsdWVGcm9tKSAmJiBfaXNWYWx1ZSh2YWx1ZVRvKSkge1xyXG4gICAgaWYgKG5ldyBEYXRlKHZhbHVlVG8pLmdldFRpbWUoKSA9PT0gdmFsdWVGcm9tLmdldFRpbWUoKSkge1xyXG4gICAgICByZXR1cm4gZGlmZjtcclxuICAgIH1cclxuICAgIGRpZmYucHVzaCh7XHJcbiAgICAgIHByb3BlcnR5OiBfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksXHJcbiAgICAgIHR5cGU6IFZBTFVFX1VQREFURUQsXHJcbiAgICAgIGZyb206IGFueVRvU3RyaW5nKHZhbHVlRnJvbSksXHJcbiAgICAgIHRvOiBhbnlUb1N0cmluZyh2YWx1ZVRvKVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIC8vIGNhc2U6IOS4pOS4qumDveaYr0JsYW5rXHJcbiAgaWYgKF9pc0JsYW5rKHZhbHVlRnJvbSkgJiYgX2lzQmxhbmsodmFsdWVUbykpIHtcclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuICAvLyBjYXNlOiBGcm9t5pivYmxhbmssIFRv5LiN5pivXHJcbiAgaWYgKF9pc0JsYW5rKHZhbHVlRnJvbSkgJiYgX2lzVmFsdWUodmFsdWVUbykpIHtcclxuICAgIGlmKCF2YWx1ZVRvKSB7ICAvL2VzbGludC1kaXNhYmxlLWxpbmVcclxuICAgICAgcmV0dXJuIGRpZmY7XHJcbiAgICB9XHJcbiAgICBkaWZmLnB1c2goe1xyXG4gICAgICBwcm9wZXJ0eTogX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICB0eXBlOiBWQUxVRV9DUkVBVEVELFxyXG4gICAgICBmcm9tOiBcIlwiLFxyXG4gICAgICB0bzogYW55VG9TdHJpbmcodmFsdWVUbylcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpZmY7XHJcbiAgfVxyXG4gIGlmIChfaXNCbGFuayh2YWx1ZUZyb20pICYmIF9pc0RhdGUodmFsdWVUbykpIHtcclxuICAgIGRpZmYucHVzaCh7XHJcbiAgICAgIHByb3BlcnR5OiBfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksXHJcbiAgICAgIHR5cGU6IFZBTFVFX0NSRUFURUQsXHJcbiAgICAgIGZyb206IFwiXCIsXHJcbiAgICAgIHRvOiBhbnlUb1N0cmluZyh2YWx1ZVRvKVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcbiAgaWYgKF9pc0JsYW5rKHZhbHVlRnJvbSkgJiYgX2lzQXJyYXkodmFsdWVUbykpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUby5sZW5ndGg7IGkrKykge1xyXG4gICAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCBgWyR7aX1dYCwgdW5kZWZpbmVkLCB2YWx1ZVRvW2ldKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcbiAgaWYgKF9pc0JsYW5rKHZhbHVlRnJvbSkgJiYgX2lzT2JqZWN0KHZhbHVlVG8pKSB7XHJcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZVRvKS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGlkeCwgYXJyYXkpIHtcclxuICAgICAgZGlmZiA9IGRpZmYuY29uY2F0KF9HZXRPYmplY3REaWZmZXJlbmNlKF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSwgdmFsLCB1bmRlZmluZWQsIHZhbHVlVG9bdmFsXSkpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcbiAgLy8gY2FzZTogRnJvbeS4jeaYr2JsYW5rLCBUb+aYr1xyXG4gIGlmICgoX2lzVmFsdWUodmFsdWVGcm9tKSB8fCBfaXNEYXRlKHZhbHVlRnJvbSkgfHwgX2lzQXJyYXkodmFsdWVGcm9tKSB8fCBfaXNPYmplY3QodmFsdWVGcm9tKSkgJiYgX2lzQmxhbmsodmFsdWVUbykpIHtcclxuICAgIGlmICghdmFsdWVGcm9tKSB7XHJcbiAgICAgIHJldHVybiBkaWZmO1xyXG4gICAgfVxyXG4gICAgZGlmZi5wdXNoKHtcclxuICAgICAgcHJvcGVydHk6IF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSxcclxuICAgICAgdHlwZTogVkFMVUVfREVMRVRFRCxcclxuICAgICAgZnJvbTogXCJcIixcclxuICAgICAgdG86IFwiXCJcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpZmY7XHJcbiAgfVxyXG5cclxuICAvLyBjYXNlOiBGcm9t5piv5YC85oiW5pel5pyf77yMVG/mmK9BcnJheVxyXG4gIGlmICgoX2lzVmFsdWUodmFsdWVGcm9tKSB8fCBfaXNEYXRlKHZhbHVlRnJvbSkpICYmIF9pc0FycmF5KHZhbHVlVG8pKSB7XHJcbiAgICBkaWZmLnB1c2goe1xyXG4gICAgICBwcm9wZXJ0eTogX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICB0eXBlOiBWQUxVRV9ERUxFVEVELFxyXG4gICAgICBmcm9tOiBcIlwiLFxyXG4gICAgICB0bzogXCJcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVRvLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGRpZmYgPSBkaWZmLmNvbmNhdChfR2V0T2JqZWN0RGlmZmVyZW5jZShfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksIGBbJHtpfV1gLCB1bmRlZmluZWQsIHZhbHVlVG9baV0pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIC8vIGNhc2U6IEZyb23mmK/lgLzmiJbml6XmnJ/vvIxUb+aYr09iamVjdFxyXG4gIGlmICgoX2lzVmFsdWUodmFsdWVGcm9tKSB8fCBfaXNEYXRlKHZhbHVlRnJvbSkpICYmIF9pc09iamVjdCh2YWx1ZVRvKSkge1xyXG4gICAgZGlmZi5wdXNoKHtcclxuICAgICAgcHJvcGVydHk6IF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSxcclxuICAgICAgdHlwZTogVkFMVUVfREVMRVRFRCxcclxuICAgICAgZnJvbTogXCJcIixcclxuICAgICAgdG86IFwiXCJcclxuICAgIH0pO1xyXG5cclxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlVG8pLmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaWR4LCBhcnJheSkge1xyXG4gICAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCB2YWwsIHVuZGVmaW5lZCwgdmFsdWVUb1t2YWxdKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIC8vIGNhc2U6IEZyb23mmK9BcnJhee+8jFRv5piv5YC85oiW5pel5pyfXHJcbiAgaWYgKF9pc0FycmF5KHZhbHVlRnJvbSkgJiYgKF9pc1ZhbHVlKHZhbHVlVG8pIHx8IF9pc0RhdGUodmFsdWVUbykpKSB7XHJcbiAgICBkaWZmLnB1c2goe1xyXG4gICAgICBwcm9wZXJ0eTogX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICB0eXBlOiBWQUxVRV9VUERBVEVELFxyXG4gICAgICBmcm9tOiBgQXJyYXlbJHt2YWx1ZUZyb20ubGVuZ3RofV1gLFxyXG4gICAgICB0bzogYW55VG9TdHJpbmcodmFsdWVUbylcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpZmY7XHJcbiAgfVxyXG5cclxuICAvLyBjYXNlOiBGcm9t5pivQXJyYXnvvIxUb+aYr0FycmF5XHJcbiAgaWYgKF9pc0FycmF5KHZhbHVlRnJvbSkgJiYgX2lzQXJyYXkodmFsdWVUbykpIHtcclxuICAgIGlmIChjb25maWcuQXJyYXlLZXlQcm9wZXJ0eSkge1xyXG4gICAgICAvLyBjaGVjayB3aGV0aGVyIEFycmF5IGVsZW1lbnQgaGFzIHRoZSBrZXlcclxuICAgICAgbGV0IG1pc3NLZXlQcm9wID0gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlRnJvbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh2YWx1ZUZyb21baV1bY29uZmlnLkFycmF5S2V5UHJvcGVydHldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG1pc3NLZXlQcm9wID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVRvLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlVG9baV1bY29uZmlnLkFycmF5S2V5UHJvcGVydHldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG1pc3NLZXlQcm9wID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghbWlzc0tleVByb3ApIHtcclxuICAgICAgICBkaWZmID0gZGlmZi5jb25jYXQoX2dldEFycmF5RGlmZmVuY2VCeUtleShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUsIHZhbHVlRnJvbSwgdmFsdWVUbywgY29uZmlnLkFycmF5S2V5UHJvcGVydHkpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkaWZmID0gZGlmZi5jb25jYXQoX2dldEFycmF5RGlmZmVuY2UocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lLCB2YWx1ZUZyb20sIHZhbHVlVG8pKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGlmZiA9IGRpZmYuY29uY2F0KF9nZXRBcnJheURpZmZlbmNlKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSwgdmFsdWVGcm9tLCB2YWx1ZVRvKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlmZjtcclxuICB9XHJcblxyXG4gIC8vIGNhc2U6IEZyb23mmK9BcnJhee+8jFRv5pivT2JqZWN0XHJcbiAgaWYgKF9pc0FycmF5KHZhbHVlRnJvbSkgJiYgX2lzT2JqZWN0KHZhbHVlVG8pKSB7XHJcbiAgICBkaWZmLnB1c2goe1xyXG4gICAgICBwcm9wZXJ0eTogX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLFxyXG4gICAgICB0eXBlOiBWQUxVRV9ERUxFVEVELFxyXG4gICAgICBmcm9tOiBgQXJyYXlbJHt2YWx1ZUZyb20ubGVuZ3RofV1gLFxyXG4gICAgICB0bzogXCJcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWVUbykuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBpZHgsIGFycmF5KSB7XHJcbiAgICAgIGRpZmYgPSBkaWZmLmNvbmNhdChfR2V0T2JqZWN0RGlmZmVyZW5jZShfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksIHZhbCwgdW5kZWZpbmVkLCB2YWx1ZVRvW3ZhbF0pKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FzZTogRnJvbeaYr09iamVjdO+8jFRv5piv5YC85oiW5pel5pyfXHJcbiAgaWYgKF9pc09iamVjdCh2YWx1ZUZyb20pICYmIChfaXNWYWx1ZSh2YWx1ZVRvKSB8fCBfaXNEYXRlKHZhbHVlVG8pKSkge1xyXG4gICAgZGlmZi5wdXNoKHtcclxuICAgICAgcHJvcGVydHk6IF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSxcclxuICAgICAgdHlwZTogVkFMVUVfVVBEQVRFRCxcclxuICAgICAgZnJvbTogXCJ7fVwiLFxyXG4gICAgICB0bzogYW55VG9TdHJpbmcodmFsdWVUbylcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuICAvLyBjYXNlOiBGcm9t5pivT2JqZWN077yMVG/mmK9BcnJheVxyXG4gIGlmIChfaXNPYmplY3QodmFsdWVGcm9tKSAmJiBfaXNBcnJheSh2YWx1ZVRvKSkge1xyXG4gICAgZGlmZi5wdXNoKHtcclxuICAgICAgcHJvcGVydHk6IF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSxcclxuICAgICAgdHlwZTogVkFMVUVfREVMRVRFRCxcclxuICAgICAgZnJvbTogXCJ7fVwiLFxyXG4gICAgICB0bzogYW55VG9TdHJpbmcodmFsdWVUbylcclxuICAgIH0pO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVRvLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGRpZmYgPSBkaWZmLmNvbmNhdChfR2V0T2JqZWN0RGlmZmVyZW5jZShfZ2V0RnVsbFByb3BOYW1lKHBhcmVudE5hbWUsIHByb3BlcnR5TmFtZSksIGBbJHtpfV1gLCB1bmRlZmluZWQsIHZhbHVlVG9baV0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkaWZmO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FzZTogRnJvbeaYr09iamVjdO+8jFRv5pivT2JqZWN0XHJcbiAgaWYgKF9pc09iamVjdCh2YWx1ZUZyb20pICYmIF9pc09iamVjdCh2YWx1ZVRvKSkge1xyXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWVGcm9tKS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGlkeCwgYXJyYXkpIHtcclxuICAgICAgZGlmZiA9IGRpZmYuY29uY2F0KF9HZXRPYmplY3REaWZmZXJlbmNlKF9nZXRGdWxsUHJvcE5hbWUocGFyZW50TmFtZSwgcHJvcGVydHlOYW1lKSwgdmFsLCB2YWx1ZUZyb21bdmFsXSwgdmFsdWVUb1t2YWxdKSk7XHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlVG8pLmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaWR4LCBhcnJheSkge1xyXG4gICAgICBpZiAodmFsdWVGcm9tW3ZhbF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBkaWZmID0gZGlmZi5jb25jYXQoX0dldE9iamVjdERpZmZlcmVuY2UoX2dldEZ1bGxQcm9wTmFtZShwYXJlbnROYW1lLCBwcm9wZXJ0eU5hbWUpLCB2YWwsIHVuZGVmaW5lZCwgdmFsdWVUb1t2YWxdKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkaWZmO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGRlZXAgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBvYmplY3RzLiBBbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkIGZvciB0d28gc2FtZSBvYmplY3RzIGNvbXBhcmluZy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0geyp9IHByb3BlcnR5TmFtZSBvYmplY3QgbmFtZSwgYXMgdGhlIHJvb3QgcHJvcGVydHkgbmFtZVxyXG4gKiBAcGFyYW0geyp9IHZhbHVlRnJvbSB2YWx1ZSBjb21wYXJpbmcgb24gdGhlIGxlZnRcclxuICogQHBhcmFtIHsqfSB2YWx1ZVRvIHZhbHVlIGNvbXBhcmluZyBvbiB0aGUgcmlnaHRcclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRPYmplY3REaWZmZXJlbmNlKG9iamVjdE5hbWUsIHZhbHVlRnJvbSwgdmFsdWVUbywgY29uZmlnID0ge30pIHtcclxuICByZXR1cm4gX0dldE9iamVjdERpZmZlcmVuY2UoXCJcIiwgb2JqZWN0TmFtZSwgdmFsdWVGcm9tLCB2YWx1ZVRvLCBjb25maWcpO1xyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFueVRvU3RyaW5nKHQpIHtcclxuICBpZiAodHlwZW9mIHQgPT09IFwiYm9vbGVhblwiIHx8IHR5cGVvZiB0ID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB0ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICByZXR1cm4gdC50b1N0cmluZygpO1xyXG4gIH0gZWxzZSBpZiAodCA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIFwibnVsbFwiO1xyXG4gIH0gZWxzZSBpZiAodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcclxuICB9XHJcbiAgaWYgKHR5cGVvZiB0ID09PSBcInN5bWJvbFwiKSB7XHJcbiAgICByZXR1cm4gXCJzeW1ib2xcIjtcclxuICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICByZXR1cm4gdC50b1VUQ1N0cmluZygpO1xyXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xyXG4gICAgcmV0dXJuIHRcclxuICAgICAgLm1hcCh4ID0+IHtcclxuICAgICAgICByZXR1cm4gYW55VG9TdHJpbmcoeCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5qb2luKFwiLCBcIik7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgdCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICByZXR1cm4gXCJmdW5jdGlvblwiO1xyXG4gIH1cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodCk7XHJcblxyXG59XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=