@sbb-esta/lyne-elements-experimental-dev 4.5.1-dev.1772010265 → 4.5.1-dev.1772034617

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -358,7 +358,7 @@ let SbbSeatReservationElement = (() => {
358
358
  @scroll=${() => this.coachAreaScrollend()}
359
359
  id="sbb-sr__wrapper-scrollarea"
360
360
  class="sbb-sr__wrapper-scrollarea"
361
- tabindex="0"
361
+ tabindex="-1"
362
362
  >
363
363
  <div id="sbb-sr__parent-area" class="sbb-sr__parent">
364
364
  <ul
@@ -829,4 +829,4 @@ let SbbSeatReservationElement = (() => {
829
829
  export {
830
830
  SbbSeatReservationElement
831
831
  };
832
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJQb3BvdmVyRWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3BvcG92ZXIuanMnO1xuaW1wb3J0IHsgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb2FjaEl0ZW0sXG4gIFBsYWNlLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBCYXNlRWxlbWVudCxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgTmF2aWdhdGlvbkNvYWNoSXRlbSxcbn0gZnJvbSAnLi4vY29tbW9uLnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9saXQmaW5saW5lJztcblxuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9idXR0b24uanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9zY3JlZW4tcmVhZGVyLW9ubHkuanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1hcmVhLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQudHMnO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1zZWF0LXJlc2VydmF0aW9uJylcbmNsYXNzIFNiYlNlYXRSZXNlcnZhdGlvbkVsZW1lbnQgZXh0ZW5kcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHN0eWxlXTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2NvYWNoZXNIdG1sVGVtcGxhdGU/OiBUZW1wbGF0ZVJlc3VsdDtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByaXZhdGUgX25vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zID0gWydFTlRSWV9FWElUJ107XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoYXNOYXZpZ2F0aW9uJykpIHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBmaXJzdCB1cGRhdGUgaXMgY29tcGxldGUgdG8gaW5pdCBkaWZmZXJlbnQgSFRNTCBlbGVtZW50IGRpbWVuc2lvbnNcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICB0aGlzLl9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpO1xuICAgIHJldHVybiB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlID0gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX2NvbXBvbmVudFwiPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb24oKX1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzXCJcbiAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldnQpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVsc1wiPiR7dGhpcy5fcmVuZGVyRGVja0xhYmVscygpfTwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBzY3JvbGw9JHsoKSA9PiB0aGlzLmNvYWNoQXJlYVNjcm9sbGVuZCgpfVxuICAgICAgICAgICAgaWQ9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYVwiXG4gICAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNiYi1zcl9fcGFyZW50LWFyZWFcIiBjbGFzcz1cInNiYi1zcl9fcGFyZW50XCI+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MtLWdhcCc6IHRoaXMuaGFzTXVsdGlwbGVEZWNrcyxcbiAgICAgICAgICAgICAgICB9KX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgIChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGkgY2xhc3M9XCJzYmItc3JfX2xpc3QtaXRlbS1kZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2JiLXNyX19saXN0LWNvYWNoZXNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoZXMoc2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckRlY2tMYWJlbHMoKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZURlY2tzKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubWFwKChzZWF0UmVzZXJ2YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IGRlY2tEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hMZXZlbCxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gaHRtbGA8YiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2RlY2tEZXNjcmlwdGlvbn08L2I+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWQgPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLXJpZ2h0J1xuICAgICAgICA6ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JztcbiAgICBjb25zdCBidG5JY29uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyA/ICdjaGV2cm9uLXNtYWxsLXJpZ2h0LXNtYWxsJyA6ICdjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGwnO1xuICAgIGNvbnN0IGJ0bkFyaWFEZXNjcmlwdGlvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0VORCcsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9CRUdJTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIGxldCBidG5EaXNhYmxlZCA9IHRydWU7XG5cbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPiAwKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4IDwgdGhpcy5jb2FjaE5hdkRhdGEubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvblwiPlxuICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5uYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbil9XCJcbiAgICAgICAgQGZvY3VzPVwiJHsoKSA9PiB0aGlzLm9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKX1cIlxuICAgICAgICBpZD1cIiR7YnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkfVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBpY29uLW5hbWU9XCIke2J0bkljb259XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2J0bkFyaWFEZXNjcmlwdGlvbn1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgLmRpc2FibGVkSW50ZXJhY3RpdmU9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyXCI+XG4gICAgICA8bmF2IGlkPVwic2JiLXNyLW5hdmlnYXRpb25cIiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9MRUZUJyl9XG4gICAgICAgIDx1bFxuICAgICAgICAgIGlkPVwic2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlc1wiXG4gICAgICAgICAgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fTkFWSUdBVElPTicsXG4gICAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICAgICl9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7dGhpcy5jb2FjaE5hdkRhdGEubWFwKChuYXZpZ2F0aW9uQ29hY2g6IE5hdmlnYXRpb25Db2FjaEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBodG1sYDxsaT5cbiAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2hcbiAgICAgICAgICAgICAgICBAc2VsZWN0Y29hY2g9JHsoZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pID0+IHRoaXMuX29uU2VsZWN0TmF2Q29hY2goZXZlbnQpfVxuICAgICAgICAgICAgICAgIEBmb2N1c2NvYWNoPSR7KCkgPT4gdGhpcy5fb25Gb2N1c05hdkNvYWNoKCl9XG4gICAgICAgICAgICAgICAgQGtleXVwPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5vbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihldnQsIGluZGV4KX1cbiAgICAgICAgICAgICAgICBpbmRleD1cIiR7aW5kZXh9XCJcbiAgICAgICAgICAgICAgICBjb2FjaC1pZD1cIiR7bmF2aWdhdGlvbkNvYWNoLmlkfVwiXG4gICAgICAgICAgICAgICAgLmZyZWVQbGFjZXNCeVR5cGU9XCIke25hdmlnYXRpb25Db2FjaC5mcmVlUGxhY2VzfVwiXG4gICAgICAgICAgICAgICAgLnNlbGVjdGVkPSR7dGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgIC5mb2N1c2VkPSR7dGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgLmhvdmVyZWQ9JHt0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAubmF0aXZlRm9jdXNBY3RpdmU9JHt0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzfVxuICAgICAgICAgICAgICAgIC5wcm9wZXJ0eUlkcz1cIiR7bmF2aWdhdGlvbkNvYWNoLnByb3BlcnR5SWRzfVwiXG4gICAgICAgICAgICAgICAgLnRyYXZlbENsYXNzPVwiJHtuYXZpZ2F0aW9uQ29hY2gudHJhdmVsQ2xhc3N9XCJcbiAgICAgICAgICAgICAgICA/ZHJpdmVyLWFyZWE9XCIke25hdmlnYXRpb25Db2FjaC5pc0RyaXZlckFyZWF9XCJcbiAgICAgICAgICAgICAgICA/Zmlyc3Q9XCIke25hdmlnYXRpb25Db2FjaD8uZHJpdmVyQXJlYVNpZGU/LmxlZnR9XCJcbiAgICAgICAgICAgICAgICA/bGFzdD1cIiR7bmF2aWdhdGlvbkNvYWNoPy5kcml2ZXJBcmVhU2lkZT8ucmlnaHR9XCJcbiAgICAgICAgICAgICAgICA/dmVydGljYWw9XCIke3RoaXMuYWxpZ25WZXJ0aWNhbH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaD5cbiAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX1JJR0hUJyl9XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj5gO1xuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBAcGFyYW0gc2VhdFJlc2VydmF0aW9uXG4gICAqIEBwYXJhbSBjb2FjaERlY2tJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hlcyhcbiAgICBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2hlczogQ29hY2hJdGVtW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcykpO1xuXG4gICAgaWYgKCFjb2FjaGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvYWNoZXMubWFwKChjb2FjaEl0ZW06IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGxpIGNsYXNzPVwic2JiLXNyX19pdGVtLWNvYWNoXCI+XG4gICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0sXG4gICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9saT5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGFibGVDb2FjaFdpdGhTZXJ2aWNlcyA9IHRoaXMuX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW0pO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZFxuICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC13aWR0aCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaGVpZ2h0JzogY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uLmgsXG4gICAgICB9KX1cbiAgICA+XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hCb3JkZXJzKGNvYWNoSXRlbSl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkR3JhcGhpY2FsRWxlbWVudHMoXG4gICAgICAgIGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMgfHwgW10sXG4gICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24sXG4gICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgKX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMpfVxuXG4gICAgICA8dGFibGVcbiAgICAgICAgQGZvY3VzPSR7KCkgPT4gdGhpcy5vbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGNvYWNoSW5kZXgpfVxuICAgICAgICBpZD1cInNiYi1zci1jb2FjaC0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8Y2FwdGlvbiBpZD1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXN9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2NhcHRpb24+XG4gICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRSb3dQbGFjZXMoY29hY2hJdGVtLCBjb2FjaEluZGV4LCBjb2FjaERlY2tJbmRleCwgcGxhY2VDb2FjaERlY2tJbmRleCl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkPmA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgYm9yZGVyIGdyYXBoaWMgKENPQUNIX0JPUkRFUl9NSURETEUpIG9mIGEgY29hY2ggd2l0aCBjYWxjdWxhdGVkIGJvcmRlciBnYXAgYW5kIGNvYWNoIHdpZHRoLFxuICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29hY2ggaXMgd2l0aCBhIGRyaXZlciBhcmVhIG9yIHdpdGhvdXQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhjb2FjaEl0ZW06IENvYWNoSXRlbSk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IENPQUNIX1BBU1NBR0VfV0lEVEggPSAxO1xuICAgIGNvbnN0IGFsbEVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cztcbiAgICBjb25zdCBkcml2ZXJBcmVhID0gYWxsRWxlbWVudHM/LmZpbmQoKGVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiBlbGVtZW50Lmljb24gPT09ICdEUklWRVJfQVJFQScpO1xuICAgIGxldCBib3JkZXJXaWR0aCA9IGRyaXZlckFyZWFcbiAgICAgID8gY29hY2hJdGVtLmRpbWVuc2lvbi53IC0gZHJpdmVyQXJlYS5kaW1lbnNpb24udyAtIENPQUNIX1BBU1NBR0VfV0lEVEhcbiAgICAgIDogY29hY2hJdGVtLmRpbWVuc2lvbi53IC0gQ09BQ0hfUEFTU0FHRV9XSURUSCAqIDI7XG5cbiAgICAvL211bHRpcGx5IHdpdGggYmFzZSBncmlkIHNpemUgYWx3YXlzIGZvciBhbGwga2luZCBvZiBib3JkZXJXaWR0aFxuICAgIGJvcmRlcldpZHRoICo9IHRoaXMuYmFzZUdyaWRTaXplO1xuXG4gICAgY29uc3QgYm9yZGVySGVpZ2h0ID0gKGNvYWNoSXRlbS5kaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyKSAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIGxldCBib3JkZXJPZmZzZXRYID1cbiAgICAgIGRyaXZlckFyZWEgJiYgZHJpdmVyQXJlYS5wb3NpdGlvbi54ID09PSAwXG4gICAgICAgID8gZHJpdmVyQXJlYT8uZGltZW5zaW9uLncgKiB0aGlzLmJhc2VHcmlkU2l6ZVxuICAgICAgICA6IHRoaXMuYmFzZUdyaWRTaXplO1xuXG4gICAgY29uc3QgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvID0gdGhpcy5vdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbi5maW5kKFxuICAgICAgKGVsKSA9PiBlbC5jb2FjaElkID09IGNvYWNoSXRlbS5pZCxcbiAgICApO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIG92ZXJoYW5naW5nIHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgdG8gYWRqdXN0IHRoZSBib3JkZXIgd2lkdGggYW5kIG9mZnNldCArIGdhcFxuICAgIC8vIFdlIGRvIG5vdCBkaWZmZXJlbnRpYXRlIHdoZXRoZXIgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGJlIGRvbmUgb24gYm90aCBzaWRlcyBhcyB0aGlzIHdvdWxkIGxlYWQgdG8gdW5uZWNlc3NhcnlcbiAgICAvLyBjb21wbGV4aXR5LiBTbyBpZiB0aGVyZSBpcyBzb21ldGhpbmcgb24gb25lIHNpZGUsIHdlIGp1c3QgaW5jcmVhc2UgdGhlIGNvYWNoLWJvcmRlciBvbiBib3RoIHNpZGVzLlxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXNcbiAgICApIHtcbiAgICAgIGJvcmRlcldpZHRoICs9IDIgKiB0aGlzLmJhc2VHcmlkU2l6ZTsgLy8gd2UgaW5jcmVhc2UgdGhlIHdpZHRoIGJ5IDIgZ3JpZCBzaXplcyB0byBoYXZlIGVub3VnaCBzcGFjZSBmb3IgcHJvdHJ1ZGVkIHBsYWNlcyBvbiBib3RoIHNpZGVzXG4gICAgICBib3JkZXJPZmZzZXRYID0gMDsgLy8gd2Ugc3RhcnQgYXQgMCB0byBoYXZlIGVub3VnaCBzcGFjZSBvbiB0aGUgbGVmdCBzaWRlIGFzIHdlbGxcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgJ3NiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMnOlxuICAgICAgICAgICAgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvPy5vdmVyaGFuZ2luZ1BsYWNlcyB8fFxuICAgICAgICAgICAgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvPy5vdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcyB8fFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIH0pfVwiXG4gICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBib3JkZXJXaWR0aCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGJvcmRlckhlaWdodCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nICogLTEsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogYm9yZGVyT2Zmc2V0WCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgfSl9XG4gICAgICAgIG5hbWU9XCJDT0FDSF9CT1JERVJfTUlERExFXCJcbiAgICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkUm93UGxhY2VzKFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaC5wbGFjZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgcm93cyB3aXRoIHRoZSBwbGFjZXMgdG8gcmVuZGVyIGEgdGFibGVcbiAgICBjb25zdCB0YWJsZVJvd1BsYWNlczogUmVjb3JkPG51bWJlciwgUGxhY2VbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoLnBsYWNlcykge1xuICAgICAgaWYgKCF0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSkge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSA9IFtwbGFjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XS5wdXNoKHBsYWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0YWJsZVJvd1BsYWNlcylcbiAgICAgIC5tYXAoKHJvd1BsYWNlczogUGxhY2VbXSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyIGlkPVwicm93LSR7Y29hY2hJbmRleH0tJHtyb3dQbGFjZXNbMF0ucG9zaXRpb24ueX1cIiBkYXRhLXJvdy1pbmRleD0ke2luZGV4fT5cbiAgICAgICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgICAgICAgICAgIHJvd1BsYWNlcyxcbiAgICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICAgIHBsYWNlQ29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIGA7XG4gICAgICB9KVxuICAgICAgLmZsYXRNYXAoKHJvd1RlbXBsYXRlKSA9PiByb3dUZW1wbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICBwbGFjZXM6IFBsYWNlW10sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGRlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICAvL1NvcnRzIGVhY2ggcGxhY2UgYnkgaXRzIGFzY2VuZGluZyB4IGNvb3JkaW5hdGVcbiAgICBwbGFjZXMuc29ydChcbiAgICAgIChwbGFjZUE6IFBsYWNlLCBwbGFjZUI6IFBsYWNlKSA9PiBOdW1iZXIocGxhY2VBLnBvc2l0aW9uLngpIC0gTnVtYmVyKHBsYWNlQi5wb3NpdGlvbi54KSxcbiAgICApO1xuXG4gICAgLy8gRm9yIHJlbmRlcmluZyB0aGUgcGxhY2VzIHdpdGhpbiBhIHRkIGVsZW1lbnQsIGhlcmUgd2UgdXNlIHJlcGVhdCBkaXJlY3RpdmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBmb3IgcmV1c2luZyBlbGVtZW50cyAodHJhY2sgYnkgaWQpLlxuICAgIGNvbnN0IHRyYWNrUGxhY2VJZCA9IGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZUNvYWNoRGVja0luZGV4O1xuICAgIHJldHVybiBodG1sYCR7cmVwZWF0KFxuICAgICAgcGxhY2VzLFxuICAgICAgKHBsYWNlKSA9PiB0cmFja1BsYWNlSWQgKyAnLScgKyBwbGFjZS5udW1iZXIsXG4gICAgICAocGxhY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24ocGxhY2UuZGltZW5zaW9uKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24ocGxhY2UucG9zaXRpb24pO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IHBsYWNlLnJvdGF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IC05MCA6IDA7XG4gICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKGRlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBpZD1cImNlbGwtJHtkZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtwbGFjZS5wb3NpdGlvbi55fS0ke2luZGV4fVwiXG4gICAgICAgICAgICBjbGFzcz1cImdyYXBoaWNhbC1lbGVtZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtc2NhbGUtdmFsdWUnOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXJvdGF0aW9uJzogdGV4dFJvdGF0aW9uLFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgQHNlbGVjdHBsYWNlPSR7KHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQpfVxuICAgICAgICAgICAgICBleHBvcnRwYXJ0cz1cInNiYi1zci1wbGFjZS1wYXJ0XCJcbiAgICAgICAgICAgICAgaWQ9JHtwbGFjZUlkfVxuICAgICAgICAgICAgICBjbGFzcz1cInNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFwiXG4gICAgICAgICAgICAgIHRleHQ9JHtwbGFjZS5udW1iZXJ9XG4gICAgICAgICAgICAgIHR5cGU9JHtwbGFjZS50eXBlfVxuICAgICAgICAgICAgICBzdGF0ZT0ke3BsYWNlLnN0YXRlfVxuICAgICAgICAgICAgICBjb2FjaC1pbmRleD0ke2NvYWNoSW5kZXh9XG4gICAgICAgICAgICAgIGRlY2staW5kZXg9JHtwbGFjZUNvYWNoRGVja0luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWRlY2staW5kZXg9JHtkZWNrSW5kZXh9XG4gICAgICAgICAgICAgIC5wcm9wZXJ0eUlkcz0ke3BsYWNlLnByb3BlcnR5SWRzfVxuICAgICAgICAgICAgICAucHJldmVudENsaWNrPSR7dGhpcy5wcmV2ZW50UGxhY2VDbGlja31cbiAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2w+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgYDtcbiAgICAgIH0sXG4gICAgKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRHcmFwaGljYWxFbGVtZW50cyhcbiAgICBncmFwaGljYWxFbGVtZW50czogQmFzZUVsZW1lbnRbXSxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghZ3JhcGhpY2FsRWxlbWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGdyYXBoaWNhbEVsZW1lbnRzPy5tYXAoKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBpY29uID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uID8/ICcnO1xuICAgICAgY29uc3QgZWxlbWVudFJvdGF0aW9uID0gZ3JhcGhpY2FsRWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgICAgY29uc3QgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA9XG4gICAgICAgIHRoaXMuX25vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zLmluZGV4T2YoZ3JhcGhpY2FsRWxlbWVudC5pY29uISkgPT09IC0xO1xuICAgICAgY29uc3QgZWxlbWVudEZpeGVkUm90YXRpb24gPVxuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgJiYgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudFxuICAgICAgICAgID8gZWxlbWVudFJvdGF0aW9uIC0gOTBcbiAgICAgICAgICA6IGVsZW1lbnRSb3RhdGlvbjtcblxuICAgICAgLy9jaGVjayBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIG5vdCBhbiBhcmVhIGVsZW1lbnQsIHNpbmNlIHRoaXMgZWxlbWVudCBpcyBkcmF3biB3aXRob3V0IGFuIGFyZWEgY29tcG9uZW50XG4gICAgICBpZiAodGhpcy5ub3RBcmVhRWxlbWVudHMuZmluZEluZGV4KChub3RBcmVhRWxlbWVudCkgPT4gbm90QXJlYUVsZW1lbnQgPT09IGljb24pID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFJlbmRlckVsZW1lbnRXaXRob3V0QXJlYShncmFwaGljYWxFbGVtZW50LCBlbGVtZW50Um90YXRpb24sIGNvYWNoRGltZW5zaW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9nZXRSZW5kZXJFbGVtZW50V2l0aEFyZWEoXG4gICAgICAgIGdyYXBoaWNhbEVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRGaXhlZFJvdGF0aW9uLFxuICAgICAgICBjb2FjaERpbWVuc2lvbixcbiAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZXMgYSByZW5kZXJlZCBlbGVtZW50IHdpdGggYW4gYXJlYSBjb21wb25lbnRcbiAgICogQHBhcmFtIGdyYXBoaWNhbEVsZW1lbnRcbiAgICogQHBhcmFtIHJvdGF0aW9uXG4gICAqIEBwYXJhbSBjb2FjaERpbWVuc2lvblxuICAgKiBAcGFyYW0gY29hY2hJbmRleCB1c2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIGlkIGZvciB0aGUgcG9wb3ZlciB0cmlnZ2VyXG4gICAqIEBwYXJhbSBjb2FjaERlY2tJbmRleCB1c2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIGlkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJFbGVtZW50V2l0aEFyZWEoXG4gICAgZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgcm90YXRpb246IG51bWJlcixcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIC8vIGZvciBUQUJMRSwgd2UgdXNlIHRoZSBhcmVhIGNvbXBvbmVudCBpdHNlbGYgdG8gZGlzcGxheSB0aGUgdGFibGUgaW5zdGVhZCBvZiB0aGUgU1ZHIGdyYXBoaWMuXG4gICAgLy8gRHVlIHRvIGRpZmZlcmVudCBoZWlnaHRzIGFuZCB3aWR0aHMsIGl0IHdvdWxkbid0IHNob3cgY29ycmVjdGx5LiBUbyBjb3JyZWN0IHRoaXMsIHdlIHdvdWxkXG4gICAgLy8gbmVlZCBkaWZmaWN1bHQgY2FsY3VsYXRpb25zIGZvciBwb3NpdGlvbiwgcm90YXRpb24gYW5kIGRpbWVuc2lvbi5cbiAgICBjb25zdCBpc05vdFRhYmxlR3JhcGhpYyA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvbj8uaW5kZXhPZignVEFCTEUnKSA9PT0gLTE7XG4gICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uICYmIGlzTm90VGFibGVHcmFwaGljID8gZ3JhcGhpY2FsRWxlbWVudC5pY29uIDogbnVsbDtcbiAgICBjb25zdCBzdHJldGNoSGVpZ2h0ID1cbiAgICAgIHRoaXMuaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihncmFwaGljYWxFbGVtZW50LCBjb2FjaERpbWVuc2lvbikgJiZcbiAgICAgIGFyZWFQcm9wZXJ0eSAhPT0gJ0VOVFJZX0VYSVQnO1xuICAgIGNvbnN0IGFyaWFMYWJlbEZvckFyZWEgPSBncmFwaGljYWxFbGVtZW50Lmljb25cbiAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihncmFwaGljYWxFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICA6IG5vdGhpbmc7XG5cbiAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24sXG4gICAgICBjb2FjaERpbWVuc2lvbixcbiAgICAgIHRydWUsXG4gICAgICBzdHJldGNoSGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24sXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7Y2FsY3VsYXRlZFBvc2l0aW9uLnh9LSR7Y2FsY3VsYXRlZFBvc2l0aW9uLnl9YDtcbiAgICBsZXQgZWxlbWVudE1vdW50aW5nID0gJ2ZyZWUnO1xuXG4gICAgaWYgKGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24ueSA9PT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIC0xKSB7XG4gICAgICBlbGVtZW50TW91bnRpbmcgPSAndXBwZXItYm9yZGVyJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbi55ICsgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24uaCA9PT1cbiAgICAgIGNvYWNoRGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0XG4gICAgKSB7XG4gICAgICBlbGVtZW50TW91bnRpbmcgPSAnbG93ZXItYm9yZGVyJztcbiAgICB9XG5cbiAgICAvLyBUSU1PLTQ1ODMwXG4gICAgLy8gSWYgYXJlYSBlbGVtZW50cyBhcmUgbG9jYXRlZCBhdCB0aGUgYm9yZGVyIG9mIGNvYWNoLFxuICAgIC8vIHdlIGhhdmUgdG8gbWFudWFsbHkgbW9kaWZ5IHRoZSBwb3NpdGlvbiBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGVsZW1lbnQsXG4gICAgLy8gc28gdGhhdCB3ZSBnZXQgYSBnYXAgZnJvbSB0aGUgdmlzdWVsIGNvYWNoIGJvcmRlclxuICAgIGlmIChlbGVtZW50TW91bnRpbmcgIT09ICdmcmVlJykge1xuICAgICAgY2FsY3VsYXRlZFBvc2l0aW9uLnkgKz0gZWxlbWVudE1vdW50aW5nID09PSAndXBwZXItYm9yZGVyJyA/IDIgOiAxO1xuICAgICAgY2FsY3VsYXRlZERpbWVuc2lvbi5oIC09IDM7XG4gICAgfVxuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWFcbiAgICAgICAgaWQ9XCIke3RyaWdnZXJJZH1cIlxuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoeyAnc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS0tY3Vyc29yLXBvaW50ZXInOiBhcmVhUHJvcGVydHkgIT09IG51bGwgfSl9XCJcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICB9KX1cbiAgICAgICAgbW91bnRpbmc9JHtlbGVtZW50TW91bnRpbmd9XG4gICAgICAgIGJhY2tncm91bmQ9XCJkYXJrXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgJHthcmVhUHJvcGVydHlcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLW1heC13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogdGhpcy5iYXNlR3JpZFNpemUsXG4gICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgbmFtZT0ke2FyZWFQcm9wZXJ0eX1cbiAgICAgICAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXV0by13aWR0aFwiXG4gICAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhPlxuICAgICAgJHthcmVhUHJvcGVydHkgPyB0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgYXJpYUxhYmVsRm9yQXJlYSkgOiBub3RoaW5nfVxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJFbGVtZW50V2l0aG91dEFyZWEoXG4gICAgZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgcm90YXRpb246IG51bWJlcixcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICk7XG4gICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24sXG4gICAgICBjb2FjaERpbWVuc2lvbixcbiAgICApO1xuXG4gICAgLy8gSWYgdGhlIGljb24gaXMgdGhlIGRyaXZlciBhcmVhLCB0aGVuIGhlcmUgY29uY2F0IHRoZSB2ZWhpY2xlIHR5cGUgdG8gZ2V0IHRoZSByaWdodCB2ZWhpY2xlIGNoYXNzaXMgaWNvblxuICAgIGNvbnN0IGljb24gPVxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5pY29uICYmIGdyYXBoaWNhbEVsZW1lbnQuaWNvbi5pbmRleE9mKCdEUklWRVJfQVJFQScpID09PSAtMVxuICAgICAgICA/IGdyYXBoaWNhbEVsZW1lbnQuaWNvblxuICAgICAgICA6IGdyYXBoaWNhbEVsZW1lbnQuaWNvbj8uY29uY2F0KFxuICAgICAgICAgICAgJ18nLFxuICAgICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS52ZWhpY2xlVHlwZSxcbiAgICAgICAgICApO1xuXG4gICAgcmV0dXJuIGh0bWxgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgfSl9XG4gICAgICBuYW1lPSR7aWNvbiA/PyBub3RoaW5nfVxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPmA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFNlcnZpY2VFbGVtZW50cyhcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBzZXJ2aWNlRWxlbWVudHM/OiBCYXNlRWxlbWVudFtdLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFzZXJ2aWNlRWxlbWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHNlcnZpY2VFbGVtZW50cz8ubWFwKChzZXJ2aWNlRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihzZXJ2aWNlRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHNlcnZpY2VFbGVtZW50LmRpbWVuc2lvbik7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbik7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBzZXJ2aWNlRWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgICAgY29uc3QgZWxlbWVudEZpeGVkUm90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyBlbGVtZW50Um90YXRpb24gLSA5MCA6IGVsZW1lbnRSb3RhdGlvbjtcblxuICAgICAgLy9nZW5lcmF0ZSB1bmlxdWUgaW5kZXggbnVtYmVyIGZvciB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuXG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBvc2l0aW9uJzogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiBlbGVtZW50Rml4ZWRSb3RhdGlvbixcbiAgICAgICAgICB9KX1cbiAgICAgICAgICBjbGFzcz1cInNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBuYW1lPSR7c2VydmljZUVsZW1lbnQuaWNvbiA/PyBub3RoaW5nfVxuICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICR7dGhpcy5fcG9wb3Zlcih0cmlnZ2VySWQsIHRpdGxlRGVzY3JpcHRpb24pfVxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2VzIHRoZSBzZWxlY3RlZCBwbGFjZSBldmVudCB0cmlnZ2VyZWQgZnJvbSB0aGUgcGxhY2VcbiAgICogRWFjaCBzZWxlY3Rpb24gZW1pdHMgYW4gYXJyYXkgb2YgYWxsIHNlbGVjdGVkIHBsYWNlc1xuICAgKiBAcGFyYW0gc2VsZWN0UGxhY2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlID0gc2VsZWN0UGxhY2VFdmVudC5kZXRhaWw7XG4gICAgLy8gV2UgaGF2ZSB0byBzZXQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrIHRvIHRydWUsIHRvIHByZXZlbnQgYXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgbmV3IGZvY3VzZWQgcGxhY2VcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IHRydWU7XG4gICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAvLyBDaGVjayBhbnkga2V5Ym9hcmQgZXZlbnQgd2FzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50LFxuICAgIC8vIHNvIHdlIGNhbiBzYXkgdGhlIG5hdGl2ZSBicm93c2VyIGZvY3VzIGxpZXMgb24gdGhlIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cykge1xuICAgICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICAvLyBBZGQgcGxhY2UgdG8gcGxhY2UgY29sbGVjdGlvblxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhzZWxlY3RlZFBsYWNlKTtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHNlbGVjdGVkUGxhY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0TmF2Q29hY2goZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZE5hdkNvYWNoSW5kZXggPSBldmVudC5kZXRhaWw7XG5cbiAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcblxuICAgIGlmIChzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IG51bGwgJiYgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9PT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cblxuICAgIC8vY2xvc2UgYWxsIG9wZW5lZCBwb3BvdmVyc1xuICAgIHRoaXMuX2Nsb3NlUG9wb3ZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Gb2N1c05hdkNvYWNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcG9wb3ZlciBmb3IgZXh0cmEgc2VydmljZSBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gdHJpZ2dlcklkXG4gICAqIEBwYXJhbSBwb3BvdmVyQ29udGVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfcG9wb3ZlcihcbiAgICB0cmlnZ2VySWQ6IHN0cmluZyxcbiAgICBwb3BvdmVyQ29udGVudDogc3RyaW5nIHwgbnVsbCB8IHR5cGVvZiBub3RoaW5nLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXBvcG92ZXIgdHJpZ2dlcj1cIiR7dHJpZ2dlcklkfVwiIGhvdmVyLXRyaWdnZXI9XCJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzYmItdGV4dC1zIHNiYi1zci1wb3BvdmVyXCI+JHtwb3BvdmVyQ29udGVudH08L3A+XG4gICAgICA8L3NiYi1wb3BvdmVyPlxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlciB0byBjbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzIChub3JtYWxseSBvbmx5IG9uZSBpcyBvcGVuZWQgYXQgYSB0aW1lKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfY2xvc2VQb3BvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsPFNiYlBvcG92ZXJFbGVtZW50Pignc2JiLXBvcG92ZXI6c3RhdGUoc3RhdGUtb3BlbmVkKScpXG4gICAgICAuZm9yRWFjaCgocG9wb3ZlcikgPT4gcG9wb3Zlci5jbG9zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW06IENvYWNoSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2FjaEl0ZW0ucGxhY2VzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9CTE9DS0VEX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICAgIGNvYWNoSXRlbS5pZCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGxldCB0YWJsZUNvYWNoRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb25zdCBhcmVhRGVzY3JpcHRpb25zID0gdGhpcy5fZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cyEpO1xuICAgIGNvbnN0IHNlcnZpY2VEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzISk7XG5cbiAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9UQUJMRV9DQVBUSU9OJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCwgW1xuICAgICAgY29hY2hJdGVtLmlkLFxuICAgIF0pO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIC8vIEV4cGFuZHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgc2VhdHMgYW5kIGJpY3ljbGUgc3BhY2VzIGFzIGluZm9cbiAgICAgIGNvbnN0IGZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2hJdGVtLnBsYWNlcyk7XG4gICAgICBjb25zdCBmcmVlUGxhY2VzVHh0ID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgJ0NPQUNIX0FWQUlMQUJMRV9OVU1CRVJfT0ZfUExBQ0VTJyxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgW2ZyZWVQbGFjZXMuc2VhdHMsIGZyZWVQbGFjZXMuYmljeWNsZXNdLFxuICAgICAgKTtcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IHRhYmxlQ29hY2hEZXNjcmlwdGlvbi5jb25jYXQoJy4gJykuY29uY2F0KGZyZWVQbGFjZXNUeHQpLmNvbmNhdCgnLiAnKTtcbiAgICB9XG5cbiAgICBpZiAoISFhcmVhRGVzY3JpcHRpb25zIHx8ICEhc2VydmljZURlc2NyaXB0aW9ucykge1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uICs9XG4gICAgICAgICcuICcgKyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdDT0FDSF9BVkFJTEFCTEVfU0VSVklDRVMnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KSArICc6ICc7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz0gc2VydmljZURlc2NyaXB0aW9ucyArICcsICcgKyBhcmVhRGVzY3JpcHRpb25zICsgJy4nO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGVDb2FjaERlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoZGVzY3JpcHRpb25zRWxlbWVudHM6IEJhc2VFbGVtZW50W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIHJldHVybiBkZXNjcmlwdGlvbnNFbGVtZW50c1xuICAgICAgPy5tYXAoKGRlc2NyaXB0aW9uRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpY29uID0gZGVzY3JpcHRpb25FbGVtZW50Lmljb247XG4gICAgICAgIGlmICghaWNvbikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgPSB1bmlxdWVEZXNjcmlwdGlvbnMuaW5kZXhPZihpY29uKSA+IC0xO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50Lmljb24hLFxuICAgICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGlzVmFsaWREZXNjcmlwdGlvbiA9XG4gICAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihpY29uKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmRleE9mKGljb24pID09PSAtMTtcblxuICAgICAgICBpZiAoIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0KSB7XG4gICAgICAgICAgdW5pcXVlRGVzY3JpcHRpb25zLnB1c2goZGVzY3JpcHRpb25FbGVtZW50Lmljb24hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISF0cmFuc2xhdGlvbiAmJiAhZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QgJiYgaXNWYWxpZERlc2NyaXB0aW9uID8gdHJhbnNsYXRpb24gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGRlc2NyaXB0aW9uKSA9PiAhIWRlc2NyaXB0aW9uKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uJzogU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBdUNNLDZCQUF5QixNQUFBOzswQkFEOUIsY0FBYyxzQkFBc0IsQ0FBQzs7OztvQkFDRTtBQUFSLEVBQUEsbUJBQVEsWUFBMEI7QUFBQTs7QUFHeEQsV0FBQSxZQUFZLElBQUksc0JBQXNCLElBQUk7QUFJMUMsV0FBQSw4QkFBOEIsQ0FBQyxZQUFZO0FBQUEsSUErdEJyRDtBQUFBLElBN3RCcUIsV0FBVyxtQkFBdUM7QUFDbkUsWUFBTSxXQUFXLGlCQUFpQjtBQUVsQyxVQUFJLGtCQUFrQixJQUFJLGVBQWUsR0FBRztBQUMxQyxZQUFJLEtBQUssZUFBZTtBQUN0QixlQUFLLFlBQ0QsaUJBQWlCLE9BQU8sRUFDekIsUUFBUSxDQUFDLFVBQVUsTUFBTSxnQkFBZ0IsVUFBVSxDQUFDO0FBQUEsUUFDekQsT0FBTztBQUNMLGVBQUssWUFDRCxpQkFBaUIsT0FBTyxFQUN6QixRQUFRLENBQUMsVUFBVSxNQUFNLGFBQWEsWUFBWSxHQUFHLENBQUM7QUFBQSxRQUMzRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFbUIsYUFBYSxtQkFBdUM7QUFDckUsWUFBTSxhQUFhLGlCQUFpQjtBQUdwQyxXQUFLLGVBQWUsS0FBSyxNQUFLO0FBQzVCLGFBQUsscUNBQUE7QUFBQSxNQUNQLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFbUIsU0FBTTtBQUN2QixXQUFLLHdDQUFBO0FBQ0wsYUFBTyxLQUFLLHdCQUF3QjtBQUFBLElBQ3RDO0FBQUEsSUFFUSwwQ0FBdUM7QUFDN0MsV0FBSyx1QkFBdUI7QUFBQTtBQUFBLFVBRXRCLEtBQUssbUJBQW1CO0FBQUE7QUFBQTtBQUFBLHFCQUdiLENBQUMsUUFBdUIsS0FBSyw2QkFBNkIsR0FBRyxDQUFDO0FBQUE7QUFBQSxxREFFOUIsS0FBSyxtQkFBbUI7QUFBQTtBQUFBLHNCQUV2RCxNQUFNLEtBQUssbUJBQUEsQ0FBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFPNUIsU0FBUztBQUFBLFFBQ2hCLHNCQUFzQjtBQUFBLFFBQ3RCLDJCQUEyQixLQUFLO0FBQUEsTUFBQSxDQUNqQyxDQUFDO0FBQUE7QUFBQSxrQkFFQSxLQUFLLGtCQUFrQixJQUN2QixDQUFDLGlCQUFrQyxtQkFBMEI7QUFDM0QsZUFBTztBQUFBO0FBQUEsMEJBRUQsS0FBSyxlQUFlLGlCQUFpQixjQUFjLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHNUQsQ0FBQyxDQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPZjtBQUFBLElBRVEsb0JBQWlCO0FBQ3ZCLFVBQUksQ0FBQyxLQUFLO0FBQWtCLGVBQU87QUFFbkMsYUFBTyxLQUFLLGlCQUFpQixJQUFJLENBQUMsb0JBQW1CO0FBQ25ELGNBQU0sa0JBQWtCLHVCQUN0QixnQkFBZ0IsZ0JBQ2hCLEtBQUssVUFBVSxPQUFPO0FBRXhCLGVBQU8sNkJBQTZCLGVBQWU7QUFBQSxNQUNyRCxDQUFDO0FBQUEsSUFDSDtBQUFBLElBRVEsK0JBQStCLGNBQW9CO0FBQ3pELFVBQUksQ0FBQyxLQUFLLGlCQUFpQixDQUFDLEtBQUs7QUFBa0IsZUFBTztBQUMxRCxZQUFNLDJCQUNKLGdCQUFnQixvQkFDWix1REFDQTtBQUNOLFlBQU0sVUFDSixnQkFBZ0Isb0JBQW9CLDhCQUE4QjtBQUNwRSxZQUFNLHFCQUNKLGdCQUFnQixvQkFDWix1QkFBdUIsd0JBQXdCLEtBQUssVUFBVSxPQUFPLElBQ3JFLHVCQUF1QiwwQkFBMEIsS0FBSyxVQUFVLE9BQU87QUFDN0UsVUFBSSxjQUFjO0FBRWxCLFVBQUksZ0JBQWdCLG9CQUFvQixLQUFLLHFCQUFxQixHQUFHO0FBQ25FLHNCQUFjO0FBQUEsTUFDaEIsV0FDRSxnQkFBZ0IscUJBQ2hCLEtBQUsscUJBQXFCLEtBQUssYUFBYSxTQUFTLEdBQ3JEO0FBQ0Esc0JBQWM7QUFBQSxNQUNoQjtBQUVBLGFBQU87QUFBQTtBQUFBLGtCQUVPLE1BQU0sS0FBSyx1QkFBdUIsWUFBWSxDQUFDO0FBQUEsa0JBQy9DLE1BQU0sS0FBSywyQkFBMkI7QUFBQSxjQUMxQyx3QkFBd0I7QUFBQTtBQUFBO0FBQUEscUJBR2pCLE9BQU87QUFBQTtBQUFBLHNCQUVOLGtCQUFrQjtBQUFBO0FBQUEsZ0NBRVIsZUFBZSxPQUFPO0FBQUEscUJBQ2pDLGVBQWUsT0FBTztBQUFBO0FBQUE7QUFBQSxJQUd6QztBQUFBLElBRVEsb0JBQWlCO0FBQ3ZCLFVBQUksQ0FBQyxLQUFLLGlCQUFpQixDQUFDLEtBQUs7QUFBa0IsZUFBTztBQUMxRCxhQUFPO0FBQUE7QUFBQSxVQUVELEtBQUssK0JBQStCLGdCQUFnQixDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBSXZDLHVCQUNaLCtCQUNBLEtBQUssVUFBVSxPQUFPLENBQ3ZCO0FBQUE7QUFBQSxZQUVDLEtBQUssYUFBYSxJQUFJLENBQUMsaUJBQXNDLFVBQWlCO0FBQzlFLGVBQU87QUFBQTtBQUFBLCtCQUVZLENBQUMsVUFBK0IsS0FBSyxrQkFBa0IsS0FBSyxDQUFDO0FBQUEsOEJBQzlELE1BQU0sS0FBSyxpQkFBQSxDQUFrQjtBQUFBLHlCQUNsQyxDQUFDLFFBQXVCLEtBQUssOEJBQThCLEtBQUssS0FBSyxDQUFDO0FBQUEseUJBQ3RFLEtBQUs7QUFBQSw0QkFDRixnQkFBZ0IsRUFBRTtBQUFBLHFDQUNULGdCQUFnQixVQUFVO0FBQUEsNEJBQ25DLEtBQUssdUJBQXVCLEtBQUs7QUFBQSwyQkFDbEMsS0FBSyxzQkFBc0IsS0FBSztBQUFBLDJCQUNoQyxLQUFLLHNCQUFzQixLQUFLO0FBQUEscUNBQ3RCLEtBQUssNkJBQTZCO0FBQUEsZ0NBQ3ZDLGdCQUFnQixXQUFXO0FBQUEsZ0NBQzNCLGdCQUFnQixXQUFXO0FBQUEsZ0NBQzNCLGdCQUFnQixZQUFZO0FBQUEsMEJBQ2xDLGlCQUFpQixnQkFBZ0IsSUFBSTtBQUFBLHlCQUN0QyxpQkFBaUIsZ0JBQWdCLEtBQUs7QUFBQSw2QkFDbEMsS0FBSyxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJckMsQ0FBQyxDQUFDO0FBQUE7QUFBQSxVQUVGLEtBQUssK0JBQStCLGlCQUFpQixDQUFDO0FBQUE7QUFBQTtBQUFBLElBRzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPUSxlQUNOLGlCQUNBLGdCQUFzQjtBQUV0QixZQUFNLFVBQXVCLEtBQUssTUFBTSxLQUFLLFVBQVUsaUJBQWlCLFVBQVUsQ0FBQztBQUVuRixVQUFJLENBQUMsU0FBUztBQUNaLGVBQU87QUFBQSxNQUNUO0FBQ0EsYUFBTyxRQUFRLElBQUksQ0FBQyxXQUFzQixlQUFzQjtBQUM5RCxlQUFPO0FBQUE7QUFBQSxZQUVELEtBQUssb0JBQ0wsV0FDQSxZQUNBLGdCQUNBLGdCQUFnQixjQUFjLENBQy9CO0FBQUE7QUFBQTtBQUFBLE1BR1AsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVRLG9CQUNOLFdBQ0EsWUFDQSxnQkFDQSxxQkFBMkI7QUFFM0IsWUFBTSwyQkFBMkIsS0FBSyx1QkFBdUIsVUFBVSxTQUFTO0FBQ2hGLFlBQU0sb0NBQW9DLEtBQUssMEJBQTBCLFNBQVM7QUFFbEYsYUFBTztBQUFBLGNBQ0csU0FBUztBQUFBLFFBQ2YsdUNBQXVDLHlCQUF5QjtBQUFBLFFBQ2hFLHdDQUF3Qyx5QkFBeUI7QUFBQSxNQUFBLENBQ2xFLENBQUM7QUFBQTtBQUFBLFFBRUEsS0FBSyx5QkFBeUIsU0FBUyxDQUFDO0FBQUEsUUFDeEMsS0FBSyw4QkFDTCxVQUFVLG1CQUFtQixDQUFBLEdBQzdCLFVBQVUsV0FDVixZQUNBLGNBQWMsQ0FDZjtBQUFBLFFBQ0MsS0FBSyw0QkFBNEIsWUFBWSxnQkFBZ0IsVUFBVSxlQUFlLENBQUM7QUFBQTtBQUFBO0FBQUEsaUJBRzlFLE1BQU0sS0FBSyxtQ0FBbUMsVUFBVSxDQUFDO0FBQUEsMkJBQy9DLFVBQVU7QUFBQTtBQUFBLGlEQUVZLFVBQVU7QUFBQTtBQUFBO0FBQUEsNENBR2YsVUFBVTtBQUFBLG9DQUNsQixpQ0FBaUM7QUFBQTtBQUFBLFVBRTNELEtBQUssc0JBQXNCLFdBQVcsWUFBWSxnQkFBZ0IsbUJBQW1CLENBQUM7QUFBQTtBQUFBO0FBQUEsSUFHOUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEseUJBQXlCLFdBQW9CO0FBQ25ELFVBQUksQ0FBQyxVQUFVO0FBQWlCLGVBQU87QUFFdkMsWUFBTSxzQkFBc0I7QUFDNUIsWUFBTSxjQUFjLFVBQVU7QUFDOUIsWUFBTSxhQUFhLGFBQWEsS0FBSyxDQUFDLFlBQXlCLFFBQVEsU0FBUyxhQUFhO0FBQzdGLFVBQUksY0FBYyxhQUNkLFVBQVUsVUFBVSxJQUFJLFdBQVcsVUFBVSxJQUFJLHNCQUNqRCxVQUFVLFVBQVUsSUFBSSxzQkFBc0I7QUFHbEQscUJBQWUsS0FBSztBQUVwQixZQUFNLGdCQUFnQixVQUFVLFVBQVUsSUFBSSxLQUFLLG9CQUFvQixLQUFLLEtBQUs7QUFDakYsVUFBSSxnQkFDRixjQUFjLFdBQVcsU0FBUyxNQUFNLElBQ3BDLFlBQVksVUFBVSxJQUFJLEtBQUssZUFDL0IsS0FBSztBQUVYLFlBQU0sOEJBQThCLEtBQUssOEJBQThCLEtBQ3JFLENBQUMsT0FBTyxHQUFHLFdBQVcsVUFBVSxFQUFFO0FBTXBDLFVBQ0UsNkJBQTZCLHFCQUM3Qiw2QkFBNkIseUJBQzdCO0FBQ0EsdUJBQWUsSUFBSSxLQUFLO0FBQ3hCLHdCQUFnQjtBQUFBLE1BQ2xCO0FBRUEsYUFBTztBQUFBO0FBQUEsaUJBRU0sU0FBUztBQUFBLFFBQ2hCLHlDQUNFLDZCQUE2QixxQkFDN0IsNkJBQTZCLDJCQUM3QjtBQUFBLE1BQUEsQ0FDSCxDQUFDO0FBQUEsZ0JBQ00sU0FBUztBQUFBLFFBQ2Ysd0NBQXdDO0FBQUEsUUFDeEMseUNBQXlDO0FBQUEsUUFDekMsc0NBQXNDLEtBQUsscUJBQXFCO0FBQUEsUUFDaEUsdUNBQXVDO0FBQUEsUUFDdkMsMkNBQTJDO0FBQUEsTUFBQSxDQUM1QyxDQUFDO0FBQUE7QUFBQSxtQkFFUyxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJckI7QUFBQSxJQUVRLHNCQUNOLE9BQ0EsWUFDQSxnQkFDQSxxQkFBMkI7QUFFM0IsVUFBSSxDQUFDLE1BQU0sUUFBUTtBQUNqQixlQUFPO0FBQUEsTUFDVDtBQUdBLFlBQU0saUJBQTBDLENBQUE7QUFDaEQsaUJBQVcsU0FBUyxNQUFNLFFBQVE7QUFDaEMsWUFBSSxDQUFDLGVBQWUsTUFBTSxTQUFTLENBQUMsR0FBRztBQUNyQyx5QkFBZSxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSztBQUFBLFFBQzNDLE9BQU87QUFDTCx5QkFBZSxNQUFNLFNBQVMsQ0FBQyxFQUFFLEtBQUssS0FBSztBQUFBLFFBQzdDO0FBQUEsTUFDRjtBQUVBLGFBQU8sT0FBTyxPQUFPLGNBQWMsRUFDaEMsSUFBSSxDQUFDLFdBQW9CLFVBQVM7QUFDakMsZUFBTztBQUFBLHdCQUNTLFVBQVUsSUFBSSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsb0JBQW9CLEtBQUs7QUFBQSxjQUN4RSxLQUFLLHlCQUNMLFdBQ0EsWUFDQSxnQkFDQSxtQkFBbUIsQ0FDcEI7QUFBQTtBQUFBO0FBQUEsTUFHUCxDQUFDLEVBQ0EsUUFBUSxDQUFDLGdCQUFnQixXQUFXO0FBQUEsSUFDekM7QUFBQSxJQUVRLHlCQUNOLFFBQ0EsWUFDQSxXQUNBLHFCQUEyQjtBQUczQixhQUFPLEtBQ0wsQ0FBQyxRQUFlLFdBQWtCLE9BQU8sT0FBTyxTQUFTLENBQUMsSUFBSSxPQUFPLE9BQU8sU0FBUyxDQUFDLENBQUM7QUFJekYsWUFBTSxlQUFlLGFBQWEsTUFBTTtBQUN4QyxhQUFPLE9BQU8sT0FDWixRQUNBLENBQUMsVUFBVSxlQUFlLE1BQU0sTUFBTSxRQUN0QyxDQUFDLE9BQU8sVUFBUztBQUNmLGNBQU0sc0JBQXNCLEtBQUssdUJBQXVCLE1BQU0sU0FBUztBQUN2RSxjQUFNLHFCQUFxQixLQUFLLHNCQUFzQixNQUFNLFFBQVE7QUFDcEUsY0FBTSxXQUFXLE1BQU0sWUFBWTtBQUNuQyxjQUFNLGVBQWUsS0FBSyxnQkFBZ0IsTUFBTTtBQUNoRCxjQUFNLFVBQVUsS0FBSyxrQkFBa0IsV0FBVyxZQUFZLE1BQU0sTUFBTTtBQUMxRSxlQUFPO0FBQUE7QUFBQSx1QkFFUSxTQUFTLElBQUksVUFBVSxJQUFJLE1BQU0sU0FBUyxDQUFDLElBQUksS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUlyRCxTQUFTO0FBQUEsVUFDZix5REFBeUQsS0FBSyxJQUM1RCxvQkFBb0IsR0FDcEIsb0JBQW9CLENBQUM7QUFBQSxVQUV2Qiw4Q0FBOEMsb0JBQW9CO0FBQUEsVUFDbEUsK0NBQStDLG9CQUFvQjtBQUFBLFVBQ25FLDRDQUE0QyxtQkFBbUI7QUFBQSxVQUMvRCw2Q0FBNkMsbUJBQW1CO0FBQUEsVUFDaEUsaURBQWlEO0FBQUEsVUFDakQsc0RBQXNEO0FBQUEsUUFBQSxDQUN2RCxDQUFDO0FBQUEsNkJBQ2EsQ0FBQyxxQkFDZCxLQUFLLGVBQWUsZ0JBQWdCLENBQUM7QUFBQTtBQUFBLG1CQUVsQyxPQUFPO0FBQUE7QUFBQSxxQkFFTCxNQUFNLE1BQU07QUFBQSxxQkFDWixNQUFNLElBQUk7QUFBQSxzQkFDVCxNQUFNLEtBQUs7QUFBQSw0QkFDTCxVQUFVO0FBQUEsMkJBQ1gsbUJBQW1CO0FBQUEsZ0NBQ2QsU0FBUztBQUFBLDZCQUNaLE1BQU0sV0FBVztBQUFBLDhCQUNoQixLQUFLLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSTlDLENBQUMsQ0FDRjtBQUFBLElBQ0g7QUFBQSxJQUVRLDhCQUNOLG1CQUNBLGdCQUNBLFlBQ0EsZ0JBQXNCO0FBRXRCLFVBQUksQ0FBQztBQUFtQixlQUFPO0FBRS9CLGFBQU8sbUJBQW1CLElBQUksQ0FBQyxxQkFBaUM7QUFDOUQsY0FBTSxPQUFPLGlCQUFpQixRQUFRO0FBQ3RDLGNBQU0sa0JBQWtCLGlCQUFpQixZQUFZO0FBQ3JELGNBQU0scUNBQ0osS0FBSyw0QkFBNEIsUUFBUSxpQkFBaUIsSUFBSyxNQUFNO0FBQ3ZFLGNBQU0sdUJBQ0osS0FBSyxpQkFBaUIscUNBQ2xCLGtCQUFrQixLQUNsQjtBQUdOLFlBQUksS0FBSyxnQkFBZ0IsVUFBVSxDQUFDLG1CQUFtQixtQkFBbUIsSUFBSSxJQUFJLElBQUk7QUFDcEYsaUJBQU8sS0FBSyw2QkFBNkIsa0JBQWtCLGlCQUFpQixjQUFjO0FBQUEsUUFDNUY7QUFDQSxlQUFPLEtBQUssMEJBQ1Ysa0JBQ0Esc0JBQ0EsZ0JBQ0EsWUFDQSxjQUFjO0FBQUEsTUFFbEIsQ0FBQztBQUFBLElBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVdRLDBCQUNOLGtCQUNBLFVBQ0EsZ0JBQ0EsWUFDQSxnQkFBc0I7QUFLdEIsWUFBTSxvQkFBb0IsaUJBQWlCLE1BQU0sUUFBUSxPQUFPLE1BQU07QUFDdEUsWUFBTSxlQUFlLGlCQUFpQixRQUFRLG9CQUFvQixpQkFBaUIsT0FBTztBQUMxRixZQUFNLGdCQUNKLEtBQUssMEJBQTBCLGtCQUFrQixjQUFjLEtBQy9ELGlCQUFpQjtBQUNuQixZQUFNLG1CQUFtQixpQkFBaUIsT0FDdEMsdUJBQXVCLGlCQUFpQixNQUFNLEtBQUssVUFBVSxPQUFPLElBQ3BFO0FBRUosWUFBTSxzQkFBc0IsS0FBSyx1QkFDL0IsaUJBQWlCLFdBQ2pCLGdCQUNBLE1BQ0EsYUFBYTtBQUdmLFlBQU0scUJBQXFCLEtBQUssc0JBQzlCLGlCQUFpQixVQUNqQixpQkFBaUIsV0FDakIsZ0JBQ0EsSUFBSTtBQUlOLFlBQU0sWUFBWSxtQkFBbUIsY0FBYyxJQUFJLFVBQVUsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLG1CQUFtQixDQUFDO0FBQ2pILFVBQUksa0JBQWtCO0FBRXRCLFVBQUksaUJBQWlCLFNBQVMsTUFBTSxLQUFLLG9CQUFvQixJQUFJO0FBQy9ELDBCQUFrQjtBQUFBLE1BQ3BCLFdBQ0UsaUJBQWlCLFNBQVMsSUFBSSxpQkFBaUIsVUFBVSxNQUN6RCxlQUFlLElBQUksS0FBSyxtQkFDeEI7QUFDQSwwQkFBa0I7QUFBQSxNQUNwQjtBQU1BLFVBQUksb0JBQW9CLFFBQVE7QUFDOUIsMkJBQW1CLEtBQUssb0JBQW9CLGlCQUFpQixJQUFJO0FBQ2pFLDRCQUFvQixLQUFLO0FBQUEsTUFDM0I7QUFDQSxhQUFPO0FBQUE7QUFBQSxjQUVHLFNBQVM7QUFBQSxpQkFDTixTQUFTLEVBQUUsNkNBQTZDLGlCQUFpQixLQUFBLENBQU0sQ0FBQztBQUFBLGdCQUNqRixTQUFTO0FBQUEsUUFDZixxQ0FBcUMsb0JBQW9CO0FBQUEsUUFDekQsc0NBQXNDLG9CQUFvQjtBQUFBLFFBQzFELG1DQUFtQyxtQkFBbUI7QUFBQSxRQUN0RCxvQ0FBb0MsbUJBQW1CO0FBQUEsTUFBQSxDQUN4RCxDQUFDO0FBQUEsbUJBQ1MsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBSXhCLGVBQ0U7QUFBQTtBQUFBLHdCQUVZLFNBQVM7QUFBQSxRQUNmLDRDQUE0QyxvQkFBb0I7QUFBQSxRQUNoRSx5Q0FBeUMsS0FBSztBQUFBLFFBQzlDLDJDQUEyQztBQUFBLE1BQUEsQ0FDNUMsQ0FBQztBQUFBLHVCQUNLLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQU12QixPQUFPO0FBQUE7QUFBQSxRQUVYLGVBQWUsS0FBSyxTQUFTLFdBQVcsZ0JBQWdCLElBQUksT0FBTztBQUFBO0FBQUEsSUFFekU7QUFBQSxJQUVRLDZCQUNOLGtCQUNBLFVBQ0EsZ0JBQWdDO0FBRWhDLFlBQU0sc0JBQXNCLEtBQUssdUJBQy9CLGlCQUFpQixXQUNqQixjQUFjO0FBRWhCLFlBQU0scUJBQXFCLEtBQUssc0JBQzlCLGlCQUFpQixVQUNqQixpQkFBaUIsV0FDakIsY0FBYztBQUloQixZQUFNLE9BQ0osaUJBQWlCLFFBQVEsaUJBQWlCLEtBQUssUUFBUSxhQUFhLE1BQU0sS0FDdEUsaUJBQWlCLE9BQ2pCLGlCQUFpQixNQUFNLE9BQ3JCLEtBQ0EsS0FBSyxpQkFBaUIsS0FBSyxxQkFBcUIsRUFBRSxXQUFXO0FBR3JFLGFBQU87QUFBQSxjQUNHLFNBQVM7QUFBQSxRQUNmLHdDQUF3QyxvQkFBb0I7QUFBQSxRQUM1RCx5Q0FBeUMsb0JBQW9CO0FBQUEsUUFDN0Qsc0NBQXNDLG1CQUFtQjtBQUFBLFFBQ3pELHVDQUF1QyxtQkFBbUI7QUFBQSxRQUMxRCwyQ0FBMkM7QUFBQSxRQUMzQywyQ0FBMkM7QUFBQSxNQUFBLENBQzVDLENBQUM7QUFBQSxhQUNLLFFBQVEsT0FBTztBQUFBO0FBQUEsaUJBRVgsSUFBSTtBQUFBO0FBQUEsSUFFbkI7QUFBQSxJQUVRLDRCQUNOLFlBQ0EsZ0JBQ0EsaUJBQStCO0FBRS9CLFVBQUksQ0FBQztBQUFpQixlQUFPO0FBRTdCLGFBQU8saUJBQWlCLElBQUksQ0FBQyxtQkFBK0I7QUFDMUQsY0FBTSxtQkFBbUIsZUFBZSxPQUNwQyx1QkFBdUIsZUFBZSxNQUFNLEtBQUssVUFBVSxPQUFPLElBQ2xFO0FBQ0osY0FBTSxzQkFBc0IsS0FBSyx1QkFBdUIsZUFBZSxTQUFTO0FBQ2hGLGNBQU0scUJBQXFCLEtBQUssc0JBQXNCLGVBQWUsUUFBUTtBQUM3RSxjQUFNLGtCQUFrQixlQUFlLFlBQVk7QUFDbkQsY0FBTSx1QkFBdUIsS0FBSyxnQkFBZ0Isa0JBQWtCLEtBQUs7QUFHekUsY0FBTSxZQUFZLG1CQUFtQixjQUFjLElBQUksVUFBVSxJQUFJLG1CQUFtQixDQUFDLElBQUksbUJBQW1CLENBQUM7QUFFakgsZUFBTztBQUFBO0FBQUEsZ0JBRUcsU0FBUztBQUFBLGtCQUNQLFNBQVM7QUFBQSxVQUNmLHdDQUF3QyxvQkFBb0I7QUFBQSxVQUM1RCx5Q0FBeUMsb0JBQW9CO0FBQUEsVUFDN0Qsc0NBQXNDLG1CQUFtQjtBQUFBLFVBQ3pELHVDQUF1QyxtQkFBbUI7QUFBQSxVQUMxRCwyQ0FBMkM7QUFBQSxVQUMzQywyQ0FBMkM7QUFBQSxRQUFBLENBQzVDLENBQUM7QUFBQTtBQUFBLGlCQUVLLGVBQWUsUUFBUSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFJckMsS0FBSyxTQUFTLFdBQVcsZ0JBQWdCLENBQUM7QUFBQTtBQUFBLE1BRWhELENBQUM7QUFBQSxJQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBT1EsZUFBZSxrQkFBNkM7QUFDbEUsWUFBTSxnQkFBZ0IsaUJBQWlCO0FBRXZDLFdBQUssaUNBQWlDO0FBQ3RDLFdBQUssdUJBQXVCO0FBQzVCLFdBQUssb0JBQW9CO0FBR3pCLFVBQUksQ0FBQyxLQUFLLCtCQUErQjtBQUN2QyxhQUFLLGdDQUFnQztBQUFBLE1BQ3ZDO0FBRUEsVUFBSSxDQUFDLEtBQUssbUJBQW1CO0FBRTNCLGFBQUssb0NBQW9DLGFBQWE7QUFDdEQsYUFBSyxrQ0FBa0MsYUFBYTtBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBRVEsa0JBQWtCLE9BQTBCO0FBQ2xELFlBQU0sd0JBQXdCLE1BQU07QUFFcEMsV0FBSyx1QkFBdUI7QUFDNUIsV0FBSyxpQ0FBaUM7QUFDdEMsV0FBSyxnQ0FBZ0M7QUFFckMsVUFBSSwwQkFBMEIsUUFBUSwwQkFBMEIsS0FBSyx3QkFBd0I7QUFDM0YsYUFBSyxvQkFBQTtBQUNMLGFBQUsseUJBQXlCLHFCQUFxQjtBQUFBLE1BQ3JELFdBQVcsMEJBQTBCLEtBQUssd0JBQXdCO0FBQ2hFLGFBQUssMkJBQUE7QUFDTCxhQUFLLHNCQUFBO0FBQUEsTUFDUDtBQUdBLFdBQUssY0FBQTtBQUFBLElBQ1A7QUFBQSxJQUVRLG1CQUFnQjtBQUN0QixVQUFJLENBQUMsS0FBSyxnQ0FBZ0M7QUFDeEMsYUFBSyxzQkFBQTtBQUFBLE1BQ1AsT0FBTztBQUNMLGFBQUssa0JBQWtCLEtBQUssaUJBQWlCO0FBQUEsTUFDL0M7QUFFQSxXQUFLLGtCQUFrQjtBQUFBLElBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFRUSxTQUNOLFdBQ0EsZ0JBQThDO0FBRTlDLGFBQU87QUFBQSw4QkFDbUIsU0FBUztBQUFBLCtDQUNRLGNBQWM7QUFBQTtBQUFBO0FBQUEsSUFHM0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEsZ0JBQWE7QUFDbkIsV0FBSyxZQUNELGlCQUFvQyw0REFBaUMsRUFDdEUsUUFBUSxDQUFDLFlBQVksUUFBUSxPQUFPO0FBQUEsSUFDekM7QUFBQSxJQUVRLDBCQUEwQixXQUFvQjtBQUNwRCxVQUFJLENBQUMsVUFBVSxRQUFRLFFBQVE7QUFDN0IsZUFBTyx1QkFBdUIsK0JBQStCLEtBQUssVUFBVSxTQUFTO0FBQUEsVUFDbkYsVUFBVTtBQUFBLFFBQUEsQ0FDWDtBQUFBLE1BQ0g7QUFFQSxVQUFJO0FBQ0osWUFBTSxtQkFBbUIsS0FBSywrQkFBK0IsVUFBVSxlQUFnQjtBQUN2RixZQUFNLHNCQUFzQixLQUFLLCtCQUErQixVQUFVLGVBQWdCO0FBRTFGLDhCQUF3Qix1QkFBdUIsdUJBQXVCLEtBQUssVUFBVSxTQUFTO0FBQUEsUUFDNUYsVUFBVTtBQUFBLE1BQUEsQ0FDWDtBQUVELFVBQUksQ0FBQyxLQUFLLGVBQWU7QUFFdkIsY0FBTSxhQUFhLEtBQUssbUNBQW1DLFVBQVUsTUFBTTtBQUMzRSxjQUFNLGdCQUFnQix1QkFDcEIsb0NBQ0EsS0FBSyxVQUFVLFNBQ2YsQ0FBQyxXQUFXLE9BQU8sV0FBVyxRQUFRLENBQUM7QUFFekMsZ0NBQXdCLHNCQUFzQixPQUFPLElBQUksRUFBRSxPQUFPLGFBQWEsRUFBRSxPQUFPLElBQUk7QUFBQSxNQUM5RjtBQUVBLFVBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMscUJBQXFCO0FBQy9DLGlDQUNFLE9BQU8sdUJBQXVCLDRCQUE0QixLQUFLLFVBQVUsT0FBTyxJQUFJO0FBQ3RGLGlDQUF5QixzQkFBc0IsT0FBTyxtQkFBbUI7QUFBQSxNQUMzRTtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFUSwrQkFBK0Isc0JBQW1DO0FBQ3hFLFlBQU0scUJBQStCLENBQUE7QUFFckMsYUFBTyxzQkFDSCxJQUFJLENBQUMsdUJBQXNCO0FBQzNCLGNBQU0sT0FBTyxtQkFBbUI7QUFDaEMsWUFBSSxDQUFDO0FBQU0saUJBQU87QUFFbEIsY0FBTSwwQkFBMEIsbUJBQW1CLFFBQVEsSUFBSSxJQUFJO0FBQ25FLGNBQU0sY0FBYyx1QkFDbEIsbUJBQW1CLE1BQ25CLEtBQUssVUFBVSxPQUFPO0FBRXhCLGNBQU0scUJBQ0osS0FBSyw0QkFBNEIsUUFBUSxJQUFJLE1BQU0sTUFDbkQsS0FBSyxnQkFBZ0IsUUFBUSxJQUFJLE1BQU07QUFFekMsWUFBSSxDQUFDLHlCQUF5QjtBQUM1Qiw2QkFBbUIsS0FBSyxtQkFBbUIsSUFBSztBQUFBLFFBQ2xEO0FBQ0EsZUFBTyxDQUFDLENBQUMsZUFBZSxDQUFDLDJCQUEyQixxQkFBcUIsY0FBYztBQUFBLE1BQ3pGLENBQUMsRUFDQSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLEVBQ3JDLEtBQUssSUFBSTtBQUFBLElBQ2Q7QUFBQTs7QUFydUJGLGlCQUFBLE1BQUEsbUJBQUEsRUFBQSxPQUFBLFdBQUEsR0FBQSxrQkFBQSxFQUFBLE1BQUEsU0FBQSxNQUFBLFdBQUEsTUFBQSxVQUFBLFVBQUEsR0FBQSxNQUFBLHVCQUFBOzs7UUFDeUIsR0FBQSxTQUF5QixDQUFDLGlCQUFpQixLQUFLLEdBRG5FLGtCQUFBLFlBQUEsdUJBQUEsR0FBMEI7OzsifQ==
832
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJQb3BvdmVyRWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3BvcG92ZXIuanMnO1xuaW1wb3J0IHsgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcC5qcyc7XG5cbmltcG9ydCB7IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24gfSBmcm9tICcuLi9jb21tb24udHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb2FjaEl0ZW0sXG4gIFBsYWNlLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBCYXNlRWxlbWVudCxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgTmF2aWdhdGlvbkNvYWNoSXRlbSxcbn0gZnJvbSAnLi4vY29tbW9uLnRzJztcblxuaW1wb3J0IHsgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQgfSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzJztcbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24uc2Nzcz9saXQmaW5saW5lJztcblxuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9idXR0b24uanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9zY3JlZW4tcmVhZGVyLW9ubHkuanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1hcmVhLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoLnRzJztcbmltcG9ydCAnLi4vc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQudHMnO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1zZWF0LXJlc2VydmF0aW9uJylcbmNsYXNzIFNiYlNlYXRSZXNlcnZhdGlvbkVsZW1lbnQgZXh0ZW5kcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHN0eWxlXTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2NvYWNoZXNIdG1sVGVtcGxhdGU/OiBUZW1wbGF0ZVJlc3VsdDtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByaXZhdGUgX25vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zID0gWydFTlRSWV9FWElUJ107XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoYXNOYXZpZ2F0aW9uJykpIHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBmaXJzdCB1cGRhdGUgaXMgY29tcGxldGUgdG8gaW5pdCBkaWZmZXJlbnQgSFRNTCBlbGVtZW50IGRpbWVuc2lvbnNcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICB0aGlzLl9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpO1xuICAgIHJldHVybiB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlID0gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX2NvbXBvbmVudFwiPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb24oKX1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzXCJcbiAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldnQpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVsc1wiPiR7dGhpcy5fcmVuZGVyRGVja0xhYmVscygpfTwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBzY3JvbGw9JHsoKSA9PiB0aGlzLmNvYWNoQXJlYVNjcm9sbGVuZCgpfVxuICAgICAgICAgICAgaWQ9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYVwiXG4gICAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzYmItc3JfX3BhcmVudC1hcmVhXCIgY2xhc3M9XCJzYmItc3JfX3BhcmVudFwiPlxuICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgJ3NiYi1zcl9fbGlzdC1kZWNrcyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzLS1nYXAnOiB0aGlzLmhhc011bHRpcGxlRGVja3MsXG4gICAgICAgICAgICAgICAgfSl9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgICAoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpIGNsYXNzPVwic2JiLXNyX19saXN0LWl0ZW0tZGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNiYi1zcl9fbGlzdC1jb2FjaGVzXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaGVzKHNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJEZWNrTGFiZWxzKCk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVEZWNrcykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5zZWF0UmVzZXJ2YXRpb25zLm1hcCgoc2VhdFJlc2VydmF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBkZWNrRGVzY3JpcHRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoTGV2ZWwsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGh0bWxgPGIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkZWNrRGVzY3JpcHRpb259PC9iPmA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbihidG5EaXJlY3Rpb246IHN0cmluZyk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24gfHwgIXRoaXMuc2VhdFJlc2VydmF0aW9ucykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJ1xuICAgICAgICA/ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1yaWdodCdcbiAgICAgICAgOiAnc2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvbi0tbGVmdCc7XG4gICAgY29uc3QgYnRuSWNvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgPyAnY2hldnJvbi1zbWFsbC1yaWdodC1zbWFsbCcgOiAnY2hldnJvbi1zbWFsbC1sZWZ0LXNtYWxsJztcbiAgICBjb25zdCBidG5BcmlhRGVzY3JpcHRpb24gPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9FTkQnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ1NFQVRfUkVTRVJWQVRJT05fQkVHSU4nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICBsZXQgYnRuRGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID4gMCkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA8IHRoaXMuY29hY2hOYXZEYXRhLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIGJ0bkRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb25cIj5cbiAgICAgIDxzYmItc2Vjb25kYXJ5LWJ1dHRvblxuICAgICAgICBAY2xpY2s9XCIkeygpID0+IHRoaXMubmF2aWdhdGVCeURpcmVjdGlvbkJ0bihidG5EaXJlY3Rpb24pfVwiXG4gICAgICAgIEBmb2N1cz1cIiR7KCkgPT4gdGhpcy5vbkZvY3VzTmF2RGlyZWN0aW9uQnV0dG9uKCl9XCJcbiAgICAgICAgaWQ9XCIke2J0bk5hdmlnYXRpb25EaXJlY3Rpb25JZH1cIlxuICAgICAgICBjbGFzcz1cInNiYi1zcl9fbmF2aWdhdGlvbi1jb250cm9sLWJ1dHRvblwiXG4gICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgaWNvbi1uYW1lPVwiJHtidG5JY29ufVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtidG5BcmlhRGVzY3JpcHRpb259XCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIC5kaXNhYmxlZEludGVyYWN0aXZlPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICAgIC5kaXNhYmxlZD1cIiR7YnRuRGlzYWJsZWQgfHwgbm90aGluZ31cIlxuICAgICAgPjwvc2JiLXNlY29uZGFyeS1idXR0b24+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb24td3JhcHBlclwiPlxuICAgICAgPG5hdiBpZD1cInNiYi1zci1uYXZpZ2F0aW9uXCIgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvblwiPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKCdESVJFQ1RJT05fTEVGVCcpfVxuICAgICAgICA8dWxcbiAgICAgICAgICBpZD1cInNiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXNcIlxuICAgICAgICAgIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX2xpc3QtY29hY2hlc1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Z2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICAgICdTRUFUX1JFU0VSVkFUSU9OX05BVklHQVRJT04nLFxuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgICApfVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY29hY2hOYXZEYXRhLm1hcCgobmF2aWdhdGlvbkNvYWNoOiBOYXZpZ2F0aW9uQ29hY2hJdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbGA8bGk+XG4gICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoXG4gICAgICAgICAgICAgICAgQHNlbGVjdGNvYWNoPSR7KGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KSA9PiB0aGlzLl9vblNlbGVjdE5hdkNvYWNoKGV2ZW50KX1cbiAgICAgICAgICAgICAgICBAZm9jdXNjb2FjaD0keygpID0+IHRoaXMuX29uRm9jdXNOYXZDb2FjaCgpfVxuICAgICAgICAgICAgICAgIEBrZXl1cD0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMub25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oZXZ0LCBpbmRleCl9XG4gICAgICAgICAgICAgICAgaW5kZXg9XCIke2luZGV4fVwiXG4gICAgICAgICAgICAgICAgY29hY2gtaWQ9XCIke25hdmlnYXRpb25Db2FjaC5pZH1cIlxuICAgICAgICAgICAgICAgIC5mcmVlUGxhY2VzQnlUeXBlPVwiJHtuYXZpZ2F0aW9uQ29hY2guZnJlZVBsYWNlc31cIlxuICAgICAgICAgICAgICAgIC5zZWxlY3RlZD0ke3RoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAuZm9jdXNlZD0ke3RoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgIC5ob3ZlcmVkPSR7dGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgLm5hdGl2ZUZvY3VzQWN0aXZlPSR7dGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1c31cbiAgICAgICAgICAgICAgICAucHJvcGVydHlJZHM9XCIke25hdmlnYXRpb25Db2FjaC5wcm9wZXJ0eUlkc31cIlxuICAgICAgICAgICAgICAgIC50cmF2ZWxDbGFzcz1cIiR7bmF2aWdhdGlvbkNvYWNoLnRyYXZlbENsYXNzfVwiXG4gICAgICAgICAgICAgICAgP2RyaXZlci1hcmVhPVwiJHtuYXZpZ2F0aW9uQ29hY2guaXNEcml2ZXJBcmVhfVwiXG4gICAgICAgICAgICAgICAgP2ZpcnN0PVwiJHtuYXZpZ2F0aW9uQ29hY2g/LmRyaXZlckFyZWFTaWRlPy5sZWZ0fVwiXG4gICAgICAgICAgICAgICAgP2xhc3Q9XCIke25hdmlnYXRpb25Db2FjaD8uZHJpdmVyQXJlYVNpZGU/LnJpZ2h0fVwiXG4gICAgICAgICAgICAgICAgP3ZlcnRpY2FsPVwiJHt0aGlzLmFsaWduVmVydGljYWx9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2g+XG4gICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9SSUdIVCcpfVxuICAgICAgPC9uYXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuICAvKipcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQHBhcmFtIHNlYXRSZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gY29hY2hEZWNrSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoZXMoXG4gICAgc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoZXM6IENvYWNoSXRlbVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXMpKTtcblxuICAgIGlmICghY29hY2hlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2FjaGVzLm1hcCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxsaSBjbGFzcz1cInNiYi1zcl9faXRlbS1jb2FjaFwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgICAgICAgICAgY29hY2hJdGVtLFxuICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICl9XG4gICAgICAgIDwvbGk+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hFbGVtZW50KFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaEl0ZW0uZGltZW5zaW9uKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXMgPSB0aGlzLl9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtKTtcblxuICAgIHJldHVybiBodG1sYDxzYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWRcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtd2lkdGgnOiBjYWxjdWxhdGVkQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi5oLFxuICAgICAgfSl9XG4gICAgPlxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhjb2FjaEl0ZW0pfVxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZEdyYXBoaWNhbEVsZW1lbnRzKFxuICAgICAgICBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzIHx8IFtdLFxuICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKGNvYWNoSW5kZXgsIGNvYWNoRGVja0luZGV4LCBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzKX1cblxuICAgICAgPHRhYmxlXG4gICAgICAgIEBmb2N1cz0keygpID0+IHRoaXMub25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShjb2FjaEluZGV4KX1cbiAgICAgICAgaWQ9XCJzYmItc3ItY29hY2gtJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyLWNvYWNoLXdyYXBwZXJfX3RhYmxlXCJcbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgID5cbiAgICAgICAgPGNhcHRpb24gaWQ9XCJzYmItc3ItY29hY2gtY2FwdGlvbi0ke2NvYWNoSW5kZXh9XCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7ZGVzY3JpcHRpb25UYWJsZUNvYWNoV2l0aFNlcnZpY2VzfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgPC9jYXB0aW9uPlxuICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkUm93UGxhY2VzKGNvYWNoSXRlbSwgY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIHBsYWNlQ29hY2hEZWNrSW5kZXgpfVxuICAgICAgPC90YWJsZT5cbiAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZD5gO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGJvcmRlciBncmFwaGljIChDT0FDSF9CT1JERVJfTUlERExFKSBvZiBhIGNvYWNoIHdpdGggY2FsY3VsYXRlZCBib3JkZXIgZ2FwIGFuZCBjb2FjaCB3aWR0aCxcbiAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvYWNoIGlzIHdpdGggYSBkcml2ZXIgYXJlYSBvciB3aXRob3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2FjaEJvcmRlcnMoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBDT0FDSF9QQVNTQUdFX1dJRFRIID0gMTtcbiAgICBjb25zdCBhbGxFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM7XG4gICAgY29uc3QgZHJpdmVyQXJlYSA9IGFsbEVsZW1lbnRzPy5maW5kKChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUEnKTtcbiAgICBsZXQgYm9yZGVyV2lkdGggPSBkcml2ZXJBcmVhXG4gICAgICA/IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIGRyaXZlckFyZWEuZGltZW5zaW9uLncgLSBDT0FDSF9QQVNTQUdFX1dJRFRIXG4gICAgICA6IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIENPQUNIX1BBU1NBR0VfV0lEVEggKiAyO1xuXG4gICAgLy9tdWx0aXBseSB3aXRoIGJhc2UgZ3JpZCBzaXplIGFsd2F5cyBmb3IgYWxsIGtpbmQgb2YgYm9yZGVyV2lkdGhcbiAgICBib3JkZXJXaWR0aCAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaEl0ZW0uZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICBsZXQgYm9yZGVyT2Zmc2V0WCA9XG4gICAgICBkcml2ZXJBcmVhICYmIGRyaXZlckFyZWEucG9zaXRpb24ueCA9PT0gMFxuICAgICAgICA/IGRyaXZlckFyZWE/LmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemVcbiAgICAgICAgOiB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbyA9IHRoaXMub3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb24uZmluZChcbiAgICAgIChlbCkgPT4gZWwuY29hY2hJZCA9PSBjb2FjaEl0ZW0uaWQsXG4gICAgKTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIHRvIGFkanVzdCB0aGUgYm9yZGVyIHdpZHRoIGFuZCBvZmZzZXQgKyBnYXBcbiAgICAvLyBXZSBkbyBub3QgZGlmZmVyZW50aWF0ZSB3aGV0aGVyIHRoZXJlIGlzIHNvbWV0aGluZyB0byBiZSBkb25lIG9uIGJvdGggc2lkZXMgYXMgdGhpcyB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5XG4gICAgLy8gY29tcGxleGl0eS4gU28gaWYgdGhlcmUgaXMgc29tZXRoaW5nIG9uIG9uZSBzaWRlLCB3ZSBqdXN0IGluY3JlYXNlIHRoZSBjb2FjaC1ib3JkZXIgb24gYm90aCBzaWRlcy5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nR3JhcGhpY0FyZWFzXG4gICAgKSB7XG4gICAgICBib3JkZXJXaWR0aCArPSAyICogdGhpcy5iYXNlR3JpZFNpemU7IC8vIHdlIGluY3JlYXNlIHRoZSB3aWR0aCBieSAyIGdyaWQgc2l6ZXMgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHByb3RydWRlZCBwbGFjZXMgb24gYm90aCBzaWRlc1xuICAgICAgYm9yZGVyT2Zmc2V0WCA9IDA7IC8vIHdlIHN0YXJ0IGF0IDAgdG8gaGF2ZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGxlZnQgc2lkZSBhcyB3ZWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICdzYmItc3ItY29hY2gtaGFzLW92ZXJoYW5naW5nLWVsZW1lbnRzJzpcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXMgfHxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBib3JkZXJIZWlnaHQsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAqIC0xLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGJvcmRlck9mZnNldFgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgIH0pfVxuICAgICAgICBuYW1lPVwiQ09BQ0hfQk9SREVSX01JRERMRVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFJvd1BsYWNlcyhcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghY29hY2gucGxhY2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHJvd3Mgd2l0aCB0aGUgcGxhY2VzIHRvIHJlbmRlciBhIHRhYmxlXG4gICAgY29uc3QgdGFibGVSb3dQbGFjZXM6IFJlY29yZDxudW1iZXIsIFBsYWNlW10+ID0ge307XG4gICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgIGlmICghdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0pIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0gPSBbcGxhY2VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0ucHVzaChwbGFjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGFibGVSb3dQbGFjZXMpXG4gICAgICAubWFwKChyb3dQbGFjZXM6IFBsYWNlW10sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ciBpZD1cInJvdy0ke2NvYWNoSW5kZXh9LSR7cm93UGxhY2VzWzBdLnBvc2l0aW9uLnl9XCIgZGF0YS1yb3ctaW5kZXg9JHtpbmRleH0+XG4gICAgICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgICAgICAgICAgICByb3dQbGFjZXMsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgICBwbGFjZUNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfSlcbiAgICAgIC5mbGF0TWFwKChyb3dUZW1wbGF0ZSkgPT4gcm93VGVtcGxhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgcGxhY2VzOiBQbGFjZVtdLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBkZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgLy9Tb3J0cyBlYWNoIHBsYWNlIGJ5IGl0cyBhc2NlbmRpbmcgeCBjb29yZGluYXRlXG4gICAgcGxhY2VzLnNvcnQoXG4gICAgICAocGxhY2VBOiBQbGFjZSwgcGxhY2VCOiBQbGFjZSkgPT4gTnVtYmVyKHBsYWNlQS5wb3NpdGlvbi54KSAtIE51bWJlcihwbGFjZUIucG9zaXRpb24ueCksXG4gICAgKTtcblxuICAgIC8vIEZvciByZW5kZXJpbmcgdGhlIHBsYWNlcyB3aXRoaW4gYSB0ZCBlbGVtZW50LCBoZXJlIHdlIHVzZSByZXBlYXQgZGlyZWN0aXZlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgZWxlbWVudHMgKHRyYWNrIGJ5IGlkKS5cbiAgICBjb25zdCB0cmFja1BsYWNlSWQgPSBjb2FjaEluZGV4ICsgJy0nICsgcGxhY2VDb2FjaERlY2tJbmRleDtcbiAgICByZXR1cm4gaHRtbGAke3JlcGVhdChcbiAgICAgIHBsYWNlcyxcbiAgICAgIChwbGFjZSkgPT4gdHJhY2tQbGFjZUlkICsgJy0nICsgcGxhY2UubnVtYmVyLFxuICAgICAgKHBsYWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHBsYWNlLmRpbWVuc2lvbik7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHBsYWNlLnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBwbGFjZS5yb3RhdGlvbiB8fCAwO1xuICAgICAgICBjb25zdCB0ZXh0Um90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyAtOTAgOiAwO1xuICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChkZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgaWQ9XCJjZWxsLSR7ZGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7cGxhY2UucG9zaXRpb24ueX0tJHtpbmRleH1cIlxuICAgICAgICAgICAgY2xhc3M9XCJncmFwaGljYWwtZWxlbWVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXNjYWxlLXZhbHVlJzogTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1yb3RhdGlvbic6IHRleHRSb3RhdGlvbixcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIEBzZWxlY3RwbGFjZT0keyhzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50KX1cbiAgICAgICAgICAgICAgZXhwb3J0cGFydHM9XCJzYmItc3ItcGxhY2UtcGFydFwiXG4gICAgICAgICAgICAgIGlkPSR7cGxhY2VJZH1cbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0ZXh0PSR7cGxhY2UubnVtYmVyfVxuICAgICAgICAgICAgICB0eXBlPSR7cGxhY2UudHlwZX1cbiAgICAgICAgICAgICAgc3RhdGU9JHtwbGFjZS5zdGF0ZX1cbiAgICAgICAgICAgICAgY29hY2gtaW5kZXg9JHtjb2FjaEluZGV4fVxuICAgICAgICAgICAgICBkZWNrLWluZGV4PSR7cGxhY2VDb2FjaERlY2tJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1kZWNrLWluZGV4PSR7ZGVja0luZGV4fVxuICAgICAgICAgICAgICAucHJvcGVydHlJZHM9JHtwbGFjZS5wcm9wZXJ0eUlkc31cbiAgICAgICAgICAgICAgLnByZXZlbnRDbGljaz0ke3RoaXMucHJldmVudFBsYWNlQ2xpY2t9XG4gICAgICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIGA7XG4gICAgICB9LFxuICAgICl9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkR3JhcGhpY2FsRWxlbWVudHMoXG4gICAgZ3JhcGhpY2FsRWxlbWVudHM6IEJhc2VFbGVtZW50W10sXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIWdyYXBoaWNhbEVsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBncmFwaGljYWxFbGVtZW50cz8ubWFwKChncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgaWNvbiA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvbiA/PyAnJztcbiAgICAgIGNvbnN0IGVsZW1lbnRSb3RhdGlvbiA9IGdyYXBoaWNhbEVsZW1lbnQucm90YXRpb24gfHwgMDtcbiAgICAgIGNvbnN0IGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnQgPVxuICAgICAgICB0aGlzLl9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucy5pbmRleE9mKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpID09PSAtMTtcbiAgICAgIGNvbnN0IGVsZW1lbnRGaXhlZFJvdGF0aW9uID1cbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsICYmIGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnRcbiAgICAgICAgICA/IGVsZW1lbnRSb3RhdGlvbiAtIDkwXG4gICAgICAgICAgOiBlbGVtZW50Um90YXRpb247XG5cbiAgICAgIC8vY2hlY2sgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBub3QgYW4gYXJlYSBlbGVtZW50LCBzaW5jZSB0aGlzIGVsZW1lbnQgaXMgZHJhd24gd2l0aG91dCBhbiBhcmVhIGNvbXBvbmVudFxuICAgICAgaWYgKHRoaXMubm90QXJlYUVsZW1lbnRzLmZpbmRJbmRleCgobm90QXJlYUVsZW1lbnQpID0+IG5vdEFyZWFFbGVtZW50ID09PSBpY29uKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRSZW5kZXJFbGVtZW50V2l0aG91dEFyZWEoZ3JhcGhpY2FsRWxlbWVudCwgZWxlbWVudFJvdGF0aW9uLCBjb2FjaERpbWVuc2lvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0UmVuZGVyRWxlbWVudFdpdGhBcmVhKFxuICAgICAgICBncmFwaGljYWxFbGVtZW50LFxuICAgICAgICBlbGVtZW50Rml4ZWRSb3RhdGlvbixcbiAgICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGVzIGEgcmVuZGVyZWQgZWxlbWVudCB3aXRoIGFuIGFyZWEgY29tcG9uZW50XG4gICAqIEBwYXJhbSBncmFwaGljYWxFbGVtZW50XG4gICAqIEBwYXJhbSByb3RhdGlvblxuICAgKiBAcGFyYW0gY29hY2hEaW1lbnNpb25cbiAgICogQHBhcmFtIGNvYWNoSW5kZXggdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpZCBmb3IgdGhlIHBvcG92ZXIgdHJpZ2dlclxuICAgKiBAcGFyYW0gY29hY2hEZWNrSW5kZXggdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyRWxlbWVudFdpdGhBcmVhKFxuICAgIGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIHJvdGF0aW9uOiBudW1iZXIsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAvLyBmb3IgVEFCTEUsIHdlIHVzZSB0aGUgYXJlYSBjb21wb25lbnQgaXRzZWxmIHRvIGRpc3BsYXkgdGhlIHRhYmxlIGluc3RlYWQgb2YgdGhlIFNWRyBncmFwaGljLlxuICAgIC8vIER1ZSB0byBkaWZmZXJlbnQgaGVpZ2h0cyBhbmQgd2lkdGhzLCBpdCB3b3VsZG4ndCBzaG93IGNvcnJlY3RseS4gVG8gY29ycmVjdCB0aGlzLCB3ZSB3b3VsZFxuICAgIC8vIG5lZWQgZGlmZmljdWx0IGNhbGN1bGF0aW9ucyBmb3IgcG9zaXRpb24sIHJvdGF0aW9uIGFuZCBkaW1lbnNpb24uXG4gICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBncmFwaGljYWxFbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgIGNvbnN0IGFyZWFQcm9wZXJ0eSA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvbiAmJiBpc05vdFRhYmxlR3JhcGhpYyA/IGdyYXBoaWNhbEVsZW1lbnQuaWNvbiA6IG51bGw7XG4gICAgY29uc3Qgc3RyZXRjaEhlaWdodCA9XG4gICAgICB0aGlzLmlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoZ3JhcGhpY2FsRWxlbWVudCwgY29hY2hEaW1lbnNpb24pICYmXG4gICAgICBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJztcbiAgICBjb25zdCBhcmlhTGFiZWxGb3JBcmVhID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uXG4gICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oZ3JhcGhpY2FsRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgOiBub3RoaW5nO1xuXG4gICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgICB0cnVlLFxuICAgICAgc3RyZXRjaEhlaWdodCxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24sXG4gICAgICBjb2FjaERpbWVuc2lvbixcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIC8vZ2VuZXJhdGUgdW5pcXVlIGluZGV4IG51bWJlciBmb3IgdGhlIHRyaWdnZXIgZWxlbWVudFxuICAgIGNvbnN0IHRyaWdnZXJJZCA9IGBwb3BvdmVyLXRyaWdnZXItJHtjb2FjaERlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi54fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi55fWA7XG4gICAgbGV0IGVsZW1lbnRNb3VudGluZyA9ICdmcmVlJztcblxuICAgIGlmIChncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLnkgPT09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAtMSkge1xuICAgICAgZWxlbWVudE1vdW50aW5nID0gJ3VwcGVyLWJvcmRlcic7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24ueSArIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLmggPT09XG4gICAgICBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldFxuICAgICkge1xuICAgICAgZWxlbWVudE1vdW50aW5nID0gJ2xvd2VyLWJvcmRlcic7XG4gICAgfVxuXG4gICAgLy8gVElNTy00NTgzMFxuICAgIC8vIElmIGFyZWEgZWxlbWVudHMgYXJlIGxvY2F0ZWQgYXQgdGhlIGJvcmRlciBvZiBjb2FjaCxcbiAgICAvLyB3ZSBoYXZlIHRvIG1hbnVhbGx5IG1vZGlmeSB0aGUgcG9zaXRpb24gYW5kIGhlaWdodCBvZiB0aGUgYXJlYSBlbGVtZW50LFxuICAgIC8vIHNvIHRoYXQgd2UgZ2V0IGEgZ2FwIGZyb20gdGhlIHZpc3VlbCBjb2FjaCBib3JkZXJcbiAgICBpZiAoZWxlbWVudE1vdW50aW5nICE9PSAnZnJlZScpIHtcbiAgICAgIGNhbGN1bGF0ZWRQb3NpdGlvbi55ICs9IGVsZW1lbnRNb3VudGluZyA9PT0gJ3VwcGVyLWJvcmRlcicgPyAyIDogMTtcbiAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24uaCAtPSAzO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhXG4gICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHsgJ3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtLWN1cnNvci1wb2ludGVyJzogYXJlYVByb3BlcnR5ICE9PSBudWxsIH0pfVwiXG4gICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgfSl9XG4gICAgICAgIG1vdW50aW5nPSR7ZWxlbWVudE1vdW50aW5nfVxuICAgICAgICBiYWNrZ3JvdW5kPVwiZGFya1wiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgICR7YXJlYVByb3BlcnR5XG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IHRoaXMuYmFzZUdyaWRTaXplLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIG5hbWU9JHthcmVhUHJvcGVydHl9XG4gICAgICAgICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImF1dG8td2lkdGhcIlxuICAgICAgICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgICAgICAgICAgYFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYT5cbiAgICAgICR7YXJlYVByb3BlcnR5ID8gdGhpcy5fcG9wb3Zlcih0cmlnZ2VySWQsIGFyaWFMYWJlbEZvckFyZWEpIDogbm90aGluZ31cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyRWxlbWVudFdpdGhvdXRBcmVhKFxuICAgIGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIHJvdGF0aW9uOiBudW1iZXIsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5kaW1lbnNpb24sXG4gICAgICBjb2FjaERpbWVuc2lvbixcbiAgICApO1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbixcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSBpY29uIGlzIHRoZSBkcml2ZXIgYXJlYSwgdGhlbiBoZXJlIGNvbmNhdCB0aGUgdmVoaWNsZSB0eXBlIHRvIGdldCB0aGUgcmlnaHQgdmVoaWNsZSBjaGFzc2lzIGljb25cbiAgICBjb25zdCBpY29uID1cbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuaWNvbiAmJiBncmFwaGljYWxFbGVtZW50Lmljb24uaW5kZXhPZignRFJJVkVSX0FSRUEnKSA9PT0gLTFcbiAgICAgICAgPyBncmFwaGljYWxFbGVtZW50Lmljb25cbiAgICAgICAgOiBncmFwaGljYWxFbGVtZW50Lmljb24/LmNvbmNhdChcbiAgICAgICAgICAgICdfJyxcbiAgICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0udmVoaWNsZVR5cGUsXG4gICAgICAgICAgKTtcblxuICAgIHJldHVybiBodG1sYCA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi55LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiByb3RhdGlvbixcbiAgICAgIH0pfVxuICAgICAgbmFtZT0ke2ljb24gPz8gbm90aGluZ31cbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICA/c3RyZXRjaD0ke3RydWV9XG4gICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgc2VydmljZUVsZW1lbnRzPzogQmFzZUVsZW1lbnRbXSxcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghc2VydmljZUVsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBzZXJ2aWNlRWxlbWVudHM/Lm1hcCgoc2VydmljZUVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB0aXRsZURlc2NyaXB0aW9uID0gc2VydmljZUVsZW1lbnQuaWNvblxuICAgICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oc2VydmljZUVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihzZXJ2aWNlRWxlbWVudC5kaW1lbnNpb24pO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24oc2VydmljZUVsZW1lbnQucG9zaXRpb24pO1xuICAgICAgY29uc3QgZWxlbWVudFJvdGF0aW9uID0gc2VydmljZUVsZW1lbnQucm90YXRpb24gfHwgMDtcbiAgICAgIGNvbnN0IGVsZW1lbnRGaXhlZFJvdGF0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsID8gZWxlbWVudFJvdGF0aW9uIC0gOTAgOiBlbGVtZW50Um90YXRpb247XG5cbiAgICAgIC8vZ2VuZXJhdGUgdW5pcXVlIGluZGV4IG51bWJlciBmb3IgdGhlIHRyaWdnZXIgZWxlbWVudFxuICAgICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7Y2FsY3VsYXRlZFBvc2l0aW9uLnh9LSR7Y2FsY3VsYXRlZFBvc2l0aW9uLnl9YDtcblxuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgICAgaWQ9XCIke3RyaWdnZXJJZH1cIlxuICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGNhbGN1bGF0ZWRQb3NpdGlvbi54LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogZWxlbWVudEZpeGVkUm90YXRpb24sXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgY2xhc3M9XCJzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgbmFtZT0ke3NlcnZpY2VFbGVtZW50Lmljb24gPz8gbm90aGluZ31cbiAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgICAgICAke3RoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCB0aXRsZURlc2NyaXB0aW9uKX1cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlcyB0aGUgc2VsZWN0ZWQgcGxhY2UgZXZlbnQgdHJpZ2dlcmVkIGZyb20gdGhlIHBsYWNlXG4gICAqIEVhY2ggc2VsZWN0aW9uIGVtaXRzIGFuIGFycmF5IG9mIGFsbCBzZWxlY3RlZCBwbGFjZXNcbiAgICogQHBhcmFtIHNlbGVjdFBsYWNlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0UGxhY2Uoc2VsZWN0UGxhY2VFdmVudDogQ3VzdG9tRXZlbnQ8UGxhY2VTZWxlY3Rpb24+KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZSA9IHNlbGVjdFBsYWNlRXZlbnQuZGV0YWlsO1xuICAgIC8vIFdlIGhhdmUgdG8gc2V0IHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayB0byB0cnVlLCB0byBwcmV2ZW50IGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIG5ldyBmb2N1c2VkIHBsYWNlXG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmV2ZW50UGxhY2VDbGljaykge1xuICAgICAgLy8gQWRkIHBsYWNlIHRvIHBsYWNlIGNvbGxlY3Rpb25cbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoc2VsZWN0ZWRQbGFjZSk7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChzZWxlY3RlZFBsYWNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdE5hdkNvYWNoKGV2ZW50OiBDdXN0b21FdmVudDxudW1iZXI+KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYXZDb2FjaEluZGV4ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG5cbiAgICBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSBudWxsICYmIHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5hdkNvYWNoSW5kZXggPT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG5cbiAgICAvL2Nsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnNcbiAgICB0aGlzLl9jbG9zZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRm9jdXNOYXZDb2FjaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSB7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgIH1cblxuICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBvcG92ZXIgZm9yIGV4dHJhIHNlcnZpY2UgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHRyaWdnZXJJZFxuICAgKiBAcGFyYW0gcG9wb3ZlckNvbnRlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX3BvcG92ZXIoXG4gICAgdHJpZ2dlcklkOiBzdHJpbmcsXG4gICAgcG9wb3ZlckNvbnRlbnQ6IHN0cmluZyB8IG51bGwgfCB0eXBlb2Ygbm90aGluZyxcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1wb3BvdmVyIHRyaWdnZXI9XCIke3RyaWdnZXJJZH1cIiBob3Zlci10cmlnZ2VyPVwiXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic2JiLXRleHQtcyBzYmItc3ItcG9wb3ZlclwiPiR7cG9wb3ZlckNvbnRlbnR9PC9wPlxuICAgICAgPC9zYmItcG9wb3Zlcj5cbiAgICBgO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXIgdG8gY2xvc2UgYWxsIG9wZW5lZCBwb3BvdmVycyAobm9ybWFsbHkgb25seSBvbmUgaXMgb3BlbmVkIGF0IGEgdGltZSlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2Nsb3NlUG9wb3ZlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8ucXVlcnlTZWxlY3RvckFsbDxTYmJQb3BvdmVyRWxlbWVudD4oJ3NiYi1wb3BvdmVyOnN0YXRlKHN0YXRlLW9wZW5lZCknKVxuICAgICAgLmZvckVhY2goKHBvcG92ZXIpID0+IHBvcG92ZXIuY2xvc2UoKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZXNjcmlwdGlvblRhYmxlQ29hY2goY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBzdHJpbmcge1xuICAgIGlmICghY29hY2hJdGVtLnBsYWNlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfQkxPQ0tFRF9UQUJMRV9DQVBUSU9OJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCwgW1xuICAgICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBsZXQgdGFibGVDb2FjaERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgYXJlYURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMhKTtcbiAgICBjb25zdCBzZXJ2aWNlRGVzY3JpcHRpb25zID0gdGhpcy5fZ2V0VGl0bGVEZXNjcmlwdGlvbkxpc3RTdHJpbmcoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyEpO1xuXG4gICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgIGNvYWNoSXRlbS5pZCxcbiAgICBdKTtcblxuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAvLyBFeHBhbmRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNlYXRzIGFuZCBiaWN5Y2xlIHNwYWNlcyBhcyBpbmZvXG4gICAgICBjb25zdCBmcmVlUGxhY2VzID0gdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKGNvYWNoSXRlbS5wbGFjZXMpO1xuICAgICAgY29uc3QgZnJlZVBsYWNlc1R4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICdDT0FDSF9BVkFJTEFCTEVfTlVNQkVSX09GX1BMQUNFUycsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgIFtmcmVlUGxhY2VzLnNlYXRzLCBmcmVlUGxhY2VzLmJpY3ljbGVzXSxcbiAgICAgICk7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gPSB0YWJsZUNvYWNoRGVzY3JpcHRpb24uY29uY2F0KCcuICcpLmNvbmNhdChmcmVlUGxhY2VzVHh0KS5jb25jYXQoJy4gJyk7XG4gICAgfVxuXG4gICAgaWYgKCEhYXJlYURlc2NyaXB0aW9ucyB8fCAhIXNlcnZpY2VEZXNjcmlwdGlvbnMpIHtcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPVxuICAgICAgICAnLiAnICsgZ2V0STE4blNlYXRSZXNlcnZhdGlvbignQ09BQ0hfQVZBSUxBQkxFX1NFUlZJQ0VTJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCkgKyAnOiAnO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uICs9IHNlcnZpY2VEZXNjcmlwdGlvbnMgKyAnLCAnICsgYXJlYURlc2NyaXB0aW9ucyArICcuJztcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlQ29hY2hEZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGRlc2NyaXB0aW9uc0VsZW1lbnRzOiBCYXNlRWxlbWVudFtdKTogc3RyaW5nIHtcbiAgICBjb25zdCB1bmlxdWVEZXNjcmlwdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICByZXR1cm4gZGVzY3JpcHRpb25zRWxlbWVudHNcbiAgICAgID8ubWFwKChkZXNjcmlwdGlvbkVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgaWNvbiA9IGRlc2NyaXB0aW9uRWxlbWVudC5pY29uO1xuICAgICAgICBpZiAoIWljb24pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0ID0gdW5pcXVlRGVzY3JpcHRpb25zLmluZGV4T2YoaWNvbikgPiAtMTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5pY29uISxcbiAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc1ZhbGlkRGVzY3JpcHRpb24gPVxuICAgICAgICAgIHRoaXMuX25vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zLmluZGV4T2YoaWNvbikgPT09IC0xICYmXG4gICAgICAgICAgdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5kZXhPZihpY29uKSA9PT0gLTE7XG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCkge1xuICAgICAgICAgIHVuaXF1ZURlc2NyaXB0aW9ucy5wdXNoKGRlc2NyaXB0aW9uRWxlbWVudC5pY29uISk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhdHJhbnNsYXRpb24gJiYgIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0ICYmIGlzVmFsaWREZXNjcmlwdGlvbiA/IHRyYW5zbGF0aW9uIDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChkZXNjcmlwdGlvbikgPT4gISFkZXNjcmlwdGlvbilcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VhdC1yZXNlcnZhdGlvbic6IFNiYlNlYXRSZXNlcnZhdGlvbkVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXVDTSw2QkFBeUIsTUFBQTs7MEJBRDlCLGNBQWMsc0JBQXNCLENBQUM7Ozs7b0JBQ0U7QUFB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
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@sbb-esta/lyne-elements-experimental-dev",
3
- "version": "4.5.1-dev.1772010265",
3
+ "version": "4.5.1-dev.1772034617",
4
4
  "description": "Lyne Design System",
5
5
  "keywords": [
6
6
  "design system",
7
7
  "web components",
8
8
  "lit",
9
9
  "storybook",
10
- "https://github.com/sbb-design-systems/lyne-components/commit/48e3bc544233bdd4af091807b53d1e3b65f7721a"
10
+ "https://github.com/sbb-design-systems/lyne-components/commit/51bfd60287a6ea350060dcb747108742fbea8232"
11
11
  ],
12
12
  "type": "module",
13
13
  "exports": {
@@ -3,7 +3,7 @@ var fe = (l) => {
3
3
  };
4
4
  var Ce = (l, d, u) => d.has(l) || fe("Cannot " + u);
5
5
  var g = (l, d, u) => (Ce(l, d, "read from private field"), u ? u.call(l) : d.get(l)), v = (l, d, u) => d.has(l) ? fe("Cannot add the same private member more than once") : d instanceof WeakSet ? d.add(l) : d.set(l, u), r = (l, d, u, T) => (Ce(l, d, "write to private field"), T ? T.call(l, u) : d.set(l, u), u);
6
- import { __runInitializers as n, __esDecorate as f } from "tslib";
6
+ import { __esDecorate as f, __runInitializers as n } from "tslib";
7
7
  import { isArrowKeyOrPageKeysPressed as Se } from "@sbb-esta/lyne-elements/core/a11y.js";
8
8
  import { forceType as S } from "@sbb-esta/lyne-elements/core/decorators.js";
9
9
  import { LitElement as xe, isServer as pe } from "lit";
@@ -23,11 +23,11 @@ const Pe = 3, Ae = [
23
23
  "sa-rz"
24
24
  ];
25
25
  let ze = (() => {
26
- var x, p, _, m, y, b, P, A, E, R, N, k, h;
27
- let l = xe, d = [], u, T = [], B = [], z, G = [], O = [], F, V = [], L = [], W, H = [], K = [], M, X = [], U = [], q, $ = [], j = [], Y, J = [], Q = [], Z, ee = [], te = [], se, ie = [], ae = [], ce, oe = [], re = [], ne, le = [], he = [], de, ue = [], ge = [], ve;
26
+ var x, p, _, m, y, b, P, A, N, E, R, k, h;
27
+ let l = xe, d = [], u, T = [], B = [], z, F = [], G = [], O, V = [], L = [], W, H = [], M = [], K, X = [], U = [], q, $ = [], j = [], Y, J = [], Q = [], Z, ee = [], te = [], se, ie = [], ae = [], ce, oe = [], re = [], ne, le = [], he = [], de, ue = [], ge = [], ve;
28
28
  return h = class extends l {
29
29
  constructor() {
30
- super(...arguments);
30
+ super();
31
31
  v(this, x);
32
32
  v(this, p);
33
33
  v(this, _);
@@ -36,11 +36,11 @@ let ze = (() => {
36
36
  v(this, b);
37
37
  v(this, P);
38
38
  v(this, A);
39
+ v(this, N);
39
40
  v(this, E);
40
41
  v(this, R);
41
- v(this, N);
42
42
  v(this, k);
43
- r(this, x, (n(this, d), n(this, T, null))), r(this, p, (n(this, B), n(this, G, !0))), r(this, _, (n(this, O), n(this, V, !1))), r(this, m, (n(this, L), n(this, H, 16))), r(this, y, (n(this, K), n(this, X, null))), r(this, b, (n(this, U), n(this, $, -1))), r(this, P, (n(this, j), n(this, J, -1))), r(this, A, (n(this, Q), n(this, ee, !1))), r(this, E, (n(this, te), n(this, ie, -1))), r(this, R, (n(this, ae), n(this, oe, -1))), r(this, N, (n(this, re), n(this, le, -1))), r(this, k, (n(this, he), n(this, ue, -1))), this.coachBorderPadding = (n(this, ge), 6), this.gapBetweenCoaches = 4, this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize, this.gapBetweenCoachDecks = 48, this.coachNavButtonDim = 0, this.coachNavData = [], this.currScrollDirection = I.right, this.maxCalcCoachesWidth = 0, this.scrollCoachesAreaWidth = 0, this.scrollNavigationAreaDim = 0, this.triggerCoachPositionsCollection = [], this.navigationScrollArea = null, this.coachScrollArea = null, this.currSelectedPlace = null, this.currSelectedPlaceElementId = null, this.currSelectedCoachIndex = -1, this.currSelectedDeckIndex = 0, this.preventCoachScrollByPlaceClick = !1, this.selectedSeatReservationPlaces = {
43
+ r(this, x, (n(this, d), n(this, T, null))), r(this, p, (n(this, B), n(this, F, !0))), r(this, _, (n(this, G), n(this, V, !1))), r(this, m, (n(this, L), n(this, H, 16))), r(this, y, (n(this, M), n(this, X, null))), r(this, b, (n(this, U), n(this, $, -1))), r(this, P, (n(this, j), n(this, J, -1))), r(this, A, (n(this, Q), n(this, ee, !1))), r(this, N, (n(this, te), n(this, ie, -1))), r(this, E, (n(this, ae), n(this, oe, -1))), r(this, R, (n(this, re), n(this, le, -1))), r(this, k, (n(this, he), n(this, ue, -1))), this.coachBorderPadding = (n(this, ge), 6), this.gapBetweenCoaches = 4, this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize, this.gapBetweenCoachDecks = 48, this.coachNavButtonDim = 0, this.coachNavData = [], this.currScrollDirection = I.right, this.maxCalcCoachesWidth = 0, this.scrollCoachesAreaWidth = 0, this.scrollNavigationAreaDim = 0, this.triggerCoachPositionsCollection = [], this.navigationScrollArea = null, this.coachScrollArea = null, this.currSelectedPlace = null, this.currSelectedPlaceElementId = null, this.currSelectedCoachIndex = -1, this.currSelectedDeckIndex = 0, this.preventCoachScrollByPlaceClick = !1, this.selectedSeatReservationPlaces = {
44
44
  seats: [],
45
45
  bicycles: []
46
46
  }, this.seatReservationWithoutNavigationHasFocus = !1, this.isCoachGridFocusable = !1, this.isAutoScrolling = !1, this.isKeyboardNavigation = !1, this.hasMultipleDecks = !1, this.hasSeatReservationNativeFocus = !1, this.keyboardNavigationEvents = {
@@ -68,7 +68,7 @@ let ze = (() => {
68
68
  };
69
69
  }).filter((s) => Ae.indexOf(s.svgName) !== -1).filter((s, i, a) => a.map((o) => o.svgName).indexOf(s.svgName) === i).map((s) => s.pId).slice(0, Pe);
70
70
  return t || [];
71
- };
71
+ }, this.addEventListener("blur", () => this._onLeaveSeatReservationComponent());
72
72
  }
73
73
  /** The seat reservations array contains all coaches and places */
74
74
  get seatReservations() {
@@ -127,22 +127,22 @@ let ze = (() => {
127
127
  r(this, A, e);
128
128
  }
129
129
  get preselectCoachIndex() {
130
- return g(this, E);
130
+ return g(this, N);
131
131
  }
132
132
  set preselectCoachIndex(e) {
133
- r(this, E, e);
133
+ r(this, N, e);
134
134
  }
135
135
  get selectedCoachIndex() {
136
- return g(this, R);
136
+ return g(this, E);
137
137
  }
138
138
  set selectedCoachIndex(e) {
139
- r(this, R, e);
139
+ r(this, E, e);
140
140
  }
141
141
  get focusedCoachIndex() {
142
- return g(this, N);
142
+ return g(this, R);
143
143
  }
144
144
  set focusedCoachIndex(e) {
145
- r(this, N, e);
145
+ r(this, R, e);
146
146
  }
147
147
  get hoveredCoachIndex() {
148
148
  return g(this, k);
@@ -194,7 +194,7 @@ let ze = (() => {
194
194
  end: t,
195
195
  width: a
196
196
  };
197
- }), this.maxCalcCoachesWidth = t;
197
+ }), this.maxCalcCoachesWidth = t - this.gapBetweenCoaches;
198
198
  }
199
199
  }
200
200
  /**
@@ -237,35 +237,38 @@ let ze = (() => {
237
237
  * With the [TAB] key the user navigation goes to the next coach navigation element and the currently selected place is automatically reset.
238
238
  */
239
239
  keyboardSeatmapEventHandling(e) {
240
- const t = e.key;
241
- if (this.preventCoachScrollByPlaceClick = !1, !this.hasSeatReservationNativeFocus && (e.shiftKey && t === this.keyboardNavigationEvents.Tab || t === this.keyboardNavigationEvents.Tab) && (this.hasSeatReservationNativeFocus = !0), t == this.keyboardNavigationEvents.Tab) {
240
+ const t = e.key === this.keyboardNavigationEvents.Tab, s = e.shiftKey && t;
241
+ if (!this.hasNavigation && this.currSelectedCoachIndex === 0 && s || this.currSelectedCoachIndex === this.coachNavData.length - 1 && t)
242
+ return;
243
+ const i = e.key;
244
+ if (this.preventCoachScrollByPlaceClick = !1, !this.hasSeatReservationNativeFocus && (t || s) && (this.hasSeatReservationNativeFocus = !0), t) {
242
245
  this._handleTabKeyNavigation(e, "seatmap");
243
246
  return;
244
247
  }
245
248
  if (this.currSelectedCoachIndex !== -1 && Se(e))
246
- switch (e.preventDefault(), t) {
249
+ switch (e.preventDefault(), i) {
247
250
  case this.keyboardNavigationEvents.ArrowLeft:
248
251
  {
249
- const s = this.alignVertical ? this.keyboardNavigationEvents.ArrowDown : t;
250
- this._navigateToPlaceByKeyboard(s);
252
+ const a = this.alignVertical ? this.keyboardNavigationEvents.ArrowDown : i;
253
+ this._navigateToPlaceByKeyboard(a);
251
254
  }
252
255
  break;
253
256
  case this.keyboardNavigationEvents.ArrowRight:
254
257
  {
255
- const s = this.alignVertical ? this.keyboardNavigationEvents.ArrowUp : t;
256
- this._navigateToPlaceByKeyboard(s);
258
+ const a = this.alignVertical ? this.keyboardNavigationEvents.ArrowUp : i;
259
+ this._navigateToPlaceByKeyboard(a);
257
260
  }
258
261
  break;
259
262
  case this.keyboardNavigationEvents.ArrowUp:
260
263
  {
261
- const s = this.alignVertical ? this.keyboardNavigationEvents.ArrowLeft : t;
262
- this._navigateToPlaceByKeyboard(s);
264
+ const a = this.alignVertical ? this.keyboardNavigationEvents.ArrowLeft : i;
265
+ this._navigateToPlaceByKeyboard(a);
263
266
  }
264
267
  break;
265
268
  case this.keyboardNavigationEvents.ArrowDown:
266
269
  {
267
- const s = this.alignVertical ? this.keyboardNavigationEvents.ArrowRight : t;
268
- this._navigateToPlaceByKeyboard(s);
270
+ const a = this.alignVertical ? this.keyboardNavigationEvents.ArrowRight : i;
271
+ this._navigateToPlaceByKeyboard(a);
269
272
  }
270
273
  break;
271
274
  }
@@ -470,12 +473,16 @@ let ze = (() => {
470
473
  if (a || this.currSelectedPlace !== null) {
471
474
  this.focusedCoachIndex = t, this.unfocusPlaceElement();
472
475
  return;
473
- } else t == 0 ? (this.unfocusPlaceElement(), this.currSelectedPlace = null, this.focusedCoachIndex = -1, (this.shadowRoot?.getElementById("sbb-sr-navigation__wrapper-button-direction--left")).focus()) : this.focusedCoachIndex = s;
474
- else s !== this.currSelectedCoachIndex ? this.focusedCoachIndex = s : e === "NEXT_TAB" && s === this.coachNavData.length - 1 ? (this.unfocusPlaceElement(), this.focusedCoachIndex = -1, (this.shadowRoot?.getElementById("sbb-sr-navigation__wrapper-button-direction--right")).focus()) : (this.focusedCoachIndex = -1, this.selectedCoachIndex = s, a ? this.focusPlaceElement(this.currSelectedPlace) : (this.isCoachGridFocusable = !0, this._setFocusToSelectedCoachGrid()));
476
+ } else t === 0 ? this._refocusCurrentFocusedNavCoach(t) : this.focusedCoachIndex = s;
477
+ else s !== this.currSelectedCoachIndex ? this.focusedCoachIndex = s : e === "NEXT_TAB" && s === this.coachNavData.length - 1 ? this._refocusCurrentFocusedNavCoach(t) : (this.focusedCoachIndex = -1, this.selectedCoachIndex = s, a ? this.focusPlaceElement(this.currSelectedPlace) : (this.isCoachGridFocusable = !0, this._setFocusToSelectedCoachGrid()));
475
478
  this._scrollToSelectedNavigationButton(s);
476
479
  } else
477
480
  this.scrollToSelectedNavCoach(s);
478
481
  }
482
+ // Refocused the current focused (visual) nav coach to get the native focus back to the navigation
483
+ _refocusCurrentFocusedNavCoach(e) {
484
+ this.focusedCoachIndex = -1, setTimeout(() => this.focusedCoachIndex = e, 0);
485
+ }
479
486
  _navigateToPlaceByKeyboard(e) {
480
487
  if (this.isKeyboardNavigation = !0, this.focusedCoachIndex !== -1 && (this.focusedCoachIndex = -1), !this.preventPlaceClick) {
481
488
  const t = this._getClosestPlaceByKeyDirection(e);
@@ -719,17 +726,24 @@ let ze = (() => {
719
726
  _isOverhangingElementsPresent(e, t) {
720
727
  return t?.some((s) => s.position.x === 0 || s.position.x + s.dimension.w >= e) ?? !1;
721
728
  }
722
- }, x = new WeakMap(), p = new WeakMap(), _ = new WeakMap(), m = new WeakMap(), y = new WeakMap(), b = new WeakMap(), P = new WeakMap(), A = new WeakMap(), E = new WeakMap(), R = new WeakMap(), N = new WeakMap(), k = new WeakMap(), (() => {
729
+ /**
730
+ * Is called when the SeatReservation loses focus, what happens when the user tabs out or clicks somewhere else.
731
+ * Then we reset the focused elements.
732
+ */
733
+ _onLeaveSeatReservationComponent() {
734
+ this.hasNavigation && (this.focusedCoachIndex = -1), this.unfocusPlaceElement();
735
+ }
736
+ }, x = new WeakMap(), p = new WeakMap(), _ = new WeakMap(), m = new WeakMap(), y = new WeakMap(), b = new WeakMap(), P = new WeakMap(), A = new WeakMap(), N = new WeakMap(), E = new WeakMap(), R = new WeakMap(), k = new WeakMap(), (() => {
723
737
  const e = typeof Symbol == "function" && Symbol.metadata ? Object.create(l[Symbol.metadata] ?? null) : void 0;
724
- u = [C({ attribute: "seat-reservations", type: Array })], z = [S(), C({ attribute: "has-navigation", type: Boolean })], F = [S(), C({ attribute: "align-vertical", type: Boolean, reflect: !0, useDefault: !0 })], W = [S(), C({ attribute: "base-grid-size", type: Number })], M = [S(), C({ attribute: "height", type: Number })], q = [S(), C({ attribute: "max-seat-reservations", type: Number })], Y = [S(), C({ attribute: "max-bicycle-reservations", type: Number })], Z = [S(), C({ attribute: "prevent-place-click", type: Boolean })], se = [S(), C({ attribute: "preselect-coach-index", type: Number })], ce = [w()], ne = [w()], de = [w()], ve = [_e({ passive: !0 })], f(h, null, u, { kind: "accessor", name: "seatReservations", static: !1, private: !1, access: { has: (t) => "seatReservations" in t, get: (t) => t.seatReservations, set: (t, s) => {
738
+ u = [C({ attribute: "seat-reservations", type: Array })], z = [S(), C({ attribute: "has-navigation", type: Boolean })], O = [S(), C({ attribute: "align-vertical", type: Boolean, reflect: !0, useDefault: !0 })], W = [S(), C({ attribute: "base-grid-size", type: Number })], K = [S(), C({ attribute: "height", type: Number })], q = [S(), C({ attribute: "max-seat-reservations", type: Number })], Y = [S(), C({ attribute: "max-bicycle-reservations", type: Number })], Z = [S(), C({ attribute: "prevent-place-click", type: Boolean })], se = [S(), C({ attribute: "preselect-coach-index", type: Number })], ce = [w()], ne = [w()], de = [w()], ve = [_e({ passive: !0 })], f(h, null, u, { kind: "accessor", name: "seatReservations", static: !1, private: !1, access: { has: (t) => "seatReservations" in t, get: (t) => t.seatReservations, set: (t, s) => {
725
739
  t.seatReservations = s;
726
740
  } }, metadata: e }, T, B), f(h, null, z, { kind: "accessor", name: "hasNavigation", static: !1, private: !1, access: { has: (t) => "hasNavigation" in t, get: (t) => t.hasNavigation, set: (t, s) => {
727
741
  t.hasNavigation = s;
728
- } }, metadata: e }, G, O), f(h, null, F, { kind: "accessor", name: "alignVertical", static: !1, private: !1, access: { has: (t) => "alignVertical" in t, get: (t) => t.alignVertical, set: (t, s) => {
742
+ } }, metadata: e }, F, G), f(h, null, O, { kind: "accessor", name: "alignVertical", static: !1, private: !1, access: { has: (t) => "alignVertical" in t, get: (t) => t.alignVertical, set: (t, s) => {
729
743
  t.alignVertical = s;
730
744
  } }, metadata: e }, V, L), f(h, null, W, { kind: "accessor", name: "baseGridSize", static: !1, private: !1, access: { has: (t) => "baseGridSize" in t, get: (t) => t.baseGridSize, set: (t, s) => {
731
745
  t.baseGridSize = s;
732
- } }, metadata: e }, H, K), f(h, null, M, { kind: "accessor", name: "height", static: !1, private: !1, access: { has: (t) => "height" in t, get: (t) => t.height, set: (t, s) => {
746
+ } }, metadata: e }, H, M), f(h, null, K, { kind: "accessor", name: "height", static: !1, private: !1, access: { has: (t) => "height" in t, get: (t) => t.height, set: (t, s) => {
733
747
  t.height = s;
734
748
  } }, metadata: e }, X, U), f(h, null, q, { kind: "accessor", name: "maxSeatReservations", static: !1, private: !1, access: { has: (t) => "maxSeatReservations" in t, get: (t) => t.maxSeatReservations, set: (t, s) => {
735
749
  t.maxSeatReservations = s;
@@ -48,7 +48,7 @@ let Y = (() => {
48
48
  @scroll=${() => this.coachAreaScrollend()}
49
49
  id="sbb-sr__wrapper-scrollarea"
50
50
  class="sbb-sr__wrapper-scrollarea"
51
- tabindex="0"
51
+ tabindex="-1"
52
52
  >
53
53
  <div id="sbb-sr__parent-area" class="sbb-sr__parent">
54
54
  <ul