breeze-client 2.1.4-mjs → 2.1.5-mjs
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/esm2020/src/breeze.mjs +2 -2
- package/esm2020/src/default-property-interceptor.mjs +2 -2
- package/esm2020/src/entity-aspect.mjs +1 -1
- package/fesm2015/breeze-client.mjs +2 -2
- package/fesm2015/breeze-client.mjs.map +1 -1
- package/fesm2020/breeze-client.mjs +2 -2
- package/fesm2020/breeze-client.mjs.map +1 -1
- package/package.json +1 -1
- package/src/entity-aspect.d.ts +2 -2
|
@@ -803,4 +803,4 @@ function clearOriginalValues(target) {
|
|
|
803
803
|
}
|
|
804
804
|
});
|
|
805
805
|
}
|
|
806
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWFzcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnRpdHktYXNwZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFHLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQWlFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUF5QzdDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQXNGdkIsd0JBQXdCO0lBQ3hCLFlBQVksTUFBZTtRQUV6Qix3QkFBd0I7UUFDeEIseUNBQXlDO1FBQ3pDLHFDQUFxQztRQUNyQyxJQUFJO1FBdUtOOzs7Ozs7V0FNRztRQUNILGlCQUFZLEdBQUc7WUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQztRQUdGOzs7Ozs7V0FNRztRQUNILGdCQUFXLEdBQUc7WUFDWixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztRQUVGOzs7Ozs7O1dBT0c7UUFD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RCxPQUFPLFlBQVksSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsbUdBQW1HO0lBQ25HLGVBQWUsQ0FBQyxRQUFnQjtRQUM5QixJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBZSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUVGO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxNQUFXO0lBQ3RDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN6RCxNQUFNLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMzQixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDcEQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQU87UUFDL0MsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ2YsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7YUFBTTtZQUNMLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBCcmVlemVFdmVudCB9IGZyb20gJy4vZXZlbnQnO1xyXG5pbXBvcnQgeyBhc3NlcnRQYXJhbSB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUgIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBY3Rpb24gfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBDb21wbGV4VHlwZSwgRGF0YVByb3BlcnR5LCBOYXZpZ2F0aW9uUHJvcGVydHksIEVudGl0eVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBFbnRpdHlLZXkgfSBmcm9tICcuL2VudGl0eS1rZXknO1xyXG5pbXBvcnQgeyBFbnRpdHlHcm91cCB9IGZyb20gJy4vZW50aXR5LWdyb3VwJztcclxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgUXVlcnlSZXN1bHQsIFF1ZXJ5RXJyb3JDYWxsYmFjaywgUXVlcnlTdWNjZXNzQ2FsbGJhY2sgfSBmcm9tICcuL2VudGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgVmFsaWRhdG9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL3ZhbGlkYXRlJztcclxuaW1wb3J0IHsgRW50aXR5UXVlcnkgfSBmcm9tICcuL2VudGl0eS1xdWVyeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eSB7XHJcbiAgZW50aXR5QXNwZWN0OiBFbnRpdHlBc3BlY3Q7XHJcbiAgZW50aXR5VHlwZTogRW50aXR5VHlwZTtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgZ2V0UHJvcGVydHk/KHByb3A6IHN0cmluZyk6IGFueTtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgc2V0UHJvcGVydHk/KHByb3A6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQ7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgcHJvdG90eXBlPzogeyBfJHR5cGVOYW1lOiBzdHJpbmcgfTtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfJGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhPYmplY3Qge1xyXG4gIGNvbXBsZXhBc3BlY3Q6IENvbXBsZXhBc3BlY3Q7XHJcbiAgY29tcGxleFR5cGU6IENvbXBsZXhUeXBlO1xyXG4gIGdldFByb3BlcnR5KHByb3A6IHN0cmluZyk6IGFueTtcclxuICBzZXRQcm9wZXJ0eShwcm9wOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHByb3RvdHlwZT86IHsgXyR0eXBlTmFtZTogc3RyaW5nIH07XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0cnVjdHVyYWxPYmplY3QgPSBFbnRpdHkgfCBDb21wbGV4T2JqZWN0O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3Mge1xyXG4gIGVudGl0eTogRW50aXR5O1xyXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nIHwgbnVsbDtcclxuICBwYXJlbnQ/OiBTdHJ1Y3R1cmFsT2JqZWN0O1xyXG4gIHByb3BlcnR5PzogRW50aXR5UHJvcGVydHk7XHJcbiAgb2xkVmFsdWU/OiBhbnk7XHJcbiAgbmV3VmFsdWU/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkVycm9yc0NoYW5nZWRFdmVudEFyZ3Mge1xyXG4gIGVudGl0eTogRW50aXR5O1xyXG4gIGFkZGVkOiBWYWxpZGF0aW9uRXJyb3JbXTtcclxuICByZW1vdmVkOiBWYWxpZGF0aW9uRXJyb3JbXTtcclxufVxyXG5cclxuLyoqXHJcbkFuIEVudGl0eUFzcGVjdCBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggZXZlcnkgYXR0YWNoZWQgZW50aXR5IGFuZCBpcyBhY2Nlc3NlZCB2aWEgdGhlIGVudGl0eSdzICdlbnRpdHlBc3BlY3QnIHByb3BlcnR5LlxyXG5cclxuVGhlIEVudGl0eUFzcGVjdCBpdHNlbGYgcHJvdmlkZXMgcHJvcGVydGllcyB0byBkZXRlcm1pbmUgYW5kIG1vZGlmeSB0aGUgRW50aXR5U3RhdGUgb2YgdGhlIGVudGl0eSBhbmQgaGFzIG1ldGhvZHNcclxudGhhdCBwcm92aWRlIGEgdmFyaWV0eSBvZiBzZXJ2aWNlcyBpbmNsdWRpbmcgdmFsaWRhdGlvbiBhbmQgY2hhbmdlIHRyYWNraW5nLlxyXG5cclxuQW4gRW50aXR5QXNwZWN0IHdpbGwgYWxtb3N0IG5ldmVyIG5lZWQgdG8gYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuIFlvdSB3aWxsIHVzdWFsbHkgZ2V0IGFuIEVudGl0eUFzcGVjdCBieSBhY2Nlc3NpbmdcclxuYW4gZW50aXRpZXMgJ2VudGl0eUFzcGVjdCcgcHJvcGVydHkuICBUaGlzIHByb3BlcnR5IHdpbGwgYmUgYXV0b21hdGljYWxseSBhdHRhY2hlZCB3aGVuIGFuIGVudGl0eSBpcyBjcmVhdGVkIHZpYSBlaXRoZXJcclxuYSBxdWVyeSwgaW1wb3J0IG9yIFtbRW50aXR5TWFuYWdlci5jcmVhdGVFbnRpdHldXSBjYWxsLlxyXG4+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4+ICAgICAgdmFyIGFzcGVjdCA9IG9yZGVyLmVudGl0eUFzcGVjdDtcclxuPiAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBhc3BlY3QuZW50aXR5U3RhdGU7XHJcblxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEVudGl0eUFzcGVjdCB7XHJcbiAgLyoqIFRoZSBFbnRpdHkgdGhhdCB0aGlzIGFzcGVjdCBpcyBhc3NvY2lhdGVkIHdpdGguIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGVudGl0eT86IEVudGl0eTtcclxuICAvKiogVGhlIFtbRW50aXR5TWFuYWdlcl1dIHRoYXQgY29udGFpbnMgdGhpcyBlbnRpdHkuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgZW50aXR5TWFuYWdlcj86IEVudGl0eU1hbmFnZXI7XHJcbiAgLyoqICBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGVudGl0eUdyb3VwPzogRW50aXR5R3JvdXA7XHJcbiAgLyoqIFRoZSBbW0VudGl0eVN0YXRlXV0gb2YgdGhpcyBlbnRpdHkuIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgZW50aXR5U3RhdGU6IEVudGl0eVN0YXRlO1xyXG4gIC8qKiAgIFdoZXRoZXIgdGhpcyBlbnRpdHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc2F2ZWQuIF9fUmVhZCBPbmx5X18gKi9cclxuICBpc0JlaW5nU2F2ZWQ6IGJvb2xlYW47XHJcbiAgLyoqIFRoZSAnb3JpZ2luYWwgdmFsdWVzJyBvZiB0aGlzIGVudGl0eSB3aGVyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgJ2N1cnJlbnQgdmFsdWVzJy5cclxuICBUaGlzIGlzIGEgbWFwIHdoZXJlIHRoZSBrZXkgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCB0aGUgdmFsdWUgaXMgdGhlICdvcmlnaW5hbCB2YWx1ZScgb2YgdGhlIHByb3BlcnR5LiAqL1xyXG4gIG9yaWdpbmFsVmFsdWVzOiB7fTtcclxuICAvKiogIFdoZXRoZXIgdGhpcyBlbnRpdHkgaGFzIGFueSB2YWxpZGF0aW9uIGVycm9ycy4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGhhc1ZhbGlkYXRpb25FcnJvcnM6IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdGhpcyBlbnRpdHkgaGFzIGEgdGVtcG9yYXJ5IFtbRW50aXR5S2V5XV0uICovXHJcbiAgaGFzVGVtcEtleTogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGlzIGVudGl0eSB3YXMgY3JlYXRlZCBieSBiZWluZyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UgKi9cclxuICB3YXNMb2FkZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBFeHRyYSBtZXRhZGF0YSBhYm91dCB0aGlzIGVudGl0eSBzdWNoIGFzIHRoZSBlbnRpdHkncyBldGFnLlxyXG4gIFlvdSBtYXkgZXh0ZW5kIHRoaXMgb2JqZWN0IHdpdGggeW91ciBvd24gbWV0YWRhdGEgaW5mb3JtYXRpb24uXHJcbiAgQnJlZXplIChkZSlzZXJpYWxpemVzIHRoaXMgb2JqZWN0IHdoZW4gaW1wb3J0aW5nL2V4cG9ydGluZyB0aGUgZW50aXR5LiAqKi9cclxuICBleHRyYU1ldGFkYXRhPzogYW55O1xyXG4gIC8qKlxyXG4gIEEgW1tCcmVlemVFdmVudF1dIHRoYXQgZmlyZXMgd2hlbmV2ZXIgYW55IG9mIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBvbiB0aGlzIGVudGl0eSBjaGFuZ2UuXHJcbiAgTm90ZSB0aGF0IHRoaXMgbWlnaHQgYmUgdGhlIHJlbW92YWwgb2YgYW4gZXJyb3Igd2hlbiBzb21lIGRhdGEgb24gdGhlIGVudGl0eSBpcyBmaXhlZC5cclxuICBAZXZlbnRBcmdzIC0gXHJcbiAgICAtIGVudGl0eSAtIFRoZSBlbnRpdHkgb24gd2hpY2ggdGhlIHZhbGlkYXRpb24gZXJyb3JzIGFyZSBiZWluZyBhZGRlZCBvciByZW1vdmVkLlxyXG4gICAgLSBhZGRlZCAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYW55IG5ld2x5IGFkZGVkIFtbVmFsaWRhdGlvbkVycm9yXV1zXHJcbiAgICAtIHJlbW92ZWQgLSBBbiBhcnJheSBjb250YWluaW5nIGFueSBuZXdseSByZW1vdmVkIFtbVmFsaWRhdGlvbkVycm9yXV1zLiBUaGlzIGlzIHRob3NlXHJcbiAgICAgIGVycm9ycyB0aGF0IGhhdmUgYmVlbiAnZml4ZWQnLlxyXG5cclxuPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuPiAgICAgIG9yZGVyLmVudGl0eUFzcGVjdC52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZC5zdWJzY3JpYmUoXHJcbj4gICAgICBmdW5jdGlvbiAodmFsaWRhdGlvbkNoYW5nZUFyZ3MpIHtcclxuPiAgICAgICAgICAvLyB0aGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBhbnl0aW1lIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlcyBvbiB0aGUgJ29yZGVyJyBlbnRpdHkuXHJcbj4gICAgICAgICAgdmFyIGVudGl0eSA9PSB2YWxpZGF0aW9uQ2hhbmdlQXJncy5lbnRpdHk7IC8vIE5vdGU6IGVudGl0eSA9PT0gb3JkZXJcclxuPiAgICAgICAgICB2YXIgZXJyb3JzQWRkZWQgPSB2YWxpZGF0aW9uQ2hhbmdlQXJncy5hZGRlZDtcclxuPiAgICAgICAgICB2YXIgZXJyb3JzQ2xlYXJlZCA9IHZhbGlkYXRpb25DaGFuZ2VBcmdzLnJlbW92ZWQ7XHJcbj4gICAgICB9KTtcclxuICBAZXZlbnRcclxuICAqKi9cclxuICB2YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZDogQnJlZXplRXZlbnQ8VmFsaWRhdGlvbkVycm9yc0NoYW5nZWRFdmVudEFyZ3M+O1xyXG4gIC8qKlxyXG4gIEEgW1tCcmVlemVFdmVudF1dIHRoYXQgZmlyZXMgd2hlbmV2ZXIgYSB2YWx1ZSBvZiBvbmUgb2YgdGhpcyBlbnRpdHkncyBwcm9wZXJ0aWVzIGNoYW5nZS5cclxuICBAZXZlbnRBcmdzIC1cclxuICAgIC0gZW50aXR5IC0gVGhlIGVudGl0eSB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC5cclxuICAgIC0gcHJvcGVydHkgLSBUaGUgW1tEYXRhUHJvcGVydHldXSB0aGF0IGNoYW5nZWQuXHJcbiAgICAtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuIFRoaXMgdmFsdWUgd2lsbCBiZSAnbnVsbCcgZm9yIG9wZXJhdGlvbnMgdGhhdCByZXBsYWNlIHRoZSBlbnRpcmUgZW50aXR5LiAgVGhpcyBpbmNsdWRlc1xyXG4gICAgICBxdWVyaWVzLCBpbXBvcnRzIGFuZCBzYXZlcyB0aGF0IHJlcXVpcmUgYSBtZXJnZS4gVGhlIHJlbWFpbmluZyBwYXJhbWV0ZXJzIHdpbGwgbm90IGV4aXN0IGluIHRoaXMgY2FzZSBlaXRoZXIuIFRoaXMgd2lsbCBhY3R1YWxseSBiZSBhIFwicHJvcGVydHkgcGF0aFwiXHJcbiAgICAgIGZvciBhbnkgcHJvcGVydGllcyBvZiBhIGNvbXBsZXggdHlwZS5cclxuICAgIC0gb2xkVmFsdWUgLSBUaGUgb2xkIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYmVmb3JlIHRoZSBjaGFuZ2UuXHJcbiAgICAtIG5ld1ZhbHVlIC0gVGhlIG5ldyB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGFmdGVyIHRoZSBjaGFuZ2UuXHJcbiAgICAtIHBhcmVudCAtIFRoZSBpbW1lZGlhdGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGNoYW5nZWQgcHJvcGVydHkuICBUaGlzIHdpbGwgYmUgYSBDb21wbGV4VHlwZSBpbnN0YW5jZSBhcyBvcHBvc2VkIHRvIGFuIEVudGl0eSBcclxuICAgICAgZm9yIGFueSBjb21wbGV4IHR5cGUgb3IgbmVzdGVkIGNvbXBsZXggdHlwZSBwcm9wZXJ0aWVzLlxyXG5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3QucHJvcGVydHlDaGFuZ2VkLnN1YnNjcmliZShcclxuICA+ICAgICAgZnVuY3Rpb24gKHByb3BlcnR5Q2hhbmdlZEFyZ3MpIHtcclxuICA+ICAgICAgICAgIC8vIHRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGFueXRpbWUgYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VzIG9uIHRoZSAnb3JkZXInIGVudGl0eS5cclxuICA+ICAgICAgICAgIHZhciBlbnRpdHkgPSBwcm9wZXJ0eUNoYW5nZWRBcmdzLmVudGl0eTsgLy8gTm90ZTogZW50aXR5ID09PSBvcmRlclxyXG4gID4gICAgICAgICAgdmFyIHByb3BlcnR5TmFtZUNoYW5nZWQgPSBwcm9wZXJ0eUNoYW5nZWRBcmdzLnByb3BlcnR5TmFtZTtcclxuICA+ICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IHByb3BlcnR5Q2hhbmdlZEFyZ3Mub2xkVmFsdWU7XHJcbiAgPiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBwcm9wZXJ0eUNoYW5nZWRBcmdzLm5ld1ZhbHVlO1xyXG4gID4gICAgICB9KTtcclxuICBAZXZlbnRcclxuICAqKi9cclxuICBwcm9wZXJ0eUNoYW5nZWQ6IEJyZWV6ZUV2ZW50PFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncz47XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF92YWxpZGF0aW9uRXJyb3JzOiB7IFtpbmRleDogc3RyaW5nXTogVmFsaWRhdGlvbkVycm9yIH07XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0OiBhbnk7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2VudGl0eUtleTogRW50aXR5S2V5O1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9sb2FkZWROcHM6IGFueVtdO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9pbml0aWFsaXplZD86IGJvb2xlYW47XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2luUHJvY2VzczogYW55W107IC8vIHVzZWQgaW4gZGVmYXVsdFByb3BlcnR5SW50ZXJjZXB0b3IgZm9yIHRlbXAgc3RvcmFnZS5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfaW5Qcm9jZXNzRW50aXR5PzogRW50aXR5OyAvLyB1c2VkIGluIEVudGl0eU1hbmFnZXJcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBzdGF0aWMgX251bGxJbnN0YW5jZSA9IG5ldyBFbnRpdHlBc3BlY3QoKTsgLy8gVE9ETzogZGV0ZXJtaW5lIGlmIHRoaXMgd29ya3NcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBjb25zdHJ1Y3RvcihlbnRpdHk/OiBFbnRpdHkpIHtcclxuXHJcbiAgICAvLyBpZiBjYWxsZWQgd2l0aG91dCBuZXdcclxuICAgIC8vIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFbnRpdHlBc3BlY3QpKSB7XHJcbiAgICAvLyAgIHJldHVybiBuZXcgRW50aXR5QXNwZWN0KGVudGl0eSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XHJcbiAgICAvLyBUT0RPOiBrZWVwIHB1YmxpYyBvciBub3Q/XHJcbiAgICB0aGlzLmVudGl0eUdyb3VwID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5lbnRpdHlNYW5hZ2VyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5lbnRpdHlTdGF0ZSA9IEVudGl0eVN0YXRlLkRldGFjaGVkO1xyXG4gICAgdGhpcy5pc0JlaW5nU2F2ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMgPSB7fTtcclxuICAgIHRoaXMuaGFzVmFsaWRhdGlvbkVycm9ycyA9IGZhbHNlO1xyXG4gICAgdGhpcy5fdmFsaWRhdGlvbkVycm9ycyA9IHt9O1xyXG5cclxuICAgIC8vIFVuY29tbWVudCB3aGVuIHdlIGltcGxlbWVudCBlbnRpdHlBc3BlY3QuaXNOYXZpZ2F0aW9uUHJvcGVydHlMb2FkZWQgbWV0aG9kXHJcbiAgICAvLyB0aGlzLl9sb2FkZWROYXZQcm9wTWFwID0ge307XHJcblxyXG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZCA9IG5ldyBCcmVlemVFdmVudChcInZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkXCIsIHRoaXMpO1xyXG4gICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQgPSBuZXcgQnJlZXplRXZlbnQoXCJwcm9wZXJ0eUNoYW5nZWRcIiwgdGhpcyk7XHJcbiAgICAvLyBpbiBjYXNlIHRoaXMgaXMgdGhlIE5VTEwgZW50aXR5QXNwZWN0LiAtIHVzZWQgd2l0aCBDb21wbGV4QXNwZWN0cyB0aGF0IGhhdmUgbm8gcGFyZW50LlxyXG5cclxuICAgIGlmIChlbnRpdHkgIT0gbnVsbCkge1xyXG4gICAgICAvLyByZW1vdmUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBvbiBwcm90b3R5cGUgYnV0IHBsYWNlZCBvbiBjbGFzcyBieSBCYWJlbFxyXG4gICAgICBpZiAoIWVudGl0eS5lbnRpdHlUeXBlKSB7IGRlbGV0ZShlbnRpdHkuZW50aXR5VHlwZSk7IH1cclxuICAgICAgaWYgKCFlbnRpdHkuZW50aXR5QXNwZWN0KSB7IGRlbGV0ZShlbnRpdHkuZW50aXR5QXNwZWN0KTsgfVxyXG4gICAgICBlbnRpdHkuZW50aXR5QXNwZWN0ID0gdGhpcztcclxuXHJcbiAgICAgIC8vIGVudGl0eVR5cGUgc2hvdWxkIGFscmVhZHkgYmUgb24gdGhlIGVudGl0eSBmcm9tICd3YXRjaCdcclxuICAgICAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHkuZW50aXR5VHlwZSB8fCBlbnRpdHkuXyRlbnRpdHlUeXBlO1xyXG4gICAgICBpZiAoIWVudGl0eVR5cGUpIHtcclxuICAgICAgICBsZXQgdHlwZU5hbWUgPSBlbnRpdHkucHJvdG90eXBlLl8kdHlwZU5hbWU7XHJcbiAgICAgICAgaWYgKCF0eXBlTmFtZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBlbnRpdHkgaXMgbm90IHJlZ2lzdGVyZWQgYXMgYSB2YWxpZCBFbnRpdHlUeXBlXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRhZGF0YSBmb3IgdGhpcyBlbnRpdHlUeXBlIGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQ6IFwiICsgdHlwZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgZW50aXR5Q3RvciA9IGVudGl0eVR5cGUuZ2V0RW50aXR5Q3RvcigpO1xyXG4gICAgICBjb25maWcuaW50ZXJmYWNlUmVnaXN0cnkubW9kZWxMaWJyYXJ5LmdldERlZmF1bHRJbnN0YW5jZSgpLnN0YXJ0VHJhY2tpbmcoZW50aXR5LCBlbnRpdHlDdG9yLnByb3RvdHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiAqL1xyXG4gIC8vIHR5cGUtZ3VhcmRcclxuICBzdGF0aWMgaXNFbnRpdHkob2JqOiBTdHJ1Y3R1cmFsT2JqZWN0KTogb2JqIGlzIEVudGl0eSB7XHJcbiAgICByZXR1cm4gKG9iaiBhcyBhbnkpLmVudGl0eUFzcGVjdCAhPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gTm8gbG9uZ2VyIHVzZWRcclxuICAvLyBzdGF0aWMgY3JlYXRlRnJvbShlbnRpdHk6IEVudGl0eSk6IEVudGl0eUFzcGVjdCB7XHJcbiAgLy8gICBpZiAoZW50aXR5ID09IG51bGwpIHtcclxuICAvLyAgICAgcmV0dXJuIEVudGl0eUFzcGVjdC5fbnVsbEluc3RhbmNlO1xyXG4gIC8vICAgfSBlbHNlIGlmIChlbnRpdHkuZW50aXR5QXNwZWN0KSB7XHJcbiAgLy8gICAgIHJldHVybiBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIG5ldyBFbnRpdHlBc3BlY3QoZW50aXR5KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIFRPRE86IHJlZmFjdG9yIHRoaXMgYW5kIHRoZSBpbnN0YW5jZSBnZXRQcm9wZXJ0eVZhbHVlIG1ldGhvZC5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCAncHJvcGVydHkgcGF0aCcgZm9yIGEgc3BlY2lmaWVkIGVudGl0eS5cclxuXHJcbiAgVGhlIHByb3BlcnR5UGF0aCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIGRlbGltaXRlZCB3aXRoICcuJyBvciBhIHN0cmluZyBhcnJheS4gIFxyXG4gICoqL1xyXG4gIC8vIHVzZWQgYnkgRW50aXR5UXVlcnkgYW5kIFByZWRpY2F0ZVxyXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eVBhdGhWYWx1ZShvYmo6IEVudGl0eSwgcHJvcGVydHlQYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgbGV0IHByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5UGF0aCkgPyBwcm9wZXJ0eVBhdGggOiBwcm9wZXJ0eVBhdGguc3BsaXQoXCIuXCIpO1xyXG4gICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybiBvYmouZ2V0UHJvcGVydHkocHJvcGVydHlQYXRoIGFzIHN0cmluZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbmV4dFZhbHVlID0gb2JqO1xyXG4gICAgICAvLyBoYWNrIHVzZSBvZiBzb21lIHRvIHBlcmZvcm0gbWFwRmlyc3Qgb3BlcmF0aW9uLlxyXG4gICAgICBwcm9wZXJ0aWVzLnNvbWUoKHByb3ApID0+IHtcclxuICAgICAgICBuZXh0VmFsdWUgPSBuZXh0VmFsdWUuZ2V0UHJvcGVydHkocHJvcCk7XHJcbiAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSA9PSBudWxsO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIG5leHRWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIFtbRW50aXR5S2V5XV0gZm9yIHRoaXMgRW50aXR5LlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIHZhciBlbnRpdHlLZXkgPSBvcmRlci5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgQHBhcmFtIGZvcmNlUmVmcmVzaCAtIChib29sZWFuPWZhbHNlKSBGb3JjZXMgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGtleS4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHVubmVjZXNzYXJ5LlxyXG4gIEByZXR1cm4gVGhlIFtbRW50aXR5S2V5XV0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5LlxyXG4gICoqL1xyXG4gIGdldEtleShmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgZm9yY2VSZWZyZXNoID0gYXNzZXJ0UGFyYW0oZm9yY2VSZWZyZXNoLCBcImZvcmNlUmVmcmVzaFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soZmFsc2UpO1xyXG4gICAgaWYgKGZvcmNlUmVmcmVzaCB8fCAhdGhpcy5fZW50aXR5S2V5KSB7XHJcbiAgICAgIGxldCBlbnRpdHlUeXBlID0gdGhpcy5lbnRpdHkhLmVudGl0eVR5cGU7XHJcbiAgICAgIGxldCBrZXlQcm9wcyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICAgICAgbGV0IHZhbHVlcyA9IGtleVByb3BzLm1hcChmdW5jdGlvbiAocCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0eS5nZXRQcm9wZXJ0eShwLm5hbWUpO1xyXG4gICAgICB9LCB0aGlzKTtcclxuICAgICAgdGhpcy5fZW50aXR5S2V5ID0gbmV3IEVudGl0eUtleShlbnRpdHlUeXBlLCB2YWx1ZXMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eUtleTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIGVudGl0eSB0byBhbiBbW0VudGl0eVN0YXRlXV0gb2YgJ1VuY2hhbmdlZCcgYnkgY29tbWl0dGluZyBhbGwgY2hhbmdlcyBtYWRlIHNpbmNlIHRoZSBlbnRpdHkgd2FzIGxhc3QgcXVlcmllZFxyXG4gIGhhZCAnYWNjZXB0Q2hhbmdlcycgY2FsbGVkIG9uIGl0LlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIG9yZGVyLmVudGl0eUFzcGVjdC5hY2NlcHRDaGFuZ2VzKCk7XHJcbiAgPiAgICAgIC8vIFRoZSAnb3JkZXInIGVudGl0eSB3aWxsIG5vdyBiZSBpbiBhbiAnVW5jaGFuZ2VkJyBzdGF0ZSB3aXRoIGFueSBjaGFuZ2VzIGNvbW1pdHRlZC5cclxuICAqKi9cclxuICBhY2NlcHRDaGFuZ2VzKCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkgcmV0dXJuO1xyXG4gICAgdGhpcy5fY2hlY2tPcGVyYXRpb24oXCJhY2NlcHRDaGFuZ2VzXCIpO1xyXG4gICAgbGV0IGVtID0gdGhpcy5lbnRpdHlNYW5hZ2VyITtcclxuICAgIGlmICh0aGlzLmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSB7XHJcbiAgICAgIGVtLmRldGFjaEVudGl0eSh0aGlzLmVudGl0eSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldFVuY2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gICAgZW0uZW50aXR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5QWN0aW9uOiBFbnRpdHlBY3Rpb24uQWNjZXB0Q2hhbmdlcywgZW50aXR5OiB0aGlzLmVudGl0eSB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIGVudGl0eSB0byBhbiBbW0VudGl0eVN0YXRlXV0gb2YgJ1VuY2hhbmdlZCcgYnkgcmVqZWN0aW5nIGFsbCBjaGFuZ2VzIG1hZGUgdG8gaXQgc2luY2UgdGhlIGVudGl0eSB3YXMgbGFzdCBxdWVyaWVkXHJcbiAgaGFkICdyZWplY3RDaGFuZ2VzJyBjYWxsZWQgb24gaXQuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LnJlamVjdENoYW5nZXMoKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGFuICdVbmNoYW5nZWQnIHN0YXRlIHdpdGggYW55IGNoYW5nZXMgcmVqZWN0ZWQuXHJcbiAgKiovXHJcbiAgcmVqZWN0Q2hhbmdlcygpIHtcclxuICAgIHRoaXMuX2NoZWNrT3BlcmF0aW9uKFwicmVqZWN0Q2hhbmdlc1wiKTtcclxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eSE7XHJcbiAgICBsZXQgZW50aXR5TWFuYWdlciA9IHRoaXMuZW50aXR5TWFuYWdlciE7XHJcbiAgICAvLyB3ZSBkbyBub3Qgd2FudCBQcm9wZXJ0eUNoYW5nZSBvciBFbnRpdHlDaGFuZ2UgZXZlbnRzIHRvIG9jY3VyIGhlcmVcclxuICAgIGNvcmUudXNpbmcoZW50aXR5TWFuYWdlciwgXCJpc1JlamVjdGluZ0NoYW5nZXNcIiwgdHJ1ZSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICByZWplY3RDaGFuZ2VzQ29yZShlbnRpdHkpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5lbnRpdHlTdGF0ZS5pc0FkZGVkKCkpIHtcclxuICAgICAgLy8gbmV4dCBsaW5lIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgbGluZSB3aWxsIGNhdXNlIHRoaXMuZW50aXR5TWFuYWdlciAtPiBudWxsO1xyXG4gICAgICBlbnRpdHlNYW5hZ2VyLmRldGFjaEVudGl0eShlbnRpdHkpO1xyXG4gICAgICAvLyBuZWVkIHRvIHRlbGwgZW0gdGhhdCBhbiBlbnRpdHkgdGhhdCBuZWVkZWQgdG8gYmUgc2F2ZWQgbm8gbG9uZ2VyIGRvZXMuXHJcbiAgICAgIGVudGl0eU1hbmFnZXIuX25vdGlmeVN0YXRlQ2hhbmdlKGVudGl0eSwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgICBlbnRpdHlNYW5hZ2VyLl9saW5rUmVsYXRlZEVudGl0aWVzKGVudGl0eSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRVbmNoYW5nZWQoKTtcclxuICAgICAgLy8gcHJvcGVydHlDaGFuZ2VkIHByb3BlcnR5TmFtZSBpcyBub3Qgc3BlY2lmaWVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSBwcm9wZXJ0eSBtYXkgaGF2ZSBjaGFuZ2VkLlxyXG4gICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5OiBlbnRpdHksIHByb3BlcnR5TmFtZTogbnVsbCB9KTtcclxuICAgICAgZW50aXR5TWFuYWdlci5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5SZWplY3RDaGFuZ2VzLCBlbnRpdHk6IGVudGl0eSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiAgQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICAvLyBUT0RPOiByZW5hbWUgLSBhbmQgdXNlICdfJzsgdXNlZCBvbiBib3RoIEVudGl0eUFzcGVjdCBhbmQgQ29tcGxleEFzcGVjdCBmb3IgcG9seW1vcnBoaWMgcmVhc29ucy5cclxuICBnZXRQcm9wZXJ0eVBhdGgocHJvcE5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHByb3BOYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgZW50aXR5IHRvIGFuIEVudGl0eVN0YXRlIG9mICdBZGRlZCcuICBUaGlzIGlzIE5PVCB0aGUgZXF1aXZhbGVudCBvZiBjYWxsaW5nIFtbRW50aXR5TWFuYWdlci5hZGRFbnRpdHldXVxyXG4gIGJlY2F1c2Ugbm8ga2V5IGdlbmVyYXRpb24gd2lsbCBvY2N1ciBmb3IgYXV0b2dlbmVyYXRlZCBrZXlzIGFzIGEgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uLiBBcyBhIHJlc3VsdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgcHJvYmxlbWF0aWNcclxuICB1bmxlc3MgeW91IGFyZSBjZXJ0YWluIHRoYXQgdGhlIGVudGl0eSBiZWluZyBtYXJrZWQgJ0FkZGVkJyBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZSBhbmQgZG9lcyBub3QgaGF2ZSBhbiBhdXRvZ2VuZXJhdGVkIGtleS5cclxuICBUaGUgc2FtZSBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBieSBjYWxsaW5nIFtbRW50aXR5QXNwZWN0LnNldEVudGl0eVN0YXRlXV0uXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LnNldEFkZGVkKCk7XHJcbiAgPiAgICAgIC8vIFRoZSAnb3JkZXInIGVudGl0eSB3aWxsIG5vdyBiZSBpbiBhbiAnQWRkZWQnIHN0YXRlLlxyXG4gICoqL1xyXG4gIHNldEFkZGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RW50aXR5U3RhdGUoRW50aXR5U3RhdGUuQWRkZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgZW50aXR5IHRvIGFuIEVudGl0eVN0YXRlIG9mICdVbmNoYW5nZWQnLiAgVGhpcyBpcyBhbHNvIHRoZSBlcXVpdmFsZW50IG9mIGNhbGxpbmcgW1tFbnRpdHlBc3BlY3QuYWNjZXB0Q2hhbmdlc11dLlxyXG4gIFRoZSBzYW1lIG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGJ5IGNhbGxpbmcgW1tFbnRpdHlBc3BlY3Quc2V0RW50aXR5U3RhdGVdXS5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3Quc2V0VW5jaGFuZ2VkKCk7XHJcbiAgPiAgICAgIC8vIFRoZSAnb3JkZXInIGVudGl0eSB3aWxsIG5vdyBiZSBpbiBhbiAnVW5jaGFuZ2VkJyBzdGF0ZSB3aXRoIGFueSBjaGFuZ2VzIGNvbW1pdHRlZC5cclxuICAqKi9cclxuICBzZXRVbmNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXRFbnRpdHlTdGF0ZShFbnRpdHlTdGF0ZS5VbmNoYW5nZWQpO1xyXG4gIH07XHJcblxyXG5cclxuICAvKipcclxuICBTZXRzIHRoZSBlbnRpdHkgdG8gYW4gRW50aXR5U3RhdGUgb2YgJ01vZGlmaWVkJy4gIFRoaXMgY2FuIGFsc28gYmUgYWNoaWV2ZWQgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGFueSBwcm9wZXJ0eSBvbiBhbiAnVW5jaGFuZ2VkJyBlbnRpdHkuXHJcbiAgVGhlIHNhbWUgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgY2FsbGluZyBbW0VudGl0eUFzcGVjdC5zZXRFbnRpdHlTdGF0ZV1dLlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIG9yZGVyLmVudGl0eUFzcGVjdC5zZXRNb2RpZmllZCgpO1xyXG4gID4gICAgICAvLyBUaGUgJ29yZGVyJyBlbnRpdHkgd2lsbCBub3cgYmUgaW4gYSAnTW9kaWZpZWQnIHN0YXRlLlxyXG4gICoqL1xyXG4gIHNldE1vZGlmaWVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RW50aXR5U3RhdGUoRW50aXR5U3RhdGUuTW9kaWZpZWQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFNldHMgdGhlIGVudGl0eSB0byBhbiBFbnRpdHlTdGF0ZSBvZiAnRGVsZXRlZCcuICBUaGlzIGJvdGggbWFya3MgdGhlIGVudGl0eSBhcyBiZWluZyBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIGR1cmluZyB0aGUgbmV4dCAnU2F2ZScgY2FsbFxyXG4gIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGVudGl0eSBmcm9tIGFsbCBvZiBpdHMgcmVsYXRlZCBlbnRpdGllcy5cclxuICBUaGUgc2FtZSBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBieSBjYWxsaW5nIFtbRW50aXR5QXNwZWN0LnNldEVudGl0eVN0YXRlXV0uXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LnNldERlbGV0ZWQoKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGEgJ0RlbGV0ZWQnIHN0YXRlIGFuZCBpdCB3aWxsIG5vIGxvbmdlciBoYXZlIGFueSAncmVsYXRlZCcgZW50aXRpZXMuXHJcbiAgKiovXHJcbiAgc2V0RGVsZXRlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLnNldEVudGl0eVN0YXRlKEVudGl0eVN0YXRlLkRlbGV0ZWQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFNldHMgdGhlIGVudGl0eSB0byBhbiBFbnRpdHlTdGF0ZSBvZiAnRGV0YWNoZWQnLiAgVGhpcyByZW1vdmVzIHRoZSBlbnRpdHkgZnJvbSBhbGwgb2YgaXRzIHJlbGF0ZWQgZW50aXRpZXMsIGJ1dCBkb2VzIE5PVCBjaGFuZ2UgdGhlIEVudGl0eVN0YXRlIG9mIGFueSBleGlzdGluZyBlbnRpdGllcy5cclxuICBUaGUgc2FtZSBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBieSBjYWxsaW5nIFtbRW50aXR5QXNwZWN0LnNldEVudGl0eVN0YXRlXV0uXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LnNldERldGFjaGVkKCk7XHJcbiAgPiAgICAgIC8vIFRoZSAnb3JkZXInIGVudGl0eSB3aWxsIG5vdyBiZSBpbiBhICdEZXRhY2hlZCcgc3RhdGUgYW5kIGl0IHdpbGwgbm8gbG9uZ2VyIGhhdmUgYW55ICdyZWxhdGVkJyBlbnRpdGllcy5cclxuICAqKi9cclxuICBzZXREZXRhY2hlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLnNldEVudGl0eVN0YXRlKEVudGl0eVN0YXRlLkRldGFjaGVkKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBTZXRzIHRoZSBlbnRpdHkgdG8gdGhlIHNwZWNpZmllZCBFbnRpdHlTdGF0ZS4gU2VlIGFsc28gJ3NldFVuY2hhbmdlZCcsICdzZXRNb2RpZmllZCcsICdzZXREZXRhY2hlZCcsIGV0Yy5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3Quc2V0RW50aXR5U3RhdGUoRW50aXR5U3RhdGUuVW5jaGFuZ2VkKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGEgJ1VuY2hhbmdlZCcgc3RhdGUuXHJcbiAgKiovXHJcbiAgc2V0RW50aXR5U3RhdGUoZW50aXR5U3RhdGU6IEVudGl0eVN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5lbnRpdHlTdGF0ZSA9PT0gZW50aXR5U3RhdGUpIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2NoZWNrT3BlcmF0aW9uKFwic2V0RW50aXR5U3RhdGVcIik7XHJcbiAgICBpZiAodGhpcy5lbnRpdHlTdGF0ZS5pc0RldGFjaGVkKCkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBzZXQgdGhlICdlbnRpdHlTdGF0ZScgb2YgYW4gZW50aXR5IHdoZW4gaXQgaXMgZGV0YWNoZWQgLSBleGNlcHQgYnkgZmlyc3QgYXR0YWNoaW5nIGl0IHRvIGFuIEVudGl0eU1hbmFnZXJcIik7XHJcbiAgICB9XHJcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5lbnRpdHkhO1xyXG4gICAgbGV0IGVtID0gdGhpcy5lbnRpdHlNYW5hZ2VyITtcclxuICAgIGxldCBuZWVkc1NhdmUgPSB0cnVlO1xyXG4gICAgaWYgKGVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQpIHtcclxuICAgICAgY2xlYXJPcmlnaW5hbFZhbHVlcyhlbnRpdHkpO1xyXG4gICAgICBkZWxldGUgdGhpcy5oYXNUZW1wS2V5O1xyXG4gICAgICBuZWVkc1NhdmUgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLkFkZGVkKSB7XHJcbiAgICAgIGNsZWFyT3JpZ2luYWxWYWx1ZXMoZW50aXR5KTtcclxuICAgICAgLy8gVE9ETzogbW9yZSB0byBkbyBoZXJlLi4uIGxpa2UgcmVnZW5lcmF0aW5nIGtleSA/Pz9cclxuICAgIH0gZWxzZSBpZiAoZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLkRlbGV0ZWQpIHtcclxuICAgICAgaWYgKHRoaXMuZW50aXR5U3RhdGUuaXNBZGRlZCgpKSB7XHJcbiAgICAgICAgLy8gdHVybiBpdCBpbnRvIGEgZGV0YWNoIGFuZCBleGl0IGVhcmx5XHJcbiAgICAgICAgdGhpcy5zZXRFbnRpdHlTdGF0ZShFbnRpdHlTdGF0ZS5EZXRhY2hlZCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgY2FzY2FkZSBkZWxldGVzXHJcbiAgICAgICAgLy8gZW50aXR5U3RhdGUgbmVlZHMgdG8gYmUgc2V0IGl0IGVhcmx5IGluIHRoaXMgb25lIGNhc2UgdG8gaW5zdXJlIHRoYXQgZmsncyBhcmUgbm90IGNsZWFyZWQuXHJcbiAgICAgICAgdGhpcy5lbnRpdHlTdGF0ZSA9IEVudGl0eVN0YXRlLkRlbGV0ZWQ7XHJcbiAgICAgICAgcmVtb3ZlRnJvbVJlbGF0aW9ucyhlbnRpdHksIEVudGl0eVN0YXRlLkRlbGV0ZWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZCkge1xyXG4gICAgICAvLyBub3RoaW5nIGV4dHJhIG5lZWRlZFxyXG4gICAgfSBlbHNlIGlmIChlbnRpdHlTdGF0ZSA9PT0gRW50aXR5U3RhdGUuRGV0YWNoZWQpIHtcclxuICAgICAgbGV0IGdyb3VwID0gdGhpcy5lbnRpdHlHcm91cDtcclxuICAgICAgLy8gbm8gZ3JvdXAgPT09IGFscmVhZHkgZGV0YWNoZWQuXHJcbiAgICAgIGlmICghZ3JvdXApIHJldHVybiBmYWxzZTtcclxuICAgICAgZ3JvdXAuZGV0YWNoRW50aXR5KGVudGl0eSk7XHJcbiAgICAgIC8vIG5lZWRzIHRvIG9jY3VyIGVhcmx5IGhlcmUgLSBzbyB0aGlzIElTIGRlbGliZXJhdGVseSByZWR1bmRlbnQgd2l0aCB0aGUgc2FtZSBjb2RlIGxhdGVyIGluIHRoaXMgbWV0aG9kLlxyXG4gICAgICB0aGlzLmVudGl0eVN0YXRlID0gZW50aXR5U3RhdGU7XHJcbiAgICAgIHJlbW92ZUZyb21SZWxhdGlvbnMoZW50aXR5LCBFbnRpdHlTdGF0ZS5EZXRhY2hlZCk7XHJcbiAgICAgIHRoaXMuX2RldGFjaCgpO1xyXG4gICAgICBlbS5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5EZXRhY2gsIGVudGl0eTogZW50aXR5IH0pO1xyXG4gICAgICBuZWVkc1NhdmUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5U3RhdGUgPSBlbnRpdHlTdGF0ZTtcclxuICAgIGVtLl9ub3RpZnlTdGF0ZUNoYW5nZShlbnRpdHksIG5lZWRzU2F2ZSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGxvYWROYXZpZ2F0aW9uUHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIGNhbGxiYWNrPzogUXVlcnlTdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBRdWVyeUVycm9yQ2FsbGJhY2spOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PjtcclxuICBsb2FkTmF2aWdhdGlvblByb3BlcnR5KG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5LCBjYWxsYmFjaz86IFF1ZXJ5U3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrPzogUXVlcnlFcnJvckNhbGxiYWNrKTogUHJvbWlzZTxRdWVyeVJlc3VsdD47XHJcbiAgLyoqXHJcbiAgUGVyZm9ybXMgYSBxdWVyeSBmb3IgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIFtbTmF2aWdhdGlvblByb3BlcnR5XV0uIF9fQXN5bmNfX1xyXG4gID4gICAgICBlbXAuZW50aXR5QXNwZWN0LmxvYWROYXZpZ2F0aW9uUHJvcGVydHkoXCJPcmRlcnNcIikudGhlbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gID4gICAgICAgICAgdmFyIG9yZGVycyA9IGRhdGEucmVzdWx0cztcclxuICA+ICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGV4Y2VwdGlvbikge1xyXG4gID4gICAgICAgICAgLy8gaGFuZGxlIGV4Y2VwdGlvbiBoZXJlO1xyXG4gID4gICAgICB9KTtcclxuICBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5IC0gVGhlIE5hdmlnYXRpb25Qcm9wZXJ0eSBvciB0aGUgbmFtZSBvZiB0aGUgTmF2aWdhdGlvblByb3BlcnR5IHRvICdsb2FkJy5cclxuICBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3MuXHJcbiAgQHBhcmFtIGVycm9yQ2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIG9uIGZhaWx1cmUuXHJcbiAgQHJldHVybiBQcm9taXNlIHdpdGggc2hhcGVcclxuICAgIC0gcmVzdWx0cyB7QXJyYXkgb2YgRW50aXR5fVxyXG4gICAgLSBxdWVyeSB7RW50aXR5UXVlcnl9IFRoZSBvcmlnaW5hbCBxdWVyeVxyXG4gICAgLSBodHRwUmVzcG9uc2Uge2h0dHBSZXNwb25zZX0gVGhlIEh0dHBSZXNwb25zZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgKiovXHJcbiAgbG9hZE5hdmlnYXRpb25Qcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHN0cmluZywgY2FsbGJhY2s6IFF1ZXJ5U3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrOiBRdWVyeUVycm9yQ2FsbGJhY2spIHtcclxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eSE7XHJcbiAgICBsZXQgbmF2UHJvcGVydHkgPSBlbnRpdHkuZW50aXR5VHlwZS5fY2hlY2tOYXZQcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0eU5hdmlnYXRpb24oZW50aXR5LCBuYXZQcm9wZXJ0eSk7XHJcbiAgICAvLyByZXR1cm4gZW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyLmV4ZWN1dGVRdWVyeShxdWVyeSwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xyXG4gICAgbGV0IHByb21pc2UgPSBlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXIhLmV4ZWN1dGVRdWVyeShxdWVyeSk7XHJcblxyXG4gICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLl9tYXJrQXNMb2FkZWQobmF2UHJvcGVydHkubmFtZSk7XHJcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soZXJyb3IpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgTWFya3MgdGhpcyBuYXZpZ2F0aW9uUHJvcGVydHkgb24gdGhpcyBlbnRpdHkgYXMgYWxyZWFkeSBoYXZpbmcgYmVlbiBsb2FkZWQuXHJcbiAgPiAgICAgIGVtcC5lbnRpdHlBc3BlY3QubWFya05hdmlnYXRpb25Qcm9wZXJ0eUFzTG9hZGVkKFwiT3JkZXJzXCIpO1xyXG4gIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgLSBUaGUgTmF2aWdhdGlvblByb3BlcnR5IG9yIG5hbWUgb2YgTmF2aWdhdGlvblByb3BlcnR5IHRvICdsb2FkJy5cclxuICAqKi9cclxuICBtYXJrTmF2aWdhdGlvblByb3BlcnR5QXNMb2FkZWQobmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkgfCBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHJldHVybjtcclxuICAgIGxldCBuYXZQcm9wZXJ0eSA9IHRoaXMuZW50aXR5LmVudGl0eVR5cGUuX2NoZWNrTmF2UHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5KTtcclxuICAgIHRoaXMuX21hcmtBc0xvYWRlZChuYXZQcm9wZXJ0eS5uYW1lKTtcclxuICB9XHJcblxyXG4gIGlzTmF2aWdhdGlvblByb3BlcnR5TG9hZGVkKG5hdmlnYXRpb25Qcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbjtcclxuICBpc05hdmlnYXRpb25Qcm9wZXJ0eUxvYWRlZChuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSk6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmF2aWdhdGlvblByb3BlcnR5IG9uIHRoaXMgZW50aXR5IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLlxyXG5cclxuICBBIG5hdmlnYXRpb24gcHJvcGVydHkgaXMgY29uc2lkZXJlZCBsb2FkZWQgd2hlbiBhbnkgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBjb25kaXRpb25zIGFwcGxpZXM6XHJcblxyXG4gICAgMS4gSXQgd2FzIGZldGNoZWQgZnJvbSB0aGUgYmFja2VuZCBzZXJ2ZXIuXHJcbiAgICAgICAgPGJyLz4gICBUaGlzIGNhbiBiZSB0aGUgcmVzdWx0IG9mIGFuIGV4cGFuZCBxdWVyeSBvciBhIGNhbGwgdG8gdGhlIFtbRW50aXR5QXNwZWN0LmxvYWROYXZpZ2F0aW9uUHJvcGVydHldXSBtZXRob2QuXHJcbiAgICAgICAgPGJyLz4gICBOb3RlIHRoYXQgZXZlbiBpZiB0aGUgZmV0Y2ggcmV0dXJucyBub3RoaW5nIHRoZSBwcm9wZXJ0eSBpcyBzdGlsbCBtYXJrZWQgYXMgbG9hZGVkIGluIHRoaXMgY2FzZS5cclxuICAgIDEuIFRoZSBwcm9wZXJ0eSBpcyBzY2FsYXIgYW5kIGhhcyBiZWVuIHNldCB0byBhIG5vbm51bGwgdmFsdWUuXHJcbiAgICAxLiBUaGUgW1tFbnRpdHlBc3BlY3QubWFya05hdmlnYXRpb25Qcm9wZXJ0eUFzTG9hZGVkXV0gd2FzIGNhbGxlZC5cclxuICBcclxuICA+ICAgICB2YXIgd2FzTG9hZGVkID0gZW1wLmVudGl0eUFzcGVjdC5pc05hdmlnYXRpb25Qcm9wZXJ0eUxvYWRlZChcIk9yZGVyc1wiKTtcclxuICBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5IC0gVGhlIE5hdmlnYXRpb25Qcm9wZXJ0eSBvciBuYW1lIG9mIE5hdmlnYXRpb25Qcm9wZXJ0eSB0byAnbG9hZCcuXHJcbiAgKiovXHJcbiAgaXNOYXZpZ2F0aW9uUHJvcGVydHlMb2FkZWQobmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkgfCBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHJldHVybjtcclxuICAgIGxldCBuYXZQcm9wZXJ0eSA9IHRoaXMuZW50aXR5LmVudGl0eVR5cGUuX2NoZWNrTmF2UHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5KTtcclxuICAgIGlmIChuYXZQcm9wZXJ0eS5pc1NjYWxhciAmJiB0aGlzLmVudGl0eS5nZXRQcm9wZXJ0eShuYXZQcm9wZXJ0eS5uYW1lKSAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZE5wcyAmJiB0aGlzLl9sb2FkZWROcHMuaW5kZXhPZihuYXZQcm9wZXJ0eS5uYW1lKSA+PSAwO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX21hcmtBc0xvYWRlZChuYXZQcm9wTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9sb2FkZWROcHMgPSB0aGlzLl9sb2FkZWROcHMgfHwgW107XHJcbiAgICBjb3JlLmFycmF5QWRkSXRlbVVuaXF1ZSh0aGlzLl9sb2FkZWROcHMsIG5hdlByb3BOYW1lKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICBQZXJmb3JtcyB2YWxpZGF0aW9uIG9uIHRoZSBlbnRpdHksIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIGFyZSBhdmFpbGFibGUgdmlhIHRoZVxyXG4gIFtbRW50aXR5QXNwZWN0LmdldFZhbGlkYXRpb25FcnJvcnNdXSBtZXRob2QuIFZhbGlkYXRpbmcgYW4gZW50aXR5IG1lYW5zIGV4ZWN1dGluZ1xyXG4gIGFsbCBvZiB0aGUgdmFsaWRhdG9ycyBvbiBib3RoIHRoZSBlbnRpdHkgaXRzZWxmIGFzIHdlbGwgYXMgdGhvc2Ugb24gZWFjaCBvZiBpdHMgcHJvcGVydGllcy5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICB2YXIgaXNPayA9IG9yZGVyLmVudGl0eUFzcGVjdC52YWxpZGF0ZUVudGl0eSgpO1xyXG4gID4gICAgICAvLyBpc09rIHdpbGwgYmUgJ3RydWUnIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMgb24gdGhlIGVudGl0eS5cclxuICA+ICAgICAgaWYgKCFpc09rKSB7XHJcbiAgPiAgICAgICAgICB2YXIgZXJyb3JzID0gb3JkZXIuZW50aXR5QXNwZWN0LmdldFZhbGlkYXRpb25FcnJvcnMoKTtcclxuICA+ICAgICAgfVxyXG4gIEByZXR1cm4gV2hldGhlciB0aGUgZW50aXR5IHBhc3NlZCB2YWxpZGF0aW9uLlxyXG4gICoqL1xyXG4gIHZhbGlkYXRlRW50aXR5KCkge1xyXG4gICAgbGV0IG9rID0gdHJ1ZTtcclxuICAgIHRoaXMuX3Byb2Nlc3NWYWxpZGF0aW9uT3BBbmRQdWJsaXNoKGZ1bmN0aW9uICh0aGF0OiBhbnkpIHtcclxuICAgICAgb2sgPSB2YWxpZGF0ZVRhcmdldCh0aGF0LmVudGl0eSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvaztcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgY29udGV4dD86IGFueSk6IGJvb2xlYW47XHJcbiAgdmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eTogRGF0YVByb3BlcnR5LCBjb250ZXh0PzogYW55KTogYm9vbGVhbjtcclxuICB2YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHksIGNvbnRleHQ/OiBhbnkpOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gIFBlcmZvcm1zIHZhbGlkYXRpb24gb24gYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiB0aGlzIGVudGl0eSwgYW55IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gYXJlIGF2YWlsYWJsZSB2aWEgdGhlXHJcbiAgW1tFbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9yc11dIG1ldGhvZC4gVmFsaWRhdGluZyBhIHByb3BlcnR5IG1lYW5zIGV4ZWN1dGluZ1xyXG4gIGFsbCBvZiB0aGUgdmFsaWRhdG9ycyBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiAgVGhpcyBjYWxsIGlzIGFsc28gbWFkZSBhdXRvbWF0aWNhbGx5IGFueXRpbWUgYSBwcm9wZXJ0eVxyXG4gIG9mIGFuIGVudGl0eSBpcyBjaGFuZ2VkLlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIHZhciBpc09rID0gb3JkZXIuZW50aXR5QXNwZWN0LnZhbGlkYXRlUHJvcGVydHkoXCJPcmRlclwiKTtcclxuXHJcbiAgb3JcclxuICA+ICAgICAgdmFyIG9yZGVyRGF0ZVByb3BlcnR5ID0gb3JkZXIuZW50aXR5VHlwZS5nZXRQcm9wZXJ0eShcIk9yZGVyRGF0ZVwiKTtcclxuICA+ICAgICAgdmFyIGlzT2sgPSBvcmRlci5lbnRpdHlBc3BlY3QudmFsaWRhdGVQcm9wZXJ0eShPcmRlckRhdGVQcm9wZXJ0eSk7XHJcbiAgQHBhcmFtIHByb3BlcnR5IC0gVGhlIFtbRGF0YVByb3BlcnR5XV0gb3IgW1tOYXZpZ2F0aW9uUHJvcGVydHldXSB0byB2YWxpZGF0ZSBvciBhIHN0cmluZyBcclxuICB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBhIHByb3BlcnR5IHBhdGggd2l0aCB0aGUgcGF0aCB0byBhIHByb3BlcnR5IG9mIGEgY29tcGxleCBvYmplY3QuXHJcbiAgQHBhcmFtIGNvbnRleHQgLSAgQSBjb250ZXh0IG9iamVjdCB1c2VkIHRvIHBhc3MgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBlYWNoIFtbVmFsaWRhdG9yXV0uXHJcbiAgQHJldHVybiBXaGV0aGVyIHRoZSBlbnRpdHkgcGFzc2VkIHZhbGlkYXRpb24uXHJcbiAgKiovXHJcbiAgdmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eTogRW50aXR5UHJvcGVydHkgfCBzdHJpbmcsIGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTsgLy8gcGVyZm9ybXMgdmFsaWRhdGlvbnNcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5jb21wbGV4QXNwZWN0KSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0ZVRhcmdldCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcclxuICAgIGNvbnRleHQuZW50aXR5ID0gdGhpcy5lbnRpdHk7XHJcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGNvbnRleHQucHJvcGVydHkgPSB0aGlzLmVudGl0eSEuZW50aXR5VHlwZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdHJ1ZSk7XHJcbiAgICAgIGNvbnRleHQucHJvcGVydHlOYW1lID0gcHJvcGVydHk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb250ZXh0LnByb3BlcnR5ID0gcHJvcGVydHk7XHJcbiAgICAgIGNvbnRleHQucHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQcm9wZXJ0eSh2YWx1ZSwgY29udGV4dCk7XHJcbiAgfVxyXG5cclxuICBnZXRWYWxpZGF0aW9uRXJyb3JzKCk6IFZhbGlkYXRpb25FcnJvcltdO1xyXG4gIGdldFZhbGlkYXRpb25FcnJvcnMocHJvcGVydHk6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcltdO1xyXG4gIGdldFZhbGlkYXRpb25FcnJvcnMocHJvcGVydHk6IEVudGl0eVByb3BlcnR5KTogVmFsaWRhdGlvbkVycm9yW107XHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciB0aGUgZW50aXJlIGVudGl0eSBvciBhbnkgc3BlY2lmaWVkIHByb3BlcnR5LlxyXG4gIFxyXG4gIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gYWxsIG9mIHRoZSBlcnJvcnMgZm9yIGFuIEVudGl0eVxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIHZhciB2YWxFcnJvcnMgPSBvcmRlci5lbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG5cclxuICBhcyB3ZWxsIGFzIHRob3NlIGZvciBqdXN0IGEgc3BlY2lmaWMgcHJvcGVydHkuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgdmFyIG9yZGVyRGF0ZUVycm9ycyA9IG9yZGVyLmVudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzKFwiT3JkZXJEYXRlXCIpO1xyXG5cclxuICB3aGljaCBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXNcclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICB2YXIgb3JkZXJEYXRlUHJvcGVydHkgPSBvcmRlci5lbnRpdHlUeXBlLmdldFByb3BlcnR5KFwiT3JkZXJEYXRlXCIpO1xyXG4gID4gICAgICB2YXIgb3JkZXJEYXRlRXJyb3JzID0gb3JkZXIuZW50aXR5QXNwZWN0LmdldFZhbGlkYXRpb25FcnJvcnMob3JkZXJEYXRlUHJvcGVydHkpO1xyXG4gIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdmFsaWRhdGlvbiBlcnJvcnMgc2hvdWxkIGJlIHJldHJpZXZlZC5cclxuICBJZiBvbWl0dGVkLCBhbGwgb2YgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGZvciB0aGlzIGVudGl0eSB3aWxsIGJlIHJldHVybmVkLlxyXG4gIEByZXR1cm4gQSBhcnJheSBvZiB2YWxpZGF0aW9uIGVycm9ycy5cclxuICAqKi9cclxuICBnZXRWYWxpZGF0aW9uRXJyb3JzKHByb3BlcnR5PzogRGF0YVByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5IHwgc3RyaW5nKSB7XHJcbiAgICBhc3NlcnRQYXJhbShwcm9wZXJ0eSwgXCJwcm9wZXJ0eVwiKS5pc09wdGlvbmFsKCkuaXNFbnRpdHlQcm9wZXJ0eSgpLm9yKCkuaXNTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgbGV0IHJlc3VsdCA9IGNvcmUuZ2V0T3duUHJvcGVydHlWYWx1ZXModGhpcy5fdmFsaWRhdGlvbkVycm9ycyk7XHJcbiAgICBpZiAocHJvcGVydHkpIHtcclxuICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHR5cGVvZiAocHJvcGVydHkpID09PSAnc3RyaW5nJyA/IHByb3BlcnR5IDogcHJvcGVydHkubmFtZTtcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodmU6IFZhbGlkYXRpb25FcnJvcikge1xyXG4gICAgICAgIHJldHVybiB2ZS5wcm9wZXJ0eSAmJiAodmUucHJvcGVydHkubmFtZSA9PT0gcHJvcGVydHlOYW1lIHx8IChwcm9wZXJ0eU5hbWUuaW5kZXhPZihcIi5cIikgIT09IC0xICYmIHZlLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlOYW1lKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEFkZHMgYSB2YWxpZGF0aW9uIGVycm9yLlxyXG4gICoqL1xyXG4gIGFkZFZhbGlkYXRpb25FcnJvcih2YWxpZGF0aW9uRXJyb3I6IFZhbGlkYXRpb25FcnJvcikge1xyXG4gICAgYXNzZXJ0UGFyYW0odmFsaWRhdGlvbkVycm9yLCBcInZhbGlkYXRpb25FcnJvclwiKS5pc0luc3RhbmNlT2YoVmFsaWRhdGlvbkVycm9yKS5jaGVjaygpO1xyXG4gICAgdGhpcy5fcHJvY2Vzc1ZhbGlkYXRpb25PcEFuZFB1Ymxpc2goZnVuY3Rpb24gKHRoYXQ6IGFueSkge1xyXG4gICAgICB0aGF0Ll9hZGRWYWxpZGF0aW9uRXJyb3IodmFsaWRhdGlvbkVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25FcnJvcjogVmFsaWRhdGlvbkVycm9yKTogdm9pZDtcclxuICByZW1vdmVWYWxpZGF0aW9uRXJyb3IodmFsaWRhdGlvbktleTogc3RyaW5nKTogdm9pZDtcclxuICAvKipcclxuICBSZW1vdmVzIGEgdmFsaWRhdGlvbiBlcnJvci5cclxuICBAcGFyYW0gdmFsaWRhdGlvbkVycm9yT3JLZXkgLSBFaXRoZXIgYSBWYWxpZGF0aW9uRXJyb3Igb3IgYSBWYWxpZGF0aW9uRXJyb3IgJ2tleScgdmFsdWVcclxuICAqKi9cclxuICByZW1vdmVWYWxpZGF0aW9uRXJyb3IodmFsaWRhdGlvbkVycm9yT3JLZXk6IFZhbGlkYXRpb25FcnJvciB8IHN0cmluZykge1xyXG4gICAgYXNzZXJ0UGFyYW0odmFsaWRhdGlvbkVycm9yT3JLZXksIFwidmFsaWRhdGlvbkVycm9yT3JLZXlcIikuaXNTdHJpbmcoKS5vcigpLmlzSW5zdGFuY2VPZihWYWxpZGF0aW9uRXJyb3IpLm9yKCkuaXNJbnN0YW5jZU9mKFZhbGlkYXRvcikuY2hlY2soKTtcclxuXHJcbiAgICBsZXQga2V5ID0gKHR5cGVvZiAodmFsaWRhdGlvbkVycm9yT3JLZXkpID09PSBcInN0cmluZ1wiKSA/IHZhbGlkYXRpb25FcnJvck9yS2V5IDogdmFsaWRhdGlvbkVycm9yT3JLZXkua2V5O1xyXG4gICAgdGhpcy5fcHJvY2Vzc1ZhbGlkYXRpb25PcEFuZFB1Ymxpc2goZnVuY3Rpb24gKHRoYXQ6IGFueSkge1xyXG4gICAgICB0aGF0Ll9yZW1vdmVWYWxpZGF0aW9uRXJyb3Ioa2V5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmVtb3ZlcyBhbGwgb2YgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGZvciBhIHNwZWNpZmllZCBlbnRpdHlcclxuICAqKi9cclxuICBjbGVhclZhbGlkYXRpb25FcnJvcnMoKSB7XHJcbiAgICB0aGlzLl9wcm9jZXNzVmFsaWRhdGlvbk9wQW5kUHVibGlzaChmdW5jdGlvbiAodGhhdDogYW55KSB7XHJcbiAgICAgIGNvcmUub2JqZWN0Rm9yRWFjaCh0aGF0Ll92YWxpZGF0aW9uRXJyb3JzLCBmdW5jdGlvbiAoa2V5OiBzdHJpbmcsIHZhbEVycm9yOiBWYWxpZGF0aW9uRXJyb3IpIHtcclxuICAgICAgICBpZiAodmFsRXJyb3IpIHtcclxuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll92YWxpZGF0aW9uRXJyb3JzW2tleV07XHJcbiAgICAgICAgICB0aGF0Ll9wZW5kaW5nVmFsaWRhdGlvblJlc3VsdC5yZW1vdmVkLnB1c2godmFsRXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoYXQuaGFzVmFsaWRhdGlvbkVycm9ycyA9ICFjb3JlLmlzRW1wdHkodGhhdC5fdmFsaWRhdGlvbkVycm9ycyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYW4gW1tFbnRpdHlLZXldXSBmb3IgdGhlIGVudGl0eSBwb2ludGVkIHRvIGJ5IHRoZSBzcGVjaWZpZWQgc2NhbGFyIE5hdmlnYXRpb25Qcm9wZXJ0eS5cclxuICBUaGlzIG9ubHkgcmV0dXJucyBhbiBFbnRpdHlLZXkgaWYgdGhlIGN1cnJlbnQgZW50aXR5IGlzIGEgJ2NoaWxkJyBlbnRpdHkgYWxvbmcgdGhlIHNwZWNpZmllZCBOYXZpZ2F0aW9uUHJvcGVydHkuIFxyXG4gIGkuZS4gaGFzIGEgc2luZ2xlIHBhcmVudC5cclxuXHJcbiAgQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSAtIFRoZSBbW05hdmlnYXRpb25Qcm9wZXJ0eV1dICggcG9pbnRpbmcgdG8gYSBwYXJlbnQpLiBcclxuICBAcmV0dXJucyBFaXRoZXIgYSBwYXJlbnQgRW50aXR5S2V5IGlmIHRoaXMgaXMgYSAnY2hpbGQnIGVudGl0eSBvciBudWxsOyAgXHJcbiAgKi9cclxuICBnZXRQYXJlbnRLZXkobmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHJldHVybiBudWxsO1xyXG4gICAgLy8gVE9ETzogcmV2aWV3IHRoaXMgLSBub3Qgc3VyZSBhYm91dCB0aGUgY29tbWVudC5cclxuICAgIC8vIE5hdmlnYXRpb25Qcm9wZXJ0eSBkb2Vzbid0IHlldCBleGlzdFxyXG4gICAgLy8gYXNzZXJ0UGFyYW0obmF2aWdhdGlvblByb3BlcnR5LCBcIm5hdmlnYXRpb25Qcm9wZXJ0eVwiKS5pc0luc3RhbmNlT2YoTmF2aWdhdGlvblByb3BlcnR5KS5jaGVjaygpO1xyXG4gICAgbGV0IGZrTmFtZXMgPSBuYXZpZ2F0aW9uUHJvcGVydHkuZm9yZWlnbktleU5hbWVzO1xyXG4gICAgaWYgKGZrTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCB0aGF0ID0gdGhpcztcclxuICAgIGxldCBma1ZhbHVlcyA9IGZrTmFtZXMubWFwKGZ1bmN0aW9uIChma24pIHtcclxuICAgICAgcmV0dXJuIHRoYXQuZW50aXR5IS5nZXRQcm9wZXJ0eShma24pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmV3IEVudGl0eUtleShuYXZpZ2F0aW9uUHJvcGVydHkuZW50aXR5VHlwZSwgZmtWYWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBhbmQgdGhlIHN0YXRpYyBnZXRQcm9wZXJ0eVBhdGhWYWx1ZS5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBEYXRhUHJvcGVydHkgb3IgTmF2aWdhdGlvblByb3BlcnR5IG9yICdwcm9wZXJ0eSBwYXRoJy4gIFxyXG4gICoqL1xyXG4gIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IHN0cmluZyB8IERhdGFQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gICAgYXNzZXJ0UGFyYW0ocHJvcGVydHksIFwicHJvcGVydHlcIikuaXNTdHJpbmcoKS5vcigpLmlzRW50aXR5UHJvcGVydHkoKS5jaGVjaygpO1xyXG4gICAgbGV0IHZhbHVlOiBhbnk7XHJcbiAgICBpZiAodHlwZW9mIChwcm9wZXJ0eSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGxldCBwcm9wTmFtZXMgPSBwcm9wZXJ0eS50cmltKCkuc3BsaXQoXCIuXCIpO1xyXG4gICAgICBsZXQgcHJvcE5hbWUgPSBwcm9wTmFtZXMuc2hpZnQoKTtcclxuICAgICAgdmFsdWUgPSB0aGlzLmVudGl0eTtcclxuICAgICAgdmFsdWUgPSB2YWx1ZS5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7XHJcbiAgICAgIHdoaWxlIChwcm9wTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHByb3BOYW1lID0gcHJvcE5hbWVzLnNoaWZ0KCk7XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghKHByb3BlcnR5LnBhcmVudFR5cGUgaW5zdGFuY2VvZiBFbnRpdHlUeXBlKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB2YWxpZGF0ZVByb3BlcnR5IG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgYSAncHJvcGVydHknIHBhcmFtZXRlciB3aG9zZSBwYXJlbnRUeXBlIGlzIGEgQ29tcGxleFR5cGU7IFwiICtcclxuICAgICAgICAgIFwiUGFzcyBhICdwcm9wZXJ0eSBwYXRoJyBzdHJpbmcgYXMgdGhlICdwcm9wZXJ0eScgcGFyYW1ldGVyIGluc3RlYWQgXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbHVlID0gdGhpcy5lbnRpdHkhLmdldFByb3BlcnR5KHByb3BlcnR5Lm5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gaW50ZXJuYWwgbWV0aG9kc1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9jaGVja09wZXJhdGlvbihvcGVyYXRpb25OYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmlzQmVpbmdTYXZlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGVyZm9ybSBhICdcIiArIG9wZXJhdGlvbk5hbWUgKyBcIicgb24gYW4gZW50aXR5IHRoYXQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc2F2ZWRcIik7XHJcbiAgICB9XHJcbiAgICAvLyBhbGxvd3MgY2hhaW5pbmdcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2RldGFjaCgpIHtcclxuICAgIHRoaXMuZW50aXR5R3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVudGl0eU1hbmFnZXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVudGl0eVN0YXRlID0gRW50aXR5U3RhdGUuRGV0YWNoZWQ7XHJcbiAgICB0aGlzLm9yaWdpbmFsVmFsdWVzID0ge307XHJcbiAgICB0aGlzLl92YWxpZGF0aW9uRXJyb3JzID0ge307XHJcbiAgICB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSBmYWxzZTtcclxuICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc0NoYW5nZWQuY2xlYXIoKTtcclxuICAgIHRoaXMucHJvcGVydHlDaGFuZ2VkLmNsZWFyKCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGNhbGxlZCBmcm9tIGRlZmF1bHRJbnRlcmNlcHRvci5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfdmFsaWRhdGVQcm9wZXJ0eSh2YWx1ZTogYW55LCBjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCBvayA9IHRydWU7XHJcbiAgICB0aGlzLl9wcm9jZXNzVmFsaWRhdGlvbk9wQW5kUHVibGlzaChmdW5jdGlvbiAodGhhdDogYW55KSB7XHJcbiAgICAgIGNvbnRleHQucHJvcGVydHkuZ2V0QWxsVmFsaWRhdG9ycygpLmZvckVhY2goZnVuY3Rpb24gKHZhbGlkYXRvcjogVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgb2sgPSB2YWxpZGF0ZSh0aGF0LCB2YWxpZGF0b3IsIHZhbHVlLCBjb250ZXh0KSAmJiBvaztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvaztcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9wcm9jZXNzVmFsaWRhdGlvbk9wQW5kUHVibGlzaCh2YWxpZGF0aW9uRm46IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0KSB7XHJcbiAgICAgIC8vIG9ubHkgdG9wIGxldmVsIHByb2Nlc3NWYWxpZGF0aW9ucyBjYWxsIHB1Ymxpc2hlc1xyXG4gICAgICB2YWxpZGF0aW9uRm4odGhpcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0ID0geyBlbnRpdHk6IHRoaXMuZW50aXR5LCBhZGRlZDogW10sIHJlbW92ZWQ6IFtdIH07XHJcbiAgICAgICAgdmFsaWRhdGlvbkZuKHRoaXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nVmFsaWRhdGlvblJlc3VsdC5hZGRlZC5sZW5ndGggPiAwIHx8IHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0LnJlbW92ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZC5wdWJsaXNoKHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBkZXRhY2hlZCBlbnRpdHkgaGVuY2UgdGhlIGd1YXJkIGJlbG93LlxyXG4gICAgICAgICAgdGhpcy5lbnRpdHlNYW5hZ2VyICYmIHRoaXMuZW50aXR5TWFuYWdlci52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZC5wdWJsaXNoKHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0KTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICAvLyBUT0RPOiBhZGQvdXNlIGEgVmFsaWRhdGlvbkVycm9yIHR5cGVcclxuICBfYWRkVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25FcnJvcjogYW55KSB7XHJcbiAgICB0aGlzLl92YWxpZGF0aW9uRXJyb3JzW3ZhbGlkYXRpb25FcnJvci5rZXldID0gdmFsaWRhdGlvbkVycm9yO1xyXG4gICAgdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3JzID0gdHJ1ZTtcclxuICAgIHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0LmFkZGVkLnB1c2godmFsaWRhdGlvbkVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9yZW1vdmVWYWxpZGF0aW9uRXJyb3Ioa2V5OiBzdHJpbmcpIHtcclxuICAgIGxldCB2YWxFcnJvciA9IHRoaXMuX3ZhbGlkYXRpb25FcnJvcnNba2V5XTtcclxuICAgIGlmICh2YWxFcnJvcikge1xyXG4gICAgICBkZWxldGUgdGhpcy5fdmFsaWRhdGlvbkVycm9yc1trZXldO1xyXG4gICAgICB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSAhY29yZS5pc0VtcHR5KHRoaXMuX3ZhbGlkYXRpb25FcnJvcnMpO1xyXG4gICAgICB0aGlzLl9wZW5kaW5nVmFsaWRhdGlvblJlc3VsdC5yZW1vdmVkLnB1c2godmFsRXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbkJyZWV6ZUV2ZW50LmJ1YmJsZUV2ZW50KEVudGl0eUFzcGVjdC5wcm90b3R5cGUsIGZ1bmN0aW9uICgpIHtcclxuICByZXR1cm4gdGhpcy5lbnRpdHlNYW5hZ2VyO1xyXG59KTtcclxuXHJcbmZ1bmN0aW9uIHJlamVjdENoYW5nZXNDb3JlKHRhcmdldDogYW55KSB7XHJcbiAgbGV0IGFzcGVjdCA9IHRhcmdldC5lbnRpdHlBc3BlY3QgfHwgdGFyZ2V0LmNvbXBsZXhBc3BlY3Q7XHJcbiAgbGV0IHN0eXBlID0gdGFyZ2V0LmVudGl0eVR5cGUgfHwgdGFyZ2V0LmNvbXBsZXhUeXBlO1xyXG4gIGxldCBvcmlnaW5hbFZhbHVlcyA9IGFzcGVjdC5vcmlnaW5hbFZhbHVlcztcclxuICBmb3IgKGxldCBwcm9wTmFtZSBpbiBvcmlnaW5hbFZhbHVlcykge1xyXG4gICAgdGFyZ2V0LnNldFByb3BlcnR5KHByb3BOYW1lLCBvcmlnaW5hbFZhbHVlc1twcm9wTmFtZV0pO1xyXG4gIH1cclxuICBzdHlwZS5jb21wbGV4UHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChjcDogYW55KSB7XHJcbiAgICBsZXQgY29zID0gdGFyZ2V0LmdldFByb3BlcnR5KGNwLm5hbWUpO1xyXG4gICAgaWYgKGNwLmlzU2NhbGFyKSB7XHJcbiAgICAgIHJlamVjdENoYW5nZXNDb3JlKGNvcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb3MuX3JlamVjdENoYW5nZXMoKTtcclxuICAgICAgY29zLmZvckVhY2gocmVqZWN0Q2hhbmdlc0NvcmUpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVGcm9tUmVsYXRpb25zKGVudGl0eTogRW50aXR5LCBlbnRpdHlTdGF0ZTogRW50aXR5U3RhdGUpIHtcclxuICAvLyByZW1vdmUgdGhpcyBlbnRpdHkgZnJvbSBhbnkgY29sbGVjdGlvbnMuXHJcbiAgLy8gbWFyayB0aGUgZW50aXR5IGRlbGV0ZWQgb3IgZGV0YWNoZWRcclxuXHJcbiAgbGV0IGlzRGVsZXRlZCA9IGVudGl0eVN0YXRlLmlzRGVsZXRlZCgpO1xyXG4gIGlmIChpc0RlbGV0ZWQpIHtcclxuICAgIHJlbW92ZUZyb21SZWxhdGlvbnNDb3JlKGVudGl0eSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvcmUudXNpbmcoZW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyISwgXCJpc0xvYWRpbmdcIiwgdHJ1ZSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICByZW1vdmVGcm9tUmVsYXRpb25zQ29yZShlbnRpdHkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVGcm9tUmVsYXRpb25zQ29yZShlbnRpdHk6IEVudGl0eSkge1xyXG4gIGVudGl0eS5lbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKG5wKSB7XHJcbiAgICBsZXQgaW52ZXJzZU5wID0gbnAuaW52ZXJzZTtcclxuICAgIGxldCBucFZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KG5wLm5hbWUpO1xyXG4gICAgaWYgKG5wLmlzU2NhbGFyKSB7XHJcbiAgICAgIGlmIChucFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKGludmVyc2VOcCkge1xyXG4gICAgICAgICAgaWYgKGludmVyc2VOcC5pc1NjYWxhcikge1xyXG4gICAgICAgICAgICBucFZhbHVlLnNldFByb3BlcnR5KGludmVyc2VOcC5uYW1lLCBudWxsKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjb2xsZWN0aW9uID0gbnBWYWx1ZS5nZXRQcm9wZXJ0eShpbnZlcnNlTnAubmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGNvcmUuYXJyYXlSZW1vdmVJdGVtKGNvbGxlY3Rpb24sIGVudGl0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZW50aXR5LnNldFByb3BlcnR5KG5wLm5hbWUsIG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW52ZXJzZU5wICE9IG51bGwpIHtcclxuICAgICAgICAvLyBucFZhbHVlIGlzIGEgbGl2ZSBsaXN0IHNvIHdlIG5lZWQgdG8gY29weSBpdCBmaXJzdC5cclxuICAgICAgICBucFZhbHVlLnNsaWNlKDApLmZvckVhY2goKHY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGludmVyc2VOcCEuaXNTY2FsYXIpIHtcclxuICAgICAgICAgICAgdi5zZXRQcm9wZXJ0eShpbnZlcnNlTnAhLm5hbWUsIG51bGwpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVE9ETzogbWFueSB0byBtYW55IC0gbm90IHlldCBoYW5kbGVkLlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIG5vdyBjbGVhciBpdC5cclxuICAgICAgbnBWYWx1ZS5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxufVxyXG5cclxuLy8gbm90ZSBlbnRpdHlBc3BlY3Qgb25seSAtICggbm8gY29tcGxleCBhc3BlY3QgYWxsb3dlZCBvbiB0aGUgY2FsbCkuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlKGVudGl0eUFzcGVjdDogRW50aXR5QXNwZWN0LCB2YWxpZGF0b3I6IFZhbGlkYXRvciwgdmFsdWU6IGFueSwgY29udGV4dD86IGFueSkge1xyXG4gIGxldCB2ZSA9IHZhbGlkYXRvci52YWxpZGF0ZSh2YWx1ZSwgY29udGV4dCk7XHJcbiAgaWYgKHZlKSB7XHJcbiAgICBlbnRpdHlBc3BlY3QuX2FkZFZhbGlkYXRpb25FcnJvcih2ZSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBrZXkgPSBWYWxpZGF0aW9uRXJyb3IuZ2V0S2V5KHZhbGlkYXRvciwgY29udGV4dCA/IGNvbnRleHQucHJvcGVydHlOYW1lIDogbnVsbCk7XHJcbiAgICBlbnRpdHlBc3BlY3QuX3JlbW92ZVZhbGlkYXRpb25FcnJvcihrZXkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBjb0luZGV4IGlzIG9ubHkgdXNlZCB3aGVyZSB0YXJnZXQgaXMgYSBjb21wbGV4IG9iamVjdCB0aGF0IGlzIHBhcnQgb2YgYW4gYXJyYXkgb2YgY29tcGxleCBvYmplY3RzXHJcbi8vIGluIHdoaWNoIGNhc2UgY3RJbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIHRhcmdldCB3aXRoaW4gdGhlIGFycmF5LlxyXG5mdW5jdGlvbiB2YWxpZGF0ZVRhcmdldCh0YXJnZXQ6IGFueSwgY29JbmRleD86IG51bWJlcikge1xyXG4gIGxldCBvayA9IHRydWU7XHJcbiAgbGV0IHN0eXBlID0gdGFyZ2V0LmVudGl0eVR5cGUgfHwgdGFyZ2V0LmNvbXBsZXhUeXBlO1xyXG4gIGxldCBhc3BlY3QgPSB0YXJnZXQuZW50aXR5QXNwZWN0IHx8IHRhcmdldC5jb21wbGV4QXNwZWN0O1xyXG4gIGxldCBlbnRpdHlBc3BlY3QgPSB0YXJnZXQuZW50aXR5QXNwZWN0IHx8IHRhcmdldC5jb21wbGV4QXNwZWN0LmdldEVudGl0eUFzcGVjdCgpO1xyXG4gIGxldCBjb250ZXh0ID0gPGFueT57IGVudGl0eTogZW50aXR5QXNwZWN0LmVudGl0eSB9O1xyXG4gIGlmIChjb0luZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGNvbnRleHQuaW5kZXggPSBjb0luZGV4O1xyXG4gIH1cclxuXHJcbiAgc3R5cGUuZ2V0UHJvcGVydGllcygpLmZvckVhY2goZnVuY3Rpb24gKHA6IGFueSkge1xyXG4gICAgbGV0IHZhbHVlID0gdGFyZ2V0LmdldFByb3BlcnR5KHAubmFtZSk7XHJcbiAgICBsZXQgdmFsaWRhdG9ycyA9IHAuZ2V0QWxsVmFsaWRhdG9ycygpO1xyXG4gICAgaWYgKHZhbGlkYXRvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb250ZXh0LnByb3BlcnR5ID0gcDtcclxuICAgICAgY29udGV4dC5wcm9wZXJ0eU5hbWUgPSBhc3BlY3QuZ2V0UHJvcGVydHlQYXRoKHAubmFtZSk7XHJcbiAgICAgIG9rID0gZW50aXR5QXNwZWN0Ll92YWxpZGF0ZVByb3BlcnR5KHZhbHVlLCBjb250ZXh0KSAmJiBvaztcclxuICAgIH1cclxuICAgIGlmIChwLmlzQ29tcGxleFByb3BlcnR5KSB7XHJcbiAgICAgIGlmIChwLmlzU2NhbGFyKSB7XHJcbiAgICAgICAgb2sgPSB2YWxpZGF0ZVRhcmdldCh2YWx1ZSkgJiYgb2s7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb2sgPSB2YWx1ZS5yZWR1Y2UoZnVuY3Rpb24gKHB2OiBhbnksIGN2OiBhbnksIGl4OiBudW1iZXIpIHtcclxuICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVRhcmdldChjdiwgaXgpICYmIHB2O1xyXG4gICAgICAgIH0sIG9rKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuXHJcbiAgLy8gdGhlbiB0YXJnZXQgbGV2ZWxcclxuICBzdHlwZS5nZXRBbGxWYWxpZGF0b3JzKCkuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdG9yOiBWYWxpZGF0b3IpIHtcclxuICAgIG9rID0gdmFsaWRhdGUoZW50aXR5QXNwZWN0LCB2YWxpZGF0b3IsIHRhcmdldCkgJiYgb2s7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG9rO1xyXG59XHJcblxyXG4vKipcclxuQW4gQ29tcGxleEFzcGVjdCBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggZXZlcnkgY29tcGxleCBvYmplY3QgaW5zdGFuY2UgYW5kIGlzIGFjY2Vzc2VkIHZpYSB0aGUgY29tcGxleCBvYmplY3QncyAnY29tcGxleEFzcGVjdCcgcHJvcGVydHkuXHJcblxyXG5UaGUgQ29tcGxleEFzcGVjdCBpdHNlbGYgcHJvdmlkZXMgcHJvcGVydGllcyB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBvYmplY3QsIHBhcmVudCBwcm9wZXJ0eSBhbmQgb3JpZ2luYWwgdmFsdWVzIGZvciB0aGUgY29tcGxleCBvYmplY3QuXHJcblxyXG5BIENvbXBsZXhBc3BlY3Qgd2lsbCBhbG1vc3QgbmV2ZXIgbmVlZCB0byBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS4gWW91IHdpbGwgdXN1YWxseSBnZXQgYW4gQ29tcGxleEFzcGVjdCBieSBhY2Nlc3NpbmdcclxuYW4gZW50aXRpZXMgJ2NvbXBsZXhBc3BlY3QnIHByb3BlcnR5LiAgVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgd2hlbiBhbiBjb21wbGV4IG9iamVjdCBpcyBjcmVhdGVkIGFzIHBhcnQgb2YgYW5cclxuZW50aXR5IHZpYSBlaXRoZXIgYSBxdWVyeSwgaW1wb3J0IG9yIEVudGl0eU1hbmFnZXIuY3JlYXRlRW50aXR5IGNhbGwuXHJcbj4gICAgICAvLyBhc3N1bWUgYWRkcmVzcyBpcyBhIGNvbXBsZXggcHJvcGVydHkgb24gdGhlICdDdXN0b21lcicgdHlwZVxyXG4+ICAgICAgdmFyIGFzcGVjdCA9IGFDdXN0b21lci5hZGRyZXNzLmNvbXBsZXhBc3BlY3Q7XHJcbj4gICAgICAvLyBhQ3VzdG9tZXIgPT09IGFzcGVjdC5wYXJlbnQ7XHJcbioqL1xyXG5leHBvcnQgY2xhc3MgQ29tcGxleEFzcGVjdCB7XHJcblxyXG4gIC8qKiBUaGUgY29tcGxleCBvYmplY3QgdGhhdCB0aGlzIGFzcGVjdCBpcyBhc3NvY2lhdGVkIHdpdGguIF9fUmVhZCBPbmx5X18gKi9cclxuICBjb21wbGV4T2JqZWN0OiBDb21wbGV4T2JqZWN0O1xyXG4gIC8qKiBUaGUgJ29yaWdpbmFsIHZhbHVlcycgb2YgdGhpcyBjb21wbGV4IG9iamVjdCB3aGVyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgJ2N1cnJlbnQgdmFsdWVzJy5cclxuICBUaGlzIGlzIGEgbWFwIHdoZXJlIHRoZSBrZXkgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCB0aGUgdmFsdWUgaXMgdGhlICdvcmlnaW5hbCB2YWx1ZScgb2YgdGhlIHByb3BlcnR5LlxyXG4gIF9fUmVhZCBPbmx5X18gKi9cclxuICBvcmlnaW5hbFZhbHVlczoge307XHJcbiAgLyoqIFRoZSBwYXJlbnQgb2JqZWN0IHRoYXQgdG8gd2hpY2ggdGhpcyBhc3BlY3QgYmVsb25nczsgdGhpcyB3aWxsIGVpdGhlciBiZSBhbiBlbnRpdHkgb3IgYW5vdGhlciBjb21wbGV4IG9iamVjdC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIHBhcmVudD86IFN0cnVjdHVyYWxPYmplY3Q7XHJcbiAgLyoqIFRoZSBbW0RhdGFQcm9wZXJ0eV1dIG9uIHRoZSAncGFyZW50JyB0aGF0IGNvbnRhaW5zIHRoaXMgY29tcGxleCBvYmplY3QuIF9fUmVhZCBPbmx5X18gKi9cclxuICBwYXJlbnRQcm9wZXJ0eT86IERhdGFQcm9wZXJ0eTtcclxuICBleHRyYU1ldGFkYXRhPzogYW55O1xyXG5cclxuICAvKiogWW91IHdpbGwgcmFyZWx5LCBpZiBldmVyLCBjcmVhdGUgYSBDb21wbGV4QXNwZWN0IGRpcmVjdGx5LiAqL1xyXG4gIGNvbnN0cnVjdG9yKGNvbXBsZXhPYmplY3Q6IENvbXBsZXhPYmplY3QsIHBhcmVudDogU3RydWN0dXJhbE9iamVjdCwgcGFyZW50UHJvcGVydHk6IERhdGFQcm9wZXJ0eSkge1xyXG4gICAgaWYgKCFjb21wbGV4T2JqZWN0KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSAgQ29tcGxleEFzcGVjdCBjdG9yIHJlcXVpcmVzIGFuIGVudGl0eSBhcyBpdHMgb25seSBhcmd1bWVudC5cIik7XHJcbiAgICB9XHJcbiAgICBpZiAoY29tcGxleE9iamVjdC5jb21wbGV4QXNwZWN0KSB7XHJcbiAgICAgIHJldHVybiBjb21wbGV4T2JqZWN0LmNvbXBsZXhBc3BlY3Q7XHJcbiAgICB9XHJcbiAgICAvLyBpZiBjYWxsZWQgd2l0aG91dCBuZXdcclxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb21wbGV4QXNwZWN0KSkge1xyXG4gICAgICByZXR1cm4gbmV3IENvbXBsZXhBc3BlY3QoY29tcGxleE9iamVjdCwgcGFyZW50LCBwYXJlbnRQcm9wZXJ0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZW50aXR5VHlwZSBzaG91bGQgYWxyZWFkeSBiZSBvbiB0aGUgZW50aXR5IGZyb20gJ3dhdGNoJ1xyXG4gICAgdGhpcy5jb21wbGV4T2JqZWN0ID0gY29tcGxleE9iamVjdDtcclxuICAgIGNvbXBsZXhPYmplY3QuY29tcGxleEFzcGVjdCA9IHRoaXM7XHJcblxyXG4gICAgLy8gVE9ETzoga2VlcCBwdWJsaWMgb3Igbm90P1xyXG4gICAgdGhpcy5vcmlnaW5hbFZhbHVlcyA9IHt9O1xyXG5cclxuICAgIC8vIGlmIGEgc3RhbmRhbG9uZSBjb21wbGV4T2JqZWN0XHJcbiAgICBpZiAocGFyZW50ICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgIHRoaXMucGFyZW50UHJvcGVydHkgPSBwYXJlbnRQcm9wZXJ0eTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29tcGxleFR5cGUgPSBjb21wbGV4T2JqZWN0LmNvbXBsZXhUeXBlO1xyXG4gICAgaWYgKCFjb21wbGV4VHlwZSkge1xyXG4gICAgICBsZXQgdHlwZU5hbWUgPSBjb21wbGV4T2JqZWN0LnByb3RvdHlwZS5fJHR5cGVOYW1lO1xyXG4gICAgICBpZiAoIXR5cGVOYW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBlbnRpdHkgaXMgbm90IHJlZ2lzdGVyZWQgYXMgYSB2YWxpZCBDb21wbGV4VHlwZVwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRhZGF0YSBmb3IgdGhpcyBjb21wbGV4VHlwZSBoYXMgbm90IHlldCBiZWVuIHJlc29sdmVkOiBcIiArIHR5cGVOYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGNvbXBsZXhDdG9yID0gY29tcGxleFR5cGUuZ2V0Q3RvcigpO1xyXG4gICAgY29uZmlnLmludGVyZmFjZVJlZ2lzdHJ5Lm1vZGVsTGlicmFyeS5nZXREZWZhdWx0SW5zdGFuY2UoKS5zdGFydFRyYWNraW5nKGNvbXBsZXhPYmplY3QsIGNvbXBsZXhDdG9yLnByb3RvdHlwZSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIEVudGl0eUFzcGVjdCBmb3IgdGhlIHRvcCBsZXZlbCBlbnRpdHkgdGhhdCBjb250YWlucyB0aGlzIGNvbXBsZXggb2JqZWN0LlxyXG4gICoqL1xyXG4gIGdldEVudGl0eUFzcGVjdCgpIHtcclxuICAgIGxldCBwYXJlbnQgPSA8YW55PnRoaXMucGFyZW50O1xyXG4gICAgaWYgKCFwYXJlbnQpIHJldHVybiBuZXcgRW50aXR5QXNwZWN0KCk7XHJcbiAgICBsZXQgZW50aXR5QXNwZWN0ID0gcGFyZW50LmVudGl0eUFzcGVjdDtcclxuICAgIHdoaWxlIChwYXJlbnQgJiYgIWVudGl0eUFzcGVjdCkge1xyXG4gICAgICBwYXJlbnQgPSBwYXJlbnQuY29tcGxleEFzcGVjdCAmJiBwYXJlbnQuY29tcGxleEFzcGVjdC5wYXJlbnQ7XHJcbiAgICAgIGVudGl0eUFzcGVjdCA9IHBhcmVudCAmJiBwYXJlbnQuZW50aXR5QXNwZWN0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudGl0eUFzcGVjdCB8fCBuZXcgRW50aXR5QXNwZWN0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgLy8gVE9ETzogcmVuYW1lIC0gYW5kIHVzZSAnXyc7IHVzZWQgb24gYm90aCBFbnRpdHlBc3BlY3QgYW5kIENvbXBsZXhBc3BlY3QgZm9yIHBvbHltb3JwaGljIHJlYXNvbnMuXHJcbiAgZ2V0UHJvcGVydHlQYXRoKHByb3BOYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCBwYXJlbnQgPSA8YW55PnRoaXMucGFyZW50O1xyXG4gICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xyXG4gICAgbGV0IGFzcGVjdCA9IHBhcmVudC5jb21wbGV4QXNwZWN0IHx8IHBhcmVudC5lbnRpdHlBc3BlY3Q7XHJcbiAgICByZXR1cm4gYXNwZWN0LmdldFByb3BlcnR5UGF0aCh0aGlzLnBhcmVudFByb3BlcnR5IS5uYW1lICsgXCIuXCIgKyBwcm9wTmFtZSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY2xlYXJPcmlnaW5hbFZhbHVlcyh0YXJnZXQ6IGFueSkge1xyXG4gIGxldCBhc3BlY3QgPSB0YXJnZXQuZW50aXR5QXNwZWN0IHx8IHRhcmdldC5jb21wbGV4QXNwZWN0O1xyXG4gIGFzcGVjdC5vcmlnaW5hbFZhbHVlcyA9IHt9O1xyXG4gIGxldCBzdHlwZSA9IHRhcmdldC5lbnRpdHlUeXBlIHx8IHRhcmdldC5jb21wbGV4VHlwZTtcclxuICBzdHlwZS5jb21wbGV4UHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChjcDogYW55KSB7XHJcbiAgICBsZXQgY29zID0gdGFyZ2V0LmdldFByb3BlcnR5KGNwLm5hbWUpO1xyXG4gICAgaWYgKGNwLmlzU2NhbGFyKSB7XHJcbiAgICAgIGNsZWFyT3JpZ2luYWxWYWx1ZXMoY29zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvcy5fYWNjZXB0Q2hhbmdlcygpO1xyXG4gICAgICBjb3MuZm9yRWFjaChjbGVhck9yaWdpbmFsVmFsdWVzKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiJdfQ==
|
|
806
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWFzcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnRpdHktYXNwZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFHLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQWlFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUF5QzdDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQXNGdkIsd0JBQXdCO0lBQ3hCLFlBQVksTUFBZTtRQUV6Qix3QkFBd0I7UUFDeEIseUNBQXlDO1FBQ3pDLHFDQUFxQztRQUNyQyxJQUFJO1FBdUtOOzs7Ozs7V0FNRztRQUNILGlCQUFZLEdBQUc7WUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQztRQUdGOzs7Ozs7V0FNRztRQUNILGdCQUFXLEdBQUc7WUFDWixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztRQUVGOzs7Ozs7O1dBT0c7UUFDSCxlQUFVLEdBQUc7WUFDWCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQztRQUVGOzs7Ozs7V0FNRztRQUNILGdCQUFXLEdBQUc7WUFDWixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztRQWpOQSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUU1Qiw2RUFBNkU7UUFDN0UsK0JBQStCO1FBRS9CLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLFdBQVcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLHlGQUF5RjtRQUV6RixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEIsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUFFLE9BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7YUFBRTtZQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtnQkFBRSxPQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQUU7WUFDMUQsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFFM0IsMERBQTBEO1lBQzFELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMxRCxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztpQkFDeEU7cUJBQU07b0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsR0FBRyxRQUFRLENBQUMsQ0FBQztpQkFDeEY7YUFDRjtZQUNELElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDeEc7SUFDSCxDQUFDO0lBRUQsY0FBYztJQUNkLGFBQWE7SUFDYixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQXFCO1FBQ25DLE9BQVEsR0FBVyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixvREFBb0Q7SUFDcEQsMEJBQTBCO0lBQzFCLHlDQUF5QztJQUN6QyxzQ0FBc0M7SUFDdEMsa0NBQWtDO0lBQ2xDLE1BQU07SUFDTixxQ0FBcUM7SUFDckMsSUFBSTtJQUVKLGdFQUFnRTtJQUNoRTs7OztPQUlHO0lBQ0gsb0NBQW9DO0lBQ3BDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFXLEVBQUUsWUFBK0I7UUFDdEUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RGLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDLFlBQXNCLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0wsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQ3BCLGtEQUFrRDtZQUNsRCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3ZCLFNBQVMsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QyxPQUFPLFNBQVMsSUFBSSxJQUFJLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsZUFBd0IsS0FBSztRQUNsQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0YsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3pDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDeEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFjLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2hDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7UUFDRCxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsYUFBYTtRQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQztRQUMxQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYyxDQUFDO1FBQ3hDLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7WUFDcEQsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUIsd0ZBQXdGO1lBQ3hGLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMseUVBQXlFO1lBQ3pFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDaEMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLGlHQUFpRztZQUNqRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNuRztJQUNILENBQUM7SUFFRCx5QkFBeUI7SUFDekIsbUdBQW1HO0lBQ25HLGVBQWUsQ0FBQyxRQUFnQjtRQUM5QixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBZ0REOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLFdBQXdCO1FBQ3JDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHNIQUFzSCxDQUFDLENBQUM7U0FDekk7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTyxDQUFDO1FBQzFCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFjLENBQUM7UUFDN0IsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDekMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3ZCLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDbkI7YUFBTSxJQUFJLFdBQVcsS0FBSyxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQzVDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLHFEQUFxRDtTQUN0RDthQUFNLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM5Qix1Q0FBdUM7Z0JBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLG9DQUFvQztnQkFDcEMsNkZBQTZGO2dCQUM3RixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbEQ7U0FDRjthQUFNLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDL0MsdUJBQXVCO1NBQ3hCO2FBQU0sSUFBSSxXQUFXLEtBQUssV0FBVyxDQUFDLFFBQVEsRUFBRTtZQUMvQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzdCLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN6QixLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLHlHQUF5RztZQUN6RyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUMvQixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDaEYsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUNuQjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxzQkFBc0IsQ0FBQyxrQkFBK0MsRUFBRSxRQUE4QixFQUFFLGFBQWlDO1FBQ3ZJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFPLENBQUM7UUFDMUIsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFFLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEUseUZBQXlGO1FBQ3pGLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLFFBQVE7Z0JBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNYLElBQUksYUFBYTtnQkFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCw4QkFBOEIsQ0FBQyxrQkFBK0M7UUFDNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN6QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFJRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsMEJBQTBCLENBQUMsa0JBQStDO1FBQ3hFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDekIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMvRSxJQUFJLFdBQVcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUM3RSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixhQUFhLENBQUMsV0FBbUI7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBR0Q7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxjQUFjO1FBQ1osSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsSUFBUztZQUNyRCxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUtEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILGdCQUFnQixDQUFDLFFBQWlDLEVBQUUsT0FBWTtRQUM5RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyx1QkFBdUI7UUFDcEUsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUNoQyxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkUsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7U0FDakM7YUFBTTtZQUNMLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztTQUN0QztRQUVELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBS0Q7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNILG1CQUFtQixDQUFDLFFBQXFEO1FBQ3ZFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxRixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDN0UsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFtQjtnQkFDbEQsT0FBTyxFQUFFLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEksQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLGVBQWdDO1FBQ2pELFdBQVcsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEYsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsSUFBUztZQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBSUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsb0JBQThDO1FBQ2xFLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFN0ksSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQztRQUN6RyxJQUFJLENBQUMsOEJBQThCLENBQUMsVUFBVSxJQUFTO1lBQ3JELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFxQjtRQUNuQixJQUFJLENBQUMsOEJBQThCLENBQUMsVUFBVSxJQUFTO1lBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsR0FBVyxFQUFFLFFBQXlCO2dCQUN6RixJQUFJLFFBQVEsRUFBRTtvQkFDWixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3REO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O01BT0U7SUFDRixZQUFZLENBQUMsa0JBQXNDO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlCLGtEQUFrRDtRQUNsRCx1Q0FBdUM7UUFDdkMsa0dBQWtHO1FBQ2xHLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztRQUNqRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRztZQUN0QyxPQUFPLElBQUksQ0FBQyxNQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELDJEQUEyRDtJQUMzRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLFFBQW9EO1FBQ25FLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3RSxJQUFJLEtBQVUsQ0FBQztRQUNmLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUNsQyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNwQixLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3QixLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyQztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxZQUFZLFVBQVUsQ0FBQyxFQUFFO2dCQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLHdHQUF3RztvQkFDdEgsb0VBQW9FLENBQUMsQ0FBQzthQUN6RTtZQUNELEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsd0JBQXdCO0lBQ3hCLGVBQWUsQ0FBQyxhQUFxQjtRQUNuQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLEdBQUcsc0RBQXNELENBQUMsQ0FBQztTQUNoSDtRQUNELGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsT0FBTztRQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFL0IsQ0FBQztJQUdELGtDQUFrQztJQUNsQyx3QkFBd0I7SUFDeEIsaUJBQWlCLENBQUMsS0FBVSxFQUFFLE9BQVk7UUFDeEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsSUFBUztZQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsU0FBb0I7Z0JBQ3hFLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsOEJBQThCLENBQUMsWUFBaUI7UUFDOUMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDakMsbURBQW1EO1lBQ25ELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQjthQUFNO1lBQ0wsSUFBSTtnQkFDRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDaEYsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7b0JBQ3BFLHlEQUF5RDtvQkFDekQsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztpQkFFekc7YUFDRjtvQkFBUztnQkFDUixJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDO2FBQzNDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLHVDQUF1QztJQUN2QyxtQkFBbUIsQ0FBQyxlQUFvQjtRQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUM5RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsc0JBQXNCLENBQUMsR0FBVztRQUNoQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQzs7QUEzbEJELHdCQUF3QjtBQUNqQiwwQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0M7QUE4bEI3RSxXQUFXLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7SUFDOUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0FBQzVCLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxpQkFBaUIsQ0FBQyxNQUFXO0lBQ3BDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN6RCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDcEQsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxLQUFLLElBQUksUUFBUSxJQUFJLGNBQWMsRUFBRTtRQUNuQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUN4RDtJQUNELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFPO1FBQy9DLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNmLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsV0FBd0I7SUFDbkUsMkNBQTJDO0lBQzNDLHNDQUFzQztJQUV0QyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEMsSUFBSSxTQUFTLEVBQUU7UUFDYix1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNqQztTQUFNO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1lBQ2hFLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0tBQ0o7QUFDSCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxNQUFjO0lBQzdDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUN6RCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzNCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksU0FBUyxFQUFFO29CQUNiLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTt3QkFDdEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUMzQzt5QkFBTTt3QkFDTCxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFOzRCQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQzt5QkFDMUM7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ25DO1NBQ0Y7YUFBTTtZQUNMLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDckIsc0RBQXNEO2dCQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUNsQyxJQUFJLFNBQVUsQ0FBQyxRQUFRLEVBQUU7d0JBQ3ZCLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDdEM7eUJBQU07d0JBQ0wsd0NBQXdDO3FCQUN6QztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsZ0JBQWdCO1lBQ2hCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxDQUFDO0FBRUQscUVBQXFFO0FBQ3JFLFNBQVMsUUFBUSxDQUFDLFlBQTBCLEVBQUUsU0FBb0IsRUFBRSxLQUFVLEVBQUUsT0FBYTtJQUMzRixJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxJQUFJLEVBQUUsRUFBRTtRQUNOLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQztLQUNkO1NBQU07UUFDTCxJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25GLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELG9HQUFvRztBQUNwRyxxRUFBcUU7QUFDckUsU0FBUyxjQUFjLENBQUMsTUFBVyxFQUFFLE9BQWdCO0lBQ25ELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztJQUNkLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNwRCxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDekQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2pGLElBQUksT0FBTyxHQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuRCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7UUFDekIsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7S0FDekI7SUFFRCxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBTTtRQUM1QyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsRUFBRSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUNkLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNMLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBTyxFQUFFLEVBQU8sRUFBRSxFQUFVO29CQUN0RCxPQUFPLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDUjtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFHSCxvQkFBb0I7SUFDcEIsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsU0FBb0I7UUFDN0QsRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFjeEIsaUVBQWlFO0lBQ2pFLFlBQVksYUFBNEIsRUFBRSxNQUF3QixFQUFFLGNBQTRCO1FBQzlGLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1NBQ3JGO1FBQ0QsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFO1lBQy9CLE9BQU8sYUFBYSxDQUFDLGFBQWEsQ0FBQztTQUNwQztRQUNELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksYUFBYSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsMERBQTBEO1FBQzFELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRW5DLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUV6QixnQ0FBZ0M7UUFDaEMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQ2xELElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO2FBQ3pFO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELEdBQUcsUUFBUSxDQUFDLENBQUM7YUFDekY7U0FDRjtRQUNELElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QyxNQUFNLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFakgsQ0FBQztJQUdEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN2QyxPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM5QixNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUM3RCxZQUFZLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7U0FDOUM7UUFDRCxPQUFPLFlBQVksSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsbUdBQW1HO0lBQ25HLGVBQWUsQ0FBQyxRQUFnQjtRQUM5QixJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBZSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUVGO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxNQUFXO0lBQ3RDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN6RCxNQUFNLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMzQixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDcEQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQU87UUFDL0MsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ2YsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7YUFBTTtZQUNMLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBCcmVlemVFdmVudCB9IGZyb20gJy4vZXZlbnQnO1xyXG5pbXBvcnQgeyBhc3NlcnRQYXJhbSB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUgIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBY3Rpb24gfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBDb21wbGV4VHlwZSwgRGF0YVByb3BlcnR5LCBOYXZpZ2F0aW9uUHJvcGVydHksIEVudGl0eVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBFbnRpdHlLZXkgfSBmcm9tICcuL2VudGl0eS1rZXknO1xyXG5pbXBvcnQgeyBFbnRpdHlHcm91cCB9IGZyb20gJy4vZW50aXR5LWdyb3VwJztcclxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgUXVlcnlSZXN1bHQsIFF1ZXJ5RXJyb3JDYWxsYmFjaywgUXVlcnlTdWNjZXNzQ2FsbGJhY2sgfSBmcm9tICcuL2VudGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgVmFsaWRhdG9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL3ZhbGlkYXRlJztcclxuaW1wb3J0IHsgRW50aXR5UXVlcnkgfSBmcm9tICcuL2VudGl0eS1xdWVyeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eSB7XHJcbiAgZW50aXR5QXNwZWN0OiBFbnRpdHlBc3BlY3Q7XHJcbiAgZW50aXR5VHlwZTogRW50aXR5VHlwZTtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgZ2V0UHJvcGVydHk/KHByb3A6IHN0cmluZyk6IGFueTtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgc2V0UHJvcGVydHk/KHByb3A6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQ7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgcHJvdG90eXBlPzogeyBfJHR5cGVOYW1lOiBzdHJpbmcgfTtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfJGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhPYmplY3Qge1xyXG4gIGNvbXBsZXhBc3BlY3Q6IENvbXBsZXhBc3BlY3Q7XHJcbiAgY29tcGxleFR5cGU6IENvbXBsZXhUeXBlO1xyXG4gIGdldFByb3BlcnR5Pyhwcm9wOiBzdHJpbmcpOiBhbnk7XHJcbiAgc2V0UHJvcGVydHk/KHByb3A6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQ7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgcHJvdG90eXBlPzogeyBfJHR5cGVOYW1lOiBzdHJpbmcgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgU3RydWN0dXJhbE9iamVjdCA9IEVudGl0eSB8IENvbXBsZXhPYmplY3Q7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncyB7XHJcbiAgZW50aXR5OiBFbnRpdHk7XHJcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmcgfCBudWxsO1xyXG4gIHBhcmVudD86IFN0cnVjdHVyYWxPYmplY3Q7XHJcbiAgcHJvcGVydHk/OiBFbnRpdHlQcm9wZXJ0eTtcclxuICBvbGRWYWx1ZT86IGFueTtcclxuICBuZXdWYWx1ZT86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uRXJyb3JzQ2hhbmdlZEV2ZW50QXJncyB7XHJcbiAgZW50aXR5OiBFbnRpdHk7XHJcbiAgYWRkZWQ6IFZhbGlkYXRpb25FcnJvcltdO1xyXG4gIHJlbW92ZWQ6IFZhbGlkYXRpb25FcnJvcltdO1xyXG59XHJcblxyXG4vKipcclxuQW4gRW50aXR5QXNwZWN0IGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aCBldmVyeSBhdHRhY2hlZCBlbnRpdHkgYW5kIGlzIGFjY2Vzc2VkIHZpYSB0aGUgZW50aXR5J3MgJ2VudGl0eUFzcGVjdCcgcHJvcGVydHkuXHJcblxyXG5UaGUgRW50aXR5QXNwZWN0IGl0c2VsZiBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIGRldGVybWluZSBhbmQgbW9kaWZ5IHRoZSBFbnRpdHlTdGF0ZSBvZiB0aGUgZW50aXR5IGFuZCBoYXMgbWV0aG9kc1xyXG50aGF0IHByb3ZpZGUgYSB2YXJpZXR5IG9mIHNlcnZpY2VzIGluY2x1ZGluZyB2YWxpZGF0aW9uIGFuZCBjaGFuZ2UgdHJhY2tpbmcuXHJcblxyXG5BbiBFbnRpdHlBc3BlY3Qgd2lsbCBhbG1vc3QgbmV2ZXIgbmVlZCB0byBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS4gWW91IHdpbGwgdXN1YWxseSBnZXQgYW4gRW50aXR5QXNwZWN0IGJ5IGFjY2Vzc2luZ1xyXG5hbiBlbnRpdGllcyAnZW50aXR5QXNwZWN0JyBwcm9wZXJ0eS4gIFRoaXMgcHJvcGVydHkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGF0dGFjaGVkIHdoZW4gYW4gZW50aXR5IGlzIGNyZWF0ZWQgdmlhIGVpdGhlclxyXG5hIHF1ZXJ5LCBpbXBvcnQgb3IgW1tFbnRpdHlNYW5hZ2VyLmNyZWF0ZUVudGl0eV1dIGNhbGwuXHJcbj4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbj4gICAgICB2YXIgYXNwZWN0ID0gb3JkZXIuZW50aXR5QXNwZWN0O1xyXG4+ICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IGFzcGVjdC5lbnRpdHlTdGF0ZTtcclxuXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5QXNwZWN0IHtcclxuICAvKiogVGhlIEVudGl0eSB0aGF0IHRoaXMgYXNwZWN0IGlzIGFzc29jaWF0ZWQgd2l0aC4gX19SZWFkIE9ubHlfXyAgKiovXHJcbiAgZW50aXR5PzogRW50aXR5O1xyXG4gIC8qKiBUaGUgW1tFbnRpdHlNYW5hZ2VyXV0gdGhhdCBjb250YWlucyB0aGlzIGVudGl0eS4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBlbnRpdHlNYW5hZ2VyPzogRW50aXR5TWFuYWdlcjtcclxuICAvKiogIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgZW50aXR5R3JvdXA/OiBFbnRpdHlHcm91cDtcclxuICAvKiogVGhlIFtbRW50aXR5U3RhdGVdXSBvZiB0aGlzIGVudGl0eS4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBlbnRpdHlTdGF0ZTogRW50aXR5U3RhdGU7XHJcbiAgLyoqICAgV2hldGhlciB0aGlzIGVudGl0eSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzYXZlZC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGlzQmVpbmdTYXZlZDogYm9vbGVhbjtcclxuICAvKiogVGhlICdvcmlnaW5hbCB2YWx1ZXMnIG9mIHRoaXMgZW50aXR5IHdoZXJlIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSAnY3VycmVudCB2YWx1ZXMnLlxyXG4gIFRoaXMgaXMgYSBtYXAgd2hlcmUgdGhlIGtleSBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgJ29yaWdpbmFsIHZhbHVlJyBvZiB0aGUgcHJvcGVydHkuICovXHJcbiAgb3JpZ2luYWxWYWx1ZXM6IHt9O1xyXG4gIC8qKiAgV2hldGhlciB0aGlzIGVudGl0eSBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzLiBfX1JlYWQgT25seV9fICovXHJcbiAgaGFzVmFsaWRhdGlvbkVycm9yczogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGlzIGVudGl0eSBoYXMgYSB0ZW1wb3JhcnkgW1tFbnRpdHlLZXldXS4gKi9cclxuICBoYXNUZW1wS2V5OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRoaXMgZW50aXR5IHdhcyBjcmVhdGVkIGJ5IGJlaW5nIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZSAqL1xyXG4gIHdhc0xvYWRlZD86IGJvb2xlYW47XHJcbiAgLyoqIEV4dHJhIG1ldGFkYXRhIGFib3V0IHRoaXMgZW50aXR5IHN1Y2ggYXMgdGhlIGVudGl0eSdzIGV0YWcuXHJcbiAgWW91IG1heSBleHRlbmQgdGhpcyBvYmplY3Qgd2l0aCB5b3VyIG93biBtZXRhZGF0YSBpbmZvcm1hdGlvbi5cclxuICBCcmVlemUgKGRlKXNlcmlhbGl6ZXMgdGhpcyBvYmplY3Qgd2hlbiBpbXBvcnRpbmcvZXhwb3J0aW5nIHRoZSBlbnRpdHkuICoqL1xyXG4gIGV4dHJhTWV0YWRhdGE/OiBhbnk7XHJcbiAgLyoqXHJcbiAgQSBbW0JyZWV6ZUV2ZW50XV0gdGhhdCBmaXJlcyB3aGVuZXZlciBhbnkgb2YgdGhlIHZhbGlkYXRpb24gZXJyb3JzIG9uIHRoaXMgZW50aXR5IGNoYW5nZS5cclxuICBOb3RlIHRoYXQgdGhpcyBtaWdodCBiZSB0aGUgcmVtb3ZhbCBvZiBhbiBlcnJvciB3aGVuIHNvbWUgZGF0YSBvbiB0aGUgZW50aXR5IGlzIGZpeGVkLlxyXG4gIEBldmVudEFyZ3MgLSBcclxuICAgIC0gZW50aXR5IC0gVGhlIGVudGl0eSBvbiB3aGljaCB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgYXJlIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQuXHJcbiAgICAtIGFkZGVkIC0gQW4gYXJyYXkgY29udGFpbmluZyBhbnkgbmV3bHkgYWRkZWQgW1tWYWxpZGF0aW9uRXJyb3JdXXNcclxuICAgIC0gcmVtb3ZlZCAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYW55IG5ld2x5IHJlbW92ZWQgW1tWYWxpZGF0aW9uRXJyb3JdXXMuIFRoaXMgaXMgdGhvc2VcclxuICAgICAgZXJyb3JzIHRoYXQgaGF2ZSBiZWVuICdmaXhlZCcuXHJcblxyXG4+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkLnN1YnNjcmliZShcclxuPiAgICAgIGZ1bmN0aW9uICh2YWxpZGF0aW9uQ2hhbmdlQXJncykge1xyXG4+ICAgICAgICAgIC8vIHRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGFueXRpbWUgYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VzIG9uIHRoZSAnb3JkZXInIGVudGl0eS5cclxuPiAgICAgICAgICB2YXIgZW50aXR5ID09IHZhbGlkYXRpb25DaGFuZ2VBcmdzLmVudGl0eTsgLy8gTm90ZTogZW50aXR5ID09PSBvcmRlclxyXG4+ICAgICAgICAgIHZhciBlcnJvcnNBZGRlZCA9IHZhbGlkYXRpb25DaGFuZ2VBcmdzLmFkZGVkO1xyXG4+ICAgICAgICAgIHZhciBlcnJvcnNDbGVhcmVkID0gdmFsaWRhdGlvbkNoYW5nZUFyZ3MucmVtb3ZlZDtcclxuPiAgICAgIH0pO1xyXG4gIEBldmVudFxyXG4gICoqL1xyXG4gIHZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkOiBCcmVlemVFdmVudDxWYWxpZGF0aW9uRXJyb3JzQ2hhbmdlZEV2ZW50QXJncz47XHJcbiAgLyoqXHJcbiAgQSBbW0JyZWV6ZUV2ZW50XV0gdGhhdCBmaXJlcyB3aGVuZXZlciBhIHZhbHVlIG9mIG9uZSBvZiB0aGlzIGVudGl0eSdzIHByb3BlcnRpZXMgY2hhbmdlLlxyXG4gIEBldmVudEFyZ3MgLVxyXG4gICAgLSBlbnRpdHkgLSBUaGUgZW50aXR5IHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLlxyXG4gICAgLSBwcm9wZXJ0eSAtIFRoZSBbW0RhdGFQcm9wZXJ0eV1dIHRoYXQgY2hhbmdlZC5cclxuICAgIC0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4gVGhpcyB2YWx1ZSB3aWxsIGJlICdudWxsJyBmb3Igb3BlcmF0aW9ucyB0aGF0IHJlcGxhY2UgdGhlIGVudGlyZSBlbnRpdHkuICBUaGlzIGluY2x1ZGVzXHJcbiAgICAgIHF1ZXJpZXMsIGltcG9ydHMgYW5kIHNhdmVzIHRoYXQgcmVxdWlyZSBhIG1lcmdlLiBUaGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgd2lsbCBub3QgZXhpc3QgaW4gdGhpcyBjYXNlIGVpdGhlci4gVGhpcyB3aWxsIGFjdHVhbGx5IGJlIGEgXCJwcm9wZXJ0eSBwYXRoXCJcclxuICAgICAgZm9yIGFueSBwcm9wZXJ0aWVzIG9mIGEgY29tcGxleCB0eXBlLlxyXG4gICAgLSBvbGRWYWx1ZSAtIFRoZSBvbGQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBiZWZvcmUgdGhlIGNoYW5nZS5cclxuICAgIC0gbmV3VmFsdWUgLSBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYWZ0ZXIgdGhlIGNoYW5nZS5cclxuICAgIC0gcGFyZW50IC0gVGhlIGltbWVkaWF0ZSBwYXJlbnQgb2JqZWN0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS4gIFRoaXMgd2lsbCBiZSBhIENvbXBsZXhUeXBlIGluc3RhbmNlIGFzIG9wcG9zZWQgdG8gYW4gRW50aXR5IFxyXG4gICAgICBmb3IgYW55IGNvbXBsZXggdHlwZSBvciBuZXN0ZWQgY29tcGxleCB0eXBlIHByb3BlcnRpZXMuXHJcblxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIG9yZGVyLmVudGl0eUFzcGVjdC5wcm9wZXJ0eUNoYW5nZWQuc3Vic2NyaWJlKFxyXG4gID4gICAgICBmdW5jdGlvbiAocHJvcGVydHlDaGFuZ2VkQXJncykge1xyXG4gID4gICAgICAgICAgLy8gdGhpcyBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQgYW55dGltZSBhIHByb3BlcnR5IHZhbHVlIGNoYW5nZXMgb24gdGhlICdvcmRlcicgZW50aXR5LlxyXG4gID4gICAgICAgICAgdmFyIGVudGl0eSA9IHByb3BlcnR5Q2hhbmdlZEFyZ3MuZW50aXR5OyAvLyBOb3RlOiBlbnRpdHkgPT09IG9yZGVyXHJcbiAgPiAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lQ2hhbmdlZCA9IHByb3BlcnR5Q2hhbmdlZEFyZ3MucHJvcGVydHlOYW1lO1xyXG4gID4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gcHJvcGVydHlDaGFuZ2VkQXJncy5vbGRWYWx1ZTtcclxuICA+ICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHByb3BlcnR5Q2hhbmdlZEFyZ3MubmV3VmFsdWU7XHJcbiAgPiAgICAgIH0pO1xyXG4gIEBldmVudFxyXG4gICoqL1xyXG4gIHByb3BlcnR5Q2hhbmdlZDogQnJlZXplRXZlbnQ8UHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzPjtcclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3ZhbGlkYXRpb25FcnJvcnM6IHsgW2luZGV4OiBzdHJpbmddOiBWYWxpZGF0aW9uRXJyb3IgfTtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQ6IGFueTtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZW50aXR5S2V5OiBFbnRpdHlLZXk7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2xvYWRlZE5wczogYW55W107XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2luaXRpYWxpemVkPzogYm9vbGVhbjtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfaW5Qcm9jZXNzOiBhbnlbXTsgLy8gdXNlZCBpbiBkZWZhdWx0UHJvcGVydHlJbnRlcmNlcHRvciBmb3IgdGVtcCBzdG9yYWdlLlxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9pblByb2Nlc3NFbnRpdHk/OiBFbnRpdHk7IC8vIHVzZWQgaW4gRW50aXR5TWFuYWdlclxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHN0YXRpYyBfbnVsbEluc3RhbmNlID0gbmV3IEVudGl0eUFzcGVjdCgpOyAvLyBUT0RPOiBkZXRlcm1pbmUgaWYgdGhpcyB3b3Jrc1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGNvbnN0cnVjdG9yKGVudGl0eT86IEVudGl0eSkge1xyXG5cclxuICAgIC8vIGlmIGNhbGxlZCB3aXRob3V0IG5ld1xyXG4gICAgLy8gaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVudGl0eUFzcGVjdCkpIHtcclxuICAgIC8vICAgcmV0dXJuIG5ldyBFbnRpdHlBc3BlY3QoZW50aXR5KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcclxuICAgIC8vIFRPRE86IGtlZXAgcHVibGljIG9yIG5vdD9cclxuICAgIHRoaXMuZW50aXR5R3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVudGl0eU1hbmFnZXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVudGl0eVN0YXRlID0gRW50aXR5U3RhdGUuRGV0YWNoZWQ7XHJcbiAgICB0aGlzLmlzQmVpbmdTYXZlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5vcmlnaW5hbFZhbHVlcyA9IHt9O1xyXG4gICAgdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3JzID0gZmFsc2U7XHJcbiAgICB0aGlzLl92YWxpZGF0aW9uRXJyb3JzID0ge307XHJcblxyXG4gICAgLy8gVW5jb21tZW50IHdoZW4gd2UgaW1wbGVtZW50IGVudGl0eUFzcGVjdC5pc05hdmlnYXRpb25Qcm9wZXJ0eUxvYWRlZCBtZXRob2RcclxuICAgIC8vIHRoaXMuX2xvYWRlZE5hdlByb3BNYXAgPSB7fTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkID0gbmV3IEJyZWV6ZUV2ZW50KFwidmFsaWRhdGlvbkVycm9yc0NoYW5nZWRcIiwgdGhpcyk7XHJcbiAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZCA9IG5ldyBCcmVlemVFdmVudChcInByb3BlcnR5Q2hhbmdlZFwiLCB0aGlzKTtcclxuICAgIC8vIGluIGNhc2UgdGhpcyBpcyB0aGUgTlVMTCBlbnRpdHlBc3BlY3QuIC0gdXNlZCB3aXRoIENvbXBsZXhBc3BlY3RzIHRoYXQgaGF2ZSBubyBwYXJlbnQuXHJcblxyXG4gICAgaWYgKGVudGl0eSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHJlbW92ZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIG9uIHByb3RvdHlwZSBidXQgcGxhY2VkIG9uIGNsYXNzIGJ5IEJhYmVsXHJcbiAgICAgIGlmICghZW50aXR5LmVudGl0eVR5cGUpIHsgZGVsZXRlKGVudGl0eS5lbnRpdHlUeXBlKTsgfVxyXG4gICAgICBpZiAoIWVudGl0eS5lbnRpdHlBc3BlY3QpIHsgZGVsZXRlKGVudGl0eS5lbnRpdHlBc3BlY3QpOyB9XHJcbiAgICAgIGVudGl0eS5lbnRpdHlBc3BlY3QgPSB0aGlzO1xyXG5cclxuICAgICAgLy8gZW50aXR5VHlwZSBzaG91bGQgYWxyZWFkeSBiZSBvbiB0aGUgZW50aXR5IGZyb20gJ3dhdGNoJ1xyXG4gICAgICBsZXQgZW50aXR5VHlwZSA9IGVudGl0eS5lbnRpdHlUeXBlIHx8IGVudGl0eS5fJGVudGl0eVR5cGU7XHJcbiAgICAgIGlmICghZW50aXR5VHlwZSkge1xyXG4gICAgICAgIGxldCB0eXBlTmFtZSA9IGVudGl0eS5wcm90b3R5cGUuXyR0eXBlTmFtZTtcclxuICAgICAgICBpZiAoIXR5cGVOYW1lKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGVudGl0eSBpcyBub3QgcmVnaXN0ZXJlZCBhcyBhIHZhbGlkIEVudGl0eVR5cGVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGZvciB0aGlzIGVudGl0eVR5cGUgaGFzIG5vdCB5ZXQgYmVlbiByZXNvbHZlZDogXCIgKyB0eXBlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBlbnRpdHlDdG9yID0gZW50aXR5VHlwZS5nZXRFbnRpdHlDdG9yKCk7XHJcbiAgICAgIGNvbmZpZy5pbnRlcmZhY2VSZWdpc3RyeS5tb2RlbExpYnJhcnkuZ2V0RGVmYXVsdEluc3RhbmNlKCkuc3RhcnRUcmFja2luZyhlbnRpdHksIGVudGl0eUN0b3IucHJvdG90eXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuICovXHJcbiAgLy8gdHlwZS1ndWFyZFxyXG4gIHN0YXRpYyBpc0VudGl0eShvYmo6IFN0cnVjdHVyYWxPYmplY3QpOiBvYmogaXMgRW50aXR5IHtcclxuICAgIHJldHVybiAob2JqIGFzIGFueSkuZW50aXR5QXNwZWN0ICE9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyBObyBsb25nZXIgdXNlZFxyXG4gIC8vIHN0YXRpYyBjcmVhdGVGcm9tKGVudGl0eTogRW50aXR5KTogRW50aXR5QXNwZWN0IHtcclxuICAvLyAgIGlmIChlbnRpdHkgPT0gbnVsbCkge1xyXG4gIC8vICAgICByZXR1cm4gRW50aXR5QXNwZWN0Ll9udWxsSW5zdGFuY2U7XHJcbiAgLy8gICB9IGVsc2UgaWYgKGVudGl0eS5lbnRpdHlBc3BlY3QpIHtcclxuICAvLyAgICAgcmV0dXJuIGVudGl0eS5lbnRpdHlBc3BlY3Q7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gbmV3IEVudGl0eUFzcGVjdChlbnRpdHkpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBhbmQgdGhlIGluc3RhbmNlIGdldFByb3BlcnR5VmFsdWUgbWV0aG9kLlxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkICdwcm9wZXJ0eSBwYXRoJyBmb3IgYSBzcGVjaWZpZWQgZW50aXR5LlxyXG5cclxuICBUaGUgcHJvcGVydHlQYXRoIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgZGVsaW1pdGVkIHdpdGggJy4nIG9yIGEgc3RyaW5nIGFycmF5LiAgXHJcbiAgKiovXHJcbiAgLy8gdXNlZCBieSBFbnRpdHlRdWVyeSBhbmQgUHJlZGljYXRlXHJcbiAgc3RhdGljIGdldFByb3BlcnR5UGF0aFZhbHVlKG9iajogRW50aXR5LCBwcm9wZXJ0eVBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgcHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlQYXRoKSA/IHByb3BlcnR5UGF0aCA6IHByb3BlcnR5UGF0aC5zcGxpdChcIi5cIik7XHJcbiAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIG9iai5nZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGggYXMgc3RyaW5nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBuZXh0VmFsdWUgPSBvYmo7XHJcbiAgICAgIC8vIGhhY2sgdXNlIG9mIHNvbWUgdG8gcGVyZm9ybSBtYXBGaXJzdCBvcGVyYXRpb24uXHJcbiAgICAgIHByb3BlcnRpZXMuc29tZSgocHJvcCkgPT4ge1xyXG4gICAgICAgIG5leHRWYWx1ZSA9IG5leHRWYWx1ZS5nZXRQcm9wZXJ0eShwcm9wKTtcclxuICAgICAgICByZXR1cm4gbmV4dFZhbHVlID09IG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gbmV4dFZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgW1tFbnRpdHlLZXldXSBmb3IgdGhpcyBFbnRpdHkuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgdmFyIGVudGl0eUtleSA9IG9yZGVyLmVudGl0eUFzcGVjdC5nZXRLZXkoKTtcclxuICBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gKGJvb2xlYW49ZmFsc2UpIEZvcmNlcyB0aGUgcmVjYWxjdWxhdGlvbiBvZiB0aGUga2V5LiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgdW5uZWNlc3NhcnkuXHJcbiAgQHJldHVybiBUaGUgW1tFbnRpdHlLZXldXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbnRpdHkuXHJcbiAgKiovXHJcbiAgZ2V0S2V5KGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBmb3JjZVJlZnJlc2ggPSBhc3NlcnRQYXJhbShmb3JjZVJlZnJlc2gsIFwiZm9yY2VSZWZyZXNoXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKS5jaGVjayhmYWxzZSk7XHJcbiAgICBpZiAoZm9yY2VSZWZyZXNoIHx8ICF0aGlzLl9lbnRpdHlLZXkpIHtcclxuICAgICAgbGV0IGVudGl0eVR5cGUgPSB0aGlzLmVudGl0eSEuZW50aXR5VHlwZTtcclxuICAgICAgbGV0IGtleVByb3BzID0gZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzO1xyXG4gICAgICBsZXQgdmFsdWVzID0ga2V5UHJvcHMubWFwKGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5LmdldFByb3BlcnR5KHAubmFtZSk7XHJcbiAgICAgIH0sIHRoaXMpO1xyXG4gICAgICB0aGlzLl9lbnRpdHlLZXkgPSBuZXcgRW50aXR5S2V5KGVudGl0eVR5cGUsIHZhbHVlcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5S2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgZW50aXR5IHRvIGFuIFtbRW50aXR5U3RhdGVdXSBvZiAnVW5jaGFuZ2VkJyBieSBjb21taXR0aW5nIGFsbCBjaGFuZ2VzIG1hZGUgc2luY2UgdGhlIGVudGl0eSB3YXMgbGFzdCBxdWVyaWVkXHJcbiAgaGFkICdhY2NlcHRDaGFuZ2VzJyBjYWxsZWQgb24gaXQuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LmFjY2VwdENoYW5nZXMoKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGFuICdVbmNoYW5nZWQnIHN0YXRlIHdpdGggYW55IGNoYW5nZXMgY29tbWl0dGVkLlxyXG4gICoqL1xyXG4gIGFjY2VwdENoYW5nZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSByZXR1cm47XHJcbiAgICB0aGlzLl9jaGVja09wZXJhdGlvbihcImFjY2VwdENoYW5nZXNcIik7XHJcbiAgICBsZXQgZW0gPSB0aGlzLmVudGl0eU1hbmFnZXIhO1xyXG4gICAgaWYgKHRoaXMuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgZW0uZGV0YWNoRW50aXR5KHRoaXMuZW50aXR5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0VW5jaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBlbS5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5BY2NlcHRDaGFuZ2VzLCBlbnRpdHk6IHRoaXMuZW50aXR5IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgZW50aXR5IHRvIGFuIFtbRW50aXR5U3RhdGVdXSBvZiAnVW5jaGFuZ2VkJyBieSByZWplY3RpbmcgYWxsIGNoYW5nZXMgbWFkZSB0byBpdCBzaW5jZSB0aGUgZW50aXR5IHdhcyBsYXN0IHF1ZXJpZWRcclxuICBoYWQgJ3JlamVjdENoYW5nZXMnIGNhbGxlZCBvbiBpdC5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3QucmVqZWN0Q2hhbmdlcygpO1xyXG4gID4gICAgICAvLyBUaGUgJ29yZGVyJyBlbnRpdHkgd2lsbCBub3cgYmUgaW4gYW4gJ1VuY2hhbmdlZCcgc3RhdGUgd2l0aCBhbnkgY2hhbmdlcyByZWplY3RlZC5cclxuICAqKi9cclxuICByZWplY3RDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5fY2hlY2tPcGVyYXRpb24oXCJyZWplY3RDaGFuZ2VzXCIpO1xyXG4gICAgbGV0IGVudGl0eSA9IHRoaXMuZW50aXR5ITtcclxuICAgIGxldCBlbnRpdHlNYW5hZ2VyID0gdGhpcy5lbnRpdHlNYW5hZ2VyITtcclxuICAgIC8vIHdlIGRvIG5vdCB3YW50IFByb3BlcnR5Q2hhbmdlIG9yIEVudGl0eUNoYW5nZSBldmVudHMgdG8gb2NjdXIgaGVyZVxyXG4gICAgY29yZS51c2luZyhlbnRpdHlNYW5hZ2VyLCBcImlzUmVqZWN0aW5nQ2hhbmdlc1wiLCB0cnVlLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJlamVjdENoYW5nZXNDb3JlKGVudGl0eSk7XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmVudGl0eVN0YXRlLmlzQWRkZWQoKSkge1xyXG4gICAgICAvLyBuZXh0IGxpbmUgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBsaW5lIHdpbGwgY2F1c2UgdGhpcy5lbnRpdHlNYW5hZ2VyIC0+IG51bGw7XHJcbiAgICAgIGVudGl0eU1hbmFnZXIuZGV0YWNoRW50aXR5KGVudGl0eSk7XHJcbiAgICAgIC8vIG5lZWQgdG8gdGVsbCBlbSB0aGF0IGFuIGVudGl0eSB0aGF0IG5lZWRlZCB0byBiZSBzYXZlZCBubyBsb25nZXIgZG9lcy5cclxuICAgICAgZW50aXR5TWFuYWdlci5fbm90aWZ5U3RhdGVDaGFuZ2UoZW50aXR5LCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5lbnRpdHlTdGF0ZS5pc0RlbGV0ZWQoKSkge1xyXG4gICAgICAgIGVudGl0eU1hbmFnZXIuX2xpbmtSZWxhdGVkRW50aXRpZXMoZW50aXR5KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldFVuY2hhbmdlZCgpO1xyXG4gICAgICAvLyBwcm9wZXJ0eUNoYW5nZWQgcHJvcGVydHlOYW1lIGlzIG5vdCBzcGVjaWZpZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lIHByb3BlcnR5IG1heSBoYXZlIGNoYW5nZWQuXHJcbiAgICAgIHRoaXMucHJvcGVydHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHk6IGVudGl0eSwgcHJvcGVydHlOYW1lOiBudWxsIH0pO1xyXG4gICAgICBlbnRpdHlNYW5hZ2VyLmVudGl0eUNoYW5nZWQucHVibGlzaCh7IGVudGl0eUFjdGlvbjogRW50aXR5QWN0aW9uLlJlamVjdENoYW5nZXMsIGVudGl0eTogZW50aXR5IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqICBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIC8vIFRPRE86IHJlbmFtZSAtIGFuZCB1c2UgJ18nOyB1c2VkIG9uIGJvdGggRW50aXR5QXNwZWN0IGFuZCBDb21wbGV4QXNwZWN0IGZvciBwb2x5bW9ycGhpYyByZWFzb25zLlxyXG4gIGdldFByb3BlcnR5UGF0aChwcm9wTmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gcHJvcE5hbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTZXRzIHRoZSBlbnRpdHkgdG8gYW4gRW50aXR5U3RhdGUgb2YgJ0FkZGVkJy4gIFRoaXMgaXMgTk9UIHRoZSBlcXVpdmFsZW50IG9mIGNhbGxpbmcgW1tFbnRpdHlNYW5hZ2VyLmFkZEVudGl0eV1dXHJcbiAgYmVjYXVzZSBubyBrZXkgZ2VuZXJhdGlvbiB3aWxsIG9jY3VyIGZvciBhdXRvZ2VuZXJhdGVkIGtleXMgYXMgYSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24uIEFzIGEgcmVzdWx0IHRoaXMgb3BlcmF0aW9uIGNhbiBiZSBwcm9ibGVtYXRpY1xyXG4gIHVubGVzcyB5b3UgYXJlIGNlcnRhaW4gdGhhdCB0aGUgZW50aXR5IGJlaW5nIG1hcmtlZCAnQWRkZWQnIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGF1dG9nZW5lcmF0ZWQga2V5LlxyXG4gIFRoZSBzYW1lIG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGJ5IGNhbGxpbmcgW1tFbnRpdHlBc3BlY3Quc2V0RW50aXR5U3RhdGVdXS5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3Quc2V0QWRkZWQoKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGFuICdBZGRlZCcgc3RhdGUuXHJcbiAgKiovXHJcbiAgc2V0QWRkZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXRFbnRpdHlTdGF0ZShFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTZXRzIHRoZSBlbnRpdHkgdG8gYW4gRW50aXR5U3RhdGUgb2YgJ1VuY2hhbmdlZCcuICBUaGlzIGlzIGFsc28gdGhlIGVxdWl2YWxlbnQgb2YgY2FsbGluZyBbW0VudGl0eUFzcGVjdC5hY2NlcHRDaGFuZ2VzXV0uXHJcbiAgVGhlIHNhbWUgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgY2FsbGluZyBbW0VudGl0eUFzcGVjdC5zZXRFbnRpdHlTdGF0ZV1dLlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIG9yZGVyLmVudGl0eUFzcGVjdC5zZXRVbmNoYW5nZWQoKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGFuICdVbmNoYW5nZWQnIHN0YXRlIHdpdGggYW55IGNoYW5nZXMgY29tbWl0dGVkLlxyXG4gICoqL1xyXG4gIHNldFVuY2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLnNldEVudGl0eVN0YXRlKEVudGl0eVN0YXRlLlVuY2hhbmdlZCk7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8qKlxyXG4gIFNldHMgdGhlIGVudGl0eSB0byBhbiBFbnRpdHlTdGF0ZSBvZiAnTW9kaWZpZWQnLiAgVGhpcyBjYW4gYWxzbyBiZSBhY2hpZXZlZCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgYW55IHByb3BlcnR5IG9uIGFuICdVbmNoYW5nZWQnIGVudGl0eS5cclxuICBUaGUgc2FtZSBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBieSBjYWxsaW5nIFtbRW50aXR5QXNwZWN0LnNldEVudGl0eVN0YXRlXV0uXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgb3JkZXIuZW50aXR5QXNwZWN0LnNldE1vZGlmaWVkKCk7XHJcbiAgPiAgICAgIC8vIFRoZSAnb3JkZXInIGVudGl0eSB3aWxsIG5vdyBiZSBpbiBhICdNb2RpZmllZCcgc3RhdGUuXHJcbiAgKiovXHJcbiAgc2V0TW9kaWZpZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXRFbnRpdHlTdGF0ZShFbnRpdHlTdGF0ZS5Nb2RpZmllZCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgZW50aXR5IHRvIGFuIEVudGl0eVN0YXRlIG9mICdEZWxldGVkJy4gIFRoaXMgYm90aCBtYXJrcyB0aGUgZW50aXR5IGFzIGJlaW5nIHNjaGVkdWxlZCBmb3IgZGVsZXRpb24gZHVyaW5nIHRoZSBuZXh0ICdTYXZlJyBjYWxsXHJcbiAgYnV0IGFsc28gcmVtb3ZlcyB0aGUgZW50aXR5IGZyb20gYWxsIG9mIGl0cyByZWxhdGVkIGVudGl0aWVzLlxyXG4gIFRoZSBzYW1lIG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGJ5IGNhbGxpbmcgW1tFbnRpdHlBc3BlY3Quc2V0RW50aXR5U3RhdGVdXS5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3Quc2V0RGVsZXRlZCgpO1xyXG4gID4gICAgICAvLyBUaGUgJ29yZGVyJyBlbnRpdHkgd2lsbCBub3cgYmUgaW4gYSAnRGVsZXRlZCcgc3RhdGUgYW5kIGl0IHdpbGwgbm8gbG9uZ2VyIGhhdmUgYW55ICdyZWxhdGVkJyBlbnRpdGllcy5cclxuICAqKi9cclxuICBzZXREZWxldGVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RW50aXR5U3RhdGUoRW50aXR5U3RhdGUuRGVsZXRlZCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgZW50aXR5IHRvIGFuIEVudGl0eVN0YXRlIG9mICdEZXRhY2hlZCcuICBUaGlzIHJlbW92ZXMgdGhlIGVudGl0eSBmcm9tIGFsbCBvZiBpdHMgcmVsYXRlZCBlbnRpdGllcywgYnV0IGRvZXMgTk9UIGNoYW5nZSB0aGUgRW50aXR5U3RhdGUgb2YgYW55IGV4aXN0aW5nIGVudGl0aWVzLlxyXG4gIFRoZSBzYW1lIG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIGJ5IGNhbGxpbmcgW1tFbnRpdHlBc3BlY3Quc2V0RW50aXR5U3RhdGVdXS5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBvcmRlci5lbnRpdHlBc3BlY3Quc2V0RGV0YWNoZWQoKTtcclxuICA+ICAgICAgLy8gVGhlICdvcmRlcicgZW50aXR5IHdpbGwgbm93IGJlIGluIGEgJ0RldGFjaGVkJyBzdGF0ZSBhbmQgaXQgd2lsbCBubyBsb25nZXIgaGF2ZSBhbnkgJ3JlbGF0ZWQnIGVudGl0aWVzLlxyXG4gICoqL1xyXG4gIHNldERldGFjaGVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RW50aXR5U3RhdGUoRW50aXR5U3RhdGUuRGV0YWNoZWQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFNldHMgdGhlIGVudGl0eSB0byB0aGUgc3BlY2lmaWVkIEVudGl0eVN0YXRlLiBTZWUgYWxzbyAnc2V0VW5jaGFuZ2VkJywgJ3NldE1vZGlmaWVkJywgJ3NldERldGFjaGVkJywgZXRjLlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIG9yZGVyLmVudGl0eUFzcGVjdC5zZXRFbnRpdHlTdGF0ZShFbnRpdHlTdGF0ZS5VbmNoYW5nZWQpO1xyXG4gID4gICAgICAvLyBUaGUgJ29yZGVyJyBlbnRpdHkgd2lsbCBub3cgYmUgaW4gYSAnVW5jaGFuZ2VkJyBzdGF0ZS5cclxuICAqKi9cclxuICBzZXRFbnRpdHlTdGF0ZShlbnRpdHlTdGF0ZTogRW50aXR5U3RhdGUpIHtcclxuICAgIGlmICh0aGlzLmVudGl0eVN0YXRlID09PSBlbnRpdHlTdGF0ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhpcy5fY2hlY2tPcGVyYXRpb24oXCJzZXRFbnRpdHlTdGF0ZVwiKTtcclxuICAgIGlmICh0aGlzLmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IHNldCB0aGUgJ2VudGl0eVN0YXRlJyBvZiBhbiBlbnRpdHkgd2hlbiBpdCBpcyBkZXRhY2hlZCAtIGV4Y2VwdCBieSBmaXJzdCBhdHRhY2hpbmcgaXQgdG8gYW4gRW50aXR5TWFuYWdlclwiKTtcclxuICAgIH1cclxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eSE7XHJcbiAgICBsZXQgZW0gPSB0aGlzLmVudGl0eU1hbmFnZXIhO1xyXG4gICAgbGV0IG5lZWRzU2F2ZSA9IHRydWU7XHJcbiAgICBpZiAoZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLlVuY2hhbmdlZCkge1xyXG4gICAgICBjbGVhck9yaWdpbmFsVmFsdWVzKGVudGl0eSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmhhc1RlbXBLZXk7XHJcbiAgICAgIG5lZWRzU2F2ZSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmIChlbnRpdHlTdGF0ZSA9PT0gRW50aXR5U3RhdGUuQWRkZWQpIHtcclxuICAgICAgY2xlYXJPcmlnaW5hbFZhbHVlcyhlbnRpdHkpO1xyXG4gICAgICAvLyBUT0RPOiBtb3JlIHRvIGRvIGhlcmUuLi4gbGlrZSByZWdlbmVyYXRpbmcga2V5ID8/P1xyXG4gICAgfSBlbHNlIGlmIChlbnRpdHlTdGF0ZSA9PT0gRW50aXR5U3RhdGUuRGVsZXRlZCkge1xyXG4gICAgICBpZiAodGhpcy5lbnRpdHlTdGF0ZS5pc0FkZGVkKCkpIHtcclxuICAgICAgICAvLyB0dXJuIGl0IGludG8gYSBkZXRhY2ggYW5kIGV4aXQgZWFybHlcclxuICAgICAgICB0aGlzLnNldEVudGl0eVN0YXRlKEVudGl0eVN0YXRlLkRldGFjaGVkKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCBjYXNjYWRlIGRlbGV0ZXNcclxuICAgICAgICAvLyBlbnRpdHlTdGF0ZSBuZWVkcyB0byBiZSBzZXQgaXQgZWFybHkgaW4gdGhpcyBvbmUgY2FzZSB0byBpbnN1cmUgdGhhdCBmaydzIGFyZSBub3QgY2xlYXJlZC5cclxuICAgICAgICB0aGlzLmVudGl0eVN0YXRlID0gRW50aXR5U3RhdGUuRGVsZXRlZDtcclxuICAgICAgICByZW1vdmVGcm9tUmVsYXRpb25zKGVudGl0eSwgRW50aXR5U3RhdGUuRGVsZXRlZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZW50aXR5U3RhdGUgPT09IEVudGl0eVN0YXRlLk1vZGlmaWVkKSB7XHJcbiAgICAgIC8vIG5vdGhpbmcgZXh0cmEgbmVlZGVkXHJcbiAgICB9IGVsc2UgaWYgKGVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5EZXRhY2hlZCkge1xyXG4gICAgICBsZXQgZ3JvdXAgPSB0aGlzLmVudGl0eUdyb3VwO1xyXG4gICAgICAvLyBubyBncm91cCA9PT0gYWxyZWFkeSBkZXRhY2hlZC5cclxuICAgICAgaWYgKCFncm91cCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBncm91cC5kZXRhY2hFbnRpdHkoZW50aXR5KTtcclxuICAgICAgLy8gbmVlZHMgdG8gb2NjdXIgZWFybHkgaGVyZSAtIHNvIHRoaXMgSVMgZGVsaWJlcmF0ZWx5IHJlZHVuZGVudCB3aXRoIHRoZSBzYW1lIGNvZGUgbGF0ZXIgaW4gdGhpcyBtZXRob2QuXHJcbiAgICAgIHRoaXMuZW50aXR5U3RhdGUgPSBlbnRpdHlTdGF0ZTtcclxuICAgICAgcmVtb3ZlRnJvbVJlbGF0aW9ucyhlbnRpdHksIEVudGl0eVN0YXRlLkRldGFjaGVkKTtcclxuICAgICAgdGhpcy5fZGV0YWNoKCk7XHJcbiAgICAgIGVtLmVudGl0eUNoYW5nZWQucHVibGlzaCh7IGVudGl0eUFjdGlvbjogRW50aXR5QWN0aW9uLkRldGFjaCwgZW50aXR5OiBlbnRpdHkgfSk7XHJcbiAgICAgIG5lZWRzU2F2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHlTdGF0ZSA9IGVudGl0eVN0YXRlO1xyXG4gICAgZW0uX25vdGlmeVN0YXRlQ2hhbmdlKGVudGl0eSwgbmVlZHNTYXZlKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbG9hZE5hdmlnYXRpb25Qcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHk6IHN0cmluZywgY2FsbGJhY2s/OiBRdWVyeVN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaz86IFF1ZXJ5RXJyb3JDYWxsYmFjayk6IFByb21pc2U8UXVlcnlSZXN1bHQ+O1xyXG4gIGxvYWROYXZpZ2F0aW9uUHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHksIGNhbGxiYWNrPzogUXVlcnlTdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBRdWVyeUVycm9yQ2FsbGJhY2spOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PjtcclxuICAvKipcclxuICBQZXJmb3JtcyBhIHF1ZXJ5IGZvciB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgW1tOYXZpZ2F0aW9uUHJvcGVydHldXS4gX19Bc3luY19fXHJcbiAgPiAgICAgIGVtcC5lbnRpdHlBc3BlY3QubG9hZE5hdmlnYXRpb25Qcm9wZXJ0eShcIk9yZGVyc1wiKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgPiAgICAgICAgICB2YXIgb3JkZXJzID0gZGF0YS5yZXN1bHRzO1xyXG4gID4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXhjZXB0aW9uKSB7XHJcbiAgPiAgICAgICAgICAvLyBoYW5kbGUgZXhjZXB0aW9uIGhlcmU7XHJcbiAgPiAgICAgIH0pO1xyXG4gIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgLSBUaGUgTmF2aWdhdGlvblByb3BlcnR5IG9yIHRoZSBuYW1lIG9mIHRoZSBOYXZpZ2F0aW9uUHJvcGVydHkgdG8gJ2xvYWQnLlxyXG4gIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgb24gc3VjY2Vzcy5cclxuICBAcGFyYW0gZXJyb3JDYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgb24gZmFpbHVyZS5cclxuICBAcmV0dXJuIFByb21pc2Ugd2l0aCBzaGFwZVxyXG4gICAgLSByZXN1bHRzIHtBcnJheSBvZiBFbnRpdHl9XHJcbiAgICAtIHF1ZXJ5IHtFbnRpdHlRdWVyeX0gVGhlIG9yaWdpbmFsIHF1ZXJ5XHJcbiAgICAtIGh0dHBSZXNwb25zZSB7aHR0cFJlc3BvbnNlfSBUaGUgSHR0cFJlc3BvbnNlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAqKi9cclxuICBsb2FkTmF2aWdhdGlvblByb3BlcnR5KG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5IHwgc3RyaW5nLCBjYWxsYmFjazogUXVlcnlTdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s6IFF1ZXJ5RXJyb3JDYWxsYmFjaykge1xyXG4gICAgbGV0IGVudGl0eSA9IHRoaXMuZW50aXR5ITtcclxuICAgIGxldCBuYXZQcm9wZXJ0eSA9IGVudGl0eS5lbnRpdHlUeXBlLl9jaGVja05hdlByb3BlcnR5KG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXR5TmF2aWdhdGlvbihlbnRpdHksIG5hdlByb3BlcnR5KTtcclxuICAgIC8vIHJldHVybiBlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5KHF1ZXJ5LCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XHJcbiAgICBsZXQgcHJvbWlzZSA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlciEuZXhlY3V0ZVF1ZXJ5KHF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuX21hcmtBc0xvYWRlZChuYXZQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjayhlcnJvcik7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICBNYXJrcyB0aGlzIG5hdmlnYXRpb25Qcm9wZXJ0eSBvbiB0aGlzIGVudGl0eSBhcyBhbHJlYWR5IGhhdmluZyBiZWVuIGxvYWRlZC5cclxuICA+ICAgICAgZW1wLmVudGl0eUFzcGVjdC5tYXJrTmF2aWdhdGlvblByb3BlcnR5QXNMb2FkZWQoXCJPcmRlcnNcIik7XHJcbiAgQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSAtIFRoZSBOYXZpZ2F0aW9uUHJvcGVydHkgb3IgbmFtZSBvZiBOYXZpZ2F0aW9uUHJvcGVydHkgdG8gJ2xvYWQnLlxyXG4gICoqL1xyXG4gIG1hcmtOYXZpZ2F0aW9uUHJvcGVydHlBc0xvYWRlZChuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkgcmV0dXJuO1xyXG4gICAgbGV0IG5hdlByb3BlcnR5ID0gdGhpcy5lbnRpdHkuZW50aXR5VHlwZS5fY2hlY2tOYXZQcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgdGhpcy5fbWFya0FzTG9hZGVkKG5hdlByb3BlcnR5Lm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgaXNOYXZpZ2F0aW9uUHJvcGVydHlMb2FkZWQobmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuO1xyXG4gIGlzTmF2aWdhdGlvblByb3BlcnR5TG9hZGVkKG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KTogYm9vbGVhbjtcclxuICAvKipcclxuICBEZXRlcm1pbmVzIHdoZXRoZXIgYSBuYXZpZ2F0aW9uUHJvcGVydHkgb24gdGhpcyBlbnRpdHkgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuXHJcblxyXG4gIEEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb25zaWRlcmVkIGxvYWRlZCB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIGNvbmRpdGlvbnMgYXBwbGllczpcclxuXHJcbiAgICAxLiBJdCB3YXMgZmV0Y2hlZCBmcm9tIHRoZSBiYWNrZW5kIHNlcnZlci5cclxuICAgICAgICA8YnIvPiAgIFRoaXMgY2FuIGJlIHRoZSByZXN1bHQgb2YgYW4gZXhwYW5kIHF1ZXJ5IG9yIGEgY2FsbCB0byB0aGUgW1tFbnRpdHlBc3BlY3QubG9hZE5hdmlnYXRpb25Qcm9wZXJ0eV1dIG1ldGhvZC5cclxuICAgICAgICA8YnIvPiAgIE5vdGUgdGhhdCBldmVuIGlmIHRoZSBmZXRjaCByZXR1cm5zIG5vdGhpbmcgdGhlIHByb3BlcnR5IGlzIHN0aWxsIG1hcmtlZCBhcyBsb2FkZWQgaW4gdGhpcyBjYXNlLlxyXG4gICAgMS4gVGhlIHByb3BlcnR5IGlzIHNjYWxhciBhbmQgaGFzIGJlZW4gc2V0IHRvIGEgbm9ubnVsbCB2YWx1ZS5cclxuICAgIDEuIFRoZSBbW0VudGl0eUFzcGVjdC5tYXJrTmF2aWdhdGlvblByb3BlcnR5QXNMb2FkZWRdXSB3YXMgY2FsbGVkLlxyXG4gIFxyXG4gID4gICAgIHZhciB3YXNMb2FkZWQgPSBlbXAuZW50aXR5QXNwZWN0LmlzTmF2aWdhdGlvblByb3BlcnR5TG9hZGVkKFwiT3JkZXJzXCIpO1xyXG4gIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgLSBUaGUgTmF2aWdhdGlvblByb3BlcnR5IG9yIG5hbWUgb2YgTmF2aWdhdGlvblByb3BlcnR5IHRvICdsb2FkJy5cclxuICAqKi9cclxuICBpc05hdmlnYXRpb25Qcm9wZXJ0eUxvYWRlZChuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkgcmV0dXJuO1xyXG4gICAgbGV0IG5hdlByb3BlcnR5ID0gdGhpcy5lbnRpdHkuZW50aXR5VHlwZS5fY2hlY2tOYXZQcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgaWYgKG5hdlByb3BlcnR5LmlzU2NhbGFyICYmIHRoaXMuZW50aXR5LmdldFByb3BlcnR5KG5hdlByb3BlcnR5Lm5hbWUpICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZGVkTnBzICYmIHRoaXMuX2xvYWRlZE5wcy5pbmRleE9mKG5hdlByb3BlcnR5Lm5hbWUpID49IDA7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfbWFya0FzTG9hZGVkKG5hdlByb3BOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2xvYWRlZE5wcyA9IHRoaXMuX2xvYWRlZE5wcyB8fCBbXTtcclxuICAgIGNvcmUuYXJyYXlBZGRJdGVtVW5pcXVlKHRoaXMuX2xvYWRlZE5wcywgbmF2UHJvcE5hbWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIFBlcmZvcm1zIHZhbGlkYXRpb24gb24gdGhlIGVudGl0eSwgYW55IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gYXJlIGF2YWlsYWJsZSB2aWEgdGhlXHJcbiAgW1tFbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9yc11dIG1ldGhvZC4gVmFsaWRhdGluZyBhbiBlbnRpdHkgbWVhbnMgZXhlY3V0aW5nXHJcbiAgYWxsIG9mIHRoZSB2YWxpZGF0b3JzIG9uIGJvdGggdGhlIGVudGl0eSBpdHNlbGYgYXMgd2VsbCBhcyB0aG9zZSBvbiBlYWNoIG9mIGl0cyBwcm9wZXJ0aWVzLlxyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIHZhciBpc09rID0gb3JkZXIuZW50aXR5QXNwZWN0LnZhbGlkYXRlRW50aXR5KCk7XHJcbiAgPiAgICAgIC8vIGlzT2sgd2lsbCBiZSAndHJ1ZScgaWYgdGhlcmUgYXJlIG5vIGVycm9ycyBvbiB0aGUgZW50aXR5LlxyXG4gID4gICAgICBpZiAoIWlzT2spIHtcclxuICA+ICAgICAgICAgIHZhciBlcnJvcnMgPSBvcmRlci5lbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gID4gICAgICB9XHJcbiAgQHJldHVybiBXaGV0aGVyIHRoZSBlbnRpdHkgcGFzc2VkIHZhbGlkYXRpb24uXHJcbiAgKiovXHJcbiAgdmFsaWRhdGVFbnRpdHkoKSB7XHJcbiAgICBsZXQgb2sgPSB0cnVlO1xyXG4gICAgdGhpcy5fcHJvY2Vzc1ZhbGlkYXRpb25PcEFuZFB1Ymxpc2goZnVuY3Rpb24gKHRoYXQ6IGFueSkge1xyXG4gICAgICBvayA9IHZhbGlkYXRlVGFyZ2V0KHRoYXQuZW50aXR5KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9rO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCBjb250ZXh0PzogYW55KTogYm9vbGVhbjtcclxuICB2YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5OiBEYXRhUHJvcGVydHksIGNvbnRleHQ/OiBhbnkpOiBib29sZWFuO1xyXG4gIHZhbGlkYXRlUHJvcGVydHkocHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSwgY29udGV4dD86IGFueSk6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgUGVyZm9ybXMgdmFsaWRhdGlvbiBvbiBhIHNwZWNpZmljIHByb3BlcnR5IG9mIHRoaXMgZW50aXR5LCBhbnkgZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBhcmUgYXZhaWxhYmxlIHZpYSB0aGVcclxuICBbW0VudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzXV0gbWV0aG9kLiBWYWxpZGF0aW5nIGEgcHJvcGVydHkgbWVhbnMgZXhlY3V0aW5nXHJcbiAgYWxsIG9mIHRoZSB2YWxpZGF0b3JzIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuICBUaGlzIGNhbGwgaXMgYWxzbyBtYWRlIGF1dG9tYXRpY2FsbHkgYW55dGltZSBhIHByb3BlcnR5XHJcbiAgb2YgYW4gZW50aXR5IGlzIGNoYW5nZWQuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgdmFyIGlzT2sgPSBvcmRlci5lbnRpdHlBc3BlY3QudmFsaWRhdGVQcm9wZXJ0eShcIk9yZGVyXCIpO1xyXG5cclxuICBvclxyXG4gID4gICAgICB2YXIgb3JkZXJEYXRlUHJvcGVydHkgPSBvcmRlci5lbnRpdHlUeXBlLmdldFByb3BlcnR5KFwiT3JkZXJEYXRlXCIpO1xyXG4gID4gICAgICB2YXIgaXNPayA9IG9yZGVyLmVudGl0eUFzcGVjdC52YWxpZGF0ZVByb3BlcnR5KE9yZGVyRGF0ZVByb3BlcnR5KTtcclxuICBAcGFyYW0gcHJvcGVydHkgLSBUaGUgW1tEYXRhUHJvcGVydHldXSBvciBbW05hdmlnYXRpb25Qcm9wZXJ0eV1dIHRvIHZhbGlkYXRlIG9yIGEgc3RyaW5nIFxyXG4gIHdpdGggdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGEgcHJvcGVydHkgcGF0aCB3aXRoIHRoZSBwYXRoIHRvIGEgcHJvcGVydHkgb2YgYSBjb21wbGV4IG9iamVjdC5cclxuICBAcGFyYW0gY29udGV4dCAtICBBIGNvbnRleHQgb2JqZWN0IHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGVhY2ggW1tWYWxpZGF0b3JdXS5cclxuICBAcmV0dXJuIFdoZXRoZXIgdGhlIGVudGl0eSBwYXNzZWQgdmFsaWRhdGlvbi5cclxuICAqKi9cclxuICB2YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5OiBFbnRpdHlQcm9wZXJ0eSB8IHN0cmluZywgY29udGV4dDogYW55KSB7XHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpOyAvLyBwZXJmb3JtcyB2YWxpZGF0aW9uc1xyXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmNvbXBsZXhBc3BlY3QpIHtcclxuICAgICAgcmV0dXJuIHZhbGlkYXRlVGFyZ2V0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xyXG4gICAgY29udGV4dC5lbnRpdHkgPSB0aGlzLmVudGl0eTtcclxuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgY29udGV4dC5wcm9wZXJ0eSA9IHRoaXMuZW50aXR5IS5lbnRpdHlUeXBlLmdldFByb3BlcnR5KHByb3BlcnR5LCB0cnVlKTtcclxuICAgICAgY29udGV4dC5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnRleHQucHJvcGVydHkgPSBwcm9wZXJ0eTtcclxuICAgICAgY29udGV4dC5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVByb3BlcnR5KHZhbHVlLCBjb250ZXh0KTtcclxuICB9XHJcblxyXG4gIGdldFZhbGlkYXRpb25FcnJvcnMoKTogVmFsaWRhdGlvbkVycm9yW107XHJcbiAgZ2V0VmFsaWRhdGlvbkVycm9ycyhwcm9wZXJ0eTogc3RyaW5nKTogVmFsaWRhdGlvbkVycm9yW107XHJcbiAgZ2V0VmFsaWRhdGlvbkVycm9ycyhwcm9wZXJ0eTogRW50aXR5UHJvcGVydHkpOiBWYWxpZGF0aW9uRXJyb3JbXTtcclxuICAvKipcclxuICBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIHRoZSBlbnRpcmUgZW50aXR5IG9yIGFueSBzcGVjaWZpZWQgcHJvcGVydHkuXHJcbiAgXHJcbiAgVGhpcyBtZXRob2QgY2FuIHJldHVybiBhbGwgb2YgdGhlIGVycm9ycyBmb3IgYW4gRW50aXR5XHJcbiAgPiAgICAgIC8vIGFzc3VtZSBvcmRlciBpcyBhbiBvcmRlciBlbnRpdHkgYXR0YWNoZWQgdG8gYW4gRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgdmFyIHZhbEVycm9ycyA9IG9yZGVyLmVudGl0eUFzcGVjdC5nZXRWYWxpZGF0aW9uRXJyb3JzKCk7XHJcblxyXG4gIGFzIHdlbGwgYXMgdGhvc2UgZm9yIGp1c3QgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cclxuICA+ICAgICAgLy8gYXNzdW1lIG9yZGVyIGlzIGFuIG9yZGVyIGVudGl0eSBhdHRhY2hlZCB0byBhbiBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICB2YXIgb3JkZXJEYXRlRXJyb3JzID0gb3JkZXIuZW50aXR5QXNwZWN0LmdldFZhbGlkYXRpb25FcnJvcnMoXCJPcmRlckRhdGVcIik7XHJcblxyXG4gIHdoaWNoIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBhc1xyXG4gID4gICAgICAvLyBhc3N1bWUgb3JkZXIgaXMgYW4gb3JkZXIgZW50aXR5IGF0dGFjaGVkIHRvIGFuIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIHZhciBvcmRlckRhdGVQcm9wZXJ0eSA9IG9yZGVyLmVudGl0eVR5cGUuZ2V0UHJvcGVydHkoXCJPcmRlckRhdGVcIik7XHJcbiAgPiAgICAgIHZhciBvcmRlckRhdGVFcnJvcnMgPSBvcmRlci5lbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9ycyhvcmRlckRhdGVQcm9wZXJ0eSk7XHJcbiAgQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGZvciB3aGljaCB2YWxpZGF0aW9uIGVycm9ycyBzaG91bGQgYmUgcmV0cmlldmVkLlxyXG4gIElmIG9taXR0ZWQsIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoaXMgZW50aXR5IHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgQHJldHVybiBBIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3JzLlxyXG4gICoqL1xyXG4gIGdldFZhbGlkYXRpb25FcnJvcnMocHJvcGVydHk/OiBEYXRhUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHkgfCBzdHJpbmcpIHtcclxuICAgIGFzc2VydFBhcmFtKHByb3BlcnR5LCBcInByb3BlcnR5XCIpLmlzT3B0aW9uYWwoKS5pc0VudGl0eVByb3BlcnR5KCkub3IoKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgICBsZXQgcmVzdWx0ID0gY29yZS5nZXRPd25Qcm9wZXJ0eVZhbHVlcyh0aGlzLl92YWxpZGF0aW9uRXJyb3JzKTtcclxuICAgIGlmIChwcm9wZXJ0eSkge1xyXG4gICAgICBsZXQgcHJvcGVydHlOYW1lID0gdHlwZW9mIChwcm9wZXJ0eSkgPT09ICdzdHJpbmcnID8gcHJvcGVydHkgOiBwcm9wZXJ0eS5uYW1lO1xyXG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh2ZTogVmFsaWRhdGlvbkVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHZlLnByb3BlcnR5ICYmICh2ZS5wcm9wZXJ0eS5uYW1lID09PSBwcm9wZXJ0eU5hbWUgfHwgKHByb3BlcnR5TmFtZS5pbmRleE9mKFwiLlwiKSAhPT0gLTEgJiYgdmUucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWUpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQWRkcyBhIHZhbGlkYXRpb24gZXJyb3IuXHJcbiAgKiovXHJcbiAgYWRkVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25FcnJvcjogVmFsaWRhdGlvbkVycm9yKSB7XHJcbiAgICBhc3NlcnRQYXJhbSh2YWxpZGF0aW9uRXJyb3IsIFwidmFsaWRhdGlvbkVycm9yXCIpLmlzSW5zdGFuY2VPZihWYWxpZGF0aW9uRXJyb3IpLmNoZWNrKCk7XHJcbiAgICB0aGlzLl9wcm9jZXNzVmFsaWRhdGlvbk9wQW5kUHVibGlzaChmdW5jdGlvbiAodGhhdDogYW55KSB7XHJcbiAgICAgIHRoYXQuX2FkZFZhbGlkYXRpb25FcnJvcih2YWxpZGF0aW9uRXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVWYWxpZGF0aW9uRXJyb3IodmFsaWRhdGlvbkVycm9yOiBWYWxpZGF0aW9uRXJyb3IpOiB2b2lkO1xyXG4gIHJlbW92ZVZhbGlkYXRpb25FcnJvcih2YWxpZGF0aW9uS2V5OiBzdHJpbmcpOiB2b2lkO1xyXG4gIC8qKlxyXG4gIFJlbW92ZXMgYSB2YWxpZGF0aW9uIGVycm9yLlxyXG4gIEBwYXJhbSB2YWxpZGF0aW9uRXJyb3JPcktleSAtIEVpdGhlciBhIFZhbGlkYXRpb25FcnJvciBvciBhIFZhbGlkYXRpb25FcnJvciAna2V5JyB2YWx1ZVxyXG4gICoqL1xyXG4gIHJlbW92ZVZhbGlkYXRpb25FcnJvcih2YWxpZGF0aW9uRXJyb3JPcktleTogVmFsaWRhdGlvbkVycm9yIHwgc3RyaW5nKSB7XHJcbiAgICBhc3NlcnRQYXJhbSh2YWxpZGF0aW9uRXJyb3JPcktleSwgXCJ2YWxpZGF0aW9uRXJyb3JPcktleVwiKS5pc1N0cmluZygpLm9yKCkuaXNJbnN0YW5jZU9mKFZhbGlkYXRpb25FcnJvcikub3IoKS5pc0luc3RhbmNlT2YoVmFsaWRhdG9yKS5jaGVjaygpO1xyXG5cclxuICAgIGxldCBrZXkgPSAodHlwZW9mICh2YWxpZGF0aW9uRXJyb3JPcktleSkgPT09IFwic3RyaW5nXCIpID8gdmFsaWRhdGlvbkVycm9yT3JLZXkgOiB2YWxpZGF0aW9uRXJyb3JPcktleS5rZXk7XHJcbiAgICB0aGlzLl9wcm9jZXNzVmFsaWRhdGlvbk9wQW5kUHVibGlzaChmdW5jdGlvbiAodGhhdDogYW55KSB7XHJcbiAgICAgIHRoYXQuX3JlbW92ZVZhbGlkYXRpb25FcnJvcihrZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZW1vdmVzIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGEgc3BlY2lmaWVkIGVudGl0eVxyXG4gICoqL1xyXG4gIGNsZWFyVmFsaWRhdGlvbkVycm9ycygpIHtcclxuICAgIHRoaXMuX3Byb2Nlc3NWYWxpZGF0aW9uT3BBbmRQdWJsaXNoKGZ1bmN0aW9uICh0aGF0OiBhbnkpIHtcclxuICAgICAgY29yZS5vYmplY3RGb3JFYWNoKHRoYXQuX3ZhbGlkYXRpb25FcnJvcnMsIGZ1bmN0aW9uIChrZXk6IHN0cmluZywgdmFsRXJyb3I6IFZhbGlkYXRpb25FcnJvcikge1xyXG4gICAgICAgIGlmICh2YWxFcnJvcikge1xyXG4gICAgICAgICAgZGVsZXRlIHRoYXQuX3ZhbGlkYXRpb25FcnJvcnNba2V5XTtcclxuICAgICAgICAgIHRoYXQuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0LnJlbW92ZWQucHVzaCh2YWxFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhhdC5oYXNWYWxpZGF0aW9uRXJyb3JzID0gIWNvcmUuaXNFbXB0eSh0aGF0Ll92YWxpZGF0aW9uRXJyb3JzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhbiBbW0VudGl0eUtleV1dIGZvciB0aGUgZW50aXR5IHBvaW50ZWQgdG8gYnkgdGhlIHNwZWNpZmllZCBzY2FsYXIgTmF2aWdhdGlvblByb3BlcnR5LlxyXG4gIFRoaXMgb25seSByZXR1cm5zIGFuIEVudGl0eUtleSBpZiB0aGUgY3VycmVudCBlbnRpdHkgaXMgYSAnY2hpbGQnIGVudGl0eSBhbG9uZyB0aGUgc3BlY2lmaWVkIE5hdmlnYXRpb25Qcm9wZXJ0eS4gXHJcbiAgaS5lLiBoYXMgYSBzaW5nbGUgcGFyZW50LlxyXG5cclxuICBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5IC0gVGhlIFtbTmF2aWdhdGlvblByb3BlcnR5XV0gKCBwb2ludGluZyB0byBhIHBhcmVudCkuIFxyXG4gIEByZXR1cm5zIEVpdGhlciBhIHBhcmVudCBFbnRpdHlLZXkgaWYgdGhpcyBpcyBhICdjaGlsZCcgZW50aXR5IG9yIG51bGw7ICBcclxuICAqL1xyXG4gIGdldFBhcmVudEtleShuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkgcmV0dXJuIG51bGw7XHJcbiAgICAvLyBUT0RPOiByZXZpZXcgdGhpcyAtIG5vdCBzdXJlIGFib3V0IHRoZSBjb21tZW50LlxyXG4gICAgLy8gTmF2aWdhdGlvblByb3BlcnR5IGRvZXNuJ3QgeWV0IGV4aXN0XHJcbiAgICAvLyBhc3NlcnRQYXJhbShuYXZpZ2F0aW9uUHJvcGVydHksIFwibmF2aWdhdGlvblByb3BlcnR5XCIpLmlzSW5zdGFuY2VPZihOYXZpZ2F0aW9uUHJvcGVydHkpLmNoZWNrKCk7XHJcbiAgICBsZXQgZmtOYW1lcyA9IG5hdmlnYXRpb25Qcm9wZXJ0eS5mb3JlaWduS2V5TmFtZXM7XHJcbiAgICBpZiAoZmtOYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgbGV0IGZrVmFsdWVzID0gZmtOYW1lcy5tYXAoZnVuY3Rpb24gKGZrbikge1xyXG4gICAgICByZXR1cm4gdGhhdC5lbnRpdHkhLmdldFByb3BlcnR5KGZrbik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBuZXcgRW50aXR5S2V5KG5hdmlnYXRpb25Qcm9wZXJ0eS5lbnRpdHlUeXBlLCBma1ZhbHVlcyk7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiByZWZhY3RvciB0aGlzIGFuZCB0aGUgc3RhdGljIGdldFByb3BlcnR5UGF0aFZhbHVlLlxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIERhdGFQcm9wZXJ0eSBvciBOYXZpZ2F0aW9uUHJvcGVydHkgb3IgJ3Byb3BlcnR5IHBhdGgnLiAgXHJcbiAgKiovXHJcbiAgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogc3RyaW5nIHwgRGF0YVByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgICBhc3NlcnRQYXJhbShwcm9wZXJ0eSwgXCJwcm9wZXJ0eVwiKS5pc1N0cmluZygpLm9yKCkuaXNFbnRpdHlQcm9wZXJ0eSgpLmNoZWNrKCk7XHJcbiAgICBsZXQgdmFsdWU6IGFueTtcclxuICAgIGlmICh0eXBlb2YgKHByb3BlcnR5KSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgbGV0IHByb3BOYW1lcyA9IHByb3BlcnR5LnRyaW0oKS5zcGxpdChcIi5cIik7XHJcbiAgICAgIGxldCBwcm9wTmFtZSA9IHByb3BOYW1lcy5zaGlmdCgpO1xyXG4gICAgICB2YWx1ZSA9IHRoaXMuZW50aXR5O1xyXG4gICAgICB2YWx1ZSA9IHZhbHVlLmdldFByb3BlcnR5KHByb3BOYW1lKTtcclxuICAgICAgd2hpbGUgKHByb3BOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcHJvcE5hbWUgPSBwcm9wTmFtZXMuc2hpZnQoKTtcclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLmdldFByb3BlcnR5KHByb3BOYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCEocHJvcGVydHkucGFyZW50VHlwZSBpbnN0YW5jZW9mIEVudGl0eVR5cGUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHZhbGlkYXRlUHJvcGVydHkgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBhICdwcm9wZXJ0eScgcGFyYW1ldGVyIHdob3NlIHBhcmVudFR5cGUgaXMgYSBDb21wbGV4VHlwZTsgXCIgK1xyXG4gICAgICAgICAgXCJQYXNzIGEgJ3Byb3BlcnR5IHBhdGgnIHN0cmluZyBhcyB0aGUgJ3Byb3BlcnR5JyBwYXJhbWV0ZXIgaW5zdGVhZCBcIik7XHJcbiAgICAgIH1cclxuICAgICAgdmFsdWUgPSB0aGlzLmVudGl0eSEuZ2V0UHJvcGVydHkocHJvcGVydHkubmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLyBpbnRlcm5hbCBtZXRob2RzXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2NoZWNrT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuaXNCZWluZ1NhdmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwZXJmb3JtIGEgJ1wiICsgb3BlcmF0aW9uTmFtZSArIFwiJyBvbiBhbiBlbnRpdHkgdGhhdCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzYXZlZFwiKTtcclxuICAgIH1cclxuICAgIC8vIGFsbG93cyBjaGFpbmluZ1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZGV0YWNoKCkge1xyXG4gICAgdGhpcy5lbnRpdHlHcm91cCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZW50aXR5U3RhdGUgPSBFbnRpdHlTdGF0ZS5EZXRhY2hlZDtcclxuICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMgPSB7fTtcclxuICAgIHRoaXMuX3ZhbGlkYXRpb25FcnJvcnMgPSB7fTtcclxuICAgIHRoaXMuaGFzVmFsaWRhdGlvbkVycm9ycyA9IGZhbHNlO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlZC5jbGVhcigpO1xyXG4gICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQuY2xlYXIoKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gY2FsbGVkIGZyb20gZGVmYXVsdEludGVyY2VwdG9yLlxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF92YWxpZGF0ZVByb3BlcnR5KHZhbHVlOiBhbnksIGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IG9rID0gdHJ1ZTtcclxuICAgIHRoaXMuX3Byb2Nlc3NWYWxpZGF0aW9uT3BBbmRQdWJsaXNoKGZ1bmN0aW9uICh0aGF0OiBhbnkpIHtcclxuICAgICAgY29udGV4dC5wcm9wZXJ0eS5nZXRBbGxWYWxpZGF0b3JzKCkuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdG9yOiBWYWxpZGF0b3IpIHtcclxuICAgICAgICBvayA9IHZhbGlkYXRlKHRoYXQsIHZhbGlkYXRvciwgdmFsdWUsIGNvbnRleHQpICYmIG9rO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9rO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3Byb2Nlc3NWYWxpZGF0aW9uT3BBbmRQdWJsaXNoKHZhbGlkYXRpb25GbjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQpIHtcclxuICAgICAgLy8gb25seSB0b3AgbGV2ZWwgcHJvY2Vzc1ZhbGlkYXRpb25zIGNhbGwgcHVibGlzaGVzXHJcbiAgICAgIHZhbGlkYXRpb25Gbih0aGlzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQgPSB7IGVudGl0eTogdGhpcy5lbnRpdHksIGFkZGVkOiBbXSwgcmVtb3ZlZDogW10gfTtcclxuICAgICAgICB2YWxpZGF0aW9uRm4odGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0LmFkZGVkLmxlbmd0aCA+IDAgfHwgdGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQucmVtb3ZlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkLnB1Ymxpc2godGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQpO1xyXG4gICAgICAgICAgLy8gdGhpcyBtaWdodCBiZSBhIGRldGFjaGVkIGVudGl0eSBoZW5jZSB0aGUgZ3VhcmQgYmVsb3cuXHJcbiAgICAgICAgICB0aGlzLmVudGl0eU1hbmFnZXIgJiYgdGhpcy5lbnRpdHlNYW5hZ2VyLnZhbGlkYXRpb25FcnJvcnNDaGFuZ2VkLnB1Ymxpc2godGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIC8vIFRPRE86IGFkZC91c2UgYSBWYWxpZGF0aW9uRXJyb3IgdHlwZVxyXG4gIF9hZGRWYWxpZGF0aW9uRXJyb3IodmFsaWRhdGlvbkVycm9yOiBhbnkpIHtcclxuICAgIHRoaXMuX3ZhbGlkYXRpb25FcnJvcnNbdmFsaWRhdGlvbkVycm9yLmtleV0gPSB2YWxpZGF0aW9uRXJyb3I7XHJcbiAgICB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSB0cnVlO1xyXG4gICAgdGhpcy5fcGVuZGluZ1ZhbGlkYXRpb25SZXN1bHQuYWRkZWQucHVzaCh2YWxpZGF0aW9uRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3JlbW92ZVZhbGlkYXRpb25FcnJvcihrZXk6IHN0cmluZykge1xyXG4gICAgbGV0IHZhbEVycm9yID0gdGhpcy5fdmFsaWRhdGlvbkVycm9yc1trZXldO1xyXG4gICAgaWYgKHZhbEVycm9yKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLl92YWxpZGF0aW9uRXJyb3JzW2tleV07XHJcbiAgICAgIHRoaXMuaGFzVmFsaWRhdGlvbkVycm9ycyA9ICFjb3JlLmlzRW1wdHkodGhpcy5fdmFsaWRhdGlvbkVycm9ycyk7XHJcbiAgICAgIHRoaXMuX3BlbmRpbmdWYWxpZGF0aW9uUmVzdWx0LnJlbW92ZWQucHVzaCh2YWxFcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuQnJlZXplRXZlbnQuYnViYmxlRXZlbnQoRW50aXR5QXNwZWN0LnByb3RvdHlwZSwgZnVuY3Rpb24gKCkge1xyXG4gIHJldHVybiB0aGlzLmVudGl0eU1hbmFnZXI7XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gcmVqZWN0Q2hhbmdlc0NvcmUodGFyZ2V0OiBhbnkpIHtcclxuICBsZXQgYXNwZWN0ID0gdGFyZ2V0LmVudGl0eUFzcGVjdCB8fCB0YXJnZXQuY29tcGxleEFzcGVjdDtcclxuICBsZXQgc3R5cGUgPSB0YXJnZXQuZW50aXR5VHlwZSB8fCB0YXJnZXQuY29tcGxleFR5cGU7XHJcbiAgbGV0IG9yaWdpbmFsVmFsdWVzID0gYXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gIGZvciAobGV0IHByb3BOYW1lIGluIG9yaWdpbmFsVmFsdWVzKSB7XHJcbiAgICB0YXJnZXQuc2V0UHJvcGVydHkocHJvcE5hbWUsIG9yaWdpbmFsVmFsdWVzW3Byb3BOYW1lXSk7XHJcbiAgfVxyXG4gIHN0eXBlLmNvbXBsZXhQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGNwOiBhbnkpIHtcclxuICAgIGxldCBjb3MgPSB0YXJnZXQuZ2V0UHJvcGVydHkoY3AubmFtZSk7XHJcbiAgICBpZiAoY3AuaXNTY2FsYXIpIHtcclxuICAgICAgcmVqZWN0Q2hhbmdlc0NvcmUoY29zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvcy5fcmVqZWN0Q2hhbmdlcygpO1xyXG4gICAgICBjb3MuZm9yRWFjaChyZWplY3RDaGFuZ2VzQ29yZSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZUZyb21SZWxhdGlvbnMoZW50aXR5OiBFbnRpdHksIGVudGl0eVN0YXRlOiBFbnRpdHlTdGF0ZSkge1xyXG4gIC8vIHJlbW92ZSB0aGlzIGVudGl0eSBmcm9tIGFueSBjb2xsZWN0aW9ucy5cclxuICAvLyBtYXJrIHRoZSBlbnRpdHkgZGVsZXRlZCBvciBkZXRhY2hlZFxyXG5cclxuICBsZXQgaXNEZWxldGVkID0gZW50aXR5U3RhdGUuaXNEZWxldGVkKCk7XHJcbiAgaWYgKGlzRGVsZXRlZCkge1xyXG4gICAgcmVtb3ZlRnJvbVJlbGF0aW9uc0NvcmUoZW50aXR5KTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29yZS51c2luZyhlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXIhLCBcImlzTG9hZGluZ1wiLCB0cnVlLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJlbW92ZUZyb21SZWxhdGlvbnNDb3JlKGVudGl0eSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZUZyb21SZWxhdGlvbnNDb3JlKGVudGl0eTogRW50aXR5KSB7XHJcbiAgZW50aXR5LmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnApIHtcclxuICAgIGxldCBpbnZlcnNlTnAgPSBucC5pbnZlcnNlO1xyXG4gICAgbGV0IG5wVmFsdWUgPSBlbnRpdHkuZ2V0UHJvcGVydHkobnAubmFtZSk7XHJcbiAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgaWYgKG5wVmFsdWUpIHtcclxuICAgICAgICBpZiAoaW52ZXJzZU5wKSB7XHJcbiAgICAgICAgICBpZiAoaW52ZXJzZU5wLmlzU2NhbGFyKSB7XHJcbiAgICAgICAgICAgIG5wVmFsdWUuc2V0UHJvcGVydHkoaW52ZXJzZU5wLm5hbWUsIG51bGwpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSBucFZhbHVlLmdldFByb3BlcnR5KGludmVyc2VOcC5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgY29yZS5hcnJheVJlbW92ZUl0ZW0oY29sbGVjdGlvbiwgZW50aXR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbnRpdHkuc2V0UHJvcGVydHkobnAubmFtZSwgbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbnZlcnNlTnAgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vIG5wVmFsdWUgaXMgYSBsaXZlIGxpc3Qgc28gd2UgbmVlZCB0byBjb3B5IGl0IGZpcnN0LlxyXG4gICAgICAgIG5wVmFsdWUuc2xpY2UoMCkuZm9yRWFjaCgodjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaW52ZXJzZU5wIS5pc1NjYWxhcikge1xyXG4gICAgICAgICAgICB2LnNldFByb3BlcnR5KGludmVyc2VOcCEubmFtZSwgbnVsbCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBtYW55IHRvIG1hbnkgLSBub3QgeWV0IGhhbmRsZWQuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gbm93IGNsZWFyIGl0LlxyXG4gICAgICBucFZhbHVlLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG59XHJcblxyXG4vLyBub3RlIGVudGl0eUFzcGVjdCBvbmx5IC0gKCBubyBjb21wbGV4IGFzcGVjdCBhbGxvd2VkIG9uIHRoZSBjYWxsKS5cclxuZnVuY3Rpb24gdmFsaWRhdGUoZW50aXR5QXNwZWN0OiBFbnRpdHlBc3BlY3QsIHZhbGlkYXRvcjogVmFsaWRhdG9yLCB2YWx1ZTogYW55LCBjb250ZXh0PzogYW55KSB7XHJcbiAgbGV0IHZlID0gdmFsaWRhdG9yLnZhbGlkYXRlKHZhbHVlLCBjb250ZXh0KTtcclxuICBpZiAodmUpIHtcclxuICAgIGVudGl0eUFzcGVjdC5fYWRkVmFsaWRhdGlvbkVycm9yKHZlKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IGtleSA9IFZhbGlkYXRpb25FcnJvci5nZXRLZXkodmFsaWRhdG9yLCBjb250ZXh0ID8gY29udGV4dC5wcm9wZXJ0eU5hbWUgOiBudWxsKTtcclxuICAgIGVudGl0eUFzcGVjdC5fcmVtb3ZlVmFsaWRhdGlvbkVycm9yKGtleSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuXHJcbi8vIGNvSW5kZXggaXMgb25seSB1c2VkIHdoZXJlIHRhcmdldCBpcyBhIGNvbXBsZXggb2JqZWN0IHRoYXQgaXMgcGFydCBvZiBhbiBhcnJheSBvZiBjb21wbGV4IG9iamVjdHNcclxuLy8gaW4gd2hpY2ggY2FzZSBjdEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0IHdpdGhpbiB0aGUgYXJyYXkuXHJcbmZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0KHRhcmdldDogYW55LCBjb0luZGV4PzogbnVtYmVyKSB7XHJcbiAgbGV0IG9rID0gdHJ1ZTtcclxuICBsZXQgc3R5cGUgPSB0YXJnZXQuZW50aXR5VHlwZSB8fCB0YXJnZXQuY29tcGxleFR5cGU7XHJcbiAgbGV0IGFzcGVjdCA9IHRhcmdldC5lbnRpdHlBc3BlY3QgfHwgdGFyZ2V0LmNvbXBsZXhBc3BlY3Q7XHJcbiAgbGV0IGVudGl0eUFzcGVjdCA9IHRhcmdldC5lbnRpdHlBc3BlY3QgfHwgdGFyZ2V0LmNvbXBsZXhBc3BlY3QuZ2V0RW50aXR5QXNwZWN0KCk7XHJcbiAgbGV0IGNvbnRleHQgPSA8YW55PnsgZW50aXR5OiBlbnRpdHlBc3BlY3QuZW50aXR5IH07XHJcbiAgaWYgKGNvSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgY29udGV4dC5pbmRleCA9IGNvSW5kZXg7XHJcbiAgfVxyXG5cclxuICBzdHlwZS5nZXRQcm9wZXJ0aWVzKCkuZm9yRWFjaChmdW5jdGlvbiAocDogYW55KSB7XHJcbiAgICBsZXQgdmFsdWUgPSB0YXJnZXQuZ2V0UHJvcGVydHkocC5uYW1lKTtcclxuICAgIGxldCB2YWxpZGF0b3JzID0gcC5nZXRBbGxWYWxpZGF0b3JzKCk7XHJcbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnRleHQucHJvcGVydHkgPSBwO1xyXG4gICAgICBjb250ZXh0LnByb3BlcnR5TmFtZSA9IGFzcGVjdC5nZXRQcm9wZXJ0eVBhdGgocC5uYW1lKTtcclxuICAgICAgb2sgPSBlbnRpdHlBc3BlY3QuX3ZhbGlkYXRlUHJvcGVydHkodmFsdWUsIGNvbnRleHQpICYmIG9rO1xyXG4gICAgfVxyXG4gICAgaWYgKHAuaXNDb21wbGV4UHJvcGVydHkpIHtcclxuICAgICAgaWYgKHAuaXNTY2FsYXIpIHtcclxuICAgICAgICBvayA9IHZhbGlkYXRlVGFyZ2V0KHZhbHVlKSAmJiBvaztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvayA9IHZhbHVlLnJlZHVjZShmdW5jdGlvbiAocHY6IGFueSwgY3Y6IGFueSwgaXg6IG51bWJlcikge1xyXG4gICAgICAgICAgcmV0dXJuIHZhbGlkYXRlVGFyZ2V0KGN2LCBpeCkgJiYgcHY7XHJcbiAgICAgICAgfSwgb2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG5cclxuICAvLyB0aGVuIHRhcmdldCBsZXZlbFxyXG4gIHN0eXBlLmdldEFsbFZhbGlkYXRvcnMoKS5mb3JFYWNoKGZ1bmN0aW9uICh2YWxpZGF0b3I6IFZhbGlkYXRvcikge1xyXG4gICAgb2sgPSB2YWxpZGF0ZShlbnRpdHlBc3BlY3QsIHZhbGlkYXRvciwgdGFyZ2V0KSAmJiBvaztcclxuICB9KTtcclxuICByZXR1cm4gb2s7XHJcbn1cclxuXHJcbi8qKlxyXG5BbiBDb21wbGV4QXNwZWN0IGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aCBldmVyeSBjb21wbGV4IG9iamVjdCBpbnN0YW5jZSBhbmQgaXMgYWNjZXNzZWQgdmlhIHRoZSBjb21wbGV4IG9iamVjdCdzICdjb21wbGV4QXNwZWN0JyBwcm9wZXJ0eS5cclxuXHJcblRoZSBDb21wbGV4QXNwZWN0IGl0c2VsZiBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIGRldGVybWluZSB0aGUgcGFyZW50IG9iamVjdCwgcGFyZW50IHByb3BlcnR5IGFuZCBvcmlnaW5hbCB2YWx1ZXMgZm9yIHRoZSBjb21wbGV4IG9iamVjdC5cclxuXHJcbkEgQ29tcGxleEFzcGVjdCB3aWxsIGFsbW9zdCBuZXZlciBuZWVkIHRvIGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5LiBZb3Ugd2lsbCB1c3VhbGx5IGdldCBhbiBDb21wbGV4QXNwZWN0IGJ5IGFjY2Vzc2luZ1xyXG5hbiBlbnRpdGllcyAnY29tcGxleEFzcGVjdCcgcHJvcGVydHkuICBUaGlzIHByb3BlcnR5IHdpbGwgYmUgYXV0b21hdGljYWxseSBhdHRhY2hlZCB3aGVuIGFuIGNvbXBsZXggb2JqZWN0IGlzIGNyZWF0ZWQgYXMgcGFydCBvZiBhblxyXG5lbnRpdHkgdmlhIGVpdGhlciBhIHF1ZXJ5LCBpbXBvcnQgb3IgRW50aXR5TWFuYWdlci5jcmVhdGVFbnRpdHkgY2FsbC5cclxuPiAgICAgIC8vIGFzc3VtZSBhZGRyZXNzIGlzIGEgY29tcGxleCBwcm9wZXJ0eSBvbiB0aGUgJ0N1c3RvbWVyJyB0eXBlXHJcbj4gICAgICB2YXIgYXNwZWN0ID0gYUN1c3RvbWVyLmFkZHJlc3MuY29tcGxleEFzcGVjdDtcclxuPiAgICAgIC8vIGFDdXN0b21lciA9PT0gYXNwZWN0LnBhcmVudDtcclxuKiovXHJcbmV4cG9ydCBjbGFzcyBDb21wbGV4QXNwZWN0IHtcclxuXHJcbiAgLyoqIFRoZSBjb21wbGV4IG9iamVjdCB0aGF0IHRoaXMgYXNwZWN0IGlzIGFzc29jaWF0ZWQgd2l0aC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGNvbXBsZXhPYmplY3Q6IENvbXBsZXhPYmplY3Q7XHJcbiAgLyoqIFRoZSAnb3JpZ2luYWwgdmFsdWVzJyBvZiB0aGlzIGNvbXBsZXggb2JqZWN0IHdoZXJlIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSAnY3VycmVudCB2YWx1ZXMnLlxyXG4gIFRoaXMgaXMgYSBtYXAgd2hlcmUgdGhlIGtleSBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgJ29yaWdpbmFsIHZhbHVlJyBvZiB0aGUgcHJvcGVydHkuXHJcbiAgX19SZWFkIE9ubHlfXyAqL1xyXG4gIG9yaWdpbmFsVmFsdWVzOiB7fTtcclxuICAvKiogVGhlIHBhcmVudCBvYmplY3QgdGhhdCB0byB3aGljaCB0aGlzIGFzcGVjdCBiZWxvbmdzOyB0aGlzIHdpbGwgZWl0aGVyIGJlIGFuIGVudGl0eSBvciBhbm90aGVyIGNvbXBsZXggb2JqZWN0LiBfX1JlYWQgT25seV9fICovXHJcbiAgcGFyZW50PzogU3RydWN0dXJhbE9iamVjdDtcclxuICAvKiogVGhlIFtbRGF0YVByb3BlcnR5XV0gb24gdGhlICdwYXJlbnQnIHRoYXQgY29udGFpbnMgdGhpcyBjb21wbGV4IG9iamVjdC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIHBhcmVudFByb3BlcnR5PzogRGF0YVByb3BlcnR5O1xyXG4gIGV4dHJhTWV0YWRhdGE/OiBhbnk7XHJcblxyXG4gIC8qKiBZb3Ugd2lsbCByYXJlbHksIGlmIGV2ZXIsIGNyZWF0ZSBhIENvbXBsZXhBc3BlY3QgZGlyZWN0bHkuICovXHJcbiAgY29uc3RydWN0b3IoY29tcGxleE9iamVjdDogQ29tcGxleE9iamVjdCwgcGFyZW50OiBTdHJ1Y3R1cmFsT2JqZWN0LCBwYXJlbnRQcm9wZXJ0eTogRGF0YVByb3BlcnR5KSB7XHJcbiAgICBpZiAoIWNvbXBsZXhPYmplY3QpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlICBDb21wbGV4QXNwZWN0IGN0b3IgcmVxdWlyZXMgYW4gZW50aXR5IGFzIGl0cyBvbmx5IGFyZ3VtZW50LlwiKTtcclxuICAgIH1cclxuICAgIGlmIChjb21wbGV4T2JqZWN0LmNvbXBsZXhBc3BlY3QpIHtcclxuICAgICAgcmV0dXJuIGNvbXBsZXhPYmplY3QuY29tcGxleEFzcGVjdDtcclxuICAgIH1cclxuICAgIC8vIGlmIGNhbGxlZCB3aXRob3V0IG5ld1xyXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbXBsZXhBc3BlY3QpKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ29tcGxleEFzcGVjdChjb21wbGV4T2JqZWN0LCBwYXJlbnQsIHBhcmVudFByb3BlcnR5KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlbnRpdHlUeXBlIHNob3VsZCBhbHJlYWR5IGJlIG9uIHRoZSBlbnRpdHkgZnJvbSAnd2F0Y2gnXHJcbiAgICB0aGlzLmNvbXBsZXhPYmplY3QgPSBjb21wbGV4T2JqZWN0O1xyXG4gICAgY29tcGxleE9iamVjdC5jb21wbGV4QXNwZWN0ID0gdGhpcztcclxuXHJcbiAgICAvLyBUT0RPOiBrZWVwIHB1YmxpYyBvciBub3Q/XHJcbiAgICB0aGlzLm9yaWdpbmFsVmFsdWVzID0ge307XHJcblxyXG4gICAgLy8gaWYgYSBzdGFuZGFsb25lIGNvbXBsZXhPYmplY3RcclxuICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgdGhpcy5wYXJlbnRQcm9wZXJ0eSA9IHBhcmVudFByb3BlcnR5O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjb21wbGV4VHlwZSA9IGNvbXBsZXhPYmplY3QuY29tcGxleFR5cGU7XHJcbiAgICBpZiAoIWNvbXBsZXhUeXBlKSB7XHJcbiAgICAgIGxldCB0eXBlTmFtZSA9IGNvbXBsZXhPYmplY3QucHJvdG90eXBlLl8kdHlwZU5hbWU7XHJcbiAgICAgIGlmICghdHlwZU5hbWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGVudGl0eSBpcyBub3QgcmVnaXN0ZXJlZCBhcyBhIHZhbGlkIENvbXBsZXhUeXBlXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGZvciB0aGlzIGNvbXBsZXhUeXBlIGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQ6IFwiICsgdHlwZU5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgY29tcGxleEN0b3IgPSBjb21wbGV4VHlwZS5nZXRDdG9yKCk7XHJcbiAgICBjb25maWcuaW50ZXJmYWNlUmVnaXN0cnkubW9kZWxMaWJyYXJ5LmdldERlZmF1bHRJbnN0YW5jZSgpLnN0YXJ0VHJhY2tpbmcoY29tcGxleE9iamVjdCwgY29tcGxleEN0b3IucHJvdG90eXBlKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgRW50aXR5QXNwZWN0IGZvciB0aGUgdG9wIGxldmVsIGVudGl0eSB0aGF0IGNvbnRhaW5zIHRoaXMgY29tcGxleCBvYmplY3QuXHJcbiAgKiovXHJcbiAgZ2V0RW50aXR5QXNwZWN0KCkge1xyXG4gICAgbGV0IHBhcmVudCA9IDxhbnk+dGhpcy5wYXJlbnQ7XHJcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG5ldyBFbnRpdHlBc3BlY3QoKTtcclxuICAgIGxldCBlbnRpdHlBc3BlY3QgPSBwYXJlbnQuZW50aXR5QXNwZWN0O1xyXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhZW50aXR5QXNwZWN0KSB7XHJcbiAgICAgIHBhcmVudCA9IHBhcmVudC5jb21wbGV4QXNwZWN0ICYmIHBhcmVudC5jb21wbGV4QXNwZWN0LnBhcmVudDtcclxuICAgICAgZW50aXR5QXNwZWN0ID0gcGFyZW50ICYmIHBhcmVudC5lbnRpdHlBc3BlY3Q7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50aXR5QXNwZWN0IHx8IG5ldyBFbnRpdHlBc3BlY3QoKTtcclxuICB9XHJcblxyXG4gIC8qKiAgQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICAvLyBUT0RPOiByZW5hbWUgLSBhbmQgdXNlICdfJzsgdXNlZCBvbiBib3RoIEVudGl0eUFzcGVjdCBhbmQgQ29tcGxleEFzcGVjdCBmb3IgcG9seW1vcnBoaWMgcmVhc29ucy5cclxuICBnZXRQcm9wZXJ0eVBhdGgocHJvcE5hbWU6IHN0cmluZykge1xyXG4gICAgbGV0IHBhcmVudCA9IDxhbnk+dGhpcy5wYXJlbnQ7XHJcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgYXNwZWN0ID0gcGFyZW50LmNvbXBsZXhBc3BlY3QgfHwgcGFyZW50LmVudGl0eUFzcGVjdDtcclxuICAgIHJldHVybiBhc3BlY3QuZ2V0UHJvcGVydHlQYXRoKHRoaXMucGFyZW50UHJvcGVydHkhLm5hbWUgKyBcIi5cIiArIHByb3BOYW1lKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBjbGVhck9yaWdpbmFsVmFsdWVzKHRhcmdldDogYW55KSB7XHJcbiAgbGV0IGFzcGVjdCA9IHRhcmdldC5lbnRpdHlBc3BlY3QgfHwgdGFyZ2V0LmNvbXBsZXhBc3BlY3Q7XHJcbiAgYXNwZWN0Lm9yaWdpbmFsVmFsdWVzID0ge307XHJcbiAgbGV0IHN0eXBlID0gdGFyZ2V0LmVudGl0eVR5cGUgfHwgdGFyZ2V0LmNvbXBsZXhUeXBlO1xyXG4gIHN0eXBlLmNvbXBsZXhQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGNwOiBhbnkpIHtcclxuICAgIGxldCBjb3MgPSB0YXJnZXQuZ2V0UHJvcGVydHkoY3AubmFtZSk7XHJcbiAgICBpZiAoY3AuaXNTY2FsYXIpIHtcclxuICAgICAgY2xlYXJPcmlnaW5hbFZhbHVlcyhjb3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29zLl9hY2NlcHRDaGFuZ2VzKCk7XHJcbiAgICAgIGNvcy5mb3JFYWNoKGNsZWFyT3JpZ2luYWxWYWx1ZXMpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5cclxuIl19
|
|
@@ -7465,7 +7465,7 @@ function setDpValueComplex(context, rawAccessorFn) {
|
|
|
7465
7465
|
let dataType = property.dataType;
|
|
7466
7466
|
if (property.isScalar) {
|
|
7467
7467
|
if (!newValue) {
|
|
7468
|
-
throw new Error(core.formatString("You cannot set the '%1' property to null because
|
|
7468
|
+
throw new Error(core.formatString("You cannot set the '%1' property to null because its datatype is the ComplexType: '%2'", property.name, property.dataType.name));
|
|
7469
7469
|
}
|
|
7470
7470
|
if (!oldValue) {
|
|
7471
7471
|
let ctor = dataType.getCtor();
|
|
@@ -13583,7 +13583,7 @@ const breeze = {
|
|
|
13583
13583
|
ValidationError: ValidationError,
|
|
13584
13584
|
ValidationOptions: ValidationOptions,
|
|
13585
13585
|
Validator: Validator,
|
|
13586
|
-
version: "2.1.
|
|
13586
|
+
version: "2.1.5"
|
|
13587
13587
|
};
|
|
13588
13588
|
/** @hidden @internal */
|
|
13589
13589
|
let win;
|