@sbb-esta/lyne-elements-experimental 4.0.2 → 4.0.4
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.
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts +2 -0
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +12 -15
- package/core/datetime/date-helper.js +3 -3
- package/custom-elements.json +143 -99
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts +2 -0
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +12 -13
- package/development/core/datetime/date-helper.js +3 -3
- package/development/{differenceInMinutes-D5Nj8Stc.js → differenceInMinutes-B0dawX-5.js} +2 -2
- package/development/{format-BQfaa1ZT.js → format-BMkeaqaF.js} +3 -3
- package/development/{isValid-DvieCZVi.js → isValid-BYRch7pV.js} +2 -2
- package/development/journey-summary/journey-summary.component.js +2 -2
- package/development/pearl-chain/pearl-chain.component.js +2 -2
- package/development/pearl-chain-time/pearl-chain-time.component.js +1 -1
- package/development/seat-reservation/common/mapper/mapper.d.ts +2 -2
- package/development/seat-reservation/common/mapper/mapper.d.ts.map +1 -1
- package/development/seat-reservation/common/mapper/mapper.js +19 -6
- package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts +122 -0
- package/development/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +1 -1
- package/development/seat-reservation/common/mapper/seat-reservation-sample-data.js +970 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +3 -1
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation.component.js +26 -24
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -2
- package/development/timetable-row/timetable-row.component.js +1 -1
- package/development/{toDate-D_Vjps95.js → toDate-BWb6Z1JD.js} +2 -2
- package/{differenceInMinutes-CP_C5onR.js → differenceInMinutes-COvvdYsJ.js} +1 -1
- package/{format-lqeCzmzS.js → format-CmKROkbc.js} +2 -41
- package/{isValid-Ceq2O0NQ.js → isValid-m3_OsPaB.js} +1 -1
- package/journey-summary/journey-summary.component.js +2 -2
- package/package.json +3 -3
- package/pearl-chain/pearl-chain.component.js +2 -2
- package/pearl-chain-time/pearl-chain-time.component.js +1 -1
- package/seat-reservation/common/mapper/mapper.d.ts +2 -2
- package/seat-reservation/common/mapper/mapper.d.ts.map +1 -1
- package/seat-reservation/common/mapper/mapper.js +41 -38
- package/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts +122 -0
- package/seat-reservation/common/mapper/seat-reservation-sample-data.d.ts.map +1 -1
- package/seat-reservation/common/mapper/seat-reservation-sample-data.js +968 -1
- package/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
- package/seat-reservation/seat-reservation/seat-reservation-base-element.js +130 -130
- package/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
- package/seat-reservation/seat-reservation/seat-reservation.component.js +88 -85
- package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
- package/timetable-row/timetable-row.component.js +1 -1
- package/{toDate-BCXKL_wM.js → toDate-Bw2KTWeq.js} +1 -1
package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-reservation-base-element.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation-base-element.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"seat-reservation-base-element.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation-base-element.ts"],"names":[],"mappings":"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"}
|
|
@@ -905,6 +905,8 @@ let SeatReservationBaseElement = (() => {
|
|
|
905
905
|
* that have the state SELECTED within the seatReservation object
|
|
906
906
|
*/
|
|
907
907
|
_initSeatReservationPlaceSelection() {
|
|
908
|
+
this.selectedSeatReservationPlaces.seats = [];
|
|
909
|
+
this.selectedSeatReservationPlaces.bicycles = [];
|
|
908
910
|
this.seatReservations?.forEach((seatReservation, coachDeckIndex) => seatReservation.coachItems.map((coach, coachIndex) => {
|
|
909
911
|
coach.places?.filter((place) => place.state === "SELECTED")?.forEach((place) => {
|
|
910
912
|
const placeId = this.getPlaceElementId(coachDeckIndex, coachIndex, place.number);
|
|
@@ -1128,4 +1130,4 @@ let SeatReservationBaseElement = (() => {
|
|
|
1128
1130
|
export {
|
|
1129
1131
|
SeatReservationBaseElement
|
|
1130
1132
|
};
|
|
1131
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIExpdEVsZW1lbnQsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIE5hdmlnYXRpb25Db2FjaEl0ZW0sXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG59IGZyb20gJy4uL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlLCB1c2VEZWZhdWx0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1zZWF0LXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4U2VhdFJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBiaWN5Y2xlIHBsYWNlcyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LWJpY3ljbGUtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhCaWN5Y2xlUmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogQW55IGNsaWNrIGZ1bmN0aW9uYWxpdHkgaXMgcHJldmVudGVkICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmV2ZW50LXBsYWNlLWNsaWNrJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJldmVudFBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJlc2VsZWN0LWNvYWNoLWluZGV4JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmVzZWxlY3RDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgY29hY2hOYXZEYXRhOiBOYXZpZ2F0aW9uQ29hY2hJdGVtW10gPSBbXTtcbiAgcHJvdGVjdGVkIGN1cnJTY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IFNjcm9sbERpcmVjdGlvbi5yaWdodDtcbiAgcHJvdGVjdGVkIG1heENhbGNDb2FjaHNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJpdmF0ZSBfaXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Nyb2xsVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RTdGFydFNjcm9sbFBvcyA9IC0xO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSAmJiB0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQsIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpIHdvdWxkIGZhaWwgd2l0aCBOUEUgYmVjYXVzZVxuICAgICAgLy8gdGhlIGNvYWNoU2Nyb2xsQXJlYSBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgbGV0IG5hdmlnYXRlVG9Db2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4IC0gMSA6IDA7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlTmF2aWdhdGlvbkNvYWNoRGF0YSgpO1xuICB9XG5cbiAgLyoqIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXMnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICA/IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBpZiAoc2VhdFJlc2VydmF0aW9uRGVjayAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgaGVpZ2h0IG9mIG9uZSBjb2FjaCBpbmNsdWRpbmcgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGNvbnN0IGNvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgPVxuICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSArIHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZWFjaCBnYXAgYmV0d2VlbiBtdWx0aXBsZSBjb2FjaCB0aGUgZGVja3MuXG4gICAgICAvLyBObyBnYXAgZXhpc3QgaWYganVzdCBvbmUgY29hY2ggZGVjayBleGlzdC5cbiAgICAgIGNvbnN0IGdhcEJldHdlZW5Db2FjaERlY2tzID0gKHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxKSAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoRGVja3M7XG5cbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQnLFxuICAgICAgICBgJHtjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nICogdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCArIGdhcEJldHdlZW5Db2FjaERlY2tzfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZGVja3MnLCBgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBJbml0IHRoZSBjb2FjaE5hdkJ1dHRvbkRpbSBkaW1lbnNpb24sIHdoaWNoIGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3Qgc2Nyb2xsIG5hdmlnYXRpb24gbGF0ZXJcbiAgICAgIGNvbnN0IG5hdkNvYWNoZUxpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZUxpc3QpIHtcbiAgICAgICAgY29uc3QgZmlyc3RMaUVsZURpbWVuc2lvbiA9IG5hdkNvYWNoZUxpc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmNvYWNoTmF2QnV0dG9uRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgPyBmaXJzdExpRWxlRGltZW5zaW9uLmhlaWdodFxuICAgICAgICAgIDogZmlyc3RMaUVsZURpbWVuc2lvbi53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEgJiYgc2VhdFJlc2VydmF0aW9uRGVjaykge1xuICAgICAgLy8gSW5pdCB0aGUgc3RhcnQgb2Zmc2V0IGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGNvYWNoIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uc1xuICAgICAgbGV0IGN1cnJDYWxjVHJpZ2dlclBvcyA9IDA7XG4gICAgICB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NYID0gY3VyckNhbGNUcmlnZ2VyUG9zO1xuICAgICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoLmRpbWVuc2lvbikudztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9IGNvYWNoV2lkdGggKyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0UG9zWCxcbiAgICAgICAgICBlbmQ6IGN1cnJDYWxjVHJpZ2dlclBvcyxcbiAgICAgICAgICB3aWR0aDogY29hY2hXaWR0aCxcbiAgICAgICAgfSBhcyBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgbWF4aW11bSBjYWxjdWxhdGVkIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGV2ZW50IGhhbmRsZXIgbWFuYWdlZCB0aGUgZW5kIG9mIHNjcm9sbGluZyBpbnNpZGUgdGhlIGNvYWNoIHNjcm9sbCBhcmVhLlxuICAgKiBUaW1lb3V0IGV2ZW50IGhhbmRsaW5nIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGxpbmcgaGFzIGJlZW4gY29tcGxldGVkLlxuICAgKiBJdCBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBTYWZhcmkgYnJvd3NlciBkb2VzIG5vdCBoYW5kbGUgc2Nyb2xsZW5kIGV2ZW50LFxuICAgKiBhbmQgd2UgdGhlcmVmb3JlIGltaXRhdGUgdGhpcyBldmVudCAtPiBzY3JvbGxlbmQuXG4gICAqL1xuICBAZXZlbnRPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgY29hY2hBcmVhU2Nyb2xsZW5kKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zY3JvbGxUaW1lb3V0KSB7XG4gICAgICAvLyBGaXJzdCwgd2UgY2xlYXJlZCB0aGUgcmVnaXN0ZXJlZCB0aW1lb3V0LCBhcyB0aGUgc2Nyb2xsaW5nIGlzIHN0aWxsIHJ1bm5pbmdcbiAgICAgIC8vIGFuZCB0aHVzIHdlIHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IGZ1bmN0aW9uXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2Nyb2xsVGltZW91dCk7XG4gICAgfVxuICAgIC8vIElmIG5vIGZ1cnRoZXIgc2Nyb2xsIGV2ZW50IGlzIGZpcmVkLCB0aGUgbmV4dCB0aW1lb3V0IGNhbiBleGVjdXRlIHRoZSBpbm5lciBmdW5jdGlvbiBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgd2l0aG91dCBjbGVhcmluZ1xuICAgIHRoaXMuX3Njcm9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCksIDE1MCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgbm8gbmF2aWdhdGlvbiBleGlzdHMgKHByb3BlcnR5IHNldHRpbmcgLT4gaGFzTmF2aWdhdGlvbikgYW5kIGEgdGFibGUgY29hY2ggZ2V0cyB0aGUgZm9jdXMsXG4gICAqIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2ggbXVzdCBiZSBhdXRvbWF0aWNhbGx5IHByZXNlbGVjdGVkIHRvIGNvbnRyb2wgdGhlIHBsYWNlIG5hdmlnYXRpb24gdmlhIGtleWJvYXJkXG4gICAqXG4gICAqIEBwYXJhbSBmb2N1c0NvYWNoSW5kZXhcbiAgICovXG4gIHByb3RlY3RlZCBvbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGZvY3VzQ29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgJiYgIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZvY3VzQ29hY2hJbmRleCA9PT0gMFxuICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgtMSlcbiAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoZm9jdXNDb2FjaEluZGV4KTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdpbGwgYmUgdHJpZ2dlcmQgYnkgZm9jdXMgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKTogdm9pZCB7XG4gICAgLy8gSWYgYW55IG5hdmlnYXRpb24gZGlyZWN0aW9uIGJ1dHRvbiAocmlnaHR8bGVmdCkgZ2V0IHRoZSBmb2N1cywgc28gd2UgaGF2ZSBtYW51YWwgcmVzZXQgdGhlIHByZXZpb3VzIGZvY3VzQ29hY2hJbmRleC5cbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gIH1cblxuICAvKiogVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgQ29hY2ggTmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhZGxpbmdcbiAgICBpZiAoaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhZGxpbmcoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmFsIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIHRhYiBuYXZpZ2F0aW9uIGluc2lkZSB0aGUgY29hY2ggbmF2aWdhdGlvbiBhcmVhIGFuZCB0aGUgc2VhdG1hcCBhcmVhICovXG4gIHByaXZhdGUgX2hhbmRsZVRhYktleU5hdmlnYXRpb24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZXZlbnRBcmVhOiBzdHJpbmcsXG4gICAgY3VyclRhYkluZGV4PzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IHByZXNzZWRTaGlmdFRhYiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgaWYgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3IgY29hY2ggbmF2aWdhdGlvbiBhcmVhLlxuICAgICAgLy8gRnByIGNvYWNoIG5hdmlnYXRpb24gd2UganVzdCBjb250cm9sIHRoZSBmb2N1cyBpbmRleCB0byB2aXN1YWxpemUgZm9jdXMgc3R5bGUgZm9yIG5hdiBjb2FjaCBidXR0b25cbiAgICAgIGlmIChldmVudEFyZWEgPT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgIGlmIChjdXJyVGFiSW5kZXggPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgICAgICAgICFwcmVzc2VkU2hpZnRUYWIgfHxcbiAgICAgICAgICAgIHRoaXMuY29hY2hOYXZEYXRhW2N1cnJUYWJJbmRleF0uaXNEcml2ZXJBcmVhIHx8XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4O1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJlc3NlZFNoaWZ0VGFiICYmIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICAgIC8vSWYgdGhlIEZvciBiYWNrIHRhYmJpbmcsIHdlIGp1bXBcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXghO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oY3VyclRhYkluZGV4ISk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBzZWF0bWFwIGFyZWFcbiAgICAgIGVsc2UgaWYgKGV2ZW50QXJlYSA9PSAnc2VhdG1hcCcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHByZXNzZWRTaGlmdFRhYikge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnUFJFVl9UQUInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ05FWFRfVEFCJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgU2VhdG1hcCBldmVudCBoYW5kbGluZyB0byBuYXZpZ2F0aW9uIGJldHdlZW4gZWFjaCBwbGFjZXMgaW5zaWRlIGEgc2VsZWN0ZWQgY29hY2ggYnkgdXNpbmcgW2Fycm93XSBrZXlzLlxuICAgKiBXaXRoIHRoZSBbVEFCXSBrZXkgdGhlIHVzZXIgbmF2aWdhdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGNvYWNoIG5hdmlnYXRpb24gZWxlbWVudCBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZSBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFkbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiZcbiAgICAgICgoZXZlbnQuc2hpZnRLZXkgJiYgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB8fFxuICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKHByZXNzZWRLZXkgPT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnc2VhdG1hcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFycm93IEtleWJvYXJkIG5hdmlnYXRpb24gdG8gY29udHJvbCBwbGFjZXMgaW5zaWRlIHRoZSBzZWF0bWFwXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgJiYgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgc3dpdGNoIChwcmVzc2VkS2V5KSB7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRMZWZ0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZExlZnRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkUmlnaHRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFJpZ2h0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFVwS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFVwS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkRG93bktleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkRG93bktleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHBsYWNlIGluc2lkZSB0aGUgY29hY2ggaWYgbmF2aWdhdGVkIHZpYSBrZXlib2FyZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBjb2FjaCBncmlkIGlzIHNlbGVjdGVkIChuZWNlc3NhcnkgZm9yIFNjcmVlblJlYWRlcilcbiAgICovXG4gIHByb3RlY3RlZCBwcmVzZWxlY3RQbGFjZUluQ29hY2goKTogdm9pZCB7XG4gICAgLy8gTm8gcHJlc2VsZWN0IHBsYWNlIGJ5IG1hbnVhbCBzZWF0bWFwIHNjcm9sbGluZ1xuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHJldHVybjtcblxuICAgIC8vIE5vIGF1dG8gcGxhY2UgcHJlc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIHByZXNlbGVjdCBjb2FjaCBpbmRleFxuICAgIGlmICh0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCkge1xuICAgICAgdGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3IgRHJpdmVyQXJlYSBvciBFbXB0eSBjb2FjaCAobm8gcGxhY2VzKSwgbm8gcGxhY2UgaXMgc2VsZWN0YWJsZSwgc28gd2UgcmV0dXJuIGRpcmVjdGx5XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb2FjaE5hdkRhdGFbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XSAmJlxuICAgICAgdGhpcy5jb2FjaE5hdkRhdGFbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5pc0RyaXZlckFyZWFcbiAgICApIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgd2hlbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgYW5kIGNvYWNoZXMgYXJlIHNjcm9sbGVkIGJ5IGF1dG8gc2Nyb2xsaW5nLFxuICAgIC8vIHRoZW4gd2UgY2FuIHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaC5cbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJiB0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgY29uc3QgY2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24oKTtcbiAgICAgIC8vSWYgY2xvc2VzdFBsYWNlIGV4aXN0LCB3ZSBoYXZlIHRvIHVuZm9jdXMgcHJldmlvdXMgZm9jdXNlZCBwbGFjZVxuICAgICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChjbG9zZXN0UGxhY2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBhIGNvYWNoIHdhcyBzZWxlY3RlZCB3aXRoIG5vIHBsYWNlcywgdGhlbiB3ZSBoYXZlIHRvIGZvY3VzIHRoZSBjb2FjaEdyaWRcbiAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwcmVzZWxlY3Rpb24gZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGJ5IG5vcm1hbCBjbGlja2luZyBvciB2aWEgc2NyZWVuIHJlYWRlciB2aWEgdGFiLFxuICAgIC8vIHdlIG9ubHkgZm9jdXMgdGhlIHRhYmxlIHdpdGhvdXQgZGlyZWN0bHkgZm9jdXNpbmcgdGhlIHBsYWNlLlxuICAgIGVsc2Uge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG5cbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2lzVmFsaWRDb2FjaEluZGV4KHNlbGVjdGVkTmF2Q29hY2hJbmRleCkgJiZcbiAgICAgIHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgKSB7XG4gICAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHRoaXMuX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTtcbiAgICAgIHRoaXMuX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpO1xuXG4gICAgICBjb25zdCBzY3JvbGxUb0NvYWNoUG9zWCA9IHRoaXMuX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgfHwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gMDtcblxuICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGFsbG93cyBzY3JvbGxpbmcgdG8gdGhlIG5leHQgd2Fnb24gb3Igbm90XG4gICAgICBpZiAoaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlICYmIHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICAgIHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbFRvQ29hY2hQb3NYIDogMCxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmFsaWduVmVydGljYWwgPyAwIDogc2Nyb2xsVG9Db2FjaFBvc1gsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgY29hY2ggaW4gdGhlIG1haW4gbmF2aWdhdGlvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNQbGFjZUVsZW1lbnQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGlmIChwbGFjZSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ2ZvY3VzJyk7XG5cbiAgICAgICAgLy9UcnkgdG8gc2Nyb2xsIGZvY3VzZWQgcGxhY2UgaW50byB0aGUgdmlld3BvcnRcbiAgICAgICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICAgIHBsYWNlLm51bWJlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZUlkKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXlTY3JvbGxJblZpZXdwb3J0KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVuZm9jdXNQbGFjZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ3VuZm9jdXMnKTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKG51bGwpO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgZWxlbWVudERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICAgIGlzU3RyZXRjaEhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnREaW1lbnNpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiAhaXNPcmlnaW5IZWlnaHQpIHtcbiAgICAgIC8vIFNpbmNlIHRoZSBoZWlnaHQgb2YgdGhlIGNvYWNoIGhhcyBiZWVuIHZpc3VhbGx5IGV4cGFuZGVkIHRvIG1haW50YWluIGEgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyxcbiAgICAgIC8vIHNvbWUgZ3JhcGhpY3MgbXVzdCBhbHNvIGJlIGFkYXB0ZWQgdG8gdGhlIGhlaWdodCwgd2hpY2ggZW5kIHdpdGggdGhlIGJvcmRlcnMgb2YgdGhlIGNvYWNoXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZ3JhcGhpY3MgYXJlIGFzc2lnbmVkIGRpcmVjdGx5IGF0IHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoLFxuICAgICAgLy8gdGhlc2UgZ3JhcGhpY3MgbXVzdCBiZSBleHBhbmRlZCBpbiBoZWlnaHQgYnkgYSBjb2FjaEJvcmRlck9mZnNldCBpbiBvcmRlciB0byByZWFjaCB0aGVpciBvcmlnaW5hbCB2aXN1YWwgcG9zaXRpb25cbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24udyxcbiAgICAgIGg6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi5oLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgIGVsZW1lbnRQb3NpdGlvbjogRWxlbWVudFBvc2l0aW9uLFxuICAgIGVsZW1lbnREaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnRQb3NpdGlvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmIGVsZW1lbnREaW1lbnNpb24pIHtcbiAgICAgIGNvbnN0IGVuZFBvc0hlaWdodCA9IGlzT3JpZ2luSGVpZ2h0XG4gICAgICAgID8gY29hY2hEaW1lbnNpb24uaFxuICAgICAgICA6IGNvYWNoRGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgY29hY2gsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIFkgY29vcmRpbmF0ZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGJvcmRlciBwYWRkaW5nXG4gICAgICBpZiAoZWxlbWVudFBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFBvc2l0aW9uLnkgKyBlbGVtZW50RGltZW5zaW9uLmggPT09IGVuZFBvc0hlaWdodCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnRQb3NpdGlvbi54LFxuICAgICAgeTogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueSxcbiAgICAgIHo6IGVsZW1lbnRQb3NpdGlvbi56LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogZGV0ZWN0cyBpZiBhIChncmFwaGljYWwpIGVsZW1lbnQgaXMgb24gdGhlIGJvcmRlciB3aXRoIGl0cyBwb3NpdGlvbiAodXBwZXIgb3IgbG93ZXIgYm9yZGVyKS5cbiAgICogQHBhcmFtIGJhc2VFbGVtZW50XG4gICAqIEBwYXJhbSBjb2FjaERpbWVuc2lvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihcbiAgICBiYXNlRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBiYXNlRWxlbWVudC5wb3NpdGlvbi55ID09PSAwIHx8XG4gICAgICBiYXNlRWxlbWVudC5wb3NpdGlvbi55ICsgYmFzZUVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbGwgYXZhaWxhYmxlIHNlYXRzIHRvZ2V0aGVyIGRlcGVuZGluZyBvbiB0aGUgc2VhdCB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZXNcbiAgICogQHJldHVybnMgQW4gT2JqZWN0IHdpdGggY291bnQgb2YgZnJlZSBzZWF0cyBhbmQgZnJlZSBiaWN5Y2xlIHBsYWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goXG4gICAgcGxhY2VzOiBQbGFjZVtdIHwgdW5kZWZpbmVkLFxuICApOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyB7XG4gICAgY29uc3QgYWNjdW11bGF0b3I6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzID0geyBzZWF0czogMCwgYmljeWNsZXM6IDAgfTtcbiAgICBjb25zdCBmcmVlUGxhY2VzID0gcGxhY2VzPy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyUGxhY2U6IFBsYWNlKSA9PiB7XG4gICAgICBpZiAoY3VyclBsYWNlLnN0YXRlICE9PSAnRlJFRScpIHtcbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgfVxuICAgICAgLy8gQ291bnQgdXAgZGVwZW5kaW5nIG9uIHNlYXQgdHlwZVxuICAgICAgaWYgKGN1cnJQbGFjZS50eXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgYWNjdW11bGF0b3Iuc2VhdHMrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLmJpY3ljbGVzKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgYWNjdW11bGF0b3IpO1xuICAgIHJldHVybiBmcmVlUGxhY2VzID8gZnJlZVBsYWNlcyA6IGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0IHRoZSBlbmQgb2YgYSBzY3JvbGwgRXZlbnQgZnJvbSB0aGUgY29hY2ggc2Nyb2xsYWJsZSBhcmVhLFxuICAgKiB0aGUgcmVhY2hlZCBjb2FjaCBpcyBtYXJrZWQgYXMgc2VsZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbmRTY3JvbGxDb2FjaEluZGV4ID0gdGhpcy5pc0F1dG9TY3JvbGxpbmdcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICA6IHRoaXMuX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpO1xuXG4gICAgLy8gVElNTy00MzcwNVxuICAgIC8vIElmIGEgcGxhY2Ugd2FzIHNlbGVjdGVkIGJ5IG1vdXNlIGNsaWNrIChwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIGJlZm9yZSB0cmlnZ2VyaW5nIHRoaXMgc2Nyb2xsZW5kIG1ldGhvZCxcbiAgICAvLyB0aGVuIHRoaXMgc2Nyb2xsaW5nIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIG1ldGhvZCBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0IGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZWF0aGVyIHRoZSBlbmRzY3JvbGxpbmcgaXMganVzdCBhIHBsYWNlIGFqdWVzdG1lbnQgc2Nyb2xsaW5nIChwbGFjZSBoYXMgMiBncmlkIHNpemUgdW5pdHMpXG4gICAgICBjb25zdCBpc0NvYWNoU2Nyb2xsaW5nID1cbiAgICAgICAgTWF0aC5hYnModGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zIC0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdCkgPlxuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSAqIDI7XG4gICAgICBpZiAoaXNDb2FjaFNjcm9sbGluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG5cbiAgICAvLyBBZnRlciBjb2FjaCBzY3JvbGxlbmQgZXZlbnQgd2UgY2FuIHJlc2V0IHRoZSBob3ZlcmVkIGNvYWNoIGluZGV4XG4gICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IC0xO1xuXG4gICAgLy8gSW4gY2FzZSB0aGUgdXNlciB1c2VzIHRoZSBzY3JvbGxiYXIgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIHRoZSBzZWF0IHJlc2VydmF0aW9uLFxuICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW5kZXggaXMgLTEsIGFuZCB3ZSBoYXZlIHRvIHNldCB0aGlzIHZhbHVlIHdpdGggZmluZFNjcm9sbENvYWNoSW5kZXguXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZpbmRTY3JvbGxDb2FjaEluZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA6IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIC8vV2hlbiB1c2VyIGlzIHNjcm9sbGluZyB2aWEgc2Nyb2xsYmFyLCBpdCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgdG8gdGhlIGZvY3VzZWQgY29hY2ggaW4gdGhlIG1haW4gbmF2aWdhdGlvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oZmluZFNjcm9sbENvYWNoSW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcblxuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gYXV0b21hdGljIG1haW4gbmF2aWdhdGlvbiBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBzZWxlY3RlZE5hdkNvYWNoSW5kZXguXG4gICAqIENhbGN1bGF0ZXMgdGhlIGNlbnRyYWwgc2Nyb2xsIG9mZnNldCBvZiB0aGUgbmF2IGNvYWNoIHRvIGJlIHNlbGVjdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWROYXZDb2FjaEluZGV4XG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vVGltZSBkZWxheSB0byBub3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXhlY3V0aW5nIGNhbGxpbmcgc2Nyb2xsVG8gZnVuY3Rpb25zIChjb2FjaGVzIHNjcm9sbGluZylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCA9IHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gLyAyO1xuICAgICAgICBjb25zdCBzY3JvbGxCdXR0b25PZmZzZXRYID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4ICogdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsT2Zmc2V0WCA9XG4gICAgICAgICAgc2Nyb2xsQnV0dG9uT2Zmc2V0WCAtIG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYICsgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxPZmZzZXRYIDogMCxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmFsaWduVmVydGljYWwgPyAwIDogc2Nyb2xsT2Zmc2V0WCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgU2Nyb2xsRGlyZWN0aW9uIGJ5IHRoZSBuZXcgZ2l2ZW4gdGFyZ2V0IGNvYWNoIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA/IFNjcm9sbERpcmVjdGlvbi5yaWdodFxuICAgICAgICA6IFNjcm9sbERpcmVjdGlvbi5sZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjcm9sbCBzdGFydCBvciBlbmQgcG9zaXRpb24gWCBmcm9tIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogSW4gY2FzZSB0aGUgdXNlciBpcyBjdXJyZW50bHkgbmF2aWdhdGluZyB0aHJvdWdoIHBsYWNlcyBieSBrZXlib2FyZCBhbmQgZ29lcyB0byBwcmV2aW91cyBjb2FjaCxcbiAgICogdGhlbiB3ZSByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY29hY2ggdG8gZ2V0IHRoZSBjbG9zZXN0IHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBmb2N1cyBwbGFjZS5cbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvYWNoVHJpZ2dlclBvaW50ID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvbiA9XG4gICAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmXG4gICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICBjb2FjaFRyaWdnZXJQb2ludC53aWR0aCA+IHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCAtIGNvYWNoU2Nyb2xsV2luZG93V2lkdGg7XG4gICAgY29uc3QgY3VyckNvYWNoVHJpZ2dlciA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zID1cbiAgICAgIGN1cnJTY3JvbGxQb3NYID09PSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5zdGFydDtcblxuICAgIHJldHVybiAoXG4gICAgICAoY3VyclNjcm9sbFBvc1ggPCBtYXhTY3JvbGxXaWR0aEFyZWEgfHwgY3VyclNjcm9sbFBvc1ggPiBjdXJyQ29hY2hUcmlnZ2VyLnN0YXJ0KSAmJlxuICAgICAgIWlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2FjaCBpbmRleCB3aGljaCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsIGFyZWFcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxQb3MgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3Qgc2Nyb2xsT2Zmc2V0WCA9IHNjcm9sbFBvcyArIHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRvIGdldCB0aGUgY29ycmVjdCBjbG9zZXN0IHBsYWNlIG9mIGN1cnJlbnQgcHJlc3NlZCBrZXkgYW5kIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlLFxuICAgKiB3ZSBoYXZlIHRvIGludmVzdGlnYXRlIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIHBsYWNlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgcGxhY2Ugb2YgdGhlIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkLlxuICAgKiBAcGFyYW0gcHJlc3NlZEtleVxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5Pzogc3RyaW5nKTogUGxhY2UgfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBsZXQgY29hY2hQbGFjZXMgPSBjb2FjaC5wbGFjZXM7XG4gICAgbGV0IHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPSBudWxsO1xuXG4gICAgaWYgKGNvYWNoUGxhY2VzKSB7XG4gICAgICAvLyBJZiBubyBwbGFjZSBzZXQsIHRoZW4gd2UgdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24gPSB7IC4uLnRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24gfTtcblxuICAgICAgICAgIGlmIChwcmVzc2VkS2V5KSB7XG4gICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgdG8gc3dpdGNoIHRvIGFub3RoZXIgY29hY2ggZGVjayAoVXAgLT4gRG93biB8IERvd24gLT4gVXApLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB0YWtlIHRoZSBjb2FjaCBwbGFjZXMgd2UgaGF2ZSB0byBjaGVja2VkIGZyb20gdGhlIHRhcmdldCBkZWNrIG5vdy5cbiAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPSB0aGlzLl9nZXRTd2l0Y2hlZENvYWNoRGVja0luZGV4QnlLZXlOYXZpZ2F0aW9uKFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5LFxuICAgICAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBBc3NpZ24gY2hlY2sgcGxhY2VzIGZyb20gdGhlIHRhcmdldCBzd2l0Y2ggZGVja1xuICAgICAgICAgICAgICBjb2FjaFBsYWNlcyA9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3N3aXRjaGVkQ29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgICBdLnBsYWNlcyB8fCBbXTtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byB1cGRhdGUgeSBjb29yZGluYXRlXG4gICAgICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSA9XG4gICAgICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID8gY29hY2guZGltZW5zaW9uLmggOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoUGxhY2VzKSB7XG4gICAgICAgICAgICAvLyBJZiBubyBrZXkgcHJlc3NlZCwgdGhlbiB3ZSB0cnkgdG8gZmluZCB0aGUgcGxhY2Ugb2YgdGhlIGN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvblxuICAgICAgICAgICAgaWYgKCFwcmVzc2VkS2V5KSB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgcGxhY2UgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIFJJR0hUXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5yaWdodCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHBsYWNlLm51bWJlciAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ubnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgLy9LZXkgW1JpZ2h0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbRG93bl0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtMZWZ0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtVcF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBhIHBsYWNlIGhhcyBiZWVuIGZvdW5kIGluIHRoZSBjaGFuZ2luZyBzd2l0Y2ggY29hY2gsXG4gICAgICAgICAgLy8gd2UgY2FuIHVwZGF0ZSB0aGUgY3VyclNlbGVjdGVkRGVja0luZGV4XG4gICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwgJiYgY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHN3aXRjaGVkQ29hY2hEZWNrSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0UGxhY2U7XG4gIH1cblxuICAvLyBIYW5kbGluZyBmb3IgVGFiIG5hdmlnYXRpb24gaWYgYSBwbGFjZSBpcyBzZWxlY3RlZCBpbnNpZGUgdGhlIGNvYWNoLlxuICAvLyBUaGlzIGNvbnRyb2xzIHRoZSBmb2N1c2VkIGNvYWNoIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2guXG4gIHByaXZhdGUgX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCh0YWJEaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJGb2N1c0luZGV4ID1cbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgIDogdGhpcy5mb2N1c2VkQ29hY2hJbmRleDtcblxuICAgIC8vIENoZWNrIG5leHQgb3IgcHJldiB0YWIgaXMgcHJlc3NlZCwgdGhlbiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4IHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzXG4gICAgY29uc3QgbmV3Rm9jdXNhYmxlSW5kZXg6IG51bWJlciA9XG4gICAgICB0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQidcbiAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KVxuICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBjb25zdCBwbGFjZUluQ29hY2hIYXNGb2N1cyA9IHNlbGVjdGVkUGxhY2VFbGVtZW50XG4gICAgICAgID8gc2VsZWN0ZWRQbGFjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdrZXlmb2N1cycpID09PSAnZm9jdXMnXG4gICAgICAgIDogZmFsc2U7XG5cbiAgICAgIC8vIElmIHdlIHRhYiBiYWNrIChQUkVWX1RBQikgYW5kIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgb24gcGxhY2UsXG4gICAgICAvLyB3ZSByZW1vdmUgdGhlIHNlbGVjdGVkIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGNvYWNoIGFuZCBvbmx5IHNldCB0aGUgZm9jdXMgc3RhdHVzIHRvIGl0XG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnUFJFVl9UQUInICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBjdXJyRm9jdXNJbmRleCkge1xuICAgICAgICAvLyBJZiB3ZSBUQUIgYmFjayBhbmQgaGF2ZSBhIHNlbGVjdGVkIHBsYWNlcyBpbmlzZGUgdGhlIGN1cnJlbnQgY29hY2gsIHRoZW4gd2UgbW92ZSBvdXQgZnJvbSB0aGUgc2VhdG1hcCBhbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaFxuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMgfHwgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyRm9jdXNJbmRleDtcbiAgICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgYW5kIHRoZSBjdXJyZWN0IHNlbGVjdGVkIG5hdiBjb2FjaCBpcyB0aGUgZmlyc3QgZWxlbWVudCwgc28gd2UgaGF2ZSB0byBmb2N1cyAoanVtcCkgZGlyZWN0bHkgdG8gdGhlIGxlZnQgbmF2IGRpcmVjdGlvbiBidXR0b25cbiAgICAgICAgZWxzZSBpZiAoY3VyckZvY3VzSW5kZXggPT0gMCkge1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICBjb25zdCBidG5MZWZ0RGlyZWN0aW9uID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChcbiAgICAgICAgICAgICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JyxcbiAgICAgICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgIGJ0bkxlZnREaXJlY3Rpb24uZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlIHRhYiBuZXh0IGFuZCB0aGUgY3VycmVjdCBzZWxlY3RlZCBuYXYgY29hY2ggaXMgdGhlIGxhc3QgZWxlbWVudCwgc28gd2UgaGF2ZSB0byBmb2N1cyAoanVtcCkgZGlyZWN0bHkgdG8gdGhlIHJpZ2h0IG5hdiBkaXJlY3Rpb24gYnV0dG9uXG4gICAgICBlbHNlIGlmICh0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQicgJiYgbmV3Rm9jdXNhYmxlSW5kZXggPT09IHRoaXMuY29hY2hOYXZEYXRhLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgY29uc3QgYnRuUmlnaHREaXJlY3Rpb24gPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1yaWdodCcsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGJ0blJpZ2h0RGlyZWN0aW9uLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ5IFRhYiBOYXZpZ2F0aW9uLCBwZXJmb3JtIGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIGZvY3VzZWQgd2Fnb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBwbGFjZURlY2tJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcblxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgLy8gVGltZSBkZWxheSB0byB3YWl0IGZvciBzdGF0dXMgdXBkYXRlIHByb2Nlc3MgYXQgY2xpY2tlZCBwbGFjZVxuICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIC8vT25seSBpZiB0aGUgc2VsZWN0ZWRDb2FjaEluZGV4IGhhcyBjaGFuZ2VkLCBhbiB1cGRhdGUgbmVlZHMgdG8gYmUgY2FycmllZCBvdXRcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSByZXR1cm47XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucz8uZm9yRWFjaCgoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4OiBudW1iZXIpID0+XG4gICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5tYXAoKGNvYWNoOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb2FjaC5wbGFjZXNcbiAgICAgICAgICA/LmZpbHRlcigocGxhY2UpID0+IHBsYWNlLnN0YXRlID09PSAnU0VMRUNURUQnKVxuICAgICAgICAgID8uZm9yRWFjaCgocGxhY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4LCBwbGFjZS5udW1iZXIpO1xuICAgICAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24gPSBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICAgICAgcGxhY2UsXG4gICAgICAgICAgICAgIHBsYWNlSWQsXG4gICAgICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hJbmRleCxcbiAgICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwgPVxuICAgICAgICAgICAgICB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uLCBjb2FjaERlY2tJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ucGxhY2VUeXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuYmljeWNsZXMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbY29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleF07XG4gICAgY29uc3QgcGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IGN1cnJTZWxlY3RlZFBsYWNlLm51bWJlcik7XG5cbiAgICByZXR1cm4gcGxhY2VcbiAgICAgID8gbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgcGxhY2UsXG4gICAgICAgICAgY29hY2gsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuZGVja0luZGV4LFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXgsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2goXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgY3NzIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlTmF2aWdhdGlvbkNvYWNoRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXM7XG4gICAgdGhpcy5jb2FjaE5hdkRhdGEgPSBbXTtcblxuICAgIGxvd2VyRGVjay5mb3JFYWNoKChjb2FjaCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSA9IFtdO1xuICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBwbGFjZXM6IFBsYWNlW10gPSBbXTtcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgaW1wb3J0YW50IG5hdmlnYXRpb24gZGF0YSB0byBiZSByZW5kZXJlZFxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgIC5tYXAoKHNyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNyLmNvYWNoSXRlbXNbaW5kZXhdO1xuICAgICAgICB9KVxuICAgICAgICAuZm9yRWFjaCgoY29hY2g6IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICAgIHRyYXZlbENsYXNzZXMucHVzaCguLi5jb2FjaC50cmF2ZWxDbGFzcyk7XG4gICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgcGxhY2VzLnB1c2goLi4uKGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcyA6IFtdKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvYWNoTmF2RGF0YS5wdXNoKHtcbiAgICAgICAgaWQ6IGNvYWNoLmlkLFxuICAgICAgICB0cmF2ZWxDbGFzczogdGhpcy5fcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzKSxcbiAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgaXNEcml2ZXJBcmVhOiBjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMubGVuZ3RoID09PSAwIDogdHJ1ZSxcbiAgICAgICAgZHJpdmVyQXJlYVNpZGU6IHRoaXMuX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oY29hY2gpLFxuICAgICAgICBmcmVlUGxhY2VzOiB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2gocGxhY2VzKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkgcmV0dXJuICdGSVJTVCc7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSByZXR1cm4gJ1NFQ09ORCc7XG4gICAgcmV0dXJuICdBTllfQ0xBU1MnO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvYWNoRHJpdmVyQXJlYXMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAoZ3JhcGhpY2FsRWxlbWVudHMpID0+IGdyYXBoaWNhbEVsZW1lbnRzLmljb24gPT09ICdEUklWRVJfQVJFQScsXG4gICAgKTtcblxuICAgIGlmIChjb2FjaERyaXZlckFyZWFzICYmIGNvYWNoRHJpdmVyQXJlYXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGRyaXZlciBhcmVhIHBvc2l0aW9uIHdoZXRoZXIgaXQgaXMgcHJlc2VudCBvbiB0aGUgbGVmdCBvciByaWdodCBzaWRlIGluIGEgY29hY2hcbiAgICAgIGNvbnN0IGhhc0xlZnREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkgfHwgZmFsc2U7XG4gICAgICBjb25zdCBoYXNSaWdodERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID4gMCkgfHwgZmFsc2U7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICEhaGFzTGVmdERyaXZlckFyZWEsXG4gICAgICAgIHJpZ2h0OiAhIWhhc1JpZ2h0RHJpdmVyQXJlYSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbiA9IChwcm9wZXJ0eUlkczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKCFwcm9wZXJ0eUlkcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHNocmlua2VkUHJvcGVydHlJZHMgPSBwcm9wZXJ0eUlkc1xuICAgICAgPy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5SWQ6IHN0cmluZyk6IHtcbiAgICAgICAgcElkOiBzdHJpbmc7XG4gICAgICAgIHN2Z05hbWU6IHN0cmluZztcbiAgICAgIH0ge1xuICAgICAgICAvLyBwcmVwYXJlIHRlbXBvcmFyeSBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBpZCB0byBpdCdzIHN2Z05hbWUgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgbGlzdCBvZiBhbGxvd2VkIGljb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcElkOiBwcm9wZXJ0eUlkLFxuICAgICAgICAgIHN2Z05hbWU6IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA/IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC8vZmlsdGVyIG91dCBvYmplY3RzIHNlcnZpY2UgaWNvbnMgd2hpY2ggYXJlIG5vdCBpbiBBTExPV0VEX1NFUlZJQ0VfSUNPTlNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5VG9TdmcpID0+IEFMTE9XRURfU0VSVklDRV9JQ09OUy5pbmRleE9mKHByb3BlcnR5VG9Tdmcuc3ZnTmFtZSkgIT09IC0xKVxuICAgICAgLy9tYWtlIGl0IGRpc3RpbmN0IGJ5IHN2Z05hbWVcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgc2VsZi5tYXAoKHByb3BTdmcpID0+IHByb3BTdmcuc3ZnTmFtZSkuaW5kZXhPZih2YWx1ZS5zdmdOYW1lKSA9PT0gaW5kZXgsXG4gICAgICApXG4gICAgICAvLyBnbyBiYWNrIHRvIHByb3BlcnR5SWQgc3RyaW5nIGZyb20gdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgLm1hcCgocHJvcGVydHlUb1N2ZykgPT4gcHJvcGVydHlUb1N2Zy5wSWQpXG4gICAgICAvLyB0YWtlIGZpcnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZnJvbSBCYWNrZW5kLCBvdGhlcndpc2UgdGhlIGxheW91dCBjb3VsZCBiZSBkZXN0cm95ZWRcbiAgICAgIC5zbGljZSgwLCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTKTtcbiAgICByZXR1cm4gc2hyaW5rZWRQcm9wZXJ0eUlkcyA/IHNocmlua2VkUHJvcGVydHlJZHMgOiBbXTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEByZXR1cm5zIEhUTUxFbGVtZW50IG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldFBsYWNlSHRtbEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgICAgPyB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHx8IG51bGxcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleHRyYWN0ZWQgY29hY2ggZGVjayBpbmRleCBmcm9tIHBsYWNlIGlkXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlSWQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGRlY2tJbmRleCA9IHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yKCcjJyArIHBsYWNlSWQpXG4gICAgICA/LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWNrLWluZGV4Jyk7XG4gICAgaWYgKGRlY2tJbmRleCAmJiAhaXNOYU4oK2RlY2tJbmRleCkpIHtcbiAgICAgIHJldHVybiArZGVja0luZGV4O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDb2FjaEluZGV4KGNvYWNoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2FjaEluZGV4ID49IDAgJiZcbiAgICAgIGNvYWNoSW5kZXggPD0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBleGlzdGluZyBjb2FjaCBkZWNrIGluZGV4IGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5lY2Vzc2FyeSB0byBnZXQgYW4gYXZhaWxhYmxlIGNvYWNoIGRlY2sgaW5kZXggZHVyaW5nIGtleWJvYXJkIG5hdmlnYXRpb24sIHdoaWNoIGNhbiB2YXJ5IGJldHdlZW4gY29hY2hlcyB3aXRoIGRpZmZlcmVudCBkZWNrcy5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgY29hY2ggd2l0aCB0d28gZGVja3MgdG8gYSBjb2FjaCB3aXRoIG9uZSBkZWNrLlxuICAgKlxuICAgKiAgICAgICBbb29vXS1bb29vXS1bb29vXVxuICAgKiBbb29vXS1bb29vXS1bb29vXS1bb29vXS1bb29vXVxuICAgKlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XVxuICAgICAgICAucGxhY2VzICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG5leHQgcG9zc2libGUgY29hY2ggZGVjayBpbmRleCB3aGVyZSBwbGFjZXMgZXhpc3RcbiAgICBjb25zdCBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZmluZEluZGV4KFxuICAgICAgKHNlYXRSZXNlcnZhdGlvbikgPT5cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5wbGFjZXMgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA+PSBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXhcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgIDogbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgc2VsZWN0ZWQgcGxhY2UgaXMgc2xpZ2h0bHkgaGlkZGVuIGJ5IHRoZSBvdmVyZmxvdyBzY3JvbGwgY29udGVudCBhbmQgaXMgc3RpbGwgY2xpY2tlZCxcbiAgICogdGhlIG1ldGhvZCB0cmllcyB0byBzY3JvbGwgdGhlIHNlbGVjdGVkIHBsYWNlIGludG8gdGhlIG5lYXJlc3Qgdmlld3BvcnQsIHNvIHRoYXQgaXQgaXMgY29tcGxldGVseSB2aXNpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5nZXRFbGVtZW50QnlJZChwbGFjZUlkKVxuICAgICAgPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JywgaW5saW5lOiAnbmVhcmVzdCcgfSk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTY3JvbGxEaXJlY3Rpb24iLCJhY2N1bXVsYXRvciIsInBsYWNlIiwiY29hY2giXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUE0QkEsSUFBSztBQUFBLENBQUwsU0FBS0Esa0JBQWU7QUFDbEJBLG1CQUFBLE9BQUEsSUFBQTtBQUNBQSxtQkFBQSxNQUFBLElBQUE7QUFDRixHQUhLLG9CQUFBLGtCQUFlLENBQUEsRUFBQTtBQVdwQixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLHdCQUFrQztBQUFBLEVBQ3RDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBOztJQUdXLDhCQUEwQixNQUFBOztvQkFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQW5DLFNBQUEsbUJBQW1DLFlBQVU7QUFBQTs7QUFReEQ7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUlBO0FBRVM7QUFDQTtBQUNBO0FBM0NPLHlCQUFBLHFDQVJMLGtCQUFBLE1BQUEsMEJBQUEsR0FBMEIsa0JBQUEsTUFBQSxnQ0FRaUIsSUFBSztBQUszQyx5QkFBQSxrQ0FBQSxrQkFBQSxNQUFBLG1DQUFBLEdBQUEsa0JBQUEsTUFBQSw2QkFBeUIsSUFBSTtBQUs3Qix5QkFBQSxrQ0FBQSxrQkFBQSxNQUFBLGdDQUFBLEdBQUEsa0JBQUEsTUFBQSw2QkFBeUIs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
|
|
1133
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIExpdEVsZW1lbnQsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIE5hdmlnYXRpb25Db2FjaEl0ZW0sXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG59IGZyb20gJy4uL2NvbW1vbi50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gbmF2aWdhdGlvbiBjYW4gYmUgdG9nZ2xlZCBieSB0aGlzIHByb3BlcnR5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoYXMtbmF2aWdhdGlvbicsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGhhc05hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGlzIGFsaWduZWQgdmVydGljYWxseSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYWxpZ24tdmVydGljYWwnLCB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlLCB1c2VEZWZhdWx0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhbGlnblZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyBiYXNlIGdyaWQgc2l6ZSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFzZS1ncmlkLXNpemUnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGJhc2VHcmlkU2l6ZTogbnVtYmVyID0gMTY7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEncyB3aWR0aCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGVpZ2h0JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoZWlnaHQ6IG51bWJlciA9IG51bGwhO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgc2VhdHMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1zZWF0LXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4U2VhdFJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBiaWN5Y2xlIHBsYWNlcyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LWJpY3ljbGUtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhCaWN5Y2xlUmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogQW55IGNsaWNrIGZ1bmN0aW9uYWxpdHkgaXMgcHJldmVudGVkICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmV2ZW50LXBsYWNlLWNsaWNrJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJldmVudFBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJlc2VsZWN0LWNvYWNoLWluZGV4JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmVzZWxlY3RDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgY29hY2hOYXZEYXRhOiBOYXZpZ2F0aW9uQ29hY2hJdGVtW10gPSBbXTtcbiAgcHJvdGVjdGVkIGN1cnJTY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IFNjcm9sbERpcmVjdGlvbi5yaWdodDtcbiAgcHJvdGVjdGVkIG1heENhbGNDb2FjaHNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJpdmF0ZSBfaXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Nyb2xsVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RTdGFydFNjcm9sbFBvcyA9IC0xO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSAmJiB0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQsIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpIHdvdWxkIGZhaWwgd2l0aCBOUEUgYmVjYXVzZVxuICAgICAgLy8gdGhlIGNvYWNoU2Nyb2xsQXJlYSBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgbGV0IG5hdmlnYXRlVG9Db2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4IC0gMSA6IDA7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlTmF2aWdhdGlvbkNvYWNoRGF0YSgpO1xuICB9XG5cbiAgLyoqIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXMnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICA/IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBpZiAoc2VhdFJlc2VydmF0aW9uRGVjayAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgaGVpZ2h0IG9mIG9uZSBjb2FjaCBpbmNsdWRpbmcgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGNvbnN0IGNvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgPVxuICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSArIHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZWFjaCBnYXAgYmV0d2VlbiBtdWx0aXBsZSBjb2FjaCB0aGUgZGVja3MuXG4gICAgICAvLyBObyBnYXAgZXhpc3QgaWYganVzdCBvbmUgY29hY2ggZGVjayBleGlzdC5cbiAgICAgIGNvbnN0IGdhcEJldHdlZW5Db2FjaERlY2tzID0gKHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxKSAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoRGVja3M7XG5cbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQnLFxuICAgICAgICBgJHtjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nICogdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCArIGdhcEJldHdlZW5Db2FjaERlY2tzfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZGVja3MnLCBgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBJbml0IHRoZSBjb2FjaE5hdkJ1dHRvbkRpbSBkaW1lbnNpb24sIHdoaWNoIGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3Qgc2Nyb2xsIG5hdmlnYXRpb24gbGF0ZXJcbiAgICAgIGNvbnN0IG5hdkNvYWNoZUxpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZUxpc3QpIHtcbiAgICAgICAgY29uc3QgZmlyc3RMaUVsZURpbWVuc2lvbiA9IG5hdkNvYWNoZUxpc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmNvYWNoTmF2QnV0dG9uRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgPyBmaXJzdExpRWxlRGltZW5zaW9uLmhlaWdodFxuICAgICAgICAgIDogZmlyc3RMaUVsZURpbWVuc2lvbi53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEgJiYgc2VhdFJlc2VydmF0aW9uRGVjaykge1xuICAgICAgLy8gSW5pdCB0aGUgc3RhcnQgb2Zmc2V0IGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGNvYWNoIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uc1xuICAgICAgbGV0IGN1cnJDYWxjVHJpZ2dlclBvcyA9IDA7XG4gICAgICB0aGlzLnNjcm9sbENvYWNoc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NYID0gY3VyckNhbGNUcmlnZ2VyUG9zO1xuICAgICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoLmRpbWVuc2lvbikudztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9IGNvYWNoV2lkdGggKyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0UG9zWCxcbiAgICAgICAgICBlbmQ6IGN1cnJDYWxjVHJpZ2dlclBvcyxcbiAgICAgICAgICB3aWR0aDogY29hY2hXaWR0aCxcbiAgICAgICAgfSBhcyBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgbWF4aW11bSBjYWxjdWxhdGVkIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGV2ZW50IGhhbmRsZXIgbWFuYWdlZCB0aGUgZW5kIG9mIHNjcm9sbGluZyBpbnNpZGUgdGhlIGNvYWNoIHNjcm9sbCBhcmVhLlxuICAgKiBUaW1lb3V0IGV2ZW50IGhhbmRsaW5nIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGxpbmcgaGFzIGJlZW4gY29tcGxldGVkLlxuICAgKiBJdCBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBTYWZhcmkgYnJvd3NlciBkb2VzIG5vdCBoYW5kbGUgc2Nyb2xsZW5kIGV2ZW50LFxuICAgKiBhbmQgd2UgdGhlcmVmb3JlIGltaXRhdGUgdGhpcyBldmVudCAtPiBzY3JvbGxlbmQuXG4gICAqL1xuICBAZXZlbnRPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgY29hY2hBcmVhU2Nyb2xsZW5kKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zY3JvbGxUaW1lb3V0KSB7XG4gICAgICAvLyBGaXJzdCwgd2UgY2xlYXJlZCB0aGUgcmVnaXN0ZXJlZCB0aW1lb3V0LCBhcyB0aGUgc2Nyb2xsaW5nIGlzIHN0aWxsIHJ1bm5pbmdcbiAgICAgIC8vIGFuZCB0aHVzIHdlIHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IGZ1bmN0aW9uXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2Nyb2xsVGltZW91dCk7XG4gICAgfVxuICAgIC8vIElmIG5vIGZ1cnRoZXIgc2Nyb2xsIGV2ZW50IGlzIGZpcmVkLCB0aGUgbmV4dCB0aW1lb3V0IGNhbiBleGVjdXRlIHRoZSBpbm5lciBmdW5jdGlvbiBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgd2l0aG91dCBjbGVhcmluZ1xuICAgIHRoaXMuX3Njcm9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCksIDE1MCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgbm8gbmF2aWdhdGlvbiBleGlzdHMgKHByb3BlcnR5IHNldHRpbmcgLT4gaGFzTmF2aWdhdGlvbikgYW5kIGEgdGFibGUgY29hY2ggZ2V0cyB0aGUgZm9jdXMsXG4gICAqIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2ggbXVzdCBiZSBhdXRvbWF0aWNhbGx5IHByZXNlbGVjdGVkIHRvIGNvbnRyb2wgdGhlIHBsYWNlIG5hdmlnYXRpb24gdmlhIGtleWJvYXJkXG4gICAqXG4gICAqIEBwYXJhbSBmb2N1c0NvYWNoSW5kZXhcbiAgICovXG4gIHByb3RlY3RlZCBvbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGZvY3VzQ29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgJiYgIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZvY3VzQ29hY2hJbmRleCA9PT0gMFxuICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgtMSlcbiAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoZm9jdXNDb2FjaEluZGV4KTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdpbGwgYmUgdHJpZ2dlcmQgYnkgZm9jdXMgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKTogdm9pZCB7XG4gICAgLy8gSWYgYW55IG5hdmlnYXRpb24gZGlyZWN0aW9uIGJ1dHRvbiAocmlnaHR8bGVmdCkgZ2V0IHRoZSBmb2N1cywgc28gd2UgaGF2ZSBtYW51YWwgcmVzZXQgdGhlIHByZXZpb3VzIGZvY3VzQ29hY2hJbmRleC5cbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gIH1cblxuICAvKiogVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgQ29hY2ggTmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcblxuICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhZGxpbmdcbiAgICBpZiAoaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhZGxpbmcoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmFsIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIHRhYiBuYXZpZ2F0aW9uIGluc2lkZSB0aGUgY29hY2ggbmF2aWdhdGlvbiBhcmVhIGFuZCB0aGUgc2VhdG1hcCBhcmVhICovXG4gIHByaXZhdGUgX2hhbmRsZVRhYktleU5hdmlnYXRpb24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZXZlbnRBcmVhOiBzdHJpbmcsXG4gICAgY3VyclRhYkluZGV4PzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IHByZXNzZWRTaGlmdFRhYiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgaWYgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3IgY29hY2ggbmF2aWdhdGlvbiBhcmVhLlxuICAgICAgLy8gRnByIGNvYWNoIG5hdmlnYXRpb24gd2UganVzdCBjb250cm9sIHRoZSBmb2N1cyBpbmRleCB0byB2aXN1YWxpemUgZm9jdXMgc3R5bGUgZm9yIG5hdiBjb2FjaCBidXR0b25cbiAgICAgIGlmIChldmVudEFyZWEgPT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgIGlmIChjdXJyVGFiSW5kZXggPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgICAgICAgICFwcmVzc2VkU2hpZnRUYWIgfHxcbiAgICAgICAgICAgIHRoaXMuY29hY2hOYXZEYXRhW2N1cnJUYWJJbmRleF0uaXNEcml2ZXJBcmVhIHx8XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4O1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJlc3NlZFNoaWZ0VGFiICYmIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICAgIC8vSWYgdGhlIEZvciBiYWNrIHRhYmJpbmcsIHdlIGp1bXBcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXghO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oY3VyclRhYkluZGV4ISk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBzZWF0bWFwIGFyZWFcbiAgICAgIGVsc2UgaWYgKGV2ZW50QXJlYSA9PSAnc2VhdG1hcCcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHByZXNzZWRTaGlmdFRhYikge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnUFJFVl9UQUInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ05FWFRfVEFCJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgU2VhdG1hcCBldmVudCBoYW5kbGluZyB0byBuYXZpZ2F0aW9uIGJldHdlZW4gZWFjaCBwbGFjZXMgaW5zaWRlIGEgc2VsZWN0ZWQgY29hY2ggYnkgdXNpbmcgW2Fycm93XSBrZXlzLlxuICAgKiBXaXRoIHRoZSBbVEFCXSBrZXkgdGhlIHVzZXIgbmF2aWdhdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGNvYWNoIG5hdmlnYXRpb24gZWxlbWVudCBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZSBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFkbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiZcbiAgICAgICgoZXZlbnQuc2hpZnRLZXkgJiYgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB8fFxuICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKHByZXNzZWRLZXkgPT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnc2VhdG1hcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFycm93IEtleWJvYXJkIG5hdmlnYXRpb24gdG8gY29udHJvbCBwbGFjZXMgaW5zaWRlIHRoZSBzZWF0bWFwXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgJiYgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgc3dpdGNoIChwcmVzc2VkS2V5KSB7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRMZWZ0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZExlZnRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkUmlnaHRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFJpZ2h0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFVwS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFVwS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkRG93bktleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkRG93bktleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHBsYWNlIGluc2lkZSB0aGUgY29hY2ggaWYgbmF2aWdhdGVkIHZpYSBrZXlib2FyZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBjb2FjaCBncmlkIGlzIHNlbGVjdGVkIChuZWNlc3NhcnkgZm9yIFNjcmVlblJlYWRlcilcbiAgICovXG4gIHByb3RlY3RlZCBwcmVzZWxlY3RQbGFjZUluQ29hY2goKTogdm9pZCB7XG4gICAgLy8gTm8gcHJlc2VsZWN0IHBsYWNlIGJ5IG1hbnVhbCBzZWF0bWFwIHNjcm9sbGluZ1xuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHJldHVybjtcblxuICAgIC8vIE5vIGF1dG8gcGxhY2UgcHJlc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIHByZXNlbGVjdCBjb2FjaCBpbmRleFxuICAgIGlmICh0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCkge1xuICAgICAgdGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3IgRHJpdmVyQXJlYSBvciBFbXB0eSBjb2FjaCAobm8gcGxhY2VzKSwgbm8gcGxhY2UgaXMgc2VsZWN0YWJsZSwgc28gd2UgcmV0dXJuIGRpcmVjdGx5XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb2FjaE5hdkRhdGFbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XSAmJlxuICAgICAgdGhpcy5jb2FjaE5hdkRhdGFbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5pc0RyaXZlckFyZWFcbiAgICApIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgd2hlbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgYW5kIGNvYWNoZXMgYXJlIHNjcm9sbGVkIGJ5IGF1dG8gc2Nyb2xsaW5nLFxuICAgIC8vIHRoZW4gd2UgY2FuIHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaC5cbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJiB0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgY29uc3QgY2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24oKTtcbiAgICAgIC8vSWYgY2xvc2VzdFBsYWNlIGV4aXN0LCB3ZSBoYXZlIHRvIHVuZm9jdXMgcHJldmlvdXMgZm9jdXNlZCBwbGFjZVxuICAgICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChjbG9zZXN0UGxhY2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBhIGNvYWNoIHdhcyBzZWxlY3RlZCB3aXRoIG5vIHBsYWNlcywgdGhlbiB3ZSBoYXZlIHRvIGZvY3VzIHRoZSBjb2FjaEdyaWRcbiAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwcmVzZWxlY3Rpb24gZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGJ5IG5vcm1hbCBjbGlja2luZyBvciB2aWEgc2NyZWVuIHJlYWRlciB2aWEgdGFiLFxuICAgIC8vIHdlIG9ubHkgZm9jdXMgdGhlIHRhYmxlIHdpdGhvdXQgZGlyZWN0bHkgZm9jdXNpbmcgdGhlIHBsYWNlLlxuICAgIGVsc2Uge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG5cbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2lzVmFsaWRDb2FjaEluZGV4KHNlbGVjdGVkTmF2Q29hY2hJbmRleCkgJiZcbiAgICAgIHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgKSB7XG4gICAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHRoaXMuX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTtcbiAgICAgIHRoaXMuX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpO1xuXG4gICAgICBjb25zdCBzY3JvbGxUb0NvYWNoUG9zWCA9IHRoaXMuX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgfHwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gMDtcblxuICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGFsbG93cyBzY3JvbGxpbmcgdG8gdGhlIG5leHQgd2Fnb24gb3Igbm90XG4gICAgICBpZiAoaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlICYmIHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICAgIHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbFRvQ29hY2hQb3NYIDogMCxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmFsaWduVmVydGljYWwgPyAwIDogc2Nyb2xsVG9Db2FjaFBvc1gsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgY29hY2ggaW4gdGhlIG1haW4gbmF2aWdhdGlvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNQbGFjZUVsZW1lbnQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGlmIChwbGFjZSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ2ZvY3VzJyk7XG5cbiAgICAgICAgLy9UcnkgdG8gc2Nyb2xsIGZvY3VzZWQgcGxhY2UgaW50byB0aGUgdmlld3BvcnRcbiAgICAgICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICAgIHBsYWNlLm51bWJlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZUlkKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXlTY3JvbGxJblZpZXdwb3J0KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVuZm9jdXNQbGFjZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ3VuZm9jdXMnKTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKG51bGwpO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgZWxlbWVudERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICAgIGlzU3RyZXRjaEhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnREaW1lbnNpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiAhaXNPcmlnaW5IZWlnaHQpIHtcbiAgICAgIC8vIFNpbmNlIHRoZSBoZWlnaHQgb2YgdGhlIGNvYWNoIGhhcyBiZWVuIHZpc3VhbGx5IGV4cGFuZGVkIHRvIG1haW50YWluIGEgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyxcbiAgICAgIC8vIHNvbWUgZ3JhcGhpY3MgbXVzdCBhbHNvIGJlIGFkYXB0ZWQgdG8gdGhlIGhlaWdodCwgd2hpY2ggZW5kIHdpdGggdGhlIGJvcmRlcnMgb2YgdGhlIGNvYWNoXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZ3JhcGhpY3MgYXJlIGFzc2lnbmVkIGRpcmVjdGx5IGF0IHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoLFxuICAgICAgLy8gdGhlc2UgZ3JhcGhpY3MgbXVzdCBiZSBleHBhbmRlZCBpbiBoZWlnaHQgYnkgYSBjb2FjaEJvcmRlck9mZnNldCBpbiBvcmRlciB0byByZWFjaCB0aGVpciBvcmlnaW5hbCB2aXN1YWwgcG9zaXRpb25cbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24udyxcbiAgICAgIGg6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi5oLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgIGVsZW1lbnRQb3NpdGlvbjogRWxlbWVudFBvc2l0aW9uLFxuICAgIGVsZW1lbnREaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnRQb3NpdGlvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmIGVsZW1lbnREaW1lbnNpb24pIHtcbiAgICAgIGNvbnN0IGVuZFBvc0hlaWdodCA9IGlzT3JpZ2luSGVpZ2h0XG4gICAgICAgID8gY29hY2hEaW1lbnNpb24uaFxuICAgICAgICA6IGNvYWNoRGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgY29hY2gsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIFkgY29vcmRpbmF0ZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGJvcmRlciBwYWRkaW5nXG4gICAgICBpZiAoZWxlbWVudFBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFBvc2l0aW9uLnkgKyBlbGVtZW50RGltZW5zaW9uLmggPT09IGVuZFBvc0hlaWdodCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnRQb3NpdGlvbi54LFxuICAgICAgeTogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueSxcbiAgICAgIHo6IGVsZW1lbnRQb3NpdGlvbi56LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogZGV0ZWN0cyBpZiBhIChncmFwaGljYWwpIGVsZW1lbnQgaXMgb24gdGhlIGJvcmRlciB3aXRoIGl0cyBwb3NpdGlvbiAodXBwZXIgb3IgbG93ZXIgYm9yZGVyKS5cbiAgICogQHBhcmFtIGJhc2VFbGVtZW50XG4gICAqIEBwYXJhbSBjb2FjaERpbWVuc2lvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihcbiAgICBiYXNlRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBiYXNlRWxlbWVudC5wb3NpdGlvbi55ID09PSAwIHx8XG4gICAgICBiYXNlRWxlbWVudC5wb3NpdGlvbi55ICsgYmFzZUVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbGwgYXZhaWxhYmxlIHNlYXRzIHRvZ2V0aGVyIGRlcGVuZGluZyBvbiB0aGUgc2VhdCB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZXNcbiAgICogQHJldHVybnMgQW4gT2JqZWN0IHdpdGggY291bnQgb2YgZnJlZSBzZWF0cyBhbmQgZnJlZSBiaWN5Y2xlIHBsYWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goXG4gICAgcGxhY2VzOiBQbGFjZVtdIHwgdW5kZWZpbmVkLFxuICApOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyB7XG4gICAgY29uc3QgYWNjdW11bGF0b3I6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzID0geyBzZWF0czogMCwgYmljeWNsZXM6IDAgfTtcbiAgICBjb25zdCBmcmVlUGxhY2VzID0gcGxhY2VzPy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyUGxhY2U6IFBsYWNlKSA9PiB7XG4gICAgICBpZiAoY3VyclBsYWNlLnN0YXRlICE9PSAnRlJFRScpIHtcbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgfVxuICAgICAgLy8gQ291bnQgdXAgZGVwZW5kaW5nIG9uIHNlYXQgdHlwZVxuICAgICAgaWYgKGN1cnJQbGFjZS50eXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgYWNjdW11bGF0b3Iuc2VhdHMrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLmJpY3ljbGVzKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgYWNjdW11bGF0b3IpO1xuICAgIHJldHVybiBmcmVlUGxhY2VzID8gZnJlZVBsYWNlcyA6IGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0IHRoZSBlbmQgb2YgYSBzY3JvbGwgRXZlbnQgZnJvbSB0aGUgY29hY2ggc2Nyb2xsYWJsZSBhcmVhLFxuICAgKiB0aGUgcmVhY2hlZCBjb2FjaCBpcyBtYXJrZWQgYXMgc2VsZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbmRTY3JvbGxDb2FjaEluZGV4ID0gdGhpcy5pc0F1dG9TY3JvbGxpbmdcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICA6IHRoaXMuX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpO1xuXG4gICAgLy8gVElNTy00MzcwNVxuICAgIC8vIElmIGEgcGxhY2Ugd2FzIHNlbGVjdGVkIGJ5IG1vdXNlIGNsaWNrIChwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIGJlZm9yZSB0cmlnZ2VyaW5nIHRoaXMgc2Nyb2xsZW5kIG1ldGhvZCxcbiAgICAvLyB0aGVuIHRoaXMgc2Nyb2xsaW5nIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIG1ldGhvZCBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0IGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZWF0aGVyIHRoZSBlbmRzY3JvbGxpbmcgaXMganVzdCBhIHBsYWNlIGFqdWVzdG1lbnQgc2Nyb2xsaW5nIChwbGFjZSBoYXMgMiBncmlkIHNpemUgdW5pdHMpXG4gICAgICBjb25zdCBpc0NvYWNoU2Nyb2xsaW5nID1cbiAgICAgICAgTWF0aC5hYnModGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zIC0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdCkgPlxuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSAqIDI7XG4gICAgICBpZiAoaXNDb2FjaFNjcm9sbGluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG5cbiAgICAvLyBBZnRlciBjb2FjaCBzY3JvbGxlbmQgZXZlbnQgd2UgY2FuIHJlc2V0IHRoZSBob3ZlcmVkIGNvYWNoIGluZGV4XG4gICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IC0xO1xuXG4gICAgLy8gSW4gY2FzZSB0aGUgdXNlciB1c2VzIHRoZSBzY3JvbGxiYXIgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIHRoZSBzZWF0IHJlc2VydmF0aW9uLFxuICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW5kZXggaXMgLTEsIGFuZCB3ZSBoYXZlIHRvIHNldCB0aGlzIHZhbHVlIHdpdGggZmluZFNjcm9sbENvYWNoSW5kZXguXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZpbmRTY3JvbGxDb2FjaEluZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA6IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIC8vV2hlbiB1c2VyIGlzIHNjcm9sbGluZyB2aWEgc2Nyb2xsYmFyLCBpdCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgdG8gdGhlIGZvY3VzZWQgY29hY2ggaW4gdGhlIG1haW4gbmF2aWdhdGlvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oZmluZFNjcm9sbENvYWNoSW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcblxuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gYXV0b21hdGljIG1haW4gbmF2aWdhdGlvbiBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBzZWxlY3RlZE5hdkNvYWNoSW5kZXguXG4gICAqIENhbGN1bGF0ZXMgdGhlIGNlbnRyYWwgc2Nyb2xsIG9mZnNldCBvZiB0aGUgbmF2IGNvYWNoIHRvIGJlIHNlbGVjdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWROYXZDb2FjaEluZGV4XG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vVGltZSBkZWxheSB0byBub3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXhlY3V0aW5nIGNhbGxpbmcgc2Nyb2xsVG8gZnVuY3Rpb25zIChjb2FjaGVzIHNjcm9sbGluZylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCA9IHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gLyAyO1xuICAgICAgICBjb25zdCBzY3JvbGxCdXR0b25PZmZzZXRYID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4ICogdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsT2Zmc2V0WCA9XG4gICAgICAgICAgc2Nyb2xsQnV0dG9uT2Zmc2V0WCAtIG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYICsgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxPZmZzZXRYIDogMCxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmFsaWduVmVydGljYWwgPyAwIDogc2Nyb2xsT2Zmc2V0WCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgU2Nyb2xsRGlyZWN0aW9uIGJ5IHRoZSBuZXcgZ2l2ZW4gdGFyZ2V0IGNvYWNoIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA/IFNjcm9sbERpcmVjdGlvbi5yaWdodFxuICAgICAgICA6IFNjcm9sbERpcmVjdGlvbi5sZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjcm9sbCBzdGFydCBvciBlbmQgcG9zaXRpb24gWCBmcm9tIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogSW4gY2FzZSB0aGUgdXNlciBpcyBjdXJyZW50bHkgbmF2aWdhdGluZyB0aHJvdWdoIHBsYWNlcyBieSBrZXlib2FyZCBhbmQgZ29lcyB0byBwcmV2aW91cyBjb2FjaCxcbiAgICogdGhlbiB3ZSByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY29hY2ggdG8gZ2V0IHRoZSBjbG9zZXN0IHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBmb2N1cyBwbGFjZS5cbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvYWNoVHJpZ2dlclBvaW50ID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvbiA9XG4gICAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmXG4gICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICBjb2FjaFRyaWdnZXJQb2ludC53aWR0aCA+IHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaHNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaHNXaWR0aCAtIGNvYWNoU2Nyb2xsV2luZG93V2lkdGg7XG4gICAgY29uc3QgY3VyckNvYWNoVHJpZ2dlciA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zID1cbiAgICAgIGN1cnJTY3JvbGxQb3NYID09PSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5zdGFydDtcblxuICAgIHJldHVybiAoXG4gICAgICAoY3VyclNjcm9sbFBvc1ggPCBtYXhTY3JvbGxXaWR0aEFyZWEgfHwgY3VyclNjcm9sbFBvc1ggPiBjdXJyQ29hY2hUcmlnZ2VyLnN0YXJ0KSAmJlxuICAgICAgIWlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2FjaCBpbmRleCB3aGljaCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsIGFyZWFcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxQb3MgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3Qgc2Nyb2xsT2Zmc2V0WCA9IHNjcm9sbFBvcyArIHRoaXMuc2Nyb2xsQ29hY2hzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRvIGdldCB0aGUgY29ycmVjdCBjbG9zZXN0IHBsYWNlIG9mIGN1cnJlbnQgcHJlc3NlZCBrZXkgYW5kIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlLFxuICAgKiB3ZSBoYXZlIHRvIGludmVzdGlnYXRlIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIHBsYWNlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgcGxhY2Ugb2YgdGhlIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkLlxuICAgKiBAcGFyYW0gcHJlc3NlZEtleVxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5Pzogc3RyaW5nKTogUGxhY2UgfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBsZXQgY29hY2hQbGFjZXMgPSBjb2FjaC5wbGFjZXM7XG4gICAgbGV0IHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPSBudWxsO1xuXG4gICAgaWYgKGNvYWNoUGxhY2VzKSB7XG4gICAgICAvLyBJZiBubyBwbGFjZSBzZXQsIHRoZW4gd2UgdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24gPSB7IC4uLnRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24gfTtcblxuICAgICAgICAgIGlmIChwcmVzc2VkS2V5KSB7XG4gICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgdG8gc3dpdGNoIHRvIGFub3RoZXIgY29hY2ggZGVjayAoVXAgLT4gRG93biB8IERvd24gLT4gVXApLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB0YWtlIHRoZSBjb2FjaCBwbGFjZXMgd2UgaGF2ZSB0byBjaGVja2VkIGZyb20gdGhlIHRhcmdldCBkZWNrIG5vdy5cbiAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPSB0aGlzLl9nZXRTd2l0Y2hlZENvYWNoRGVja0luZGV4QnlLZXlOYXZpZ2F0aW9uKFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5LFxuICAgICAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBBc3NpZ24gY2hlY2sgcGxhY2VzIGZyb20gdGhlIHRhcmdldCBzd2l0Y2ggZGVja1xuICAgICAgICAgICAgICBjb2FjaFBsYWNlcyA9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3N3aXRjaGVkQ29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgICBdLnBsYWNlcyB8fCBbXTtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byB1cGRhdGUgeSBjb29yZGluYXRlXG4gICAgICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSA9XG4gICAgICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID8gY29hY2guZGltZW5zaW9uLmggOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoUGxhY2VzKSB7XG4gICAgICAgICAgICAvLyBJZiBubyBrZXkgcHJlc3NlZCwgdGhlbiB3ZSB0cnkgdG8gZmluZCB0aGUgcGxhY2Ugb2YgdGhlIGN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvblxuICAgICAgICAgICAgaWYgKCFwcmVzc2VkS2V5KSB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgcGxhY2UgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIFJJR0hUXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5yaWdodCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHBsYWNlLm51bWJlciAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ubnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgLy9LZXkgW1JpZ2h0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbRG93bl0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtMZWZ0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtVcF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBhIHBsYWNlIGhhcyBiZWVuIGZvdW5kIGluIHRoZSBjaGFuZ2luZyBzd2l0Y2ggY29hY2gsXG4gICAgICAgICAgLy8gd2UgY2FuIHVwZGF0ZSB0aGUgY3VyclNlbGVjdGVkRGVja0luZGV4XG4gICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwgJiYgY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHN3aXRjaGVkQ29hY2hEZWNrSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0UGxhY2U7XG4gIH1cblxuICAvLyBIYW5kbGluZyBmb3IgVGFiIG5hdmlnYXRpb24gaWYgYSBwbGFjZSBpcyBzZWxlY3RlZCBpbnNpZGUgdGhlIGNvYWNoLlxuICAvLyBUaGlzIGNvbnRyb2xzIHRoZSBmb2N1c2VkIGNvYWNoIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2guXG4gIHByaXZhdGUgX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCh0YWJEaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJGb2N1c0luZGV4ID1cbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgIDogdGhpcy5mb2N1c2VkQ29hY2hJbmRleDtcblxuICAgIC8vIENoZWNrIG5leHQgb3IgcHJldiB0YWIgaXMgcHJlc3NlZCwgdGhlbiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4IHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzXG4gICAgY29uc3QgbmV3Rm9jdXNhYmxlSW5kZXg6IG51bWJlciA9XG4gICAgICB0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQidcbiAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KVxuICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBjb25zdCBwbGFjZUluQ29hY2hIYXNGb2N1cyA9IHNlbGVjdGVkUGxhY2VFbGVtZW50XG4gICAgICAgID8gc2VsZWN0ZWRQbGFjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdrZXlmb2N1cycpID09PSAnZm9jdXMnXG4gICAgICAgIDogZmFsc2U7XG5cbiAgICAgIC8vIElmIHdlIHRhYiBiYWNrIChQUkVWX1RBQikgYW5kIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgb24gcGxhY2UsXG4gICAgICAvLyB3ZSByZW1vdmUgdGhlIHNlbGVjdGVkIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGNvYWNoIGFuZCBvbmx5IHNldCB0aGUgZm9jdXMgc3RhdHVzIHRvIGl0XG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnUFJFVl9UQUInICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBjdXJyRm9jdXNJbmRleCkge1xuICAgICAgICAvLyBJZiB3ZSBUQUIgYmFjayBhbmQgaGF2ZSBhIHNlbGVjdGVkIHBsYWNlcyBpbmlzZGUgdGhlIGN1cnJlbnQgY29hY2gsIHRoZW4gd2UgbW92ZSBvdXQgZnJvbSB0aGUgc2VhdG1hcCBhbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaFxuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMgfHwgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyRm9jdXNJbmRleDtcbiAgICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgYW5kIHRoZSBjdXJyZWN0IHNlbGVjdGVkIG5hdiBjb2FjaCBpcyB0aGUgZmlyc3QgZWxlbWVudCwgc28gd2UgaGF2ZSB0byBmb2N1cyAoanVtcCkgZGlyZWN0bHkgdG8gdGhlIGxlZnQgbmF2IGRpcmVjdGlvbiBidXR0b25cbiAgICAgICAgZWxzZSBpZiAoY3VyckZvY3VzSW5kZXggPT0gMCkge1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICBjb25zdCBidG5MZWZ0RGlyZWN0aW9uID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChcbiAgICAgICAgICAgICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JyxcbiAgICAgICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgIGJ0bkxlZnREaXJlY3Rpb24uZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlIHRhYiBuZXh0IGFuZCB0aGUgY3VycmVjdCBzZWxlY3RlZCBuYXYgY29hY2ggaXMgdGhlIGxhc3QgZWxlbWVudCwgc28gd2UgaGF2ZSB0byBmb2N1cyAoanVtcCkgZGlyZWN0bHkgdG8gdGhlIHJpZ2h0IG5hdiBkaXJlY3Rpb24gYnV0dG9uXG4gICAgICBlbHNlIGlmICh0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQicgJiYgbmV3Rm9jdXNhYmxlSW5kZXggPT09IHRoaXMuY29hY2hOYXZEYXRhLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgY29uc3QgYnRuUmlnaHREaXJlY3Rpb24gPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1yaWdodCcsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGJ0blJpZ2h0RGlyZWN0aW9uLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ5IFRhYiBOYXZpZ2F0aW9uLCBwZXJmb3JtIGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIGZvY3VzZWQgd2Fnb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBwbGFjZURlY2tJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcblxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgLy8gVGltZSBkZWxheSB0byB3YWl0IGZvciBzdGF0dXMgdXBkYXRlIHByb2Nlc3MgYXQgY2xpY2tlZCBwbGFjZVxuICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIC8vT25seSBpZiB0aGUgc2VsZWN0ZWRDb2FjaEluZGV4IGhhcyBjaGFuZ2VkLCBhbiB1cGRhdGUgbmVlZHMgdG8gYmUgY2FycmllZCBvdXRcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSByZXR1cm47XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWxsIHNlbGVjdGVkIHBsYWNlcyB3aWxsIGJlIHJlc2V0IG9yIHRoZSBjdXJyZW50U2VsZWN0ZWRQbGFjZSB3YXMgZ2l2ZW4sIHRoZW4gd2UgcmVzZXQgYWxsIGV4Y2VwdCBjdXJyZW50U2VsZWN0ZWRQbGFjZVxuICAgKiBAcGFyYW0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnNcbiAgICogQHBhcmFtIGN1cnJTZWxlY3RlZFBsYWNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZT86IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvL0ZpbmQgYWxsIHBsYWNlcyB0byBiZSBuZWVkZWQgdW5zZWxlY3RcbiAgICBmb3IgKGNvbnN0IHBsYWNlU2VsZWN0aW9uIG9mIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zKSB7XG4gICAgICBpZiAoIWN1cnJTZWxlY3RlZFBsYWNlIHx8IGN1cnJTZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCkge1xuICAgICAgICBjb25zdCBwbGFjZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHBsYWNlU2VsZWN0aW9uLmlkKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHBsYWNlRWxlbWVudCkge1xuICAgICAgICAgIHBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0YXRlJywgJ0ZSRUUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZXMgYWxsIHNlbGVjdGVkIHBsYWNlcyBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgIGlmIChjdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgPT09IGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlU2VsZWN0aW9uLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIgfCBudWxsLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwge1xuICAgIGlmIChjb2FjaERlY2tJbmRleCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tjb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5kZWNrSW5kZXgsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleCxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaChcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2ggfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaC5wbGFjZXMpO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCwgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBwbGFjZVxuICAgICAgPyB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhdGlvbiBvZiB0aGUgdXNlZCBkb2N1bWVudHMgZm9udC1zaXplIHdoaWNoIG5lZWRzXG4gICAqIHRvIGJlIGRldGVybWluZWQgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBjc3MgdmFsdWVzIHdpdGggcmVtXG4gICAqICovXG4gIHByaXZhdGUgX2RldGVybWluZUJhc2VGb250U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBjb25zdCBiYXNlRm9udFNpemUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSwgMTApO1xuICAgICAgLy9jYWxjdWxhdGUgcmVtIG9mIDFweFxuICAgICAgY29uc3Qgb25lUGl4ZWxJblJlbSA9IDEgLyBiYXNlRm9udFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtJywgYCR7b25lUGl4ZWxJblJlbSArICdyZW0nfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBkYXRhIGZvciBkaXNwbGF5aW5nIG5hdmlnYXRpb24gYXJlYS5cbiAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGR1cmluZyB1c2Ugb2YgYSBjb21wb25lbnQ6XG4gICAqICAgIC0gY29hY2ggaWRcbiAgICogICAgLSBsaXN0IG9mIHNlcnZpY2UgaWNvbnNcbiAgICogICAgLSBjbGFzcyAoZmlyc3QsIHNlY29uZCwgYW55KVxuICAgKiAgICAtIHdoZXRoZXIgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSBsZWZ0IG9yIHJpZ2h0XG4gICAqICovXG4gIHByaXZhdGUgX3ByZXBhcmVOYXZpZ2F0aW9uQ29hY2hEYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcbiAgICB0aGlzLmNvYWNoTmF2RGF0YSA9IFtdO1xuXG4gICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdID0gW107XG4gICAgICBjb25zdCBwcm9wZXJ0eUlkczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IGFsbCBpbXBvcnRhbnQgbmF2aWdhdGlvbiBkYXRhIHRvIGJlIHJlbmRlcmVkXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gc3IuY29hY2hJdGVtc1tpbmRleF07XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgdHJhdmVsQ2xhc3Nlcy5wdXNoKC4uLmNvYWNoLnRyYXZlbENsYXNzKTtcbiAgICAgICAgICBwcm9wZXJ0eUlkcy5wdXNoKC4uLihjb2FjaC5wcm9wZXJ0eUlkcyA/IGNvYWNoLnByb3BlcnR5SWRzIDogW10pKTtcbiAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY29hY2hOYXZEYXRhLnB1c2goe1xuICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgIHRyYXZlbENsYXNzOiB0aGlzLl9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXMpLFxuICAgICAgICBwcm9wZXJ0eUlkczogdGhpcy5fcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24ocHJvcGVydHlJZHMpLFxuICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgIGZyZWVQbGFjZXM6IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChwbGFjZXMpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSk6IFBsYWNlVHJhdmVsQ2xhc3Mge1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ0ZJUlNUJykgIT09IC0xKSByZXR1cm4gJ0ZJUlNUJztcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdTRUNPTkQnKSAhPT0gLTEpIHJldHVybiAnU0VDT05EJztcbiAgICByZXR1cm4gJ0FOWV9DTEFTUyc7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29hY2hEcml2ZXJBcmVhcyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgIChncmFwaGljYWxFbGVtZW50cykgPT4gZ3JhcGhpY2FsRWxlbWVudHMuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICApO1xuXG4gICAgaWYgKGNvYWNoRHJpdmVyQXJlYXMgJiYgY29hY2hEcml2ZXJBcmVhcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVja2luZyB0aGUgZHJpdmVyIGFyZWEgcG9zaXRpb24gd2hldGhlciBpdCBpcyBwcmVzZW50IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgaW4gYSBjb2FjaFxuICAgICAgY29uc3QgaGFzTGVmdERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB8fCBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1JpZ2h0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPiAwKSB8fCBmYWxzZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogISFoYXNMZWZ0RHJpdmVyQXJlYSxcbiAgICAgICAgcmlnaHQ6ICEhaGFzUmlnaHREcml2ZXJBcmVhLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uID0gKHByb3BlcnR5SWRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgICBpZiAoIXByb3BlcnR5SWRzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2hyaW5rZWRQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJpbmtlZFByb3BlcnR5SWRzID8gc2hyaW5rZWRQcm9wZXJ0eUlkcyA6IFtdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlNjcm9sbERpcmVjdGlvbiIsImFjY3VtdWxhdG9yIiwicGxhY2UiLCJjb2FjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQTRCQSxJQUFLO0FBQUEsQ0FBTCxTQUFLQSxrQkFBZTtBQUNsQkEsbUJBQUEsT0FBQSxJQUFBO0FBQ0FBLG1CQUFBLE1BQUEsSUFBQTtBQUNGLEdBSEssb0JBQUEsa0JBQWUsQ0FBQSxFQUFBO0FBV3BCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sd0JBQWtDO0FBQUEsRUFDdEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7O0lBR1csOEJBQTBCLE1BQUE7O29CQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBbkMsU0FBQSxtQkFBbUMsWUFBVTtBQUFBOztBQVF4RDtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBS0E7QUFLQTtBQUtBO0FBSUE7QUFFUztBQUNBO0FBQ0E7QUEzQ08seUJBQUEscUNBUkwsa0JBQUEsTUFBQSwwQkFBQSxHQUEwQixrQkFBQSxNQUFBLGdDQVFpQixJQUFLO0FBSzNDLHlCQUFBLGtDQUFBLGtCQUFBLE1BQUEsbUNBQUEsR0FBQSxrQkFBQSxNQUFBLDZCQUF5QixJQUFJO0FBSzdCLHlCQUFBLGtDQUFBLGtCQUFBLE1BQUEsZ0NBQUEsR0FBQSxrQkFBQSxNQUFBLDZCQUF5QixLQUFLO0FBSzlCLHlCQUFBLGlDQUFBLGtCQUFBLE1BQUEsZ0NBQUEsR0FBQSxrQkFBQSxNQUFBLDRCQUF1QixFQUFFO0FBS3pCLHlCQUFBLDJCQUFBLGtCQUFBLE1BQUEsK0JBQUEsR0FBQSxrQkFBQSxNQUFBLHNCQUFpQixJQUFLO0FBS3RCLHlCQUFBLHdDQUFBLGtCQUFBLE1BQUEseUJBQUEsR0FBQSxrQkFBQSxNQUFBLG1DQUE4QixFQUFFO0FBS2hDLHlCQUFBLDJDQUFBLGtCQUFBLE1BQUEsc0NBQUEsR0FBQSxrQkFBQSxNQUFBLHNDQUFpQyxFQUFFO0FBS25DLHlCQUFBLHNDQUFBLGtCQUFBLE1BQUEseUNBQUEsR0FBQSxrQkFBQSxNQUFBLGlDQUE2QixLQUFLO0FBSWxDLHlCQUFBLHdDQUFBLGtCQUFBLE1BQUEsb0NBQUEsR0FBQSxrQkFBQSxNQUFBLG1DQUE4QixFQUFFO0FBRXBCLHlCQUFBLHVDQUFBLGtCQUFBLE1BQUEsc0NBQUEsR0FBQSxrQkFBQSxNQUFBLGtDQUE2QixFQUFFO0FBQy9CLHlCQUFBLHNDQUFBLGtCQUFBLE1BQUEscUNBQUEsR0FBQSxrQkFBQSxNQUFBLGlDQUE0QixFQUFFO0FBQzlCLHlCQUFBLHNDQUFBLGtCQUFBLE1BQUEsb0NBQUEsR0FBQSxrQkFBQSxNQUFBLGlDQUE0QixFQUFFO0FBR2hELFdBQUEsc0JBQWtCLGtCQUFBLE1BQUEsb0NBQUEsR0FBRztBQUVyQixXQUFBLG9CQUFvQjtBQUdwQixXQUFBLG9CQUFvQixLQUFLLHFCQUFxQixLQUFLO0FBRW5ELFdBQUEsdUJBQXVCO0FBRXZCLFdBQUEsb0JBQTRCO0FBQzVCLFdBQUEsZUFBc0MsQ0FBQTtBQUN0QyxXQUFBLHNCQUF1QyxnQkFBZ0I7QUFDdkQsV0FBQSxxQkFBNkI7QUFDN0IsV0FBQSx3QkFBZ0M7QUFDaEMsV0FBQSwwQkFBa0M7QUFDbEMsV0FBQSxrQ0FBNkQsQ0FBQTtBQUM3RCxXQUFBLHVCQUFvQztBQUNwQyxXQUFBLGtCQUErQjtBQUMvQixXQUFBLG9CQUFrQztBQUNsQyxXQUFBLDZCQUE0QztBQUM1QyxXQUFBLHlCQUFpQztBQUNqQyxXQUFBLHdCQUFnQztBQUNoQyxXQUFBLGlDQUEwQztBQUMxQyxXQUFBLGdDQUErRDtBQUFBLFFBQ3ZFLE9BQU8sQ0FBQTtBQUFBLFFBQ1AsVUFBVSxDQUFBO0FBQUEsTUFBQTtBQUVGLFdBQUEsMkNBQTJDO0FBQzNDLFdBQUEsdUJBQXVCO0FBQ3ZCLFdBQUEsa0JBQWtCO0FBQ2xCLFdBQUEsdUJBQXVCO0FBQ3ZCLFdBQUEsbUJBQW1CO0FBQ25CLFdBQUEsZ0NBQWdDO0FBQ2hDLFdBQUEsMkJBQTJCO0FBQUEsUUFDbkMsV0FBVztBQUFBLFFBQ1gsWUFBWTtBQUFBLFFBQ1osU0FBUztBQUFBLFFBQ1QsV0FBVztBQUFBLFFBQ1gsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQUE7QUFHRCxXQUFBLG9DQUFvQztBQUVwQyxXQUFBLHNCQUFzQjtBQXd5Q3RCLFdBQUEsaUNBQWlDLENBQUMsZ0JBQW1DO0FBQzNFLFlBQUksQ0FBQyxhQUFhO0FBQ2hCLGlCQUFPLENBQUE7QUFBQSxRQUNUO0FBRUEsY0FBTSxzQkFBc0IsYUFDeEIsSUFBSSxTQUFVLFlBQWtCO0FBS2hDLGlCQUFPO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxTQUFTLGFBQWEsVUFBVSxHQUFHLFVBQVUsYUFBYSxVQUFVLEdBQUcsVUFBVTtBQUFBLFVBQUE7QUFBQSxRQUVyRixDQUFDLEVBRUEsT0FBTyxDQUFDLGtCQUFrQixzQkFBc0IsUUFBUSxjQUFjLE9BQU8sTUFBTSxFQUFFLEVBRXJGLE9BQ0MsQ0FBQyxPQUFPLE9BQU8sU0FDYixLQUFLLElBQUksQ0FBQyxZQUFZLFFBQVEsT0FBTyxFQUFFLFFBQVEsTUFBTSxPQUFPLE1BQU0sS0FBSyxFQUcxRSxJQUFJLENBQUMsa0JBQWtCLGNBQWMsR0FBRyxFQUV4QyxNQUFNLEdBQUcsc0JBQXNCO0FBQ2xDLGVBQU8sc0JBQXNCLHNCQUFzQixDQUFBO0FBQUEsTUFDckQ7QUFBQSxJQXdFRjtBQUFBO0FBQUEsSUF0K0NFLElBQWdCLG1CQUFnQjtBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBaEMsSUFBZ0IsaUJBQWdCLE9BQUE7QUFBQSx5QkFBQSxvQ0FBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBS2hDLElBQWdCLGdCQUFhO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUE3QixJQUFnQixjQUFhLE9BQUE7QUFBQSx5QkFBQSxpQ0FBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBSzdCLElBQWdCLGdCQUFhO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUE3QixJQUFnQixjQUFhLE9BQUE7QUFBQSx5QkFBQSxpQ0FBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBSzdCLElBQWdCLGVBQVk7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQTVCLElBQWdCLGFBQVksT0FBQTtBQUFBLHlCQUFBLGdDQUFBO0FBQUEsSUFBQTtBQUFBO0FBQUEsSUFLNUIsSUFBZ0IsU0FBTTtBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBdEIsSUFBZ0IsT0FBTSxPQUFBO0FBQUEseUJBQUEsMEJBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUt0QixJQUFnQixzQkFBbUI7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQW5DLElBQWdCLG9CQUFtQixPQUFBO0FBQUEseUJBQUEsdUNBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUtuQyxJQUFnQix5QkFBc0I7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQXRDLElBQWdCLHVCQUFzQixPQUFBO0FBQUEseUJBQUEsMENBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUt0QyxJQUFnQixvQkFBaUI7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQWpDLElBQWdCLGtCQUFpQixPQUFBO0FBQUEseUJBQUEscUNBQUE7QUFBQSxJQUFBO0FBQUEsSUFJakMsSUFBZ0Isc0JBQW1CO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUFuQyxJQUFnQixvQkFBbUIsT0FBQTtBQUFBLHlCQUFBLHVDQUFBO0FBQUEsSUFBQTtBQUFBLElBRTFCLElBQW1CLHFCQUFrQjtBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBckMsSUFBbUIsbUJBQWtCLE9BQUE7QUFBQSx5QkFBQSxzQ0FBQTtBQUFBLElBQUE7QUFBQSxJQUNyQyxJQUFtQixvQkFBaUI7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQXBDLElBQW1CLGtCQUFpQixPQUFBO0FBQUEseUJBQUEscUNBQUE7QUFBQSxJQUFBO0FBQUEsSUFDcEMsSUFBbUIsb0JBQWlCO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUFwQyxJQUFtQixrQkFBaUIsT0FBQTtBQUFBLHlCQUFBLHFDQUFBO0FBQUEsSUFBQTtBQUFBLElBaUQxQixXQUFXLG1CQUF1QztBQUNuRSxZQUFNLFdBQVcsaUJBQWlCO0FBRWxDLFVBQUksa0JBQWtCLElBQUksa0JBQWtCLEdBQUc7QUFDN0MsYUFBSyxtQkFBbUIsS0FBSyxrQkFBa0IsU0FBUztBQUV4RCxhQUFLLGdDQUFBO0FBQ0wsYUFBSyxtQ0FBQTtBQUNMLGFBQUsscUNBQUE7QUFBQSxNQUNQO0FBRUEsVUFBSSxrQkFBa0IsSUFBSSxjQUFjLEdBQUc7QUFDekMsYUFBSyxvQkFBb0IsS0FBSyxxQkFBcUIsS0FBSztBQUN4RCxhQUFLLE9BQU8sWUFBWSxvQ0FBb0MsR0FBRyxLQUFLLFlBQVksSUFBSTtBQUVwRixhQUFLLHFDQUFBO0FBQUEsTUFDUDtBQUdBLFVBQUksa0JBQWtCLElBQUksUUFBUSxLQUFLLENBQUMsQ0FBQyxLQUFLLFFBQVE7QUFDcEQsY0FBTSx1QkFBdUIsS0FBSyxpQkFBaUIsS0FBSyxxQkFBcUIsS0FBSztBQUNsRixZQUFJLHNCQUFzQixXQUFXLFFBQVE7QUFDM0MsZUFBSyxlQUFlLEtBQUssU0FBUyxxQkFBcUIsV0FBVyxDQUFDLEVBQUUsVUFBVTtBQUMvRSxlQUFLLG9CQUFvQixLQUFLLHFCQUFxQixLQUFLO0FBQ3hELGVBQUssT0FBTyxZQUFZLG9DQUFvQyxHQUFHLEtBQUssWUFBWSxJQUFJO0FBRXBGLGVBQUsscUNBQUE7QUFBQSxRQUNQO0FBQUEsTUFDRjtBQUVBLFVBQUksa0JBQWtCLElBQUksZUFBZSxLQUFLLEtBQUssZUFBZTtBQUNoRSxhQUFLLHFDQUFBO0FBQUEsTUFDUDtBQUVBLFVBQUksa0JBQWtCLElBQUkscUJBQXFCLEdBQUc7QUFHaEQsYUFBSyxvQ0FBb0M7QUFDekMsbUJBQVcsTUFBTSxLQUFLLHlCQUF5QixLQUFLLG1CQUFtQixHQUFHLENBQUM7QUFBQSxNQUM3RTtBQUFBLElBQ0Y7QUFBQSxJQUVVLHVCQUF1QixjQUFvQjtBQUNuRCxXQUFLLG9CQUFBO0FBQ0wsVUFBSSx1QkFBdUIsS0FBSztBQUNoQyxVQUFJLGdCQUFnQixvQkFBb0IsdUJBQXVCLEdBQUc7QUFDaEUsK0JBQ0UsS0FBSywwQkFBMEIsS0FBSyxLQUFLLHlCQUF5QixJQUFJO0FBQUEsTUFDMUUsV0FDRSxnQkFBZ0IscUJBQ2hCLHVCQUF1QixLQUFLLGlCQUFpQixLQUFLLHFCQUFxQixFQUFFLFdBQVcsU0FBUyxHQUM3RjtBQUNBLCtCQUNFLEtBQUssMEJBQTBCLEtBQUssS0FBSyx5QkFBeUIsSUFBSTtBQUFBLE1BQzFFO0FBRUEsV0FBSyx5QkFBeUIsb0JBQW9CO0FBQUEsSUFDcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEsa0NBQStCO0FBQ3JDLFdBQUssdUJBQUE7QUFFTCxVQUFJLEtBQUssa0JBQWtCO0FBR3pCLGFBQUssMkJBQUE7QUFBQSxNQUNQO0FBRUEsV0FBSyw0QkFBQTtBQUFBLElBQ1A7QUFBQTtBQUFBLElBR1UsdUNBQW9DO0FBQzVDLFdBQUssa0JBQWtCLEtBQUssWUFBWSxjQUN0Qyw2QkFBNkI7QUFFL0IsV0FBSyx1QkFBdUIsS0FBSyxZQUFZLGNBQzNDLGtDQUFrQztBQUdwQyxZQUFNLHNCQUFzQixLQUFLLG1CQUM3QixLQUFLLGlCQUFpQixLQUFLLHFCQUFxQixJQUNoRDtBQUNKLFVBQUksdUJBQXVCLG9CQUFvQixXQUFXLFNBQVMsR0FBRztBQUVwRSxjQUFNLCtCQUNKLG9CQUFvQixXQUFXLENBQUMsRUFBRSxVQUFVLElBQUksS0FBSyxlQUFlLEtBQUs7QUFJM0UsY0FBTSx3QkFBd0IsS0FBSyxpQkFBaUIsU0FBUyxLQUFLLEtBQUs7QUFFdkUsYUFBSyxPQUFPLFlBQ1YsaUNBQ0EsR0FBRywrQkFBK0IsS0FBSyxpQkFBaUIsU0FBUyxvQkFBb0IsRUFBRTtBQUV6RixhQUFLLE9BQU8sWUFBWSxnQ0FBZ0MsR0FBRyxLQUFLLGlCQUFpQixNQUFNLEVBQUU7QUFBQSxNQUMzRjtBQUVBLFVBQUksS0FBSyxzQkFBc0I7QUFDN0IsYUFBSywwQkFBMEIsS0FBSyxnQkFDaEMsS0FBSyxxQkFBcUIsc0JBQUEsRUFBd0IsU0FDbEQsS0FBSyxxQkFBcUIsc0JBQUEsRUFBd0I7QUFHdEQsY0FBTSxnQkFBZ0IsS0FBSyxxQkFBcUIsY0FBYyxTQUFTO0FBQ3ZFLFlBQUksZUFBZTtBQUNqQixnQkFBTSxzQkFBc0IsZUFBZSxzQkFBQTtBQUMzQyxlQUFLLG9CQUFvQixLQUFLLGdCQUMxQixvQkFBb0IsU0FDcEIsb0JBQW9CO0FBQUEsUUFDMUI7QUFBQSxNQUNGO0FBRUEsVUFBSSxLQUFLLG1CQUFtQixxQkFBcUI7QUFFL0MsWUFBSSxxQkFBcUI7QUFDekIsYUFBSyx3QkFBd0IsS0FBSyxnQkFDOUIsS0FBSyxnQkFBZ0Isc0JBQUEsRUFBd0IsU0FDN0MsS0FBSyxnQkFBZ0Isc0JBQUEsRUFBd0I7QUFHakQsYUFBSyxrQ0FBa0Msb0JBQW9CLFdBQVcsSUFBSSxDQUFDLFVBQVM7QUFDbEYsZ0JBQU0sWUFBWTtBQUNsQixnQkFBTSxhQUFhLEtBQUssdUJBQXVCLE1BQU0sU0FBUyxFQUFFO0FBR2hFLGdDQUFzQixhQUFhLEtBQUs7QUFFeEMsaUJBQU87QUFBQSxZQUNMLE9BQU87QUFBQSxZQUNQLEtBQUs7QUFBQSxZQUNMLE9BQU87QUFBQSxVQUFBO0FBQUEsUUFFWCxDQUFDO0FBR0QsYUFBSyxxQkFBcUI7QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVNVLHFCQUFrQjtBQUMxQixVQUFJLEtBQUssZ0JBQWdCO0FBR3ZCLHFCQUFhLEtBQUssY0FBYztBQUFBLE1BQ2xDO0FBRUEsV0FBSyxpQkFBaUIsV0FBVyxNQUFNLEtBQUssK0JBQUEsR0FBa0MsR0FBRztBQUFBLElBQ25GO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFRVSxtQ0FBbUMsaUJBQXVCO0FBQ2xFLFVBQUksQ0FBQyxLQUFLLDRDQUE0QyxDQUFDLEtBQUssZUFBZTtBQUN6RSxhQUFLLDJDQUEyQztBQUNoRCxhQUFLLHlCQUNILG9CQUFvQixJQUNoQixLQUFLLDJCQUEyQixFQUFFLElBQ2xDLEtBQUssMkJBQTJCLGVBQWU7QUFDckQsYUFBSyxzQkFBQTtBQUFBLE1BQ1A7QUFBQSxJQUNGO0FBQUE7QUFBQSxJQUdVLDRCQUF5QjtBQUVqQyxXQUFLLG9CQUFvQjtBQUFBLElBQzNCO0FBQUE7QUFBQSxJQUdVLDhCQUNSLE9BQ0EseUJBQStCO0FBRS9CLFlBQU0sYUFBYSxNQUFNO0FBRXpCLFVBQUksZUFBZSxLQUFLLHlCQUF5QixLQUFLO0FBQ3BELGFBQUssd0JBQXdCLE9BQU8sY0FBYyx1QkFBdUI7QUFDekU7QUFBQSxNQUNGO0FBR0EsVUFBSSw0QkFBNEIsS0FBSyxHQUFHO0FBQ3RDLGFBQUssNEJBQTRCLEtBQUs7QUFBQSxNQUN4QztBQUFBLElBQ0Y7QUFBQTtBQUFBLElBR1Esd0JBQ04sT0FDQSxXQUNBLGNBQXFCO0FBRXJCLFlBQU0sYUFBYSxNQUFNO0FBQ3pCLFlBQU0sa0JBQWtCLE1BQU07QUFFOUIsVUFBSSxlQUFlLEtBQUsseUJBQXlCLEtBQUs7QUFHcEQsWUFBSSxhQUFhLGNBQWM7QUFDN0IsY0FBSSxnQkFBZ0IsS0FBSyx3QkFBd0I7QUFDL0MsZ0JBQ0UsQ0FBQyxLQUFLLHFCQUNOLENBQUMsbUJBQ0QsS0FBSyxhQUFhLFlBQVksRUFBRSxnQkFDaEMsS0FBSyxxQkFBcUIsSUFDMUI7QUFDQSxtQkFBSyxvQkFBb0I7QUFBQSxZQUMzQixXQUFXLG1CQUFtQixLQUFLLG1CQUFtQjtBQUVwRCxtQkFBSyxvQkFBb0I7QUFDekIsbUJBQUssa0JBQWtCLEtBQUssaUJBQWlCO0FBQUEsWUFDL0M7QUFBQSxVQUNGLE9BQU87QUFDTCxpQkFBSyxvQkFBb0I7QUFBQSxVQUMzQjtBQUVBLGVBQUssa0NBQWtDLFlBQWE7QUFBQSxRQUN0RCxXQUVTLGFBQWEsV0FBVztBQUMvQixnQkFBTSxlQUFBO0FBQ04sY0FBSSxpQkFBaUI7QUFDbkIsaUJBQUssbUNBQW1DLFVBQVU7QUFBQSxVQUNwRCxPQUFPO0FBQ0wsaUJBQUssbUNBQW1DLFVBQVU7QUFBQSxVQUNwRDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNVSw0QkFBNEIsT0FBb0I7QUFDeEQsWUFBTSxhQUFhLE1BQU07QUFDekIsV0FBSyxpQ0FBaUM7QUFJdEMsVUFDRSxDQUFDLEtBQUssa0NBQ0osTUFBTSxZQUFZLGVBQWUsS0FBSyx5QkFBeUIsT0FDL0QsZUFBZSxLQUFLLHlCQUF5QixNQUMvQztBQUNBLGFBQUssZ0NBQWdDO0FBQUEsTUFDdkM7QUFJQSxVQUFJLGNBQWMsS0FBSyx5QkFBeUIsS0FBSztBQUNuRCxhQUFLLHdCQUF3QixPQUFPLFNBQVM7QUFDN0M7QUFBQSxNQUNGO0FBR0EsVUFBSSxLQUFLLDJCQUEyQixNQUFNLDRCQUE0QixLQUFLLEdBQUc7QUFDNUUsY0FBTSxlQUFBO0FBRU4sZ0JBQVEsWUFBQTtBQUFBLFVBQ04sS0FBSyxLQUFLLHlCQUF5QjtBQUNqQztBQUNFLG9CQUFNLHdCQUFnQyxLQUFLLGdCQUN2QyxLQUFLLHlCQUF5QixZQUM5QjtBQUNKLG1CQUFLLDJCQUEyQixxQkFBcUI7QUFBQSxZQUN2RDtBQUNBO0FBQUEsVUFDRixLQUFLLEtBQUsseUJBQXlCO0FBQ2pDO0FBQ0Usb0JBQU0seUJBQWlDLEtBQUssZ0JBQ3hDLEtBQUsseUJBQXlCLFVBQzlCO0FBQ0osbUJBQUssMkJBQTJCLHNCQUFzQjtBQUFBLFlBQ3hEO0FBQ0E7QUFBQSxVQUNGLEtBQUssS0FBSyx5QkFBeUI7QUFDakM7QUFDRSxvQkFBTSxzQkFBOEIsS0FBSyxnQkFDckMsS0FBSyx5QkFBeUIsWUFDOUI7QUFDSixtQkFBSywyQkFBMkIsbUJBQW1CO0FBQUEsWUFDckQ7QUFDQTtBQUFBLFVBQ0YsS0FBSyxLQUFLLHlCQUF5QjtBQUNqQztBQUNFLG9CQUFNLHdCQUFnQyxLQUFLLGdCQUN2QyxLQUFLLHlCQUF5QixhQUM5QjtBQUNKLG1CQUFLLDJCQUEyQixxQkFBcUI7QUFBQSxZQUN2RDtBQUNBO0FBQUEsUUFFQTtBQUFBLE1BRU47QUFBQSxJQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU1VLHdCQUFxQjtBQUU3QixVQUFJLENBQUMsS0FBSztBQUFpQjtBQUczQixVQUFJLEtBQUssbUNBQW1DO0FBQzFDLGFBQUssb0NBQW9DO0FBQ3pDO0FBQUEsTUFDRjtBQUdBLFVBQ0UsS0FBSyxhQUFhLEtBQUssc0JBQXNCLEtBQzdDLEtBQUssYUFBYSxLQUFLLHNCQUFzQixFQUFFLGNBQy9DO0FBQ0EsYUFBSyw2QkFBQTtBQUNMO0FBQUEsTUFDRjtBQUlBLFVBQUksS0FBSyx3QkFBd0IsS0FBSyxpQkFBaUI7QUFDckQsY0FBTSxlQUFlLEtBQUssK0JBQUE7QUFFMUIsWUFBSSxjQUFjO0FBQ2hCLGVBQUssb0JBQUE7QUFDTCxlQUFLLGtCQUFrQixZQUFZO0FBQ25DLGVBQUssb0JBQW9CO0FBQUEsUUFDM0IsT0FBTztBQUVMLGVBQUssNkJBQUE7QUFBQSxRQUNQO0FBQUEsTUFDRixPQUdLO0FBQ0gsYUFBSyxvQkFBQTtBQUVMLGFBQUssdUJBQXVCO0FBQzVCLGFBQUssNkJBQUE7QUFBQSxNQUNQO0FBQUEsSUFDRjtBQUFBLElBRVUseUJBQXlCLHVCQUE2QjtBQUM5RCxVQUNFLEtBQUssbUJBQW1CLHFCQUFxQixLQUM3QywwQkFBMEIsS0FBSyx3QkFDL0I7QUFDQSxhQUFLLG9CQUFvQjtBQUN6QixhQUFLLGtCQUFrQjtBQUN2QixhQUFLLHVCQUF1QjtBQUM1QixhQUFLLHlCQUF5QjtBQUM5QixhQUFLLHdCQUF3QixLQUFLLDJCQUFBO0FBQ2xDLGFBQUssZ0NBQUE7QUFFTCxjQUFNLG9CQUFvQixLQUFLLHlCQUFBO0FBQy9CLGNBQU0saUNBQ0osS0FBSyx1QkFBdUIsTUFBTSxLQUFLLHlCQUF5QjtBQUdsRSxZQUFJLGtDQUFrQyxLQUFLLGdDQUFnQztBQUN6RSxlQUFLLHNCQUFzQixLQUFLLGdCQUFnQjtBQUNoRCxlQUFLLGdCQUFnQixTQUFTO0FBQUEsWUFDNUIsS0FBSyxLQUFLLGdCQUFnQixvQkFBb0I7QUFBQSxZQUM5QyxNQUFNLEtBQUssZ0JBQWdCLElBQUk7QUFBQSxZQUMvQixVQUFVO0FBQUEsVUFBQSxDQUNYO0FBQUEsUUFDSCxPQUFPO0FBQ0wsZUFBSywyQkFBQTtBQUFBLFFBQ1A7QUFHQSxhQUFLLGtDQUFrQyxxQkFBcUI7QUFBQSxNQUM5RDtBQUFBLElBQ0Y7QUFBQSxJQUVVLGtCQUFrQixPQUFtQjtBQUM3QyxXQUFLLG9CQUFBO0FBQ0wsVUFBSSxPQUFPO0FBQ1QsYUFBSyxvQkFBb0I7QUFDekIsYUFBSywrQkFBK0IsS0FBSztBQUV6QyxjQUFNLHVCQUF1QixLQUFLLHFCQUFBO0FBQ2xDLFlBQUksc0JBQXNCO0FBQ3hCLCtCQUFxQixhQUFhLFlBQVksT0FBTztBQUdyRCxnQkFBTSx3QkFBd0IsV0FBVyxNQUFLO0FBQzVDLGtCQUFNLFVBQVUsS0FBSyxrQkFDbkIsS0FBSyx1QkFDTCxLQUFLLHdCQUNMLE1BQU0sTUFBTTtBQUVkLGlCQUFLLGdDQUFnQyxPQUFPO0FBQzVDLHlCQUFhLHFCQUFxQjtBQUFBLFVBQ3BDLEdBQUcsQ0FBQztBQUFBLFFBQ047QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBRVUsc0JBQW1CO0FBQzNCLFlBQU0sdUJBQXVCLEtBQUsscUJBQUE7QUFDbEMsVUFBSSxzQkFBc0I7QUFDeEIsNkJBQXFCLGFBQWEsWUFBWSxTQUFTO0FBQ3ZELGFBQUssK0JBQStCLElBQUk7QUFDeEMsYUFBSyxvQkFBb0I7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFBQSxJQUVVLHVCQUNSLGtCQUNBLGdCQUNBLGdCQUNBLGlCQUF5QjtBQUV6QixVQUFJLGtCQUFrQixDQUFDLGdCQUFnQjtBQUdyQyx5QkFBaUIsS0FBSyxLQUFLLG9CQUFvQjtBQUFBLE1BQ2pEO0FBRUEsVUFBSSxpQkFBaUI7QUFHbkIseUJBQWlCLEtBQUssS0FBSztBQUFBLE1BQzdCO0FBRUEsYUFBTztBQUFBLFFBQ0wsR0FBRyxLQUFLLGVBQWUsaUJBQWlCO0FBQUEsUUFDeEMsR0FBRyxLQUFLLGVBQWUsaUJBQWlCO0FBQUEsTUFBQTtBQUFBLElBRTVDO0FBQUEsSUFFVSxzQkFDUixpQkFDQSxrQkFDQSxnQkFDQSxnQkFBd0I7QUFFeEIsVUFBSSxrQkFBa0Isa0JBQWtCO0FBQ3RDLGNBQU0sZUFBZSxpQkFDakIsZUFBZSxJQUNmLGVBQWUsSUFBSSxLQUFLO0FBRTVCLFlBQUksZ0JBQWdCLE1BQU0sR0FBRztBQUMzQiwwQkFBZ0IsS0FBSyxLQUFLO0FBQUEsUUFDNUIsV0FBVyxnQkFBZ0IsSUFBSSxpQkFBaUIsTUFBTSxjQUFjO0FBQ2xFLDBCQUFnQixLQUFLLEtBQUs7QUFBQSxRQUM1QjtBQUFBLE1BQ0Y7QUFFQSxhQUFPO0FBQUEsUUFDTCxHQUFHLEtBQUssZUFBZSxnQkFBZ0I7QUFBQSxRQUN2QyxHQUFHLEtBQUssZUFBZSxnQkFBZ0I7QUFBQSxRQUN2QyxHQUFHLGdCQUFnQjtBQUFBLE1BQUE7QUFBQSxJQUV2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBUVUsMEJBQ1IsYUFDQSxnQkFBZ0M7QUFFaEMsYUFDRSxZQUFZLFNBQVMsTUFBTSxLQUMzQixZQUFZLFNBQVMsSUFBSSxZQUFZLFVBQVUsTUFBTSxlQUFlO0FBQUEsSUFFeEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFVLG1DQUNSLFFBQTJCO0FBRTNCLFlBQU0sY0FBdUMsRUFBRSxPQUFPLEdBQUcsVUFBVSxFQUFBO0FBQ25FLFlBQU0sYUFBYSxRQUFRLE9BQU8sQ0FBQ0MsY0FBYSxjQUFvQjtBQUNsRSxZQUFJLFVBQVUsVUFBVSxRQUFRO0FBQzlCLGlCQUFPQTtBQUFBQSxRQUNUO0FBRUEsWUFBSSxVQUFVLFNBQVMsUUFBUTtBQUM3QkEsdUJBQVk7QUFBQSxRQUNkLE9BQU87QUFDTEEsdUJBQVk7QUFBQSxRQUNkO0FBQ0EsZUFBT0E7QUFBQUEsTUFDVCxHQUFHLFdBQVc7QUFDZCxhQUFPLGFBQWEsYUFBYTtBQUFBLElBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU1RLGlDQUE4QjtBQUNwQyxZQUFNLHVCQUF1QixLQUFLLGtCQUM5QixLQUFLLHlCQUNMLEtBQUssc0NBQUE7QUFNVCxVQUFJLEtBQUssZ0NBQWdDO0FBRXZDLGNBQU0sbUJBQ0osS0FBSyxJQUFJLEtBQUssc0JBQXNCLEtBQUssZ0JBQWdCLFVBQVUsSUFDbkUsS0FBSyxlQUFlO0FBQ3RCLFlBQUksa0JBQWtCO0FBQ3BCLGVBQUsscUJBQXFCO0FBQUEsUUFDNUI7QUFFQSxhQUFLLGlDQUFpQztBQUN0QztBQUFBLE1BQ0Y7QUFFQSxXQUFLLHNCQUFzQixLQUFLLGdCQUFnQjtBQUdoRCxXQUFLLG9CQUFvQjtBQUl6QixVQUFJLEtBQUssMkJBQTJCLElBQUk7QUFDdEMsYUFBSyx5QkFBeUI7QUFBQSxNQUNoQztBQUVBLFVBQUksS0FBSyxnQ0FBZ0M7QUFDdkMsYUFBSyx5QkFBeUI7QUFBQSxNQUNoQyxPQUFPO0FBQ0wsYUFBSyx5QkFDSCx1QkFBdUIsS0FBSyx5QkFDeEIsS0FBSyx5QkFDTDtBQUFBLE1BQ1I7QUFFQSxVQUFJLENBQUMsS0FBSyxpQkFBaUI7QUFFekIsYUFBSyxrQ0FBa0Msb0JBQW9CO0FBQUEsTUFDN0Q7QUFDQSxXQUFLLGlDQUFpQztBQUN0QyxXQUFLLDJCQUFBO0FBRUwsVUFBSSxDQUFDLEtBQUssZUFBZTtBQUN2QixhQUFLLHNCQUFBO0FBQ0wsYUFBSyxrQkFBa0I7QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPUSxrQ0FBa0MsdUJBQTZCO0FBRXJFLGlCQUFXLE1BQUs7QUFDZCxZQUFJLEtBQUssaUJBQWlCLEtBQUssc0JBQXNCO0FBQ25ELGdCQUFNLDZCQUE2QixLQUFLLDBCQUEwQjtBQUNsRSxnQkFBTSxzQkFBc0Isd0JBQXdCLEtBQUs7QUFDekQsZ0JBQU0sZ0JBQ0osc0JBQXNCLDZCQUE2QixLQUFLO0FBQzFELGVBQUsscUJBQXFCLFNBQVM7QUFBQSxZQUNqQyxLQUFLLEtBQUssZ0JBQWdCLGdCQUFnQjtBQUFBLFlBQzFDLE1BQU0sS0FBSyxnQkFBZ0IsSUFBSTtBQUFBLFlBQy9CLFVBQVU7QUFBQSxVQUFBLENBQ1g7QUFBQSxRQUNIO0FBQUEsTUFDRixHQUFHLEVBQUU7QUFBQSxJQUNQO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLUSxrQ0FBK0I7QUFDckMsV0FBSyxzQkFDSCxLQUFLLHlCQUF5QixLQUFLLHFCQUMvQixnQkFBZ0IsUUFDaEIsZ0JBQWdCO0FBQUEsSUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFRLDJCQUF3QjtBQUM5QixZQUFNLG9CQUFvQixLQUFLLGdDQUFnQyxLQUFLLHNCQUFzQjtBQUMxRixZQUFNLHdDQUNKLEtBQUssd0JBQ0wsS0FBSyx3QkFBd0IsZ0JBQWdCLFFBQzdDLGtCQUFrQixRQUFRLEtBQUs7QUFFakMsYUFBTyx3Q0FDSCxrQkFBa0IsTUFBTSxLQUFLLHdCQUM3QixrQkFBa0I7QUFBQSxJQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS1EsK0JBQTRCO0FBRWxDLFVBQUksS0FBSyx3QkFBd0IsS0FBSywrQkFBK0I7QUFDbkUsYUFBSyx1QkFBdUI7QUFDNUIsY0FBTSwyQkFBMkIsS0FBSyxZQUFZLGNBQ2hELDJCQUEyQixLQUFLLHNCQUFzQjtBQUV4RCxZQUFJLDBCQUEwQjtBQUM1QixtQ0FBeUIsTUFBQTtBQUFBLFFBQzNCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEsK0JBQTRCO0FBQ2xDLFlBQU0saUJBQWlCLEtBQUssZ0JBQ3hCLEtBQUssZ0JBQWdCLFlBQ3JCLEtBQUssZ0JBQWdCO0FBQ3pCLFlBQU0seUJBQXlCLEtBQUssZ0JBQ2hDLEtBQUssZ0JBQWdCLHNCQUFBLEVBQXdCLFNBQzdDLEtBQUssZ0JBQWdCLHNCQUFBLEVBQXdCO0FBQ2pELFlBQU0scUJBQXFCLEtBQUsscUJBQXFCO0FBQ3JELFlBQU0sbUJBQW1CLEtBQUssZ0NBQWdDLEtBQUssc0JBQXNCO0FBQ3pGLFlBQU0sZ0NBQ0osbUJBQW1CLEtBQUssZ0NBQWdDLEtBQUssc0JBQXNCLEVBQUU7QUFFdkYsY0FDRyxpQkFBaUIsc0JBQXNCLGlCQUFpQixpQkFBaUIsVUFDMUUsQ0FBQztBQUFBLElBRUw7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEsd0NBQXFDO0FBQzNDLFlBQU0sWUFBWSxLQUFLLGdCQUNuQixLQUFLLGdCQUFnQixZQUNyQixLQUFLLGdCQUFnQjtBQUN6QixZQUFNLGdCQUFnQixZQUFZLEtBQUssd0JBQXdCO0FBQy9ELGFBQU8sS0FBSyxnQ0FBZ0MsVUFDMUMsQ0FBQyxpQkFBaUIsaUJBQWlCLGFBQWEsU0FBUyxpQkFBaUIsYUFBYSxHQUFHO0FBQUEsSUFFOUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEsZ0NBQTZCO0FBQ25DLFVBQUksYUFBMkI7QUFDL0IsWUFBTSxRQUNKLEtBQUssaUJBQWlCLEtBQUsscUJBQXFCLEVBQUUsV0FBVyxLQUFLLHNCQUFzQjtBQUMxRixZQUFNLGNBQ0osVUFBVSxLQUFLLHdCQUF3QixNQUFNLEtBQUsseUJBQXlCO0FBQzdFLFlBQU0sY0FDSixLQUFLLFlBQ0QsY0FBb0MsTUFBTSxXQUFXLEdBQ3JELGNBQXFELG9DQUFvQyxHQUN6RixhQUFhLE1BQU0sS0FBSztBQUU5QixVQUFJLFNBQVMsYUFBYTtBQUN4QixxQkFBYSxNQUFNLFFBQVEsS0FBSyxDQUFDLFVBQVUsTUFBTSxXQUFXLFdBQVcsS0FBSztBQUFBLE1BQzlFO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLDBDQUNOLFlBQ0EsT0FBZ0I7QUFFaEIsVUFDRSxDQUFDLEtBQUsscUJBQ04sZUFBZSxLQUFLLHlCQUF5QixjQUM3QyxlQUFlLEtBQUsseUJBQXlCO0FBRTdDLGVBQU87QUFHVCxVQUNFLGVBQWUsS0FBSyx5QkFBeUIsYUFDN0MsS0FBSyxrQkFBa0IsU0FBUyxJQUFJLE1BQU0sTUFBTSxVQUFVLEtBQzFELENBQUMsQ0FBQyxLQUFLLGlCQUFpQixLQUFLLHdCQUF3QixDQUFDLEdBQ3REO0FBQ0EsZUFBTyxLQUFLLHdCQUF3QjtBQUFBLE1BQ3RDLFdBR0UsZUFBZSxLQUFLLHlCQUF5QixXQUM3QyxLQUFLLGtCQUFrQixTQUFTLE1BQU0sS0FDdEMsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLENBQUMsR0FDdEQ7QUFDQSxlQUFPLEtBQUssd0JBQXdCO0FBQUEsTUFDdEM7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBT1EsK0JBQStCLFlBQW1CO0FBQ3hELFlBQU0sUUFDSixLQUFLLGlCQUFpQixLQUFLLHFCQUFxQixFQUFFLFdBQVcsS0FBSyxzQkFBc0I7QUFDMUYsVUFBSSxlQUFlO0FBQ25CLFVBQUksY0FBYyxNQUFNO0FBQ3hCLFVBQUkseUJBQXlCO0FBRTdCLFVBQUksYUFBYTtBQUVmLFlBQUksQ0FBQyxLQUFLLDRCQUE0QjtBQUNwQyxpQkFBTyxLQUFLLDhCQUFBO0FBQUEsUUFDZCxPQUFPO0FBQ0wsY0FBSSxLQUFLLG1CQUFtQjtBQUMxQixrQkFBTSw0QkFBNEIsRUFBRSxHQUFHLEtBQUssa0JBQWtCLFNBQUE7QUFFOUQsZ0JBQUksWUFBWTtBQUdkLHVDQUF5QixLQUFLLDBDQUM1QixZQUNBLEtBQUs7QUFFUCxrQkFBSSwyQkFBMkIsTUFBTTtBQUVuQyw4QkFDRSxLQUFLLGlCQUFpQixzQkFBc0IsRUFBRSxXQUM1QyxLQUFLLHNCQUFzQixFQUMzQixVQUFVLENBQUE7QUFFZCwwQ0FBMEIsSUFDeEIseUJBQXlCLEtBQUssd0JBQXdCLE1BQU0sVUFBVSxJQUFJO0FBQUEsY0FDOUU7QUFBQSxZQUNGO0FBRUEsdUJBQVcsU0FBUyxhQUFhO0FBRS9CLGtCQUFJLENBQUMsWUFBWTtBQUVmLG9CQUNFLEtBQUssd0JBQXdCLGdCQUFnQixTQUM3QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsTUFDOUMsQ0FBQyxnQkFBZ0IsTUFBTSxTQUFTLElBQUksYUFBYSxTQUFTLElBQzNEO0FBQ0EsaUNBQWU7QUFBQSxnQkFDakIsV0FHRSxLQUFLLHdCQUF3QixnQkFBZ0IsUUFDN0MsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLE1BQzlDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxJQUMzRDtBQUNBLGlDQUFlO0FBQUEsZ0JBQ2pCO0FBQUEsY0FDRixPQUFPO0FBQ0wsb0JBQUksTUFBTSxXQUFXLEtBQUssbUJBQW1CLFFBQVE7QUFFbkQsc0JBQ0UsZUFBZSxLQUFLLHlCQUF5QixlQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxJQUMzRDtBQUNBLG1DQUFlO0FBQUEsa0JBQ2pCLFdBR0UsZUFBZSxLQUFLLHlCQUF5QixjQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxJQUMzRDtBQUNBLG1DQUFlO0FBQUEsa0JBQ2pCLFdBR0UsZUFBZSxLQUFLLHlCQUF5QixjQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxJQUMzRDtBQUNBLG1DQUFlO0FBQUEsa0JBQ2pCLFdBR0UsZUFBZSxLQUFLLHlCQUF5QixZQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxJQUMzRDtBQUNBLG1DQUFlO0FBQUEsa0JBQ2pCO0FBQUEsZ0JBQ0Y7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUlBLGdCQUFJLDJCQUEyQixRQUFRLGNBQWM7QUFDbkQsbUJBQUssd0JBQXdCO0FBQUEsWUFDL0I7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7QUFBQSxJQUlRLG1DQUFtQyxjQUFvQjtBQUM3RCxZQUFNLGlCQUNKLEtBQUssc0JBQXNCLEtBQ3ZCLEtBQUssMkJBQTJCLEtBQzlCLElBQ0EsS0FBSyx5QkFDUCxLQUFLO0FBR1gsWUFBTSxvQkFDSixpQkFBaUIsYUFDYixLQUFLLDJCQUEyQixjQUFjLElBQzlDLEtBQUssMkJBQTJCLGNBQWM7QUFFcEQsVUFBSSxLQUFLLGVBQWU7QUFDdEIsY0FBTSx1QkFBdUIsS0FBSyxxQkFBQTtBQUNsQyxjQUFNLHVCQUF1Qix1QkFDekIscUJBQXFCLGFBQWEsVUFBVSxNQUFNLFVBQ2xEO0FBSUosWUFBSSxpQkFBaUIsY0FBYyxLQUFLLHVCQUF1QixnQkFBZ0I7QUFFN0UsY0FBSSx3QkFBd0IsS0FBSyxzQkFBc0IsTUFBTTtBQUMzRCxpQkFBSyxvQkFBb0I7QUFDekIsaUJBQUssb0JBQUE7QUFDTDtBQUFBLFVBQ0YsV0FFUyxrQkFBa0IsR0FBRztBQUM1QixpQkFBSyxvQkFBQTtBQUNMLGlCQUFLLG9CQUFvQjtBQUN6QixpQkFBSyxvQkFBb0I7QUFDekIsa0JBQU0sbUJBQW1CLEtBQUssWUFBWSxlQUN4QyxtREFBbUQ7QUFFckQsNkJBQWlCLE1BQUE7QUFBQSxVQUNuQixPQUFPO0FBQ0wsaUJBQUssb0JBQW9CO0FBQUEsVUFDM0I7QUFBQSxRQUNGLFdBRVMsc0JBQXNCLEtBQUssd0JBQXdCO0FBQzFELGVBQUssb0JBQW9CO0FBQUEsUUFDM0IsV0FFUyxpQkFBaUIsY0FBYyxzQkFBc0IsS0FBSyxhQUFhLFNBQVMsR0FBRztBQUMxRixlQUFLLG9CQUFBO0FBQ0wsZUFBSyxvQkFBb0I7QUFDekIsZ0JBQU0sb0JBQW9CLEtBQUssWUFBWSxlQUN6QyxvREFBb0Q7QUFFdEQsNEJBQWtCLE1BQUE7QUFBQSxRQUNwQixPQUFPO0FBQ0wsZUFBSyxvQkFBb0I7QUFDekIsZUFBSyxxQkFBcUI7QUFFMUIsY0FBSSxzQkFBc0I7QUFDeEIsaUJBQUssa0JBQWtCLEtBQUssaUJBQWlCO0FBQUEsVUFDL0MsT0FFSztBQUNILGlCQUFLLHVCQUF1QjtBQUM1QixpQkFBSyw2QkFBQTtBQUFBLFVBQ1A7QUFBQSxRQUNGO0FBR0EsYUFBSyxrQ0FBa0MsaUJBQWlCO0FBQUEsTUFDMUQsT0FFSztBQUNILGFBQUsseUJBQXlCLGlCQUFpQjtBQUFBLE1BQ2pEO0FBQUEsSUFDRjtBQUFBLElBRVEsMkJBQTJCLFlBQWtCO0FBQ25ELFdBQUssdUJBQXVCO0FBRTVCLFVBQUksS0FBSyxzQkFBc0IsSUFBSTtBQUNqQyxhQUFLLG9CQUFvQjtBQUFBLE1BQzNCO0FBRUEsVUFBSSxDQUFDLEtBQUssbUJBQW1CO0FBQzNCLGNBQU0sbUJBQW1CLEtBQUssK0JBQStCLFVBQVU7QUFFdkUsWUFBSSxrQkFBa0I7QUFDcEIsZUFBSyxrQkFBa0IsZ0JBQWdCO0FBQUEsUUFDekMsT0FFSztBQUNILGNBQ0UsZUFBZSxLQUFLLHlCQUF5QixjQUM3QyxlQUFlLEtBQUsseUJBQXlCLGFBQzVDLEtBQUssa0JBQ0gsZUFBZSxLQUFLLHlCQUF5QixXQUM1QyxlQUFlLEtBQUsseUJBQXlCLFlBQ2pEO0FBRUEsa0JBQU0sd0JBQ0osZUFBZSxLQUFLLHlCQUF5QixhQUN6QyxLQUFLLDJCQUFBLElBQ0wsS0FBSywyQkFBQTtBQUVYLGlCQUFLLHlCQUF5QixxQkFBcUI7QUFBQSxVQUNyRDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBRVUsMkJBQTJCLGNBQXFCO0FBQ3hELFlBQU0sYUFBYSxnQkFBZ0IsS0FBSztBQUN4QyxhQUFPLGFBQWEsS0FBSyxpQkFBaUIsS0FBSyxxQkFBcUIsRUFBRSxXQUFXLFNBQVMsSUFDdEYsYUFBYSxJQUNiO0FBQUEsSUFDTjtBQUFBLElBRVUsMkJBQTJCLGNBQXFCO0FBQ3hELFlBQU0sYUFBYSxnQkFBZ0IsS0FBSztBQUN4QyxhQUFPLGFBQWEsSUFBSSxhQUFhLElBQUk7QUFBQSxJQUMzQztBQUFBLElBRVUsb0NBQW9DLGdCQUE4QjtBQUMxRSxZQUFNLGdCQUFnQixlQUFlLGNBQWMsU0FBUyxVQUFVO0FBQ3RFLFlBQU0sa0JBQ0osZUFBZSxjQUFjLFNBQVMsS0FBSyxzQkFBc0IsS0FBSztBQUN4RSxZQUFNLHFCQUFxQixLQUFLLDhCQUE4QixhQUFhO0FBRTNFLFdBQUssOEJBQThCLGFBQWEsSUFBSSxLQUFLLHFDQUN2RCxvQkFDQSxpQkFDQSxjQUFjO0FBTWhCLFdBQUssY0FDSCxJQUFJLFlBQTJDLGtCQUFrQjtBQUFBLFFBQy9ELFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFFBQVEsS0FBSztBQUFBLE1BQUEsQ0FDZCxDQUFDO0FBQUEsSUFFTjtBQUFBLElBRVEscUNBQ04sK0JBQ0EsaUJBQ0EsZ0JBQThCO0FBRzlCLFVBQUksZUFBZSxVQUFVLFlBQVk7QUFDdkMsY0FBTSx5QkFBeUIsS0FBSyx1QkFBdUIsZUFBZSxFQUFFO0FBQzVFLGNBQU0sMkJBQTJCLEtBQUssa0NBQ3BDLGdCQUNBLHNCQUFzQjtBQUV4QixZQUFJLDBCQUEwQjtBQUM1Qix3Q0FBOEIsS0FBSyx3QkFBd0I7QUFBQSxRQUM3RDtBQUFBLE1BQ0YsT0FFSztBQUNILHdDQUFnQyw4QkFBOEIsT0FDNUQsQ0FBQyxtQkFBbUIsZUFBZSxPQUFPLGVBQWUsRUFBRTtBQUFBLE1BRS9EO0FBRUEsVUFBSSxrQkFBa0IsTUFBTSw4QkFBOEIsU0FBUyxpQkFBaUI7QUFDbEYsY0FBTSwwQkFBMEIsa0JBQWtCLElBQUksaUJBQWlCO0FBRXZFLHdDQUFnQyxLQUFLLHlCQUNuQywrQkFDQSx1QkFBdUI7QUFBQSxNQUUzQjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFVSxrQ0FBa0MsZ0JBQThCO0FBQ3hFLFlBQU0saUJBQWlCLEtBQUssdUJBQXVCLGVBQWUsRUFBRTtBQUNwRSxZQUFNLGFBQWEsZUFBZTtBQUVsQyxVQUFJLG1CQUFtQjtBQUFNO0FBRTdCLFlBQU0sUUFBUSxLQUFLLGlCQUFpQixjQUFjLEVBQUUsV0FBVyxVQUFVLEVBQUUsUUFBUSxLQUNqRixDQUFDQyxXQUFVQSxPQUFNLFVBQVUsZUFBZSxNQUFNO0FBR2xELFVBQUksQ0FBQztBQUFPO0FBRVosV0FBSyx3QkFBd0I7QUFDN0IsV0FBSyx5QkFBeUI7QUFDOUIsV0FBSyxvQkFBb0I7QUFFekIsVUFBSSxLQUFLLDJCQUEyQixLQUFLLG9CQUFvQjtBQUMzRCxhQUFLLDJCQUFBO0FBQUEsTUFDUDtBQUVBLFdBQUssK0JBQStCLEtBQUs7QUFHekMsWUFBTSx3QkFBd0IsV0FBVyxNQUFLO0FBQzVDLGFBQUssZ0NBQWdDLGVBQWUsRUFBRTtBQUN0RCxxQkFBYSxxQkFBcUI7QUFBQSxNQUNwQyxHQUFHLENBQUM7QUFBQSxJQUNOO0FBQUEsSUFFVSw2QkFBMEI7QUFFbEMsVUFBSSxLQUFLLDBCQUEwQixLQUFLO0FBQW9CO0FBRzVELFVBQUksS0FBSyxxQkFBcUIsSUFBSTtBQUNoQyxhQUFLLG9CQUFvQixLQUFLO0FBQUEsTUFDaEM7QUFDQSxXQUFLLHFCQUFxQixLQUFLO0FBRS9CLFlBQU0saUJBQWlCLEtBQUssaUNBQWlDLEtBQUssa0JBQWtCO0FBQ3BGLFVBQUksZ0JBQWdCO0FBS2xCLGFBQUssY0FDSCxJQUFJLFlBQTBDLGlCQUFpQjtBQUFBLFVBQzdELFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxRQUFBLENBQ1QsQ0FBQztBQUFBLE1BRU47QUFBQSxJQUNGO0FBQUEsSUFFVSxrQkFDUixnQkFDQSxZQUNBLGFBQW1CO0FBRW5CLGFBQ0Usb0NBQW9DLGlCQUFpQixNQUFNLGFBQWEsTUFBTTtBQUFBLElBRWxGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBVVEsNkJBQTBCO0FBRWhDLFlBQU0sMEJBQTBCLE1BQU0sS0FBSyxpQkFBaUIsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBRTlFLFlBQU0sWUFBWSxLQUFLLGlCQUFpQixLQUFLLGlCQUFpQixTQUFTLENBQUM7QUFFeEUsZ0JBQVUsV0FBVyxRQUFRLENBQUMsbUJBQTZCO0FBQ3pELGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssaUJBQWlCLFNBQVMsR0FBRyxLQUFLO0FBQ3pELGdCQUFNLGdCQUFnQixLQUFLLGlCQUFpQixDQUFDLEVBQUUsV0FBVyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3BGLGNBQUksZUFBZSxNQUFNLGVBQWUsSUFBSTtBQUUxQyxrQkFBTSxtQkFBbUI7QUFBQSxjQUN2QixHQUFHO0FBQUEsY0FDSCxRQUFRO0FBQUEsY0FDUixhQUFhO0FBQUEsY0FDYixpQkFBaUI7QUFBQSxjQUNqQixpQkFBaUI7QUFBQSxjQUNqQixhQUFhLENBQUE7QUFBQSxZQUFBO0FBRWYsaUJBQUssaUJBQWlCLENBQUMsRUFBRSxXQUFXLE9BQ2xDLHdCQUF3QixDQUFDLEdBQ3pCLEdBQ0EsZ0JBQWdCO0FBQUEsVUFFcEI7QUFFQSxrQ0FBd0IsQ0FBQztBQUFBLFFBQzNCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNUSxxQ0FBa0M7QUFFeEMsV0FBSyw4QkFBOEIsUUFBUSxDQUFBO0FBQzNDLFdBQUssOEJBQThCLFdBQVcsQ0FBQTtBQUU5QyxXQUFLLGtCQUFrQixRQUFRLENBQUMsaUJBQWtDLG1CQUNoRSxnQkFBZ0IsV0FBVyxJQUFJLENBQUMsT0FBa0IsZUFBc0I7QUFDdEUsY0FBTSxRQUNGLE9BQU8sQ0FBQyxVQUFVLE1BQU0sVUFBVSxVQUFVLEdBQzVDLFFBQVEsQ0FBQyxVQUFTO0FBQ2xCLGdCQUFNLFVBQVUsS0FBSyxrQkFBa0IsZ0JBQWdCLFlBQVksTUFBTSxNQUFNO0FBQy9FLGdCQUFNLDRCQUE0Qyw4QkFDaEQsT0FDQSxTQUNBLGdCQUFnQixnQkFDaEIsVUFBVTtBQUdaLGdCQUFNLGdDQUNKLEtBQUssa0NBQWtDLDJCQUEyQixjQUFjO0FBRWxGLGNBQUksK0JBQStCO0FBQ2pDLGdCQUFJLDhCQUE4QixjQUFjLFFBQVE7QUFDdEQsbUJBQUssOEJBQThCLE1BQU0sS0FBSyw2QkFBNkI7QUFBQSxZQUM3RSxPQUFPO0FBQ0wsbUJBQUssOEJBQThCLFNBQVMsS0FBSyw2QkFBNkI7QUFBQSxZQUNoRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNMLENBQUMsQ0FBQztBQUFBLElBRU47QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNUSx5QkFDTiw0QkFDQSxtQkFBa0M7QUFHbEMsaUJBQVcsa0JBQWtCLDRCQUE0QjtBQUN2RCxZQUFJLENBQUMscUJBQXFCLGtCQUFrQixPQUFPLGVBQWUsSUFBSTtBQUNwRSxnQkFBTSxlQUFlLEtBQUssWUFBWSxlQUFlLGVBQWUsRUFBRTtBQUN0RSxjQUFJLGNBQWM7QUFDaEIseUJBQWEsYUFBYSxTQUFTLE1BQU07QUFBQSxVQUMzQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxtQkFBbUI7QUFDckIscUNBQTZCLDJCQUEyQixPQUN0RCxDQUFDLG1CQUFtQixlQUFlLE9BQU8sa0JBQWtCLEVBQUU7QUFBQSxNQUVsRSxPQUFPO0FBQ0wscUNBQTZCLENBQUE7QUFBQSxNQUMvQjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFUSxrQ0FDTixtQkFDQSxnQkFBNkI7QUFFN0IsVUFBSSxtQkFBbUI7QUFBTSxlQUFPO0FBRXBDLFlBQU0sUUFBUSxLQUFLLGlCQUFpQixjQUFjLEVBQUUsV0FBVyxrQkFBa0IsVUFBVTtBQUMzRixZQUFNLFFBQVEsTUFBTSxRQUFRLEtBQUssQ0FBQ0EsV0FBVUEsT0FBTSxXQUFXLGtCQUFrQixNQUFNO0FBRXJGLGFBQU8sUUFDSCxnREFDRSxPQUNBLE9BQ0Esa0JBQWtCLElBQ2xCLGtCQUFrQixXQUNsQixrQkFBa0IsVUFBVSxJQUU5QjtBQUFBLElBQ047QUFBQSxJQUVRLGlDQUNOLFlBQWtCO0FBRWxCLFVBQUksQ0FBQyxLQUFLLGlCQUFpQixLQUFLLHFCQUFxQixFQUFFLFdBQVcsVUFBVTtBQUFHLGVBQU87QUFFdEYsWUFBTSxRQUFRLEtBQUssaUJBQWlCLEtBQUsscUJBQXFCLEVBQUUsV0FBVyxVQUFVO0FBQ3JGLFlBQU0sMEJBQTBCLEtBQUssbUNBQW1DLE1BQU0sTUFBTTtBQUNwRixhQUFPLDhCQUE4QixZQUFZLE9BQU8sdUJBQXVCO0FBQUEsSUFDakY7QUFBQSxJQUVRLCtCQUErQixPQUFtQjtBQUN4RCxXQUFLLDZCQUE2QixRQUM5QixLQUFLLGtCQUNILEtBQUssdUJBQ0wsS0FBSyx3QkFDTCxNQUFNLE1BQU0sSUFFZDtBQUFBLElBQ047QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTVEseUJBQXNCO0FBQzVCLFVBQUksQ0FBQyxVQUFVO0FBQ2IsY0FBTSxlQUFlLFNBQVMsT0FBTyxpQkFBaUIsU0FBUyxJQUFJLEVBQUUsVUFBVSxFQUFFO0FBRWpGLGNBQU0sZ0JBQWdCLElBQUk7QUFDMUIsYUFBSyxPQUFPLFlBQVkscUNBQXFDLEdBQUcsZ0JBQWdCLEtBQUssRUFBRTtBQUFBLE1BQ3pGO0FBQUEsSUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVVRLDhCQUEyQjtBQUNqQyxZQUFNLFlBQVksS0FBSyxpQkFBaUIsS0FBSyxpQkFBaUIsU0FBUyxDQUFDLEVBQUU7QUFDMUUsV0FBSyxlQUFlLENBQUE7QUFFcEIsZ0JBQVUsUUFBUSxDQUFDLE9BQU8sVUFBUztBQUNqQyxjQUFNLGdCQUFvQyxDQUFBO0FBQzFDLGNBQU0sY0FBd0IsQ0FBQTtBQUM5QixjQUFNLFNBQWtCLENBQUE7QUFHeEIsYUFBSyxpQkFDRixJQUFJLENBQUMsT0FBTTtBQUNWLGlCQUFPLEdBQUcsV0FBVyxLQUFLO0FBQUEsUUFDNUIsQ0FBQyxFQUNBLFFBQVEsQ0FBQ0MsV0FBb0I7QUFDNUIsd0JBQWMsS0FBSyxHQUFHQSxPQUFNLFdBQVc7QUFDdkMsc0JBQVksS0FBSyxHQUFJQSxPQUFNLGNBQWNBLE9BQU0sY0FBYyxFQUFHO0FBQ2hFLGlCQUFPLEtBQUssR0FBSUEsT0FBTSxTQUFTQSxPQUFNLFNBQVMsRUFBRztBQUFBLFFBQ25ELENBQUM7QUFFSCxhQUFLLGFBQWEsS0FBSztBQUFBLFVBQ3JCLElBQUksTUFBTTtBQUFBLFVBQ1YsYUFBYSxLQUFLLDhCQUE4QixhQUFhO0FBQUEsVUFDN0QsYUFBYSxLQUFLLCtCQUErQixXQUFXO0FBQUEsVUFDNUQsY0FBYyxNQUFNLFNBQVMsTUFBTSxPQUFPLFdBQVcsSUFBSTtBQUFBLFVBQ3pELGdCQUFnQixLQUFLLGlDQUFpQyxLQUFLO0FBQUEsVUFDM0QsWUFBWSxLQUFLLG1DQUFtQyxNQUFNO0FBQUEsUUFBQSxDQUMzRDtBQUFBLE1BQ0gsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVRLDhCQUE4QixlQUFpQztBQUNyRSxVQUFJLGNBQWMsUUFBUSxPQUFPLE1BQU07QUFBSSxlQUFPO0FBQ2xELFVBQUksY0FBYyxRQUFRLFFBQVEsTUFBTTtBQUFJLGVBQU87QUFDbkQsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLGlDQUNOLFdBQW9CO0FBRXBCLFlBQU0sbUJBQW1CLFVBQVUsaUJBQWlCLE9BQ2xELENBQUMsc0JBQXNCLGtCQUFrQixTQUFTLGFBQWE7QUFHakUsVUFBSSxvQkFBb0IsaUJBQWlCLFNBQVMsR0FBRztBQUVuRCxjQUFNLG9CQUNKLGlCQUFpQixLQUFLLENBQUMsc0JBQXNCLGtCQUFrQixTQUFTLE1BQU0sQ0FBQyxLQUFLO0FBQ3RGLGNBQU0scUJBQ0osaUJBQWlCLEtBQUssQ0FBQyxzQkFBc0Isa0JBQWtCLFNBQVMsSUFBSSxDQUFDLEtBQUs7QUFFcEYsZUFBTztBQUFBLFVBQ0wsTUFBTSxDQUFDLENBQUM7QUFBQSxVQUNSLE9BQU8sQ0FBQyxDQUFDO0FBQUEsUUFBQTtBQUFBLE1BRWI7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFvQ1EsdUJBQW9CO0FBQzFCLGFBQU8sS0FBSyw2QkFDUixLQUFLLFlBQVksZUFBZSxLQUFLLDBCQUEwQixLQUFLLE9BQ3BFO0FBQUEsSUFDTjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNUSx1QkFBdUIsU0FBZTtBQUM1QyxZQUFNLFlBQVksS0FBSyxZQUNuQixjQUFjLE1BQU0sT0FBTyxHQUMzQixhQUFhLGlCQUFpQjtBQUNsQyxVQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHO0FBQ25DLGVBQU8sQ0FBQztBQUFBLE1BQ1Y7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRVEsbUJBQW1CLFlBQWtCO0FBQzNDLGFBQ0UsY0FBYyxLQUNkLGNBQWMsS0FBSyxpQkFBaUIsS0FBSyxpQkFBaUIsU0FBUyxDQUFDLEVBQUUsV0FBVztBQUFBLElBRXJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVlRLDZCQUEwQjtBQUNoQyxVQUNFLEtBQUssaUJBQWlCLEtBQUsscUJBQXFCLEVBQUUsV0FBVyxLQUFLLHNCQUFzQixFQUNyRixXQUFXLFFBQ2Q7QUFDQSxlQUFPLEtBQUs7QUFBQSxNQUNkO0FBR0EsWUFBTSw4QkFBOEIsS0FBSyxpQkFBaUIsVUFDeEQsQ0FBQyxvQkFDQyxnQkFBZ0IsV0FBVyxLQUFLLHNCQUFzQixFQUFFLFdBQVcsTUFBUztBQUVoRixhQUFPLEtBQUsseUJBQXlCLDhCQUNqQyxLQUFLLHdCQUNMO0FBQUEsSUFDTjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBUVEsZ0NBQWdDLFNBQWU7QUFDckQsV0FBSyxZQUNELGVBQWUsT0FBTyxHQUN0QixlQUFlLEVBQUUsVUFBVSxVQUFVLE9BQU8sV0FBVyxRQUFRLFVBQUEsQ0FBVztBQUFBLElBQ2hGO0FBQUEsRUFBQSxHQXIrQ0Esb0RBS0EsaURBS0EsaURBS0EsZ0RBS0EsMENBS0EsdURBS0EsMERBS0EscURBSUEsdURBRVMsc0RBQ0EscURBQ0E7O29DQTVDUixTQUFTLEVBQUUsV0FBVyxxQkFBcUIsTUFBTSxNQUFBLENBQU8sQ0FBQztBQUl6RCxnQ0FBQSxDQUFBLFVBQUEsR0FDQSxTQUFTLEVBQUUsV0FBVyxrQkFBa0IsTUFBTSxRQUFBLENBQVMsQ0FBQztpQ0FJeEQsVUFBQSxHQUNBLFNBQVMsRUFBRSxXQUFXLGtCQUFrQixNQUFNLFNBQVMsU0FBUyxNQUFNLFlBQVksS0FBQSxDQUFNLENBQUM7QUFJekYsK0JBQUEsQ0FBQSxVQUFBLEdBQ0EsU0FBUyxFQUFFLFdBQVcsa0JBQWtCLE1BQU0sT0FBQSxDQUFRLENBQUM7QUFJdkQseUJBQUEsQ0FBQSxVQUFBLEdBQ0EsU0FBUyxFQUFFLFdBQVcsVUFBVSxNQUFNLE9BQUEsQ0FBUSxDQUFDO0FBSS9DLHNDQUFBLENBQUEsVUFBQSxHQUNBLFNBQVMsRUFBRSxXQUFXLHlCQUF5QixNQUFNLE9BQUEsQ0FBUSxDQUFDO0FBSTlELHlDQUFBLENBQUEsVUFBQSxHQUNBLFNBQVMsRUFBRSxXQUFXLDRCQUE0QixNQUFNLE9BQUEsQ0FBUSxDQUFDO0FBSWpFLG9DQUFBLENBQUEsVUFBQSxHQUNBLFNBQVMsRUFBRSxXQUFXLHVCQUF1QixNQUFNLFFBQUEsQ0FBUyxDQUFDO0FBRzdELHNDQUFBLENBQUEsVUFBQSxHQUNBLFNBQVMsRUFBRSxXQUFXLHlCQUF5QixNQUFNLE9BQUEsQ0FBUSxDQUFDO0FBRzlELHFDQUFBLENBQUEsT0FBTztBQUNQLG9DQUFBLENBQUEsT0FBTztBQUNQLG9DQUFBLENBQUEsT0FBTztBQXdNUCxxQ0FBQSxDQUFBLGFBQWEsRUFBRSxTQUFTLEtBQUEsQ0FBTSxDQUFDO0FBblBoQyxpQkFBQSxJQUFBLE1BQUEsOEJBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxvQkFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxzQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQWdCLGtCQUFnQixLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBaEIsbUJBQWdCO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLGdDQUFBLG1DQUFBO0FBS2hDLGlCQUFBLElBQUEsTUFBQSwyQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLGlCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLG1CQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IsZUFBYSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBYixnQkFBYTtBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSw2QkFBQSxnQ0FBQTtBQUs3QixpQkFBQSxJQUFBLE1BQUEsMkJBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxpQkFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxtQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQWdCLGVBQWEsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFVBQWIsZ0JBQWE7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsNkJBQUEsZ0NBQUE7QUFLN0IsaUJBQUEsSUFBQSxNQUFBLDBCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsZ0JBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsa0JBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFnQixjQUFZLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFaLGVBQVk7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsNEJBQUEsK0JBQUE7QUFLNUIsaUJBQUEsSUFBQSxNQUFBLG9CQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsVUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxZQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IsUUFBTSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBTixTQUFNO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLHNCQUFBLHlCQUFBO0FBS3RCLGlCQUFBLElBQUEsTUFBQSxpQ0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLHVCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLHlCQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IscUJBQW1CLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFuQixzQkFBbUI7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsbUNBQUEsc0NBQUE7QUFLbkMsaUJBQUEsSUFBQSxNQUFBLG9DQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsMEJBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsNEJBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFnQix3QkFBc0IsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFVBQXRCLHlCQUFzQjtBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSxzQ0FBQSx5Q0FBQTtBQUt0QyxpQkFBQSxJQUFBLE1BQUEsK0JBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxxQkFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSx1QkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQWdCLG1CQUFpQixLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBakIsb0JBQWlCO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLGlDQUFBLG9DQUFBO0FBSWpDLGlCQUFBLElBQUEsTUFBQSxpQ0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLHVCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLHlCQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBZ0IscUJBQW1CLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFuQixzQkFBbUI7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsbUNBQUEsc0NBQUE7QUFFMUIsaUJBQUEsSUFBQSxNQUFBLGdDQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsc0JBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsd0JBQUEsS0FBQSxLQUFBLENBQUEsUUFBQSxJQUFtQixvQkFBa0IsS0FBQSxDQUFBLEtBQUEsVUFBQTtBQUFBLFVBQWxCLHFCQUFrQjtBQUFBLElBQUEsS0FBQSxVQUFBLFVBQUEsR0FBQSxrQ0FBQSxxQ0FBQTtBQUNyQyxpQkFBQSxJQUFBLE1BQUEsK0JBQUEsRUFBQSxNQUFBLFlBQUEsTUFBQSxxQkFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSx1QkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQW1CLG1CQUFpQixLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBakIsb0JBQWlCO0FBQUEsSUFBQSxLQUFBLFVBQUEsVUFBQSxHQUFBLGlDQUFBLG9DQUFBO0FBQ3BDLGlCQUFBLElBQUEsTUFBQSwrQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLHFCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLHVCQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBbUIsbUJBQWlCLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFqQixvQkFBaUI7QUFBQSxJQUFBLEtBQUEsVUFBQSxVQUFBLEdBQUEsaUNBQUEsb0NBQUE7QUF5TTdDLGlCQUFBLElBQUEsTUFBQSxnQ0FBQSxFQUFBLE1BQUEsVUFBQSxNQUFBLHNCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLHdCQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBVSxtQkFBQSxHQUFrQixVQUFBLFVBQUEsR0FBQSxNQUFBLDBCQUFBOztRQTNQTCxHQUFBLFNBQVM7QUFBQSxJQUM5QixnQkFBZ0I7QUFBQSxJQUNoQixlQUFlO0FBQUEsRUFBQSxHQUhOOzsifQ==
|