UNPKG

text-rpg-engine

Version:

Library to create text adventures / interactive fiction with custom user interactions

2 lines 55.9 kB
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("text-rpg-engine",[],t):"object"==typeof exports?exports["text-rpg-engine"]=t():e["text-rpg-engine"]=t()}("undefined"!=typeof self?self:this,function(){return function(e){var t={};function o(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)o.d(n,r,function(t){return e[t]}.bind(null,r));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([function(e,t,o){"use strict";function n(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.items=t}var t,o,r;return t=e,(o=[{key:"addItems",value:function(e){return this.items=this.items.concat(e),this.items}},{key:"dropItem",value:function(e){var t=this.items.filter(function(t){return t.name!==e});return this.items=t,this.items}}])&&n(t.prototype,o),r&&n(t,r),e}();t.default=r,e.exports=t.default},function(e,t,o){"use strict";var n;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=new(((n=o(2))&&n.__esModule?n:{default:n}).default);t.default=r,e.exports=t.default},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(o(3)),r=u(o(4)),i=u(o(5)),s=u(o(6)),a=u(o(0));function u(e){return e&&e.__esModule?e:{default:e}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var o=[],n=!0,r=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!t||o.length!==t);n=!0);}catch(e){r=!0,i=e}finally{try{n||null==a.return||a.return()}finally{if(r)throw i}}return o}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function c(e){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function f(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var h=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=(arguments.length>1&&void 0!==arguments[1]&&arguments[1],arguments.length>2&&void 0!==arguments[2]?arguments[2]:""),s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.Display=new n.default,this.Input=new r.default,this.rooms=[];var a=this;t.forEach(function(e){a.addRoom(e.name,e.getText,e.prompts,e.requirements)}),this.startRoom=o,this.endRoom=s,""===this.startRoom&&this.rooms.length>0&&(this.startRoom=this.rooms[0].name,this.Player.startRoom=this.startRoom,this.Player.currentRoom=this.Player.startRoom),""===this.endRoom&&this.rooms.length>1&&(this.endRoom=this.rooms[this.rooms.length-1].name),this.Player=new i.default(o=this.startRoom)}var t,o,u;return t=e,(o=[{key:"init",value:function(){var e;""===this.startRoom&&this.rooms.length>0&&(this.startRoom=this.rooms[0].name,this.Player.startRoom=this.startRoom,this.Player.currentRoom=this.Player.startRoom),""===this.endRoom&&this.rooms.length>1&&(this.endRoom=this.rooms[this.rooms.length-1].name);for(var t=0;t<this.rooms.length;t++)if(this.rooms[t].name===this.startRoom){e=this.rooms[t].getText;break}void 0===e&&(e="No starting room text found!"),this.Display.show(e)}},{key:"loadData",value:function(e){var t=this;e.game.rooms.forEach(function(e){var o=[],n=[];void 0!==e.prompts&&(o=e.prompts),void 0!==e.requirements&&(n=e.requiurements),t.addRoom(e.name,e.getText,o,n)}),void 0!==e.startRoom&&(this.startRoom=e.startRoom,this.Player.startRoom=e.startRoom),void 0!==e.endRoom&&(this.endRoom=e.endRoom),""!==this.startRoom&&void 0!==this.startRoom||this.rooms.length>0&&(this.startRoom=this.rooms[0].name,this.Player.startRoom=this.startRoom,this.Player.currentRoom=this.Player.startRoom),""!==this.endRoom&&void 0!==this.endRoom||this.rooms.length>1&&(this.endRoom=this.rooms[this.rooms.length-1].name)}},{key:"addRoom",value:function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],r=new s.default(e,t,o,n);return this.rooms.push(r),r}},{key:"dropRoom",value:function(e){var t=this.rooms.filter(function(t){return t.name!==e});return this.rooms=t,this.rooms}},{key:"getRoom",value:function(e){return this.rooms.find(function(t){return t.name===e})}},{key:"userSend",value:function(e){this.Input.send(e),this.decidePath(this.Input.value)}},{key:"decidePath",value:function(e){"restart"===e&&this.resetGame();var t=this,o=t.getRoom(t.Player.currentRoom);if(void 0!==c(o.prompts)){var n=!1;o.prompts.forEach(function(o){try{if(!1===n){var r=o.matchKeywords(e,t.Player.inventory.items);if(null!==r){if(n=!0,"success"in r&&(t.Display.show("<p>".concat(r.success.successText,"</p>")),void 0!==r.success.itemsGiven&&t.Player.inventory.addItems(r.success.itemsGiven),void 0!==r.success.roomToEnter)){var i,s,a=l(t.Player.enterRoom(t.getRoom(r.success.roomToEnter)),2);s=a[0],i=a[1],t.Display.append("<p>".concat(s,"</p>")),i&&r.success.roomToEnter===t.endRoom&&t.win()}if("fail"in r)return t.Display.show("".concat(r.fail.failText)),void t.Display.append("<p>Missing required items: ".concat(r.fail.missing.toString(),".</p>\n <p>").concat(t.getRoom(t.Player.currentRoom).getText,"</p>"))}}}catch(e){console.log(e)}!1===n&&t.Display.show('<p>No actions could be done from: "'.concat(e,"\". Try something else, or be\n more specific about what you're doing.</p>\n <p>").concat(t.getRoom(t.Player.currentRoom).getText,"</p>"))})}else t.Display.show("<p>There doesn't seem to be any actions at all that you can do in this room.</p>\n ".concat(t.getRoom(t.Player.currentRoom).getText,"\n "));console.log(e,this.Player)}},{key:"disableInput",value:function(){this.Input.disable()}},{key:"enableInput",value:function(){this.Input.enable()}},{key:"win",value:function(){for(var e=0;e<this.rooms.length;e++)if(this.rooms[e].name===this.endRoom){this.Display.append("<p>Game end.</p>");break}this.disableInput()}},{key:"resetGame",value:function(){this.Player.inventory=new a.default,this.Player.currentRoom=this.startRoom;var e=this.getRoom(this.startRoom);this.Display.show(e.getText),this.Input.enable()}}])&&f(t.prototype,o),u&&f(t,u),e}();t.default=h,e.exports=t.default},function(e,t,o){"use strict";function n(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"display";!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.html=t,this.elementId=o}var t,o,r;return t=e,(o=[{key:"show",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;null===e?document.getElementById(this.elementId).innerHTML=this.html:(document.getElementById(this.elementId).innerHTML=e,this.html=e)}},{key:"append",value:function(e){document.getElementById(this.elementId).innerHTML+=e}}])&&n(t.prototype,o),r&&n(t,r),e}();t.default=r,e.exports=t.default},function(e,t,o){"use strict";function n(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"input";!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.disabled=t,this.value=o,this.elementId=n}var t,o,r;return t=e,(o=[{key:"enable",value:function(){this.disabled=!1,document.getElementById("input").disabled=!1}},{key:"disable",value:function(){this.disabled=!0,document.getElementById("input").disabled=!0}},{key:"send",value:function(e){e=e.toLowerCase(),this.value=e}}])&&n(t.prototype,o),r&&n(t,r),e}();t.default=r,e.exports=t.default},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,r=(n=o(0))&&n.__esModule?n:{default:n};function i(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var s=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new r.default,n=(arguments.length>2&&void 0!==arguments[2]&&arguments[2],arguments[3]);!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=t,""===this.name&&(this.name="player"),this.inventory=o,""===this.currentRoom&&(this.currentRoom=this.startRoom),this.startRoom=n}var t,o,n;return t=e,(o=[{key:"enterRoom",value:function(e){var t=e.enter(this.inventory.items);return!1===t[1]||(this.currentRoom=e.name),[t[0],t[1]]}},{key:"getItem",value:function(e){return this.inventory.addItem(e),this.inventory}},{key:"dropItem",value:function(e){return this.inventory.dropItem(e),this.inventory}}])&&i(t.prototype,o),n&&i(t,n),e}();t.default=s,e.exports=t.default},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n,r=(n=o(7))&&n.__esModule?n:{default:n};function i(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var s=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=t,this.getText=o;var i=this;this.prompts=[],n.forEach(function(e){i.addPrompt(e.name,e.keywords,e.results,e.requirements)}),this.requirements=r}var t,o,n;return t=e,(o=[{key:"addPrompt",value:function(e,t,o,n){var i=new r.default(e,t,o,n);return this.prompts.push(i),this.prompts}},{key:"enter",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t="",o=!0;return this.requirements>0?0===e.length?(o=!1,this.requirements.forEach(function(e){t+="".concat(e.failText,". ")})):(this.requirements.forEach(function(e){var n=!1;this.items.forEach(function(t){t===e&&(n=!0)}),!1===n&&(o=!1,t+=e.failText)}),!0===o&&(t=this.getText)):t=this.getText,[t,o]}}])&&i(t.prototype,o),n&&i(t,n),e}();t.default=s,e.exports=t.default},function(e,t,o){"use strict";function n(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=t,this.keywords=o.map(function(e){return e.toLowerCase()}),this.results=n,this.requirements=r}var t,o,r;return t=e,(o=[{key:"matchKeywords",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=!1,n=[];return this.requirements.length>0&&this.requirements.forEach(function(e){var o=!1;t.forEach(function(t){t===e&&(o=!0)}),o||n.push(e)}),this.keywords.forEach(function(t){e.includes(t.toLowerCase())&&(o=!0)}),o?n.length>0?{fail:{missing:n,failText:this.results.failText}}:{success:this.results}:null}}])&&n(t.prototype,o),r&&n(t,r),e}();t.default=r,e.exports=t.default}])}); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3RleHQtcnBnLWVuZ2luZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvLi9zcmMvaW52ZW50b3J5LmpzIiwid2VicGFjazovL3RleHQtcnBnLWVuZ2luZS8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvLi9zcmMvZ2FtZS5qcyIsIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvLi9zcmMvZGlzcGxheS5qcyIsIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvLi9zcmMvaW5wdXQuanMiLCJ3ZWJwYWNrOi8vdGV4dC1ycGctZW5naW5lLy4vc3JjL3BsYXllci5qcyIsIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvLi9zcmMvcm9vbS5qcyIsIndlYnBhY2s6Ly90ZXh0LXJwZy1lbmdpbmUvLi9zcmMvcHJvbXB0LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJ0aGlzIiwiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkludmVudG9yeSIsIml0ZW1zIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX2NsYXNzQ2FsbENoZWNrIiwiY29uY2F0IiwiaXRlbU5hbWUiLCJuZXdJbnZlbnRvcnkiLCJmaWx0ZXIiLCJpdGVtIiwiZGVmYXVsdCIsIl9kaXNwbGF5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9pbnB1dCIsIl9wbGF5ZXIiLCJfcm9vbSIsIl9pbnZlbnRvcnkiLCJHYW1lIiwicm9vbXMiLCJzdGFydFJvb20iLCJlbmRSb29tIiwiRGlzcGxheSIsIklucHV0IiwiX3RoaXMiLCJmb3JFYWNoIiwicm9vbSIsImFkZFJvb20iLCJnZXRUZXh0IiwicHJvbXB0cyIsInJlcXVpcmVtZW50cyIsIlBsYXllciIsImN1cnJlbnRSb29tIiwiZGlzcGxheVRleHQiLCJzaG93IiwiZ2FtZURhdGEiLCJnYW1lIiwicm9vbVByb21wdHMiLCJyb29tUmVxdWlyZW1lbnRzIiwicmVxdWl1cmVtZW50cyIsInJvb21PYmoiLCJwdXNoIiwicm9vbU5hbWUiLCJuZXdSb29tcyIsImZpbmQiLCJ4IiwibWVzc2FnZSIsInNlbmQiLCJkZWNpZGVQYXRoIiwicmVzZXRHYW1lIiwiY3VyclJvb20iLCJnZXRSb29tIiwiX3R5cGVvZiIsImZvdW5kUHJvbXB0IiwicHJvbXB0IiwibWF0Y2hpbmdQcm9tcHRSZXN1bHRzIiwibWF0Y2hLZXl3b3JkcyIsImludmVudG9yeSIsInN1Y2Nlc3MiLCJzdWNjZXNzVGV4dCIsIml0ZW1zR2l2ZW4iLCJhZGRJdGVtcyIsInJvb21Ub0VudGVyIiwiZW50ZXJSb29tUmVzdWx0U3VjY2VzcyIsImVudGVyUm9vbVJlc3VsdFRleHQiLCJfdGhpcyRQbGF5ZXIkZW50ZXJSb28yIiwiX3NsaWNlZFRvQXJyYXkiLCJlbnRlclJvb20iLCJhcHBlbmQiLCJ3aW4iLCJmYWlsIiwiZmFpbFRleHQiLCJtaXNzaW5nIiwidG9TdHJpbmciLCJlcnIiLCJjb25zb2xlIiwibG9nIiwiZGlzYWJsZSIsImVuYWJsZSIsImRpc2FibGVJbnB1dCIsImh0bWwiLCJlbGVtZW50SWQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaW5uZXJIVE1MIiwiZGlzYWJsZWQiLCJ0b0xvd2VyQ2FzZSIsInJvb21SZXN1bHQiLCJlbnRlciIsImFkZEl0ZW0iLCJkcm9wSXRlbSIsIl9wcm9tcHQiLCJSb29tIiwiYWRkUHJvbXB0Iiwia2V5d29yZHMiLCJyZXN1bHRzIiwicmVzdWx0VGV4dCIsIm1ldEFsbFJlcXVpcmVtZW50cyIsInJlcXVpcmVtZW50IiwiZm91bmQiLCJQcm9tcHQiLCJtYXAiLCJ2IiwiZm91bmRLZXl3b3JkIiwibWlzc2luZ1JlcXVpcmVtZW50cyIsImZvdW5kUmVxdWlyZW1lbnQiLCJrZXl3b3JkIiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiJDQUFBLFNBQUFBLEVBQUFDLEdBQ0EsaUJBQUFDLFNBQUEsaUJBQUFDLE9BQ0FBLE9BQUFELFFBQUFELElBQ0EsbUJBQUFHLGVBQUFDLElBQ0FELE9BQUEscUJBQUFILEdBQ0EsaUJBQUFDLFFBQ0FBLFFBQUEsbUJBQUFELElBRUFELEVBQUEsbUJBQUFDLElBUkEsQ0FTQyxvQkFBQUssVUFBQUMsS0FBQSxXQUNELG1CQ1RBLElBQUFDLEVBQUEsR0FHQSxTQUFBQyxFQUFBQyxHQUdBLEdBQUFGLEVBQUFFLEdBQ0EsT0FBQUYsRUFBQUUsR0FBQVIsUUFHQSxJQUFBQyxFQUFBSyxFQUFBRSxHQUFBLENBQ0FDLEVBQUFELEVBQ0FFLEdBQUEsRUFDQVYsUUFBQSxJQVVBLE9BTkFXLEVBQUFILEdBQUFJLEtBQUFYLEVBQUFELFFBQUFDLElBQUFELFFBQUFPLEdBR0FOLEVBQUFTLEdBQUEsRUFHQVQsRUFBQUQsUUEwREEsT0FyREFPLEVBQUFNLEVBQUFGLEVBR0FKLEVBQUFPLEVBQUFSLEVBR0FDLEVBQUFRLEVBQUEsU0FBQWYsRUFBQWdCLEVBQUFDLEdBQ0FWLEVBQUFXLEVBQUFsQixFQUFBZ0IsSUFDQUcsT0FBQUMsZUFBQXBCLEVBQUFnQixFQUFBLENBQTBDSyxZQUFBLEVBQUFDLElBQUFMLEtBSzFDVixFQUFBZ0IsRUFBQSxTQUFBdkIsR0FDQSxv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S1csS0FBT0EsRUFFWlgsS0FBS2tJLFNBQVdBLEVBQVNPLElBQUksU0FBVUMsR0FBSyxPQUFPQSxFQUFFaEIsZ0JBSXJEMUgsS0FBS21JLFFBQVVBLEVBRWZuSSxLQUFLa0UsYUFBZUEsK0RBSVJnQixHQUFxQixJQUFaN0MsRUFBWUMsVUFBQUMsT0FBQSxRQUFBQyxJQUFBRixVQUFBLEdBQUFBLFVBQUEsR0FBSixHQUN6QnFHLEdBQWUsRUFDZkMsRUFBc0IsR0EyQjFCLE9BeEJJNUksS0FBS2tFLGFBQWEzQixPQUFTLEdBRTdCdkMsS0FBS2tFLGFBQWFMLFFBQVEsU0FBVXlFLEdBQ2xDLElBQUlPLEdBQW1CLEVBRXZCeEcsRUFBTXdCLFFBQVEsU0FBVWYsR0FDbEJBLElBQVN3RixJQUNYTyxHQUFtQixLQUlsQkEsR0FDSEQsRUFBb0IvRCxLQUFLeUQsS0FNL0J0SSxLQUFLa0ksU0FBU3JFLFFBQVEsU0FBVWlGLEdBQzFCNUQsRUFBUTZELFNBQVNELEVBQVFwQixpQkFDM0JpQixHQUFlLEtBSWZBLEVBRUVDLEVBQW9CckcsT0FBUyxFQUV4QixDQUFDbUUsS0FBUSxDQUNkRSxRQUFXZ0MsRUFDWGpDLFNBQVkzRyxLQUFLbUksUUFBUXhCLFdBSXRCLENBQUNiLFFBQVc5RixLQUFLbUksU0FFbkIiLCJmaWxlIjoidGV4dC1ycGctZW5naW5lLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwidGV4dC1ycGctZW5naW5lXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInRleHQtcnBnLWVuZ2luZVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJ0ZXh0LXJwZy1lbmdpbmVcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEpO1xuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52ZW50b3J5IHtcclxuXHJcbiAgY29uc3RydWN0b3IoaXRlbXMgPSBbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGFkZCBzaW5nbGUgb3IgbXVsdGlwbGUgaXRlbXMsIGFzIGxvbmcgYXMgdGhlXHJcbiAgLy8gcGFzc2VkIHZhbHVlIGlzIGFuIGFycmF5XHJcbiAgYWRkSXRlbXMoaXRlbXMpIHtcclxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmNvbmNhdChpdGVtcyk7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcztcclxuICB9XHJcblxyXG4gIGRyb3BJdGVtKGl0ZW1OYW1lKSB7XHJcbiAgICBsZXQgbmV3SW52ZW50b3J5ID0gdGhpcy5pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW0ubmFtZSAhPT0gaXRlbU5hbWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLml0ZW1zID0gbmV3SW52ZW50b3J5O1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG59XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuaW1wb3J0IEdhbWUgZnJvbSAnLi9nYW1lJztcclxuXHJcbmNvbnN0IGdhbWUgPSBuZXcgR2FtZSgpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2FtZTtcclxuIiwiaW1wb3J0IERpc3BsYXkgZnJvbSAnLi9kaXNwbGF5JztcclxuaW1wb3J0IElucHV0IGZyb20gJy4vaW5wdXQnO1xyXG5pbXBvcnQgUGxheWVyIGZyb20gJy4vcGxheWVyJztcclxuaW1wb3J0IFJvb20gZnJvbSAnLi9yb29tJztcclxuaW1wb3J0IEludmVudG9yeSBmcm9tICcuL2ludmVudG9yeSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lIHtcclxuXHJcbiAgY29uc3RydWN0b3Iocm9vbXMgPSBbXSwgaXRlbXMgPSBbXSwgc3RhcnRSb29tID0gJycsIGVuZFJvb20gPSAnJykge1xyXG4gICAgdGhpcy5EaXNwbGF5ID0gbmV3IERpc3BsYXkoKTtcclxuICAgIHRoaXMuSW5wdXQgPSBuZXcgSW5wdXQoKTtcclxuICAgIHRoaXMucm9vbXMgPSBbXTsgLy8gQWxsIHRoZSByb29tcyBpbiBvdXIgZ2FtZVxyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJvb21zLmZvckVhY2goZnVuY3Rpb24gKHJvb20pIHtcclxuICAgICAgX3RoaXMuYWRkUm9vbShyb29tLm5hbWUsIHJvb20uZ2V0VGV4dCwgcm9vbS5wcm9tcHRzLCByb29tLnJlcXVpcmVtZW50cyk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RhcnRSb29tID0gc3RhcnRSb29tOyAvLyBXaGljaCByb29tIHdpbGwgdGhlIHBsYXllciBzdGFydCBpblxyXG4gICAgdGhpcy5lbmRSb29tID0gZW5kUm9vbTsgLy8gV2hpY2ggcm9vbSBpcyB0aGUgd2lubmluZyAvIGdhbWUgZW5kXHJcblxyXG4gICAgLy8gSWYgZ2FtZSB3YXNuJ3QgaW5pdGlhbGl6ZWQgd2l0aCBhIHN0YXJ0Um9vbSwgc2V0IGl0IHRvIHRoZSBmaXJzdCByb29tXHJcbiAgICBpZiAodGhpcy5zdGFydFJvb20gPT09ICcnICYmIHRoaXMucm9vbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnN0YXJ0Um9vbSA9IHRoaXMucm9vbXNbMF0ubmFtZTtcclxuICAgICAgdGhpcy5QbGF5ZXIuc3RhcnRSb29tID0gdGhpcy5zdGFydFJvb207XHJcbiAgICAgIHRoaXMuUGxheWVyLmN1cnJlbnRSb29tID0gdGhpcy5QbGF5ZXIuc3RhcnRSb29tO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgZ2FtZSB3YXNuJ3QgaW5pdGlhbGl6ZWQgd2l0aCBhIGVuZFJvb20sIHNldCBpdCB0byB0aGUgbGFzdCByb29tXHJcbiAgICBpZiAodGhpcy5lbmRSb29tID09PSAnJyAmJiB0aGlzLnJvb21zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5lbmRSb29tID0gdGhpcy5yb29tc1t0aGlzLnJvb21zLmxlbmd0aCAtIDFdLm5hbWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLlBsYXllciA9IG5ldyBQbGF5ZXIoc3RhcnRSb29tID0gdGhpcy5zdGFydFJvb20pO1xyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIGxldCBkaXNwbGF5VGV4dDtcclxuXHJcbiAgICAvLyBJZiBnYW1lIHdhc24ndCBpbml0aWFsaXplZCB3aXRoIGEgc3RhcnRSb29tLCBzZXQgaXQgdG8gdGhlIGZpcnN0IHJvb21cclxuICAgIGlmICh0aGlzLnN0YXJ0Um9vbSA9PT0gJycgJiYgdGhpcy5yb29tcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRSb29tID0gdGhpcy5yb29tc1swXS5uYW1lO1xyXG4gICAgICB0aGlzLlBsYXllci5zdGFydFJvb20gPSB0aGlzLnN0YXJ0Um9vbTtcclxuICAgICAgdGhpcy5QbGF5ZXIuY3VycmVudFJvb20gPSB0aGlzLlBsYXllci5zdGFydFJvb207XHJcbiAgICB9XHJcbiAgICAvLyBJZiBnYW1lIHdhc24ndCBpbml0aWFsaXplZCB3aXRoIGEgZW5kUm9vbSwgc2V0IGl0IHRvIHRoZSBsYXN0IHJvb21cclxuICAgIGlmICh0aGlzLmVuZFJvb20gPT09ICcnICYmIHRoaXMucm9vbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLmVuZFJvb20gPSB0aGlzLnJvb21zW3RoaXMucm9vbXMubGVuZ3RoIC0gMV0ubmFtZTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb29tcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5yb29tc1tpXS5uYW1lID09PSB0aGlzLnN0YXJ0Um9vbSkge1xyXG4gICAgICAgIGRpc3BsYXlUZXh0ID0gdGhpcy5yb29tc1tpXS5nZXRUZXh0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZGlzcGxheVRleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBkaXNwbGF5VGV4dCA9ICdObyBzdGFydGluZyByb29tIHRleHQgZm91bmQhJztcclxuICAgIH1cclxuICAgIHRoaXMuRGlzcGxheS5zaG93KGRpc3BsYXlUZXh0KTtcclxuICB9XHJcblxyXG4gIC8vIExvYWRzIGdhbWUgZGF0YSBmcm9tIEpTT04gb2JqZWN0IHBhc3NlZFxyXG4gIGxvYWREYXRhKGdhbWVEYXRhKSB7XHJcbiAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZ2FtZURhdGEuZ2FtZS5yb29tcy5mb3JFYWNoKGZ1bmN0aW9uIChyb29tKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJvb20pO1xyXG4gICAgICBsZXQgcm9vbVByb21wdHMgPSBbXTtcclxuICAgICAgbGV0IHJvb21SZXF1aXJlbWVudHMgPSBbXTtcclxuXHJcbiAgICAgIC8vIFJvb20gcHJvbXB0cyBhbmQgcmVxdWlyZW1lbnRzIGFyZSBvcHRpb25hbCBzbyBoYW5kbGUgdGhhdFxyXG4gICAgICBpZiAocm9vbS5wcm9tcHRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByb29tUHJvbXB0cyA9IHJvb20ucHJvbXB0cztcclxuICAgICAgfVxyXG4gICAgICBpZiAocm9vbS5yZXF1aXJlbWVudHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJvb21SZXF1aXJlbWVudHMgPSByb29tLnJlcXVpdXJlbWVudHM7XHJcbiAgICAgIH1cclxuICAgICAgX3RoaXMuYWRkUm9vbShyb29tLm5hbWUsIHJvb20uZ2V0VGV4dCwgcm9vbVByb21wdHMsIHJvb21SZXF1aXJlbWVudHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGdhbWVEYXRhLnN0YXJ0Um9vbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRSb29tID0gZ2FtZURhdGEuc3RhcnRSb29tO1xyXG4gICAgICB0aGlzLlBsYXllci5zdGFydFJvb20gPSBnYW1lRGF0YS5zdGFydFJvb207XHJcbiAgICB9XHJcbiAgICBpZiAoZ2FtZURhdGEuZW5kUm9vbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuZW5kUm9vbSA9IGdhbWVEYXRhLmVuZFJvb207XHJcbiAgICB9XHJcbiAgICAvLyBJZiBnYW1lIHdhc24ndCBpbml0aWFsaXplZCB3aXRoIGEgc3RhcnRSb29tLCBzZXQgaXQgdG8gdGhlIGZpcnN0IHJvb21cclxuICAgIGlmICh0aGlzLnN0YXJ0Um9vbSA9PT0gJycgfHwgdGhpcy5zdGFydFJvb20gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5yb29tcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFJvb20gPSB0aGlzLnJvb21zWzBdLm5hbWU7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXIuc3RhcnRSb29tID0gdGhpcy5zdGFydFJvb207XHJcbiAgICAgICAgdGhpcy5QbGF5ZXIuY3VycmVudFJvb20gPSB0aGlzLlBsYXllci5zdGFydFJvb207XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIElmIGdhbWUgd2Fzbid0IGluaXRpYWxpemVkIHdpdGggYSBlbmRSb29tLCBzZXQgaXQgdG8gdGhlIGxhc3Qgcm9vbVxyXG4gICAgaWYgKHRoaXMuZW5kUm9vbSA9PT0gJycgfHwgdGhpcy5lbmRSb29tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMucm9vbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHRoaXMuZW5kUm9vbSA9IHRoaXMucm9vbXNbdGhpcy5yb29tcy5sZW5ndGggLSAxXS5uYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNYW5hZ2Ugcm9vbXNcclxuICBhZGRSb29tKG5hbWUsIGdldFRleHQsIHByb21wdHMgPSBbXSwgcmVxdWlyZW1lbnRzID0gW10pIHtcclxuICAgIGxldCByb29tT2JqID0gbmV3IFJvb20obmFtZSwgZ2V0VGV4dCwgcHJvbXB0cywgcmVxdWlyZW1lbnRzKTtcclxuXHJcbiAgICB0aGlzLnJvb21zLnB1c2gocm9vbU9iaik7XHJcbiAgICByZXR1cm4gcm9vbU9iajtcclxuICB9XHJcblxyXG4gIGRyb3BSb29tKHJvb21OYW1lKSB7XHJcbiAgICBsZXQgbmV3Um9vbXMgPSB0aGlzLnJvb21zLmZpbHRlcihmdW5jdGlvbiAocm9vbSkge1xyXG4gICAgICByZXR1cm4gcm9vbS5uYW1lICE9PSByb29tTmFtZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucm9vbXMgPSBuZXdSb29tcztcclxuICAgIHJldHVybiB0aGlzLnJvb21zO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJucyByb29tIG9iamVjdCAocHJvcGVydGllcykgZ2l2ZW4gdGhlIG5hbWVcclxuICBnZXRSb29tKHJvb21OYW1lKSB7XHJcbiAgICBjb25zdCByb29tID0gdGhpcy5yb29tcy5maW5kKHggPT4geC5uYW1lID09PSByb29tTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIHJvb207XHJcbiAgfVxyXG5cclxuICAvLyBVc2VyIGlucHV0XHJcbiAgdXNlclNlbmQobWVzc2FnZSkge1xyXG4gICAgLy8gT3VyIElucHV0IGNsYXNzIHdpbGwgaGFuZGxlIGNsZWFuaW5nIC8gbm9ybWFsaXppbmcgc3RyaW5nc1xyXG4gICAgdGhpcy5JbnB1dC5zZW5kKG1lc3NhZ2UpO1xyXG4gICAgdGhpcy5kZWNpZGVQYXRoKHRoaXMuSW5wdXQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gR2FtZSBBSVxyXG4gIGRlY2lkZVBhdGgobWVzc2FnZSkge1xyXG4gICAgaWYgKG1lc3NhZ2UgPT09ICdyZXN0YXJ0Jykge1xyXG4gICAgICB0aGlzLnJlc2V0R2FtZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgY29uc3QgY3VyclJvb20gPSBfdGhpcy5nZXRSb29tKF90aGlzLlBsYXllci5jdXJyZW50Um9vbSk7XHJcblxyXG4gICAgLy8gRG8gd2UgaGF2ZSBhY3Rpb25zIHRoYXQgd2UgY2FuIGRvIGluIHRoZSByb29tP1xyXG4gICAgaWYgKHR5cGVvZiBjdXJyUm9vbS5wcm9tcHRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gQ2hlY2sgZXZlcnkgcHJvbXB0IGFjdGlvbiB0byBzZWUgaWYgaXQgbWF0Y2hlcyBvdXIgaW5wdXQga2V5d29yZHNcclxuICAgICAgLy8gRm9yIG5vdyBqdXN0IGdldCB0aGUgZmlyc3QgbWF0Y2hpbmcgcHJvbXB0IGFuZCBkbyB0aGF0XHJcbiAgICAgIGxldCBmb3VuZFByb21wdCA9IGZhbHNlO1xyXG5cclxuICAgICAgY3VyclJvb20ucHJvbXB0cy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9tcHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKGZvdW5kUHJvbXB0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1Byb21wdFJlc3VsdHMgPSBwcm9tcHQubWF0Y2hLZXl3b3JkcyhtZXNzYWdlLCBfdGhpcy5QbGF5ZXIuaW52ZW50b3J5Lml0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHdlIGdldCBhIG1hdGNoaW5nIHJlc3VsdCBiYWNrXHJcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1Byb21wdFJlc3VsdHMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAvLyBUaGlzIHByb21wdCBoYXMga2V5d29yZHMgdGhhdCBtYXRjaCB0aGUgdXNlcidzIGlucHV0XHJcbiAgICAgICAgICAgICAgZm91bmRQcm9tcHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIC8vIElmIHBsYXllciBzdWNjZWVkZWQgaW4gcHJvbXB0IGFjdGlvblxyXG4gICAgICAgICAgICAgIGlmICgnc3VjY2VzcycgaW4gbWF0Y2hpbmdQcm9tcHRSZXN1bHRzKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5EaXNwbGF5LnNob3coYDxwPiR7bWF0Y2hpbmdQcm9tcHRSZXN1bHRzLnN1Y2Nlc3Muc3VjY2Vzc1RleHR9PC9wPmApO1xyXG4gICAgICAgICAgICAgICAgLy8gR2V0IGl0ZW1zIGZyb20gcHJvbXB0IGlmIGFueSBhcmUgcmV0dXJuZWQgYW5kIGFkZCB0aGVtIHRvIGludmVudG9yeVxyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nUHJvbXB0UmVzdWx0cy5zdWNjZXNzLml0ZW1zR2l2ZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy5QbGF5ZXIuaW52ZW50b3J5LmFkZEl0ZW1zKG1hdGNoaW5nUHJvbXB0UmVzdWx0cy5zdWNjZXNzLml0ZW1zR2l2ZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByb21wdCBzdWNjZXNzIHJlc3VsdCBpbmNsdWRlcyBlbnRlcmluZyBhIG5ldyByb29tLi5cclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1Byb21wdFJlc3VsdHMuc3VjY2Vzcy5yb29tVG9FbnRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBlbnRlclJvb21SZXN1bHRTdWNjZXNzO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZW50ZXJSb29tUmVzdWx0VGV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBwbGF5ZXIgY2FuIHN1Y2Nlc3NmdWxseSBlbnRlciB0aGUgcm9vbSAoZ2l2ZW4gdGhlIGludmVudG9yeSAvIHJvb20gcmVxdWlyZW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgICBbZW50ZXJSb29tUmVzdWx0VGV4dCwgZW50ZXJSb29tUmVzdWx0U3VjY2Vzc10gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5QbGF5ZXIuZW50ZXJSb29tKF90aGlzLmdldFJvb20obWF0Y2hpbmdQcm9tcHRSZXN1bHRzLnN1Y2Nlc3Mucm9vbVRvRW50ZXIpKTtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMuRGlzcGxheS5hcHBlbmQoYDxwPiR7ZW50ZXJSb29tUmVzdWx0VGV4dH08L3A+YCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChlbnRlclJvb21SZXN1bHRTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHBsYXllciBlbnRlcmVkIHdpbm5pbmcgcm9vbVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1Byb21wdFJlc3VsdHMuc3VjY2Vzcy5yb29tVG9FbnRlciA9PT0gX3RoaXMuZW5kUm9vbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMud2luKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFBsYXllciBjb3VsZCBub3QgZW50ZXIgcm9vbSAobWlzc2luZyByZXF1aXJlZCBpdGVtcyBpbiBpbnZlbnRvcnkpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gUGxheWVyIGZhaWxlZCB0byBkbyBwcm9tcHQgKG1pc3NpbmcgaXRlbSByZXF1aXJlbWVudClcclxuICAgICAgICAgICAgICBpZiAoJ2ZhaWwnIGluIG1hdGNoaW5nUHJvbXB0UmVzdWx0cykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuRGlzcGxheS5zaG93KGAke21hdGNoaW5nUHJvbXB0UmVzdWx0cy5mYWlsLmZhaWxUZXh0fWApO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuRGlzcGxheS5hcHBlbmQoYDxwPk1pc3NpbmcgcmVxdWlyZWQgaXRlbXM6ICR7bWF0Y2hpbmdQcm9tcHRSZXN1bHRzLmZhaWwubWlzc2luZy50b1N0cmluZygpfS48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JHtfdGhpcy5nZXRSb29tKF90aGlzLlBsYXllci5jdXJyZW50Um9vbSkuZ2V0VGV4dH08L3A+YCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm91bmRQcm9tcHQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAvLyBQbGF5ZXIgZGlkbid0IHNheSBhbnkga2V5d29yZHMgdGhhdCB0cmlnZ2VyZWQgYW55IG9mIHRoZSBjdXJyZW50IHJvb20gcHJvbXB0c1xyXG4gICAgICAgICAgX3RoaXMuRGlzcGxheS5zaG93KGA8cD5ObyBhY3Rpb25zIGNvdWxkIGJlIGRvbmUgZnJvbTogXCIke21lc3NhZ2V9XCIuIFRyeSBzb21ldGhpbmcgZWxzZSwgb3IgYmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBzcGVjaWZpYyBhYm91dCB3aGF0IHlvdSdyZSBkb2luZy48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7X3RoaXMuZ2V0Um9vbShfdGhpcy5QbGF5ZXIuY3VycmVudFJvb20pLmdldFRleHR9PC9wPmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBObyBwcm9tcHRzIGV4aXN0IGZvciB0aGUgY3VycmVudCByb29tXHJcbiAgICAgIF90aGlzLkRpc3BsYXkuc2hvdyhgPHA+VGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBhY3Rpb25zIGF0IGFsbCB0aGF0IHlvdSBjYW4gZG8gaW4gdGhpcyByb29tLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJHtfdGhpcy5nZXRSb29tKF90aGlzLlBsYXllci5jdXJyZW50Um9vbSkuZ2V0VGV4dH1cclxuICAgICAgYCk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCB0aGlzLlBsYXllcik7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlSW5wdXQoKSB7XHJcbiAgICB0aGlzLklucHV0LmRpc2FibGUoKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZUlucHV0KCkge1xyXG4gICAgdGhpcy5JbnB1dC5lbmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8vIFBsYXllciB3aW5zXHJcbiAgd2luKCkge1xyXG4gICAgLy8gU2hvdyBmaW5hbCByb29tIHRleHQgKHdpbiB0ZXh0KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvb21zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnJvb21zW2ldLm5hbWUgPT09IHRoaXMuZW5kUm9vbSkge1xyXG4gICAgICAgIHRoaXMuRGlzcGxheS5hcHBlbmQoJzxwPkdhbWUgZW5kLjwvcD4nKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gRGlzYWJsZSBhbnkgbW9yZSB1c2VyIGlucHV0IGFmdGVyIHdpbm5pbmdcclxuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XHJcbiAgfVxyXG5cclxuICAvLyBQbGF5ZXIgcmVzZXRzIGdhbWVcclxuICByZXNldEdhbWUoKSB7XHJcbiAgICAvLyBSZXNldHMgcGxheWVyIHdpdGggYmxhbmsgaW52ZW50b3J5IGFuZCBiYWNrIHRvIHN0YXJ0aW5nIHJvb21cclxuICAgIHRoaXMuUGxheWVyLmludmVudG9yeSA9IG5ldyBJbnZlbnRvcnkoKTtcclxuICAgIHRoaXMuUGxheWVyLmN1cnJlbnRSb29tID0gdGhpcy5zdGFydFJvb207XHJcbiAgICBjb25zdCByb29tID0gdGhpcy5nZXRSb29tKHRoaXMuc3RhcnRSb29tKTtcclxuXHJcbiAgICB0aGlzLkRpc3BsYXkuc2hvdyhyb29tLmdldFRleHQpO1xyXG4gICAgdGhpcy5JbnB1dC5lbmFibGUoKTtcclxuICB9XHJcbn1cclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXNwbGF5IHtcclxuXHJcbiAgY29uc3RydWN0b3IoaHRtbCA9ICcnLCBlbGVtZW50SWQgPSAnZGlzcGxheScpIHtcclxuICAgIHRoaXMuaHRtbCA9IGh0bWw7XHJcbiAgICB0aGlzLmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICB9XHJcblxyXG4gIHNob3coaHRtbCA9IG51bGwpIHtcclxuICAgIGlmIChodG1sID09PSBudWxsKSB7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWxlbWVudElkKS5pbm5lckhUTUwgPSB0aGlzLmh0bWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVsZW1lbnRJZCkuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgdGhpcy5odG1sID0gaHRtbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFwcGVuZCBIVE1MIGNvbnRlbnQgdG8gZGlzcGxheSBzY3JlZW5cclxuICBhcHBlbmQoaHRtbCkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbGVtZW50SWQpLmlubmVySFRNTCArPSBodG1sO1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbnB1dCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRpc2FibGVkID0gZmFsc2UsIHZhbHVlID0gJycsIGVsZW1lbnRJZCA9ICdpbnB1dCcpIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlKCkge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0JykuZGlzYWJsZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGRpc2FibGUoKSB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dCcpLmRpc2FibGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHNlbmQodmFsdWUpIHtcclxuICAgIC8vIE5vcm1hbGl6ZSBpbnB1dCB2YWx1ZXMgKGlmIGRlc2lyZWQpXHJcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG59XHJcblxyXG4iLCJpbXBvcnQgSW52ZW50b3J5IGZyb20gJy4vaW52ZW50b3J5JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYXllciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5hbWUgPSAnJywgaW52ZW50b3J5ID0gbmV3IEludmVudG9yeSgpLCBjdXJyZW50Um9vbSA9ICcnLCBzdGFydFJvb20pIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICBpZiAodGhpcy5uYW1lID09PSAnJykge1xyXG4gICAgICB0aGlzLm5hbWUgPSAncGxheWVyJztcclxuICAgIH1cclxuICAgIHRoaXMuaW52ZW50b3J5ID0gaW52ZW50b3J5O1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFJvb20gPT09ICcnKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFJvb20gPSB0aGlzLnN0YXJ0Um9vbTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRSb29tID0gc3RhcnRSb29tO1xyXG4gIH1cclxuXHJcbiAgZW50ZXJSb29tKHJvb20pIHtcclxuICAgIGNvbnN0IHJvb21SZXN1bHQgPSByb29tLmVudGVyKHRoaXMuaW52ZW50b3J5Lml0ZW1zKTtcclxuXHJcbiAgICBpZiAocm9vbVJlc3VsdFsxXSA9PT0gZmFsc2UpIHtcclxuICAgICAgLy8gUGxheWVyIGRpZCBub3QgaGF2ZSByZXF1aXJlZCBpdGVtcyB0byBlbnRlciB0aGUgcm9vbVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRW50ZXJlZCByb29tIHN1Y2Nlc3NmdWxseVxyXG4gICAgICB0aGlzLmN1cnJlbnRSb29tID0gcm9vbS5uYW1lO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIHJlc3VsdHMgdGV4dCBhbmQgd2hldGhlciBvciBub3QgcGxheWVyIHN1Y2Nlc3NmdWxseSBlbnRlcmVkIHJvb21cclxuICAgIHJldHVybiBbcm9vbVJlc3VsdFswXSwgcm9vbVJlc3VsdFsxXV07XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtKGl0ZW0pIHtcclxuICAgIHRoaXMuaW52ZW50b3J5LmFkZEl0ZW0oaXRlbSk7XHJcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnk7XHJcbiAgfVxyXG5cclxuICBkcm9wSXRlbShpdGVtKSB7XHJcbiAgICB0aGlzLmludmVudG9yeS5kcm9wSXRlbShpdGVtKTtcclxuICAgIHJldHVybiB0aGlzLmludmVudG9yeTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IFByb21wdCBmcm9tICcuL3Byb21wdCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb29tIHtcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZSA9ICcnLCBnZXRUZXh0ID0gJycsIHByb21wdHMgPSBbXSwgcmVxdWlyZW1lbnRzID0gW10pIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLmdldFRleHQgPSBnZXRUZXh0OyAvLyBUaGUgdGV4dCB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSByb29tIGlzIGVudGVyZWRcclxuICAgIC8vIHRoaXMucHJvbXB0cyA9IHByb21wdHM7IC8vIFdoYXQgYXJlIHRoZSBhY3Rpb25zIHRoYXQgd2UgY2FuIGRvIGluIHRoaXMgcm9vbT9cclxuICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuXHJcbi