lazy-result.js 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  5. var _mapGenerator = require('./map-generator');
  6. var _mapGenerator2 = _interopRequireDefault(_mapGenerator);
  7. var _stringify2 = require('./stringify');
  8. var _stringify3 = _interopRequireDefault(_stringify2);
  9. var _warnOnce = require('./warn-once');
  10. var _warnOnce2 = _interopRequireDefault(_warnOnce);
  11. var _result = require('./result');
  12. var _result2 = _interopRequireDefault(_result);
  13. var _parse = require('./parse');
  14. var _parse2 = _interopRequireDefault(_parse);
  15. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  16. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  17. function isPromise(obj) {
  18. return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && typeof obj.then === 'function';
  19. }
  20. /**
  21. * A Promise proxy for the result of PostCSS transformations.
  22. *
  23. * A `LazyResult` instance is returned by {@link Processor#process}.
  24. *
  25. * @example
  26. * const lazy = postcss([cssnext]).process(css);
  27. */
  28. var LazyResult = function () {
  29. function LazyResult(processor, css, opts) {
  30. _classCallCheck(this, LazyResult);
  31. this.stringified = false;
  32. this.processed = false;
  33. var root = void 0;
  34. if ((typeof css === 'undefined' ? 'undefined' : _typeof(css)) === 'object' && css.type === 'root') {
  35. root = css;
  36. } else if (css instanceof LazyResult || css instanceof _result2.default) {
  37. root = css.root;
  38. if (css.map) {
  39. if (typeof opts.map === 'undefined') opts.map = {};
  40. if (!opts.map.inline) opts.map.inline = false;
  41. opts.map.prev = css.map;
  42. }
  43. } else {
  44. var parser = _parse2.default;
  45. if (opts.syntax) parser = opts.syntax.parse;
  46. if (opts.parser) parser = opts.parser;
  47. if (parser.parse) parser = parser.parse;
  48. try {
  49. root = parser(css, opts);
  50. } catch (error) {
  51. this.error = error;
  52. }
  53. }
  54. this.result = new _result2.default(processor, root, opts);
  55. }
  56. /**
  57. * Returns a {@link Processor} instance, which will be used
  58. * for CSS transformations.
  59. * @type {Processor}
  60. */
  61. /**
  62. * Processes input CSS through synchronous plugins
  63. * and calls {@link Result#warnings()}.
  64. *
  65. * @return {Warning[]} warnings from plugins
  66. */
  67. LazyResult.prototype.warnings = function warnings() {
  68. return this.sync().warnings();
  69. };
  70. /**
  71. * Alias for the {@link LazyResult#css} property.
  72. *
  73. * @example
  74. * lazy + '' === lazy.css;
  75. *
  76. * @return {string} output CSS
  77. */
  78. LazyResult.prototype.toString = function toString() {
  79. return this.css;
  80. };
  81. /**
  82. * Processes input CSS through synchronous and asynchronous plugins
  83. * and calls `onFulfilled` with a Result instance. If a plugin throws
  84. * an error, the `onRejected` callback will be executed.
  85. *
  86. * It implements standard Promise API.
  87. *
  88. * @param {onFulfilled} onFulfilled - callback will be executed
  89. * when all plugins will finish work
  90. * @param {onRejected} onRejected - callback will be executed on any error
  91. *
  92. * @return {Promise} Promise API to make queue
  93. *
  94. * @example
  95. * postcss([cssnext]).process(css).then(result => {
  96. * console.log(result.css);
  97. * });
  98. */
  99. LazyResult.prototype.then = function then(onFulfilled, onRejected) {
  100. return this.async().then(onFulfilled, onRejected);
  101. };
  102. /**
  103. * Processes input CSS through synchronous and asynchronous plugins
  104. * and calls onRejected for each error thrown in any plugin.
  105. *
  106. * It implements standard Promise API.
  107. *
  108. * @param {onRejected} onRejected - callback will be executed on any error
  109. *
  110. * @return {Promise} Promise API to make queue
  111. *
  112. * @example
  113. * postcss([cssnext]).process(css).then(result => {
  114. * console.log(result.css);
  115. * }).catch(error => {
  116. * console.error(error);
  117. * });
  118. */
  119. LazyResult.prototype.catch = function _catch(onRejected) {
  120. return this.async().catch(onRejected);
  121. };
  122. LazyResult.prototype.handleError = function handleError(error, plugin) {
  123. try {
  124. this.error = error;
  125. if (error.name === 'CssSyntaxError' && !error.plugin) {
  126. error.plugin = plugin.postcssPlugin;
  127. error.setMessage();
  128. } else if (plugin.postcssVersion) {
  129. var pluginName = plugin.postcssPlugin;
  130. var pluginVer = plugin.postcssVersion;
  131. var runtimeVer = this.result.processor.version;
  132. var a = pluginVer.split('.');
  133. var b = runtimeVer.split('.');
  134. if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {
  135. (0, _warnOnce2.default)('Your current PostCSS version ' + 'is ' + runtimeVer + ', but ' + pluginName + ' ' + 'uses ' + pluginVer + '. Perhaps this is ' + 'the source of the error below.');
  136. }
  137. }
  138. } catch (err) {
  139. if (console && console.error) console.error(err);
  140. }
  141. };
  142. LazyResult.prototype.asyncTick = function asyncTick(resolve, reject) {
  143. var _this = this;
  144. if (this.plugin >= this.processor.plugins.length) {
  145. this.processed = true;
  146. return resolve();
  147. }
  148. try {
  149. (function () {
  150. var plugin = _this.processor.plugins[_this.plugin];
  151. var promise = _this.run(plugin);
  152. _this.plugin += 1;
  153. if (isPromise(promise)) {
  154. promise.then(function () {
  155. _this.asyncTick(resolve, reject);
  156. }).catch(function (error) {
  157. _this.handleError(error, plugin);
  158. _this.processed = true;
  159. reject(error);
  160. });
  161. } else {
  162. _this.asyncTick(resolve, reject);
  163. }
  164. })();
  165. } catch (error) {
  166. this.processed = true;
  167. reject(error);
  168. }
  169. };
  170. LazyResult.prototype.async = function async() {
  171. var _this2 = this;
  172. if (this.processed) {
  173. return new Promise(function (resolve, reject) {
  174. if (_this2.error) {
  175. reject(_this2.error);
  176. } else {
  177. resolve(_this2.stringify());
  178. }
  179. });
  180. }
  181. if (this.processing) {
  182. return this.processing;
  183. }
  184. this.processing = new Promise(function (resolve, reject) {
  185. if (_this2.error) return reject(_this2.error);
  186. _this2.plugin = 0;
  187. _this2.asyncTick(resolve, reject);
  188. }).then(function () {
  189. _this2.processed = true;
  190. return _this2.stringify();
  191. });
  192. return this.processing;
  193. };
  194. LazyResult.prototype.sync = function sync() {
  195. if (this.processed) return this.result;
  196. this.processed = true;
  197. if (this.processing) {
  198. throw new Error('Use process(css).then(cb) to work with async plugins');
  199. }
  200. if (this.error) throw this.error;
  201. for (var _iterator = this.result.processor.plugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
  202. var _ref;
  203. if (_isArray) {
  204. if (_i >= _iterator.length) break;
  205. _ref = _iterator[_i++];
  206. } else {
  207. _i = _iterator.next();
  208. if (_i.done) break;
  209. _ref = _i.value;
  210. }
  211. var plugin = _ref;
  212. var promise = this.run(plugin);
  213. if (isPromise(promise)) {
  214. throw new Error('Use process(css).then(cb) to work with async plugins');
  215. }
  216. }
  217. return this.result;
  218. };
  219. LazyResult.prototype.run = function run(plugin) {
  220. this.result.lastPlugin = plugin;
  221. try {
  222. return plugin(this.result.root, this.result);
  223. } catch (error) {
  224. this.handleError(error, plugin);
  225. throw error;
  226. }
  227. };
  228. LazyResult.prototype.stringify = function stringify() {
  229. if (this.stringified) return this.result;
  230. this.stringified = true;
  231. this.sync();
  232. var opts = this.result.opts;
  233. var str = _stringify3.default;
  234. if (opts.syntax) str = opts.syntax.stringify;
  235. if (opts.stringifier) str = opts.stringifier;
  236. if (str.stringify) str = str.stringify;
  237. var map = new _mapGenerator2.default(str, this.result.root, this.result.opts);
  238. var data = map.generate();
  239. this.result.css = data[0];
  240. this.result.map = data[1];
  241. return this.result;
  242. };
  243. _createClass(LazyResult, [{
  244. key: 'processor',
  245. get: function get() {
  246. return this.result.processor;
  247. }
  248. /**
  249. * Options from the {@link Processor#process} call.
  250. * @type {processOptions}
  251. */
  252. }, {
  253. key: 'opts',
  254. get: function get() {
  255. return this.result.opts;
  256. }
  257. /**
  258. * Processes input CSS through synchronous plugins, converts `Root`
  259. * to a CSS string and returns {@link Result#css}.
  260. *
  261. * This property will only work with synchronous plugins.
  262. * If the processor contains any asynchronous plugins
  263. * it will throw an error. This is why this method is only
  264. * for debug purpose, you should always use {@link LazyResult#then}.
  265. *
  266. * @type {string}
  267. * @see Result#css
  268. */
  269. }, {
  270. key: 'css',
  271. get: function get() {
  272. return this.stringify().css;
  273. }
  274. /**
  275. * An alias for the `css` property. Use it with syntaxes
  276. * that generate non-CSS output.
  277. *
  278. * This property will only work with synchronous plugins.
  279. * If the processor contains any asynchronous plugins
  280. * it will throw an error. This is why this method is only
  281. * for debug purpose, you should always use {@link LazyResult#then}.
  282. *
  283. * @type {string}
  284. * @see Result#content
  285. */
  286. }, {
  287. key: 'content',
  288. get: function get() {
  289. return this.stringify().content;
  290. }
  291. /**
  292. * Processes input CSS through synchronous plugins
  293. * and returns {@link Result#map}.
  294. *
  295. * This property will only work with synchronous plugins.
  296. * If the processor contains any asynchronous plugins
  297. * it will throw an error. This is why this method is only
  298. * for debug purpose, you should always use {@link LazyResult#then}.
  299. *
  300. * @type {SourceMapGenerator}
  301. * @see Result#map
  302. */
  303. }, {
  304. key: 'map',
  305. get: function get() {
  306. return this.stringify().map;
  307. }
  308. /**
  309. * Processes input CSS through synchronous plugins
  310. * and returns {@link Result#root}.
  311. *
  312. * This property will only work with synchronous plugins. If the processor
  313. * contains any asynchronous plugins it will throw an error.
  314. *
  315. * This is why this method is only for debug purpose,
  316. * you should always use {@link LazyResult#then}.
  317. *
  318. * @type {Root}
  319. * @see Result#root
  320. */
  321. }, {
  322. key: 'root',
  323. get: function get() {
  324. return this.sync().root;
  325. }
  326. /**
  327. * Processes input CSS through synchronous plugins
  328. * and returns {@link Result#messages}.
  329. *
  330. * This property will only work with synchronous plugins. If the processor
  331. * contains any asynchronous plugins it will throw an error.
  332. *
  333. * This is why this method is only for debug purpose,
  334. * you should always use {@link LazyResult#then}.
  335. *
  336. * @type {Message[]}
  337. * @see Result#messages
  338. */
  339. }, {
  340. key: 'messages',
  341. get: function get() {
  342. return this.sync().messages;
  343. }
  344. }]);
  345. return LazyResult;
  346. }();
  347. exports.default = LazyResult;
  348. /**
  349. * @callback onFulfilled
  350. * @param {Result} result
  351. */
  352. /**
  353. * @callback onRejected
  354. * @param {Error} error
  355. */
  356. module.exports = exports['default'];
  357. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvbGF6eS1yZXN1bHQuZXM2Il0sIm5hbWVzIjpbImlzUHJvbWlzZSIsIm9iaiIsInRoZW4iLCJMYXp5UmVzdWx0IiwicHJvY2Vzc29yIiwiY3NzIiwib3B0cyIsInN0cmluZ2lmaWVkIiwicHJvY2Vzc2VkIiwicm9vdCIsInR5cGUiLCJtYXAiLCJpbmxpbmUiLCJwcmV2IiwicGFyc2VyIiwic3ludGF4IiwicGFyc2UiLCJlcnJvciIsInJlc3VsdCIsIndhcm5pbmdzIiwic3luYyIsInRvU3RyaW5nIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiYXN5bmMiLCJjYXRjaCIsImhhbmRsZUVycm9yIiwicGx1Z2luIiwibmFtZSIsInBvc3Rjc3NQbHVnaW4iLCJzZXRNZXNzYWdlIiwicG9zdGNzc1ZlcnNpb24iLCJwbHVnaW5OYW1lIiwicGx1Z2luVmVyIiwicnVudGltZVZlciIsInZlcnNpb24iLCJhIiwic3BsaXQiLCJiIiwicGFyc2VJbnQiLCJlcnIiLCJjb25zb2xlIiwiYXN5bmNUaWNrIiwicmVzb2x2ZSIsInJlamVjdCIsInBsdWdpbnMiLCJsZW5ndGgiLCJwcm9taXNlIiwicnVuIiwiUHJvbWlzZSIsInN0cmluZ2lmeSIsInByb2Nlc3NpbmciLCJFcnJvciIsImxhc3RQbHVnaW4iLCJzdHIiLCJzdHJpbmdpZmllciIsImRhdGEiLCJnZW5lcmF0ZSIsImNvbnRlbnQiLCJtZXNzYWdlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLFNBQVNBLFNBQVQsQ0FBbUJDLEdBQW5CLEVBQXdCO0FBQ3BCLFdBQU8sUUFBT0EsR0FBUCx5Q0FBT0EsR0FBUCxPQUFlLFFBQWYsSUFBMkIsT0FBT0EsSUFBSUMsSUFBWCxLQUFvQixVQUF0RDtBQUNIOztBQUVEOzs7Ozs7Ozs7SUFRTUMsVTtBQUVGLHdCQUFZQyxTQUFaLEVBQXVCQyxHQUF2QixFQUE0QkMsSUFBNUIsRUFBa0M7QUFBQTs7QUFDOUIsYUFBS0MsV0FBTCxHQUFtQixLQUFuQjtBQUNBLGFBQUtDLFNBQUwsR0FBbUIsS0FBbkI7O0FBRUEsWUFBSUMsYUFBSjtBQUNBLFlBQUssUUFBT0osR0FBUCx5Q0FBT0EsR0FBUCxPQUFlLFFBQWYsSUFBMkJBLElBQUlLLElBQUosS0FBYSxNQUE3QyxFQUFzRDtBQUNsREQsbUJBQU9KLEdBQVA7QUFDSCxTQUZELE1BRU8sSUFBS0EsZUFBZUYsVUFBZixJQUE2QkUsK0JBQWxDLEVBQTBEO0FBQzdESSxtQkFBT0osSUFBSUksSUFBWDtBQUNBLGdCQUFLSixJQUFJTSxHQUFULEVBQWU7QUFDWCxvQkFBSyxPQUFPTCxLQUFLSyxHQUFaLEtBQW9CLFdBQXpCLEVBQXVDTCxLQUFLSyxHQUFMLEdBQVcsRUFBWDtBQUN2QyxvQkFBSyxDQUFDTCxLQUFLSyxHQUFMLENBQVNDLE1BQWYsRUFBd0JOLEtBQUtLLEdBQUwsQ0FBU0MsTUFBVCxHQUFrQixLQUFsQjtBQUN4Qk4scUJBQUtLLEdBQUwsQ0FBU0UsSUFBVCxHQUFnQlIsSUFBSU0sR0FBcEI7QUFDSDtBQUNKLFNBUE0sTUFPQTtBQUNILGdCQUFJRyx3QkFBSjtBQUNBLGdCQUFLUixLQUFLUyxNQUFWLEVBQW9CRCxTQUFTUixLQUFLUyxNQUFMLENBQVlDLEtBQXJCO0FBQ3BCLGdCQUFLVixLQUFLUSxNQUFWLEVBQW9CQSxTQUFTUixLQUFLUSxNQUFkO0FBQ3BCLGdCQUFLQSxPQUFPRSxLQUFaLEVBQW9CRixTQUFTQSxPQUFPRSxLQUFoQjs7QUFFcEIsZ0JBQUk7QUFDQVAsdUJBQU9LLE9BQU9ULEdBQVAsRUFBWUMsSUFBWixDQUFQO0FBQ0gsYUFGRCxDQUVFLE9BQU9XLEtBQVAsRUFBYztBQUNaLHFCQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFDSDtBQUNKOztBQUVELGFBQUtDLE1BQUwsR0FBYyxxQkFBV2QsU0FBWCxFQUFzQkssSUFBdEIsRUFBNEJILElBQTVCLENBQWQ7QUFDSDs7QUFFRDs7Ozs7OztBQW1HQTs7Ozs7O3lCQU1BYSxRLHVCQUFXO0FBQ1AsZUFBTyxLQUFLQyxJQUFMLEdBQVlELFFBQVosRUFBUDtBQUNILEs7O0FBRUQ7Ozs7Ozs7Ozs7eUJBUUFFLFEsdUJBQVc7QUFDUCxlQUFPLEtBQUtoQixHQUFaO0FBQ0gsSzs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUJBa0JBSCxJLGlCQUFLb0IsVyxFQUFhQyxVLEVBQVk7QUFDMUIsZUFBTyxLQUFLQyxLQUFMLEdBQWF0QixJQUFiLENBQWtCb0IsV0FBbEIsRUFBK0JDLFVBQS9CLENBQVA7QUFDSCxLOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O3lCQWlCQUUsSyxtQkFBTUYsVSxFQUFZO0FBQ2QsZUFBTyxLQUFLQyxLQUFMLEdBQWFDLEtBQWIsQ0FBbUJGLFVBQW5CLENBQVA7QUFDSCxLOzt5QkFFREcsVyx3QkFBWVQsSyxFQUFPVSxNLEVBQVE7QUFDdkIsWUFBSTtBQUNBLGlCQUFLVixLQUFMLEdBQWFBLEtBQWI7QUFDQSxnQkFBS0EsTUFBTVcsSUFBTixLQUFlLGdCQUFmLElBQW1DLENBQUNYLE1BQU1VLE1BQS9DLEVBQXdEO0FBQ3BEVixzQkFBTVUsTUFBTixHQUFlQSxPQUFPRSxhQUF0QjtBQUNBWixzQkFBTWEsVUFBTjtBQUNILGFBSEQsTUFHTyxJQUFLSCxPQUFPSSxjQUFaLEVBQTZCO0FBQ2hDLG9CQUFJQyxhQUFhTCxPQUFPRSxhQUF4QjtBQUNBLG9CQUFJSSxZQUFhTixPQUFPSSxjQUF4QjtBQUNBLG9CQUFJRyxhQUFhLEtBQUtoQixNQUFMLENBQVlkLFNBQVosQ0FBc0IrQixPQUF2QztBQUNBLG9CQUFJQyxJQUFJSCxVQUFVSSxLQUFWLENBQWdCLEdBQWhCLENBQVI7QUFDQSxvQkFBSUMsSUFBSUosV0FBV0csS0FBWCxDQUFpQixHQUFqQixDQUFSOztBQUVBLG9CQUFLRCxFQUFFLENBQUYsTUFBU0UsRUFBRSxDQUFGLENBQVQsSUFBaUJDLFNBQVNILEVBQUUsQ0FBRixDQUFULElBQWlCRyxTQUFTRCxFQUFFLENBQUYsQ0FBVCxDQUF2QyxFQUF3RDtBQUNwRCw0Q0FBUyxrQ0FDQSxLQURBLEdBQ1FKLFVBRFIsR0FDcUIsUUFEckIsR0FDZ0NGLFVBRGhDLEdBQzZDLEdBRDdDLEdBRUEsT0FGQSxHQUVVQyxTQUZWLEdBRXNCLG9CQUZ0QixHQUdBLGdDQUhUO0FBSUg7QUFDSjtBQUNKLFNBbkJELENBbUJFLE9BQU9PLEdBQVAsRUFBWTtBQUNWLGdCQUFLQyxXQUFXQSxRQUFReEIsS0FBeEIsRUFBZ0N3QixRQUFReEIsS0FBUixDQUFjdUIsR0FBZDtBQUNuQztBQUNKLEs7O3lCQUVERSxTLHNCQUFVQyxPLEVBQVNDLE0sRUFBUTtBQUFBOztBQUN2QixZQUFLLEtBQUtqQixNQUFMLElBQWUsS0FBS3ZCLFNBQUwsQ0FBZXlDLE9BQWYsQ0FBdUJDLE1BQTNDLEVBQW9EO0FBQ2hELGlCQUFLdEMsU0FBTCxHQUFpQixJQUFqQjtBQUNBLG1CQUFPbUMsU0FBUDtBQUNIOztBQUVELFlBQUk7QUFBQTtBQUNBLG9CQUFJaEIsU0FBVSxNQUFLdkIsU0FBTCxDQUFleUMsT0FBZixDQUF1QixNQUFLbEIsTUFBNUIsQ0FBZDtBQUNBLG9CQUFJb0IsVUFBVSxNQUFLQyxHQUFMLENBQVNyQixNQUFULENBQWQ7QUFDQSxzQkFBS0EsTUFBTCxJQUFlLENBQWY7O0FBRUEsb0JBQUszQixVQUFVK0MsT0FBVixDQUFMLEVBQTBCO0FBQ3RCQSw0QkFBUTdDLElBQVIsQ0FBYyxZQUFNO0FBQ2hCLDhCQUFLd0MsU0FBTCxDQUFlQyxPQUFmLEVBQXdCQyxNQUF4QjtBQUNILHFCQUZELEVBRUduQixLQUZILENBRVUsaUJBQVM7QUFDZiw4QkFBS0MsV0FBTCxDQUFpQlQsS0FBakIsRUFBd0JVLE1BQXhCO0FBQ0EsOEJBQUtuQixTQUFMLEdBQWlCLElBQWpCO0FBQ0FvQywrQkFBTzNCLEtBQVA7QUFDSCxxQkFORDtBQU9ILGlCQVJELE1BUU87QUFDSCwwQkFBS3lCLFNBQUwsQ0FBZUMsT0FBZixFQUF3QkMsTUFBeEI7QUFDSDtBQWZEO0FBaUJILFNBakJELENBaUJFLE9BQU8zQixLQUFQLEVBQWM7QUFDWixpQkFBS1QsU0FBTCxHQUFpQixJQUFqQjtBQUNBb0MsbUJBQU8zQixLQUFQO0FBQ0g7QUFDSixLOzt5QkFFRE8sSyxvQkFBUTtBQUFBOztBQUNKLFlBQUssS0FBS2hCLFNBQVYsRUFBc0I7QUFDbEIsbUJBQU8sSUFBSXlDLE9BQUosQ0FBYSxVQUFDTixPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDckMsb0JBQUssT0FBSzNCLEtBQVYsRUFBa0I7QUFDZDJCLDJCQUFPLE9BQUszQixLQUFaO0FBQ0gsaUJBRkQsTUFFTztBQUNIMEIsNEJBQVEsT0FBS08sU0FBTCxFQUFSO0FBQ0g7QUFDSixhQU5NLENBQVA7QUFPSDtBQUNELFlBQUssS0FBS0MsVUFBVixFQUF1QjtBQUNuQixtQkFBTyxLQUFLQSxVQUFaO0FBQ0g7O0FBRUQsYUFBS0EsVUFBTCxHQUFrQixJQUFJRixPQUFKLENBQWEsVUFBQ04sT0FBRCxFQUFVQyxNQUFWLEVBQXFCO0FBQ2hELGdCQUFLLE9BQUszQixLQUFWLEVBQWtCLE9BQU8yQixPQUFPLE9BQUszQixLQUFaLENBQVA7QUFDbEIsbUJBQUtVLE1BQUwsR0FBYyxDQUFkO0FBQ0EsbUJBQUtlLFNBQUwsQ0FBZUMsT0FBZixFQUF3QkMsTUFBeEI7QUFDSCxTQUppQixFQUlmMUMsSUFKZSxDQUlULFlBQU07QUFDWCxtQkFBS00sU0FBTCxHQUFpQixJQUFqQjtBQUNBLG1CQUFPLE9BQUswQyxTQUFMLEVBQVA7QUFDSCxTQVBpQixDQUFsQjs7QUFTQSxlQUFPLEtBQUtDLFVBQVo7QUFDSCxLOzt5QkFFRC9CLEksbUJBQU87QUFDSCxZQUFLLEtBQUtaLFNBQVYsRUFBc0IsT0FBTyxLQUFLVSxNQUFaO0FBQ3RCLGFBQUtWLFNBQUwsR0FBaUIsSUFBakI7O0FBRUEsWUFBSyxLQUFLMkMsVUFBVixFQUF1QjtBQUNuQixrQkFBTSxJQUFJQyxLQUFKLENBQ0Ysc0RBREUsQ0FBTjtBQUVIOztBQUVELFlBQUssS0FBS25DLEtBQVYsRUFBa0IsTUFBTSxLQUFLQSxLQUFYOztBQUVsQiw2QkFBb0IsS0FBS0MsTUFBTCxDQUFZZCxTQUFaLENBQXNCeUMsT0FBMUMsa0hBQW9EO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxnQkFBMUNsQixNQUEwQzs7QUFDaEQsZ0JBQUlvQixVQUFVLEtBQUtDLEdBQUwsQ0FBU3JCLE1BQVQsQ0FBZDtBQUNBLGdCQUFLM0IsVUFBVStDLE9BQVYsQ0FBTCxFQUEwQjtBQUN0QixzQkFBTSxJQUFJSyxLQUFKLENBQ0Ysc0RBREUsQ0FBTjtBQUVIO0FBQ0o7O0FBRUQsZUFBTyxLQUFLbEMsTUFBWjtBQUNILEs7O3lCQUVEOEIsRyxnQkFBSXJCLE0sRUFBUTtBQUNSLGFBQUtULE1BQUwsQ0FBWW1DLFVBQVosR0FBeUIxQixNQUF6Qjs7QUFFQSxZQUFJO0FBQ0EsbUJBQU9BLE9BQU8sS0FBS1QsTUFBTCxDQUFZVCxJQUFuQixFQUF5QixLQUFLUyxNQUE5QixDQUFQO0FBQ0gsU0FGRCxDQUVFLE9BQU9ELEtBQVAsRUFBYztBQUNaLGlCQUFLUyxXQUFMLENBQWlCVCxLQUFqQixFQUF3QlUsTUFBeEI7QUFDQSxrQkFBTVYsS0FBTjtBQUNIO0FBQ0osSzs7eUJBRURpQyxTLHdCQUFZO0FBQ1IsWUFBSyxLQUFLM0MsV0FBVixFQUF3QixPQUFPLEtBQUtXLE1BQVo7QUFDeEIsYUFBS1gsV0FBTCxHQUFtQixJQUFuQjs7QUFFQSxhQUFLYSxJQUFMOztBQUVBLFlBQUlkLE9BQU8sS0FBS1ksTUFBTCxDQUFZWixJQUF2QjtBQUNBLFlBQUlnRCx5QkFBSjtBQUNBLFlBQUtoRCxLQUFLUyxNQUFWLEVBQXdCdUMsTUFBTWhELEtBQUtTLE1BQUwsQ0FBWW1DLFNBQWxCO0FBQ3hCLFlBQUs1QyxLQUFLaUQsV0FBVixFQUF3QkQsTUFBTWhELEtBQUtpRCxXQUFYO0FBQ3hCLFlBQUtELElBQUlKLFNBQVQsRUFBd0JJLE1BQU1BLElBQUlKLFNBQVY7O0FBRXhCLFlBQUl2QyxNQUFPLDJCQUFpQjJDLEdBQWpCLEVBQXNCLEtBQUtwQyxNQUFMLENBQVlULElBQWxDLEVBQXdDLEtBQUtTLE1BQUwsQ0FBWVosSUFBcEQsQ0FBWDtBQUNBLFlBQUlrRCxPQUFPN0MsSUFBSThDLFFBQUosRUFBWDtBQUNBLGFBQUt2QyxNQUFMLENBQVliLEdBQVosR0FBa0JtRCxLQUFLLENBQUwsQ0FBbEI7QUFDQSxhQUFLdEMsTUFBTCxDQUFZUCxHQUFaLEdBQWtCNkMsS0FBSyxDQUFMLENBQWxCOztBQUVBLGVBQU8sS0FBS3RDLE1BQVo7QUFDSCxLOzs7OzRCQWxTZTtBQUNaLG1CQUFPLEtBQUtBLE1BQUwsQ0FBWWQsU0FBbkI7QUFDSDs7QUFFRDs7Ozs7Ozs0QkFJVztBQUNQLG1CQUFPLEtBQUtjLE1BQUwsQ0FBWVosSUFBbkI7QUFDSDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OzRCQVlVO0FBQ04sbUJBQU8sS0FBSzRDLFNBQUwsR0FBaUI3QyxHQUF4QjtBQUNIOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7NEJBWWM7QUFDVixtQkFBTyxLQUFLNkMsU0FBTCxHQUFpQlEsT0FBeEI7QUFDSDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OzRCQVlVO0FBQ04sbUJBQU8sS0FBS1IsU0FBTCxHQUFpQnZDLEdBQXhCO0FBQ0g7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBYVc7QUFDUCxtQkFBTyxLQUFLUyxJQUFMLEdBQVlYLElBQW5CO0FBQ0g7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBYWU7QUFDWCxtQkFBTyxLQUFLVyxJQUFMLEdBQVl1QyxRQUFuQjtBQUNIOzs7Ozs7a0JBME1VeEQsVTs7QUFFZjs7Ozs7QUFLQSIsImZpbGUiOiJsYXp5LXJlc3VsdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXBHZW5lcmF0b3IgZnJvbSAnLi9tYXAtZ2VuZXJhdG9yJztcbmltcG9ydCBzdHJpbmdpZnkgICAgZnJvbSAnLi9zdHJpbmdpZnknO1xuaW1wb3J0IHdhcm5PbmNlICAgICBmcm9tICcuL3dhcm4tb25jZSc7XG5pbXBvcnQgUmVzdWx0ICAgICAgIGZyb20gJy4vcmVzdWx0JztcbmltcG9ydCBwYXJzZSAgICAgICAgZnJvbSAnLi9wYXJzZSc7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZShvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIEEgUHJvbWlzZSBwcm94eSBmb3IgdGhlIHJlc3VsdCBvZiBQb3N0Q1NTIHRyYW5zZm9ybWF0aW9ucy5cbiAqXG4gKiBBIGBMYXp5UmVzdWx0YCBpbnN0YW5jZSBpcyByZXR1cm5lZCBieSB7QGxpbmsgUHJvY2Vzc29yI3Byb2Nlc3N9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBsYXp5ID0gcG9zdGNzcyhbY3NzbmV4dF0pLnByb2Nlc3MoY3NzKTtcbiAqL1xuY2xhc3MgTGF6eVJlc3VsdCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9jZXNzb3IsIGNzcywgb3B0cykge1xuICAgICAgICB0aGlzLnN0cmluZ2lmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkICAgPSBmYWxzZTtcblxuICAgICAgICBsZXQgcm9vdDtcbiAgICAgICAgaWYgKCB0eXBlb2YgY3NzID09PSAnb2JqZWN0JyAmJiBjc3MudHlwZSA9PT0gJ3Jvb3QnICkge1xuICAgICAgICAgICAgcm9vdCA9IGNzcztcbiAgICAgICAgfSBlbHNlIGlmICggY3NzIGluc3RhbmNlb2YgTGF6eVJlc3VsdCB8fCBjc3MgaW5zdGFuY2VvZiBSZXN1bHQgKSB7XG4gICAgICAgICAgICByb290ID0gY3NzLnJvb3Q7XG4gICAgICAgICAgICBpZiAoIGNzcy5tYXAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygb3B0cy5tYXAgPT09ICd1bmRlZmluZWQnICkgb3B0cy5tYXAgPSB7IH07XG4gICAgICAgICAgICAgICAgaWYgKCAhb3B0cy5tYXAuaW5saW5lICkgb3B0cy5tYXAuaW5saW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgb3B0cy5tYXAucHJldiA9IGNzcy5tYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VyID0gcGFyc2U7XG4gICAgICAgICAgICBpZiAoIG9wdHMuc3ludGF4ICkgIHBhcnNlciA9IG9wdHMuc3ludGF4LnBhcnNlO1xuICAgICAgICAgICAgaWYgKCBvcHRzLnBhcnNlciApICBwYXJzZXIgPSBvcHRzLnBhcnNlcjtcbiAgICAgICAgICAgIGlmICggcGFyc2VyLnBhcnNlICkgcGFyc2VyID0gcGFyc2VyLnBhcnNlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJvb3QgPSBwYXJzZXIoY3NzLCBvcHRzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXN1bHQgPSBuZXcgUmVzdWx0KHByb2Nlc3Nvciwgcm9vdCwgb3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBQcm9jZXNzb3J9IGluc3RhbmNlLCB3aGljaCB3aWxsIGJlIHVzZWRcbiAgICAgKiBmb3IgQ1NTIHRyYW5zZm9ybWF0aW9ucy5cbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yfVxuICAgICAqL1xuICAgIGdldCBwcm9jZXNzb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5wcm9jZXNzb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBmcm9tIHRoZSB7QGxpbmsgUHJvY2Vzc29yI3Byb2Nlc3N9IGNhbGwuXG4gICAgICogQHR5cGUge3Byb2Nlc3NPcHRpb25zfVxuICAgICAqL1xuICAgIGdldCBvcHRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQub3B0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgaW5wdXQgQ1NTIHRocm91Z2ggc3luY2hyb25vdXMgcGx1Z2lucywgY29udmVydHMgYFJvb3RgXG4gICAgICogdG8gYSBDU1Mgc3RyaW5nIGFuZCByZXR1cm5zIHtAbGluayBSZXN1bHQjY3NzfS5cbiAgICAgKlxuICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IHdvcmsgd2l0aCBzeW5jaHJvbm91cyBwbHVnaW5zLlxuICAgICAqIElmIHRoZSBwcm9jZXNzb3IgY29udGFpbnMgYW55IGFzeW5jaHJvbm91cyBwbHVnaW5zXG4gICAgICogaXQgd2lsbCB0aHJvdyBhbiBlcnJvci4gVGhpcyBpcyB3aHkgdGhpcyBtZXRob2QgaXMgb25seVxuICAgICAqIGZvciBkZWJ1ZyBwdXJwb3NlLCB5b3Ugc2hvdWxkIGFsd2F5cyB1c2Uge0BsaW5rIExhenlSZXN1bHQjdGhlbn0uXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBzZWUgUmVzdWx0I2Nzc1xuICAgICAqL1xuICAgIGdldCBjc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ2lmeSgpLmNzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbGlhcyBmb3IgdGhlIGBjc3NgIHByb3BlcnR5LiBVc2UgaXQgd2l0aCBzeW50YXhlc1xuICAgICAqIHRoYXQgZ2VuZXJhdGUgbm9uLUNTUyBvdXRwdXQuXG4gICAgICpcbiAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSB3b3JrIHdpdGggc3luY2hyb25vdXMgcGx1Z2lucy5cbiAgICAgKiBJZiB0aGUgcHJvY2Vzc29yIGNvbnRhaW5zIGFueSBhc3luY2hyb25vdXMgcGx1Z2luc1xuICAgICAqIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuIFRoaXMgaXMgd2h5IHRoaXMgbWV0aG9kIGlzIG9ubHlcbiAgICAgKiBmb3IgZGVidWcgcHVycG9zZSwgeW91IHNob3VsZCBhbHdheXMgdXNlIHtAbGluayBMYXp5UmVzdWx0I3RoZW59LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAc2VlIFJlc3VsdCNjb250ZW50XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ2lmeSgpLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGlucHV0IENTUyB0aHJvdWdoIHN5bmNocm9ub3VzIHBsdWdpbnNcbiAgICAgKiBhbmQgcmV0dXJucyB7QGxpbmsgUmVzdWx0I21hcH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSB3b3JrIHdpdGggc3luY2hyb25vdXMgcGx1Z2lucy5cbiAgICAgKiBJZiB0aGUgcHJvY2Vzc29yIGNvbnRhaW5zIGFueSBhc3luY2hyb25vdXMgcGx1Z2luc1xuICAgICAqIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuIFRoaXMgaXMgd2h5IHRoaXMgbWV0aG9kIGlzIG9ubHlcbiAgICAgKiBmb3IgZGVidWcgcHVycG9zZSwgeW91IHNob3VsZCBhbHdheXMgdXNlIHtAbGluayBMYXp5UmVzdWx0I3RoZW59LlxuICAgICAqXG4gICAgICogQHR5cGUge1NvdXJjZU1hcEdlbmVyYXRvcn1cbiAgICAgKiBAc2VlIFJlc3VsdCNtYXBcbiAgICAgKi9cbiAgICBnZXQgbWFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnkoKS5tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGlucHV0IENTUyB0aHJvdWdoIHN5bmNocm9ub3VzIHBsdWdpbnNcbiAgICAgKiBhbmQgcmV0dXJucyB7QGxpbmsgUmVzdWx0I3Jvb3R9LlxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgd29yayB3aXRoIHN5bmNocm9ub3VzIHBsdWdpbnMuIElmIHRoZSBwcm9jZXNzb3JcbiAgICAgKiBjb250YWlucyBhbnkgYXN5bmNocm9ub3VzIHBsdWdpbnMgaXQgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgd2h5IHRoaXMgbWV0aG9kIGlzIG9ubHkgZm9yIGRlYnVnIHB1cnBvc2UsXG4gICAgICogeW91IHNob3VsZCBhbHdheXMgdXNlIHtAbGluayBMYXp5UmVzdWx0I3RoZW59LlxuICAgICAqXG4gICAgICogQHR5cGUge1Jvb3R9XG4gICAgICogQHNlZSBSZXN1bHQjcm9vdFxuICAgICAqL1xuICAgIGdldCByb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jKCkucm9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgaW5wdXQgQ1NTIHRocm91Z2ggc3luY2hyb25vdXMgcGx1Z2luc1xuICAgICAqIGFuZCByZXR1cm5zIHtAbGluayBSZXN1bHQjbWVzc2FnZXN9LlxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgd29yayB3aXRoIHN5bmNocm9ub3VzIHBsdWdpbnMuIElmIHRoZSBwcm9jZXNzb3JcbiAgICAgKiBjb250YWlucyBhbnkgYXN5bmNocm9ub3VzIHBsdWdpbnMgaXQgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgd2h5IHRoaXMgbWV0aG9kIGlzIG9ubHkgZm9yIGRlYnVnIHB1cnBvc2UsXG4gICAgICogeW91IHNob3VsZCBhbHdheXMgdXNlIHtAbGluayBMYXp5UmVzdWx0I3RoZW59LlxuICAgICAqXG4gICAgICogQHR5cGUge01lc3NhZ2VbXX1cbiAgICAgKiBAc2VlIFJlc3VsdCNtZXNzYWdlc1xuICAgICAqL1xuICAgIGdldCBtZXNzYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYygpLm1lc3NhZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBpbnB1dCBDU1MgdGhyb3VnaCBzeW5jaHJvbm91cyBwbHVnaW5zXG4gICAgICogYW5kIGNhbGxzIHtAbGluayBSZXN1bHQjd2FybmluZ3MoKX0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtXYXJuaW5nW119IHdhcm5pbmdzIGZyb20gcGx1Z2luc1xuICAgICAqL1xuICAgIHdhcm5pbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jKCkud2FybmluZ3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgdGhlIHtAbGluayBMYXp5UmVzdWx0I2Nzc30gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxhenkgKyAnJyA9PT0gbGF6eS5jc3M7XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IG91dHB1dCBDU1NcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3NzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBpbnB1dCBDU1MgdGhyb3VnaCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHBsdWdpbnNcbiAgICAgKiBhbmQgY2FsbHMgYG9uRnVsZmlsbGVkYCB3aXRoIGEgUmVzdWx0IGluc3RhbmNlLiBJZiBhIHBsdWdpbiB0aHJvd3NcbiAgICAgKiBhbiBlcnJvciwgdGhlIGBvblJlamVjdGVkYCBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqXG4gICAgICogSXQgaW1wbGVtZW50cyBzdGFuZGFyZCBQcm9taXNlIEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b25GdWxmaWxsZWR9IG9uRnVsZmlsbGVkIC0gY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhbGwgcGx1Z2lucyB3aWxsIGZpbmlzaCB3b3JrXG4gICAgICogQHBhcmFtIHtvblJlamVjdGVkfSAgb25SZWplY3RlZCAgLSBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIG9uIGFueSBlcnJvclxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSBBUEkgdG8gbWFrZSBxdWV1ZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBwb3N0Y3NzKFtjc3NuZXh0XSkucHJvY2Vzcyhjc3MpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHJlc3VsdC5jc3MpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXN5bmMoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgaW5wdXQgQ1NTIHRocm91Z2ggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwbHVnaW5zXG4gICAgICogYW5kIGNhbGxzIG9uUmVqZWN0ZWQgZm9yIGVhY2ggZXJyb3IgdGhyb3duIGluIGFueSBwbHVnaW4uXG4gICAgICpcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHN0YW5kYXJkIFByb21pc2UgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvblJlamVjdGVkfSBvblJlamVjdGVkIC0gY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCBvbiBhbnkgZXJyb3JcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgQVBJIHRvIG1ha2UgcXVldWVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcG9zdGNzcyhbY3NzbmV4dF0pLnByb2Nlc3MoY3NzKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhyZXN1bHQuY3NzKTtcbiAgICAgKiB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICogICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzeW5jKCkuY2F0Y2gob25SZWplY3RlZCk7XG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIHBsdWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgaWYgKCBlcnJvci5uYW1lID09PSAnQ3NzU3ludGF4RXJyb3InICYmICFlcnJvci5wbHVnaW4gKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IucGx1Z2luID0gcGx1Z2luLnBvc3Rjc3NQbHVnaW47XG4gICAgICAgICAgICAgICAgZXJyb3Iuc2V0TWVzc2FnZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggcGx1Z2luLnBvc3Rjc3NWZXJzaW9uICkge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gcGx1Z2luLnBvc3Rjc3NQbHVnaW47XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpblZlciAgPSBwbHVnaW4ucG9zdGNzc1ZlcnNpb247XG4gICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVWZXIgPSB0aGlzLnJlc3VsdC5wcm9jZXNzb3IudmVyc2lvbjtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IHBsdWdpblZlci5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBiID0gcnVudGltZVZlci5zcGxpdCgnLicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCBhWzBdICE9PSBiWzBdIHx8IHBhcnNlSW50KGFbMV0pID4gcGFyc2VJbnQoYlsxXSkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdZb3VyIGN1cnJlbnQgUG9zdENTUyB2ZXJzaW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgJyArIHJ1bnRpbWVWZXIgKyAnLCBidXQgJyArIHBsdWdpbk5hbWUgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcyAnICsgcGx1Z2luVmVyICsgJy4gUGVyaGFwcyB0aGlzIGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IgYmVsb3cuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICggY29uc29sZSAmJiBjb25zb2xlLmVycm9yICkgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmNUaWNrKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAoIHRoaXMucGx1Z2luID49IHRoaXMucHJvY2Vzc29yLnBsdWdpbnMubGVuZ3RoICkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcGx1Z2luICA9IHRoaXMucHJvY2Vzc29yLnBsdWdpbnNbdGhpcy5wbHVnaW5dO1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSB0aGlzLnJ1bihwbHVnaW4pO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4gKz0gMTtcblxuICAgICAgICAgICAgaWYgKCBpc1Byb21pc2UocHJvbWlzZSkgKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bmNUaWNrKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciwgcGx1Z2luKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzeW5jVGljayhyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMoKSB7XG4gICAgICAgIGlmICggdGhpcy5wcm9jZXNzZWQgKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuZXJyb3IgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuc3RyaW5naWZ5KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICggdGhpcy5wcm9jZXNzaW5nICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2luZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IG5ldyBQcm9taXNlKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIHRoaXMuZXJyb3IgKSByZXR1cm4gcmVqZWN0KHRoaXMuZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4gPSAwO1xuICAgICAgICAgICAgdGhpcy5hc3luY1RpY2socmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5naWZ5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3Npbmc7XG4gICAgfVxuXG4gICAgc3luYygpIHtcbiAgICAgICAgaWYgKCB0aGlzLnByb2Nlc3NlZCApIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICggdGhpcy5wcm9jZXNzaW5nICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVc2UgcHJvY2Vzcyhjc3MpLnRoZW4oY2IpIHRvIHdvcmsgd2l0aCBhc3luYyBwbHVnaW5zJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRoaXMuZXJyb3IgKSB0aHJvdyB0aGlzLmVycm9yO1xuXG4gICAgICAgIGZvciAoIGxldCBwbHVnaW4gb2YgdGhpcy5yZXN1bHQucHJvY2Vzc29yLnBsdWdpbnMgKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHRoaXMucnVuKHBsdWdpbik7XG4gICAgICAgICAgICBpZiAoIGlzUHJvbWlzZShwcm9taXNlKSApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdVc2UgcHJvY2Vzcyhjc3MpLnRoZW4oY2IpIHRvIHdvcmsgd2l0aCBhc3luYyBwbHVnaW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gICAgfVxuXG4gICAgcnVuKHBsdWdpbikge1xuICAgICAgICB0aGlzLnJlc3VsdC5sYXN0UGx1Z2luID0gcGx1Z2luO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gcGx1Z2luKHRoaXMucmVzdWx0LnJvb3QsIHRoaXMucmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIHBsdWdpbik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgaWYgKCB0aGlzLnN0cmluZ2lmaWVkICkgcmV0dXJuIHRoaXMucmVzdWx0O1xuICAgICAgICB0aGlzLnN0cmluZ2lmaWVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnN5bmMoKTtcblxuICAgICAgICBsZXQgb3B0cyA9IHRoaXMucmVzdWx0Lm9wdHM7XG4gICAgICAgIGxldCBzdHIgID0gc3RyaW5naWZ5O1xuICAgICAgICBpZiAoIG9wdHMuc3ludGF4ICkgICAgICBzdHIgPSBvcHRzLnN5bnRheC5zdHJpbmdpZnk7XG4gICAgICAgIGlmICggb3B0cy5zdHJpbmdpZmllciApIHN0ciA9IG9wdHMuc3RyaW5naWZpZXI7XG4gICAgICAgIGlmICggc3RyLnN0cmluZ2lmeSApICAgIHN0ciA9IHN0ci5zdHJpbmdpZnk7XG5cbiAgICAgICAgbGV0IG1hcCAgPSBuZXcgTWFwR2VuZXJhdG9yKHN0ciwgdGhpcy5yZXN1bHQucm9vdCwgdGhpcy5yZXN1bHQub3B0cyk7XG4gICAgICAgIGxldCBkYXRhID0gbWFwLmdlbmVyYXRlKCk7XG4gICAgICAgIHRoaXMucmVzdWx0LmNzcyA9IGRhdGFbMF07XG4gICAgICAgIHRoaXMucmVzdWx0Lm1hcCA9IGRhdGFbMV07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBMYXp5UmVzdWx0O1xuXG4vKipcbiAqIEBjYWxsYmFjayBvbkZ1bGZpbGxlZFxuICogQHBhcmFtIHtSZXN1bHR9IHJlc3VsdFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIG9uUmVqZWN0ZWRcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiJdfQ==